IMD 1.17: 11/11/2014 11:14:41 82VKXSVRDOS B* VERSADOS/RMS68K SRC/OBJ 4.4 (NOT BOOTABLE) SN=49367 12 OF 30  SR12q82VKXSVRDOS 0420¤k-aAY ž=|CF/ aAM ’&_ @ügìaA^ „j gJ g* (=gaJ€f ¶Rnÿ&NÕ`ÿ aêJ€f ¶RlðF3 NÕaÜJ€fþf¶RfàNÕ (=gaÆJ€fæ¶RmÊNÕa¶J€fضRo¼NÕaªJ€fʶRL3 g®NÕafkÖfgžNÕf˜NÕaBP ú ‚SEfB8 ú+ dg "S+ *gNukL3¨ª *+ d+ *gÇNu‡NuaBP ùÒ ‚DIFg ‚DFORgüp`B8 ù¼+ d« *S+ dkF3ˆ€ `À <!`ý¦,KGî `,KGî K`,KGî N$Ka" (fa¼k6gÄ`„6„F3 &NNu =f aÔk>J€fê6ƒ&NNuRˆ Xg Ag DgJŸ`òEî ` F3H Eî K`Eî NaºNu RfÔaÆ +g@ -g* &g !g`¶ajJ€f„0I3 €C`a\J€fv0ÀC` aPJ€fj0�C6€&NNua@J€fZ0ÐC`îaB( ø¾ )f$aP =f CI3 ja@8 0fNu 1fJNu6<ÿÿNuRˆaB( øˆJ�k B€ ƒjJ�Nu <3NuI3 &N`ülRˆBA  g  gî4NuJŸ <"`üH&N`ò <#Aë `BR ø2END R3)Ê CHAINg <$`B øB« :Lù* Öa>a('y* !'7k!>!'Lù* ò:9(`aV3… )E B< ÷äfæLù(aB< ÷ÔfÆLù(QaB< ÷Äf¶Kè A'M"=üLù(aB< ÷¬fžÑü($'H"=øU3( ˆA Lù(\aB< ÷’f„ k aBY ÷†=|CF/ aBM ÷z&_"HaB^ ÷rkdL¹(7aôfTaB" ÷ZG3 fH8<aøf< I(ÿÿ  b&$aøLù* Öap*<* ô'k :!'a@‡ A€gAë  <*`BR ö <-aV3€…PB B ö <ÿÿ&<€aB< õü <.Aë `BX õî k L<(!c HE8:< aB! õÚ‡faBe õÐ`ôK3 Nu/Aë!'.HG6.HD8HD.Nua6fLù* ÖaÖ*<* Ša¬‡faŽfÜNuN3 fø <'`BR õ|  g$<0000aB õl ‚0000f$+ :g" ‚0ALLfB‚'B!'B†<+!>P3(� /,k L-F!c,_Nu —* PgàJŸ <&`B õ(aªLù* ÖaÿP*<* ’aÿ$‡fØafàNuI3P k L!A c <,f <+f <* f <,Hë EAë EaBR ôÄQ3(H /,k L,. c,_B‚ÇBFJ†NuJ« >fB9 ô¤aBY ô / aBM ôš&_kgB†'F!'<+!' kK3 H  L!F!c`ÿV <(`B ôpv,+ Bg RC Cfô6<ÿNuLë Aë!'0ÄHÐ"<O3@ taB" ô <;`ÿ0$H/ aI3€ B ý¶&_kê OfägÞ4 k &( 'ƒ`& g fÂ4g k ( 'I3€ g‚@2<@aB ýhfg ,+ &Æ'F &NuEREWERPWPREWPRPWEWPWER 3 PR4ééé\C1DATSEG ASREL' DAT SA C%(…8112040900 DATA SEGMENTÿ2PUCBCHOPT PUCBSESS Ô@AUTOPAKT xPUCBCMDLG ìPUCBBNAM øPUCBCMDND ôpSCTSBRK PUCBREGX PUCBCHLVL pJOBQUEUE @PBA PSCTBDSL jPSTARTMON  PUCBCMDST ðpLOGM PTSCTPAR ¢PSCTINBE +pSCTSASR ñ2PCHPOSNUM PSTRTBCT ÂPNEXTQUE ÚPOFHS HPSTRUTSES šPSYSDFLT PCHSAVLVL PNEXTRUN ÞPPASSKEY PSTRUOPT žPSQRB pPATNPAR ŠPUCBCAT ¸PEETRCV pPUCBLEN ÀPUCBTID Ìñ2PATNMSG œPLDRLDO 8PLDRRER @PUCBBNO üPUCBSNO ¬PUCBUNO ´PLDRFHS HPUCBVOL °PSCTDAT PUSERNO ÐPCURRUN ÒPLDRCLL :PUCBTSK ¨PUCBT SO PLABEL01 äPSCTIDB –ü2PSCTIDL ÚPUCBUTN ÈPUTTCBP PLABEL02 ”pSCTBEG PUCBLUS ÄPUCBTUT ØPEETSTK –PLDRROK (&SCTF3€œ( &SCT€€ÿ€( &BCT132((€&EET*x4eF1EET ASREL' EET SA E(…8112291600 ENTRY/EXIT TASKÿ2pEETSBAT pAUTOPAKT pDEFAULT pENDQUEUE HGTSEGARG ìpINITPAR pTESEGPGM pJOBQUEUE pPBA HTSEGPGM ¸pSTTABLND pLOGM pLOGNTERM pTSCTPAR pSCTSASR pSTRTBCT  pOFHS pSTRUTSES pSYSDFLT pRETRNVNT pTESEGSTT HTMOVPAR ø2pNEXTRUN pTASQPAR pBRKPAR pATNPAR pTERM5 HEETBEG pUCBTID pPROC260 pATNMSG pUCBSNO pUCBVOL HEETSNO ŽpSCTDAT HDELAYS ÊpSTTABL pCURRUN pUCBTSO pSCTIDB pSCTIDL HEETASR (pLABEL02 ù2pEETSTK pLIMRUN pBHWCVT pNXTSNO HEETSXT 2pUSRSNO pUSRIPR pSTRUTN HTRAP1NTS dpUCBREGA5 pUCBREGA6 HTRAP1TYP `HGTSEGDAT ÐHENABLASQ ŠpREADEVNT pAUTOEVNT HTSCTASQP œpUCBLDCNT HDISABASQ ”pEET_GFLG 2HDELAYSEC Ä(ÐI3U EET 121084 4Gù(Oë +'O 4Oë 5IúA à/< OÜ :fø&Lù(Lùð)@J3’UD @H@@!6B€9(ãˆÀü#À)%'A 1'B!1'C -'D .'E!.7F :Aù(aÞAù(#aÔJ3D  Aù(%aÊAù(&NBgpNA`ðAù(/B˜±ù(köaÐ9)Ag"0|èaþAë@'HA? AùI3¨ ('PAAë@?p#NAaªLë0 0º„c8µÉg4<ja4'J $`ð fa&`æ4¼@Lë J3Q!@ $*aDg4¼€`ÎR„'D 0aB* þÐ`´Pеù(kEù(NuLØÿ$+ ,Aë!HàNAfNuJŸJ3 ` `òAë!Hà~NANu <ÿÿB�$+ ,&<€aB( þ|`ª |p!`Ø |`ôF3€ &SCTê(&SCTP&EET(&SCT .SF3 CT&SCT .ARG&SCTI3P € (3aB> ýÖ (g (g`òLè“ÉAù(/'C )±ü(g."g¶�gPH`ìH3$ ³üf"H`ð'A!+'h!'p#Aë 'NA`ª³ügôfš « 8f J« !F3PA fa`ôaÜ'@ '@ 9Aë !@aþšAúþîaþxAúþþaþp'H =Aúÿaþd'H SRV4: UNABLE TO LOAD TASKDUMP.SY F3À $ $ FROM **xx EMH ERROR # $ `3?þUSR SVC IOS FHS LDR *Œ*¦*œ*Ø**Ø*„*„*’*È*º*ª*xABCIKLTWXYZD˜–€J3B@† 'èd €*Ü*S@ F3 ERRORMSGSYADIÿAVAILABLEUNF3ABLE TO OBTAIN USERS LOGICAL UNIT NUMBERUNABLE TO ASSIGN ERRORMSF3G.SYNO ERROR MESSAGE AVAILABLEUNABLE TO READ SENTINEL CODE \K BIF3NARY VALUEAVAILABLEUNABLE TO WRITE TO USERS OUTPUT DEVICENESTEDF3 \K SENTINEL ARE ILLEGALMESSAGE BEING BUILT EXCEEDED BUFFER SPACF3EUNABLE TO RECEIVE LOGICAL UNIT NUMBER FOR DEVICE CODEUNABLE TF3O RETURN LOGICAL UNIT BACK TO USERUNABLE TO MOVE CALLERS PARAMETF3ER BLOCK OR PLUG POOLPLUG POOL SIZE EXCEEDS MAXIMUM SIZE OF 96P3ªINSUFFICIENT NUMBER OF PLUG POOL DELIMITERS*B *L**v*’*¬,b3ªª•j*Ø *â&**&)*P5*†**°3*ä)*+B¹*6B¹*:By*0#ü)@*,/. .!/P3¥R€-|€ n !#Æ)@#Ç)JHîÀ!$#Æ)Cù)aBû&C!-_ J€fŒAúý0¼@J3D@1|NCfÄ . #À*ÜAúüÔ!|*Ü NBf¢&(ajaˆAî HÐÀB¨ B¨L3@GúûšIúû`.:üüægŒLúüÜB¹*6B¹*:¹Ëd: \fb+J® f(ù*0H3 azgp Cg Kf×À–€ãˆ×À–€`4¹*0aRT‹a¦Cúûþr ¸1WÉÿúå�F3@Kî Cúûº"qNÑÛSƒnŒ`ÿlAúú!züF SŒ!LHç0$h  g4µÌcöSŠ!JF3NBf*µÌd&TŠ  fRŠ gJ"¼µÌd !J `ÆUŠ`ÎLß J€ftAúûÂ0¼M3€*ÀBh,:ùò.:ùø-|(!|NC|NC .  n `BùŠ#ü)d*,` 5PaŽYƒF3`ÿJ05Pax`ð5Paf`æKî ü$ 5Pa6T…`ü$ 5Pa&`ÄB@ü$H35Pa`´¹*0g¼0|4B…KúûN(af õ@aäR„w€S…nòaÈ]ƒ`F3 þÊAúûKî f2ÐAî !n  . !�® R€ €`bN!@!MpNAfF3 DAî  hÑÍ ` »Èd$JjöS…fòÝk »Èdaj`ðSŒ`ÿ 0. @ ÐEH@G305P( Gî!ÿAúúL/(!KGî a(!_J€f"(Ûa&S�fö (a&D`H3þ¼&D`þäU‹pB… 9c é�ŠQÈÿê]ƒoHù*6Ö‹Rƒþ&C`GúøÌF3 a¾f¤&( \f Sƒg Kg|Sƒfê&h &(ü ü …g …G3 fý . €€füþAî $0¼1|n!|NCf4Aî %0¼€N3P |NC#è*>ù*0Aî $1|NCfâ`ü¬#ü....*>ù*0`ü–Aúù!KF3 &€NBNuà˜4<`4<é˜0 :m^€ÀSBfèNuAúøÎH€`Aúø¾HÀ`AúF3øªJ€jü-D€r `Â4��eRBÁ`ôИJ�jBJ�f J�kBÂNuJ�kÒBN3ª`ÐtB… 9n 0lR‹J…fgËü €Ú€SBfÚNuR9*`R9*`R9*`R9*`R9Z3ªª *`R9*`R9*`R9*`R9*`R9*`R9*`R9*`R9*`#À*,Iú÷ˆaÿ :øFH@Iú÷~aþúaÂJ3€@aœB€:÷b/Iú÷\aÿCúöXAú÷DraB#õêAúõæ|0¼!|)@ Àü €H3TnIúùü<4(tü ü ÜSFfúü ü S‰!I?(hNB1_B9*`K3$`ûÄ#üÿÿÿÿ)aBõvfÿB`úb. €xâ cB€CúöÆ#ñ)^Nu . Iúõ”F3aþ* . H@IúõŠaþNu/ $ fBS€fô(_Nu , ÿÿm ,~ÿÿc J,ÿÿg|.J3�ÿÿNuCú÷.Jk¸føNu¹*0f::÷f2ù*0*KAî !n Gî !K!|30p&MNAg*_`þBNuNu4ééé <1DTA ASREL' FDTA SA H9(…FMS DATA SECTIONñ2@SEGBLKO Ò@SEGBLKS º@C7ADDR @CEADDR @DVEND 0@DTABLK "@FCBEND @ACKBLK V@IOCOMS Ê@DEVTBL 4@FCBSTR @FMSSEG .@TDBLK V@IOCEVT ¬@WUBLK ²@FHSFLG ñ2@FMSBLK Æ@QUESPL ê@SEGBLK  @FATEND (@DVSTR ,@FMSAP ú@FMSTP @FMSASQ œ@PATCH  @QIOBLK š@EXTSTR û@FATSTR $@FHSQUE @MOVBLK :@FMSBLK1 h@SEGBLK2 j�2@VDTEND @SEGBLK3 ‚@SEGBLK4 ü@SEGBLK5 @SAVESP @FMSASQ1 >@FMSFCBA ü@VDTSTR @SYSPACE  RF3>FDTA083082 4 *4*4FAF3ˆ@  F3H3 *¬H3@IOSG*¤#3;^)>24éééˆ;1FHS ASREL' FFHS SA P!(…FMS FHS HANDLERû2pGETFCBS pGETTSKID pMOVENAME pRELLUNR pFMRW15 pDEFDAT pDEFFAB @FMSF35 rpDVEND pCHKWAP pACKREQ pCHKRC pCHKWC pDTABLK pMOVE2U pFCBEND pNOFCBS pDSNME @FTL.EQ žpACKBLK pIOCOMS pSRCFCB ø2@FTL.HI ¦pDIRDEL pDEVTBL pFCBSTR pGETFAT pCHKAP pCHKSPL pCHKWPD @FMSREV òpFMSSEG pGETDCQ pGETFCB pRELFAT pCHKPRM @FTL.NE ¢@ICMDJP fpMVEFNM pCHKASC pCHKASN pRELFCB pRLNFAT ÷2pTDBLK pGENNME pIOCEVT pDIRNME pATTIOB pDIRINS pWUBLK pFHSFLG pFMSBLK pNODVS pSUASQ pDSNXT @FTL.T œpQUESPL pSEGBLK pSMOVE4 pSMOVEA pFATEND pFMSIOS pNOFATS pDVSTR pFMSAP ÿ2pGETIOB pUSNCHK pDEVFRE pFMSASN pFMSASQ @FMSASR ªpQIOBLK pSETBEG pSRCDV pDEVBSY @FMSRTN  @FMSSTR pRELIOB pFATSTR pFHSQUE pRELAPF pGETATT pMOVBLK pGETLUT pPUTALL pVALFNM pVALVOL Á2pRELLUN pRLNFT3 pVALUSN pFMSBLK1 pNOVDTS pVDTEND pSEGBLK3 pSEGBLK4 pIREWIND pSEGBLK5 pSETPTR pSAVESP pFMSASQ1 pFMSFCBA pVDTSTR pPUTALL2 pSYSPACE ºG3(€P``‚FFHS110581 3#È(#Iù(e)G <) Àü €dÓÀ.I#É(l0< bÀüvÓÀS‰F3J A(#É(cR‰#É('0< ÀüVÓÀS‰#É(R‰#É(U0< HÀü�ÓÀS‰#É(FR‰#É(I0< ?ÀüÓÀF3„(IS‰#É(t"y(l h$±üg (g"ˆBSRCév³ù(cb P`Ø,y(lJ–gdF3-L0<ÀüÙÀSŒ-L-L RŒ-L(0<ÀüÙÀ-L,S®,-L40<ÀüÙÀ-LI3!8S®8-L@Ùü-LDS®DMîv½ù(cc˜Aù(e0<NAAù(g"|.FHSpaBþ¤f.#ÈG3 (<#É)< |0<!NAa( y(#è,p&NAa`øH瀀0|0<NA`ðgîNufêNubæI3NuBgHç*f@Cù(j ©f0 )g. )f ™Ì�Î ) gˆ ) gBGþI3 ) g.LßTNw iMèÿ ²#Ï(i.nrLß>þ¹ügaB:ýè(Nu") ,y(l²–gS3TMîv½ù(ccð`¶aBSýÂaBNý¾aBMýº$y('½Òfê EêVµù(cê`Œù)=gPaB-ýŒF3$h µüf $h!J `JJªgF&R·üg$K`ì&JÕü8µèe B(*HzÿþF3T#ß(nAù(jKù(ap `•ü&ŠB’Bª)g%i ‘š¢ª%i` %i %iF3„ %i$i)iAB*%|(V h ¨(Vf µÈgJ¨kJ�g PF3`äê#Ê(V`b*¶(n&&H"(�J�g A`ä" (gÁ!A`2J¨F3�j¨"Á%A#Ê(V`" J«jÁ'A%H y(#B(*`þ4üÿÿ(JF3T B¹(kEù(jGù(O0</6ÚS@fúCù(OKù(>)f ¢-g )4)eøJfXK3"€ -&f0@ÀgUÀ-g­aBMûÊ™Ì�ÎCù(OAù*<-2<fJXH3 SAjö`$B€0€( @NÐAù*L0JPaý(°XgàJX`òB�Aù(OKù(>$(&(x"h$-I3(aBMû^Aù(Y!B !CB�Gú ²gJfø`4ÒÓïãåìíGîV!K gGé$`GéH3€!K!|AÐ0<NAºg&Á)a!|)a!IX¨!|AÐ0<NA J3f<,g4Aù(P ‚!CBh,g !l,1|€#É)8AÐ0<#NA`aBúœaM3€‘Bú˜ f Jªfª B(+`üpaB@úzB(+`üD¹)=J¹(VgÜEù(V`ÜpAù(OO3@aBWúNB� Uf-faBú8`$Jf -gaB^ú&`-g "h ©F3`þœp`²p`®p`ªp `¦p`¢p`žp`šp`–p`’p`Žp `Öp`Òp `Îpë`Êp`ÆH3 p`ÂpÎ`¾p`ºp&p @0  �v€ ô@ à ¢Ž€Ül@@fL3DaB0ùŽfÿ4aBSù†4-B -@f)gŠ BfÿX` Bg° BbÿFF32-"fÿ>B…-% Bg Bg B` e dbfJAg²Ed`ÿ"F3€-'f 0< @'` eÿ-&f 0< @&` bþöBƒ6-"fTƒB„-I3�'Èü¸ƒeþ¾ã……B„-&Èü¸…eþ¾`J­$gþ aB.ø fX#Ê(k5m 0-L3÷@25m"4m&8m'9m%7%m$ -@g -&faB7øTaB1øPU3�Q<aB)øHg`ýìÁ(JB€aB;ø6g* f -@g -&f aB7øaB1ø`Ø"aBmøU3*@  `ÄaBmøf¾-gB¹(kaBW÷ò#Ê(k`aBW÷æ­`ü - gaB`÷ÐfTaB]÷ÊU3 @%fNaBS÷ÄAí 0< X fS@fö`aB\÷¬f0aB$÷¦e * g&`ýÀaB.÷”f#Ê(kaB1÷ˆU3 ’  - g aB!÷|g`ý aB3÷r2-AaB÷ffêaB)÷`fäÁ(J2)aB3÷PJjJBg JAU3 g²nfüäaB(÷8f¼`ØaB÷.f²HBaB÷&fªHB gàaB(÷fü¾aB5÷-g¬L3 BÀaBKöügaB/öö`üœAù(C ©!i-g+lt(!lt`!m(!lI3€l 1|1| ,|�¬tR€!@AÐ0<NAg" faBTö’`Š g aN3"@ø$aB/ö~`ü–+y)C 0 9)CS€Ð­(+@,)m(paBQöX9mŒlÿøŒB�9(JƒlŒJEF3jlÿÇŒ-g )j(8)j,4)i)i)i )iJk*.Mf"O3@@Aù(60<JNA5h<ê JBg5h:aBXõØ,�g!|2aBõÄgaB/õ¾`I3û¾üÿÿ(JB¹(kaBZõ¨"i #J3|_Jj©2,ŒA�©B()­[3 D„J`ù¦aB0õnfhaBSõhaB$õddû`aB.õ\fV#Ê(k5m 0aB1õJ<aB)õBf<Á(JaB(õ6f0a3I( aB5õ0B€aB%õ*faB[õ$faB/õaBWõ­`ùD"aB[õ aB/õ`úªaBhôüaBSôøB…*R3€ˆ gzë`$aB:ôæaB[ôâ* *&fpÿaB%ôÒg*aB[ôÊg*)fB,�g:F3@Aù(d ¬!lAÐ0<NAf Aù(d!ll AÐ0<NAf4AÐ0< NAf*2,ŒA ,R3 �¬€€ü@aB/ôXÁaB)ôPaõîaB*ôHfRJªRfL:¼BmaBô4/ AùJ3‚¡(g"|.SPLpaBô #È(B#É)B"_JfAù(B0<#NAg ga”`ÀJªRf * X3( faBNóâaB4óÞfªaB^óÒ­ fùp`÷öaBhó¾aBSóº i fù®aB+óªfI3ùP* fùÄ - € g°®fù� * gù& -&gù€ -@gôaB\óhX3 ”Hf¼aB`óbf¶0- °j g 2)aBLóNf¢"JaB.óFfš#Ê(kaB1ó:&J$IaB9ó2f†aBWó,­R3H`÷VaBhóaBSó * fù* fô* fù& mÿþ gaB`òòf^aB1òì%l€FI35l„J%l†L5lŠP2)aBAòÌ)jF€9jJ„)jL†9jPŠJg"Aê 2< 0üL3 SAføBj Bj0Jg÷`ø8aBDòŠ!m$!J¨ !|<aBòlgºp`¶L3g")aBRòXeB�B¨(y(U$)&)´¬f¶¬f $T,R`ý4aBMò*Iì�¹ùV3€D(FcÔxB�$)&)`÷paBhò aBSòaBòaB*ñþf@/ Aù(g"|.SPLpaBñè#È(B#É)BI3€"_JfAù(B0<#NAgJ ga\`À"i ;i ÁaB)ñ¨aóFJBf­!O3AHBJBf­!aBXñŠaBñ†gö`÷‚aBMñzx`öÚ/ -f"_+i+i `"@I3 - Aù(gaBñLf+H+I "_,-.- f J†f,) `$ y(# h±ügV¼¨F3f¾¨g P`è,B‡-ÎüÞ†‡-f$G ) `$i $j(y(U°¬I3@ gIì�¹ù(Fcîaò\,�föÒ-gD *&göL&LaB(ðžf. L0<H0ÛS@O3@fúB¬lBlŽaB_ð„2,ŒA,RaB)ðv�ÎgaB/ðn`ö-f -"- fJ€f`I3,).) )"))@)A)F)G "G©`ô¦Cí0<aB2ðeöS@fôF3 ­ göB…0- @f"pVDTEND pVDTSTR @PUTALL2 h "*F3FIOM040584 4&I$ „ü´nepÏNu/ "n ÒÂa�"_fîBBHB êˆåˆ$nÕÀpF3Ä€”D,B€NuJ�fpÏNuHç>4* .$ff*n Úî“Éa Bƒ»î$cJ"Kaªe8ºƒc F3axf&aœe `ð"aÿ|f,ÆîMS…gaX`ð$†B€` ÏgJf aDg´ ÏfpÍF3Lß,|Nu*@�® Àü"@aÿ8Bƒ"KaFeºƒcªafa:e`òJfÿxagà`ÿpR‹JfF3$†Jšµî c / "Kaþü"_Nut,B€NuS`ø f J†g †ÿÿÿÿf6×ÂB‚`4Ö‚×ÂB‚F3Rƒ<þNu f JFgè FÿÿgÜ` f JgÖ ÿgÊgÒ<NuHç"0$V³ê†eF3pÏ`&I×Á·ê†bòJ�gîaþxgLß DNu†îMS�gaÿNfè`ì$†B€`à/³î$gI3@a4f B®$-|`Na f-I$B€ _Nu-@V-nZ-n^aBþNu/B€.MF3g .$fa `-|`NaÈf®MJ€ _NuHç@àpra`B®JfN ©EXORøF3€fJ ©MACSüf@ g< € g4 y('°¨g($V°ªg Aèv±ù(&cæAîp 0ÙS@fúI3€B€LßNup`ö/îM n@"nDHA2<`-ANHîV"HaBýL _NuHç@ÀpraÌF3fBCî n@p 0ÙS@fú n@"nDBh>pÿ³H@³H@±Écð n@@>H@@?pF3r aˆLßNuHç<ÔHçCB�B†B‡ .f0B�S�2Oï pLß+%KF5BJa Ž`þ /³î0ga4f -|I3`NB®0a f-I0B€ _Nu-@V-n(Z-n,^aBù�Nu/B€.Mg .0fF3aŽ`-|`NaÈf®MJ€ _Nu/³îF3 f¸ jÿþ g&Cê p *gS@föBªFBjJBªLBjPp`Š4*P *L`ÿ"KóF3 JgªAêpa|f pAêKó anf’&HC Cm3 g Cgÿ|¸Efâ5BJ%IF3FGó pAê0ÛS@fú²Dg JAg|ÿÿ0"n40*PCñpGê 6ÙS@fúB€Lß+NuâHB[S@fú`ØF3Hç@@",HfpÄ`"Aa LßNuHç|Ð$,Hfaê`F l@Cè )IP((p&a8F3f.aŽf(Jƒf %D$ê J„f %C ê ašB¬H¬�Lß >JNuHç`T$ F3g>raöf6Ké gJ‚j&lPÀâHg:ÛS@fúU‚g`S‚g#D raõÌF3Lß*NugêBSBfú`âHç@@ graõ¬f"ƒ raõ ` %C ê JLßNuH3HçTA? ma`h&(B€Aù* PãI00€($"@¬Ž&l@*lD",H lLX3€B€B…NÑB$ ˜B$ ŠB$úB$PB$PB$P)HL¬ŽgabfB€Lß*þNuJfaš`pÂB¬LJ€`æF3$*,,<`X~h`$*(,<\T.<ÿÿd fpÿ¶€gÊR‚gÆS‚¶‚bÀJ�gZºˆg< ,F3\(J‡k ,`:(Ú€°ƒb¶…d,�fÿr`ÂB€afÿtB¬LB…Jƒg¶‚F3g`ab`aœgš`.¶‚gòaNf$+ AóP ",H¶´`e ¶´pcaž`aÞF3gä`ÿ( 4`aý B�B„HFHG(KðP¶€gDda°`ÿ(2(JGgЄ`Ð�°ƒF3b$Ù¬\Ó¬` M*lDW�±Íea~`ÌJ�f¶at`ô)HL gþ¤B… &lt(I3ÊüS…Ú‹)Ex" Hî#V-|`NaBñg� �¬@"y(%³Ìg$)�g"²”fF3")H²¬Hf ")L’©@²€gCé�³ù(!cÌ`L/".Za–,�g A"it Ù±ÅcúL3 `$aB ð®!it!A ��R€!@AÐ0<NAaBðŽaz _`$,�f-lj-lI3nîP/aBðf _fV0*4gÀè×ÀS‹)Kxaˆgý¨`:,�g|g"ER‰F3BQB�B€·ìxbÒ0ggR€RA×À`èW‹²hgºpÈ`þ¶J„fa`òJ*7fa F3`òJ�fJª gaVg‚`ý\ºˆgj"B€*7 ltJj4fTˆa2eJf4aLf.AëF3 CóP ³ìLgAéCñP³ìDeêa²`œa úg` A^ˆaîca0f `üÔF3J¬\göB€ahfüÔB¬LAë aÆc† lPaºb†BE+ GóP aúš`,+F3Û¬\:+Û¬`BE^‹fa2`ˆ×ÅAíÿý·ÈdJ“gAë)KLanbÆ`& *$°¬HF3ga`ЗÅQ‹+›¬\:+›¬`BE K`ý„J¬Tg‚aì` J“gÿxašgÿJ`I3@ü"p‚`ü/ aÔf~Hî(VB¬HaBî–g:"y(%¹Ég °”f²©HgCé�³ù(!cä`F3a: K"i@ Ù±ÍcúaL`af.)AHB€+ Aó ±ìDea\`pÄJ�gìF3ެŽB€"_NuHçTB€",Hg6"g2aÿdfF ,dR€)@T)@\",hR�)AX)A`F3a jS€S�Hìd`L`ûRHçTB€",Hgð"+gêaÿfû2 ,T&S€",X(S�HìF3dB€B�a "–€˜�HìTHì\`úìHçT * g¦",H²€g"pÿ)@d)@h`F3ÿ^B@+ Aó J¬\gÊB€aXf&aø²`¼HçTB€",Hg"l@J‘gX"*$gÿVaþ†F3fúœB€a&fôB�BC+ Aó0 a ’Lê(HìdRƒ*–€R„,˜�B€%š€0%œ€J¥F3 MHìxT`ú@",Lg²a �gú6`¨HçpÐB€¬�g|Lì @ fpÄ`nHîVB‚F3&HB�+ Có J‘f B¬HB¬L`.CéCñ³ìDU‰dJ‘fê“Ë*8Äü €ÂF3H@J@gRBa &f¬�g Jg&pÿaøÈLß Nu *FfaPNuHçÀ"@aF3òdf$0*J"n(ÓÀAêp2ØS@fúîMª B€LßNu¬�fB€NuS€a¶F3faNuHçXÐLìt R€�ˆ@ÿg2<’@R‰âIBYSAfúS‰&lL HîV*2F3 g\B„*72*4 Bƒ6f6fa ¤`:g RCfa ”`*Gð8& JAfTƒF3¶¬xbaØbfaòg<ÿÌ` K`´Lß Nua fô¬�B€`êHçÔLìtF3R‰&lL fa 8`f*2B†B…B„Bƒ*7:*4f$6g*HgRƒÑÃR„±ÉbI3fè`±ÉgJXf`ö( ˜ˆˆÅv*I›ÅHDJDfŽHDaBêÈB@*9²@ca Ð`p,�grF3Jg. fHç„ MKëB„& aLß!eg Jfaf6B€0+‘¬h‘ª,I37DÙ¬hÙª,aB"ê`gJCgê a „lÿŸŽB€Lß+þNupË`ö,�gæ²+fPF3¸kfJ& 8gÔAëaŠgÊd8"l@B€Aé Cñ ·Ég) ICñ³ìDeìa F3`¦aXbšazg”`NqpÈ`”/B�* gaýŠ"B€aýÄg"aüêg"að–g"F3að g"aëšf LßNu/B�`ÜB@/ *CJg°eg»fS@føB*_NupF3¸`öHç|Ô"lL fa r`B…*7gÀGéB€fa X`ºga X`4 l@B‚F3v Öˆ( Að ±ìDea :`³Èg&^ƒ(Að fâa "`p C& (aÿdbehaF3‚gJ¬\f\AóP$,DW‚±ÂdRJ�gN^ˆB‚aÿ:e b>aXgJg6BaNfHç°fF3SEföLß( gÝSEfúa ÐJ‚gì�B€Lß+>NupÌ`ö l@t g¾raëfäAé F3`ž*2 NuHç>€J*7fa h`^ r‚aõNfT,,`B„*7"ltB…:*4"F3J‚fa >`4³ìxd>JEf2fa *` gR� K0& aþrgepÉ"JEfJaLßF3|NuÓÁR†`ÀpÊ`èz`âHç?B§B§B§,gR€(fa Ø`B" ‚ga È`2L3&lx.,|B�³Ëcr&a^fv)MxaB"ç’»ì|gaBçˆB­a¬B€$& IB„"_* gF3a�("_* gaxg("_* gajg(""H f Lß(üNu @ÑË*H±ÇbR‹RˆF3³Ëg1#`øB€Nu lt �ˆR€�„$”ˆ& –‰Rƒ*,Lfa `„°‚d¶€b¬ aîfìF3¶‚d~" Jƒg*KJgB€�Ò€‡a”gaâ`Æ lta fÿB"HÑÄKð8ÿ&AâKgF3±Ëgb0ÛSCfú`" ãK×ÃÑÃ1#²‹fú&EB@+Gó·ìDea”` r azgþÚ`F3þòaTfø FKðHÿ&Er a`fèaýêfrB€`Ø a fÔa,fÐ)Ix&EB� a:fÂaf¾F3œ‰Ø†KðHÿ"H`’)IxS¬xp`)FtB€ì�a4aú)HtJNuHçÿÄ. B€B‚"lF3L³Àfaü`J‘faò`Ø"l@&()) Cñ *,DKéCñ,S†³ËbF3$ ³ÆdJ‘fä*7Kñ»ÆbÖgB•P€B†·Éf Cë)IP` !·ÉfúѬP·ìLgB€F3"lL)Ѭ\0)Ѭ`B„*7)KL"WJ™"f J™"faV`Nu&lD&,@"lL¬�$B�)“¬d“ª(W‹B€)Kñ»ËdJ•g F3X‹2Ý»Ëfú`ì�B‘B¬L"Bal/ CB€( Að aÀ fJ�faîV`ˆaüF3føa^B€`ðJ*7g.B…:*4fB€0fa$`Ö*HgR€ÑÀ±Áfæ`*A›ÅaøˆgL3Pÿ`>JkS�²€g4 fJkÚ Ff<I3€`Î €ÿÿÿÿg �ÿÿÿÿg²€e `þ)A4¬Ž r�aB%ùLg ÂfÌ lF3fÂ`T)l\8"lt",4B€0*4g ’¬`ÂÀÓÁ`($,`²‚gB€0gR€ÓÀF3³ìxb¢R‚`â0g˜B lg€ lg lgÒ lfÐJj4F3fdT‰ *@gZ,fR,fJBƒ*7–€Dƒ n@îMk±îDb"ÁS€fðF3`°ƒbîAgð±îDb ü SAfò`àtÁ"n@‘É  g,fB�*7ÓÁ��dL3 B€¸€d tÁaB0ø0!@(g !I!l AÐ0<NAg gœaB.ø ì�`L3�ü„ �¬t`î f2,ŒA fv¸€fh`H" n@aB÷Ìg gRaB.÷¾O3@@@aB÷ºfhgR�,gR†¼�gb(aB/÷šfÎ �†R‰`àaB/÷Šf¾ì�¬L3�B`ÿp �� IJj4fT�ÑÁ`8 g( n@aB÷TfˆJfr g aB÷BdðL3 `aB÷8bæ f ,|�¬xgBJj4fU€°„e6"lxR‰R¬4 fÐaB/÷fÿ6R3Q³ì|dBi)IxpaB3öêaB2öæ`ÿ\aBöÞfd)l\8"ltS‰)Ix`´(pÿaB3öÀìO3€„Ž Jj4fT€aBö¬f^`ÿ l|RˆaBöœfþÐ&HaBö’ lg$)l\8)A4¬F3Ž Êf(B€0*4gýz`ý| Âgÿ~ Êf g Ég`Ò)A4)l\8R3$¬Ž I Jj4fT€aB ö(fÚaB/ö"fþV lfpaB3öBJ�gþ‚Sf aB4öf²L3 `þtB€Sgpì�¬�aB!õâf”`ýÖaBõØf† f–R¬4B€0*4f 0R3H@gR€ÓÀ`ÿ|aB*õ®aB9õªf0aB6õ¤`NqB�aB+õš$,&,x"l0,,gz�F3@`B8õzp‡B�`Ôp„`öp†`òp‚`îpÃ`êpÂ`æp…`âpÊ`ÞaBõR`ØpÌ`Ôpë`ÐpÎ`Ì4é91UTY ASREL' FUTY SA!"(…FMS UTILITIES÷2@GETFCBS l@DOIO t@ATTIOBO ^pSEGBLKO pSEGBLKS @MOVENAME P@DOIO2 z@RELLUNR pDVEND pDBCHG @CHKMA  @CHKWAP îpFABCHG @ACKREQ ‚@CHKRC @CHKWC ôpDTABLK @CALREC Œþ2@CALSEC b@MOVE2U 4pFCBEND pFTL.EQ @MVEKEY €@MVEREC ÊpACKBLK @CMPKEY ®@DMOVE rpIOCOMS @SRCFCB pFTL.HI pFCBSTR @GETFAT Ô@CHKAP @CHKSPL Š@CHKWPD ÄpFMSREV pFMSSEG ÷2@GETDCQ V@GETFCB š@RELFAT þ@CHKPRM ØpFTL.NE pGPTSEC @MVEFNM $@CHKASC Ø@CHKASN j@RELFCB ÄpTDBLK @GENNME pIOCEVT @CMPSPC ”@ATTIOB @CLRIOP pGETVID pWUBLK ú2pFHSFLG pFMSBLK @SUASQ ˆpFTL.T @MVEDTA pSEGBLK @SMOVE4 D@SMOVEA ZpFATEND @UPDEOF @UPDEOR BpDVSTR pFMSAP @GETIOB ²@USNCHK ô@DEVFRE Ì@ FMSASN hpFMSASQ pFMSASR þ2pQIOBLK @SETBEG R@SRCDV @DEVBSY žpEXTSTR @RELIOB ÖpFATSTR pFHSQUE @RELAPF X@GETATT 6pMOVBLK @GETLUT @@VALFNM J@VALVOL @@RELLUN Ê@VALUSN ÖpFMSBLK1 pSEGBLK2 pVDTEND f2pSEGBLK3 @SETPTR ’pSAVESP pFMSASQ1 pFMSFCBA pVDTSTR @ZERPTR pSYSPACE ¸F3@€FUTY031584 4/ “É y(*J�f"H`²¨f <þ"_NuPˆ±ù(cÞ I<`êHç@€F3 -g† € f\ - g> -&f "e8S@fò`  f,S@fö0<a8`  gaeS@fòB"_NuF3  fS@fö`îp`ì  g 0e 9c Ae ZbJ<þNu<NuHç@H3@"|*h?? ÿÿf J_p LßøNu²gJJ™`æJ$/gJ_`ôýÊ<>B * F3gz6jJgDC8jJgDD2�f¢JFg jÿÿTg¢JFjJjTf˜`ÜjTF3JGg jÿÿRg†JGj JjRfÿ|`ÞjRJCg nÿÿJgÿhJCj JnJfÿ\`ÖnJJDF3g nÿÿHgÿHJDj JnHfÿ<`ØnHJFg5FTJGg5GRJCg=CJJDg=DHBF3`ÿJFgjBjT` JjTgSjTJGgjBjR` JjRgSjRJCgjBnJ` JnJF3gSnJJDgjBnH` JnHgSnH` ÿÿÿÿF3Aÿÿÿÿÿÿÿÿÿ$y(J’gEêVµù(cðHzÿþ#ß(;p Nu$ŽBNu?0<+BZS@fúF3B0Nu(y(0J”gIì�¹ù()cðHzÿþ#ß(;p Nu(ŠBNuHç€aÒ0<HB\S@fúLßNuF3 Hç€$y(½Òf"Gí Iê ¹Kf0< ¹KfS@fø<þLßNuEêVµù(cÎ<`èHçF3 (à 9(+kÁaýšüÿÿ(+$y(9µüg aÿ@B¹(9LßNuH瀀Aù(8$h $jK3 Š(y(0°¬ f,RLßNuIì�¹ù()cæaB'û8Hç€À y),"y), /ab _S( ©F3©© y(B()LßNuHç€À F"G`È l ¨(gAù($0<NAI3@aBúÎNuHçÀ@B� * g2*2@ f;|""*$R�+A$`"+j6$;jG34"`"V+i†$;i„"i$aÎCí!I"y),$Cé!I!|&LßNuF3 @Hçp€gfXAù(4J¨ gBhAÐ0<NAB¨ Aù(R¹(BA*8f I3BB*9RBÒBÂü!AAÐ0<NAg g aB'ùâp LßNuf&)HtBB*9F3%ÄüS‚ÑÂ)H|)HxÑüì�)H@BB*8ÄüS‚ÑÂ)HD)y(lAù(4!y(F3 1|1| g1| AÐ0<NAg€ g a, g`ÿja `ÿ HzÿþF3A#ß(;`ÿZHzÿþ#ß(;`ÿLH瀀Aù(4 ,lga1|B¬lAÐ0<NAB¨ LßNuF3H瀀Aù(4 ,lgD°¨ g>BhJ¨ gAÐ0<NA!ll 1| ,�g1| I3�1| AÐ0<NAaBøªLßNuH瀀Aù(`Â:<ÿÿ * g*2 gEÿF3JENuHç€0,@` @ f(,Žf,�f,�f <LßNu<þ`ô @F3f ,ŽfìÒ‚`è @@fJ�gÔ �ÿÿÿÿgÌS�`Ò", lfÆ �ÿÿÿÿf¾,I3€f¶"*,`°Hç`aL&lLB‚+’‚gÓª(Ó¬dÓ+ê aB÷ÈLßJ@NuѪ,ѬJ3h/ &lLÑk&_ê aB÷¢Nu",x’¬tR�‚üHA0BAHAJ@gR�NuB€#È)2aF3èB‚*7g!B!l AÐ0<NA hJ€Nu/ JgJj4fT‰³fSBføB€"_NuF3/a¤!D!l !I *@f 2¬U¨T¨AÐ0<NAfÓÄS‰ _NuHç €JjI3@4f2Ä*I¾„fa²faBöä fR‰BB€Lß�NuÉG.Mg"n@aˆfè n@"MF3 paF`Èpÿ)@8)@4D€)@3Î |(B€°«Êo°«Îl B«ÎPÑ "@Ñü(±ü(fÖB«ÊQÍNu4ééé,1ROMIOI90 ASREL' ROMIOI90SA!(…62pIOCOME pIOCOMS pROMIOI02 AROMIOI90 !¦H3  IOSGHpAúÿäNAf‚*H aA ä`A àa*B+ !Çf/+  <aA Æ'_ G3@D€ /Gp% |NAp"Aë NANug.7h g/,k .! gÇ,_2(‚kF3¡ 7A jÇ"+ �²¨f$+ ´¨fB« B«  (gŒ (g <I3 €  AèJ(f <aB ÿ,`ÿh ¨&SCT fÿ\J+ !gÿTS+ !`ÿLaÿVÇ'h.3@ `ÿ:aÿDÇ/h /hfÿ"Ç`ÿ4ééééé(F1SECURE  ASREL' SECURE SA!E(…8107190816 SECURITY OPTIONø2pGETLAPSE pLEFTMARG pLOGTRYNO HREADPASS $pSTDERROR pSTDTRAP1 pOFHS pX10100 pSYSDFLT pPASSKEY HPASS "pSYSDPAR pECHOE pUCBLEN pUCBTID pECHOT  pLOGPRU pUCBSNO HSWORD žpSCTDAT HSECURE lã2pUSERNO pUCBTSO HACCTEND œHPWVAL ÌpSCTINB pADDLAPSE pASGNFILE pSCTDSL HACCTINN žpMSGCALL pERRCALL pEMSGCAL1 pEMSGCALL pUCBLDCNA pUCBLDCNT pLG95 pPASSBUFE pPASSBUFF pREADLINE (.H3 ° SECURE121084 4 �-:]_f + °¨J—NuJ« "f <aA) Ðy( aèN3ˆ fDJgaÂLù8* þÖ‹a gaA ¢`&Hç|Lù?* ´aA �Hë? Lß>Aë NBgaQ3 d B+ ÿzAë 0¼Bh1|NCNuJ« "fB ÿ\y( Lù8*  Ö‹a¾gaB ÿ@Nu KGè #L3A /&Ú/&ÒLù(Öˆ!|!/ &HaB ÿ,_--fÆNu KGè "K×ü(Eù* œK3€Ê '"·Éfú#h &HAë NCNuaÔg f8 |épNAaâ`ê'k " Lù* œaB þ´AëJ3€€ !HàþNBg Éf <1aB* þ˜`ÿCë 0Nu@ PRIV ACCOUNT F3  PWÿ‰((/‰((/+ -E !J€fK3 è «0001 fä gŠE -fHaÿ*fB. ýþaþ‚JgjLù8* òÖ‹a`f H3B€„ Aë $aýîgRCë 0Më Ýü³Îg@³gøaŽ`ÌJ« #g(Lù8* æÖ‹a&fAë $aý´L3  ‚ gCë #±‰gab`Ö±‰fø+ -f‚NuLù* ºAë!Hà|NBLù* Â(|*Ú†Aë!HàI3 |NBf$C*(B2PR…¼…döB€Nu0 Æf Hç~aB ý*Lß~S+ Y3_þ gB. ýNu($* * (($* B* X(0* Z* k(0* ** @ENTER SECURITY WORDENTER NEW SECUK3 RITY WORDENTER EXISTING PASSWORDENTER NEW PASSWORDJ« "fB üŽMù* &X3H‘ ’ aB( ü„Lù* dÜ‹aMù* PaMù* XaLù* €Ö‹'|!`B üR+ -é@ -BaB1 üBgJ3AT! + -0@ $Kë!$aB ü(+ $ 4dÞ 0eØ 2d+ -ü€@ -L3@ aB ûüNuaüð/aüx gÚ gÔJŸaB* ûà`ÿHLEVELS ARE: 0/NONE,1/SWORD,2F3   /PWORD,3/BOTHUSER=0:USER NOT 0:&EET(,(-M3„È‚ (-&EET(,,K2<aB& û\fT'k " $Lù* þÖ‹Ø‹Aë!HàþNBf6Aë!$ pJQ3*¡ NAEë #aB û,Cë!$(aB% û$Cë $R©0Lù* Ö‹Ø‹Aë!HàþNBNu‰($)$?3À ‰($)$?1:4éééééééU1SYSCNTRL ASREL' SYSCNTRLSA!!(…8112040820 BASIC SESSION CONTROL COMMANDSý2HCONTINU ’HSTOPALL vpUCBSESS pSKIPSPAC HSUBSGET .HLOAD xHPRTIMDAT  pTIMECONV HDEFAULTS ‚HLDRFILL ¨HTERMALL èpWRITEINB pEDITSESS pGETLEFT4 pUCBCMDST pSTDERROR pSTDTRAP2 pSTDTRAP3 pCHPOSNUM pCVT2 ÷2pOFHS HDATE „pIASCVAL HUSE ÄpSYSDFLT HTRMINATE îHTIME HSTOPTASK ~HBREAKS ìHBREAKT úpBDCONV HSTOP1 ‚HNOARG HLOGOFF HTERM5 4pDATEGO HBYEBYE jpPROC120 ø2pUCBTID pPROC210 pPROC260 pLOGPRU pUCBSNO pUCBUNO pPROC255 pUCBVOL pUSERNO pUCBTSK pUCBUTN HLOGBYE pUCBLUS pUCBTUT HOPTCMD pOPTION pSCTINB HLOGDATE |pFHEXCLOS HLOGDATIM ŽpUCBREGA6 ø2HUSTRT €pCMDACCTT pLOGMESG pSCTEXB pEDITFILE HLOGTIME pMSGCALL pODATCONV pBUILDMSG pLMARGIN pBLANKOUT pERRCALL pENABLASQ pCHAINPTR pCHAINBUF pEMSGCAL1 pEMSGCALL HOFHSFILL ¨pSHAREOPT pUCBLDCNT HUSERDFLT ~W2pGETLJSFY pLDRCALL pUCBMSWAT pDISABASQ pUCBTEMP HARG øpREADLINE (I3( SYSCNTRL121084 4ÇÇ&<€aÈ+!.g vB‚2<aA2 ÌJ« /f,KGùO3�  ) nvaA4 ¸gf Mù(aþþf|� <ÿÿ&<€I3@ J�f,J‚g ´« 'g"<&SCTpa”f <aþ¼B�`B« -B« aBH ýÊ0<aÿrf.J‚M3 €Q g´« 'g <J+!f <aþ‚`R+ GaB> ý–J�gÄaB> ýŽNuB�$+ '`aþnpG3€ aÿ*gNu < J+!f < aþBJ�gÜNuKë *Më -]J]=] -] -UNuL3@ aâ/ aB7 ý6&_/,kBK 3-@ Ij ,_ <4`Œ,_fî€pf <5aBB ý`HJ«N3�„ f €`kdKë **îJ]:î *î *îL¹* ~aB üÐf6J« f4<aB üÀf&'kI3É * /,k 3. Cf",_a&/,k 3 . I,_Nu <6aBB üŽ0<ÿÿNu,_`Þ€a:"+L3”  Lë| 'Aë 1HÐ~Lë -�Hè <aB= üRNua <`B= üD*k 32- CI3PD‰ Kë!1('M!6 pg€@R€ cîüÿ'M!6Nu/,k 3î C`h/,k 3® CI3 ! `Z$H  c¢ ;fJaB0 ûæJk8fNf, d&Jg"/,k 3f2. CI3€@ Á`2. C�=A C,_`À <7`B û . Cg,_Nu,_`ÿ@/,k 3`æagNu‡Q3€€ føfòMù* aBJ ûh‡gÇNuaB ûX € nÒáˆ& /fÈaB ûB €n¼L3H€ /f¶aB û. €Pm¨€lHCЃH@aB! û/Aë pJNA'_ `rpJ`p ENTER DN3P ATE (MM/DD/YR)=atfZ‡fTfNMù* xaBJ úЇgÇNuaB úÀ €nÒJ3H Àü<& :fÆaB ú¨ €g6À`âJføB$ // ,k 3Cî!@ÿ”‰"_,_µë ?eÚF3! Ç`JgÀR`°SfÆ`ªB|  /,k 3RŽ�ŽSŽ@ ,_JfNu <`R3ˆ„ B= ù6,_x$k 3¸n6Kë 1ü\ aB ùáXÀáXÀü:B@2@MòP/BaB: øþaB øú(3@ R„`Ƈg¬ <`BB øä4éé' USM RO__qqUSMOPT RO||$$qq[1USM ASREL' USM SA!(…8107190816 USER SESSION MANAGEMENT CONTROL TASKù2HGETLAPSE BpSTOPALL pUCBSESS HSKIPSPAC pUCBCMDLG HLEFTMARG „HPRTFILE RpPRTIMDAT pUCBBNAM pUCBCMDND pDEFAULT pENDQUEUE pLDRFILL pLO  GTRYNO pTERMALL HWRITEINB ¨HEDITSESS ÐHGETLEFT4 äpUCBREGX pUCBPRILI ù2pJOBQUEUE pSTARTMON pUCBCMDST pLOGM HSTDERROR ÆpTIMECNT HSTDTRAP1 ‚HSTDTRAP2 ZHSTDTRAP3 ,HGETNOSPA ÂpSCTINBE pCHPOSNUM pCVT2 pOFHS pDATE HX10100 vpUSE pSYSDFLT HPROC "pSYSCMDS ò2pTIME pSTRUOPT HSYSDPAR ÒpCHAIN pCHAIN2 HECHOE úpSTOP1 pCMDEND HCLOCDF ¤HICALL ÂpLOGOFF HFHOPEN øpTERM5 pUCBLEN HCKDEV .pBYEBYE HECHOS æHPROC120 †pUCBTID ö2HECHOT HOPNCDF ŒHPROC210 (HPROC260 øpLDRLDO HPROC320 pPROC400 HLOGPRU ÈpUCBSNO pUCBUNO HPROC255 òHPROC206 ìHBCTRAP1 |pUSERNO  pDELAYS pLDRCLL pUCBTSK pUCBTSO pCLASCODE ý2pUCBUTN pUTTCBP pLOGBYE HSCTBEG pUCBLUS pUCBTUT HPROMPT CpSCTINB pSYSOPT HADDLAPSE XpSTRUTN HASGNFILE pUSRTSK pSCTSTK HBUILDINB  HFHCLOSE  HFHEXCLOS pUCBREGA6 pCMDPWVAL HFHEXOPEN üú2HLOGMESG  pSCTEXB pEDITFILE pUCBREGD HMSGCALL 4HBUILDMSG °HEDITSPAC ÎHLMARGIN 'HBLANKOUT $HERRCALL œpENABLASQ pCHAINPTR pLDRABUF pCHAINBUF HEMSGCAL1 ,HEMSGCALL &pLODRETRY pOFHSFILL HSC18 ðÙ2pSHAREOPT pUCBLDCNT HLG95 ¢pREGCHAIN HCKNODEV HGETLJSFY ØHLDRCALL &EET(ZB‡ k JÑü(R'H PLë =Hë B« @Lù* hajpJAëH3�J >NAB« D <aÜ,Kf Gù* |va 9(Fg( «0001 8f/+ :B« 9B«P3¢‚ :Mù* a€'W 9'_ :fˆaBT ý€Aú­/ aBM ýv&_Cù* ¤L™a ’CúîL™aI3 †fCúøL™a xCúÔa 6Múpa(`Ñü, €d. |`$ y(SR+ VfB; øP `Ø CHAIN ABORTF3 ED(CHAIN)=  =ENTER DEFAULT SYSTEM VOLUME:USER NO.=ENTER USI3€‚ ER NO.=Lë Aë!&Hà~NAf8NuIù(?g$Lù8* œaÌ"<$<‡I3A g.A `(*k J-!UgSŽ<€Kë EaÖLù~* ”aŽ* ang ‚fЫH3@ !&g&a^f†/,(Aë ECð`ü ü Aë!#R†!QÎÿüKë EB� F3 ae {d/,k J. Uf ,_ =f /fÇ \g>±ÍcÁ  F3@p fº�'M , Aë Eœˆ'F  JNu(E(E(# ,H (g<4fZF3 ‡ k JEè R Ngú  g¦ =g ²gêJfü`â =gF`ò (Rf„ (XI3 ˆ fz ()frXˆÇ0+ gf` ÇaB% ôàJ@g"$k J°nP2EòPÇJgþøF3€ ±Íc0Ú`î/ $k J* $$_€ü a H@aÇ`þÒ±Íc0ÀNu   <`H NF3 f SˆÇ`þÞü~‡ \gÿ =gþŒ !gþ¼ &gþ´4F3€ kþ¬`Ôff æg fa`JJNu/,k J. Ug,_`,,_f$F3 f fgHçþüU�aŽLß?ÇNufrÇ`jKë LB…atAë LK3"B ("<$<* +!CfB‚Aë!&Hà~NBg8 áfJ« DkB4 óŽ ÆfJ« DkI3€D B4 ó€ÇgÇ` ÂfÇJNuKë EB…aAë E(`’ M/ÞfünS� G30 Nu  oášNuB‚aðaîaì`êáš  oNu$< aìaêaè`æ'k 5!&L™a.fG3$Q ÿ&(+ CÄ'D CJNuL™afÿ(+ \„'D \(+ C„`ÜAë!&H pBhNCNu + 8F3!!* Lë ,�B„ k J( UgÄ69(g69(Y` g69(]*+ :Aë 6HàG3� ü7|`> 6pAë ABhJNDNuHë LpAë L!|+!CfB¨NDLë LJ€F3 NuaH@a < aNuáXÀáXÀÅNu  fSˆB†`4k`ê  gö,+ œˆF3P 'F 'H NuRˆ  gøNu$/". )Aî &,H<ü@<Â<Ã,ÁB^$< ,üPRIV,Â,Û,ÛF3 ! <ÛB^Bž&_NCNuB. V?2<a¼g f€X+ Vgx |ôpNAAë &NC`Þ|ÿì VI3 "<$<Lú8üaÚAë!&Hà~NBf>*(Aë!EÿÚˆ"<$<Aë!&Hà~J3@T NBfR+ Vk¶fªMù* øaú´gžÇ7| &Bk!&7_!&NCNuJffÀJ€Nug g'k 5!&NuLДªI3 j‚&\S�’’NuÔ© ‚&\e‚&\R�Ò‘"Á"‚Nuڋ؋֋Nu"+ 8a fB1 ð|0¼'3* À`B1 ðtAù(±ù(j ²¨gPˆ`îJ�Nu4ééééééé  P1CMDOPT1 ASREL' CMDOPT1 SA AY(…8112100940 GROUP 1 OPTIONAL COMMANDSø2pPRTFILE pWRITEINB pSTDERROR HHELP (pOFHS pASCVAL HNEWS pECHOE HCLOSE HASSIGN `pUCBTID pENDCHA1 pPROC206 pOPTION pSYSCMD pSCTINB pUSRTSK pFHEXCLOS pUCBREGA6 pFHEXOPEN pEDITFILE H2pMSGCALL pOFHSFILL pGETLJSFY pLDRCALL pUCBKEEP pUCBTEMP (ÎM3$ P CMDOPT1 121084 4,KGù) v`A äNEWS NWMù* ÚaA" Ð,KGù(Kî JgD›G3 fø| ÿÿ Z€€&@ / Iî �Œ(_"‚ü HAJAgü R`ì/ Iî!0»ÌkP(_R3€ S�/ &NaB ÿr,K&_Jf¢&NMù* ôBaB" ÿ\Aë! < ÀBX À À üHELP À0¼LOaB% ÿ:I3( f"+ `B ÿ0Nu(_`ÿfSESSION CONTROL COMMANDS:(ENTRY OF LOWER CASEI3 LETTERS OPTIONAL)aB þâgJ bD g fgÇgÇU3B$ `B þ¶2<BBaB þ¬‡fB þ¤NuaB þžg c <9`B þŒ  f <:`î/,kM3¤€` -C ',_aB# þn/ aB! þh&_j <4`Ìgg0f'k !`" <)`ªT3$*  /,k î ',_gÂg¼ ;g\B‚aB$ þaB$ þaB$ þ aB$ þMù* ®rx}�…‰�‘•™�´–g HB´žF3€ gQÉÿôB�/,k &. ',_ƒ gD fJ gD g> <;`ÿ0$H/ aI3€ B ý¶&_kê OfägÞ4 k &( 'ƒ`& g fÂ4g k ( 'I3€ g‚@2<@aB ýhfg ,+ &Æ'F &NuEREWERPWPREWPRPWEWPWER 3 PR4F1SECURE  ASREL' SECURE SA!E(…8107190816 SECURITY OPTIONø2pGETLAPSE pLEFTMARG pLOGTRYNO HREADPASS $pSTDERROR pSTDTRAP1 pOFHS pX10100 pSYSDFLT pPASSKEY HPASS "pSYSDPAR pECHOE pUCBLEN pUCBTID pECHOT  pLOGPRU pUCBSNO HSWORD žpSCTDAT HSECURE lã2pUSERNO pUCBTSO HACCTEND œHPWVAL ÌpSCTINB pADDLAPSE pASGNFILE pSCTDSL HACCTINN žpMSGCALL pERRCALL pEMSGCAL1 pEMSGCALL pUCBLDCNA pUCBLDCNT pLG95 pPASSBUFE pPASSBUFF pREADLINE (.H3 ° SECURE121084 4 �-:]_f + °¨J—NuJ« "f <aA) Ðy( aèN3ˆ fDJgaÂLù8* þÖ‹a gaA ¢`&Hç|Lù?* ´aA �Hë? Lß>Aë NBgaQ3 d B+ ÿzAë 0¼Bh1|NCNuJ« "fB ÿ\y( Lù8*  Ö‹a¾gaB ÿ@Nu KGè #L3A /&Ú/&ÒLù(Öˆ!|!/ &HaB ÿ,_--fÆNu KGè "K×ü(Eù* œK3€Ê '"·Éfú#h &HAë NCNuaÔg f8 |épNAaâ`ê'k " Lù* œaB þ´AëJ3€€ !HàþNBg Éf <1aB* þ˜`ÿCë 0Nu@ PRIV ACCOUNT F3  PWÿ‰((/‰((/+ -E !J€fK3 è «0001 fä gŠE -fHaÿ*fB. ýþaþ‚JgjLù8* òÖ‹a`f H3B€„ Aë $aýîgRCë 0Më Ýü³Îg@³gøaŽ`ÌJ« #g(Lù8* æÖ‹a&fAë $aý´L3  ‚ gCë #±‰gab`Ö±‰fø+ -f‚NuLù* ºAë!Hà|NBLù* Â(|*Ú†Aë!HàI3 |NBf$C*(B2PR…¼…döB€Nu0 Æf Hç~aB ý*Lß~S+ Y3_þ gB. ýNu($* * (($* B* X(0* Z* k(0* ** @ENTER SECURITY WORDENTER NEW SECUK3 RITY WORDENTER EXISTING PASSWORDENTER NEW PASSWORDJ« "fB üŽMù* &X3H‘ ’ aB( ü„Lù* dÜ‹aMù* PaMù* XaLù* €Ö‹'|!`B üR+ -é@ -BaB1 üBgJ3AT! + -0@ $Kë!$aB ü(+ $ 4dÞ 0eØ 2d+ -ü€@ -L3@ aB ûüNuaüð/aüx gÚ gÔJŸaB* ûà`ÿHLEVELS ARE: 0/NONE,1/SWORD,2F3 /PWORD,3/BOTHUSER=0:USER NOT 0:&EET(,(-M3„È‚ (-&EET(,,K2<aB& û\fT'k " $Lù* þÖ‹Ø‹Aë!HàþNBf6Aë!$ pJQ3*¡ NAEë #aB û,Cë!$(aB% û$Cë $R©0Lù* Ö‹Ø‹Aë!HàþNBNu‰($)$?3À ‰($)$?4L1CHAINBAT ASREL' CHAINBATSA 9%(…8112221120 CHAIN/BATCH SUBSYSTEMÿ2pABORTSK HEETSBATE FHEETSQREQ ôpUCBCHOPT pSUBSGET pUCBBNAM pUCBCMDND HELIM VpENDQUEUE pGTSEGARG pEDITSESS pUCBREGX pUCBCHLVL pJOBQUEUE pTSEGPGM   pSCTBDSL pUCBCMDST pSCTSBNO pSTDERROR pSTDTRAP1 pSTDTRAP3 pGETNOSPA ü2pCHPOSNUM pSCTSQACK pNEXTQUE pOFHS pIASCVAL pSTRUTSES pCHSAVLVL HEETSQRY ŠpPROC pTMOVPAR pASCVAL HCHAIN `HCHAIN2 ŒpECHOE HCMDEND øHCANCEL ÚpCLOCDF pICALL pLOGOFF pFHOPEN pEETRCV ø2pCKDEV HBATCH ÚpECHOS pUCBTID pOPNCDF HENDCHA1 pPROC320 HPROC400 rpLOGPRU pUCBBNO pEETSNO pBCTRAP1 pSCTDAT pUSERNO pCURRUN pUCBTSK pSCTIDB pUCBLUS pPROMPT HQUERY NpEETSXT û2pSCTINB pUSRSNO pTRAP1NTS pSCTSTK pFHCLOSE pFHEXCLOS pUCBREGA pUCBREGA6 HRETRY @pEDITFILE pUCBREGD pMSGCALL pEDITSPAC pGTSEGDAT pERRCALL pUCBMAXLU pENABLASQ pCHAINPTR pREADEVNT HSUBCHAIN pCHAINBUF pEMSGCALL Ñ2HPROCEED DpOFHSFILL pSC18 pSHAREOPT pTSCTASQP HREGCHAIN ÂpUSERDFLT pCKNODEV HEETSQCAN ’pUCBCHNLU pUCBPRIBT pFHOPNTID pUCBKEEP pUCBTEMP pCHCURLVL pDELAYSEC HEETSGSNO Î(xH3 CHAINBAT121084 4faèÇaŠgNu¸9(Sbtva–g fA  ÅL3ˆ‚ `Ì Å'E _,k U+ dBfBf'N Ua>aAY ž=|CF/ aAM ’&_ @ügìaA^ „j gJ g* (=gaJ€f ¶Rnÿ&NÕ`ÿ aêJ€f ¶RlðF3 NÕaÜJ€fþf¶RfàNÕ (=gaÆJ€fæ¶RmÊNÕa¶J€fضRo¼NÕaªJ€fʶRL3 g®NÕafkÖfgžNÕf˜NÕaBP ú ‚SEfB8 ú+ dg "S+ *gNukL3¨ª *+ d+ *gÇNu‡NuaBP ùÒ ‚DIFg ‚DFORgüp`B8 ù¼+ d« *S+ dkF3ˆ€ `À <!`ý¦,KGî `,KGî K`,KGî N$Ka" (fa¼k6gÄ`„6„F3 &NNu =f aÔk>J€fê6ƒ&NNuRˆ Xg Ag DgJŸ`òEî ` F3H Eî K`Eî NaºNu RfÔaÆ +g@ -g* &g !g`¶ajJ€f„0I3 €C`a\J€fv0ÀC` aPJ€fj0�C6€&NNua@J€fZ0ÐC`îaB( ø¾ )f$aP =f CI3 ja@8 0fNu 1fJNu6<ÿÿNuRˆaB( øˆJ�k B€ ƒjJ�Nu <3NuI3 &N`ülRˆBA  g  gî4NuJŸ <"`üH&N`ò <#Aë `BR ø2END R3)Ê CHAINg <$`B øB« :Lù* Öa>a('y* !'7k!>!'Lù* ò:9(`aV3… )E B< ÷äfæLù(aB< ÷ÔfÆLù(QaB< ÷Äf¶Kè A'M"=üLù(aB< ÷¬fžÑü($'H"=øU3( ˆA Lù(\aB< ÷’f„ k aBY ÷†=|CF/ aBM ÷z&_"HaB^ ÷rkdL¹(7aôfTaB" ÷ZG3 fH8<aøf< I(ÿÿ  b&$aøLù* Öap*<* ô'k :!'a@‡ A€gAë  <*`BR ö <-aV3€…PB B ö <ÿÿ&<€aB< õü <.Aë `BX õî k L<(!c HE8:< aB  ! õÚ‡faBe õÐ`ôK3 Nu/Aë!'.HG6.HD8HD.Nua6fLù* ÖaÖ*<* Ša¬‡faŽfÜNuN3 fø <'`BR õ|  g$<0000aB õl ‚0000f$+ :g" ‚0ALLfB‚'B!'B†<+!>P3(� /,k L-F!c,_Nu —* PgàJŸ <&`B õ(aªLù* ÖaÿP*<* ’aÿ$‡fØafàNuI3P k L!A c <,f <+f <* f <,Hë EAë EaBR ôÄQ3(H /,k L,. c,_B‚ÇBFJ†NuJ« >fB9 ô¤aBY ô / aBM ôš&_kgB†'F!'<+!' kK3 H  L!F!c`ÿV <(`B ôpv,+ Bg RC Cfô6<ÿNuLë Aë!'0ÄHÐ"<O3@ taB" ô>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/83**ˆBIT�TEST�MACRO* BTSTM„MACRO§®L·i¿LÇ>Ï8×Cß7çKïQ÷:ÿ:7OKU'[/@78?9G=OZWL_Ng@oSw9T‡P�@—? „IFGE†\1-16‰OPT‡MEX‰BTSTW…#\1-16,\2(\3,\4) ‰OPT‡NOMEX„ENDC* „IFLT†\1-16‰OPT‡MEX‰BTSTW…#\1,\2+2(\3,\4) ‰OPT‡NOMEX„ENDC‰ENDM *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ‰P AGE‰XREF†GETTSKID‰XREF†LUNS†NR.�OF�LOGICAL�UNITS ‰XREF†SIGFMS ‰XREF†TEL02 ‰XREF†TEL05 ‰XREF†TELFMS‰PAGE**ˆGENERAL�EQUATES**(PBCLN„EQU…14’PARAM�BLOCK�CONSTANT�LENGTHTFIL…EQU…$26‘TEMPORARY�FILEBIT1…EQU…1“BIT�NUMBER�1**�FHSID�TASK�NAME**‰PAGE**ˆFHS�INITIALIZATION�ROUTINE**ˆREV.�1.00‚6/15/79�(JIM�SMITH)*0*�THIS�ROUTINE�PERFORMS�THE�FOLLOWING�FUNCTIONS:**�-�SET�USER�STACK�POINTER'*�-�ESTABLISH�MODULE�AS�A�TRAP�2�SERVER**ˆENTRY:�A0�=�IOCOMS�ADDRESS**ˆEXIT:�A7�=�STACK�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�**�A�*�R****‰PAGE‰INCLUDEƒTEMPLATE.FHS.AI‰PAGE ˆSECTION�0*FHSENTƒBRA.SƒINIT�INIT�VECTORFHSASRƒBRA.SƒASRTOPŽASR�VECTOR ‰DC.B†'FHSD'‰DC.L†'120384�4'ŠIDENTIFICATION** INIT:* Initialization:J*ƒA0�is�passed�to�me�with�the�I/O�common�address�in�it.‚Place�this�address *…in�my�own�data�area�at�IOCOMS.*ƒSet�stack�pointer.'*ƒEstablish�myself�as�a�TRAP�#3�server.*ƒWait�for�event.*INIT: ‰MOVE.L�A0,A6$*œA6�=�ADDRESS�OF�I/O�COMMON�SEGMENT‰LEA‡GSEGPBLK(PC),A01*œA0�=�ADDRESS�OF�FHS�GET�SEGMENT�PARAMETER�BLOCK‰MOVE.L„#GTSEG,D0*œD0�=�DIRECTIVE�NUNBER‰TRAP†#1*œGET�FHS�DATA�SEGMENT‰BSRNE.SƒFATAL*œKILL�SYSTEM�IF *¦UNABLE�TO�GET�FHS�DATA�SEGMENT ‰MOVE.L„A0,A2*œA2�=�FHS�DATA�SEGMENT�ADDRESS‰MOVE.L„#TSEGSIZE,D0/*œD0�=�NUMBER�OF�BYTES�IN�DATA�SEGMENT�OBTAINEDINIT02: ‰CLR.B…(A0)+ ‰SUB.L…#1,D0 ‰BNE.S…INIT02(*œZERO�OUT�THE�FHS�DATA�SEGMENT�OBTAINED*œBRANCH�IF�NOT�DONE‰MOVE.L„A2,GSEGADDR(A2)*œA2�=�FHS�DATA�SEGMENT�ADDRESS‰MOVE.L„A6,IOCOMS(A2)!*œA6�=�I/O�COMMON�ADDRESS�SEGMENT‰LEA…FHSTAK(A2),A7*œA7�=�STACK�ADDRESS ‰BSR‡GETASQ*œGET�ASQ�FOR�FHS ‰BSR‡TEMPLATE.*œINITIALIZE�THE�DATA�SEGMENT�OBTAINED�FOR�FHS**ˆESTABLISH�TRAP�3�SERVER*‰LEA‡SRVBLK(A2),A0!*œA0�=�ADDRESS�OF�PARAMETER�BLOCK‰MOVE.L„#SERVER,D0*œD0�=�DIRECTIVE�NUMBER‰TRAP†#1 *œESTABLISH�FHS�AS�TRAP�3�SERVERO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>(*ˆBEQ.S…WEVT†OK�WE�ARE�THE�TRAP�3�SERVER‰BEQ.S…BFASRTOPO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<%‰CMP.B…#RTCDDPRQ,D0ˆINTERCEPT�PRESENTO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*ˆBEQ.S…WEVT†YES�-�GO�WAIT‰BEQ.S…BFASRTOP„YES�-�GO�WAITO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*œKILL�SYSTEM�IF'*¦UNABLE�TO�ESTABLISH�FHS�AS�THE�TRAP�3*œSERVER**O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*WEVT…ERQ.WTEVNT’WAIT�FOR�EVENT)*ˆBRA.SƒWEVT�IF�WE�GET�HERE�GO�WAIT�AGAINO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<**ˆABORT�ROUTINE* FATAL„EQU…*'‰MOVEM.L�D0/A0,-(A7)‰SAVE�REG�A0�AND�D0‰ERQ.ABORT‚#0�ABORT�SELF‰PAGE**ˆASYNCHRONOUS�SERVICE�ROUTINE**ˆREV.�1.00‚6/15/79�(JIM�SMITH)*-*�-ENTRY�IS�CAUSED�BY�THE�ARRIVAL�OF�AN�EVENT4*�-THE�EVENT�STRUCTURE�INCLUDES�THE�REQUESTOR'S�FHCB3*�-THE�ASQ�IS�DISABLED�UNTIL�PROCESSING�IS�COMPLETE***ˆENTRY:�A7�=�STACK�POINTER* *ˆEXIT:�A4�=�ASQ�MESSAGE�POINTER*ŽA5�=�FHCB�POINTER *ŽA6�=�ZERO*ŽA7�=�STACK�POINTER*ŽD7�=�LUT�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7*�Dƒ*�**�A�*…R�R�R�R�P**** * ASRTOP:*‚Read�the�event."*‚Clear�the�command�flag�(LUNCSF).*‚Set�A4�to�point�to�event.#*‚IF�not�server�event�(code�7)�THEN*…return�from�event.'*‚If�it's�not�a�TRAP�#3�type�event�THEN*…return�from�event.**‚If�it's�an�end�of�task�notification�THEN *…BRAƒEOTEX.* BFASRTOP:‰MOVE.L„IOCOMS(A2),A6&*œA6�=�ADDRESS�OF�I/O�COMMON�DATA�AREA‰LEA‡SVTSTCF(A6),A00*œA0�=�ADDRESS�OF�SYSTEM�TASK�CONFIGURATION�FLAG‰BSET†#BIT1,(A0)$*œSET�FLAG�--�FHS�INITIALIATION�DONEASRTOP:‰MOVE.L„#GTEVNT,D0!*œD0�=�GET�EVENT�DIRECTIVE�NUMBER‰TRAP†#1*œGET�THE�EVENTO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*&*ˆBNE…RTNEVTŽERROR �-�RETURN�FROM�EVENT ‰BSRNE…FATAL**œBRING�SYSTEM�DOWN�IF�UNABLE�TO�GET�EVENT*&*ˆMOVE.L‚#0,A6�SET�ZERO�INDEX�REGISTER ‰SUB.L…A6,A6*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< )‰CLR.WƒLUNCSF(A2)ŠINIT.�COMMAND�TYPE�FLAG+‰LEA…ASQUE(A2),A4‹SET�UP�POINTER�TO�MESSAGE(‰MOVE.B‚EVCODE(A4),D1‡PICK�UP�EVENT�CODE‰AND.Bƒ#$F,D1ŽISOLATE�CODE(‰CMP.Bƒ#EVCSRV,D1ŠIS�THIS�SERVER�EVENT�?O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>**ˆBNE…RTNEVTŽNO,�IGNORE�IT ‰BNE‡ASRTOP*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5‰MOVE.B‚EVUTIN(A4),D1‡PICK�UP�TRAP�INSTRUCTION�NUMBER ‰MOVE.L‚D1,D2!‰AND.Bƒ#$F,D2ŽISOLATE�TRAP�NUMBER‰CMP.Bƒ#FHSTIN,D2ŠTRAP�3�?O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>**ˆBNE…RTNEVTŽNO,�ERROR ‰BNE‡ASRTOP*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<$‰BTSTƒ#EVTNEOT,D1ŠEOT�NOTIFICATION�?‰BNE…EOTEX�YES***ˆMAKE�SURE�THERE�IS�AN�LUT�FOR�THE�CALLER*+* Go get exclusive access to the LUT table.0* Search LUT for match on task name and session.4* If no LUT is found for task, attempt to build one.+* If there is an error in building LUT THEN@*„BSR�ERRUBF�{Sets�error�code�$C�(I/O�system�table�full)�into�D1*�releases�LUT.}E*„BSR�PUTSTA�{Sets�up�and�performs�move�logical�of�error�code�from�D1&*�into�calling�tasks�parameter�block.}I*„BRA�SETCC‚{Acknowledge�service�request�sending�back�condition�codes�and*�D0�via�ACKRQST}.*�Go�return�from�event.**#‰BSR…WAITLUT�GET�ACCESS�TO�LUT�LIST1‰LEA…EVUTSK(A4),A0‡SET�UP�TASK�POINTER�FOR�LUTLOK%‰BSR…LUTLOKŽGO�LOOK�UP�LUT�FOR�CALLER‰TST.LƒD0’FIND�ONE�?‰BEQ.SƒASR3�YES&‰LEA…EVUTSK(A4),A0‡SET�TASK�ID�POINTER(‰MOVE.W‚EVUUNM(A4),D1‡SET�UP�USER�NUMBER‰BSR…LUTBLDŽNO,�BUILD�AN�LUT‰TST.LƒD0’SUCCESSFUL�?‰BEQ.SƒASR3�YES,‰BSR…ERRBUFŽSet�error�code�in�D0,�Signal�LUT-‰BSR…PUTSTAŽMove�status�to�actual�user's�P.B.3‰BRA…SETCC�Set�condition�codes,�acknowledge�service)*¤request,�and�return�from�event�service.**ˆCHECK�PARAMETER�BLOCK�INFO*L* Check status of returned parameter block which was moved as part of event.%* IF bad parameter block address THEN7*…BEQƒERRPRMƒ{Sets�error�code�of�#FSTAIP�(14)�into�D1.}%*”{Release�LUT�via�SETCCL�BSR�SIGLUT}+*”{Acknowledges�service�request�via�ACKREQ}*”{Go�return�from�event.}* ELSEB*…Set�A5�to�point�to�FHS�parameter�block�portion�of�event�(FHCB)}.;* IF this is a privileged command (code = $80) in FHCB THEN *…BRAƒLEVEL80* ELSEB*…Using�CMDTBL�and�the�bit�that�is�set�in�the�command�field�of�the<*…passed�parameter�block,�JMP�to�the�appropriate�routine.�IfB*…there�is�more�than�one�command�bit�set�or�an�invalid�command�bitG*…is�set,�branch�to�ERRCOD.‚ERROCOD�goes�through�PUTSTA,�SETCCL,�ACKREQF*…and�finally�returns�from�event�service.‚A�code�of�#FSTAIF�$2�invalid*…command�is�returned�to�user.**ASR3…TST.BƒEVUPST(A4)ŠPB�OK�?‰BEQ.SƒASR5�YES)‰CMP.Bƒ#EVPSTBA,EVUPST(A4)�BAD�PB�ADDR.�?‰BEQ…ERRPRMŽYES4ASR5…LEA…CALBLK(A2),A5ŠSET�UP�POINTER�TO�FHCB�BUFFER.‰TST.BƒFHSCMD(A5)ŠIS�THIS�PRIVILEGED�COMMAND�?.‰BMI…LEVEL80�YES,�GO�SERVICE�LEVEL�80�COMMANDS*/*ˆDECODE�COMMAND�CODE�AND�JUMP�TO�LEVEL�HANDLER*9ASR10„LEA†CMDTBL(PC),A0ŠSET�UP�POINTER�TO�CMD�LEVEL�TABLE‰CLR.LƒD1’SET�UP�BIT�POINTER‰TST.BƒFHSCMD(A5)ŠCODE�ZERO�?‰BEQ.SƒASR17�YES‰TST.Lƒ(A0)+�BUMP�TABLE�POINTER*‰MOVE.B‚FHSCMD(A5),D2‡PICK�UP�COMMAND�CODEASR15„BCLR„D1,D2�THIS�BIT�SET�?‰BEQ.SƒASR20�NO‰TST.BƒD2’MORE�THAN�1�BIT�SET�?‰BNE…ERRCODŽYES,�ERRORASR17„TST.Lƒ(A0)�VALID�LEVEL�?‰BEQ…ERRCODŽNO,�COMMAND�ERROR‰MOVE.L‚(A0),A0#‰JMP…(A0)�JUMP�TO�CMD�LEVEL�HANDLER"ASR20„ADD.Lƒ#1,D1�BUMP�BIT�POINTER‰TST.Lƒ(A0)+�BUMP�TABLE�POINTER‰CMP.Bƒ#8,D1�REACHED�LIMIT�?‰BEQ…ERRCODŽYES�-�COMMAND�ERROR‰BRA.SƒASR15�NO,�CONTINUE‰PAGE**ˆLEVEL�ZERO�COMMAND�HANDLER*1*�THIS�ROUTINE�WILL�SCAN�THE�COMMAND�FIELD�OF�THE1*�REQUESTOR'S�FHCB�FROM�LEFT�T O�RIGHT�AND�MAP�THE.*�BIT�POSITION�TO�A�COMMAND�EXECUTOR�FOR�LEVEL*�ZERO�COMMANDS.***!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�*�*�*‰R*�A�*�*ƒ*�P�P�P�P** * LEVEL0:K*‚Validate�parameter�block�length.�IF�error�BRA�ERRPRM�{Error�code�#FSTAIP}G*‚Validate�reserved�field�=�0.‚IF�not�BNE�ERRCOD�{Error�code�#FSTAIF�2}*.LEVEL0ƒCMP.Bƒ#FHSBLN,EVUPSZ(A4)‚PB�LENGTH�OK�?‰BLT…ERRPRMŽNO,�ERROR!LEV02„CLR.LƒD1’SET�UP�STATUS�CODE1‰BSR…PUTSTAŽPut�D1�status�into�actual�user's�P.B.'‰TST.WƒFHSGEN(A5)ŠRESERVED�FIELD�ZERO�?‰BNE…ERRCODŽNO,�ERROR*$*ˆVALIDATE�COMMAND�CODE�COMBINATIONSI* Validate that we have a good code by trying to find it in table CC0FHS.5* IF not valid then BEQ ERRCOD {Error code #FSTAIF 2}*,‰LEA…CC0FHS(PC),A0ŠSET�UP�FILE�COMMAND�TABLE‰LEA…FHS0END(PC),A11‰MOVE.W‚FHSCMD(A5),D2‡PICK�UP�REQUESTOR'S�COMMAND‰AND.Bƒ#$FF,D2�ISOLATE�COMMANDLEV03„CMP.Bƒ(A0)+,D2ŒMATCH�?‰BEQ.SƒLEV04�YES,�IT'S�OK�!‰CMP.LƒA1,A0�END�OF�TABLE�?#‰BEQ…ERRCODŽYES,�INVALID�COMMAND(S)‰BRA.SƒLEV03�NO,�CONTINUE*K*�Find�the�address�of�the�LUN�entry�within�the�LUT.‚IF�the�entry�representsH*ƒa�bad�logical�unit�number�(out�of�range)�or�the�entry�is�valid�but�notG*ƒactive�then�BEQ�LEV06.�For�valid�returns,�D6�will�contain�the�address"*ƒof�the�LUN�entry�within�the�LUT.*LEV04„CLR.LƒD1+‰MOVE.B‚FHSLUN(A5),D1‡SET�UP�LUN�FOR�LUNLOK2‰BSR…LUNLOKŽLook�up�LUN.‚Returns�LUN�pointer�in�D6'*¤D0�=�0,normal�1,active�-1,invalid�LUN‰TST.LƒD0’TEST�RETURN‰BEQ.SƒLEV06�NOT�ACTIVE‰BMI.SƒLEV06�INVALID*+* Come here if we found a valid active LUN.K* IF the user's request was only for an allocate (code =$80) THEN BEQ LEV06* ELSE9*…IF�the�LUN�represents�a�file�assignment�THEN�BEQ�LEV000*…ELSE-*ˆIF�{must�be�a�device�assignment}�BRA�LEV07.*)‰CMP.Wƒ#FHALLO,FHSCMD(A5)‚ALLOCATE�ONLY�? ‰BEQ.SƒLEV06�YES,�LUN�NOT�NEEDED.‰MOVE.B‚LUTCSF(A6,D6.L),D1„PICK�UP�STATUS�FLAG$‰BTSTƒ#LUSFDV,D1‹DEVICE�ASSIGNMENT�?‰BEQ.SƒLEV000ŽNO,�FILE‰BRA.SƒLEV07�YES** LEV06:C*‚Come�here�not�active�or�invalid�LUN�specified�in�callers�FHS�P.B.E*‚Based�upon�the�volume�field�in�the�FHS�P.B.�try�to�find�a�DCB�entry*‚that�matches..*‚IF�we�do�not�find�DCB�entry�THEN�BNE�LEV000.*$LEV06„BSR…DCBLOKŽLOOK�UP�DEVICE�NAME‰TST.LƒD0’TEST�RETURN'‰BNE.SƒLEV000ŽNOT�FOUND,�MUST�BE�A�FILE* LEV07:+*‚Come�here�if�this�is�a�device�assignment.G*‚IF�this�is�an�FMS�type�request�(allocate,�delete,�or�checkpoint)�THENE*‚BNE�ERRIDT�(Error�code�#FSTADT�$E).�Eventually�acknowledges�service!*‚request�and�returns�from�event.*LEV07„MOVE.W‚FHSCMD(A5),D1‡PICK�UP�COMMAND-‰AND.Wƒ#FHALLO+FHDELT+FHCKPT,D1�FMS�REQUEST�?‰BNE…ERRIDTŽYES,�ERROR*M* Starting with the highest order bit set set in the code field of the user'sB*ƒparamereter�block�and�using�table�LEV0EX�as�a�jump�table,�JSR�toE*ƒthe�appropriate�routine�for�each�of�the�bits�set.‚If�an�error�comes;*ƒback�from�any�of�the�routines�(D1�<>�0)�then�handle�errorM*ƒvia�BSR�ERRCMD,�BSR�PUTSTA,�BSR�SETCC�which�ultimately�acknowledges�service!*ƒrequest�and�returns�from�event. ‰CLR.LƒD1‰BSETƒ#LUSFDV,D1-‰MOVE.B‚D1,LUNCSF(A2)‡SET�DEVICE�COMMAND�FLAG#LEV000ƒMOVE.L‚#7,D1�SET�BIT�POINTER3‰LEA…LEV0EX(PC),A0ŠSET�UP�POINTER�TO�EXECUTOR�TABLE ‰CLR.LƒD2%‰MOVE.W‚FHSCMD(A5),D2‡PICK�UP�COMMAND‰BEQ.SƒLEV040ŽZERO�IS�INVALID LEV010ƒBCLR„D1,D2�THIS�BIT�SET�?‰BEQ.SƒLEV020ŽNO‰TST.Lƒ(A0)�VALID�EXECUTOR�?‰BEQ.SƒLEV040ŽNO,�COMMAND�ERROR‰BRA.SƒLEV030ŽOK%LEV020ƒTST.Lƒ(A0)+�BUMP�TABLE�POINTER#‰SUB.Lƒ#1,D1�BUMP�BIT�POINTER�(L2R)‰BMI…SETCZ�FINISHED�!‰BRA.SƒLEV010ŽCONTINUELEV030ƒMOVE.L‚(A0),A08‰MOVE.W‚D2,LUNCMD(A2)‡SAVE�COMMAND�FOR�NEXT�EXECUTOR�CAL"‰JSR…(A0)�JUMP�TO�COMMAND�EXECUTOR‰TST.LƒD1’TEST�RETURN‰BEQ.SƒLEV035ŽOK-‰BSR…PUTSTAŽMove�status�to�actual�user's�P.B.3‰BRA…SETCC�Set�condition�codes,�acknowledge�service)*¤request,�and�r eturn�from�event�service.0LEV035ƒMOVE.B‚LUNCSF(A2),D2‹PICK�UP�COMMAND�TYPE"‰BTSTƒ#LUSFDV,D2‹FILE�ASSIGNMENT�?‰BEQ…SETARQŽYES,�ENABLE�ASQ ‰CLR.LƒD2%‰MOVE.W‚LUNCMD(A2),D2‹RESTORE�COMMAND‰BEQ…SETCZ�ALL�DONE�!‰MOVE.L‚#7,D1�RESET�BIT�POINTER&‰LEA…LEV0EX(PC),A0ŠRESET�TABLE�POINTER#‰BRA.SƒLEV010ŽGO�CALL�NEXT�EXECUTOR3LEV040ƒBSR…ERRCMDŽSet�error�code�in�D0,�Signal�LUT.2‰BSR…PUTSTAŽMove�status�(D1)�to�actual�user's�P.B.3‰BRA…SETCC�Set�condition�codes,�acknowledge�service)*¤request,�and�return�from�event�service.‰PAGE**ˆALLOCATE�EXECUTOR**ˆREV.�1.00‚6/15/79�(JIM�SMITH)*-*�THIS�IS�A�BULK�STORAGE�COMMAND�TO�BE�PASSED-*�ON�TO�THE�FMS�MODULE,�HOWEVER�WE�MUST�CHECK,*�FOR�OTHER�EXECUTOR�REQUESTS�(I.E.,�ASSIGN)'*�AND�PROVIDE�THE�LUT�AND�LUN�POINTERS.*$*�THE�LUT�LIST�IS�LOCKED�UPON�ENTRY.*!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�*�*‹P *�A‰P�P�P�P****** ALLOC:G*‚IF�the�assign�bit�is�set�(in�addition�to�the�allocate�bit)�OR�this�is*‚for�a�temporary�file�THEN *…BRA�ALLOC10*‚ELSE7*…Send�event�to�FMS�(LUN�pointer�=�0,�LUT�pointer�<>�0)(*…IF�error�in�queueing�event�to�FMS�THEN3*ˆBNE�ERRCMD�{Sets�error�code�#FSTAIF�($02)�into�D1*”Signals�LUT.3*”Returns�from�whence�we�were�called�(near�LEV030).*…ELSE!*ALLOC10:Set no error #0 into D1.*ˆLook�up‚LUN�entry�via�LUNLOK.$*ˆIF�invalid�logical�unit�error�THEN *‹BMI�ERRLUN�(#FSTAILU�#3�error)*ˆELSE*‹IF�all�ready�assigned�THEN*ŽBNE�ERRASG�(#FSTAAS�$0D)*‹ELSE *ŽBRA�ASGN10.**ALLOC„CLR.LƒD1%‰MOVE.W‚FHSCMD(A5),D1‡PICK�UP�COMMAND"‰AND.Wƒ#FHASGN,D1ŠASSIGN�BIT�SET�?‰BNE.SƒALLOC10�YES0‰CMP.Bƒ#TFIL,FHSFIL(A5)„TEMPORARY�FILE�REQUEST�?‰BEQ.SƒALLOC10�YES,�ALSO�ASSIGN‰CLR.LƒD6’CLEAR�LUN�POINTER‰BSR…TELFMSŽGO�NOTIFY�FMS‰BEQ.S…ALLOC05*œBRANCH�IF�EVENT�QUEUED‰CMP.B…#RTCDTASK,D0 ‰BEQ‡ERCOSNX*œBRANCH�IF�FMS�IS�NON-EXISTENT‰BRA…ERRCMDŽERROR*œBRANCH�FOR�INVALID�COMMANDALLOC05:‰BSR…SIGLUTŽRELEASE�LUT�LOCK‰BRA…OKSTA�RETURNALLOC10‚CLR.LƒD1+‰MOVE.B‚FHSLUN(A5),D1‡SET�UP�LUN�FOR�LUNLOK2‰BSR…LUNLOKŽLook�up�LUN.‚Returns�LUN�pointer�in�D6'*¤D0�=�0,normal�1,active�-1,invalid�LUN‰TST.LƒD0’TEST�RETURN‰BMI…ERRLUNŽLOGICAL�UNIT�ERROR‰BNE…ERRASGŽASSIGNMENT�ERROR‰BRA.SƒASGN10ŽGO�NOTIFY�FMS‰PAGE**ˆASSIGN�EXECUTOR**ˆREV.�1.00‚6/15/79�(JIM�SMITH)%*ˆREV.�2.00‚3/10/83�(STEVE�FEITELSON)*,*�IF�ASSIGNMENT�IS�TO�A�BULK�STORAGE�LOGICAL+*�PROPERTY,�THE�REQUEST�IS�PASSED�ON�TO�THE *�FMS�MODULE.*"*�THE�ASSIGN�ESTABLISHES�A�LOGICAL&*�CONNECTION,�THRU�THE�LUT,�FOR�A�TASK!*�TO�A�DEVICE�OR�FILE�IN�ORDER�TO *�EFFECT�I/O.*$*�THE�LUT�LIST�IS�LOCKED�UPON�ENTRY.*#*�THE�DCB�LIST�WILL�BE�LOCKED�FOR�A*�DEVICE�ASSIGNMENT.**ˆENTRY:�A4�=�ASQ�MESSAGE*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME*ŽD5�=�DCB�POINTER*ŽD6�=�LUN�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�*�*ƒ*�*�R�R�P *�A�*‡P�P�P�P***ASGN:;*‚Look�for�the�LUN�entry�for�this�task,logical�unit�number.*‚IF�invalid�logical�unit�THEN!*…BMI�ERRLUN‚(error�#FSTAILU�#3).'*‚IF�all�ready�active�logical�unit�THEN!*…BNE�ERRASG‚(error�#FSTAAS�#$D).*‚IF�LU�=�0�THEN*…IF�NOT�system�task�THEN!*ˆBEQ�ERRLUN�(error�#FSTAILU�#3). ASGN…CLR.LƒD1+‰MOVE.B‚FHSLUN(A5),D1‡SET�UP�LUN�FOR�LUNLOK2‰BSR…LUNLOKŽLook�up�LUN.‚Returns�LUN�pointer�in�D6'*¤D0�=�0,normal�1,active�-1,invalid�LUN‰TST.LƒD0’TEST�RETURN‰BMI…ERRLUNŽLOGICAL�UNIT�ERROR‰BNE…ERRASGŽASSIGNMENT�ERROR‰TST.BƒFHSLUN(A5)ŠLU�ZERO�?‰BNE.SƒASGN5�NO.‰MOVE.B‚EVUTIN(A4),D1‡YES,�MAKE�SURE�O.S.�TASK‰BTSTƒ#EVTNOS,D1‹O.S.�TASK�?‰BEQ…ERRLUNŽNO,�LU�ERROR**ASGN5:G*‚Try�to�find�the�DCB�entry�associated�with�mnemonic�in�user's�FHS�P.B.**‚IF�we�can�find�the�entry�in�the�DCB�THEN-*…BEQ�ASG20�{Go�handle�as�device�assignment}.*6ASGN5„BSR…DCBLOKŽFind�DCB�entry.‚Returns�address�in�D5*¤D0�=�0,found�1,n ofind.‰TST.LƒD0’TEST�RETURN'‰BEQ.SƒASGN20ŽMUST�BE�DEVICE�ASSIGNMENT**ASGN10:*‚{Assume�file�assignment}E*‚Set�active�LUN,�assign�pending�bits�in�LUTCSF�portion�of�LUN�entry.I*‚Increment�active�count�in�LUT�entry.‚Save�access�mode�request�bits�from0*‚callers�FHS�P.B.�into�the�LUN�entry�at�LUTCAP.-*‚Go�queue�event�to�FMS.‚(Event�subcode�=�6).(*‚IF�error�in�queueing�event�to�FMS�THEN *…BRA�ASG15:.!*‚Release�the�LUT�via�BSR�SIGLUT.2*‚BRA�OKSTA.‚{Clears�D1�and�RTSs�to�around�LEV030}*<ASGN10ƒMOVE.B‚LUTCSF(A6,D6.L),D1„NO,�MUST�BE�FILE�ASSIGNMENT#‰BSETƒ#LUSFAC,D1‹SET�ACTIVE�LUN�BIT#‰BSETƒ#LUSFAS,D1‹SET�ASSIGN�PENDING*‰MOVE.B‚D1,LUTCSF(A6,D6.L)„UPDATE�LUN�FLAG7‰ADD.Bƒ#1,LUTCAS(A6,D7.L)„INCREMENT�ACTIVE�COUNT�IN�LUT%‰MOVE.W‚FHSOPT(A5),D1‡PICK�UP�OPTIONS‰AND.Wƒ#7,D1�ISOLATE�AP+‰MOVE.B‚D1,LUTCAP(A6,D6.L)„UPDATE�AP�IN�LUN‰BSR…TELFMSŽGO�NOTIFY�FMS‰BNE.SƒASGN15ŽERROR‰BSR…SIGLUTŽRELEASE�LUT�LOCK‰BRA…OKSTA�RETURN*@* {Come here if we couldn't successfully queue the event to FMS}6* Undo what we've done: Clear active bit in LUN entry.* Clear assign pending bit.0* Decrement number of active assignments in LUN.'* Clear access permission field in LUN."* Release LUT lock via BSR SIGLUT."* BRA ERRFMS (error #FSTAIE #$13).*ASGN15:‰MOVE.L„D0,-(A7)"*œSAVE�STATUS�RETURNED�FROM�TELFMS+‰MOVE.B‚LUTCSF(A6,D6.L),D1„PICK�UP�LUN�FLAG!‰BCLRƒ#LUSFAC,D1‹RESET�ACTIVE�BIT%‰BCLRƒ#LUSFAS,D1‹CLEAR�ASSIGN�PENDING*‰MOVE.B‚D1,LUTCSF(A6,D6.L)„UPDATE�LUN�FLAG3‰SUB.Bƒ#1,LUTCAS(A6,D7.L)„DECREMENT�LUN�ASSIGNMENTS%‰CLR.BƒLUTCAP(A6,D6.L)‡CLEAR�AP�FIELDASGN17:‰BSR…SIGLUTŽRELEASE�LUT�LIST‰MOVE.L„(A7)+,D0*œD0�=�RESTORED�TELFMS�STATUS‰CMP.B…#RTCDTASK,D0 ‰BEQ‡ERCOSNX*œBRANCH�IF�FMS�IS�NON-EXISTENT‰BRA…ERRFMSŽDEVICE�ERROR*9*ˆDEVICE�ASSIGNMENT�REQUIRES�EXCLUSIVE�ACCESS�TO�DCB�LIST*ASGN20:,* {Come here if we have a device assignment}* Lock the DCB via BSR WAITDCB.=* Attempt to find the DCB entry from FHS P.B. via BSR DCBLOK.:* IF we can't find a DCB entry for this task,FHS P.B. THEN"*…Release�DCB�lock�via�BSR�SIGDCB."*…Release�LUT�lock�via�BSR�LUTLOK.!*…BRA�ERRFMS�(error�#FSTAIE�#13).*ASG22:;* IF this is the NULL device (bits 8-15 of DCBFLG) set THEN'*…Set�up�PRPW�codes�into�event�FHS�P.B.*0ASGN20ƒBSR…WAITDCB�GO�REQUEST�ACCESS�TO�DCB�LIST$‰BSR…DCBLOKŽGet�DCB�address�into�D5.*¤D0�=�0,found�1,not�found.‰TST.LƒD0’TEST�RETURN‰BEQ.SƒASGN22ŽOK(‰BSR…SIGDCBŽNOT�FOUND�-�RELEASE�DCB�LIST‰BSR…SIGLUTŽRELEASE�LUT�LIST‰BRA…ERRFMSŽRETURN�ERRORH* Note: Bits 0-7 of DCBFLG are for flags, bits 8-15 are for device type.ASGN22:O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰MOVE.W„FHSOPT(A5),D1*œD1�=�REQUESTOR'S�OPTIONS‰ANDI†#FOPABF,D1 ‰BNE‡ERRSSE *œBRANCH�IF*¡WE�HAVE�DEVICE�ASSIGNMENT*¡SHARED�SEGMENT�REQUEST*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<)‰CMP.Bƒ#255,DCBFLG(A6,D5.L)‚NULL�DEVICE�?‰BNE.SƒASGN25ŽNO1‰MOVE.B‚#FOPPRPW,FHSOPT+1(A5)…YES,�SET�AP�TO�PRPW**ASG25:(*…IF�status�changed�flag�set�in�DCB�THEN:*ˆIF�the�session�of�requesting�task�is�NOT�0001�(FMS)�THEN-*‹BRA�ERRAP�{release�DCB�lock�via�BSR�SIGDCB.*–error�#FSTAAP�#$0B}.*ASG30:F*…Check�requested�access�permission�codes�against�ones�established�for*…device�via�BSR�PCCHK.*…IF�protect�code�conflict�THEN,*ˆBNE�ERRPC�{release�DCB�lock�via�BSR�SIGDCB*“error�#FSTAPC�#$07}K*…Check�attributes�(read/write)�against�attributes�specified�in�DCB�against2*…requested�access�permission�codes�via�BSR�ATCHK.*…IF�attributes�conflict�THEN-*ˆBNE�ERRFCT�{Release�DCB�lock�via�BSR�SIGDCB*”error�#FSTAIF�#$02}*6ASGN25ƒMOVE.W‚DCBFLG(A6,D5.L),D1‚PICK�UP�DEVICE�STATUS)‰BTSTƒ#DFLGSC,D1‹STATUS�CHANGE�FLAG�SET�?‰BEQ.SƒASGN30ŽNO‰CMP.Lƒ#IOSESS,EVUSES(A4)‚FMS�?‰BNE…ERRAP�NO,�RETURN�AP�ERROR7ASGN30ƒBSR…PCCHK�Checks�protection�codes�from�event�FHS)*¤P.B.�against�those�in�DCB�at�DCBRCD�and)*¤DCBWCD.‚D0=0�if�match, �<>0�on�no�match. ‰TST.LƒD0!‰BNE…ERRPC�NO,�PROTECT�CODE�ERROR%‰BSR…ATCHK�ATTRIBUTES�MATCH�COMMAND�? ‰TST.LƒD0‰BNE…ERRFCTŽNO,�COMMAND�ERROR*L* IF the attributes flags in DCB indicate that this device supports spooling* THEN?*…IF�the�session�of�requesting�task�is�NOT�$0001�(spooler)�THEN1*ˆBSR�TELSPL�{queues�event�from�EVLEN�to�spooler}!*“{event�subtype�=�$07�(SPLEVT))}4*ˆIF�spooler�active�(no�error�from�queue�event)�THEN@*‹Clear�LUSFDV�in�LUNCSF�to�make�it�look�like�a�file�assignment. *‹BRA�ASGN50.*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/83*ˆMOVE.W‚DCBATT(A6,D5.L),D1‰MOVE.L‚DCBATT(A6,D5.L),D1 *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<!‰BTST„#DATSPL,D1ŠSUPORT�SOOLING�?‰BEQ.SƒASGN35ŽNO!‰CMP.Lƒ#IOSESS,EVUSES(A4)‚SPOOLER‰BEQ.SƒASGN35ŽYES,�OK�TO�ASSIGN‰BSR…TELSPLŽNO,�TELL�SPOOLER"‰BNE.SƒASGN35ŽSPOOLER�NOT�ACTIVE�!9‰BCLR„#LUSFDV,LUNCSF(A2)‚MAKE�IT�LOOK�LIKE�A�FILE�ASSIGN. ‰BRA.SƒASGN50**ASGN35:'*‚Check�access�permission�via�BSR�APCHK6*‚IF�invalid�access�(code�#1�returned�from�APCHK)�THEN@*…BNE�ERRAP.�{Signals�DCB,�returns�error�to�user�of�#FSTAAP,�$B} *‚{No�error}$*‚Save�DCB�pointer�in�LUT�at�LUTDCB.I*‚Set�active�bit�(LUSFAC)�and�assign�bit�(LUSFDV)�in�LUT�status�(LUTCSF).*‚Release�DCB�lock,�LUT�lock.<*‚BRA�OKSTA�{Clears�D1�return�parameter�and�returns�VIA�RTS.*'ASGN35ƒBSR…APCHK�ACCESS�PERMISSION�OK�? ‰TST.LƒD0‰BNE…ERRAP�NO,�AP�ERROR:ASGN40ƒMOVE.L‚D5,LUTDCB(A6,D6.L)„SET�UP�DCB�POINTER�IN�LUN‰MOVE.B‚LUTCSF(A6,D6.L),D1&‰BSETƒ#LUSFAC,D1‹SET�ACTIVE�BIT�IN�LUN&‰BSETƒ#LUSFDV,D1‹SET�DEVICE�ASSIGN�BIT(‰MOVE.B‚D1,LUTCSF(A6,D6.L)„UPDATE�STATUS7‰ADD.Bƒ#1,LUTCAS(A6,D7.L)„INCREMENT�ACTIVE�COUNT�IN�LUT"ASGN50ƒBSR…SIGDCBŽRELEASE�DCB�LOCK‰BSR…SIGLUTŽRELEASE�LUT�LOCK‰BRA…OKSTA�GO�SET�GOOD�RETURN‰PAGE*#*ˆCHANGE�ACCESS�PERMISSION�EXECUTOR* *ˆREV.�1.00‚11/01/79�(JIM�SMITH)*0*�THIS�ROUTINE�WILL�CHANGE�THE�ACCESS�PERMISSION *�OF�AN�LUN�TO�A�DEVICE�OR�FILE.*,*�IF�ASSIGNMENT�IS�TO�A�BULK�STORAGE�LOGICAL+*�PROPERTY,�THE�REQUEST�IS�PASSED�ON�TO�THE *�FMS�MODULE.*$*�THE�LUT�LIST�IS�LOCKED�UPON�ENTRY.*#*�THE�DCB�LIST�WILL�BE�LOCKED�FOR�A*�DEVICE�ASSIGNMENT.**ˆENTRY:�A4�=�ASQ�MESSAGE*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME*ŽD5�=�DCB�POINTER*ŽD6�=�LUN�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�*�*ƒ*�*�R�R�P *�A�*‡P�P�P�P**CAPN:(*‚Look�up�logical�unit�entry�within�LUT.*‚IF�invalid�LUN�THEN#*…BMI�ERRLUN�(error�#FSTAILU,�#$03)*‚IF�LU�not�assigned�THEN"*…BEQ�ERRASG�(error�#FSTAAS.�#$0D)* CAPN…CLR.LƒD1+‰MOVE.B‚FHSLUN(A5),D1‡SET�UP�LUN�FOR�LUNLOK2‰BSR…LUNLOKŽLook�up�LUN.‚Returns�LUN�pointer�in�D6'*¤D0�=�0,normal�1,active�-1,invalid�LUN‰TST.LƒD0’TEST�RETURN‰BMI…ERRLUNŽINVALID�LU‰BEQ…ERRASGŽLU�NOT�ASSIGNED*5* IF I/O is pending (LUSFIO in LUN entry is set) THENK*…BNE�ERRBSY�(Error�#ISTADB�(#$E2))�also�release�LUT�returns�after�JSR�(A0)?* IF this is a device assignment (LUSFDV in LUN entry set) THEN *…BRA�CAP20* ELSE$*…Sent�event�to�FMS�via�BSR�TELLFMS.(*…IF�error�in�queueing�event�to�FMS�THEN *ˆBNE�CAP10*…ELSE*ˆRelease�LUT�via�BSR�SIGLUT.7*ˆBRAƒOKSTA�(clears�D1�and�returns�following�JSR�(A0)).*.‰MOVE.B‚LUTCSF(A6,D6.L),D1‚PICK�UP�STATUS�FLAG‰BTSTƒ#LUSFIO,D1‹I/O�PENDING�?‰BNE…ERRBSYŽYES,�ERROR$‰BTSTƒ#LUSFDV,D1‹DEVICE�ASSIGNMENT�?‰BNE.SƒCAP20�YES‰BSR…TELFMSŽNO,�FILE�,�TELL�FMS‰BNE.SƒCAP10�ERROR‰BSR…SIGLUTŽRELEASE�LUT�LIST‰BRA…OKSTA�RETURN**CAP10:*‚Release�LUT�via�BSR�SIGLUT.L*‚BRA�ERRFMS.�(Error�status�#FSTAIE,#$13�to�D1.‚Returns�following�JSR�(A0)).*CAP10:‰MOVE.L„D0,-(A7)*œSAVE�TELFMS�RETURNED�STATUS ‰BRA‡ASGN17*œFINISH�PROCESSING**ˆCHANGE�AP�TO�A�DEVICE*CAP20:.*‚{Come�here�if�this�was�a�device�assignment.}*‚Lock�the�DCB�via�BSR�WAITDCB. *‚BSR�CLRW.*5CAP20„MOVE.L‚LUTDCB(A6,D6.L),D5ƒSET�UP�POINTER �TO�DCB#‰BSR…WAITDCB�GET�ACCESS�TO�DCB�LIST-‰MOVE.B‚LUTCAP(A6,D6.L),D1‚PICK�UP�CURRENT�AP‰BSR…CLRW�UNDO�CURRENT�AP*.*‚IF�read�access�permission�was�requested�THEN:*…Move�DCBRCD�read�code�into�FHS�parameter�block�in�event.*CAP22:/*‚IF�write�access�permission�was�requested�THEN;*…Move�DCBRCD�write�code�into�FHS�parameter�block�in�event.* MOVE.W FHSOPT(A5),D1 AND.W #7,D13‰BSR…MAPAP�Return�with�requested�protection�values.!*¤D3�=�read�protection�requested."*¤D4�=�write�protection�requested.)*¤$FFFF,exclusive�$0001,public�$0000,none‰TST.WƒD3’READ�?‰BEQ.SƒCAP22�NO:‰MOVE.B‚DCBRCD(A6,D5.L),FHSRCD(A5)�YES,�GIVE�HIM�READ�CODECAP22„TST.WƒD4’WRITE�?‰BEQ.SƒCAP24�NO;‰MOVE.B‚DCBWCD(A6,D5.L),FHSWCD(A5)�YES,�GIVE�HIM�WRITE�CODE**CAP24:D* Check protect codes against those in event FHS P.B. via BSR PCCHK.$* IF protect codes do not match THEN*…BNE�ERRPC�{Releases�DCB}*�{Error�#FSTAPC.�#$07}*�{Release�LUT}* Check*6CAP24„BSR…PCCHK�Checks�protection�codes�from�event�FHS)*¤P.B.�against�those�in�DCB�at�DCBRCD�and)*¤DCBWCD.‚D0=0�if�match,�<>0�on�no�match.‰TST.LƒD0’TEST�RETURN‰BNE…ERRPC�ERROR‰BSR…ATCHK�CHECK�ATTRIBUTES‰TST.LƒD0’TEST�RETURN‰BNE…ERRFCTŽERROR*$* Check access permission via APCHK.#* IF invalid access permission THEN *‰BSR…APCHK�SET�UP�NEW�AP‰TST.LƒD0’GOOD�RETURN�?‰BEQ.SƒCAP30�YES'‰MOVE.B‚LUTCAP(A6,D6.L),FHSOPT+1(A5)‚NO‰BSR…APCHK�CHANGE�AP�BACK‰TST.LƒD0’TEST�RETURN ‰BSRNE…FATAL*œKILL�SYSTEM�IF%*¦THE�ACCESS�PERMISSION�CHECKS�FAILED‰BRA…ERRAP�RETURN�ERROR1CAP30„MOVE.B‚D1,LUTCAP(A6,D6.L)‚SET�NEW�AP�IN�LUT‰BSR…SIGDCBŽRELEASE�DCB�LIST‰BSR…SIGLUTŽRELEASE�LUT�LIST‰BRA…OKSTA�RETURN�OK‰PAGE**ˆRENAME�EXECUTOR**ˆREV.�1.00�8/1/79�(JIM�SMITH)*$*�THIS�ROUTINE�WILL�CHANGE�THE�ASCII *�IDENTIFIER�OF�A�DEVICE�OR�PASS *�THE�COMMAND�TO�FMS�FOR�A�FILE.***ˆENTRY:�A4�=�ASQ�MESSAGE*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME*ŽD5�=�DCB�POINTER*ŽD6�=�LUN�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�*�*‡R�R�P *�A�*‡P�P�P�P****RENAM„CLR.LƒD1+‰MOVE.B‚FHSLUN(A5),D1‡SET�UP�LUN�FOR�LUNLOK2‰BSR…LUNLOKŽLook�up�LUN.‚Returns�LUN�pointer�in�D6'*¤D0�=�0,normal�1,active�-1,invalid�LUN‰TST.LƒD0’TEST�RETURN‰BMI…ERRLUNŽLOGICAL�UNIT�ERROR‰BEQ…ERRASGŽASSIGNMENT�ERROR-‰MOVE.B‚LUTCSF(A6,D6.L),D1…PICK�UP�LUN�STATUS‰BTSTƒ#LUSFIO,D1�I/O�PENDING�?‰BNE…ERRBSY–YES,�ERROR#‰BTSTƒ#LUSFDV,D1‹DEVICE�ASSIGNMENT?‰BNE.SƒREN20�YES9‰CMP.Bƒ#FOPEREW,LUTCAP(A6,D6.L)�EXCLUSIVE�R/W�PERMISSION?‰BNE…ERRAPSŽNO�ERROR‰BSR…TELFMSŽNO,�TELL�FMS‰BNE.SƒREN10�ERROR‰BSR…SIGLUTŽRELEASE�LUT�LOCK‰BRA…OKSTA�RETURNREN10:‰MOVE.L„D0,-(A7)*œSAVE�TELFMS�RETURNED�STATUS ‰BRA‡ASGN17*œFINISH�PROCESSING**ˆRENAME�A�DEVICE*2REN20„TST.WƒEVUUNM(A4)ŠIS�HE�SYSTEM�ADMINISTRATOR?‰BNE…ERRPCSŽNO,�ERROR‰BSR…ASGCHKŽCHECK�AP‰TST.LƒD0’OK�?‰BNE…ERRAPSŽNO)‰LEA…FHSVOL(A5),A0†SET�UP�POINTER�TO�NAME ‰MOVE.L‚#4,D1�SET�UP�NAME�LENGTH‰BSR…CHKNAMŽVALIDATE�NAME‰TST.LƒD0’TEST�RETURN‰BNE…ERRDEVŽERROR'‰BSR…DCBLOKŽLOOK�UP�NAME�IN�DEVICE�LIST#‰TST.LƒD0’DOES�NAME�ALREADY�EXIST�?‰BEQ…ERRDEVŽYES,�ERROR‰BSR…WAITDCB�GET�ACCESS�TO�DCB-‰MOVE.L‚LUTDCB(A6,D6.L),D5„SET�UP�DCB�POINTER:‰MOVE.L‚FHSVOL(A5),DCBAID(A6,D5.L)�CHANGE�ASCII�IDENTIFIER‰BSR…SIGDCBŽRELEASE�DCB�LIST‰BSR…SIGLUTŽRELEASE�LUT�LIST‰BRA…OKSTA�RETURN‰PAGE**ˆPROTECT�EXECUTOR* *ˆREV.�1.00‚11/01/79�(JIM�SMITH)*/*�THIS�ROUTINE�WILL�CHANGE�THE�PROTECTION�CODES*�OF�A�DEVICE�OR�FILE.*,*�IF�ASSIGNMENT�IS�TO�A�BULK�STORAGE�LOGICAL+*�PROPERTY,�THE�REQUEST�IS�PASSED�ON�TO�THE *�FMS�MODULE.*$*�THE�LUT�LIST�IS�LOCKED�UPON�ENTRY.*#*�THE�DCB�LIST�WILL�BE�LOCKED�FOR�A*�DEVICE�ASSIGNMENT.**ˆENTRY:�A4�=�ASQ�MESSAGE*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME*ŽD5�=�DCB�POINTER*ŽD6�=�LUN�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�*�*ƒ*�*�R�R�P *�A�*‡P�P�P�P***** PROT …CLR.LƒD1+‰MOVE.B‚FHSLUN(A5),D1‡SET�UP�LUN�FOR�LUNLOK2‰BSR…LUNLOKŽLook�up�LUN.‚Returns�LUN�pointer�in�D6'*¤D0�=�0,normal�1,active�-1,invalid�LUN‰TST.LƒD0’TEST�RETURN‰BMI…ERRLUNŽINVALID�LU‰BEQ…ERRASGŽLU�NOT�ASSIGNED.‰MOVE.B‚LUTCSF(A6,D6.L),D1‚PICK�UP�STATUS�FLAG‰BTSTƒ#LUSFIO,D1‹I/O�PENDING�?‰BNE…ERRBSYŽYES,�ERROR$‰BTSTƒ#LUSFDV,D1‹DEVICE�ASSIGNMENT�?‰BNE.SƒPRO20�YES9‰CMP.Bƒ#FOPEREW,LUTCAP(A6,D6.L)‚EXCLUSIVE�READ/WRITE�AP�?‰BNE…ERRASGŽNO,�ERROR‰BSR…TELFMSŽNO,�FILE�,�TELL�FMS‰BNE.SƒPRO10�ERROR‰BSR…SIGLUTŽRELEASE�LUT�LIST‰BRA…OKSTA�RETURNPRO10:‰MOVE.L„D0,-(A7)*œD0�=�RETURNED�TELFMS�STATUS ‰BRA‡ASGN17*œFINISH�PROCESSING**ˆPROTECT�A�DEVICE*5PRO20„MOVE.L‚LUTDCB(A6,D6.L),D5‚SET�UP�POINTER�TO�DCB(‰TST.WƒEVUUNM(A4)ŠSYSTEM�ADMINISTRATOR�?‰BNE…ERRCMDŽNO,�ERROR‰BSR…ASGCHKŽCHECK�AP‰TST.LƒD0’OK�?‰BNE…ERRAPSŽNO#‰BSR…WAITDCB�GET�ACCESS�TO�DCB�LIST7‰MOVE.W‚FHSWCD(A5),DCBWCD(A6,D5.L)‚SET�UP�NEW�R/W�CODES‰BSR…SIGDCBŽRELEASE�DCB�LIST‰BSR…SIGLUTŽRELEASE�LUT�LIST‰BRA…OKSTA�RETURN�OK‰PAGE**ˆCLOSE�EXECUTOR**ˆREV.�1.00‚6/15/79�(JIM�SMITH);*ˆREV.�2.00‚3/10/83�(STEVE�FEITELSON)�IEEE�488�MODIFICATION*,*�IF�ASSIGNMENT�IS�TO�A�BLUK�STORAGE�LOGICAL+*�PROPERTY,�THE�REQUEST�IS�PASSED�ON�TO�THE*�FMS�MODULE�AFTER�PROCESSING.*"*�THE�CLOSE�WILL�DESOLVE�A�LOGICAL*�CONNECTION�FOR�A�TASK.*$*�THE�LUT�LIST�IS�LOCKED�UPON�ENTRY.**ˆENTRY:�A4�=�ASQ�MESSAGE*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�*�*�*�*�*�R�R�P *�A�*‡P�P�P�P****CLOSE„CLR.LƒD1+‰MOVE.B‚FHSLUN(A5),D1‡SET�UP�LUN�FOR�LUNLOK2‰BSR…LUNLOKŽLook�up�LUN.‚Returns�LUN�pointer�in�D6'*¤D0�=�0,normal�1,active�-1,invalid�LUN‰TST.LƒD0’TEST�RETURN‰BMI…ERRLUNŽLU�NOT�ACTIVE ‰BEQ…ERRASG3CLOS05ƒMOVE.B‚LUTCSF(A6,D6.L),D1‚PICK�UP�LUN�STATUS‰BTSTƒ#LUSFDV,D1‹DEVICE�?‰BEQ.SƒCLOS07ŽNO,�FILE"‰BTSTƒ#LUSFIO,D1‹ANY�I/O�PENDING�?‰BEQ.SƒCLOS06ŽNO-‰MOVE.L‚LUTDCB(A6,D6.L),D5‚SET�UP�DCB�POINTERO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/832*ˆMOVE.W‚DCBATT(A6,D5.L),D2‚PICK�UP�DCB�ATTRIBUTES1‰MOVE.L‚DCBATT(A6,D5.L),D2‚PICK�UP�DCB�ATTRIBUTES *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"‰BTSTƒ#DATHIO,D2ŽDEVICE�HALTABLE�?‰BEQ.SƒCLOS06ŽNO!‰TST.WƒDCBTMO(A6,D5.L)…DCB�BUSY�?‰BLE.SƒCLOS06ŽNO‰BRA…ERRBSYŽYES,�ERROR*CLOS06ƒBSR.SƒCLOS10ŽUPDATE�THE�LUT�AND�DCB‰BSR…CLUN�CLOSE�THE�LUN‰BSR…SIGLUTŽRELEASE�LUT�LIST‰BRA…OKSTA�RETURN"CLOS07ƒBSR.SƒCLOS10ŽUPDATE�THE�LUT"‰BSETƒ#LUSFCP,D1‹SET�CLOSE�PENDING,‰MOVE.B‚D1,LUTCSF(A6,D6.L)„UPDATE�LUN�STATUS‰BSR…TELFMSŽNOTIFY�FMS‰BNE.SƒCLOS08ŽERROR‰BSR…SIGLUTŽRELEASE�LUT�LIST‰BRA…OKSTA�RETURN3CLOS08ƒMOVE.B‚LUTCSF(A6,D6.L),D1„PICK�UP�LUN�STATUS$‰BCLRƒ#LUSFCP,D1‹CLEAR�CLOSE�PENDING,‰MOVE.B‚D1,LUTCSF(A6,D6.L)„UPDATE�LUN�STATUS‰MOVE.L„D0,-(A7)*œD0�=�RETURNED�TELFMS�STATUS ‰BRA‡ASGN17*œFINISH�PROCESSING**ˆTHIS�IS�A�CLOSE�SUBROUTINE*1CLOS10ƒMOVE.B‚LUTCSF(A6,D6.L),D1„PICK�UP�LUN�FLAG"‰BTSTƒ#LUSFIO,D1‹ANY�I/O�PENDING�?‰BEQ.SƒCLOS15ŽNO,�CONTINUE*4*ˆI/O�PENDING,�RELEASE�RESOURCES�AND�WAIT�FOR�IODONE*-‰BSETƒ#LUSFCP,D1‹SET�CLOSE�PENDING�BIT�IN�LUN/‰MOVE.B‚D1,LUTCSF(A6,D6.L)„UPDATE�STATUS�OF�LUN‰BSR…SIGLUTŽRELEASE�LUT�LIST‰ERQ.WAIT”WAIT�FOR�IODONE*¤WAITING......#‰BSR…WAITLUT�NOW�GET�LUT�LIST�AGAIN!‰BRA.SƒCLOS10ŽNOW�GO�TRY�TO�CLOSE**ˆTHIS�IS�WHERE�WE�CLOSE�HIM*6CLOS15ƒBCLRƒ#LUSFCP,D1‹CLEAR�CLOSE�PENDING�FLAG�IN�LUN$‰BTSTƒ#LUSFDV,D1‹DEVICE�ASSIGNMENT�?‰BNE.SƒCLOS20ŽYES.‰MOVE.B‚D1,LUTCSF(A6,D6.L)„NO,�FILE�-�TELL�FMS ‰RTS™RETURN)CLOS20ƒBSR…WAITDCB�GET�ACCESS�TO�DCB�LIST7‰MOVE.L‚LUTDCB(A6,D6.L),D5„PICK�UP�DCB�ADDRESS�FROM�LUN4‰MOVE.B‚LUTCAP(A6,D6.L),D1‚PICK�UP�ACCESS�PERMISSION$‰BSR.SƒCLRW�ADJUST�READ/WRITE�FIELDS O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰BSR.S…RECONFY N,*œDETERMINE�IF�A�RECONFIGURATION�BACK�TO�THE.*œDEFAULT�VALUES�IS�NECESSARY�AND�INITIATE�THE2*œREQUEST�AS�DETERMINED�BY�THE�RESULTS�OF�THE�EDIT*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< * *ˆWRAP�IT�UP*"CLOS50ƒBSR…SIGDCBŽRELEASE�DCB�LOCK ‰RTS…RETURN* *ˆADJUST�READ/WRITE�COUNT�FIELDS*E* A device may be normal, (not bus or bussable) or a bus device, or aA*ƒbussable�device.‚A�bus�device�may�have�several�bussable�devicesF*ƒassociated�wit�it.‚The�bus�device�as�well�as�the�associated�bussableH*ƒdevices�would�each�have�their�own�DCB.‚The�associated�bussable�devicesE*ƒwould�each�point�back�to�the�bus�device�through�the�pointer�DCBSUP.F*ƒDCBSUP�for�the�bus�device�itself�would�contain�a�session�number,�not *ƒa�pointer.*E* In addition to the above, a device may be sharable or not sharable.C*ƒA�sharable�device�is�one�that�can�be�assigned�to�two�tasks�at�theD*ƒsame�time.‚The�bits�DATBDV�and�DATSHR�are�used�to�encode�the�above'*ƒcharacteristics�in�the�following�way:*(* Explanation of bits DATBDV and DATSHR:*9*‚DATBDV,DATSHR�=�00ŒNormal�device�(not�bus,�not�shared).*�=�01ŒNon-shared�bus�device.*�=�10ŒShared�bussable�device."*�=�11ŒNon-shared�bussable�device.***CLRW:E*‚BSR�MAPAP�{obtains�request�read/write�access�in�D3,D4�respectively}?*‚IF�this�is�NOT�a�bussable�device�(DATBDV�clear�00�or�01)�THEN4*…IF�this�is�NOT�a�sharable�device�(DATSHR�set)�THEN*ˆ{01�Non-shared�bus�device} *ˆClear�session�number�in�DCBSUP,*‚ELSE�{10�1OR�11�this�is�a�bussable�device} *CLRW05A:,*…IF�any�read�or�write�access�requested�THEN,*ˆDecrement�DCBSOP�(subordinate�open�count).**7CLRW…BSR…MAPAP�Return�with�requested�protection�values.!*¤D3�=�read�protection�requested."*¤D4�=�write�protection�requested.)*¤$FFFF,exclusive�$0001,public�$0000,none *ÆIEEE488?*ˆCHECK�TO�SEE�IF�WE�ARE�DEALING�WITH�A�BUS�DEVICE�OR�A‰IEEE488*ˆBUSSABLE�DEVICE.®IEEE488 *ÆIEEE488B*ˆBTSTWƒ#DATBDV,DCBATT(A6,D5.L)‚IS�THIS�A�BUSSABLE�DEVICE?ƒIEEE488(ŠBTSTM‚DATBDV,DCBATT,A6,D5.L�SJF�9/23/83$‰BNE.SƒCLRW05A�BRANCH�IF�YES“IEEE488=*ˆBTSTWƒ#DATSHR,DCBATT(A6,D5.L)‚IS�THIS�A�BUS�DEVICE?ˆIEEE488(ŠBTSTM‚DATSHR,DCBATT,A6,D5.L�SJF�9/23/83"‰BEQ.SƒCLRW05�BRANCH�IF�NO”IEEE488 *ÆIEEE488>*ˆAT�THIS�POINT�WE�HAVE�A�NON-SHARED�BUS�DEVICE.‚CLEAR‰IEEE488.*ˆTHE�SESSION�#�IN�THE�DCB�OF�THE�BUS.šIEEE488 *ÆIEEE4881‰CLR.LƒDCBSUP(A6,D5.L)‡ZERO�OUT�SESSION�#ŽIEEE488‰BRA.SƒCLRW05�CONTINUE˜IEEE488 *ÆIEEE4882*ˆAT�THIS�POINT�WE�HAVE�A�BUSSABLE�DEVICE.–IEEE488 *ÆIEEE488ICLRW05A‚MOVE.L‚DCBSUP(A6,D5.L),A0„A0�<==�SUBORDINATES�BUS�DCB�PTR�IEEE488 ‰TST.WƒD3”ANY�NEW�READS?’IEEE488$‰BNE.SƒCLRW05B�BRANCH�IF�YES“IEEE488!‰TST.WƒD4”ANY�NEW�WRITES?‘IEEE488"‰BEQ.SƒCLRW05�BRANCH�IF�NO”IEEE488 *ÆIEEE488CCLRW05B‚SUB.Lƒ#1,DCBSOP(A0)‰UPDATE�THE�SUBORDINATE�OPEN�CNT�IEEE488**CLRW05:.* IF read access permission was indicated THEN*…Decrement�read�count�DCBRNT./* IF write access permission was indicated THEN*…Decrement�write�count�DCBWNT.*CLRW05ƒTST.WƒD3’READ�AP�?‰BEQ.SƒCLRW15ŽNO‰BPL.SƒCLRW10ŽMUST�BE�SHARED‰CLR.LƒD3’NO,�EXCLUSIVE‰BRA.SƒCLRW20ŽEXCLUSIVE�READCLRW10ƒNEG.WƒD3’SET�DECREMENT4CLRW15ƒADD.WƒDCBRNT(A6,D5.L),D3„DECREMENT�READ�COUNTCLRW20ƒTST.WƒD4’WRITE�AP�?‰BEQ.SƒCLRW35ŽNO‰BPL.SƒCLRW30ŽMUST�BE�SHARED‰CLR.LƒD4’NO,�EXCLUSIVE‰BRA.SƒCLRW40ŽEXCLUSIVE�WRITECLRW30ƒNEG.WƒD4’SET�DECREMENT5CLRW35ƒADD.WƒDCBWNT(A6,D5.L),D4„DECREMENT�WRITE�COUNT9CLRW40ƒMOVE.W‚D3,DCBRNT(A6,D5.L)„UPDATE�READ�COUNT�IN�DCB4‰MOVE.W‚D4,DCBWNT(A6,D5.L)„UPDATE�WRITE�COUNT�IN�DCB O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰RTS2*œThe�RTS�instructin�will�return�the�functionality1*œof�the�CLRW�routine�to�adjusting�the�read/write4*œcounts�for�a�device�(which�reflect�the�assignments*œassociated�for�the�device)  3*œThe�following�which�is�really�associated�with�the4*œclose�logic�will�determine�if�a�reconfiguration�of/*œthe�default�value�for�the�device�is�required.  RECONFYN: *1* IF the read and write counts are both zero THEN2*…IF�this�is�NOT�a�random�device�(DATRAN�=�0)�THEN.*ˆIF�we�need�to�reconfigure�(DCBCCF�<>�0)�THEN2*ŠIF�the�maintain�configuration�(FOPOVRT�=�0)�THEN$*‹Queue�event�to�IOS�via�BSR�TELLIOS=*‹{Send�configure�event�to�IOS�-�looks�just�like�event�queued"*Œto�FHS�but�with�header�attached} *‹BRA�CLRW50. *…ELSE‚{this�is�a�random�device}*CLRW45:D*ˆIF�the�session�of�the�task�that�queued�this�event�is�NOT�0001�THEN1*‹Send�status�change�event�to�FMS�via�BSR�SIGFMS.*‹{Parameter�format�at�QEVBLK},* ELSE {read and write counts not both zero}*CLRW50:*…Return�via�RTS.*$‰TST.LƒDCBWNT(A6,D5.L)…COUNTS�ZERO�?‰BNE.SƒCLRW50ŽNOO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/835*ˆMOVE.W‚DCBATT(A6,D5.L),D1‚PICK�UP�DEVICE�ATTRIBUTES4‰MOVE.L‚DCBATT(A6,D5.L),D1‚PICK�UP�DEVICE�ATTRIBUTES *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰BTSTƒ#DATRAN,D11‰BNE.SƒCLRW45ŽBRANCH�IF�DEVICE�IS�A�RANDOM�DEVICE‰TST.BƒDCBCCF(A6,D5.L)8‰BEQ.SƒCLRW50ŽBRANCH�IF�RECONFIGURATION�IS�NOT�NECESSARYO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰MOVE.W„FHSOPT(A5),D0*œD0�=�IOCB�OPTIONS�FIELD‰AND.W…#FOPOVRT,D0 ‰BNE.S…CLRW500*œBRANCH�IF�THE�TEMPORARY�CONFIGURATION�IS�TO�BE*œKEPT*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  ‰BSR…TELIOS(*¤TELL�IOS�TO�SET�DEVICE�BACK�TO�DEFAULT*¤CONFIGURATION ‰BRA.SƒCLRW50%CLRW45ƒCMP.Lƒ#IOSESS,EVUSES(A4)‚FMS�?$‰BEQ.SƒCLRW50ŽYES,�SKIP�NOTIFICATION‰BSR…SIGFMSŽNO,�TELL�FMSCLRW50ƒRTS™RETURN*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< **ˆTHIS�IS�A�CLOSE�SUBROUTINE*6CLUN…MOVE.B‚LUTCSF(A6,D6.L),D1„PICK�UP�LUN�STATUS�FLAG‰MOVE.L‚D1,D2�SAVE�STATUS!‰BCLRƒ#LUSFAC,D1‹CLEAR�ACTIVE�BIT!‰BCLRƒ#LUSFDV,D1‹CLEAR�DEVICE�BIT%‰BCLRƒ#LUSFAS,D1‹CLEAR�ASSIGN�PENDING$‰BCLRƒ#LUSFCP,D1‹CLEAR�CLOSE�PENDING/‰BTSTƒ#LUSEVC,D1‹ANY�CLAIM�EVENTS�MADE?ŒIEEE488!‰BEQ.S‚CLUNA�BRANCH�IF�NO–IEEE488 *ÆIEEE4880‰BCLR„#LUSEVC,D1ŒCLEAR�CLAIMS�EVENTS�BIT‰IEEE4885‰MOVE.L‚LUTDCB(A6,D6.L),A0„A0�<==�DCB�POINTERŽIEEE488)‰CLR.LƒDCBTSK(A0)ŒCLEAR�TASK�NAME‘IEEE488.‰CLR.LƒDCBSES(A0)ŒCLEAR�SESSION�NUMBERŒIEEE488*2CLUNA„MOVE.B‚D1,LUTCSF(A6,D6.L)„UPDATE�STATUS�FLAG(‰CLR.LƒLUTDCB(A6,D6.L)‡CLEAR�DCB�POINTER-‰CLR.WƒLUTATT(A6,D6.L)‡CLEAR�ATTRIBUTES�FIELD4‰CLR.BƒLUTCAP(A6,D6.L)‡CLEAR�ACCESS�PERMISSION�FIELD7‰SUB.Bƒ#1,LUTCAS(A6,D7.L)„DECREMENT�CURRENT�ASSIGNMENTS‰RTS™RETURN�TO�CALLER‰PAGE**ˆDELETE�EXECUTOR**ˆREV.�1.00‚6/15/79�(JIM�SMITH)*'*�THE�DELETE�IS�A�COMMAND�DIRECTED�TO�A%*�BULK�STORAGE�LOGICAL�PROPERTY�ONLY.*$*�THE�LUT�LIST�IS�LOCKED�UPON�ENTRY.**ˆENTRY:�A4�=�ASQ�MESSAGE*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�P *�A‰P�P�P�P****DELET„BSR…TELFMSŽNOT�MUCH�TO�DO‰BNE.SƒDELET10�ERROR ‰CLR.LƒD6‰BSR…SIGLUTŽRELEASE�LUT�LOCK‰BRA…OKSTA�RETURNDELET10:‰MOVE.L„D0,-(A7)*œD0�=�RETURNED�TELFMS�STATUS ‰BRA‡ASGN17*œFINISH�PROCESSING‰PAGE**ˆCHECKPOINT�EXECUTOR* *ˆREV.�1.00�12/15/79�(JIM�SMITH)*'*�THIS�ROUTINE�WILL�RETURN�AN�OK�STATUS&*�FOR�A�DEVICE�ASSIGNMENT�AND�PASS�THE'*�REQUEST�TO�FMS�FOR�A�FILE�ASSIGNMENT.***ˆENTRY:�A4�=�ASQ�MESSAGE*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME*ŽD5�=�DCB�POINTER*ŽD6�=�LUN�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�*�*‡R�R�P *�A�*‡P�P�P�P****CHKPNTƒCLR.LƒD1+‰MOVE.B‚FHSLUN(A5),D1‡SET�UP�LUN�FOR�LUNLOK2‰BSR…LUNLOKŽLook�up�LUN.‚Returns�LUN�pointer�in�D6'*¤D0�=�0,normal�1,active�-1,invalid�LUN‰TST.LƒD0’TEST�RETURN‰BMI…ERRLUNŽLOGICAL�UNIT�ERROR‰BEQ…ERRASGŽASSIGNMENT�ERROR O*>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*A*ˆFollowing�was�removed�to�fix�SPR.�Linda�seemed�to�feel�that�FMSC*ˆhad�the�situation�covered�where�a�checkpoint�request�could�not�beA*ˆinterrupted�by�another�write�function�to�the�same�file�thus�the:*ˆneed�for�the�edit�was�not�necessary�--�So�we�took�it�out*:*ˆCMP.Bƒ#FOPEREW,LUTCAP(A6,D6.L)�EXCLUSIVE�R/W�PERMISSION?*ˆBNE…ERRAPSŽNO�ERROR*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -‰MOVE.B‚LUTCSF(A6,D6.L),D1…PICK�UP�LUN�STATUS#‰BTSTƒ#LUSFDV,D1‹DEVICE�ASSIGNMENT?‰BNE.SƒCHKP20ŽYES‰BSR…TELFMSŽNO,�TELL�FMS‰BNE.SƒCHKP10ŽERROR‰BSR…SIGLUTŽRELEASE�LUT�LOCK‰BRA…OKSTA�RETURNCHKP10:‰MOVE.L„D0,-(A7)*œD0�=�RETURNED�TELFMS�STATUS ‰BRA‡ASGN17*œFINISH�PROCESSING**ˆCHECKPOINT�A�DEVICE*"CHKP20ƒBSR…SIGLUTŽRELEASE�LUT�LIST‰BRA…OKSTA�RETURN‰PAGE**ˆLEVEL�ONE�COMMAND�HANDLER**ˆREV.�1.00‚6/15/79�(JIM�SMITH)*1*�THIS�ROUTINE�WILL�SCAN�THE�COMMAND�FIELD�OF�THE1*�REQUESTOR'S�FHCB�FROM�LEFT�TO�RIGHT�AND�MAP�THE.*�BIT�POSITION�TO�A�COMMAND�EXECUTOR�FOR�LEVEL*�ONE�COMMANDS.**!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�*�*�*ƒ*…R*�A�*�*ƒ*�P�P�P�P******.LEVEL1ƒCMP.Bƒ#FHSBLN,EVUPSZ(A4)‚PD�LENGTH�OK�?‰BLT…ERRPRMŽNO,,�ERRO"LEV101ƒCLR.LƒD1’SET�UP�STATUS�CODE3‰BSR…PUTSTAŽPut�status�(D1)�into�actual�user's�P.B.‰MOVE.L‚#7,D1�SET�BIT�POINTER3‰LEA…LEV1EX(PC),A0ŠSET�UP�POINTER�TO�EXECUTOR�TABLE%‰MOVE.W‚FHSCMD(A5),D2‡PICK�UP�COMMAND‰AND.Wƒ#$FF,D2…ISOLATE�COMMAND LEV110ƒBCLR„D1,D2�THIS�BIT�SET�?‰BEQ.SƒLEV120ŽNO%‰TST.WƒD2’MORE�THAN�1�CMD�REQUESTED�?‰BNE.SƒLEV140ŽYES,�ERROR‰TST.Lƒ(A0)�VALID�EXECUTOR�?‰BEQ.SƒLEV140ŽNO,�COMMAND�ERROR ‰BRA.SƒLEV130%LEV120ƒTST.Lƒ(A0)+�BUMP�TABLE�POINTER#‰SUB.Lƒ#1,D1�BUMP�BIT�POINTER�(L2R)%‰BMI.SƒLEV140ŽREACHED�LIMIT�-�ERROR�!‰BRA.SƒLEV110ŽCONTINUELEV130ƒMOVE.L‚(A0),A0"‰JSR…(A0)�JUMP�TO�COMMAND�EXECUTOR‰TST.LƒD1’TEST�RETURN‰BEQ.SƒLEV135ŽOK2‰BSR…PUTSTAŽMove�status�(D1)�to�actual�user's�P.B.3‰BRA…SETCC�Set�condition�codes,�acknowledge�service)*¤request,�and�return�from�event�service.3LEV135ƒMOVE.B‚LUTCSF(A6,D6.L),D2„PICK�UP�LUN�STATUS"‰BTSTƒ#LUSFDV,D2‹FILE�ASSIGNMENT�?‰BEQ…SETARQŽYES,�ENABLE�ASQ ‰BRA…SETCZ�OK#LEV140ƒBSR…ERRCMDŽSET�COMMAND�ERROR2‰BSR…PUTSTAŽMove�status�(D1)�to�actual�user's�P.B.3‰BRA…SETCC�Set�condition�codes,�acknowledge�service)*¤request,�and�return�from�event�service.‰PAGE**ˆRETRIEVE�ATTRIBUTES�EXECUTOR* *ˆREV.�1.00�11/01/79�(JIM�SMITH)*)*�THIS�ROUTINE�WILL�RETURN�THE�ATTRIBUTES*�OF�A�DEVICE�OR�FILE.*,*�IF�ASSIGNMENT�IS�TO�A�BULK�STORAGE�LOGICAL+*�PROPERTY.�THE�REQUEST�IS�PASSED�ON�TO�THE*�FMS�MODULE�AFTER�PROCESSING.***ˆENTRY:�A4�=�ASQ�MESSAGE*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME*ŽD6�=�SOURCE�LUN�POINTER*ŽD7�=�SOURCE�LUT�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�*�*�*�*�*ƒR�P *�A�*‡P�P�P�P****,RATTR„TST.WƒFHSGEN(A5)ŠRESERVED�FIELD�ZERO�?‰BNE…ERRCMDŽNO,�ERROR ‰CLR.LƒD1,‰MOVE.B‚FHSLUN(A5),D1‡SET�UP�LUN�FOR�LUNLOOK2‰BSR…LUNLOKŽLook�up�LUN.‚Returns�LUN�pointer�in�D6'*¤D0�=�0,normal�1,active�-1,invalid�LUN‰TST.LƒD0’TEST�RETURN‰BEQ…ERRLUNŽLUN�NOT�ACTIVE‰BMI…ERRLUNŽLUN�INVALID+‰MOVE.B‚LUTCSF(A6,D6.L),D1‚PICK�UP�LUN�FLAG"‰BTSTƒ#LUSFDV,D1‹DEVICE�ASSIGNMENT‰BNE.SƒRAT20�YES‰BSR…TELFMSŽNO,�NOTIFY�FMS‰BNE.SƒRAT10�ERROR‰BSR…SIGLUTŽRELEASE�LUT�LIST‰BRA…OKSTA�RETURNRAT10:‰MOVE.L„D0,-(A7)*œD0�=�RETURNED�TELFMS�STATUS ‰BRA‡ASGN17*œFINISH�PROCESSING**ˆDEVICE�ASSIGNMENT*2RAT20„MOVE.L‚LUTDCB(A6,D6.L),D5‚SET�UP�DCB�POINTER%‰MOVE.B‚LUTCAP(A6,D6.L),D1‚PICK�UP�AP3‰BSR…MAPAP�Return�with�requested�protection�values.!*¤D3�=�read�protection�requested."*¤D4�=�write�protection�requested.)*¤$FFFF,exclusive�$0001,public�$0000 ,noneO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/83.*ˆMOVE.W‚DCBATT(A6,D5.L),D1‚PICK�UP�ATTRIBUTES-‰MOVE.L‚DCBATT(A6,D5.L),D1‚PICK�UP�ATTRIBUTES *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰TST.WƒD3’READ�?‰BNE.SƒRAT30�YES#‰BCLRƒ#DATRED,D1‹NO,�RESET�READ�BITRAT30„TST.WƒD4’WRITE�?‰BNE.SƒRAT40�YES$‰BCLRƒ#DATWRT,D1‹NO,�RESET�WRITE�BIT,RAT40„MOVE.W‚D1,FHSWCD(A5)‡SET�UP�ATTRIBUTESO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/7/83 ‰MOVE.L„D5,A68*ˆMOVE.W‚DCBLEN(A6,D5.L),FHSLRL(A5)‚SET�UP�RECORD�LENGTH2‰MOVE.W‚DCBLEN(A6),FHSLRL(A5)‡SET�UP�RECORD�LENGTH6*ˆMOVE.L‚DCBSIZ(A6,D5.L),FHSSIZ(A5)‚SET�UP�DEVICE�SIZE0‰MOVE.L‚DCBSIZ(A6),FHSSIZ(A5)‡SET�UP�DEVICE�SIZE ‰SUB.L…A6,A6 *°BKM�7/7/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5‰MOVE.B‚DCBFLG(A6,D5.L),FHSOPT(A5)‚SET�UP�DEVICE�CODE5‰MOVE.L‚DCBAID(A6,D5.L),FHSVOL(A5)‚SET�UP�DEVICE�NAME‰LEA…MOVBLK(A2),A0+‰MOVE.L‚A5,MVSADD(A0)‡SET�UP�SOURCE�ADDRESS2‰MOVE.L‚EVURA0(A4),MVDADD(A0)�SET�UP�DEST.�ADDRESS2‰MOVE.W‚#FHSBLN,MVLENG+2(A0)‚SET�UP�LENGTH�TO�MOVE%‰ERQ.MOVELL‚(A0)ŒMOVE�ATTRIBUTES�DATA ‰BSRNE…FATAL*œKILL�SYSTEM�IF*¦ATTRIBUTE�MOVE�LOGICAL�FAILED‰BSR…SIGLUTŽRELEASE�LUT�LIST‰BRA…OKSTA�RETURN‰PAGE**ˆFETCH�DIRECTORY�EXECUTOR**ˆREV.�1.00�8/1/79�(JIM�SMITH)*"*�THE�FETCH�DIRECTORY�IS�A�COMMAND$*�DIRECTED�TO�A�BULK�STORAGE�LOGICAL*�PROPERTY�ONLY.***ˆENTRY:�A4�=�ASQ�MESSAGE*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME*ŽD6�=�SOURCE�LUN�POINTER*ŽD7�=�SOURCE�LUT�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�*�*�*�*�*ƒR�P *�A�*‡P�P�P�P****+FDIR…TST.WƒFHSGEN(A5)ŠRESERVED�FIELD�ZERO�?‰BNE…ERRCMDŽNO�,�ERROR ‰CLR.LƒD1,‰MOVE.B‚FHSLUN(A5),D1‡SET�UP�LUN�FOR�LUNLOOK2‰BSR…LUNLOKŽLook�up�LUN.‚Returns�LUN�pointer�in�D6'*¤D0�=�0,normal�1,active�-1,invalid�LUN‰TST.LƒD0’TEST�RETURN‰BLE…ERRLUNŽLUN�NOT�ACTIVE‰MOVE.B‚LUTCSF(A6,D6.L),D1$‰BTSTƒ#LUSFDV,D1‹DEVICE�ASSIGNMENT�?‰BNE…ERRCMDŽINVALID�COMMAND,‰MOVE.B‚LUTCAP(A6,D6.L),D1„PICK�UP�AP�IN�LUN3‰BSR…MAPAP�Return�with�requested�protection�values.!*¤D3�=�read�protection�requested."*¤D4�=�write�protection�requested.)*¤$FFFF,exclusive�$0001,public�$0000,none‰TST.WƒD3’READ�PERMISSION�?‰BEQ…ERRAPSŽNO,�EROROR‰BSR…TELFMSŽNOT�MUCH�TO�DO‰BNE.SƒFDIR10ŽERROR‰BSR…SIGLUTŽRELEASE�LUT�LOCK‰BRA…OKSTA�RETURNFDIR10:‰MOVE.L„D0,-(A7)*œD0�=�RETURNED�TELFMS�STATUS ‰BRA‡ASGN17*œFINISH�PROCESSING‰PAGE*!*ˆFETCH�DEVICE�MNEMONICS�EXECUTOR* *ˆREV.�1.00�12/15/79�(JIM�SMITH)*$*�THIS�ROUTINE�WILL�RETURN�THE�ASCII#*�IDENTIFIERS�FOR�VOLUME�AND�DEVICE*�NAMES.***ˆENTRY:�A4�=�ASQ�MESSAGE*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D7�=�LUT�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�*�*�*�*…R�P*�A�*�*ƒ*�P�P�P�P****)FDVMN„TST.Lƒ(A7)+�FIX�STACK,�DON'T�RETURN‰BSR…SIGLUTŽDONT�NEED�LUT%‰MOVE.W‚FHSOPT(A5),D1‡PICK�UP�OPTIONS.‰CMP.Wƒ#FOPFRA,D1ŠFETCH�RANDOM�ACCESS�DEVICES?‰BEQ.S�FDV10‘YES,‰CMP.Wƒ#FOPFIN,D1ŠFETCH�INTERACTIVE�DEVICES?‰BEQ.SƒFDV20�YES(‰CMP.Wƒ#FOPFPR,D1ŠFETCH�PRINTER�DEVICES?‰BEQ.SƒFDV20�YES'‰MOVE.L‚#FSTAIF,D1ŠNO,�INVALID�FUNCTION2‰BSR…PUTSTAŽMove�status�(D1)�to�actual�user's�P.B.3‰BRA…SETCC�Set�condition�codes,�acknowledge�service)*¤request,�and�return�from�event�service.FDV10„CLR.LƒD6‰BSR…TELFMSŽNOTIFY�FMS‰BEQ…SETARQŽRETURN�FROM�EVENT‰CMP.B…#RTCDTASK,D0 ‰BNE.S…FDV12*œBRANCH�IF�FMS�DOES�EXIST ‰BSR‡ERCOSNX *œSET�UP�FMS�DOES�NOT�EXIST�CODE ‰BRA.S…FDV14*œCONTINUE�PROCESSINGFDV12:‰BSR…ERRFMSŽERRORFDV14:2‰BSR…PUTSTAŽMove�status�(D1)�to�actual�user's�P.B.3‰BRA…SETCC�Set�condition�codes,�acknowledge�service)*¤request,�and�return�from�event�service.**ˆFETCH�FOR�DEVICES*FDV20„CLR.LƒBYTE(A2)5‰LEA…MOVBLK(A2),A0ŠSET�UP�POINTER�TO�MOVE�PARAM�BLOCK/‰MOVE.W‚#FDVLEN,MVLENG+2(A0)‚SET�UP�MOVE�LENGTH '‰LEA…FDMBUF(A2),A3ŠBUILD�BUFFER�POINTER+‰MOVE.L‚A3,MVSADD(A0)‡SET�UP�SOURCE�ADDRESS2‰MOVE.L‚FHSPTR(A5),MVDADD(A0)�SET�UP�DEST.�ADDRESS‰CLR.LƒD3’SET�BUFFER�COUNTER‰MOVE.L‚IOCOMS(A2),A1‰MOVE.L‚SVTDCB(A1),A1%‰MOVE.W‚FHSOPT(A5),D2‡PICK�UP�OPTIONSFDV30„MOVE.L‚A1,D5�LAST�DCB�?‰BEQ.SƒFDV80�YESO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/835*ˆMOVE.W‚DCBATT(A6,D5.L),D1‚PICK�UP�DEVICE�ATTRIBUTES4‰MOVE.L‚DCBATT(A6,D5.L),D1‚PICK�UP�DEVICE�ATTRIBUTES *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<,‰CMP.W‚#FOPFIN,D2‹WANT�INTERACTIVE�DEVICES�?‰BNE.SƒFDV40�NO/‰BTSTƒ#DATIND,D1‹YES,�THIS�DEVICE�INTERACTIVE�?‰BEQ.SƒFDV70�NO"‰ADD.Wƒ#1,BYTE+2(A2)‡YES,�COUNT�IT ‰BRA.SƒFDV50&FDV40„BTSTƒ#DATPRT,D1‹THIS�A�PRINTER�?‰BEQ.SƒFDV70�NO"‰ADD.Wƒ#1,BYTE+2(A2)‡YES,�COUNT�IT)FDV50„CMP.LƒFHSLEN(A5),D3‡END�OF�BUFFER�?‰BCC.SƒFDV70�YES$‰ADD.Wƒ#1,BYTE(A2)‰NO,�INCR.�COUNTER9‰MOVE.L‚DCBAID(A6,D5.L),FDVDEV(A3)�SET�UP�DEVICE�MNEMONIC9‰MOVE.B‚DCBFLG+1(A6,D5.L),FDVSTS(A3)‚SET�UP�DEVICE�STATUS,‰ERQ.MOVELL‚(A0)ŒMOVE.�TO�REQUESTOR'S�BUFFER‰BEQ.SƒFDV60�OK%FDV57„MOVE.L‚#FSTAADD,D1‰BUFFER�ERROR2‰BSR…PUTSTAŽMove�status�(D1)�to�actual�user's�P.B.3‰BRA…SETCC�Set�condition�codes,�acknowledge�service)*¤request,�and�return�from�event�service.+FDV60„ADD.Wƒ#FDVLEN,D3ŠINCR.�BUFFER�COUNTER-‰ADD.Lƒ#FDVLEN,MVDADD(A0)‚BUMP�BUFFER�POINTER8FDV70„MOVE.L‚DCBPTR(A6,D5.L),A1‚PICK�UP�NEXT�DCB�POINTER ‰BRA.SƒFDV30FDV80:‰LEA‡BYTE(A2),A6‰MOVE.L„A6,MVSADD(A0)*œA6�=�SOURCE�ADDRESS ‰SUB.L…A6,A6 *œA6�=�ZERO2‰MOVE.L‚EVURA0(A4),MVDADD(A0)�SET�UP�DEST.�ADDRESS‰ADD.Lƒ#FHSLEN,MVDADD(A0)%‰MOVE.W‚#4,MVLENG+2(A0)‡SET�UP�LENGTH#‰ERQ.MOVELL‚(A0)ŒUPDATE�RETURN�INFO‰BNE.SƒFDV57�ERROR ‰BRA…SETCZ‰PAGE**ˆCHANGE�LOGICAL�UNIT�EXECUTOR**ˆREV.�1.00‚6/15/79�(JIM�SMITH)*'*�THE�LU�ASSIGNMENT�TO�BE�SWITCHED�MUST)*�BE�IN�A�DORMANT�STATE�(NO�I/O�PENDING).*$*�THE�LUT�LIST�IS�LOCKED�UPON�ENTRY.**�THIS�COMMAND�HAS�TWO�OPTIONS: *�-�SEND�LU*�-�RECEIVE�LU**ˆENTRY:�A4�=�ASQ�MESSAGE*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME*ŽD6�=�SOURCE�LUN�POINTER*ŽD7�=�SOURCE�LUT�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�*�*�*�*�*ƒR�P *�A�*‡P�P�P�P**O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*)*CHGLUAƒTST.LƒFHSTSK(A5)ŠTASK�ID�PASSED�?*ˆBNE.SƒCHG10�YES>*ˆMOVE.L‚EVUTSK(A4),FHSTSK(A5)‚NO,�DEFAULT�TO�REQUESTOR'S�TASK**ˆMOVE.L‚EVUSES(A4),FHSSES(A5)…AND�SESSION *ˆBRA.S…CHG20)*CHG10„TST.L…FHSSES(A5)ŠCHECK�SESSION�NR.*ˆBNE.S…CHG15�SESSION�INCLUDED6*ˆMOVE.L„EVUSES(A4),FHSSES(A5)�DEFAULT�TO�REQ.�SESSION*ˆBRA.S…CHG20�CONTINUE*CHG15„MOVE.L‚FHSSES(A5),D1$*ˆCMP.LƒEVUSES(A4),D1‡SAME�SESSION�?*ˆBEQ.SƒCHG20�YES"*ˆMOVE.B‚EVUTIN(A4),D1‡PICK�UP�TIN*ˆBTSTƒ#EVTNOS,D1‹SYSTEM�TASK�?*ˆBEQ…ERRTSKŽNO,�ERROR�!*CHG20„LEA…FHSTSK(A5),A0*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*%*ˆIf�parameter�block�task�name�=�zero*�then0*’use�the�task-id�from�the�event�parameter�block*’get�task�attributes*.*ˆIf�parameter�block�session�number�is�missing*�then7*’force�the�session�number�equal�to�the�requesting�task*“session�number*’edit�for�real�time�task*B*ˆIf�parameter�block�session�number�is�same�as�the�requesting�task*Œthen*’edit�for�real�time�task*(*ˆIf�requesting�task�is�a�real�time�task*Œthen*’get�task�attributes*)*ˆIf�requesting�task�is�not�a�system�task*�then*’log�error�condition*(*ˆIf�requesting�task�is�a�real�time�task*�then*’get�task�attributes*�else *’get�task�id**’If�get�task�id�error*—then*œlog�error�condition*—else$*œset�tcb�address�in�task�name�field*ˆget�task�attributes***CHGLUA:‰TST.L…FHSTSK(A5) ‰BNE.S…CHG10*œBRANCH�IF�TASK�NAME�SPECIFIED‰MOVE.L„EVUTSK(A4),FHSTSK(A5)‰MOVE. L„EVUSES(A4),FHSSES(A5),*œSET�TASK�ID�TO�THAT�CONTAINED�IN�THE�EVENT ‰BRA.S…CHG20*œGET�TASK�ATTRIBUTESCHG10:‰MOVE.B„EVUTIN(A4),D1%*œD1.B�=�TRAP�INSTRUCTION�INFORMATION‰TST.L…FHSSES(A5) ‰BNE.S…CHG15-*œBRANCH�IF�PARAMETER�BLOCK�SESSION�NUMBER�IS *œPRESENT‰MOVE.L„EVUSES(A4),FHSSES(A5)/*œFORCE�SESSION�NUMBER�IN�PARAMETER�BLOCK�TO�BE*œSAME�AS�REQUESTORS ‰BRA.S…CHG18*œEDIT�FOR�REAL�TIME�TASKCHG15:‰MOVE.L„EVUSES(A4),D0(*œD0�=�SESSION�NUMBER�OF�REQUESTING�TASK‰CMP.L…FHSSES(A5),D0 ‰BEQ.S…CHG18-*œBRANCH�IF�REQUSTING�TASK�SESSION�NUMBER�AND)*�PARAMETER�BLOCK�SESSION�NUMBER�ARE�SAME*œEDIT�FOR�REAL�TIME�TASK‰BTST†#EVTNRTT,D1 ‰BNE.S…CHG20-*œBRANCH�IF�REQUSTING�TASK�IS�A�REALTIME�TASK*œGET�TASK�ATTRIBUTES‰BTST†#EVTNOS,D1 ‰BEQ‡ERRTSK.*œBRANCH�IF�REQUESTING�TASK�IS�NOT�SYSTEM�TASKCHG18:‰BTST†#EVTNRTT,D1 ‰BNE.S…CHG20*œBRANCH�IF�REAL�TIME�TASK*œGET�TASK�ATTRIBUTES‰LEA‡GPBUFR(A2),A0‰MOVE.L„FHSTSK(A5),A1‰MOVE.L„FHSTSK+4(A5),D0&*œESTABLISH�PARAMETERS�FOR�GET�TASK�ID"*œA0�=�GET�TASK�ID�PARAMETER�BLOCK*œA1�=�TASK�NAME*œD0�=�TASK�SESSION�NUMBER ‰BSR�GETTSKID*œOBTAIN�TASK�ID ‰BNE‡ERRTSK*œBRANCH�IF�ERROR‰MOVE.L„A0,FHSTSK(A5)$*œSET�TCB�ADDRESS�IN�PARAMETER�BLOCKCHG20:‰LEA‡FHSTSK(A5),A0!*œA0�=�ADDRESS�OF�PARAMETER�BLOCK*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*"‰ERQ.TSKATTR‚(A0)‹VALIDATE�TASK�ID‰BNE…ERRTSKŽERROR%‰MOVE.L‚A0,TSKATT(A2)‡SAVE�ATTRIBUTES ‰CLR.LƒD1+‰MOVE.B‚FHSLUN(A5),D1‡SET�UP�LUN�FOR�LUNLOK2‰BSR…LUNLOKŽLook�up�LUN.‚Returns�LUN�pointer�in�D6'*¤D0�=�0,normal�1,active�-1,invalid�LUN$‰MOVE.W‚FHSOPT(A5),D1‡PICK�UP�OPTION-‰AND.Wƒ#FOPRLU,D1ŠIS�THIS�SEND�LOGICAL�UNIT�?‰BNE…CHG50�NO,�RECEIVE�LU**ˆSEND�LU�ASSIGNMENT*‰TST.LƒD0’TEST�LUN‰BEQ…ERRLUNŽLU�NOT�ASSIGNED‰BMI…ERRLUNŽINVALID�LUN-‰MOVE.B‚LUTCSF(A6,D6.L),D1„PICK�UP�LUN�STATUS‰BTSTƒ#LUSFIO,D1‹I/O�PENDING�?‰BNE…ERRLUNŽYES,�ERROR ‰CLR.LƒD1$‰MOVE.W‚FHSOPT(A5),D1‡PICK�UP�OPTION ‰AND.Wƒ#FOPKEP,D1ŠKEEP�BIT�SET�?‰BEQ.SƒCHG40�NO,‰MOVE.B‚LUTCAP(A6,D6.L),D1„PICK�UP�AP�IN�LUN3‰BSR…MAPAP�Return�with�requested�protection�values.!*¤D3�=�read�protection�requested."*¤D4�=�write�protection�requested.)*¤$FFFF,exclusive�$0001,public�$0000,none$CHG30„TST.WƒD4’EXCLUSIVE�WRITE�SET�?‰BMI…ERRAPSŽYES�CAN'T�SWITCH‰TST.WƒD3’EXCLUSIVE�READ�?‰BMI…ERRAPSŽYES�CAN'T�SWITCH2CHG40„MOVE.L‚TSKATT(A2),D1‹PICK�UP�TASK�ATTRIBUTES%‰AND.Lƒ#CTATST,D1ŠDEST.�SYSTEM�TASK�?‰BEQ.SƒCHG42�NO‰MOVE.B‚EVUTIN(A4),D1%‰BTSTƒ#EVTNOS,D1‹SOURCE�SYSTEM�TASK�?‰BEQ…ERRCMDŽNO,�ERROR*CHG42„MOVE.L‚D6,D3�SAVE�SOURCE�LUN�POINTER%‰MOVE.L‚D7,D4�SAVE�SOURCE�LUT�POINTER)‰LEA…FHSTSK(A5),A0‡SET�UP�TASK�ID�POINTER&‰BSR…LUTLOKŽLOOK�UP�LUT�FOR�DEST.�TASK‰TST.LƒD0’TEST�LUT‰BEQ.SƒCHG45�FOUND�HIM(‰MOVE.L‚TSKATT(A2),D1‹SET�UP�USER�NUMBER"‰SWAP„D1’MUST�BE�IN�LOW�ORDER�BITS"‰LEA…FHSTSK(A5),A0‡TASK�ID�POINTER‰BSR…LUTBLDŽBUILD�LUT‰BNE…ERRBUFŽBUFFER�FULL�ERRORCHG45„CLR.LƒD1 ‰MOVE.B‚FHSLUB(A5),D1‡SET�UP�LUN2‰BSR…LUNLOKŽLook�up�LUN.‚Returns�LUN�pointer�in�D6'*¤D0�=�0,normal�1,active�-1,invalid�LUN‰TST.LƒD0’TEST�LU‰BMI…ERRLUNŽLUN�INVALID�-�ERROR‰BNE…ERRASGŽLU�ACTIVE‰TST.BƒFHSLUB(A5)ŠLU�ZERO�?‰BNE.SƒCHG47�NO-‰MOVE.L‚TSKATT(A2),D1‹PICK�UP�TASK�ATTRIBUTES‰AND.Lƒ#CTATST,D1ŠSYSTEM�TASK�?‰BEQ…ERRLUNŽNO,�ERROR2CHG47„MOVE.L‚0(A6,D3.L),0(A6,D6.L)ƒSWITCH�LUN�DATA.‰MOVE.L‚4(A6,D3.L),4(A6,D6.L)ƒAND�DCB�POINTER.7‰ADD.Bƒ#1,LUTCAS(A6,D7.L)„INCREMENT�CURRENT�ASSIGNMENTS ‰CLR.LƒD1$‰MOVE.W‚FHSOPT(A5),D1‡PICK�UP�OPTION ‰AND.Wƒ#FOPKEP,D1ŠKEEP�BIT�SET�?‰BNE…CHG60�YES*0*ˆNOW�CLOSE�SOURCE�TASK�LUN�-�FOR�SEND�LU�OPTION*‰EXG…D3,D6�SWITCH�LUT�POINTERS‰EXG…D4,D7�FOR�CLOSE�LUN‰BSR…CLUN�SUBROUTINE�CALLING‰EXG…D3,D6�SEQUENCE�AND�SWITCH‰EXG…D4,D7�BACK�FOR�WRAP-UP ‰BRA…CHG60**ˆRECEIVE�LU�ASSIGNMENT*CHG50„TST.LƒD0’TEST�LUN‰BMI…ERRLUNŽLUN�INVALID�-�ERROR‰BNE…ERRASGŽLU�ACTIVE‰TST.BƒFHSLUN(A5)ŠLU�ZERO�?‰BNE.SƒCHG56�NO!‰MOVE.B‚EVUTIN(A4),D1‡PICK�UP�TIN‰BTSTƒ#EVT NOS,D1‹SYSTEM�TASK�?‰BEQ…ERRLUNŽNO,�ERROR&CHG52„MOVE.B‚EVUTIN(A4),D1ˆPICK�UP�TIN‰BTSTƒ#EVTNOS,D1‹SYSTEM�TASK�?‰BEQ…ERRCMDŽNO,�NOT�ALLOWED)CHG56„MOVE.L‚D6,D3�SAVE�DEST.�LUN�POINTER$‰MOVE.L‚D7,D4�SAVE�DEST.�LUT�POINTER)‰LEA…FHSTSK(A5),A0‡SET�UP�TASK�ID�POINTER'‰BSR…LUTLOKŽLOOK�UP�LUT�FOR�SOURCE�TASK‰TST.LƒD0’TEST�LUT‰BEQ.SƒCHG57�FOUND�HIM(‰MOVE.L‚TSKATT(A2),D1‹SET�UP�USER�NUMBER"‰SWAP„D1’MUST�BE�IN�LOW�ORDER�BITS"‰LEA…FHSTSK(A5),A0‡TASK�ID�POINTER‰BSR…LUTBLDŽBUILD�LUT‰BNE…ERRBUFŽBUFFER�FULL�ERRORCHG57„CLR.LƒD1 ‰MOVE.B‚FHSLUB(A5),D1‡SET�UP�LUN2‰BSR…LUNLOKŽLook�up�LUN.‚Returns�LUN�pointer�in�D6'*¤D0�=�0,normal�1,active�-1,invalid�LUN‰TST.LƒD0’TEST�LUN%‰BEQ…ERRLUNŽLU�NOT�ASSIGNED�-�ERROR�! ‰BMI…ERRLUNŽINVALID�LU�-�ERROR�!-‰MOVE.B‚LUTCSF(A6,D6.L),D1„PICK�UP�LUN�STATUS‰BTSTƒ#LUSFIO,D1�I/O�PENDING�?‰BNE…ERRLUN�YES,�ERROR ‰BTSTƒ#LUSFCP,D1‹CLOSE�PENDING�?‰BNE…ERRLUNŽYES,�ERROR!‰BTSTƒ#LUSFAS,D1‹ASSIGN�PENDING�?‰BNE…ERRLUNŽYES,�ERROR.‰MOVEM.LƒD3-D4,-(A7)‰SAVE�LUN�AND�LUT�POINTERS ‰CLR.LƒD1$‰MOVE.W‚FHSOPT(A5),D1‡PICK�UP�OPTION ‰AND.Wƒ#FOPKEP,D1ŠKEEP�BIT�SET�?‰BEQ.SƒCHG57AŽNO,‰MOVE.B‚LUTCAP(A6,D6.L),D1„PICK�UP�AP�IN�LUN3‰BSR…MAPAP�Return�with�requested�protection�values.!*¤D3�=�read�protection�requested."*¤D4�=�write�protection�requested.)*¤$FFFF,exclusive�$0001,public�$0000,none‰TST.WƒD4’EXCLUSIVE�WRITE�?‰BMI…ERRAPSS�YES�CAN'T�SWITCH‰TST.WƒD3’EXCLUSIVE�READ�?‰BMI…ERRAPSS�YES�CAN'T�SWITCH7CHG57AƒMOVEM.Lƒ(A7)+,D3-D4ŠRESTORE�LUN�AND�LUT�POINTERS-‰MOVE.L‚0(A6,D6.L),0(A6,D3.L)ƒSWITCH�LUN�DATA-‰MOVE.L‚4(A6,D6.L),4(A6,D3.L)ƒAND�DCB�POINTER7‰ADD.Bƒ#1,LUTCAS(A6,D4.L)„INCREMENT�CURRENT�ASSIGNMENTS ‰CLR.LƒD1$‰MOVE.W‚FHSOPT(A5),D1‡PICK�UP�OPTION ‰AND.Wƒ#FOPKEP,D1ŠKEEP�BIT�SET�?‰BNE.SƒCHG58�YES*3*ˆNOW�CLOSE�SOURCE�TASK�LUN�-�FOR�RECEIVE�LU�OPTION*"‰BSR…CLUN�INITIALIZE�THE�LUN�ENTRY!CHG58„EXG…D3,D6�SWITCH�SOURCE�AND ‰EXG…D4,D7�DESTINATION�POINTERS.* *ˆWRAP�IT�UP*0CHG60„MOVE.B‚LUTCSF(A6,D6.L),D1„PICK�UP�LUN�FLAG$‰BTSTƒ#LUSFDV,D1‹DEVICE�ASSIGNMENT�?‰BEQ.SƒCHG70�NO,�NOTIFY�FMS%‰MOVE.W‚FHSOPT(A5),D1‡PICK�UP�OPTIONS ‰AND.Wƒ#FOPKEP,D1ŠKEEP�BIT�SET�?‰BEQ.SƒCHG64�NO#‰BSR…WAITDCB�GET�ACCESS�TO�DCB�LIST-‰MOVE.L‚LUTDCB(A6,D6.L),D5‚SET�UP�DCB�POINTER4‰MOVE.B‚LUTCAP(A6,D6.L),D1‚PICK�UP�ACCESS�PERMISSION3‰BSR…MAPAP�Return�with�requested�protection�values.!*¤D3�=�read�protection�requested."*¤D4�=�write�protection�requested.)*¤$FFFF,exclusive�$0001,public�$0000,none‰TST.WƒD3’READ�PERMISSION�?‰BEQ.SƒCHG62�NO5‰ADD.Wƒ#1,DCBRNT(A6,D5.L)‚YES,�BUMP�READ�COUNT�IN�DCB!CHG62„TST.WƒD4’WRITE�PERMISSION�?‰BEQ.SƒCHG63�NO6‰ADD.Wƒ#1,DCBWNT(A6,D5.L)‚YES,�BUMP�WRITE�COUNT�IN�DCB!CHG63„BSR…SIGDCBŽRELEASE�DCB�LIST!CHG64„BSR…SIGLUTŽRELEASE�LUT�LOCK‰BRA…OKSTA�GO�SET�GOOD�RETURN* *ˆNOTIFY�FMS*(CHG70„BSETƒ#LUSFAS,D1‹SET�ASSIGN�PENDING,‰MOVE.B‚D1,LUTCSF(A6,D6.L)„UPDATE�LUN�STATUS*‰MOVE.W‚FHSOPT(A5),D1‡PICK�UP�USER�OPTIONS‰AND.Wƒ#FOPRLU,D1ŠRECEIVE�LU?‰BEQ.SƒCHG72�NO‰BSR…TELFMSŽYES, ‰BRA.SƒCHG74CHG72„EXG…D3,D6 ‰EXG…D4,D7 ‰BSR…TELFMS ‰EXG…D3,D6 ‰EXG…D4,D7CHG74„BNE.SƒCHG75�ERROR‰BSR…SIGLUTŽRELEASE�LUT�LOCK‰BRA…OKSTA�RETURNCHG75:‰MOVE.L„D0,-(A7)*œD0�=�RETURNED�TELFMS�STATUS%‰MOVE.W‚FHSOPT(A5),D1‡PICK�UP�OPTIONS‰AND.Wƒ#FOPKEP,D1ŠKEEP�?‰BNE.SƒCHG80�YES*‰MOVE.L‚0(A6,D6.L),0(A6,D3.L)ƒSET�LUN�BACK*‰MOVE.L‚4(A6,D6.L),4(A6,D3.L)ƒSET�LUN�BACK,‰ADD.Bƒ#1,LUTCAS(A6,D4.L)„SET�LUT�COUNT�BACKCHG80„BSR…CLUN�CLOSE�DEST.�LUN ‰BRA‡ASGN17*œFINISH�PROCESSING‰PAGE**ˆFETCH�DEFAULT�VOLUME****,FVOLDEF�TST.L„(A7)+�ADJ.�STACK,�DON'T�RETURN,ˆBRA†VOLDEFŽLOOKS�JUST�LIKE�LIVEL�80�COMMANDˆPAGE*(*ˆLEVEL�TWO�COMMAND�HANDLER�-�PRIVILEGED* *ˆREV.�1.00‚11/10/80�(JIM�SMITH)***�THIS�ROUTINE�WILL�SCAN�THE�COMMAND�FIELD¶ ŸM¨N°I¸KÀFÈIÐMØRàBè8ð1øFFJP[ A(Z0P8S@A 2*�OF�THE�REQUESTOR'S�FHCB�AND�MAP�THE�BIT�POSITION-*�TO�A�COMMAND�EXECUTOR�FOR�LEVEL�2�COMMANDS.*!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME**ˆUSING:ƒ0�1�2�3�4�5�6�7*�Dƒ*�* *�A�*‡P�P�P�P****-LEVEL2ƒCMP.Bƒ#PBCLN,EVUPSZ(A4)ƒPB�LENGTH�OK�?‰BLT…ERRPRMŽNO,�ERROR‰CLR.LƒD1’SET�UP�STATUS�CODE5‰BSR…PUTSTAŽUpdate�status�(D1)�in�actural�user's�P.B.%‰CMP.Bƒ#RTCDADR2,D0ŠADDRESS�INVALID�?‰BEQ…ERRPRMŽYES,�NOT�WRITABLE‰MOVE.L‚#7,D1�SET�BIT�POINTER-‰LEA…LEV2EX(PC),A0‰LEVEL�2�TABLE�OF�EXECUTORS%‰MOVE.W‚FHSCMD(A5),D2‡PICK�UP�COMMAND‰AND.Wƒ#$FF,D2�ISOLATE�COMMAND LEV210‚BCLR„D1,D2�THIS�BIT�SET�?‰BEQ.SƒLEV220�NO%‰TST.WƒD2’MORE�THAN�1�CMD�REQUESTED�?‰BNE…ERRCODŽYES,�ERROR‰TST.Lƒ(A0)�VALID�EXECUTOR�?‰BEQ…ERRCODŽNO,�COMMAND�ERROR‰MOVE.L‚(A0),A0"‰JMP…(A0)�JUMP�TO�COMMAND�EXECUTOR%LEV220‚TST.Lƒ(A0)+�BUMP�TABLE�POINTER#‰SUB.Lƒ#1,D1�BUMP�BIT�POINTER�(L2R)#‰BMI…ERRCODŽREACHED�LIMIT�-�ERROR�!‰BRA.SƒLEV210�CONTINUE PAGE**‰SPOOLER�COMMAND*SPLCMD‚CLR.L�D6 ˆBSR�SIGLUT"ˆBSR�TELSPL�QUEUE�EVENT�TO�SPOOLERˆBEQ�SETARQ�GOOD�RETURN#ˆMOVE.L…#FSTAIF,D1”INVALID�FUNCTION2‰BSR…PUTSTAŽMove�status�(D1)�to�actual�user's�P.B.3‰BRA…SETCC�Set�condition�codes,�acknowledge�service)*¤request,�and�return�from�event�service.‰PAGE*'*ˆLEVEL�80�COMMAND�HANDLER�-�PRIVILEGED**ˆREV.�1.00‚6/15/79�(JIM�SMITH)***�THIS�ROUTINE�WILL�SCAN�THE�COMMAND�FIELD2*�OF�THE�REQUESTOR'S�FHCB�AND�MAP�THE�BIT�POSITION.*�TO�A�COMMAND�EXECUTOR�FOR�LEVEL�80�COMMANDS.*!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME**ˆUSING:ƒ0�1�2�3�4�5�6�7*�Dƒ*�* *�A�*‡P�P�P�P**M*�Validate�parameter�block�length.‚IF�invalid�BLT�ERRPRM�(error�#FSTAIP�$14).<*�Validate�system�task.‚If�not�BRA�ERRCOD�(error�#FSTAIF�2).J*�Validate�valid�address�for�return�code�via�PUTSTA.‚If�invalid�BEQ�ERRPRM*…(error�#FSTAIP�$14)G* From LEV80EX determine the appropriate command processing routine and *…jump�to�it.*.LEVEL80‚CMP.Bƒ#PBCLN,EVUPSZ(A4)ƒPB�LENGTH�OK�?‰BLT…ERRPRMŽNO,�ERROR(‰MOVE.B‚EVUTIN(A4),D1‡PICK�UP�EVENT�CODE$‰BTSTƒ#EVTNOS,D1‹O.S.�TASK�BIT�SET�?‰BEQ…ERRCODŽNO,�NOT�ALLOWED‰CLR.LƒD1’SET�UP�STATUS�CODE3‰BSRƒPUTSTA�Set�status�(D1)�into�actual�user's�P.B.%‰CMP.Bƒ#RTCDADR2,D0ŠADDRESS�INVALID�?‰BEQ…ERRPRMŽYES,�NOT�WRITABLE‰MOVE.L‚#7,D1�SET�BIT�POINTER/‰LEA…LEV80EX(PC),A0‰LEVEL�80�TABLE�OF�EXECUTORS%‰MOVE.W‚FHSCMD(A5),D2‡PICK�UP�COMMAND‰AND.Wƒ#$FF,D2�ISOLATE�COMMAND!LEV8010‚BCLR„D1,D2�THIS�BIT�SET�?‰BEQ.SƒLEV8020�NO%‰TST.WƒD2’MORE�THAN�1�CMD�REQUESTED�?‰BNE…ERRCODŽYES,�ERROR‰TST.Lƒ(A0)�VALID�EXECUTOR�?‰BEQ…ERRCODŽNO,�COMMAND�ERROR‰MOVE.L‚(A0),A0"‰JMP…(A0)�JUMP�TO�COMMAND�EXECUTOR&LEV8020‚TST.Lƒ(A0)+�BUMP�TABLE�POINTER#‰SUB.Lƒ#1,D1�BUMP�BIT�POINTER�(L2R)#‰BMI…ERRCODŽREACHED�LIMIT�-�ERROR�!‰BRA.SƒLEV8010�CONTINUE‰PAGE*,*ˆDEFAULT�VOLUME�EXECUTOR�(LEVEL�80�COMMAND)**ˆREV.�1.00‚6/15/79�(SMITH)*+*�THIS�IS�A�BULK�STORAGE�LOGICAL�COMMAND�TO!*�BE�PASSED�ON�TO�THE�FMS�MODULE.*!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER* *ˆEXIT:�SAME**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D *�A‰P�P�P�P*** Release the LUT resource.* Queue event to FMS.+* IF error in queueing event to to FMS THEN4*…BSRƒERRFMSƒ{Error�code�#FATAIE�$13�internal�error}:*…BSRƒPUTSTAƒ{Puts�error�code�in�caller's�parameter�block}A*…BRAƒSETCC„{Acknowledges�service�request�and�returns�from�event}*VOLDEFƒCLR.LƒD6‰BSR…SIGLUTŽRELEASE�LUT�LOCK‰BSR…TELFMSŽNOTIFY�FMS ‰BEQ…SETARQ*œBRANCH�IF�EVENT�QUEUED‰CMP.B…#RTCDTASK,D0‰BNE.S…VOLDEF10*œBRANCH�IF�FMS�TASK�EXIST ‰BSR‡ERCOSNX(*œSET�UP�CODES�FOR�FMS�TASK�NON-EXISTENT‰BRA.S…VOLDEF20*œCONTINUE�PROCESSING VOLDEF10:‰BSR…ERRFMSŽSET�ERROR�CODE VOLDEF20:2‰BSR…PUTSTAŽMove�status�(D1)�to�actual�user's�P.B. 3‰BRA…SETCC�Set�condition�codes,�acknowledge�service)*¤request,�and�return�from�event�service.‰PAGE**ˆEND-OF-TASK�EXECUTOR**ˆREV.‚1.00‚6/15/79�(JIM�SMITH)*"*�THIS�IS�A�CLEAN-UP�ROUTINE�FOR�A"*�TASK�WHO�HAS�GONE�TO�COMPLETION.*!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER* *ˆEXIT:�SAME*ŽD7�=�LUT�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�*�*�*‡*�R*�A�*�*…P�P�P�P****)EOTEX„LEA…EVUTSK(A4),A0‡LOAD�TASK�POINTER‰BSR…LUTLOKŽLOOK�UP�LUT‰TST.LƒD0’FIND�HIM�?‰BEQ.SƒEOT10�YES!‰BRA…SETCC�GO�ACKNOWLEDGE�REQUEST(EOT10„BSR…WAITLUT�GET�ACCESS�TO�LUT�LISTEOT15„LEA…LUTBEG(A6,D7.L),A1)‰MOVE.L‚A1,D6�SET�UP�ADDRESS�OF�FISRT�LUN/EOT20„TST.BƒLUTCAS(A6,D7.L)‡ANYTHING�ASSIGNED�?‰BEQ.SƒEOT50�NO,�CLEAN�UP1‰MOVE.B‚LUTCSF(A6,D6.L),D1„PICK�UP�STATUS�FOR�LUN‰BTSTƒ#LUSFAC,D1‹ACTIVE�?‰BNE.SƒEOT30�YES&‰ADD.Lƒ#LUTSEG,D6ŠNO,�BUMP�TO�NEXT�LUN/‰MOVE.B‚LUTMLU(A6,D7.L),D2„PICK�UP�MAXIMUM�LUNS*‰MULU„#LUTSEG,D2ŠCALCULATE�LENGTH�OF�TABLE‰LEA…LUTBEG(A6,D7.L),A1 ‰ADD.LƒD2,A1#‰CMP.LƒA1,D6�REACHED�END�OF�TABLE�?‰BLT.SƒEOT20�NO,�CONTINUE/‰BRA.SƒEOT50�YES,�SOMETHING�WRONG,�BUT�GO�AHEAD'EOT30„BSR…CLOS10ŽUPDATE�THE�LUT�AND�DCB‰BSR…CLUN�CLOSE�THE�LUN‰BRA.SƒEOT15�CONTINUEEOT50„BSR…WAITDCB�LOCK�DCB�LIST‰MOVE.L„IOCOMS(A2),A0)‰MOVE.L‚SVTDCB(A0),D5‡POINTER�TO�DCB�LIST ‰BEQ.SƒEOT603EOT55„CMP.LƒDCBBRK(A6,D5.L),D7‚BREAK�SERVICE�HERE�?‰BNE.SƒEOT57�NO$‰CLR.LƒDCBBRK(A6,D5.L)…YES,�CLEAR�IT,EOT57„MOVE.L‚DCBPTR(A6,D5.L),D5‚GET�NEXT�DCB‰BNE.SƒEOT55�CONTINUE!EOT60„BSR…SIGDCBŽRELEASE�DCB�LOCK‰BSR…LUTDELŽDELETE�LUT�ENTRY#‰CLR.LƒD6’CLEAR�LUN�POINTER�FOR�FMS#‰CLR.LƒD7’CLEAR�LUT�POINTER�FOR�FMS‰BSR…TELFMSŽYES,�NOTIFY�FMS"‰BEQ.SƒEOT70�OK,�RETURN�FROM�EVENT‰BSR…SIGLUTŽRELEASE�LUT�LIST‰BRA…SETCC�SOMETHING�WRONG�!!EOT70„BSR…SIGLUTŽRELEASE�LUT�LIST‰BRA…SETARQŽRETURN‰PAGE**ˆRETURN�FROM�EVENT**O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*,*RTNEVTƒADD.Lƒ#60,A7ŽADJUST�STACK�LIKE�RTNVT *ˆRTR™RETURN*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<* *ˆOK�STATUS*!OKSTA„CLR.LƒD1’SET�UP�RETURN�CODE ‰RTS™RETURN**ˆSET�CC�TO�ZERO*SETCZ„LEA…AKRBLK(A2),A0(‰MOVE.B‚#4,ACKCCD(A0)‡SET�ZERO�BIT�IN�CC**ˆACKNOWLEDGE�REQUEST**ˆA0�=�PARAM�BLOCK�POINTER*H* Set up and perform acknowledge service request sending back D0 (if not)*ƒEOT�noficication),�and�condition�codes.'* Branch to RTNEVT (return from event).*2ACKREQƒMOVE.L‚EVUTSK(A4),ACKTSK(A0)�SET�UP�TASK�ID,‰MOVE.L‚EVUSES(A4),ACKSES(A0)�SET�UP�SESSION6‰MOVE.B‚EVUTIN(A4),ACKTIN(A0)�SET�UP�TRAP�INST.�NUMBER>‰MOVE.W‚#AKOPSC+AKOPSD+AKOPRT,ACKOPT(A0)�SET�CC,�D0,�AND�START$‰CLR.LƒACKRD0(A0)ŠCLEAR�D0�PARAMETER&‰MOVE.B‚EVUTIN(A4),D2‡PICK�UP�TRAP�NO.$‰BTSTƒ#EVTNEOT,D2ŠEOT�NOTIFICATION�?‰BNE.SƒACKR10ŽYES,�SKIP�STATUS:‰MOVE.B‚FHSSTA(A5),ACKRD0+3(A0)�SET�STATUS�IN�D0�PARAMETER‰BEQ.SƒACKR10ŽSTATUS�OK‰MOVE.L‚#FHSTIN,D1 ‰ASL.B‚#3,D11‰MOVE.B‚D1,ACKRD0(A0)‡SET�TRAP�NUMBER�IN�D0�PARAMACKR10:‰LEA‡AKRBLK(A2),A0*œA0�=�PARAMETER�BLOCK�ADDRESS‰MOVE.L„#AKRQST,D0*œD0�=�DIRECTIVE�NUMBER‰TRAP†#1*œACKNOWLEDGE�REQUEST ‰BSRNE…FATAL*œKILL�SYSTEM�IF*¦AN�ACKNOWLEDGE�REQEST�FAILEDO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*!*ˆBRA…RTNEVTŽGO�RETURN�FROM�EVENT ‰BRA‡ASRTOP*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<**ˆUPDATE�STATUS**ˆENTRY:�D1�=�STATUS*N* Perform move logical to place status code into calling task parameter block.*,PUTSTAƒMOVE.B‚D1,BYTE(A2)‰SET�UP�STATUS�BYTE-‰MOVE.B‚D1,FHSSTA(A5)‡SET�STATUS�IN�DCB�BLOCK&‰LEA…MOVBLK(A2),A3ŠPARAM�BLOCK�ADDRESS‰CLR.LƒMVSTSK(A3)ŠSOURCE�TASK ‰CLR.LƒMVSSES(A3)ŠSOURCE�SESSION‰LEA‡BYTE(A2),A0‰MOVE.L„A0,MVSADD(A3)*œA0�=�SOURCE�ADDRESS&‰MOVE.W‚#1,MVLENG+2(A3)‡LENGTH�OF�XFER(‰MOVE.L‚EVUTSK(A4),MVDTSK(A3)�DEST.�TASK+‰MOVE.L‚EVUSES(A4),MVDSES(A3)�DEST.�SESSION 0‰MOVE.L‚EVURA0(A4),MVDADD(A3)�SET�UP�DEST.�ADDR.‰ADD.Lƒ#FHSSTA,MVDADD(A3)‰LEA‡MOVBLK(A2),A0*œA0�=�PARAMETER�BLOCK�ADDRESS‰MOVE.L„#MOVELL,D0*œD0�=�DIRECTIVE�NUMBER‰TRAP†#1 *œEXECUTE�MOVE�LOGICAL�DIRECTIVEPUTS10ƒRTS™RETURN* *ˆSET�USER/SERVER�REQUEST�STATUS*5SETARQƒERQ.DERQST�#AKRSER+FHSTINƒENABLE�SERVER�EVENTSO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*!*ˆBEQ‡RTNEVT„OK,RETURN�FROM�EVENT ‰BEQ‡ASRTOP*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<(‰CMP.B…#RTCDNFND,D0ˆIS�INTERCEPT�PRESENTO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*#*ˆBEQ‡RTNEVT„YES,�RETURN�FROM�EVENT ‰BEQ‡ASRTOP*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰BSR‡FATAL…NO,�ERROR*œKILL�SYSTEM�IF *œFAILED�TO�ENABLE�SERVER�EVENTS‰PAGE* *ˆTELSPL:*ˆSEND�EVENT�TO�SPOOLER*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>**TELSPLƒLEA‡QEVBLK(A2),A0*ˆMOVE.L„#SPLID,0(A0)*TELSPL:‰LEA‡GPBUFR(A2),A0*œA0�=�PARAMETER�BLOCK�ADDRESS‰MOVE.L„#SPLID,A1‰MOVE.L„#IOSESS,D0*œA1�=�TASK�NAME*œD0�=�TASK�SESSION�NUMBER ‰BSR‡GETTSKID*œGET�THE�SPOOLER�TASK-ID‰BNE.S…TELSPL10'*œBRANCH�IF�SPOOLER�TASK�DOES�NOT�EXIST‰MOVE.L„A0,QEVBLK(A2)‰MOVE.L„A1,QEVBLK+4(A2) *œSET�TASK-ID�IN�PARAMETER�BLOCK‰LEA‡QEVBLK(A2),A0*œA0�=�PARAMTETER�BLOCK�ADDRESSO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰MOVE.B„#SPLEVT,EVSUB(A2) ‰BRA‡TEL02*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* TELSPL10:‰RTS*œRETURN�TO�CALLERO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<* *ˆTELIOS:*ˆSEND�EVENT�TO�IOS* TELIOSƒEQU‡*!‰LEA‡QEVBLK(A2),A0‡SET�PB�POINTERO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>#*ˆMOVE.L„#IOSID,0(A0)ˆSET�UP�IOS�ID‰MOVE.L„IOSTSKID(A2),(A0)‰MOVE.L„IOSTSKID+4(A2),4(A0) *œSET�TASK�ID�IN�PARAMETER�BLOCKO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</‰MOVE.B„#CFGEVT,FMSUB(A2)ƒSET�UP�EVENT�SUB-CODE‰LEA‡FMSEVT(A2),A6*‰MOVE.L„A6,QEVPKT(A0)‚SET�UP�EVENT�POINTER ‰SUB.L…A6,A6 *œA6�=�ZERO(‰MOVE.L„D5,FMSDCB(A2)‡SET�UP�DCB�POINTER ‰BRA‡TEL05‰PAGE***ˆTHIS�IS�THE�COMMON�ERROR�ROUTINE�SECTION***ˆSET�CC�FOR�BAD�RETURN*"SETCCLƒBSR…SIGLUTŽRELEASE�LUT�LOCK.SETCC„LEA…AKRBLK(A2),A0ŠSET�CC�FOR�ACKNOWLEDGE‰CLR.BƒACKCCD(A0)ŠREQUEST."‰BRA…ACKREQŽGO�ACKNOWLEDGE�REQUEST*G* The following error labels are branched to when an error is detected."*ƒThey�typically�do�the�following:I*ƒ1.‚Move�the�appropriate�error�code�into�D1.�(Error�code�unique�to�entry *‡point).C*ƒ2.‚BRA�ERRCC�-�Here�the�LUT�semaphore�is�signaled�vie�BSR�SIGLUT.*ƒ3.‚RTS�to�calling�routine.**ˆI/O�SYSTEM�BUFFER�FULL*2ERRBUFƒMOVE.L‚#FSTASS,D1ŠSET�UP�RETURN�CODE�STATUS‰BRA.SƒERRCC�GO�SET�CC**ˆCOMMAND�ERROR*$ERRFCTƒBSR.SƒSIGDCBŽRELEASE�DCB�LOCK-ERRCMDƒMOVE.L‚#FSTAIF,D1ŠSET�UP�RETURN�STATUS‰BRA.SƒERRCC�GO�SET�CC-ERRCODƒMOVE.L‚#FSTAIF,D1ŠSET�UP�RETURN�STATUS3‰BSR…PUTSTAŽPut�status�(D1)�into�actual�user's�P.B.‰BRA.SƒSETCCLŽGO�SET�CC* *ˆLUN�ERROR*.ERRLUNƒMOVE.L‚#FSTAILU,D1‰SET�UP�RETURN�STATUS‰BRA.SƒERRCC�GO�SET�CC**ˆPROTECT�CODE�ERROR*#ERRPC„BSR.SƒSIGDCBŽRELEASE�DCB�LOCK-ERRPCSƒMOVE.L‚#FSTAPC,D1‹SET�UP�RETURN�STATUS‰BRA.SƒERRCC�GO�SET�CC**ˆACCESS�PERMISSION�ERROR*#ERRAP„BSR.SƒSIGDCBŽRELEASE�DCB�LOCK-ERRAPSƒMOVE.L‚#FSTAAP,D1ŠSET�UP�RETURN�STATUS‰BRA.SƒERRCC�GO�SET�CC*)ERRAPSS‚MOVEM.Lƒ(A7)+,D3-D4‰ADDJUST�STACK‰BRA.S…ERRAPS„GO�REPORT�ERROR* *ˆTASK�ERROR*-ERRTSKƒMOVE.L‚#FSTATN,D1ŠSET�UP�RETURN�STATUS ‰BRA.SƒERRCC**ˆINTERNAL�ERROR*-ERRFMSƒMOVE.L‚#FSTAIE,D1ŠSET�UP�RETURN�STATUS‰BRA.SƒERRCCSŽGO�SET�CC**ˆINVALID�ASSIGNMENT�ERROR*7ERRASGS‚BSR.SƒSIGDCBŽRELEASE�DCB�LIST�SEMAPHORE†IEEE488 -ERRASGƒMOVE.L‚#FSTAAS,D1ŠSET�UP�RETURN�STATUS‰BRA.SƒERRCC�GO�SET�CC**ˆINVALID�DEVICE�NAME*.ERRDEVƒMOVE.L‚#FSTAVOL,D1‰SET�UP�RETURN�STATUS‰BRA.SƒERRCC�GO�SET�CC**ˆINVALID�PARAM�BLOCK�ADDRESS*-ERRPRMƒMOVE.L‚#FSTAIP,D1ŠSET�UP�RETURN�STATUS3‰BSR…PUTSTAŽPut�status�(D1)�into�actual�user's�P.B.‰BRA.SƒSETCCLŽGO�SET�CC* *ˆDEVICE�BUSY*-ERRBSYƒMOVE.B‚#ISTADB,D1ŠSET�UP�RETURN�STATUS ‰BRA.SƒERRCC**ˆINVALID�DEVICE�TYPE*-ERRIDTƒMOVE.L‚#FSTADT,D1ŠSET�UP�RETURN�STATUS3‰BSR…PUTSTAŽPut�status�(D1)�into�actual�user's�P.B.‰BRA.SƒSETCCLŽGO�SET�CC**ˆSET�STATUS�AND�CC*#ERRCC„BSR.SƒSIGLUTŽRELEASE�LUT�LISTERRCCSƒRTS™RETURN*ERCOSNX:‰MOVE.L„#FSTAOSNX,D1"*œD1�=�ERROR�CODE�REFLECTING�ERROR ‰BRA.S…ERRCC*œCONTINUE�PROCESSINGERRSSE: ‰BSR.S…SIGDCB*œRELEASE�DCB�LOCK‰MOVE.L„#FSTASE,D1 *œD1�=�SHARED�SEGMENT�ERROR�CODE ‰BRA.S…ERRCC*œSET�UP�CONDITION�CODES‰PAGE**�RESOURCE�MANAGEMENT�ROUTINES*!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER**ˆRETURN:�SAME*(*�Two�entry�points:‚WAITLUT�and�WAITDCB.G*ƒIn�I/O�common�segment�is�a�semaphore�for�the�LUT�(logical�unit�table)C*ƒand�a�semaphore�for�the�the�DCB�(device�control�block).‚SelectingK*ƒthe�appropriate�entry�point�and�BSRing�to�it�will�result�in�the�semophoreB*ƒbeing�set�with�a�TAS�instruction�to�give�exclusive�access�to�theI*ƒresource.‚In�case�the�resource�has�been�previously�locked,�a�relinquish7*ƒloop�is�entered�until�the�resource�becomes�available.*>* To free the resource use the appropriate signal entry point.**ˆWAIT�ON�LUT�SEMAPHORE*,WAITLUT‚MOVE.L�#SVTSLUT,D0‚GET�LUT�SEMAPHORE ‰BRA.S�XXWAIT**ˆWAIT�ON�DCB�SEMAPHORE*,WAITDCB‚MOVE.L�#SVTSDCB,D0ŠGET�DCB�SEMAPHOREXXWAIT‚MOVE.L�IOCOMS(A2),A0 ‰ADD.L�D0,A0XXWT00ƒTAS„(A0)‰BEQ.S�XXWT10�GOT�IT‰MOVE.L�A0,-(A7)‰ERQ.RELINQŠCAN'T�GET�IT�NOW‰MOVE.L�(A7)+,A0�TRY�AGAIN ‰BRA�XXWT00 XXWT10 RTS**ˆSIGNAL�ON�LUT�SEMAPHORE*F* Two entry points are SIGLUT to free the LUT (logical unit table) and0* SIGDCB to free the DCB (device control block).*/SIGLUTƒMOVE.L�#SVTSLUT,D0ŠRELEASE�LUT�SEMAPHORE ‰BRA.S�SIGXXX**ˆSIGNAL�ON�DCB�SEMAPHORE*/SIGDCBƒMOVE.L�#SVTSDCB,D0ŠRELEASE�DCB�SEMAPHORESIGXXXƒMOVE.L�IOCOMS(A2),A0‰CLR.B�(A0,D0)‰RTS‰PAGE**ˆAPCHK**ˆREV.�1.00‚6/15/79�(JIM�SMITH)*/*�THIS�ROUTINE�WILL�CHECK�FOR�ACCESS�PERMISSION2*�CONFLICTS�BETWEEN�THE�DCB�AND�THE�REQUESTOR.�ALL5*�RESOURCE�LOCKS�ARE�ASSUMED�TO�HAVE�BEEN�MADE.‚IF�NO/*�ERRORS�ARE�FOUND�THE�DCB�AND�LUN�ARE�UPDATED.*#*ˆENTRY:�A4�=�QUEUE�MESSAGE�POINTER*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER**ˆRETURN:�SAME*�D0�=�0�=�NORMAL�RETURN*•1�=�AP�CONFLICT**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�R�*ƒ*�*�P�P�P *�A�*‡P�P�P�P*G* Using outstanding read and write assignment counts DCBWNT,DCBRNT thatH* are saved in DCB and the requested read/write access permission codes,H*�determine�if�a�conflict�exists.‚If�it�does�return�1�in�D0,�else�returnB*�0�in�D0.‚APCHK�also�checks�bussable,�and�sharable�attributes�for-* conflicts with requested access permission.**APCHK:K*‚Map�requested�read/write�permission�codes�to�0,-1,1�values�via�BSR�MAPAP.5*‚IF�device�NOT�sharable�(#DATSHR�in�DCBATT�set)�THEND*…IF�either�DCB�write�count�or�read�count�(DCBWNT,DCBRNT)�is�nonzero0*ˆTHEN�BNE�APC45.�{Returns�error�code�=�1�in�D0}9*‚IF�any�type�of�read�access�was�requested�(D3�<>�0)�THEN=*…IF�either�the�DCBRNT�(set�negative)�or�D3�(from�MAPAP)�THEN+*ˆBMI�APC45�{Returns�error�code�=�1�in�D0}.*…ELSEA*ˆIF�exclusive�read�access�was�requested�and�(D3�=�-1)�and�DCBRNT!*ˆ(read�counter�in�DCB�<>�0)�THEN,*‹BNE�APC45.‚{Returns�error�code�=�1�in�D0}.*%APCHK„CLR.LƒD0’INITIALIZE�RETURN�CODE%‰MOVE.W‚FHSOPT(A5),D1‡PICK�UP�OPTIONS‰AND.Wƒ#7,D1�ISOLATE�AP3‰BSR…MAPAP�Return�with�requested�protection�values. !*¤D3�=�read�protection�requested."*¤D4�=�write�protection�requested.)*¤$FFFF,exclusive�$0001,public�$0000,noneA*BTSTW�#DATSHR,DCBATT(A6,D5.L)†IS�THIS�A�SHARABLE�DEVICE?‡IEEE488(ŠBTSTM‚DATSHR,DCBATT,A6,D5.LœSJF�9/23/83 BEQ.S APC20*�TST.W�DCBWNT(A6,D5.L)ŽANY�WRITES�ALREADY?)�BNE�APC45šBRANCH�IF�YES�-�ERROR?‹IEEE4881�TST.W�DCBRNT(A6,D5.L)ŽANY�READS�ALREADY?�IEEE488(�BNE�APC45šBRANCH�IF�YES�-�ERRORŒIEEE488APC20„TST.WƒD3’READ�AP�?‰BEQ.SƒAPC25�NO5‰TST.WƒDCBRNT(A6,D5.L)‡ALREADY�EXCLUSIVELY�ASSIGNED�?‰BMI…APC45�YES,�INVALID�REQUEST‰TST.WƒD3’EXCLUSIVE�REQUESTED�?!‰BMI.SƒAPC22�YES,�LEAVE�MAP�VALUE3‰ADD.WƒDCBRNT(A6,D5.L),D3‚NO,�SET�UP�NEW�READ�COUNT ‰BRA.SƒAPC25-APC22„TST.WƒDCBRNT(A6,D5.L)…READ�COUNT�ZERO�?‰BNE.SƒAPC45�NO,�ERROR*APC25::*‚IF�any�type�of�write�access�was�requested�(D4�<>�0)�THEN=*…IF�either�the�DCBWCT�(set�negative)�or�D4�(from�MAPAP)�THEN+*ˆBMI�APC45�{Returns�error�code�=�1�in�D0}.*…ELSEB*ˆIF�exclusive�write�access�was�requested�and�(D4�=�-1)�and�DCBWNT"*ˆ(write�counter�in�DCB�<>�0)�THEN,*‹BNE�APC45.‚{Returns�error�code�=�1�in�D0}.*APC25„TST.WƒD4’WRITE�AP�?‰BEQ.SƒAPC30�NO5‰TST.WƒDCBWNT(A6,D5.L)‡ALREADY�EXCLUSIVELY�ASSIGNED�?!‰BMI.SƒAPC45�YES,�INVALID�REQUEST‰TST.WƒD4’EXCLUSIVE�REQUESTED�?!‰BMI.SƒAPC27�YES,�LEAVE�MAP�VALUE4‰ADD.WƒDCBWNT(A6,D5.L),D4‚NO,�SET�UP�NEW�WRITE�COUNT ‰BRA.SƒAPC30.APC27„TST.WƒDCBWNT(A6,D5.L)…WRITE�COUNT�ZERO�?‰BNE.SƒAPC45�NO,�ERROR *ÆIEEE488?*ˆCHECK�TO�SEE�IF�WE�ARE�DEALING�WITH�A�BUS�DEVICE�OR�A‰IEEE488*ˆBUSSABLE�DEVICE.®IEEE488 *ÆIEEE488*APC30:F*‚IF�this�is�NOT�a�bussable�device�(DATBDV�NOT�set)�OR�this�is�a�NOT�a#*‚sharable�device�(DATSHR�set)�THEN/*…IF�any�devices�open�on�bus�(DCBSOP�<>�0)�THEN-*ˆBRA�APC45�{Returns�error�status�of�1�in�D0}*…ELSE;*ˆMove�session�number�from�logical�unit�table�to�DCB�entry. *ˆBRA�APC33*APC30B*ˆBTSTWƒ#DATBDV,DCBATT(A6,D5.L)‚IS�THIS�A�BUSSABLE�DEVICE?ƒIEEE488(ŠBTSTM‚DATBDV,DCBATT,A6,D5.L�SJF�9/23/83#‰BNE.SƒAPC30A�BRANCH�IF�YES“IEEE488=*ˆBTSTWƒ#DATSHR,DCBATT(A6,D5.L)‚IS�THIS�A�BUS�DEVICE?ˆIEEE488(ŠBTSTM‚DATSHR,DCBATT,A6,D5.L�SJF�9/23/83!‰BEQ.SƒAPC33‘BRANCH�IF�NO”IEEE488 *ÆIEEE488>*ˆAT�THIS�POINT�WE�HAVE�A�NON-SHARED�BUS�DEVICE.‚CHECK‰IEEE488<*ˆTO�SEE�IF�THERE�ARE�ANY�SUBORDINATE�DEVICES‚OPENED‹IEEE488?*ˆON�THIS�BUS.�IF�THERE�ARE,�IT�IS�INVALID�THE�OPEN�THE‰IEEE488*ˆBUS�AT�THIS�TIME.­IEEE488 *ÆIEEE488;‰TST.LƒDCBSOP(A6,D5.L)‡ARE�ANY�DEVICES�OPEN�ON�BUS?„IEEE4881‰BNE.SƒAPC45‘BRANCH�IF�YES�-�REPORT�ERROR„IEEE488 *ÆIEEE488@‰MOVE.L‚LUTSES(A6,D7.L),DCBSUP(A6,D5.L)‚SET�UP�SESSION�#…IEEE488‰BRA.SƒAPC33‘CONTINUE˜IEEE488 *ÆIEEE488E*ˆAT�THIS�POINT�WE�HAVE�A�BUSSABLE�DEVICE.‚IF�THE�BUS�IS�OPEN‚IEEE488E*ˆCHECK�TO�SEE�THAT�THE�SESSION�NUMBERS�MATCH�BEFORE�UPDATINGƒIEEE488.*ˆTHE�SUBORDINATE�OPEN�COUNT�(DCBSOP).šIEEE488 *ÆIEEE488<*APC30A: {Come here from APC30 if we have a bussable device}7*‚Pick�up�pointer�to�subordinate�DCB�entry�from�DCBSUP.?*‚IF�any�read/writes�open�on�subordinate�DCB�(DCBWNT�<>�0)�THENB*…IF�the�session�number�from�our�LUT�(supervisor's)�does�not�match(*…that�in�DCBSUP�of�subordinate�DCB�THEN,*ˆBNE�APC45�{Returns�error�code�of�#1�in�D0}*APC30B:4*‚ELSE�{No�reads�or�writes�open�in�subordinates�DCB}G*…IF�any�type�of�read�permission�or�write�permission�was�requested�THEN*APC30C::*ˆBump�subordinate�open�count�(DCBSOP�of�subordinate�DCB).**APC33:M*‚For�any�read�or�write�permission�which�was�requested,�move�the�MAPAP�values6*‚to�DCBRNT�and�DCBWNT�of�supervisor�DCB�respectively.*APC40:F*‚Move�the�original�read/write�permission�bits�to�LUTCAP�in�LUT�entry.*‚Return�with�good�status.**APC45:%*‚Return�with�bad�status�of�#1�in�D0.*HAPC30AƒMOVE.L‚DCBSUP(A6,D5.L),A0„A0�<==�SUBORDINATES�BUS�DCB�PTR�IEEE488/‰TST.LƒDCBWNT(A0)ŒANY�BUS�WRITES/READS?‹IEEE488.‰BEQ.SƒAPC30B�NO,�BUS�MUST�NOT�BE�OPENˆIEEE488 *ÆIEEE4885‰MOVE.L‚DCBSUP(A0),A0‰A0�<==�SESSION�#�OF�BUS‰IEEE4885‰CMPA.L‚LUTSES(A6,D7.L),A0„SESSION�#'S�MATCH?ŽIEEE488%‰BNE.SƒAPC45‘NO,�REPORT�ERROR�IEEE488 *ÆIEEE488 &APC30BƒTST.WƒD3”ANY�NEW�READS?’IEEE488#‰BNE.SƒAPC30C�BRANCH�IF�YES“IEEE488!‰TST.WƒD4”ANY�NEW�WRITES?‘IEEE488!‰BEQ.SƒAPC33‘BRANCH�IF�NO”IEEE488 *ÆIEEE488DAPC30CƒMOVE.L‚DCBSUP(A6,D5.L),A0„RESTORE�SUBORDINATE�DCB�PTR…IEEE488<‰ADD.Lƒ#1,DCBSOP(A0)‰UPDATE�THE�SUBORDINATE�OPEN�CNT�IEEE488*)APC33„TST.WƒD3’READ�REQUEST�?ƒ(WAS�APC30)‰BEQ.SƒAPC35�NO1‰MOVE.W‚D3,DCBRNT(A6,D5.L)„YES,�UPDATE�READ�COUNTAPC35„TST.WƒD4’WRITE�REQUEST�?‰BEQ.SƒAPC40�NO2‰MOVE.W‚D4,DCBWNT(A6,D5.L)„YES,�UPDATE�WRITE�COUNT5APC40„MOVE.B‚D1,LUTCAP(A6,D6.L)„SET�UP�AP�CODE�IN�LUN ‰RTS™RETURNAPC45„MOVE.L‚#1,D0�SET�ERROR ‰RTS™RETURN‰PAGE**ˆPCCHK**ˆREV.�1.00‚6/15/79�(JIM�SMITH)***�THIS�ROUTINE�WILL�CHECK�FOR�PROTECT�CODE.*�CONFLICTS�BETWEEN�THE�DCB�AND�THE�REQUESTOR.*#*ˆENTRY:�A4�=�QUEUE�MESSAGE�POINTER*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER**ˆRETURN:�SAME*�D0�=�0�=�NORMAL�RETURN*•1�=�Protection�code�conflict.**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�R�*ƒ*�*�P�P�P *�A�*‡P�P�P�P*G* This routine checks the DCB for protection and is thus concerned only*…with�devices�-�NOT�files.** PCCHK:2*‚IF�any�read�access�permission�was�requested�THEND*…IF�any�read�protection�exists�on�this�device�(check�DCB�at�DCBRCD)*…THENE*ˆIF�passed�read�protect�codes�from�user's�FHS�parameter�block�do�not,*ˆmatch�the�DCB�read�protect�codes�at�DCBRCD*ˆTHEN *‹BRA�PCC35:.3*‚IF�any�write�access�permission�was�requested�THENE*…IF�any�write�protection�exists�on�this�device�(check�DCB�at�DCBWCD)*…THENF*ˆIF�passed�write�protect�codes�from�user's�FHS�parameter�block�do�not-*ˆmatch�the�DCB�write�protect�codes�at�DCBRCD*ˆTHEN *‹BRA�PCC35:.+*‚Return�to�caller.‚(Good�status�#0�in�D0).*PCC35:%*‚Return�nonzero�status�and�#1�in�D0.**%PCCHK„CLR.LƒD0’INITIALIZE�RETURN�CODE%‰MOVE.W‚FHSOPT(A5),D1‡PICK�UP�OPTIONS‰AND.Wƒ#7,D1�ISOLATE�AP3‰BSR…MAPAP�Return�with�requested�protection�values.!*¤D3�=�read�protection�requested."*¤D4�=�write�protection�requested.)*¤$FFFF,exclusive�$0001,public�$0000,nonePCC20„TST.WƒD3’READ�REQUEST�?‰BEQ.SƒPCC25�NO,‰TST.BƒDCBRCD(A6,D5.L)‡ANY�READ�PROTECTION�?!‰BEQ.SƒPCC25�NO,�ANYTHING�WILL�DO*‰MOVE.B‚FHSRCD(A5),D1‡YES,�CHECK�FOR�MATCH+‰CMP.BƒDCBRCD(A6,D5.L),D1„READ�CODE�MATCH�?‰BNE.SƒPCC35�NO,�ERRORPCC25„TST.WƒD4’WRITE�REQUEST�?‰BEQ.SƒPCC30�NO-‰TST.BƒDCBWCD(A6,D5.L)‡ANY�WRITE�PROTECTION�?!‰BEQ.SƒPCC30�NO,�ANYTHING�WILL�DO‰MOVE.B‚FHSWCD(A5),D1‡YES,‰CMP.BƒDCBWCD(A6,D5.L),D1„WRITE�CODE�MATCH�?‰BNE.SƒPCC35�NO,�ERRORPCC30„RTS™RETURN!PCC35„MOVE.L‚#1,D0�SET�ERROR�CODE ‰RTS™RETURN‰PAGE**ˆATCHK**ˆREV.�1.00‚6/15/79�(JIM�SMITH)*/*�THIS�ROUTINE�WILL�CHECK�FOR�DEVICE�ATTRIBUTES3*�CONFLICT�BETWEEN�THE�DCB�AND�THE�REQUESTED�ACCESS*�PERMISSION�THEN�UPDATE�LUN.*#*ˆENTRY:�A4�=�QUEUE�MESSAGE�POINTER*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER**ˆRETURN:�SAME*�D0�=�0�=�NORMAL�RETURN*•1�=�INVALID�FUNCTION**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�R�*ƒ*�*�P�P�P *�A�*‡P�P�P�P** ATCHK:2*‚IF�any�read�access�permission�was�requested�THENJ*…IF�the�device�does�not�support�read�access�(check�DCB�at�#DATRED,DCBATT)*…THEN *ˆBEQ�ATC35:3*‚IF�any�write�access�permission�was�requested�THENK*…IF�the�device�does�not�support�write�access�(check�DCB�at�#DATWRT,DCBATT)*…THEN *ˆBEQ�ATC35:A*‚Move�DCBATT�(DCB�attributes)�to�LUN�entry�for�this�device,task.+*‚Return�to�caller.‚(Good�status�#0�in�D0).*ATC35:%*‚Return�nonzero�status�and�#1�in�D0.**%ATCHK„CLR.LƒD0’INITIALIZE�RETURN�CODE%‰MOVE.W‚FHSOPT(A5),D1‡PICK�UP�OPTIONS‰AND.Wƒ#7,D1�ISOLATE�AP5‰BSR.SƒMAPAP�Return�with�requested�protection�values.!*¤D3�=�read�protection�requested."*¤D4�=�write�protection�requested.)*¤$FFFF,exclusive�$0001,public�$0000,noneO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/83 2*ˆMOVE.W‚DCBATT(A6,D5.L),D1‚PICK�UP�DCB�ATTRIBUTES1‰MOVE.L‚DCBATT(A6,D5.L),D1‚PICK�UP�DCB�ATTRIBUTES *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰TST.WƒD3’READ�AP�REQUEST�?‰BEQ.SƒATC25�NO&‰BTSTƒ#DATRED,D1‹DEVICE�SUPPORT�READ�?‰BEQ.SƒATC35�NO,�ERROR!ATC25„TST.WƒD4’WRITE�AP�REQUEST�?‰BEQ.SƒATC30�NO'‰BTSTƒ#DATWRT,D1‹DEVICE�SUPPORT�WRITE�?‰BEQ.SƒATC35�NO,�ERRORO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/83E*ATC30„MOVE.W‚DCBATT(A6,D5.L),LUTATT(A6,D6.L)�SET�UP�ATTRIBUTES�IN�LUFATC30…MOVE.W‚DCBATT+2(A6,D5.L),LUTATT(A6,D6.L)�SET�UP�ATTRIBUTES�IN�LU *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ‰RTS™RETURN!ATC35„MOVE.L‚#1,D0�SET�ERROR�CODE ‰RTS™RETURN‰PAGE**ˆASGCHK**ˆREV.�1.00‚3/01/80�(JIM�SMITH)*/*�THIS�ROUTINE�WILL�CHECK�FOR�DEVICE�ATTRIBUTES1*�CONFLICT�BETWEEN�THE�DCB�AND�THE�CURRENT�ACCESS *�PERMISSION.*#*ˆENTRY:�A4�=�QUEUE�MESSAGE�POINTER*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER**ˆRETURN:�SAME*�D0�=�0�=�NORMAL�RETURN*•1�=�INVALID�FUNCTION**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�R�*ƒ*�*�P�P�P *�A�*‡P�P�P�P****&ASGCHKƒCLR.LƒD0’INITIALIZE�RETURN�CODE:‰CMP.Bƒ#FOPEREW,LUTCAP(A6,D6.L)�EXCLUSIVE�R/W�PERMISSION�?‰BEQ.SƒASGC30ŽYES,�IT'S�OK4‰MOVE.W‚LUTATT(A6,D6.L),D1‚PICK�UP�DEVICE�ATTRIBUTES‰BTSTƒ#DATRED,D1‹SUPPORT�READ�?‰BEQ.SƒASGC10ŽNO,�MUST�BE�WRITE<‰CMP.Wƒ#FOPER,LUTCAP(A6,D6.L)�YES,�EXCLUSIVE�READ�ASSIGNMENT‰BNE.SƒASGC20ŽNO,�ERROR ‰BRA.SƒASGC30@ASGC10ƒCMP.Wƒ#FOPEW,LUTCAP(A6,D6.L)�EXCLUSIVE�WRITE�ASSIGNMENT�?‰BEQ.SƒASGC30ŽYES,�OK(ASGC20ƒADD.Lƒ#1,D0�SET�ERROR�RETURN�CODEASGC30ƒRTS™RETURN‰PAGE**ˆMAPAP*$*�THIS�ROUTINE�WILL�MAP�AP�OPTION�TO*�SEPARATE�READ/WRITE�VALUES.**ˆENTRY:�D1�=�AP�OPTION*%*ˆEXIT:�D3�AND�D4�=�0�=�NO�PERMISSION*š1�=�PUBLIC�PERMISSION*™-1�=�EXCLUSIVE�PERMISSION*&*ˆD3.W�will�represent�read�permission.'*ˆD4.W�will�represent�write�permission.**,MAPAP„LEA…APTBL(PC),A0‹SET�MAP�TABLE�POINTERMAP10„CMP.Bƒ1(A0),D1ŒMATCH�?‰BNE.SƒMAP15�NO#‰MOVE.W‚2(A0),D3ŒSET�READ�MAP�VALUE$‰MOVE.W‚4(A0),D4ŒSET�WRITE�MAP�VALUE ‰BRA.SƒMAP20$MAP15„ADD.Lƒ#6,A0�BUMP�TABLE�POINTER‰BRA.SƒMAP10�CONTINUE�SEARCHMAP20„RTS…RETURN‰PAGE**ˆDCBLOK**ˆREV.�1.00‚6/15/79�(JIM�SMITH)*+*�THIS�UTILITY�ROUTINE�IS�CALLED�TO�LOOK�UP *�A�DEVICE�NAME�IN�THE�DCB�LIST.*#*ˆENTRY:�A4�=�QUEUE�MESSAGE�POINTER*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER**ˆRETURN:�SAME*�D0�=�0�=�NORMAL�RETURN*•1�=�NOT�FOUND*�D5�=�ADDRESS�OF�DCB**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�R�*‡R *�A�*‡P�P�P�P*E* This routine searches the linked list of DCB entries trying to findF* one whose mnemonic matches the mnemonic in the volume field (FHSVOL)K*�of�the�callers�FHS�parameter�block.‚If�an�an�entry�is�found�that�matches, * the address of placed into D5.**&DCBLOKƒCLR.LƒD0’INITIALIZE�RETURN�CODE(‰MOVE.L‚IOCOMS(A2),A0ŠSET�UP�SVT�POINTER-‰MOVE.L‚SVTDCB(A0),D5‡SET�UP�DCB�LIST�POINTER#‰BEQ.SƒDCB15�ERROR�-�NO�DCB�POINTER4DCB10„MOVE.L‚FHSVOL(A5),D1‡PICK�UP�VOLUME�NAME�FIELD!‰CMP.LƒDCBAID(A6,D5.L),D1„MATCH�?‰BEQ.SƒDCB20�YES,�FOUND�HIM7‰MOVE.L‚DCBPTR(A6,D5.L),D5„SET�UP�POINTER�TO�NEXT�TABLE‰BNE.SƒDCB10�MORE�TO�CHECK&DCB15„MOVE.L‚#1,D0�ERROR�-�END�OF�LISTDCB20„RTS™RETURN‰PAGE**ˆLUTLOK**ˆREV.�1.00‚6/15/79�(JIM�SMITH)*-*�THIS�UTILITY�ROUTINE�IS�CALLED�TO�LOOK�UP�A%*�LOGICAL�UNIT�TABLE�IN�THE�LUT�LIST.*E*ˆENTRY:�A0�=�POINTER�TO�TASK�ID�(Task�name�followed�by�task�session)*�A4�=�QUEUE�MESSAGE�POINTER*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER**ˆRETURN:�SAME*�D0�=�0�=�NORMAL�RETURN*•1�=�NOT�FOUND*�D7�=�LUT�POINTER*@*ˆSearch�yields�normal�return�(found)�if�a�match�is�found�in�the+*ŠLUT�for�the�task�name�and�session�number.**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�R�* *�A�P�*…P�P�P�P****!LUTLOKƒCLR.LƒD0’INITIALIZE�STATUS(‰MOVE.LƒIOCOMS(A2),A1ŠSET�UP�SVT�POINTER-‰MOVE.L‚SVTLUT(A1),D7‡SET�UP�LUT�LIST�POINTER#‰BEQ.SƒLUT20�ERROR�-�NO�LUT�POINTER$LUT10„MOVE.L‚(A0),D1�PICK�UP�TASK�ID!‰CMP.LƒLUTTID(A6,D7.L),D1„MATCH�?‰BNE.SƒLUT15�NO ‰MOVE.L‚4(A0),D1ŒPICK�UP�SESSION!‰CMP.LƒLUTSES(A6,D7.L),D1„MATCH�?‰BEQ.SƒLUT25�YES=LUT15„MOVE.L‚LUTPTR(A6,D7.L),D7„PICK�UP�POINTER�TO�NEXT�TABLE‰BNE.SƒLUT10�MORE�TO�CHECK&LUT20„MOVE.L‚#1,D0�ERROR�-�END�OF�LISTLUT25„RTS™RETURN‰PAGE**ˆLUNLOK**ˆREV.�1.00‚6/15/79�(JIM�SMITH)*-*�THIS�UTILITY�ROUTINE�IS�CALLED�TO�LOOK�UP�A*�LOGICAL�UNIT�ENTRY�IN�AN�LUT.*#*ˆENTRY:�A4�=�QUEUE�MESSAGE�POINTER*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER *�D1�=�LUN*�D7�=�LUT�POINTER**ˆRETURN:�SAME+*�D0�=�0�=�NORMAL�RETURN�(entry�not�active)*•1�=�ACTIVE�ENTRY*”-1�=�INVALID�LUN*�D6�=�LUN�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�R�*�*‰P *�Aƒ*…P�P�P�P****!LUNLOKƒCLR.LƒD0’INITIALIZE�STATUS&‰MOVE.B‚LUTMLU(A6,D7.L),D2‚PICK�UP�LUN ‰SUB.Bƒ#1,D2‰CMP.BƒD2,D1�VALID�LUN�?‰BHI.SƒLUN10�NO,�ERROR(‰MULU„#LUTSEG,D1ŠCALCULATE�OFFSET�IN�LUT‰LEA…LUTBEG(A6,D7.L),A1&‰ADD.LƒD1,A1�ADD�OFFSET�TO�LUT�POINTER‰MOVE.L‚A1,D6�SET�POINTER�IN�D6(‰MOVE.B‚LUTCSF(A1),D2‡PICK�UP�LUN�STATUS‰BTSTƒ#LUSFAC,D2‹LUN�ACTIVE�?‰BNE.SƒLUN15�YES ‰RTS™RETURN+LUN10„MOVE.L‚#-1,D0ŽSET�INVALID�RETURN�CODE ‰RTS™RETURN)LUN15„MOVE.L‚#1,D0�SET�ACTIVE�RETURN�CODE ‰RTS™RETURN‰PAGE**ˆLUTBLD**ˆREV.�1.00‚6/15/79�(JIM�SMITH)*+*�THIS�UTILITY�ROUTINE�IS�CALLED�TO�BUILD�A*�LOGICAL�UNIT�TABLE.* *ˆENTRY:�A0�=�POINTER�TO�TASK�ID*�A4�=�QUEUE�MESSAGE�POINTER*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D1�=�USER�NUMBER**ˆRETURN:�SAME*�D0�=�0�=�NORMAL�RETURN*•1�=�SPACE�ERROR*�D7�=�LUT�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�R�*�*‰R*�A�*�*…P�P�P�P*J* LUTBLD searches through the linked list of LUT entries trying to find anH*ƒempty�space.‚If�it�finds�one�it�inserts�the�following�information�intoC*ƒthe�entry:‚task�name,�task�session,�max�#�of�luns,�clears�currentC*ƒassignment�entry�(LUTCAS),�and�clears�the�remainder�of�the�entry.*5* IF no space is available, then D0 is returned as 1.**&LUTBLDƒCLR.LƒD0’INITIALIZE�RETURN�CODE"‰MOVE.L‚A0,A3�SAVE�TASK�ID�POINTER(‰MOVE.L‚IOCOMS(A2),A0ŠSET�UP�SVT�POINTER,‰MOVE.L‚SVTLUT(A0),D7‡ADDRESS�OF�FIRST�ENTRY)‰BNE.SƒLUTB10ŽNOT�ZERO�-�MUST�BE�AN�ENTRY/‰MOVE.L‚SVTLST(A0),D7‡ZERO�-�START�AT�BEGINNING0‰MOVE.L‚D7,SVTLUT(A0)‡SET�UP�FIRST�ENTRY�POINTER!‰BRA.SƒLUTB50ŽGO�INITIALIZE�TABLE)LUTB10ƒTST.LƒLUTTID(A6,D7.L)…EMPTY�SLOT�?‰BEQ.SƒLUTB55ŽYES,�US�IT0‰MOVE.L‚LUTPTR(A6,D7.L),D2„ADDRESS�OF�NEXT�TABLE ‰BEQ.SƒLUTB15ŽFOUND�THE�LAST�ONE‰MOVE.L‚D2,D7�KEEP�GOING ‰BRA.SƒLUTB10LUTB15ƒMOVE.L‚D7,A1 ‰MOVE.L„#LUNS,D2ŒGET�NR.�OF�LUNS)‰MULU†#LUTSEG,D2ŠMULT�BY�BEGINNING�OFFSET*‰ADD.L…#LUTBEG,D2ŠD2�=�LENGTH�OF�LUT�ENTRY‰ASL.L…#1,D2�MULT�BY�2+‰ADD.LƒD2,D7‘CALCULATE�ADDRESS�OF�NEW�TABLE+‰CMP.LƒSVTLND(A0),D7‡REACHED�END�OF�SPACE�?‰BCC.SƒLUT70�YES,�ERROR ‰ASR.L…#1,D2 ‰SUB.LƒD2,D7/‰MOVE.L‚D7,LUTPTR(A1)‡SET�UP�NEXT�TABLE�POINTER8LUTB50ƒCLR.LƒLUTPTR(A6,D7.L)‡ZERO�POINTETR�TO�NEXT�TABLE1LUTB55ƒMOVE.L‚(A3),LUTTID(A6,D7.L)‚SET�UP�TASK�ID3‰MOVE.L‚4(A3),LUTSES(A6,D7.L)�SET�UP�SESSION�NUMBER ‰MOVE.L„#LUNS,D2ŒGET�NR.�OF�LUNS+‰MOVE.B‚D2,LUTMLU(A6,D7.L)„SET�UP�MAX.�LUNS/‰CLR.BƒLUTCAS(A6,D7.L)‡ZERO�CURRENT�ASSIGNMENTS-‰MOVE.W‚D1,LUTUNM(A6,D7.L)„SET�UP�USER�NUMBER ‰MOVE.L‚D7,A1‰ADD.Lƒ#LUTBEG,A1$LUTB60ƒCLR.Lƒ(A1)+�SET�ENTRY�TO�ZERO ‰CLR.Lƒ(A1)+‰SUB.Lƒ#1,D2�FINISHED�?‰BNE.SƒLUTB60ŽNOLUTB65ƒRTS™RETURNLUT70:‰MOVE.L„(A7),SYSPACE(A2)*œSET�DIAGNOSTIC+*¡RETURN�ADDRESS�OF�CALL�TO�THIS�SUBROUTINE‰MOVE.L‚#1,D0�SET�RETURN�CODE ‰RTS™RETURN‰PAGE**ˆLUTDEL**ˆREV.‚1.00‚6/15/79�(JIM�SMITH)*"*�THIS�UTILITY�IS�CALLED�TO�DELETE*�A�LOGICAL�UNIT�TABLE.*#*ˆENTRY:�A4�=�QUEUE�MESSAGE�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D7�=�LUT�POINTER **ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�P *�A�*‡PƒP�P****.LUTDELƒMOVE.L‚IOCOMS(A2),A0ŠSET�UP�SVT�POINTER,‰LEA…SVTLUT(A0),A1‡PICK�UP�FIRST�LUT�POINTER'LUTD10ƒCMP.Lƒ(A1),D7�FIND�HIS�POINTEE�?‰BEQ.SƒLUTD20ŽYES(‰MOVE.L‚LUTPTR(A1),A1‡NO,�TRY�NEXT�TABLE ‰BRA.SƒLUTD10/LUTD20ƒTST.LƒLUTPTR(A6,D7.L)‡IS�HE�LAST�ENTRY�?‰BNE.SƒLUTD40ŽNO.‰CLR.LƒLUTPTR(A1)ŠYES,�SET�PRIOR�TO�LAST�ENTRY0LUTD40ƒCLR.LƒLUTTID(A6,D7.L)‡SET�TASK-ID�TO�ZERO*‰CLR.LƒLUTSES(A6,D7.L)‡SET�SESSION�TO�ZERO+‰CLR.LƒLUTMLU(A6,D7.L)‡SET�THE�REST�TO�ZERO ‰RTS™RETURN‰PAGE**ˆVALIDATE�NAME�ROUTINE**ˆREV.�1.00�8/1/79�(JIM�SMITH)*"*�THIS�ROUTINE�WILL�CHECK�A�STRING&*�FOR�ALL�ALPHA-NUMERICS�AND�BEGINNING *�WITH�ALPHA.**ˆENTRY:�A0�=�STRING�POINTER *�D1�=�LENGTH* *ˆRETURN:�D0�=�0�=�NORMAL�RETURN *•1�=�ERROR***"CHKNAMƒCLR.LƒD0’INIT�RETURN�STATUS.‰CMP.Bƒ#'A',(A0)‹MAKE�SURE�FIRST�CHAQ�IS�ALPHA‰BLT.SƒCHKN30ŽERROR‰CMP.Bƒ#'Z',(A0)+‰BGT.SƒCHKN30ŽERROR"CHKN10ƒSUB.Bƒ#1,D1�DECREMENT�COUNT‰BEQ.SƒCHKN40ŽFINISHED‰CMP.Bƒ#'1',(A0)‰BLT.SƒCHKN30ŽERROR‰CMP.Bƒ#'9',(A0)‰BLE.SƒCHKN20ŽOK‰CMP.Bƒ#'A',(A0)‰BLT.SƒCHKN30ŽERROR‰CMP.Bƒ#'Z',(A0)‰BGT.SƒCHKN30ŽERRORCHKN20ƒADD.Lƒ#1,A0�BUMP�POINTER‰BRA.SƒCHKN10ŽLOOP�BACK'CHKN30ƒMOVE.L‚#1,D0�SET�BAD�RETURN�CODE CHKN40ƒRTS‰PAGE* *ˆROUTINE�TO!*’INITIALIZE�THE�IOS�DATA�SEGMENT**ˆINPUT*’A2�=�IOS�DATA�SEGMENT�ADDRESS*’A7�=�STACK�ADDRESS*ˆOUTPUT**ˆREGISTER�ALTERATION*’A0�=�DESTROYED*’D0�=�DESTROYED**ˆCONDITION�CODE�RETURN*ˆN/A* TEMPLATE:,‰MOVE.B„#SRTREOT+SRTRPRM+FHSTIN,SRVBLK+4(A2)‰MOVE.B„#FHSNLN,SRVBLK+5(A2)(*œINITIALIZE�TRAP�SERVER�PARAMETER�BLOCK‰LEA‡EVLEN(A2),A0‰MOVE.L„A0,QEVBLK+10(A2)#*œINITIALIZE�QEVBLK�PARAMETER�BLOCK"‰MOVE.B„#EVTLEN+FHSNLN-8,EVLEN(A2)‰MOVE.B„#EVCQUE,EVLEN+1(A2)*œINITIALIZE�THE�WORK�AREA‰MOVE.B„#EVTLNG-8,FMSEVT(A2)‰MOVE.B„#EVCQUE,FMSEVT+1(A2)‰MOVE.B„#STAEVT,FMSUB(A2)4*œINITIALIZE�THE�DEVICE�STATUS�EVENT�PARAMETER�BLOCK‰LEA‡GPBUFR(A2),A0‰MOVE.L„#IOSID,A1‰MOVE.L„#IOSESS,D0.*œESTABLISH�PARAMETERS�FOR�GET�TASK�ID�ROUTINE"*œA0�=�GET�TASK�ID�PARAMETER�BLOCK*œA1�=�TASK�NAME*œD0�=�TASK�SESSION�NUMBER ‰BSR‡GETTSKID*œOBTAIN�FHS�TASK�ID ‰BSRNE…FATAL-*œBRANCH�IF�THE�IOS�TASK�IS�NOT�IN�THE�SYSTEM‰MOVE.L„A0,IOSTSKID(A2)‰MOVE.L„A1,IOSTSKID+4(A2)*œSAVE�IOS�TASK�ID‰LEA‡GPBUFR(A2),A0‰MOVE.L„#FMSID,A1‰MOVE.L„#IOSESS,D0.*œESTABLISH�PARAMETERS�FOR�GET�TASK�ID�ROUTINE"*œA0�=�GET�TASK�ID�PARAMETER�BLOCK*œA1�=�TASK�NAME*œD0�=�TASK�SESSION�NUMBER ‰BSR‡GETTSKID*œOBTAIN�FMS�TASK�ID‰BMI.S…TMPL0200&*œBRANCH�IF�THIS�IS�A�ROM�BASED�SYSTEM ‰BSRNE…FATAL"*œBRANCH�IF�FMS�TASK�NOT�IN�SYSTEM‰MOVE.L„A0,FMSTSKID(A2)‰MOVE.L„A1,FMSTSKID+4(A2)$*œSET�FMS�TASK�ID�IN�PARAMETER�BLOCK TMPL0100:‰RTS TMPL0200:‰MOVE.L„#-1,FMSTSKID(A2)%*œSET�FLAG�THIS�IS�A�ROM�BASED�SYSTEM*œFMS�DOES�NOT�EXIST.‰BRA.S…TMPL0100*œRETURN‰PAGE* *ˆROUTINE�TO*’GET�ASQ�FOR�FHS*@*ˆASSUMPTION�-‚POSITIONALLY�THIS�ROUTINE�ORIGINALLY�FOLLOWED�THE4*–CLEARING�OF�THE�FHS�DATA�BUFFER�CONSEQUENTLY�IT�IS1*–ASSUMED�THAT�THE�GENERAL�PURPOSE�DATA�BUFFER�IS2*–ZERO'D�OUT.�IF�THE�CALL�TO�THIS�ROUTINE�IS�MOVED5*–IT�MAY�BE�NECESSARY�TO�ZERO�OUT�THE�GENERAL�PURPOSE5*–DATA�BUFFER�PRIOR�TO�EXECUTING�THE�MAIN�LOGIC.�THIS7*–WAS�NOT�DONE�ON�A�STANDARD�BASIS�IN�ORDER�TO�CUT�DOWN*–ON�LOGIC�CODE�SPACE**ˆINPUT"*’A2�=�ADDRESS�OF�FHS�DATA�SEGMENT**ˆOUTPUT *’FHS�HAS�ASQ**ˆREGISTER�ALTERATION*’A0�=�DESTORYED*’A6�=�DESTORYED*’D0�=�DESTORYED* *ˆCONDITONS*–ZERO�==>ˆASQ�ALLOCATED-*’NON-ZERO�==‰TASK�WILL�SELF�ABORT�VIA�KILLER*GETASQ:‰LEA‡GPBUFR(A2),A0!*œA0�=�ADDRESS�OF�PARAMETER�BLOCK"*¡(GENERAL�PURPOSE�DYNAMIC�BUFFER)=‰MOVE.B„#AQSTQE+AQSTME+AQSTRD+AQSTSD+AQSTBV+AQSTRI,ASQSTA(A0)#*œSET�ASQ�STATUS�IN�PARAMETER�BLOCK*œBIT‡MEANING�AS�SELECTED*�0ˆENABLE�ASQ*�1ˆENABLE�DEFAULT�INPUT�BUFFER*�2ˆASR�DISABLED*�3ˆDISABLE�REGISTER�STACKING**�4ˆDEFAULT�RECEIVING�INPUT�BUFFER�DEFINED*�5ˆNO�ASR�DEFINED ‰MOVE.L„#EVULEN+FHSNLN,D0*œD0�=�MAXIMUM�MESSAGE�LENGTH#*¡ALSO�USED�TO�DETERMINE�ASQ�LENGTH‰MOVE.B„D0,ASQMML(A0)‰MOVE.L„D0,ASQQLN(A0)*œSET�RESPECTIVELY*¡MAXIMUM�MESSAGE�LENGTH+*¡ASQ�LENGTH�(PAGE�ALLOCATION�TO�256�BYTES)‰LEA‡ASQUE(A2),A6‰MOVE.L„A6,ASQASR+4(A0)-*œA6�=�ADDRESS�DEFAULT�RECEIVING�INPUT�BUFFER‰MOVE.L„#GTASQ,D0*œD0�=�GET�ASQ�DIRECTIVE‰TRAP†#1*œALLOCATE�ASQ ‰BSRNE…FATAL*œIF�ERROR�TERMINATE�TASK‰RTS‰PAGE**ˆVALID�COMMAND�COMBINATION* *‚FHS�LEVEL�0I* This table contains all the valid command codes associated with a level*…0�FHS�call�(TRAP�#3).*CC0FHSƒDC.B„1“CHECKPOINT‰DC.B„2“DELETE ‰DC.B„4“CLOSE‰DC.B„8“PROTECT‰DC.B„$10‘RENAME‰DC.B„$20‘CHANGE�AP‰DC.B„$40‘ASSIGN‰DC.B„$80‘ALLOCATE‰DC.B„$6’CLOSE,�DELETE‰DC.B„$C’PROTECT,�CLOSE‰DC.B„$14‘RENAME,�CLOSE‰DC.B„$18‘RENAME,�PROTECT ‰DC.B„$1C‘RENAME,�PROTECT,�CLOSE(‰DC.B„$1E‘RENAME,�PROTECT,�CLOSE,�DELETE‰DC.B„$24‘CHANGE�AP,�CLOSE‰DC.B„$28‘CHANGE�AP,�PROTECT#‰DC.B„$2C‘CHANGE�AP,�PROTECT,�CLOSE‰DC.B„$30‘CHANGE�AP,�RENAME"‰DC.B„$34‘CHANGE�AP,�RENAME,�CLOSE#‰DC.B„$38‘CHANGE�AP,RENAME,�PROTECT+‰DC.B„$3C‘CHANGE�AP,�RENAME,�PROTECT,�CLOSE‰DC.B„$48‘ASSIGN,�PROTECT ‰DC.B„$4C‘ASSIGN,�PROTECT,�CLOSE(‰DC.B„$4E‘ASSIGN,�PROTECT,�CLOSE,�DELETE‰DC.B„$50‘ASSIGN,�RENAME‰DC.B„$54‘ASSIGN,�RENAME,�CLOSE!‰DC.B„$58‘ASSIGN,�RENAME,�PROTECT(‰DC.B„$5C‘ASSIGN,�RENAME,�PROTECT,�CLOSE‰DC.B„$C0‘ALLOCATE,�ASSIGNFHS0END‚EQU…*“END�OF�TABLE‰DC.B„0“KEEP�IT�EVEN‰PAGE**�SUPPORT�TABLES***ˆFHS�COMMAND�LEVEL�TABLE*'CMDTBLƒDC.L„LEVEL0ŽDEVICE/FILE�COMMANDS‰DC.L„LEVEL1ŽUTILITY�COMMANDS DC.L LEVEL2 SPOOLER COMMANDS‰DC.L„0,0,0,0�NOT�USED!‰DC.L„LEVEL80�PRIVILEGED�COMMANDS**ˆLEVEL�ZERO�EXECUTORS*LEV0EXƒDC.L„ALLOC�ALLOCATE‰DC.L„ASGN�ASSIGN#‰DC.L„CAPN�CHANGE�ACCESS�PERMISSION‰DC.L„RENAM�RENAME‰DC.L„PROT�PROTECT‰DC.L„CLOSE�CLOSE‰DC.L„DELET�DELETE‰DC.L„CHKPNTŽCHECKPOINT**ˆLEVEL�ONE�EXECUTORS*%LEV1EXƒDC.L„RATTR�RETRIEVE�ATTRIBUTES‰DC.L„FDIR�FETCH�DIRECTORY"‰DC.L„FDVMN�FETCH�DEVICE�MNEMONICS!‰DC.L„CHGLUAŽCHANGE�LU�ASSIGNMENT"‰DC.L„FVOLDEF�FETCH�DEFAULT�VOLUME‰DC.L„0“NOT�USED‰DC.L„0“NOT�USED‰DC.L„0“NOT�USED**ˆLEVEL�TWO�EXECUTORS* LEV2EX DC.L SPLCMD DISPLAY QUEUE DC.L SPLCMD COPIES DC.L SPLCMD PRINT DC.L SPLCMD FORMS DC.L SPLCMD CONTINUE DC.L SPLCMD CANCEL DC.L 0 NOT USED DC.L 0 NOT USED**ˆLEVEL�80�EXECUTORS*LEV80EX‚DC.L„0“NOT�USED‰DC.L„0“NOT�USED‰DC.L„0“NOT�USED‰DC.L„0“NOT�USED‰DC.L„0“NOT�USED‰DC.L„0“NOT�USED‰DC.Lƒ0“NOT�USED‰DC.L„VOLDEFŽSET�DEFAULT�VOLUME**ˆACCESS�PERMISSION�MAP�TABLEK* Referenced by MAPAP to set read access permssion into D3 and write accessI*…permission�into�D4.‚$FFFF�represents�exclusive�access,�$0001�represents,*…public�access,�$0000�represents�no�access.* APTBL„DC.W…FOPPR,1,0ŠPUBLIC�READ‰DC.W…FOPER,-1,0‰EXCLUSIVE�READ‰DC.W…FOPPW,0,1ŠPUBLIC�WRITE ‰DC.W…FOPEW,0,-1‰EXCLUSIVE�WRITE+‰DC.W…FOPPRPW,1,1ˆPUBLIC�READ,�PUBLIC�WRITE/‰DC.W…FOPPREW,1,-1‡PUBLIC�READ,�EXCLUSIVE�WRITE/‰DC.W…FOPERPW,-1,1‡EXCLUSIVE�READ,�PUBLIC�WRITE3‰DC.W…FOPEREW,-1,-1†EXCLUSIVE�READ,�EXCLUSIVE�WRITE‰PAGE GSEGPBLK:‰DC.L†0 *œTASK�NAME‰DC.L†0*œTASK�SESSION�NUMBER ‰DC.W†$2000*œDIRECTIVE�OPTIONS-*�BIT�13�-�LOGICAL�ADDRESS�=�PHYSICAL�ADDRESS‰DC.W†$0*œSEGMENT�ATTRIBUTES ‰DC.B†'FHSD'*œSEGMENT�NAME‰DC.L†$0 *œPHYSICAL�ADDRESS�IF�APPLICABLE‰DC.L†GSEGSIZE*œSEGMENT�BYTE�SIZE‰PAGEPROGSIZ‚EQU‡*-FHSENT‰PAGE ‰END‡FHSENTé =/*=/*†DEVICE.IOS.AF=/*A=/* Chain file to assemble I/O Trap 2 server 'IOS' device portion=/*:=/* If no output argument is specified for the listing the,=/* chain file will default to DEVICE.IOS.LS=/*=/IFC \1ƒ=ARG�DEVICE.IOS.LS=/ENDIF=/**=ASM DEVICE.IOS.SA,DEVICE.IOS.RO,\1;RZ=175=/*{ Included files are:=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.EXE.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.NIO.EQ=/*ƒ9995.&.LV5.EQ=/*ƒ9995.&.FME.EQ=/*ƒ9995.&.FMI.EQ=/*ƒ9995.&.UTILITY.MC=/*ƒTEMPLATE.IOS.AI=/*}=/*=ENDéééééH‰OPT‡CREF***********************************************************************&*�VERSADOS�OPERATING�SYSTEM�-�OEM�RTOS* *—I/O�MODULE**•IOS�TRAP�2�SERVER*$*�COPYRIGHTED�1980�BY�MOTOROLA,�INC.*F************************************************************************�PROGRAM�NAME:‚.IOS**�REV.‚1.00‚7/01/79ƒ(JIM�SMITH)D*�REV.‚2.00‚7/28/81ƒ(DICK�VANDERLIN)�-�ADDITION�OF�I/O�WITH�TIME-OUTC*�REV.‚2.01�10/15/81ƒ(DICK�VANDERLIN)�-�ADDITION�OF�SPECIAL�PURPOSE!*ªDRIVER�PARAMETER�BLOCK�SUPPORT.O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*B*ˆCHANGES�MADE�BY�HUGHS�CAN�BE�IDENTIFIED�BY�ONE�OF�THE�FOLLOWING:* *’IEEE488*’EVENT *’LEVEL40O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<E*�REV.‚3.00‚3/10/83ƒ(STEVE�FEITELSON)�-�ADDITION�OF�LEVEL�40�FUNCTION*«CODE�PROCESSOR�(IEEE488).D*�REV.‚3.01‚6/20/83ƒ(STEVE�FEITELSON)�-�CLAIM�DRIVER�EVENTS�ADDED�TO*«LEVEL�2�FUNCTIONS.**-*�FUNCTION:‚FILE/DEVICE�INPUT/OUTPUT�SERVICES*2*�CALLING�SEQUENCE:‚TRAP�2�WITH�IOCB�POINTER�IN�A0***�SUPPORT�TABLES:‚LOGICAL�UNIT�TABLE�(LUT)*’DEVICE�CONTROL�BLOCKS�(DCB)*’DEVICE�CONNECTION�QUEUE�(DCQ)*2*�ENTRY:‚THIS�MODULE�IS�ATTACHED�TO�THE�I/O�COMMON&*‰DATA�SEGMENT�BY�THE�I/O�INITIALIZER."*‰AN�ASQ�HAS�BEEN�ALLOCATED�BY�THE*‰I/O�INITIALIZER.*F**********************************************************************‰PAGE***ˆINCLUDE�STATEMENTS*ˆTR1 *ˆTR1RTCD*ˆEXE*ˆIOE*ˆNIO*ˆLV5*ˆFME*ˆFMI *ˆUTILITY.MC**‰NOLISTŠINCLUDE�9995.&.TR1.EQŠINCLUDE�9995.&.TR1RTCD.EQŠINCLUDE�9995.&.EXE.EQŠINCLUDE�9995.&.IOE.EQŠINCLUDE�9995.&.NIO.EQŠINCLUDE�9995.&.LV5.EQŠINCLUDE�9995.&.FME.EQŠINCLUDE�9995.&.FMI.EQŠINCLUDE�9 995.&.UTILITY.MCŠLISTŠPAGE**ˆGENERAL�EQUATES*(PBCLN„EQU…10”PARAM�BLOCK�CONSTANT�LENGTH(EREX…EQU…$FFFFFF00�IOS�ERROR�SIGN�EXTEND BIT0…EQU…0***‰PAGE**ˆIOS�INITIALIZATION�ROUTINE**ˆREV.�1.00‚7/01/79�(JIM�SMITH)*JQXZrbSjRrVzG‚BŠJ’MšZ¢BªA²JºOÂ9ÊEÒRÚUâ@êQò=úJJ IYT"T*U2W:E0*�THIS�ROUTINE�PERFORMS�THE�FOLLOWING�FUNCTIONS:**�-�SET�USER�STACK�POINTER'*�-�ESTABLISH�MODULE�AS�A�TRAP�2�SERVER*-*ˆENTRY:�A0�=�IOCOMS�ADDRESS�AS�PASSED�BY�IOI**ˆEXIT:�A7�=�STACK�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�**�A�*�R****‰INCLUDEƒTEMPLATE.IOS.AI ‰SECTION�0‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/83**ˆBIT�TEST�MACRO* BTSTM„MACRO „IFGE†\1-16‰OPT‡MEX‰BTSTW…#\1-16,\2(\3,\4) ‰OPT‡NOMEX„ENDC* „IFLT†\1-16‰OPT‡MEX‰BTSTW…#\1,\2+2(\3,\4) ‰OPT‡NOMEX„ENDC‰ENDM *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE***************„EXTERNAL�DEFINITIONS********** ‰XDEF†ASRBEG ‰XDEF†ERCOSNX ‰XDEF†FCBSIG ‰XDEF†KILIT ‰XDEF†LUTSIG ‰XDEF†DCBSIG ‰XDEF†DCBWAIT ‰XDEF†STARQS  ***************„EXTERNAL�REFERENCES**********‰XREF†GETTSKID ‰XREF†SNDFMS‰XREF†TELLFMSL ‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* INTL!*�Save�address�of�I/O�Common�(A0)*�Establish�stack�address$*�Establish�IOS�as�the�TRAP�2�server*ˆIF9*�Establishment�of�IOS�as�TRAP�2�server�was�successful�or1*�if�an�intercept�error�(RTCDDPRQ‚$06)�is�present*’THEN*—Branch�to�INTL10*ˆELSE0*�Bring�system�down�in�an�orderly�manner�(KILIT)* INTL10(*�Establish�address�of�start�of�DCB�list* INTL30*ˆIF**�DCB�examining�is�not�associated�with�IOS*’THEN*—Branch�to�INTL40*ˆELSE*�Attatch�channel*’IF#*—Channel�attatched�successfully�or#*—Channel�is�a�non-existent�channel*œTHEN*¡Branch�to�INTL36*’ELSE*—IF*œChannel�is�already�attatched*¡THEN*¦Branch�to�INTL40*—ELSE0*œBring�system�down�in�an�orderly�manner�(KILIT)* INTL360*�Save�address�of�current�DCB�in�list�processing9*�Establish�channel�id�for�possible�input�to�a�subroutine*ˆIF$*�Channel�was�attatched�successfully*’THEN*—Branch�to�INTL37*ˆELSE;*�Mark�offline�all�devices�associated�with�the�non-existent*�channel.�(BSR�MARK_OFF)**�Branch�to�INTL38.* INTL37=*�Via�a�subroutine�configure�or�obtain�status�for�all�devices1*�associated�with�the�channel�that�was�attatched.* INTL38;*�Re-establish�address�of�DCB�in�list�currently�processing.* INTL40*ˆIF!*�There�are�more�DCB's�to�process*’THEN*—Branch�to�INTL30*ˆELSE* WAITV*�Wait�for�an�event�to�occur.O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE*,IOSENTƒBRA.SƒINTLˆINITIALIZATION�JUMP�VECTOR!IOSASRƒBRA…ASRBEG†ASRŒJUMP�VECTOR ‰DC.B†'IOSD'‰DC.L†120384�4'*INTL: ‰MOVE.L„A0,A6$*œA6�=�ADDRESS�OF�I/O�COMMON�SEGMENT‰LEA‡GSEGPBLK(PC),A0/*œA0�=�ADDRESS�OF�IOS�GET�SEGMENT�PARAMER�BLOCK‰MOVE.L„#GTSEG,D0*œD0�-�DIRECTIVE�NUMBER‰TRAP†#1*œGET�IOS�DATA�SEGMENT ‰BSRNE…KILIT*œKILL�SYSTEM�IF *¦UNABLE�TO�GET�IOS�DATA�SEGMENT ‰MOVE.L„A0,A2*œA2�=�IOS�DATA�SEGMENT�ADDRESS‰MOVE.L„#TSEGSIZE,D0/*œD0�=�NUMBER�OF�BYTES�IN�DATA�SEGMENT�OBTAINEDINTL02: ‰CLR.B…(A0)+ ‰SUB.L…#1,D0 ‰BNE.S…INTL02(*œZERO�OUT�THE�IOS�DATA�SEGMENT�OBTAINED*œBRANCH�IF�NOT�DONE‰MOVE.L„A2,GSEGADDR(A2)*œA2�=�IOS�DATA�SEGMENT�ADDRESS‰MOVE.L„A6,IOCOMS(A2)!*œA6�=�I/O�COMMON�ADDRESS�SEGMENT‰LEA‡IOSTAK(A2),A7*œA7�=�STACK�ADDRESS ‰BSR‡GETASQ*œGET�ASQ�FOR�IOS ‰BSR‡TEMPLATE.*œINITIALIZE�THE�DATA�SEGMENT�OBTAINED�FOR�IOS**ˆESTABLISH�TRAP�2�SERVER*‰LEA‡SRVPRM(A2),A0*œA0�=�PARAMETER�BLOCK�ADDRESS‰MOVE.L„#S ERVER,D0*œD0�=�DIRECTIVE�NUMBER‰TRAP†#1 *œESTABLISH�IOS�AS�TRAP�2�SERVER ‰BEQ.S…INTL10&‰CMP.B…#RTCDDPRQ,D0ˆINTERCEPT�PRESENT?‰BEQ.S…INTL10ŽYES#‰BSR.SƒKILIT�ERROR�-�CAN'T�CONTINUEINTL10: ‰SUB.L…A6,A6 *œA6=ZERO*Ë***É**#***†ATTATCH�DEVICES�TO�CHANNELS¦***8****…ESTABLISH�CONFIGURATION�FOR�NON-RANDOM�DEVICES’****+***†ESTABLISH�STATUS�FOR�RANDOM�DEVICESž*****É***Ë*‰MOVE.L„IOCOMS(A2),A1"*œA1=ADDRESS�OF�I/O�COMMON�SEGMENT‰MOVE.L‚SVTDST(A1),A1*œA1=START�ADDRESS�OF�DCB�LISTINTL30ƒLEA…ATTPRMLD(A2),A0,*œA0=ADDRESS�ATTATCH�PARAMETER�BLOCK�ADDRESS‰CMP.Lƒ#IOSID,DCBDID(A1) ‰BNE.SƒINTL40,*œJMP�IF�THIS�DCB�IS�NOT�ASSOCIATED�WITH�IOS#INTL35ƒMOVE.L‚DCBCCB(A1),XIOCID(A0)‰CLR.BƒXIOKEY(A0)*œINITIALIZE�RESPECIVELY*œCHANNEL�MNEMONIC*œUNIQUE�KEY�VALUE‰MOVE.L‚#XCCMR,D0*œD0=DIRECTIVE�VALUE‰TRAP„#1*œINITIATE�TRAP�REQUEST ‰BEQ.S…INTL36*œJMP�IF�CHANNEL�ATTACHED‰CMP.Bƒ#XSTMNO,D0 ‰BEQ.SƒINTL36*œJMP�IF�NON-EXISTENT�CHANNEL‰CMP.Bƒ#RTCDDPRQ,D0 ‰BEQ.SƒINTL40**œJMP�IF�THIS�CHANNEL�ALREADY�ATTATCHED�TO *œTHIS�DRIVER ‰BSR.SƒKILIT* INTL36ƒEQU‡*‰MOVE.L‚A1,CURDCBLD(A2)(*œA1=ADDRESS�OF�DCB�CURRENTLY�PROCESSING‰MOVE.L‚DCBCCB(A1),D1%*œD1=CHANNEL�ID�ATTATCHED�TO�THIS�DCB‰CMP.Bƒ#XSTMNO,D0 ‰BNE.S…INTL37*œJMP�IF�CHANNEL�WAS�ATTATCHED ‰BSR‡MARK_OFF**œMARK�OFFLINE�ALL�DEVICES�ASSOCIATED�WITH*œTHE�NON-EXISTENT�CHANNEL ‰BRA.S…INTL38 *œCONTINUE�ONINTL37: ‰BSR…SETPERLD*œIF�OTHER�THAN�A�RANDOM�DEVICE*¦CONFIGURE�IT*œIF�A�RANDOM�DEVICE*¦OBTAIN�CURRENT�STATUSINTL38:‰MOVE.L‚CURDCBLD(A2),A1*œA1=ADDRESS�IF�DCB�PROCESSINGINTL40ƒMOVE.L‚DCBPTR(A1),A1 ‰MOVE.L‚A1,D0 ‰BNE.SƒINTL30 *œA1=ADDRESS�OF�NEXT�DCB�ON�LIST*ŸJMP�IF�MORE�DCB'S�TO�PROCESS‰MOVE.L„IOCOMS(A2),A1)*œA1�=�ADDRESS�OF�I/O�COMMON�DATA�SEGMENT‰LEA‡SVTSTCF(A1),A00*œA0�=�ADDRESS�OF�SYSTEM�TASK�CONFIGURATION�FLAG‰BSET†#BIT0,(A0))*œSET�FLAG�--�IOS�INITIALIZATION�COMPLETE ‰BRA.S…ASRBEG‰PAGE**ˆKILIT�ROUTINE*KILIT:'‰MOVEM.L�D0/A0,-(A7)‰SAVE�REG�D0�AND�A0‰ERQ.ABORT‚#0�ABORT�SELF‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>** ASRBEG4*�Read�the�next�event�in�the�que�into�location�ARQUE*ˆIF*�Error�occurred�during�read*’THEN0*—Bring�system�down�in�an�orderly�manner�(KILIT)*ˆELSE3*�Establish�packet�address�for�events�queued�to�FMS&*�Establish�address�of�event�read�(A4)+*�Isolate�the�event�code�for�the�event�read**ˆIF-*�Event�read�is�not�a�server�event�(Code�$07)*’THEN*—Branch�to�ASRB0100*ˆELSE'*�Edit�for�a�TRAP�2�type�server�request*ˆIF+*�Event�is�not�a�TRAP�2�type�server�request*‘THEN0*–Bring�system�down�in�an�orderly�manner�(KILIT)*ˆELSE*�Edit�for�EOT�notification*’IF*—EOT�notification*œTHEN*¡Branch�to�EOTSK*ˆIF*�Parameter�block�is�OK�or,*�if�a�partial�parameter�block�move�was�done*’THEN*—Branch�to�ASRB5*�IF%*’A�bad�parameter�block�address�exist*—THEN*œBranch�to�ERCPRM*ˆELSE*�Branch�to�ERCFMS.** ASRB5*<*�Establish�address�of�requestor's�IOCB�parameter�block�(A5)*ˆIF"*�This�is�a�privileged�instruction*’THEN*—Branch�to�LVL80CD*ˆELSE8*�Establish�address�of�logical�unit�table�(LUT)�[Reg�D7]A*�Establish�address�of�logical�unit�table�entery�(LUN)�within�the*’LUT�[Reg�D6]A*�Establish�address�of�device/file�control�block�(DCB/FCB)�we�are*’processing�[Reg�D5]<*�Establishment�of�D5,�D6,�D7�was�via�the�subroutine�LVL192.**ˆIF*�LUT�doesn't�exist�or*�LUN�is�not�assigned�or*�LUN�is�invalid*’THEN*—Branch�to�ASRB10*ˆIF>*�This�is�a�wild�card�parameter�block�which�indicates�that�the?*�user�had�a�device�which�does�not�conform�to�standard�VERSADOS*�configuration*’THEN*–Branch�to�SPDRVR*ˆELSE<*�Decode�the�function�code�level�command�request�of�the�user*ˆIF*�A�valid�command�request�exist*’THEN7*—Branch�to�the�logic�to�process�the�requested�function*—code�level�command*œLEVEL‚0‚LVL0CD*œLEVEL‚1‚LVL1CD*œLEVEL‚2‚LVL2 CD*œLEVEL�40‚LVL40CD*ˆELSE*�Branch�to�ERCCODO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE**ˆASYNCHRONOUS�SERVICE�ROUTINE**ˆREV.�1.00‚7/01/79�(JIM�SMITH)*-*�-ENTRY�IS�CAUSED�BY�THE�ARRIVAL�OF�AN�EVENT4*�-THE�EVENT�STRUCTURE�INCLUDES�THE�REQUESTOR'S�IOCB3*�-THE�ASQ�IS�DISABLED�UNTIL�PROCESSING�IS�COMPLETE***ˆENTRY:�A7�=�STACK�POINTER* *ˆEXIT:�A4�=�ASQ�MESSAGE�POINTER*ŽA5�=�IOCB�POINTER *ŽA6�=�ZERO*ŽA7�=�STACK�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�*�*�**�A�*…R�R�R�R�P****ASRBEG:‰MOVE.L„#GTEVNT,D0!*œD0�=�GET�EVENT�DIRECTIVE�NUMBER‰TRAP†#1 *œGET�EVENTO*------------------------------------------------------------------------------%*ˆBNE…RTNVT�ERROR�-�RETURN�FROM�EVENTO*------------------------------------------------------------------------------*<*ˆTHE�ABOVE�INSTRUCTION�HAS�BEEN�REPLACED�WITH�THE�FOLLOWING=*ˆBECAUSE�THIS�EXIT�WILL�NOT�ENABLE�THE�TRAP�2�SERVER�THUS�IT6*ˆWILL�HANG�THE�SYSTEM�FOR�ALL�SUBSEQUENT�TRAP�2�CALLS*<*ˆSO�WE�WILL�JUST�KILL�THE�SYSTEM�AS�THE�ONLY�ERROR�RETURNEDB*ˆWOULD�BE�ASQ�FULL�--�AND�WHO�EVER�IS�TRYING�TO�PUT�ONE�IN�SHOULD*ˆBE�WAITING�ANYWAY*F*ˆRECEIVING�AREA�NOT�IN�REQUESTOR'S�ADDRESS�SPACE�--�THAT�SHOULDN'T�BE** ‰BSRNE…KILIT*œKILL�SYSTEM�IF*¦ATTEMPT�TO�GET�EVENT�FAILEDO*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*‰LEA‡EVTDRV(A2),A6‰MOVE.L„A6,QEVPRM+QEVPKT(A2),*œESTABLISH�PACKET�ADDRESS�FOR�EVENTS�QUEUED*œTO�FMS ‰SUB.L†A6,A6*œA6=INDEX�REGISTER=ZERO‰LEA…ARQUE(A2),A4*œA4=ADDRESS�EVENT�READ‰MOVE.B‚EVCODE(A4),D1 ‰AND.Bƒ#$F,D1*œD1=ISOLATED�EVENT�CODEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>‰CMP.Bƒ#EVCSRV,D1 ‰BNE‡ASRB0100‰PAGE*œJMP�IF�NOT�A�SERVER�EVENT*Ë***É*****Ç***%****…PROCESSING�SERVER�EVENT�(7)¥*******Ç*****É***Ë*)‰CLR.WƒAKRPRM+ACKOPT(A2)ƒINIT�ACK�OPTIONS5‰MOVE.B‚EVUTIN(A4),D1‡PICK�UP�TRAP�INSTRUCTION�NUMBER ‰MOVE.L‚D1,D2!‰AND.Bƒ#$F,D2ŽISOLATE�TRAP�NUMBER‰CMP.Bƒ#IOSTIN,D2ŠTRAP�2�?O*------------------------------------------------------------------------------*ˆBNE…RTNVT�NO*œJMP�IF�NOT�TRAP�2O*------------------------------------------------------------------------------**C*ˆTHE�ABOVE�INSTRUCTION�HAS�BEEN�COMMENTED�OUT�SINCE�ITS�PATH�WOULD*ˆNOT�ENABLE�THE�TRAP2�SERVER**F*ˆCURRENTLY�THERE�SHOULD�NOT�BE�ANY�SERVER�EVENTS�TYPE�7�UNLESS�TRAP�2)*ˆSO�WE�ARE�JUST�GOING�TO�KILL�IT�FOR�NOW** ‰BSRNE…KILIT*œKILL�SYSTEM�IF"*¦EVENT�READ�IS�NOT�A�TRAP�2�EVENTO*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++‰BTSTƒ#EVTNEOT,D1 ‰BNE…EOTSK'*œJMP�IF�END�OF�TASK�(EOT)�NOTIFICATION**ˆCHECK�PARAMETER�BLOCK�INFO*‰TST.BƒEVUPST(A4)ŠPB�OK�?‰BEQ.SƒASRB5�YES*œJMP�IF�PARAMETER�BLOCK�OK+‰CMP.Bƒ#EVPSTBA,EVUPST(A4)�BAD�PB�ADDRESS�?‰BEQ…ERCPRMŽYES$*œJMP�IF�BAD�PARAMETER�BLOCK�ADDRESS‰CMP.B…#EVPSTPM,EVUPST(A4) ‰BEQ.S…ASRB5'*œJMP�IF�A�PARTIAL�PARAMETER�BLOCK�MOVE*œTHE�STANDARD�PB�IS�28�BYTES**œINTERNAL�I/O�CALLS�BY�STSTEM�TASKS�FOR�A2*�DATA�TX�REQUEST�COULD�FORCE�THIS�TO�BE�A�36�BYTE*�PARAMETER�BLOCK�MOVE,*œIF�THE�USER�TASK�MAKES�AN�I/O�CALL�AND�HIS)*�PB�IS�AT�THE�END�OF�HIS�DATA�SEGMENT�AN**�ATTEMPT�WILL�BE�MADE�TO�MOVE�THE�MAXIMUM'*�OF�36�BYTES�CAUSING�AN�ERROR�CONDITON#*�THAT�IS�NOT�A�TRUE�ERROR�CONDITON-*œTHE�POTENTIAL�ERROR�WILL�BE�ALLOWED�TO�PASS,*�AT�THIS�POINT�BUT�ADDITIONAL�EDITS�WILL�BE,*�MADE�LATER�ON�TO�DETERMINE�IF�A�TRUE�ERROR*�EXIST�OR�NOT ‰BRA‡ERCFMS*'*œTHERE�ARE�TWO�POSSIBLE�CONDITINS�LEFT*œERROR�CODE�3$*�PARAMETER�BLOCK�MOVE�NOT�REQUESTED+*�FOR�A�SERVER�EVENT�(7)�TRAP�2�A�PARAMETER*�BLOCK�MOVE�HAS�BEEN�REQUESTED,*œALL�PARAMETER�BLOCK�CODES�HAVE�BEEN�EDITED+*œBUT�A�MATCH�WAS�NOT�FOUND�SO�THIS�WILL�BE*œCONSIDERED�AN�ERROR�ALSO**1*œIN�EACH�OF�THE�ABOVE�CASES�WE�ARE�GOING�TO�FLAG%*œTHE�ERROR�AS�AN�INTERNAL�ERROR�(C7)2*œIF�IT�BECOMES�NECESS ARY�TO�ISOLATE�ANY�ONE�ERROR3*œMORE�SPECIFICALLY�THE�APPROPRIATE�EDIT�ALONG�WITH0*œTHE�NEW�ERROR�CODE�WILL�HAVE�TO�BE�IMPLEMENTED***ASRB5„LEA…IOCBLK(A2),A5#*œA5=ADDRESS�REQUESTOR'S�IOCB�IN�PB/‰TST.BƒIOSFCT(A5)ŠIS�THIS�PRIVILEGED�FUNCTION�?/‰BMI…LVL80CD�YES,�GO�SERVICE�LEVEL�80�FUNCTIONS‰PAGE******************Ë*#**‡A4=ADDRESS�MESSAGE�EVENT�READ¥**8***†A5=ADDRESS�OF�REQUESTOR'S�IOCB�IN�THE�EVENT�READ‘*** ****…A6=INDEX�REGISTER=ZEROª*******†A7=STACK¹*****‡D5=DCB/FCB�ADDRESS°***ˆD6=ADDRESS�LUN�IN�THE�LUTª**ˆD7=ADDRESS�OF�LUT*>*ˆCHECK�FOR�SPECIAL�PURPOSE�DRIVER�'WILD�CARD'�PARAMETER�BLOCK* ‰BSR‡LVL192*œESTABLISH�FOLLOWING*�D7=ADDRESS�LUT*�D6=ADDRESS�LUN�IN�LUT*�D5=ADDRESS�DCB ‰BNE.S…ASRB10*œJMP�IF*�LUT�DOESN'T�EXIT*�LUN�NOT�ASSIGNED *�INVALID�LUN‰BTST†#LUSFDV,LUTCSF(A6,D6.L) ‰BEQ.S…ASRB10#*œJMP�IF�LUN�ASSIGNMENT�IS�FOR�FILEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/83=*ˆBTST†#DATSPD,DCBATT(A6,D5.L)‡CHECK�IF�THIS�IS�WILD�CARD�P.B;‰BTSTM…DATSPD,DCBATT,A6,D5.LˆCHECK�IF�THIS�IS�WILD�CARD�P.B *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*‰BNE‡SPDRVR„YES�-�GO�TO�SPECIAL�PROCESSING*œJMP�IF------0*œTHE�USER�HAS�A�DEVICE�THAT�DOES�NOT�CONFORM�TO0*œSTANDARD�VERSADOS�CONFIGURATION�--�AS�SUCH�THE3*œUSER�HAS�WRITTEN�HIS�OWN�DRIVER�HANDLER�AND�WOULD*œLIKE�CONTROL�PASSED�TO�IT***/*ˆDECODE�COMMAND�CODE�AND�JUMP�TO�LEVEL�HANDLER*ASRB10ƒLEA…CMDTAB(PC),A0*œA0=ADDRESS�CMD�LEVEL�TABLE‰CLR.LƒD1’SET�UP�BIT�POINTER+‰MOVE.B‚IOSFCT(A5),D2‡PICK�UP�FUNCTION�CODE ‰BEQ.SƒASRB17*œJMP�IF�FUNCTION�CODE=0‰TST.Lƒ(A0)+�BUMP�TABLE�POINTER ASRB15ƒBTST„D1,D2�THIS�BIT�SET�?‰BEQ.SƒASRB20ŽNOASRB17ƒTST.Lƒ(A0)�VALID�LEVEL�?#‰BEQ…ERCCODŽNO,�FUNCTION�CODE�ERROR+*œJMP�IF�THE�FUNCTION�LEVEL�I/O�CODE�HAS�NO*œTRANSFER�ADDRESS‰MOVE.L‚(A0),A0(‰JMP…(A0)�JUMP�TO�FUNCTION�LEVEL�HANDLER#ASRB20ƒADD.Lƒ#1,D1�BUMP�BIT�POINTER‰TST.Lƒ(A0)+�BUMP�TABLE�POINTER‰CMP.Bƒ#8,D1�REACHED�LIMIT�?%‰BEQ…ERCCODŽYES�-�FUNCTION�CODE�ERROR‰BRA.SƒASRB15ŽNO,�CONTINUE‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* * ASRB0100**ˆIF*�This�is�a�timer�event�($04)*’THEN*—Branch�to�ASRTIM*ˆIF#*�This�is�not�a�message�event�($03)*’THEN*—Branch�to�ASRB0300*ˆIF-*�The�message�event�is�not�from�an�I/O�module*’THEN*—Branch�to�RTNVTLD*ˆIF!*�The�sub-code�is�not�an�I/O�done*’THEN*—Branch�to�ASRB0200*ˆELSE'*�Establish�address�of�the�DCB�[Reg�D5] * ASR10IO*/*�Lock�the�LUT�resources�via�subroutine�LUTWAIT/*�Lock�the�DCB�resources�via�subroutine�DCBWAIT7*�Establish�the�address�of�the�LUT�for�this�I/O�request*ˆIF=*�We�have�received�an�I/O�completion�event�for�which�there�is*�no�LUT�address*’THEN1*—Bring�system�down�in�an�orderly�manner�(X_0010)*ˆELSEC*�Establish�the�address�of�the�user's�IOCB�parameter�block�[Reg�A5]<*�Establish�the�address�of�the�LUN�entry�in�the�LUT�[Reg�D6]*ˆIFA*�The�LUN�entry�that�existed�when�the�I/O�was�initiated�no�longer*�exist*’THEN1*—Bring�system�down�in�an�orderly�manner�(X_0001)*ˆIF1*�The�I/O�request�is�not�from�a�task�level�driver*’THEN*—Branch�to�ASR35IO*ˆELSE<*�Update�status�in�user's�IOCB�parameter�block�in�the�user's*�memory�space*ˆIF3*�I/O�completion�was�not�for�a�random�access�device*’THEN*—Branch�to�ASR30IO*ˆIF4*�Completion�for�random�access�device�was�successful*’THEN*—Branch�to�ASR30IO*ˆELSE<*�Update�sector�number�that�was�bad�in�user's�IOCB�parameter*’block�in�user's�memory�space * ASR30IO:*�Update�transfer�length�in�user's�IOCB�parameter�block�in*’user's�memory�space * ASR35IO:*�Clear�the�following�flags�that�were�required�to�initiate *’the�I/O*’I/O�pending�flag�in�the�LUT*’Address�of�LUTƒin�the�DCB*’Priority‰in�the�DCB*’Device�available�in�the�DCB*ˆIF*�This�was�a�level�40�request*’THEN*—Branch�to� ASR37IO*ˆIF=*�This�was�not�a�data�transfer�request�(possible�configure�or*’device�status�request)*’THEN*—Branch�to�ASR38IO * ASR37IO*ˆIF*�I/O�request�was�a�proceed*’THEN*—Branch�to�ASR50IO * ASR38IO*ˆIF*�I/O�with�wait�was�successful*’THEN*—Branch�to�ASR40IO*ˆELSE@*�Via�the�subroutine�SETCNDIO�set�the�return�condition�for�error*’and�acknowledge�the�request*’THEN*—Branch�to�ASR60IO * ASR40IO?*�Via�the�subroutine�OKSTATIO�set�the�return�condition�for�good*’and�acknowledge�the�request*’THEN*—Branch�to�ASR60IO * ASR50IO%*�Que�an�event�to�the�requesting�task * ASR60IO*ˆIF(*�There�was�not�a�close�pending�from�FHS*’THEN*—Branch�to�ASR70IO*ˆELSE#*�Que�an�event�to�FHS�to�wake�it�up*�IF**’The�event�was�queued�successfully�to�FHS*—THEN*œBranch�to�ASR70IO*�ELSE0*’Bring�system�down�in�an�orderly�manner�(KILIT) * ASR70IO*ˆIF&*�There�are�no�request�in�the�wait�que*’THEN*—Branch�to�ASR80IO*ˆELSE9*�Remove�the�I/O�request�in�the�que�and�present�it�to�the$*’driver�via�the�subroutine�QUEDCQIO * ASR80IO0*�Via�subroutine�DCBSIG�release�the�DCB�resource0*�Via�subroutine�LUTSIG�release�the�LUT�resource*’THEN*—Branch�to�RTNVTLDO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGEO*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*Ë***É*****Ç***'****…PROCESSING�MESSAGE�EVENTS�(3)£*******Ç*****É***Ë*****ˆENTRY:„A7�=�STACK�POINTER*’A6�=�INDEX�REGISTER�=�ZERO*’A4�=�ADDRESS�EVENT�READ* *ˆEXIT:�A4�=�ASQ�MESSAGE�POINTER*ŽA5�=�IOCB�POINTER *ŽA6�=�ZERO*ŽA7�=�STACK�POINTER*ŽD5�=�DCB�POINTER*ŽD6�=�LUN�POINTER*ŽD7�=�LUT�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�*�*�**�A�*…R�R�R�R�P***Ë***É*****Ç***I****…PROCESS�MESSAGE�EVENT�(3)�FROM�IOD�-�BACKWARD�COMPATIABLE�LOGIC�*******Ç*****É***Ë*** ASRB0100:‰CMP.B…#EVCTIM,D1 ‰BEQ‡ASRTIM*œJMP�IF�A�TIMER�EVENTO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>‰CMP.Bƒ#EVCQUE,D1 ‰BNE‡ASRB0300*œJMP�IF�NOT�A�MESSAGE�EVENT‰CMP.Lƒ#IOSESS,EVQSES(A4)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>**ˆBNE‡RTNVTLDƒ++++++++++++ ‰BNE‡ASRBEG*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"*œJMP�IF�EVENT�NOT�FROM�I/O�MODULE* ITS�A�MESSAGE�TYPE�3)* BUT�ITS�NOT�FROM�AN�I/O�MODULE�SO�WE'LL* THROW�IT�AWAY ‰CMP.Bƒ#TRMEVT,EVTCOD(A4) ‰BNE‡ASRB0200*œJMP�IF�SUBCODE�NOT�I/O�DONEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>***ˆISSUE�RESOURCE�LOCKS�AND�SET�UP�POINTERS*‰MOVE.L‚EVTDCB(A4),D5*œD5=ADDRRESS�OF�DCBASR10IO:#‰BSR…LUTWAIT�GET�ACCESS�TO�LUT�LIST*œLOCK�LUT�RESOURCES#‰BSR…DCBWAIT�GET�ACCESS�TO�DCB�LIST*œLOCK�DCB�RESOURCES-‰MOVE.L‚DCBLUT(A6,D5.L),D7„SET�UP�LUT�POINTER*œD7=ADDRESS�OF�LUT ‰BSREQ…KILIT'*œJUMP�IF�WE�HAVE�RECEIVED�A�COMPLETION/*œEVENT�FOR�WHICH�WE�HAVE�NO�LOGICAL�UNIT�TABLE,*œADDRESS�--�THE�SYSTEM�WILL�BE�BROUGHT�DOWN!*œTO�ITS�KNEES�--�BUT�VERY�GENTLY+‰LEA…DCBIOS(A6,D5.L),A5„SET�UP�IOCB�POINTER+*œA5=ADDRESS�OF�I/O�PB�CONTAINED�IN�THE�DCB ‰CLR.LƒD1*‰MOVE.B‚IOSLUN(A5),D1‡SET�UP�LUN�FOR�LUNLK*œD1=LUN�FOR�I/O�JUST�COMPLETED‰BSR…LUNLK�LOOK�UP�LUN3*œD6=ADDRESS�LUN�ENTRY�IN�THE�LUT�FOR�I/O�JUST�DONE‰TST.LƒD0’TEST�RETURN#‰BSRMIƒKILIT�WOOPS�!�-�CAN'T�HAPPEN1*œIF�RESULTS�OF�TEST�ARE�NEGATIVE�KILL�THE�SYSTEM-*œTHE�LUN�ENTRY�THAT�EXISTED�WHEN�THE�I/O�WAS,*œINITIATED�IS�NOW�GONE�--�MAKES�YOU�NERVOUS *œDOESN'T�IT ‰BSR‡X01000)*œEDIT�TO�DETERMINE�IF�OLD/NEW�I/O�METHOD ‰BEQ‡ASR35IO*œJMP�IF�NEW�I/O�MEHTOD*8*ˆUPDATE�STATUS�IN�USER�MEMORY�SPACE�I/O�PARAMETER�BLOCK*&‰LEA…MOVPRM(A2),A3ŠPARAM�BLOCK�ADDRESS‰CLR.LƒMVSTSK(A3)ŠSOURCE�TASK ‰CLR.LƒMVSSES(A3)ŠSOURCE�SESSION-‰MOVE.L‚LUTTID(A6,D7.L),MVDTSK(A3)�DEST.�TASK0‰MOVE.L‚LUTSES(A6,D7.L),MVDSES(A3)�DEST.�SESSION)‰MOVE.B‚IOSSTA(A5),ONEB(A2)‚SET�UP�STATU S5‰MOVE.L‚DCBLBA(A6,D5.L),MVDADD(A3)�SET�UP�DEST.�ADDR.‰ADD.Lƒ#IOSSTA,MVDADD(A3)‰LEA‡ONEB(A2),A0$‰MOVE.L„A0,MVSADD(A3)„SOURCE�ADDRESS&‰MOVE.W‚#1,MVLENG+2(A3)‡LENGTH�OF�XFER‰LEA‡MOVPRM(A2),A0!*œA0�=�ADDRESS�OF�PARAMETER�BLOCK‰MOVE.L„#MOVELL,D0*œD0�=�DIRECTIVE�NUMBER‰TRAP†#1*œPERFORM�MOVE�LOGICAL*œSTATUS�FIELD�HAS�BEEN�UPDATED***ˆEDIT�FOR�RANDOM�DEVICE*’IF�NOT�RANDOM�DEVICE�THEN�JMP*)*’IF�RANDOM�DEVICE�AND�STATUS�OK�THEN�JMP*1*’SET�BAD�SECTOR�NUMBER�IN�REQUESTING�TASK�I/O�PB*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/83*ˆBTSTƒ#DATRAN,DCBATT(A6,D5.L)‰BTSTM‚DATRAN,DCBATT,A6,D5.L *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰BEQ.SƒASR30IO!*œJMP�IF�NOT�RANDOM�ACCESS�DEVICE‰TST.BƒIOSSTA(A5)‰BEQ.SƒASR30IO*œJMP�IF�REQUEST�WAS�SUCCESSFUL‰MOVE.W‚#4,MOVPRM+MVLENG+2(A2)‰LEA…IOSRRN(A5),A11‰MOVE.L‚A1,MOVPRM+MVSADD(A2)…RESET�SOURCE�ADDRESS)‰MOVE.L‚DCBLBA(A6,D5.L),MOVPRM+MVDADD(A2)4‰ADD.Lƒ#IOSRRN,MOVPRM+MVDADD(A2)…RESET�DEST.�ADDRESS‰LEA‡MOVPRM(A2),A0*œA0�=�PARAMETER�BLOCK�ADDRESS‰MOVE.L„#MOVELL,D0*œD0�=�DIRECTIVE�NUMBER‰TRAP†#1*œMOVE�LOGICAL"*œSET�BAD�SECTOR�ADDRESS�IN�I/O�PB*/*ˆSET�TRANSFER�LENGTH�IN�REQUESTING�TASK�I/O�PB*7ASR30IO‚MOVE.W‚#4,MOVPRM+MVLENG+2(A2)„RESET�MOVE�LENGTH‰LEA…IOSLEN(A5),A31‰MOVE.L‚A3,MOVPRM+MVSADD(A2)„RESET�SOURCE�ADDRESS)‰MOVE.L‚DCBLBA(A6,D5.L),MOVPRM+MVDADD(A2)4‰ADD.Lƒ#IOSLEN,MOVPRM+MVDADD(A2)‚RESET�DEST.�ADDRESS‰LEA‡MOVPRM(A2),A0*œA0�=�PARAMETER�BLOCK�ADDRESS‰MOVE.L„#MOVELL,D0*œD0�=�DIRECTIVE�NUMBER‰TRAP†#1*œUPDATE�TRANSFER�LENGTH�IN�PB*?*ˆHOUSEKEEP�OUTSTANDING�FLAGS�THAT�WERE�REQUIRED�TO�INITATE�I/O*ASR35IO:‰BCLRƒ#LUSFIO,LUTCSF(A6,D6.L)*œRESET�I/O�PENDING�FLAG�IN�LUT0‰CLR.LƒDCBLUT(A6,D5.L)‡CLEAR�CURRENT�LUT�POINTER,‰CLR.BƒDCBPRI(A6,D5.L)‡CLEAR�PRIORITY�IN�DCB‰CLR.WƒDCBTMO(A6,D5.L)*œSET�FLAG�-�DEVICE�AVAILABLEASR36IO:O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<***ˆNOTIFY�REQUESTING�TASK�OF�I/O�COMPLETION*4*ˆIF�NOT�A�DATA�TRANSFER�REQUEST�FORCE�I/O�WITH�WAIT*'*ˆIF�I/O�WAIT�THEN�ACKNOWLEDGE�I/O�DONE*9*ˆIF�I/O�PROCEED�THEN�QUE�AN�EVENT�TO�THE�REQUESTING�TASK*:‰CMP.B…#$40,IOSFCT(A5)�IS�THIS�A�LEVEL�40�COMMAND?‡LEVEL406‰BEQ.S…ASR37IO‰BR�=�YES,�TEST�FOR�PROCEED�MODEƒLEVEL40‰TST.B…IOSFCT(A5)‰BNE.S…ASR38IO$*œJMP�IF�NOT�A�DATA�TRANSFER�REQUEST+*�COULD�BE�A�CONFIGURE�-�DEVICE�STATUS�ETC.4ASR37IO‚MOVE.W‚IOSOPT(A5),D1‡PICK�UP�OPTIONS‘LEVEL40‰AND.Wƒ#IOPPRO,D1&‰BNE.SƒASR50IO�JMP�IF�I/O�WITH�PROCEEDASR38IO:‰TST.BƒIOSSTA(A5)$‰BEQ.SƒASR40IO�JMP�IF�I/O�SUCCESSFUL**ˆI/O�WITH�WAIT*ˆI/O�UNSUCCESSFUL*,‰BSR…SETCNDIOŒNO,�GO�SET�CC�AND�ACK.�REQUEST‰BRA.SƒASR60IO**ˆI/O�WITH�WAIT*ˆI/O�SUCCESSFUL*/ASR40IO‚BSR…OKSTATIOŒSET�OK�CC�AND�ACK.�REQUEST‰BRA.SƒASR60IO**ˆI/O�WITH�PROCEED%*ˆQUE�AN�EVENT�TO�THE�REQUESTING�TASK*?ASR50IO‚CLR.WƒQEVREQ+QEVOPT(A2)ƒCLEAR�QUEUE�EVENT�OPTIONS�FIELD8‰MOVE.L‚LUTTID(A6,D7.L),QEVREQ+QEVTSK(A2)�SET�UP�TASK�ID=‰MOVE.L‚LUTSES(A6,D7.L),QEVREQ+QEVSES(A2)�SET�UP�TASK�SESSION+‰MOVE.W‚IOSOPT(A5),D1‡PICK�UP�OPTIONS�FIELD&‰AND.Wƒ#IOPCAD,D1ŠCOMPLETION�ADDRESS�?‰BEQ.SƒASR55IO�NO2‰MOVE.L‚IOSCAD(A5),CMPADDR(A2)ƒYES,�SET�UP�ADDRESS-‰OR.W„#QVOPAS,QEVREQ+QEVOPT(A2)„SET�UP�OPTION>ASR55IO‚MOVE.L‚DCBLBA(A6,D5.L),IOCBADR(A2)‚SET�UP�IOCB�ADDRESS‰LEA‡QEVREQ(A2),A0!*œA0�=�ADDRESS�OF�PARAMETER�BLOCK‰MOVE.L„#QEVNT,D0*œD0�=�DIRECTIVE�NUMBER‰TRAP†#1 *œQUE�EVENT  *&*ˆSEND�WAKE-UP�TO�FHS�IF�CLOSE�PENDING*ASR60IO:‰BTSTƒ#LUSFCP,LUTCSF(A6,D6.L)‰BEQ.SƒASR70IO*œJMP�IF�CLOSE�NOT�PENDING‰LEAˆWUFHS(A2),A0!*œA0�=�ADDRESS�OF�PARAMETER�BLOCK‰MOVE.L„#WAKEUP,D0*œD0�=�DIRECTIVE�NUMBER‰TRAP†#1 *œWAKE�UP�FHS‰BEQ.SƒASR70IO�OK‰BSR…KILIT�SOMETHING�WRONG*#*ˆDE-QUEUE�TASKS�IN�CONNECTION�WAIT*.ASR70IO‚TST.LƒDCBDCQ(A6,D5.L)…ANYONE�IN�WAIT�?‰BEQ.SƒASR80IO�NO‰BSR …DCQWAIT�YES,�LOCK�DCQ�LIST!‰BSR…QUEDCQIOŒQUEUE�I/O�TO�DRIVER‰BSR…DCQSIGŽRELEASE�DCQ�LIST***ˆRELEASE�RESOURCE�LOCKS�AND�ENABLE�EVENTS*#ASR80IO‚BSR…DCBSIGŽRELEASE�DCB�LIST‰BSR…LUTSIGŽRELEASE�LUT�LIST*œEVERY�THING�DONE�FOR�CLEANUPO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*ˆBRA‡RTNVTLDƒ++++++++++++++ ‰BRA‡ASRBEGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*O*------------------------------------------------------------------------------‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* * ASRB0200*ˆIF9*�This�is�not�a�message�from�FHS�to�re-configure�a�device*’to�its�default�configuration*’THEN*—Branch�to�RTNVTLD*ˆELSE-*�Establish�the�address�of�the�DCB�to�process*�Lock�the�DCB�resource�list*ˆIF'*�The�DCB�we�are�processing�is�inactive*’THEN*—Branch�to�CONF10LD*ˆELSE*�Release�the�DCB�resource�list*’Branch�to�RTNVTLD * CONF10LD*�Establish�the�following*’Device�status�has�changed*’Device�is�offline!*’Device�is�in�configuration�mode*�Release�the�DCB�resource�list=*�Build�the�parameter�block�to�re-configure�the�device�to�its*’default�configuration * CONF15LD#*�Initiate�the�re-configure�request*ˆIF*�Request�was�successful*’THEN*—Branch�to�CONF20LD*ˆIF*�The�channel�is�busy*’THEN*—Branch�to�CONF15LD*ˆELSE * CONF20LD*�Branch�to�RTNVTLDO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE ASRB0200:*Ë***É*****Ç***3****…PROCESS�A�RE-CONFIGURE�EVENT�(3)�FROM�FHS—*******Ç*****É***Ë*‰CMP.B…#CFGEVT,EVTCOD(A4)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*ˆBNE‡RTNVTLDƒ++++++++++++ ‰BNE‡ASRBEGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-*œJMP�IF�NOT�MESSAGE�FROM�FHS�TO�RE-CONFIGURE *œA�DEVICE�TO�ITS�DEFAULT�VALUES *œWE�HAVE *¦MSG�EVENT*¦SENT�FROM�I/O�MODULE*œBUT�IT'S�NOT�ONE�OF�FOLLOWING*¦BACKWARD�COMPATIBLE�LOGIC"*¦A�REQUEST�FROM�FHS�TO�SET�DEV�TO*¨DEFAULT�CONFIGURATION*œSO"*¦JUST�FORGET�IT�AND�THROW�IT�AWAY‰MOVE.L„EVTDCB(A4),D5*œD5=ADDRESS�DCB�PROCESSINGI***************************************************************************ˆCONFIG**’INTERNAL�CONFIGURE�COMMAND**J*************************************************************************** ‰BSR‡DCBWAIT*œLOCK�UP�THE�DCB�LIST‰TST.W…DCBTMO(A6,D5.L)‰BEQ.S…CONF10LD*œJMP�IF�DCB�INACTIVE ‰BSR‡DCBSIG*œRELEASE�THE�DCB+*œTHIS�SHOULD�NEVER�HAPPEN�BUT�THE�EDITS�IS *œHERE�ANYWAYO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ˆBRA‡RTNVTLD ‰BRA‡ASRBEGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*&CONF10LD�BSETW…#DFLGSC,DCBFLG(A6,D5.L)‰BCLRW…#DFLGON,DCBFLG(A6,D5.L)‰BSETW…#DFLGCF,DCBFLG(A6,D5.L)&*œSET�RESPECTIVELY�THE�FOLLOWING�FLAGS*�DEVICE�STATUS�HAS�CHANGED*�DEVICE�IS�OFFLINE!*�DEVICE�IS�IN�CONFIGURATION�MODE ‰BSR‡DCBSIG*œRELEASE�THE�DCB�LIST ‰BSR‡SETP40LD**œSET�IN�PART�THE�IOCB�AND�THE�INFORMATION *œPACKET�ASSOCIATED�WITH�REQUEST"‰MOVE.L„DCBCCB(A6,D5.L),XIOCID(A0)*œSET�CHANNEL�MNEMONIC‰MOVE.W‚#IOCNFG,IOSFCT(A3)*œSET�UP�IOCB�FUNCTION�CODE‰CLR.LƒIOSOPT(A3)*œIN�THE�REQUESTOR'S�IOCB%*œCLEAR�THE�OPTIONS,LUN,STATUS�FIELDSO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�9/14/83@*ˆThe�above�instruction�CLR.LƒIOSOPT(A3)‚effectively�request�the?*ˆdriver�to�do�a�DISMOUNT�and�CONFIGURE.�Something�to�do�with�a>*ˆkluge�that�was�worked�out�some�time�ago�but�IOS�didn't�know.F*ˆWhat�is�really�wanted�is�just�a�CONFIGURE�only�request.�The�kluge�as*ˆI�understand�it�is�as�follows?*ŠCONFIGURE�REQUEST�+�(OPTIONS�FIELD�=�0)ˆ==>�CONFIGURE�+�MOUNTC*ŠCONFIGURE�REQUEST�+�(OPTIONS�FIELD�=�NON-ZERO)�==>�CONFIGURE�ONLY**D*ˆThe�CLR.L�instruction�should�not�b e�removed�as�it�clears�more�than*ˆjust�the�OPTIONS�field.**E*ˆSo�the�following�instruction�will�set�the�OPTIONS�field�to�non-zeroG*ˆthus�telling�the�driver�to�do�a�configure�only.�If�there�is�a�problemA*ˆthe�user�cann�return�to�the�original�condition�by�replacing�the#*ˆfollowing�instruction�with�a�NOP.*‰MOVE.W„#1,IOSOPT(A3)#*œSET�FLAG�TO�CONFIGURE�DEVICE�ONLY *ºBKM�9/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<CONF15LD�MOVE.L‚#XCAIO,D0"*œD0=DIRECTIVE�TO�INITIATE�REQUEST‰TRAPƒ#1*œINITIATE�THE�REQUEST‰BEQ.SƒCONF20LD*œJMP�IF�REQUEST�INITIATED‰CMP.Bƒ#XSTBSY,D0‰BEQ.SƒCONF15LD*œJMP�IF�CHANNEL�BUSY CONF20LD:O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*ˆBRA…RTNVTLD�RETURN�FROM�EVENT ‰BRA‡ASRBEGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* * CONF100L*�Lockup�the�DCB�list�resource*ˆIF-*�The�re-configuration�request�was�successful*’THEN*—Branch�to�CONF105L*ˆIF'*�Error�was�an�invalid�function�code�or*’Configuration�parameter�error*’THEN*—Branch�to�CONF110L * CONF105L,*�Remove�the�device�status�change�indication*�Set�the�device�online3*�Establish�that�device�in�in�default�configuration * CONF110LB*�Establish�that�device�is�no�longer�in�the�internal�configuration*’mode*�Release�the�DCB�list�resource*�Branch�to�RTNVTLDO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGEL*****************************************************************************3*ˆENTRY�POINT�FOR�INTERNAL�CONFIGURATION�COMPLETION*L***************************************************************************** CONF100L: ‰BSR‡DCBWAIT*œLOCK�THE�DCB�LIST‰TST.W…XRPSTV(A4)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�9/13/83‰BEQ.S…CONF105L!*œJMP�IF�SUCCESSFUL�CONFIGURATION‰CMP.W…#ISTAIF,XRPSTV(A4)‰BEQ.S…CONF110L‰CMP.W…#ISTACNF,XRPSTV(A4)‰BEQ.S…CONF110L*œJMP�IF*¡INVALID�FUNCION�CODE *¡CONFIGURATION�PARAMETER�ERRROR*œELSE-*¡TREAT�AS�A�GOOD�CONFIGURATION�(TAPE�DRIVER)&CONF105L�BCLRW…#DFLGSC,DCBFLG(A6,D5.L) *ºBKM�9/13/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰BSETW…#DFLGON,DCBFLG(A6,D5.L)&*œSET�RESPECTIVELY�THE�FOLLOWING�FLAGS(*�REMOVE�DEVICE�STATUS�CHANGE�INDICATION*�SET�DEVICE�ONLINE‰CLR.B…DCBCCF(A6,D5.L),*œSET�FLAG�-�DEVICE�IN�DEFAULT�CONFIGURATION CONF110L:‰BCLRW…#DFLGCF,DCBFLG(A6,D5.L)#*�REMOVE�IN�CONFIGURATION�MODE�FLAG ‰BSR‡DCBSIG*œRELEASE�DCB�LISTO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ˆBRA‡RTNVTLD ‰BRA‡ASRBEGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* * ASRB0300*ˆIF *�This�is�not�an�interrupt�event*’THEN*—Branch�to�RTNVTLD* IRPTLD*ˆIF,*ŒThis�is�an�unsolicited�channel�reset�event*’THEN*—Branch�to�DOWNLD*ˆIF*ŒThis�in�a�solicited�event*’THEN*—Branch�to�IPRT20LD*ˆIF9*ŒThe�unsolicited�device�status�event�has�a�device�status*’other�than�zero*’THEN*—Branch�to�RTNVTLD * IPRT20LD=*�Establish�the�address�of�the�DCB�we�are�processing�[Reg�D5]9*�Establish�the�address�of�the�requestor's�IOCB�contained *’in�the�DCB-*�Cancel�the�timer�for�this�DCB�if�one�exist.*ˆIF#*�This�is�an�unsolicited�event�type*’{Terminal�-->�Break�condition-*“Disk…-->�Transition�(Ready�<-->�Not�Ready)}*’THEN*—Branch�to�USTATLD*ˆIF!*�This�is�a�HALT/ABORT�event�type*’THEN*—Branch�to�IRP60LD*ˆIF(*�This�is�a�normal�completion�event�type*’THEN*—Branch�to�IRP35LD*ˆELSE0*�Bring�system�down�in�an�orderly�manner�(KILIT)* * IRP35LD*ˆIF+*�This�device�is�in�the�initialization�mode*’THEN*—Branch�to�SETP50LD*ˆIF3*�This�device�is�in�the�internal�configu ration�mode*’THEN*—Branch�to�CONF100LDA*�Save�the�I/O�completion�status�in�the�IOCB�contained�in�the�DCB*ˆIF(*�The�request�was�successfully�completed*’THEN*—Branch�to�ASR10IO*ˆIF4*�A�break�condition�occured�during�the�data�transfer*’THEN*—Branch�to�IRP50LD*ˆIF5*�The�device�we�are�processing�is�not�a�random�device*’THEN*—Branch�to�ASR10IO*ˆIF1*�The�random�device�is�not�on�an�IPC�disk�channel*’THEN*—Branch�to�IRPT38LD*ˆIF;*�The�random�device�went�not�ready�during�the�data�transfer*’THEN*—Branch�to�NOTRDYLD*ˆELSE* * IRPT38LD*�Branch�to�ASR10IO * IRPT40LD*ˆIF*�There�is�no�timer�to�cancel*’THEN*—Branch�to�IRPT45LD*ˆELSE*�Cancel�timer�for�this�device * IRPT45LD*�Return�to�caller * NOTRDYLD;*�Establish�that�this�device�is�offline�and�that�the�device*’status�has�changed*�Branch�to�ASR10IO * IRPT50LD*ˆIF9*�The�task�making�the�I/O�request�has�requested�exclusive*’break�notification*’THEN*–Branch�to�ASR10IO*ˆELSE*�Adjust�the�break�counter!*�Notify�the�system�break�claimer*�Branch�to�ASR10IO * IRPT60LD*ˆIF&*�This�was�not�a�halt�completion�event*’THEN*—Branch�to�RTNVTLD*ˆELSEA*�Save�the�I/O�completion�status�in�the�IOCB�contained�in�the�DCB*�Branch�to�ASR10IOO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE*Ë***É*****Ç***(****…PROCESS�AN�INTERRUPT�EVENT�(1)¢*******Ç*****É***Ë* ASRB0300:‰CMP.B…#EVCIOI,D1O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ˆBNE‡RTNVTLD ‰BNE‡ASRBEGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*œJMP�IF�NOT�AN�INTERRUPT�EVENT0*œWE�CHECKED�ALL�EVENTS�PERMITTED�AND�STRUCK�OUT*œSO�CHUCK�IT�MACK*****************************************************************************ˆINTERRUPT�SERVICE�ROUTINE**!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER* *ˆEXIT:�A4�=�ASQ�MESSAGE�POINTER*ŽA5�=�IOCB�POINTER *ŽA6�=�ZERO*ŽA7�=�STACK�POINTER*ŽD5�=�DCB�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�*�*‡R�R�R*�A�*ƒ*�R�P�R�P�P*K****************************************************************************IRPTLD:‰CMP.Bƒ#XPSUNR,XRPSTA(A4) ‰BEQ…DOWNLD-*œJMP�IF�UNSOLICITED�CHANNEL�RESET�EVENT�TYPE‰CMP.Bƒ#XPSUNS,XRPSTA(A4)‰BNE.S…IPRT20LD!*œJMP�IF�NOT�AN�UNSOLICITED�EVENT‰CMP.W…#XSTVDST,XRPSTV(A4)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ˆBNE…RTNVTLD ‰BNE‡ASRBEGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<-*œJMP�IF�THIS�UNSOLICITED�DEVICE�STATUS�EVENT)*œHAS�A�DEVICE�STATUS�OTHER�THAN�ZERO�(0) IPRT20LD:‰MOVE.L„XRPUID(A4),D5*œD5=ADDRESS�OF�DCB‰LEA…DCBIOS(A6,D5.L),A52*œA5=ADDRESS�REQUESTOR'S�IOCB�CONTAINED�IN�THE�DCB‰BSR.S…IRPT40LD(*œCANCEL�TIMER�FOR�THIS�DCB�IF�ONE�EXIST‰CMP.Bƒ#XPSUNS,XRPSTA(A4) ‰BEQ…USTATLD&*œJMP�IF�UNSOLICITED�DEVICE�EVENT�TYPE*�TERMINAL�-->�BREAK�CONDITION,*�DISK…-->�TRANSITION�-�READY�<-->�NOT�READY O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>01/15/85>>*D*ˆEdit�to�see�if�the�completion�event�is�for�a�device�attatched�to�a/*ˆtask�that�is�in�end�of�task�(EOT)�processing.*2*ˆIF�yes�then�transfer�control�to�location�IPR80LD*�ELSE *’Continue�on* ‰BTSTW…#DFLIOEOT,DCBFLG(A6,D5.L) ‰BNE‡IRP80LD-*œBRANCH�IF�I/O�COMPLETION�IS�FOR�TASK�IN�EOT *œPROCESSINGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<01/15/85<< ‰CMP.Bƒ#XPSHLT,XRPSTA(A4) ‰BEQ…IRP60LD#*œJMP�IF�HALT/ABORT�TYPE�EVENT�TYPE‰CMP.Bƒ#XPSNRM,XRPSTA(A4)‰BEQ.SƒIRP35LD0*œJMP�IF�NORMAL�COMPLETION�OF�REQUEST�EVENT�TYPE ‰BSR…KILIT*œSOCK-IT-TO-ITIRP35LD:‰BTSTWƒ#DFLGIN,DCBFLG(A6,D5.L) ‰BNE…SETP50LD&*œJMP�IF�DEVICE�IN�INITIALIZATION�MODE‰BTSTWƒ#DFLGCF,DCBFLG(A6,D5.L)‰BNE…CONF100LD%*œJMP�IF�DEVICE�IN�CONFIGURATION�MODE ‰CLR.LƒD1 ‰MOVE.W‚XRPSTV(A4),D1*œD1=STATUS�OF�REQUEST‰MOVE.B„D1,IOSSTA(A5)+*œSET�RETURN�STATUS�IN�IOS�CONTAINED�IN�DCB ‰BEQ‡ASR10IO'*œJMP�IF�REQUEST�COMPLETED�SUCCESSFULLY‰CMP.Wƒ#ISTABRK,D1‰BEQ.SƒIRP50LD,*œJMP�IF�BREAK�OCCURRED�DURING�DATA�TRANSFERO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/83*ˆBTSTWƒ#DATRAN,DCBATT(A6,D5.L)‰BTSTMƒDATRAN,DCBATT,A6,D5.L *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ‰BEQ‡ASR10IO*œJMP�IF�NON-RANDOM�DEVICEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* *ˆChange�requested�by�Marc�Briel*ˆChange�made�by�Bobby�Matthews*ˆDate�1/21/83*%‰CMP.B…#XTDIPC,DCBDKC+IOSCTP(A6,D5.L)‰BNE.S…IRPT38LD$*œIF�NOT�AN�IPC�DISK�CHANNEL,�DO�NOT*œCHANGE�DEVICE�STATUS�FLAGSO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰CMP.Bƒ#ISTANR,D1‰BEQ.SƒNOTRDYLD,*œJMP�IF�RANDOM�DEVICE�WENT�NOT�READY�DURING*œDATA�TRANSFER IRPT38LD: ‰BRA‡ASR10IO* IRPT40LD:‰BCLRW…#DFLGCT,DCBFLG(A6,D5.L)*œCLEAR�FLAG�-�CANCEL�TIMER‰BEQ.S…IRPT45LD*œJMP�IF�NO�TIMER�TO�CANCEL ‰BSR‡C_TIMER*œCANCEL�TIMER�FOR�THIS�DCB IRPT45LD:‰RTS**ˆI/O�COMPLETION***ˆDISK�NOT�READY*&NOTRDYLD�BCLRW‚#DFLGON,DCBFLG(A6,D5.L)‰BSETW‚#DFLGSC,DCBFLG(A6,D5.L)*œSET�RESPECTIVELY�FLAGS�FOR*�DEVICE�OFF�LINE*�DEVICE�STATUS�HAS�CHANGED ‰BRA‡ASR10IO**ˆSOLICITED�BREAK�HANDLER*IRP50LD‚MOVE.W‚IOSOPT(A5),D2*œD2=REQUESTOR'S�IOCB�OPTIONS‰AND.Wƒ#IOPBRK,D2 ‰BNE‡ASR10IO4*œJMP�IF�TASK�REQUESTED�EXCLUSIVE�BREAK�NOTIFICATION‰ADD.Bƒ#1,DCBBCT(A6,D5.L)*œADJUST�THE�BREAK�COUNT ‰BSR…BRAKERLD*œNOTIFY�THE�BREAK�CLAIMER ‰BRA‡ASR10IO**ˆHALT�HANDLER*IRP60LD:O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>01/10/85>>*ˆCMP.Wƒ#XSTVABT,XRPSTV(A4) *ˆBEQ…RTNVTLD *ˆBEQ‡ASRBEG,*œJMP�IF�THIS�IS�NOT�A�HALT�COMPLETION�EVENT*œWERE�OUT�OF�SYNC�BUT�ITS�OK *ˆMOVE.B„XRPSTV+1(A4),IOSSTA(A5) *œSET�THE�COMPLETION�STATUS�CODE *ˆBRA‡ASR10IO** *,*ˆA�HALT�completion�event�has�been�received.*D*ˆIf�there�was�no�I/O�to�halt�an�$82�status�will�be�returned�and�the*�the�event�can�be�ignored. @*ˆIf�there�was�an�I/O�to�halt�an�$E6�status�will�be�returned�and=*�the�event�will�be�processed�as�the�completion�event�for�the*�original�data�I/O�request. C*ˆAny�code�other�than�these�two�will�cause�the�system�to�halt�in�an*�orderly�fashion.*‰CMP.B…#ISTAIF,XRPSTV+1(A4) ‰BEQ‡ASRBEG-*œIGNORE�THIS�EVENT�--�STATUS�OF�$82�RETURNED**¡A�HALT�I/O�request�was�requested�but�the(*¡driver�indicated�that�there�was�not�an)*¡I/O�to�halt.�The�implication�being�that.*¡when�IOS�issued�the�request�it�thought�there/*¡was�an�I/O�pending�but�by�the�time�the�driver-*¡processed�the�request�a�competion�event�had+*¡already�been�sent�satisfying�the�original(*¡request,�thus�we�can�ignore�the�event. ‰CMP.B…#ISTATO,XRPSTV+1(A4) ‰BSRNE…KILIT,*œBRANCH�IF�THE�COMPLETION�STATUS�IS�NOT�$E6‰MOVE.B„XRPSTV+1(A4),IOSSTA(A5)1*œSET�THE�COMPLETION�STATUS�CODE�IN�THE�PARAMETER*œBLOCK�SAVED�IN�THE�DCB ‰BRA‡ASR10IO(*œProcess�the�USER�HALT�completion�eventO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<01/10/85<< O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>01/15/85>>*@*ˆIt�has�been�determined�that�the�completion�event�is�for�a�taskE*ˆthat�is�in�EOT�termination�therefore�the�event�will�be�thrown�away.**ˆLock�the�LUT�resource*ˆLock�the�DCB�resource<*ˆEstablish�address�of�the�LUT�entry�for�task�in�termination**ˆIF�this�is�a�NORMAL�RETURN�type�of�event!*�IF�this�was�an�I/O�wait�request*ˆTHEN"*�ACKNOWLEDGE�the�requesting�task.'*ˆIF�this�is�a�HALT/ABORT�type�of�event*�IF�there�was�an�I/O�halted!*’IF�this�was�an�I/O�wait�request*ˆTHEN"*’ACKNOWLEDGE�the�requesting�task.H*ˆDetermine�the�ad  dress�of�the�LUN�entry�the�I/O�completion�event�is�for.*ˆRemove�the�I/O�pending�flag�in�the�LUN�entry*ˆReset�the�current�LUN�pointer*ˆReset�the�priority*ˆMake�the�device�available *ˆReset�the�EOT�termination�flag*ˆRelease�the�DCB�resourceB*ˆTransfer�control�to�location�EOTS10�with�the�LUT�resource�locked*IRP80LD: ‰BSR‡LUTWAIT ‰BSR‡DCBWAIT*œRESPECTIVE�LOCK�THE*¦LUT�RESOURCE*¦DCB�RESOURCE‰MOVE.L„DCBLUT(A6,D5.L),D7*œD7�=�LUT�ADDRESS‰CMP.B…#XPSNRM,XRPSTA(A4)‰BEQ.S…IRP90LD'*œBRANCH�IF�NORMAL�RETURN�TYPE�OF�EVENT‰CMP.B…#XPSHLT,XRPSTA(A4)‰BNE.S…IRP100LD**œBRANCH�IF�NOT�A�HALT/ABORT�TYPE�OF�EVENT‰CMP.B…#ISTATO,XRPSTV+1(A4)‰BNE.S…IRP100LD*œBRANCH�IF�NO�I/O�WAS�HALTEDIRP90LD:‰LEA‡DCBIOS(A6,D5.L),A52*œA5�=�ADDRESS�OF�I/O�PARAMETER�BLOCK�SAVED�IN�DCB‰MOVE.W„IOSOPT(A5),D0‰AND.W…#IOPPRO,D0‰BNE.S…IRP100LD*œBRANCH�IF�I/O�PROCEED�REQUEST‰MOVE.B„XRPSTV+1(A4),IOSSTA(A5)/*œSET�STATUS�OF�I/O�COMPLETION�IN�I/O�PARAMETER*œBLOCK�SAVED�IN�DCB‰BEQ.S…IRP95LD*œBRANCH�IF�STATUS�WAS�GOOD ‰BSR‡SETCNDIO'*œACKNOWLEDGE�TASK�WITH�ERROR�CONDITION‰BRA.S…IRP100LD *œCONTINUEIRP95LD: ‰BSR‡OKSTATIO#*œACKNOWLEDGE�TASK�WITH�GOOD�RETURN IRP100LD: ‰LEA‡LUTBEG(A6,D7.L),A10*œA1�=�START�ADDRESS�OF�LUN�ENTRIES�FOR�THIS�LUT ‰CLR.L…D6!‰MOVE.B„DCBIOS+IOSLUN(A6,D5.L),D6*œD6�=�LUN�I/O�REQUEST�WAS�FOR‰MULU†#LUTSEG,D6(*œD6�=�OFFSET�TO�LUN�I/O�REQUEST�WAS�FOR ‰ADD.L…D6,A1 ‰MOVE.L„A1,D6-*œD6�=�ADDRESS�OF�LUN�THE�I/O�REQUEST�WAS�FOR‰BCLR†#LUSFIO,LUTCSF(A6,D6.L))*œREMOVE�THE�I/O�PENDING�BIT�FOR�THIS�LUN‰CLR.L…DCBLUT(A6,D5.L)*œCLEAR�THE�CURRENT�LUN�POINTER‰CLR.B…DCBPRI(A6,D5.L)*œCLEAR�PRIORITY�IN�DCB‰CLR.W…DCBTMO(A6,D5.L)*œMAKE�DEVICE�AVAILABLE�FOR�USE ‰BCLRW…#DFLIOEOT,DCBFLG(A6,D5.L)+*œREMOVE�FLAG�-�EOT�TERMINATION�IN�PROGRESS ‰BSR‡DCBSIG*œRELEASE�THE�DCB�RESOURCE ‰BRA‡EOTS100*œSINCE�WE�ARE�IN�EOT�TERMINATION�WE�WILL�RETURN(*œCONTROL�TO�THE�SPECIFIED�LOCATION�WITH*¡THE�LUT�RESOURCE�LOCKED*¡D7�=�ADDRESS�OF�LUT�ENTRY*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<01/15/85<<  ‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>** ASRTIM4*�Establish�address�of�DCB�that�timeout�occurred�for*ˆIF*�The�device�is�not�active*’THEN*—Branch�to�RTNVTLD&*�Set�flag�that�this�DCB�is�not�active*ˆIF *�This�timeout�should�be�ignored*’THEN*—Branch�to�RTNVTLD,*�Establish�the�LUN�for�the�I/O�to�be�halted+*�Establish�the�LUT�address�for�this�device*ˆIF*�This�is�a�valid�LUN�number*’THEN*—Branch�to�TMO_0100*ˆELSE0*�Bring�system�down�in�an�orderly�manner�(KILIT) * TMO_0100:*�Establish�the�LUN�address,�within�the�LUT,�of�the�I/O�to *’terminate*ˆIF?*�The�DCB�address�in�the�LUN�entry�matches�the�DCB�address�that*’the�timeout�occurred�for*’THEN*—Branch�to�TMO_0200*ˆELSE0*�Bring�system�down�in�an�orderly�manner�(KILIT) * TMO_02007*�Establish�the�address�of�the�I/O�halt�parameter�block1*�Via�the�subroutine�HALTIT�initiate�the�halt�I/O*ˆIF)*�The�halt�I/O�was�initiated�successfully*’THEN*—Branch�to�RTNVTLD*ˆELSE0*�Bring�system�down�in�an�orderly�manner�(KILIT)O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE*Ë***É*****Ç***#****…PROCESS�TIMEOUT�EVENT�(4)§*******Ç*****É***Ë*ASRTIM:‰MOVE.L„EVTUID(A4),D5(*œD5=ADRESS�OF�DCB�TIME�OUT�OCCURRED�FOR‰TST.W…DCBTMO(A6,D5.L)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ˆBEQ‡RTNVTLD ‰BEQ‡ASRBEGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*œJMP�IF�TIMER�NOT�ACTIVE‰CLR.W…DCBTMO(A6,D5.L)*œSET�FLAG�-�DCB�NOT�ACTIVE‰BCLRW…#DFLGIT,DCBFLG(A6,D5.L)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ˆBNE‡RTNVTLD ‰BNE‡ASRBEGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<!*œCLEAR�FLAG�-�IGNORE�TIMER�EVENT*œJMP�IF�THAT�FL  AG�WAS�SET*Ë***É*****Ç***I****…HALT�THE�I/O�THATS�STILL�IN�PROGRESS�-�THIS�IS�AN�INTERNAL�RQST�*******Ç*****É***Ë* ‰CLR.L…D1!‰MOVE.B„DCBIOS+IOSLUN(A6,D5.L),D1 ‰MOVE.L„D1,D2 *œD1=D2=LUN�FOR�I/O�TO�BE�HALTED‰MOVE.L„DCBLUT(A6,D5.L),D7#*œD7=ADDRESS�OF�LUT�FOR�THIS�DEVICE‰CMP.B…LUTMLU(A6,D7.L),D1‰BLS.S…TMO_0100*œJMP�IF�A�VALID�LUN ‰BSR‡KILIT$*œLUN�TO�CANCEL�I/O�FOR�>�7�--�AX�IT TMO_0100:‰LEA‡LUTBEG(A6,D7.L),A3-*œA3=START�ADDR�OF�THE�LUN�ENTRIES�IN�THE�LUT‰MULU†#LUTSEG,D2/*œMULTIPLY�THE�LUN�NUMBER�BY�THE�LUN�ENTRY�SIZE ‰ADD.L…D2,A3)*œA3=ADDRESS�OF�LUN�ENTRY�TO�HALT�I/O�FOR‰CMP.L…LUTDCB(A3),D5‰BEQ.S…TMO_02001*œJMP�IF�THE�DCB�ADDRESS�IN�THE�LUN�ENTRY�MATCHES/*œTHE�DCB�ADDRESS�THT�OCCURRRED�FOR�THE�TIMEOUT ‰BSR‡KILIT4*œIT�DON'T�MATCH�--�SOCK-IT-TO-IT�--�LOVE�IT�LOVE�IT TMO_0200:‰LEA‡HLTCBLD(A2),A3.*œA3=ADDRESS�OF�IOCB�TO�USE�WITH�HALT�I/O�RQST ‰BSR‡HALTIT*œINITIATE�THE�HALT�I/O ‰BSRNE…KILIT.*œKILL�SYSTEM�IF�WE�WERE�UNABLE�TO�INITATE�THE*œHALT�I/O�REQUEST ‰BRA‡ASRBEG *œCONTINUE�ON‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>** SPDRVR*ˆIF*�The�device�is�busy*’THEN*—Branch�to�ERCBSY*ˆELSE*�Set�the�device�busy>*�Via�the�subroutine�MOVEPB�move�the�requestor's�I/O�parameter*’block�to�the�DCBB*�Put�the�address�of�the�requestor's�I/O�parameter�block�contained-*’in�the�requestor's�memory�space,�in�the�DCB$*�Que�an�event�to�the�special�driver*ˆIF#*�The�event�was�queued�successfully*’THEN*—Branch�to�STARGS*ˆELSE*�Branch�to�ERCFMSO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE*;*ˆI/O�TO�DEVICE�WITH�A�SPECIAL�PURPOSE�DRIVER�AND�WILD�CARD7*ˆPARAMETER�BLOCK.�NO�PARAMETER�BLOCK�CHECKING�INVOLVED SPDRVRƒEQU‡**‰TST.W…DCBTMO(A6,D5.L)…IS�THIS�DEVICE�BUSY‰BNE‡ERCBSY„YES�-�RETURN�ERROR.‰MOVE.W„#$7FFF,DCBTMO(A6,D5.L)ˆSET�DEVICE�BUSY ‰BSR‡MOVEPB"‰MOVE.L„EVURA0(A4),DCBLBA(A6,D5.L).*œA0=ADDRESS�OF�REQUESTORS�I/O�PARAMETER�BLOCK#*ŸSAVE�THE�LOGICAL�ADDRESS�OF�A0�IN *ŸTHE�DCB*œMOVE�PARAMETER�BLOCK�TO�DCB ‰BSR‡QEVT†GO�QUE�EVENT�TO�DRIVER‰TST.B…D0ˆWAS�THERE�ANY�ERROR‰BNE‡ERCFMS„YES�-�REPORT�IT0‰BRA‡STARQS„NO�-ENABLE�ASQ�AND�RETURN�FROM�EVENT‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>** LVL0CD*ˆIF.*�We�have�an�IOCB�parameter�block�length�error*’THEN*—Branch�to�ERCPRM*ˆIF!*�There�was�no�task�name�supplied*’THEN*—Branch�to�LVL002*ˆIF-*�The�task�name�supplied�is�not�a�system�task*’THEN*—Branch�to�ERCCOD*ˆIF?*�The�system�task�does�not�have�a�session�number�of�1�(#IOSESS)*’THEN*—Branch�to�ERCCOD*ˆIF3*�The�parameter�block�size�is�less�than�the�maximum*’THEN*—Branch�to�ERCPRM* LVL002*ˆIF=*�The�reserved�field�in�the�parameter�block�field�is�not�zero*’THEN*—Branch�to�ERCCOD3*�Via�the�subroutine�LVL190�establish�the�following*’Address�of�the�LUT�[Reg�D7](*’Address�of�the�LUN�in�the�LUT�[Reg�D6]*’Address�of�the�DCB�[Reg�D5]*ˆIF&*�The�subroutine�LVL190�was�successful*’THEN*—LVL004*ˆIF*�The�LUT�does�not�exist�or*’the�LUN�is�invalid*’THEN*—Branch�to�ERCLUN*ˆELSE+*�Branch�to�ERCASG,�the�LUN�is�not�assigned* LVL004:*�Via�the�subroutine�APDCHK�validate�the�access�permission*ˆIF&*�There�was�an�access�permission�error*’THEN*—Branch�ERCKOD*3*�Via�the�subroutine�ATDCHK�validate�the�attributes*ˆIF*�The�attributes�are�valid*’THEN*—Branch�to�LVL005*ˆIF.*�There�was�a�device�function�validation�error*’THEN*—Branch�to�ERCDFE*ˆELSE9*�Branch�to�ERCKOD,�there�was�a�function�validation�error* LVL005A*�Establish�the�address�of�the�executor�table�to�process�(LVL0EX)*�Branch�to�LDF_COMNO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE**ˆLEVEL�ZERO�FUNCTION�HANDLER**ˆREV.�1.00�7/01/79�(JIM�SMITH)*2*�THIS�ROUTINE�WILL�SCAN�THE�FUNCTION�FIELD�OF�THE1*�REQUESTOR'S�IOCB�FROM�RIGHT�TO�LEFT�AND�MAP�THE/*�BIT�POSITION! �TO�A�FUNCTION�EXECUTOR�FOR�LEVEL*�ZERO�FUNCTIONS.*****!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER* *ˆEXIT:�SAME*ŽD5�=�DCB�POINTER*ŽD6�=�LUN�POINTER*ŽD7�=�LUT�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�*�*�*�*�*�R�R�R*�A�*�*ƒ*�P�P�P�P****/LVL0CDƒCMP.Bƒ#IOSBLN,EVUPSZ(A4)‚PB�LENGGTH�OK�?‰BLT…ERCPRMŽNO,�ERROR1*œJMP�IF�PB�LENGTH�LESS�THAN�STANDARD�OF�28�BYTES%‰MOVE.W‚IOSOPT(A5),D1‡PICK�UP�OPTIONS‰AND.Wƒ#IOPTSK,D1 ‰BEQ.SƒLVL002*œJMP�IF�NO�TASK�NAME�SUPPLIED ‰MOVE.B‚EVUTIN(A4),D1‡YES*ˆBTSTƒ#EVTNOS,D1!*œJMP�IF�OTHER�THAN�A�SYSTEM„TASK‰BTSTƒ#EVTNRTT,D1 ‰BEQ…ERCCOD$*œJMP�IF�OTHER�THAN�A�REAL�TIME�TASK$‰CMP.Lƒ#IOSESS,EVUSES(A4)‚I/O�TASK�?‰BNE…ERCCODŽNO,�ERROR!*œJMP�IF�SESSION�NBR�OTHER�THAN�1 ‰CMP.B…#IOSNLN,EVUPSZ(A4) ‰BLT‡ERCPRM**œJMP�IF�LESS�THAN�THE�MAXIMUM�OF�36�BYTES*�EXIST�IN�THE�PARAMETER�BLOCKLVL002ƒTST.WƒIOSLUN+1(A5) ‰BNE…ERCCOD)*œJMP�IF�RESERVE�FIELD�NOT�=�ZERO�(ERROR)*0*ˆALL�LEVEL�ZERO�FUNCTIONS�REQUIRE�ACCESS�TO�LUT* ‰BSR‡LVL190*œESTABLISH�FOLLOWING*�D7=ADDRESS�LUT*�D6=ADDRESS�LUN�IN�LUT*�D5=ADDRESS�DCB ‰BEQ.S…LVL004*œJMP�IF�REQUEST�SUCCESSFUL ‰BMI‡ERCLUN)*œJMP�IF�LUT�DOESN'T�EXIST�OR�INVALID�LUN ‰BRA‡ERCASG*œJMP�-�LUN�NOT�ASSIGNEDLVL004:*ˆVALIDATE�FUNCTION/OPTIONS*#‰BSR…APDCHKŽCHECK�ACCESS�PERMISSIONO*.............................................................................. ‰OR.L†D3,D4 ‰BEQ‡ERCKOD *œJMP�IF�ACCESS�PERMISSION�ERRORO*..............................................................................‰TST.LƒD0’TEST�RETURN‰BNE…ERCKODŽERROR‰BSR…ATDCHKŽCHECK�ATTRIBUTES‰TST.LƒD0’TEST�RETURN‰BEQ.SƒLVL005ŽOK!‰BMI…ERCDFEŽDEVICE�FUNCTION�ERROR‰BRA…ERCKODŽFUNCTION�ERROR**ˆDECODE�FUNCTION*LVL005:‰LEA…LVL0EX(PC),A0#*œA0=ADDRESS�LEVEL�0�EXECUTOR�TABLE‰BRA‡LDF_COMNŠCONTINUE(*œGO�EXECUTE�COMMON�LOGIC�TO�DECODE�THIS*œI/O�FUNCTION‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>** DXFER*ˆIF2*�The�data�transfer�device�assignment�is�to�a�file*’THEN*—Branch�to�DXF10*ˆIF-*�The�data�transfer�device�is�the�null�device*’THEN*—Branch�to�IODONE*ˆIF*�This�is�an�update�function*’THEN*—Branch�to�ERCKOD* DXF10*ˆIF>*�The�data�transfer�end�address�is�less�than�the�data�transfer*’start�address�or(*�The�data�transfer�start�address�is�odd*’THEN*—Branch�to�ERCBUF*ˆIF?*�The�data�transfer�request�is�something�other�than�output�with*’input*’THEN*—Branch�to�DXF35*ˆIF?*�The�input�address�part�of�the�output�with�input�request�meets*’any�of�the�following"*—Less�than�or�equal�start�address*—Odd*’THEN*—Branch�to�ERCBUF*ˆIF;*�The�input�length�part�of�the�output�with�input�request�is*’less�than�or�equal�to�zero*’THEN*—Branch�to�ERCBUF* DXF35*ˆIF#*�The�LUN�assignment�is�to�a�device*’THEN*—Branch�to�DXF37*ˆELSE*�Lock�the�FCB�resource�list*ˆIF)*�The�file�requested�is�not�in�use�(busy)*’THEN*—Branch�to�SNDFMS*ˆELSE*�Branch�to�DXF50* DXF37*�Lock�the�DCB�list�resource*ˆIF*�The�device�is�offline*’THEN*—Branch�to�ERCDEV*ˆIF*�The�device�status�has�changed*’THEN*—Branch�to�ERCDSC*ˆIF%*�This�is�not�a�data�transfer�request*’(Change�device�configuration)(*’(Request�current�device�configuration)*’THEN*—Branch�to�DXF39*ˆIF*�This�is�a�read�request*’THEN*—Branch�to�DXF39*ˆIF2*�We�are�trying�to�write�to�a�write�protected�disk*’THEN*—Branch�to�ERCWP* DXF39*ˆIF6*�We�are�trying�to�initiate�a�request�to�a�busy�device*’THEN*—Branch�to�DXF50*ˆElse"*�Set�the�device�to�the�busy�state7*�Establish�that�I/O�is�pending�for�this�LUN�in�the�LUT!*�Save�the�LUT�address�in�the�DCB**�Save�the�requestor's�priority�in�the�DCB.*�Save�the�requestor's�IOCB�address�in�the�DCBA*�Via�the�subroutine�MOVEPB,�move�the�requestor's�parameter�block *’to�the�DCB*ˆIF1*�The�I/O�request�is�not�fro! m�a�task�level�driver*’THEN*—Branch�to�DXF70*ˆELSEB*�Via�the�subroutine�QEVT,�queue�an�event�to�the�task�level�driver*ˆIF1*�The�event�was�queued�to�the�driver�successfully*’THEN*—Branch�to�DXF45*ˆELSE;*�Perform�following�housekeeping�to�remove�fact�that�an�I/O*’request�was�requested*’(Remove�device�busy�status*“Remove�LUT�address�from�DCB *“Clear�the�requestor's�priority8*“Remove�the�I/O�pending�status�from�the�LUN�in�the�LUT)*�Release�the�DCB�list�resource*�Branch�to�ERCFMS* DXF45*�Release�the�DCB�list�resource*ˆIF*�This�is�a�level�40�command*’THEN*—Branch�to�DXF48*ˆIF%*�This�is�not�a�data�transfer�request*’(Change�device�configuration)(*’(Request�current�device�configuration)*’THEN*—Branch�to�STARQS* DXF48*ˆIF!*�The�request�is�an�I/O�with�wait*’THEN*—Branch�to�STARQS*ˆELSE*�Release�the�LUT�list�resource*�Branch�to�OKST20* DXF50*ˆIF%*�This�is�not�a�data�transfer�request*’(Change�device�configuration)(*’(Request�current�device�configuration)*’THEN*—Branch�to�ERCB10*ˆIF>*�The�requestor�does�not�want�to�wait�for�the�device�to�become *’available*’THEN*—Branch�to�ERCBSY*ˆELSE*�Lock�the�DCQ�list�resource>*�Via�the�subroutine�QUEDCQ,�place�the�request�in�the�wait�que*�Release�the�DCQ�list�resource*ˆIF=*�We�were�unsuccessful�in�placing�the�I/O�request�in�the�wait*’que*’THEN*—Branch�to�ERCBSY*ˆELSE&*�Set�flag�I/O�pending�for�this�device&*�Set�flag�I/O�pending�in�the�wait�que*ˆIF*�The�request�is�for�a�file*’THEN*—Branch�to�DXF60*ˆELSE*�Release�the�DCB�list�resource*�Branch�to�STARQS* DFX60*�Release�the�FCB�list�resource*�Branch�to�STARQS* DFX70;*�Initialize�the�parameter�block�for�a�initiate�I/O�request'*’(Set�channel�mnemonic�for�this�device6*“Set�task�name�and�session�number�originating�the�I/O *—request'*“Set�address�of�DCB�I/O�request�is�for9*“Set�length�of�I/O�parameter�block�from�task�originating*˜the�request)@*�Via�the�subroutine�HK_TIMER,�initiate�a�timer�for�this�request* DFX80*�Initiate�the�I/O�request*ˆIF*�The�I/O�was�accepted*’THEN*—Branch�to�DXF45*ˆIF*�The�channel�is�busy*’THEN*—Branch�to�DXF80*ˆELSE0*�Bring�system�down�in�an�orderly�manner�(KILIT)*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE**ŠDATA�TRANSFER�EXECUTOR**ŠREV.�1.00�7/01/79�(JIM�SMITH)*)*�THIS�IS�THE�DATA�TRANSFER�EXECUTOR.‚THE1*�APPROPRIATE�DRIVER�IS�SCHEDULED�FOR�INITIATION.*****!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�*�*�*…P�P�P*�A�*�*ƒ*�P�P�P�P****8DXFER„MOVE.B‚LUTCSF(A6,D6.L),D1„D1=CURRENT�STATUS�OF�LUN$‰BTSTƒ#LUSFDV,D1‹DEVICE�ASSIGNMENT�?‰BEQ.SƒDXF10�NO$*œJMP�IF�LUN�ASSIGNMENT�IS�TO�A�FILE5‰CMP.Bƒ#255,DCBFLG(A6,D5.L)‚IS�THIS�THE�NULL�DEVICE�?%‰BEQ…IODONEŽYES,�GO�RETURN�LIKE�A�NOP+‰CMP.Wƒ#IOUPDR,IOSFCT(A5)‚UPDATE�FUNCTION�?‰BEQ…ERCKODŽYES,�ERROR**ˆVALIDATE�BUFFER�ADDRESSES*2DXF10„MOVE.L‚IOSEAD(A5),D1‡D1=START�BUFFER�ADDRESS"‰CMP.LƒIOSSAD(A5),D1‡RANGE�VALID�?‰BLT…ERCBUFŽNO,�ERROR$*œJMP�IF�END�ADDRESS�<�START�ADDRESSDXF30„MOVE.L‚IOSSAD(A5),D1‰BTSTƒ#0,D1�ODD�ADDRESS�?‰BNE…ERCBUFŽYES,�ERROR(*œJMP�IF�START�ADDRESS�IS�ON�ODD�BOUNDRY‰CMP.Wƒ#IOOWIN,IOSFCT(A5) ‰BNE.SƒDXF35%*œJMP�IF�OTHER�THAN�OUTPUT�WITH�INPUT.‰MOVE.L‚IOSRRN(A5),D1ˆYES,�CHECK�INPUT�ADDRESS*œD1=INPUT�(READ)�ADDRESS‰BLE…ERCBUFŽBAD�ADDRESS‰BTSTƒ#0,D1�ODD�ADDRESS�?‰BNE…ERCBUFŽYES,�ERROR$‰TST.L…IOSLEN(A5)ŠCHECK�INPUT�LENGTH‰BLE‡ERCBUFŽBAD�LENGTH%*œJMP�IF�INPUT�DATA�LENGTH�IS�INVALID***ˆGET�ACCESS�TO�DCB�IF�A�DEVICE�ASSIGNMENT*DXF35:‰BTSTƒ#LUSFDV,LUTCSF(A6,D6.L) ‰BNE.SƒDXF37&*œJMP�IF�LUN�ASSIGNMENT�IS�TO�A�DEVICE ‰BSR…FCBWAIT*œLOCK�THE�FCB�LIST‰BTSTƒ#FCFLBB,FCBFLG(A6,D5.L) ‰BEQ…SNDFMS*œJMP�IF�FIL" E�NOT�IN�USE�(BUSY) ‰BRA…DXF50*œJMP�--�FILE�IS�IN�USEDXF37: ‰BSR…DCBWAIT*œLOCK�THE�DCB�LIST‰MOVE.W‚DCBFLG(A6,D5.L),D1*œD1=DCB�STATUS‰BTSTƒ#DFLGON,D1 ‰BEQ…ERCDEV*œJMP�IF�DEVICE�IS�OFFLINE‰BTSTƒ#DFLGSC,D1 ‰BNE…ERCDSC"*œJMP�IF�DEVICE�STATUS�HAS�CHANGED‰TST.B…IOSFCT(A5) ‰BNE.S…DXF39$*œJMP�IF�NOT�A�DATA�TRANSFER�REQUEST!*žCHANGE�THE�DEVICE�CONFIGURATION)*žREQUST�THE�CURRENT�DEVICE�CONFIGURATION‰CMP.Wƒ#IOREAD,IOSFCT(A5) ‰BEQ.SƒDXF39*œJMP�IF�READ�REQUEST‰BTSTƒ#DFLGWP,D1 ‰BNE…ERCWP4*œJMP�IF�TRYING�TO�WRITE�TO�A�WRITE�PROTECTED�DEVICEDXF39„TST.WƒDCBTMO(A6,D5.L) ‰BNE.SƒDXF50)*œJMP�IF�TRYING�TO�WRITE�TO�A�BUSY�DEVICE‰MOVE.W‚#$7FFF,DCBTMO(A6,D5.L)*œSET�DEVICE�BUSY‰BSETƒ#LUSFIO,LUTCSF(A6,D6.L))*œSET�I/O�PENDING�FOR�THIS�LUN�IN�THE�LUT‰MOVE.L‚D7,DCBLUT(A6,D5.L) *œSET�THE�LUT�ADDRESS�IN�THE�DCB"‰MOVE.B‚EVUPRI(A4),DCBPRI(A6,D5.L)"‰MOVE.L„EVURA0(A4),DCBLBA(A6,D5.L)*œSET�RESPECTIVELY�FOLLOWING*žREQUESTOR'S�PRIORITY*žADDRESS�REQUESTOR'S�IOCB ‰BSR‡MOVEPB*œMOVE�PARAMETER�BLOCK�TO�DCBO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ‰BSR‡X01000*œEDIT�FOR�OLD/NEW�I/O�SCHEME ‰BEQ‡DXF70*œJMP�IF�NEW�I/O�SCHEMEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"‰BSR‡QEVT†GO�QUEUE�EVENT�TO�DRIVER‰TST.B…D0ˆWAS�THERE�ANY�ERROR‰BEQ.S…DXF45…NO*œJMP�IF�EVENT�QUEUED�TO�DRIVER**œUNABLE�TO�QUE�EVENT�TO�DRIVER*œWILL�CLEAN�UP�FLAGS,ETC*œTHAT�WERE�SET�TO�INITIATE�I/O*‰CLR.WƒDCBTMO(A6,D5.L)‡YES-UNDO�EVERYTHING*œREMOVE�DEVICE�BUSY�FLAG(‰CLR.LƒDCBLUT(A6,D5.L)‡CLEAR�LUT�ADDRESS,*œREMOVE�POINTER�TO�LOGICAL�UNIT�TABLE�(LUT)%‰CLR.BƒDCBPRI(A6,D5.L)‡CLEAR�PRIORITY*œREMOVE�PRIORITY�FLAG-‰MOVE.B‚LUTCSF(A6,D6.L),D1„PICK�UP�LUN�STATUS"‰BCLRƒ#LUSFIO,D1‹CLEAR�I/O�PENDING,‰MOVE.B‚D1,LUTCSF(A6,D6.L)„UPDATE�LUN�STATUS&*œREMOVE�I/O�PENDING�FLAG�FOR�THIS�LUN ‰BSR…DCBSIG*œRELEASE�THE�DCB�LIST‰BRA…ERCFMSŽINTERNAL�ERRORDXF45: ‰BSR…DCBSIG*œRELEASE�THE�DCB�LIST:‰CMP.B…#$40,IOSFCT(A5)�IS�THIS�A�LEVEL�40�COMMAND?‡LEVEL405‰BEQ.S…DXF48‹BR�=�YES,�ALLOW�PROCEED�MODE�I/O‚LEVEL40*‰TST.B…IOSFCT(A5) ‰BNE‡STARQS$*œJMP�IF�NOT�A�DATA�TRANSFER�REQUEST!*žCHANGE�THE�DEVICE�CONFIGURATION)*žREQUST�THE�CURRENT�DEVICE�CONFIGURATIONDXF48:‰MOVE.W‚IOSOPT(A5),D1¦LEVEL40‰AND.Wƒ#IOPPRO,D1*œD1=ISOLATED�I/O�OPTIONS ‰BEQ…STARQS'*œJMP�IF�REQUESTING�TASK�IS�WAITING�FOR*œI/O�COMPLETIONDXF49: ‰BSR…LUTSIG*œRELEASE�LUT�LIST ‰BRA…OKST20*œACKNOWLEDGE�REQUEST**ˆDEVICE/FILE‚BUSY*DXF50:‰TST.B…IOSFCT(A5) ‰BNE‡ERCB10$*œJMP�IF�NOT�A�DATA�TRANSFER�REQUEST!*žCHANGE�THE�DEVICE�CONFIGURATION)*žREQUST�THE�CURRENT�DEVICE�CONFIGURATION‰MOVE.W‚IOSOPT(A5),D1%*¤D1=USER�REQUEST�OPTIONS�FROM�I/O�PB1‰AND.Wƒ#1<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* * HK_TIMER*ˆIF-*�The�I/O�request�is�configuration�related�or:*�The�device�for�which�the�I/O�is�intended�in�not�haltable*’THEN*—Branch�to�HKT_0100*ˆIF8*�The�device�for�which�the�I/O�is�intended�is�other�than *’interactive*’THEN*—Branch�to�HKT_005*ˆELSE*�Initialize�the�BREAK�counter * HKT_0053*�Force�the�time�out�value�to�be�for�a�read�request*ˆIF.*�The�request�is�for�a�transmit�break�function*’THEN*—Branch�to�HKT_0010*ˆIF)*�The�request�is�not�for�a�write�function*’THEN*—Branch�to�HKT_0050 * HKT_00101*�Set�the�timeout�value�to�be�for�a�write�request * HKT_0050*ˆIF8*�There�is�no�timeout�value�associated�with�this�request*’THEN*—Branch�to�HKT_0100*ˆELSE8*�Via�the�subroutine�R_TIMER,�initiate�the�timer�request * HKT_0100'*�House�keep�for�the�next�timer�request*�Return�to�the�caller*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE*Ë***‡ROUTINE�TO¸*****�SET�TIMEOUT�VALUE¦*******�REQUEST�TIMER©*******†UNLESS»***%**ŽDEVICE�IS�A�NON-HALTALBE�DEVICEœ**-*�REQUEST�IS�A�CHANGE�CONFIGURATION�REQUEST“*:**ŽREQUEST�IS�A�OBTAIN�CONFIGURATION�INFORMATION/STATUS‡**2***�REQUEST�IS�A�CHANGE�DEFAULT�CONFIGURATIONS�***$****ŒTHERE�IS�NO�TIME�OUT�VALUEŸ*******Ç*****É***Ë* *ˆINPUT¾* *’A6=ZERO²***‘D5=DCB�ADDRESSª**.***�A5=ADDRESS�REQUESTOR'S�IOCB�IN�THE�DCB‘*** ****Å*******Ç*****É***Ë* HK_TIMER:‰CMP.W…#IOCNFG,IOSFCT(A5)‰BEQ.S…HKT_0100‰CMP.W…#IOSTAT,IOSFCT(A5)‰BEQ.S…HKT_0100‰CMP.W…#IOCHDC,IOSFCT(A5)‰BEQ.S…HKT_0100*œJMP�IF�ONE�OF�FOLLOWING*�CHANGE�CONFIGURATION�REQUEST#*�REQUEST�CONFIGURATION�INFO/STATUS*�CHANGE�DEFAULT�CONFIGURATIONO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/83*ˆBTSTW…#DATHIO,DCBATT(A6,D5.L)‰BTSTM…DATHIO,DCBATT,A6,D5.L *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰BEQ.S…HKT_0100*œJMP�IF�A�NON-HALTABLE�DEVICEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/83*ˆBTSTW…#DATIND,DCBATT(A6,D5.L)‰BTSTM…DATIND,DCBATT,A6,D5.L *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰BEQ.S…HKT_005)*œJMP�IF�OTHER�THAN�AN�INTERACTIVE�DEVICE‰CLR.B…DCBBCT(A6,D5.L)*œINITIALIZE�BREAK�COUNTHKT_005:O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *°BKM�7/7/83!*ˆMOVE.L„DCBTMR(A6,D5.L),TIMVALLD ‰MOVE.L„D5,A6‰MOVE.L„DCBTMR(A6),TIMVALLD(A2) ‰SUB.L…A6,A6 *°BKM�7/7/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*œTIMVALLD=READ�TIMEOUT�VALUE *œFORCE�A�READ�TIMEOUT�VALUE�FOR*�READ�FUNCTION*�WRITE�WITH�READ�FUNCTION‰CMP.W…#IOTBRK,IOSFCT(A5)‰BEQ.S…HKT_0010 *œJMP�IF�TRANSMIT�BREAK�FUNCTION‰CMP.W…#IOWRIT,IOSFCT(A5)‰BNE.S…HKT_0050"*œJMP�IF�NOT�A�WRITE�ONLY�FUNCTION HKT_0010:O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *°BKM�7/7/83!*ˆMOVE.L„DCBTMW(A6,D5.L),TIMVALLD ‰MOVE.L„D5,A6‰MOVE.L„DCBTMW(A6),TIMVALLD(A2) ‰SUB.L# …A6,A6 *°BKM�7/7/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*œTIMVALLD=WRITE�TIMEOUT�VALUE HKT_0050:‰TST.L…TIMVALLD(A2)‰BEQ.S…HKT_0100.*œJMP�IF�NO�TIMEOUT�VALUE�ASSOCIATED�WITH�RQST ‰BSR‡R_TIMER*œINITIATE�A�TIMER�REQUEST HKT_0100:‰CLR.L…TIMVALLD(A2)*œINITIALIZE�FOR�NEXT�REQUEST‰RTS‰PAGE*Ë**ˆENTRY*’A4=ADDR�ASQ�MSG�EVENT*’A5=ADDRESS�IOCB�IN�EVENT *’A6=ZERO*’A7=STACK�ADDRESS*’D5=ADDRESS�DCB�PROCESSING!*’D6=ADDRESS�LUN�ENTRY�IN�THE�LUT*’D7=ADDRESS�LUT*M*----------------------------------------------------------------------------*Ë***É*****Ç*******…TRANSMIT�BREAK�LOGIC¬*******Ç*****É***Ë* TX_BREAK: ‰BRA‡UDVC_CFG‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>** QEVT6*�Establish�the�following�in�the�event�parameter�block*ŽEvent�sub-code*ŽDriver�task�ID *ŽDCB�address* QEV10*�Send�the�event�to�the�driver*ˆIF!*�The�event�was�sent�successfully*’THEN*—Branch�to�QEV40*ˆIF*�The�ASQ�is�disabled*’THEN*—Branch�to�QEV20*ˆIF"*�The�error�is�other�than�ASQ�full*’THEN*—Branch�to�QEV30*ˆELSE* QEV20*�Delay�for�a�while*’THEN*—Branch�to�QEV10* QEV30&*�Establish�error�condition�for�return* QEV40*�Return�to�caller*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<* *ˆROUTINE�TO+*’OBTAIN�TASK�ID�FOR�FOR�TASK�LEVEL�DRIVERS**ˆINPUT!*’A2�=�ADDRESS�OF�IOS�DATA�BUFFER *’A6�=�ZERO* *’D5�=�ADDRESS�OF�DCB�PROCESSING*6*’QEVDRV+�QEVTSK�=�FIRST‚HALF�OF�TASK�ID‚(TCB�ADDRESS)8*’QEVDRV+�QEVSES�=�SECOND�HALF�OF�TASK�ID‚(PROCESSOR�ID)**ˆREGISTER�ALTERATION**’A0�=�DESTROYED*’D0�=�DESTROYED**’A0�=�FIRST�HALF* DRVTSKID:‰MOVE.L„A1,-(A7)*œSAVE�REGISTER‰LEA‡GPBUFR(A2),A0‰MOVE.L„DCBDID(A6,D5.L),A1‰MOVE.L„#IOSESS,D0.*œESTABLISH�PARAMETERS�FOR�GET�TASK�ID�ROUTINE"*œA0�=�GET�TASK�ID�PARAMETER�BLOCK*œA1�=�TASK�NAME*œD0�=�TASK�SESSION�NUMBER ‰BSR‡GETTSKID*œOBTAIN�DRIVER�TASK�ID ‰BSRNE…KILIT1*œBRING�SYSTEM�DOWN�IF�THIS�DRIVER�DOES�NOT�EXIST‰MOVE.L„A0,QEVDRV+QEVTSK(A2)‰MOVE.L„A1,QEVDRV+QEVSES(A2)*œSET�RESPECTIVELY *�TASK�NAME*�PROCESSOR�ID*‰MOVE.L„(A7)+,A1*œRESTORE�REGISTER‰RTS*œRETURN�TO�CALLER  ***ˆQUEUE�EVENT�TO�DRIVER**ˆINPUT!*’D5=ADDR�OF�THE�DCB�FOR�THIS�LUN QEVT:„EQU‡**‰MOVE.B‚#DRVEVT,SUBEVC(A2)‚SET�UP�SUB-CODE)‰MOVE.L‚D5,DCBADDR(A2)†SET�UP�DCB�ADDRESSO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*@*ˆMOVE.L‚DCBDID(A6,D5.L),QEVDRV+QEVTSK(A2)‚SET�UP�DRIVER�TASK�ID*‰BSR.S…DRVTSKID*œOBTAIN�DRIVER�ID*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<QEV10:‰LEA‡QEVDRV(A2),A0!*œA0�=�ADDRESS�OF�PARAMETER�BLOCK‰MOVE.L„#QEVNT,D0*œD0�=�DIRECTIVE�NUMBER‰TRAP†#1*œQUE�EVENT�TO�DRIVER‰BEQ.SƒQEV40�OK"‰CMP.Bƒ#RTCDENAB,D0ŠASQ�DISABLED�?‰BEQ.SƒQEV20�YES‰CMP.Bƒ#RTCDTFUL,D0ŠASQ�FULL�?‰BNE.SƒQEV30�NOQEV20ƒERQ.DELAY‚#100�DELAY‰BRA.S…QEV10…TRY�AGAINQEV30„MOVE.L„#1,D0…SET�ERROR *œCONDITIONS *¦ASQ�ENABLED*¦ASQ�NOT�FULL*¦ERROR�STILL�EXISTS** QEV40„RTS‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>** MOVEPB*�Save�registers5*�Initialize�the�parameter�block�contained�in�the�DCB*ˆIF<*�The�parameter�block�size�is�smaller�than�the�standard�size*’THEN*—Branch�to�MOVE05*ˆELSE-*�Establish�the�standard�parameter�block�size* MOVE05"*�Establish�the�address�to�move�to%*�Move�the�parameter�block�to�the�DCB*�Restore�registers*�Return�to�caller*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<***ˆMOVE�PARAMETER�BLOCK�ROUTINE.*’THIS�MOVE�IS�FROM�THE�IOS�WORK�AREA�(IOCBLK) *’TO�THE�DCB**ˆINPUT"*’A5=ADDRESS�OF�REQUESTING�TASK�PB**MOVEPB:)‰MOVEM.LƒA5-A6,-(A7)‰SAVE�THESE�REGISTERS4‰C# LR.B…IOCBLK+IOSSTA(A2)ƒCLEAR�STATUS�IN�IOCB�OF�DCB3‰MOVE.B„EVUPSZ(A4),D1ŠGET�PAR�BLOCK�SIZE�FROM�EVENT*‰CMP.B…#IOSBLN,D1ŠSTANDARD�PAR�BLOCK�SIZE?‰BMI.S„MOVE05„NO�-�SMALLER&*œJMP�IF�PB�SIZE�SMALLER�THAN�STANDARD.‰MOVE.L„#IOSBLN,D1ŠYES�STANDARD�SIZE�PAR�BLOCK*œD1=STANDARD�PB�SIZE MOVE05ƒEQU‡*‰MOVE.L„D5,A6…GET�DCBADDR-‰ADD.L…#DCBIOS,A6ŠADD�OFFSET�TO�IOCB�LOCATION*œA6=ADDRESS�MOVE�TO MOVE10ƒEQU‡*‰MOVE.B„(A5)+,(A6)+‰MOVE�A�BYTE‰SUB.B…#1,D1…DECREMENT�COUNT!‰BNE.S…MOVE10„CONTINUE�UNTIL�DONE*œMOVE�THE�PARAMETER�BLOCK&‰MOVEM.Lƒ(A7)+,A5-A6‰RESTORE�REGISTERS ‰RTS‘RETURN‰PAGE*ŠDELETE�RECORD�EXECUTOR* *ŠREV.�1.00�10/15/79�(JIM�SMITH)*3*�THIS�IS�A�FILE�MANAGEMENT�DELETE�RECORD�EXECUTOR.)*�THE�FILE�MANAGEMENT�SYSTER�IS�NOTIFIED.***!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�*�*‡P�P�P*�A�*�*…P�P�P�P****DELREC:‰BTSTƒ#LUSFDV,LUTCSF(A6,D6.L) ‰BNE…ERCKOD"*œJMP�IF�DEVICE�ASSIGNMENT�(ERROR)‰BSR…FCBWAIT�LOCK�FCB�LIST‰BRA…SNDFMSŽNO,�GO�TELL�FMS‰PAGE**ˆFORMAT�DISK�EXECUTOR* *ŠREV.�1.00�02/01/80�(JIM�SMITH)* *�THIS�IS�A�FORMAT�DISK�ROUTINE.***!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�*�*‡P�P�P*�A�*�*…P�P�P�P****'FORMATƒBRA…DXF35�USE�DATA�TRANSFER�CODE‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>** LVL1CD*ˆIF"*�There�is�a�parameter�block�error*’THEN*—Branch�to�ERCPRM*ˆIF%*�There�is�a�reserved�field�violation*’THEN*—Branch�to�ERCCOD4*�Via�the�subroutine,�LVL190�establish�the�following*ŽLUT�address�[Reg�D7]*ŽLUN�address�[Reg�D6]*ŽDCB�address�[Reg�D5]*ˆIF#*�Sub-routine�LVL190�was�successful*’THEN*—Branch�to�LVL100*ˆIF$*�There�was�no�LUT�for�the�device�or*�The�LUN�was�invalid*’THEN*—Branch�to�ERCLUN*ˆELSE*�Branch�to�ERCASG* LVL1007*�Validate�access�permission,�via�the�subroutine�APDCHK*ˆIF%*�There�is�an�access�permission�error*’THEN*—Branch�to�ERCKOD@*�Validate�the�device/file�attributes,�via�the�subroutine�ATDCHK*ˆIF$*�The�attributes�validation�was�good*’THEN*—Branch�to�LVL105*ˆIF#*�There�was�a�device�function�error*’THEN*—Branch�to�ERCDFE*ˆELSE*�Branch�to�ERCKOD** LVL105>*�Establish�the�address�of�the�Level�Executor�table�processing *’[Reg�A0]*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE**ˆLEVEL�ONE�FUNCTION�HANDLER**ˆREV.�1.00‚7/01/79�(JIM�SMITH)*2*�THIS�ROUTINE�WILL�SCAN�THE�FUNCTION�FIELD�OF�THE1*�REQUESTOR'S�IOCB�FROM�RIGHT�TO�LEFT�AND�MAP�THE/*�BIT�POSITION�TO�A�FUNCTION�EXECUTOR�FOR�LEVEL*�ONE�FUNCTIONS.**!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER* *ˆEXIT:�SAME*ŽD5�=�DCB�POINTER*ŽD6�=�LUN�POINTER*ŽD7�=�LUT�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�*�*�*�*�*�R�R�R*�A�*�*ƒ*�P�P�P�P***’PARAMETER�BLOCK�EDIT**.LVL1CDƒCMP.Bƒ#IOSBLN,EVUPSZ(A4)‚PC�LENGTH�OK�?‰BLT…ERCPRMŽNO,�ERROR%*œJMP�IF�PARAMETER�BLOCK�LENGTH�ERROR)‰TST.WƒIOSLUN+1(A5)ˆRESERVED�FIELD�ZERO�?‰BNE…ERCCODŽNO,�ERROR*œJMP�IF�RESERVE�FIELD�ERROR ‰BSR.S…LVL190 *œESTABLISH *�LUT�ADDRESS*�LUN�ADDRESS�IN�LUT *�DCB�ADDRESS ‰BEQ.S…LVL100*œJMP�IF�SUCCESSFUL ‰BMI‡ERCLUN*œJMP�IF�NO�LUT�OR�INVALID�LUN ‰BRA‡ERCASG*œJMP�--�LUN�NOT�ASSIGNEDLVL100:**ˆVALIDATE�FUNCTION/OPTIONS*O*------------------------------------------------------------------------------*-----G*-----ƒTHE�FOLLOWING�INSTRUCTIONS�HAVE�BEEN�REMOVED�AS�THIS�CALL�IS�NOTJ*-----ƒREQUIRED�FOR�LEVEL�1�FUNCTION�BECAUSE�THERE�IS�NO�ACCESS�PERMISSION*-----ƒASSOCIATED�WITH�THEM*-----*-----)*-----ƒBSR…APDCHKŽCHEC$ K�ACCESS�PERMISSION*-----ƒTST.LƒD0’TEST�RETURN*-----ƒBNE…ERCKODŽERROR*-----O*------------------------------------------------------------------------------‰BSR…ATDCHKŽCHECK�ATTRIBUTES‰TST.LƒD0’TEST�RETURN‰BEQ.SƒLVL105ŽOK!‰BMI…ERCDFEŽDEVICE�FUNCTION�ERROR‰BRA…ERCKODŽFUNCTION�ERROR**ˆDECODE�FUNCTION*LVL105:‰LEA…LVL1EX(PC),A0&*œA0=ADDRESS�OF�LEVEL�1�EXECUTOR�TABLE‰CMP.B…#2,IOSFCT(A5)‰BNE.S…LDF_COMN**œJMP�IF�PROCESSING�LEVEL�1�EXECUTOR�TABLE‰LEA‡LVL2EX(PC),A0&*œA0=ADDRESS�OF�LEVEL�2�EXECUTOR�TABLE‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* * LDF_COMN8*�Establish�bit�number�to�start�processing�with�[Reg�D0]7*�Isolate�the�Function�Command�Code�for�the�I/O�request* LVL110*ˆIF**�This�bit�of�the�function�code�is�not�set*’THEN*—Branch�to�LVL120*ˆIF9*�More�than�one�function�selected�for�this�I/O�request�or.*�If�this�is�not�a�valid�Function�Command�Code*’THEN*—Branch�to�ERCKOD*ˆELSE6*�Jump�to�desired�Function�Code�so�it�can�be�performed* LVL1206*�Adjust�to�the�next�table�entry�in�the�executor�table(*�Adjust�to�the�next�bit�to�be�processed*ˆIF=*�The�maximum�number�of�Functions�Codes�permitted�is�exceeded*’THEN*—Branch�to�ERCKOD*ˆELSE*�Branch�to�LVL110*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE*/*ˆCOMMON�LOGIC�TO�DECODE�THE�I/O�LEVEL�FUNCTION* LDF_COMN: ‰CLR.L…D1*œD1=BIT�NUMBER�PROCESSING‰MOVE.W‚IOSFCT(A5),D2‰AND.Wƒ#$FF,D2*œD2=ISOLATED�COMMAND�CODELVL110ƒBCLR„D1,D2 ‰BEQ.SƒLVL120!*œJMP�IF�BIT�NOT�SET�(EQUAL�ZERO) ‰TST.WƒD2 ‰BNE…ERCKOD(*œJMP�IF�MORE�THAN�ONE�FUNCTION�SELECTED ‰TST.Lƒ(A0) ‰BEQ…ERCKOD$*œJMP�IF�THIS�IS�AN�INVALID�FUNCTION‰MOVE.L‚(A0),A0 ‰JMP…(A0)3*œJMP�TO�THE�DESIRED�FUNCTION�SO�IT�CAN�BE�EXECUTEDLVL120ƒTST.Lƒ(A0)+*œADJUST�TO�NEXT�TABLE�ENTRY ‰ADD.Bƒ#1,D1*œADJUST�TO�NEXT�BIT�TO�EXAMINE ‰CMP.Bƒ#8,D1 ‰BEQ…ERCKOD0*œJMP�IF�MAX�NBR�OF�FUNCTIONS�PERMITTED�EXCEEDED ‰BRA.SƒLVL110*œHERE�WE�GO�LOOP�DE�LOOP‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>** LVL190*�Lock�the�LUT�resource�list* LVL192,*�Establish�address�of�task�making�task�(A0)A*�Via�the�subroutine,�LUTLK�establish�the�address�of�the�LUT�(D7)*ˆIF)*�There�is�no�LUT�for�the�requesting�task*’THEN*—Branch�to�LVL194*ˆELSE(*�Establish�the�LUN�for�this�I/O�requestC*�Via�the�susbroutine,�LUNLK�find�the�LUN�entry�and�the�DCB�address*ˆIF*�The�LUN�is�invalid*’THEN*—Branch�to�LVL194*ˆIF*�The�LUN�is�not�assigned*’THEN*—Branch�to�LVL196*ˆELSE4*�Establish�conditions�codes�for�a�successful�return*�Return�to�the�caller* LVL194+*�Establish�return�for�one�of�the�following*’No�LUT *’Invalid�LUN*’THEN*—Return�to�the�caller* LVL196'*�Establish�return�for�LUN�not�assigned*�Return�to�the�caller*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE*Ë***‡ROUTINE�TO¸*****�ESTABLISH�LUT�ADDRESS¢********�ESTABLISH�LUN�ADDRESS�IN�THE�LUT–*******�ESTABLISH�DCB�ADDRESS¢*****É** *ˆINPUT¾**’A4=ADDRESS�EVENT�READ¤***É*****†OUTPUT»*******�D5=ADDRESS�DCB¨****!***�D6=ADDRESS�LUN�IN�THE�LUTž*****‘D7=ADDRESS�LUTª***Ë**Ë***‡RETURN�CONDITIONS±*****Ç***3****�ZERO�-->‚SUCCESSFUL�COMPLETION�OF�REQUESTŒ****5***ŒNEGATIVE�-->‚LUT�TABLE�DOESN'T�EXIST�FOR�TASK�*****›INVALID�LUN£**!*ŽPOSITIVE�-->‚LUN�NOT�ASSIGNEDŸ**Ë***É**%***†ENTRY�POINTS�FOR�THIS�ROUTINE¤*******�LVL190°*******�LVL192±*****É***Ë*LVL190: ‰BSR…LUTWAIT*œLOCK�THE�LUT�LISTLVL192:‰LEA…EVUTSK(A4),A0%*œA0=ADDRESS�TASK�NAME�MAKING�REQUEST ‰BSR…LUTLK*œFIND�THE�LUT�ADDRESS�(D7) ‰BNE.S…LVL194#*œJMP�IF�NO�LUT�FOR�REQUESTING�TASK ‰CLR.LƒD1‰MOVE.B‚IOSLUN(A5),D1*œD1=LUN�FOR�THIS�REQUEST ‰BSR…LUNLK$*œFIND�THE�LUN�ENTRY�AND�DCB�ADDRESS ‰TST.LƒD0 ‰BMI.S…LVL194*œJMP�IF�INVALID�LUN ‰BEQ.S…LVL196*œJMP�IF�LUN�NOT�ASSIGNED ‰CLR.L…D0*œESTABLISH�SUCCESSFUL�R$ ETURN‰RTS*œRETURNLVL194:‰MOVE.L„#-1,D0 *œSET�ERROR*�NO�LUT *�INVALID�LUN‰RTS*LVL196: ‰MOVE.L„#1,D0 *œSET�FLAG*�LUN�NOT�ASSIGNED‰RTS‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>** POST*ˆIF*�We�have�a�device�assignment*’THEN*—Branch�to�POST20*ˆELSE1*�Lock�the�File�Control�Block�(FCB)�list�resource*�Branch�to�SNDFMS* POST20*�Lock�the�DCB�list�resource"*�Establish�the�current�DCB�status*ˆIF5*�The�rewind/position�function�is�for�the�NULL�device*’THEN*—Branch�to�POST60*ˆIF*�The�device�is�offline*’THEN*—Branchk�to�ERCDEV*ˆIF*�The�device�is�is�busy�or+*�The�device�has�a�I/O�request�queued�to�it*’THEN*—Branch�to�ERCBSY*ˆIF)*�The�I/O�request�is�not�a�REWIND�request*’THEN*—Branch�to�POST30*ˆELSE(*�Set�the�current�record�pointer�to�zero*�Branch�to�DXF39* POST30*ˆIF2*�The�I/O�request�is�other�than�a�POSITION�request*’THEN*—Branch�to�ERCEOM*ˆIF0*�The�POSITION�request�is�for�the�current�record*’THEN*—Branch�to�POST60*ˆIF5*�The�POSITION�request�is�other�than�an�random�record*’THEN*—Branch�to�POST40*ˆIF)*�The�random�record�number�is�negative�or:*�The�random�record�number�is�greater�than�maximum�allowed*’THEN*—Branch�to�ERCRRN*ˆELSE;*�Set�the�current�record�number�to�the�random�record�number *’selected*�Branch�to�POST60* POST40*ˆIF;*�The�POSITION�request�is�other�than�backup�to�prior�record*’THEN*—Branch�to�POST50*ˆELSEA*�Adjust�the�current�record�number�to�one�less�than�current�value*ˆIFC*�The�adjustment�caused�the�new�current�record�value�to�go�negative*’THEN*—Branch�to�ERCEOM*ˆELSE/*�Save�the�new�current�record�number�in�the�DCB*�Branch�to�POST60* POST50*ˆIF>*�The�POSITION�request�is�other�than�to�the�next�random�record*’number*’THEN*—Branch�to�ERCFNT*ˆELSEA*�Adjust�the�current�record�number�to�one�more�than�current�value*ˆIF>*�The�adjustment�caused�the�new�current�reocrd�value�to�exceed*’the�maximum�allowed*’THEN*—Branch�to�ERCEOM*ˆELSE/*�Save�the�new�current�record�number�in�the�DCB* POST60*�Release�the�DCB�list�resource*�Branch�to�OKSTAT*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE**ˆPOSITION�POINTER�EXECUTOR**ˆREV.�1.00�8/1/79�(JIM�SMITH)**�THIS�ROUTINE�WILL�POSITION�A *�FILE�/�DEVICE�CURRENT�POINTER.*!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�*�*�*…P�P�P*�A�*�*ƒ*�P�P�P�P****POST:‰BTST…#LUSFDV,LUTCSF(A6,D6.L) ‰BNE.SƒPOST20*œJMP�IF�DEVICE�ASSIGNMENT ‰BSR…FCBWAIT*œLOCK�THE�FCB�LIST ‰BRA…SNDFMS*œGO�TELL�FMS�ALL�ABOUT�ITPOST20ƒBSR‡DCBWAIT*œLOCK�THE�DCB�LIST‰MOVE.W‚DCBFLG(A6,D5.L),D1*œD1=CURRENT�DCB�STATUS‰CMP.B…#255,DCBFLG(A6,D5.L) ‰BEQ‡POST60!*œJMP�IF�REWIND/POSITION�FUNCTION*œIS�FOR�THE�NULL�DEVICE‰BTST…#DFLGON,D1 ‰BEQ‡ERCDEV*œJMP�IF�DEVICE�OFFLINE‰TST.W…DCBTMO(A6,D5.L) ‰BNE‡ERCBSY*œJMP�IF�DEVICE�BUSY‰TST.L…DCBDCQ(A6,D5.L) ‰BNE‡ERCBSY**œJMP�IF�DEVICE�HAS�SOMETHING�QUEUED�TO�IT‰MOVE.W„IOSFCT(A5),D0!*œD0=REQUESTING�TASK�CMD/FUNCTION‰CMP.Wƒ#IOREWD,D0 ‰BNE.S…POST30#*œJMP�IF�OTHER�THAN�REWIND�FUNCTION‰CLR.L…DCBCRN(A6,D5.L)"*œSET�CURRENT�RECD�POINTER�TO�ZEROO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�9/13/83*ˆBRA.S…POST60 ‰BRA‡DXF39'*œSEND�THE�REWIND�REQUEST�TO�THE�DRIVER*œTAPE�DRIVER�NEEDS�IT *ºBKM�9/13/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*POST30ƒCMP.Wƒ#IOPOST,D0 ‰BNE…ERCEOM%*œJMP�IF�OTHER�THAN�POSITION�FUNCTION‰MOVE.W‚IOSOPT(A5),D0‰AND.Wƒ#IOPPOS,D0(*œD0=POSITION�CODE�ISOLATED�FROM�OPTIONS‰CMP.Wƒ#IOPCUR,D0 ‰BEQ.SƒPOST60#*œJMP�IF�POSITION�TO�CURRENT�RECORD‰CMP.Wƒ#IOPRAN,D0 ‰BNE.SƒPOST40**œJMP�IF�OTHER�THAN�RANDOM�RECORD�POSITION‰MOV% E.L„IOSRRN(A5),D1*œD1=RANDOM�RECORD�NUMBER�(RRN) ‰BMI‡ERCRRNO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *°BKM�7/7/83 ‰MOVE.L„D5,A6‰MOVE.L„DCBSEC(A6),D0 ‰SUB.L…A6,A6 ‰CMP.L…D0,D1*ˆCMP.L…DCBSEC(A6,D5.L),D1 *°BKM�7/7/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ‰BGT‡ERCRRN!*œJMP�IF�THE�RANDOM�RECORD�NUMBER *¦IS�NEGATIVE*¦GREATER�THAN�MAX�ALLOWED‰MOVE.L„D1,DCBCRN(A6,D5.L)*œD1=CURRENT�RRN ‰BRA.S…POST60*POST40ƒCMP.Wƒ#IOPPRV,D0 ‰BNE.S…POST50-*œJMP�IF�OTHER�THAN�BACKSPACE�RECORD�POSITION**ˆBACKSPACE�TO�PRIOR�RECORD* ‰MOVE.L„DCBCRN(A6,D5.L),D1*œD1=CURRENT�RRN ‰SUB.L…#1,D1*œD1=PRIOR�RRN ‰BMI‡ERCEOM*œJMP�IF�RRN�WENT�NEGATIVE‰MOVE.L„D1,DCBCRN(A6,D5.L)*œD1=CURRENT�RRN ‰BRA.S…POST60*!*ˆPOSITION�TO�NEXT�CURRENT�RECORD*POST50ƒCMP.Wƒ#IOPNXT,D0 ‰BNE‡ERCFNT(*œJMP�IF�OTHER�THAN�POSITION�TO�NEXT�RRN‰MOVE.L„DCBCRN(A6,D5.L),D1 ‰ADD.L…#1,D1 *œD1=NEXT�RRNO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *°BKM�7/7/83 ‰MOVE.L„D5,A6‰MOVE.L„DCBSEC(A6),D0 ‰SUB.L…A6,A6 ‰CMP.L…D0,D1*ˆCMP.L…DCBSEC(A6,D5.L),D1 *°BKM�7/7/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ‰BGT‡ERCEOM%*œJMP�IF�NEXT�RRN�EXCEEDS�MAX�ALLOWED‰MOVE.L„D1,DCBCRN(A6,D5.L)*œUPDATE�DCB�WITH�NEXT�RRNPOST60ƒBSR‡DCBSIG*œRELEASE�THE�DCB�LIST ‰BRA‡OKSTAT*œGO�-�GO�-�GO�-�G0‰PAGE**ˆTEST�IO�COMPLETE�EXECUTOR* *ˆREV.�1.00�01/15/80�(JIM�SMITH)**�THIS�ROUTINE�WILL�CHECK�FOR%*�COMPLETION�OF�IO�ON�A�SPECIFIED�LU.*!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�*�*‡P�P�P*�A�*�*ƒ*�P�P�P�P****TESTIO:‰BTSTƒ#LUSFIO,LUTCSF(A6,D6.L) ‰BEQ…OKSTAT*œJMP�IF�NO�I/O�PENDING�FOR�LUN‰BSR…LUTSIG�RELEASE�LUT�LOCK‰BRA…SETCNDŽYES,�CLEAR�Z-BIT‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>** WAITIO*ˆIF&*�There�is�no�I/O�pending�for�this�LUN*’THEN*—Branch�to�OKSTAT*ˆIF$*�The�LUN�assignment�is�for�a�device*’THEN*—Branch�to�WAIT05*ˆELSE*�Lock�the�FCB�list�resource*�Branch�to�SNDFMS* WAIT05*�Lock�the�DCB�list�resource*ˆIF*�The�DCB�is�currently�inuse*’THEN*—Branch�to�WAIT10*ˆELSE*�Release�the�DCB�list�resource*�Branch�to�OKSTAT* WAIT108*�Adjust�the�original�I/O�and�proceed�to�an�I/O�and�wait*�Release�the�DCB�list�resource*�Branch�to�STARQS*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE**ˆWAIT�ONLY�IO�EXECUTOR* *ˆREV.�1.00�01/15/80�(JIM�SMITH)*)*�THIS�ROUTINE�WILL�PUT�A�REQUESTING�TASK*�INTO�A�WAIT�STATE�FOR�IO.*!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�*�*‡P�P�P*�A�*�*ƒ*�P�P�P�P****WAITIO:‰BTSTƒ#LUSFIO,LUTCSF(A6,D6.L) ‰BEQ…OKSTAT*œJMP�IF�NO�I/O�PENDING�FOR�LUN‰BTSTƒ#LUSFDV,LUTCSF(A6,D6.L)&‰BNE.SƒWAIT05ŽJMP�IF�DEVICE�ASSIGNMENT%*œJMP�IF�LUN�ASSIGNMENT�IS�FOR�DEVICE‰BSR…FCBWAIT�LOCK�FCB�LIST‰BRA…SNDFMSŽNO,�TELL�FMS%WAIT05ƒBSR…DCBWAIT�YES,�LOCK�DCB�LIST!‰TST.WƒDCBTMO(A6,D5.L)…DCB�ACTIVE‰BNE.SƒWAIT10ŽYES!*œJMP�IF�DEVICE�ACTIVE�-�ASSIGNED ‰BSR…DCBSIGŽNO,�RELEASE�DCB�LIST ‰BRA…OKSTAT:WAIT10ƒLEA…DCBIOS(A6,D5.L),A1�SET�POINTER�TO�ORIGINAL�IOCB+‰EOR.Wƒ#IOPPRO,IOSOPT(A1)ƒCLEAR�PROCEED�BIT‰BSR…DCBSIGŽRELEASE�DCB�LOCK‰BRA…STARQSŽNOW,�ENABLE�EVENTS‰PAGE***ˆHALT�IO�EXECUTOR„USER�REQUESTED�HALT�I/O* *ˆREV.�1.00�01/15/80�(JIM�SMITH)*)*�THIS�ROUTINE�WILL�SCHEDULE�A�DRIVER�FOR*�TERMINATION�OF�IO.*!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME% **ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�*�*‡P�P�P*�A�*�*ƒ*�P�P�P�P***‰PAGE*{**ˆCOMPLETION�EVENT�FORMAT*>*�The�format�of�the�completion�event�as�queued�from�the�driver *ˆto�IOS.*,*’---------------------�---------------------*ˆ00ˆ|�Event�Length�($0A)�|�Event�code�(01)„|,*’---------------------�--------------------!*ˆ02ˆ|�Event�Type‰|�Channel�Keyˆ|,*’---------------------�--------------------*ˆ04ˆ|�User�IdŒ|�User�IdŒ|,*’---------------------�--------------------*’|�User�IdŒ|�User�IdŒ|,*’---------------------�--------------------$*ˆ08ˆ|�Status�Value‡|�Status�Value‡|,*’---------------------�--------------------* *’Event�Type*—$70‚Normal�Completion*—$71‚HaltƒCompletion* *’User�Id*—Normally�the�DCB�address**’Status�Value*—Normal�Completion*œSuccessful„$0000%*œUnsuccessful‚Appropriate�error�code**—Halt�Completion*œSuccessful„$00E6*œUnsuccessful‚$0082*"*ˆHALT�I/O�requests�can�come�from: *’a.�The�user*’b.�IOS*?*ˆUser�request�results�when�a�previous�I/O�request�with�proceedF*ˆhas�been�issued�and�upon�return�to�the�requesting�task�a�decision�is*ˆmade�to�terminate�the�I/O.*3*ˆIOS�requests�occur�under�the�following�conditons:=*’a.�A�timeout,�for�a�previously�initiated�I/O,�has�occurred.8*’b.�During�End�Of�Task�(EOT)�termination�an�outstanding*•I/O�must�be�terminated.*E*ˆIt�should�be�noted�that�the�conditon�codes�returned�when�a�HALT�I/OG*ˆis�requested�are�unpredictable.�It�is�suggested�that�the�user�monitorF*ˆthe�status�of�the�HALT�I/O�command�function�parameter�block�instead.G*ˆThe�following�psuedo�code�represents�a�routine�that�issues�a�HALT�I/O>*ˆrequest�and�does�not�return�until�the�I/O�is�halted�or�it�isH*ˆrecognized�that�there�is�no�I/O�to�halt.�The�condition�codes�reflected:*ˆby�the�routine�will�reflect�if�the�I/O�is�halted�or�not.*C*ˆPre-set�the�status�byte�in�the�HALT�I/O�parameter�block�with�$FF.(*ˆIssue�the�TRAP�2�call�to�halt�the�I/O.**ˆWHILE3*�Status�byte�of�HALT�I/O�parameter�block�equal�$FF!*�WAIT�(use�RELINQUISH�directive)*ˆENDW**ˆIF>*�Status�byte�of�HALT�I/O�parameter�block�is�zero�then�the�I/O *�was�halted.*=*�In�addition�to�the�above�there�will�be�an�$E6�in�the�statusA*�byte�of�the�data�transfer�parameter�block�and�a�I/O�termination+*�event�in�the�requestor's�ASQ,�if�enabled.**�Return�to�caller**ˆELSE**�There�was�no�I/O�to�halt.**�There�will�be<*’An�$82�in�the�status�byte�of�the�HALT�I/O�parameter�block.=*’An�I/O�completion�event�in�the�requestor's�ASQ,�if�enabled.;*’The�status�byte�of�the�data�transfer�parameter�block�will+*—reflect�the�status�of�the�I/O�completion.*�Return**ˆENDIF***B*ˆThere�are�three�(3)�basic�cases�that�IOS�must�be�able�to�handle:*'*ˆ1.�IOS�thinks�there�is�an�I/O�to�halt*‹and,*‹The�driver�thinks�there�is�an�I/O�to�halt.*@*‹In�this�case�IOS�will�receive�a�HALT�completion�event�type�$71*‹and�a�status�value�of�$00E6.**B*‹The�status�byte�of�the�HALT�I/O�parameter�block�contains�a�zero.D*‹The�status�byte�of�the�data�transfer�parameter�block�contains�$E6.A*‹An�I/O�termination�event�is�in�the�requestor's�ASQ,�if�enabled.*B*‹The�status�bytes�are�updated�by�the�driver�and�the�event�is�sent *‹by�IOS.**,*’---------------------�---------------------*ˆ00ˆ|�Event�Length�($06)�|�Event�code�(02)„|,*’---------------------�--------------------0*ˆ02ˆ|�Address�of�data�tx�|�I/O�parameter�blck�|,*’---------------------�---------------------*’|�Address�of�data�tx�|�I/O�parameter�blck�|,*’---------------------�--------------------**/*ˆ2.�IOS�does�not�think�there�is�an�I/O�to�halt*?*‹In�this�case�IOS�will�not�talk�to�the�driver�but�instead�will@*‹return�an�error�conditon�status�of�$82�in�the�user's�parameter%*‹block�via�a�move�logical�directive.**'*ˆ3.�IOS�thinks�there�is�an�I/O�to�halt*‹and4*‹The�driver�does�not�think�there�is�an�I/O�to�halt.*B*‹The�basic�cause�of�t& his�problem�is�'TIMING'.�The�driver�has�sentB*‹a�normal�completion�to�IOS�and�it�currently�is�in�the�ASQ�of�IOS*‹but�has�not�been�processed.*6*‹One�of�the�following�conditions�could�have�occurred:*$*‹a.�IOS�has�had�an�I/O�timer�expire(*‹b.�IOS�has�received�an�EOT�termination<*‹c.�A�USER�has�requested�termination�of�a�previously�issued*Ždata�I/O�transfer.**‹In�cases�'a'�and�'b'�IOS�will(*�issue�HALT�I/O�request(s)�as�required.**‹In�case�'c'�IOS�will+*�honor�the�USER's�request�to�HALT�the�I/O.*2*‹When�IOS�receives�the�HALT�completion�event�type*‹the�following�will�occur.*&*‹a.�IF�EOT�termination�is�in�progress3*—(reference�EOT�termination�documentation�{EOTSK})*’The�event�will�be�ignored.=*’The�I/O�pending�bit�for�this�LUN�will�be�cleared�in�the�LUT6*—for�the�user�task�indicating�that�there�is�no�I/O�in *—progress.>*’The�current�LUT�pointer�(DCBLUT)�will�be�cleared�in�the�DCB.=*’The�priority�(DCBPRI)�for�the�DCB�will�be�reset�in�the�DCB.7*’The�device�will�be�made�available�for�use�by�clearing*—the�field�DCBTMO.<*’The�EOT�termination�flag�(DFLIOEOT)�will�be�cleared�in�the*—DCB.3*’Control�will�be�transfered�to�the�EOT�termination*—processing�(EOTS10).**�ELSE*8*‘The�event�can�be�ignored�because�the�event�status,�$823*—indicates�that�there�is�no�I/O�to�halt�because�an-*—I/O�completion�event�has�already�been�sent.*<*’The�driver�will�place�$82�in�the�user's�HALT�I/O�parameter*—block*}*HALTIO: ‰BSR‡IRPT40LD,*œCANCEL�THE�TIMER�FOR�THIS�DCB�IF�ONE�EXIST‰BTSTƒ#LUSFDV,LUTCSF(A6,D6.L) ‰BEQ…ERCKOD#*œJMP�IF�LUN�ASSIGNMENT�IS�FOR�FILE‰BTSTƒ#LUSFIO,LUTCSF(A6,D6.L) ‰BEQ…ERCKOD*œJMP�IF�NO�I/O�PENDING�FOR�LUN‰MOVE.L„EVURA0(A4),A3,*œA3=ADDRESS�REQUESTOR'S�I/O�PARAMETER�BLOCK ‰BSR‡X01000‰BNE.S…HALTIO20#*œJMP�IF�OLD�I/O�TECHINIQUE�IS�USED ‰BSR.S…HALTIT*œINITIATE�THE�HALT�I/O�REQUEST HALTIO10: ‰BSRNE…KILIT *œKILL�SYSTEM#* IF�UNABLE�TO�INITIATE�I/O�REQUEST O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>01/10/85>> *ˆBRA…OKSTAT ‰BRA…DXF49O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<01/10/85<< * HALTIO20: ‰BSR‡SAYHALT(*œQUE�AN�EVENT�TO�THE�APPROPRIATE�DRIVER‰BRA.S…HALTIO10*œEXIT‰PAGE**Ë***‡ROUTINE�TO¸**"***�INITIATE�A�HALT�I/O�RQUEST�*** ****Å**** ***†INPUT¼*****‘D5�=�ADDRESS�OF�DCB¥***’A3�=�ADDRESS�OF�IOCB�TO�USEž**Ë***É*****†OUTPUT»*******�REGISTER�ALTERATION£*******Ç***2**’A0�=�ADDRESS�OF�INITIATE�I/O�PARAMETER�BLOCK‹***Ë*HALTIT:‰LEA…INTPRMLD(A2),A0*œA0=ADDRESS�OF�INITIATE�I/O�PB‰MOVE.L„A1,-(A7)*œSAVE�REGISTER ‰MOVE.L„A2,A1"*œA1�=�ADDRESS�OF�IOS�DATA�SEGMENT ‰MOVE.L„A3,A2*œA2=ADDRESS�OF�IOCB�TO�USE‰LEA‡HLTCBLD(A1),A31*œA3=ADDRESS�OF�INTERNAL�HALT�I/O�PARAMETER�BLOCK ‰CMP.L…A3,A2‰BNE.S…HALT10LD *œJMP�IF�USER�REQUESTED�HALT�I/O‰CLR.LƒXIOTSK(A0)‰CLR.LƒXIOSES(A0)*œSET�RESPECTIVELY*�TASK�REQUESTING�HALT�I/O)*�SESSION�NBR�OF�TASK�REQUESTING�HALT�I/O‰MOVE.W„#8,XIOPLN(A0)!*œSET�IOCB�LENGTH�(PACKET�LENGTH)‰BRA.S…HALT15LD *œCONTINUE�ON HALT10LD:‰MOVE.L„EVUTSK(A4),XIOTSK(A0)‰MOVE.L„EVUSES(A4),XIOSES(A0)*œSET�RESPECTIVELY*�TASK�REQUESTING�HALT�I/O)*�SESSION�NBR�OF�TASK�REQUESTING�HALT�I/O‰CLR.W…XIOPLN(A0)‰MOVE.B„EVUPSZ(A4),XIOPLN+1(A0)*œSET�USER�IOCB�LENGTH HALT15LD: "‰MOVE.L‚DCBCCB(A6,D5.L),XIOCID(A0)*œSET�CHANNEL�MNEMONIC‰MOVE.L‚D5,XIOUID(A0)*œSET�DCB�ADDRESS‰MOVE.L„A2,XIOCPK(A0)!*œSET�ADDRESS�OF�REQUESTOR'S�IOCB*œ(ADDRESS�OF�PACKET�INFO) ‰MOVE.L„A1,A2"*œA2�=�ADDRESS�OF�IOS�DATA�SEGMENT‰MOVE.L„(A7)+,A1*œRESTORE�REGISTERHALT20LD�MOVE.L‚#XCAIO,D0*œD0=DIRECTIVE�TO�INITIATE�I/O‰TRAPƒ#1*œINITIATE�I/O�REQUEST‰BEQ.SƒHALT30LD*œJMP�IF�REQUEST�INITIATED‰CMP.Bƒ#XSTBSY,D0‰BEQ.SƒHALT20LD*œJMP�IF�CHANNEL�BUSYHALT30LD�RTS›RETURN**Ë*6**‡INTERNAL�HALT�I/O�PARAMETER�BLOCK�--�PACKET�INFO’*****Ç*** ****Å*******Ç*****É***Ë*‰PAGE**ˆBREAK�SERVICE�EXEC& UTOR* *ˆREV.�1.00�02/01/80�(JIM�SMITH)**Ë***É*****Ç***C****…THIS�ROUTINE�WILL�REGISTER�A�TASK�FOR�LOCAL�BREAK�SERVICE‡*******Ç*****É***Ë**!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�*�*‡P�P�P*�A�*�*ƒ*�P�P�P�P*******ˆIGNORE�REQUEST�IF�NON-INTERACTIVE�DEVICE*ˆ(RETURN�WITH�GOOD�STATUS)* BRKSRVƒEQU‡*2‰BTSTW…#DATIND,LUTATT(A6,D6.L)‡INTERACTIVE�DEVICE+‰BEQ.S…BRKS15„NO�-�GOOD�RETURN‰BSR…DCBWAIT�LOCK�DCB�LIST-‰MOVE.L‚D7,DCBBRK(A6,D5.L)‚SET�UP�LUT�POINTER1‰MOVE.L‚#-1,DCBSRV(A6,D5.L)�INIT.�SERVICE�ADDRESS%‰MOVE.W‚IOSOPT(A5),D1‡PICK�UP�OPTIONS,‰AND.Wƒ#IOPCAD,D1ŠSERVICE�ADDRESS�SUPPLIED�?‰BEQ.SƒBRKS10ŽNO1‰MOVE.L‚IOSCAD(A5),DCBSRV(A6,D5.L)�YES,�SET�IT�UP"BRKS10ƒBSR…DCBSIGŽRELEASE�DCB�LISTBRKS15ƒBRA…OKSTATŽRETURN‰PAGE*Ë**ˆENTRY*’A4=ADDR�ASQ�MSG�EVENT*’A5=ADDRESS�IOCB�IN�EVENT *’A6=ZERO*’A7=STACK�ADDRESS*’D5=ADDRESS�DCB�PROCESSING!*’D6=ADDRESS�LUN�ENTRY�IN�THE�LUT*’D7=ADDRESS�LUT*M*----------------------------------------------------------------------------*Ë***É*****Ç***9****…USER�REQUEST�TO�CHANGE�THE�DEVICE�CONFIGURATION‘****2***�USER�IS�SENDING�A�NEW�DEVICE�CONFIGURATION�*****É***Ë* UDVC_CFG:‰BTST†#LUSFDV,LUTCSF(A6,D6.L) ‰BEQ‡ERCKOD1*œJMP�IF�REQUEST�IS�TO�A�FILE�INSTEAD�OF�A�DEVICE ‰BRA‡DXF37*Ë***É*****Ç***9****…USER�REQUEST�TO�OBTAIN�THE�DEVICE�CONFIGURATION‘****;***�USER�IS�REQUESTING�THE�CURRENT�DEVICE�CONFIGURATION„*****‘AND�STATUS®***Ë* UDVR_CFG:‰BRA.S…UDVC_CFG‰PAGE*Ë**ˆENTRY*’A4=ADDR�ASQ�MSG�EVENT*’A5=ADDRESS�IOCB�IN�EVENT *’A6=ZERO*’A7=STACK�ADDRESS*M*----------------------------------------------------------------------------*Ë***É**&***†LEVEL�TWO�(2)�FUNCTION�HANDLER£***6****�LEVEL�2�IS�AN�EXTENSION�OF�LEVEL�1�THEREFOREŠ****6***�CONTROL�WILL�BE�TRANSFERRED�TO�THAT�PROCESSING‰*****É***Ë*LVL2CD: ‰BRA‡LVL1CD-*œTRANSFER�CONTROL�TO�LEVEL�1�FUNCTIN�HANDLER‰PAGE**ˆNEGATE�BREAK�SERVICE�EXECUTOR***Ë***É*****Ç***B****…THIS�ROUTINE�WILL�REMOVE�A�TASK�FROM�LOCAL�BREAK�SERVICEˆ*******Ç*****É***Ë**!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME* N_BRKSRV:2‰BTSTW…#DATIND,LUTATT(A6,D6.L)‡INTERACTIVE�DEVICE+‰BEQˆBRKS15—NO�-�GOOD�RETURN‰BSR…DCBWAIT�LOCK�DCB�LIST‰CLR.LƒDCBBRK(A6,D5.L),*œREMOVE�TASK�FROM�BEING�LOCAL�BREAK�CLAIMER ‰BRA‡BRKS10 PAGE *ÄIEEE488*ˆCLAIM�EVENTS�EXECUTOR§IEEE488 *ÄIEEE488 *ÄIEEE488 *ÄIEEE488 **ÃIEEE488 ***ÂIEEE488<****…THIS�ROUTINE�WILL�ALLOW�A�TASK�TO�CLAIM�EVENTS.�IEEE488 ***ÂIEEE488 **ÃIEEE488 *ÄIEEE488 *ÄIEEE488)*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER�IEEE488*�A5�=�IOCB�POINTER¤IEEE488*�A6�=�ZERO¬IEEE488*�A7�=�STACK�POINTER£IEEE488*�D5�=�DCB�POINTER¥IEEE488*�D6�=�LUN�POINTER¥IEEE488*�D7�=�LUT�POINTER¥IEEE488 *ÄIEEE488*ˆEXIT:�SAME²IEEE488 *ÄIEEE488CLMDREV:$‰BSR‡DCBWAITŒLOCK�THE�DCB�LIST�EVENT8‰TST.L…DCBTSK(A6,D5.L)„DOES�A�CLAIM�ALREADY�EXIST?…EVENT*‰BNE.S…CLMEVERŒBRANCH�IF�YES�-�ERROR‹EVENT*ÅEVENT6‰TST.L…DCBSES(A6,D5.L)„SESSION�MUST�ALSO�BE�ZERO‡EVENT"‰BNE.S…CLMEVERŒBRANCH�IF�NOT“EVENT*ÅEVENT>*„SINCE�NO�OTHER�TASK�HAS�CLAIMED�EVENTS�YET,�ATTACH�THE‹EVENT<*„TASK�NAME�AND�SESSION�NUMBER�FOR�WHOM�EVENTS�WILL�BE�EVENT*„SENT�TO.¹EVENT*ÅEVENT6‰BSET.B„#LUSEVC,LUTCSF(A6,D6.L)‚SET�CLAIM�ACTIVEŠEVENT-‰MOVE.L„LUTTID(A6,D7.L),DCBTSK(A6,D5.L)”EVENT'*œSET�UP�THE�TASK�NAME�IN�THE�DCBŠEVENT-‰MOVE.L„LUTSES(A6,D7.L),DCBSES(A6,D5.L)”EVENT&*œSET�UP�THE�SESSION�NUMBER�ALSO‹EVENT.CLMDREV1:�BSR‡DCBSIGƒUNLOCK�THE�DCB�LIST–EVENT‰BRA‡OKSTAT„RETURN�OK EVENT*ÅEVENTB*„ERROR�-�A�TASK�TRIED�TO�CLAIM�EVENTS�FOR�A�DRIVER�THAT�WAS‡EVENT*ŒALREADY�CLAIMED.©EVENT*ÅEVENT,CLMEVER‚BSR‡DCBSIG„UNLOCK�THE�' DCB�LIST–EVENT*‰BRA‡ERCB20„RETURN�DEVICE�BUSY�ERROR‘EVENT*ÄIEEE48*ˆNEGATE�CLAIM�EVENTªIEEE48*ÄIEEE48*ÄIEEE48 **ÃIEEE48 ***ÂIEEE488****…THIS�ROUTINE�WILL�REMOVE�CLAIM�EVENT�NOTICE.�IEEE48 ***ÂIEEE48 **ÃIEEE48*ÄIEEE48*ÄIEEE48*ˆENTRY:„SAME�AS�CLMEVTS£IEEE48*ÄIEEE48>*ˆEXIT:…SAME�AS�CLMEVTS�EXCEPT�NO�POSSIBLE�ERROR�RETURNƒIEEE48*ÄIEEE48 NCLMDREV:%‰BTST.B„#LUSEVC,LUTCSF(A6,D6.L)ŸEVENT(*œIS�THIS�LUN�HAVE�EVENTS�CLAIMED?ŒEVENT&‰BEQ‡ERCKODŽNO,�INVALID�FUNCTIONŽEVENT*ÈEVENT$‰BSR‡DCBWAIT�LOCK�THE�DCB�LIST‘EVENT2‰CLR.L…DCBTSK(A6,D5.L)…SET�TASK�NAME�TO�ZERO�EVENT0‰CLR.L…DCBSES(A6,D5.L)…SET�SES�NUM�TO�ZERO�EVENT*¦ZERO�IMPLIES�NO�CLAIM�EVENT%‰BCLR.B„#LUSEVC,LUTCSF(A6,D6.L)ŸEVENT$*¦CLEAR�CLAIM�EVENT�BIT�IN�LUN†EVENT‰BRA.S…CLMDREV1®EVENT PAGE *ÄLEVEL40#*ˆLEVEL�40�FUNCTION�HANDLER£LEVEL40 *ÄLEVEL40)*ˆORIG.ƒ3/10/83�(STEVE�FEITELSON)›LEVEL40 *ÄLEVEL409*�THE�PURPOSE�OF�THE�LEVEL�40�FUNCTION�HANDLER�IS…LEVEL405*�TO�ALLOW�THE�I/O�DRIVER�HANDLE�ALL�FUNCTION‰LEVEL409*�VALIDITY�TESTS.‚THIS�DRIVER�HAS�NO�KNOWLEDGE�OF„LEVEL405*�WHAT�THE�COMMAND�IS�TO�BE�EXECUTED.�IT�DOES‰LEVEL40<*�HOWEVER�HANDLE�BASIC�IOS�CHECKS�(I.E.�DCB,LUN,�AND‚LEVEL40;*�LUT�VALIDATION)�SINCE�THESE�WOULD�BE�DIFFICULT�TOƒLEVEL40%*�OBTAIN�AT�THE�DRIVER�LEVEL.™LEVEL40 *ÄLEVEL40 *ÄLEVEL40 *ÄLEVEL40)*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER�LEVEL40*�A5�=�IOCB�POINTER¤LEVEL40*�A6�=�ZERO¬LEVEL40*�A7�=�STACK�POINTER£LEVEL40 *ÄLEVEL40*ˆEXIT:�SAME²LEVEL40*ŽD5�=�DCB�POINTER¦LEVEL40*ŽD6�=�LUN�POINTER¦LEVEL40*ŽD7�=�LUT�POINTER¦LEVEL40 *ÄLEVEL40 *ˆUSING:ƒ0�1�2�3�4�5�6�7¤LEVEL40**�D�*�*�*�*�*�R�R�R†****�TBD‚*****�LEVEL40*�A�*�*ƒ*�P�P�P�P¤LEVEL40 *ÄLEVEL40 *ÄLEVEL40 *ÄLEVEL40 *ÄLEVEL401LVL40CD‚BSR�X01000“NEW�OR�OLD�I/O�SCHEME?‰LEVEL40$‰BNE‡ERCCODŽOLD,�NOT�ALLOWEDŽLEVEL400‰CMP.Bƒ#IOSBLN,EVUPSZ(A4)‚PB�LENGTH�OK�?’LEVEL40‰BLT…ERCPRMŽNO,�ERROR—LEVEL40-*œJMP�IF�PB�LENGTH�LESS�THAN�STANDARD…LEVEL40*œ28�BYTES LEVEL40‰TST.WƒIOSLUN+1(A5)¨LEVEL40‰BNE…ERCCOD®LEVEL401*œJMP�IF�RESERVE�FIELD�NOT�=�ZERO�(ERROR)�LEVEL40 *ÄLEVEL409*ˆALL�LEVEL�FORTY�FUNCTIONS�REQUIRE�ACCESS�TO�LUT�LEVEL40 *ÄLEVEL40‰BSR‡LVL190¬LEVEL40*œESTABLISH�FOLLOWING•LEVEL40*�D7=ADDRESS�LUT™LEVEL40*�D6=ADDRESS�LUN�IN�LUT’LEVEL40*�D5=ADDRESS�DCB™LEVEL40‰BEQ.S…LVL4010«LEVEL40#*œJMP�IF�REQUEST�SUCCESSFUL�LEVEL40‰BMI‡ERCLUN¬LEVEL401*œJMP�IF�LUT�DOESN'T�EXIST�OR�INVALID�LUN�LEVEL40‰BRA‡ERCASG¬LEVEL40 *œJMP�-�LUN�NOT�ASSIGNED’LEVEL40BLVL4010‚MOVE.B‚LUTCSF(A6,D6.L),D1„D1=CURRENT�STATUS�OF�LUN†LEVEL40,‰BTSTƒ#LUSFDV,D1‹DEVICE�ASSIGNMENT�?�LEVEL40‰BEQ…ERCCODŽNOžLEVEL40,*œJMP�IF�LUN�ASSIGNMENT�IS�TO�A�FILE†LEVEL40=‰CMP.Bƒ#255,DCBFLG(A6,D5.L)‚IS�THIS�THE�NULL�DEVICE�?…LEVEL40-‰BEQ…IODONEŽYES,�GO�RETURN�LIKE�A�NOP‡LEVEL40 *ÄLEVEL40‰BSR…DCBWAIT­LEVEL40*œLOCK�THE�DCB�LIST—LEVEL40"‰MOVE.W‚DCBFLG(A6,D5.L),D1¢LEVEL40*œD1=DCB�STATUS›LEVEL40‰BTSTƒ#DFLGON,D1«LEVEL40‰BEQ…ERCDEV®LEVEL40"*œJMP�IF�DEVICE�IS�OFFLINE�LEVEL40‰BTSTƒ#DFLGSC,D1«LEVEL40‰BNE…ERCDSC®LEVEL40**œJMP�IF�DEVICE�STATUS�HAS�CHANGEDˆLEVEL40 *ÄLEVEL40"*ƒCHECK�FOR�PROPER�VERSION©LEVEL40 *ÄLEVEL404‰BSR…X01000‡IN�NEW�VERSION�(4.X�OR�GREATER)?‡LEVEL40.‰BNE…ERCCOD†BRANCH�IF�NO�(NOT�ALLOWED)ŽLEVEL40 *ÄLEVEL401‰BRA…DXF39‡CONTINUE�NORMAL�IOS�PROCESSINGŠLEVEL40*¦AND�CALL�DRIVER�LEVEL40‰PAGE*(*ˆLEVEL�80�FUNCTION�HANDLER�-�PRIVILEGED**ˆREV.�1.00‚7/01/79�(JIM�SMITH)*+*�THIS�ROUTINE�WILL�SCAN�THE�FUNCTION�FIELD2*�OF�THE�REQUESTOR'S�IOCB�AND�MAP�THE�BIT�POSITION0*�TO�A�FUNCTION�EXECUTOR�FOR�LEVEL�80�FUNCTIONS.*!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER* *ˆEXIT:�SAME**ˆUSING:ƒ0�1�2�3�4�5�6�7*�Dƒ*�* *�A�*‡P�P�P�P****.LVL80CD‚CMP.Bƒ#PBCLN,EVUPSZ(A4)ƒPB�LENGTH�OK�?‰BLT…ERCPRMŽNO,�ERROR*œJMP�IF�PB�LENGTH�ERROR‰BTSTƒ#EVTNOS,EVUTIN(A4) ‰BEQ…ERCCOD!*œJMP�IF�OTHER�THAN�A�SYSTEM�TASK‰CLR.LƒD1’SET�BIT�POINTER/‰LEA…LVL80EX(PC),A0‰LEVEL�80�TABLE�OF�EXECUTORS&‰MOVE.W‚IOSFCT(A5),D2‡PICK�UP�FUNCTION' ‰AND.Wƒ#$FF,D2�ISOLATE�COMMAND!LVL8010‚BCLR„D1,D2�THIS�BIT�SET�?‰BEQ.SƒLVL8020�NO*‰TST.WƒD2’MORE�THAN�1�FUNCTION�REQUESTED�?‰BNE…ERCCODŽYES,�ERROR‰TST.Lƒ(A0)�VALID�EXECUTOR�?#‰BEQ…ERCCODŽNO,�FUNCTION�CODE�ERROR‰MOVE.L‚(A0),A0#‰JMP…(A0)�JUMP�TO�FUNCTION�EXECUTOR&LVL8020‚TST.Lƒ(A0)+�BUMP�TABLE�POINTER#‰ADD.Bƒ#1,D1�BUMP�BIT�POINTER�(R2L) ‰CMP.Bƒ#8,D1#‰BEQ…ERCCODŽREACHED�LIMIT�-�ERROR�!‰BRA.SƒLVL8010�CONTINUE‰PAGE*&*ˆUNCLAIMED�BREAKS�(LEVEL�80�FUNCTION)**ˆREV.�1.00‚7/01/79�(SMITH)**Ë***É*****Ç***9****…SYSTEM�LEVEL�RQST�FOR�CLAIMING�UNCLAIMED�BREAKS‘*******Ç*****É***Ë**!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER* *ˆEXIT:�SAME**ˆUSING:ƒ0�1�2�3�4�5�6�7*�Dƒ* *�A‰P�P�P�P****1BREAKSƒMOVE.L‚IOCOMS(A2),A0ŠSET�UP�POINTER�TO�SVT,‰MOVE.L‚#-1,SVTBSA(A0)†INIT.�SERVICE�ADDRESS%‰MOVE.W‚IOSOPT(A5),D1‡PICK�UP�OPTIONS#‰AND.Wƒ#IOPCAD,D1ŠSERVICE�ADDRESS�?‰BEQ.SƒBRE10�NO-‰MOVE.L‚IOSSRV(A5),SVTBSA(A0)�YES,�SET�IN�SVT0BRE10„MOVE.L‚EVUTSK(A4),SVTBRK(A0)�STORE�TASK�ID2‰MOVE.L‚EVUSES(A4),SVTBRK+4(A0)�STORE�TASK�SESSION ‰BRA…OKST10‰PAGE***É*****Ç***.****…CHANGE�DEFAULT�CONFIGURATION�REQUESTœ*******Ç*****É***Ë**!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER**ˆEXIT:�SAME�AS�ENTRY*�D5=DCB�ADDRESS*�D6=LUN�ADDRESS�IN�LUT*�D7=LUT�ADDRESS** SDV_CDCF: ‰BSR‡LVL190 *œESTABLISH*�D5=DCB�ADDRESS*�D6=LUN�ADDRESS�IN�LUT*�D7=LUT�ADDRESS ‰BEQ‡UDVC_CFG*œJMP�IF�RQST�SUCCESSFUL ‰BMI‡ERCLUN*œJMP�IF�NO�LUT�OR�INVALID�LUN ‰BRA‡ERCASG*œJMP�IF�LUN�NOT�ASSIGNED‰PAGE**ˆEND-OF-TASK�EXECUTOR**ˆREV.‚1.00‚7/01/79�(JIM�SMITH)*"*�THIS�IS�A�CLEAN-UP�ROUTINE�FOR�A$*�TASK�WHICH�HAS�GONE�TO�COMPLETION.*!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER* *ˆEXIT:�SAME*ŽD7�=�LUT�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�*�*�*�*�*�*�*�R*�A�*�*…P�P�P�P***{**ˆEnd�Of�Task�(EOT)�termination*)*ˆWhen�IOS�receives�EOT�termination�event=*�it�will�interogate�each�LUN�associated�with�the�LUT�for�the*�terminating�task.*H*ˆIF�there�are�no�outstanding�I/O�request�on�any�assigned�LUN's�for�this*�task<*�IF�there�are�no�outstanding�I/O�request�in�the�DCQ�for�any*’assigned�LUN's*ˆTHEN@*�IOS�will�acknowledge�the�task�and�terminate�the�EOT�processing**ˆELSE*�The�LUN�in�question$*’Will�have�any�queued�I/O�dequeued.<*’Will�have�a�flag,�DFLIOEOT�in�the�DCB,�set�indicating�that*—this�DCB�in�EOT�termination.!*—(Reference�HALT�I/O�processing)>*’Will�have�a�HALT�I/O�request�issued�for�the�outstantding�I/O>*’Transfer�control�to�process�the�next�event�in�the�ASQ�of�IOS**{*EOTSK:‰BSR…LUTWAIT�LOCK�LUT�LIST‰CLR.BƒIOCBLK+IOSSTA(A2)‰LEA…EVUTSK(A4),A0*œA0=ADDRESS�TASK�ID�SEEKING ‰BSR…LUTLK'*œD7=ADDRESS�OF�LUT�FOR�REQUESTING�TASK ‰BEQ.SƒEOTS10&*œJMP�IF�LUT�EXIST�FOR�REQUESTING�TASK ‰BSR…LUTSIGŽNO,�RELEASE�LUT�LOCK"‰BRA…SETCNDŽGO�ACKNOWLEDGE�REQUEST EOTS10ƒMOVE.B‚LUTMLU(A6,D7.L),D2*œD2=MAX�NUMBER�OF�LUNS‰TST.BƒLUTCAS(A6,D7.L) ‰BEQ…EOTS60*œJMP�IF�NO�LUNS�ARE�ASSIGNED‰LEA…LUTBEG(A6,D7.L),A1 ‰MOVE.L‚A1,D60*œA1=D6=START�ADDRESS�OF�LUN�ENTRIES�IN�THIS�LUTEOTS20:‰MOVE.L„LUTDCB(A6,D6.L),D5%*œD5�=�DCB�ADDRESS�FOR�LUN�PROCESSING-‰MOVE.B‚LUTCSF(A6,D6.L),D1‚PICK�UP�LUN�STATUS*œD1=CURRENT�LUN�STATUS‰BTSTƒ#LUSFAC,D1 ‰BEQ.SƒEOTS50'*œJMP�IF�THIS�LUN�NOT�ACTIVE�-�ASSIGNED‰BTSTƒ#LUSFDV,D1 ‰BEQ.SƒEOTS50 *œJMP�IF�LUN�ASSIGNMENT�FOR�FILE ‰BSR…DCBWAIT�LOCK�DCB�LIST–EVENT‰BTST„#LUSEVC,D1­EVENT(*¥IS�THIS�LUN�HAVE�EVENTS�CLAIMED?‚EVENT ‰BEQ.SƒEOTS23�BRANCH�IF�NO–EVENT‰BCLR„#LUSEVC,D1­EVENT(*¤RESET�CLAIM�EVENT�SERVICE�IN�LUNƒEVENT0‰CLR.LƒDCBTSK(A6,D5.L)…CLEAR�OUT�TASK�NAME�EVENT5‰CLR.LƒDCBSES(A6,D5.L)…CLEAR�OUT�SESSION�NUMBER‹EVENT*ÇEVENTEOTS23:‰BTSTƒ#LUSFIO,D1*ˆBEQ.SƒEOTS50±EVENT‰BEQ.SƒEOTS28±EVENT*œJMP�IF�NO�I/O�PENDING�FOR�LUN4*ˆMOVE.L‚LUTDCB(A6,D6.L),D5‚SET�UP�DCB( �POINTER‘EVENT&*œD5=ADDRESS�OF�DCB�FOR�THIS�LUN�EVENT!*ˆBSR…DCBWAIT�LOCK�DCB�LIST–EVENT+‰TST.LƒDCBDCQ(A6,D5.L)…IN�CONNECTION�WAIT�?‰BEQ.SƒEOTS30ŽNO*œJMP�IF *¦I/O�PENDING"*¦BUT�NOT�IN�CONNECTION�WAIT�STATE*°GO�HALT�THE�I/O4‰CMP.LƒDCBLUT(A6,D5.L),D7‚THIS�TASK�BEING�SERVICED�?‰BNE.SƒEOTS25ŽNO%*œJMP�IF�THIS�TASK�NOT�BEING�SERVICED%* I/O�PENDING�BUT�THIS�TASK�NOT�BEING+* SERVICED�THEREFORE�REQUEST�MUST�BE�IN�QUE‰MOVE.B‚LUTMLU(A6,D7.L),D1‰SUB.BƒD2,D1�CALC.�LUN9‰CMP.BƒDCBIOS+IOSLUN(A6,D5.L),D1�THIS�LU�BEING�SERVICED�?‰BNE.S…EOTS25ŽNO *œI/O�PENDING*œTHIS�TASK�BEING�SERVICED$*œBUT�THIS�LUN�IS�NOT�BEING�SERVICED"*œTHEREFORE�REQUEST�MUST�BE�IN�QUE1‰BTST†#LUSFCW,LUTCSF(A6,D6.L)‡ALSO�IN�CONN.�WAIT?‰BEQ.S…EOTS30ŽNO *œI/O�PENDING*œTHIS�TASK�BEING�SERVICED*œTHIS�LUN�BEING�SERVICED*œNO�OTHER�OUTSTANDING�REQUEST*œSO�GO�CANCEL�THE�I/O ‰BSR.S…EOTS99 ‰BRA.S…EOTS30 *œI/O�PENDING*œTHIS�TASK�BEING�SERVICED*œTHIS�LUN‚BEING�SERVICED"*œAND�OTHER�REQUEST�ARE�IN�THE�QUE(*œSO�REMOVE�REQUESTS�THAT�ARE�IN�THE�QUE*œGO�CANCEL�THE�I/OEOTS25: ‰BSR.S…EOTS99*œREMOVE�ENTRIES�FROM�THE�DCQEOTS28ƒEQU�*ºEVENT‰BSR‡DCBSIGŽRELEASE�DCB�LOCK ‰BRA.S…EOTS50ŽCONTINUE�LUT�CHECKEOTS30: ‰BSETW…#DFLIOEOT,DCBFLG(A6,D5.L)/*œSET�FLAG�-�I/O�PENDING�BUT�EOT�TERMINATION�IN *§PROGRESS‰BSR…DCBSIGŽRELEASE�DCB�LOCKO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/835*ˆMOVE.W‚DCBATT(A6,D5.L),D1‚PICK�UP�DEVICE�ATTRIBUTES4‰MOVE.L‚DCBATT(A6,D5.L),D1‚PICK�UP�DEVICE�ATTRIBUTES *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰BTSTƒ#DATHIO,D1 ‰BEQ.SƒEOTS40*œBRANCH�IF�DEVICE�NOT�HALTABLE)‰TST.WƒDCBTMO(A6,D5.L)…YES,�IS�I/O�DONE�?‰BEQ.SƒEOTS50ŽYES‰BMI.SƒEOTS50ŽYES-‰BSR.SƒSAYHLTŽSCHEDULE�DRIVER�FOR�TERMINATION ‰BSRNE…KILIT *œKILL�SYSTEM&*¦IT�ATTEMPT�TO�HALT�I/O�DURING�END�OF*¦TASK�OPERATION�FAILEDEOTS40: ‰BSR‡LUTSIG*œRELEASE�THE�LUT�LOCK ‰BRA‡ASRBEG*œPROCESS�NEXT�EVENT  EOTS50ƒADD.Lƒ#LUTSEG,D6‰SUB.Bƒ#1,D2�CHECK�ALL�LUNS�?‰BNE…EOTS20ŽNOEOTS60ƒBSR…LUTSIG*œRELEASE�LUT�RESOURCE*B*ˆThe�original�EOT�event�may�no�longer�be�available�at�this�point.G*ˆConsequently�we�will�create�a�dummy�event�with�sufficient�information3*ˆto�allow�acknowledgement�to�the�terminating�task.*‰LEA‡GPBUFR(A2),A4,*œA4�=�Address�of�dummy�event�to�be�used�for*¡termination�acknowledgement"‰MOVE.L„LUTTID(A6,D7.L),EVUTSK(A4)"‰MOVE.L„LUTSES(A6,D7.L),EVUSES(A4)‰MOVE.B„#$42,EVUTIN(A4)*œEstablish�respetively*¡Terminating�task�id!*¡Terminating�task�session�number*¡Terminating�instruction�code*¦for�the�dummy�event‰BRA.SƒOKST20ŽRETURN*EOTS99: ‰BSR‡DCQWAIT ‰BSR‡DEQUEC ‰BSR‡DCQSIG*œREMOVE�ENTRIES�FROM�THE�DCQ‰RTS‰PAGE**ˆQUEUE�HALT�EVENT�TO�DRIVER*SAYHLT: ‰BSR‡X01000 ‰BEQ.S…SAY40%*œJMP�IF�NEW�I/O�TECHNIQUE�BEING�USEDSAYHALT:O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;*ˆMOVE.L‚DCBDID(A6,D5.L),QEVDRV+QEVTSK(A2)�SET�UP�DRIVER�ID ‰BSR‡DRVTSKID*œOBTAIN�DRIVER�IDO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< *‰MOVE.B‚#DRVHLT,SUBEVC(A2)‚SET�UP�SUB-CODE)‰MOVE.L‚D5,DCBADDR(A2)†SET�UP�DCB�POINTER‰LEA‡QEVDRV(A2),A0!*œA0�=�ADDRESS�OF�PARAMETER�BLOCK‰MOVE.L„#QEVNT,D0*œD0�=�DIRECTIVE�NUMBER‰TRAP†#1*œQUE�EVENT�TO�DRIVER"‰CMP.Bƒ#RTCDENAB,D0ˆASQ�DISABLED�?‰BEQ.SƒSAY10�YES,�DELAY‰CMP.Bƒ#RTCDTFUL,D0ˆASQ�FULL�?‰BNE.SƒSAY20�NO,�ERRORSAY10„ERQ.DELAY‚#100‰BRA.SƒSAYHALTSAY20„TST.LƒD0’RESET�CC‰RTSSAY40: ‰BSR‡IRPT40LD(*œCANCEL�TIMER�FOR�THIS�DCB�IF�ONE�EXIST‰LEA‡HLTCBLD(A2),A3#*œA3=ADDRESS�OF�I/O�PARAMETER�BLOCK ‰BSR‡HALTIT'*œHALT�THE�I/O�IN�PROGRESS�FOR�THIS�DCB ‰BEQ.S…SAY20"*œJMP�IF�HALT�REQUEST�WAS�ACCEPTED ‰BSR‡KILIT*œAT�LAST�AT�LAST‰PAGE**ˆRETURN�FROM�EVENT**RTNVT:&*ˆADD.Lƒ#60,A7ŽADJUST�STACK�LIKE�RTNVT *ˆRTR™RETURN* *ˆOK�STATUS*"OKSTATƒBSR…LUTSIG�RELEASE�LUT�LOCKOKST( 10ƒCLR.LƒD1OKST12:$‰BSR.SƒPUTSTAT�UPDATE�STATUS�IN�IOCBOKST20ƒLEA…AKRPRM(A2),A0(‰MOVE.B‚#4,ACKCCD(A0)‡SET�ZERO�BIT�IN�CC#*ˆBRA…ACKRQUŽGO�ACKNOWLEDGE�REQUEST**ˆACKNOWLEDGE�REQUEST**ˆA0�=�PARAM�BLOCK�POINTER*2ACKRQUƒMOVE.L‚EVUTSK(A4),ACKTSK(A0)�SET�UP�TASK�ID,‰MOVE.L‚EVUSES(A4),ACKSES(A0)�SET�UP�SESSION6‰MOVE.B‚EVUTIN(A4),ACKTIN(A0)�SET�UP�TRAP�INST.�NUMBER?‰OR.W„#AKOPSC+AKOPSD+AKOPRT,ACKOPT(A0)�SET�CC,D0,AND�START�TASK$‰CLR.LƒACKRD0(A0)ŠCLEAR�D0�PARAMETER&‰MOVE.B‚EVUTIN(A4),D2‡PICK�UP�TRAP�NO.$‰BTSTƒ#EVTNEOT,D2ŠEOT�NOTIFICATION�?‰BNE.SƒACKR10ŽYES,�SKIP�STATUS*œJMP�IF�EOT�NOTIFICATIONB‰MOVE.B‚IOCBLK+IOSSTA(A2),ACKRD0+3(A0)�MOVE�STATUS�TO�D0�PARAMETER‰BEQ.SƒACKR10ŽSTATUS�OK0*œJMP�IF�THE�REQUEST�THAT�WAS�INITIATED�WAS�DONE*œWITH�NO�ERRORS‰MOVE.L‚#IOSTIN,D1 ‰ASL.B‚#3,D11‰MOVE.B‚D1,ACKRD0(A0)‡SET�TRAP�NUMBER�IN�D0�PARAMACKR10:*ˆERQ.AKRQST�AKRPRM‹MAKE�CALL‰LEA‡AKRPRM(A2),A0!*œA0�=�ADDRESS�OF�PARAMETER�BLOCK‰MOVE.L„#AKRQST,D0*œD0�=�DIRECTIVE�NUMBER‰TRAP†#1*œACKNOWLEDGE�TASK ‰BSRNE…KILIT*œKILL�SYSTEM�IF *¦FOR�THIS�IOP�WE�WERE�UNABLE�TO$*¦ACKNOWLEDGE�THE�I/O�REQEST�BACK�TO *¦THE�TASKO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>/*ˆBRA…RTNVTLD�GO�RETURN�FROM�EVENT‚++++++++++++ ‰BRA‡ASRBEGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<**ˆUPDATE�STATUS**ˆENTRY:�D1�=�STATUS**-PUTSTAT‚MOVE.B‚D1,ONEB(A2)‰SET�UP�STATUS�ONEB(‰MOVE.B‚D1,IOCBLK+IOSSTA(A2)‚UPDATE�IOCB&‰LEA…MOVPRM(A2),A3ŠPARAM�BLOCK�ADDRESS‰CLR.LƒMVSTSK(A3)ŠSOURCE�TASK ‰CLR.LƒMVSSES(A3)ŠSOURCE�SESSION‰LEA‡ONEB(A2),A0$‰MOVE.L„A0,MVSADD(A3)ƒSOURCE�ADDRESS&‰MOVE.W‚#1,MVLENG+2(A3)‡LENGTH�OF�XFER(‰MOVE.L‚EVUTSK(A4),MVDTSK(A3)�DEST.�TASK+‰MOVE.L‚EVUSES(A4),MVDSES(A3)�DEST.�SESSION0‰MOVE.L‚EVURA0(A4),MVDADD(A3)�SET�UP�DEST.�ADDR.‰ADD.Lƒ#IOSSTA,MVDADD(A3)4*œBASE�ADDRESS�OF�USER�PB�PLUS�OFFSET�TO�STATUS�BYTE‰LEA‡MOVPRM(A2),A0*œA0�=�PARAMETER�BLOCK�ADDRESS‰MOVE.L„#MOVELL,D0*œD0�=�DIRECTIVE�NUMBER‰TRAP†#1*œMOVE�LOGICAL*œUPDATE�STATUS�FIELDPUTST10‚RTS™RETURN* *ˆSET�USER/SERVER�REQUEST�STATUS*"STARQSƒBSR…LUTSIGŽRELEASE�LUT�LOCK/‰ERQ.DERQST�#AKRSER+IOSTIN†ENABLE�SERVER�EVENTSO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.*ˆBEQ‡RTNVTLD�OK,�RETURN�FROM�EVENT�++++++++++ ‰BEQ‡ASRBEGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<&‰CMP.B…#RTCDNFND,D0ˆINTERCEPT�PRESENT?O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*ˆBEQ‡RTNVTLD�YES‡+++++++++++++ ‰BEQ‡ASRBEGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰BSR…KILIT�ERROR*9*ˆMAKE�NORMAL�I/O�RETURN�FOR�PROCESSING�THE�'NULL'�DEVICE*"IODONEƒBSR…LUTSIGŽRELEASE�LUT�LIST%‰MOVE.W‚IOSOPT(A5),D1‡PICK�UP�OPTIONS ‰AND.Wƒ#IOPPRO,D1ŠI/O�WITH�WAIT?%‰BEQ.SƒIODONE10ŒJUMP�IF�I/O�WITH�WAIT8‰BSR.SƒPUTREQŽQUEUE�COMPLETION�EVENT�FOR�I/O�AND�PROCEED IODONE10:‰CMP.W…#IOREAD,IOSFCT(A5) ‰BNE‡OKST10*œJUMP�IF�NOT�A�READ�REQUEST‰MOVE.L„#ISTAEOF,D1*œD1=EOF�STATUS ‰BRA‡OKST12*œIF�READING�A�NULL�FILE'*žTHEN�AN�'EOF'�STATUS�WILL�BE�RETURNED**ˆQUEUE�I/O�COMPLETION�EVENT*2PUTREQƒCLR.WƒQEVREQ+QEVOPT(A2)ƒCLEAR�OPTIONS�FIELD,‰MOVE.L‚EVUTSK(A4),QEVREQ(A2)�SET�UP�TASK�ID3‰MOVE.L‚EVUSES(A4),QEVREQ+QEVSES(A2)„SET�UP�SESSION‰MOVE.W‚IOSOPT(A5),D1%‰AND.Wƒ#IOPCAD,D1ŠCOMPLETION�ADDRESS?‰BEQ.SƒPUTR10ŽNO2‰MOVE.L‚IOSCAD(A5),CMPADDR(A2)ƒYES,�SET�UP�ADDRESS*‰OR.W„#QVOPAS,QEVREQ+QEVOPT(A2)‚SET�OPTION8PUTR10ƒMOVE.L‚EVURA0(A4),IOCBADR(A2)�SET�UP�IOCB�ADDRESS‰LEA‡QEVREQ(A2),A0!*œA0�=�ADDRESS�OF�PARAMETER�BLOCK‰MOVE.L„#QEVNT,D0*œD0�=�DIRECTIVE�NUMBER‰TRAP†#1 *œQUE�EVENT‰RTS‰PAGE**ˆQUEDCQ**ˆREV.�1.00‚4/15/80�(JIM�SMITH)**�THIS�ROUTINE�WILL�PUT�A!*�REQUESTOR�INTO�CONNECTION�WAIT.***!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�D) CB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME*ŽD0�=�0�=�SUCCESSFUL*“1�=�NOT�SUCCESSFUL**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�R�*ƒ*�*�P�P�P*�A�*…*�P�P�P�P*****#QUEDCQƒCLR.LƒD0’INIT.�RETURN�STATUS(‰MOVE.L‚IOCOMS(A2),A0‹SET�UP�SVT�POINTER*œA0=ADDRESS�I/O�COMMON�SEGMENT4‰MOVE.L‚SVTQUE(A0),D4‡PICK�UP�POINTER�TO�FIRST�ENTRY*œD4=ADDRESS�FIRST�ENTRY�IN�QUE(‰BNE.SƒQUED10ŽNOT�ZERO,�MUST�BE�AN�ENTRY"*œJMP�IF�AN�ENTRY�EXIST�IN�THE�QUE.‰MOVE.L‚SVTQST(A0),D4‡ZERO,�START�AT�BEGINNING0‰MOVE.L‚D4,SVTQUE(A0)‡SET�UP�FIRST�ENTRY�POINTER*œD4=START�ADDRESS�OF�DCQ'*ŸALSO�HAPPENS�TO�BE�FIRST�ENTRY�IN�QUE‰BRA.SƒQUED30ŽGO�SET�UP�ENTRY)QUED10ƒTST.LƒDCQDCB(A6,D4.L)…EMPTY�SLOT�?‰BEQ.SƒQUED35ŽYES,�USE�IT/*œJMP�IF�THIS�ENTRY�IN�DCQ�IS�AVAILABLE�FOR�USE0‰MOVE.L‚DCQPTR(A6,D4.L),D3‚POINTER�TO�NEXT�TABLE ‰BEQ.SƒQUED20ŽFOUND�THE�LAST�ONE4*œJMP�IF�WE�NEED�TO�ADD�ANOTHER�ENTRY�IN�THE�DCQ�TBL ‰MOVE.L‚D3,D4‰BRA.SƒQUED10ŽKEEP�LOOKINGQUED20ƒMOVE.L‚D4,D3$*œD3=ADDRESS�LAST�DCQ�ENTRY�IN�TABLE2‰ADD.Lƒ#DCQLEN*2,D4ˆCALC.�END�ADDRESS�OF�NEW�ENTRY)‰CMP.LƒSVTQND(A0),D4‡ROOM�FOR�NEW�ENTRY�?‰BGE…QUED95ŽNO*œJMP�IF�NO�ROOM�FOR�NEW�ENTRY‰SUB.Lƒ#DCQLEN,D4ŠYES*œD4=ADDRESS�OF�NEW�QUE�ENTRY=‰MOVE.L‚D4,DCQPTR(A6,D3.L)‚SET�FORWARD�POINTER�IN�PRIOR�ENTRY-QUED30ƒCLR.LƒDCQPTR(A6,D4.L)…MARK�END�OF�LIST@QUED35ƒCLR.LƒDCQNXT(A6,D4.L)…ZERO�POINTER�TO�NEXT�ENTRY�IN�DEVIC-‰MOVE.L‚D5,DCQDCB(A6,D4.L)‚SET�UP�DCB�POINTER-‰MOVE.L‚D6,DCQLUE(A6,D4.L)‚SET�UP�LUN�POINTER2‰MOVE.B‚EVUTIN(A4),DCQTIN(A6,D4.L)�SET�UP�TRAP�NO.,‰CLR.BƒDCQTIN+1(A6,D4.L)ƒCLEAR�RESERVED�BYTE-‰MOVE.L‚D7,DCQLUT(A6,D4.L)‚SET�UP�LUT�POINTER?‰MOVE.L‚EVURA0(A4),DCQLAD(A6,D4.L)�SET�UP�LOGICAL�ADDR.�OF�IOCB3‰MOVE.B‚EVUPSZ(A4),DCQPLN(A6,D4.L)�SET�UP�PB�LENGTH7‰MOVE.B‚EVUPRI(A4),DCQPRI(A6,D4.L)�SET�UP�TASK�PRIORITY*!*ˆLINK�NEW�ENTRY�INTO�DEVICE�LIST*>QUED50ƒMOVE.L‚SVTQST(A0),A0‡SET�UP�POINTER�TO�BEG.�OF�ALL�LIST*œA0=ADDRESS�OF�DCQ�ENTRIES4QUED55ƒCMP.LƒDCQDCB(A0),D5‚FIND�LIST�FOR�THIS�DEVICE‰BNE.SƒQUED60ŽNOT�HERE)‰CMP.LƒA0,D4�MAKE�SURE�IT'S�NOT�NEW�ENTRY‰BEQ.SƒQUED60ŽIT�IS+‰TST.LƒDCQNXT(A0)ŠFIRST�DEVICE�LIST�ENTRY�?‰BMI.SƒQUED70ŽYES'QUED60ƒTST.LƒDCQPTR(A0)ŠEND�OF�ALL�LIST‰BEQ.SƒQUED65ŽYES(‰MOVE.L‚DCQPTR(A0),A0‡NO,�GET�NEXT�ENTRY ‰BRA.SƒQUED55>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*&*ˆEDIT�TO�SEE�IF�OLD�OR�NEW�I/O�SCHEME* ‰BSR‡X01000‰BEQ.S…QUED40IO*œJMP�IF�NEW�I/O�METHODO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>‰CLR.BƒIOSSTA(A5)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*;*ˆMOVE.L‚DCBDID(A6,D5.L),QEVDRV+QEVTSK(A2)�SET�UP�DRIVER�ID ‰BSR‡DRVTSKID*œOBTAIN�DRIVER�ID*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 2‰MOVE.L‚D5,DCBADDR(A2)†SET�UP�DCB�ADDRESS�IN�EVENT‰MOVE.B„#DRVEVT,SUBEVC(A2)*œSET�EVENT�SUBCODE‰LEA‡QEVDRV(A2),A0!*œA0�=�ADDRESS�OF�PARAMETER�BLOCK‰MOVE.L„#QEVNT,D0*œD0�=�DIRECTIVE�NUMBER‰TRAP†#1*œQUE�EVENT�TO�DRIVER ‰BSRNE…KILIT*œKILL�THE�SYSTEM�IF$*¦ATTEMPT�TO�QUE�EVENT�TO�THE�DRIVER*¦(OLD�METHOD)�FAILED QUED20IO:%‰MOVE.W‚IOSOPT(A5),D1‡PICK�UP�OPTIONS‰AND.Wƒ#IOPPRO,D1‰BEQ.SƒQUED30IO*œJMP�IF�I/O�WITH�WAIT ‰BSR…OKSTATIO*œI/O�AND�PROCEEDQUED30IO�RTS™RETURN* QUED40IO:‰LEA‡INTPRMLD(A2),A0*œA0=ADDRESS�OF�INITIATE�I/O�PB"‰MOVE.L„DCBCCB(A6,D5.L),XIOCID(A0)&*œSET�CHANNEL�MNEMONIC�FOR�THIS�DEVICE"‰MOVE.L„LUTTID(A6,D7.L),XIOTSK(A0)"‰MOVE.L„LUTSES(A6,D7.L* ),XIOSES(A0)**œSET�TASK�NAME�AND�SESSION�NUMBER�OF�TASK*œORIGINATING�THE�I/O‰MOVE.L„D5,XIOUID(A0)*œSET�DCB�ADDRESS"‰MOVE.L„DCQLAD(A6,D4.L),XIOCPK(A0)+*œSET�ADDRESS�OF�I/O�PB�IN�THE�MEMORY�SPACE!*œOF�THE�TASK�ORIGINATING�THE�I/O‰CLR.W…XIOPLN(A0)$‰MOVE.B„DCQPLN(A6,D4.L),XIOPLN+1(A0)0*œSET�LENGTH�OF�I/O�PB�FROM�THE�TASK�ORIGINATING *œTHE�I/O ‰BSR‡HK_TIMER*œINITIATE�TIMER‰MOVE.L„#CMR,D0*œD0=DIRECTIVE�TO�INITIATE�I/O‰TRAP†#1*œINITIATE�I/O‰BEQ.S…QUED20IO*œJMP�IF�I/O�HANDLER�INVOKED ‰BSR‡KILIT%*œJMP�IF�UNABLE�TO�INVOKE�I/O�HANDLER*O*------------------------------------------------------------------------------‰PAGE**ˆDEQUEC**ˆREV.�1.00‚4/15/80�(JIM�SMITH)**�THIS�ROUTINE�WILL�PURGE�A*�A�DCQ�ENTRY.J 3M<RDcLaTP\NdMlNtM|J„KŒF”HœV¤\¬U´O¼QÄMÌTÔUÜ1***!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�*‡*�P�P�P *�A�*‡P�P�P�P*****.DEQUECƒMOVE.L‚IOCOMS(A2),A0‹SET�UP�SVT�POINTER4‰MOVE.L‚SVTQUE(A0),A0‡PICK�UP�POINTER�TO�FIRST�ENTRY4DEQ10„CMP.LƒDCQDCB(A0),D5‡FIND�LIST�FOR�RIGHT�DEVICE‰BNE.SƒDEQ20�NOT�HERE'‰TST.LƒDCQNXT(A0)ŠFIRST�ENTRY�IN�LIST�?‰BMI.SƒDEQ30�YES)DEQ20„MOVE.L‚DCQPTR(A0),A0‡GET�NEXT�ENTRY ‰BRA.SƒDEQ100DEQ30„CMP.LƒDCQLUT(A0),D7‡THIS�THE�RIGHT�ENTRY�?‰BEQ.SƒDEQ40�YES ‰MOVE.L‚A0,D4(‰MOVE.L‚DCQNXT(A0),D0‡NO,�GET�NEXT�ENTRY ‰BCLRƒ#31,D0 ‰MOVE.L‚D0,A0 ‰BRA.SƒDEQ302DEQ40„MOVE.L‚DCQNXT(A0),D0‡IS�IT�THE�FIRST�ENTRY�?‰BGE.SƒDEQ60�NO‰BCLRƒ#31,D0�YES‰TST.LƒD0’ALSO�LAST�ENTRY�?‰BEQ.SƒDEQ50�YES.‰BSETƒ#7,DCQNXT(A6,D0.L)ƒNO,�SET�NEXT�TO�FIRST0‰MOVE.L‚D0,DCBDCQ(A6,D5.L)‚UPDATE�POINTER�IN�DCB ‰BRA.SƒDEQ800DEQ50„CLR.LƒDCBDCQ(A6,D5.L)…CLEAR�POINTER�IN�DCB ‰BRA.SƒDEQ802DEQ60„TST.LƒDCQNXT(A6,D4.L)…IS�PRIOR�FIRST�ENTRY�?‰BGE.SƒDEQ70�NO"‰BSETƒ#31,D0�YES,�RESET�FIRST�FLAG+DEQ70„MOVE.L‚D0,DCQNXT(A6,D4.L)‚RELINK�LIST.DEQ80„CLR.LƒDCQDCB(A0)ŠCLEAR�DCB�POINTER�FIELD)‰CLR.LƒDCQLUT(A0)ŠCLEAR�LUT�POINTER�FIELDC‰MOVE.W‚#AKOPAA,AKRPRM+ACKOPT(A2)�SET�ACK.�ALL�OPTION�FOR�ACK.�REQU7‰BCLR†#LUSFCW,LUTCSF(A6,D6.L)‡CLEAR�CONNECTION�WAIT�BIT ‰RTS™RETURN‰PAGE***ˆTHIS�IS�THE�COMMON�ERROR�ROUTINE�SECTION***ˆSET�CC�FOR�BAD�RETURN*/SETCNDƒLEA…AKRPRM(A2),A0ŠSET�CC�FOR�ACKNOWLEDGE‰CLR.BƒACKCCD(A0)ŠREQUEST.‰CLR.WƒACKOPT(A0)"‰BRA…ACKRQUŽGO�ACKNOWLEDGE�REQUEST**ˆBUFFER�ADDRESS�ERROR*8ERCBUFƒMOVE.L‚#ISTAADD+EREX,D1„SET�UP�RETURN�CODE�STATUS‰BRA.SƒERCCC�GO�SET�CC**ˆCOMMAND�ERROR*$ERCFNTƒBSR.SƒDCBSIGŽRELEASE�DCB�LOCK2ERCKODƒMOVE.L‚#ISTAIF+EREX,D1…SET�UP�RETURN�STATUS‰BRA.SƒERCCC�GO�SET�CC2ERCCODƒMOVE.L‚#ISTAIF+EREX,D1…SET�UP�RETURN�STATUS‰BRA.SƒERCCCSŽGO�SET�CC* *ˆLUN�ERROR*3ERCLUNƒMOVE.L‚#ISTAILU+EREX,D1„SET�UP�RETURN�STATUS‰BRA.SƒERCCC�GO�SET�CC**ˆDEVICE�FUNCTION�ERROR*#ERCDF„BSR.SƒDCBSIGŽRELEASE�DCB�LOCK2ERCDFEƒMOVE.L‚#ISTATM+EREX,D1…SET�UP�RETURN�STATUS‰BRA.SƒERCCC�GO�SET�CC**ˆINTERNAL�ERROR*2ERCFMSƒMOVE.L‚#ISTAIE+EREX,D1…SET�UP�RETURN�STATUS‰BRA.SƒERCCCSŽGO�SET�CC**ˆASSIGNMENT�ERROR*3ERCASGƒMOVE.L‚#ISTAILU+EREX,D1„SET�UP�RETURN�STATUS ‰BRA.SƒERCCC**ˆSTATUS�CHANGED�ERROR*ERCDSCƒMOVE.L‚#ISTASC+EREX,D1 ‰BRA.SƒERCC**ˆDEVICE�NOT�READY*2ERCDEVƒMOVE.L‚#ISTANR+EREX,D1…SET�UP�RETURN�STATUS‰BRA.SƒERCC�GO�SET�CC**ˆDEVICE�WRITE�PROTECTED*1ERCWP„MOVE.L‚#ISTAWP+EREX,D1…SET�UP�RETURN�STATUS ‰BRA.SƒERCC**ˆINVALID�PARAM�BLOCK�ADDRESS*2ERCPRMƒMOVE.L‚#ISTAIP+EREX,D1…SET�UP�RETURN�STATUS‰BRA.SƒERCCCSŽGO�SET�CC* *ˆDEVICE�BUSY*8ERCBSYƒBTST‚#LUSFDV,LUTCSF(A6,D6.L)…DEVICE�ASSIGNNMENT�?‰BNE.SƒERCB10ŽYES‰BSR.SƒFCBSIGŽNO,�RELEASE�FILE ‰BRA.SƒERCB20$ERCB10ƒBSR.SƒDCBSIGŽRELEASE�DCB�LIST2ERCB20ƒM* OVE.L‚#ISTADB+EREX,D1…SET�UP�RETURN�STATUS ‰BRA.SƒERCCC**ˆRANDOM�RECORD�INVALID*2ERCRRNƒMOVE.L„#ISTARR+EREX,D1…SET�UP�RETURN�STATUS ‰BRA.S…ERCC**ˆEND�OF�MEDIUM*3ERCEOMƒMOVE.L„#ISTAEOF+EREX,D1…SET�UP�RETURN�STATUS**ˆSET�STATUS�AND�CC*"ERCC…BSR.SƒDCBSIG‰RELEASE�DCB�LIST#ERCCC„BSR.SƒLUTSIGŽRELEASE�LUT�LIST ERCCCSƒBSR…PUTSTAT�UPDATE�STATUS‰BRA…SETCNDŽUPDATE�CC*&*ˆOPERATING�SYSTEM�TASK�DOES�NOT�EXIST*ERCOSNX:‰MOVE.L„#ISTAOSNX+EREX,D1"*œD1�=�ERROR�CODE�REFLECTING�ERROR ‰BRA.S…ERCCCS*œCONTINUE�PROCESSING‰PAGE**�RESOURCE�MANAGEMENT�ROUTINES*!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER*%*ˆRETURN:�SAME�EXCEPT�A0�&�D0�CHANGED*****ˆWAIT�ON�LUT�SEMAPHORE*,LUTWAIT‚MOVE.L…#SVTSLUT,D0ŠGET�LUT�SEMAPHORE‰BRA.SƒSEMWAIT**ˆWAIT�ON�DCB�SEMAPHORE*,DCBWAIT‚MOVE.L�#SVTSDCB,D0ŠGET�DCB�SEMAPHORE‰BRA.SƒSEMWAIT**ˆWAIT�ON�DCQ�SEMAPHORE*,DCQWAIT‚MOVE.L�#SVTSDCQ,D0ŠGET�DCQ�SEMAPHORE‰BRA.SƒSEMWAIT**ˆWAIT�ON�FCB�SEMAPHORE*,FCBWAIT‚MOVE.L�#SVTSFCB,D0ŠGET�FCB�SEMAPHORE***SEMWAIT‚MOVE.L�IOCOMS(A2),A1 ‰ADD.L�D0,A1SEMW00ƒTAS…(A1)‰BEQ.SƒSEMW10ŽOK,�WE�GOT�IT‰ERQ.RELINQ’CAN'T�GET�IT�NOW‰BRA.SƒSEMW00ŽTRY�AGAINSEMW10ƒRTS™RETURN**ˆSIGNAL�ON�LUT�SEMAPHORE*/LUTSIGƒMOVE.L�#SVTSLUT,D0ŠRELEASE�LUT�SEMAPHORE‰BRA.S�XXXSIG�RETURN**ˆSIGNAL�ON�DCB�SEMAPHORE*/DCBSIGƒMOVE.L�#SVTSDCB,D0ŠRELEASE�DCB�SEMAPHORE‰BRA.S�XXXSIG�RETURN**ˆSIGNAL�ON�DCQ�SEMAPHORE*/DCQSIGƒMOVE.L�#SVTSDCQ,D0ŠRELEASE�DCQ�SEMAPHORE‰BRA.S�XXXSIG�RETURN**ˆSIGNAL�ON�FCB�SEMAPHORE*FCBSIGƒMOVE.L�#SVTSFCB,D0XXXSIGƒMOVE.L�IOCOMS(A2),A0‰CLR.B�(A0,D0)‰RTS‰PAGE**ˆAPCHK**ˆREV.�1.00‚7/01/79�(JIM�SMITH)*/*�THIS�ROUTINE�WILL�CHECK�FOR�ACCESS�PERMISSION7*�CONFLICTS�BETWEEN�THE�LUN�AND�THE�FUNCTION�REQUESTED.3*�ALL�RESOURCE�LOCKS�ARE�ASSUMED�TO�HAVE�BEEN�MADE.*#*ˆENTRY:�A4�=�QUEUE�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER**ˆRETURN:�SAME*�D0�=�0�=�NORMAL�RETURN*•1�=�AP�CONFLICT**�D3�=�READ‚MAP�VALUE*�D4�=�WRITE�MAP�VALUE* *•MAP�VALUE**œ0�-�NO�PERMISSION*œ1�-�PUBLIC�PERMISSION*›-1�-�EXCLUSIVE�PERMISSION***ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�R�*�*�*�*�P�P�P *�A�*‡P�P�P�P****&APDCHKƒCLR.LƒD0’INITIALIZE�RETURN�CODE ‰CLR.L…D1)‰MOVE.B‚LUTCAP(A6,D6.L),D1„PICK�UP�LUN�AP)*œD1=CURRENT�LUN�ACCESS�PERMISSION�VALUES‰BSR…MAPAP�MAP�AP�TO�R/W�VALUES*œD3=READ‚MAP�VALUE*œD4=WRITE�MAP�VALUE.APD20„CMP.Wƒ#IOREAD,IOSFCT(A5)‚READ�FUNCTION�?‰BEQ.SƒAPD30�YES*‰CMP.Wƒ#IOWRIT,IOSFCT(A5)‚WRITE�FUNCTION�?‰BEQ.SƒAPD40�YES‰CMP.W…#IOTBRK,IOSFCT(A5) ‰BEQ.S…APD40*œTRANSMIT�BREAK�FUNCTION"‰CMP.Wƒ#IOUPDR,IOSFCT(A5)‚UPDATE�?‰BEQ.SƒAPD40�YES)‰CMP.Wƒ#IODELR,IOSFCT(A5)‚DELETE�RECORD�?‰BEQ.SƒAPD40�YES"‰CMP.Wƒ#IOFRMT,IOSFCT(A5)‚FORMAT�?‰BEQ.SƒAPD45�YES-‰CMP.Wƒ#IOOWIN,IOSFCT(A5)‚OUTPUT�WITH�INPUT�?‰BNE.SƒAPD25�NO,�RETURN‰TST.WƒD3’YES,�OK�TO�READ�?‰BEQ.SƒAPD50�NO,�ERROR‰TST.WƒD4’OK�TO�WRITE�?‰BEQ.SƒAPD50�NO,�ERRORAPD25„RTS™SUCCESSFUL,�RETURNAPD30„TST.WƒD3’OK�TO�READ�?‰BEQ.SƒAPD50�NO,�ERROR‰RTS™SUCCESSFUL,�RETURNAPD40„TST.WƒD4’OK�TO�WRITE�?‰BEQ.SƒAPD50�NO,�ERROR‰RTS™SUCCESSFUL,�RETURN3*APD45„CMP.Bƒ#FOPEREW,LUTCAP(A6,D6.L)�EXCLUSIVE�R/W%APD45„CMP.Bƒ#FOPEREW,D1�EXCLUSIVE�R/W‰BNE.SƒAPD50�NO,�ERROR‰RTS&APD50„MOVE.L‚#1,D0�SET�BAD�RETURN�CODE ‰RTS™RETURN‰PAGE**ˆATCHK**ˆREV.�1.00‚7/01/79�(JIM�SMITH)*/*�THIS�ROUTINE�WILL�CHECK�FOR�DEVICE�ATTRIBUTES,*�CONFLICT�BETWEEN�THE�LUN�AND�THE�REQUESTED *�FUNCTION.*#*ˆENTRY:�A4�=�QUEUE�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�DCB�POINTER*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER**ˆRETURN:�SAME*�D0�=�0�=�NORMAL�RETURN*•1�=�INVALID�FUNCTION*”-1�=�INVALID�DEV+ ICE�FUNCTION**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�R�*�*�*ƒP�P�P *�A�*‡P�P�P�P*****ˆCHECK�FUNCTION�AND�ATTRIBUTES*&ATDCHKƒCLR.LƒD0’INITIALIZE�RETURN�CODE ‰CLR.LƒD3,‰LEA…ATFCHK(PC),A0ŠSET�ATTRIBUTE�CHECK�TABLE9‰MOVE.W‚LUTATT(A6,D6.L),D2„PICK�UP�FILE/DEVICE�ATTRIBUTES*œD2=CURRENT�LUN�ATTRIBUTES ‰CLR.LƒD1&‰MOVE.W‚IOSFCT(A5),D1‡PICK�UP�FUNCTION"*œD1=REQUESTING�TASK�FUCNTION�CODE-ATD10„CMP.Wƒ(A0)+,D1ŒFIND�FUNCTION�IN�TABLE�?‰BEQ.SƒATD30�YES3ATD15„TST.Bƒ(A0)+�POTENTIAL�END�OF�ATTRIBUTE�BITS�?‰BMI.SƒATD20�YES‰BRA.SƒATD15�NO,�KEEP�CHECKINGATD20„TST.Bƒ(A0)�END�?‰BMI.SƒATD15�MAYBE‰CMP.Lƒ#ATFEND,A0ŠEND�OF�TABLE"‰BEQ.SƒATD90�YES,�INVALID�FUNCTION‰BRA.SƒATD10�NO,�CONTINUE+ATD30„MOVE.B‚(A0)+,D3ŒPICK�UP�ATTRIBUTE�BIT*œD3=ATTRIBUTE�FROM�LOCAL�TABLE$‰BMI.SƒATD40�END�OF�CHECK,�IT'S�OK�!#‰BTST„D3,D2�SUPPORT�THIS�FUNCTION�?!‰BEQ.SƒATD97�NO,�INVALID�FUNCTION‰BRA.SƒATD30�CONTINUE**ˆCHECK�OPTIONS�AND�ATTRIBUTES*1ATD40„LEA…ATOCHK(PC),A0ŠSET�ATTRIBUTE�CHECK�TABLE(*œA0=ADDRESS�ATTRIBUTE�CHECK�TABLE�(ACT)%‰MOVE.W‚IOSOPT(A5),D1‡PICK�UP�OPTIONS$*œD1=OPTIONS�FROM�REQUESTING�TASK�PB-ATD60„MOVE.L‚(A0)+,D3ŒLOAD�OPTION�BIT�PATTERN *œD3=OPTION�BIT�PATTERN�FORM�ACT ‰TST.W…(A0)+$‰BEQ.SƒATD65�THIS�IS�A�NOT�CONDITION(*œJMP�IF�EDITING�THE�OFF�(NOT)�CONDITION ‰AND.L…D1,D3$*œD1=OPTIONS�FROM�REQUESTING�TASK�PB ‰BNE.S…ATD80*œJMP�IF�BIT�SET ‰BRA.S…ATD70*œJMP�IF�BIT�NOT�SETATD65: ‰AND.L…D1,D3$*œD1=OPTIONS�FROM�REQUESTING�TASK�PB ‰BEQ.SƒATD80*œJMP�IF�THIS�BIT�NOT�SET)ATD70„TST.Bƒ(A0)+�END�OF�ATTRIBUTE�BITS�?‰BMI.SƒATD87�YES‰BRA.SƒATD70�NO,�KEEP�CHECKING%ATD75„CMP.Lƒ#ATOEND,A0ŠEND�OF�TABLE�?*ˆBEQ.SƒATD95�YES,�ALL�OK�!‰BHS.SƒATD95�YES,�ALL�OK�!‰BRA.SƒATD60�NO,�CONTINUEATD80„CLR.LƒD3+ATD85„MOVE.B‚(A0)+,D3ŒPICK�UP�ATTRIBUTE�BIT$‰BMI.SƒATD87�END�OF�CHECK,�IT'S�OK�!#‰BTST„D3,D2�SUPPORT�THIS�FUNCTION�?!‰BEQ.SƒATD97�NO,�INVALID�FUNCTION‰BRA.SƒATD85�CONTINUE%ATD87„TST.Bƒ(A0)�END�OF�BIT�SEGMENT�?‰BPL.SƒATD75�YES‰TST.Bƒ(A0)+�NO,�ADJUST�POINTER ‰BRA.SƒATD75&ATD90„MOVE.L‚#1,D0�SET�BAD�RETURN�CODEATD95„RTS™RETURN)ATD97„MOVE.L‚#-1,D0ŽSET�BAD�RETURN�STATUS ‰RTS™RETURN‰PAGE**ˆLUTLK**ˆREV.�1.00‚7/01/79�(JIM�SMITH)*-*�THIS�UTILITY�ROUTINE�IS�CALLED�TO�LOOK�UP�A%*�LOGICAL�UNIT�TABLE�IN�THE�LUT�LIST.$*’FIND�A�LUT�FOR�THE�REQUESTING�TASK* *ˆENTRY:�A0�=�POINTER�TO�TASK�ID*�A4�=�QUEUE�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER**ˆRETURN:�SAME *�CONDITIONS)*œEQUAL�-->�LUT�FOR�REQUESTING�TASK…FOUND1*˜NOT�EQUAL�-->�LUT�FOR�REQUESTING�TASK�NOT�FOUND*�D7�=�LUT�POINTER'*•ADDRESS�LUT�ENTRY�FOR�REQUESTING�TASK**ˆUSING:ƒ0�1�2�3�4�5�6�7*�D�R�**�A�P�*…P�P�P�P****LUTLK:(‰MOVE.L‚IOCOMS(A2),A1ŠSET�UP�SVT�POINTER*œA1=I/O�COMMON�SEGMENT�ADDRESS-‰MOVE.L‚SVTLUT(A1),D7‡SET�UP�LUT�LIST�POINTER*œD7=ADDR�FIRST�LUT�ENTRY$‰BEQ.SƒLUTL20ŽERROR�-�NO�LUT�POINTER%LUTL10ƒMOVE.L‚(A0),D1�PICK�UP�TASK�ID*œD1=REQUESTING�TASK�ID!‰CMP.LƒLUTTID(A6,D7.L),D1„MATCH�?‰BNE.SƒLUTL15ŽNO0*œJMP�IF�REQUESTING�TASK�ID�NOT�EQUAL�TO�TASK�ID*œIN�THIS�LUT�ENTRY ‰MOVE.L‚4(A0),D1ŒPICK�UP�SESSION#*œD1=REQUESTING�TASK�SESSION�NUMBER!‰CMP.LƒLUTSES(A6,D7.L),D1„MATCH�?‰BEQ.SƒLUTL25ŽYES)*œJMP�IF�MATCH�ON�TASK�ID�AND�SESSION�NBR>LUTL15ƒMOVE.L‚LUTPTR(A6,D7.L),D7„PICK�UP�POINTER�TO�NEXT�TABLE‰BNE.SƒLUTL10ŽMORE�TO�CHECK'LUTL20ƒMOVE.L‚#1,D0�ERROR�-�END�OF�LISTLUTL25ƒRTS™RETURN‰PAGE**ˆLUNLK**ˆREV.�1.00‚7/01/79�(JIM�SMITH)*-*�THIS�UTILITY�ROUTINE�IS�CALLED�TO�LOOK�UP�A*�LOGICAL�UNIT�ENTRY�IN�AN�LUT.*#*ˆENTRY:�A4�=�QUEUE�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER"*�D1�=�LUN�FROM�REQUESTING�TASK�PB,*�D7�=�START�ADDRESS�FOR�REQUESTING�TASK�LUT**ˆRETURN:�SAME'*�D0�=�0�=�NORMAL�RETURN‚-�NOT�ASSIGNED*•1�=�ACTIVE�ENTRYƒ-…ASSIGNED*”-1�=�INVALID�LUN*�D5�=�FCB/DCB�POINTER*�D6�=�LUN�POINTER**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�R�*‹P *�Aƒ*…P�P�P�P+ **** LUNLK„CLR.LƒD0’INITIALIZE�STATUS‰CMP.BƒLUTMLU(A6,D7.L),D1 ‰BHI.SƒLUNL10/*œJMP�IF�LUN�REQUESTED�>�MAXIMUM�NUMBER�OF�LUNS *œALLOWED(‰MULU„#LUTSEG,D1ŠCALCULATE�OFFSET�IN�LUT#*œLUN�TIMES�LOGICAL�UNIT�ENTRY�SIZE‰LEA…LUTBEG(A6,D7.L),A12*œA1=START�ADDR�OF�LOGICAL�UNIT�ENTRIES�IN�THE�LUT&‰ADD.LƒD1,A1�ADD�OFFSET�TO�LUT�POINTER‰MOVE.L‚A1,D6�SET�POINTER�IN�D61*œA1=D6=ADDR�OF�LUN�ENTRY�REQUESTED�FOR�THIS�TASK(‰MOVE.B‚LUTCSF(A1),D2‡PICK�UP�LUN�STATUS*œD2=CURRENT�LUN�STATUS)‰BTSTƒ#LUSFAC,D2‹LUN�ACTIVE�?�--�ASSIGNED‰BNE.SƒLUNL15ŽYES*œJMP�IF�LUN�CURRENTLY�ASSIGNED ‰RTS™RETURN,LUNL10ƒMOVE.L‚#-1,D0ŽSET�INVALID�RETURN�CODE ‰RTS™RETURN*LUNL15ƒMOVE.L‚#1,D0�SET�ACTIVE�RETURN�CODE-‰MOVE.L‚LUTDCB(A6,D6.L),D5„SET�UP�DCB�POINTER,*œD5=ADDRESS�OF�DCB/FCB�THIS�LUN�ASSIGNED�TO ‰RTS™RETURN‰PAGE**ˆMAPAP*$*�THIS�ROUTINE�WILL�MAP�AP�OPTION�TO*�SEPARATE�READ/WRITE�VALUES.*9*ˆENTRY:�D1�=�CURRENT�AP�OPTION�FROM�LUN�ENTRY�IN�THE�LUT*)*ˆEXIT:�D3.W�AND�D4.W�=�0�=�NO�PERMISSION*ž1�=�PUBLIC�PERMISSION*�-1�=�EXCLUSIVE�PERMISSION**-MAPAP„LEA…ACPTBL(PC),A0‹SET�MAP�TABLE�POINTER ‰CLR.L…D3 ‰MOVE.L„D3,D4,*œINITIALIZER�D3�=�D4�=�NO�PERMISSION�STATUSMAP10„CMP.Wƒ(A0),D1�MATCH�?‰BNE.SƒMAP15�NO#‰MOVE.W‚2(A0),D3ŒSET�READ�MAP�VALUE$‰MOVE.W‚4(A0),D4ŒSET�WRITE�MAP�VALUEMAP20„RTS…RETURN(MAP15„ADD.Lƒ#APTEL,A0�BUMP�TABLE�POINTER*œA0=ADDRESS�NEXT�TABLE�ENTRY‰CMP.L…#ACPTBLN,A0 ‰BHS.S…MAP20.*œJMP�IF�TABLE�EXAMINED�AND�NO�MATCH�ON�ACCESS*œPERMISSION�FOUND‰BRA.SƒMAP10�CONTINUE�SEARCH‰PAGE** *ˆROUTINE�TO9*’DETERMINE�IF�THE�OLD�OR�NEW�I/O�TECHNIQUE�IS�BEING�USED**ˆINPUT**’D5=ADDRESS�OF�DEVICE�CONTROL�BLOCK�(DCB) *’A6=ZERO**ˆOUTPUT *’CONDITIONS)*œEQUAL�-->�NEW�I/O�TECHINIQUE�BEING�USED-*˜NOT�EQUAL�-->�OLD�I/O�TECHINIQUE�BEING�USED*X01000:‰CMP.L…#IOSID,DCBDID(A6,D5.L) ‰BNE.S…X01100*œJMP�IF�OLD�TECHINQUE‰CMP.L…#1,DCBDID+4(A6,D5.L)X01100:‰RTS-*œRETURN�WITH�APPROPRIATE�CONDITION�CODES�SET‰PAGE*H**************************************************************************&*ˆRETURN�FROM�EVENT�REGISTERS�RESTORED**K****************************************************************************O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>4*RTNVTLD‚MOVEM.Lƒ(A7)+,D0-D7/A0-A6ƒRESTORE�REGISTERS *ˆRTR‘RETURN*******@*******‚WITH�THE�NEW�TASK-ID�CONCEPT�OF�TCB�ADDRESS/PROCESSOR�ID*******‚THIS�LOGIC�WAS�REMOVED*******O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGEH***************************************************************************ˆUNSOLICITED�DEVICE�STATUS***F***********************************************************************USTATLD:O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/83*ˆBTSTWƒ#DATRAN,DCBATT(A6,D5.L)‰BTSTMƒDATRAN,DCBATT,A6,D5.L *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰BNE.SƒUSTATALD*œJMP�IF�RANDOM�ACCESS�DEVICE*Ë***É*****Ç***,****…WE�HAVE�A�NON-RANDOM�ACCESS�DEVICEž*******Ç*****É***Ë* USTAT10L:‰BTST„#XDSBRK,XRPDST(A4)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ˆBEQ…RTNVTLD ‰BEQ‡ASRBEGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*œJMP�IF�NOT�A�BREAK�CONDITION ‰BSR…DCBWAIT*œLOCK�UP�DCB�LIST‰ADD.Bƒ#1,DCBBCT(A6,D5.L)*œADJUST�THE�BREAK�COUNT ‰BSR…DCBSIG*œRELEASE�THE�DCB�LIST ‰BSR‡BRAKERLD*œNOTIFY�BREAK�CLAIMERO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ˆBRA…RTNVTLD ‰BRA‡ASRBEGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*Ë***É*****Ç***+****…PROCESSING�A�RANDOM�ACCESS�DEVICEŸ*******Ç*****É***Ë* USTATALD: ‰BSR…DCBWAIT*œLOCKUP�DCB�LIST‰MOVE.W‚DCBFLG(A6,D5.L),D1,*œD1, =DCB�FLAGS�PRIOR�TO�RECEIVING�THIS�EVENT‰MOVE.B‚XRPDST(A4),D2&*œD2=DEVICE�STATUS�RETURNED�WITH�EVENT‰BTSTƒ#XDSNRB,D2‰BEQ.SƒUST10ALD*œJMP�IF�DEVICE�READY‰BCLRƒ#DFLGON,D1*œSET�FLAG�-�DEVICE�OFFLINE‰BRA.SƒUST20ALD*UST10ALD�BSETƒ#DFLGON,D1*œSET�FLAG�-�DEVICE�ONLINE‰BCLRƒ#DFLGWP,D1'*œSET�FLAG�-�DEVICE�NOT�WRITE�PROTECTED‰BTSTƒ#XDSWPB,D2‰BEQ.SƒUST20ALD#*œJMP�IF�DEVICE�NOT�WRITE�PROTECTED‰BSETƒ#DFLGWP,D1#*œSET�FLAG�-�DEVICE�WRITE�PROTECTED"UST20ALD�MOVE.W‚DCBFLG(A6,D5.L),D2"*œD2=DCB�FLAGS�PRIOR�TO�THIS�EVENT‰BTSTƒ#DFLGON,D2‰BEQ.SƒUST30ALD.*œJMP�IF�PREVIOUS�STATE�OFFLINE�PRIOR�TO�EVENT‰BTSTƒ#DFLGON,D1‰BNE.SƒUST50ALD#*œJMP�IF�CURRENT�STATE�STILL�ONLINE‰BRA.SƒUST40ALD-*œJMP�-�THE�STATE�WENT�FROM�ONLINE�TO�OFFLINEUST30ALD�BTSTƒ#DFLGON,D1‰BEQ.SƒUST50ALD$*œJMP�IF�CURRENT�STATE�STILL�OFFLINE1*œFALL�THRU�-->�STATE�WERN�FROM�OFFLINE�TO�ONLINEUST40ALD�BSETƒ#DFLGSC,D1"*œSET�FLAG�-�DEVICE�STATUS�CHANGED UST50ALD:‰MOVE.W‚D1,DCBFLG(A6,D5.L)*œUPDATE�DEVICE�STATUS�IN�DCB ‰BSR…DCBSIG*œRELEASE�THE�DCB�LIST‰BTSTW…#DFLGSC,D1O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ˆBEQ‡RTNVTLD ‰BEQ‡ASRBEGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< *œJMP�IF�DEVICE�STATUS�UNCHANGED ‰BSR…TELLFMSL*œNOTIFY�FMS�ABOUT�CHANGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ˆBRA…RTNVTLD ‰BRA‡ASRBEGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*œRETURN‰PAGEN*********************************************************************************ˆUNRECOVERABLE�ERROR**M******************************************************************************DOWNLDƒBSR…DCBWAIT*œLOCK�DCB�LIST‰MOVE.LƒIOCOMS(A2),A1‰MOVE.L‚SVTDCB(A1),A1*œA1=START�ADDRESS�OF�DCB�LISTDOWN10LD�MOVE.L‚A1,D5*œD5=ADDRESS�OF�DCB�PROCESSING‰BEQ.SƒDOWN30LD*œJMP�IF�DCB�LIST�PROCESSED‰MOVE.L‚XRPUID(A4),D1*œD1=CHANNEL�ID�THAT'S�DOWN‰CMP.LƒDCBCCB(A6,D5.L),D1‰BNE.SƒDOWN20LD,*œJMP�IF�CHANNEL�FOR�THIS�DCB�NOT�ASSOCIATED*œWITH�ONE�DOWN‰BSETƒ#DFLGSC,DCBFLG(A6,D5.L)‰BCLRƒ#DFLGON,DCBFLG(A6,D5.L)"*œSET�FOLLOWING�FLAGS�RESPECTIVELY*�DEVICE�STATUS�HAS�CHANGED*�DEVICE�OFFLINEDOWN20LD�MOVE.L‚DCBPTR(A1),A1 *œA1=ADDRESS�NEXT�DCB�TO�PROCESS‰BRA.SƒDOWN10LD*œCONTINUE�LOOP DOWN30LD:*ˆADD.Lƒ#60,A7*œADJUST�STACK�FOR�RTR�RETURN ‰BSR…DCBSIG*œRELEASE�THE�DCB�LIST‰CMP.W…#XSTVDWN,XRPSTV(A4)‰BEQ.SƒDOWN40LD*œJMP�IF�CHANNEL�DOWN�RETURNED‰TST.L…RTSADRLD(A2)‰BNE.S…DOWN40LD"*œJMP�IF�PROCESSING�ONE�TIME�LOGIC*œTO�ATTATCH�CCB'S‰BSR.SƒSETPERLD* DOWN40LD:"‰BRA‡ASRBEGŒJUST�RETURN�FROM�EVENT‰PAGEJ****************************************************************************‚DEVICE�INITIALIZATION�ROUTINE* *ˆROUTINE�TO1*’CONFIGURE�ALL�DEVICES�ASSOCIATED�WITH�A�CHANNEL$*’IF�THE�DEVICE�IS�OTHER�THAN�RANDOM*œOR<*’ESTABLISH�STATUS�FOR�ALL�DEVICES�ASSOCIATED�WITH�A�CHANNEL*’IF�THE�DEVICE�IS�RANDOM**ˆINPUT;*’D1�=�CHANNEL�ID�OF�CHANNEL�CONTROL�BLOCK�(CCB)�TO�PROCESS*C*ˆENTRY�POINT�FOR�COMPLETION�OF�INITIALIZTION�REQUEST�WHETHER�IT�IS&*’CONFIGURE�OR�STATUS�IS‚--->�SETP50LD*K**************************************************************************** SETPERLD:‰MOVE.L‚(A7)+,RTSADRLD(A2)*œSAVE�RETURN�ADDRESS‰MOVE.L‚IOCOMS(A2),A1‰MOVE.L‚SVTDCB(A1),A1*œA1=START�ADDRESS�OF�DCB�LISTSETP10LD�MOVE.L‚A1,D5‰BNE.SƒSETP20LD*œJMP�IF�ANOTHER�DCB�TO�PROCESS"SETP15LD�MOVE.L‚RTSADRLD(A2),-(A7)*œRESTORE�RETURN�ADDRESS‰CLR.L…RTSADRLD(A2)**œSET�FLAG�-�NOT�PROCESSING�ONE�TIME�LOGIC*§TO�ATTATCH�CCB'S‰RTS*œRETURN SETP20LD:‰CMP.LƒDCBCCB(A6,D5.L),D1‰BEQ.SƒSETP30LD3*œJMP�IF�THIS�DEVICE�ASSOCIATED�WITH�CCB�PROCESSING‰MOVE.L‚DCBPTR(A1),A1 *œA1=ADDRESS�NEXT�DCB�TO�PROCESS‰BRA.SƒSETP10LD *œREPEAT�LOOP SETP30LD:‰BSR.S…SETP40LD.*œINITIATE�IN�PART�THE�IOCB�AND�THE�AS, SOCIATED(*œINFORMATION�PACKET�FOR�THE�I/O�REQUEST*œA0=ADDRESS�INITIATE�I/O�PB)*œA1=ADDRESS�OF�CONFIGURATION�INFO�PACKET(*œA3=ADDRESS�OF�IOCB�BUILDING�IN�THE�DCB‰MOVE.L‚D1,XIOCID(A0)!*œINITIALIZE�INITIATE�I/O�PB�WITH*¦*�CHANNEL�MNEMONIC‰BSETWƒ#DFLGIN,DCBFLG(A6,D5.L)&*œSET�FLAG�-�INITIALIZATION�IN�PROCESS‰MOVE.W‚#$7FFF,DCBTMO(A6,D5.L)*œSET�DEVICE�BUSY *Ë***É*****Ç***M****---------------------------------------------------------------------*******Ç*****É***Ë**Ë***É*****Ç***E****…PER�DISCUSSION�WITH�JIM�SMITH�THE�DECISION�WAS�MADE�TO�MAKE…****D***†THE�REQUEST�A�'CONFIGURATION'�REQUEST�REGARDLESS�OF�THE�TYPE…***@**‡OF�DEVICE.‚THE�IPC�WILL�TREAT�THE�CONFIGURATION�REQUEST�AS‡**>*ˆA�DEVICE�STATUS�REQUEST�FOR�RANDOM�ACCESS�DEVICES�BUT�JUST‰*>*ˆIN�CASE�I'VE�LEFT�THE�EDIT�IN�SO�THAT�ALL�THAT�NEEDS�TO�BE‰*+**‡DONE�IS�NOP�THE�FOLLOWING�INSTRUCTION�*****Ç*** ****Å*******Ç*****É***Ë*‰BRA.S…SETP32LD*Ë***É*****Ç***M****---------------------------------------------------------------------*******Ç*****É***Ë*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/83*ˆBTSTW…#DATRAN,DCBATT(A6,D5.L)‰BTSTM…DATRAN,DCBATT,A6,D5.L *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰BEQ.SƒSETP32LD+*œJMP�IF�DEVICE�IS�OTHER�THAN�RANDOM�DEVICE*Ë***É*****Ç***:****…WE�HAVE�A�RANDOM�DEVICE‡STATUS�WILL�BE�REQUESTEDŠ*******†A3=ADDRESS�OF�USER�IOCBª*****É***Ë*‰MOVE.W„#IOSTAT,IOSFCT(A3)*œALTER�THE�USER�IOCB�TO"*¦SET�THE�REQUEST�TO�OBTAIN�STATUS‰CLR.L…IOSDST(A1)-*œCLEAR�THE�ATTRIBUTES/PARAMETERS�MASK�FIELDS‰BRA.S…SETP33LD*œISSUE�THE�CHANNEL�DIRECTIVE*Ë***É*****Ç***E****…WE�HAVE�A�NON-RANDOM�DEVICE„CONFIGURATION�WILL�BE�REQUESTED‚*******Ç*****É***Ë*"SETP32LD�MOVE.W‚#IOCNFG,IOSFCT(A3)*œALTER�THE�USER�IOCB�TO%*¦SET�THE�REQUEST�TO�CONFIGURE�DEVICE SETP33LD:‰CLR.L…IOSOPT(A3)*œIN�THE�REQUESTOR'S�IOCB%*œCLEAR�THE�OPTIONS,LUN,STATUS�FIELDS SETP34LD:‰MOVE.L‚#XCAIO,D0*œD0=DIRECTIVE�TO�INITIATE�I/O‰TRAPƒ#1#*œINITIATE�CONFIGURE/STATUS�REQUESTO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*ˆBEQ.SƒSETP35LD ‰BEQ‡ASRBEGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*œJMP�IF�REQUEST�ACCEPTED‰CMP.Bƒ#XSTBSY,D0‰BEQ.SƒSETP34LD*œJMP�IF�CHANNEL�IS�BUSY ‰BRA…SETP15LD**œSOME�CHANNEL�ERROR�OTHER�THAN�BUSY�EXIST*œWE'LL�FORGET�REQUEST�FOR�NOW/*œTHE�I/O�HANDLER�WILL�PROBABLY�ISSUE�A�CHANNEL*œRESET�BEFORE�LONGO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*SETP35LD ERQ.WTEVNT*ˆBRA.SƒSETP35LD*œWAIT�FOR�AN�EVENT*******@*******‚WITH�THE�NEW�TASK-ID�CONCEPT�OF�TCB�ADDRESS/PROCESSOR�ID*******‚THIS�LOGIC�WAS�REMOVED*******O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE*Ë***‡ROUTINE�TO¸*****�BUILD�IN�PARTª***0****�THE�IOCB�FOR�THE�CONFIGURATION�REQUEST�****9***‘THE�ASSOCIATED�INFORMATION�PACKET�FOR�THE�REQUEST…*****É** *ˆINPUT¾* *’D5=ADDRESS�OF�DCB�PROCESSING�* **‘A6=ZERO±*****Ç*******…OUTPUTº****2***�A0=ADDRESS�OF�INITIATE�I/O�PARAMETER�BLOCK�*****‘A3=ADDRESS�OF�IOCB�TO�USEŸ**+*’A1=ADDRESS�OF�CONFIGURATION�INFO�PACKET’*** SETP40LD:‰LEA…INTPRMLD(A2),A0.*œA0=ADDRESS�INITIATE�I/O�PARAMETER�BLOCK�(PB)‰MOVE.L‚D5,XIOUID(A0)‰*‰LEA…DCBIOS(A6,D5.L),A3‰MOVE.L‚A3,XIOCPK(A0)‰*‰MOVE.W‚#IOSCSL,XIOPLN(A0)„*‰CLR.LƒXIOTSK(A0)Œ*‰CLR.LƒXIOSES(A0)Œ*-*œINITIALIZE�INITIATE�I/O�PB�RESPECIVELY�WITH*¦*�ADDRESS�OF�DCB*¦*�ADDRESS�OF�THE�USER�IOCB*¦*�LENGTH‚OF�THE�USER�IOCB *¦*�TASK�ID*¦*�TASK�SESSION�NUMBER‰LEA…DCBDKC(A6,D5.L),A1‰MOVE.L‚A1,IOSDBP(A3))*œA1=ADDRESS�OF�CONFIGURATION�INFORMATION-*ŸSET�ADDRESS�OF�CONFIGURATION�INFORMATION�IN**ŸTHE�USER�IOCB�(WHICH�HAPPENS�TO�BE�MINE)‰RTS‰PAGEL************************************************- *****************************+*ˆENTRY�POINT�FOR�INITIALIZATION�COMPLETION***’THIS�IS�THE�INTERRUPT�EVENT�LEVEL�OF�THE*’INITIALIZATION�ROUTINE.**ˆA4�=�ADDRESS�EVENT�READ*ˆD5�=�ADDRESS�DCB*ˆA5�=�ADDRESS�IOCB�IN�DCB**J***************************************************************************SETP50LD�BSR…DCBWAIT*œLOCKUP�THE�DCB�LISTO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�9/13/83‰CMP.W…#ISTAIF,XRPSTV(A4)‰BEQ.S…SETP54LD‰CMP.W…#ISTACNF,XRPSTV(A4)‰BEQ.S…SETP54LD*œJMP�IF*¡INVALID�FUNCION�CODE *¡CONFIGURATION�PARAMETER�ERRROR*œELSE-*¡TREAT�AS�A�GOOD�CONFIGURATION�(TAPE�DRIVER) *ºBKM�9/13/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"SETP52LD�MOVE.W‚DCBFLG(A6,D5.L),D1*œD1=CONTENTS�OF�DCB�FLAG�WORD!*ŸCURRENT�STATUS�PRIOR�TO�REQUEST‰BCLR„#DFLGIN,D1+*œCLEAR�FLAG�-->�INITIALIZATION�IN�PROGRESS‰CLR.WƒDCBTMO(A6,D5.L)*œSET�DEVICE�NOT�BUSYO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/83*ˆBTSTWƒ#DATRAN,DCBATT(A6,D5.L)‰BTSTMƒDATRAN,DCBATT,A6,D5.L *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰BNE.SƒGETS55LD&*œJMP�IF�REQUEST�WAS�FOR�RANDOM�DEVICE‰BRA.SƒSETP55LD**œREQUEST�WAS�FOR�OTHER�THAN�RANDOM�DEVICE*Ë***É*****Ç***3****…CONFIGURE/STATUS�REQUEST�WAS�UNSUCCESSFUL—*******Ç*****É***Ë* SETP54LD:‰CLR.WƒDCBTMO(A6,D5.L)*œSET�DEVICE�NOT�BUSY‰BCLRW…#DFLGIN,DCBFLG(A6,D5.L)+*œCLEAR�FLAG�-�TURN�INITIALIZATION�MODE�OFF‰BCLRW…#DFLGON,DCBFLG(A6,D5.L)*œFORCE�DEVICE�OFFLINE‰BRA.S…SETP65LD**Ë***É*****Ç***8****…WE�SUCCESSFULLY�CONFIGURED�A�NON-RANDOM�DEVICE“*******Ç*****É***Ë* SETP55LD:‰BSETƒ#DFLGON,D1‰BCLR„#DFLGSC,D1*œRESPECTIVELY*ŸSET�DEVICE�ONLINE *ŸSET�DEVICE�STATUS�CHANGED�FLAG‰MOVE.W‚D1,DCBFLG(A6,D5.L)*œUPDATE�THE�DCB�FLAG�WORD‰CLR.BƒDCBCCF(A6,D5.L)!*œCLEAR�THE�DCB�COORDINATION�FLAG.*œDEVICE�IS�CURRENTLY�IN�DEFAULT�CONFIGURATION SETP65LD: ‰BSR…DCBSIG*œUNLOCK�THE�DCB�LIST*Ë***É*****Ç***C****…COMMON�EXIT�LOGIC�FOR�SUCCESSFUL�CONFIGURE/STATUS�REQUEST‡*******Ç*****É***Ë*"SETP75LD�MOVE.L‚DCBPTR(A6,D5.L),A1#*œA1=ADDRESS�OF�NEXT�DCB�TO�PROCESS*ˆADD.Lƒ#66,A70*œADJUST�STACK�AS�IF�A�RETURN�EVENT�HAD�OCCURRED"*ˆERQ.SETASQ‚#AQSTQE+AQSTME+AQSTRE*ˆERQ.SETASQ‚#AQSTQE+AQSTME*œREQUEST�THAT *¦ASQ�ENABLED*¦AUTO�BUFFER�ENABLED*ˆBEQ.S…SETP80LD*œJMP�IF�ASQ�ENABLED *ˆBSR…KILIT*œKILL�THE�SUCKER"SETP80LD�MOVE.L‚DCBCCB(A6,D5.L),D1+*œD1=CHANNEL�ID�WE'RE�EXAMINING�DEVICES�FOR ‰BRA…SETP10LD*œCONTINUE�LOOP*Ë***É*****Ç***=****…WE�SUCCESSFULLY�OBTAINED�STATUS�FOR�A�RANDOM�DEVICE�*******Ç*****É***Ë*GETS55LD�EQU‡*!‰MOVE.B‚DCBDKC+IOSDST(A6,D5.L),D2)*œD2=DEVICE�STATUS�AS�A�RESULT�OF�REQUEST*Ÿ(AFTER�THE�REQUEST‰BCLRƒ#DFLGON,D1#*œSET�FLAG�-->�FORCE�DEVICE�OFFLINE‰BTSTƒ#XDSNRB,D2‰BNE.SƒGETS70LD!*œJMP�IF�DEVICE�CURRENTLY�OFFLINEGETS60LD�BSETƒ#DFLGON,D1*œSET�FLAG�-�DEVICE�ONLINE‰BCLRƒ#DFLGWP,D1)*œSET�FLAG�-->�DEVICE�NOT�WRITE�PROTECTED‰BTSTƒ#XDSWPB,D2‰BEQ.SƒGETS70LD#*œJMP�IF�DEVICE�NOT�WRITE�PROTECTED‰BSETƒ#DFLGWP,D1%*œSET�FLAG�-->�DEVICE�WRITE�PROTECTED GETS70LD:‰BSETƒ#DFLGSC,D1$*œSET�FLAG�-->�DEVICE�STATUS�CHANGED‰MOVE.W‚D1,DCBFLG(A6,D5.L)*œD1=UPDATED�DEVICE�FLAG�WORD ‰BSR…DCBSIG*œUNLOCK�THE�DCB�LIST ‰BSR…TELLFMSL*œGO�TELL�ON�THE�MOUNTAIN�....*œI�MEAN�GO�TELL�FMS ‰BRA…SETP75LD*œEXIT�VIA�COMMON�LOGIC‰PAGE** *ˆRTNE�TO2*’WALK�ALL�DEVICES�(DCB'S)�ASSOCIATED�WITH�A�GIVEN *’CHANNEL�AND�MARK�THEM�OFF�LINE***ˆINPUT *’A6=ZERO*’D1=CHANNEL�ID�TO�PROCESS***ˆOUTPUT*’A1=D5=DESTROYED** MARK_OFF:‰MOVE.L„IOCOMS(A2),A1"*œA1=ADDRESS�OF�COMMON�I/O�SEGMENT‰MOVE.L„SVTDCB(A1),A1*œA1=START�ADDRESS�OF�DCB�LIST MKO_0100: ‰MOVE.L„A1,D5‰BNE.S…MKO_0200#*œJMP�IF�MORE�DCB�ENTRYS�TO�EXAMINE‰RTS*œRETURN�TO�CALLER MKO_- 0200:‰CMP.L…DCBCCB(A6,D5.L),D1‰BNE.S…MKO_0300/*œJMP�IF�THIS�DEVICE�IS�NOT�ON�THE�NON-EXISTENT *œCHANNEL‰BCLRW…#DFLGON,DCBFLG(A6,D5.L)*œFORCE�DEVICE�OFFLINE MKO_0300:‰MOVE.L„DCBPTR(A1),A1&*œA1=ADDRESS�NEXT�DCB�ENTRY�TO�EXAMINE‰BRA.S…MKO_0100 *œSEE�IF�MORE�ENTRIES�TO�EXAMINE‰PAGE *ˆROUTINE�TO*:*ˆ1.�FOR�A�SPECIFIED�DCB�ISSUE�A�TIMER�REQUEST�(IF�NEEDED)**’OR*>*ˆ2.�FOR�A�SPEICIFED�DCB�TERMINATE�A�TIMER�REQUEST�(IF�NEEDED)*3*ˆENTRY�POINT�FOR�ISSUE‚A�TIMER�REQUEST‚-->‚R_TIMER4*ˆENTRY�POINT�FOR�CANCEL�A�TIMER�REQUEST‚-->‚C_TIMER**ˆINPUT *’A6�=�ZERO,*’D5�=�ADDRESS�OF�DCB�FOR�WHICH�TIMER�IS�FOR**ˆOUTPUT*’REGISTER�ALTERNATION**’D0=D1=DESTROYED**ˆTIMER�EQUATES**ˆR_TIMERE‚OPTIONS=*’TIME�OF�FIRST�ACTIVATION�IS�SPECIFIED�IN�INITIAL�TIME�FIELD)*’A�UNIQUE�ID�IS�SPECIFIED�FOR�THIS�TIMER:*’ACTIVATION�FROM�TIMER�REQUEST�IS�AN�EVENT�TO�DEFAULT�ASR**ˆC_TIMERE‚OPTIONS)*’CANCEL�A�CURRENTLY�ACTIVE�TIMER�REQUEST2*’A�UNIQUE�ID�IS�SPECIFIED�FOR�THIS�CANCEL�REQUEST*R_TIMERE�EQU‡$6C00C_TIMERE�EQU‡$2400***R_TIMER:‰BCLRW…#DFLGIT,DCBFLG(A6,D5.L)**œCLEAR�FLAG�--�TO�IGNORE�THIS�TIMER�EVENT‰MOVE.L„TIMVALLD(A2),D1*œD1=TIMER�INTERVAL‰SUB.L…#24*60*60*1000,D1‰BMI.S…CAL002LD+*œJMP�IF�TIME�INTERVAL�IS�LESS�(<)�24�HOURS#‰MOVE.L„#24*60*60*1000,TIMVALLD(A2)4*œFORCE�TIME�INTERVAL�IN�MILLI-SECONDS�TO�BE�24�HOUR CAL002LD:‰MOVE.W„#R_TIMERE,T_OPTSLD(A2)!*œSET�TIMER�OPTIONS�FOR�A�REQUEST‰BSETW…#DFLGCT,DCBFLG(A6,D5.L)'*œSET�FLAG�-�A�TIMER�EXIST�FOR�THIS�DCB‰MOVE.L„A0,-(A7)*œSAVE�REGISTER*ˆERQ.GTDTIM�TIMPRMLD*œREQUEST�CURRENT�TIME�AND�DATE*ˆBEQ.S…CAL004LD*œJMP�IF�REQUEST�OK *ˆBSR‡KILIT*œTERMINATE�EVERYTHING CAL004LD:*ˆMOVE.L„CURTIMLD,D1*ˆADD.L…TIMVALLD,D1*ˆMOVE.L„D1,INLTIMLD#*ŸADD�CURRENT�TIME�TO�TIME�INTERVAL(*œD1=TIME�OF�INITIAL�PERIODIC�ACTIVATION!‰MOVE.L„TIMVALLD(A2),IOINTRLD(A2)&*œSET�THE�TIME�INTERVAL�FOR�ACTIVATION CAL008LD:‰MOVE.L„D5,UNIQIDLD(A2),*œESTABLISH�THE�UNIQUE�ID�FIELD�BY�USING�THE*œDCB�ADDRESS�IN�REG�D5‰LEA‡TEVPRMLD(A2),A0*œA0�=�PARAMETER�BLOCK�ADDRESS‰MOVE.L„#RQSTPA,D0*œD0�=�DIRECTIVE�NUMBER‰TRAP†#1*œREQUEST�PERIODIC�ACTIVATION'*œTHIS�INITIATES�THE�TIMER�FOR�THIS�DCB*œOR *œCANCELS�THE�TIMER�FOR�THIS�DCB‰BEQ.S…CAL020LD*œJMP�IF�REQUEST�OK‰CMP.W…#RTCDNFND,D0‰BEQ.S…CAL010LD*œJMP�IF*�NO�ENTRY�FOUND�ON�CANCEL�RQST ‰BSR‡KILIT*œGOTCHA CAL010LD:‰BSETW…#DFLGIT,DCBFLG(A6,D5.L)'*œSET�FLAG�-�WE�TRIED�TO�CANCEL�A�TIMER*§BUT�COULDN'T�FIND�ONE!*§SO�IF�YOU�GET�A�TIMER�EVENT�FOR *§THIS�DCB�YOU�CAN�THROW�IT�AWAY CAL020LD:‰MOVE.L„(A7)+,A0*œRESTORE�REGISTER‰RTS‰PAGE*Ë***É*****Ç***:****…ENTRY�POINT�FOR�A�SPECIFIC�DCB�TIMER�CANCELATION�*******Ç*****É***Ë*C_TIMER:‰MOVE.L„A0,-(A7)*œSAVE�REGISTER‰MOVE.W„#C_TIMERE,T_OPTSLD(A2)-*œSET�TIMER�OPTIONS�FOR�CANCEL�SPECIFIC�TIMER‰BRA.S…CAL008LD‰PAGEK*****************************************************************************‚BRAKER*$*ˆNOTIFY�BREAK�CLAIMER,�IF�HE�EXISTS**L*****************************************************************************BRAKERLD�LEA…QEVATNLD(A2),A1*œA1=ADDRESS�QUE�ATTENTION�PB ‰CLR.LƒD0$*œD0=INITIALIZE�PACKET�DEVICE�STATUS‰TST.LƒDCBWNT(A6,D5.L)‰BEQ.SƒBRAK2LD*œJMP�IF�DEVICE�NOT�ASSIGNED‰BSETƒ#EVATNAS,D0*œSET�STATUS�-�DEVICE�ASSIGNED#BRAK2LD‚MOVE.W‚D0,ATTNLD+EVASTA(A2)*œSTORE�DEVICE�STATUS�IN�PACKET)‰MOVE.L‚DCBAID(A6,D5.L),ATTNLD+EVADEV(A2)*œSET�DEVICE�IN�PACKET‰CLR.WƒQEVOPT(A1)3*œSET�OPTIONS�IN�PB�THAT�NO�INTERRUPT�ADDRESS�EXIST‰TST.LƒDCBBRK(A6,D5.L)‰BNE.SƒBRAK20LD"*œJMP�IF�LOCAL�BREAK�CLAIMER�EXIST**É*****Ç***)****…EDIT�FOR�A�SYSTEM�BREAK�CLAIMER¡*******Ç*****É***Ë*BRAK5LD‚MOVE.L‚IOCOMS(A2),A0"*œA0=ADDRESS�OF�COMMON�I/O�SEGMENT‰TST.LƒSVTBRK(A0)‰BEQ.SƒBRAK30LD *œJMP�IF�NO�SYSTEM�BREAK�CLAIMER‰MOVE.L‚SVTBRK(A0),QEVTSK(A1)‰MOVE.L‚SVTBRK+4(A0),QEVSES(A1)‰MOVE.L‚SVTBSA(A0),QEVIAD(A1)#*œSET�UP�RESPECTIVELY�THE�FO. LLOWING*�TASK�ID�CLAIMING�BREAKS%*�SESSION�NBR�OF�TASK�CLAIMING�BREAKS**�THE�BREAK�INTERRUPT�ADDRESS�IF�ONE�EXIST‰BMI.SƒBRAK10LD'*œJMP�IF�NO�INTERRUPT�ADDRESS�SPECIFIED‰MOVE.W‚#QVOPAS,QEVOPT(A1)-*œALTER�PB�OPTIONS�TO�STATE�THAT�AN�INTERRUPT$*œBREAKER�ADDRESS�HAS�BEEN�SPECIFIED BRAK10LD:‰LEA‡QEVATNLD(A2),A0‰MOVE.L„#QEVNT,D0‰TRAP†#1*œNOTIFY�SYSTEM�BREAK�CLAIMER‰RTS****’WE�HAVE�A�LOCAL�BREAK�CLAIMER** BRAK20LD: ‰MOVE.L„A2,A0"*œA0�=�ADDRESS�OF�IOS�DATA�SEGMENT‰MOVE.L‚DCBBRK(A6,D5.L),A2+*œA2=ADDRESS�OF�LUT�FOR�LOCAL�BREAK�CLAIMER‰MOVE.L‚LUTTID(A2),QEVTSK(A1)‰MOVE.L‚LUTSES(A2),QEVSES(A1)"‰MOVE.L‚DCBSRV(A6,D5.L),QEVIAD(A1)#*œSET�UP�RESPECTIVELY�THE�FOLLOWING*�TASK�ID�CLAIMING�BREAKS%*�SESSION�NBR�OF�TASK�CLAIMING�BREAKS**�THE�BREAK�INTERRUPT�ADDRESS�IF�ONE�EXIST‰BMI.SƒBRAK25LD'*œJMP�IF�NO�LOCAL�BREAK�SERVICE�ADDRESS‰MOVE.W‚#QVOPAS,QEVOPT(A1)4*œSET�OPTIONS�THAT�LOCAL�BREAK�SERVICE�ADDRESS�EXIST BRAK25LD: ‰MOVE.L„A0,A2"*œA2�=�ADDRESS�OF�IOS�DATA�SEGMENT‰LEA‡QEVATNLD(A2),A0‰MOVE.L„#QEVNT,D0‰TRAP†#1"*œQUE�EVENT�TO�LOCAL�BREAK�CLAIMER BRAK30LD RTS‰PAGE* *ˆROUTINE�TO!*’INITIALIZE�THE�IOS�DATA�SEGMENT**ˆINPUT*’A2�=�IOS�DATA�SEGMENT�ADDRESS*’A7�=�STACK�ADDRESS*ˆOUTPUT**ˆREGISTER�ALTERATION*’A0�=�DESTROYED*’A1�=�DESTROYED*’D0�=�DESTROYED**ˆCONDITION�CODE�RETURN*ˆN/A* TEMPLATE:‰MOVE.W„#IOHALT,HLTCBLD(A2)‰LEA‡ATTNLD(A2),A0‰MOVE.L„A0,QEVATNLD+10(A2)**œSET�ADDRESS�OF�INFORMATION�PACKET�IN�THE*œATTENTION�PARAMETER�BLOCK‰MOVE.B„#EVALEN,ATTNLD(A2)‰MOVE.B„#EVCATN,ATTNLD+1(A2)*œSET�RESPECTIVELY *�EVENT�CODE*�EVENT�LENGTH%*¦IN�THE�ATTENTION�INFORMATION�PACKET‰MOVE.L„#-1,D0*œD0�=�NEGATIVE�ONE‰MOVE.L„D0,IOINTRLD-4(A2)‰MOVE.W„D0,LASL(A2)‰MOVE.W„D0,UASL(A2)$*œSET�RESPECTIVELY�A�NEGATIVE�ONE�IN1*�TIME�FOR�INITIAL�ACTIVATION�IN�REQUEST�TIMER�PB*�LOWER�ADDRESS�STACK�DELIMITER*�UPPER�ADDRESS�STACK�DELIMITER‰MOVE.B„#XDINIT,INTPRMLD(A2)**œSET�INITIATE�I/O�CODE�IN�PARAMETER�BLOCK,‰MOVE.B„#SRTREOT+SRTRPRM+IOSTIN,SRVPRM+4(A2)2*œSET�TRAP�INSTRUCTION�IN�ESTABLISH�TRAP�SERVER�PB‰MOVE.B„#IOSNLN,SRVPRM+5(A2)*œSET�PARAMETER�BLOCK�SIZE�IN'*�ESTABLISH�TRAP�SERVER�PARAMETER�BLOCK#‰MOVE.B„#EVTLEN+IOSNLN-8,EVNLEN(A2)*œSET�EVENT�LENGTH‰LEA‡EVNLEN(A2),A0‰MOVE.L„A0,QEVPRM+10(A2)-*œSET�ADDRESS�OF�EVENT�IN�QUE�EVENT�TO�FMS�PB‰LEA‡EVTDRV(A2),A0‰MOVE.L„A0,QEVDRV+10(A2)0*œSET�ADDRESS�OF�EVENT�IN�QUE�EVENT�TO�DRIVER�PB‰LEA‡REQEVT(A2),A0‰MOVE.L„A0,CMPADDR-4(A2)2*œSET�ADDRESS�OF�EVENT�IN�QUE�I/O�COMPLETION�EVENT‰MOVE.B„#EVCQUE,D0*œD0.B�=�EVENT�CODE‰MOVE.B„D0,EVNLEN+1(A2)‰MOVE.B„D0,EVTDRV+1(A2)*œSET�EVENT�CODE‰MOVE.B„#IOLEVT,EVNLEN+2(A2)*œSET�SUB�CODE‰MOVE.B„#EVTLNG-8,EVTDRV(A2)*œSET�EVENT�LENGTH‰MOVE.B„#DRVEVT,SUBEVC(A2)*œSET�SUB�CODE‰MOVE.B„#EVIOND,REQEVT(A2)‰MOVE.B„#EVCIOC,REQEVT+1(A2)*œSET�RESPECTIVELY*�EVENT�LENGTH *�EVENT�CODE‰MOVE.B„#XDATCH,ATTPRMLD(A2)2*œSET�CODE�FOR�ATTATCH�I/O�CHANNEL�PARAMETER�BLOCK%‰MOVE.B„#XOPASQ+XOPPRO,ATTPRMLD+3(A2)3*œSET�OPTIONS�FOR�ATTATCH�I/O�CHANNEL�PARAMETER�BLK‰MOVE.B„#XRP1LEN,ATTPRMLD+9(A2)0*œSET�LENGTH�OF�STATUS�IN�ATTATCH�I/O�CHANNEL�PB‰LEA‡GPBUFR(A2),A0‰MOVE.L„#FHSID,A1‰MOVE.L„#IOSESS,D0.*œESTABLISH�PARAMETERS�FOR�GET�TASK�ID�ROUTINE"*œA0�=�GET�TASK�ID�PARAMETER�BLOCK*œA1�=�TASK�NAME*œD0�=�TASK�SESSION�NUMBER ‰BSR‡GETTSKID*œOBTAIN�FHS�TASK�ID ‰BSRNE…KILIT-*œBRANCH�IF�THE�FHS�TASK�IS�NOT�IN�THE�SYSTEM‰MOVE.L„A0,WUFHS(A2)‰MOVE.L„A1,WUFHS+4(A2)$*œSET�FHS�TASK�ID�IN�PARAMETER�BLOCK‰LEA‡GPBUFR(A2),A0‰MOVE.L„#FMSID,A1‰MOVE.L„#IOSESS,D0.*œESTABLISH�PARAMETERS�FOR�GET�TASK�ID�ROUTINE"*œA0�=�GET�TASK�ID�PARAMETER�BLOCK*œA1�=�TASK�NAME*œD0�=�TASK�SESSION�NUMBER ‰BSR‡GETTSKID*œOBTAIN�FMS�TASK�ID‰BMI.S…TMPL0200&*œBRANCH�IF�THIS�IS�A�ROM�BASED�SYSTEM ‰BSRNE…KILIT"*œBRANCH�IF�FMS�TASK�NOT�IN�SYSTEM‰MOVE.L„A0,QEVPRM(A2)‰MOVE.L„A1,QEVPRM+4(A2)$*œSET�FMS�TASK�ID�IN�PARAMETER�BLOCK TMPL0100:‰RTS TMPL0200:‰MOVE.L„#-1,. QEVPRM(A2)1*œSET�FLAG�TO�INDICATE�THIS�IS�A�ROM�BASED�SYSTEM*œFMS�DOES�NOT�EXIST�IN�SYSTEM.‰BRA.S…TMPL0100*œRETURN‰PAGE* *ˆROUTINE�TO*’GET�ASQ�FOR�IOS*@*ˆASSUMPTION�-‚POSITIONALLY�THIS�ROUTINE�ORIGINALLY�FOLLOWED�THE4*–CLEARING�OF�THE�IOS�DATA�BUFFER�CONSEQUENTLY�IT�IS1*–ASSUMED�THAT�THE�GENERAL�PURPOSE�DATA�BUFFER�IS2*–ZERO'D�OUT.�IF�THE�CALL�TO�THIS�ROUTINE�IS�MOVED5*–IT�MAY�BE�NECESSARY�TO�ZERO�OUT�THE�GENERAL�PURPOSE5*–DATA�BUFFER�PRIOR�TO�EXECUTING�THE�MAIN�LOGIC.�THIS7*–WAS�NOT�DONE�ON�A�STANDARD�BASIS�IN�ORDER�TO�CUT�DOWN*–ON�LOGIC�CODE�SPACE**ˆINPUT"*’A2�=�ADDRESS�OF�IOS�DATA�SEGMENT**ˆOUTPUT *’IOS�HAS�ASQ**ˆREGISTER�ALTERATION*’A0�=�DESTORYED*’A6�=�DESTORYED*’D0�=�DESTORYED* *ˆCONDITONS*–ZERO�==>ˆASQ�ALLOCATED-*’NON-ZERO�==‰TASK�WILL�SELF�ABORT�VIA�KILLER*GETASQ:‰LEA‡GPBUFR(A2),A0!*œA0�=�ADDRESS�OF�PARAMETER�BLOCK"*¡(GENERAL�PURPOSE�DYNAMIC�BUFFER)=‰MOVE.B„#AQSTQE+AQSTME+AQSTRD+AQSTSD+AQSTBV+AQSTRI,ASQSTA(A0)#*œSET�ASQ�STATUS�IN�PARAMETER�BLOCK*œBIT‡MEANING�AS�SELECTED*�0ˆENABLE�ASQ*�1ˆENABLE�DEFAULT�INPUT�BUFFER*�2ˆASR�DISABLED*�3ˆDISABLE�REGISTER�STACKING**�4ˆDEFAULT�RECEIVING�INPUT�BUFFER�DEFINED*�5ˆNO�ASR�DEFINED‰MOVE.L„#EVULEN+IOSNLN,D0*œD0�=�MAXIMUM�MESSAGE�LENGTH#*¡ALSO�USED�TO�DETERMINE�ASQ�LENGTH‰MOVE.B„D0,ASQMML(A0)‰MOVE.L„D0,ASQQLN(A0)*œSET�RESPECTIVELY*¡MAXIMUM�MESSAGE�LENGTH+*¡ASQ�LENGTH�(PAGE�ALLOCATION�TO�256�BYTES)‰LEA‡ARQUE(A2),A6‰MOVE.L„A6,ASQASR+4(A0)-*œA6�=�ADDRESS�DEFAULT�RECEIVING�INPUT�BUFFER‰MOVE.L„#GTASQ,D0*œD0�=�GET�ASQ�DIRECTIVE‰TRAP†#1*œALLOCATE�ASQ ‰BSRNE…KILIT*œIF�ERROR�TERMINATE�TASK‰RTS‰PAGE**ˆACCESS�PERMISSION�MAP�TABLE** *ˆTABLE�ENTRY**’TYPE�PERMISSION…2�BYTES*’READ‚VALUE‰2�BYTES*’WRITE�VALUE‰2�BYTES**!ACPTBLƒDC.W…FOPPR,1,0ŠPUBLIC�READAPTEL„EQU‡*-ACPTBL%*œSIZE�OF�A�SINGLE�ENTRY�IN�THE�TABLE‰DC.W…FOPER,-1,0‰EXCLUSIVE�READ‰DC.W…FOPPW,0,1ŠPUBLIC�WRITE ‰DC.W…FOPEW,0,-1‰EXCLUSIVE�WRITE+‰DC.W…FOPPRPW,1,1ˆPUBLIC�READ,�PUBLIC�WRITE/‰DC.W…FOPPREW,1,-1‡PUBLIC�READ,�EXCLUSIVE�WRITE/‰DC.W…FOPERPW,-1,1‡EXCLUSIVE�READ,�PUBLIC�WRITE3‰DC.W…FOPEREW,-1,-1†EXCLUSIVE�READ,�EXCLUSIVE�WRITE ACPTBLN‚EQU‡**œTABLE�TERMINATOR‰PAGE* *ˆATTRIBUTE/FUNCTION�CHECK�TABLE* ATFCHKƒDC.W…IOREAD�READ�FUNCTION‰DC.B…DATRED,-1‰DC.W…IOWRIT�WRITE�FUNCTION‰DC.B…DATWRT,-1‰DC.W…IOOWIN�OUTPUT�WITH�INPUT‰DC.B…DATIND,-1‰DC.W…IOUPDR�UPDATE�RECORD‰DC.B…DATWRT,-1‰DC.W…IODELR�DELETE�RECORD‰DC.B…DATWRT,-1‰DC.W…IOFRMT�FORMAT�DISK‰DC.B…DATRAN,-1‰DC.W…IOTBRK�TRANSMIT�BREAK‰DC.B…DATWRT,DATIND,-1,-1.‰DC.W…IOSTAT�STATUS/CONFIGURATION�INFO�REQUEST ‰DC.B…-1,-1'‰DC.W…IOCNFG�CONFIGURE�A�DEVICE�REQUEST ‰DC.B…-1,-1‰DC.W…IOHALT�HALT�I/O‰DC.B…DATHIO,-1‰DC.W…IOPOST�POITION‰DC.B…DATPOS,-1‰DC.W…IOREWD�REWIND ‰DC.B„-1,-1‰DC.W…IOTEST�TEST�I/O�COMPLETE ‰DC.B„-1,-1‰DC.W…IOWAIT�WAIT�ONLY ‰DC.B„-1,-1‰DC.W…IOBRKS�BREAK�SERVICE ‰DC.B…-1,-1"‰DC.W…IONBRKSŒNEGATE�BREAK�SERVICE ‰DC.B…-1,-1(‰DC.W…IOCEVNTS‹CLAIM�DRIVER�EVENTS�EVENT‰DC.B…-1,-1±EVENT/‰DC.W…IONEVNTS‹NEGATE�CLAIM�DRIVER�EVENTS‰EVENT‰DC.B…-1,-1±EVENTATFENDƒEQU…*“END�OF�TABLE‰DC.L„0“KEEP�IT�POSITIVE‰PAGE**ˆATTRIBUTE/OPTION�CHECK�TABLE** *ˆTABLE�ENTRY*’4�BYTESƒOPTION�BIT�PATTERN)*’2�BYTE„0…-->�EDIT�FOR�THE�OFF�CONDITION"*œ1…-->�EDIT�FOR�THE�SET�CONDITION$*’1�BYTE„-1„-->�NO�FUNCTION�TO�CHECK*œVALUE�-->�FUNCTION�TO�CHECK *’1�BYTE„-1„-->�ENTRY�TERMINATOR**ATOCHKƒDC.L…IOPBIN�BINARY‰DC.W†1‰DC.B…DATBIN,-1‰DC.L…IOPIMG�IMAGE‰DC.W†1‰DC.B…DATIMG,-1‰DC.L…IOPBRK�BREAK�NOTIFICATION‰DC.W†1 ‰DC.B„-1,-1‰DC.L…IOPNEC�ECHO�MODE‰DC.W†1 ‰DC.B„-1,-1‰DC.L…IOPCAD�COMPLETION�ADDRESS‰DC.W†1 ‰DC.B„-1,-1‰DC.L…IOPPOS�RANDOM‰DC.W†1 ‰DC.B„-1,-1‰DC.L…IOPTSK�TASK�SUPPLIED‰DC.W†1‰DC.B…DATRAN,-1‰DC.L…IOPINM�INPUT�IMAGE‰DC.W†1‰DC.B…DATIMG,-1O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>/ >>>>>>>"*¦REMOVED�--�NOW�IS�A�NO�RETRY�BIT"*ˆDC.L…IOPSMP�SECONDARY�MEMORY�MAP*ˆDC.W†1*ˆDC.B…DATRAN,-1O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ATOENDƒEQU…*“END�OF�TABLE‰DC.L„0“KEEP�IT�POSITIVE‰PAGE**�SUPPORT�TABLES***ˆIOS�FUNCTION�CODE�LEVEL�TABLE*=CMDTABƒDC.L„LVL0CDŽDEVICE/FILE�FUNCTIONS�-�DATA�TRANSFER�RQST2‰DC.L„LVL1CDŽUTILITY�FUNCTIONS…-�COMMAND�FUNCTIONS2‰DC.L„LVL2CDŽUTILITY�FUNCTIONS…-�COMMAND�FUNCTIONS$*¤LEVEL�2�IS�AN�EXTENSION�OF�LEVEL�1/‰DC.L„0,0,0,0�LEVELS�4,8,10,20�NOT�USEDˆLEVEL40,‰DC.L„LVL40CD�NON-VALIDATED�COMMANDS‹LEVEL40"‰DC.L„LVL80CD�PRIVILEGED�FUNCTIONS**ˆLEVEL�ZERO�EXECUTORS LVL0EXƒDC.L„DXFER�READ‰DC.L„DXFER�WRITE‰DC.L„DXFER�OUTPUT�-�INPUT‰DC.L„DXFER�UPDATE�RECORD‰DC.L„DELRECŽDELETE�RECORD‰DC.L„FORMATŽFORMAT�DISK‰DC.L„TX_BREAKŒTRANSMIT�BREAK‰DC.L„0“RESERVED**ˆLEVEL�ONE�EXECUTORS*LVL1EXƒDC.L„POST“POSITION‰DC.L„POST“REWIND‰DC.L„TESTIOŽTEST�IO�COMPLETE‰DC.L„WAITIOŽWAIT�ONLY‰DC.L„HALTIOŽHALT�IO‰DC.L„BRKSRVŽBREAK�SERVICE.‰DC.L„UDVR_CFGŒUSER�DEVICE�REQUEST�FOR�CURRENT*¨CONFIGURATION�INFORMATION7‰DC.L„UDVC_CFGŒUSER�DEVICE�CHANGE�CONFIGURATION�REQUEST**ˆLEVEL�TWO�EXECUTORS*7LVL2EXƒDC.L„N_BRKSRVŒNEGATE�LOCAL�BREAK�CLAIMER�REQUEST'‰DC.L„CLMDREV�CLAIM�DRIVER�EVENTS‘EVENT/‰DC.L„NCLMDREVŒNEGATE�CLAIM�DRIVER�EVENTSŠEVENT‰DC.L„0“NOT�USED‰DC.L„0“NOT�USED‰DC.L„0“NOT�USED‰DC.L„0“NOT�USED‰DC.L„0“NOT�USED**ˆLEVEL�80�EXECUTORS*$LVL80EX‚DC.L„BREAKSŽUNCLAIMED�BREAKS9‰DC.L„SDV_CDCFŒSYSTM�RQST�-�CHG�DEV�DEFAULT�CONFIGURATION‰DC.L„0“NOT�USED‰DC.L„0“NOT�USED‰DC.L„0“NOT�USED‰DC.L„0“NOT�USED‰DC.L„0“NOT�USED‰DC.L„0“NOT�USED‰PAGE GSEGPBLK:‰DC.L†0 *œTASK�NAME‰DC.L†0*œTASK�SESSION�NUMBER ‰DC.W†$2000*œDIRECTIVE�OPTIONS-*�BIT�13�-�LOGICAL�ADDRESS�=�PHYSICAL�ADDRESS‰DC.W†$0*œSEGMENT�ATTRIBUTES ‰DC.B†'IOSD'*œSEGMENT�NAME‰DC.L†$0 *œPHYSICAL�ADDRESS�IF�APPLICABLE‰DC.L†GSEGSIZE*œSEGMENT�BYTE�SIZE‰PAGEPRGMSIZE�EQU‡*-IOSENT‰PAGE ‰END‡IOSENTéééa1FHS ASREL'DEVICE FHS SA!(…VERSAdos File Handling Services Task V 4.0 - 09/13/82H2pGETTSKID pLUNS pTEL02 pTEL05 pSIGFMS pTELFMS  F3``bFHSD120384 4,HAúàpNAga0$H <nBS€fú%J$ŽOê&a¦a&AêF3$p3NAg gH瀀0|0<NA,RAî,Ðp&NAgaà�ÎBj,IêZ,F3 fà,$ fÐf öa èAìa�J€gAì2, aÒJ€g aF3 ja ª` VJ,g ,g ŒKêrJk B�JgJ˜‚gJf :J�gF3 4 PNÐR�J˜ g $`Þ ,(m HB�a LJmf AúØCúñ4ÿ´g±ÉF3g ò`ôB�-aJ€gk U€g 6hg`a°J€f2Aƒf úB�ÁF3A,rAú¼B‚4gF‚gJ�g>` J˜S�k ~`ì P5B*N�J�ga ¼` h*,I3g ìB‚4**g RrAúr`ºa Xa ’` >B�2A@f$ -&gB†aBþg F3g |` *a š` B�-aFJ€k f :`.B�-a0J€k f $J-f I3,g òa ÌJ€gZ6hÁÁ�hR6x 2-A�haBýŠfa (`F3 š/6h���hS6x B6ha   g Ö` ªa Üa fJ€g a ìaF3 ä` ’2-A f ² 6ÿX$f|26X$g ¬f Ra rJ/ €f BF3a ¤J€f &"6X g ¬ga ªfª,`"a „J€f -…h6hÁF3Á�hR6x a Xa P` ÂB�-a üJ€k Ôg ð6hf ôfI3@aBü~fa ` Ž/`ÿ *6ha ò6ha2-Aa RJCgvX!JDgvF3X a ¤J€f ta ÖJ€f Xa ØJ€gvha ÊJ€gaü^` R�ha ¬aI3 ¤` B�-a PJ€k (g D6hf Hf 6hf aBûÈfa fF3`Ø/`þTJl f òa ‚J€f îAíra ÌJ€f öa ¬J€g ìa *6h-­F3Xa "a `ŒB�-a ÆJ€k žg º6hf ¾f 6hf žI3@aBû>fa Ü`N/`ýÊ*6hJl f Ra ôJ€f `a  =­ Xa ²a ª`F3B�-a VJ€k .g J6hg,g*6h$6Xg JvXo` 2a6aI3a ``Òa(Á�haBúªfa H`º6h��h/`ý*6hgÁF3�ha 0<NAaö`Þ�f�hNuaä*6h6haaZaðNua BF36Xf6XgB¶Xb` vXbJCfJDgS¨fJCgjBƒ`DCÖvX"JDgjB„`F3DDØvX =ƒX"=„X NuJ¶X f."6XfJ6XPg0-@faÂ` ¬gI3@aBù¾Nu6h$����g� vhB¨ZB¨^�hB¶hBvhB6L3hSäíõ6x NuaBùvf B†a`„/`üB�-a ¸J€k�g¬6hfaBùBF3faà`R/`ûÎaÒ`D ,(m„B�aˆrAú x4Bÿ‚g JBf.J�g*F3`J˜S�k"`ê PN�J�gaZ`6hgŠ`öaa>`êJmfôB�I3-a J€gðkì6hfaBø¢fa@`²/`û.*6h6ha†"6XF3JCf�JDf�;A ,E;n„"+n†$�ÎvX$+vXAê!M!l1|F3(AÐ0<NAgaø~aÐ`BJmfPB�-atJ€oL6hf46I3haüJCg>aB÷òfa�`/`ú~JŸa€2- Ag Ag2 Ag,raI3.`ÚB†aB÷¶g` fa&`aøa `¸Bª&Aê1| Gê2!K!mF3Bƒ"R"i$4-* gZ"6X Bf gDRj(`  g8Rj(¶­ d.Rj&&¶F3XvX% AÐ0<NAg ra˜`DC ¨ "vX`¢Mê&!N�Î!l¨F3 1|AÐ0<NAf¼`J­f+l+l `H,J­ f+l `I3 ,°­ gf&güfAêD"m - aBö”fâ+HAíAÐ0<F3NAfÎ%H.B�-aÌ2-AfÈJ€g˜k”6hfˆB�2-A€F3g6ha8JDkzJCkt"*.�€g ,gD&(Aía@J€g"*F3.HAAía€fB�-aFJ€kf:J-f"*.�€g-¶8h-¶F38hR6x B�2-A€fØÇFÉGaûêÇFÉG`ÈJ€kÒfîJ-f,gF3¼,g¤&(Aía J€g"*.HAAíaàf|B�-a¦J€g~F3kz6hfnfff^HçB�2-A€g6ha JDkPJCF3kJLß-¶h8-¶h8R6H B�2-A€faû ÇFÉG6hg62-A€g$F3aJ*6h6ha²JCgRvX"JDgRvX aFa>`°Á�h2-AgaL3„Bô€` ÇFÉGaBôvÇFÉGfa`‚/2-A€f-¶h8-¶h8R6H aúŽ`öàJŸF3`ª ,m˜B�aœ gŠrAú¤4Bÿ‚gJBfDJ�g> PNÐJ˜S�F3k2`âB†aša¼gœraV` ,m>,gB�a6 gI3 $rAú^4Bÿ‚gJBfÞJ�gØ PNÐJ˜S�kÌ`âB†a4aBóŒg6 fF3aü`aÎaâ`ŽAìa J€g`~aäCöx, J6x g*6hfP†6F3x ÄüCöxÓ¼‰mÜ` aø aùn`Êa® R*($g¾¶XRfB¶XR*6Xfða®aI3B†B‡aBòúga˜`a�`–B�NuAê<| ¬!ll 1|hB¨F3 ,fmgrçA AêMêAêD"|.IOSpaBî^gaî¦%HZ%I^AêD"|.FMSpaBî@kF3gaî†%Hb%IfNu%|ÿÿÿÿb`ôAêD|;pL@ !@ MêZ!NpNAgaîLV3àNu @€ $(,048*, JvXgûÆF3BvX¶X%fû¸B�6X5$.6X²6x caû”GöxÄü׺«gaû€GêaúF3gaûr`û|JvXf þ=¼ÿXaÌ-¬XLaŽJf Ì`r ,m Ò2-AF3€g",g š ¬f Ž ,$m ¦Jmf |agk v` €a ðF3ˆƒg `J€f Za 8J€gk \` JAúä`¾6hg 6ÿX$g Ug &F3"-²­ m "- f  Uf"-o úf òJ­o ê6hfaI3 @6XgBù¶`¦a &26X$g äf ØJf Ugf ÎýJvXftF3=¼ÿXöh-‡X¬X+-¬XLaˆa Rg’aHJg BvXB¶XB6X+6hF3��ha Ð` ha È @gJf2-Agöa ¨`^Jf b2-AF3f Ja taL/a Œ f 6öh6hga p`²a p`ªAêD!vX&F3!l!l !E!lBhlap6Xg66XgB6XQ,E%nŽ(�Î U@g Uf ,E%nŠ(�ÎJª(I3ga >Bª(Nu`ò/ AêN"vX paBø"gaøÒ%Hì%Ið"_Nu|%EaÒAêF3ìp#NAg g f |d0<NA`ÜpNuHçB*¸, kr,EÝüI30 0ÝSfúLß`Nu6hfÎa &`B÷¢`ýÔ ,mÞJmf´aRgk°`F3ºa ‚J€gk¦`”AúN fAúdB�4Bÿ‚gJBftJ�gn PNÐJ˜RF3 g^`Þa¨Aìa ¨fB�-a ÂJ€kgB€NupÿNupNu6hfa‚I3@`Böþar26X$ 6ÿX$g˜g&JvXf*J¶Xf"0 @fB¶X,`ý> @F3f 0-@` @ gX @`f"-k,E .†�β€nò-�X,`6 @@f"6X,F3S�kà-�X,` @f�"6X,R�,E .†�β€n¾-�X,aì`–6hgŒaI3Ö`J6hgz6hfa¦`Bö"a–JvXfa®`XCöX0 iaœF3`Þaú"6hg6hg &laÒf agaöŠ`ü¼aÎ`ðAêD/ "JF3$KGéµËfB¨B¨ 1|`!l!l Bhl!vX&!E!J$IF3"_pr„`Favr‚`@r‚`>rƒ`8ahrÅ`2rÇ`0rƒ`*rëF3`$rá` rä`r†`6hfaJ`a>râ`r…`rÂa2a,aü4`žr�`öp)` p(`p*`F3p+"jÓÀJÑg0<NA`ôNup)` p(`p*`p+ jB0NuB€B�6ha Ug.F3 Ug. U@g( Ug" Ug U g UfJCgJDgNuJCgNuJDg Nu fH3NupNuB€BƒAú46hB�2²XgJk`úJkö±ü*VgH`èkgB`öAú 2-&H3JXgÆ�f`Æ�gJk`ú±ü*šd`àBƒkg`öJjæJ`âpNupÿNu"j.)F3g"²¶xf "(²¶xg.6xfèpNuB€²6x bÂüCöxÓÁ, )fNupÿH3Nup*6hNuAú Bƒ(²Pf 6(8(NuÑü±ü* dð`â ¶.IOSX f ¶XF3Nu6Xf, gí¬aþ\R6XQaþva4`í˜aþH26X$, g�`F3Á�gÁ46X$gf `gÁ=�X$aþ gíBaI3€Bìz`í:aýê"j"i$* g",²¶X&f öX$¶X$"Q`âaýâ lÿgJª$F3fa`ìø%_$"j"i$* f /*$Bª$Nu²¶X&g"Q`èa:!AöX%=¼ÿX`F36Xg6¼@B‘`6¼€B«p>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM�7/14/83**ˆBIT�TEST�MACRO* BTSTM„MACRO „IFGE†\1-16‰OPT‡MEX‰BTSTW…#\1-16,\2(\3,\4) ‰OPT‡NOMEX„ENDC* „IFLT†\1-16‰OPT‡MEX‰BTSTW…#\1,\2+2(\3,\4) ‰OPT‡NOMEX„ENDC‰ENDM *ºBKM�7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE ‰XDEF†TEL02 ‰XDEF†TEL05 ‰XDEF†TELFMS ‰XDEF†SIGFMS‰PAGE**ˆGENERAL�EQUATES**(PBCLN„EQU…14’PARAM�BLOCK�CONSTANT�LENGTHTFIL…EQU…$26‘TEMPORARY�FILE‰PAGE‰INCLUDEƒTEMPLATE.FHS.AI‰PAGE ‰SECTION�0 ‰DC.B†'FHSF'‰DC.L†'120384�4'**ˆTELFMS**ˆREV.�1.00‚6/15/79�(JIM�SMITH)*&*�THIS�ROUTINE�IS�CALLED�TO�NOTIFY�FMS*�OF�A�COMMAND�REQUEST.*!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�FHCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�A2�=�FHS�DATA�SEGMENT�ADDRESS*�D6�=�LUN�POINTER*�D7�=�LUT�POINTERR* *ˆEXIT:�SAME*ŽD0�=�0�=�SUCCESSFUL*“1�=�NOT�SUCCESSFUL**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�R‹P�P *�A�*‡P�P�P�P*****6TELFMSƒLEA…QEVBLK(A2),A0ŠSET�UP�POINTER�TO�PARAM�BLOCK+i48O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>#*ˆMOVE.L„#FMSID,0(A0)ˆSET�UP�FMS�ID‰MOVE.L„FMSTSKID(A2),(A0)‰MOVE.L„FMSTSKID+4(A2),4(A0) *œSET�TASK�ID�IN�PARAMETER�BLOCKO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MOVE.B #FHLEVT,EVSUB(A2)TEL02:‰LEA‡EVLEN(A2),A6‰MOVE.L„A6,QEVPKT(A0)%*œA6�=�ADDRESS�OF�EVENT�TO�BE�PROCESS ‰SUB.L…A6,A6 *œA6�=�ZERO(‰MOVE.L‚D6,LUNREG(A2)‡SET�UP�LUN�POINTER(‰MOVE.L‚D7,LUTREG(A2)‡SET�UP�LUT�POINTERTEL05:‰CMP.L…#-1,(A0) ‰BEQ.S…TEL30*œBRANCH�IF�ROM�BASED�SYSTEM*œFMS�DOES�NOT�EXIST&‰ERQ.QEVNT�(A0)ŽSEND�EVENT�TO�WHOMEVER*"‰CMP.Bƒ#RTCDENAB,D0ŠASQ�DISABLED�?‰BEQ.SƒTEL10�YES‰CMP.Bƒ#RTCDTFUL,D0ŠASQ�FULL�?‰BNE.SƒTEL20�NO#TEL10„ERQ.DELAY�#20�GIVE�UP�CONTROL‰LEA‡QEVBLK(A2),A0‰BRA.SƒTEL05ŽTRY�AGAIN$TEL20„TST.LƒD0’RESET�CONDITION�CODES ‰RTS™RETURN TEL30:‰MOVE.L„#$18000003,D0*œFORCE#*œD0�=�NON-EXISTENT�TASK�ERROR�CODE ‰BRA.S…TEL20‰PAGE**ˆSEND�STATU2 S�EVENT�TO�FMS*6SIGFMSƒLEA…QEVBLK(A2),A0ŠSET�UP�POINTER�TO�PARAM�BLOCKO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>#*ˆMOVE.L„#FMSID,0(A0)ˆSET�UP�FMS�ID‰MOVE.L„FMSTSKID(A2),(A0)‰MOVE.L„FMSTSKID+4(A2),4(A0) *œSET�TASK�ID�IN�PARAMETER�BLOCKO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰MOVE.B‚#STAEVT,FMSUB(A2)‰LEA‡FMSEVT(A2),A6*‰MOVE.L„A6,QEVPKT(A0)‚SET�UP�EVENT�POINTER ‰SUB.L…A6,A6 *œA6�=�ZERO(‰MOVE.L‚D5,FMSDCB(A2)‡SET�UP�DCB�POINTER BRA TEL05‰ENDé=/*=/*†FILE.IOS.AF=/*?=/* Chain file to assemble I/O Trap 2 server 'IOS' file portion=/*:=/* If no output argument is specified for the listing the*=/* chain file will default to FILE.IOS.LS=/*=/IFC \1ƒ=ARG�FILE.IOS.LS=/ENDIF=/*&=ASM FILE.IOS.SA,FILE.IOS.RO,\1;RZ=166=/*{ Included files are:=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.EXE.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.NIO.EQ=/*ƒ9995.&.LV5.EQ=/*ƒ9995.&.FME.EQ=/*ƒ9995.&.FMI.EQ=/*ƒTEMPLATE.IOS.AI=/*}=/*=ENDééééé<‰OPT‡CREF***********************************************************************&*�VERSADOS�OPERATING�SYSTEM�-�OEM�RTOS* *—I/O�MODULE**•IOS�TRAP�2�SERVER*–FILE�PORTIION$*�COPYRIGHTED�1980�BY�MOTOROLA,�INC.*F**********************************************************************‰PAGE***ˆINCLUDE�STATEMENTS*ˆEXE*ˆFME*ˆFMI*ˆIOE*ˆLV5*ˆTR1 *ˆTR1RTCD*ˆNIO*ŠNOLISTŠINCLUDE�9995.&.TR1.EQŠINCLUDE�9995.&.TR1RTCD.EQŠINCLUDE�9995.&.EXE.EQŠINCLUDE�9995.&.IOE.EQŠINCLUDE�9995.&.NIO.EQŠINCLUDE�9995.&.LV5.EQŠINCLUDE�9995.&.FME.EQŠINCLUDE�9995.&.FMI.EQŠLISTŠPAGE‰INCLUDEƒTEMPLATE.IOS.AI ‰SECTION�0 ‰DC.B†'IOSF'‰DC.L†'120384�4'‰PAGE ***************„EXTERNAL�DEFINTIONS**2 ******** ‰XDEF†SNDFMS‰XDEF†TELLFMSL ***************„EXTERNAL�REFERENCES********** ‰XREF†DCBSIG ‰XREF†DCBWAIT ‰XREF†ERCOSNX ‰XREF†FCBSIG ‰XREF†KILIT ‰XREF†LUTSIG ‰XREF†STARQS ‰PAGE**ˆSNDFMS**ˆREV.�1.00‚7/01/79�(JIM�SMITH)*&*�THIS�ROUTINE�IS�CALLED�TO�NOTIFY�FMS*�OF�A�COMMAND�REQUEST.*!*ˆENTRY:�A4�=�ASQ�MESSAGE�POINTER*�A5�=�IOCB�POINTER *�A6�=�ZERO*�A7�=�STACK�POINTER*�D5�=�ADDRESS�FCB*�D6�=�LUN�POINTER*�D7�=�LUT�POINTER* *ˆEXIT:�SAME*ŽD0�=�0�=�SUCCESSFUL*“1�=�NOT�SUCCESSFUL**ˆUSING:ƒ0�1�2�3�4�5�6�7 *�D�R�*‰P�P *�A‰P�P�P�P*****SNDFMS:‰LEA‡EVNLEN(A2),A0‰MOVE.L„A0,QEVPRM+QEVPKT(A2).*œSET�ADDRESS�OF�PACKET�TO�USE�WITH�THIS�EVENT&‰MOVE.L‚D6,LUNR(A2)‰SET�UP�LUN�POINTER&‰MOVE.L‚D7,LUTR(A2)‰SET�UP�LUT�POINTER‰BSETƒ#LUSFIO,LUTCSF(A6,D6.L)*œSET�I/O�PENDING�FOR�THIS�LUN‰BSETW‚#FCFLBB,FCBFLG(A6,D5.L)*œSET�I/O�PENDING�FOR�THIS�FILE‰BSR.S…FIOS0100*œQUE�EVENT�TO�FMS ‰BEQ.S…SND30*œBRANCH�IF�EVENT�QUEDSND20„BSR…FCBSIG*œRELEASE�THE�FCB�LIST ‰BSR…LUTSIG)*œRELEASE�THE�LOGICAL�UNIT�TABLE�RESOURCE ‰BRA…ERCOSNX-*œJUMP�BECAUSE�OPERATING�SYSTEM�TASK�FMS�DOES *œNOT�EXIST***!SND30„BSR…FCBSIGŽRELEASE�FCB�LISTE}NYV ‰BRA…STARQS‰PAGEI*************************************************************************** *ˆNOTIFY�FMS***J***************************************************************************1TELLFMSL�MOVE.L‚D5,DCBADDR(A2)†SET�UP�DCB�ADDRESS*‰MOVE.B‚#STAEVT,SUBEVC(A2)‚SET�UP�SUB�CODE3*œSETUP�RESPECTIVELY�IN�THE�EVENT�INFORMATION�BLOCK*žTHE�DCB�ADDRESS*žTHE�SUB�CODE‰BSR.S…FIOS0100*œQUE�EVENT�TO�FMS‰BEQ.S…TELLFCT01)*œJMP�IF�EVENT�QUEUED�TO�FMS�SUCCESSFULLY ‰BSR‡DCBWAIT*œLOCK�THE�DCB�RESOURCE�LIST‰BCLRW…#DFLGSC,DCBFLG(A6,D5.L)‰BCLRW…#DFLGWP,DCBFLG(A6,D5.L)*œREMOVE�STATUS�CHANGED�FLAG*œWRITE�ENABLE�DISK ‰BSR‡DCBSIG*œRELEASE�DCB�RESOURCE�LIST ‰TST‡(A7)*œFORCE�NOT�EQUAL�CONDITION TELLFCT01: ‰RTS™RETURN‰PAGE* *ˆRoutine�to*’Que�an�event�to�FMS*A*ˆThis�routine�expects�that�everything�is�already�set�up�and�will*ˆinitiate�the�call�only.**ˆThere�is�only�one�bad�return.*’The�operating�system�task�FMS�does�not�existB*ˆANY�other�error�condition�other�than�above�will�cause�an�orderly*’system�crash**ˆINPUT"*’A2�=�ADDRESS�OF�IOS�DATA�SEGMENT**ˆOUTPUT!*’A0�=�ADDRESS�OF�PARAMETER�BLOCK*’D0�=�STATUS�OF�REQUEST**ˆREGISTER�ALTERATION*’A0�=�DESTROYED*’D0�=�DESTROYED**ˆCONDITION�CODES5*’NOT�EQUAL=�OPERATING�SYSTEM�TASK�FMS�DOES�NOT�EXIST*–EQUAL=�EVENT�WAS�QUEUED* FIOS0100:‰LEA‡QEVPRM(A2),A0!*œA0�=�ADDRESS�OF�PARAMETER�BLOCK‰CMP.L…#-1,(A0)‰BEQ.S…FIOS0299*œJMP�IF�A�ROM�BASED�SYSTEM*œFMS�DOES�NOT�EXIST‰MOVE.L„#QEVNT,D0*œD0�=�DIRECTIVE�NUMBER‰TRAP†#1*œQUE�THE�EVENT�TO�FMS‰BEQ.S…FIOS0400)*œJMP�IF�EVENT�QUEUED�TO�FMS�SUCCESSFULLY‰CMP.B…#RTCDENAB,D0‰BEQ.S…FIOS0200*œJMP�IF�ASQ�ENABLED‰CMP.B…#RTCDNTBL,D0‰BEQ.S…FIOS0200*œJMP�IF�ASQ�NOT�SET�UP�YET‰CMP.B…#RTCDTFUL,D0‰BEQ.S…FIOS0200*œJMP�IF�ASQ�FULL‰CMP.B…#RTCDTASK,D0‰BEQ.S…FIOS03001*œJMP�IF�OPERATING�SYSTEM�TASK�FMS�DOES�NOT�EXIST ‰BSR…KILIT'*œKILL�THE�SYSTEM�IN�AN�ORDERLY�FASHION FIOS0200:‰ERQ.DELAY�#100*œDELAY ‰BRA‡FIOS0100 *œTRY�AGAIN FIOS0299:‰MOVE.L„#$18000003,D0*œFORCE#*œD0�=�NON-EXISTENT�TASK�ERROR�CODE FIOS0300: ‰TST.L…(A7)"*œSET�CONDTION�CODES�FOR�NON�EQUAL FIOS0400:‰RTS*œRETURN�TO�CALLER‰PAGE‰ENDé3 ééééééa1FHS ASREL'FILE FHS SA!(R(…VERSAdos File Handling Services Task V 4.0 - 09/13/82B2@TEL02 @TEL05 2@SIGFMS l@TELFMS �F3FHSF120384 4Aê* ªb!jf|RMêP!N �Î%FT%GX �ÿÿÿÿg*AÐ0<#F3NA g f |0<NAAê*`ÒJ€Nu <`ôAê* ªb!jf|>3MêgAîvF30<6NA=|ÿÿ~aÞf´.gaaòf¢Gî:EîºLÓg,aäfÿ|Ö‚F3Sƒ<ÿarfÿlaPfÿdGëAÈeÊaxaÄfÿNNuBnl.>g-|@F3N|SAîNNCg.-@‚NunAT-|€N|SHîÀVAîNNCg-@‚Nu2.F3PA Ag -|‚NuDüNu-|NAîNNCNuB®¨Aî -H¬Aî -H°F3Aî NBfR®¨-@‚Nu. f-n&=n<n€6n€0.>f-n F3"f-n&f=n*f LîHî,fn4fnF352.JngýœB€.F3(°.@c.@Jgý†HîÀÈ-nJÐ-n"Ô-n&Ø-n$Ü-@àAîÈ0<NAgF3ýV-@‚Nu.g¨Jng B‡ ®&SCTgÀ-nAî0<NAEî"Cúù”F30<)4ÙQÈÿü=n<-n&Aî -HJî ><?B†B‡|�aûø> .�F3g n„fPR®"SGfÖ`F-n"î-n&òAîî0< NAf.=|~0<NAAîv0<6G3NAg Aø„0<5NA |0<%NAAî0< NA~#üÿÿÿÿ)taZAîCîÜajAîCîI3îa` .IîóaBøªAîØ-HÈAîø-HÌAî¼NBJ‡gAúù-HÈAúù"-HÌAî¼NBF3AúøºNC`ÿnCúøØ-n–-Y’kAîŠNCfòNu2< c {c< ÀSAfèF3Nué˜0 :m^�ÁSBfæNuHçÿKî Ií0B„B…B†B‡ ¬ÿÿÿÿ g aa:F3afIì`êLß8ÿNuLìÀ Ð…°¬c)@ , D€€ÿÿЬ (,*Nu Ї¼­F3b°­cÙ­�­¼­b°­eÙ­�­Nu$&Ö‡àŠà‹"’†à‰Gí°pÿ “,3ÿÿgR€´Sb¶ke î fÓ[Ó[`Gë`ÚNu4éééé'NOMMU LOADER AF¬¬qqLOADER SAµµqqLOADER LG¾¾qqLOADER ROÇÇ qq=/*=/*†NOMMU.LOADER.AF=/*<=/*†THIS�CHAIN�FILE�SHOULD�BE�USED�TO�CREATE�AN�'.RO'�LOADER=/*†MODULE�FOR=/*‘SYSTEMS�NOT�HAVING�AN�'MMU'=/*'=/*†PARAMETER�01ˆLISTING�FILE�OR�DEVICE)=/*šIF�NO�ARGUMENT�SPECIFIED�THE�ASSEMBLY2=/*šWILL�DEFAULT�OF�LISTING�FILE�'NOMMU.LOADER.LS'=/*=/*=/IFC \1=ARG‚NOMMU.LOADER.LS=/ENDIF:=ASM‚NOMMU.LOADER.SA/&.LOADER.SA,NOMMU.LOADER.RO,\1;RZ=110=/*{ Included files are:=/*ƒ9995.&.EXE.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*}=ENDé5 éééé¤4MMUFLAG‚EQUƒ1ˆMMUFLAG=0�MMU�EXISTS,ƒMMUFLAG=1�NO�MMUééééééé­=/*=/*†NOMMU.LOADER.LG=/*2=/* Link chain file run at sysgen time to link LDR=/*D=/* Sysgen parameter LINKLS = \LINKLS = file/device to which to send=/* the linker listing=/*G=/* Sysgen parameter LDRSTR = \LDRSTR = address at which to link driver=/*=LINK ,&.LDR.LO,\LINKLS;HAMIXSSEGMENT &LDR:0 \LDRSTRINPUT NOMMU.LOADER.ROINPUT &.EMHNDLR.ROEND=/*=END6 éééééé¶,1LOADER ASREL' LOADER SA!6C(…ø2PMOVEBLK :pERRMSGHA PPOOLTABL ú@TAKELUN À@TAKELUN2 ÄPPLUGPOOL V@TASKLIST lPEPBRA0 &PEPBLDF +PEPBRD0 "pBI2HEX4 PA0BLK  PEPBOPT *PEPBLTH @CLSFHS DPCLUFHS Š@LDRBEG œ2PLIBBUF  PERQMPB ”@LDRRTN @PEPBPLUGB .PEPBPLUGE 2PATTRCOD Ò@MOVASC1 ÞPCHLUFHS ÚPATTRFHS ²PEPBQUERY , ÜF3 DLDRúTDMPˆÈÀ`wF3  TASKDUMPSY&SCT&BCTÿÿÿÿSRV4H3€: UNABLE TO LOAD TASKDUMP.SY €*ÌdT`AI3 )|*ž : ABORTED BY F3 = Aúþî0<NAf�,HOî”0<½B˜QÈÿüAúÿpCîŠ0<72ØQÈÿüAî"-HF3œ=|,®=|€ö|l-|ÈAúR-HAú`-Hš-|&SCTBnAî 0<F3NAf"Aîš0<3NAf |0<!NAf0<$NA`ø0|™0<NAAî 0<"NA |F30<%NAAî 0<"NAfÔ . fà.  fÒLîÀ=|h~HîÀv|€I3 |�B®‚. fd . @g @gBýÖ-|‚ad`=|,®atJn~k,F3HîÀ -n¨Aî”0<NAAîv0<6NAg Aø„0<5NA |0<%NABn*Aî"F30<NAaAî°0<NA|�Jn‚f =n‚| ‚Nua~fÒ.>gAîvF30<6NA=|ÿÿ~aÞf´.ga2aòf¢Gî:EîºLÓg,afÿ|Ö‚F3Sƒ<ÿa fÿla~fÿdGëAÈeÊaxaòfÿNNuBnl.>g-|@F3N|SAîNNCg.-@‚NunAT-|€N|SHîÀVAîNNCg-@‚Nu2.F3PA Ag -|‚NuDüNu-|NAîNNCNuB®¨Aî -H¬Aî -H°F3Aî NBfR®¨-@‚Nu. f-n&=n<n€6n€0.>f-n F3"f-n&f=n*f LîHî,fn4fnF352.JngýnB€.(°.@c.@JgýXF3HîÀÈ-nJÐ-n"Ô-n&Ø-n$Ü-@àAîÈ0<NAgý(-@‚Nu.g¨F3Jng B‡ ®&SCTgÀ-nAî0<NAEî"Cúùf0<)4ÙQÈÿü=n<-nF3&Aî -HJî ><?B†B‡|�aûÊ> .�g n„fPR®"SGfÖF3`F-n"î-n&òAîî0< NAf.=|~0<NAAîv0<6NAg Aø„0<5NA |J30<%NAAî0< NA~#üÿÿÿÿ)taZAîCîÜajAîCîîa` .IîóaBø|AîF3Ø-HÈAîø-HÌAî¼NBJ‡gAúøÚ-HÈAúøô-HÌAî¼NBAúøŒNC`ÿnCúøª-nF3–-Y’kAîŠNCfòNu2< c {c< ÀSAfèNué˜0 :F3m^�ÁSBfæNuHçÿKî Ií0B„B…B†B‡ ¬ÿÿÿÿ g aa:afIì`êLß8ÿNuLìÀF3 Ð…°¬c)@ , D€€ÿÿЬ (,*Nu Ї¼­b°­cÙ­�­F3¼­b°­eÙ­�­Nu$&Ö‡àŠà‹"’†à‰Gí°pÿ “ÿÿgR€´Sb¶ke 3î fÓ[Ó[`Gë`ÚNu4éééé'RR FIOEQU SAÜÜ 4qqFPMACRO SABqqMACROS SAUqqRTEQU SA''ˆqqVDOSVM SA@@qq+********************************************* PASCAL FILE I/O EQUATES** COPYRIGHT 1982 MOTOROLA, INC.**�VERSION‚2.01�:�4-19-82** 1980-04-11 : JOHN KAUFMANN*+********************************************%*ˆDATA�STRUCTURES�AND�EQUATES�FOR�I/O**$*�FHS�PARAMETER�BLOCK�DATA�STRUCTURE* ‰OFFSET�0FHSCMDƒDS.W�1�COMMANDFHSOPTƒDS.W�1�OPTIONSFHSSTAƒDS.B�1�STATUS!FHSLUNƒDS.B�1�LOGICAL�UNIT�NUMBERFHSVOLƒDS.B�4�VOLUME�NAMEFHSUSNƒDS.W�1�USER�NUMBERFHSCLGƒDS.B�8�CATALOG�NAMEFHSFILƒDS.B�8�FILE�NAMEFHSEXTƒDS.B�2�EXTENSIONFHSGENƒDS.W�1�RESERVED FHSWCDƒDS.B�1�WRITE�PROTECT�CODEFHSRCDƒDS.B�1�READ�PROTECT�CODE#FHSLRLƒDS.W�1�LOGICAL�RECORD�LENGTH7FHSSIZƒDS.L�1�CONTIGUOUS�FILE�SIZE�/�DIR.�ENTRY�POINTER* FOR NONCONTIGUOUS FILES‰OFFSET�FHSSIZFHSRESƒDS.B�1�UNUSED'FHSKEYƒDS.B�1�KEY�LENGTH�(0�IF�NO�KEYS)FHSFABƒDS.B�1�FAB�SIZEFHSDATƒDS.B�1�DATA�BLOCK�SIZE"FHSBLNƒEQU‚*�LENGTH�OF�PARAM�BLOCK**�FHSCMD�EQUATES�(16�BITS)*'FHALLOƒEQU�$80�ALLOC7 ATE�(CREATE�A�FILE)FHASGNƒEQU�$40�ASSIGN�(OPEN)FHCLOSƒEQU�$4�CLOSEFHDELTƒEQU�$2�DELETE#FHRATTƒEQU�$180�RETRIEVE�ATTRIBUTES**ˆEQUATES�FOR�LU�ASSIGNMENTS* CDFLUNƒEQU…5“CMD�DEVICE/FILE�LUN LDFLUNƒEQU…6“LOG�DEVICE/FIEL�LUN**�FHSOPT�EQUATES�(16�BITS)#*ACCESS PERMISSION FIELD (BITS 0-2)*)FAPBIT EQU $7 BITS FOR ACCESS PERM. FIELDFOPPR„EQU�0�PUBLIC�READFOPER„EQU�1�EXCLUSIVE�READFOPPW„EQU�2�PUBLIC�WRITEFOPEW„EQU�3�EXCLUSIVE�WRITEFOPPRPW‚EQU�4�PUBLIC�READ-WRITE*FOPPREW‚EQU�5�PUBLIC�READ,�EXCLUSIVE�WRITE*FOPERPW‚EQU�6�EXCLUSIVE�READ,�PUBLIC�WRITE"FOPEREW‚EQU�7�EXCLUSIVE�READ-WRITE**OVERWRITE FIELD (BIT 3)FOPOVRT‚EQU�8�OVERWRITE�FILE*$* ALLOCATE DATA BUFFER FIELD (BIT 5)*FOPABF EQU $20 ALLOCATE SHARED DATA BUFFER**POSITION FIELD (BIT 6)*FOPBEG EQU 0 POSITION AT BEGINNING OF FILE&FOPEND EQU $40 POSITION AT END OF FILE*!*RESERVED FIELD (BITS 7 NOT USED)**FILE TYPE FIELD (BITS 8-10)"FFTBIT EQU $700 BITS FOR FILE TYPEFOPCON‚EQU�0�CONTIGUOUSÔQÝNåGíIõ$FOPSEQƒEQU�$100�SEQUENTIAL�(FRL/VRL)CFOPISKƒEQU�$200�KEYED�RECORD,�INDEXED�SEQUENTIAL,�NO�DUPLICATE�KEYS,FOPISDƒEQU�$300�",�",�DUPLICATE�KEYS�ALLOWED*!*RESERVED FIELD (BIT 11 NOT USED)*#*USER ATTRIBUTES FIELD (BITS 15-12))FUSBITƒEQU�$F000�BITS�FOR�USER�ATTRIBUTES**�FHSSTA�EQUATES�(8�BITS)*"FSTADNM‚EQU�$5�DUPLICATE�FILE�NAME‰PAGE**�IOS�PARAMETER�BLOCK�STRUCTURE* ‰OFFSET�0IOSFCTƒDS.W�1�FUNCTIONIOSOPTƒDS.W�1�OPTIONSIOSSTAƒDS.B�1�STATUS!IOSLUNƒDS.B�1�LOGICAL�UNIT�NUMBERIOSSRVƒDS.B�1�RESERVED IOSPKLƒDS.B�1�PARTIAL�KEY�LENGTH.IOSRRNƒDS.L�1�RANDOM�RECORD�NUMBER:�LRN�OR�LSN"IOSSADƒDS.L�1�START�BUFFER�ADDRESS IOSEADƒDS.L�1�END�BUFFER�ADDRESS IOSLENƒDS.L�1�LENGTH�OF�TRANSFER IOSCADƒDS.L�1�COMPLETION�ADDRESS"IOSBLNƒEQU‚*�LENGTH�OF�PARAM�BLOCK**�IOSFCT�EQUATES�(16�BITS)*IOREADƒEQU�$1�READ�REQUESTIOWRITƒEQU�$2�WRITE�REQUESTIOREWDƒEQU�$102�REWIND**�IOSOPT�EQUATES�(16�BITS)*IOPASCƒEQU�0�ASCIIIOPWAT EQU 0 WAIT"IOPUNPƒEQU�0�UNCONDITIONAL�PROCEEDIOPFORƒEQU�0�FORMATTEDIOPECH EQU 0 ECHO MODEIOPRECƒEQU�0�RECORD�ACCESSIOPLRNƒEQU�0�LOGICAL�RECORD�IOIOPKEYƒEQU�0�FULL�KEY�ACCESS"IOPNOCƒEQU�0�NO�COMPLETION�ADDRESSIOPINF EQU 0 INPUT FORMATTEDIOPBINƒEQU�1�BINARY6IOPPOSƒEQU�$6000�BITS�13-14:�LOGICAL�ACCESS�/�POSITIONIOPNXTƒEQU�$0„NEXT(FORWARD)�/�>%IOPCUR EQU $2000 CURRENT POSITION / ='IOPPRVƒEQU�$4000�PREVIOUS(BACKWARD)�/�<2IOPRANƒEQU�$6000�RANDOM(LRN�OR�LSN�GIVEN)�/�>�OR�=**�IOSSTA�EQUATES�(8�BITS)*ISTAEOF‚EQU�$C2�END�OF�FILE‰PAGE*"*ŒSEGMENT�DIRECTOR�PARAMETER�BLOCK* ‰OFFSET�0%SEGTCBƒDS.B�4—TASK�TO�RECEIVE�SEGMENT!SEGSESƒDS.B�4—TASK�SESSION�NUMBERSEGOPTƒDS.W�1—OPTIONSSEGATTƒDS.W�1—ATTRIBUTESSEGNAMƒDS.B�4—SEGMENT�NAME(SEGLADƒDS.L�1—LOGICAL�ADDRESS�OF�SEGMENT*SEGLENƒDS.L�1—LENGTH�(IN�BYTES)�OF�SEGMENT)SEGPTRƒDS.L�1—POINTER�TO�RECEIVING�BUFFER*&*ˆRECEIVING�BUFFER�FOR�'REC.SEG.ATTR.'* ‰OFFSET�0SRENAMƒDS.B�4—SEGMENT�NAMESREATTƒDS.W�1—ATTRIUBTES#SRELSAƒDS.L�1—LOGICAL�START�ADDRESS!SRELEAƒDS.L�1—LOGICAL�END�ADDRESSSREPADƒDS.L�1—PHYSICAL�ADDRESSSRELENƒDS.L�1—LENGTH* *ˆEQUATES�FOR�'SEGATT'�(16�BITS)*SGATROƒEQU…$4000�READ�ONLYSGATRWƒEQU…0”READ�/�WRITE!SGATSSƒEQU…$2000�SESSION�SHARABLE!SGATNSƒEQU…0”NOT�SESSION�SHARABLE"SGATGSƒEQU…$1000�GLOBALLY�SHARABLE"SGATNGƒEQU…0”NOT�GLOBALLY�SHARABLE%SGATDPƒEQU…$800‘SEGMENT�IS�DUPLICATED&SGATNDƒEQU…0”SEGMENT�IS�NOT�DUPLICATED.SGATSDƒEQU…$400‘SEGMENT�SHARABLE�IF�DUPLICATED/SGATNNƒEQU…0”SEGMENT�NOT�SHARABLE�IF�DUPLICATED* *ˆEQUATES�FOR�'SEGOPT'�(16�BITS)*8SGOPATƒEQU…$8000�15�ATTRIBUTES�GIVEN:�TRSEG,DCLSHR,SETSAASGOPLAƒEQU…$4000Š14�LOGICAL�ADDRESS�(NOT�NAME):�TRSEG,SETSA,RCVSADSGOPPAƒEQU…$2000†13�SET�LOGICAL�ADDR.=PHYSICAL�ADDR.(RET�ADR�IN�A0):!*›GTSEG,TRSEG,ATTS7 EG,SHRSEG,SETSA0SGOPSPƒEQU…$1000�12�MAKE�PERMANENT:�DCLSHR,SETSA8SGOPRPƒEQU…$0800�11�REMOVE�PERMANENT�STATUS:�DESEG,SETSA1SGOPSLƒEQU…$0400�10�SEGMENT�LENGTH:�SHRSEG,ATTSEG;SGOPLGƒEQU…$0200‰9�ALLOCATE�NEXT�LARGER�BLOCK�IF�SIZE�ERROR‰PAGE*Æ*ˆTRAP�1�EQUATES°*ÆGTSEG„EQU‚1�ALLOCATE�SEGMENT™DESEG„EQU‚2�DEALLOCATE�SEGMENT"RELINQƒEQU‚22ŽRELINQUISH�EXECUTION'RCVSA„EQU‚9�RECEIVE�SEGMENT�ATTRIBUTES�ABORT„EQU‚14ŽABORT�TASK�(SELF)+RBETLFƒEQU‚26ŽRECEIVE�BUS�ERROR�THRU�LINE�F&RT2TF„EQU‚27ŽRECEIVE�TRAPS�2�THROUGH�F‰SPC…10*$* VECTOR TABLE FOR TRAPS 2 THROUGH F* ‰OFFSET�0 VT2TF„DS.L„11TRAPD„DS.L„1�TRAP�DTRAPE„DS.L„1�TRAP�E *3* VECTOR TABLE FOR BUS ERROR THRU LINE F EXCEPTIONS*‰OFFSET‚VT2TF+56 VBETLFƒEQU…*BUSER„DS.L„1�BUS�ERRORADDRERƒDS.L„1�ADDRESS�ERROR‰DS.L„1�UNUSEDZDIV…DS.L„1�ZERO�DIVIDECHKI…DS.L„1�CHK�INSTRUCTIONTRAPV„DS.L„1�TRAPV�INSTRUCTIONVTABSZƒEQU…VBETLF+40‰PAGE-* RUNTIME DATA MAINTAINENCE - OFFSETS FROM A5 ‰OFFSET‚0SC‡DS.L„1�STATEMENT�COUNTERHP‡DS.L„1�HEAP�POINTERDL0†DS.L„8�DISPLAY�LEVEL�0LTN†DS.B„4�LOADING�TASK�NAMESN‡DS.B„4�SESSION�NUMBERLUIU…DS.L„1�LU'S�IN�USECCDR…DS.W„1�CHAIN�CMD�DIAG�REGDTID…DS.B„4�DEFAULT�TERMINAL�IDDVOL…DS.B„4�DEFAULT�USER�VOLUMEDUN†DS.W„1�DEFAULT�USER�NUMBERDCAT…DS.B„8�DEFAULT�CATALOGCLL†DS.W„1�COMMAND�LINE�LENGTHCL‡DS.B„162‹COMMAND�LINEOFAR…DS.W„26ŒOPTION�FIELD�ARRAY‰DS.W„1�UNUSED"NFCL…DS.W„1�NUMBER�OF�FIELDS�IN�CLIENF…DS.B„1�I=�NUMBER�OF�FILESIECF…DS.B„1�I=�CURRENT�FILEIEOF…DS.B„1�I=�OFFSET"IECO…DS.B„1�I=�CURRENT�FILE�OFFSETOENF…DS.B„1�O=�NUMBER�OF�FILESOECF…DS.B„1�O=�CURRENT�FILEOEOF…DS.B„1�O=�OFFSETOECO…DS.B„1�O=�CURRENT�OFFSET#FNNF…DS.B„1�FIELD�N�NUMBER�OF�FILES FNCF…DS.B„1�FIELD�N�CURRENT�FILEFNOF…DS.B„1�FIELD�N�OFFSET"FNCO…DS.B„1�FIELD�N�CURRENT�OFFSET'‰DS.B„4*15ŠABOVE�INFO�FOR�15�MORE�FILESEFI†EQU…*�END�OF�FIELD�INFO"SGBRK„DS.L„1�SEGMENT�BREAK�ADDRESSSHPAD„DS.L„1�SMALLEST�HEAP�ADDR2EOD†EQU…*�END�OF�DATA�NEEDED�DURING�INITIALIZATION&‰DS.B„72ŒRUNTIME�ERROR�ROUTINE�STORAGERTDSZ„EQU…*�RUNTIME�DATA�SIZE (* FILE POINTER - OFFSETS FROM INITIAL A0 ‰OFFSET‚0$CCP†DS.L„1�CURRENT�COMPONENT�POINTER"FDP†DS.L„1�FILE�DESCRIPTOR�POINTER =* FILE PARAMETER BLOCK - OFFSETS FROM FILE DESCRIPTOR POINTER*ˆPASCAL�PARAMETER�BLOCK ‰OFFSET‚0FP‡DS.L„1�FILE�POSITIONPFS†DS.W„1�PASCAL�FILE�STATUSCS‡DS.W„1�COMPONENT�SIZE*ˆIOS�PARAMETER�BLOCKIOS†DS.B„IOSBLN*ˆFHS�PARAMETER�BLOCKFHS†DS.B„FHSBLN*ˆMORE�FILE�STATUSFSR†DS.W„1�RESERVEDFSSCN„DS.B„1�FILE�SCAN�STATUSFPOS…DS.B„1�FILE�POSITION*ˆCOMPONENT�BUFFERCB‡EQU…*TXTBS„EQU…132‹TEXT�BUFFER�SIZE )* PASCAL FILE STATUS WORD BIT ASSIGNMENTSPFSSO„EQU…0�STANDARD�OUTPUTPFSSI„EQU…1�STANDARD�INPUTPFSTF„EQU…2�TEXT�FILEPFSLF„EQU…3�LOCAL�FILEPFSIF„EQU…4�INDEXED�FILEPFSOP„EQU…6�OPENPFSEOFƒEQU…7�END�OF�FILEPFSEOLN‚EQU…8�END�OF�LINEPFSPA„EQU…9�PASSED�ASSIGNED'PFSAPCƒEQU…10ŒACCESS�PERMISSION�CHANGEDPFSCLFƒEQU…11ŒCOMMAND�LINE�FILEPFSOUTƒEQU…12ŒOUTPUTISTAT„EQU…$3F‹INITIAL�STATUS * ADDITIONAL LU EQUATEMAXLU„EQU…31ŒMAXIMUM�VALID�LU * ERROR EQUATES OSE†EQU…0�OPERATING�SYSTEM�ERROR#LUA†EQU…$40‹LOGICAL�UNIT�ASSIGNMENTNAM†EQU…$28‹FILENAMEOPT†EQU…$41‹OPTIONMAL†EQU…$12‹MEMORY�ALLOCATION:WSN†EQU…$13‹WRONG�SEGMENT�NAME,�MUST�BE�'SEG2'�(VM0X�ONLY)%CLF†EQU…$42‹TOO�MANY�CMND�LINE�FIELDSFNR†EQU…$43‹FILE�NOT�RESETFNW†EQU…$44‹FILE�NOT�REWRITTEN‰PAGEéé8 ééééé‰PAGE ˆOPT‡MEX3ˆXREF†.PFPOINTƒ!�THE�F_LINE�TRAP�SIMULATING�ROUTINE O******* Definition of Special FP Registers (and their bit field values) ******* CNTRL„EQU‡0 STATUSƒEQU‡1 TMPSTAT‚EQU‡2 INSTADƒEQU‡3 O******* Definition of FP instruction "data types" (size codes, bits 5-3) ****** .FP.S„EQU‡0 .FP.D„EQU‡8 .FP.X„EQU‡$10 .FP.B„EQU‡$18 .FP.W„EQU‡$20 .FP.…EQU‡$20 .FP.L„EQU‡$28 .FP.P„EQU‡$30.FP.PDYN�EQU‡$38‘('K'�dynamic)  ‰PAGE FMOVE„MACRO‰NOLIST?‰IFC‡'\4','FP'�.........�move�to�FPn�.......................... !‰IFC‡'\1','FP'‹..�not�implemented ‰FAIL†999‰ENDC ‰IFC‡'\1','S'Œ..�not�implemented ‰FAIL†999‰ENDC ‰IFC‡'\1','#'Œ..�not�implemented ‰FAIL†999‰ENDC .FP.WRD2�SET‡$0000+.FP.\0+\5 ‰IFC‡'\1','D'Œ..�Dn�source.FP.WRD1�SET‡$F040+\2‰LIST********�FMOVE.\0‚\1\2,\4\5‰DC.W†.FP.WRD1,.FP.WRD2‰NOLIST‰ENDC ‰IFC‡'\1','A'Œ..�disp(An)�source‰IFC‡'\3',''�..�no�displacement.FP.WRD1�SET‡$F050+\2‰LIST********�FMOVE.\0‚(\1\2),\4\5‰DC.W†.FP.WRD1,.FP.WRD2‰NOLIST‰ENDC‰IFNC†'\3',''�..�displacement.FP.WRD1�SET‡$F068+\2‰LIST********�FMOVE.\0‚\3(\1\2),\4\5‰DC.W†.FP.WRD1,.FP.WRD2,\3‰NOLIST‰ENDC‰ENDC >‰ENDC†...................�move�to�FPn�........................  >‰IFC‡'\4','S'‚.........�move�to�Special�FP�Reg�............... !‰IFC‡'\1','FP'‹..�not�implemented ‰FAIL†999‰ENDC ‰IFC‡'\1','S'Œ..�not�implemented ‰FAIL†999‰ENDC ‰IFC‡'\1','A'Œ..�not�implemented ‰FAIL†999‰ENDC .FP.WRD2�SET‡$2000+\5 ‰IFC‡'\1','D'Œ..�Dn�source.FP.WRD1�SET‡$F040+\2‰LIST********�FMOVE.\0‚\1\2,\5‰DC.W†.FP.WRD1,.FP.WRD2‰NOLIST‰ENDC !‰IFC‡'\1','#'Œ..�immediate�source.FP.WRD1�SET‡$F07C‰LIST********�FMOVE.\0‚\1\2,\5‰DC.W†.FP.WRD1,.FP.WRD2 ‰IFC‡'\0','L'‰DC.L†\2‰ENDC‰IFNC†'\0','L'‰DC.W†\2‰ENDC‰NOLIST‰ENDC >‰ENDC†...................�move�to�Special�FP�Reg�.............  ‰IFNC†'\4','FP'‰IFNC†'\4','S' ýqu]=‰IFC‡'\1','FP'�.........�move�from�FP�to�memory�............. ‰IFC‡'\4','#'Œ..�not�implemented ‰FAIL†999‰ENDC %‰IFC‡'\0\7','PD'‰..�BCD�w/'k'�dynamic%.FP.WRD2�SET‡$1000+(\8<<6)+.FP.PDYN\2‰ENDC‰IFNC†'\0\7','PD'.FP.WRD2�SET‡$1000+.FP.\0+\2‰ENDC ‰IFC‡'\4','D'Œ..�Dn�destination.FP.WRD1�SET‡$F040+\5‰LIST********�FMOVE.\0‚\1\2,\4\5‰DC.W†.FP.WRD1,.FP.WRD2‰NOLIST‰ENDC %‰IFC‡'\4','A'Œ..�disp(An)�destination!‰IFC‡'\6',''�....�no�displacement.FP.WRD1�SET‡$8 F050+\5‰LIST‰IFC‡'\0\7','PD'"********�FMOVE.\0‚\1\2,(\4\5),\7\8‰ENDC‰IFNC†'\0\7','PD'********�FMOVE.\0‚\1\2,(\4\5)‰ENDC‰DC.W†.FP.WRD1,.FP.WRD2‰NOLIST‰ENDC‰IFNC†'\6',''�....�displacement.FP.WRD1�SET‡$F068+\5‰LIST********�FMOVE.\0‚\1\2,\6(\4\5)‰DC.W†.FP.WRD1,.FP.WRD2,\6‰NOLIST‰ENDC‰ENDC >‰ENDC†...................�move�from�FP�to�memory�.............  >‰IFC‡'\1','S'‚.........�move�from�Spec�FP�Reg�to�memory�...... ‰IFC‡'\4','#'Œ..�not�implemented ‰FAIL†999‰ENDC .FP.WRD2�SET‡$3000+\2 ‰IFC‡'\4','D'Œ..�Dn�destination.FP.WRD1�SET‡$F040+\5‰LIST********�FMOVE.\0‚\2,\4\5‰DC.W†.FP.WRD1,.FP.WRD2‰NOLIST‰ENDC %‰IFC‡'\4','A'Œ..�disp(An)�destination!‰IFC‡'\6',''�....�not�implemented ‰FAIL†999‰ENDC‰IFNC†'\6',''�....�displacement.FP.WRD1�SET‡$F068+\5‰LIST********�FMOVE.\0‚\2,\6(\4\5)‰DC.W†.FP.WRD1,.FP.WRD2,\6‰NOLIST‰ENDC‰ENDC @‰ENDC†...................�move�from�Spec�FP�Reg�to�memory�...... ‰ENDC‰ENDC ‰LIST‰SPC‡1‰ENDM   FMOVEEƒMACRO‰LIST ‰BSR‡.PFPOINT‰NOLIST!‰FMOVE.\0‚\1,\2,\3,\4,\5,\6,\7,\8‰ENDM  ‰PAGE FADD…MACRO‰NOLIST‰IFNC†'\1\4','DFP'4‰FAIL†999‡must�be:ƒFADD�Dn,FPn�...�\1,\2,\3,\4,\5,\6‰ENDC‰IFC‡'\1\4','DFP'.FP.WRD1�SET‡$F040+\2.FP.WRD2�SET‡$6000+.FP.\0+\5‰LIST********�FADD.\0ƒ\1\2,\4\5‰DC.W†.FP.WRD1,.FP.WRD2‰ENDC‰SPC‡1‰ENDM   FADDE„MACRO‰LIST ‰BSR‡.PFPOINT‰NOLIST‰FADD.\0ƒ\1,\2,\3,\4,\5,\6‰ENDM   FMUL…MACRO‰NOLIST‰IFNC†'\1\4','FPFP'5‰FAIL†999‡must�be:‚FMUL�FPn,FPn�...�\1,\2,\3,\4,\5,\6‰ENDC‰IFC‡'\1\4','FPFP'.FP.WRD1�SET‡$F000+\2 ‰IFC‡'\0',''0.FP.WRD2�SET‡$6080+\5Œdefault�is�"S",�not�"W"�!!‰ENDC ‰IFNC†'\0',''.FP.WRD2�SET‡$6080+.FP.\0+\5‰ENDC‰LIST********�FMUL.\0ƒ\1\2,\4\5‰DC.W†.FP.WRD1,.FP.WRD2‰ENDC‰SPC‡1‰ENDM   FMULE„MACRO‰LIST ‰BSR‡.PFPOINT‰NOLIST‰FMUL.\0ƒ\1,\2,\3,\4,\5,\6‰ENDM   FCMP…MACRO‰NOLIST‰IFNC†'\1\4','#FP'4‰FAIL†999‡must�be:‚FCMP�#n,FPn�...�\1,\2,\3,\4,\5,\6‰ENDC‰IFC‡'\1\4','#FP'.FP.WRD1�SET‡$F07C.FP.WRD2�SET‡$6140+.FP.\0+\5‰LIST********�FCMP.\0ƒ\1\2,\4\5‰DC.W†.FP.WRD1,.FP.WRD2 ‰IFC‡'\0','L'‰DC.L†\2‰ENDC‰IFNC†'\0','L'‰DC.W†\2‰ENDC‰ENDC‰SPC‡1‰ENDM   FCMPE„MACRO‰LIST ‰BSR‡.PFPOINT‰NOLIST‰FCMP.\0ƒ\1,\2,\3,\4,\5,\6‰ENDM   FSLT…MACRO‰NOLIST‰IFNC†'\1','D'‰FAIL†999‘must�be:ƒFSLT�Dn‰ENDC ‰IFC‡'\1','D'.FP.WRD1�SET‡$F040+\2.FP.WRD2�SET‡$A0C0‰LIST********�FSLT.\0ƒ\1\2‰DC.W†.FP.WRD1,.FP.WRD2‰ENDC‰SPC‡1‰ENDM   FSLTE„MACRO‰LIST ‰BSR‡.PFPOINT‰NOLIST‰FSLT.\0ƒ\1,\2‰ENDM ‰PAGEééé6†TTL†68K�PASCAL�MACRO�DEFINITIONS�FOR�RUNTIME�ROUTINES*<*Ž**********************************************************7*Ž*�MACRO�DEFINITIONS�FOR�68K�PASCAL�RUNTIME�ROUTINES†*<*Ž***********************************************************F…MACRO'‰BSRƒ.PFPOINTŠ!�CALL�THE�TRAP�SIMULATOR ‰IFNC‚'\1','' ŒIFNC‚'\2','' �IFNC‚'\3',''3’F\0ƒ\1,\2,\3�!�THREE�ARGUMENT�FLOATING�INSTRUCTION�ENDC �IFCƒ'\3',''.’F\0ƒ\1,\2„!�TWO�ARGUMENT�FLOATING�INSTRUCTION�ENDCŒENDC ŒIFCƒ'\2',''*�F\0ƒ\1Š!�9 ONE�AGUMENT�FLOATING�INSTRUCTIONŒENDC‰ENDC ‰IFCƒ'\1',''-ŒF\0’!�FLOATING�INSTRUCTION�WITH�NO�ARGUMENTS‰ENDC†ENDM**…CALL�PROCEDURE�MACRO* CALL‚MACRO‰BSRƒ\1�!�ARGUMENTS�ARE�\2†ENDM**…PROCEDURE�ENTRY�MACRO*PROCEDUREƒMACRO**ŽARGUMENTS�ARE�\2*"�DS.W…0ˆ!�ALIGN�ON�A�WORD�BOUNDARY\1�EQU†*ˆ!�PUT�ENTRY�POINT�HEREŒENDM**…PROCEDURE�EXIT�MACRO*END_PROC„MACRO �RTS†!�RETURN�TO�WHO�EVER�CALLEDŒENDM*1*…MACRO�FOR�ROUNDING�A�VALUE�UP�TO�AN�EVEN�NUMBER* EVENˆMACRO�ADDQ.\0‚#1,\1�ANDI.\0‚#-2,\1ŒENDM*@*…MACRO�FOR�CONVERTING�A�CHARACTER�STORED�IN�A�BYTE�TO�UPPERCASE*UPPERCASEƒMACRO,�IF.B�\1��#'a'�AND.B�\1��#'z'�THEN.S’SUBI.Bƒ#'a'-'A',\1�ENDIŒENDM*&*…MACRO�FOR�WRITING�A�SINGLE�CHARACTER*WRITE_CHAR‚MACRO�MOVE.Bƒ\1,(A1)�CALL….PIWPTR,ŒENDM*!*…MACRO�FOR�READING�A�SINGLE�CHAR*GET_CHAR„MACRO�CALL�.PIRPTR,ƒ\1�CALL�.PGETCH, �UPPERCASE�D0ŒENDM*=*…MACRO�FOR�GENERATING�A�RUNTIME�ERROR�FROM�A�RUNTIME�ROUTINE* ERROR‡MACRO&�MOVEQ„#\1,D0ƒ!�PUT�ERROR�NUMBER�IN�D0�TRAP…#14†!�DO�A�TRAP�14...)�DC.W…0ˆ!�...�FOLLOWED�BY�A�WORD�OF�ZEROSŒENDM*éV‰TTL…68K�PASCAL�SYMBOL�EQUATES* **********0*ˆPASCAL�RUNTIME�ROUTINES�EQUATE,�AND�MACRO�FILE* ***********œGLOBAL�EQUATES* ***********ˆVARIABLE�OFFSETS* **********1FDP†EQU…4‹*�4�=�OFFSET�TO�FILE�DESCRIPTOR�POINTER1PFS†EQU…4‹*�4�=�OFFSET�TO�PASCAL�FILE�STATUS�WORD-CSZ†EQU…6‹*�6�=�OFFSET�TO�COMPONENT�SIZE�WORD1BCD†EQU…6‹*�6�=�OFFSET�TO�BCD�BUFFER�IN�REAL�READ3HPTR…EQU…4‹*�4�=�OFFSET�TO�HEAP�PTR�IN�RT�MAINTENCE6CCDR…EQU…52Š*�52�=�OFFSET�TO�CHAIN�CMD�DIAG�REG�IN�RMA3SBP†EQU…20Š*�20�=�OFFSET�TO�START�OF�BUFFER�POINTER1EBP†EQU…24Š*�24�=�OFFSET�TO�END�OF�BUFFER�POINTER7BUF†EQU…32Š*�32�=�BUFFER�ZONE�SIZE�FOR�STACK�ALOCATIONS7A5OFFSET�EQU…52Š*�OFFSET�TO�A5�REG�IN�FP�USER�REG�BLOCK2LOWHEAP‚EQU…368‰*�OFFSET�TO�LOWEST�ADDRESS�IN�HEAP* ***********ˆSYMBOLIC�CONSTANTS* **********9RR$ERRƒEQU…0‹*�0�=�#�After�Trap�14�means�RR�routine�error1FP$ERRƒEQU…1‹*�1�=�#�After�Trap�14�means�Fp�error7FHSIOSƒEQU…2‹*�2�=�#�AFTER�TRAP�14�WHICH�MEANS�FHS/IOS„6INLNRTƒEQU…3‹*�3�=�#�AFTER�TRAP�14�WHICH�MEANS�IN�LINE*7ABORT„EQU…14Š*�14�=�EXEC�PARAM�FOR�ABNORMAL�TERMINATION4TERM…EQU…15Š*�15�=�EXEC�PARAM�FOR�NORMAL�TERMINATION'FORM…EQU…12Š*�12�=�ASCII�FORM�FEED�CODE(SPC†EQU…$20‰*�$20�=�ASCII�SPACE�CODE�'�'-NEG†EQU…$2D‰*�$2D�=�ASCII�MINUS�SIGN�CODE�'-'-PLUS…EQU…$2B‰*�$2B�=�ASCII�PLUS‚SIGN�CODE�'+''ZERO…EQU…$30‰*�$30�=�ASCII�CODE�FOR�'0''NINE…EQU…$39‰*�$39�=�ASCII�CODE�FOR�'9'$AˆEQU…$41‰*�$41�=�ASCII�CODE�FOR�'A'$EˆEQU…$45‰*�$45�=�ASCII�CODE�FOR�'E'$IˆEQU…$49‰*�$49�=�ASCII�CODE�FOR�'I'$NˆEQU…$4E‰*�$4E�=�ASCII�CODE�FOR�'N'$TˆEQU…$54‰*�$54�=�ASCII�CODE�FOR�'T'$ZˆEQU…$5A‰*�$5A�=�ASCII�CODE�FOR�'Z'=MINUS_INFƒEQU‚$B0‰*�$B0�=�SIGN�OF�EXPONENT�FOR�MINUS�INFINITY;PLUS_INF„EQU‚$A0‰*�$A0�=�SIGN�OF�EXPONENT�FOR�PLUS�INFINITY3NAN_SIGN„EQU‚$C0‰*�$C0�=�SIGN�OF�EXPONENT�FOR�A�NANANAN_WIDTHƒEQU‚16Š*�16�=�NUM�COLUMN�POSITION�NEEDED�TO�WRITE�A�NAN;OVRHD‡EQU‚4‹*�4�=�NUMBER�OF�OVERHEAD�DIGITS�IN�A�REAL�WRITE:(309 9MAXRODIG„EQU‚17Š*�17�=�MAX�NUM�DIGITS�CONVERTED�ON�OUTPUT@MAXRIDIG„EQU‚19Š*�19�=�MAX�NUM�DIGITS�CONVERTED�ON�INPUT�OF�REAL?MAXIIDIG„EQU‚34Š*�34�=�MAX�NUM�DIGITS�CONVERTED�ON�INPUT�OF�INTBCLRRNDMODE‚EQU‚$FCFF‡*�$FCFF�=�MASK�TO�CLEAR�ROUNDING�MODE�TO�ZEROFRNDTOZEROƒEQU‚$0100‡*�$0100�=�MASK�TO�SET�ROUNDING�MODE�TO�RND�TO�ZERO=INITSTATUS‚EQU‚0‹*�0�=�VALUE�TO�INIT�68341�STATUS�REGISTER�TO;INITCNTRLƒEQU‚0‹*�0�=�VALUE�TO�INIT�68341�CNTRL�REGISTER�TO8MAXRNDPREC‚EQU‚2‹*�2�=�MAX�VALUE�OF�ROUNDING�PREC.�FIELD1MAXCLOSURE‚EQU‚1‹*�1�=�MAX�VALUE�OF�CLOSURE�FIELD@MAXNORMMODE�EQU‚1‹*�1�=�MAX�VALUE�OF�THE�NORMAIZATION�MODE�FIELD;MAXRNDMODE‚EQU‚3‹*�3�=�MAX�VALUE�OF�THE�ROUNDING�MODE�FIELD1MAXPOSEXPƒEQU‚4931ˆ*�4931�=�MAX�POSITIVE�EXPONENT1MAXNEGEXPƒEQU‚4952ˆ*�4952�=�MAX�NEGATIVE�EXPONENT=�THE�CUR�BASE�WAS�FOUNDAREADOVF‚EQU…$64‰*�$64�=�OVERFLOW�OCCURED�WHILE�READING�AN�INTEGER4BADNANƒEQU…$70‰*�$70�=�BAD�MANTISA�IN�NAN�GENERATION* *ˆBUFFER�BLOCK�OFFSETS�AND�SIZES* ŒOFFSETƒ0UNPACKED„DS.B…20PACKED†DS.B…14BCDBUFSIZE‚DS.W…0CHARBUFSIZE�DS.W…0* ŒOFFSETƒ0 SIGNS‡DS.B…1AFTER_DP„DS.B…1EXPONENT„DS.W…1BCDDIGITSƒDS.B…64NAN_VALUEƒDS.B…4‹!�THIS�FIELD�ALSO�PART�OF�BCDDIGITSENDPACKEDƒDS.W…0* ŒOFFSETƒ$1748ERRADR†DS.L…1Š*�$174�=�OFFSET�TO�ERROR�ADDRESS�SAVE�AREA9ERRNUM†DS.L…1Š*�ERRNMR�=�OFFSET�TO�ERROR�NUMBER�SAVE�AREA8REGSˆDS.L…1Š*�REGS�=OFFSET�FROM�A5�TO�REGISTER�SAVE�AREA*éééé: A*********BEGINNING RR.VDOSVM.SA**********************************‰NOLIST*7*ˆEQUATES�TO�SET�PASCAL�COMPILER�OPERATING�ENVIRONMENT.**ˆTHE�EQUATE�WHOSE�VALUE�IS�0�IS�SELECTED.**ˆCOPYRIGHT�1982�MOTOROLA,�INC.**ˆVERSION�2.01�:�04-19-82**ˆ04-19-82�:�DAVE�STANDAGE*A*****************************************************************‰LIST1VDOSEXƒEQU‡1‰!�!�NO!�!�!�VERSADOS�ON�THE�EXORMACS4VDOSVMƒEQU‡0‰!�!�YES�!�!�VERSADOS�ON�THE�VERSAMODULE1RMSVM„EQU‡1‰!�!�NO!�!�!�RMS68KƒON�THE�VERSAMODULE A*********ENDING OF RR.VDOSVM.SA********************************** ééééé8…'RROM ASSIGNLUAFMMqqASSIGNLUSAVV WqqFINIT AFggqqFINIT SAppÖqqFPOINT AF‰‰qqFPOINT SA’’ÊqqINIT AF««qqINIT SA´´i�qqPFPOINT AF%%qqPFPOINT SA..qqPLJSR AF77qqPLJSR SA@@qqASSIGNLUROIIqqFINIT RORRqqFPOINT RO[[qqINIT ROddqqPFPOINT ROmmqqPLJSR ROvvqqRLIBFP CF-qqRLIBFP LG„„ qq=/*=/*†RROM.ASSIGNLU.AF=/*C=/* Chain file to assemble the logical unit assignment/command line+=/* module for the PASCAL application task.=/*&=/*�Parameter�01†Output�listing/device4=/*“This�parameter�is�optional�and�will�be�defaulted=/*“if�not�specified.=/*=/IFC \1ƒ=ARG�RROM.ASSIGNLU.LS=/ENDIF=/*,=ASM RROM.ASSIGNLU.SA,RROM.ASSIGNLU.RO,\1;MR=/*{ Included files are:=/*ƒ--�none�--=/*}=/*=ENDé: éééééE**E*†The�relocatable�output�from�this�assembly�will�be�use�in�the�SYSGEN*†link.*G*†It�contains�a�MINIMUM�dummy�comand�line�which�can�be�modified�to�meetF*†the�user's�needs.�Typically�the�user�WILL�modify�the�command�line�toD*†assign�logical�units�5�and�6�when�a�requirement�for�terminal�usage *†exists.*E*†Normally�SESSION�CONTROL�would�assign�logical�units�5�and�6�for�theC*†task�being�invoked,�however�SESSION�CONTROL�does�not�exist�in�the*†ROM�based�system.**,*†If�the�user�had�the�following�PROGRAM�line**ˆPROGRAM�TASK(INPUT,OUTPUT);*?*�THEN�he�should�modify�the�command�line�to�assign�BOTH�logical*�units�five�(5)�and�six�(6):**’I=#CN00,O=#CN00;Z=1* *�HOWEVER*,*�If�the�user�had�the�following�PROGRAM�line**ˆPROGRAM�TASK(OUTPUT)*?*�THEN�he�should�modify�the�command�line�to�assign�ONLY�logical *�six�(6).* *’O=#CN00;Z=1*-*ˆwhere�terminal�CN00�was�arbitrarily�chosen.***E*ˆA�data�definition�to�create�the�MINIMUM�command�line�which�contains *ˆthe�'Z'�option�is�shown�below.*B*ˆThe�intent�of�this�comand�line�is�to�force�PASCAL�to�have�to�get*ˆa�new�dymamic�data�segment.*?*ˆThis�command�line�can�be�altered�to�suit�the�user's�needs�BUTF*ˆthe�'Z'�option�is�required.�The�value�of�the�'Z'�has�been�arbitrarlyH*ˆchosen.�If�the�user�does�not�have�a�need�for�additional�'Z'�space�thenC*ˆthe�'Z'�option�part�of�the�command�line�as�shown�will�accompolishH*ˆthe�desired�intent.�If�for�whatever�reason�the�user�determines�that�heB*ˆneeds�a�'Z'�value�larger�than�that�arbitrarly�chosen�then�he�canA*ˆchange�the�'Z'�option�accordingly.�Typically�the�user�will�haveC*ˆdebugged�his�PASCAL�task�prior�to�putting�it�in�rom�and�amount�of.*ˆ'Z'�space�will�have�already�been�determined.*A*ˆThe�user�will�note�that�a�buffer�space�of�hexadecimal�$9E�existB*ˆwith�the�unused�portion�being�set�to�NULL.�This�has�been�done�so?*ˆthat�the�user�can�patch�the�comand�line�if�necessary�prior�toN:W?*ˆburning�the�roms.�This�is�the�maximum�that�PASCAL�will�allow.** ‰SECTIONƒ9 ‰XDEF†CMDLINE‰XDEF†CMDLINEL* CR‡EQU‡$0DCMDLINBF�EQU‡$9E*CMDLINE: O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; >>>*@*ˆThe�following�line�is�all�that�needs�to�be�MODIFIED�to�reflect%*ˆthe�users�command�line�requirements*‰DC.B†';Z=1',CR *œThis�is�a�MINIMUM�command�line!*�The�'Z'�option�MUST�be�present.*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ‰DCB.B…(CMDLINBF-(*-CMDLINE)),0.*œFORCE�BALANCE�OF�COMAND�LINE�BUFFER�TO�NULLSCMDLINEL�DC.W†CMDLINBF*œFORCED�COMMAND�LINE�LENGTH‰ENDééééé=/*=/*†RROM.FINIT.AF=/*F=/* This file was originally called FPSRR.FINIT.SA but it was modified>=/* to accomodate the PASCAL ROM capability, and is now called=/* RROM.FINIT.SA=/*=/IFC \1ƒ=ARG�RROM.FINIT.LS=/ENDIF=/*(=ASM RROM.FINIT.SA,RROM.FINIT.RO,\1;Z=64=/*{ Included files are:=/*ƒRR.RTEQU.SA=/*ƒRR.MACROS.SA=/*ƒRR.FPMACRO.SA=/*}=/*=ENDéééééé_; ?†TTL‰V�2.00�68K�PASCAL�FLOATING�POINT�INITIALIZATION�SUBROUTINE‰NOLIST‰INCLUDEƒRR.RTEQU.SA‰INCLUDEƒRR.MACROS.SA‰INCLUDEƒRR.FPMACRO.SA‰LIST*$*ˆFILE�RR.RTEQU.SA�HAS�BEEN�INCLUDED%*ˆFILE�RR.MACROS.SA�HAS�BEEN�INCLUDED&*ˆFILE�RR.FPMACRO.SA�HAS�BEEN�INCLUDED* †NOFORMATCFINIT�IDNT‚2,00‚68K�PASCAL�FLOATING�POINT�INITIALIZATION�SUBROUTINE †SECTION…8********E*….PFINIT�--‚INITIALIZE�THE�FLOATINT�POINT�PROCESSOR,�AND�THE�DEFAULT*‘EXCEPTION�HANDLER�ADDRESSES**…ENTRY:!*ˆA5�=‚POINTER�TO�THE�PASCAL�RMA.**…EXIT:!*ˆA5�=‚POINTER�TO�THE�PASCAL�RMA.**…USES:*ˆ.‚==�NOT�TOUCHED*ˆ*‚==�USED�AND�DESTROYED*ˆP‚==�USED�BUT�PRESERVED*ˆR‚==�RETURNED1*ˆA‚==�RETURNED�ADJUSTED�(LIKE�THE�STACK�POINTER)*ˆ-‚==�NOT�APPLICABLE*%*‹0�1�2�3�4�5�6�7�CNTRL�STATUS�INSTAD*ˆD:�P�.�.�.�.�.�.�.ƒ-…-…-*ˆA:�P�P�.�.�.�.�.�Aƒ-…-…-*‡FP:�.�.�.�.�-�-�-�-ƒR…R….* *…FUNCTION:<*‹THE�FUNCTION�OF�THIS�ROUTINE�IS�TO�INITIALIZE�THE�FLOATINGA*ˆPOINT�PROCESSOR�AND�SET�UP�THE�DEFAULT�TRAP�HANDLER�FOR�ALL�THE*ˆFLOATING�POINT�EXCEPTIONS.* *…EXTERNALS:*C*ˆ.PFINIT‚=‚DEF,�THE�ENTRY�POINT�TO�THE�FLOATING�POINT�INIT�ROUTINEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*?*ˆ.PFLOATP�=‚DEF,�DOUBLY-DEFINED�LABEL�WITH�FAST�FLOATING�POINT*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<**4*ˆ.PFPOINT�=‚REF,�THE�F-LINE�TRAP�SIMULATING�ROUTINE********B†XDEF‚.PFINIT…!�THE�ENTRY�POINT�TO�THE�FLOATING�POINT�INIT�ROUTINEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*?*…XDEF‚.PFLOATP„!�DOUBLY-DEFINED�LABEL�WITH�FAST�FLOATING�POINT*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*3†XREF‚.PFPOINT„!�THE�F-LINE�TRAP�SIMULATING�ROUTINE*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>**.PFLOATP�EQU‡**hGqPy@O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<**6*….PFINIT�--�THE�FLOATING�POINT�INITIALIZATION�ROUTINE*!ƒPROCEDURE�.PFINIT,*,*…SAVE�THE�REGISTERS�USED�AS�LOCAL�VARIABLES*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>**…MOVEM.L‚D0/A0/A1,-(A7)*D*ˆThe�following�instructions�were�graciously�supplied�by�Dave�Mosley* ‰MOVE.L„A7,A6 ‰SUB.L…#58,A7 ‰MOVE.L„A7,A5‰MOVE.W„#RMASIZE+8,D0MLOOP:‰MOVE.W„(A6)+,(A5)+ ‰SUBQ.W„#2,D0 ‰BNE.S…MLOOP ‰LEA‡8(A7),A5 ‰MOVE.L„A5,A6*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*6*…INITIALIZE�THE�FLOATING�POINT�EXCEPTION�VECTOR�TABLE*C†MOVEQ„#NUMEXCEPTIONS,D0�!�D0�=�NUMBER�OF�EXCEPTION�VECTORS�TO�INIT5†MOVE.LƒLOWHEAP(A5),A0„!�A0�=�THE�LOWEST�HEAP�ADDRESSA†LEA†EXCEPTION_HANDLER(PC),A1ƒ!�A1�=�ADDRESS�OF�EXCEPTION�ROUTINE*F*…FILL�ALL�EXCEPTION�VECTORS�WITH�THE�ADDRESS�OF�THE�DEFAULT�EXCEPTION *…HANDLER*†REPEAT'‰MOVE.LƒA1,(A0)+‡!�FILL�WITH�AN�ADDRESS0‰SUBQ.Wƒ#1,D0Š!�DECREMENT�EXCEPTION�VECTOR�COUNT5†UNTIL�‘!�LOOP�UNTIL�ALL�EXCEPTION�VECTORS�FILLED**…SAVE�NEW�LOWEST�HEAP�ADDRESS*†MOVE.LƒA0,LOWHEAP(A5)*%*…BUILD�A�NEW�FREE�LIST�HEADER�RECORD* †MOVEQ„#-1,D0†MOVE.LƒD0,(A0)+ †MOVEQ„#0,D0†MOVE.LƒD0,(A0)+*"*…SAVE�THE�NEW�TOP�OF�HEAP�POINTER*†MOVE.LƒA0,HPTR(A5)*:*…INITIALIZE�THE�FLOATING�POINT�STATUS�AND�CNTRL�REGISTERS*†MOVE.Wƒ#INITSTATUS,D0†FMOVEEƒD,0,,S,STATUS†MOVE.Wƒ#INITCNTRL,D0†FMOVEEƒD,0,,S,CNTRL*4*…RETURN�TO�THE�ISLAND�IN�THE�COMMON�SECTION�'FINIT'*†MOVEM.L‚(A7)+,D0/A0/A1 ƒEND_PROCƒPAGE*;*‚EXCEPTION_HANDLER�IS�THE�DEFAULT�FLOATING�POINT�EXCEPTION *‚HANDLER.*'*Ž****< *********************************%*Ž*‚NOTE:�THIS�VERSION�IS�ONLY�GOOD‚*%*Ž*‚FOR�THE�SOFTWARE�IMPLEMENTATION‚*%*Ž*‚OF�THE�FLOATING�POINT�PROCESSOR‚*'*Ž***************************************‚ARGUMENTS�ARE:%*…A5‡=‚POINTER�TO�THE�USERS�REGISTERS.*…STATUSƒ=‚THE�FLOATING�POINT�ERROR�INDICATORS=*…INSTADƒ=‚THE�ADDRESS�OF�THE�FLOATING�POINT�INSTRUCTION�THAT*‘CAUSED�THE�ERROR*/ƒPROCEDURE�EXCEPTION_HANDLER,*0*…PUSH�THE�FLOATING�POINT�PROCESSORS�A5�REGISTER*D***************************TEMP PATCH*******************************D*************THIS PATCH COMPENSATES FOR A BUG IN THE FP SOFTWARE****D********************************************************************3‰CLR.B‚3(A3)ˆCLEAR�TEMPSTAT�SO�WE�DON'T�ABORT�AGAIND**************************PATCH END*********************************D********************************************************************†MOVE.LƒA5,-(A7)*F*…LOAD�THE�PASCAL�PROGRAMS�A5�REGISTER�BACK�INTO�A5�(THE�RMA�POINTER).*†MOVE.LƒA5OFFSET(A5),A5*A*…SAVE�THE�REGISTER�CONTENTS�NOW�THAT�THE�RMA�POINTER�IS�RESTORED*†MOVEM.L‚D0-D7/A0-A7,REGS(A5)*9*…CHANGE�THE�SAVED�A5�TO�THE�FLOATING�POINT�PROCESSORS�A5*†MOVE.Lƒ(A7)+,REGS+52(A5)**…SAVE�THE�ERROR�ADDRESS*†FMOVEEƒS,INSTAD,,A,5,ERRADR**…BUILD�THE�ERROR�NUMBER�IN�D0.*†FMOVEEƒS,STATUS,,D,0†ROR.W„#8,D0�!�SWAP�BYTES2†LSR.B„#2,D0�!�MOVE�IOP�CODE�TO�THE�RIGHT�TWO�BITS"†ANDI.Bƒ#$F,D0Œ!�CLEAR�HIGH�NIBBLE1†ORI.B„#$20,D0‹!�SET�ERROR�KIND�TO�FLOATING�POINT†ROR.W„#8,D0�!�SWAP�BYTES�BACK0†MOVE.WƒD0,A0�!�A0�=�FLOATING�POINT�ERROR�NUMBER**…DO�AN�OPERATING�SYSTEM�ABORT*†TRAP…#14�!�DO�AN�EXEC�CALL)†DC.W…FP$ERRŒ!�FOR�A�FLOATING�POINT�ERROR* *‚END_PROCƒPAGE*$*Ž**********************************"*Ž*�THE�FOLLOWING�IS�THE�SPECIALƒ**Ž*�COMMON�SECTION�NEEDED�SO‡*#*Ž*�FLOATING�POINT�IS�ONLY�NEEDED‚*"*Ž*�AND�BROUGHT�IN�WHEN�THE�USERƒ*$*Ž*�REQUESTS�IT�BY�DOING�A�FLOATING**Ž*�POINT�OPERATION.�*$*Ž***********************************-FINIT�SECTION…8…!�COMMON�SECTION�CALLED�FINIT†CALL�.PFINIT,†RTS†END=/*=/*†RROM.FPOINT.AF=/*G=/* This file was originally called FPSRR.FPOINT.SA but it was modified>=/* to accomodate the PASCAL rom capability, and is now called=/* RROM.FPOINT.SA=/*=/IFC \1ƒ=ARG�RROM.FPOINT.LS=/ENDIF=/**=ASM RROM.FPOINT.SA,RROM.FPOINT.RO,\1;Z=64=/*{ Included files are:=/*ƒRR.RTEQU.SA=/*ƒRR.MACROS.SA=/*}=/*=ENDééééé< é�‰NOLIST‰INCLUDEƒRR.RTEQU.SA‰INCLUDEƒRR.MACROS.SA‰LIST ‰NOFORMAT*$*ˆFILE�RR.RTEQU.SA�HAS�BEEN�INCLUDED%*ˆFILE�RR.MACROS.SA�HAS�BEEN�INCLUDED*F‰TTL‚V�2.01�68K�PASCAL�FLOATING�POINT�F-LINE�TRAP�SIMULATOR�SUBROUTINEKFPOINTƒIDNT‚2,01‚68K�PASCAL�FLOATING�POINT�F-LINE�TRAP�SIMULATOR�SUBROUTINE*Ì!* ‰SECTION…8********D*….PFPOINT�--�THE�68K�PASCAL�TO�FLOATING�POINT�F-LINE�TRAP�SIMULATOR**…ENTRY:&*ˆALL�REGISTERS�=�68K�PASCAL�REGISTERS**ˆ(A7)Š=�POINTER�TO�THE�F-LINE�INSTRUCTION**…EXIT:D*ˆALL�REGISTERS�=�68K�PASCAL�REGISTERS,�POSSIBLY�MODIFIED�DUE�TO�THE)*˜RESULT�OF�THE�FLOATING�POINT�OPERATION.**…USES:2*ˆALL�REGISTERS�HAVE�THE�POSSIBLITY�OF�BEING�USED.* *…FUNCTION:7*‹THIS�ROUTINE�SIMULATES�AN�F-LINE�TRAP�THAT�WAS�CAUSED>*ˆBY�EXECUTING�A�F-LINE�INSTRUCTION.‚THIS�ROUTINE�WAS�SUPPLIEDA*ˆTO�CUT�DOWN�THE�TIME�REQUIRED�TO�DO�A�FLOATING�POINT�OPERATION.* *…EXTERNALS:*>*ˆ.PFPOINT�=‚DEF,�THE�ENTRY�POINT�TO�THE�F-LINE�TRAP�SIMULATOR*E*ˆ.P68341P�=‚REF,�THE�MAJOR�ENTRY�POINT�OF�THE�FLOATING�POINT�PACKAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*1*ˆ.PZMAIN‚=‚REF,�THE�PASCAL�PROGRAM�STACK�SEGMENT*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<********=†XDEF….PFPOINT�!�THE�ENTRY�POINT�TO�THE�F-LINE�TRAP�SIMULATOR*B†XREF….P68341P�!�THE�MAJOR�ENTRY�POINT�OF�THE�FLOATING�PT.�PACKAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*1*…XREF….PZMAIN‚!�THE�PASCAL�PROGRAM�STACK�SEGMENT*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*;*….PFPOINT�--�THE�F-LINE�TRAP�SIMULATOR�FOR�PASCAL�PROGRAMS*ƒPROCEDURE�.PFPOINT,*$*…FIRST�OFF�SAVE�THE�STATUS�REGISTER* †CLR.W„-(A7)�!CLEAR�SPOT�FOR�CCR"†MOVE.LƒD0,-(A7)�!PUSH�D0�ON�STACK!†SF‡D0“!CLR.B�D0�W/O�CHANGING�CCR%†BNE.S„CCZ’!CHECK�Z�BIT,BRANCH�IF�CLR%†BSET…#6,D0�!SET�BIT�6�TO�1�FOR�Z�BIT(CCZƒBCC.S„CCC’!CHECK�C�BIT,BRANCH�IF�CLRŠE“C›C%†BSET…#4,D0�!SET�BIT�4�TO�1�FOR�C�BIT(CCCƒBVC.S„CCV’!CHECK�V�BIT,BRANCH�IF�CLR%†BSET…#5,D0�!SET�BIT�5�TO�1�FOR�V�BIT(CCVƒBPL.S„CCN’!CHECK�N�BIT,BRANCH�IF�CLR%†BSET…#7,D0�!SET�BIT�7�TO�1�FOR�N�BIT!CCNƒROXR.Bƒ#4,D0�!ROTATE�X�BIT�IN †AND.W„#$1F,D0Ž!CLEAR�UPPER�BYTE#†MOVE.WƒD0,4(A7)�!SAVE�CCR�ON�STACK&†MOVE.Lƒ(A7)+,D0�!RESTORE�OLD�D0�VALUE*D*…CHECK�TO�SEE�IF�THERE�IS�ENOUGH�ROOM�ON�THE�STACK�TO�DO�A�FLOATING0*…POINT�OPERATION�WITHOUT�OVER-RUNNING�THE�HEAP.*†LEA†-FPSTACK(A7),A7†CMP.L„HPTR(A5),A7†LEA†FPSTACK(A7),A7**…IF�NO�MORE�ROOM�THEN�ERROR*†IF��THEN.S‰ERROR�STKHEAP†ENDI*/*…NOW�SAVE�ALL�OF�THE�PASCAL�PROGRAMS�REGISTERS*†MOVEM.L‚D0-D7/A0-A7,-(A7)*C*…MODIFY�THE�SAVED�VALUE�OF�THE�STACK�POINTER�SO�IT�POINTS�TO�WHERE<*…THE�TOP�OF�THE�STACK�WAS�WHEN�THE�JSR�TO�.PFPOINT�WAS�DONE!*…(I.E.�BELOW�THE�RETURN�ADDRESS)*†ADDQ.Lƒ#6,60(A7)*A*…SET�UP�THE�VALUES�NEEDED�BY�THE�FLOATING�POINT�PROCESSOR�IN�THE*…PROPPER�REGISTERS.*A†LEA†USER_MEM(PC),A4ƒ!�A4�=�A�POINTER�TO�THE�USER�MEMORY�TRANSFERO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*E*…MOVE.Lƒ#FPREGS-.PZMAIN+RMASIZE,D0�!�D0�=�OFFSET�FROM�A5�TO�FP�REGS.5†MOVE.Lƒ#RMASIZE,D0‡!�D0�=�OFFSET�FROM�A5�TO�FP�= REGS.*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=†LEA†0(A5,D0.L),A3…!�A3�=�A�POINTER�TO�THE�FP.�REGISTER�BLOCK?†MOVE.LƒLOWHEAP(A5),A1„!�A1�=�ADDRESS�OF�LOWEST�ADDRESS�IN�HEAP:†LEA†-28(A1),A1ˆ!�A1�=�A�POINTER�TO�EXCEPTION�VECTOR�TABLE3†MOVE.LƒA7,A5�!�A5�=�POINTER�TO�THE�USERS�REGISTERS*!*…CALL�THE�FLOATING�POINT�PACKAGE*†CALL‚.P68341P,*1*…RESTORE�ALL�THE�PASCAL�REGISTERS�EXCEPT�FOR�A7.*†MOVEM.L‚(A7)+,D0-D7/A0-A6*-*…POP�THE�OLD�A7�OFF�THE�STACK�AND�IGNORE�IT.* †ADDQ.Wƒ#4,A7**…RETURN�TO�THE�CALLING�ROUTINE*†MOVE.Wƒ(A7)+,CCR ƒEND_PROCƒPAGE*D*‚USER_MEM�--�THIS�ROUTINE�TRANSFERS�DATA�TO/FROM�THE�FLOATING�POINT7*‚PROCESSORS�MEMORY�AREAS�OUT�OF/IN�TO�THE�USERS�MEMORY*‚ARGUMENTS�ARE:,*…D6�=‚DATA�SPACE�OR�PROGRAM�SPACE�INDICATOR9*…D7�=‚COUNT�OF�BYTES�TO�TRANSFER�AND�DIRECTION�INDICATOR/*…A2�=‚POINTER�TO�F.P.�PROCESSORS�MEMORY�BUFFER&*…A3�=‚POINTER�TO�USERS�MEMORY�OPERAND*!ƒPROCEDURE�USER_MEM,*#*…CHECK�IF�IT�IS�A�FETCH�OR�A�STORE* †TST.W„D7†IF��THEN.S**ˆIT�IS�A�STORE*.‰NEG.W�D7‡!�NEGATE�BYTE�COUNT�TO�MAKE�POSITIVE1‰EXGƒA2,A3„!�SWAP�SOURCE�AND�DESTINATION�POINTERS†ENDI**…TRANSFER�THE�DATA**…IS�IT�A�ONE�BYTE�TRANSFER�?* †SUBQ.Wƒ#1,D7†IF��THEN.S**ˆYES,�SO�TRANSFER�THE�BYTE*‰MOVE.Bƒ(A3),(A2)†ELSE.S**ˆIT�IS�A�MULTI-BYTE�TRANSFER* ‰SUBQ.Wƒ#1,D7‰WHILE��DO.S)ŒMOVE.Lƒ(A3)+,(A2)+�!�TRANSFER�FOUR�BYTES,ŒSUBQ.Wƒ#4,D7‡!�DECREMENT�BYTE�COUNT�BY�FOUR‰ENDW*/*ˆIS�THERE�STILL�A�WORD�LEFT�TO�BE�TRANSFERED�?*‰IF��THEN.S**‹YES�SO�TRANSFER�THE�WORD*ŒMOVE.Wƒ(A3),(A2)‰ENDI†ENDI*(*…RETURN�TO�THE�FLOATING�POINT�PROCESSOR* ƒEND_PROCƒPAGE***Ž****************************************)*Ž*�DECLARE�THE�MEMORY�FOR�THE�FLOATING‚**Ž*�REGISTER�BLOCK.–***Ž*****************************************O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?*ˆSECTION‚15‡!�THE�REGISTER�BLOCK�IS�SECTION�15�(STACK�SECTION) ‰OFFSETƒ0O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<)FPREGSƒDS.W…29‡!�RESERVE�29�WORDS�FOR�IT.*ƒENDé=/*=/*†RROM.INIT.AF=/*F=/* This file was originally called UTILRR.INIT.SA but it was modified>=/* to accomodate the PASCAL rom capability, and is now called=/* RROM.INIT.SA=/*E=/* Chain file to assemble the rom version of the PASCAL initializer.=/*&=/*�Parameter�01†Output�listing/device4=/*“This�parameter�is�optional�and�will�be�defaulted=/*“if�not�specified=/*=/IFC \1ƒ=ARG�RROM.INIT.LS=/ENDIF=/*3=ASM RR.VDOSVM.SA/RROM.INIT.SA,RROM.INIT.RO,\1;Z=64=/*{ Included files are:=/*ƒRR.FIOEQU.SA=/*}=/*=ENDéé= éé飊NOLISTŠINCLUDE�RR.FIOEQU.SAŠLIST*%*ˆFILE�RR.FIOEQU.SA�HAS�BEEN�INCLUDED* ‰OPT�PCS,FRS'‰IFEQ„VDOSEXˆ!�FOR�VERSADOS�ON�EXORMACS5‰TTL…V�2.12�68K�PASCAL�INITIALIZE�RUNTIME�ENVIRONMENT8INIT…IDNT„2,12‚68K�PASCAL�INITIALIZE�RUNTIME�ENVIRONMENT‰ENDC’!*ž!*‰IFEQ„VDOSVMˆ!�FOR�VERSADOS�ON�VERSAMODULE7‰TTL…V�2.12�68K�PASCAL�RUNTIME�INIT�FOR�VDOS�ON�VM01/02:INIT…IDNT„2,12ƒ68K�PASCAL�RUNTIME�INIT�FOR�VDOS�ON�VM01/02‰ENDC’!*ž!,‰IFEQ„RMSVM‰!�FOR�RMS68K�ONLY�ON�VERSAMODULE>‰TTL…V�2.12�68K�PASCAL�RUNTIME�INIT�FOR�RMS68K�ONLY�ON�VM01/02AINIT…IDNT„2,12ƒ68K�PASCAL�RUNTIME�INIT�FOR�RMS68K�ONLY�ON�VM01/02‰ENDC’!O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ‰IFEQ†VDOSEX!*ˆEXORMACS�VERSION�OF�INITIALIZER‰ENDC ‰IFEQ†VDOSVM$*ˆVERSAMODULE�VERSION�OF�INITIALIZER‰ENDC ‰IFEQ†RMSVM0*ˆVERSAMODULE�RMS68K�ONLY�VERSION�OF�INITIALIZER‰ENDCO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* *ˆSECTION�8 ‰SECTION�9*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ** COPYRIGHT 1982 MOTOROLA, INC.** 1980-04-16 : JOHN KAUFMANN*-*�INIT�-�RUNTIME�DATA�INITIALIZATION.‚COMMAND%*ˆLINE�SCAN�IS�DETERMINED�BY�BIT�0�OF*ˆLOCATION�.PMAIN** LAST MODIFIED:1*ˆApril�19,�1982�by�Dave�Standage�-�Added�support3*ˆfor�VERSAdos�on�the�VM01�and�VM02,�and�for�RMS68K!*ˆplus�BIOS�on�the�VM01�and�VM02.*2*ˆ1982�Feb�08�by�John�Kaufmann�-�Corrected�problem3*ˆin�determining�size�of�current�stack-heap�segment/*ˆfor�comparison�with�z�option�request.‚Changed1*ˆmovement�of�rma�to�be�from�hi�to�lo�addrs�after*ˆadding�memory�via�z�option.*/*ˆ30�JULY�1981�BY�JOHN�KOEHRING�-�ADDED�SUPPORT-*ˆFOR�CHAIN�COMMAND�DIAGNOSTIC�REGISTER.‚CODE+*ˆREQUIRED�TO�ZERO�OUT�REGISTER�AT�START�OF *ˆEXECUTION.*%* MODIFIES REGISTERS: 0 1 2 3 4 5 6 7*“D�*�*�*�*�*�*�*�**“A�*�*�*�*�*�*�*�**¬EµH½BÅ1ÍDÕBÝEåCíMõMýFO J 9* ON ENTRY (UNDER VERSADOS FOR EXORMACS OR VM01 OR VM02):*ˆD0.L„LOADING�TASK�NAME*ˆD1.L„SESSION�NUMBER*ˆD2.L„DEFAULT�USER�VOLUME*ˆD3.L„DEFAULT�USER�NUMBER*ˆD4.L,D5.L�DEFAULT�CATALOG*ˆD6.W„COMMAND�LINE�LENGTH*ˆD7.L„BIT�MASK�OF�LUN'S�PASSED**ˆA1.L„DEFAULT�TERMINAL�ID*,* ON ENTRY (UNDER RMS68K FOR VM01 AND VM02):(*ˆ(ALL�REGISTERS�HAVE�UNKNOWN�CONTENTS.)* * ON EXIT (IN ALL ENVIRONMENTS):!*ˆA3.L„POINTS�TO�LONG�JSR�ROUTINE&*ˆA5.L„POINTS�TO�START�OF�RUNTIME�DATA&*ˆA6.L„POINTS�TO�START�OF�RUNTIME�DATA&*ˆA7.L„POINTS�TO�START�OF�RUNTIME�DATA* * EXTERNALS: ‰XDEF„.PINITO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰XDEF†ASIGNRET *ˆXDEF„.PLJSR ‰XREF†CMDLINE‰XREF†CMDLINEL ‰XREF„.P> LJSR‰XREF„.PZSTARTO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</‰XREF„.PMAIN,.PZMAIN,.PVTRAPD,.PVTRAPE,.PVBUSER‰XREF„.PSYMBUG0‰XREF„.PADDRER,.PVZDIV,.PVCHKI,.PVTRAPV,.POPTION*'‰IFNE„VDOSEXˆ!�NOT�VERSADOS�ON�EXORMACS** REFERENCE TO SYMBOL TO MARK THE START OF)* THE PASCAL DATA SEGMENT (IN SECTION 15)*ž!O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>**ˆXREF„.PZSTART†!*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰ENDC’!*ž!*ž!******8* REFERENCE TO MAKE SURE THAT THE ALLOCATE STACK ROUTINE6*�IS�LOADED�SINCE�INIT�WILL�ALWAYS�BE�LOADED.‚ALSTS�IS* NOT USED IN INIT.* ‰XREF„.PALSTS‰PAGE* ‰OPT…MEX‹!�SHOW�MACRO�EXPANSIONS*#* RECEIVE SEGMENT ATTRIBUTES MACRO.* \1 = SEGMENT NAME.=* (0 IN EXORMACS CASE WHERE CODE AND DATA SEGS ARE ADJACENT.)-* \2 = OFFSET INTO RMA TO PUT PARAMETER BLOCK$DORCVSA‚MACRO‘!�RECEIVE�SEGMENT�INFO9*�BEGIN‚DORCVSA�MACRO�***********************************:* USES A5. MODIFIES A0,D0,A1. ****************************%‰LEA…\2(A5),A0…!�RECEIVE�SEGMENT�INFO ‰CLR.Lƒ(A0)Š!‰CLR.LƒSEGSES(A0)„!*ž!‰IFC…'\1','0'†!‰MOVE.W‚#SGOPLA,SEGOPT(A0)‰CLR.WƒSEGATT(A0)„!3‰CLR.LƒSEGNAM(A0)„!�NO�SEGMENT�NAME,�STORE�BINARY�0‰ENDC’!‰IFNC„'\1','0'†!‰CLR.WƒSEGOPT(A0)„!‰CLR.WƒSEGATT(A0)„!1‰MOVE.L‚#'\1',SEGNAM(A0)�!�STORE�THE�SEGMENT�NAME‰ENDC’!*ž!‰CLR.LƒSEGLEN(A0)„!‰LEA…SEGPTR+4(A0),A1�!‰MOVE.L‚A1,SEGPTR(A0)�!‰MOVE.L‚A0,SEGLAD(A0)�!‰MOVE.L‚#RCVSA,D0…! ‰TRAP„#1Œ!:* END OF DORCVSA MACRO ***********************************‰ENDM’!*?*�GET�A�SEGMENT�FROM�RMS68K.‚NAME�AND�SEG�LENGTH�ARE�ARGUMENTS.A* IF NAME IS '0', SEGMENT IS ALLOCATED NEXT TO EXISTING DATA SEG.DOGTSEG‚MACRO‘!9*�BEGIN‚DOGTSEG�MACRO�***********************************?*�A0�AND�D0�ARE�MODIFIED.‚D1�MAY�BE�MODIFIED.‚\2�(LEN)�IS�USED.*‰LEA…DL0(A5),A0„!�ALLOCATE�ANOTHER�SEGMENT2‰MOVE.L‚\2,SEGLEN(A0)�!�DATA�BLOCK�IN�DISPLAY�AREA‰CLR.LƒSEGTCB(A0)„!‰CLR.LƒSEGSES(A0)„!*ž!&‰IFC…'\1','0'†!�NO�SEGMENT�NAME�GIVEN.‰CLR.WƒSEGOPT(A0)„!.‰MOVE.L‚SGBRK(A5),D1‚!�MAKE�IT�CONTIGUOUS�WITH%‰ADDQ.L‚#1,D1‰!�CURRENT�DATA�SEGMENT.‰MOVE.L‚D1,SEGLAD(A0)�!‰MOVE.L‚D1,SEGNAM(A0)�!‰ENDC’!‰IFNC„'\1','0'†!1‰MOVE.W‚#SGOPPA,SEGOPT(A0)�!�LET�RMS�SUPPLY�ADDR.‰CLR.LƒSEGLAD(A0)„!2‰MOVE.L‚#'\1',SEGNAM(A0)�!�USE�SEG.�NAME�AS�IDENT.‰ENDC’!*ž!‰MOVE.W‚#SGATRW,SEGATT(A0)‰MOVE.L‚#GTSEG,D0…! ‰TRAP„#1Œ!:* END OF DOGTSEG MACRO ***********************************‰ENDM’!*2*�DEALLOCATE�A�SEGMENT.‚SEG�NAME�IS�ONLY�ARGUMENT.<* ASSUMES STACK POINTER DOES NOT POINT INTO DELETED SEGMENT.*DODESEG‚MACRO‘!�SEG�NAME�IS�ONLY�ARGUMENT.9*�BEGIN‚DODESEG�MACRO�***********************************9*�USES�A5.‚MODIFIES�A0�AND�D0.�**************************(‰LEA…DL0(A5),A0„!�GET�SOME�SCRATCH�SPACE‰CLR.LƒSEGLEN(A0)„!‰CLR.LƒSEGTCB(A0)„!‰CLR.LƒSEGSES(A0)„!‰CLR.WƒSEGOPT(A0)„!‰CLR.WƒSEGATT(A0)„!‰CLR.LƒSEGLAD(A0)„!%‰MOVE.L‚#'\1',SEGNAM(A0)�!�STORE�NAME‰MOVE.L‚#DESEG,D0…!"‰TRAP„#1Œ!�DEALLOCATE�THE�SEGMENT.&‰BNE…DERRŠ!�SHOULD�NEVER�REACH�DERR...:* END OF DODESEG MACRO ***********************************‰ENDM’!*#* INITIALIZE IMPORTANT PASCAL INFO./INITINFO�MACRO‘!�ARGS�ARE�START�ADD�AND�END�ADD9*�BEGIN‚INITINFO�MACRO�**********************************9*�MODIFIES�2,�A3.‚USES�A5.�******************************:* INITIALIZES SMALLEST HEAP ADDR, HEAP POINTER, SEGMENT **:* BOUNDARY AND FREE LIST. ********************************'‰MOVEA.L�\1,A2‰!�GET�DATA�SEGMENT�START‰LEA…VTABSZ(A2),A3.‰MOVE.L‚A3,SHPAD(A5)‚!�INIT�SMALLEST�HEAP�ADDR"‰MOVE.L‚#-1,(A3)+…!�INIT�FREE�LIST ‰CLR.Lƒ(A3)+%‰MOVE.L‚A3,HP(A5)…!�INIT�HEAP�POINTER(‰MOVE.L‚\2,SGBRK(A5)‚!�INIT�SEG�BOUNDARY:* END OF INITINFO MACRO **********************************‰ENDM*)* INITIALIZE PASCAL RT INTERRUPT VECTORS.!* ARGUMENTS ARE TWO ERROR LABELS.INITVECS�MACRO‘!9*�BEGIN‚INITVECS�MACRO�**********************************9*�US> ES�A2.‚MODIFIES�A0,A3,D0,D1.�************************#‰MOVEA.L�A2,A3‰!�CLEAR�VECTOR�TABLE‰MOVEQ.L�#VTABSZ,D1DI1\@„CLR.Lƒ(A3)+ ‰SUBQ.L‚#4,D1 ‰BNE.SƒDI1\@*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>)*‰LEA….PVTRAPD(PC),A0‚!�INIT�TRAP�VECTORS‰MOVE.L‚#.PVTRAPD,A0O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰MOVE.L‚A0,TRAPD(A2)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰LEA….PVTRAPE(PC),A0‰MOVE.L‚#.PVTRAPE,A0O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰MOVE.L‚A0,TRAPE(A2)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰LEA….PVBUSER(PC),A0‰MOVE.L‚#.PVBUSER,A0O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰MOVE.L‚A0,BUSER(A2)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰LEA….PADDRER(PC),A0‰MOVE.L‚#.PADDRER,A0O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰MOVE.L‚A0,ADDRER(A2)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰LEA….PVZDIV(PC),A0‰MOVE.L‚#.PVZDIV,A0O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰MOVE.L‚A0,ZDIV(A2)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰LEA….PVCHKI(PC),A0‰MOVE.L‚#.PVCHKI,A0O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰MOVE.L‚A0,CHKI(A2)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰LEA….PVTRAPV(PC),A0‰MOVE.L‚#.PVTRAPV,A0O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰MOVE.L‚A0,TRAPV(A2)**‰LEA…VT2TF(A2),A0‚!�RECEIVE�TRAPS�2�THRU�F‰MOVE.L‚#RT2TF,D0‰TRAP„#1/‰BEQ.SƒDI2\@‰!�ERROR�CHECK�(*�NO�HANDLER�YET�*)\2‡MOVEA.L�D0,A0‰MOVE.L‚#ABORT,D0‰TRAP„#1+DI2\@„CLR.LƒD7Œ!�SAVE�RETURN�ADDR�FOR�ERROR2‰LEA…VBETLF(A2),A0�!�RECEIVE�BUS�ERROR�THRU�LINE�F‰MOVE.L‚#RBETLF,D0‰TRAP„#1‰BEQ.SƒDI3\@‰!�ERROR�CHECK*\1‡MOVE.L‚D0,-(A7)‰MOVEQ.L�#MAL,D0 ‰TRAP„#14‰DC.W„0* DI3\@„EQU…*:* END OF INITVECS MACRO **********************************‰ENDM*3* MACRO COPYRMA COPIES RMA TO ADDR POINTED TO BY A6<* FROM END ADDR POINTED TO BY A5. USES DO. UPDATES A7,A6,A5. COPYRMA‚MACRO9*�BEGIN‚COPYRMA�MACRO�***********************************:* USES A5 AND A6. MODIFIES D0. UPDATES A5,A6,A7. *********‰MOVE.W‚#RTDSZ,D0DI33…MOVE.W‚-(A5),-(A6) ‰SUBQ.W‚#2,D0 ‰BNE.SƒDI33‰MOVEA.L�A6,A7‰!�..UPDATE�A7,A5‰MOVEA.L�A7,A5:* END OF COPYRMA MACRO ***********************************‰ENDM‰PAGE*#*ˆCONSTANTS�FOR�USE�BY�INIT.SA�ONLY*+SEGTLEN‚EQU…768‹!�LEN�OF�TEMPORARY�SEGMENT.%*ž!�MUST�HOLD�RMA�AND�EXCEPTION�VECS.****** * ENTRY POINT***** .PINITƒEQU…* INIT…EQU…* O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>‰MOVE.L‚#RELINQ,D0‰TRAP„#1!*¦RELINQUITSH�CONTROL�SO�THAT�I/O#*¦I/O�INITIALIZATION�CAN�TAKE�PLACEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*H*ˆWith�invocation�of�assignment�using�the�command�line�this�is�no�longer *’necessary**ˆMOVE.L„#ROMASIGN,A0 *ˆJMP‡(A0)&*¦ASSIGN�LOGICAL�UNITS�FOR�APPLICATION*¦TASK&*¦THE�JUMP�INSTRUCTION�IS�USED�BECAUSE&*§A�STACK�HAS�NOT�BEEN�DEFINED�AT�THIS*§POINT�IN�TIME*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ASIGNRET:)*¦RETURN�ADDRESS�AFTER�LOGICAL�UNITS�HAVE*§BEEN�ASSIGNEDO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  &‰IFEQ„VDOSEXˆ!�IF�VERSADOS�ON�EXORMACSN*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*<*.INIT1ƒMOVE.L‚#.PZMAIN-*-RTDSZ,A7�!�SET�A7�TO�START�OF�DATA*ˆLEA….INIT1(PC,A7.L),A7**ˆA7�=�ADDRESS�OF�SEG2? *!.INIT1ƒADD.L…#.PZMAIN-.PZSTART,A7‰SUB.L…#RTDSZ,A7*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰ENDC'‰IFNE„VDOSEXˆ!�VDOS�OR�RMS�ON�VM01/VM021*ˆALLOCATE�THE�TEMPORARY�SEGMENT�'SEGT'�TO�USE�IN+*ˆLIEU�OF�'SEG2'�UNTIL�'SEG2'�IS�VALIDATED.!‰MOVE.L‚D0,A2‰!�SAVE�STARTUP�INFO ‰MOVE.L‚A1,A3*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>**ˆIFEQ„RMSVM‰!�RMS�ON�VM01/02*ˆMOVE.L‚#RELINQ,D0„!/*ˆTRAP„#1Œ!�RELINQUISH�CONTROL�OF�THE�PROCESSOR&*ž!�SO�BIOS�HAS�A�CHANCE�TO�INITIALIZE*ˆENDC’!O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*+‰MOVE.L‚#GTSEG,D0…!�GET�A�TEMPORARY�SEGMENT+‰LEA…PRMBLK(PC),A0�!�WITH�THESE�PARAMETERS.‰TRAP„#1Œ!�DO�IT‰BNE…DERR1‰!�ERRORS�ABORT.4*ˆ!�A0�NOW�CONTAINS�START�PHYSICAL�ADDR�OF�THE�SEGT.+‰MOVEA.L�A0,A7‰!�INIT�STACK�PTR�TO�START�AD0‰ADD.Lƒ#SEGTLEN-RTDSZ-2,A7�!�PLUS�LEN�-�RMA�SIZE$‰MOVE.L‚A2,D0‰!�RESTORE�STARTUP�INFO‰MOVE.L‚A3,A1‰!‰ENDC ‰MOVEA.L�A7,A5‰!�A5�:=�A7‰MOVEA.L�A7,A6‰!�A6�:=�A7&‰CLR.LƒSC(A5)ˆ!�STATEMENT�COUNTER�:=�0 (‰IFNE„RMSVM‰!�VERSADOS�ON�EXORMACS�OR�VM+‰MOVEM.L�D0-D1,LTN(A5)�!�SAVE�START�UP�DATA‰MOVE.L‚A1,DTID(A5)‰MOVEM.L�D4-D5,DCAT(A5)‰MOVE.L‚D2,DVOL(A5)‰MOVE.W‚D3,DUN(A5)‰MOVE.W‚D6,CLL(A5)‰MOVE.L‚D7,LUIU(A5)‰ENDC &‰IFEQ„RMSVM‰!�RMS68K�ONLY�ON�VM01/VM023*ˆINITIALIZE�VERSADOS�STARTUP�DATA�TO�'SAFE'�VALUES*ˆFOR�RMS68K+BIOS�ENVIRONMENT;*ˆMOVEM.L�D0-D1,LTN(A5)�!�NO�NEED�TO�INIT�LOADING�TASK�NAME/‰MOVE.L‚#'CN00',DTID(A5)�!�SET�DEFAULT�TERM.�ID!‰MOVE.L‚#'„',D0„!�USEFUL�CONSTANT7‰MOVE.L‚D0,DCAT(A5)ƒ!�BLANK�OUT�8�CHARS�OF�CATALOG�NAME‰MOVE.L‚D0,DCAT+4(A5)�!6‰MOVE.L‚D0,DVOL(A5)ƒ!�BLANK�OUT�4�CHARS�OF�VOLUME‚NAME;‰CLR.WƒDUN(A5)‡!�SET�DEFAULT�USER�NO�TO�AN�ACCEPTABLE�VALUE$‰CLR.LƒD6Œ!�COMMAND�LINE�LENGTH�IS�0)‰CLR.WƒCLL(A5)‡!�COMMAND�LINE�LENGTH�IS�0)‰CLR.LƒLUIU(A5)†!�NO�LOGICAL�UNITS�IN�USE‰ENDC -‰CLR.WƒCCDR(A5)†!�ZERO�OUT�CHAIN�CMD�DIAG�REG0‰MOVE.B‚#$D,CL(A5,D6)�!�PUT�CR�AT�END�OF�COMMAND &‰IFEQ„VDOSEXˆ!�IF�VERSADOS�ON�EXORMACS3‰DORCVSA�0,EFI‰!�RECEIVE�SEGMENT�INFO,�NAME�UNKNOWN‰BNE…DERR1‰!�ERROR�CHECK‰ENDC '‰IFNE„VDOSEXˆ!�NOT�VERSADOS�ON�EXORMACS‰MOVEA.L�A0,A4‰!(‰ADD.Lƒ#SEGTLEN-1,A4�!�CALC�SEG�END�ADDR&‰INITINFO�A0,A4ˆ!�INIT�IMPORTANT�STUFF‰ENDC’! #‰IFEQ„VDOSEXˆ!�VERSADOS�ON�EXORMACS‰INITINFO�SRELSA(A1),SRELEA(A1)‰ENDC’! '‰MOVE.W‚#EFI-OFAR,D1‚!�CLEAR�FIELD�INFO‰MOVE.W‚#OFAR,D0DI5†CLR.Lƒ0(A5,D0) ‰ADDQ.W‚#4,D0 ‰SUBQ.W‚#4,D1 ‰BHI.SƒDI5 -‰INITVECS�DERR,DERR1ƒ!�INIT�INTERRUPT�VECTORS O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*H*ˆThis�logic�has�been�remove�because�'SEG2'�will�be�obtained�dynamically!*ˆconsequently�it�is�not�required**(*ˆIFNE„VDOSEXˆ!�NOT�VDOS�ON�THE�EXORMACS**ˆBSR…SEG2INFO†!�RECEIVE�SEG�INFO�FOR�SEG2 *ˆBEQ.SƒDIOK1*&*ˆMOVEQ.L�#WSN,D0‡!�RUNTIME�ERROR�1013/*ˆTRAP„#14‹!�**WRONG�SEGMENT�NAME,�MUST�BE�SEG2*ˆDC.W„0*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< DIOK1„EQU…*(‰IFNE„RMSVM‰!�NOT�RMS68K�ONLY�ON�VM01/02 O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*(*ˆ!READ�COMMAND�LINE�FROM�SEG2�INTO�SEGT*ˆMOVEA.L�SRELSA(A1),A3B*ˆADD.Lƒ#.PZMAIN-.PZSTART-RTDSZ+CL,A3�!�START�OF�COM�LINE�IN�SEG2.+*ˆLEA…CL(A5),A2…!�START�ADDR�FOR�OUTPUT�BUF'*ˆMOVE.W‚CLL(A5),D0„!�NO�OF�BYTES�TO�DO*>*ˆ!!!�FORCE�THE�COMMAND�LINE�TO�BE�TAKEN�FROM�RROM.ASSIGNLU.RO‰LEA‡CMDLINE(PC),A3$*œA3�=�ADDRESS�OF�CMDLINE�TO�PROCESS‰LEA‡CL(A5),A2&*œADDRESS�OF�CMDLINE�IN�SEGMENT�'SEGT'‰MOVE.W„CMDLINEL(PC),D0,*œD0�=�NUMBER�OF�BYTES�IN�CMDLINE�TO�PROCESS*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +DIITER1‚TST.WƒD0Œ!�WHILE�MORE�BYTES�TO�COPY‰BEQ.SƒDIDONE1‡!�.DO%‰MOVE.B‚(A3)+,(A2)+ƒ!�..COPY�ONE�MORE(‰SUBQ.W‚#1,D0‰!�..DECREMENT�NUMBER�TO�DO‰BRA.SƒDIITER1‡!�.ODDIDONE1‚EQU…*�! O*>? >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*A*ˆThis�'ENDC'�statement�corresponds�to�the�'IF'�statement�removed*’above**ˆENDC*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ‰ENDC (‰IFNE„RMSVM‰!�NOT�RMS68K�ONLY�ON�VM01/02‰CLR.LƒD6Œ!�Z�OPT�:=�FALSE"‰LEA…CL(A5),A2…!�INIT�SCAN�POINTER-.INIT2ƒMOVE.L‚#.PMAIN-*,D2‚!�IF�NOT�SCAN�THEN‰MOVE.W‚.INIT2(PC,D2.L),D2 ‰BTST„#0,D2#‰BNE.SƒDI4‹!�.(*�SCAN�FOR�Z�ONLY�*)‰MOVE.B„.PSYMBUG(PC),D1+‰TST.B…D1Š!�CHECK�FOR�"THIS�IS�SYMBUG"�FLAG'‰BNE.S…DI7‰!�IF�SO,�DON'T�SCAN�ANYTHINGDI6†EQU…*�!�.DO‰BSR…GNC‹!�..GET�NEXT�CHAR‰BEQ.SƒDI7‹!�.UNTIL�CHAR�=�CR ‰CMP.Bƒ#';',D1‡!�.\OR�CHAR�=�';' ‰BNE.SƒDI6‹!�.IF�CHAR�=�';'�THENDI8†EQU…*�!�..DODI9†EQU…*�!�...DO%‰MOVE.B‚D1,D5‰!�....LAST�CHAR�:=�CHAR‰BSR…GNC‹!�....GET�NEXT�CHAR'‰CMP.Bƒ#'=',D1‡!�....IF�CHAR�=�'='�THEN ‰BNE.SƒDI90DI91…EQU…*�!�.....DO'‰MOVE.B‚D1,D5‰!�......LAST�CHAR�:=�CHAR‰BSR…GNC‹!�......GET�NEXT�CHAR!‰BEQ.SƒDI7‹!�.....UNTIL�CHAR�=�CR$‰CMP.Bƒ#',',D1‡!�.....\OR�CHAR�=�',' ‰BNE.SƒDI91DI90…EQU…*�!�....FI"‰CMP.Bƒ#$D,D1ˆ!�...UNTIL�CHAR�=�CR ‰BEQ.SƒDI7"‰CMP.Bƒ#'Z',D1‡!�...\OR�CHAR�=�'Z' ‰BNE.SƒDI9‰BSR…SCANZ‰!�...SCAN�Z�OPTION!‰CMP.Bƒ#$D,D1ˆ!�..UNTIL�CHAR�=�CR ‰BNE.SƒDI8DI7†EQU…*�!�.FI‰BRA…DI10Š!�ELSE DI4†EQU…*‰CLR.WƒD0Œ!�.FIELD�NUM�:=�0DI11…EQU…*�!�.DO‰BSR…GNC‹!�..GET�NEXT�CHAR$‰CMP.Bƒ#'�',D1‡!�.UNTIL�CHAR�#�SPACE ‰BEQ.SƒDI11‰CMP.Bƒ#$D,D1ˆ!�.IF�CHAR�#�CR ‰BEQ…DI95&‰CMP.Bƒ#';',D1‡!�.\AND�CHAR�#�';'�THEN ‰BEQ…DI95DI12…EQU…*�!�..DO.‰LEA…FNNF(A5),A0ƒ!�...CALC�ADDR�FROM�FIELD�NUM ‰LSL.Lƒ#2,D0‰LEA…0(A0,D0),A0 ‰LSR.Lƒ#2,D0%‰CLR.BƒD2Œ!�...SPECIAL�FIELD�:=�FALSE&‰CMP.Bƒ#'I',D1‡!�...IF�CHAR�=�'I'�THEN ‰BNE.SƒDI13‰BSR…GNC‹!�....GET�NEXT�CHAR'‰CMP.Bƒ#'=',D1‡!�....IF�CHAR�=�'='�THEN ‰BNE.SƒDI14(‰LEA…IENF(A5),A0ƒ!�.....ADDR�:=�I=�FIELD+‰MOVEQ.L�#1,D2‰!�.....SPECIAL�FIELD�:=�TRUE‰BSR…GNC‹!�.....GET�NEXT�CHAR‰BRA.SƒDI15Š!�....ELSE DI14…EQU…*‰BSR…BACKSPˆ!�.....BACKSPACEDI15…EQU…*�!�....FI‰BRA.SƒDI16Š!�...ELSE DI13…EQU…*'‰CMP.Bƒ#'O',D1‡!�....IF�CHAR�=�'O'�THEN ‰BNE.SƒDI17‰BSR…GNC‹!�.....GET�NEXT�CHAR(‰CMP.Bƒ#'=',D1‡!�.....IF�CHAR�=�'='�THEN ‰BNE.SƒDI18)‰LEA…OENF(A5),A0ƒ!�......ADDR�:=�O=�FIELD,‰MOVEQ.L�#1,D2‰!�......SPECIAL�FIELD�:=�TRUE‰BSR…GNC‹!�......GET�NEXT�CHAR‰BRA.SƒDI19Š!�.....ELSE DI18…EQU…*‰BSR…BACKSPˆ!�......BACKSPACEDI19…EQU…*�!�.....FIDI17…EQU…*�!�....FIDI16…EQU…*�!�...FI#‰TST.BƒD2Œ!�...IF�NOT�SPECIAL�FIELD ‰BNE.SƒDI20+‰CMP.Wƒ#16,D0ˆ!�...\AND�FIELD�NUM�=�16�THEN ‰BNE.SƒDI20‰MOVEQ.L�#CLF,D0ˆ!�....ERROR ‰TRAP„#14‰DC.W„0DI20…EQU…*�!�...FI8‰LEA…CL+1(A5),A1ƒ!�...FIELD�START�OFF�:=�CHAR�PTR-(CL+1) ‰MOVE.L‚A2,D3 ‰SUB.LƒA1,D3‰MOVE.B‚D3,2(A0)4‰MOVE.B‚D3,3(A0)†!�...CURRENT�OFF�:=�FIELD�START�OFF‰BSR…SCANF‰!�...SCAN�FILES(‰TST.BƒD2Œ!�...IF�NOT�SPECIAL�FIELD�THEN ‰BNE.SƒDI21.‰ADDQ.W‚#1,D0‰!�....FIELD�NUM�:=�FIELD�NUM�+�1DI21…EQU…*�!�...FI!‰CMP.Bƒ#$D,D1ˆ!�..UNTIL�CHAR�=�CR ‰BEQ.SƒDI22!‰CMP.Bƒ#';',D1‡!�..\OR�CHAR�=�';' ‰BNE…DI12 DI22…EQU…*,‰MOVE.W‚D0,NFCL(A5)ƒ!�..UPDATE�NUM�OF�FIELDSDI95…EQU…*�!�.FI$‰CMP.Bƒ#';',D1‡!�.IF�CHAR�=�';'�THEN ‰BNE.SƒDI23DI24…EQU…*�!�..DO$‰MOVE.B‚D1,D5‰!�...LAST�CHAR�:=�CHAR‰BSR…GNC‹!�...GET�NEXT�CHAR&‰CMP.Bƒ#'=',D1‡!�...IF�CHAR�=�'='�THEN ‰BNE.SƒDI25DI26…EQU…*�!�....DO&‰MOVE.B‚D1,D5‰!�.....LAST�CHAR�:=�CHAR‰BSR…GNC‹!�.....GET�NEXT�CHAR!‰BEQ.SƒDI27Š!�....UNTIL�CHAR�=�CR#‰CMP.Bƒ#',',D1‡!�....\OR�CHAR�=�',' ‰BNE.SƒDI26 DI27…EQU…*DI25…EQU…*�!�...FI‰CMP.Bƒ#$D,D1ˆ!�...IF�CHAR�#�CR ‰BEQ.SƒDI28(‰CMP.Bƒ#'Z',D1‡!�...\AND�CHAR�#�'Z'�THEN ‰BEQ.SƒDI28*‰CMP.Bƒ#'A',D1‡!�....IF�CHAR�IS�ALPHA�THEN ‰BCS.SƒDI29‰CMP.Bƒ#'Z'+1,D1 ‰BCC.SƒDI29-‰LEA…CL+1(A5),A1ƒ!�.....CALC�OFFSET�TO�OPTION ‰MOVE.L‚A2,D4 ‰SUB.LƒA1,D4-‰CMP.Bƒ#'-',D5‡!�.....IF�LAST�CHAR�=�'-'�THEN ‰BNE.SƒDI30‰NEG.WƒD4Œ!�......NEGATE�OFFSETDI30…EQU…*�!�.....FI‰EXT.WƒD1Œ!�.....UPDATE�OFFSET ‰LSL.Lƒ#1,D1‰LEA…OFAR-$82(A5),A3‰MOVE.W‚D4@ ,0(A3,D1)DI29…EQU…*�!�....FIDI28…EQU…*�!�...FI‰BSR…SCANZ‰!�...SCAN�Z�OPTION!‰CMP.Bƒ#$D,D1ˆ!�..UNTIL�CHAR�=�CR ‰BNE.SƒDI24DI23…EQU…*�!�.FIDI10…EQU…*�!�FI‰TST.BƒD6Œ!�IF�Z�OPTION�THEN '‰IFEQ„VDOSEXˆ!�VERSADOS�ON�THE�EXORMACS ‰BEQ.SƒDI315‰LEA…RTDSZ+VTABSZ+2(A5),A0�!�.IF�REQ�SZ�>�CUR�SZ�THEN‰MOVE.L‚SHPAD(A5),D1 ‰SUBA.L‚D1,A0 ‰ASL.Lƒ#8,D3 ‰ASL.Lƒ#2,D3 ‰SUB.LƒA0,D3 ‰BLS.SƒDI31*ž!�ALLOCATE�ADDITIONAL�SEGMENT)‰DOGTSEG�0,D3Š!�NO�SEG�NAME,�LENGTH�IN�D3‰BNE…DERRŠ!�..ERROR�CHECK*'‰LEA…RTDSZ(A7),A6‚!�..MOVE�RUNTIME�DATA ‰ADDA.L‚D3,A6‰LEA…RTDSZ(A5),A5'*ž!�COPIES�RMA�TO�ADDR�POINTED�TO�BY�A6"*ž!�FROM�END�ADDR�POINTED�TO�BY�A5%‰COPYRMA�!�USES�DO.�UPDATES�A7,A6,A5.!‰ENDC’!�VERSADOS�ON�EXORMACS�ONLY*$‰IFEQ„VDOSVMˆ!�VERSADOS�ON�VM01/VM02 ‰BEQ…DI31!‰ASL.Lƒ#8,D3‰!�MULTIPLY�Z�BY�1024 ‰ASL.Lƒ#2,D3 O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*D*ˆThis�logic�has�been�replaced�with�a�move�to�register�D4.�The�value9*’in�the�register�is�the�maximum�value�D4�could�have�with*’the�current�logic**ˆBSR…SEG2INFO5*ˆMOVE.L‚SRELEA(A1),D4�!�CALCULATE�SIZE�OF�USER�BLOCK*ˆSUB.LƒSRELSA(A1),D4*ˆSUB.Lƒ#.PZMAIN-.PZSTART+1,D4 ‰MOVE.L„#254,D4**œD4�=�MAXIMUM�VALUE�IF�CURRENT�LOGIC�USED*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< * O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>**ˆCMPI.L‚#.PZMAIN-.PZSTART+2,D3 *ˆBLS.SƒDI31(„IF.L‹#.PZMAIN-.PZSTART+2��D3ƒTHEN.S‰MOVE.L„#.PZMAIN-.PZSTART+2,D3„ENDI*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $‰ADD.LƒD4,D3‰!�Z-OPTION�+�USER�BLOCK#‰ADD.Lƒ#255,D3‡!�ROUND�SEGMENT�SIZE ‰CLR.BƒD3 O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*H*ˆDeletion�of�'SEG2'�no�longer�required�since�it�is�acquired�dynamically*-*ˆFIRST�DELETE�OFF�PREVIOUS�'SEG2'�VIA�DESEG.*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< %*ˆTHEN�ALLOCATE�A�NEW�SEGMENT�'SEG2'.*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*H*ˆDeletion�of�'SEG2'�no�longer�required�since�it�is�acquired�dynamically**ˆDODESEGƒSEG2*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< *‰DOGTSEGƒSEG2,D3…!�NAME,�LEN ‰BNE‡DERR ‰SUB.L…D4,D3‡!�REMOVE�USER�BLOCK1‰SUB.L…#.PZMAIN-.PZSTART+2,D3�!�REMOVE�STACK/HEAP ‰BRA.S…DI32‰ENDC DI31…EQU‡*‹!�FI‰ENDC’!�END�OF�NON-RMS68K�STUFF '‰IFNE„VDOSEXˆ!�VDOS�OR�RMS�ON�VM01/VM02 ‰CLR.LƒD3 DI32…EQU…*)‰BSR…SEG2INFO†!�RECEIVE�SEG�INFO�FOR�SEG2*‰MOVEA.L�SRELSA(A1),A6�!�GET�START�ADDRESS‰ADD.Lƒ#.PZMAIN-.PZSTART,A6‰ADD.LƒD3,A6‰!�NEW�END�OF�RMA*&‰LEA…RTDSZ(A5),A5‚!�CURRENT�END�OF�RMA.‰COPYRMA�!�COPIES�RMA�TO�ADDR�POINTED�TO�BY�A6"*ž!�FROM�END�ADDR�POINTED�TO�BY�A5*ž!�USES�DO.�UPDATES�A7,A6,A5.3‰INITINFO�SRELSA(A1),SRELEA(A1)�!�INIT�HEAP�POINTER‰INITVECS�DERR2,DERR3 ‰DODESEG�SEGT‰ENDC O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+*ˆLEA….PLJSR(PC),A3�!�INIT�LONG�JSR�POINTER*‰MOVE.L„#.PLJSR,A3O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*,*ˆCALL�FLOATING�POINT�INIT�ROUTINE�IF�NEEDED* ‰BSR…INITFPF.INIT3ƒMOVE.L‚#.PMAIN-*,D0‚!�START�MAIN�PROGRAM�RELATIVE�AT�.PMAIN�+�2‰JMP….INIT3+2(PC,D0.L)‰PAGE** SUPPORT ROUTINES FOR INIT*'‰IFNE„VDOSEXˆ!�VDOS�OR�RMS�ON�VM01/VM02** THIS SUBROUTINE MODIFIES D0, A0, AND A1.* IT USES A5 (RMA POINTER)./* IT ALSO USES THE PARAMETER BLOCK FROM EOD(A5)5* TO EOD+$1B(A5) FOR INPUT TO THE RCVSA TRAP #1 CALL.+* IT RETURNS SEGMENT INFO FOR 'SEG2' IN THE?* PARAMETER BLOCK DENOTED BY EOD+$1C(A5) (AND ALSO A1 ON EXIT).SEG2INFO�EQU…*�!*‰DORCVSA�SEG2,EOD†!�FIND�OUT�SEGMENT�ADDRS‰RTS“!‰ENDC’!**%‰IFNE„RMSVM‡!�NOT�RMS68K�ON�VM01/VM02**�BACKSP@ ‚BACK�UP�A�CHARACTER*BACKSPƒIF.B�D1#$D�THEN.S ‰SUB.L�#1,A2‰ENDI ‰SUB.L�#1,A2*�FALL�THROUGH‚TO�GNC *,*�GNC�-�GET�NEXT�CHARACTER.‚A2�POINTS�AT�THE%*ˆSTRING�BEING�SCANNED.‚THE�CHARACTER&*ˆIS�RETURNED�IN�D1.‚THE�Z�FLAG�IS�SET(*ˆIF�THE�CHARACTER�IS�A�CARRIAGE�RETURN.* GNC†EQU…*4‰MOVE.B‚(A2)+,D1†!�GET�CURRENT�CHAR�&�UPDATE�POINTER!‰CMP.Bƒ#$D,D1ˆ!�IF�CHAR�=�CR�THEN ‰BNE.SƒGNC1‰SUBQ.L‚#1,A2‰!�.DEC�POINTERGNC1…EQU…*�!�FI ‰RTS“!�END‰SPC…1*/*�SCANZ�-�SCAN�Z�OPTION.‚A2�POINTS�TO�CHARACTER)*ˆPAST�Z.‚A2�WILL�BE�UPDATED�TO�CHARACTER(*ˆPAST�END�OF�Z�OPTION�FIELD.‚CHECKS�FOR(*ˆERROR�IN�OPTION�FIELD.‚EQUALS�VALUE�IS*ˆRETURNED�IN�D3.* SCANZ„EQU…*#‰CMP.Bƒ#'Z',D1‡!�IF�CHAR�=�'Z'�THEN ‰BNE.SƒSZ1)‰CMP.Bƒ#'-',D5‡!�.IF�LAST�CHAR�=�'-'�THEN‰BEQ.SƒSZ3‹!�..ERRORSZ2†EQU…*�!�.FI‰SUBQ.L‚#1,A2‰!�.DEC�POINTER)‰BSR….POPTION†!�.OPTION�(*�GET�=�VALUE�*)‰BTST„#4,D0‰!�.ERROR�CHECK ‰BEQ.SƒSZ4‰AND.Bƒ#$AA,D0 ‰BEQ.SƒSZ5SZ4†MOVE.L‚D0,-(A7)SZ3†MOVEQ.L�#MAL,D0 ‰TRAP„#14‰DC.W„0"SZ5†MOVEQ.L�#1,D6‰!�.Z�OPT�:=�TRUESZ1†EQU…*�!�FI ‰RTS“!�END‰SPC…1*/*�SCANF�-�SCAN�FILES.‚COUNTS�NUMBER�OF�FILES�IN(*ˆFILE�LIST�WITHIN�A�FIELD.‚A2�POINTS�TO)*ˆLINE�BEING�SCANNED.‚COUNT�OF�FILES�WILL)*ˆBE�PLACED�IN�FIELD�INFO�AREA.‚A0�POINTS#*ˆTO�START�OF�FIELD�AREA.‚CHARACTER'*ˆAT�START�OF�FIELD�IS�IN�D1.‚CHARACTER+*ˆTERMINATING�FIELD�WILL�BE�RETURNED�IN�D1.&*ˆA2�WILL�BE�RETURNED�POINTING�AT�NEXT *ˆCHARACTER.* SCANF„EQU…*"‰MOVE.B‚#',',D5‡!�LAST�CHAR�:=�','‰CLR.Bƒ(A0)Š!�NUM�FILES�:=�0SF1†EQU…*�!�DO"‰CMP.Bƒ#'/',D1‡!�.WHILE�CHAR�=�'/' ‰BNE.SƒSF2-‰ADDQ.B‚#1,(A0)‡!�.NUM�FILES�:=�NUM�FILES�+�1"‰MOVE.B‚D1,D5‰!�.LAST�CHAR�:=�CHAR‰BSR…GNC‹!�.GET�NEXT�CHAR‰BRA.SƒSF1‹!�OD SF2†EQU…*SF3†EQU…*�!�DO ‰CMP.Bƒ#$D,D1ˆ!�.WHILE�CHAR�#�CR ‰BEQ.SƒSF4!‰CMP.Bƒ#';',D1‡!�.\AND�CHAR�#�';' ‰BEQ.SƒSF4!‰CMP.Bƒ#',',D1‡!�.\AND�CHAR�#�',' ‰BEQ.SƒSF4-‰ADDQ.B‚#1,(A0)‡!�.NUM�FILES�:=�NUM�FILES�+�1SF5†EQU…*�!�.DO‰CLR.BƒD5Œ!�..LAST�CHAR�:=�NULL‰BSR…GNC‹!�..GET�NEXT�CHAR‰BEQ.SƒSF3‹!�.UNTIL�CHAR�=�CR ‰CMP.Bƒ#';',D1‡!�.\OR�CHAR�=�';' ‰BEQ.SƒSF3 ‰CMP.Bƒ#',',D1‡!�.\OR�CHAR�=�',' ‰BEQ.SƒSF3 ‰CMP.Bƒ#'/',D1‡!�.\OR�CHAR�=�'/' ‰BNE.SƒSF5‰BRA.SƒSF3‹!�OD SF4†EQU…*(‰CMP.Bƒ#'/',D5‡!�IF�LAST�CHAR�=�'/'�THEN ‰BNE.SƒSF6-‰ADDQ.B‚#1,(A0)‡!�.NUM�FILES�:=�NUM�FILES�+�1SF6†EQU…*�!�FI#‰CMP.Bƒ#',',D1‡!�IF�CHAR�=�','�THEN ‰BNE.SƒSF7‰BSR…GNC‹!�.GET�NEXT�CHARSF7†EQU…*�!�FI ‰RTS“!�END"‰ENDC’!�END�OF�ROUTINES�NOT�USEFUL*ž!�TO�RMS68K�ON�VM01/VM02 ‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>** .PLJSR - LONG JSR ROUTINE* *.PLJSRƒEQU…*%*ˆMOVE.L‚(A7),A4‡!�GET�RETURN�ADDRESS%*ˆADD.Lƒ#4,(A7)‡!�CORRECT�IT�ON�STACK'*ˆADD.Lƒ(A4),A4‡!�CALCULATE�DESTINATION*ˆJMP…(A4)Š!�GO�TO�IT*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'‰IFNE„VDOSEXˆ!�NOT�VERSADOS�ON�EXORMACS$PRMBLKƒDC.L„0�!�DON'T�KNOW�TASK�NAME‰DC.L„0�!�SESSION'‰DC.W„SGOPPAˆ!�LET�RMS68K�PICK�THE�ADDR!‰DC.W„SGATRWˆ!�READ/WRITE�SEGMENT‰DC.L„'SEGT'ˆ!�SEGMENT�NAME%‰DC.L„0�!�START�LOGICAL�ADDR�(IF�<>0)'‰DC.L„SEGTLEN‡!�SEGMENT�LENGTH�IN�BYTES‰ENDC’! ‰PAGE*C*‚FINIT�-�THE�COMMON�SECTION�USED�FOR�LINKAGE�TO�THE�FLOATING�POINT*ŠPACKAGE�IF�PRESENT*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*FINIT„SECTION�8FINIT„SECTION�9O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</INITFPƒRTS“!�RETURN�TO�INIT�UNLESS�OVER�WRITTEN* ‰END…INITéA ééééé=/*=/*†RROM.PFPOINT.AF=/*C=/*†Chain�file�to�assemble�the�dummy�module�to�satisfy�the�externalB=/*†reference�'.PFPOINT'�for�the�file�IOSRR.WRR.SA.�This�module�isC=/*†used�with�the�version�of�the�rom�library�which�DOES�NOT�support=/*†floating�point�capability.=/*&=/*ˆParameter�01†Output�listing/device4=/*šThis�parameter�is�optional�and�will�be�defaulted=/*šif�not�specified.=/*=/*ˆPARAMETER�01�EDITS=/*=/IFC \1=ARG RROM.PFPOINT.LS=/ENDIF=/*=/*=/*)=ASM RROM.PFPOINT.SA,RROM.PFPOINT.RO,\1;R=/*{ Included files are:=/*ƒ--�none�--=/*}=ENDééééé*<*ˆThe�file�IOSRR.WRR.SA�has�defined�an�external�reference�to>*ˆ'.PFPOINT'.�Since�this�version�of�the�rom�library�for�PASCAL<*ˆdoes�not�support�floating�point�processing�this�dummy�file5*ˆhas�been�created�to�satisfy�the�external�reference.A*ˆThis�location�should�not�be�accessed�since�there�is�no�floatingA*ˆpoint�capability�for�this�version�of�the�library,�however�if�byC*ˆchance�it�should�happpen�an�illegal�instruction�will�be�executed.** ‰SECTION�8‰XDEF†.PFPOINT .PFPOINT: ‰DC.W†$4A AFC/*œIF�BY�CHANCE�SOMEONE�SHOULD�TRY�AND�REFERENCE+*œTHIS�LOCATION�AN�ILLEGAL�INSTRUCTION�WILL$*œBE�EXECUTED�BRING�THE�SYSTEM�DOWN.‰END ééééé&=/*=/*ˆRROM.PLJSR.AF=/*;=/*ˆChain�file�to�assemble�the�PASCAL�long�jump�subroutine.=/*=/IFC \1=ARG RROM.PLJSR.LS=/ENDIF=/*=/*%=ASM RROM.PLJSR.SA,RROM.PLJSR.RO,\1;R=/*{ Included files are:=/*ƒ--�none�--=/*}=ENDééééééé/B O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*?*ˆThis�routine�was�removed�from�the�initilaizer�and�placed�back,*ˆin�the�library�because�of�its�heavy�usage.* ‰SECTIONƒ8* ‰XDEF†.PLJSR** .PLJSR - LONG JSR ROUTINE* .PLJSRƒEQU‡*$‰MOVE.L„(A7),A4�!�GET�RETURN�ADDRESS$‰ADD.L…#4,(A7)�!�CORRECT�IT�ON�STACK&‰ADD.L…(A4),A4�!�CALCULATE�DESTINATION‰JMP‡(A4)�!�GO�TO�IT* ‰END‡.PLJSRO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ééééé8,1ASSIGNLU ASREL'RROM ASSIGNLUSA!@#(…$2ICMDLINE ICMDLINEL ž) F3 ;Z=1 F3 &3 ž4éééééB éA_1FINIT ASREL'RROM FINIT SA!@)(…68K PASCAL FLOATING POINT INITIALIZATION SUBROUTINE/2p.PFPOINT H.PFINIT (’FINIT F3 ,OŸü:*O0<Ä:ÞU@fúKï,Mp mpCú6 ÉS@fú+Hppÿ Àp À+H0<aN3‚ A Àð@ 0<aA ´ð@ LßNuB+/ *m4Híÿÿ|+_°aA ’ðm0taA ˆð@0àX3 ä àX0@NN3@aA þNu4ééééééJf1FPOINT ASREL'RROM FPOINT SA!A(…68K PASCAL FLOATING POINT F-LINE TRAP SIMULATOR SUBROUTINE 2H.PFPOINT p.P68341P (ŒF3 Bg/QÀfÀdÀhÀjÀè@?@ Oïÿœ¿íOïdbpNNHçH3€ ÿÿ\¯;FF3 H+G0Bm4¼ `J(HÙüÿ$HGê`+Kp&üÿÿÿÿB›+K+Ll2<€0<ìBµX@F3ˆˆˆ YAbö&Jr`B›Y�fú |(%H, |(%H0 |(%H8 |(%H< |(%HD |(%HH |L3€@ (%HLAÒpNAg @pNAB‡Aê8pNAg/pNNGúB ÿEíJ0:B ÿJ@gÛS@`öB†L3 EíJ$ =f Aí(ta.F3 `aJf @fpBNNCíK& –‰CCa:JfR@  g ;fÿz;@F3 " ;fXaà =faÔg ,fò  g. Zg( Ae" [dCíK( J3H ˜‰ -fDDH�ã‰Gíj7„a   f¨Jg\áƒåƒ(<þ ƒI l&Híÿÿ|+o t$3 <+@xaÿ:`ÿ H@0-4H@,NA4R1OPTION AFIX gUTILRR OPTION SA3U ƒ68K PASCAL OPTION PROCESSOR SUBROUTINE 2p.PCLSCOD H.POPTION (ZH3 B€B�IúA ú am zn ,gè4k6 -fÀ`Ög0ƒF3 gÁ` =fRŠa`  f@` NuBƒ:< &J $g�F3 am zn 4gˆ`6 am zn 4k6gãƒF3 (åƒÖ„�Ö�SEf΂ am zn 4jè  f" am zF3 n +ÿþNu:< am zn  am zn 4k´f 3 gŒ_�郆�SEfÌ`ÿz4Q1CLSCOD AFIX gIOSRR CLSCOD SA ƒ68K PASCAL CHARACTER CLASS CODE TABLE2H.PCLSCOD (€F3 €€€@@ P€@  €@F3 4P1ALSTS AFIX gUTILRR ALSTS SA)0 ƒ68K PASCAL ALLOCATE STACK SUBROUTINE$2H.PALSTS H.PALSTSL (,23 HÄR„„ÿÿÿþŸÄŸü ¿íb O÷H pNNOï .·HNu4L1CLO AFIX gIORR CLO SA# ƒ68K PASCAL CLOSE FILE SUBROUTINE+2H.PCLO p.PCLOSPL p.PPRGBUF (&3  .LÐ2*(-0aA ðaA ì+D0Nu4\1IFD AFIX gIORR IFD SA$ ƒ68K PASCAL INITIALIZE FILE DESCRIPTOR SUBROUTINEL2H.PIFD p.PACCPER p.PCLOSPL p.PEDTFIL p.PSTDFLT p.PALSTS (H3 "_. HÂ&g&<…(„QR„Dÿþ$O•ĵíldEïµíle•ílØŠaA ÂF3 !OEïP/JEò8ÿ/JA??B$O eTgv`gvC)CL3 BjBBjBªL@O(-0fgA@aB ÿZJf<gJ-(gaB ÿFat`I3@ aúgJ-$gaB ÿ.a\`aâgaÄ`8°m"b"?S@å@@,J5LŸI3 g gaB þöa$` ga¤`aŠgNq5A+D0NÑHçØžMê$gI3 pÿS@å@@,Aõ|B€(@AõJaB þœ$€ÿ€üLßyg/p(NNI3 g g%m6*HBB|g€BNÁ NupaB þT|&8%m:*NuH瀀F3 Aê$0¼€NCgNN *&o|&BjFB*K*E f|'`  3 f|'`|'BjDLßNu4E L1RST AFIX gIORR RST SA ƒ68K PASCAL RESET FILE SUBROUTINEm2H.PRST p.PACCPER p.PASGNF p.PCFLDAD p.PCALCLU p.PCLOSPL p.PSTDFLT p.PFLSCN p.PPRGBUF (²L3€ .LÐ2*aA ôaA ðB� f† fpÀj& g faA Ê g4/ N3 ¢ &JaA ¼5 c ¼5‚aA  aA œH‚?aA ”2&_g*8 >3€ gAê0¼NBgNN` ap÷Áj&aB ÿbAìB’5ANup`B ÿP4N1RWT AFIX gIORR RWT SA ƒ68K PASCAL REWRITE FILE SUBROUTINEL2H.PRWT p.PACCPER p.PASGNF p.PCLOSE p.PCALCLU p.PBUFSZ (€J3„ .LÐ ª2*aA ð fFaA æp�j&aV*8 &g, g&Aê$0¼€NCgL3 f0¼NCf0¼€NCgNNaA ¤B’A€� aA –CòO%I5ANup`A ‚4^1AFI AFIX gIORR AFI SA ƒ68K PASCAL ASSIGN FILE TO RESOURCE NAME SUBROUTINEA2H.PAFI p.PDFLT p.PCLOSPL p.PEDTFIL p.POPTION (ìJ3 .0/2R�Aÿþ/7¼ Aï Hç,o,nMî$aA ÒLßx$W$jaA Ä&F3 €ÿ€ügp(NNfg0<÷ÿÁj äH@ãÅHBEBF ;g  gI3€ `ð ;fäHçaB ÿpLß g/pANN Bfafèt…h Æ`F3 ¤ Cfa4<øÿÅh&!CHÆ`† DfaðCKÆ`p FfaÜCF3 JÆ`\ Rf$a¸…gÅÅ4( 1B`2 Wf$aŽ…F3 gÅÅ4( 1B`gÿ:gÿ 2(JEg;PBpøÁh&‰(I3 '$HfŠFgg(-0aB þh+D05A gþô _"_0R€@ÿþO÷NÑ23 g/pANNNugðfêfäNu4Z1ACCPER AFIX gIORR ACCPER SAX ƒ68K PASCAL ACCESS PERMISSION SET UP SUBROUTINE2H.PACCPER ("(3  f?*8 &g pøÀj&€W5@&0Nu4X1CALCLU AFIX gIORR CALCLU SA9 ƒ68K PASCAL CALCULATE LOGICAL UNIT SUBROUTINE2H.PCALCLU (RF3 /(-0fBg<`"g<`BR ft bfì c3 p@NNB B)(Nu4P1EDTFIL AFIX gIOSRR EDTFIL SA ƒ68K PASCAL EDIT FILE NAME SUBROUTINE 2H.PEDTFIL p.PCLSCOD (âH3 B€B�IúA ú&H6<%B„aük$ #fÀ` ff&@€€€Nu€üF3 `öaÊkBfôgÚ .f R nÐ`Þ :f€@`Ð (f€`Ä F3 )fª@`¸g Jfžf˜ggŒfF*H Kf  aF3 m zn (g24f.f. gD gô .fRˆF3 `*Rˆ`DÀ` 6<Gîa&4<aškÌ`À`Â&<€€€F3  am zn 4k^f0fR *g2À  am zn F3 4kR .fâ`JÆü �Ö�`¤ ƒ€f4 .fÄÀ6<ÿþ` ƒ€g ƒF3 'cÀ` =C ` À`À4<aÚk 6< Gî aN4<aÂkôF3 n& f| 6< Gîa(4<aœkÎ (g 6<Gîa 4<a~F3 k° (f¨BBBC am zn 4kD )gg8 Pn2AéKF3 †AB`ÈBÿg BnÀ BcÀ=C `JÀÀÀBÿ BcÀF3 `.Rˆ6<Gîap4<aæk$< Gî &Â&Â&Â&Â6ÂBn $B|gÀ4F3 B|gÀJ€NuJCfBA`$ am zn SC /f À<€`4NuF3 4HB€€»ÈgF am zn 4k.f(f @À`< F3 *fÀÁSCn¾€€`$HB´CfÀ`< (*ÿþf<*`ÂSCnúNuJ€j(3 À`QBgQBÀ`ÀBgÀNu4N1PRGBUF AFIX gIORR PRGBUF SAR ƒ68K PASCAL PURGE BUFFER SUBROUTINE 2H.PPRGBUF p.PWRTBUF ("3 g g ³êgaA ì ‰Nu4Y1STDFLT AFIX gIORR STDFLT SA' ƒ68K PASCAL SET START FILE DEFAULTS SUBROUTINE 2p.PDFLT H.PSTDFLT (^H3 %| 8%| .f "3 %m@0%mD4` g%m6*Nu4Y1MPJ AFIX gUTILRR MPJ SA3 ƒ68K PASCAL 32 BIT INTEGER MULTIPLY SUBROUTINE2H.PMPJ (vF3 HçýÀ./$T¯$ G0å@A÷X@ @fB@C÷ "*jD€³…J�jD�$&H@HAÀÁ<3 ÆÂ(ÂÂHBHDÄÄÔ�"HABAÒƒBBHBÑ‚VÂJ…jD�F…Ê�[à �†DÃLß¿Nu4`1DVJMODJ AFIX gUTILRR DVJMODJ SA1 ƒ68K PASCAL 32 BIT INTEGER DIVIDE AND MOD SUBROUTINES$2H.PDVJ H.PMODJ (–F3 HçùÀ./ T¯ a( ‚DÁLߟNuHçùÀ./ T¯ aãƒjD€ €DÁLߟNu G0å@A÷F3 X@ @fB@C÷ "fpNN&âƒjD€³ƒJ�jD�tÿB²€dã‰R`ö��dÐ�ã’3 â‰SdòF‚"jD‚F�‚[ÁNu4I1WLN AFIX gIOSRR WLN SA$X ƒ68K PASCAL WRITELN SUBROUTINE 2H.PWLN p.PWRTBUF (3 .LÐR’aA ö ‰Nu4Q1WRC AFIX gIOSRR WRC SA%# ƒ68K PASCAL WRITE CHARACTER SUBROUTINE+2H.PWRC p.PIWPTR p.PLBLKS ("3@ .LÐ8SDaA ô€aA î ‰Nu4P1WRI AFIX gIOSRR WRI SA%5 ƒ68K PASCAL WRITE INTEGER SUBROUTINESI2H.PWRH H.PWRI H.PWRJ p.PIWPTR p.PLBLKS (ŽJ3 H€HÀ.LÐ8v / BJ€jt-D€SDGúL°›dSCnø˜CSDaA ÒJg‚aA ÈJCg(+J3@@ ÿür0°„e�„R`ö�aA ®(SCnè0€aA ž ‰&_Nu;šÊõᘖ€B@† 3 'èd 4Z1WRSWRV AFIX gIOSRR WRSWRV SA%Q ƒ68K PASCAL WRITE STRING AND VECTOR SUBROUTINES:2H.PWRS H.PWRV p.PIWPTR p.PLBLKS (JJ3 0/8/`8/0/./ Gï 2RAAÿþ sLИ@aA ÒJ@g ›aA ÈS@nö ‰3 &_$_O÷NÒ4O1WRB AFIX gIOSRR WRB SA% ƒ68K PASCAL WRITE BOOLEAN SUBROUTINE+2H.PWRB p.PIWPTR p.PLBLKS (:D3@ ./ LÐtGú"JgÖÂSB8˜BaA ä›aA ÞSBnö&_ ‰NuFALSETRUE 4T1WRR AFIX gIOSRR WRR SA($ ƒ68K PASCAL REAL NUMBER WRITE SUBROUTINES_2H.PWRR H.PWRW H.PWRX (p.PFPOINT p.PALSTS p.PIWPTR p.PLBLKS (F3 .JAlra�`ašNu.JAlra|`a†Nu.JAlrah`arNu8DN3 € aA ¼p °fp-€aA ¬MúpžaA  S@föNuINFINITY8DaA ˆpMú:O3  žaB ÿ|S@fö , ré˜tÄ0 9o‚aB ÿXSAfâ¼)aB ÿLNuNAN(16#I3 Hçð XLBFBpBFgèvÆŠg RFPÅ0ÃS@fâLßPNuJEo ¼0aB ÿSEL3 `JFo žaB þöSF`¼0aB þêS@Nu86,HCBCB@zé›Àü ÐCBCSEfòR@JjD@L3 Nuaÿ|aÔ @o˜@˜AUD`˜AWDaB þ¤v gv-ƒaB þ”,H…šFRElBE?BEL3 @n :DESEÚ_`T�aÿ^nú¼.aB þb0aÿNnúNuHçLÐx"aB þJM×Iï AI3 lr4 B€o4<€DBaB þ*ðT¸ð Àfaþ†`  g °faþ@`L3 aÿ@ ‰Þü"Lß@`Nu¼EaB ýêp+Jjp-€aB ýÜ0, AfáX` AféXtéXL3@ Ä0‚aB ý¶SAfìNufv `v-ƒaB ýžaþZ,H…šFRElBEY@�A @lL3 paþn¼.aB ýtaþbfúaÿzNuHçLÐx"aB ýZM×Iï4YB”A Blt` BI3 otaB ý8ðT¸ð Àfaý”`  g °faýN`aÿ^ ‰Þü"Lß@`3 Nu4P1WRQ AFIX gFPQRR IEFWRR SA7W ƒ68K PASCAL WRITE FFP REAL SUBROUTINEL2h.PFFPA h.PQSOP H.PQWRR ¦h.PQRTD7 h.PIWPTR h.PLBLKS (ÎF3 Dl8< Dn4 45@m,R4@ 4:@f¼0@``SD Dlâ Dl|1L3„ R‡Nu Ef<0`F RŒNuaì…aA ¢Nuaâ +f ¼ aA �`¼-aA † .I3€ fRŒNu @l0< ,0fv`v8_Daÿ\aºa®¼.aB ÿPa¤4QB2<`a˜R3! RA²Boø¼EaB ÿ4S‡Jg~ ‡m ¼+aB ÿ` ¼-aB ÿD‡�ü 0‡aB ÿL3 HG0‡aB þöNu8ØGSDaþê Go:8˜A˜GUDaB þØaÿ64<`aÿ"RB´Goö¼R3 ‚ .aB þ¼4<`aÿ RB´Aoö`L8˜AWDaB þ aþþ¼0aB þ”¼.aB þŒDG²Gl>43D aA ¾SBnìaA ¶€ Am Zo �Lß ŠNup3NNALSERUE 4W1RDSTR AFIX gIOSRR RDSTR SA#U ƒ68K PASCAL READ STRING OR VECTOR SUBROUTINE+2p.PGETCH p.PIRPTR H.PRDSTR (*43 LÐ 8+24aA òµëgaA èJAgîÀSA`è”A ŠNu4G U1SBLKS AFIX gIOSRR SBLKS SA$F ƒ68K PASCAL SKIP LEADING BLANKS SUBROUTINE+2p.PGETCH p.PIRPTR H.PSBLKS (3B aA þ faA ô`ðNu4a1GETCH AFIX gIOSRR GETCH SA " ƒ68K PASCAL GET CHARACTER FROM INPUT BUFFER SUBROUTINE 2p.PRDBUF H.PGETCH (&3 faA ú8+gp"NNB€Nu4_1IRPTR AFIX gIOSRR IRPTR SA! ƒ68K PASCAL INCREMENT INPUT COMPONENT PTR SUBROUTINE2H.PIRPTR ($3 R“µëf•Ê`RеëfÄ7DNu4R1PEE AFIX gIOSRR PEE SA"  ƒ68K PASCAL PEEK INTO A FILE SUBROUTINE 2H.PPEE p.PRDBUF (*23€ .$P f/ &haA ð8+gp"NN Š&_ JNu4`1GET AFIX gIOSRR GET SA  ƒ68K PASCAL ADVANCE FILE COMPONENT POINTER SUBROUTINE 2H.PGET p.PRDBUF (JH3@ ./ LÐ 8+ faA î8+gp"NNR“Ôëµëmng Ä7D3 `•Ê Š&_Nu4X1GETINT AFIX gIOSRR GETINT SA 4 ƒ68K PASCAL COLLECT INTEGER DIGITS SUBROUTINE+2p.PGETCH H.PGETINT p.PIRPTR (J3 z"Bv 0m 9op1NN`@JEoJf 0g 0ÀPÁSE`RCaA ÈaA Ä J3 am zn 0m 9oÀ #f¬ÃJEoÀSE`RCBaA ŠaA † aF3 m zn 9o Am0 oJ@m @op1NN`TJEoJfL3P gÀPÁSE`RCaB ÿ.aB ÿ* am zn 9o Am0 o3 Jm o¬E"DENu4]1MAKINT AFIX gIOSRR MAKINT SA!9 ƒ68K PASCAL MAKE AN INTEGER FROM DIGITS SUBROUTINE2H.PMAKINT (^F3 B@BAt JEoNv #f(J@gpbNN` Ac AcpbNN`4B@BA`´Cn$3 pcNNÀÂÂÂÒƒHA6HAЃSE`°H@0Nu4W1RDBUF AFIX gIORR RDBUF SA ƒ68K PASCAL READ BUFFER FROM FILE SUBROUTINEL2p.PASGNF p.PCFLDAD p.PCLOSE H.PRDBUF p.PBUFSZ p.PFLSCN (þH3 HçøÐ2+$KaA ôHÀgS€`R€@ÿþЫS€'@fpCNNAë0¼NBJ3@€ gz Ægt ÂgNNA€7A gXaA ž5´5cJaA ��7AR55L3D H‚5 J /g RB5 J /fôRB‚aB ÿ^2*aB ÿV5ALß `ÿJ•Ê`8�D3 $k +g�J€fÁ¼ ` J€g0+HÀS€ÐŠ'@7ALß Nu4M1ASGNF AFIX gIORR ASGNF SA8 ƒ68K PASCAL ASSIGN FILE SUBROUTINE2H.PASGNF ($*3 Aê$0¼@NCgNN$-0*)Â+B0ÁNu4X1BUFSZ AFIX gIORR BUFSZ SAT ƒ68K PASCAL FIGURE OUT BUFFER SIZE SUBROUTINE2H.PBUFSZ (3 0<…f0*Nu4M1CLOSE AFIX gIORR CLOSE SA8 ƒ68K PASCAL FILE CLOSE SUBROUTINES$2H.PCLOSE H.PCLOSPL (283 gH瀀Aê$0¼NCgNNLßNuaÞAý¿?* „6Nu4Y1CFLDAD AFIX gIORR CFLDAD SA ƒ68K PASCAL CALCLUATE FIELD ADDRESS SUBROUTINE2H.PCFLDAD ((.3 g0<$`g0<(`+OSH€å@@,Nu4P1FLSCN AFIX gIORR FLSCN SA  ƒ68K PASCAL FILE LIST SCAN SUBROUTINE+2p.PDFLT p.PEDTFIL H.PFLSCN (*43 Aõ JHçMë$aA òLßpaA ê€ÿ€üg/p(NNNu4a1LDC AFIX gUTILRR LDC SA24 ƒ68K PASCAL LOAD CONSTANT STRING AND VECTOR SUBROUTINE/2H.PLDCS H.PLDCV p.PALSTS (*23 pþ`B@ _.8˜@gAðaA ê"OUDg"ØYDnúm2ØNÐ4G b1LODV AFIX gUTILRR LODV SA3 ƒ68K PASCAL VECTOR LOADS DIRECT AND INDIRECT SUBROUTINEM2H.PINDV H.PLODV H.PINDVL H.PLODVL p.PALSTSL (8@3 "_. 0HÀ`"_. (aA ì$O"gØS€nú`U„g$ØY„núm4ØNÑ4W1STCV AFIX gUTILRR STCV SA5P ƒ68K PASCAL STORE CONSTANT VECTOR SUBROUTINE/2H.PSTCV H.PSTCVL p.PSTOREV ("3 $_. 0HÀ`$_. "JaA ìNò84W1STOV AFIX gUTILRR STOV SA62 ƒ68K PASCAL STORE VECTOR INDIRECT SUBRUOTINE/2H.PSTOV p.PSTOREV H.PSTOVL ((03€ $_. 0HÀ`$_. "R�Aÿþ w"OaA àO÷8NÒ4U1STRV AFIX gUTILRR STRV SA7 ƒ68K PASCAL STORE VECTOR DIRECT SUBROUTINE/2H.PSTRV p.PSTOREV H.PSTRVL ($3 $_. 0HÀ`$_. "OaA ìO÷8NÒ4V1STOREV AFIX gUTILRR STOREV SA6 ƒ68K PASCAL STORE VECTOR SUPPORT SUBROUTINE2H.PSTOREV (6<3 &RƒCÿþ(gÙS€nú`â€UÁâ€UÂg ÙS€núJg0ÙJgÙNu4R1EQUV  AFIX gUTILRR EQUV SA13 ƒ68K PASCAL COMPARE VECTORS SUBROUTINESº2H.PGEQV PH.PEQUV H.PGRTV @H.PLEQV 0H.PLESV H.PNEQV H.PGEQVL XH.PEQUVL H.PGRTVL HH.PLEQVL 8H.PLESVL (H.PNEQVL (¬F3 a^WÀDNÒa`WÀDNÒaNVÀDNÒaPVÀDNÒa>UÀDNÒa@UÀDNÒa.SÀDNÒa0SÀDNÒF3 aRÀDNÒa RÀDNÒaTÀDNÒaTÀDNÒ$o0HÀ`$o . &RƒCÿþCïA÷23 8Öƒâ€UÁâ€UÂg±‰fS€nøJg±IfJg± _O÷8NÐ4a1LODS AFIX gUTILRR LODS SA2G ƒ68K PASCAL DIRECT AND INDIRECT STRING LOAD SUBROUTINE/2H.PINDS H.PLODS p.PALSTS (&3 $_. 8TDaA ö"OUDg"ØYDnúm2ØNÒ4U1STRS  AFIX gUTILRR STRS SA6E ƒ68K PASCAL STRING DIRECT STORE SUBROUTINE2H.PSTRS (4:3 "_. 2RAAÿþU@°Am0`>€R@@ÿþ$OJ@o ÚY@núf0’O÷NÑ4W1STOS  AFIX gUTILRR STOS SA6 ƒ68K PASCAL STRING STORE INDIRECT SUBROUTINE2H.PSTOS (8>3 "_. 2RAAÿþU@ w°Am0`>€R@@ÿþ$OJ@o ÚY@núf0’O÷NÑ4R1EQUS AFIX gUTILRR EQUS SA1 ƒ68K PASCAL COMPARE STRINGS SUBROUTINES`2H.PGEQS (H.PEQUS H.PGRTS H.PLEQS H.PLESS H.PNEQS (”F3 a.WÀDNÒa&VÀDNÒa]ÀDNÒa_ÀDNÒa^ÀDNÒa\ÀDNÒ./Eï46RCCF3 ÿþCò026RCCÿþHq00°Bo0J@g³ fS@nøp ”Agma `aLß.HNѰ3 fSBnøNu²fRBmöNu4W1NEW AFIX gUTILRR NEW SA3@ ƒ68K PASCAL NEW (HEAP ALLOCATION) SUBROUTINE/2H.PNEW H.PNEWL p.PCHKOVF (‚J3@ ."GaA ú(` ."GaA îB„8R„„ÿÿÿþ.‰v¸ƒl(X„"mQ‰$I&)g""C¸‘nòF3 �„ €lX‰%Q`*"€ÓÀ"Ä`""mEñH ¿ÊbpNNEêÿØQ‰$Ñ"Ä$Ñ+J ‰3 Nu4]1DIS AFIX gUTILRR DIS SA0E ƒ68K PASCAL DISPOSE (HEAP DEALLOCATION) SUBROUTINE/2H.PDIS H.PDISL p.PCHKOVF (pH3 T—T—.aA ø$PB� mQˆµÈbVB€“É("µÈb "H h`ò%H#J"gÒ�µÁb •È63 ØŠ „$H#J" Ò„³ÁbJ€f $‘PŠ+J`" ’ŠÒ‘$� @!JNu4H U1MRK AFIX gUTILRR MRK SA3( ƒ68K PASCAL MARK (HEAP MARKING) SUBROUTINE 2H.PMRK p.PCHKOVF (3 .aA ü ­Y�Nu4]1RLS AFIX gUTILRR RLS SA4 ƒ68K PASCAL RELEASE (HEAP DEALLOCATION) SUBROUTINE 2H.PRLS p.PCHKOVF (6>3 .aA üYˆ"mQ‰³Èc""i³Èbø g Б±Àb I"ipÿ À É+HNu4_1CHKOVF AFIX gUTILRR CHKOVF SA)F ƒ68K PASCAL CHECK FOR STACK HEAP OVERFLOW SUBROUTINE2H.PCHKOVF (3 Oïÿà¿íOï bpNNNu4c1CVBSV AFIX gUTILRR CVBSV SA)X ƒ68K PASCAL CONVERT STRING S->V STR UNDER VEC SUBROUTINE 2H.PCVBSV p.PCVTSV (.63 .R@@ÿþ24A÷ÔPUAo!`YAnøf1`0‚Ð@`A ÖNu4Z1CVTSV AFIX gUTILRR CVTSV SA0& ƒ68K PASCAL CONVERT STRING TO VECTOR SUBROUTINE/2p.PALSTSL H.PCVTSV H.PCVTSVL (bF3 HÀ _.2HÁ6< R€@ÿþgƒR�(˜�g:nE÷C÷U@g#"Y@núm3".I*3 `"OaA º$OU�g m $ÙY�núm4Ù4ÃU„núNÐ4`1CVTSU AFIX gUTILRR CVTSU SA0 ƒ68K PASCAL CONVERT STRING TO UNNORMALIZED SUBROUTINE 2p.PALSTS H.PCVTSU (NH3 _.U@2RAAÿþR@@ÿþ8˜Ag2nC÷E÷>€g%!Y@núm5!.JNÐ"OaA Æ$OJA3 g$ÙYAnúm4ÙNÐ4`1CVTUS AFIX gUTILRR CVTUS SA0@ ƒ68K PASCAL CONVERT UNNORMALIZED TO STRING SUBROUTINE2H.PCVTUS (063 _.R@@ÿþC÷2RAAÿþE÷µÉgJAg#"YAnúm3".INÐ4O1SLEN AFIX gUTILRR SLEN SA5$ ƒ68K PASCAL STRING LENGTH SUBROUTINE2H.PSLEN (3 _.02RAAÿþÞÁNÐ4V1SCON AFIX gUTILRR SCON SA4& ƒ68K PASCAL STRING CONCATINATION SUBROUTINE 2H.PSCON p.PALSTS (JH3 _.4$O6RCCÿþC÷028aA æHq@ÒÁ0g!S@nú"_ÒB0R@@ÿþÔÀJ@g"3 S@nú3.INÐ4P1SCOP  AFIX gUTILRR SCOP SA4@ ƒ68K PASCAL SUBSTRING COPY SUBROUTINE 2H.PSCOP p.PVALSI (rH3 _.46RCCÿþC÷0aA ìfBA`PS@8˜@²Do2JAg@E÷0²Df8µDDg*83 g’ÁS‰ÚS@nú’Á`R@@ÿþÔÀµÉg"S@nú`”À"J.I?NÐ4T1SPOS AFIX gUTILRR SPOS SA56 ƒ68K PASCAL SUBSTRING POSITION SUBROUTINE2H.PSPOS (bF3 ."O20R@@ÿþEñ40R@@ÿþHrB@JAg6”Am2RB0SA I?¶fJAg ( (3 µ f SAnø�BR@` 2$D"HSBnÞB@2.W GNÐ4R1SINS AFIX gUTILRR SINS SA5 ƒ68K PASCAL STRING INSERTION SUBROUTINE+2H.PSINS p.PALSTS p.PVALSI (lJ3 _.4$O6RCCÿþCò02gEï aB ÿ /€ AïCï EïaX3 €P B ÿaB þüA×Cúÿ"E×aB þð €AïC×EïaB þÞaB þÚSo?oHBoIúB þÐB¯$B¯I3 (B¯,|€(B¯0B¯4B¯8<<`n/|€ÿÿ€aB ýÎðWÞü NuÞüA3 B>¼?ÿB¯/Gp`ÞüBB¯B¯J€k>¼?ÿp`>¼@pHzÿ¾`B ýŠ4K1LOG  AFIX gFPSRR LOG SA ƒ68K PASCAL LOGARITHM SUBROUTINEm2H.PLOG p.PADX p.PDVX p.PNORM p.PMPX p.PATANH2 p.PCORDA p.PFPERR p.PFPOINT (RH3€ ÿÿ±r÷ÑÏy«€.žü aA àðoL× @?ÿgò @¿ÿgêJ�fF3 J‚gô @ÿbØã@â@€ÿÿJ�kS@ãŠã‘jøH×`.€B� @g2jDAÀHAO3� 0<S@ã‰júB‚BoHçàA×CúÿhE×aB ÿbžü AïCúÿbE×aB ÿP /€EïaB ÿBU3D /€C×aB ÿ6Þü IúB ÿ6<<aB ÿ&RoA×Cï aB ÿaB ÿÞü @?þc @Àdâ‰I3 â’R@ @ÀfôHïã˜âX>€aB þèðWÞü NuÞü>¼?ÿB¯/Gp`Þü>¼¿ÿ3€ B¯B¯pHzÿÊ`B þ°4L1ATN  AFIX gFPSRR ATN SA ƒ68K PASCAL ARCTANGENT SUBROUTINEm2H.PATN Hp.PATAN2 p.PADX p.PDVX p.PNORM p.PMPX p.PCORDA p.PFPERR p.PFPOINT (¢F3 ÉÚ¢!hÂ4€€€ÀH3€ À.žüaA °ðoL×HÀã@â@€€ÿÿ.€ @?ÿf8 �f ‚fL3 ?zÿ€/zÿ|/zÿz`B—/GpaB ÿb`˜`fE×aB ÿT @ÿðoT/@ jBRJ@U3 k AúÿHCÒaB ÿ6  @ÿðo IúB ÿ*BFaB ÿ$`ahJokAúÿCÒ €aB ÿ aB ÿJ/ I3 j €`a@  @?ÿc @ÀdLïâ‰â’R@ @ÀfôHïã˜âX?@aB þÄðoL3 ÞüNuHïAïCïEïaB þ¢AïCúþÊEïaB þ’ /€Aúþ CïEï13( aB þ|aB þxAïCïEïaB þhLïNu4P1CORDA  AFIX gFPSRR CORDA SAT ƒ68K PASCAL CORDIC INVERSE SUBROUTINE+2p.PADX p.PNORM H.PCORDA (ÞF3 HçàžüJ?FH/R/j/j B—B¯B¯B¯ B¯B¯|€ F@gˆF3 /|ÿÿ`„A×C×E×aB ÿ0A×CúÿZE×aB ÿ$ €Aúÿ@C×Eï aB ÿaB ÿ`TA×C×Eï aU3€€ @ B ÿAï Cúÿ4Eï aB þðAúÿCï Eï aB þàaB þÜA×Cï Eï aB þÎ`aL`ºAï L3 C×Eï aB þ¸Þü  @?þc @ÀdL×â‰â’R@ @ÀfôH×ã˜âX?aB þˆðWÞüI3 Nu,.žüHçžü$aB þjðoLïHÀã@â@€€ÿÿ/@ @?ÿg  @ÿðI3 l Hï(Þü$NuAïCúþDE×aB þ&L× @ÿþo”@?D@o: @!làªdRBáªd I3 RAdâ‘â’Ro`@ à©dRAá©dâ‘RoB‚HïA×CúýÒEï aB ýÊ /€ AïU3�( Cï EïaB ý´aB ý°A×Cúý¶Eï aB ý¢ /€ AïCï EïaB ýŒaB ýˆB¯(B¯I3 ,B¯0B¯4B¯8B¯<|€8IúB ýfB—/T/lJoj /€4` €AïC×I3 EïaB ý:<<`rLï4�FHï Lï(�FH×Joj €` /€ Aï4C×O3 Eï4aB üúAï(Cï Eï(aB üê.¼ÿÿ/\/\Jok¼€AïC×EïaB üÄRF?3 F?oˆ <ÿÿ"$,Þü$T—NuÞü6>¼?ÿB¯/G0<Hzþ`B üŒ4U1MATHX  AFIX gFPSRR MATHX SA2 ƒ68K PASCAL EXTENDED MATH PACK SUBROUTINESk2H.PADX LH.PDVX �H.PNORM ¶H.PMPX H.PSQTX ¶ëòYºÅÕºš¬/mÆú­Û–~ôãÿUnê]‰*ÿê«wnSVÿýU[»©rF3 ÿÿªªÝݹÿõUVîî?ÿþªª·wÿÿÕUU»ÿÿúªª­ÿÿÿUUUÿÿÿꪪÿÿÿýUUF3 ÿÿÿÿªªÿÿÿõU?ÿÿÿþªÿÿÿÿÕÿÿÿÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF3 ÿÿÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF3 ÿÿÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF3 ÿÿÿÿÿ?ÿÿÿÿÿÿÿÿÿÿÿÿF3 ÿÿÿ?ÿÿÿÿÿÿF3 €@ 3 ›tí¨C^Zg4W1ATANH2  AFIX gFPSRR ATANH2 SAE ƒ68K PASCAL ATANH OF NEG POWERS OF TWO TABLE2H.PATANH2 (F3 ŒŸSÕhT»Ab»êQFœ +9=]îÓXŠÓu¬ÜªÄH×q%V"+G&ª±#ZF3 UUˆˆ­€ ª¬DD@UUb" *ª«UUXªªªUUªªF3 UU€ ª@U *F3 €@ F3 €@ F3 €@ I F3 €@ F3 €@ 3 Ôl‘yQ‡ž4d1GTM AFIX gFPSRR GTM SA ƒ68K PASCAL GET FLOATING POINT ARITHMETIC MODE SUBROUTINE 2H.PGTM p.PFPOINT (,43 W.aA úð@0àHrÂtäHÄvâHÆâH"OÀÃÂÁNÐ4d1GTF AFIX gFPSRR GTF SA T ƒ68K PASCAL GET FLOATING POINT EXCEPTION FLAGS SUBROUTINE 2H.PGTF p.PFPOINT (3 .praA øðA0AÿNu4W1GTT AFIX gFPSRR GTT SA7 ƒ68K PASCAL GET TRAP ENABLE FLAGS SUBROUTINE 2H.PGTT p.PFPOINT (3 .praA øðA0AÿNu4d1STM AFIX gFPSRR STM SA4 ƒ68K PASCAL SET FLOATING POINT ARITHMETIC MODE SUBROUTINE 2H.PSTM p.PFPOINT (^F3 _."O RÄb* RÄb 〠RÄb〠RÄbå€JgpT(3 NN`aA ¸ðC0à[à[aA ªðC NÐ4d1STF AFIX gFPSRR STF SA ƒ68K PASCAL SET FLOATING POINT EXCEPTION FLAGS SUBROUTINE 2H.PSTF p.PFPOINT (",3@ .JkaA øð@0aA îð@ `pSNNNu4b1STT AFIX gFPSRR STT SA ƒ68K PASCAL SET THE FLOATING POINT TRAP MASK SUBROUTINE 2H.PSTT p.PFPOINT (",3@ .JkaA øð@0aA îð@ `pRNNNu4Y1NAN AFIX gFPSRR NAN SAW ƒ68K PASCAL GENERATE A NOT-A-NUMBER SUBROUTINE 2H.PNAN p.PFPOINT ($,3 _.J€fppNN/B§?<N”&mBX‹+KB8D:/8æ\F3 D8DD8ì\?D>é_H‡GC×&oÞG0{pNû€ `°L3 JÒàîfÂö\²²²²²'o B+aB Öf˜aB *f�)H„ØDØD4|F3 ÔÄÔÄÔÄÕïÕü HÒ`j'o B+)H„ØDØD4|ÔÄÔÄÔÄÕïÕüI3 aB Ú`:'o B+/ oI3 `ôH…ÚE>;PÈG>;P¸GaB "fä&H&/H…ÚE>;P¬:;P°HÅ$oÕÅF3 WÆfN”` Gf4“`$“` I3 / o`dH…ÚE>;PÒG>;PÂGaB ’fH&H&/H…ÚE>;P¶F3 :;PºHÅ$oÕÅfWÆDGN”` Gf6’`&’`'o +F3 @`ø'o B+`Þ'o B+`Ð'o B+/ m`L3" ¶aB øfºaB Lf²)H„ØDØD4|ÔÄÔÄÔÄÕïÕü / o`xL3 \H‡aB 8/ g aB €HÒ`d'o B+)H„ØDØD4|ÔÄÔÄÔÄÕïL3@ Õü LÒvJ / o` g H‡aB ÐaB $HÒ`'o O3€ B+aB 4föaB ˆfî) o`ÒH‡aB ø`Ô'o B+,-B/F3 f,&mBEï <<><N”&mBT‹+KB8/ ,-BU†`H„HÄ/H…äMEO3 &oaB dgÜ„+FB`n'o B+|aB ”fV$$HaB 6f*@F3 &JEï f <`<ÿ><ÿÿN”`€`'mBB+&o0< aH3€ A <&o+‰+È+g"B€Bf RX€`ô"oÓÀ"QOï$NÑOï$NuF3 å�ë <?ÿB�$+NuPÄ?`BgHçÐ’R@*@Lª0 : 8 ÀÂÈÂHBÊÂ.F3 Ú„ßGHGH@ÐEHE>߃8 < : ÌÂHBÊÂÈÁÞ†,ÝCÞ…ÝCÞ„ÝC8ÈÂHFHB: ÊÂØ…ÝC: ÊÁF3 Ø…ÝC: HAÊÁØ…ÝCHFHGÞDHGHDÝDHFÝCHF8ÈÂ*Ü„ÛC8 ÈÁÜ„ÛCHA8 ÈÁÜ„ÛC86 F3 ÈÁHAÆÁ؃vHEÛCHEHFÜDHFHDÛDHEÛCHE8ÈÁÚ„"$&†@H@†@ J�m ãƒã’ã‘I3 S@ @ÀfJ�fJ‚f ãƒã’ã‘S@Lß8J_gNuaB  èNuLÒ8 €€€ ƒ€€F3 €€ÿÿƒ€ÿÿü¶€f¸�fº‚f `.e†€k `F3 `†€k `Nuü+f `J€k `F3 Nuü+f `Jk `Nuax`ÿ>ü+fF3 `B@2ã˜ãIãP;ƒNuüNuüNua0WÆaJfF3 þôJgþî`àagÚ`þÞa0gÐ`þØa&`þÐ,Œ‚f <À<` S@ãŠF3 ã‘jøNuLÒ8,Œ…f&<À<` SCã�ã”jøNuB@)åHA€A;oI3 aB ý8<Nuÿÿÿÿÿÿÿÿÿÿÿÿÿÿ HçpF3 B@)f&H€Ð@Ð@0|ÐÀÐÀÐÀÑéÑü p<` €ãH0{Nû€F3 €„Š�–œ¢¨‚‚‚‚‚‚‚‚ÈÐØàèðø*Ln�²ÔöF3 $Dd„¤Ää0\ˆ´à 8d�è@˜ðH øPxœÈ ‚‚‚F3 AÕ`(Aí`"Aí`Aí `Aí`Aí` Aí`Aí) fVˆ fF3 Tˆ`´ m `œ m$`” m(`Œ m,`„ m0`| m4`t m8`lF3 m<`d m ")H€ãHEúþ”02HÀÒ€+A `B m$")H€ãHEúþr02F3 HÀÒ€+A$` m(")H€ãHEúþP02HÀÒ€+A(`þ m,")H€ãHEúþ.F3 02HÀÒ€+A,`Ü m0")H€ãHEúþ 02HÀÒ€+A0`º m4")H€ãHF3 Eúýê02HÀÒ€+A4`˜ m8")H€ãHEúýÈ02HÀÒ€+A8`v m<")F3 H€ãHEúý¦02HÀ €fR€Ò€+A<`H)H€ãHEúý~02HÀ m ‘À+H F3 `()H€ãHEúý^02HÀ m$‘À+H$`)H€ãHEúý>02HÀ m(‘À+H(F3 `è)H€ãHEúý02HÀ m,‘À+H,`È)H€ãHEúüþ02HÀ m0‘À+H0F3 `¨)H€ãHEúüÞ02HÀ m4‘À+H4`ˆ)H€ãHEúü¾02HÀ m8‘À+H8F3 `h)H€ãHEúüž02HÀ m< €fR€‘À+H<`<&mBEé <<><F3 N”&mBT‹+KB0) HÀ m ÑÀ`&mBEé <<><N”&mBT‹+KB0) HÀ mF3 $ÑÀ`ä&mBEé <<><N”&mBT‹+KB0) HÀ m(ÑÀ`¸&mBEé <<F3 ><N”&mBT‹+KB0) HÀ m,ÑÀ`Œ&mBEé <<><N”&mBT‹+KB0) F3 HÀ m0ÑÀ``&mBEé <<><N”&mBT‹+KB0) HÀ m4ÑÀ`4&mBEé F3 <<><N”&mBT‹+KB0) HÀ m8ÑÀ`&mBEé <<><N”&mBT‹+KBF3 0) HÀ m<ÑÀ`Ü&mBEé <<><N”&mBT‹+KB<) >FÿH†HÆé_JGmF3 GåO05pHÀ` GåO 5pІ m ÑÀ`„&mBEé <<><N”&mBT‹F3 +KB<) >FÿH†HÆé_JGmGåO05pHÀ` GåO 5pІ m$ÑÀ`,F3 &mBEé <<><N”&mBT‹+KB<) >FÿH†HÆé_JGmGåO05pHÀ`F3 GåO 5pІ m(ÑÀ`Ô&mBEé <<><N”&mBT‹+KB<) >FÿH†F3 HÆé_JGmGåO05pHÀ` GåO 5pІ m,ÑÀ`|&mBEé <<><F3 N”&mBT‹+KB<) >FÿH†HÆé_JGmGåO05pHÀ` GåO 5pІ mF3 0ÑÀ`$&mBEé <<><N”&mBT‹+KB<) >FÿH†HÆé_JGmGåOF3 05pHÀ` GåO 5pІ m4ÑÀ`Ì&mBEé <<><N”&mBT‹+KB<) F3 >FÿH†HÆé_JGmGåO05pHÀ` GåO 5pІ m8ÑÀ`t&mBEé F3 <<><N”&mBT‹+KB<) >FÿH†HÆé_JGmGåO05pHÀ` GåOF3 5pІ m<ÑÀ`&mBEé <<><N”&mBT‹+KB0) HÀ @`ô&mBEé F3 <<><N”&mBX‹+KB i `Ð mB&mBEé <<><N”&mBT‹+KB0) F3 HÀÑÀ`¬ mB&mBEé <<><N”&mBT‹+KB<) >FÿH†HÆé_JGmGF3 åO05pHÀ` GåO 5pІÑÀ`T)H€ãHEú÷‚02HÀ&mBEé |> GF3 fRGN”Aé @fRˆR@&mB×À+KB<`p<`p<`p<I3 `&ip aB ô2<ÿLßNu/€€ÿÿ @?ÿf (㌈‚f €`€F3 `P @Àf0(ˆ‚f €`f €`€`fF3 €`€(NuNuLÒNu(±„„€g+D Df ÀL3A `€Nu+gaJg 0<aB óZ` 0<aB óNNu <?ÿB�$+NuF3 <ÀB�B‚Nu <?ÿB�B‚J NuaòÀNu(±„„€NuaòaЀ„NuaêaÔ€„NuëR3„ aðNu0<aB òðNu0<aB òæNu0< aB òÜNu0<aB òÒNu+faê` J€F3 jaÞNu2d–Èú,6@JTzF3 ÞG,HFÌE;`Ô Gl *ÈEÜ;@Ü{pœ<;`(N»`$Nu (‘3ÿÿþ B €B €B þŠB þŠB €B €B þ’B þŠB þŠB €B þŒB þŒB þ¾B þŠB þŒB þŒB þŒB þŒB þŠB þŒB €B €B þŠB þŠB €^s3g ÿ ^vv^^fvv^B þŒB þŒnvB þŒB þŒB þŒB þŒvB þŒ^^vv^B òRB ÿ B ÿ(B þŠB òRB ÿ B ÿ B ÿD¦3ÿÿÿÿ B þŠB ÿ B ÿ(B ÿDB ÿ(B þŠB ÿ(B þŒB þŒB þŒB þŠB þŒB òRB ÿ B ÿ(B þŠB òRB ˆB ÿ0B ÿ B þŠB ÿ:B ÿ B ÿ:B ÿ B þŠB ÿ B ÿ(B ÿ(B ÿ:B þŠB ÿ(¦3ÿÿÿÿ B þŒB þŒB þŒB þŠB þŒB ˆB ÿ0B ÿ B þŠB ÿ:B øB ÿNB þŒB þŠB ÿNB þŒB ÿNB þŒB þŠB ÿNB ÿNB ÿNB ÿNB þŠB ÿNB þŒB þŒB þŒB þŠB þŒB øB ÿN¦3ÿÿÿÿ B þŒB þŠB ÿNB ódB ódB óÌB ôTB ô B ódB ô^B óÌB ôTB ô~B óöB óöB ô(B ôTB óöB ôTB ôTB ôTB ôTB ôTB ô’B ôˆB óÌB ôTB ôhB ÌB þŠB þŠB þŠ‹3ÿÿøˆ B ÂB B B B B B ÐB þŠB ÿbB þŠB ÿXB B B B B B B B B B @`B @`B ý&@`L3ˆ B ýJ@`B ýB8PÄ?`BgLÒÐD@Ø€ D(*HÒ8+0è ;@ÖpJf¼�F3 f¾‚f ò0`.e ò0ž‚��ã‡ã–UÅSjpRSfÆŽކgò0LÒI3  J�k ãƒã’ã‘S@ @ÀfJ�fJ‚f ãƒã’ã‘S@J_gNuaB NuHçÀF3 Gÿ8DÈü Lû@BAú¾êOg2$˜%X%XBƒâOdHç€+|aI3€ B ïÞ_L߀JG`ÌLßðNu€ È úF3  œ@ÃPô$˜–€¾¼ F3 îk(!•ù$ºC·@'èÔ¥+‘„ç*.F3 µæ ô€1ã_©1 5ŽÉ¿8±¢¼.Å;Þ k:v@?ŠÇ#F3 ‰èB­xëŬbEØ×&·z€I‡†x2n¬�L©h? W´OÓÂÎÌí¡F3 S„YQa@„ V¥o¥¹�¥ÈYÎË�'ô :]�?9xø” „`¡�×6¹ åcF3 ÉòÉÍgNßfüo|@E�"–j�Å­¨+pµžÔÂxIÿϦÕ©“ºGÉ€éŒàRª~ëûF3 �ùÞŽ¤ã ®¦‘Ç IÉvu†�u “ž‹;]Å=]å5&Ä`RŠ —›ÿÿÿÿÿÿÿÿX3> ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿB fB øB ÀB €B fLÒv~)(HDD;@ÀjaB ùZ`êU3ð GlãO8;@ÈN»@Ä` GlÆWGãO8;@ N»@` B ~B ÀB ¨B ÄB XUGknfL3 6?aB ð6f]@j Þü`Âf|~þÇH $ON”Þü$@&H`0ß`2/aB ðf]@I3 j Þü`Žf|~üÇH $ON”Þü$@&H` ß`6aB ïÎf]@j ÞüRO`F3 Xf|~ÿÇH $ON”ÞüRO$@&H`ß`8z)åä Gf Eo0< L3@ aB ìz``åM5P>aB  Nuÿ‚ü€ÿÿÿÿÿÿÿÿÿÿø GgI3 Â+0E:TE°{pÌmÂJ�j�aB 6°{p¾m€+flë+fF3 ë` `J<Ìü+gJ€kAúÿ|Lð```à`J€jF3 Aúÿ`Lð`À``À` ë`p`*Aúÿ0°ppfS@`0< aL3€ B ë|+gJ`D`2+faà+fë`aB ZëI3 `J‡fR@�à‰$‚€H@B@‚€�/aB îf]@j Þü`Øf|F3 ~üÇH $ON”Þü$@&H` ß`f@ÿ&ƒ€ãŠã‘H@HA0HB2éˆé™(éšzÈEI3€ |ðÂF€D‚B€ƒHçÀaB í¬f]@j Þü`rf|~øÇH $ON”Þü$@&H` ß ß`I3@ R&ƒ€H@€€ƒHA0?HB2HçÀaB íZf]@j Þü ` f|~öÇH $OF3 N”Þü $@&H` ß ß0ßNuJGf‚?ÿÿ <€€‚`& Gf(" <ð`F3 (B�HB2 2F3 pHÇgE× oØS`ò`&HE×f <`<ÿN”)H�F3 ãI&o"0{Nû€¸�,88 "tvH@HÀîH€@በ@€f@�F3 0ãŠãQãŠãQãŠãQãŠãQãŠãQ4HB2<�gë+F3 f&`L @üf<�(ˆ‚g(R@+gJ�m ãŠã‘S@J�`òaO3€( B ûØ`0<À` ÁaB ûÄaB í~`â0"/$/vHÀãHâ@ @?ÿf&�gF3 ë+f–`: @Àf.(ˆ‚g"+gJ�m ãŠU3P ã‘S@J�`òaB ûN`aB ûFaB í`dH�HÁ~aB úˆ`T2HÁ~aB úz`F"~aO3€( B ún`:"o)HƒÆü $iÕü ÕÃC×aB ®aB ì®`H@@€@H@<`žDj DGÉ@ËAÍB GAcJ�kÇŒ…VÃ`† DSGF3 kâ�â–â“UĆQÏÿô(ˆ…kÇ(±„j@Çx²…dÁˆ0D‚@�`(fF3 ´†dÁˆ0D‚@�`Dƒ@†@…`Dƒ@†@…Ô†Ó…dfâ‘â’â“UĆR@F3 (ˆ‚ˆƒf(J‡k0<À€+ fÀ`J�kJ‡kxAã‹I3 ã’ã‘S@J�[ÌÿôaB úÆNu|rtxžEJ1Pf REQÏÿôNu1PèŽãŠã‘&(ãŠã‘ãŠF3 ã‘Ô„ÓƒxÔ†ÓD1PãŠã‘&(ãŠã‘ãŠã‘Ô„ÓƒxÔ†ÓDRQÏÿºNuz~ a–0<?F3 J�m ãŠã‘S@J�`òNup f <€è  f <?ÿB�$) L3 Nu  f`B ëÀ  f`B ëÀ)()ˆ©ˆi J„f0<ÀÀB�B‚NuI3€ z~aÿ gDB5Baÿ^/ Hçà) c p aB ÞŒ:<>*žE+I3 +ü„gDGÄaB îb_$Ÿ%_%_v«gJ„j 0<¿ÿL3" `0<@`J„k aB ÞJ`aB íx"_v @?þcL @ÀdDJ@j"ë+R3@@ g `B ê¨`aB ù&`ë+g `B êˆ``B ù¢NuH‡ GoF3 ><ë¼(JGf><ë¼(Nû@F/</</<JGkSG`F3 DGGÿJ€jG?`P//</<?<À`:`6`¸``â`$/</<F3 /<J€k?< `?<°` J�fJ‚f`„?+|Hçà€ÿÿÿ €Àf F3 2<ì»`”ãŠã‘J@j ÀD‚@�@@|âHâ‘â’J@WÎÿö0<�FJ�fJ‚g``L3 @ Z€€ÿÿ$¼ÿþ%|š š„%|ûÏ÷™Hç@aB Ü´JƒgaB ô&«gF3 BA`|œ@ì©J€jDAL߀8BgJGj |ÜDœGn|` Fo|`I3 <JGj ¾Do8zÚDšF0G>[ÅjDGaB ì>$¯%o%o BRHç @L3ˆ vH@B@H@Jk aB ë>`aB ÜLßÐJƒg7o++J/jL3 ÀH§ >aB óJf€€ÿÿJ�k À`À(*,aB ë„„?L3D BHÒp*f aB Üž`aB ÝÄJof f6ŸLŸÐRWRD`þæ fO3@ >/SGaB ë2HÒRo`4>/SGaB ëJof$J/jaB Ü> f6ŸLŸI3@ ÐRWSD`þ–6Ÿ*gp`0*aB ö OŸüHGHFHEHDI3 p2/jDAf0` pãAYÈÿü5AaB ¬0/S@Jo[ÀI3 J/[Áð‚+aB Ýbf]@j Þü`6f|~òÇH $ON”Þü$@I3 &H` ß ß ß0ßßü$Ÿ%_%_7_NuaB Ýf]@j Þü`"f|~òÇH F3 $ON”Þü$@&H` ß ß ß0ßNurtvxz|~`8<ÏÍËÉÇ AmHGF3 HFHEHDÏÍËÉHGHFHEHDSjtR2g0<HAÏÍËÉÇdHGHFI3 HEHDÏÍËÉHGHFHEHDHAQÈÿ�NuJ€j paB ÙVNqNuz~v,<@â@d R@F3 â‰â’â“â‰â’â“/p²†f´‡f ¶€fÅe.–€•‡“†Jk Æ`<@F3 Ø  l À` Ç`$Jk †`<@Ø  l €`K  ‡ ÞfF3 ``SJk †`<@Ø  l €` ‡J…k6SJk Æ`<@I3 Ø  l À` ÇRã‹ã’ã‘eÿN`ÿ0"$&Þ†Và J�k ã‹ã’ã‘S@aB óVF3 NqNu @LÒÁ<<8˜HRDo:Jf"¼�f¾‚f vž‚��`|dv`F3 vž‚��Þ‡ã–UÅS@SD`Äâ�dâ–â—R@SH°Hl`Hf*¼�d`:f¾‚I3 d`,f f`$€%F%GRH0@NºB öà`"$&†‚f 0<'3 À`J�m ãŠã‘S@J�`òvNºB òzNu4R1ABSQ AFIX gFPQRR IEFABS SA8' ƒ68K PASCAL FFP ABS AND NEG SUBROUTINES/2H.PQABS H.PQNEG p.PFCPYRT (3 ‡NuJ‡gGNu4R1ADDQ AFIX gFPQRR IEFADD SA81 ƒ68K PASCAL FFP ADD/SUBTRACT SUBROUTINEP2p.PFADD H.PQADD 6p.PQDOP H.PQSUB p.PQTIEEE p.PFCPYRT (BJ3 Fa0Bg/QÀfÀdÀhÀjÀè@?@ FNwaA ÈaA Ä` 3€ A À4P1ATNQ AFIX gFPQRR IEFATAN SA87 ƒ68K PASCAL FFP ARCTANGENT SUBROUTINEA2h.PQSOP h.PQTIEEE h.PFATAN p.PFCPYRT H.PQATAN ( 3T aA þaA ú`A ö4R1CMPQ AFIX gFPQRR IEFCMP SA8B ƒ68K PASCAL FFP COMPARE/TEST SUBROUTINE/2H.PQCMP H.PQTST $p.PFCPYRT (283 ‡€f~ †€f|J†jJ‡j¼‡Nu¾†Nu ‡€f~J‡Nu4L1DIVQ AFIX gFPQRR IEFDIV SA8I ƒ68K PASCAL FFP DIVIDE SUBROUTINEL2h.PFDIV H.PQDIV h.PQDOP h.PQRTD7 h.PQTIEEE p.PFCPYRT (.<3@€ aA þJ‡fJ†gB‡`A ð <NNJ†fpNNaA Ø`A Ô4Q1EXPQ AFIX gFPQRR IEFEXP SA8W ƒ68K PASCAL FFP EXPONENTIAL SUBROUTINEA2p.PFEXP p.PQSOP H.PQEXP p.PQTIEEE p.PFCPYRT ( 3T aA þaA ú`A ö4[1FLTQ AFIX gFPQRR IEFIFP SA9 ƒ68K PASCAL FFP FLOAT INTEGER TO REAL SUBROUTINE62h.PFIFP H.PQIFP h.PQTIEEE p.PFCPYRT ( 3 HçaA ú`A ö4O1LOGQ AFIX gFPQRR IEFLOG SA9 ƒ68K PASCAL FFP LOGORITHM SUBROUTINEA2p.PFLOG H.PQLOG p.PQSOP p.PQTIEEE p.PFCPYRT ("3@  aA þkfpNNaA ð`A ì4N1MULQ AFIX gFPQRR IEFMUL SA9 ƒ68K PASCAL FFP MULTIPLY SUBROUTINEA2h.PQDOP H.PQMUL h.PFMUL2 h.PQTIEEE p.PFCPYRT ( 3T aA þaA ú`A ö4T1PWRQ AFIX gFPQRR IEFPWR SA9 ƒ68K PASCAL FFP POWER FUNCTION SUBROUTINEW2p.PFLOG p.PFEXP p.PQDOP H.PQPWR p.PFMUL2 p.PQTIEEE p.PFCPYRT ( 03@U aA þJkfpNNaA îaA êaA æ`A â4R1REMQ AFIX gFPQRR IEFREM SA9# ƒ68K PASCAL FFP REM FUNCTION SUBROUTINEL2h.PFDIV H.PQREM h.PFMUL h.PFSUB h.PQDOP h.PQTIEEE (°J3@@ aA þJfJf <NNpNNHçaA ÞhpNN@mn o~F3 `h<<š` ‡g<S lð<š gJf ‡R  f~`| Æ?3! Þ†d â—RS ‡,aB ÿl,/ÏFaB ÿbP�`B ÿ\./Dü`ð4K1RNDQ AFIX gFPQRR IEFRND SA97 ƒ68K PASCAL FFP ROUND SUBROUTINEL2h.PFADD h.PFFPI H.PQRND h.PQSOP p.PQRTD7 p.PFCPYRT (*83@  aA þJj,<€À`,<€@aA èaA ähpNN`A Ø4Y1SINQ AFIX gFPQRR IEFSIN SA9E ƒ68K PASCAL FFP SINE/COSINE/TANGENT SUBROUTINEu2h.PFTAN h.PFSIN H.PQTAN h.PFCOS H.PQSIN H.PQCOS h.PQSOP h.PQTIEEE p.PFCPYRT (6L3R• aA þaA ú`aA ôaA ð`aA êaA æhL A â*€S…g~`A ÒpNN4Q1SQTQ AFIX gFPQRR IEFSQRT SA9R ƒ68K PASCAL FFP SQUARE ROOT SUBROUTINEL2h.PQSOP h.PQTIEEE p.PFCPYRT h.PQRTOD7 h.PFSQRT H.PQSQRT ( 3A@ aA þjpNNaA ò`A î4^1TRCQ AFIX gFPQRR IEFFPI SA9X ƒ68K PASCAL FFP TRUNCATE REAL TO INTEGER SUBROUTINE62h.PFFPI h.PQSOP H.PQFPI p.PFCPYRT ("3P aA þaA úhpNNLßxX�Nu4T1FFPFRONT AFIX gFPQRR IEFFRONTSA@ ƒ68K PASCAL FFP MATH ROUTINES - FRONT-END$2H.PQDOP H.PQSOP (`F3 Oïÿð//HïøaNuOïÿð//HïøaÍGaÍGNuHGîŸ €ÞiZi €âŸ&3 JNud ~f <âŸJNu~NupNN4S1FFPBACK AFIX gFPQRR IEFBACK SA@ ƒ68K PASCAL FFP MATH ROUTINES - BACK-END32H.PQRTD7 (H.PQTIEEE H.PQRTOD7 $(:@3 iÞ‡g €â‚HGïŸJ‡LßxX�NupNN./LßxX� ‡€f~Nu4V1FFPSIN AFIX gFPQRR FFPSIN SAB ƒ68K PASCAL FFP MATH ROUTINES - SIN/COS/TAN„2H.PFTAN h.PFDIV H.PFSIN H.PFCOS h.PFMUL h.PFSUB H.PFSINCS h.PFTHETA h.PFTNORM p.PFCPYRT (nF3 ?<ÿþ`$?<ÿÿ`?<` ¸bT�JNuBgJkî 8cîHç~€$Þ ŠcJ ¨c .aA ¬XDxÿBë¬ÿ΄,<ÉÛCaA Š,.aA ‚F3 $(< �ýª.BJkFD c~䯾„o$ž„ž„`öÆD c~ä¯D‡D„¾„I3@ lž„ž„`öz,<ì‘b@(<2Cö¨ç‡kD†D„Þ„AúB ÿrtÿRB&(ä£ä¤J‡k š„܃ž˜QÉÿ  { € „ ˆ Œ � ” ˜ œêI3@ ` Ú„œƒÞ˜QÉÿÞ2/j"Rf0a:.,a4g aB þÞLß~T�Nu.<ÿÿÿ`ðg,a.JLß:3 ~T�Nu/a/F,`æ(k †ÿbB þ¢|Nuà„R„fB þ–`ò4N1FFPLOG AFIX gFPQRR FFPLOG SAA4 ƒ68K PASCAL FFP MATH ROUTINES - LOGb2h.PFADD h.PFDIV H.PFLOG h.PFMUL h.PFSUB h.PFHTHET h.PFTNORM p.PFCPYRT (¾L3� Jgja <Nu~ÿ`öHç~€<A,<€A$aA ÖÏBaA Ð,aA ÊgJCDJ3  c~î¯|*< AúA ¬rt`䤚„Ü�(&䣞ƒjð.XˆRâ‹QÉÿò~aA „gJ3� R.$|Ag(jDàžzG܆[Íÿü€Œ.<±r@aB ÿP,aB ÿJLß~Nu4N1FFPEXP AFIX gFPQRR FFPEXP SA@T ƒ68K PASCAL FFP MATH ROUTINES - EXPL2h.PFMUL h.PFSUB H.PFEXP &h.PFHTHET h.PFTNORM p.PFCPYRT (öH3 <Jj~`~ÿâ<Lß~Nu.<€AOïJNuHç~€?gê$,<¸ª;AaA ÄiÀJ3 `D o°  lꯇë¯,<±r@aA š,.aA ’$`B.BCDL3  c~ä¯z,<&£ÑAúB ÿltra4YˆSBr a,YˆSBr a$J/jD…DÜ…aB ÿF.Þ<3 kÿ>gÿ:T�Lß~NuRB&(ä£ä¤J‡k ڄ܃ž˜QÉÿêNuš„œƒÞ˜QÉÿÞNu4U1FFPATAN AFIX gFPQRR FFPATAN SA@0 ƒ68K PASCAL FFP MATH ROUTINES - ARCTANGENTL2h.PFDIV h.PFSUB h.PFTHETA h.PFTNORM H.PFATAN p.PFCPYRT (ŠH3@ Hç~€,<€AB'¾eb¾†cFÍGaA ÞCD c|`4î¯|*< AúL3€ A Ärt`ä¤Ú„Ü�(&䣞ƒjð.XˆRâ‹QÉÿòaA š.Jg .<ÉÛAaA ŠJg3 €ŽLß~Nu4[1FFPHTHET AFIX gFPQRR FFPHTHETSAA" ƒ68K PASCAL FFP MATH ROUTINES - HYPERBOLIC TABLE2H.PFHTHET (`F3 “êz,W}bG«X€ª@U €@ &3 €@ 4L ]1FFPTHETA AFIX gFPQRR FFPTHETASAB& ƒ68K PASCAL FFP MATH ROUTINES - TRIGNOMETRIC TABLE2H.PFTHETA (lF3 !ûTÖ3‚ÖÝ~ú·SÿU»ÿê­ýU?ÿªÿõÿþÿÿÿÿÿÿÿÿÿ?ÿ23 ÿÿÿÿÿÿ?4V1FFPSQRT AFIX gFPQRR FFPSQRT SAB ƒ68K PASCAL FFP MATH ROUTINES - SQUARE ROOT 2p.PFCPYRT H.PFSQRT (¾F3 a<NugPkîâ dRâ� HC6<î�(*,Aú4.<€˜‡… ` F3 Ç(Ø„*š˜š‡[ËÿòZËÿòcR‡á� FHCNu€@D3 €@ 4X1FFPFPI AFIX gFPQRR FFPFPI SAA ƒ68K PASCAL FFP MATH ROUTINES - FLOAT/INTEGER 2H.PFFPI p.PFCPYRT (RF3 k$gBAkjDê¯Nu~ÿâ�<Nu~NuBÁkôjDê¯D‡Nuf3 D‡J‡kÒ~Ç<Nu4X1FFPIFP AFIX gFPQRR FFPIFP SAA( ƒ68K PASCAL FFP MATH ROUTINES - INTEGER/FLOAT 2H.PFIFP p.PFCPYRT (8>3 z_J‡g0jzàD‡i&S ‡ÿbHGÞ‡[ÍÿüJj ‡dâ—RNu4Q1FFPDIV AFIX gFPQRR FFPDIV SA@F ƒ68K PASCAL FFP MATH ROUTINES - DIVIDE 2H.PFDIV $p.PFCPYRT (–F3 ŽüJ†f‡ÿÿÿJ<NuHFHG½`êkú~NugØ(gèv€ÚEØD··˜iäBHGHFF3 ¾FkTiÎâŸHG»DâL&†Æ:ÆÆžƒHGHF6BÆÅžƒd&BÞƒSE&HCBGŽÃHEk:3 Ú…S>:…€.gŒNu4S1FFPMUL AFIX gFPQRR FFPMUL SAAC ƒ68K PASCAL FFP MATH ROUTINES - MULTIPLY 2H.PFMUL p.PFCPYRT (zF3 gFg\ÚEØDv€··ÚiR¹Eâ]B&HC(BÆÄHDÈÇØƒBDÙHDHGHFÎÆHFÞ„j @3 ‡€gNuSiex@Þ„Þ‡dâ—RgNu~Nujú½‡ÿÿÿJ<Nu4b1FFPMUL2 AFIX gFPQRR FFPMUL2 SAAQ ƒ68K PASCAL FFP MATH ROUTINES - HIGH-PRECISION MULTIPLY 2H.PFMUL2 p.PFCPYRT (žF3 gfg~ÚEØDv€··ÚhFjnºfrakj`L¹Eâ]HE:BB8ÈÇHD&HCÆÅF3 ؃HF&ÆÇ؃BDÙHDHGÎÆHFHEÞ„NuaÈj ‡€gNuSiex@Þ„Þ‡dâ—Ri$3 gNu~Nu`½‡ÿÿÿJ<Nu4U1FFPDBF AFIX gFPQRR FFPDBF SA@7 ƒ68K PASCAL FFP MATH ROUTINES - DUAL/FLOAT 2H.PFDBF h.PF10TBL (¤H3 z J‡g„kzÞ‡[Íÿü Fn| Fÿämn8DDÉü/AúA ÖÚp@<&0@ W.ƒ:ÊÃBEF3 HExHCÆÇÚƒÙHG6ÆïÚƒdR:HEÎ×OïÞ…kÞ‡SF‡€dâ—RFv 8çfi*3 F€æ®gNu~NuJDkø~ÿHFââJ<Nu4W1FFPADD AFIX gFPQRR FFPADD SA@  ƒ68K PASCAL FFP MATH ROUTINES - ADD/SUBTRACT/2H.PFADD H.PFSUB p.PFCPYRT (äF3 gR €kjklf`>k^g>k^g2šk8 d,&Bê«<€ÞƒeNuâ—RF3 idô~ÿS<Nu.NuJNu ÿèoðD&Bê¯<€ÞƒeÌNuk¦gÖv€·šF3 gPk< dÌ&B꫞ƒk BS ‡ÿbHGÞ‡[Ìÿü¹kgNu~Nu*3 ÿèoŠD&.<€`¾ËDž†gàjºD‡`¶4V1FFPFPA AFIX gFPQRR FFPFPA SAA ƒ68K PASCAL FFP MATH ROUTINES - FLOAT/ASCII+2H.PFFPA h.PF10TBL h.PFCPYRT (îF3 Oïÿö// JBg/QÀfÀdÀhÀjÀè@?@ Hç>Àf~A?|+.H3 "jT/"Ü<€¿H†âFvAúA ¦¼Pmn ¾¨d \HSC`M AèÿúRC¼Pnögè`ìAèF3 SC¼PmögÚ/|E+00,4jDBT/- B eR/.B …//tCï$J‡jJ(fB843 ˜X*è­x ž…UÌÿüeBÞ… D0ÄQÊÿÜ>HÇLß|Nw4Z1FFP10TBL AFIX gFPQRR FFP10TBLSAB2 ƒ68K PASCAL FFP MATH ROUTINES - POWER TEN TABLE 2H.PF10TBL rp.PFCPYRT ( F3 @ŠÇ#<Þ k:9±¢¼/6ŽÉ¿2ã_©2/µæ õ,‘„ç*(èÔ¥%ºC·@"•ùîkF3 (¾¼ ˜–€ô$ÃPœ@ úÈ €ÿýÌÌÌÍÿúF3 £× =ÿ÷ƒn˜ÿóÑ·Yÿð§Å¬Gÿí†7½ÿéÖ¿”Öÿæ«Ìwÿã‰p_AÿßÛæþÏÿܯëÿ ÿÙŒ¼Ì F3 ÿÕá.BÿÒ´$Ü5ÿÏ�|÷ÿËæ•”¿ÿȸwª2ÿÅ“’î�ÿÁìJ~ÿ¾¼åeÿ»— Pÿ·ñÉ�ÿ´Ám&3 šÿ±š¾Íÿ­÷–‡®ÿªÆ%ÿ§žtѸÿ£ý‡µó4c1FFPTNORM AFIX gFPQRR FFPTNORMSAAY ƒ68K PASCAL FFP MATH ROUTINES - TRANSCENDENTAL NORMALIZE2H.PFTNORM (6<3 xBJ†g.jD†< †ÿbHF܆[ÌÿüJj †dâ–RNu4[1FFPCPYRT AFIX gFPQRR FFPCPYRTSABA ƒ68K PASCAL FFP MATH ROUTINES - COPYRIGHT NOTICE$2H.PFCPYRT H.PFLOATP (DF3 MC68343 FLOATING POINT FIRMWARE (C) COPYRIGHT 1981 BY MOTOROLA I 3 NC.4ééé=/*=/*†RROM.RLIBNFP.CF=/*(=/*†Chain�file�to�create�RROM.RLIBNFP.RO=/*D=/*†TYPICALLY�this�chain�file�is�built�WITHOUT�assembling�the�'RROM'C=/*†catalog�modules,�HOWEVER�if�the�user�wants�to�build�the�libraryD=/*†and�assemble�the�'RROM'�catalog�modules�he�must�provide�a�single=/*†argument�of�any�value.=/*=/*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>I*„THIS�OUTPUT�FROM�THIS�CHAIN�DOES�NOT�SUPPORT�THE�FLOATING�POINT�PROCESSO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=/*$=COPY PASCALIB.RO,RROM.RLIBNFP.RO;BY=/IFS„\1=/*%=/*†Assemble�the�long�jump�subroutine=/*=/@ RROM.PLJSR.AF #NULL=/ENDIF=/IFS„\1=/*E=/*†Assemble�the�dummy�module�to�satisfy�external�reference�in�module=/*†IOSRR.WRR.SA=/*=/@ RROM.PFPOINT.AF #NULL=/ENDIF=/*=/*†BUILD�THE�LIBRARY=/*=LIB RROM.RLIBNFP.RODEL INITDEL WRQDEL RDQDEL TRCDEL RNDDEL PWRDEL EXPDEL LOGDEL ATN DEL CORDA DEL SINCOS DEL MATHX DEL ATAN2 DEL ATANH2DEL GTMDEL GTFDEL GTTDEL STMDEL STFDEL STTDEL NAN DEL FINIT DEL FPOINT DEL M68341DEL ABSQDEL ADDQDEL ATNQDEL CMPQDEL DIVQDEL EXPQDEL FLTQDEL LOGQDEL MULQDEL PWRQDEL REMQDEL RNDQDEL SINQDEL SQTQDEL TRCQ DEL FFPFRONT DEL FFPBACK DEL FFPSIN DEL FFPLOG DEL FFPEXP DEL FFPATAN DEL FFPHTHET DEL FFPTHETA DEL FFPSQRT DEL FFPFPI DEL FFPIFP DEL FFPDIV DEL FFPMUL DEL FFPMUL2 DEL FFPDBF DEL FFPADD DEL FFPFPA DEL FFP10TBL DEL FFPTNORM DEL FFPCPYRTADD RROM.PLJSR.RO/ADD RROM.PFPOINT.RO/PLJSRLQ=/*"=/*†RROM.RLIBNFP.RO�has�been�built=/*=END éM   e=/*=/*A=/*†RROM.RLIBNFP.LG�-�Chain�file�to�link�globally�sharable�PASCAL,=/*˜runtime�routines.�These�runtime�routines+=/*˜DO�NOT�INCLUDE�floating�point�routines.=/*=/**=LINK ,RROM.RLIBNFP.LO,\LINKLS;HAMIXSZ=100�SEG�SEG0(RG):8‚\GSPLSTR INPUT RROM.RLIBNFP.RO ENDéé © ,1PLJSR ALARKMRROM PLJSR SA#11„2H.PLJSR (3 (WX—ÙÔNÔ4,1PFPOINT ALARKMRROM PFPOINT SA#A1„2H.PFPOINT (3 Jü471SYMFLAG AFIX gUTILRR SYMBUG SA)B ƒSYMBUG FLAG2H.PSYMBUG (3 4X1TRAPS  AFIX gUTILRR TRAPS SA7 ƒ68K PASCAL TRAP HANDLING RUNTIME SUBROUTINESo2H.PADDRER tH.PVCHKI 8H.PVBUSER VH.PVZDIV H.PVTRAPD 8H.PVTRAPE H.PVTRAPV (žF3 Híÿÿ|"o2 Ao <™`THÁÒ�Nû`J``L`V`nHÀ@ ® ³ · » ¿ Ã Ç Ë Ï Ó × Û ß ã ç ë ï ó "€/ € F3 ga‚<`g < ÀalR oê +Gt+@x`BHÀ@+Gt+@xaH`0F3 HÀ+It0/g.HÀ@a2+@x`+It0/HÀg€+@x @p"`Úp |F3 `ΟüH×|| ?| /| /| OpND ßüF3 NuHíÿÿ|+ot <+@xa¬`”Híÿÿ|+ot <+@xa’`ÿzHíÿÿ|+oF3 t <+@xaÿv`ÿ\Híÿÿ|+o t <+@xaÿX`ÿ>Híÿÿ|+o t$3 <+@xaÿ:`ÿ H@0-4H@,NA4R1OPTION AFIX gUTILRR OPTION SA3U ƒ68K PASCAL OPTION PROCESSOR SUBROUTINE 2p.PCLSCOD H.POPTION (ZH3 B€B�IúA ú am zn ,gè4k6 -fÀ`Ög0ƒF3 gÁ` =fRŠa`  f@` NuBƒ:< &J $g�F3 am zn 4gˆ`6 am zn 4k6gãƒF3 (åƒÖ„�Ö�SEf΂ am zn 4jè  f" am zF3 n +ÿþNu:< am zn  am zn 4k´f 3 gŒ_�郆�SEfÌ`ÿz4Q1CLSCOD AFIX gIOSRR CLSCOD SA ƒ68K PASCAL CHARACTER CLASS CODE TABLE2H.PCLSCOD (€F3 €€€@@ P€@  €@F3 4N P1ALSTS AFIX gUTILRR ALSTS SA)0 ƒ68K PASCAL ALLOCATE STACK SUBROUTINE$2H.PALSTS H.PALSTSL (,23 HÄR„„ÿÿÿþŸÄŸü ¿íb O÷H pNNOï .·HNu4L1CLO AFIX gIORR CLO SA# ƒ68K PASCAL CLOSE FILE SUBROUTINE+2H.PCLO p.PCLOSPL p.PPRGBUF (&3  .LÐ2*(-0aA ðaA ì+D0Nu4\1IFD AFIX gIORR IFD SA$ ƒ68K PASCAL INITIALIZE FILE DESCRIPTOR SUBROUTINEL2H.PIFD p.PACCPER p.PCLOSPL p.PEDTFIL p.PSTDFLT p.PALSTS (H3 "_. HÂ&g&<…(„QR„Dÿþ$O•ĵíldEïµíle•ílØŠaA ÂF3 !OEïP/JEò8ÿ/JA??B$O eTgv`gvC)CL3 BjBBjBªL@O(-0fgA@aB ÿZJf<gJ-(gaB ÿFat`I3@ aúgJ-$gaB ÿ.a\`aâgaÄ`8°m"b"?S@å@@,J5LŸI3 g gaB þöa$` ga¤`aŠgNq5A+D0NÑHçØžMê$gI3 pÿS@å@@,Aõ|B€(@AõJaB þœ$€ÿ€üLßyg/p(NNI3 g g%m6*HBB|g€BNÁ NupaB þT|&8%m:*NuH瀀F3 Aê$0¼€NCgNN *&o|&BjFB*K*E f|'`  3 f|'`|'BjDLßNu4L1RST AFIX gIORR RST SA ƒ68K PASCAL RESET FILE SUBROUTINEm2H.PRST p.PACCPER p.PASGNF p.PCFLDAD p.PCALCLU p.PCLOSPL p.PSTDFLT p.PFLSCN p.PPRGBUF (²L3€ .LÐ2*aA ôaA ðB� f† fpÀj& g faA Ê g4/ N3 ¢ &JaA ¼5 c ¼5‚aA  aA œH‚?aA ”2&_g*8 >3€ gAê0¼NBgNN` ap÷Áj&aB ÿbAìB’5ANup`B ÿP4ééééééééN ééééééééééééééééO ééééééééééééééééO éééééééééééééééé