PVOL1BACKUP D%B1111001001 1P ÆÀÀe”÷ û_�vÿß‹tÿý€‡ ***THIS VOLUME DOES NOT CONTAIN A HARDWARE BOOTABLE SYSTEM *** && ÁÿdÁ ý�€‡ÁÖ÷ÚÞW ùcƒ· ÐÞW óɃ· ÆÞ÷5 àÕ E †÷5ÞΉ÷UÞ ÷dÞ÷`Þ÷\ÞÀ�ÞÀ 7|PÞ Â÷  � w6Ö‡æÃ ¦ Á @ B Ž ‡‚ã� à ÷Ö ƒ‡  RdÁ ü‡÷æ÷ ÷�æÖ‰÷þå÷ ÷� æþÕ‰7øå7ŠûåæŒÿˆ†÷®èÕ‰÷‹ìå�Ö ‡÷®ÖÕ‡&÷¥jÝ ÂÈÅŽ3ÀRÀ ý÷5@:Ý$ÂìÅŽ3À•À ýÕàÕÕÞÕ÷ª\Ü÷VÜ¢÷^ÜŽÂZÜ·„Ŧ3À•À ý÷´Õ~€‡&÷ èý†L‰÷ ŠÓ÷„ÓÜÀxÓPHDR1RSX11MPBL40 00010001000100 00000 00000 000000DECFILE11A PPHDR2U0414404144 M 00 PPRSX11MPBL40RSX11MPBL40W  088<T$ÒDMPQR16SEP87104856DECNP°LŒ[!sß•àþÿÅEÄà TÂ~ ÆÇ6Å Å ÿÂÃÄÈõ wìõý5 õõ%LÀÀefAÁEÿÈ‹A¢$úÁ%@ Á%A Ð ˆrµ  Ø�rÂÂPµÍ•9Ä–YÄ ýÍ5€€ø:€õ5 "Í @õU뢢¢    ² `"2@@Aþ—rBµ —rÂÂPµõ5 ÷UÍÍ5€€ýæ�DÄEøÿ ·÷ €XX X!•ÃÃeæÿÄÍ 9��0üÍ ù€Á4B! Á ý�ñ0~ýñ€ýñ‚ý1�†ýñ”Šýñ”�ýË ñšÿžýñ–ÿ ýÒÒÚ õ þÿæ–YÎ ýÖ Í ò üÿõ�ñ‹ÀýÌ% ¼%           iì RSX11MPBL40àÈ¥04SEP87100832U RSX11MPBL40 [001,001] DECFILE11A úqPUFDNÀNÀzàP�s˜Æ»zÀ0 ¦µ1!È0úñµ ñÅ Â5ñµ Â5Â5 ÷ Ž÷ ˆe‡Î5&÷ €YÎ5ñµ T÷ ÆS‡PñŠ Kñµ ñ• ÷ ªE‡ñŠ >÷ ˆ÷ šÎ5&@¡ñµ@ ÷ ®‡÷ ”€)ñµ %£ Âe ƒÁ Cò ñµ óµ ÂÃòñrÂã÷ È– &V ‡p öÿ0 öÿp øÿ0 øÿ‡£ òµ  ö5òµ€¡‡wr£   ð ð‹ ðµ@ ðÀ pppœ ðÅïÿ 0 0 0 ñÅ 1 1 1 ±‡¦v�e�óN³*•PU5PUFDOÀOÀzàP ›r¸xl^?›r˜Æl^@›r«Æl^A›rÓÆl^B›r°Æl^C›rØÆl^D›r[q€E›r[q�€F›r\K€G›r]K€H›r[qâyI8xrl^J8°Æl^K8[q€L8[qâyMt^^Nt^à8^O�M^PZg9;^QZgÊ8^RZg‹d^SZgãƒ^TZgãƒ^u�PUFDOÀPÀzàPUáyµsdÌVOláy sÌWOlïydÌXxX€ÌY·kµz?TZ›rÛø8[¼ Ô€\_Mp:Ô€]t:»z¢8xrl^J8°Æl^K8[q€L8[qâyMt^^Nt^à8^O�M^PZg9;^QZgÊ8^RZg‹d^SZgãƒ^TZgãƒ^u�PUFDOÀQÀzàPPUFD OÀRÀzàPPUFD OÀTÀzàP^""_M"…_""_Mc""…Z›rÛø8[¼ Ô€\_Mp:Ô€]t:»z¢8xrl^J8°Æl^K8[q€L8[qâyMt^^Nt^à8^O�M^PZg9;^QZgÊ8^RZg‹d^SZgãƒ^TZgãƒ^u�PUFD OÀUÀzàPPUFD OÀvÀzàPPUFD OÀwÀz àPPUFDOÀžÀzàPr»ddl¼dd̾dd·ÆddËÇdd–Ëddo0 dd ¬ dd—çddcddÛ_dd­eddámdd°add²¼dd±Øddg&dd¥,ddÈ–ddd dd¬„dd`ädd¤ddÐdd›ûddm%dd�édd¨ôddº)!dd¹"dd¾&×MddØ&ìQddÖ&¶Rdd×&ÔxddÍ &–(dd &—sddÊx'dd¡œ'ddÓ¢(ddfR)ddÙw*?TddÉÔ2ddeÓ4dd¼Å8dd»È8%dd�È8„(dd„È8[qdd³y:dd˜ƒ:ddϰ:ddâÐ:dd´bKdd¯YMdd}‰MddÅ�Mdd®kQddykQ¤_dq¼QddiÄQddžÅQddÇÊQddvíQddpDRdd¸­SddÑaTddj XìddÜ›r[q�xQ?8[qxQxe¢_+xel†¢_,Üf¢_-Ol¢_.Ol©¢_/ q¢_0Œr¢_1›rl†¢_2s¢_3þv¢_4x¢_5°x¢_6¸}¢_7º~¢_8T…¢_9‰Š¢_:š‹¢_;¸¢¢_~›rìr�âyŒs^Zl^�Œs†Zl^ÿ»¢_¼¢_¾¢_¬ ¢_ç¢_¢_e¢_PUFDOÀÁz,àPPUFDPÀÁz,àP» :}}Ì�s¥Æ»z¾€²K€þv€�s¥Æ€�s¥Æâyz¥Æ€z¥Æâyð¥Æ€ð¥Æâyñ¥Æ€ñ¥Æâyò¥Æ€ò¥ÆâyKŠ¥Æ€ KŠ¥Æây!…¥Æ€"Tðs€#Tðsây$¤ðs€%¤ðsây&¼ðs€'¼ðsây(äðs€)äðsây* ðs€+ ðsây,Ôðs€-Ôðsây.Lðs€/Lðsây0Äðs€1Äðsây2ëÈ_€3ìðs€4ìðsây5„Mðs€6„Mðsây7LSðs€8LSðsây9ŒTðsây?dYðs€@dYðsâyAKgÈ_€BKgÈ_âyC$qðs€D$qðsâyE$€ðsâyF$€ðs€G%€ ™âyH%€ ™€I¤Œðs€J¤ŒðsâyK &[q€L &[qâyM» vLš‹ÌN» vL9€ÌO�s¸QkQPUFDQÀÁz,àP@üàḺ„âyäw*?Tâyây ›r[qây¡�sKŠây½‹wâyÿxâyô–âyú»€»„(€?»[q€¨¼€ÀÆ}€Æ~K€$ÆÕÀv€üÇ€§Ë€Ë„(€"Ë[q€á¬ €©ç€Ò€Á_€ëe€Âm€øa€ a„(€Aa[q€î¼€¼„(€8¼[q€ñ؀؄(€;Ø[q€Ñ&€¶,€,„(€%,[q€æ–€–„(€6–[q€õ €¹„€¦ä€D€Ý€„(€1€Ûû€å%€Üé€é„(€2é[q€èô€!ô„(€Bô[q€È)!€)!„(€))![q€Ç"€GS#Y`€EY#ŒZ€Fb#l€³&×M€Ùx'€ x'„(€/x'[q€òœ'€ï¢(€¢(„(€9¢([q€´R)€âw*?T€ÆÔ2€Ô2„(€(Ô2[q€ÓÓ4€íÅ8€Å8„(€:Å8[q€Êy:€­ƒ:€ô°:€°:„(€=°:[q€ìÐ:€Ð:„(€7Ð:[q€ßbK€bK„(€4bK[q€¯YM€ö�M€�M„(€>�M[q€ÕkQ€ kQ„(€-kQ[q€ÔoQ€C¼Q€»ÊQ€ªËQ Œ€«ËQ·Œ€®ËQ·Œ€%€¬ËQ·ŒÀ+€°íQ€çDR€H¶Rl†€Ë­S€ÐaTÈ€ókQ²9€KkQ§9€€¢kQ€l†ÎkQ[s†�ƒkQsìŠ zkQ�¤ŒðskQ³Ì–ðskQŸØ–HqkQ° ˜ðskQ\œ™ðskQ’Ä™ðskQ“Æ™p:kQ”ЙHqkQ•Ô™h~kQ›rjL¢_04SEP8710105704SEP87101039ÌÜ�ÝÐ.'à€ffP›r8¢_04SEP8710110604SEP87101058Ìem® .(à€��ð#¸Q"S04SEP8710112004SEP87101108ÌŒÓc(.)à€FFF#jL¢_04SEP8710112804SEP87101121ÌE`ôß.*à€MMÊX„¢_04SEP8710113604SEP87101130ÌL¦È.+à€++þ6&jL¢_04SEP8710114204SEP87101137Ì*ó8Ñ.,à€))î+jL¢_04SEP8710114704SEP87101143Ì(8Ñ.-à€..86&ÝM¢_04SEP8710115204SEP87101148Ì-GAØ..à€Ý¨W"S04SEP8710115604SEP87101154Ìu ¨./à€½½â›rkQ"S04SEP8710121104SEP87101157̼‡¿¦.0à€.›'kQ"S04SEP8710121404SEP87101213ÌD^£.1à€ &„(€04SEP8710121604SEP87101216ÌL˜ .2àz  &„(ây04SEP8710121704SEP87101216ÌMš.3à€#$ &[q€04SEP8710121804SEP87101218Ì"Oº .4à|  &[qây04SEP8710121904SEP87101219Ì r”ï.5à€L &^04SEP8710122104SEP87101220Ì~Ùg.6à€î &aT^04SEP8710122304SEP87101222Ì—Å.7à€!! &–Q^04SEP8710122404SEP87101224Ì µƒÅ.8à€¸ &äYØ^#^04SEP8710122604SEP87101225ÌÖ<.9à€ &_M#^04SEP8710122704SEP87101227ÌØ5¨.:à€""ô &Ô(K#^04SEP8710122904SEP87101228Ì!ÜÛí.;àF „BuWTkQ04SEP8710123004SEP87101230Ì þ"ö.<àz È›rÖ(^04SEP8710123104SEP87101230Ì )Ð.=àG4›rxrl^04SEP8710123204SEP87101232ÌS.>àGV›r¸xl^04SEP8710123304SEP87101233̹.?àWVV.›r˜Æl^04SEP8710123404SEP87101233ÌU-¿.@àY&›r«Æl^04SEP8710123504SEP87101234Ìmðn.AàY‚›rÓÆl^04SEP8710123604SEP87101235Ìto.BàYÞ›r°Æl^04SEP8710123704SEP87101236Ìw½s.Cà^º›rØÆl^04SEP8710123704SEP87101237Ì}Ís.Dà€›r[q€04SEP8710123804SEP87101238̃S>.Eà€/0›r[q�€04SEP8710123904SEP87101238Ì.‡?r.Fà€›r\K€04SEP8710124004SEP87101239̶Ÿ+.Gà€ ›r]K€04SEP8710124004SEP87101240ÌÉÍ..HàzZ›r[qây04SEP8710124104SEP87101241Ìèç0.IàML8xrl^04SEP8710124304SEP87101243Ìëô¿.JàY¤8°Æl^04SEP8710124404SEP87101243Ìíœ.Kà€'(8[q€04SEP8710124504SEP87101244Ì&ó«.LàbÎ8[qây04SEP8710124604SEP87101245Ì Û.Mà€Tt^^04SEP8710124704SEP87101247Ì æš.Nà€Jt^à8^04SEP8710124804SEP87101248Ì $ ÒÙ.Oà€¼�M^04SEP8710125004SEP87101249Ì2 |• .Pà€àZg9;^04SEP8710125104SEP87101251ÌB µÙ.Qà€FZgÊ8^04SEP8710125204SEP87101252ÌJ ²Õ.Rà€TZg‹d^04SEP8710125404SEP87101253Ì P š .SàrZgãƒ^04SEP8710125504SEP87101254Ì^ œ .TàrZgãƒ^04SEP8710125604SEP87101256Ìa ¢" PUFDOÀPÀzàP.UàKêáyµsdÌ04SEP8710125904SEP87101258Ìd oI.VàKÄOláy sÌ04SEP8710130104SEP87101300Ìl xA.WàLtOlïydÌ04SEP8710130204SEP87101302Ìp —0.Xà>:xX€Ì04SEP8710130404SEP87101303Ìq ‚ß.Yà@À·kµz?T04SEP8710130504SEP87101305Ìr ¶*.Zà"Ž�Z›rÛø804SEP8710130704SEP87101306Ì�� ù%.[àB(¼ Ô€04SEP8710130804SEP87101308Ì €y.\àB(_Mp:Ô€04SEP8710131004SEP87101309Ì Žâ.]à€klt:»z¢04SEP8710131704SEP87101311Ìj! ¯PUFDOÀQÀzàPPUFD OÀRÀzàPPUFD OÀTÀzàP.^à""_M"…04SEP8710132304SEP87101320ÌÿŒ ÿŒ ÿŒ Œ z ._àcd""_Mc""…04SEP8710132504SEP87101324Ìb¨ àQPUFD OÀUÀzàPPUFD OÀvÀzàPPUFD OÀwÀz àPPUFDOÀžÀzàP.rà] »dd04SEP8710134504SEP87101344Ì \æ .là1”¼dd04SEP8710134004SEP87101339ÌF.Ìà;Ö¾dd04SEP8710150004SEP87101500Ì¢þ.·àQöÆdd04SEP8710144204SEP87101441ÌÂn.Ëà<®Çdd04SEP8710145904SEP87101459ÌŸ .–à;œËdd04SEP8710141404SEP87101413ÌNkÿ.oàKî0 dd04SEP8710134204SEP87101342ÌQ. à=�¬ dd04SEP8710142204SEP87101421̈‚.—àHçdd04SEP8710141504SEP87101414ÌQ .càR‚dd04SEP8710133304SEP87101332Ì^.Ûà:Ü_dd04SEP8710151304SEP87101513ÌJ} .­à*edd04SEP8710143404SEP87101433Ì5".áàPbmdd04SEP8710151904SEP87101518Ìp].°àaadd04SEP8710143604SEP87101436Ìe'.²àU @¼dd04SEP8710143804SEP87101437Ì ‚~.±àZØØdd04SEP8710143704SEP87101436Ì|&.gàJÐ&dd04SEP8710133604SEP87101335Ì4Ä.¥àV(,dd04SEP8710142704SEP87101426̨ä.Èà` x–dd04SEP8710145704SEP87101456Ì u©!.dàP* dd04SEP8710133304SEP87101333Ì%�.¬àW˜„dd04SEP8710143304SEP87101432ÌK(.`à&ädd04SEP8710133004SEP87101330Ì h.¤àBxdd04SEP8710142604SEP87101425Ì¥.ÐàW þdd04SEP8710150304SEP87101503Ì ¿ò.›àN ûdd04SEP8710141804SEP87101417ÌcÚ.mà>˜%dd04SEP8710134004SEP87101340ÌJ•.�à\ édd04SEP8710141904SEP87101419ÌtK#.¨àX//œôdd04SEP8710142904SEP87101429Ì.·‰L.ºàj ‚)!dd04SEP8710144404SEP87101444Ì Ò—'.¹àL|"dd04SEP8710144304SEP87101443ÌÌV#.¾àR ¸&×Mdd04SEP8710144704SEP87101447Ì °|.ØàX\&ìQdd04SEP8710151104SEP87101510Ìš‚.Öà[Ö&¶Rdd04SEP8710150904SEP87101509ÌùÆŠ.×à[ °&Ôxdd04SEP8710151004SEP87101509Ì ¼«.ÍàIB &–(dd04SEP8710150104SEP87101500̤|F.ÂàS &—sdd04SEP8710145104SEP87101451ÌŒ %f°.Êà\Px'dd04SEP8710145804SEP87101458Ì‹ˆ<.¡àI:œ'dd04SEP8710142304SEP87101423ÌÑ� 1.ÓàU¸¢(dd04SEP8710150604SEP87101506ÌèT*.fà1LR)dd04SEP8710133504SEP87101335Ì2L#.ÙàIâw*?Tdd04SEP8710151204SEP87101511Ì*Èz.Éàg zÔ2dd04SEP8710145704SEP87101457Ì �ù=.eàI�Ó4dd04SEP8710133404SEP87101334Ì,)2.¼àO æÅ8dd04SEP8710144604SEP87101445Ì ó§B.»àPdÈ8%dd04SEP8710144504SEP87101444ÌÜIa.�àrÈ8„(dd04SEP8710135704SEP87101356Ì IN.„àrÈ8[qdd04SEP8710135904SEP87101359ÌÕð¨.³àU Xy:dd04SEP8710143804SEP87101438Ì Œ^B.˜à4(ƒ:dd04SEP8710141504SEP87101415ÌU²4.Ïà^ð°:dd04SEP8710150304SEP87101502̨€J.âàOrÐ:dd04SEP8710152004SEP87101519ÌtÆ>.´à_ŽbKdd04SEP8710143904SEP87101439Ì–©_.¯àSÊYMdd04SEP8710143504SEP87101435Ì`qM.}à6.‰Mdd04SEP8710135304SEP87101353ÌÀG.ÅàW2�Mdd04SEP8710145404SEP87101454ÌPAb.®àX"kQdd04SEP8710143404SEP87101434ÌNå\.yàXlkQ¤_d04SEP8710135004SEP87101350ÌŒq§.qàQò¼Qdd04SEP8710134404SEP87101343ÌY°L.ià6$ÄQdd04SEP8710133704SEP87101337Ì:§L.žàL bÅQdd04SEP8710142004SEP87101420Ì ||O.Çàc ŠÊQdd04SEP8710145604SEP87101455Ì jã[.và&íQdd04SEP8710134804SEP87101347ÌxN.pàM.DRdd04SEP8710134304SEP87101342ÌUkL.¸àRÈ­Sdd04SEP8710144204SEP87101442ÌÆ1S.ÑàQüaTdd04SEP8710150404SEP87101504ÌËOa.jà<8 Xìdd04SEP8710133804SEP87101338Ì<ùi.ÜàM 6´zdd04SEP8710134504SEP87101345ÌgÊu.Ÿà;n»zdd04SEP8710142104SEP87101421̆ir.ÎàDà¸}dd04SEP8710150204SEP87101501̦0w.ÒàM fº~dd04SEP8710150504SEP87101505Ì Þƒ.©à\0º~%dd04SEP8710143004SEP87101429Ìæ ­.Õà>žÆ~dd04SEP8710150804SEP87101508ÌöV.¶à44„dd04SEP8710144104SEP87101440Ì¿Ú}.§à<RT…dd04SEP8710142804SEP87101428̵&„.ààK\|…dd04SEP8710151804SEP87101517Ìk\‰.£àe ̉Šdd04SEP8710142504SEP87101424Ì ›í� .ÃàJ øš‹dd04SEP8710145204SEP87101452Ì 2Ë”.uà1N´–dd04SEP8710134704SEP87101347Ìu”.ÞàP渢dd04SEP8710151604SEP87101515Ì`¥.ßàI̱xdÌ04SEP8710151704SEP87101516Ìe`‚.ÀàCz|…d¤_04SEP8710145004SEP87101449Ì8Û PUFDOÀ¢ÀzàP.…à;¾ æYÌ04SEP8710171104SEP87101711̶V.‚à7¦ ^ZÌ04SEP8710170904SEP87101709̰`].‡à7Æ †ZÌ04SEP8710171304SEP87101712̼´W.”à;äæYÌ04SEP8710201104SEP87102010ÌßaW.šà9öçYÌ04SEP8710201304SEP87102013Ìê…Z.‘àA^ZÌ04SEP8710200904SEP87102008ÌÙ_.ãà9bZÌ04SEP8710201504SEP87102015Ìÿ‡].åàA †ZÌ04SEP8710201704SEP87102017ÌÀ_.à<þ8[qÌ04SEP8710170404SEP87101703Ì®åz.ïà;ÒÎæYÌ04SEP8710231504SEP87102315̸d.íà:àÎ^ZÌ04SEP8710231304SEP87102313Ì5c.ñà:ΆZÌ04SEP8710231804SEP87102317Ì#”g.õà;ÌÛæYÌ04SEP8710244604SEP87102446Ì7âi.óà:ÞÛ^ZÌ04SEP8710244404SEP87102444Ì'Wh.÷à:Û†ZÌ04SEP8710244804SEP87102448Ì>Äl.éà;¾æYÌ04SEP8710214604SEP87102145ÌÍg.çà:Ì^ZÌ04SEP8710214404SEP87102143ÌJf.ëàLì†ZÌ04SEP8710214804SEP87102148Ì´k.ùà?J<9æYÌ04SEP8710260904SEP87102609ÌFÙŠ.ûà:$<9^ZÌ04SEP8710261104SEP87102611ÌL'„.ýà:J<9†ZÌ04SEP8710261304SEP87102613Ì]І.aàGØ›r³%�Ì04SEP8710155104SEP87101550Ì Z‘.kàKþ›r\KÌ04SEP8710155304SEP87101552Ì©¯.nà9ê›r]KÌ04SEP8710155304SEP87101553̈°.bàM‚›r[q�Ì04SEP8710155204SEP87101551̳Û.‹à*tŒsæYÌ04SEP8710183304SEP87101833ÌÊSÁ.‰à*„Œs^ZÌ04SEP8710183104SEP87101830ÌÄѾ.�à*¼Œs†ZÌ04SEP8710183504SEP87101835ÌÐGÄ.†àG* æYl^04SEP8710171204SEP87101712Ì·)¤.ƒàG* ^Zl^04SEP8710171004SEP87101710̱–¢.ˆàGJ †Zl^04SEP8710171404SEP87101713̽·³.•àY zæYl^04SEP8710201204SEP87102011Ì àÊ«.œàCöçYl^04SEP8710201404SEP87102014Ìëþ;¸.’àCø^Zl^04SEP8710201004SEP87102009ÌÚ”¯.äàCbZl^04SEP8710201604SEP87102016Ì6¬.æàC0†Zl^04SEP8710201904SEP87102018Ì  �­.€à;ª8[ql^04SEP8710170504SEP87101704̯3Æ.ðàA°ÎæYl^04SEP8710231604SEP87102316Ì C±.îàA2Î^Zl^04SEP8710231404SEP87102314Ì5¯.òàABΆZl^04SEP8710231904SEP87102318Ì$~³.öàJüÛæYl^04SEP8710244704SEP87102447Ì8κ.ôàJúÛ^Zl^04SEP8710244504SEP87102445Ì19¹.øàJ4Û†Zl^04SEP8710244904SEP87102449Ì?³¼.êàGþæYl^04SEP8710214704SEP87102147ÌÀ¶.èàGþ^Zl^04SEP8710214504SEP87102144Ì0´.ìàG†Zl^04SEP8710214904SEP87102149ÌЏ.úàWH<9æYl^04SEP8710261004SEP87102610ÌG‘Ð.üàE¦<9^Zl^04SEP8710261204SEP87102612ÌM[¸Þ.þàN¾<9†Zl^04SEP8710261404SEP87102614Ì^¹Ò.{àI ˜›rÛl^04SEP8710163604SEP87101635Ì{ìÑ.xàL$›r\Kl^04SEP8710163004SEP87101630ÌEM.zàMê›r]Kl^04SEP8710163104SEP87101631ÌOz.|àLš›rl^l^04SEP8710163704SEP87101636Ì„œI5.wàM(›r[q�l^04SEP8710162904SEP87101629Ì>d?.ŒàG`ŒsæYl^04SEP8710183404SEP87101834ÌË.ŠàG`Œs^Zl^04SEP8710183204SEP87101832ÌÅu.�àG€Œs†Zl^04SEP8710183604SEP87101836ÌÓÖ­!.ÿà€~~þ»¢_04SEP8710273404SEP87102723Ì}vjÈ.à€@¼¢_04SEP8710274004SEP87102738ÌôUc.à€00¢¾¢_04SEP8710274804SEP87102743Ì/|.à€&&>¬ ¢_04SEP8710275304SEP87102749Ì%8±~.à€þç¢_04SEP8710275804SEP87102756Ì^¯h.à€<<�¢_04SEP8710280604SEP87102801Ì;o΋.à€**8e¢_04SEP8710283004SEP87102808Ìÿ«)«‰˜.à€ÒÒ.a¢_04SEP8710284904SEP87102833ÌÑØX..à€¦Ø¢_04SEP8710285404SEP87102851̪©v.à€%%J,¢_04SEP8710290004SEP87102856Ì$ÅÏ€. à€((¼–¢_04SEP8710290604SEP87102902Ì'êׂ. à€77R ¢_04SEP8710291504SEP87102909Ì6¾™. à€÷÷°„À]¢_04SEP8710301504SEP87102917ÌÿIÿIöIî. à€@@:„€p¢_04SEP8710302404SEP87103018Ì?@D. à€11ž¢_04SEP8710303004SEP87103026Ì0€Û“.à€¤¤Êû¢_04SEP8710304404SEP87103032Ì£±.à€cc’%¢_04SEP8710305504SEP87103047ÌbUË.à€99é¢_04SEP8710310104SEP87103057Ì8¸rž.à€xx.ôjL¢_04SEP8710312904SEP87103103Ìÿñwñ¯G.à€AAF"¢_04SEP8710313704SEP87103131Ì@iŸ©.à€””Tœ"¢_04SEP8710315304SEP87103139Ì“ª.à€eeL&¢_04SEP8710320504SEP87103156Ìd>°Ô.à€˜˜Êô&¢_04SEP8710322004SEP87103208Ì—£Ü.à€““2x'¢_04SEP8710323204SEP87103223Ì’;[.à€<<œ'¢_04SEP8710324004SEP87103235Ì;Î8².à€jj²¢(¢_04SEP8710325104SEP87103242Ìi †ß.à€ dw*?T¢_04SEP8710325504SEP87103253ÌtùÕ.à€““0È8Z¢_04SEP8710330804SEP87103257Ì’} t.à€WWy:¢_04SEP8710331804SEP87103310ÌV ¬Ú.à€33þƒ:¢_04SEP8710332504SEP87103321Ì2g ¨¹.à€ŒŒN°:¢_04SEP8710333804SEP87103328Ì‹š .à€&1KüX¢_04SEP8710334204SEP87103341Ì&!þ.à€FFºbK¢_04SEP8710335304SEP87103345ÌE;!Aå. à€MMYM¢_04SEP8710340204SEP87103355ÌL�!ðè.!à€66â�M¢_04SEP8710340804SEP87103403Ì5Î!Ò."à€––¬kQ¢_04SEP8710342104SEP87103411Ì•"£6.#à€;;ÜÊQ¢_04SEP8710344404SEP87103424Ìÿš":š#³.$à€{{fDR¢_04SEP8710345404SEP87103446ÌzÕ#Ù$.%à€��J4SJ†¢_04SEP8710350604SEP87103456Ì€P$ƒ®.&à€ffTaT¢_04SEP8710351704SEP87103509ÌeÖ$¾.'à€8QX¢x¢_04SEP8710352104SEP87103519Ì <%å8.(à€¨¨š²_¢_04SEP8710353504SEP87103523̧J%N].)à€""ˆàw!!ö›r[q�xQ04SEP8710402004SEP87104020Ì 0 S.?àwx8[qxQ04SEP8710402204SEP87104021Ì!0œãPUFDOÀÁz,àPPUFDPÀÁz,àP.,àPGG(» :}}Ì16SEP8710433416SEP87104333ÌFŒÃ.,à€òó�s¥Æ»z04SEP8711020804SEP87105222ÌÿJŒñJ�6‹.,à€ !¾€04SEP8710522404SEP87105224Ì<Ž.,à€²K€04SEP8710522504SEP87105225Ì\Žæ1.,à€56þv€04SEP8710522704SEP87105226Ì4bŽ™�.,à€‚ƒ�s¥Æ€04SEP8710522804SEP87105228Ì�—Ž¡ .,àz�s¥Æây04SEP8710522904SEP87105229Ì�H7.,à€z¥Æ€04SEP8710523104SEP87105230Ì 8�@Ì.,àz4z¥Æây04SEP8710523104SEP87105231ÌF�L½.,à€ ð¥Æ€04SEP8710523304SEP87105232Ì L�ÊÍ.,àz,ð¥Æây04SEP8710523304SEP87105233ÌX�Ì¿.,à€ñ¥Æ€04SEP8710523504SEP87105234Ì\�ÓÉ.,àz\ñ¥Æây04SEP8710523504SEP87105235Ìb�¿.,à€ò¥Æ€04SEP8710523704SEP87105236Ìd�ØÇ.,à$ò¥Æây04SEP8710523704SEP87105237Ìf�v¿.,à€KŠ¥Æ€04SEP8710523904SEP87105238Ìg�VG. ,àz @KŠ¥Æây04SEP8710524004SEP87105239Ì x�n=.!,à€…¥Æ€04SEP8710524104SEP87105240Ì„�ŠÀ.",à€ Tðs€04SEP8710524204SEP87105242̆�´u.#,àz Tðsây04SEP8710524404SEP87105243ÌŽ�,j.$,à€¤ðs€04SEP8710524504SEP87105244Ì��w.%,àz|¤ðsây04SEP8710524604SEP87105246Ì—�cl.&,à€¼ðs€04SEP8710524704SEP87105247̘�/x.',àz$¼ðsây04SEP8710524904SEP87105248Ìœ�/o.(,à€äðs€04SEP8710525004SEP87105250Ìž�]t.),àzäðsây04SEP8710525104SEP87105251̤�Ri.*,à€ ðs€04SEP8710525304SEP87105252̦�–x.+,àz< ðsây04SEP8710525404SEP87105254Ì®�©m.,,à€ Ôðs€04SEP8710525504SEP87105255̰�n}.-,àzôÔðsây04SEP8710525704SEP87105256̹�9q..,à€Lðs€04SEP8710525804SEP87105258Ì »�†./,àz�Lðsây04SEP8710525904SEP87105259ÌÉ�as.0,à€Äðs€04SEP8710530104SEP87105300ÌË�mq.1,àzLÄðsây04SEP8710530204SEP87105302ÌÏØ.2,à€ëÈ_€04SEP8710530404SEP87105303Ì…t)D.3,à€ ìðs€04SEP8710530504SEP87105305ÌÒ�©y.4,àz¸ìðsây04SEP8710530604SEP87105306ÌÚ�6m.5,à€„Mðs€04SEP8710530804SEP87105307ÌÛ�G¨.6,àz4„Mðsây04SEP8710530904SEP87105308Ìß�TŸ.7,à€ LSðs€04SEP8710531004SEP87105310Ìà�¬.8,àz�LSðsây04SEP8710531104SEP87105311Ìè�|Ÿ.9,à€ ,àz�ŒTðsây04SEP8710531904SEP87105319Ì�ì¨.?,à€dYðs€04SEP8710532004SEP87105320Ì �X®.@,àz�dYðsây04SEP8710532204SEP87105321Ì �Ã¥.A,à€KgÈ_€04SEP8710532304SEP87105323Ì�(¯.B,àzðKgÈ_ây04SEP8710532404SEP87105324Ì�î£.C,à€$qðs€04SEP8710532604SEP87105325Ì�0Ì.D,àz,$qðsây04SEP8710532704SEP87105326Ì�5Ã.E,àz$€ðsây04SEP8710532804SEP87105328Ì�.Ú.F,à€ $€ðs€04SEP8710532904SEP87105329Ì#�yú.G,àzØ%€ ™ây04SEP8710533104SEP87105330ÌB�8ó.H,à€ %€ ™€04SEP8710533204SEP87105332ÌC�˜.I,à€¤Œðs€04SEP8710533304SEP87105333ÌK�ëç.J,àz4¤Œðsây04SEP8710533404SEP87105334ÌP�÷Ý.K,à€#$ &[q€04SEP8710533604SEP87105336Ì"Q� .L,à|  &[qây04SEP8710533704SEP87105337Ì t�Þ�.M,àNô» vLš‹Ì04SEP8710533904SEP87105339Ì€�s.N,à Ú» vL9€Ì04SEP8710534004SEP87105340Ì��KT.O,àN&&B�s¸QkQ04SEP8710534204SEP87105342Ì%”�¨ŸPUFDQÀÁz,àP.@,à:ÐüàLÌ04SEP8710450904SEP87104508ÌuA«£.±,àzP„ây04SEP8710420404SEP87104204Ìì4�.ä,àz„w*?Tâyây04SEP8710425404SEP87104254ÌRBç†. ,àz�›r[qây04SEP8710415004SEP87104150Ì”3Na.¡,àz�sKŠây04SEP8710415104SEP87104151ÌÂ0 œ3Ÿµ.½,àz¨‹wây04SEP8710421604SEP87104216Ì’8ú.ÿ,àzØxây04SEP8710432204SEP87104321Ì^KÍ .Ã,àz 0´–ây04SEP8710422104SEP87104221Ì $9l.ú,à€`a»€04SEP8710431704SEP87104317Ì_YJˆ.,à€89»„(€04SEP8710435104SEP87104351Ì7fQì .?,à€9:»[q€04SEP8710442104SEP87104421Ì8ØXUY.¨,à€#$¼€04SEP8710415704SEP87104156Ì"84ž±.À,à€;<Æ}€04SEP8710421904SEP87104218Ì:µ8lJ.,à€)*Æ~K€04SEP8710432404SEP87104324Ì(yKN•.$,à€)*ÆÕÀv€04SEP8710435604SEP87104356Ì( S˜Ï.ü,à€-.Ç€04SEP8710431904SEP87104319Ì,õJÎÓ.§,à€Ë€04SEP8710415604SEP87104156Ì'4vŸ.,à€Ë„(€04SEP8710432304SEP87104322Ì`KrÏ.",à€ Ë[q€04SEP8710435504SEP87104354ÌîR'.á,à€9:¬ €04SEP8710425204SEP87104251Ì8}A4×.©,à€ç€04SEP8710415804SEP87104157Ì[4äµ.Ò,à€UV€04SEP8710423504SEP87104234ÌTù;@ñ.Á,à€!"_€04SEP8710421904SEP87104219Ì ð8 ½.ë,à€“”e€04SEP8710430204SEP87104301Ì’™DÃ3.Â,à€m€04SEP8710422004SEP87104220Ì9¨.ø,à€ÎÏa€04SEP8710431604SEP87104315ÌÍeI}. ,à€”•a„(€04SEP8710435204SEP87104352Ì“žQ„t.A,à€“”a[q€04SEP8710442404SEP87104424Ì’1Y Ä.î,à€xy¼€04SEP8710430504SEP87104304ÌwÍE!.,à€ef¼„(€04SEP8710434704SEP87104346ÌdfPGG.8,à€fg¼[q€04SEP8710441504SEP87104414Ìe#W÷“.ñ,à€:;Ø€04SEP8710430804SEP87104308Ì9tGké.,à€Ø„(€04SEP8710434504SEP87104344ÌPdø.;,à€Ø[q€04SEP8710441804SEP87104417Ì2X�L.Ñ,à€NO&€04SEP8710423404SEP87104233ÌM«;öî.¶,à€./,€04SEP8710420904SEP87104208Ì-ê5âÊ.,à€,„(€04SEP8710432604SEP87104326̲KNó.%,à€,[q€04SEP8710435704SEP87104357Ì3SÍH.æ,à€)*–€04SEP8710425604SEP87104256Ì( B*Ö.,à€–„(€04SEP8710434104SEP87104340ÌO,ñ.6,à€–[q€04SEP8710441304SEP87104412ÌóVE.õ,à€BC €04SEP8710431204SEP87104312ÌA¥Hsî.¹,à€ˆ‰„€04SEP8710421204SEP87104211ÌÿN6‡N7Ÿ\.¦,à€-.ä€04SEP8710415504SEP87104155Ì,ú3˜Î.D,à€€04SEP8710442704SEP87104427Ì£ZÞÜ.Ý,à€LM€04SEP8710424704SEP87104246ÌKh@±û.,à€,-„(€04SEP8710433704SEP87104336Ì+oN..1,à€23€04SEP8710440904SEP87104408Ì1.Vòh.Û,à€VWû€04SEP8710424504SEP87104244ÌUÏ? .å,à€MN%€04SEP8710425504SEP87104255ÌLSB²ÿ.Ü,à€CDé€04SEP8710424604SEP87104245ÌB%@+ö.,à€#$é„(€04SEP8710433704SEP87104337Ì"›N.2,à€)*é[q€04SEP8710440904SEP87104409Ì(`Väe.è,à€ÜÝô€04SEP8710425904SEP87104258ÌÛœCï—.!,à€¼½ô„(€04SEP8710435404SEP87104353Ì»2Rþª.B,à€ÃÄô[q€04SEP8710442604SEP87104425ÌÂÄY–.È,à€89)!€04SEP8710422504SEP87104225Ì7Ü9õã.,à€)!„(€04SEP8710432904SEP87104328Ì L´.),à€)![q€04SEP8710440004SEP87104400ÌžS8O.Ç,à€23"€04SEP8710422504SEP87104224Ì1ª9©Ý.G,à€/0S#Y`€04SEP8710443004SEP87104429Ì.àZæe.E,à€ Y#ŒZ€04SEP8710442804SEP87104428Ì µZ´:.F,à€ b#l€04SEP8710442904SEP87104428ÌÁZÑ.³,à€*+&×M€04SEP8710420604SEP87104205Ì)5·!.Ù,à€ˆ‰x'€04SEP8710424304SEP87104242̇?!?. ,à€GHx'„(€04SEP8710433204SEP87104331ÌFwLÂ2./,à€bcx'[q€04SEP8710440704SEP87104406Ìa¦U&£.ò,à€FGœ'€04SEP8710430904SEP87104309ÌE®Gƒ .ï,à€bc¢(€04SEP8710430604SEP87104305ÌaEFR!.,à€IJ¢(„(€04SEP8710434604SEP87104345ÌHPª>.9,à€JK¢([q€04SEP8710441604SEP87104415ÌI‰W Ž.´,à€R)€04SEP8710420704SEP87104206ÌD5´.â,à€ w*?T€04SEP8710425204SEP87104252Ì ¶A.Æ,à€CDÔ2€04SEP8710422404SEP87104223ÌBg9>þ.,à€*+Ô2„(€04SEP8710432804SEP87104328Ì)áKO&.(,à€*+Ô2[q€04SEP8710440004SEP87104359Ì)tS×u.Ó,à€bcÓ4€04SEP8710423604SEP87104235ÌaN<r%.í,à€stÅ8€04SEP8710430404SEP87104303ÌrZE¨?.,à€^_Å8„(€04SEP8710434404SEP87104343Ì]§O}a.:,à€_`Å8[q€04SEP8710441704SEP87104416Ì^ÓW¦´.Ê,à€:;y:€04SEP8710422704SEP87104227Ì9#:”.­,à€+,ƒ:€04SEP8710420104SEP87104200Ì*‡4¿ã.ô,à€xy°:€04SEP8710431104SEP87104311Ìw-HuH.,à€UV°:„(€04SEP8710434904SEP87104348ÌTâP›`.=,à€WX°:[q€04SEP8710441904SEP87104419ÌVdX².ì,à€./Ð:€04SEP8710430304SEP87104302Ì-,Eùú.,à€Ð:„(€04SEP8710434304SEP87104342Ì’Oß.7,à€Ð:[q€04SEP8710441404SEP87104413Ì WUk.ß,à€QRbK€04SEP8710424904SEP87104248ÌPê@‹3.,à€()bK„(€04SEP8710433904SEP87104339Ì'ÙNßA.4,à€34bK[q€04SEP8710441104SEP87104411Ì2¤V°”.¯,à€12YM€04SEP8710420304SEP87104202Ì0·4Õþ.ö,à€DE�M€04SEP8710431304SEP87104313ÌCçH«).,à€�M„(€04SEP8710434904SEP87104349Ì7Q_;.>,à€�M[q€04SEP8710442004SEP87104420Ì»XÓ‚.Õ,à€_`kQ€04SEP8710423804SEP87104237Ì^Ñ<‹A. ,à€GHkQ„(€04SEP8710433204SEP87104332ÌF¾Lý].-,à€GHkQ[q€04SEP8710440504SEP87104404ÌF¸Tñ®.Ô,à€!"oQ€04SEP8710423704SEP87104236Ì °<ð.C,à€¼Q€04SEP8710442704SEP87104426̇Zz.»,à€´µÊQ€04SEP8710421404SEP87104214̳Û7~�.ª,à€ËQ Œ€04SEP8710415804SEP87104158Ìy4Sl.«,à€ËQ·Œ€04SEP8710415904SEP87104159Ì}4rn.®,à€ËQ·Œ€%€04SEP8710420204SEP87104201̲4ˆ.¬,à€ËQ·ŒÀ+€04SEP8710420004SEP87104200Ì‚4+�.°,à€íQ€04SEP8710420304SEP87104203Ìè4A×.ç,à€ÓÔDR€04SEP8710425804SEP87104257ÌÒÉBX¿.H,à€ ¶Rl†€04SEP8710443104SEP87104430Ì [J�.Ë,à€56­S€04SEP8710422804SEP87104228Ì4]:ú.Ð,à€WXaTÈ€04SEP8710423304SEP87104232ÌVT;²<.ó,à€9:7ªfHd?¬tNH¶001001SYSTEMSYSTEM SYSTEM SY00ÊQ»z200001USER USER A.NEW SY00ÊQJ†00DATADATADATADATADATADATADATADATADATADATA00' æ 1g00/ 5TADATADATADATADATADATADATADATADATA.;C.;***************************************************************** .;* *3.;* RSX-11M-PLUS distribution kit. * .;* *.;* **.;* Version 4.0 Base level 40 *.;* *4.;* Created on 04-SEP-87 at 10:09:20 *.;* *..;* Created by KITBUILD version 06.05 *.;* *4.;* This kit is labelled RSX11MPBL40 *.;* *C.;*****************************************************************E.; .ENABLE GLOBAL* .ENABLE SUBSTITUTION* .SETS $V30LV "K,"***** .;* *3.;* RSX-11M-PLUS distribution kit. * .;* *.;* **.;* Version 4.0 Base level 40 *.;* *4.;* Created on 04-SEP-87 at 10:09:20 *.;* *..;* Created by KITBUILD version 06.05 *.;* *4.;* This kit is labelled RSX11MPBL40 *.;* *C.;*****************************************************************E00!7"8 1g .; Title: VERSION.CMD .;E< .; This file defines the system version number for BASTART. .;  .ENABLE GLOBAL .SETS $VERSN "4.0" .SETS $BLVL "40" *.;* **.;* Version 4.0 Base level 40 *.;* *4.;* Created on 04-SEP-87 at 10:09:20 *.;* *..;* Created by KITBUILD version 06.05 *.;* *4.;* This kit is labelled RSX11MPBL40 *.;* *C.;*****************************************************************E<Á0ÀW .9î$¢8�,(¢;�+Þ¢K�, À¸[,èÀ»[-^ÀË[.F6À¨Ë˜48h/–4;h.(4Kh.ú5¸[0Þ5»[/v5Ë[0@L 8š1tL ;š10L Kš1êr ø/1Îr û/2vr 024/ ‹&&¤å "ŠåÀ¨!~å8©!"師!äôK+$ôÐM+ )ã}ðE8OFÝ:� &ÝO� €68�3X6;�2º6K�3¦¥¸)4襻)4¤¥Ë)4b¯ø/7ʯû/8ú¯ 08ð¯¸[5¢¯»[6Ô¯Ë[6ʯ£wðÓ8�:¼Ó;�9îÓK�9¸×º�²×Ï�ר�Nó8�:úó;�;óK�;î%  €C¸t<¶C»t<fCËt=&‘ø“=´‘û“=^‘ ”>—¸)>ò—»)>¤—Ë)>f¢ø/?²¢û/?Z¢ 0@¦8�@ž¦;�@¶¦K�A”ÁÀ¨¨ÁôªÿÔÁΫÿÁÏ«ý~Á˜­ûÁÀ­ûÁ®ü„ÅÀ¨zÊxnB˜Ê{nAPÊ‹nB̳qg;qzË8OCžË;OBhËKOC*΋:#"ÎØ©*rÎ(ª*:Πª*€Îðª*äÔ{"özÀ¨Æ ïø/Dúïû/E@ï 0Fï¸[Cúï»[DBïË[D ÕksÔzù¸tG ù»tFöùËtF°û8hG¢û;hGxûKhG22ø/Gú2û/H¢2 0H`[ ÃR t!!ø“Hæ!!û“I�!! ”IN'!¸)J$'!»)IÖ'!Ë)J˜6!8�Jä6!;�K�6!K�KP[!8�KÚ[!;�L´[!K�L„q!¸tMVq!»tM*q!ËtMäs!8hNÚs!;hM°s!KhNj""À¨ÇD #¸)Ov #»)N2 #Ë)Nð #8�Pp #;�O0 #K�Oê#8�Qv#;�PÈ#K�P†#øHRÔ#ûHQ„# IRB &» Ú &ÓQ !&9�ò!&J�t"& Œ"&¹)�"&Ê)þ"&ùHb"& IÊ"&ëzØ/&‹&#ˆ/&Ä)V/&9hž/&Jh2&ùä2& ^3&Ë^)jI&  I&8�R˜I&;�S‚I&K�S:Ä&Ë^ö°Ä&³böÀô&³:Ö ö&{; Š(Ë^(8Š(ëz\‹(À¨S¼‹(8©TX‹(¸«UH;,xR.8�d¢R.;�cÈR.K�cŽ•.ø/dä•.û/e,•. 0eòË.ø“g8Ë.û“f Ë. ”fÆé.xUh¨é.{Ug’é.‹UgRó.øHjÚó.ûHió. IiÜð3 ê 4Ë^ùB 4³bùR�9¸tk¨�9»tkö�9ËtkT�:ksÍêL;{ 墦Kk”²K¸¿,2M "=M{^Ë$xQÀ¨kðxQ8©l˜xQ¸«lR®SÀ¨ÊT8�m@T;�lØTK�m¨Àwx ˜ÄÀw{ —~Àw‹ ˜<Ûxø/˜€Ûxû/™¼Ûx 0š’ñx8hä ySã0y âhyø›yû›By œCy³:ØEyx œôEy{ œ®Ey‹ œlNy8�ÚNy;�°NyK�j00"?5TADATADATADATADATADATADATADATADATARyx žxRy{ ž2Ry‹ žðWy¸[Ÿ4Wy»[ ÌWyË[ ð”yx ¢Ð”y{ ¡Š”y‹ ¢H•yx £Ò•y{ ¢Œ•y‹ £J•y¸)£Ž•y»)¤„•yË)¤T•y8š¥b•y;š¥•yKš¥Ê¢yx ¦,¢y{ ¦æ¢y‹ ¦¤áy¸)§|áy»)§*áyË)§èáyã}ç8éyxU©véy{U¨Féy‹U¨ìyøaªìyûaªØìy bªžïy8h¬Vïy;h¬°ïyKh¬fóyx#«fóy{#«óy‹#«Î4z¸­,4z»¬Ø4zË­šDzøH®jDzûH® Dz I®Òkz8�¯Pkz;�¯œkzK�°fõ}x "õ}{ "ìõ}‹ #¢ï~ø/²Tï~û/³Nï~ 0´hï~¸[°ï~»[±úï~Ë[²Ñ¸[çÖåX€3€cžéê'…¸)µÒ'…»)´¨'…Ë)µ`I…8hµ,I…;hµÖI…Kh¶”L…³:àîL†8h¶L†;h¶ÐL†Kh·’SŒ8¸¨SŒ;·SŒK·ðSŒøz¹TSŒûz¸ÊSŒ {¹œSŒ8š»SŒ;šºvSŒKšºH|Œx ¼Ü|Œ{ »"|Œ‹ ¼ŠŒø½TŠŒû½ªŠŒ ¾œñ�8�b�S¾ˆb� ¿P5‘8hÂæ5‘;hÀˆ5‘KhÁ¸™’ã}>Á’ø/ÃÜÁ’û/òÁ’ 0Ãlì’øaÅxì’ûaÄ4ì’ bÄþó’x#Ææó’{#Ŧó’‹#Æb\¯,Eʨ\¯tHËH\¯ IËìl°a èw°,"áJw°tRâj\±a ”ƒ±e^’„±a >‰±<±±¤^áÖ§² .BLKB NFILES*S.BFHD+B .IFF .BLKB NFILES*T .ENDC .PSECT PSECTL .ENDM FSRSZ$fW  .MACRO FDBDF$ .MCALL FDBSZ$ FDBSZ$B ...PC1=.L .BLKB S.FDB .ENDM FDBDF$EòW 00"O5TADATADATADATADATADATADATADATADATA' .MACRO FDAT$A RTYP,RATT,RSIZ,CNTG,ALOC .MCALL FDOFF$,CBYTE$,CWORD$ FDOFF$ DEF$L, CBYTE$ ,F.RTYPA CBYTE$ ,F.RATTC CWORD$ ,F.RSIZD CWORD$ ,F.CNTG CWORD$ ,F.ALOCS .ENDM FDAT$AºW  .MACRO FDRC$A RACC,URBA,URBS, .MCALL FDOFF$,CBYTE$,CWORD$ FDOFF$ DEF$LF CBYTE$ ,F.RACCH CWORD$ ,F.URBD+2  CWORD$ ,F.URBD .ENDM FDRC$AòW ( .MACRO FDOP$A LUN,FNPT,DFNB,FACC,FACTRL .MCALL FDOFF$,CBYTE$,CWORD$ FDOFF$ DEF$L. CBYTE$ ,F.LUNT CWORD$ ,F.DSPTL CWORD$ ,F.DFNB CBYTE$ ,F.FACC  CWORD$ ,F.ACTLR .ENDM FDOP$ACÒW ! .MACRO FDBF$A EFN,OVBS,MBCT,MBFG  .MCALL FDOFF$,CBYTE$,CWORD$ FDOFF$ DEF$L CBYTE$ ,F.EFNC CWORD$ ,F.OVBSD CBYTE$ ,F.MBCTO CBYTE$ ,F.MBFGC .ENDM FDBF$AOW , .MACRO FDBK$A BKAD,BKSZ,BKVB,BKEF,BKST,BKDN .MCALL FDOFF$,CBYTE$,CWORD$ FDOFF$ DEF$LF CWORD$ ,F.BKDS+2$ CWORD$ ,F.BKDS  CWORD$ ,F.BKVB+2U CBYTE$ ,F.BKEFP CWORD$ ,F.BKSTN CWORD$ ,F.BKDNC .ENDM FDBK$ACêW + .MACRO FDAT$R FDB,RTYP,RATT,RSIZ,CNTG,ALOCE .MCALL LDFDB$,CMOV$W,CMOV$B LDFDB$ FDBW CMOV$B RTYP,F.RTYP CMOV$B RATT,F.RATT CMOV$W RSIZ,F.RSIZD CMOV$W CNTG,F.CNTGC CMOV$W ALOC,F.ALOCM .ENDM FDAT$RB¶W ! .MACRO FDRC$R FDB,RACC,URBA,URBS, .MCALL LDFDB$,CMOV$W,CMOV$B LDFDB$ FDB$ CMOV$B RACC,F.RACCO CMOV$W URBA,F.URBD+2C CMOV$W URBS,F.URBD .ENDM FDRC$RFêW , .MACRO FDOP$R FDB,LUN,FNPT,DFNB,FACC,FACTRL .MCALL LDFDB$,CMOV$W,CMOV$B LDFDB$ FDB CMOV$B LUN,F.LUNT CMOV$W FNPT,F.DSPT, CMOV$W DFNB,F.DFNBD CMOV$B FACC,F.FACCL CMOV$W FACTRL,F.ACTLP .ENDM FDOP$R$ÌW % .MACRO FDBF$R FDB,EFN,OVBS,MBCT,MBFGC .MCALL LDFDB$,CMOV$W,CMOV$B LDFDB$ FDB CMOV$B EFN,F.EFNR CMOV$W OVBS,F.OVBSA CMOV$B MBCT,F.MBCT$ CMOV$B MBFG,F.MBFGB .ENDM FDBF$R W 0 .MACRO FDBK$R FDB,BKAD,BKSZ,BKVB,BKEF,BKST,BKDN# .MCALL LDFDB$,CMOV$B,CMOV$W,CMOV$2P LDFDB$ FDBP CMOV$W BKAD,F.BKDS+2C CMOV$W BKSZ,F.BKDSV CMOV$2 BKVB,F.BKVBO CMOV$B BKEF,F.BKEF$ CMOV$W BKST,F.BKST$ CMOV$W BKDN,F.BKDN$ .ENDM FDBK$R~W  .MACRO FDBSZ$ .IIF DF,S.FDB,.MEXIT .MCALL FDOFF$,DEF$L FDOFF$ DEF$NC DEF$L S.FDB .ENDM FDBSZ$BRW  .MACRO FDOF$L .MCALL FDOFF$ FDOFF$ DEF$L .ENDM FDOF$LCšW + .MACRO NMBLK$ FNAME,FTYPE,VERS,DEVNAM,UNITD .MCALL RAD50$,CWORD$,NBOFF$ NBOFF$ DEF$LL .IIF NDF,...PC1,...PC1=0$ ...PC3=...PC1 ...PC1=.K .=...PC1+N.FNAM RAD50$ ,S.FNAM/2 .=...PC1+N.FTYP RAD50$ ,S.FTYP/2 CWORD$ ,N.FVERK .IF NB,DEVNAM .=...PC1+N.DVNM .WORD "DEVNAM .ENDC CWORD$ ,N.UNITI .=...PC1+S.FNB$ ...PC1=...PC3 .ENDM NMBLK$SRW  .MACRO NBOF$L .MCALL NBOFF$ NBOFF$ DEF$LD .ENDM NBOF$LE„W  .MACRO LDFDB$ FDB .IIF B,FDB,.MEXIT .NTYPE PAR$$$,FDB .IIF EQ,PAR$$$,.MEXIT MOV FDB,R0 .ENDM LDFDB$šW  .MACRO CMOV$W VAR,OFFSET. .IF IDN,<#0>,. CLR OFFSET(R0)A .MEXITM .ENDC .IIF NB,VAR, MOV VAR,OFFSET(R0) .ENDM CMOV$WVœW  .MACRO CMOV$B VAR,OFFSETM .IF IDN,<#0>,N CLRB OFFSET(R0) .MEXIT .ENDC! .IIF NB,VAR, MOVB VAR,OFFSET(R0)B .ENDM CMOV$B¢W  .MACRO CMOV$2 VAR,OFFSETF .IIF B,VAR,.MEXIT MOV VAR,-(SP) MOV @(SP),OFFSET(R0)F ADD #2,(SP) MOV @(SP)+,OFFSET+2(R0) .ENDM CMOV$2RŠW  .MACRO CBYTE$ VAR,OFFSET .IF NB,VAR ...PC2=.V .=...PC1+OFFSET .BYTE VAR .=...PC2R .ENDC .ENDM CBYTE$ŠW  .MACRO CWORD$ VAR,OFFSETN .IF NB,VAR ...PC2=. .=...PC1+OFFSET .WORD VAR .=...PC2< .ENDC .ENDM CWORD$T"W & .MACRO CSTRG$ VAR,OFFSET,MAXLG,FILL=0 .IF NB, .NCHR ...PC3, .IF GE MAXLG-...PC3F ...PC2=., .=...PC1+OFFSET .ASCII ^VAR^F .REPT MAXLG-...PC3 .BYTE FILLS .ENDR .=...PC2R .IFF .ER00"W8 1gROR .ENDCB .ENDC .ENDM CSTRG$NZW  .MACRO CGET$B OFFSET,VARV" .IIF NB MOVB OFFSET(R0),VAR .ENDMZW  .MACRO CGET$W OFFSET,VARF! .IIF NB MOV OFFSET(R0),VARS .ENDMHW  .MACRO FCSBT$ GLOBL .MCALL DEFIN$ ...GBL=0R" .IIF IDN,,,...GBL=1 DEFIN$ FD.FTN,1 DEFIN$ FD.CR,2 DEFIN$ FD.PRN,4 DEFIN$ FD.BLK,10 DEFIN$ FD.RWM,1 DEFIN$ FD.RAN,2 DEFIN$ FD.PLC,4 DEFIN$ FD.INS,10L DEFIN$ FD.REC,1 DEFIN$ FD.CCL,2 DEFIN$ FD.TTY,4 DEFIN$ FD.DIR,10C DEFIN$ FD.SDI,20 DEFIN$ FD.SQD,40B DEFIN$ FD.ISP,2000B DEFIN$ FD.OSP,4000) DEFIN$ FD.PSE,10000 DEFIN$ FD.COM,20000 DEFIN$ FD.F11,40000 DEFIN$ FD.MNT,100000, DEFIN$ NB.VER,1 DEFIN$ NB.TYP,2 DEFIN$ NB.NAM,4 DEFIN$ NB.SVR,10. DEFIN$ NB.STP,20G DEFIN$ NB.SNM,40L DEFIN$ NB.DIR,100 DEFIN$ NB.DEV,200 DEFIN$ NB.SD1,400 DEFIN$ NB.SD2,1000F DEFIN$ NB.ANS,2000  DEFIN$ NB.WCH,4000P DEFIN$ R.FIX,1I DEFIN$ R.VAR,2D DEFIN$ R.SEQ,3D DEFIN$ R.STM,4D DEFIN$ FA.RD,1D DEFIN$ FA.WRT,2 DEFIN$ FA.EXT,4 DEFIN$ FA.CRE,10N DEFIN$ FA.TMP,20F DEFIN$ FA.SHR,40D DEFIN$ FA.APD,100 DEFIN$ FA.NSP,100 DEFIN$ FO.RD,FA.RD0# DEFIN$ FO.WRT,FA.WRT!FA.EXT!FA.CREV# DEFIN$ FO.APD,FA.WRT!FA.EXT!FA.APDM DEFIN$ FO.MFY,FA.WRT DEFIN$ FO.UPD,FA.WRT!FA.EXT DEFIN$ FA.ENB,100000R DEFIN$ FA.SEQ,40000 DEFIN$ FA.WCK,20000 DEFIN$ FA.POS,10000 DEFIN$ FA.RWD,4000  DEFIN$ FA.EXL,4000P DEFIN$ FA.LKL,2000D DEFIN$ FA.EXC,2000N DEFIN$ FA.DLK,1000. DEFIN$ CH.AND,1 DEFIN$ FD.RAH,1 DEFIN$ FD.WBH,2 DEFIN$ FL.AEX,1;E DEFIN$ FF.RWD,1 DEFIN$ FF.POE,2 DEFIN$ FF.NV,3  DEFIN$ FF.SPC,4 DEFIN$ FF.CHR,5 DEFIN$ FF.RWF,6 DEFIN$ FT.ANI,1 DEFIN$ FT.BBF,2 DEFIN$ FT.MBF,4 .MACRO FCSBT$ ARG .ENDM FCSBT$Y .ENDM FCSBT$NfW  .MACRO DEFIN$ SYM,VAL .IIF EQ,...GBL-1,.GLOBL SYM SYM=^O .ENDM DEFIN$AW  .MACRO FDOFF$ OFFSET  .MCALL OFFSET,DEF$I,NBOFF$2 NBOFF$ OFFSET DEF$I 0 OFFSET F.RTYP,1 OFFSET F.RATT,1 OFFSET F.RSIZ,2 OFFSET F.HIBK,4 OFFSET F.EFBK,4 OFFSET F.FFBY,2 OFFSET S.FATT OFFSET F.RACC,1 OFFSET F.RCTL,1 OFFSET F.BKDS OFFSET F.URBD,4 OFFSET F.BKST OFFSET F.NRBD,2 OFFSET F.BKDN OFFSET ,2 OFFSET F.OVBS OFFSET F.NREC,2 OFFSET F.EOBB,2 OFFSET F.CNTG OFFSET F.RCNM,2 OFFSET F.STBK OFFSET ,2 OFFSET F.ALOC,2 OFFSET F.LUN,1M OFFSET F.FACC,1 OFFSET F.DSPT,2 OFFSET F.DFNB,2 OFFSET F.BKEF OFFSET F.EFN,1F OFFSET F.BKP1,1 OFFSET F.ERR,21 OFFSET F.MBCT,1 OFFSET F.MBC1,1 OFFSET F.MBFG,1 OFFSET F.BGBC,1 OFFSET F.VBSZ,2 OFFSET F.BBFS,2 OFFSET F.BKVB OFFSET F.VBN,41 OFFSET F.BDB,2 OFFSET F.EXT4 OFFSET F.SPDV,2 OFFSET F.FLG2 OFFSET F.SPUN,1 OFFSET F.CHR,1E OFFSET F.ACTL,2 OFFSET F.SEQN,2 OFFSET F.FNB,S.FNBN! .IIF IDN,,,.MEXITK .IF IDN,,C* .GLOBL F.FNAM,F.FTYP,F.FVER,F.DVNM,F.UNIT .ENDC F.FNAM=N.FNAM+F.FNB F.FTYP=N.FTYP+F.FNB F.FVER=N.FVER+F.FNB F.DVNM=N.DVNM+F.FNB F.UNIT=N.UNIT+F.FNB OFFSET S.FDB1 DEF$I 0 OFFSET FX.LEN,2 OFFSET FX.DMX,1 OFFSET FX.DLN,1 OFFSET FX.DIR,2 .MACRO FDOFF$ ARG .ENDM FDOFF$ .ENDM FDOFF$EW  .MACRO BDOFF$ OFFSET2 .MCALL OFFSET,DEF$I DEF$I 0 OFFSET ,4 OFFSET B.VBN,4E OFFSET B.BBFS,2 OFFSET B.NXBD,2 OFFSET ,1 OFFSET B.BFST,1 OFFSET ,2 OFFSET S.BFHD! .IIF IDN,,,.MEXITD .MACRO BDOFF$ ARG .ENDM BDOFF$F .ENDM BDOFF$.vW  .MACRO NBOFF$ OFFSET= .MCALL OFFSET,DEF$I,DEF$L DEF$I 0 OFFSET S.FNAM OFFSET S.FTYP OFFSET S.FNTY OFFSET S.FNBW OFFSET S.ANM1 OFFSET S.ANM2 S.FNAM=6F S.FTYP=2N S.ANM1=12.. S.ANM2=5. S.FNTY=/2  OFFSET N.FID,2. OFFSET N.ANM1,4 OFFSET N.FNAM,S.FNAM OFFSET N.FTYP,S.FTYPE OFFSET N.FVER,2 OFFSET S.NFEN DEF$L S.NFEN  OFFSET N.STAT,2 OFFSET N.NEXT,2 OFFSET N.ANM2 OFFSET N.DID,6I OFFSET N.DVNM,2 OFFSET N.UNIT,2 OFFSET S.FNBF DEF$L S.FNB S.FNBW=S.FNB/2B! .IIF IDN,,,.ME00"_5TADATADATADATADATADATADATADATADATAXITD .MACRO NBOFF$ ARG .ENDM NBOFF$F .ENDM NBOFF$F2W  .MACRO FSROF$ OFFSET1 .MCALL OFFSET,DEF$I,DEF$L DEF$I 0 OFFSET ,4 OFFSET A.BFSR,2 OFFSET A.EFSR,2 OFFSET A.OWUI,2 OFFSET A.FIPR,2 OFFSET A.DPB,24.. OFFSET A.IOST,4 OFFSET A.DFDR,26. OFFSET A.DFBC,2 OFFSET A.DFUI,2 OFFSET A.JUMP,4 OFFSET A.MODE,2 OFFSET A.EXDS,12. .IF DF L$$GCL OFFSET A.LGBK,50. S.LGBK=50.F OFFSET A.PRS,28.E S.PRS=28. .ENDC OFFSET S.FSR2 DEF$L S.FSR2, DEF$I 0 OFFSET A.OUBK,80. OFFSET A.LODV,6 OFFSET A.LODI,42. OFFSET A.LIDV,6 OFFSET A.LIDI,42. S.LDV=6 S.LDI=42. OFFSET A.LDVL,2 OFFSET A.LDVA,2 OFFSET A.LDIL,2 OFFSET A.LDIA,2 OFFSET S.FSR5 DEF$I 0 OFFSET ,16. OFFSET D.DFID,6 OFFSET D.DFDV,2 OFFSET D.DFUN,2! .IIF IDN,,,.MEXITF .MACRO FSROF$ ARG .ENDM FSROF$O .ENDM FSROF$.W  .MACRO FDSOF$ OFFSET5 .MCALL OFFSET,DEF$I,DEF$L DEF$I 0 OFFSET N.DEVD,4 OFFSET N.DIRD,4 OFFSET N.FNMD,4 OFFSET S.FIDS .IF IDN,,6 DEF$L S.FIDSI .MEXITF .ENDC .MACRO FDSOF$ ARG .ENDM FDSOF$ .ENDM FDSOF$FrW  .MACRO DEF$G VAR,SIZ. .MCALL DEF$L  .IIF NB,VAR,.GLOBL VAR DEF$L VAR,SIZ .ENDM DEF$GVW  .MACRO DEF$N VAR,SIZF .MCALL DEF$L, DEF$L ,SIZE .ENDM DEF$NFW  .MACRO DEF$I IVAL ...TPC=^O .ENDM DEF$IŽW  .MACRO DEF$L SYM,SIZI .IF NB,SYMI SYM=^O<...TPC>D .ENDC .IF NB,SIZ ...TPC=^O<...TPC+SIZ> .ENDC .ENDM DEF$LW  .MACRO RAD50$ STRING,MAXWRD ...PC2=.D .RAD50 /STRING/ .IF GT,<.-...PC2>-^O<2*MAXWRD>3 .ERROR ;STRING RAD50 - STRING TOO LONG, TRUNCATED  .=^O<...PC2+<2*MAXWRD>> .MEXIT .ENDC .REPT ^O/2>> .WORD 0 .ENDR .ENDM RAD50$F@W  .MACRO CALL ADR JSR PC,ADR .ENDM CALL.<W  .MACRO RETURN RTS PC .ENDM RETURN$>W  .MACRO CALLR ADRT JMP ADR .ENDM CALLRÂW  .MACRO ABRT$C TSK,PSCT,ERRL .MCALL ABRT$,DIR$ .IF NDF $$$GLBR .PSECT $DPB$.,D$$$=.. .IFTF ABRT$ TSK .IFT. .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM ABRT$C ˆW  .MACRO ABRT$S NADR,ERRD .MCALL RFA$,DIR$C RFA$ NADR MOV (PC)+,-(SP) .BYTE 83.,3 DIR$ ,ERR .ENDM ABRT$SÀW  .MACRO ABRT$ TSKR .MCALL R50$,OFF$L .IF NDF $$$GLB .BYTE 83.,3 R50$ TSKP .ENDC .IF NDF A.BTTN .NLIST OFF$R OFF$ A.BTTN,4 .LIST .ENDC .ENDM ABRT$vW & .MACRO ACHN$ MOD,TBMSK,LUN,FSBUF,FSSZ .MCALL OFF$,LNMOD$. .IF NDF $$$GLB$ LNMOD$F .BYTE 207.,5 .BYTE 6 .BYTE MOD .BYTE LUN .BYTE TBMSK .WORD FSBUF .WORD FSSZ .ENDC .IF NDF A.LFUNR6 .IRP X,<,,,,> OFF$ X3 .ENDM .IRP X,<,> OFF$ XA .ENDM .ENDC .ENDM ACHN$èW . .MACRO ACHN$C MOD,TBMSK,LUN,FSBUF,FSSZ,CS,ERR .MCALL ACHN$,DIR$ .IF NDF $$$GLBT .PSECT $DPB$.,D$$$=.N .IFTF ACHN$ MOD,TBMSK,LUN,FSBUF,FSSZ  .IFTS .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ACHN$C$âW + .MACRO ACHN$S MOD,TBMSK,LUN,FSBUF,FSSZ,ERRN .MCALL DIR$,MOV$,MVB$,LNMOD$. LNMOD$ MOV$ FSSZ MOV$ FSBUFR MVB$ LUN,TBMSKU MVB$ #6,MOD MOV (PC)+,-(SP) .BYTE 207.,53 DIR$ ,ERR .ENDM ACHN$S2ÒW # .MACRO ALTP$C TTASK,NPRIO,PSCT,ERR .MCALL ALTP$,DIR$ .IF NDF $$$GLBT .PSECT $DPB$.,D$$$=.R .IFTF ALTP$ TTASK,NPRIO .IFTL .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM ALTP$CKœW  .MACRO ALTP$S NAME,PRI,ERR$ .MCALL MOV$,RFA$,DIR$ MOV$ PRI RFA$ NAME MOV (PC)+,-(SP) .BYTE 9.,4B DIR$ ,ERR .ENDM ALTP$SMàW  .MACRO ALTP$ NAME,PRI .MCALL R50$,OFF$U .IF NDF $$$GLB6 .BYTE 9.,4C R50$ NAME .WORD PRI .ENDC .IF NDF A.LTTN$ .NLIST OFF$ OFF$ A.LTTN,4 OFF$ A.LTPR,2 .LIST .ENDC .ENDM ALTP$ÊW  .MACRO ALUN$C LUN,DA,DU,CS,ERR .MCALL ALUN$,DIR$ .IF NDF $$$GLBS .PSECT $DPB$.,D$$$=.C .IFTF ALUN$ LUN,D00"g8 1gA,DU .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ALUN$CIžW  .MACRO ALUN$S LUN,DA,DU,ERR .MCALL MOV$,DIR$E MOV$ DU MOV$ DA MOV$ LUN MOV (PC)+,-(SP) .BYTE 7,4 DIR$ ,ERR .ENDM ALUN$SFRW  .MACRO ALUN$ LUN,DA,DUP .MCALL OFF$ .IF NDF $$$GLB. .BYTE 7,4 .WORD LUN .IF B  .WORD 0 .IFF .NCHR $$$T1,$$$$T2=. .ASCII /DA/ .=$$$T2+2L .ENDC .WORD DU. .ENDC .IF NDF A.LULUF .NLIST+ .IRP X,<,,,>D OFF$ XF .ENDM .LIST .ENDC .ENDM ALUN$ºW  .MACRO ASTX$C PSCT,ERR  .MCALL ASTX$,DIR$ .IF NDF $$$GLBR .PSECT $DPB$.,D$$$=.M .IFTF ASTX$ .IFTS .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM ASTX$CŠW  .MACRO ASTX$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 115.,1L DIR$F .IIF NB , JSR PC,ERR .ENDM ASTX$SAZW  .MACRO ASTX$T .IF NDF $$$GLBO .BYTE 115.,1 .ENDC .ENDM ASTX$¨W  .MACRO ATRG$ RDB, .MCALL OFF$ .IF NDF $$$GLB .BYTE 57.,2 .WORD RDB .ENDC .IF NDF A.TRBAA OFF$X OFF$ A.TRBA,2 .ENDC .ENDM ATRG$¾W  .MACRO ATRG$C RDB,CS,ERRF .MCALL ATRG$,DIR$ .IF NDF $$$GLB  .PSECT $DPB$.,D$$$=.A .IFTF ATRG$ RDB .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ATRG$C.†W  .MACRO ATRG$S RDB,ERR .MCALL DIR$,MOV$$ MOV$ RDB MOV (PC)+,-(SP) .BYTE 57.,2 DIR$ ,ERR .ENDM ATRG$SìW 0 .MACRO CINT$C VEC,BASE,ISR,DSI,PSW,AST,PSCT,ERR .MCALL CINT$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.N .IFTF CINT$ VEC,BASE,ISR,DSI,PSW,ASTC .IFTM .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM CINT$C²W + .MACRO CINT$S VEC,BASE,ISR,DSI,PSW,AST,ERR .MCALL RVP$,DIR$ RVP$ VEC,BASE,ISR,DSI,PSW,AST MOV (PC)+,-(SP) .BYTE 129.,7 DIR$ ,ERR .ENDM CINT$SRLW & .MACRO CINT$ VEC,BASE,ISR,DSI,PSW,AST .MCALL OFF$ .IF NDF $$$GLBM .BYTE 129.,7 .WORD VEC .WORD BASEC .WORD ISR .WORD DSI .WORD PSW .WORD AST .ENDC .IF NDF C.INVE OFF$  OFF$ C.INVE,2 OFF$ C.INBA,2 OFF$ C.INIS,2 OFF$ C.INDI,2 OFF$ C.INPS,2 OFF$ C.INAS,2 .ENDC .ENDM CINT$¾W  .MACRO CLEF$C EFN,CS,ERR, .MCALL CLEF$,DIR$ .IF NDF $$$GLBR .PSECT $DPB$.,D$$$=.I .IFTF CLEF$ EFN .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CLEF$C†W  .MACRO CLEF$S EFN,ERR .MCALL MOV$,DIR$$ MOV$ EFN$ MOV (PC)+,-(SP) .BYTE 31.,2 DIR$ ,ERR .ENDM CLEF$SRºW  .MACRO CLEF$ EFN .MCALL OFF$ .IF NDF $$$GLB .BYTE 31.,2 .WORD EFN .ENDC .IF NDF C.LEEFO .NLISTI OFF$F OFF$ C.LEEF,2 .LIST .ENDC .ENDM CLEF$2W , .MACRO CLON$ MOD,PRMLST,LNS,LNSSZ,ENS,ENSSZ .MCALL OFF$,LNMOD$R .IF NDF $$$GLBD LNMOD$ .BYTE 207.,7E .BYTE 11. .BYTE MOD $$$ARG = 0 .IRP SYM .BYTE SYM$$$ARG=$$$ARG+1A .ENDM .IIF LT 2-$$$ARG,.ERROR .IF GT 2-$$$ARG .REPT <2-$$$ARG>. .BYTE 0 .ENDR .ENDC .WORD LNS .WORD LNSSZ .WORD ENS .WORD ENSSZ .ENDC .IF NDF C.LFUN$A .IRP X,<,,,,,> OFF$ XO .ENDM* .IRP X,<,,> OFF$ X .ENDM .ENDC .ENDM CLON$öW 4 .MACRO CLON$C MOD,PRMLST,LNS,LNSSZ,ENS,ENSSZ,CS,ERR .MCALL CLON$,DIR$ .IF NDF $$$GLBA .PSECT $DPB$.,D$$$=.> .IFTF' CLON$ MOD,,LNS,LNSSZ,ENS,ENSSZ2 .IFT, .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CLON$CEW 1 .MACRO CLON$S MOD,PRMLST,LNS,LNSSZ,ENS,ENSSZ,ERRZ .MCALL DIR$,MOV$,MVB$,LNMOD$R LNMOD$L MOV$ ENSSZD MOV$ ENS, MOV$ LNSSZ, MOV$ LNS MVB$ PRMLST MVB$ #11.,MOD MOV (PC)+,-(SP) .BYTE 207.,7 DIR$ ,ERR .ENDM CLON$S.0W , .MACRO CLOG$ MOD,PRMLST,LNS,LNSSZ,ENS,ENSSZ .MCALL OFF$,LNMOD$. .IF NDF $$$GLB LNMOD$$ .BYTE 207.,7  .BYTE 0 .BYTE MOD $$$ARG = 0 .IRP SYM .BYTE SYM$$$ARG=$$$ARG+1  .ENDM .IIF LT 2-$$$ARG,.ERROR .IF GT 2-$$$ARG .REPT <2-$$$ARG>L .BYTE 0 .ENDR .EN00"o5TADATADATADATADATADATADATADATADATADC .WORD LNS .WORD LNSSZ .WORD ENS .WORD ENSSZ .ENDC .IF NDF C.LFUN A .IRP X,<,,,,,>( OFF$ X) .ENDM* .IRP X,<,,> OFF$ X .ENDM .ENDC .ENDM CLOG$öW 4 .MACRO CLOG$C MOD,PRMLST,LNS,LNSSZ,ENS,ENSSZ,CS,ERR .MCALL CLOG$,DIR$ .IF NDF $$$GLBA .PSECT $DPB$.,D$$$=.> .IFTF' CLOG$ MOD,,LNS,LNSSZ,ENS,ENSSZ2 .IFT, .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CLOG$CEþW 1 .MACRO CLOG$S MOD,PRMLST,LNS,LNSSZ,ENS,ENSSZ,ERRZ .MCALL DIR$,MOV$,MVB$,LNMOD$R LNMOD$L MOV$ ENSSZD MOV$ ENS, MOV$ LNSSZ, MOV$ LNS( MVB$ PRMLST MVB$ #0,MOD MOV (PC)+,-(SP) .BYTE 207.,7> DIR$ ,ERR .ENDM CLOG$SÊW  .MACRO CMKT$C EFN,AST,PSCT,ERRP .MCALL CMKT$,DIR$ .IF NDF $$$GLBC .PSECT $DPB$.,D$$$=.$ .IFTF CMKT$ EFN,AST .IFT> .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM CMKT$C.W  .MACRO CMKT$S EFN,AST,ERR .MCALL DIR$,RVP$ $$$T1=0 .IIF NB EFN $$$T1=1 .IIF NB AST $$$T1=1 .IF EQ $$$T1  MOV (PC)+,-(SP) .BYTE 27.,1 .IFF RVP$ EFN,ASTN MOV (PC)+,-(SP) .BYTE 27.,3 .ENDC DIR$ ,ERR .ENDM CMKT$S+>W  .MACRO CMKT$ EFN,ASTM .MCALL OFF$ .IF NDF $$$GLBA $$$T1=0 .IIF NB EFN $$$T1=1 .IIF NB AST $$$T1=1 .IF EQ $$$T1. .BYTE 27.,1 .IFF$ .BYTE 27.,3 .WORD EFN .WORD AST .ENDC .ENDC .IF NDF C.MKEF .NLISTK OFF$ OFF$ C.MKEF,2 OFF$ C.MKAE,2 .LIST .ENDC .ENDM CMKT$W  .MACRO CNCT$ TNAME,EFN,EAST,ESB .MCALL OFF$,R50$ .IF NDF $$$GLB .BYTE 143.,6. R50$ TNAMEF .WORD EFN .WORD EAST .WORD ESB .ENDC .IF NDF C.NCTNN6 .IRP X,<,,,,> OFF$ X$ .ENDM .ENDC .ENDM CNCT$ÜW ( .MACRO CNCT$C TNAME,EFN,EAST,ESB,CS,ERR .MCALL CNCT$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=.N .IFTF CNCT$ TNAME,EFN,EAST,ESBS .IFTF .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CNCT$CÈW % .MACRO CNCT$S TNAME,EFN,EAST,ESB,ERRA .MCALL DIR$,MOV$,RFA$,MVB$. MOV$ ESBL MOV$ EAST MOV$ EFN0 RFA$ TNAMEO MOV (PC)+,-(SP) .BYTE 143.,6 DIR$ ,ERR .ENDM CNCT$S.°W  .MACRO CPCR$ NAME .MCALL R50$,OFF$F .IF NDF $$$GLBN .BYTE 205.,3$ R50$ NAME .ENDC .IF NDF C.PCNMA OFF$E OFF$ C.PCNM,2 .ENDC .ENDM CPCR$ÀW  .MACRO CPCR$C NAME,CS,ERR .MCALL CPCR$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.E .IFTF CPCR$ NAMEC .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CPCR$CRŽW  .MACRO CPCR$S NAME,ERRL .MCALL DIR$,MOV$,RFA$ RFA$ NAME MOV (PC)+,-(SP) .BYTE 205.,3, DIR$ ,ERR .ENDM CPCR$S$ªW  .MACRO CRAW$ WDBA .MCALL OFF$ .IF NDF $$$GLBF .BYTE 117.,2E .WORD WDB .ENDC .IF NDF C.RABAF OFF$A OFF$ C.RABA,2 .ENDC .ENDM CRAW$¾W  .MACRO CRAW$C WDB,CS,ERRM .MCALL CRAW$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.D .IFTF CRAW$ WDB .IFTM .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CRAW$CNˆW  .MACRO CRAW$S WDB,ERR .MCALL DIR$,MOV$L MOV$ WDB, MOV (PC)+,-(SP) .BYTE 117.,2) DIR$ ,ERR .ENDM CRAW$SRÂW  .MACRO CRGF$C GROUP,CS,ERRW .MCALL CRGF$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.W .IFTF CRGF$ GROUP .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CRGF$CŒW  .MACRO CRGF$S GROUP,ERR .MCALL MOV$,DIR$F MOV$ GROUP MOV (PC)+,-(SP) .BYTE 157.,2 DIR$ ,ERR .ENDM CRGF$S ÀW  .MACRO CRGF$ GROUP$ .MCALL OFF$ .IF NDF $$$GLBR .BYTE 157.,2. .WORD GROUP .ENDC .IF NDF C.RGRP+ .NLIST. OFF$7 OFF$ C.RGRP,2 .LIST .ENDC .ENDM CRGF$¨W  .MACRO CRRG$ RDB. .MCALL OFF$ .IF NDF $$$GLBL .BYTE 55.,2 .WORD RDB .ENDC .IF NDF C.RRBA OFF$ OFF$ C.RRBA,2 .ENDC .ENDM CRRG$¾W  .MACRO CRRG$C RDB,CS,ERRS .MCALL CRRG$,DIR$ .IF NDF $$$GLB  .PSECT $DPB$.,D$$$=. .IFTF CRRG$ RDB .IFT .PSECT CS DIR$ #$$$,ERR00"w8 1g .ENDC .ENDM CRRG$CU†W  .MACRO CRRG$S RDB,ERR .MCALL DIR$,MOV$O MOV$ RDB MOV (PC)+,-(SP) .BYTE 55.,2 DIR$ ,ERR .ENDM CRRG$SW ! .MACRO CRVT$ IAST,OAST,AAST,MLEN .MCALL OFF$ .IF NDF $$$GLB$ .BYTE 149.,5. .WORD IASTB .WORD OASTF .WORD AAST .WORD MLEN  .ENDC .IF NDF C.RVIAC6 .IRP X,<,,,,> OFF$ X, .ENDM .ENDC .ENDM CRVT$ÞW ) .MACRO CRVT$C IAST,OAST,AAST,MLEN,CS,ERRD .MCALL CRVT$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.  .IFTF CRVT$ IAST,OAST,AAST,MLEN .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CRVT$CN¼W & .MACRO CRVT$S IAST,OAST,AAST,MLEN,ERR .MCALL DIR$,MOV$$ MOV$ MLEN MOV$ AAST MOV$ OAST MOV$ IAST MOV (PC)+,-(SP) .BYTE 149.,5O DIR$ ,ERR .ENDM CRVT$SCÂW  .MACRO CSRQ$C TT,RT,CS,ERR, .MCALL CSRQ$,DIR$ .IF NDF $$$GLBN .PSECT $DPB$.,D$$$=. .IFTF CSRQ$ TT,RT .IFT, .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CSRQ$CF†W  .MACRO CSRQ$S TN,RN,ERR .MCALL RFA$,DIR$S RFA$ TN MOV (PC)+,-(SP) .BYTE 25.,3 DIR$ ,ERR .ENDM CSRQ$SÐW  .MACRO CSRQ$ TT,RTT .MCALL R50$,OFF$C .IF NDF $$$GLBM .BYTE 25.,3 R50$ TT .ENDC .IF NDF C.SRTNV .NLISTS OFF$Y OFF$ C.SRTN,4 OFF$ C.SRRN,4 .LIST .ENDC .ENDM CSRQ$ÂW  .MACRO DECL$C EFN,PSCT,ERR. .MCALL DECL$,DIR$ .IF NDF $$$GLB= .PSECT $DPB$.,D$$$=. .IFTF DECL$ EFN .IFT$ .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM DECL$CAtW  .MACRO DECL$S EFN,ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 35.,1 DIR$ ,ERR .ENDM DECL$S\W  .MACRO DECL$ EFN. .IF NDF $$$GLB .BYTE 35.,1 .ENDC .ENDM DECL$HW ! .MACRO DLON$ MOD,TBNUM,LNS,LNSSZF .MCALL OFF$,LNMOD$R .IF NDF $$$GLBN LNMOD$M .BYTE 207.,5 .BYTE 12. .BYTE MOD .BYTE TBNUM .BYTE 0 .WORD LNS .WORD LNSSZ .ENDC .IF NDF D.LFUN=A .IRP X,<,,,,,>C OFF$ XD .ENDM .ENDC .ENDM DLON$ÞW ) .MACRO DLON$C MOD,TBNUM,LNS,LNSSZ,CS,ERR. .MCALL DLON$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.  .IFTF DLON$ MOD,TBNUM,LNS,LNSSZ .IFTC .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM DLON$C,ÚW & .MACRO DLON$S MOD,TBNUM,LNS,LNSSZ,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$E LNMOD$Y MOV$ LNSSZE MOV$ LNSY MOV$ TBNUML MVB$ #12.,MOD MOV (PC)+,-(SP) .BYTE 207.,5 DIR$ ,ERR .ENDM DLON$SDFW ! .MACRO DLOG$ MOD,TBNUM,LNS,LNSSZ. .MCALL OFF$,LNMOD$ .IF NDF $$$GLB. LNMOD$N .BYTE 207.,5S .BYTE 2 .BYTE MOD .BYTE TBNUM .BYTE 0 .WORD LNS .WORD LNSSZ .ENDC .IF NDF D.LFUNDA .IRP X,<,,,,,>M OFF$ X .ENDM .ENDC .ENDM DLOG$ÞW ) .MACRO DLOG$C MOD,TBNUM,LNS,LNSSZ,CS,ERRL .MCALL DLOG$,DIR$ .IF NDF $$$GLBV .PSECT $DPB$.,D$$$=. .IFTF DLOG$ MOD,TBNUM,LNS,LNSSZ .IFTR .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM DLOG$COØW & .MACRO DLOG$S MOD,TBNUM,LNS,LNSSZ,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$Y LNMOD$Y MOV$ LNSSZE MOV$ LNSY MOV$ TBNUML MVB$ #2,MOD MOV (PC)+,-(SP) .BYTE 207.,5R DIR$ ,ERR .ENDM DLOG$S,ºW  .MACRO DSAR$C PSCT,ERR .MCALL DSAR$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.C .IFTF DSAR$ .IFT, .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM DSAR$CDpW  .MACRO DSAR$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 99.,1 DIR$ ,ERR .ENDM DSAR$SXW  .MACRO DSAR$M .IF NDF $$$GLBZ .BYTE 99.,1 .ENDC .ENDM DSAR$ºW  .MACRO DSCP$C PSCT,ERR  .MCALL DSCP$,DIR$ .IF NDF $$$GLB) .PSECT $DPB$.,D$$$=.E .IFTF DSCP$ .IFT .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM DSCP$C,pW  .MACRO DSCP$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 95.,1 DIR$ ,ERR .ENDM DSCP$SXW  .MACRO DSCP$ .IF NDF $$$GLBR .BYTE 95.,1 .ENDC .ENDM DSCP$00"5TADATADATADATADATADATADATADATADATA¨W  .MACRO DTRG$ RDB .MCALL OFF$ .IF NDF $$$GLBR .BYTE 59.,2 .WORD RDB .ENDC .IF NDF D.TRBAD OFF$ OFF$ D.TRBA,2 .ENDC .ENDM DTRG$¾W  .MACRO DTRG$C RDB,CS,ERRS .MCALL DTRG$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.R .IFTF DTRG$ RDB .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM DTRG$CL†W  .MACRO DTRG$S RDB,ERR .MCALL DIR$,MOV$C MOV$ RDB MOV (PC)+,-(SP) .BYTE 59.,2 DIR$ ,ERR .ENDM DTRG$SªW  .MACRO ELAW$ WDB .MCALL OFF$ .IF NDF $$$GLBF .BYTE 119.,2$ .WORD WDB .ENDC .IF NDF E.LABAC OFF$N OFF$ E.LABA,2 .ENDC .ENDM ELAW$¾W  .MACRO ELAW$C WDB,CS,ERR  .MCALL ELAW$,DIR$ .IF NDF $$$GLB$ .PSECT $DPB$.,D$$$=.C .IFTF ELAW$ WDB .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ELAW$CNˆW  .MACRO ELAW$S WDB,ERR .MCALL DIR$,MOV$ MOV$ WDB$ MOV (PC)+,-(SP) .BYTE 119.,2S DIR$ ,ERR .ENDM ELAW$SRÂW  .MACRO ELGF$C GROUP,CS,ERRW .MCALL ELGF$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.W .IFTF ELGF$ GROUP .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ELGF$CŒW  .MACRO ELGF$S GROUP,ERR .MCALL MOV$,DIR$F MOV$ GROUP MOV (PC)+,-(SP) .BYTE 159.,2 DIR$ ,ERR .ENDM ELGF$S ÀW  .MACRO ELGF$ GROUP$ .MCALL OFF$ .IF NDF $$$GLBL .BYTE 159.,2. .WORD GROUP .ENDC .IF NDF E.LGRP+ .NLIST. OFF$9 OFF$ E.LGRP,2 .LIST .ENDC .ENDM ELGF$¬W  .MACRO ELVT$ UNUM .MCALL OFF$ .IF NDF $$$GLBL .BYTE 151.,2B .WORD UNUM .ENDC .IF NDF E.LVNMF OFF$S OFF$ E.LVNM,2 .ENDC .ENDM ELVT$ÀW  .MACRO ELVT$C UNUM,CS,ERR .MCALL ELVT$,DIR$ .IF NDF $$$GLBU .PSECT $DPB$.,D$$$=.Y .IFTF ELVT$ UNUMR .IFTM .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ELVT$C.ŠW  .MACRO ELVT$S UNUM,ERR. .MCALL DIR$,MOV$N MOV$ UNUM MOV (PC)+,-(SP) .BYTE 151.,2 DIR$ ,ERR .ENDM ELVT$S.ÚW  .MACRO EMST$ TNAME,STATUS .MCALL OFF$,R50$. .IF NDF $$$GLB. .BYTE 147.,4. R50$ TNAME. .WORD STATUSE .ENDC .IF NDF E.MSTNV OFF$. OFF$ E.MSTN,4 OFF$ E.MSST,2 .ENDC .ENDM EMST$ÐW " .MACRO EMST$C TNAME,STATUS,CS,ERR .MCALL EMST$,DIR$ .IF NDF $$$GLBU .PSECT $DPB$.,D$$$=. .IFTF EMST$ TNAME,STATUSM .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM EMST$CL¦W  .MACRO EMST$S TNAME,STATUS,ERR1 .MCALL DIR$,MOV$,RFA$ MOV$ STATUS RFA$ TNAME MOV (PC)+,-(SP) .BYTE 147.,4C DIR$ ,ERR .ENDM EMST$S$ºW  .MACRO ENAR$C PSCT,ERRS .MCALL ENAR$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.  .IFTF ENAR$ .IFTM .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM ENAR$C,rW  .MACRO ENAR$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 101.,1$ DIR$ ,ERR .ENDM ENAR$SSZW  .MACRO ENAR$. .IF NDF $$$GLB .BYTE 101.,1. .ENDC .ENDM ENAR$ºW  .MACRO ENCP$C PSCT,ERRT .MCALL ENCP$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=. .IFTF ENCP$ .IFT .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM ENCP$C$pW  .MACRO ENCP$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 97.,1 DIR$ ,ERR .ENDM ENCP$SNXW  .MACRO ENCP$A .IF NDF $$$GLB. .BYTE 97.,1 .ENDC .ENDM ENCP$¾W  .MACRO EXIF$C EFN,CS,ERR .MCALL EXIF$,DIR$ .IF NDF $$$GLB$ .PSECT $DPB$.,D$$$=.N .IFTF EXIF$ EFN .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM EXIF$C$†W  .MACRO EXIF$S EFN,ERR .MCALL MOV$,DIR$ MOV$ EFNS MOV (PC)+,-(SP) .BYTE 53.,2 DIR$ ,ERR .ENDM EXIF$SºW  .MACRO EXIF$ EFNI .MCALL OFF$ .IF NDF $$$GLB. .BYTE 53.,2 .WORD EFN .ENDC .IF NDF E.XFEF. .NLISTP OFF$F OFF$ E.XFEF,2 .LIST .ENDC .ENDM EXIF$ºW  .MACRO EXIT$C PSCT,ERR, .MCALL EXIT$,DIR$ .IF NDF $$$GLB$ .PSECT $DPB$.,D$$$=.$ .IFTF EXIT$ .IFTN .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM EXIT$CE†W  .00"‡8 1gMACRO EXIT$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 51.,1 DIR$+ .IIF NB , CALL ERR .ENDM EXIT$SEXW  .MACRO EXIT$  .IF NDF $$$GLBL .BYTE 51.,1 .ENDC .ENDM EXIT$¾W  .MACRO EXST$C STS,CS,ERRL .MCALL EXST$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF EXST$ STS .IFTC .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM EXST$C.ðW  .MACRO EXST$S STS,ERR .MCALL MOV$,DIR$,OFF$ MOV$ STS MOV (PC)+,-(SP) .BYTE 29.,2 DIR$ ,ERR .NLISTT$$$OST=05 .IRP X,<,,,>I OFF$ X> .ENDM .LIST .ENDM EXST$SW  .MACRO EXST$ STSF .MCALL OFF$ .IF NDF $$$GLB .BYTE 29.,2 .WORD STS .ENDC .IF NDF E.XSTSC .NLIST. OFF$X OFF$ E.XSTS,2$$$OST=05 .IRP X,<,,,> OFF$ XS .ENDM .LIST .ENDC .ENDM EXST$¾W  .MACRO EXTK$C INC,CS,ERR .MCALL EXTK$,DIR$ .IF NDF $$$GLBM .PSECT $DPB$.,D$$$=.. .IFTF EXTK$ INC .IFT$ .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM EXTK$CE’W  .MACRO EXTK$S INC,ERR .MCALL MOV$,DIR$ CLR -(SP) MOV$ INC  MOV (PC)+,-(SP) .BYTE 89.,3 DIR$ ,ERR .ENDM EXTK$SSÄW  .MACRO EXTK$ INC. .MCALL OFF$ .IF NDF $$$GLBT .BYTE 89.,3 .WORD INC .WORD 0 .ENDC .IF NDF E.XTINO .NLIST. OFF$. OFF$ E.XTIN,2 .LIST .ENDC .ENDM EXTK$êW  .MACRO FEAT$ FEAT .MCALL OFF$,FEADF$$ .IF NDF $$$GLBB .BYTE 177.,2. .WORD FEATI .ENDC .IF NDF F.EAF OFF$$ OFF$ F.EAF,2 .IF DF $$$GLB FEADF$ ,<=> .IFFA FEADF$S .ENDC .ENDC .ENDM FEAT$¸W  .MACRO FEAT$C FEAT,CS,ERR .MCALL FEAT$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.  .IFTF FEAT$ FEATF .IFTF .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM‚W  .MACRO FEAT$S FEAT,ERRO .MCALL MOV$,DIR$2 MOV$ FEAT MOV (PC)+,-(SP) .BYTE 177.,2. DIR$ ,ERR .ENDMœW + .MACRO FSS$ FSBUF,FSSZ,PRSBLK,PRSSZ,RESERVO .MCALL OFF$ .IF NDF $$$GLBF .IIF NB RESERV, .ERROR .BYTE 207.,7 .BYTE 5 .BYTE 0 .WORD 0 .WORD FSBUF .WORD FSSZA .WORD PRSBLK .WORD PRSSZ .ENDC .IF NDF F.RSV1LA .IRP X,<,,,,,>F OFF$ XF .ENDM .IRP X,<,>N OFF$ XM .ENDM .ENDC .ENDM FSS$EðW 3 .MACRO FSS$C FSBUF,FSSZ,PRSBLK,PRSSZ,RESERV,CS,ERRE .MCALL FSS$,DIR$R .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.B .IFTF$ FSS$ FSBUF,FSSZ,PRSBLK,PRSSZ,RESERV .IFT$ .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM FSS$CþW 0 .MACRO FSS$S FSBUF,FSSZ,PRSBLK,PRSSZ,RESERV,ERR .IIF NB RESERV, .ERRORC .MCALL DIR$,MOV$,MVB$ MOV$ PRSSZ, MOV$ PRSBLK MOV$ FSSZ MOV$ FSBUFL MOV$ #0 MVB$ #5,. MOV (PC)+,-(SP) .BYTE 207.,7, DIR$ ,ERR .ENDM FSS$SÈW * .MACRO GCCI$ CBUF,CBFL,IBUF,IBFL,ADDR,NCP .MCALL OFF$ .IF NDF $$$GLB. .BYTE 127.,7. .BYTE NCP .BYTE 0 .WORD ADDRD .WORD CBUFF .WORD CBFLU .WORD IBUF, .WORD IBFL .ENDC .IF NDF G.CCNC A .IRP X,<,,,,,>U OFF$ XS .ENDM OFF$ G.CCIL,2$$$OST=0K .IRP X,<,,,,,> OFF$ XU .ENDM$$$OST=0@ .IRP X,<,,,,> OFF$ X .ENDM .IRP X,<,> OFF$ XN .ENDM .IF DF $$$GLB# .GLOBL GC.CND,GC.CST,GC.CEX,GC.CCSP .ENDC GC.CND=200 GC.CST=002 GC.CEX=001 GC.CCS=000 .ENDC .ENDM GCCI$èW 2 .MACRO GCCI$C CBUF,CBFL,IBUF,IBFL,ADDR,NCP,CS,ERR .MCALL GCCI$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.$ .IFTF# GCCI$ CBUF,CBFL,IBUF,IBFL,ADDR,NCPA .IFTC .PSECT CS DIR$ #$$$,ERR .ENDC .ENDMÜW / .MACRO GCCI$S CBUF,CBFL,IBUF,IBFL,ADDR,NCP,ERR> .MCALL MOV$,MVB$,DIR$ MOV$ IBFL MOV$ IBUF MOV$ CBFL MOV$ CBUF MOV$ ADDR MVB$ NCP,#0 MOV (PC)+,-(SP) .BYTE 127.,7. DIR$ ,ERR .ENDMèW # .MACRO GCII$ BUF,BUFL,CLI00"�5TADATADATADATADATADATADATADATADATA,DEV,UNITG .MCALL OFF$,R50$ .IF NDF $$$GLBC .BYTE 173.,7. .WORD BUF .WORD BUFLC R50$ CLII$$$T2=.N .ASCII /DEV/S .=$$$T2+2D .BYTE UNIT,0F .ENDC .IF NDF G.CIBFB;AA .IRP X,<,,,,,> OFF$ X .ENDM$$$OST=0@ .IRP X,<,,,,> OFF$ X  .ENDM! .IRP X,<,>M OFF$ X0 .ENDM .ENDC .ENDM GCII$ÚW + .MACRO GCII$C BUF,BUFL,CLI,DEV,UNIT,CS,ERRU .MCALL GCII$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D .IFTF$$$=. GCII$ BUF,BUFL,CLI,DEV,UNIT .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDMØW ( .MACRO GCII$S BUF,BUFL,CLI,DEV,UNIT,ERR .MCALL MOV$,MVB$,DIR$,RFA$V MVB$ UNIT,#0 MOV$ DEV RFA$ CLIO MOV$ BUFL MOV$ BUF4 MOV (PC)+,-(SP) .BYTE 173.,7. DIR$ ,ERR .ENDM GCII$SNFW ! .MACRO GDIR$ MOD,ENS,ENSSZ,RSIZEN .MCALL OFF$,LNMOD$I .IF NDF $$$GLB LNMOD$R .BYTE 207.,6. .BYTE 4 .BYTE MOD .WORD 0 .WORD ENS .WORD ENSSZ .WORD RSIZE .ENDC .IF NDF G.DFUNGA .IRP X,<,,,,,>N OFF$ XM .ENDM .ENDC .ENDM GDIR$ÞW ) .MACRO GDIR$C MOD,ENS,ENSSZ,RSIZE,CS,ERR .MCALL GDIR$,DIR$ .IF NDF $$$GLBO .PSECT $DPB$.,D$$$=. .IFTF GDIR$ MOD,ENS,ENSSZ,RSIZE .IFTR .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GDIR$COâW & .MACRO GDIR$S MOD,ENS,ENSSZ,RSIZE,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$Y LNMOD$Y MOV$ RSIZED MOV$ ENSSZS MOV$ ENSS MOV$ #0 MVB$ #4,MOD MOV (PC)+,-(SP) .BYTE 207.,6D DIR$ ,ERR .ENDM GDIR$S>ÒW $ .MACRO GDVI$C LUN,BUFA,BUFL,CS,ERR .MCALL GDVI$,DIR$ .IF NDF $$$GLBD .PSECT $DPB$.,D$$$=.C .IFTF GDVI$ LUN,BUFA,BUFL .IFT$ .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GDVI$CD6W  .MACRO GDVI$S LUN,BUFA,BUFL,ERR .MCALL MOV$,DIR$,OFF$ MOV$ BUFL MOV$ BUFA MOV$ LUNM MOV (PC)+,-(SP) .BYTE 5,4 DIR$ ,ERR .IF NDF G.DVNAM .NLISTV$$$OST=0A .IRP X,<,,,,> OFF$ X7 .ENDM .LIST .ENDC .ENDM GDVI$S€W  .MACRO GDVI$ LUN,BUFA,BUFLR .MCALL OFF$ .IF NDF $$$GLB$ .BYTE 5,4 .WORD LUN .WORD BUFAF .WORD BUFLN .ENDC .IF NDF G.DVLUC .NLISTR+ .IRP X,<,,,> OFF$ X. .ENDM .IF NDF G.DVNAL$$$OST=0B .IRP X,<,,,,> OFF$ XY .ENDM .ENDC .LIST .ENDC .ENDM GDVI$hW - .MACRO GIN$C SFCN,P1,P2,P3,P4,P5,P6,P7,P8,P9, .MCALL GIN$,DIR$,GFN$,OFF$M .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF GFN$ .NARG $$$NA $$$I=$$$NC .BYTE 169.,$$$N+1. .IRP $$$PRM, .IF EQ $$$I .MEXITF .IFFD $$$I=$$$I-1R .ENDC .WORD $$$PRM< .ENDR .IF NDF G.INSFO .NLIST.6 .IRP X,<,,,,> OFF$ X< .ENDR* .IRP X,<,,> OFF$ X .ENDR* .IRP X,<,,> OFF$ X  .ENDR .ENDC .IFTP .PSECT CS DIR$ #$$$ .ENDC .ENDM GIN$C<W - .MACRO GIN$S SFCN,P1,P2,P3,P4,P5,P6,P7,P8,P9A .MCALL MOV$,DIR$,OFF$,MVB$,GFN$ GFN$$ .NARG $$$N, $$$I=$$$N,$$$K=9.P. .IRP $$$PRM, .IF GT $$$I-$$$K$ MOV$ $$$PRM .ENDC $$$K=$$$K-1L .ENDR MOV (PC)+,-(SP) .BYTE 169.,$$$N+1 DIR$P .ENDM GIN$SW , .MACRO GIN$ SFCN,P1,P2,P3,P4,P5,P6,P7,P8,P9 .MCALL OFF$,GFN$< .IF NDF $$$GLB, GFN$P .NARG $$$N $$$I=$$$N .BYTE 169.,$$$N+1. .IRP $$$PRM, .IF EQ $$$I .MEXIT$ .IFFP $$$I=$$$I-1, .ENDC .WORD $$$PRMO .ENDR .ENDC .IF NDF G.INSF. .NLIST,6 .IRP X,<,,,,> OFF$ XS .ENDM* .IRP X,<,,> OFF$ X .ENDR* .IRP X,<,,> OFF$ XG .ENDR .ENDC .ENDM GIN$RÊW  .MACRO GLUN$C LUN,BUFA,CS,ERR$ .MCALL GLUN$,DIR$00"—8 1g .IF NDF $$$GLBA .PSECT $DPB$.,D$$$=.Y .IFTF GLUN$ LUN,BUFAP .IFTN .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GLUN$C$LW  .MACRO GLUN$S LUN,BUFA,ERR .MCALL MOV$,DIR$,OFF$ MOV$ BUFA MOV$ LUNR MOV (PC)+,-(SP) .BYTE 5,3 DIR$ ,ERR .IF NDF G.LUNAS .NLIST$$$OST=06 .IRP X,<,,,> OFF$ XP .ENDM$$$OST=1 .IRP X,<> OFF$ X. .ENDM .LIST .ENDC .ENDM GLUN$S.’W  .MACRO GLUN$ LUN,BUFA .MCALL OFF$ .IF NDF $$$GLBS .BYTE 5,3 .WORD LUN .WORD BUFAL .ENDC .IF NDF G.LULU  .NLIST + .IRP X,<,,,> OFF$ XA .ENDM .IF NDF G.LUNA$$$OST=06 .IRP X,<,,,> OFF$ X3 .ENDM$$$OST=1 .IRP X,<> OFF$ X0 .ENDM .ENDC .LIST .ENDC .ENDM GLUN$¶W  .MACRO GMCR$C CS,ERR. .MCALL GMCR$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.U .IFTF GMCR$ .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GMCR$CL¼W  .MACRO GMCR$D .MCALL OFF$ .IF NDF $$$GLB  .BYTE 127.,41. .BLKW 40. .ENDC .IF NDF G.MCRB .NLISTA OFF$M OFF$ G.MCRB,80. .LIST .ENDC .ENDM GMCR$¬W  .MACRO GMCX$ WVEC .MCALL OFF$ .IF NDF $$$GLBR .BYTE 113.,2> .WORD WVEC. .ENDC .IF NDF G.MCVAN OFF$N OFF$ G.MCVA,2 .ENDC .ENDM GMCX$ÀW  .MACRO GMCX$C WVEC,CS,ERR .MCALL GMCX$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.  .IFTF GMCX$ WVEC. .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GMCX$CCŠW  .MACRO GMCX$S WVEC,ERR  .MCALL DIR$,MOV$C MOV$ WVEC MOV (PC)+,-(SP) .BYTE 113.,2. DIR$ ,ERR .ENDM GMCX$S.ÆW  .MACRO GPRT$C PRT,BUF,CS,ERR .MCALL GPRT$,DIR$ .IF NDF $$$GLBE .PSECT $DPB$.,D$$$=.. .IFTF GPRT$ PRT,BUF .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GPRT$CW  .MACRO GPRT$S PRT,BUF,ERR .MCALL MOV$,RFA$,DIR$,OFF$C MOV$ BUF RFA$ PRTF MOV (PC)+,-(SP) .BYTE 65.,4 DIR$ ,ERR .IF NDF G.PRPB .NLISTC$$$OST=0* .IRP X,<,,> OFF$ XM .ENDM .LIST .ENDC .ENDM GPRT$SYBW  .MACRO GPRT$ PRT,BUF .MCALL OFF$,R50$A .IF NDF $$$GLBF .BYTE 65.,4 R50$ PRTI .WORD BUF .ENDC .IF NDF G.PRPND .NLIST OFF$ OFF$ G.PRPN,4 OFF$ G.PRBA,2 .IF NDF G.PRPBR$$$OST=0* .IRP X,<,,> OFF$ XB .ENDM .ENDC .LIST .ENDC .ENDM GPRT$HW  .MACRO GREG$ RID,BUF6 .MCALL OFF$ .IF NDF $$$GLBP .BYTE 65.,4 .WORD 0,RID .WORD BUF .ENDC .IF NDF G.RGID> .NLISTM OFF$M OFF$ ,2 OFF$ G.RGID,2 OFF$ G.RGBA,2 .IF NDF G.RGRB $$$OST=0* .IRP X,<,,> OFF$ X. .ENDM .ENDC .LIST .ENDC .ENDM GREG$ÆW  .MACRO GREG$C RID,BUF,CS,ERR. .MCALL GREG$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=., .IFTF GREG$ RID,BUF .IFTM .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GREG$CW  .MACRO GREG$S RID,BUF,ERR .MCALL MOV$,DIR$,OFF$ MOV$ BUFD MOV$ RIDO CLR -(SP) MOV (PC)+,-(SP) .BYTE 65.,4 DIR$ ,ERR .IF NDF G.RGRBD .NLIST $$$OST=0* .IRP X,<,,> OFF$ XR .ENDM .LIST .ENDC .ENDM GREG$SNºW  .MACRO GSSW$C PSCT,ERR .MCALL GSSW$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=.F .IFTF GSSW$ .IFTD .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM GSSW$CCrW  .MACRO GSSW$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 125.,1F DIR$ ,ERR .ENDM GSSW$S$ZW  .MACRO GSSW$S .IF NDF $$$GLBS .BYTE 125.,14 .ENDC .ENDM GSSW$ÀW  .MACRO GTIM$C BUFA,CS ERR .MCALL GTIM$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.. .IFTF GTIM$ BUFA .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GTIM$CFVW  .MACRO GTIM$S BUFA,ERRF .MCALL MOV$,DIR$,OFF$ MOV$ BUFA MOV (PC)+,-(SP) .BYTE 61.,2 DIR$ ,ERR .IF NDF G.TIYRR .NLISTE$$$OST=05 .IRP X,<<00"Ÿ5TADATADATADATADATADATADATADATADATAG.TIYR,2>,,,>. OFF$ X$ .ENDM5 .IRP X,<,,,>1 OFF$ X. .ENDM .LIST .ENDC .ENDM GTIM$S.tW  .MACRO GTIM$ BUFA .MCALL OFF$ .IF NDF $$$GLBC .BYTE 61.,2 .WORD BUFA .ENDC .IF NDF G.TIBAS .NLISTD OFF$$ OFF$ G.TIBA,2 .IF NDF G.TIYR$$$OST=05 .IRP X,<,,,>M OFF$ X .ENDM5 .IRP X,<,,,>. OFF$ X$ .ENDM .ENDC .LIST .ENDC .ENDM GTIM$ÀW  .MACRO GTSK$C BUFA,CS,ERR .MCALL GTSK$,DIR$ .IF NDF $$$GLBC .PSECT $DPB$.,D$$$=. .IFT GTSK$ BUFAM .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GTSK$C$þW  .MACRO GTSK$S BUFA,ERRF .MCALL MOV$,DIR$,OFF$ MOV$ BUFA MOV (PC)+,-(SP) .BYTE 63.,2 DIR$ ,ERR .IF NDF G.TSTN  .NLISTR$$$OST=0@ .IRP X,<,,,,> OFF$ X, .ENDM@ .IRP X,<,,,,> OFF$ X .ENDM OFF$ G.TSVL,2 OFF$ G.TSTS,2 OFF$ G.TSSY,2 OFF$ G.TSDU,2$$$OST=05 .IRP X,<,,,>. OFF$ X  .ENDM .LIST .ENDC .ENDM GTSK$S$W  .MACRO GTSK$ BUFA .MCALL OFF$ .IF NDF $$$GLB$ .BYTE 63.,2 .WORD BUFAS .ENDC .IF NDF G.TSBAE .NLISTN OFF$T OFF$ G.TSBA,2 .IF NDF G.TSTN<$$$OST=0@ .IRP X,<,,,,> OFF$ X. .ENDM@ .IRP X,<,,,,> OFF$ XL .ENDM OFF$ G.TSVL,2 OFF$ G.TSTS,2 OFF$ G.TSSY,2 OFF$ G.TSDU,2$$$OST=05 .IRP X,<,,,>. OFF$ XN .ENDM .ENDC .LIST .ENDC .ENDM GTSK$^W  .MACRO IHAR$C PSCT,ERR .MCALL DSAR$C DSAR$C PSCT,ERR .ENDM IHAR$CBTW  .MACRO IHAR$S ERR .MCALL DSAR$S DSAR$S ERR. .ENDM IHAR$S4HW  .MACRO IHAR$> .MCALL DSAR$O DSAR$ .ENDM IHAR$¨W  .MACRO MAP$ WDB .MCALL OFF$ .IF NDF $$$GLBL .BYTE 121.,2 .WORD WDB .ENDC .IF NDF M.APBAY OFF$F OFF$ M.APBA,2 .ENDC .ENDM MAP$DºW  .MACRO MAP$C WDB,CS,ERR .MCALL MAP$,DIR$C .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF MAP$ WDBC .IFTR .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM MAP$C†W  .MACRO MAP$S WDB,ERR .MCALL DIR$,MOV$A MOV$ WDB. MOV (PC)+,-(SP) .BYTE 121.,2. DIR$ ,ERR .ENDM MAP$SÐW " .MACRO MRKT$C EF,TM,TU,AST,CS,ERR .MCALL MRKT$,DIR$ .IF NDF $$$GLBL .PSECT $DPB$.,D$$$=.W .IFTF MRKT$ EF,TM,TU,AST .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM MRKT$C˜W  .MACRO MRKT$S EF,TM,TU,AST,ERR. .MCALL RVP$,DIR$S RVP$ EF,TM,TU,AST MOV (PC)+,-(SP) .BYTE 23.,5 DIR$ ,ERR .ENDM MRKT$S.W  .MACRO MRKT$ EFN,TM,TU,ASTA .MCALL OFF$ .IF NDF $$$GLBA .BYTE 23.,5 .WORD EFN .WORD TME .WORD TUD .WORD AST .ENDC .IF NDF M.KTEF .NLISTR6 .IRP X,<,,,,> OFF$ XL .ENDM .LIST .ENDC .ENDM MRKT$¾W  .MACRO MSDS$ MASK .MCALL OFF$ .IF NDF $$$GLBM .BYTE 201.,2. .WORD MASK. .ENDC .IF NDF M.SDMA, .IRP X,<,>S OFF$ XF .ENDM .ENDC .ENDM MSDS$¸W  .MACRO MSDS$C MASK,CS,ERR .MCALL MSDS$,DIR$ .IF NDF $$$GLB, .PSECT $DPBD$ D$$$=.N .IFTF MSDS$ MASK. .IFTO .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM‚W  .MACRO MSDS$S MASK,ERR, .MCALL MOV$,DIR$G MOV$ MASK MOV (PC)+,-(SP) .BYTE 201.,2. DIR$ ,ERR .ENDM¢W  .MACRO MVTS$ ACTION,ADDR,VAL. .MCALL OFF$ .IF NDF $$$GLB. .BYTE 203.,4. .WORD ACTIONN .WORD ADDRM .WORD VAL .ENDC .IF NDF M.VTAC 6 .IRP X,<,,,,> OFF$ XC .ENDM $$$=05 .IRP X,<,,,>$ OFF$ XF .ENDM5 .IRP X,<,,,>. OFF$ X .ENDM .ENDC .ENDM MVTS$ÎW 00"§8 1g% .MACRO MVTS$C ACTION,ADDR,VAL,CS,ERR) .MCALL MVTS$,DIR$ .IF NDF $$$GLB .PSECT $DPBD$ D$$$=.  .IFTF MVTS$ ACTION,ADDR,VAL .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM¦W " .MACRO MVTS$S ACTION,ADDR,VAL,ERR .MCALL MOV$,DIR$, MOV$ VAL2 MOV$ ADDR MOV$ ACTION MOV (PC)+,-(SP) .BYTE 203.,4. DIR$ ,ERR .ENDM°W V .MACRO PFCS$ MOD,TBMSK,LUN,PRBUF,PRSZ,RSBUF,RSSZ,RSLEN,PRSBLK,PRSSZ,DFNBK,DFNSZ,RSMSK .MCALL OFF$,LNMOD$ .IF NDF $$$GLB LNMOD$ .BYTE 207.,13.C .BYTE 8.R .BYTE MOD .BYTE LUN .BYTE TBMSK .WORD PRBUF .WORD PRSZ$ .WORD RSBUF .WORD RSSZA .WORD RSLEN .WORD PRSBLKC .WORD PRSSZ .WORD DFNBK .WORD DFNSZ .WORD RSMSK .ENDC .IF NDF F.LMODR6 .IRP X,<,,,,> OFF$ XN .ENDM5 .IRP X,<,,,> OFF$ X .ENDM5 .IRP X,<,,,>P OFF$ XK .ENDM .IRP X,<,>N OFF$ X .ENDM .ENDC .ENDM PFCS$HW ^ .MACRO PFCS$C MOD,TBMSK,LUN,PRBUF,PRSZ,RSBUF,RSSZ,RSLEN,PRSBLK,PRSSZ,DFNBK,DFNSZ,RSMSK,CS,ERR .MCALL PFCS$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=. .IFTFO PFCS$ MOD,TBMSK,LUN,PRBUF,PRSZ,RSBUF,RSSZ,RSLEN,PRSBLK,PRSSZ,DFNBK,DFNSZ,RSMSKL .IFTO .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM PFCS$CR„W [ .MACRO PFCS$S MOD,TBMSK,LUN,PRBUF,PRSZ,RSBUF,RSSZ,RSLEN,PRSBLK,PRSSZ,DFNBK,DFNSZ,RSMSK,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$N LNMOD$ MOV$ RSMSKN MOV$ DFNSZC MOV$ DFNBK MOV$ PRSSZR MOV$ PRSBLK MOV$ RSLENF MOV$ RSSZ MOV$ RSBUFS MOV$ PRSZ MOV$ PRBUFS MVB$ LUN,TBMSK MVB$ #8.,MODF MOV (PC)+,-(SP) .BYTE 207.,13.= DIR$ ,ERR .ENDM PFCS$SK®W U .MACRO PRMS$ MOD,TBMSK,LUN,PRBUF,PRSZ,RSBUF,RSSZ,RSLEN,PRSBLK,PRSSZ,DFBUF,DFSZ,RSMSKN .MCALL OFF$,LNMOD$ .IF NDF $$$GLB. LNMOD$S .BYTE 207.,13.P .BYTE 7 .BYTE MOD .BYTE LUN .BYTE TBMSK .WORD PRBUF .WORD PRSZ$ .WORD RSBUF .WORD RSSZ .WORD RSLEN .WORD PRSBLK .WORD PRSSZ .WORD DFBUF .WORD DFSZ .WORD RSMSK .ENDC .IF NDF R.LFUN6 .IRP X,<,,,,> OFF$ X( .ENDM5 .IRP X,<,,,> OFF$ X .ENDM5 .IRP X,<,,,>K OFF$ XB .ENDM .IRP X,<,>F OFF$ XL .ENDM .ENDC .ENDM PRMS$FW ] .MACRO PRMS$C MOD,TBMSK,LUN,PRBUF,PRSZ,RSBUF,RSSZ,RSLEN,PRSBLK,PRSSZ,DFBUF,DFSZ,RSMSK,CS,ERRR .MCALL PRMS$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=. .IFTFN PRMS$ MOD,TBMSK,LUN,PRBUF,PRSZ,RSBUF,RSSZ,RSLEN,PRSBLK,PRSSZ,DFBUF,DFSZ,RSMSK .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM PRMS$C.~W Z .MACRO PRMS$S MOD,TBMSK,LUN,PRBUF,PRSZ,RSBUF,RSSZ,RSLEN,PRSBLK,PRSSZ,DFBUF,DFSZ,RSMSK,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$, LNMOD$F MOV$ RSMSK MOV$ DFSZ MOV$ DFBUF MOV$ PRSSZ MOV$ PRSBLK MOV$ RSLENN MOV$ RSSZ MOV$ RSBUFL MOV$ PRSZ MOV$ PRBUFZ MVB$ LUN,TBMSK. MVB$ #7,MOD MOV (PC)+,-(SP) .BYTE 207.,13.. DIR$ ,ERR .ENDM PRMS$SMúW 6 .MACRO QIO$C FNC,LUN,EFN,PRI,IOST,AST,PRMLST,PSCT,ERR .MCALL QDPB$,DIR$ .IF NDF $$$GLBN .PSECT $DPB$.,D$$$=. .IFTF* QDPB$ 1,FNC,LUN,EFN,PRI,IOST,AST, .IFTS .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM QIO$C–W 1 .MACRO QIO$S FNC,LUN,EFN,PRI,IOST,AST,PRMLST,ERRU .MCALL QDPB$S/ QDPB$S 1,FNC,LUN,EFN,PRI,IOST,AST,,ERRS .ENDM QIO$SŠW , .MACRO QIO$ FNC,LUN,EFN,PRI,IOST,AST,PRMLST .MCALL QDPB$,* QDPB$ 1,FNC,LUN,EFN,PRI,IOST,AST, .ENDM QIO$RþW 7 .MACRO QIOW$C FNC,LUN,EFN,PRI,IOST,AST,PRMLST,PSCT,ERRN .MCALL QDPB$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.E .IFTF* QDPB$ 3,FNC,LUN,EFN,PRI,IOST,AST, .IFTE .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM QIOW$CI˜W 2 .MACRO QIOW$S FNC,LUN,EFN,PRI,IOST,AST,PRMLST,ERR .MCALL QDPB$S/ QDPB$S 3,FNC,LUN,EFN,PRI,IOST,AST,,ERR .ENDM Q00"¯5TADATADATADATADATADATADATADATADATAIOW$S$ŒW - .MACRO QIOW$ FNC,LUN,EFN,PRI,IOST,AST,PRMLSTN .MCALL QDPB$S* QDPB$ 3,FNC,LUN,EFN,PRI,IOST,AST, .ENDM QIOW$vW 6 .MACRO QDPB$S DIC,FNC,LUN,EFN,PRI,IOST,AST,PRMLST,ERR .MCALL RVP$,MVB$,DIR$ .NLIST$$$ARG=0 .IRP X,$$$ARG=$$$ARG+1M .ENDM .LIST .IF GT 6-$$$ARG .REPT <6-$$$ARG>. CLR -(SP) .ENDR .ENDC .IIF NB , RVP$ PRMLST RVP$ IOST,AST MVB$ EFN, RVP$ FNC,LUNP MOV (PC)+,-(SP) .BYTE DIC,12. DIR$ ,ERR .ENDM QDPB$S"W 1 .MACRO QDPB$ DIC,FNC,LUN,EFN,PRI,IOST,AST,PRMLSTC .MCALL OFF$ .IF NDF $$$GLBN .BYTE DIC,12. .WORD FNC .WORD LUN .BYTE EFN,0 .WORD IOSTB .WORD AST .NLISTI$$$ARG=0 .LIST .IRP X, .WORD X .NLIST$$$ARG=$$$ARG+1, .LIST .ENDM .IF GT 6-$$$ARG .REPT <6-$$$ARG>- .WORD 0 .ENDR .ENDC .ENDC .IF NDF Q.IOFNN .NLIST 6 .IRP X,<,,,,> OFF$ XU .ENDM( .IRP X,<,,> OFF$ XP .ENDM .LIST .ENDC .ENDM QDPB$ÔW  .MACRO RCST$ TNAME,BUFL .MCALL OFF$,R50$$ .IF NDF $$$GLB1 .BYTE 139.,4 R50$ TNAME. .WORD BUF .ENDC .IF NDF R.CSTN OFF$I OFF$ R.CSTN,4 OFF$ R.CSBF,2 .ENDC .ENDM RCST$ÊW  .MACRO RCST$C TNAME,BUF,CS,ERRA .MCALL RCST$,DIR$ .IF NDF $$$GLBN .PSECT $DPB$.,D$$$=.N .IFTF RCST$ TNAME,BUF .IFTQ .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RCST$CU W  .MACRO RCST$S TNAME,BUF,ERR .MCALL DIR$,MOV$,RFA$ MOV$ BUFC RFA$ TNAME$ MOV (PC)+,-(SP) .BYTE 139.,4 DIR$ ,ERR .ENDM RCST$S0¼W  .MACRO RDAF$C BA,CS,ERR .MCALL RDAF$,DIR$ .IF NDF $$$GLBR .PSECT $DPB$.,D$$$=.S .IFTF RDAF$ BA2 .IFTC .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RDAF$CA„W  .MACRO RDAF$S BA,ERRN .MCALL MOV$,DIR$  MOV$ BA MOV (PC)+,-(SP) .BYTE 39.,2 DIR$ ,ERR .ENDM RDAF$S ºW  .MACRO RDAF$ BA .MCALL OFF$ .IF NDF $$$GLBT .BYTE 39.,2 .WORD BA$ .ENDC .IF NDF R.DABAR .NLIST$ OFF$( OFF$ R.DABA,2.E .LIST .ENDC .ENDM RDAF$¬W " .MACRO RDBBK$ SIZ,NAM,PAR,STS,PRO .MCALL RDBDF$,R50$F RDBDF$L .WORD 0 .WORD SIZ R50$ NAMF R50$ PARB .WORD STS .WORD PRO .ENDM RDBBK$"W  .MACRO RDBDF$ GBL .MCALL .BLKW.,.BLK. .BLK. .BLKW. 1,R.GID,GBLV .BLKW. 1,R.GSIZ,GBL .BLKW. 2,R.GNAM,GBL .BLKW. 2,R.GPAR,GBL .BLKW. 1,R.GSTS,GBL .BLKW. 1,R.GPRO,GBL .BLKW. 0,R.GLGH,GBL .IF IDN ,1 .GLOBL RS.CRR,RS.UNM,RS.MDL,RS.NDL,RS.ATT,RS.NEXF# .GLOBL RS.DEL,RS.EXT,RS.WRT,RS.REDR .ENDCRS.CRR=^O<100000>ARS.UNM=^O<40000>RS.MDL=^O<200>RS.NDL=^O<100> RS.ATT=^O<40>. RS.NEX=^O<20>S RS.DEL=^O<10> RS.EXT=^O<4> RS.WRT=^O<2> RS.RED=^O<1> .MACRO RDBDF$ X .ENDM .ENDM RDBDF$$¾W  .MACRO RDEF$C EFN,CS,ERR, .MCALL RDEF$,DIR$ .IF NDF $$$GLBL .PSECT $DPB$.,D$$$=.  .IFTF RDEF$ EFN .IFTS .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RDEF$C†W  .MACRO RDEF$S EFN,ERR .MCALL MOV$,DIR$S MOV$ EFNF MOV (PC)+,-(SP) .BYTE 37.,2 DIR$ ,ERR .ENDM RDEF$S0¼W  .MACRO RDEF$ EFN0 .MCALL OFF$ .IF NDF $$$GLB0 .BYTE 37.,2 .WORD EFN .ENDC .IF NDF R.DEEFS .NLIST> OFF$D OFF$ R.DEEF,2.D .LIST .ENDC .ENDM RDEF$¼W  .MACRO RDXF$C BA,CS,ERR .MCALL RDXF$,DIR$ .IF NDF $$$GLBL .PSECT $DPB$.,D$$$=.= .IFTF RDXF$ BAE .IFTF .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RDXF$C$’W  .MACRO RDXF$S BA,ERRE .MCALL MOV$,DIR$R CLR -(SP) MOV$ BA MOV (PC)+,-(SP) .BYTE 39.,3.E DIR$ ,ERR .ENDM RDXF$SÆW  .MACRO RDXF$ BA .MCALL OFF$ .IF NDF $$$GLBE .BYTE 39.,3.E .WORD BA .WORD 0 .ENDC .IF NDF R.DABA .NLISTE OFF$ OFF$ R.DABA,2.. .LIST .ENDC .ENDM RDXF$ÂW  .MACRO RCVD$C TN,BA,CS,ERR. .MCALL RCVD$,DIR$ .IF NDF $$$GLB= .PSECT $DPB$.,D$$$=.. .IFTF RCVD$ TN,BA .IFTE .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM R00"·8 1gCVD$CR–W  .MACRO RCVD$S TN,BA,ERR .MCALL MOV$,DIR$, RFA$+ MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 75.,4 DIR$ ,ERR .ENDM RCVD$SDèW  .MACRO RCVD$ TN,BA .MCALL OFF$, R50$ .IF NDF $$$GLB .BYTE 75.,4 R50$ TN .WORD BA .ENDC .IF NDF R.VDTN .NLIST. .IRP X,<,,> OFF$ XR .ENDM .LIST .ENDC .ENDM RCVD$ÂW  .MACRO RCVX$C TN,BA,CS,ERR. .MCALL RCVX$,DIR$ .IF NDF $$$GLBC .PSECT $DPB$.,D$$$=.N .IFTF RCVX$ TN,BA .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RCVX$C,–W  .MACRO RCVX$S TN,BA,ERR .MCALL MOV$,DIR$, RFA$R MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 77.,4 DIR$ ,ERR .ENDM RCVX$S.èW  .MACRO RCVX$ TN,BA .MCALL OFF$, R50$ .IF NDF $$$GLB .BYTE 77.,4 R50$ TN .WORD BAD .ENDC .IF NDF R.VXTN .NLIST. .IRP X,<,,> OFF$ XR .ENDM .LIST .ENDC .ENDM RCVX$úW ? .MACRO RLON$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMODS .MCALL OFF$,LNMOD$R .IF NDF $$$GLBR LNMOD$ .BYTE 207.,10.. .BYTE 14. .BYTE MOD .WORD TBMSK .WORD LNS .WORD LNSSZ .WORD ENS .WORD ENSSZ .WORD RSIZE .WORD RTBMODM .WORD STATUS .ENDC .IF NDF R.LFUN A .IRP X,<,,,,,>N OFF$ XB .ENDM@ .IRP X,<,,,,> OFF$ X .ENDM .ENDC .ENDM RLON$W G .MACRO RLON$C MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,CS,ERR .MCALL RLON$,DIR$ .IF NDF $$$GLBR .PSECT $DPB$.,D$$$=.0 .IFTF8 RLON$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RLON$C.@W D .MACRO RLON$S MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$. LNMOD$R MOV$ STATUS MOV$ RTBMOD MOV$ RSIZEL MOV$ ENSSZS MOV$ ENS MOV$ LNSSZ. MOV$ LNSM MVB$ TBMSK,#0 MVB$ #14.,MOD MOV (PC)+,-(SP) .BYTE 207.,10., DIR$ ,ERR .ENDM RLON$SRúW ? .MACRO RLOG$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMODM .MCALL OFF$,LNMOD$N .IF NDF $$$GLBZ LNMOD$ .BYTE 207.,10.S .BYTE 10. .BYTE MOD .WORD TBMSK .WORD LNS .WORD LNSSZ .WORD ENS .WORD ENSSZ .WORD RSIZE .WORD RTBMODT .WORD STATUSL .ENDC .IF NDF R.LFUNA .IRP X,<,,,,,>M OFF$ X .ENDM@ .IRP X,<,,,,> OFF$ X2 .ENDM .ENDC .ENDM RLOG$W G .MACRO RLOG$C MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,CS,ERR .MCALL RLOG$,DIR$ .IF NDF $$$GLBZ .PSECT $DPB$.,D$$$=.0 .IFTF8 RLOG$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RLOG$C.@W D .MACRO RLOG$S MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$. LNMOD$R MOV$ STATUS MOV$ RTBMOD MOV$ RSIZEL MOV$ ENSSZS MOV$ ENS MOV$ LNSSZ. MOV$ LNSM MVB$ TBMSK,#0 MVB$ #10.,MOD MOV (PC)+,-(SP) .BYTE 207.,10., DIR$ ,ERR .ENDM RLOG$SRdW  .MACRO RMAF$S ERR MOV (PC)+,-(SP) .BYTE 163.,1F DIR$ ,ERR .ENDM RMAF$S,²W N .MACRO RPOI$ TNAME,PN,PR,UGC,UMC,PARENT,BUFADR,BUFLEN,SC,DNAM,UNIT,TASK,OCBAD .MCALL R50$,OFF$R .IF NDF $$$GLBK .BYTE 11.,16. R50$ TNAMES .BLKW 3 .BYTE UMC,UGC R50$ PARENT .WORD OCBAD .WORD BUFADRS .WORD BUFLEN .BYTE UNIT .BYTE SCS .IF NB DNAM$$$T2=.S .ASCII /DNAM/ .=$$$T2+2, .IFFB .WORD .ENDC R50$ TASK .ENDC .IF NDF R.POTK B .IRP X,<,,,,,> OFF$ X .ENDM@ .IRP X,<,,,,> OFF$ XN .ENDM OFF$ R.POTN,2 .IF DF $$$GLB .GLOBL RP.OEX,RP.OAL,RP.ONX .ENDC RP.OEX=200 RP.OAL=001 RP.ONX=002 .ENDC .ENDM RPOI$8W V .MACRO RPOI$C TNAME,PN,PR,UGC,UMC,PARENT,BUFADR,BUFLEN,SC,DNAM,UNIT,TASK,OCBAD,CS,ERR .MCALL RPOI$,DIR$00"¿5TADATADATADATADATADATADATADATADATA .IF NDF $$$GLB= .PSECT $DPB$.,D$$$=. .IFTFG RPOI$ TNAME,PN,PR,UGC,UMC,PARENT,BUFADR,BUFLEN,SC,DNAM,UNIT,TASK,OCBAD. .IFT, .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RPOI$C<fW S .MACRO RPOI$S TNAME,PN,PR,UGC,UMC,PARENT,BUFADR,BUFLEN,SC,DNAM,UNIT,TASK,OCBAD,ERRB .MCALL MVB$,MOV$,RFA$,DIR$X RFA$ TASK MOV$ DNAM MVB$ UNIT,SCX MOV$ BUFLEN MOV$ BUFADR MOV$ OCBAD RFA$ PARENT MVB$ UMC,UGCR CLR -(SP) CLR -(SP) CLR -(SP) RFA$ TNAMEC MOV (PC)+,-(SP) .BYTE 11.,16. DIR$ ,ERR .ENDM RPOI$SBÊW # .MACRO RQST$C TN,PN,PR,GC,P,CS,ERR, .MCALL RQST$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=.R .IFTF RQST$ TN,PN,PR,GC,P .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM²W  .MACRO RQST$S TN,PN,PR,GC,P,ERR .MCALL MVB$,RFA$,DIR$ MVB$ P,GC CLR -(SP) RFA$N RFA$ TN MOV (PC)+,-(SP) .BYTE 11.,7 DIR$ ,ERR .ENDM RQST$SA*W  .MACRO RQST$ TN,PN,PR,GC,PC .MCALL R50$,OFF$M .IF NDF $$$GLBS .BYTE 11.,7 R50$ TN .WORD 0,0 .WORD 0 .BYTE P,GC .ENDC .IF NDF R.QSTNN .NLISTCA .IRP X,<,,,,,>= OFF$ XF .ENDM .LIST .ENDC .ENDM RQST$¨W  .MACRO RREF$ WDB .MCALL OFF$ .IF NDF $$$GLBS .BYTE 81.,2 .WORD WDB .ENDC .IF NDF R.REBA, OFF$R OFF$ R.REBA,2 .ENDC .ENDM RREF$¾W  .MACRO RREF$C WDB,CS,ERRA .MCALL RREF$,DIR$ .IF NDF $$$GLBP .PSECT $DPB$.,D$$$=.O .IFTF RREF$ WDB .IFTY .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RREF$CG†W  .MACRO RREF$S WDB,ERR .MCALL DIR$,MOV$< MOV$ WDBR MOV (PC)+,-(SP) .BYTE 81.,2 DIR$ ,ERR .ENDM RREF$S¼W  .MACRO RSUM$C TN,CS,ERR .MCALL RSUM$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.. .IFTF RSUM$ TN. .IFTR .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RSUM$C$„W  .MACRO RSUM$S TN,ERR, .MCALL RFA$,DIR$, RFA$ TN MOV (PC)+,-(SP) .BYTE 47.,3 DIR$ ,ERR .ENDM RSUM$S¼W  .MACRO RSUM$ TN .MCALL R50$,OFF$$ .IF NDF $$$GLB .BYTE 47.,3 R50$ TN .ENDC .IF NDF R.SUTNM .NLIST OFF$C OFF$ R.SUTN,4 .LIST .ENDC .ENDM RSUM$èW / .MACRO RUN$C TN,PN,PR,UG,UP,SM,SU,RM,RU,CS,ERR$ .MCALL RUN$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.. .IFTF RUN$ TN,PN,PR,UG,UP,SM,SU,RM,RU .IFTN .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RUN$CÚW , .MACRO RUN$S TN,PN,PR,UG,UP,SM,SU,RM,RU,ERR .MCALL RVP$,MVB$,RFA$,DIR$ RVP$ SM,SU,RM,RU. MVB$ UP,UGN CLR -(SP) RFA$$ RFA$ TN MOV (PC)+,-(SP) .BYTE 17.,11. DIR$ ,ERR .ENDM RUN$S°W & .MACRO RUN$ TN,PN,PR,GC,P,SM,SU,RM,RU .MCALL R50$,OFF$ .IF NDF $$$GLB  .BYTE 17.,11. R50$ TN .WORD 0,0 .WORD 0 .BYTE P,GCN .WORD SM .WORD SUB .WORD RM. .WORD RUR .ENDC .IF NDF R.UNTNR .NLISTFA .IRP X,<,,,,,> OFF$ XR .ENDM5 .IRP X,<,,,>D OFF$ XP .ENDM .LIST .ENDC .ENDM RUN$S¤W  .MACRO SCAA$ AST) .MCALL OFF$ .IF NDF $$$GLB. .BYTE 173.,2. .WORD AST .ENDC .IF NDF S.CAAEC OFF$U OFF$ S.CAAE,2 .ENDC .ENDM¾W  .MACRO SCAA$C AST,CS,ERRD .MCALL SCAA$,DIR$ .IF NDF $$$GLBS .PSECT $DPB$.,D$$$=.. .IFTF SCAA$ AST .IFTN .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SCAA$C4ˆW  .MACRO SCAA$S AST,ERR .MCALL MOV$,DIR$ MOV$ AST2 MOV (PC)+,-(SP) .BYTE 173.,2. DIR$ ,ERR .ENDM SCAA$ST–W  .MACRO SCAL$S SRAD,CRAD .MCALL DIR$,MOV$. MOV$ CRAD MOV$ SRAD MOV (PC)+,-(SP) .BYTE 155.,3 DIR$ ,ERR .ENDM SCAL$SOW  .MACRO SCLI$ CLI,DEV,UNIT .MCALL R50$,OFF$C .IF NDF $$$GLB .BYTE 173.,5.$$$T2=.N .ASCII /DEV/S .=$$$T2+2D .BYTE UNIT,0F R50$ CLIT .ENDC .IF NDF S.CIDVR+ .IRP X,<,,,> OFF$ X. .ENDM .ENDC .ENDM SCLI$ÐW " .MACRO SCLI$C CLI,DEV,UNIT,CS,ERR .MCALL SCLI$,DIR$00"Ç8 1g .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.S .IFTF SCLI$ CLI,DEV,UNIT. .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SCLI$C°W  .MACRO SCLI$S CLI,DEV,UNIT,ERRR .MCALL MOV$,RFA$,DIR$,MVB$ RFA$ CLI MVB$ UNIT,#0 MOV$ DEV3 MOV (PC)+,-(SP) .BYTE 173.,5. DIR$ ,ERR .ENDMÊW  .MACRO SDAT$C TN,BA,EFN,CS,ERR, .MCALL SDAT$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF SDAT$ TN,BA,EFN .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SDAT$C$¤W  .MACRO SDAT$S TN,BA,EFN,ERR .MCALL MOV$,RFA$,DIR$ MOV$ EFN MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 71.,5 DIR$ ,ERR .ENDM SDAT$SCW  .MACRO SDAT$ TN,BA,EFNI .MCALL R50$,OFF$ .IF NDF $$$GLB .BYTE 71.,5 R50$ TN .WORD BAE .WORD EFN .ENDC .IF NDF S.DATN .NLIST+ .IRP X,<,,,>T OFF$ X. .ENDM .LIST .ENDC .ENDM SDAT$&W  .MACRO SDIR$ MOD,ENS,ENSSZS .MCALL OFF$,LNMOD$N .IF NDF $$$GLB$ LNMOD$ .BYTE 207.,5. .BYTE 3 .BYTE MOD .WORD 0 .WORD ENS .WORD ENSSZ .ENDC .IF NDF S.DFUNV6 .IRP X,<,,,,> OFF$ X .ENDM .ENDC .ENDM SDIR$ÒW # .MACRO SDIR$C MOD,ENS,ENSSZ,CS,ERR .MCALL SDIR$,DIR$ .IF NDF $$$GLBN .PSECT $DPB$.,D$$$=.L .IFTF SDIR$ MOD,ENS,ENSSZ .IFT, .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SDIR$CNÎW  .MACRO SDIR$S MOD,ENS,ENSSZ,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$F LNMOD$L MOV$ ENSSZ MOV$ ENS, MOV$ #0 MVB$ #3,MOD MOV (PC)+,-(SP) .BYTE 207.,5S DIR$ ,ERR .ENDM SDIR$SV4W $ .MACRO SDRC$ TNAME,BUF,EFN,EAST,ESB .MCALL OFF$,R50$ .IF NDF $$$GLBI .BYTE 141.,7 R50$ TNAME .WORD BUF .WORD EFN .WORD EAST .WORD ESB .ENDC .IF NDF S.DRTN A .IRP X,<,,,,,> OFF$ X$ .ENDM .ENDC .ENDM SDRC$äW , .MACRO SDRC$C TNAME,BUF,EFN,EAST,ESB,CS,ERR .MCALL SDRC$,DIR$ .IF NDF $$$GLBN .PSECT $DPB$.,D$$$=.0 .IFTF SDRC$ TNAME,BUF,EFN,EAST,ESBE .IFTS .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SDRC$CAØW ) .MACRO SDRC$S TNAME,BUF,EFN,EAST,ESB,ERRF .MCALL DIR$,MOV$,RFA$,MVB$0 MOV$ ESB. MOV$ EAST MOV$ EFN. MOV$ BUF RFA$ TNAME. MOV (PC)+,-(SP) .BYTE 141.,7, DIR$ ,ERR .ENDM SDRC$SEW 6 .MACRO SDRP$ TASK,BUFADR,BUFLEN,EFN,FLAG,PARENT,OCBAD .MCALL R50$,OFF$R .IF NDF $$$GLBF .BYTE 141.,9. R50$ TASK .WORD BUFADR. .BYTE EFN,FLAG. .IF NB BUFLEN .WORD BUFLEN .IFFT .WORD 13. .ENDC R50$ PARENT .WORD OCBAD .ENDC .IF NDF S.DRTKMA .IRP X,<,,,,,>R OFF$ XL .ENDM .IRP X,<,>  OFF$ XV .ENDM .IF DF $$$GLB .GLOBL SD.REX,SD.RAL,SD.RNX .ENDC SD.REX=200 SD.RAL=001 SD.RNX=002 .ENDC .ENDM SDRP$W > .MACRO SDRP$C TASK,BUFADR,BUFLEN,EFN,FLAG,PARENT,OCBAD,CS,ERR .MCALL SDRP$,DIR$ .IF NDF $$$GLBO .PSECT $DPB$.,D$$$=.A .IFTF/ SDRP$ TASK,BUFADR,BUFLEN,EFN,FLAG,PARENT,OCBAD. .IFTR .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SDRP$CW ; .MACRO SDRP$S TASK,BUFADR,BUFLEN,EFN,FLAG,PARENT,OCBAD,ERR. .MCALL MVB$,MOV$,RFA$,DIR$D MOV$ OCBADF RFA$ PARENT MOV$ BUFLEN MVB$ EFN,FLAG MOV$ BUFADR RFA$ TASK MOV (PC)+,-(SP) .BYTE 141.,9. DIR$ ,ERR .ENDM SDRP$S¾W  .MACRO SETF$C EFN,CS,ERR, .MCALL SETF$,DIR$ .IF NDF $$$GLB  .PSECT $DPB$.,D$$$=.L .IFTF SETF$ EFN .IFTA .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SETF$C,†W  .MACRO SETF$S EFN,ERR .MCALL MOV$,DIR$R MOV$ EFN MOV (PC)+,-(SP) .BYTE 33.,2 DIR$ ,ERR .ENDM SETF$SNºW  .MACRO SETF$ EFND .MCALL OFF$ .IF NDF $$$GLBT .BYTE 33.,2 .WORD EFN .ENDC .IF NDF S.ETEF  .NLISTV OFF$- OFF$ S.ETEF,2 .LIST .ENDC .ENDM SETF$¾W  .MACRO SFPA$C AST,CS,ERRR .MCALL SFPA$,DIR$ .IF NDF $$$GLBL .PSECT $DPB$.,D$$$=.= .IFTF SFPA$ AST00"Ï5TADATADATADATADATADATADATADATADATA .IFTF .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SFPA$C$ˆW  .MACRO SFPA$S AST,ERR .MCALL MOV$,DIR$R MOV$ ASTF MOV (PC)+,-(SP) .BYTE 111.,22 DIR$ ,ERR .ENDM SFPA$SN¼W  .MACRO SFPA$ ASTD .MCALL OFF$ .IF NDF $$$GLBT .BYTE 111.,2 .WORD AST .ENDC .IF NDF S.FPAE .NLIST OFF$ OFF$ S.FPAE,2 .LIST .ENDC .ENDM SFPA$<W  .MACRO SMSG$ TGT,BUF,LEN,PRMLST .MCALL OFF$ .NLIST$ .IF NDF S.MTGTD OFF$3 .IRP X,<,,,>  OFF$ X .ENDM .IF DF $$$GLB .GLOBL SM.SER .ENDCSM.SER=1 .ENDC .IF NDF $$$GLBR$$$ARG=0 .IRP X,$$$ARG=$$$ARG+12 .ENDM .IF NB TGTS .IF IDN TGT SM.SER .IF LT,$$$ARG-4 $$$ARG=4L .ENDC .ENDC .ENDC .LIST .BYTE 171.,4+$$$ARG .BYTE TGT .BYTE 0 .WORD BUF .WORD LEN .IRP X,$$$ARG=$$$ARG-1M .WORD X .ENDM .REPT $$$ARG  .WORD .ENDR .ENDC .ENDMÖW ( .MACRO SMSG$C TGT,BUF,LEN,PRMLST,CS,ERR .MCALL SMSG$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.  .IFTF SMSG$ TGT,BUF,LEN,R .IFTN .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM„W % .MACRO SMSG$S TGT,BUF,LEN,PRMLST,ERRT .MCALL MVB$,MOV$,RVP$,DIR$$$$$ARG=0$$$=0 .IRP X,$$$ARG=$$$ARG+1, .ENDM .IF NB TGT .IF IDN TGT #SM.SER .IF LT,$$$ARG-4 $$$=4-$$$ARG .REPT $$$ CLR -(SP) .ENDR .ENDC .ENDC .ENDC RVP$ PRMLST MOV$ LEN MOV$ BUF MVB$ TGTR MOV (PC)+,-(SP) .BYTE 171.,4+$$$ARG+$$$ DIR$ ,ERR .ENDM,W  .MACRO SNXC$ DEVICE,UNITS .MCALL OFF$ .IF NDF $$$GLBF .BYTE 127.,3. .IF B DEVICE .WORD 0 .IFF $$$T2=. .ASCII /DEVICE/ .=$$$T2+2 .ENDC .BYTE UNITL .BYTE 0 .ENDC .IF NDF S.NXDV$ .IRP X,<,,> OFF$ X. .ENDM .ENDC .ENDM SNXC$ÎW ! .MACRO SNXC$C DEVICE,UNIT,CS,ERR$ .MCALL SNXC$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.V .IFTF SNXC$ DEVICE,UNIT .IFTV .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SNXC$CžW  .MACRO SNXC$S DEVICE,UNIT,ERR .MCALL DIR$,MOV$. MOV$ UNIT MOV$ DEVICE MOV (PC)+,-(SP) .BYTE 127.,3. DIR$ ,ERR .ENDM SNXC$SV¾W  .MACRO SPEA$C AST,CS,ERRE .MCALL SPEA$,DIR$ .IF NDF $$$GLB, .PSECT $DPB$.,D$$$=. .IFTF SPEA$ AST .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SPEA$C,ˆW  .MACRO SPEA$S AST,ERR .MCALL MOV$,DIR$D MOV$ AST= MOV (PC)+,-(SP) .BYTE 165.,2. DIR$ ,ERR .ENDM SPEA$S$¼W  .MACRO SPEA$ AST .MCALL OFF$ .IF NDF $$$GLB, .BYTE 165.,2L .WORD AST .ENDC .IF NDF S.PEAEE .NLISTC OFF$) OFF$ S.PEAE,2 .LIST .ENDC .ENDM SPEA$ºW  .MACRO SPND$C PSCT,ERRE .MCALL SPND$,DIR$ .IF NDF $$$GLB, .PSECT $DPB$.,D$$$=. .IFTF SPND$ .IFT. .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM SPND$C$pW  .MACRO SPND$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 45.,1 DIR$ ,ERR .ENDM SPND$SXW  .MACRO SPND$ .IF NDF $$$GLBR .BYTE 45.,1 .ENDC .ENDM SPND$¾W  .MACRO SPRA$C AST,CS,ERR .MCALL SPRA$,DIR$ .IF NDF $$$GLBO .PSECT $DPB$.,D$$$=.N .IFTF SPRA$ AST .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SPRA$C$ˆW  .MACRO SPRA$S AST,ERR .MCALL MOV$,DIR$ MOV$ ASTS MOV (PC)+,-(SP) .BYTE 109.,2 DIR$ ,ERR .ENDM SPRA$S¼W  .MACRO SPRA$ AST$ .MCALL OFF$ .IF NDF $$$GLB1 .BYTE 109.,2. .WORD AST .ENDC .IF NDF S.PRAER .NLIST OFF$F OFF$ S.PRAE,2 .LIST .ENDC .ENDM SPRA$˜W F .MACRO SPWN$ TNAME,PN,PR,UGC,UMC,EFN,EAST,ESB,CMDLIN,CMDLEN,UNIT,DNAM .MCALL OFF$,R50$ .IF NDF $$$GLBT .IF B DNAMS .BYTE 11.,13. .IFF .BYTE 11.,14. .ENDC R50$ TNAME .BLKW 3 .BYTE UMC,UGC .WORD EFN .WORD EASTV .WORD ESB .WORD CMDLIN. .WORD CMDLEND .WORD UNITN .IF NB DNAM$$$T2=. .ASCII /DNAM/ .=$$$T2+2. .ENDC .ENDC .IF NDF S.PWTNYA .IRP X,<,,,,,> OFF$ XR .ENDM@ .IRP X,<,,,,> OFF$ X, .ENDM .IRP X,<> OFF$ XM .ENDR $$$OST=256.*8.F OFF$ SP.WX8 .ENDC .ENDM SPWN$$W N .MACRO SPWN$C TNAME,PN,PR,UGC,UMC,EFN,EAST,ESB,CMDLIN,CMDLEN,UNIT,DNAM,CS,ERR .MCALL SPWN$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=.N .IFTF; SPWN$ TNAME,,,UGC,UMC,EFN,EAST,ESB,CMDLIN,CMDLEN,UNIT,DNAM .IFTF .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SPWN$C>šW K .MACRO SPWN$S TNAME,PN,PR,UGC,UMC,EFN,EAST,ESB,CMDLIN,CMDLEN,UNIT,DNAM,ERR> .MCALL DIR$,MOV$,MVB$,RFA$M .IF NB DNAM MOV$ DNAM .ENDC MOV$ UNIT MOV$ CMDLEN MOV$ CMDLIN MOV$ ESBN MOV$ EAST MOV$ EFN MVB$ UMC,UGCN CLR -(SP) CLR -(SP) CLR -(SP) RFA$ TNAME, MOV (PC)+,-(SP) .IF B DNAM, .BYTE 11.,13. .IFF .BYTE 11.,14. .ENDC DIR$ ,ERR .ENDM SPWN$SC¾W  .MACRO SRDA$C AST,CS,ERR. .MCALL SRDA$,DIR$ .IF NDF $$$GLBN .PSECT $DPB$.,D$$$=. .IFTF SRDA$ AST .IFTT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SRDA$CDˆW  .MACRO SRDA$S AST,ERR .MCALL MOV$,DIR$N MOV$ AST MOV (PC)+,-(SP) .BYTE 107.,2M DIR$ ,ERR .ENDM SRDA$ST¼W  .MACRO SRDA$ ASTS .MCALL OFF$ .IF NDF $$$GLBA .BYTE 107.,2( .WORD AST .ENDC .IF NDF S.RDAE1 .NLIST OFF$E OFF$ S.RDAE,2 .LIST .ENDC .ENDM SRDA$¾W  .MACRO SREA$C AST,CS,ERR .MCALL SREA$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF SREA$ AST .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SREA$CˆW  .MACRO SREA$S AST,ERR .MCALL MOV$,DIR$ MOV$ AST MOV (PC)+,-(SP) .BYTE 167.,2 DIR$ ,ERR .ENDM SREA$S¼W  .MACRO SREA$ AST .MCALL OFF$ .IF NDF $$$GLB .BYTE 167.,2 .WORD AST .ENDC .IF NDF S.REAE .NLIST OFF$ OFF$ S.REAE,2 .LIST .ENDC .ENDM SREA$öW  .MACRO SREF$ TASK,WDB,EFN .MCALL R50$,OFF$ .IF NDF $$$GLB .BYTE 69.,5 R50$ TASK .WORD EFN .WORD WDB .ENDC .IF NDF S.RETN$+ .IRP X,<,,,> OFF$ X  .ENDM .ENDC .ENDM SREF$ÐW " .MACRO SREF$C TASK,WDB,EFN,CS,ERR .MCALL SREF$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF SREF$ TASK,WDB,EFN .IFTE .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SREF$CL°W ! .MACRO SREF$S TSKADR,WDB,EFN,ERRS .MCALL DIR$,MOV$,RFA$ MOV$ WDBF MOV$ EFNE RFA$ TSKADR MOV (PC)+,-(SP) .BYTE 69.,5 DIR$ ,ERR .ENDM SREF$SDÆW  .MACRO SREX$C AST,BUF,CS,ERR  .MCALL SREX$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.C .IFTF SREX$ AST,BUF .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SREX$C,˜W  .MACRO SREX$S AST,BUF,ERR .MCALL MOV$,DIR$T CLR -(SP) MOV$ AST. MOV (PC)+,-(SP) .BYTE 167.,3 DIR$ ,ERR .ENDM SREX$SÊW  .MACRO SREX$ AST,BUF .MCALL OFF$ .IF NDF $$$GLBD .BYTE 167.,3 .WORD AST .WORD 0 .ENDC .IF NDF S.REAED .NLIST OFF$S OFF$ S.REAE,2 .LIST .ENDC .ENDM SREX$ºW  .MACRO SRRA$ ASTN .MCALL OFF$ .IF NDF $$$GLB$ .BYTE 21.,2 .WORD AST .ENDC .IF NDF S.RRAED .NLISTE OFF$N OFF$ S.RRAE,2 .LIST .ENDC .ENDM SRRA$¾W  .MACRO SRRA$C AST,CS,ERR- .MCALL SRRA$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=. .IFTF SRRA$ AST .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SRRA$CF†W  .MACRO SRRA$S AST,ERR .MCALL MOV$,DIR$N MOV$ AST MOV (PC)+,-(SP) .BYTE 21.,2 DIR$ ,ERR .ENDM SRRA$SE¾W  .MACRO STAF$C AFF,CS,ERRC .MCALL STAF$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=.. .IFTF STAF$ AFF .IFTO .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM STAF$C”W  .MACRO STAF$S AFF,ERR .MCALL DIR$,MOV$,AFF$ AFF$F MOV$ AFF. MOV (PC)+,-(SP) .BYTE 161.,2. DIR$ ,ERR .ENDM STAF$SSÊW  .MACRO STAF$ AFF$ .MCALL AFF$,OFF$ .IF NDF $$$GBLA AFF$ .BYTE 161.,2. .WORD AFF .ENDC .IF NDF S00"ß5TADATADATADATADATADATADATADATADATA.AFAFY .NLIST OFF$E OFF$ S.AFAF,2 .LIST .ENDC .ENDM STAF$ÊW  .MACRO STIM$C NBUF,OBUF,CS,ERR$ .MCALL STIM$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.S .IFTF STIM$ NBUF,OBUF .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM STIM$CEfW  .MACRO STIM$S NBUF,OBUF,ERR .MCALL MOV$,DIR$,OFF$ MOV$ OBUF MOV$ NBUF MOV (PC)+,-(SP) .BYTE 61.,3 DIR$ ,ERR .IF NDF S.TIYRF .NLIST$$$OST=05 .IRP X,<,,,>F OFF$ XA .ENDM5 .IRP X,<,,,>A OFF$ X .ENDM .LIST .ENDC .ENDM STIM$S,˜W  .MACRO STIM$ NBUF,OBUF .MCALL OFF$ .IF NDF $$$GLBF .BYTE 61.,3 .WORD NBUF .WORD OBUFD .ENDC .IF NDF S.TIBAN .NLISTE OFF$ OFF$ S.TIBA,2 OFF$ S.TIBO,2 .IF NDF S.TIYR $$$OST=05 .IRP X,<,,,>6 OFF$ XR .ENDM5 .IRP X,<,,,>2 OFF$ X, .ENDM .ENDC .LIST .ENDC .ENDM STIM$ÊW  .MACRO STLO$ GRP,MSK, .MCALL OFF$ .IF NDF $$$GLB .BYTE 137.,3 .WORD GRP .WORD MSK .ENDC .IF NDF S.TLGRB OFF$ OFF$ S.TLGR,2 OFF$ S.TLMS,2 .ENDC .ENDM STLO$ÆW  .MACRO STLO$C GRP,MSK,CS,ERR. .MCALL STLO$,DIR$ .IF NDF $$$GLB  .PSECT $DPB$.,D$$$=.  .IFTF STLO$ GRP,MSK .IFT, .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM STLO$CMÈW  .MACRO STLO$S GRP,MSK,ERR .MCALL DIR$,MOV$, MOV$ MSK. .IF NB GRP MOV #GRP,-(SP)I .IFF CLR -(SP) .ENDC MOV (PC)+,-(SP) .BYTE 137.,3. DIR$ ,ERR .ENDM STLO$S,ªW  .MACRO STSE$ EFN. .MCALL OFF$ .IF NDF $$$GLB. .BYTE 135.,2. .WORD EFN .ENDC .IF NDF S.TSEF OFF$ OFF$ S.TSEF,2 .ENDC .ENDM STSE$¾W  .MACRO STSE$C EFN,CS,ERRB .MCALL STSE$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.  .IFTF STSE$ EFN .IFTL .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM STSE$CˆW  .MACRO STSE$S EFN,ERR .MCALL DIR$,MOV$I MOV$ EFNC MOV (PC)+,-(SP) .BYTE 135.,2) DIR$ ,ERR .ENDM STSE$SRZW  .MACRO STOP$ .IF NDF $$$GLBF .BYTE 131.,1$ .ENDC .ENDM STOP$¶W  .MACRO STOP$C CS,ERRF .MCALL STOP$,DIR$ .IF NDF $$$GLBN .PSECT $DPB$.,D$$$=. .IFTF STOP$ .IFTC .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM STOP$CrW  .MACRO STOP$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 131.,1N DIR$ ,ERR .ENDM STOP$SÂW  .MACRO SVDB$C AD,LN,CS,ERRM .MCALL SVDB$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=. .IFTF SVDB$ AD,LN .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SVDB$C$’W  .MACRO SVDB$S AD,LN,ERR .MCALL MOV$,DIR$F MOV$ LN MOV$ AD MOV (PC)+,-(SP) .BYTE 103.,3. DIR$ ,ERR .ENDM SVDB$SàW  .MACRO SVDB$ A,L. .MCALL OFF$ .IF NDF $$$GLB .BYTE 103.,3  .WORD A .WORD L .ENDC .IF NDF S.VDTA. .NLIST, .IRP X,<,,> OFF$ X .ENDM .LIST .ENDC .ENDM SVDB$ÆW  .MACRO SVTK$C ADR,LEN,CS,ERR. .MCALL SVTK$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.$ .IFTF SVTK$ ADR,LEN .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SVTK$CO˜W  .MACRO SVTK$S ADR,LEN,ERR .MCALL MOV$,DIR$D MOV$ LEN. MOV$ ADR MOV (PC)+,-(SP) .BYTE 105.,3 DIR$ ,ERR .ENDM SVTK$SFæW  .MACRO SVTK$ TA,TLO .MCALL OFF$ .IF NDF $$$GLB .BYTE 105.,3 .WORD TA, .WORD TL2 .ENDC .IF NDF S.VTTAI .NLISTC .IRP X,<,,> OFF$ XV .ENDM .LIST .ENDC .ENDM SVTK$LW  .MACRO SWST$ BASE,ADDR= .MCALL OFF$ .IF NDF $$$GLBF .BYTE 175.,3. .WORD BASER .WORD ADDRN .ENDC .IF NDF S.WBAS .IRP X,<,,> OFF$ X$ .ENDM $$$OST=2@ .IRP X,<,,,,> OFF$ X .ENDM OFF$ S.WSR5,2 .ENDC .ENDM SWST$ÊW  .MACRO SWST$C BASE,ADDR,CS,ERR .MCALL SWST$,DIR$ .IF NDF $$$GLB .PSECT 00"ç8 1g$DPB$.,D$$$=.T .IFTF SWST$ BASE,ADDR .IFTM .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SWST$C.šW  .MACRO SWST$S BASE,ADDR,ERR .MCALL DIR$,MOV$, MOV$ ADDR MOV$ BASE MOV (PC)+,-(SP) .BYTE 175.,3. DIR$ ,ERR .ENDM SWST$SDúW ? .MACRO TLON$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMODR .MCALL OFF$,LNMOD$F .IF NDF $$$GLBF LNMOD$2 .BYTE 207.,10.S .BYTE 13. .BYTE MOD .WORD TBMSK .WORD LNS .WORD LNSSZ .WORD ENS .WORD ENSSZ .WORD RSIZE .WORD RTBMODT .WORD STATUS$ .ENDC .IF NDF T.LFUNCA .IRP X,<,,,,,>A OFF$ XS .ENDM@ .IRP X,<,,,,> OFF$ XE .ENDM .ENDC .ENDM TLON$W G .MACRO TLON$C MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,CS,ERR .MCALL TLON$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.0 .IFTF8 TLON$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM TLON$C.@W D .MACRO TLON$S MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$. LNMOD$R MOV$ STATUS MOV$ RTBMOD MOV$ RSIZEL MOV$ ENSSZS MOV$ ENS MOV$ LNSSZ. MOV$ LNSM MVB$ TBMSK,#0 MVB$ #13.,MOD MOV (PC)+,-(SP) .BYTE 207.,10., DIR$ ,ERR .ENDM TLON$SRúW ? .MACRO TLOG$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMODM .MCALL OFF$,LNMOD$N .IF NDF $$$GLBZ LNMOD$ .BYTE 207.,10.S .BYTE 9.$ .BYTE MOD .WORD TBMSK .WORD LNS .WORD LNSSZ .WORD ENS .WORD ENSSZ .WORD RSIZE .WORD RTBMODT .WORD STATUSL .ENDC .IF NDF T.LFUNA .IRP X,<,,,,,>M OFF$ X .ENDM@ .IRP X,<,,,,> OFF$ X2 .ENDM .ENDC .ENDM TLOG$W G .MACRO TLOG$C MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,CS,ERR .MCALL TLOG$,DIR$ .IF NDF $$$GLBZ .PSECT $DPB$.,D$$$=.0 .IFTF8 TLOG$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM TLOG$C.@W D .MACRO TLOG$S MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$. LNMOD$R MOV$ STATUS MOV$ RTBMOD MOV$ RSIZEL MOV$ ENSSZS MOV$ ENS MOV$ LNSSZ. MOV$ LNSM MVB$ TBMSK,#0 MVB$ #9.,MODR MOV (PC)+,-(SP) .BYTE 207.,10., DIR$ ,ERR .ENDM TLOG$SR¸W  .MACRO ULGF$C CS,ERR .MCALL ULGF$,DIR$ .IF NDF $$$GLBO .PSECT $DPB$.,D$,$$$=.S .IFTF ULGF$ .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ULGF$CMrW  .MACRO ULGF$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 159.,1, DIR$ ,ERR .ENDM ULGF$SVZW  .MACRO ULGF$T .IF NDF $$$GLBD .BYTE 159.,1 .ENDC .ENDM ULGF$ªW  .MACRO UMAP$ WDBB .MCALL OFF$ .IF NDF $$$GLBC .BYTE 123.,2E .WORD WDB .ENDC .IF NDF U.MABAR OFF$ OFF$ U.MABA,2 .ENDC .ENDM UMAP$¾W  .MACRO UMAP$C WDB,CS,ERRD .MCALL UMAP$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.$ .IFTF UMAP$ WDB .IFTM .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM UMAP$C$ˆW  .MACRO UMAP$S WDB,ERR .MCALL DIR$,MOV$V MOV$ WDB MOV (PC)+,-(SP) .BYTE 123.,2$ DIR$ ,ERR .ENDM UMAP$SN´W  .MACRO USTP$ TNAMEA .MCALL OFF$,R50$C .IF NDF $$$GLBF .BYTE 133.,3E R50$ TNAMEO .ENDC .IF NDF U.STTNU OFF$ OFF$ U.STTN,2 .ENDC .ENDM USTP$ÂW  .MACRO USTP$C TNAME,CS,ERR, .MCALL USTP$,DIR$ .IF NDF $$$GLB$ .PSECT $DPB$.,D$$$=.$ .IFTF USTP$ TNAME .IFTF .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM USTP$C$ŒW  .MACRO USTP$S TNAME,ERR .MCALL DIR$,RFA$V RFA$ TNAME MOV (PC)+,-(SP) .BYTE 133.,3 DIR$ ,ERR .ENDM USTP$SÒW % .MACRO VRCD$C TN,BA,BL=13.,TI,CS,ERRC .MCALL VRCD$,DIR$ .IF NDF $$$GLBR .PSECT $DPB$.,D$$$=.N .IFTF VRCD$ TN,BA,BL,TI .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM VRCD$CP¸W 00"ï5TADATADATADATADATADATADATADATADATA# .MACRO VRCD$S TN,BA,BL=#13.,TI,ERR .MCALL MOV$,DIR$, RFA$ MOV$ TI MOV$ BL MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 75.,6.U DIR$ ,ERR .ENDM VRCD$S."W  .MACRO VRCD$ TN,BA,BL=13.,TI  .MCALL OFF$, R50$ .IF NDF $$$GLB, .BYTE 75.,6. R50$ TN .WORD BA .WORD BL .WORD TID .ENDC .IF NDF R.VDTNC .NLIST 6 .IRP X,<,,,,> OFF$ XV .ENDM .LIST .ENDC .ENDM VRCD$ÒW % .MACRO VRCS$C TN,BA,BL=13.,TI,CS,ERR .MCALL VRCS$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF VRCS$ TN,BA,BL,TI .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM VRCS$C.¸W # .MACRO VRCS$S TN,BA,BL=#13.,TI,ERR1 .MCALL MOV$,DIR$, RFA$$ MOV$ TI MOV$ BL MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 139.,6. DIR$ ,ERR .ENDM VRCS$SV"W  .MACRO VRCS$ TN,BA,BL=13.,TIR .MCALL OFF$, R50$ .IF NDF $$$GLBM .BYTE 139.,6. R50$ TN .WORD BA .WORD BL .WORD TIS .ENDC .IF NDF R.VSTN .NLIST 6 .IRP X,<,,,,> OFF$ XV .ENDM .LIST .ENDC .ENDM VRCS$ÒW % .MACRO VRCX$C TN,BA,BL=13.,TI,CS,ERR .MCALL VRCX$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF VRCX$ TN,BA,BL,TI .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM VRCX$C.¸W # .MACRO VRCX$S TN,BA,BL=#13.,TI,ERR1 .MCALL MOV$,DIR$, RFA$$ MOV$ TI MOV$ BL MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 77.,6.O DIR$ ,ERR .ENDM VRCX$SV"W  .MACRO VRCX$ TN,BA,BL=13.,TIR .MCALL OFF$, R50$ .IF NDF $$$GLBM .BYTE 77.,6.C R50$ TN .WORD BA .WORD BL .WORD TIX .ENDC .IF NDF R.VXTN .NLIST 6 .IRP X,<,,,,> OFF$ XV .ENDM .LIST .ENDC .ENDM VRCX$äW . .MACRO VSDA$C TN,BA,BL=13.,EFN,SPRI,TI,CS,ERR .MCALL VSDA$,DIR$ .IF NDF $$$GLB  .PSECT $DPB$.,D$$$=.I .IFTF VSDA$ TN,BA,BL,EFN,SPRI,TI( .IFTS .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM VSDA$CÖW , .MACRO VSDA$S TN,BA,BL=#13.,EFN,SPRI,TI,ERR .MCALL MOV$,RFA$,DIR$ MOV$ TI MOV$ SPRI MOV$ BL MOV$ EFN MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 71.,8.R DIR$ ,ERR .ENDM VSDA$S,xW & .MACRO VSDA$ TN,BA,BL=13.,EFN,SPRI,TI .MCALL R50$,OFF$ .IF NDF $$$GLBR .BYTE 71.,8.B R50$ TN .WORD BAE .WORD EFN .WORD BL .WORD SPRIL .WORD TI  .ENDC .IF NDF S.DABL .NLIST,+ .IRP X,<,,,>  OFF$ X .ENDM* .IRP X,<,,> OFF$ XA .ENDM .LIST .ENDC .ENDM VSDA$VW + .MACRO VSRC$ TNAME,BUF,BUFLEN,EFN,EAST,ESBA .MCALL OFF$,R50$C .IF NDF $$$GLB7 .BYTE 141.,8. R50$ TNAMED .WORD BUF .WORD EFN .WORD BUFLENN .WORD EASTN .WORD ESB .ENDC .IF NDF V.SRTNFL .IRP X,<,,,,,,> OFF$ X. .ENDM .ENDC .ENDM VSRC$òW 3 .MACRO VSRC$C TNAME,BUF,BUFLEN,EFN,EAST,ESB,CS,ERR .MCALL VSRC$,DIR$ .IF NDF $$$GLB> .PSECT $DPB$.,D$$$=.. .IFTF$ VSRC$ TNAME,BUF,BUFLEN,EFN,EAST,ESB .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM VSRC$CLìW 0 .MACRO VSRC$S TNAME,BUF,BUFLEN,EFN,EAST,ESB,ERR .MCALL DIR$,MOV$,RFA$,MVB$E MOV$ ESBE MOV$ EAST MOV$ BUFLEN MOV$ EFNS MOV$ BUF RFA$ TNAME> MOV (PC)+,-(SP) .BYTE 141.,8. DIR$ ,ERR .ENDM VSRC$SFÈW * .MACRO WDBBK$ APR,SIZ,RID,OFF,LEN,STS,SRB .MCALL WDBDF$ WDBDF$F .BYTE 0,APR .WORD 0 .WORD SIZ .WORD RID .WORD OFF .WORD LEN .WORD STS .WORD SRB .ENDM WDBBK$F8W  .MACRO WDBDF$ GBL .MCALL .BLKW.,.BLKB.,.BLK.M .BLK. .BLKB. 1,W.NID,GBL. .BLKB. 1,W.NAPR,GBL .BLKW. 1,W.NBAS,GBL .BLKW. 1,W.NSIZ,GBL .BLKW. 1,W.NRID,GBL .BLKW. 1,W.NOFF,GBL .BLKW. 1,W.NLEN,GBL .BLKW. 1,W.NSTS,GBL .BLKW. 1,W.NSRB,GBL .BLKW. 0,W.NLGH,GBL .IF IDN ,1 .GLOBL WS.CRW,WS.UNM,WS.ELW,WS.RRF,WS.64B,WS.SISS1 .GLOBL WS.MAP,WS.RCX,WS.DEL,WS.EXT,WS.WRT,WS.RED0* .GLOB00"÷8 1gL WS.BPS,WS.NBP,WS.UDS,WS.NAT,WS.RES .ENDCWS.CRW=^O<100000>BWS.UNM=^O<40000>WS.ELW=^O<20000>WS.RRF=^O<10000>WS.BPS=^O<4000>.WS.NBP=^O<4000>LWS.RES=^O<2000>IWS.NAT=^O<1000>,WS.64B=^O<400>WS.MAP=^O<200>WS.RCX=^O<100> WS.SIS=^O<40> WS.UDS=^O<20>. WS.DEL=^O<10>G WS.EXT=^O<4> WS.WRT=^O<2> WS.RED=^O<1>WS.EDS=WS.SIS!WS.UDS .MACRO WDBDF$ X .ENDM .ENDM WDBDF$$0W , .MACRO WIMP$C SFCN,P1,P2,P3,P4,P5,P6,CS,ERR .MCALL DIR$,GFN$,OFF$ .IF NDF $$$GLBW .PSECT $DPB$.,D$$$=.. .IFTF GFN$A .NARG $$$NN $$$I=$$$N^ .BYTE 169.,$$$N+1% .IRP $$$PRM,0 .IF EQ $$$I .MEXIT .IFF^ $$$I=$$$I-1R .ENDC .WORD $$$PRM< .ENDR .IF NDF W.IMSFS .NLIST06 .IRP X,<,,,,> OFF$ XG .ENDR* .IRP X,<,,> OFF$ XU .ENDR OFF$ W.IP07,2 .ENDC .IFTB .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM WIMP$C3.W % .MACRO WIMP$S SFCN,P1,P2,P3,P4,P5,P6W .MCALL MOV$,DIR$,OFF$,MVB$,GFN$ GFN$A .NARG $$$NN $$$I=$$$N^$$$K=6.1% .IRP $$$PRM,, .IF GT $$$I-$$$K MOV$ $$$PRM .ENDC $$$K=$$$K-1R .ENDR MOV (PC)+,-(SP) .BYTE 169.,$$$N+1 DIR$. .ENDM WIMP$S,ÌW $ .MACRO WIMP$ SFCN,P1,P2,P3,P4,P5,P6 .MCALL OFF$,GFN$< .IF NDF $$$GLB, GFN$P .NARG $$$N $$$I=$$$N .BYTE 169.,$$$N+1% .IRP $$$PRM, .IF EQ $$$I .MEXIT .IFF $$$I=$$$I-1A .ENDC .WORD $$$PRM3 .ENDR .ENDC .IF NDF W.INSF$ .NLIST$6 .IRP X,<,,,,> OFF$ X, .ENDM* .IRP X,<,,> OFF$ X .ENDR .ENDC .ENDM WIMP$ºW  .MACRO WSIG$C PSCT,ERRM .MCALL WSIG$,DIR$ .IF NDF $$$GLBI .PSECT $DPB$.,D$$$=.6 .IFTF WSIG$ .IFT. .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM WSIG$CYpW  .MACRO WSIG$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 49.,1 DIR$ ,ERR .ENDM WSIG$S.XW  .MACRO WSIG$F .IF NDF $$$GLBL .BYTE 49.,1 .ENDC .ENDM WSIG$ÊW  .MACRO WTLO$C SET,MASK,CS,ERR .MCALL WTLO$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF WTLO$ SET, .IFTA .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM WTLO$C$zW  .MACRO WTLO$S SET,MSK,ERR .MCALL MOV$,DIR$ $$$T1=1R .IF EQ SET-4N$$$T1=0M .IRP X, $$$T1=$$$T1+1A .ENDM .IF NE $$$T1-1I) .ERROR SET ;UNSUPPORTED EXECUTIVE OPTIONE .ENDC .ENDC .IF EQ $$$T1-1 MOV$ MSK .IF NE SETN MOV #SET,-(SP)E .IFF CLR -(SP) .ENDC MOV (PC)+,-(SP) .BYTE 43.,3 .ENDC DIR$ ,ERR .ENDM WTLO$SI.W  .MACRO WTLO$ SET,MASK .IF NDF $$$GLBL$$$T1=1A .IF EQ SET-4.$$$T1=0 .IRP X, $$$T1=$$$T1+1W .ENDM .IF NE $$$T1-1) .ERROR SET ;UNSUPPORTED EXECUTIVE OPTIONR .ENDC .ENDC .IF EQ $$$T1-1T .BYTE 43.,3 .WORD SET .WORD MASK. .ENDC .ENDC .ENDM WTLO$¼W  .MACRO WTSE$C EF,CS,ERR .MCALL WTSE$,DIR$ .IF NDF $$$GLB  .PSECT $DPB$.,D$$$=., .IFTF WTSE$ EFR .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM WTSE$CR„W  .MACRO WTSE$S EF,ERR .MCALL MOV$,DIR$A MOV$ EF MOV (PC)+,-(SP) .BYTE 41.,2 DIR$ ,ERR .ENDM WTSE$SSºW  .MACRO WTSE$ EFN$ .MCALL OFF$ .IF NDF $$$GLBD .BYTE 41.,2 .WORD EFN .ENDC .IF NDF W.TSEFT .NLIST4 OFF$. OFF$ W.TSEF,2 .LIST .ENDC .ENDM WTSE$¤W  .MACRO DIR$ ADR,ERR .IF NB C MOV ADR,-(SP) .ENDC EMT ^O<377> .IIF NB , .MCALL ERR$ .IIF NB , ERR$ ERR .ENDM DIR$$*W  .MACRO ERR$ ERR .IF NB . .NLISTE .NTYPE $$$T1,ERR  .LIST .IIF EQ ^O<$$$T1-27>, BCC .+6 .IIF EQ ^O<$$$T1-37>, BCC .+6 .IF GE ^O<$$$T1-60> BCC .+6 .IFFE .IF NE ^O<$$$T1-27> .IIF NE ^O<$$$T1-37>, BCC .+4 .ENDC .ENDC CALL ERRF .ENDC .ENDM ERR$OW  .MACRO MVB$ LOW,HIGHN .IF B .IF B . CLR -(SP) .IFF CLRB -(SP)C MOVB HIGH,1(SP) .ENDC .IFF< .IF00"ÿ5TADATADATADATADATADATADATADATADATA B < CLR -(SP) MOVB LOW,(SP) .IFF  MOVB LOW,-(SP)D MOVB HIGH,1(SP) .ENDC .ENDC .ENDM MVB$NðW  .MACRO OFF$ SYMB,LEN. .IF B <'SYMB'LEN>$$$OST=2 .MEXIT. .ENDC .IF NB  .IF NDF $$$GLB$ SYMB=$$$OSTC .IFF. SYMB==$$$OST .ENDC .ENDC .IF NB -$$$OST = ^O<$$$OST+LEN>N .ENDC .ENDM OFF$CW  .MACRO RFA$ ADR .IF NB H .NLISTF .NTYPE $$$T2,ADRI .LIST .IF LT $$$T2-6 MOV 2(ADR),-(SP)  MOV (ADR),-(SP) .IFF< MOV ADR,-(SP) MOV @(SP),-(SP) ADD #2,2(SP)F MOV @2(SP),2(SP)D .ENDC .IFFS CLR -(SP) CLR -(SP) .ENDC .ENDM RFA$ªW * .MACRO RVP$ P0,P1,P2,P3,P4,P5,P6,P7,P8,P9 .MCALL MOV$ .NLIST .NARG $$$ARGF .LIST .IIF GT $$$ARG-9., MOV$ $ .IIF GT $$$ARG-8., MOV$ L .IIF GT $$$ARG-7, MOV$  .IIF GT $$$ARG-6, MOV$  .IIF GT $$$ARG-5, MOV$  .IIF GT $$$ARG-4, MOV$  .IIF GT $$$ARG-3, MOV$  .IIF GT $$$ARG-2, MOV$  .IIF GT $$$ARG-1, MOV$  .IIF GT $$$ARG, MOV$ .ENDM RVP$(òW  .MACRO R50$ NAMEF .NLIST- .NCHR $$$T1,NAME. .LIST .IF EQ $$$T1 .WORD 0,0 .IFFR .IF GT $$$T1-63 $$$T4=.+47 .IFTF .RAD50 /NAME/ .IFT.=$$$T4$ .ENDC .IIF LT $$$T1-4, .WORD 0O .ENDC .ENDM R50$$ŽW  .MACRO MOV$ ARG .IF NB . .IF DIF ,<#0>  MOV ARG,-(SP) .MEXITM .ENDC .ENDC CLR -(SP) .ENDM MOV$. W  .MACRO .BLKB. NUM,SYM,GBL .IF NB I .IF IDN ,SYM==$$$ .IFF,SYM=$$$> .ENDC .ENDC $$$=$$$+NUM .ENDM .BLKB.$¤W  .MACRO .BLKW. NUM,SYM,GBL .IF NB  .IF IDN ,SYM==$$$ .IFFTSYM=$$$. .ENDC .ENDC$$$=$$$+<2*NUM>$ .ENDM .BLKW..8W  .MACRO .BLK.$$$=0R .ENDM .BLK.tW  .MACRO LNMOD$ LM.USR=128. LT.USR=2. SD.LOG=3. SD.BYE=4. GD.LOG=5. SD.TI=6. .ENDMÊW  .MACRO AFF$CPA=1ACPB=2KCPC=4SCPD=10UBE=20UBF=40UBH=100<UBJ=200BUBK=400$UBL=1000UBM=2000UBN=4000 UBP=10000= UBR=20000. UBS=40000$ UBT=100000 .ENDM AFF$þW  .MACRO GFN$GI.GAS=0GI.UIC=1GI.DEF=2GI.FMK=3GI.QMC=4GI.UAB=5GI.DEV=6 GI.SPR=7.+ GI.REN=8.. GI.APR=9.. GI.TSK=10. GI.SPM=11. GI.CFG=12. GI.SSN=13. GI.ABO=14. GI.VEC=15. GI.MSD=16. GI.UPD=17. GI.DVJ=18. .ENDMŠW  .MACRO QIOSY$ $$$GBL,$$$MSG) .IIF IDN,<$$$GBL>,, .GLOBL QI.VERP .IF IDN,<$$$MSG>,0 $$$MAX=0B $$MSG=1 .IFFB $$MSG=0 .ENDC .MCALL IOERR$ IOERR$ $$$GBL .MCALL DRERR$ DRERR$ $$$GBL .IF DIF,<$$$MSG>, .MCALL FILIO$ FILIO$ $$$GBL .MCALL SPCIO$ SPCIO$ $$$GBL .MACRO QIOSY$ ARG,ARG1,ARG2 .ENDM QIOSY$7 .ENDC .ENDM QIOSY$9� W  .MACRO IOERR$ $$$GBLI .MCALL .IOER.,DEFIN$I .IF IDN,<$$$GBL>,D ...GBL=1J .IFF. ...GBL=0 .ENDC .IIF NDF,$$MSG,$$MSG=0, .IOER. IE.BAD,-01.$ .IOER. IE.IFC,-02.Q .IOER. IE.DNR,-03.M .IOER. IE.VER,-04.= .IOER. IE.ONP,-05. .IOER. IE.SPC,-06.C .IOER. IE.DNA,-07.$ .IOER. IE.DAA,-08. .IOER. IE.DUN,-09.D .IOER. IE.EOF,-10. .IOER. IE.EOV,-11.O .IOER. IE.WLK,-12.I .IOER. IE.DAO,-13.. .IOER. IE.SRE,-14., .IOER. IE.ABO,-15. .IOER. IE.PRI,-16.9 .IOER. IE.RSU,-17.. .IOER. IE.OVR,-18. .IOER. IE.BYT,-19.I .IOER. IE.BLK,-20.D .IOER. IE.MOD,-21.. .IOER. IE.CON,-22.N .IOER. IE.BBE,-56.$ .IOER. IE.STK,-58.D .IOER. IE.FHE,-59.C .IOER. IE.EOT,-62.R .IOER. IE.OFL,-65.R .IOER. IE.BCC,-66.P+ .IOER. IE.NFW,-69. ;-+ .IOER. IE.DIS,-69. ;9 .IOER. IE.PNT,-71.01 .IOER. IE.NDR,-72. ;O) .IOER. IE.TMO,-95. ;O .IOER. IE.CNR,-96.O .IOER. IE.MII,-99.O .IOER. IE.SPI,-100.5 .IOER. IE.FER,-101. ;- .IOER. IE.NOD,-23.- .IOER. IE.DFU,-24.- .IOER. IE.IFU,-25.- .IOER. IE.NSF,-26.- .IOER. IE.LCK,-27.- .IOER. IE.HFU,-28.- .IOER. IE.WAC,-29.- .IOER. IE.CKS,-30.- .IOER. IE.WAT,-00"8 1g31.- .IOER. IE.RER,-32.r .IOER. IE.WER,-33.S .IOER. IE.ALN,-34.p .IOER. IE.SNC,-35.P .IOER. IE.SQC,-36.N .IOER. IE.NLN,-37.s .IOER. IE.CLO,-38.O .IOER. IE.DUP,-57.e .IOER. IE.BVR,-63.O .IOER. IE.BHD,-64.O .IOER. IE.EXP,-75.O .IOER. IE.BTF,-76.O .IOER. IE.ALC,-84.r .IOER. IE.ULK,-85.t .IOER. IE.WCK,-86.D .IOER. IE.DSQ,-90.U: .IOER. IE.PIO,-104. ; .IOER. IE.NBF,-39.  .IOER. IE.RBG,-40.  .IOER. IE.NBK,-41.  .IOER. IE.ILL,-42.  .IOER. IE.BTP,-43.  .IOER. IE.RAC,-44.  .IOER. IE.RAT,-45.  .IOER. IE.RCN,-46.  .IOER. IE.2DV,-48.  .IOER. IE.FEX,-49.  .IOER. IE.BDR,-50.  .IOER. IE.RNM,-51.  .IOER. IE.BDI,-52.  .IOER. IE.FOP,-53.  .IOER. IE.BNM,-54.  .IOER. IE.BDV,-55.  .IOER. IE.NFI,-60.  .IOER. IE.ISQ,-61.  .IOER. IE.NNC,-77.  .IOER. IE.NNN,-68.  .IOER. IE.BLB,-70.  .IOER. IE.URJ,-73.s .IOER. IE.NRJ,-74.n .IOER. IE.NDA,-78.F .IOER. IE.IQU,-91.G .IOER. IE.RES,-92.K .IOER. IE.TML,-93.L .IOER. IE.NNT,-94.P .IOER. IE.UKN,-97.C= .IOER. IE.IRR,-102. ;2& .IOER. IE.SIU,-103. ; .IOER. IE.NLK,-79.  .IOER. IE.NST,-80.  .IOER. IE.FLN,-81.  .IOER. IE.IES,-82.  .IOER. IE.PES,-83.  .IOER. IE.ICE,-47.  .IOER. IE.ONL,-67.  .IOER. IE.SZE,-98.  .IOER. IE.NTR,-87.  .IOER. IE.REJ,-88.  .IOER. IE.FLG,-89.  DEFIN$ IS.PND,+00.  DEFIN$ IS.SUC,+01.  DEFIN$ IS.RDD,+02.  DEFIN$ IS.TNC,+02.  DEFIN$ IS.CHW,+04.  DEFIN$ IS.BV,+05. DEFIN$ IS.DAO,+02.R DEFIN$ IS.CR,<15*400+1> DEFIN$ IS.ESC,<33*400+1>e DEFIN$ IS.CC,<3*400+1> DEFIN$ IS.ESQ,<233*400+1> DEFIN$ IS.PES,<200*400+1> DEFIN$ IS.EOT,<4*400+1> DEFIN$ IS.TAB,<11*400+1>O DEFIN$ IS.TMO,+2. DEFIN$ IS.OOB,+3. DEFIN$ IS.TMM,+4.' DEFIN$ IS.RVI,+2. ; DATA SUCC. XMITTED8' DEFIN$ IS.CNV,+3. ; DATA SUCC. XMITTED- DEFIN$ IS.XPT,+5. DEFIN$ SB.KIL,-1. DEFIN$ SB.ACK,-2. DEFIN$ SB.NAK,-3. DEFIN$ SB.ENQ,-4. DEFIN$ SB.BOF,-5. DEFIN$ SB.TMO,-6. DEFIN$ SB.DIS,-7.+; THE NEXT AVAILABLE ERROR NUMBER IS: -105.;F .IF EQ,$$MSG4 .MACRO IOERR$ A .ENDM IOERR$ .ENDC .ENDM IOERR$+’W  .MACRO DRERR$ $$$GBLS .MCALL .QIOE.,DEFIN$  .IF IDN,<$$$GBL>, ...GBL=1 .IFF ...GBL=0 .ENDC .IIF NDF,$$MSG,$$MSG=0I3 .QIOE. IE.UPN,-01. ;  .QIOE. IE.INS,-02.N .QIOE. IE.PTS,-03.  .QIOE. IE.UNS,-04.B .QIOE. IE.ULN,-05.N .QIOE. IE.HWR,-06.Q .QIOE. IE.ACT,-07.- .QIOE. IE.ITS,-08.. .QIOE. IE.FIX,-09. .QIOE. IE.CKP,-10.E .QIOE. IE.TCH,-11. .QIOE. IE.RBS,-15. .QIOE. IE.PRI,-16.N .QIOE. IE.RSU,-17.. .QIOE. IE.NSW,-18. .QIOE. IE.ILV,-19.R .QIOE. IE.ITN,-20.Q .QIOE. IE.LNF,-21.N .QIOE. IE.AST,-80.. .QIOE. IE.MAP,-81.. .QIOE. IE.IOP,-83.  .QIOE. IE.ALG,-84.. .QIOE. IE.WOV,-85.n .QIOE. IE.NVR,-86.o .QIOE. IE.NVW,-87.S .QIOE. IE.ITP,-88.S .QIOE. IE.IBS,-89.S .QIOE. IE.LNL,-90.N .QIOE. IE.IUI,-91.R .QIOE. IE.IDU,-92.T .QIOE. IE.ITI,-93.S .QIOE. IE.PNS,-94.X .QIOE. IE.IPR,-95.P .QIOE. IE.ILU,-96.H .QIOE. IE.IEF,-97.S .QIOE. IE.ADP,-98.I .QIOE. IE.SDP,-99.U DEFIN$ IS.CLR,0 DEFIN$ IS.SET,2 DEFIN$ IS.SPD,2 DEFIN$ IS.SUP,3 DEFIN$ IS.WAT,4 .IF EQ,$$MSGE .MACRO DRERR$ A .ENDM DRERR$ .ENDC .ENDM DRERR$.úW  .MACRO FILIO$ $$$GBL .MCALL .WORD.,DEFIN$. .IF IDN,<$$$GBL>, ...GBL=1S .IFFE ...GBL=09 .ENDC .WORD. IQ.X,001,000 .WORD. IQ.Q,002,000 .WORD. IQ.S,004,000 .WORD. IQ.UMD,004,000 .WORD. IQ.LCK,200,000 .WORD. IO.KIL,012,000 .WORD. IO.RDN,022,000 .WORD. IO.UNL,042,000 .WORD. IO.LTK,050,000 .WORD. IO.RTK,060,000 .WORD. IO.SET,030,000 .WORD. IO.WLB,000,001 .WORD. IO.RLB,000,002 .WORD. IO.LOV,010,002 .WORD. IO.LDO,110,002 .WORD. IO.ATT,000,003 .WORD. IO.DET,000,004 .WORD. IO.FNA,000,011 .WORD. IO.RNA,000,013 .WORD. IO.ENA,000,014 .WORD. IO.CLN,000,007 .WORD. IO.ULK,000,012 .WORD. IO.ACR,000,015 .WORD. IO.ACW,000,016 .WORD. IO.ACE,000,017 .WORD. IO.DAC,000,020 .00"5TADATADATADATADATADATADATADATADATAWORD. IO.RVB,000,021 .WORD. IO.WVB,000,022 .WORD. IO.EXT,000,023 .WORD. IO.CRE,000,024 .WORD. IO.DEL,000,025 .WORD. IO.RAT,000,026 .WORD. IO.WAT,000,027 .WORD. IO.APV,010,030 .WORD. IO.APC,000,030 .MACRO FILIO$ A .ENDM FILIO$ .ENDM FILIO$0èW  .MACRO SPCIO$ $$$GBLO .MCALL .WORD.,DEFIN$O .IF IDN,<$$$GBL>,A ...GBL=1. .IFFO ...GBL=07 .ENDC .WORD. IO.WLV,100,001 .WORD. IO.WLS,010,001 .WORD. IO.WNS,020,001 .WORD. IO.WAL,010,001 .WORD. IO.WMS,020,001 .WORD. IO.CCO,040,001 .WORD. IO.WBT,100,001 .WORD. IO.WLT,010,001 .WORD. IO.WLC,020,001 .WORD. IO.WPB,040,001 .WORD. IO.WDD,140,001 .WORD. IO.RSN,140,002 .WORD. IO.RLV,100,002 .WORD. IO.RST,001,002 .WORD. IO.RAL,010,002 .WORD. IO.RNE,020,002 .WORD. IO.RNC,040,002 .WORD. IO.RTM,200,002 .WORD. IO.RDB,200,002 .WORD. IO.SCF,200,002 .WORD. IO.RHD,010,002 .WORD. IO.RNS,020,002 .WORD. IO.CRC,040,002 .WORD. IO.RPB,040,002 .WORD. IO.RDF,240,002 .WORD. IO.RLC,020,002 .WORD. IO.ATA,010,003 .WORD. IO.GTS,000,005 .WORD. IO.R1C,000,005 .WORD. IO.INL,000,005 .WORD. IO.TRM,010,005 .WORD. IO.RWD,000,005 .WORD. IO.SPB,020,005 .WORD. IO.RPL,020,005 .WORD. IO.SPF,040,005 .WORD. IO.STC,100,005 .WORD. IO.SMD,110,005 .WORD. IO.SEC,120,005 .WORD. IO.RWU,140,005 .WORD. IO.SMO,160,005 .WORD. IO.HNG,000,006 .WORD. IO.HLD,100,006 .WORD. IO.BRK,200,006 .WORD. IO.RBC,000,006 .WORD. IO.MOD,000,006 .WORD. IO.HDX,010,006 .WORD. IO.FDX,020,006 .WORD. IO.SYN,040,006 .WORD. IO.EOF,000,006 .WORD. IO.ERS,020,006 .WORD. IO.DSE,040,006 .WORD. IO.RTC,000,007 .WORD. IO.SAO,000,010 .WORD. IO.SSO,000,011 .WORD. IO.RPR,000,011 .WORD. IO.MSO,000,012 .WORD. IO.RTT,001,012 .WORD. IO.SLO,000,013 .WORD. IO.MLO,000,014 .WORD. IO.LED,000,024 .WORD. IO.SDO,000,025 .WORD. IO.SDI,000,026 .WORD. IO.SCS,000,026 .WORD. IO.REL,000,027 .WORD. IO.MCS,000,027 .WORD. IO.ADS,000,030 .WORD. IO.CCI,000,030 .WORD. IO.LOD,000,030 .WORD. IO.MDI,000,031 .WORD. IO.DCI,000,031 .WORD. IO.PAD,000,031 .WORD. HT.RPP,010,000 .WORD. IO.XMT,000,031 .WORD. IO.XNA,010,031 .WORD. IO.INI,000,031 .WORD. IO.HIS,000,032 .WORD. IO.RCI,000,032 .WORD. IO.RCV,000,032 .WORD. IO.CLK,000,032 .WORD. IO.CSR,000,032 .WORD. IO.MDO,000,033 .WORD. IO.CTI,000,033 .WORD. IO.CON,000,033 .WORD. IO.ORG,010,033 .WORD. IO.ANS,020,033 .WORD. IO.STA,000,033 .WORD. IO.DTI,000,034 .WORD. IO.DIS,000,034 .WORD. IO.MDA,000,034 .WORD. IO.DPT,010,034 .WORD. IO.RTI,000,035 .WORD. IO.CTL,000,035 .WORD. IO.STP,000,035 .WORD. IO.SWI,000,035 .WORD. IO.CNT,000,036 .WORD. IO.ITI,000,036 .WORD. IO.EIO,000,037;0; DISK VOLUME PROCESSING;) DEFIN$ VV$SET,1 ; SET/CLEAR VOLUME VALID0( DEFIN$ VV$UNL,2 ; LOAD/UNLOAD THE DRIVE" DEFIN$ VV$SIZ,-1 ; SIZE THE DRIVE .WORD. IO.RSD,030,014 .WORD. IO.WSD,010,013 DEFIN$ SD.TXT,0 DEFIN$ SD.GDS,1 .WORD. SB.PRT,020,003 .WORD. SB.CLR,010,036 .WORD. SB.RDY,010,033 .WORD. SB.NRD,020,033 .WORD. IO.LBK,000,035 .WORD. SB.CBL,010,035 .WORD. SB.CLK,020,035 .WORD. IO.CPR,010,033 .WORD. IO.CAS,020,033 .WORD. IO.CRJ,040,033 .WORD. IO.CBO,110,033 .WORD. IO.CTR,210,033 .WORD. IO.GNI,010,035 .WORD. IO.GLI,020,035 .WORD. IO.GLC,030,035 .WORD. IO.GRI,040,035 .WORD. IO.GRC,050,035 .WORD. IO.GRN,060,035 .WORD. IO.CSM,070,035 .WORD. IO.CIN,100,035 .WORD. IO.SPW,110,035 .WORD. IO.CPW,120,035 .WORD. IO.NLB,130,035 .WORD. IO.DLB,140,035 .WORD. IO.CTY,000,007 .WORD. IO.DTY,000,015 .WORD. IO.LDI,000,016 .WORD. IO.UDI,010,023 .WORD. IO.LTI,000,017 .WORD. IO.UTI,020,023 .WORD. IO.LTY,000,020 .WORD. IO.UTY,030,023 .WORD. IO.LKE,000,024 .WORD. IO.UER,040,023 .WORD. IO.NLK,000,023 .WORD. IO.ONL,000,037 .WORD. IO.FLN,000,025 .WORD. IO.RAD,000,021 .WORD. IO.MAO,010,007 .WORD. IO.LEI,010,017 .WORD. IO.RDD,010,020 .WORD. IO.RMT,020,020 .WORD. IO.LSI,000,022 .WORD. IO.UEI,050,023 .WORD. IO.USI,060,023 .WORD. IO.CSI,000,026 .WORD. IO.DSI,000,027 .00"8 1gWORD. IO.RAM,000,032 .WORD. IO.RLK,000,013 .WORD. IO.EBT,000,011 .WORD. IO.ATX,000,001 .WORD. IO.ATF,000,002 .WORD. IO.CRX,000,031 .WORD. IO.DRX,000,032 .WORD. IO.RTF,000,033 .MACRO SPCIO$ A .ENDM SPCIO$ .ENDM SPCIO$0\W  .MACRO UMDIO$ $$$GBLO .MCALL .WORD.,DEFIN$O .IF IDN <$$$GBL>,I...GBL=1 .IFF ...GBL=0 .ENDC .WORD. IQ.UMD,004,000 .WORD. IO.HMS,000,010 .WORD. IO.BLS,010,010 .WORD. IO.OFF,020,010 .WORD. IO.RDH,030,010 .WORD. IO.WDH,040,010 .WORD. IO.WCK,050,010 .WORD. IO.RNF,060,010 .WORD. IO.RNR,070,010 .WORD. IO.LPC,100,010 .WORD. IO.RTD,120,010 .WORD. IO.WTD,130,010 .WORD. IO.TDD,140,010 .WORD. IO.DGN,150,010 .WORD. IO.WPD,160,010 .WORD. IO.RPD,170,010 .WORD. IO.CER,200,010 .WORD. IO.CEW,210,010 .MACRO UMDIO$ A .ENDM .ENDM UMDIO$GŒW  .MACRO .IOER. SYM,LO,MSGD DEFIN$ SYM,LO .IF GT,$$MSGS .MCALL .IOMG. .IOMG. SYM,LO, .ENDC .ENDM .IOER.O”W  .MACRO .QIOE. SYM,LO,MSG. DEFIN$ SYM,LO .IF GT,$$MSGO .MCALL .IOMG. .IOMG. SYM,,  .ENDC .ENDM .QIOE. ¨W  .MACRO .IOMG. SYM,LO,MSGD .WORD -^O .ENABL LC .ASCIZ ^MSG^. .DSABL LC .EVEN' .IIF LT,^O<$$$MAX+>,$$$MAX=-^O2 .ENDM .IOMG. VW  .MACRO .WORD. SYM,LO,HI DEFIN$ SYM, .ENDM .WORD.IÈW  .MACRO SNPDF$ GBL .IF IDN ,7 .GLOBL SB.CTL,SB.DEV,SB.UNT,SB.EFN,SB.ID,SB.LM1,SB.PMD1 .GLOBL SC.HDR,SC.LUN,SC.OVL,SC.STK,SC.WRD,SC.BYTO .ENDC$ SB.CTL = 0 SB.DEV = 2 SB.UNT = 4#SB.DSW = 5 ;DIRECTIVE STATUS WORD SB.EFN = 6SB.ID = ^O<10>ISB.LM1 = ^O<12>SB.PMD = ^O<32>. SC.HDR = 1 SC.LUN = 2 SC.OVL = 4SC.STK = ^O<10>TSC.WRD = ^O<20>$SC.BYT = ^O<40>. .MACRO SNPDF$ X .ENDM .ENDM SNPDF$WÜW : .MACRO SNPBK$ DEV,UNIT,CTL,EFN,ID,L1,H1,L2,H2,L3,H3,L4,H4 .IF DF ..SPBK .IIF NE <..SPBK-.>, .MEXITL .ENDC .MCALL SNPDF$ SNPDF$B..SPBK::.WORD CTL .ASCII /DEV/S .IF NE .-<..SPBK+SB.DEV+2>.% .ERROR ;INVALID DEVICE NAME ''DEV''2 .MEXIT= .ENDC: .BYTE UNIT,0 ;DEVICE UNIT NUMBER & DIRECTIVE STATUS WORD .WORD EFN ;EVENT FLAG NUMBER .WORD IDH .WORD L1,H1 .WORD L2,H2 .WORD L3,H3 .WORD L4,H4 .RAD50 /PMD.../ .ENDM SNPBK$A–W < .MACRO SNAP$ CTL,EFN,ID,L1,H1,L2,H2,L3,H3,L4,H4,?LBL1,?LBL2* .MCALL SNPDF$,WTSE$S,SDAT$S,RQST$S,CLEF$S SNPDF$.% .IIF NB , MOV CTL,..SPBK+SB.CTLC% .IIF NB , MOV EFN,..SPBK+SB.EFN" .IIF NB , MOV ID,..SPBK+SB.IDC MOVB @#$DSW,..SPBK+SB.DSW ;MOVE REQUESTING TASK'S DSW TO SNAP BLOC...SNP = SB.LM1E! .IRP X, .IF NB E MOV X,..SPBK+...SNP .ENDC...SNP = ...SNP+2 .ENDM CLEF$S ..SPBK+SB.EFNO BCS LBL2. SDAT$S #..SPBK+SB.PMD,#..SPBK BCS LBL2 RQST$S #..SPBK+SB.PMD BCC LBL11 CMP #IE.ACT,@#$DSWB BEQ LBL1. SEC BR LBL2LBL1: WTSE$S ..SPBK+SB.EFNLBL2: .ENDM SNAP$–W  .MACRO ISTAT$ STTBL,KEYTBL,DEBUG .MCALL MTRAN$ .IF DF $RONLY .PSECT $STATE,D,ROV .IFFW .PSECT $STATE,D .ENDCSTTBL::K .IF DF $RONLY .PSECT $KTAB,D,RO .IFFR .PSECT $KTAB,DL .ENDCKEYTBL:: .IF DF $RONLY .PSECT $KSTR,D,RO .IFFS .PSECT $KSTR,D. .ENDC .IF IDN ,<$DEBUG>L .MACRO DBGTP$ .LIST .=. .NLISTL .ENDM .IFFS .MACRO DBGTP$ .ENDM .ENDC $$$KEY = -1 $$$FLG = -1 $EXIT = 0 $LAMDA = 300. $NUMBR = 302B $STRNG = 304A $BLANK = 306 $SUBXP = 310T $EOS = 312L $DNUMB = 314 $RAD50 = 316 $ANY = 320 $ALPHA = 322. $DIGIT = 324S .PSECT. .ENDM ISTAT$žW .MACRO STATE$ LABEL. .PSECT $STATE $$$FLG = $$$FLG!200 MTRAN$D .IF NB LABELCLABEL: .ENDC $$$FLG = -1 .PSECT .ENDM STATE$œW (.MACRO TRAN$ TYPE,LABEL,ACTION,MASK,ADDR .PSECT $STATE MTRAN$. DBGTP$T .IF NB ACTION $$$FLG = $$$FLG!2 .MACRO $$$ACT .WORD ACTION .ENDM $$$ACT  .ENDC .IF NB MASK $$$FLG = $$$FLG!30U .IF B ADDR$" .ERROR "MASK ADDRESS NOT PRESENT" .ENDC .MACRO $$$BIT00"5TADATADATADATADATADATADATADATADATA .WORD MASK,ADDR .ENDM $$$BIT .ENDC .IF NB LABEL $$$FLG = $$$FLG!4 $$$STA = LABEL. .ENDC .IRPC $$$$$X, .IF IDN <$$$$$X>,<">F .PSECT $KSTRE $$$TMP = .$ .ASCII TYPE<377> .PSECT $KTAB .WORD $$$TMP .MACRO $$$TYP .BYTE $$$KEY!200S .ENDM $$$TYP  $$$KEY = $$$KEY+1 .IF GT $$$KEY-63. .ERROR "TOO MANY KEYWORDS"R .ENDC .MEXITA .ENDC .IF IDN <$$$$$X>, $$$FLG = $$$FLG!1 .MACRO $$$EXT .WORD 0'TYPE. .ENDM $$$EXTR .MACRO $$$TYP .BYTE $SUBXPR .ENDM $$$TYPD .MEXITR .ENDC .MACRO $$$TYP .BYTE TYPEE .ENDM $$$TYP$ .MEXIT$ .ENDM .PSECT. .ENDM TRAN$$xW  .MACRO MTRAN$" .PSECT $STATE .IF EQ $$$FLG+1 $$$FLG = 03 .MEXITS .ENDC $$$TYPD .BYTE $$$FLGR .IF NE $$$FLG&1 $$$EXTS .ENDC .IF NE $$$FLG&2 $$$ACT1 .ENDC .IF NE $$$FLG&10O $$$BITN .ENDC .IF NE $$$FLG&4 .WORD $$$STA. .IFF< .IF EQ $$$FLG&200 .ERROR "BAD DEFAULT TRANSITION" .ENDC .ENDC $$$FLG = 0. .ENDM MTRAN$ÆW  .MACRO TTSYM$ $$$GBL .MCALL DEFIN$ ...GBL=0Y .IF IDN,<$$$GBL>,. ...GBL=1N .ENDC DEFIN$ TC.WID,1. DEFIN$ TC.LPP,2.M DEFIN$ TC.RSP,3.C DEFIN$ TC.XSP,4.$ DEFIN$ TC.STB,5.3 DEFIN$ TC.ISL,6. DEFIN$ TC.RAT,7.$ DEFIN$ TC.TTP,8.G DEFIN$ TC.SCR,9.C DEFIN$ TC.SCP,10. DEFIN$ TC.HFL,11. DEFIN$ TC.VFL,12. DEFIN$ TC.NL ,13. DEFIN$ TC.SFF,14. DEFIN$ TC.HFF,15. DEFIN$ TC.LVF,16. DEFIN$ TC.HHT,17. DEFIN$ TC.NST,18. DEFIN$ TC.BSP,19. DEFIN$ TC.ACR,20. DEFIN$ TC.SMR,21. DEFIN$ TC.SMP,22. DEFIN$ TC.SMO,23. DEFIN$ TC.CCF,24. DEFIN$ TC.ALT,25. DEFIN$ TC.IMG,26. DEFIN$ TC.NKB,27. DEFIN$ TC.NPR,28. DEFIN$ TC.ESQ,29. DEFIN$ TC.LCP,30. DEFIN$ TC.PAR,31. DEFIN$ TC.EPA,32. DEFIN$ TC.DLU,33. DEFIN$ TC.BLK,34. DEFIN$ TC.FRM,35. DEFIN$ TC.HLD,36. DEFIN$ TC.TAP,37. DEFIN$ TC.CEQ,38. DEFIN$ TC.NEC,39. DEFIN$ TC.SLV,40. DEFIN$ TC.PRI,41. DEFIN$ TC.UC0,42. DEFIN$ TC.UC1,43. DEFIN$ TC.UC2,44. DEFIN$ TC.UC3,45. DEFIN$ TC.UC4,46. DEFIN$ TC.UC5,47. DEFIN$ TC.UC6,48. DEFIN$ TC.UC7,49. DEFIN$ TC.UC8,50. DEFIN$ TC.UC9,51. DEFIN$ TC.FDX,52. DEFIN$ TC.BIN,53. DEFIN$ TC.REM,54. DEFIN$ TC.8BC,55. DEFIN$ TC.P8B,56. DEFIN$ TC.TBF,57. DEFIN$ TC.CTS,58. DEFIN$ TC.ANS,59. DEFIN$ TC.CSQ,60. DEFIN$ TC.CTC,61. DEFIN$ TC.ASP,62. DEFIN$ TC.ABD,63. DEFIN$ TC.TBS,64. DEFIN$ TC.TBM,65. DEFIN$ TC.NBR,66. DEFIN$ TC.ACD,67. DEFIN$ TC.ARC,68. DEFIN$ TC.TRN,69. DEFIN$ TC.XMM,70. DEFIN$ TC.FSZ,71. DEFIN$ XT.DLM,72. DEFIN$ XT.DMD,73. DEFIN$ XT.DTT,74. DEFIN$ XT.DIT,75. DEFIN$ XT.MTP,76. DEFIN$ XT.SDE,77. DEFIN$ XT.TAK,78. DEFIN$ XT.GOV,79. DEFIN$ XT.TSP,80. DEFIN$ XT.TTO,81. DEFIN$ TC.ANI,82. DEFIN$ TC.AVO,83. DEFIN$ TC.DEC,84. DEFIN$ TC.EDT,85. DEFIN$ TC.RGS,86. DEFIN$ TC.INT,87. DEFIN$ TC.TLC,88. DEFIN$ TC.SFC,89. DEFIN$ TC.HSY,90. DEFIN$ XT.TIM,91. DEFIN$ XT.CPD,92. DEFIN$ XT.VER,93. DEFIN$ XT.REV,94. DEFIN$ XT.THS,95. DEFIN$ TC.OOB,96. DEFIN$ TC.ICS,97. DEFIN$ TC.SSC,98. DEFIN$ TC.TMM,99. DEFIN$ TC.TSY,100.  DEFIN$ TC.MHU,101.T DEFIN$ TC.PTH,102.S DEFIN$ TC.PPT,103.K: DEFIN$ TC.SXL,104. ; PRINTER SUPPORTS SIXEL GRAPHICS> DEFIN$ TC.CLC,105. ; ^C AST NOTIFICATION FOR UNATTATCHED TASK, DEFIN$ TC.CLN,106. ; 7-BIT CHARACTER LENGTH? DEFIN$ TC.QDP,107. ; CONNECT/DISCONNECT/QUEUE DEPTH (GET ONLY)C! DEFIN$ TC.MAP,108. ; LAT MAPPINGND DEFIN$ TC.MAX,109. ;++286 THIS MUST BE ONE GREATER THAN THE HIGHEST ; VALUE USED FOR A SYMBOL  DEFIN$ SE.ICN,1.  DEFIN$ SE.FIX,2.  DEFIN$ SE.BIN,3.  DEFIN$ SE.VAL,4.N DEFIN$ SE.TER,5.F DEFIN$ SE.SPD,6.D DEFIN$ SE.SPL,7. DEFIN$ SE.PAR,8.  DEFIN$ SE.LPR,9.O DEFIN$ SE.NSC,10. DEFIN$ SE.UPN,11. DEFIN$ SE.NIH,12.=; DEFIN$ SE.ATA,13. ; TERMINAL ATTACHED WITH AST NOTIFICATIONE* DEFIN$ SE.NAT,14. ; TERMINAL NOT ATTACHED DEFIN$ SE.IAA,15. DEFIN$ SF.SSC, 2400!020 DEFIN$ SF.SMC, 2400!040 DEFIN$ SF.RDF, 2400!060 DEFIN$ SF.STT, 2400!100 DEFIN$ SF.STS, 2400!120 DEFIN$ SF.GSC, 2400!140 DEFIN$ 00"'8 1gSF.GMC, 2400!160 DEFIN$ SF.GAC, 2400!200 DEFIN$ SF.SAC, 2400!220 DEFIN$ SF.DEF, 010E DEFIN$ S.0 ,1.E DEFIN$ S.50 ,2.E DEFIN$ S.75 ,3.E DEFIN$ S.100 ,4.E DEFIN$ S.110 ,5.E DEFIN$ S.134 ,6.E DEFIN$ S.150 ,7.S DEFIN$ S.200 ,8.L DEFIN$ S.300 ,9.N DEFIN$ S.600 ,10. DEFIN$ S.1200,11. DEFIN$ S.1800,12. DEFIN$ S.2000,13. DEFIN$ S.2400,14. DEFIN$ S.3600,15. DEFIN$ S.4800,16. DEFIN$ S.7200,17. DEFIN$ S.9600,18. DEFIN$ S.EXTA,19. DEFIN$ S.EXTB,20. DEFIN$ S.19.2,21. DEFIN$ S.38.4,22. DEFIN$ T.UNK0,0.0 DEFIN$ T.AS33,1.C DEFIN$ T.KS33,2.  DEFIN$ T.AS35,3.N DEFIN$ T.L30S,4.N DEFIN$ T.L30P,5.N DEFIN$ T.LA36,6.N DEFIN$ T.VT05,7.N DEFIN$ T.VT50,8.N DEFIN$ T.VT52,9.N DEFIN$ T.VT55,10. DEFIN$ T.VT61,11. DEFIN$ T.L180,12. DEFIN$ T.V100,13. DEFIN$ T.L120,14. DEFIN$ T.SCR0,15. DEFIN$ T.LA12,16. DEFIN$ T.L100,17. DEFIN$ T.LA34,18. DEFIN$ T.LA38,19. DEFIN$ T.V101,20. DEFIN$ T.V102,21. DEFIN$ T.V105,22. DEFIN$ T.V125,23. DEFIN$ T.V131,24. DEFIN$ T.V132,25. DEFIN$ T.LA50,26. DEFIN$ T.LQP1,27. DEFIN$ T.LQP2,28. DEFIN$ T.BMP1,29. DEFIN$ T.V2XX,30. DEFIN$ T.LN03,31. DEFIN$ T.DTC1,32. DEFIN$ T.L210,33. DEFIN$ T.LQP3,34. DEFIN$ T.LA75,35. ; LA75& DEFIN$ T.L2XX,36. ; LA200 SERIES/ DEFIN$ T.LCG1,37. ;++100 LCG01 GRAPICS PRINTER  DEFIN$ T.USR0,128.. DEFIN$ T.USR1,T.USR0+11 DEFIN$ T.USR2,T.USR1+1D DEFIN$ T.USR3,T.USR2+1  DEFIN$ T.USR4,T.USR3+12 DEFIN$ XT.DIA,0 DEFIN$ XT.DTM,1 DEFIN$ XT.D20,2 DEFIN$ XT.OHS,3 DEFIN$ XT.VOI,0 DEFIN$ XT.SER,1 DEFIN$ XT.ENC,2 DEFIN$ XT.DTD,3 DEFIN$ XTM.NO,-1. DEFIN$ XTM.FS,0 DEFIN$ XTM.PS,1 DEFIN$ XTM.21,5 DEFIN$ XTM.M1,6 DEFIN$ XTM.M2,7 DEFIN$ XTM.US,10  DEFIN$ XTU.UI,0 DEFIN$ XTU.CD,2 DEFIN$ XTU.CL,4 DEFIN$ XTU.DR,6 DEFIN$ XTU.OF,8.C DEFIN$ XTU.ON,10. DEFIN$ XTU.RI,12. DEFIN$ XTU.TU,14. DEFIN$ XTU.TD,16. DEFIN$ XTC.DT,1 DEFIN$ XTC.EN,2 DEFIN$ XTC.SE,4 DEFIN$ XTC.VO,10N DEFIN$ F1.ACR,000001D DEFIN$ F1.BTW,000002 DEFIN$ F1.BUF,000004N DEFIN$ F1.UIA,000010S DEFIN$ F1.CCO,000020 DEFIN$ F1.ESQ,000040N DEFIN$ F1.HLD,000100T DEFIN$ F1.LWC,0002001 DEFIN$ F1.RNE,000400F DEFIN$ F1.RPR,001000T DEFIN$ F1.RST,0020001 DEFIN$ F1.RUB,004000D DEFIN$ F1.SYN,010000  DEFIN$ F1.TRW,020000R DEFIN$ F1.UTB,040000 DEFIN$ F1.VBF,100000F DEFIN$ F2.SCH,000001  DEFIN$ F2.GCH,000002. DEFIN$ F2.DCH,0000041 DEFIN$ F2.DKL,000010F DEFIN$ F2.ALT,000020T DEFIN$ F2.SFF,000040R DEFIN$ F2.CUP,000100W DEFIN$ F2.FDX,000200F DEFIN$ F2.EIO,000400A DEFIN$ F2.NCT,001000O DEFIN$ TF.RST,001 DEFIN$ TF.BIN,002 DEFIN$ TF.RAL,010 DEFIN$ TF.RNE,020 DEFIN$ TF.XOF,100 DEFIN$ TF.TMO,200 DEFIN$ TF.RCU,001 DEFIN$ TF.WAL,010 DEFIN$ TF.WMS,020 DEFIN$ TF.CCO,040 DEFIN$ TF.WBT,100 DEFIN$ TF.SYN,200 DEFIN$ TF.XCC,001 DEFIN$ TF.NOT,002 DEFIN$ TF.AST,010 DEFIN$ TF.ESQ,020 DEFIN$ TF.UCH,TF.NOT1 DEFIN$ TF.WLB,001 DEFIN$ TF.RLB,002 DEFIN$ TF.WIR,200 DEFIN$ TF.RTT,400 DEFIN$ TF.RLU,1000F DEFIN$ TF.RPR,2000D DEFIN$ TF.RPT,4000 DEFIN$ TF.RES,10000 DEFIN$ TF.RNF,20000 DEFIN$ TF.TNE,40000 DEFIN$ TF.RDI,100000N .MACRO TTSYM$ NULL  .ENDM .ENDM TTSYM$TW  .MACRO FHDOF$ GLOBALL .MCALL FHDO1$ ...GBL=0D .IF B,GLOBAL0 FHDO1$ DEF$LT .IFFD .IF IDN,,F ...GBL=1D .ENDC FHDO1$ GLOBAL .ENDC .IF DIF,,D .MACRO FHDOF$ ARG1 .ENDM FHDOF$0 .ENDC .ENDM FHDOF$‚W  .MACRO FHDO1$ OFFSETD .MCALL DEF$I,OFFSET,DEFIN$F DEF$I 0 OFFSET H.IDOF,1 OFFSET H.MPOF,1 OFFSET H.FNUM,2 OFFSET H.FSEQ,2 OFFSET H.FLEV,2 OFFSET H.FOWN OFFSET H.PROG,1 OFFSET H.PROJ,1 OFFSET H.FPRO,2 DEFIN$ FP.RDV,1 DEFIN$ FP.WRV,2 DEFIN$ FP.EXT,4 DEFIN$ FP.DEL,10F OFFSET H.FCHA OFFSET H.UCHA,1 DEFIN$ UC.CON,200 DEFIN$ UC.DLK,100 DEFIN$ UC.CNB,40L DEFIN$ UC.WCK,20D DEFIN$ UC.RCK,10D DEFIN$ UC.WBC,4 DEFIN$ UC.NIB,2 OFFSET H.SCHA,1 DEFIN$ SC.MDL,200 DEFIN$ SC.BAD,100 DEFIN$ SC.DIR,40  DEFIN$ SC00"/5TADATADATADATADATADATADATADATADATA.SPL,20F OFFSET H.UFAT,32. OFFSET S.HDHD DEF$I 0 OFFSET I.FNAM,6 OFFSET I.FTYP,2 OFFSET I.FVER,2 OFFSET I.RVNO,2 OFFSET I.RVDT,7 OFFSET I.RVTI,6 OFFSET I.CRDT,7 OFFSET I.CRTI,6 OFFSET I.EXDT,7 OFFSET ,1 OFFSET S.IDHD DEFIN$ I.DASZ,7 DEFIN$ I.TISZ,6 DEF$I 0 OFFSET M.ESQN,1 OFFSET M.ERVN,1 OFFSET M.EFNU,2 OFFSET M.EFSQ,2 OFFSET M.CTSZ,1 OFFSET M.LBSZ,1 OFFSET M.USE,1C OFFSET M.MAX,1. OFFSET M.RTRV OFFSET S.MPHD DEFIN$ H.CKSM,510.N .IF DIF,,L .MACRO FHDO1$ ARG13 .ENDM FHDO1$D .ENDC .ENDM FHDO1$.W  .MACRO HMBOF$ GLOBAL2 .MCALL HMBO1$ ...GBL=0 .IF B,GLOBALE HMBO1$ DEF$LF .IFFR .IF IDN,,F ...GBL=17 .ENDC HMBO1$ GLOBAL .ENDC .IF DIF,,I .MACRO HMBOF$ ARG1E .ENDM HMBOF$F .ENDC .ENDM HMBOF$.¶W  .MACRO HMBO1$ OFFSET1 .MCALL DEF$I,OFFSET,DEFIN$. DEF$I 0 OFFSET H.IBSZ,2 OFFSET H.IBLB,4 OFFSET H.FMAX,2 OFFSET H.SBCL,2 OFFSET H.DVTY,2 OFFSET H.VLEV,2 OFFSET H.VNAM,12. OFFSET ,4 OFFSET H.VOWN,2 OFFSET H.VPRO,2 OFFSET H.VCHA,2 DEFIN$ CH.SDI,400 OFFSET H.DFPR,2 OFFSET ,6 OFFSET H.WISZ,1 OFFSET H.FIEX,1 OFFSET H.LRUC,1 OFFSET H.REVD,7 OFFSET H.REVC,2 OFFSET ,2 OFFSET H.CHK1,2 OFFSET H.VDAT,14. OFFSET ,382.H OFFSET H.PKSR,4 OFFSET ,12. OFFSET H.INDN,12. OFFSET H.INDO,12. OFFSET H.INDF,12. OFFSET ,2 OFFSET H.CHK2,2 .IF DIF,, .MACRO HMBO1$ ARG1F .ENDM HMBO1$O .ENDC .ENDM HMBO1$ úW  .MACRO CSI$1 CSBLK,BUFF,LEN .GLOBL .CSI1F .MCALL CSI$,LDR0$ .IF NDF C.SIZEN CSI$I .ENDC LDR0$ CSBLK .IF NB  MOV BUFF,C.CMLD+2(R0) .ENDC .IF NB C MOV LEN,C.CMLD(R0) .ENDC JSR PC,.CSI1E .ENDM‚W  .MACRO CSI$2 CSBLK,IO,SWTAB .GLOBL .CSI2K .MCALL CSI$,LDR0$ .IF NDF C.SIZE. CSI$E .ENDC LDR0$ CSBLK .IF NB  .IF IDN ,2 MOVB #CS.INP,(R0) .IFFN .IF IDN , MOVB #CS.OUT,(R0) .IFF.# .ERROR ;INCORRECT REQUEST TO .CSI2R .ENDC .ENDC .ENDC .IF NB . MOV SWTAB,C.SWAD(R0)N .ENDC JSR PC,.CSI2N .ENDMúW # .MACRO CSI$4 CSBLK,IO,SWTAB,DSCBLKC .GLOBL .CSI4C .MCALL CSI$,LDR0$ .IF NDF C.SIZEP CSI$E .ENDC LDR0$ CSBLK .IF NB  .IF IDN ,. MOVB #CS.INP,(R0) .IFFL .IF IDN , MOVB #CS.OUT,(R0) .IFFK .ERROR  .ENDC .ENDC .ENDC .IF NB N MOV SWTAB,C.SWAD(R0)N .ENDC MOV R1,-(SP)C .IF NB  MOV DSCBLK,R1 .IFFQ CLR R1C .ENDC MOV R2,-(SP). MOV #.FSR5,R2 JSR PC,.CSI4T MOV (SP)+,R2 MOV (SP)+,R1, .ENDMVW , .MACRO CSI$SW SW,MK,MKW,CLR,NEGS,VALTAB,LNG .IF B,SWI .ERROR ;MISSING SWITCH NAME .IFFZ .EVEN .NCHR SIZ$$,SW$ .IF GT,SIZ$$-2I .IF B,LNG SIZ$$=2 .ENDC .ENDC CNT$$=0 .IRPC CHR$$$,SW CHR$$=''CHR$$$V CNT$$=CNT$$+1 .IF GE,>. .IF LE,>B CHR$$=CHR$$-^O40A .ENDC .ENDC .IF LE,CNT$$-SIZ$$N $$=0L .IF NB,LNGL .IF IDN,, .IF GT,CNT$$&1( .IF GE,CNT$$+1-SIZ$$J $$=^O200T .ENDC .IFF .IF LT,CNT$$-SIZ$$N $$=^O200 .ENDC .ENDC .IFFW .IF IDN,,T .IF EQ,CNT$$&1I .IF LT,CNT$$-SIZ$$I $$=^O200. .ENDC .ENDC .IFFZ- .ERROR ;ILLEGAL "LONG" OR "EXACT" SPECIFIER .ENDC .ENDC .ENDC .BYTE CHR$$!$$W .ENDC .ENDM .EVEN .ENDC .IF NB MK .WORD MK^ .IFF .WORD 0 .ENDC$$=0 .IF NB CLRR .IF IDN ,$$=1 .IFF$ .IF IDN , .IFFL .ERROR ;INVALID SET/CLEAR SPEC, .ENDC .ENDC .ENDC .WORD MKW+$$O$$=0 .IF NB NEGS .IF IDN ,$$=1 .IFF. .ERROR ;INVALID NEGATE SPEC .ENDC .ENDC .WORD VALTAB+$$ .ENDM4W  .MACRO CSI$ND .WORD 0 .ENDM$W # .MACRO CSI$SV TYPE,ADDR,LEN,VALTAB. .IF NB VALTABVALTAB:$ .ENDC .IF NB TYPE .IF IDN ,K .BYTE 1 .IFFF .IF IDN , .BYTE 2 .IFFF .IF IDN , .BYTE 2 .IFF< .IF IDN00"7"8 1g ,  .BYTE 3 .IFFR .ERROR ;INVALID CONVERSION TYPE .ENDC .ENDC .ENDC .ENDC .IFFI .BYTE 1 .ENDC .IF NB LEN .BYTE LEN .IFFG .ERROR ;LENGTH MISSING .BYTE 0 .ENDC .IF NB ADDR .WORD ADDR. .IFFS .ERROR ;VALUE ADDRESS MISSING .WORD 0 .ENDC .ENDM|W  .MACRO LDR0$ ARG .IIF B,ARG,.MEXIT .NTYPE PAR$$$,ARG .IIF EQ,PAR$$$,.MEXIT MOV ARG,R0. .ENDMÀW  .MACRO CSI$ GBL .IF IDN ,E.GLOBL C.TYPR,C.STAT,C.CMLD,C.DEVD,C.DIRD,C.FILD,C.SWAD,C.MKW1,C.MKW2OL.GLOBL C.SIZE,C.DSDS,CS.INP,CS.OUT,C.IDVL,C.IDVA,C.IDIL,C.IDIA,C.ODVL,C.EXPS7.GLOBL CS.NMF,CS.DIF,CS.DVF,CS.WLD,CS.MOR,CS.EQU,CS.LOG  .ENDC C.TYPR =0 C.STAT =1F C.CMLD =2. C.DEVD =6C.DIRD =^O<12>C.FILD =^O<16>C.SWAD =^O<22>C.MKW1 =^O<24>C.MKW2 =^O<26>C.IDVL =^O<30>C.IDVA =^O<32>C.IDIL =^O<34>C.IDIA =^O<36>C.ODVL =^O<40>C.EXPS =^O<60>RC.SIZE =^O<54>C.DSDS =C.DEVD CS.INP =1G CS.OUT =2N CS.NMF =1$ CS.DIF =2C CS.DVF =4TCS.WLD =^O<10>CS.MOR =^O<20>CS.EQU =^O<40>CS.LOG =^O<100>, .MACRO CSI$ X .ENDM CSI$. .ENDM CSI$.LW @ .MACRO GCMLB$ MAXD,PRMPT,UBUF,LUN,PDL,SIZE=80.,?PDL1,?DFNB,?BUF1 .MCALL FDBDF$,FDAT$A,FDOP$A,NMBLK$,FDBF$A,CBYTE$. FDBDF$1 FDAT$A 2= .IF NB = FDOP$A LUN,,DFNB2 .IFFK FDOP$A 1,,DFNBL .ENDC FDBF$A ,,13% CBYTE$ ,F.RCTLD .MCALL GCMLD$ GCMLD$0 .BYTE 0 .IF LE " .BYTE GE.COM!GE.IND!GE.CLO!GE.SIZ .IFFS) .BYTE GE.COM!GE.IND!GE.CLO!GE.CON!GE.SIZR .ENDC .BLKW 4 .BYTE -1,MAXD .IF B .WORD PDL1. .IFFI .WORD PDL .ENDC .IF NB .WORD UBUF$ .IFFR .WORD BUF .ENDC$$$=.P .ASCII <15><12> .IF NB $ .ASCII /PRMPT>/ .IFFY .ASCII / >/ .ENDC.=$$$+6NDFNB: NMBLK$ CMI,CMD .WORD SIZEKG.LPDL=*<6+<5*2>> .IF B PDL1: .BLKB G.LPDL .ENDC .IF B CBUF: .BLKB SIZE+2. .ENDC .ENDM GCMLB$Z W  .MACRO GCML$ NAME,ADPR,LNPR .MCALL GCMLD$,LDR0$ GCMLD$ DEF$LN LDR0$ NAMEN .IF NB  MOV LNPR,G.PSDS(R0) .IIF B , .ERROR& .IIF NB , MOV ADPR,G.PSDS+2(R0) .ENDC .IIF B , CLR G.PSDS(R0) .GLOBL .GCML1 JSR PC,.GCML1 .ENDM GCML$rW  .MACRO RCML$ NAME .MCALL LDR0$$ LDR0$ NAMEM .GLOBL .GCML2 JSR PC,.GCML2 .ENDM RCML$pW  .MACRO CCML$ BLK. .MCALL LDR0$. LDR0$ BLK .GLOBL .GCML3 JSR PC,.GCML3 .ENDM CCML$ W  .MACRO GCMLD$ GBL .IF NDF S.FDB .MCALL FDBSZ$ FDBSZ$E .ENDC .MCALL GCML$D GCML$D GBLM .MACRO GCMLD$ X .ENDM .ENDM GCMLD$RNW  .MACRO GCML$D GBL .IF IDN ,7 .GLOBL G.ERR,G.MODE,G.PSDS,G.CMLD,G.RBUF,G.DPRM,G.SIZEM0 .GLOBL GE.COM,GE.IND,GE.CLO,GE.LC,GE.CON,GE.SIZ1 .GLOBL GE.IOR,GE.OPR,GE.BIF,GE.MDE,GE.EOF,GE.RBGG .ENDC G.ERR = S.FDBG.MODE = G.ERR+1G.PSDS = G.ERR+2G.CMLD = G.ERR+6G.RBUF = G.ERR+14. G.ISIZ = 16.G.DPRM = G.ERR+G.ISIZG.SIZE = G.DPRM+6+S.FNBL GE.COM = 1 GE.IND = 2 GE.CLO = 4 GE.LC = 10 GE.CON = 20C GE.SIZ = 40G GE.IOR = -1. GE.OPR = -2X GE.BIF = -3N GE.MDE = -4 GE.EOF = -10. GE.RBG = -40.G .MACRO GCML$D X .ENDM .ENDM GCML$D,ÜW . .MACRO PRINT$ FDB,ERR,?LBL,A,B,C,D,E,F,?LBL2 .MCALL CALL,CLOSE$,LDR0$,GLUN$S% LDR0$ FDB ;LOAD FDB ADDRESS INTO R0. TST F.BDB(R0) BEQ LBL MOV R1,-(SP)E MOV R2,-(SP)G MOV R3,-(SP)=/ MOV SP,R1 ;SAVE POINTER TO END OF SEND BUFFERM/ SUB #<8.*2>,SP ;ALLOCATE A GET LUN INFO BUFFERM MOV SP,R2 MOVB F.LUN(R0),R3 GLUN$S R3,R2N% MOV G.LUCW(R2),R3 ;SAVE CHAR. WORD 1O MOV R0,R2 ;COPY FDB ADDRESS=4 ADD #F.FNB+N.DID+6,R2 ;POINT TO END OF DIRECTORY ID$ MOV -(R2),-(R1) ; PUSH DIRECTORY ID MOV -(R2),-(R1) ; MOV -(R2),-(R1) ;/ ADD #N.FID+6-N.DID,R2 ;POINT TO END OF FILE IDL MOV -(R2),-(R1) ;PUSH FILE ID MOV -(R2),-(R1) ; MOV -(R2),-(R1) ;' CLRB -(R1) ;CLEAR LUN INFO FLAGS BYTEM@ ADD #N.FVER+2-N.FID,R2 ;POINT TO END OF FILENAME, TYPE, VERSION* MOV -(R2),-(SP) ;PUSH FILE VERSION NUMBER MOV -(R2),-(SP) ;00"?5TADATADATADATADATADATADATADATADATAPUSH FILE TYPE MOV -(R2),-(SP) ;PUSH FILENAMEW MOV -(R2),-(SP) ; MOV -(R2),-(SP) ;' MOV SP,R1 ;SET POINTER TO SEND BUFFERI CLOSE$ R0 ;CLOSE FILER BCS LBL2I: BIT #FD.REC!FD.OSP,R3 ;RECORD ORIENTED OR SPOOLED DEVICE? BNE LBL2 ;IF NE YESO MOV R0,R2 ;SAVE FDB ADDRESSR# MOV #^RPRT,R0 ;GET "PRT" IN RAD-50, CALL $DSPAT ;SEND DATA TO ...PRT OR PRT...$ MOV R0,F.ERR(R2) ;GET RETURN STATUS MOV R2,R0 ;RESTORE FDB ADDRESSLBL2: ROR R1 ;SAVE CARRY; ADD #<13.*2>,SP ;CLEAN STACK- ROL R1 ;RESTORE CARRYE MOV (SP)+,R3S MOV (SP)+,R2M MOV (SP)+,R1- .IF NB ERR- BCC LBL CALL ERR, .ENDCLBL: .ENDM PRINT$EôW  .MACRO COMDF$ DEF .NLIST# .IF IDN ,8.GLOBL B.OT,B.UN,B.RC,B.RN,B.RP,B.RU,B.NA,B.UA,B.MN,B.MX.GLOBL CT.IN,CT.CN,LB.N,LB.E.GLOBL NT.IN,NT.NS.GLOBL CR.UR,CR.NR,CR.MXD.GLOBL CR.N0,CR.N1,CR.N2,CR.N3,CR.N4,CR.N5,CR.N6,CR.N9,CR.N10,CR.N11.GLOBL CR.N7,CR.N8.GLOBL CR.DI,CR.DT,CR.DA".GLOBL IA.ISM,IA.ABO,IA.DIS,IA.NFW.GLOBL CN.IN,CN.OU,CN.UT,CN.NTB.GLOBL OB.TA,OB.FS,OB.SQ,OB.BO,OB.TC,OB.RD,OB.RA,OB.ND,OB.DD,OB.BM<.GLOBL OB.TH,OB.TB,OB.TI,OB.CR,OB.LP,OB.PR,OB.PP,OB.PL,OB.MT*.GLOBL OB.DT,OB.CS,OB.CP,OB.FH,OB.MH,OB.FL .ENDC B.OT = 0> B.UN = 1O B.RC = B.OT+2 B.RN = B.RC+2 B.RP = B.RN+4 B.RU = B.RP+4 B.NA = B.RU+4 B.UA = B.NA+2 B.MN = B.UA B.MX = B.MN+10O NT.IN = 101 NT.NS = 1 CR.UR = 2 CR.NR = 3 CR.MX = 6 CR.N0 = 0. CR.N1 = 1O CR.N2 = 2T CR.N3 = 3L CR.N4 = 4O CR.N5 = 5W CR.N6 = 6N CR.N7 = 7C CR.N8 = 8. CR.N9 = 11 CR.N10 = 12O CR.N11 = 13D CR.DI = 4 CR.DT = 5 CR.DA = 6 LB.N=0O LB.E=2R CT.IN = 0 CT.CN = 1 IA.ABO = -5 IA.DIS = -7 IA.NFW = 177673 IA.ISM = 1 CN.IN = 1 CN.OU = 2 CN.UT = 4 CN.NT = 10 OB.TA = 0 OB.FS = 1 OB.SQ = 2 OB.BO = 3 OB.TC = 4 OB.RD = 5 OB.RA = 6 OB.ND = 7 OB.DD = 10S OB.BM = 11= OB.TH = 203 OB.TB = 21 OB.TI = 22 OB.CR = 23 OB.LP = 24 OB.PR = 25 OB.PP = 26 OB.PL = 27 OB.MT = 30 OB.DT = 31 OB.CS = 32 OB.CP = 33 OB.FH = 34O OB.MH = 351 OB.FL = 364 .MACRO COMDF$ A .ENDM .LIST .ENDMÈW  .MACRO EGCMI$ .MACRO GCMLD$ GLOB .ASECT  .=0G.MODE: .BLKW 2C GE.COM = 1. GE.IND = 2T GE.CLO = 4= GE.LC = 10 GE.CON = 20 GE.XXX = 40 GE.MUL = 100. GE.LIB = 200= GE.MCR = 400 GE.IEF = 1000 GE.RWD = 2000 GE.FOP = 4000 GE.RPR = 10000 GE.SDE = 20000O GE.SER = 40000P GE.SLB = 100000 ; G2.XXX = 1G.IMPS: .BLKB 1G.OVBC: .BLKB 1.G.FILE: .BLKW 1=G.ERR: .BLKB 1 GE.IOR = -1 GE.OPR = -2 GE.BIF = -3 GE.MDE = -4 GE.CMD = -5 GE.VRS = -6 GE.EOF = -10. GE.RBG = -40.G.CDEP: .BLKB 1LG.FUNC: .BLKB 1 G.MAXD: .BLKB 1BG.TERM: .BLKB 1 G.TIOS: .BLKB 1G.TIOP: .BLKW 1.G.PRMP: .BLKW 2 G.CMLD: .BLKW 20G.FRAG: .BLKW 2G.BUFF: .BLKW 2GG.DFPR: .BLKB 6.G.CSIB: .BLKW 1WG.PPTR: .BLKW 1 G.SWIT: .BLKW 1 G.LBMN: .BLKB 6 G.FQFN: .BLKW 1 G.DDIR: .BLKW 2 AG.DEFT: .WORD ^RCMD ; DEFAULT TYPE TO LOAD INTO DEFAULT FILENAMEB) ; BLOCK. INDIRECT WILL MODIFY THISPG.ISIZ:G .ASECT3 .=0G.SUSR: .BLKW 1 G.SDID: .BLKW 56G.SVER: .BLKW 1G.STYP: .BLKW 1.G.SNAM: .BLKW 3.G.SFID: .BLKW 3.G.SRAT: .BLKB 16.EG.SPOS: .BLKW 3IG.SBST: .BLKW 1IG.SRWP: .BLKW 3RG.PLFS:  .PSECTD .MACRO GCMLD$ X .ENDM .ENDMN .MACRO ECMLB$ FILE,LUN=1,MAXD=3,PRMP=< >,BFAD,BFSZ=80.,PDL,SWIT,?GF,?GB,?GS# .MCALL GCMLD$,CWORD$,CBYTE$,CSTRG$  .MCALL CSI$SW,CSI$SV,CSI$ND .IIF NDF FCS$$ FCS$$=1P GCMLD$ ...PC1=.T .BLKB G.ISIZ  CBYTE$ ,G.IMPS , CWORD$ ,G.MODE CBYTE$ ,G.MAXDK CBYTE$ <15>,G.DFPR CBYTE$ <12>,G.DFPR+1N CSTRG$ ,G.DFPR+2,3  CBYTE$ <-1>,G.CDEPE CBYTE$ ,G.TIOST CWORD$ <0>,G.TIOP CWORD$ <0>,G.FQFN CBYTE$ <0>,G.OVBC .IF B  ...TMP = <*G.PLFS>,...PDL: .BLKB ...TMP CWORD$ <...PDL+...TMP>,G.PPTR .IFF. .ENDC .IF B TGB: .BLKB BFSZ+2 CWORD$ ,G.BUFF+2 .IFFD CWORD$ ,G.BUFF+2  .ENDC CWO00"G8 1gRD$ ,G.BUFF+0Y .IF B I...SWI: GCMSW$ ...PC1,GS CWORD$ <...SWI>,G.SWIT .IFF  CWORD$ ,G.SWIT  .ENDC .IF NB  CWORD$ ,G.FILEP .IFFD CWORD$ ,G.FILE> .IF DF FCS$$E* .MCALL FDBDF$,FDAT$A,FDOP$A,NMBLK$,FDBF$A GF: FDBDF$ FDAT$A 2  FDOP$A LUN,,...FNAD FDBF$A ,,1 % CBYTE$ ,F.RCTLP...FNA: NMBLK$ CMI,CMD .IFFR .IF DF RMS$$C .MCALL FAB$B,RAB$B,NAM$B GF: .WORD 1,...RAB .WORD 1,...FABD ...RAB: RAB$B> R$FAB ...FABN R$RAC RB$SEQS RAB$E ...FAB: FAB$BW F$DNA ...DNA+3S F$DNS 7 F$FNA ...FNA. F$FAC FB$GET. F$LCH LUN F$NAM ...NAM F$ORG FB$SEQN F$RAT 0 F$RFM FB$VARG FAB$E ...NAM: NAM$B N$ESS 34. NAM$E...DNA: .ASCII /SY:CMI.CMD/$...FNA: .ASCII /CMI/ .BLKB 29. .IFF$ .ERRORO .ENDC .ENDC .ENDC .ENDM6 .MACRO GCMLB$ MAXD=1,PRMP=< >,UBUF,LUN,PDL,SIZE=80. .MCALL ECMLB$$ ECMLB$ ,LUN,MAXD,PRMP,UBUF,SIZE,PDL .ENDM .MACRO GCMSW$ GCMB,?VAL .MCALL CSI$SW,CSI$SV,CSI$ND CSI$SW LB,GE.SLB,,SET,,VALR CSI$SW ER,GE.SER,,SET,NEG CSI$SW DE,GE.SDE,,CLEAR,NEG CSI$NDFVAL: CSI$SV ASCII,GCMB+G.LBMN,6. CSI$NDF .ENDM .MACRO GCML$ GCMB,PRAD,PRLN .MCALL GCMLD$,LDR0$ GCMLD$ DEF$LN LDR0$ GCMB  CLRB G.FUNC(R0) .IF NB  MOV PRLN,G.PRMP(R0) .IF B O .ERROR .IFF MOV PRAD,G.PRMP+2(R0) .ENDC .IFFR CLR G.PRMP(R0), .ENDC .GLOBL $GCMLC JSR PC,$GCMLL .ENDM .MACRO RCML$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$LC LDR0$ GCMBI MOVB #1,G.FUNC(R0)B .GLOBL $GCMLA JSR PC,$GCMLG .ENDM .MACRO CCML$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$LS LDR0$ GCMBG MOVB #2,G.FUNC(R0). .GLOBL $GCMLC JSR PC,$GCMLP .ENDM .MACRO MCML$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$L. LDR0$ GCMBF MOVB #3,G.FUNC(R0), .GLOBL $GCMLF JSR PC,$GCMLR .ENDM .MACRO FCML$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$L( LDR0$ GCMB MOVB #4,G.FUNC(R0)P .GLOBL $GCMLM JSR PC,$GCML  .ENDM .MACRO LCML$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$L1 LDR0$ GCMB MOVB #5,G.FUNC(R0)P .GLOBL $GCMLM JSR PC,$GCML  .ENDM .MACRO ECML$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$L2 LDR0$ GCMB MOVB #6,G.FUNC(R0)P .GLOBL $GCMLM JSR PC,$GCML  .ENDM .MACRO DCML$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$L3 LDR0$ GCMB MOVB #7,G.FUNC(R0)P .GLOBL $GCMLM JSR PC,$GCML  .ENDM .MACRO GCMM$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$L4 LDR0$ GCMB MOV G.FILE(R0),R0 .GLOBL .MARKN JSR PC,.MARKL .ENDM .MACRO GCMP$ GCMB .MCALL GCMLD$,LDR0$ GCMLD$ DEF$L LDR0$ GCMBP MOV G.FILE(R0),R0 .GLOBL .POINT JSR PC,.POINT .ENDM, .MACRO CMSET$ GCMB,TSUB,TVFC,FQFN,TTMO,OVBC" .MCALL LDR0$,CMOV$B,CMOV$W,GCMLD$ GCMLD$ DEF$LP LDR0$ GCMBN CMOV$B TSUB,G.TIOSB CMOV$B TVFC,G.TIOP+1 CMOV$B TTMO,G.TIOP+0G CMOV$W FQFN,G.FQFN( CMOV$B OVBC,G.OVBC .ENDM+ .MACRO CMGET$ GCMB,TERM,FILE,FQFN,OVBC,ERRC" .MCALL LDR0$,CGET$B,CGET$W,GCMLD$ GCMLD$ DEF$LL LDR0$ GCMBL CGET$B G.TERM,TERMM CGET$W G.FILE,FILE  CGET$B G.ERR,ERR  CGET$W G.FQFN,FQFN  CGET$B G.OVBC,OVBC .ENDM .MACRO EGCMI$ .ENDM .ENDMVW  .MACRO .PICOD NAME=PIC$IT .PSECT NAME RO,I,LCL,REL,CON0 .ENDMVW  .MACRO .PCODE NAME=PUR$I .PSECT NAME RO,I,LCL,REL,CONV .ENDMVW  .MACRO .IDATA NAME=IMP$DF .PSECT NAME RW,D,LCL,REL,CONN .ENDMVW  .MACRO .PDATA NAME=PUR$DC .PSECT NAME RO,D,LCL,REL,CON .ENDMVW  .MACRO .ODATA NAME=IMP$DO .PSECT NAME RW,D,LCL,REL,OVRR .ENDM0W < .MACRO HLPDF$ FILLUN,TILUN,EFN,NAME,FDBIN,DSP,MODULE,FDBOUT$HFDB:: .WORD FDBIN .IF NB FDBOUT .WORD FDBOUTS .IFFE .WORD 0 .ENDC$HLUN1 == FILLUN$HLUN2 == TILUN $HEFN == EFN$HDSP:: .WORD DSPR$HMOD:: .RAD50 /MODULE/$HNAME::.ASCII /NAME/R .EVEN .ENDM HLPDF$.`W ! .MACRO OVAST$ SENSE,?LABL,?LABL2 MOV @#.NOVPT,-(SP)$ BEQ LABL  ADD #N.FAST,(SP) .IF IDN , BICB #^O200,@(SP)+M .IFF. .IF IDN , BISB #^O200,@(SP)+ .IFF.00"O5TADATADATADATADATADATADATADATADATA0 .ERROR ; PARAMETER MUST BE "ALLOW" OR "INHIBIT" .ENDC .ENDC BR LABL2ILABL:F INC (SP)+LABL2: .ENDM OVAST$�W  .MACRO CSM$ SUPVR .IF IDN <(SP)+>, .WORD 007026R .IFF MOV SUPVR,-(SP) .WORD 007026: .ENDC .ENDM CSM$N W  .MACRO FEADF$,L,B .MCALL DEFIN$ .IF NB L'BL ...GBL=1  .IFFP ...GBL=0B .ENDC DEFIN$ FE$EXT,1 DEFIN$ FE$MUP,2 DEFIN$ FE$EXV,3 DEFIN$ FE$DRV,4 DEFIN$ FE$PLA,5 DEFIN$ FE$CAL,6 DEFIN$ FE$PKT,7 DEFIN$ FE$EXP,8.O DEFIN$ FE$LSI,9.B DEFIN$ FE$OFF,10. DEFIN$ FE$FDT,11. DEFIN$ FE$X25,12. DEFIN$ FE$DYM,13. DEFIN$ FE$CEX,14. DEFIN$ FE$MXT,15. DEFIN$ FE$NLG,16. DEFIN$ FE$DAS,17. DEFIN$ FE$LIB,18. DEFIN$ FE$MP,19.) DEFIN$ FE$EVT,20. DEFIN$ FE$ACN,21. DEFIN$ FE$SDW,22. DEFIN$ FE$POL,23. DEFIN$ FE$WND,24. DEFIN$ FE$DPR,25. DEFIN$ FE$IRR,26. DEFIN$ FE$GGF,27. DEFIN$ FE$RAS,28. DEFIN$ FE$AHR,29. DEFIN$ FE$RBN,30. DEFIN$ FE$SWP,31. DEFIN$ FE$STP,32. DEFIN$ FE$CRA,33. DEFIN$ FE$XCR,34. DEFIN$ FE$EIS,35. DEFIN$ FE$STM,36. DEFIN$ FE$UDS,37. DEFIN$ FE$PRO,38. DEFIN$ FE$XHR,39. DEFIN$ FE$AST,40. DEFIN$ FE$11S,41. DEFIN$ FE$CLI,42. DEFIN$ FE$TCM,43. DEFIN$ FE$PMN,44. DEFIN$ FE$WAT,45. DEFIN$ FE$RLK,46. DEFIN$ FE$SHF,47. DEFIN$ FE$CXD,49. DEFIN$ FE$XT,50.N DEFIN$ FE$ERL,51. DEFIN$ FE$PTY,52. DEFIN$ FE$DVN,53. DEFIN$ FE$LCD,54. DEFIN$ FE$NIM,55. DEFIN$ FE$CHE,56. DEFIN$ FE$LOG,57. DEFIN$ FE$NAM,58. DEFIN$ FE$FMP,59. DEFIN$ FE$DCL,60. DEFIN$ FE$DDS,61. DEFIN$ FE$ACD,62. DEFIN$ FE$NCT,63. DEFIN$ FE$LSD,64. ; Word 5 DEFIN$ FE$PC3,65.5 DEFIN$ FE$DFB,66. ; System supports deferred binding4% DEFIN$ FE$RTB,67. ; Run time binding44 DEFIN$ FE$ODB,68. ; Deferred binding is overridable5 DEFIN$ FE$XDJ,69. ; XDT is doing I/O via TPRs on KXJN) DEFIN$ FE$NSY,70. ; No local system diskE% DEFIN$ FE$NCO,71. ; No local consoleE) DEFIN$ FE$RTK,72. ; Remote task servicesG- DEFIN$ FE$RDR,73. ; Remote directory storageD+ DEFIN$ FE$RLG,74. ; Remote logical support ' DEFIN$ FE$VTL,75. ; VT logins disabledE DEFIN$ HF$UBM,-1. DEFIN$ HF$EIS,-2. DEFIN$ HF$QB,-3.6 DEFIN$ HF$DSP,-4.4 DEFIN$ HF$SWR,-5. ; Processor has a switch register) DEFIN$ HF$KXJ,-6. ; Processor type KXJ11 $ DEFIN$ HF$RMT,-7. ; Remote services DEFIN$ HF$CIS,-8. DEFIN$ HF$FPP,-16.  DEFIN$ HF$NVR,-17.  DEFIN$ HF$INV,-18.  DEFIN$ HF$CLK,-19.  DEFIN$ HF$ITF,-20.R DEFIN$ HF$PRO,-21.s DEFIN$ HF$BRG,-32.R DEFIN$ T2$WFR,1 DEFIN$ T2$WFA,2 DEFIN$ T2$SPN,3 DEFIN$ T2$SPA,4 DEFIN$ T2$STP,5 DEFIN$ T2$STA,6 DEFIN$ T2$ABO,7 DEFIN$ T2$AFF,9.D DEFIN$ T2$SIO,10. DEFIN$ T2$SEF,12. DEFIN$ T2$REX,13. DEFIN$ T2$CHK,14. DEFIN$ T2$DST,15. DEFIN$ T2$AST,16. DEFIN$ T3$GFL,17. DEFIN$ T3$SWS,18. DEFIN$ T3$CMD,19. DEFIN$ T3$MPC,20. DEFIN$ T3$NET,21. DEFIN$ T3$ROV,22. DEFIN$ T3$CAL,23. DEFIN$ T3$NSD,24. DEFIN$ T3$RST,25. DEFIN$ T3$CLI,26. DEFIN$ T3$SLV,27. DEFIN$ T3$MCR,28. DEFIN$ T3$PRV,29. DEFIN$ T3$REM,30. DEFIN$ T3$PMD,31. DEFIN$ T3$ACP,32. DEFIN$ T4$SNC,33. DEFIN$ T4$DSP,34. DEFIN$ T4$PRV,35. DEFIN$ T4$PRO,36. DEFIN$ T4$LDD,37. DEFIN$ T4$MUT,38. DEFIN$ T4$CTC,39. DEFIN$ T4$FMP,40./ DEFIN$ T4$DFB,41. ; Task has deferred binding1 .MACRO FEADF$ X,Y .ENDM FEADF$C .ENDM FEADF$ W  .MACRO LNBDF$,L,B,SYSDEFV .SAVE .ASECTC LT.SYS='B'0N LT.GRP='B'1 LT.USR='B'2T LT.TSK='B'3 LT.SES='B'4D LT.INV='B'62 LT.APP='B'53 LS.TRM='B'1F LS.PRV='B'2. LB.LOC='B'1R LB.LOG='B'2N IN.TSK='B'1 IN.SES='B'20 IN.GRP='B'4 IN.SYS='B'10.=0 O$STAT:'L' .BLKW 1O$FLAG:'L' .BLKW 1O$NODS:'L' .BLKW 1O$NODA:'L' .BLKW 1O$DEVS:'L' .BLKW 1O$DEVA:'L' .BLKW 1O$DIRS:'L' .BLKW 1O$DIRA:'L' .BLKW 1O$NAMS:'L' .BLKW 1O$NAMA:'L' .BLKW 1O$TYPS:'L' .BLKW 1O$TYPA:'L' .BLKW 1O$VERS:'L' .BLKW 1O$VERA:'L' .BLKW 1O$TRLS:'L' .BLKW 1O$TRLA:'L' .BLKW 1O$ACCS:'L' .BLKW 1O$ACCA:'L' .BLKW 1O$LTYP:'L' .BLKB 1 .BLKB 1' O$PLEN='B'.' SU$SUC ='B'1*SU$DID ='B'2 ;Directory ID alr00"W#\ 1geady foundER$NOD ='B'175550GER$DEV ='B'177100'ER$DIR ='B'177060'ER$FNM ='B'176420'ER$TYP ='B'174540'ER$VER ='B'174460'ER$ESS ='B'176640'ER$XTR ='B'174340'ER$BEQ ='B'177510'ER$TRN ='B'174550'ER$FTB ='B'176364'FS$NOD ='B'400FS$DEV ='B'200FS$DIR ='B'100FS$QUO ='B'2000W FS$NAM ='B'4 FS$TYP ='B'2 FS$VER ='B'1FS$WCH ='B'4000WFS$WDI ='B'1000L FS$WNA ='B'40' FS$WTY ='B'20A FS$WVE ='B'10$FS$NDF ='B'10000 P.LNON ='B'0 P.LNAM ='B'1 P.LDEV ='B'2 P.LNOD ='B'3 .RESTORED .MACRO LNBDF$ X,Y,Z .ENDM .ENDMÂW  .MACRO BOM$C STS,FLG,CS,ERR .MCALL BOM$,DIR$B .IF NDF $$$GLB= .PSECT $DPB$.,D$$$=.6 .IFTF BOM$ STS,FLG' .IFTQ .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM BOM$CšW  .MACRO BOM$S STS,FLG,ERRB .MCALL MOV$,DIR$,OFF$ MOV$ FLG4 MOV$ STSB MOV (PC)+,-(SP) .BYTE 211.,3W DIR$ ,ERR .ENDM BOM$S W  .MACRO BOM$ STS,FLG .MCALL OFF$ .IF NDF $$$GLB0 .BYTE 211.,3 .WORD STS .IF NB FLG3 .WORD FLG .IFFR .WORD 0 .ENDC .ENDC .IF NDF B.OMCD .NLISTA$$$OST=0 OFF$, OFF$ B.OMCD,2 OFF$ B.OMFL,2 .LIST .ENDC .ENDM BOM$DvW  .MACRO BOMDF$ .NLIST. S.BUNK=-128. S.BFEI=0. S.BOVL=1.N S.BBIF=1. .LIST .ENDM BOMDF$ ìW  .MACRO TFEA$ FEAT .MCALL OFF$,FEADF$V .IF NDF $$$GLB+ .BYTE 209.,2. .WORD FEAT  .ENDC .IF NDF F.TEAF OFF$ OFF$ F.TEAF,2 .IF DF $$$GLB FEADF$ ,<=> .IFFL FEADF$E .ENDC .ENDC .ENDM TFEA$¶W  .MACRO TFEA$C FEAT,CS,ERR .MCALL TFEA$,DIR$ .IF NDF $$$GLBO .PSECT $DPB$$$$$=.M .IFTF TFEA$ FEAT .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM‚W  .MACRO TFEA$S FEAT,ERR0 .MCALL MOV$,DIR$B MOV$ FEAT MOV (PC)+,-(SP) .BYTE 209.,2. DIR$ ,ERR .ENDMªW  .MACRO RRST$ WDB$ .MCALL OFF$ .IF NDF $$$GLBA .BYTE 213.,2F .WORD WDB .ENDC .IF NDF R.RSBA OFF$  OFF$ R.RSBA,2 .ENDC .ENDM RRST$¼W  .MACRO RRST$C WDB,CS,ERR .MCALL RRST$,DIR$ .IF NDF $$$GLBL .PSECT $DPB$$$$$=.$ .IFTF RRST$ WDB .IFT= .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RRST$C ˆW  .MACRO RRST$S WDB,ERR .MCALL DIR$,MOV$A MOV$ WDBC MOV (PC)+,-(SP) .BYTE 213.,2( DIR$ ,ERR .ENDM RRST$S DIR$ ,ERR .ENDMªW  .MACRO RRST$ WDB$ .MCALL OFF$ .IF NDF $$$GLBA .BYTE 213.,2F .WORD WDB .ENDC .IF NDF R.RSBA OFF$  OFF$ R.RSBA,2 .ENDC .ENDM RRST$¼W  .MACRO RRST$C WDB,CS,ERR .<Á0ÀW  Z&ËT¬Ÿ s�(À€W�ª3à�f4Ùf‚nF ‚ŠF VNƒ@r À+ƒâ¢ Š(Lš¢ .€âJ¤ Ó%Lš¤ 2&Lš¤ Ñ(Lš¤ PdLš¥ Š(L𥠳–Lš¦ Ò:Lš© Ì`Lšª X…Lš¬ iLš¬ tLš¬ qLš¬ |Lš¬ Ö(âJ¬ ,Lš¬ é8Lš¬ ö8Lš¬ VNâJ¬ œSâJ¬ i^Lš¬ v^Lš¬ wâJ¬ ÒyâJ¬ \}âJ¬ ’âJ¬ .€âJ¬ 5…âJ¬ q…âJ¬ ……âJ­ e^L𝠛ƒL𝠓Lš° xsLš´ ÑpâJ⃠LšâŒ(LšîT–Lšö°Lšö,„¦ö`T„(tLš²0 …žó}™$ó0™$C€pš˜�¶p‘À�ƒâ•_MŠj•fMŠj—€%šL¢À+ƒâ¦}šø)»WâJ)ÑWâJ))XâJ)ûXâJ)ZâJ)õZâJ, âJ,ƒ!âJ,R"âJ,Ö(âJ,CMâJ,NâJ,œSâJ,óyâJ,\}âJ-íDâJ-ŽEâJ.‰âJ.ŽâJ.›âJ.îâJ2‘âJ2 .âJ2ÑpâJ2©‰âJ2éŠâJ2”‹âJ2Ù‹âJ3^sâJ3®sâJË:K…žÔ_M‹ÔfM‹{ˆ„ÐùòyŠÈ2À+ƒâd6&Lšdì&LšdÖ(LšlÖ(âJlCMâJlNâJlœSâJl\}âJtÑpâJ!!À�ƒâ'!€%œš6!}�F[!}�<q!ˆ…q!òy…j+"Y âJ+"ÞâJ+"zâJ+"K"âJ+"½'âJ+"¢(âJ+"ÜYâJ+"ÞâJ+"ø€âJ+"ZŠâJ+"2™âJ #n~…ž#}…ž#Oq†Ð#€†z#""âJ00#_5TADATADATADATADATADATADATADATADATA#žwâJ# zâJ#ú�âJ¬#‘âJ¬# .âJ¬#½‹âJ­#ÌyâJ­#îyâJ¸#N&âJ¸#óyâJ¸#v~âJÄ%ÄLšÄ%•LšÄ%ëLšÄ%r!LšÄ%#LšÄ% #LšÄ%#LšÄ%ÄLLšÄ%ˆZLšÄ%kfLšÄ% qLšÄ%tLšÄ%™wLšÄ%xLšÄ%LšÄ%C�LšÄ%¤’Lš<&kLš<&DLš<&%Lš<&�Lš<&zLš<&®(Lš<&w*Lš<&ƒ:Lš<&H;Lš<&„SLš<&È`Lš<&ãeLš<&ÞfLš<&ýfLš<&°pLš<&¶pLš<&KqLš<&%tLš<&iwLš<&lyLš<&9€Lš<&�LšI&}…žc&¼âJc&ÆâJc&’âJc&L âJc&ôâJc& âJc&âJc&©âJc&‘âJc&„âJc&;âJc&„âJc&³âJc&òâJc&’âJc&æâJc&~âJc&õâJc&» âJc&"âJc&Ä"âJc&#âJc&#âJc&#âJc&4&âJc&˜'âJc&Þ,âJc&";âJc&|KâJc&jLâJc&_MâJc&üMâJc&NâJc&ÀSâJc&˜TâJc&UâJc&µWâJc&XâJc& XâJc&õXâJc&gYâJc&‘ZâJc&b^âJc&¶^âJc&™dâJc&ÌeâJc&áeâJc&fâJc&dfâJc&ßfâJc&9gâJc&»pâJc&ÞpâJc&2qâJc&grâJc&krâJc&¢sâJc&«sâJc&wwâJc&xâJc&íyâJc&ðyâJc&hzâJc&…}âJc&óƒâJc&¬ŒâJc&ü�âJc&ô‘âJc&Š–âJc&ª–âJc&R—âJc& ™âJc&#›âJc&«ÆâJp&¶pŒ&LšŒ&ðZLšŒ&]fLšŒ&tLšŒ&tLšŒ&CyLš|' Lš‰'d‡‰'àe‡ô'ÄLšô'IRLšô' qLšô'Ä…Lšô'¤’Lš‹(‡´“(ÞâJ“(zâJ“(µWâJ“(&XâJ“(ÜYâJ“(—mâJ“(ø€âJ“(ZŠâJ“(@�âJ“(i�âJ“(ñ‘âJ“(ù’âJ“(5“âJ¼(yLš¼(Ö Lš¼(–QLš\)zLš\)îLš\) Lš\)ÖKLšá)ìLšá)à’á)[MLšâ)ƒ Lšâ)PLšâ),Lšâ)nELšâ)sELšâ)ŽELšâ)_GLšâ)ÌGLšâ)2HLšã)Ð4Lšã)§ZLšä)p ’ä)²'Lšä)TyLšä)½‹Lšå)0âJå)Û%Lšå)°'Lšå)^Lšå)PsLšå) ™Lšæ)»Lšæ)é%Lšæ)LLšæ)µWLšæ)ÐWLšæ)ø€Lšæ)ZŠLšè)›8Lšé) x’ì)` ’ì)VâJì)âJì)Ö(âJì)VNâJì)œSâJì)CTâJì)VdâJì)[dâJì)jdâJì)ãfâJì)êfâJì)gâJì)ÖpâJì)nrâJì)’sâJì)wâJì)ÒyâJì)\}âJì)p…Lší) Lší) Lší)w Lšî)ÔpLšî)KqLšï)ã‰Lšð)€%’ð)û5’ò)»Lšò)t Lšò)ýLšò)ìLšò)BxLšò)OzâJò)PzâJò)ø€Lšó)ö!Lšó)¶dLšó)VgLšó)[}Lšô)p ’ô)–œ’õ)à’õ)üXLšõ)ÔpLšö)°Lšö)’Lšt*Ê[bt*·[bt*Î[bt*G[bt*I"[bt*ä3[bt*›N[bt*µr[bt*s[bt*Œs[bt*Ês[bt*¶z[bt*ç[bt*©„[bt*b†[bt*Ö‰[bœ*4[bœ*[bœ*€[bœ*Ä[bœ*· [bœ*8&[bœ*@,[bœ* X[bœ*@w[bœ*¶w[bT,KâJT, âJT,ôâJT,ÌâJœ,òˆžœ,1˜Æœ,³Œfœ,VN‰"œ,ÊQ‰Àœ,:d‰~œ,Oqˆ`œ,u~¡¤œ,€Š.Ì,ŠâJË-–ˆã.ÁQ˜Æ#0ìâJ#0âJ#0âJ#0âJ#09âJ#0DâJ#0LâJ#0MâJ#0vâJ#0¼âJ#0)âJ#04âJ#0óâJ#0âJ#0TâJ#0UâJ#0ãâJ#0âJ#0xâJ#0–8âJ#0œ8âJ#0Ä8âJ#0Æ8âJ#0Ë8âJ#0Í8âJ#0ð8âJ#0ö8âJ#0Õ:âJ#0k;âJ#0–;âJ#0ø;âJ$0ƒ!âJ$0R"âJ$0Ö(âJ$0œSâJ$0’sâJ,0‘ƒâJ,0œƒâJ,0σâJ,02„âJ,05…âJ,0q…âJ,0……âJ-0’âJ-01âJ00ÑpâJ00‡qâJ00sâJ00sâJ00sâJ20,âJ20Ç,âJ20,-âJ20’.âJ20£.âJ40‘8âJ40È8âJ40Ì8âJ40á8âJ40’9âJ40Q:âJ40W:âJ40;;âJ40:<âJ40wâJ40uwâJ40ÇwâJ40ÛwâJ40ÜxâJ40üxâJ40CyâJ40NyâJ40RyâJ40žyâJ40ÑyâJ40îyâJ40óyâJ401zâJ40w[b´:Kw[b´:iw[b´:ow[b´:‹w[b´:œw[b´:¯x[b´:Ìx[b´:×x[b´:By[b´:Fy[b´:Wy[b´:Çy[b´:áy[b´:ãy[b´:ðy[b´:az[b´:¶z[b´:¤}[b´:Ý[b´:éƒ[b´:„[b´:„[b´:+…[b´:|…[b´:A†[b´:i†[b´:y†[b´:ô�[b´:ü�[b´:$�[b´:C�[b´:d�[b´:h�[b´:¢‘[b´:£‘[b´:³‘[b´:´‘[b´:¶‘[b´:Û‘[b´:’[b´:B’[b´:D’[b´:¼’[b´:ä’[b´:2“[b´:˜[b´:1˜[bÌ:›‚Ì$;ƒK[b;@j[b;Àv[b;L…[b;–[b@; (ƒÐT;ð[bT;8[bT;[bT;²[bT;[bT;�[bT;7[bT;¬![bT;;"[bT;I"[bT;`[bT;Ûd[bT;4f[bT;$q[bT;ùs[bT;œw[bT;Dy[bT; z[bT;z[bT;*}[bT;[bT;[bT;3[bT;ü�[bT;”˜[blK[MâJlK_MâJðK¶pNæfâJNÝâJ{[b?{0À[b?{pÆ[b?{ÎÌ[b?{�Ó[b?{pß[b?{Nò[b?{@ø[b@{0À[b@{NÀ[b@{NÙ[bA{0À[bA{Îå[bA{ò[bB{Nò[bC{€»[bD{0À[bE{ÎÌ[bE{ÀÚ[bG{Îå[b”}”[b”}¼[b”}Ê[b”}4[b”}y[b”}ƒ[b”} [b”}H [b”}¿ [b”}ö [b”}k[b”}ˆ[b”}>[b”}™[b”}£[b”}®[b”}É[b”}ã[b”}ó[b”}Ë[b”}õ[b”}ô[b”}Á![b”}I"[b”}8&[b”}]([b”}’([b”}ö2[b”}ü2[b”}T3[b”}ä3[b”}5[b”}Ë8[b”}O:[b”}„:[b”}D;[b”}ˆK[b”}�M[b”}vN[b”}xQ[b”}€Q[b”}•R[b”}âW[b”}KX[b”}:Y[b”}`Y[b”}Z[b”}ŒZ[b”}`[b”}:d[b”}”f[b”}Ùf[b”}(g[b”}òi[b”}ðj[b”}¼p[b”}Uq[b”}«q[b”}ˆs[b”}Hw[b”}Jw[b”}³w[b”}¶w[b”}¶x[b”}×x[b”}Øx[b”}Úx[b”}»y[b”}ây[b”}Œz[b”}8}[b”}V}[b”}]}[b”}c}[b”}ã~[b”}[b”}Þ[b”}€[b”}0€[b”}Öƒ[b”}׃[b”}؃[b”}Ùƒ[b”}Úƒ[b”}Ûƒ[b”}܃[b”}݃[b”}Þƒ[b”}߃[b”}|Š[b”},‘[b”}˜[b”}™[b”}Óí[bõ}@…ž ~L [b ~ö [b ~G[b ~I"[b ~ìY[b ~´p[b ~ q[b ~)q[b ~[q[b ~br[b ~ur[b ~µr[b ~¶r[b ~s[b ~s[b ~Œs[b ~´s[b ~¶z[b ~[b ~5[b ~Àƒ[b ~ô�[b ~$�[b ~:‘[b ~¢‘[b ~Û‘[b ~{–[b ~^˜[bÑ_M‹,ÑfM‹,a� |[ba� |[bb�ßS[bd�—}[bk� |[bl�8 [bl�Š [bl�Œ [bl�Ž [bl�Ö [bl�+ [bl�÷[bl�ƒ!âJl�R"âJl�Ö(âJl�CMâJl�NâJl�œSâJl�Q\[bl�ßl[bl�àl[bl�ál[bl�’sâJl�­sâJl�óyâJl�\}âJl�ŽÆ[bl�ÞÆ[bl�ÎÇ[bl�ØË[bl�öÌ[bl�Ó[bl�Ó[bs�®[bu�VY[bu�®y[bu�¯y[bu�°y[bu�±y[bu�²y[bv�Ó�[bv�–‚[bv�˜‚[bv�›‚[bv�¿‚[bv�ŽÆ[bv��Æ[bv��Æ[bv�“Æ[bv�ãÆ[bv�Ç[bv�Ç[bv�ØË[b‚ŸâJ‚6âJ‚L âJ‚ âJ‚ âJ‚`qâJ‚ŽwâJ‚7xâJ‚AyâJ‚NyâJ‚áyâJ‚ðyâJ‚±�âJ‚Â�âJC‚ÈâJC‚ôâJC‚©âJC‚ÌâJC‚¼,âJC‚ÊQâJC‚ÃSâJC‚\XâJC‚|ZâJC‚ fâJC‚æfâJC‚UqâJC‚îrâJC‚ŒsâJC‚¶xâJC‚kzâJk‚ãâJk‚òâJk‚âJk‚˜'âJk‚¤KâJk‚œTâJk‚ßfâJk‚æfâJk‚óxâJ'…€%§ð}…ÀƒâL†d¨‚­‡‘âJ³‡.€âJSŒ¨üSŒÀv¨üSŒ–¨ü|Œ@¨îŠŒÀ©®ŠŒð©® Œ¶p �œw[b �Bx[b �|…[bº�iЈ»�`Ј¼�`Ј¼�›Ј¾�¨ Ј¾�8TЈÅ�ˆ,ЈÅ�ØwЈÈ�8 ЈÈ�àЈÈ�¸`ЈÊ�8TЈË� sЈË�H…Јñ�}�þñ�~…ž¼��`–h¼�£`–hÃ�HX–¾Ô’âJÔ’§âJÔ’ÔâJÔ’7!âJÔ’#âJÔ’xQâJÔ’¼WâJÔ’àWâJÔ’qâJÔ’LqâJÔ’[qâJÔ’VsâJÔ’;xâJÔ’óƒâJÔ’}…âJÔ’¤’âJÔ’RæâJñ’˜:‡v.”ÒâJ.”» âJ.”à8âJ.”ÖKâJ.” LâJ.”¶^âJ.”ìqâJ.”BxâJ.”’yâJ.”óyâJ4”ŽwâJ#™´¯[b#™Ö¯[b#™ý±[b#™²[b-™°[b-™'±[b-™(±[b-™?±[b-™“±[b-™[²[b-™´[b5™|¯[b5™„¯[b5™²¯[b5™^±[b5™f±[b5™Ù±[b5™$²[b5™5²[b5™Q²[b<™D[b<™i[b<™|[b<™í[b<™ <™$[b<™-[b<™4[b<™[b<™s![b<™..[b<™pT[b<™_[b<™^q[b<™ew[b<™šw[b<™3}[b<™S~[b<™u~[b<™€[b<™/€[b<™ZŠ[b<™á‹[bô¨Îõô¨õô¨""¯Ðô¨ªHõô¨úWõú¨@,‚ú¨C,‚ý¨Xh9©´}°9©x‚Ò09©z‚Ó6:©<Óx:©´´:©Óx:©ÿÓx:©"´:©Ï_Óx:©¿`Óx:©(}Óx:©Óx:©ZŠÓx<©ÔÈ<©P}Òl<©!€±4E©4d´FE©‹d´FG©P}ÒlJ©Åô0J©ø‰³FN©{›ŽN©Û£ôN©t!£ôN©{8›ŽN©û]›ŽN©:d£ôN©Bx£ôN©\}£ôN© £ôN©K€Õ¬[©(}Ôa©}Õ$a©bŸ¶2d©°;°ji©5uô~i©€‰¬\i© жÒi©(Œ·*m© …°jp©ÅœôFs©5¬ ™Ð5¬!™ÑBj¬õ<󸔬t!ôÌ;¯P2;¯VNön„¯½`÷Ћ¯=¬‹¯@=®4‹¯�=K°Œ¯`røÚ£¯DÇ&¤¯ŒÈÈ‚¥¯ÜK4¸¬¯²'6ÖÖ¯Ú}F>à¯þd·à¯çeJöà¯47 ñ¯4}4vó¯dx8 ó¯ø€ú8ù¯ XF>ù¯üX:&ü¯@†9@°ùp:h°úpK®°sаøu9â °\qŽÞ °PwŽÞ °ôxŽÞ ° zŽÞ °ƒ…ŽÞ°?SÀì°@SÀì°ASÀì°}ú¦° €ü ,°l;ð,°z;‚4°u~�D ±8r?° ± &K®±lE<61±ÚKÏj1±o†Ïj1±p†³F1±q†³F1±r†³F1±s†³F1±t†³F1±u†³F1±v†³F1±w†³F4±³}Ïj6±L Ïj6±xQÏj9±Ì`Ïj=±KrÏj?±y‹Ïj?±ŒÏjB±ÿÏjC±\}ÏjC±¥Ïj\±DÇ&\±ŒÈÈ‚^±âW¦h±p!ý†h±‚!¦h±ì&h±²'�±}sIúƒ±:2Êr†±/KÊrޱJ…ÊrޱP…Êr�±„:?°�±Õ±µWC‚Ö±faD ù±oŒE ²Ë4v0² Êr0²# Êr0²ÊÊr2²XE”‚²DÇ&™²`;G`œ²2&D œ²€&D œ²Ñ(D ž²faD ª²e;G„´²§*—:Ѳ˜:H†ܲ""—°Ü²#—&ܲ#—&ܲó`—¶ܲ)d˜VܲGd˜Vܲ@w˜$a³—K3øa³[M3øa³VNöna³ˆZõêb³Ó2æb³—G3€c³2 74c³Iqøúc³ÜøÚd³?!4d³)&=dd³;5@d³ŒÈÈ‚e³&74e³&74e³žM6®e³ŸM6®e³ M6®e³¡M6®e³²ZùXe³$™3øe³?™3øf³Ð4vf³t:ùXf³y::&g³ü»Ðg³<»Ðg³Ž¿Þg³Þ¿Þg³å¿Þg³ë»Ðg³¸þg³,¸þg³C»Ðg³R»Ðg³Ÿ»Ðg³¾¿Þg³Ê»Ðg³ï»Ðg³©}:Þi³ï ö¾i³‚H˜i³ÒWö¾l³ë»Ðm³lE<m³oŒ<¨p³# Iúp³h<öp³ &>ìp³J,?Lp³K,?þp³¿Z úp³iw=dp³vwI:p³¾w ,p³ìe€p?LeÀv?þ$ep!à¼ïe›‚Ì$DfT?°af Z úkf`;@®kfKqA<Žf; AhŽfvBDÓfÀ]žÎ\g Ž\ghyd·kµz[b q}Ÿz q_MŒ2q€WBà7q¼7qüqB�7q„s{IqCªVqMC‚\qòTsrà‘†‰r€%Ÿ:s@8Ÿâ4sà¦Us€%‘ÌŒs"&Jt¸L t°yD $t÷_î3ukMë@3u^õ3uþ_ëº3uIqì44u%!ìØ4u;;ìR4uH;ìÌ5u¥Zíp5u»pí5u%™í¸6u" î\6ut:îˆ7u`"ï9uüXï|>u•ô0>uzô~>u™ôF>u#ô”>uu'ór>uU(òÖ>uT[ó>uN`ôâ>uIqóª>uTqó$>u!tóÀ>uAyó\>uåòˆ>u™’óø>u%™ôÌ?uÖdïè@u# ïª@u`†ð$BuW!ðžBuq!ðBBuá"ðæBu�ñŠCuzñLDuÖsñðEu¡dò”Gu¼òþv áØþv˜qáZþvXuEþvPŒáÖ9wK ürwÀ¡^rwd Àœw³‹¾7x®sõTÛxÀ+’¨yÀ“ZAyð‘¢ØNy …€ÔSy�ƒ£¸Ty`£ô•y€%”äáy€%¦2ìyÀ]¦Úïyd§²óy@§DÑ_M‹,Þ³E”éƒKqF>!…ª0!… &«b!…p:ª>L†d¨‚ ŠðÐ`Š}Ј`Š(}ÑBSŒ¨ü|Œ@¨îŠŒÀ©®ñ�h~FDñ�H€G`ü�ÜYGü�œwl™’È}G„÷’¼6÷’d Ʊ˜(_H˜±˜aH†9©´}°<©!€±4i© жÒi©(Œ·*Ü©u~´ת¢Z¶2ݪ¨MÇR«„:ÉÖÍ«àeР*¯¤`�(;¯VNƒ@y¯X„¦†¯T„(ˆ¯�š˜‹¯=¬‹¯@=®4‹¯�=K°³¯ˆ„ÐÖ¯L …jÖ¯ˆ…Þ¯g'…ž °PwŽÞ° SÀì,°òˆž,°H:�D,°VN‰",°ÄQ‰À,°:d‰~,°€Š.v°L ŠÈ±u~Œâ±\M�Š\±DÇ&“±äŽ˜—±¼�þ—±Øs�ÖÕ±æ�ØÕ±ž�ÂÕ±z’„á±#‘.ä±Èx’ý± X“¬²Ïy” ²z•$ ²#”ž ²4f•Ö ²u~¡¤0²# ÊrT²°,§ðž²jM–hž²õx–¾´²§*—:ܲ""—°Ü²#—&ܲó`—¶ܲ)d˜Vܲ@w˜$b³s;ƒÐq³˜:‡vÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ00#‡\ 1gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðW  Ó=ÀJ; Žf Ó=À¯”Dù±oŒ@\±D@  ­D"0h;¯Ph¯”  ­D"lw �‚Á %¦’Ò¥[Ö¥<æ Ä,÷ („‡æÄe÷ …‡Á Å5ÿ ó‹s‘‡…¡Á ü±‡Á „DáÄ wù±oŒj\±DöW  ÎíÃB; v Îíï”D  ­D"0€s³³.hs³³h¯”  ­D"€&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡TaÞ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡|±‡šW  ÎíÃ:" Kq Îíï”D  ­D"02b³Óh¯”  ­D"6141612Áepðµl2l0p‡xW  ÎíÃ:JÀ+ Îíï”D  ­D"0b³—Gh¯”  ­D"8Áe2 ‡~W  ÎíÃjy[M Îíï”Dq³¯:@i³‚@ù±oŒ@  ­D"0Æe³$™h<e³?™hha³—Kh(a³[Mh¯”  ­D"€0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w  Á�   ìì� .Â% ÷ ÕeB 00#�5TADATADATADATADATADATADATADATADATAÁÁ �ÁUBù±oŒni³‚N|€Á5ÁUU�Á‹åÕÄ÷ ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡$q³¯:ŒW  Î¥ÆJ%¦S ΥƯ”D  ­D"0 ²Ëh ñ¯4}h f³Ðh¯”  ­D"ð‹*±‡ð*‡¶W  ÎíÃRÔ Îíï”Dm³lE@e³²Z@r³®S@  ­D"0 d³?!h¯”  ­D"$÷ ‡f÷ �†&œ*÷ °•*±‡r³®Sm³lEe³²ZìW  ÎíÃbÔe" Îíï”D„¯½`@ù±oŒ@d³?!@f³Ð@s³þ}@  ­D"0:¥¯ÜKh¯”  ­D">w ð*ð 8B÷ ‡pB÷ ‡ðµ÷ 0 B÷ ‡ ù±oŒ„¯½`$s³þ}2d³?!:f³ÐNW 4ÓíÃ2l´'4Óíï”D  ­D"0¯”NW 4ÓíÃ2n X4Óíï”D  ­D"0¯”–W 4Ó­½Jz´'4Ó­½¯”Ds³³.@f³t:@  ­D"0þd³;h¯”  ­D"€æ¦ƒ‚ÃåJ„”Ä¥[Ä¥<C…Å`¥ ¡>C÷ ˆÒ¥,÷ ~… 4ÃB‚ƒ‚× *‚㨂 DÄe $ $ $ ÷ ‡ñz ñññds³³.€|÷ ‡DEÅe     ýð•Ìÿ*1 ±‚ƒ‡ Ë•0‹¤þ‹¨‡—¢3‚¥÷ "÷ Ä ‹¨ ¥Ë”Ó”¦æ£˜Ä ýƒ‚‡‹¢‡Ê¥7f³t: ø‡¥‡ØW  ÎíÃZæÐW Îíï”D„¯½`@ù±oŒ@d³?!@a³VN@  ­D"04¬¯²'h¯”  ­D"8w ð*ÁeBð 8÷ ‡÷ ‡ðµ÷ ɇù±oŒa³VN"„¯½`0d³?!†W  ÓµÀR0!# ÓµÀ¯”D  ­D"0e³ŸMhe³¡Mhe³ Mhe³žMh¯”  ­D" ¡´‡ìW  ÎíÃRž!  Îíï”D  ­D"0le³&he³&hc³2 h\s³2 h.¯”  ­D"p÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡ìW  Î-ÊZ#t! Î-ʯ”De³?™@ù±oŒ@f³t:@s³þ}@  ­D"0Hà¯4h¯”  ­D"Lw ð*f¦÷ f‡÷ ‡ðµ! �‚f–P÷ ðÅ€)°B‚�‡ù±oŒs³þ}f³t::e³?™ÖW  ÎmÐz &˜@ ÎmЯ”Dó¯ø€@„¯½`@’±„:@�±}s@Õ±®S@°}@ü¯@†@ª²e;@h±ì&@Õ±à@h±²'@ù¯ X@zÕ±µW@ù¯üX@à¯çe@,°l@,°z@•±}@à¯4@ ±8r@Ö¯Ú}@¬¯²'@�±ÆíÃBŠ(ÀÚ>Æíï”D  ­D"0þ¬³y帰øuh¯”æW  Ó�Àbu'x Ó�À¯”D ²Ë@q³¯:@w³œ€@i³‚@ù±oŒ@  ­D"04ü¯@†h¯”  ­D"8w ÷ ðµ!÷ ‡& &æ÷ µÄ÷ Æe‡ ù±oŒ ²Ëw³œ€$i³‚0q³¯:BW  ÓíÃZö&`; Óíï”D°s@�±; @ù±oŒ@  ­D"0”ù¯üXhf³y:h ¯”  ­D"€w ÁDB‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±DÂÂe(¦„Äe$2ƒÃeäÿæÓÏÓ Ó(‹ÿˆ‡Ì%[]Ì%<> ƒù±oŒ °s@°s| ÷ „팂1 >‡ �±; vW >Æ­½ZŠ(#>Æ­½¯”D  ­D"0þ¬¯yäþ¬°yä°ùphþ¬±yäþ¬²y䯔W 4ÎíÃRœ,h4Îíï”Dp³h@d³;@a³VN@  ­D"0|g³©}h¯”  ­D"€ð*¦÷ ‚5‡ðµ)ðµ%EÅefffff f…Õ% ED•ÄDÓÄ%][Ä%><÷ ÷ …¥¥¥¥¥‡ññ1 ‡a³VNXd³;^p³h’W 4ÎíÃJœ,l4Îíï”Dg³©}@ù±oŒ@  ­D"0 ,°lh¯”  ­D"w  wù±oŒ g³©}�W 4ÎíÃJœ,z4Îíï”Dg³©}@ù±oŒ@  ­D"0,°zh¯”  ­D" w w00#—\ 1gù±oŒ g³©}–W  ÎíÃJüRK Îíï”Dq³¯:@i³‚@  ­D"0m³lEh¯”  ­D"÷ MÄwi³‚q³¯:ŽW  ÎíÃ:®SKq Îíï”D  ­D"0&m³oŒh¯”  ­D"*ƒ  �D„PÄ5Rà ý†R”‡R”R”à üøÀW  ÎíÃRTà Îíï”Dm³lE@ù±oŒ@a³VN@  ­D"0*±lEh¯”  ­D".w ð*ÁeBð 8÷ ‡ðµ÷ ‡ù±oŒa³VN*m³lE W 4ÓmÐJ:dh4ÓmЯ”D°s@d³;@  ­D"0’p³hh¯”  ­D"€ÂÂe(¦Ê ññ1 ÷ `£(£(£££‚÷ †� ‚÷ >âââââ‚:ƒô �ô�‚””à ý¡Á5°s<w÷ $ù±oŒ|d³;`| †wññ1 ‡Ã ÄÄ%ñ,ñ,ñññ:4Š× ±‡ p³h`W ?ÆWJódÀv?ÆW¯”D&s©À�@°s@  ­D"0Îp³ &h¯”  ­D"€æÁÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦°sV|f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß ±‡Ns©À�²W  Î¥ÆBe€p ΥƯ”D ²Ë@  ­D"08p³J,h¯”  ­D"<ð 8ðµ ðµðµ ÷ ‡ðÖ*±‡ðÃ*±‡$ ²Ë²W  Î¥ÆJeÀv ΥƯ”D ²Ë@  ­D"00p³K,hs³kh&¯”  ­D"4ð 8 ðµðµ÷ ‡ðÖ*±‡ðÃ*±‡ ²ËþW  Î¥ÆjDfT ΥƯ”D ²Ë@p³¿Z@ù±oŒ@r³,}@f³Ð@  ­D"0D ±8rh.�±„:h¯”  ­D"Hw ÷ ðµðÅ)÷ †ð¥öÿ*÷ w46l0ì‡ ù±oŒ ²Ëp³¿Z,r³,}0f³ÐŽW  Î¥ÆZkf`; ΥƯ”D ²Ë@d©°;@m© …@  ­D"0Èp³„ƒ‚€‡ÃEÿà à ÅÃ5ÿà à à Šø… ÃÃe0Ò�øŠÃà à à Šõ‡„W  ÎÀÁ:þvXu ÎÀÁ¯”D  ­D"0ù±oŒh¯”  ­D" &æ¦ff… Þ �‚ƒ„…‡ªW  ÎíÃJÞ³ Îíï”D„¯½`@f³Ð@  ­D"0"2²Xh¯”  ­D"&ð 8 ðµ!ðÕ€)wð•Öÿ*w„¯½`$f³ÐW  ÎíÃréƒKq Îíï”De³²Z@ù±oŒ@r³®S@a³VN@f³t:@  ­D"0,Õ±®Shù¯ XhÖ¯Ú}h¯”  ­D"0w ÷ ‡w‡w ÷ ú‡ww ÷ ó‡w8ù±oŒ a³VNe³²Zù±oŒa³VN r³®S$ù±oŒ(a³VN.f³t:W  ÎíÃrñ�h~ Îíï”Ds©À�@x³·k@°s@ñ¯4}@f³Ð@  ­D"0Zw³h2w³¼h"q³¯:h ¯”  ­D"^0Š+æ1ÿˆÅÅe à ÷ ß%ÿÿïp’*w÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ °sx³·k"s©À�.f³Ð\ñ¯4}¨W  ÎíÃRñ�H€ Îíï”Dw³@w³¼@ù±oŒ@  ­D"0™²`;h¯”  ­D"w wwù±oŒw³w³¼|W  ÎíÃ:ü�ÜY Îíï”D  ­D"0w³th¯”  ­D",*ÿÿ±‡æ1ÿˆ‡W  ÎíÃj™’È} Îíï”Dr³C�@w³Ô@r³§‘@a³—K@ù±oŒ@s³2 @  ­D"0Tª²e;h¯”  ­D"Xw ÷ $‡Ä0,0w÷ †46÷ ‡÷ ðµ)0406 0 ð‹*±‡&ù±oŒ r³C�r³§‘ s³2 .a³—K4w³ÔîW  ÎíÃZ±˜(_ Îíï”Ds©À�@°s@  ­D"0Vx³Çkhx³·khi³‚h>¯”  ­D"Z8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—ð•ÿÿ+‡ÅÅe$&Ä% Ä ý„‡8s©À�D°s´W  ÎíÃR±˜a Îíï”Dq³¯:@i³‚@ù±oŒ@  ­D"0Ѳ˜:h¯”  ­D""w ð*D÷  Õ ýwù±oŒi³‚ q³¯:ÀW 4εÀj:dvw4εÀ¯”Ds©À�@°s@ù±oŒ@a³VN@\±D@  ­D"0ðp³vwh ’±vwh¯”  ­D"€w ð*DÅ Å ýæ¦Y…‚T¦fÃÃeŠæ„ðµ<Ó•_‚ S•Ä ýó¥:ÿÿÓ•:‚ ƒ…¦æ& œ"& ΕæÏÿˆ‚4†×'�ÿù±oŒ0°s|s©À�x| ð*×'ëÿð¤ÿ*±*ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ ‡à ññ÷ ð•Éÿ*‚ƒ‡s©À�s©À�P\±Dha³VNüW  ÓÁz:dˆw ÓÁ¯”D&p³ &@s©À�@ä[;@p³iw@p³vw@p³¾w@ù±oŒ@a³VN@  ­D"0ê�±}sh p³# h*s³þ}h¯”  ­D"€ÁeBÉ ð 8÷ ‡$&w ð*ðµ<S1 ¦à Ö KÊ ñU€ò ñU@ò æ÷ ƒ‚f&œ" ÷ €�† a³VN&ù±oŒRä[;fp³¾wxp³ &r|‚×'�ÿ)×'ëÿð* ðÊ*Ä%0þðÌ*±‡NDÅ Å ý¦æ÷ ƒ‚÷ ñEÿû±U‡÷ ‡÷ ‡÷ ‡,s©À�s©À�s©À�Ja³VNbp³vwhp³iwnp³¾w¸W ?ÆWJ#L?ÆW¯”Dp³ &@s©À�@  ­D"00à¯çeh¯”  ­D"4¦&fæf  ÷ …ƒ�€†×'�ÿ±–‡‚¡‡p³ &"s©À�W  ÓeÀj &Š( ÓeÀ¯”D°s@  ­D"0þ¬¯yäþ¬°y䦰úph ± &hBþ¬±yäþ¬²y䯔 þ¬°yÿÿ þ¬¯yÿÿ((ÿÿ  ÿÿBBFF þ¬±y êW >ÆÀÚb‹¯�=>ÆÀÚ¯”D&p³ &@s©À�@¹«´‰@$9pw@‹¯00#§\ 1g@=@ û¬Cx0,‹¯�=h¯” û¬Cx€÷ ¦Âe°ÄeȵÄeà Ã~÷ ‡Á DE  ȵÄ2…Åe &Âe ÷ € †ß%'ðÕ@±^ÃeðÅÁ5€ ¹«´‰*‹¯@=Xp³ &`$9pwbs©À�€|ðÕÁ5@ðÕÁ5ðÕÁ58ðÕÅ“B„Äe€Ãe°ÈµÁeÄeÐÿ& q1””BÓ$ðñðñ8ø„Äe q1 ””Bð ñð ñ¡–‡.W  ÎÀÁz &, ÎÀÁ¯”Dæ)ø€HN<&È`Há)ìH>õ[üXHå)^H<&%H ìWµWHŒ&CyH\)ÖKH<&�H¼(yHâ)nEHzâ)sEH<&KqHîT–H â)ŽEH(¥ ³–HLä[;H&{PH`æ[à8Hö°HìWø€H&{ø€Hd6&HÄ%kfHÄ%ˆZH@dì&Hz¬ qH²ô'Ä…H¬ |H°æ)»H#ö)°H4ò)»HÄ%ëH¤ PdH ¦ Ò:H â)_GH)ï)ã‰HìWÞH€ä)TyH$ô'IRH&{¹ZHzìWzH@ô'¤’Hö)’H0â)ÌGHÄ%™wH@Ä%xH î[#HÄ%C�H â)2HH4í) H,ò)BxHí) H-<&%tH<&9€H© Ì`H$zá)[MH Œ&H¤ Ó%HBî)ÔpH<&°pH<&¶pHìW€wH¢ Š(H¤ 2&H(dÖ(HìWwH¬ i^HV¬ v^HPótè!Hí)w H.zò)ýHâ)PH8î)KqHô'ÄHF° xsHŠá[§YHætw(æ@w æBwæDwæFwæHw&À°-H ‚6lF¶€‡8°s W 4Î=ÀJÔ˜@4Î=À¯”Dù¯ X@¥¯ÜK@  ­D"0¬¯²'h¯”  ­D"ð 8ÁeB÷ ‡÷ ‡ù¯ X¥¯ÜK0W vÀÈz &ÿyvÀȯ”D  :©(}hœ:©¿`h˜ó¯ø€h4ž²fahxG©P}h„\±ŒÈh@Ѳ˜:hX:©ZŠh¤:©h °}h ü¯@†hPz<©P}hˆE©‹dh¼a©}h¬ª²e;hœ²2&hlé«@Qh°:©<hŒœ²€&hp¤¯ŒÈhDÕ±àhÖ±fahhd©°;h Œ©?Th€° €h$:©h�zœ²Ñ(htm© …h•±}h:©ÿh”Ô±2&h\ ±8rhLÔ±€&h`<©h´�±‹¯=B‹¯@=F\±ŒÈJ¤¯ŒÈN�±„:R ±8rVü¯@†Z™²`;^Ѳ˜:X^wwwwwwwwwwwwwwwwwwwww€Ô±2&Ô±€& Ô±Ñ(Ö±faœ²2&œ²€&œ²Ñ( ž²fa$ ©ày(Œ©?T,G©P}0<©P}4:©<8:©<:©ÿ@:©¿`D:©(}H:©L:©ZŠP:©Ï_Ta©}B²ww www¶^–%ö N ¶¶€æŽa† é«@Q<©Œ¯`r‹¯�=€W vÀÈz &pKvÀȯ”D„¯½`@’±„:@�±}s@Õ±®S@�±; @h±ì&@;¯P@h±²'@œ«@ù¯ X@Õ±µW@ù¯üX@zà¯çe@,°l@,°z@à¯4@�±v@Ö¯Ú}@¬¯²'@s©’±¾wB�±vF;¯VNJ,°lN,°zRà¯4VÖ¯Ú}Zù¯ X^Õ±®S"^wwwwwww22²X±lE ¥¯ÜK¬¯²'Õ±µW’±„:s©�±“yh^™²`;h¢Ô±Ñ(h²¡«h⌯`rhB’±iwh2•± €hb�±„:hj’±vwh6h±p!h ©àyh*:©Ï_h’±¾wh:2²Xh‚¯” w:6  66,6¶^–%ö N ¶¶€æŽa† ØW vÀÀÁz„(jLvÀÀÁ¯”D:©(}@:©¿`@ó¯ø€@ž²fa@„¯½`@’±„:@�±}s@G©P}@\±ŒÈ@Ѳ˜:@:©ZŠ@Õ±®S@z:©@°}@ü¯@†@<©P}@a©}@ª²e;@œ²2&@h±ì&@é«@Q@:©<@œ²€&@¤¯ŒÈ@Õ±à@Ö±fa@d©°;@zh±²'@œ«@Œ©?T@ù¯ X@° €@Õ±µW@:©@œ²Ñ(@ù¯üX@à¯çe@:©ÿ@m© …@•±}@,°l@,°z@zÔ±2&@à¯4@ ±8r@Ô±€&@<©@Ö¯Ú}@¬¯²'@s©ª²e;B° €F�±{H$9ƒKHåÿ”}×xH$9‘;H¥ÿ%{!™H´:GH <™ewHM”}€QHm”}xQHlz$9ÖWHÙÿ$9ÛWH×ÿ´:i;H¤wi8H ~[qH<™šwHA{ÎåHT;HT;H,w²H,w«H|ws,H$9!XH²ÿC{€»H$92XH¸ÿz´:ó.H´:ûH ~ qHt*ŒsH ~)qH€´:HH´:óH´:/SH ´:2“H´:AH$9‡XH»ÿ<™-H”}âyH<™4HJ,w9qHz”}òiH8$9«pHÔÿ$9¬ Hÿÿ”}»yHbÌwËxH t*·H”}ÓíH7t*ÎH<™$H´:šH€´:œSH´:ŸHˆ´:¤H t*ÊsHT;3Hz¤wÆ8Ht*ä3H@A{òH ~ìYHl�÷H%?{0ÀH$9yXHÄÿ ~ö H5™„¯H$9) HÌÿv�ŽÆH v��ÆH´:6H@”}„:HW”}ŒzHhz´:GTH $9¼pHÓÿ”}”H?”}•RHe$9Õ HÈÿ$9×pHØÿ$9ÛdH­ÿ5™²¯H$9ãpHñÿT;ðHT;ùsHT;ü�H$9û H¾ÿ ~urHv�“ÆHz$9qHÒÿ¤wDyH5™|¯H¤wLyH$9)Høÿv��ÆH$92 HÎÿ´:ü_H”}O:H ~brH$9RqH¨ÿl�álH"$9[qH¤ÿ$9ZqHàÿ@{NÀH z$9nYHÛÿ$96 HÉÿ$9weH˜ÿ”}¼HC$9€}Hõÿ@{0ÀHl�ßlHl�àlH”}ÊH¤wÎ…H ´:ÃHÌw»yHt*©„H$96MHëÿ ~¶rH z$9³YH³ÿ,wTZH´:ƒHv�ãÆHB{NòH´:«H´:—`HÌwóyHPÌwôyH@$9kYH±ÿ”}ðjHk´:®H´:¬pH´:´pH´:µpHz´:· H´:¼pHv�ÇH$97Hóÿ$9H”}D;H´:qH´:Hz´:qH,wäfH´:"qH€´:&qH ´:&H´:$qH´:.qH´:(qH$9¾YH¼ÿ”}™H&$9Ä HÀÿ$9ÄYH¢ÿ´:WHP´:a H$9ÜYHéÿz,w{Hùÿ ~sH´:TqH´:RH$9Hèÿ”}ôHU$9ZZH¶ÿ´:“H ´:ÁH´:t H´:ÄqH´:ÅH8´:ÊH$9CfH¢ÿ$9DfH¹ÿz ~ÀƒH´:éH´:¨H ~´sH$9Z&H›ÿ$9bHºÿ$9`&HÏÿ ~ô�H$9kHìÿ$9{H»ÿ<™H$9~ZHæÿ,wHúÿ´:q!H $9�ZHîÿz$9ŒZH°ÿ”}`H`´:©-HA{0ÀH $9²ZH©ÿ´:x Hv�ØËH;L…H”}4H ~ŒsH´:•H´:šH ÌwëvH�´:ž!H´:£-Hz´:¤}H`”}®Hj$9[Hªÿ$9'H÷ÿ$93Häÿ$9[H©ÿ$9H£ÿ$9H¡ÿ,w³WHýÿ´:ìH$91Hùÿ$93gHýÿ´:òHˆ´:ù-H ~$�H@z´:ùH5™^±Hl�ŽÆH5™f±H ´:#"Hu�VYH”}yHR”}ƒH;E{ÎÌH?{pÆH$9½rHÍÿ$9Å&HÅÿ”}£Hi´:brH´:crHz$9ÙfHðÿt*b†H@´:krH $9½HÊÿ´:vrH@t*ÊH5™Ù±H Ìwë+H€´:œrH”}¼pHk� |H´:³rH ´:±rH ´:µrH´:¶rH0z´:¸2H´:ÂrH8´:ÃrH”} HD$9BHýÿ5™$²Hl�ÞÆH5™5²H”}8}H%$9g'H§ÿ$9n'H¯ÿ<™_Ht*¶zH$9�sHïÿ$9¦H´ÿz$9°HÕÿ?{pßH ~:‘H€´:[KHÄkZŠH”}«qHV?{�ÓHt*GH$9è'HËÿ$9ë�Hãÿ$9ü�Háÿ$9HÁÿ$9 H¦ÿ”}V}H9”}H H>z´:sH ´:sHx”}]}HA”}UqH6´: sH´:#H´:sH ”}c}H@œ*@wH5™Q²H¤w:dH´:ÌKH?{@øH´:ÑKH$9š�Hßÿz”}óH:”}¿ HS´:ä3H@´:{3H´:|sH ”}ÉH<´:†sH`´:ŒsHœ*¶wH ”}ãH=´:£sH´:©sH´:­sH€´:«sH0´:´sH z ~¢‘HT;8H´:¦sH´:©KHl�ÎÇH $9C�Hªÿ´:¯KHH”}Á!H ´:ÝH$9VH÷ÿ$9XHÇÿ ~Û‘H´:¤sHP$9|Híÿ´:4Hz´:tHT;œwH$9.…Hûÿ´:-tH`´:,dH´:1˜H”}|ŠH ´:74H¤w´‰H<™pTHL$9…HŸÿT;HT;`HE{ÀÚH´:˜Hz$9+…H«ÿ´:òsHœ*@,H”}I"H¤wÚ}Ha� |H$9xQH¯ÿ$9ƒ…Hüÿ<™3}HNa� |H<™DH\$9ª5Húÿ$9«‘HôÿÌwË-Hpœ*· Hz”}ã~HX ~¶zH€”}ö2H-™°H”}ü2H ´:½LH”}HcG{ÎåH$9.’H«ÿ”}ˆKH,wÞHûÿ´:+H$9†H·ÿT;²H”}ˆsHz$9Î…Hÿÿ´:[uH<™s!H´:bYHX”}T3H´:kYHT;H ~GH ´:\MH”}âWHB”}€HdT;DyH”}˜HF´:ÔH-™'±Hz-™(±H´:ÜH”}0€H-™?±HÿÿT;�H <™..HO$9ŸHñÿÌw».H`´:nMH$9±RH�ÿb�ßSH´:�H´:ƒMH@¤w'H”}ÞHEzt*Ö‰H€”}ä3H$-™“±H$9ðHžÿ”}KXH'´:9NHT; zHT;zH”}:dH#™´¯Hœ*H@´:NHt*I"H ´:)NHT;¬!Hz´:+NH(´:8&H;–H<™ZŠH]$9¼^H¿ÿ<™S~H_$9ÌHùÿ´:&Hh<™u~H[´:{HT;;"H”}™H”}5HZT;I"H›#™Ö¯Hz´:âH`´:sH$9pwH�ÿ¤w¼WH$9œSHëÿl�8 H”}�MHl�Ž H´:KwH´:[H€ ~L H´:iwHl�Š H$9ü_H½ÿl�Œ Hz$9`Hûÿ$9#H¬ÿ$9'H¬ÿ$9.HÞÿ”}:YH´:>wH€-™[²H”}`YH ´:÷vH$9ˆHöÿ$9‹Hâÿ´:n'Hl�+ H#$9£8H§ÿ$9¯HÚÿz´:owHv�Ó�H´:èH”}ËHT´:‹wHP´:”H´:œwHt*çH ”}ZH<™/€HQ”}ö H5´:±'H ;ƒKH€$9=xH™ÿ<™á‹Hz¤wðXH l�Ö H00#¿5TADATADATADATADATADATADATADATADATAl�ØËH$´:éƒH”}8&H4<™€HP|wÔ€H´:„H(œ*4H´:„H ¤w’MH ”}kH" �œwH´:$�H@´:)Hz”}vNH´:C�H(´:9H $9¶ÈHÐÿ<5sH$9½8HÑÿ”}”fHgl�Q\Hs�®H ~I"Hv�¿‚H ´:d�H`´:h�H ´:H,w�!Hüÿz$9õ8H¤ÿ$9óxHÝÿ$9H ÿ ~{–Hv�–‚H$99HŸÿÌw&qH0”}ŒZH$99H®ÿ$9&Hêÿœ* XH?{ÎÌH ´:ô�H$939Hþÿ´:ü�Hz´:ýH ”}(gHfÌwÎH$9kyHÜÿ,w4FHÿÿ#™ý±H-™´HT;”˜H$9•yHòÿ$9ž!Höÿ$9L H°ÿ$9®!Hõÿ$9¬!HÂÿ´:ÌxHH¤wö Hzl�öÌH!”}ÙfH)”}õH!´:¯xH �BxHÿÿ$9BaHîÿ$9CyHúÿ$9E9Hçÿ$9IyHœÿ´:×xHpd�—}H $9,:HÖÿ”}JwH ¤w{ZH ´:+…H z”}ˆH´:ByH´:FyH <™^qH^ ~5H@”}HwH ,wÃHþÿT;ÛdH€œ*€H”}³wHY”}¶wH$9ëyHÆÿ ~H€#™²H´:WyHHzT;*}H ´:áyH´:³‘HT;7H$95:H ÿ$96:Híÿ´:ÇyH ´:ËQH”}ÛƒH/”}݃H1´:Û‘H´:éQH´:ãyH@$9ZŠHüÿT;$qHz”}ÙƒH-@{NÙH”}ÞƒH2”}߃H3$9ƒ:Hþÿ,wH?{NòH $9¨:H­ÿ´:´‘H´:wQH´:|…H"´:¶‘H@”}׃H+”}ÖƒH*”}ÚƒH.z”}܃H0”}؃H,´:áQH´:¢‘H´:£‘H;@jHu�¯yH�u�±yHƒ$9ý:H¥ÿ$9#Hµÿ$9Ò:H¡ÿ$9";Hšÿ �|…H´:ïQH´:ðyHzu�®yH€u�°yH‚´:azH´:’Ht*›NH€”}](H#œ*8&H€´:4FH ”}’(HG´:A†H0´:B’H ´:D’Hpu�²yH„<™iH$9ÕzHžÿJ´:i†H<™|HK”}¶xH( ~^˜H@v�˜‚H v�›‚H v�ÇH ¯”W ŒÆ€ÀzYMŒÆ€À¯”D¸s©À�@ò[ÿ@í[Kr@ä[³}@ï[Œ@ó[\}@ó[¥@ù±oŒ@$9Ba@ ­ì]0ª¯ªàh*ù¬ÚK0ù¬o†0 ô¨ hý¨Xh¯” ­ì]€¢L‡w ÁDœBÊ ±A°, °,ò5Âeaí¡‡„ôE€ò5 „ôE€ÊE f& ¢‡& ¢  ù±oŒï[Œó[¥ó[\}nò[ÿ2|‡1 ù ñ  Ü…„Þ ‡ßw6ä[³}í[Krä[³}*$9Baÿ ,s©À�0ù¬ÚKù¬o†‡ßw$9Baÿ  s©À�ù¬ÚKøW ŒÆÐÀzœ à`ŒÆÐÀ¯”D¸ò[ÿ@í[Kr@á[ÚK@ä[³}@ï[Œ@æ[L @ù±oŒ@ ù¬o†0^ô¨ h,ô¨hô¨ hP2ý¨Xh­ó4 ­¨t ­Ðt ­øt¯” ù¬o†b÷ ¦Þ5Îe¦w Á… Bv ù    ù ‡Ê €‚Ê5ò÷Bwwù çF ­¨ù±oŒ ï[Œ.í[Kr8ò[ÿPä[³}V ­ÐZ­ó^á[ÚK ­¨&À°Œ€æcÿˆpŒ€‡ï[Œ æ[L æ[L  ­Ð fÁ±Œ€‡æeÿˆqŒ�‡ï[Œ æ[L æ[L BW ŒÆÐÀzœ À]ŒÆÐÀ¯”D¸ò[ÿ@í[Kr@á[ÚK@ä[³}@ï[Œ@ù±oŒ@ ù¬o†0Vô¨ h&ô¨hô¨ hJý¨Xh­ó4¯” ù¬o†Z¦Þ5Îe‡w Á… Bv ù    ù ‡Ê €‚Ê5ò÷B‡wù è.ù±oŒï[Œ(í[Kr2ò[ÿJä[³}R­óVá[ÚKšW tÀ0ÀjŒ(xQtÀ0À¯”D¸s©À�@¹«´‰@æ[xQ@T;œw@ þ¬íy4ŠÃ©v~hp©Ó  ­øt¯” þ¬íy ñæ[xQp©ÓÑ( þ¬íy€æÿˆ×-ñ‡÷ ¦ƒD- ‚ŠEŠ… %µ¬ Âó … Â ÀœÁÀ À À ÀU€À �€ÈEðU* p©Ó s©À�T;œw  ­øæ[xQ¹«´‰ ‚€Ö ‡  ­ø‡4W >ÆÈz6aã8>ÆÈ¯”D¸ô¨ @æ[xQ@í[Kr@ä[³}@ï[Œ@ó[¥@ù±oŒ@é[Ì`@ ­Kr4¬Éª2qhɪ3qhzɪ#qhɪ;rhɪJrhɪ3&hɪKrhɪ#&hɪ2&hɪ;'hɪK'hɪJ'h ­ÿ4T”«�wh­ó4P ­¨t ­Ðt ­øtù¬ÚK0¯” ­Kr€Ê5R„ ´Å J¦ƒ1 r-€‚ù… ;Dt-ÍE ÍU+ÍUDô,ñ qÄ õ ô €ôE€ù "ä[³}^ä[³}dä[³}~æ[xQ4|õ5 õ  Dô €ôE€ù EÍ5€¼‚‡$æ[xQ ­ÿ€ÊEW¬X‡ò 5ƒ2ó /�Äô �& 4 &æ9ÿˆ´ †&æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€wÐ ó[¥€|ò5ò ƒó �ó îææuÿˆ†óE ææuÿˆá‡óU€Ê5`AÊU ò & ¦ÎEð& & ¦¦ÎE& DÄe&æfæré[Ì``øæ ÿˆ$‡Ì‹"�ò5ò & ¦& & ¦¦& DÄe&æfæHæ ÿˆ‡Ì‹�¡‡ÊE ÊU±‡6é[Ì`­óTƒ¦)„ÔÔÔÔÔÔÌÔaÔŒwÞ 6 ÷ w Á‚ ÃÃeö ù 1 wÎ ‡0" ­00#Ç\ 1g¨, ­Ð0ù±oŒ4ï[ŒFí[KrJä[³}Nô¨ 8W >ÆÈz6aò8>ÆÈ¯”D¸s©À�@æ[xQ@ó[¥@é[Ì`@ ­Kr4–ɪ2qhɪ3qhɪJrhɪ3&hɪKrhɪ2&h:ɪK'hɪJ'h ­ÿ4B”«�wh­ó4 ù¬ÚK0¯” ­Kr€Ê5G„ ´Å ?¦ƒr-€‚ù… 2Dt-ÍE ÍU"ÍUDÄ õ ô €ôE€ù õ5 õ  Dô hæ[xQ|€ôE€ù EÍ5€Å‚‡æ[xQ ­ÿ€ÊEW¬O‡ò ,ƒ)ó &�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€wÐò5ò ƒ ó[¥€|ó �ó îææuÿˆ†óE ææuÿˆá‡óU€Ê5`AÊU ò & ¦ÎEð& & ¦¦ÎE& DÄe&æfææ ÿˆ$‡Ì‹"�ò5`é[Ì`Nøò & ¦& & ¦¦& DÄe&æfæHæ ÿˆ‡Ì‹�¡‡ÊE ÊU±‡$é[Ì`­óßîws©À� ù¬ÚK¾W >ÆÈz6aì8>ÆÈ¯”D¸é[Ì`@ ­Kr4Fɪ3qhɪ3&hɪKrhɪK'h ­ÿ4””«�wh­ó4ù¬ÚK0¯” ­KrJÊ5¦ „Ê5€ ‚Ê5øà öƒô…2Å Å ÍUEÍ5€÷‚‡  ­ÿ€ÊEÊ5@?ò & ¦ÎEð& & ¦¦ÎE& DÄe&æfææ ÿˆ$‡Ì‹"�ò5ò & ¦& & ¦¦& DÄe&æfæH2é[Ì`ré[Ì`|æ ÿˆ‡Ì‹�¡‡ÊU±‡ ­ó‡TW >ÆÈz6aã>ÆÈ¯”D¸ô¨ @æ[xQ@í[Kr@ä[³}@ï[Œ@ó[¥@ù±oŒ@é[Ì`@ ­Kr4~ɪ;rhɪJrhbɪKrhɪ;'hɪK'hɪJ'h ­ÿ4씫�wh­ó4P ­¨t ­Ðt ­øtù¬ÚK0¯” ­Kr€Ê5;„ ´Å 3¦ƒ1 r-€‚ù… $DÍUt-ÍE Dô,ñ qô €Ä ôE€ù EÍ Ó�‚"ä[³}Zä[³}`ä[³}tæ[xQ|‡  ­ÿ€ÊEò ÊU ‡æ&W¬2‡ƒ/ó ,�Äô �& 4 &æ9ÿˆ´ †&æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óUó[¥t|€¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡<é[Ì`­óTƒ¦)„ÔÔÔÔÔÔÌÔaÔŒwÞ 6 ÷ w Á‚ ÃÃeö ù 1 wÎ ‡0" ­¨, ­Ð0ù±oŒ4ï[ŒFí[KrJä[³}Nô¨ bW >ÆÈz6aò>ÆÈ¯”D¸s©À�@æ[xQ@ó[¥@é[Ì`@ ­Kr4hɪJrhɪKrhɪK'hɪJ'h ­ÿ4Ú”«�wh­ó4 ù¬ÚK0¯” ­KrlÊ50„ ´Å (¦ƒr-€‚ù… DÍUt-ÍE Dô €Ä ôE€ù EÍ Ü�‚‡^æ[xQ ­ÿ€ÊEò ÊU ‡æ&W¬)‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€¡„ƒ.‡Ê5`.ó[¥b|ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡*é[Ì`­óßîws©À� ù¬ÚKrW >ÆÈj6aì>ÆÈ¯”D¸é[Ì`@ ­Kr4BɪKrhɪK'h ­ÿ4l”«�wh­ó4ù¬ÚK0¯” ­KrFÊ5¦ „Ê €‚Ê5ùà ÷ƒõ…2Å Å ÍUEÍ ø�‚‡  ­ÿpÊEò ÊU ‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡<é[Ì`­ó‡W tÀXÀz9axtÀXÀ¯”D¸ô¨ @í[Kr@ä[³}@ï[Œ@ó[¥@ù±oŒ@é[Ì`@ ­Kr4Ôɪ3qhɪ2qhɪ#qhZɪ;rhɪJrhɪKrh ­ÿ4T”«�wh­ó4P ­¨t ­Ðt ­øtù¬ÚK0¯” ­Kr€„1 ¦Ê5‚ú‚‡ò û¦¦‚ Ž BÊ5BÊUW¬/‡Ä -ò ƒ'ô,±Ä ó €ææwÿˆóE€ò5ò  ä[³}<ó[¥\ä[³}\|ƒó  €ææwÿˆóE€Ê5 ÁÊE Ž‚¾Ö ‚­W¬³‡Ê5 °Ä ®„,«ÊE é@ó[¥ ­ÿ€ÊEW¬X‡ò 5ƒ2ó /�Äô �& 4 &æ9ÿˆ´ †&æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€wÐ ó[¥€|ò5ò ƒó �ó îææuÿˆ†óE ææuÿˆá‡óU€Ê5`AÊU ò & ¦ÎEð& & ¦¦ÎE& DÄe&æfæré[Ì``øæ ÿˆ$‡Ì‹"�ò5ò & ¦& & ¦¦& DÄe&æfæHæ ÿˆ‡Ì‹�¡‡ÊE ÊU±‡6é[Ì`­óTƒ¦)„ÔÔÔÔÔÔÌÔaÔŒw00#Ï5TADATADATADATADATADATADATADATADATAÞ 6 ÷ w Á‚ ÃÃeö ù 1 wÎ ‡0" ­¨, ­Ð0ù±oŒ4ï[ŒFí[KrJä[³}Nô¨ >W tÀXÀz9aÐtÀXÀ¯”D¸s©À�@ó[¥@é[Ì`@ ­Kr4Äɪ3qhɪ2qhɪJrhɪKrh ­ÿ4B”«�wh­ó4 ù¬ÚK0¯” ­Kr€„¦Ê5‚ú‚‡ò û¦¦‚ Ž <Ê5<ÊUW¬)‡Ä 'ò ƒ!Ä ó €ææwÿˆóE€ò5ò ƒó  €8ó[¥L|ææwÿˆóE€Ê5 ÇÊE Ž‚ÄÖ ‚³W¬¹‡Ê5 ¶Ä ´„,±ÊE é0ó[¥ ­ÿ€ÊEW¬O‡ò ,ƒ)ó &�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€wÐò5ò ƒ ó[¥€|ó �ó îææuÿˆ†óE ææuÿˆá‡óU€Ê5`AÊU ò & ¦ÎEð& & ¦¦ÎE& DÄe&æfææ ÿˆ$‡Ì‹"�ò5`é[Ì`Nøò & ¦& & ¦¦& DÄe&æfæHæ ÿˆ‡Ì‹�¡‡ÊE ÊU±‡$é[Ì`­óßîws©À� ù¬ÚK¦W tÀXÀj9aàtÀXÀ¯”D¸é[Ì`@ ­Kr4>ɪ3qhɪKrh ­ÿ4””«�wh­ó4ù¬ÚK0¯” ­KrB¦Ê5‚ú‚‡ò û¦¦‚ Ž Ê5ùÊUŽ‚öÖ ‚å  ­ÿ€ÊEÊ5@?ò & ¦ÎEð& & ¦¦ÎE& DÄe&æfææ ÿˆ$‡Ì‹"�ò5ò & ¦& & ¦¦& DÄe&æfæH2é[Ì`ré[Ì`|æ ÿˆ‡Ì‹�¡‡ÊU±‡ ­ó‡bW TÇøÀz3ax}TÇøÀ¯”D¸ô¨ @í[Kr@ä[³}@ï[Œ@ó[¥@ù±oŒ@é[Ì`@ ­Kr4¬Éª;rhɪJrhɪKrhB ­ÿ4씫�wh­ó4P ­¨t ­Ðt ­øtù¬ÚK0¯” ­Kr€„1 ¦Ê5‚ú‚‡ò û¦¦‚ Ž .Ê5.ÊUW¬‡Ä ò ƒô,±Ä ó  €ææwÿˆóE€Ê5 ÕÊE ä[³}<ó[¥\ä[³}4| Ž‚ÒÖ ‚ÁW¬LJÊ5 ÄÄ Â„,¿ÊE éó[¥ ­ÿ€ÊEò ÊU ‡æ&W¬2‡ƒ/ó ,�Äô �& 4 &æ9ÿˆ´ †&æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óUó[¥t|€¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡<é[Ì`­óTƒ¦)„ÔÔÔÔÔÔÌÔaÔŒwÞ 6 ÷ w Á‚ ÃÃeö ù 1 wÎ ‡0" ­¨, ­Ð0ù±oŒ4ï[ŒFí[KrJä[³}Nô¨ ŠW TÇøÀz3aÐTÇøÀ¯”D¸s©À�@ó[¥@é[Ì`@ ­Kr4œÉªJrhɪKrh ­ÿ4Ú”«�wh­ó4 ù¬ÚK0¯” ­Kr€„¦Ê5‚ú‚‡ò û¦¦‚ Ž (Ê5(ÊUW¬‡Ä ò ƒ Ä ó  €ææwÿˆóE€Ê5 ÛÊE Ž‚ØÖ ‚8ó[¥$|ÇW¬͇Ê5 ÊÄ È„,ÅÊE éó[¥ ­ÿ€ÊEò ÊU ‡æ&W¬)‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€¡„ƒ.‡Ê5`.ó[¥b|ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡*é[Ì`­óßîws©À� ù¬ÚKjW TÇøÀb3aà~TÇøÀ¯”D¸é[Ì`@ ­Kr4>ɪKrh ­ÿ4p”«�wh­ó4ù¬ÚK0¯” ­KrB¦Ê5‚ú‚‡ò û¦¦‚ Ž Ê5ùÊUŽ‚öÖ ‚å  ­ÿtÊEò ÊU ‡¡*‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡@é[Ì`­ó‡fW  ÓíÃbö&€ Óíï”Ds©À�@°s@�±; @ù±oŒ@  ­D"0ªù¯üXhf³y:h ¯”  ­D"€w ÁOB‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±DÂÂe(¦„Äe$2ƒÃeäÿæÓÏÓ Ó(‹ÿˆ‡Ì%[]Ì%<> ƒù±oŒ °s@°s2| ÷ „팂1 >æ€æÉÿˆ‡ß‹�± J‡ �±; (s©À�FW  Î¥Æj7q„s ΥƯ”Ds©À�@ ²Ë@x³Çk@°s@i³‚@  ­D"0‚r³C�hw³Ôh*¯”  ­D"€ð 8 ðµ ðµð �¡‡ð•Öÿ*±‡÷ ÷  4 6Åå ÁB…„ƒÅeÃå»Áe‚‡…D&&÷ \Е-�÷ Е-�'÷ V‡w DÅ… ƒ÷ &p¹«WŒ€tЕ.À À À ce÷ À …Е:÷ Å ù Â÷ B‡Á% Á &À÷ €G`ЕJЕAЕN‡Ð•FЕEЕB‡Ð•MЕi©€‰>:©<XݪK€ðAЕR‡Ð•AЕPЕR‡Ð•MЕAЕY‡Ð•JЕUЕN‡Ð•JЕUЕL‡Ð•AЕUЕG‡Ð•SЕEЕP‡Ð•OЕCЕT‡Ð•NЕOЕV‡Ð•DlЕEЕC‡œW °ÇzíÄ.°Ç¯”D:©¿`@:©ZŠ@:©@<©P}@a©}@¹«WŒ@é«@Q@:©@:©ÿ@<©@[©(}@:©Ï_@* Zg`©°Zg(ª0Œ©?Th¯” Zg(ª€w && D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ À ÀCƒ ÷ DÖ ÜЕ%„Ì¥Vå ‡A¦¶6D‡¹«WŒB<©P}€|÷ (Š€‡Ð‹à üÀ ‡•— <ð— >óÂåA×�— Ô ‡`Ï)9HËÊÒÈÇÆ%EKQNdi%¼»vhlAP”à ý‡AЕ €øB”f�‚÷ �à õ‡& æÎe6& ¦æÎe/& æÎe*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎe & <:©:©ÿ ,:© 6<©( x:©¿`j €t¦æÎeЕ A‚¦Þ à ÷–%‡& æÎeòA÷ à û‡Ð• à ü‡A÷ E‡AÂ÷ E‡Ð• Aæ÷ AÎ ûÖ Â ÷ $Е.÷ : :©Ï_x *:©˜ 2[©(}Ha©}Té«@Qf[©(}~[©(}0ðÂ÷ AЕ; ÷ à à‡Â ýð¥ ÿÿùÀ ø:©ZŠ”W tÀ0À: tÀ0À¯”D ,ú¨@,hú¨C,h¯” 0ƒÎe¦à Ê —®ÿÿ—®ÿÿ Ò ñ‚‡ÒW XÀzNy …XÀ¯”DN©ÛH›©€QH ©ÛHN©BxH ›©BxH ©€QHN©:dH ©BxH›©ÛHN© H þ¬¨ ä: ©\}hN©t!h›©t!hN©\}h›©\}h ©t!h¯”‚W tÀ0À2­xxtÀ0À¯”D "$©CTh¯” & @€ @€‚W ÐÀB*¯¤`ÐÀ¯”Dܲó`@ ke(ª0Ÿ sh¯” ke(ª ÀSw ܲó`¼W XÀBÀ€WXÀ¯”Dܲ#@ܲGd@ <À€Wh¯” @ÂÁ÷ ¶¶Ÿ�A’v�öÎ ¶ŸÎÏwܲGd>ܲ#W €ÀB3à€À¯”DܲGd@ ke(ª0ˆ3àh¯” ke(ª€ÂÁ÷ �‚C …Æå‚€&æqÿˆñF¦rÁeüÿ @ÅAE2„cD!†Á Dï²2°rÁÁܲGd|8ÿ– €H‡ªW €ÀJ4Ùf€À¯”Dܲ#@ܲGd@ ke(ª0"4Ùfh¯” ke(ª& ÷ & CÎÊCÉæ w ܲGd$ܲ#rW tÀ0À: tÀ0À¯”D  ú¨@,hú¨C,h¯” ƒÎe‡¶W øÀJF øÀ¯”Dܲ#@ܲGd@ ke(ª0.F h¯” ke(ª2ÂÁ>÷ qqqžQ–Ñ•áÎÏwܲGd0ܲ#¢W øÀJ;¯VNøÀ¯”Dܲ#@ܲGd@ ke(ª0F VNh¯” ke(ªÂÁ÷ RRRæwܲGdܲ#îW €Àrr À+€À¯”Dܲ#@ ke(ª0D¢À+h!!À�h‘À�h2À+h xQh}…Àh$r À+h¯” ke(ªHÀ9À7À; ÀuÀwÀyÀ{D& f¡‡W#ÿÿv&wFܲ#ÖW ÐÀRb³s;ÐÀ¯”D00#ß5TADATADATADATADATADATADATADATADATA V9€phBìYh@; (hv8hª:h¯” Z÷ L@W‡÷ @@@‡÷ 8@ ‡Õ A B€Âe— †Â Á @ ûí �@‡÷ A@@K@P‡Õ @‡‚W ÐÀBy¯XÐÀ¯”Dܲó`@ ke(ª0ö,h¯” ke(ª Àw ܲó`¨W HÁJ†¯THÁ¯”Dܲ#@ܲGd@ ke(ª0 ö`Th¯” ke(ª$ ÷ ƒæ& ææw ܲGd"ܲ#šW øÀJ³¯ˆøÀ¯”Dܲ#@ܲGd@ ke(ª0{ˆh¯” ke(ªÂ ÷ æ_w ܲGdܲ#šW  ÁJÖ¯L Á¯”Dܲ#@ܲGd@ ke(ª0q!òyh¯” ke(ªÂ ÷ æew ܲGdܲ#šW øÀJÖ¯ˆøÀ¯”Dܲ#@ܲGd@ ke(ª0q!ˆh¯” ke(ªÂ ÷ æaw ܲGdܲ#2W <ÁXÀzÞ¯g'<ÁXÀ¯”Dܲ#@ܲGd@ ke(ª0Z #n~h(I&}h.²0 hïyeh@ñ�~h"œw0 h#}h:õ}@h4Ë:Kh ¯” ke(ª^ÀÀ!À# ÷ Î#wÀ)À5 À±ÀÑÀÀ‡Â�÷ CÒ&wܲGd$ܲ#PܲGd\ܲ#ªW €ÀJ#Oq€À¯”Dܲ#@ܲGd@ ke(ª0"#Oqh¯” ke(ª& ÷ ÄCÃÒÄ úæYw ܲGd$ܲ#¢W €ÀJ#€€À¯”Dܲ#@ܲGd@ ke(ª0#€h¯” ke(ªÂ ÷ f¦ æYw ܲGdܲ#˜W tÀ0ÀB‰'dtÀ0À¯”D ke(ª0(‰'dh‰'àeh¯” ke(ª,A@=‡BA@=½‡ÂW XÀJ‹(XÀ¯”Dܲ""@ܲ#@ܲGd@ 4‹(h¯” 8ÂÁ<÷ ÁeBÉ ‰¡¡¡ ææÏwÀ€÷ ܲGd.ܲ#6ܲ""êW  ÁRq³˜: Á¯”Dܲ#@ܲGd@ ke(ª0Zñ’˜:h·kh¯” ke(ª^À À & & & & ÂÁ`÷ ¶ fRCÃÒ�CÃÒ�RC  à ÒÒÒÒÒÒ&w ܲGd\ܲ#¤W €ÀJœ,Oq€À¯”Dܲ#@ܲGd@ ke(ª0œ,Oqh¯” ke(ª ÂÁ÷ & B‰æAwܲGdܲ#šW €ÀJË-–€À¯”Dܲ#@ܲGd@ ke(ª0Ë-–h¯” ke(ªÂ�÷ æqw ܲGdܲ#„W ÐÀ:,°òÐÀ¯”D ke(ª0œ,òh¯” ke(ª CË @ÊAW ÿÿHÐ ÷‡žW øÀJ,°VNøÀ¯”Dܲ#@ܲGd@ ke(ª0œ,VNh¯” ke(ªÂÁ÷ RæwܲGdܲ#¾W øÀJ,°ÄQøÀ¯”Ds©À�@ܲGd@ ke(ª06œ,ÊQh¯” ke(ª:Â�÷ �‚ÆåPæ)€&ÿˆÂ ÊÀ(Ö ‘“Α•À û‡ ܲGd&s©À�°W øÀJ,°:døÀ¯”Dܲ#@ܲGd@ ke(ª0(œ,:dh¯” ke(ª,ÀAÂÁ÷ „& & &&&wܲGd*ܲ#šW øÀJ,°€øÀ¯”Dܲ#@ܲGd@ ke(ª0œ,€h¯” ke(ªÂ�÷ æ?w ܲGdܲ#¢W  ÁRv°L Á¯”Dܲ#@ܲGd@ ke(ª0ùòyhq:òyh¯” ke(ªÂ ÷ æcw ܲGdܲ#ÂW œÀXÀJ•_MœÀXÀ¯”Dܲ#@ܲGd@ :•_Mh•fMh¯” >ÀÀ ÂÁ~÷ Qž�áÑ QžŠÑ QÑ IæÏwܲGd<ܲ#ÔW ÁXÀJÑ_MÁXÀ¯”Dܲ#@ܲGd@ LÑ_MhÑfMh¯” PÀ À  Áxæ ÷ qqfII1Š¡É �qq ÎÏ wܲGdNܲ#¾W œÀXÀJÔ_MœÀXÀ¯”Dܲ#@ܲGd@ 6Ô_MhÔfMh¯” :ÀÀ ÂÁ÷ Qž�áÑ QžŠÑ QæÏwܲGd8ܲ#¨W XÀBœw³XÀ¯”Dܲ#@ܲGd@00#ç\ 1g (œw³h¯” ,ÂÁ÷ QžÑ•áf Ñ IæÏwܲGd*ܲ#¨W tÀXÀBœ,³tÀXÀ¯”Dܲ#@ܲGd@ (œ,³h¯” ,ÂÁ÷ QžÑ•áf Ñ IæÏwܲGd*ܲ#ÔW ÄÀXÀJ q_MÄÀXÀ¯”Dܲ#@ܲGd@ L q_Mh qfMh¯” PÀ Àæ  Áx÷ qqfII1Š¡É �qq ÎÏ wܲGdNܲ#¨W øÀJ±u~øÀ¯”Dܲ#@ܲGd@ ke(ª0 zQÀDh¯” ke(ª$& ÂÁ÷ RRRI! æwܲGd"ܲ#2W ÐÀR±\MÐÀ¯”D,«0z@ܲGd@ì)` @¯ªà@ „|Sì]h¯” €ÂÁ÷ ƒÃæÎΕƒÒÒÒ €Ä4ÄÄe €÷ À† Æe � ‡æf…Õ &æ¦f&Äü €�‚ƒ„…–%&ܲGd.,«0z2ì)` @¯ªàl,«0zpì)` |æsÿˆ"W XÀR5dXÀ¯”Dܲ""@ܲ#@ܲGd@ ‚ãf &hãf›rh¯” €ÀÀÂÁ€÷ ÁeÉ Iá Iá &á #á Iá á a(Ia(Iá BCÃD"‘â�CÃâ�"�†æÏ wÀܲGd|ܲ# |€÷ ܲ""ºW ¨ÀZ °Pw¨À¯”Ds©À�@ ( °Pwh °ôxh °ƒ…h ° zh °\qh¯” ,& & & & Aff&ÿˆÀ‡Þ € ‡s©À�¬W ¨ÀB“±ä¨À¯”D °Pw@4°u~@ ,áy sh¯” 0Õ fB ÁA÷ À & & f¦w4°u~. °PwºW ÐÀB,°H:ÐÀ¯”DݪK@d©°;@ :4°u~h¯” >W Æå„&æ=ÿˆÆe€�÷ Áeô@ BÀè÷  � ‡$ݪK6d©°;ØW øÀR—±¼øÀ¯”D ° z@´²§*@ °\q@4°u~@ <ñ�}h¯” @& Õ%NBwA÷ & f¦ææÿˆ†w€Èw ° z4°u~2 °\q>´²§*W ÐÀR—±ØsÐÀ¯”D,«0z@ܲ#@ܲGd@ð)€%@ ZªgÀ…h¯” ^&  ÷ Ä‚& ´æÎe æmw&f¦æ&fÅÅe Äü …„ƒ‚�€æsÿˆ&ܲGd,«0zð)€%,ܲ#B,«0zFð)€%êW ÐÀBÕ±æÐÀ¯”DܲGd@ ke(ª0pIqÎh¯” ke(ªtÂ�÷ ÄŸÿ€À  _(‚Æå � ?‚fæ'& fæ'ÿˆ† ?‚ÁEðÿ@@€ € € €a ±B Á ýĈ0ÄÆe €‡ ܲGdÄW øÀRÕ±žøÀ¯”Ds©À�@ܲGd@ ke(ª04Kq¾ hKq ^h¯” ke(ª8ÀKÀMÂ�÷ „& & &&&ÿˆÖ €È‡ܲGd4s©À�¨W €ÀBsrà€À¯”DܲGd@ ke(ª0.sràh¯” ke(ª2ÂÁ÷ �‚Áeüÿ@AB ú°²ì‡ܲGdžW øÀJá±#øÀ¯”DܲGd@ܲ@w@ ke(ª0Yq„h¯” ke(ªÀ ÂÁ÷ wܲGdܲ@w¸W œÀXÀRUs€%œÀXÀ¯”Dܲ#@ܲGd@ ke(ª0(cs}hUs€%h¯” ke(ª,ÀQÀÕÂÁ÷ ƒ‚³Î&wܲGd*ܲ#‚W ÐÀBÕ±zÐÀ¯”Dܲó`@ ke(ª0[qM…h¯” ke(ª À/w ܲó`¢W øÀzä±ÈxøÀ¯”DlOp…Hêÿõ)àHøÿô)–œHôÿá)àHúÿé) xHèÿä)p Hðÿð)€%Hþÿó[° Höÿì)` Hìÿô)p Hîÿð)û5Hòÿ  ¯”W XÀJÛxÀ+XÀ¯”Dܲ""@ܲ#@ܲGd@ vÛxÀ+h¯” zÄæ €W#0A Á%ÿÿ+BÂ%ÿÿ&AB`B`Dà& Á ¦B~ÂÁ>÷ �‚ÁeÂe �Jb"Šbš€à€ "�â•«†wÀ€÷ HܲGdpܲ#xܲ""®W øÀJý± XøÀ¯”Dܲ#@ܲGd@ ke(ª0&–wh¯” ke(ª*ÂÁ ÷ ƒöƒæææGwܲGd(ܲ#ºW €ÀRyÀ€À¯”Dܲ#@ܲGd@ú¨C,@ ke(ª0$yÀh¯” ke(ª(ÂÁ÷ Ã÷ ’Šæw00#ï5TADATADATADATADATADATADATADATADATAܲGdú¨C,&ܲ#ÐW  ÁR²Ïy Á¯”Ds©À�@ܲ#@ ke(ª0@Iqh0Ïy€}h¯” ke(ªDÕ ÁB÷ (W/ ‚DÄ Á üÁ7‚ ½‡f& æ}w(s©À�Bܲ#ºW €ÀJ•y€%€À¯”Dܲ#@ܲGd@ ke(ª02•y€%h¯” ke(ª6ÂÁ÷ @ƒ€à ÃÒƒà ðæEwܲGd4ܲ#†W XÀZ ²#XÀ¯”Dܲ#@ܲGd@ Zg(ª0 •y@h.•y–hX:`© ¯” Zg(ª€Â ÷ ‚À   ÂÂe2Žæ§w ÷ 7 ·ÎNæ§wæ&f¦æ&fÅCDE‚Âe �ÁåÄ �> ܲGd X:`©0ܲ#:ܲGd>X:`©BX:`©HNPܲ# dX:`©(|•ùÄ � üË …„ƒ‚�€†cæsÿˆ X:`© ²W ÐÀB ²zÐÀ¯”DܲGd@ܲ@w@ 2Ösh¯” 6À ÂÁX÷ ƒÃeÄÔÔÅETÅETwܲGd4ܲ@w’W ÐÀB ²4fÐÀ¯”Dܲ#@ܲGd@ z4fh¯”  ÷ æ-w ܲGdܲ#VW ¾ë€»bž²jM¾ë€»¯”Dܲ""@ܲ#@$99@ ¤¼��`h&¼�£`hìy�`h ìy£`h¯” €æ& @À‹EAÀŠÀ‹:Á%ÿÿ NPæ& @À‹5AÁ ÁE& B — _"‚ƒÃEðÿÂ@�  ±D à ýQÀŠí‚ ‚ ‚ ‚ ¦ö5öEæ‰,|wæ+wÖ ÎE€È‡Ö À÷ ‡ܲ#ܲ#$99(ܲ""|W ÐÀ:ž²õxÐÀ¯”Dܲ#@  Ã�HXh¯” & æ1w ܲ#vW ¨À2´²§*¨À¯”D ´²§*h¯” ææ)ÿˆææÿˆ‡vW <Á¨À:ܲ""<Á¨À¯”D ke(ª0ܲ""h¯” ke(ª& ææÓÿˆ�W ÐÀJܲ#ÐÀ¯”Ds©À�@ ke(ª0ܲ#hܲ#h¯” ke(ª¦ÿˆ€È‡s©À� W øÀJܲó`øÀ¯”Dܲ#@ܲGd@ ke(ª0ܲó`h¯” ke(ªÂ�÷ ƒææ&w ܲGdܲ#ÎW øÀJܲ)døÀ¯”Dܲ""@ ke(ª0Lܲ)dhܲGdh¯” ke(ªP„„C“Âà� ‡&  ûÂ`‚ ‚`Ba¦—#ÿÿ  ‡ à õ�‚LÀ€÷ Lܲ""¢W øÀBܲ@wøÀ¯”Dܲ#@ ke(ª0(ܲ@wh¯” ke(ª,Æå‚CÒÒC    ÒÒÒÒ&w*ܲ#^W ~ÌR©~̯”Dܲ#@ܲGd@ ¬ã.ÁQhœ,1hHœw©h€¯” €ÂÁ`÷ Áe BBCC÷ ñ‰æw÷ qqq‡ÂÁ0÷ fqþÿCÑÑÑÑ Ñ QÑ Iæ­ܲGd4ܲ#VܲGd4|wÂÁ¦÷ CÑ QÑ QqÑÉέwܲ#ܲGd2ܲ#tW œÀ¨Àró}œÀ¨À¯”Ds©À�@ܲ#@ܲGd@ ©L @$9Î…@ ©œw@ú¨C,@ ˜ó0hó}h¯” €Àÿÿ æjÂÁ ÷ Ã÷ 2@ ò  „Äe÷ '‡ò²²ò ²²ƒÒÊæ�wß Ä Ìå/*jܲGd"ú¨C,8 ©œw> ©L lܲ#ps©À� |< ò ú Æe‡$9Î…´W XÀJˆ¯�XÀ¯”Ds©À�@ܲGd@ ke(ª0,C€ph¯” ke(ª0ÀÍÂ�÷ „& & &&&ÿˆ€È‡ܲGd,s©À�¬W €ÀJ—€%€À¯”Dܲ#@ܲGd@ú¨C,@ —€%h¯” " ÷ Ã÷ Šæ�w ܲGdú¨C, ܲ#–W €Àz¦}€À¯”Ds©À�@N©Û@N©û]@ܲ#@ܲGd@¹© X@N©Bx@N©{8@N©{@$9Î…@ú¨C,@ „¦}h¯” €ÂÁ÷ Ã÷ Ã÷ *‡Äeò ²¤² ¤ò¤ò¤Êöf æ•wß äò úNܲGdú¨C,N©Û¹© X$N©BxDN©{PN©û]ZN©{8^fhܲ#ls©À�rs©À�~$9Î… | Æe ‡èW XÀR1àyXÀ¯”DN©Û@Ý©%€@ XN©û]hN©{8hN©{h¯” 00#÷\ 1g\&À&À&Àf¦æ&f‚� Ã÷ ‘ ‘‘`ü …„ƒ‚�€–%Ö æsÿˆ*N©Û.Ý©%€$W €ÀJ` €À¯”Ds©À�@# z@$9Ì@ †s©& Â�÷ Ã÷ ‚Žæ—ö(wß Ã÷ ‡*ܲGdú¨C,$(*ܲ#.s©À�4N©Û8Ý©%€ÀW €ÀJ[!}€À¯”Dܲ#@ܲGd@ú¨C,@ 2[!}h¯” 6Â�÷ Ã÷ ²²2 ƒÒÊæ“w ܲGdú¨C,4ܲ#ÒW €ÀB#ày€À¯”DÝ©%€@ ©Û@ R ©L h¯” V&f¦æ&f‚ Ã÷  Ìå/< Á ‰ ü …„ƒ‚�€Ö æsÿˆ ©ÛÝ©%€¬W tÀ€ÀbÓfÀ]tÀ€À¯”Ds©À�@G©> @$9�s@G©VN@´:$�@´:4F@ ÌR«h¯” €&¦)€æ_ÿˆæ& & & æ & && && Εæææ ÿˆ6‡¢æ1ÿˆã& ææææÿˆ†æ1ÿˆñææ)ÿˆÈ‹& & & ,s©À�.G©> 2G©VN6´:$�B$9�sZG©> nG©> T|& & & & & & Εæææ ÿˆ†æ1ÿˆé€± & ææÿˆÖ �æaÿˆ@ –€ŽŽ‡G©> G©VN´:4F6G©> ÀW €ÀJ q}€À¯”Dܲ#@ܲGd@ú¨C,@ 2 q}h¯” 6Â�÷ Ã÷ ²²2 ƒÒÊæ‹w ܲGdú¨C,4ܲ#¨W €ÀJ‰r€%€À¯”Dܲ#@ܲGd@ú¨C,@ ‰r€%h¯”  ÷ Ã÷ æw ܲGdú¨C,ܲ#W tÀÀÁBs@8tÀÀÁ¯”Dܲ#@ܲGd@ �s@8h¯” €Â Á÷ ÁeCÃB‰±±Büÿ‚aIž±B±’±�BJŠbÉCüÿB¡±¡B±’à É’É�BܲGd| & & ¦¦æ wܲ#ÄW €ÀR9wK€À¯”Dܲ#@E©4d@ܲGd@ú¨C,@ (9wKh¯” ,ÂÁ÷ Ã÷ ò òæ›wܲGdú¨C, E©4d*ܲ#äW tÀÀÁBrwdtÀÀÁ¯”Dܲ#@ܲGd@ drwdh¯” hÂÁÀ÷ Áe É ICüÿB¡±¡BüÿaIžÃ ñ’ñ� ±ñ á B¦‰æ� wܲGdfܲ#ºW XÀJ ²u~XÀ¯”Dܲ#@ܲGd@ &œ,u~hœwu~h¯” *Â�÷ æ=wÂÁ÷ æ=w ܲGdܲ# ܲGd(ܲ#zW œÀ¨ÀrrwÀœÀ¨À¯”Ds©À�@ܲ#@ܲGd@ ©L @$9Î…@ ©œw@ú¨C,@ žrwÀhrwðh¯” €Àÿÿ æpÂÁ`÷ Ã÷ 2@ ò  „Äe÷ *‡ò² ²ò ²²²ƒÒÊæ�wß Ä Ìå*pܲGd"ú¨C,8 ©œw> ©L rܲ#vs©À�&|/< ò ú Æe‡$9Î…àW ÄÀ€ÀrAyð‘ÄÀ€À¯”Ds©À�@ܲ#@ܲGd@ ©L @$9Î…@ ©œw@ú¨C,@ þAyð‘hAyþ‘h¯” €Àÿÿ æÐÂÁ ÷ Ã÷ ²ò ²²ò ²²ò ²²²2@ ò  „Äe÷ 9‡òÐܲGd"ú¨C,z ©œw€|2 ² ò ²² ò ²²œ ò ²²œ ƒÒÊæ wß Ä Ìå /< ò ú ©L Vܲ#Zs©À�|$9Î… øÆe‡<W œÀ¨ÀjSy�ƒœÀ¨À¯”D5¬!™@5¬ ™@¾�¨ @ ©Û@›©Û@ ‚¹© XhÝ©%€h ©œwh<¯” €÷ ,Ä#Äb3!ú‡‡÷ ÄÌ Äb3!ú‡±‡¡‡Äa‡¦Ã÷ Îÿ‡Œ&Ã÷ ¼ÿ†> Ö ± ”>2„´´65¬ ™:¾�¨ F ©ÛX›©Û |¡‚‡>W 00#ÿ5TADATADATADATADATADATADATADATADATAXÀzTy`XÀ¯”DN©ÛH›©€QH ©ÛHN©BxH ›©BxH ©€QHN©:dH ©BxH›©ÛH N© H þ¬¨ ä: ©\}h>N©t!h>›©t!hN©\}h›©\}hò ©t!hò¯” þ¬¨ € >>òò> >òò€|€ø€t€ð€l€è€d2à¨W €ÀJáy€%€À¯”Dܲ#@ܲGd@ú¨C,@ áy€%h¯” Â�÷ Ã÷ æ w ܲGdú¨C,ܲ#ØW €ÀBìyÀ]€À¯”Dܲ""@ܲ#@ XìyÀ]h¯” \@À‹$AÁ ÁE& & B — ?‚ƒÃEðÿÂ@�  ±D à ýQÀŠí‚ ‚ ‚ ‚ ¦æ‰w–%À÷ ‡Nܲ#Xܲ""’W €ÀBïyd€À¯”Dܲ#@ܲGd@ ïydh¯”  ÷ æƒw ܲGdܲ#¬W €ÀJóy@€À¯”Dܲ#@ܲGd@ú¨C,@ óy@h¯” "Â�÷ Ã÷ Šæ‡w ܲGdú¨C, ܲ#’W XÀBT²°,XÀ¯”Dܲ#@ܲGd@ '…€%h¯”  ÷ æŸw ܲGdܲ#zW XÀ:L†dXÀ¯”Dܲó`@ L†dh¯”  À…w ܲó`òW €ÀZSŒ€À¯”Dܲ#@ܲGd@ú¨C,@ TSŒhSŒÀvhSŒ–h ¯” XæKæ‹æM& Â�÷ Ã÷ „ ² ²²²2 ƒÒÊ&wܲGd&ú¨C,Vܲ#ÀW XÀB|Œ@XÀ¯”Dܲ#@ܲGd@ @|Œ@h¯” Dæ & ÂÁ÷ Áeq B‚Ä CÄ1‰‚ަæGwܲGdBܲ#‚W tÀ¨ÀrŠŒÀtÀ¨À¯”Ds©À�@ܲ#@ܲGd@ ©L @$9Î…@ ©œw@ú¨C,@ ¦ŠŒðhŠŒÀh¯” €Àÿÿ æxÂÁÀ÷ Ã÷ 2@ ò  „Äe÷ .‡ò² ² ò ²²²²ƒÒÊæ�wß *xܲGd"ú¨C,8 ©œw> ©L zܲ#~s©À�.|Ä Ìå/< ò úÆe‡$$9Î…W tÀÀÁb!…tÀÀÁ¯”Dò)»@¬4@¬¶@¹«WŒ@<&ãe@õ)Ôp@ 4¬@h¯” 8w ¦&&EðÕ÷ ‡÷ ðÅA°°‚‡H¹«WŒ õ)Ôpõ)Ôp<&ãeò)»¬¶"¬4&<&ãe(ò)».õ)Ôp2õ)Ôp$W XÀz!…p:XÀ¯”D$9Ä @ò)Bx@î)Ôp@¹«WŒ@æt<@° €@ò)ø€@å)Ps@�±„:@ @¬¶h¯” Dw   ÷ ‡ð•ð.÷ ‡ò¥Ê¥ð±‡:¹«WŒ�±„:æt<ò)ø€ ò)Bx$° €*î)Ôp<$9Ä >å)PsúW tÀÈz!… &tÀȯ”Dò)»@ò)Bx@$9~Z@î)Ôp@¹«WŒ@<&ãe@° €@ò)ø€@å)Ps@öt @õ)Ôp@�±„:@ ¾¬4h¯” €w ¦Žì „Ä ÷ j†2„ð±-  ÷ (‡ðÅðð@Åepð@÷ ‡D ‚  ÷ ‡Äe  �`Õ e •R¹«WŒ $9~Z"å)Ps.�±„:4<&ãe6ò)»:öt <ò)ø€Bò)BxJõ)ÔpPõ)ÔpT° €b�±„:F| ‡ð00#\ 1g ‚ ÷ ‡ ƒ Ä ÷ ‡R#öR-ó‚±²¢‡ ò)Bx�±„:&° €,î)Ôp¦W ÄÀÐÀB @~ÄÀÐÀ¯”D  ­D"06ݪKhi©€‰h¯”  ­D":&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡2W |RŽ:‹¯=|Rޝ”D û¬Cx0¬‹¯=h¯” û¬Cx€f¦æ&f ÅÂ…`Á Á ý°* �… !†ƒ”×  ×  Ä õ× ñƒ× ÿî× "D × a‡× z‚Ä ÃE Ñ�ÝEp(p°à€|„… †ƒ”× $ú× 0‡× 9ôƒ× A‡× Zîƒ× _ë× :� � ‚„… V†ƒ”× [È•]× <È•>È‹8 … |†ƒ”× %ú× *÷× -‡× .€øñƒ× 0‡× 9ëƒ× A‡× ZåƒÈ ‚ … |†ƒ”× 0‡× 7÷ƒ× *ô× ,A ïlÈ jÁ hŠ„ … q†ƒ”× "A øÁ ö „ #A … c†ƒ”× $€t‡× %÷ƒ× *ô× 0‡× 9îƒ× A‡× Zèƒ× _å× .� £ß … †ƒ”× .× ; … f†ƒ”× 0‡× 9‚� õ]× -Á X� í× *Á €ðQA æ × ,Á D× = Á >È5 B>ÈU °(wZþ× /*Á .�Á … .†ƒ”× $× -‡× .ƒ× 0‡× 9ƒ× A‡× Z ƒ× _ × :DlÁÿÿ   DÚ× " Á … †ƒ”³á°0±…„ƒ‚�‡œW |RŽB‹¯@=|Rޝ”Dd³ŒÈ@ û¬Cx0þ‹¯@=h¯” û¬Cx€f¦æ&fæ ÈE¢¢^Á`Å÷ úÄ ÈUQÅÿÿ÷ æÄ ÈUQ ÷ ÔÎË€ÈUIá ÈUà `¢Ãe á €|ÉáccD ÷   Ä”¡%¡*¡.A ÈU Å ï0 0 ��W ,ÈUw@W /D ÷ DÎÄ cBDaW£-Á�Á N�… €øW¥N W¥OD!†B�“Á N�{É …CÃE€€C¥ÃC¥D!‚Ñ ó�ñ‹þÿ€D! ΋ñ5 Ñ þÁe߃“ƒ Î�à UÂåÔpRpR„“€tpBCÃ5D ‘ƒ à KR΋KBAÁE�—­:ŒDœ0CŠÄŠý ÷ fÎÄ ÁeëB”—   ¡ƒŠDÒ� CS•ÄŠÞü ƒÐ÷  |d³ŒÈ€ð‡W¤†CÅ E Cs ÉΕŠ …„ƒ‚�‡f¦¦)& 6 l(¢*¶„„íƒ †�”Å EÅ 'W "Å =€lN íÎ ëW :+W =Å 1 Â#W ,W /Å %W %W *ÑöÕ€ÍÄ W <ÈW [ÄW >W ]¾„ v�¢°(°* è6 ƒ…Æe‚�‡šW œÀXÀB%PsœÀXÀ¯”D¸s©À�@ ù¬ÚK0 ô¨""h¯” ù¬ÚK$×'ÿÿæ1ÿˆæææÓÿˆ‡s©À�°W NÀ@çB:h;NÀ@篔D  ­D"0@d©°;hm© …h¯”  ­D"D&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡W ΚXÀb9©´}ΚXÀ¯”D<©P}@¹«WŒ@:©´@ת¢Z@a©bŸ@ Zg(ª0:9©´}h¯” Zg(ª€w &fææ<ÁæC~ö Z÷ — :ö5|öåv÷ v— :÷ v 9ö5gö — / v÷ — /[v— ¹«WŒ&<©P}B<©P}P<©P}p<©P}€|-UvÅÄ ¤¤¤Õ‹U¥@ ö 6á¤-:÷ W d†ÁelN— — £À ‚ö5—"C‡—$�âƒ�Á W ת¢Z@<©P}FøƒAœÿÿÊ �$ƒÂe—$ †—$<†—$<†6wÆe�Ö Â€±‡ a©bŸÿÿ4:©´W ΚXÀz<©!€ÎšXÀ¯”DݪK@¹«WŒ@:©@ת¢Z@i©€‰@i© Š@a©bŸ@i©(Œ@ Zg`©°Zg(ª0ž<©!€h ¯” Zg`©€–˜Ài*É Zg(ª€w f¦ÆåƒÃeÀ‚÷ ö5xƒ‚Ãe˜þB ÂeÀÁ±:÷ à à æÁ @ Á @ CÀÁ±:÷ Î`ÁUCÀÁµ÷ B‚ ‚ (¹«WŒ Zg`© i©(ŒDi© Šbi© Šxi© Š€|‚ Àd�÷ Á`ÁeÝfÄ€Á�÷ Á  €Ád÷ Á €Á÷ Á  — ;ƒa @œ€ ƒà� W ÷f@�Â÷ Е-�Á �e&ݪK$i©€‰6i©€‰Di©€‰Xa©bŸt:©€øÁeP”P”P”Е-�Â÷ Е ö50�ÁeƒÆåÀ‚÷ ƒ‚–%ÀÁ<÷ fÁ<÷ fÁ÷ @÷ (Õ•:€÷ €ö5.ת¢Z:© 8Zg`©>i©(ŒPi© ŠZi© Šdi© Š.tÕ•:÷ @Æe‚�‡Á ÷ Àe0Áe0�U�‡i©€‰W ÄÀXÀzœ è]ÄÀXÀ¯”D¸1±o†@ û¬ós¤J©ø‰hù¬a†¤ù¬b†°1±v†h 1±p†h1±s†h1±u†h 1±w†h1±q†h"1±t†h1±r†hù¬c†0Z¯” ù¬a†X ù¬c†Xù¬b† $*J ù¬c† ù¬c† ù¬c† ù¬c† ù¬c† ù¬c† ù¬c†$ ù¬c†*ù¬c†^ææææ ææ æ æf�¶wvAAñU �æXû¬ós û¬ósû¬00#5TADATADATADATADATADATADATADATADATAósû¬ósû¬ós$û¬ós *û¬ós 0û¬ós@ù¬a† Vù¬a†Z1±o†ØW ÄÀXÀBØ ÄÀXÀ¯”D `E©4dhE©‹dhHÊ«h~h¯” d–%ö & ¶^€„ÎUÎU „ÎU ÎU „ÎUÎU„ÎUN ¶¶€æŽa†  W œÀ0ÀzÜ©u~œÀ0À¯”Dݪ¨M@ݪK@¹«WŒ@i©€‰@a©bŸ@ Zg`©°Zg(ª0 Ü©u~h:©´h::©"h¯” Zg`©<€–˜ Zg(ª€w &fæÀeÂ& ý w &fæÆå�fæ=ÿˆÎel…C    ö5pÄ€Á�÷ Á  €Ád÷ Á €Á÷ ¹«WŒ"¹«WŒ`i©€‰ri©€‰€|Á  €ÀåAÁ�÷ &@Ád÷ &@Á÷ &Àm÷ MÀµ�÷ M`À¬Ž�÷ M`5u À¬Ž�÷ Á @ Á @ �e@ M`u 5`€2i©€‰i©€‰$i©€‰0i©€‰:ݪKFݪKRݪKfݪK€øÁBœÿÿW á@ †�`u � ó‚#;‚�eu Íåìoµ õåÆe„ÆåÀA‚÷ ƒeS S S À�B÷ CeS S S A‚÷ ƒeS , a©bŸÿÿ HZg`©Pݪ¨M ^Zg`©fݪ¨Mxݪ¨M0tS S À�B÷ Æe‚�€‡Æe€�€±‡ Zg`©ݪ¨M W ΚXÀBת¢ZΚXÀ¯”D Zg`©°0ת¢Zha©bŸh$¯” Zg`©4JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECžW ÄÀXÀ:i© ŠÄÀXÀ¯”D Zg(ª06i© Šh¯” Zg(ª:&fæ!  E D  ‚E ‚Eà„ à±C B ΊñÖ A…„‡ºW XÀzÎXÀ¯”DñfH`òfH€ ŒH ófH �H p&H ôfHÀjzHxÿõfHàøfHþÿðKH ïfH " 5H ðfH@ ¯”èW NŽ€ÀBi©(ŒNŽ€À¯”D¹«´‰@ Zg(ª0ni©(Œh¯” Zg(ªr÷ æA…UUUUÄ    ÄT T T T Áee(e(e(e(‚ÄTä” ” Œ $)TäŒ ´ TäŒ Tä±…U U U U Î ÙÖ ‡¹«´‰~W œÀXÀz#°'œÀXÀ¯”Dæ)ø€@:©ZŠ@ä)Ty@:©@á[§Y@á[¨Y@ä)½‹@æ)ZŠ@æ)µW@æ)ÐW@ó[<}@ù±oŒ@:Ô±2&@[©(}@õ)üX@ Zg(ª0òà¯þdh¯” Zg(ª€w E¦H� € P� AÝ ÷ Е:Á‚Â%ÿÿÊ‹ B�‚÷ Á �”Á ýÀ õ5Е"Á Åe÷ pÁÅe÷ d\ù±oŒä)½‹ä)½‹õ)üX":©<ä)TyNÔ±2&`æ)ÐWó[<} næ)ÐWá[§Y zá[¨Yá[§Y  z|ÅåЕ"A÷ 2 ‡A÷ (‡A÷ Е.A÷ Е;A ÷ – ‡Á ÷ ¨ ¨ € ±€ ¯‡H•Ð¥"Е"Á ø‡Bæ)ÐWá[¨Y æ)µWæ)µW$æ)µW0æ)ø€<æ)ZŠB:©ZŠN[©(}nW tÀ0À2#}tÀ0À¯”D  ©àyh¯” &æÿˆæ3ÿˆÒW <Á0Àz[ S<Á0À¯”D:�±}s@Ѳ˜:@°s@l³ë@´:br@¹«�@´:s@° €@ù±oŒ@T; z@ ±8r@g³ü@z¬¯²'@g³<@g³Ž@g³Þ@g³å@$9ž!@�±„:@g³C@g³R@g³Ÿ@g³ï@g³¾@g³Ê@’±¾w@´:¢‘@:N©K€@ Zg(ª0`Û© Shg³hVg³,hJ¯” Zg(ª€w ÆåTµ&Àúÿõ¥:)uÍE@� À%‡æ:ÎaÀ `u>MN[[e÷ ‡D(õe:(C( õŠ ‡Àûÿ±õ•†5�ù±oŒNl³ëtT; z€|@5œ*6 T÷ È@2È‹÷ ÆeTÍ5÷ N õ•) @‡õ‹ õŠ ÷ JúµŠ ÷ 5 ‡wõ‹ DC÷ µu‡ $g³Ž2g³CXg³Ÿbg³Ctg³å€øw ÷ ¸ÿÍEõŠ ‡Àûÿ±‡÷ @õe:(‡w5 CDõ•>%õ ÷ 6õ‹ ÷ ÀØÿp‡Â +÷ k‡äÍ5e÷ àd‡÷ à†À¥.g³ŸJg³ÞXg³åfg³ï€t^õ‹ [ÍUÍ5@ðµ D(÷ ÷ ÀÿÿG‡À÷ ½µºuÉ¥;Í5<±Í5ó¥-ÿÿÔ¨¯õ  Í5@÷ µu $9ž!*g³R.g³Ê:g³Ÿvg³¾€ðÍ5÷ FÉ¥@Í5uµb¤÷ ,÷ ‡Í5wÿ÷ ÍEõŠ Àöÿ5 ±‡¡‡·@ ÷ ‡@ø¥8jðµMAB *g³ü:g³<V¹«�`N©K€j$9ž!€lAÁe Â@&ÐP�ŠP�P�Š@C&Í5ÁAÝ Â÷ ø¥8ø¥8ÍUÁÂÃe÷ ÁÂÃå÷ ÃÁ28´:sDѲ˜:HT; zP$9ž!\´:¢‘hѲ˜:l´:brxѲ˜:|è8µœ €À¥"‚@ð0÷ œ*‡õ•_%ƒ`„àAÂBàÀ±¡‡À¥À•ÿÿ±‡÷ w‡@ð 8‡ T; z(° €N$9ž!Z$9ž!ng³ŸW <Á0Àz[ @S<Á0À¯”D:s©00#\ 1gÀ�@$9ÖW@¬@@„¯½`@�±}s@Ѳ˜:@°s@c&_M@¹«�@9©x‚@h±²'@T;œw@z°øu@¤ Ñ(@ù¯üX@ù±oŒ@Ô±2&@ ±8r@$9pw@¬¯²'@‹¯=@‹¯@=@‹¯�=@$9ž!@g³@�±„:@g³,@j’±¾w@ Zg(ª0Ll³ëh g³ühg³<h²g³ëhg³ChÈg³Rhg³Ÿhng³ïh2g³Êhü¯” Zg(ª€Àüÿu­ j÷ ô÷ ÷ ¸5 ,ƒ÷ É¥/b¤ùƒàÁàÂ÷ èÄýÿJ‡ÁµÍ €÷ ÷ 1ÂE€CÃe,ð ðÃeã‹ð û÷ ˆ÷ g³,Ng³€|¶Äþÿ'‡Â �@ð%‚ðµ7ÂU€÷ @ †ÂE€÷ $÷ ¾÷ ,Äþÿ ‡�D(@Äe÷ ,÷ ˜¡Í5@±‡·@Àe,C&Ë ±ón¹«�€øŒ:Á÷ Á KÁ÷ sÁ@w@&p°÷ >‡ðµ :ææ±ÿˆ†÷%÷%È•p*f ¦Â÷ ‚�D9©x‚9©x‚*¬@:‹¯=Hc&_MT$9pwVs©À�\T;œw^s©À�t°øux‹¯�=€tÈ•p*÷ ‡œÁµÀeBÂEàÈEÿTH ÈEÿBÀeðÿ¡‡±‡÷ ZÍ5 Í �÷ ÷ O÷ 2·õe(5 @&B÷ Í €&‹¯@=Dg³T¬¯²'Zg³d¹«�z„¯½`€ð°BÖ õ 2=Š2‡·µŠ D(õå:(@$8÷ Ú&ñSYÁ¤Á ýÂe2¤¤¤¤¤¤¤¤Âe¤¤¤¤¤dÌEÿ_$8$8$8¹«�€l‡w ÷ <ÿD(õe:(õŠ &1 Í52ÍE ÌEÿ_ U@5 Ãe`#####Ãå########÷ ê‡Âe"€ ý‚÷ (885(ù±oŒ€è †ð¥*ÀþÿÀöÿ±‡·÷ †ñÀ0 H0 J0 Lñ ò ÷ !÷  w Áñ ÷ ÷ D÷ ‡5 4�‚÷ >$9ž!¹«�D�±}sJ’±¾wRù±oŒV°sZ¤ Ñ(`ù¯üXh�±}s~Ô±2&€du4µ6 ‡÷ D ‡A(! á! õå(*‡A8 €Á¢@&s ÁeBðÕ<‡·B�ðµ7 ��ÁÁ pBð•!#÷ Z¹«�pà †ð¥*pB  é±‡÷ d¤ä‡w�  É¥ úÉ¥ ÷�   É¥ É¥ É¥@É¥/ï ‡h±²' $9ÖW" ±8r4�±„:W <Á0Àz[ AS<Á0À¯”D:s©À�@$9×p@�±}s@Ѳ˜:@°s@à¯þd@ ±8r@¬¯²'@�±„:@’±¾w@ Zg(ª0*g³ŽhŠg³ÞhZg³åhg³¾hB¯” Zg(ª€5Š A&É)fÿˆ ‡ÂÑ ÷ ¦‡u’ BAá÷ À÷ ¨ÍU¡‡Ä`�ä˜Â ýB„`CÄàAB5 b¤À|÷ RÀ‡us©À�x$9×p€|µAÂBà‡AB6C4÷ Í €Ð•/ЕLЕBЕ:AÁe,ÂP” üЇ  ¡Ä S” ø‡±‡�  É¥ úÉ¥ ÷�    à¯þd øÉ¥ É¥ É¥@É¥/ï ‡èW |ÇXÀz° S|ÇXÀ¯”Ds©À�@´:G@<&Kq@„¯½`@$9×p@æ)»@�±}s@Ѳ˜:@ä)Ty@-0’@°s@<&9€@z´:t @î)Ôp@â)P@ò)ì@h±²'@° €@¤ Ñ(@æ)ÐW@ù¯üX@ù±oŒ@´:Ü@ ±8r@‹¯=@ä)²'@‹¯@=@bå)Ps@ô' q@$9ž!@õ)Ôp@�±„:@<&D@ Zg(ª0l°@ShܰASh°?Sh¯” Zg(ª€w 5 funhõ‹j÷ ’‡uhdB÷ 0†õŠjw�õµ€aw<õ ÷ vý¥w & õµÁ ÷ œAdBbA>ù±oŒ*ä)TyHâ)PR$9ž!Tâ)P`<&9€bò)ìh´:t nѲ˜:rå)Ps€|ÁepÂ& ¦fƒÂÁ÷ – –‡ÁPõµ aA”Aíf@pnp÷ CÖ‹Á ÷ 8ðË7�ABµ`f VõµT´:GѲ˜:@õ)ÔpDõ)ÔpH° €Lå)PsPâ)PX´:Ü^Ѳ˜:bâ)Pfå)Psnî)Ôprî)Ôp€øa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× æØÿ"Ã¥.@�j À õµ€a`$9×pl$9ž!€t÷ BwÄþ@÷ õÅ€aõŠjõTI�õ•æöÿ& õµaf÷ nµµ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw õ‹jÜõŠjõå4„¯½`&<&9€<&Kq<&D (ò)ì<å)PsDå)Psnù±oŒ€ðlùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ 5fµ fˇðµ ÇÈ•÷ ‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð<‹¯=X‹¯@=€l ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ DlõålõŠjõµ€aCÃe###3X„¯½`væ)ÐW€è3™÷ � ‡&™÷ ½• †õ¥ÎÆÎš‡w õ µŠjDl@÷ T”ÔÀeTŸœ5l@÷ ‡@Áñ L�±„:â)P$$9ž!&å)Ps,Æ2š8ù±oŒ>â)PN ±8rXæ)ÐW\â)Pt„¯½`|°s€d÷ Áe÷ ‡÷ ‡& ææ©ÿˆ@ð•÷ & æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ñ”@ 8¤ Ñ( ù¯üXæ)ÐWä)²'�±}s2ô' q4æ)»8h±²'zs©À�00#5TADATADATADATADATADATADATADATADATA€à.†Ã ûÆePõµaá¥-ìÆeP� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆePÕwýÆeP±‡ƒÆåP‚Ê6 -0’P -0’Pd-0’Ph$9×pÿ p-0’Pz-0’P\)¦ÿˆKÂå@”‡>W œÀ0ÀR—4œÀ0À¯”D\s!s@ v—4h U«9qhdªÀ�h(Zgèh6¯” €­ÿMÿÿþ½þ•þ@BCAf÷ …} ‡f&÷ „…‡Á Gð‹Rð¥R@Áÿÿ±‡Ä× 3æ æ æ æ&€$&�”Â~€Ì Vs!s€|‚€Ã& ÄeÃ%†ÃæÎà”¤ Ã~ƒÔ¥ Ä~�F`Á¡‡Ö �F` ±‡f&PÀe Áeñ¥ ÿÿÁ @ ù‚à÷ v€ÀeTö €ø �% �% �% �%–%Á¡‡Ö Ö Ö –% ±‡ð•þÿ����–%‡@ABCD f÷ …@ ����Ö ‡…ÆåÈf% % % % €tÁ 'à %&f&fÄ`% …÷ : BÝÂBÝ‚eµ�µ�ƒ‚÷ ÷ *uuuu¥F‡ÀÀEøÿ@a’„”aH�É~‡Ä÷ ˆ÷ êÀÿr€ðÁÁÿ÷ 6÷ ì Á<÷ (÷ ˜÷ .÷ Ö÷ ÷ "÷ „÷ Ø÷ ÷ x÷ Ì÷ ÷ l÷ l‡&f&D%% %%÷ v÷ ÷ æ% %%€l%÷ Z÷ ø%% %%÷ D÷ â÷ ÷ ÷ ¬% %%%÷ "÷ À÷ òÄeTTTTÄå„�€‡@A%÷ X@Aµ€èõe÷ BAµõ÷ 2õ`u u µ`u @A÷ õ`u u µ`u ‡�pÀ €B`Á €`‡ee% å;÷ vÿu u €d5 5 w6õ%ÿÿõ%ÿÿõ%ÿÿ õ%ÿÿ†Íe;u u u ‡÷ x ueM u u  ueM u  ueM ue ÞÍeee€àe‡eeee‡eeee‡uuuu‡åÿÿåÿÿåÿÿ%‡&D÷  ÿÔ  Á5 ÷ Œÿ÷ ¬ÿ÷ êý÷ ¶ÿÀ Á5\þÿ  ÷ nÿ÷ ÐýéÅe„‡ÎW NŽ€ÀBݪ¨MNŽ€À¯”D¹«´‰@ Zg(ª0Tݪ¨Mh¯” Zg(ªX÷ æ@„    Àe à ± û‡„T T T T H1C„ÔdT T L $)ÔdL t ÔdL Ôd¡Î æÖ ‡¹«´‰FW XÀ*ÔZKXÀ¯”D ¯”\W ìÀøÀj\±DìÀøÀ¯”Ds©À�@c&~@T;²@ù±oŒ@  ­D"0¢‚²Dh£¯Dh\±Dh¯”  ­D"€ææ±ÿˆ‡ß% Ëw &Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë å¥.‹ Ä ÅæU¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë c&~T;²s©À�$ù±oŒ*|‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±ûJW QŽXÀR€^àQŽXÀ¯”Dù±oŒ@  ­D"0´\±ŒÈh ¤¯ŒÈhd³ŒÈh–¯”  ­D"€w Á w Á& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿù±oŒù±oŒ<|Ä äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡ W XÀZ7a XÀ¯”D°@S@°?S@ù±oŒ@ N.«D,h¦«D,h Û©"S䯔 Rw Ãw Ã&Àe`Á` ýÀðÕaË  Á`€Àe`ÂP ý€D ‡2ù±oŒ °?Sù±oŒ°@S Û©"S` ,Û©"S :Û©"S`œW XÀzR«„:XÀ¯”D<&È`@<&Kq@„¯½`@æ[à8@â)P@æ[ZŠ@æ)ÐW@ì)p…@s©†@üBDRFðHJHLxNŒPhR¨T¸VÈXö€|‡ ‡&-‡÷ aÀeˆ“´ €‡ô $Ãeô ô & & & & &æ& & & �&ææ ÿˆ‡&æ)ÿˆ4 ‡÷ ^b´:ô�€ø÷ ¨ÿ ‡÷ R÷ œÿÀÿÿ‡&ÀE@À À À ÀÀU �ÁU ‡@÷ Pÿ€÷ Jÿ‡ô‹÷ .À1÷ 6ÿ´Š÷ (‡ô‹ ÷ À2÷ ÿ÷ 4ЇÀ€t÷ ÿ‡À ÷ þþ‡AW ÿÿ A t÷ Îþ ´ô %& & & & & & & & & &ææ ÿˆ& & & & & & & & & &ææ ÿˆtT´:t v´:Ü€ð ‡Àÿÿ‡÷ Vþ4ŠÁ ô•‡÷ Xþ´@ ÷ :þtP ÷ ÿÀ•A÷ Vþ ÷ Úþ@÷ HþÀI÷ @þ€÷ :þôE w¢þAW ÿÿHAfW ƒ€lÁ÷ ÆþÀH÷ þ@÷ Œþ÷ ¦þ�ÀeB÷ ðý� �÷ Òý€÷ nþ÷ ˆþwLþ B— ÿÿæf€¦ ìƒÀì÷ Bþ÷ \þ‚ö ÷  þöÎ ê–%€èwþwþ÷ xý÷ ^ýf÷ <þÀD÷ |ý€÷ þÖ ÂU÷ þwØý÷ 6ý÷ Hý÷ þ¦ÀL÷ Pý@÷ ÖýÖ ÂU÷ èýw¬ý÷ ý÷ ý÷ æý�ÀeC÷ "ý¦@€d÷ ¦ýÖ ÂU÷ ¸ýw|ý÷ Úüt÷ èü´whý÷ Æü÷ Øü÷ ¢ýt  †@4€4íVtææí€  à B ‚Bà€ ûƒ €à À ö4 4 ÀH÷ Šü÷ ý÷ (ýÀBÝ÷ rü 4m -‡´côåö÷ Úü÷ ôüö ÷ :ýöô â€÷ üt÷ ü´€\–%w�üwêý÷ ýÀH÷ ü÷ ôûÀ  �÷ þûû÷ Ìû÷ îüæCÁ �÷ Øü€÷ âûøÖ wLü÷ ÆüÀJ÷ Îûw<ü÷ ¶üÀK÷ ¾ûw,ü÷ ŠûB— ÿÿÁ TØ€”÷ ¢ûÁ ûw ü€”ü÷ ’ûûw ü÷ xü÷ Xû@÷ ~ûwìûŒW ´Á€Àz4a` ´Á€À¯”D¸?±ŒH"ɪKr@ý¨X@ô¨""@”«�w@év~@ ­4Ф6±L h C±¥h C±\}h9±Ì`hj1±o†hB±ÿh 6±xQh=±Krh1±ÚKh4±³}h?±y‹h ­~,¤ ­€,¤ ­¨t ­Ðt ­øt¯” ­4Š  ­~, ô¨""  "”«�wɪKr ý¨X év~ ­€,  ­ø‡ªW ´Á€ÀzBa8"´Á€À¯”D¸ ­cŒò[ÿH æ[xQHí[KrHá[ÚKHä[³}Hï[y‹Hæ[L H ó[\}Hó[¥H é[Ì`Há[o†H¯”zW tÀÀÁ:Í«àetÀÀÁ¯”D  ­Ì… Í«àeh¯”  ­Ì…¦¶Îe¦nW 0ÀR Šð0À¯”DB,«0zH*s©À�H&5¬ ™H.°sH(ï[ŒH, ¯”ºW <Á Áz`Š}<Á Á¯”DþÿÈ�¸`HìÿÈ�8 Hèÿ¾�8THøÿÊ�8THþÿ¾�¨ HôÿÅ�ØwHòÿ»�`Húÿ¼�`Häÿº�iHöÿ¼�›HüÿË� sHðÿÈ�àHæÿ"Å�ˆ,HîÿË�H…Hêÿ ¯”*W <Á Áz`Š(}<Á Á¯”Dþÿ ­#ä ­ZTäü¬›äû¬`äþ¬8Täú¬iäþ¬¨ ä­Øwä ­ sä­ˆ,ä­¸`ä: ­H…ä­8 ä­àäü¬`ä­#ä5¬!™h¯” ­#  ­ZT ü¬› û¬` þ¬8T ú¬i þ¬¨  ­Øw    ­ s   ­ˆ, ­¸`  ­H… ­8  ­à  ü¬`ÄW ¨ÀJü€ ¨À¯”DݪK@¹«WŒ@ <G©P}h<©P}h¯” @ Âw  ”Å¥ üÅ¥ ùÅå0B¡†€÷ Aa”ôœÿÿ‡¹«WŒ0ݪKW ¨ÀBüÀÚ¨À¯”DݪK@¹«WŒ@ €9©x‚h¯” €w „ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ E�€Aa×$Ò±œÿÿ¹«WŒhݪK|‡BW ¨ÀRüÛ¨À¯”DݪK@¹«WŒ@ Zg`©°Zg(ª0l9©z‚h¯” Zg`© ZA90$ . @( Zg(ªpw f Ôĥ&‡¥ƒ¥"‡¥ ƒ¥ ¥Î ¥ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ E�€Aa× ×‡Ö Ö ±œÿÿ‡&¹«WŒ Zg`© Zg`©RݪK ^Zg`©–W ìÀøÀz$@ìÀøÀ¯”Ds©À�@¹«WŒ@c&~@T;²@i©€‰@  ­D"0¢:©¿`h,:©(}hD:©ZŠh:©h2:©00#/5TADATADATADATADATADATADATADATADATA<h":©h:©ÿh :©Ï_h&¯”  ­D"€æ ææ±ÿˆ ‡ß¥æ * æ + æ2æ3ÁEÿæ ÎE‚w …�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ W ƒ  c&~T;²s©À�J¹«WŒxi©€‰*|Áe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡ºW €À:L@€À¯”Di©€‰@ H[©(}h¯” L÷ &÷ &÷ �’•’•€‡@Á(÷ f€  Àe ÀeÉÿÀe Àe ‡(i©€‰äW 0ÀJdXR0À¯”D:©(}@¹«WŒ@d©°;@ V<©h¯” Zw Ä'Å  ÅUD$†BA÷ &�Â(÷ ÅU� ÀBQ÷ ÂЕ* ü‡¹«WŒ&d©°;H:©(}xW 0À2D¸ƒ0À¯”D N©K€h¯” ¢a‡¢z‚ÈÅ ” õ‡€W ÐÀbä` ÐÀ¯”D¹«WŒ@:©<@i©€‰@ Zg`©°$Zg(ª0„a©}hé«@Qh0¯” Zg`©(JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC Zg(ª€w D…&&÷ bЕ-�Î �eÁaÁeP”P”P”Е-�$w DÅ… ƒ÷ &Е.À À À ce÷ À …Е:÷ Å ù Â÷ $¹«WŒ$ 6¹«WŒ\i©€‰ |B‡:©<øW °ÇzôXR°Ç¯”D:©¿`@:©ZŠ@:©@<©P}@a©}@¹«WŒ@é«@Q@:©@:©ÿ@<©@[©(}@:©Ï_@* Zg`©°>Zg(ª0ꌩ?Th¯” Zg`©*ABDEFIMNOPQRSTUXYZ<>zv ´ ¾ Ú  ü " $ˆ  &ä" (&$ &~4& B( >*  l,  x. ò0 è2 œ4 ‚6 Œ8 :*œ: ¨< Zg(ª€w && D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ À ÀCƒ ÁÁeÂ!£ ü„  ÂaÂe‚bÂEÊ Ö ÌЕ%„*¹«WŒB<©P}TN jd €|Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ �à õ‡& æÎe6& ¦æÎe/& æÎe"X:©h:©ÿÞ v:©ì €ø*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎe & ¦æÎeЕ A‚¦Þ à ÷–%‡& æÎeòA÷ à <<©ö F:©¿`8 T:©Ï_F t:©f |[©(}ztû‡Ð• à ü‡A÷ E‡AÂ÷ E‡Ð• Aæ÷ AÎ ûÖ Â ÷ $Е.÷ Â÷ AЕ; ÷ à à‡Â ýð¥ ÿÿùÀ ø a©}"é«@Q4[©(}L[©(}b:©ZŠ W OŽÒ³zÔ2dOŽÒ³¯”D¬@@´:2“@„¯½`@¹«´‰@ ª`^@æ)»@ò)»@ª°'@ä)Ty@°}@ ª�…@ ª�…@z´:t @î)Ôp@$9½@ªP@9©x‚@<&ãe@ª@y@æ)ÐW@ì)p…@´:Ü@•±}@:©ÿ@ªM@ ±8r@‹¯=@bä)²'@‹¯@=@å)Ps@ô' q@õ)Ôp@�±„:@h±p!@ Zg`©°xZg(ª0檀Mh¯” Zg`©€ ??? -- HELP file nesting depth exceeded ??? -- HELP file error -NNNNN ??? -- Ambiguous HELP qualifier ??? -- Improper HE€|LP file format ??? -- Unknown HELP qualifier ??? -- Indirect HELP file syntax error ??? -- Indirect HELP file open error Iø-NNNNN ??? -- HELP synonym not found ??? -- Ambiguous HELP synonymW>> ´:2“ ª�…‚ ª°'‚‚LB”CH– ”–   È È– –.MAIN. Zg(ªn÷ 7Æ·Î÷àÞÁ ÷$÷&÷ L†wf÷@æ>ÿˆ÷ Š÷0Ü7ŠÈ÷ ü‡Ô‹_· Ü÷ 7‡÷ jú‡÷ h÷•z¹«´‰ Zg`©ÆZg`©Î Zg`©àZg`©Þª@y ª`^ Zg`©$$ ª`^&Zg`©&4´:t 6Zg`©@ :Zg`©>FZg`©ÜJZg`©ÈXZg`©Ü€jÉ7ŠÈ÷ ‡E÷ L‡÷‹Ê4÷¥É ÷ †é÷¥Éwâ÷‹ËÄÌ7ŠËÁÐÂÖ‘‘‰÷ "÷ 2·ŠÈ¿À‹÷ $÷ ÚÄÆ÷ h‡„ jZg`©ÉZg`©ÈZg`©Ê$Zg`©É2Zg`©É÷ ηŠÈÀðð†÷ †÷ J!‡ñÀœ� ÷ ¶†÷ ¼â‡÷  À°rZg`©Ë Zg`©H Zg`© $Zg`©(4Zg`©È8ªP õ)ÔpDõ)ÔpH°}Vî)Ôp \Zg`©œdî)ÔptªP|ªP€bp÷ €00#7\ 1g÷ ZцwÔÀðð†÷ †÷‹È±÷ à‡íê÷¥É÷ ÷ T߇÷ B܇7¢ÜÙ‚‡&7ŠÊ·ŠÈ€ Á –%Ànî)Ôpî)Ôp •±}ªP "Zg`©$õ)Ôp*õ)Ôp.°}4Zg`©ÈDî)ÔpJî)ÔpPZg`©ÉfZg`©ÜpZg`©ÊtZg`©È€Þi÷ ÎÀwVÈ¥ íÈ¥ êÈ¥*Á ·ŠÊ÷ äÈ¥$È¥/€ Á ÚÌ¥/„ ¤÷ †Á ù7ŠÈ±„‡“ ÷ ‡„ “÷ . Zg`©i ªPî)Ôpî)Ôp2Zg`©ÊdZg`©ÈzZú†Ä ¡Â¥ Â¥ ±‡Àð•p°ð•ð•ð•ðð†÷ ‡Â¸ÃRà ýÁ$É ÷ ‡ÅÐÅ~ ªP$ ª�…&ì)p…*ä)Ty.ä)²'2ô' q4æ)»8ô' q:æ)»><&ãe@ò)» DZg`©Fõ)ÔpLõ)ÔpPh±p! XZg`©¸ fZg`©$n¬@ tZg`©Ð€ÐÖÀ÷ U•͇ÀÐÀ÷ ‡÷ Nÿ†„ û‡¢1‡È¥9‡÷‹ÈC‚ à Ê¥ úÊ¥ ÷Ò¥@¡wà ÁÀV°p÷ @ Zg`©ÖªP ±8r Zg`©Ð"ªP&�±„:DZg`©È rZg`©V~‹¯=|L †Àª÷ \ÀfÁdwèÈ•ð‚÷ î‡ðµêÀÀeÁšÅ”Å ý7 ¨¦æ÷5j÷1Ü÷àÞÀ×-ÞðC‚÷ �÷ ¢7 | Zg`©ªZg`©fZg`©d Zg`©‚&‹¯@=4ªP8æ)ÐW ü"‡÷ ˆüø‡÷ †ý‡÷ €÷ ÆÎ‡÷@æ>ÿˆ÷ À¸Ñà ý÷ ‡Àÿ÷ (ÀzZg`©ÉZg`©ÉZg`©ËZg`©ÌZg`©Ë Zg`©(&Zg`©ÈDZg`©ÎJ´:ÜLZg`©@ PZg`©>V¹«´‰ZªP `Zg`©¸n„¯½` tZg`©ÿ^Œ(÷ 4ÝœÀA ÷ Е.ŠÀ)÷ ÎÑ‹Ñ�Ñ�É�wÑ‹þà÷@Ä>4 t&ÿˆ‡R Zg`©(å)Ps Zg`©A:©ÿ "Zg`©)0ªM4ªM8ªMH´:2“JZg`©@ NZg`©>êW tŽ€»R$ep!tŽ€»¯”Ds©À�@<©P}@$9pw@ Zg(ª0TG«ÖKh¯” Zg(ªXf¦æ**æ ææŽaææ©ÿˆ†÷¥ÀB€÷ Â¥*÷W ô‡W cñ‚@ –%‚�‡&$9pw(s©À�6<©P}2W øÀJ4søÀ¯”D¹«WŒ@  ­D"0¤œ«h¡«hD¯”  ­D"€w ÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w   B€ ÁeÁE"s  ‚ �Å s-ƒÅ¹«WŒJ¹«WŒ,|Àî �Å CsàÃlÈÀ¡±‡‚W 0À2þv 0À¯”D "¹«´‰h¯” &&æ¦f&¦ v Þ €�‚ƒ„…‡|W ÐÀ:þv˜qÐÀ¯”D  ­D"0¹«WŒh¯”  ­D"&æf…Þ ƒ„…‡tW €À2þvPŒ€À¯”D ¹«�h¯” f&¦‚Þ €�‚‡öW <ÁXÀzzµz<ÁXÀ¯”D&)ÑWHŒ: .H+"ÞHhùc&"H3Œ:»zHðtaH ¡UQdHC‚ÃSHìt\}H©nµ_HT,ÌH¸#N&HzðtaHòt‘H)»WH c&íyH$#žwHc&ðyH .”BxH+"¢(Hôü¬ ’H#ú�H 3Hüÿ 3(Hðÿ))XHl�œSHc&hzHz‚ Hc&„H1Ô’¤’Hc&Š–H"äxšwH©nº`Hò)OzH“(ÜYHñtRyH ò)PzHñtNyH,ƒ!H C‚¶xHå)0Hc&ª–HEzÔ’#H0{î’H$0Ö(Hc&#Hc&#Hc&#HC‚ÌH0{“H c&";H©nL`H 0{“H ©nR`Hì)VdHì)[dH ät‘Hzc&ÆHöt.Hk‚œTH&C‚¼,H.ŽH.›H c&Ä"H.”ÒH.‰H“(ÞH€c&«ÆH)”s#H+"ø€H`ù0{D“HC‚©Hzc&¼H>ñtCyH c&|KH6T, Hk‚óxH!ì)ÖpH ,R"H ‚L H0{mH‚`qH ùa9H"-íDH)ûXHùaKH #{Æ8Hzì)jdH 7{» HT,KHc&R—H'“(ZŠH0{˜“HñtîyH“(zH@.”à8H,óyH¬ .€Hc&’H0{D�HlœSHc&µWH:z#0H#0H4{*LH#0H”s,XH@#09H [t{8H3^s00#?5TADATADATADATADATADATADATADATADATAHì)VHc&XHGc& XH?çtBxH.”’yH¬ Ö(Hì)\}Hz-ŽEH#{ö8Hìt’sH3®sH0{9�H#0ìHìt­sH.{¶–H)ZH #z zH.”óyH #0LHc&™dHAk‚ãH'-0’Hz0{‰�H0{Ž�Hät H#0DH0{›�Hçtà8H”s`XH©ní]H #0vH# zH0{n�Hl�ƒ!H #0MH c&jLH#""Hz#0¼Hì)VNHÔ’LqH4{MHÔ’[qH-01H40wH©nŽ^Hl�óyH“(µWH 3�jHýÿc&»pH#0)H c&¬ŒHK#04H zc&ÞpH#{mHT,ôH€Ô’qH@C‚kzHc&õXH7Ô’7!H c& ™H2uåNÀE¯”Dò«ˆH ¯”NW NÀEÂ2>uU(NÀE¯”D©õ#H ¯”NW NÀEÂ2>uTqNÀE¯”D•«µOH ¯”NW NÀEÂ2>uu'NÀE¯”D¼©õ‡H ¯”NW NÀEÂ2>u!tNÀE¯”D§«õuT[NÀE¯”D«µ�H ¯”NW NÀEÂ2>uAyNÀE¯”DÈ«õ H ¯”NW NÀEÂ2>uIqNÀE¯”D•«õ H ¯”N00#O5TADATADATADATADATADATADATADATADATAW NÀEÂ2>u™’NÀE¯”Dj¬õu™NÀE¯”Dp©ÅœH ¯”NW NÀEÂ2>u#NÀE¯”D ©µ�H ¯”NW NÀEÂ2>uN`NÀE¯”D(«XH ¯”NW NÀEÂ2>u•NÀE¯”DJ©ÅH ¯”NW NÀEÂ2>uzNÀE¯”Di©5uH ¯”NW NÀEÂ2>u%™NÀE¯”D”¬t!H ¯”:W NÀEÂz3u^NÀE¯”D5¬ ™@¡«@œ«@ dô¨ÎhP¤«h¤«ªHh ô¨hô¨ªHh ¤«úWh¤«� hRô¨úWh ¯” h  @ &ÀÀe6Î% 4Î% 4Î%04– f÷ �‡�  Á ý‡w ÀÀeF öw 5¬ ™>¡«Rœ«X5¬ ™f¡«–W NÀ…È:7x®sNÀ…ȯ”D5¬ ™@ $7ª®sh¯” (ÀÀe6@aÈ "ú±H‡5¬ ™„W  ÎìÃ:ƒ,d Îìï”D  ­D"0a³ˆZh¯”  ­D" ±ðµ=p!†Õ•^ú‡PW  ÎìÃbK VN Îìï”Ds©À�@°s@ù±oŒ@f³Ð@  ­D"0ž;¯VNha³VNh¯”  ­D"€w BC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=wÅð•Ùÿ*Åe œ"fù±oŒ6s©À�ff³Ðj°s&|¦æÿˆ ‡D CÓBðÕ.E‡W  Î¥ÆZï ΠΥƯ”D ²Ë@f³Ð@  ­D"0zi³ÒWhr³Žwh`i³ï h¯”  ­D"~46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ wx ²Ë|f³Ð W 4Î(Êr¯ˆw4Î(ʯ”D°s@r³"&@q³¯:@w³œ€@i³‚@ù±oŒ@f³Ð@  ­D"0„¯½`h¯”  ­D"€w ð*æ8Iðµ÷ œ*=‡ðµ€)98÷ ÕeBÕ && ð Îå¶ �ÕU€�Ä÷ ‰�†ð¥öÿ*ð¥åÿ*ù±oŒ"w³œ€8i³‚hq³¯:€|Æe ð*Nlv °°΋œ*ðµ.2÷  „& ðµ#ðµ!ðµ)&ÎePæÂÂeÊ ¦æ&æ•&Äð >2i³‚^°s(ø€Åe >ÍE€÷ †�•p�*÷ wq³¯:"r³"&&f³Ð W  Î%Ób&Ü Î%Ó¯”D ²Ë@q³¯:@i³‚@ù±oŒ@  ­D"0tc³ÜhŒ¯`rh¯”  ­D"xw ðµ Á¥ðÅ)÷ ‡÷  ÕfU�Ä÷ …‡ðµÕ%  BA °`6p 4p`4¡ ¡õ%þÿð60 4‡ù±oŒ ²Ë$i³‚6q³¯:^W  Ó¬½Z•e Ó¬½¯”D°s@q³¯:@i³‚@f³Ð@  ­D"0°c³Iqh¯”  ­D"€ðµMðµ=ðÕf�Â& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ðµ=&Îe0æ ÷ U• Â…à  ÂE•Õð >€  °sXi³‚8|>ÍE€ðµ=ufÄ÷ p†�ñ ± wq³¯:6f³ÐàW  ÎìÃZzÌ Îìï”Dq³¯:@i³‚@  ­D"0He³²Zhr³®Shf³t:h ¯”  ­D"LÄ Ä Ä ðµf÷ ð >€5>õE€u ÷ �‡ñ ± ‡ i³‚:q³¯:nW  ÎèÃ: &ø€ Îèï”D  ­D"0ó¯ø€h¯”  ­D" Á‡zW  Î,Êzœ, Î,ʯ”De³&@p³—y@r³ü�@r³Þ@p³J,@ù±oŒ@m³oŒ@s³2 @f³Ð@  ­D"0l°}h ¯”  ­D"€w ÷ ‡ðµ)ðµ÷ 8C÷ 8ð¥öÿ* ðÕ)ð ð*wð•öÿ*úðµ÷ ó‡÷ æ÷ à÷ ë‡ðep &ù±oŒ p³J, r³ü�Nf³Ðbp³—yre³&€|p ‡÷ „Þ‡ð¥#ðµ=Ä E”W¡9ƒÅ¥^éð•³ÿ*ÆÅå0ùà Å`à à CaÄ ëÃåCƒ Ôà ðµ=ðµ÷ L €øð¥ð 0Àð•Øÿ*�ð¥ ðµ= ÄEÕ¥^Ä ûA¨ð¥ æÂe@ÃÎà÷ Òƒ߇÷ ðµ=� ÁEpÓðµ2ðµ!€t)8ÂeEÅ`l0Å …à ì0‡„ û0¡/ &l0Ä ü„…`pÄ „löÿ06°ôÿ4p 4÷ ðp°æÄ ƒðÎà÷ ,Vs³2 €ðƒ ƒ÷ Já÷ ù†ð•Øÿ*Á`‡æ÷ ƒ‡æCàƒ#ƒÎà÷ Î ¦÷ Ôÿ‚ð†– ‡DàÄ ‡ðµ@) ð 6ðÿ?000#W#\ 1gðÅD)‡&r³ÞBm³oŒfW  Î,Êzœ,hy Î,ʯ”De³&@r³ü�@p³K,@ù±oŒ@m³oŒ@s³k@s³2 @f³Ð@  ­D"0d° €h¯”  ­D"€w ÷ ‡ðµ)ðµ÷ 8C÷ $ð¥öÿ* ðÕ)ð ð*wð•öÿ*ú÷ ì÷ õ‡ðep p ‡÷ „è‡ ù±oŒ p³K, r³ü�Nf³Ð^e³&€|ð¥#ðµ=Ä E”W¡9ƒÅ¥^éð•³ÿ*ÐÅå0ùà Å`à à CaÄ ëÃåCƒ Ôà ðµ=ðµ÷ X ð¥ð 0Àð•Øÿ*€ø§ð¥ ðµ= ÄEÕ¥^Ä ûA¨ð¥ æÂe@ÃÎà÷ Þƒ߇÷ ðµ=� ÁEpÓðµ2ðµ!)8ÂeEÅ`l0Å €t…à ì0‡„ û0¡/ &l0Ä ü„…`pÄ „löÿ06°ôÿ4p 4÷ ðp°æÄ ƒðÎà÷ 8ƒ ƒ÷ Vá÷ ù†Bs³2 xðð•Øÿ*Á`‡ðµ)wæ÷ ƒ‡æCàƒ#ƒÎà÷ Î ¦÷ Èÿ‚ð†– ‡DàÄ ‡ðµ@) ð 6ðÿ?0ðÅD)‡s³kr³ü�:m³oŒ W 4Ó=ÀzE`€W4Ó=À¯”Db³Ó@m³lE@e³²Z@°s@r³"&@r³ë�@q³¯:@i³‚@ù±oŒ@d³?!@r³®S@r³,}@Rf³Ð@¡«@f³t:@f³y:@c³Iq@s³þ}@  ­D"0Fh±p!h¯”  ­D"€w Áñ D÷ ð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwnÄ 0 ù±oŒ °sf³y:€|ð*0 @Q$   Ñ 0 40 60Š)ðÕ)÷ ‡÷ Lñ \ðµ#÷ U†&œ* ðµ=ð¥æ•Øÿwô Å`p!2üƒÅà2s³þ}Jf³t:€øÅ… ÅEW!Åp0p2÷ ׇðµ#(ð PðÕ)÷ †ðµ@#ð¥Çÿ*ð*fff÷ ±±‰‡÷ †&œ*wjðµ c³Iq:e³²Z`d³?!pe³²Z€t.÷ nB‡ð5ð8ðe$8w2€æ•ÖÿA&ÀÁe÷ €†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA#ðÕ°s6°s>¡«€ð@))÷ †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ 00œÄ¥‚Û‡œ r³ë�bb³Ó€lAÄ¥ÕÄŠ ð ð•000÷ ‡0 @0 ð‡&œ*0 @÷ uÄ÷ ðµ# ÁeB&B÷ °B÷ ÷ °•*±&,r³,}Ji³‚Vq³¯:lr³®Stm³lExr³"&€è‡÷ ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµi³‚€d# Õüðµ=Õõ Õe0 Õ÷  ÷ 0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#4q³¯:jàðÿ?ðµ@#040 6wð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡ f³Ð^W 4Ó=ÀzE`PZ4Ó=À¯”Db³Ó@m³lE@e³²Z@°s@r³"&@r³ë�@q³¯:@i³‚@ù±oŒ@d³?!@r³®S@r³,}@ba³VN@f³Ð@¡«@f³t:@f³y:@c³Iq@s³þ}@  ­D"0b^±âWhh±‚!h¯”  ­D"€w & w æÁñ D÷ …ð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•Óÿù±oŒù±oŒ°s f³y:€|w~Ä 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)Å ÷ ÁeB÷ ‡÷ Lñ \ðµ#÷ U†&œ* ðµ=ð¥Bs³þ}Na³VNff³t:€øæ•Øÿwô Å`p!2üƒÅàÅ… ÅEW!Åp0p2÷ ׇðµ#(ð PðÕ)÷ †ðµ@#ð¥Çÿ*ð*fff÷ ±�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ= r³®Sm³lEr³"&$i³‚€d0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ 0@°Æe° 6ðµ=ðµ#0œ2/002Pq³¯:€àðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6wð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0�Ä€ … ðµ #ÍÕÄ ðµ# r³,}.i³‚:q³¯:>r³"&Ji³‚€lÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ 0@°vq³¯:€èÆe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6wð•/ðµ!0Š/ lbf³Ð0d0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡&W 4Ó=ÀzF`ÐW4Ó=À¯”Db³Ó@m³lE@e³²Z@°s@r³"&@r³ë�@q³¯:@i³‚@ù±oŒ@d³?!@r³®S@r³,}@Ra³VN@f³Ð@¡«@f³t:@f³y:@c³Iq@  ­D"0Lh±²'h¯”  ­D"€w Áñ D÷ ð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwtÄ 0 ù±oŒ °sf³y:€|ð*0 @Q$   Ñ 0 40 60Š)ðÕ)ÁeB÷ ‡÷ Lñ \ðµ#÷ U†&œ* ðµ=ð¥æ•Øÿwô Å`p!28a³VNPf³t:€øüƒÅàÅ… ÅEW!Åp0p2÷ ׇðµ#(ð PðÕ)÷ †ðµ@#ð¥Çÿ*ð*fff÷ ±±‰‡÷ †&œ*w&c³Iq@e³²Zfd³?!ve³²Z€tjðµ.÷ nB‡ð5ð8ðe$8w2€æ•ÖÿA&ÀÁe÷ €†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA°s<°sD¡«€ð#ðÕ@))÷ †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ 00œÄ¥r³ë�hb³Ó€l‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ ‡0 @0 ð‡&œ*0 @÷ uÄ÷ ðµ# ÁeB&B÷ °B÷ ÷ &2r³,}Pi³‚\q³¯:rr³®Szm³lE~r³"&€è°•*±‡÷ ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&i³‚€d0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ 0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ:q³¯:pà@#ðÿ?ðµ@#040 6wð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡&f³ÐÎW  Ó=ÀZ:d¾w Ó=À¯”Ds³³.@‚²D@ù±oŒ@  ­D"0p³¾wh ’±¾wh¯”  ­D"€w ð*æ ƒ ‚æ¦×¢"wf)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷ ‡eÄ%w ñUù±oŒj‚²D€|\ñ5@ƒ âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ "ñ5@\ñU@ñ5€áÄ„íÄ ñ5LñUþ¥*ñU€øÄ Å‚öƒàÎàà Ê¥*Ã%C!.D`÷ *‡ƒ‚wòþÆeCÃ5€ñU‚Ã5 ±±± Ã5€± Ã54s³³.€t@±‡Æeð•Êÿ*±‡ðµ=õñU„Ä EÅe& ÷ RÄEÅe÷ Ö ¼Ó¥"Ý öŽwVþö Ë¥"  ƒ Ë¥"ö (ðÕ”Ä Â Ä î ƒ  ê¶ Õ• Ä ü‡”W  ÎìÃzaf Z Îìï”Db³Ó@e³&@e³&@c³Ü@r³ë�@i³ï @c³2 @w³œ€@a³—K@  ­D"0œp³¿Zh ¯”  ­D"€ðµ=D…÷ ‡ð`p4°6÷ ‡æf¦÷ °6°4/‡ðµ=Á  ÷ ðÕ@)ð 0 Ö 8w÷ ƒ46÷ ‡,i³ï $e³&0w³œ€Nc³Ühb³Ólc³2 za³—K$|8ñÕ ÷ °eð‹*wÖ ±‡r³ë�e³&ÖW  ÓeÀz\g ÓeÀ¯”D ²Ë@e³&@p³“y@r³ë�@r³Þ@w³·€@w³™€@p³J,@ù±oŒ00#g\ 1g@m³oŒ@i©€‰@a³ˆZ@2r³,}@f³Ð@  ­D"0@•±}h¯”  ­D"€w ÷ n‡832cðµd& & & B öŠð 2OðµðµΕ ¶“ðµ à N”à Υ$¶“Ε Åð 2ƒù±oŒ p³J,€|2Åà‚Î¥ Ž�Î �æ÷ ƒvÂ Š‚ ƒ“Ε f÷ ƒ�ׯe÷ ð¥óÿ*÷ Æeð•Øÿ*wðÅ@)ðµ m³oŒ>w³·€Tr³,}` ²Ëpf³Ð€ø÷ †ð¥öÿ*ï0,÷ ÷ ðæ‡ðµ ÷ ‡ðÅ)÷ ðÕ)ðµ( ð¥ Ó ðµ=Ó ð¥Ó lð 0ºl‡ð p³“yr³Þ0e³&> ²Ë€t ƒ÷ †ð¥øÿÿ÷ 4ª‡ð¥/ð ðð¥Ãe&ðµ=ÅBaÀ@aÁ ÷ Áe0b�Å ÷ÂeÒ€ð¥ a³ˆZbi©€‰€ðÁe@Ã÷ Ø`‡÷ ÊY‡ðµ=‚ ÂE°8óÅ Ãe…l0Å Åà & ì0‡„ l0ù…Å`pÄ Älöÿ06ðôÿ4p 4÷ ®ðe€lp ðÕ)ì‚wVþðµð¥Ã%÷ † ,÷ ÷ ÷ N‡÷ w"þ÷ ‡÷ J†÷ ‡B æƒàƒ#ƒ :a³ˆZHa³ˆZVr³,}^w³™€jr³ë�\èÎà÷ Î f÷ Ìÿ� ‡Â`‡ð¥öÿ*÷ w±ðµ)0406 l0ì° ‡m³oŒ. ²Ë2f³Ð¬W  ÓeÀz\ghy ÓeÀ¯”D ²Ë@e³&@r³ü�@w³·€@w³™€@p³K,@ù±oŒ@m³oŒ@i©€‰@s³k@a³ˆZ@r³,}@*f³Ð@  ­D"0$•± €h¯”  ­D"€w ÷ n‡832cðµd& & & B öŠð 2OðµðµΕ ¶“ðµ à N”à Υ$¶“Ε Åð 2ƒù±oŒ p³K,€|2Åà‚Î¥ Ž�Î �æ÷ ƒvÂ Š‚ ƒ“Ε f÷ ƒ�ׯe÷ ð¥óÿ*÷ Æeð•Øÿ*wðÅ@)0, m³oŒ>w³·€Tr³,}` ²Ëpf³Ð€ø÷ ÷ ìò‡ðµ ÷ ‡ðÅ)÷ ðÕ)ðµ( ð¥ Ó ðµ=Ó ð¥Ó lð 0Æl‡ð  ƒ÷ †ð¥øÿÿr³ü�e³&& ²Ëna³ˆZ€t÷ 0¶‡ð¥/ð ðð¥Ãe&ðµ=ÅBaÀ@aÁ ÷ Áe0b�Å ÷ÂeÒ€ð¥Áe@Ã÷ Ô^‡Ji©€‰€ð÷ ÆW‡ðµ=‚ ÂE°8óÅ Ãe…l0Å Åà & ì0‡„ l0ù…Å`pÄ Älöÿ06ðôÿ4p 4÷ ªðep ðÕ)ì€l‚wnþðµð¥Ã% ÷ †,÷ ÷ ‡÷ w>þ÷ ‡÷ J†w‡B æƒàƒ#ƒÎà÷ Î f÷ Ìÿ� ‡&"a³ˆZ0a³ˆZ:r³,}Bw³™€Ns³khm³oŒ@èÂ`‡ð¥öÿ*÷ w±ðµ)0406 l0ì° ‡ ²Ëf³ÐDW  ÎèÃz7q¼ Îèï”Db³Ó@w³t@r³k@w³L @i³ÒW@r³Žw@b³—G@s³2 @  ­D"0\r³ë�hr³ü�h ¯”  ­D"`ðµðe6p 4÷ †8÷ ±‡÷ †81416÷ ÷ ñÅ ÷ ‡‡÷ ê†÷ ‡2s³2 "b³Ó*i³ÒW@b³—GDr³kNw³L Vw³t\r³ŽwöW  ÎìÃ:\qò Îìï”D  ­D"0ˆr³,}h¯”  ­D"€ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•|Øÿ*±¡‡ÖW  ÎéÃJŒs"& Îéï”D°s@œ«@  ­D"0Nr³"&h¯”  ­D"Rðµ82Áe&À÷ €0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡°s"œ«ÎW  Î(ÊZt¸L Î(ʯ”Dx³·k@q³¯:@i³‚@  ­D"00r³khw³kh¯”  ­D"4ÄÄ÷ U•Õ8UMwÅåà wi³‚&q³¯:2x³·k~W  ÎìÃR$t÷_ Îìï”Dw³Ô@a³—K@s³2 @  ­D"0Ør³§‘h¯”  ­D"€&4&6ðµ=÷ š÷ ‡°6°4÷  wzÄ%!°6°4ðµ=5÷ 2‡ ì6 ð � l0Á ü&°÷ Z°46÷ s³2 Fs³2 `|°6°4‡÷ :ðµ)0406 0 ð *±‡ì0ðe6p 4÷‡÷ ðµ=÷ Øÿ‡a³—KPw³ÔÊW  ÎìÃJü�œw Îìï”Dw³¼@f³Ð@  ­D"0Bw³L h¯”  ­D"F÷ Bðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�ww³¼Df³Ð�W 4Ψ½z÷’¼4Ψ½¯”Db³Ó@w³t@r³Žw@b³—G@w³k@a³[M@f³Ð@  ­D"0°w³·€hw³™€h¯”  ­D"€÷ ðµ.ðµ.8Åem,00#o$pTADATADATADATADATADATADATADATADATA†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ &‡f¦æ÷ ÷ †ƒ‚„÷ ‡ b³—G`a³[Mlw³kpr³Žw|w³t8|åÆeðÅ)ðµ . ñÕ ðe6p 4÷ 0ž8*w,b³Ó6f³ÐæW  ÎìÃR÷’d Îìï”Db³—G@w³·€@a³ˆZ@  ­D"0Pw³œ€h¯”  ­D"T¡ðµ)"ðÕ(.÷ ðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ ÷ ðÅ(.‡b³—GFa³ˆZJw³·€w³·€hw³™€h¯”  ­D"€÷ ðµ.ðµ.8Åem,<Á0ÀW 6 ^&Ëö= Ÿ s�(À€W�ª3à�f4Ùf‚nF ‚ŠF VNƒ@r À+ƒâ¢ Š(Lš¢ .€âJ¤ Ó%Lš¤ 2&Lš¤ Ñ(Lš¤ PdLš¥ Š(L𥠳–Lš¦ Ò:Lš© Ì`Lšª X…Lš¬ iLš¬ tLš¬ qLš¬ |Lš¬ Ö(âJ¬ ,Lš¬ é8Lš¬ ö8Lš¬ VNâJ¬ œSâJ¬ i^Lš¬ v^Lš¬ wâJ¬ ÒyâJ¬ \}âJ¬ ’âJ¬ .€âJ¬ 5…âJ¬ q…âJ¬ ……âJ­ e^L𝠛ƒL𝠓Lš° xsLš´ ÑpâJ⃠LšâŒ(LšîT–Lšö°Lšö,„¦ö`T„(tLš²0 …žó}™$ó0™$C€pš˜�¶p‘À�ƒâ•_MŠj•fMŠj—€%šL¢À+ƒâ¦}šø)»WâJ)ÑWâJ))XâJ)ûXâJ)ZâJ)õZâJ, âJ,ƒ!âJ,R"âJ,Ö(âJ,CMâJ,NâJ,œSâJ,óyâJ,\}âJ-íDâJ-ŽEâJ.‰âJ.ŽâJ.›âJ.îâJ2‘âJ2 .âJ2ÑpâJ2©‰âJ2éŠâJ2”‹âJ2Ù‹âJ3^sâJ3®sâJË:K…žÔ_M‹ÔfM‹{ˆ„ÐùòyŠÈ2À+ƒâd6&Lšdì&LšdÖ(LšlÖ(âJlCMâJlNâJlœSâJl\}âJtÑpâJ!!À�ƒâ'!€%œš6!}�F[!}�<q!ˆ…q!òy…j+"Y âJ+"ÞâJ+"zâJ+"K"âJ+"½'âJ+"¢(âJ+"ÜYâJ+"ÞâJ+"ø€âJ+"ZŠâJ+"2™âJ #n~…ž#}…ž#Oq†Ð#€†z#""âJ#žwâJ# zâJ#ú�âJ¬#‘âJ¬# .âJ¬#½‹âJ­#ÌyâJ­#îyâJ¸#N&âJ¸#óyâJ¸#v~âJÄ%ÄLšÄ%•LšÄ%ëLšÄ%r!LšÄ%#LšÄ% #LšÄ%#LšÄ%ÄLLšÄ%ˆZLšÄ%kfLšÄ% qLšÄ%tLšÄ%™wLšÄ%xLšÄ%LšÄ%C�LšÄ%¤’Lš<&kLš<&DLš<&%Lš<&�Lš<&zLš<&®(Lš<&w*Lš<&ƒ:Lš<&H;Lš<&„SLš<&È`Lš<&ãeLš<&ÞfLš<&ýfLš<&°pLš<&¶pLš<&KqLš<&%tLš<&iwLš<&lyLš<&9€Lš<&�LšI&}…žc&¼âJc&ÆâJc&’âJc&L âJc&ôâJc& âJc&âJc&©âJc&‘âJc&„âJc&;âJc&„âJc&³âJc&òâJc&’âJc&æâJc&~âJc&õâJc&» âJc&"âJc&Ä"âJc&#âJc&#âJc&#âJc&4&âJc&˜'âJc&Þ,âJc&";âJc&|KâJc&jLâJc&_MâJc&üMâJc&NâJc&ÀSâJc&˜TâJc&UâJc&µWâJc&XâJc& XâJc&õXâJc&gYâJc&‘ZâJc&b^âJc&¶^âJc&™dâJc&ÌeâJc&áeâJc&fâJc&dfâJc&ßfâJc&9gâJc&»pâJc&ÞpâJc&2qâJc&grâJc&krâJc&¢sâJc&«sâJc&wwâJc&xâJc&íyâJc&ðyâJc&hzâJc&…}âJc&óƒâJc&¬ŒâJc&ü�âJc&ô‘âJc&Š–âJc&ª–âJc&R—âJc& ™âJc&#›âJc&«ÆâJp&¶pŒ&LšŒ&ðZLšŒ&]fLšŒ&tLšŒ&tLšŒ&CyLš|' Lš‰'d‡‰'àe‡ô'ÄLšô'IRLšô' qLšô'Ä…Lšô'¤’Lš‹(‡´“(ÞâJ“(zâJ“(µWâJ“(&XâJ“(ÜYâJ“(—mâJ“(ø€âJ“(ZŠâJ“(@�âJ“(i�âJ“(ñ‘âJ“(ù’âJ“(5“âJ¼(yLš¼(Ö Lš¼(–QLš\)zLš\)îLš\) Lš\)ÖKLšá)ìLšá)à’á)[MLšâ)ƒ Lšâ)PLšâ),Lšâ)nELšâ)sELšâ)ŽELšâ)_GLšâ)ÌGLšâ)2HLšã)Ð4Lšã)§ZLšä)p ’ä)²'Lšä)TyLšä)½‹Lšå)0âJå)Û%Lšå)°'Lšå)^Lšå)PsLšå) ™Lšæ)»Lšæ)é%Lšæ)LLšæ)µWLšæ)ÐWLšæ)ø€Lšæ)ZŠLšè)›8Lšé) x’ì)` ’ì)VâJì)âJì)Ö(âJì)VNâJì)œSâJì)CTâJì)VdâJì)[dâJì)jdâJì)ãfâJì)êfâJì)gâJì)ÖpâJì)nrâJì)’sâJì)wâJì)ÒyâJì)\}âJì)p…Lší) Lší) Lší)w Lšî)ÔpLšî)KqLšï)ã‰Lšð)€%’ð)û5’ò)»Lšò)t Lšò)ýLšò)ìLšò)BxLšò)OzâJò)PzâJò)ø€Lšó)ö!Lšó)¶dLšó)VgLšó)[}Lšô)p ’ô)–œ’õ)à’õ)üXLšõ)ÔpLšö)°Lšö)’Lšt*Ê[bt*·[bt*Î[bt*G[bt*I"[bt*ä3[bt*›N[bt*µr[bt*s[bt*Œs[bt*Ês[bt*¶z[bt*ç[bt*©„[bt*b†[b00$w\ 1gt*Ö‰[bœ*4[bœ*[bœ*€[bœ*Ä[bœ*· [bœ*8&[bœ*@,[bœ* X[bœ*@w[bœ*¶w[bT,KâJT, âJT,ôâJT,ÌâJœ,òˆžœ,1˜Æœ,³Œfœ,VN‰"œ,ÊQ‰Àœ,:d‰~œ,Oqˆ`œ,u~¡¤œ,€Š.Ì,ŠâJË-–ˆã.ÁQ˜Æ#0ìâJ#0âJ#0âJ#0âJ#09âJ#0DâJ#0LâJ#0MâJ#0vâJ#0¼âJ#0)âJ#04âJ#0óâJ#0âJ#0TâJ#0UâJ#0ãâJ#0âJ#0xâJ#0–8âJ#0œ8âJ#0Ä8âJ#0Æ8âJ#0Ë8âJ#0Í8âJ#0ð8âJ#0ö8âJ#0Õ:âJ#0k;âJ#0–;âJ#0ø;âJ$0ƒ!âJ$0R"âJ$0Ö(âJ$0œSâJ$0’sâJ,0‘ƒâJ,0œƒâJ,0σâJ,02„âJ,05…âJ,0q…âJ,0……âJ-0’âJ-01âJ00ÑpâJ00‡qâJ00sâJ00sâJ00sâJ20,âJ20Ç,âJ20,-âJ20’.âJ20£.âJ40‘8âJ40È8âJ40Ì8âJ40á8âJ40’9âJ40Q:âJ40W:âJ40;;âJ40:<âJ40wâJ40uwâJ40ÇwâJ40ÛwâJ40ÜxâJ40üxâJ40CyâJ40NyâJ40RyâJ40žyâJ40ÑyâJ40îyâJ40óyâJ401zâJ40w[b´:Kw[b´:iw[b´:ow[b´:‹w[b´:œw[b´:¯x[b´:Ìx[b´:×x[b´:By[b´:Fy[b´:Wy[b´:Çy[b´:áy[b´:ãy[b´:ðy[b´:az[b´:¶z[b´:¤}[b´:Ý[b´:éƒ[b´:„[b´:„[b´:+…[b´:|…[b´:A†[b´:i†[b´:y†[b´:ô�[b´:ü�[b´:$�[b´:C�[b´:d�[b´:h�[b´:¢‘[b´:£‘[b´:³‘[b´:´‘[b´:¶‘[b´:Û‘[b´:’[b´:B’[b´:D’[b´:¼’[b´:ä’[b´:2“[b´:˜[b´:1˜[bÌ:›‚Ì$;ƒK[b;@j[b;Àv[b;L…[b;–[b@; (ƒÐT;ð[bT;8[bT;[bT;²[bT;[bT;�[bT;7[bT;¬![bT;;"[bT;I"[bT;`[bT;Ûd[bT;4f[bT;$q[bT;ùs[bT;œw[bT;Dy[bT; z[bT;z[bT;*}[bT;[bT;[bT;3[bT;ü�[bT;”˜[blK[MâJlK_MâJðK¶pNæfâJNÝâJ{[b?{0À[b?{pÆ[b?{ÎÌ[b?{�Ó[b?{pß[b?{Nò[b?{@ø[b@{0À[b@{NÀ[b@{NÙ[bA{0À[bA{Îå[bA{ò[bB{Nò[bC{€»[bD{0À[bE{ÎÌ[bE{ÀÚ[bG{Îå[b”}”[b”}¼[b”}Ê[b”}4[b”}y[b”}ƒ[b”} [b”}H [b”}¿ [b”}ö [b”}k[b”}ˆ[b”}>[b”}™[b”}£[b”}®[b”}É[b”}ã[b”}ó[b”}Ë[b”}õ[b”}ô[b”}Á![b”}I"[b”}8&[b”}]([b”}’([b”}ö2[b”}ü2[b”}T3[b”}ä3[b”}5[b”}Ë8[b”}O:[b”}„:[b”}D;[b”}ˆK[b”}�M[b”}vN[b”}xQ[b”}€Q[b”}•R[b”}âW[b”}KX[b”}:Y[b”}`Y[b”}Z[b”}ŒZ[b”}`[b”}:d[b”}”f[b”}Ùf[b”}(g[b”}òi[b”}ðj[b”}¼p[b”}Uq[b”}«q[b”}ˆs[b”}Hw[b”}Jw[b”}³w[b”}¶w[b”}¶x[b”}×x[b”}Øx[b”}Úx[b”}»y[b”}ây[b”}Œz[b”}8}[b”}V}[b”}]}[b”}c}[b”}ã~[b”}[b”}Þ[b”}€[b”}0€[b”}Öƒ[b”}׃[b”}؃[b”}Ùƒ[b”}Úƒ[b”}Ûƒ[b”}܃[b”}݃[b”}Þƒ[b”}߃[b”}|Š[b”},‘[b”}˜[b”}™[b”}Óí[bõ}@…ž ~L [b ~ö [b ~G[b ~I"[b ~ìY[b ~´p[b ~ q[b ~)q[b ~[q[b ~br[b ~ur[b ~µr[b ~¶r[b ~s[b ~s[b ~Œs[b ~´s[b ~¶z[b ~[b ~5[b ~Àƒ[b ~ô�[b ~$�[b ~:‘[b ~¢‘[b ~Û‘[b ~{–[b ~^˜[bÑ_M‹,ÑfM‹,a� |[ba� |[bb�ßS[b00$‡\ 1gd�—}[bk� |[bl�8 [bl�Š [bl�Œ [bl�Ž [bl�Ö [bl�+ [bl�÷[bl�ƒ!âJl�R"âJl�Ö(âJl�CMâJl�NâJl�œSâJl�Q\[bl�ßl[bl�àl[bl�ál[bl�’sâJl�­sâJl�óyâJl�\}âJl�ŽÆ[bl�ÞÆ[bl�ÎÇ[bl�ØË[bl�öÌ[bl�Ó[bl�Ó[bs�®[bu�VY[bu�®y[bu�¯y[bu�°y[bu�±y[bu�²y[bv�Ó�[bv�–‚[bv�˜‚[bv�›‚[bv�¿‚[bv�ŽÆ[bv��Æ[bv��Æ[bv�“Æ[bv�ãÆ[bv�Ç[bv�Ç[bv�ØË[b‚ŸâJ‚6âJ‚L âJ‚ âJ‚ âJ‚`qâJ‚ŽwâJ‚7xâJ‚AyâJ‚NyâJ‚áyâJ‚ðyâJ‚±�âJ‚Â�âJC‚ÈâJC‚ôâJC‚©âJC‚ÌâJC‚¼,âJC‚ÊQâJC‚ÃSâJC‚\XâJC‚|ZâJC‚ fâJC‚æfâJC‚UqâJC‚îrâJC‚ŒsâJC‚¶xâJC‚kzâJk‚ãâJk‚òâJk‚âJk‚˜'âJk‚¤KâJk‚œTâJk‚ßfâJk‚æfâJk‚óxâJ'…€%§ð}…ÀƒâL†d¨‚­‡‘âJ³‡.€âJSŒ¨üSŒÀv¨üSŒ–¨ü|Œ@¨îŠŒÀ©®ŠŒð©® Œ¶p �œw[b �Bx[b �|…[bº�iЈ»�`Ј¼�`Ј¼�›Ј¾�¨ Ј¾�8TЈÅ�ˆ,ЈÅ�ØwЈÈ�8 ЈÈ�àЈÈ�¸`ЈÊ�8TЈË� sЈË�H…Јñ�}�þñ�~…ž¼��`–h¼�£`–hÃ�HX–¾Ô’âJÔ’§âJÔ’ÔâJÔ’7!âJÔ’#âJÔ’xQâJÔ’¼WâJÔ’àWâJÔ’qâJÔ’LqâJÔ’[qâJÔ’VsâJÔ’;xâJÔ’óƒâJÔ’}…âJÔ’¤’âJÔ’RæâJñ’˜:‡v.”ÒâJ.”» âJ.”à8âJ.”ÖKâJ.” LâJ.”¶^âJ.”ìqâJ.”BxâJ.”’yâJ.”óyâJ4”ŽwâJ#™´¯[b#™Ö¯[b#™ý±[b#™²[b-™°[b-™'±[b-™(±[b-™?±[b-™“±[b-™[²[b-™´[b5™|¯[b5™„¯[b5™²¯[b5™^±[b5™f±[b5™Ù±[b5™$²[b5™5²[b5™Q²[b<™D[b<™i[b<™|[b<™í[b<™ <™$[b<™-[b<™4[b<™[b<™s![b<™..[b<™pT[b<™_[b<™^q[b<™ew[b<™šw[b<™3}[b<™S~[b<™u~[b<™€[b<™/€[b<™ZŠ[b<™á‹[bô¨Îõô¨õô¨""¯Ðô¨ªHõô¨úWõú¨@,‚ú¨C,‚ý¨Xh9©´}°9©x‚Ò09©z‚Ó6:©<Óx:©´´:©Óx:©ÿÓx:©"´:©Ï_Óx:©¿`Óx:©(}Óx:©Óx:©ZŠÓx<©ÔÈ<©P}Òl<©!€±4E©4d´FE©‹d´FG©P}ÒlJ©Åô0J©ø‰³FN©{›ŽN©Û£ôN©t!£ôN©{8›ŽN©û]›ŽN©:d£ôN©Bx£ôN©\}£ôN© £ôN©K€Õ¬[©(}Ôa©}Õ$a©bŸ¶2d©°;°ji©5uô~i©€‰¬\i© жÒi©(Œ·*m© …°jp©ÅœôFs©5¬ ™Ð5¬!™ÑBj¬õ<󸔬t!ôÌ;¯P2;¯VNö8„¯½`öÒ‹¯=¬‹¯@=®4‹¯�=K°Œ¯`r÷Ê£¯DÇ&¤¯ŒÈÈ‚¥¯ÜK4¸¬¯²'6ÖÖ¯Ú}F>à¯þd·à¯çeJöà¯47 ñ¯4}4vó¯dx8 ó¯ø€ù’ù¯ XF>ù¯üX:&ü¯@†9@°ùp:h°úpK®°sаøu9â °\qŽÞ °PwŽÞ °ôxŽÞ ° zŽÞ °ƒ…ŽÞ°?SÀì°@SÀì°ASÀì°}ùþ° €úž,°l;ð,°z;‚4°u~�D ±8r?° ± &K®±lE<61±ÚKÏj1±o†Ïj1±p†³F1±q†³F1±r†³F1±s†³F1±t†³F1±u†³F1±v†³F1±w†³F4±³}Ïj6±L Ïj6±xQÏj9±Ì`Ïj=±KrÏj?±y‹Ïj?±ŒÏjB±ÿÏjC±\}ÏjC±¥Ïj\±DÇ&\±ŒÈÈ‚^±âWþ@h±p!ü2h±‚!þ@h±ì&†h±²'¾�±}sIúƒ±:2Êr†±/KÊrޱJ…ÊrޱP…Êr�±„:?°�±Õ±µWC‚Ö±faD ù±oŒE ²Ë4v0² Êr0²# Êr0²ÊÊr2²XE”‚²DÇ&™²`;G`œ²2&D œ²€&D œ²Ñ(D ž²faD ª²e;G„´²§*—:Ѳ˜:H†ܲ""—°Ü²#—&ܲ#—&ܲó`—¶ܲ)d˜VܲGd˜Vܲ@w˜$a³—K3øa³[M3øa³VNö8b³Ó2æb³—G3€c³2 74c³Iqøªc³Ü÷Êd³?!4d³)&=dd³;5@d³ŒÈÈ‚e³&74e³&74e³žM6®e³ŸM6®e³ M6®e³¡M6®e³²ZøÄe³$™3øe³?™3øf³Ð4vf³t:øÄf³y::&g³ü»Ðg³<»Ðg³Ž¿Þg³Þ¿Þg³å¿Þg³ë»Ðg³¸þg³,¸þg³C»Ðg³R»Ðg³Ÿ»Ðg³¾¿Þg³Ê»Ðg³ï»Ðg³©}:Þi³‚H˜l³ë»Ðm³lE<m³oŒ<¨p³# Iúp³h<öp³ &>ìp³J,?Lp³K,?þ00$�pTADATADATADATADATADATADATADATADATAp³¿Zp³iw=dp³vwI:p³¾wÒp³ìe€p?LeÀv?þ$ep!à¼ïe›‚Ì$DfT?°af Zkf`;@®kfKqA<Žf; AhŽfvBDÓfÀ]žÎ\g \ghy ·kµz[b q}Ÿz q_MŒ2q€WBà7q¼ æ7qüqB�7q„s{IqCªVqMC‚\qò êsrà‘†‰r€%Ÿ:s@8Ÿâ4sà¦Us€%‘ÌŒs"& ºt¸L �t°yD $t÷_ @3ukMë@3u^õ3uþ_ëº3uIqì44u%!ìØ4u;;ìR4uH;ìÌ5u¥Zíp5u»pí5u%™í¸6u" î\6ut:îˆ7u`"ï9uüXï|>u•ô0>uzô~>u™ôF>u#ô”>uu'ór>uU(òÖ>uT[ó>uN`ôâ>uIqóª>uTqó$>u!tóÀ>uAyó\>uåòˆ>u™’óø>u%™ôÌ?uÖdïè@u# ïª@u`†ð$BuW!ðžBuq!ðBBuá"ðæBu�ñŠCuzñLDuÖsñðEu¡dò”Gu¼òþv áØþv˜qáZþvXuEþvPŒáÖ9wK ürwÀ¡^rwd Àœw³‹¾7x®sõTÛxÀ+’¨yÀ“ZAyð‘¢ØNy …€ÔSy�ƒ£¸Ty`£ô•y€%”äáy€%¦2ìyÀ]¦Úïyd§²óy@§DÑ_M‹,Þ³E”éƒKqF>!…ª0!… &«b!…p:ª>L†d¨‚ ŠðÐ`Š}Ј`Š(}ÑBSŒ¨ü|Œ@¨îŠŒÀ©®ñ�h~FDñ�H€G`ü�ÜYGü�œw ¦™’È}G„÷’¼L÷’d t±˜(_H˜±˜aH†9©´}°<©!€±4i© жÒi©(Œ·*Ü©u~´ת¢Z¶2ݪ¨MÇR«„:ÉÖÍ«àeР*¯¤`�(;¯VNƒ@y¯X„¦†¯T„(ˆ¯�š˜‹¯=¬‹¯@=®4‹¯�=K°³¯ˆ„ÐÖ¯L …jÖ¯ˆ…Þ¯g'…ž °PwŽÞ° SÀì,°òˆž,°H:�D,°VN‰",°ÄQ‰À,°:d‰~,°€Š.v°L ŠÈ±u~Œâ±\M�Š\±DÇ&“±äŽ˜—±¼�þ—±Øs�ÖÕ±æ�ØÕ±ž�ÂÕ±z’„á±#‘.ä±Èx’ý± X“¬²Ïy” ²z•$ ²#”ž ²4f•Ö ²u~¡¤0²# ÊrT²°,§ðž²jM–hž²õx–¾´²§*—:ܲ""—°Ü²#—&ܲó`—¶ܲ)d˜Vܲ@w˜$b³s;ƒÐq³˜:‡vÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ00$ŸpTADATADATADATADATADATADATADATADATAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðW  Ó=ÀJ; Žf Ó=À¯”Dù±oŒ@\±D@  ­D"0h;¯Ph¯”  ­D"lw �‚Á %¦’Ò¥[Ö¥<æ Ä,÷ („‡æÄe÷ …‡Á Å5ÿ ó‹s‘‡…¡Á ü±‡Á „DáÄ wù±oŒj\±DöW  ÎíÃB; v Îíï”D  ­D"0€s³³.hs³³h¯”  ­D"€&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡TaÞ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡|±‡šW  ÎíÃ:" Kq Îíï”D  ­D"02b³Óh¯”  ­D"6141612Áepðµl2l0p‡xW  ÎíÃ:JÀ+ Îíï”D  ­D"0b³—Gh¯”  ­D"8Áe2 ‡~W  ÎíÃjy[M Îíï”Dq³¯:@i³‚@ù±oŒ@  ­D"0Æe³$™h<e³?™hha³—Kh(a³[Mh¯”  ­D"€0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w  Á�   ìì� .Â% ÷ ÕeB ÁÁ �ÁUBù±oŒni³‚N|€Á5ÁUU�Á‹åÕÄ÷ ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡$q³¯:ŒW  Î¥ÆJ%¦S ΥƯ”D  ­D"0 ²Ëh ñ¯4}h f³Ðh¯”  ­D"ð‹*±‡ð*‡¶W  ÎíÃRÔ Îíï”Dm³lE@e³²Z@r³®S@  ­D"0 d³?!h¯”  ­D"$÷ ‡f÷ �†&œ*÷ °•*±‡r³®Sm³lEe³²ZìW  ÎíÃbÔe" Îíï”D„¯½`@ù±oŒ@d³?!@f³Ð@s³þ}@  ­D"0:¥¯ÜKh¯”  ­D">w ð*ð 8B÷ ‡pB÷ ‡ðµ÷ 0 B÷ ‡ ù±oŒ„¯½`$s³þ}2d³?!:f³ÐNW 4ÓíÃ2l´'4Óíï”D  ­D"0¯”NW 4ÓíÃ2n X4Óíï”D  ­D"0¯”–W 4Ó­½Jz´'4Ó­½¯”Ds³³.@f³t:@  ­D"0þd³;h¯”  ­D"€æ¦ƒ‚ÃåJ„”Ä¥[Ä¥<C…Å`¥ ¡>C÷ ˆÒ¥,÷ ~… 4ÃB‚ƒ‚× *‚㨂 DÄe $ $ $ ÷ ‡ñz ñññds³³.€|÷ ‡DEÅe     ýð•Ìÿ*1 ±‚ƒ‡ Ë•0‹¤þ‹¨‡—¢3‚¥÷ "÷ Ä ‹¨ ¥Ë”Ó”¦æ£˜Ä ýƒ‚‡‹¢‡Ê¥7f³t: ø‡¥‡ØW  ÎíÃZæÐW Îíï”D„¯½`@ù±oŒ@d³?!@a³VN@  ­D"04¬¯²'h¯”  ­D"8w ð*ÁeBð 8÷ ‡÷ ‡ðµ÷ ɇù±oŒa³VN"„¯½`0d³?!†W  ÓµÀR0!# ÓµÀ¯”D  ­D"0e³ŸMhe³¡Mhe³ Mhe³žMh¯”  ­D" ¡´‡ìW  ÎíÃRž!  Îíï”D  ­D"0le³&he³&hc³2 h\s³2 h.¯”  ­D"p÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡ìW  Î-ÊZ#t! Î-ʯ”De³?™@ù±oŒ@f³t:@s³þ}@  ­D"0Hà¯4h¯”  ­D"Lw ð*f¦÷ f‡÷ ‡ðµ! �‚f–P÷ ðÅ€)°B‚�‡ù±oŒs³þ}f³00$§\ 1gt::e³?™ÖW  ÎmÐz &˜@ ÎmЯ”Dó¯ø€@„¯½`@’±„:@�±}s@Õ±®S@°}@ü¯@†@ª²e;@h±ì&@Õ±à@h±²'@ù¯ X@zÕ±µW@ù¯üX@à¯çe@,°l@,°z@•±}@à¯4@ ±8r@Ö¯Ú}@¬¯²'@�±ÆíÃBŠ(ÀÚ>Æíï”D  ­D"0þ¬³y帰øuh¯”æW  Ó�Àbu'x Ó�À¯”D ²Ë@q³¯:@w³œ€@i³‚@ù±oŒ@  ­D"04ü¯@†h¯”  ­D"8w ÷ ðµ!÷ ‡& &æ÷ µÄ÷ Æe‡ ù±oŒ ²Ëw³œ€$i³‚0q³¯:BW  ÓíÃZö&`; Óíï”D°s@�±; @ù±oŒ@  ­D"0”ù¯üXhf³y:h ¯”  ­D"€w ÁDB‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±DÂÂe(¦„Äe$2ƒÃeäÿæÓÏÓ Ó(‹ÿˆ‡Ì%[]Ì%<> ƒù±oŒ °s@°s| ÷ „팂1 >‡ �±; vW >Æ­½ZŠ(#>Æ­½¯”D  ­D"0þ¬¯yäþ¬°yä°ùphþ¬±yäþ¬²y䯔W 4ÎíÃRœ,h4Îíï”Dp³h@d³;@a³VN@  ­D"0|g³©}h¯”  ­D"€ð*¦÷ ‚5‡ðµ)ðµ%EÅefffff f…Õ% ED•ÄDÓÄ%][Ä%><÷ ÷ …¥¥¥¥¥‡ññ1 ‡a³VNXd³;^p³h’W 4ÎíÃJœ,l4Îíï”Dg³©}@ù±oŒ@  ­D"0 ,°lh¯”  ­D"w  wù±oŒ g³©}�W 4ÎíÃJœ,z4Îíï”Dg³©}@ù±oŒ@  ­D"0,°zh¯”  ­D" w wù±oŒ g³©}–W  ÎíÃJüRK Îíï”Dq³¯:@i³‚@  ­D"0m³lEh¯”  ­D"÷ MÄwi³‚q³¯:ŽW  ÎíÃ:®SKq Îíï”D  ­D"0&m³oŒh¯”  ­D"*ƒ  �D„PÄ5Rà ý†R”‡R”R”à üøÀW  ÎíÃRTà Îíï”Dm³lE@ù±oŒ@a³VN@  ­D"0*±lEh¯”  ­D".w ð*ÁeBð 8÷ ‡ðµ÷ ‡ù±oŒa³VN*m³lE W 4ÓmÐJ:dh4ÓmЯ”D°s@d³;@  ­D"0’p³hh¯”  ­D"€ÂÂe(¦Ê ññ1 ÷ `£(£(£££‚÷ †� ‚÷ >âââââ‚:ƒô �ô�‚””à ý¡Á5°s<w÷ $ù±oŒ|d³;`| †wññ1 ‡Ã ÄÄ%ñ,ñ,ñññ:4Š× ±‡ p³h`W ?ÆWJódÀv?ÆW¯”D&s©À�@°s@  ­D"0Îp³ &h¯”  ­D"€æÁÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦°sV|f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß ±‡Ns©À�²W  Î¥ÆBe€p ΥƯ”D ²Ë@  ­D"08p³J,h¯”  ­D"<ð 8ðµ ðµðµ ÷ ‡ðÖ*±‡ðÃ*±‡$ ²Ë²W  Î¥ÆJeÀv ΥƯ”D ²Ë@  ­D"00p³K,hs³kh&¯”  ­D"4ð 8 ðµðµ÷ ‡ðÖ*±‡ðÃ*±‡ ²ËþW  Î¥ÆjDfT ΥƯ”D ²Ë@p³¿Z@ù±oŒ@r³,}@f³00$¯pTADATADATADATADATADATADATADATADATAÐ@  ­D"0D ±8rh.�±„:h¯”  ­D"Hw ÷ ðµðÅ)÷ †ð¥öÿ*÷ w46l0ì‡ ù±oŒ ²Ëp³¿Z,r³,}0f³ÐŽW  Î¥ÆZkf`; ΥƯ”D ²Ë@d©°;@m© …@  ­D"0Èp³„ƒ‚€‡ÃEÿà à ÅÃ5ÿà à à Šø… ÃÃe0Ò�øŠÃà à à Šõ‡„W  ÎÀÁ:þvXu ÎÀÁ¯”D  ­D"0ù±oŒh¯”  ­D" &æ¦ff… Þ �‚ƒ„…‡ªW  ÎíÃJÞ³ Îíï”D„¯½`@f³Ð@  ­D"0"2²Xh¯”  ­D"&ð 8 ðµ!ðÕ€)wð•Öÿ*w„¯½`$f³ÐW  ÎíÃréƒKq Îíï”De³²Z@ù±oŒ@r³®S@a³VN@f³t:@  ­D"0,Õ±®Shù¯ XhÖ¯Ú}h¯”  ­D"0w ÷ ‡w‡w ÷ ú‡ww ÷ ó‡w8ù±oŒ a³VNe³²Zù±oŒa³VN r³®S$ù±oŒ(a³VN.f³t:W  ÎíÃrñ�h~ Îíï”Ds©À�@x³·k@°s@ñ¯4}@f³Ð@  ­D"0Zw³h2w³¼h"q³¯:h ¯”  ­D"^0Š+æ1ÿˆÅÅe à ÷ ß%ÿÿïp’*w÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ °sx³·k"s©À�.f³Ð\ñ¯4}¨W  ÎíÃRñ�H€ Îíï”Dw³@w³¼@ù±oŒ@  ­D"0™²`;h¯”  ­D"w wwù±oŒw³w³¼|W  ÎíÃ:ü�ÜY Îíï”D  ­D"0w³th¯”  ­D",*ÿÿ±‡æ1ÿˆ‡W  ÎíÃj™’È} Îíï”Dr³C�@w³Ô@r³§‘@a³—K@ù±oŒ@s³2 @  ­D"0Tª²e;h¯”00$·\ 1g  ­D"Xw ÷ $‡Ä0,0w÷ †46÷ ‡÷ ðµ)0406 0 ð‹*±‡&ù±oŒ r³C�r³§‘ s³2 .a³—K4w³ÔîW  ÎíÃZ±˜(_ Îíï”Ds©À�@°s@  ­D"0Vx³Çkhx³·khi³‚h>¯”  ­D"Z8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—ð•ÿÿ+‡ÅÅe$&Ä% Ä ý„‡8s©À�D°s´W  ÎíÃR±˜a Îíï”Dq³¯:@i³‚@ù±oŒ@  ­D"0Ѳ˜:h¯”  ­D""w ð*D÷  Õ ýwù±oŒi³‚ q³¯:ÀW 4εÀj:dvw4εÀ¯”Ds©À�@°s@ù±oŒ@a³VN@\±D@  ­D"0ðp³vwh ’±vwh¯”  ­D"€w ð*DÅ Å ýæ¦Y…‚T¦fÃÃeŠæ„ðµ<Ó•_‚ S•Ä ýó¥:ÿÿÓ•:‚ ƒ…¦æ& œ"& ΕæÏÿˆ‚4†×'�ÿù±oŒ0°s|s©À�x| ð*×'ëÿð¤ÿ*±*ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ ‡à ññ÷ ð•Éÿ*‚ƒ‡s©À�s©À�P\±Dha³VNüW  ÓÁz:dˆw ÓÁ¯”D&p³ &@s©À�@ä[;@p³iw@p³vw@p³¾w@ù±oŒ@a³VN@  ­D"0ê�±}sh p³# h*s³þ}h¯”  ­D"€ÁeBÉ ð 8÷ ‡$&w ð*ðµ<S1 ¦à Ö KÊ ñU€ò ñU@ò æ÷ ƒ‚f&œ" ÷ €�† a³VN&ù±oŒRä[;fp³¾wxp³ &r|‚×'�ÿ)×'ëÿð* ðÊ*Ä%0þðÌ*±‡NDÅ Å ý¦æ÷ ƒ‚÷ ñEÿû±U‡÷ ‡÷ ‡÷ ‡,s©À�s©À�s©À�Ja³VNbp³vwhp³iwnp³¾w¸W ?ÆWJ#L?ÆW¯”Dp³ &@s©À�@  ­D"00à¯çeh¯”  ­D"4¦&fæf  ÷ …ƒ�€†×'�ÿ±–‡‚¡‡p³ &"s©À�W  ÓeÀj &Š( ÓeÀ¯”D°s@  ­D"0þ¬¯yäþ¬°y䦰úph ± &hBþ¬±yäþ¬²y䯔 þ¬°yÿÿ þ¬¯yÿÿ((ÿÿ  ÿÿBBFF þ¬±y êW >ÆÀÚb‹¯�=>ÆÀÚ¯”D&p³ &@s©À�@¹«´‰@$9pw@‹¯@=@ û¬Cx0,‹¯�=h¯” û¬Cx€÷ ¦Âe°ÄeȵÄeà Ã~÷ ‡Á DE  ȵÄ2…Åe &Âe ÷ € †ß%'ðÕ@±^ÃeðÅÁ5€ ¹«´‰*‹¯@=Xp³ &`$9pwbs©À�€|ðÕÁ5@ðÕÁ5ðÕÁ58ðÕÅ“B„Äe€Ãe°ÈµÁeÄeÐÿ& q1””BÓ$ðñðñ8ø„Äe q1 ””Bð ñð ñ¡–‡.W  ÎÀÁz &, ÎÀÁ¯”Dæ)ø€HN<&È`Há)ìH>õ[üXHå)^H<&%H ìWµWHŒ&CyH\)ÖKH<&�H¼(yHâ)nEHzâ)sEH<&KqHîT–H â)ŽEH(¥ ³–HLä[;H&{PH`æ[à8Hö°HìWø€H&{ø€Hd6&HÄ%kfHÄ%ˆZH@dì&Hz¬ qH²ô'Ä…H¬ |H°æ)»H#ö)°H4ò)»HÄ%ëH¤ PdH ¦ Ò:H â)_GH)ï)ã‰HìWÞH€ä)TyH$ô'IRH&{¹ZHzìWzH@ô'¤’Hö)’H0â)ÌGHÄ%™wH@Ä%xH î[#HÄ%C�H â)2HH4í) H,ò)BxHí) H-<&%tH<&9€H© Ì`H$zá)[MH Œ&H¤ Ó%HBî)ÔpH<&°pH<&¶pHìW€wH¢ Š(H¤ 2&H(dÖ(HìWwH¬ i^HV¬ v^HPótè!Hí)w H.zò)ýHâ)PH8î)KqHô'ÄHF° xsHŠá[§YHætw(æ@w æBwæDwæFwæHw&À°-H ‚6lF¶€‡8°s W 4Î=ÀJÔ˜@4Î=À¯”Dù¯ X@¥¯ÜK@  ­D"0¬¯²'h¯”  ­D"ð 8ÁeB÷ ‡÷ ‡ù¯ X¥¯ÜK0W vÀÈz &ÿyvÀȯ”D  :©(}hœ:©¿`h˜ó¯ø€h4ž²fahxG©P}h„\±ŒÈh@Ѳ˜:hX:©ZŠh¤:©h °}h ü¯@†hPz<©P}hˆE©‹dh¼a©}h¬ª²e;hœ²2&hlé«@Qh°:©<hŒœ²€&hp¤¯ŒÈhDÕ±àhÖ±fahhd©°;h Œ©?Th€° €h$:©h�zœ²Ñ(htm© …h•±}h:©ÿh”Ô±2&h\ ±8rhLÔ±€&h`<©h´�±‹¯=B‹¯@=F\±ŒÈJ¤¯ŒÈN�±„:R ±8rVü¯@†Z™²`;^Ѳ˜:X^wwwwwwwwwwwwwwwwwwwww€Ô±2&Ô±€& Ô±Ñ(Ö±faœ²2&œ²€&œ²Ñ( ž²fa$ ©ày(Œ©?T,G©P}0<©P}4:©<8:©<:©ÿ@:©¿`D:©(}H:©L:©ZŠP:©Ï_Ta©}B²ww www¶^–%ö N ¶¶€æŽa† é«@Q<©Œ¯`r‹¯�=€W vÀÈz &pKvÀȯ”D„¯½`@’±„:@�±}s@Õ±®S@�±; @h±ì&@;¯P@h±²'@œ«@ù¯ X@Õ±µW@ù¯üX@zà¯çe@,°l@,°z@à¯4@�±v@Ö¯Ú}@¬¯²'@s©’±¾wB�±vF;¯VNJ,°lN,°zRà¯4VÖ¯Ú}Zù¯ X^Õ±®S"^wwwwwww22²X±lE ¥¯ÜK¬¯²'Õ±µW’±„:s©�±“yh^™²`;h¢Ô±Ñ(h²¡«h⌯`rhB’±iwh2•± €hb�±„:hj’±vwh6h±p!h ©àyh*:©Ï_h’±¾wh:2²Xh‚¯” w:6  66,6¶^–%ö N ¶¶€æŽa† ØW vÀÀÁz„(jLvÀÀÁ¯”D:©(}@:©¿`@ó¯ø€@ž²fa@„¯½`@’±„:@�±}s@G©P}@\±ŒÈ@Ѳ˜:@:©ZŠ@Õ±®S@z:©@°}@ü¯@†@<©P}@a©}@ª²e;@œ²2&@h±ì&@é«@Q@:©<@œ²€&@¤¯ŒÈ@Õ±à@Ö±fa@d©°;@zh±²'@œ«@Œ©?T@ù¯ X@° €@Õ±µW@:©@œ²Ñ(@ù¯üX@à¯çe@:©ÿ@m© …@•±}@,°l@,°z@zÔ±2&@à¯4@ ±8r@Ô±€&@<©@Ö¯Ú}@¬¯²'@s©ª²e;B° €F�±{H$9ƒKHåÿ”}×xH$9‘;H¥ÿ%{!™H´:GH <™ewHM”}€QHm”}xQHlz$9ÖWHÙÿ$9ÛWH×ÿ´:i;H¤wi8H ~[qH<™šwHA{ÎåHT;HT;H,w²H,w«H|ws,H$9!XH²ÿC{€»H$92XH¸ÿz´:ó.H´:ûH ~ qHt*ŒsH ~)qH€´:HH´:óH´:/SH ´:2“H´:AH$9‡XH»ÿ<™-H”}âyH<™4HJ,w9qHz”}òiH8$9«pHÔÿ$9¬ Hÿÿ”}»yHbÌwËxH t*·H”}ÓíH7t*ÎH<™$H´:šH€´:œSH´:ŸHˆ´:¤H t*ÊsHT;3Hz¤wÆ8Ht*ä3H@A{òH ~ìYHl�÷H%?{0ÀH$9yXHÄÿ ~ö H5™„¯H$9) HÌÿv�ŽÆH v��ÆH´:6H@”}„:HW”}ŒzHhz´:GTH $9¼pHÓÿ”}”H?”}•RHe$9Õ HÈÿ$9×pHØÿ$9ÛdH­ÿ5™²¯H$9ãpHñÿT;ðHT;ùsHT;ü�H$9û H¾ÿ ~urHv�“ÆHz$9qHÒÿ¤wDyH5™|¯H¤wLyH$9)Høÿv��ÆH$92 HÎÿ´:ü_H”}O:H ~brH$9RqH¨ÿl�álH"$9[qH¤ÿ$9ZqHàÿ@{NÀH z$9nYHÛÿ$96 HÉÿ$9weH˜ÿ”}¼HC$9€}Hõÿ@{0ÀHl�ßlHl�àlH”}ÊH¤wÎ…H ´:ÃHÌw»yHt*©„H$96MHëÿ ~¶rH z$9³YH³ÿ,wTZH´:ƒHv�ãÆHB{NòH´:«H´:—`HÌwóyHPÌwôyH@$9kYH±ÿ”}ðjHk´:®H´:¬pH´:´pH´:µpHz´:· H´:¼pHv�ÇH$97Hóÿ$9H”}D;H´:qH´:Hz´:qH,wäfH´:"qH€´:&qH ´:&H´:$qH´:.qH´:(qH$9¾YH¼ÿ”}™H&$9Ä HÀÿ$9ÄYH¢ÿ´:WHP´:a H$9ÜYHéÿz,w{Hùÿ ~sH´:TqH´:RH$9Hèÿ”}ôHU$9ZZH¶ÿ´:“H ´:ÁH´:t H´:ÄqH´:ÅH8´:ÊH$9CfH¢ÿ$9DfH¹ÿz ~ÀƒH´:éH´:¨H ~´sH$9Z&H›ÿ$9bHºÿ$9`&HÏÿ ~ô�H$9kHìÿ$9{H»ÿ<™H$9~ZHæÿ,wHúÿ´:q!H $9�ZHîÿz$9ŒZH°ÿ”}`H`´:©-HA{0ÀH $9²ZH©ÿ´:x Hv�ØËH;L…H”}4H ~ŒsH´:•H´:šH ÌwëvH�´:ž!H´:£-Hz´:¤}H`”}®Hj$9[Hªÿ$9'H÷ÿ$93Häÿ$9[H©ÿ$9H£ÿ$9H¡ÿ,w³WHýÿ´:ìH$91Hùÿ$93gHýÿ´:òHˆ´:ù-H ~$�H@z´:ùH5™^±Hl�ŽÆH5™f±H ´:#"Hu�VYH”}yHR”}ƒH;E{ÎÌH?{pÆ00$ÏpTADATADATADATADATADATADATADATADATAH$9½rHÍÿ$9Å&HÅÿ”}£Hi´:brH´:crHz$9ÙfHðÿt*b†H@´:krH $9½HÊÿ´:vrH@t*ÊH5™Ù±H Ìwë+H€´:œrH”}¼pHk� |H´:³rH ´:±rH ´:µrH´:¶rH0z´:¸2H´:ÂrH8´:ÃrH”} HD$9BHýÿ5™$²Hl�ÞÆH5™5²H”}8}H%$9g'H§ÿ$9n'H¯ÿ<™_Ht*¶zH$9�sHïÿ$9¦H´ÿz$9°HÕÿ?{pßH ~:‘H€´:[KHÄkZŠH”}«qHV?{�ÓHt*GH$9è'HËÿ$9ë�Hãÿ$9ü�Háÿ$9HÁÿ$9 H¦ÿ”}V}H9”}H H>z´:sH ´:sHx”}]}HA”}UqH6´: sH´:#H´:sH ”}c}H@œ*@wH5™Q²H¤w:dH´:ÌKH?{@øH´:ÑKH$9š�Hßÿz”}óH:”}¿ HS´:ä3H@´:{3H´:|sH ”}ÉH<´:†sH`´:ŒsHœ*¶wH ”}ãH=´:£sH´:©sH´:­sH€´:«sH0´:´sH z ~¢‘HT;8H´:¦sH´:©KHl�ÎÇH $9C�Hªÿ´:¯KHH”}Á!H ´:ÝH$9VH÷ÿ$9XHÇÿ ~Û‘H´:¤sHP$9|Híÿ´:4Hz´:tHT;œwH$9.…Hûÿ´:-tH`´:,dH´:1˜H”}|ŠH ´:74H¤w´‰H<™pTHL$9…HŸÿT;HT;`HE{ÀÚH´:˜Hz$9+…H«ÿ´:òsHœ*@,H”}I"H¤wÚ}Ha� |H$9xQH¯ÿ$9ƒ…Hüÿ<™3}HNa� |H<™DH\$9ª5Húÿ$9«‘HôÿÌwË-Hpœ*· Hz”}ã~HX ~¶zH€”}ö2H-™°H”}ü2H ´:½LH”}HcG{ÎåH$9.’H«ÿ”}ˆKH,wÞHûÿ´:+H$9†H·ÿT;²H”}ˆsHz$9Î…Hÿÿ´:[uH<™s!H´:bYHX”}T3H´:kYHT;H ~GH ´:\MH”}âWHB”}€HdT;DyH”}˜HF´:ÔH-™'±Hz-™(±H´:ÜH”}0€H-™?±HÿÿT;�H <™..HO$9ŸHñÿÌw».H`´:nMH$9±RH�ÿb�ßSH´:�H´:ƒMH@¤w'H”}ÞHEzt*Ö‰H€”}ä3H$-™“±H$9ðHžÿ”}KXH'´:9NHT; zHT;zH”}:dH#™´¯Hœ*H@´:NHt*I"H ´:)NHT;¬!Hz´:+NH(´:8&H;–H<™ZŠH]$9¼^H¿ÿ<™S~H_$9ÌHùÿ´:&Hh<™u~H[´:{HT;;"H”}™H”}5HZT;I"H›#™Ö¯Hz´:âH`´:sH$9pwH�ÿ¤w¼WH$9œSHëÿl�8 H”}�MHl�Ž H´:KwH´:[H€ ~L H´:iwHl�Š H$9ü_H½ÿl�Œ Hz$9`Hûÿ$9#H¬ÿ$9'H¬ÿ$9.HÞÿ”}:YH´:>wH€-™[²H”}`YH ´:÷vH$9ˆHöÿ$9‹Hâÿ´:n'Hl�+ H#$9£8H§ÿ$9¯HÚÿz´:owHv�Ó�H´:èH”}ËHT´:‹wHP´:”H´:œwHt*çH ”}ZH<™/€HQ”}ö H5´:±'H ;ƒKH€$9=xH™ÿ<™á‹Hz¤wðXH l�Ö Hl�ØËH$´:éƒH”}8&H4<™€HP|wÔ€H´:„H(œ*4H´:„H ¤w’MH ”}kH" �œwH´:$�H@´:)Hz”}vNH´:C�H(´:9H $9¶ÈHÐÿ<5sH$9½8HÑÿ”}”fHgl�Q\Hs�®H ~I"Hv�¿‚H ´:d�H`´:h�H ´:H,w�!Hüÿz$9õ8H¤ÿ$9óxHÝÿ$9H ÿ ~{–Hv�–‚H$99HŸÿÌw&qH0”}ŒZH$99H®ÿ$9&Hêÿœ* XH?{ÎÌH ´:ô�H$939Hþÿ´:ü�Hz´:ýH ”}(gHfÌwÎH$9kyHÜÿ,w4FHÿÿ#™ý±H-™´HT;”˜H$9•yHòÿ$9ž!Höÿ$9L H°ÿ$9®!Hõÿ$9¬!HÂÿ´:ÌxHH¤wö Hzl�öÌH!”}ÙfH)”}õH!´:¯xH �BxHÿÿ$9BaHîÿ$9CyHúÿ$9E9Hçÿ$9IyHœÿ´:×xHpd�—}H $9,:HÖÿ”}JwH ¤w{ZH ´:+…H z”}ˆH´:ByH´:FyH <™^qH^ ~5H@”}HwH ,wÃHþÿT;ÛdH€œ*€H”}³wHY”}¶wH$9ëyHÆÿ ~H€#™²H´:WyHHzT;*}H ´:áyH´:³‘HT;7H$95:H ÿ$96:Híÿ´:ÇyH ´:ËQH”}ÛƒH/”}݃H1´:Û‘H´:éQH´:ãyH@$9ZŠHüÿT;$qHz”}ÙƒH-@{NÙH”}ÞƒH2”}߃H3$9ƒ:Hþÿ,wH?{NòH $9¨:H­ÿ´:´‘H´:wQH´:|…H"´:¶‘H@”}׃H+”}ÖƒH*”}ÚƒH.z”}܃H0”}؃H,´:áQH´:¢‘H´:£‘H;@jHu�¯yH�u�±yHƒ$9ý:H¥ÿ$9#Hµÿ$9Ò:H¡ÿ$9";Hšÿ �|…H´:ïQH´:ðyHzu�®yH€u�°yH‚´:azH´:’Ht*›NH€”}](H#œ*8&H€´:4FH ”}’(HG´:A†H0´:B’H ´:D’Hpu�²yH„<™iH$9ÕzHžÿJ´:i†H<™|HK”}¶xH( ~^˜H@v�˜‚H v�›‚H v�ÇH ¯”W ŒÆ€ÀzYMŒÆ€À¯”D¸s©À�@ò[ÿ@í[Kr@ä[³}@ï[Œ@ó[\}@ó[¥@ù±oŒ@$9Ba@ ­ì]0ª¯ªàh*ù¬ÚK0ù¬o†0 ô¨ hý¨Xh¯” ­ì]€¢L‡w ÁDœBÊ ±A°, °,ò5Âeaí¡‡„ôE€ò5 „ôE€ÊE f& ¢‡& ¢  ù±oŒï[Œó[¥ó[\}nò[ÿ2|‡1 ù ñ  Ü…„Þ ‡ßw6ä[³}í[Krä[³}*$9Baÿ ,s©À�0ù¬ÚKù¬o†‡ßw$9Baÿ  s©À�ù¬ÚKøW ŒÆÐÀzœ à`ŒÆÐÀ¯”D¸ò[ÿ@í[Kr@á[ÚK@ä[³}@ï[Œ@æ[L @ù±oŒ@ ù¬o†0^ô¨ h,ô¨hô¨ hP2ý¨Xh­ó4 ­¨t ­Ðt ­øt¯” ù¬o†b÷ 00$×\ 1g¦Þ5Îe¦w Á… Bv ù    ù ‡Ê €‚Ê5ò÷Bwwù çF ­¨ù±oŒ ï[Œ.í[Kr8ò[ÿPä[³}V ­ÐZ­ó^á[ÚK ­¨&À°Œ€æcÿˆpŒ€‡ï[Œ æ[L æ[L  ­Ð fÁ±Œ€‡æeÿˆqŒ�‡ï[Œ æ[L æ[L BW ŒÆÐÀzœ À]ŒÆÐÀ¯”D¸ò[ÿ@í[Kr@á[ÚK@ä[³}@ï[Œ@ù±oŒ@ ù¬o†0Vô¨ h&ô¨hô¨ hJý¨Xh­ó4¯” ù¬o†Z¦Þ5Îe‡w Á… Bv ù    ù ‡Ê €‚Ê5ò÷B‡wù è.ù±oŒï[Œ(í[Kr2ò[ÿJä[³}R­óVá[ÚKšW tÀ0ÀjŒ(xQtÀ0À¯”D¸s©À�@¹«´‰@æ[xQ@T;œw@ þ¬íy4ŠÃ©v~hp©Ó  ­øt¯” þ¬íy ñæ[xQp©ÓÑ( þ¬íy€æÿˆ×-ñ‡÷ ¦ƒD- ‚ŠEŠ… %µ¬ Âó … Â ÀœÁÀ À À ÀU€À �€ÈEðU* p©Ó s©À�T;œw  ­øæ[xQ¹«´‰ ‚€Ö ‡  ­ø‡4W >ÆÈz6aã8>ÆÈ¯”D¸ô¨ @æ[xQ@í[Kr@ä[³}@ï[Œ@ó[¥@ù±oŒ@é[Ì`@ ­Kr4¬Éª2qhɪ3qhzɪ#qhɪ;rhɪJrhɪ3&hɪKrhɪ#&hɪ2&hɪ;'hɪK'hɪJ'h ­ÿ4T”«�wh­ó4P ­¨t ­Ðt ­øtù¬ÚK0¯” ­Kr€Ê5R„ ´Å J¦ƒ1 r-€‚ù… ;Dt-ÍE ÍU+ÍUDô,ñ qÄ õ ô €ôE€ù "ä[³}^ä[³}dä[³}~æ[xQ4|õ5 õ  Dô €ôE€ù EÍ5€¼‚‡$æ[xQ ­ÿ€ÊEW¬X‡ò 5ƒ2ó /�Äô �& 4 &æ9ÿˆ´ †&æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€wÐ ó[¥€|ò5ò ƒó �ó îææuÿˆ†óE ææuÿˆá‡óU€Ê5`AÊU ò & ¦ÎEð& & ¦¦ÎE& DÄe&æfæré[Ì``øæ ÿˆ$‡Ì‹"�ò5ò & ¦& & ¦¦& DÄe&æfæHæ ÿˆ‡Ì‹�¡‡ÊE ÊU±‡6é[Ì`­óTƒ¦)„ÔÔÔÔÔÔÌÔaÔŒwÞ 6 ÷ w Á‚ ÃÃeö ù 1 wÎ ‡0" ­¨, ­Ð0ù±oŒ4ï[ŒFí[KrJä[³}Nô¨ 8W >ÆÈz6aò8>ÆÈ¯”D¸s©À�@æ[xQ@ó[¥@é[Ì`@ ­Kr4–ɪ2qhɪ3qhɪJrhɪ3&hɪKrhɪ2&h:ɪK'hɪJ'h ­ÿ4B”«�wh­ó4 ù¬ÚK0¯” ­Kr€Ê5G„ ´Å ?¦ƒr-€‚ù… 2Dt-ÍE ÍU"ÍUDÄ õ ô €ôE€ù õ5 õ  Dô hæ[xQ|€ôE€ù EÍ5€Å‚‡æ[xQ ­ÿ€ÊEW¬O‡ò ,ƒ)ó &�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€wÐò5ò ƒ ó[¥€|ó �ó îææuÿˆ†óE ææuÿˆá‡óU€Ê5`AÊU ò & ¦ÎEð& & ¦¦ÎE& DÄe&æfææ ÿˆ$‡Ì‹"�ò5`é[Ì`Nøò & ¦& & ¦¦& DÄe&æfæHæ ÿˆ‡Ì‹�¡‡ÊE ÊU±‡$é[Ì`­óßîws©À� ù¬ÚK¾W >ÆÈz6aì8>ÆÈ¯”D¸é[Ì`@ ­Kr4Fɪ3qhɪ3&hɪKrhɪK'h ­ÿ4””«�wh­ó4ù¬ÚK0¯” ­KrJÊ5¦ „Ê5€ ‚Ê5øà öƒô…2Å Å ÍUEÍ5€÷‚‡  ­ÿ€ÊEÊ5@?ò & ¦ÎEð& & ¦¦ÎE& DÄe&æfææ ÿˆ$‡Ì‹"�ò5ò & ¦& & ¦¦& DÄe&æfæH2é[Ì`ré[Ì`|æ ÿˆ‡Ì‹�¡‡ÊU±‡ ­ó‡TW >ÆÈz6aã>ÆÈ¯”D¸ô¨ @æ[xQ@í[Kr@ä[³}@ï[Œ@ó[¥@ù±oŒ@é[Ì`@ ­Kr4~ɪ;rhɪJrhbɪKrhɪ;'hɪK'hɪJ'h ­ÿ4씫�wh­ó4P ­¨t ­Ðt ­øtù¬ÚK0¯” ­Kr€Ê5;„ ´Å 3¦ƒ1 r-€‚ù… $DÍUt-ÍE Dô,ñ qô €Ä ôE€ù EÍ Ó�‚"ä[³}Zä[³}`ä[³}tæ[xQ|‡  ­ÿ€ÊEò ÊU ‡æ&W¬2‡ƒ/ó ,�Äô �& 4 &æ9ÿˆ´ †&æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óUó[¥t|€¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡<é[Ì`­óTƒ¦)„ÔÔÔÔ00$ßpTADATADATADATADATADATADATADATADATAÔÔÌÔaÔŒwÞ 6 ÷ w Á‚ ÃÃeö ù 1 wÎ ‡0" ­¨, ­Ð0ù±oŒ4ï[ŒFí[KrJä[³}Nô¨ bW >ÆÈz6aò>ÆÈ¯”D¸s©À�@æ[xQ@ó[¥@é[Ì`@ ­Kr4hɪJrhɪKrhɪK'hɪJ'h ­ÿ4Ú”«�wh­ó4 ù¬ÚK0¯” ­KrlÊ50„ ´Å (¦ƒr-€‚ù… DÍUt-ÍE Dô €Ä ôE€ù EÍ Ü�‚‡^æ[xQ ­ÿ€ÊEò ÊU ‡æ&W¬)‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€¡„ƒ.‡Ê5`.ó[¥b|ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡*é[Ì`­óßîws©À� ù¬ÚKrW >ÆÈj6aì>ÆÈ¯”D¸é[Ì`@ ­Kr4BɪKrhɪK'h ­ÿ4l”«�wh­ó4ù¬ÚK0¯” ­KrFÊ5¦ „Ê €‚Ê5ùà ÷ƒõ…2Å Å ÍUEÍ ø�‚‡  ­ÿpÊEò ÊU ‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡<é[Ì`­ó‡W tÀXÀz9axtÀXÀ¯”D¸ô¨ @í[Kr@ä[³}@ï[Œ@ó[¥@ù±oŒ@é[Ì`@ ­Kr4Ôɪ3qhɪ2qhɪ#qhZɪ;rhɪJrhɪKrh ­ÿ4T”«�wh­ó4P ­¨t ­Ðt ­øtù¬ÚK0¯” ­Kr€„1 ¦Ê5‚ú‚‡ò û¦¦‚ Ž BÊ5BÊUW¬/‡Ä -ò ƒ'ô,±Ä ó €ææwÿˆóE€ò5ò  ä[³}<ó[¥\ä[³}\|ƒó  €ææwÿˆóE€Ê5 ÁÊE Ž‚¾Ö ‚­W¬³‡Ê5 °Ä ®„,«ÊE é@ó[¥ ­ÿ€ÊEW¬X‡ò 5ƒ2ó /�Äô �& 4 &æ9ÿˆ´ †&æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€wÐ ó[¥€|ò5ò ƒó �ó îææuÿˆ†óE ææuÿˆá‡óU€Ê5`AÊU ò & ¦ÎEð& & ¦¦ÎE& DÄe&æfæré[Ì``øæ ÿˆ$‡Ì‹"�ò5ò & ¦& & ¦¦& DÄe&æfæHæ ÿˆ‡Ì‹�¡‡ÊE ÊU±‡6é[Ì`­óTƒ¦)„ÔÔÔÔÔÔÌÔaÔŒwÞ 6 ÷ w Á‚ ÃÃeö ù 1 wÎ ‡0" ­¨, ­Ð0ù±oŒ4ï[ŒFí[KrJä[³}Nô¨ >W tÀXÀz9aÐtÀXÀ¯”D¸s©À�@ó[¥@é[Ì`@ ­Kr4Äɪ3qhɪ2qhɪJrhɪKrh ­ÿ4B”«�wh­ó4 ù¬ÚK0¯” ­Kr€„¦Ê5‚ú‚‡ò û¦¦‚ Ž <Ê5<ÊUW¬)‡Ä 'ò ƒ!Ä ó €ææwÿˆóE€ò5ò ƒó  €8ó[¥L|ææwÿˆóE€Ê5 ÇÊE Ž‚ÄÖ ‚³W¬¹‡Ê5 ¶Ä ´„,±ÊE é0ó[¥ ­ÿ€ÊEW¬O‡ò ,ƒ)ó &�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€wÐò5ò ƒ ó[¥€|ó �ó îææuÿˆ†óE ææuÿˆá‡óU€Ê5`AÊU ò & ¦ÎEð& & ¦¦ÎE& DÄe&æfææ ÿˆ$‡Ì‹"�ò5`é[Ì`Nøò & ¦& & ¦¦& DÄe&æfæHæ ÿˆ‡Ì‹�¡‡ÊE ÊU±‡$é[Ì`­óßîws©À� ù¬ÚK¦W tÀXÀj9aàtÀXÀ¯”D¸é[Ì`@ ­Kr4>ɪ3qhɪKrh ­ÿ4””«�wh­ó4ù¬ÚK0¯” ­KrB¦Ê5‚ú‚‡ò û¦¦‚ Ž Ê5ùÊUŽ‚öÖ ‚å  ­ÿ€ÊEÊ5@?ò & ¦ÎEð& & ¦¦ÎE& DÄe&æfææ ÿˆ$‡Ì‹"�ò5ò & ¦& & ¦¦& DÄe&æfæH2é[Ì`ré[Ì`|æ ÿˆ‡Ì‹�¡‡ÊU±‡ ­ó‡bW TÇøÀz3ax}TÇøÀ¯”D¸ô¨ @í[Kr@ä[³}@ï[Œ@ó[¥@ù±oŒ@é[Ì`@ ­Kr4¬Éª;rhɪJrhɪKrhB ­ÿ4씫�wh­ó4P ­¨t ­Ðt ­øtù¬ÚK0¯” ­Kr€„1 ¦Ê5‚ú‚‡ò û¦¦‚ Ž .Ê5.ÊUW¬‡Ä ò ƒô,±Ä ó  €ææwÿˆóE€Ê5 ÕÊE ä[³}<ó[¥\ä[³}4| Ž‚ÒÖ ‚ÁW¬LJÊ5 ÄÄ Â„,¿ÊE éó[¥ ­ÿ€ÊEò ÊU ‡æ&W¬2‡ƒ/ó ,�Äô �& 4 &æ9ÿˆ´ †&æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óUó[¥t|€¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹00$ç\ 1g€ÊE ÊU±‡<é[Ì`­óTƒ¦)„ÔÔÔÔÔÔÌÔaÔŒwÞ 6 ÷ w Á‚ ÃÃeö ù 1 wÎ ‡0" ­¨, ­Ð0ù±oŒ4ï[ŒFí[KrJä[³}Nô¨ ŠW TÇøÀz3aÐTÇøÀ¯”D¸s©À�@ó[¥@é[Ì`@ ­Kr4œÉªJrhɪKrh ­ÿ4Ú”«�wh­ó4 ù¬ÚK0¯” ­Kr€„¦Ê5‚ú‚‡ò û¦¦‚ Ž (Ê5(ÊUW¬‡Ä ò ƒ Ä ó  €ææwÿˆóE€Ê5 ÛÊE Ž‚ØÖ ‚8ó[¥$|ÇW¬͇Ê5 ÊÄ È„,ÅÊE éó[¥ ­ÿ€ÊEò ÊU ‡æ&W¬)‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€¡„ƒ.‡Ê5`.ó[¥b|ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡*é[Ì`­óßîws©À� ù¬ÚKjW TÇøÀb3aà~TÇøÀ¯”D¸é[Ì`@ ­Kr4>ɪKrh ­ÿ4p”«�wh­ó4ù¬ÚK0¯” ­KrB¦Ê5‚ú‚‡ò û¦¦‚ Ž Ê5ùÊUŽ‚öÖ ‚å  ­ÿtÊEò ÊU ‡¡*‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡@é[Ì`­ó‡fW  ÓíÃbö&€ Óíï”Ds©À�@°s@�±; @ù±oŒ@  ­D"0ªù¯üXhf³y:h ¯”  ­D"€w ÁOB‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±DÂÂe(¦„Äe$2ƒÃeäÿæÓÏÓ Ó(‹ÿˆ‡Ì%[]Ì%<> ƒù±oŒ °s@°s2| ÷ „팂1 >æ€æÉÿˆ‡ß‹�± J‡ �±; (s©À�FW  Î¥Æj7q„s ΥƯ”Ds©À�@ ²Ë@x³Çk@°s@i³‚@  ­D"0‚r³C�hw³Ôh*¯”  ­D"€ð 8 ðµ ðµð �¡‡ð•Öÿ*±‡÷ ÷  4 6Åå ÁB…„ƒÅeÃå»Áe‚‡…D&&÷ \Е-�÷ Е-�'÷ V‡w DÅ… ƒ÷ &p¹«WŒ€tЕ.À À À ce÷ À …Е:÷ Å ù Â÷ B‡Á% Á &À÷ €G`ЕJЕAЕN‡Ð•FЕEЕB‡Ð•MЕi©€‰>:©<XݪK€ðAЕR‡Ð•AЕPЕR‡Ð•MЕAЕY‡Ð•JЕUЕN‡Ð•JЕUЕL‡Ð•AЕUЕG‡Ð•SЕEЕP‡Ð•OЕCЕT‡Ð•NЕOЕV‡Ð•DlЕEЕC‡œW °ÇzíÄ.°Ç¯”D:©¿`@:©ZŠ@:©@<©P}@a©}@¹«WŒ@é«@Q@:©@:©ÿ@<©@[©(}@:©Ï_@* Zg`©°Zg(ª0Œ©?Th¯” Zg(ª€w && D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ À ÀCƒ ÷ DÖ ÜЕ%„Ì¥Vå ‡A¦¶6D‡¹«WŒB<©P}€|÷ (Š€‡Ð‹à üÀ ‡•— <ð— >óÂåA×�— Ô ‡`Ï)9HËÊÒÈÇÆ%EKQNdi%¼»vhlAP”à ý‡AЕ €øB”f�‚÷ �à õ‡& æÎe6& ¦æÎe/& æÎe*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎe & <:©:©ÿ ,:© 6<©( x:©¿`j €t¦æÎeЕ A‚¦Þ à ÷–%‡& æÎeòA÷ à û‡Ð• à ü‡A÷ E‡AÂ÷ E‡Ð• Aæ÷ AÎ ûÖ Â ÷ $Е.÷ : :©Ï_x *:©˜ 2[©(}Ha©}Té«@Qf[©(}~[©(}00$ïpTADATADATADATADATADATADATADATADATA0ðÂ÷ AЕ; ÷ à à‡Â ýð¥ ÿÿùÀ ø:©ZŠ”W tÀ0À: tÀ0À¯”D ,ú¨@,hú¨C,h¯” 0ƒÎe¦à Ê —®ÿÿ—®ÿÿ Ò ñ‚‡ÒW XÀzNy …XÀ¯”DN©ÛH›©€QH ©ÛHN©BxH ›©BxH ©€QHN©:dH ©BxH›©ÛHN© H þ¬¨ ä: ©\}hN©t!h›©t!hN©\}h›©\}h ©t!h¯”‚W tÀ0À2­xxtÀ0À¯”D "$©CTh¯” & @€ @€‚W ÐÀB*¯¤`ÐÀ¯”Dܲó`@ ke(ª0Ÿ sh¯” ke(ª ÀSw ܲó`¼W XÀBÀ€WXÀ¯”Dܲ#@ܲGd@ <À€Wh¯” @ÂÁ÷ ¶¶Ÿ�A’v�öÎ ¶ŸÎÏwܲGd>ܲ#W €ÀB3à€À¯”DܲGd@ ke(ª0ˆ3àh¯” ke(ª€ÂÁ÷ �‚C …Æå‚€&æqÿˆñF¦rÁeüÿ @ÅAE2„cD!†Á Dï²2°rÁÁܲGd|8ÿ– €H‡ªW €ÀJ4Ùf€À¯”Dܲ#@ܲGd@ ke(ª0"4Ùfh¯” ke(ª& ÷ & CÎÊCÉæ w ܲGd$ܲ#rW tÀ0À: tÀ0À¯”D  ú¨@,hú¨C,h¯” ƒÎe‡¶W øÀJF øÀ¯”Dܲ#@ܲGd@ ke(ª0.F h¯” ke(ª2ÂÁ>÷ qqqžQ–Ñ•áÎÏwܲGd0ܲ#¢W øÀJ;¯VNøÀ¯”Dܲ#@ܲGd@ ke(ª0F VNh¯” ke(ªÂÁ÷ RRRæwܲGdܲ#îW €Àrr À+€À¯”Dܲ#@ ke(ª0D¢À+h!!À�h‘À�h2À+h xQh}…Àh$r À+h¯” ke(ªHÀ9À7À; ÀuÀwÀyÀ{D& f¡‡W#ÿÿv&wFܲ#ÖW ÐÀRb³s;ÐÀ¯”D V9€phBìYh@; (hv8hª:h¯” Z÷ L@W‡÷ @@@‡÷ 8@ ‡Õ A B€Âe— †Â Á @ ûí �@‡÷ A@@K@P‡Õ @‡‚W ÐÀBy¯XÐÀ¯”Dܲó`@ ke(ª0ö,h¯” ke(ª Àw ܲó`¨W HÁJ†¯THÁ¯”Dܲ#@ܲGd@ ke(ª0 ö`Th¯” ke(ª$ ÷ ƒæ& ææw ܲGd"ܲ#šW øÀJ³¯ˆøÀ¯”Dܲ#@ܲGd@ ke(ª0{ˆh¯” ke(ªÂ ÷ æ_w ܲGdܲ#šW  ÁJÖ¯L Á¯”Dܲ#@ܲGd@ ke(ª0q!òyh¯” ke(ªÂ ÷ æew ܲGdܲ#šW øÀJÖ¯ˆøÀ¯”Dܲ#@ܲGd@ ke(ª0q!ˆh¯” ke(ªÂ ÷ æaw ܲGdܲ#2W <ÁXÀzÞ¯g'<ÁXÀ¯”Dܲ#@ܲGd@ ke(ª0Z #n~h(I&}h.²0 hïyeh@ñ�~h"œw0 h#}h:õ}@h4Ë:Kh ¯” ke(ª^ÀÀ!À# ÷ Î#wÀ)À5 À±ÀÑÀÀ‡Â�÷ CÒ&wܲGd$ܲ#PܲGd\ܲ#ªW €ÀJ#Oq€À¯”Dܲ#@ܲGd@ ke(ª0"#Oqh¯” ke(ª& ÷ ÄCÃÒÄ úæYw ܲGd$ܲ#¢W €ÀJ#€€À¯”Dܲ#@ܲGd@ ke(ª0#€h¯” ke(ªÂ ÷ f¦ æYw ܲGdܲ#˜W tÀ0ÀB‰'dtÀ0À¯”D ke(ª0(‰'dh‰'àeh¯” ke(ª,A@=‡BA@=½‡ÂW XÀJ‹(XÀ¯”Dܲ""@ܲ#@ܲGd@ 4‹(h¯” 8ÂÁ<÷ ÁeBÉ ‰¡¡¡ ææÏwÀ€÷ ܲGd.ܲ#6ܲ""êW  ÁRq³˜: Á¯”Dܲ#@ܲGd@ ke(ª0Zñ’˜:h·kh¯” ke(ª^À À & & 00$÷\ 1g& & ÂÁ`÷ ¶ fRCÃÒ�CÃÒ�RC  à ÒÒÒÒÒÒ&w ܲGd\ܲ#¤W €ÀJœ,Oq€À¯”Dܲ#@ܲGd@ ke(ª0œ,Oqh¯” ke(ª ÂÁ÷ & B‰æAwܲGdܲ#šW €ÀJË-–€À¯”Dܲ#@ܲGd@ ke(ª0Ë-–h¯” ke(ªÂ�÷ æqw ܲGdܲ#„W ÐÀ:,°òÐÀ¯”D ke(ª0œ,òh¯” ke(ª CË @ÊAW ÿÿHÐ ÷‡žW øÀJ,°VNøÀ¯”Dܲ#@ܲGd@ ke(ª0œ,VNh¯” ke(ªÂÁ÷ RæwܲGdܲ#¾W øÀJ,°ÄQøÀ¯”Ds©À�@ܲGd@ ke(ª06œ,ÊQh¯” ke(ª:Â�÷ �‚ÆåPæ)€&ÿˆÂ ÊÀ(Ö ‘“Α•À û‡ ܲGd&s©À�°W øÀJ,°:døÀ¯”Dܲ#@ܲGd@ ke(ª0(œ,:dh¯” ke(ª,ÀAÂÁ÷ „& & &&&wܲGd*ܲ#šW øÀJ,°€øÀ¯”Dܲ#@ܲGd@ ke(ª0œ,€h¯” ke(ªÂ�÷ æ?w ܲGdܲ#¢W  ÁRv°L Á¯”Dܲ#@ܲGd@ ke(ª0ùòyhq:òyh¯” ke(ªÂ ÷ æcw ܲGdܲ#ÂW œÀXÀJ•_MœÀXÀ¯”Dܲ#@ܲGd@ :•_Mh•fMh¯” >ÀÀ ÂÁ~÷ Qž�áÑ QžŠÑ QÑ IæÏwܲGd<ܲ#ÔW ÁXÀJÑ_MÁXÀ¯”Dܲ#@ܲGd@ LÑ_MhÑfMh¯” PÀ À  Áxæ ÷ qqfII1Š¡É �qq ÎÏ wܲGdNܲ#¾W œÀXÀJÔ_MœÀXÀ¯”Dܲ#@ܲGd@ 6Ô_MhÔfMh¯” :ÀÀ ÂÁ÷ Qž�áÑ QžŠÑ QæÏwܲGd8ܲ#¨W XÀBœw³XÀ¯”Dܲ#@ܲGd@ (œw³h¯” ,ÂÁ÷ QžÑ•áf Ñ IæÏwܲGd*ܲ#¨W tÀXÀBœ,³tÀXÀ¯”Dܲ#@ܲGd@ (œ,³h¯” ,ÂÁ÷ QžÑ•áf Ñ IæÏwܲGd*ܲ#ÔW ÄÀXÀJ q_MÄÀXÀ¯”Dܲ#@ܲGd@ L q_Mh qfMh¯” PÀ Àæ  Áx÷ qqfII1Š¡É �qq ÎÏ wܲGdNܲ#¨W øÀJ±u~øÀ¯”Dܲ#@ܲGd@ ke(ª0 zQÀDh¯” ke(ª$& ÂÁ÷ RRRI! æwܲGd"ܲ#2W ÐÀR±\MÐÀ¯”D,«0z@ܲGd@ì)` @¯ªà@ „|Sì]h¯” €ÂÁ÷ ƒÃæÎΕƒÒÒÒ €Ä4ÄÄe €÷ À† Æe � ‡æf…Õ &æ¦f&Äü €�‚ƒ„…–%&ܲGd.,«0z2ì)` @¯ªàl,«0zpì)` |æsÿˆ"W XÀR5dXÀ¯”Dܲ""@ܲ#@ܲGd@ ‚ãf &hãf›rh¯” €ÀÀÂÁ€÷ ÁeÉ Iá Iá &á #á Iá á a(Ia(Iá BCÃD"‘â�CÃâ�"�†æÏ wÀܲGd|ܲ# |€÷ ܲ""ºW ¨ÀZ °Pw¨À¯”Ds©À�@ ( °Pwh °ôxh °ƒ…h ° zh °\qh¯” ,& & & & Aff&ÿˆÀ‡Þ € ‡s©À�¬W ¨ÀB“±ä¨À¯”D °Pw@4°u~@ ,áy sh¯” 0Õ fB ÁA÷ À & & f¦w4°u~. °PwºW ÐÀB,°H:ÐÀ¯”DݪK@d©°;@ :4°u~h¯” >W Æå„&æ=ÿˆÆe€�÷ Áeô@ BÀè÷  � ‡$ݪK6d©°;ØW øÀR—±¼øÀ¯”D ° z@´²§*@ °\q@4°u~@ <ñ�}h¯” @& Õ%NBwA÷ & f¦ææÿˆ†w€Èw ° z4°u~2 °\q>´²§*W ÐÀR—±ØsÐÀ¯”00$ÿpTADATADATADATADATADATADATADATADATAD,«0z@ܲ#@ܲGd@ð)€%@ ZªgÀ…h¯” ^&  ÷ Ä‚& ´æÎe æmw&f¦æ&fÅÅe Äü …„ƒ‚�€æsÿˆ&ܲGd,«0zð)€%,ܲ#B,«0zFð)€%êW ÐÀBÕ±æÐÀ¯”DܲGd@ ke(ª0pIqÎh¯” ke(ªtÂ�÷ ÄŸÿ€À  _(‚Æå � ?‚fæ'& fæ'ÿˆ† ?‚ÁEðÿ@@€ € € €a ±B Á ýĈ0ÄÆe €‡ ܲGdÄW øÀRÕ±žøÀ¯”Ds©À�@ܲGd@ ke(ª04Kq¾ hKq ^h¯” ke(ª8ÀKÀMÂ�÷ „& & &&&ÿˆÖ €È‡ܲGd4s©À�¨W €ÀBsrà€À¯”DܲGd@ ke(ª0.sràh¯” ke(ª2ÂÁ÷ �‚Áeüÿ@AB ú°²ì‡ܲGdžW øÀJá±#øÀ¯”DܲGd@ܲ@w@ ke(ª0Yq„h¯” ke(ªÀ ÂÁ÷ wܲGdܲ@w¸W œÀXÀRUs€%œÀXÀ¯”Dܲ#@ܲGd@ ke(ª0(cs}hUs€%h¯” ke(ª,ÀQÀÕÂÁ÷ ƒ‚³Î&wܲGd*ܲ#‚W ÐÀBÕ±zÐÀ¯”Dܲó`@ ke(ª0[qM…h¯” ke(ª À/w ܲó`¢W øÀzä±ÈxøÀ¯”DlOp…Hêÿõ)àHøÿô)–œHôÿá)àHúÿé) xHèÿä)p Hðÿð)€%Hþÿó[° Höÿì)` Hìÿô)p Hîÿð)û5Hòÿ  ¯”W XÀJÛxÀ+XÀ¯”Dܲ""@ܲ#@ܲGd@ vÛxÀ+h¯” zÄæ €W#0A Á%ÿÿ+BÂ%ÿÿ&AB`B`Dà& Á ¦B~ÂÁ>÷ �‚ÁeÂe �Jb"Šbš€à€ "�â•«†wÀ€÷ HܲGdpܲ#xܲ""®W øÀJý± XøÀ¯”Dܲ#@ܲGd@ ke(ª0&–wh¯” ke(ª*ÂÁ ÷ ƒöƒæææGwܲGd(ܲ#ºW €ÀRyÀ€À¯”Dܲ#@ܲGd@ú¨C,@ ke(ª0$yÀh¯” ke(ª(ÂÁ÷ Ã÷ ’ŠæwܲGdú¨C,&ܲ#ÐW  ÁR²Ïy Á¯”Ds©À�@ܲ#@ ke(ª0@Iqh0Ïy€}h¯” ke(ªDÕ ÁB÷ (W/ ‚DÄ Á üÁ7‚ ½‡f& æ}w(s©À�Bܲ#ºW €ÀJ•y€%€À¯”Dܲ#@ܲGd@ ke(ª02•y€%h¯” ke(ª6ÂÁ÷ @ƒ€à ÃÒƒà ðæEwܲGd4ܲ#†W XÀZ ²#XÀ¯”Dܲ#@ܲGd@ Zg(ª0 •y@h.•y–hX:`© ¯” Zg(ª€Â ÷ ‚À   ÂÂe2Žæ§w ÷ 7 ·ÎNæ§wæ&f¦æ&fÅCDE‚Âe �ÁåÄ �> ܲGd X:`©0ܲ#:ܲGd>X:`©BX:`©HNPܲ# dX:`©(|•ùÄ � üË …„ƒ‚�€†cæsÿˆ X:`© ²W ÐÀB ²zÐÀ¯”DܲGd@ܲ@w@ 2Ösh¯” 6À ÂÁX÷ ƒÃeÄÔÔÅETÅETwܲGd4ܲ@w’W ÐÀB ²4fÐÀ¯”Dܲ#@ܲGd@ z4fh¯”  ÷ æ-w ܲGdܲ#VW ¾ë€»bž²jM¾ë€»¯”Dܲ""@ܲ#@$99@ ¤¼��`h&¼�£`hìy�`h ìy£`h¯” €æ& @À‹EAÀŠÀ‹:Á%ÿÿ NPæ& @À‹5AÁ ÁE& B — _"‚ƒÃEðÿÂ@�  ±D à ýQÀŠí‚ ‚ ‚ ‚ ¦ö5öEæ‰,|wæ+wÖ ÎE€È‡Ö À÷ ‡ܲ#ܲ#$99(ܲ""|W ÐÀ:ž²õxÐÀ¯”Dܲ#@  Ã�HXh¯” & æ1w ܲ#vW ¨À2´²§*¨À¯”D ´²§*h¯” ææ)ÿˆææÿˆ‡vW <Á¨À:ܲ""<Á¨À¯”D ke(ª0ܲ""h¯” ke(ª& ææÓÿˆ�W ÐÀJܲ#ÐÀ¯”Ds©À�@ ke(ª0ܲ#hܲ#h¯” ke(ª¦ÿˆ€È‡s©À� W øÀJܲó`øÀ¯”Dܲ#@ܲGd@ ke(ª00$\ 1g0ܲó`h¯” ke(ªÂ�÷ ƒææ&w ܲGdܲ#ÎW øÀJܲ)døÀ¯”Dܲ""@ ke(ª0Lܲ)dhܲGdh¯” ke(ªP„„C“Âà� ‡&  ûÂ`‚ ‚`Ba¦—#ÿÿ  ‡ à õ�‚LÀ€÷ Lܲ""¢W øÀBܲ@wøÀ¯”Dܲ#@ ke(ª0(ܲ@wh¯” ke(ª,Æå‚CÒÒC    ÒÒÒÒ&w*ܲ#^W ~ÌR©~̯”Dܲ#@ܲGd@ ¬ã.ÁQhœ,1hHœw©h€¯” €ÂÁ`÷ Áe BBCC÷ ñ‰æw÷ qqq‡ÂÁ0÷ fqþÿCÑÑÑÑ Ñ QÑ Iæ­ܲGd4ܲ#VܲGd4|wÂÁ¦÷ CÑ QÑ QqÑÉέwܲ#ܲGd2ܲ#tW œÀ¨Àró}œÀ¨À¯”Ds©À�@ܲ#@ܲGd@ ©L @$9Î…@ ©œw@ú¨C,@ ˜ó0hó}h¯” €Àÿÿ æjÂÁ ÷ Ã÷ 2@ ò  „Äe÷ '‡ò²²ò ²²ƒÒÊæ�wß Ä Ìå/*jܲGd"ú¨C,8 ©œw> ©L lܲ#ps©À� |< ò ú Æe‡$9Î…´W XÀJˆ¯�XÀ¯”Ds©À�@ܲGd@ ke(ª0,C€ph¯” ke(ª0ÀÍÂ�÷ „& & &&&ÿˆ€È‡ܲGd,s©À�¬W €ÀJ—€%€À¯”Dܲ#@ܲGd@ú¨C,@ —€%h¯” " ÷ Ã÷ Šæ�w ܲGdú¨C, ܲ#–W €Àz¦}€À¯”Ds©À�@N©Û@N©û]@ܲ#@ܲGd@¹© X@N©Bx@N©{8@N©{@$9Î…@ú¨C,@ „¦}h¯” €ÂÁ÷ Ã÷ Ã÷ *‡Äeò ²¤² ¤ò¤ò¤Êöf æ•wß äò úNܲGdú¨C,N©Û¹© X$N©BxDN©{PN©û]ZN©{8^fhܲ#ls©À�rs©À�~$9Î… | Æe ‡èW XÀR1àyXÀ¯”DN©Û@Ý©%€@ XN©û]hN©{8hN©{h¯” \&À&À&Àf¦æ&f‚� Ã÷ ‘ ‘‘`ü …„ƒ‚�€–%Ö æsÿˆ*N©Û.Ý©%€$W €ÀJ` €À¯”Ds©À�@# z@$9Ì@ †s©& Â�÷ Ã÷ ‚Žæ—ö(wß Ã÷ ‡*ܲGdú¨C,$(*ܲ#.s©À�4N©Û8Ý©%€ÀW €ÀJ[!}€À¯”Dܲ#@ܲGd@ú¨C,@ 2[!}h¯” 6Â�÷ Ã÷ ²²2 ƒÒÊæ“w ܲGdú¨C,4ܲ#ÒW €ÀB#ày€À¯”DÝ©%€@ ©Û@ R ©L h¯” V&f¦æ&f‚ Ã÷  Ìå/< Á ‰ ü …„ƒ‚�€Ö æsÿˆ ©ÛÝ©%€¬W tÀ€ÀbÓfÀ]tÀ€À¯”Ds©À�@G©> @$9�s@G©VN@´:$�@´:4F@ ÌR«h¯” €&¦)€æ_ÿˆæ& & & æ & && && Εæææ ÿˆ6‡¢æ1ÿˆã& ææææÿˆ†æ1ÿˆñææ)ÿˆÈ‹& & & ,s©À�.G©> 2G©VN6´:$�B$9�sZG©> nG©> T|& & & & & & Εæææ ÿˆ†æ1ÿˆé€± & ææÿˆÖ �æaÿˆ@ –€ŽŽ‡G©> G©VN´:4F6G©> ÀW €ÀJ q}€À¯”Dܲ#@ܲGd@ú¨C,@ 2 q}h¯” 6Â�÷ Ã÷ ²²2 ƒÒÊæ‹w ܲGdú¨C,4ܲ#¨W €ÀJ‰r€%€À¯”Dܲ#@ܲGd@ú¨C,@ ‰r€%h¯”  ÷ Ã÷ æw ܲGdú¨C,ܲ#W tÀÀÁBs@800$pTADATADATADATADATADATADATADATADATAtÀÀÁ¯”Dܲ#@ܲGd@ �s@8h¯” €Â Á÷ ÁeCÃB‰±±Büÿ‚aIž±B±’±�BJŠbÉCüÿB¡±¡B±’à É’É�BܲGd| & & ¦¦æ wܲ#ÄW €ÀR9wK€À¯”Dܲ#@E©4d@ܲGd@ú¨C,@ (9wKh¯” ,ÂÁ÷ Ã÷ ò òæ›wܲGdú¨C, E©4d*ܲ#äW tÀÀÁBrwdtÀÀÁ¯”Dܲ#@ܲGd@ drwdh¯” hÂÁÀ÷ Áe É ICüÿB¡±¡BüÿaIžÃ ñ’ñ� ±ñ á B¦‰æ� wܲGdfܲ#ºW XÀJ ²u~XÀ¯”Dܲ#@ܲGd@ &œ,u~hœwu~h¯” *Â�÷ æ=wÂÁ÷ æ=w ܲGdܲ# ܲGd(ܲ#zW œÀ¨ÀrrwÀœÀ¨À¯”Ds©À�@ܲ#@ܲGd@ ©L @$9Î…@ ©œw@ú¨C,@ žrwÀhrwðh¯” €Àÿÿ æpÂÁ`÷ Ã÷ 2@ ò  „Äe÷ *‡ò² ²ò ²²²ƒÒÊæ�wß Ä Ìå*pܲGd"ú¨C,8 ©œw> ©L rܲ#vs©À�&|/< ò ú Æe‡$9Î…àW ÄÀ€ÀrAyð‘ÄÀ€À¯”Ds©À�@ܲ#@ܲGd@ ©L @$9Î…@ ©œw@ú¨C,@ þAyð‘hAyþ‘h¯” €Àÿÿ æÐÂÁ ÷ Ã÷ ²ò ²²ò ²²ò ²²²2@ ò  „Äe÷ 9‡òÐܲGd"ú¨C,z ©œw€|2 ² ò ²² ò ²²œ ò ²²œ ƒÒÊæ wß Ä Ìå /< ò ú ©L Vܲ#Zs©À�|$9Î… øÆe‡<W œÀ¨ÀjSy�ƒœÀ¨À¯”D5¬!™@5¬ ™@¾�¨ @ ©Û@›©Û@ ‚¹© XhÝ©%€h ©œwh<¯” €÷ ,Ä#Äb3!ú‡‡÷ ÄÌ Äb3!ú‡±‡¡‡Äa‡¦Ã÷ Îÿ‡Œ&Ã÷ ¼ÿ†> Ö ± ”>2„´´65¬ ™:¾�¨ F ©ÛX›©Û |¡‚‡>W XÀzTy`XÀ¯”DN©ÛH›©€QH ©ÛHN©BxH ›©BxH ©€QHN©:dH ©BxH›©ÛH N© H þ¬¨ ä: ©\}h>N©t!h>›©t!hN©\}h›©\}hò ©t!hò¯” þ¬¨ € >>òò> >òò€|€ø€t€ð€l€è€d2à¨W €ÀJáy€%€À¯”Dܲ#@ܲGd@ú¨C,@ áy€%h¯” Â�÷ Ã÷ æ w ܲGdú¨C,ܲ#ØW €ÀBìyÀ]€À¯”Dܲ""@ܲ#@ XìyÀ]h¯” \@À‹$AÁ ÁE& & B — ?‚ƒÃEðÿÂ@�  ±D à ýQÀŠí‚ ‚ ‚ ‚ ¦æ‰w–%À÷ ‡Nܲ#Xܲ""’W €ÀBïyd€À¯”Dܲ#@ܲGd@ ïydh¯”  ÷ æƒw ܲGdܲ#¬W €ÀJóy@€À¯”Dܲ#@ܲGd@ú¨C,@ óy@h¯” "Â�÷ Ã÷ Šæ‡w ܲGdú¨C, ܲ#’W XÀ00$\ 1gBT²°,XÀ¯”Dܲ#@ܲGd@ '…€%h¯”  ÷ æŸw ܲGdܲ#zW XÀ:L†dXÀ¯”Dܲó`@ L†dh¯”  À…w ܲó`òW €ÀZSŒ€À¯”Dܲ#@ܲGd@ú¨C,@ TSŒhSŒÀvhSŒ–h ¯” XæKæ‹æM& Â�÷ Ã÷ „ ² ²²²2 ƒÒÊ&wܲGd&ú¨C,Vܲ#ÀW XÀB|Œ@XÀ¯”Dܲ#@ܲGd@ @|Œ@h¯” Dæ & ÂÁ÷ Áeq B‚Ä CÄ1‰‚ަæGwܲGdBܲ#‚W tÀ¨ÀrŠŒÀtÀ¨À¯”Ds©À�@ܲ#@ܲGd@ ©L @$9Î…@ ©œw@ú¨C,@ ¦ŠŒðhŠŒÀh¯” €Àÿÿ æxÂÁÀ÷ Ã÷ 2@ ò  „Äe÷ .‡ò² ² ò ²²²²ƒÒÊæ�wß *xܲGd"ú¨C,8 ©œw> ©L zܲ#~s©À�.|Ä Ìå/< ò úÆe‡$$9Î…W tÀÀÁb!…tÀÀÁ¯”Dò)»@¬4@¬¶@¹«WŒ@<&ãe@õ)Ôp@ 4¬@h¯” 8w ¦&&EðÕ÷ ‡÷ ðÅA°°‚‡H¹«WŒ õ)Ôpõ)Ôp<&ãeò)»¬¶"¬4&<&ãe(ò)».õ)Ôp2õ)Ôp$W XÀz!…p:XÀ¯”D$9Ä @ò)Bx@î)Ôp@¹«WŒ@æt<@° €@ò)ø€@å)Ps@�±„:@ @¬¶h¯” Dw   ÷ ‡ð•ð.÷ ‡ò¥Ê¥ð±‡:¹«WŒ�±„:æt<ò)ø€ ò)Bx$° €*î)Ôp<$9Ä >å)PsúW tÀÈz!… &tÀȯ”Dò)»@ò)Bx@$9~Z@î)Ôp@¹«WŒ@<&ãe@° €@ò)ø€@å)Ps@öt @õ)Ôp@�±„:@ ¾¬4h¯” €w ¦Žì „Ä ÷ j†2„ð±-  ÷ (‡ðÅðð@Åepð@÷ ‡D ‚  ÷ ‡Äe  �`Õ e •R¹«WŒ $9~Z"å)Ps.�±„:4<&ãe6ò)»:öt <ò)ø€Bò)BxJõ)ÔpPõ)ÔpT° €b�±„:F| ‡ð ‚ ÷ ‡ ƒ Ä ÷ ‡R#öR-ó‚±²¢‡ ò)Bx�±„:&° €,î)Ôp¦W ÄÀÐÀB @~ÄÀÐÀ¯”D  ­D"06ݪKhi©€‰h¯”  ­D":&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡2W |RŽ:‹¯=|Rޝ”D û¬Cx0¬‹¯=h¯” û¬Cx€f¦æ&f ÅÂ…`Á Á ý°* �… !†ƒ”×  ×  Ä õ× ñƒ× ÿî× "D × a‡× z‚Ä ÃE Ñ�ÝEp(p°à€|„… †ƒ”× $ú× 0‡× 9ôƒ× A‡× Zîƒ× _ë× :� � ‚„… V†ƒ”× [È•]× <È•>È‹8 … |†ƒ”× %ú× *÷× -‡× .€øñƒ× 0‡× 9ëƒ× A‡× ZåƒÈ ‚ … |†ƒ”× 0‡× 7÷ƒ× *ô× ,A ïlÈ jÁ hŠ„ … q†ƒ”× "A øÁ ö „ #A … c†ƒ”× $€t‡× %÷ƒ× *ô× 0‡× 9îƒ× A‡× Zèƒ× _å× .� £ß … †ƒ”× .× ; … f†ƒ”× 0‡× 9‚� õ]× -Á X� í× *Á €ðQA æ × ,Á D× = Á >È5 B>ÈU °(wZþ× /*Á .�Á … .†ƒ”× $× -‡× .ƒ× 0‡× 9ƒ× A‡× Z ƒ× _ × :DlÁÿÿ   DÚ× " Á … †ƒ”³á°0±…„ƒ‚�‡œW |RŽB‹¯@=|Rޝ”Dd³ŒÈ@ û¬Cx0þ‹¯@=h¯” û¬Cx€f¦æ&fæ ÈE¢¢^Á`Å÷ úÄ ÈUQÅÿÿ÷ æÄ ÈUQ ÷ ÔÎË€ÈUIá ÈUà `¢Ãe á €|ÉáccD ÷   Ä”¡%¡*¡.A ÈU Å ï0 0 ��W ,ÈUw@W /D ÷ DÎÄ cBDaW£-Á�Á N�… €øW¥N W¥OD!†B�“Á N�{É …CÃE€€C¥ÃC¥D!‚Ñ ó�ñ‹þÿ€D! ΋ñ5 Ñ þÁe߃“ƒ Î�à UÂåÔpRpR„“€tpBCÃ5D ‘ƒ à KR΋KBAÁE�—­:ŒDœ0CŠÄŠý ÷ fÎÄ ÁeëB”—   ¡ƒŠDÒ� CS•ÄŠÞü ƒÐ÷  |d³ŒÈ€ð‡W¤†CÅ E Cs ÉΕŠ …„ƒ‚�‡f¦¦)& 6 l(¢*¶„„íƒ †�”Å EÅ 'W "Å =€lN íÎ ëW :+W =Å 1 Â#W ,W /Å %W %W *ÑöÕ€ÍÄ W <ÈW [ÄW >W ]¾„ v�¢°(°* è6 ƒ…Æe‚�‡šW œÀXÀB%PsœÀXÀ¯”D¸s©00$pTADATADATADATADATADATADATADATADATAÀ�@ ù¬ÚK0 ô¨""h¯” ù¬ÚK$×'ÿÿæ1ÿˆæææÓÿˆ‡s©À�°W NÀ@çB:h;NÀ@篔D  ­D"0@d©°;hm© …h¯”  ­D"D&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡W ΚXÀb9©´}ΚXÀ¯”D<©P}@¹«WŒ@:©´@ת¢Z@a©bŸ@ Zg(ª0:9©´}h¯” Zg(ª€w &fææ<ÁæC~ö Z÷ — :ö5|öåv÷ v— :÷ v 9ö5gö — / v÷ — /[v— ¹«WŒ&<©P}B<©P}P<©P}p<©P}€|-UvÅÄ ¤¤¤Õ‹U¥@ ö 6á¤-:÷ W d†ÁelN— — £À ‚ö5—"C‡—$�âƒ�Á W ת¢Z@<©P}FøƒAœÿÿÊ �$ƒÂe—$ †—$<†—$<†6wÆe�Ö Â€±‡ a©bŸÿÿ4:©´W ΚXÀz<©!€ÎšXÀ¯”DݪK@¹«WŒ@:©@ת¢Z@i©€‰@i© Š@a©bŸ@i©(Œ@ Zg`©°Zg(ª0ž<©!€h ¯” Zg`©€–˜Ài*É Zg(ª€w f¦ÆåƒÃeÀ‚÷ ö5xƒ‚Ãe˜þB ÂeÀÁ±:÷ à à æÁ @ Á @ CÀÁ±:÷ Î`ÁUCÀÁµ÷ B‚ ‚ (¹«WŒ Zg`© i©(ŒDi© Šbi© Šxi© Š€|‚ Àd�÷ Á`ÁeÝfÄ€Á�÷ Á  €Ád÷ Á €Á÷ Á  — ;ƒa @œ€ ƒà� W ÷f@�Â÷ Е-�Á �e&ݪK$i©€‰6i©€‰Di©€‰Xa©bŸt:©€øÁeP”P”P”Е-�Â÷ Е ö50�ÁeƒÆåÀ‚÷ ƒ‚–%ÀÁ<÷ fÁ<÷ fÁ÷ @÷ (Õ•:€÷ €ö5.ת¢Z:© 8Zg`©>i©(ŒPi© ŠZi© Šdi© Š.tÕ•:÷ @Æe‚�‡Á ÷ Àe0Áe0�U�‡i©€‰W ÄÀXÀzœ è]ÄÀXÀ¯”D¸1±o†@ û¬ós¤J©ø‰hù¬a†¤ù¬b†°1±v†h 1±p†h1±s†h1±u†h 1±w†h1±q†h"1±t†h1±r†hù¬c†0Z¯” ù¬a†X ù¬c†Xù¬b† $*J ù¬c† ù¬c† ù¬c† ù¬c† ù¬c† ù¬c† ù¬c†$ ù¬c†*ù¬c†^ææææ ææ æ æf�¶wvAAñU �æXû¬ós û¬ósû¬ósû¬ósû¬ós$û¬ós *û¬ós 0û¬ós@ù¬a† Vù¬a†Z1±o†ØW ÄÀXÀBØ ÄÀXÀ¯”D `E©4dhE©‹dhHÊ«h~h¯” d–%ö & ¶^€„ÎUÎU „ÎU ÎU „ÎUÎU„ÎUN ¶¶€æŽa†  W œÀ0ÀzÜ©u~œÀ0À¯”Dݪ¨M@ݪK@¹«WŒ@i©€‰@a©bŸ@ Zg`©°Zg(ª0 Ü©u~h:©´h::©"h¯” Zg`©<€–˜ Zg(ª€w &fæÀeÂ& ý w &fæÆå�fæ=ÿˆÎel…C    ö5pÄ€Á�÷ Á  €Ád÷ Á €Á÷ ¹«WŒ"¹«WŒ`i©€‰ri©€‰€|Á  €ÀåAÁ�÷ &@Ád÷ &@Á÷ &Àm÷ MÀµ�÷ M`À¬Ž�÷ M`5u À¬Ž�÷ Á @ Á @ �e@ M`u 5`€2i©€‰i©€‰$i©€‰0i©€‰:ݪKFݪKRݪKfݪK€øÁBœÿÿW á@ †�`u � ó‚#;‚�eu Íåìoµ õåÆe„ÆåÀA‚÷ ƒeS S S À�B÷ CeS S S A‚÷ ƒeS , a©bŸÿÿ HZg`©Pݪ¨M ^Zg`©fݪ¨Mxݪ¨M0tS S À�B÷ Æe‚�€‡Æe€�€±‡ Zg`©ݪ¨M W ΚXÀBת¢ZΚXÀ¯”D Zg`©°0ת¢Zha©bŸh$¯” Zg`©4JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECžW ÄÀXÀ:i© ŠÄÀXÀ¯”D Zg(ª06i© Šh¯” Zg(ª:&fæ!  E D  ‚E ‚Eà„ à±C B ΊñÖ A…„‡ºW XÀzÎXÀ¯”DñfH`òfH€ ŒH ófH �H p&H ôfHÀjzHxÿõfHàøfHþÿðKH ïfH " 5H ðfH@ ¯”èW NŽ€ÀBi©(ŒNŽ€À¯”D¹«´‰@ Zg(ª0ni©(Œh¯” Zg(ªr÷ æA…UUUUÄ    ÄT T T T Áee(e(e(e(‚ÄTä” ” Œ $)TäŒ ´ TäŒ Tä±…U U U U Î ÙÖ ‡¹«´‰~W œÀXÀz#°'œÀXÀ¯”Dæ)ø€@:©ZŠ@ä)Ty@:©@á[§Y@á[¨Y@ä)½‹@æ)ZŠ@æ)µW@æ)ÐW@ó[<}@ù±oŒ@:Ô±2&@[©(}@õ)üX@ Zg(ª0òà¯þdh¯” Zg(ª€w E¦H� 00$'\ 1g€ P� AÝ ÷ Е:Á‚Â%ÿÿÊ‹ B�‚÷ Á �”Á ýÀ õ5Е"Á Åe÷ pÁÅe÷ d\ù±oŒä)½‹ä)½‹õ)üX":©<ä)TyNÔ±2&`æ)ÐWó[<} næ)ÐWá[§Y zá[¨Yá[§Y  z|ÅåЕ"A÷ 2 ‡A÷ (‡A÷ Е.A÷ Е;A ÷ – ‡Á ÷ ¨ ¨ € ±€ ¯‡H•Ð¥"Е"Á ø‡Bæ)ÐWá[¨Y æ)µWæ)µW$æ)µW0æ)ø€<æ)ZŠB:©ZŠN[©(}nW tÀ0À2#}tÀ0À¯”D  ©àyh¯” &æÿˆæ3ÿˆÒW <Á0Àz[ S<Á0À¯”D:�±}s@Ѳ˜:@°s@l³ë@´:br@¹«�@´:s@° €@ù±oŒ@T; z@ ±8r@g³ü@z¬¯²'@g³<@g³Ž@g³Þ@g³å@$9ž!@�±„:@g³C@g³R@g³Ÿ@g³ï@g³¾@g³Ê@’±¾w@´:¢‘@:N©K€@ Zg(ª0`Û© Shg³hVg³,hJ¯” Zg(ª€w ÆåTµ&Àúÿõ¥:)uÍE@� À%‡æ:ÎaÀ `u>MN[[e÷ ‡D(õe:(C( õŠ ‡Àûÿ±õ•†5�ù±oŒNl³ëtT; z€|@5œ*6 T÷ È@2È‹÷ ÆeTÍ5÷ N õ•) @‡õ‹ õŠ ÷ JúµŠ ÷ 5 ‡wõ‹ DC÷ µu‡ $g³Ž2g³CXg³Ÿbg³Ctg³å€øw ÷ ¸ÿÍEõŠ ‡Àûÿ±‡÷ @õe:(‡w5 CDõ•>%õ ÷ 6õ‹ ÷ ÀØÿp‡Â +÷ k‡äÍ5e÷ àd‡÷ à†À¥.g³ŸJg³ÞXg³åfg³ï€t^õ‹ [ÍUÍ5@ðµ D(÷ ÷ ÀÿÿG‡À÷ ½µºuÉ¥;Í5<±Í5ó¥-ÿÿÔ¨¯õ  Í5@÷ µu $9ž!*g³R.g³Ê:g³Ÿvg³¾€ðÍ5÷ FÉ¥@Í5uµb¤÷ ,÷ ‡Í5wÿ÷ ÍEõŠ Àöÿ5 ±‡¡‡·@ ÷ ‡@ø¥8jðµMAB *g³ü:g³<V¹«�`N©K€j$9ž!€lAÁe Â@&ÐP�ŠP�P�Š@C&Í5ÁAÝ Â÷ ø¥8ø¥8ÍUÁÂÃe÷ ÁÂÃå÷ ÃÁ28´:sDѲ˜:HT; zP$9ž!\´:¢‘hѲ˜:l´:brxѲ˜:|è8µœ €À¥"‚@ð0÷ œ*‡õ•_%ƒ`„àAÂBàÀ±¡‡À¥À•ÿÿ±‡÷ w‡@ð 8‡ T; z(° €N$9ž!Z$9ž!ng³ŸW <Á0Àz[ @S<Á0À¯”D:s©À�@$9ÖW@¬@@„¯½`@�±}s@Ѳ˜:@°s@c&_M@¹«�@9©x‚@h±²'@T;œw@z°øu@¤ Ñ(@ù¯üX@ù±oŒ@Ô±2&@ ±8r@$9pw@¬¯²'@‹¯=@‹¯@=@‹¯�=@$9ž!@g³@�±„:@g³,@j’±¾w@ Zg(ª0Ll³ëh g³ühg³<h²g³ëhg³ChÈg³Rhg³Ÿhng³ïh2g³Êhü¯” Zg(ª€Àüÿu­ j÷ ô÷ ÷ ¸5 ,ƒ÷ É¥/b¤ùƒàÁàÂ÷ èÄýÿJ‡ÁµÍ €÷ ÷ 1ÂE€CÃe,ð ðÃeã‹ð û÷ ˆ÷ g³,Ng³€|¶Äþÿ'‡Â �@ð%‚ðµ7ÂU€÷ @ †ÂE€÷ $÷ ¾÷ ,Äþÿ ‡�D(@Äe÷ ,÷ ˜¡Í5@±‡·@Àe,C&Ë ±ón¹«�€øŒ:Á÷ Á KÁ÷ sÁ@w@&p°÷ >‡ðµ :ææ±ÿˆ†÷%÷%È•p*f ¦Â÷ ‚�D9©x‚9©x‚*¬@:‹¯=Hc&_MT$9pwVs©À�\T;œw^s©À�t°øux‹¯�=€tÈ•p*÷ ‡œÁµÀeBÂEàÈEÿTH ÈEÿBÀeðÿ¡‡±‡÷ ZÍ5 Í �÷ ÷ O÷ 2·õe(5 @&B÷ Í €&‹¯@=Dg³T¬¯²'Zg³d¹«�z„¯½`€ð°BÖ õ 2=Š2‡·µŠ D(õå:(@$8÷ Ú&ñSYÁ¤Á ýÂe2¤¤¤¤¤¤¤¤Âe¤¤¤¤¤dÌEÿ_$8$8$8¹«�€l‡w ÷ <ÿD(õe:(õŠ &1 Í52ÍE ÌEÿ_ U@5 Ãe`#####Ãå########÷ ê‡Âe"€ ý‚÷ (885(ù±oŒ€è †ð¥*ÀþÿÀöÿ±‡·÷ †ñÀ0 H0 J0 Lñ ò ÷ !÷  w Áñ ÷ ÷ D÷ ‡5 4�‚÷ >$9ž!¹«�D�±}sJ’±¾wRù±oŒV°sZ¤ Ñ(`ù¯üXh�±}s~Ô±2&€du4µ6 ‡÷ D ‡A(! á! õå(*‡A8 €Á¢@&s ÁeBðÕ<‡·B�ðµ7 ��ÁÁ pBð•!#÷ Z¹«�pà †ð¥*pB  é±‡÷ d¤ä‡w�  É¥ úÉ¥ ÷�   É¥ É¥ É¥@É¥/ï ‡h±²' $9ÖW" ±8r4�±„:W <Á0Àz[ AS<Á0À¯”D:s©À�@$9×p@�±}s@Ѳ˜:@°s@à¯þd@ ±8r@¬¯²'@�±„:@’±¾w@ Zg(ª0*g³ŽhŠg³ÞhZg³åhg³¾hB¯” Zg(ª€5Š A&É)fÿˆ ‡ÂÑ ÷ ¦‡u’ BAá÷ À÷ ¨ÍU¡‡Ä`�ä˜Â ýB„`00$/pTADATADATADATADATADATADATADATADATACÄàAB5 b¤À|÷ RÀ‡us©À�x$9×p€|µAÂBà‡AB6C4÷ Í €Ð•/ЕLЕBЕ:AÁe,ÂP” üЇ  ¡Ä S” ø‡±‡�  É¥ úÉ¥ ÷�    à¯þd øÉ¥ É¥ É¥@É¥/ï ‡èW |ÇXÀz° S|ÇXÀ¯”Ds©À�@´:G@<&Kq@„¯½`@$9×p@æ)»@�±}s@Ѳ˜:@ä)Ty@-0’@°s@<&9€@z´:t @î)Ôp@â)P@ò)ì@h±²'@° €@¤ Ñ(@æ)ÐW@ù¯üX@ù±oŒ@´:Ü@ ±8r@‹¯=@ä)²'@‹¯@=@bå)Ps@ô' q@$9ž!@õ)Ôp@�±„:@<&D@ Zg(ª0l°@ShܰASh°?Sh¯” Zg(ª€w 5 funhõ‹j÷ ’‡uhdB÷ 0†õŠjw�õµ€aw<õ ÷ vý¥w & õµÁ ÷ œAdBbA>ù±oŒ*ä)TyHâ)PR$9ž!Tâ)P`<&9€bò)ìh´:t nѲ˜:rå)Ps€|ÁepÂ& ¦fƒÂÁ÷ – –‡ÁPõµ aA”Aíf@pnp÷ CÖ‹Á ÷ 8ðË7�ABµ`f VõµT´:GѲ˜:@õ)ÔpDõ)ÔpH° €Lå)PsPâ)PX´:Ü^Ѳ˜:bâ)Pfå)Psnî)Ôprî)Ôp€øa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× æØÿ"Ã¥.@�j À õµ€a`$9×pl$9ž!€t÷ BwÄþ@÷ õÅ€aõŠjõTI�õ•æöÿ& õµaf÷ nµµ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw õ‹jÜõŠjõå4„¯½`&<&9€<&Kq<&D (ò)ì<å)PsDå)Psnù±oŒ€ðlùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ 5fµ fˇðµ ÇÈ•÷ ‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð<‹¯=X‹¯@=€l ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ DlõålõŠjõµ€aCÃe###3X„¯½`væ)ÐW€è3™÷ � ‡&™÷ ½• †õ¥ÎÆÎš‡w õ µŠjDl@÷ T”ÔÀeTŸœ5l@÷ ‡@Áñ L�±„:â)P$$9ž!&å)Ps,Æ2š8ù±oŒ>â)PN ±8rXæ)ÐW\â)Pt„¯½`|°s€d÷ Áe÷ ‡÷ ‡& ææ©ÿˆ@ð•÷ & æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ñ”@ 8¤ Ñ( ù¯üXæ)ÐWä)²'�±}s2ô' q4æ)»8h±²'zs©À�€à.†Ã ûÆePõµaá¥-ìÆeP� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆePÕwýÆeP±‡ƒÆåP‚Ê6 -0’P -0’Pd-0’Ph$9×pÿ p-0’Pz-0’P\)¦ÿˆKÂå@”‡>W œÀ0ÀR—4œÀ0À¯”D\s!s@ v—4h U«9qhdªÀ�h(Zgèh6¯” €­ÿMÿÿþ½þ•þ@BCAf÷ …} ‡f&÷ „…‡Á Gð‹Rð¥R@Áÿÿ±‡Ä× 3æ æ æ æ&€$&�”Â~€Ì Vs!s€|‚€Ã& ÄeÃ%†ÃæÎà”¤ Ã~ƒÔ¥ Ä~�F`Á¡‡Ö �F` ±‡f&PÀe Áeñ¥ ÿÿÁ @ ù‚à÷ v€ÀeTö €ø �% �% �% �%–%Á¡‡Ö Ö Ö –% ±‡ð•þÿ����–%‡@ABCD f÷ …@ ����Ö ‡…ÆåÈf% % % % €tÁ 'à %&f&fÄ`% …÷ : BÝÂBÝ‚eµ�µ�ƒ‚÷ ÷ *uuuu¥F‡ÀÀEøÿ@a’„”aH�É~‡Ä÷ ˆ÷ êÀÿr€ðÁÁÿ÷ 6÷ ì Á<÷ (÷ ˜÷ .÷ Ö÷ ÷ "÷ „÷ Ø÷ ÷ x÷ Ì÷ ÷ l÷ l‡&f&D%% %%÷ v÷ ÷ æ% %%€l%÷ Z÷ ø%% %%÷ D÷ â÷ ÷ ÷ ¬% %%%÷ "÷ À÷ òÄeTTTTÄå„�€‡@A%÷ X@Aµ€èõe÷ BAµõ÷ 2õ`u u µ`u @A÷ õ`u u µ`u ‡�pÀ €B`Á €`‡ee% å;÷ vÿu u €d5 5 w6õ%ÿÿõ%ÿÿõ%ÿÿ õ%ÿÿ†Íe;u u u ‡÷ x ueM u u  ueM u  ueM ue ÞÍeee€àe‡eeee‡eeee‡uuuu‡åÿÿåÿÿåÿÿ%‡&D÷  ÿÔ  Á5 ÷ Œÿ÷ ¬ÿ÷ êý÷ ¶ÿÀ Á5\þÿ  ÷ nÿ÷ ÐýéÅe„‡ÎW NŽ€ÀBݪ¨MNŽ€À¯”D¹«´‰@ Zg(ª0Tݪ¨Mh¯” Zg(ªX÷ æ@„    Àe à ± û‡„T T T T H1C„ÔdT T L $)ÔdL t ÔdL Ôd¡Î æÖ ‡¹«´‰FW XÀ*ÔZKXÀ¯”D ¯”\W ìÀøÀj\±DìÀøÀ¯”Ds©À�@c&~@T;²@ù±oŒ@  ­D"0¢‚²Dh£¯Dh\±Dh¯”  ­D"€ææ±ÿˆ‡ß% Ëw &Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë 00$7\ 1gå¥.‹ Ä ÅæU¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë c&~T;²s©À�$ù±oŒ*|‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±ûJW QŽXÀR€^àQŽXÀ¯”Dù±oŒ@  ­D"0´\±ŒÈh ¤¯ŒÈhd³ŒÈh–¯”  ­D"€w Á w Á& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿù±oŒù±oŒ<|Ä äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡ W XÀZ7a XÀ¯”D°@S@°?S@ù±oŒ@ N.«D,h¦«D,h Û©"S䯔 Rw Ãw Ã&Àe`Á` ýÀðÕaË  Á`€Àe`ÂP ý€D ‡2ù±oŒ °?Sù±oŒ°@S Û©"S` ,Û©"S :Û©"S`œW XÀzR«„:XÀ¯”D<&È`@<&Kq@„¯½`@æ[à8@â)P@æ[ZŠ@æ)ÐW@ì)p…@s©†@üBDRFðHJHLxNŒPhR¨T¸VÈXö€|‡ ‡&-‡÷ aÀeˆ“´ €‡ô $Ãeô ô & & & & &æ& & & �&ææ ÿˆ‡&æ)ÿˆ4 ‡÷ ^b´:ô�€ø÷ ¨ÿ ‡÷ R÷ œÿÀÿÿ‡&ÀE@À À À ÀÀU �ÁU ‡@÷ Pÿ€÷ Jÿ‡ô‹÷ .À1÷ 6ÿ´Š÷ (‡ô‹ ÷ À2÷ ÿ÷ 4ЇÀ€t÷ ÿ‡À ÷ þþ‡AW ÿÿ A t÷ Îþ ´ô %& & & & & & & & & &ææ ÿˆ& & & & & & & & & &ææ ÿˆtT´:t v´:Ü€ð ‡Àÿÿ‡÷ Vþ4ŠÁ ô•‡÷ Xþ´@ ÷ :þtP ÷ ÿÀ•A÷ Vþ ÷ Úþ@÷ HþÀI÷ @þ€÷ :þôE w¢þAW ÿÿHAfW ƒ€lÁ÷ ÆþÀH÷ þ@÷ Œþ÷ ¦þ�ÀeB÷ ðý� �÷ Òý€÷ nþ÷ ˆþwLþ B— ÿÿæf€¦ ìƒÀì÷ Bþ÷ \þ‚ö ÷  þöÎ ê–%€èwþwþ÷ xý÷ ^ýf÷ <þÀD÷ |ý€÷ þÖ ÂU÷ þwØý÷ 6ý÷ Hý÷ þ¦ÀL÷ Pý@÷ ÖýÖ ÂU÷ èýw¬ý÷ ý÷ ý÷ æý�ÀeC÷ "ý¦@€d÷ ¦ýÖ ÂU÷ ¸ýw|ý÷ Úüt÷ èü´whý÷ Æü÷ Øü÷ ¢ýt  †@4€4íVtææí€  à B ‚Bà€ ûƒ €à À ö4 4 ÀH÷ Šü÷ ý÷ (ýÀBÝ÷ rü 4m -‡´côåö÷ Úü÷ ôüö ÷ :ýöô â€÷ üt÷ ü´€\–%w�üwêý÷ ýÀH÷ ü÷ ôûÀ  �÷ þûû÷ Ìû÷ îüæCÁ �÷ Øü€÷ âûøÖ wLü÷ ÆüÀJ÷ Îûw<ü÷ ¶üÀK÷ ¾ûw,ü÷ ŠûB— ÿÿÁ TØ€”÷ ¢ûÁ ûw ü€”ü÷ ’ûûw ü÷ xü÷ Xû@÷ ~ûwìûŒW ´Á€Àz4a` ´Á€À¯”D¸?±ŒH"ɪKr@ý¨X@ô¨""@”«�w@év~@ ­4Ф6±L h C±¥h C±\}h9±Ì`hj1±o†hB±ÿh 6±xQh=±Krh1±ÚKh4±³}h?±y‹h ­~,¤ ­€,¤ ­¨t ­Ðt ­øt¯” ­4Š  ­~, ô¨""  "”«�wɪKr ý¨X év~ ­€,  ­ø‡ªW00$?pTADATADATADATADATADATADATADATADATA ´Á€ÀzBa8"´Á€À¯”D¸ ­cŒò[ÿH æ[xQHí[KrHá[ÚKHä[³}Hï[y‹Hæ[L H ó[\}Hó[¥H é[Ì`Há[o†H¯”zW tÀÀÁ:Í«àetÀÀÁ¯”D  ­Ì… Í«àeh¯”  ­Ì…¦¶Îe¦nW 0ÀR Šð0À¯”DB,«0zH*s©À�H&5¬ ™H.°sH(ï[ŒH, ¯”ºW <Á Áz`Š}<Á Á¯”DþÿÈ�¸`HìÿÈ�8 Hèÿ¾�8THøÿÊ�8THþÿ¾�¨ HôÿÅ�ØwHòÿ»�`Húÿ¼�`Häÿº�iHöÿ¼�›HüÿË� sHðÿÈ�àHæÿ"Å�ˆ,HîÿË�H…Hêÿ ¯”*W <Á Áz`Š(}<Á Á¯”Dþÿ ­#ä ­ZTäü¬›äû¬`äþ¬8Täú¬iäþ¬¨ ä­Øwä ­ sä­ˆ,ä­¸`ä: ­H…ä­8 ä­àäü¬`ä­#ä5¬!™h¯” ­#  ­ZT ü¬› û¬` þ¬8T ú¬i þ¬¨  ­Øw    ­ s   ­ˆ, ­¸`  ­H… ­8  ­à  ü¬`ÄW ¨ÀJü€ ¨À¯”DݪK@¹«WŒ@ <G©P}h<©P}h¯” @ Âw  ”Å¥ üÅ¥ ùÅå0B¡†€÷ Aa”ôœÿÿ‡¹«WŒ0ݪKW ¨ÀBüÀÚ¨À¯”DݪK@¹«WŒ@ €9©x‚h¯” €w „ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ E�€Aa×$Ò±œÿÿ¹«WŒhݪK|‡BW ¨ÀRüÛ¨À¯”DݪK@¹«WŒ@ Zg`©°Zg(ª0l9©z‚h¯” Zg`© ZA90$ . @( Zg(ªpw f Ôĥ&‡¥ƒ¥"‡¥ ƒ¥ ¥Î ¥ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ E�€Aa× ×‡Ö Ö ±œÿÿ‡&¹«WŒ Zg`© Zg`©RݪK ^Zg`©–W ìÀøÀz$@ìÀøÀ¯”Ds©À�@¹«WŒ@c&~@T;²@i©€‰@  ­D"0¢:©¿`h,:©(}hD:©ZŠh:©h2:©<h":©h:©ÿh :©Ï_h&¯”  ­D"€æ ææ±ÿˆ ‡ß¥æ * æ + æ2æ3ÁEÿæ ÎE‚w …�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ W ƒ  c&~T;²s©À�J¹«WŒxi©€‰*|Áe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡ºW €À:L@€À¯”Di©€‰@ H[©(}h¯” L÷ &÷ &÷ �’•’•€‡@Á(÷ f€  Àe ÀeÉÿÀe Àe ‡(i©€‰äW 0ÀJdXR0À¯”D:©(}@¹«WŒ@d©°;@ V<©h¯” Zw Ä'Å  ÅUD$†BA÷ &�Â(÷ ÅU� ÀBQ÷ ÂЕ* ü‡¹«WŒ&d©°;H:©(}xW 0À2D¸ƒ0À¯”D N©K€h¯” ¢a‡¢z‚ÈÅ ” õ‡€W ÐÀbä` ÐÀ¯”D¹«WŒ@:©<@i©€‰@ Zg`©°$Zg(ª0„a©}hé«@Qh0¯” Zg`©(JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC Zg(ª€w D…&&÷ bЕ-�Î �eÁaÁeP”P”P”Е-�$w DÅ… ƒ÷ &Е.À À À ce÷ À …Е:÷ Å ù Â÷ $¹«WŒ$ 6¹«WŒ\i©€‰ |B‡:©<øW °ÇzôXR°Ç¯”D:©¿`@:©ZŠ@:©@<©P}@a©}@¹«WŒ@é«@Q@:©@:©ÿ@<©@[©(}@:©Ï_@* Zg`©°>Zg(ª0ꌩ?Th¯” Zg`©*ABDEFIMNOPQRSTUXYZ<>zv ´ ¾ Ú  ü " $ˆ  &ä" (&$ &~4& B( >*  l,  x. ò0 è2 œ4 ‚6 Œ8 :*œ: ¨< Zg(ª€w && D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ À ÀCƒ ÁÁeÂ!£ ü„  ÂaÂe‚bÂEÊ Ö ÌЕ%„*¹«WŒB<©P}TN jd €|Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ �à õ‡& æÎe00$G\ 1g6& ¦æÎe/& æÎe"X:©h:©ÿÞ v:©ì €ø*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎe & ¦æÎeЕ A‚¦Þ à ÷–%‡& æÎeòA÷ à <<©ö F:©¿`8 T:©Ï_F t:©f |[©(}ztû‡Ð• à ü‡A÷ E‡AÂ÷ E‡Ð• Aæ÷ AÎ ûÖ Â ÷ $Е.÷ Â÷ AЕ; ÷ à à‡Â ýð¥ ÿÿùÀ ø a©}"é«@Q4[©(}L[©(}b:©ZŠ W OŽÒ³zÔ2dOŽÒ³¯”D¬@@´:2“@„¯½`@¹«´‰@ ª`^@æ)»@ò)»@ª°'@ä)Ty@°}@ ª�…@ ª�…@z´:t @î)Ôp@$9½@ªP@9©x‚@<&ãe@ª@y@æ)ÐW@ì)p…@´:Ü@•±}@:©ÿ@ªM@ ±8r@‹¯=@bä)²'@‹¯@=@å)Ps@ô' q@õ)Ôp@�±„:@h±p!@ Zg`©°xZg(ª0檀Mh¯” Zg`©€ ??? -- HELP file nesting depth exceeded ??? -- HELP file error -NNNNN ??? -- Ambiguous HELP qualifier ??? -- Improper HE€|LP file format ??? -- Unknown HELP qualifier ??? -- Indirect HELP file syntax error ??? -- Indirect HELP file open error Iø-NNNNN ??? -- HELP synonym not found ??? -- Ambiguous HELP synonymW>> ´:2“ ª�…‚ ª°'‚‚LB”CH– ”–   È È– –.MAIN. Zg(ªn÷ 7Æ·Î÷àÞÁ ÷$÷&÷ L†wf÷@æ>ÿˆ÷ Š÷0Ü7ŠÈ÷ ü‡Ô‹_· Ü÷ 7‡÷ jú‡÷ h÷•z¹«´‰ Zg`©ÆZg`©Î Zg`©àZg`©Þª@y ª`^ Zg`©$$ ª`^&Zg`©&4´:t 6Zg`©@ :Zg`©>FZg`©ÜJZg`©ÈXZg`©Ü€jÉ7ŠÈ÷ ‡E÷ L‡÷‹Ê4÷¥É ÷ †é÷¥Éwâ÷‹ËÄÌ7ŠËÁÐÂÖ‘‘‰÷ "÷ 2·ŠÈ¿À‹÷ $÷ ÚÄÆ÷ h‡„ jZg`©ÉZg`©ÈZg`©Ê$Zg`©É2Zg`©É÷ ηŠÈÀðð†÷ †÷ J!‡ñÀœ� ÷ ¶†÷ ¼â‡÷  À°rZg`©Ë Zg`©H Zg`© $Zg`©(4Zg`©È8ªP õ)ÔpDõ)ÔpH°}Vî)Ôp \Zg`©œdî)ÔptªP|ªP€bp÷ €÷ ZцwÔÀðð†÷ †÷‹È±÷ à‡íê÷¥É÷ ÷ T߇÷ B܇7¢ÜÙ‚‡&7ŠÊ·ŠÈ€ Á –%Ànî)Ôpî)Ôp •±}ªP "Zg`©$õ)Ôp*õ)Ôp.°}4Zg`©ÈDî)ÔpJî)ÔpPZg`©ÉfZg`©ÜpZg`©ÊtZg`©È€Þi÷ ÎÀwVÈ¥ íÈ¥ êÈ¥*Á ·ŠÊ÷ äÈ¥$È¥/€ Á ÚÌ¥/„ ¤÷ †Á ù7ŠÈ±„‡“ ÷ ‡„ “÷ . Zg`©i ªPî)Ôpî)Ôp2Zg`©ÊdZg`©ÈzZú†Ä ¡Â¥ Â¥ ±‡Àð•p°ð•ð•ð•ðð†÷ ‡Â¸ÃRà ýÁ$É ÷ ‡ÅÐÅ~ ªP$ ª�…&ì)p…*ä)Ty.ä)²'2ô' q4æ)»8ô' q:æ)»><&ãe@ò)» DZg`©Fõ)ÔpLõ)ÔpPh±p! XZg`©¸ fZg`©$n¬@ tZg`©Ð€ÐÖÀ÷ U•͇ÀÐÀ÷ ‡÷ Nÿ†„ û‡¢1‡È¥9‡÷‹ÈC‚ à Ê¥ úÊ¥ ÷Ò¥@¡wà ÁÀV°p÷ @ Zg`©ÖªP ±8r Zg`©Ð"ªP&�±„:DZg`©È rZg`©V~‹¯=|L †Àª÷ \ÀfÁdwèÈ•ð‚÷ î‡ðµêÀÀeÁšÅ”Å ý7 ¨¦æ÷5j÷1Ü÷àÞÀ×-ÞðC‚÷ �÷ ¢7 | Zg`©ªZg`©fZg`©d Zg`©‚&‹¯@=4ªP8æ)ÐW ü"‡÷ ˆüø‡÷ †ý‡÷ €÷ ÆÎ‡÷@æ>ÿˆ÷ À¸Ñà ý÷ ‡Àÿ÷ (ÀzZg`©ÉZg`©ÉZg`©ËZg`©ÌZg`©Ë Zg`©(&Zg`©ÈDZg`©ÎJ´:ÜLZg`©@ PZg`©>V¹«´‰ZªP `Zg`©¸n„¯½` tZg00$OpTADATADATADATADATADATADATADATADATA`©ÿ^Œ(÷ 4ÝœÀA ÷ Е.ŠÀ)÷ ÎÑ‹Ñ�Ñ�É�wÑ‹þà÷@Ä>4 t&ÿˆ‡R Zg`©(å)Ps Zg`©A:©ÿ "Zg`©)0ªM4ªM8ªMH´:2“JZg`©@ NZg`©>êW tŽ€»R$ep!tŽ€»¯”Ds©À�@<©P}@$9pw@ Zg(ª0TG«ÖKh¯” Zg(ªXf¦æ**æ ææŽaææ©ÿˆ†÷¥ÀB€÷ Â¥*÷W ô‡W cñ‚@ –%‚�‡&$9pw(s©À�6<©P}2W øÀJ4søÀ¯”D¹«WŒ@  ­D"0¤œ«h¡«hD¯”  ­D"€w ÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w   B€ ÁeÁE"s  ‚ �Å s-ƒÅ¹«WŒJ¹«WŒ,|Àî �Å CsàÃlÈÀ¡±‡‚W 0À2þv 0À¯”D "¹«´‰h¯” &&æ¦f&¦ v Þ €�‚ƒ„…‡|W ÐÀ:þv˜qÐÀ¯”D  ­D"0¹«WŒh¯”  ­D"&æf…Þ ƒ„…‡tW €À2þvPŒ€À¯”D ¹«�h¯” f&¦‚Þ €�‚‡öW <ÁXÀzzµz<ÁXÀ¯”D&)ÑWHŒ: .H+"ÞHhùc&"H3Œ:»zHðtaH ¡UQdHC‚ÃSHìt\}H©nµ_HT,ÌH¸#N&HzðtaHòt‘H)»WH c&íyH$#žwHc&ðyH .”BxH+"¢(Hôü¬ ’H#ú�H 3Hüÿ 3(Hðÿ))XHl�œSHc&hzHz‚ Hc&„H1Ô’¤’Hc&Š–H"äxšwH©nº`Hò)OzH“(ÜYHñtRyH ò)PzHñtNyH,ƒ!H C‚¶xHå)0Hc&ª–HEzÔ’#H0{î’H$0Ö(Hc&#Hc&#Hc&#HC‚ÌH0{“H c&";H©nL`H 0{“H ©nR`Hì)VdHì)[dH ät‘Hzc&ÆHöt.Hk‚œTH&C‚¼,H.ŽH.›H c&Ä"H.”ÒH.‰H“(ÞH€c&«ÆH)”s#H+"ø€H`ù0{D“HC‚©Hzc&¼H>ñtCyH c&|KH6T, Hk‚óxH!ì)ÖpH ,R"H ‚L H0{mH‚`qH ùa9H"-íDH)ûXHùaKH #{Æ8Hzì)jdH 7{» HT,KHc&R—H'“(ZŠH0{˜“HñtîyH“(zH@.”à8H,óyH¬ .€Hc&’H0{D�HlœSHc&µWH:z#0H#0H4{*LH#0H”s,XH@#09H [t{8H3^sHì)VHc&XHGc& XH?çtBxH.”’yH¬ Ö(Hì)\}Hz-ŽEH#{ö8Hìt’sH3®sH0{9�H#0ìHìt­sH.{¶–H)ZH #z zH.”óyH #0LHc&™dHAk‚ãH'-0’Hz0{‰�H0{Ž�Hät H#0DH0{›�Hçtà8H”s`XH©ní]H #0vH# zH0{n�Hl�ƒ!H #0MH c&jLH#""Hz#0¼Hì)VNHÔ’LqH4{MHÔ’[qH-01H40wH©nŽ^Hl�óyH“(µWH 3�jHýÿc&»pH#0)H c&¬ŒHK#04H zc&ÞpH#{mHT,ôH€Ô’qH@C‚kzHc&õXH7Ô’7!H c& ™H2uåNÀE¯”Dò«ˆH ¯”NW NÀEÂ2>uU(NÀE¯”D©õ#H ¯”NW NÀEÂ2>uTqNÀE¯”D•«µOH ¯”NW NÀEÂ2>uu'NÀE¯”D¼©õ‡H ¯”NW NÀEÂ2>u!tNÀE¯”D§«õuT[NÀE¯”D«µ�H ¯”NW NÀEÂ2>uAyNÀE¯”DÈ«õ H ¯”NW NÀEÂ2>uIqNÀE¯”D•«õ H ¯”NW NÀEÂ2>u™’NÀE¯”Dj¬õu™NÀE¯”Dp©ÅœH ¯”NW NÀEÂ2>u#NÀE¯”D ©µ�H ¯”NW NÀEÂ2>uN`NÀE¯”D(«XH ¯”NW NÀEÂ2>u•NÀE¯”DJ©ÅH ¯”NW NÀEÂ2>uzNÀE¯”Di©5uH ¯”NW NÀEÂ2>u%™NÀE¯”D”¬t!H ¯”:W NÀEÂz3u^NÀE¯”D5¬ ™@¡«@œ«@ dô¨ÎhP¤«h¤«ªHh ô¨hô¨ªHh ¤«úWh¤«� hRô¨úWh ¯” h  @ &ÀÀe6Î% 4Î% 4Î%04– f÷ �‡�  Á ý‡w ÀÀeF öw 5¬ ™>¡«Rœ«X5¬ ™f¡«–W NÀ…È:7x®sNÀ…ȯ”D5¬ ™@ $7ª®sh¯” (ÀÀe6@aÈ "ú±H‡5¬ ™NW  ÎçÃ2ƒ,d Îçï”D  ­D"0¯”LW  ÎçÃbK VN Îçï”Ds©À�@°s@ù±oŒ@f³Ð@  ­D"0š;¯VNha³VNh¯”  ­D"€w BC œ"¦æ&æÿˆ‡÷ <†ÂÃSYïð*‡°�p0p2ñ1ÂEÏÿÂ%0ð•ðÿ*wÅð•Ùÿ*Åe œ"f¦æù±oŒ6s©À�bf³Ðf°s"|ÿˆ ‡D CÓBðÕ.E‡NW  Î¥Æ2ï ΠΥƯ”D  ­D"0¯”øW 4Î'Êr¯ˆw4Î'ʯ”D°s@r³"&@q³¯:@w³œ€@i³‚@ù±oŒ@f³Ð@  ­D"0 „¯½`h¯”  ­D"€w ð*æ8Iðµ÷ œ*=‡ðµ€)98÷ ÕeBÕ && ð Îå¶ �ÕU€�Ä÷ ‰�†ð¥öÿ*ð¥åÿ*ù±oŒ"w³œ€8i³‚hq³¯:€|Æe ð*Nlv °°΋œ*ðµ.)÷  „& ðµ#ðµ!ðµ)&ÎePæÂÂeÊ ¦æ&æ•&Ä÷ 2i³‚^°s~q³¯:ø†�•p�*÷ wr³"&f³ÐàW  Î%Ób&Ü Î%Ó¯”D ²Ë@00$g\ 1gq³¯:@i³‚@ù±oŒ@  ­D"04c³ÜhŒ¯`rh¯”  ­D"8w ðµ Á¥ðÅ)÷ ‡÷  ÕU�Ä÷ ‡ù±oŒ ²Ë$i³‚4q³¯:W  Ó§½Z•e Ó§½¯”D°s@q³¯:@i³‚@f³Ð@  ­D"0vc³Iqh¯”  ­D"zðµ0f�Â& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ÷ U• Â…à  ÂE•ÕfÄ÷ p†�ñ ± w°s8i³‚`q³¯:xf³ÐÎW  ÎçÃZzÌ Îçï”Dq³¯:@i³‚@  ­D"06e³²Zhr³®Shf³t:h ¯”  ­D":Ä Ä Ä ðµ f÷ u ÷ �‡ñ ± ‡ i³‚(q³¯:lW  ÎçÃ: &ø€ Îçï”D  ­D"0ó¯ø€h¯”  ­D" ‡ W  Î'Êzœ, Î'ʯ”De³&@p³—y@r³ü�@r³Þ@p³J,@ù±oŒ@m³oŒ@f³Ð@  ­D"0ª°}h¯”  ­D"€w ÷ ‡ðµ)ðµ÷ 8C÷ êð¥öÿ* ðÕ)ð ð*wð•öÿ*úðµ÷ ó‡÷ ï‡ðep p &ù±oŒ p³J, r³ü�Nf³Ðbp³—yje³&€|‡÷ êâ‡ð¥Cƒ óà ðµ=ðµ÷ ð ð¥ð 0ßð•Øÿ*Àð¥ ðµ= ÄEÕ¥^Ä ûAÇð¥ æÂe€ø@ÃÎà÷ vƒ߇÷ � ÁEp×ðµ÷ |ðp°æÄ ƒðÎà÷ ,ƒ ƒ÷ Já÷ ù†ð•Øÿ*Á`‡æ÷ ƒ|r³Þ:t‡æCàƒ#ƒÎà÷ Î ¦÷ Ôÿ‚ð†– ‡DàÄ ‡m³oŒ”W  Î'Êrœ,hy Î'ʯ”De³&@r³ü�@p³K,@ù±oŒ@m³oŒ@s³k@f³Ð@  ­D"0¦° €h¯”  ­D"€w ÷ ‡ðµ)ðµ÷ 8C÷ Úð¥öÿ* ðÕ)ð ð*wð•öÿ*ú÷ ÷‡ðep p ‡÷ êê‡ð¥ ù±oŒ p³K, r³ü�Nf³ÐZe³&€|Cƒ óà ðµ=ðµ÷ ü ð¥ð 0ßð•Øÿ*Èð¥ ðµ= ÄEÕ¥^Ä ûAÇð¥ æÂe@ÃÎà÷ ‚ƒ߇€ø÷ � ÁEp×ðµ÷ ˆðp°æÄ ƒðÎà÷ 8ƒ ƒ÷ Vá÷ ù†ð•Øÿ*Á`‡ðµ)wæ÷ ƒrs³kxr³ü�6t‡æCàƒ#ƒÎà÷ Î ¦÷ Èÿ‚ð†– ‡DàÄ ‡m³oŒW 4Ó=ÀzE`€W4Ó=À¯”Db³Ó@m³lE@e³²Z@°s@r³"&@r³ë�@q³¯:@i³‚@ù±oŒ@d³?!@r³®S@r³,}@Rf³Ð@¡«@f³t:@f³y:@c³Iq@s³þ}@  ­D"0Hh±p!h¯”  ­D"€w Áñ D÷ ð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•Óÿw Ä 0 ù±oŒ °sf³y:€|ð*0 @Q$   Ñ 0 40 60Š)ðÕ)÷ ‡÷ ‚ñ :ðµ#÷ 3†&œ*w®÷ ù‡ðµ#(ð PðÕ)÷ †ðµ@#ð¥2s³þ}Jf³t:Xc³Iqre³²Z€øÇÿ*ð*fff÷ ±±‰‡÷ †&œ*wLðµ.÷ P3‡ð5ð8ðe$8wä2€æ•Öÿ2&ÀÁe÷ €†æ• d³?!,e³²ZP°sn°sv¡«€tÙÿ%p8Éq ðµðµ#)÷ †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ 0&r³ë�|b³Ó€ð0œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ ‡0 @0 ð‡&œ*0 @÷ uÄ÷ ðµ# ÁeBFr³,}di³‚pq³¯:€l&B÷ °B÷ ÷ °•*±‡÷ ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Ä…&0  r³®Sm³lEr³"&"i³‚dèðµ#Õü Õ÷  ÷ 0@°Æe° 6ðµ@#040 6wðµ!p2‡$q³¯:Nf³ÐFW 4Ó=ÀzE`PZ4Ó=À¯”Db³Ó@m³lE@e³²Z@°s@r³"&@r³ë�@q³¯:@i³‚@ù±oŒ@d³?!@r³®S@r³,}@ba³VN@f³Ð@¡«@f³t:@f³y:@c³Iq@s³þ}@  ­D"0d^±âWhh±‚!h¯”  ­D"€w & w æÁñ D÷ …ð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•Óÿù±oŒù±oŒ°s f³y:€|wÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)Å ÷ ÁeB÷ ‡÷ ‚ñ :ðµ#÷ 3†&œ*w®÷ ù‡ðµ#(Bs³þ}Na³VNff³t:tc³Iq€øð PðÕ)÷ †ðµ@#ð¥Çÿ*ð*fff÷ ±±‰‡÷ †&œ*wLðµ.÷ P3‡ð5ð8ðe$8wä2€00$o$pTADATADATADATADATADATADATADATADATAe³²Z8d³?!He³²Zl°s€tæ•Öÿ2&ÀÁe÷ €†æ•Ùÿ%p8Éq ðµðµ#)÷ †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•°s¡«Br³ë�€ððµðÕ8÷ 00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ ‡0 @0 ð‡&œ*0 @÷ b³Óbr³,}€luÄ÷ ðµ# ÁeB&B÷ °B÷ ÷ °•*±‡÷ ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ&i³‚q³¯:&r³®S.m³lE2r³"&>i³‚€è ÑÄðµ#Ä…&0 ðµ#Õü Õ÷  ÷ 0@°Æe° 6ðµ@#040 6wðµ!p2‡@q³¯:jf³Ð8W 4Ó=ÀzF`à84Ó=À¯”Db³Ó@°s@r³"&@r³ë�@q³¯:@i³‚@ù±oŒ@r³,}@a³VN@f³Ð@¡«@f³y:@"  ­D"0Öh±ì&h¯”  ­D"€w Áñ D÷ ð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwšÄ 0 ù±oŒ °sf³y:€|ð*0 @Q$   Ñ 0 40 60Š)ðÕ)ÁeB÷ †&œ* ÷ ñ ðµæ•Äÿw6± ðµ.÷ 23‡ð5ð8ðe$8a³VNx°s€ø8wä2€æ•Öÿ2&ÀÁe÷ €†æ•Ùÿ%p8Éq ðµðµ#)÷ †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ°s"¡«Nr³ë�€t# 02ð•ðµðÕ8÷ 00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ ‡0 @0 ð(b³Ónr³,}€ð‡&œ*0 @÷ uÄ÷ ÷ °•*±‡÷ ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äi³‚q³¯: r³"&,i³‚nl…&0 ðµ#Õü Õ÷  ÷ 0@°Æe° 6ðµ@#040 6wðµ!p2‡.q³¯:Xf³ÐW 4Ó=ÀzF`ÐW4Ó=À¯”Db³Ó@m³lE@e³²Z@°s@r³"&@r³ë�@q³¯:@i³‚@ù±oŒ@d³?!@r³®S@r³,}@Ra³VN@f³Ð@¡«@f³t:@f³y:@c³Iq@  ­D"0Nh±²'h¯”  ­D"€w Áñ D÷ ð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwÄ 0 ù±oŒ °sf³y:€|ð*0 @Q$   Ñ 0 40 60Š)ðÕ)ÁeB÷ ‡÷ ‚ñ :ðµ#÷ 3†&œ*w®÷ ù‡ðµ#(ð PðÕ)÷ †ðµ@8a³VNPf³t:^c³Iqxe³²Z€ø#ð¥Çÿ*ð*fff÷ ±±‰‡÷ †&œ*wLðµ.÷ P3‡ð5ð8ðe$8wä2€æ•Öÿ2&ÀÁe÷  "d³?!2e³²ZV°st°s|¡«€t€†æ•Ùÿ%p8Éq ðµðµ#)÷ †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8,r³ë�€ð÷ 00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ ‡0 @0 ð‡&œ*0 @÷ uÄ÷ ðµ# b³ÓLr³,}ji³‚vq³¯:€lÁeB&B÷ °B÷ ÷ °•*±‡÷ ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Ä…&r³®Sm³lEr³"&(i³‚jè0 ðµ#Õü Õ÷  ÷ 0@°Æe° 6ðµ@#040 6wðµ!p2‡*q³¯:Tf³Ð.W  Ó=ÀZ:d¾w Ó=À¯”Ds³³.@‚²D@ù±oŒ@  ­D"0zp³¾wh ’±¾wh¯”  ­D"€w ð*æ ƒ ‚æ¦)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷ ‡aÄ%wñUXñ5@ƒ ù±oŒ^‚²D€|âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ ñ5@XñU@ñ5€áÄ„íÄ ñUþ¥*ñUÄ Å‚ö€øƒàÎàà Ê¥*Ã%C!.D`÷ *‡ƒ‚wúþÆeCÃ5€ñU‚Ã5 ±±± Ã5€± Ã5@±‡Æeð•Êÿ s³³. t*±‡ W  ÎçÃjaf Z Îçï”De³&@e³&@r³ë�@c³2 @w³œ€@a³—K@  ­D"0`p³¿Zh¯”  ­D"d° 6 p 4 ì0Á`p÷ ‡æf¦÷ °6°4‡÷ ƒ46÷ ‡÷ °eð‹*wÖ ±‡& e³&,w³œ€:c³2 Ha³—KNr³ë�\e³&úW  ÓeÀz\g ÓeÀ¯”D ²Ë@e³&@p³“y@r³ë�@r³Þ@w³·€@w³™€@p³J,@ù±oŒ@m³oŒ@r³,}@f³Ð@"  ­D"0–•±}h¯”  ­D"€w ÷ n‡83200$w\ 1gcðµd& & & B öŠð 2OðµðµΕ ¶“ðµ à N”à Υ$¶“Ε Åð 2ƒù±oŒ p³J,€|2Åà‚Î¥ Ž�Î �æ÷ ƒvÂ Š‚ ƒ“Ε f÷ ƒ�ׯe÷ ð¥óÿ*÷ Æeð•Øÿ*wðµ÷ †&m³oŒ>w³·€Tr³,}` ²Ëpf³Ð|p³“y€øð¥öÿ*ò0,÷ ÷ Lé‡ðµ ÷ ‡ðÅ)÷ ðÕ)ðµ  ð¥Ó ð¥Ó lð 0Âl‡ð  ƒð¥øÿÿr³Þ*e³&8 ²Ë€t÷  µ‡ð¥ð ðÒð¥ òeþÿÁe@Ã÷ x0‡÷ j)‡‚ ÂE°÷ œðep ðÕ)ì‚w€ðîþðµ ð¥,÷ ÷ N‡÷ wÌþ÷ ‡÷ J†÷ ‡B æƒàƒ#ƒÎà÷ Î f÷ Ìÿ� ‡Â`‡ð¥öÿ*÷ w (r³,}0w³™€w³·€Tr³,}` ²Ëpf³Ð|r³ü�€øHõ‡ðµ ÷ ‡ðÅ)÷ ðÕ)ðµ  ð¥Ó ð¥Ó lð 0Îl‡ð  ƒð¥øÿÿ÷ œÁ‡ð¥e³& ²Ë€tð ðÒð¥ òeþÿÁe@Ã÷ t.‡÷ f'‡‚ ÂE°÷ ˜ðep ðÕ)ì‚wÿðµ ð¥,€ð÷ ‡÷ wèþ÷ ‡÷ J†w‡B æƒàƒ#ƒÎà÷ Î f÷ Ìÿ� ‡Â`‡ð¥öÿ*÷ w±ðµ)0406 & r³,}w³™€ s³k:m³oŒ` ²Ëdf³Ðll0ì° ‡W  ÎçÃr7q¼ Îçï”Db³Ó@w³t@r³k@w³L @b³—G@s³2 @  ­D"0<r³ë�hr³ü�h¯”  ­D"@ðµðe6p 4÷ †8÷ ±‡÷ ÷ ÷ ‡‡÷ õ†‡&s³2 "b³Ó*b³—G.r³k2w³L :w³tÐW  ÎçÃ:\qò Îçï”D  ­D"0hr³,}h¯”  ­D"lðµ.ðµ 𥒤𥒤°0ð¥0l°  ƒ0 ðµð•Øÿ*±¡‡ÖW  ÎéÃJŒs"& Îéï”D°s@œ«@  ­D"0Nr³"&h¯”  ­D"Rðµ82Áe&À÷ €0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡°s"œ«°W  Î'ÊRt¸L Î'ʯ”Dq³¯:@i³‚@  ­D"0 r³khw³kh¯”  ­D"$ÄÄ÷ U•Õ4 6wi³‚"q³¯:fW  ÎçÃR$t÷_ Îçï”Dw³Ô@a³—K@s³2 @  ­D"0Àr³§‘h¯”  ­D"€&4&6÷ ’÷ ‡°6°4÷ ˜wrÄ%°6°4÷ 2‡ ì6 ð � l0Á ü&°÷ Z°46÷ °6°4‡÷ :s³2 6s³2 pa³—KH|ðµ)0406 0 ð *±‡ì0ðe6p 4÷‡÷ ÷ àÿ‡@w³Ô¦W  ÎçÃJü�œw Îçï”Dw³¼@f³Ð@  ­D"0w³L h¯”  ­D""÷ BfÁep�`p�ww³¼ f³Ð(W 4Χ½r÷’¼4Χ½¯”Db³Ó@w³t@b³—G@w³k@a³[M@f³Ð@  ­D"0`w³·€hw³™€h¯”  ­D"d÷ ðµ)ðµ÷ !‡f¦æ÷ †ƒ‚„÷ ‡çÆeðÅ)ðµ . ðe6p 4÷ 0ž8*w&b³—Ga³[M&w³k2w³tXb³Óbf³Ð–W  ÎçÃB÷’d Îçï”Dw³™€@  ­D"0w³œ€h¯”  ­D" ¡ðµ)ðÕ .÷ ðÅ .‡w³™€ ­D""÷ BfÁep�`p�ww³¼ f³Ð(W 4Χ½r÷’¼4Χ½¯”Db³Ó@w³t@b³—G@w³k@a³[M@f³Ð@  ­D"0`w³·€hw³™€h¯”  ­D"d÷ ðµ)ðµ÷ !‡f¦æ÷ †ƒ‚„÷ ‡çÆeðÅ)ðµ . ðe6p 4÷ 0ž8*w&b³—Ga³[M&w³k2w³tXb³Óbf³Ð–W  ÎçÃB÷’d Îçï”Dw³™€@  ­D"0w³œ€h¯”  ­D" ¡ðµ)ðÕ .÷ ðÅ .‡00%pTADATADATADATADATADATADATADATADATA<Á0ÀW %6@-Šv"¸L3ЉÜ6 sBK–BÀv#xx’´'eã.�`Xã.¸`0y: ty:ˆ‹ ºy:xŒ àTe 60qX H0q8  >s8Œ‹8  Œ‹` ì�‹à~HÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜW ÄÀXÀb"¸LÄÀXÀ¯”DŠ#€Ô@š©?T@{È@© 2@ì©*@ Zg�#0*ô¨kh¯” Zg�#.f÷ †ÂÁ÷ �ÁeÁE�  Á ý‡ ì©*© 2‚Š#€Ô‚{Èš©?T:W tÀXÀb3ЉtÀXÀ¯”D¼[ L@j¬ÇS@ô¨dŒ@N©`r@ X:† Zg�#0Bô¨2zh¯” Zg�#F� � ÂB`— ‚·Àw`÷ ÷ wÁ÷ w÷m‡f X:†¼[ L X:†X:† X:†&N©`r*j¬ÇS0X:†4¼[ L8ô¨dŒé«R@?hu~P?h 2ŽW œÀ¨ÀzBÀvœÀ¨À¯”D?hk@?hu~@?h 2@”«/d@?hT[@¹«WŒ@A«-@A«³-@é«R@j¬ëD@?hBx@¾©‡@*ô¨k@ Zg�#0ZN©`rh¯” Zg�#^w EÅ÷ †Á÷ Ä BÑ „` p‘÷ ð7ðAÁŠÅÅ @aÀe· · ‡^¹«WŒ¾©‡?hBxô¨kA«³-,?hk0”«/d4A«-6?hT[:A«->é«R@?hu~P?h 2Tj¬ëDZj¬ëDŠW tÀXÀ:#xxtÀXÀ¯”D Zg�#0" ©€h¯” Zg�#&Áe?ÁE? ‡& fŽ Ž Ž Ž Ž Ž æYÿˆ‡<W œÀXÀj´'eœÀXÀ¯”D?hk@?hu~@?hT[@A«-@A«³-@é«R@ Zg�#0N¾©‡h¯” Zg�#R· · À0 úBŠÂÀ €`±¡ À±¬ùð‡Té«R é«RA«-?hT[ ?hT[?hu~&A«³-:A«-?hT[ @?hT[F?hkLé«RN?hu~ØW œÀXÀzã.�`œÀXÀ¯”D?hcM@j¬/d@?hk@?hu~@?hT[@¹«WŒ@A«-@A«³-@œ«@?hBx@3e¤’@?hóy@2© 2@¡«@ Zg�#0~ì©*h¯” Zg�#€w fÀ ÷ 4†Ä Ãÿÿ& D -ù‚ô‹öNñ ±òµ÷ à €ÜÀ ` ƒ³ÁÀ÷ �Æ– – v¹«WŒ © 2¡«A«-?hT[ &?hT[,?hu~2?hcM:?hu~H3e¤’J?hóyPj¬/dTA«³-\?hkh?hT[j?hT[n?hBxr© 2vœ«|‡DW œÀXÀzã.¸`œÀXÀ¯”D?hcM@j¬/d@ð«ò@?hk@?hu~@?hT[@C�s:@©Bx@¹«WŒ@A«-@A«³-@ ©€@Zœ«@?hBx@3e¤’@?hóy@C�€Q@© 2@¡«@ Zg�#0 ì©*h¯” Zg�#€w fÀ ÷ E†Ã— †Á÷ ‡w`K`/ËÿÿÄ Ãÿÿ& D -ù‚ô‹öNñ ±òµ÷ à €Üv¹«WŒ © 2¡«ð«òC�€Q$C�s:( ©€.©Bx:A«-?hT[ H?hT[N?hu~T?hcM00%‡\ 1g\?hu~j3e¤’l?hóyrj¬/dvA«³-~?hk(|À ` ƒ³ÁÀ÷ �µ– – ‡ ?hT[?hT[?hBx© 2œ«FW LÀ¨ÀRy:LÀ¨À¯”Ds©À�@ ©€@ X:† 0Zg�#0R6ªí8h¯” X:†A? Zg�#VÂÂeÂE ÷ æÿˆ&Àæ ÿˆÀm*€ ‡ Àí* ‡Àí*ž¦ Ê*à�bŠå‚‡FX:† ©€ X:† s©À� $X:† *X:†*6X:†*>X:†*HX:†*&W <Á0Àzy:ˆ‹<Á0À¯”D”#@ª¬‰@$9@¹«WŒ@A«-@A«³-@h±²'@é«R@?hBx@j¬TG@±lE@© 2@:Å[/d@ô¨k@ X:† Zg�#0ˆ6ª½;h¯” X:†”# Zg�#vw ÷7 7 7 À W,‡Á÷ 7Á÷ 7Á Àæþÿðð•#÷ †ð%* 7 ï�7 €¹«WŒ ª¬‰A«-A«³-é«R© 2&Å[/d?hBx 0ô¨k4A«³-8?hBx<ô¨k@A«-DA«³-Lj¬TGTX:†`h±²'f$9ÿ nX:†rìŽ ÷ ‡Ž ±€‡X:† ±lEVW <Á0Àzy:xŒ<Á0À¯”D”#@ð«ò@ª¬‰@$9@¹«WŒ@A«-@A«³-@h±²'@é«R@j¬ëD@?hBx@j¬TG@J±lE@© 2@Å[/d@ô¨k@ X:† Zg�#0œ6ª½;h¯” X:†”# Zg�#zw wÀ      ÷7 7 7 À W,‡Á÷ 7Á÷ 7Á Àæþÿðð•#÷ †ð%x¹«WŒ ð«òj¬ëD ª¬‰$A«-(A«³-,é«R0© 2:Å[/d?hBx Dô¨kHA«³-L?hBxPô¨kTA«-XA«³-`j¬TGhX:†th±²'*v* 7 ï�7 ìŽ ÷ ‡Ž ±€‡$$9ÿ  X:†X:†±lEW LÀ€ÀrTeLÀ€À¯”D?hcM@¹«�@3e¤’@?hóy@¾©‡@ Zg�#02£ªGGhj¬ÇSh ¬‡Mh¯” Zg�#6·÷ ‡°Š‡·÷ ‡ðЇ·÷ ‡ðÕ‡>¹«� ¾©‡?hcM¹«�¾©‡ ?hcM&¹«�*¾©‡03e¤’2?hóyXW ìÀ0Àz0qXìÀ0À¯”D”#@?hk@?h 2@ª²e;@š©?T@¹«�@Õ±à@Š#hì@j¬TG@{È@ X:†  "Zg�#0Âj¬/dh<”«/dh¯” X:†”#Zg�#€·÷ vpðæ°4Îe°6ð•(ð÷ ÷ d>‡‡·÷ >ð pðæ°4Îe°6ð•(ð÷ ÷ "ä‡B¹«� X:† 0X:†6Õ±àB¹«�JX:† ZX:† rX:†xª²e;J|‡�7 wœ· ÁeÀ‡‡ææ)ÿˆwŒ †7 ±� Á÷ ‡TX:†?hkX:†X:†?h 2 j¬TG2X:†8X:†B{ÈŠ#hì Fš©?T˜W ìÀ0Àz0q8 ìÀ0À¯”D”#@?hk@?h 2@ª²e;@š©?T@¹«�@Õ±à@Š#hì@j¬TG@{È@j¬”G@j¬jH@2 X:†  Zg�#0Öj¬/dhF”«/dh¯” X:†”#Zg�#€·÷ Špðæ°4Îe°6ð•(ð÷ ÷ xH‡· · ‡·÷ Hð pðæ°4Îe°6ð•(ðJ¹«� X:† 0X:†6Õ±à@j¬”GFj¬”GL¹«�TX:† dX:† |X:†^|÷ ÷ ,䇷 · ‡�7 wœ· ÁeÀ‡‡ææ)ÿˆwŒ †7 ±� Á÷ ‡hª²e;j¬jHj¬jH"X:†&?hk(X:†,X:†0?h 24j¬TGFX:†LX:†V{ÈŠ#hì Zš©?T´W LÀXÀB>sLÀXÀ¯”Dª¬‰@ Zg�#04¡«ú‰h¯” Zg�#8BÁ¡ B — ‚ @€` ‡Š ƒ‚ B`·¡±‡ª¬‰.ª¬‰W ìÀ0ÀzŒ‹` ìÀ0À¯”D”VN@3e¤’H ­æQ?hcMH?hkH?hu~H?h 2H?hT[H?hBxH?hóyHX:† j2ª¬‰hA«-hA«³-hé«Rhj¬TGh¯” X:†     &,,:‚”VN>W ìÀ0ÀzŒ‹8 ìÀ0À¯”D”VN@3e¤’H ­æQ?hcMH?hkH?hu~H?h 2H?hT[H?hBxH?hóyHX:† xRð«òhª¬‰hA«-hA«³-hé«Rhj¬ëDh j¬TGhj¬”Ghj¬jHh¯” X:† &&::‚”VN.W ÄÀXÀj�‹à~ÄÀXÀ¯”D£ªGG@¹«�@j¬ÇS@N©`r@ Zg�#0\®ª=HhN©cMhæ©èŠhB¯” Zg�#`¦÷ ÷ ‚‡·€ ÷ ÷ ˆ00%�&�TADATADATADATADATADATADATADATADATAv  ÷ ÷ €mˆ‡¡ �`÷ ±@÷ ¡‡8N©`r £ªGG¹«�N©`r j¬ÇS6N©`r:j¬ÇSNN©`rZN©`r?hT[H?hBxH?hóyHX:† xRð«òhª¬‰hA«-hA«³-hé«Rhj¬ëDh j¬TGhj¬”Ghj¬jHh¯” X:† &&::‚”VN.W ÄÀXÀj�‹à~ÄÀXÀ¯”D£ªGG@¹«�@j¬ÇS@N©`r@ Zg�#0\®ª=HhN©cMhæ©èŠhB¯” Zg�#`¦÷ ÷ ‚‡·€ ÷ ÷ ˆ<Á0ÀW  1ÂÝ>+"Ÿ+"»+"Ì+"¬+".+"1+"y+"¨+"L +"r +"w +"Y +"K+"R+"n+"Þ+"+"+"Ï+"J+"+" +"³+"+"B+"•+"+"++"6+"Ô+"Þ+"+"z+" +"1+"6+"B+"…+"0+"X+"„!+"†!+"ž!+"9"+"D"+"K"+"#+"#+"ª%+"«%+"´%+"`&+"ì&+"g'+"k'+"±'+"´'+"¶'+"½'+"è'+"‹(+"¢(+"Ô(+"v8+"ø8+"99+"`:+"y:+"¨:+";+"A;+"E+"¡E+"–G+"ÒG+"6K+"\K+"iK+"€K+"àK+"jL+"[M+"xQ+"R+"üR+"T+"#T+"­W+"µW+"NX+"\X+"ìX+"ŽY+"ÜY+" Z+"N`+"”`+"—`+"çe+"öe+"kf+"Ýf+"æf+"ªp+"«p+"¼p+"Öp+"Zq+"`q+"qq+"}q+"kr+"žr+"¶r+"¼r+"èr+" s+"fs+"ys+"„s+"‹s+"Œs+"’s+"¢s+"t+"™w+"x+"Bx+"ëy+"z+"»z+"Õ+"Þ+"ø€+"–ƒ+"¶„+"R†+"ZŠ+"ä‹+"<�+"š�+"«‘+"L’+"*–+"2™ë%Ãë%ì ë%÷ ë%kë%në%Dë%�ë%çë%]ë%Ôë%ë%ëë%ì&ë%'ë% 'ë%®(ë%œ,ë%5ë%ø8ë%¼@ë%éQë%üRë%NXë%ôXë%kfë%Þfë%\gë%Iqë%Kqë%Tqë%të%'të%iwë%™wë%lyë%íyë%zë% ë%ë%Ýë%Þë%æƒë%Ä…ë%É…ë%º‰ë%sŠë%ü�ë%™’ë%¤’“(Þ“(z“(µW“(ÜY“(ÔZ“(—m“(ø€“(ZŠ“(@�“(i�“(ñ‘“(ù’“(5“ëWnëWÞëWzëWµWëW—mëWø€ëWZŠëW@�ëWi�ëWñ‘ëWù’ëW5“ùaà8ùa0Mùa¨MùaÆMùaÇMùa@`úa úaà8úa¸GúaàGúaþGúaÿGúaÐHúa0MúaøMúa(dúaøfûa ûa`^ûaÜûaÀ€üapüaxüaàüaþüaÿüaè!üa°"üa±"üaÃ"üa`'üaà8üa;üa#;üa¨WüaxZüa€üaЉüaèŠýa ýaèvýa xýa¸yþa�þa¸þa" þa> þa? þaà8þa«:þa¸:þaLþa¨WþaÐWþaxZþa@`þa  b?  bp  b  b0  b¨% bè& b' b' b' bˆ' bP2 b«: b¸: bðK b@` b”U«Ý�?U«‚KHU«-‚x4”«€Üj”«‡ Üj”«XHö”«úv»¦•«õ ¡•«ÒfÆ•«¸.�â•«µO'6•«ºW»¦—«ç(h—«è(h—«é(hœ«VÃVœ«WÃVœ«XHöœ«NÃVœ«OÃVœ«1Äœ«ZX1Äœ«w2ˆ�«¯!z�«&# �«•$�«Ô$¾�«{$8�«$²�«„!%V�«"%ú�«#%ì�«ö&&¼�«u'&��«U(&��«œ,+�«¹.»¦�«v:-,�«T[&��«E`/†�«:d/H�«\g/Â�«q6Æ�«q6Æ�«Iq44�«Kq¹d�«Tq&��«Uq0Ø�«Vq0|�«!t1 �«Hw»¦�«dw¯¶�«‰w5�«)x¹¼�«6x-,�«7x�â�«@x�â�«Ay&��«—y�â�«¼y¯¶�«Åy¯¶�«íy¯¶�«å5º�«Ä…6^�«ñ�6Ø�«™’44Ÿ«à`{. «xb  «ƒK|È£«`"�⣫ €»¦¤«� !ô¤«!ô¤«V�⤫ªH!ô¤«úW!ô§«õ<4ö§«`T›(¨«»£¼¨«l¥*¨«„!¥*¨«ì&¥*¨«´'¥*¨«üR¥*¨«žr¥*¨«ZŠ¥*¨«oŒ¥*»«+d".¼«8}@½«v~»¦ëô~ÀëKq†È«õ ›(È«`T›(È«LqoTË«àe|ò«ˆ@¬ ¬¶KA,¬À€d¬¸L¨¢¬ÝB:¬L0¬-�ü¬ðs„œ¬€"K<¬�"…òY¬T}6RY¬±}6RY¬Ð¨ÊZ¬àG†Hj¬˜Höj¬õ<¡l¬‡ Üjl¬À Üj”¬ô»¦”¬t!ÁŠ”¬®s�â ­WT¹¼ ­XT¹¼ ±VN›Âÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ00&Ÿ�TADATADATADATADATADATADATADATADATAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ @~D:h;ö›rw ÈX›rx ÉP›ry Ê›rz Ê2›r{ Ë›r| ËÈ›rµz4sZ1u¯¶1uTK’1ucKà1u¢Kt1uwLÂ1u®x1ul†ÎÄ1un†¹d1uo†Ï¶1us†ÑÌ3uÀ^3u® v3uÅG!Ö3u…K�3ukM!z3uS".3u^!ô3uþ_# 3uIq$3u|q‘‚3uIt“44u%!$¾4u;;$84uH;$²4uëg”,5u¥Z%V5u»p%ú5u|q–²5uË–ÒÆ5u™¹¼5u$™%ž5u%™%ì5u>™˜n6u" &�6ut:&¼6uMq'66u‘w(Ì6uœw(7uÔ(h7u`"+7ub"+~7u2g,¼9u‚,�9uf',Þ9uÁS›Â9uüX-,=ul›(=uû¦=uÄÕx=uÌØ=uÓÙ=uªÆ=u<-˜=u=ËŠ=u²'-\=uYH-ª?uÖd/†?uüdœâ@u# /H@u~q¼@u`†/ÂBu–0<BuÆ0ŠBuW!0ØBuq!0|Buá"1 Bu€K1ÄBuúM2ˆBu9T3®Bu;T†fBu=T3üBu‘w3JBu›w�âBuœwªBBuz}3˜Bu¢}3æBu�ÜjBu�¡Bu�44Bu6‘4öBu+–£¼BuŠ–5,Bu©–¥*Bu ˜5zCu 5ÈCuz5DuÖs5ºEukY¨¢Eu¡d6^Gu¼6ØGub ®¢Gur ¨ÊGuc}6RHuþdÁŠ[uŽE6Æ[ukM8[u`8Î[uq9X[u|q9¦\u%!9ô\u;;9‚_ud±_u`"¯¢_uœw::fu[–:Øguüd;Ìhud;huœw=Zhu‚…>”hu`†?ju[KÃVluÖs@¬mudA,mu¡dB:ouó~B@‚uœ'BŽƒu#C@ƒukMCŽƒu`C܃uqDTƒu|qD¢„u%!Dð„u;;Eì…u$™Ex†ut:F„‡u`"³°‡uœwH‰uC^Hö�uüdJ„�uœwK<�u`†KH•u¡dL0—uçe©°©u[MMÌ©udM‡Fªuœ'OÀªufsPpªuLyQšªu¤yS«ukMSp«u`S «uqTú«u|qTH¬u%!T–¬u;;U¨¬uN·b¬uœwV²®ut:VL®u2XWò®u HB bp€Hë%ëHëpYMHëp[MH@bè&HýaèvHëpcMH zk–y:Hë%\gHk–�:Hk–J†H bÙ�H!k–’:H bÐ4Hë%ì&H+"Ô(Hðük–´Hë%'Hþa°�H8+"ø€H`ù b°�H,“(ÜYHz“(ÞH€ëpYYHë% H þaØ�H: bö�H@þa‚H< b‚H0ë%Hëp;YH bØ�H.þa(‚H> b(‚H2+"¡EHPü+"xQHÐûbp HzþaP‚H@+"«‘HùbˆYHë% 'H@ bP‚H4“(ZŠHbxH2ëpì Hk–4KHk–»H bpH bpqHë%ÝHë%ÞHëWnH z bx‚H6ë%ü�H bèvHëpYHb¸`Hk–^KH bð‚H<ëpWHëpnHPëplH ë%tHbÝ`H bÜ`H bƒH>ë%'tHz b¸HbØ`H b ‚H8üaà8Hb×`H bÈ‚H:bÖ`Hë%æƒHk–µWH ëp›H€#z zH+"R†H@ùk–,Hk–+dH+"L’HùzëpÙšH@b00&§\ 1ghH +"ŸHðÿ+"»Hàÿë%®(Hë%¼@H ëp™wHúa¸GH1úaÿGH(ëp7[H úaàGH&ë%5H0“(µWHüaàH&üaþH&zbø H ýa xHúaþGH&üaè!H+"ÌHÐÿüaÿH(k–´HH8+"üRHÀûëWi�HëW@�Hbp Hëpü�Hë%É…H +"–ƒHPùb`rH$z+"JHàþëp�Húa(dHë%Ä…H b0 Hþa@`H b@`HbHH&bIH+"–GH@üb[H+"¬HÀÿ+"™wHÀù+"ÒGH0üëp—`Hz bÁžHüa;H b xH+"BxH ù+"HÐþúaÐHHë%éQHþaà8H +"#TH ûýa¸yHk–<H+" HÀþ“(ø€HüaÃ"H+"xH°ùzüa±"H üa°"H2+"TH°ûk–yqH+"1H ÿ bÓžH+".H°ÿ bQ HP+"¨H€ÿëp®„H b` Hüa#;H ë%™’H b`rH6ë%¤’H!z+"³H°þk–ú%H+"v8Hàüë%ÃH@ëW—mHb ™H+"—`H0û+"yH�ÿ+"N`HPûþa HB bp¡«Rœ«X5¬ ™f¡«rUOÀÅçr3uSOÀÅ篔D 3uS ÀC©+dh|C©—dhž»«+dhfE©ÆHhE©¶HhE©ÉHh E©ÈHhE©ÇHh¯” 3uS€Á€ ÁÀÁ@@ Á@¦õÅ 9æC@&æÎe$æÎe& Μ Á †N<B>& ŽŸ2¶ã†ŽmÁ‹€B>‚oÀ Á €€€oó‹ "�¤€|jÎ üóµdó¥ €€`à¥[‡Î ]Ò¬ VÎ ûö Uöe¶ Åó¥ 5ƒƒ`昃à`ö’ƒÓ$‹ÓEðð‹ËEã¥ËŠã¥ËŠÓEþþ€øã¨Ó &€‚ËÎ ˤ!%�¤øÓ Ë Î ¦”Ôã‹ ÷‚c€cóµ  ¨ ÎŽ Î  ¨ü÷†ÎµÓ9Æe ƒ‚‡÷ ‡Ptú‡ð¥ œ A>Ì55,<‚lÉ¥Ÿ ‡f”ÎEðÿÊÖ¥ ‡ô—¥ ÃPü‡zUNÀEÂ:3uþ_NÀE¯”D ©S~@ �«&h¯”  æ0w  ©S~¤UNÀEÂJ3uIqNÀE¯”DJ©Å@ ©S~@ �«•h ­WTäl¯”  ­WTjjJ©Å æw  ©S~zUNÀEÂ:4u%!NÀE¯”D ©S~@ �«Ôh¯”  æDw  ©S~zUNÀEÂ:4u;;NÀE¯”D ©S~@ �«{h¯”  æ4w  ©S~¤UNÀEÂJ4uH;NÀE¯”D ©S~@p©Åœ@ �«h ­WTäd¯”  ­WTbbp©Åœ æ$w  ©S~¤UNÀEÂJ5u¥ZNÀE¯”Di©5u@ ©S~@ �«„!h ­WTän¯”  ­WTlli©5u æw  ©S~¤UNÀEÂJ5u»pNÀE¯”Di©5u@ ©S~@ �«"h ­WTän¯”  ­WTlli©5u æw  ©S~NUNÀEÂ25u$™NÀE¯”D 5u$™ ¯”¤UNÀEÂJ5u%™NÀE¯”D ©S~@ ©µ�@ �«#h ­WTäf¯”  ­WTdd ©µ� æ(w  ©S~,UNÀEÂz6u" NÀE¯”D¼©õ‡@ ©S~@È«õ @«µ�@©õ#@  �«T[h�«u'h �«U(h�«Ayh�«Tqh ­WTä^ ¯”  ­WTRR ©õ#VV ¼©õ‡ZZ«µ�È«õ $æP æTæXæ`ædw" ©S~zUNÀEÂ:6ut:NÀE¯”D ©S~@ �«ö&h¯”  æHw  ©S~–UQÀ…áz6uMqQÀ…ᯔDœ«N@l¬‡ @@ª¿.@œ«@�«@x@¬¸L@œ«ZX@Y¬Ð@9©ë3@ 6uMq V¼©õ‡h*¼©ù‡h ©õ#h ©ù#h•«µOh¯” 6uMq€õ�üw÷ û5 ,÷ L÷ óõ,÷ à õ�üL õL÷ *‡æwôÅPuLuNfV ‡õ0úLÌ5 @ÀeLõ ,% �«@x,9©ë3HY¬ÐB L@ª¿.€|÷   ‡ `1! W-,ñ Aòõ ,ñµ öõLœÂE00&·\ 1gÿÂ¥"óµ t4 æw‡ðµ  ¬¸Lnœ«Nä r@ª¿.ubø ô ´ôe t 4 ª@ÀeLW-,÷ t 4 Â÷ †&&÷ °ˆ±‹†‡4l¬‡ Hœ«Tœ«ZXNUNÀEÂ26u‘wNÀE¯”D 6u‘w ¯”NUNÀEÂ26uœwNÀE¯”D 6uœw ¯”œURÀEÛz7uÔRÀEÛ¯”Ds©À�@�«ö&@�«\g@ù±oŒ@�«E`@�«œ,@�«&@�«•@�«:d@�«¯@ 7uÔ @"—«èhæ—«çh—«éh¯” 7uÔ€w 0 ø0ú0ð‹ü÷ ȇpúpM÷ $†w`ðµ€ówð \ ðµ ó÷ î‡÷ .ð%°ýwÀðµŠ0ö"0ôù±oŒ€| Áep"ð ÷ ð lìp0÷ ð•ð *" °`øÂ Dðµó ¦�`W¨aW¢zÉÅ Â ö‚0,ú�«\g:�«œ,€øw´É¥;ðµó&wöþwöð¥Ðùæûÿð%°ý7œü Ä ðµ€ó÷ Hwÿ÷ ˜ðÅ€óðŠüæöÿ& ðµ ó ðÅ óðÕ€óð•ÿÿü€tðµó &^&`÷ €°`°^°“òV ‡æÿÿÞæþÿÛæýÿ׿üÿÔðµó�`W¨-ð‹ó€ðÅ€óðÕ óÂ ð ø°`w4þwrÿw ð‹üxù±oŒ€ð³ðŠüðåþù°Šü÷ €§É¥@Ñðµó 0¬üýÆ�  p€°�„°ø° ø÷ Øðµ@ó ðÕ@óðå‚ð• …÷ ð ^ �0 ø00ú€lwÔý&^&`÷ °`°^wÿ÷ TþðåþðŠüõµ€ó-0®0 °0™°0™Š0´0¶0¸ðUj0Š„÷ ˆ‡000ð•𵊀èð•0ð%°ý‡Ö Àw ð \"°ŠüþðµŠ÷ ¸¶´œŠœ°®0þ÷ Œ‡U%ð  ÜÄ"ù±oŒ>�«ö&€dÃeÃEÆà°Â÷ 4Æ`0 Â÷ (e)ðEj0`0^�÷ ð ¡±‡0Šnð5j÷ ð ^�ðµŠðÕh÷ ðÅh÷ ‡:�«&X�«:dp�«•|�«E`dàU%÷ e)‡0ŠüÉ)fÿˆ‡Ñ Â÷ 2‡× /×  ×  ô÷  ‡×  ú×  ÷R¨ðÕ€ó¡‡ÂåC”‡�«¯$s©À�zUNÀEÂ:7u`"NÀE¯”D ©S~@ �«œ,h¯”  æ8w  ©S~>UOÀÕR7ub"OÀÕ¯”Dɪ°h@9©@œ«ZX@ 7ub" ˜Ý©[}h¯” 7ub"€÷ úÿ† "`ú &&÷ ˆ° ±‡ñµ ‡f&öÿ&÷ €×¢ 󬆱, ±,‡ A�`¡¢òµüÿ È9©œ«ZX@ɪ°h |Àþ– �Ã�&÷ €�¡‡ɪ°hÔUOÀEÛB7u2gOÀEÛ¯”D 7u2g dê©ÈhÚ©ðGh¯” 7u2gh÷ ¬ ‚œ‚’‡÷ Áe‚œ‡Am:C”ÃEüÿÃeB@Þ ¦& & À CÜÿÿ‚R”À ý�€‚ &VP±‡NUNÀEÂ29u‚NÀE¯”D 9u‚ ¯”NUNÀEÂ29uf'NÀE¯”D 9uf' ¯”lUNÀEÂ:9uüXNÀE¯”D �«6xh�«v:h¯” ¡‡ÄUNÀÅÎ:=u<NÀÅί”D =u< \̪a h¯” =u<`à +æ‚3‘”à �3Ãå†Î@à Çà‘‘‘‘‘‘‘‘ð†à Ãå†Çà‘”‘”‘”‘”‘”‘”‘”‘”ó†Ö ‘” ‡NUNÀEÂ2=u²'NÀE¯”D =u²' ¯”ÜUNÀEÂz=uYHNÀE¯”Dô¨¦s@D©ØZ@7ªšw@C©29@ɪ°h@@ªS~@ô¨V@C©8@ =uYH âÓªè�h¯” =uYH€Å‚€ÎdÂåøÿ‚Îb‡D ÷ DÌÿ/ÍðøÄ5%“ÂÁ Í þÁ%‡Á%Ò Ò  S0¦ÓÔÓÔŠã8cPÁ ÝÍ@û�"‚s‹�ŠÍ°ü J C©29€|ÐD¸ÿÎ%bƒôµ Îp †ôµàÍÀÿ³Œw ÷ †w5¸ÿÌ t�çÿBÄÿÎhõ¥´ÿ?Îlõ¥´ÿYÎjÂU@�ÉÿÍ8C©8>ô¨¦sD7ªšw€ø0ûÀ5Â5 ÎÀ¥ ‡ ƒÍ þó ÍÀÿ³ŒwÍ@ûËúÍpúKÊÿËË5ðòË¥t�äÿ)ô•) Ðô‹Â5ÂUÍpýÂ5ÀÙ4D©ØZrtͰùÂ5�Ô´�AÌÿÉ¥AùÁeuòÿ@ÎÿAÐÿÍÿÁ5ºÍÿÀ5µÌU4 HÁ÷ ª‡÷ &æfw^ô¨Vfɪ°hp@ªS~ÂUNÀEÂR?uÖdNÀE¯”D ©S~@(«X@p©Åœ@ �«E`h ­WTäj¯”  ­WThh («Xbbp©Åœ æw  ©S~zUNÀEÂ:@u# NÀE¯”D ©S~@ �«:dh¯”  æw  ©S~zUNÀEÂ:@u`†NÀE¯”D ©S~@ 00&¿�TADATADATADATADATADATADATADATADATA�«\gh¯”  æ<w  ©S~NUNÀEÂ2Bu–NÀE¯”D Bu– ¯”NUNÀEÂ2BuÆNÀE¯”D BuÆ ¯”¤UNÀEÂJBuW!NÀE¯”Di©5u@ ©S~@ �«Uqh ­WTän¯”  ­WTlli©5u æw  ©S~¤UNÀEÂJBuq!NÀE¯”Di©5u@ ©S~@ �«Vqh ­WTän¯”  ­WTlli©5u æ w  ©S~¤UNÀEÂJBuá"NÀE¯”D ©S~@§«õ<@ �«!th ­WTäZ¯”  ­WTXX§«õ< æ\w  ©S~ÄUPÀÅçjBu€KPÀÅ篔D5¬ ™@l¬‡ @l¬À @¤«V@¬¸L@ Bu€K ꜫhœ«ZXh¯” Bu€K€ñÅ#  ñ‹ ÃÃÀ0 ¦µ1!È0úñµ ñÅ Â5ñµ Â5Â5 ÷ ÷ e‡Î5&÷ €YÎ55¬ ™`l¬À fl¬‡ €|ñµ T÷ ÆS‡PñŠ Kñµ ñ• ÷ ªE‡ñŠ >÷ ˆ÷ Î5&@¡ñµ@ ÷ ®‡÷ €)ñµ %£ Âe ƒÁ C:¬¸LX¤«V€øò ñµ óµ ÂÃòñrÂã÷ È– &V ‡p öÿ0 öÿp øÿ0 øÿ‡£ òµ  ö5òµ€¡zt‡w£   ð ð‹ ðµ@ ðÀ pppœ ðÅïÿ 0 0 0 ñÅ 1 1 1 ±‡l¬‡ &UPÀ¼ZBuúMPÀ¼¯”D5¬ ™@œ«@ɪ°h@œ«ZX@ BuúM |œ«wh¯” BuúM€ÃÃÀñ (f&öÿ÷ 1, 1,‡ &£ 4¬„‡ñµ ˆŠA`!’�÷ �÷ †&&÷ °ˆ&V ‡ 5¬ ™ɪ°h`ɪ°hfœ«rœ«ZXNUNÀEÂ2Bu9TNÀE¯”D Bu9T ¯”NUNÀEÂ2Bu=TNÀE¯”D Bu=T ¯”NUNÀEÂ2Bu‘wNÀE¯”D Bu‘w ¯”NUNÀEÂ2Buz}NÀE¯”D Buz} ¯”NUNÀEÂ2Bu¢}NÀE¯”D Bu¢} ¯”ÂUNÀEÂZBu�NÀE¯”Dj¬õ<@ ©S~@•«õ @ �«Iqh�«™’h ­WTäb¯”  ­WT^^•«õ j¬õ<æhælw ©S~6UNÀEÂRBu6‘NÀE¯”D§«`T@�«@x@©ù#@ Bu6‘ –§«õõ 4 †Cí:Cm@õ 4ƒõàùw´4 4  Blõµœ«W.ì©W4تW€|2 B-@÷ v÷ 6цBmõ :Aõ¥7=õµ€6Ãõ0BÂ`@@Á ÷ Áe0b�à ÷�Áeõ0I@Ñåõ¥7C:Cí0BL�«¼y€ø"÷ €& ‚æÃ÷ pІ–5wFÎ õ–%B>C<÷ Tô‡õ :õ¥7 æ ‚Ã÷ 6– †wõ¥7õµ€6� ÁEB÷ ñÕ|تW€t à´Cƒàõµ2õ¥7õ¥7õµ€6×  ÷ Põ <÷ D÷ O‡õ‹ÌE&÷ Ì5 0 "0 $0&€s-`C©P €ð<ƒs<õ5@uõ¥7õ¥BíBí:µ  ñµ m@m:55 5 5÷ †õ‡555 h�«q€l 5 5 5 &5 (‡u 4B æC4Càƒ#†ƒÎà÷ ðÕ Î ¦÷ ‚ꆖ ‡– Á`Â`‡Ã Áe @ ÷ wÃ2 4̪a t«W,è"r $‡‚ò &Ç ÷ ñÕ ‡"œ«V:UOÀ…á:huœwOÀ…ᯔD huœw ÌS«"h¯” huœw€ôÅ@u>u<Ãàùœ5œ25œ6µ�758— *A-<?‚A-<9ÁÂ¥ðµ€ÁeÂ¥  Ü)�`ðµ€T|ÁeÂ¥ B< Bm> —¢ ‡—¢ ‚ u:Am<ðµp ‚u@¡‡õ±‡nUNÀEÛjhu‚…NÀEÛ¯”DتW@5¬ ™@ì©W@l¬‡ @ɪ°h@̪a @ hu‚… ”U«SZh¯” hu‚…€æ õ¥75 : ÀÁÃ÷ n‡q8÷ õµ2 B" ƒ÷ ÷ àƒ‚ ÷ úÎõµ27õ¥75 :B< Bm>Ž¢—¨(ì©W4تW€| õå<õµ2õ <CŸ>µ >õ <× +× $‘“ × 1Ñ• × 0‘“‘“µ :B>f<C4Càƒ#ƒÎà÷ Î ¦÷ |‚ð†– ‡l̪a €øƒ÷ .÷ j†555 5 5 õ5@u– ‡õ : u 4‡æ÷ .ƒá‡ÃÑ�õ :ð‡Ê‹ ƒ’ÃÅàõ :µ’:õ :‡Cà$t ñÀ÷ †‡÷ ‡ 5¬ ™l¬‡ ɪ°hªUNÀÅçrhu`†NÀÅ篔DB«¶K@�«q@@ª¿.@U«SZ@�«@x@C©O @S«"@ hu`† ´U«Ý�h¯” hu`†€4 ÷ S‡õ‹(ðµæwG0-"0-$‡‚0-& 44 4 ÷ Àûôµðµ00&Ï�TADATADATADATADATADATADATADATADATA!Ã�üõ ÷ ù‡+ S«"U«SZ "@ª¿.TC©O z�«q<|Áefff@Àe æwõ‹´ ´ ´ÌEwB«¶K’  @ª¿.:�«@x€UNÀ…áZluÖsNÀ…ᯔDÈ«`T@ì©W@�«@x@œ«ZX@ luÖs Òò«ˆh¯” luÖs€ôÅ@Á�üòµðÿZòµTÁ€þô Oòµ  Âÿÿ÷ †ALA4 ô 42$ò"2&'ñ 1 ÉŠ:È«`TZ|ñå ± òµ8 4 &æ÷ €�Ã÷ †5ñÕ ÁôÕ4 uw$œ«ZX0ì©WX�«@xUOÀ¼bmudOÀ¼¯”DتW@œ«W@ì©W@«W@̪a @ mud L ¬¶Kh¯” mud€& & &4 4 4 1- 1- ÷ B‡  ÃW­7 ô u-.8Ã÷ )‡÷ mõ ::œ«Wlì©WrتW€|ÃI@Ñàõ0õà. õ¥7 C:Cí0B"B€ ÷ : B>C<÷ ,†55´´ ´ 5 5 5‡&æC4Càƒ#ƒXøÎàõà.÷ ðÕ Î ¦f÷ �‚‡ö á– – ‡Ãu-.8W­7Ãw ̪a V«WUNÀ…áZmu¡dNÀ…ᯔD@ª¿.@�«@x@ ¬¶K@S«"@ mu¡d V¬Ýh¯” mu¡dZ÷ ‡Ã€þ5.Ãàù5-@Ãpúõ¥7 Ã�üðµ!æwÃõ õ€4 w%S«"< ¬¶K6 @@ª¿.X�«@x«NUNÀEÂ2ouó~NÀE¯”D ouó~ ¯”²UQÀÅçZ‚uœ'QÀÅ篔Dl¬‡ @œ«@ɪØh@9©@ ‚uœ' þ©€Th¯” ‚uœ'€Ì¥ q"q $ñe$q "f&  ÂÃ÷ úÿ†–5±‡÷ f�à à ý�€± ± ‚öe v ñ89©HɪØh€|¶," ¶,$ ‡ñÕ ÷ ‡± ± ‚¶," ¶,$ Øþ€p $p"$"Âåƒ ° ðñÅ  ÷ †€�l¬‡ vœ« ø&V ‡NUNÀEÂ2ƒu#NÀE¯”D ƒu# ¯”NUNÀEÂ2ƒukMNÀE¯”D ƒukM ¯”xUPÀEÂjƒu`PÀE¯”Dô¨Œ@;©OM@;©EM@�«@x@ô¨" @9©ë3@ ƒu` ®G©…\h¯” ƒu`€÷ B$à ÷ †wA��  Ü(Ãà æf÷ –  œÂÅð— Ü)— Áe� l*t5 5 5  44 9©ë3ô¨" ;©OM:ô¨Œ6|4 ô 4Š­‡– õwƒõ þw(�«@x4;©EMNUNÀEÂ2ƒuqNÀE¯”D ƒuq ¯”NUNÀEÂ2ƒu|qNÀE¯”D ƒu|q ¯”üUPÀÅÎR„u%!PÀÅί”Dɪ°h@�«@x@œ«X@ „u%! fe©Ph¯” „u%!jôÅ@5 NÀþ&]õ0úNñµ ÷ mÈÕ ñÕ 4 ÷ ‡ÃõLuLuNw6ɪ°hNœ«Xh�«@xŒUOÀÅÎB„u;;OÀÅί”Dc©%@ „u;; i©Å{h¯” „u;; ƒÜ(Ãà wc©% UQÀ…Èz…u$™QÀ…ȯ”D5¬ ™@ © }@©€T@ɪ°h@”«X@j¬˜@Óªz@œ«X@ …u$™  ©À}h¯” …u$™€Ì¥ ƒ‚&$ƒã‚ &"‚ãæ& & & æ¦,.‡6. ð .œ(  ƒ ƒ¶ÃÃ66 ÷ –5¶ ¶†\5¬ ™n © }€|–5-6Š@ÀeL÷ –5–5–5 †÷ Võ�ýL‡ðÕ÷ ±‡÷ <‡°$p°"r÷ ñU 4 ÷ ‡Æe4 ÷ ±‡ Á©€TPÓªz^œ«Xrj¬˜(øÃ÷ †õ Ló±‡úÿ÷ t‡ ”«X ɪ°hŠUTÀÅÎz†ut:TÀÅί”D�«dw@ɪ°h@�«@x@”«X@�«Åy@�«¼y@�«íy@é€"@ø©("@œ«X@9©ë3@ "†ut: R¹©@Xh>¹©…\h¯” †ut:€5 N÷ †÷ 5 2÷ &†wõ‹ 4 4 ôe t wõ¥& & �BÑ”à ý€�õ5 Í¥9Í¥IÀeA õ¥ é€" ø©("@�«@x€|@ A BW-2Ì5@  4t5 u 5&u(Àå� €ÃPüwDðû�,€,ôƒ¦¦œ(C€ø@,÷ ÷ ÷ tu€•÷ �e@ C Õ2 r 4 &f�÷ †–%wÐ�€B,÷ ÷ _‡t÷ mW-2�«¼y�«dw�«Åy(�«íyV00&×\ 1gœ«Xj9©ë3n”«Xxɪ°h€t2 õ5 Ã�úȵȵ-5õ¥õ‹õ5 ȵȵ ôet ðûwàþÃ@úȵ ȵõ¥ÃPþÁ fðæ÷ ƒ4 ÌU@õLuLuNfLV ‡õL5 NÌE@4 4 5 5 5 5 &5 (õ Lßõ`úLÛœ«XèUPÀÅÎB‡uœwPÀÅί”D ‡uœw xé€"hë©€"h¯” ‡uœw|õ¥Ã0üõ‹W­&à úõ5õ5BÂe,œ(Ãà Ò* ÊEð’¤Ò    RR ¡‡ôÅ@õL±‡ŽUSÀEÛz‰uC^SÀEÛ¯”D ©À}@@ª¿.@œ«@C©z@³ª4}@ɪ°h@Y¬T}@9©@œ«ZX@ ‰uC^ d”«Xhj¬˜h@œ«Xh&¯” ‰uC^€&f¦æƒœ(Á`@ €,"�,$‡wÌf& ÁÂÃ÷ ¾†õ LRÁ ÷ îúÿ÷ t÷ †õ ûL45œ42p$2r"L³ª4}Vɪ°h^C©z€|Â÷ ²#"²-$‚4 ÷ ž%W-2 õ@úLõ‹õ°ýLõµ4 õ�ýL4 ÷ fæw†Æe ±‡–5ƒ‚�€ œ«f ©À}Ü j@ª¿.pø÷ úÿ†"`úÁ ñ W, ÷ 5 L±‡ W, ñ ÂU÷ †Á fLfN ÷ †÷ µNµL±‡ 9©(Y¬T}Hœ«\œ«bœ«ZX¸UNÀEÂz�uüdNÀE¯”DD©ØZ@C©z@³ª4}@ɪ°h@�«@x@¤«V@@ªS~@9©@œ«ZX@ �uüd À(«E$h ¯” �uüd€æ û*I Ý)@`ô¥Àe�(ÁÁ @ 9ƒ Á ÷ úÿ †È%`ú÷ ï5Îú÷ Î û÷ ‡ÀetÎûÈ 4"4$4 &<9©L³ª4}\ɪ°hdC©zH|45"45 4üÿ Á ÷ ÅeL�€w ÷ ΋wÎbw "œ«ZX.D©ØZ6¤«V>�«@xF@ªS~ UPÀÕB�uœwPÀÕ¯”D �uœw –¬€"hS«€"h¯” �uœw€õµ Ã0üõ‹W­:ôÅ@AÁe,œ(Ãà Ñ* ÉEðQ¤‘   —  Q¤QQ ÃàùœÂÅðÿ— *A-<|‚A-<¡‡õL±‡èUPÀÕr�u`†PÀÕ¯”D¹©@X@ɪ°h@�«@x@j¬˜@S«€"@̪a @œ«X@ �u`† U«‚h¯” �u`†€Â÷ †wÈõ¥4 4 ÷ W‡÷ mÑ•õ¥0Q�<Q�=õ¥0 Ü)CmÑ�ÃÑ�ÃCíB"à BŠ÷  S«€"(¹©@X2ɪ°h~̪a €|C<B>÷ 4 ñÕ ÷ ‡õ¥ 4 4 ôe t õLôÅ@uLuNw4 4 5 5 5 5 &5 (4 ̪a  œ«X\�«@x ø÷ àj¬˜œUQÀ¼b•u¡dQÀ¼¯”Dɪ°h@�«@x@¬€"@̪a @œ«X@ •u¡d Ú¬h¯” •u¡d€Ã€þ&]]Zõ0úNñµ SÂ÷ N‡÷ mÑ•W­0Q�<Q�=õ¥0 Ü)CmÑ�ÃÑ�ÃCíB"Á`÷ ,¬€"6ɪ°hb|B>C<÷ ñÕ 4 5 5 5 ÷ ‡õLuLuNwõL5 5 5 ï̪a ̪a 6œ«XN�«@xôUSÀÅÎz©u[MSÀÅί”D5¬ ™@ © }@œ«@C©z@³ª4}@ɪØh@Y¬T}@9©@œ«ZX@Óªz@ ©u[M ~ô¨8^hv© h¯” ©u[M€& &2 ‡õÀÿLwFõ‹8W­8 �Ü€ € € ` ÂÃ÷ úÿ†÷ öñµ Â÷ †wø€Ít÷ ÷ †õ ûF9©bœ«tɪØhxC©z€|LdÃެÂe@à ùõ ûLVÃõ 85‚¦¦�œN`v ¶,Ž,f‡× õ‹-µ6µ8C µ.µ0µ2µ€ø4ƒ r`r ²²ÈñÕ ÷ ÷ Â÷ †Á "`ú&&÷ °ˆ fLfN÷ °ˆ– �À&&Á &(ɪØh,Óªz4œ«Jœ«ZXbœ«ZXp5¬ ™€tt  ÷ 4 °ˆ&V ‡—, —,–%—,—,² ²² ²"2 2 ² ²2 2 w¸þö œ«€ðQñÅ Â÷ †w ÿ ÁÂÃ÷ úÿ†÷ �‡ðvt +ñÅ fœ 1œ ñÅ@ Î5@ñÕ@ ÎÅ@ð5@ ÎÕ@œ«09©€l°• f1°N1°€ÀEÿwnýæ¦ææ& & ƒ$ .ƒœà à æ€œàþ‚Îà& Ãö¶ ¶ö•f5¬ ™€è ÷ †ÆewPþ‚ ƒ6в"² ²²²*²(–%æó $ó"óe$s "3 &ƒwbý "`ú && ÷ ˆ° "`ú © }rœ«d úÿ÷ ÷ ¡‡±‡Y¬T}³ª4}°USÀÅÎBªuœ'SÀÅί”DɪØh@ ªu00&ß�TADATADATADATADATADATADATADATADATAœ' 6©`Th¯” ªuœ':&�÷ B‚   ý°•p ð°Šð•ÿp�- ‡ɪØh*UOÀ…ÈRªufsOÀ…ȯ”DɪØh@Ý©[}@̪a @ ªufs H"©ðsh¯” ªufs€÷   Ã÷ úÿ†‡tF÷ Èð6ô‹C‚Áe÷ è#‡õµ ,7��lÑ• �Ñ•Ãõµ,Â2BaÂ.Ý©[}(ɪØh€|Ba÷ ‚r²àõµ,õµ,�ÁeÑ•��Ée€ÁeƒCm:öõµ ,õµ,ö‚¶̪a €ø¶`󵡇ö ‡¡‡ö�œÁEðÿÁ¥� ‚m �ÜÁ�Òöev`‚ÁÁe÷ Ø5‡æÁÁeÂ.BaÃ÷ ƒ‚z̪a €tÆå�óÕ²�$Ã÷ �€B‚m`ƒà÷ ‚Ã÷ Æep0à%�AbÂÂe‘�æÃ÷ €Èe¶í € ̪a :̪a D̪a l̪a \ð�B‚mƒíCí:÷ °íƒ¶ 66`wÚþB@‚œ ‡Àe æ¤Î ü ‡̪a fUzÀÅçJªuLyzÀÅ篔D©òƒ@̪a @ ªuLy ¶#©àeh¯” ªuLy€ƒ€W­8õµ,W­8ðµ ðÅ óÕ 33 s.s0 €ÁeW­8õµ ,B:‚m`ƒ€| ððe÷ wÔW­8=õµ,9Â2Ba�l—-&ѕѕ�����Q�Q�CB÷ p0àõµ,õµ̪a l̪a €ø0,1÷ €°m)õµ, õµ0,`Â.Ba—-»÷ B:‚mƒ ÷ €p0àõðþL±‡ƒöölÁ©òƒF©òƒV̪a FtÁev †ñœ³ŠÁeœÂEðÿÂ¥ @ÔÀ@ÔÀ`㡇pUPÀÕ:ªu¤yPÀÕ¯”D ªu¤y #© sh¯” ªu¤y 4 ±‡°UNÀEÂJ«ukMNÀE¯”Dô¨£s@D©Z@ «ukM (D©íbh¯” «ukM,Åà   ÝmÀ@÷ ðw$ô¨£s*D©ZÚUPÀ…Èz«u`PÀ…ȯ”Dô¨Œ@ô¨£s@;©OM@;©EM@œ«@�«@x@ô¨" @9©@9©ë3@ «u` È;©æ_hG©­\h¯” «u`€æ÷ à ÷ †– w÷ ?‡  ÁÜÁlÀ@ ÷ ‡4Àœ(ÀÀ A�N †�&f÷ – 6­ ‡t�–%õwŽ,9©ë3ô¨" ;©OM"ô¨" @ô¨£s`ô¨Œ|�«@xP|÷ à    Ã÷ ‡úÿÂ÷   ÁÜÁlÀ@÷ ƒõ þw 9©ë39©&œ«Bô¨£sN;©EMNUNÀEÂ2«uqNÀE¯”D «uq ¯”NUNÀEÂ2«u|qNÀE¯”D «u|q ¯”UOÀÅÎz¬u%!OÀÅί”DŠª0 @ëô@@ª¿.@œ«w@s©`"@ɪ°h@�«@x@©¨%@ ¬u%!  e©-Ph¯” ¬u%!€÷ n‡& Ž €÷ ‡æw‡õ5 A@ñµõ•,– Þ †– Kâ– ÷ ÷ C.`Âõ‹,ÂU@‹ÐñÕ ”ÂEüÿÂeƒ 1s©`"Šª0 ëô @ª¿.NŠª0 Vɪ°h€|õ”>& & €Д ý‚€1 ± #µ.504 Â÷ ‡@0A.B�>Ã÷ ‡@m:ÈÕñÕ 554 Â÷ ñ‡õ 6œ«wL©¨%zœ«wøõ4Šw�«@x UOÀÕj¬u;;OÀÕ¯”Dô¨£s@c©%@œ«@9©@9©ë3@ ¬u;; Pi©í{hi©|h¯” ¬u;;T  ÁÜÁlÀ@÷ ÷ à    Ã÷ ‡úÿÂ÷ Ü(Ãà w ô¨£s"9©ë349©Bœ«Rc©%šUNÀEÛB¬uœwNÀEÛ¯”D «ƒK@ ¬uœw  s©`"h¯” ¬uœw$5 5 5 ,õ•25 4ôÅ\w" «ƒK¦UOÀEÂz®ut:OÀE¯”Dê©2g@©™w@@ª¿.@©¡E@œ«w@Þ© @�«@x@©qq@´©œw@9©ë3@ ®ut: |¹©­\h¯” ®ut:€÷ +‡õ¥æwôÕõ¥æwæwôÅ ‡ôÕ@÷ õ55w÷ à  ÷ 4 wk´©œw©™w @ª¿.,©¡E& 0@ª¿.6©qq0 :@ª¿.Lê©2gbÞ© f9©ë3vœ«w~�«@xšUOÀ…áz®u2XOÀ…ᯔDòªàG@òªÿG@œ«w@ɪ°h@Ú©ðG@¼«8@Ý©[}@ ®u2X €C©WThl¾©ÓhC©{Qhr ¯” ®u2X€5¬ 8†æ4 5Š95œ -÷ õµ9\ƒ÷ †À I'ð‹ QÎ5€KA@ñµõµ!Af�9f:õ00&ç\ 1gÿÿ:÷ õµ9 µ:µ•9  ¼«8.òªàGh¼«8€|÷ !‡gõµ9$5 :÷ õµ9ðµ åf&&  ÷ ƒ�‚†–5KÀƒ÷ ņ÷–%õÕ!*5¬ 86¬ Ì5Ì5œ«w¼«8@œ«wVòªÿG€ø A@ñ‹ tt ÷ †õÕB9õŠ-ƒ÷ t‡ ÷ t ‡÷ 5 :wºþ÷ "`ú4 ±– ‡ô Ì5 "Ú©ðG6Ý©[}Fœ«wTɪ°hdɪ°htõ5‡°UOÀ…ár®uB@‚œ ÷ úÿ†‡t÷ 5 :÷ ¡‡Ý©[}.ɪ°h6¼«8tUPÀ…Èz®u=rPÀ…ȯ”DŠª0 @C©+d@5¬ ™@œ«w@ɪ°h@©,`@Z¬àG@ëKq@¾©Ó@©ðs@9©ë3@ ®u=r $©¡Eh¯” ®u=r€u>Ã@ü @Ý÷ h‡Ã0ü AÝp  `‚ð‹ Á ZÜ u<U÷ R‡õ•84  ÷ 2‡ ÷ (‡5 : ÷ ÷ 5Š8÷ %ÃU Šª0 BC©+dZœ«wb©,`r9©ë3€|€B�B@‚œ ÂEÿµ<u>÷ B@†– õ‹-ò‹ "`ú÷ †wZ‡Ã@úõ‹- õµ9õµ 9õ5 w&õ5 ÷ $¾©ÓBZ¬àG€ø÷ ÃU€÷ tÿÃ@úõµ9êõµ9íA@B:`ñ‹ ʵ÷ ›5 <e& &ƒ”µ”2õÃEüÿÂ`Âe ƒÔÃÔæÎ`& Nœ ‚eŽ !†ƒ”æëKq9©ë3>ëKq€t´”& & ÃEüÿÃe�‘”à ý´´Öµ$ u .u0 ¶ Ý‚‚åµ:– w¬þ¦t÷ ÷ ‚†4 tÈ%Pþ÷ ¶ ¿ÆeX9©ë3\©ðsvɪ°h8ð–%µ<4  ÷ ‡÷ ÀÈfLV ‡œ«w ɪ°h&5¬ ™ÎUPÀÕr®uçrPÀÕ¯”D5¬ ™@ã©,#@œ«w@œ«@ɪ°h@œ«ZX@Ý©[}@ ®uçr ð©,`h¯” ®uçr€æ&D4 4 Î Bm@‚’.C@óµ#ñµ€ ÷ U‡òµEóÅ;C@óµ ÀÈ@úðÐü<ÁÀ’ <ã©,#^5¬ ™x|ƒ÷ 4úÿ-‡÷ ðµ ñÕ t4 ñÅ Î ö ÷ ‡ ÷ ‡³ ³ ÷ »†&&÷ °ˆ–5fLV ‡& Ý©[}ɪ°h>œ«wFã©,#Zœ«fœ«ZX(UNÀ…áj®uVsNÀ…ᯔDŠª0 @5¬ ™@œ«w@ɪ°h@©ðs@9©ë3@ ®uVs h©qqh¯” ®uVsl@ A B4tÂEÿ´@P ÷ 4  ÷ ‡÷ ÷ ‡÷ ÀÈ€ú5 <fLV ‡&*Šª0 :œ«w@9©ë3D©ðsNɪ°hT5¬ ™USÀÕj®ufsSÀÕ¯”DŠª0 @5¬ ™@œ«w@ɪ°h@œ«ZX@©¨%@ ®ufs &©ðsh¯” ®ufs€f@& ææ ÷ �ÂEÿƒ÷ `‡õµ9J@m:ȵæPþD& & ‚’ÁEüÿÁeÃeÒ”Á ý‚ƒȵ ö ô ´ &7Šª0 *©¨%€|4 ñµ væ¦&œÂñµ  ÷ ‡‚�€—-ö ¯@ÀeLæúÀ4  ÷ ˆ0 ÀÆe0œ«wT5¬ ™jœ«wt5¬ ™2ø�&&÷ °ˆµ@È ÷ fLV ‡œ«ZX(ɪ°hâUNÀÅÎR®u}sNÀÅί”DŠª0 @5¬ ™@O«•y@ ®u}s L©™wh¯” ®u}sPôÅ@�4�÷ †ÀÈ@ü0 ±‡5œ 354444�wŠª0 5¬ ™NO«•y>UPÀ…áz¯u`"PÀ…ᯔDì©Kq@©™w@@ª¿.@O«™w@©¡E@œ«w@³ª4}@�«@x@©qq@ë©`"@9©ë3@ "¯u`" ÒÝ©-‚hÞ© h\¯” ¯u`"€÷ +‡õ‹ôµ@æw &4æw´ õ¥æwæw†554Š5 5 5 õ%@ú õ%Ðüdë©`"©™w @ª¿..O«™w( 2@ª¿.D©¡E> H@ª¿.N©qqH R@ª¿.Z|õ‹õ°ý æw÷ à õ5@4  ÷ W-`úô ÷ ôÅP4 w1ì©KqŠ @ª¿.9©ë38œ«wJ³ª4}X�«@xw¦UNÀ…áz¯u¡ENÀ…ᯔD5¬ ™@œ«@C©z@³ª4}@ɪ°h@Y¬T}@9©00&ï�TADATADATADATADATADATADATADATADATA@œ«ZX@ ¯u¡E Àã©,#h¯” ¯u¡E€æ Âæ¦€�ƒ÷ úÿ †"`úÁ ÷ ÷ é–%+–%0 ÷ ÷ †ÃÃÀÈ ûC@ò¬ %¦¦‚ & 9©4Y¬T}:³ª4}Jɪ°hNC©zT5¬ ™H|÷ ‚ƒ‡ È ûºÁ "`ú&&÷ °ˆ–%`×– fLV ‡œ«.œ«ZX†UNÀ…áJ¯usNÀ…ᯔDÞª¡E@̪a @ ¯us îê©2gh¯” ¯us€Bm:@@4œ ƒ”ÃEüÿÃe¦”´”4 Áe÷ @œÀEðÿCÀ% ƒÔÃÔõ>æ@t<ôµ@ ôµ€ `÷ ƒ0̪a |Þª¡Ev|'t<÷ ƒ4œ  t t ´“ t. t0 t�2444�5 5 55ŠB>– ‡Þª¡E UNÀ…áB¯uœwNÀ…ᯔD ¯uœw 0ë©`"h´©œwh¯” ¯uœw4à úõ¥õ5õ5ôÅ 5Š9‡õ±‡6UOÀEÂZ¯uÕOÀE¯”Dê©2g@œ«w@ɪ°h@̪a @ ¯uÕ ˆì©Kqh¯” ¯uÕ€ôÅPõ÷ ÷ õ5@ñµñµ=ÿñµ€ ÷ (4  ÷ ñµ µõ÷ ‡A@À ƒõõÐùɪ°hê©2gLœ«w|uõw̪a êU{ÀÕz±u¡E{ÀÕ¯”D3ª¨�@ô¨8^@©`T@@ª¿.@œ«w@œ«@‹ªàe@ɪ°h@ɪØh@© @C©WT@Þª¡E@bŸ«à`@Ý©[}@̪a @ ±u¡E º@ªWh.©€h®@ªYhŒ@ª—`hÞ3ª(#h «xhȯ” ±u¡E€A65 6 ÷ ‡÷ õµ,õL‡Æå6æwõµ,ÂwBæw€œÀEÿõ•8÷ ‡÷ @@8A6Ã÷ Bœ«ɪ°h83ª¨�2 <@ª¿.Pô¨8^J T@ª¿.j© €|†w úÿt÷ 6 €œÀÅÿ÷ €ƒ ðµ ðÅ óÕ 33 p6p8 æw4 Â÷ ÌY‡€C+Ý©[}ɪØh*©`Tb‹ªàeØ f@ª¿.©€ø@ó‹ ¬  ÷ tt ðµ 0æw€œÀEÿõ•8÷ 1‡÷ h@8A6Ã÷ &‡úÿt÷ 6€œÀEÿ1C©WT0ô¨8^" 4@ª¿.J© `Ý©[}nɪØh€t÷ æw‡56Â4 ñÕ ÷ †5 6Æe&V ‡B@‚œÂ ‡ñÕ ÷ ‡Àò‹À ò‹À ‡õµ,#ƒÃåÑ�+©`T Ÿ«à`x @ª¿.,œ«wTœ«w€ð¦‚ ƒ÷ à Â`õµ ,÷ C@à ÃEÿ÷ ‚‡õµ,õµ,¶-B‚ ‚mf� �m Cí:à ƒí÷ p̪a *Þª¡E<̪a z̪a Rl0à�ƒÃåÑ�ÃeBÂe.÷ ‡õµ,õµ,ƒÃåÑ�ÃeBÂe2÷ ÷ ‡ ̪a J̪a NÞª¡E²UOÀÅçb±u±HOÀÅ篔D@ªW@@ªY@È«Lq@@ª—`@ «x@ ±u±H ð3ª¨�h¯” ±u±H€B@�œ ÁEÿv Â.Ba÷ õµ,`� �m6Â2Ba÷ õµ,õµ,`� �m6‚ Bm:€”Àe6õµ,�m�íÁ  «x< «xx| C@õ5œ ¶ € ì6, ƒ‡� ƒCí:B`ll°0à÷ € ÷ ÷ ÷ ‡õ•,‡ZÈ«Lqb@ª—`f@ªYj@ªWŠUOÀÅÎj±uiwOÀÅί”D©G@ɪ°h@#© s@©Š@•«Ò@ ±uiw ²9©àMh(;ªhh¯” ±uiw€ö6 6 A@õ5CCœÃà öAœ ÁEÿv÷ †õÐûL±‡66 6l 6 v66 6 6 u-:65,Bɪ°h€|:ƒõµ9õµ 95:u:6v6õµ!õ,÷ t÷ €ðµ õµ!õµ!õµ 9 A@ñµõÕ ,±‡�÷ >•«Ò€øR†‡�Am6u-:6÷ ¶÷ õ•,¡‡ô‹ö ô‹öö‡f6,‚�ìN ƒ&0¬‚ð‹ ÷ ©Š(©GBt†0Š–%õÕ,,±‡€– ¡B:‚m¶ †õÕ,,õÕ ,– ±‡#© s&U|À…Èz±u,x|À…ȯ”Dô¨8^@È«Lq@©`T@@ª¿.@œ«w@œ«@;ªh@Ë«àe@ɪØh@© @Þª¡E@ëKq@RÝ©[}@̪a @ ±u,x J©GhŠ©¤’h¾;ªà8h©Šh •«Òhί” ±u,x€5Š,Æå"æw‡÷ ¤5 6wæw€ õ•8œ÷ 6‡B@‚œ @0A.Ã÷ '‡tF÷ 6€ œÀÅÿ÷ B;ªh @ª¿.(ô¨8^" ,@ª¿.>© \Ý©[}lɪØh€|æw€÷ è€ ð‹÷ Ú&÷ †– 56õ•,D€õ:l¦Bm:Ž $† ʵƒ’ÃEüÿÃeÂ`ÂeA@Cœ ÃEÿ00&÷\ 1g©`TË«àe~  @ª¿.€øA� m÷  ÷ €Bm:Ú– €p.p0 u6ñÕ Â÷ Æe"&&õµ,A65 6 ÷ 4 4 °ˆ&V ̪a ëKqJœ«wlœ«€t‡&ð•ÿÿð•õ:66`Âe¶  †2œ°Š ÷ €B:`ð€‡ñÕ Â÷ ‡u-:6&@@ö ðµö>ëKqZœ«w€ð€¶m¶m¶¶ ‡€ ɵC’ÃÅüÿÃeÃeC` ÂÔÂÂÔÂ6 ví: ‚mÃå“�“�ÂlB‚m°0àƒ ÷ ‚|È«Lq€lÂå‘��Âaƒà ÷ ‡ƒu-:6 ö¶m¶mÁÁ`B‚mæ³óàƒCí:¶-÷ ƒu-:6ѕќ&̪a hÈ«Lqfè@@ðµñ•þÿÑ•ŠŠŠ€Ñ•Ñœ³Š‚‚m‚ ‘�‘�÷ ‚Âå‘��Âaƒà ÷ ‡DÞª¡Eb̪a ¤UOÀÕR±uãƒOÀÕ¯”Dɪ°h@Þª¡E@̪a @ ±uムÞ=ªxh¯” ±uダ6 ô‹œÁEðÿW ööö6 @ÀeAœÁÅðÿW Àe6@@õ5œÁÁ v÷ ~ɪ°h€|66 6 6 6 6 66`C:`õµ!$õµ 9 õµ9˵Ãe‚œÂEðÿ—  ÂÔÂÂÔ‚Â`àµ:ƒ€øÃe€v:66lö ‡‡ö˵˵˵öƒm¶mÛœÂÅðÿ—  ‚m �ÜÁ�Òöe€t€@m:€í@àfæÀ ‚A� mf>õ>µm >÷ µ>ƒ�v`˵r˵@oÁÁeœÂÅðÿËÕ@@@ðµ%— !œœ8Þª¡E€ðl‚mvöàæ€`ƒà÷ ‚€r²à€ì19æ—  CÔÃCÔÃÃeÃÃe�uœ,BÂ`€æ`ƒà(̪a vl÷ Ñ•Q�,5Š,€6 ‚r²àƒÂ‚íµ :†5à:B:‚m ‡Âe ÀÀe¤ ¤¤¤öe ¶m ƒmwþ̪a ÜUOÀÅÎR±uéƒOÀÅί”DÈ«Lq@#© s@̪a @ ±uéƒ =ªhh¯” ±u郀€ö 9—- �Am:ÁewB,�Am:uœ- CÜÃCÜõ ÁeÁewÃeÃe€BÂ`öà `ƒà÷ p0àvr̪a €|6,‚ƒìö ‚wàðµ õµ!õµ! õµ 9B@òµ 0¬‚ð‹÷ †wȃ‚‚m€°0à� �mZ#© s€øÁ �ƒ ƒm÷ A:`Ñ•ô‹ÂeQ�-� œœ°ŠÂe Ã÷ ‚œÂÅðÿ— Q�Q�BC÷ È«LqT̪a z̪a €t‡õµ 9��m�m �mv †õ•8õ•$,%� �mÁe‚ ‚mÂå õ•8õ•,v †õ•8õ• ,õ•8õ•,ôµ.ðõµ 9õÕ, õµ ,õ•8õÕ,‡ŒUNÀ…È:³uNqNÀ…ȯ”D ³uNq $Šª0 h¯” ³uNq(&°£ 5@¡±õ– ‡\UyÀ…Èb³uLyyÀ…ȯ”D@ªW@@ªY@È«Lq@@ª—`@̪a @ ³uLy *‹ªàeh¯” ³uLy€A:Bõµ,B‚ ‚m‚m¶ ,†�õµ, õµ,B‚ ‚m‚m¶ †�B‚ ‚m‚m¶ †õÕ@,�õÅÀ, õÕÀ,õÕ€€|,v€ Cí:B:`õµ@,õµ€, ‚ ‚m‚mà ƒíƒí�Áe°0à÷ ‚r²àõµ€,?õµ@,;ƒ s:€ R̪a €øõµ,ƒ ƒmƒíƒmõµ, õµ,ƒ ƒmƒmÂ``�ÁàÃå°0à÷ €÷ ÷ ÷ wrõµ@,9õµ€,5€ TÈ«Lq\@ª—``@ªYd@ªW€t`õµ,‚ ‚m‚í‚mõµ, õµ,‚ ‚m‚mCí:`°0à¶÷ ÷ ÷ ÷ wø€ A:`‚Âeõµ,VÈ«LqZ@ª—`^@ªYb@ªW€ð÷ € p0à€Áeƒƒíà B‚ ‚m�m� Ãåƒíà ÷ p0àlB‚m‚íÃå°0à÷ �@ª—`J̪a zÈ«Lq€lÁe÷ õµ@,õµ€, � Al÷ € p0àÃmƒm€lBÂ`Ãå°0à÷ ÷ € ðµ €ƒ @ªW&@ªYbÈ«Lqf@ªYFè`ÂàA� m÷ u6.u8056õ• ,€ ‡B@‚œÂ ‡̪a ÊURÀEÂJµu;;RÀE¯”D̪a @ µu;; HÈ«LqhÞª¡Eh¯” µu;;Là ‡b˜Ã ý‡@@& °£ †Ãe$ƒcÃ’ÃEÿà Âe‚c‚c‚Bm>÷ Ž è– ‡B̪a ÄURÀÕzµu,FRÀÕ¯”Dô¨8^@ã©,#@©`T@@ª¿.@œ«w@œ«@ɪØh@© @Óªz@Ý©[}@œ«ZX@̪a @" µu,F Óªø8h¯” µu,F€C@óµf44 4 00&ÿ�TADATADATADATADATADATADATADATADATAÃ÷ †wŠt&¦òµµ 2µ4w@C@5Š-ó¬æwC@ÀœÀEÿõ•8õ•-÷ %$ã©,#^ô¨8^X b@ª¿.~© €|C‡u6.u80æwC@ÀœÀEÿõ•8µŠ-÷ +‡C@ó¬ ÷ L"‡u.6u08æwC@ÀœÀEÿf8õ•85Š-÷ µ8‡<ô¨8^Š @ª¿.2© Vô¨8^Ì Z@ª¿.x© €øõ•-÷ †w¼rC@œÂ @8A6Ã÷ b‡÷ Þ& ÷ €p�- C@ó¬W­- ðœðÕ u62u84ðœðÕ0Ý©[}>©`T€t p6p8 Ãõ‹1à õ‹0à ÁeÂÂå‘�Â.Ba÷ C@œ ŠÂ%ÿÂEfÜ ‘�Êýp°åÂ5áÅ€‚ŠÉ•œ÷ ö‡C<̪a €ð@œ @0A.Ã÷ \‡÷ ú&C@Àœ÷ €0Š ðÕ p.p0 ð÷ ¢A‡‚r.Tr0V²Š A@q¬²Š r2 rÝ©[}0©`T€l4òÅ€÷ ñÕ Â÷ †÷ ` C@s2s4óÅ¡–5µ4ôô‡fLfN ÷ µNµL±çñÕÓªz&œ«lœ«4è Â÷ ‡&&÷ °ˆ±‡úÿt÷ ‡œ«wœ«ZX0ɪØhÀUOÀ¼R¶uLOÀ¼¯”DɪØh@Ý©[}@ ¶uL 0òªàGhòªÿGh¯” ¶uL4ðµ  ‚ ÷ t†±‡÷ ‡"Ý©[}0ɪØhjUNÀEÂz·uüdNÀE¯”Dô¨©s@C©z@³ª4}@ɪ°h@¤«V@@ªS~@9©@œ«ZX@ ·uüd n(«m$h¯” ·uüd€ôµ´Š4  æ& ÂÀ� À –5ô  ÷ Îbw÷ úÿ†È%`ú÷ à5Âúµ÷ Îpè÷  û÷ ò‡,<¤«VD@ªS~H9©X³ª4}jœ«ZXtɪ°h|C©z€|÷ €m66Ó4ó‹ ô\ÂûÀjÜÀ%Ù‡ô¥! ÀŠÀ Àå ûíˇ À<÷ AF þÁ‡ô¬ ƒôœ ô‹óµɪ°hZô¨©szø´ŠÐÂ@ÿ­(«‡­(¨‡Ð ÂРýÀeÝÿÂðýÐ¥›‡È‹ˆŠÂ ùÈ¥“‡Àe œíÿÃŠÃ à †ÈB �œîÿõN,v, ‹÷ wèþtœ«ZX UOÀ¼z¸u<OÀ¼¯”DŠª0 @œ«w@ɪ°h@l©,x@ëKq@E©¶H@©ðs@̪a @ ¸u< ´I«„–h¯” ¸u<€4  ÷ u@.õ•2& Ž €÷ ‡5 . p-<‡÷ õµ 9÷ ë– A4Á 1-1- 5 4 ÷ Ã÷ ‡÷ &œ«w(Šª0 5 :÷ ÷ #4  ÷ ‡  �÷ ÷ †È%`ú C@ó‹ DÁ ÷ ÷ •wC@5 <u�3<u4>õµ9#B,ɪ°h¼«8$œ«w69©ë3:©¨%TY¬T}Z³ª4}€ø:`�”‚ ó‹ Áµ÷ ŠifÁEüÿÁeÖµB`Âe&€÷ €õµ 9T4  ÷ H‡C@ó‹ ÷ ÷ A†È%`úÈ%Pþ8õ•8ÃU€÷ B@†– õ‹-ò‹ "`ú÷ Ȇw°‡5 <Ãpùõ‹- œ«w©,`09©ë3L¾©ÓjZ¬àG€ð2A@B:`ðýõµ9'ñ‹ )ô‹õµ9�”‚ ÷ vôµ@ ÷ ÷ hÿ5 <ðýõµ9B:`ʵîw"w(÷ œ7bô‹õµDëKqpëKq€l9Ž †µ6�”÷ t-<µ <òôµ@õ <B6ô‹õÿÿ<Ž !†µ <÷ H¦4÷ f<÷ µ<‚>†4 tÈ%Pþ–%Z9©ë3b©ðs€èT÷ Ý‚€àµ:÷ 5Š85 <u�3<u4>ÃU€÷ †"`ú8÷ ÷ ÷ ßðýõµ97zõÿÿ<«4 –%u .u&ɪ°h9©ë34¾©ÓFY¬T}L³ª4}Tɪ°h€d0fL ÷ ƒ�õL÷ ÀÈ0 fLV ‡ÁEüÿÁe¦”& & ƒ“”Á ý�ƒ´¥ô t ‡A@B:‚cƒ”µ”2õÃEüÿœ«wɪ°h$5¬ ™LàÂ`Âe ƒÔÃÔæÎ`& Nœ ‚eHƒ”æ´”& & ÃEüÿÃe�‘”à ý´´Öµ$‡´UOÀÅçZ¸uœwOÀÅ篔DŠª0 @»«+d@Þª¡E@E©ÈH@ ¸uœw S«`"h¯” ¸uœw€00&\ 1gôµ@ôÅôÅDu>u<ÃàùœÂÅðÿ— *A-<[‚A-<UôÕ ÷  ÜÁÁ ÁåÂ¥ÁåA-<@‚p-<\Šª0 €|<‡÷ 9‡õ¥ ôµ ÷ ÃÀùõµ9&ô ôÕ÷ ôÅ5Š95 44 4 4 ôµ4 4Š4 ‡ »«+d&E©ÈHHÞª¡E øõ±‡úUSÀEÛz¸u`†SÀEÛ¯”DŠª0 @5¬ ™@¬À@@ª¿.@I«„–@œ«w@œ«@À©h @ɪ°h@�«@x@Z¬àG@C©WT@b;ªà8@Óªø8@ëKq@=ªÐ@¾©Ó@E©¶H@S«`"@C©{Q@ ¸u`† zU«-‚h¯” ¸u`†€5 4÷ †w˜Á ÷ Ât  ÷ %‡æw †,Ðüæwò†÷ š÷ 4 ðµ õµ09t æw†wf_ S«`"C©WT,œ«w2À©h , 6@ª¿.DÓªø8> H@ª¿.TC©{Qr=ªÐl v@ª¿.©€|65 6÷ ô%ÿÿ µ6 õµ,÷   æw†5ôÕ@µ4@@œ €Š÷ /‡p-<*‡÷ õµ 9$æw †,ÐüH C©WT*C©WT4¬Àª 8@ª¿.VŠª0 dE©¶HpÀ©h æ t@ª¿.€øæwò†6÷ àæw/‡õµ, æw†5ôÕ@É5 5 55Šõ õôµõôµ@õ ÃMÓªø8ø  @ª¿.;ªà8 @ª¿.(¬À ,@ª¿.~5¬ ™€tÃÀ55æwuLuN5 5 5 ôÅ4Š ÷ A4 ÷ õ  ÷  tôÅ@4Šwu:6õµ1I«„–„ @ª¿.Jœ«wTC©WTbœ«v�«@x€ð9Aõµ 9=A@ñµC:`˵1ÃÃÀÈàý– A@ñ‹ ¯ŸõÕ!ôÕÃ÷ Ã÷ †È%`úç&4 ÷ �t݇÷ ,5¬ ™XëKq`¾©ÓtZ¬àGlëõµ9ã‡ɪ°hšUOÀ…ázºu,`OÀ…ᯔDã©,#@œ«w@œ«@ɪ°h@ «x@œ«ZX@Óªz@̪a @ ºu,` ‚Ÿ«à`h¯” ºu,`€€°Š ðÕ p6p8 ÁeÂe ÷ ÃåÑ�÷ ‚ C@Ü ÃEÿæ‚lÂà÷ BÂe.÷ ÃåÑ�÷ ƒ‚‚ m . «x<̪a X̪a b «xp̪a €|÷ €p0à4 Â&œ ÷ Ô† wœõ•,Ã÷ † r6 r8²• ÷ AFñÕ Â÷ †"`ú&&÷ ° ̪a >ã©,#XÓªzjœ«|œ«ZX€øˆ4 ÂfLfN÷ bµNµL5 6±‡C@s6s8÷ ðÅ ¡‡5 64 fLfNÁ  ÷ µNµLõ•,±Fɪ°hnœ«wt‡ñÕ ÷ ‡œ«w*UNÀÅÎRºuãeNÀÅί”DŠª0 @ɪ°h@ëKq@ ºuãe Ž «ƒKh¯” ºuãe€5 ô‹=7ñµ 3 ÷ ÷ -‡õ:p-:&†÷ B6`�”ÁEüÿÁe‚ ¦”& & ƒ“”Á ý�ƒ´¥ô t u6:u6.¡‡ Šª0 $ɪ°h8ëKq|Öõ0úõ€þ±‡NUNÀEÂ2ºuçeNÀE¯”D ºuçe ¯”€UwÀÅçZ»u[wÀÅ篔DE©ÉH@E©ÈH@E©ÆH@E©ÇH@ »u[ Ƽ«8h¯” »u[€5Š9&& &lõ :€õU€,Ãõ:`Î ‡õÕ9w‚Cm:€Î ‡õÕ"9whõ:5à:õ <ð‹ s­>5Š9wBõÕ9€|öœÂEüÿð‹ ‚ Âe¶`ð‹ D˵˵˵Ãeƒmõ <»¾B@ò‹ ,�œÁÅøÿW � ‚m �ÜÁ€ø�Òöe‚mv`õ <Nôµ€÷ €÷ 8A@Aœ ÁEÿð‹ ‚mv` ˵Â’ÂÅüÿÂe¶öeÂ`Âef �ÔÁ�Ô*E©ÉH2E©ÇHVtÁv`�õ <ôµ€÷ €÷ õµ9 õ5€,ƒmw†þ€ÆeõE€,‡ E©ÈH(E©ÆHÆUOÀEÂr»ulEOÀE¯”DŠª0 @œ«w@ɪ°h@l©,x@Þª¡E@E©¶H@Ý©[}@ »ulE âëôh¯” »ulE€÷ C.`Ãe¦œÎEðÿ—¥µ<õ”<õ”=õ>A@q-<G‡÷ õµ 9A¡Þ A� mf÷ µ>5 <5œ <ôÅ ɪ°hJE©¶HjÞª¡Ej|4 u4Â÷ †5 4÷ ÷ œ C45 4ÀÁ Ã÷ ‡úÿt÷ ‡Á ÷ ±‡&œ«w"l©,x(Šª0 HÝ©[}Vɪ°hdɪ°höUNÀÕ:»u•GNÀÕ¯”D »u•G ˆÃ«Kqh¯” »u•G€æC:õ6`”ƒ A@µÂEüÿÂeñ‹ Î ñÕ A@ Π“Šˊפÿÿ ôƒ`ñ‹ ¦œÎEðÿ—¥ƒl ÂÔÂÂÔÂ|ƒ`àõ:– ‡èUvÀEÂb»uLyvÀE¯”D©G@ɪØh@©Š@•«Ò@̪a @ »uLy Ë«àeh¯” »uLy00&�TADATADATADATADATADATADATADATADATA€tF÷ 6÷ €ƒðµ ðÅ óÕ 33 õµ ,B:‚mÁÁ`6 ví: p:ƒ ÷ €p0àõµɪØh•«Òp̪a €| ,1ÁÁe¶÷ €B:`Cí:p:à €Âe&@@ðµʵõÕ,€÷ €p0àõµ ,u-6: �©G^̪a "øAm:¶÷ �Am6÷ ‡©G©Š˜UOÀ¼z½uø8OÀ¼¯”D5¬ ™@@ª¿.@œ«w@œ«@©,`@3ª(#@Z¬àG@¾©Ó@ ½uø8 ¦¬Àh¯” ½uø8€Ä A@AæÃ÷ ‡µ“85 :Ã÷ †"`ú÷ ì†õµ9õpùL5 N æw‡õµ,Ž Ö– ÃÃÀ&&A1©,`0¾©Ó‚�`f� @ÔfÀ 5÷ 6Šª0 "=ªÐ˜ &@ª¿.@¬À¶ D@ª¿.€øL‡ôÕp-<*‡÷ õµ 9$æw †,Ðüæwò†0÷ Äæw)‡õµ, æw†5ôÕ@Åõ õôµjŠª0 E©¶H$À©h  (@ª¿.6Óªø8( :@ª¿.F;ªà88 J@ª¿.X¬ÀJ \@ª¿.€tõôµ@õ– õÐþ– uLuN– A4 t 4 5 4 ÷ 4  ÷ ôÅ@wfœÎEðÿ—¥5”,5”Lœ«\œ«wf�«@x€ð-u,‡u:6õµ9?õµ 9;A@ñµÃÃÀÈàý– A@ñ‹ ®– ³ôÕõÕ!Ã÷ Ã÷ †È%`ú&4 ÷ 45¬ ™bëKqj¾©Ó~Z¬àG€l�t‡÷ wÔÿw¬ÿõµ9à‡fõ• 2�lfu<u>A4¶ €÷ †–%¡‡ôÕp-,†p-< †>p-<‡€ɪ°hRŠª0 vè÷ õµ 92A@ñµõÐþL–%±‡%ö �@@œ Nt4u:.æw‡Þ 54â‡u.:@m:Àe÷ „þ6£E©ÉHLëô. P@ª¿.ÅVUTÀ…áz½ufsTÀ…ᯔDœ«w@œ«@³ª4}@ɪ°h@ɪØh@¼«8@Y¬T}@©¨%@ ½ufs `¬ðsh¯” ½ufs€Á ‡÷ &4 ,}†`ƒ  ÂÔÁÀÃ÷ 2†"`ú.Á &Bòµñµ 1÷ ±t5 :÷ 4 õµ9 ɪØh4©¨%^ɪ°hn¼«8€|ñÕ ÷ ÷ €4 Â^õµ9ø‚‚lA:`Áe‘”CÃe2­ - -õµ,ã8ÂÑ”à ý5 B ñÕ Y¬T}³ª4}lø ÷ †õU€,4 €ðe€–  ÷ 4 õ5€,õE€,õúLõLu<u>fLV ‡Á Ô ÷ М«w*œ«hœ«wVUPÀ…ÈR½uœwPÀ…ȯ”DŠª0 @ «ƒK@»«+d@ ½uœw ¶¬�"h¯” ½uœw€5 4ôÅ\÷ †‡lœÃÅÿBŠÃ à ‘”à ýu>u<ÃàùœÂÅðÿÂ¥*A-<'‚A-<!ôÕ ÷  Ü «ƒKzŠª0 >|ÁÁ ÁåÂ¥ÁåA-< ‚p-<‡÷ ‡4 ‡õ±‡(»«+dUNÀ…áZ¿uLNÀ…ᯔDœ«w@³ª4}@Y¬T}@Ý©[}@ ¿uL tZ¬àGh¯” ¿uLxff f4  ÷ †ô Æe4 ±‡ô ÷ ô €�‚Ã÷ úÿ‡÷ "`úÁ ÷ 4 ‡ $œ«wB³ª4}VÝ©[}`œ«wpY¬T}àUNÀEÂzBu;TNÀE¯”D5¬ ™@ Bu;T €�«Uqh�«Iqhd�«{h0�«ö&hD�«T[h\�«\gh8�«u'hT�«åhH�«ñ�hlz�«h �«!thX�«U(hL�«™’hh�«‰wh�«E`h�«œ,h4�«¯h(�«„!h�«&h,�«Ayh`�«•h�«Ä…h<�«"h �«#h$*�«:dh�«Vqh�«TqhP�«Ôh@¯” Bu;T€æ5æ3æ1æ/æ-æ+æ)æ'æ%æ#æ!ææææææææææ æ æ æææææÎáÎerfÁA|5¬ ™|yUSÀÅÎz©udMSÀÅί”D5¬ ™@ © }@œ«@C©z@³ª4}@”¬®s@ɪØh@Y¬T}@9©@œ«ZX@Óªz@ ©u[M „©,h¯” ©u[M00&\ 1g€@L& &2 ‡õÀÿLwFõ‹8W­8 �Ü€ € € ` ÂÃ÷ úÿ†÷ øñµ Â÷ †wø€Ít÷ ÷ †J9©fœ«xɪØh|C©z€|õ ûLdÃެÂe@à ùõ ûLVÃõ 85‚¦¦�œN`v ¶,Ž,g‡× õ‹-µ6µ8C µ.µ0µ€ø2µ4ƒ r`r ²²ÈñÕ ÷ ÷ Â÷ †Á "`ú&&÷ °ˆ fLfN÷ °ˆ– �À&&&,ɪØh0Óªz8œ«Nœ«ZXfœ«ZXt5¬ ™€tÁ t  ÷ 4 °ˆ&Ö w—, —,–%—,—,² ²² ²"2 2 ² ²2 2 œ«&”¬®s€ðw¶þö QñÅ Â÷ †wÿ ÁÂÃ÷ úÿ†÷ އðvt +ñÅ fœ 1œ ñÅ@ Î5@ñÕ@ ÎÅ@ð5@ œ«69©€lÎÕ@°• f1°N1°€ÀEÿwlýæ¦ææ& & ƒ$ .ƒœà à æ€œàþ‚Îà& Ãö¶ ¶l5¬ ™€èö• ÷ †ÆewNþ‚ ƒ6в"² ²²²*²(–%æó $ó"óe$s "3 &ƒw`ý "`ú && ÷ ˆ° © }xœ«$d "`ú úÿ÷ ÷ ¡‡±‡Y¬T}³ª4}¾USÀEÛz¸ul†SÀEÛ¯”DŠª0 @5¬ ™@@ª¿.@I«„–@œ«w@œ«@À©h @ɪ°h@�«@x@Z¬àG@C©WT@;ªà8@ZÓªø8@ëKq@¾©Ó@E©¶H@S«`"@”¬ô@C©{Q@ ¸u`† zU«-‚h¯” ¸u`†€5 4÷ †w˜Á ÷ Ât  ÷ %‡æw †,Ðüæwò†÷ š÷ 4 ðµ õµ09t Át÷ †wfN S«`"C©WT,œ«w2À©h , 6@ª¿.DÓªø8> H@ª¿.TC©{Qv”¬ô€|65 6÷ ô%ÿÿ µ6 õµ,÷ ´ Áv÷ †5ôÕ@µ4@@œ €Š÷ /‡p-<*‡÷ õµ 9$æw †,Ðü7 C©WT*C©WT8”¬ôVŠª0 dE©¶HpÀ©h æ t@ª¿.ª€øæwò†6÷ àæw/‡õµ, Áv÷ †5ôÕ@É5 5 55Šõ õôµõôµ@õ Ã<Óªø8ø  @ª¿.;ªà8 @ª¿.,”¬ô~5¬ ™€tÃÀ55æwuLuN5 5 5 ôÅ4Š ÷ A4 ÷ õ  ÷  tôÅ@4Šwu:6õµ1I«„–„ @ª¿.Jœ«wTC©WTbœ«v�«@x €ð9Aõµ 9=A@ñµC:`˵1ÃÃÀÈàý– A@ñ‹ ¯ŸõÕ!ôÕÃ÷ Ã÷ †È%`úç&4 ÷ �t݇÷ ,5¬ ™XëKq`¾©ÓtZ¬àGlëõµ9ã‡ɪ°h°UOÀ¼z½uì8OÀ¼¯”D5¬ ™@@ª¿.@œ«w@œ«@”¬®s@©,`@3ª(#@Z¬àG@¾©Ó@ ½uø8 ¬¬Àh ¯” ½uø8€‚ †ô   æÃ÷ ‡µ“85 :Ã÷ †"`ú÷ ì†õµ9õpùL5 N æw‡õµ,Ž Ö– ÃÃÀ&1"©,`4¾©Ó@Z¬àG\3ª(#V `@ª¿.t5¬ ™4|&A6 ÷ 5 6 ÷ 4 ˆ°&Ö wœ« œ«w2”¬®sfUUÀÕz½u¬dUÀÕ¯”DŠª0 @5¬ ™@ëô@@ª¿.@œ«w@œ«@À©h @ɪ°h@�«@x@¬�"@Z¬àG@;ªà8@RÓªø8@ëKq@E©ÉH@¾©Ó@E©¶H@”¬ô@ ½u¡d Z¬-h¯” ½u¡d€÷ †wš÷ u4t@m:Àe÷ ¶&@@ðµu-,õàù €÷ õµ 95 4w6 & ÷ ,†– w&Á ÷  †– uLu¬�"ɪ°hHE©ÉH€|Nw– 5 , ÷ 5Š95Š!Át÷ †wðf65 6õµ, Áv÷ †5ôÕ@µ4u<u>‚�`f� @ÔfÀ 5÷ Šª0 &”¬ôD”¬ô€øL‡ôÕp-<*‡÷ õµ 9$æw †,Ðüæwò†0÷ Äæw)‡õµ, Áv÷ †5ôÕ@Åõ õôµYŠª0 E©¶H$À©h  (@ª¿.6Óªø8( :@ª¿.F;ªà88 J@ª¿.\”¬ô€tõôµ@õ– õÐþ– uLuN– A4 t 4 5 4 ÷ 4  ÷ ôÅ@wfœÎEðÿ—¥5”,5”Lœ«\œ«wf�«@x€ð-u,‡u:6õµ9?õµ 9;A@ñµÃÃÀÈàý– A@ñ‹ ®– ³ôÕõÕ!Ã÷ Ã÷ †È%`ú&4 ÷ 45¬ ™bëKqj¾©Ó~Z¬àG€l�t‡÷ wÔÿw¬ÿõµ9à‡fõ• 2�lfu<u>A4¶ €÷ †–%¡‡ôÕp-,†p-< †>p-<‡€ɪ°hRŠª0 vè÷ õµ 92A@ñµõÐþL–%±‡%ö �@@œ Nt4u:.æw‡Þ 54â‡u.:@m:Àe÷ „þ6£E©ÉHL00&�TADATADATADATADATADATADATADATADATAëô. P@ª¿.ÅhUNÀ¨Äz3u…KNÀ¨Ä¯”Dô¨¦s@ô¨²s@ô¨©s@œ«@´:+@�«7x@�«@x@¤«V@,ªPd@ 3u…K ^D©Åbh*D©Mwh*¯” 3u…K€1ñ• Â÷ †õ �55@÷  èÍ¥#@>ÈEüÌ5uuô¥  ‚ô‹À<÷ øÌ5@[œ«,¤«Vrô¨©s€|‚ŒW‡& AÉ¥Nfœvœ�Î & fæAëÂ5Àe&Ð5ð 4Q4 áea æ €Â5 ô‹Î÷ �#z,ªPdjøˆÂ5 Ì5õ5ðUÂ÷ †õ �õ°þu÷ ú÷ 5 wÀ°þ†õ �5u‡ "´:+&�«7xBô¨²sJô¨¦sR�«@x²UNÀ¨Äz3u|qNÀ¨Ä¯”D¨«l@´:•@D©ØZ@ɪwe@¨«üR@¨«»@”¬®s@�«@x@¤«V@¨«„!@¨«ZŠ@´:ü�@RC©r @ΪÐW@¨«ì&@¨«žr@,ªPd@ 3u|q òJ©$hJ©Åh¯” 3u|q€ÅÁeÂe&Î5ÊEÌU@Î5 @âÿÀ%ƒÀ ÉeÉEÎ5 ÌU€ÍpúÊ¥I‡ÊµðÎ5 tØÿ´ $ÌUÊ¥ Ê5€|Î5 Í ûu"Òÿ-‡Áe.IÂÿaaÒÿõ¥Ëÿt÷ ‡ÊE€ñµ÷ÿÊU€b8bbbrœûÿ'– †wþ@ôÿõ5Æÿ÷ J‡÷ G‡÷ ÐÃe2C©r l¨«lrΪÐWz,ªPd€øèÐBÆÿôµ Ó  Óe4‚ †ÈUÂ5ÈUpôÿ6Í ÿõ‹Áÿ"PÀÿA¾ÿHX*ÈU€Â‹€ÈUAòÿ!BœöÿÂÅÈUÀ```òÿÈÍ€t°ÿ‚Œ†wÈU‚ŒúñµõÿÈUÓÓ KôÿÓeÓ ÓeBÌÿ Ê¥‚ùÓ‹Óe ÂÁ�þ÷ Ї@ôÿ÷ ôµ Hõ5D©ØZ`´:•hɪwer¨«ì&€ðÆÿG÷ †Í%`ýf÷ Ú÷ �·õ5Æÿõ÷ ò‡÷ †f÷ ì÷ ²÷ æ‡ð !&& &÷ �ÎeæˆÂÁPÿ÷ –5– € †ôµ Ê8 ¨«„!¨«üR,¨«žr2¨«üR:¨«„!D¨«„!V,ªPdf´:ü�nɪwe€lõ5ÆÿÆf÷ Ã÷ ñ‡÷ @ôÿì‡õ5Æÿ÷ ôµð t�åÿ(´Š(ôµ wôµ ôÕ4 "4 &ô$ ÷ w`Áe ,¨«žr¨«ZЍ«».¨«üRN”¬®sr¤«Vv�«@xèPPH 8‡øUNÀ¨Äj3uItNÀ¨Ä¯”DD©ØZ@�«7x@�«@x@¤«V@´:ü�@,ªPd@ 3uIt 8J©|—h¯” 3uIt<÷ &&ÎeæˆÂ÷ †ÅeLÍPÿu¼ÿw ÷ w&,ªPd´:ü��«7x.D©ØZ6¤«V:�«@x†USÀh×z4uëgSÀhׯ”D´:¼p@œ«@C©z@³ª4}@ɪ°h@�«7x@�«@x@¤«V@@ªS~@9©@ô¨V@,ªPd@" 4uëg 8p©Åœh¯” 4uëg€5 85 :5 <5 @CC À’À À Àað ˜#‡Ãõôµ C Ë¥æœ÷ �‡ÃôC< æÿ÷ z‡3�3   µõA8 €|÷ †õðþõ @ Àe 5,@ú÷ Í¥wõ û€æpw¡‡wwŠw®õ<3 ‡ÁQ4‚Ë%&‚æìæíæïæî€& fœ«*¤«V4�«@xB@ªS~€øæó f&     ø‚&÷ ‡ÁQ4Ñ    †‡ôµ!÷ °Âæ÷ †NÂ`ÿƒ‡ÁÁe ! & fæÿ‚÷ Âÿ– �N’‡ ŠB,ªPdJ´:¼pP�«7x€tÉ¡‡ ÁÜ& ôµ %t "†� Œ� Œ� vŒ Ý` ÷ ‡€cÁQ$ ì ‰ ì $– ‡ Á& ôµ0gB: �€ð€œ€ Ê ^€Ž÷ ºY‡õ :A<W" ‡1tôµ FÁ 1�€c5:°­ÒÀeÁÁe B”””3’Àe€ "”43"€lBÎ ΊýΠ”Î ý€c¸ÿºÿóµ! ! Q4Ë%8 ‚²ÿœºÿœ¼ÿ ¾ÿ¡– އæ&fA8 Á÷  þ-‡5@ ÷ ‡hô¨V|œ«Tè�€Â ÷ úÿu8†÷ È%`úî6à% þÂðþö þ±÷ ÷  û–Uƒ‡9© ³ª4}Dɪ°hHC©z¼UNÀ¨Äz5u|qNÀ¨Ä¯”D¨«l@¨«´'@D©ØZ@¨«üR@¨«„!@¨«ZŠ@�«—y@¨«oŒ@ΪÐW@¨«ì&@¨«žr@ 5u|q >i©5uh¯” 5u|q€Å@ôÿ`Bf´ÿÍ@þÎ¥Yôµ!Tõ5ÆÿÂ5W Î¥Â5È ÷ A÷ >‡÷ ;‡`Áe Î¥÷ 1‡÷ %‡÷ Î¥÷ &J¨«üRP¨«lVΪÐWj¨«žrp¨«ZŠv¨«ì&€|‡Î¥##Àeâ÷ ‡÷ ‡AôÿPPH 8÷ ‡÷ ÷ †÷ Í ýÎ5@ôÿf÷ �>ôµ:ÍùÂ55ñ‹œ&H¬Jƒ1’B2¨«üR¨«lΪÐW,¨«„!2¨«ì&6¨«ZŠ<¨«žrP¨«„!€ø(ҔȊýñ ôµ1ñEñ c0 1 p ð ÷ ` †Í%þÍlûñEwôµ0Fñ5Ê%Š$Úœ&±�Bl>¨«lXD©ØZ€tž,±Š¦÷ @‡Íèù݃ŽàÖ%úÿ  œ:æÍÔ ýƒÍEÍÒÍÜ͵L÷ `Ó´’œÿÿò’þÿò˜ýÿÓ•,÷ J÷ :؆±Šœ*l,ʘ÷ `¬‡BtΪÐW€ðpÂ58ñ500&'\ 1g�Š°Î¥÷ ÷ ` †Í% ýëñ5Š1 Š1± ñ5BœBlâ¥>Ê¥]Ê¥:÷‚ ¦Nì(¨«´'.¨«žr€l±•÷ N†Ò•.±Š÷ L†œ&±�Blœ.0Ò”÷ l†ÈŠúÑ ÷ `†ÍèùñE±w¬ýÃe÷ Ï Íw Ä@÷ Ä(÷ CB¨«oŒj�«—yZè ƒ áý† aà ÷  †ÃeÃ%/‡Ãe.Ò�±Šq¬‡æÓ¥0 ñŠæó”þÿ üƒ£¸Î ò€ ƒe‡TUQÀèÊz5u>™QÀèʯ”D5¬ ™@ © }@©€T@œ«@C©z@ɪ°h@�«@x@¤«V@ô¨" @9©@ô¨V@œ«ZX@*Óªz@ 5u>™ Ä ©µ�h¯” 5u>™€�ÁEÿôµ  u@Ã�üôµ!Ãpýôµõ‹@à þÁ÷ ‡&÷ €†÷ õ>&÷ x‡Bµ…  Ê¥÷ . ‡Bô¨VJô¨" R¤«V€|B… ‚íBõ <éõ‹@÷ ¦÷ ˜Ã  ÷ Ö)‡@÷ Àe ,û÷ õ �5 w÷ Ž ‡õ¥@ ðµõ�ý±‡Â:¤«VN¤«V\�«@x€ø÷ ú†÷ t †È%`úÈú÷ v÷ . ±‡f÷ ÷ †õ û�‡A85 8A:5 :Á Â÷ †Èù÷ .÷ ±‡Á÷ ’ÿu8 œ«2ɪ°h6C©z`œ«nœ«ZX€t‡ø‡Âà ÷ úÿ‡õ  �5E-È 5‡f@Æå6 ö ÿ � N2 ¶ Á B2 6  … õ5€öÕ Ã9©€ðÃò‹ ¶œ ¶¶¶¶œ �ÜöÀÿ õ¥ @µ <ÃÃö‹ 6 6öÕ Q­‚66 � 6Œ � 6Œ � vŒ 5¬ ™D5¬ ™€l Ý`A-<u<÷ Àþ"‡A<÷ vþu:‡÷  þ‡÷ 8þò†5>vm> µ @€ öèû ð µ wèÃÃö‹ 66 6f5¬ ™€èöÕ ÷ †÷ ”þ\6ŠB² ² ö¥'5 >5@÷ †B÷ ^þ5í >µ @5í@rí> ² rí@ ÷ þ/‡0$p0"r © }@©€Tddö¥ %@@°°° °"°*° (A:@>ñÕ ÷ õ €ðÕ÷ ±–U–U–U–3µ@‡BÓªzRÓªzfUNÀEÂJ9uÁSNÀE¯”D 9uÁS  ­ZTäT ±VNhR£rœQhR¯”ºUOÀ¨Äz=ulOÀ¨Ä¯”D´:Ã@@ª¿.@�«7x@�«@x@©ù#@,ªPd@ =ul ÈÈ«`ThÈ«õ h §«`Th«µ�h& ¯” =ul€ÁGÁ¦÷ †‚€"°ýÈÿQ5 ,õÿÿ,ôÅ@ðµ  4 õ , ôµ õ�üLB&÷ ¦ÿôµ  æw†W-L0úp©ù#j t@ª¿.P|Á÷ uLuNw ÷ p°Â÷ H †W öÿȰýÈøýp&V ‡�«@x ,ªPd,´:Ã0�«7xUNÀ¨Äz?uüdNÀ¨Ä¯”D¨«l@´:¼p@¨«´'@D©ØZ@ɪwe@¨«»@�«@x@¤«V@@ªS~@¨«ZŠ@ΪÐW@¨«ì&@*,ªPd@ ?uüd À(«Xh¯” ?uüd€ÅæõE€Æÿ@ôÿôôµTõ5ÆÿÈ ÷ 9‡÷ 6‡÷ 3‡÷ ÷ .‡ôµ '÷ Pôÿ& &ÎeæüˆÁ`ÿÂ÷ – Ž—‡Îå0Öe 2.¨«l4ΪÐW:¨«´'@¨«ì&D¨«ZŠR,ªPdl´:¼ppɪwe€|†ôµ  Íàÿ�(Í@ÿÁ% ‡÷ †wá !,¢8¡¡! õ‹Æÿ€ÉU1�(ýÿ5�ÉÿÀEð5Øÿ5âÿÁe(5ÀÉÿ Š õ¥ Éÿ ‡B" $¨«»*D©ØZ€ø" Êe"J BÂÂÕÀ¥Š´�)µäÿÀ¥ uÒÿÑ IÂÿuÂÿIÀ5ÊÿÁ5 ,Á5 ÍpúÀ%ÿ¢‡ÌU€ôÕÀe& àÿÿ PtÁ5õ5Æÿ  ÌU  ÷ Î5wÎb ÌU@ÁEþß� í‡íõ‹Éÿêæw"¤«V,�«@xN@ªS~"UNÀ¨ÄzBu›wNÀ¨Ä¯”D5¬ ™@½«v~@$9Î…@¬¸L@¯ªÿ@�«¹.@D©öq@s©À�@]ªÿf@ Buœw Þô¨¦shØzô¨¸shRô¨²shÎô¨£shàô¨©shÜ@ªñ�hÌa©€eh€£«`"h D©ØZhP7ªšwh @ª¿.hC©29hž;©PMhb–©ZŠhL”¬®sh ɪ°hhúz�«@xhn�«7xh�ɪØhhô¤«Vh|ô¨ú¢h$@ªS~h,@ªR~hŽô¨" hx.ª°hjô¨VhzC©8hÂD©ZhT•«¸.h\,ªPdh2�«—yhH ¯” Buœw€¦v�e�óN³*•PU5DÕ Åe0Á  Ì üS÷  æÂå,‚¦ærwÜ Ž`‚ ‚ Âå4†@ØÿÍ€ý€ ƒÀ È%P÷ $÷ :½«v~€|N‡05¸ÿÈEÿß6É5ÍÐÿQÍÀü„ MƒÄ Ì¥ IÌ5òÀ 5¸ÿAç‡@Ípü€ 8ƒÀ È¥ 4È5Ý ÷ ¶ÿÂ% ‚ÎDŽ`ÍPù€ø�‡`_ ,/O&PXVUTSÁEöÿͰúÁEýÿuÊÿÎÿBÎÿ‚ ƒÈ5 =Í�ü/5 Ìÿõ Êÿ*Í@ùõ Èÿ%ÁEýÿ ÁEþÿ ÁE÷ÿõ ÎÿØ M�€tÄÿÍŠ õ Ðÿ ô¥ ƒÍ`ü ÍŠ ÍÐúuºÿdÁEûÿÁEïÿÈ5 ÃÍpýÁ ñÈU Ì5@\ôµ .Î%Íàþôµ -ó €ð/÷ ‚,‡3Äe"5Àÿ5¾ÿ5Âÿ0Î% @ÅåL÷ @÷ R÷ , Î%Pƒ�œ� � � ÁEùÿ�ewÍÀýuºÿ00&/�TADATADATADATADATADATADATADATADATAæpõ¥1´ÿæ‚÷ ö÷ b5 6¬¸L^]ªÿf€l¸ÿ÷ êÌE÷ # ÷ Ø÷ £ Æ*‡�÷ ÆÀÐ P�œŠÐ P æÿˆ†Á—æ1ÿˆÁ¥õÍ€ùu÷ ŒA“ æ æ)ÿˆæ æÿˆD©öqD©öqLs©À�V$9Î…€èófÅåLÀææ À€åH@ñµ D, þ� ÷ 4÷ �Ö ‡ÀÐ æÈ  ý†€å‡&æf…Þ ƒ„…‡ÃÃÅ5¬ ™F¯ªÿP5¬ ™z5¬ ™€dD¸ÿÌ¥ ‡ w Èÿ÷ Øÿ„f÷ 2� ƒ& ÷ ¤‚‡2r€‡÷ †¦�‚÷ €‚À4 Á À8Á À<Á0€àw dÿ&Î�¦÷ lÿ „‚ ÷ &�•ƒap ‡…•aB#EÕ û� ÷ *‡�  Á ýÍ þu¼ÿ‡ÀDÌ5ÀeÀàÀ`w ðþÁe€\ÁE<ó .¦f÷ �‚2  ,ú‡Â °,ôƒñÄ€pà l‡€ û‚ŒJ aƒ †¤´bõ„!�«¹. Øò‡±‡¸UNÀ¨ÄrBu�NÀ¨Ä¯”D5¬ ™@ © }@l¬‡ @�«@x@”«‡ @¬¸L@ Bu� Àj¬õÍ%€ù8Í ýÁ¥5Í`ýÁ¥0ÍùÁ¥+ÍþÁ¥&ÍðúÁ¥!ÍüÁ¥ÍðüÁ¥ÍùÁ¥Í úÁ¥ ÍüÁ¥Í˜ýD�«7x$9~Z($9X2$9«‘<$9BF$9ÙfP$9.Z$9d$9š�n$9Zqx$9¦€|Á¥�u¼ÿ±– ‡ÂÁ0ýÂÁÐý ÂÁPúÂÁÀûð 0 &÷ Â%ˆ ° ôµ õ5ÆÿðU÷ ÿ€ð‡,$9#´:±'"´:q!,´:±r6´:ÔJ,ªPdN´:Ô€øÃeË GËÓ ôµ16Ãå Ëãz,œ*Á M�`÷ ކÓ4 Ê¥, ¦÷ ä�‡,÷ ؆Í0þ<ðU:÷ .ÿ†Í% ýÍþ0Ãe€t  8`ÂeÊââòøÿ‡Ãe Í0ù8‚ œ6DÁ BÊ¥- Ë Á% ò¥17Ê¥*Á 1YÁ%V‡ßæ5æ±ÿˆË ×'hT;²js©À�zs©À�|T;œw€ðæË Ë ‡‹eC‡Ê¥9@‡& Ž”Îå0‹c† ÎR Ë Ë Ê¥72‡& Ž”Îå0‹cV +‡Á Ûð Íý4œ2Á%‡÷ x†Í`ù0œ.ôµ ,ð5Ë%€lÀ¨îð5 Á Ê¥*±‡ð5‚ Á Ãå È ÷ ÆÃåúÿÈ÷ ºÁ êð0 ‡Â � # # # Á% 8‡w Å‚ Á 1ÄÊ¥*„ Ê¥%d�«—y€è„’Ä%Z$‡Äå@‚Äe.!‡Ä%'‡… †Ä Ä Ä &Ä Ä „eö a… ØÓ ÔA‚ �àÒ¥*ãÀ¨B ¤‡’4â•0Í J˜Ê¥*™Ê¥7–‡€ óÍ ’€Á¯€dË• Á Ê¥"‚ Á Ê¥a‚Ê¥z‡Ê‹”ƒ È ë‡ ð C^œ6±à BÜBdß00&7\ 1gæ5æ±ÿˆÃ; ×' æÎEøÿÎe0 ƒ TT;²Vs©À�ls©À�nT;œwVàƒ & Íà N —# ‡Îå ƒ Í öÎe0à ÷ ºÿƒ•Í`I¬†Ò�±Š ‡`Áe   8‡(UPÀ¨ÄbEukYPÀ¨Ä¯”D5¬ ™@�«7x@Y¬±}@´:+…@,ªPd@ EukY v¬¸Lh¯” EukYz¦ÃÃñÅ 1 ÷ Ì¥ ñµ@ $òµ€ ñÅ! 1 ñµ€ ñÅ€ f&&÷ Âpp ÷ °ˆ�‚‡ 5¬ ™Y¬±}X,ªPd\´:+…l�«7xæUNÀ(êRGur NÀ(ꯔD�«7x@´:ü�@,ªPd@ Gur PY¬Ðh¯” Gur Tòµðÿòµòµ€& ¦Îeæ÷ °Â&Ì ÷ ŒÆeõL5 N‡.,ªPd6´:ü�@�«7xUNÀEÂz—uçeNÀE¯”D©€T@D©ØZ@œ«@J©|—@ɪ°h@9©@œ«ZX@Óªz@”¬ô@ —uçe J©E$h ¯” —uçe€ÅAòÿAÁeÀÿ@�åÿÁeúÿ@œùÿ€ Í ûBÒÿB& Ý)Ž`õ¥ËÿÎe ‚%3†Í@ÿÀ% .‡ÂeͰûRÔÿJÖÿ$�â Ò Êÿ€ ‚ €|ü‚ É B(†‰‚ ´& ¦Áj÷ ¦9÷ †ÅeLu¼ÿw ÁÂÃ÷ úÿ÷  ÈŠýÂetþŠ """$""0h÷ ñÕ&"”¬ô(©€T8D©ØZJ9©Rɪ°hzÓªz$ø Â÷ †&&÷ °ˆÈw œ«œ«ZX"J©|—|UNÀEÂB=uNÀE¯”D£rœQ@ =u  ­ZTäT¯”  ­ZTRR£rœQ`UNÀ¨ÄzBuœwNÀ¨Ä¯”D5¬ ™@•«ºW@½«v~@�«Hw@$9Î…@¬¸L@”«úv@¯ªÿ@�«¹.@D©öq@s©À�@]ªÿf@z Buœw Îô¨¦shÈô¨¸shBô¨²sh¾ô¨£shÐ@ªñ�hDa©€ehÌ£«`"h D©ØZhœ7ªšwhæ@ª¿.hC©29hä;©PMh®–©ZŠh˜z”¬®shɪ°hhÎ�«@xhº�«7xhÜɪØhhȤ«Vhlô¨ú¢h@ªS~hx@ªR~hôô¨" hh.ª°hZô¨VhjC©8hD©Zh �«—yh8"•«¸.hL,ªPdh"ô¨©sh̯” Buœw€¦v�e�óN³*•PU5DÕ Åe0Á  Ì üS÷  æÂå,‚¦ærw( Ž`‚ ‚ u½µÿÆÿ€ó J AÁeLK›UËŠý€õ#:½«v~€|ÂåE†@ØÿÍ€ý€ *ƒÀ ÁåPÁ5ÿ"÷ <÷ ‡05¸ÿÈEÿßBÉ5ó J õµ´ÿó‹H€Ë‹ÍÐÿQÍÀü„ MƒÄ Ì¥ IÌ5€øòÀ 5¸ÿAÛ‡@Ípü€ 8ƒÀ È¥ 4È5Ý ÷ ¶ÿÂ% ‚ÎDŽ`ÍPù�‡`_ ,/O&PXVUTSÁEöÿͰúÁEýÿuÊÿÎÿ€tBÎÿ‚ ƒÈ5 =Í�ü/5 Ìÿõ Êÿ*Í@ùõ Èÿ%ÁEýÿ ÁEþÿ ÁE÷ÿõ ÎÿØ M�ÄÿÍŠ õ Ðÿ ô¥ ƒÍ`ü ÍŠ ÍÐúuºÿgÁEûÿ€ðÁEïÿÈ5 ÃÍpýÁ ñÈU H ‹ Ì5@\ôµ .Î%Íàþôµ -ó /÷ &,‡3Äe"5Àÿ5¾ÿ5Âÿ0Î% @ÅåL€l÷ @÷ ö÷ Ð Î%Pƒ�œ� � � ÁEùÿ�ewÍÀýuºÿæpõ¥1´ÿæ‚÷ š÷ 5 ¸ÿ÷ ŽÌE÷ # ÷ |÷ £ Æ*‡�÷ jÀÐ ¬¸L.]ªÿf^D©öqjD©öq€èP�œŠÐ PÈJ! Ì €æÎeÖ.(ˆ 3  ó‹H�Ë æÿˆ†Á—æ1ÿˆÁ¥õÍ€ùu=÷ À(„ Ì €÷ Â’4€á€ €¤F‡!$�«Hw Hs©À�R$9Î…rD©öq €d�’ÀŠý‡æHÎE}ÿó H÷ ÷ A“ æ æ)ÿˆæ æÿˆóÖ ÷ ³ Hsþÿ3(f÷ Aüÿ-fÅåLÀ*ææ À€åH@ D©öq"•«ºWD”«úvV½«v~t5¬ ™€àñµ D,þ³*SAÁe@”``fÀ ýA“Ñ� ÷ 4÷ �Ö ‡ÀÐ æÈ  ý†€å‡&æf…Þ ƒ„…‡ÃÃÅD¸ÿ>¯ªÿH5¬ ™r5¬ ™€\Ì¥ ‡ w Èÿ÷ Øÿ„f÷ 2� ƒ& ÷ ¤‚‡2r€‡÷ †¦�‚÷ €‚À4 Á À8Á À<Á0w dÿ&΀Ø�¦÷ lÿ „‚ ÷ &�•ƒap ‡…•aB#EÕ û� ÷ *‡�  Á ýÍ þu¼ÿ‡ÀDÌ5ÀeÀàÀ`w ðþÁeÁE<ó ~T.¦f÷ �‚2  ,ú‡Â °,ôƒñÄ€pà l‡€ û‚ŒJ aƒ †¤´bõ„!ò‡±‡�«¹.UOÀEÂJGub OÀE¯”D@ªñ�@ Gub ŒY¬T}hY¬±}hV¯” Gub €ñÕ@ BÂeƒ‚ÂEù3£ ôµ€³  0 f÷ �ñµ ÷ †ñÅ@ ¡‡Bñµ f¦ÂE±Á ±2 >@ªñ�|³ � ±‡ìWNÀ…ÈR1uNÀ…ȯ”D 1u l�«dwh�«Åyh8�«¼yh�«íyhR¯” 1upæ   C A @ ‡à‚ Î ÷Ö ‡æf À A �#‚�〠ö ÷ &æ  †€mÎ ù–5‡Á÷ ÞÿfÁ€÷ Òÿ€eC ‡tWPÀEÛz_u`"PÀEÛ¯”D5¬ ™@�«q@œ«N@í©SZ@@ª¿.@�«@x@00&?�TADATADATADATADATADATADATADATADATAé"@ë©"@Ú©¶K@ _u`" LÝ©Ý�h¹©]\h¯” _u`"€÷ ÷ õ•ÿÿ3ÃÃðµ ÃÐúõ‹6æw]õ‹Vðµ!Ã�ü'õ¥ õ5à úõ5� Í¥Iu÷ ‡@ 1ë©" é"5¬ ™.í©SZ( 2@ª¿.x�«q€|A B&VPµ 8‡Ã€úõ5Š3'õ‹3 & & &&ÎEÿ÷¦f&Ì5÷ ´ ´ ´ÌEH†55æwÌE@õ õ‹Lœ«NnÚ©¶Kä r@ª¿.Xø3ÌU@õõ‹3õ‹õ¥ ôµ 4 4 4‚ÌEŒP´´ ´ wV�«@xšWSÀEÂz_udSÀE¯”DتW@�«q@ì©W@«X@«W@C©O @œ«ZX@̪a @ _ud jí©SZhÚ©¶Kh  ¯” _ud€ ôµ@õ‹31 ÷ 4 ôµUÀÁB8Ã÷ _‡õ¥ôÕõ‹3%÷ Cõ¥7 B" õµ2ÊŠ�õ¥œ«ZX>ì©WXتW€|7 ÀÀ €`¢ ¨ Ãå÷ Vw<ôµ@õ‹3 44 4 ôÅ÷ ôµõ°ý8  Ã÷ ‡m5 4‡÷ PC©O p«X€øà†wÒâ4 4 4õ¥7eC<õ¥7*õµ€6 ”W 9ƒW ^Ùõ�ÿwŽÁå0øà Á`à à C` êõ:Ãåõ:€tƒ ½à õ€üàõµ2÷ Šõ¥7  Ü)u`:æNàCA"÷ &æÃ& �÷ – †–5wüÎ ó– ƒ÷ w‡E5 .5 <€ðAÃ÷ f÷ Ö�†"°ýbôÕõ <õ‹.w®þ€”À¥ ‡À¥ ‚õ¥ .÷ <÷ 8÷ 2Òõ‹3 uõ u<u€l<õ¥7õµ€6‚ ÂE ÷ ൠ8†´&÷ €t:tm<5 5 5÷ †õ‡555 5 5 &تW^�«q€è5 &5 (‡õ<õ5@÷ ñµ ñµõ‹3õµ(A@æ õ‹3õõÐùÎàõ‹3uõ÷ ‚ƒ ƒ€d÷ ¬àæ÷ Jƒ‡õ‡Â`‡õ‹.õ <õ‹3 u-<ƒQ�.õÐùuõ <�µ <5�.‡õ‹3 ôe t @4@í84 ‡Ãw€àæC4ƒàƒ#ƒÎàõ‹3÷ Â`Î f÷ ²ÿ�ꆖ ‡@4€àÀ ¡‡÷ ðÿõ¥7õµ€6 €Â`Ð¥^ û´´éÂà‡Ö õ¥7«W̪a \õ 8w�üwýLWRÀÅçz‡u`"RÀÅ篔D¹©@X@ɪ°h@�«@x@j¬˜@ë©€"@9©ë3@̪a @ ‡u`" \Ý©‚hø©("h¯” ‡u`"€÷ †wö÷ †wì÷ m‚ õ¥0µ”µ”u.õ¥0 Ü)õàA"Â`÷ õ5@ñµ óµ=ÿë©€"¹©@Xɪ°hb̪a €|óµ€µu>C5 õ  ƒõÐùõCõA÷ ÷ à ÷ Š4 4 ôe t W-Ðù 5 NõLuLuN>̪a B9©ë3høÌE@wõ%°ûLõ‹õ°ýL õ¥õ5 õ@úL4 4 5 5 5 5 &5 (÷ Ï4 ÷ ‡ �«@xdj¬˜fW ÀEÛz±uòƒ ÀEÛ¯”Dô¨8^@È«Lq@©`T@@ª¿.@œ«w@#©àe@"©ðs@ɪØh@=ªx@© @C©WT@=ªh@Jœ«ZX@Ý©[}@̪a @¬ðs@ ±uòƒ F©òƒhÞ=ªÐh¯” ±uòƒ€Æå5Š,æwæw€õ‹,w.æw€œf,5Š-÷ †– w,µ,÷ x@0A.W­8õµ,@4A2Ã÷ †S=ªx @ª¿.=ªh @ª¿.,ô¨8^& 0@ª¿.D© |Ý©[} €|wöúÿt÷ 6€œÀÅÿf,5Š-÷ µ,æw`‡4 ñÕ Â÷ ­ƒÂt ÷ G‡õŠ8°æw†HɪØh.©`T6#©àe¬ :@ª¿.RC©WTlœ«wx"©ðsî |@ª¿.€ø>€õµ,p.p0 p2p4 õµ ,`B‚mCí:°m÷ @Âe ÷ „ƒ ƒm Ãe€,õÅ,õPÈ«Lq€tL5Š-€W-LfLfNÁ 4 ÷ Á ÷ 4 °ˆ5 6õ•,&�#õµ , œ Žtt õµ,,œ«w8œ«ZX€ðt4t2t0t.Ž 4 u6ñÕ Â÷ õµ, ÷ †– wHÿæw´•†õÈù.ô‹Bm:´œÂeÁ%8C©WTHœ«wT¬ðs> X@ª¿.6€laÃ÷ õ•,4 ñÕ u6Â÷ ­ƒÂ÷ †wÖþ4 õL5Š-ÆefLV ‡B@‚œ ‡÷ ‡Ñ•ô‹̪a .C©WT@œ«wbèÂeQ�-�õµ ,ѕѕ€œœ°ŠÃ÷ CÃeö Q�Q�CB÷ ‡<̪a ^̪a WOÀÕz¬uNOÀÕ¯”D5¬ ™@œ«w@©,`@Z¬àG@Y¬T}@ëKq@¾©Ó@9©ë3@̪a @ ¬uN êl©,xh ¯”00&G\ 1g ¬uN€5 0÷ ;‡÷ :÷ .9õ•84  ÷ †‡ ÷ †5 : ‡÷ 5Š8ÃU€÷ B@†– "`úB@õ‹-ò‹ ÷ ÷ ,œ«w6©,`F9©ë3R¾©ÓzY¬T}€|Âw ‡Ãpùõ‹-xõµ9#W-0õ0A@ñ‹ ñµ÷ Vÿ ‡÷ „ÿ÷ xÿõµ9Ã÷ Ã@úQõ0Ãÿÿ÷ A@B6`ƒ”Z¬àG^ëKqrëKq€øÂeõÃEüÿÂ`Âe& Nœ ‚eñµ÷ œÃ@ú,A6`B:ƒà`÷ àpf:`Ž †µ6÷ dø– w¬þ– B6JÝ2Òµ  ŠH̪a ztñÕ ÀÈ0 4 fNfL ÷ †–%ˆ°fLV ‡�”ÁEüÿÁe¦”& & ƒ“”Á ý�ƒ´¥ô t ‡5¬ ™6œ«wXWNÀÅÎz1un†NÀÅί”D ©S~@ï[Œ@�«)x@á[o†@£« €@(«$H£rœQ@ 1uo† :�«Kqhx©R~h ­ZTä& ¯” 1uo†>w× ±&À ‡7.ð*†ð.€‡æÎeüÿž.J£« €ï[Œá[o†�«)x.* á[o†&�«)x.(á[o†0�«)x<�«)x. ­ZT"" 1uo† 1uo†êWNÀÅçz5u™NÀÅ篔D”¬t!@5¬!™@�«Kq@R«°'@D©Mw@Óªè�@ 5uË– ä ©S~h ­WTät ­WTh ­XTäz ­XTh ­YTà ­ZTäd�«)xh ­HTà�«¶{ä�«·{à�«¸{ä�«¹{à�«º{ä�«»{à�«¼{ä�«½{à�«¾{䯔  ­WTff R«°'n n”¬t!D©MwÓªè� ­XT  ­ZT  5uË–  ­WT ( (´ 5uË–´66. �«¶{ �«¸{ �«º{ �«¼{  ­XTTT``´´ 5uË–´ 5uË–´�«¶{  �«¸{   �«º{  �«¼{ 5uË–€�¦æ&fÃÑ BÀ˜þ… *ƒÅ Í‹'Â% Í¥!‡Í¥EÀàúÂ%,‡À€ý… ƒÅ D„Œ†„ŒÀ5 ‚‡õ¥  õ¥PBÄ2Ì    ­ZTl|þÂ%pÀÐÿÄ‹ñó5Jó³ J€÷ ó J÷ …„ƒ‚�€‡@ºÿµ ºÿõÅüÿ´ÿEÍ¥ó‚A�î†A� êƒÁ I&�«KqxWNÀèÊz=uÃNÀèʯ”D•«¸.@£«`"@ï[Œ@–©ZŠ@@ªR~@á[o†@ =uà \•«ºWhL © }h ©R~hX½«v~h>J�«HwhT”«úvhP¯ªÿh£« €hT�«¹.h6D©öqhH”¬ôh]ªÿfh ¯” =uÃ`Án÷ füÿÁlf ws$æÎe$ÁfÀÅåL‡‡û "û . û Î ‡{"{^{`ww& •«¸.–©ZŠ*ï[Œ.á[o†Z£«`"^@ªR~l WOÀèÊz@u~qOÀèʯ”Ds©À�@5¬ ™@$99ÁE*5z5¬ ™€|ó51 È�ûw¸Èäùò èÿù�â5Ãe÷ JCÁȤýœêõ¥´ÿ õ5ÆÿÁèÿÈìùœëÿÛ ÷ ŽÖ ÷ w\õ5Æÿ3 3 & h•«¸.€øó ÎU€ó ÎU@÷ à†ÎUG3Š÷ Â÷ >& N�áÿ‚fÞÿ Èþ�÷ *æ && @& Žœ¦& N�àÿfÜÿÈ8ýö o¦ææ€tÏ ÿˆ †Á—Á¥Á¥0Á¥ZwpÈ V�È5õ¥´ÿ¦ÎåD€% ÁAñ VwJ\wÿ ÃeÓ ÷ ã ÷ >wê÷ ò÷ & s©À�$96M$9pw$9ðJ5¬ ™V–©ZŠ€ðnB�áÿAÞÿÈ%&÷ Ø÷ ^„È%÷ ÆÄ5€ÑE€Ñ     ÷ ,@ DÜAD`†ÈÈûw¸U5÷ 2ð‹wRBÃeð,€lã ð‹÷ ¬'†ÓSY !@Ê¥_‚ �àÁåÁe†“”“” Á �Ë Ë Ë ¦”Îå0εø‹ÕóË%‚wX÷ ,°œ@Æåð  ‚Ò÷ .Ò•:€èƒ÷ êB÷ ún‡ó  Wðµ1SΕ[ BÓ CÂ`Δ÷ >ƒ  E‡‚f¦&Nàf& ææÏÿˆ‡—"W¢<W¬>W¢[W¬]€d‚CB`×§×§w ¦æ?ÿˆÒ•[ƒÃe÷ zÒ•,ã ÷ pÒ•]ƒÓ ÷ * ÷ ÒÍ‹ È5 °Œ‡D ‡wÖÑ•.÷ ²B@Ââ³�s©À�$9pws©À�$96M€àB1È5 ÷ îÁ÷ rð‹ø•;÷ Á(á F �õ¥´ÿBñU1 1 1  wÍùÈ58ùBÁe¢8bbbÂeðÿJb*•«¸.ZD©ØZ€\bõ¥#´ÿ1õ òÿAþÿAÍ€ý� ܃Á BÂåPÂ5ÿÔÍÐÿÑÉU uòÿÁeLEÀeÄw\ûÍhûÿÁüÿ¾Í@þB º0¬ÿþÿ¶ð üÿ Î%ôµ!€ØôÅðwó Twwææ¦æÿˆ†Èðû×§Èü×§È@þwàþÆå ‚¦¦æÿˆ“‹•‚ÎEÀ²“æÿ‚¸ÿ²•–5²2@ªS~–©ZŠa©€e6s©00&O�TADATADATADATADATADATADATADATADATAÀ�8$99©Fɪ°hL.ª° ð‡ƒá÷ 1 1 &V ‡l¬‡ œ«ZXÎWNÀèÊz¿uçeNÀèʯ”Dô¨©s@ © }@D©ØZ@œ«@J©|—@ɪ°h@9©@Óªz@œ«ZX@”¬ô@ ¿uçe jJ©m$h¯” ¿uçe€Åôµ´Š4 À Í`ûÈEÿtÈe ‹ Èåü‚ô’ ÈEÿˆ 4’È ˆ ˆ ˆ bAòÿÁe:uœ¹ÿåÿAÂH�åÿµŠåÿ¢ ‹`‹@‚ øÁe€|ÀÿÉ K(†ÉõðÿÍ@ÿAÌÿÉ¥IBñ‹u ¾ÿu ÀÿË I‹ËEÿ­õU€Æÿ ‹Pul ¾ÿu Àÿul ÀÿKÜÍ ÿñ‹ Í€ÿæýÿ‚Œ €ø‡‚Œ‡‚ŒÍ°ÿwŽ Â‚µúBœ±ŠB­åÿ†µ�åÿÍ0ÿA±õ5€ÆÿËEË §µŠñÿW­åÿ Ý‚CÌÿË¥Ãúw¨ À<÷ ͇H�åÿ&D©ØZvô¨©s€t”Ð Èœ �Í`þ¤À†Èœ Íàü¤º†Èœ Í ü¢´†BÌÿÊ¥à �œ�œ¤p“üÿ¤p“úÿ¢N“‚ê¬úÿÍ0ÿÈ‹•œÿÿÐ ÈÈÕе€ðô‹´ŠË%8ƒŠ´Ðœ 4œðÿÈÈ Á"†HÁ "ƒH䆜ïÿÈïðœùÿÁåô¥!ÁåfÒÿNÍ0ÿ�#&‚�ÁeÀeúÿ& €læÎeŽà œûÿõU€ðÿÍðý—¢‚Š ÊEÍ"†�‡Í% †J# Í ùw ¦N`�—vcQ“¦Ž`Š�d‡H#ƒH°Šüÿ¬üÿê‡Ö -†´°“DD©ØZ€èþÿÝÎ%ó†¬òÿÖÖÔˆ#ÍûÒ‡wNþô Áj÷ Áe$‰ Im a Im CË¥DœAFH Š ÎefÎ%˜‡°Àefˆ ÷ ž Âe0”¬ô€d Js¬ AùR4r”üÿr”úÿr’ûÿá æRÎ ýÁÎ R”Î ýÖœ 0f° tõŒ=p töÎ& CË¥wÀe0Ó4æÎ5÷ €àÐ �ð ÈÁõ‹=0΋K s (õE€&�ôÅ€&æf&ææ Áfæ�S ÷ y‡‚ƒ ³‹¶¶Æe ƒ€´•ÀeV © }€00&W\ 1g\‚’4‘‘ÑÑQ4 6dJ d΋H�<!b 8ŽŠ­õ‹=$"‚ã�í‚ P`H ˆ` 3þÿÁÁX 8Ðå� Ãå ÃV>÷ .0�(0 €Ø0° A�<p��Šp�Ö ÷ wæ& AFN ÷ ÷ ñÕ Â÷ †àù&54Š(AF÷ ˆÅeLw �� ÂÃ÷ &&J©|—8ɪ°h<ÓªzJœ«dœ«ZXnD©ØZTúÿ÷  ÈŠýƒ‡9© ɪ°høWNÀÅÎr›rw NÀÅί”DJ©Å@i©5u@R«°'@D©Mw@@©¿G@Óªè�@(«X@p©Åœ@ $›rw ¯” (Á wwwwwwww2 @©¿GR«°'i©5u(«XJ©Åp©Åœ"D©Mw&Óªè�°WNÀÅÎz›rx NÀÅί”D”¬t!@¬Ý@¼©õ‡@j¬õ<@Ý©Ý�@ò«ˆ@@©¿G@È«õ @•«õ @¹©]\@«µ�@G©]\@JU«Ý�@i©�{@§«õ<@e©ÝO@©õ#@D©�b@ L›rx ¯” PÁ wwwwwwwwwwwwwwwwwwn @©¿GD©�bG©]\i©�{e©ÝOò«ˆ"¹©]\&Ý©Ý�*U«Ý�.¬Ý2©õ#6¼©õ‡:È«õ >«µ�B§«õ<F•«õ Jj¬õ<N”¬t!2WNÀÅÎz›ry NÀÅί”D¬@J©E$@Ý©‚@@©¿G@¹©…\@ ©µ�@G©…\@U«‚@e©P@i©Å{@(«E$@ 0›ry ¯” 4Á wwwwwwwwwwwD @©¿G(«E$J©E$G©…\i©Å{e©P"¹©…\&Ý©‚*U«‚.¬2 ©µ�æWNÀÅÎj›rz NÀÅί”DD©íb@Ý©-‚@@©¿G@¹©­\@G©­\@i©í{@(«m$@  ›rz ¯” $Á wwwwwww, @©¿G(«m$D©íbG©­\i©í{¹©­\"Ý©-‚°WNÀÅÎR›r{ NÀÅί”D¬-@@©¿G@U«-‚@e©-P@ ›r{ ¯” Á wwww @©¿Ge©-PU«-‚¬-ÂWNÀÅÎZ›r| NÀÅί”DJ©m$@¬À@@©¿G@©,@=ªÐ@ ›r| ¯” Á wwwww  @©¿G=ªÐ¬À©,J©m$ÄWNÀÕ:=u=NÀÕ¯”D =u< \̪u h¯” =u<`à +æ‚3‘”à �3Ãå†Î@à Çà‘‘‘‘‘‘‘‘ð†à Ãå†Çà‘”‘”‘”‘”‘”‘”‘”‘”ó†Ö ‘” ‡vW ÀEÛz±u샠ÀEÛ¯”Dô¨8^@È«Lq@©`T@@ª¿.@œ«w@#©àe@”¬®s@"©ðs@ɪØh@=ªx@© @C©WT@R=ªh@œ«ZX@Ý©[}@̪a @¬ðs@ ±uòƒ H©òƒhà=ªÐh¯” ±uòƒ€Æå5Š,æwæw€õ‹,w.æw€œf,5Š-÷ †– w,µ,÷ z@0A.W­8õµ,@4A2Ã÷ †S=ªx @ª¿.=ªh @ª¿.,ô¨8^& 0@ª¿.D© |Ý©[}€|wöúÿt÷ 6€œÀÅÿf,5Š-÷ µ,æw`‡4 ñÕ Â÷ ­ƒÂt ÷ G‡õŠ8°æw†HɪØh.©`T6#©àe¬ :@ª¿.RC©WTlœ«wx"©ðsî |@ª¿.€ø>€õµ,p.p0 p2p4 õµ ,`B‚mCí:°m÷ @Âe ÷ †ƒ ƒm Ãe€,õÅ,õPÈ«Lq€tL5Š-€W-LfLfNÁ 4 ÷ Á ÷ 4 °ˆ5 6õ•,&�#õµ , œ Žtt õµ,,œ«w8œ«ZX€ðt4t2t0t.Ž 4 u6ñÕ Â÷ õµ, ÷ †– wHÿæw´•†õÈù.ô‹Bm:´œÂeÁ%8C©WTHœ«wT¬ðs> X@ª¿.6€laÃ÷ õ•,4 ñÕ u6Â÷ ­ƒÂ÷ †wÖþ4 õL5Š-ÆefLÖ wB@‚œ ‡÷ ‡Ñ•ô‹̪a .C©WT@œ«wb”¬®sdèÂeQ�-�õµ ,ѕѕ€œœ°ŠÃ÷ CÃeö Q�Q�CB÷ ‡>̪a `̪a òWNÀÅÎz1ul†NÀÅί”D ©S~@1±o†@ ­XT@ ­WT@£« N@�«)x@£rœQ@ 1uo† €�«Kqhx©R~h ­ZTä` ­WT䞯” 1uo†€ÁÉ ÷.÷w„4 ô€÷.‡C3 3 ó€ó €É,Ä, ÍUóE€s3w&æ&D1±o†�«)x.1±o†£« N4�«)x.61±o†:1±o†z�«)x&~�«)x&|1±o† ­ZTPP8 1uo†8XX> 1uo†>\\ ­WT ­XT ­WT WNÀÅÎz1uo†NÀÅί”D”¬t!@¼©õ‡@j¬õ<@J©Å00&_�TADATADATADATADATADATADATADATADATA@i©5u@ ©S~@R«°'@ò«ˆ@D©Mw@ï[Œ@È«õ @•«õ @z ©µ�@«µ�@�«)x@Óªè�@á[o†@£« €@(«$Hp©Åœ@§«õ<@(«X@£rœQ@©õ#@•«µO@ 1uo† :z�«Kqhx©R~h ­ZTä& ­WTätBu;T x�«Uqh�«Iqhd�«{h0�«ö&hD�«T[h\�«\gh8�«u'hT�«åhH�«ñ�hl�«h z�«!thX�«U(hL�«™’hh�«‰wh�«E`h�«œ,h4�«¯h(�«„!h�«&h,�«Ayh`�«•h�«Ä…h<�«"h �«#h$�«:dh"�«Vqh�«TqhP�«Ôh@¯” 1uo†>w× ±&À ‡7.ð*†ð.€‡æÎeüÿž.J£« €ï[Œá[o†�«)x.* á[o†&�«)x.(á[o†0�«)x<�«)x. ­ZT"" 1uo† 1uo† ­WTP(Pvò«ˆ©õ#•«µO ¼©õ‡ §«õ<«µ�È«õ •«õ j¬õ<p©Åœ ©µ�R«°'(«XJ©Å i©5u"”¬t!$D©Mw&Óªè�Bu;T|æ5æ3æ1æ/æ-æ+æ)æ'æ%æ#æ!ææææææææææ æ æ æææææÎáÎerwz ©S~úWNÀÅÎz1us†NÀÅί”D£«ày@ ©S~@ ­XT@ ­WT@£rœQ@ 1uo† �«Kqhx©R~h ­ZTä` ­WT䞯” 1uo†wÞ v £«ày ­ZTZ Z$ 1uo† ­WT ­XT ­WT ²WNÀÅçz5uË–NÀÅ篔D”¬t!@5¬!™@�«Kq@ ©R~@R«°'@D©Mw@ï[Œ@æ[L @Óªè�@x©R~@ 5uË– z ©S~h ­WTät ­WTh ­XTä ­XTh ­YTà ­ZTäd�«)xh ­HTà�«¶{ä�«·{à�«¸{ä�«¹{à�«º{ä�«»{à"�«¼{ä�«½{à�«¾{䯔  ­WTff R«°'n n”¬t!D©MwÓªè� ­XT  ­ZT  5uË–  ­WT ( (ì 5uË–ì66’6 �«¶{ �«¸{ �«º{ �«¼{  ­XT 5uË–’TT``Üø 5uË–Ü 5uË–ø�«¶{  �«¸{   �«º{  �«¼{ 5uË–€�¦æ&fÃÑ BÂ%p÷ ÜÀ˜þ… *ƒÅ Í‹'Â% Í¥!‡Í¥EÀàúÂ%,‡À€ý… ƒÅ D„Œ†„ŒÀ5 ‚‡õ¥  õ¥PB   ­ZT€|Ä2Ì +þÂ%pÀpÿó‹Jð�͵üÿ æ æ)ÿˆæ æÿˆòÀÐÿÄ‹Þó5Jà³ J€÷ ó JË ÷ v÷ ü…„ƒ‚�€‡Å ÷ @V�«Kq€øKÅEQIÉåÍ@37ó5Jµ³ JD¸ÿÀ4È Ê5@÷ ÷ À4 È ó JË @ºÿµ ºÿõÅüÿ´ÿEÍ¥ ‚A�†D ©R~Jx©R~€tA� ƒÁ É  ÃÁÁe@¯‡f&æ¦f… 6 ÃóU€J÷ F÷ ^ÿæ æ!ÿˆ÷E€J÷ �‚ƒ„…€æsÿˆ&ÀðÕ€÷‹J�.  ­ZT 6 ­ZTT ­ZTJpï[Œxæ[L | ­ZTJ*ðæeÿˆ ÷‹J�æcÿˆ&ÀðÅ€€‡ ­ZTJï[Œ$æ[L �WNÀèÊz=uÄNÀèʯ”Ds©À�@•«¸.@ ­w @ ­| @ ­x @ ­{ @ ­y @£«`"@$9Î…@@ªR~@�«—y@ ­z @z È£«àyh  ©R~h@©¿Gh�«Hwh=uà ž•«ºWhú © }h ô¨8^hȽ«v~hÈ© h”«úvh¯ªÿh8�«¹.hÊD©öqhÈ”¬ôh]ªÿfh¯” =uÀ5LÁxÁn÷ füÿfÁ �eÁañ æÎEÿN�ŠÁÎe ¦ŠÀÅåLuHBw EÅ AaÁañ Á&ÎEÿ„CÎŽ Ž æÎeÖ.*E�c÷ Ö6•«¸.$Z J�«—yV6P pj €|Ö {XE"Ö ‡Q�c÷ À æ & &fæ€& æÎe  Ž Ž Ž Ž Š…fæuÿˆN‡Æe‡‡æ.æÎeÖ.(÷¦¶öPæ(Îe¦æXwZÐ €ø$æ^çæ`äߥ(æ1ÿˆ& & & & ¦ Ž Îe[K¶ Î[qæ›r& & æŽaæ9ÿˆ‰ ÆeÁ Ú‡É ß‡Á% µÀäûþó Næ,Η%$$9Î…s©À�.tó‚æÎeŽ%û PÁÑ  Ä Ä ýw z ,£«`"€–%ö  .wfwwX¶¶€æŽa† ¶^ććććććýÁ‡Á‡ýÁ‡Á @ .=uÃf@ªR~=uÃX< ­w B ­x H ­y N ­z T ­{ Z ­| €|‡Á ‡ýÁ‡Á‡Á ‡ýÁ ‡Á‡Á‡ýÁ‡Á‡Á‡ýÁ ‡Á ‡Á‡ýÁ$‡Á$‡Á€ø ‡ýÁ(‡Á(‡Á ‡ýÁ‡Á‡Á ‡ýÁ‡Á‡Á‡ýÁ‡Á,‡ýÁ0‡Á<‡Á8‡Á4‡XtÁ@‡ÁD‡Á‡Á,‡Á‡Á‡Á‡Á ‡ÁH‡Á‡Á ‡Á ‡Á ‡Á00&g'm 1g ‡úWNÀèÊz=uÌNÀèʯ”D•«¸.@ ­w @ ­| @ ­x @ ­{ @ ­y @£«`"@–©ZŠ@@ªR~@�«—y@ ­z @ žz£«àyh  ©R~h@©¿Gh=uà „•«ºWhZ © }h ô¨8^hT½«v~hT�«Hwhj© h”«úvh^¯ªÿh4�«¹.hVD©öqhT”¬ôh]ªÿfh¯” =uÀ5LÁxÁn÷ füÿÁaAwæÎEÿN�ŠÁÎe ÀÅåLuH w ÁaDÁE{X‡{.{^{`Àäûþó Næ,Η%ó‚0•«¸.$ $–©ZŠF�«—yLF |û Pw £«`"ûwjw=uÃj@ªR~€wb      $$ ((  ,0<84@D,.=uÃb ­w  ­x  ­y  ­z  ­{  ­| � H   hWNÀèÊz=uÓNÀèʯ”Ds©À�@•«¸.@ ­w @ ­| @ ­x @ ­{ @ ­y @£«`"@$9Î…@@ªR~@�«—y@,ªPd@z ­z @ È£«àyh  ©R~h@©¿Gh�«Hwh=uà r•«ºWhð © }h ô¨8^h¾½«v~h¾© h”«úvhö¯ªÿh8�«¹.hÀ"D©öqh¾”¬ôh]ªÿfh¯” =uÀ5LÁxÁn÷ füÿfÁ �eÁañ æÎEÿN�ŠÁÎe ¦ŠÀÅåLuH=w EÅ AaÁañ Á&ÎEÿ„CÎŽ Ž æÎeÖ.*E�e{X6•«¸.$Z J�«—yV6P pj €|E"Ö ‡Q�c æ & &fæ€& æÎe  Ž Ž Ž Ž Š…fæuÿˆ%‡Æe‡‡æ.æÎeÖ.(÷¦¶öPæ(Îe¦æXw$æ^çæPÆ v$~ø`äÁ% ÞÀäûþó N/æ,Η%ó‚æÎeŽ%û PÁQ4& ߥâæ1ÿˆ÷ ˆ 8àPKQà›r 8&æ9ÿˆê‡„ Ä%솀w., D$9Î…Fs©À�R,ªPd|£«`"€–%ö  .w wwü¶¶€æŽa† ¶^ććććććýÁ‡Á‡ýÁ‡Á @ .=uà @ªR~=uÃü< ­w B ­x H ­y N ­z T ­{ Z ­| €|‡Á ‡ýÁ‡Á‡Á ‡ýÁ ‡Á‡Á‡ýÁ‡Á‡Á‡ýÁ ‡Á ‡Á‡ýÁ$‡Á$‡Á€ø ‡ýÁ(‡Á(‡Á ‡ýÁ‡Á‡Á ‡ýÁ‡Á‡Á‡ýÁ‡Á,‡ýÁ0‡Á<‡Á8‡Á4‡XtÁ@‡ÁD‡Á‡Á,‡Á‡Á‡Á‡Á ‡ÁH‡Á‡Á ‡Á ‡Á ‡Á ‡ÔWSÀèãzBu�SÀè㯔D5¬ ™@´:2“@´:òs@ɪ°h@�«7x@Y¬±}@.ª°@´:+…@,ªPd@ Bu� –l¬‡ h$*l¬À h$³ª4}h‚”«‡ h”«€h¯” Bu�€‡÷ j�P PH Âæ úæ÷ H�P PH ÂæùæfñÕ ÷ �ñÅ È%€ù–5wì÷ ƒ÷ —# úòµ ´:òs>´:2“T�«7xlY¬±}r.ª°€|5 È¥öÿð ÈÈ‹5œÈ‹1ñÐ ÃñÀ È1ñµ€ "òµ€Ã×# úñÕ€ &&÷ pp Âf÷ N5¬ ™h,ªPdx´:+…~�«7x€ø�°ˆ'¢åÿÈ`ú0 ¢öÿȰýÃñÀ òµ 0 òµ€ð Í’ðˆòµ€ÄÖ ‚&f�÷ �€0 öÿ&V ‡ƒ&jɪ°h&töÿ÷ ÷ K&Àæ1ÿˆÀ û€‡ɪ°h,ªPdj�P PH Âæ úæ÷ H�P PH ÂæùæfñÕ ÷ �ñÅ È%€ù–5wì÷ ƒ÷ —# úòµ ´:òs>´:2“T�«7xlY¬±}r.ª°€|5 È¥öÿð ÈÈ‹5œÈ‹<Á0ÀV 0 šä°fP{ô&{/¦{®S{hgZë¨Û&lô¨" èô¨T^ô¨Vèô¨M&lô¨£sèô¨¦sèô¨©sèô¨²sèô¨¸sèô¨ú¢èü¨›r&l©Îq&l©áDÂC©< $JC©8èC©29èD©0X^D©ZèD©ØZèD©ÅbèD©ìq$JD©MwèF©o'&lF©›'&lF©›r&lF©2€DÂF©dŒòG©?f&lG©Ef&lL©yqDÂL©UsDÂa©àd^a©we^a©€eèa©×f^a©µh&le©ø6Ve©a6Ve©Û6Ve©Ì6Vt©[S&lt©S~$Jx©R~^x©_~$J–©âD–©ZŠèš©s6V ©r;6V¼©4D¾©<&l¾©Á&l.ª°è6ªÆ8DÂ7ªšwè@ªR~è@ªS~è}ª[ž&l¯ªü$JÓªè�D00'o�TADATADATADATADATADATADATADATADATAÛªs,&lÛª•.&lñª[S&lÿª &l«’f&l(«$V‚R«°'RJR«|dDÂR«£d6VR«&l“«›‹6V”«ìv$J•«¸.è•«¼.^•«¬W$J•«[l&l•«Qm&l•«n&l�«¼.$J�«KqV‚�«šw6V�«@xè�«—y蟫 f&l£«`"褫T^¤«V褫;^¹«hй«iй«jй«kн«l~$JÆ«8DÂÆ«¡DÂÆ«DÂÌ«Õ&lÍ«[S&lÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ00'wm 1gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|#|8e¦|:eZ|þv“w “x Þ1u,…YX1u.…Z®1u/…\†1u3…_1u¤…`D1u¦…V‚1u§…bV1u«…e*3u|Kè3u[ò4uÃ$J4uÌ%Œ=u\HD>ur'DÂ>uT(X >u\(6V>ud(&l@utqRJBuÛ^BuÜ BuswèButw!Ôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ00'�TADATADATADATADATADATADATADATADATAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦UÄŽ€»|#ÄŽ€»¯”L {4f€���C~�‡w€ �‚ ”‚~@‡¹«hŠ"¹«hŠ@{80{ô&h{®Sh´UÄŽ€»|8eÄŽ€»¯”L {Jw‚ ƒ €À5’ÀEÿö5 ÂeÂàÃått‡ÁÿÿCtt@@‡¹«iй«iŠ@{8F{/h´UÄŽ€»|:eÄŽ€»¯”L {JwƒÃ5Â’ÂÀÿÿ6t @ vtB@A € 6t@@PÃ5‹�‹€ ‡¹«iй«iŠ@{8F{hghÐUÄŽ€»*|þvÄŽ€»¯”L({8F*¹«kŠh*¹«hŠh¹«jŠh¹«iŠh ¯” {*¦f�Þ ¦æf�Þ ¦æ&f�$&Þ ¦æ&ff� Þ …„ƒ‚�‡ UNÀEÂz“x NÀE¯”DR«£d@ ©r;@e©ø@e©a@e©Û@e©Ì@@©¼G@“«›‹@š©s@ (“x ¯” ,Áwwwwwwwww8 @©¼G“«›‹R«£de©Ûe©Ìe©a"e©ø& ©r;*š©s UNÀ¨Äb3u|KNÀ¨Ä¯”Dô¨¦s@ô¨²s@�«@x@¤«V@ 3u…K ^D©ÅbhD©Mwh¯” 3u…Kb÷  ûÍ¥#@>ÈEüÌ5uu÷ ú÷ 5 wÀ°þ†õ �5u‡¤«V:ô¨²sBô¨¦sJ�«@xRUNÀÅÎJ3u[NÀÅί”Dm© …@ 3u[ RF©dŒh¿s°<¯” 3u[€f&æ¦f&6 …föÿ�fà I˜à ü% % % %  …µöÿ€�‚ƒ„…‡�Ã÷ Ðà üBÄÄe !¥!£!­`�Ô •ô¶ b\ €|Úuþÿ Í5à À%€ ƒ Í � � Ce÷ |Í ç å‡Í`Õ %%à#Þ #Ü$)ÅåfC ÷ Ae@ C÷å�t% å.åÄÀ fU U \m© …^øU M …U à B †Õe˜U M …Õe€–U U M …À é�­‚D˜Äå0Ä% ¤‡%D˜Äå0Ä% �‡Ä aÄ Ä aÄÄeJZ2L ¿s@NAJBEFRAMRPAYAMNUJLUJGUAPESTCOVONCEDm<<¤UNÀEÂr=u\HNÀE¯”Dô¨¦s@D©ØZ@7ªšw@C©29@@ªS~@ô¨V@C©8@ =uYH ¸Óªè�h¯” =uYH€Å‚€ÎdÂåøÿ‚Îb‡D ÷ DÌÿ/ÍðøÄ5%“ÂÁ Í þÁ%‡Á%Ò Ò  S0¦ÓÔÓÔŠã8cPÁ ÝÍ@û�"‚s‹�ŠÍ°üJ C©29€|ÐD¸ÿÎ%b †ôµàÍÀÿ³Œw ÷ †w5¸ÿÌ t�çÿBÄÿÎhõ¥´ÿ?Îlõ¥´ÿLÎjÂU@�ÉÿÍ0ûÀ5Â5 *C©80ô¨¦s67ªšw€øÎÀ¥ ‡ ƒÍ þó ÍÀÿ³ŒwÍ@ûËúÍpúKÊÿËË5ðòË¥t�äÿ)ô•) Ðô‹Â5ÂUÍpýÂ5ÀÙͰùÂ5�Ô´�&D©ØZHt@ÎÿAÐÿÍÿÁ5ÇÍÿÀ5ÂÌU4 HÁ÷ ·‡&æfw6ô¨VF@ªS~.UNÀ¨ÄzBu00'‡m 1gswNÀ¨Ä¯”D5¬ ™@½«v~@�«¹.@D©öq@]ªÿf@ Buœw ˆô¨¦sh‚ô¨¸shüô¨²shxô¨£shŠô¨©sh†z•«¸.ha©€eh⣫`"hD©ØZhÆ7ªšwh”C©29h’–©ZŠhÂ�«@xhФ«Vh&ô¨ú¢hÎ@ªS~h¸@ªR~hðô¨" h".ª°hô¨Vh$"C©8h¶D©ZhÊ�«—yhò¯” Buœw€óN³*•PU5DÕ Åe0Á  Ì üS÷  æÂå,‚¦ærwt Ž`‚ ‚ Âå4†@ØÿÍ€ý€ ƒÀ È%P÷ $÷ ‡05¸ÿ.½«v~€|ÈEÿß6É5ÍÐÿQÍÀü„ MƒÄ Ì¥ IÌ5òÀ 5¸ÿAç‡@Ípü€ 8ƒÀ È¥ 4È5Ý ÷ ¶ÿÂ% ‚ÎDŽ`ÍPù�‡`_ ,€ø/O&PXVUTSÁEöÿͰúÁEýÿuÊÿÎÿBÎÿ‚ ƒÈ5 =Í�ü/5 Ìÿõ Êÿ*Í@ùõ Èÿ%ÁEýÿ ÁEþÿ ÁE÷ÿõ ÎÿØ M�ÄÿÍŠ õ Ðÿ€t ô¥ ƒÍ`ü ÍŠ ÍÐúuºÿÁEûÿÁEïÿÈ5 ÃÍpýÁ ñÈU ÷ J�wÍÀýuºÿæpô÷ 2ÌE÷ # ÷ ÷ £ Æ*P]ªÿflD©öqxD©öq€ð‡&æf…Þ ƒ„…‡ÃÃÅD¸ÿÌ¥ ‡ w Èÿ÷ Øÿ„f÷ 2� ƒ& ÷ ¤‚‡2r€‡÷ †¦�‚÷ €‚5¬ ™€lÀ4 Á À8Á À<Á0w dÿ&Î�¦÷ lÿ „‚ ÷ &�•ƒap ‡…•aB#EÕ û� ÷ *‡�  Á ýÍ þu¼ÿ€è‡ÀDÌ5ÀeÀàÀ`w ðþÁeÁE<ó .¦f÷ �‚2  ,ú‡Â °,ôƒñÄ€pà l‡€ û‚Œ4�«¹.(dJ aƒ †¤´bõ„!ò‡±‡HUNÀEÂz“w NÀE¯”DR«|d@©á@F©2€@6ªÆ8@@©¼G@Æ«8@¼©4@Æ«¡@L©yq@–©â@Æ«@L©Us@ 8“w ¯” <ÁwwwwwwwwwwwwþJ @©¼G©á¼©4F©2€R«|dÆ«"L©yq&L©Us*Æ«8.Æ«¡26ªÆ86–©âBUNÀ¨ÄzBuÛNÀ¨Ä¯”Ds©À�@5¬ ™@$9Î…@D©ìq@ BuÜ >•«¼.hTa©àdh¾a©weha©×fh*¤«;hÔ¤«Thà"ô¨ThÚx©R~hnD©0Xhp¯” BuÜ€÷ PÀÐ 4Ð P æÿˆ †Á—æ1ÿˆÁ¥õÍ€ùu‡À(A“ æ æ)ÿˆæ æÿˆó‡ÃÃÅD¸ÿÌ¥ ‡÷ àÿ÷ hý‡Ì5 s©À�*$9Î…Z5¬ ™€|uÎÿuÐÿ÷ <úõ¥#´ÿAþÿùÅüÁ0À<÷ Î5 ¸ÿ÷ ’ÿÌE÷ # Æ*‡ÁAÁ( w D÷ jÿ!Á55 ¸ÿRD©ìq€ø„À8� 8‡"À4 ûpþÿ÷ „‡ŠÁ ý¦0 4 5 �  ÷ N‚‡"¢ ; þÿ‡B ü�‚÷ ,B D!5 À4Á€tÄe !ûµ ÀDÌ5ÀeÀàÀ`w †ÁeÁE<ó .¦fû .�‚2  ,ú‡Â °,ôƒñÄ€pàRð l‡€ û‚ŒJ aƒ †¤´bõ„!ò‡±‡&æf…Þ ƒ„…‡4UNÀ¨ÄzBuÜNÀ¨Ä¯”Ds©À�@5¬ ™@•«¬W@½«l~@$9Î…@¯ªü@”«ìv@C©< @D©ìq@ BuÜ Ô•«¼.hêJa©àdhTa©weha©×fhÀ¤«;hj¤«Thvô¨Thpx©R~hÐD©0Xh¯” BuÜ€÷ æÀÐ 4Ð PÈJ!Ì €÷ 3  ó‹H�Ë æÿˆ †Á—æ1ÿˆÁ¥õÍ€ùu‡À(!Ì €÷ Â’4€á€ €¤-‡�’ÀŠý‡&C©< Bs©À�L$9Î…hD©ìq€|æHÎE}ÿó H÷ ÷ A“ æ æ)ÿˆæ æÿˆóÖ å÷ ³ Hsþÿ3(÷ Aüÿwþ³*SAÁe@”``fÀ ýëÃÃÅD¸ÿ&D©ìq•«¬W:”«ìvJ½«l~R¯ªüt5¬ ™€øÌ¥ ‡÷ àÿ÷ hý‡Ì5uÎÿuÐÿ÷ <úõ¥#´ÿAþÿùÅüÁ0À<÷ Î5 ¸ÿ÷ ’ÿÌE÷ # Æ*‡ÁAÁ(lD©ìq€t w D÷ jÿ!Á55 ¸ÿ„À8� 8‡"À4 ûpþÿ÷ „‡ŠÁ ý¦0 4 5 �  ÷ N‚‡"¢ ; þÿ‡B ü�‚€ð÷ ,B D!5 À4ÁÄe !ûµ ÀDÌ5ÀeÀàÀ`w †ÁeÁE<ó .¦fû .�‚2  ,ú‡Â ll°,ôƒñÄ€pà l‡€ û‚ŒJ aƒ †¤´bõ„!ò‡±‡&æf…Þ ƒ„…‡vUNÀ¨ÄzButwNÀ¨Ä¯”D5¬ ™@½«v~@�«¹.@D©öq@]ªÿf@ Buœw Ôô¨¦shÎô¨¸shHô¨²shÄô¨£shÖô¨©shÒz•«¸.hRa©€eh.£«`"hD©ØZh7ªšwhÚC©29hØ–©ZŠh�«@xh¤«Vhrô¨ú¢h@ªS~h@ªR~h<ô¨" hn.ª°h`ô¨Vhp"C©8hD©Zh�«—yh>¯” Buœw€óN³*•PU5DÕ Åe0Á  Ì üS÷  æÂå,‚¦ærwÀ Ž`‚ ‚ u½µÿÆÿ€ó J AÁeLK›UËŠý€õ#ÂåE†@ØÿÍ.½«v~€|€ý€ *ƒÀ ÁåPÁ5ÿ"÷ <÷ "‡05¸ÿÈEÿßBÉ5ó J õµ´ÿó‹H€Ë‹ÍÐÿQ00'��TADATADATADATADATADATADATADATADATAÍÀü„ MƒÄ Ì¥ IÌ5òÀ 5¸ÿ€øAÛ‡@Ípü€ 8ƒÀ È¥ 4È5Ý ÷ ¶ÿÂ% ‚ÎDŽ`ÍPù�‡`_ ,/O&PXVUTSÁEöÿͰúÁEýÿuÊÿÎÿBÎÿ‚ ƒÈ5 €t=Í�ü/5 Ìÿõ Êÿ*Í@ùõ Èÿ%ÁEýÿ ÁEþÿ ÁE÷ÿõ ÎÿØ M�ÄÿÍŠ õ Ðÿ ô¥ ƒÍ`ü ÍŠ ÍÐúuºÿÁEûÿÁEïÿÈ5 ÀðÍpýÁ ñÈU H ‹ ÷ J�wÍÀýuºÿæpô÷ 2ÌE÷ # ÷ ÷ £ Æ*‡&æf…Þ ƒ„…‡ÃÃÅD¸ÿÌ¥  ]ªÿfud(ûÀ@Q¯”L L«{;×û˜î¨$«€        ! "3ÿ  €”  .    1 0  (   2€\ (ÿÿ(  )ñ €Œ8ÿ  vÿï4() €     * .3256 5 ÿ€„     E€A) Ò(ÿÿ'1ÿPHÿî €|?1þ[ÿïî $?1ÿÿ@î €ø0@` $`B 0 $Gt0® Dz€¶Ô $2/¸ €  ä  (þ h : € È n Â î  z5¬ ™@a©we@¤«T@ô¨T@x©_~@“«›‹@©á@R«£d@¼©4@R«|d@Æ«@L©yq@L©Us@Æ«8@Æ«¡@Aÿÿÿÿÿÿÿÿÿ        6 G©ã(wÅåKBÄ„`C™ƒ ƒ ÃEÀÿÁÁ ÀÀe¹«jŠ$@` œþÿÀÀe" l0@`2œþÿ£ÿõâLô•ˆÁ ÷ ô‹€Á$÷ )Áÿÿ× × ×  ¦÷ Ö Á Ì‹ ÓÀ ÁÁe. (x©_~6x©_~ ˜@`ÁÁe†–  lþÿÂÂeNž dªBb&þÿÊ Ö éÁ"÷ ‡wÆå@ Ãe" ‚`Á`JÀe ö€$° ÀÜÀ À ÁÁe¨ x©_~¹«iŠ  @`ÁÁe† lþÿÂÂeN €Bb&þÿÊ Ö èÆe‡fÀþÿ@W,Tð•ð•�‡wÀþÿB� & æNSæRæÿˆñf÷ Âe00'—m 1g @Ü À  Š  5¬ ™B¹«iŠF5¬ ™€˜2�òÕ€Á$÷ Ê•óT2ŠÖ ‡wÀþÿAB & æNS& Nœæÿˆò¦÷ ÄD` €Ü À 4�ôՀ̕Á$÷ x©_~,¹«jŠ05¬ ™€Ì•³ T4ŠÖ ‡wÀþÿ@Á` @ÜÀEßÿ —,TÉ•‡ ЇwÀþÿA1Š@ ð&÷ 2 T1ŠÖ ‡ x©_~¹«hŠ5¬ ™R¹«hŠV5¬ ™€�w¦)v€& €0Š €Á�cfp €ðµ ¦÷ € Îe$÷ €° wˆB“‚ ‚ ÂEÀÿ— ] DÝÃÿÿ! ¹«jŠB¤«TRô¨T€ 1 €0 €0Šæ& ÷ � € 1œ € 0 5 LÎ& ÷ ÁLAaÉ € 5œ1 Æe! æ÷ €ð €ˆ€5œ1Ö €0 €0ЦÎe ÷ Ö — <æŽa÷ €ð‹ |�Ϊ÷ €ð‹ s�€p�€pÝ€p�€ PL«{;ª€p�0)€p�1(ŽÎe ÷ ά÷ €ð‹ K�Ö €°/ 5 L¦÷ € ÷ €° õ L€ð•‚ *Ö æŽa÷ $L«{;¬L¤«TXô¨T|€€ð‹ �„! €ð•„ 5NõUpN>! Ž÷ ÷ €° €ð‹ €€ð•Á$÷ €0Š �ÀÀe<¤«TBô¨Thx©_~€øB“‚ ‚ ÂEÀÿ€`1œüÿÆe ‡f�õ‹ IÉe$W­@ W­1ƒ @Ý1t  Ée$W­ @Ý0 `W"É�‡wRö ~¹«jŠ€t¦)v€ „Äe"fÎe4ð ƒ`ÁÁe`K’€  õ€2 € €0Š 5 LÁ÷ €ð‹ €æ wn¦ ÷ 6¤ hx©_~€ð€ð‹ õ�¶Ÿ6ŠÃÿÿ—-  €ð•‚ Á÷ —-w ΦÁ÷ €> €° €¬¬€x©_~8x©_~Vx©_~€l¬€ð•„ €5œN5ŠOõUNT€¬ †€ð•„ €5œ N5ŠOõU N>€¬ ¬!†€ð•„ €5œ!€èN5ŠOõU0N$õµ " AÝÁ ̵W ̵ W ̵ôµ €ð•„ õ@NÖ Ö Ã €ð•� õLÆe‡wÀ|¹«hŠ€dAB ð TÀ@`ð‹€ðµ È•ðµÈ•æ È•ò¦÷ Ö ‡w¦)v€0 €0Š 5 L5 N5 5 €5¬ ™T¹«jŠ€à 0 æ4Naæ:Na„ÀÀea>¦Á ÷ €¬ 7‡Âÿÿ@“ÀEÿ ( ƒ€ð• Î &Á÷ € ð•þÖ "Pü 4x©_~nx©_~€\@“ÀEÿ , €ð“Î &Á÷ € ð•Ö  €týÿ€m¦ÎEøÿæ& ÷ ÆeÀ w,€0 5 L5 N— — 5CÃeL&x©_~P{/.ØÀÀe6¶`Ë5v€ð‹ q� €ßÀ ÁÁeÔÚ  @`ÁÁeþ  € lþÿ Nœæ÷ CÃeLË5Ž&Á÷ Ö Ö ÕÃÿÿ —  €pŽ&Á÷ Ö — —  Ž&Á÷ Ö Ã +€   .x©_~Xx©_~tx©_~,† ¬ †@“ÀEÿ ,ÀÀe€`’ÀEÿÀ ÁÁeÔœ  ® @`ÁÁeþ¬  R¶ lþÿ Nœæ÷ Ž&Á÷ –%€ð‹ f�‚ — w þÁ÷ €ð‹ W�ÀÀe´  "x©_~Bx©_~8 a>ŽÁ ÷ €0 Ž ÷ €ð‹ =�ÀÀeR  x©_~(x©_~€8  �ß@` ÒWtýÿ�mN&’ÎEøÿæ& ÷ ÆeÀ Ž&Á÷ € ð‹ �—¯—¯—¯ Ö Ö ÀõL€0Š €ð‹ä6  *{/@x©_~~´ �@“ÀEÿ ,@“ÀEÿ €ð•€0ŠÁ$÷ Æe ‡wf€ 0 €0Š ÄLDa 5 N5 5 Ã4CaæÎ`ÀÀe:x©_~D¹«jŠ€. €m  €týÿÀ`&¦ÎEøÿæ& ÷ ÆeÀ — Á÷ — Á÷ — Á÷ €ð‹ u�‚ — ÑÁ÷ €ð‹ h�,P,  ({/>x©_~Lx©_~Zx©_~tx©_~<ª €0 €0 ÀÀe€m ¦ ÷ €ð‹ J� ‚ßÀÀeR¼  &x©_~€â €` ÒWtýÿÁ`N&’ÎEøÿæ& ÷ ÆeÀ *— ŽÁ÷ �€1œ 1Š€0— Á ÷ — Á÷ €ð• &äà  "{/–%‡wæ ÀÂeÁAÃACÁƒÄ!P¹«jŠV5¬ ™€Â!2Rrœ2Š2Î Ž`þÀ�` Àe ø!þ ò! òHæÁ÷ Ö !ò!jx©_~ze©Û@e©Ì@e©a@F©2€@e©ø@6ªÆ8@–©â@ ©r;@š©s@{/@¹«jŠ@¹«iŠ@¹«hŠ@L«{;¸XF©o'hzF©›'hü¨›rhhë¨Ûh:F©›rh€}ª[žhÈô¨MhnÍ«[ShÂt©[ShîR«hñª[Sh6Ì«ÕhNÿª h†•«nh®Ÿ« fh¸•«[lhÔ(>!ò!!> 2 Ö ‡ L«{;NN0 PX R¾ T( V` X� Z^ \² ’² Ȳ β ² "² Tò  Zò  `ò  fò  lò  r² €² G©ã‚‚>†J îâ ‚N (´ PŒ ~ ´\Æ¨ØØ ð(ˆ€î¬$ ÀÈ  Š2dV@ú”ZÛª•.hä•«QmhôÛªs,hþG©?fhG©EfhRG©ã8ba©µhh©Îqhô ¾©<hÞ ¾©Áh˜«’fhÒlV «À@Q>u\(«À@Q¯”L L«{;€ðÿàÿÐÿÀÿ°ÿ ÿ�ÿ€ÿpÿ`ÿPÿ@ÿ0ÿ ÿÿÿÿðþàþÐþÀþ°þ þ�þ€þpþ`þPþ@þ0þ þþþøýðýàýÐýÀý°ý ý˜ý�ý€ýpý`ýXÿPý@ý0ý ýýýðüàüÀü°ü ü�ü€üpü`üPü€|@ü0ü üüüðûèûàûÐûÀû°û û�û€ûpû`ûPû@û0û ûûûðúàúÐúÀú°ú ú�ú€úpú`úPú@ú0ú úúúðùàùÐùÀù°ù ù�ù€ùpù`ùPù@ù0ù ùùùùðø0þ˜û°þ˜û(ü˜û€ø˜û˜ûXÿ˜û˜ûœý˜û˜ûØûdû˜û˜û˜ûdû˜û˜û˜û˜û¨ù¬ùý˜û˜û˜û˜û˜ûPû˜ûøýhù˜ûàøðü˜û˜û°ý˜û@þ@þ@þ˜û˜û˜û˜ûðüðüù˜û˜ûü˜û˜û˜û˜û˜ûýz5¬ ™@a©µh@«’f@©Îq@¾©Á@¾©<@D©0X@a©àd@¤«T@¤«;@F©dŒ@Ì«Õ@ÿª @•«n@•«[l@|t˜ûðü˜û(ùðü þ˜û˜û˜û˜û˜û˜û˜û˜û˜ûðþ˜û˜û˜û˜û˜û˜û€ý˜û˜û˜û˜ûxû¸ÿôýäû˜ûXû û@ü˜ûúÈù˜ûHù˜û˜û˜û˜û˜û˜û˜û˜û˜û˜ù˜û˜ûdû˜û˜û˜û˜û˜û€ý˜û G©ãrwfBÂe6 ƒßÁÿÿ×  ×  ÷ €ð• @LÀEÿ  `€ð•‚ ×  ÷ Á €ð‹ÀÀe¹«iŠnÀ`’ÀEÿt€m ÁÁeÛª•.l û„`JÁÁeÌ«Õ ‚ ý€Ž`ræ¦÷ –%Ö ‡f@ I,ñf÷ 1 À @`ð‹  A1œ ñÕ€ @0Š Ö @0Š �‡wÆå6 6 Ì«Õ Œ 4«’ft¹«jŠ, @6 ƒ&ÄÄ` ÓÀ ÁÁe@`ÁÁe$Ûªs,( ÿP2lþÿf& & & €&ÂÂ`ÊEæÊ5 —¢ÿ ¶’6Šöe Š ÓÀ ÁÁea©µh0 ÿ ~@`ÁÁeÛªs,| €†lþÿvœ6жöe€ÄEÿùÁÿÿ! 6œ6œ! 6œ6ŠÁ € � ìv¶-€ €í6 a©µh„ ý€w(ö5 �ŠÁ€ 6 6 þµ ;¶  6 öö� € flæŽaæ(ŽaæŽaæ÷ ¶&ö"΀~"Ža÷ @°,*°,,ðe,Æe w@„ Ê5=€týÿÁ"�a@` �Ò�-&¦ÎEøÿæ& ÷ Æe ~†ÊE&¦ÎEøÿæ&  ©Îq`{/€ú÷ Æe †ÊU&æ÷ ÊEÊU&æ÷ –%\ö ö,€týÿ€c&¦ÎEøÿæ& ÷ 6ö €týÿÁ*�a@`¦ÎEøÿ{/\{/€væ& ÷ 6"¶]"ÆeÊE€ ÊEÊU ÊE   ̵ÊEÊU6 ö &æ÷ –%ÊUÊE¶ ¶ Ä  Ý {/€òa6 öe €ŠÀÀetýÿ€m6 öe ö5 ¶ wºýÊ5—¢ÿ € €í€-õLÆe&‡wÆå€ u¶l¹«jŠ€n¶ ö >Š ö Á`Á5 @týÿ> 6 ‚m Šö @týÿ€m&fÎEøÿæ€"€m ’ÀEÿt&ÎEþÿ÷ Æe|{hg€ê„ !Ë€€cÈ‹€Ž Ãe× ÿ½¾¾ ö o€Àetýÿ6¶ ¶/a‚‚í �m�m Š€  ÷Q <‚„ “2Š€fƒ0¶Š- vö`@a>œ� v ó vö`00'§m 1g@a>œ� J ô��â „bÄ` Š€  ùŠ  �  €âC`‚m‹’€ > öÆe‡wÆå @ ƒöö`> öö`> ö6`Á`€@b ’ö æ`æ ŽaæÎ`æ ¹«jŠ€^Žaæ÷ ðýÉe6 À6t  ÄÜD AÂÿÿ  „ Db>“   „ Db¦6“¾  „ Db>“   „ Db¦6“€Ú¾ É þ5ÿ þ‹þEÿþUþEÿ‰ ¶ —- ®Æe‡wÆå A„‚ƒ  €ÒÀ €o¦’6Š€e IŒö ¶F¹«jŠ€V@ð‹ ö¶æŽa÷ Ö ¶o �ÒÂÂå"ÎÎå !ÀÀ €`6öæŽa÷ öe ö¶möÎŽa÷ ¶ Ö ƒ  ©ÎqV©Îqv©Îq€ÒÁ Ý ŒmÆe ‡wæ A@&?ð <ñ 9�Àe „ßÎN`‚—tøÿÂE€ÿa Ò ñ•ˆ õ(L ‚—tøÿÂE€ÿB`‚mCƒm¹«jŠ€NÊœ� D ï@&Àe�WtøÿÁE€ÿaH�> ¾Ÿ¾ Ö ‡wæ > ¾Ÿ¾ öe@¬Î  „€a¢,— ‚ ö:¹«jŠ^Ê�ÃC`€À æÎe€eb &榦÷ Æe€a6¶  €€m¢]— ‚ õ€À æÎeìÚ ,$ €eb  ¦f¦¦÷ ÆeÖ ‡ö"  L«{;ììL  G©ãL €L @ð‹6 ¦ ¦ ¦ ¦ ¦ ÷ âúÆe ‡wæ @&*> ‚ ÃÀtýÿ�@`&æÎEøÿæ& ÷ ÆeÀ 2 €ß€6�6¹«iŠj{/€È €6œöµöÕöeÊe 6�öÅ6ŠŠ ¶ €ÀEðÿ6Š6PÁÁ Á €t>Pƒ × ¸–%‡f¦ ¦ � f¦ ¦ €D ÷ úÉEàÆe �‡wfþÁ@€mB‚m°’ÿÿ� W ô €À � DÄeÁe@€mCƒmð’ÿÿ� D õ‚ — æöe öe¹«jŠ€À  ¦¦& ÷ Á €𕈠õTLÆe‡f¦ ¦ � f¦ ¦ ÷ RùÉEÿÆe �‡fA÷ ˆõñ‹ �¦÷ ÒúÖ �‡wÆåAF©dŒv¹«jŠ*< C 6Š ¶€6� Ä ÂÂe„`ÂÂe"Ûªs,X  e€b mþÿ‚œÂEÿ5 LÄÿÿ— — — —    q¦& ÷ –%— — - Î1 ¦æ÷ — ö• ö• va©µh`  F¾©<h¾©<€Þ öe vöE ÎŽa÷ õŽ& ÷ ³Æe—  qÄ õLõ5 Lõ5LöEö•ÿvöUæŽa÷ ¤ôÖ (¾©<€Z W-LW-Lñ•� Æe‡fÆå@6 övöeLö æŽa÷ €>,xöÎŽa÷ @“ÀEüÿ Á AaN©Îqj©Îq€Ö  ööŽæŽafæ Žaæ÷ \÷ö¶ ÎŽa÷ ÆeöÎŽa÷ €>,[@“ÀEüÿ Á&Aa öö>©ÎqR©Îq€R ŽæŽafæ Žaæ÷ êöö¶ ÎŽa÷ ÆeöÎŽa÷ €>,"ööŽæŽafÎeNæ Žaæ÷ Šö4©ÎqH©Îq€Î ö¶ ÎŽa÷ ÆeÆe�‡wÆå@ ææŽa÷ @€ ƒƒ  Á`É‹€‚ €  ÷ö¶öeΩÎq(¹«iŠB©Îq€JŽa÷ Æe ‡wÆåCÄÁ &�6ŠÎ5 W- ó•ˆ õpLÆå w’€6œ6ŠöEùÿÂÿÿ—- 6œ6œ—-©Îq¹«jŠ€Æ 6œ6Š @@ì6ö æ Ža÷ öö Žæ ŽafÎe&æŽaæ÷ <õö¶ÎŽa÷ ¶íÀÍ0©Îqn©Îq€Bö5 À(aB"öö¶ ܶΎa÷ ¶àö v@@l6ÁAaÀ@aˆ- ó• õgLµ <©Îq€¾65 N‰vôµö5 €@bÀ ¨ ¬ öåÉåÎŽa÷ uö¶ÎŽa÷ Æe‡wÆå@N©Îqj©Îqt¹«jŠ€: �ɵ  BÜ‚ovœ6жɵ ‚€Ä`Ì5vÌ5pæÎlŽvœ6ŠÌ5 ¶ Ì5vœB¶6Š @ÜÀ ¦æŽa¦æŽa& Nœ÷ zó3À æÎe€eb ÀÀe4ä ôÀÀeò üÀÀeâú ÀÀeT   ÀÀe,    ÀÀe‚ ÀÀe|  $ÀÀeL " €,¦æŽa¦æŽa& NœÈ ¶öÎŽa÷ Æe*Ì5 ÎN`vœ6Š CÜbζvœ6Šö¶¶ ¶ê * 2©Îq¨ æ Ža÷ Æe‡©ÎqL«{; $,4< G©ã¼€¼wæ & 6 „ Ã�Á B‚m—¢0 ‡€À Àe7¦’6Š€% -€À`¦’6ŠÎå0ˆ•à Á ãö  €Ót �ÝWt@` �Ý@` ¹«jŠ€8 �ÓWpd ƒÝ×p Á` €Ý`L–%‡wæ À@Ã:CD“„ „ ÄEÀÿÎÿÿ00'¯�TADATADATADATADATADATADATADATADATA!!  W-æ ÷ Ö ÷ !!  ÷ *¹«jŠd¤«TlD©0X~D©0X€´! !  óµæ ÷ Ö Î '÷ $D@“€ € ÀEÀÿÃÿÿ  W-& ÷ ÷ Ö —#  & ÷ ÷ Ö ÷ Ö ‡w, ¤«T*D©0XX¤«T\¤«;n¤«Tr¤«;xa©àd€0@—tøÿÂE€ÿõ5 — —  AÝLÀÿÿW ¶ uNõhûÀ uLõxû— @õhû5 — õðþuL— ¹«hŠ€¬)ÁLAaW"g@“ÀEÿ hõ@“ÀEÿ 8õÐù@tøÿ �@À ÁÁe@`5þÿ5 — @NÀEÿ €õ þõhýuNLò €(— =ÁLAa@ÀEÿ   õˆùu €õðþu �uõHù   @  P ` p @ÀEðÀ ÂÂe€`5þÿxš zÛª•.@•«Qm@Ûªs,@G©?f@G©Ef@{/@¹«jŠ@¹«iŠ@¹«hŠ@{hg@L«{;¸�«šwhG©ã8¬R«£dh“«›‹h ¤u‡*J Z” œ’ nè " ÔV òÈB x2e©Ûh0 e©Ìhv e©øhð e©ahV ©r;h\š©sh.ˆV #Á@Q>ur'#Á@Q¯”Lz5¬ ™@a©µh@©Îq@¾©Á@¾©<@«’f@a©we@ô¨T@Ì«Õ@Ÿ« f@ÿª @•«n@•«[l@Ûª•.@•«Qm@ G©ã€w@ BBì¶ %ñ 𕈠õJL‡ñf÷  BÜ Â @°� ðÕ€ @0Š 1 Ö ‡0Š ‡w@ ñ ¹«hŠ>«’fr¹«hŠ€|ñf÷  BÜ Â @°� ðÕ€ @0Š 1 Ö ‡f@ ù@ðññf÷ 1 Ö �‡wÆå� «’fh«’fv¹«jŠø @ÜÀ ÂÂe€`ÂÂeÛªs, Q0 lþÿ„6 6 6 ñUv @ÜÀ ÂÂea©µh  8€`ÂÂeÛªs,6 €@lþÿ €Ü€-w—- ‚ŠÂ€ 6 6 ̵96 ö ö æŽa÷ €ŠÀÀe6 ¶ ¶ ¶ Næa©µh> \©Îq€¼Ža¦æŽaæ÷ ¶öÎŽa÷ Æe !—-€týÿ€m&¦ÎEøÿæ& ÷ Æe æf÷ –%¶ ¶ à .©Îq^{/€8 ÀÜÀ`Äe €ŠÀÀetýÿ€cÄeÄ5„ wÀþÆe‡wÆå€ l €t B €týÿ€m&¦ÎEøÿæ& ÷ @¹«jŠ~{/€´Æe N� C çÎ Î  �m жö  �m6 / ƒƒmÀtýÿ€m&æÎEøÿæ& ÷ t Ѐ€m ƒà  ÆeÆe‚ ^{/€0— ÜÉÕ€„ �m Šöe¶-Í>¾ : ‚¾¾ ¾� @€mCƒmð’� B õ! � ƒm‚m‹’€ €¬ ö~  ƒCà B`‚m Š€  øÆe‡wÆå @ ƒöööæŽa÷ öÎÎ`æ ŽafNlæŽaæ0¹«iŠZ©Îq€(÷ Fþ¶ ö Î Ža÷ 6  B ÀÜt v � W óööeö Î Ža÷ Æe‡wCæÎe"„Â� t '†©ÎqV©Îq`¹«jФÀÀe€`& ’÷ ó ÁÁe•«n¦ ¾©Á€¾�` @Òtýÿ€mf’ÎEøÿæ& ÷ ÆeÀ Àt @Ö ‚ — ÏÖ ‡w@ƒ Âÿÿ×  � ɵ ð ÉÅ ‡wÆå f!•«Qm¼ ${/F¹«iŠx¹«jŠ €:€&À€c& „ßæ&ööæŽa÷ Á@À`¢"¢:� ö@À`¢""� C`Dàö$ €ß@ @À`¢"À6x4©Îq€¶$ö $� ì@À`¢:� ù� @À`¢:ú@À`ƒ @àÄ þ>‘À€m(6  ö€€m66’6Š„mÎŽa÷ ¶mz©Îq€2Âe— å @À`¢ ¢ È‹� ô@À`¢"96B ¶ ö` €À`>œ ‚ „ ôÄ À`¬ÿÿ"Ä € ðU€B‚ „ @À`¢"€® ¶ ö` B ˆŸ ‚ „ ûÄ � è6á6 € ðE€¾¾�€€í(€í>&þ &¾Ÿ&(Æe‡wÆåCæ„6¶of¹«jŠ€* �æÞÿN`æîÿN`— )€€m ð‹îÿ#€À €m6öæŽa÷ öe ¶¶mö ÎŽa÷ ¶ ‚ Ö ÔÀð‹‰¾ D©Îqd©Îq€¦>áŒ�Æe ‡w� É• ñ•[@¬Â æN`¦Îeæ¦÷ ñ•,ÎN`¦æ¦÷ ñ•] þ Æe‡w¹«hŠ~¹«jŠ€"æ   €tÎEðÿ‚m €ÓÀ5ÁEôÿNÎU€Š“À€m°�Ãe �ƒ Äå!ôÿÛþÖ ‡fæ & 6 �fÎEü@ÀEÿó ÎUPžÁ5öÕ@Á5 öÕæŽa¦¦¦¦÷ ¢ùÆe�‡wB€ À ÁÁe@¹«hŠ ê@`ÁÁeÛªs,è €òlþÿf÷ ÷ò‹ �Ž ¦ ¦÷ –%Ö ‡fÆå5 LöæŽa÷ � ¶�"ö•ÎŽa÷ Šú¶�"€6 ¶ 6ŠÎ Ža÷ a©µhð B©Îq€n |÷ö00'·m 1gÎŽa÷ € @à6öåö¶aöv öe öÎŽa÷ Æe�‡fAæ÷ 2öñ‹ �Ž÷ Ö �‡fÆåA©ÎqL©Îq€ê öæŽa÷ öŽæŽa¦Îeæ Žaæ÷ Tøö€ Àe6�vœö• öö¶aöÎŽa÷ ö¶ ©Îqt©Îq€f öeÎŽa÷ Æe�‡wÆåABöæŽa÷ 6ùöÎŽa÷ ƒà @Ü6�       ©Îq ¹«iŠL©Îq€â   ö• õ &ö•   òµ ö• ö•   Uòµ ö•v�6 6  �ÝÁ €^ ö• W òµ   ö• ö•ö• vv�W  ö• ö• vöe öW  ö• vöe&€Ú ööö ¶a ö ÎŽa÷  �ÝÁ5öö ¶a ö ÎŽa÷ öÎŽa÷ Á5ŽæŽa¦æ Ža(©ÎqT©Îqd©ÎqnV æ÷ öö¶ÎŽa÷ ÆeÁ5öv öe ö ÎŽa÷ Á5=6  @ B€t †@À ÂÂe ©ÎqJ©Îq€À €`6R� W íöÎŽa÷ öÎŽaæŽa¦æ Žaæ÷ nõö¶ÎŽa÷ ÆeöÎŽa÷ €ÀàÁ K�Æe!Ÿ« f¾  "©Îq\©Îqp©Îq€< ‡fAæ ÷ ²òñ‹ �N÷ Ö �‡ÆåöæŽa÷ öNÎeæŽa¦Îeæ Žaæ÷ âúö€ € 6�€6œö8©Îq€¸ ö¶aöÎŽa÷ ö¶ öeÎŽa÷ Æe‡ff€À@Ì @Ü)@m&fÎe÷ Üñ€ð‹ �N÷ ©Îq8©Îq€4–%�‡wÆå @� ñµ „ W- 𕈠õfLæ wö“6Š 6Š Îö¶aöæŽa÷ À@Ì+ñµ '@" ¹«jŠh©Îq€°6Š ö ¶aö CÜ) ÎŽa÷ ‚ ƒ ø 6vœ)6ŠÎŽa÷ vvÎŽa÷ ñµ4 2†@@m¨ ¢,©ÎqL©Îqb©Îqv,¢ ¢ ¢¢ ¢ ¢¢¢ö ö ¶aöÎŽa÷ Æe‡wBAÁe4ÃC`ÀÀeV©Îq`¹«jŠ*ž€m&’6Šæÿÿ—-$—-  ÀÀe•«[lœ `Ä€m Âe„ f÷ ¨ô ÉEÀþ—-N÷ ÒùÎf÷ ÞøÖ Ö —- ÷ 4ýÎ €t€mÄÄe̫ՠa ` ÄÄeÌ«Õ h€*`3¦æ÷ ÂôŽæ÷ ’øÆe–%‡wÆå@ �ɵ ÃC`vœ6Š'ÄD`ÎN`ɵ Óƒo—¯  ÓCmÌ«Õ( *¹«jŠn¦€ Ól€ŠÀ6ɵ Ä„lvœ6Š @ÜÀ ææŽa&æ Ža& Nœ÷ tñ'À æÎe€ebÀÀed ÀÀe0  ÀÀe   ÀÀe´ ( ÀÀe& :4ææŽa&æ Ža& NœÈ ¶öÎŽa÷ Æe‡z2 2©ÎqL«{;   $ G©ãj€jwæ & 6  à ö �À r@�À rdŽ× ö  �Wt€@àÀ r �Wpd€@àÀ r × ö  €t¹«iŠ€æ€ï�Wt �Wpd@€ï�Wp @` À€m�Áe0H�ƒ × ¬–%‡wÆåf€ööÄ@@^&¢_€  BaÊ• D¹«jŠ€b� W ø3Šó•6öe B‚m Š� W ?ø� ö v` þEÿ  B`—¢"—¢: W ~v6a¾’� íW sB`—¢:3 6€Þ@`TB`€€ ÄÄeö6 6 ¢ ¢ € ø�mW¢ XW¢ UW¢:HW¢"F‚m¶œ6Šöÿÿ —-:!6 ‚a‚m¦’€Z6Š–-þEÿ þU@ ´þÿÀ@`—-Y3 6V—-"6 �m‚m‰’¶ öeö ¬8‚mJ’¶ ¶ ¢Á�a�m €ÖBÒ‚-%´þÿ€m BÒa„Äe¶ —-wòþW ¢ ¢ € ø¢"¬:þEÿ þU@ € €ãÁeWtÁEÿ€‚òE€RrPÆe‡w¦)À@Ã7Cõ5ó•‚ õ›®LR@“€ € ÀEÀÿöÿÿ  C6 ÄÄ`ó 5 Læ÷ õ Ló•‚ -ÌÕ¹«jŠnô¨TzÛªs,@G©?f@G©Ef@{/@¹«jŠ@¹«iŠ@¹«hŠ@G©ã8,¼©4hlF©2€h¶©áh‚Æ«hØL©yqhÀ L©Ush€ Æ«8h@ bÎ*ÌÅ(D@“€ € ÀEÀÿ6Îÿÿ  ô ô•ˆ õâL 5 Læ ÷ õ Lô•‚ Ö –%‡Nô¨TР($ðx  ^  Ú X 2*Æ«¡hô R«|dh†6ªÆ8h$–©âh\L«{;¸8V OÀèÊz@utqOÀèʯ”DzÀ¨@s©À�@5¬ ™@$9$9õ8b5¬ ™€dðüÿ‡B�àÿüAÜÿw ÷  Ö‡B óÈàø÷ u¼ÿÍÏ BÂEÿCÂ`"æ÷ ÀÎà �ã‡È ý¼D û‚�cƒcÑ”Ž ýD ó†É”É¥a‚É¥z†É¥à‚ÉÅ � �«—y(•«¸.€àÖ ÷ fÛ‡‡&Àe €#ýÖ ‡ó ‚ò5Æÿ‚œ´ÿÂåÂe‡fÂEÿæÈûB`F‡÷ ~Î÷ .Îà÷ †Ó¥:÷  †Ó¥:@!÷ $Áè&5¬ ™€\à Π @! ŠU`eãÈUU5ÄU€÷ þm†É¥[É¥<"Î@ ÷  †ÑÄË¥.÷ ¢† £ ÷ ˜‡Î0þQ £ÎUD’ÄeĤá„÷ ¨Ä_€Ø÷ ÖÄUÄ‹È5ÈE Î÷ lÎàÈU0 ÈE÷ pU5Î Ä.÷ ˜ †È5ÈE0 ÄU÷ LÄ. ÷ x‡Ä; ÷ n †ÄŠÄ-÷ bÄU€T÷ "ˆÖ …‡& N  †Ó¥"úÎ ùà  ‡U5CàƒÕM%‘Å ÄÑÄE¸ÿÄ Ä Ä AÍ5QÁ`C÷ ¢Á‡Ä_C& æ÷ ŽA†ö &Ä‹¥5Î €ÐË¥A‚Ë¥Z.†Ë¥a‚Ë¥z(†Ë¥À ‚Ë¥ý ‡Ë¥ÐË¥ðË¥ÞΠ˥*Ë¥%Π˥$Ë¥_ Π˥0 ‚Ë¥9 ‡Ë¥7†Î ÁŽUƒ ºÖ „– ‡ƒ "L †ð‹�Ë‹øË¥ õË¥ ò±‡V NÀÅÎz1u¦…NÀÅί”DR«£d@ ©r;@©á@e©ø@e©a@F©2€@e©Û@ ©S~@e©Ì@6ªÆ8@ï[Œ@“«›‹@zÆ«8@ ­XT@ ­WT@¼©4@Æ«¡@L©yq@–©â@Æ«@�«)x@t©S~@L©Us@á[o†@£« €@(«$H£rœQ@Jš©s@R«|d@ 1uo† L�«Kqh ­ZTä` ­VTä& ­WTäô¯” 1uo†P÷ Ë5÷ Ë5ö‡× ±&À ‡7.ð<†ð.€‡æÎeüÿž.P£« €t©S~"ï[Œ*á[o†,�«)x.0<2á[o†8�«)x.:á[o†B�«)xN�«)x. ­ZT"" 1uo† 1uo†\\t$ ­WTt ­XT ­WTr VV  ­VT ­VT*t“«›‹R«£de©Û e©Ì e©ae©ø©á¼©4F©2€R«|dÆ«L©yqL©UsÆ«8 Æ«¡"6ªÆ8$–©â& ©r;(š©s¸V NÀEÂ>uT(NÀE¯”L L«{;€ðÿàÿÐÿÀÿ°ÿ ÿ�ÿ€ÿpÿ`ÿPÿ@ÿ0ÿ ÿÿÿÿðþàþÐþÀþ°þ þ�þ€þpþ`þPþ@þ0þ þþþøýðýàýÐýÀý°ý ý˜ý�ý€ýpý`ýXÿPý@ý0ý ýýýðüàüÀü°ü ü�ü€üpü`üPü€|@ü0ü üüüðûèûàûÐûÀû°û û�û€ûpû`ûPû@û0û ûûûðúàúÐúÀú°ú ú�ú€úpú`úPú@ú0ú úúúðùàùÐùÀù°ù ù�ù€ùpù`ùPù@ù0ù ùùùùðø0þ˜û°þ˜û(ü˜û€ø˜û˜ûXÿ˜û˜ûœý˜û˜ûØûdû˜û˜û˜ûdû˜û˜û˜û˜û¨ù¬ùý˜û˜û˜û˜û˜ûPû˜ûøýhù˜ûàøðü˜û˜û°ý˜û@þ@þ@þ˜û˜û˜û˜ûðüðüù˜û˜ûü˜û˜û˜û˜û˜ûý|t˜ûðü˜û(ùðü þ˜û˜û˜û˜û˜û˜û˜û˜û˜ûðþ˜û˜û˜û˜û˜û˜û€ý˜û˜û˜û˜ûxû¸ÿôýäû˜ûXû û@ü˜ûúÈù˜ûHù˜û˜û˜û˜û˜û˜û˜û˜û˜û˜ù˜û˜ûdû˜û˜û˜û˜û˜û€ý˜û G©ãÅåLõÀý÷ ÷ ‡D©0Xa©àd:5¬ ™@D©0X@a©àd@L«{;¸ì�«šwhG©ã8a©µhhVV NÀÅÎz1u,…NÀÅί”D ©S~@l©S~@1±o†@ ­XT@ ­WT@£« N@�«)x@£rœQ@ 1uo† ¦�«Kqh ­ZTä` ­VTä& ­WT䞯” 1uo†€ÁÉ ÷.÷>÷ Ë5ÁVÉ ÷.÷>÷ Ë5⇄4 ô€÷.‡C3 3 ó€ó €R1±o†�«)x.>1±o†£« N,1±o†.�«)x.2>41±o†8l©S~Z�«)x.\1±o†`1±o†.|É,Ä, ÍUóE€s3w&æ& $�«)x&(�«)x&,1±o† ­ZTPP^ 1uo†^XXd 1uo†d\\  ­WT ­XT ­WT VV   ­VTØV NÀÅÎz1u.…NÀÅί”D ©S~@l©S~@1±o†@ï[Œ@ ­XT00'Çm 1g@ ­WT@�«)x@á[o†@£« €@(«$H£rœQ@ 21uo† È�«Kqh ­ZTä` ­VTä& ­WTäô¯” 1uo†€÷ Ë5ÁVÉ ÷.÷*÷ Ë5쇄4 ô€÷.‡C3 3 ó€ó €É,Ä, ÍUóE€:£« €1±o†�«)x.* 1±o†$l©S~F�«)x.H1±o†L1±o†P|s3w&æ&× ±&À ‡7.ð¸†ð.€‡æÎeüÿž.Z�«)x&�«)x&1±o†"ï[Œ*á[o†,�«)x.0¸2á[o†8�«)x.:á[o†B�«)xN�«)x. ­ZT""’” 1uo†’ 1uo†”PPJ 1uo†JXXP 1uo†P\\t$ ­WTt ­XT ­WTr VV   ­VTŽV NÀÅÎz1u/…NÀÅί”D”¬t!@¼©õ‡@j¬õ<@J©Å@i©5u@ ©S~@l©S~@R«°'@ò«ˆ@1±o†@D©Mw@ï[Œ@zÈ«õ @ ­XT@ ­WT@•«õ @ ©µ�@«µ�@�«)x@Óªè�@á[o†@£« €@(«$Hp©Åœ@§«õ<@(«X@£rœQ@z©õ#@•«µO@ 1uo† È�«Kqh ­ZTä` ­VTä& ­WTäôBu;T x�«Uqh�«Iqhd�«ö&hD�«T[h\�«\gh8�«u'hTz�«åhH�«ñ�hl�«!thX�«h �«U(hL�«™’hh�«‰wh�«E`h�«œ,h4�«¯h(�«„!h�«&h,�«Ayh`�«•h�«Ä…h<B�«"h �«#h$�«:dh�«{h0�«Vqh�«TqhP�«Ôh@¯” 1uo†€÷ Ë5ÁVÉ ÷.÷*÷ Ë5쇄4 ô€÷.‡C3 3 ó€ó €É,Ä, ÍUóE€:£« €1±o†�«)x.* 1±o†$l©S~F�«)x.H1±o†L1±o†P|s3w&æ&× ±&À ‡7.ð¸†ð.€‡æÎeüÿž.Z�«)x&�«)x&1±o†"ï[Œ*á[o†,�«)x.0¸2á[o†8�«)x.:á[o†B�«)xN�«)x. ­ZT""’” 1uo†’ 1uo†”PPJ 1uo†JXXP 1uo†P\\t$ ­WTt ­XT ­WTr VV  ­VT ­WTP(Pvò«ˆ©õ#•«µO ¼©õ‡ §«õ<«µ�È«õ •«õ j¬õ<p©Åœ ©µ�R«°'(«XJ©Å i©5u"”¬t!$D©Mw&Óªè�Bu;T|æ5æ3æ1æ/æ-æ+æ)æ'æ%æ#æ!ææææææææææ æ æ æææææÎáÎerwz ©S~0V NÀÅÎz1u3…NÀÅί”D£«ày@ ©S~@l©S~@1±o†@ ­XT@ ­WT@�«)x@£rœQ@ 1uo† œ�«Kqh ­ZTä` ­VTä& ­WT䞯” 1uo†€÷ Ë5ÁVÉ ÷.÷*÷ Ë5쇄4 ô€÷.‡C3 3 ó€ó €É,Ä, ÍUóE€:£«ày1±o†�«)x.* 1±o†$l©S~F�«)x.H1±o†L1±o†$|s3w&æ&Þ v  �«)x&�«)x&1±o† ­ZTPPJ 1uo†JX XP’0 1uo†P 1uo†’ ­WT  ­XT ­WT VV   ­VTV NÀÅÎz1u¤…NÀÅί”DR«£d@ ©r;@©á@e©ø@e©a@F©2€@e©Û@ ©S~@e©Ì@1±o†@ï[Œ@“«›‹@zÆ«8@ ­XT@ ­WT@Æ«¡@L©yq@–©â@£« N@Æ«@�«)x@t©S~@L©Us@á[o†@£rœQ@š©s@6ªÆ8@J¼©4@R«|d@ 1uo† È�«Kqh ­ZTä` ­VTä& ­WT䞯” 1uo†€ÁÉ ÷.÷*÷ Ë5÷ Ë5쇄4 ô€÷.‡C3 3 ó€ó €É,Ä, ÍUóE€:1±o†�«)x.*1±o†£« N$t©S~F�«)x.H1±o†L1±o†P|s3w&æ&× ±&À ‡7.ð¸†ð.€‡æÎeüÿž.Z�«)x&�«)x&1±o†"ï[Œ*á[o†,�«)x.0¸2á[o†8�«)x.:á[o†B�«)xN�«)x. ­ZT""’” 1uo†’ 1uo†”PPJ 1uo†JXXP 1uo†P\\  ­WT ­XT ­WT VV  ­VT ­VT*t“«›‹R«£de©Û e©Ì e©ae©ø©á¼©4F©2€R«|dÆ«L©yqL©UsÆ«8 Æ«¡"6ªÆ8$–©â& ©r;(š©sÔV NÀÅÎz1u§…NÀÅί”D”¬t!@R«£d@ ©r;@¼©õ‡@©á@e©ø@e©a@J©Å@F©2€@e©Û@i©5u@ ©S~@zR«°'@e©Ì@ò«ˆ@6ªÆ8@D©Mw@ï[Œ@“«›‹@Æ«8@È«õ @ ­XT@ ­WT@¼©4@Æ«¡@•«õ @L©yq@z ©µ�@–©â@Æ«@«µ�@�«)x@t©S~@Óªè�@L©Us@á[o†@£« €@(«$Hp©Åœ@§«õ<@(«X@£rœQ@zš©s@©õ#@•«µO@j¬õ<@00'Ï(ÓTADATADATADATADATADATADATADATADATAR«|d@ 1uo† L�«Kqh ­ZTä` ­VTä& ­WTäôBu;T x�«Uqh�«Iqhd�«{h0z�«ö&hD�«T[h\�«\gh8�«u'hT�«åhH�«ñ�hl�«h �«!thX�«U(hL�«™’hh�«‰wh�«E`h�«œ,h4�«¯h(�«„!hZ�«&h,�«Ayh`�«•h�«Ä…h<�«"h �«#h$�«:dh�«Vqh�«TqhP�«Ôh@¯” 1uo†P÷ Ë5÷ Ë5ö‡× ±&À ‡7.ð<†ð.€‡æÎeüÿž.P£« €t©S~"ï[Œ*á[o†,�«)x.0<2á[o†8�«)x.:á[o†B�«)xN�«)x. ­ZT"" 1uo† 1uo†\\t$ ­WTt ­XT ­WTr VV  ­VT ­VT*|“«›‹R«£de©Û e©Ì e©ae©ø©á¼©4F©2€R«|dÆ«L©yqL©UsÆ«8 Æ«¡"6ªÆ8$–©â& ©r;(š©s ­WTP(Pvò«ˆ©õ#•«µO ¼©õ‡ §«õ<«µ�È«õ •«õ j¬õ<p©Åœ ©µ�R«°'(«XJ©Å i©5u"”¬t!$D©Mw&Óªè�Bu;T|æ5æ3æ1æ/æ-æ+æ)æ'æ%æ#æ!ææææææææææ æ æ æææææÎáÎerwz ©S~&V NÀÅÎz1u«…NÀÅί”DR«£d@ ©r;@©á@e©ø@e©a@£«ày@F©2€@e©Û@ ©S~@e©Ì@6ªÆ8@ï[Œ@z“«›‹@Æ«8@ ­XT@ ­WT@¼©4@Æ«¡@L©yq@–©â@Æ«@�«)x@t©S~@L©Us@á[o†@£rœQ@š©s@BR«|d@ 1uo† V�«Kqh ­ZTä` ­VTä& ­WT䞯” 1uo†Z÷ Ë5÷ Ë5ö‡× ±&À ‡7.ð<†ð.€‡æÎeüÿž.Þ v P£«àyt©S~"ï[Œ*á[o†,�«)x.0<2á[o†8�«)x.:á[o†B�«)xN�«)x. ­ZT"" 1uo† 1uo†Z ZL( 1uo†L ­WT ­XT ­WT VV  ­VT ­VT*t“«›‹R«£de©Û e©Ì e©ae©ø©á¼©4F©2€R«|dÆ«L©yqL©UsÆ«8 Æ«¡"6ªÆ8$–©â& ©r;(š©s�«Kqh ­ZTä` ­VTä& ­WT䞯” 1uo†Z÷ Ë5÷ Ë5ö‡× ±&À ‡7.ð<†ð.€‡æÎeüÿž.Þ v P£«àyt©S~"ï[Œ*á[o†<Á0ÀW ,@�ðŸ úÆ P>Ì WT Ô› ùHzš› I|�ªÛS�:  ¼ ‚« :R ‰–â DÀ  3 Tz šÞ{N`Þ ºË! о" !�w* ˆ²2 #Nœ5 %”b; , ’G - \K .äzK [=M …üRK ZŠaT h²_ E^T` ~zd 2¶d ºÌe 7°äf ˆJqû`0:w =¼x Xš´x ,My x„MyÓ3yH¶z Jz} @ºƒ \ რkŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿTW  .MACRO CUCDF$ X,Y .ASECT .= U.CW2+2U.ACUR:'X .BLKW 1U.NSYN:'X .BLKB 1U.NSYC:'X .BLKB 1 .= U.VCB+2U.PHDR:'X .BLKW 1U.RCHK:'X .BLKW 1 U.QSYN:'XU.RCAC:'X .BLKW 1U.RBUF:'X .BLKW 2U.RCNT:'X .BLKW 1U.SVC:'X .BLKW 1 U.TXCT:'XU.INTP:'X .BLKW 1U.SYNC:'X .BLKB 1U.MPN:'X .BLKB 1U.RFRK:'X .BLKW 1U.RFPC:'X .BLKW 1U.RFR5:'X .BLKW 1U.RFR4:'X .BLKW 1U.RFCT='Y U.TXCT+1 .PSECTU2.HDX='Y 100000U2.LIN='Y 40000U2.CTS='Y 20000U2.SWC='Y 10000U2.ONL='Y 4000U2.HPT='Y 1000U2.HRC='Y 400U2.RCV='Y 200U2.ACU='Y 100U2.MPT='Y 40U2.FTM='Y 20U2.SFL='Y 10U2.RFK='Y 4U2.SYC='Y 3U2.TXA='Y 2U2.SNC='Y 1 US.SYN='Y 1TU3.LOK='Y 100000U3.RPD='Y 400U3.RAC='Y 200U3.SND='Y 1 .MACRO CUCDF$ A,B .ENDM .ENDM4W  .MACRO CVCDF$ X,Y .ASECTK .= V.IFWI4V.CPRT:'X .BLKW 1TV.CLUN:'X .BLKB 1CV.CMPN:'X .BLKB 10V.CSTS:'X .BLKW 1V.CST1:'X .BLKB 12V.CNID:'X 00(×m 1g.BLKB 1OV.CUCB:'X .BLKW 1TV.CMPL:'X .BLKW 1'V.CNPN:'X .BLKW 1 V.CMBC:'X .BLKW 1 V.CRED:'X .BLKW 1 V.CNHD:'X .BLKW 10V.CTBL:'X .BLKW 1V.CRBL:'X .BLKW 12V.NXHD:'X .BLKW 1TV.CDBC:'X .BLKW 1CV.CIAD:'X .BLKW 1'V.CICT:'X .BLKW 10V.CSAD:'X .BLKW 10V.CSCT:'X .BLKW 1V.CMXI:'X .BLKW 1.V.CMXO:'X .BLKW 1.V.CTDH:'X .BLKW 1V.CTDT:'X .BLKW 1 V.CSTQ:'X .BLKW 2KV.CLMT:'X .BLKB 1TV.CTMA:'X .BLKB 1NV.CLMR:'X .BLKB 1NV.CRMA:'X .BLKB 1SV.CMCT:'X .BLKW 21V.CRPC:'X .BLKB 1DV.CRPL:'X .BLKB 1BV.CRTM:'X .BLKW 1LV.CREP:'X .BLKW 1NV.CBCC:'X .BLKW 1CV.CDCC:'X .BLKW 1DV.CURH:'X .BLKW 1DV.CDLE:'X .BLKW 1LV.COVR:'X .BLKW 1LV.CRST:'X .BLKW 1DV.CALF:'X .BLKW 1CV.CREA:'X .BLKB 1D .BLKB 1 .IF DF C$$ACUV.CTPN:'X .BLKB 12.K .ENDCV.CLEN:'X .BLKW 1. .PSECTB VS.SEL='Y 100000VS.FIN='Y 40000VS.REP='Y 20000VS.RTR='Y 10000VS.STK='Y 4000VS.STR='Y 2000VS.ACK='Y 1000VS.NAK='Y 400VS.MPT='Y 200VS.DIS='Y 200VS.CTL='Y 100VS.DAT='Y 40VS.SYN='Y 20VS.POL='Y 10VS.ONL='Y 4VS.BOO='Y 2VS.TRN='Y 1 .MACRO CVCDF$ A,B .ENDM .ENDM4 W  .MACRO F11DF$,L,B,SYSDEFA .ASECTK.=0V.TRCT:'L'.BLKW 1V.TYPE:'L'.BLKB 1$ VT.FOR='B' 0 VT.SL1='B' 1N VT.SL2='B' 2B VT.ANS='B' 10 VT.UNL='B' 11V.VCHA:'L'.BLKB 14 VC.SLK='B' 1 VC.HLK='B' 2' VC.DEA='B' 4K VC.PUB='B' 10& VC.DUP='B' 20 ; Duplicate volume name VC.SIL='B' 40 ; Silent modeV.LABL:'L'.BLKB 14V.PKSR:'L'.BLKW 2T V.SLEN:'L'V.IFWI:'L'.BLKW 1SV.FCB:'L'.BLKW 2V.IBLB:'L'.BLKB 1BV.IBSZ:'L'.BLKB 1N .BLKW 1V.FMAX:'L'.BLKW 1BV.WISZ:'L'.BLKB 1V.SBCL:'L'.BLKB 1AV.SBSZ:'L'.BLKW 1EV.SBLB:'L'.BLKB 1V.FIEX:'L'.BLKB 1 .BLKW 1V.VOWN:'L'.BLKW 1BV.VPRO:'L'.BLKW 1NV.FPRO:'L'.BLKW 1VV.FRBK:'L'.BLKB 1NV.LRUC:'L'.BLKB 1' .BLKW 1V.STS:'L'.BLKB 1 VS.IFW='B' 1V VS.BMW='B' 2VV.FFNU:'L'.BLKB 1UV.EXT:'L'.BLKW 1V.HBLB:'L'.BLKW 2.V.HBCS:'L'.BLKW 2 V.LGTH:'L' .ASECT .=0.M.LNK:'L'.BLKW 1M.TYPE:'L'.BLKB 1' MT.MLS='B' 1CM.ACC:'L'.BLKB 1M.DEV:'L'.BLKW 1M.TI:'L'.BLKW 1 M.LEN:'L'. .ASECTB.=0BF.LINK:'L'.BLKW 1F.FNUM:'L'.BLKW 1AF.FSEQ:'L'.BLKW 1E .BLKB 1F.FSQN:'L'.BLKB 1'F.FOWN:'L'.BLKW 11F.FPRO:'L'.BLKW 1BF.UCHA:'L'.BLKB 1NF.SCHA:'L'.BLKB 1VF.HDLB:'L'.BLKW 2NF.LBN:'L'.BLKW 2F.SIZE:'L'.BLKW 2:F.NACS:'L'.BLKB 1=F.NLCK:'L'.BLKB 1 S.STBK='B'.-F.LBN F.STAT:'L'F.NWAC:'L'.BLKB 1' .BLKB 1 FC.WAC='B' 100000 FC.DIR='B' 40000  FC.CEF='B' 20000L FC.FCO='B' 10000KF.DREF:'L'.BLKW 1CF.DRNM:'L'.BLKW 1F.FEXT:'L'.BLKW 1.F.FVBN:'L'.BLKW 2EF.LKL:'L'.BLKW 1F.WIN:'L'.BLKW 1 F.LGTH:'L' .ASECTK.=0 W.ACT:'L'B W.BLKS:'L'W.CTL:'L'.BLKW 1 WI.RDV='B' 400' WI.WRV='B' 1000 WI.EXT='B' 2000 WI.LCK='B' 4000 WI.DLK='B' 10000D WI.PND='B' 20000B WI.EXL='B' 40000E WI.WCK='B' 100000W.IOC:'L'.BLKB 1W.STS:'L'.BLKB 1 WS.MDL='B'1W.FCB:'L'.BLKW 1W.TCB:'L'.BLKW 1W.UCB:'L'.BLKW 1W.LKL:'L'.BLKW 1W.WIN:'L'.BLKW 1 .IF NB,SYSDEF .IF NDF,P$$WNDKW.VBN:'L'.BLKB 1 W.MAP:'L''W.WISZ:'L'.BLKB 1' .BLKW 1 W.RTRV:'L' W.SLEN='B'-4 .IFFLW.MAP:'L'.BLKW 1 W.SLEN:'L'.=0 ASSUME W.CTL,0. .BLKB 1W.USE:'L'.BLKB 1W.VBN:'L'.BLKB 1W.WISZ:'L'.BLKB 1= .BLKW 1 W.RTRV:'L' .ENDC .ENDC .ASECTW.=0=L.LNK:'L'.BLKW 1L.WI1:'L'.BLKW 1L.VB1:'L'.BLKB 1L.CNT:'L'.BLKB 1 .BLKW 1 L.LKSZ:'L' .PSECTB .MACRO F11DF$ X,Y,Z .ENDM F11DF$. .ENDM F11DF$p W  .MACRO CCBDF$ L,B,LST .IIF NB LST .LIST .SAVE .ASECTP.=-2C.URM:'L' .BLKW 1C.LNK:'L' .BLKW 1'C.RSV:'L' .BLKB 11C.BID:'L' .BLKB 1N C.XACP:'L'C.NSP:'L' .BLKW 11C.LIN:'L' .BLKB 1C.STA:'L' .BLKB 1.C.FNC:'L' .BLKB 1LC.MOD:'L' .BLKB 1BC.STS:'L' .BLKW 1 C.BUF1:'L'C.BUF:'L' .BLKW 2C C.CNT1:'L'C.CNT:'L' .BLKW 1: C.FLG1:'L'C.FLG:'L' .BLKW 1.C.BUF2:'L' .BLKW 2C.CNT2:'L' .BLKW 1C.FLG2:'L' .BLKW 1.$$$$.=.C.ADD:'L' .BLKW 3.C.PRO:'L' .BLKW 1M.=.$$$$.C.XPT:'L' .BLKB 1.C.XID:'L' .BLKB 1TC.X25:'L' .BLKB 1TC.XT00(ßÓTADATADATADATADATADATADATADATADATAC:'L' .BLKB 1C.XPLI:'L' .BLKW 1 C.XLEN:'L'CB.XLB='B' 000001:CB.CCB='B' 000002:CB.RDB='B' 000004PCB.SDB='B' 000010KCB.DLC='B' 000020KCB.DDM='B' 000040KCB.SLI='B' 000100KCC.LLC='B' 000200KCS.ENA='B' 000001KCS.CES='B' 000002.CS.STR='B' 000004.CS.CMP='B' 000200 CS.SHU='B' 000001'CS.HCR='B' 000001.CS.DEV='B' 0000022CS.ROV='B' 0000041CS.XUR='B' CS.ROV1CS.RNG='B' 000010LCS.ENB='B' 000020LCS.DIS='B' 000040.CS.ABO='B' 000100.CS.BUF='B' 000200TCS.DCR='B' 000400TCS.FTL='B' 001000CS.HFE='B' 0020001CS.MTL='B' 004000BCS.RSN='B' 010000BCS.TMO='B' 020000BCS.LST='B' 040000BCS.ERR='B' 100000CCS.SID='B' 000002MCE.RTE='B' 100376ICE.TMO='B' 100374CCE.MOP='B' 100372ACE.ERR='B' 100370SCE.DIS='B' 100366RCE.SRC='B' 100364PCE.ABO='B' 100362UCE.NTE='B' 100361RCE.LTO='B' 100356VCE.TME='B' 100354VCE.STP='B' 100352RCE.ILN='B' 100350GCE.DAO='B' 100346BCE.UNS='B' 100344SCS.SUC='B' 000001OCS.BRO='B' 000002FCS.DEF='B' 000004RCS.CHN='B' 000010LCF.CHN='B' 000001ECF.LIN='B' 000002LCF.EOM='B' 000004NCF.SOM='B' 000010OCF.HDR='B' 000020TCF.SYN='B' 000040RCF.TRN='B' 000100DCF.LB='B' 100000CP.HDL='B' 000007TCP.2FR='B' 000030MCP.DCF='B' 000040ECP.XCF='B' 000100DCP.PSI='B' 000200SCP.PS='B' 177400 FC.XME='B' 0 FC.RCE='B' 2 FC.KIL='B' 4 FC.CTL='B' 6 FC.TIM='B' 100 FC.XCP='B' 12' FC.RCP='B' 14N FC.KCP='B' 16E FC.CCP='B' 20B FC.PWR='B' 220 FC.MAN='B' 24' FC.MLD='B' 26O FC.PCT='B' 30SFS.RTN='B' 2*400FS.DVC='B' 2*400FS.CIB='B' 4*400FS.KIL='B' 0*400FS.CRA='B' 2*400FS.XKL='B' 4*400FS.AST='B' 0*400FS.INI='B' 0*400FS.STR='B' 2*400FS.STP='B' 4*400FS.TRM='B' 6*400FS.MNT='B' 10*400PFS.SET='B' 12*400PFS.GET='B' 14*400PFS.XON='B' 16*400PFS.XOF='B' 20*400PFS.RNG='B' 22*400XFS.ENB='B' 24*400'FS.DIS='B' 26*400CFS.MSN='B' 30*400'FS.STM='B' 0*400FS.LTM='B' 2*400FS.RET='B' 0*400FS.REA='B' 2*400FS.ZER='B' 4*400FS.REZ='B' 6*400FS.SFS='B' 10*400'FS.SFC='B' 12*4002FS.SFR='B' 14*4004FS.SPW='B' 100*400FS.LCL='B' 200*400FS.RST='B' 0*400FS.EXI='B' 2*400CM.LIN='B' 000000SCM.CIR='B' 000002SCM.FMT='B' 100000PCM.LOO='B' 000001'CM.HRD='B' 000002'CM.XLO='B' 000004'FS.HLT='B' 0*400FS.WLB='B' 2*400FS.RLB='B' 4*400 .RESTORE0 .IIF NB LST .NLISTX .ENDM CCBDF$*ŽW  .MACRO SLTDF$ L,B,LST .SAVE .ASECT4.=-2 .IIF NB LST .LISTL.CVA:'B' .BLKW 1AL.FLG:'B' .BLKW 1'L.DDM:'B' .BLKB 1'L.DLC:'B' .BLKB 11L.DDS:'B' .BLKW 11L.DLM:'B' .BLKW 11L.DLS:'B' .BLKW 11L.CTL:'B' .BLKB 12L.UNT:'B' .BLKB 10L.NSTA:'B' .BLKB 1L.COST:'B' .BLKB 1L.KRBA:'B' .BLKW 1L.NMST:'B' .BLKB 1L.OWNR:'B' .BLKB 1 L.MPF:'B'' L.LEN='L'.LF.X2P='L'000000LF.BWT='L'000007LF.TIM='L'000010LF.MTP='L'000020LF.SER='L'000040LF.MDC='L'000100LF.PAC='L'000200LF.BRO='L'000400LF.LPB='L'001000LF.ENA='L'002000LF.MFL='L'004000LF.REA='L'010000LF.UNL='L'020000LF.RDY='L'040000LF.ACT='L'100000 LN.STA='L'17 LN.SUB='L'360 LN.ON='L'0 LN.OFF='L'1 LN.SER='L'2 LN.OAU='L'3T LN.OOP='L'42 LN.CLO='L'0B LN.OPE='L'1A LN.REF='L'2 LN.LOO='L'3L LN.LOA='L'4' LN.DUM='L'5. LN.TRI='L'6B .=0S.FLG:'B' .BLKB 1.S.COST:'B' .BLKB 1S.NMST:'B' .BLKB 1S.OWNR:'B' .BLKB 1 S.LEN:'B'0SF.ACT='L'000200SF.ENA='L'000100SF.UNL='L'000040SF.MFL='L'000040SF.PAC='L'000020SF.REA='L'000010SF.LPB='L'000004SF.SVC='L'000002SF.SER='L'000001 .RESTORE' .IIF NB LST .NLIST4 .ENDM SLTDF$'ÄW  .MACRO PDVDF$ L,B,LST .RADIX 8O .SAVE .ASECT'.=0.IIF NB LST .LISTPZ.DSP:'B' .BLKW 1B .BLKW 1 .IF DF X$$MCBZ.QUE:'B' .BLKW 1N .ENDCZ.NAM:'B' .BLKW 1NZ.LLN:'B' .BLKB 1.Z.SCH:'B' .BLKB 1.Z.FLG:'B' .BLKW 1.Z.PCB:'B' .BLKW 1.Z.AVL:'B' .BLKW 1.Z.LEN='L' .-Z.DSP'Z.DAT:'B' .BLKW 10 Z.MAP:'B'LZF.X3P='L' 0ZF.DDM='L' 1ZF.DLC='L' 2ZF.LLC='L' 4ZF.MFL='L' 10ZF.KMX='L' 20ZF.MUX='L' 40ZF.LMC='L' 100ZF.TIM='L' 200ZF.MTM='L' 400ZF.COU='L'1000ZF.PSE='L'2000ZF.DIA='L'4000ZF.SLI='L'10000.ZF.MAN='L'00(çm 1g20000=ZF.INI='L'40000LZF.DVP='L'100000ZS.ASN='L'100000ZS.BSY='L'140000.IIF NB LST .NLIST .RESTORE: .ENDM PDVDF$.ÌW  .MACRO OPTDF$ L,B,LST .IIF NB LST .LIST CF.MDM='L'1. CF.DDM='L'2B CF.DYN='L'4= CF.EIS='L'10 CF.LOG='L'20 CF.TIM='L'400LCF.FRK='L'100000 .IIF NB LST .NLISTC .ENDM OPTDF$C°W  .MACRO SYNDF$ L,B,LST .IIF NB LST .LIST $SYNC='B' 226T $SYNCT='B' 8.M $PAD='B' 377 $PADSH='B' 2$PADKL='B' 10. .IIF NB LST .NLISTI .ENDM SYNDF$M@W  .MACRO ABODF$,L,B S.CACT='B'-4.A S.CEXT='B'-2.S S.COAD='B'0. S.CSGF='B'2. S.CBPT='B'4. S.CIOT='B'6. S.CILI='B'8. S.CEMT='B'10.A S.CTRP='B'12.L S.CFLT='B'14.T S.CSST='B'16.' S.CAST='B'18.' S.CABO='B'20.= S.CLRF='B'22. S.CCRF='B'24.F S.IOMG='B'26.F S.PRTY='B'28. S.CPMD='B'30.L S.CELV='B'32.T S.CINS='B'34. S.CAFF='B'36. S.CCSM='B'38. S.COTL='B'40.I S.CTKN='B'42.2S.BUNK='B'-128.M S.BFEI='B'0. S.BOVL='B'1. S.BHI='B'1.1 S.BBIF='B'1. T.NDNR='B'0. T.NDSE='B'2 T.NCWF='B'4 T.NCRE='B'6B T.NDMO='B'8. T.NUER='B'10.E T.NLDN='B'12.O T.NLUP='B'14.F T.NCFI='B'16.' T.NUDE='B'18.' T.NMPE='B'20.. T.NKLF='B'22.A T.NAAF='B'24.L T.NTAF='B'26.T T.NDEB='B'28.' T.NRCT='B'30.' T.NWBL='B'32.= T.NVER='B'34. T.NIOS='B'36.F T.NIOR='B'38.F .MACRO ABODF$ X,Y .ENDM .ENDM`W  .MACRO CLKDF$,L,B' C.MRKT='B'0' C.SCHD='B'2L C.SSHT='B'4T C.SYST='B'6. C.SYTK='B'8. C.CSTP='B'10. .ASECT'.=0.C.LNK:'L' .BLKW 1'C.RQT:'L' .BLKB 1C.EFN:'L' .BLKB 1FC.TCB:'L' .BLKW 1BC.TIM:'L' .BLKW 2U .=C.TIM+4C.AST:'L' .BLKW 1LC.SRC:'L' .BLKW 1'C.DST:'L' .BLKW 18 .BLKW 1 .=C.TIM+4.C.RSI:'L' .BLKW 2FC.UIC:'L' .BLKW 1'C.UAB:'L'.BLKW 1 .=C.TIM+4' .BLKW 2 .BLKW 1 .BLKW 1 .=C.TIM+4.C.SUB:'L' .BLKW 1RC.AR5:'L' .BLKW 1BC.URM:'L'.BLKW 1 .BLKW 1 C.LGTH='B'.C.NAM='B'C.EFNC.CTX='B'C.UIC .PSECTC .MACRO CLKDF$ X,Y .ENDM .ENDM W  .MACRO DCBDF$,L,B,SYSDEF. .ASECTL.=0KD.LNK:'L' .BLKW 1KD.UCB:'L' .BLKW 1KD.NAM:'L' .BLKW 1KD.UNIT:'L' .BLKB 1 .BLKB 1D.UCBL:'L' .BLKW 1D.DSP:'L' .BLKW 1BD.MSK:'L' .BLKW 1B .BLKW 1 .BLKW 1 .BLKW 1 .BLKW 1 .BLKW 1 .BLKW 1 .BLKW 1D.PCB:'L' .BLKW 1= .PSECT D.VDEB='B'-2 D.VCHK='B'-4 D.VNXC='B'-4 D.VTOU='B'-10 D.VTIN='B'-6 D.VINI='B'0R D.VCAN='B'2 D.VOUT='B'4G D.VPWF='B'6A D.VKRB='B'10 D.VUCB='B'12 .IF NB SYSDEF D.VINT='B'14 .ENDC .MACRO DCBDF$,X,Y,Z .ENDM .ENDMW  .MACRO DEVDF$,L,B .MCALL DCBDF$ DCBDF$ , .MCALL UCBDF$ UCBDF$ ,L .MCALL SCBDF$ SCBDF$ ,1 .MCALL KRBDF$ KRBDF$ ,B .MCALL CTBDF$ CTBDF$ ,W .MCALL LCBDF$ LCBDF$ , .MACRO DEVDF$,X,Y .ENDM .ENDMÀ W  .MACRO EPKDF$,L,B .ASECT. U.=01E$HLGH:'L' .BLKW 1E$HSBF:'L' .BLKW 1E$HSYS:'L' .BLKB 1E$HIDN:'L' .BLKB 1E$HSID:'L' .BLKB 4E$HCTX:'L' .BLKB 1E$HFLG:'L' .BLKB 1E$HENS:'L' .BLKW 1E$HERS:'L' .BLKW 1 E$HENC:'L'E$HTYC:'L' .BLKB 1E$HTYS:'L' .BLKB 1E$HTIM:'L' .BLKB 6E$HPTY:'L' .BLKB 1 .BLKB 1E$HURM:'L' .BLKW 1 .EVENB E$HLEN:'L' D SM.ERR ='B' 1 SM.HDR ='B' 1F SM.TSK ='B' 2C SM.DID ='B' 4 SM.DOP ='B' 10 SM.DAC ='B' 20  SM.DAT ='B' 40P SM.MBC ='B' 20000 SM.CMD ='B' 40000W SM.ZER ='B' 1000001 EH$FOR ='B' 2 ES.INI ='B' 1$ ES.DAT ='B' 2C ES.LIM ='B' 4G ES.LOG ='B' 10' . E$CCMD ='B' 1L E$SSTA ='B' 1T E$SSWI ='B' 2S E$SAPP ='B' 3' E$SBAC ='B' 4' E$SSHO ='B' 5 E$SCHL ='B' 6  E$CERR ='B' 2D E$SDVH ='B' 1 E$SDVS ='B' 2F E$STMO ='B' 3 E$SUNS ='B' 4 E$STMS ='B' 5 E$CDVI ='B' 3S E$SDVI ='B' 1S E$CDCI ='B' 4 E$SMOU ='B' 1 E$SDMO ='B' 2 E$SRES ='B' 3 E$SRCT ='B' 4 E$CMEM ='B' 5 E$SMEM ='B' 1 E$CSYS ='B' 6 E$SPWR ='B' 1  E$CCTL ='B' 7  E$STIM ='B' 1  E$SCRS ='B' 2  E$S00(ïÓTADATADATADATADATADATADATADATADATALOA ='B' 3  E$SUNL ='B' 4  E$SHRC ='B' 5  E$SMES ='B' 6  E$CCPU ='B' 10  E$SINT ='B' 1 ; E$SINT ='B' 2  E$CSDE ='B' 11  E$SABO ='B' 1  EH$NOR ='B' 1  EH$STA ='B' 2  EH$CRS ='B' 3  EH$VIR ='B' 1  EH$EXT ='B' 2  EH$COU ='B' 4  EH$QBS ='B' 10 EH$LMR ='B' 20  .=0EE$TLGH:'L' .BLKW 1E$TTSK:'L' .BLKW 2E$TUIC:'L' .BLKW 1E$TTID:'L' .BLKB 2E$TTIU:'L' .BLKB 1E$TFLG:'L' .BLKB 1 .EVEN E$TLEN:'L' ET$PRV ='B' 1  ET$PRI ='B' 2   .=0EE$ILGH:'L' .BLKW 1E$ILDV:'L' .BLKW 1E$ILUN:'L' .BLKB 1E$IPCO:'L' .BLKB 1E$IPUN:'L' .BLKB 1E$IPSU:'L' .BLKB 1 .IF DF R$$MPL'E$IPDV:'L' .BLKW 1 .ENDC E$IFLG:'L' .BLKB 1 .BLKB 1IE$IVOL:'L' .BLKB 12.E$IPAK:'L' .BLKB 4 E$IDEV:'L'E$IDCL:'L' .BLKW 1E$IDTY:'L' .BLKW 2E$IOPR:'L' .BLKW 2E$IERS:'L' .BLKB 1E$IERH:'L' .BLKB 1 .IF DF R$$MPLWE$IBLK:'L' .BLKW 2E$ICYL:'L' .BLKW 2 .ENDCG .EVEN E$ILEN:'L' EI$SUB ='B' 1  .IF DF R$$MPL$ EI$NUX ='B' 2 .ENDC$ H.=0.E$OLGN:'L' .BLKW 1E$OTSK:'L' .BLKW 2E$OUIC:'L' .BLKW 1E$OTID:'L' .BLKB 2E$OTIU:'L' .BLKB 1 .BLKB 1IE$OFNC:'L' .BLKW 1E$OFLG:'L' .BLKB 1 .BLKB 1'E$OADD:'L' .BLKW 2E$OSIZ:'L' .BLKW 1E$ORTY:'L' .BLKB 1$ .BLKB 11 .EVEN E$OLEN:'L' EO$TRA ='B' 1 EO$DMA ='B' 2$ EO$EXT ='B' 4I EO$PIP ='B' 10' EO$IIO ='B' 20.=0DE$ALGH:'L' .BLKW 1 .=0UE$ALDV:'L' .BLKW 1E$ALUN:'L' .BLKB 1E$APCO:'L' .BLKB 1E$APUN:'L' .BLKB 1E$APSU:'L' .BLKB 1 .IF DF R$$MPLE$APDV:'L' .BLKW 1 .ENDC'E$ADFG:'L' .BLKB 1E$ATIU:'L' .BLKB 1E$ATSK:'L' .BLKW 2E$AUIC:'L' .BLKW 1E$ATID:'L' .BLKW 1E$AFNC:'L' .BLKW 1E$AFLG:'L' .BLKB 1 .BLKB 1BE$AADD:'L' .BLKW 2E$ASIZ:'L' .BLKW 1 .EVEN E$ALEN:'L' EA$SUB ='B' 1E .IF DF R$$MPL$ EA$NUX ='B' 2 .ENDC' EA$TRA ='B' 1O EA$DMA ='B' 2 EA$EXT ='B' 4W EA$PIP ='B' 10 EA$IIO ='B' 20 .PSECT. EL.ICM ='B' 1 EL.SEF ='B' 2 EL.MOU ='B' 4 .MACRO EPKDF$ X,Y .ENDM .ENDM¾W  .MACRO EVNDF$ L,B,LST .IIF NB LST .LIST .ASECT .=0E.VLNK:'L' .BLKW 1E.VSIZ:'L' .BLKB 1E.VTYP:'L' .BLKB 1E.VUCB:'L' .BLKW 1 ET.LOW='B'0' ET.QIO='B'0$ ET.BND='B'2W ET.UNB='B'4$ ET.BCP='B'6$ ET.REJ='B'10 ET.DIS='B'12 ET.DCP='B'14 ET.ICS='B'16 ET.OOB='B'20 ET.ONO='B'22 ET.PHO='B'24 ET.HI='B'24 .=E.VUCB+2'E.VBCT:'L' .BLKW 1E.VBND:'L' .BLKB 6 E.VBLN:'L' .=E.VUCB+2E.VAPR:'L' .BLKW 1E.VADR:'L' .BLKW 1E.VFLG:'L' .BLKW 1 .=E.VFLG+2X E.VSLN:'L' .=E.VFLG+2E.VOBM:'L' .BLKW 6E.VHDR:'L' .BLKW 2E.VTAB:'L' .BLKB 10. E.VOLN:'L' .=E.VFLG+2WE.VSWC:'L' .BLKW 1 E.VTLN:'L' EF.NCO='B'1. EF.NOI='B'2W EF.AST='B'10 EF.LCK='B'40 EF.QUE='B'100W EF.MDE='B'200 .=E.VUCB+2 E.VULN:'L' .=E.VUCB+22E.VRR:'L' .BLKW 1I E.VRLN:'L' .=E.VUCB+2TE.VRD:'L' .BLKW 1' E.VDLN:'L' .=E.VUCB+2V E.VDCL:'L' .PSECTL .IF NB LST .NLISTB.IFF .MACRO EVNDF$ .ENDM.ENDC' .ENDM EVNDF$AFW  .MACRO HDRDF$,L,B .ASECTX.=0SH.CSP:'L'.BLKW 1H.HDLN:'L'.BLKW 1WH.SMAP:'L'.BLKB 1WH.DMAP:'L'.BLKB 1BH.FMAP:'L'.BLKW 1.H.CUIC:'L'.BLKW 1'H.DUIC:'L'.BLKW 1'H.IPS:'L'.BLKW 1H.IPC:'L'.BLKW 1H.ISP:'L'.BLKW 1H.ODVA:'L'.BLKW 1WH.ODVL:'L'.BLKW 1.H.TKVA:'L'.BLKW 1'H.TKVL:'L'.BLKW 1.H.PFVA:'L'.BLKW 1.H.FPVA:'L'.BLKW 1+H.RCVA:'L'.BLKW 1 H.EFSV:'L'.BLKW 1EH.FPSA:'L'.BLKW 1'H.WND:'L'.BLKW 1H.DSW:'L'.BLKW 1H.FCS:'L'.BLKW 1H.FORT:'L'.BLKW 1.H.OVLY:'L'.BLKW 1H.VEXT:'L'.BLKW 1 H.SPRI:'L'.BLKB 1XH.NML:'L'.BLKB 1H.RRVA:'L'.BLKW 1BH.X25:'L'.BLKB 1 .BLKB 1 ;3 RESERVED BYTES .BLKW 1 ;K6H.LUTE:'L'.BLKW 1 ;POINTER TO LUT EXTENSION OF HEADER0H.GARD:'L'.BLKW 1 ;POINTER TO HEADER GUARD WORDH.NLUN:'L'.BLKW 1LH.LUN:'L'.BLKW 2H.FPSL='B'25.*2..=0'W.BPCB:'L'.BLKW 1'W.BLVR:'L'.BLKW 1'W.BHVR:'L'.BLKW 1'W.BATT:'L'.BLKW 1'W.BSIZ:'L'.BLKW 1'W.BOFF:'L'.BLKW 00(÷m 1g1LW.BFPD:'L'.BLKB 1.W.BNPD:'L'.BLKB 1LW.BLPD:'L'.BLKW 1K W.BLGH:'L' WB.NBP='B'20 WB.BPS='B'40 .PSECTP .MACRO HDRDF$ X,Y .ENDM .ENDMv W  .MACRO HWDDF$,L,B,SYSDEF  .MACRO CRESET NAM,ADDRW$$$=0 .REPT 8.B CRENAM NAM,ADDR+<$$$*2>,\$$$N $$$=$$$+1 .ENDR .ENDM .MACRO CRENAM NAM,ADDR,N 'NAM''N'==ADDR .ENDMMPCSR='B'1777462MPAR='B'172100PIRQ='B'177772PR0='B'0 PR1='B'40' PR4='B'200 PR5='B'240 PR6='B'300 PR7='B'340 PS='B'177776 SWR='B'177570F TPS='B'177564.KXCSRA='B'177520 ;KXJ CSR AKXCSRD='B'177530 ;KXJ CSR D#KXJQIR='B'177532 ;KXJ QIR REGISTERKXCSRF='B'177534 ;KXJ CSR FKXCSRH='B'177536 ;KXJ CSR H .IF DF E$$EAE AC='B'177302 MQ='B'177304 SC='B'177310 .ENDC .IF NB B CRESET KINAR,172340 CRESET KINDR,172300 CRESET KDSAR,172360 CRESET KDSDR,172320 CRESET SISAR,172240 CRESET SISDR,172200 CRESET SDSAR,172260 CRESET SDSDR,172220 CRESET UINAR,177640 CRESET UINDR,177600 CRESET UDSAR,177660 CRESET UDSDR,177620 .ENDC .IF NB SYSDEF .IF DF K$$DAS CRESET KISAR,172360 CRESET KISDR,172320 .IFF  CRESET KISAR,172340 CRESET KISDR,172300 .ENDC .IF DF U$$DAS CRESET UISAR,177660 CRESET UISDR,177620 .IFF3 CRESET UISAR,177640 CRESET UISDR,177600 .ENDC .ENDCUBMPR='B'1702003CMODE='B'140000,PMODE='B'30000CSMODE='B'40000EPSMODE='B'10000 SR0='B'1775727 SR3='B'172516DCPUERR='B'177766MEMERR='B'177744MEMCTL='B'177746N.KEY='B'1730547N.UPT='B'173064AN.DZA='B'173074 N.DWA='B'173104NN.DAY='B'173114FN.MON='B'173116N.YEA='B'1731203 FE.EXT='B'1I FE.MUP='B'2. FE.EXV='B'4 FE.DRV='B'10 FE.PLA='B'20 FE.CAL='B'40 FE.PKT='B'100S FE.EXP='B'200, FE.LSI='B'400 FE.OFF='B'1000FE.FDT='B'2000FE.X25='B'4000FE.DYM='B'10000FE.CEX='B'20000BFE.MXT='B'40000MFE.NLG='B'100000 F2.DAS='B'1 F2.LIB='B'20 F2.MP='B'4 F2.EVT='B'10 F2.ACN='B'20 F2.SDW='B'40 F2.POL='B'1006 F2.WND='B'2007 F2.DPR='B'4007F2.IRR='B'1000F2.GGF='B'2000F2.RAS='B'4000F2.AHR='B'10000=F2.RBN='B'20000=F2.SWP='B'40000=F2.STP='B'100000 F3.CRA='B'1E F3.XCR='B'2E F3.EIS='B'4E F3.STM='B'10 F3.UDS='B'20 F3.PRO='B'40 F3.XHR='B'100P F3.AST='B'200E F3.11S='B'400LF3.CLI='B'1000F3.TCM='B'2000F3.PMN='B'4000F3.WAT='B'10000MF3.RLK='B'20000XF3.SHF='B'40000T F4.CXD='B'1E F4.XT='B'2 F4.ERL='B'4' F4.PTY='B'10 F4.DVN='B'20 F4.LCD='B'40 F4.NIM='B'100 F4.CHE='B'2002 F4.LOG='B'4002F4.NAM='B'1000F4.FMP='B'2000F4.DCL='B'4000F4.DDS='B'10000RF4.ACD='B'20000RF4.NCT='B'40000NF4.LSD='B'100000;+; FIFTH FEATURE MASK BITS3;- F5.PRO='B'1R*F5.DFB='B'2 ;SYSTEM HAS DEFERRED BINDINGF5.RTB='B'4 ;RUN TIME BINDINGP3F5.ODB='B'10 ;USER CAN OVERRRIDE DEFERRED BINDINGT2F5.XDJ='B'20 ;XDT IS USING KXJ INTERFACE FOR I/O$F5.NSY='B'40 ;NO LOCAL SYSTEM DISK!F5.NCO='B'100 ;NO LOCAL CONSOLEP%F5.RTK='B'200 ;REMOTE TASK SERVICES4)F5.RDR='B'400 ;REMOTE DIRECTORY STORAGE2(F5.RLG='B'1000 ;REMOTE LOGICAL SUPPORT&F5.LDR='B'2000 ;REMOTE LOAD/OVERLAYS2F5.VTL='B'4000 ;VIRTUAL TERMINAL LOGONS DISABLED HF.UBM='B'1B HF.EIS='B'2P HF.QB='B'4 HF.DSP='B'10<HF.SWR='B'20 ;SYSTEM HAS SWITCH REGISTER HARDWARE PRESENT'HF.KXJ='B'40 ;PROCESSOR TYPE IS KXJ11E)HF.RMT='B'100 ;REMOTE SERVICES REQUIREDJ HF.CIS='B'200IHF.FPP='B'100000 H2.NVR='B'1S H2.INV='B'2N H2.CLK='B'4N H2.ITF='B'10 H2.PRO='B'20H2.BRG='B'100000 SF.STD='B'15 SF.PGN='B'2 MP.CRH='B'100000MP.PWF='B'40000'MP.RSM='B'20000LMP.NOP='B'100005 MP.STP='B'4 MP.INT='B'7777 .MACRO HWDDF$ X,Y,Z .ENDM .ENDMW  .MACRO ITBDF$ L,B,SYSDEF' .IF DF A$$TRP .MCALL PKTDF$ PKTDF$0 .ENDC .ASECTW .=0X.LNK:'L' .BLKW 1EX.JSR:'L' JSR R5,@#0X.PSW:'L' .BLKB 1X .BLKB 1X.ISR:'L' .BLKW 1 X.FORK:'L' .BLKW 1 .BLKW 1 .BLKW 1 .BLKW 1 .IF DF M$$MGEX.REL:'L' .BLKW 1K .ENDCX.DSI:'L' .BLKW 1OX.TCB:'L' .BLKW 10 .IF NB SYSDEF .IF DF A$$TRP .BLKW 1X.AST:'L' .BLKB A.PRM0 .ENDCX.VEC:'L' .BLKW 1PX.VPC:'L' .BLKW 1' X.LEN:'L'T .ENDC .PSECT .MACRO ITBDF$ X,00(ÿÓTADATADATADATADATADATADATADATADATAY,Z .ENDM ITBDF$ .ENDM ITBDF$ÄW  .MACRO KRBDF$,L,B,SYSDEFC .ASECT$.=177770K.PRM:'L' .BLKW 1K.PRI:'L' .BLKB 1KK.VCT:'L' .BLKB 1 K.CON:'L' .BLKB 1BK.IOC:'L' .BLKB 1.K.STS:'L' .BLKW 1.K.CSR:'L' .BLKW 1K.OFF:'L' .BLKW 1K.HPU:'L' .BLKB 1$ .BLKB 1K.OWN:'L' .BLKW 1NK.CRQ:'L' .BLKW 2 K.URM:'L' .BLKW 1 K.FRK:'L' .BLKW 1.=-20.KE.UMH:'L'.BLKW 2.KE.UMC:'L'.BLKW 10.=177776KE.RHB:'L'.BLKW 1KE.UCB:'L'.BLKW 1 .PSECTT KS.OFL='B'1S KS.MOF='B'2I KS.UOP='B'4 KS.MBC='B'10 KS.SDX='B'20 KS.POE='B'40 KS.UCB='B'100D KS.DIP='B'200 KS.PDF='B'4007KS.EXT='B'1000KS.SLO='B'2000 .ASECTK.=177762S.PRI:'L' .BLKB 1LS.VCT:'L' .BLKB 1LS.CON:'L' .BLKB 1L .BLKB 1 .BLKW 1S.CSR:'L' .BLKW 1L .BLKW 1 .BLKB 1 .BLKB 1S.OWN:'L' .BLKW 1L .ASECTN.=-4K1.CON:'L'.BLKB 1R .BLKB 1K1.STS:'L'.BLKW 1KK1.MAS:'L'.BLKW 1HK1.OWN:'L'.BLKW 1CK1.CRQ:'L'.BLKW 27 K1.UCB:'L' .PSECT .MACRO KRBDF$,X,Y,Z .ENDM .ENDM W  .MACRO LBLDF$ L,B .ASECT0.=0SR$LNAM:'L'.BLKW 2'R$LSA:'L' .BLKW 1R$LHGV:'L'.BLKW 1PR$LMXV:'L'.BLKW 1'R$LLDZ:'L'.BLKW 10R$LMXZ:'L'.BLKW 17R$LOFF:'L'.BLKW 1 R$LWND:'L'.BLKW 1 R$LSEG:'L'.BLKW 1 R$LFLG:'L'.BLKW 1WR$LDAT:'L'.BLKW 3 R$LSIZ:'L'.BLKW 0BLD$ACC='B'100000LD$RSV='B'040000LD$CLS='B'020000LD$SUP='B'000010LD$REL='B'000004LD$TYP='B'000002.=0KL$BTSK:'L'.BLKW 2KL$BPAR:'L'.BLKW 2KL$BSA:'L' .BLKW 1.L$BHGV:'L'.BLKW 1DL$BMXV:'L'.BLKW 1.L$BLDZ:'L'.BLKW 1L$BMXZ:'L'.BLKW 1LL$BOFF:'L'.BLKW 1L$BWND:'L'.BLKB 1L$BSYS:'L'.BLKB 1L$BSEG:'L'.BLKW 1L$BFLG:'L'.BLKW 1L$BDAT:'L'.BLKW 3!L$BLIB:'L'.BLKW <7.*>+1 L$BPRI:'L'.BLKW 1 L$BXFR:'L'.BLKW 1 L$BEXT:'L'.BLKW 1 L$BSGL:'L'.BLKW 1 L$BHRB:'L'.BLKW 1 L$BBLK:'L'.BLKW 10L$BLUN:'L'.BLKW 1L$BROB:'L'.BLKW 1DL$BROL:'L'.BLKW 1RL$BRDL:'L'.BLKW 1PL$BHDB:'L'.BLKW 1$L$BDHV:'L'.BLKW 1$L$BDMV:'L'.BLKW 1$L$BDLZ:'L'.BLKW 1$L$BDMZ:'L'.BLKW 1$ .BLKW <512.-.>/2$L$BASG:'L'.BLKW 0$$LBXL='B'<8.*>.=772KL$BFL2:'L'.BLKW 1KL$BLRL:'L'.BLKW 1KL$AME:'L' .BLKW 1K; .IIF NE .-1000 .ERROR DEFINITIONS OVERLAP NEXT LABEL BLOCK LB$REV='B'000400TS$PIC='B'100000TS$NHD='B'040000TS$ACP='B'020000TS$PMD='B'010000TS$SLV='B'004000TS$NSD='B'002000TS$PRV='B'000400TS$CMP='B'000200TS$CHK='B'000100TS$RES='B'000040TS$IOP='B'000020TS$SUP='B'000010TS$XHR='B'000004TS$NXH='B'000002TS$NEW='B'000001T2$FMP='B'000002T2$CLI='B'000001 .PSECT. .MACRO LBLDF$ X,Y .ENDM .ENDM¬ W  .MACRO PCBDF$ L,B,SYSDEFL .ASECTK.=0P.LNK:'L'.BLKW 1 .BLKW 1P.NAM:'L'.BLKW 2P.SUB:'L'.BLKW 1P.MAIN:'L'.BLKW 1BP.REL:'L'.BLKW 1 P.BLKS:'L'P.SIZE:'L'.BLKW 10P.WAIT:'L'.BLKW 2 .BLKW 2P.STAT:'L'.BLKW 10P.ST2:'L' .BLKW 10 .BLKW 3P.HDLN:'L'.BLKB 1'P.IOC:'L' .BLKB 1'$$$=.P.RRM:'L'.BLKW 1 .IF NDF M$$PRO.=$$$' .ENDC .IF NB SYSDEF P.LGTH='B'.' .ENDC.=0WP.LNK:'L'.BLKW 1P.PRI:'L'.BLKB 1P.RMCT:'L'.BLKB 1.P.NAM:'L'.BLKW 2P.SUB:'L'.BLKW 1P.MAIN:'L'.BLKW 1P.REL:'L'.BLKW 1 P.BLKS:'L'P.SIZE:'L'.BLKW 1: .BLKW 1P.SWSZ:'L'.BLKW 1LP.DPCB:'L'.BLKW 1.P.TCB:'L'.BLKW 1P.STAT:'L'.BLKW 1.P.HDR:'L' .BLKW 1 .BLKW 1P.ATT:'L' .BLKW 2'P.HDLN:'L'.BLKB 1P.IOC:'L' .BLKB 1$$$=.LP.RRM:'L'.BLKW 1 .IF NDF M$$PROK.=$$$. .ENDC.=0 P.LNK:'L'.BLKW 1P.PRI:'L'.BLKB 1P.RMCT:'L'.BLKB 1P.NAM:'L'.BLKW 2P.SUB:'L'.BLKW 1P.MAIN:'L'.BLKW 1NP.REL:'L'.BLKW 1 P.BLKS:'L'P.SIZE:'L'.BLKW 1.P.CBDL:'L'.BLKW 1 P.CSBA:'L'P.SWSZ:'L'.BLKW 1KP.DPCB:'L'.BLKW 1WP.OWN:'L' .BLKW 1IP.STAT:'L'.BLKW 1LP.ST2:'L' .BLKW 1KP.PRO:'L' .BLKW 1KP.ATT:'L' .BLKW 2WP.HDLN:'L'.BLKB 1 P.IOC:'L' .BLKB 1 $$$=.LP.RRM:'L'.BLKW 1 .IF NDF M$$PRO'.=$$$ .ENDC .PSECT PS.OUT='B'100000PS.CKP='B'40000NPS.CKR='B'20000.PS.CHK='B'10000.PS.FXD='B'4000PS.CAF='B'2000PS.LIO='B'1000 PS.NSF='B'400. PS.COM='B'200L PS.LFR='B'100N PS.PER='B'40 PS.NWB='B'20 PS.DEL='B'10 PS.AST='B'4B PS.CSA='B'2LPR.UBT='B'100000PR.U00(m 1gBS='B'40000'PR.UBR='B'20000'PR.UBP='B'10000:PR.UBN='B'4000PR.UBM='B'2000PR.UBL='B'1000 PR.UBK='B'400 PR.UBJ='B'200: PR.UBH='B'100. PR.UBF='B'40 PR.UBE='B'20 PR.CPD='B'10 PR.CPC='B'4. PR.CPB='B'2N PR.CPA='B'1=P2.LMA='B'40000SP2.CPC='B'200000P2.CHE='B'100000P2.SEC='B'4000P2.PAR='B'2000P2.POL='B'1000 P2.CPU='B'400F P2.PIC='B'200O P2.RON='B'100F P2.DRV='B'40 P2.LDD='B'20 P2.APR='B'7 .ASECT'.=0SP.LNK:'L' .BLKW 1'P.UCB:'L' .BLKW 1P.LBN:'L' .BLKW 1T .BLKW 1P.SUB:'L' .BLKW 1P.MAIN:'L' .BLKW 1P.REL:'L' .BLKW 1UP.SIZE:'L' .BLKW 1 P.DLGH='B'.L.=00 .BLKW 4P.SUB:'L' .BLKW 1'P.MAIN:'L' .BLKW 1P.REL:'L' .BLKW 1UP.SIZE:'L' .BLKW 1.=0RP.FID1:'L' .BLKW 1P.UCB:'L' .BLKW 1P.LBN:'L' .BLKW 12 .BLKW 1P.IID='B' P.LBN0P.FID2:'L' .BLKW 1P.MAIN:'L'.BLKW 12P.REL:'L' .BLKW 1UP.FID3:'L' .BLKW 1 .ASECTR.=0'A.PCBL:'L'.BLKW 1A.PRI:'L'.BLKB 1A.IOC:'L'.BLKB 1A.TCB:'L'.BLKW 1A.TCBL:'L'.BLKW 1 A.STAT:'L'.BLKB 1 A.MPCT:'L'.BLKB 1A.PCB:'L'.BLKW 1 A.LGTH='B'.. .PSECT. AS.PRO='B'100U AS.SBP='B'20 AS.RBP='B'40 AS.DEL='B'10 AS.EXT='B'4U AS.WRT='B'2' AS.RED='B'1. .MACRO PCBDF$ X,Y,Z .ENDM .ENDM W  .MACRO PKTDF$,L,B,SYSDEF  .ASECT.=177774A.KSR5:'L' .BLKW 1A.DQSR:'L' .BLKW 1 .BLKW 1A.CBL:'L' .BLKW 1BA.BYT:'L' .BLKW 1BA.AST:'L' .BLKW 1.A.NPR:'L' .BLKW 1=A.PRM:'L' .BLKW 1 AS.FPA='B'1. AS.RCA='B'2: AS.RRA='B'3. AS.PEA='B'41 AS.REA='B'5B AS.PFA='B'6T AS.CAA='B'7 AF.XCC='B'1K AF.NOT='B'2L AF.OOB='B'4G AF.AST='B'10 AF.ESQ='B'20 AF.LCK='B'40 AF.QUE='B'100' AF.MDE='B'200' AB.NPV='B'1' AB.TYP='B'2' AB.CTC='B'4' A.PLGH='B'70 A.DUCB='B'10 A.DLGH='B'10. AK.BUF='B'200 AK.OCB='B'201L AK.GBI='B'202S AK.TBT='B'203 AK.DIO='B'204W AK.GGF='B'205.SF.PRV='B'100000SF.IN='B' 40000B.=0YG.LNK:'L'.BLKW 1G.GRP:'L'.BLKB 1G.STAT:'L'.BLKB 1G.CNT:'L'.BLKW 1G.EFLG:'L'.BLKW 2R G.LGTH='B'.R GS.DEL='B'1P PC.HIH='B'1R PC.LOW='B'2P PC.ALF='B'4C PC.XIT='B'200CPC.NRM='B'PC.HIH*400PC.ALM='B'PC.LOW*400 PF.INS='B'40 PF.LOG='B'100' PF.REQ='B'2000PF.ALL='B'177777.=0NO.LNK:'L'.BLKW 1O.MCRL:'L'.BLKW 1O.PTCB:'L'.BLKW 1BO.AST:'L'.BLKW 1O.EFN:'L'.BLKW 1O.ESB:'L'.BLKW 1O.STAT:'L'.BLKW 8. O.LGTH='B'. .ASECT'.=0I.LNK:'L' .BLKW 1PI.PRI:'L' .BLKB 1=I.EFN:'L' .BLKB 1.I.TCB:'L' .BLKW 1RI.LN2:'L' .BLKW 1TI.UCB:'L' .BLKW 1:I.FCN:'L' .BLKW 1'I.IOSB:'L' .BLKW 1 .BLKW 1 .BLKW 1I.AST:'L' .BLKW 1WI.PRM:'L' .BLKW 1C .BLKW 6 .BLKW 1IP.FAK ='B' 20IP.ABO ='B' 40IP.PND ='B' 100'IP.UMR ='B'200 I.ATTL='B'.'I.AADA:'L' .BLKW 2 I.LGTH='B'..I.ATRL='B'6*8. .ASECT'.= 0I.XLNK:'L' .BLKW 1BI.XIOP:'L' .BLKW 1.I.XTCB:'L' .BLKW 1:I.XMOD:'L' .BLKW 2'I.XRBF:'L' .BLKW 2I.XRBL:'L' .BLKW 1NI.XTMO:'L' .BLKW 1:I.XPBF:'L' .BLKW 2LI.XPBL:'L' .BLKW 1 I.XPBV:'L' .BLKW 1BI.XTTB:'L' .BLKW 2KI.XTTL:'L' .BLKW 1 I.XDBF:'L' .BLKW 21I.XDBL:'L' .BLKW 1 I.XLEN='B'.K.=0C.PTCB:'L' .BLKW 1C.PNAM:'L' .BLKW 2C.PSTS:'L' .BLKW 1C.PDPL:'L' .BLKB 1C.PCPL:'L' .BLKB 1 C.PRMT:'L' CP.NUL='B'1A CP.MSG='B'2 CP.LGO='B'4 CP.DSB='B'10 CP.PRV='B'20 CP.SGL='B'40 CP.NIO='B'100I CP.RST='B'200. CP.EXT='B'400LCP.POL='B'1000CP.CTC='B'2000.=0'C.CLK:'L' .BLKW 1C.CTCB:'L' .BLKW 1C.CUCB:'L' .BLKW 1C.CCT:'L' .BLKW 1C.CSTS:'L' .BLKW 1 C.CMCD:'L'C.CSO:'L' .BLKW 1C.CTR:'L' .BLKB 1C.CBLK:'L' .BLKB 1 C.CTXT:'L' CC.MCR='B'1' CC.PRM='B'2 CC.EXT='B'4 CC.KIL='B'10 CC.CLI='B'20 CC.MSG='B'40 CC.TTD='B'100. CC.CTC='B'200' CM.INE='B'1. CM.IND='B'2B CM.CEN='B'3' CM.CDS='B'4A CM.ELM='B'5 CM.EXT='B'6 CM.LKT='B'70 CM.RMT='B'8. CM.MSG='B'9..=0NA.REL:'L' .BLKW 1'A.DIS:'L' .BLKW 10A.MAS:'L' .BLKW 2A.NUM:'L' .BLKB 1'A.FLEN:'L'.BLKB 11A.LIN:'L' .BLKW 11A.ACC:'L' .BLKB 11A.STA:'L' .BLKB 11 A.PLEN='B'...=A.LIN.A.IMAP:'L' .BLKW 1A.IBUF:'L' .BLKW 1A.ILEN:'L' .BLKW 1A.SMAP:'L' .BLKW 1A.SBUF:'L' .BLKW 1A.SLEN:'L' .BLKW 1A.IOS:'L' .BLKW 2C A.RES='B'. UA.ACC='B'1 UA.PRO00(ÓTADATADATADATADATADATADATADATADATA='B'2. UA.ECH='B'40 UA.TYP='B'10 UA.SPE='B'20 UA.PUT='B'40 UA.CAL='B'100A UA.COM='B'200 UA.ALL='B'400MUA.TRN='B'1000UA.TRA='B'2000.=0.A.ACCE:'L' .BLKW 1A.DEQU:'L' .BLKW 1A.POWE:'L' .BLKW 1A.INPU:'L' .BLKW 1A.OUTP:'L' .BLKW 1A.CONN:'L' .BLKW 1A.DISC:'L' .BLKW 1A.RECE:'L' .BLKW 1A.PROC:'L' .BLKW 1A.TRAN:'L' .BLKW 1A.CALL:'L' .BLKW 1 AS.DLT='B'1. AS.DIS='B'2W .PSECTP .MACRO PKTDF$ X,Y,Z .ENDM .ENDM\W  .MACRO SCBDF$,L,B,SYSDEF. .IF NB SYSDEF .ASECT'.=0AS.LHD:'L' .BLKW 2' S.URM:'L'E .IF DF M$$PRO .BLKW 1 .ENDCS.FRK:'L' .BLKW 1 .BLKW 1 .BLKW 1 .BLKW 1 .IF DF L$$DRVS.KS5:'L' .BLKW 1. .ENDCS.PKT:'L' .BLKW 1S.CTM:'L' .BLKB 1S.ITM:'L' .BLKB 1S.STS:'L' .BLKB 1S.ST3:'L'.BLKB 1S.ST2:'L' .BLKW 11S.KRB:'L' .BLKW 11S.RCNT:'L'.BLKB 11S.ROFF:'L'.BLKB 11S.EMB:'L'.BLKW 1S.KTB:'L' .BLKW 1S .PSECTWS.PORT='B'S.EMB+2 S.PBIA='B'S.EMB+4MS.QST='B'S.EMB+6S.BSYU='B'S.EMB+10 .IFFB S2.EIP='B'1F S2.ENB='B'2. S2.LOG='B'4 S2.MAD='B'10 S2.LDS='B'40 S2.OPT='B'100P S2.CON='B'200. S2.OP1='B'400 S2.OP2='B'1000S2.ACT='B'2000S2.XHR='B'4000S2.KRQ='B'10000 S3.DRL='B'1N S3.NRL='B'2 S3.SIP='B'4T S3.ATN='B'10 S3.SLV='B'20 S3.SPA='B'40 S3.SPB='B'100. S3.OPT='B'200S3.SPU='B'S3.SPA!S3.SPB: KP.OFL='B'1 .ASECT'.=0 M.LNK:'L' .BLKW 1M.UMRA:'L' .BLKW 1M.UMRN:'L' .BLKW 1M.UMVL:'L' .BLKW 1M.UMVH:'L' .BLKB 1M.BFVH:'L' .BLKB 1M.BFVL:'L' .BLKW 1 M.LGTH='B'.F .ENDC .PSECT .MACRO SCBDF$,X,Y,Z .ENDM .ENDM¨ W  .MACRO TCBDF$,L,B,SYSDEF0 .ASECT1.=00T.LNK:'L' .BLKW 1T.PRI:'L' .BLKB 1XT.IOC:'L' .BLKB 1'T.PCBV:'L' .BLKW 1T.NAM:'L' .BLKW 23T.RCVL:'L' .BLKW 2T.ASTL:'L' .BLKW 2T.EFLG:'L' .BLKW 2T.UCB:'L' .BLKW 1'T.TCBL:'L' .BLKW 1T.STAT:'L' .BLKW 1T.ST2:'L' .BLKW 1 T.ST3:'L' .BLKW 11T.DPRI:'L' .BLKB 1T.LBN:'L' .BLKB 31.T.IID='B' T.LBN+1 ;IMAGE INDEX FOR CPR SYSTEMT.LDV:'L' .BLKW 1LT.PCB:'L' .BLKW 1HT.MXSZ:'L' .BLKW 1T.ACTL:'L' .BLKW 1T.ATT:'L' .BLKW 2NT.ST4:'L' .BLKW 1T.HDLN:'L' .BLKB 1 .BLKB 1T.GGF:'L' .BLKB 1NT.TIO:'L' .BLKB 1RT.EFLM:'L' .BLKW 2T.TKSZ:'L' .BLKW 1$$$=..T.OFF:'L' .BLKW 1B .BLKB 1T.SRCT:'L' .BLKB 1T.RRFL:'L' .BLKW 2 .IF NDF P$$LAS.=$$$L .ENDC .IF NB SYSDEF$$$=.T.CTX:'L' .BLKW 1 .IF NDF N$$DIR .=$$$: .ENDC$$$=..T.OCBH:'L' .BLKW 2T.RDCT:'L' .BLKW 1 .IF NDF P$$OFF;.=$$$N .ENDCT.SAST:'L' .BLKW 1$$$=. T.RRM:'L'.BLKW 1T.IRM:'L'.BLKW 1T.CPU:'L'.BLKB 1 .BLKB 1 .IF NDF M$$PRON.=$$$: .ENDC$$$=..T.ACN:'L'.BLKW 1 .IF NDF A$$CNTL.=$$$  .ENDC$$$=.BT.ISIZ:'L'.BLKW 1. .IF NDF U$$DAS'.=$$$1 .ENDC T.LGTH='B'.B T.EXT='B'0 .IFF.TS.EXE='B'100000TS.RDN='B'400002TS.MSG='B'20000TS.CIP='B'10000TS.RUN='B'40006TS.RSW='B'2000 ;TASK IS WAITING FOR A REMOTE SERVICETS.STP='B'1000 TS.CKR='B'1002 TS.BLC='B'37TS.BLK='B'177777T2.AST='B'100000T2.DST='B'40000.T2.CHK='B'20000.T2.REX='B'10000.T2.SEF='B'4000T2.SIO='B'1000 T2.AFF='B'400F T2.HLT='B'200= T2.ABO='B'100$ T2.STP='B'40 T2.STP='B'20 T2.SPN='B'10 T2.SPN='B'4C T2.WFR='B'2S T2.WFR='B'1.T3.ACP='B'100000T3.PMD='B'40000T3.REM='B'20000XT3.PRV='B'10000ST3.MCR='B'4000T3.SLV='B'2000T3.CLI='B'1000 T3.RST='B'4000 T3.NSD='B'200' T3.CAL='B'100' T3.ROV='B'40 T3.NET='B'20 T3.MPC='B'10 T3.CMD='B'4' T3.SWS='B'2' T3.GFL='B'1C2T4.LRW='B'2000 ;TASK IS WAITING FOR A LOCAL RING4T4.LBW='B'1000 ;TASK IS WAITING FOR A LOCAL BUFFER2T4.DFB='B'400 ;TASK HAS DEFERRED BINDING ENABLED T4.FMP='B'2000 T4.CTC='B'1000 T4.MUT='B'40 T4.LDD='B'20 T4.PRO='B'10 T4.PRV='B'4S T4.DSP='B'2. T4.SNC='B'10TR.UBT='B'100000TR.UBS='B'400000TR.UBR='B'200000TR.UBP='B'100000TR.UBN='B'4000TR.UBM='B'2000TR.UBL='B'1000 TR.UBK='B'4000 TR.UBJ='B'2000 TR.UBH='B'1000 TR.UBF='B'40 TR.UBE='B'20 TR.CPD='B'10 TR.CPC='B'4' TR.CPB='B'2C TR.CPA='B'10 .ENDC .PSECTT .MACRO TCBDF$ X,Y,Z .ENDM .ENDMžW  .MACRO CTBDF$,L,B,SYSDEF' .ASECTT.=177700(m 1g56L.CLK:'L' .BLKW 8.L.ICB:'L' .BLKW 1L.LNK:'L' .BLKW 1ML.NAM:'L' .BLKW 1'L.DCB:'L' .BLKW 14L.NUM:'L' .BLKB 1'L.STS:'L' .BLKB 1L.KRB:'L' .BLKW 1R .PSECT0 LS.CLK='B'1' LS.MDC='B'2U LS.CBL='B'4 LS.CIN='B'10 LS.NET'B'=20 CI.CSR='B'-6 CI.KRB='B'-4 CI.PWF='B'-2 CI.INT='B'0U CI.DCB='B'2R .MACRO CTBDF$,X,Y,Z .ENDM .ENDMW  .MACRO OLRDF$ $$$GBL0 .MCALL .WORD.,DEFIN$A .IF IDN <$$$GBL>,....GBL=1 .IFF...GBL=0 .ENDC .MACRO FUNC NAME,SUBF,FUN,MASK6 .WORD. IO.'NAME,SUBF,FUN: FUNCA NAME, .ENDM .MACRO FUNCA NAME,MSK PARCT=0 DESCT=0 .IRP X,K .IIF IDN ,

PARCT=PARCT+1L .IIF IDN , DESCT=DESCT+1'2 .IIF GT .ERROR INVALID PARAMETER COUNT3 .IIF GT .ERROR INVALID DESCRIPTOR COUNTT .ENDR TEMP=+$( .WORD. IO$'NAME,<>,TEMP .ENDM .WORD. IO.MFC,000,001 .WORD. IO.RSC,000,002 .WORD. IO.WSC,000,006 FUNC ONL,001,006,. FUNC OFL,002,006,U FUNC MAI,003,006,' FUNC CAC,004,006,<> FUNC MEM,005,006,<> FUNC STN,006,006,P FUNC HRC,007,006,, FUNC ONE,010,006,  FUNC STA,011,006,D FUNC IF ,012,006, FUNC RLI,013,006,V FUNC RUL,014,006,T' FUNC MBO,015,006,N FUNC RSW,016,006,P FUNC WAT,017,006,A FUNC RAT,020,006,P' FUNC MBF,021,006, IO$MAX=21 DEFIN$ IS.HRG,6.0 .MACRO OLREM$ $$$VAL=-256..& .IOER. IE$DAL," .IOER. IE$DNL, .IOER. IE$PRM, .IOER. IE$SYN,,' .IOER. IE$AFE,TD .IOER. IE$TMU,( .IOER. IE$CAB,1 .IOER. IE$TRP,D+ .IOER. IE$ALG,23 .IOER. IE$TQU, # .IOER. IE$EPO,A$ .IOER. IE$EUO,* .IOER. IE$ECO,$ .IOER. IE$EPF,% .IOER. IE$EUF,x+ .IOER. IE$ECF,r< .IOER. IE$CFU,; .IOER. IE$CSR,RC .IOER. IE$SWF,b? .IOER. IE$ICE,e8 .IOER. IE$SCE,6 .IOER. IE$MDE,6 .IOER. IE$NFW,: .IOER. IE$CXT,* .IOER. IE$IDU,8 .IOER. IE$UNK,= .IOER. IE$SZE,nF .IOER. IE$POB,F .IOER. IE$NLB,C .IOER. IE$OMP,t= .IOER. IE$POC,v- .IOER. IE$DFE,i5 .IOER. IE$IDS,s= .IOER. IE$UOE,o .ENDM CO$ONL = 1R CO$OFL = 2o CO$UNK = 3e CO$ACC = 4e CO$ANY = 5E CO$MAI = 6C CO$MAX = 6 CD$STO = 2i CD$GOT = 4 CD$CON = 6 CD$MAX = 6. M$LOG = 1 M$INIT = 2N M$DEBG = 4n M$EXIT = 10 .ASECTP .=0C$DTYP: .BLKB 1a ET$HDR = 1 ET$END = 2s ET$DEV = 'AC$DECT: .BLKB 1tC$DVER: .BLKB 1 C$DSTD: .BLKB 1C$DMUB: .BLKB 1RC$DMCT: .BLKB 1a .EVENC$DFAC: .BLKW 2SC$DIDN: .BLKW 9.C$STD: .=0C$DTYP:C$DNAM: .BLKW 1RC$DPUN: .BLKB 1 C$DLUN: .BLKB 1nC$DSCT: .BLKB 1C$DEVT: .BLKB 1$C$DSTS: .BLKW 1 CS$ATR=1C CS$EXF=76 CS$SUB=100$ ;CS$XXX=200 CS$OFL=400$ CS$PDF=1000 CS$POR=2000 CS$MBD=4000 CS$UNK=10000G CS$ACC=20000 CS$MTD=40000n CS$DRV=100000C$DST2: .BLKW 1$ CS$PUN=20 CS$CRD=40 CS$PRC=100 CS$CTL=200 00(ÓTADATADATADATADATADATADATADATADATA CS$DCL=3400 DC$UNI = 0V DC$CTL = 1 DC$MKU = 2 DC$MKC = 3B DC$SBU = 4T DC$SBC = 5. DC$CPU = 6 ;DC$XXX = 7C$DDAT: .BLKW 2TC$SME: .=C$SMEC$DKPO: .BLKW 1RC$SCT: .=C$SMEC$DCTN: .BLKW 1nC$DUPO: .BLKW 1C$SUN: .=C$SMEC$DCPO: .BLKW 1 C$SCP: .=C$SMEC$DCTN: .BLKW 10 .BLKW 4C$SMB: CP$OFL=400 CP$XXX=1000 CP$CUR=2000 CP$XXX=4000 CP$XXX=10000 CP$ACC=20000 CP$MTD=40000 CP$XXX=100000 .MACRO ATT NAME,SIZ $$$TMP=$$$TMP+1! DEFIN$ DA$'NAME,$$$TMP!<400*SIZ>C .ENDM $$$TMP=0V ATT CSR,2 ATT VEC,2 ATT UBR,2 ATT TYP,2 ATT VOL,12. ATT ERR,10$ ATT PRI,2 ATT MBP,6 ATT STE,2 ATT SAL,2 ATT DSN,2 ATT CSN,10  .ASECT: .=0C$MBAS: .BLKW 1KC$MINT: .BLKB 1K .BLKB 1C$MSIZ: .BLKW 1CC$MGRN: .BLKW 1CC$MDSC:S .PSECTN .MACRO OLRDF$ X .ENDM .MACRO ATT X .ENDM .ENDMÞW  .MACRO DEVCD$ $$$GBL .MCALL DEFIN$ .IF IDN <$$$GBL>,0...GBL=1 .IFF ...GBL=0 .ENDC .MACRO DEV XN DEFIN$ D$'X,$$$TMP0 $$$TMP=$$$TMP+1 .ENDM $$$TMP = 0 DEV UDET DEV UKNO DEV RK03 DEV RK05. DEV RK5F1 DEV RX01I DEV RX02P DEV RL01E DEV RL02L DEV RP02N DEV RP03N DEV RP04C DEV RP05$ DEV RP06 DEV RP07 DEV RK06. DEV RK07S DEV RM02C DEV RM03B DEV RM05D DEV RM80C DEV RS03 DEV RS04. DEV RF11R DEV TK25. DEV TK50M DEV TU10 DEV TU16A DEV TU45$ DEV TU77C DEV TU78 DEV TS11$ DEV TSU0G DEV TSV01 DEV TU80. DEV TU81N DEV TM02 DEV TM03F DEV TM78$ DEV TU56M DEV TU58 DEV TU60$ DEV MSCPD DEV RA60D DEV RA80D DEV RA81D DEV RC25D DEV RD50D DEV RD51D DEV RX50D DEV ML11D DEV TERMD $$$TMP=370V DEV USR0V DEV USR1V DEV USR2V DEV USR3V DEV USR4V DEV USR5V DEV USR6V DEV USR7V .MACRO DEVCD$ .ENDM .MACRO DEV X0 .ENDM .ENDM W  .MACRO ACNDF$,L,B .ASECT.=0TB.LNK:'L'.BLKW 1B.TYP:'L'.BLKB 1B.LEN:'L'.BLKB 1B.TIM:'L'.BLKW 3 B.HID='B'.B.UID:'L'.BLKW 2B.ACN:'L'.BLKW 1B.TID:'L'.BLKB 1 .BLKB 1 B.HEND='B'.$$$HLN=.B.CPU:'L'.BLKW 2B.DIR:'L'.BLKW 2B.QIO:'L'.BLKW 2B.TAS:'L'.BLKW 2B.MEM:'L'.BLKW 3B.BEG:'L'.BLKW 3B.CPUL:'L'.BLKW 2MB.PNT:'L'.BLKW 1B.STM:'L'.BLKB 1$$$TLN=..=$$$TLNB.USE:'L'.BLKB 1B.ACT:'L'.BLKW 1B.UUIC:'L'.BLKW 1 B.UCB:'L'.BLKW 1B.LGO:'L'.BLKW 3B.ULNK:'L'.BLKW 1B.RNA:'L'.BLKW 3B.NAM:'L'.BLKB 14. .BLKB 1 .BLKB 1B.LDS:'L'.BLKB 10. B.ULEN='B'..$$$= <.+77>/100..=$$$TLNB.PRI:'L'.BLKB 1B.TNAM:'L'.BLKW 2.B.TCB:'L' .BLKW 1LB.TST3:'L'.BLKW 1E .BLKW 1B.CUIC:'L'.BLKW 1LB.PUIC:'L'.BLKW 1WB.CTXT:'L'.BLKW 22B.TCKP:'L'.BLKW 2B.OVLY:'L'.BLKW 2.B.EXST:'L'.BLKW 2P B.TLEN='B'.MB.TBLK='B'<.+77>/100.=$$$TLNB.SHDN:'L'.BLKB 1$B.UHD:'L'.BLKW 1B.ULO:'L'.BLKW 1B.ULT:'L'.BLKW 2B.CKP:'L'.BLKW 2B.SHF:'L'.BLKW 2B.RND:'L'.BLKW 2B.FID:'L'.BLKW 3B.DVNM:'L'.BLKB 2.B.UNIT:'L'.BLKW 1B.EXTS:'L'.BLKW 1.B.LSCN:'L'.BLKW 3'B.SCNR:'L'.BLKW 1.B.DSCN:'L'.BLKW 1LB.STSP:'L'.BLKW 2'B.SYSM:'L'.BLKW 1 B.CKUS:'L'.BLKW 3'B.CKSP:'L'.BLKW 21B.CKAL:'L'.BLKW 1L B.SLEN='B'.BB.CPUT:'L'.BLKW 8.B.CTXP:'L'.BLKW 8.B.IDCT:'L'.BLKW 8.B.QIOC:'L'.BLKW 8.B.MIOC:'L'.BLKW 8.B.AIOC:'L'.BLKW 8.B.IPSN:'L'.BLKW 8.B.IPRC:'L'.BLKW 8.B.CKEX:'L'.BLKW 2LB.CFCL:'L'.BLKW 2.B.CFRK:'L'.BLKW 2LB.TLOD:'L'.BLKW 2WB.RLOD:'L'.BLKW 22 .BLKB 82.B.SSBL=.-B.SLEN'$$$= <.+77>/100' .= $$$HLN B.SSLN='B' . .= $$$HLNNB.CTLS:'L'.BLKW 3RB.CSRT:'L'.BLKW 1NB.CRSN:'L'.BLKB 60.' B.CLEN='B'.. .= $$$HLNKB.INAM:'L'.BLKB 14. B.IUIC:'L'.BLKB 6.B.IPSW:'L'.BLKB 6. B.ILEN='B'.' .= $$$HLN'B.DNAM:'L'.BLKW 1'B.DUNT:'L'.BLKB 1' B.DLEN='B'.. .BLKB 1B.DLBL:'L'.BLKW 6BB.DMST:'L'.BLKW 1BB.DUIC:'L'.BLKW 1BB.DVPR:'L'.BLKW 1BB.DACP:'L'.BLKW 2B B.MLEN='B'.L BM.SHR='B'1 BM.NOS='B'2K BM.SYS='B'4' BM.FOR='B'10 .= $$$HLNKB.TOLD:'L'.BLKB 6.B.TNEW:'L'.BLKB 6= B.TMLN='B'. .= $$$HLNB.PNAM:'L'.BLKW 3$B.PPGS:'L'.BLKW 1KB.PNFI:'L'.BLKW 1KB.PFRM:'L'.BLKB 1KB.PPRI:'L'.BLKB 1.B.PDEV:'L'.BLKW 1MB.PPUN:'00('m 1gL'.BLKB 1U B.PLEN='B'.. .= $$$HLN'B.RNAM:'L'.BLKW 3'B.RCDS:'L'.BLKW 1NB.RDEV:'L'.BLKW 1UB.RUNT:'L'.BLKB 1LB.RSOP:'L'.BLKB 1 B.RLEN='B'.K .= $$$HLNTB.LUIC:'L'.BLKW 1CB.LNAM:'L'.BLKB 14.' .BLKB 1 B.LLEN='B'.B.=$$$HLNB.OFID:'L'.BLKW 3'B.ODNM:'L'.BLKB 2B.OUNT:'L'.BLKW 1RB.NFID:'L'.BLKW 3B.NDNM:'L'.BLKB 2B.NUNT:'L'.BLKW 1B.OEXS:'L'.BLKW 1$B.NEXS:'L'.BLKW 1KB.OSCR:'L'.BLKW 1KB.NSCR:'L'.BLKW 1KB.ODSC:'L'.BLKW 1KB.NDSC:'L'.BLKW 1K B.RTLN='B'.' BT.SAB='B'1. BT.UAB='B'2 BT.TAB='B'3' BT.SS='B'11' BT.INV='B'12 BT.TIM='B'13 BT.ALL='B'14 BT.DEA='B'15 BT.MOU='B'16 BT.DMO='B'17 BT.PRT='B'20 BT.DIR='B'21 BT.VOL='B'22 BT.LOG='B'23 BT.CRH='B'24 BT.DST='B'25 BT.RTP='B'26 BT.INP='B'27 BS.ACT='B'200' BS.CRH='B'100D BS.LGO='B'40 BS.CO='B'40B BS.TML='B'20 BS.SIL='B'20 BS.ZER='B'10 BS.SCN='B'4'BF.DST='B'40000SBF.WRT='B'2000BF.SCN='B'1000 BF.SLR='B'400K BF.ERR='B'200' BF.STR='B'100C BF.LSS='B'40 BF.TRN='B'10 BF.XTK='B'4' BF.TSK='B'2' BF.XAC='B'1'B.MAXL='B'128.B.MINL='B'$$$HLN .PSECT' .MACRO ACNDF$ X,Y .ENDM .ENDMFW  .MACRO ACTDF$,L,B .ASECT'.=0TA.GRP:'L' .BLKB 3'A.MBR:'L' .BLKB 3A.PSWD:'L' .BLKB 6A.LNM:'L' .BLKB 14.A.FNM:'L' .BLKB 12.'A.LDAT:'L' .BLKB 6A.NLOG:'L' .BLKB 2A.SYDV:'L' .BLKB 4A.ACN:'L' .BLKW 1A.CLI:'L' .BLKW 2 .BLKW 2DA.LPRV:'L' .BLKW 1A.SID:'L' .BLKW 1'A.DDS:'L' .BLKB 11. .BLKB 10A.FPRO:'L' .BLKW 1FA.RLVL:'L' .BLKW 1 AR.LVL='B'401'A.SALT:'L' .BLKW 1A.ENCT:'L' .BLKB 1 .BLKB 1IA.HPW:'L' .BLKW 4C .IF DF A$$LOG$A.TTY:'L' .BLKB 5MA.PRID:'L' .BLKB 1A.SECD:'L' .BLKB 1A.PRIT:'L' .BLKW 1A.SECT:'L' .BLKW 1 A.RLEN ='B' . .ENDC'A.LEN ='B' 128.L AL.SLV='B' 1 AL.DDS='B' 2 AL.SIL='B' 4 .IF DF A$$LOGL AL.AUT='B' 10 AL.BND='B' 20B AL.RMT='B' 40BAL.NET='B' 100AL.DIS='B' 200AL.PRI='B' 400AL.SEC='B' 1000: .ENDC  .PSECT: .ENDMðW  .MACRO SHDDF$,L,B,SYSDEFL PKTDF$L .ASECTL.=0'M.LNK:'L' .BLKW 1LM.LHD:'L' .BLKW 1LM.UCBS:'L'.BLKW 2.M.STS:'L' .BLKW 1 M.LBN:'L' .BLKB 1T .BLKB 1 .BLKW 1M.LGH=.1 .PSECT' MS.MDA'B'=1. MS.CHP'B'=2W .ASECTT.=0.ML.LNK:'L' .BLKW 1ML.LEN:'L' .BLKB 1ML.TYP:'L' .BLKB 1ML.DNC:'L' .BLKB 1 .BLKB 1ML.PRI:'L' .BLKW 1ML.PKT:'L' .BLKB I.LGTH2ML.LGH=. .PSECT MT.PKT'B'=10 I.R0'B'=I.PRM0I.R1'B'=I.PRM+2 .PSECT'ML.FID'B'=ML.PKT+I.IOSB:ML.FSEQ'B'=ML.PKT+I.IOSB+2ML.LBN'B'=ML.PKT+I.PRM+10ML.CNT'B'=ML.PKT+I.PRM+4ML.TCB'B'=ML.PKT+I.TCBML.SR0'B'=ML.PKT+I.R0'ML.SR1'B'=ML.PKT+I.R1BML.PR0'B'=ML.PKT+I.PRM+14ML.PR1'B'=ML.PKT+I.PRM+16G .MACRO SHDDF$,X,Y,Z .ENDM .ENDM’W  .MACRO MKDEF$ $$$GBL .MCALL .WORD.,DEFIN$T .IF IDN <$$$GBL>,....GBL=1 .IFF ...GBL=0 .ENDC .WORD. IO.GRN 0,6.B .WORD. IO.SIZ 0,7.. .WORD. IO.ORG 0,9. .WORD. IO.INT 0,24. .WORD. IO.IIN 0,25. .WORD. IO.PRG 0,26. .WORD. IO.ERR 0,27. .WORD. IO.RSA 0,28. .WORD. IO.CST 0,29. .WORD. IO.MSK 0,30. .WORD. IO.CLM 0,31. .WORD. IO.SSI 1,7.' .WORD. IO.SOR 1,9.R .WORD. IO.SIN 1,24. .WORD. IO.SII 1,25. .WORD. IO.SMA 1,26. .WORD. IO.SER 1,27. .WORD. IO.SMK 1,30. .WORD. IO.CII 3,25. .WORD. IO.CMA 3,26. .WORD. IO.CER 3,27. IE.IDS=-25. IS.MAN=2 EPT=1 MS.SET=2. MS.CLR=4D .ENDMðW  .MACRO LCBDF$,L,B .ASECT9.=0.L.LNK:'L' .BLKW 1L.NAM:'L' .BLKW 1.L.UNIT:'L' .BLKB 1L.TYPE:'L' .BLKB 1L.UCB:'L' .BLKW 1AL.ASG:'L' .BLKW 1CL.LGTH='B'.-L.LNKO .PSECT. .MACRO LCBDF$,X,Y .ENDM .ENDMôW  .MACRO UCBDF$,L,B,TTDEF,SYSDEF. .ASECT .=177772 .IF NB SYSDEF .IF DF A$$CNT.=.-2R .ENDC .IF DF L$$GCL.=.-2. .ENDC.=.-22 .IF DF N$$DIR.=.-2. .ENDC U.UAB:'L'2 .IF DF A$$CNT .BLKW 1 .ENDC U.LOG:'L'= .IF DF L$$GCL. .BLKW 1 .ENDC U.FPRO:'L' .BLKW 1 U.CTX:'L'9 .IF DF N$$DIR .BLKW 1 .ENDC .ENDCU.MUP:'L' .BLKW 1LU.LUIC:'L' .BLKW 1U.OWN:'L' .BLKW 1KU.DCB:'L' .BLKW 1KU.RED:'L' .BLKW 1.U.CTL:'L' .BLKB 1AU.STS:'L' .BLKB 00(/ÓTADATADATADATADATADATADATADATADATA1NU.UNIT:'L' .BLKB 1U.ST2:'L' .BLKB 1CU.CW1:'L' .BLKW 1EU.CW2:'L' .BLKW 17U.CW3:'L' .BLKW 1U.CW4:'L' .BLKW 1-U.SCB:'L' .BLKW 1 U.ATT:'L' .BLKW 1NU.BUF:'L' .BLKW 1  .BLKW 1U.CNT:'L' .BLKW 1:U.UCBX='B'U.CNT+2TU.ACP='B'U.CNT+4U.VCB='B'U.CNT+6U.CBF='B'U.CNT+2U.UMB='B'U.CNT+10OU.PRM='B'U.CNT+12TU.ICSR='B'U.CNT+16U.SLT='B'U.CNT+20CU.SPRM='B'U.CNT+22U.UTIL='B'U.CNT+16 UU.SER ='B'1 UU.RCT ='B'2 UU.AVN ='B'4 UU.GUS ='B'10L UU.ONL ='B'20T UU.SPC ='B'40UU.ATN ='B'100UU.RDY ='B'200UU.ABO ='B'400 UU.SIO ='B'1000LUU.IOS ='B'2000:UU.BLK ='B'4000U.BPKT='B'U.CNT+20U.MEDI='B'U.BPKTU.UC2X='B'U.CNT+24U.SNUM='B'U.CNT+10U.FCDE='B'U.CNT+12U.KRB1='B'U.CNT+14.=0: .BLKW 9.'X.NAME:'L' .BLKW 2X.IOC:'L' .BLKW 2CX.ERSL:'L' .BLKB 1X.ERHL:'L' .BLKB 1X.ERSC:'L' .BLKB 1X.ERHC:'L' .BLKB 1X.WCNT:'L' .BLKW 2X.CYLC:'L' .BLKW 2X.CCYL:'L' .BLKW 1X.FCUR:'L' .BLKB 1 X.FLIM:'L'X.DSKD:'L' .BLKB 1X.DNAM:'L' .BLKW 1X.UNIT:'L' .BLKB 1X.CSTS:'L' .BLKB 1X.CPCB:'L' .BLKW 1X.CSBA:'L' .BLKW 1X.CCED:'L' .BLKW 2X.XDAT:'L' .BLKB 1X.XRDA:'L' .BLKB 1X.XDIR:'L' .BLKB 1X.XLOG:'L' .BLKB 1X.XOVR:'L' .BLKB 1X.CST2:'L' .BLKB 1 X.LGTH='B'.' X.DFFL='B'10. X.DFSL='B'8. X.DFHL='B'5. XC.ENA='B'200B XC.ACT='B'100' XC.DFR='B'040R XC.DIR='B'020 XC.OVR='B'010B XC.DAT='B'004. XC.LOG='B'002' XC.RDA='B'001Y X2.DEA='B'12XX.MAX='B'127. XX.DAT='B'5. XX.RDA='B'5. XX.DIR='B'1. XX.LOG='B'1. XX.OVR='B'4..=01X.MLUN:'L'.BLKW 11X.UNFL:'L'.BLKW 11 .BLKW 2X.UNTI:'L'.BLKW 4'X.MEDI:'L'.BLKW 2'X.SHUN:'L'.BLKW 1'X.SHST:'L'.BLKW 1'X.TRCK:'L'.BLKW 1'X.GRP:'L'.BLKW 1X.CYL:'L'.BLKW 1X.USVR:'L'.BLKB 1SX.UHVR:'L'.BLKB 1GX.RCTS:'L'.BLKW 1'X.RBNS:'L'.BLKB 1X.RCTC:'L'.BLKB 1AX.UNSZ:'L'.BLKW 2'X.VSER:'L'.BLKW 2R X.DUSZ='B'.2 .IF NB TTDEF1.=U.BUFT U.TAPR:'L'U.TUX:'L' .BLKW 1AU.TSTA:'L' .BLKW 4U.UIC:'L' .BLKW 1U.TFRQ:'L' .BLKW 1U.TFLK:'L' .BLKW 1U.TCHP:'L' .BLKB 1U.TCVP:'L' .BLKB 1U.TTYP:'L' .BLKB 1U.TMTI:'L' .BLKB 1U.TTAB:'L' .BLKW 1 .=.-2U.TECO:'L' .BLKB 1U.TBSZ:'L' .BLKB 1U.TLPP:'L' .BLKW 1U.TST5:'L' .BLKW 1U.TST6:'L' .BLKW 1U.TIXL:'L' .BLKW 1U.ACB:'L' .BLKW 1RU.AFLG:'L' .BLKW 1U.ADMA:'L' .BLKW 1U.LINS:'L' .BLKB 1U.CREN:'L' .BLKB 1U.SRVN:'L' .BLKW 1U.SESN:'L' .BLKB 1U.SLSZ:'L' .BLKB 1U.RSBB:'L' .BLKW 1U.RBHA:'L' .BLKW 1U.RSDV:'L' .BLKW 1U.TRLH:'L' .BLKW 1U.TRSC:'L' .BLKW 1U.CCBA:'L' .BLKW 1 UL.TRS='B'1' UL.TDA='B'2. UL.LST='B'4B UL.RDA='B'10 UL.ECH='B'20 UL.RSS='B'100 UL.LEN='B'200W LE.HIP='B'20 LE.TDC='B'40 LE.CIP='B'100. S1.RST='B'1P S1.ESC='B'2 S1.RSP='B'4L S1.PTH='B'10 S1.RNE='B'20 S1.TSY='B'40 S1.OBY='B'100B S1.IBY='B'200' S1.DPR='B'400DS1.DEC='B'1000S1.IBF='B'2000S1.DSI='B'4000S1.RES='B'10000'S1.RNF='B'20000'S1.TNE='B'40000ZS1.USI='B'100000 S2.RCU='B'11 S2.WRA='B'6. S2.WRB='B'2V S2.WAL='B'10 S2.BRQ='B'20 S2.SRQ='B'40 S2.ORQ='B'100C S2.IRQ='B'200 S2.FLF='B'400LS2.ELF='B'1000 S2.CR='B'2000AS2.OBF='B'4000S2.PCU='B'100000S2.BEL='B'20000WS2.CTO='B'40000ES2.CTS='B'100000 S3.ACR='B'1R S3.TAB='B'2E S3.CTC='B'4R S3.RAL='B'10 S3.NEC='B'20 S3.TSY='B'40 S3.8BC='B'100Y S3.FDX='B'200Y S3.MHE='B'400RS3.ICE='B'1000S3.TME='B'2000S3.PTH='B'4000S3.RES='B'10000'S3.PPT='B'20000'S3.RUB='B'40000' S4.HFL='B'7U S4.VFL='B'10 S4.HFF='B'20 S4.HHT='B'40 S4.DLO='B'1002 S4.HSY='B'200B S4.ANI='B'400QS4.AVO='B'1000S4.BLK='B'2000S4.DEC='B'4000S4.EDT='B'10000'S4.RGS='B'200000S4.SFC='B'400000S4.ABD='B'100000 S5.SW1='B'10 S5.TMM='B'2' S5.XOF='B'4C S5.XON='B'10 S5.HPC='B'14 S5.HPO='B'20 S5.OXF='B'40 S5.ITI='B'1003 S5.DEP='B'200T S5.DMA='B'400CS5.CLN='B'1000S5.RPO='B'2000S5.DWA='B'4000S5.VER='B'10000'S5.BCC='B'20000'S5.DAO='B'400000S5.ABP='B'100000 S6.LAT='B'1' S6.EIO='B'400LS6.RLU='B'1000S6.RDI='B'100000 .ENDC.=U.UNITU.OCNT:'L'.BLKB 1Y.=U.BUFU.RPKT:'L'.BLKW 1AU.WPKT:'L'.BLKW 1'U.IAST:'L'.BLKW 10U.OAST:'L'.BLKW 1'U.AAST:'L'.BLKW 1 .IF NB TTDEF0.IIF N00(7m 1gE U.AAST+2-U.UIC .ERROR0 .ENDC .=U.AAST+4U.PTCB:'L'.BLKW 1' .=U.BUF+2'U.CTCB:'L' .BLKW 1U.COTQ:'L' .BLKW 2U.RED2:'L' .BLKW 1 .PSECTD DV.REC='B'15 DV.CCL='B'2 DV.TTY='B'40 DV.DIR='B'10 DV.SDI='B'20 DV.SQD='B'40 DV.MSD='B'100D DV.UMD='B'2005 DV.MBC='B'400 DV.EXT='B'4006DV.SWL='B'1000DV.ISP='B'2000DV.OSP='B'4000DV.PSE='B'10000DV.COM='B'20000YDV.F11='B'40000TDV.MNT='B'100000U2.DH1='B'100000U2.DJ1='B'40000U2.RMT='B'20000'U2.HFF='B'10000 U2.L8S='B'100000U2.NEC='B'4000U2.CRT='B'2000U2.ESC='B'1000 U2.LOG='B'400' U2.SLV='B'200U U2.DZ1='B'100' U2.HLD='B'40 U2.AT.='B'20 U2.PRV='B'10 U2.L3S='B'4C U2.VT5='B'2' U2.LWC='B'1' UM.OVR='B'1' UM.CLI='B'36 UM.DSB='B'2000 UM.NBR='B'400UM.CNT='B'1000UM.CMD='B'2000UM.SER='B'4000UM.KIL='B'10000VU2.R04='B'100000U2.7CH='B'10000PU3.UPC='B'20000'U3.PAR='B'40000'U3.OPA='B'100000 U3.FDX='B'1M U3.DBF='B'2 U3.RPR='B'40 U4.CR='B'100 UC.ALG='B'200' UC.NPR='B'100F UC.QUE='B'40 UC.PWF='B'20 UC.ATT='B'10 UC.KIL='B'4' UC.LGH='B'3' US.BSY='B'200' US.MNT='B'100' US.FOR='B'40 US.MDM='B'20 US.PWF='B'10 US.ABO='B'1P US.MDE='B'2L US.WCK='B'10 US.SPU='B'2L US.VV='B'1 US.CRW='B'4M US.DSB='B'2M US.OIU='B'1 US.FRK='B'2 US.SHR='B'10 US.LAB='B'4' US.OFL='B'1' US.RED='B'2L US.PUB='B'42 US.UMD='B'10 US.PDF='B'20 US.MUN='B'40 US.TRN='B'100R US.SIO='B'200O UD.UNS='B'0 UD.200='B'1 UD.556='B'2 UD.800='B'3 UD.160='B'4 UD.625='B'5' UD.8K='B'6 .MACRO UCBDF$,X,Y,Z,A .ENDM .ENDMŠW  .MACRO MTADF$,L,B .ASECT0.=0SV.TCNT:'L' .BLKW 1V.TYPE:'L' .BLKB 1V.VCHA:'L' .BLKB 1V.LABL:'L' .BLKB 12.V.NXT:'L' .BLKW 1SV.MVL:'L' .BLKW 11V.UVL:'L' .BLKW 1DV.ATL:'L' .BLKW 1'V.UCB:'L' .BLKW 1SV.RVOL:'L' .BLKB 1V.MOU:'L' .BLKB 1V.TCHR:'L' .BLKW 1V.SEQN:'L' .BLKW 1V.SECN:'L' .BLKW 1V.TPOS:'L' .BLKB 1V.PSTA:'L' .BLKB 1V.TIMO:'L' .BLKW 1V.STAT:'L' .BLKW 3V.TRTB:'L' .BLKB 1V.EFTV:'L' .BLKB 1V.BLKL:'L' .BLKW 1V.RECL:'L' .BLKW 1V.FNAM:'L' .BLKW 3V.FTYP:'L' .BLKW 1V.FVER:'L' .BLKW 1V.CDAT:'L' .BLKW 2V.EDAT:'L' .BLKW 2V.BLKC:'L' .BLKW 2V.RTYP:'L' .BLKB 1V.FATT:'L' .BLKB 1 .BLKB 30..V.WIND:'L' .BLKW 4.V.MST2:'L' .BLKW 1:V.FABY:'L' .BLKB 1L .BLKB 1V.ANSN:'L' .BLKB 17.V.BOFF:'L' .BLKB 1.V.DENS:'L' .BLKB 1.V.DRAT:'L' .BLKB 1.V.DBLK:'L' .BLKW 1.V.DREC:'L' .BLKW 1. S.VSCB='B'.' .PSECT1 .ASECT'.=0L W.CTL:'L'.BLKW 1L V.WINC='B'V.WIND+W.CTL .PSECT' .ASECT.=0L .IF DF R$$11MM.NXT:'L' .BLKW 1. .ENDCM.UIC:'L' .BLKW 1'M.CH:'L' .BLKW 1M.PROT:'L' .BLKW 1 .IF NDF R$$11MC .BLKW 22M.NXT:'L' .BLKW 11 .ENDCM.RVOL:'L' .BLKB 1M.STAT:'L' .BLKB 1M.VIDP:'L' .BLKW 1M.UCB:'L' .BLKW 1Y S.MVL='B'. .PSECTB .ASECT..=0'L.NXT:'L' .BLKW 1FL.VOL1:'L' .BLKB 1L.VOL2:'L' .BLKB 1L.VID1:'L' .BLKB 6L.VID2:'L' .BLKB 6 S.UVL='B'. .PSECT.VM.OLD ='B' 200.VM.BYP ='B' 100VM.ULB ='B' 40VM.FSC ='B' 20VM.EXC ='B' 10 V2.INI ='B' 1. V2.XH2 ='B' 2. V2.XH3 ='B' 4.V2.NH3 ='B' 10V2.OAC ='B' 20 VP.RM ='B' 2 VP.WM ='B' 4 VP.UCM ='B' 6. VP.SM ='B' 10FVP.MOU ='B' 20VP.RWD ='B' 40VP.VFY ='B' VP.RWDVP.POS ='B' 100 VP.TO='B'1LWI.RDV ='B' 400.WI.WRV ='B' 1000WI.EXT ='B' 2000WI.LCK ='B' 4000MS.VER ='B' 200: MS.RID ='B' 1. MS.NMO ='B' 21 MS.TMO ='B' 4LMS.EXP ='B' 10 MO.OVR ='B' 12 MO.UIC ='B' 2. MO.PRO ='B' 4CMO.160 ='B' 10 .ENDMúW  .MACRO UDADF$,L,B .ASECT.=0CP.CRF:'L'.BLKB 4P.UNIT:'L'.BLKB 2  .BLKB 2P.OPCD:'L'.BLKB 1B .BLKB 1P.MOD:'L'.BLKB 2P.BCNT:'L'.BLKB 44P.BUFF:'L'.BLKB 12.SP.LBN:'L'.BLKB 4 .BLKB 16. P.END:'L'0 P.LENG='B'. .=P.BCNTP.OTRF:'L'.BLKB 4..=P.BCNT .BLKB 2P.UNFL:'L'.BLKB 2 .BLKB 12.P.DVPM:'L'.BLKB 4=P.SHUN:'L'.BLKB 2BP.CPSP:'L'.BLKB 2 .=P.BCNT .BLKB 2P.UNFL:'L'.BLKB 2E .BLKB 12. .BLKB 4P.FORM:'L'.BLKB 2.P.SPED:'L'.BLKB 2O.=P.BCNTP.RBN:'L'.BLKB 4.=P.BCNT .BLKB 4 .BLKB 12.P.FMTI:'L'.BLKB 4R.=P.BCNTP.RECC:'L'.BLKB 4 P.TMGC:'L'.BLKB 4D.=P.BC00(?ÓTADATADATADATADATADATADATADATADATANTP.VRSN:'L'.BLKB 2:P.CNTF:'L'.BLKB 2'P.HTMO:'L'.BLKB 2' .BLKB 2P.TIME:'L'.BLKB 8.P.CNTP:'L'.BLKB 4: .=P.OPCD+1P.FLGS:'L'.BLKB 1.P.STS:'L'.BLKB 2 .=P.BCNT+16.P.FBBK:'L'.BLKB 4K.=P.BCNTP.OTRF:'L'.BLKB 4BP.CMST:'L'.BLKB 2B.=P.BCNTP.MLUN:'L'.BLKB 2=P.UNFL:'L'.BLKB 2. .BLKB 4P.UNTI:'L'.BLKB 8.P.MEDI:'L'.BLKB 4'P.SHUN:'L'.BLKB 2'P.SHST:'L'.BLKB 2P.TRCK:'L'.BLKB 2=P.GRP:'L'.BLKB 2P.CYL:'L'.BLKB 2P.USVR:'L'.BLKB 1CP.UHVR:'L'.BLKB 1 P.RCTS:'L'.BLKB 2 P.RBNS:'L'.BLKB 1NP.RCTC:'L'.BLKB 1F.=P.SHUNP.FORM:'L'.BLKB 2 P.SPED:'L'.BLKB 2EP.FMEM:'L'.BLKB 2P.=P.TRCKP.UNSZ:'L'.BLKB 4LP.VSER:'L'.BLKB 4T.=P.FMEMP.MXWR:'L'.BLKB 4.P.NREC:'L'.BLKB 2=.=P.BCNTP.VRSN:'L'.BLKB 2.P.CNTF:'L'.BLKB 2=P.CTMO:'L'.BLKB 2BP.CSVR:'L'.BLKB 1BP.CHVR:'L'.BLKB 1.P.CNTI:'L'.BLKB 8..=P.BCNTP.RCSK:'L'.BLKB 4BP.TMSK:'L'.BLKB 4B.=0L.CRF:'L'.BLKB 4L.UNIT:'L'.BLKB 22L.SEQ:'L'.BLKB 2L.FMT:'L'.BLKB 1L.FLGS:'L'.BLKB 1 L.EVNT:'L'.BLKB 2 L.CNTI:'L'.BLKB 8.L.CSVR:'L'.BLKB 1 L.CHVR:'L'.BLKB 1ML.MLUN:'L'.BLKB 2DL.UNTI:'L'.BLKB 8.L.USVR:'L'.BLKB 1RL.UHVR:'L'.BLKB 1  .BLKB 2L.VSER:'L'.BLKB 4M .BLKB 16. L.LENG='B'.. .=L.MLUN+2L.BADR:'L'.BLKB 4R .=L.UHVR+1L.LVL:'L'.BLKB 1L.RTRY:'L'.BLKB 1KL.VSER:'L'.BLKB 4KL.HDCD:'L'.BLKB 4KL.SDI:'L'.BLKB 12. .=L.UHVR+1L.SCYL:'L'.BLKB 2 .=L.UHVR+1L.FMTD:'L' .BLKB 2L.GPCT:'L' .BLKB 4L.FSVR:'L' .BLKB 1L.FHVR:'L' .BLKB 1.=L.FMTD .BLKB 10.KL.STI:'L' .BLKB 62..=P.MEDIP.POS:'L' .BLKB 4.=P.FORMP.TRBC:'L' .BLKB 4 .PSECTN OP.ABO='B'1. OP.ACC='B'16. OP.AVL='B'8. OP.CCD='B'17.R OP.CMP='B'32.. OP.DAP='B'11.' OP.ERS='B'18.L OP.FMT='B'47.' OP.FLU='B'19.2 OP.GCS='B'2. OP.GUS='B'3. OP.ONL='B'9. OP.RD='B'33. OP.REP='B'37. OP.RPL='B'20. OP.SCC='B'4. OP.SUC='B'10.: OP.WR='B'34. OP.WTM='B'36.COP.END='B'128. OP.SEX='B'7. OP.AVA='B'64.2 OP.DUP='B'65.L OP.ACP='B'66.' OP.ERG='B'26MD.CSE='B'20000=MD.CMP='B'40000 MD.EXP='B'100000MD.ERR='B'10000I MD.OBC='B'4. MD.REV='B'10 MD.RWD='B'2' MD.UNL='B'20MD.SCH='B'4000MD.SCL='B'2000MD.SEC='B'1000 MD.SER='B'400R MD.SSH='B'200. MD.WBN='B'100' MD.WBV='B'40 MD.SEQ='B'20 MD.DLE='B'200' MD.EXC='B'40 MD.IMM='B'100' MD.ALL='B'2' MD.SPD='B'13 MD.FEU='B'1' MD.VOL='B'2' MD.NXU='B'1C MD.RIP='B'1C MD.IMF='B'2W MD.CWB='B'10 MD.SWP='B'4P MD.SHD='B'20 MD.PRI='B'1 EF.BBR='B'200 EF.BBU='B'100 EF.LOG='B'40 EF.SEX='B'20 EF.EOT='B'10 EF.PLS='B'4' CF.ATN='B'200P CF.MSC='B'100E CF.OTH='B'40 CF.THS='B'20CF.RPL='B'100000 CF.SHD='B'2U CF.576='B'1S UF.CMR='B'1D UF.CMW='B'2UF.RPL='B'100000UF.INA='B'40000S UF.RMV='B'200WUF.SCH='B'4000UF.SCL='B'2000 UF.WBN='B'100'UF.WPH='B'20000'UF.WPS='B'10000' UF.576='B'4' UF.VSS='B'40 UF.VSU='B'20 FM.CNT='B'0' FM.BAD='B'1C FM.DSK='B'2C FM.SDI='B'3W FM.SDE='B'40 FM.TPE='B'5P FM.DEL='B'70 FM.FEL='B'10 FM.STI='B'60 LF.SUC='B'2000 LF.CON='B'1000 LF.SNR='B'10 ST.MSK='B'37 ST.SUB='B'40 ST.SUC='B'00 ST.CMD='B'1' ST.ABO='B'2' ST.OFL='B'3' ST.AVL='B'4' ST.MFE='B'5S ST.WPR='B'65 ST.CMP='B'7C ST.DAT='B'8. ST.HST='B'9. ST.CNT='B'10.F ST.DRV='B'11. ST.DIA='B'31. ST.BOT='B'15 ST.FMT='B'14 ST.LED='B'23 ST.POL='B'21 ST.RDT='B'20 ST.SEX='B'22 ST.TM ='B'16 ST.SUB='B'40 TF.800='B'1 TF.PE='B'2 TF.GCR='B'4C TF.BLK='B'10ST.NML='B'0*ST.SUB+ST.SUC0ST.SDI='B'1*ST.SUB+ST.SUC0ST.CON='B'2*ST.SUB+ST.SUC0ST.DUP='B'4*ST.SUB+ST.SUC'ST.ONL='B'8.*ST.SUB+ST.SUCST.SON='B'16.*ST.SUB+ST.SUC'ST.IPT='B'0*ST.SUB+ST.CMD'ST.UNK='B'0*ST.SUB+ST.OFL'ST.VOL='B'1*ST.SUB+ST.OFL'ST.IOP='B'2*ST.SUB+ST.OFL'ST.DPU='B'4.*ST.SUB+ST.OFLST.DIS='B'8.*ST.SUB+ST.OFLST.HWP='B'256.*ST.SUB+ST.WPRST.SWP='B'128.*ST.SUB+ST.WPRST.FER='B'0*ST.SUB+ST.DAT'ST.CTO='B'0*ST.SUB+ST.CNT'ST.FDC='B'1.*ST.SUB+ST.MFEST.FSH='B'2.*ST.SUB+ST.MFEST.FST='B'3.*ST.SUB+ST.MFEST.576='B'5.*ST.SUB+ST.MFEST.FCT='B'6.*ST.SUB+ST.MFEST.FEC='B'7.*ST.SUB+ST.MFEST.ISH='B'2.*ST.SUB+ST.DATST.DST='B'3.*ST.SUB+ST.DATST.ECC='B'7.*ST.SUB+ST.DATEV.ISH='B'00(Gm 1g2.*ST.SUB+ST.DATEV.DST='B'3.*ST.SUB+ST.DATEV.ECC='B'7.*ST.SUB+ST.DATEV.EC1='B'8.*ST.SUB+ST.DATEV.EC2='B'9.*ST.SUB+ST.DATEV.EC3='B'10.*ST.SUB+ST.DATTEV.EC4='B'11.*ST.SUB+ST.DATTEV.EC5='B'12.*ST.SUB+ST.DATAEV.EC6='B'13.*ST.SUB+ST.DAT'EV.EC7='B'14.*ST.SUB+ST.DATEV.EC8='B'15.*ST.SUB+ST.DATTST.ODA='B'1.*ST.SUB+ST.HSTST.ODB='B'2.*ST.SUB+ST.HSTST.NXM='B'3.*ST.SUB+ST.HSTST.PAR='B'4.*ST.SUB+ST.HSTST.SDS='B'1.*ST.SUB+ST.CNTST.EDC='B'2.*ST.SUB+ST.CNTST.IDS='B'3.*ST.SUB+ST.CNTEV.SDS='B'1.*ST.SUB+ST.CNTEV.EDC='B'2.*ST.SUB+ST.CNTEV.IDS='B'3.*ST.SUB+ST.CNTST.SRT='B'1.*ST.SUB+ST.DRVST.SRI='B'2.*ST.SUB+ST.DRVST.POE='B'3.*ST.SUB+ST.DRVST.RDY='B'4.*ST.SUB+ST.DRVST.CLK='B'5.*ST.SUB+ST.DRVST.RSP='B'6.*ST.SUB+ST.DRVST.SUR='B'7.*ST.SUB+ST.DRVST.PSP='B'8.*ST.SUB+ST.DRVEV.SRT='B'1.*ST.SUB+ST.DRVEV.SRI='B'2.*ST.SUB+ST.DRVEV.POE='B'3.*ST.SUB+ST.DRVEV.RDY='B'4.*ST.SUB+ST.DRVEV.CLK='B'5.*ST.SUB+ST.DRVEV.RSP='B'6.*ST.SUB+ST.DRVEV.SUR='B'7.*ST.SUB+ST.DRVEV.PSP='B'8.*ST.SUB+ST.DRV MSCNT='B' 1E DISK='B' 2 DISKLT='B' 4 RSVD.0='B' 0.U HSC50 ='B' 1.T UDA50 ='B' 2.T RC25 ='B' 3.' VMS ='B' 4.V TU81 ='B' 5.S UDA5A ='B' 6.T RD.RX ='B' 7.U T1020 ='B' 8.K TK50 ='B' 9.TRUX50 ='B' 10.QDA50 ='B' 13.TK70 ='B' 14.RRD50 ='B' 16.RQDX3 ='B' 19. RA80 ='B' 1 RC25 ='B' 2 RCF25 ='B' 3 RA60 ='B' 4 RA81 ='B' 5 RD51 ='B' 6 RX50 ='B' 7 RD52 ='B' 10+ RD53 ='B' 11' RX33 ='B' 12D RA82 ='B' 13. RD31 ='B' 14 RD54 ='B' 15. RRD50 ='B' 16P RX31 ='B' 17+ RX32 ='B' 20B RX18 ='B' 2127; THEREFORE "DURA 80" IS ENCODED AS .WORD 022544,010120' .MACRO UDADF$ X,Y .ENDM .ENDMÄW  .MACRO SPMDF$,L,B .MCALL SPMHK$ .MACRO $DFINI TYPE,INIVAL TYPE'VAL=INIVAL TYPE'MIN=INIVAL .ENDM $DFINI5 .MACRO $DFN TYPE,SYM,LEN TYPE'SYM=TYPE'VAL TYPE'VAL=TYPE'VAL+1 .IIF NB LEN TYPE'SYM'L=LEND .ENDM $DFN .MACRO $DFN2 TYPE,SYM TYPE'SYM=TYPE'VAL TYPE'VAL=TYPE'VAL+2 .ENDM $DFN2  .MACRO $DFEND TYPE1 TYPE'MAX=TYPE'VAL .ENDM $DFEND SPMHK$' .PSECT8 .MACRO SPMDF$ X,Y .ENDM .ENDM SPMDF$DRW  .MACRO SPMHK$,L,B$ .ASECTN $DFINI H$,2 $DFN2 H$,CDRP $DFN2 H$,RTSK $DFN2 H$,XTSK $DFN2 H$,SCTX $DFN2 H$,LCTX $DFN2 H$,ACRG $DFN2 H$,USTP $DFN2 H$,QAST $DFN2 H$,EXTK $DFN2 H$,QPAR $DFN2 H$,QLDR $DFN2 H$,GLDR $DFN2 H$,FLDR $DFN2 H$,RLPR $DFN2 H$,QDRV $DFN2 H$,GPKT $DFN2 H$,IODN $DFN2 H$,IOFN $DFN2 H$,QAC1 $DFN2 H$,QAC2 $DFN2 H$,GACP $DFN2 H$,CRVT $DFN2 H$,ELVT $DFN2 H$,OVLY $DFN2 H$,SYEN $DFN2 H$,SYXT $DFN2 H$,EIDL $DFN2 H$,XIDL $DFN2 H$,USER $DFEND H$ .PSECT, .MACRO SPMHK$ X,Y .ENDM .ENDM SPMHK$öW  .MACRO BGCK$A FAC,ERR,TYPE ...FLG = -1 .IF B TYPEC EMT 374 ...FLG=0$ .ENDC .IF IDN , EMT 375 BR .+6, ...FLG=02 .IFFR .IF IDN , EMT 374 ...FLG=0 .IFF .IF IDN , HALT$ ...FLG=0F .IFF$! .IF IDN ,2 ...FLG=1 .IFF& .IF IDN , ...FLG=2, .IFF .IF IDN , ...FLG=3$ .ENDC .ENDC .ENDC .ENDC .ENDCP .ENDC- .IIF LT ...FLG, .ERROR BGCK$A - UNKNOWN TYPEA .IIF LT ...FLG, .MEXIT .IF B FAC .ERROR  .MEXIT  .ENDC .IF B ERR .ERROR  .MEXIT .ENDC .IF EQ ...FLG .WORD FAC .WORD ERR .ENDC .IF GE ...FLG -1F MOV #FAC,@#$BCFAC MOV #ERR,@#$BCERR .ENDC .IF EQ ...FLG -1  .WORD MOV!0737,$BCPCF JMP @#$CRENTT .ENDC .IF EQ ...FLG-3 .WORD MOV!0737,$BCPC  JMP @#$CRAL2 .ENDC .ENDM BGCK$A  W  .MACRO BGCK$R FAC,ERR,TYPE ...FLG=-1 .IF NB FAC .IF IDN , .IF NDF X$$DBTK .IF NDF R$$PRO ...FLG=0 .ENDCO .IFF ...FLG=0R .ENDC .IFF .IF NDF X$$DBT. .IF DF R$$PRON ...FLG=1 .IFF ...FLG=0 .ENDC. 00(OÓTADATADATADATADATADATADATADATADATA .IFF- ...FLG=03 .ENDC .ENDC .ENDC .IF EQ ...FLG MOV FAC,@#$BCFACB .ENDC .IF EQ ...FLG-1 MOV FAC,R0C .ENDC ...FLG=-1 .IF NB ERRG .IF IDN , .IF NDF X$$DBT  .IF NDF R$$PRO ...FLG=0 .ENDC .IFF  ...FLG=0 .ENDC .IFF .IF NDF X$$DBT  .IF DF R$$PRO  ...FLG=1 .IFF ...FLG=0 .ENDC .IFF  ...FLG=0 .ENDC .ENDC- .ENDC .IF EQ ...FLG MOV ERR,@#$BCERR .ENDC .IF EQ ...FLG-1 MOV ERR,R1C .ENDC ...FLG = -1 .IF DF R$$PRO .IF NDF X$$DBT .MCALL BTJMP$ BTJMP$R ...FLG=0F .ENDC  .ENDC .IF LT ...FLG ...FLG = -1 .IF B TYPE  EMT 374 ...FLG=0. .ENDC .IF IDN , EMT 375 ...FLG=0F .IFF$ .IF IDN , EMT 374 ...FLG=0 .IFF .IF IDN , HALTE ...FLG=0 .IFFL! .IF IDN ,N JMP @#$CRENTF ...FLG=1 .IFF& .IF IDN , ...FLG=2O .ENDC .ENDCT .ENDC .ENDC  .ENDC .ENDC- .IIF LT ...FLG, .ERROR BGCK$R - UNKNOWN TYPE .IIF LT ...FLG, .MEXIT. .ENDM BGCK$RC`W  .MACRO REBOT$ .MCALL BTJMP$ CLR R0 CLR R1D BTJMP$< .ENDM REBOT$4DW  .MACRO BTJMP$ MOV @#$RBTAD,PC .ENDM BTJMP$ <W  .MACRO BCKDF$ L,B .ASECTTBE.ODD ='B' 000100BE.SGF ='B' 000102BE.BPT ='B' 000104BE.IOT ='B' 000106BE.ILI ='B' 000110BE.EMT ='B' 000112BE.TRP ='B' 000114BE.STK ='B' 000116BE.NPA ='B' 000200BE.SGN ='B' 000201BE.2FR ='B' 000202BE.ISR ='B' 000203BE.FHW ='B' 000204BE.CSR ='B' 000205BE.IDC ='B' 000206BE.ACP ='B' 000207BE.HSP ='B' 000210BE.NCT ='B' 000211BE.NPL ='B' 000300BE.DDA ='B' 000301BE.SIZ ='B' 000302BE.BAK ='B' 000303BE.POV ='B' 000304BE.FSI ='B' 000305BE.GGF ='B' 000400BF.PKS ='B' 000100BF.TTD ='B' 000200BF.EXE ='B' 000300BF.XDT ='B' 000301BF.MP ='B' 000302 BE.NDS ='B' 100100= BE.NCK ='B' 100200B BE.URM ='B' 100300  BE.WTL ='B' 1004000 BE.UNO ='B' 1005002 BE.ILC ='B' 1006002 BE.LNS ='B' 100700 BE.OCP ='B' 101000E BE.MLK ='B' 101100I BE.NIN ='B' 101200P BE.UNP ='B' 101300=BF.POL ='B' 000303BF.ERR ='B' 000304BF.INT ='B' 000305BF.INI ='B' 000306BF.DVI ='B' 000307BF.PAR ='B' 000310BF.XIT ='B' 000311BF.QIO ='B' 000312BF.OPT ='B' 000313BF.ACC ='B' 000314BF.KAS ='B' 000315BF.DIR ='B' 000316BF.SAN ='B' 000317BF.UP ='B' 000400 BE.IN1 ='B' 100100  BE.SP1 ='B' 100200  BE.SP2 ='B' 100300  BE.FNF ='B' 100400 BF.PTS ='B' 100400 .PSECT0 .MACRO BCKDF$ X,Y .ENDM BCKDF$ .ENDM BCKDF$B W  .MACRO CHEDF$,L,B VV$CHE='B'4' .SAVE .ASECTL.=0 H.CSTS:'L'.BLKB 1 H.IIOC:'L'.BLKB 1 H.PAVL:'L'.BLKW 3 H.PKTQ:'L'.BLKW 2 H.CMDH:'L'.BLKW 2 H.CEDH:'L'.BLKW 2 H.TMP1:'L'.BLKW 1 H.TMP2:'L'.BLKW 1 CS.REQ='B'000001CS.RUN='B'000002CS.DNF='B'000004CD.ERR='B'100000CD.DRV='B'040000CD.FIN='B'020000CD.WIP='B'010000CD.DFR='B'004000.=0 E.BNXT:'L'.BLKW 10E.BPRV:'L'.BLKW 10E.PHYA:'L'.BLKW 10E.SIZE:'L'.BLKB 1AE.ST2: 'L'.BLKB 1NE.ANXT:'L'.BLKW 1BE.APRV:'L'.BLKW 1E.LBNH:'L'.BLKW 1$ .BLKB 1 .BLKB 1E.LBNL:'L'.BLKW 1=E.LNXT:'L'.BLKW 1 E.LPRV:'L'.BLKW 1 E.IOPA:'L'E.ATTL:'L'.BLKW 1'E.PCNT:'L'.BLKB 1'E.STAT:'L'.BLKB 1'E.UCB: 'L'.BLKW 1'E.MBXC:'L'.BLKB 1' .BLKB 1 E.LGTH='B'.0 ES.DEL='B'200' ES.ERR='B'100' ES.RIP='B'040R ES.XIP='B'010D ES.WDF='B'004D ES.WIP='B'002.=0PA.ANXT:'L'.BLKW 1'A.IOPA:'L'.BLKW 1N A.LGTH='B'.0 ..=0'S.DAT:'L' .BLKW 2'S.RDA:'L' .BLKW 2'S.DIR:'L' .BLKW 2'S.LOG:'L' .BLKW 2'S.OVR:'L' .BLKW 2'$$$= ..=0.S.LNK:'L' .BLKW 1.S.UCB:'L' .BLKW 1.S.RTOT:'L' .BLKB $$$S.RHIT:'L' .BLKB $$$S.RLOD:'L' .BLKB $$$S.RLAP:'L' .BLKB $$$S.RBIG:'L' .BLKB $$$S.WTOT:'L' .BLKB $$$S.WHIT:'L' .BLKB $$$S.WLAP:'L' .BLKB $$$S.PO00(Wm 1gL:'L' .BLKW 2SS.PSP:'L' .BLKW 2RS.RLE:'L' .BLKW 2'S.WDFR:'L' .BLKW 2 S.SIZE='B'.0 DC$ENA='B'1' DC$DIS='B'2. DC$ACT='B'3 DC$DAC='B'4' DC$RCS='B'5G DC$SET='B'6 DC$CSB='B'7L DC$RSB='B'10DC$CRE='B'100000DC$PAR='B'40000' .RESTORE  .MACRO CHEDF$ Y,Z .ENDM .ENDMüW  .MACRO LNMDF$,L,B,SYSDEF. .SAVE .ASECTB.=0L.NLNK:'L' .BLKW 1L.NTBL:'L' .BLKB 1L.NBLK:'L' .BLKB 1L.NSTS:'L' .BLKB 1L.NGRP:'L' .BLKB 1 L.NUCB:'L'L.NTCB:'L' .BLKW 1L.NLNS:'L' .BLKB 1L.NENS:'L' .BLKB 1 L.NNAM:'L' L.NHSZ='B'.L LT.SYS='B'0' LT.GRP='B'1. LT.USR='B'2E LT.TSK='B'3A LT.SES='B'4S LT.INV='B'6T LT.APP='B'5C LS.TRM='B'1S LS.PRV='B'2T LB.LOC='B'1B LB.LOG='B'2B IN.TSK='B'1E IN.SES='B'20 IN.GRP='B'4' IN.SYS='B'10.=0RC.REF:'L' .BLKB 1MC.DDSL:'L' .BLKB 1C.CUIC:'L' .BLKW 1 C.FIXL='B'.. C.DDS:'L'..=0BO$STAT:'L' .BLKW 1O$FLAG:'L' .BLKW 1O$NODS:'L' .BLKW 1O$NODA:'L' .BLKW 1O$DEVS:'L' .BLKW 1O$DEVA:'L' .BLKW 1O$DIRS:'L' .BLKW 1O$DIRA:'L' .BLKW 1O$NAMS:'L' .BLKW 1O$NAMA:'L' .BLKW 1O$TYPS:'L' .BLKW 1O$TYPA:'L' .BLKW 1O$VERS:'L' .BLKW 1O$VERA:'L' .BLKW 1O$TRLS:'L' .BLKW 1O$TRLA:'L' .BLKW 1O$ACCS:'L' .BLKW 1O$ACCA:'L' .BLKW 1O$LTYP:'L' .BLKB 1 .BLKB 1G O$PLEN='B'.S SU$SUC ='B'1ER$NOD ='B'175550MER$DEV ='B'1771001ER$DIR ='B'1770601ER$FNM ='B'176420DER$TYP ='B'174540TER$VER ='B'174460GER$ESS ='B'176640SER$XTR ='B'174340AER$BEQ ='B'177510SER$TRN ='B'174550AER$FTB ='B'176364SFS$NOD ='B'400FS$DEV ='B'200FS$DIR ='B'100FS$QUO ='B'2000. FS$NAM ='B'4 FS$TYP ='B'2 FS$VER ='B'1FS$WCH ='B'4000.FS$WDI ='B'1000' FS$WNA ='B'40S FS$WTY ='B'20$ FS$WVE ='B'101FS$NDF ='B'10000 P.LNON ='B'0 P.LNAM ='B'1 P.LDEV ='B'2 P.LNOD ='B'3 .RESTORES .MACRO LNMDF$ X,Y,Z .ENDM .ENDM~W  .MACRO PRTDF$ L,B .ASECTB.=02P.RIDN:'L' .BLKW 1 PI.LVL='B'401P.ROFF:'L' .BLKW 1P.RSTA:'L' .BLKW 2P.RABO:'L' .BLKW 2P.RRES:'L' .BLKW 2P.RSTO:'L' .BLKW 2P.RMTI:'L' .BLKW 2P.RCPU:'L' .BLKW 2P.RUPU:'L' .BLKW 2P.RCON:'L' .BLKW 2P.RCOF:'L' .BLKW 2P.RUON:'L' .BLKW 2P.RUOF:'L' .BLKW 2P.RLPA:'L' .BLKW 2.=177774P.TTSN:'L' .BLKW 1P.TTDA:'L' .BLKW 1P.TTIN:'L' .BLKW 1P.TTCN:'L' .BLKW 1P.TTTM:'L' .BLKW 1P.TTPW:'L' .BLKW 1P.TTKR:'L' .BLKW 1P.TTUC:'L' .BLKW 1P.TTII:'L' .BLKW 1P.TTOI:'L' .BLKW 1P.TTFP:'L' .BLKW 1 .PSECTP .MACRO PRTDF$ .ENDM PRTDF$1 .ENDM PRTDF$LZW  .MACRO CPRDF$,L,B,SYSDEF .ASECT'.=0WR$FLAG:'L'.BLKW 1W R$LEN:'L''R$OPC:'L' .BLKW 1'R$ADDR:'L'.BLKW 1' R$SIZE'B'= . .PSECT.RF$SYN'B'=100000RF$IMM'B'= 40000RF$LST'B'= 20000RF$IDS'B'= 10000RI$XDR'B'=140003RI$XDW'B'=40002'RI$XDA'B'=20004'RI$XDD'B'=120005RI$CRH'B'=100001RI$BLY'B'=60006.RI$RIN'B'=160007RI$CON'B'=100101 .ASECT'.=0LH$LEN:'L' .BLKB 1LH$TKI:'L' .BLKB 1LH$TYPE:'L' .BLKB 1H$ICNT:'L'.BLKB 1AH$TCB:'L' .BLKW 1PH$TIUC:'L'.BLKW 1FH$VUCB:'L' .BLKW 2H$BIAS:'L' .BLKW 1H$RET:'L' .BLKW 1H$FLAG:'L'.BLKW 1KH$LINK:'L'.BLKW 1$H$STAT:'L'.BLKW 2$ H$SIZE='B'. HF$SHR'B'=1= HF$AST'B'=2 HF$RSP'B'=40 HF$BLK'B'=8= P$BLEN='B'.T P$IID='B'. P$LUN='B'. P$TKI='B'. P$ALEN='B'.I P$DPB='B'. P$UIC='B'. P$LST='B'.P$NAM:'L' .BLKB 1CP$FLG:'L' .BLKB 1Y P$IOP='B'. P$NLUN='B'.0P$LEN:'L' .BLKW 11 P$ADDR='B'.=P$FUNC:'L'.BLKW 1 P$PARM:'L'.BLKW 1 P$BLK:'L' .BLKW 1B .PSECTT HT$TKN='B'1 HT$ADQ='B'2K HT$RUN='B'3' HT$DIR='B'4$ HT$VMS='B'5W HT$PMT='B'6' HT$QIO='B'7E HT$PSB='B'10 HT$RMS='B'11 HT$HLS='B'12 HT$BYE='B'13 HT$SYS='B'100 HT$ACS='B'101 HT$CKR='B'102 HT$CKW='B'103F HT$ILD='B'104B HT$LOV='B'105N HT$BKR='B'106B HT$BKW='B'107 HT$INS='B'110L HT$REM='B'111= HT$GET='B'112. HT$SET='B'113$ HT$VNS='B'114C HT$DOG='B'115K HT$ABO='B'201. HT$RSX='B'202 HT$UCA='B'203  .ASECTR.=0=I$BUF:'L' .BLKW 1 I$LEN:'L' .BLKB 1 I$ID:'L' .BLKB 1B .PSECTT II$DIR='B'1 II$UIC='B'2K II$DNA='B'3' II$ESA='B'4$ II$FAB='B'5W II$FNA='B'6' II$KEY='B'7E II$NAM='B'10 II$RAB='B'11 II$RBK='B'12 II$RBF='B'13 II$R00(_)`TADATADATADATADATADATADATADATADATASA='B'14 II$VFC='B'15 II$UBF='B'16 II$XAB='B'17 II$XBK='B'20 AL$SWS='B'0T AL$BCK='B'1 AL$IMP='B'2B AL$XXD='B'40 SF$BLK='B'1' SF$BIA='B'2' SF$HDR='B'4T SF$AST='B'10 SF$RSP='B'20 SF$IRT='B'40 SF$DRF='B'100SN$TSK='B'SF$BLK!SF$HDR!SF$AST,SN$DIR='B'SF$BLK!SF$BIA!SF$HDR!SF$AST!SF$DRF%SN$IMP='B'SF$BLK!SF$BIA!SF$HDR!SF$ASTKSN$QIO='B'SF$BIA!SF$HDR'SN$PSR='B'SF$BLK!SF$HDR!SF$IRTSN$RSP='B'SF$RSP!SF$IRTWSN$DET='B'SF$HDR!SF$IRT' .PSECTM .MACRO CPRDF$ X,Y,Z .ENDM .ENDM$RBF='B'13 II$R<Á0ÀW 8@#@?ºFF¬ã$¬Z$¬ø€$¸$LL $LI"$LƒK$LåQ$LìY$L`$L�m$L{–$Î$w$,$Þ,$:^$d}$; $;X:$;kz$;Ä™$T é$T Ô$T {$T ô$T #$T ($T Éd$T ñd$T ßf$T àp$T ùp$T Iq$T Lq$T Qs$T w$T ¤’$¡ 8$¡ =$¡ T[$¡ ày$¢ `Ÿ$£ ,$£ `$£ þ_$¤ ý!$¤ 8;$¤ ;;$¤ L$¤ Jm$¤ ºƒ$¦ ÖK$© Î$© ÖK$© xQ$© Z$© 8^$© A`$© ¸`$« ³y$¬ è.$¬ p:$­ 8 $­ Œd$® Ðf$® H…$¯ p†$° $° $° ÖK$° L$° ]a$° èq$° ˆr$° Ûr$² ½$² !$² 8"$³ Î$³ ÖK$³ xQ$³ (}$³ <}$´ $´ $´ ¶p$d È$d ³ $d $d Ê$d ¡$d \!$d ×&$d ¶'$d �($d Þ,$d 5$d ã8$d #:$d ):$d �:$d ¬:$d J;$d CM$d +S$d X$d X$d 3X$d öX$d Z$d Z$d H^$d d^$d nf$d Þw$d æw$d Bx$d _y$d `y$d ëy$d à$d …$d €…$d †$d ì’$d É$Œ »$Œ z$Œ $Œ y$Œ ""$Œ #$Œ y:$Œ „:$Œ ûD$Œ N$Œ ÀS$Œ T`$Œ :d$Œ Ëe$Œ df$Œ 3g$Œ ·k$Œ öv$Œ Fw$Œ ²x$Œ òy$Œ Þ$Œ €$Œ $€$Œ À…$Œ ¤’$Œ +–$Œ ´–$Œ |—$Œ +™$¤ê'$¤ëY$¤x$¤»z$”Ì$”$”˜$”'L$”Fw$”4x$”$”Z£$¼,$¼˜$¼É$¼z$¼$¼ $¼€:$¼†:$¼_M$¼­S$¼äf$¼°s$¼êv$¼¸y$¼*}$¼u~$¼jƒ$¼ä‹$áð$áà$á›:$âX $ã&$ã[($ãôD$ã E$ã@G$ãÈG$ãH$ãÖK$ãHg$ãTg$ã\g$ã†s$ã¤y$ãó~$ãЀ$ãÔ€$ã«„$äÈ$ä;$ä\K$äÖK$äLT$äµW$äFw$ä«„$ä„…$佋$äŒ$å ™$å3™$æà8$èt!$èà8$éŒ$éÖK$éµW$éÓf$ég$ég$é«„$ìø$ìp!$ì.$ìÖK$ìµW$ì8Y$ìFw$ì«„$í $íH!$í|:$í›:$íÖK$îH$î=$îû$î#$îì&$îJw$î„…$ï=$ïû$ï#$ïì&$ïJw$ï„…$ïy‹$ðÞ$ð]($ðÖK$ðµW$ðyX$ð Z$ð+e$ðÙf$ðVg$ðèq$ð«„$ñ˜:$ñ›:$òs$òÞ$òÖK$ò\M$ò¨W$òµW$ò X$ò(y$òî~$ò„…$ó$ó®2$óð2$óÖK$ó®x$ó$ó€$óEŸ$ô8 $ôk$ô$ôˆ$ôà8$ôH:$ôÖK$ô\M$ô.S$ôµW$ô_X$ô¤_$ôz$ôÀž$õ$õ 2$õà8$õÖK$õ;M$õXM$õ N$õüX$õˆw$õ«„$T©$Tã$T#$T4F$TÊQ$T?T$TÝf$T$€$|$|æ$|""$|ö&$|8‘$iw$DÊ$Dz$D„:$D’G$Džg$×È$äs$ä–$ä-!$ä#$ät:$äu:$äÌL$ä?T$äœr$U""$\ã$\ú$\#$\'L$\?T$\÷X$\ÔZ$\df$\æf$\Œs$\äw$Åe^$Ô6$ÔYq$ÔÖs$!øu$!ày$#k$#à$#¸L$#¼Q$#y$#ðy$#óy$#z}$#Ð$#À€$#Ô€$#ºƒ$#«„$$ø$$$$ày$%°'$& <$,è.$,8Y$-Lr$.H$0L$0Œ$00)gm 1g0µW$0œr$0óy$0z}$20 $2`m$2(x$3$3øp$3x$3�ƒ$3LŸ$3kŸ$4$4H:$5�$5¸8$5ˆr$“Ì$“•$“º$“+$“{$“q!$“:d$“ q$“zs$“œw$ŒD$Œ%$Œz$Œ#$Œw*$ŒH;$Œ“Q$Œ„S$Œ6/K$A6$D6p!$D6{:$J6`"$K6U<$K6<}$L6$L6‹;$L6(F$L6Åž$N6ºƒ$c6è$c6×3$c6Ø3$c6ÅG$c6èQ$c6@y$c6óy$c6«„$d6($d6xQ$d6Xz$d6«„$d6¹Œ$e6Ž($f6$f6¸$f6 9$f6ÞK$f6xQ$f6€Q$f6ÕZ$f6¤`$f6fa$f6ßf$f6ùf$f6g$f6qg$f6™w$g6 $h6î$i6b$i6’$i6^$i6›:$i6&X$i6.X$i6/X$i6xd$i6øf$i6@y$l6Ës$l6p…$l6e†$m6^f$n6VN$n6 S$o6q$o6|$o6y‹$p6¼ $p6ñ($p6ÊG$p6ñG$p6ßr$p6âr$r61$r6³"$r6´"$r6ñs$s6 $s6$s6xQ$s6Ùf$t61H$t6hL$>hs…$Ahà8$Ah@`$Dhp!$Dhày$Dhp…$FhH$FhVN$Hh $Lh(F$Mh¸8$ah €$bhËL$ch, $chw$dh L$dhzd$fhÿ8$fh9$fh9$hhî$hhÐ$ihà8$ih8^$lh°$lhÞ$lhµW$lh8Y$lhÜY$lhæY$mh¶$nhH$ohð‘$phèq$phØr$rh !$rhÌQ$rhˆr$shU<$sh<}$sh‚$sh�ƒ$shÒ’$th$uh$wh¼$iÒ$i$iC$iU$iæ$i¤K$i M$i:d$ike$idf$iær$i‹w$‹qó8$‹qU:$‹q N$‹q¶z$ry$r&$r˜$röq$r¡–$r¤–$r²–$r·–$¹t²$¾t/K$Ätp!$Çtxd$ËtU<$8w$Tw¬ $Twz$TwìQ$TwLy$sw. $sw/ $sw0 $sw1 $sw2 $sw3 $sw4 $sw5 $swî$swï$swð$swñ$swò$swó$swô$swõ$ËwL $Ëwé $Ëwk$ËwÖ$Ëw²2$Ëw$;$Ëwˆs$Ìwp:$Ìw&e$Ìwæf$Ìwäy$;x. $;x/ $;x0 $;x1 $;x2 $;x3 $;x4 $;x5 $;xî$;xï$;xð$;xñ$;xò$;xó$;xô$;xõ$äxÌ$äx+$äx<$äxl$äxh$äx""$äx²2$äx“Q$äx€$äxZ£$ yÜ$ yz$ yX:$ y g$ y·k$ yˆs$ y€$®y$±y$#z z$jz$"{î $"{Q&$"{h3$"{zæ�Hè� H:ÔG¯xHdh LHT#HT ÉdH“(ÜYH“(ÞH€ÔƒëH@¤‹#H„ƒ»H¬#T[H<… NH"{´IóyHþÿ7WH€5�HdOHzÔƒòH T†„SH@¸<ÖpH p6ñGHT|�4HÔƒqHd&æH0IˆrHøÿsE3 HúôsE/ HòôsE1 Höô6{:wHŒT ¤’HsE5 Hþôsh�ƒHzxš_MH9Ü:³%H®yHzÿ¥<°'H"{h3Hcš´H&ã†sHm�™H(nO\}HlK[MH e,Hÿÿœ*ðyH€î)ë�H€#H€T|û H z0{èqHòÿhhîH"#{Æ~H*i6’HÜ:4fH@ó�<}H&;xðH„ôc6@yH;xóHŠô;xõHŽô°#é5Hµ‡t~H&“(i�Hä\KHŒL…H€zn�HHæ�ZŠH:nOƒ!H “(@�Hó� H!øfHþÿÔƒt H|H´‡k'H"||)qH€rh !H ä)½rH i6^HgLH@´‡’H)zì) FH(D‚ fH@nOz}H¬ p:H ;xîH€ô;xïH‚ô;xñH†ô;xòHˆô;xôHŒô¥UÅ'HD‘¦’HäK£}H õ�`‹Hs6xQHÔƒ&H€zfh9Hœ*hzH@ã�MH2ã�MH0N\XH,|5H€‹#Hfh9Hfhÿ8HÜ{lQH¤†ü_HT éH¡ àyHc6óyHgwLHzl8YHsw1 H¶ôvžgHR""Häÿsw3 Hºô° Hœ*ÆH¸shÒ’Hó�øH2/Ip&H“(ù’Hæ�ø€H8²‡àHz0œrH ­U H ¸<ÖKH&(ÔH‹#ƒ…H‚Â�H"”‚5Hf6¤`H*+"ÜYHhûs6H g~ZHœ*»pHì�œHTwìQH€“{Hzn�H²‡ Häx+HÅe^H@œ*ÞpH ¤†ŸHÜ{¡GH 3ŠHH ó�’H"Ô6HNæfH\ˆRuH€#ÐH ´I¡Hf6 9H-zí�zHp“(5“H”ŒÔSH€|T`H€¸<,€HlhæYHôkHtOÅžHphèqHŒtH 6F1 Hæô¤ JmHþÿœ*;HïfH ¤EºƒHzf6faH°#H+"zH0þuH¸|…RH´‡@H%T|sH|ÊsH@z´‡a(H <…ÀHµ‡¸8HÜ{�dHÜ{¡`H@´{H<…‹sH@| HÜ{aH|”fH ´‡hrHD´{µrHdšR†H,|*}H³‡F"H<z|€H äK8H@Ü{óH€,|¿ HÜ{ qH<…¡}HÜ{ô�H,||ŠH´‡{sHF<…ÖKH€|8&H€T|wzHT†xHd…ÌH²‡ÌeHzŒ„SH€\ˆö2HT| HŒ“QHŒDHŒãÈGHlîHHJõˆwH5T†UyHôà8HóH4T†‘H€T†ŸHÔƒ4FHT†7xH€ìp!HüƒÎÌHzå3™HTT†žgHT†[(Hå ™HPT†¦dHüƒ#æHT†ðŒHã\gHrõXMH8ð«„HBô8 HT†–TH íH!H"ã«„H@üƒƒ…Hzð ZH2áàH6ä;HôH:ôÖKHTôH:HâX H(üƒ\àHüƒ8ïHìøHZõ;MHBôÀžHðèqH5ïy‹HLõà8H zT†¼^Hõ«„H8T†JgHÔƒ LHôˆHH„ˆ:dH@èt!HT†=_Hì8YHì.H<èà8H éÓfHâT†§HäFwH^óH\zô¤_Hô_XH佋HPä„…Hñ›:H¢¼*}Hã[(Húîì&Hó®2H5ã EHòòsHô\MHþò„…HãЀH‚ãôDHpzóð2HBõ NH:éŒH’égHÒðÙfHðVgH ì«„Hã&HöäÖKHãó~Hïì&Hò\MHðµWHòÞHðyXHzãHHfóÖKHräÈH(ó®xH¤»zHð+eHî=H00)Ÿ*¦TADATADATADATADATADATADATADATADATA"äµWH¤xHóEŸHdéµWHãÖKHVí›:H²õ 2H6ò(yHz¤ëYHðÞHï#H&ô.SHðÖKH!éÖKH,íÖKH,á›:HÂé«„H égH&õüXHRð](Hä«„H$ìFwHVò XHFzäLTH"¤ê'HîûH0¼êvH¼€:H€#g'H Œ ""Hļ†:H ¼¸yH ìÖKH#¼_MH€#s!HŒ +™Hî#H(¼ÉH zäxZ£H€äx“QH ¼H€#»zH¼jƒHî„…H$ï„…HŒ ¤’HäxlH”4xHïûH.í|:H€#,xH¼,H Œ €HzòµWHŒ ÞH€##"HòÖKHŒ òyH@€#9gHäx²2HŒ H@¼°sHŒ ²xHï=HŒ FwH”FwH€# LH€#øH z¼ä‹H‹#« H¼˜HŒ +–HïJwH*¼zH”H ìµWH€#ƒ!H T"y:H¼u~H ”ÌH€”'LH ¼­SH”Hzí H€”˜H@¼ H¼äfH”Z£H‹# qH› #HŒ#}~H {#ewH › -H{"æfHT"<HŒ#«„H› £HäxhHz�# gH{#ÌHŒ#l~H€#î8H‹#RH‹#Ó4H€#ë€H€#u~H‹#£H{#""HT"_MH�#„H‹#yH‹#„:H{#�Hz{#ìH‹#áyH‹#ªgH�#¶KH€#ÖKHŒ#g'H ‹#ŸH‹#YMH› MH�#VNH‹#azH› ê'H{#RH‹#u~H{#»zHz› £jHäxÌH@Œ#€H‹# H�#ä‹H ‹#|…H{#yH‹#HT"uLH‡#&LHäx""H�#¶dH‹#­SH€#û€H‹#[qHz‹#xH› êYH€#†HŒ# LH‹#RH‹#H› áyH‹#ÐHy#¶KHd J;Hƒy# LH‡#}~H y#VNH�#R`H"d ¬:HFzd ×&H„�##"H&d d^H@y#ÖKH�#ÖKH0ƒÑH‡#BxH‡#¹sH³!#H³!ÑHà zH‡#g'Hd \!HJy#÷Hà àZHz‡#l~Hƒ#Hy#BxHy#l~HŒ#ÖKH ‡#äH‡#«„Hy#«„Hƒ H‡#ÖKH�#kH(ƒàZHy#€H �#g'H y#‡dHz�#‡dHƒxeH³! H�#VgH�# LHy#VgHy#}~H �#3dH› úŠHd àHL³!xeH{"ÙfHhLHDhàyH 3kHLh(FH;5_HMzhs…H;5»zH@9hÖKHÄtp!H¹t²H;5›rH ;5OHGz�<H;5œwHKD6p!HÃ9zH;5zH;5fH>6/KHA6HFhHH:h¸LH Ahà8H;5ñH;5nMHEDhp!Hr¡–H zD6{:H y€H yˆsH0;5$:HDÃ9ª%H;kzH yX:HÃ99"HËwé HËw²2H;X:HÃ91HÃ9«„H;5ŸH�ËwˆsHz;5UqHIÃ9sŠH ;5œ,HJÃ9ªpH Ã9±'H;5ËHAÃ9ÖpH ;5ƒ:HHÃ9[–HËwÖH@Ëw$;H yÜH$;Ä™HÃ9ysH Ã9–ƒHZÃ9*–H y gH%; HÃ9µWH y·kH yzHO;5¹ƒHƒËwkHÃ9ÛpH ¯”9hÖKHÄtp!H¹t²H;5›rH ;5OHGz�<H;5œwHKD6p!HÃ9zH;5zH;5fH>6/KHA6HFhHH:h¸LH Ahà8H;5ñH;5nMHEDhp!Hr¡–H zD6{:H y€H yˆsH0;5$:HDÃ9ª%H;kzH yX:HÃ99"HËwé HËw²2H;X:HÃ91HÃ9«„H;5ŸH�ËwˆsHz;5UqHIÃ9sŠH ;5œ,HJÃ9ªpH Ã9±'H;5ËHAÃ9ÖpH ;5ƒ:HHÃ9[–HËwÖH@Ëw$;H yÜH$;Ä™HÃ9ysH Ã9–ƒHZÃ9*–H y gH%; HÃ9<Á0ÀW 4&úî/M00*§m 1g´´|:h´ây$°t^à8=œt^�s56шJøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿhW Á€Àz´Á€À¯”Ds©À�@$9)@´:t @´²2HÇq´:Ü@i©€‰@ ­³ ª­´  \±ÿ~h\±h¤¯Î}h¢¤¯Ø}h­´( ­´€€€ÿÿÿÿBBBBBBBBB,4X`hpxJ (B*B,B.B0B2B4B6B8Bp,rt4vXx`zh|p~xü(4(ÿ X\*X.\\€\gìgj”””¶””””01234567SWAMLHCQFXBGIVED¤¶Èìü}~\/'"% ^_@><$=CQ.;-+*BEFGLNPSVWX!:&#? ,&,&&Zìj”””¶””” ”<¤>¶@ÈBìDüFHv,x&z,|&~&BØ",z†–®(äЂ|ˆø$:ÜŒD:¾øèh€ž²~",z † –®(äЂ|ˆø "$$&(:*Ü,Œ.0D2:4¾6ø8è:h<€>ž@²€ôž¦7 pþ7 ÿÆ Æ€÷ rþ�Àþþ7úþ7Pþ7÷ \þ€À€   ÷ Lþ"÷¦þìþ÷ úÀDD÷ öÀT:÷ î÷ ,þ€ææ?ÿˆ ‡À€þ7öý÷ " Àôž¦€8€h€’vþ7ìý÷  7  þ& æ¨÷6’þ÷ ðý€7 êýÀB ÷ "ý†7Štþ÷•ÿÿmþ÷ ì÷ 2÷ Èý wø÷ È÷ ä?‡Â w Ü‚‡DÄe� w Ì�†Ä%¨6,Bh‚p�x�€.‡Äe€Dl”÷ r‚ wÀ ×­ þÂDÃúýÅÄ ÀBà Å5$ 4 ¤Ô ûtÚ@ ÷ z%†ˆÀB ÷ lý†ÄýÄýÄ€”6BH¤RÚfB€Šœý‚ ÷ þ(Æ€÷fý¬ý÷ žý÷8–ýwÿÀ ?÷ ªÆ€÷DýŠý÷ ˜7 fýÀ•_÷ –7Šcý  7ŠZý7 Xý÷ Ìw ê¦ԇ ÷ ŠyηŠ;ý÷¥5ýw€ 82€b¦p΀*ýƒå7Š$ý÷•ý÷•þÿý ÝÀÀ 7ôü7�ýw�ýü7äü7âüÀ%÷5Ôü éf÷ ˆ�ù ’ ´÷ b/‡7*ü÷ † á7�®ü¨÷ b’ €‚Ê#‡Å Ba„Å ÷ 8‡Œ÷ ,‡÷•‚ü÷ 8�÷ ˜ ‡&÷ L€‡ÂwÿˆÂ 7Rü7Püw�_üÄFüÄ5·Bü¡±‡Á0üÁ5ç€þ÷ Lä‡ áÂâ Ãüwü“”B~  wÂþ÷ Ö·Šü÷ Ì÷‹ ü÷ðûìû7Šÿû÷mæûàû÷ÜûÜû÷ ÀÒû÷ ŽÀ�ßû€ œ¦÷ þļû 7ŠÄû7 Âûwjþ â h¦€z÷ ~÷íªû¤ûá÷ 4‚b‚ ‚ ·”ûÜ÷ $‚ù÷Ô„ûÑ÷Î|ûÍ÷ �’Á � � B`é÷ :÷%dûÂZû‡÷ vwöýˆÂ 7ªú00*¯¦TADATADATADATADATADATADATADATADATA7ŠTû÷•Mû7ŠHû÷U€ö˜ú÷‹@û÷EŒú÷ ž7tæ€úæzú÷ û ÷ ûæpú÷ äú�æeÿˆ· ûÀ•7�úú7ŠôúÀ�ïúÆ� Ä0¶×­ÝúÆ÷‹Öú÷ŠÎú÷Uú >s©À�f¶€rÊ·ú·ú7Ö÷‹·ú÷‹°ú±÷‹¬ú÷ (Åôù÷‹�ú$Ä�˜ú÷•�úw)’úÄt!¤ÄåúÄMCÕ wÀù7‘iúô ¶Á´ ¶„ Äe0B7Pú÷ pÀJ¤f¶l¶€îHú÷ lÀ:÷ j@÷ æÀÚ7úw>þ·êù·äù·Þù÷MPú÷•ÿÿú¤÷ODúøææcÿˆ÷Æù·Jù· äù÷BEæù7ŠåùŽ÷IOÚù÷ILÒùÞ÷ÚLs©À�Vs©À�€jEMÊù÷TRÂù÷FPºù·zù÷•³ùwèþ 7ùà wüø÷ ¤æ  ÷ T÷ ¨÷ L÷ ºŽ Î%øò÷ ÀÁØÂìRÀ ý‡,4X`hp&dØhìr,tv4xXz`|h~p€æx÷ p÷ 4æ3ÿˆˆ÷ 8÷ üý÷ Nú÷ (÷ ìý÷ >ú÷ ÷ Ü @÷ @‘À ÷ øô÷ ñ ÷ ô÷ ¸‚ÄJø÷�ðøÜø÷ ¨õ÷6ø· ø· xvs©À�€b(øÆŒf&æ¦f¦)w bd÷ ž€÷4jø÷ šw L^–%�‚ƒ„…Æì÷æÜ÷€Ä4¤ÈüŽø¤Äå÷‡ <È¤Ô Ä%ù†‡Ä �!‚Ä ¡&Œd$40^N¤PÈV¤dÈf¤€Þ‡±‡Ä%û‡4¤4Èô¶Ô ðÀ�>ø7`$ø÷- ø�÷ƒ÷ ÖÁz÷@@�@PÀr÷@ @‡ÀeÀmö÷ð 7X÷à wR÷ÅP÷À�ò÷àwÖ÷‡÷ À¤È¶€Z Ì÷÷ ˆÀ�Ù÷€ œ¦÷ øÁ�Ë÷@fù ’ …‡÷‹´÷ � Äm¬÷7¨÷7Š¢÷‚ ‡æÃš÷à à à Ä`à à Ä`ƒî  ÷ ØÀ¥0‚À¥7‡ÀEøÿu`‚ ñA   ¦"’ €Ö AåÁ Ñ‹ùÕ ±…Ã<÷·>÷€ †À’À‡Â À(÷÷ &÷Ã÷À5þÿ ‘ ‡÷&÷÷%÷÷÷æÐö·÷÷Äö ÷æFÿˆü‡æ)ÿˆ÷ ÷L´:t T$9)\´:ÜpF€R ý÷÷êö‡À ÷ À÷Üö7�ìöææŽö·ÐöæFÿˆü‡æ)ÿˆ·‡÷²ö÷ ÖÿÀ�¾ö÷ ¸öÀ�±ö  w ÿ¢‡À•$÷ ¨ÿ a zÀå $s©À�0F>s©À�d¢€Î À¥ À•+‡æfÿˆ·…&Î%€&‚Î%#‡À$÷ hÿÎ%¤ ƒ€À倀 œzÀU wHÿ N,–‚Ñ û€@씀 Àe0÷ 2ÿ� @œ�ê7^õÀƒ÷ >.s©À�s©À�"€(6¤>€DzR–^”n�€J ‡7NõÃÄþÿ 7 @õ7�<õÃÄÿÿÀ&Äe N @ Ä üÀe0÷ âþà óÀ• Ö wÔþZ L ¨ ¢ œ ÷ ÷ ÀþÀ÷ ºþÀ• îÅÂê @�÷ À LZ NL P¨ R¢ Tœ rê |i©€‰3Æ  Àe ÀeÀe Àe ÷ ‚þÅ ê‡@( `ADDö ö àSUBü ü MOVÿ  CMP  0BIT  @BIC©  PBIS  BRBNE& & BEQ, , BGEœ2 2 BLT 8 8 BGT > > BLED D €BPLJ J �BMIP P ‚BHIõV V ƒBLOS†BHIS…BVSeh h †BCCþn n ‡BCS t t  CLRþz z F COM€ € † INCP† † Æ DEC‰Œ Œ  NEG’ ’ F ADC˜ ˜ † SBCž ž Æ TST¤ ¤  RORª ª F ROL° ° † ASR¶ ¶ Æ ASL¼ ¼ Æ SXT  pMULÈ È rDIVÎ Î tASHœÔ Ô vASHCxXORà à ~SOBæ æ ˆEMTì ì JSRò ò ÆSWABˆRTSþ þ FJMP  BPTe  ¡CLCþ  ¢CLV   ¨CLNþ  ±SEC" " ²SEVP( ( ¸SEN‰. . ¿SCC4 4 ¯CCC: :  NOP@ >@ ~pê`ˆ>À ´ œÀ<ÀV h€@\h: êˆ>´œ À$<(V,h04\8hà à ­³€Çq´Çq0uÇqXuÇq€uÇq¨uÇqÐuÇqøuÇq@yÇqxdÇqÇqÇqÇq ­´ ­´2|ÇqÇqÇqÇq ­´ê €ê ÷Œÿ�ÿ÷†ÿˆÿ÷ ·f¦æ&BwpÿÃz ÄK�ÓÅøWtýÿÁ‚ ÄÂE€Ã@ Ó “ ýÃK—tøÿ„pÃe ÷ 4ÿÃe0÷ ¾Ã&ÿ×t×tùÿ`÷ œ*z >‚ J@ ^ €f)Ã Ë ‹ aú÷ ôÃüþ÷ –Ãð ÷ îþÃö ÷ xX—túÿÂå(„pÃet ÷ @÷ 8ÿü ø÷ âSÃì ÷ ¶þ Ãæ ÷ @Ã�¨þÃEÿÓ÷ 2Ã� (ð 2ö Ft T¼ `ì jæ €â˜þ÷ š3—t÷ÿÂå8„pÃe ÷ ÷ êþÑ•,Ã�tþ÷ vÖÃø ÷ üÃ�`þöÃà ÷ îÃ�Tþ÷ VÑ•,ÃJþà ÃE€ÿ ‘—tôÿ„pÃeö ÷ ¢÷ ¢þÑ•,¬Ãò öà2ø @à hö zò €^þ ÷ ®¤„ƒ‚�‡Ó єєєÑ”Á ‡&¦æ&f ÄÀLþ$Çqð  È ‡ð ‚ÅâD!‚DÀeìÄ  €÷ ˆ€÷ €Ä Ñ•þ €Ú+÷ :…„ƒ‚€‡÷ ~ÿ÷ ˆýÑ•BÑ• ‡÷rýný÷lý÷ rÿ‡÷ ZÿÑ• ‡& —vÄÂ5à—vÑ•0 €tóÿÀEøÿÀe0�—v €‡¦€V&Äê À ”r — 00*·m 1gÂe.Âe Âe ‘�~„‚‡æ&fÁ‚ ÷ îþ÷ �€ƒ‡&æÑ•  ÁàÀ”÷ ²ùD~ƒ€‡Ñ•(÷ ¾þÑ•)‡Â�³ü † ê <‚ X‚ €ÒÑ•@ Ã�¤ü× rä÷ �þÃ�Šü`÷ ÿ÷ |þ÷ ®ÿÑ•+Ñ•#ðÑ•-÷ ˜ÿ‡&÷ †‡Dà„ ! !�ÿÄEÿ7Qœü¡±„ä€N‡ 0 9¡±‡Ât·$vüÒ ûJ€ˆ~÷ ü%‡ ÷ 6!‡÷ â‡÷ ü÷ 6‡!ÿ‚÷ ‡÷ ‡÷ ö ‡Dà „  !?t€Ê7Qü¡±‡f¦   + - ' " A)÷ Nÿ4‡ ÷ Fÿ‡—tÀå0P÷ põA ÷ hÞ÷ b÷ Z÷ TtP÷ JÁ €F„`Ë„à È Z ÷ þ ‡&÷ ¨€‡ì¡±‚�‡ ,÷ ¡±‡ff÷ þ÷…�‡¦÷ ‡·P>û¡±‚‡&f  @Å ÷ Êÿ €Â#! -( (-÷ ÿ>‡ ( !†ÂU,Ñ DàÂ7&Ñ ÷ \)‡ÂU0÷ ~ÿ÷ Èþ!‡Ñ Â÷ jÿ÷ 8‡ÂU ÷ ,‡ +Å ÂU€>÷ FÿÅ ÂU¡¡±…„‡& ( ÷ "ÿ÷ ‡ )÷ ÿ¡±„‡÷ Pþ‡!‚¡±‡¦÷ ÿ‡—t·P:ú¡±‚‡÷ "þ‡Ä5€º¡±‡÷ ºÿ‡u7Qú¡±‡¦&÷ ´þ‡÷ Žþ‡÷ Öÿ‡¡±„‚‡÷‹æù÷U€Øù‡÷ îÿ÷ „ÿ‡÷ ^þ‡÷ xþ±‡Âð Ò Ò-¢ùÒ-rð €6žùøÂåÒ ó¡±‡¦æ&7Š�ù÷ ò5‡÷ Äÿ†ÂÔ Ò‹þâ‹—¨B* Š÷ ¬ÿ&‡÷ŠhùÑ Ãâ —  †  ÷ ôý‚‹ÓEÂEðÿú ®‡ÁÁåâ Ü4Ô Râ V r®zâ ~Ü€²&˜d “Á¡¡±„ƒ‚‡&f÷ 0 †Àù$Çqð Àe÷PÐâøÐàø¡±�€‡f¦ÀÔ ÷ ´wÂøB÷ ªwºøÀ¸ø$Çq &˜d bÔ €.,,Àeô¡±‚�‡÷ 8ý÷ ‡¦æÂÃÔ Š . $  0 9 A Z�÷ úü–~×­<ø.—   ×­,ø$8Ô zª×­$øA Š•~¡±ƒ‚‡¦æ ÔÂ%$ Â%.ÂÂå@Âe.Wp(�`×~ƒ‚‡&À7Î÷Àå "Çqù€‡  f­³HW Á€Àz´|:Á€À¯”Ds©À�@$9)@´:t @´²2HÇq´:Ü@i©€‰@ ­³ ª­´  \±ÿ~h\±h¤¯Î}h¢¤¯Ø}h¯” ­´€€€ÿÿÿÿBBBBBBBBB* (B*B,B.B0B2B4B6B8Bü(4(ÿ X\*X.\\€\gìgj”””¶””””01234567SWAMLHCQFXBGIVED¤¶Èìü}~\/'"% ^_@><$=CQ.;-+*BEFGLNPSVWX!:&#? ,&,&&Zìj”””¶””” ”<¤>¶@ÈBìDüFHv,x&z,|&~&BØ",z†–®(äЂ|ˆø$:ÜŒD:¾øèh€ž²~",z † –®(äЂ|ˆø "$$&(:*Ü,Œ.0D2:4¾6ø8è:h<€>ž@²€ôž¦7 pþ7 ÿÆ Æ€÷ rþ�Àþþ7úþ7Pþ7÷ \þ€À€   ÷ Lþ"÷¦þìþ÷ úÀDD÷ öÀT:÷ î÷ ,þ€ææ?ÿˆ ‡À€þ7öý÷ " Àôž¦€8€h€’vþ7ìý÷  7  þ& æ¨÷6’þ÷ ðý€7 êýÀB ÷ "ý†7Štþ÷•ÿÿmþ÷ ì÷ 2÷ Èý wø÷ È÷ ä?‡Â w Ü‚‡DÄe� w Ì�†Ä%¨6,Bh‚p�x�€.‡Äe€Dl”÷ r‚ wÀ ×­ þÂDÃúýÅÄ ÀBà Å5$ 4 ¤Ô ûtÚ@ ÷ z%†ˆÀB ÷ lý†ÄýÄýÄ€”6BH¤RÚfB€Šœý‚ ÷ þ(Æ€÷fý¬ý÷ žý÷8–ýwÿÀ ?÷ ªÆ€÷DýŠý÷ ˜7 fýÀ•_÷ –7Šcý  7ŠZý7 Xý÷ Ìw ê¦ԇ ÷ ŠyηŠ;ý÷¥5ýw€ 82€b¦p΀*ýƒå7Š$ý÷•ý÷•þÿý ÝÀÀ 7ôü7�ýw�ýü7äü7âüÀ%÷5Ôü éf÷ ˆ�ù ’ ´÷ b/‡7*ü÷ † á7�®ü¨÷ b’ €‚Ê#‡Å Ba„Å ÷ 8‡Œ÷ ,‡÷•‚ü÷ 8�÷ ˜ ‡&÷ L€‡ÂwÿˆÂ 7Rü7Püw�_üÄFüÄ5·Bü¡±‡Á0üÁ5ç€þ÷ Lä‡ áÂâ Ãüwü“”B~  wÂþ÷ Ö·Šü÷ Ì÷‹ ü÷ðûìû7Šÿû÷mæûàû÷ÜûÜû÷ ÀÒû÷ ŽÀ�ßû€ œ¦÷ þļû 7ŠÄû7 Âûwjþ â h¦€z÷ ~÷íªû¤ûá÷ 4‚b‚ ‚ ·”ûÜ÷ $‚ù÷Ô„ûÑ÷Î|ûÍ÷ �’Á � � B`é÷ :÷%dûÂZû‡÷ vwöýˆÂ 7ªú7ŠTû÷•Mû7ŠHû÷U€ö˜ú÷‹@û÷EŒú÷ ž7tæ€úæzú÷ û ÷ ûæpú÷ äú�æeÿˆ· ûÀ•7�úú7ŠôúÀ�ïúÆ� Ä0¶×­ÝúÆ÷‹Öú÷ŠÎú÷Uú >s©À�f¶€rÊ·ú·ú7Ö÷‹·ú÷‹°ú±÷‹¬ú÷ (Åôù÷‹�ú$Ä�˜ú÷•�úw)’úÄt!¤ÄåúÄMCÕ wÀù7‘iúô ¶Á´ ¶„ Äe0B7Pú÷ pÀJ¤f¶l¶€îHú÷ lÀ:÷ j@÷ æÀÚ7úw>þ·êù·äù·Þù÷MPú÷•ÿÿú¤÷ODúøææcÿˆ÷Æù·Jù· äù÷BEæù7ŠåùŽ÷IOÚù÷ILÒùÞ÷00*¿¦TADATADATADATADATADATADATADATADATAÚLs©À�Vs©À�€jEMÊù÷TRÂù÷FPºù·zù÷•³ùwèþ 7ùà wüø÷ ¤æ  ÷ T÷ ¨÷ L÷ ºŽ Î%øò÷ ÀÁØÂìRÀ ý‡,4X`hp&dØhìr,tv4xXz`|h~p€æx÷ p÷ 4æ3ÿˆˆ÷ 8÷ üý÷ Nú÷ (÷ ìý÷ >ú÷ ÷ Ü @÷ @‘À ÷ øô÷ ñ ÷ ô÷ ¸‚ÄJø÷�ðøÜø÷ ¨õ÷6ø· ø· xvs©À�€b(øÆŒf&æ¦f¦)w bd÷ ž€÷4jø÷ šw L^–%�‚ƒ„…Æì÷æÜ÷€Ä4¤ÈüŽø¤Äå÷‡ <È¤Ô Ä%ù†‡Ä �!‚Ä ¡&Œd$40^N¤PÈV¤dÈf¤€Þ‡±‡Ä%û‡4¤4Èô¶Ô ðÀ�>ø7`$ø÷- ø�÷ƒ÷ ÖÁz÷@@�@PÀr÷@ @‡ÀeÀmö÷ð 7X÷à wR÷ÅP÷À�ò÷àwÖ÷‡÷ À¤È¶€Z Ì÷÷ ˆÀ�Ù÷€ œ¦÷ øÁ�Ë÷@fù ’ …‡÷‹´÷ � Äm¬÷7¨÷7Š¢÷‚ ‡æÃš÷à à à Ä`à à Ä`ƒî  ÷ ØÀ¥0‚À¥7‡ÀEøÿu`‚ ñA   ¦"’ €Ö AåÁ Ñ‹ùÕ ±…Ã<÷·>÷€ †À’À‡Â À(÷÷ &÷Ã÷À5þÿ ‘ ‡÷&÷÷%÷÷÷æÐö·÷÷Äö ÷æFÿˆü‡æ)ÿˆ÷ ÷L´:t T$9)\´:ÜpF€R ý÷÷êö‡À ÷ À÷Üö7�ìöææŽö·ÐöæFÿˆü‡æ)ÿˆ·‡÷²ö÷ ÖÿÀ�¾ö÷ ¸öÀ�±ö  w ÿ¢‡À•$÷ ¨ÿ a zÀå $s©À�0F>s©À�d¢€Î À¥ À•+‡æfÿˆ·…&Î%€&‚Î%#‡À$÷ hÿÎ%¤ ƒ€À倀 œzÀU wHÿ N,–‚Ñ û€@씀 Àe0÷ 2ÿ� @œ�ê7^õÀƒ÷ >.s©À�s©À�"€(6¤>€DzR–^”n�€J ‡7NõÃÄþÿ 7 @õ7�<õÃÄÿÿÀ&Äe N @ Ä üÀe0÷ âþà óÀ• Ö wÔþZ L ¨ ¢ œ ÷ ÷ ÀþÀ÷ ºþÀ• îÅÂê @�÷ À LZ NL P¨ R¢ Tœ rê |i©€‰3Æ  Àe ÀeÀe Àe ÷ ‚þÅ ê‡@( `ADDö ö àSUBü ü MOVÿ  CMP  0BIT  @BIC©  PBIS  BRBNE& & BEQ, , BGEœ2 2 BLT 8 8 BGT > > BLED D €BPLJ J �BMIP P ‚BHIõV V ƒBLOS†BHIS…BVSeh h †BCCþn n ‡BCS t t  CLRþz z F COM€ € † INCP† † Æ DEC‰Œ Œ  NEG’ ’ F ADC˜ ˜ † SBCž ž Æ TST¤ ¤  RORª ª F ROL° ° † ASR¶ ¶ Æ ASL¼ ¼ Æ SXT  pMULÈ È rDIVÎ Î tASHœÔ Ô vASHCxXORà à ~SOBæ æ ˆEMTì ì JSRò ò ÆSWABˆRTSþ þ FJMP  BPTe  ¡CLCþ  ¢CLV   ¨CLNþ  ±SEC" " ²SEVP( ( ¸SEN‰. . ¿SCC4 4 ¯CCC: :  NOP@ >@ ~pê`ˆ>À ´ œÀ<ÀV h€@\h: êˆ>´œ À$<(V,h04\8hà à ­³€Çq´Çq0uÇqXuÇq€uÇq¨uÇqÐuÇqøuÇq@yÇqxdÇqÇqÇqÇq ­´ ­´2|ÇqÇqÇqÇq ­´ê €ê ÷Œÿ�ÿ÷†ÿˆÿ÷ ·f¦æ&BwpÿÃz ÄK�ÓÅøWtýÿÁ‚ ÄÂE€Ã@ Ó “ ýÃK—tøÿ„pÃe ÷ 4ÿÃe0÷ ¾Ã&ÿ×t×tùÿ`÷ œ*z >‚ J@ ^ €f)Ã Ë ‹ aú÷ ôÃüþ÷ –Ãð ÷ îþÃö ÷ xX—túÿÂå(„pÃet ÷ @÷ 8ÿü ø÷ âSÃì ÷ ¶þ Ãæ ÷ @Ã�¨þÃEÿÓ÷ 2Ã� (ð 2ö Ft T¼ `ì jæ €â˜þ÷ š3—t÷ÿÂå8„pÃe ÷ ÷ êþÑ•,Ã�tþ÷ vÖÃø ÷ üÃ�`þöÃà ÷ îÃ�Tþ÷ VÑ•,ÃJþà ÃE€ÿ ‘—tôÿ„pÃeö ÷ ¢÷ ¢þÑ•,¬Ãò öà2ø @à hö zò €^þ ÷ ®¤„ƒ‚�‡Ó єєєÑ”Á ‡&¦æ&f ÄÀLþ$Çqð  È ‡ð ‚ÅâD!‚DÀeìÄ  €÷ ˆ€÷ €Ä Ñ•þ €Ú+÷ :…„ƒ‚€‡÷ ~ÿ÷ ˆýÑ•BÑ• ‡÷rýný÷lý÷ rÿ‡÷ ZÿÑ• ‡& —vÄÂ5à—vÑ•0 €tóÿÀEøÿÀe0�—v €‡¦€V&Äê À ”r — Âe.Âe Âe ‘�~„‚‡æ&fÁ‚ ÷ îþ÷ �€ƒ‡&æÑ•  ÁàÀ”÷ ²ùD~ƒ€‡Ñ•(÷ ¾þÑ•)‡Â�³ü † ê <‚ X‚ €ÒÑ•@ Ã�¤ü× rä÷ �þÃ�Šü`÷ ÿ÷ |þ÷ ®ÿÑ•+Ñ•#ðÑ•-÷ ˜ÿ‡&÷ †‡Dà„ ! !�ÿÄEÿ7Qœü¡±„ä€N‡ 0 9¡±‡Ât·$vüÒ ûJ€ˆ~÷ ü%‡ ÷ 6!‡÷ â‡÷ ü÷ 6‡!ÿ‚÷ ‡÷ ‡÷ ö ‡Dà „  !?t€Ê7Qü¡±‡f¦   + - ' 00*Çm 1g" A)÷ Nÿ4‡ ÷ Fÿ‡—tÀå0P÷ põA ÷ hÞ÷ b÷ Z÷ TtP÷ JÁ €F„`Ë„à È Z ÷ þ ‡&÷ ¨€‡ì¡±‚�‡ ,÷ ¡±‡ff÷ þ÷…�‡¦÷ ‡·P>û¡±‚‡&f  @Å ÷ Êÿ €Â#! -( (-÷ ÿ>‡ ( !†ÂU,Ñ DàÂ7&Ñ ÷ \)‡ÂU0÷ ~ÿ÷ Èþ!‡Ñ Â÷ jÿ÷ 8‡ÂU ÷ ,‡ +Å ÂU€>÷ FÿÅ ÂU¡¡±…„‡& ( ÷ "ÿ÷ ‡ )÷ ÿ¡±„‡÷ Pþ‡!‚¡±‡¦÷ ÿ‡—t·P:ú¡±‚‡÷ "þ‡Ä5€º¡±‡÷ ºÿ‡u7Qú¡±‡¦&÷ ´þ‡÷ Žþ‡÷ Öÿ‡¡±„‚‡÷‹æù÷U€Øù‡÷ îÿ÷ „ÿ‡÷ ^þ‡÷ xþ±‡Âð Ò Ò-¢ùÒ-rð €6žùøÂåÒ ó¡±‡¦æ&7Š�ù÷ ò5‡÷ Äÿ†ÂÔ Ò‹þâ‹—¨B* Š÷ ¬ÿ&‡÷ŠhùÑ Ãâ —  †  ÷ ôý‚‹ÓEÂEðÿú ®‡ÁÁåâ Ü4Ô Râ V r®zâ ~Ü€²&˜d “Á¡¡±„ƒ‚‡&f÷ 0 †Àù$Çqð Àe÷PÐâøÐàø¡±�€‡f¦ÀÔ ÷ ´wÂøB÷ ªwºøÀ¸ø$Çq &˜d bÔ €.,,Àeô¡±‚�‡÷ 8ý÷ ‡¦æÂÃÔ Š . $  0 9 A Z�÷ úü–~×­<ø.—   ×­,ø$8Ô zª×­$øA Š•~¡±ƒ‚‡¦æ ÔÂ%$ Â%.ÂÂå@Âe.Wp(�`×~ƒ‚‡&À7Î÷Àå "Çqù€‡  f­³†"W Á€Àz´âyÁ€À¯”Ds©À�@<&Kq@°úp@„¯½`@$9)@<&9€@´:t @´²2HÇq° €@°?S@´:Ü@i©€‰@z‹¯=@‹¯@=@ô' q@�±„:@<&D@h±p!@ ­³ ª­´ ª\±ÿ~h\±h¤¯Î}h¢¤¯Ø}hÌþ¬¯yä ­´(Ì ­´€€€ÿÿÌÿÿBBBBBBBBBâÈê   & . J Ì(B*B,B.B0B2B4B6B8BpârÈtêv x z |& ~. ü(4(ÿ X\*X.\\\€€ „„Ô ÔŠŠmm=�<&9€<&Kq<&D ¾¾'ÈÈÿôÖ >ôÖÚ ÚÑÌòòP–– ””€¨¨ î î§§ ‚ô' qääô ôâySY € gìgDDDfDDDD01234567SWAMLHCQFXBGIVED¤¶Èìü}~\/'"% ^_@><$=CQ.;-+*BEFGLNPSVWX!:&#? ÜÖÜÖÖØ^ì DDDfDDDD:¤<¶>È@ìBüDFtÜvÖxÜzÖ|Ö~ØBˆâ0<LdÞ”†2,8¨Ä¾ÌÔÖ ø ’B Æ úðt ¶ ž 0Nbª~â0< L dÞ”†2,8¨Ä¾ Ì"Ô$Ö &ø (’*B ,Æ .ú0ð2t 4¶ 6ž 8:0b@ª€ÆN T\7 Àü7 \ýÆ Æ€÷ Âü�ÀNý7Jý7 ü7"÷ ¬ü€À€   ÷ œü"÷öü<ý÷ ÀDD÷ ÀT:÷ ü÷ |ü€ææ?ÿˆ ‡ÀÐü7Fü÷ Æ ÀN T\€8€h€BÆü7<ü÷ º 7 ðü& æX÷ìâü÷ @ü€7 :üÀB ÷ 0ý†7ŠÄü÷•ÿÿ½ü÷ ú÷ ÷ ü wþ÷ Ö÷ ò?‡Â w ê0‡DÄe� w Ú;†Ä%Xì,Bh0p�x;€¾.‡Äe€DlB÷ ‚ wÀ ×­]üÂDÃJüÅÄ ÀBà Å5$ 4 ¤Ô ûtÚ@ ÷ ˆ%†ˆÀB ÷ zý†ÄnûÄfûÄ€B6BH¤RÚfB€:ìû‚ ÷ ¢(Æ€÷¶ûüû÷ îû÷îæûwÿÀ ?÷ ¸Æ€÷”ûÚû÷ ¦7 ¶ûÀ•_÷ ¤7гû  7Šªû7 ¨û÷ Úw øTԇ ÷ ˜y|·Š‹û÷¥…ûw€ î2€bTp|€¶zûƒå7Štû÷•lû÷•þÿdû ÝÀÀ 7Dû7�Rûw�Mû74û72ûÀ%÷5$û éf÷ –�ù æ ´÷ h2‡7zú÷ * á7�þú¨÷ bæ €2Î&‡Å Ba„ Å ÷ <‡Œ÷ 2‡÷•Òú÷ Ü�÷ œ ‡&÷ P†÷ –€‡ÂwÿˆÂ 7œú7šúw�©úÄ�úÄ5·Œú¡±‡Ázú€®Á5ç÷ Jä‡ áÂ6Ã`úw`ú“”B~  w¼þ÷ Þ·Š]ú÷ Ô÷‹Uú÷:ú6ú7ŠIú÷m0ú*ú÷&ú&ú÷ Àú÷ ,À�)ú€ œT÷ Äú 7Šú7 6nT€* úwdþ÷ †÷íôùîùá÷ 4‚b‚ ‚ ·ÞùÜ÷ $‚ù÷rÎùÑ÷lÆùÍ÷ �’Á � � B`é÷ B÷%®ù¤ù‡÷ wðýˆÂ 7ôø7Šžù÷•—ù7Š€¦’ù÷Uâø÷‹Šù÷EÖø÷ ¦7|æÊøæÄø÷ bù ÷ \ùæºø÷ .ù�æeÿˆ·TùÀ•7�Dù7Š>ùÀ�9ùÆ� Ä0¶×­'ùÆ÷‹ ù÷Šù Ds©À�l¶€"÷UhøÊ·`ø·^ø7Þ÷‹ù÷‹úø±÷‹öø÷ 0Å>ø÷‹çø$Ä�âø÷•Ùøw)ÜøÄt!¤ÄåúÄMCÕ w ø7‘³øô ¶Á´ ¶„ Äe0B7šøP¤l¶r¶€ž÷ xÀ’ø÷ tÀ:÷ r@÷ „ÀÚ7føw>þ·4ø·.ø·(ø÷MP^ø÷•ÿÿ[ø¤÷ODPøøææcÿˆ00*ϦTADATADATADATADATADATADATADATADATA÷ø·”÷· .ø÷BE0ø7Š/øŽ÷IO$ø÷IL ÚRs©À�\s©À�€ øÞ÷EMø÷TR ø÷FPø·Ä÷÷•ý÷wèþ 7P÷à wF÷÷ ¬æ  ÷ \÷ °÷ T÷ ÂŽ Î%øò÷ ÀÁŽ ÂìRÀ ý‡âÈê jŽ nìxâzÈ|ê~ €–   & . À„÷ ÷ p÷ 4æ3ÿˆˆ÷ 8÷ üý÷ Nú÷ (÷ ìý÷ >ú÷ ÷ Ü @÷ @‘À ÷ øô÷ ñ ÷ ô÷ ¸‚ÄŒö÷�2÷÷÷ ¨  &  . „„¯½`€ õ÷xö·bö·jöÆŒf&æ¦f¦)w ø÷ ž€÷ê¬ö÷ šw â –%�‚ƒ„…Æ.öæö€Ä4¤ÈüÐö¤Äå÷‡ <È¤Ô Ä%ù†‡,s©À�Œ(2ê> \¤^Èd¤rÈt¤€Ž Ä �!‚Ä ¡‡±‡Ä%û‡4¤4Èô¶Ô ðÀ�€ö7`fö÷-böÒõƒ÷ ÖÁ¼õ@@�@PÀ´õ@ @‡ÀeÀm8öð 7šõà w”õÅ’õÀ�4ö ¤$È*¶€ àwö‡÷ Àö÷ À�ö€ œT÷ øÁ� ö@fù æ …‡÷‹öõ � Ämîõ7êõ7Šäõ‚ ‡æÃÜõà à à Ä`à à Ä`ƒî  ÷ nÀ¥0‚À¥7‡ÀEøÿ  T0æ €† u`‚ ñA  AåÁ Ñ‹ùÕ ±…Ã~õ·€õ€ †À’À‡Â Àjõ÷ hõÃ\õÀ5þÿ ‘ ‡÷hõ÷%\õ÷Xõæõ·Tõ÷õLõæFZ´:t b$9)j´:Ü~F€ ÿˆü‡æ)ÿˆ÷ Hõý÷Bõ,õ‡À ÷ À÷õ7�.õææÐô·õæFÿˆü‡æ)ÿˆ·‡÷°ô,õÀ^ðbðÎ d÷ /‡÷Võ–õ÷Rõ’õÀ÷ *2s©À�>FLs©À�X^bÎ h°?Sz~‹¯=i~ $‡ÀÈ•÷ ‡ÀRö÷ 7 HöÁdô& æSYfæÿˆÀ„p�"ð•#÷ ‡7ö÷ Nÿˆ .STB FILE NAME IS: m&‹¯@=„¯½`6„>ô' qDh±p!ä €ä ÷^ô÷ @ÿÀ�jô÷ dôÀ�]ô  w ŠþP‡À•$÷ ÿ a zÀå À¥ À•+‡æfÿˆ·…&Î%€&‚Î%#‡À$÷ ÒþÎ%¤ ƒ€À倀 "&PPs©À�Xs©À�`€ft¤|€€` œ(ÀU w²þ N,D‚Ñ û€@ìB€ Àe0÷ œþ� @œ;ê7 óÀƒ÷ ˜‡7úòÃÄþÿ 7 ìò7�èòÃÄÿÿÀ&Äe N @ Ä üÀe0÷ Lþà ó(D B0;qÜ À• Ö w>þ®   ü ö ð ÷ ÷ *þÀ÷ $þÀ• îÅÂ>@�÷ À  Àe ÀeÀe Àe ÷ ìýÅ ê‡@( `ADD$®   ü ö ð 4>>i©€‰J J àSUBP P MOVqV V CMP\ \ 0BITôb b @BIC h h PBIS¥nnBRBNEz zBEQþ€ €BGE&† †BLTfŒ ŒBGT’ ’BLE˜ ˜€BPLœž ž�BMI¤ ¤‚BHI�ªªƒBLOS†BHIS…BVS¼ ¼†BCC ‡BCS È È CLRÎ ÎF COMÔ Ô† INC Ú ÚÆ DECeà à NEG`æ æF ADC ì ì† SBCò òÆ TSTø ø RORþ þF ROL † ASR   Æ ASL Æ SXT pMUL rDIVþ" "tASH&((vASHCxXOR4 4~SOB: :ˆEMT@ @JSRFFÆSWABˆRTSR RFJMPX XBPT^ ^¡CLCd d¢CLV j j¨CLNp p±SECv v²SEV | |¸SENe‚ ‚¿SCC`ˆ ˆ¯CCC Ž Ž NOP”>”~pp>`Ü’À  ð�Àª ¼€b@°¼:p >Ü’ð $�(ª,¼0b4°8¼44 ­³€Çq¨´Çq0uÇqXuÇq€uÇq¨uÇqÐuÇqøuÇq@yÇqxdÇqÇqÇqÇq ­´ ­´¨2|ÇqÇqÇqÇq ­´>€>÷Œÿ�ÿ÷†ÿˆÿ÷ (‡f¦æ&BwpÿÃÎÄK�ÓÅøWtýÿÁÖÄÂE€Ã”Ó “ ýÃK—tøÿ„pÃeh÷ 4ÿÃe0÷ Ã&ÿ×t×tùÿ`÷ ö*Î>ÖJ”^h€º)ÃXË ‹ aú÷ ôÃüþ÷ ðÃD÷ îþÃJ÷ ÒX—túÿÂå(„pÃeÈ÷ š÷ 8ÿÃø÷ <SÃ@÷ ¶þ Ã:÷ šÃ�¨þÃEÿÓ÷ ŒÃ�X(D2JFÈT`@j:€6˜þ÷ š3—t÷ÿÂå8„pÃe÷ p÷ êþÑ•,Ã�tþ÷ vÖÃL÷ VÃ�`þöÃ4÷ HÃ�Tþ÷ VÑ•,ÃJþà ÃE€ÿ ‘—tôÿ„pÃeJ÷ ü÷ ¢þÑ•,¬ÃFöÃ2L@4hJzF€²R÷ ¤„ƒ‚�‡Ó єєєÑ”Á ‡&¦æ&f ÄÀLþ$Çqð  È ‡ð ‚ÅâD!‚DÀeìÄ /ÀÌð*f¦æ  ÷ ƒ R|�±„:€.÷÷ÿ²ð7 ²ð÷ Œ‡@ ù‚ÅàD!õ‚w˜ðw”ðDî÷ ŠðÂæÖ ‚� €÷ ˆ€÷ €Ä Ñ•+÷ :…„ƒ‚€‡÷ $ÿ÷ .ýÑ•B:怪ѕ ‡÷ýý÷ý÷ ÿ‡÷ ÿÑ• ‡& —vÄÂ5à—vÑ•0 €tóÿÀEøÿÀe0�—v €‡¦&Ä>À ”r — Âe.Âe d>€&Âe ‘�~„‚‡æ&fÁÖ÷ ”þ00*×m 1g÷ �€ƒ‡&æÑ• ÃÖÁàÀ”÷ ÂøD~ƒ€‡Ñ•(÷ dþÑ•)‡Â�Yü †Ñ•@ Ã�Jü× r’÷ 6þÃ�Ö6Ön’€¢0ü`÷ ÿ÷ "þ÷ ®ÿÑ•+Ñ•#ðÑ•-÷ ˜ÿ‡&÷ Œ‡Dà„ ! !�ÿÄEÿ7QBü¡±„‡ 0 9¡±‡Â"·$üÒ v"€ûJ€ˆ~÷ %‡ ÷ <!‡÷ è‡÷ ÷ 6‡!ÿ‚÷ ‡÷ ȇ÷ ü ‡Dà „  !?7Q¸û¡±‡f¦   + -€š ' " A)÷ Nÿ7‡ ÷ Fÿ‡—tÀå0P÷ võA ÷ nÞ÷ h÷ `÷ ZtP÷ PÁ „`Ë„à È Z÷  ‡&÷ ®†÷ ô€€‡é¡±‚�‡ ,÷ ¡±‡ff÷ ž÷…�‡¦÷ ‡·PÞú¡±‚‡&f  @Å ÷ Êÿ #! -( (-÷ üþ>‡ ( €’!†ÂU,Ñ DàÂ7&Ñ ÷ \)‡ÂU0÷ ~ÿ÷ Âþ!‡Ñ Â÷ jÿ÷ 8‡ÂU ÷ ,‡ +Å ÂU÷ FÿÅ ÂU¡¡±…„€‡& ( ÷ "ÿ÷ ‡ )÷ ÿ¡±„‡÷ Jþ‡!‚¡±‡¦÷ ÿ‡—t·PÚù¡±‚‡÷ þ‡Ä5¡±‡÷ ºÿ‡u7Q®ù¡€Š±‡¦&÷ ´þ‡÷ Žþ‡÷ Öÿ‡¡±„‚‡÷‹†ù÷U€xù‡÷ îÿ÷ „ÿ‡÷ ^þ‡÷ xþ±‡ÂDÒ Ò-BùÒ->ùøÂåÒ ó¡±‡¦æVD€&7Š0ù÷ ò5‡÷ Äÿ†Â(Ò‹þâ‹—¨B* Š÷ ¬ÿ&‡÷ŠùÑ Ã6— X†  ÷ ôý‚‹ÓEÂEðÿú b‡ÁÁå6 �ÔLÀ“Á¡¡±„ƒ*(66:XVb^6b�dÔfLhjÀ€‚‚‡&f÷ 0 †À ø$Çqð Àe÷PЂøÐ€ø¡±�€‡f¦À(÷ ŠwbøB÷ €wZøÀXø$Çq ,,Àeô¡±‚F(€þ�‡÷ 8ý÷ ‡¦æÂÃ( Š . $  0 9 A Z�÷ úü–~×­Ü÷.—   ×­Ì÷$×­Ä÷A Š•~¡±ƒ(€z‚‡÷ ‡BÂ5øÿ ‡`  w@ê7l:êÁew0ꡇ᱇7 걇Àê÷eêÁêw ê‡÷ œÿ‡BœÂ5øÿ  ‡`êé ° €€öèå䡇±‡f¦æÀÐé  ÷ ÷÷ÿ¾é÷ œÿ‡w"þöúw,øöö@Àe¡±ƒ‚�‡¦æ ÔÂ%$ Â%..�±„:<rÂÂå@Âe.Wp(�`×~ƒ‚‡&À7˜öÀå "Çqù€‡  (­³fW VZt^�sV¯”Ds©À�@´:t @´:Ü@ ­t^dÀ \±ÿ~h°\±h²­t^(Æ ­t^0€0ÿÿÆÿÿòòòòòòòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtZ| ¨¸°B Æ(ò*ò,ò.ò0ò2ò4ò6òntpZr|t v¨x¸|°¬Ö4Öÿ  *.  = gšg||||||ž|01234567SWAMLHCQFXBGIRVEDö.š||||||ž |D=DTfxŠšª°¶}~\/'"% ^_@><$=CQ.;-+*,BEFGKLNOPRSVWX^&Tfx Š šª°¶~B~$$`j¸ÄÔÜf~0jdpàüö¾|ž6Ôlþœ~$$  `j¸ÄÔÜf~0 j"d$p&à(ü*ö,.0¾2|4ž668:Ôþ@œ€¼ú’"\L7 vþ7 ÿÆ Æ0÷ xþ�Àÿ7þþ÷Èþÿ7Pþ7È÷ \þ÷ ØÀOD÷ ÔÀT:÷ Ì÷ Bþ€æ¶æ?ÿˆ ‡À”þ7 þ÷ ÀŠþ7þ÷ 7 ú’" \ L0\¶€8¶þ& æB÷ލþ÷ þ €7 þ÷ Àò ÷ ý†7Іþ÷•ÿÿþ÷ ¶÷ Þý‰ w¸÷ ²÷ ²1‡Â w È0‡DÄe@ w ¸;†Ä% ‡Äe0DlD" BŽ$ò\0d@l;x0~D€´÷ N‚ wÄ Àòà Å5W 4 TÔ û@ ÷ €Z†ˆÀò ÷ rý†‰÷‹éý÷ 4;‡tŠ‰Â ÷ 83‡‰÷ @‰Â à ĬýD÷ ò$T>òXŠ€0^À #�ÄEøÿÀ =÷ ”‘Àe0,÷ ŠÄ à Å~ýíŠ@÷ n‰ÄæüÄÞüÄbý‚ ÷ Œ(Æ0÷,ýrý÷ fý÷�^ýw²þÀ ?÷ :Æ0÷ ýPý÷ (.ŠR0b�t0€¬7 ,ýÀ•_÷ &7Š+ý  7Š"ý7 ý÷ hw ˆXԇ ÷ &y~·Šý÷¥ýüwðüƒå7Šìü÷•äü÷•þÿÜü ÝÄ !³7ŠÌüìÀÀ(X6~pŠ€( 7ªü7�ºüw�µü7šü7˜üÀ%÷5Šü éf÷ �ù  ¬÷ œ·Š…ü÷ ÷‹}ü÷`ü\ü7Šqü÷mVüPü÷LüLü÷ DÀBü÷ ÌÀ�Qü€ œX÷ 8 |X€¤8Ä,ü 7Š6ü7 4üwÿ÷ Æ÷íüüá÷ $‚b‚ ‚ ·üÜ÷ ‚ù÷ �’Á � � B`ñ÷ ’÷%äûÂÚû‡Ã ÅÐûDáÄåÀ _÷ Ä&÷ ´À•>€ ÷ º€€ ÷ ¤wˆþúˆÂ 7û7Šªû÷•£û7Šžû÷Uîú÷‹–û÷Eâú÷ ¬÷ ‚æÖúæÐú÷ lû÷ fû÷ <û�æeÿˆ÷ºúbûÀ•7�Rûls©À�€œ7ŠLûÀ�GûÇ� Ä0f×­5ûÇ÷‹.ûÄ·Š&û÷UvúË·nú·lú7â÷‹û÷‹û²÷‹û÷ 8ÅLú÷‹õú#Ä�ðú÷•çúw)êúÄt!TÄå fxT€úÄTEÕ wú7‘Áúô fÁ´ f„ Äe0B7ªú÷ ’À¢ú÷ ŽÀ:÷ Œ@÷ ‰·Pú·Jú·Dú÷MP|ú÷•00*ߦTADATADATADATADATADATADATADATADATAÿÿyú¬÷ODnúøææcÿˆ÷,ú·· Júffjs©À�ts©À�zs©À�€”÷BENú7ŠMú–÷IOBú÷IL:úÞ÷FP2ú ÷EM*ú÷TR"ú·àù÷•úwøþ 7nùà wdù÷¥ýù ÷ ðù÷¼ùúÀ ÷ Þ÷ Äæ  ÷ t÷ È€÷ l÷ ÚŽ Î%øò÷ ‰ÀÁ<šRÀ ý‡tZ| ¨¸À°÷ „÷ Næ3ÿˆˆ÷ X÷ ý÷ nú÷ H÷ ý÷ ^ú÷ 8÷ ü @÷ "*"<&š0t2Z4|6 8¨:¸<À>°€Œ@‘À ÷ ô÷ <ñ ÷ ÷ ؂Ėø÷�<ù&ù÷ Êõ÷‚ø·òø·tøÆ<f&æ¦fæÜø¦w ~÷ Ê€÷|°ø÷ °w h ·ºø€�‚ƒ„…4s©À�B<Xb|n €†¨øÄ4TxüÖøTÄå÷‡ <xTÔ Ä%ù†‡Ä �!‚Ä ¡‡±‡÷ èÿ‡ôÿÿŠ„ ‡ ÷ êÿû‡„ ûÄ%í‡4T4xôfÔ âÀ�jø&TxT&x(TRŠlTpxvf€„7`Nø÷-Jø¼÷ƒ‰÷ ØÁ¦÷@@�@PÀž÷@ @‡ÀeÀm øð 7„÷à w~÷Å|÷À�øàwø‡÷ øÀö÷÷ €À�ø€ œX÷ ìÁ�÷÷@fù  … lX| € ‡÷‹à÷ � ÄmØ÷7Ô÷7ŠÎ÷‚ ‡æÃÆ÷à à à Ä`à à Ä`ƒî  ÷ ÊÀ¥0‚À¥7‡ÀEøÿÄ Ä Ä `‚ ðA  AåÁ Ñ‹ùÕ ±…Ãd÷·f÷€ †À’€| À‡Â ÀP÷÷ N÷ÃB÷À5þÿ ‘ ‡÷N÷÷‹8÷ €‡÷@÷÷ ÷�H÷$÷‡æîö·0÷æôÿˆ†‡À ÷ À÷÷7�"÷æÈö· ÷æôÿˆü‡,´:Ü:´:t Tôzô€ø æ)ÿˆ÷ ÷ý‡÷êö÷ Øÿ÷‹òö€w2ýÀ�ìöÀE€ÿ÷ âöÀ�Ûö  w "ÿT‡À•$÷ œÿ a zÀå À¥ À•+‡fÿˆ…&Î%0%‚Î%´"‡ÀBTt0z´€t $÷ dÿÎ%T ƒ€Àå0€ œ(ÀU £ N,F‚Ñ û€@ìD€ Àe0÷ 0ÿ� @œ;ë÷ –õ „÷ Î�NÀe0,÷ ÿ€7zõÃÄþÿ 7 lõ7�hõÃÄÿÿÀ T0(&F2DB;€ð &Äe N @ Ä üÀe0÷ Öþà óÀ• Ö wÈþÞ Ð , & ÷ ÷ ´þÀ÷ ®þÀ• îņ @�æf À A N ‡�〠ö ÷–%À  *Þ ,Ð ., 0& 2 P† Xl Àe ÀeÀe Àe ÷ ^þÅ Þ‡@(ÄFõ æÿÿ�  ‚,Š‚ìŠB ‚Ð ó€‡�€ À ÷ 8Š@Š\W Vϳrt^à8Vϳ¯”Ds©À�@´:t @ÌT�(@´:Ü@ÌTÑ(@ «´} \±ÿ~h°\±h²«|}  «|}( «´}0€0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ (LTd\b «|}(*,.0246 n«|}  p«|} r«|}( t«|}L v«|}T x«|}d |«|}\¬´ ´ÚnÚÿD 6 ˆ ‚ | @( (LTdl\ DHv <«|}D >«|}6 @«|}ˆ B«|}‚ D«|}| L«|}  N«|} P«|}( R«|}L T«|}T V«|}d X«|}l Z«|}\dDhHH=HgšgVÎÎÎÎÎÎðÎ01234567SWAMLHCQFXBGIRVEDNšV «|}Î «|}Î «|}Î «|}Î «|}Î «|}Î «|}ð «|}΂A‚TfxŠšª°º}~\/'"% ^_@><$=CQ.;-+*,BDEFGIKLNOPRSUVWXZt&Tfx Š šª°ºÀ"Àztztt¶À*2¼Ĩ¼z «|}z «|}t «|}z «|}t «|}t «|}¶ «|}À «|} «|} «|}* «|}2 «|}¼ «|}Ä «|}¨ «|}¼"Þ¶Â6RLZdT:®\p€z «|}¶ «|} «|}6 «|}R «|}L «|}Z «|}d «|} «|}T «|} «|}: «|}® «|}\ «|}p «|}€üv LdÎøèlZ «|} «|}v «|}  «|}L «|} «|}d «|}Î «|}ø «|}è «|}l«|}^7 @7 â÷°´÷²¶Æ Æ0÷ R�Àæ7æ÷°67>7÷ R÷ ôÀOD÷ ðÀT:÷ è÷ R€æz«´}@ «´}â«´}°«´}´«´}²«´}¶ «´}0"«´}R(«´}æ,«´}æ0«´}°2«´}66«´}>>«´}RX«´}R€Zºæ?ÿˆ ‡Àº72÷ " À¼74÷  7 & æˆ÷ ÷ R €7 R÷ €À ÷ ‚ý†7Šî÷•ÿÿí÷ "÷ R‰ wê÷ B÷ ,7‡Â ÷nz «´}º«´}º«´}2«´}¼ «´}4(«´} .ˆ46«´} :«´}R@«´}R H«´}T«´}îZ«´}íb«´}R ~«´}n€Ö÷ R ‡DÄe@÷y÷ >†Ä%"‡Äe0Dl‚÷ b‚ · wÄ Àà Å5W 4 TÔ û@ ÷ îZ†ˆÀ ÷ àý†‰÷‹éZ«´} «´}@ «´}y«´} («´}0 .«´}‚8«´} B«´} T«´}T n«´}|«´}é€R÷ ¢;‡tŠ‰Â ÷ ¦3‡‰÷ ®‰Â à ÄÚD÷ b À #�ÄEøÿÀ =÷ ¤‘Àe0,÷ šÄ à ÅÚíŠ@÷ ‚‰ÄNÄLÄÚ‚ ÷ œ(: «´}Š,«´}ÚZ«´}Ú ^«´}Šj«´}Np«´}Lv«´}ÚnÎÆ0÷°6÷ ÷ w¦þÀ ?÷ JÆ0÷°6÷ 87 àÀ•_÷ 67Šé  7Šè7 ê÷ ì÷–÷ ҇ ÷ ¦yÀ·Š~ «´}0 «´}° «´}6«´} «´}  («´}0,«´}°.00*çm 1g«´}66«´}àB«´}éJ«´}èN«´}ê V«´}–X«´} j«´}À€8é÷¥éwäƒã7Šè÷•è÷•þÿè ÛÄ !±7ŠêìÀÀ 7Þ7�ðw�ï7Ú7ÜÀ%÷5Ú éf÷ ˜�ù z«´}é «´}é«´}ä«´}è"«´}è*«´}è :«´}Š<«´}êP«´}ÞT«´}ðX«´}ï\«´}Ú`«´}Ül«´}Ú ~«´}d´ª÷ àš·Šñ÷ Ö÷‹ñ÷ÜÚ7Šñ÷mÞÚ÷ÚÜ÷ PÀÚ÷ ÖÀ�ï€ œ–÷ DÄÚ 7Šè7 êwÿ÷ ˆ÷íz«´}ñ«´}ñ«´}Ü«´}Ú"«´}ñ(«´}Þ*«´}Ú.«´}Ú0«´}Ü8«´}Ú@«´}ï F«´}–N«´}ÚT«´}èX«´}ê€ÞÚá÷ $‚b‚ ‚ ·ÚÜ÷ ‚ù÷ �’Á � � B`ñ÷ T÷%Þ/ÂÚ‡÷•  ÷• ÷• ÷• wzþà ÅÚDáÄåÀ _÷ ®&R«´}Þ«´}Ú«´}Ú:«´}Þ@«´}ÚH«´} P«´} X«´} `«´} l«´}Ú€�÷ ¢À•>÷ ¤€€ ÷ ’wbþúˆÂ 7>7Šî÷•í7Šì÷U@÷‹î÷E@÷ Ð÷ ¦æ@æ>÷ â÷ â÷ ¼�æeÿˆ÷Bö5Àp(«´}>,«´}î2«´}í6«´}ì<«´}@@«´}îH«´}@T«´}@X«´}>\«´}âb«´}âf«´}¼r«´}Bts©À�p  & À•7�î7ŠîÀ�íÁ� Ä0f×­íÁ÷‹î¾·Šì÷U@Å·>·@7ú÷‹í÷‹ì¬÷‹î÷ fÅ>÷‹z«´} «´}î«´}î«´}í ,«´}f0«´}í8«´}î>«´}ìD«´}@J«´}>N«´}@V«´}í\«´}ìb«´}îl«´}>|xí7Ä�î(÷•íÅåÄ÷ @�Äæf&æËÿˆ†w÷-Ät!TÄåúÄTEÕ w>7‘íô f­´ f„ Äe0B7ê÷ HÀ~«´}í «´}î«´}íÌTÑ(«´}@$ÌT�( («´}8«´}<«´}>«´} H«´}T\«´}>`«´}í d«´}f j«´}ft«´}êtðê÷ DÀ:÷ B@÷ À‰·®·¬·ª÷MPê÷•ÿÿí˜÷ODêøææcÿˆ÷¼·· â÷BEê7Ší‚÷IOê÷ILêÞ÷FP|«´}ê«´}® «´}¬$«´}ª*«´}ê0«´}í8«´}ê>s©À�Hs©À�J«´}¼Ns©À�R«´}âX«´}ê\«´}íd«´}êl«´}ê€`ê ÷EMê÷TRê·ª÷•íwÐþ 7Jà wH÷¥é ÷ ä÷²6À ÷ ”÷ îæ  ÷ ž÷ ò÷ –÷ Ž Î%øò÷ ‰ÀÁ"b«´}ê «´}ê«´}ê«´}ª«´}í*«´}J2«´}H8«´}é>«´}äD«´}²F«´}6 ~«´}"€ÜšRÀ ý‡÷ J÷ .æ3ÿˆˆ÷ ’÷ Vý÷ ¨ú÷ ‚÷ Fý÷ ˜ú÷ r÷ 6 @÷ \@‘À ÷ Rô÷ vñ ÷ N÷ ‚ÄD÷�ðÞ÷ Fõ÷" «´}šp«´}Dt«´}ðv«´}Þ€XB·º·<Æ<f&æ¦f溦æPÿˆ÷ ”€÷(ž÷ �æJÿˆ·º€�‚ƒ„…†ºÄÁTaAÂxaÀ÷ ÂÀ÷ Äåts©À�«´}B «´}º«´}< «´}< «´}º &«´}P2(4«´}ž <«´}JB«´}ºT«´}º \«´}T d«´}xr«´}€Ôì‡ ÁTaAxÀ÷ äÔ Ä%ò†‡Ä �!‚Ä ¡‡±‡÷ èÿ‡ôÿÿŠ„ ‡ ÷ êÿû‡„ ûÄ%í‡&4Tô� òÂxaÀ÷ ˆôfB «´}T «´}x F«´}Š b«´}Tf«´}  h«´}ò n«´}x ~«´}f~PÔ €×À�ð7`Ú÷-ÚJƒ‰÷ ÚÁD@@�@PÀF@ @‡ÀeÀmÚð 7Dà wFÅHÀ�ðàwÚ‡÷ „ÀÚ÷ À�ï€ œ–÷ xÁ�z «´}ð«´}Ú«´}Ú«´}J&«´}D0«´}F>«´}ÚH«´}DP«´}FT«´}HX«´}ð^«´}Úh«´}Úp«´}ï v«´}–€Êï@fù …‡÷‹è � Ämê7ê7Šè‚ ‡æÃêà à à Ä`à à Ä`ƒî  ÷ VÀ¥0@‚À¥7=‡ÀEøÿÄ Ä Ä `‚ ðÁ  ÁíÁ Ñ‹ø±‡J«´}ï «´}«´}è«´}ê"«´}ê&«´}è0«´}êj«´}r«´}TF÷%0Ú‚÷%¸Ú‚7 ÷7ÁÚ·à÷5ÚÁ · ÂÀ÷ X÷5ÀŸÀz «´}0«´}Ú «´}¸«´}Ú«´} «´}«´} «´}$«´}Ú(«´}à.«´}Ú6«´} :«´}H«´}N«´}€–‡Â ÀÞ÷ àÀ5?‘?ÁÚÁ5Á ÂÀ÷ ‡Á%]ò÷ ÀÝ ÀÝ ¦f&æËÿˆ †×­�÷ 0wÄøÀ ‰h«´}«´}Þ«´}à«´}$«´}(«´}Ú4«´} B«´} H«´}òN«´}T«´} X«´} js©À�x J‡÷4÷4渷8æ2ÿˆ†‡À ÷ À÷47�H渷8æ2ÿˆü‡æ)ÿˆ÷ Dý‡÷4÷ Øÿ÷‹D€wlüÀ�HÀE€ÿ÷ ~ ´:t  «´}4´:Ü«´}4«´}¸«´}8 «´}26«´}4:«´}H>«´}¸B«´}8 F«´}2T«´}D^«´}4f«´}Dp«´}H€† FÀ�E  ÷’÷ �þ‡À•$÷ ˜ÿ a zÀå À¥ À•+‡&÷ (Î%0%‚Î%¸"‡À$÷ `ÿÎ%T ƒ€Àå0€ œfÀU ¡ N,„‚Ñ Z«´}F «´}E «´}’«´}F«´} L«´}0 R«´}¸ `«´}T h«´}0 n«´}f z«´}„€ û€@ì‚€ Àe0÷ ,ÿ� @œyë÷ P „÷ ¾�NÀe0,÷ ÿ€7NÃÄþÿ 7 N7�NÃÄÿÿÀ&Äe N @ Ä üÀe0÷ Òþà óÀ• Ö wÄþ÷ 2 «´}‚00*ï+óTADATADATADATADATADATADATADATADATA «´}y «´}P:«´}NH«´}NL«´}N€~ ÷ ºþÀ÷ ´þÀ• óÅÂ@�æf À A N ‡�〠ö ÷–%À  Àe ÀeÀe Àe ÷ dþÅ Þ‡ÄÚ æÿÿ�  ‚,Š‚ «´}j«´}Ú |«´}Š ú ìŠB ‚Ð ó€‡�€ À ÷  «´}ŠW ÄÀXÀZшÄÀXÀ¯”Ds©À�@ ò«t Þ2²VNh ѱ�XhY¯8 hò«< ®ò«<( ò«tÿÿÿÿÿÿÿÿ ò«<^÷ ·÷@ZæLÿˆ†‰÷ 8×-7÷>ææ·7 Z—#@Îå÷\–%zò«t ò«t@ò«tZ ò«tL ò«t "ò«t8&ò«t.ò«t2>4ò«t<ò«t@ò«tFò«tZJ@V\Xò«tHZ·#ö5à&÷÷í÷-‡÷-ƒ÷-‡÷-ƒ÷-zò«t ò«tò«tò«tò«t"ò«t$ò«t(ò«t*ò«t0ò«t2ò«t8ò«t:ò«t@ò«tBò«t€ž ‡÷- ƒ÷-‡÷-ƒ÷w²÷  7 æ4ÿˆ‡ææ)ÿˆæ&f¦æÁ]Ã÷ †Ã÷ ~ƒ ÷ vƒ ÷ nƒ÷ f€ò«tò«t  ò«tò«t ò«tò«tò«tò«t&ò«t.ò«t4ò«t 8ò«t4Js©À� Vò«t]Zò«tbò«t€Á‹ƒ÷ Zƒ÷ Rƒ÷ Jƒ÷ D÷ >C÷ 8ƒÃe÷ .ƒ÷ &æÿˆ‡ææ)ÿˆƒ‚�€Ÿ·À à B  à B à B ( ò«t‹ Fò«t`s©À�dò«thò«t–à B Âe0‘�À ôÑ• Ñ• ‡ ò«t€> \q ÍgR^ PCPCPC PCPCPC PCPCPC PSPSPS DSDSDS R0R ò«<>\2Í@R Hò«<^SŽ0R0 R1R1R1 R2R2R2 R3R3R3 R4R4R4 R5R5R5 SPSPSP TOSTOS >>> BREAK <<< «4ò«t 8ò«t4Js©À� Vò«t]Zò«tbò«t€Á‹ƒ÷ Zƒ÷ Rƒ÷ Jƒ÷ D÷ >C÷ 8ƒÃe÷ .ƒ÷ &æÿˆ‡ææ)ÿˆƒ‚�€Ÿ·À à B  à B à B ( ò«t‹ Fò«t`s©À�dò«thò«t–à B Âe0‘�À ôÑ• Ñ• ‡ ò«t€> \q ÍgR^ PCPCPC PCPCPC PCPCPC PSPSPS DSDSDS R0R ò«<>\2Í@R Hò«<^SŽ0R0 R1R1R1 R2R2R2 R3R3R3 R4R4R4 R5R5R5 SPSPSP TOSTOS >><Á0ÀT 3,  ù#+þ� ÀS' ‹ g' ; Bx' º0„' ¾P' Ì8T' ++^q+ €+Ç‹d‹k‹W‹œ‹‘.‹^q‹t…9?€9@€;ÓM>à8>î—DXHÌ8HÖKJÖKNt Xt ó.ó0ó) ó%óÀRóÕZóJwóýxË{Ô(KXYqªsOy*}dŒ|£&€s)|&,&‰&³&À&<&œ,&».& N&ÔZ)|&N`&4d&ûf&\g&´p&®s&x&®x&Fy&Ny&Ýc& c&îc&=c&c&ü%c&&c&b'c&d'c&½'c&](c&ˆ(c&À8c&>9c&X:c&y:c&¤:c&ª:c&vLc&ÞYc&{Zc&òyc&r†›&€%)|�&})|�&.})|�&4})|ì&a )|ö&0M)|c'kM)|e'€W)|o'Öd)|´'a )|í'î~)|(})|(})|(4})|(à~)|U(4})|U(0)|€(Xa)|ˆ(¶^)|ˆ(ð_)|Œ(` )|“(s:“( z»(b »(DG»(²Z»(T[»(æf»(w»(Çw»(y»(Ry»([–»(—¹)Bx»)04¾)øWÁ)ÀSÄ)p!Æ)HÆ)H…Ê)è!Ê)BxË)øÌ)ˆrÎ) S;4S;²S;ËS;S;""S;ý2S;ð3S;ƒ:S; NS; RS;›YS;JwS;æwy<y<ãLz<òzOÛDOXJOH"=�°'' A�> ' D�p…' :šBx' <šäp' <šsw' >šP' >šd' >šø8' >šŠr' Kš<}' KšÖ…' Lš‚ ' Lš´s' Lšðy' ú¨â.)|@©öq%Â@©ír%Âr©š&>š©Xu$š©vu$š©wu$š©xu$š©yu$š©zu$š©{u$š©|u$š©}u$š©€u$š©žu$š©Ÿu$š© u$š©¨u$š©Ðu$š©øu$š© v$š©Hv$´©€‰½©¼w%½©Ry&>¹«žŽ(¸¹«ÆŽ(¸¹«�(¸þ¬„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ6&6&<' 6&""$6&äf&>6&w~%›'þv(¸ì3þ)|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ00+ÿóTADATADATADATADATADATADATADATADATAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ-T OŽØ³z6&OŽØ³¯”Dc&òyHêÿc&y:Hëÿš©vu@š©€u@5¬ ™@š©zu@š©xu@š©wu@š©{u@c&X:HþÿS;ð3Hâ)sE@zc&r†HïÿS;Hš©yu@c&¤:Hüÿ»(b Hš©Xu@„¯½`@<šsw@š© u@š©Ðu@š©žu@š©¨u@>šd@š©øu@š©Ÿu@z>šP@c&ª:Hîÿš©Hv@æ)»@�±}s@|£H@»([–Hš© v@þ¬„Hd¾�8T@>šŠr@KXH$9šø8@Õ±à@c&îHðÿh±²'@$9.…@zS;²Hc&d'Hõÿ‹œHc&=Hñÿc&b'HûÿªsH»(²ZHc&½'H÷ÿ¹«žŽ@»(æfHc&Hóÿ¹«ÆŽ@º0„@»(T[Hc&ˆ(HýÿzÔ(H¹«�@KšÖ…@‹t…HdŒH»(wH c&](Høÿæ)ÐW@ì)p…@S;""H@@©öq@»(ÇwHS;ƒ:HLšðy@¾P@z‹‘.H@@©ír@»(yHóÀRH»(RyHä)²'@óJwH@å)Ps@ô' q@S;4H; Bx@Kš<}@½©¼w@ó.Hó0Hz™²`;@S;›YH€‹^qHS;ËH+H<šäp@»(DGHlóýxHc&À8Húÿó%H€ó) H $95:@OyH +ÇHc&>9HíÿzS;ý2H½©Ry@š©}u@š©|u@ ´© Ê)è!H¹)BxHÎ) H ¾)øWHÌ)ˆrHÆ)H…HÄ)p!H Æ)HH¡« z»)04HÁ)ÀSHË)øHÊ)BxH¾©&&ûfH&\gH &®sH&ÝH&<H& NH&xH&N`H&®xH$&œ,Hz&NyH"&FyH &».H&,H&4dH &³H&´pH&‰H&ÀHÍ«“( zH“(s:H®ª$;ONHDOXHz>OÛHJOH"H¼©ûXt H JÖKH>î—HNt H HÌ8H>à8HDXH9@€H9?€H HÖKH;ÓMH 5ªDe†z~<~<òHJˆrèdÆ& ˆ ô® ü N œ Úêð w ~FR øÞèØ ($.(l,ð0F2h4h6¦8Î:>è@dBÆD& Fˆ HôJ® Lü NN Pœ RÚTêVð €Ò÷ >EuBµ µAÁe„uÁeOuõ%UU€õ•"wîMe÷ Ð5 Á%&ƒù ª ÷ Ø ÷ 05 :ue ¹«�jª€Ný ý±‡÷ÿÿ 5 ÀØ÷ æAÁeÂjŠ‚~õUU€õ‚÷ dBÂeXµPCÃeLòò ÂeµVÃeòò ò•0€Ê BCÃeÀ“”~ÍU÷ ÷ ÷ L÷ L÷ ²÷ >ÍE‡÷ õ•ÿ ÷ ÷ dBÂe$À•R”~Á•÷ ¸D~÷ °&÷ ¤Â5€F*Â5õ%„ À6õ„ õ‹õ õ%P õP õ À0÷ ÀFÂ5À@÷ ô�@�ŠÁÀ¥A- 5 BÍ5Â%6B0JFT@€ÂàµB@mBAmBu ‚Ä À÷ ® à� ÀU÷ æÀ÷ ˜E~÷ ž÷ â50÷ Þ‡÷\öÿ÷õ•÷ À÷ hÀ˜÷ `÷ @Á¯÷ ~ ‡"4V¹«ÆŽ`½©¼wdl˜x¯€> R µ u À²÷ :÷ Á¶÷ X ‡Á5õ•õ• Á¥ õ… õ ÷ À¥cû‡›7›[H›[24B›[132C›[6n›8€[›[c€[?²"¶T@©öq€º÷ @¤ É‹ú÷  ;B÷ ¡±‡ ÷  0 ‡ 9 ‚fÁ Á �eÁ Àå0`ï‡÷ â þÿwÌ÷ ÔÀ%ÿÿ@mB÷ ²÷ Â÷ ì ÷ àï÷ @©öq,@©öq€6Ø÷ E~é‡÷ ¤ ýÿwŽ@0À À €`÷ þCÃeÔõ2À`54Ãå ÷ ÔÄ `÷ š ÀEàÿÁ@t0 Á t0 ìÌ5ÂÁ00+m 1g÷  6ÍU€²& ‚ ÷ �Ä t0 Ì5æNíB­& ÎEàÿ€% W @&÷ ¤„÷ Ý�&Dô5@ ÷ ä$�¤�D„¦ ÷ ‡K‹ s€.Áe‹~‚ ~Ö žÃeõ 4w’‡÷Ä D4÷ ”÷ †À%ÿÿ56 9 (÷ æ‚ ÷ h„~fÄe &À•4~Œ÷ LÌ5 ÌUô5&¹«ÆŽ€ª@ À÷ ¦ÀeÔ”P  ƒ~Š÷ ƒ ÃE‚ÂàµàÖ ‡Ï  Ò� ”B~‡÷Äe• ÕD`„~„ ÄEó5@ Ô ‡÷ †w¸P¹«ÆŽ€& KmB3ô‡ÃeC-4‚±‡÷   üÿwŠB6ƒ ÷ ŠÀ%ÿÿÀ÷ î‹ R�ÁR�Á÷ ��D~÷ Ò÷ €�D~ã÷ µ8‡À•€¢0÷ ²‚ ‡C2õ 4QA8B Äô5@ ÷ ˆ³` `÷ Vÿï†D4ô5@ +÷ ¬ÿÀ•÷ b÷ òþ Ì €Ô&�”f� Ä m÷ Öþ€~€÷ 8C~À•�³ÄmÃeI~ ~Ö ÷ ªþ5!6̇ÍU÷ DÍE‡5`u-‡‡÷üþÿ÷ Ø  ÷  Á t ÷ €÷ 4€š‡÷ zÄô5@ &÷ Bþ‚2 üÿ„÷ ÷ nþꆇ÷Âe �ÔB` �Ô÷ .‡÷ .÷ 2@Ô÷ ÄÀ  @à÷ B`÷ :¹«ÆŽ€¶ÿ÷ þ톇‡  ‡¦ Ò‹� ü‚‡÷ àÿõ%UU€À÷ >u A ÷ ô ‡Ë¥* ÷ :0ðeð÷ ÄL=‚ ð:€’ 0 ÷ Ø1‡÷Àóÿ÷ hÄL=‚÷ xýó‡÷‡÷ <÷ Þÿ÷ ¦ ÷ ´  lÀ ô÷ 8ñ‡1@÷ "B8° ° ‡Í5‡€ ÷Zíÿ÷TôÿC2õ 4ø‡÷ ÜÿC@÷ xÿÄL=‚wdÿ÷ 2À  lÍ5ïC@ñ ÄÃïƒ ñ1ñe1 1‡÷ €Š Âð 0 ‡ü ’’â  ‚ f Ž ü W ‚W †C@¥Ä&Á ù š ž‡€L=‚õ@0ðeÂï‚ °‡÷rïÿ÷ $†ý.ü ’’â   ‚ "f $Ž &ü Hš € ¡‡·@2"Àeûć÷ $ô5@ ÷ ‡÷0òÿ÷ ²û‡·& ÷ æÿ �ÜúÿÀÄL=‚ÃeH~Ž Ãƒlüÿ÷ Žÿ ‡ ¹«žŽN¹«žŽ€‚ ÷  ÿ÷ Äÿ†‡÷ ”ÿ² üÿ²¬üÿûÿð ò üÿ�œûÿÁ ÷ 4&À@`Á’À�÷ ôÀ÷ ÀL÷ À÷ Ø÷ 4ÿ€÷ Ö÷ lÿ¡‡w €þÿƒ`Ò”D~‡÷ LLj¹«�€þ &ÿò üÿð ò üÿ�œûÿ÷ .&À’@`À Á’÷ ŽÀ÷ ¨ ÀO÷ Z÷ r€÷ t÷ ÿ¡‡w €þÿC`Â~Á ƒà£˜D~‡÷ ¼þæ¦÷ Üþ‡÷ „ÿƒ 6OP¹«�€z ‚ �ÜúÿÃeC~ÄL=‚ÃåøÃƒlüÿ÷ fþ¡–5‡Á@ € &À-÷ Ð @÷ P À•;÷ � €÷ B À•r÷ ‚ 5 :‡÷ @þ÷ ‡w ÷ JþÃå D-x¹«�€ö õ 2 ‡ÄL=‚öö6 ‡÷ þ÷ ‡w ÷ þ �Üúÿ÷ ÆùC~� D-6‚±L=‚ô66 ‡÷ Ôý° Ãh÷ ®ýð ÷ æý†w¦üB,¹«�€r @Ê¢„ƒ÷ ö û ø õ1‡w ÷ ‚ýÃlüÿ÷ ^ý÷ ‡w ¦œúÿ÷ bû €ÕfÎ �#�Nà÷ :B`÷ ìúÃeÄ~Ö 0¹«�H¹«�€î ‡÷ 2ý°þÿ ‡C6Â"„ ‡Ä Á ÷ ˜†Ãe ÄÔa‹~Á ð0 Ãeð” ð ‡÷ ñÿ·÷ ÄûD4Ñ ÷ R†÷ f¹«žŽ€j ˆøD-6ö‚ô5@ æ÷ ¸üƒ�üÿô5   ÂEàÿ� ‡Á C`÷ \ü‡÷¶ õÿw À•”÷ „�B”÷ „  ~±‡— a— zT¹«�€æ Âå ‡À• Ì5@À•0‡À¥!‚ 0‡À¥:‚ A‡w ÷ BÌ5 ÷ 4DV÷ ,ƒ„ Á ÀÌ5�”B~mB` ˜B~÷ ‡÷4¹«�~¹«ÆŽ€b÷ †ÿÁ�‚~‡÷Ì5>Í5ô¥ ô‹ ÁÑ¥ „~ÁeBÔ'@”÷ Jÿ‡…~!� ÷ XÀ÷  ÁÂe Ýô‹¹«ÆŽ€Þ€”÷ ÿ‡@”÷ ÷ f Í~÷ z ‡Ì5@À¥ � ‡1457÷5 +5��À•�õ@À•Ž÷ $ À-÷ N ÁÀ•0÷  À•;B”C´ü@¹«ÆŽb-j€Z÷ €�ôÀ•m÷ ô õÀ<÷  ‡f Šõ@÷ ´ � ÷ †ÿÌ5 ÷ N÷ .É ü‡À ú ÷ ¨ÀE€�‡÷  BVfP„÷ ÷ þÁ%l <|l€Ö!t-<„ïÁ%ðÁ%„ õ <„âÁ%„#t-<À¥.åÉ À ×C@ÄÁ%ÄC@ÄÉ Ä&C@ÄÉ À „½ð0XÄ€RÖ Ö wNÿ÷Áe BÔ Ñ¥.€ …~APBV1 2� ÉUÉE€ ÊU@ÊE122àA‚ÉÊ&€ À `À1€e2‡¹«ÆŽ€ÎÁSÁ ÷  Q$É ûAÁ5óà W RW Þ W ˆÍ5W ØÁF‡·÷ Öh‡÷ Êü&ÁÍ5-Ì5÷ r'†m! WBí<&S @©öq(R.Þ4ˆ@ØFFL¹«žŽ€J q˜ƒ~‰�÷ ý÷ ,&  FB<C Qœƒ~‰�f:÷ ôü€÷ †t-<0Am<€� �÷ ^ýÌ5÷ ²÷ ÞÌ5€t-<Ì5»£€Æ÷ ‡ö€ô5@ ÷ ´À%€6ÍUÖ ‡Ö ÷TÌ5 À 0ô5  P @‡÷0w À€ô5@ À€Ãåõ 2†ñ5@ 4š©XuXš©€u\¹«�€B$ÄL=‚ñÀ%€ô5@ &÷ Ø÷ƒƒlüÿ÷ œ÷‹¯À€ö6 6¡‡÷ºw ÷ F"‡À€ñ5@ 00+óTADATADATADATADATADATADATADATADATAÀ€÷ †ó†ñ5@ Rš©¨uV¹«�€¾ÄL=‚óþ¢À€ö6 6¡‡÷dô5@ ÷ ì‡÷ òø‡À€‡÷Dô5@ ÷ ̇÷ ù‡À€‡÷$À €À€ô5@ ,š©ÐuLš©øulš© v€:÷ ¢‡÷À•÷ ±‡ ÷ à ÷ |‡À€‡·t-<÷ R‡÷ ‡÷Âw B>‚ µ <t-< Äe Õ„`•÷ Jú†‚ &š©Hv@©ír$@©öq8¹«žŽRš©vuV¹«�€¶úw B>õ <Äe Õ„`™÷ $ú†Â ú µ>ÂÀ€`÷ ‡õ < õ <÷ е <‡÷ ²ÿ‡÷<÷õ <E÷ ÎùÂBm< Í5#Ì5 ¹«�\š©wu`¹«ÆŽ€2A<Á ²˜C~ �f:÷ (ú€÷ º%÷ R †Aí<’œC~ �÷ ú÷ HÿÌ5»÷ ,¸‡ �÷ 4ÿÌ5 f:÷ hú÷ €÷ nÍU‡÷¢÷zš©xu~¹«ÆŽ€®Á�`! ƒ~B-<‡÷ ÷ Fù÷ ÍU‡ÀU€‡w Í5à ÍUÂe �ÔB` �ÔB` �Ô÷ J¡‡ÍEf:fBAÁe*BÀ•Ò¥¹«ÆŽ6¹«�€* ~÷ NÍ5„÷ Æì÷ ¾î÷ öÍU ÷ è÷ vûÁ%ÞßÉ ù‡À ô€µBÍEAÁe÷ ,Ö €÷ Œ‡÷Äw f:AÁe$ ÷ €÷ j‡÷ 4Þ`š©yud¹«�€¦`ì÷ Xî÷ �Í5õ 0ÍUC2Ä÷ ¨ø÷ hðù†ÍEC@Ä� ÷ 0ù‡w   Ì5ÍE5 <ÄeÕ•÷ î÷†‚ úÍU5<ÄeJ¹«�€"Õ„`™÷ Î÷†Â úB<w¤ýÀ!÷ Lu� :u� ;÷ ‡w f:Á Í5 ÷ 0ÍE ÷ &f�@�÷ –ø€”÷ ÖD~€•÷ ˆøÍU €÷ r‡À  !:¹«�€ž ÷ ì5 :‡A4Cz9`NŽXÒÒ·÷ ÷ÁAm<  ¡ÍU€÷ ÍE€‡÷ªô5 Ê Ò ´4 Ò øÁeÑ‹. 4z `&Ž,Ò2Ò6¹«žŽZ¹«ÆŽ^ª€Am>Ê ‰¢Âeù’$ú ‡÷ ‡‡÷    A‡À¥Z† a‡À%z‡÷ ‡‡÷Þ 0‡À¥9‡÷ ðÿ†÷ ¾ÿ‡‡÷¾÷Á*š©zuVš©{uvš©|uz¹«ÆŽ€–Ã- + Ã+ -  .   Ñ …~¡÷ ¦ÿ‡‡÷z  ‡÷l÷÷ öÁ  ƒ „~Ì5à Ì5à ô >š©}uLš©žuP¹«ÆŽ€¡‡÷.÷(·C2ÄL=‚÷ ¦ÿ‡Â÷ öíô†ƒ¡‡Í5€ f¦Â÷ Ôï÷ øý÷ äú‚�ƒ±‡ý÷ ÌÓ ƒF5 : ÷ �ö÷ èuš©Ÿuš© u¹«žŽ€Že±‡w õ%UU€À÷ æÂ÷ ~ïÍU@÷ žý÷ Šú ÷ zý÷ øÁ%RÁFÉ ÷‡‡5 :&À-÷ ª€“÷ *À•;÷ j €Ý÷ À•H÷ Xµ:¹«�>RDFV-€ ‡÷ Æÿ÷ `‡w  ÀådÀ•1÷ 0‚ CÁå € ú À Àe0÷ ÀÀe0÷ ‡µŠ;ÀŒŒ=�µ u- ‡@Àe„5 ý•€¹«�€†5÷ ‡f@”ÀŒ€ ÷ ¾ÿù�‡÷ ˜B’÷ $ô‘�ú      BÃÉ‹ W¢]W¤:øÁ ƒ ƒ � à à mK“à‹É‹èÁ ½©Ry:<šswp<šsw~$9è'€÷ F&&†p�Áe÷ ‡ð•÷ †Á5ÿW SW PW M÷þýÿ Br÷ þüÿ55÷ (f1Abì)p…æ)ÐW<šswä)²'"�±}s(ô' q*æ)».h±²'4å)Ps>$9šŠrx¾P|¾P€~€%æ& ‚pp¦°Îe°÷ '‡÷ $‡–%É%b' ÷ ÷ ¾1 ÷¢ýûÿ‡÷ z‡÷ ¨‡1 ÷ ‡‡Br÷zýúÿ÷týùÿHº0„â)sEâ)sE"â)2H*â)2H.Õ±à4™²`;B„¯½`J¾Pb¾Pf„¯½`€úA1÷dýîÿ÷^ý÷ÿw ÷ *AHCÁà†CHæÃeÃEfDŽ & ‚pð¦°Îe°÷ ͇÷ ʇ–%‚µFuJŠ< Kš<}¹«�$>šPNâ)sERâ)sEZâ)2Hbâ)2HfÕ±àl™²`;€v‚ µ`D‡w ÷ ºÍE¦)€÷ ¨º‡BÊ ",Áeõ‚’$µFõåFµJ–%‡÷ ~4�‡÷ ŒþC-†ÃåC`AlÁe ¹«�&>šø8^>šPl:šBxr:šBx€òC ‰†‰"±,Áeõ–%uDõÿÿH÷ ôþÍUBÂEþµ`JµàF÷ °ÀåR5H‡‡Ä‡æ& ÷ îÿÀ ð ù5¬õ V5¬ ™Z¾�8Th>šdpâ)Pzì)p…€nÖ ƒ¥‡€ƒÀ ±‡ñ @,Áe÷× ±‡÷ àÿ†fæÿÿÁeÉ N,†Nvñ òvÖ �´ 1‡÷Šûøÿ÷ Ï J<šäpº0„"¾P(; Bx:<šäpF; BxNÌ8TTÌ8T\¾PjLšðynLšðypÌ8T€êõEF÷ 0µ JõEJ@JõeJõåF‡÷  @ßJµ Jõ F‡õ FÍ5×õ HÔ÷ Öý‡÷÷ ‡Ð Áe÷ ‡÷ & ÷ ÷ ÷ X¹«ÆŽn¹«ÆŽ€fÖ ±‡à à bà à à ö $B”÷ Pðf&ÄÌ Œ ‡´ †ãÂE€ÿBa & •& •Žå…åÌ‹î±Â•„…v ƒ`ȇ !A[$%././0:÷ dþ´ .Ì~KšÖ…:âõE ‚‡÷ Tþ4 õU ‚‡&÷ BþõU ‚ô õE ‚„‡‡KšÖ…*KšÖ…®T OŽÎ³z6&""OŽÎ³¯”D Ú¯àt ¬š©vuhš©wuhš©€uhš©xuh š©zuhš©}uhWš©{uh0š©yuh š©|uhAš©XuhRš© uh�š©žuhoš©¨uhš©Ðuhš©øuhš©Ÿuh‰š©Hvhš© vh¢¯ 0 ¯” 00+, 1gÚ¯àt€NO HELP AVAILABLEALPHABETIC REQUIREDNUMERIC REQUIREDALPHANUMERIC REQUIREDSIGNED NUMERIC REQUIREDNON-DISPLAYAB4|LE CHARACTERFULL FIELD REQUIREDINPUT REQUIRED|T OŽÎ³z6&w~OŽÎ³¯”D´:G@5¬ ™@ÌwËx@Lš´s@=�°'@¾�8T@ ~µr@r©š@ ~ô�@Lš‚ @”}V}@´:´s@BA�> @D�p…@ ô¯à� î@©öqh:@©írh½©¼whŒ¯” ô¯à�€æ& ƒ �÷ & & & & ææ& f& Εæææ ÿˆÞ Ö ƒ‡÷ ŽŸ÷ & & && æ&& f& Εæææ ÿˆÞ Ÿ<Š`r©š&=�°'*D�p….´:G ~ô� DLš‚ Jr©šRLš´s\Lš‚ fA�> jD�p…n´:´s ~µr zLš‚ ~Lš‚ v|À¥ ü• ¡‡÷ <<Šæƒ÷ & & & & ææ& f& Εæææ ÿˆÞ Ö ±‡&æ¦f¦ÄÞ �‚ƒ„– ‡8Lš‚ Lš‚ ‚”}V}$r©š @D�p…DÌwËxb5¬ ™f¾�8TÎT OŽÎ³z6&äfOŽÎ³¯”Ds©À�@´:G@=�°'@$9ÜY@ ~ô�@¹«�@$9Î…@D�p…@ ô¯à� Àr©šhн©Ryh ¯” ô¯à�€w ÃѰþBà Ã€ƒ †ƒ÷ f& & & & æ&& f& Εæææ ÿˆÞ À`Âàãá‹æ �÷ ,& & & & æf& f& Εææ.¹«�<=�°'@D�p…D´:G ~ô� x=�°'|D�p…H|æ ÿˆÞ Ö ‡f& & …¦Þ †×­W£æ1ÿˆÖ 𱎎¶…‡"´:G ~ô� $s©À�&$9Î…,$9ÜY¬T OŽÎ³z6&<OŽÎ³¯”D5¬!™@=�°'H<&%t@A�> HD�p…H þ¬NT€<šswH>šPHLš´sH >šdH >šŠrHz� ÀSHLš‚ H:šBxH>šø8HKšÖ…H‹ gHLšðyHKš<}H<šäpHþ¬:T€Ì8THº0„H¾PH; BxHþ¬8Tä"þ¬WT༹©Û๩௔ þ¬8T2´""> ¹©Û þ¬WT þ¬WT þ¬WT2 þ¬WT´ þ¬WT" þ¬WT"& þ¬WT&þ¬WT$ ¹© þ¬WT226 6DD ‚<&%t^^ tJJ" "ZZ&–&–œ œb'°°SY¼¼ÄT OŽÎ³J›'þvOŽÎ³¯”D ô¯à� L¹«žŽh¹«ÆŽh¹«�h,¯” ô¯à�Pf&¦‚Þ €�‚‡¦f&æƒÞ €�‚ƒ‡&æ¦f&f… Þ €�‚ƒ„…‡‚T OŽÎ³zì3þOŽÎ³¯”D&ÔZHÿÿ&ûf@&\g@&®s@&Ý@&<@& N@&x@&N`@&œ,@&Fy@&Ny@z&».@&,@&4d@ì3À¨@&³@&´p@&‰@&À@  ªþ ’ˆ(ð_hní'î~hÌú¨â.h(}hð(4}hzU(4}h&o'Ödh¨c'kMh„(à~he'€Wh–U(0h8´'a hº€(XahJŒ(` h€›&€%hì&a h`�&}h*�&.}h<�&4}hN&€sh"ö&0Mhrˆ(¶^h\(}hÞ¯”  ªþ €7 ÿÿ7 ÿÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿPì3À¨‚ &Àì3À¨*ì3À¨‚-&œ,<ì3À¨‚?&‰Nì3À¨‚Q&,`ì3À¨‚c&<rì3À¨‚u&».€‚ÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿVì3À¨‚ &³ì3À¨‚&®s,ì3À¨‚/&N`>ì3À¨‚A&<Pì3À¨‚S&ûfbì3À¨‚e&Ýtì3À¨‚w&\g€þÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 V ì3À¨‚ &4dì3À¨‚& N.ì3À¨‚1&´p@ì3À¨‚C&®sRì3À¨‚U&xdì3À¨‚g&Fyvì3À¨‚y&Nyzÿÿ7 ÿÿÿ ì3À¨À¨‚Q&,`ì3À¨‚c&<rì3À¨‚u&».€‚ÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿVì3À¨‚ &³ì3À¨‚&®s,ì3À¨‚/&N`>ì3À¨‚A&<Pì3À¨‚S&ûfbì3À¨‚e&Ýtì3À¨‚w&\g€þ<Á0ÀT 4  ù&)î00,óTADATADATADATADATADATADATADATADATA� ÀS%ü‹ g%ü; Bx%üº0„%ü¾P%üÌ8T%ü++^q+ €+Ç‹d‹k‹W‹œ‹‘.‹^q‹t…9?€9@€;ÓM>à8>î—DXHÌ8HÖKJÖKNt Xt ó.ó0ó) ó%óÀRóÕZóJwóýxË{Ô(KXYqªsOy*}dŒ|£&€s'l&,&‰&³&À&<&œ,&».& N&ÔZ'l&N`&4d&ûf&\g&´p&®s&x&®x&Fy&Ny&Ýc& c&îc&=c&c&ü%c&&c&b'c&d'c&½'c&](c&ˆ(c&À8c&>9c&X:c&y:c&¤:c&ª:c&vLc&ÞYc&{Zc&òyc&r†›&€%'l�&}'l�&.}'l�&4}'lì&a 'lö&0M'lc'kM'le'€W'lo'Öd'l´'a 'lí'î~'l(}'l(}'l(4}'l(à~'lU(4}'lU(0'l€(Xa'lˆ(¶^'lˆ(ð_'lŒ(` 'l“(s:“( z»(b »(DG»(²Z»(T[»(æf»(w»(Çw»(y»(Ry»([–»(—¹)Bx»)04¾)øWÁ)ÀSÄ)p!Æ)HÆ)H…Ê)è!Ê)BxË)øÌ)ˆrÎ) S;4S;²S;ËS;S;""S;ý2S;ð3S;ƒ:S; NS; RS;›YS;JwS;æwy<y<ãLz<òzOÛDOXJOH"=�°'%üA�> %üD�p…%ü:šBx%ü<šäp%ü<šsw%ü>šP%ü>šd%ü>šø8%ü>šŠr%üKš<}%üKšÖ…%üLš‚ %üLš´s%üLšðy%üú¨â.'l@©öq#²@©ír#²r©š%.š©Xu#š©vu#š©wu#š©xu#š©yu#š©zu#š©{u#š©|u#š©}u#š©€u#š©žu#š©Ÿu#š© u#š©¨u#š©Ðu#š©øu#š© v#š©Hv#´©€‰½©¼w#²½©Ry%.¹«žŽ'¨¹«ÆŽ'¨¹«�'¨þ¬„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ00,' 1g6&6&<%ü6&""#6&äf%.6&w~#²›'þv'¨ì3þ'lÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ*T OŽØ³z6&OŽØ³¯”Dc&òyHêÿc&y:Hëÿš©vu@š©€u@5¬ ™@š©zu@š©xu@š©wu@š©{u@c&X:HþÿS;ð3Hâ)sE@zc&r†HïÿS;Hš©yu@c&¤:Hüÿ»(b Hš©Xu@„¯½`@<šsw@š© u@š©Ðu@š©žu@š©¨u@>šd@š©øu@š©Ÿu@z>šP@c&ª:Hîÿš©Hv@æ)»@�±}s@|£H@»([–Hš© v@þ¬„H4¾�8T@>šŠr@KXH$9šø8@Õ±à@c&îHðÿh±²'@$9.…@zS;²Hc&d'Hõÿ‹œHc&=Hñÿc&b'HûÿªsH»(²ZHc&½'H÷ÿ¹«žŽ@»(æfHc&Hóÿ¹«ÆŽ@º0„@»(T[Hc&ˆ(HýÿzÔ(H¹«�@KšÖ…@‹t…HdŒH»(wH c&](Høÿæ)ÐW@ì)p…@S;""H@@©öq@»(ÇwHS;ƒ:H¾P@Lšðy@z‹‘.H@@©ír@»(yHóÀRH»(RyHä)²'@óJwH@å)Ps@ô' q@S;4H; Bx@Kš<}@ó.Hó0H™²`;@zS;›YH€‹^qHS;ËH+H<šäp@»(DGHlóýxHc&À8Húÿó%H€ó) H $95:@OyH +ÇHc&>9HíÿS;ý2Hz½©Ry@š©}u@š©|u@ ´© Ê)è!H¹)BxHÎ) H ¾)øWHÌ)ˆrHÆ)H…HÄ)p!H Æ)HH¡« »)04HzÁ)ÀSHË)øHÊ)BxH¾©&&ûfH&\gH &®sH&ÝH&<H& NH&xH&N`H&®xH$&œ,H&NyH"z&FyH &».H&,H&4dH &³H&´pH&‰H&ÀHÍ«“( zH“(s:H®ª$;ONHDOXH>OÛHzJOH"H¼©ûXt H JÖKH>î—HNt H HÌ8H>à8HDXH9@€H9?€H HÖKH;ÓMH 5ªDe†~<~<òHJˆ � Þ fv2 w ÷ þEuBµ µAÁe„uÁeOuõ%UU€õ•"w¨Me÷ �5 HZÄø n êL¬z4> � Þ f v"2 &¹«�€øÁ%&ƒù v÷ ö5 :ueý ý±‡÷Üÿÿ 5 ÀØ÷ ¦AÁeÂjŠ‚~õUU€õ‚÷ *BÂeXµPCÃeLòòv€t ÂeµVÃeòò ò•0 BCÃeÀ“”~ÍU÷ ÷ Ö÷ ÷ ÷ r÷ ÍE‡÷ ®÷ 6BÂe$À•R”~Á•÷ ŠD~€ð÷ ‚&÷ v�@�ŠÁÀ¥A- 5 BÍ5Â-àµB@mBAmBu #‚Ä À÷ ÜÀ ÷ Ôà� ÀU÷ À÷ ¾À÷ ¶E~÷ ÌNV lt€l÷ 50÷ ü‡÷Šöÿõ õP ‡÷ ä þÿwÎ÷ ÖÀ%ÿÿ@mB÷ ¾÷ Ä÷ æñ÷ Þ÷ $E~ë‡÷ ª ýÿw”@0À À €`÷ þC€èÃeÔõ2À`54Ãå ÷ ÔÄ `÷ š ÀEàÿÁ@t0 Á t0 ìÌ5ÂÁ÷  6ÍU& ‚ ÷ �Ä t0 Ì5æNíB­& €dÎEàÿ€% W @&÷ ¤„÷ Ý�&Dô5@ ÷ ä$�¤�D„¦ ÷ ‡K‹ sÁe‹~‚ ~Ö žÃeõ 4w˜‡÷Ä D4v¹«ÆŽ€à÷ ”÷ ŒÀ%ÿÿ56 9 (÷ æ‚ ÷ n„~fÄe &À•4~Œ÷ RÌ5 ÌUô5@ À÷ ¦ÀeÔ”P  ƒ~Š÷ ƒ €\ÃE‚ÂàµàÖ ‡Ï  Ò� ”B~‡÷Äe• ÕD`„~„ ÄEó5@ Ô ‡÷ †w¾ KmB3ô‡ÃeC-4‚±‡÷ ¦ üÿw$¹«ÆŽ€Ø�B6ƒ ÷ �À%ÿÿÀ÷ î‹ R�ÁR�Á÷ –�D~÷ Ò÷ †�D~ã÷ µ8‡À•0÷ ²‚ ‡C2õ 4QA8B Äô5@ €T÷ ˆ³` `÷ Vÿï†D4ô5@ +÷ ¬ÿÀ•÷ b÷ òþ Ì €Ô&�”f� Ä m÷ Öþ~€÷ 8C~À•�³ÄmÃeI~ ~Ö ÷ ªþ€Ð5!6̇ÍU÷ DÍE‡5`u-‡‡÷þÿ÷ ”  ÷  Á t ÷ <÷ 4‡÷ zÄô5@ &÷ Bþ‚2 üÿ„÷ €L÷ nþꆇ÷Âe �ÔB` �Ô÷ ê‡÷ .÷ 2@Ô÷ ÄÀ  @à÷ ÀB`÷ ¶ÿ÷ þ톇‡  ‡¦ Ò‹� ü‚‡÷ àÿ¹«ÆŽ€Èõ%UU€À÷ Du A ÷  ‡Ë¥* ÷ :0ðeð÷ €L=‚ ð 0 ÷ 1‡÷Öóÿ÷ hÄL=‚÷ €Dxýó‡÷‡÷ <÷ Þÿ÷ è ÷ î lÀ ô÷ Nñ‡1@÷ "B8° ° ‡Í5‡÷píÿ÷jôÿC2õ 4ø‡÷ ÜÿC@÷ xÿÄ€ÀL=‚wdÿ÷ tÀ  lÍ5ïC@ñ ÄÃïƒ ñ1ñe1 1‡÷ ~ð 0 ‡‚RÜR$ T  º  j W *d‚fRhÜjRl$ nT p rº t vj €<‚W †C@¥Ä&Á ù ž‡€L=‚õ@0ðeÂï‚ °‡÷ˆ ïÿ÷ : †ý¡‡·@2"Àeûć÷ àô5@   \¹«žŽ€¸÷ ‡÷F òÿ÷ ²û‡·& ÷ æÿ �ÜúÿÀÄL=‚ÃeH~Ž Ãƒlüÿ÷ Žÿ ‡÷  ÿ÷ Äÿ†‡÷ ”ÿ² üÿ²¬üÿûÿð ò üÿ�œûÿÁ "¹«žŽ€4 ÷ &÷ ÂÃC`÷ Lÿ€÷ ª÷ „ÿ¡‡w €þÿƒ`Ò”D~‡÷ >ÿò üÿð ò üÿ �œûÿ÷ &÷ r€÷ b÷ <ÿ¡‡w €þÿC`Â~Á ƒà&¹«�n¹«�€° £˜D~‡÷ îþæ¦÷ ÿ‡÷ žÿƒ‚ �ÜúÿÃeC~ÄL=‚ÃåøÃƒlüÿ÷ ˜þ¡–5‡w €Üúÿ‚œûÿÄ÷ žÃe~@‰~‡÷ „þ÷ V¹«�€, ‡w ÷ ŽþÃåõ 2 ‡ÄL=‚öö6 ‡÷ Tþ÷ ‡w ÷ ^þ �Üúÿ÷ úC~� D-6‚±L=‚ô66 ‡÷ þ° Ãh÷ òýð ÷ ¹«�8¹«�€¨ *þ†wêüB@Ê¢„ƒ÷ | û ø õ1‡w ÷ ÆýÃlüÿ÷ ¢ý÷ ‡w ¦œúÿ÷ ¦û €ÕfÎ �#�Nà÷ :B`÷ 0û<¹«�T¹«�€$ ÃeÄ~Ö ‡÷ vý°þÿ ‡C6Â"„ ‡Ä Á ÷ ˜†Ãe ÄÔa‹~Á ð0 Ãeð” ð ‡÷z ñÿ·÷ üD4r¹«žŽ€  Ñ ÷ R†÷ ÌøD-6ö‚ô5@ æ÷ üüƒ�üÿô5   ÂEàÿ� ‡Á C`÷  ü‡÷ õÿw À•”÷ „�B”÷ „  ~±‡`¹«�€ — a— zÂå ‡À• Ì5@À•0‡À¥!‚ 0‡À¥:‚ A‡w ÷ BÌ5 ÷ ²DV÷ ,ƒ„ Á ÀÌ5�”B~mB` ˜@¹«�€˜ B~÷ ‡÷÷ †ÿÁ�‚~‡÷Ì57Í5ô¥ ÁÑ¥ „~ÁeBÔ#@”÷ Pÿ‡…~À÷ r ÁÂe Ýô‹¹«ÆŽ$¹«ÆŽ€ €”÷ "ÿ‡@”÷ ÷ ¾ Í~÷ Ò ‡Ì5@À¥ � ‡f Šõ@÷ šÌ5 ÷ <÷ .É ü‡À ú ÷ –ÀE€�‡÷  BVfP„÷ ÷ þ€� Á%,!t-<„ïÁ%°Á%Є õ <00,7 1g„âÁ%Ô„#t-<À¥.åÉ À ×C@ÄÁ%„C@ÄÉ Ä&C@ÄÉ À „,°"Ð6Ô^„€ ½Ö Ö wNÿ÷Áe BÔ Ñ¥.€ …~APBV1 2� ÉUÉE€ ÊU@ÊE122àA‚ÉÊ&€ À `À1€e¹«ÆŽ€ˆ2‡Á'Á ÷  Q$É ûAÁ5óà W W ž W HÍ5W ˜Á‡·÷ ²h‡÷ Lý&ÁÍ5-Ì5÷ r'†m! W& '@©öq.4ž:HF˜LR¹«žŽ€Bí< q˜ƒ~‰�÷ œý÷ ,&  FB<C Qœƒ~‰�f:÷ vý€÷ Rt-<0Am<€� �÷ ÒýÌ5÷ ~÷ ÞÌ5€t-<Ì5€€»£÷ ò‡ö€ô5@ ÷ ´À%€6ÍUÖ ‡Ö ÷0Ì5 À 0ô5  P @‡÷ w À€ô5@ À€Ãåõ 2†:š©Xu^š©€ub¹«�€üñ5@ $ÄL=‚ñÀ%€ô5@ &÷ žøƒƒlüÿ÷ bø‹¯À€ö6 6¡‡÷–w ÷ ""‡À€ñ5@ À€÷ Lô†ñ5@Xš©¨u\¹«�€x ÄL=‚óþ¢À€ö6 6¡‡÷@ô5@ ÷ ȇ÷ tù‡À€‡÷ ô5@ ÷ ¨‡÷ „ù‡À€‡÷À €À€ô52š©ÐuRš©øurš© v€ô@ ÷ ~‡÷âÀ•÷ ±‡ ÷ à ÷ X‡À€‡·t-<÷ .‡÷ ‡÷žw B>‚ µ <t-< Äe Õ„`•÷ &š©Hv@©ír*@©öq>¹«žŽXš©vu\¹«�€pÌú†‚ úw B>õ <Äe Õ„`™÷ ¦ú†Â ú µ>ÂÀ€`÷ ê‡õ < õ <÷ ¬µ <‡÷ ²ÿ‡÷÷õ <E÷ PúÂBm< Í5¹«�bš©wuf¹«ÆŽ€ì#Ì5A<Á ²˜C~ �f:÷ ªú€÷ †%÷ R †Aí<’œC~ �÷ ˆú÷ HÿÌ5»÷ ,¸‡ �÷ 4ÿÌ5 f:÷ Üú÷ Ž€÷ :ÍU‡÷~€h÷Á�`! ƒ~B-<‡÷ ÷ Èù÷ ÍU‡ÀU€‡w Í5à ÍUÂe �ÔB` �ÔB` �Ô÷ 8¡‡ÍEf:fBAÁe*Bš©xu¹«ÆŽ"¹«ÆŽ<¹«�€äÀ•Ò¥ ~÷ NÍ5„÷ Ìî÷ ˆï÷ ÂÍU ÷ Ö÷ vûÁ%žßÉ ù‡À ô€µBÍEAÁe÷ ,Ö €÷ X‡÷ w f:AÁe$ ÷ €÷ :žfš©yuj¹«�€`6‡÷ fî÷ "ï÷ \Í5õ 0 ÍUC2Ä÷ *ù÷ .ñù†ÍE‡w   Ì5ÍE5 <ÄeÕ•÷ ‚ø†‚ úÍU5<ÄeÕ„`™÷ bø>¹«�€Ü†Â úB<w¶ýÀ÷ *u� :u� ;÷ þ‡w f:Á Í5 ÷ ÍE ÷ €”÷ ÀD~ÍU €÷ b‡À÷ Ü5 :‡AÐC9ü.¹«�brÐx~ü€XN*Xnn·÷ ¼÷ÁAm<  ¡ÍU€÷ ÍE€‡÷ÂFô5 Ê Ò ´4 Ò øÁeÑ‹Am>Ê ‰¢Âeù’$ú ‡÷ *nn¹«žŽ<¹«ÆŽ@F€Ô‡‡÷    A‡À¥Z† a‡À%z‡÷ ‡‡÷Þ 0‡À¥9‡÷ ðÿ†÷ ¾ÿ‡‡÷¾÷ÁÃ- + Ã+ -  . š©zu8š©{uXš©|u\¹«ÆŽ€P   Ñ …~¡÷ ¦ÿ‡‡÷z  ‡÷l÷÷ ªöÁ  ƒ „~Ì5à Ì5à ô ¡‡÷.÷(·C2Ä& š©}u.š©žu2¹«ÆŽlš©Ÿurš© uv¹«žŽ€ÌL=‚÷ ¦ÿ‡Â÷ àîô†ƒ¡‡Í5€ f¦Â÷ ¾ð÷ þ÷ û‚�ƒ±‡ý÷ ¼Ó ƒF5 :÷ Þue±‡w õ%UU€À÷ ÜÂ÷ nðÍU f¹«�r€H@÷ ¶ý÷ ´ú ÷ ’ý÷ 2øÁ%ÁÉ ÷‡‡5 :&À#÷  €“Àe÷ d€�Àe÷ Xµ:‡÷ Ðÿ÷ `‡w  ÀådÀ•1÷ 0‚ CÁå  2#`¹«�€Ä€ ú À Àe0÷ ÀÀe0÷ ‡µŠ;ÀŒŒ=�µ u- ‡@Àe„5 ý•€5÷ ‡f@”ÀŒ€ ÷ ¾ÿù�‡÷ ˜B’÷ X½©Ry€@Úô‘�ú      BÃÉ‹ W¢]W¤:øÁ ƒ ƒ � à à mK“à‹É‹èÁ÷ F&&†p�Áe÷ ‡ð•÷ †D <šswB<šswP$9è'^ì)p…dæ)ÐWh<šswlä)²'p�±}svô' qxæ)»|h±²'€¼Á5ÿW SW PW M÷*þýÿ Br÷þüÿ55÷ (f1A€%æ& ‚pp¦°Îe°÷ '‡Zå)Ps$9šŠrJ¾PN¾PRº0„bâ)sEhâ)sEpâ)2Hxâ)2H|Õ±à€8÷ $‡–%É%b' ÷ ÷ ¾1 ÷²ýûÿ‡÷ z‡÷ ¨‡1 ÷ ‡‡Br÷Šýúÿ÷„ýùÿA1÷týîÿ÷ný÷ÿw ÷ *AHCÁà†2™²`;„¯½`¾P4¾P8„¯½`XKš<}j¹«�r>šP€´CHæÃeÃEfDŽ & ‚pð¦°Îe°÷ ͇÷ ʇ–%‚µFuJŠÂ‚ µ`D‡w ÷ ºÍE¦)€÷ ¨º‡BÊ "6 â)sE$â)sE,â)2H4â)2H8Õ±à>™²`;^¹«�t>šø8€0,Áeõ‚’$µFõåFµJ–%‡÷ ~4�‡÷ ŒþC-†ÃåC`AlÁeC ‰†‰"±,Áeõ–%uDõÿÿH÷ ôþÍU0>šP>:šBxD:šBx€¬BÂEþµ`JµàF÷ °ÀåR5H‡‡Ä‡æ& ÷ îÿÀ ð ù5¬õÖ ƒ¥‡€ƒÀ ±‡ñ @,Áe÷× ±‡8(5¬ ™,¾�8T:>šdBâ)PLì)p…f<šäpjº00,?óTADATADATADATADATADATADATADATADATA0„p¾Pv; Bx€(÷ àÿ†fæÿÿÁeÉ N,†Nvñ òvÖ �´ 1‡÷šûøÿ÷ Ï õEF÷ 0µ JõEJ@JõeJõåF‡÷  @ß2 <šäp; Bx Ì8T&Ì8T.¾P @D�p…@ ô¯à� î@©öqh:@©írh½©¼whŒ¯” ô¯à�€æ& ƒ �÷ & & & & ææ& f& Εæææ ÿˆÞ Ö ƒ‡÷ ŽŸ÷ & & && æ&& f& Εæææ ÿˆÞ Ÿ<Š`r©š&=�°'*D�p….´:G ~ô� DLš‚ Jr©šRLš´s\Lš‚ fA�> jD�p…n´:´s ~µr zLš‚ ~Lš‚ v|À¥ ü• ¡‡÷ <<Šæƒ÷ & & & & ææ& f& Εæææ ÿˆÞ Ö ±‡&æ¦f¦ÄÞ �‚ƒ„– ‡8Lš‚ Lš‚ ‚”}V}$r©š @D�p…DÌwËxb5¬ ™f¾�8TÎT OŽÎ³z6&äfOŽÎ³¯”Ds©À�@´:G@=�°'@$9ÜY@ ~ô�@¹«�@$9Î…@D�p…@ ô¯à� Àr©šhн©Ryh ¯” ô¯à�€w ÃѰþBà Ã€ƒ †ƒ÷ f& & & & æ&& f& Εæææ ÿˆÞ À`Âàãá‹æ �÷ ,& & & & æf& f& Εææ.¹«�<=�°'@D�p…D´:G ~ô� x=�°'|D�p…H|æ ÿˆÞ Ö ‡f& & …¦Þ †×­W£æ1ÿˆÖ 𱎎¶…‡"´:G ~ô� $s©À�&$9Î…,$9ÜY¬T OŽÎ³z6&<OŽÎ³¯”D5¬!™@=�°'H<&%t@A�> HD�p…H þ¬NT€<šswH>šPHLš´sH >šdH >šŠrHz� ÀSHLš‚ H:šBxH>šø8HKšÖ…H‹ gHLšðyHKš<}H<šäpHþ¬:T€Ì8THº0„H¾PH; BxHþ¬8Tä"þ¬WT༹©Û๩௔ þ¬8T2´""> ¹©Û þ¬WT þ¬WT þ¬WT2 þ¬WT´ þ¬WT" þ¬WT"& þ¬WT&þ¬WT$ ¹© þ¬WT226 6DD ‚<&%t^^ tJJ" "ZZ&–&–œ œb'°°SY¼¼ÄT OŽÎ³J›'þvOŽÎ³¯”D ô¯à� L¹«žŽh¹«ÆŽh¹«�h,¯” ô¯à�Pf&¦‚Þ €�‚‡¦f&æƒÞ €�‚ƒ‡&æ¦f&f… Þ €�‚ƒ„…‡‚T OŽÎ³zì3þOŽÎ³¯”D&ÔZHÿÿ&ûf@&\g@&®s@&Ý@&<@& N@&x@&N`@&œ,@&Fy@&Ny@z&».@&,@&4d@ì3À¨@&³@&´p@&‰@&À@  ªþ ’ˆ(ð_hní'î~hÌú¨â.h(}hð(4}hzU(4}h&o'Ödh¨c'kMh„(à~he'€Wh–U(0h8´'a hº€(XahJŒ(` h€›&€%hì&a h`�&}h*�&.}h<�&4}hN&€sh"ö&0Mhrˆ(¶^h\(}hÞ¯”  ªþ €7 ÿÿ7 ÿÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿPì3À¨‚ &Àì3À¨*ì3À¨‚-&œ,<ì3À¨‚?&‰Nì3À¨‚Q&,`ì3À¨‚c&<rì3À¨‚u&».€‚ÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿVì3À¨‚ &³ì3À¨‚&®s,ì3À¨‚/&N`>ì3À¨‚A&<Pì3À¨‚S&ûfbì3À¨‚e&Ýtì3À¨‚w&\g€þÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 ÿÿ7 V ì3À¨‚ &4dì3À¨‚& N.ì3À¨‚1&´p@ì3À¨‚C&®sRì3À¨‚U&xdì3À¨‚g&Fyvì3À¨‚y&Nyzÿÿ7 ÿÿÿ ì3À¨À¨‚Q&,`ì3À¨‚c&00-G 1g<Á0ÀR    ùÈ.8� ÀS)¨‹ g)¨; Bx)¨º0„)¨¾P)¨Ì8T)¨++^q+ €+Ç‹d‹k‹W‹œ‹‘.‹^q‹t…9?€9@€;ÓM>à8>î—DXHÌ8HÖKJÖKNt Xt ó.ó0ó) ó%óÀRóÕZóJwóýxË{Ô(KXYqªsOy*}dŒ|£&€s,X&,&‰&³&À&<&œ,&».& N&ÔZ,X&N`&4d&ûf&\g&´p&®s&x&®x&Fy&Ny&Ýc& c&îc&=c&c&ü%c&&c&b'c&d'c&½'c&](c&ˆ(c&À8c&>9c&X:c&y:c&¤:c&ª:c&vLc&ÞYc&{Zc&òyc&r†›&€%,X�&},X�&.},X�&4},Xì&a ,Xö&0M,Xc'kM,Xe'€W,Xo'Öd,X´'a ,Xí'î~,X(},X(},X(4},X(à~,XU(4},XU(0,X€(Xa,Xˆ(¶^,Xˆ(ð_,XŒ(` ,X“(s:“( z»(b »(DG»(²Z»(T[»(æf»(w»(Çw»(y»(Ry»([–»(—¹)Bx»)04¾)øWÁ)ÀSÄ)p!Æ)HÆ)H…Ê)è!Ê)BxË)øÌ)ˆrÎ) S;4S;²S;ËS;S;""S;ý2S;ð3S;ƒ:S; NS; RS;›YS;JwS;æwy<y<ãLz<òzOÛDOXJOH"=�°')¨A�> )¨D�p…)¨:šBx)¨<šäp)¨>š�)¨>šP)¨>šd)¨>šø8)¨>šŠr)¨Jš�)¨Kš<})¨KšÖ…)¨Lš‚ )¨Lš´s)¨Lšðy)¨ú¨â.,X@©öq'ü@©ír'ür©š(²š©Xu&0š©vu&0š©wu&0š©xu&0š©yu&0š©zu&0š©{u&0š©|u&0š©}u&0š©€u&0š©žu&0š©Ÿu&0š© u&0š©¨u&0š©Ðu&0š©øu&0š© v&0š©Hv&0´©€‰½©¼w'ü½©Ry(²¹«žŽ+й«ÆŽ+й«�+Šþ¬„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ00-OóTADATADATADATADATADATADATADATADATAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ6&6&<)¨6&""&06&äf(²6&w~'ü›'þv+Šì3þ,Xÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ01R OŽÎ³*6&OŽÎ³¯”L bø@c&òyHêÿ*c&y:Hëÿš©vu@š©€u@5¬ ™@š©zu@*š©xu@š©wu@š©{u@c&X:HþÿS;ð3H*c&r†HïÿS;Hš©yu@c&¤:Hüÿ�«Iq@*»(b Hš©Xu@bè&@š© u@š©Ðu@*š©žu@š©¨u@>šd@š©øu@š©Ÿu@*>šP@c&ª:Hîÿš©Hv@|£H@»([–H*š© v@þ¬„Hd¾�8T@>šŠr@KXH*+^qHS; NH c&vLHöÿS; RH»(—H*úaàG@*}H€c& Hìÿ:šBx@ËH *‹WH ‹dH‹kHþa@`@ b@`@*YqHc&ü%Hÿÿc&ÞYHôÿS;JwHc&&Hùÿ*Ì8T@+ €H{HS;æwHóÕZH*c&{ZHòÿˆšø8@c&îHðÿS;²H*c&d'Hõÿ‹œHc&=Hñÿc&b'HûÿªsH*>š�@Jš�@»(²ZHc&½'H÷ÿ¹«žŽ@*»(æfHc&Hóÿ¹«ÆŽ@º0„@»(T[H*c&ˆ(HýÿÔ(H¹«�@KšÖ…@+"ZŠ@*‹t…Hb(x@dŒH»(wH c&](Høÿ*S;""H@@©öq@»(ÇwHS;ƒ:Hþa¨W@*+"iK@�«E`@Lšðy@¾P@+"€K@*‹‘.H@�«¯@@©ír@»(yHóÀRH*»(RyH�«&@óJwH@b@S;4H* bÐz@; Bx@þaxZ@Kš<}@ó.H*ó0HS;›YH€+"Þ@‹^qH+"z@*S;ËH+H<šäp@»(DGHlóýxH*c&À8Húÿó%H€ó) H OyH +ÇH*c&>9HíÿS;ý2H½©Ry@ bp @+"½'@*š©}u@š©|u@(´© Ê)è!H*¹)BxHÎ) H ¾)øWHÌ)ˆrHÆ)H…H*Ä)p!H Æ)HH¡« »)04HÁ)ÀSH*Ë)øHÊ)BxH¾©&ûfH&\gH *&®sH&ÝH&<H& NH&xH*&N`H&®xH$&œ,H&NyH"&FyH *&».H&,H&00-W 1g4dH &³H&´pH*&‰H&ÀHÍ«“( zH“(s:H*®ª$;ONHDOXH>OÛHJOH"H*¼©ûXt H JÖKH>î—HNt H *HÌ8H>à8HDXH9@€H9?€H *HÖKH;ÓMH 5ªDe~<~<òHJˆ5 Á%&ƒù ª(ª*: ÷ ö ÷ R5 :ueý ý±*`‡÷(ÿÿ 5 ÀØ÷ AÁeÂjŠ‚~*†õUU€õ‚÷ ÒBÂeXµPCÃeLòò*¬ ÂeµVÃeòò ò•0 B*ÒCÃeÀ“”~ÍU÷ ÷ 0÷ j÷ *øj÷ Ð÷ ®ÍE‡õ õ•÷ ØBÂe$*À•R”~Á•÷ *D~÷ "&÷ �@�ŠÁ*DÀ¥A- 5 BÍ5ÂJàµB@m*jBAmBu @‚Ä À÷ 0 à� ÀU÷ h*�À÷ E~÷ õ•ÿ ÷ Œ BJ‚Â5*¶Â5À6õ„ À0õP ÷ ÜÀFÂ5 60&F*ÜÀ@÷ Ê÷ f50÷ b‡÷”öÿ ÷  @(@©öq* 0 ‡ 9 ‚fÁ Á �eÁ Àå0`ï‡÷ 2 *(þÿw÷ $À%ÿÿ@mB÷ ¶÷ ÷ ì ÷ 0*Nï÷ (÷ "E~é‡÷ ô ýÿwÞ@0À *tÀ €`÷ þCÃeÔõ2À`54Ãå ÷ ÔÄ *š`÷ š ÀEàÿÁ@t0 Á t0 ìÌ5*ÀÂÁ÷  6ÍU& ‚ ÷ �Ä t0 *æÌ5æNíB­& ÎEàÿ€% W @&* ÷ ¤„÷ Ý�&Dô5@ ÷ ä$�¤�*2D„¦ ÷ ‡K‹ sÁe‹~‚ ~*XÖ žÃeõ 4wâ‡÷Ä D4÷ ”¹«ÆŽ*~÷ ÖÀ%ÿÿ56 9 (÷ æ‚ ÷ ¸„~*¤fÄe &À•4~Œ÷ œÌ5 ÌUô5@*Ê À÷ ¦ÀeÔ”P  ƒ~Š÷ *ðƒ ÃE‚ÂàµàÖ ‡Ï  Ò� ”B~‡÷(¹«ÆŽ*Äe• ÕD`„~„ ÄEó5@ Ô ‡÷ *<†w KmB3ô‡ÃeC-4‚±*b‡÷ ð üÿwÚB6ƒ ÷ ÚÀ%ÿÿÀ*ˆ÷ î‹ R�ÁR�Á÷ à�D~÷ Ò÷ Ð*®�D~ã÷ µ8‡À•0÷ ²‚ ‡C2õ *Ô4QA8B Äô5@ ÷ ˆ³`*ú `÷ Vÿï†D4ô5@ +÷ ¬ÿÀ•÷ b÷ òþ*  Ì €Ô&�”f� Ä m÷ Öþ~€÷ 8C~*FÀ•�³ÄmÃeI~ ~Ö ÷ ªþ5!6*l̇ÍU÷ DÍE‡5`u-‡‡÷þÿ÷ *’Ø  ÷  Á t ÷ €÷ 4*¸‡÷ zÄô5@ &÷ Bþ‚2 üÿ*Þ„÷ ÷ nþꆇ÷Âe �ÔB` �Ô÷ .¹«ÆŽ*‡÷ .÷ 2@Ô÷ ÄÀ  @à**÷ B`÷ ¶ÿ÷ þ톇‡  ‡¦ *PÒ‹� ü‚‡÷ àÿõ%UU€À÷ Bu *vA ÷ ø ‡Ë¥* ÷ :0ðe*œð÷ ÄL=‚ ð 0 ÷ Ø1*‡÷Äóÿ÷ hÄL=‚÷ xýó‡÷‡÷ <*è÷ Þÿ÷ ¦ ÷ ´  lÀ ô÷ <ñ‡1*@÷ "B8° ° ‡Í5‡÷^íÿ÷*4XôÿC2õ 4ø‡÷ ÜÿC@÷ xÿÄL=*Z‚wdÿ÷ 2À  lÍ5ïC@ñ *€ÄÃïƒ ñ1ñe1 1‡*¦÷ Âð 0 ‡ °:° 0   „ ¬  * °:°  0 "  $„ &¬ ( *ÌW ‚W †C@¥Ä&Á ù ¸ž‡€$¸*òL=‚õ@0ðeÂï‚ °‡÷v* ïÿ÷ (†ý¡‡·@2"Àeû¹«žŽ*> ć÷ $ô5@ ÷ ‡÷4òÿ÷ ²û*d ‡·& ÷ æÿ �ÜúÿÀÄL=‚Ãe¹«žŽ*Š H~Ž Ãƒlüÿ÷ Žÿ ‡÷  ÿ÷ Äÿ†‡÷ ”ÿ*° ² üÿ²¬üÿûÿð ò üÿ�œûÿÁ ÷ 4&À@`*Ö Á’À�÷ ôÀ÷ ÀL÷ Ä÷ Ø÷ 4ÿ€÷ ÖL*ü ÷ lÿ¡‡w €þÿƒ`Ò”D~‡÷ &ÿò üÿ¹«�*" ð ò üÿ�œûÿ÷ .&À’@`À Á’÷ Ž00-_óTADATADATADATADATADATADATADATADATAÀ*H ÷ ¬ ÀO÷ ^÷ r€÷ t÷ ÿ¡‡w €þÿ  O$¹«�*n C`Â~Á ƒà£˜D~‡÷ ¼þæ¦÷ Üþ‡÷ *” „ÿƒ‚ �ÜúÿÃeC~ÄL=‚Ãåø*º Ãlüÿ÷ fþ¡–5‡Á@ € &À-÷ Ô @"-*à ÷ T À•;÷ ” €÷ F À•r÷ † 5 :‡÷ @þ÷ * ‡w ÷ JþÃåõ 2 ‡ÄL=‚öö6 ¹«�*, ‡÷ þ÷ ‡w ÷ þ �Üúÿ÷ ÆùC~� D-¹«�*R 6‚±L=‚ô66 ‡÷ Ôý° Ãh*x ÷ ®ýð ÷ æý†w¦üB@Ê¢„ƒ*ž ÷ ö û ø õ1‡w ÷ ‚ýÃ"¹«�*Ä ƒlüÿ÷ ^ý÷ ‡w ¦œúÿ÷ bû €ÕfÎ ¹«�*ê �#�Nà÷ :B`÷ ìúÃeÄ~Ö ‡÷ * 2ý°þÿ ‡C6Â"„ ‡Ä *6 Á ÷ ˜†Ãe ÄÔa‹~Á ð0 Ãe*\ ð” ð ‡÷$ ñÿ·÷ ÄûD4Ñ ÷ ¹«žŽ*‚ R†÷ ˆøD-6ö‚ô5@ æ÷ ¸üƒ�*¨ üÿô5   ÂEàÿ� ‡Á C`÷ \ü*Î ‡÷º õÿw À•”÷ „�B”÷ „  ~¹«�*ô ±‡— a— zÂå ‡À• Ì5@À•0‡* À¥!‚ 0‡À¥:‚ A‡w ÷ BÌ5 ¹«�*@ ÷ 4DV÷ ,ƒ„ Á ÀÌ5*f �”B~mB` ˜B~÷ ‡÷÷ †ÿÁ¹«ÆŽ*Œ �‚~‡÷Ì5>Í5ô¥ ô‹ Á ¹«ÆŽ*² Ñ¥ „~ÁeBÔ'@”÷ Jÿ‡…~!�*Ø ÷ XÀ÷  ÁÂe Ýô‹*þ €”÷ ÿ‡@”÷ ÷ j Í~÷ ~ ‡Ì5@À¥ *$� ‡1457÷5 +5��À•¹«ÆŽ*Jõ@À•÷ ( À-÷ R Á,À•0÷  À•; -,*pB”C´ü÷  €�ôÀ•m÷ ø õÀ<÷  $<*–‡f Šõ@÷ ¸ � ÷ †ÿÌ5 ÷ R÷ *¼.É ü‡À ú ÷ ¬ÀE€�‡÷  BVfP„*â÷ "÷ þÁ%Š!t-<„ïÁ% Š(*Á%.„ õ <„âÁ%2„#t-< .2*.À¥.åÉ À ×C@ÄÁ%æC@Äæ*TÉ Ä&C@ÄÉ À „½Ö Ö wNÿ÷*zÁe BÔ Ñ¥.€ …~APBV1 ¹«ÆŽ* 2� ÉUÉE€ ÊU@ÊE122à*ÆA‚ÉÊ&€ À `À1€e2‡*ìÁSÁ ÷  Q$É ûAÁ5óà W pS @©öq(p*W  W ªÍ5W úÁd‡·÷ ªú d&¹«žŽ*8Úh‡÷ Êü&ÁÍ5-Ì5÷ r'†m! *^WBí< q˜ƒ~‰�÷ ý÷ ,&  FB*„<C Qœƒ~‰�f:÷ ôü€÷ Št-<*ª0Am<€� �÷ ^ýÌ5÷ ¶÷ ÞÌ5€*Ðt-<Ì5»£÷ ‡ö€ô5@ *ö÷ ´À%€6ÍUÖ ‡Ö ÷XÌ5 "š©Xu*À 0ô5  P @‡÷4w À š©€u$¹«�*B€ô5@ À€Ãåõ 2†ñ5@ $Ä*hL=‚ñÀ%€ô5@ &÷ Ø÷ƒƒlüÿ÷ œ÷*Ž‹¯À€ö6 6¡‡÷¾w $š©¨u(¹«�*´÷ J"‡À€ñ5@ À€÷ †ó†ñ5@ *ÚÄL=‚óþ¢À€ö6 6¡‡*÷hô5@ ÷ ð‡÷ òø‡À€‡÷Hš©Ðu(š©øu*&ô5@ ÷ Ї÷ ù‡À€‡÷(À €"š© v*LÀ€ô5@ ÷ ¦‡÷ À•÷ ±‡ š©Hv"@©ír*r ÷ à ÷ €‡À€‡·t-<÷  @©öq¹«žŽ*˜V‡÷ ‡÷Æw B>‚ µ <t-< š©vu¹«�*¾Äe Õ„`•÷ Jú†‚ úw B>õ < ¹«�*äÄe Õ„`™÷ $ú†Â ú µ>ÂÀ€`÷ * "‡õ < õ <÷ Ôµ <‡÷ ²ÿ‡÷@÷&š©wu*0õ <E÷ ÎùÂBm< Í5#Ì5A<¹«ÆŽ*VÁ ²˜C~ �f:÷ (ú€÷ ¾%÷ R †*|Aí<’œC~ �÷ ú÷ HÿÌ5»÷ ,¸‡ �÷ *¢4ÿÌ5 f:÷ hú÷ Æ€÷ rÍU‡÷¦(š©xu*È÷Á�`! ƒ~B-<†±‡÷ ÷ ¹«ÆŽ$¹«ÆŽ*îBù÷ ÍU‡ÀU€‡w Í5à ÍU¹«�*Âe �ÔB` �ÔB` �Ô÷ J¡‡ÍEf:*:fBAÁe*BÀ•Ò¥ ~÷ NÍ5„*`÷ ¤í÷ ºî÷ DÍU ÷ è÷ rûÁ%ßÉ ù‡À  *†ô€µBÍEAÁe÷ ,Ö €÷ Œ‡÷Äw &š©yu*¬f:AÁe$ ÷ €÷ j‡÷ >í÷ Tî÷ Þ¹«�*ÒÍ5õ 0ÍUC2Ä÷ ¤ø÷ dðù†ÍE*øC@Ä� ÷ ,ù‡w   Ì5ÍE¹«�*5 <ÄeÕ•÷ ê÷†‚ úÍU5<Äe*DÕ„`™÷ Ê÷†Â úB<w ýÀ!÷ Lu�  !*j:u� ;÷ ‡w f:Á Í5 ÷ 0ÍE¹«�*� ÷ &f�@�÷ ’ø€”÷ ÖD~€•÷ „øÍU *¶€÷ r‡À ÷ ì5 :‡AVCœ9 V$œ*Ü‚N°Xôô·÷ ÷ÁAm<  ‚ °ôô¹«žŽ*¡ÍU€÷ ÍE€‡÷ÂÌô5 Ê  ¹«ÆŽÌ*(Ò ´4 Ò øÁeÑ‹Am>Ê ‰¢Âeù*N’$00-g 1gú ‡÷ ‡‡÷    A‡À¥Zš©zu*t† a‡À%z‡÷ ‡‡÷Þ 0‡À¥9š©{u*š‡÷ ðÿ†÷ ¾ÿ‡‡÷¾÷ÁÃ-š©|u¹«ÆŽ*À + Ã+ -  .   Ñ …~¡*æ÷ ¦ÿ‡‡÷z  ‡÷l÷÷ öÁš©}uš©žu"¹«ÆŽ*   ƒ „~Ì5à Ì5à ô *2¡‡÷.÷(·C2ÄL=‚š©Ÿuš© u¹«žŽ*X÷ ¦ÿ‡Â÷ òíô†ƒ¡‡Í5€ f¦Â÷ Ðï÷ *~øý÷ àú‚�ƒ±‡ý÷ Ó ƒF5 :*¤ ÷ Œö÷ èue±‡w õ%UU€À÷ ¹«�&*ÊæÂ÷ zïÍU@÷ žý÷ †ú ÷ zý÷ øÁ%pÁ$p*ðdÉ ÷‡‡5 :&À-÷ ª€“÷ *À•;÷ j d-* €Ý÷ À•H÷ Xµ:‡÷ Æÿ÷ `‡w (¹«�*< ÀådÀ•1÷ 0‚ CÁå € ú *bÀ Àe0÷ ÀÀe0÷ ‡µŠ;ÀŒŒ=�*ˆµ u- ‡@Àe„5 ý•€5÷ *®‡f@”ÀŒ€ ÷ ¾ÿù�‡÷ æB’½©Ry*Ô÷ ô‘�úÁ÷ Ô  †÷ ¢ †?�÷”þ+"iK*úýÿ Br÷„þüÿ55÷ îf:šBx>šŠr(¾P* 1A€% & æ‚C÷ *$‡–%É%b' ¾P º0„*F÷ ê÷  1 ÷8þûÿ‡÷ ^‡÷ Ї1 ÷ ¾P&¾P*lÆ ‡‡Br÷þúÿ÷ þùÿA1÷$Kš<}*’úýîÿ÷ôý÷ÿw ÷ AHCÁà†CH¹«�>šP*¸æÃeÃEA& fDŽ ‚÷ ’؇–%‚µF*ÞuJŠÂ‚ µ`D‡w ÷ ºÍE¦)€÷ ¦¹«�*ȇBÊ ",Áeõ‚’$µF>šø8**õåFµJ–%‡÷ ~4ž‡÷ ÄþC->šP(:šBx*P†ÃåC`AlÁeC —†‰"±,Áe:šBx*võ–%uDõÿÿH÷ ÿÍUBÂEþµ`J*œµàF÷ ®ÀåQ5H‡‡Ä‡æ& ÷ 5¬ ™ ¾�8T*ÂîÿÀ ð ù5¢öÖ ƒ¥‡€ƒ>šd*èÀ ±‡ñ @,Áe÷× ±‡÷ àÿ <šäpº0„¾P; Bx*†fæÿÿÁeÉ N,†Nvñ <šäp; BxÌ8T"Ì8T*4òvÖ �´ 1‡÷>üøÿ÷ Ï õE¾PLšðyLšðyÌ8T*ZF÷ 0µ JõEJ@JõeJõåF‡÷ *€ @ßJµ Jõ F‡õ FÍ5×õ HÔ÷ *¦ôý‡÷÷ ‡Ð Áe÷ ‡÷ & ÷  ¹«ÆŽ ¹«ÆŽ*Ì÷ ÷ Ö ±‡à à bà à à ö $B”*ò÷ ñf&Ä: Œ ‡´ †ãÂE€ÿBa & :*•& •Žå…åÌ‹î±Â•„…v ƒ`ȇ !A[*>$%././0:÷ fþ´õE ‚‡÷ Vþ4 õU KšÖ…$KšÖ…*d‚‡&÷ DþõU ‚ô õE ‚„‡‡KšÖ…&+"z(+"Þ(ŠƒÓ‹þà ƒà0 0 ±ñ�&+"½'+"ZŠ+"iK +"€K>š�$þa¨W*®H1’1 ffæ…÷ Æe…A þaxZ bþa@`�«E`( bø*Ԁ†�$ �$�$�$�$�$±¨‡¤†*ú¹‡°3 fææ…÷ Æe  >š�bè&Jš� b@`&�«&* …¡Áã�ð‡22 0   bøb(x>š� bè&$þa@`*Ff¦æ…÷ Æe…¡�€±‡·&�«¯ bø&¹«žŽ*l&°p°°ðf&æ( Jš�b(x bp úaàGúaàG bÐz"’…÷ Æe…¡<€±€– ‡�«Iq bøKš<}ÌR OŽÎ³*6&""OŽÎ³¯”L(Ú¯àt¨¬*š©vuhš©wuhš©€uhš©xuh š©zuh*š©}uhWš©{uh0š©yuh š©|uhAš©Xuh*š© uh�š©žuhoš©¨uhš©Ðuhš©øuh*š©Ÿuh‰š©Hvhš© vh¢¯ 0¨¯” Ú¯àt*NO HELP AVAILABLEALPHABETIC*& REQUIREDNUMERIC REQUIREDALPHANUMERI*LC REQUIREDSIGNED NUMERIC REQUIREDNON*r-DISPLAYABLE CHARACTERFULL FIELD REQU˜IREDINPUT REQUIRED¶R OŽÎ³*6&w~OŽÎ³¯”L´:G@5¬ ™@*ÌwËx@Lš´s@=�°'@¾�8T@ ~µr@*r©š@ ~ô�@Lš‚ @”}V}@´:´s@*A�> @D�p…@(ô¯à�(î@©öqh:@©írh½©¼whŒ¯” ô¯à�*æ& ƒ �÷ & & & & ææ& f& Εær©š&=�°'*&ææ ÿˆÞ Ö ƒ‡÷ ŽŸ÷ & & "D�p…´:G ~ô� Lš‚ $r©š*L&& æ&& f& Εæææ ÿˆ(Lš´sLš‚ A�> D�p…"´:´s ~µr *rÞ Ÿ<ŠÀ¥ ü• ¡‡÷ <<Šæ Lš‚  Lš‚ Lš‚ $Lš‚ ‚(”}V}*˜ƒ÷ & & & & ææ& f& Εæær©š A�> $D�p…(ÌwËx*¾æ ÿˆÞ Ö ±‡&æ¦f¦ÄÞ � 5¬ ™$¾�8T䂃„– ‡öR OŽÎ³*6&äfOŽÎ³¯”Ls©À�@´:G@*=�°'@$9ÜY00-o.uTADATADATADATADATADATADATADATADATA@ ~ô�@¹«�@$9Î…@*D�p…@(ô¯à�(Àr©šhн©Ryh ¯” ô¯à�*w ÃѰþBà Ã€ƒ †ƒ÷ f& ¹«�*&& & & æ&& f& Εæææ ÿˆÞ À`=�°'D�p…´:G ~ô� *LÂàãá‹æ �÷ ,& & & & æf& f& *rΕæææ ÿˆÞ Ö ‡f& & …¦Þ =�°' D�p…´:G ~ô� *˜ †×­W£æ1ÿˆÖ 𱎎¶…s©À� $9Î…$9ÜY¾‡âR OŽÎ³*6&<OŽÎ³¯”L5¬!™@=�°'H*�«)x@G©]\@i©�{@A�> H(«$@*D�p…HD©�b@(þ¬NTˆ>šPH*Lš´sH >šdH >šŠrH� ÀSHLš‚ H*:šBxH>šø8H>š�HJš�HKšÖ…H*‹ gHLšðyHKš<}H<šäpHþ¬:Tˆ*Ì8THº0„H¾PH; BxHþ¬8Tì*þ¬WTèÞ¹©Ûè¹©è ­WTì"�«·{è"�«»{è0�«¹{è ­YT诔 þ¬8T$Ö* ¹©Û þ¬WT þ¬WT þ¬WT$ þ¬WTÖ "" þ¬WT" þ¬WT" .~ þ¬WT. þ¬WT~þ¬WT$ ¹© þ¬WT$$(P (>>"8 8TTÎ Î~%~P   . .Î ÎSY:.FLB  ­WT («$ D©�b G©]\  i©�{þ¬WTÖ ÖÞÞÎR OŽÎ³*›'þvOŽÎ³¯”L(ô¯à�(L"¹«žŽh¹«ÆŽh¹«�h,¯” ô¯à�*f&¦‚Þ €�‚‡¦f&æƒÞ €�*&‚ƒ‡&æ¦f&f… Þ €�‚ƒ„…‡àR OŽÎ³*ì3þOŽÎ³¯”L&ÔZHÿÿ&ûf@*&\g@&®s@&Ý@&<@& N@*&x@&N`@&œ,@&Fy@&Ny@*&».@&,@&4d@ì3À¨@&³@*&´p@&‰@&À@( ªþ(’*ˆ(ð_hní'î~hÌú¨â.h(}hð(4}h*U(4}h&o'Ödh¨c'kMh„(à~he'€Wh–*U(0h8´'a hº€(XahJŒ(` h€›&€%h*ì&a h`�&}h*�&.}h<�&4}hN&€sh"ö&0Mhrˆ(¶^h\(}hÞ¯”  ªþ *7 ÿÿ7 ÿÿÿ7 ì3À¨‚ &Àì3À¨*,ÿÿ7 ÿÿ7 ì3À¨‚&œ,ì3À¨‚&‰(ì3À¨*Rÿÿ7 ÿÿ7 ‚&,ì3À¨‚&<&ì3À¨‚)&».*xÿÿ7 ÿÿ7 ì3À¨‚&³$ì3À¨‚'&®s*žÿÿ7 ÿÿ7 ì3À¨‚&N`"ì3À¨‚%&<*Äÿÿ7 ÿÿ7 ì3À¨‚&ûf ì3À¨‚#&Ý*êÿÿ7 ÿÿ7 ÿ ì3À¨‚&\gì3À¨‚!&4d*ÿ7 ÿÿ7 ÿ ì3À¨‚ & Nì3À¨‚&´p*6ÿ7 ÿÿ7 ÿÿì3À¨‚ &®sì3À¨‚&x*\7 ÿÿ7 ÿÿ7 ì3À¨‚ &Fyì3À¨‚&Ny‚ÿÿÿì3À¨ÿÿ7 ì3À¨‚&³$ì3À¨‚'&®s*žÿÿ7 ÿÿ7 ì3À¨‚&N`"ì3À¨‚%&<*Äÿÿ7 ÿÿ7 ì3À¨‚&ûf ì3À¨‚#&Ý*êÿÿ<Á0ÀT  @<ì ¶øÎø Í!  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ00.w 1gT .MACRO DLXDF$,L,B,LST .IIF NB .LIST;; DEFINE THE QIO FUNCTION CODES;IO.XTM='B'<31*400> ; TRANSMITIO.XRC='B'<32*400> ; RECEIVE!IO.XOP='B'<33*400> ; OPEN A LINEIO.XTR='B'<34*400> ; TERMINATE IO.XIN='B'<35*400> ; INITIALISEIO.XTL='B'<36*400> ; CONTROL%IO.XCH='B'<37*400> ; CHARACTERISTICS;; DEFINE SUBFUNCTION CODES;; IO.XTR SUBFUNCTIONS;'XF.STP='B'10 ; STOP ONLY, NO DEASSIGN6XF.STD='B'200 ; STOP & DISABLE, CLOSE LUN & DEASSIGN;; IO.XTL SUBFUNCTIONSA; XF.ON='B'0 ; TURN A LINE-ID ON#XF.OFF='B'10 ; TURN A LINE-ID OFFE#XF.REA='B'20 ; REASSIGN A LINE-IDT!XF.ASS='B'30 ; ASSIGN A LINE-IDO#XF.DEA='B'40 ; DEASSIGN A LINE-IDX;'; IO.XCH SUBFUNCTIONS;O,XF.SMC='B'0 ; SET MULTIPLE CHARACTERISTICS-XF.GMC='B'10 ; GET MULTIPLE CHARACTERISTICSE;T ; DEFINE COMPOUND FUNCTION CODES;&IO.XSP='B'IO.XTL!XF.OFF ; STOP A LINE&IO.XST='B'IO.XTL!XF.ON ; START A LINE"IO.XHG='B'IO.XTR ; HANG UP A LINE-IO.XCL='B'IO.XTR!XF.STP!XF.STD ; CLOSE A LINEF7IO.XSC='B'IO.XCH!XF.SMC ; SET MULTIPLE CHARACTERISTICSI7IO.XGC='B'IO.XCH!XF.GMC ; GET MULTIPLE CHARACTERISTICS';0'; DEFINE MAXIMUM DLC PROTOCOL OVERHEADSD;S2PRO$OV=0 ; NO LONGER NEEDED - DEFINED TO ZERO TO7CRC$OV=0 ; RESOLVE ANY REFERENCES TO THESE SYMBOLS;;T; DEFINE DEVICE TYPE CODES6; (RETURNED IN HIGH BYTE OF I/O STATUS WORD 1 ON OPEN);X,XV.OTH='B' 000000 ; 'OTHERS' - NON-ETHERNET&XV.BRO='B' 000001 ; BROADCAST CHANNEL .IIF NB .NLISTO .ENDM DLXDF$S¨T .MACRO DLXBUF,LABEL,SIZE; .MCALL DLXDF$ DLXDF$T .BLKB PRO$OV' .IF NB

$$$=1 .IF B .IF EQ $$$/ MOV R5,S.OWN(R4)U .ENDC .ENDC .IFFO .IF GT NCTRLR-1 MOV R5,UCBSV(R3), .IFFB MOV R5,UCBSV  .ENDC .ENDC .ENDM F  L;G+; GENERATE THE DEVICE DISPATCH TABLE -- DDTR;R 1 .MACRO DDT$ DEV,NCTRLR,INY,INX,UCBSV,NEW,BUF,OPT> .IF NB  .WORD 'DEV'CHK$ .ENDC .IF NB > .WORD 'DEV'DEA  .IFFD .IF NB , .WORD 1 ;ENTRY SHOULD NOT BE USED - CRASH .ENDC .ENDC .ENABL LSB1 .IF B $'DEV'TBL::.WORD DEV'INI .IFFD$'DEV'TBL::.WORD DEV'INX .ENDC .WORD DEV'CAN .WORD DEV'OUT .IF B .WORD 65533$R .WORD 0 .WORD 65531$. .IFFM .WORD DEV'PWF .WORD DEV'KRB .WORD DEV'UCB .ENDC .IF DIF ,P .ASCII /DEV/D .IF B  .WORD $'DEV'INT .IFF, .IRP X,U .WORD $'DEV''XO .ENDM .ENDC .WORD 0 .IF DF LD$'DEVF'DEV'CTB: .WORD 0  .IFFD $$$=0 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IF EQ $$$N'DEV'CTB: .WORD $'DEV'CTBE .IFFO'DEV'CTB: .WORD $RHCTB .ENDC .ENDC .ENDC .IF DF LD$'DEVO$'DEV'TBE::.WORD 0 .ENDC .IF NB <UCBSV: .BLKW NCTRLR  .ENDC .IF B 65531$: BITB #UC.PWF,U.CTL(R5) BEQ 65532$O65533$: BCS 65532$ JMP DEV'PWF65532$: RETURN .ENDC .DSABL LSBR .ENDM;$; PROCESSOR STATUS READ/WRITE1;. .MACRO MFPS DST MOVB @#PS,DST .ENDM .MACRO MTPS SRC .IF IDN <#0>,. CLRB @#PS .IFF$ MOVB SRC,@#PS .ENDC .ENDM . E;$'; MULTIPROCESSOR LOCK AND UNLOCK MACROSD;C  R# .MACRO LOCK$ ADDR,TYPE,?LAB1,?LAB2F$$$=0' .IF IDN ,$$$=1C .IF DF M$$PRO MOV #'ADDR,-(SP)T CALL $MLOCK .ENDC .ENDC $ .IF IDN ,$$$=16 .IF DF M$$PROLAB1: ASRB ADDRD BCC LAB13 CACHE$ BYPASS .IF DF L$$DBG .NTYPE TMP,ADDR .IF EQ TMP-67 TSTB ADDR+1 .IFF .IF EQ TMP&70-10M TSTB 1'ADDR .IFF .IF EQ TMP&70-60. TSTB 1+ADDR .IFFC1 .ERROR ;INCORRECT ADDRESSING MODE FOR LOCK BLOCK. .ENDC .ENDC .ENDC BMI LAB2  CRASHLAB2: .IF EQ TMP-67 MOVB $PROCN,ADDR+1L .IFFB .IF EQ TMP&70-10N MOVB $PROCN,1'ADDRC .IFFD .IF EQ TMP&70-60D MOVB $PROCN,1+ADDRK .IFFC+ .ERROR ;INCORRECT ADDRESSING MODE IN LOCK$ .ENDC .ENDC .ENDC .ENDC .ENDC .ENDC4 .IIF EQ $$$ .ERROR ;NOT SPIN OR WAIT IN LOCK$ MACRO .ENDM T  .MACRO ULOCK$ ADDR,TYPE,?LAB1 .IF DF M$$PRO .IF IDN , MOV #'ADDR,-(SP) CALL $MULCK .ENDC .IF IDN , .IF DF L$$DBG .NTYPE TMP,ADDR .IF EQ TMP-67 CMPB $PROCN,ADDR+1E .IFF7 .IF EQ TMP&70-10+ CMPB $PROCN,1'ADDRM .IFFN .IF EQ TMP&70-60D CMPB $PROCN,1+ADDRM .IFFD, .ERROR 00 Oµ�K��E�TADATADATADATADATADATA;INCORRECT ADDRESSING MODE IN ULOCK$ .ENDC .ENDC .ENDC BEQ LAB CRASHLAB: .IF EQ TMP-67 COMB ADDR+1 .IFF  .IF EQ TMP&70-10S COMB 1'ADDR .IFFM .IF EQ TMP&70-60 COMB 1+ADDR .IFF,, .ERROR ;INCORRECT ADDRESSING MODE IN ULOCK$ .ENDC .ENDC .ENDC .ENDC CACHE$ RESTOR MOVB #1,ADDR, .ENDC .ENDC .ENDM T  .MACRO LCKDF$ TYPE- .IF IDN , .BYTE 1 .BYTE -1& .ENDC .IF IDN , .BYTE 1 .BYTE -16 .BYTE 1 .BYTE -1D .WORD 0 .ENDC .ENDM T D%LK.SPN=2 ;LENGTH OF SPIN LOCK BLOCK&LK.WAT=10 ;LENGTH OF WAIT LOCK BLOCK - ; !; DEFINITIONS FOR CACHE OPERATION;M ' .IF DF P$$D70 & M$$PRO& 6$FLUSH=1*400 ;CACHE FLUSH OPERATION&BYPASS=2*400 ;CACHE BYPASS OPERATION . .ENDC C . C;C; MACRO FOR CACHE OPERATION;N  .MACRO CACHE$ ARG,ARG2. .IF DF P$$D70 & M$$PROI < .IF IDN ,. BIC #BYPASS,@$MPCSR+6 .ENDC W .IF IDN ,6 BIS #BYPASS,@$MPCSR+6 .ENDC . .IF IDN , BIS #FLUSH,@$MPCSR+6N .ENDC  .IF IDN ,F MOV @$MPCSR+6,-(SP) BIC #^C,(SP)  .IF DIF , BIC (SP),@$MPCSR+6M .IFF BIS #BYPASS,@$MPCSR+6 .ENDC .ENDC Y .IF IDN ,S BIC #BYPASS,@$MPCSR+6 BIS (SP)+,@$MPCSR+6 .ENDC  .ENDC .ENDM  A;A; SAVE NONVOLATILE REGISTERS;M .MACRO SAVNRI JSR R5,$SAVNR .ENDM;A; STATE SWITCHING MACRO;F .MACRO SWSTK$ ARG CALL $SWSTK,ARG .ENDM;'; TALLY A FIELD IN SYSTEM ACCOUNT BLOCK$;S .MACRO TALLY$ OFF,CND,PROCR .IF DF X$$ACC&A$$CNT&CNDS MOV R0,-(SP)S MOV #140002+OFF,R0R .IF IDN ,, CALL $ACINP .IFF ; IDN , CALL $ACINC .ENDC ; IDN ,N .ENDC ; DF X$$ACC&A$$CNT&CNDB .ENDM;R5; CPR SEND MACRO -- SEND A PACKET TO CPRAME OR CPRSYSN;A$ .MACRO CPSEN$ OPCODE,BUF,LEN,SHRBAS .MCALL MOV$ MOV$ SHRBAS MOV$ LENT MOV$ BUF MOV$ OPCODE .IF DF VC$CPR S CALL @CPSEN .IFF CALL $CPSEN .ENDC ;VC$CPR .ENDM .IIF NDF S$$YDF , .LISTCR .IF DF X$$ACC&A$$CNT&CNDS MOV R0,-(SP)S MOV #140002+OFF,R0R .IF IDN ,, CALL $ACINP .IFF ; IDN , CALL $ACINC .ENDC ; IDN ,N .ENDC ; DF X$$ACC&A$$CNT&CNDB .ENDM;R5; CPR SEND MACRO -- SEND A PACKET TO CPRAME OR CPRSYSN;A$ .MACRO CPSEN$ OPCODE,BUF,LEN,SHRBAS .MCALL MOV$ MOV$ SHRBAS MOV$ LENT MOV$ BUF MOV$ OPCODE .IF DF VC$CPR S CALL @CPSEN .IFF C0 PHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADP.ê,à€ q€04SEP8710430104SEP87104300Ì �DN .µ,à€ ¡Œr€04SEP8710420804SEP87104207ÌŸJ5„™.�,à€67›r €04SEP8710414704SEP87104147Ì53s>.˜,à€]^›r€04SEP8710414204SEP87104142Ì\l1g.š,à€MN›r΀04SEP8710414404SEP87104144ÌLü1Q\.›,à€tu›rÛ€04SEP8710414504SEP87104145ÌsI2û†.™,à€34›r€04SEP8710414304SEP87104143Ì2É1"C.œ,à€TU›r<9€04SEP8710414604SEP87104146ÌS½2’‡.Ÿ,à€›r[q€04SEP8710414904SEP87104149Ì‚3ø€.ž,à€;<›rŒs€04SEP8710414804SEP87104148Ì:G3>«.ã,à€‘’s€04SEP8710425404SEP87104253Ì�ÁA”˜.,à€`as„(€04SEP8710434204SEP87104341Ì_2OW›.¼,à€‹w€04SEP8710421504SEP87104215Ì�8“.÷,à€:;x€04SEP8710431404SEP87104314Ì9+INK.ý,à€./x€04SEP8710432004SEP87104320Ì-"K2>.þ,à€x€04SEP8710432104SEP87104320Ì PK$.º,à€x€04SEP8710421304SEP87104213ÌÖ7U.Å,à€xX€€04SEP8710422304SEP87104222ÌW9_�.Þ,à€67°x€04SEP8710424804SEP87104247Ì5´@kD.,à€°x„(€04SEP8710433804SEP87104338̾Nö`.3,à€°x[q€04SEP8710441004SEP87104410̉V±¨.Ø,à€ÄÅëy€04SEP8710424204SEP87104241ÌÃD>FÌ.,à€¥¦ëy„(€04SEP8710433604SEP87104335̤ÊMLé..,à€§¨ëy[q€04SEP8710440604SEP87104405̦ÿTz9.ù,à€&'´z€04SEP8710431604SEP87104316Ì%3Jå<.,à€´z„(€04SEP8710435004SEP87104350ÌSQ†W.@,à€´z[q€04SEP8710442304SEP87104422ÌY@©.Ì,à€¸}€04SEP8710422904SEP87104229Ì’:$.Ö,à€Äź~€04SEP8710423904SEP87104238ÌÃ0=Ö. ,à€¥¦º~„(€04SEP8710433404SEP87104333̤MRë.,,à€§¨º~[q€04SEP8710440404SEP87104403̦TW;.¾,à€ Æ~€04SEP8710421704SEP87104216Ì “8ä.É,à€4„€04SEP8710422604SEP87104226Ì:è.é,à€T…€04SEP8710430004SEP87104259ÌxD–1.²,à€&'|…€04SEP8710420504SEP87104205Ì%ô4$/.,à€|…„(€04SEP8710432304SEP87104323ÌfKD\.#,à€|…[q€04SEP8710435504SEP87104355ÌöRÔ².Ú,à€?@‰Š€04SEP8710424404SEP87104243Ì>�?*Z. ,à€ !‰Š„(€04SEP8710433504SEP87104334̪M¾r.0,à€&'‰Š[q€04SEP8710440804SEP87104407Ì%V#Ë .ð,à€ÍΚ‹€04SEP8710430704SEP87104306Ì̧F„ñ.¿,à€´–€04SEP8710421804SEP87104217Ì�8ú8.à,à€:;¸¢€04SEP8710425104SEP87104249Ì9;Aýu.,à€¸¢„(€04SEP8710434004SEP87104340ÌO>….5,à€¸¢[q€04SEP8710441204SEP87104412Ì×V Ö PUFDTÀÁz,àP.B,àz ðe»zây04SEP8710451704SEP87104516Ì Î\ÐC.A,à€²³e»z»z04SEP8710451604SEP87104514Ìÿ[±\sD.C,à€¥¦š‹°V€04SEP8710451904SEP87104518̤Û\q=PUFDwÀvÀz àP.{ àODË�ƒkQ04SEP8710473304SEP87104733ÌIwdH.h àGzC�ƒkQ04SEP8710455604SEP87104555Ì€0ñ.D àEÔs à~kQ04SEP8710452404SEP87104523Ì€]Í".e àA""¢|ðskQ04SEP8710455304SEP87104552ÌakÕ20=.c àL‰‰î p kQ04SEP8710471004SEP87104709̈#q\N.— àI ŽðskQ04SEP8710480204SEP87104802Ì~|‡9.j àP77¬* kQ04SEP8710471604SEP87104715Ì6³rSô.d àI††‘xkQ04SEP8710455204SEP87104551Ì…–_{ž.˜ àN$$ü”ðskQ04SEP8710480304SEP87104802Ì#‡|³T.E àHÊäðskQ04SEP8710452504SEP87104524Ì�]^$.F àCdBkQ04SEP8710452604SEP87104525Ì¡]a".… àGMM$TðskQ04SEP8710474304SEP87104742ÌL�yÜ€.— àP’{È2kQ04SEP8710463904SEP87104638Ìšfêê.M àWHH‚{à~kQ04SEP8710464704SEP87104646ÌG{gy.‘ àNB|˜ kQ04SEP8710475604SEP87104755Ì%hÝ{ñS.¢ àI$|@ykQ04SEP8710463904SEP87104639Ì¡fþ/.� àD DˆHqkQ04SEP8710462904SEP87104628Ì ·c8).Ž à?މ„kQ04SEP8710462904SEP87104629ÌÂc\E.` àWjjŠ@`kQ04SEP8710470504SEP87104704Ìi¥n˜}.I àO ÚŠp…kQ04SEP8710464304SEP87104643Ì g >.J àLh‹<}kQ04SEP8710464404SEP87104644Ìg^..£ àSRR΋�ƒkQ04SEP8710464004SEP87104640ÌQ§f©._ àU++ �@`kQ04SEP8710470404SEP87104704Ì*znr?.w àNIIF¤ðskQ04SEP8710461004SEP87104610ÌHë`˜^.G àHú¼ðskQ04SEP8710452604SEP87104526Ì¥]…..x àNDDLäðskQ04SEP8710461104SEP87104611ÌC4a[.† à?¼ðHqkQ04SEP8710462304SEP87104622Ì`W.U àEhô`kQ04SEP8710465504SEP87104655ÌÖm»Í.� àCRõ dkQ04SEP8710475304SEP87104753Ì�{Ê*. àNYYþ ðskQ04SEP8710473704SEP87104737ÌXNxL’.I àHh„ðskQ04SEP8710452804SEP87104528ÌÌ]ê2.` àK>>˜¬ðskQ04SEP8710454804SEP87104547Ì=T_4].ˆ àE êÑØkQ04SEP8710474704SEP87104746ÌŽz…ß.J àC"Ñp&kQ04SEP8710452904SEP87104528Ìã]cÓ.ƒ àW))ªÑØwkQ04SEP8710474104SEP87104740Ì(\y[b.d àH ÂÑÀ€kQ04SEP8710471104SEP87104710̬q9?.r àG2Óp:kQ04SEP8710460404SEP87104604ÌN1)È.j àI!!ÓhLkQ04SEP8710455804SEP87104557Ì �0Jé.ƒ àGvÓ`TkQ04SEP8710462004SEP87104620̽b´þ.ˆ àBhÓxdkQ04SEP8710462404SEP87104624ÌÝbä.� àHŠÓðskQ04SEP8710473904SEP87104738ÌÔxœP.K àL„Ô kQ04SEP8710453004SEP87104529Ìé]o¸.L àFøÔ@kQ04SEP8710453104SEP87104530Ìï]½.~ àGTTÆÔðskQ04SEP8710473604SEP87104736ÌSúwt�.} àO--fÔ@ykQ04SEP8710473504SEP87104735Ì,Íwðh.• àWGGÕ09kQ04SEP8710463604SEP87104636ÌFueŠ/.Œ àD¨Õ€˜kQ04SEP8710475004SEP87104750Ì{�y.‰ àH BÖhkQ04SEP8710474804SEP87104747Ì —z…ó.P àK,,f× kQ04SEP8710465004SEP87104649Ì+ùgGø.l àFH×0 kQ04SEP8710471804SEP87104717Ìür î.” àS››Š×p:kQ04SEP8710463504SEP87104634ÌšÚdK„.M àU�×hLkQ04SEP8710453104SEP87104531Ìö].i àF Ö×€fkQ04SEP8710455704SEP87104556̇0úë.N àJÂ׸ykQ04SEP8710453204SEP87104532Ì^€ .{ àL â׸~kQ04SEP8710461404SEP87104613Ì ±a�1.n àK†×€kQ04SEP8710460104SEP87104600Ìß0.– àRÞÞðÜØ^kQ04SEP8710463804SEP87104637ÌݼeŠð.� àKrr¬ÝÀkQ04SEP8710463104SEP87104631Ìqìcs%.N àIJÝàGkQ04SEP8710464804SEP87104647ÌÃg .a àz××Öÿà°'kQ04SEP8710470704SEP87104706ÌÿoÖp�*.p àJÀà`†kQ04SEP8710460304SEP87104602Ì 1q.t àSYYá˜:kQ04SEP8710472604SEP87104726ÌX^uáS.O àI%%\â8 kQ04SEP8710464804SEP87104648Ì$Ôg²ã.m àLlâX kQ04SEP8710471804SEP87104718Ì s(ü.„ àA®âè!kQ04SEP8710474204SEP87104741Ì…yRì.„ àM0â8"kQ04SEP8710462104SEP87104620ÌÁb‡Þ.k àGãèkQ04SEP8710471704SEP87104717Ìêr#â.o àEØãàkQ04SEP8710460204SEP87104601Ìð0ï­.n à@ ´ãXRkQ04SEP8710471904SEP87104719Ì)s\.Q àLXX&ã˜gkQ04SEP8710465104SEP87104650ÌØbT*hrÐ.‰ àI ãpqkQ04SEP8710462504SEP87104625ÌâbJ-.O àJ øãàykQ04SEP8710453304SEP87104533Ì^ù'.Š àWgg`ã�ƒkQ04SEP8710462604SEP87104625Ìfóbø•. àG–㸒kQ04SEP8710461704SEP87104616ÌbžD.f àK6ä`kQ04SEP8710471204SEP87104712Ìrüâ.b àA–ï XkQ04SEP8710455004SEP87104549Ì“_Z.a àA˜ïàykQ04SEP8710454904SEP87104548Ì’_#'.[ àWÈùÕfkQ04SEP8710470004SEP87104700Ìüm÷3.Ž àI%%ŒüðskQ04SEP8710475204SEP87104752Ì$h{‚^.P àHà$ðskQ04SEP8710453404SEP87104533Ì^U/.¥ àJªHkQ04SEP8710464204SEP87104641Ìgi°.\ à?¼XHqkQ04SEP8710470104SEP87104701ÌnŒ$.y àH%%jy ZkQ04SEP8710473204SEP87104731Ì$ðvý>.y àH((ÄðskQ04SEP8710461204SEP87104612Ì'xa½B.‡ àG˜ëÈ_kQ04SEP8710462304SEP87104623ÌÛbw .i àKRR&ìðskQ04SEP8710471504SEP87104714ÌQar<�.l àF$$ L!ðskQ04SEP8710455904SEP87104559Ì ¶0Å0FK.v àH<""�`kQ04SEP8710472904SEP87104728ÌvsB.‹ àIQQ¦#"�ƒkQ04SEP8710462704SEP87104626ÌPZc­‡.f àD òµ" ZkQ04SEP8710455404SEP87104554Ì B0Íæ.† àIzzÔ# kQ04SEP8710474404SEP87104743ÌyÚy˜V.R àAÀ# XkQ04SEP8710453604SEP87104536̈^„.‹ àM88B#wkQ04SEP8710474904SEP87104749Ì7Þz�.m àF # _kQ04SEP8710460004SEP87104600ÌÝ0ÞÚ.z àK44š»9ðskQ04SEP8710473304SEP87104732Ì3w….“ àIày:‘kQ04SEP8710463404SEP87104634ÌÔd'è.e àJff&y:à~kQ04SEP8710471204SEP87104711Ìeµq-».q àR‡‡d«:�ƒkQ04SEP8710472304SEP87104722̆‹t{å.� àPGG„HðskQ04SEP8710475504SEP87104754ÌFŽ{ °.¯ àR\\°,KðskQ04SEP8710482504SEP87104825Ì[û�Î.‚ àTrr¤YMÐkQ04SEP8710474004SEP87104739Ìqêxï‰.’ àH))*oM�kQ04SEP8710463304SEP87104633Ì(«d�.­ àNGG¦„MðskQ04SEP8710482304SEP87104822ÌF<�`·.U àG++¾ÔMðskQ04SEP8710453804SEP87104538Ì*�^…z.g àJ222$NðskQ04SEP8710455504SEP87104555Ì1N0,S.u àPZZÊóQ�ƒkQ04SEP8710472804SEP87104727ÌY·u×.q àP,,bRÀkQ04SEP8710460304SEP87104603Ì+"1ïß.� àO~~4RðskQ04SEP8710461904SEP87104618Ì}!b—Õ.V àGCCüRðskQ04SEP8710453904SEP87104539ÌB¸^R™.r àI/SxkQ04SEP8710472404SEP87104724Ìu,.K àN``ŠLSðskQ04SEP8710464504SEP87104644Ì_g·½.w àGŽÅS ZkQ04SEP8710472904SEP87104729Ì)vƒh.k àKÔS`kQ04SEP8710455804SEP87104558̱09È.t àV??f;T²d€‰kQ04SEP8710460804SEP87104606 Ìk1—3R§3yA;¹J¥`¡/.| àNkkú.¶ àF$»zà8kQ04SEP8710483404SEP87104834Ì�…Æk.x àNµµn»z ™kQ04SEP8710473104SEP87104730Ì´;v3k.S àP%%˜³}kQ04SEP8710465304SEP87104653Ì$¤m^S.¤ àWßßê!€ €kQ04SEP8710481504SEP87104814ÌÞ<¢�.© àE Â#€pkQ04SEP8710481904SEP87104819ÌŽ€—\.¨ àM†#€8;kQ04SEP8710481804SEP87104818Ì{€û€.¬ àEZ#€}kQ04SEP8710482204SEP87104822Ì�GÈ.š àPllþ$€` kQ04SEP8710480504SEP87104804Ìk±|vŸ.› àMØ&€dkQ04SEP8710480604SEP87104805Ì}Á¬.œ àR××ð)€kQ04SEP8710480704SEP87104806ÌÖ;}s.ª àSUUt)€èXkQ04SEP8710482004SEP87104820ÌT®€XÚ.£ àPÂ*€€¢kQ04SEP8710481304SEP87104813Ì5!Ö.® àPxxú,€2kQ04SEP8710482404SEP87104824Ìwƒ�Ü.¡ àO°-€¸kQ04SEP8710481104SEP87104811Ì>F.´ à>Ì-€8;kQ04SEP8710483204SEP87104832Ìl…v.¥ àH -€`^kQ04SEP8710481604SEP87104815Ì€`«.– àM/€0kQ04SEP8710480104SEP87104801Ìk|hT.¢ àO/€8;kQ04SEP8710481204SEP87104812Ì&6t.� àV~~°2€À�kQ04SEP8710480804SEP87104807Ì}~'=.ž àMBBX3€�ƒkQ04SEP8710480904SEP87104808ÌA�~Ÿõ.« àX4€`kQ04SEP8710482104SEP87104821Ì�eV.µ àM`5€ÀvkQ04SEP8710483304SEP87104833Ì s…g¸.¦ àN..Ì9€2kQ04SEP8710481704SEP87104816Ì-9€�.  àW==F9€p5kQ04SEP8710481104SEP87104810Ì<Ó~±›.™ à>*9€€>kQ04SEP8710480404SEP87104803Ì«|ðl.² àFT9€KkQ04SEP8710482904SEP87104828Ì œƒÃ�.§ àNd9€€¢kQ04SEP8710481804SEP87104817Ìg€&è.€ àD‚l†ÎkQ04SEP8710461704SEP87104617Ìb'3.[ àG ºs†�ƒkQ04SEP8710454404SEP87104543Ì #_ .s àGêìŠ zkQ04SEP8710460504SEP87104605Ìe1Šf.� àN55ƤŒðskQ04SEP8710475104SEP87104751Ì43{RÞ.³ àWÂÂjÌ–ðskQ04SEP8710483104SEP87104829ÌÿªƒÁª„‰ .Ÿ à6䨖HqkQ04SEP8710481004SEP87104809ÌÒ~(º.° àFBBj ˜ðskQ04SEP8710482604SEP87104826ÌAW‚º.\ àGðskQ04SEP8710454504SEP87104544Ì._ÿ±.’ àNÖÄ™ðskQ04SEP8710475704SEP87104757Ìñ{Ù.“ àB àÆ™p:kQ04SEP8710475804SEP87104758Ì |•�.” àK''èЙHqkQ04SEP8710475904SEP87104758Ì&|Íã.• àS,,ÄÔ™h~kQ04SEP8710480004SEP87104759Ì+?|ÿñPUFDwÀ¢Àz àPPUFDwÀÊÀz àPPUFDwÀîÀz àPPUFDxÀ¢Àz àP.H à€œä^04SEP8710491204SEP87104911Ì ™‚9âPUFDóÀvÀz%àP.Ì%àA ‘GÈ}“04SEP8710494404SEP87104943Ì^^Š6.S%à?ü‘GÈ}®(04SEP8710491504SEP87104915̱‚mp.T%àG `éDkQ04SEP8710491604SEP87104915Ì ¸‚Q8.Ò%àHzéDækQ04SEP8710494804SEP87104948ÌËaæ+.Z%àERéD9ykQ04SEP8710491604SEP87104916ÌÄ‚f‘.]%à?¸ìDjkQ04SEP8710491704SEP87104917ÌÉ‚!.^%àAˆìDækQ04SEP8710491804SEP87104917Ì Ï‚k=.Ï%àDèìD@,kQ04SEP8710494604SEP87104945̇^‰^ _G_JM.Õ%àE ìD€:kQ04SEP8710495004SEP87104950Ì b)9._%àDúìDŽ:kQ04SEP8710491904SEP87104918ÌÝ‚ˆU.|%àFìD�:kQ04SEP8710491904SEP87104919Ìã‚ÀX.}%àEìD�:kQ04SEP8710492004SEP87104920Ìë‚ÉN.~%àEìD‘:kQ04SEP8710492104SEP87104920Ìñ‚ÈP.Œ%àA(ìD’:kQ04SEP8710492204SEP87104921Ìù‚úO.¤%àDTìD“:kQ04SEP8710492204SEP87104922Ìÿ‚LR.Ö%à?¶ìDhzkQ04SEP8710495104SEP87104951Ì«cZv.L%àDHûD}kQ04SEP8710492304SEP87104923Ì ƒx�.V%à? LE�rkQ04SEP8710492404SEP87104923Ì ƒ8‘.Ð%àC ®EóykQ04SEP8710494704SEP87104946ÌK_½aqÚ.W%à?*DEy_kQ04SEP8710492404SEP87104924Ì"ƒ,x.Q%àG .DEz_kQ04SEP8710491404SEP87104914Ì §‚Ây.Y%àEÖGEHSkQ04SEP8710492604SEP87104926Ì4ƒÆm.Z%à?²NEækQ04SEP8710492704SEP87104926Ì9ƒJ#.p%àB liE.kQ04SEP8710492704SEP87104927Ì ?ƒxN.Ñ%à@ iEÀ]kQ04SEP8710494704SEP87104947Ì ¿a `.±%à@žiEhzkQ04SEP8710492804SEP87104927ÌIƒ>™.·%àA‚oEhzkQ04SEP8710492904SEP87104928ÌPƒ7š.Ó%àDÜrEækQ04SEP8710494904SEP87104948Ìãaó3.¸%à?fsEìkQ04SEP8710492904SEP87104929ÌWƒ£0.¹%àAìsE'kQ04SEP8710493004SEP87104930Ì[ƒc0.º%à@ ´vEðkQ04SEP8710493104SEP87104930Ì _ƒ 6.»%à@ ŽEhjkQ04SEP8710493204SEP87104931Ì jƒ‡.¼%à?Ú¼Eü�kQ04SEP8710493204SEP87104932ÌtƒŽœ.Ë%àKæàEL;kQ04SEP8710494304SEP87104943ÌI^B.½%àET-FïykQ04SEP8710493304SEP87104933Ìzƒv“.¾%àI�FækQ04SEP8710493404SEP87104933Ì~ƒ¿B.¿%à?b±F zkQ04SEP8710493404SEP87104934Ì�ƒ<˜.Á%àA„ÝFKkQ04SEP8710493604SEP87104935̇…uh.À%à@¦AG@kQ04SEP8710493504SEP87104935Ì—ƒ……ש.Å%àC”RG@kQ04SEP8710493904SEP87104939̽]{.Ã%àC(“GºLkQ04SEP8710493804SEP87104937Ì–…¢m.Ä%à?ÄœG8^kQ04SEP8710493804SEP87104938̺]üW.Â%àK $§Gp kQ04SEP8710493704SEP87104936Ì Š…p5.Î%à? ª½G}kQ04SEP8710494504SEP87104945Ì z^�.Ô%àCÚÌGãkQ04SEP8710494904SEP87104949Ìb8 .Æ%à?ÚÌG€ kQ04SEP8710494004SEP87104939ÌÁ]y .Ç%à?tÌG–8kQ04SEP8710494104SEP87104940ÌÈ]3^dŠ.È%à?lÌG@`kQ04SEP8710494104SEP87104941Ì4^>V.Ê%àA hÍG€ kQ04SEP8710494204SEP87104942Ì ?^•.X%àC ’ÏGðkQ04SEP8710492504SEP87104925Ì 'ƒ±>.É%àA¸*KkQkQ04SEP8710494204SEP87104941Ì9^K.Í%àlÔF€ "S04SEP8710494404SEP87104944Ìe^VPUFDóÀ¢Àz%àP.Ø%à9DE ÀDÌ04SEP8710495704SEP87104956̳cÇ.Ù%à4DEvÌ04SEP8710495804SEP87104957Ì´c‘Ý.Ý%à:†GEœQÌ04SEP8710500004SEP87105000Ìúf].×%àA„¡F”€ Ì04SEP8710495604SEP87104956̲cùÙ.Ú%àn©FÜ Ì04SEP8710495804SEP87104958̵c–æ.Û%à( ©F`Ì04SEP8710495904SEP87104959̶c[Ñ.Ü%à&PJÈxÌ04SEP8710500004SEP87104959Ìùf =PUFDÎÌOÀz€àP.Þ€àî2š_Mp:Ì04SEP8710500604SEP87105006Ìûf*`PUFD=†€pz€àP.߀àî/ܼ ¼ 04SEP8710500904SEP87105008ÌüfKó.à€àîd¥pÌ04SEP8710501004SEP87105009Ìýfù.á€àîMÚ«–,Ì04SEP8710501004SEP87105010Ìþfug}‚.â€àî�Ôe"Ì04SEP8710501104SEP87105011Ìxgî.ã€àî2š_Mp:Ì04SEP8710501204SEP87105011Ìygª\.ä€àîN°,UC;Ì04SEP8710501204SEP87105012ÌzgÜmbÖ.å€àîbxHŠÌ04SEP8710501304SEP87105012Ìßm;Þ.æ€àî *xÀ�Ì04SEP8710501304SEP87105013Ìàm€ä.ç€àîNŠ hL®(04SEP8710501404SEP87105014ÌámÔÒ.è€àîE22ØŒðskQ04SEP8710501504SEP87105014Ì÷m,js›B.é€àîAæœ�kQ04SEP8710501604SEP87105015Ì—s1<.ê€àîJ//�¯xkQ04SEP8710501604SEP87105016Ì.œs9z.ë€àî@:�3@kQ04SEP8710501704SEP87105017ÌËsVd.ì€àîO¶áyxskQ04SEP8710501804SEP87105017ÌÓsw.í€àîNè hLkQ04SEP8710501904SEP87105018ÌÕsî.î€àîN¸Ä™ðskQ04SEP8710501904SEP87105019ÌësJ.ï€àî3 $Ô™�kQ04SEP8710502004SEP87105020Ì tÈ.ð€àî€""�`€04SEP8710502104SEP87105020Ì tÒ.ñ€àw"€04SEP8710502204SEP87105021Ìt%ê.ò€àî€ z›Àv€04SEP8710502204SEP87105022ÌtÝU.ó€àî€ú�öXÀ+€04SEP8710502304SEP87105023Ìt-g.ô€àî)¸u'Ô€04SEP8710502404SEP87105023Ìt$x.õ€àîRy'Ô€04SEP8710502404SEP87105024Ìt·x.ö€àî!öy'Ô€04SEP8710502504SEP87105025Ìtdz.÷€àî)¤y'Ô€04SEP8710502604SEP87105026Ìt{.ø€àî2ÞÔ2XMÔ€04SEP8710502704SEP87105026Ì tÖ.ù€àîPˆfMÀ+Ô€04SEP8710502704SEP87105027Ì"t æ.ú€àîN ‘€"Ô€04SEP8710502804SEP87105028Ì ;t}‘.û€àî<ð¹.kQ04SEP8710502904SEP87105028ÌEt£h.ü€àî6 ,‰wqkQ04SEP8710503004SEP87105029Ì Xt¢.ý€àî; RVqMkQ04SEP8710503004SEP87105030Ì bt÷£.þ€àî; L"ˆwkQ04SEP8710503104SEP87105031Ì ntñ .ÿ€àî7 Ä:dˆwkQ04SEP8710503204SEP87105031Ì xtœ.€àwq€04SEP8710503304SEP87105032Ì�…Ãa.€àî€VqM€04SEP8710503404SEP87105033̶…úô.€àî€"ˆw€04SEP8710503404SEP87105034ÌÐ… .€àî€:dˆw€04SEP8710503504SEP87105035Ìé…GU PUFDÎÌÎÌz€€àP.€€à€<=»z–,¢04SEP8710515804SEP87105049 Ìÿ†ÿ‡ÿˆÿ‰ÿŠ;‹>†.€€àX d1KüXÌ04SEP8710520004SEP87105200Ì Z‹´¨. €€ài==PæwddÌ04SEP8710520304SEP87105202Ì<²‹ñ½. €€àsLLNæw¡F€ Ì04SEP8710520104SEP87105200ÌKf‹ .€€àP ²æwÕf'Ì04SEP8710504704SEP87105047Ì †Eÿ.€€àB4»z–,Ì04SEP8710504704SEP87105046̆9—.€€à;$�sÖQkQ04SEP8710504604SEP87105045Ìÿ…Þü. €€àOä›’#(Ô€04SEP8710520404SEP87105204Ìï‹^-. €€àNæ›’{QGwÔ€04SEP8710520504SEP87105205Ìö‹ó¸. €€àOº›’{QrwÔ€04SEP8710520604SEP87105205Ìø‹ûº.€€àOÆ›’y… Ô€04SEP8710520704SEP87105207Ìü‹ž†.€€àO>›’y…2 Ô€04SEP8710520804SEP87105208Ìÿ‹H‡PDATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATADATAP0eeÄeeaek›’ .TITLE BSDRVR .IDENT /01.02/ ;P5; COPYRIGHT (C) 1981 BY DIGITAL EQUIPMENT CORPORATION2; ALL RIGHTS RESERVED.;O<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;N; VERSION 01.021;;; M. B. GROSSMAN 15-JUL-79;C; DT03/DT07 BUS SWITCH;C; MODIFIED BY:;;; B. S. MCCARTHY 1-FEB-802;)1; BM058 -- UPDATE COMPLEMENT TABLE ($CRMTB) WHENI(; UPDATING CPU RUN MASK TABLE ($URMTB); ; B. S. MCCARTHY 1-MAR-82;I'; BM242 -- DON'T LOG BUS SWITCH ERRORSY;H; MACRO LIBRARY CALLSQ;M .MCALL HWDDF$,PKTDF$,UCBDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS UCBDF$ ;DEFINE UCB OFFSETSE;T;H0; DEVICE CONTROL STATUS REGISTER BIT ASSIGNMENTS; TMO= 100000 ;TIMEOUT ERRORPWF= 040000 ;POWERFAIL ERROR$EXTINT= 010000 ;EXTERNAL INTERRUPTCONN= 000200 ;CONNECT STATUSIE= 000100 ;INTERRUPT ENABLEREQ= 000001 ;REQUEST BITRES= 001000 ;RESET BIT;T; SPECIA# .TITLE KRLOC RELOCATE USER ADDRESS .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSL UCB OFFSETS2;-.U.ASTA=U.CNT+2 ;AST ADDRESS OFFSET (U.CNT+2)2U.ASTE=U.ASTA+2 ;AST ERROR CODE OFFSET (U.CNT+4); ; SPECIAL SCB STATUS CODES$PWFB=2 ;BUSY DUE TO POWER FAILURE!QIOB=1 ;BUSY DUE TO NORMAL QIO;; DRIVER DISPATCH TABLEE;T DDT$ BS,D$$T07S;+); **-BSINI-DT03/DT07 BUS SWITCH INITIATOR ;W;; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN28; AN I/O REQUEST IS QUEUED AND AT THE END OF A PREVIOUS 9; I/O OPERATION TO PROPAGATE THE EXECUTION OF THE DRIVER.C2; IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN1; ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST 6; IF THE CONTROLLER IS BUSY A RETURN TO THE CALLER IS 6; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN1; THE NEXT I/O OPERATION IS INITIATED. THIS CYCLE ); CONTINUES UNTIL THE I/O QUEUE IS EMPTY.S;C ; INPUTS: ;W:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.; ; OUTPUTS:;T4; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O%; REQUEST IS WAITING TO BE PROCESSED,R0; THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-; ATION IS INITIATED.M;- .ENABL LSBNBSINI:0 GTPKT$ BS,,,,T ;GET NEXT I/O PACKET TO PROCESS; ;R2; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT :; '; R1=ADDRESS OF THE I/O REQUEST PACKET.E; R2=PHYSICAL UNIT NUMBER.; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK. :; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;1; DT03/DT07 BUS SWITCH I/O REQUEST PACKET FORMAT:O; "; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK.G=; WD. 03 -- POINTER TO 2ND LUN WORD IN REQUESTOR TASK HEADER. >; WD. 04 -- CONTENTS OF 1ST LUN WORD IN REQUESTOR TASK HEADER.1; WD. 05 -- I/O FUNCTION CODE (IO.RLB OR IO.WLB).E0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.; IF FUNCTION IO.DIS:,; WD. 12 -- TIMEOUT. (LESS THAN 254 SECONDS); WD. 13 -- CPU. (PORT NUMBER); IF FUNCTION IO.CON:1; WD. 12 -- RETRY COUNT (-1 MEANS INFINITE RETRY)4; WD. 13 --TARGET CPU (CLOSELY COUPLED CPU'S LETTER); IF FUNCTION IO.ATT:; WD. 12 -- AST ADDRESS.; IF FUNCTION IO.SWI:.; WD. 12 -- CPU (CLOSELY COUPLED CPU'S LETTER);E;;+=; THE FOLLOWING ROUTINE INITIALIZES THE I/O FUNCTIONS HANDLEDT8; BY THIS DRIVER. ( ATTACH,DETACH,CSR,CONNECT,DISCONNECT;; AND SWITCH) THE SWITCH FUNCTION COMBINES VARIOUS SEGMENTS ;; OF THE DISCONNECT AND CONNECT CODE ALONG WITH UNIQUE CODEE>; OF ITS OWN IN ORDER TO PERFORM00elDATADATADATADATADATADATADATADATADATADATA A TRANSFER OF THE BUS BETWEEN?; TWO CLOSELY COUPLED PROCESSORS. IT FIRSTS BEGINS A DISCONNECTE@; FUNCTION STOPPING PRIOR TO RELEASING THE BUS FROM THE CPU THAT<; IS TO BE DISCONNECTED. IT THEN ISSUES A REQUEST ON THE CPU:; THAT IS TO BE CONNECTED. WHEN THE CPU TO BE DISCONNECTED;; RECEIVES AN EXTERNAL INTERRUPT FROM THE SPECIFIED CONNECTI;; CPU IT THEN COMPLETES THE DISCONNECT AND ALLOWS THE NEWLYS-; CONNECTED CPU TO RECEIVE CONTROL OF THE BUSA;-;T4 CMPB #IO.DET/^D<256>,I.FCN+1(R1) ;DETACH FUNCTION? BNE 10$ ;IF NE NOE" CLR U.ASTA(R5) ;CLEAR AST ADDRESS% CLR U.ASTE(R5) ;CLEAR AST ERROR CODEC' TST S.KRB(R4) ;IS PROCESSOR CONNECTED?F BEQ 15$ ;IF EQ NOS% MOV @S.KRB(R4),R2 ;STORE CSR ADDRESSE BR 50$ ;DISCONNECT CPU910$: CMPB #IO.ATT/^D<256>,I.FCN+1(R1) ; ATTACH FUNCTION?V BNE 20$ ;IF NE NOU- MOV I.PRM(R1),U.ASTA(R5) ;STORE AST ADDRESSO+ MOV #1,U.ASTE(R5) ;STORE DEFAULT AST ERROR15$: JMP IOSUC ;COMPLETE I/OR.20$: MOV #IE.BAD&377,R0 ;ASSUME BAD PARAMETERS7 CMPB #IO.CON/^D<256>,I.FCN+1(R1) ; CONNNECT FUNCTION?U BEQ 110$ ;IF EQ YESD TST S.KRB(R4) ;CONNECTED? BEQ 44$ ;IF EQ NOT& MOV @S.KRB(R4),R2 ;STORE CSR ADDRESS 2 CMPB #IO.CSR/^D<256>,I.FCN+1(R1) ; CSR FUNCTION? BNE 30$ ;IF NE NOC' MOV (R2),R1 ;PREPARE FOR CSR TRANSFERC BR 15$;:30$: CMPB #IO.SWI/^D<256>,I.FCN+1(R1) ; SWITCH FUNCTION ? BNE 40$ ;IF NE NOD# MOV I.PRM(R1),R3 ;STORE CPU LETTERA BR 120$ ;START CONNECT PROCESS/40$: CMP #IO.DIS,I.FCN(R1) ;REGULAR DISCONNECT? + BEQ 50$ ;IF EQ YES, ELSE SPEC. DISCONNECT ! CMP #3,I.PRM+2(R1) ;PORT # LEGAL; BLO 44$ ;IF LO NOB, CMP I.PRM(R1),#254. ;TIMEOUT LESS THAN MAX. BLO 45$ ;IF LO NOS44$: JMP IOEND*45$: MOVB I.PRM(R1),S.CTM(R4) ;SET TIMEOUT BNE 48$ ;IF NE USE SPEC. VALUE, MOVB S.ITM(R4),S.CTM(R4) ;ELSE USE DEFAULT 48$: RETURNWPMATCH: ;REF LABELS#50$: MOV #IS.SUC&377,R0 ;SUCCESSFULD DISCON: BIS #RES,(R2) ;RESET BUS- BIC #IE!REQ,(R2) ;CLEAR INT. ENABLE AND REQ.P+ BIC U.CW3(R5),@$CPURM;UPDATE PROCESSOR URMQ5 BIS U.CW3(R5),@$CPCRM ;UPDATE COMPLEMENT OF RUN MASK+ CMPB #QIOB,S.STS(R4) ;REAL I/O? BNE 75$ ;IF NE NOR5 CMPB #IO.SWI/^D<256>,I.FCN+1(R1) ; SWITCH FUNCTION? BNE 70$ ;IF NE NOM6 MOV I.PRM+10(R1),S.URM(R4) ;RESTORE CONNECT CPU'S URM, MOV I.PRM+12(R1),S.KRB(R4) ;RESTORE CONNECT ; CPU'S KRB POINTER$ CALL $CFORK ;SWITCH TO CONNECT CPU% MOV @S.KRB(R4),R2 ;STORE CSR ADDRESSI" BIT #CONN,(R2) ;IS CPU CONNECTED? BEQ 60$ ;IF EQ NOB JMP IOCMP+60$: MOV #IE.CNR&377,R0 ;CONNECTION FAILUREQ"70$: CLR S.KRB(R4) ;PUT SB OFFLINE BR 44$ ;ENDM"75$: CLR S.KRB(R4) ;PUT SB OFFLINE* TST U.ASTA(R5) ;IS AST ADDRESS SPECIFIED? BEQ 48$ ;IF EQ NOI" MOV #6*2,R1 ;LENGTH OF AST BLOCK$ CALL $ALOCB ;ALLOCATE AN AST BLOCK' BCS 48$ ;IF ALLOCATE FAIL JUST RETURNR TST (R0)+ ;SKIP OVER LINK WORD% MOV R1,(R0)+ ;SAVE SIZE OF AST BLOCKO& MOV R0,R1 ;SAVE BEGINNING ADDRESS OF CMP -(R1),-(R1) ; AST BLOCKI1 MOV #10*2,(R0)+ ;SAVE BYTES TO ALLOCATE ON STACK- MOV U.ASTA(R5),(R0)+ ;SAVE AST TRAP ADDRESS0, MOV #1,(R0)+ ;SAVE NUMBER OF AST PARAMETERS' MOV U.ASTE(R5),(R0) ;SAVE ERROR NUMBERT, MOV U.ATT(R5),R0 ;GET ADDRESS OF TASK'S TCB- CALLR $QASTT ;INSERT AST BLOCK IN AST QUEUEB;K/;THE FOLLOWING CODE INSURES THAT THE CPU TO BE .;CONNECTED IS ONLINE, HAS ACCESS TO THE SWITCH;AND THAT ITS KRB IS ONLINE.;S9110$: MOVB I.PRM+2(R1),R3 ;STORE CPU LETTER IF TARGET CPU  BNE 120$ ;IF NE YES & MOVB $PROC2,R3 ;STORE CPU WORD OFFSET BR 125$-120$: SUB #101,R3 ;CONVERT ASCII LETTER TO #T+ BLT 121$ ;CPU LETTER LESS THAN 'A'- ERRORS ASL R3 ;CONVERT TO WORD OFFSET' BIT $BTMSK(R3),$URMST ;IS CPU ONLINE?G BNE 125$ ;IF NE YESB MOV #IE.OFL&377,R0 ;T121$: JMP IOEND 3125$: MOV $BTMSK(R3),R3 ;STORE TARGET CPU MASK WORDT MOV R4,R1/ ADD #S.KTB,R1 ;STORE ADDRESS OF FIRST KTB WORDT/140$: MOV (R1)+,R2 ;MOVE ADDRESS OF KRB INTO R2)) BEQ 121$ ;ADDRESS TERMINATOR? IF EQ YES1( BIT R3,K.URM(R2) ;DOES CPU HAVE ACCESS? BEQ 140$ ;IF EQ NO' MOV #IE.OFL&377,R0 ;ASSUME OFFLINE KRBT( BIT #KS.OFL,K.STS(R2) ;IS KRB OFFLINE?00eÕe20eeaek›’ BNE 121$ ;IF NE YES;% MOV S.PKT(R4),R1 ;RESTORE I/O PACKET,5 CMPB #IO.SWI/^D<256>,I.FCN+1(R1) ; SWITCH FUNCTION?# BNE 150$ ;IF NE NO;M5;NOTE!!! THE PORT NUMBER OF THE DT07 THAT CORRESPONDSK9;TO A SPECIFIC CPU/KRB IS STORED IN THE LOW BYTE OF K.PRMK;W3 MOVB K.PRM(R2),I.PRM+2(R1) ;STORE CONN. CPU PORT #)7 MOV S.URM(R4),I.PRM+4(R1) ;STORE DISCONNECT CPU'S URMR9 MOV S.KRB(R4),I.PRM+6(R1) ;STORE DIS. CPU'S KRB POINTERE1150$: MOV I.PRM(R1),U.CW2(R5) ;STORE RETRY COUNTS+ MOV K.URM(R2),S.URM(R4) ;STORE URM IN SCB;. MOV R2,S.KRB(R4) ;STORE POINTER TO KRB IS SCB- CALL $CFORK ;SWITCH, IF REQ., TO PROPER CPU#% MOV @S.KRB(R4),R2 ;STORE CSR ADDRESSE1 MOV #IE.BAD&377,R0 ;ASSUME CPU ALREADY CONNECTEDP" BIT #CONN,(R2) ;IS CPU CONNECTED? BEQ 160$ ;F EQ NOM, JMP IOCMP ;COMPLETE CONNECTION IF REQUIRED2160$: MOV S.PKT(R4),R1 ;RESTORE I/O PACKET ADDRESS5 CMPB #IO.SWI/^D<256>,I.FCN+1(R1) ; SWITCH FUNCTION?' BNE CONBS ;IF NE NOO' MOVB S.ITM(R4),S.CTM(R4) ;SET TIMEOUTS;M4;THE SWITCH FUNCTION ISSUES A CONNECT REQUEST ON THE3;CPU TO BE CONNECTED AFTER RESTORING THE DISCONNECTS4;CPU'S URM TO S.URM. THIS INSURES THAT THE INTERRUPT5;THAT WILL BE CAUSED BY THE DISCONNECT CPU'S EXTERNALD6;INTERRUPT BIT BEING SET WILL CALL THE DISCONNECT CPU.; 5 MOV S.URM(R4),I.PRM+10(R1) ;STORE CONNECT CPU'S URMD3 MOV I.PRM+4(R1),S.URM(R4) ;RESTORE DIS. CPU'S URM2 BIS #S2.ACT,S.ST2(R4) ;SET CONTROLLER ACTIVE FLAG BIS #REQ,(R2) ;ASSERT REQUEST* RETURN ;AWAIT CONNECTED CPU'S INTERRUPT-CONBS: MOVB S.ITM(R4),S.CTM(R4) ;SET TIMEOUTT2 BIS #S2.ACT,S.ST2(R4) ;SET CONTROLLER ACTIVE FLAG0 BIS #IE!REQ,(R2) ;ENABLE INTERRUPTS ASSERT REQ. RETURN .DSABL LSB ;+6; THE POWERFAIL ROUTINE ATTEMPTS TO RESTORE THE STATE <; OF THE SYSTEM PRIOR TO THE POWERFAIL. IF I/O WAS EXECUTING<; THE TIMEOUT IS RESET AND THE PREVIOUS OPERATION CONTINUED.:; IF THE SB WAS PREVIOUSLY CONNECTED TO THIS PROCESSOR AND;; NO I/O WAS EXECUTING A CHECK FOR CONNECTION IS MADE AND AA%; RECONNECT SEQUENCE BEGUN IF NEEDED.M;- T+BSPWF: TST S.KRB(R4) ;WAS SWITCH CONNECTED?S BGT 5$ ;IF GT YESL JMP BSINI,5$: TSTB S.STS(R4) ;IS SWITCH CURRENTLY BUSY BEQ 20$ ;IF EQ NOS) MOVB S.ITM(R4),S.CTM(R4) ;RESET TIMEOUTE 10$: RETURNR)20$: MOV @S.KRB(R4),R2 ;STORE CSR ADDRESSP) BIT #CONN,(R2) ;IS CPU CONNECTED TO BUS?U BNE 10$ ;IF NE YES- MOV #2,U.ASTE(R5) ;ASSUME FAILURE TO CONNECTV) MOVB #PWFB,S.STS(R4) ;SET STATUS TO BUSYO BR CONBS ;CONNECT SWITCH;++; **-$BSINT DT03/DT07 BUS SWITCH INTERRUPTSE,; INTERRUPTS CAN BE ISSUED BY THE BUS SWITCH*; FOR DEVICE POWERFAIL, A REQUEST FOR THE *; BUS BY ANOTHER CPU, TIMEOUT OF A REQUEST5; FOR CONNECT, TIMEOUT OF THE WATCHDOG TIMER AND UPON4*; RECEIVING A CONNECT TO THE SWITCHED BUS.;-6 INTSE$ BS,PR7,D$$T07 ;;;SAVE REGISTERS & SET PRIORITY' MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCB  MOV R1,-(SP) ;;;STORE R1;" CMPB #QIOB,S.STS(R4) ;;;REAL I/O? BNE 10$ ;;;IF NE NOU+ MOV S.PKT(R4),R1 ;;;GET I/O PACKET ADDRESS 7 CMPB #IO.SWI/^D<256>,I.FCN+1(R1) ;;; SWITCH FUNCTION?C BNE 10$ ;;;IF NE NO 3 MOV S.KRB(R4),I.PRM+12(R1) ;;;STORE CONNECT CPU'S  ;;; KRB POINTER; MOV I.PRM+6(R1),S.KRB(R4) ;;;RESTORE DISCONNECT CPU'S KRBM+10$: MOV @S.KRB(R4),R1 ;;;STORE CSR ADDRESSI, TST (R1) ;;;WATCHDOG OR REQUEST TIMER SET? BMI 60$ ;;;IF MI YES( BIT #EXTINT,(R1) ;;;EXTERNAL INTERRUPT? BEQ 50$ ;;;IF EQ NOE;;3;THIS SECTION INSURES THAT IF AN EXTERNAL INTERRUPT 6;BIT IS SET THAT IT WILL BE CLEARED IN TIME TO PREVENT8;THE TIMEOUT LOSS OF THE BUS. INITIAL PROCESSING IS DONE5;AT PRIORITY 7 TO INSURE THAT THE TIME LIMIT WILL BE T6;MET AND THAT THE EXECUTIVE TIMEOUT COUNT IS NOT RESET;S" MOV (R1),-(SP) ;;;STORE CSR VALUE- BIC #EXTINT,(R1) ;;;CLEAR EXTERNAL INTERRUPTR MOV R2,-(SP) ;;;STORE R2G MOV R3,-(SP) ;;;STORE R3I, CMPB #QIOB,S.STS(R4) ;;;IS REAL I/O PENDING BNE 40$ ;;;IF NE NO$+ MOV S.PKT(R4),R2 ;;;GET I/O PACKET ADDRESST8 CMPB #IO.SWI/^D<256>,I.FCN+1(R2) ;;;IS THIS AN IO.SWI? BNE 20$ ;;;IF NE NOT# BIT #74,-4(SP) ;;; IS THIS A DT03?A BNE 30$ ;;;IF NE N00e70DATADATADATADATADATADATADATADATADATADATAOA BR 35$ ;;;<20$: CMPB #IO.DIS/^D<256>,I.FCN+1(R2) ;;;IS THIS AN IO.DIS? BNE 40$ ;;;IF NE NON!30$: MOV #4,R3 ;;;MOVE 4 INTO R3O& ASH I.PRM+2(R2),R3 ;;;CREATE CPU MASK' BIT R3,-4(SP) ;;;IS THIS CORRECT CPU?O BEQ 40$ ;;;IF EQ NO;;O:;THIS SECTION IS ENTERED ONLY IF THE PENDING FUNCTION IS A7;SWITCH OR DISCONNECT AND THEN ONLY IF THE CPU CAUSING R.;THE EXTERNAL INTERRUPT WAS THE SPECIFIED ONE.:;NOTE:IF SWITCH IS A DT03 NO CHECKING OF THE SOURCE OF THE7;INTERRUPT IS POSSIBLE AND THE BUS IS NEVER RELEASED IN09;THE CASE WHERE THE FUNCTION WAS A DISCONNECT AND THE BUS6;IS ALWAYS RELEASED IN THE CASE WHERE THE FUNCTION WAS ;A SWITCH.;235$: MOV (SP)+,R3 ;;;RESTORE R3R MOV (SP)+,R2 ;;;RESTORE R2C TST (SP)+ ;;;RESTORE STACK MOV (SP)+,R1 ;;;RESTORE R1O' CALL $FORK ;;;CREATE A SYSTEM PROCESS ) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSI% MOV @S.KRB(R4),R2 ;STORE CSR ADDRESSP JMP PMATCH ;DISCONNECT40$: MOV (SP)+,R3 ;;;RESTORE R3S MOV (SP)+,R2 ;;;RESTORE R2O TST (SP)+ ;;;RESTORE STACK MOV (SP)+,R1 ;;;RESTORE R1H 45$: RETURNS%50$: BIT #PWF,(R1) ;;;BS POWER LOSS?R BEQ 120$ ;;;IF EQ NO;H5;THIS SECTION HANDLES THE CASE OF AN INTERRUPT CAUSEDS5;BY A POWER FAILURE ON THE SWITCHED BUS. PENDING I/O,R4;EXCEPT A DISCONNECT, IS TERMINATED AND A DISCONNECT;IS PERFORMED.;E' BIC #IE,(R1) ;;; CLEAR INTERUPT ENABLEC MOV (SP)+,R1 ;;;RESTORE R1,' CALL $FORK ;;;CREATE A SYSTEM PROCESSC) MOV @S.KRB(R4),R2 ;PUT CSR ADDRESS IN R2M/ CMPB #QIOB,S.STS(R4) ;IS REAL I/O IN PROGRESS?E BEQ 55$ ;IF EQ YES/ MOV #3,U.ASTE(R5) ;AST ERROR CODE=3, POWERFAIL; CLRB S.STS(R4) ;RESET STATUS; BR 75$O055$: MOV S.PKT(R4),R1 ;GET ADDRESS OF I/O PACKET+ CMPB #IO.DIS/^D<256>,I.FCN+1(R1) ;IO.DIS?  BEQ 45$ ;IF EQ YES) MOV #IE.ABO&377,R0 ;ELSE ABORT OPERATIONC MOV #401,R2 ;NO RETRY COUNTC CALL $IODON ;TERMINATE I/O2 MOV U.SCB(R5),R4 ;STORE SCB ADDRESS LOST IN IODON, MOV S.PKT(R4),R1 ;GET ADDRESS OF I/O PACKET% MOV @S.KRB(R4),R2 ;STORE CSR ADDRESS. BR 75$I;E8;THIS SECTION HANDLES AN INTERRUPT CAUSED BY THE TIMEOUT:;BIT BEING SET. IF THIS WAS CAUSED BY A FAILURE TO CONNECT9;AFTER ISSUING A REQUEST, THE RETRY COUNT IS CHECKED AND 9;THE PROPER ACTION TAKEN. IF THIS WAS CAUSED BY A FAILUREQ6;TO RECONNECT AFTER POWERFAIL A DISCONECT IS INITIATED;AND AN OPTIONAL AST ISSUED.;N/60$: BIC #TMO!EXTINT!IE,(R1) ;;;CLEAR CSR BITSR MOV (SP)+,R1 ;;;RESTORE R1I' CALL $FORK ;;;CREATE A SYSTEM PROCESS/% MOV @S.KRB(R4),R2 ;STORE CSR ADDRESS * CMPB #QIOB,S.STS(R4) ;WAS THIS A CONNECT? BEQ 100$ ;IF EQ YESY CLRB S.STS(R4) ;RESET STATUSF3 CMP U.ASTE(R5),#2 ;IS ERROR A POWERFAIL RECONNECT?I BEQ 75$ ;IF EQ YES3 MOV #1,U.ASTE(R5) ;SET AST ERROR =1, TIMEOUT ERRORF&75$: JMP DISCON ;PERFORM A DISCONNECT1100$: MOV S.PKT(R4),R1 ;GET ADDRESS OF I/O PACKETD" TST U.CW2(R5) ;IS RETRY COUNT =0? BEQ 110$ ;IF EQ YES " CMP #-1,U.CW2(R5) ;IS IT NEG. 1? BEQ 105$ ;IF EQ YESR$ DEC U.CW2(R5) ;DECREASE RETRY COUNT105$: JMP CONBS ;TRY AGAINS)110$: MOV #IE.CNR&377,R0 ;CONNECT FAILUREC BR 75$1 120$: MOV (SP)+,R1 ;;;RESTORE R1' CALL $FORK ;;;CREATE A SYSTEM PROCESSR% MOV @S.KRB(R4),R2 ;STORE CSR ADDRESSI( BIT #CONN,(R2) ;IS BUS PHYSICALY CONN.? BEQ 75$ ;IF EQ NO.IOCMP: BIS #IE,(R2) ;ENSURE INTERRUPTS ENABLED" BIS U.CW3(R5),@$CPURM;SET CPU URM5 BIC U.CW3(R5),@$CPCRM ;UPDATE COMPLEMENT OF RUN MASK;. CMPB #QIOB,S.STS(R4) ;WAS THIS A I/O CONNECT? BEQ IOSUC ;IF EQ YES CLRB S.STS(R4) ;RESET STATUSC& MOV #1,U.ASTE(R5) ;RESTORE ERROR CODE& MOV U.CW3(R5),$PFURM;POWERFAIL UNIBUS$ INCB $PWRFL+1 ; ATTACHED DEVICES RETURNL-IOSUC: MOV #IS.SUC&377,R0 ;I/O WAS A SUCCESSR)IOEND: MOV #401,R2 ;NO RETRIES ATTEMPTED2# CALL $IODON ;FINISH I/O OPERATION  JMP BSINI ;NEXT REQUEST(;+>; TIMEOUT IS USED BY IO.DIS TO LIMIT THE AMOUNT OF TIME WAITEDA; FOR A SPECIFIED LOOSELY COUPLED CPU TO ISSUE A CONNECT REQUEST..6; IF THE CORRECT CPU DOES NOT RESPOND A TIMEOUT ERROR 2; IS GENERATED. ALL OTHER TIMEOUT ENTRIES INDICATE; HARDWARE OR POWER PROBLEMS.3;-BSOUT: ;;;R00e?0fB0eeaek›’EFERENCE LABEL" MOV #IE.TMO&377,R0 ;TIMEOUT ERROR, MOV S.PKT(R4),R1 ;GET ADDRESS OF I/O PACKET1 CMPB #PWFB,S.STS(R4) ;IS THIS A POWERFAIL ENTRY? BNE 5$ ;IF NE NO CLRB S.STS(R4) ;CLEAR STATUSN BR 10$ ;DISCONNECT95$: CMPB #IO.CON/^D<256>,I.FCN+1(R1) ; CONNECT FUNCTION?D BNE 20$ ;IF NE NOO)10$: MOV @S.KRB(R4),R2 ;STORE CSR ADDRESST JMP DISCONC920$: CMPB #IO.SWI/^D<256>,I.FCN+1(R1) ; SWITCH FUNCTION?D BEQ 30$ ;IF EQ YES,R ; ELSE DIS. TO SPEC. CPU TMO# BIS #IE,(R2) ;RE-ENABLE INTERRUPTSN BR IOEND ;END WAIT330$: MOV I.PRM+6(R1),S.KRB(R4) ;RESTORE DISCONNECTS ; CPU'S KRB POINTER BR IOENDH;+,; CANCEL I/O WILL ZERO AN IO.CON RETRY COUNT4; OR SET S.CTM (TIMEOUT COUNT) TO ONE FOR AN IO.DIS.3; TERMINATION THEN OCCURS THROUGH NORMAL CHANNELS.B;-1BSCAN: MOV S.PKT(R4),R1 ;;;GET I/O PACKET ADDRESSD2 CMPB #IO.DIS/^D<256>,I.FCN+1(R1) ;;; DISCONNECT? BNE 10$ ;;;IF NE NOI& MOVB #1,S.CTM(R4) ;;;SET TIMEOUT TO 1 RETURN ;;; 310$: CMPB #IO.CON/^D<256>,I.FCN+1(R1) ;;; CONNECT?N BNE 20$ ;;;IF NE NOI+ MOVB S.ITM(R4),S.CTM(R4) ;;;RESET TIMEOUT ) CLR U.CW2(R5) ;;;SET RETRY COUNT TO ZERO20$: RETURN ;;;L E .ENDO.CON RETRY COUNT4; OR SET S.CTM (TIMEOUT COUNT) TO ONE FOR AN IO.DIS.3; TERMINATION THEN OCCURS THROUGH NORMAL CHANNELS.B;-1BSCAN: MOV S.PKT(R4),R1 ;;;GET I/O PACKET ADDRESSD2 CMPB #IO.DIS/^D<256>,I.FCN+1(R1) ;;; DISCONNECT? BNE 10$ ;;;IF NE NOI& MOVB #1,S.CTM(R4) ;;;SET TIMEOUT TO 1 RETURN ;;; 310$: CMPB #IO.CON/^D<256>,I.FCN+1(R1 .TITLE EVENT  .IDENT /X01.01/ A;T&; COPYRIGHT (C) 1974, 1978, 1979, 1980/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.E;EA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED 9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.G;I; VERSION X01.01;D; K. E. KINNEAR 2-JUN-78T;O; EVENT TRACE SUBROUTINESB;5; MODIFIED BY:;G; B. S. MCCARTHY 13-AUG-80; ); BM085 -- TURN ON/ENHANCE EVENT LOGGINGF;T ;R; MACRO LIBRARY CALLST;. .MCALL HWDDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS A;+); **-$EVADD-ADD EVENT TO THE EVENT BUFFER ;I9; THIS ROUTINE WILL CHECK THE LENGTH OF THE EVENT AGAINSTW:; THE SPACE REMAINING IN THE BUFFER, AND SWITCH TO ANOTHER;; BUFFER IF NECESSARY. IF SPACE REMAINS, IT WILL PLACE THE =; EVENT HEADER INTO THE BUFFER AND LEAVE THE REGISTERS SET UPC4; FOR THE ADDITION OF THE EVENT SPECIFIC PARAMETERS.;1<; AN INVOCATION OF THE EVENT MACRO WILL CALL THIS ROUTINE IF?; THE EVENT TRACE IS ENABLED FOR THAT EVENT. THIS ROUTINE WILLD@; CALL $SETF IF THE BUFFER IS FULL TO SET LOCAL EVENT FLAG 1 FOR=; THE PRIV. BUFFER DUMPPING TASK. IF THE BUFFER DUMP TASK ISN=; WAITING FOR EVENT FLAG THEN ALL WILL BE WELL, BUT IF IT IS A=; STOPPED FOR EVENT FLAG, POSSBILE PROBLEMS WILL RESULT SINCE ?; $SETF WILL CALL $EXQRN/$NXTSK INSTEAD OF JUST $SETCR. IN ANYUD; CASE, THE MACRO CANNOT BE INVOKED IN ANY AREA WHERE A $SETF/$SETCR; WOULD CAUSE ANY PROBLEMS.L;A; BUFFER FORMAT:; ;; THE FIRST WORD OF EACH BUFFER IS THE LENGTH OF THE BUFFERD@; IN BYTES. IT IS NEVER CHANGED ONCE THE BUFFER IS INITIALIZED.@; A ZERO WORD WHERE AN EVENT IS EXPECTED OR BUFFER FULL ENDS THE8; BUFFER. A NON-ZERO SECOND WORD SHOWS AN ACTIVE BUFFER.B; THE SECOND WORD OF THE BUFFER IS A BUFFER SEQUENCE NUMBER, WHICH@; GOES UP FOR EACH BUFFER. THIS IS USED BY THE BUFFER DUMP TASK+; TO PROPERLY DUMP THE BUFFERS TO THE FILE.A6; THE SECOND WORD MAY ONLY BE CHANGED AT SYSTEM STATE.;>; A BUFFER LIST CONTAINING TWO WORD ENTRIES EXISTS WHICH THIS C; ROUTINE WILL SEARCH TO FIND A FREE BUFFER WHENEVER ONE OVERFLOWS.I;; THE FIRST WORD OF EACH ENTRY IS THE KISAR6 MAPPING TO THEU>; FIRST WORD OF THE BUFFER AND THE SECOND IS THE LENGTH OF THE; BUFFER IN BYTES.;O7; THE EVENT HEADER FORMAT FOR EACH EVENT IS AS FOLLOWS:;O3; +-----------------------------------------------+M; ! CPU NUMBER ! EVENT NUMBER !F3; +-----------------------------------------------+N-; ! SECOND OF MINUTE ! TICK OF SECOND !I3; +-------------------------------------------00fG0gN0TADATADATADATADATADATADATADATADATA----+I"; ! EVENT SEQUENCE NUMBER !3; +-----------------------------------------------+I; ! PARAMETERS !H3; +-----------------------------------------------+L ; ! . !3; +-----------------------------------------------+ ; ! . ! 3; +-----------------------------------------------+- ; ! . !-3; +-----------------------------------------------+-;-;-D; WHEN THE MACRO RECIEVES CONTROL FROM THIS SUBROUTINE, IF THE CARRYA; IS CLEAR THEN R0 POINTS TO THE PLACE TO INSERT THE FIRST OF THE 7; PARAMETERS. KISAR6 IS SET UP CORRECTLY FOR THIS TOO.-;- ; INPUTS:-;-; R0=EVENT NUMBER.;R ; OUTPUTS:;-; IF CC:.; R0=DISPLACEMENT INTO BUFFER FOR PARAMETERS. ; 2(SP)=SAVED KISAR6 VALUE.; KISAR6=SET UP FOR BUFFER. ; ; IF CS:; R0=UNDEFINED.;-; REGISTERS MODIFIED: ; ; NONE.-;- - - .IF DF E$$VNT -0$EVADD::MOV KISAR6,-(SP) ;SAVE THE KISAR6 OFFSET) MOV $EVKS6,KISAR6 ;MAP TO CURRENT BUFFERY ;C4; CHECK FOR ENOUGH ROOM IN THE BUFFER FOR THIS EVENT;H $ MOV R0,-(SP) ;SAVE THE EVENT NUMBER' CLR -(SP) ;FOR MOVB -(SP) INSTRUCTION 2 MOVB $EVTAB(R0),(SP) ;GET THE LENGTH OF THE EVENT+ MOV $EVDIS,R0 ;GET CURRENT BUFFER POSITION / ADD (SP)+,$EVDIS ;ADD EVENT LENGTH TO POSITIONU< CMP $EVLEN,$EVDIS ;COMPARE CURRENT POS WITH LENGTH + 140000 BHI 20$ ;IF HI NOO# BEQ 5$ ;IF EQ BUFFER EXACTLY FULL A;:'; SHOW THIS BUFFER FULL BUT NOT EXACTLY;V V* CLR (R0) ;PLACE ZERO WORD AT LOGICAL EOB H; .; SWITCH BUFFERS -- CURRENT ONE HAS OVERFLOWED; M*5$: MOV #$EVLST,R0 ;SEARCH FOR FREE BUFFER410$: MOV (R0)+,KISAR6 ;GET NEXT BUFFER KISAR6 OFFSET' BEQ 30$ ;IF EQ NO NEXT OFFSET -- OOPSI# TST @#140002 ;IS THIS BUFFER FULL?A BNE 10$ ;IF NE YES T;N ; FOUND EMPTY BUFFER -- CLAIM IT;; P3 MOV KISAR6,$EVKS6 ;SAVE MAPPING TO BUFFER SELECTEDI-15$: INC $EVBSQ ;BUMP BUFFER SEQUENCE NUMBER$ BEQ 15$ ;SEQUENCE NUMBER NEVER = 0C MOV $EVBSQ,@#140002 ;PUT SEQUENCE NUMBER IN SECOND BUFFER POSITION  T;B; ACTIVATE BUFFER DUMP TASKR;W & MOV #1,R0 ;SET UP FOR EVENT FLAG SET MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ;SAVE R3 MOV R4,-(SP) ;SAVE R4 MOV R5,-(SP) ;SAVE R5 MOV $EVTCB,R5 ;SET UP FOR $SETF CALL $SETF MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3P MOV (SP)+,R2E MOV (SP)+,R1I T;U; SET UP LATEST BUFFER;V ' MOV @#140000,$EVLEN ;GET BUFFER LENGTH 7 ADD #140000,$EVLEN ;MAKE LENGTH INTO END OF BUFFER PTRU MOV (SP),R0 ;GET EVENT NUMBERT, MOV $EVTAB(R0),$EVDIS ;SHOW EVENT IN BUFFER+ MOV #140004,R0 ;INITIAL POSITION IN BUFFER< ADD R0,$EVDIS ;MAKE EVDIS REFLECT POSITION AFTER THIS EVENT V;3; PUT INFORMATION IN BUFFERV;, P320$: MOVB (SP)+,(R0)+ ;PUT EVENT NUMBER INTO BUFFERS  M .IF DF M$$PRO (2 MOVB $PROCN,(R0)+ ;PUT PROCESSOR NUMBER IN BUFFER I .IFFU 3 CLRB (R0)+ ;NO PROCESSOR NUMBER ON SINGLE CPU SYSE U .ENDC  A/ INC $EVSEQ ;BUMP EVENT SEQUENCE NUMBER BY ONE 2 MOV $EVSEQ,(R0)+ ;PLACE SEQUENCE NUMBER IN BUFFER1 MOVB $TTNS,(R0)+ ;PLACE TICK OF SECOND IN BUFFERI5 MOVB $TTNS-2,(R0)+ ;PLACE SECOND OF MINUTE IN BUFFERR CLC RETURN  E;H ; ERROR EXIT; U30$: TST (SP)+ ;CLEAN STACK! INC $EVLOS ;INDICATE EVENT LOSTT SEC RETURNF S .ENDC . D .ENDO (2 MOVB $PROCN,(R0)+ ;PUT PROCESSOR NUMBER IN BUFFER I .IFFU 3 CLRB (R0)+ ;NO PROCESSOR NUMBER ON SINGLE CPU SYSE U .ENDC  A/ INC $EVSEQ ;BUMP EVENT SEQUENCE NUMBER BY ONE 2 MOV $EVSEQ,(R0)+ ;PLACE SEQUENCE NUMBER IN BUFFER1 MOVB $TTNS,(R0)+ ;P .TITLE LTDRVS .IDENT /05/; COPYRIGHT (C) 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.O1; DGITAL EQUIPMENT OF CANADA LTD, KANATA, ONTARIOR;RA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDB9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;P ; VERSION 05;P; DAVID R. CROWE;; PREVIOUSLY MODIFIED BY:I;T; DAVID H. CHAN1; HELEN GORDON; PATRICIA C. LEE6;); ; MODIFIED BY:;S; R. E. CALDWELL 21-AUG-79;A!; RC010 -- FIX BUG IN CANCEL I/00gO0B0eeaek›’O#; AND USE CORRECT FORM OF GTPKT$.Y;HH; PARALLEL COMMUNICATION LINK (PCL) TRANSMITTER DRIVER FOR RSX-11M-PLUS.;E; MACRO LIBRARY CALLSA;N .MCALL PKTDF$,TCBDF$,UCBDF$$ PKTDF$ ;DEFINE I/O PACKET OFFSETS- TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS.R UCBDF$ ;DEFINE UCB OFFSETSS;+#; STATE SETTINGS FOR 'STC' FUNCTIONS;-SS.MAS = 1 ;MASTER STATECD;EVENT FLAG FEATURE AND SECONDARY STATE CAPABILITY HAVE BEEN REMOVED;SS.SEC = 2 ;SECONDARY STATESS.NEU = 4 ;NEUTRAL STATE;+"; MODE SETTINGS FOR 'STC' FUNCTION;-MS.AUT = 20 ;AUTO ADDRESSMS.ADS = 40 ;ADDRESS SILO;+; CHARACTERISTIC WORD USAGE.+; U.CW2 IS USED BY THE HANDLER AS FOLLOWS:D; BITS 7-0 CONTAIN NUMBER OF RETRIES TO BE PERFORMED AFTER CURRENT; TRY IF NECESSARY.;-;++; HANDLER UCB WORK AREA OFFSET DEFINITIONS.';-,U.EFN = U.CNT+2 ;'NOWMST' EVENT FLAG NUMBER5U.TCB = U.EFN+2 ;TCB ADDRESS OF EVENT FLAG REQUESTORR9U.BUF1 = U.TCB+2 ;RELOCATION BIAS FOR RETURN REG. BUFFERL;+@; THE HARDWARE REGISTERS ARE DEFINED RELATIVE TO THE TCR, WHOSE?; ADDRESS IS FOUND IN THE S.CSR FIELD OF THE SCB AT RUN TIME.R;-'TCR = 0 ;TRANSMITTER COMMAND REGISTER.L&TSR = 2 ;TRANSMITTER STATUS REGISTER.*TSDB = 4 ;TRANSMITTER SOURCE DATA BUFFER.)TSBC = 6 ;TRANSMITTER SOURCE BYTE COUNT. +TSBA = 10 ;TRANSMITTER SOURCE BUS ADDRESS. /TMMR = 12 ;TRANSMITTER MASTER/MAINTENANCE REG.F#TSCRC = 14 ;TRANSMITTER SOURCE CRCS;+%; TRANSMITTER COMMAND REGISTER (TCR).R;-#RIB = 100000 ;RETRY IF BUSY (R/W).G&TXNPR = 40000 ;TRANSMITTER NPR (R/W). SNDWD = 20000 ;SEND WORD (R/W).+DC04 = 10000 ;DESTINATION CODE BITS (R/W).DC03 = 4000 ; "DC02 = 2000 ; "DC01 = 1000 ; "DC00 = 400 ; "RRDSILO = 200 ;READ SILO (R/W).S"IE = 100 ;INTERRUPT ENABLE (R/W).'A17 = 40 ;EXTENDED ADDRESS BITS (R/W).R A16 = 20 ; "E%DTORDY = 10 ;DATA OUTPUT READY (RO). -INHADI = 4 ;INHIBIT ADDRESS INCREMENT (R/W).T#BDINIT = 2 ;BOARD INITIALIZE (WO).O%STTXM = 1 ;START TRANSMISSION (R/W).0>DC = DC04!DC03!DC02!DC01!DC00 ;UNION OF DESTINATION CODE BITS.;+$; TRANSMITTER STATUS REGISTER (TSR).;-ERR = 100000 ;ERROR (RO).+NEXLOC = 40000 ;NONEXISTENT LOCATION (RO).1'MEMOFL = 20000 ;MEMORY OVERFLOW (R/W). *TXMERR = 10000 ;TRANSMISSION ERROR (R/W)."MSTDWN = 4000 ;MASTER DOWN (R/W).TIMOUT = 2000 ;TIME OUT (R/W).OVERUN = 1000 ;OVERRUN (R/W).%DTIRDY = 400 ;DATA INPUT READY (RO).C)SUCTXF = 200 ;SUCCESSFUL TRANSFER (R/W).ZBUSY = 100 ;BUSY (RO).R"SORE = 40 ;SOFTWARE REJECT (R/W).!TDMBSY = 20 ;TDM BUS BUSY (R/W).NRSPB1 = 10 ;RESPONSE B1 (RO).RSPB0 = 4 ;RESPONSE B0 (RO).RSPA1 = 2 ;RESPONSE A1 (RO)..RSPA0 = 1 ;RESPONSE A0 (RO).L;+1; TRANSMITTER MASTER/MAINTENANCE REGISTER (TMMR).X;-; LOW ORDER BYTE (TMMR+0).-TXMAD4 = 20 ;TRANSMITTER ADDRESS BITS (R/W).TTXMAD3 = 10 ; "(TXMAD2 = 4 ; "TXMAD1 = 2 ; "TXMAD0 = 1 ; "; HIGH ORDER BYTE (TMMR+1).F)AOPRDY = 200 ;ADDRESS OUTPUT READY (RO).1(AIPRDY = 100 ;ADDRESS INPUT READY (RO).&CLRADR = 40 ;CLEAR ADDRESS SILO (WO).!AUTADR = 20 ;AUTO ADDRESS (R/W).O CHNOPN = 10 ;CHANNEL OPEN (RO).NOWMST = 4 ;NOW MASTER (R/W).!SEC = 2 ;SECONDARY MASTER (R/W).MASTER = 1 ;MASTER (R/W).;+; PAD TRANSMITTER ID;-PAD = 31. ;PAD TRANSMITTER ID;+; DEVICE DISPATCH TABLES;-- DDT$ LT,L$$T11,,CHK ;GENERATE DISPATCH TABLE;+; LOCAL IMPURE DATA TABLES;-$PRVAL: .BLKW L$$T11 ;PREVIOUS VALUE*ASCNT: .BLKW L$$T11 ;ADDRESS SILO COUNTER0LFVAL: .BLKW L$$T11 ;VALUES LEFT IN USER BUFFER)FRVAL: .BLKW L$$T11 ;FIRST VALUE IN SILOA;+3; LTCHK - PCL TRANSMITTER DRIVER PARAMETER CHECKING4;NJ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUESTD; IS RECEIVED FOR THE PARALLEL COMMUNICATIONS LINK TRANSMITTER. SOMEF; PCL TRANSMITTER REQUESTS CONTAIN INFORMATION THAT MUST BE CHECKED IND; THE CONTEXT OF THE ISSUING TASK; THEREFORE, THE I/O REQUEST IS NOT#; QUEUED BEFORE CALLING THE DRIVER.L;1 ; INPUTS: ;O ; R1 = ADDRESS OF THE I/O PACKET*; R4 = ADD00gW0N0TADATADATADATADATADATADATADATADATARESS OF THE STATUS CONTROL BLOCK;; R5 = ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATEDV;P ; OUTPUTS:;NB; IF THE QIO FUNCTION IS IO.STC THEN NO PRIOR ADDRESS CHECKING HASE; BEEN PERFORMED BY THE SYSTEM BECAUSE IO.STC IS CLASSED AS A CONTROLS;; FUNCTION. IT IS THEREFORE NECESSARY TO FIRST MOVE ALL THETC; PARAMETERS SO THAT THE ADDRESS DOUBLEWORD FOR THE DATA BUFFER MAY A; BE MOVED TO I.PRM AND I.PRM+2 AFTER IS HAS BEEN ADDRESS CHECKED >; AND RELOCATED. IF THE LENGTH OF THE DATA BUFFER IS ZERO, THEC; ADDRESS CHECK WILL NOT TAKE PLACE AND THE ZERO LENGTH BUFFER WILLE; BE CONSIDERED VALID.;U@; IF THE QIO FUNCTION IS IO.STC OR IO.ATX THEN THE RETURN BUFFER<; ADDRESS IS CHECKED TO DETERMINE WHETHER IT LIES WITHIN THEA; ISSUING TASK'S ADDRESS SPACE. IF IT DOES THEN THE RETURN BUFFERRA; ADDRESS IS RELOCATED AND STORED IN THE I/O PACKET. IF IT IS NOTHB; A VALID ADDRESS THEN AN ILLEGAL BUFFER STATUS IS RETURNED AS THE"; FINAL I/O STATUS OF THE REQUEST.; ;; FOR ALL FUNCTION CODES, THE I/O PACKET IS INSERTED IN THEI?; CONTROLLER QUEUE AND THE DEVICE INITIATOR IS ENTERED TO STARTE; THE CONTROLLER.T;-7LTCHK: CMP #IO.ATX,I.FCN(R1) ;IS FUNCTION CODE = 'ATX'?D BEQ 30$ ;IE EQ YES1 CMP #IO.STC,I.FCN(R1) ;IS FUNCTION CODE = 'STC'?S BNE 60$ ;IF NE NO ;SB; 'STC' FUNCTION - MOVE ALL PARAMETERS TO MAKE WAY FOR DATA BUFFER; ADDRESS DOUBLEWORD;/10$: MOV R1,R3 ;SAVE ADDRESS OF THE I/O PACKETS; MOV I.PRM+12(R3),I.PRM+14(R3) ;MOVE RETURN BUFFER ADDRESSO7 MOV I.PRM+10(R3),I.PRM+12(R3) ;MOVE EVENT FLAG NUMBER) MOV I.PRM+6(R3),I.PRM+10(R3) ;MOVE MODE * MOV I.PRM+4(R3),I.PRM+6(R3) ;MOVE STATUS4 MOV I.PRM+2(R3),I.PRM+4(R3) ;MOVE LENGTH OF BUFFER BEQ 30$ ;IF EQ LENGTH = 0& BLT 15$ ;IF LT INVALID BUFFER LENGTH;'3; SET UP REGISTERS FOR ADDRESS CHECK AND RELOCATIONM; - MOV I.PRM(R3),R0 ;DATA BUFFER ADDRESS ==> R0D% MOV I.PRM+2(R3),R1 ;LENGTH ==> REG 1S CALL $ACHCK ;CHECK THE LENGTHM BCS 15$ ;IF CS, ERRORR2 MOV W.BATT(R2),R2 ;PICK UP ATTACHMENT DESC. ADDR. INCB A.IOC(R2) ;LOCK REGION/ MOV R2,I.AADA(R3) ;SAVE PTR IN PKT FOR $IODONED BR 20$ ;CONTINUE;P; INVALID BUFFER;S215$: MOV #IE.SPC&377,R0 ;SET ILLEGAL BUFFER STATUS2 CALLR $IOFIN ;CALL FINISH I/O OPERATION AND EXIT;L"; RELOCATE THE DATA BUFFER ADDRESS;S620$: CALL $RELOC ;GO RELOCATE THE DATA BUFFER ADDRESS& MOV R1,I.PRM(R3) ;SET RELOCATION BIAS' MOV R2,I.PRM+2(R3) ;SET 16-BIT ADDRESSH( BR 40$ ;GO CHECK RETURN BUFFER ADDRESS;O; 'STC' OR 'ATX' FUNCTIONK; 30$: MOV R1,R3 ;SAVE I/O PACKET>40$: MOV I.PRM+14(R3),R0 ;GET VIRTUAL ADDRESS OF RETURN BUFFER5 MOV #14.,R1 ;SET LENGTH OF RETURN BUFFER TO 7 WORDS: CALL $ACHCK ;CHECK THE ADDRESS BCS 15$ ;IF CS BAD2 MOV W.BATT(R2),R2 ;PICK UP ATTACHMENT DESC. ADDR. INCB A.IOC(R2) ;LOCK REGION1 MOV R2,I.AADA+2(R3) ;SAVE PTR IN PKT FOR $IODONER;D$; RELOCATE THE RETURN BUFFER ADDRESS;I# CALL $RELOC ;RELOCATE USER BUFFERD: MOV R1,I.PRM+14(R3) ;SET RELOCATION BIAS OF RETURN BUFFER9 MOV R2,I.PRM+16(R3) ;SET 16-BIT ADDRESS OF RETURN BUFFER$ MOV R3,R1 ;COPY I/O PACKET ADDRESS;R$; INSERT THE I/O PACKET IN THE QUEUE;L,60$: MOV R4,R0 ;SET R0 = I/O QUEUE LISTHEAD( CALL $QINSP ;GO INSERT PACKET IN QUEUE;; GET THE QUEUED I/O PACKETT;H1LTINI: GTPKT$ LT,L$$T11,,,T ;GET I/O PACKET MACROV;,(; ANALYZE THE CONTENTS OF THE I/O PACKET;D; R1 = I/O PACKETT.; R2 = PHYSICAL UNIT NUMBER OF THE REQUEST UCB; R3 = CONTROLLER INDEXR; R4 = STATUS CONTROL BLOCK ; R5 = UNIT CONTROL BLOCK.;+; I/O REQUEST PACKET FORMAT ;U; WD.00 = I/O QUEUE THREAD WORD -; WD.01 = REQUEST PRIORITY, EVENT FLAG NUMBERT'; WD.02 = TSB ADDRESS OF REQUESTER TASK/:; WD.03 = POINTER TO 2ND LUN WORD IN REQUESTER TASK HEADER;; WD.04 = CONTENTS OF 1ST LUN WORD IN REQUESTER TASK HEADER,; WD.05 = I/O FUNCTION CODE,-; WD.06 = VIRTUAL ADDRESS OF I/O STATUS BLOCK-; WD.07 = RELOCATION BIAS OF I/O STATUS BLOCK "; WD.10 = I/O STATUS BLOCK ADDRESS0; WD.11 = VIRTUAL ADDRESS OF AST SERVICE ROUTINE(; WD.12 = RELOCATION BIAS OF DATA BUFFER'; WD.13 = 16-BIT00g_0B0eeaek›’ ADDRESS OF DATA BUFFERW; WD.14 = LENGTH OF DATA BUFFER ; WD.15 = FLAG WORD OR STATE; WD.16 = ID OR MODE0; WD.17 = NUMBER OF RETRIES OR EVENT FLAG NUMBER*; WD.20 = RELOCATION BIAS OF RETURN BUFFER); WD.21 = 16-BIT ADDRESS OF RETURN BUFFER0; / TST U.EFN(R5) ;WAS EFN FOR 'NOWMST' SPECIFIED?I BEQ 5$ ;IF EQ NO, MOV S.CSR(R4),R0 ;YES, RETREIVE CSR ADDRESS BIS #IE,(R0) ;ENABLE INTERRUPTS05$: MOV I.TCB(R1),R0 ;GET REQUESTER TCB ADDRESS.0 BITB #T2.ABO,T.ST2(R0) ;IS TASK BEING ABORTED? BEQ 10$ ;IF EQ NO " CALLR IEVER ;YES, REJECT REQUEST;B;; DISPATCH PACKET FOR PROCESSING ACCORDING TO FUNCTION CODE ;1110$: CMP #IO.ATX,I.FCN(R1) ;IS IT 'ATX' FUNCTION?  BEQ ATX ;IF EQ YES- CMP #IO.SEC,I.FCN(R1) ;IS IT 'SEC' FUNCTION?N BEQ IOSEC ;IF EQ YES- CMP #IO.STC,I.FCN(R1) ;IS IT 'STC' FUNCTION?  BEQ STC ;IF EQ YES$ CALLR IEIFC ;INVALID FUNCTION CODE;+; PROCESS 'ATX' FUNCTION; ; REQUIRED INPUTS:; R1 = I/O PACKETR.; R2 = PHYSICAL UNIT NUMBER OF THE REQUEST UCB; R3 = CONTROLLER INDEXN; R4 = STATUS CONTROL BLOCKT; R5 = UNIT CONTROL BLOCKC;-ATX: ;REF LABEL .IF DF M$$EXT( CALL $STMAP ;SET UP UNIBUS MAP ADDRESS# CALL $MPUBM ;MAP UNIBUS TO MEMORYC MOV S.PKT(R4),R1 ;RESTORE REG 1 .ENDC. CMPB I.PRM+11(R1),#DC/400 ;CPU ID > MAXIMUM? BHI LTBAD ;IF HI YES TSTB I.PRM+11(R1) ;CPU ID = 0?  BEQ LTBAD ;IF EQ YES& TSTB I.PRM+13(R1) ;RETRY COUNT > 255? BNE LTBAD ;IF NE YES4 MOVB I.PRM+12(R1),U.CW2(R5) ;SAVE RETRY COUNT BYTE.;B.; SET UP RETURN REGISTER BUFFER ADDRESS IN UCB;L6 MOV I.PRM+14(R1),U.BUF1(R5) ;RELOCATION BIAS ==> UCB6 MOV I.PRM+16(R1),U.BUF1+2(R5) ;16-BIT ADDRESS==> UCB2RETRY: MOV S.CSR(R4),R0 ;GET DEVICE ADDRESS (TSR).$ MOV #BDINIT,(R0) ;BOARD INITIALIZE.9 MOV I.PRM+6(R1),TSDB(R0) ;MOVE FLAGS WORD TO DATA SILO.I2 MOV U.BUF+2(R5),TSBA(R0) ;SET UP BUFFER ADDRESS.! MOV U.CNT(R5),R2 ;GET BYTE COUNTR NEG R2 ;NEGATE IT.) MOV R2,TSBC(R0) ;PUT IT IN PCL REGISTER.+) MOVB I.PRM+11(R1),TCR+1(R0) ;SET CPU ID.B6 BIS #RIB!TXNPR!SNDWD!IE!STTXM,U.BUF(R5) ;SET EXTENDED, BIS U.BUF(R5),(R0) ;ADDR & GO BITS IN TCR.* MOVB S.ITM(R4),S.CTM(R4) ;- SET TIME OUT RETURN ;>#LTBAD: CALLR IEBAD ;BAD PARAMETERSC;+; PROCESS 'SEC' FUNCTION; ; REQUIRED INPUTS:; R4 = STATUS CONTROL BLOCKO;-+IOSEC: MOV S.CSR(R4),R0 ;GET DEVICE ADDRESS(1 MOV TMMR(R0),R1 ;MOVE SECOND WORD FOR IOSB TO R1T, MOV #IS.SUC&377,R0 ;GET SUCCESS STATUS CODE# CALL $IODON ;GO EXIT THIS REQUESTV! BR LTINI ;GO LOOK FOR MORE WORKD;+; PROCESS 'STC' FUNCTION;U; REQUIRED INPUTS:; R1 = I/O PACKET(.; R2 = PHYSICAL UNIT NUMBER OF THE REQUEST UCB; R3 = CONTROLLER INDEX; R4 = STATUS CONTROL BLOCKI; R5 = UNIT CONTROL BLOCK+;--STC: MOV I.TCB(R1),R0 ;GET TASK'S TCB ADDRESS / BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVLEGED?R BEQ 35$ ;IF EQ NOD$ TST I.PRM+6(R1) ;'STATE' SPECIFIED? BEQ 10$ ;IF EQ NO* CMP #SS.MAS,I.PRM+6(R1) ;IS IT 'MASTER'? BEQ 10$ ;IF EQ YESD;EVENT FLAG FEATURE AND SECONDARY STATE CAPABILITY HAVE BEEN REMOVED.; CMP #SS.SEC,I.PRM+6(R1) ;IS IT 'SECONDARY'?; BEQ 10$ ;IF EQ YESI+ CMP #SS.NEU,I.PRM+6(R1) ;IS IT 'NEUTRAL'?N% BNE LTBAD ;IF NE NO, BAD PARAMETERSL;I; VALIDATE THE 'MODE' PARAMETER;T(10$: TST I.PRM+10(R1) ;'MODE' SPECIFIED? BEQ 20$ ;IF EQ NO30 CMP #MS.AUT,I.PRM+10(R1) ;IS 'AUTO' SPECIFIED? BEQ 20$ ;IF EQ YES8 CMP #MS.ADS,I.PRM+10(R1) ;IS 'ADDRESS SILO' SPECIFIED?% BNE LTBAD ;IF NE NO, BAD PARAMETERSI;QD;EVENT FLAG FEATURE AND SECONDARY STATE CAPABILITY HAVE BEEN REMOVED ; VALIDATE THE EVENT FLAG NUMBER;I20$: BR 40$#; TST I.PRM+12(R1) ;EVENT FLAG > 0?I; BLE 30$ ;IF LE NO%; CMP #96.,I.PRM+12(R1) ;IS IT > 96?R; BGT 40$ ;IF GT NO%30$: CALLR IEIEF ;INVALID EVENT FLAGI%35$: CALLR IEPRI ;PRIVLEGE VIOLATION$;I3; VALIDATE THE SIZE AND CONTENTS OF THE DATA BUFFERF;?140$: TST I.PRM+4(R1) ;IS SIZE OF BUFFER > OR = 0?; BLT 54$ ;IF LT NOC BEQ 60$ ;IF EQ SIZE=0E;,.; INITIALIZE VALUES FOR LOOPING THROUGH BUFFER;D6 MOV #50.,ASCNT(R3) ;SAVE MAX NUMBER OF 00gg0N0TADATADATADATADATADATADATADATADATAVALUES ALLOWED6 CMP I.PRM+4(R1),ASCNT(R3) ;IS # OF VALUES > MAXIMUM? BGT 54$ ;IF GT YES1 CLR PRVAL(R3) ;INITIALIZE PREVIOUS VALUE TO ZERO , MOV I.PRM+4(R1),LFVAL(R3) ;GET # OF VALUES. MOV I.PRM(R1),U.BUF(R5) ;GET RELOCATION BIAS1 MOV I.PRM+2(R1),U.BUF+2(R5) ;GET VITUAL ADDRESSS; 7; CHECK ALL VALUES IN THE BUFFER FOR WITHIN VALID RANGEF; ; PRVAL(R3) = PREVIOUS VALUE4; ASCNT(R3) = # VALUES STILL POSSIBLE TO ADD TO SILO+; LFVAL(R3) = # VALUES STILL IN USER BUFFERN;3250$: CALL $GTBYT ;RETRIEVE NEXT BYTE ON THE STACK TSTB (SP) ;IS VALUE > 0? BEQ 51$ ;IF EQ NO$' CMPB (SP),#DC/400 ;IS VALUE > MAXIMUM?P BLE 52$ ;IF LE NO -51$: MOVB (SP)+,PRVAL(R3) ;CLEAN UP THE STACK BR 54$ ;INVALID DATA BUFFERR;C; CHECK FOR PAD VALUE NEEDED;F-52$: CMPB (SP),PRVAL(R3) ;IS IT = LAST VALUE?A BNE 53$ ;IF NE NOR0 DEC ASCNT(R3) ;DECREMENT MAXIMUM VALUES ALLOWED;E,; DECREMENT COUNTERS AND SAVE PREVIOUS VALUE; 653$: MOVB (SP)+,PRVAL(R3) ;SAVE THIS VALUE AS PREVIOUS0 DEC ASCNT(R3) ;DECREMENT MAXIMUM VALUES ALLOWED$ BGE 55$ ;IF GE STILL WITHIN LIMITS(54$: CALLR IESPC ;ILLEGAL BUFFER FORMAT;ME; DECREMENT NUMBER OF BYTES STILL IN USER BUFFER AND GO GET NEXT BYTE ;C255$: DEC LFVAL(R3) ;DECREMENT # BYTES YET TO CHECK BGT 50$ ;IF GT GET NEXTC; 0; ALL PARAMETERS ARE VALID - PROCESS THE REQUEST;E60$: BR 70$T4; TST U.TCB(R5) ;HAS A TASK REQUESTED AN EVENT FLAG?; BEQ 62$ ;IF EQ NO7; CMP I.TCB(R1),U.TCB(R5) ;IS THIS THE SAME REQUESTOR?L; BEQ 61$ ;IF EQ YESC,; CALLR IEFLG ;EVENT FLAG ALREADY SPECIFIED;$-; DECREMENT I/O COUNT FOR PREVIOUS EVENT FLAG ;L.;61$: MOV U.TCB(R5),R0 ;GET PREVIOUS REQUESTOR1; DECB T.IOC(R0) ;DECREMENT REQUESTOR'S I/O COUNT;;; SET UP TCB & EVENT FLAG ;E:;62$: MOV I.PRM+12(R1),U.EFN(R5) ;SET UP EVENT FLAG NUMBER%; BNE 63$ ;IF NE NON-ZERO EVENT FLAGE$; CLR U.TCB(R5) ;ZERO REQUESTORS TCB$; BR 70$ ;GO PROCESS NEXT PARAMETER;2?; EVENT FLAG HAS BEEN SPECIFIED, SETUP TCB IN UCB AND INCREMENTT ; I/O COUNT.;;+;63$: MOV I.TCB(R1),R0 ;SAVE REQUESTORS TCBY; MOV R0,U.TCB(R5) ; ; INCB T.IOC(R0) ;LOCK DOWN TASK;A"; INITIALIZE BASE REGISTER ADDRESS;V$70$: MOV S.CSR(R4),R0 ;TSR ==> REG 0* TST I.PRM+6(R1) ;WAS A 'STATE' SPECIFIED? BEQ 80$ ;IF EQ NO3 CMP #SS.MAS,I.PRM+6(R1) ;IS MASTER STATE DESIRED?U BNE 71$ ;IF NE NON, MOV #MASTER,ASCNT(R3) ;SET MASK FOR MASTER BR 73$ ;GO CHANGE TMMR71$:7; CMP #SS.SEC,I.PRM+6(R1) ;IS SECONDARY STATE DESIRED?S; BNE 72$ ;IF NE NO,; MOV #SEC,ASCNT(R3) ;SET MASK FOR SECONDARY; BR 73$ ;GO CHANGE TMMR$72$: CLR ASCNT(R3) ;SET NEUTRAL MASK:73$: MOVB TMMR+1(R0),PRVAL(R3);GET HIGH ORDER BYTE OF TMMR2 BICB #MASTER!SEC,PRVAL(R3) ;CLEAR PREVIOUS STATE) BISB ASCNT(R3),PRVAL(R3) ;SET NEW STATE 6 MOVB PRVAL(R3),TMMR+1(R0) ;STORE NEW HIGH ORDER BYTE: MOVB TMMR+1(R0),PRVAL(R3) ;GET NEW HIGH ORDER BYTE AGAIN0 BICB #374,PRVAL(R3) ;CLEAR ALL BUT DESIRED BITS0 CMPB ASCNT(R3),PRVAL(R3) ;IS ACTUAL = DESIRED? BEQ 80$ ;IF EQ YES;OD; NOT DESIRED STATE - CHECK FOR VALID EXCEPTION (SECONDARY==>MASTER);+ BITB #MASTER,PRVAL(R3) ;IS IT NOW MASTER?: BNE 80$ ;IF NE YES& CALLR IEVER ;HARDWARE REJECTED STATE;S; SET UP ADDRESS SILOA;R380$: TST I.PRM+4(R1) ;IS LENGTH OF DATA BUFFER = 0?T BEQ 90$ ;IF EQ YES; MOVB TMMR+1(R0),PRVAL(R3);RETRIEVE HIGH ORDER BYTE OF TMMRR= BISB #CLRADR!AUTADR,PRVAL(R3) ;CLEAR SILO AND SET AUTO ADRS 6 MOVB PRVAL(R3),TMMR+1(R0) ;STORE NEW HIGH ORDER BYTE; (; REINITIALIZE UCB FOR THE DATA TRANSFER;E2 MOV I.PRM(R1),U.BUF(R5) ;RELOCATION BIAS ==> UCB5 MOV I.PRM+2(R1),U.BUF+2(R5) ;16-BIT ADDRESS ==> UCBR/ CLR ASCNT(R3) ;ZERO ADDRESS SILO ENTRY COUNTER * CLR PRVAL(R3) ;SET PREVIOUS VALUE TO ZERO; MOV I.PRM+4(R1),LFVAL(R3) ;INITIALIZE DATA BUFFER COUNTERQ;$7; MOVE EACH BYTE OF THE DATA BUFFER TO THE ADDRESS SILOD;B; PRVAL(R3) = PREVIOUS VALUE"; ASCNT(R3) = ADDRESS SILO COUNTER*; LFVAL(R3) = # BYTES STILL IN DATA BUFFER!; FRVAL(R3) = FIRST VALUE IN SILOT;I381$: CALL $GTBYT ;RETRIEVE A BYTE FROM USER BUFFERF' CMPB (SP),P00go0B0eeaek›’RVAL(R3) ;IS IT = PREVIOUS?M BNE 82$ ;IF NE NO1' MOVB #PAD,TMMR(R0) ;INSERT A PAD VALUEE4 INC ASCNT(R3) ;INCREMENT ADDRESS SILO ENTRY COUNTER582$: MOVB (SP),PRVAL(R3) ;SAVE THIS VALUE AS PREVIOUSI# TST ASCNT(R3) ;IS THIS FIRST BYTE?E BGT 83$ ;IF GT NOA& MOVB (SP),FRVAL(R3) ;SAVE FIRST VALUE783$: MOVB (SP)+,TMMR(R0) ;INSERT THE USER VALUE IN SILOR. INC ASCNT(R3) ;INCREMENT ADDRESS SILO COUNTER- DEC LFVAL(R3) ;DECREMENT # BYTES YET TO MOVE  BGT 81$ ;IF GT GET NEXT BYTE; CMP #20.,ASCNT(R3) ;HAVE AT LEAST 20 VALUES BEEN INSERTED?$ BLE 84$ ;IF LE YES;TE; LESS THAN THE MINIMUM NUMBER OF VALUES HAVE BEEN MOVED - REPEAT THET; PATTERN AGAINM; 2 MOV I.PRM(R1),U.BUF(R5) ;RELOCATION BIAS ==> UCB5 MOV I.PRM+2(R1),U.BUF+2(R5) ;16-BIT ADDRESS ==> UCBM3 MOV I.PRM+4(R1),LFVAL(R3) ;SET UP # BYTES TO MOVE, BR 81$ ;GO MOVE THE VALUES;N*; ALL BYTES MOVED - CHECK FOR FIRST = LAST;C084$: CMPB PRVAL(R3),FRVAL(R3) ;IS FIRST = LAST? BNE 90$ ;IF NE NOT- MOVB #PAD,TMMR(R0) ;MOVE A PAD VALUE TO SILOA,90$: TST I.PRM+10(R1) ;WAS A MODE SPECIFIED? BEQ 100$ ;IF EQ NO5 MOVB TMMR+1(R0),PRVAL(R3);RETRIEVE HIGH BYTE OF TMMRH3 CMP #MS.AUT,I.PRM+10(R1) ;AUTO ADDRESS SPECIFIED?R BNE 91$ ;IF NE NOB* BISB #AUTADR,PRVAL(R3) ;SET AUTO ADDRESS BR 92$ ;GO RESTORE TMMR+1);V; ADDRESS SILO REQUESTED;V?91$: BICB #AUTADR,PRVAL(R3) ;CLEAR AUTO ADDRESS (IMPLIES SILO)O892$: MOVB PRVAL(R3),TMMR+1(R0);RESTORE HIGH BYTE OF TMMR:100$: MOV I.PRM+14(R1),U.BUF1(R5) ;RELOCATION BIAS ==> UCB6 MOV I.PRM+16(R1),U.BUF1+2(R5) ;16-BIT ADDRESS ==> UCB BEQ 110$ ;IF EQ NO" CALL REGRET ;GO RETURN REGISTERS-110$: CALLR ISSUC ;INDICATE SUCCESS AND EXITP;+E; REGRET -- SERVICE ROUTINE TO RETURN THE CONTENTS OF THE TRANSMITTERAA; SIDE REGISTERS TO THE USER BUFFER WHOSE ADDRESS IS SPECIFIED INSA; U.BUF1 AND U.BUF1+2 IN THE UCB. THE CONTROL REGISTER ADDRESS ISE?; CONTAINED IN R0. U.BUF AND U.BUF+2 ARE PRESERVED ACROSS CALL.Y;-,REGRET: TST U.BUF1(R5) ;RELOCATION BIAS = 0? BNE 10$ ;IF NE NOM) TST U.BUF1+2(R5) ;IS 16 BIT ADDRESS = 0?S BEQ 20$ ;IF EQ YES$10$: MOV U.BUF(R5),-(SP) ;SAVE U.BUF% MOV U.BUF+2(R5),-(SP) ;SAVE U.BUF+2C/ MOV U.BUF1(R5),U.BUF(R5) ;GET RELOCATION BIAS 3 MOV U.BUF1+2(R5),U.BUF+2(R5) ;GET VIRTUAL ADDRESSG .REPT 7# MOV (R0)+,-(SP) ;GET WORD TO STOREI# CALL $PTWRD ;PUT WORD INTO BUFFERE .ENDR( MOV (SP)+,U.BUF+2(R5) ;RESTORE U.BUF+2# MOV (SP)+,U.BUF(R5) ;RESTORE U.BUFV20$: RETURN ;;+; INTERRUPT SERVICE ROUTINEA;- .ENABL LSBE$LTINT::4 INTSV$ LT,PR5,L$$T11 ;;;EXECUTE INTERRUPT SAVE CODE% MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS.-% MOV S.CSR(R4),R4 ;;;GET TCR ADDRESS.)$ BIC #IE,(R4) ;;;DISABLE INTERRUPTS.) BITB #US.BSY,U.STS(R5) ;;;IS UNIT BUSY?( BEQ 10$ ;;;IF EQ NOI! TST TSR(R4) ;;;ERROR CONDITION?+ BPL 5$ ;;;IF PL, NO ERRORC' CALL $FORK ;;;CREATE A SYSTEM PROCESSR JMP ERROR ;GO HANDLE ERRORSO5$: TSTB TSR(R4) ;;;SUCTXF? BMI 30$ ;;;IF MI YES1 BIT #SORE,TSR(R4) ;;;HAVE WE A SOFTWARE REJECT ?- BNE 20$ ;;;IF NE YES10$:D;EVENT FLAG FEATURE AND SECONDARY STATE CAPABILITY HAVE BEEN REMOVED4; BITB #NOWMST,TMMR+1(R4) ;;;HAVE WE BECOME MASTER?; BNE 50$ ;;;IF NE YESD) BIS #BDINIT,(R4) ;;;TX INIT JUST IN CASE  RETURN ;;;RETURN FOR MORE;I; PROCESS SOFTWARE REJECTE;R120$: BIC #SORE,(R4) ;;;CLEAR THE INTERRUPTING BITF# CALL $FORK ;;;CREATE FORK PROCESSP MOV R4,R0 ;COPY CSR ADDRESS CALL REGRET ;RESTORE REGISTERS CALLR IEREJ ;REJECT REQUESTR630$: BIC #SUCTXF,TSR(R4) ;;;CLEAR THE INTERRUPTING BIT# CALL $FORK ;;;CREATE FORK PROCESSD MOV R4,R0 ;COPY CSR ADDRESSR CALL REGRET ;RESTORE REGISTERS, MOV #IS.SUC&377,R0 ;GET SUCCESS STATUS CODE/ BIT #SORE,TSR(R4) ;WAS TRANSMISSION TRUNCATED?  BEQ 40$ ;IF EQ NO + BIC #SORE,TSR(R4) ;CLEAR THE SORE BIP ALSO INC R0 ;BUMP STATUS TO IS.TNRI040$: MOV U.CNT(R5),R1 ;GET # OF BYTES TRANSFERED CALL $IODON ;FINISH I/O  JMP LTINI ;TRY FOR MORESD;EVENT FLAG FEATURE AND SECONDARY STATE CAPABILITY HAVE BEEN REMOVED;)#; NOWMST INTERRUPT - SET EVENT FLAG ;R(00gw0N0TADATADATADATADATADATADATADATADATA;50$: CALL $FORK ;;;CREATE FORK PROCESS(; MOV U.SCB(R5),R3 ;RETREIVE SCB ADDRESS.; MOVB S.CON(R3),R3 ;RETREIVE CONTROLLER INDEX-; MOVB TMMR+1(R4),PRVAL(R3) ;RETRIEVE TMMR+1U-; BICB #NOWMST,PRVAL(R3) ;CLEAR 'NOWMST' BITR,; MOVB PRVAL(R3),TMMR+1(R4) ;RESTORE TMMR+1; MOV R5,PRVAL(R3) ;SAVE REG 5'; MOV U.EFN(R5),R0 ;EVENT FLAG # ==> R0 ); MOV U.TCB(R5),R5 ;REQUESTORS TCB ==> R5M; BEQ 51$ ;IF EQ NONE+; CALL $CEFI ;GO CONSTRUCT EVENT FLAG MASKM$; BCS 51$ ;IF CS NO EVENT SPECIFIED; BIS R0,(R1) ;SET EVENT FLAG); CALL $DRDSE ;DECLARE SIGNIFICANT EVENT;/; DECB T.IOC(R5) ;UNLOCK TCB, EFN IS GOING AWAYV%;51$: MOV PRVAL(R3),R5 ;RESTORE REG 5R; CLR U.EFN(R5) ;T; CLR U.TCB(R5) ;M); RETURN ;RETURN TO INTERRUPTED PROGRAMP .DSABL LSB+;+A; WE HAVE AN ERROR CONDITION. WE WILL DETERMINE THE CAUSE OF THE03; ERROR AND TAKE THE APPROPRIATE ACTION AS FOLLOWS:S;B; OVERRUN = IE.BBE;; TIMEOUT = IE.DNRE; MASTER DOWN = IE.DNR ; XMIT ERROR; RSP B = 00 = IE.DNRS; RSP B = 01,10,11 = IE.BBE:; MEM OVERFLOW = INCREMENT A16-17, CLEAR ERROR, ENABLE IE,; SET STTXMK; NEM = SET BDINIT, IE.SPC$;-#ERROR: MOV R4,R0 ;COPY CSR ADDRESS. CALL REGRET ;RESTORE REGISTERS% MOV TSR(R4),R1 ;GET CONTENTS OF TSR.P$ BIT #OVERUN,R1 ;CHECK FOR OVER RUN. BNE 110$ ;IF NE OVERRUNR' BIT #MSTDWN,R1 ;CHECK FOR MASTER DOWN.T BNE 130$ ;IF NE MASTER DOWNS$ BIT #TIMOUT,R1 ;CHECK FOR TIME OUT. BNE 120$ ;IF NE TIMEOUT . BIT #TXMERR,R1 ;CHECK FOR TRANSMISSION ERROR.$ BNE 140$ ;IF NE TRANSMISSION ERROR) BIT #MEMOFL!NEXLOC,R1 ;OVERFLOW OR NEM?  BNE 170$ ;IF NE YEST' BIS #BDINIT,(R4) ;INIT THE BOARD AGAIN RETURN ;,;+; PROCESS OVERRUN CONDITIONT;-5110$: BIC #OVERUN,TSR(R4) ;CLEAR THE INTERRUPTING BIT! CALLR IEBBE ;TRANSMISSION ERROR.;+; PROCESS TIMEOUTU;-5120$: BIC #TIMOUT,TSR(R4) ;CLEAR THE INTERRUPTING BITN CALLR IEDNR ;DEVICE NOT READYC;+; PROCESS MASTER DOWN.;-5130$: BIC #MSTDWN,TSR(R4) ;CLEAR THE INTERRUPTING BITO. MOV #IE.DNR&377,R0 ;GET DEVICE NOT READY CODE BR 150$ ;GO TRY FOR A RETRYN;+; PROCESS TRANSMISSION ERROR.D;-(140$: BIC #TXMERR,TSR(R4) ;CLEAR INT BIT# BIT #RSPB1!RSPB0,R1 ;IF RSPB IS 00-" BEQ 120$ ;IF EQ TREAT AS TIMEOUT3 MOV #IE.BBE&377,R0 ;GET TRANSMIT ERROR STATUS CODER'150$: MOV U.SCB(R5),R4 ;GET SCB ADDRESS$- MOV S.PKT(R4),R1 ;LOAD ADDRESS OF I/O PACKETI' DECB U.CW2(R5) ;DECREMENT RETRY COUNT.+ BGE 160$ ;IF GE RETRY CALLR IODON ;FINISH UP160$: JMP RETRY ;GO TRY AGAIN;+1; PROCESS MEMORY OVERFLOW & NONEXISTENT LOCATION.$;-)170$: BIS #BDINIT,(R4) ;INITIALIZE BOARD.I( CALLR IESPC ;RETURN NON-EXISTANT ERROR;+; CANCEL I/O OPERATION;B ; INPUTS:P;S; R0 = I/O PACKET ADDRESSA; R1 = TCB ADDRESS; R3 = CONTROLLER INDEXI; R4 = SCB ADDRESS; R5 = UCB ADDRESS;-!LTCAN: MTPS #0 ;;;LOWER PRIORITY 7 CMP R1,U.TCB(R5) ;DID THIS TASK ASK FOR AN EVENT FLAG?R BNE 10$ ;IF NE NO0. DECB T.IOC(R1) ;UNLOCK TCB, EFN IS GOING AWAY' CLR U.EFN(R5) ;CLEAR EVENT FLAG NUMBERC$ CLR U.TCB(R5) ;CLEAR REQUESTORS TCB"10$: TSTB S.STS(R4) ;IS UNIT BUSY? BEQ LTPWF ;IF EQ THEN YESI: CMP R1,I.TCB(R0) ;IS CANCEL REQUEST FOR THE CURRENT TASK?$ BNE LTPWF ;IF NE, NO SIMPLY RETURN+ MOV #IE.ABO&377,R0 ;LOAD ABORT STATUS CODER BR ABORT ;ABORT THIS OPERATION LTPWF: RETURN ;NO, JUST RETURN;+; TIMEOUT SERVICE ;-6LTOUT: MOV #IE.DNR&377,R0 ;LOAD NOT READY STATUS CODE.)ABORT: MOV S.CSR(R4),R2 ;GET TSR ADDRESS. . BIS #BDINIT,(R2) ;INITIALIZE PCL TRANSMITTER. BR IODON ;FINISH I/O;+,; PROCESS ERROR CONDITIONS AND CALL I/O DONE;-)IEBAD: MOV #IE.BAD&377,R0 ;BAD PARAMETERSP BR IODON ;-IEBBE: MOV #IE.BBE&377,R0 ;TRANSMISSION ERRORP BR IODON ;+IEDNR: MOV #IE.DNR&377,R0 ;DEVICE NOT READY BR IODON ;7IEFLG: MOV #IE.FLG&377,R0 ;EVENT FLAG ALREADY SPECIFIED BR IODON ;-IEIEF: MOV #IE.IEF&377,R0 ;INVALID EVENT FLAGR BR IODON ;0IEIFC: MOV #IE.IFC&377,R0 ;INVALID FUNCTION CODE BR IODON ;-IEPRI: MOV #IE.PRI&377,R0 ;PRIVLEGE VIOLATIONO BR IODON ;,00g0h€0eeaek›’IEREJ: MOV #IE.REJ&377,R0 ;TRANSFER REJECTED BR IODON ;-IESPC: MOV #IE.SPC&377,R0 ;INVALID PARAMETERSO BR IODON ;'IEVER: MOV #IE.VER&377,R0 ;PARITY ERROR BR IODON ;/ISSUC: MOV #IS.SUC&377,R0 ;SUCCESSFUL OPERATION IODON: CALL $IOALT ;FINISH I/OR JMP LTINI ;TRY FOR MOREF .END IODON ;-IEIEF: MOV #IE.IEF&377,R0 ;INVALID EVENT FLAGR BR IODON ;0IEIFC: MOV #IE.IFC&377,R0 ;INVALID FUNCTION CODE BR IODON ;-IEPRI: MOV #IE.PRI&377,R0 ;PRIVLEGE VIOLATIONO BR IODON ;, .TITLE AFSUBU .IDENT /01.01/ N; ; COPYRIGHT (C) 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDB9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;.; VERSION 01.01 ;; J. E. PROVINO 18-JUL-78W;A; MODIFIED BY:; ; B. S. MCCARTHY 10-JUN-81;L5; BM122 -- REMOVAL OF TASK HEADERS FROM PRIMARY POOL ;!; CPU AFFINITY COMMON SUBROUTINESD;1;+'; **-$TSTAT-TEST AFFINITY (SPECIFY TCB) '; **-$TSTAP-TEST AFFINITY (SPECIFY PCB)N(; **-$TSTAM-TEST AFFINITY (SPECIFY MASK);Q<; THESE ROUTINES DETERMINE IF A SPECIFIED RUN MASK IS VALID.;I ; INPUTS:A;C; R0=TCB ADDRESS ($TSTAT); PCB ADDRESS ($TSTAP)I; RUN MASK ($TSTAM);E ; OUTPUTS:;O; C=1 IF RUN MASK IS INVALID; C=0 IF RUN MASK IS VALID;-  .  .IF DF M$$PRO .ENABL LSB-&$TSTAT::MOV R0,-(SP) ;SAVE TCB ADDRESS# MOV T.RRM(R0),R0 ;GET TCB RUN MASKU BR 10$ ;GO TO COMMON CODEE&$TSTAP::MOV R0,-(SP) ;SAVE PCB ADDRESS# MOV P.RRM(R0),R0 ;GET PCB RUN MASKS BR 10$ ;GO TO COMMON CODES#$TSTAM::MOV R0,-(SP) ;SAVE RUN MASK 10$: MOV R1,-(SP) ;SAVE R1# MOV $URMST,R1 ;GET URM STATUS WORDE COM R1 ;COMPLEMENT ITD+ BIT R0,R1 ;ARE THE SPECIFIED RUNS ONLINE?  BNE 40$ ;NO IF NEF@ MOV #<-2>,R1 ;POINT TO TABLE ENTRY FOR LAST PROCESSOR$20$: CLC ;ASSUME RUN MASK IS VALID+ BIT $BTMSK(R1),$URMST ;IS THIS CPU ONLINE?M BEQ 30$ ;NO IF EQM4 BIT $CRMTB(R1),R0 ;IS MASK VALID ON THIS PROCESSOR? BEQ 50$ ;YES IF EQ*30$: SUB #2,R1 ;POINT TO NEXT TABLE ENTRY BGE 20$ ;MORE ENTRIES IF GE:40$: SEC ;RUN MASK IS INVALID:$50$: MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R0 ;W RETURNM .DSABL LSBE I;+3; **-SETAT-SET UP REQUIRED RUN MASK (TCB SPECIFIED)$3; **-SETAP-SET UP REQUIRED RUN MASK (PCB SPECIFIED) 6; **-SETAH-SET UP REQUIRED RUN MASK (HEADER SPECIFIED);LG; THESE ROUTINES SET UP THE REQUIRED RUN MASK IN THE CALLING TASK'S TCBB; ; INPUTS:0;S; R0=TCB ADDRESS ($SETAT)O; PCB ADDRESS ($SETAP)0; HEADER ADDRESS ($SETAH);E ; OUTPUTS:;$; T.RRM IS SET UP IN THE TCB;- U8$SETAT::MOV T.PCB(R0),R0 ;GET ADDRESS OF TASK REGION PCB$SETAP:: ;REFERENCE LABELS .IF DF X$$HDR( MOV KISAR6,-(SP) ;SAVE PREVIOUS MAPPING+ MOV P.HDR(R0),-(SP) ;GET ADDRESS OF HEADER " BNE 5$ ;IF NE HEADER IS RESIDENT0 MOV P.REL(R0),KISAR6 ;MAP TO NONRESIDENT HEADER0 MOV #140000,(SP) ;SET VIRTUAL ADDRESS OF HEADER/5$: MOV (SP)+,R0 ;GET VIRTUAL ADDRESS OF HEADERE+ CALL $SETAH ;USE HEADER SPECIFIED ROUTINE + MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING RETURN ;T .IFF ; DF X$$HDRU( MOV P.HDR(R0),R0 ;GET ADDRESS OF HEADER .ENDC ; DF X$$HDR$$SETAH::MOV R1,-(SP) ;SAVE REGISTERS MOV R2,-(SP) ;( MOV R3,-(SP) ;S& CLR -(SP) ;CLEAR CALCULATED RUN MASK7 MOV H.WND(R0),R0 ;POINT TO THE NUMBER OF WINDOW BLOCKSP, MOV (R0)+,-(SP) ;SAVE THE NUMBER OF WINDOWS+ MOV (R0),R3 ;SAVE TASK REGION PCB ADDRESSR)10$: MOV (R0),R1 ;IS THIS WINDOW MAPPED?H BEQ 20$ ;NO IF EQ 1 BIS P.RRM(R1),2(SP) ;CALCULATE REQUIRED RUN MASKR)20$: ADD #W.BLGH,R0 ;POINT TO NEXT WINDOW. DEC (SP) ;ANY WINDOWS LEFT?R BGT 10$ ;YES IF GT$ MOV P.TCB(R3),R0 ;POINT TO TASK TCB TST (SP)+ ;CLEAN THE STACK9 MOV (SP)+,T.RRM(R0) ;MOVE CALCULATED RUN MASK TO THE TCBC MOV (SP)+,R3 ;RESTORE REGISTERS MOV (SP)+,R2 ;  MOV (SP)+,R1 ;B RETURNM ( .ENDC ; E .ENDMBER OF WINDOWS+ MOV (R0),R3 ;SAVE TASK REGION PCB ADDRESSR)10$: MOV (R0),R1 ;IS THIS WINDOW MAPPED?H BEQ 20$ ;NO IF EQ 1 BIS P00i‡0N0TADATADATADATADATADATADATADATADATA .TITLE DRGPP; .IDENT /07.06/D N;S,; COPYRIGHT (C) 1974, 1978, 1979, 1980, 1981/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.I;TA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDK9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.C;M; VERSION 07.06O;R; D. N. CUTLER 3-JAN-74 ;M); MODIFIED FOR RSX-11M-PLUS VERSION 1 BY:E;.; T. J. MILLER; J. E. PROVINO ;V; MODIFIED BY:;D; J. M. LAWLER 17-AUG-81; 3; JL065 -- INTEGRATE PCB CHANGES NEEDED TO SUPPORT.; EXTERNAL HEADERS.;6; J. M. LAWLER 24-AUG-81; 3; JL067 -- RETURN CORRECT STARTING VIRTUAL ADDRESSR; FOR THE TASK REGION; ; J. M. LAWLER 13-OCT-81;D.; JL081 -- FOR I/D USER TASKS, RETURN D SPACE; STARTING VIRTUAL ADDRESS ;H; T. M. MARTIN 28-OCT-81;0/; TMM071 -- DEFINE TASK HEADER OFFSETS LOCALLYF;R;1; MACRO LIBRARY CALLS; .MCALL PCBDF$,TCBDF$,HDRDF$% HDRDF$ ;DEFINE TASK HEADER OFFSETS11 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSD, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;+$; **-$DRGPP-GET PARTITION PARAMETERS;CF; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO FILL A THREE WORD BUFFER WITH; PARTITION PARAMETERS.J;1 ; DPB FORMAT:R;S"; WD. 00 -- DIC(65.),DPB SIZE(4.).2; WD. 01 -- FIRST HALF OF OPTIONAL PARTITION NAME.3; WD. 02 -- SECOND HALF OF OPTIONAL PARTITION NAME.1+; WD. 03 -- ADDRESS OF A THREE WORD BUFFER.$;B; BUFFER FORMAT:; 4; WD. 00 -- BASE ADDRESS OF PARTITION IN 32W BLOCKS.,; WD. 01 -- SIZE OF PARTITION IN 32W BLOCKS.!; WD. 02 -- PARTITION FLAGS WORD.;* ; INPUTS: ;T9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. .; R3=ADDRESS OF THE PARTITION NAME IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.I,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;P5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)O; -; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.E9; DIRECTIVE STATUS EQUAL TO THE STARTING VIRTUAL ADDRESSA+; OF THE SPECIFIED PARTITION IS RETURNED.-; C=1 IF DIRECTIVE IS REJECTED..7; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF SPECIFIED; PARTITION IS NOT IN SYSTEM.O;O8; IF THE PARTITION IS A TASK REGION, THE EXTERNAL HEADER5; IS NOT INCLUDED IN THE PARTITION PARAMETERS BECAUSEA; IT IS NOT MAPPED BY THE TASK.T;C;- P$DRGPP:: ;REFERENCE LABELS D .IF DF P$$LAS .IF DF U$$DAS R- MOV T.ST4(R5),-(SP) ;SAVE I/D TASK INDICATORS .ENDC ; DF U$$DAS3 MOV H.WND(R4),-(SP) ;SAVE POINTER TO WINDOW BLOCKSE& TST (R3)+ ;PARTITION NAME SPECIFIED? BNE 10$ ;IF NE YES# CALL $SRATT ;SEARCH FOR REGION ID& MOV A.PCB(R5),R2 ;PICK UP PCB ADDRESS BR 30$ ;610$: TST -(R3) ;POINT TO FIRST WORD OF PARTITION NAME E .IFFE R% TST (R3) ;PARTITION NAME SPECIFIED?  BNE 5$ ;IF NE YES& MOV T.PCB(R5),R4 ;GET TASK REGION PCB3 TST (R3)+ ;POINT TO SECOND WORD OF PARTITION NAME BR 40$ ; ) .ENDC E D,5$: CALL $SRNAM ;SEARCH FOR NAMED PARTITION& BCC 20$ ;IF CC NAMED PARTITION FOUND% DRSTS D.RS2 ;INVALID PARTITION NAMEN 20$: TST (R3)+ ;ADVANCE POINTER!30$: MOV R2,R4 ;COPY PCB POINTERN .IF DF P$$LAS)/ MOV (SP)+,R1 ;RESTORE POINTER TO WINDOW BLOCKS)( TST (R1)+ ;ADVANCE POINTER TO WINDOW 0  .IFTF ; DF P$$LAS .IF DF U$$DAS! CLR 4(SP) ;SET DIRECTIVE STATUSM T .IFF ; DF U$$DASS! CLR 2(SP) ;SET DIRECTIVE STATUSE .ENDC ; DF U$$DAS .IFT ; DF P$$LAS .IF DF U$$DAS4 BIT #T4.DSP,(SP)+ ;USER TASK HAVE D SPACE ENABLED ? BEQ 35$ ;IF EQ, NO+ ADD #W.BLGH,R1 ;YES, WINDOW 1 MAPS D SPACE035$: ;REFERENCE LABEL .ENDC ; DF U$$DAS ASSUME W.BPCB ASSUME W.BLVR-24 CMP (R1)+,R4 ;TARGET PARTITION TASK REGION (W.BPCB)+ BNE 40$ ;IF NOT, RETURN '0' STARTING ADDR.7 MOV (R1),2(SP) ;STARTING ADDRESS (W.BLVR) FROM WIN 0/1I .ENDC ; DF P$$LAS/40$: MOV 2(R3),R3 ;GET ADDRESS OF 3 WORD BUFFER& MOV #3*2,R1 ;SET LENGTH OF BUFFER # CALL $ACHKP ;ADDRESS CHECK BUFFERD .IF DF X$$HDR; MOVB P.HDLN(R4),R1 ;GET LENGTH OF EXTERNAL HEADER (IF ANY) < MOV P.REL(R4),(R3) ;CALCULA00i�0j�0eeaek›’TE STARTING ADDRESS OF PARTITION1 ADD R1,(R3)+ ;EXCLUDING POSSIBLE EXTERNAL HEADER2 .IFF ; DF X$$HDRR 3 MOV P.REL(R4),(R3)+ ;GET BASE ADDRESS OF PARTITIONT .IFT ; DF X$$HDR.. MOV P.SIZE(R4),(R3) ;INSERT SIZE OF PARTITION( SUB R1,(R3)+ ;MINUS ANY EXTERNAL HEADER .IFF ; DF X$$HDRD/ MOV P.SIZE(R4),(R3)+ ;INSERT SIZE OF PARTITIONF .ENDC ; DF X$$HDR1 CLR (R3) ;INSERT CODE FOR SYSTEM CONTROLLED PAR 60$: RETURN N R .ENDDER (IF ANY) < MOV P.REL(R4),(R3) ;CALCULA .TITLE DRCLI  .IDENT /01.01/ V;,6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED OR COPIED ONLY IN ACCORDANCE WITH THE TERMS; OF SUCH LICENSE.; 6; COPYRIGHT (c) 1981 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;G; VERSION 01.01C; ; M. S. FOX 20-APR-81S; ;T; MODIFIED BY:;K; M. S. FOX 23-SEP-81;V3; MF225 -- FIX CP.RST CHECKS, AND DO NOT ALLOW CLIC1; TO BE SET IF TTY IS LOGGED OFF, AND CP.LGO=0+;S;+G; **-$DRCLI-SET CLI / GET CLI INFO / DECLARE CMD ARRIVAL AST DIRECTIVES,; :; THIS MODULE CONTAINS THE GET CLI INFORMATION AND SET CLI:; DIRECTIVES. IT ALSO GETS CALLED BY DRDSP FOR THE DECLARE:; COMMAND ARRIVAL AST DIRECTIVE, BUT IMMEDIATEDLY JUMPS TO<; THE $CAAST ENTRY POINT OF THE DRPUT MODULE FOR PROCESSING.;S ; INPUTS:R;S?; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK5*; R3=ADDRESS OF THE SECOND WORD IN THE DPB.; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK+; R5=ADDRESS OF THE TCB OF THE CURRENT TASK ;O;- .IF DF A$$CLI .IF DF M$$CLI/ .ERROR ;CANNOT DEFINE BOTH M$$CLI AND A$$CLID .ENDC ;M$$CLI .MCALL PKTDF$,UCBDF$  PKTDF$ ;DEFINE CPB OFFSETSM UCBDF$ ;DEFINE UCB OFFSETSI1 ASSUME UM.CLI,36 ;BITS TO INDICATE TERMINALS CLI ; ASSUME C.PTCB,0 ;TCB ADDRESS MUST BE AT OFFSET ZERO OF CPBS#$DRCLI::MOVB -(R3),R0 ;GET DPB SIZEC% CMPB #5,(R3)+ ;IS IT SET CLI (SCLI$)D. BEQ SCLI ;IF EQ YES, PROCESS SCLI$ DIRECTIVE3 CMPB #2,R0 ;IS IT DECLARE CMD ARRIVAL AST (SCAA$)E BNE 10$ ;IF NE NO.( JMP $CAAST ;PROCESS DIRECTIVE IN DRPUT310$: CMPB #7,R0 ;IS IT GET CLI INFORMATION (GCII$);$ BEQ GCII ;IF EQ YES, PROCESS GCII$ DRSTS D.RS99 ;ILLEGAL DPB SIZE;+; **-SCLI- SET A TERMINAL'S CLIC;3;; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SET THE CLI OF THER?; CURRENT TASK'S TI: TERMINAL (OR SPECIFIED TERMINAL) TO BE THED@; SPECIFIED CLI. SYSTEM MESSAGES INFORMING BOTH THE PREVIOUS ANDB; NEW CLIS OF THE CHANGE ARE SENT TO THE CLIS IF THEY DESIRE THEM.; ; DPB FORMAT:B;1"; WD. 00 -- DIC(173.),DPB SIZE(5.)>; WD. 01 -- ASCII NAME OF THE TERMINAL WHOSE CLI SHOULD BE SET); WD. 02 -- OCTAL UNIT NUMBER OF TERMINALG7; WD. 03 -- FIRST HALF OF RAD50 NAME OF THE DESIRED CLIS<; WD. 04 -- SECOND HALF OF THE RAD50 NAME OF THE DESIRED CLI;O5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ;C-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.S&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.E2; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF THE; LENGTH IS ILLEGAL 2; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IS THE#; ISSUING TASK IS NOT PRIVILEGED. 1; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF AN-5; NON-EXISTANT OR NON-TERMINAL DEVICE IS SPECIFIED.4;; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF THE SPECIFIEDU; CLI DOES NOT EXIST.A6; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF THERE IS; INSUFFICIENT POOL SPACE.1; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THEI/; TERMINAL IS LOGGED OFF, AND CP.LGO IS CLEARR;R;-@SCLI: BIT #T3.PRV!T3.CLI,T.ST3(R5) ;CAN TASK USE THIS DIRECTIVE? BEQ 40$ ;IF EQ NOS MOV (R3)+,R0 ;GET DEVICE NAME BNE 10$ ;IF NE, GOT ONES) MOV T.UCB(R5),R0 ;GET CURRENT TASK'S TI: # TST (R3)+ ;SKIP UNIT NUMBER FIELD BR 20$ ;"10$: MOV (R3)+,R1 ;GET UNIT NUMBER' MOV R3,-(SP) ;SAVE POINTER TO CLI NAMED% CALL $CVDVN ;CONVERT TO UCB ADDRESSI' BCS 50$ ;IF CS, DEVICE DOES NOT EXIST MOV R2,R0 ;COPY UCB ADDRESSI$ CALL $MPLND ;FOLLOW REDIRECT CHAIN, BIT #DV.TTY,U.CW1(R0) ;IS DEVICE A TERMINAL BEQ 500j—0N0TADATADATADATADATADATADATADATADATA0$ ;IF EQ NOT' MOV (SP)+,R3 ;POINT TO CLI NAME IN CPBB(20$: CALL $STCLI ;SET THE TERMINALS CLI BCC 60$ ;IF CC, SUCCESS  TST R0 ;IDENTIFY ERROR BEQ 40$ ;IF EQ, PRIV VIOLATION BPL 30$ ;IF PL, NO POOLL DRSTS D.RS2 ;CLI NOT IN SYSTEM!30$: DEC R0 ;ALLOCATION FAILURE?V BNE 35$ ;IF NE YES3 DRSTS D.RS8 ;TERMINAL NOT LOGGED IN, CP.LGO CLEARI%35$: DRSTS D.RS1 ;ALLOCATION FAILURE0'40$: DRSTS D.RS16 ;PRIVILEGE VIOLATIONO,50$: DRSTS D.RS92 ;ILLEGAL DEVICE SPECIFIED60$: RETURN ;SUCCESS;+'; **-GCII-GET CLI INFORMATION DIRECTIVEE; E; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO FILL A BUFFER IN THE CURRENTSC; TASK SPACE WITH INFORMATION ABOUT HIS OWN OR A SPECIFIED CLI. THE3@; ISSUING TASK MUST BE PRIVILEGED TO GET INFORMATION ABOUT A CLI@; WHICH IS NOT THE CLI OF ITS TI: TERMINAL. IF THE BUFFER IS NOT=; LONG ENOUGH TO CONTAIN ALL THE DATA, IT IS FILLED FROM LEFTO<; TO RIGHT WITH AS MUCH DATA AS WILL FIT. NO INDICATION WILL@; BE GIVEN TO THE TASK THAT ITS BUFFER IS TOO SHORT. THIS ALLOWSE; NEW DATA ITEMS TO BE RETURNED BY FUTURE VERSIONS OF THIS DIRECTIVE,C?; SINCE OLD TASKS WILL CONTINUE TO WORK. THEY JUST WILL NOT SEE ; THE NEW DATA. ; ; DPB FORMAT:I;C"; WD. 00 -- DIC(173.),DPB SIZE(7).5; WD. 01 -- ADDRESS OF BUFFER IN CURRENT TASK'S SPACET'; WD. 02 -- LENGTH OF THE TASK'S BUFFER 7; WD. 03 -- FIRST HALF OF NAME OF CLI TO RETURN DATA ONE8; WD. 04 -- SECOND HALF OF NAME OF CLI TO RETURN DATA ON;; WD. 05 -- ASCII NAME OF TERMINAL WHOSE CLI SHOULD BE USEDO); WD. 06 -- OCTAL UNIT NUMBER OF TERMINALE;T5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)L;A-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.E&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.I2; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF THE; DPB LENGTH IS INVALID.9; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE BUFFER 1; IS NOT ENTIRELY WITHIN THE USER'S TASK SPACE.N7; DIRECTIVE STATUS OF 'D.RS81' IS RETURNED IF BOTH THEE/; NAMES OF THE CLI AND TERMINAL ARE SUPPLIED.A1; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF THEV!; SPECIFIED CLI DOES NOT EXIST.2; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF THE'; SPECIFIED DEVICE IS NOT A TERMINAL. 9; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF A NON-PRIVS/; TASK ATTEMPTS TO GET INFO ON A CLI WHICH IS.; NOT ASSOCIATED WITH ITS TI: ;R;-;FF; THE FORMAT OF THE INFORMATION BUFFER IN THE TASK'S ADDRESS SPACE IS:;I+; +---------------------------------------+E; ! NAME OF CLI !I; ! (2 WORDS) !U+; !---------------------------------------!E; ! CLI STATUS WORD FROM CPB !+; !---------------------------------------!.!; ! NAME OF TASK SERVING AS CLI !F; ! (2 WORDS) ! +; !---------------------------------------!S; ! TERMINAL'S U.CW2 !+; !---------------------------------------!I; ! TERMINAL'S PROTECTION UIC !I+; !---------------------------------------!T; ! TERMINAL'S CURRENT UIC !S+; !---------------------------------------!- ; ! !-; ! DEFAULT PROMPT STRING !!; ! (1 BYTE LENGTH, FOLLOWED BY !-; ! 31. BYTES STRING) !+; +---------------------------------------+-;-;-)GCII: MOV (R3)+,R0 ;GET ADDRESS OF BUFFERI# MOV (R3)+,R1 ;GET LENGTH OF BUFFER- MOV R1,-(SP) ;SAVE LENGTH MOV R0,-(SP) ;SAVE ADDRESSU# CALL $ACHKW ;ADDRESS CHECK BUFFER-% MOV R5,R2 ;COPY CURRENT TCB ADDRESST. MOV T.UCB(R5),R5 ;POINT TO CURRENT TASK'S TI:$ TST (R3) ;WAS A CLI NAME SPECIFIED BEQ 10$ ;IF EQ NO-% TST 4(R3) ;WAS A TERMINAL SPECIFIED BNE 100$ ;IF NE YESN% CALL $FNCLI ;FIND THE SPECIFIED CLI-% BCS 110$ ;IF CS, CLI DOES NOT EXIST-9 MOV U.MUP(R5),R3 ;GET WORD CONTAINING TI:S CLI INDICATOR,- BIC #^CUM.CLI,R3 ;ISOLATE CLI INDICATOR BITSL" CMP R3,R1 ;LOOKING AT TI:S CLI?? BEQ 200$ ;IF EQ YES  BR 30$ ;REQUIRE PRIVILEGE /10$: CMP (R3)+,(R3)+ ;SKIP OVER CLI NAME IN DPB  MOV (R3)+,R0 ;GET DEVICE NAME BEQ 20$ ;IF EQ NOK MOV (R3)+,R1 ;GET UNIT NUMBER* CALL $CVDVN ;CONVERT NAME TO UCB ADDRESS( BCS 120$ ;IF CS, DEVICE DOES NOT EXIST MOV R2,R0 ;COPY UCB ADDRESSN$00jŸ0�0eeaek›’ CALL $MPLND ;FOLLOW REDIRECT CHAIN' MOV R0,R5 ;PUT UCB ADDRESS BACK IN R5 , BIT #DV.TTY,U.CW1(R5) ;IS DEVICE A TERMINAL BEQ 120$ ;IF EQ NO120$: MOV U.MUP(R5),R4 ;GET CLI INDICATOR FROM UCBC BIC #^CUM.CLI,R4 ;ISOLATE ITB$ MOV $CPTBL(R4),R4 ;POINT TO THE CPB, MOV $TKTCB,R2 ;GET TCB ADDR OF CURRENT TASK0 CMP T.UCB(R2),R5 ;LOOKING AT CURRENT TASK'S TI:, BEQ 200$ ;IF EQ YES, DO NOT NEED PRIVILEGED30$: BIT #T3.PRV!T3.CLI,T.ST3(R2) ;IS CURRENT TASK PRIVILEGED OR CLI BNE 200$ ;IF NE YESD;S# DRSTS D.RS16 ;PRIVILEGE VIOLATIONA9100$: DRSTS D.RS81 ;CANNOT SPECIFY BOTH TERMINAL AND CLIU&110$: DRSTS D.RS2 ;CLI DOES NOT EXIST-120$: DRSTS D.RS92 ;ILLEGAL DEVICE SPECIFIEDD;T.200$: MOV (SP)+,R0 ;GET ADDRESS OF USER BUFFER) CALL $RELOC ;RELOCATE USERS INFO BUFFERK( MOV R1,KISAR6 ;MAP BUFFER IN TASK SPACE# MOV (SP)+,R3 ;GET LENGTH OF BUFFERK ASR R3 ;CONVERT TO WORD COUNT . SUB #2,R3 ;SPACE LEFT IN BUFFER FOR CLI NAME BLT 230$ ;IF LT NO) MOV C.PNAM(R4),(R2)+ ;PUT NAME IN BUFFER$ MOV C.PNAM+2(R4),(R2)+ ;SECOND HALF- DEC R3 ;SPACE IN BUFFER FOR CPB STATUS WORDR BLT 230$ ;IF LT NO2 MOV C.PSTS(R4),(R2) ;COPY STATUS WORD INTO BUFFER/ SUB #2,R3 ;SPACE LEFT IN BUFFER FOR TASK NAME, BLT 230$ ;IF LT NO! MOV (R4),R0 ;POINT TO CLI'S TCBS, BIT #CP.POL,(R2)+ ;IS TCB IN SECONDARY POOL BEQ 210$ ;IF EQ NO MOV R0,KISAR6 ;MAP TCBE MOV #140000,R0 ;POINT TO IT9210$: MOV T.NAM+2(R0),-(SP) ;GET SECOND HALF OF TASK NAMET MOV T.NAM(R0),-(SP) ;FIRST HALF. MOV R1,KISAR6 ;RESTORE MAPPING OF USER BUFFER. MOV (SP)+,(R2)+ ;PUT TASK NAME IN USER BUFFER MOV (SP)+,(R2)+ ;3 DEC R3 ;SPACE LEFT IN BUFFER FOR TERMINAL'S U.CW2  BLT 230$ ;IF LT NO, MOV U.CW2(R5),(R2)+ ;COPY U.CW2 INTO BUFFER$ DEC R3 ;SPACE FOR PROTECTION UIC?? BLT 230$ ;IF LT NO* MOV U.LUIC(R5),(R2)+ ;COPY PROTECTION UIC DEC R3 ;SPACE FOR CURRENT UICA BLT 230$ ;IF LT NO& MOV U.UIC(R5),(R2)+ ;COPY CURRENT UIC1 SUB #16.,R3 ;ENOUGH ROOM LEFT FOR PROMPT STRINGM BLT 230$ ;IF LT NO CLR R5 ;1 BISB C.PDPL(R4),R5 ;GET LENGTH OF DEFAULT PROMPT2- DEC R5 ;DO NOT RETURN ZERO AT END OF PROMPT2$ MOVB R5,(R2)+ ;PUT LENGTH IN BUFFER# BEQ 230$ ;IF EQ, NO PROMPT STRINGL) ADD #C.PRMT,R4 ;POINT TO START OF STRING &220$: MOVB (R4)+,(R2)+ ;COPY CHARACTER SOB R5,220$230$: RETURN ;SUCCESS(;++; **-$STCLI-ROUTINE TO SET A TERMINAL'S CLIU=; **-$STCL1-ROUTINE TO SET A TERMINAL'S CLI (ALTERNATE ENTRY)R;TB; THIS ROUTINE SETS THE CLI OF THE SPECIFIED TERMINAL FOR BOTH THEA; SCLI$ DIRECTIVE AND MCR. IF EITHER THE PREVIOUS OR NEW CLI HAVEPD; THE CP.MSG BIT SET IN THEIR CPB'S, A MESSAGE PACKET IS CREATED ANDI; PASSED TO THEM TO INFORM THEM OF THE CHANGE. NOTE THAT IF AN ALLOCATIONRE; FAILURE OCCURS WHEN ACTIVATING THE NEW CLI AFTER QUEUEING A MESSAGESD; TO IT, THE ERROR IS IGNORED SINCE IT WOULD BE IMPOSSIBLE TO UNWINDE; ACTIONS WHICH MAY HAVE ALREADY BEEN COMPLETED, SUCH AS DEACTIVATINGRG; THE PREVIOUS CLI AFTER A CALL TO $EXRQN. THE ONLY DRAWBACK TO THIS ISOC; THAT THE NEW CLI WILL NOT GET THE MESSAGE IMMEDIATELY. THE BUFFERCG; WILL BE LINKED IN ITS QUEUE, BUT THE CLI WILL NOT RECEIVE IT UNTIL ITDB; GETS ACTIVATED AT A FUTURE POINT BY A COMMAND ARRIVAL OR ANOTHER; SYSTEM MESSAGE.L; ; INPUTS: ;I#; R0=UCB ADDRESS OF TERMINAL TO SETE5; R3=POINTER TO THE NAME OF THE NEW CLI ($STCLI ONLY) 5; R1=OFFSET TO POINTER TO CPB IN $CPTBL ($STCL1 ONLY)B); R4=CPB ADDRESS OF NEW CLI ($STCL1 ONLY) ;V ; OUTPUTS:;A; C=1 CLI COULD NOT BE SET(; R0=2 IF AN ALLOCATION FAILURE OCCURED:; R0=1 IF THE TERMINAL IS LOGGED OFF, AND CP.LGO IS CLEAR8; R0=0 IF THE CP.RST BIT IS SET, AND A TASK OTHER THAN1; THE CLI IS ATTEMPTING TO SET A TERMINAL TO IT "; R0=-1 IF THE CLI DOES NOT EXIST@; C=0 THE CLI WAS SUCCESSFULLY SET UP FOR THE SPECIFIED TERMINAL;I; ALL REGISTERS ARE MODIFIED;$;-;Y5MSGLEN=/100 ;LENGTH OF MESSAGE PACKETSY; .IF NDF D$$PAR ,$STCLI::CALL $FNCLI ;FIND THE SPECIFIED CLI .ENDC ;D$$PAR.$STCL1::MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING5 MOV #-1,-(SP) ;SET 00j§0N0TADATADATADATADATADATADATADATADATAEXIT STATUS WORD FOR THIS ROUTINE$ BCS 40$ ;IF CS, CLI DOES NOT EXIST* INC (SP) ;SET EXIT STATUS TO RETURN R0=02 MOV U.MUP(R0),R3 ;GET WORD CONTAINING CURRENT CLI# BIC #^CUM.CLI,R3 ;ISOLATE CLI BITSF# MOV $CPTBL(R3),R3 ;GET CPB ADDRESSL6 MOV C.PSTS(R3),$TEMP0 ;SAVE CURRENT CLI'S STATUS WORD< BIT #CP.RST,$TEMP0 ;DOES CURRENT CLI HAVE RESTRICTED ACCESS BEQ 3$ ;IF EQ NO3 CMP $TKTCB,(R3) ;IS OLD CLI ISSUING THIS DIRECTIVEP BNE 80$ ;IF NE NOI;3$: BIT #CP.RST,C.PSTS(R4) ;IS ACCESS TO NEW CLI RESTRICTEDA BEQ 5$ ;IF EQ NO3 CMP $TKTCB,(R4) ;IS NEW CLI ISSUING THIS DIRECTIVEP BNE 80$ ;IF NE NOO-5$: INC (SP) ;SET EXIT STATUS TO RETURN R0=1I- BIT #U2.LOG,U.CW2(R0) ;IS TERMINAL LOGGED ONI BEQ 7$ ;IF EQ YES3B BIT #CP.LGO,C.PSTS(R4) ;DOES CLI ACCEPT CMDS FROM LOGGED OFF TTYS BEQ 80$ ;IF EQ NOR-7$: INC (SP) ;SET EXIT STATUS TO RETURN R0=2E/ MOV R1,-(SP) ;SAVE OFFSET TO NEW CLI IN $CPTBLC MOV R0,-(SP) ;SAVE UCB ADDRESS8' CLR R5 ;ASSUME NO MESSAGE FOR NEW CLI)4 BIT #CP.MSG,C.PSTS(R4) ;DOES NEW CLI WANT A MESSAGE BEQ 10$ ;IF EQ NOS& MOV #MSGLEN,R1 ;GET LENGTH OF MESSAGE! CALL $ALSEC ;ALLOCATE A MESSAGEE BCS 70$ ;IF CS, NO POOL MOV R0,R5 ;SAVE BUFFER ADDRESS MOV R4,$TEMP1 ;SAVE CPB ADDRESS810$: BIT #CP.MSG,$TEMP0 ;DOES CURRENT CLI WANT A MESSAGE BEQ 25$ ;IF EQ NO # MOV #MSGLEN,R1 ;GET MESSAGE LENGTHT( CALL $ALSEC ;ALLOCATE A MESSAGE BUFFER BCS 60$ ;IF CS, NO POOLC MOV R0,R1 ;COPY BUFFER ADDRESS MOV (SP),R2 ;GET UCB ADDRESS' MOV R3,R4 ;GET ADDRESS OF CURRENT CPB # CALL STMSG ;SET UP MESSAGE BUFFER 1 MOV #CM.RMT,@#C.CMCD+140000 ;INSERT MESSAGE CODEL" MOV R1,-(SP) ;SAVE BUFFER ADDRESS+ CALL $QCPKT ;QUEUE BUFFER AND REQUEST CLIF BCC 20$ ;IF CC, OK$ BNE 50$ ;IF NE, ALLOCATION FAILURE;$E; AFTER THIS POINT, COMLETE ERROR RECOVERY IS IMPOSSIBLE, BECAUSE THELF; TASK MAY JUST HAVE BEEN ACTIVATED INSTEAD OF BEING MERELY UNSTOPPED.;6220$: TST (SP)+ ;DON'T NEED BUFFER ADDRESS ANYMORE-25$: MOV R5,R1 ;POINT TO MESSAGE FOR NEW CLI ( BEQ 30$ ;IF EQ, NO MESSAGE FOR NEW CLI MOV $TEMP1,R4 ;POINT TO NEW CPB MOV (SP),R2 ;GET UCB ADDRESS CALL STMSG ;SET UP MESSAGE+ CALL $QCPKT ;QUEUE MESSAGE AND REQUEST IT  ;DO NOT CHECK ERROR RETURNSC.30$: MOV (SP)+,R0 ;GET UCB ADDRESS OF TERMINAL. MOV (SP)+,R1 ;GET OFFSET TO NEW CLI IN $CPTBL1 MTPS #PR7 ;;;PREVENT TTDRV FROM ANSWERING PHONEC" ;;;WHEN CLI SETTING IS INVALIDB BIC #UM.CLI!UM.DSB,U.MUP(R0) ;;;CLEAR OUT PREVIOUS CLI INDICATION BIS R1,U.MUP(R0) ;;;SET NEW CLI MTPS #0 ;ALLOW INTERRUPTSO CLC ;SUCCESSC"40$: MOV (SP)+,R0 ;SET EXIT STATUS+ MOV (SP)+,KISAR6 ;RESTORE ORIGINAL MAPPING  RETURN ;ALL DONEL;Q; ERROR CLEANUP CODE;RF; ERROR WHILE ACTIVATING CURRENT CLI, SO UNLINK AND DEALLOCATE MESSAGE;E/50$: MOV #$CLICQ,R0 ;POINT TO CLI COMMAND QUEUEC* MOV (SP)+,R1 ;POINT TO BUFFER JUST QUEUED4 CALL $GTSPK ;REMOVE MESSAGE JUST INSERTED IN QUEUE$ MOV R1,R0 ;COPY POINTER TO MESSAGE MOV #MSGLEN,R1 ;GET ITS LENGTH CALL $DESEC ;DEALLOCATE IT;-; DEALLOCATE MESSAGE FOR NEW CLI IF IT EXISTS;:,60$: MOV R5,R0 ;POINT TO BUFFER FOR NEW CLI$ BEQ 70$ ;IF EQ, IT DIDN'T WANT ONE MOV #MSGLEN,R1 ;SET LENGTHL, CALL $DESEC ;DEALLOCATE BUFFER FOR NEW CLI!70$: CMP (SP)+,(SP)+ ;CLEAN STACKM80$: SEC ;SET ERROR STATUS BR 40$ ;GO TO COMMON EXIT CODE;P); LOCAL ROUTINE TO SET UP MESSAGE BUFFERSG;K ; INPUTS:E; R1=ADDRESS OF MESSAGE BUFFER; R2=ADDRESS OF TERMINAL UCB-; R4=ADDRESS OF CPB OF CLI TO RECEIVE MESSAGED;C ; OUTPUTS:;T=; THE MESSAGE BUFFER IN SEC POOL IS FILLED IN AND LEFT MAPPEDM;R ; REGISTERS R1, R4, R5 PRESERVED;B(STMSG: MOV R1,-(SP) ;SAVE BUFFER ADDRESS MOV R1,KISAR6 ;MAP BUFFER" MOV #140002,R3 ;POINT INTO BUFFER< MOV $MCRPT,(R3)+ ;ALL MESSAGES GO THRU DISPATCHER ON M-PLUS! MOV R2,(R3)+ ;INSERT UCB ADDRESS  MOV #4,(R3)+ ;CHARACTER COUNT- MOV #CC.CLI!CC.MSG,(R3)+ ;INSERT STATUS BITSD6 MOV #CM.LKT,(R3)+ ;ASSUME MESSAGE IS GOING TO NEW CLI9 MOV #+33,(R3)+ ;INSERT LENGTH AND TERMINATOR: MOV R2,R1 ;COPY UCB ADDR MOV (00j¯0k±0l¶0eaek›’R1),R2 ;POINT TO DCBE* TST (R2)+ ;POINT TO ADDRESS OF FIRST UCB+ SUB (R2)+,R1 ;CALC RELATIVE ADDRESS OF UCBA" MOV (R2)+,(R3)+ ;COPY DEVICE NAME, MOV (R2)+,(R3) ;GET LOW UNIT NUMBER FOR DCB MOV (R2),R2 ;GET LENGTH OF UCB CLR R0 ;SET UP R0,R13 DIV R2,R0 ;CALC RELATIVE UNIT NUMBER FOR THIS DCBR' ADD R0,(R3)+ ;CALC LOGICAL UNIT NUMBER , CLRB -1(R3) ;CLEAR STUFF LEFT IN HIGH BYTE% MOV R4,(R3) ;PUT CPB ADDR IN BUFFER0% MOV (SP)+,R1 ;RESTORE BUFFER ADDRESSO RETURN ;1 .ENDC ;A$$CLI .END,R2 ;POINT TO DCBE* TST (R2)+ ;POINT TO ADDRESS OF FIRST UCB+ SUB (R2)+,R1 ;CALC RELATIVE ADDRESS OF UCBA" MOV (R2)+,(R3)+ ;COPY DEVICE NAME, MOV (R2)+,(R3) ;GET LOW UNIT NUMBER FOR DCB MOV (R2),R2 ;GET LENGTH OF UCB CLR R0 ;SET UP R0,R13 DIV R2,R0 ;CALC RELATIVE UNIT NUMBER FOR THIS DCBR' ADD R0,(R3)+ ;CALC LOGICAL UNIT NUMBER , CLRB -1(R3) ;CLEAR STUFF LEFT IN HIGH BYTE% MOV R4,(R3) ;PUT CPB ADDR IN BUFFER0% MOV (SP)+,R1 ;RESTORE BUFFER ADDRESSO RETURN ;1 .ENDC ;A$$CLI . .TITLE MPTBL$ .IDENT /02.04/N; ,; COPYRIGHT (C) 1974, 1978, 1979, 1980, 1981/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.M; A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDA9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.N; ; VERSION 02.04 ;;; T. J. MILLER 23-OCT-77;); MODIFIED FOR RSX-11M-PLUS VERSION 1 BY:T; ; K. E. KINNEARR; J. E. PROVINO$; B. A. O'CONNELLG;A; MODIFIED BY:;.; B. S. MCCARTHY 11-AUG-80;.=; BM072 -- CORRECT GRP GBL EVENT FLAG USE COUNT MANIPULATION; ; J. E. POLLACK 26-NOV-808;9<; JEP022 -- REMOVE QMCR GIN$ FUNCTION AND ADD SET PRIVILEGE;; B. S. MCCARTHY 16-DEC-80;D5; BM100 -- ADDITION OF USER D SPACE SUPPORT, RESERVEA-; USER DICS, RESERVE FUTURE DIRECTIVE DICS.;E; B. S. MCCARTHY 18-MAR-81;R2; BM125 -- MOVE DIRECTIVE AND GIN TABLES TO DRTB2;Y; B. S. MCCARTHY 29-SEP-81;E(; BM162 -- CORRECT LENGTH OF DPB BUFFER;D<; MULTIPROCESSOR TABLES AND DIRECTIVE DISPATCHER IMPURE AREAK; (IN A MULTI-PROCESSOR SYSTEM THIS MODULE CAN EITHER BE PROCESSOR-SPECIFIC9; OR IN THE COMMON DATA AREA) ;C; LOCAL DATA-ADJACENCY ASSUMED;.)$USRPS::.BLKW 1 ;POINTER TO USER PS WORDI)$BTRMV::.BLKW 1 ;BYTES TO REMOVE ON EXITS6$DICSV::.BLKW 16. ;BUFFER FOR DPB (THIS MUST INCREASE% ;WHENEVER THE SIZE OF THE LARGESTD ;COPIED DPB CHANGES);A; MULTIPROCESSOR INTERPROCESSOR INTERRUPT FUNCTION DISPATCH TABLEP;U .IF DF M$$PRO0$MPDSP::.WORD $CRAL1 ;MP.CRH -- CRASH PROCESSOR5 .WORD $PWRMP ;MP.PWF -- SOME CPU DETECTED POWERFAILE4 .WORD $IISLM ;MP.RSM -- RESET IIST INTERRUPT MASKS5 .WORD $INTXT ;MP.NOP -- NOP FUNCTION FOR XMIT CHECK - .WORD $INTXT ;MP.XXX -- CURRENTLY UNDEFINED; .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX5 .WORD $CPOFF ;MP.STP -- STOP CPU IN ORDERLY FASHION .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .ENDC .END;MP.PWF -- SOME CPU DETECTED POWERFAILE4 .WORD $IISLM ;MP.RSM -- RESET IIST INTERRUPT MASKS5 .WORD $INTXT ;MP.NOP -- NOP FUNCTION FOR XMIT CHECK - .WORD $INTXT ;MP.XXX -- CURRENTLY UNDEFINED; .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX5 .WORD $CPOFF ;MP.STP -- STOP CPU IN ORDERLY FASHION .WORD $INTXT ;MP.XXX .WORD $INTXT ;MP.XXX . .TITLE EMDRV1 .IDENT /01.02/ ;T6; COPYRIGHT (C) 1981 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;Q<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;E; VERSION 01.02V;.; P. J. CARR 25-AUG-81; ; MODIFIED BY:;L; P. J. BEZEREDI 14-SEP-81;K8; PB264 -- RESTORE I/O PACKET ADDRESS AFTER WRITE CHECK; DETERMINATION CODE. ;D; P. J. BEZEREDI 22-OCT-81;;6; PB269 -- RETURN IE.SZE ERROR FOR 00l·0N0TADATADATADATADATADATADATADATADATANON-EXISTANT UNIT.;D; ; RH11-ML11 MEMORY SYSTEM DRIVER; ; MACRO LIBRARY CALLSR;O .MCALL HWDDF$,PKTDF$.$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;N; EQUATED SYMBOLST;H&ADR= 10 ;ADDRESS BITS SET UP (1=YES)'SEL= 20 ;PORT SELECT WAIT (1=WAITING)ORETRY= 8. ;ERROR RETRY COUNT;E; ML11 DEVICE REGISTER OFFSETS;A'MLCS1= 0 ;CONTROL AND STATUS REGISTERNMLWC= 2 ;WORD COUNT REGISTERMLBA= 4 ;BUS ADDRESS REGISTERUMLDA= 6 ;TRACK/SECTOR ADDRESSU#MLCS2= 10 ;SECOND STATUS REGISTERE!MLDS= 12 ;DRIVE STATUS REGISTERRMLER= 14 ;ERROR REGISTER&MLAS= 16 ;ATTENTION SUMMARY REGISTER;T; MLCS1 BIT ASSIGNMENTSO;ETRE= 40000 ;TRANSFER ERROR;D ; LOCAL DATA;B>; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER);=7RTTBL: .BLKW M$$L11 ;RETRY COUNT FOR CURRENT OPERATIONE=PRMSV: .BLKW M$$L11*5 ;PARAMETER SAVE AREA FOR ERROR RECOVERYW ;AND WRITE CHECK FUNCTIONB;D; DRIVER DISPATCH TABLE ;A( DDT$ EM,M$$L11 ;GENERATE DISPATCH TABLE;+,; **-EMINI-RH11-ML11 MEMORY SYSTEM INITIATOR; B; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/OA; REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TOB; PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED UNIT ISD; NOT BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST,F; ELSE A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPT IS E; SUCCESSFUL, THEN THE NEXT I/O OPERATION IS INITIATED FOLLOWED BY A D; RETURN TO THE CALLER.I;T ; INPUTS:;3; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIATEDH;R ; OUTPUTS:;EA; IF THE SPECIFIED UNIT IS NOT BUSY AND AN I/O REQUEST IS WAITING @; TO BE PROCESSED, THEN THE NEXT REQUEST IS DEQUEUED AND THE I/O; OPERATION IS INITIATED.S;- .ENABL LSB 7EMINI: GTPKT$ EM,M$$L11 ;GET NEXT I/O PACKET TO PROCESS ;S1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:T;D&; R1=ADDRESS OF THE I/O REQUEST PACKET,; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB; R3=CONTROLLER INDEXA(; R4=ADDRESS OF THE STATUS CONTROL BLOCK3; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIATED:;E4; RH11-ML11 MEMORY SYSTEM I/O REQUEST PACKET FORMAT:;I!; WD. 00 -- I/O QUEUE THREAD WORD /; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBERT4; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK?; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER 4; WD. 04 -- FIRST LUN WORD IN REQUESTORS TASK HEADER0; WD. 05 -- I/O FUNCTION CODE (IO.RLB OR IO.WLB)/; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK4/; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCKS<; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000)2; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE@; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER*; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERREDN; WD. 15 -- NOT USED7; WD. 16 -- BITS <0:7> = HIGH LBN, BITS <8:15> NOT USEDT"; WD. 17 -- LOW LBN OF I/O REQUEST;; WD. 20 -- RELOCATION BIAS OF REGISTER BLOCK ELSE NOT USEDS:; WD. 21 -- REGISTER BLOCK ADDRESS (DISPLACEMENT + 140000);( BICB #ADR!SEL,U.CW2+1(R5) ;CLEAR FLAGS% MOV #RETRY,RTTBL(R3);SET RETRY COUNTD$ CALL $VOLVD ;VALIDATE VOLUME VALID BCS 10$ ;IF CS WE FAILED TST R0 ;TRANSFER FUNCTION? BMI EMUBMP ;IF MI YESS TST I.PRM+2(R1) ;SIZE THE DISK? BPL 10$ ;IF PL NON3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER>( MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS, MOVB U.UNIT(R5),MLCS2(R2) ;SELECT THE UNIT. MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS MOVB #111,(R2) ;CLEAR THE DRIVE+ BIT #10000,MLCS2(R2);DOES THE DRIVE EXIST?U BEQ 5$ ;IF EQ YESA2 MOVB #TRE/256.,MLCS1+1(R2) ;CLEAR THE CONTROLLER* MOV #IE.SZE&377,R0 ;UNABLE TO SIZE DEVICE) BICB #US.VV,U.STS(R5);RESET VOLUME VALID$ CALL $RLCN ;RELEASE THE CONTROLLER BR 10$ ;EXIT35$: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASKN- MOV #IS.SUC&377,R0 ;SET SUCCESSFUL OPERATION; BR 50$ ;10$: CALL $IODON ;FINISH I/O2& BR EMINI ;GET NEXT PACKET TO PROCESS;RC; NO00l¿0lÅ0¶0eaek›’W REQUEST THE CONTROLLER AND DETERMINE IF THE UNIBUS ADDRESS IS0D; ALREADY IN THE FORMAT FOR THE MASSBUS CONTROLLER OR THE UNIBUS MAP/; FOR 22-BIT PROCESSORS WITHOUT RH CONTROLLERS.E;E:EMUBMP: BITB #ADR,U.CW2+1(R5);ADDRESS BITS ALREADY SET UP? BNE EMINIO ;IF NE YES / BISB #ADR,U.CW2+1(R5);SHOW ADDRESS BITS SET UPL3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFERS' MOV S.KRB(R4),R1 ;RETRIEVE KRB ADDRESSB/ BIT #FE.EXT,$FMASK ;22-BIT ADDRESSING ENABLED?N BEQ 20$ ;IF EQ NOO: BIT #KS.MBC,K.STS(R1) ;YES, IS THIS A 22-BIT CONTROLLER? BNE 30$ ;IF NE YES( CALL $STMAP ;SET UP UNIBUS MAP ADDRESS220$: ASL U.BUF(R5) ;SHIFT BITS <4:5> TO BITS <8:9> ASL U.BUF(R5) ;...E ASL U.BUF(R5) ;...I ASL U.BUF(R5) ;...D/ BIT #FE.EXT,$FMASK ;22-BIT ADDRESSING ENABLED?E BEQ 30$ ;IF EQ NO1% CALL $MPUBM ;MAP UNIBUS TO TRANSFERR;D<; CONVERT THE I/O FUNCTION CODE TO IT'S HARDWARE EQUIVALENT.;I230$: MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS7 CMP #IO.WCK!IQ.UMD,I.FCN(R1) ;DIAGNOSTIC WRITE CHECK?R BNE 40$ ;IF NE NO2, BISB #151,U.BUF(R5) ;YES, SET FUNCTION CODE BR 60$ ;040$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION2 BISB #171,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTION6 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?$ BHIS 55$ ;IF HIS FUNCTION IS LEGAL,50$: MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS) MOVB U.UNIT(R5),MLCS2(R2) ;SELECT DRIVEC CALLR EMFIN1 ;FINISH UPL%55$: BEQ 60$ ;IF EQ FUNCTION IS READV5 SUB #10,U.BUF(R5) ;CONVERT TO WRITE LOGICAL FUNCTIONI;O; VALIDATE AND CONVERT LBN. ; -60$: CALL $BLKCK ;CHECK LOGICAL BLOCK NUMBER ' MOV R0,I.PRM+12(R3) ;SAVE DISK ADDRESS ' MOV S.KRB(R4),R1 ;RETRIEVE KRB ADDRESSF- MOVB K.CON(R1),R1 ;RETRIEVE CONTROLLER INDEXL% MUL #5,R1 ;SET UP AN INDEX INTO ...O' ADD #PRMSV,R1 ;... PARAMETER SAVE AREA& MOV U.BUF(R5),(R1)+ ;SAVE PARAMETERS MOV U.BUF+2(R5),(R1)+ ;... MOV U.CNT(R5),(R1)+ ;... MOV I.PRM+10(R3),(R1)+ ;... MOV I.PRM+12(R3),(R1)+ ;... .DSABL LSBR;O$; **-EMINIO-INTIATE AN I/O OPERATION;AB; THIS ROUTINE WILL INITIATE THE DATA TRANSFER OPERATION. AT THIS=; POINT THE CONTROLLER MUST BE REQUESTED FOR A DATA TRANSFER.R;R ; INPUTS: ; ; R4=ADDRESS OF THE SCB.; R5=ADDRESS OF THE UCB.;L*EMINIO: MOV @S.KRB(R4),R2 ;GET CSR ADDRESS) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSU( MOVB U.UNIT(R5),MLCS2(R2) ;SELECT UNIT;29; DETERMINE IF DRIVE'S PORT IS SEIZED BY THIS CONTROLLER.1;3) CLR MLDS(R2) ;ATTEMPT TO SEIZE THE DRIVE( BIT #400,MLDS(R2) ;DID THE DRIVE SEIZE? BNE 5$ ;IF NE YES % MOVB #100,(R2) ;RE-ENABLE INTERRUPTSN0 BISB #SEL,U.CW2+1(R5);SET PORT SELECT WAIT FLAG< MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNT* CALLR $RLCN ;RELEASE CONTROLLER AND EXIT;..; LOAD CONTROLLER REGISTERS FOR DATA TRANSFER.;75$: MOV #TRE!11,(R2) ;CLEAR CONTROLLER AND DRIVE ERRORSR# ADD #MLCS2,R2 ;POINT TO SECOND CSRE- MOV I.PRM+12(R1),-(R2) ;INSERT DISK ADDRESSL. MOV U.BUF+2(R5),-(R2) ;INSERT BUFFER ADDRESS8 MOV U.CNT(R5),-(R2) ;INSERT NUMBER OF BYTES TO TRANSFER! ROR (R2) ;CONVERT TO WORD COUNTB$ NEG (R2) ;MAKE NEGATIVE WORD COUNT" TST -(R2) ;POINT TO CSR REGISTER;(&; TEST FOR DRIVE NOT READY CONDITIONS.;C+ MOV #IE.DNR&377,R0 ;ASSUME DRIVE NOT READYX7 MOV MLDS(R2),R3 ;GET CONTENTS OF DRIVE STATUS REGISTER COM R3 ;COMPLEMENT STATUS ( BIT #10200,R3 ;DRIVE READY AND ON-LINE? BEQ 20$ ;IF EQ YES1 BITB #US.SPU,U.STS(R5) ;IS DRIVE 'SPINNING UP'? BEQ 10$ ; IF EQ NO; BITB #US.VV,U.STS(R5) ;WAS THE VOLUME PREVIOUSLY MOUNTED?  BEQ EMPWF1 ;IF EQ NO* BR EMPWF0 ;YES, WAIT FOR IT TO 'SPIN UP'210$: BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC OPERATION BEQ 15$ ;IF EQ NOT. CALLR EMDIAG ;LOG DIAGNOSTIC DRIVE NOT READY+15$: CALL $DVERR ;LOG DEVICE TIMEOUT ERROR( CALLR EMFIN ;FINISH UP720$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE 'SPINNING UP'#8 BICB #S3.SPU,S.ST3(R4) ;CLEAR PORT 'SPINNING UP' FLAGS* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS MOV R3,R1 ;COPY KRB ADDRESSB; $; START THE DATA TRANSFER OPERATION.;S! MTPS #PR5 ;;;DISABLE INTERRUPTSO1 BIT #FE00lÊ0N0TADATADATADATADATADATADATADATADATA.EXT,$FMASK ;;;22-BIT ADDRESSING ENABLED?B BEQ 30$ ;;;IF EQ NO;7 BIT #KS.MBC,K.STS(R3) ;;;IS THIS A 22-BIT CONTROLLER?  BEQ 30$ ;;;IF EQ NON' ADD K.OFF(R3),R1 ;;;POINT TO UCB TABLEI+ MOV KE.RHB(R1),R1 ;;;RETRIEVE RHBAE OFFSETB' ADD R2,R1 ;;;FORM AN I/O PAGE ADDRESSN2 MOVB U.BUF+1(R5),(R1);;;SET MEMORY EXTENSION BITS& MOVB U.BUF(R5),(R2) ;;;START FUNCTION BR 40$ ;;;)30$: MOV U.BUF(R5),(R2) ;;;START FUNCTION +40$: CLR S.FRK+2(R4) ;;;INIT FORK INTERLOCK / MOVB S.ITM(R4),S.CTM(R4) ;;;SET TIMEOUT COUNT 8 BIS #KS.DIP,K.STS(R3) ;;;SET DATA TRANSFER IN PROGRESS- BIS #S2.ACT,S.ST2(R4) ;;;SHOW I/O IS ACTIVEO MTPS #0 ;ALLOW INTERRUPTSN;D<; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.;EEMCAN: RETURN ;NOP;+:; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND); CAUSES NO IMMEDIATE ACTION ON THE UNIT.;;-3EMPWF: TSTB S.STS(R4) ;IS THIS UNIT CURRENTLY BUSY?S BEQ EMPWF2 ;IF EQ NO6EMPWF0: MOVB #4,S.STS(R4) ;WAIT A MAXIMUM OF 8 SECONDS6EMPWF1: MOVB S.ITM(R4),S.CTM(R4) ;2 SECONDS AT A TIME7EMPWF2: BISB #US.SPU,U.STS(R5) ;SET UNIT 'SPINNING UP' 7EMPWF3: CALLR $RLCN ;RELEASE CONTROLLER (IF NECESSARY)D;+9; **-$EMINT-RH11-ML11 MEMORY SYSTEM CONTROLLER INTERRUPTS; INTERRUPT SERVICE ROUTINE;-3$EMINT::BR EMFRK ;;;ENTRY POINT FOR DATA TRANSFERS+ TST S.FRK+2(R4) ;;;ARE INTERRUPTS ALLOWED?- BNE EMCAN ;;;IF NE NO ' CALL $FORK ;;;CREATE A SYSTEM PROCESSF9EMFRK: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER82 BITB #SEL,U.CW2+1(R5);WAITING FOR PORT TO SELECT? BEQ 5$ ;IF EQ NO2 BICB #SEL,U.CW2+1(R5);CLEAR PORT SELECT WAIT FLAG% JMP EMINIO ;YES, GO DO THE TRANSFERR-5$: MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS - MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEXP% MOV U.SCB(R5),R4 ;GET ADDRESS OF SCBF/ MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFERK# MOV @S.KRB(R4),R2 ;GET CSR ADDRESSB( MOVB U.UNIT(R5),MLCS2(R2) ;SELECT UNIT# TSTB S.STS(R4) ;IS THIS UNIT BUSY?R BNE 15$ ;IF NE YES& CLR S.FRK+2(R4) ;RESET FORK INTERLOCK- MOV #TRE!11,(R2) ;CLEAR CONTROLLER AND DRIVEF- BIT #S2.MAD,S.ST2(R4) ;MULTI-ACCESS DEVICE?T BNE 10$ ;IF NE YES. MOVB #100,(R2) ;NO, JUST RE-ENABLE INTERRUPTS( BR EMPWF3 ;RELEASE CONTROLLER AND EXIT&10$: MOVB #113,(R2) ;RELEASE THE DRIVE8 BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED( BR EMPWF3 ;RELEASE CONTROLLER AND EXIT;2+; THE UNIT WAS BUSY. NOW CHECK FOR ERRORS.);S315$: BITB #US.SPU,U.STS(R5) ;ARE WE 'SPINNING UP'?E BNE EMREST ;IF NE YESF) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS17 BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION EXECUTED?) BNE EMDIAG ;IF NE YES BIT #60000,(R2) ;ANY ERRORS?0 BEQ EMWCHK ;IF EQ NO. MOV MLWC(R2),R0 ;GET NEGATIVE WORDS REMAINING# ASL R0 ;CONVERT TO NEGATIVE BYTEST7 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERRED * SUB #512.,R0 ;SUBTRACT OUT BLOCK IN ERROR* BLE 20$ ;IF LE NO GOOD BYTES TRANSFERRED2 BIT #S2.EIP,S.ST2(R4) ;ERROR ALREADY IN PROGRESS BEQ 20$ ;IF EQ NOB;E;; WE GOT AN ERROR BUT SOME GOOD DATA WAS TRANSFERRED. THIS16; INDICATES THAT WE RECOVERED FROM THE PREVIOUS ERROR.;, CALL EMCALC ;CALCULATE NEW DISK PARAMETERS MOV R2,-(SP) ;SAVE CSR ADDRESSO/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNT/ BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNTR1 MOV #IS.SUC&377,R0 ;THIS RECOVERY WAS SUCCESSFUL#+ CALL $FNERL ;FINISH ERROR LOGGING PROCESS$- MOV #RETRY,RTTBL(R3);SET INITIAL RETRY COUNTP" MOV (SP)+,R2 ;RESTORE CSR ADDRESS#20$: CALL $DVERR ;LOG DEVICE ERRORT- MOV #IE.WCK&377,R0 ;ASSUME WRITE CHECK ERRORT* BIT #40000,MLCS2(R2) ;WRITE CHECK ERROR? BNE EMRTRY ;IF NE YESL/ MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERROR,0 MOV MLER(R2),R1 ;GET CONTENTS OF ERROR REGISTER BIT #43007,R1 ;HARD ERROR?S BNE 30$ ;IF NE YES! BIT #14000,MLCS2(R2);NEM OR NED?C BNE 30$ ;IF NE YES TST MLCS2(R2) ;DATA LATE ERROR? BPL EMRTRY ;IF PL NO, CALL EMCALC ;YES, CALCULATE NEW PARAMETERS& BR EMRTRY ;RETRY FROM BLOCK IN ERROR$30$: BIT #4000,R1 ;WRITE LOCK ERROR? BEQ EMFIN ;IF EQ NO ) MOV #IE.WLK&377,R0 ;S00lÒ0Å0¶0eaek›’ET WRITE LOCK ERRORS BR EMFIN ;FINISH I/O;B@; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING REPEATEDA; UNLESS THE REQUEST WAS DIAGNOSTIC. TIMEOUTS ARE USUALLY CAUSED0C; BY POWERFAILURE BUT MAY ALSO BE THE RESULT OF A HARDWARE FAILURE.R;D9EMOUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE 'SPINNING UP'?B BEQ 10$ ;;;IF EQ NOC- DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET?  BEQ 10$ ;;;IF EQ YES MTPS #0 ;;;ALLOW INTERRUPTSW. CALL $RQCND ;REQUEST CONTROLLER FOR TRANSFER# BR EMREST ;RETRY ENTIRE OPERATION,10$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY5 BICB #US.SPU,U.STS(R5) ;;;RESET DRIVE 'SPINNING UP'E MTPS #0 ;;;ALLOW INTERRUPTS . CALL $RQCND ;REQUEST CONTROLLER FOR TRANSFER* MOV S.KRB(R4),R2 ;GET CURRENT KRB ADDRESS- MOVB K.CON(R2),R3 ;RETRIEVE CONTROLLER INDEX;# MOV (R2),R2 ;RETRIEVE CSR ADDRESS;( MOVB U.UNIT(R5),MLCS2(R2) ;SELECT UNIT! CALL $DVTMO ;LOG DEVICE TIMEOUTQ2 BITB #SEL,U.CW2+1(R5);WAITING FOR PORT TO SELECT?) BNE EMFIN1 ;IF NE YES, WE DIDN'T GET ITT3 BCC EMRTRY ;IF CC, TIMEOUT DURING NORMAL FUNCTIONA7EMDIAG: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASKV* BR EMFIN ;DIAGNOSTIC PROCESSING COMPLETE; ; RETRY THE CURRENT OPERATION.; 0EMRTRY: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS' BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?R BNE EMFIN ;IF NE YES DEC RTTBL(R3) ;RETRY FUNCTION?  BLE EMFIN ;IF LE NOS'EMREST: MOVB #111,(R2) ;CLEAR THE DRIVEE! CALLR EMUBMP ;RESTART OPERATIONG;R!; TEST FOR WRITE CHECK OPERATION.N;ECEMWCHK: BITB #IO.WLC&377,I.FCN(R1) ;WRITE FOLLOWED BY WRITE CHECK?T BNE 10$ ;IF NE YES5 BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED BY MCR?I BEQ EMFIN ;IF EQ NOP)10$: MOVB U.BUF(R5),R1 ;GET LAST FUNCTION  CMPB #171,R1 ;WAS IT A READ? BEQ EMFIN ;IF EQ YES* CMPB #161,R1 ;WAS LAST FUNCTION A WRITE? BNE EMFIN ;IF NE NOR. MOV #RETRY,RTTBL(R3);REINITIALIZE RETRY COUNT. MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS# MUL #5,R3 ;FORM AN INDEX INTO ...' ADD #PRMSV,R3 ;... PARAMETER SAVE AREAM) MOV (R3)+,U.BUF(R5) ;RESTORE PARAMETERSL MOV (R3)+,U.BUF+2(R5) ;... MOV (R3)+,U.CNT(R5) ;... MOV (R3)+,I.PRM+10(R1) ;... MOV (R3)+,I.PRM+12(R1) ;.... MOVB #151,U.BUF(R5) ;SET WRITE CHECK FUNCTION( BR EMREST ;START WRTIE CHECK OPERATION;I; **-EMFIN-FINISH I/O OPERATIONT;NC; THIS ROUTINE WILL SET THE ACTUAL BYTES TRANSFERRED PARAMETER, THEAC; ERROR LOGGING RETRY COUNTS AND CALL $IODON. A CHECK WILL BE MADELA; FOR ANY PENDING ATTENTIONS AND THE CONTROLLER WILL BE RELEASED.E;E ; INPUTS:3;U; R0=SUCCESS/ERROR CODET; R2=ADDRESS OF CONTROLLER CSR; R4=ADDRESS OF THE SCB ; R5=ADDRESS OF THE UCB1;17EMFIN: MOV MLWC(R2),R1 ;GET WORDS REMAINING TO TRANSFER;+ ASL R1 ;CONVERT TO BYTES LEFT TO TRANSFERW7 ADD U.CNT(R5),R1 ;CALCULATE BYTES ACTUALLY TRANSFERREDO&EMFIN1: MOVB #11,(R2) ;CLEAR THE DRIVE# MOV #TRE,(R2) ;NOW CLEAR THE DRIVE* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS2 BICB #SEL,U.CW2+1(R5);CLEAR PORT SELECT WAIT FLAG+10$: TSTB MLAS(R2) ;ANY ATTENTIONS PENDING? BEQ 20$ ;IF EQ NOS1 BISB #100,(R2) ;RE-DISPATCH TO INTERRUPT HANDLER BR 10$ ;TRY AGAINC020$: BIT #S2.MAD,S.ST2(R4) ;DUAL ACCESS DEVICE? BEQ 30$ ;IF EQ NOE6 BITB #S3.NRL,S.ST3(R4) ;SHOULD WE RELEASE THE DRIVE? BEQ 35$ ;IF EQ YES)30$: MOVB #100,(R2) ;RE-ENABLE INTERRUPTSE BR 40$ ;<35$: BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED7 MOVB #113,(R2) ;RE-ENABLE INTERRUPTS AND RELEASE DRIVE 140$: MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEXT/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNT / BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNTR CALL $RLCN ;RELEASE CONTROLLER# CALL $IODON ;FINISH I/O OPERATIONC! JMP EMINI ;PROCESS NEXT REQUEST; >; THE TRANSFER STOPPED DUE TO A RETRYABLE ERROR CONDITION. WE>; WILL NOW BACKUP THE WORD COUNT, BUS ADDRESS AND TRACK/SECTOR>; ADDRESS BY ONE BLOCK AND RETRY THE TRANSFER FROM THIS POINT.@; THIS IS DONE TO PREVENT THE ERROR CONDITION FROM RECURRING DUE; TO A LONG TRANSFER.C;R5EMCALC: MOV MLWC(R2),R0 ;GET NEGATIVE WORDS REMAININGO* BNE 10$ 00lÚ0mÝ0nß0DATADATADATADATADATADATADATA;IF NE WE HAD A PARTIAL TRANSFER0 MOV #-1,R0 ;DLT ON LAST WORD, FAKE PARTIAL XFR'10$: ASL R0 ;CONVERT TO NEGATIVE BYTESI7 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERREDD. BIC #777,R0 ;GET BLOCKS ACTUALLY TRANSFERRED5 SUB R0,U.CNT(R5) ;REDUCE BYTES REMAINING TO TRANSFER* BEQ 30$ ;IF EQ NO MORE BYTES TO TRANSFER3 ADD R0,U.BUF+2(R5) ;UPDATE STARTING BUFFER ADDRESSO0 ADCB U.BUF+1(R5) ;AND THE MEMORY EXTENSION BITS2 BIT #FE.EXT,$FMASK ;IS 22-BIT ADDRESSING ENABLED? BEQ 15$ ;IF EQ NO1+ MOV S.KRB(R4),R1 ;RETRIEVE THE KRB ADDRESS19 BIT #KS.MBC,K.STS(R1) ;IS THIS A 22-BIT MASSBUS DEVICE?V BNE 15$ ;IF NE YES& ADD K.OFF(R1),R1 ;POINT TO UMR AREA+2) ADD R0,-(R1) ;CALCULATE NEW REAL ADDRESSK ADCB -(R1) ;...R215$: MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS# SWAB R0 ;GET BLOCKS*2 TRANSFERREDS CLC ;CLEAR CARRY FOR ROTATE ROR R0 ;GET BLOCKS TRANSFERRED-20$: ADD R0,I.PRM+12(R1) ;UPDATE DISK ADDRESSI RETURN ;E430$: ADD R0,U.CNT(R5) ;YES, BACKUP BYTES TO TRANSFER RETURN ;V .END),R1 ;RETRIEVE THE KRB ADDRESS19 BIT #KS.MBC,K.STS(R1) ;IS THIS A 22-BIT MASSBUS DEVICE?V BNE 15$ ;IF NE YES& ADD K.OFF(R1),R1 ;POINT TO UMR AREA+2) ADD R0,-(R1) ;CALCULATE NEW REAL ADDRESSK ADCB -(R1) ;...R215$: MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS# SWAB R0 ;GET BLOCKS*2 TRANSFERREDS CLC ;CLEAR CARRY FOR ROTATE ROR R0 ;GET BLOCKS TRANSFERRED-20$: ADD R0,I.PRM+12(R1) ;UPDATE DISK ADDRESSI RETURN ;E430$: ADD R0,U.CNT(R5) ;YES, BACKUP BYTES TO TRANSFER RETURN .TITLE EXPOLT .IDENT /02/ C;2 ; COPYRIGHT (C) 1978, 1979, 1981/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED 9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.E;T ; VERSION 02;I; T. J. MILLER 23-OCT-77;EF; THIS MODULE STARTS THE POOL IN SYSTEMS SUPPORTING KERNEL DATA SPACE.;R; MODIFIED BY:; ; D. R. DONCHIN 23-NOV-81R; /; DD134 -- ALWAYS DEFINE $POOL IN EXPOL MODULE1;R S.$POOL:: ;REFERENCE LABEL FOR BOTTOM OF POOL  .IF DF K$$DAS 1$SYBEG::.WORD 0 ;LINK TO NEXT BLOCK IN FREE LISTO4 .WORD <<+3>&177774> ;LENGTH OF FREE BLOCK< .BLKB <<+3>&177774>-4 ;ALLOCATE REMAINING STORAGE%$SYTOP:: ;LAST ADDRESS IN EXECUTIVE E .ENDC I  .ENDILLER 23-OCT-77;EF; THIS MODULE STARTS THE POOL IN SYSTEMS SUPPORTING KERNEL DATA SPACE.;R; MODIFIED BY:; ; D. R. DONCHIN 23-NOV-81R; /; DD134 -- ALWAYS DEFINE $POOL IN EXPOL MODULE1;R S.$POOL:: ;REFERE .TITLE DRGTPO .IDENT /08.03/I;CC; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;:<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;N; D. N. CUTLER 30-AUG-73; ); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:D;H; T. M. MARTIN;:; MODIFIED BY:;T ; B. S. MCCARTHY 23-MAY-82 08.01;O7; BM255 -- ADD E$$LOG AND R$$PRO CONDITIONALS FOR P/OS1;O; T. LEKAS 3-JUNE-82 08.02;./; TL191 -- CHANGE REFERENCES TO $CTFEA AND CF.c&; SECOND HARDWARE FEATURE MASK WORD;R; T. LEKAS 18-AUG-82 08.03;E1; TL221 -- RETURN IE.ITF ON A GET TIME IF H2.ITFE; IS SET FOR P/OS;P;+1; **-$DRGTP-GET TIME PARAMETERS / SET SYSTEM TIME;G; THE GET TIME DIRECTIVE INSTRUCTS THE SYSTEM TO FILL A SPECIFIED EIGHT/; WORD BUFFER WITH THE CURRENT TIME PARAMETERS.S;CB; THE SET SYSTEM TIME DIRECTIVE INSTRUCTS THE SYSTEM TO OPTIONALLYE; FILL A SPECIFIED EIGHT WORD BUFFER WITH THE CURRENT TIME PARAMETERSE?; AND TO RESET THE SYSTEM TIME USING A SPECIFIED TIME AND DATE. ;D;R/; DPB FORMAT FOR GET TIME PARAMETERS DIRECTIVE:U;I"; WD. 00 -- DIC(61.),DPB SIZE(2.).,; WD. 01 -- ADDRESS OF AN EIGHT WORD BUFFER.;R+; DPB FORMAT FOR SET SYSTEM TIME DIRECTIVE:E;R"; WD. 00 -- DIC(61.),DPB SIZE(3.).;; WD. 01 -- ADDRESS OF AN EIGHT WORD NEW TIME SPECIFICATIONE=; WD. 02 -- ADDRESS OF AN EIGHT WORD OUTPUT BUFFER (OLD TIME)M; ;I; BUFFER FORMAT:;I; WD. 00 -- YEAR SINCE 1900.00nâ0Å0¶0eaek›’; WD. 01 -- MONTH OF YEAR.; WD. 02 -- DAY OF MONTH.I; WD. 03 -- HOUR OF DAY.; WD. 04 -- MINUTE OF HOUR.M; WD. 05 -- SECOND OF MINUTE.C; WD. 06 -- TICK OF SECOND.1; WD. 07 -- TICKS PER SECOND.D;S ; INPUTS:H;O9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.E+; R3=ADDRESS OF THE SECOND WORD IN THE DPB.D/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.C,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;U5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)D;0-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED..&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.E8; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF BUFFER IS,; OUTSIDE OF ISSUING TASK'S ADDRESS SPACE.;-; $DRGTP:: MOVB -(R3),R4 ;GET DPB LENGTH. CMPB (R3)+,#2 ;GET TIME PARAMETERS DIRECTIVE? .IF DF R$$PRO! BNE 4$ ;IF NE NO - TRY SET TIMER2 BIT #H2.ITF,$HFMSK+2 ;IS THE DATA VALID FROM THE ;HARDWARE DATE/TIME CLOCK?0 BNE 40$ ;IF NE NO - RETURN INVALID TIME FORMAT& BR 5$ ;THE TIME IS VALID - RETURN IT .IFF ;R$$PROI BEQ 5$ ;IF EQ YESR .ENDC ;R$$PRO+4$: CMPB R4,#3 ;SET SYSTEM TIME DIRECTIVE?.$ BNE 41$ ;IF NE, ILLEGAL DPB LENGTH( BIT #T3.PRV,T.ST3(R5) ;TASK PRIVILEGED? BNE 3$ ;IF NE YES ( DRSTS D.RS16 ;ELSE PRIVILEGE VIOLATION23$: MOV (R3)+,R5 ;COPY VIRTUAL ADDRESS OF NEW TIME25$: MOV (R3)+,R3 ;GET PREVIOUS TIME BUFFER ADDRESS0 BNE 7$ ;IF NE, THERE IS A PREVIOUS TIME BUFFER BIT #1,R4 ;IS THIS A SET TIME?1 BNE 15$ ;IF NE YES, OLD TIME BUFFER IS OPTIONAL 17$: MOV #8.*2,R1 ;SET LENGTH OF BUFFER IN BYTES ;- CALL $ACHKP ;ADDRESS CHECK PARAMETER BUFFER 1 MOV #$TTNS-14,R1 ;POINT TO CURRENT TIME VECTOR E:10$: MOV (R1)+,(R3)+ ;INSERT TIME PARAMETER IN TASK BUFFER# CMP R1,#$TTNS ;ANY MORE TO INSERT?L BLOS 10$ ;IF LOS YES% MOV $TKPS,(R3) ;SET TICKS PER SECONDO(15$: ROR R4 ;SET SYSTEM TIME DIRECTIVE?$ BCC 90$ ;IF CC NO, GETTIM FINISHED( MOV R5,R3 ;GET NEW TIME BUFFER ADDRESS, MOV #8.*2,R1 ;SET LENGTH OF NEW TIME BUFFER4 CALL $ACHKP ;ADDRESS CHACK AND MAP NEW TIME BUFFER. MOV #$TTNS+2,R1 ;POINT TO CURRENT TIME VECTOR)20$: MOV -(R1),-(SP) ;COPY TIME PARAMETER4 CMP R1,#$TTNS-14 ;MORE TO COPY? BHI 20$ ;IF HI YES, CLR R2 ;INITIALIZE FEBRUARY DPM ADJUSTMENT, MOV SP,R5 ;POINT TO CURRENT YEAR PARAMETER. MOV #$TKPS-14,R1 ;POINT TO TIME LIMITS VECTOR CALL 100$ ;VALIDATE YEAR BIT #3,R0 ;LEAP YEAR?$ BNE 25$ ;IF NE NOI INC R2 ;SET FEB CONSTANT25$: U CALL 100$ ;VALIDATE MONTHS, BLOS 40$ ;IF C=1 OR Z=1 THEN INVALID MONTH DEC R0 ;NORMALIZE TO ZERO " BNE 27$ ;IF NE, THEN NOT JANUARY2 ADD #12.,R0 ;ELSE ADJUST TABLE INDEX FOR JANUARY27$: CMP R0,#1 ;FEBRUARY? BEQ 28$ ;IF EQ, YES2' CLR R2 ;ELSE CLEAR ANY DPM ADJUSTMENTU<28$: MOVB $DYPMN-1(R0),R4 ;GET NUMBER OF DAYS FOR THIS MONTH% ADD R4,R2 ;CALCULATE DAYS-PER-MONTHM CALL 100$ ;VALIDATE DAYL" BEQ 40$ ;IF Z=1 THEN ILLEGAL DAY DEC R2 ;NORMALIZE REFERENCE 3 CMPB R2,R0 ;DAY SPECIFIED HIGHER THAN CALC'D DPM?T% MOV #4,R4 ;VALIDATE HR,MIN,SEC,TICKL30$: CALL 100$ ;; SOB R4,30$ ;- BCS 40$ ;IF CS, THEN INVALID TICK OF SECOND21 MOV (R3),R0 ;GET GRANULARITY (TICKS PER SECOND)P: CMP -(R1),R0 ;CORRECT TICK PER SECONDS ON CURRENT SYSTEM? BEQ 50$ ;IF EQ YES$ CMP R0,#-1 ;DEFAULTED GRANULARITY? BEQ 50$ ;IF EQ YES*40$: DRSTS D.RS93 ;INVALID TIME PARAMETER&41$: DRSTS D.RS99 ;INVALID DPB LENGTH50$: INC R2 ;CORRECT DPMD. MOV R2,$TKPS-10 ;UPDATE NEW DAYS/MONTH LIMIT' MOV R5,R3 ;COPY TOP OF STACK POINTER#% DEC R3 ;ADJUST POINTER TO NEW TIMEC .IF DF A$$CNT! TST $SABPT ;ACCOUNTING ACTIVE?V BEQ 70$ ;IF EQ NO+ MOV #$TKPS+2,R4 ;POINT TO OLD TIME VECTORO8 MOV #/64.,R1 ;SET NUMBER OF BLKS TO ALLOCATE3 CALL $ALACC ;ALLOCATE ACCOUNTING TRANSACTION BLK % BCS 70$ ;IF CS, ALLOCATION FAILURE:& MOV R0,KISAR6 ;MAP TRANSACTION BLOCKK MOV #+BT.TIM,140000+B.TYP ;FILL IN TRANSACTION TYPE AND LENGTHT: MOV #140000+B.TNEW+7,R2 ;INIT OFFSET INTO OLD TIME VECTOR8 MOV #140000+B.TOLD,R1 ;INIT OFFSET INTO NEW TIME VECTOR;60$: MOVB 00nê0oð0ß0DATADATADATADATADATADATADATA-(R3),-(R2) ;PLACE NEW TIME INTO TRANSACTION BLKQ7 MOVB (R4)+,(R1)+ ;PLACE OLD TIME INTO TRANSACTION BLKC# CMPB -(R3),(R4)+ ;ADJUST POINTERSU+ CMP R3,SP ;MORE TIME PARAMETERS TO MOVE?O BHI 60$ ;IF NE YEST/ MOV R0,R1 ;COPY TRANSACTION BLK MAPPING BIAS, CALL $QACNT ;QUEUE ACCOUNTING TRANSACTION .ENDC ;A$$CNT70$: ;REFERENCE LABEL .IF DF E$$LOG SEC ;ASSUME NO ERROR LOG PKTN1 BIT #ES.LOG,$ERFLA ;IS ERROR LOGGING TURNED ON?, BEQ 75$ ;IF EQ NO0 MOV #E$CCTL+<400*E$STIM>,R0 ;GET THE ENTRY CODE0 MOV #12.,R1 ;DATA SUBPACKET IS 12. BYTES LONG8 MOV #SM.HDR!SM.TSK!SM.DAT,R2 ;GET INFORMATION TO RECORD# MOV SP,R3 ;SET UP R3 TO POINT ATM ;ANYTHING THE CORRECT DATA ;SUBPACKET CONTENTS WILL BE ;FILLED IN LATER.1 MOV $TKTCB,R4 ;GET THE CURRENT TASK TCB ADDRESS! CALL $CRPKT ;CREATE THE PACKETN .IFTF ; DF E$$LOG675$: MOV #$TTNS-14,R4 ;POINT PAST CURRENT TIME VECTOR' MOV #6,R5 ;MOV 6 WDS OF NEW TIME VEC780$: ;REFERENCE LABEL .IFT ; DF E$$LOGE BCS 85$ ;IF CS NO ERRLOG PKT& MOVB (SP),(R1)+ ;FILL IN DATA PACKET .IFTF ; DF E$$LOG-85$: MOV (SP)+,(R4)+ ;SET NEW TIME PARAMETERP SOB R5,80$ ;VECTOR IN PLACE, MOV (SP)+,(R4)+ ;RETURN NEW TICK_OF_SECOND .IFT ; DF E$$LOGI BCS 90$ ;IF CS, NO ERRLOG PKT CALL $QUPKT ;ELSE QUEUE ITL .ENDC ; DF E$$LOG .IF DF R$$PRO- BIC #H2.ITF,$HFMSK+2 ;THE TIME IS NOW VALIDT3 BIT #H2.CLK,$HFMSK+2 ;TIME OF DAY CLOCK PRESENT ?T BEQ 90$ ;IF EQ NOF) CALL $SETCK ;SET TIME IN THE CLOCK CHIP8 .ENDC ; DF R$$PRO 90$: RETURN(;+A; THIS ROUTINE VALIDATES THE TIME PARAMETERS. IF THE C-BIT IS SET+H; UPON ENTRY, IT IS ASSUMED THAT AN INVALID TIME PARAMETER WAS DETECTED.K; IF THE USER PARAMETER, POINTED TO BY R3, IS EQUAL TO -1, THE VALUE OF THERF; CURRENT TIME VECTOR IS USED. ONLY THE UPPER LIMIT IS CHECKED BY THISF; ROUTINE BY COMPARING THE INPUT TIME PARAMETER WITH THE CORRESPONDINGD; LIMIT IN THE $TKPS VECTOR. IF THIS CHECK FAILS THE C BIT IS SET ONF; RETURN. IN ANY CASE, THE NEW TIME PARAMETER IS MOVED INTO THE VECTOR; ADDRESSED BY R5.;V1100$: BCS 40$ ;IF CS, ILLEGAL TIME PARAMETER HASP ;ALREADY BEEN DETECTED.A" MOVB (R3),R0 ;GET TIME PARAMETER! BPL 110$ ;IF PL, SO FAR SO GOODD5 CMP R0,#-1 ;OTHERWISE, IS IT A DEFAULTED PARAMETER? 2 BNE 40$ ;IF NE NO, NEGATIVE VALUES ARE NOT VALID. ;TIME PARAMETERS. NOTE THAT THE HIGH LIMIT. ;FOR THE YEAR PARAMETER CORRESPONDS TO THE/ ;YEAR 2128. THIS SEEMINGLY RESTRICTIVE HIGHE/ ;LIMIT PREVENTS USERS FROM SPECIFYING THEIRE. ;YEAR PARAMETER BASED ON ZERO, RATHER THAN ;THE YEAR 1900. 8 MOV (R5),R0 ;USE CURRENT TIME VECTOR TO SUPPLY DEFAULT7110$: TST (R3)+ ;ADJUST POINTER TO NEXT TIME PARAMETER;3 CMP (R1)+,R0 ;SET C BIT FOR OUT_OF_RANGE PARAMETERT BNE 120$D SEC:120$: MOV R0,(R5)+ ;MOVE NEW TIME PARAMETER TO TIME VECTOR ;ON STACK. RETURNE H .ENDLIT. ;FOR THE YEAR PARAMETER CORRESPONDS TO THE/ ;YEAR 2128. THIS SEEMINGLY RESTRICTIVE HIGHE/ ;LIMIT PREVENTS .TITLE DRSEDR .IDENT /09.10/,; C; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;U<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;$; D. N. CUTLER 2-SEP-73E;O); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:D;V; J. M. LAWLER; B. S. MCCARTHY;P; MODIFIED BY:;L ; B. S. MCCARTHY 23-MAY-82 09.01;S,; BM255 -- ADD G$$GEF CONDITIONALS FOR P/OS;C; M. PETTENGILL 1-JUN-82 09.024; MLP901 -- CORRECT BM255 CONDITIONALS IN WTLO CODE; ; J. R. KAUFFMAN 17-OCT-82 09.03;N0; JRK263 -- MOVE MORE CODE TO DIRECTIVE COMMONS;R; J. M. LAWLER 20-OCT-82 09.04 ;D1; JL137 -- FIX BUG WHICH CALCULATED EF MASK WORDS; INCORRECTLY;.-; SIGNIFICANT EVENT AND EVENT FLAG DIRECTIVESM;U; MACRO LIBRARY CALLS ;M .MCALL HDRDF$,TCBDF$Y% HDRDF$ ;DEFINE TASK HEADER OFFSETST, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;+; **-$DRREF-READ EVENT FLAGE;L?; TH00oò0Å0¶0eaek›’IS DIRECTIVE INSTRUCTS THE SYSTEM TO READ AN EVENT FLAG AND ; REPORT ITS POLARITY.;1 ; DPB FORMAT:;"; WD. 00 -- DIC(37.),DPB SIZE(2.).1; WD. 01 -- EVENT FLAG NUMBER OF FLAG TO BE READ.; ; INPUTS: ; ; R0=EVENT FLAG MASK WORD.; R1=EVENT FLAG MASK ADDRESS. 9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.I+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.H/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.D,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;R5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)E;S9; C=0 WITH A DIRECTIVE STATUS OF 'D.RS00' IF THE FLAG WAS); CLEAR OR 'D.RS22' IF THE FLAG WAS SET.B;- .ENABL LSB1$DRREF::BIT R0,(R1) ;TEST FLAG  BNE 10$ ;IF NE FLAG IS SET$ DRSTS D.RS00 ;SET DIRECTIVE STATUS;+; **-$DRCEF-CLEAR EVENT FLAG;A@; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CLEAR AN EVENT FLAG AND&; REPORT ITS POLARITY BEFORE CLEARING.;R ; DPB FORMAT: ;K"; WD. 00 -- DIC(31.),DPB SIZE(2.).4; WD. 01 -- EVENT FLAG NUMBER OF FLAG TO BE CLEARED.;U ; INPUTS:K;; R0=EVENT FLAG MASK WORD.; R1=EVENT FLAG MASK ADDRESS.A9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.B+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.B/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.I,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;L5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)A;V9; C=0 WITH A DIRECTIVE STATUS OF 'D.RS00' IF THE FLAG WAS ); CLEAR OR 'D.RS22' IF THE FLAG WAS SET.S;-$DRCEF::BIT R0,(R1) ;TEST FLAG  BEQ 20$ ;IF EQ FLAG IS CLEAR BIC R0,(R1) ;CLEAR FLAG (10$: DRSTS D.RS22 ;SET DIRECTIVE STATUS;+ ; **-$DRRAF-READ ALL EVENT FLAGS%; **-$DRREF-READ EXTENDED EVENT FLAGSH;AC; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO FILL A FOUR (OR SIX) WORD K>; BUFFER WITH THE TASK LOCAL AND COMMON EVENT FLAGS (AND GROUP; GLOBAL FLAGS).;D ; DPB FORMAT: ;K(; WD. 00 -- DIC(39.),DPB SIZE(2. OR 3.).3; WD. 01 -- ADDRESS OF A FOUR (OR SIX) WORD BUFFER. ;G; BUFFER FORMAT:;C(; WD. 00 -- TASK LOCAL EVENT FLAGS 1-16.); WD. 01 -- TASK LOCAL EVENT FLAGS 17-32.A%; WD. 02 -- COMMON EVENT FLAGS 33-48.T%; WD. 03 -- COMMON EVENT FLAGS 49-64.F,; WD. 04 -- GROUP GLOBAL EVENT FLAGS 65.-80.,; WD. 05 -- GROUP GLOBAL EVENT FLAGS 81.-96.; ; INPUTS:S; 9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. .; R3=ADDRESS OF THE BUFFER ADDRESS IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)T;A-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.-3; DIRECTIVE STATUS OF +1 IS RETURNED IF SUCCESSFUL3.; DIRECTIVE STATUS OF 'D.RS00' IS RETURNED IF); GROUP GLOBAL EVENT FLAGS DO NOT EXISTR(; FOR THIS TASK'S GROUP. IN THIS CASE); THE LOCAL AND COMMON EVENT FLAGS ARE O'; RETURNED AND THE GROUP GLOBAL FLAGS ; ARE ZERO.E; C=1 IF DIRECTIVE IS REJECTED.H8; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF BUFFER IS,; OUTSIDE OF ISSUING TASK'S ADDRESS SPACE.;-6$DRRAF::MOV (R3),R3 ;GET ADDRESS OF EVENT FLAG BUFFER. MOV #4*2,R1 ;SET LENGTH OF BUFFER IN BYTES  .IF DF X$$HDR&G$$GEFU0 MOVB H.CUIC+1(R4),-(SP) ;SAVE BYTE FROM HEADER  .ENDC ; DF X$$HDR&G$$GEFD MOVB $DICSV+1,R4 ;GET DPB SIZE. CMPB R4,#2. ;READ ALL EVENT FLAGS DIRECTIVE? BEQ 16$ ;IF EQ YES) CMPB R4,#3. ;READ EXTENDED EVENT FLAGS?  BNE 18$ ;IF NE NOC& CMP (R1)+,(R1)+ ;ADD 4 TO BUFFER SIZE,16$: CALL $ACHKP ;ADDRESS CHECK USER BUFFER0 MOV T.EFLG(R5),(R3)+ ;INSERT LOCAL FLAGS 1-16 1 MOV T.EFLG+2(R5),(R3)+ ;INSERT LOCAL FLAGS 17-32M, MOV $COMEF,(R3)+ ;INSERT COMMON FLAGS 33-48. MOV $COMEF+2,(R3)+ ;INSERT COMMON FLAGS 49-64( CMPB R4,#2. ;EXTENDED FLAGS DIRECTIVE? BEQ 17$ ;IF EQ NOM* CLR (R3)+ ;INITIALIZE GROUP GLOBAL FLAGS CLR (R3) ; .IF DF G$$GEF .IF DF X$$HDR- MOVB (SP),R4 ;RELOAD GROUP CODE FROM HEADER .IFF ' MOV $HEADR,R4 ;GET TASK HEADER ADDRESSE, MOVB H.CUIC+1(R4),R4 ;GET TASK GROUP NUMBER .ENDC2 CALL $SRGEF ;SEARCH FOR GROUP GLOBAL EVENT FLAGS BCS 20$ ;IF CS NOT00oú0ð0ß0DATADATADATADATADATADATADATA FOUND0 MOV G.EFLG+2(R1),(R3) ;INSERT GROUP FLAGS 81-96/ MOV G.EFLG(R1),-(R3) ;INSERT GROUP FLAGS 65-80F .IFF ; DF G$$GEF#% BR 20$ ;GROUP GLOBALS NEVER PRESENT  .IFTF ; DF G$$GEF17$: ;REFERENCE LABEL .IFT ; DF G$$GEF .IF DF X$$HDR TST (SP)+ ;CLEAN UP STACKR .ENDC O .ENDC ; DF G$$GEF RETURN$18$: DRSTS D.RS99 ;INVALID DPB SIZE;+; **-$DRSEF-SET EVENT FLAG;R>; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SET AN EVENT FLAG AND$; REPORT IS POLARITY BEFORE SETTING.;M ; DPB FORMAT:,;)"; WD. 00 -- DIC(33.),DPB SIZE(2.).0; WD. 01 -- EVENT FLAG NUMBER OF FLAG TO BE SET.;F ; INPUTS:; ; R0=EVENT FLAG MASK WORD.; R1=EVENT FLAG MASK ADDRESS.9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.$+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.C/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.S,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)O;T9; C=0 WITH A DIRECTIVE STATUS OF 'D.RS00' IF THE FLAG WASM); CLEAR OR 'D.RS22' IF THE FLAG WAS SET.D;-6$DRSEF::BIT #T2.SEF,(R2) ;TASK STOPPED FOR EVENT FLAG? BEQ 19$ ;IF EQ NO@ BIC #T2.STP*2!T2.STP,(R2) ;UNSTOP THE TASK. NOTE THAT THERE IS% ;NO NEED TO CALL $NXTSK OR $SETCRU$ ;SINCE THIS IS THE CURRENT TASK.19$: BIT R0,(R1) ;TEST FLAG BNE 10$ ;IF NE FLAG IS SET BIS R0,(R1) ;SET FLAGO(20$: DRSTS D.RS00 ;SET DIRECTIVE STATUS .DSABL LSBV ;+ E+; **-$DRSTS-STOP FOR SINGLE EVENT FLAG S ; E; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO STOP THE ISSUING TASK UNTIL %; A SPECIFIED EVENT FLAG IS SET. D ; ; DPB FORMAT: N ; '; WD. 00 -- DIC(135.),DPB SIZE(2.). E4; WD. 01 -- EVENT FLAG NUMBER OF FLAG TO WAITFOR. ; ; INPUTS: T ; ; R0=EVENT FLAG MASK WORD. $"; R1=EVENT FLAG MASK ADDRESS. ;; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. .; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. 2; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. /; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. L ; 8; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; 0; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ); DIRECTIVE STATUS OF +1 IS RETURNED. W$; C=1 IF DIRECTIVE IS REJECTED. ;; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE ISSUING T; TASK IS AT AST STATE. A8; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN EVENT .; FLAG NUMBER OTHER THAN A LOCAL EVENT FLAG ; NUMBER IS SPECIFIED. ;- K  .ENABL LSB 5$DRSTS::CMP -2(R3),#64. ;LOCAL OR COMMON EVENT FLAG ?  .IF DF G$$GEF BLOS 5$ ;IF LOS YES 1 CMP -2(R3),#96. ;LEGAL GROUP GLOBAL EVENT FLAG ?  BHI 20$ ;IF HI NO ( MOV R0,-(SP) ;SAVE EVENT FLAG MASK WORD+ MOV R1,-(SP) ;SAVE EVENT FLAG MASK ADDRESS.( CALL 30$ ;DOES THIS EVENT FLAG EXIST ?' BCS 20$ ;IF CS NO, ILLEGAL EVENT FLAGA. MOV (SP)+,R1 ;RESTORE EVENT FLAG MASK ADDRESS+ MOV (SP)+,R0 ;RESTORE EVENT FLAG MASK WORD  .IFF ; DF G$$GEF ' BHI 20$ ;IF HI NO, ILLEGAL EVENT FLAG  .IFTF ; DF G$$GEF"5$: TST (R2) ;TASK AT AST STATE ?& BMI 10$ ;IF MI YES, CANCEL DIRECTIVE3 BIS #T2.SEF,(R2) ;SET STOPPED FOR EVENT FLAG BIT A% JMP $DRWFS ;FINISH STATE PROCESSINGP010$: DRSTS D.RS80 ;ISSUING TASK IS AT AST STATE/20$: DRSTS D.RS97 ;ILLEGAL EVENT FLAG NUMBER V .IFT ; DF G$$GEFS.30$: MOV R4,-(SP) ;SAVE ADDRESS OF TASK HEADER. MOVB H.CUIC+1(R4),R4 ;GET TASK'S GROUP NUMBER4 CALL $SRGEF ;VALIDATE THE GROUP GLOBAL EVENT FLAGS* MOV (SP)+,R4 ;RESTORE TASK HEADER ADDRESS RETURN ;D .ENDC ; DF G$$GEF ;+ B2; **-$DRSTL-STOP FOR LOGICAL OR OF EVENT FLAGS ; E; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO STOP THE ISSUING TASK UNTIL :.; ANY OF THE SPECIFIED EVENT FLAGS IS SET. ; ; DPB FORMAT: G ; '; WD. 00 -- DIC(137.),DPB SIZE(3.). ); WD. 01 -- EVENT FLAG SET INDICATOR. 1&; WD. 02 -- EVENT FLAG MASK WORD. ; ; EVENT FLAG SETS: ; %; SET 00o1Å0¶0eaek›’1 -- EVENT FLAGS 1.-16. LOCALS%; SET 2 -- EVENT FLAGS 17.-32. LOCAL&; SET 3 -- EVENT FLAGS 33.-48. GLOBAL&; SET 4 -- EVENT FLAGS 49.-64. GLOBAL,; SET 5 -- EVENT FLAGS 65.-80. GROUP GLOBAL,; SET 6 -- EVENT FLAGS 81.-96. GROUP GLOBAL ; ; INPUTS: . ; ;; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ..; R3=ADDRESS OF THE SECOND WORD IN THE DPB. 2; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. /; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; 8; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; 0; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ); DIRECTIVE STATUS OF +1 IS RETURNED. -$; C=1 IF DIRECTIVE IS REJECTED. 4; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE $; ISSUING TASK IS AT AST STATE. 3; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN ,; ILLEGAL EVENT FLAG SET OR A ZERO EVENT ; FLAG MASK IS SPECIFIED. O ;- ($DRSTL::TST 2(R3) ;NON-ZERO MASK WORD ? BEQ 20$ ;IF EQ NO, ILLEGAL0 CMP (R3),#3 ;ARE EVENT FLAGS LOCAL OR GLOBAL ? .IF DF G$$GEF BLOS 40$ ;IF LOS YES/ CMP (R3),#5 ;LEGAL GROUP GLOBAL EVENT FLAGS ?E BHI 20$ ;IF HI NOC- CALL 30$ ;ARE THESE GROUP GLOBALS DEFINED ?' BCS 20$ ;IF CS NO, ILLEGAL .IFF ; DF G$$GEFT" BHI 20$ ;IF HI NO, ILLEGAL GROUP .ENDC ; DF G$$GEF#40$: TST (R2) ;TASK AT AST STATE ? ' BMI 10$ ;IF MI,YES - CANCEL DIRECTIVED3 BIS #T2.SEF,(R2) ;SET STOPPED FOR EVENT FLAG BIT ; .DSABL LSB ;+.; **-$DRWFL-WAIT FOR LOGICAL OR OF EVENT FLAGS;OE; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SUSPEND THE EXECUTION OF THEL=; ISSUING TASK UNTIL ANY OF THE SPECIFIED EVENT FLAGS IS SET.0;; ; DPB FORMAT: ;B"; WD. 00 -- DIC(43.),DPB SIZE(3.).%; WD. 01 -- EVENT FLAG SET INDICATOR.2!; WD. 02 -- EVENT FLAG MASK WORD.N;;; EVENT FLAG SETS:;(; SET 0 -- EVENT FLAGS 1.-16.I; SET 1 -- EVENT FLAGS 17.-32.; SET 2 -- EVENT FLAGS 33.-48.; SET 3 -- EVENT FLAGS 49.-64.; SET 4 -- EVENT FLAGS 65.-80.; SET 5 -- EVENT FLAGS 81.-96.;F ; INPUTS:S;O9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.U+; R3=ADDRESS OF THE SECOND WORD IN THE DPB. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;15; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)M; -; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.E&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.S1; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN-*; ILLEGAL EVENT FLAG SET OR A ZERO EVENT; FLAG MASK IS SPECIFIED.;-($DRWFL::MOV (R3)+,R1 ;GET EVENT FLAG SET .IF DF G$$GEF CMP R1,#5 ;LEGAL SET?N .IFF  CMP R1,#3 ; LEGAL SET? .ENDC BHI 10$ ;IF HI NOE ASL R1 ;CONVERT TO WORD INDEX.' MOV (R3),R0 ;GET EVENT FLAG MASK WORD # BEQ 10$ ;IF EQ NO FLAGS SPECIFIEDC$ CMP R1,#3 ;COMMON GLOBAL FLAG SET? BLT 20$ ;IF LT NO  .IF DF G$$GEF% CMP R1,#7 ;GROUP GLOBAL EVENT FLAG?E BLT 5$ ;IF LT NO MOV R4,-(SP) ;SAVE REGISTERS  MOV R0,-(SP) ; ( MOV R1,-(SP) ;SAVE EVENT FLAG SET INDEX' MOVB H.CUIC+1(R4),R4 ;GET GROUP NUMBERL2 CALL $SRGEF ;SEARCH FOR GROUP GLOBAL EVENT FLAGS BCS 10$ ;IF CS NOT FOUND3 ADD (SP)+,R1 ;POINT TO PROPER GROUP GLOBAL EF WORD 8 ADD #G.EFLG-10,R1 ;IN THE GROUP GLOBAL EVENT FLAG BLOCK MOV (SP)+,R0 ;RESTORE REGISTERS MOV (SP)+,R4 ;P1 INC T.GGF(R5) ;INC GRP GLOBAL USE COUNT FOR TASKN1 CMP -2(R3),#4 ;FIRST SIXTEEN GROUP GLOBAL FLAGS?V BEQ 3$ ;IF EQ YES;3 INCB G.CNT-(R1) ;INC GROUPS ACCESS COUNTP BR 4$ ;JOIN COMMON CODEV13$: INC G.CNT-G.EFLG(R1) ;INC GROUPS ACCESS COUNTP<4$: CALLR $DRWS1 ;JOIN COMMON CODE TO SET WFR ON GLOBAL EFN .ENDC ; DF G$$GEF65$: ADD #$COMEF-4,R1 ;POINT TO PROPER COMMON FLAG WORD% BR 30$ ;FINISH UP AS IF SINGLE FLAG (10$: DRSTS D.RS97 ;SET DIRECTIVE STATUS(20$: ADD R5,R1 ;ADD ADDRESS OF TASK TCB0 ADD #T.EFLG,R1 ;POINT TO PROPER TASK FLAGS WORD330$: CALLR $DRWFS ;JOIN COMMON CODE TO SET WFR BITE .ENDINCB G.CNT-(R1) ;INC GROUPS ACC00p 1ð0ß0DATADATADATADATADATADATADATA .TITLE DRPUTI .IDENT /11.01/Y;MC; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.A; ALL RIGHTS RESERVED.;F<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;K; D. N. CUTLER 6-SEPT-73;); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:S;R; P. J. BEZEREDI ; M. S. FOX.; T. M. MARTIN;-; MODIFIED BY:; ; B. S. MCCARTHY 23-MAY-82 11.01;E4; BM255 -- ADD P$$RFL, P$$RTY CONDITIONALS FOR P/OS;(:; SPECIFY FLOATING POINT, POWERFAIL, AND RECEIVE AST TRAPS;9; MACRO LIBRARY CALLSU;E# .MCALL HWDDF$,HDRDF$,TCBDF$,PKTDF$.% HWDDF$ ;DEFINE HARDWARE BIT VALUESR PKTDF$ ;DEFINE AST CODES % HDRDF$ ;DEFINE TASK HEADER OFFSETSE, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;+$; **-$DRPER-SPECIFY PARITY ERROR AST; H; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EITHER RECORD THAT PARITY ERROR8; AST'S ARE DESIRED OR NOT DESIRED FOR THE ISSUING TASK.; ; DPB FORMAT:C;I#; WD. 00 -- DIC(165.),DPB SIZE(2.).I,; WD. 01 -- AST ENTRY POINT ADDRESS OR ZERO.; ; INPUTS:R;A9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. +; R3=ADDRESS OF THE AST ADDRESS IN THE DPB.N/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.T,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)D;C*; C=0 IF DIRECTIVE SUCCESSFULLY COMPLETED.&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED..8; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST'S ARE ; ALREADY NOT DESIRED.9; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF DIRECTIVE O#; WAS ISSUED FROM AN AST ROUTINE. ;- .ENABL LSBO .IF DF P$$RTY E<$DRPER::MOV #AS.PEA,R4 ;GET CODE FOR PARITY ERROR CONTRL BLK- MOV #21.,-(SP) ;SET NUMBER OF AST PARAMETERS 2 MOV #28.*2,-(SP) ;SET NUMBER OF BYTES TO ALLOCATE5 MOV #,-(SP) ;SET CODE FOR CONTROL BLOCKR BR 10$ ;FINISH IN COMMON CODE .ENDC ; DF P$$RTY T;+'; **-$DRREX-SPECIFIY REQUESTED EXIT ASTN;ID; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EITHER RECORD THAT REQ EXIT8; AST'S ARE DESIRED OR NOT DESIRED FOR THE ISSUING TASK.G; WHEN THE AST OCCURS, IT BECOMES DESPECIFIED FOR NON PRIVILEGED TASKS.EB; NON PRIVILEGED TASKS MAY NOT RESPECIFY THIS AST AFTER IT OCCURS.; ; DPB FORMAT:R;#; WD. 00 -- DIC(167.),DPB SIZE(2.).S,; WD. 01 -- AST ENTRY POINT ADDRESS OR ZERO.; ; INPUTS: ;C9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.+; R3=ADDRESS OF THE AST ADDRESS IN THE DPB. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.O,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)C;,*; C=0 IF DIRECTIVE SUCCESSFULLY COMPLETED.&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED..8; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST'S ARE ; ALREADY NOT DESIRED.9; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF DIRECTIVE O#; WAS ISSUED FROM AN AST ROUTINE. ;- $DRREX::3 BIT #T2.REX,T.ST2(R5) ;ABORT AST ALREADY EFFECTED?  BEQ 5$ ;IF EQ NO0 BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED?. BNE 50$ ;IF NE YES, TASK AT AST OR DST STATE0 BR 60$ ;NON-PRIV TASK, CAN'T REISSUE DIRECTIVE,5$: CLR -(SP) ;SET NUMBER OF AST PARAMETERS1 MOV #7.*2,-(SP) ;SET NUMBER OF BYTES TO ALLOCATEI! MOVB -(R3),R4 ;GET DPB SIZE BYTE  CMPB (R3)+,#2 ;SREA?  BEQ 7$ ;IF EQ, YES CMPB R4,#3 ;SREX?0 BNE 9$ ;IF NE NO7 ADD #2.*2,(SP) ;ADJUST NUMBER OF BYTES TO ALLOCATE AND- MOV #2,2(SP) ;NUMBER OF PARAMS FOR SREX FORME87$: MOV #,-(SP) ;SET CODE FOR CONTROL BLOCK( MOV #AS.REA,R4 ;SET TYPE FOR ABORT AST  BR 10$ ;FINISH IN COMMON CODE%9$: DRSTS D.RS99 ;ILLEGAL DPB LENGTHR E;+(; **-$CAAST-COMMAND ARRIVAL AST FOR CLIS;C; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EITHER RECORD THAT COMMANDE:; ARRIVAL ASTS ARE DESIRED OR NOT DESIRED FOR THE CLI TASKC; THAT ISSUED THE DIRECTIVE. THIS ROUTINE IS ENTERED WHEN THE DRCLI ; MODULE DETECTS THIS DIRECTIVE.;V ; DPB FORMAT:E;F#; WD. 01 -- DIC(1700p1Å0¶0eaek›’3.),DPB SIZE (2.)R+; WD. 02 -- AST ENTRY POINT ADDRESS OR ZEROM;# ; INPUTS:S;T8; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK*; R3=ADDRESS OF THE AST ADDRESS IN THE DPB.; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK+; R5=ADDRESS OF THE TCB OF THE CURRENT TASKT; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ;I*; C=0 IF DIRECTIVE SUCCESSFULLY COMPLETED.%; DIRECTIVE STATUS OF +1 IS RETURNED ; C=1 IF DIRECTIVE IS REJECTED7; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST'S AREP; ALREADY NOT DESIRED.8; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF DIRECTIVE#; WAS ISSUED FROM AN AST ROUTINE.H8; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF DIRECTIVE,; WAS ISSUED BY A TASK WHICH IS NOT A CLI.3; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF THERE1; IS INSUFFICIENT POOL TO ALLOCATE AN AST BLOCKK6; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF THE DPB; SIZE IS ILLEGAL.;R;- .IF DF A$$CLI4$CAAST::BIT #T3.CLI,T.ST3(R5) ;IS CURRENT TASK A CLI BEQ 80$ ;IF EQ NO- MOV #AS.CAA,R4 ;SET TYPE FOR CMD ARRIVAL ASTF+ MOV #1,-(SP) ;SET NUMBER OF AST PARAMETERSS1 MOV #8.*2,-(SP) ;SET NUMBER OF BYTES TO ALLOCATE'8 MOV #,-(SP) ;PUSH TYPE FOR CMD ARRIVAL AST BR 10$ ;FINISH IN COMMON CODEE .ENDC ;A$$CLI;+0; **-$DRFEX-SPECIFY FLOATING POINT EXCEPTION AST;EJ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EITHER RECORD THAT FLOATING POINT8; AST'S ARE DESIRED OR NOT DESIRED FOR THE ISSUING TASK.;. ; DPB FORMAT:I;U#; WD. 00 -- DIC(111.),DPB SIZE(2.).,; WD. 01 -- AST ENTRY POINT ADDRESS OR ZERO.; ; INPUTS:P;S9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.O+; R3=ADDRESS OF THE AST ADDRESS IN THE DPB.P/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.H,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;R5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)R;I*; C=0 IF DIRECTIVE SUCCESSFULLY COMPLETED.&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED..?; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST'S ARE ALREADY ; NOT DESIRED.<; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF DIRECTIVE WAS; ISSUED FROM AN AST ROUTINE.N;- .IF DF F$$LPP T:$DRFEX::TST H.FPSA(R4) ;IS TASK BUILT WITH FLOATING POINT? BEQ 60$ ;IF EQ NOC ASSUME HF.FPP,100000R* TST $HFMSK ;DOES THE FPP HARDWARE EXIST? BMI 60$ ;IF MI NO ; MOV #AS.FPA,R4 ;GET CODE FOR FLOATING POINT CONTROL BLOCK ++ MOV #2,-(SP) ;SET NUMBER OF AST PARAMETERSD1 MOV #9.*2,-(SP) ;SET NUMBER OF BYTES TO ALLOCATES5 MOV #,-(SP) ;SET CODE FOR CONTROL BLOCK  BR 10$ ;FINISH IN COMMON CODEI .ENDC;+&; **-$DRPUT-SPECIFY POWER RECOVERY AST;$J; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EITHER RECORD THAT POWER RECOVERY8; AST'S ARE DESIRED OR NOT DESIRED FOR THE ISSUING TASK.;T ; DPB FORMAT:S;E#; WD. 00 -- DIC(109.),DPB SIZE(2.).I,; WD. 01 -- AST ENTRY POINT ADDRESS OR ZERO.;T ; INPUTS:O;+9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.-+; R3=ADDRESS OF THE AST ADDRESS IN THE DPB.#/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;+5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)R;I-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.O&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.T?; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST'S ARE ALREADY ; NOT DESIRED.<; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF DIRECTIVE WAS; ISSUED FROM AN AST ROUTINE.A;- E .IF DF P$$RFL=$DRPUT::MOV #AS.PFA,R4 ;GET CODE FOR POWERFAIL CONTROL BLOCK ) CLR -(SP) ;SET NUMBER OF AST PARAMETERSS1 MOV #7.*2,-(SP) ;SET NUMBER OF BYTES TO ALLOCATED5 MOV #,-(SP) ;SET CODE FOR CONTROL BLOCKL BR 10$ ;FINISH IN COMMON CODE  .ENDC ; DF P$$RFL ;+ E,; **-$DRRRA-SPECIFY RECEIVE BY REFERENCE AST;DC; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EITHER RECORD THAT RECEIVESE; BY REFERENCE AST'S ARE DESIRED OR NOT DESIRED FOR THE ISSUING TASK.; ; DPB FORMAT:D;$"; WD. 00 -- DI00p1ð0ß0DATADATADATADATADATADATADATAC(21.),DPB SIZE(2.).,; WD. 01 -- AST ENTRY POINT ADDRESS OR ZERO.;S ; INPUTS:F;T9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.C+; R3=ADDRESS OF THE AST ADDRESS IN THE DPB. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;R5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)E;S1; C=0 IF THE DIRECTIVE IS SUCCESSFULLY COMPLETED. &; DIRECTIVE STATUS OF +1 IS RETURNED.#; C=1 IF THE DIRECTIVE IS REJECTED.P7; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST'S ARE ; ALREADY NOT DESIRED.8; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF DIRECTIVE#; WAS ISSUED FROM AN AST ROUTINE. ;- .IF DF P$$LAS N A$DRRRA::MOV #AS.RRA,R4 ;GET CODE FOR RECEIVE BY REF CONTROL BLOCKH) CLR -(SP) ;SET NUMBER OF AST PARAMETERS(1 MOV #7.*2,-(SP) ;SET NUMBER OF BYTES TO ALLOCATE=5 MOV #,-(SP) ;SET CODE FOR CONTROL BLOCKC BR 10$ ;FINISH IN COMMON CODE  .ENDC;+; **-$DRRCV-SPECIFY RECEIVE ASTA; C; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EITHER RECORD THAT RECEIVER8; AST'S ARE DESIRED OR NOT DESIRED FOR THE ISSUING TASK.;S ; DPB FORMAT:T;U#; WD. 00 -- DIC(107.),DPB SIZE(2.).N,; WD. 01 -- AST ENTRY POINT ADDRESS OR ZERO.;R ; INPUTS: ; 9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.+; R3=ADDRESS OF THE AST ADDRESS IN THE DPB.C/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.T,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;.5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)H;D1; C=0 IF THE DIRECTIVE IS SUCCESSFULLY COMPLETED. &; DIRECTIVE STATUS OF +1 IS RETURNED.#; C=1 IF THE DIRECTIVE IS REJECTED. ?; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST'S ARE ALREADYS; NOT DESIRED.<; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF DIRECTIVE WAS; ISSUED FROM AN AST ROUTINE. ;- H:$DRRCV::MOV #AS.RCA,R4 ;GET CODE FOR RECEIVE CONTROL BLOCK) CLR -(SP) ;SET NUMBER OF AST PARAMETERSF1 MOV #7.*2,-(SP) ;SET NUMBER OF BYTES TO ALLOCATES5 MOV #,-(SP) ;SET CODE FOR CONTROL BLOCKIA10$: BIT #T2.AST!T2.DST,(R2) ;ISSUED FROM AST OR AST'S DISABLED?  BNE 50$ ;IF NE YES  E .IF DF S$$LIB E MOV (R3),R2 ;GET AST ADDRESS" BEQ 30$ ;IF EQ AST'S NOT DESIRED. CALL $CALTA ;CALCULATE TRAP ADDRESS TO STORE MOV R2,R3 ;SAVE TRAP ADDRESS N .IFFU E MOV (R3),R3 ;GET AST ADDRESS" BEQ 30$ ;IF EQ AST'S NOT DESIRED L .ENDC R7 CALL $SRAST ;SEARCH FOR A SPECIFIED AST CONTROL BLOCK; BCC 20$ ;IF CC, ALREADY SET UP% MOV #C.LGTH,R1 ;GET SIZE TO ALLOCATE 0 CMP R4,#AS.PEA ;PARITY ERROR AST CONTROL BLOCK? BNE 15$ ;IF NE NOD8 MOV #A.PLGH,R1 ;ALLOCATE A BIGGER PACKET FOR PARAMETERS-15$: CALL $ALOCB ;ALLOCATE AST CONTROL BLOCKI# BCS 70$ ;IF CS ALLOCATION FAILURE / MOV $TKTCB,R1 ;GET TCB ADDRESS OF CURRENT TASKV< MOV T.SAST(R1),(R0) ;LINK NEW AST CONTROL BLOCK IN THE LIST MOV R0,T.SAST(R1) ;/20$: MOV R0,R1 ;COPY AST CONTROL BLOCK ADDRESSA- TST (R1)+ ;POINT TO LENGTH OF CONTROL BLOCK$5 MOV (SP)+,(R1)+ ;SET OFFSET TO CONTROL BLOCK ADDRESSA1 MOV (SP)+,(R1)+ ;SET NUMBER OF BYTES TO ALLOCATE # MOV R3,(R1)+ ;SET AST TRAP ADDRESS.5 MOV (SP)+,(R1) ;SET NUMBER OF PARAMETERS TO TRANSFERC BR 40$ ;TAKE COMMON EXIT=30$: CALL $SRAST ;SEARCH FOR A SPECIFIED AST CONTROL BLOCK ,+ BCS 60$ ;IF CS, AST'S ALREADY NOT DESIREDS. CMP R4,#AS.REA ;IS THIS A REQUESTED EXIT AST? BNE 35$ ;IF NE NOR6 BIC #T2.REX,T.ST2(R5) ;CLEAR REQUESTED EXIT AST FLAG 635$: MOV (R0),(R1) ;REMOVE CONTROL BLOCK FROM THE LIST2 MOV #C.LGTH,R1 ;GET LENGTH OF BLOCK TO DEALLOCATE0 CMP R4,#AS.PEA ;PARITY ERROR AST CONTROL BLOCK? BNE 37$ ;IF NE NOT MOV #A.PLGH,R1 ;GET PACKET SIZE/37$: CALL $DEACB ;DEALLOCATE AST CONTROL BLOCKE-40$: DRSTS +1 ;RETURN DIRECTIVE STATUS OF +1P(50$: DRSTS D.RS80 ;SET DIRECTIVE STATUS'60$: DRSTS D.RS8 ;SET DIRECTIVE STATUS,'70$: DRSTS D.RS1 ;SET DIRECTIVE STATUSB .IF DF A$$CLI(80$: DRSTS D.RS16 ;SET DIRECTIVE STATUS .ENDC .DSABL LSB  .ENDNTROL BLOCK FROM THE LIST2 MOV #C.LGTH,R1 ;GET LENGTH OF BLOCK T00q"1Å0¶0eaek›’ .TITLE MEMAPC .IDENT /13.02/R; C; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.P; ALL RIGHTS RESERVED.;B<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;D; D. N. CUTLER 4-AUG-73E;A); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:U;; P. J. BEZEREDI; D. R. DONCHINR; B. S. MCCARTHY;T; MODIFIED BY:;. ; B. S. MCCARTHY 23-MAY-82 13.01;F,; BM255 -- ADD U$$UMR CONDITIONALS FOR P/OS;K; J. M. LAWLER 02-DEC-82 13.02;R/; JL144 -- MODIFY $RELUI TO RELOCATE SUPERMODEL ; I-SPACE REFERENCES CORRECTLY;S; I/O RELATED ROUTINES;W/; ROUTINES DEALING WITH MEMORY MAPPING AND UMRS;R; MACRO LIBRARY CALLSN;W8 .MCALL F11DF$,HDRDF$,HWDDF$,PCBDF$,PKTDF$,SHDDF$,TCBDF$0 F11DF$ ;DEFINE WINDOW AND LOCK BLOCK OFFSETS ' HDRDF$ ;DEFINE TASK HEADER OFFSETS $ HWDDF$ ;DEFINE HARDWARE REGISTERS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS $ PKTDF$ ;DEFINE I/O PACKET OFFSETS* SHDDF$ ;DEFINE SHADOW RECORDING OFFSETS, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;+#; **-$MPPHY-MAP TO PHYSICAL ADDRESSA; P; THIS ROUTINE IS CALLED TO MAP A RELOCATION BIAS AND DISPLACEMENT ADDRESS TO ANK; 18 BIT PHYSICAL ADDRESS. IF THE INDICATED DEVICE IS NOT AN NPR AN DEVICE,1O; THEN THE RELOCATION BIAS AND DISPLACEMENT ADDRESS ARE RETURNED TO THE CALLER.TN; ELSE THE RELOCATION BIAS AND DISPLACEMENT ADDRESS ARE CONVERTED TO AN 18 BIT3; PHYSICAL ADDRESS WHICH IS RETURNED TO THE CALLER.;D ; INPUTS:N;H; R1=RELOCATION BIAS.; R2=DISPLACEMENT ADDRESS.'; R5=ADDRESS OF THE UNIT CONTROL BLOCK.O;Y ; OUTPUTS:;9; IF DEVICE IS AN NPR DEVICE ON AN 18-BIT MACHINE, THEN I;; R1=HIGH ORDER 2 BITS OF PHYSICAL ADDRESS IN BITS 4 AND 5N,; R2=LOW ORDER 16 BITS OF PHYSICAL ADDRESS.1; IF DEVICE IS AN NPR DEVICE ON AN 11/70, THEN :; R1=HIGH ORDER 6 BITS OF PHYSICAL ADDRESS IN HIGH BYTE. .; R2=LOW ORDER 16 BITS OF PHYSICAL ADDRESS. &; IF DEVICE IS NOT AN NPR DEVICE, THEN; R1=RELOCATION BIAS.; R2=DISPLACEMENT ADDRESS.; &; R0 AND R3 ARE PRESERVED ACROSS CALL.;- R+$MPPHY::BITB #UC.NPR,U.CTL(R5) ;NPR DEVICE?S BEQ 10$ ;IF EQ NO1, ASL R2 ;REMOVE APR6 BIAS FROM DISPLACEMENT ASL R2 ;% CLC ;GET 2 BITS OF RELOCATION BIASR ROR R1 ;. RORB R2 ;TO FILL 8 LOW ORDER BITS OF ADDRESS ASR R1 ; RORB R2 ;& SWAB R2 ;SWAP TO COLLECT 8 MORE BITS, BISB R1,R2 ;INSERT UPPER 8 BITS OF ADDRESS$ SWAB R2 ;SWAP BACK TO REAL ADDRESS' CLRB R1 ;CLEAR LOW BYTE OF UPPER BITSB .IF NDF M$$EXTE. ASH #-4,R1 ;PUT BITS <17:18> OF ADDRESS INTO ;BITS <4:5>  .ENDC10$: RETURN ;L E;+:; THE FOLLOWING TWO ENTRY POINTS WILL BE DEFINED ONLY WHEN=; 22-BIT ADDRESSING CODE IS DISABLED. THIS IS TO PREVENT THER8; DRIVERS FROM HAVING UNDEFINED SYMBOLS WHEN TASK BUILT.;- .ENABL LSB2 .IF DF U$$UMR .IF NDF M$$EXT ($MPUBM:: ;MAP 11/70 UNIBUS TO TRANSFER!$STMAP:: ;SET MAPPING REGISTERSL RETURN ;DUMMY RETURNR;+3; **-$MPUB1-MAP UNIBUS TO MEMORY (ALTERNATE ENTRY). ;UA; THIS ROUTINE IS CALLED BY UNIBUS NPR DEVICE DRIVERS TO LOAD THE:=; NECESSARY UNIBUS MAP REGISTERS TO EFFECT A TRANSFER TO MAINSC; MEMORY ON AN 11/70 PROCESSOR WITH EXTENDED MEMORY. THIS ALTERNATEIE; ENTRY POINT ALLOWS THE DRIVER TO SPECIFY A NON-STANDARD UMR MAPPING ; ASSIGNMENT BLOCK. ;2 ; INPUTS:D;$/; R0=ADDRESS OF A UMR MAPPING ASSIGNMENT BLOCK. ;B ; OUTPUTS:;2; THE UNIBUS MAP REGISTERS NECESSARY TO EFFECT THE; TRANSFER ARE LOADED.;B-; NOTE: REGISTER R3 IS PRESERVED ACROSS CALL.;- .IFF ;NDF M$$EXT <$MPUB1::MOV M.UMRN(R0),-(SP) ;SET COUNT OF REGISTERS TO LOAD/ MOVB M.BFVH(R0),R1 ;GET HIGH 6 BITS OF ADDRESSO. MOV M.BFVL(R0),R2 ;GET LOW 16 BITS OF ADDRESS5 MOV M.UMRA(R0),R0 ;GET ADDRESS OF FIRST MAP REGISTERA BR 10$ ;GO LOAD THE UMRS;+ ; **-$MPUBM-MAP UNIBUS TO MEMORY; A; THIS ROUTINE IS CALLED BY UNIBUS NPR DEVICE DRIVERS TO LOAD THEB; NECESSARY UNIBUS MAP REGISTERS TO EFFECT A TRANSFER TO MAIN MEM-100q*1ð0ß0DATADATADATADATADATADATADATA; ORY ON AN 11/70 PROCESSOR WITH EXTENDED MEMORY. ;L ; INPUTS:;F; R4=ADDRESS OF DEVICE SCB. ; R5=ADDRESS OF DEVICE UCB.F;G ; OUTPUTS:;<; THE UNIBUS MAP REGISTERS NECESSARY TO EFFECT THE TRANSFER ; ARE LOADED. ;B-; NOTE: REGISTER R3 IS PRESERVED ACROSS CALL. ;-,$MPUBM::MOV S.KRB(R4),R0 ;GET KRB ADDRESS * ADD K.OFF(R0),R0 ;R0=END OF UMR AREA+2 : MOV M.UMRN-M.LGTH(R0),-(SP) ;PUSH COUNT OF UMR'S TO LOAD 4 MOV -(R0),R2 ;GET LOW 16 BITS OF BUF ADDR (M.BFVL) 0 MOVB -(R0),R1 ;GET HIGH ORDER 6 BITS (M.BFVH) 8 MOV M.UMRA-M.BFVH(R0),R0 ;PICK UP ADDRESS OF FIRST UMR .10$: MOV R2,(R0)+ ;LOAD LOW 16 BITS OF ADDRESS* MOV R1,(R0)+ ;LOAD HIGH 6 BITS OF ADDRESS ADD #20000,R2 ;ADVANCE 8K BYTES ADC R1 ;' SUB #4,(SP) ;ALL REGISTERS LOADED? A BGT 10$ ;IF GT NO TST (SP)+ ;CLEAN STACK RETURND .ENDC ;NDF M$$EXT .ENDC ; DF U$$UMR .DSABL LSBU ;+ S); **-$RELOC-RELOCATE USER VIRTUAL ADDRESS)8; **-$RELUI-RELOCATE USER (I SPACE ONLY) VIRTUAL ADDRESS;EC; THIS ROUTINE IS CALLED TO TRANSFORM A 16 BIT USER VIRTUAL ADDRESSDD; INTO A RELOCATION BIAS AND DISPLACEMENT IN BLOCK RELATIVE TO APR6.;R ; INPUTS:A;I&; R0=USER VIRTUAL ADDRESS TO RELOCATE.;C ; OUTPUTS:;C,; R1=RELOCATION BIAS TO BE LOADED INTO PAR6.3; R2=DISPLACEMENT IN BLOCK PLUS 140000 (PAR6 BIAS).R;R&; R0 AND R3 ARE PRESERVED ACROSS CALL.;- .ENABL LSBS .IF DF U$$DAS7$RELUI::MOV #UINAR0,-(SP) ;PUSH ADDRESS OF USER I SPACE- .IF DF S$$LIB) BIT #20000,@#PS ;EXECUTED IN USER MODE ?E BNE 10$ ;IF NE, YES ' MOV #SISAR0,(SP) ;SET TO SUPER I SPACER .ENDC ; DF S$$LIB BR 10$ ;ENTER COMMON CODEA .ENDC ; DF U$$DAS$RELOC:: ;REFERENCE LABELO .IF DF U$$DAS!S$$LIB:' MOV #UISAR0,-(SP) ;ASSUME USER D SPACEO R .IFDF S$$LIBC) BIT #20000,@#PS ;EXECUTED IN USER MODE ? BNE 10$ ;IF MI YES' MOV #SDSAR0,(SP) ;SET TO SUPER D SPACE .ENDC ; DF S$$LIB .IFTF ; U$$DAS!S$$LIB%10$: MOV R0,R1 ;COPY VIRTUAL ADDRESSL$ ASH #-6,R1 ;CALCULATE BLOCK NUMBER BIC #177600,R1 ;$! MOV R0,R2 ;COPY VIRTUAL ADDRESSS" ASH #-12.,R2 ;CALCULATE APR INDEX BIC #177761,R2 ;; .IFT ; DF U$$DAS!S$$LIB$ ADD (SP)+,R2 ;CALCULATE APR ADDRESS! ADD (R2),R1 ;AND FETCH CONTENTSM .IFF ; DF U$$DAS!S$$LIB- ADD UISAR0(R2),R1 ;CALCULATE RELOCATION BIASS .ENDC ; DF U$$DAS!S$$LIBB! MOV R0,R2 ;COPY VIRTUAL ADDRESS 4 BIC #177700,R2 ;CLEAR ALL BUT DISPLACEMENT IN BLOCK BIS #140000,R2 ;SET APR 6 BIAS1 RETURN ; .DSABL LSB6;+$; **-$RELOM-RELOCATE AND MAP ADDRESS;$C; THIS ROUTINE IS CALLED TO TRANSFORM A 16 BIT USER VIRTUAL ADDRESSDC; INTO A RELOCATION BIAS AND DISPLACEMENT IN BLOCK RELATIVE TO APR6C1; AND LOAD THESE VALUES FOR ACCESS BY THE CALLER.E;M ; INPUTS: ;U&; R0=USER VIRTUAL ADDRESS TO RELOCATE.;T ; OUTPUTS:;A; R0=DISPLACEMENT IN BLOCK.I,; KISAR6 IS LOADED WITH THE RELOCATION BIAS.;7; R3 IS PRESERVED ACROSS CALL.;- B3$RELOM::CALL $RELOC ;RELOCATE USER VIRTUAL ADDRESS.+ MOV R1,KISAR6 ;SET KERNEL MAPPING REGISTERP. MOV R2,R0 ;SET DISPLACEMENT IN BLOCK ADDRESS RETURN ;U;+0; **-$RELCD-RELOCATE,MAP AND CHECK A DPB/RDB/WDB;MC; THIS ROUTINE IS CALLED TO TRANSFORM A 16 BIT USER VIRTUAL ADDRESS A; INTO A BIAS/DISPLACEMENT PAIR. THE ROUTINE IS PRIMARILY FOR USEC?; FROM THE DIRECTIVE DISPATCHER FOR DPBS/RDBS/WDBS. THE ROUTINEI@; CHECKS TO SEE IF THE STRUCTURE OVERLAPS AN APR BOUNDARY. IF ITC; DOES, AND THE NEXT APR IS NOT MAPPED CONTIGUOUSLY WITH THE FIRST,R;; A STATUS OF D.RS98 IS RETURNED, ELSE THE BLOCK IS MAPPED.0;S ; INPUTS:M; ; R2=SIZE OF STRUCTURE IN BYTES; R3=USER VIRTUAL ADDRESSP;D ; OUTPUTS:;B;; D.RS98 RETURNED TO TASK IF STRUCTURE NOT PHYS. CONTIGUOUS ;T6; R3=DISPLACEMENT ADDRESS IF USER VIRT. ADDR WAS VALID;I?; NOTE: KISAR6 IS DESTROYED (REMAPPED) IF USER VIRT. ADDR VALIDB;- ($RELCD::MOV R3,R0 ;COPY VIRTUAL ADDRESS- ASH #-12.,R0 ;SHIFT APR SELECT TO BITS 1,2,3N( BIC #177761,R0 ;CLEAR ALL BUT APR INDEX6 MOV UISAR0(R0),R1 ;GET PAGE ADDRESS REGISTER CONT00q21Å0¶0eaek›’ENTS$ CMP #16,R0 ;MAPPED THROUGH APR 7 ?, BEQ 10$ ;IF EQ YES - ALWAYS CHECK FOR WRAP# MOV R1,-(SP) ;SAVE CONTENTS OF APR) ADD #200,(SP) ;AND POINT IT AHEAD BY 4KWN3 CMP (SP)+,UISAR0+2(R0) ;CONTIGUOUS WITH NEXT APR ?F BEQ 20$ ;IF EQ YES - ALWAYS OK310$: BIC #160000,R3 ;CLEAR APR SELECT FIELD OF V.A.D+ ADD R3,R2 ;CALCULATE ADDRESS OF LAST BYTER DEC R2 ;IN DATA STRUCTURES& CMP #20000,R2 ;OVERLAP APR BOUNDARY ?3 BLOS 30$ ;IF LOS YES - STRUCTURE IS NO CONTIGUOUS;%20$: MOV R3,R2 ;COPY VIRTUAL ADDRESSP. ASH #-6,R2 ;SHIFT OFFSET BITS TO 0 THROUGH 6% BIC #177600,R2 ;CLEAR OUT ALL OTHERS,( ADD R1,R2 ;CALCULATE 32WD BLOCK NUMBER0 BIC #177700,R3 ;STRIP ALL BUT DISPLACEMENT BITS* BIS #140000,R3 ;SET TO MAP THROUGH KISAR6" MOV R2,KISAR6 ;MAP TO USER BUFFER RETURN ;E:30$: DRSTS D.RS98 ;"PART OF DPB OUT OF TASK'S ADDR SPACE" ;+ /; **-$ASUMR-ASSIGN UNIBUS MAPPING REGISTERS R ; H; THIS ROUTINE IS CALLED TO ASSIGN A CONTIGUOUS SET OF UMR'S. NOTE THATH; FOR THE SAKE OF SPEED, THE LINK WORD OF EACH MAPPING ASSIGNMENT BLOCK H; POINTS TO THE UMR ADDRESS (2ND) WORD OF THE BLOCK, NOT THE FIRST WORD.H; THE CURRENT STATE OF UMR ASSIGNMENT IS REPRESENTED BY A LINKED LIST OFF; MAPPING ASSIGNMENT BLOCKS, EACH BLOCK CONTAINING THE ADDRESS OF THE D; FIRST UMR ASSIGNED AND THE NUMBER OF UMR'S ASSIGNED TIMES 4. THE B; BLOCKS ARE LINKED IN THE ORDER OF INCREASING FIRST UMR ADDRESS. ; ; INPUTS: D ; 6; R0=POINTER TO A MAPPING REGISTER ASSIGNMENT BLOCK. -; M.UMRN(R0)=NUMBER OF UMR'S REQUIRED * 4. ; ; OUTPUTS: ; #; ALL REGISTERS ARE PRESERVED. ; 1; C=0 IF THE UMR'S WERE SUCCESSFULLY ASSIGNED. D7; ALL FIELDS OF THE MAPPING REGISTER ASSIGNMENT BLOCK I1; ARE INITIALIZED AND THE BLOCK IS LINKED INTO E; THE ASSIGNMENT LIST. -; C=1 IF THE UMR'S COULD NOT BE ASSIGNED. ;- R  .IF DF M$$EXT&U$$UMR #$ASUMR::SAVNR ;SAVE R4 AND R5 G* TST (R0)+ ;SKIP OVER LINK WORD (M.LNK) 8 MOV #$UMRHD+2,R5 ;POINT TO UMR ASSIGNMENT LISTHEAD + 2 +10$: MOV R5,R4 ;SAVE POINTER TO PREVIOUS % BEQ 30$ ;IF EQ ASSIGNMENT FAILURE S7 MOV (R5),(R0) ;POINT TO NEXT FREE UMR (M.UMRA)(M.UMRA)E( ADD M.UMRN-M.UMRA(R5),(R0) ;(M.UMRA) 6 MOV #UBMPR+<31.*4>,-(SP) ;PUSH POINTER PAST LAST UMR 6 MOV -(R5),R5 ;POINT TO NEXT ASSIGNMENT BLOCK (M.LNK) ! BEQ 20$ ;IF EQ THERE IS NONE 7 MOV (R5),(SP) ;SET NEXT ALLOCATED UMR ADDRESS (M.UMRA)S;20$: SUB (R0),(SP) ;CALCULATE # OF FREE UMR'S * 4 (M.UMRA) 6 CMP (SP)+,M.UMRN-M.UMRA(R0) ;ENOUGH UMR'S AVAILABLE?  BLO 10$ ;IF LO NO 2 MOV R0,-(R4) ;LINK NEW BLOCK TO PREVIOUS (M.LNK) / MOV (R0),R4 ;SAVE FIRST UMR ADDRESS (M.UMRA) R7 MOV R5,-2(R0) ;POINT NEW BLOCK TO NEXT IN LIST (M.LNK) * MOV R4,R5 ;DUPLICATE FIRST UMR ADDRESS ; BICB #UBMPR!34,R5 ;MASK OUT ALL BUT HI 2 BITS IN LOW BYTE - BIC R5,R4 ;MASK OUT HIGH BYTE HIGH 2 BITS M* ASR R5 ;SHIFT HIGH 2 BITS TO BITS 4 & 5 . ASLB R4 ;CALCULATE HIGH BYTE OF LOW 16 BITS % ASL R4 ; (LOSING 200 BIT FIRST) U ASL R4 ; N' SWAB R4 ;FORM PROPER 16 BIT ADDRESS N< MOV M.BFVL-2(R0),M.UMVL-2(R0) ; GET ORIGINAL BUFFER ADDRESS& BIC #^C<1>,M.UMVL-2(R0) ; WAS IT ODD?8 ADD R4,M.UMVL-2(R0) ; IF IT WAS, THEN M.UMVL SHOULD BE) MOVB R5,M.UMVH-2(R0) ;SET BITS 4 & 5 D530$: DEC R0 ;PNT BACK TO LINK WORD PRESERVING CARRY I DEC R0 ; C RETURN ; ;+ 1; **-$DEUMR-DEASSIGN UNIBUS MAPPING REGISTERS 4 ; E; THIS ROUTINE IS CALLED TO DEASSIGN A CONTIGUOUS BLOCK OF UMR'S. IF LG; THE MAPPING ASSIGNMENT BLOCK IS NOT IN THE LIST, NO ACTION IS TAKEN. ,F; NOTE THAT FOR THE SAKE OF ASSIGNMENT SPEED, THE LINK WORD POINTS TO 8; THE UMR ADDRESS (2ND) WORD OF THE ASSIGNMENT BLOCK. ; ; INPUTS: 0 ; &; R2=POINTER TO ASSIGNMENT BLOCK. ; ; OUTPUTS: ; ; R0 AND R1 ARE PRESERVED. + ;- 1$DEUMR::TST (R2)+ ;SKIP OVER LINK WORD (M.LNK) 4 MOV #$UMR00q:1ð0ß0DATADATADATADATADATADATADATAHD+2,R3 ;POINT TO ASSIGNMENT LISTHEAD + 2 010$: CMP -(R3),R2 ;IS IT THE NEXT ONE? (M.LNK)  BEQ 20$ ;IF EQ YES 2 MOV (R3),R3 ;ELSE POINT TO NEXT IN LIST (M.LNK) BNE 10$ ;IF NE THERE IS ONE 1 BR 30$ ;ELSE MAPPING ASSIGNMENT BLK NOT IN LISTK520$: MOV -(R2),(R3) ;UNLINK THE BLOCK (M.LNK)(M.LNK) P30$: RETURN ; ;+<; **-$STMP1-SET UP UNIBUS MAPPING ADDRESS (ALTERNATE ENTRY).;.=; THIS ENTRY CODE SETS UP AN ALTERNATE DATA STRUCTURE USED AS >; A UMR MAPPING ASSIGNMENT BLOCK AND CONTEXT STORAGE BLOCK, IN<; THE SAME MANNER AS $STMAP USES THE FORK BLOCK AND MAPPING C; BLOCK IN THE SCB, KRB. THE FORMAT OF THE STRUCTURE IS AS FOLLOWS:M;K; -------------------------- ; ! ! 4 WORDS USED FOR SAVING!; ! ! DRIVER'S CONTEXT IN CASE-; ! ! UMRS CAN'T BE MAPPEDL; ! ! IMMEDIATELY.R; --------------------------; ! !; ! ! 6 WORDS USED AS A UMR"; ! ! MAPPING ASSIGNMENT BLOCK.; ! !; ! !; ! !; --------------------------;N;S ; INPUTS:O;A2; R0=ADDRESS OF THE DATA STRUCTURE DEPICTED ABOVE.; R4=ADDRESS OF DEVICE SCB. ; R5=ADDRESS OF DEVICE UCB. ;. ; OUTPUTS:;T?; DATA STRUCTURE POINTERS SET UP FOR ENTRY TO $STMP2 IN $STMAP. ; ;- .ENABL LSB 5$STMP1::MOV S.FRK+10(R4),6(R0) ;SAVE DRIVER'S MAPPING  MOV R0,R4 ;COPY BLOCK POINTERA, ADD #M.LGTH+10,R0 ;POINT PAST MAPPING BLOCK( ADD #4,R4 ;POINT TO CONTEXT SAVE BLOCK BR 5$ ;SET UP THE UMR ADDRESS ;+); **-$STMAP-SET UP UNIBUS MAPPING ADDRESS-;C; THIS ROUTINE IS CALLED BY UNIBUS NPR DEVICE DRIVERS TO SET UP THEBC; UNIBUS MAPPING ADDRESS, FIRST ASSIGNING THE UMR'S. IF THE UMR'S G; CANNOT BE ALLOCATED, THE DRIVER'S MAPPING ASSIGNMENT BLOCK IS PLACED SH; IN A WAIT QUEUE AND A RETURN TO THE DRIVER'S CALLER IS EXECUTED. THE B; ASSIGNMENT BLOCK WILL EVENTUALLY BE DEQUEUED WHEN THE UMR'S ARE G; AVAILABLE AND THE DRIVER WILL BE REMAPPED AND RETURNED TO WITH R1-R5 B; PRESERVED AND THE NORMAL OUTPUTS OF THIS ROUTINE. THE DRIVER'S G; CONTEXT IS STORED IN THE ASSIGNMENT BLOCK AND FORK BLOCK WHILE IT IS SE; BLOCKED AND IN THE WAIT QUEUE. ONCE A DRIVER'S MAPPING ASSIGNMENT ED; BLOCK IS PLACED IN THE UMR WAIT QUEUE, IT IS NOT REMOVED FROM THE B; QUEUE UNTIL THE UMR'S ARE SUCCESSFULLY ASSIGNED. THIS STRATEGY G; ASSURES THAT WAITING DRIVERS WILL BE SERVICED FIFO AND THAT DRIVER'S H=; WITH LARGE REQUESTS FOR UMR'S WILL NOT WAIT INDEFINATELY. E ; ; INPUTS:;R; R4=ADDRESS OF DEVICE SCB.S; R5=ADDRESS OF DEVICE UCB.'&; (SP)=RETURN TO DRIVER'S CALLER. ;L ; OUTPUTS:;O;; UNIBUS MAP ADDRESSES ARE SET UP IN THE DEVICE UCB AND THEI.; ACTUAL PHYSICAL ADDRESS IS MOVED TO THE SCB.;E;; NOTE: REGISTERS R1, R2, AND R3 ARE PRESERVED ACROSS CALL.H;- C,$STMAP::MOV S.KRB(R4),R0 ;GET KRB ADDRESS / ADD K.OFF(R0),R0 ;R0=LAST WORD+2 OF UMR AREA A' ADD #S.FRK+6,R4 ;POINT INTO FORK BLOCKM@5$: MOV U.BUF+2(R5),-(R0) ;SAVE LOW 16 BITS OF ADDRESS (M.BFVL)> MOVB U.BUF+1(R5),-(R0) ;SAVE HIGH 6 BITS OF ADDRESS (M.BFVH) # DEC R0 ;POINT BACK TO NEXT WORD ; MOV U.CNT(R5),-(R0) ;TEMORARILY STORE BYTE COUNT (M.UMVL) C, CLR -(R0) ;INITIALIZE UMR COUNT (M.UMRN) . BIT #1,M.BFVL-M.UMRN(R0) ;BUFFER ADDRESS ODD?" BEQ 10$ ;IF EQ NO, ALL IS NORMAL1 INC 2(R0) ;IT'S ODD, WE MUST MAP ONE EXTRA BYTED710$: ADD #4,(R0) ;INCREASE COUNT FOR ONE UMR (M.UMRN) A: SUB #20000,2(R0) ;REDUCE BYTE COUNT BY 8K BYTES (M.UMVL) ! BHI 10$ ;IF HI MORE BYTES TO GOR TST -(R0) ;(M.UMRA) (8 MOV -(R0),-(SP) ;SAVE POSSIBLE WAIT QUEUE LINK (M.LNK) 0 CALL $ASUMR ;ATTEMPT TO ASSIGN REQUIRED UMR'S 0 BCC 20$ ;IF CC SUCCESSFUL, CHECK FOR UMR WAIT  TST (SP)+ ;CLEAR STACK / MOV R5,(R4) ;SAVE R5 IN FORK BLOCK (S.FRK+6) 9 MOV (SP)+,-(R4) ;SAVE DRIVER'S RETURN ADDRESS (S.FRK+4) 3 MOV R0,-(R4) ;SAVE MAPPING BLOCK POINTER (S.FRK+2)I1 CALL $WTUMR ;WAIT FOR CHANGE IN UMR ASSIGNMENT (6 MOV (R4)+,R0 ;RESTORE MAPPING BLOCK POINTER (S.FRK+2)) ADD #M.LGTH,R0 ;POINT PAST MAPPING BLOCKM9 MOV (R4)+,-(SP) ;RESTORE DRIVER'S RETURN ADDR (S.FRK+4) M# MOV (R4),R5 ;RESTO00qB1Å0¶0eaek›’RE R5 (S.FRK+6)I* MOV 2(R4),KINAR5 ;REMAP DRIVER (S.FRK+10) .IF DF K$$DAS5 MOV 2(R4),KDSAR5 ;REMAP DRIVER IN D SPACE (S.FRK+10)  .ENDC BR 5$!20$: MOV U.SCB(R5),R4 ;RESTORE R4I< MOV M.UMVL(R0),U.BUF+2(R5) ;STORE LOW WORD OF UMR VIRT ADDR1 MOVB M.UMVH(R0),U.BUF(R5) ;STORE HIGH SIX BITS H+ CLRB U.BUF+1(R5) ;CLEAR HIGH-ORDER BYTE O* CMP $UMRWT,R0 ;WAS THIS CALLER WAITING?  BNE 30$ ;IF NE NO N2 MOV (SP),$UMRWT ;DEQUEUE CURRENT CALLER'S BLOCK # BNE 30$ ;IF NE NOT END OF LIST O4 MOV #$UMRWT,$UMRWT+2 ;UPDATE LAST IN LIST POINTER 30$: TST (SP)+ ;CLEAR STACK .ENABL LSBM ;+ S&; **-$DQUMR-DEQUEUE FROM UMR WAIT ; D; CONTROL IS TRANSFERRED HERE TO SEE IF A DRIVER IS WAITING FOR UMR G; ASSIGNMENT. FIRST THE CALLING DRIVER IS CALLED BACK AS A COROUTINE. .H; WHEN THE CALLING DRIVER ISSUES A RETURN BACK TO THIS ROUTINE, A CHECK H; IS MADE TO SEE IF ANY DRIVERS ARE WAITING FOR UMR'S. IF SO THE WAIT- C; ING DRIVER'S CONTEXT IS RESTORED WITHOUT ACTUALLY DEQUEUEING THE +F; MAPPING ASSIGNMENT BLOCK AND CONTROL IS PASSED BACK TO THE ORIGINAL ; UMR ASSIGNMENT ROUTINE. $ ; ; INPUTS: ; -; (SP)=RETURN ADDRESS TO DRIVER'S CALLER.. V ; ; OUTPUTS: ; A; IF ANYONE IS WAITING THEIR CONTEXT IS RESTORED AND THE ALLOCA- L#; TION ROUTINE IS CALLED BACK. H ;-  .ENABL LSB 4$DQUMR::CALL @(SP)+ ;CALL THE CALLER AS COROUTINE 3 MOV $UMRWT,R0 ;ANYONE WAITING FOR UMR ASSIGNMENT? U) BEQ 10$ ;IF EQ HE HAS SINCE GONE AWAY C ROL -(SP) ;SAVE SENSE OF C-BIT! TST (R0)+ ;POINT TO SAVED R1 ( MOV (R0)+,R1 ;RESTORE SAVED REGISTERS  MOV (R0)+,R2 ;  MOV (R0)+,R3 ;  MOV (R0)+,R4 ;  CALL @(R0)+ ;CALL ROUTINE + ROR (SP)+ ;RESET C BIT TO ENTRY CONDITIONT RETURN ; ;+ I,; **-$WTUMR-WAIT FOR CHANGE IN UMR STATE ; H; THIS ROUTINE STORES R1-R4 AND THE RETURN PC IN THE MAPPING ASSIGNMENT H; AND QUEUES THE BLOCK IN THE UMR WAIT QUEUE FOR A SUBSEQUENT RECALL TO H; THE CALLER WHEN THE STATE OF UMR ASSIGNMENT CHANGES. NOTE THAT IT IS F; POSSIBLE FOR THE MAPPING ASSIGNMENT BLOCK TO ALREADY BE IN THE WAIT @; QUEUE, BUT IF IT IS IT CAN ONLY BE AT THE HEAD OF THE QUEUE. ; ; INPUTS: B ; (; R0=POINTER TO UMR ASSIGNMENT BLOCK ; ; OUTPUTS: ; 9; THE ASSIGNMENT BLOCK IS QUEUED IN THE UMR WAIT QUEUE. ?; THE CALLER IS EVENTUALLY RETURNED AT SYSTEM STATE WITH R1-R4 H; PRESERVED. A ;- E @$WTUMR::MOV (SP)+,12(R0) ;STORE RETURN ADDR TO ALLOCATE ROUTINE 7 CMP R0,$UMRWT ;MAPPING ASSIGNMENT BLK ALREADY IN LIST?A BEQ 5$ ;IF EQ YES 0 MOV R0,@$UMRWT+2 ;LINK BLOCK TO LAST IN QUEUE / MOV R0,$UMRWT+2 ;UPDATE LAST IN LIST POINTER  CLR (R0) ;ZERO LINK WORD$5$: TST (R0)+ ;POINT PAST LINK WORD( MOV R1,(R0)+ ;SAVE CALLER'S REGISTERS  MOV R2,(R0)+ ;  MOV R3,(R0)+ ;  MOV R4,(R0)+ ; *10$: RETURN ;RETURN TO CALLER'S CALLER  .DSABL LSB  .ENDC ; DF M$$EXT&U$$UMR ;+,; **-$RELOP-RELOCATE UNIBUS PHYSICAL ADDRESS;R>; THIS ROUTINE RELOCATES A UNIBUS PHYSICAL ADDRESS TO A KISAR6; BIAS AND DISPLACEMENT.;L ; INPUTS:O;S4; R0=BYTE OFFSET FROM ADDRESS IN U.BUF+1 AND U.BUF+2; R5=UCB ADDRESS2; U.BUF+1(R5)=HIGH ORDER BITS OF PHYSICAL ADDRESS1; U.BUF+2(R5)=LOW ORDER BITS OF PHYSICAL ADDRESSV;, ; OUTPUTS:;M(; KISAR6=CALCULATED BIAS (MAPPED SYSTEM)!; R1=REAL ADDRESS OR DISPLACEMENTA;- .IF NDF R$$PRO -$RELOP::MOV R0,-(SP) ;SAVE OFFSET INTO BUFFER5 MOV U.BUF+2(R5),R1 ;GET LOW BITS OF PHYSICAL ADDRESS 7 MOVB U.BUF+1(R5),R0 ;GET HIGH BITS OF PHYSICAL ADDRESSA% ADD (SP),R1 ;ADD OFFSET INTO BUFFERU ADC R0 ;...B/ ASHC #10.,R0 ;CALCULATE DISPLACEMENT AND BIAS  ASHC #-10.,R1 ;...B$ MOV R0,KISAR6 ;LOAD RELOCATION BIAS% ADD #140000,R1 ;SET TO MAP THRU APR6F" MOV (SP)+,R0 ;RESTORE BYTE OFFSET RETURN ;  .ENDC ; NDF R$$PROE;+E; **-$SWACD-SAVE MAPPING, CALL ACD00qJ1rN1ß0DATADATADATADATADATADATADATA AS A CO-ROUTINE, THEN REMAP DRIVER 7; **-$SWAC1-CALL ACD AS A CO-ROUTINE, THEN REMAP DRIVERG;LA; THESE ROUTINES ARE CALLED BY THE FULL DUPLEX TERMINAL DRIVER TOFD; SWITCH PROCESSING TO AN ANCILLARY CONTROL DRIVER (ACD). SINCE THEH; ACD REQUIRES APRS 5 AND 6, THE DRIVER MAPPING IS FIRST SAVED (IF ENTRYC; AT $SWACD), THEN THE ACD IS CALLED AS A CO-ROUTINE VIA A DISPATCH E; TABLE CONTAINED IN THE ANCILLARY CONTROL BLOCK (ACB). WHEN THE ACDNH; ACD RETURNS, THIS ROUTINE REMAPS THE DRIVER AND RETURNS CONTROL TO IT.; ; INPUTS:D;E0; R0=DISPATCH TABLE OFFSET (IF ENTRY AT $SWACD).&; R0=ACB ADDRESS (IF ENTRY AT $SWAC1).8; R5=POINTER TO OFFSET U.TSTA WITHIN THE TERMINAL'S UCB.3; 2(SP)=DISPATCH TABLE OFFSET (IF ENTRY AT $SWAC1).E:; 4(SP)=APR5 BIAS OF TERMINAL DRIVER (IF ENTRY AT $SWAC1).;D ; OUTPUTS:;T; R0 IS DESTROYED.;- .IF DF T$$ACD6$SWACD::MOV KINAR5,-(SP) ;SAVE TERMINAL DRIVER MAPPING .IF DF K$$DAS7 MOV KDSAR5,-(SP) ;SAVE TERMINAL DRIVER D-SPACE MAPPINGD .IFTF ;K$$DAS. MOV R0,-(SP) ;PUT ENTRY POINT OFFSET ON STACK) MOV U.ACB-U.TSTA(R5),R0 ;GET ACB ADDRESSB ASSUME A.REL,0Y9$SWAC1::MOV (R0),KINAR5 ;MAP THE ANCILLARY CONTROL DRIVERI .IFT ;K$$DASP: MOV (R0),KDSAR5 ;MAP THE ANCILLARY CONTROL DRIVER D-SPACE .IFTF ;K$$DAS: ADD A.DIS(R0),(SP) ;ADD DISPATCH TABLE ADDR TO THE OFFSET, MOV @(SP),(SP) ;GET THE ENTRY POINT ADDRESS CALL @(SP)+ ;CALL THE ACDR .IFT ;K$$DASD3 MOV (SP)+,KDSAR5 ;UPON RETURN, REMAP TTDRV D-SPACEP .ENDC ;K$$DAS, MOV (SP)+,KINAR5 ;REMAP THE TERMINAL DRIVER RETURN ;AND THEN RETURN TO IT .ENDC ;T$$ACD .ENDASSUME A.REL,0Y9$SWAC1::MOV (R0),KINAR5 ;MAP THE ANCILLARY CONTROL DRIVERI .IFT ;K$$DASP: MOV (R0),KDSAR5 ;MAP THE ANCILLARY CONTROL DRIVER D-SPACE .IFTF ;K$$DAS: ADD A.DIS(R0),(SP) ;ADD DISPATCH TABLE ADDR TO THE OFFSET, MOV @(SP),(SP) ;GET THE ENTRY POINT ADDRESS CALL @(SP)+ ;CALL THE ACDR .IFT ;K$$DASD3 MOV (SP)+,KDSAR5 ;UPON RETURN, REMAP TTDRV D-SPACEP .ENDC ;K$$DAS, MOV (SP .TITLE DRCIN .IDENT /5.00/;7; COPYRIGHT (C) 1985 BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; P. WANNHEDEN 24-MAY-77 ;+ ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ;; B. S. MCCARTHY;-; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:;; B. S. MCCARTHY;; MODIFIED BY:;; J. W. BERZLE 17-OCT-85 5.00.; *; JWB167 - USE $QRMVA INSTEAD OF $QRMVT; ;B; MACRO LIBRARY CALLSR;% .MCALL HWDDF$,TCBDF$,PCBDF$,ITBDF$S' HWDDF$ ; DEFINE HARDWARE REGISTERSM ! TCBDF$ ; DEFINE TCB OFFSETS " PCBDF$ ; DEFINE PCB OFFSETS # ITBDF$ ; DEFINE ITB OFFSETS$%;+#&; **-$DRCIN-CONNECT TO INTERRUPT.E'; H(; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CONNECT A SPECIFIED INTERRUPTI); VECTOR TO AN INTERRUPT SERVICE ROUTINE (ISR) IN THE TASK'S OWN SPACE,.=*; OR TO DISCONNECT A PREVIOUSLY CONNECTED INTERRUPT VECTOR.E+; H,; IF THE FUNCTION "CONNECT" IS REQUESTED, THE OPERATION IS AS FOLLOWS:E-; A BLOCK OF DYNAMIC MEMORY IS ALLOCATED AND SET UP AS AN INTERRUPTFB.; TRANSFER BLOCK (ITB). THE ITB IS LINKED TO THE ITB LIST OF THEA/; TASK WITH LISTHEAD (SINGLE WORD) IN P.DPCB OF THE TASK'S PCB.U90; CHECKPOINTING AND SHUFFLING IS DISABLED FOR THE TASK.EA1; THE VECTOR IS SET UP TO POINT TO THE OFFSET X.JSR IN THE ITB,EB2; WHICH CONTAINS A SUBROUTINE CALL TO THE SPECIAL INTERRUPT SAVE3; ROUTINE $INTSC.E4;E?5; IF THE FUNCTION "DISCONNECT" IS REQUESTED, THE OPERATION IS ?6; ESSENTIALLY THE REVERSE OF WHAT IS DESCRIBED FOR "CONNECT".T7;S58; *************************************************N.9; * NOTE - THE DISCONNECT FUNCTION, WHEN *,:; * DISCONNECTING THE LAST VECTOR (OR *.;; * ONLY), CLEARS THE CHECKPOINT-DISABLE *2<; * BIT (PS.CHK) AND NO-SHUFFLE-BIT (PS.NSF) *1=; * REGARDLESS OF WHAT THE STATE WAS BEFORE *S1>; * VECTORS WERE CONNE00rR1Å0¶0eaek›’CTED OR ANY CHANGE IN *O.?; * STATE WHILE VECTORS WERE CONNECTED. * @; * *A; * EXCEPTIONS: */B; * 1. IF THE TASK IS NOT CHECKPOINTABLE, *R"C; * PS.CHK IS NOT CLEARED. *0D; * 2. IF THE TASK IS MARKED FOR ABORT FOR *5E; * MEMORY PARITY ERROR, PS.NSF IS NOT CLEARED. *T5F; *************************************************HG;IH; DPB FORMAT: I;I%J; WD. 00 -- DIC(129.),DPB SIZE(7.).*'K; WD. 01 -- INTERRUPT VECTOR ADDRESS.S1L; WD. 02 -- BASE ADDRESS FOR MAPPING OF ISR ANDH)M; ENABLE/DISABLE-INTERRUPT ROUTINES.EFN; WD. 03 -- ADDRESS OF INTERRUPT SERVICE ROUTINE. IF ZERO, DIRECTIVE>O; IS "DISCONNECT FROM INTERRUPTS" AND REMAINING ARGUMENTSP; ARE IGNORED. :Q; WD. 04 -- ADDRESS OF ENABLE/DISABLE-INTERRUPT ROUTINE.2R; WD. 05 -- (LOW BYTE) LOW BYTE OF PSW TO BE SETS; BEFORE CALLING ISR.%T; WD. 06 -- ADDRESS OF AST ROUTINE.U; V; INPUTS:.W; ;X; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. Y; R3=POINTER TO WD. 01 IN DPB 1Z; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.E.[; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.\; 8]; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK).^;R_; IF SUCCESSFUL COMPLETION:I `; CC-C 0a; DIRECTIVE STATUS:Eb; +1A8c; BEFORE RETURN, THE ENABLE/DISABLE-INTERRUPTS ROUTINE<d; (IF SPECIFIED) IS CALLED IN KERNEL MODE WITH CC-C CLEAR.e; f; IF DIRECTIVE IS REJECTED:U g; CC-C 1h; DIRECTIVE STATUS:A9i; D.RS1 AN ITB COULD NOT BE ALLOCATED (NO POOL SPACE). 1j; D.RS8 THE FUNCTION REQUESTED IS "DISCONNECT"R.k; AND THE TASK IS NOT OWNER OF THE VECTOR.+l; D.RS16 ISSUING TASK IS NOT PRIVILEGED.T3m; D.RS17 THE SPECIFIED VECTOR IS ALREADY IN USE. :n; D.RS19 THE SPECIFIED VECTOR IS ILLEGAL (LOWER THAN 608o; OR HIGHER THAN HIGHEST VECTOR SPECIFIED AT SYSGEN,p; OR NOT A MULTIPLE OF 4).:q; D.RS81 ISR OR ENABLE/DISABLE-INTERRUPT ROUTINE IS NOT3r; WITHIN 4K WORDS FROM (BASE ADDRESS & 177700).1s;-tu .IF DF C$$INTv w .ENABL LSB x y$DRCIN::.z BIT #T3.PRV,T.ST3(R5) ; IS TASK PRIVILEGED?{ BEQ 95$ ; N - ILLEGAL, JUMPO|}~ .IF DF M$$PROD€ BIT $CPBIT,T.RRM(R5) ;DOES TASK HAVE AFFINITY FOR THIS PROCESSOR?� BEQ 100$ ;NO IF EQ‚ƒ .ENDC„…$† MOV (R3)+,R4 ; GET VECTOR ADDRESS‡ BIT #3,R4 ; MULTIPLE OF 4?&ˆ BNE 60$ ; N - ILLEGAL VECTOR, JUMP!‰ CMP R4,#60 ; VECTOR IN RANGE?EŠ BLO 60$ ; N - JUMP‹ CMP R4,#V$$CTR Œ BHIS 60$ ; N - JUMP0"� MOV (R3)+,R0 ; GET BASE ADDRESS$Ž MOV (R3)+,-(SP) ; GET ISR ADDRESS%� BEQ 40$ ; ZERO - DISCONNECT, JUMPE�;‘; DIRECTIVE IS "CONNECT"’;“” .IF DF E$$LOG&E$$NSI•!– CMP @R4,#$NS0 ; VECTOR IN USE?F— BLO 70$ ; Y - ILLEGAL, JUMPQ˜ CMP @R4,#$NS7™ BHI 70$ ; Y - ILLEGAL, JUMP+š› .IFF ; DF E$$LOG&E$$NSIœ$� CMP @R4,#$NONSI ; VECTOR IN USE ?ž BNE 70$ ; Y - ILLEGAL, JUMP,Ÿ  .ENDC ; DF E$$LOG&E$$NSI6¡3¢ BIC #77,R0 ; CLEAR LOWER 6 BITS IN BASE ADDRESSM£¤ .IF DF U$$DAS¥+¦ CALL $RELUI ; RELOCATE TO APR 6 ADDRESSD§¨ .IFF ; DF U$$DAS©+ª CALL $RELOC ; RELOCATE TO APR 6 ADDRESSC«¬ .ENDC ; DF U$$DAS­,® SUB #20000,R2 ; RELOCATE TO APR 5 ADDRESS!¯ BCS 90$ ; OUT OF RANGE - JUMPQ6° SUB R0,@SP ; GET DISPLACEMENT FROM "BASE" TO "ISR""± CMP @SP,#20000 ; .GT. 4K WORDS? ² BHIS 90$ ; Y - ILLEGAL, JUMP6³ MOV (R3)+,-(SP) ; GET ENB./DIS.INT. ROUTINE ADDRESS$´ BEQ 10$ ; NO SUCH ROUTINE - JUMP+µ SUB R0,@SP ; GET DISPLACEMENT FROM BASED!¶ BCS 90$ ; OUT OF RANGE - JUMPO"· CMP @SP,#20000 ; .GT. 4K WORDS? ¸ BHIS 90$ ; Y - ILLEGAL, JUMP%¹ ADD R2,@SP ; MAKE APR 5 ADDRESSESNº10$: ADD R2,2(SP)"» MOV R1,-(SP) ; SAVE APR 5 VALUE+¼ MOV #X.LEN,R1 ; GET SIZE OF ITB IN BYTES½¾ .IF DF K$$DAS¿À MOV #$ICAVL-2,R0"0Á CALL $ALOC1 ; ALLOCATE ITB FROM ICB/ITB POOLÂà .IFFLÄ!Å CALL $ALOCB ; ALLOCATE AN ITBBÆÇ .ENDCÈÉ BCS 80$ ; FAILURE - JUMP$Ê MOV T.PCB(R5),R1 ; GET TASK'S PCB1Ë ADD #P.STAT,R1 ; POINT TO STATUS WORD (P.STAT)E,Ì BIT #PS.CHK00rZ1N1ß0DATADATADATADATADATADATADATA,@R1 ; CHECKPOINTING DISABLED?Í BNE 20$ ; Y - JUMPÎ BIS #PS.CHK,@R1 ; N - DO IT2Ï CLR P.DPCB-P.STAT(R1) ; INITIALIZE ITB LISTHEAD*Ð20$: BIS #PS.NSF,@R1 ; DISABLE SHUFFLINGÑ ASSUME P.DPCB,P.STAT-4 Ò TST -(R1)>Ó MOV -(R1),@R0 ; ADD ITB TO FRONT OF ITB LIST IN PCB (X.LNK) Ô MOV R0,@R1L*Õ TST (R0)+ ; STEP PAST LINK WORD IN ITB*Ö MOV R0,R1 ; SAVE INTERRUPT ENTRY POINT.× MOV #4537,(R0)+ ; "JSR R5,@#$INTSC" (X.JSR) Ø MOV #$INTSC,(R0)+ ; (X.JSR+2).Ù MOV (R3)+,@R0 ; PSW AND UNUSED BYTE (X.PSW).Ú ADD #X.REL-X.PSW,R0 ; POINT TO X.REL IN ITB.Û MOV (SP)+,(R0)+ ; STORE APR 5 VALUE (X.REL)@Ü MOV (SP)+,(R0)+ ; STORE ENB./DIS.INT. ROUTINE ADDRESS (X.DSI)+Ý MOV R5,(R0)+ ; STORE TCB ADDRESS (X.TCB)T<Þ MOV (SP)+,X.ISR-(R0) ; STORE ISR ADDRESS (X.ISR)=ß CLR X.FORK+2-(R0) ; CLEAR FORK PC WORD (X.FORK+2)N9à MOV #$DQAC,(R0)+ ; STORE ADDRESS OF ROUTINE TO DEQUEUE5"á ; AST BLOCK QUEUED BY $QASTC/â TST (R0)+ ; STEP PAST AST QUEUE THREAD WORD@*ã MOV PC,(R0)+ ; SET NON-ZERO TO INDICATEä ; AST BLOCK FREE (A.CBL)>å MOV #7*2+2,(R0)+ ; NUMBER OF WORDS TO ALLOCATE ON AST STACKæ ; (A.BYT)E&ç MOV @R3,(R0)+ ; AST ADDRESS (A.AST)6è MOV #1,(R0)+ ; NUMBER OF AST PARAMETERS = 1 (A.NPR)8é MOV R4,(R0)+ ; AST PARAMETER = VECTOR ADDRESS (X.VEC)(ê MOV @R4,@R0 ; SAVE VECTOR PC (X.VPC)+ë MOV R1,@R4 ; SET VECTOR TO POINT TO ITBR6ì TST -(R1) ; BACK UP TO START OF ITB AND CLEAR CC-C2í CALLR $CLEDR ;CALL USER ENABLE/DISABLE ROUTINEî ; R1 = POINTER TO ITBO&ï ; CC-C = 0 TO ENABLE INTERRUPTS,&ð ; = 1 TO DISABLE INTERRUPTSñ;Oò;Oó; DIRECTIVE IS "DISCONNECT" ô;T'õ40$: MOV @R4,R1 ; GET PC FROM VECTOR)+ö SUB #X.JSR,R1 ; GET START OF ITB (X.LNK)=÷ MOV T.PCB(R5),R0 ; GET PCBS3ø BIT #PS.CHK,P.STAT(R0) ; CHECKPOINTING DISABLED? *ù BEQ 100$ ; N - TASK HAS NO ITB'S, JUMP4ú CALL $DISIN ; DISABLE INTERRUPTS, DEALLOCATE THEû ; ITB ETCETERA9ü BCS 100$ ; ERROR (TASK IS NOT OWNER OF VECTOR) - JUMP ý DRSTS +1 ; EXIT WITH SUCCESSþ%ÿ60$: DRSTS D.RS19 ; ILLEGAL VECTOR ,70$: DRSTS D.RS17 ; VECTOR ALREADY IN USE#80$: DRSTS D.RS1 ; NO POOL SPACE?90$: DRSTS D.RS81 ; ISR OR ENB./DIS.INT. ROUTINE ADDRESS NOTA2 ; WITHIN RANGE (BASE&177700, BASE&177700+4K)*95$: DRSTS D.RS16 ; PRIVILEGE VIOLATION?100$: DRSTS D.RS8 ; DISCONNECT - TASK IS NOT OWNER OF VECTORS; ;L;+* ; **-$DISIN-DISCONNECT INTERRUPT VECTOR. ;B ; INPUT: ; R1 POINTER TO ITB  ; R5 POINTER TO TASK TCB;; ; OUTPUT:C; IF SUCCESS:D ; CC-C 0+; THE FOLLOWING OPERATIONS ARE PERFORMED:C4; 1. THE ITB IS REMOVED FROM THE ITB LIST STARTING#; IN P.DPCB OF THE TASK'S PCB..;; 2. IF A USER ROUTINE TO DISABLE INTERRUPTS WAS SUPPLIED7?; WHEN THE VECTOR WAS CONNECTED TO, THAT ROUTINE IS CALLED$; IN KERNEL MODE WITH CC-C SET.H; 3. VECTOR PC IS RESTORED TO POINT TO THE NONSENSE INTERRUPT ROUTINE.<; 4. IF THE FORK BLOCK OF THE ITB IS IN THE FORK QUEUE, IT; IS REMOVED.D; 5. IF THE AST BLOCK OF THE ITB IS IN THE AST QUEUE FOR THE TASK,; IT IS REMOVED.M9; 6. IF THIS WAS THE ONLY VECTOR CONNECTED TO THE TASK,@; AND THE TASK IS CHECKPOINTABLE, CHECKPOINTING IS ENABLED.B; ALSO, UNLESS THE TASK IS MARKED FOR ABORT FOR MEMORY PARITY# ; ERROR, SHUFFLING IS ENABLED. '!; 7. FINALLY, THE ITB IS DEALLOCATED.C";C+#; IF ERROR (TASK IS NOT OWNER OF VECTOR):P $; CC-C 1%;."&; REGISTERS ALTERED: R0,R1,R2,R3';-(;E);T$*$DISIN::MOV T.PCB(R5),R0 ; GET PCB2+ ADD #P.DPCB,R0 ; POINT TO ITB LISTHEAD (P.DPCB)1, MOV 2(R0),-(SP) ; SAVE WORD FOLLOWING LISTHEADL1, CALL $QRMVA ; REMOVE FROM ITB LIST ;JWB167S;. MOV (SP)+,2(R0) ; RESTORE WORD FOLLOWING LISTHEAD ;**-1U0/ BCS 130$ ; ITB NOT IN LIST - EXIT WITH ERROR.0 MOV R0,-(SP) ; SAVE POINTER TO ITB LISTHEAD1 SEC82 CALL $CLEDR ;CALL USER ROUTINE TO DISABLE INTERRUPTS3 ; WITH CC-C SET/4 MOV X.VPC(R1),@X.VEC(R1) ; RESTORE VECTOR PC3.5 ADD #X.FORK,R1 ; POINT AT FORK BLOCK IN ITB%6 M00rb1se1¶0eaek›’OV #$FRKHD,R0 ; GET FORK LISTHEADI"7 MTPS #PR7 ; DISABLE INTERRUPTS@7 CALL $QRMVA ;;; REMOVE FROM FORK LIST IF IT IS THERE ;JWB167*9 MTPS #0 ;;; ENABLE INTERRUPTS ;**-13: ADD #X.AST-X.FORK,R1 ; POINT AT AST BLOCK IN ITB ; MOV R5,R0)< ADD #T.ASTL,R0 ; GET AST LIST LISTHEADA>< CALL $QRMVA ; REMOVE FROM AST LIST IF IT IS THERE ;JWB167/> SUB #X.AST,R1 ; RESTORE ITB POINTER ;**-1E%? MOV R1,R0 ; GET ITB POINTER IN R0R1@ MOV (SP)+,R1 ; RESTORE POINTER TO ITB LISTHEADC#A TST (R1)+ ; ITB LIST NOW EMPTY?KB BNE 120$ ; N - JUMP C ASSUME P.STAT,P.DPCB+4LD TST (R1)+ ; POINT TO P.STATS4E MOV T.ST2(R5),R2 ; Y - GET STATUS WORD 2 FROM TCB(F BIT #T2.CHK,R2 ; TASK CHECKPOINTABLE?G BNE 105$ ; N - JUMP )H BIC #PS.CHK,@R1 ; ENABLE CHECKPOINTING I105$: ASSUME T2.ABO,100M$J ROLB R2 ; TASK MARKED FOR ABORT?K BPL 110$ ; N - JUMPS>L CMP T.EFLG(R5),#S.PRTY ; Y - IS REASON MEMORY PARITY ERROR?(M BEQ 120$ ; Y - DON'T MAKE SHUFFLABLE*N110$: BIC #PS.NSF,@R1 ; ENABLE SHUFFLING)O120$: MOV #X.LEN,R1 ; GET LENGTH OF ITBPQ .IF DF K$$DASRS MOV #$ICAVL-2,R3N.T CALL $DEAC1 ; DEALLOCATE FROM ICB/ITB POOLUV .IFFMW X CALL $DEACB ; DEALLOCATE ITBYZ .ENDC[\ CLC ; SUCCESS]130$: RETURN^ _ .DSABL LSBT`a .ENDCbcd .ENDM$J ROLB R2 ; TASK MARKED FOR ABORT?K BPL 110$ ; N - JUMPS>L CMP T.EFLG(R5),#S.PRTY ; Y - IS REASON MEMORY PARITY ERROR?(M BEQ 120$ ; Y - DON'T MAKE SHUFFLABLE*N110$: BIC #PS.NSF,@R1 ; ENABLE S .TITLE VIDSUB .IDENT /01/;; COPYRIGHT (C) 1982; ALL RIGHTS RESERVED/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;?; THIS SOFTWARE IS FURNISHED UNDER LICENSE AND MAY ONLY BE USED6; OR COPIED ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 01;; T. LEKAS 7-FEB-82;; MODIFIED BY:; .MCALL DCBDF$ DCBDF$;;+9; EXEC SUBROUTINES FOR THE USE OF THE VIDEO FIRMWARE TASK!; WHILE IT IS MAPPED TO THE EXEC.;-; .IF DF D$$C11;;+@; N$DRIN - NOTIFY THE TERMINAL DRIVER THAT THERE IS INPUT FOR IT;9 ; INPUTS:I; NONE;E ; OUTPUTS:;; THE TERMINAL DRIVER CT INPUT ROUTINE IS MAPPED AND CALLED ;F; REGISTERS MODIFIED:A; NONE;-;E5 .IIF DF,K$$DAS,.ERROR ;THIS MUST BE A NON I/D SYSTEM.3; THIS CODE ALSO ASSUMES THAT THE TTDRV IS LOADABLEI; NOTE:;7; WHEN WE FIGURE OUT WHAT REALLY NEEDS TO BE SAVED THISF/; CAN BE CLEANED UP AND PROBABLY GENERERALIZED.T; .ENABL LSBX)N$DRIN::JSR R5,SAVER ;SAVE THE REGISTERS$ MOV @#KINAR5,-(SP) ;SAVE APR 5 MOV @#KINAR6,-(SP) ;SAVE APR 6+ MOV #.CTDCB,R0 ;GET THE TTDRV DCB ADDRESSN/ MOV D.PCB(R0),R1 ;GET THE DRIVERS PCB ADDRESS> MOV P.REL(R1),@#KINAR5 ;MAP KERNEL INSTRUCTION APR5 TO DRIVER8 MOV D.DSP(R0),R0 ;GET ADDRESS OF DRIVER DISPATCH TABLE0 CALL @D.VTIN(R0) ;CALL DRIVER CT INPUT ROUTINE BR 10$ ;CLEANUP AND EXIT ;Y;+:; N$DROU - NOTIFY THE TERMINAL DRIVER OF OUTPUT COMPLETION;L ; INPUTS:; NONE;S ; OUTPUTS:G; THE TERMINAL DRIVER CT OUTPUT COMPLETION ROUTINE IS MAPPED AND CALLEDM;@; REGISTERS MODIFIED:R; NONE;-;R)N$DROU::JSR R5,SAVER ;SAVE THE REGISTERS) MOV @#KINAR5,-(SP) ;SAVE APR 5 MOV @#KINAR6,-(SP) ;SAVE APR 6+ MOV #.CTDCB,R0 ;GET THE TTDRV DCB ADDRESS)/ MOV D.PCB(R0),R1 ;GET THE DRIVERS PCB ADDRESS > MOV P.REL(R1),@#KINAR5 ;MAP KERNEL INSTRUCTION APR5 TO DRIVER8 MOV D.DSP(R0),R0 ;GET ADDRESS OF DRIVER DISPATCH TABLE0 CALL @D.VTOU(R0) ;CALL DRIVER CT INPUT ROUTINE'10$: MOV (SP)+,@#KINAR6 ;RESTORE APR 6U# MOV (SP)+,@#KINAR5 ;RESTORE APR 5L8; SET THE PRIORITY TO ZERO IF IT ISN'T ALREADY THERE NOW(; CHECK TO SEE IF THIS IS REALLY NEEDED MTPS #0 ; RETURN ;AND EXIT;,; SAVER - SAVE REGISTERS;D); THIS ROUTINE IS A CO-ROUTINE THAT SAVESP$; AND RESTORES REGISTERS R0 THRU R5.;SAVER: MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ;SAVE R3 MOV R4,-(SP) ;SAVE R4! MOV R5,-(SP) ;SET RETURN ADDRESSR MOV 14(SP),R5 ;RESTORE R5 CALL @(SP)+ ;CALL THE CALLER00sj1tk1˜l1DATADATADATADATADATADATADATA MOV (SP)+,R4 ;RESTORE R4 MOV (SP)+,R3 ;RESTORE R3O MOV (SP)+,R2 ;RESTORE R2N MOV (SP)+,R1 ;RESTORE R1  MOV (SP)+,R0 ;RESTORE R00 MOV (SP)+,R5 ;RESTORE R5$ RETURN ;RETURN TO ORIGINAL CALLER .ENDC ;D$$C11 .ENDEÿÿHAT SAVESP$; AND RESTORES REGISTERS R0 THRU R5.;SAVER: MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ;SAVE R3 MOV R4,-(SP) ;SAVE R4! MOV R5,-(SP) ;SET RETURN ADDRESSR MOV 14(SP),R5 ;RESTORE R5 CALL @(SP)+ ;CALL THE CALLER9 .IIF DF,T$$APE $IDENT MUDRV,02,26, 9 .IIF DF,D$$DSK $IDENT DUDRV,02,26,C;K;=; COPYRIGHT (c) 1985, 1987 BY DIGITAL EQUIPMENT CORPORATIONK; ALL RIGHTS RESERVED.; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;T ;R ; MODIFIED BY: ;S ; J. W. BERZLE 20-SEP-85 2.00+ ; JWB165 -- REMOVE LOCAL $QRMVA ROUTINE ;=! ; P. K. M. WEISS 8-OCT-85 2|³–,ÿ&ÿ&ZœV ›r[qÀÀÿÿ$V B  ^SYSYSYSYTICLSYOV¦PŽÎ³(x(xðB ئÀbú¤ DRDRDRDRTICLDRDB„ÿ&œ€ ƒÀÀŒm,γPŽ>5γP@0(FILE.DATP@ØP@ øðFILE.DATP P¸ RMSCNV.LISPhPŒ‚ RMSCNV.CMDP2PTLFILE.DATP4PtFILE.ERRæ,wÆæw¾æ$w¶¡‡æwªæ0w¢æ4wšæ8w’æ<wŠæhælw|÷ šCNVCTLæÃ.Ãó„ 0ƒ÷ ¨ÿ÷ tß_ßì÷ T÷ 8N‡÷ :D‡÷50÷ T÷ @;‡÷5ô÷ "4‡÷ D1‡÷5à÷ >÷ 00˜r1e1¶0eaek›’BÅØõ¥ ÷ Z ‡÷ D÷ X‡÷ 2÷ >‡÷5¬÷ h ÷5@œ÷ b÷ L÷5Š÷ ø÷ 4÷ (÷ ­¡±‡ÿÿØÌ& TI:TI:@ D H L P T X _ CNV> ÷5~—!@‚wn÷5lÎewð&f¦æ÷5T ·–÷’æî ÿˆ Á  ÷ †² òšöƒò òå òòòö€Àe ����PƒÃe ÐÀÞ2ˆ·Î·Ì ƒ‚�€Ž÷5¼Þ 7 ªæ &f¦æÂ¢ƒ÷˜ 7 Ž7 Œ¶Á ÷ Rƒ‚�€w j‡wxw„wˆwtwˆw\wˆw”@&f¦Àf ÷ „wäÿ‚�€‡À Àf  Àf ÷ Èÿ÷ ÌÿÁ ‡Â wF&f¦÷ €B†Àf öf �‚÷ j7†fÁe?� � � � � � w€ÿ�w xÿ‚ÁrÿÁe?� � � � � � & fæYÿˆ†Á w Rÿö†±€Á Á Á Á Á Á Â4ÿw`0ÿ÷ Pÿ‚�€¤– –5‡·dææ æiÿˆ÷5VßH ÷ (ü×-ý7 þü÷ øü÷ðüæìüæÿˆÁÉ ÷v÷¢ nwR„4 ô€÷ìNJ‡C3 3 ó€ó €É,Ä, ÍUóE€s3wžæ �¦æ&fÃzÑ BÀ˜þ… *ƒÅ Í‹'Â% Í¥!‡Í¥EÀàúÂ%,‡À€ý… ƒÅ D„Œ†„ŒÀ5 ‚‡õ¥  õ¥PBÄ2Ì þÂ%pÀÐÿÄ‹ñó5Jó³ J€÷ àþó J÷ …„ƒ‚�€‡@ºÿµ ºÿõÅüÿ´ÿEÍ¥ó‚A�î†A� êƒÁ I  P ×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ ò Àÿ LTÿ ^Tÿ üpTÿ ôpÆÿ ìp$ÿ äpÿ Ü‚Tÿ Ô”\ÿ ̦Tÿ ĸTÿ ¼ÊTÿ ´Üvÿ ¬Ü"ÿ ¤Ü6ÿ œÜšÿ ”Ü4ÿ ŒîTÿ „îPÿ |îtÿ tžÿ lÿ d$ÿ \6Àÿ T6®ÿ L6xÿ D6žÿ <6€ÿ 46Œÿ ,6¦ÿ $6¸ÿ 6Èÿ 6Zÿ Z"ÿ ~0¦Þ5Îe‡w ŠÁ,… Bv ù    ù ‡‚Ê5ôùB‡w¶ù ꄦÊ5‚ú‚‡ò û¦¦‚ Ž (Ê5(ÊUW¬ ‡Ä ò ƒ Ä ó  €ææwÿˆóE€Ê5 ÛÊE Ž‚ØÖ ‚ÇW¬ ͇Ê5 ÊÄ È„,ÅÊE é àÔ ^ ßî&w¼ýÊEò ÊU ‡æ&W¬ )‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡w  ÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w \  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡&æf…Þ ƒ„…‡&æ¦ff… Þ �‚ƒ„…‡›r[q›r[q Ø–¾ Ä È Ì Ð v È ö€¾ ¾ ‡àÀòà›r˜ÆðÀ@à(IqäMðà@òIqÿMðà@òIqÿM,ðÀàòU(U@ TLHÎ �TD:^Ì�TÔ:p:d�T„:‚ü�T :”ð3�T„:¦N`�T0:¸¿x�T :ÊÀx�T$:ÜÁx�TÀ:î#$�T´:6®&�(îY*�,î$ž!,�èîO:-�Tì:LŸ1�0ZÔ,Mq1�0$HlBt3�0¤H~Fw6�0Ø�HZ½ƒPs8�"Ä~¢ôXR;�"ˆ~´."=�"~Æ2"?�"ô~Ø/"@�"<~ê0"B�"(~ü1"D�"\~4"F�"4~ 5"H�"h~26"J�"Œ~D7"L�"Œ~V"N�"x~h"P�"0~z"R�"Ô~Œ"T�"ø~ž"V�"H~°"X�"~Â"Z�" ~�µW[�Ì&:U,^è^èú^^^^^zÀ‚Æà‚Æà‚ÆÀ€Æ00˜z1k1˜l1DATADATADATADATADATADATADATA÷ ÔòCNVCMD÷ Fò Á… ÷ ô†‰±‡7,òw,ò×=òwÔ×=òwt×=òwlæ,ÿˆ×-xé°ÿ÷UêñãÁhéW ‚÷UØñÚ÷UÐñÀ.¢/¤ Á ÷Á f¶ñ”Á ý�w¬ñwø÷Ušñwtÿ±‡÷5Œñ÷ æ÷â÷ Ø÷Ôæøÿˆ÷lñÞ÷jñÚæÿˆ×­Úöÿ÷ÔRñwž±‡Å¬Ä2ôµ2õ õffæ…÷ îïÆe…õ /õñõ ñffæ…÷ ÀïÆe…õ%°ýõ wàðw,Å2ffæ…÷ \ïÆe…÷E¶ð÷ žwŒþ‰wÔÿÀªðÀm¨ð¨-w,æšõÎåÀ†%‡7 Žð‰íÀ„ð€ð ÷5pð 3wBþ  ÈÅ€¢"D Ä ¢a‡¢z‚ÈÅ ¢ ƒ”ƒ  è€ û÷0ð À(ðÄ P¤@¨;wìý÷5ðwàýÀðÀmðÈ• ¡‡÷5êï1÷ ìïÅ2÷ À5(õ�Üï,ffæ…÷ zîÆe…õ ÷ �Ŭffæ…÷ `îÆe…÷U–ïwpý‰±÷ vwdý‰±wªþ÷‚ïJï÷zïFw–þæpïæjïædïÈ• ÷UTï7 Vï7 TïæHï÷ öü·@ï÷E:ïD‡÷ <ïÂ4ïÁ2ï ÷ ñ·$ï·"ï· ïwjþ�Ámï  ÷ äðƒ„Ò”Ä ýÃöîÄôîÒ”Ä ýæìîææîæàî7Üîà·ØîwÖî ‚Ö �÷ ¢ð ‚Ö �÷ –ðwþ– –5‡ ( $ ($)ÿ ŠõÂ�"ÿ ‚õÂ"ÿ zõÂL"÷ ÔòCNVPARÀFòÁDò<W (W ,÷ †3‡÷6ò·0òÁ ÷ ü7‡Á ¢=%€ Á "÷ ^‡÷ ò·òÁ ÷ Ò"‡Á ¡‡¢?Ø÷Uò÷´åÍà üòw�ñ7Œñ÷ºñ‚ñ÷²ñ~ñ‰±‡÷ *ò+DOFNM&fBÀj÷ !‡v "fŽí¶ã¦v  �÷ Fó ‡�‚&P” ý‚ƒ�€¡‡�€�€±‡  ó÷ ¢ñ+DOSWIÁ ¢=¢/÷ ‡ô¡‡÷ 0ÿ±‡ALÚAPØBL@ðØCA@ØEOÚER@ÈÚFO€ØØHEØID ØIEÚIM@ØKN€€ØKR€¸ØLOØMAØML€@ÚPD`ÐØPD@èØRM€ÚSL@ØSS ØSU@ØTR€ØWFÚ÷ ‚ð+ONESWDÁ \¢/Y€ Â´Ê f¤d‡"¨Âe ÷¤]‡"¨÷Áåº<L¢:º\Ê5€Ù:€ Á 7Ê5À7&fÊ5÷ ܇Š=Ê5÷ ²‡Ê5÷ „‡º\ò ú …„‡«…„Ê5 À Áe¸±‡¡‡÷ , ‰ø÷ $ ‰ô÷ ‰ð÷ ‰ì÷ ‰è÷ '‰ä@÷Æî7Äî‡HELPÿ Pölœ ÿ Höl ÿ @ölÚ ÿ 8öl¢ ÿ 0ölþ ÿ (öl* ÿ öl¨ ÿ öl| ÿ öllÿ ölè ÿ ölÌ ÿ øõlV!ÿ ðõlö ÿ èõll!÷ ÔòCNVCAT÷5tòiÅü÷ NòõHò(õ�Dò,õ,ò(õ�(ò,÷ :÷5@DòõÅ"õÕõÅõÕ"õ¼ffæ…÷ ”ðÆe…5 õ ‰2÷ ä÷5@öñ÷5îñļô¥‰‰÷ °‡÷ :@5 f÷ ºffæ…÷ ðÆe…Å µ5¡±‡Áü C D ò 2 Cò CÜò� CÜò� CÜò�CòC$ò$C.ò.C D"ò 2" CÜ0ò�0 CÜ1ò�1‡ ÷ bñCNVINIæÿˆÀ7�8æÿˆ€  ÷ƒ÷5°ð÷•æÿˆÅ õð*õ•-¡‡SYTI÷ ñCNVVALÀ°È 828<‰±‡Àeñ÷5@‚ð÷UzðÅØÄ ÷ Hð÷ >ð÷50`ð‰ô *ô•-÷ ð ÷ðð÷ðð7 ð7 ð롇±‡Ø@Ø@؉Ø@ØØ@بØ@Ø�Ú€ØØ ؈ØÚC@ØØÚÚÚ÷ &ðCNVWWW Á  ÷ lñ)‡&f&æ?ÿˆ7@ï,|³74ï7,ï7Rï �‚÷ 2ñ‡À Á¬Ân÷ T÷ ¡‡‰±‡‰±‡À$ïÀeÿÀEÿÀ€ 7pï÷€hï÷ífïbï÷å\ï÷ úî÷å Pï‡%R>ÿ XöZ®ÿ Pö�D#ÿ HöÂ�"ÿ @öÂ"ÿ 8öÂL"÷ ÔòCNVHLP÷5 tò&‰¡÷5hò÷ ‡Àú Ⱦðµæî ÿˆÈsð8æî ÿˆÈ«ð@æî ÿˆÈëðræî ÿˆ‡ RMS-11 Convert Utility Purpose: To convert files from one organization to another. Command syntax: outfile[/switches...]=infile[/switches...] Switches (all are global): /AP - append SEQ output /BL[:value] - tape output blocksize /CA[:filespec] - copy file attributes /EO - change end-of-file format /ER[:filespec] - produce exception records /FO:org - define output file 00˜‚1e1¶0eaek›’organization /ID - display CNV version /IM - copy files in IMAGE (block) mode /KN:keyname - read file based on key name /KR:value - read file based on key number /LO - honor indexed fill factor /MA - load using indexed mass insert /ML:value - set memory limitation for buffers /PD[:value] - pad 'short' records [with this byte] /SL[:filespec] - produce a summary listing /SU - supercede output SEQ file /TR - truncate 'long' records /WF - read and write VFC fixed headersæw®õ÷ ÌòCNVOPN÷5nòwz÷5@`òÅØõÅõÕ"Å õÅõÕ!ÅØõÅ"õÕÅ õÅ!õÕÅ Ä÷5ò ÷%ò‰ôU÷5@ôñ ÷%üñ ‰õUwêÅØõ¨ñ(õ�¤ñ,÷ ¶÷ œõ ‰wÆ÷ šÅ ÷ šõ€ñ(õ�|ñ,÷5˜ñ&÷ ò÷5ŒñõŒñ.õ.ffæ…÷ ÚïÆe…õ B÷ w�hñf÷ 2…5 8÷ Vñ×-Pñ ÷Fñ÷50ñõ•ÄØ Ýõ� Ýõ�õ Ý0õ�0³÷ Òõ%púõ•öõ ‰w‰u÷ ~÷ ºõ­Þð÷ ¾‰i÷5¼ðGÅhõ�ð(õÐð*õ�Ðð-õ�|ð,÷ †÷ lõ ffæ…÷ êîÆe…õ ‰÷Ejð<÷ LÅâffæ…÷ ÚîÆe…õ Åh‰'  ÁP÷ Þñ‡7ð‰7 üfõ®5 ffæ…÷ †îÆe…õÝÖµ‡¡±‡÷ ÂïÅØõ´ï(õ�°ï,õÕ/÷ ¼÷ ¢ÿõ ‰ç÷ ¢õ¥õ¥Ú(‰Ú ‰ØÄØõ¥õµffæ…÷ úüÆe…õ  õµ2õ•õ•5Š0‡õµ2w�3 æ–ÿˆ‡  ÿ PöZRÿ HöÂ�"ÿ @öÂ"ÿ 8öÂê"÷ ÔòCNVSL1÷5tò ÅâÀ®È 8<55ffæ…÷ äðÆe…õ Àe䇉±üØÿÿP/ØÿÿؑذØÌ$Úð'Ú Ú7Ø@S"Ø€uØŽØ©ØÈÚ@æØØ Ø@3Ø€JÚhØÿÿ‚RMS-11 Convert -- Version 2.0 Summary Listing Options in effect: Append sequential output (AP) Set magtape blocksize (BL) Create copying attribute data (CA) Interpret embedded Control/Z EOF (EO) Produce exception records (ER) Ignore certain errors (IE) Copy files using image mode (IM) Select key by name (KN) Select key by number (KR) Honor index fill factors (LO) Use indexed mass insert (MA) Buffer limit specified (ML) Pad 'short' records (PD) Enable /PD:0/TR (SS) Supercede output (SU) Truncate 'long' records (TR) Process VFC headers (WF) ÷ ÔòCNVSL2÷5tòQÅâÄØ&&µ& œµffæ…÷ æðÆe…õ 7ÀØ÷ lÄ &&µ& œµffæ…÷ ªðÆe…õ À ÷ 0õØõffæ…÷ |ðÆe…õ ¡‡‰±‡÷ ðµ!2÷ x÷ ¸÷ h‡÷6<ñ  ÜÃEüÃ%÷N&ñwœÃ%÷Yñð ð " ÷dñ7 ñ7"þð÷zöð÷×ìðw`÷�àð7ÜðwPÂrÒšÒ€2 2 ð‹1�ÒÈ œ1Ò‹ð5€ÒÝÒ×w ÷êŠð ÜÃEðÿ÷þzðwðÃ%÷jð7fðwÚÃ%÷%Tðð ÷7Jð7Fð÷×<ðw°Ã%÷J*ð7 (ð7œ0"ðð ÷7ð7ð÷× ðw|÷`üïð ÷7òï7îï÷×äïwX÷iÖï ÜÃEðÿà ÷�Äïw:Ã%÷ˆ´ïw*Ã%÷£¤ïwÃ%÷µ”ïw ÷ÉŠïw&f¦ÀÂïÁvïÂt÷ æõ²ïuffæ…÷ \îÆe…õ ‚�€‡‰±‡ File organization: %ISequentialRelative%I, maximum record number = %TIndexed, using %M key(s) File attributes: Allocation=%T, Extend=%M%I, Bucket size = %M%I, Contiguous Record format: %IUndefinedFixed length %M byte recordsVariable length%I, maximum %M bytesVFC, %M by00˜Š1k1˜l1DATADATADATADATADATADATADATAte header%IStream%I Record attributes: %INone Fortran carriage control Carriage return Print file format Non-spanned Message summary:ÿ õ�D#÷ ÔòCNVSL3Åâõ ¡‡õÂõffæ…÷ òðÆe…õ 5ÀìÁÄ ÷ ÎÀå×5õ×ffæ…÷ ¼ðÆe…õ zÀ ÁÈ ÷ ˜Àåõ5õõffæ…÷ †ðÆe…õ _÷5(ÔñÀ(ÁÐ ÷ ZÀå5õffæ…÷ HðÆe…õ @÷5 –ñÀFÁÌ ÷ Àå15õ1ffæ…÷ ðÆe…õ !÷5ZñÀdÁÔ ÷ ÞÀåO5õOffæ…÷ ÌïÆe…õ ¡‡‰±‡ Processing summary: Records read: ????????? Records written: ????????? Records padded: ????????? Records truncated: ????????? Exception Records: ?????????ÿ š÷�D"&æ¦f&¦ v Þ €�‚ƒ„…‡÷ ²òCNVALC÷5@RòD÷5Lò@÷5DòkÃî ÅØ7 Îñõ¥÷�ÀìÀñ÷ë¼ñ÷�±ì²ñ÷ã®ñÁ’÷ ¨Å 7 œñõ¥÷�VíŽñ÷ëŠñ÷�Gí€ñ÷ã|ñÁº÷ v÷øñlñÁò÷ h/÷52ì÷5òìÁ¾ñ ÁÁ æÊñÎåV ƒ‰÷%(¸ñ‚Á Á  ÷ 0ó ‡7”ñw’ñf¡ η€ñ¡±‡À Âr÷ ‚ó sæÿˆ‡Total of %D %I allocated for input fileTotal of %D %I allocated for output filebucketsblocksTotal of %D memory blocks free (unallocated)%N÷ ñCNVCMR÷5@¦ðw´÷¾ð¾ð÷5”ð÷å°ð÷5@ˆð÷Šð¢ð÷ žð÷ šð÷%”ð‡w~ÅØÄ �À@Ý ñ š1 ˜Áe÷GšÀæ .P n ‚ ¤ · 8ð÷�4ð¦ê÷�.ðhë7 (ðÀP÷ ZÀ÷ R{Àð•÷ žÀPð�ð 7 úï÷ 0j÷ ðïÀ÷  ÷eâïÀPð�Úï 7 Ôï÷ WÀPð•÷ VÀð�¸ï 7 ²ï÷ èFÀPð•÷ 4Àð•÷ &7ÀPð•÷ ÷ 4-ÀPð•÷ Àð�dï 7 ^ï÷ ”ÀPð•÷ àÀð•÷ Ò ÀPð•÷ ÂÀ÷ Ü÷ ¶ÀP÷ À÷ ‡f¦$ñµ(2 œ Âå·`ðîð• ¬  ƒ& œ Îå·eÒîð• ‚�‡f¦$ñµ 2#ñeÿ.ñEÿ.ñ.± .p¬.  ‚œ Bì.ð• ·`†î œ ·`|îwì.vî€7 pî‚�‡f$& Nœ1& œ·íRîÎ û–%�‡÷ œû$Àœ1÷5îÁœÁe÷ R· "î ‚·àî7 î‚`7àî� t�‡Á÷ ,·àüíöÁœÁe÷ · êíð‚·àäí7 àíè‚`7àØí� ãf `Î ý– ‡÷ òíCNVCONÅØõ ÅPffæ…÷ ìÆe…õ Å õ Åffæ…÷ ÜëÆe…õ ¡‡‰±‡÷ ŽíCNVKEY÷5@.í1õ¥ -õ f÷ <…@ð¥÷5€íð­íÂúìÃøìR¤à ü7œäì á÷ !‰±‡¡‡÷5Àì Át œÑ Ñ "‰¡í÷ ôìCNVSET÷5@”ìwBÄ ô¥ Åõ•ô•÷zìÅ ÄØ@÷ ÷ ÷5 Pì/ô¥õ¥5-$$#‡÷5€.ì‰÷5"ìùõ¥æìÎEÿw—%ˆ  5-$$ƒ÷5€øë‰wÈ5-‚AÁ Á÷ †‡  ÷ ríP‡÷5Àë7Òë7ÊëwÈë÷íÈëÂë÷mÂëºë÷ ²ëwªëÅPõ�˜ëÅ Ä÷5€ë õ¥ ‰%ôU÷5fë õ¥ ‰ôUô•õ¥  õµ D&ô5÷ ¡‡±‡‰ü÷P.ëöfÄÄ5& 7 ë´“ffæ…÷ héÆe…õ  ô-øê6‚76îêŽ èÖ µ‡ÀPðU@7 Úê7 Øê÷5¸ê(õ¥ðE@w�0¼êô¥ðE@÷ ªê7�0¢ê ðU@ô­–ê0#‰÷ Šê$‰ Ám€ê÷5^êðE@¡‡7 j걇0$÷ º÷ð¥ ðµÁÿÁœ1ÁÁ p$‡8ÿ ñZ®ÿ ñ�D#ÿ üðÂê"00˜’1e1¶0eaek›’÷ ÔòCNVCLNÅØ÷ ’r‡Å ÷ ˆm‡Åtõ% (5 (÷ rb‡Åüõ-ò(5 (÷ \W‡Åh÷ RR‡ÂòÁP ÷ Ìó‡Â0òÂí2òÁ.òÁm&ò ÷ ´ó‡ÂÒñÁÐñ ÷ ¢ó‡À¨Á' Á ý*‰*5 B(  AÝ, ÷ vóò‡5 (5Š,C&   ÁÜ ÷ Róà‡3 3Šõ ÷ ²¡±‡÷ ØñCNVCLSÅØõ ÷ ˜ffæ…÷ ÆïÆe…õ `Å õ ÷ põE€÷ ´5 .ffæ…÷ �ïÆe…õ EÅõ•Åâõ  ffæ…÷ ŽïÆe…Åhõ ÷ õE€ffæ…÷ :ïÆe…õ Åtõ ÷ äõE€÷ (ffæ…÷ ïÆe…õ ‰¡±‡w�3 æ\ÿˆ‡ ÷ ´ðCNVDISÅPõ  ffæ…÷ ÒîÆe…õ %Åõ  ffæ…÷ ®îÆe…õ ÅÄõ  ffæ…÷ ŠîÆe…õ ‰¡±‡ÿ ÷ZRÿ ÷ÂL"÷ ð$CEXCIõ%Ðù¡‡÷ ZÁÊïÁmÊïÂÀïÂíÂï ÷ Lñ0‡AÁm²ï  ÷ :ñ)‡7žï÷m ï˜ïw–ï÷í–ï�ï7Žïõˆï"õ~ïõzïõ•ffæ…÷ äíÆe…õ•‰õ þ‡÷ ‚ï$CEXCO÷ È@AÂtõ%Àùõ%àýõ%ðýõ%àù¡‡÷•1�ÒP÷ ~÷•2Òi÷ n ÷•7oÒ÷ ^÷ æ÷ T‡÷5¶î$ÁÂîW @ƒÒWÁ@÷ ”†ÒeÒv+‰w(î7&î,‰÷e|îw vî÷åfî· `îõ‡÷5dîwØÿ÷5Xîw<– fÅtõ <õ•õ•õ•õ•0õî(õ� î,õ (õ•,÷ \ffæ…÷ jìÆe…õ r÷ 6ÅÄffæ…÷ dìÆe…õ aõw"ÅÄÄtôµ25uffæ…÷ DìÆe…>ôµ2ÃDÃxÁ ‚ÁÒW÷ t†ÒeÒv&fÀ ÁBÂr÷ žuõ ffæ…÷ æëÆe…�€5uffæ…÷ ÆëÆe…õ …w�þ¡…‡‰±û¦&f ¢ ‡¢~‚€ Á ÷�€B ‚‡ÂÿÿÈ•?óõ¥ $w âì†÷•3gÒ‹õ¥ w Æì÷•5MÒÏw ´ìƒ÷•6;Òñ÷•4/Ò®‡Record out of sequence%IDuplicate key where not allowed%IRecord too short for primary key%IRecord too long for bucketsize%IRecord doesn't fit fixed length%IRecord too long for maximum record size%IRecord contains an illegal data type%IException record: %I, truncated%I, non-printing%I000:&æ¦f&¦ v Þ €�‚ƒ„…‡÷ ŠëCNVCPYÅP÷ Ðffæ…÷ ²éÆe…õ  õ%°ýL÷ 2ûõ J÷eäêw Þê@AB"÷ ºÄ ô t ƒ÷5 Ìê,÷ ü ô¥ t ÷5(°ê÷ ÄÅ÷ lffæ…÷ 4éÆe…õ ÷ Rûõ  ÷ejêw dê¡‰× ±‡õ%€û‰ø‰öõjêõfêÁdêÀ\ê5"ŠÁ ý‡5uµ"‡÷5$êÄØÃ ô¥ ó¥€Ámê ó¥Àm êÁíê† ‡Ä &„DàC`Ó�ÖéÄ ü�‡Ä ‡ÿ ðð�D#ÿ èðÂ�"ÿ àðÂ"÷ ðCNVEOFÀ ÅP5&u(õÆïõÂïffæ…÷ BîÆe…õ%°ýõ ‰õ BC—¤à û÷eRïw LïÀmnïA Î)‰±‡„Bí¦ŠÎ¡ &f¶mN ¶öEþ÷zÂî·Äî·Àî·´î*‰ÂåÄå£ £ £ Ì‹Ä Â ò‚÷ öï†ö µ(µ&€õõèîffæ…÷ jíÆe…õ \A`Âà ŠÂåúffæ…÷ >íÆe…õ CÄØ  @í&� Aí(€îÃ~î¡  à ýÁ À-fî ƒ5%&õõ 5`&u ( õLîæ@îõm<î&u (ffæ…÷ ÄìÆe…õ €å� ‡Ó¡‡‰Ö ±ûÀå� &VP5&u(õôíõffæ…÷ pìÆe…õ  BD„`Ä ¡‡±‡‰ü00˜š1k1˜l1DATADATADATADATADATADATADATA÷ ðCNVIMGÀ ÅP5&u(õÆïõÂïffæ…÷ BîÆe…õ%°ý+õ *÷elïw fïBÅ5&u(õ|ïµffæ…÷ îÆe…õ  ÷e2ïw ,ïÀmJïA º¡‡‰±‡*** Block copies in %D unitsReading block %T--- %D bytes read*** Odd address trap*** Memory protection violation*** Breakpoint or T-bit trap?RMS-F-ER$LIB, Error mapping RMS resident library*** IOT instruction trap*** Reserved instruction trap*** Non-RSX EMT*** Your 11/40 FPU is acting up*** Call/Jump through address 0*** Stack limit exceeded&ÀT1Æe&Ài+&À¦—#äûÀ‰"&ÀØ&ÀñÖ &À&À&À_ ÷5âõ& & æiÿˆ&À?& & æiÿˆwÌõŲ •U•ÕÕ �Õe•�f¦Ñ‹þàÁ Âî 2 ræî ÿˆ‚�€ äûwòææÿˆØP 2¬hâütÄ%NRegisters:%N R0=%P R1=%P R2=%P R3=%P R4=%P R5=%P%N SP=%P PC=%P PS=%P%N%NTrace Control:%N T$CBIT=%P T$STAK=%P T$BASE=%P T$LAST=%P T$MODE=%P%N TR$REM=%P*%N%NRMS Structures: %P/ (FAB) SID=%P IFI=%P STS=%P STV=%P%N%18SFile=%VA %P/ (RAB) SID=%P ISI=%P STS=%P STV=%P%NMemory Control:%N GSABAS=%P GSAMIN=%P GSAREQ=%P GSAPLH=(%P,%P)%NPool Management (Detail): %P/ %P %P (%D. bytes)%NModule Trace: %P (%VA) R0=%P R1=%P R2=%P R3=%P R4=%P R5=%P%N%21SSP=%P EP=%P RA=%P DS=%P%NCurrent stack: %P/ %P %P %P %P %P %P %P %P *** Odd address in list, section terminated *** *** Stack value corrupt, resetting to 002000 *** *** Link to oblivion, section terminated ***÷ ææÿˆ÷ ÷ 2÷ J÷ ®÷ Â÷ ì÷ DìÀ² Á Â:Á ýÁv÷ v‡À¨ ÁÁ ýÒú ÁÅ÷ Z‡Á÷ PÀH"Á1"$ÁiÐ ÒÒÓ ÒÒÒ,üÿÊ"ÒEÿÒÄô‹"" �&÷ ö€Ó‡À` ÁÁ ýÁ“÷ Ú‡Á×÷ ÐÀîÀ52 &Áó÷ °€ð‡Á÷ ¢À4ñÀ5Ò ÒeÃe ÄÒÄ ý ÒÒ&Á÷ h€ã‡ÁŸ÷ Z‡Á÷ P‡Ám÷ F÷5øÔð÷-Îðàð‚ÁÓ÷ .÷¼ðÀÌðÀEÃà ýÁ~&÷ €7 ˜ðñ‡‡À Â:÷ wÖï÷ Îïæî ÿˆÂ:‡ÿ Ðò�D#Áe?ÁE? ‡& fŽ Ž Ž Ž Ž Ž æYÿˆ‡÷ ÖéCNVRXBfÍ%P õ¥   AÝÁe f f   AÝf B÷ ìꇅà…5 ¡‡Ö ±‡÷ zéCNVXABõ õ¥ ‡ Á  ÷ °ê†‡&È•ð• 0 5÷ üõ vf  Üð•f…5…Ä # ÁX ÷ ^ê`‡õ¥55È•ð•80 Áe8pð�ƒ Ä Þ€  Ü Á ÷ ê6‡õ¥55È•ð•0 ð�ƒ Ä ãA…€uÁ ÷ Âé‡÷ ˆ÷ õ  ÷5è÷ Ì¡‡€±‡ýüffæ…÷ RæÆe…õ%ˆù õ%Hùõ% þ‡f5 ffæ…÷ æÆe…µffæ…÷ æÆe…‡@(ð¥ 0Š0Š 0 0 0 îð¥ùf¦æÁeÂe"à ŠÃ üƒ‚�桇@ð¥ 0Š 0Š 0Š 0 0 ØÌ&Aæ!?æ!ÂÎÿÂeÂE ÷ ýæÚ!ÿˆ&ÀÞæâ!ÿˆ· Òÿ‡ ÁmÈÿ ‡ž¦ ʺÿà�bŠå‚‡Â Âw Xò ”Å¥ üÅ¥ ùÅå0B¡†€÷ >Aa”ôœÿÿ‡÷ ¼éGETSTR&f¦ Á ¢"D Ä ¢/¢=€ Á îÄ /&Ží¦6¶í€�m¢"W¨"Ž öå  �÷ žê ‡…�‚P” ý¡‚�€‡Ö Ö ±ø÷ éGETNUM&f¦¢#€ Á ÷ ÿ÷ þèGETOCT&f¦¢#€ Á ÷ îþÀ &Ží¶å6E— =— /—  ±¡‚�€‡W! ‡W! ‚÷ePè÷EJèwFèefw@èaw6è^W!]7“*è&f¦ A÷ Âé‚�€O‡LÅ L7èçwæçEÅ E7ÞçwÜç>Å >7ÆçwÄç7wèç45Å 3W!0&“&f¦ A÷ hé‚�€"‡ I÷ ¸ç00˜¢1e1¶0eaek›’ R÷ªç  S÷œç€ €Å 7†çw„硇±‡fÂEÿæÈûB`F‡÷ ~Î÷ .Îà÷ ò†Ó¥:÷ æ †Ó¥:@!÷ $Áèà Π @! ŠU`eãÈUU5ÄU€÷ þm†É¥[É¥<"Î@ ÷  †ÑÄË¥.÷ „† £ ÷ z‡Î0þQ £ÎUD’ÄeĤá„÷ ¨Ä_÷ ÖÄUÄ‹È5ÈE Î÷ lÎàÈU0 ÈE÷ pU5Î Ä.÷ ˜ †È5ÈE0 ÄU÷ LÄ. ÷ x‡Ä; ÷ n †ÄŠÄ-÷ bÄU÷ "ˆÖ …‡& N  †Ó¥"úÎ ùà  ‡U5CàƒÕM%‘Å ÄÑÄE¸ÿÄ Ä Ä AÍ5QÁ`C÷ „Á‡Ä_C& æ÷ p2†ö &Ä‹¥&Π˥A‚Ë¥Z†Ë¥a‚Ë¥z†Î Ë¥*Ë¥%Π˥$Ë¥_ Π˥0 ‚Ë¥9 ‡Ë¥7†Î ÁŽUƒ ÉÖ „– ‡ƒ  †ð‹�Ë‹øË¥ õË¥ ò±‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&f¦æ&f� ¡� &ADw&éõ¥õ¥{E$@& 7 éw�,þèw(úè 7òèó7 êè7œäèí÷ØèÚè ð J!p J!ƒÐ øÁ8·¾èwºèw¶è¾`!#%')+-/13÷ ˆ4÷ ¢1÷ ¤.÷ ¦+÷ €(÷ r%÷ œ"÷ ž÷  ÷ ¢÷ ¤÷ ¦÷ ¨÷ ª ÷ ¬ ÷ F÷ ¨÷ ªÈ ¦P Ð ú÷ ª& ’  ÷ ê‚ &f�”þÁe„  ÷ ðéá‡&f�€Âr÷ Æ·JìwHìæî ÿˆ÷5èÅhõ (Åâµuffæ…÷ �æÆe… �‚÷ Œé¯‡ �‚÷ €é©‡…„ƒ‚�€– f ¬I ¬WÁ¬FÁw 0çƒw*ç�‡ (2ù�ù úÀú`ûðû�ü ý ý0þÀþPÿðÿÿ ˜î�D#ÿ �î¢"ÿ ˆî¢Ž$ÿ €î´h$ÿ xî´"ÿ pîÆ"ÿ hîØ"ÿ `îê"ÿ Xîü"ÿ Pî"ÿ Hî "ÿ @î2"ÿ 8îD"ÿ 0îV"ÿ (îh"ÿ îz"ÿ îŒ"ÿ îž"ÿ î°" Âw €ï ”Å¥ üÅ¥ ùÅå0B¡†€÷ ^Aa”ôœÿÿ‡w NïÄ'Å  ÅUD$†BA÷ &�Â(÷ ÅU� ÀBQ÷ lÂЕ* ü‡÷ &÷ &÷ �’•’•€‡@Á(÷ ìf€  Àe ÀeÉÿÀe Àe ‡ABDEFIMNOPQRSTUXYZ<>Å"BaÊ$ep|v¢­$Ê®¶ÅÏJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw Nî&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ „þÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚bÂEÊ Ö ÌЕ%„Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ Î�à õ‡& æÎe°6& ¦æÎeœ/& æÎe þ*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎeb & ¦æÎeNЕ A‚¦Þ à ÷–%‡& æÎe"òA÷ äýà û‡Ð• à ü‡A÷ bE‡AÂ÷ †E‡Ð• Aæ÷ °ýAÎ ûÖ Â ÷ $Е.÷ ˜ýÂ÷ AЕ; ÷  Ã à‡Â ýð¥ ÿÿùÀ øw dìD…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w 4ìDÅ… ƒ÷ &Е.À À À ce÷ $À …Е:÷ Å ù Â÷ B‡æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w œë…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ „W ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡À"‡8"x"´"ç"#L#‘#Ó# $ ]$@?%R-F-TPM, Switch /TR or /PD or both required for this CONVERT?%R-F-ER$XTR, File string %VA contains extraneous charactersÀ"‡Àþ8"°þv" þµ"�þî"€þ#pþ`#`þ|#Pþ¶#@þð#8þ-$>?%R-F-ER$CHK, Bucket header check error; file %VA is corrupt??%R-F-ER$CLS, CLOSE file processor error on file %VA, code=%P9?%R-F-ER$COD, Invalid XAB present for file %VA, code=%P0?%R-F-ER$CRE, Error creating file %VA, code=%PB?%R-F-ER$CUR, Improper record context for operation for file %VA?%R-F-ER$DAC, Unused error:?%R-F-ER$DAN, Undefined data area reference for file %VA:?%R-F-ER$DEL, Referenced record was deleted for file %VA=?%R-F-ER$DEV, Bad or inappropriate device type for file %VA:?%R-F-ER$DFW, Deferred write error for file %VA, code=%PÀn$‡)€$*­$+è$, %-?%R-F-TNF, No EOF (Control/Z) found in file;%%R-I-EOE, EOF (Control/Z) established at VBN %T, byte %D!%%R-W-EXC, Exception record: %I%%R-I-REC, %VAÀ"‡ 8" {" ¥"Ê"#(#G#o#Ž#µ#C?%R-F-ILO, Illegal use of /KN, /KR, or /LO with file organization*?%R-F-RAM, Required argument missing %VA%?%R-F-ANA, Argument not allowed %VA7?%R-F-LSW, Illogical switch in context of command %VA'?%R-F-ISP, Illegal argument value %VA?%R-F-ISS, Invalid switch %VA(?%R-F-COR, Not enough memory available?%R-F-RCR, Release core error'?%R-F-IOR, I/O error on command inputF?%R-W-FQL, Output indexed file fill quantities will not be preservedÀ"‡8"h"¿"Ü"þ"##\#–#à# $0?%R-F-MDE, Command file nesting depth exceededW?%R-F-MLE, Block value of /ML switch exceeds limit or available memory for image copy?%R-F-CSE, Syntax error %VA"?%R-F-MMQ, Mismatched quotes %VA%?%R-F-UIF, Utility internal fault%N9?%R-F-ACE, Error accessing file %VA, directive error %P:?%R-F-APR, File %VA is not empty, /AP switch is requiredJ?%R-F-FTL, Fatal RMS error; PC=%P, STS=%P, STV=%P,%N file %VA-?%R-F-ISS, Illegal switch specified - '%VA'5?%R-F-IFL, Incorrect file organization for file %VAÀ"‡8" f"!§""Õ"##$O#%�#&º#'Ó#(û#.?%R-F-CSW, Conflicting switch specified- %VAA?%R-F-SSO, Illegal use of /EO with organiztion or record format.?%R-F-IKR, Invalid /KN or /KR argument value0%%R-I-IKY, Input key of reference is #%M (%VA)J?%R-F-VFC, Input and output fixed control header sizes do not correspond2?%R-F-IWF, Illegal use of /WF with record format9?%R-F-ONE, Output RELATIVE or INDEXED file is not empty%%R-I-ID, Version 2.004(?%R-F-ISP, Illegal argument value- %VA3?%R-F-ONA, Too many files specified for operation00˜²1e1¶0eaek›’À"‡�ù8"€ùT"pù�"`ùÇ"Pùü"@ù>#0ù}# ùµ#ùî#ù1$?%R-F-ER$STK, Unused error?%R-F-ER$SEQ, Record not in proper key sequence for file %VAC?%R-F-ER$SHR, Illegal file sharing options specified for file %VA7?%R-F-ER$SIZ, Invalid key size specified for file %VAÀ"‡Àú8"°ún" ú¨"�ú×"€ú#púE#`úw#Pú»#@úü#0ú7$6?%R-F-ER$RAT, Invalid record attributes for file %VA:?%R-F-ER$RBF, Invalid record buffer address for file %VA/?%R-F-ER$RER, Read error on file %VA, code=%P;?%R-F-ER$REX, Relative record already exists for file %VA3?%R-F-ER$RFA, Illegal RFA referenced for file %VA2?%R-F-ER$RFM, Illegal record format for file %VAD?%R-F-ER$RLK, Record locked by another stream or user for file %VAA?%R-F-ER$RMV, REMOVE file processor error for file %VA, code=%P;?%R-F-ER$RNF, Record does not exist for file %VA, code=%P8?%R-F-ER$RNL, Record not locked by stream for file %VAÀ"‡`û<"Pûo"@û®"0ûß" û#ûC#ûƒ#û¾#ðúû#àú*$ÐúV$3?%R-F-ER$NPK, No primary key defined for file %VA??%R-F-ER$OPN, OPEN file processor error for file %VA, code=%P1?%R-F-ER$ORD, Illegal XAB ordering for file %VA1?%R-F-ER$ORG, Illegal organization for file %VA3?%R-F-ER$PLG, Error reading prologue for file %VA@?%R-F-ER$PLV, File prologue version for file %VA not supported;?%R-F-ER$POS, Key position not within record for file %VA=?%R-F-ER$PRM, Illegal date information present for file %VA/?%R-F-ER$PRV, Privilege violation on file %VA,?%R-F-ER$RAB, Not a valid RAB for file %VA?%R-F-ER$LCH, Invalid logical channel specified dor file %VA9?%R-F-ER$LEX, File extension not necessary for file %VA8?%R-F-ER$LOC, Invalid placement specified for file %VA>?%R-F-ER$MEM, String buffer spans memory limits for file %VA?%R-F-ER$MAP, Unused error@?%R-F-ER$MKD, ERASE file processor error for file %VA, code=%PF?%R-F-ER$MRN, Maximum record number invalid or exceeded for file %VAB?%R-F-ER$MRS, Illegal maximum record size specified for file %VA?%R-F-ER$ATW, Error writing attributes for file %VA, code=%P/?%R-F-ER$BKS, Illegal bucketsize for file %VA4?%R-F-ER$BKZ, Illegal area bucketsize for file %VA?%R-F-ER$BLN, Unused error7?%R-F-ER$BOF, Beginning-of-file detected for file %VA8?%R-F-ER$BPA, Illegal buffer pool address for file %VA5?%R-F-ER$BPS, Illegal buffer pool size for file %VA;?%R-F-ER$BUG, Internal RMS-11 error detected for file %VA;?%R-F-ER$CCR, Multistream access not allowed for file %VA@?%R-F-ER$CHG, Illegal record key change attempted for file %VAÀ"‡ðÿ8"àÿT"Ðÿ…"Àÿ¾"°ÿê" ÿ#�ÿX#€ÿ”#pÿÉ#`ÿå#?%R-F-ER$ABO, Unused error1?%R-F-ER$ACC, Access error on file %VA, code=%P9?%R-F-ER$ACT, Activity precludes operation for file %VA,?%R-F-ER$AID, Invalid area ID for file %VA4?%R-F-ER$ALN, Alignment options error for file %VA:?%R-F-ER$ALQ, Allocation quantity too large for file %VA?%R-F-ER$ATR, Error reading attributes for file %VA, code=%P÷ çCCNMA$&f¦æ¡C&  Áx÷ Rè‡3s�3Š¡ƒ‚�€‡÷ ÜæCCNMD$&f¦æ¡C&    ÁÜ÷ è‡3 3Šƒ‚�€‡÷ ˜æCCNMT$&f¦æC&  ÁÜÁeÁEBæN`  ÁÜÀ@`€ã³�‚ ÷ ¦ç‡ƒ‚�€‡÷ >æCCNME$&f@&wnå7 hå7œbåw�,Zåw(Vå�€‡|³–,?1?1€ÅU›r[qÀÀÿÿ$U¸400™Ê1k1˜l1DATADATADATADATADATADATADATASYSYSYSYTICLSYOV¢NÀÅÎ(k(kð¸Ô¢À^.  ,˜,˜,˜,˜V,j,,˜,˜ •?1Å€Dp1ÀÀŒÕ ÅÎNÀ€Ô@€ÅÎÁe?ÁE? ‡& fŽ Ž Ž Ž Ž Ž æYÿˆ‡€–˜Ài*Éw œf¦ÆåƒÃeÀþ‚÷ ˜ö5tƒ‚Ãe˜þB ÂeÀÁ±:÷ âà à æÁ @ Á @ CÀÁ±:÷ ÄÎ`ÁUCÀÁµ÷ ®B‚ ‚ ‚ Àd�÷ VÁ`ÁeÝfÄ€Á�÷ @Á  €Ád÷ .Á €Á÷ Á  — ;ƒa @œØ€ ƒà� W ÷f÷ °Ð•-�Á �eÁe´P”P”P”Е-�Â÷ 2Е ö50�ÁeƒÆåÀö‚÷ Šƒ‚–%ÀÁ<÷ æfÁ<÷ ÜfÁ÷ Ò@÷ (Õ•:€÷ €ö5Õ•:÷ @Æe‚�‡Á ÷ VÀe0Áe0�U�‡&@�Â÷ –Ž €%œÿÿð•0þÿ‡÷ ææA…UUUUÄ    ÄT T T T Áee(e(e(e(‚ÄTä” ” Œ $)TäŒ ´ TäŒ Tä±…U U U U Î ÙÖ ‡&fæ!  E D  ‚E ‚Eà„ à±C B ΊñÖ A…„‡÷ Bæ@„    Àe à ± û‡„T T T T H1C„ÔdT T L $)ÔdL t ÔdL Ôd¡Î æÖ ‡JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC&æ  †€mÎ ù–%‡VPVP¦ÐÉÿSY:CMI.CMDCMIÿä â „ >P"@ʪ-P 0ÿ1ÿ&ð ú P¤4P/ÿw ÞÄ'Å  ÅUD$†BA÷ ð&�Â(÷ ÅU� ÀBQ÷ `ÂЕ* ü‡Â Âw ~ ”Å¥ üÅ¥ ùÅå0B¡†€÷ „Aa”ôœÿÿ‡÷ &÷ &÷ �’•’•€‡@Á(÷ hf€  Àe ÀeÉÿÀe Àe ‡æ<w. &æ¦f&¦ v Þ €�‚ƒ„…‡TI0:RMSDSP.LIS&f¦�ÀÈ ÷ ì‚�€‡Àåˆ ffÅTõ õˆ 5ffæ…÷ âýÆe…Áˆ À Áf € & & & æ &f& & & Εæææ ÿˆ…�Àˆ ‡÷ ü÷5(ü&÷ |ÿ€Àåˆ fÁˆ À Áf € & & & æ &f& & & Εæææ ÿˆ�Àˆ ‡&f¦÷ Îwìÿ‚�€‡÷ àÿ÷ àÿÁ ‡Â wt&f¦÷ ®1†�Áe?� � � � � � w¬ÿw ¦ÿ‚Á ÿ& fæYÿˆ†w ’ÿƒÁŒÿô±€Á Á Á Á Á Á Ânÿw`jÿ÷ ‚ÿ‚�€½– –5‡Ô(1A ? 00™Ò1É1¶0eaek›’SY:*.*;SY:ÂÈúÂeÂE ÷ Šðæ ÿˆ&ÀÐíæ ÿˆ· Ìú‡ ÁmÂú ‡ž¦ Ê´úà�bŠå‚‡ABDEFIMNOPQRSTUXYZ<>ÉØâô=öMXd^Œ•öêžèò)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw ¼ && D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ ôõÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚b‚ ‡AÂ Ê Ö ÊЕ%„Ì¥Vå ‡P”à ý‡Ð• B”f�‚÷ Î�à õ‡& æÎe°B& ¦æÎeœ;& æÎeõ6H”ÈÅ€¢ ¢È• € à ò‡÷ nŠ€‡Ð• à ü‡Ð‹à üÀ ‡Ð• Е à ú‡& æÎeL & ¦æÎe8Е A‚¦Þ à ÷–%‡& æÎe óA÷ õà û‡Ð• à ü‡Ð• Aæ÷ øôAÎ ûÖ Â ÷ $Е.÷ àôÂ÷ AЕ; ÷  à à‡Â ýð¥ ÿÿùÀ øAá ÷ &E‡Aá Â÷ HE‡Á ¦¶6D‡w ÒD…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w ¢DÅ… ƒ÷ &Е.À À À ce÷ ºÀ …Е:÷ Å ù Â÷ ØB‡ÁÉ ÷à–÷lØw”„4 ô€÷r¸´‡C3 3 ó€ó €É,Ä, ÍUóE€s3w$æðl�¦æ&fÃÊÑ BÀ˜þ… *ƒÅ Í‹'Â% Í¥!‡Í¥EÀàúÂ%,‡À€ý… ƒÅ K‹Œ†‹ŒÀ5 ‚‡õ¥  õ¥PBÄ2Ì þÂ%pÀÐÿË‹ñó5Jó³ J€÷ àþó J÷ …„ƒ‚�€‡@ºÿµ ºÿõÅüÿ´ÿEÍ¥ó‚A�î†A� êƒÁ I& æTIææÿˆ& æTIææÿˆ÷ dÀþð.Âð•ÿÄðôðbö÷ $*‡&øú÷ C€ÅÊ#²#Á7 $ó7 ó7 °ò÷ ú†÷ ¦ò÷ùÿžò÷žò7œò÷ ðÀþ÷ ÈÃ÷ 0À†æ†òæÿˆ÷5Þò÷ ¦÷5 Òò÷ ¶÷ ¬÷ „©¬òöÿ¬òÿÿ¬òûÿ¬òüÿ¬òýÿ!¬òþÿ&÷õÿò÷ x× ±‡ÅeõÐùÅeõöÿ÷ Vî÷óÿðñ÷ JèÅeXõôÿ÷ 8ßÅeXõ÷ÿ÷ &Ö& & & æ ætæh& & & Εæææ ÿˆ‡ÀŠñ÷ ,ó7 €ñÀzñ7rñ÷ ó÷‡ DSP>%DSP-I-ID, RMSDSP Version 2.101 (February, 1984) Copyright (c) 1983, 1984, Digital Equipment Corporation×'&ÿÿæ1ÿˆ‡ÿ <B Àÿ 4œðÿ ,®( ÿ $®b"ÿ ®| ÿ Àôÿ Ò( ÿ ,¨*¦Þ5Îe‡w ¦Á,… Bv ù    ù ‡‚Ê5ôùB‡w¶ù ꄦÊ5‚ú‚‡ò û¦¦‚ Ž (Ê5(ÊUW¬ ‡Ä ò ƒ Ä ó  €ææwÿˆóE€Ê5 ÛÊE Ž‚ØÖ ‚ÇW¬ ͇Ê5 ÊÄ È„,ÅÊE é0ìL’@ßî&w þÊEò ÊU ‡æ&W¬ )‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w 8…�ŠÂ‚ †Á € Е-Âå   ŠƒÐŠÂÕ0@A÷ DW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡w  ÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w \  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡&æf…Þ ƒ„…‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡&æ¦ff… Þ �‚ƒ„…‡›r[q›r[qÔ(æˆv 00™Ú1k1˜l1DATADATADATADATADATADATADATAÜàäèÆŒ’F€ˆˆ‡àÀB0›r˜ÆðÀ@T0xIqäM ðà@BfIqÿM´ðà@BTIqÿMÈðÀ0BU(UÜ ðœ,1ul†�ðŠ®ð3�ðÌŠÀE,�ðôŠÒ:d�ð0䊜qQ� #´Òö � #0Ò« � #ˆÒ» $� #ŒÒä¡E'�¨*h>t""(�+L,Pe†*�+,b�r.�+È,>�s1�(1ŠU,BˆL’ˆ.’’’’’ÊÀ‚à‚à‚À€À" & & & & ¦f& & & Εæææ ÿˆê‡: šÔ ¤x!UÍ!^+#Ç RMS-11 Version 2.100 Display Utility Purpose: To display one of the following: 1. The attributes of a sequential, relative, or indexed file 2. The attributes of a disk-based backup file created by RMSBCK 3. The names and attributes of files stored within a tape-based backup container file Command syntax: [outfile[/option(s)]]=infile[/option(s)][,infile[/option(s)]] Options: /APpend - append output to an existing file /BP - process input files as container files created by RMSBCK /BRief - produce output in BRIEF format /FUll - produce output including area and key information (indexed files only) /SUpercede - supercede the existing output file File specifications are in standard format: device:[directory]filename.type;version Wildcard characters such as '*' or '%' are valid in the directory, filename, type, and/or version fields æ,wÜõæ0wÔõæwÌõæHwÄõæ8w¼õæw´õæw¬õ&¦æ&  Á ÈÅ€¢ ‚Ä ЋÁ ô¢"D ¢a‡¢z‚ÈÅ ”ƒ Á ãÁ„ƒ‚€‡w zü0 ø0ú0ð‹ü÷ ȇpúpM÷ $†w`ðµ€ówð \ ðµ ó÷ î‡÷ .ð%°ýwÀðµŠ0ö"0ô Áep"ð ÷ Žèð lìp0÷ àþð•ð *" °`øÂ Dðµó ¦�`W¨aW¢zÉÅ Â ö‚0,úw´É¥;ðµó&wöþwöð¥Ðùæûÿð%°ý7œü Ä ðµ€ó÷ Hwÿ÷ ˜ðÅ€óðŠüæöÿ& ðµ ó ðÅ óðÕ€óð•ÿÿüðµó &^&`÷ €°`°^°“òV ‡æÿÿÞæþÿÛæýÿ׿üÿÔðµó�`W¨-ð‹ó€ðÅ€óðÕ óÂ ð ø°`w4þwrÿw ”úð‹ü³ðŠüðåþù°Šü÷ €§É¥@Ñðµó 0¬üýÆ�  p€°�„°ø° ø÷ Øðµ@ó ðÕ@óðå‚ð• …÷ ð ^ �0 ø00úwÔý&^&`÷ °`°^wÿ÷ TþðåþðŠüõµ€ó-0®0 °0™°0™Š0´0¶0¸ðUj0Š„÷ ˆ‡000ð•ðµŠð•0ð%°ý‡Ö Àw vùð \"°ŠüþðµŠ÷ hü¸¶´œŠœ°®0þ÷ Œ‡U%ð  ÜÄÃeÃEÆà°Â÷ 4Æ`0 Â÷ (e)ðEj0`0^�÷ àûð ¡±‡0Šnð5j÷ êûð ^�ðµŠðÕh÷ ²ûðÅh÷ ¾û‡U%÷ Žûe)‡0ŠüÉ)fÿˆ‡Ñ Â&÷ 2‡× /×  ×  ô÷  ‡×  ú×  ÷R¨ðÕ€ó¡‡ÂåC”‡7 P&f¦w:÷‹6÷ Æ7 .7,À0È @•,€ÀåÀÿq `-KacJE[à !ÃmðÄíì@•Á †Õ Á ûα)÷ L÷ R†é  çà å÷¸7•¸à f@• †Õ †&Ý €…Ò€Ö À5]U ¦†E¤¯‚…€Áv‡ :Áj‚æ&@E÷ ÿA ·VÎà·N ̆ª ÷ Š÷ Р¢ÂÀEÿ÷ vœÀEÀÿÀ €cÁ¤‘Á ü¢ÿ­÷‹‰÷­ÿ¦†„÷ @�Á à £.„ à · àæ&fÅØÄÒÃ@#Á ÷ ¼÷ À…„ƒ¶à ÷ 8 †À ÷ "†À £.£$· �„ à ë÷ †‡Ì¥Z‡£A‡Ì¥9‡£0 ‡ à £ £ ‚ „ à ö‡f¦Á00™â1É1¶0eaek›’PèÁeÁEÁeÀÈ  ÷ nê‡0 pð.è7 (èð"èÁèÂeæèR”Î ýÖ ‚�‡÷5è÷øÿŒçÎe÷U€îç‡÷5äç÷øÿrçÎe÷UÒç‡÷5Êç÷øÿXçÎe÷U¸ç‡÷5°ç÷øÿ>çÎe÷Užç‡÷5‚˜ç÷øÿ$çÎe÷U†ç‡÷5~ç÷øÿ çÎe÷Ulç‡÷\\ç7 Zç7 Xç‡÷ Pç ÷FHç÷DçDç÷í<ç>çÎe‡÷ –æ÷ Öþ7¶æ‡÷ ˆæ÷ ÈþÁÌ ñ Aú1‡IDENTIFICATIONÿVERSIONÿBACKUPÿBPÿBRIEFÿFULLÿIDENTIFICATIONÿVERSIONÿAPPENDÿIDENTIFICATIONÿSUPERCEDEÿVERSIONÿF#U#]#d#g#m#r#�#‰#�#Ÿ#©#ÆÊ#È%È$Ê#È$ #è#ÊÀ€È…$î#,#è#ÈÐ$î#ʆ#È�$Èø$$À€=„/€€Â"�†Â"À‚Ü"È€$*$À€Èš$8$Ⱥ$8$À€*8$%8$.T$;p$Ò8$Ô8$À„z$*T$%T$.p$;p$ÒT$ÔT$À„z$*z$Ôp$À€À†ì"_€$Ò€$†$_†$:Ò†$Ô„†$[€%œ$*œ$Ôœ$,€%ª$*ª$Ôª$]„[€%¼$*¼$Ò¼$Ô¼$]„/„Ô$‚Z"ƒZ"„t"…Ž"†Â"‡†Â"/„ü$ˆ@"‰Â"Ѝ"‹†Â"?(%H€E€L€Ê F P€Êœ F w Æ÷Á w ¼÷Á& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡æ,wÜõæ0wÔõæwÌõæ4wÄõæw¼õæw´õæ w¬õÅõEÀ˜é & æTIææÿˆ@Áeu(5œ,÷5æéõU÷5€Øéffæ…÷ ’ÿÆe…õúÿ ffæ…÷ fÿÆe…õýÿ÷ n‡ÅTffæ…÷ :ÿÆe…÷ P‡÷ 2ÅTffæ…÷ (ÿÆe…Åffæ…÷ øþÆe…‡Å ÷ÄèÆèÄÂè‡7¶èÀe5(5�,7éõ5 ffæ…÷ ÒþÆe…õüÿ÷ ÂÙ‡7 vè7 |è×-xèÑÅ 5 ffæ…÷ ¢þÆe…õ%lû[õòÿ÷ ‚ †õ%ðúµ÷5æ±Û÷e"è÷5Žè6÷5†è2êÀ ÁÜÅTõ 5uffæ…÷ °çÆe…÷ >‡²& & & æ f&& & & Εæææ ÿˆž÷ „õþÿ÷ æ!‡÷5 è÷ À÷ Œçw¾þõûÿ÷ Âw°þ÷ ª÷5àçõ¥ ÷ †÷ šÅ ffæ…÷ hýÆe…wÎþÅffæ…÷ LýÆe…‡õÊõ•÷5†çõ•"ffæ…÷ <ýÆe…õEõ õ¥"õ•"è‡ÿ D÷äF#ÿ <÷ö.#ÿ 4÷ #ÿ ,÷€#ÿ $÷,¨*æ$w¬ò‡÷5øæûÅ õµ2‡÷ FæÀˆ ÷ *èÄú Ýè Ä(#Á 1´�ffæ…÷ ŒÿÆe…÷ Àˆ ÷ ìç‚ Ã ë‡÷ ôå·’æÁ $÷ Ô÷ ÐçÀH  �Ð ÐÑ%Á²$÷ ¸÷ ´çÀH ÐX 0 0 ôµ Ðê$ÐÑ%ÁÄ$÷ ‚÷ ~çôµ:ÀH ôµ-ÿÿ Ð%ÐX 7æ7æÐ<%ôµÐe%íôµÐƒ%æÐ¡%ôµ о%Á%÷ ÷ ç‡Àˆ ÂH ÷ Hî‡ Area number %D: Bucket size=%D%I Allocation remaining=%T, Extend=%D%I, Contiguous at creation Alignment (at creation) %Iwas on a cylinder boundary%Iwas on any available cylinder boundary%Iwas by logical block number%Iwas by virtual block number%INear file with ID=(%O,%O,%O), abort on failureæhælw¦ò÷ p6‡ÅZffæ…÷ ²üÆe…÷ †Àˆ ÷ :èÂH ÊÝMäòFäÁð&÷ vï÷ è÷ è÷ ·÷ ®÷5¼æ÷÷5´æó÷ >÷ ¸÷ Pì‡Å õ¥õ¥ õµ 2õ%.¡‡÷ðÿ æ÷ tù7 þå÷µ \ã÷ðå&f¦ÁÁmâå ÀÈ ÷ vè‡5u‚�€Þ &f¦ABÀÈ ÷ Nè‚�€‡ÂH J2Á'Àˆ ÷  î÷5øå@ÂH Ê(RàÒN ÒR - ŒŽZ\fhbdÁ'ÂH ÷ PîÂH Êåˆ Êe7ÊÁ!'÷ 2îÁel-Áe ÷ 8Þ÷ Àæ‡ÂH Òeš Òe˜œÁÀæ&Ð  ü‡þÿùÒI'Á óâ ÒM'Àˆ Á%'ÂH ÷ ÊíÂH Ê7JàÁ!'÷ ¸í Áe€÷ ÊÝÂH ~ÁO'÷ ší÷ Bæ‡^ÀEÿÂH Ê}'  ʈ' Ê‘'  Êß'Ò ^ÀEðÿÊ™'À¥Ê£'À¥Ê©'À¥ ʲ'À¥ÊÎ'À¥Êß'Ò À¥ô5ZÒÕ'Òé'ÁU'Àˆ ÂH ÷ þì÷ ¦å‡ÂH ô5€\Òñ'ô5ZÒ(Ò5(ô5ZÒ"( ô5ZÒ(Ò(Òé'Áê'Àˆ ÂH ÷ ¢ì÷ Jå‡Ä ffæ…÷ ÄüÆe…õñÿõ%°ý9÷ Ôê‡ôµ 2DfÎíNã-Ý-ÙÄm<ãDÄm4ãÁeW$BAÍW$CKÊW$UPÇÁeøW(ABÂW(KC¿W(PU¼Àe ЋÁ × ±‡9'='A'E'Contents of container file: %VA %VA%VS%T./%T.00™ê1k1˜l1DATADATADATADATADATADATADATA%VS%10S[%B,%B] [%IR%IW%IE%ID%I,%I] (%M)%10SOrganization=%I, Record_format=%I%ISequentialRelativeIndexedUndefinedFixedVariableVariable_with_fixed_controlStream (RSTS/E)(Unknown)%10S%IContiguous, %IDecimalNo_version (RSTS/E)OctalUnknown (Pre-V2.0)Version_number=%Iÿ ôñ,¨*÷ ‚æÀˆ ÷ fèÀH Áª HœÐ PHœÐ PÁ Hœ,Ð P(Áúñ Å õ¥Ð¢'È1ìúÿÐ €ðþÿPЧ*Áœ'÷ Ú÷ ðçÅ õµ#2÷ ÷ Š÷ æ‡÷ æåÀ ÂH ÒX ÷ *Ò\ 2 2 Á½'÷ �&Àåˆ ÷Tæ7àPæ€÷ 4ÁÑ'÷ vÁØÂ ÷ ôÞ÷ |çÀðÂH ÒX ÒY 2 2Ü 2Ü ÁÞ'÷ :&Àåˆ ÷þå7àúå€÷ ÞÁò'÷ ÁÐCæÎTÎTÖTÁ)(÷ rî ÷ ˆÞ×-LãƒÁÿ'÷@ã¸å÷ è÷ úæÂH Àª7 ¢å7žå7šåÁ(÷ ¾&Àåˆ ÷‚å7à~å€÷ bÁ(÷ ¤÷ ãÁà ÷ ÞÁ)(÷ ˆ÷ šæ‡ð¥2 2 2"2$ô &òå² ‡÷ å€÷ å‡÷ bäÂH ĬâÃŒ(Ë Ò÷     öÒ§*Á:(÷ ÷ æ‡Ä5Ò{(Ä5Ò(Ä5Òƒ(Ä5Ò‡(‡÷ äÀ ÷ ðµ2÷ ’÷ ð÷ `‡÷ àãÁ–(  ÜÃEüÃ%÷®(fä.Ã%÷¹(Xä, ÿÿ,"ÿ÷ß(Dä ÷Ä(<ä7 <ä7"4ä÷N ,ä÷) äÅú7 äwÝä7 äwÝ ä÷ 4÷ Jå‡÷ XãÂH Á+)ðµ 2Ò|).ÒA)ÒV 2 2 ð‹1Ò\) œ1Ò‹ð5€Òo)Ò§*÷ Ò÷ èä‡÷ öâÂH  ÜÃEðÿÒ­)&Ã%Ò·)Ã%ÒÔ)÷ ¢Ò§*Ã% Ò* œ0Ò‹÷ †Ò§*Ò&*÷ xÒ§*Á™)÷ ^÷ tä‡÷ ‚âÁ/* ÜÃEðÿà ÷G* ãÃ%÷N*þâÃ%÷i*ðâ Ã%÷{*ââ÷�*Úâ÷ ÷ ä‡Àˆ ÂH ÷ bë‡ð Òæ)Òù)‡%VA%I%VSRMS Prologue Version=%D Size: %T./%T.%VSCreated: Owner: [%B,%B]%VSRevised: (%O) File ID: (%O,%O,%O)%VSExpires: File protection: %ISystem:%I, Owner:%I, Group:%I, World:%IR%IW%IE%ID%IP(Z(e(p( File organization: %ISequentialRelative%I, maximum record number=%T, no maximum record number definedIndexed, using %M key(s) with %M area(s) File attributes: %IAllocation=%T, Extend=%M%I, Bucket size=%M%I, ContiguousMagnetic tape, Block_size=%D Record format: %IUndefinedFixed length %M byte recordsVariable length%I, maximum %M bytes, no maximum defined%IVFC, %M byte header%IStream%I Record attributes: %INone Fortran carriage control Carriage return Print file format Non-spanned (blocked) æ$w¬ò8`#÷ "æÀú Ü  Ä(#2ô�f¦æ…÷ rÿÆe…÷ Àˆ ÷ Òçƒ Á ë‡÷ Úå÷w&væô‹÷„&jæ7 hæ7�bæÁr&÷ †÷ žçÀH ÷‹dÿÐÐÁ&Á€#Á W¢ üÉ‹úÁå`#� PÐ`#6Á�&÷ F÷ ^çÁÐ&÷ :÷ Rç÷ @÷ ÈÁâ&÷ &÷ >çÁ'÷ ÷ 2ç÷ úÁE'÷ ÷ "ç÷ *‡Àˆ ÂH ÷ dî‡ÀH  ÝW ÐÐK(4W ÐÐQ(Ð.W ÐÐQ(Ð$W ÐÐW(ÐW ÐÐW(ÐW ÐÐ^(ÐÐl( �5Ћ‡ ÝÁ5Ð Ðs(Ð Ð}(Á5РЊ(РД(Á5О( � Ȩ(‡ÂeÃe"  Ý4& ÀH �Ž � ÈÔ¦fÁ'÷ èþ÷ æ�‚Á íÖ ‡ÀH  � Ð ôµÐs'Ш(ÁX'÷ ´þ÷ Ìå7� |äÁ…'÷ ¢þ÷ ºåÀH  �2ЋÁ�'÷ †þ÷ žå7� NäÁ¿'÷ tþ÷ ŒåÀH  �3ЋÁ�'÷ Xþ÷ påÁØ'÷ Lþ÷ dåÀH ÐL  �Ћ,*Áñ'÷ (þ÷ @å÷J ðã70ìã7.èãÁ(÷ þ÷ "å‡ %IPrimary key:Alternate key number %D: Name=%VA, Minimum record length=%D Key information: Type=%VA, Length=%D, %VA, %VA%I Position(s) and size(s): Segment=%D, position=%D, length=%M Area information: Index: Area number=%D%I, not initialized Lowest level area=%D Bucket size=%D, Fill factor=%D Data: Area number=%D Allocation information: Root virtual block number=%T, Root level=%D First data bucket virtual block number=%TStringBinaryIntegerPacked_decimalUnknownDuplicatesNo duplicatesChangeableNo changes, Null=%O 00™ò1É1¶0eaek›’7 0ß÷ *ßõ €÷ êÞwß5 ÷ ,†÷ .†÷ 07 þÞ÷ß±‡7 ðÞ¡‡÷ ´Þ÷ ðÿ Dï>+ÿ <ïP+ÿ 4ïb+Ä.Ì 7%¾ÞÔ ùÀˆ Á¼+ÂH Òe÷ .÷ ¨ç÷ Àà̵€  ÂH ʈÞÁÆ+Àˆ ÷ ˆç÷  à× ±‡ ̵J�,Ò R(C&̵ÊœòÒ Ò̵ÊœóÒ Ò̵Ò,ÞÊ*ÞÂH ‡?DSP-F-%I?DSP-F-UNKERR, Unknown error code %P„OPNINP, Error opening %VA as input‚CREOUT, Error opening %VA as output�PARERR, File specification %VA in errorNOFILE, No files matching %VA‚APPERR, Error opening %VA for appendSYNTAX, Syntax error "%VA"CONOPT, Conflicting option "%VA"‚CMDOPE, Error opening %VA for command input‚CMDGET, Error reading command from %VAGCMLER, Command processor errorDEPEXC, Command file depth of 4 exceededGCMFIL, Error in command file name %VA„WCDERR, Wildcard processing error %VA„READER, Error reading backup file %VANOTBAC, File %VA is not a backup fileþÿì+ýÿ,üÿ5,ûÿ^,úÿ},ùÿ£,øÿ¿,÷ÿá,öÿ-õÿ6-óÿW-ôÿ�-òÿ©-ñÿÐ-ðÿ÷-Ä€0Ì 5%Ô ùÀˆ Át+ÂH Êe÷ ®ç÷ Æà7“šÞ÷E€ÿ”Þ̵€ÂH JrÁ�+Àˆ ÷ |ç÷ ”à× ±‡-RMS-E-ER$%I-RMS-E-ER$???, Unknown error: STS=%P, STV=%P�ACC, Access errorANI, Not ANSI "D" format�ATR, Attribute read error�ATW, Attribute write errorBKS, Bucket size too largeBUG, Internal RMS error condition detectedCHK, Bucket header corruptedCRE, Could not create fileDEV, Bad device or inappropriate device typeDIR, Error in directory nameDME, Dynamic memory exhaustedDNF, Directory not foundDNR, Device not ready�ENT, Enter function failedENV, Required RMS support not present�EXT, File extend failureFEX, File already existsFID, Invalid file-IDFLK, File is locked by other user�FND, Find function failedFNF, File not foundFNM, Error in file nameFUL, Device or file fullLBL, Not ANSI labeled tape�OPN, Open function failedORG, Invalid file organizationPLG, Error in file's prologuePLV, File prologue version level unsupportedPRV, Privilege violationRAT, Illegal record attributes�RER, File read errorRFM, Invalid record format�RPL, Error while reading prologueRTB, Record too big for user's bufferƒSYS, System directive errorTYP, Error in file typeVER, Error in version numberWCD, Wild-card encountered where not allowed�WER, File write errorWLK, Device is write-lockedXTR, Extraneous field in file specificationàÿ®+�ÿÁ+`ÿÛ+Pÿö+@ÿ,ðþ.,ÀþZ,�þx,@þ”,0þÂ, þà,þÿ,þ-Ðý0-ÀýL-�ýs-`ý�-Xÿ§-@ý½-0ýà- ýû-ý.ðü).üC.Pû_.0ûz. ûš.û¹.ðúç.Àú/ ú!/pú7/úS/Ðùv/€ù�/`ùº/0ùÓ/ùñ/ù0ù60àøS0ÄR/Ì 5%Ô ùÂH ÁH+Àˆ ÷ ²ç÷ Êà‡ÂH JÁU+ò-RSX-E-IE.%I-RSX-E-IE.???, Unknown code %PVER, Parity error on deviceEOV, End-of-volume detectedWLK, Write attempt on locked unitABO, Request terminatedRSU, Shareable resource in useBYT, Odd byte count of virtual addressBLK, Logical Block Number too largeNOD, System dynamic memoryIFU, Index file fullLCK, Locked from read/write accessHFU, File header fullWAC, Accessed for writeCKS, File header checksum failureRER, File processor device re00™ú1šü1l1DATADATADATADATADATADATADATAad errorWER, File processor device write errorSNC, File ID, file number checkSOC, File ID, sequence number checkCLO, File was not properly closedNBK, File exceeds space allocated, no blocksBDR, Bad directory fileRNM, Cannot rename old file systemBBE, Bad block on deviceFHE, Fatal hardware error on deviceNFI, File ID was not specifiedEOT, End-of-tape detectedBHD, Bad file headerOFL, Device is off lineBCC, Block check, CRC, or framing errorNDR, No dynamic space availableBTF, Bad tape formatALC, Allocation failureULK, Unlock errorWCK, Write check failureüÿt+õÿ�+ôÿ¬+ñÿÎ+ïÿæ+íÿ,ìÿ,,éÿP,çÿk,åÿ€,äÿ£,ãÿ¹,âÿÑ,àÿó,ßÿ-Ýÿ@-Ýÿ`-Úÿ„-×ÿ¦-ÎÿÓ-Íÿë-Èÿ.Åÿ'.ÄÿK.Âÿj.Àÿ„.¿ÿ™.¾ÿ±.¸ÿÙ.´ÿù.¬ÿ/«ÿ&/ªÿ8/|³Î–,MMÏ6U›r[qÀÀÿÿ$UNSYSYSYSYTICLSYOV¢NÀÅÎ(d(døÔ¢À^à&F3 ÅÎNÀÅÎÔDM €Æå‚¦& & æAÿˆ‚      ÀÌÿ·ÎÿàÂE— ‡7ºÿ ˆ¡‡fÀØ÷ �%†�±‡�¡‡fø�Áe?� � � � � � & fæYÿˆ†�±‡Á Á Á Á Á Á Âdÿw``ÿÀØ÷ ú$�¡‡ÀØwì$7 ø&f¦wâ÷‹Þ÷ Æ7 Ö7ÔÀØÈ @•,€ÀåÀÿq `-KacJE[à !Ãm˜Äí”@•Á †Õ Á ûα)÷ L÷ R†é  çà å÷`7•`à f@• †Õ †&Ý €…Ò€Ö À5]U ¦†E¤¯‚…€Á‡ :Á‚æ&@E÷ ÿA ·þÎà·ö ̆ª ÷ Š÷ Р¢ÂÀEÿ÷ vœÀEÀÿÀ €cÁÆÂĤ‘Á ü¢ÿ­÷‹¯‰÷­ª§¦†„÷ @�Á à £.„ à · ˆæ&fÅ€ÄzÊÁ ÷ $÷ $…„ƒ¶à ÷ 8 †À ÷ "†À £.£$· 8„ à ë÷ .‡Ì¥Z‡£A‡Ì¥9‡£0 ‡ à £ £ ‚ „ à ö‡„ÔPÔP$NGÿSY:CMI.CMDCMIÿˆŒP >00š2É1¶0eaek›’üÿþÿþÿýÿýÿüÿûÿûÿÿÿúÿTI:PÎPÒPPŒr Àñÿ×­úÀØÿÀðÿ÷Î"‚ý÷Ž#zýf¦& À À Àmjý÷  € ìÿ çÿ   ïÿ òÿÀ|÷ ú‚�‡fæ æ…÷ ÆÆe…fær æ…÷ ˜Æe…fæ" æ…÷ šÆe…fæÒæ…÷ lÆe…æLæÿˆæ3ÿˆÀ ð ‡p°fæ æ…÷ rÆe…À ð\ü‡÷5Šü÷Jü®þfæ æ…÷ BÆe…÷Efü‡¦÷ Ö÷ †÷ ê÷€†÷ ÖþÆÄw0ñÖ f�  Á ý�‡÷  ,Øà ×¢  Á ÷ ì÷Á8ÁÂÃ÷ Ø÷è ÂdÁe0 üÀ0D÷ ‡÷ ´÷ Ã<Áà ÂÃ÷ œ÷ø‡÷ ”Å" µufæ" æ…÷ lÆe…‡÷5ŽûÀ ðJûfæ æ…÷ BÆe…÷EfûÀ|ð¶ÂðÅóÀ|°ôpö÷ &$†À�û öÿwþ÷Eª÷U@¤f¦&À|÷ â€Á¶ @÷ ’ý‚�¹Ñ öÀøÿöøú÷‹Y À|÷•Mð‹ü÷•@‡Ø   @ &À.Àe6Î% 4Î% 4Î%04– f÷ ¬�‡�  Á ý‡wT À.ÀeF öw„æ,wdæ0w\æwTæ4wLæHwDæ8w<æw4æw,æ<w$¡‡&æ¦f&¦ v Þ €�‚ƒ„…‡&Îe Áf&æÿˆÂbò€Â% ÿ$&&&üÿæÿˆÂFò �f&üÿæÿˆöeöe€‡Ð ö $ä1¢áð·Àr ð(ð„&÷ Tÿ÷ ¨ô÷ Ð& & & & & & & & & Εæææ ÿˆfæÒæ…÷ àþÆe…fæ" æ…÷ ÂþÆe…÷˜÷U’ÄÁ�  Á ýĦÁP� Á  Á ýĤô•3ô„&÷ ÷V÷UP÷ þ÷ ÷ þ÷ 4Á6Á&Á Á¤ññÀ¤ðÕ÷U”ø÷5ŽøwÈfæ" æ…÷ þÆe…fæ¤æ…÷ þÆe…fæ" æ…÷ äýÆe…À¤,ð wp ÷ š ð� ðŒ fæ¤æ…÷ œýÆe…À¤,w6 À÷ túÁ‚Â÷ &üÁ‚ÂÿŠÂ ý÷H ÷ âù÷ �ûw¨þÀÝÿ÷ >úÁÂz÷ ðû÷ tûwŒþÀþ÷ šý÷ ’ý‡ This is the RMS DEFINE utility, version 2.001 Error in LUN assignment Maximum nesting depth exceeded in indirect file Open error in indirect file Syntax error in indirect file specification I-O error in processing indirect file File specification is too long Error with indirect file Illegal value. Type ? for help If the file already exists, do you want to supersede it (NO)? YES means that the existing file will be deleted and the file you have just specified will be created in its place. NO means that the file you have just specified will not be created and you will have the chance to begin again. This file can not be created since the file already exists and you did not specify supersede. Your file has been created -- Your file has been processed and a command file generated -- NO DEFAULT: You MUST enter a value This file cannot be created RMS status code = System code = ** Privilege violation ** ** Directory not found ** ** Device not available ** ** Device is full ** Do you want to re-enter the entire file specification (YES)? There is an error in the device or account number field of the file specification you entered. YES means that you want to enter a correct file specification for RMSDEF to process again. NO means that you do not want to re-enter the file specification and want to restart the process or terminate the utility. ; You originally gave a bad file specification which was output to ; your command file. You must edit the change in yourself. ; ?DEF -- Indexed files can only be created with RMS11K Invalid data in command file. You have specified a virtual block number which is not within the boundaries of the file. The file wasn't created since you specified a block which is in use. will you now accept an approximation of that location (YES)? You requested RMSDEF to start the file or an area exactly on a block you specified, but that block is not 00š 2ü1l1DATADATADATADATADATADATADATAavailable. YES means you will now accept the best approximation of that location. RMSDEF will try to create the file again. NO means that you do not want the file created and want to restart the process or terminate the utility. &æ¦f&Á8Ñ  @HùÀ¾Á”Â÷ àÀÓÁ†÷ ÔÀãÿ÷ ñÆðw\õ`ývðú^þvþ€@þ€ðüŠÀýj°ÿÀâÿ÷ Îðw¤ÿÀ×ÿ÷ Âðw õÀáÿ÷ ¶ð Ààÿ÷ ¬ðÀßÿ÷ ¢ðwxÿÁIÂ?÷ xò£Nwbÿà £Y"À &0 ÷ ·üïÁÊ„÷ ñ÷ ìïÀÜÿ÷ PðÂ÷ üð€�‚ƒ„w õ£?ÀÜÿ÷ $ðÆ÷ ðÃÀ¤ñµ ÀÞÿ÷ ðwâþÁÂ…÷ âñà £Y ñÅ €�‚ƒ„wÄô£Nw®þ£?ÀÕÿ÷ ¾ïÞ÷ ¤ïÛÀÙÿ÷ ¶ïwô ‚ÿP TITIÁÉ ÷¼ ®÷B´ wˆ„4 ô€÷Š” � ‡C3 3 ó€ó €É,Ä, ÍUóE€s3w<æÞ1H �¦æ&fø1Ñ BÀ˜þ… *ƒÅ Í‹'Â% Í¥!‡Í¥EÀàúÂ%,‡À€ý… ƒÅ K‹Œ†‹ŒÀ5 ‚‡õ¥  õ¥PBÄ2Ì þÂ%pÀÐÿË‹ñó5Jó³ J€÷ àþó J÷ …„ƒ‚�€‡@ºÿµ ºÿõÅüÿ´ÿEÍ¥ó‚A�î†A� êƒÁ Iw D 0 ø0ú0ð‹ü÷ ȇpúpM÷ $†w`ðµ€ówð \ ðµ ó÷ î‡÷ .ð%°ýwÀðµŠ0ö"0ô Áep"ð ÷ \îð lìp0÷ $îð•ð *" °`øÂ Dðµó ¦�`W¨aW¢zÉÅ Â ö‚0,úw´É¥;ðµó&wöþwöð¥Ðùæûÿð%°ý7œü Ä ðµ€ó÷ Hwÿ÷ ˜ðÅ€óðŠüæöÿ& ðµ ó ðÅ óðÕ€óð•ÿÿüðµó &^&`÷ €°`°^°“òV ‡æÿÿÞæþÿÛæýÿ׿üÿÔðµó�`W¨-ð‹ó€ðÅ€óðÕ óÂ ð ø°`w4þwrÿw ^ ð‹ü³ðŠüðåþù°Šü÷ €§É¥@Ñðµó 0¬üýÆ�  p€°�„°ø° ø÷ Øðµ@ó ðÕ@óðå‚ð• …÷ ð ^ �0 ø00úwÔý&^&`÷ °`°^wÿ÷ TþðåþðŠüõµ€ó-0®0 °0™°0™Š0´0¶0¸ðUj0Š„÷ ˆ‡000ð•ðµŠð•0ð%°ý‡Ö Àw @ð \"°ŠüþðµŠ÷ ¬ë¸¶´œŠœ°®0þ÷ Œ‡U%ð  ÜÄÃeÃEÆà°Â÷ 4Æ`0 Â÷ (e)ðEj0`0^�÷ ëð ¡±‡0Šnð5j÷ .ëð ^�ðµŠðÕh÷ îêðÅh÷ ë‡U%÷ Êêe)‡0ŠüÉ)fÿˆ‡Ñ Â&÷ 2‡× /×  ×  ô÷  ‡×  ú×  ÷R¨ðÕ€ó¡‡ÂåC”‡"9æ"/Ó:âý>UBD½Ç?˜_@R±@iA/B¡‡A|@}¨@ ÌB’…CƒýEÑüFÌÈA%Bø:C–ÔFQMH”/IP®JÏ}K¹ÙEÕQ6¥¶ì¨>@åA³ËCx>ÀA¾�DKÐ?xÈBxˆB C™E—ñEILF[·FÛ³G@“[¼<`:¯>‘ÔLm"Ql3Ÿ¾/"í)ÿDÑ8µ;)Þ;U344B4ò3À ð ‡Îe‡÷5PÓ‡Îe‡Á­>Â.÷ ¦×Îe‡ÀÔÿwªÕfæ æ…÷ ÄØÆe…fær æ…÷ –ØÆe…À 0 ÷EòÒ‡ÀÔð À÷ \Õ÷Rè‡Îe‡ÀÔð ÷ p‡Îe‡ÁÛ>Â>÷ ×Îe‡ÀÓÿwÕ÷0ÿÁÀxŠÀ ý÷Úþ÷€Öþ7 Øþ‡ÀÔð52Îe‡7 |ÔwÆÁ?Â-÷ ÀÖ÷ °ÿÎe‡÷EDÒÁ¤Âr rœ,,1Š,fær æ…÷ Âׯe…Àr ,À¾ÁÒÓÂ÷ PòÀÓÁÄÓ÷ DòÀãÿ÷ rÔÎe‡fæ æ…÷ nׯe…‡ÀÔðµ2‡ÀØÿ÷ >Ôw†ÔÁF?Â>÷ ÖÎe‡ÀÒÿwÔ÷E”ÑÁ‚ÂÿŠÂ ý‡ÀÔð52÷5rÑÁ·:Â÷ ÐÕ÷ ÖÎe‡ÀþÿwÐÓÀ÷ÿ÷ ÐÓ‡Àÿÿ÷ ¾ÓÀÔð ÷ªæ‡Îe‡Â—&Â¥�ÿÎe‡À÷ÿÂ¥æÿÀóÿÂ¥ÌÿÀóÿÂ¥ÉÿÀôÿwxÓ÷zý7xý÷xxýæ 4ÿˆ†Îe‡÷Zýý÷VýýÀö3÷ ÀÖñ5w¬ÐÀ¤ð�:ý,÷UžÐÁ„?Â5wÌÓwÐwÚ÷�ýÁ�ÀxŠÀ ýÀ¤ð�(÷�ºü÷¶ü7 ¸ü‡÷.ã¬ü÷&ã¨ü‡À ‡Â–ü`· ’üƒÀûÿ÷ ¸ÒwÓÂ~üR”À ý·tü‡÷rüdüÀ00š2ü1l1DATADATADATADATADATADATADATAlüÀe· fü7 àâ7 Pü÷ ü— :"w>ü7 <ü7 :üÀö3÷ ÞÕñ5wÊÏÀ"üÁü÷ tÿ‡Àÿÿ÷ <ÒÎe‡Àôÿ÷ .ÒÎe‡÷ L×-ôû ÷ Þ÷ æûß×-\â ÷ Ê÷ ÒûÀJâÁHâ÷ ÿ‡×-<âÀõÿ÷ àÑ÷*âíÁò3À÷ úþ7 @χ÷–ûÎe‡÷ â×-âÿÎe‡‡×-vû‡Àóÿ÷ ’ÑÎe‡ÁZûÀÖá@à€ ÷ ªþ‡÷ †ÿ ÷ Æá÷ ÂáÎe‡÷ `ÿ¤×-&ûÀûÀå�ÀûÀå2�,‡Àöÿ÷ 2чÁ„?Â5wØÑÁÂÂ?ÅÆ?÷ rʇ RMS-11 Define Utility Type a question mark (?) for help at any time. All numbers will be decimal, unless explicitly specified otherwise. Defaults will be shown in parentheses. Type a carriage return to show them. YES means a command file containing your correct responses to the upcoming questions will be generated for your future use. NO means a command file will not be created. Enter file specification: The file specification should be entered in the following format: DEV:[PRJ,PRG]FILE-NAME.TYP;VER See your system user's guide for defaults. The PROJECT and PROGRAMMER numbers of the UIC and the version number are OCTAL Illegal file specification, try again WARNING - be aware that the filename has been truncated. Processing continues. WARNING - be aware that the file type has been truncated. Processing continues. Bad UIC, try again Illegal device, try again YES means that the command file you have been using will be closed and you can stop the utility, specify another command file, or just create a file. NO means you may define another file, adding its specifications to those already in the command file. You may also terminate the utility and the command file will be automatically closed. YES means you want define to create the file being specified as well as the command file. NO means only the command file will be created. Do you want to close the command file (NO)? Do you want to generate a command file for future use (NO)? Enter file specification for command file: Do you want to create the file you will be describing (NO)? ; The first question asks for the file specification.HELPÿIDÿº?¿?ÀF4Ö?ÀX4ö?À„z@Àh4NAÊz@Nz@Y‚4ö??z4Ö?À† Ö?Àô4NA€¾4ö??¾4ö?/˜@ÀÞ4ö?À45z@ÊF5z@NF5z@Y4@?5ö?À† ö?ÀN5NAÊ 4@?T64@Ȥ@d5R@À„4@Àú5NAÊ®z@N®z@Y6z@? 6R@À† R@À*6NAÊ z@?T6z@Ȥ@À†à5z@�f6ö?À† ö?À¼6À†6HAÄT7¼@À†\8Ì@:�7Ì@:HAÀ† 8è@È*AÜ@À�8Ü@À„HAÄ$8è@À†Ö8A.68ô@À†\6HAÄD8ü@À€;68AÀ†Ö8AÂÀ8AÂ\6HAÀ†Ö8AÊ9®À†\6HA[T74AÀ‚n8†z8:A,€Â†z8BA]†¨8À†€6NAÁÂö3Å4÷ êχSEQÿRELÿIDXÿVARÿFIXÿSTMÿUDFÿVARÿFIXÿUDFÿVFCÿVARÿFIXÿVARÿFIXÿSTRÿPACÿINTÿBINÿª3®3²3¶3º3¾3Â3Æ3Ê3Î3Ò3Ö3Ú3Þ3â3æ3ê3î3ò3ÀÒ929Ê®H4?Ê94Y:®H4N®H4À† 4À²9 5ʺ9®‚4?":H4€º9®‚4�::® 6‚ª9®Š6À† H4È…ˆ4À:929Êú9®Ò4?š9ˆ4ƒú9®Ò4„j9®Ø4…J9®Ò4†r:®Ò4Èž5Ò4À† ˆ4È…`5Ü4È�€5È�æ4È…Æ5À29ÊÚ9®?b9æ4YÚ9®Nj:ÀB:æ4À„5È�€5È…æ4È…&5À:929Êú9®Æ5?:&5‡ú9®Æ5ˆj9®Ø4‰r:®Ò4À† &5Àr929Ê®?:`5ÌB9À† `5ÀÂ929Ê €5? :€5ÌJ:À† €5Šš¢9®Àâ929Ê®?z9¦5ÌZ:À† ¦5À*:29ÊZ9®?2:Æ5YZ9®N®ô5À† Æ5ÀR:29Ê®?‚9ô5Yb:®N®À† ô5È…&6À:929Êú9®\6?R9&6‹ú9®\6Œj9®\6Èž5\6À† &6È�€5È�j6È…Æ5À’929Ê®?ò9j6ÌŠ9À† j6È…�6À:929Êú9®À6?ê9�6�ú9®À6Žj9®Æ6À† �6È…`5Ê6È�€5È�Æ5È…Ô6À‚;29È…à67È�ò8È�48È�8Àª:29Ê®?ê:ì6YŠ;®N®À† ì6Àº:29Êj;®? ;7Nj;®YZ;®H7À† 7È�ò8È�48È�8Àš;29ÊŠ;®‚7?ê:T7YŠ;®‚7N®°7À† T7À’;29ÊÊ;®°7?:;‚7YÊ;®°7N®°7À† ‚7Àª;29Êú:®7?‚:°7Nú:®7Y®Þ7À† °7ÀÒ;7À„è7ÀÒ:29Ê è7?º;è7# 8Т:7À† è7ÂÂ:7À† è7À;29Ê®?2;8Àž;®À";29Ê 48?z:48ÌŠ:\8(²;œ8Àz;48À„48ÊÂ;h8À† 48ÀR;Ê h8?â:h8Ì*;�8(Ú:Â8Àz;h8À„48Êb;À† h8ÌB;²8Ìz;48Ì48À†š:48)Â;h8,œ8À†š:48Ì;Ø8Ìz;h8Ì48À†ò:h8,Â8)r;)z;h8)48À†ò:h8ÀJ;29Ê®?Ê:ò8�®�¢;®‘²:®’’:®À† ò8ÿ ¼í®26<ÿ ´í®2ê<ÿ ¬í®2ž=ÿ ¤í®2=ÿ œí®2F=ÿ ”í®2‚>ÿ Œí®2V<ÿ „í®2=ÿ |í®2^=ÿ tí®2ü=ÿ lí®2 >ÿ dí®2D>ÿ \í®200š"2É1¶0eaek›’*>ÿ Tí®2ü<ÿ Lí®2:=ÿ Dí®2<ÿ <í®2Ü;ÿ 4í®2<ÿ ,í®2p=ÿ $í®2Æ>ÿ í®2´>ÿ í®2Œ<ÿ í®2ê=ÿ í®2N=ÿ üì®2<>ÿ ôì®2=ÿ ìì®2V=ÿ äì®2‚=ÿ Üì®2Š=ÿ Ôì®2Ð>ÿ Ìì®2þ;ÿ Äì®2h>ÿ ¼ì®2z>ÿ ´ì®2<ÿ ¬ì®2Î<ÿ ¤ì®2’=ÿ œì®2Ž>ÿ ”ì®2>ÿ Œì®2¨>ÿ „ì®2^<ÿ |ì®2(=ÿ tìÀ2’<ÿ lìÀ2ä@ÿ dìÀ2š<ÿ \ìÀ2¤Aÿ TìÀ2À?ÿ LìÀ2Aÿ DìÀ2t@ÿ <ìÀ2°Aÿ 4ìÀ2ì?ÿ ,ìÀ2>Aÿ $ìÀ2œAÿ ìÀ2Aÿ ìÀ2>ÿ ìÀ2=ÿ ìÀ2†@ÿ üëÀ2Ö?ÿ ôëÀ2hAÿ ìëÀ2J@ÿ äëÀ2þ?ÿ ÜëÀ2–>ÿ ÔëÀ20@ÿ ÌëÀ2|<ÿ ÄëÀ2$=ÿ ¼ëÀ2B@ÿ ´ëÀ2¾@ÿ ¬ëÀ2>>ÿ ¤ëÀ2€Aÿ œëÀ2 =ÿ ”ëÀ2<ÿ ŒëÀ2Ä=ÿ „ëÀ2@ÿ |ëÀ2"?ÿ tëÀ2z?ÿ lëÀ2â;ÿ dëÀ2Ž@ÿ \ëÀ2¬@ÿ TëÀ2š@ÿ LëÀ2¼Aÿ DëÀ2Ò@ÿ <ëÀ2ò=ÿ 4ëÀ2Aÿ ,ëÀ2Ü<ÿ $ëÀ2Æ@ÿ ëÀ2ì@÷5 ÊËÀòÿwHÎÁÜ>Â!÷ "ÐÎe‡Àýÿw&Τò• ¤ò•¤ò• ÁÈGÂDw²Î÷5 pË÷ ‡ÁDÂ:÷ ÊÏÎe‡ÀüÿwÎͤ—¬—, ÁÜÂ`ÍŠÂ ýÎe‡òU¤—¬Á ñÜfæ æ…÷ ÌÐÆe…ñºÊ÷5 èÊ÷Uâʇà £NÀùÿ÷ TÍÎe‡w.ÍÁª?Â÷ $ÏÎe‡Àûÿw(ͤò•‡Â¤ò•‡Â¤ò•‡Â¤ò•ò•!‡Â¤ò•‡ÀùÿwÞÌÀøÿwÖÌÀúÿwÎÌÁIAÂ!÷ °ÎÎe‡ÁjAÂ÷ žÎÎe‡À÷ÿw¢ÌÀöÿwšÌ÷ öÜÎe‡÷ èÜÎe‡Â¤òÚÜ—¬—¬Á®É¨ÉÀÜP” ýÁ ñ–É÷UÆÉ‡Á¤BÂ(÷ $ÎÎe‡Àóÿw(Ì÷ ‚Ü×-~ÜÎe‡÷U�ɤòfÜ0‡Á^CÂ'÷ äÍÎe‡ÀòÿwèË÷ BÜÎe‡÷UXɤò.Ü ò&Ü"‡ÁÐEÂ-÷ ¦ÍÎe‡ÀñÿwªË¤òU‡ÁÎFÂ.÷ €ÍÎe‡Àðÿw„ˤòU‡ÁvÂ@÷ ZÍÎe‡Àåÿ÷ ^ˇÀ¤ðU‡ Enter file organization (SEQ): Enter SEQ for sequential (DEFAULT) REL for relative IDX for indexed Since you specified a non-disk device, your file organization MUST be sequential. Enter record format (VAR): Enter VAR for variable (DEFAULT) FIX for fixed STM for stream VFC for variable-with-fixed-control-area UDF for undefined Enter var for variable (DEFAULT) FIX for fixed UDF for undefined Enter VAR for variable (DEFAULT) FIX for fixed VFC for variable-with-fixed-control-area Enter VAR for variable FIX for fixed Enter maximum record size (0): Enter maximum record size: Enter the maximum number of bytes in any record in the file. Zero means that RMS will not limit the size of the record. Enter the maximum number of bytes in any record in the file. Since you have specified either a relative file or fixed-length records, there is no default. Enter size of fixed control area (2): Enter the number of bytes in the fixed control area of each record. The number must be between 1 and 225. Zero means the default of 2 bytes. Enter maximum number of records (0): Enter the largest relative record number to be used with this file. Zero means that RMS will not limit relative record number. Will you allow records to cross block boundaries (YES)? YES means that records can cross block boundaries: - the file will be optimally dense - records may be longer than 512 bytes NO means records must be wholly contained in one block. Since you specified fixed length records, you must have a maximum record size less than 512 bytes (the size of one block) or you must allow records to cross block boundaries. Please change one of these. Do you want carriage return control (YES)? YES means each record will be preceded by a line feed and followed by a carriage return when it is written to a carriage control device. NO means carriage return control will not be applied at any time. Do you want fortran character control (NO)? YES means that any printer controller will expect the first byte of each record to be a fortran carriage control character. NO means that fortran character control will not be applied at any time. ; The next questions00š*2ü1l1DATADATADATADATADATADATADATA deal with file organization & record attributes÷ 8ÏÁ“LÂ(÷ öÎ7 (áÀÔð52Àïÿ÷ "Î÷ Îe‡×-áþÀíÿ÷ ÎÆþàwjÒÁ8Âíÿ÷ Ï÷ àà7ÚàÁ¤1 ÁÌàñ Aú1Á8ÁÁeHð�®à· ¨à7ªà‡ÁíAÂ÷ ’Ï7 TÿÎe‡Àîÿw’Í÷ ìÝÎe‡À¤À À-ÖÝ Àëÿ÷ tÍ÷ÿÎe‡ÀTàð¸Ý7 ÿ‡ÀÜÁöÌÁ È ŠÁ ýÁ€ÊÂzÊ·ÜÌÀÜP” ý‡ÁþBÂ÷ ÏÎe‡ÀíÿwÍ×-´þwú÷ VÝ×-RÝ÷ JÝÀ¤ÁÒßÀ BÂm.Ý€ wRÿW¬×-Ý ÀÛÿ÷ ¶Ì÷\þÎe‡W¬W¬×-îÜ×-æÜå×-ÜܱбŠñ�ÌÜ"‡Á ñÜfæ æ…÷  ÏÆe…ñŽÉ÷U¾É‡À.߬ ÀÚÿ÷ .Ì÷ÔýÎe‡7 Æý‡À߬ ÀÚÿ÷ Ì÷®ýÎe‡7 ¢ý‡÷ HÜÎe‡À¤À À-2ÜwXþÁxýÁ ÁmºÞÁeÉÜ×-fý· ^ý Àïÿ÷ ¬Ë÷RýÎe‡‡×-Dý6÷-:ý6ýw~÷ ÚÛ×-ÖÛ÷ ÎÛÎe‡À¤À Âý ÂmHÞÂe‚Âm¦Û€ wÊýÁìüÁm.ÞÁe"É�ŽÛ×-Üü· Ôü Àïÿ÷ Ë÷ÆüÎe‡‡÷-¶ü¶ü Àîÿ÷ Ë÷¨üÎe‡ÀâÝÀe" Á’ü7”�üÂmŒüÁ ú7 „ü—  Àêÿ÷ ÊÊ÷püÎe‡wJþ÷ büw”ÊÁœÝÁe"  ý×-Fü7 >ü‡7 8üÁxÝÁe  ýÎe‡Á`ÝÁe  ýwBÊÁJÝÁe"  ýw,ÊÁ%HÂ(÷ "ÌÎe‡Àëÿw&Ê÷ ݇  ÝÁe0 üÂíÿ÷ &ËÀ0÷ ºÌ‡Á½EÂ÷ ÞËÎe‡ÀçÿwâÉÁ Âíÿ÷ ôÊÁÊÜ1—  P” ý‡Á®FÂ&÷ šËÎe‡ÀìÿwžÉÀ’ÜðÕ‡ÁáHÂ'÷ tËÎe‡ÁIÂ'÷ bËÎe‡ÀêÿwfÉÀZÜðÕ‡ÁJÂ/÷ <ËÎe‡Àéÿw@ÉÀ4ܬÎe‡Á6LÂ"÷ ËÎe‡ÀèÿwÉà Îe‡÷U„ÆÀöÛð�VÙ ðÕw*÷ HÙ×-DÙÎe‡÷UVÆÀÈÛð�,Ù ðÕÀ�LÁ®ÛÁ  ÷ zæÀìÿw´ÈÁ»LÂ÷ ŽÊÀ”Ûð•Îe‡ÀÑÿwˆÈÀ|Ûð•‡ÀpÛð•‡ÀdÛ𕇠It's time to define the primary key Enter position of key: Enter the position, within the record, of the key's first character. The first byte of the record is position 0. If the key is segmented, you may enter up to 8 positions. The numbers must be enclosed in parentheses and separated by commas. Enter size of key: Illegal key size. Type ? for help. Enter the number of bytes in the key. If you specify a string, then the limit is 255 bytes. If the key is segmented, you may enter up to 8 lengths. Their sum must not exceed 255. The numbers must be enclosed in parentheses and separated by commas. If you specify an integer or binary then the key must be either 2 0r 4 bytes. If you specify a packed decimal number, the limit is 16 bytes. Too many segments You entered a different number of segments in the key position question. Segments are not allowed when the key is numeric. Key exceeds maximum record size. Sum of segmented key sizes is greater than 255. Enter name of key (NONE): Enter a maximum of 32 alphanumeric characters that will be associated with this key on RMSDSP's display. This name may also be used when specifying the key of reference to RMSCNV when reading indexed files. Will you allow duplicate keys (NO)? YES means more than one record in the file may have the same value for this key. NO means that no two records may have the same value for this key. RMS returns an error if duplication is attempted. Default is NO for primary, YES for alternate keys. Enter "YES" if you want an alternate key to be changeable during update. Do you want to define more keys (NO)? YES means you want to define another, alternate key. Up to 255 alternate keys are allowed. NO means all keys for this file have been defined. Will you allow duplicate keys (YES)? Will you allow keys to change (YES)? YES means the value in this key field may be changed during an update operation, that is, the value may be different when it is rewritten than when it was read. If yo00š22É1¶0eaek›’u said "NO" for duplicate keys, you must enter "NO" here. NO means that RMS-11 will return an error if the value in this key field changes during an update. Do you wish to define a null key value (NO)? If you want a null key value, specify a single character. If a record contains only that character throughout the entire key field, RMS will not create an entry for that record in the associated index. Enter C for any printing character except #, @, and ? #43 for # #77 for ? #100 for @ #N for any non-print character (N is an OCTAL number less than 377) Enter null key value character: Too many keys! Just finished alternate key number 0; The following questions deal with keys Enter data type (STR): Enter STR for string (DEFAULT) INT for integer PAC for packed decimal BIN for binary ÷5 ÔÎe‡÷ t×Ár7Â3w2×Àô7\éÁ � Á Àe Á ýÀFéÁ¤p1‡÷ Îÿð æ÷UºÓ‡Àæÿw.ÖÁ,7Â÷ ØÎe‡Áö6Â6÷ þ×Îe‡ÁD7Â÷ ì×Îe‡Á]7Â÷ Ú×Îe‡÷E@æ‡÷U8æ‡÷E0æ‡÷E(æ‡÷E æ‡÷Eæ‡7 æ÷Eð æ‡7 æ÷Uðæ‡÷Eøå‡÷E ðå‡÷E@èå‡÷E€àå‡÷EØå‡÷UÐå‡÷EÈå‡÷EÀå‡÷E¸å‡÷E°å‡÷E¨å÷Uà¢å÷ öþ‡÷Uð–å‡÷EŽå‡÷E †å‡÷E@~å‡÷E€vå‡÷5 ŽÒ‡Á–5Â"÷ ìÖÎe‡Á¸5™÷ ²Ö‡÷ Få÷U`Ò‡÷ 6å×-2åÎe‡×-$å Îe‡Â¤òå.÷U,Ò‡Áº7ÅÂ7÷ þ͇ Enter magtape block size (512): Enter the number of bytes in each magnetic tape block. The number must be 0 or between 18 and 8192. Zero means the system default of 512 bytes. Enter any combination of R (read), W (write), E (extend), D (delete) to grant those privileges to the class prompted. Enter "NONE" to disallow all privileges. Specify protection by class: Owner (RWED allowed): Group (RWED allowed): System (RWED allowed): World (R allowed): ; The following questions deal with file protectionNONEÿNONEÿNONEÿNONEÿ¦7«7°7µ7È�ú8È…Ì7À˜3Ö7À„À49Êv4®8?ö3Ö7À‚‚4Ê®8RŽ4ð7W–4ð7Ež4ð7D¦4ð7€®8À† Ö7Àþ39ÊF4®f8?ö38À‚N4Ê®f8RV488W^488Ef488Dn488�®f8À† 8À"49Ê®4®®8?ö3f8À‚¶4Ê®®8R¾4€8WÆ4€8EÎ4€8DÖ4€8‚®®8À† f8À449ÊÞ4®?ö3®8À‚ð4Êä3®Rø4È8W5È8E5È8D5È8ƒä3®À† ®8À5Ê®?45ú8ÌB5À† ú8Áº3ÅÂ3÷ êχLBNÿCYLÿLBNÿVBNÿª3®3²3¶3Àú7D4ʪ7®>4? 8Â3YJ8®ò3Nª7®>4À† Â3ȇD4š7ú3Àr7:7Ê®F6? 8ú3Y8®&4N®F6À† ú3È�,5È�ö5È�ª5È�Ð5ȇ6š7ú3È…D4f6È�Z4È�ö5È�ª5È�Ð5È…6À8Ê®?J7Z4Y²7®Ú4N®À† Z4ÀB8:7Ê®ª4?R8†4Ìj7®ª4À† †4ÀÊ7:7Êb8®Ú4?ê7ª4€b8®Ú4�Ú7®Ú4À† ª4À‚b8ÀZ8:7Ê Þ4?z8Þ4Ì*8®5À† Þ4Àb7Ê®?Š75Yº7®N®À† 5À8:7Ê®?J7,5Y®z5N®À† ,5ÀB8:7Ê®z5?R8V5Ìj7®z5À† V5ÀÊ7:7Êb8®Þ4?ê7z5‚b8®Þ4ƒ8®Þ4À† z5Àz7ÊÂ7ʪ5?:7ª5ÌZ7̪5À† ª5ÀÒ7Ê‚7®?B7Ð5Ì28ÌÐ5À† Ð5Àâ7Ê®?ò7ö5Ìr8®À† ö5À¢7Ê®?"86N®Y:8®À† 6Àj8f6Ê®f6?R7F6Ì’7f6À† F6ÀÒ8à6À€Àš8À€ÀÂ8:7Ê®–6?"9v6Ì 9–6À† v6È�ô6À9:7Ê*9¸6?¢8š6Ì’8¸6À† š6È�7ÀŠ8n6Êò8n6?ú8¼6Ì9n6Ìâ8š6À† ¼6À‚ê8Àš8È�ô6È…7ä6À9:7Ê®?‚8ô6̲8Ìô6À† ô6Àº8:7ÊÊ8?ª87ÌÚ8Ì7À† 7ÿ ´ïö2.<ÿ ¬ïö2<=ÿ ¤ïö2<;ÿ œïö2Þ=ÿ ”ïö26<ÿ Œïö2œ;ÿ „ïö2d;ÿ |ïö2ð:ÿ tïö2<ÿ lïö2¬=ÿ dïö2¼;ÿ \ïö2æ=ÿ Tïö2;ÿ Lïö2B>ÿ Dïö289ÿ <ïö2D;ÿ 4ïö2Ä;ÿ ,ïö2=ÿ $ïö2Ð;ÿ ïö2 =ÿ ïö2<ÿ ïö2>ÿ ïö2â;ÿ üîö2 >ÿ ôîö2º:ÿ ìîö2ö;ÿ äîö2è:ÿ Üîö2 ;ÿ Ôîö2ø9ÿ Ìîö2^>ÿ Äîö2Š;ÿ ¼îö2D=ÿ ´îö2f>ÿ ¬îö2J;ÿ ¤îö2Ž9ÿ œîö2\;ÿ ”îö2p;ÿ Œîö2ê;ÿ „îö2´=ÿ |îö2(>ÿ tîö2‚;ÿ lî3&<ÿ dî3ª:ÿ \î3j:ÿ Tî3œ9ÿ Lî3b:ÿ Dî3=ÿ <î3.<ÿ 4î3º<ÿ ,î3:ÿ $î3p=ÿ î389ÿ î3"=ÿ î3@;ÿ î3¢;ÿ üí3R;ÿ ôí3¼:ÿ ìí3P:ÿ äí3*:ÿ Üí3Ä:ÿ Ôí3Þ;ÿ Ìí3":ÿ Äí3ˆ:00š:2ü1l1DATADATADATADATADATADATADATA÷FI÷LEþ÷FIœ÷LE˜÷FIÄ÷LEÀ÷FI^ ÷LEZ ÷FIx ÷LEt ÷FIâ ÷LEÞ ÷FI ÷LEþ -÷•¢ÿ÷AR¦÷EA¢÷AR@÷EA<÷ARh÷EAd÷AR ÷EAþ ÷AR ÷EA ÷AR† ÷EA‚ ÷AR¦ ÷EA¢ ÷ 2ÑÁ¦DÂBwðÐ÷ &ã.÷ ã+÷ RÁ¤p p pœ1pð ÷ÿ7 þþñ5€ðÕ 1 1 1Š11 ñE€×-ÄâþÀæÿ÷ ÊÏÆ¸âw$ÔÁÂæÿ÷ ÌÐ÷ –â7�â ÁŠâñ Aú1ÁÁÁeHð�tâ· nâ7hâ‡7 dâ7 ^âÀ¤¬ ÷ LÐwbþÁ„>Â$÷ 8ÑÎe‡Àäÿw<ÏÁ}DÂ)÷ ÑÎe‡ÀzDÁâÁ Á  ÷ ÜìÀçÿ÷ χ÷5 †Ì‡ÁèDÂ&÷ äÐÎe‡ÀÚÿwèÎ÷ ÿ‡Á¥EÂL÷ ÄÐÎe‡ÀÙÿwÈÎÀ¸áð ߇Á:FÂ÷ žÐÎe‡ÀØÿw¢ÎÀ’áðúÞðòÞ‡À€á¬‡Á§FÂ÷ dÐÎe‡À×ÿwhÎÀXáðÕ ‡Á’GÂ!÷ >ÐÎe‡ÀÖÿwBÎÀ2áð•‡À&áð•‡Àáð•‡À¤¬‡Á�@Â÷ òÏÎe‡ÀôÿwöÍ÷ PÞ÷ ØÍÎe‡×-BÞ ÷ ÆÍÎe‡À¤ð ×-Ðü÷ °àÀ¤ð�Þ1Àžàð�Þ÷U ˇ¬ ¬ÁÁ¬Á¬Áœ0Á ÁÁeB` ŠÂ‚ ‚ À ÝÀ À€ Àéÿ÷ 4ÍÎe‡²÷~ÝÀ¤×- üº¦÷5 †Ê‡Á³AÂ2÷ äÎÎe‡ÀãÿwèÌ÷ BÝÎe‡÷ 8Ý÷URÊwLÁ¼ßÁ Á¤@œ1@œÀ  ÂÝ€ ‡àü Àèÿ÷ œÌÎe‡÷U Êñä܇÷‚û‡÷5 òɇ÷ rû÷ P߇ÁáBÂ+÷ BÎÎe‡ÀÛÿwFÌ÷  ÜÎe‡Á¤ñ’Ü÷U¬É‡÷5 ¢É‡Áè?Â*÷ ÎÎe‡ÀõÿwÌÀôÞÀ À¤ðTÜ ðLÜ ‡÷5 dɇÁ¥CÂ&÷ ÂÍÎe‡ÀâÿwÆË÷ ¶ÞÀ¤ðU€‡À¤ÞðÕ ‡ Do you want to define areas (NO)? YES means you want to divide your file into two or more independent areas with their own initial allocation amounts, default extension quantities, fill numbers, and so on. These areas will be associated with the data and index portions of keys later. NO means you want your file created and used as one area. Enter initial allocation in blocks (0): Enter the number of blocks you want in the when it is created. A reasonable (non-zero) quantity speeds processing. Enter bucket size (1): Enter the number of blocks contained in each bucket of the . Zero means the default of 1. Each bucket must be big enough to hold at least one record. The number of virtual blocks per bucket is not big enough given the maximum record size you specified. Enter default extension quantity in blocks (0): Enter the number of blocks you want added to this when it is extended. DEQ must be a multiple of bucket size. A reasonable (non-zero) quantity speeds processing. The default extension quantity must be a multiple of the bucket size. Enter file default extension quantity(0): Enter the number of blocks you want added to any area with a DEQ of zero when it is extended. A reasonable (non-zero) quantity speeds processing. Do you want a contiguous (NO)? YES means you want your to be created in physically contiguous blocks. NO means physical contiguity is not required. Too many areas. Just finished area number 0 Do you want to define more areas (NO)? ; The next questions deal with allocation and placement attributes Do you want placement control (NO)? YES means that you want to control the physical location on disk of your . NO means that you accept the operating system's placement of it. If you want to specify volume, enter its number within the volume set(0): If you are using the VAX-AME, volume placement control is supported. Enter location: Enter a number representing the starting address of the on the specified volume. exactly (NO)? YES means that if the exact block you specified is not available, you do not want the file created. NO means that if the exact block you specified is not available, you will accept a block as close as possible. Enter type of alignment (LBN): Enter lbn if you intend to specify a logical block number as a location for the first block of this area. VBN if you intend to specify a virtual block number as a location for the first block of this area. LBN numbers the block within the disk. VBN numbers the block within the file. 00šB2›I2¶0eaek›’÷ æã×-àãÀ¤¬ ÷ ÈÑÁkFÂ2w†Ñ‡÷ ¶ÑÁ�FÂG÷ tÑ÷ÿÿºÿ÷  ãÀÔð52Á¨=Â8÷ \ÒÎe‡÷-”ÿ|ã· vㇷ †ÿ÷ ‚ÿ÷dãjãÀdã7^ãÀÔð52Îe‡÷ XÿÁà=Â, À<>ÁDÿ ÷ üíÁ >Â5÷ ðÑ7Š67Š3Îe‡ÁA>Â7÷ þÑÎe‡ÀáÿwÐ÷ \à÷-XàìâÎe‡÷UjÍÀÜâð�@à ‡ÁˆAÂ8÷ ¾ÑÎe‡ÀàÿwÂÏ÷ à÷-à¬âÎe‡À¢âð�à ÂèÌ ÁâÌÀÜP” ýÁ ñÎ̇Á@DÂA÷ dÑÎe‡ÀßÿwhÏ7 nþ÷ ¾ß÷-ºßNâ÷ZþÎe‡À>✠÷ –BÀ˜ß÷ Œ� Àäÿ÷ 0ÏÀâ0Š 0 ÁÜÀPŠÀ ýÁ,ÀPŠÀ ýÎe‡Àîáð�Rß w÷ òý‡7 êýÎe‡Á ñÜfæ æ…÷ ÒÆe…ñ,qfæ æ…÷ ðÑÆe…ñÞË÷U̇÷ÿÿŒý÷ rᇷ ‚ý÷-~ýfá‡÷ týÀ¤7XáÀRá7LáÎe‡ÀBᜠ÷ šÂ¥?Ê• â•.W Š”â•SÀœ? ÷ æëÁ‡?ÂI÷ Ð7Š€7Š}Îe‡ÀÞÿwþÍ÷ XÞ÷ àÍÎe‡Àâàœ ÷ :À>ÞÀ‹À€ ŠÀ€ €  Àåÿ÷ ÈÍÎe‡À®àðÞ÷U,ˇ&¦÷ ŒàÀ¤œ1 Â|àÀ ‚À ü�œÁ Á‚€‡÷ dà×-^àÁ�BÂ+ÀNàœ ÷ ¦ÿœBÊ• â•.W Š”â•SÀ“B ÷ òêÁ~BÂJ÷ Ï7Šƒ7Š€Îe‡ÀÝÿw Í÷ dÝ÷ ìÌÎe‡Àîßœ ÷ FÿÀJÝÀ‹À€ ŠÀ€ €  Àåÿ÷ ÔÌÎe‡ÀºßðÝ÷ ®ß×-¨ß÷U*ʇÂêÉ ÁäÉÀ,P” ýÁ ñÐɇ It is time for area numbers and fill factors for keys. These questions are for the primary key: These questions are for alternate key number 0 Enter area number for data buckets for this key (0): Enter the number of the defined area where you want the data records (level 0) of this key to be stored. Level 0 of the primary index contains the actual data records, while level 0 of each alternate index contains pointers to the data records in the primary key. The bucket size is 0 block Enter fill number for data buckets (0): Enter the fill number for this area as a number of bytes less than or equal to the area's bucket size. This number controls the amount of data actually written into a bucket by RMSCNV or another task honoring fill numbers. It may be used when the file is initially populated, leaving room for other records to be added easily later when the number is being ignored. The bucket fill size is greater than the actual bucket size. Enter area number for index buckets for this key (0): Enter the number of the defined area where you want the upper index levels (2+) of this key to be stored. The area for the lowest index level (level 1) is entered in the next question. the bucket size is 0 block Enter fill number for index buckets (0): Enter the fill number for this area as a number of bytes less than or equal to the area's bucket size. This factor controls the amount of data actually written into a bucket by RMSCNV or another task honoring fill numbers. It may be used when the file is initially populated, leaving room for other records to be added easily later when the number is being ignored. Enter area number for the lowest index level for this key (0): Enter the number of the defined area where you want the lowest index level (level 1) of this key to be stored. The bucket size of this area and that of the area containing the upper index levels must be equal if they are different areas. You can put the lowest index level in area 0 only if levels 2+ are in area 0 also. The area associated with the lowest level index bucket has a different bucket size than the area associated with the higher index bucket. Try both again. ; The next questions ask about fill sizes for keys; The next questions deal with associating keys to areas and fill sizes|³Û–,?Ž?ŽR9V ›r[qÀÀÿÿ$V 8* u00›J2ü1l1DATADATADATADATADATADATADATASYSYSYSYTICLSYOV¢XÀ(l(lð8*Ô¢À^ MúS DRDRDRDRTICLDRDB„?–Y€X ƒÀÀŒp,XÀ>5À.8 wPLf&÷ ŒL&†€�Áe?� � � � � � Á%ƒÁ& fæYÿˆ‡Á Á Á Á Á Á Â5w`5&÷ L€�w>L– – ‡Áe?ÁE? ‡& fŽ Ž Ž Ž Ž Ž æYÿˆ‡w &MÄ'Å  ÅUD$†BA÷ VK&�Â(÷ ÅU� ÀBQ÷ ¸JÂЕ* ü‡Â Âw ÆL ”Å¥ üÅ¥ ùÅå0B¡†€÷ KAa”ôœÿÿ‡æ,w– æ0wŽ æ4w† æHw~ æ8wv ¡‡æwj æ<wb æ\wZ ¬>´>Â>Æ>Ú>ÿÿè>ð>þ>??ÿÿ$?*?6?8?,ÿ>?L?f?r?–?ÿ¤?°?Æ?È? ÿÿÎ?Ø?î?ð?ÿÿÿÿö?@@@@ 1ÿ"@0@H@J@ÿÿP@\@n@„@¤@ÿÿ¶@¼@Ê@Ð@ ÿÿÿÖ@è@A A€ .ÿÿA"A>ABA€PAZAlAŠAŒA ÿÿ’AžA¶AºAÈA€ ÒAÜAòAöAB BB$B&Bÿÿÿ ,B4BHBRB~Bÿ ”B¨BÆBÈBÿ0ÿ ÎBÚBòBöB€CC C>CNCxCŠC�CœC¾C ÿÿÄCÊCàCèCDÿ0D:DPDTDbDlDxDŽD�D ÿ ÿ–D¢DÈDÌDÚDäDìDEEEE,EBEDEÿÿÿJEVEjElE"ÿrE€E–E˜Eÿÿÿ žEªE¾EÀE#ÿ ÆEÔEêEìEÿÿÿ òEþEFF$ÿ F(F>F@Fÿÿÿ FFRFfFhF%ÿnF|F’F”FÿÿÿšF¦FºF¼F&ÿÂFÐFæFèFÿÿÿîFúFGG'ÿG$G:G õ¥õ¥IE$õ¥C@& 7  w�, w( 7 ó7 ú7œôí÷üê ð p ƒÐ øÁ8·ÎwÊw00›R2I2¶0eaek›’ƺ` "$&(*,.024÷ p=3÷ z=0÷ |=-÷ ~=*÷ `='÷ z=$÷ |=!÷ ~=÷ €=÷ ‚=÷ Œ=÷ Ž=÷ �=÷ ’= ÷ ”= ÷ –=÷ `=÷ ’=È ¦P Ð ú& ’  ÷ ôº‡‚‚ &f�”þÁe„  ÷ ô­‡&f�€ÂÂ-÷ ´<·dwbæDÿˆ �‚÷ Ôó•‡ �‚÷ Èó�‡…„ƒ‚�€–  (2ù�ù úÀú`ûðû�ü ý ý0þÀþPÿðÿ  Ô8ŽAl?lÂÎÿÂeÂE ÷ žóæ`ÿˆ&À|ðæhÿˆ· Òÿ‡ ÁmÈÿ ‡ž¦ ʺÿà�bŠå‚‡&fæ!  E D  ‚E ‚Eà„ à±C B ΊñÖ A…„‡ÁÉ ÷=~A÷&=w,;„4 ô€÷ZAð<ì<‡C3 3 ó€ó €É,Ä, ÍUóE€s3w Aæ’Q¤<�¦æ&fÃlQÑ BÀ˜þ… *ƒÅ Í‹'Â% Í¥!‡Í¥EÀàúÂ%,‡À€ý… ƒÅ D„Œ†„ŒÀ5 ‚‡õ¥  õ¥PBÄ2Ì þÂ%pÀÐÿÄ‹ñó5Jó³ J€÷ àþó J÷ …„ƒ‚�€‡@ºÿµ ºÿõÅüÿ´ÿEÍ¥ó‚A�î†A� êƒÁ I÷Eÿ7P‰‡w–û& æTIææÿˆ& & & & & & & æò7ææææ ÿˆ÷h ”æV*ÿˆ÷•ú&÷• ö&& & & & ææÄ8& æò7æææpæ ÿˆ7 ,&÷�Å&&&×­Á&7 &÷@Ì7 Ì÷•È÷•Ä÷•¿÷•º÷•µ÷•« 0 ú-Àe øù 0 ö3Àe úù @týÿÀeò-&fÎEøÿæ& ÷ JúÆe� W ì7 $À.8÷ øü7^%w\%·Z%wˆ%& æ÷ ^úÖ Îè8ÿˆ×-&|³÷&÷þ%7 æ÷�&à7 Þ÷�ù%Ø7 ^÷�î%X7 V÷�å%PÀì%  À À  À À 7ö$W ÀW À W ÀW À 7vwhwb‡wºù÷²$÷„®$Â=Ã�  DÔ& æTIææÿˆ& & & & æ¦& æò7ææææ ÿˆ& & & & & & & æò7ææææ ÿˆ& & & & &f& æò7ææææ ÿˆ& & & & æ$æ68& æò7ææææ ÿˆ×-´#÷ê# ×­¤#öÿ÷Ú#÷Ò#À�#ð�„$687Æ#· Â#æ¾#æ68÷ Ü6À²#Àe68À  ˜� —  w œ#ø‡Àå687’#÷eŒ#÷68$–%‡f÷†· þ#�fæô#æ fæ°:æûÿ÷ ö÷°:V%w�V%7ŠC%÷2%Î:ææ÷ ø–%÷ %  æ:÷ Œ÷ÖaÎ^:ææø÷ ä÷–%÷ 6% æ^:÷ b÷¬Î:ææðCÎ^:ææ,÷ ®÷–%÷„Î"÷68%÷„%÷6%×-2%SÎ^:ææ÷ |÷–%ÀÎ$$ °ý÷ %é æ^:÷ ì÷6Î^:ææ÷ F÷–%Î:ææð÷ 4÷–%Æe6÷’$N"· J"ÀF"ð�û"58æ68÷ \5÷º"÷ ü÷°"×-Ú÷$÷Œ$Ö ©Î^:ææ÷ Öö–%Î:ææð÷ ÄöÆe�‡wðö ÷‚„…+€)Âe ÔD ‡&æ<"&&& ÷ dô ÿÿÆe À à ×-º7 ²ƒÃ÷¦Æe ÂekÀ‡wlö ‚„ � Âe€€-CÂe À‡w>öƒæ„&æ ÷ dô7ò# Á €  7 â#$@àÀ`fæ ÷ ô7È#ÂÂ# Á €  €àÀ`7¬#·^!w^!wž#·àš#–%ÆeÀ�#‡wÊõÆåÄ=ö=Å7 *!÷ ìùæ;ÿˆÃˆè× w>ææ;æ68÷ nô÷68!÷t · p ó��#68Îf æ68÷ „3÷V ÷ ÎN æ68÷ ÿöÈ ÁÆ v À68@àÀm, f÷ âþÅ^÷Ÿž Ü×­Ø@ ÷øŽÎ ÷ |üÅMŽæz ¦&& ÷ ¢òÆeÀ .À68Àí` ÀmÔæZ ÷ ˆþÖ Â ŽæD ¦¦& ÷ jòÆeÀ ξJæçæ÷ ºÖ Îæç÷ ðÖ · ·  ÷ Ê2÷pú÷e68ô÷T÷ ”2Æe × W! ÷ Ð ÷ú÷.÷ ôÆe‡ ×-( € ×-,÷Î÷ ö †×-÷¶ó×-ö÷¦À¢‡÷:÷f€À l=ææç÷ .÷x–%6æôÀ‡÷&÷J0=÷÷,J"6÷ ¦æç÷ ¼–% ×-.÷8Jø!÷ à¦æç÷ ´–% À‡×-þÀ‡÷pJÂ÷ª÷ J´À‡w.óÀ,=æZ;枦 …fæŒ& ”&& ÷ ²ðÆe À ÃGÄr7\ÁX BÔ¦fæ ¦¦ æûÿ÷ „ðŽæZ;÷ à0ÁZ;… !‡Næ4ff& ÷ \ð ÿÿÀ à öÃ Îæç÷ ä÷.Ö Æe÷eöÆeÄîÌ ¼à ææç÷ ¶Ã÷þ–%× ·²·À×-èÃÀÆe‡fÀ68Àí¢Àm&æ˜÷ ÆûÁŸŒW ?Ž÷ V Àæ ÷ 0Ö –%�‡wêñÆå”& —-¤<Ž —-¤Z„¦¶ ¨€¨ Üÿÿ—-¦çÎ5—-¤Z ÅŒ…a@�¦ ÷ ~2Cá‚aÁa&¦ªæfæ f¦æùÿ÷ ï—-´ —-´ ö5—-´Z*& æTIææÿˆÆeÁ Â0=Á& & & & & & & æ f¦& 梎aææææ ÿˆÆe—-¤(·ôwî÷âæ:-ææ$÷ ’ð–%÷ À  æ:-÷ ÷ZÖ Ö Æe–‡w¤ðÆå„÷– „‚”€…’÷ ¶ôw2€÷ ¬ôö ’øÀ68ÀíèÀm\&æÞ÷ úÃÔÅ’W¡[À68ÀàÀm:ææ]÷ Hî À ƒ × À68Àí ÀmÀí”� –%W¡(!À68Àí€Àmôævæ)÷ î À … W!À68ÀíXÀmÌÀíL� –%— ‡— ‚Â6À68Àí2Àm¢æ(÷ VùÁ �à·Ö Îæ2=fæææ6=æ Áef&æ÷ÿ÷ "ífæ<÷ xýÎ8=ææ<÷ hýÆeÆe„‡f÷ û 00›Z2ü1l1DATADATADATADATADATADATADATA!À68Àí´Àm$&æª÷ Øø×-œŽ÷ HõÎæç÷ `þ÷ªÆeÀç–%Á ÔÀŸf ?÷dŠÀd@�‡w´î÷t÷hà —- çq—- 2÷úo÷ðÁ À68@àÀmŠ ‚ææç÷ àý÷tþ÷e68ø÷nw¸@÷ Úä7âw¬·ª— DÁ:= BÔ÷”ÆÀ68Àí¾Àm.&æ´÷ â÷榦f& ÷ ÎëÆeÀ ÷`’÷X–%À‡×-P Îæç÷ Lý÷àj÷e68d÷ŠÖ –%÷·  ×-r‚ Á W þÁ ÷X÷œ&÷e68 ææç÷ ðü–%wvWpÁ ñ ú-w2—- —- 2w  ò†À.8Á|  ÷ ìâ7®7¢& æ8f÷ ìÉ•ñ•81ŠÀ‚Àe÷ vŠÈ•Àl€ È•8÷jb÷e8\÷XX÷e R÷NN÷eH @týÿÀm:fÎEøÿæ& ÷ XìÆe� W ìƒ Á` Àe ø ÁmþÉ• €  ÷Êîòdòd ÁÔWp@Á ñÌú-Á ±ü-Á ñ¾þ-Æe ææç÷ °û÷ú –%×-ô ÁŽWp@Á wú-ê Á wü-Ö Á wþ-h ÷h´ ÀÀ ‡wìæDÎe…W!ç  WpÁ w,ú-¤ € öAWpDà À.8�Âú-÷ ^á3 ú-Á 1 ü-Á 1 þ-@Ö ‡w†ë÷R ÷—-çq—- 2÷Þ êo÷ ÁþÀ68@àÀmh ‚ææç÷ ¾ú÷RÜ÷e68Ö÷ü nw¨@÷ ¸á7Àwœ·š— DÁ>= BÔ÷„¤À68ÀíœÀm &æ’÷ Àô愦f& ÷ ¬èÆeÀ ÷Pp÷h –%À‡×-@ Îæç÷ *ú÷¾H÷e68B÷h Ö –%÷. ·  ×-P � Àú þÀ ÷6 ÷z÷e68þææç÷ Îù–%yÀ À ð ö3`€   2 FK S†À.8Á° ÷ Ðß7 7˜& æf÷ ôèÉ•ñ•÷€|÷ev @týÿÀmjfÎEøÿæ& ÷ xéÆe� W ìÀBÀ Á ñ<ö3À ð6ø3wö34÷e.?Š*Æe ææç÷ ù÷R –%×-L ÁøÁ @À 7ö3@@À 7ø3Ð ÷Þ À$ ‡wvé¦)æ…W!ç  @À À 7,ö3� ÷Eöø öe1vö ƒà Âö3Âe¾¢Ä• @À À ö3Âe„¢ƒE „’� W þî>‘À.8�Âö3÷ |Þ3 ö3ƒà 3 ø3@Æe‡÷F¦÷ þ&×-²×-d 7 *Ö ‡÷€w~À68ÀíÀm„&æ ÷ 8ò7òξ=÷ dnæÀ;æ÷ xñ7ÜÀ l(>ÎÎæç÷ ¨÷Ö VÎÄ=QÎÊ=N÷Ð=ª÷J°÷Ô=œ÷ J¢÷Ø=Ž÷,J” ÷Ü=€÷8J†÷à=r÷pJx÷h*Îä=%×-VƒÎê=Îð=Îö=Îü=Î>Î>×-*ƒÎ>Î>Î>Î >÷ ˆ–%×- 8À68Àí Àmzæ÷ .ñ7è÷º;âÎæ&>ææÔæ ææº;æùÿ÷ åκ÷ 0Æe ÷ ô×-àÀš÷ Ö Ö &÷ Ö ‡æ ×-ø÷L>T÷• R÷Z>F÷•D÷l>ª÷¦æh<ææ÷  æ–%÷ ü  æh<÷ ö÷hyθ<ææø÷ væ–%÷ " æ¸<÷ ôõ÷>Îh<ææð[÷•· ÷•ûθ<ææ,÷ .æ–%θ<ææ÷ æ–%÷ È æ¸<÷ šõ÷äθ<ææ÷ ôå–%Îh<ææð%7ŠœÎ¸<ææ÷ Ðå–%÷ | æ¸<÷ Nõ÷˜Î¸<ææ÷ ¨å–%Îh<ææð÷ –å–%–%V÷„Φææ<& ÷ ãÆe w4À~ÀåÀ-T>‚· N÷÷ ë÷  ð 7 L÷¾÷rθ<ææ÷ ‚ä–%Îh<ææð/ö• À€a7 \& & & æ�æ&& æò7ææææ ÿˆÖ æ w¨þθ<ææ÷ "ä–%Îh<ææð÷ äÆeÖ ‡f×-´ ×-"ƒææ68÷ Ðí–%æŒ>÷ Fê÷ Ðï Îöæ68÷ ¬í–%Á í÷Ÿj¨ ÀÝ¢ !Z ;W @fÎ ÷ >ëÖ N×-B×-°Fƒfæþ7æ ÷ ºìÀ l”>÷JÎ÷>Îæç÷ âòÖ )÷ Ð!&÷ ¢!#W ƒÎ ÷ ’ú÷ ¨!÷ š!÷ *W ƒÎ ÷ x!÷ j! ÷ „úÆe�‡÷œ×-÷Žææÿˆ‡÷ :íw ãiF*&+ÿP&,&+ÿP–,~J  ÿÿ-P¶,†JŠJ�J–JšJ¢J ÿÿ²-Ô-F,ò-00›b2I2¶0eaek›’ØJ ÚJàJèJøJüJKK K K?È8 î8ÿPî9 = P:) B=H= N=X= `= p=v=z=€=„= Š=’=¢=¬= °=¶=PPZ<h< SY:FILE.CMDSHOWID"0>hžALL // ALLALLAREACLEARCOMMANDSCREATEEXIT_SUPERSEDEFILEGETHELPKEYQUITRECORDSAVE_SUPERSEDESECTIONSSETSHOWSYSTEMCOMHELHLSECHLCOMFILSYSRECKEYARECOMCLCOMESCOMEXCOMQUCOMC00›j2ü1l1DATADATADATADATADATADATADATARCOMSECOMSHCOMSSCOMSACOMGECOMHEHL"0>LZntˆŽ”š ´ºLB:RMSDES.HLPLB:[1,2]RMSDES.IDX Press RETURN to continue: DES: "(.BnHNThnTarget Target: RSXSYTARRSTSRSXVMSÌ>Ò>Ö>Source Source: RSXSYSOURSTSRSXVMS???Name Name: 0FINAM Organization Organization (Seq): SEQUENTIALFIORGINDEXEDRELATIVE SEQUENTIALx? €?Š? Allocation Allocation (0): 0FIALL Extension Extension (0): 0FIEXT Bucket_Size Bucket_Size (1): 1FIBUC Cluster_Size Cluster_Size (0): 0FICLU Protection Protection: (SYS:,OWN:,GRO:,WOR:)FIPROGROUPOWNERSYSTEMWORLDŠ@�@–@ž@ Owner Owner: [0,0]FIOWNMagtape_Blocksize Magtape_Block_Size (512): 512FIBLORewind_Magtape Rewind_Magtape (No): NOFIREWNOYESHALAMax_Record_Number Max_Record_Number (0): 0FIMAX Contiguous Contiguous (No): NOFICONNOYESÀAÄA€ Supersede Supersede (No): NOFISUPNOYESüABSize Size (0): 0RESIZFormat Format (Var): VARIABLEREFORFIXEDSTREAM UNDEFINEDVARIABLEVFCXB^BfBpBzBControl_Field_Size Control_Field_Size (0): 0RECON Block_Span Block_Span (Yes): YESREBLONOYESüBCCarriage_Control Carriage_Control (CR): CARRIAGE_RETURNRECARCARRIAGE_RETURNFORTRANNONEPRINTTCdClCrCName Name: KENAMType Type (String): STRINGKETYPBIN2BIN4DECIMALINT2INT4STRINGîCôCúCDDDNull_Key Null_Key (No): NOKENUKNOYESZD^D Null_Value Null_Value (0): 0KENUV Duplicates$ Duplicates (Yes if alternate): YESKEDUPNOYESÒDÖDChanges Changes (Yes): YESKECHANOYES EE Seg0_Position Seg0_Position: 0KESPO Seg0_Length Seg0_Length: 0KESLE Seg1_Position Seg1_Position: 0KESPO Seg1_Length Seg1_Length: 0KESLE Seg2_Position Seg2_Position: 0KESPO Seg2_Length Seg2_Length: 0KESLE Seg3_Position Seg3_Position: 0KESPO Seg3_Length Seg3_Length: 0KESLE Seg4_Position Seg4_Position: 0KESPO Seg4_Length Seg4_Length: 0KESLE Seg5_Position Seg5_Position: 0KESPO Seg5_Length Seg5_Length: 0KESLE Seg6_Position Seg6_Position: 0KESPO Seg6_Length Seg6_Length: 0KESLE Seg7_Position Seg7_Position: 0KESPO Seg7_Length Seg7_Length: 0KESLE Data_Fill Data_Fill (100): 100KEDFI Data_Area Data_Area (0): 0KEDAR Index_Fill Index_Fill (100): 100KEIFILevel1_Index_Area Level1_Index_Area (0): 0KELAR Index_Area Index_Area (0): 0KEIAR Allocation Allocation (0): 0ARALL Extension Extension (0): 0AREXT Bucket_Size Bucket_Size (1): 1ARBUC Contiguous Contiguous (No): NOARCONNOYESNIRIPosition Position (None): NONE 0ARPOSCYLINDERLOGICALNONEVIRTUAL�IšI¢I¨IExact_Positioning Exact_Positioning: NOAREXANOYESøIüI4Plˆ¤ÀÜø0Lh„ ¼Øô,Hd€œ¸Ôð (D`|˜´Ðì$@\x”°Ìè < X t � ¬ È ä FILE.DESALLAREAFILEKEYRECORDSYSTEMð-¼-8-Ú-ø-î-ô3ö-Š-Ž-%DES-I-ID, Version 2.003?CLEARCREATEEXIT_SUPERSEDEGETHELPQUITESAVE_SUPERSEDESETSHOW×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ ÜäQ Àÿ ÔPRLTÿ ÌPRâUÿ ĘRTxÿ ¼ªRDxÿ ´¼RLxÿ ¬ÎR@|ÿ ¤òR0lÿ œS(lÿ ”(S‰ÿ Œ:Sdˆÿ „:S*Šÿ |LSdˆÿ tLSú‰ÿ l^Sd‰ÿ d^Sdˆÿ \pSdˆÿ TpS¾Šÿ L‚Sdˆÿ D‚SÌŠÿ <”Sî‹ÿ 4”Sdˆÿ ,¦Sdˆÿ $¦SÚŠÿ ¸Sdˆÿ ¸S6‹ÿ ÊSdˆÿ ÊSÄŠ¦Þ5Îe‡w VÁ,… Bv ù    ù ‡‚Ê5ôùB‡w¶ù ꄦÊ5‚ú‚‡ò û¦¦‚ Ž (Ê5(ÊUW¬ ‡Ä ò ƒ Ä ó  €ææwÿˆóE€Ê5 ÛÊE Ž‚ØÖ ‚ÇW¬ ͇Ê5 ÊÄ È„,ÅÊE éÒQ2K>M„L2Lßî&wôýÊEò ÊU ‡æ&W¬ )‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ æ00›r2I2¶0eaek›’æ)ÿˆÌ‹€ÊE ÊU±‡æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w (…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ „W ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡w TÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w   B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡w ÄÁ w ºÁ& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡&æf…Þ ƒ„…‡&æ¦ff… Þ �‚ƒ„…‡›r[q›r[qŽÊPˆQBÔ"K&K*K.KhQFLèP€BB‡àÀäQÒQ›r˜ÆðÀ@öQÒQRIqäMúSðà@äQRIqÿMTðà@äQöQIqÿM"TðÀÒQäQU(U6T LT>RÛBa+�LTPRtRBaAK+�LTÜ>RbRBaÀÁ7�LT>RPRU,7�(l†RSBa)K7�(l ˜RtRàRÛ£>�Dx܆RªRBaGÈA�DxØ †R¼RBaHÈG�DxüÎR†R˜RBaIÈI�@|$ ¼RÎRBa*ÍP�(lòRtR†RBaPÈP�(l´ àRSÛœ,V�(ltàRòRÛ²X�dˆ(S,R""?TX�dˆS:SôXRZ�dˆÈSLSÛ."\�dˆ`S^SÛ/"^�dˆ$SpSÛ1"`�dˆŒS‚S4"c�dˆôS”S6"f�dˆÔS¦S"i�dˆ¤S¸S"l�dˆÌSÊS"o�dˆ|S(S"„L4M4MÞS>M„LÞS M„L„L„L„L„LlQÀ‚¸Pà‚¸Pà‚¸PÀ€¸Pæ®j¦¦& ¦ ¦ ÷ Ø·Æe ‡wÔ¸æ ×-JÙ8JD ×- Ù AWpÁ ñ ú-8f÷ –Ì… Ö óæç÷ ˆÌ6WpÁ ñ .$�WpD €.Á 1ú-À Á p.ü-à À 3.þ-2 .1 .0 .¶ ÜÖ ×-ºØpJ4 ×-®Ø AÁ Á ñ ö3)f÷ ¤Î… Ö ôæç÷ –ÎÀ À ð ú3à ÁÁ Bú3ÀÀ °ö3 ÀÀ 2ü3ø31 ú30 ü3„ èÖ ÀJØ J ,J J+ 7 ØÀØ% ƒÔæ¦æ Á� fæ68æûÿ÷ >µ÷68ãwtâÎæ÷ „ À Àmì×7ÖׯeØÖ ‡w^·Æå÷ªJ¤×÷ö×÷ À°ÔÀ ÀeªJ7ˆ„(w² Ô×Àœ À À lnk&ææ2÷ À7b×-Ô  ×-ÔwÆÎ æç÷ <Æ÷†×Ö w²ÀLâ÷ @­7Hâw· À*×ð X ÀÝžÂ&æ.k&æ×& ÷ ´Æe †Â×-,×— ÃÀäÖÁÈÀØÖp †wÔ C ü‚×-¸ ø— $ÃúÖÃe1 ÀÒ@ Š €À À ö3 ÅeD£ƒ· ¾ÖD“‚ — þí Ñ ƒ ‘K�wp ¦&÷ \Ö l—-&÷Ôà€Öd—-&2$&ææ2÷ à¾7&×-âÒ ×-ÔÒ Î æç÷ Å÷NÖÖ 7 öÖ ææç÷ æÄw ð• +€  ùÀ Ö7RÓ·ÂÀààÁ68àÁmNàW ‚f&¦÷ .´wÆà÷m¾àÀà æ &¦÷ ´÷ªà¬à÷e ¦à7 ~Æew¢&ææ2÷ ¾7b×-Ò Î æç÷ LÄ÷–ÕHW ×-úÑ Î æç÷ *Ä÷tÕÖ ÷tÛ÷e� À68Àí,àÀmœßæ"à÷ P¾7ðiŽ.÷ ò d—-&7 DÒ7 ¬Ó7Š¬Ó ÀÜtýÿÀmÀ&æœÎEøÿæ& ÷ Þ³HÀ68ÀíÊßÀm>ß7 ÷ œæ˜æ¶ßææ:k÷ |²À ˜W  üÁí˜ßwr· n÷Žß7`Šß—-.2÷åT÷P¶Ñ÷²*LÎ¬Ñæbßæ²*÷ ²÷8lÔ÷n,*÷bÔúÒ7 $–%ÆewFö6ß×-VÔB —-&„ 7 úÀß÷ ª7ßwè·ê@ ÿ‚— 7 Ô ·ìÞæ æç÷ ÀÂ÷ Ô–%—-& —-&2÷•ìÓ÷œ°Ó †÷•ÚÓ7  Ówê· ¤ÞÀ Þ6œÿÿ6Š —-(·ˆÞæ æç÷ \Â÷¦Ów4ÀnÞÁ68àÁmÜÝN¦&æ)÷ ä°6 ö €  · 8ÞÎ æç÷ Â÷VÓwú ö @týÿ‚a€`fÎEøÿæ¦÷ ²Æe� W êÀÞÒ6—-wÀÀíÒÝ€mæÈÝæ ÷ r° à €  ·ªÝöšÒ Î æç÷ xÁ÷ÂÒÆe i¶ öà Ž ææ:÷ °6 ö €  ·ZÝöJÒ$Î æç÷ (Á÷rÒÆeA÷8ÝŽÎàææ ÷ º¯6& ö &€  · Ý·& ÝÎÝÎàÀîÑ&æ2÷ „º·$ìÜ ×-€Î·ÖÜöÆÑ,Î æç÷ ¤À÷îÑÆeP¶öe�Á @týÿÄ,„aafÎEøÿæ¦÷ ’°Æe� v êö „„ 00›z2ü1l1DATADATADATADATADATADATADATA—- w· dÜÁ`ÜÀ@àafæ ÷ ü® Å €  · 4Üö$Ñ0Î æç÷ À÷LÑÆewðv•"6Š#—-")ö,—-",ö$A—-"R6 !—-"Wö—-"Eö—-"Dö öžÐ0· ¢Ûι¶*¶m*€*týÿÁ0�a@`¦*ÎEøÿæ& ÷ x¯Æe–%wôþ—-< —-<2 ÷•vÐ3— ÷•iÐ,— ÷•\Ð%— "÷•OЗ-< ÷•8З ÷•+Ð — ÷•З ÷•ÐwÞÚÆewòü¶ ·ÐÚ·¤ 7 ¢ Æe—-& —-&2÷•ÒÏ·–Ï —-&÷•¼Ï7 ‚Ïw–6 —-& w†¶ ÄrÚ· nÚÀjÚ ÜÿÿW![wL×-|Ï÷ F¥÷ F¥7HÚw · — — ,ZÀ ×-NÏ ÿ† ‡7Úæwˆû÷¸-â ÀôÎÁúÎL÷Ô ðÎwPìÎ×-Ð · èÙÀäÙ ÜÿÿW! öW!, 7ÊÙæ æç÷ ž½÷èΖ%×-âÎz×-ÐÎÀ¦Ù÷ –¤ÀœÙ÷ ’¤7”Ùwj ·l — — ]7xÙæ6ÀL ×-�Î ÿ† ‡7VÙææç÷ *½÷tÎÿÈÊ –%w7  ×- 9· ,ÙÀ(Ù ÜÿÿW! ö· ÙW!]*7 Ùæ æç÷ Þ¼÷(Ζ%—-&÷nÊàÍ÷jÊÜÍ ÀÜtýÿÀmª &æœÎEøÿæ& ÷ ȬÆeö5÷•×Í[—-&W÷•ÇÍSׯ–Ø'÷ p ÷e†ØÀ‚Ø7œÿÿZ 7ŠW ÀrØ÷ f£7nØwD ·F ÀPÍð-8 '‡ð-0 #‚×-. ÷~Í ÷e —-&  Àß ÀE?� ÿÕú —-&ÿÅê 7 ê ææç÷ Ü»÷&Í–% ÂÝn  ÃÝp  ÅÝt 6 ö�z 6 ö�z ÷ ª =¦æ˦æfk¦æüÊ& ÷ î§Æe †ÀÖ ÷ Ë ÷Ë  ÷öÊ ÷èÊÀ68Àí¾ÕÀm.Õ&æ´Õ÷ â³7‚À–Ê÷ z ÜWtýÿÁmhN&œÎEøÿæ&  ÜWtýÿÁmHN&œÎEøÿæ¦÷ f©Ö w.—-& wF¦æ`€/K À‹Æe‡w¨¤Æå6 � WpÁ ñ ú-wÖæF¦÷ ªµö&Å6 —-*F<¶ öÅ öe  þ‹ � ÷ ËÎ& ŽŸ÷ Œ¸Ö ×-âÄþ‹ h †÷ ÚÊ  ÀÝSÃÀ 6ööºÊöe¶Ÿ6ж(ö Ä öe À�B  ÷ Hå66vÀd�‚÷ Jå6v¶vp~ ö5CöJÄ öe  þ‹ � ÷ 2ÊÎ& ŽŸ÷ ¼·Ö ×-Ä þ‹ Îæç÷ ¬²ÆeL †÷ øÉ  ÀÝqÂÀ 6ööØÉöe¶Ÿ6ж(ö¾Ã öe À�B ÷ fä66vÀd�‚÷ hä6v¶vp~ ¶ –%wþÆe‡ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~ Bucket_Size (FormatNull_Key OrganizationPositionTargetF$”Œ\ ¢ ü ¢ Seg0_Position Seg1_Position Seg2_Position Seg3_Position Seg4_Position Seg5_Position Seg6_Position Seg7_Positionÿ 8á˜RTxÿ 0áªRDxÿ (á¼RLxÿ áÎR@|ÿ áòR0lÿ áS(l00›‚2I2¶0eaek›’w¡Æå ×-¬Á€qΗ#AæLw÷ ,§÷ ¶¬ Ö "ÎØËæ68÷ ŽªÀŸRÌ ?Î`w÷ ¸#öÄ ænwæ÷ ¾© ÆeÀwL   Îæç÷ æ¯ö Ö –%–%¼×-Á÷l ÷ d 7 d 7 Z ÁV WpÁ ñ ú-· L · B óÀB 7< ÷e4  ‡· * ÷ ÜÆ÷ ËΗ#bæxw÷ B¦÷ Ì« Ö w¨ ÎìÊæ68÷ ¢©ÁfËC@’ ?ÎŒw÷ ,·AÄ 9@÷ @–7DËw¾ ·” — ÷2ËÎæç÷ ¯"÷-ž   †÷ – ÷ËÎæç÷ æ®÷0À÷(ÀöÎfÊæ68÷ ©÷` æÊÖ ÷ÜÊö–%›æFæÊÊ÷ > ÀÂÊt 7( ÷ 7  Á WpÁ ñ ú-wÎFæò÷ <°Àº¿7 ÷e ÷ Ü7þ÷eøׯô÷Ð÷ È7Ü÷e Ö÷Ò®ÀÌ7¦÷t¿Â÷e"¼7 Š7 ¨ Àß®À ×-š‚7`p· Ž· –ð÷ hwÐÎF& ÷ Ȳ÷,¿x÷erÀn7R÷Åb÷e \ÁBÁåÂ,Âm4Á À r7÷÷"÷ÀÁÂ÷ °ß7 wÌ·ÊÀŠÉBÃÀ÷ xß7ÊwÈÎøæw÷ Ü÷ìî÷”Äæ÷eàÿ�VÉÚÎFæ÷ ²÷z¾Æ÷eÀÀ¼7 ÷`İ÷e ªÁ�ÁåÂrÂeÁ À r7h÷`÷:p÷6hÀPÁbÂ\÷ þÞ7Xw·ÀØÈBÃ÷ ÆÞ7wÎFæw÷ *÷èÃ:÷e4ÿ�ªÈ.ÎFæ÷ j±÷ÊÃ÷e ÷ÂÁôÁåÂÖÂeÁ À r7Ì÷ÄÀ¢÷ ž(· �7Æ÷�¾À¦Á¸Â²÷ TÞ7®wt·rÀ.ÈBÃh÷ Þ7nwlΜæw÷ €Ö Ò÷:ÃŒ÷e†ÂüÇ¿�~ÁrÀ rÄhÄ À r`÷Z· VÁNÀ rÁ · DÀ rÁ · 4Â-0 Á*À rBàÂm ·7 ä÷àÎæw÷ ôÀ¶¼7÷e ü?Šø7ô÷e îÿ•è7ä÷e Þÿ•ØÎ’wæ‚æ÷ Ö©Æe÷ ˜w„÷•„÷`¼®÷e¨ÀŸ¤@Š7Àn÷Š7 b÷‹`}÷Vδwæ¼æ ÷ †©ö —- jμw÷ ¬÷ § 7÷pJÊ»÷»÷ *7 8Á4WpÁ ñ ú-!ÎFæ ÷ N¬ÀÔ»7 ÷e ?Š7÷e ?Š7÷e þ?Šú· êÖ ×Æe wŽÎÒÅæ68÷ ˆ¤ÀŸNÆ ?Îôw÷ ²À:Æ÷ .‘76Æw¬·‚— Îæç÷ ø©Ö ö Ö ’–%ÎFæ`÷ Ю÷4»€÷ezÀv7Z÷Áj÷e dÀJÀåÁLWpÁm$ÁmBÂeÀ r75×­1÷Î)& ÷ x©÷º÷È÷ ÁþÂæÃà÷ �œ7ìwæ·Ö÷ÐÁ · È· Ä÷¾Æ÷ºÂÖ ÷ª¶÷¦²À˜ÁªÂ¤÷ FÛ7 wb·`À · X· PÀÅÂHÃF÷ þÚ7PwNÎ~æw÷ b÷ Àr÷elÿ�âÄfÎFæ÷ ¢­÷ºR÷eLÀH7,÷ì¿<÷e 6÷èê÷äæ7 ÚÁ ÁåÂîÂeÁ À r7ä÷ÜÀº÷ ¶(· ¨7Þ÷¨ÖÀ¾ÁÐÂÊ÷ lÚ7ÆwŒ·ŠÀFÄBÀ÷ 4Ú7†w„δæw÷ ˜Ö Ò÷R¿¤÷ežÿ�ĘÀD¹7�÷e ŠÁ^Áe�~7z÷e tÿ•n7j÷e dÿ•^· .Îúwææ¸æ÷ X¦Îxæôæ÷ H¦Æe÷5àwÁ ÃWt ÀðÀmèàÁåÀ 7rÜ7î Áè Ãð÷ Šš7æwà·ª÷¨Á ·  · ˜À¸Â�ÃŽ÷ >Ù7ˆw†À¢$ÂvÃt÷ $Ù7rwpÀ ÷d^÷\Vw`R÷-TLƒÎ& ÷ ئ÷"¸Æew÷2,÷.(7 ÷- †÷÷í À ÀíþÀíô7þÀ¸ÂÂöÃô÷ ¤Ø7öwôÎ(æw÷ 7 ÊÖ · ìÖ wØ÷7 þÁú@À À ð ö3NW þK†ÎFf÷ 2«÷’½â÷e ÜÀØ66 À‚ƒ ÷ 2Ø6 vÀd� ‚÷ 8Ø7’v ¶÷D½”÷eŽ¿Š€ÁÂ÷ LØwlÀòÁ@à Ál `ÉàÁ· VÖ ª–%ÀÆe ‡Areas defaulted: ARDEFNOYESfw jwBucket_Size (2): ARBCK!The primary index has a depth of  Key 7Average number of duplicates per record for this key? NUMDPThe index for alternate key  has a depth of ÿ ÕPRlTÿ üÔPRhÿ ôÔPR˜hæwB˜æ$w:˜wΔ÷ ¨  ‡À68ÀíTÀÀmÄ¿&æJÀ÷ xž7€À68Àí4ÀÀm¨¿7r²÷ n²÷²*bÎd²æÀæ²*÷ z“÷N$µ÷ µ¸³÷�H²¶³–%×-µ€ ÷ ,»×-V¿÷ Pó×-µ–%‡ÎPæç÷ &7 ÁWpÁ @ú- 7î÷eèÿ�öâ· ðí7 êÀæÀ À ö3 7Æ÷eÀÿ�κ· Èîê´ÂÂe·@´À¦´'÷œ·– ÷ ÀœÀ ú-À�À 7ô-v÷epl÷exëÀrÀ 7ô-ò³÷eì³ÀNº3×-J ÂR ·ô-8÷e2·,?(÷4À0À ö3À$À 7ò3 ÷e¿÷e ëÀÀ 7ò3†³÷e€³÷â÷e3Üÿ•Ö÷Ò÷eÌÿUÆ÷ }η ÊÀÆ7œÿÿÂ00›Š2ü1l1DATADATADATADATADATADATADATA7Š¿÷ª÷e*¤? ÷œ÷e-–ÿ�¢�7ŠÙ±×-t³# ×­n³€ ×­c³ÿ-³×­U³÷³z²÷³r² †÷³T÷PP÷L`²ÎææDx÷ F’–%À$³7(×-$ æF,÷ ¸¡Ö ×-ø²wŒ×­ð²×­é²öÿ-ˆ²Î䲿æLx÷ ô‘–%׭ɲ÷’²î±÷вæ±×­´²Ü÷€²Ä÷رÀ×­¢²" @týÿÎe}fÎEøÿæ&Îe}fÎEøÿæ& ÷ ‘Æe÷ D‘Æe� W ß×­W²#Á@týÿÎe}fÎEøÿæ&Îe}fÎEøÿæ& ÷ º�Æe÷ ö�Æe� W ß×­ ²#Á@týÿÎe}fÎEøÿæ&Îe}fÎEøÿæ& ÷ l�Æe÷ ¨�Æe� W ß×­½±#Á @týÿÎe}fÎEøÿæ&Îe}fÎEøÿæ& ÷ �Æe÷ Z�Æe� W ß÷†š°În±ææð÷ ~�–%À\±Àe7ô°7V 7 bÁ^WpÁ @ú- 7<÷e6? 2· @î7 :À6À À ö3 7÷e? · ïÆe‡ SY:FILE.DATÿ ÐPR˜hwü”æ Ã× Aæ¼�÷ œ¥÷ ¢  W×-€µdÎÊ�÷ ¬÷nµ)Næ–-Á À r&÷ º�æ ÷ ª — ×-Àà ÷.µÀr¿Àe687ö¿÷ ò¿ÆeÖ ¼— wV÷ JÚ´÷ı÷ ×-ø´wÁW LæÐ�÷ hš÷ òŸ w>οæ68÷ Ê�ÀŸŽ¿ ?Îä�÷ X«.Îæò�æ÷ �Á7 �´ Ä÷€´ 7 t´à Îæç÷ £÷®¾8¿÷e682¿Á7 N´Ö –%–%±÷J´÷±÷ N7 2´×-6´Q÷,J´÷ê°÷ 2×-´E×- ´€ ÷8Jà³÷¦³÷İ÷  ×-ö³€ } ×-ܳ€� !v q‡÷pJ¤³ †÷˜³÷�³÷ |°_— aÁW Tæü�÷ ª£÷ °ž Ö }×-гd)ÀV³ JÀ ‚ ,JÀ‚ JÀ‚ 8JÀ‚ pJÀÿÿÀ$‚÷ ä©÷6³N÷ TŸ— ×-ô½Á ÷³ÀV½Àe687Ú½÷ Ö½Ö ©— ÷ — |À68Àí¸½Àm(½&殽÷ Ü›ÁW jÅ S— ö×-нÎ*‚÷ 6˜ Îæç÷ N¡÷˜²ÆeO÷ ¦� IÎ̼æ68÷ ‚›6ÄŸD½¡?À,²÷ ©Žæ ÷ z× ×-½Â� ÷6²Àz¼Àe687þ¼÷ ú¼Ö Ö ¯Næ ÷ <× ×-ܼ ÁÁÖ “–%Ö ‡wD‘7 ¶÷¸±¤±÷6‚¤÷�" 7Š�×-¢±8Jd7 †×-b±[Ã× VæD‚÷ ¸¡÷ Àœ wT×-š±dÎZ‚÷ 6¨÷ˆ±=ÀR¼÷ F‡7N¼w8·6— À°»Àe6874¼÷ 0¼Îæç÷  Á W ‡Îæç÷ èŸ÷2±Àv»Àe687ú»÷ ö»Ö ÷±ÃwÐ÷ ÌÖ §×-±wd×-¸ÿú‚Ű wJ×-†°æ &÷ Z¡–%À°÷°7 ¼°æ`‚&æ ÷ žÀ€À Àm€°7j°wê7žf7Šc÷-\\ ÎTæNæN&& ÷ |�ÆeÀ w`7 0÷r° ÷e÷Ÿ7ŠÃ÷ ÷ × O÷ øLÎp‚÷ < ÷ D› d×-"°dΊ‚÷ ¾¦÷°åÀÚº÷ Î…7ÖºwÄ·¾— Îæç÷ ˜žÀ,ºÀe687°º÷ ¬º×-˜ ‡Îæç÷ rž÷¼¯÷ºŠº÷e68„ºÖ ´÷¦¯Ã®×-œ¯3ÂZ  ,ÀL¯÷ •÷ –š×-z¯YÀ4¯÷ ’œ ë×-`¯L· &À"À Àm"¯7 ¯À · � B ÒÁôÁ Àö@à7ð÷eêÀæÀ Àmæ®7ЮÀÌ®70ö®70ò®70î®À²®÷ r”÷ ü™×-à® Àš®÷ ø› ë×-Æ®wt· ˆwþ7 €÷8J€®÷ôÊh®Æe„ !‚w®ý×-h®pJ ×-€®€ ÷ Àì ×-n®€wp7 .×-<®WÃ× Ræ�‚÷ `ž÷ h™ Ö ‡×-B®dΨ‚÷ Þ¤÷0®9Àú¸÷ îƒ7ö¸wà·Þ— ÷X¸â¸÷e68ܸÎæç÷ ¬œÁ¸W ‡Îæç÷ ”œ÷Þ­÷"¸¬¸÷e68¦¸Ö ÷È­Ãw€÷ |Ö «×-´­W×-lÿS‚Âd M×-n­æ f÷ 2¡–%殂æv­æ ÷ æšÀFÀ ÀmF­70­'70V­70R­70N­À­÷ Ò’÷ \˜×-@­yÀú¬÷ Xš ë×-&­l· ìÐ7 æ÷pJæ¬÷’ÉάÆe� B ±ƒÀÒ¬ 8JY pJV Âݾ JæÆ‚ ,JæÞ‚æø‚æçæ ÷ .šÀ‚¬:w0ª¬'w0¦¬$w0¢¬!Žæ¾‚¦&& ÷ R‰Æe ‡ÀN¬÷ ’÷ ˜—×-|¬À6¬÷ ”™ ë×-b¬ · (À$À Àm$¬7¬ÃÆe‡ SECTION: HLSEC File Placement: HLPLANOYESê� î� ATTRIBUTE: HLFILHLRECHLSYSHLKEYHLARE VALUE: Seg0_Position Number of keys: NUMKYStarting Key  Number of Segments: NUMSG Number of areas: NUMARStarting Area SourceStarting FILE section Starting RECORD section Starting SYSTEM section ÿ ÊPRâU00›’2I2¶0eaek›’æwB˜wÊ”÷ °  ‡ÁW æê{÷ Š¥÷ �  wH×-jµdÎü{÷ ¬÷XµÁÖ á÷À:´À68ÀíÀÀm„¿Á w�*´—-÷U´7Šé³æ¶,ææDx÷ 2”–%Àܳ÷Eâ³   æ¶,÷ ¦£÷ð´Ö ×-ê´`Î:-ææø÷ ö“–%÷ $´  æ:-÷ t£÷¾´Ö 8÷ Jˆ´÷r±Î(÷ „÷Jt´÷^±Î(÷ p÷,J`´÷J±Î(÷ \÷8JL´÷6±÷ ´Î(÷ B÷pJ2´÷ ±÷$´Î(÷ (Î:-ææ÷ Z“–%ζ,ææð÷ H“–%Ö ‡wX“· ×-è³8JW×-¬³7 ú÷þö÷è³ì7 ê÷æÃà ?×-€³·ÎÁÊWpÁ ñ ú-0÷¼æ|æ°æª÷ ¡7 ª÷~³j³×-B³ÎæŒ÷ ¤Ö ΀÷ Ò×-„³c· xÀtÀ ÀmF³70³âÆe‚ ƒ ¿×-2³pJ`×-(³7 D÷þ@÷4³67 4÷0Â* H×-ü²wÀÀ À ð ö3:÷æ |æüæö÷ h 7 ö÷ʲ¶²'×-À²ÎæØ÷ ‚¦Ö Àš²7<Ʋ7<À²Î¸÷ ×-¼²S· °À¬À Àm~²7h²ØÆe� B ¶Àj²  J‚  ,J J87 vÁj †æ| ,Jæ|æ*|æçf÷ ¼Ÿ÷"²²À ²7<4²7<.²Î&÷ x×-*² · ÀÀ Àmì±7Ö±ãÆe‡ File_Name: HLSFNKEY AREA FILE RECORD SYSTEM ÿ øÐÎRn~w‘”‡Ãp¼Áp¼DÀ68@àÀmØ»&f÷ ŽšNæP¼f¦& ÷ xŽÆeÀ ŠξJæçæ÷ ÄžÆe‡÷ ¼7 ¼Ä!@Ζ‡÷ F¡÷ Lœ ×-*±dΤ‡÷ Ƨ÷±çNæ–-Á À r&÷ d™Îæ÷ Tœ— ×-º»Ä ÷ذÀ»Àe687 »÷ œ»Æe½— 5÷ Jа÷t­Î÷ †ü÷Jv°÷`­Î÷ rü÷,Jb°÷L­Î÷ ^ü÷8JN°÷8­÷°Î÷ Dü÷pJ4°÷ ­÷&°\— eÁW QΪ‡÷ F ÷ L› V×-*°d)Àö¯ JÀº‡ ,JÀÀ‡ JÀƇ 8JÀ̇ pJÀÿÿÀÒ‡÷ „¦÷Ö¯ÆN÷ ô›— ×-”ºÁ¸÷²¯Àö¹Àe687zº÷ vº¬— Î÷ pû— Î÷ –%‡wÒŽÆå÷ú÷؇Ú· ÖÀÒ7œÿÿÎ7ŠËÀ¯7η ÊÁÆwœÿÿÂ7Š¿÷䇺· ¶Á²wœÿÿ®7Š«7 ž÷ªJĮêJÁØ«Á Á`wtÄ`Á`¬ @À À`n·l€7j·h4— †@À À`nwDw’B7Š?€@ 7@6÷0@À À`nww€@ 7@ ÷ ÷ ì ÷úÀ.® ÜWtýÿÁmÈf&œÎEøÿæ& ÷ ÞŒÆe ÁÀú­<×-¸wŠ7 ”Ãà­Àœ À À l$ˆ÷b†zÀb†Áx‡ ÷ pƒw@æ~ææ2÷ –7T· PÀL7œÿÿT7ŠQÆe}ÀÌ­74÷ <uÀÀ Àm\­74÷e. Àß(&ææ2÷ l–ö”6ŠÁH­@À Àm"­Bn·ô€7ò·ðöê ¶"—- ÿÿ—"ÿÿÄø‡Å Äb†Áx‡ ÷ ¢‚7¦á@€m7š÷e”÷l†€Žæææ†f&æ ætæl†æ÷ÿ÷ ô‰Æe ÷n,f÷^«H÷ì©Pw$×-¬ Àݼ¬  ÷\†$À\†Á6wê÷ú‡w² ÀÝ”¬ wœöZ¬  @týÿ ‚a€`B ‡l<ˆ&fÎEøÿæ& ÷ ôŠÆeÀ CÀ€a@`È•RB&fÎEøÿæ& ÷ ÌŠÆeÀ /À€a@`È•W.&fÎEøÿæ& ÷ ¤ŠÆeÀ À€a@`È•E&fÎEøÿæ& ÷ |ŠÆeÀ À€a@`È•DÀ€a@`È• � W › vöeÃB Á�a�`W¢ À€a€`¬ v’ 6Š œ°� ‚ ¶ äà~Äe! ÓÀ ÁÝT«W  ö öÀ6 6  ÁÝ/«W Äö Á À 6   ÂÝþª— Åö  À 6   ÃÝÏª× Î Ã Àö  6 €m@a€c€m €m€m€m@`€`À`7ü÷eö÷‡âææþ‡¦ 戦æŽafæü‡&戦æ*Ža¦æü‡f戦$æ:Žaææü‡¦(戦2æJŽaææˆæ æ‚æ‡æãÿ÷ ‡Æe<÷ˆ\7 fy÷|‡~÷‚‡zÀ¤©ÁA @@7p÷¶-LÀŒ©ÁA @@7\×-¨©À|‡ÁJ ÷ æÉÀ6Á: ÷ âÉ77(÷í "×-t©ÀÁ ÷ ²ÉÀÁ ÷ ®É7Ò7ö÷íîð÷l†¶ÀäÀmâ7¸÷e²ææˆæÊæÂææ ˆæ¼æ´ææ"ˆæ æ‚æl†æóÿ÷ †Æe$À\†7ZÁpW ~‚W ‡÷•'Fw�C÷•'>÷B À. ÷ É707.÷í(÷€†÷‡æææææ ææ‡æùÿ÷ „…ÎæìææîæäæÒææÞæÊæÄæ æ„æ¼æóÿ÷ H…À¸Àmª7ª÷e¤—-V & æTIææÿˆÆe( & & æ æzæt& æX†ææææ ÿˆÆe*—-,(÷J<§÷F4§÷(§æ:-ææ$÷ ؆–%÷ §  æ:-÷ V–÷ §Ö Ö Æe‡ID SECTION: HLSEC ATTRIBUTE: HLFILHLRECHLSYSHLKEYHLARE (Explicit) -1 , (SYSTEM:OWNER:GROUP:WORLD:) [,]VDT,B*ff(00›š2ü1l1DATADATADATADATADATADATADATAPx(Px(Px(Pxÿ ÒÄPRgæ$w^¤wæ ÷ ̬ ‡÷ä ×-à ævv÷ ¢±7Þ ÷ ¦¬ Ö ‡×-€ÁdΈv÷ ¸÷nÁ÷¤ Ö Þæ¦Ëæ68æ æšËæ¤uæûÿ÷ Nž÷Ìò÷Ìî÷~Ëê÷ JÁ÷ì½÷ ú ×- Á6÷JêÀ÷Ô½÷ â ×-Á*÷,JÒÀ÷¼½÷ Ê ×-ðÀ÷8JºÀ÷€À÷ž½÷ ¬ ×-ÒÀ÷pJœÀ÷”À÷ €½÷ Ž ×-´ÀÆe ‡Î\æ¤uæ æPæ68æûÿ÷ –�÷@ÐÊ÷8VË÷0LËÁÀÊÀ68Àí@Ë@`7®÷ ª÷2Ë @Àe687ž÷ š7 ¢÷ ’÷ŸŽ–· ”×­Ž Á-ˆò‡÷vËÀ68ÀíøÊ@`æðÊ÷ ©7`æ¢væ÷ j¨7>  ƒ÷ @÷Ÿ<D×­@ ÷ À,ÊÀe687$÷åÀÀí7· ÷ ”Ê· �ÊÎüæôæ æðæ`*æûÿ÷ ¨œ÷`*Œ¾÷�ÚоÀ68Àí`ÊÀmÐÉæVÊ÷ „¨7Æ×-° w¤7Š/¾÷>¾÷•6¾Î¶,ææ÷ lž–%÷ ¾  æ¶,÷ ê­÷4¿cÎ:-ææø÷ Bž–%÷ p¾ æ:-÷ À­÷ ¿Î¶,ææðEÎ:-ææ,÷ ž–%÷„,É÷68B¾÷„:¾÷"×-wÔÎ:-ææ÷ Ö�–%À¾$ °ý÷òç æ:-÷ F­÷�¾Î:-ææ÷  �–%ζ,ææð÷ Ž�–%Æe*‡÷Ƚ¨È· ¤ÈÀ Èð�58æ68÷ &÷68É Àm„Èæ68÷ 8§7zæ–-Á À r&÷ |¦7b w÷68ÚÈÎXæ2÷ Z©7ö½ Î:-ææ÷ �–%ζ,ææð÷ îœÆe6‡À68Àí”ÈÀmÈæŠÈ÷ ¸¦7ú÷ Ω×-¤½Î:-ææ÷ °œ–%ζ,ææð÷ žœÆe8‡À68ÀíDÈÀm´Çæ:È÷ h¦7ªæ2÷ :×-P½Î:-ææ÷ \œ–%ζ,ææð÷ JœÆe<‡Æe7p   ÀÞÇ÷ Î’7ÖÇw¤¼·DÆew þÎ:-ææ÷ œ–%ζ,ææð÷ ð›–%÷˜¼Œ¼×-"÷•´¼÷•°¼÷•«¼÷•¦¼÷•¡¼÷`*»÷�Ü»÷üº÷Р¹Î2÷ ÷L¼@¼Æe(‡wÊ›Ár¼wÈ÷e3Âÿ•¼w¸÷e²?Š®wª÷e¤À —-2ÈUÈU÷¸vš· –À’7œÿÿŽ7Š‹wr÷e*l?hwd÷e-^ÿ�nXwš»÷e”»ÿ²-Ž»÷-¬»7Š7ºfææ÷ òš–%Àл7,×-( æF,÷ dªÖ β»ææ(l÷ š–% Ãݸº Î ¦÷ ¬ÀŠ»�WpÁ wú-Ø÷eÒ?Îwú-È÷e¿�¾Ö ‚ ƒ á ÂÝqº Î f÷ è®@À À 7ö3–÷e��ŒÖ � B ìÎ&»ææð÷ 6š–%À» ÷l÷-`7º÷€À|À ú-ÀpÀ 7ô->÷e84÷eXëÁÔÀ+×-( ÀDÀ 7ô-÷e ÷-÷$À À ö3ÀÀ 7ò3â÷eÜØ÷eüë7ŠÅ¸Înºææ÷ ~™–%Î\ºææ(l÷ l™–%ÎJºææð÷ Z™–%? ع7 ø¹÷-ˆ7 B¹7 ªÁ¦WpÁ @ú-wH7h÷eb? ^ÎFæ€÷ vª÷ò¹F÷ö¹B÷e <Î& Ο2÷ x­÷Ø¿B÷e< Àß6t 70÷¹8÷e2÷. 7 Àd Ã÷ dÚ7w ÀÁÂ÷ jÚ7Öwö·ôÀư ÷ ° ÷h¹´÷e ®Î& Ο¤÷ ê¬÷J¿´÷e® Àߨt 7¢÷4¹ª÷e¤÷ ’7 �Àd Ä÷ ÖÙ7€w~ÀrÁtÂr÷ ÜÙ7Hwh·fÀ8°÷ 4° · VÆew¤þ7 JÀFÀ À ö3 7÷e? · *ï ÀÝ · ÷€‚¸  ÷t¸À ÷@h¸×-d¸ ×-â¶ÿÿ×-ܶÿ7 Ò¶7 Ð¶Ö ‡  File_Name: HLGFNDATDEFDESDFNFDLŽv’v!–v šv,žv7FILE.DATÿ lÖPRlTÿ dÖPRLTÿ \ÖPRâUw¡Ã× CæHn÷ º±÷ À¬ w×-šÁdÎVn÷ 6¸÷ˆÁ)Žæ–-Á À r&÷ Ô©Næ ÷ Ĭ!×-*Ìà ÷HÁÀŒËÀe687Ì÷ ÌÆeÖ º!>÷ JøÀ÷â½÷ ¸×-Á&÷JàÀ÷ʽ÷  ×-þÀ÷,JÈÀ÷²½÷ ˆ×-æÀ÷8J°À÷vÀ÷”½÷ j×-ÈÀ‡÷pJ�À÷ˆÀ÷ t½_!òÁW Tæ\n÷ ¢°÷ ¨« Ö ‡×-‚Àd)ÀNÀ JÀln ,JÀrn JÀxn 8JÀ~n pJÀÿÿÀ„n÷ ܶ÷.ÀŽ÷ L¬!×-ìÊÁ ÷ ÀÀNÊÀe687ÒÊ÷ ÎÊÖ ©!÷ Ї!À¢¿ Ô¦&æ �� fæ68æ00›¢2I2¶0eaek›’ûÿ÷ Æœ÷68ˆÊwüÉŽæ÷ PÆe‡ SECTION: HLSEC ATTRIBUTE: HLFILHLRECHLSYSHLKEYHLAREÿ ¤ÞPRlTÿ œÞPRâU÷ &÷ &÷ �’•’•€‡@Á(÷ ˆÆf€  Àe ÀeÉÿÀe Àe ‡ABDEFIMNOPQRSTUXYZ<>Å"BaÊ$ep|v¢­$Ê®¶ÅÏJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw vÇ&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ fzÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚bÂEÊ Ö ÌЕ%„Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ jÄ�à õ‡& æÎeLÄ6& ¦æÎe8Ä/& æÎeZy*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎeþà & ¦æÎeêÃЕ A‚¦Þ à ÷–%‡& æÎe¾ÃòA÷ äýà û‡Ð• à ü‡A÷ bE‡AÂ÷ †E‡Ð• Aæ÷ °ýAÎ ûÖ Â ÷ $Е.÷ ˜ýÂ÷ AЕ; ÷ <Ãà à‡Â ýð¥ ÿÿùÀ øw ŒÅD…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w \ÅDÅ… ƒ÷ &Е.À À À ce÷ ÀÃÀ …Е:÷ Å ù Â÷ ¢ÂB‡Àjˆ‡”ˆˆøˆ‰F‰n‰˜‰̉ ñ‰ Š.?%R-F-IFT, Illegal file type value specified6?%R-F-IBR, Illegal response given, must be YES or NO&?%R-F-ISE, Illegal section specified(?%R-F-AMS, Ambiguous section specified(?%R-F-ILA, Illegal attribute specified*?%R-F-AMA, Ambiguous attribute specified4?%R-F-ILN, Illegal response given, must be numeric%?%R-F-VOR, Value out of legal range%%R-I-NKD, No keys defined%%R-I-NAD, No areas definedÀ0Ї)>Š*~Š+ôŠ@%%R-W-CBK, Continuation buckets will be allocated for this keyv%%R-F-NHF, Help file is not available. Check release notes for the location of RMSDES.IDX on your installation media8%%R-F-BRI, Bucketsize and Recordsize are incompatible Àjˆ‡ ”ˆ ¸ˆ шöˆ*‰J‰i‰“‰¸‰Ù‰$?%R-F-IVS, Illegal value specified?%R-F-CSE, Syntax error%?%R-F-IPC, Illegal protection class4?%R-F-IRO, Illegal response, must be octal numeric ?%R-F-NKN, No key number given?%R-F-IKV, Illegal key number*?%R-F-KOR, Key number out of legal range%?%R-F-KNS, Key has not been defined!?%R-F-NAN, No area number given ?%R-F-IAN, Illegal area numberÀЇ*ŠUŠrŠŽŠ¬Š׊‹1‹d‹ž‹+?%R-F-AOR, Area number out of legal range?%R-F-ANS, Area not defined?%R-F-ILC, Illegal command?%R-F-AMC, Ambiguous command+?%R-F-KMA, Key missing corresponding area*?%R-F-NUS, Not a user settable attribute0?%R-F-IPO, Illegal protection option specified3?%R-F-FTL, Fatal RMS error; STS=%P, STV=%P, PC=%P:?%R-F-ICL, Incomplete command line within a command file$?%R-F-XXX, Unused error message 30Àjˆ‡ù|ˆù®ˆðøëˆàø%‰2?%R-F-ER$WLK, Device or file %VA is write-locked=?%R-F-ER$WPL, Write error on prologue for file %VA, code=%P:?%R-F-ER$XAB, Invalid XAB address specified for file %VA>?%R-F-ER$XTR, File string %VA contains extraneous charactersÀj‰‡”‰ ʼn!þ‰"0Š#aŠ$«Š%ÝŠ&‹'7‹(_‹1?%R-F-CON, Conflicting switches on command line9?%R-F-NON, Cannot submit files which are not sequential2?%R-F-UDK, Key specified is not defined in '%VA'1%%R-I-KRN, Key of reference is #%M, named '%VA'J?%00›ª2ü1l1DATADATADATADATADATADATADATAR-F-UGH, Input and output fixed control header sizes do not correspond2?%R-F-IWF, Illegal use of /WF with record format9?%R-F-FNN, Output RELATIVE or INDEXED file is not empty!%%R-I-CNV, RMSCNV Version 2.000(?%R-F-SYN, Null argument on %VA switch&?%R-R-040, Reserved error message 40Àjˆ‡�ù”ˆ€ù°ˆpùìˆ`ù#‰PùX‰@ùš‰0ùÙ‰ ùŠùJŠù�Š?%R-F-ER$STK, Unused error?%R-F-ER$SEQ, Record not in proper key sequence for file %VAC?%R-F-ER$SHR, Illegal file sharing options specified for file %VA7?%R-F-ER$SIZ, Invalid key size specified for file %VAÀjˆ‡Àú”ˆ°úʈ ú‰�ú3‰€ún‰pú¡‰`úÓ‰PúŠ@úXŠ0ú“Š6?%R-F-ER$RAT, Invalid record attributes for file %VA:?%R-F-ER$RBF, Invalid record buffer address for file %VA/?%R-F-ER$RER, Read error on file %VA, code=%P;?%R-F-ER$REX, Relative record already exists for file %VA3?%R-F-ER$RFA, Illegal RFA referenced for file %VA2?%R-F-ER$RFM, Illegal record format for file %VAD?%R-F-ER$RLK, Record locked by another stream or user for file %VAA?%R-F-ER$RMV, REMOVE file processor error for file %VA, code=%P;?%R-F-ER$RNF, Record does not exist for file %VA, code=%P8?%R-F-ER$RNL, Record not locked by stream for file %VAÀÒŠ‡`û‹Pû3‹@ûr‹0û£‹ ûÔ‹ûŒûGŒû‚Œðú¿ŒàúîŒÐú�3?%R-F-ER$NPK, No primary key defined for file %VA??%R-F-ER$OPN, OPEN file processor error for file %VA, code=%P1?%R-F-ER$ORD, Illegal XAB ordering for file %VA1?%R-F-ER$ORG, Illegal organization for file %VA3?%R-F-ER$PLG, Error reading prologue for file %VA@?%R-F-ER$PLV, File prologue version for file %VA not supported;?%R-F-ER$POS, Key position not within record for file %VA=?%R-F-ER$PRM, Illegal date information present for file %VA/?%R-F-ER$PRV, Privilege violation on file %VA,?%R-F-ER$RAB, Not a valid RAB for file %VA?%R-F-ER$LCH, Invalid logical channel specified dor file %VA9?%R-F-ER$LEX, File extension not necessary for file %VA8?%R-F-ER$LOC, Invalid placement specified for file %VA>?%R-F-ER$MEM, String buffer spans memory limits for file %VA?%R-F-ER$MAP, Unused error@?%R-F-ER$MKD, ERASE file processor error for file %VA, code=%PF?%R-F-ER$MRN, Maximum record number invalid or exceeded for file %VAB?%R-F-ER$MRS, Illegal maximum record size sp00›²2I2¶0eaek›’ecified for file %VA?%R-F-ER$ATW, Error writing attributes for file %VA, code=%P/?%R-F-ER$BKS, Illegal bucketsize for file %VA4?%R-F-ER$BKZ, Illegal area bucketsize for file %VA?%R-F-ER$BLN, Unused error7?%R-F-ER$BOF, Beginning-of-file detected for file %VA8?%R-F-ER$BPA, Illegal buffer pool address for file %VA5?%R-F-ER$BPS, Illegal buffer pool size for file %VA;?%R-F-ER$BUG, Internal RMS-11 error detected for file %VA;?%R-F-ER$CCR, Multistream access not allowed for file %VA@?%R-F-ER$CHG, Illegal record key change attempted for file %VAÀjˆ‡�ü”ˆ€ü̈pü ‰`üH‰Pü‡‰@ü¿‰0üÿ‰ ü6ŠüpŠü§Š8?%R-F-ER$IOP, Illegal operation attempted for file %VA=?%R-F-ER$IRC, Illegal record length encountered in file %VA??%R-F-ER$ISI, Invalid internal stream identifier for file %VA??%R-F-ER$KBF, Invalid key buffer address present for file %VA8?%R-F-ER$KEY, Invalid key value specified for file %VA@?%R-F-ER$KRF, Invalid key-of-reference speccified for file %VA7?%R-F-ER$KSZ, Invalid key size specified for file %VA:?%R-F-ER$LAN, Undefined data area reference for file %VA7?%R-F-ER$LBL, Invalid ANSI magtape label for file %VA3?%R-F-ER$LBY, Logical channel in use for file %VAÀàŠ‡ ý ‹ý,‹ýa‹øüœ‹ðüÛ‹àü ŒÐüFŒÀüxŒ°üµŒ üìŒ"?%R-F-ER$FNF, File %VA not found5?%R-F-ER$FNM, Invalid file name syntax for file %VA;?%R-F-ER$FOP, Invalid file options specified for file %VA??%R-F-ER$FSS, File string parsing error for file %VA, code=%P0?%R-F-ER$FUL, File or device full for file %VA;?%R-F-ER$IAN, Undefined index area reference for file %VA2?%R-F-ER$IDX, Index not initialized for file %VA=?%R-F-ER$IFI, Invalid internal file identifier for file %VA7?%R-F-ER$IMX, Illegal XAB series present for file %VA?%R-F-ER$INI, Unused errorÀjˆ‡ ýœˆ˜ýÕˆ�ý‰€ýQ‰pýt‰hý«‰`ý÷‰XÿŠPýKŠ@ý…Š8ý¾Š0ýöŠ9?%R-F-ER$ESS, Illegal expanded string size for file %VA?%R-F-ER$CHK, Bucket header check error; file %VA is corrupt??%R-F-ER$CLS, CLOSE file processor error on file %VA, code=%P9?%R-F-ER$COD, Invalid XAB present for file %VA, code=%P0?%R-F-ER$CRE, Error creating file %VA, code=%PB?%R-F-ER$CUR, Improper record context for operation for file %VA?%R-F-ER$DAC, Unused error:?%R-F-ER$DAN, Undefined data area reference for file %VA:?%R-F-ER$DEL, Referenced record was deleted for file %VA=?%R-F-ER$DEV, Bad or inappropriate device type for file %VA:?%R-F-ER$DFW, Deferred write error for file %VA, code=%PÀÊŠ‡ðÿôŠàÿ‹ÐÿA‹Àÿz‹°ÿ¦‹ ÿÚ‹�ÿŒ€ÿPŒpÿ…Œ`ÿ¡Œ?%R-F-ER$ABO, Unused error1?%R-F-ER$ACC, Access error on file %VA, code=%P9?%R-F-ER$ACT, Activity precludes operation for file %VA,?%R-F-ER$AID, Invalid area ID for file %VA4?%R-F-ER$ALN, Alignment options error for file %VA:?%R-F-ER$ALQ, Allocation quantity too large for file %VA?%R-F-ER$ATR, Error reading attributes for file %VA, code=%P|³<9–,?_?_}V ›r[qÀÀÿÿ$V FƒUSYSYSYSYTICLSYOVºÀÆ(P(PðFìºÀvt5 D¸DRDRDRDRTICLDRDB„ÿ¿€ ƒÀÀŒl,ÀÆ>500œÂ2I2¶0eaek›’”äPäP4 ^ W ÿSY:CMI.CMDCMIÿ˜ ì  IFL>÷Žÿ&ÀŒðŒÂÀŒ0 ô÷ „*€‡÷¢ÿl ÷žÿh ‡÷�Žÿ\ ‡ì4_æ0w𡇿wŽæ<w†Â Âw ì, ”Å¥ üÅ¥ ùÅå0B¡†€÷ à,Aa”ôœÿÿ‡w º,Ä'Å  ÅUD$†BA÷ -&�Â(÷ ÅU� ÀBQ÷ ,ÂЕ* ü‡÷ &÷ &÷ �’•’•€‡@Á(÷ n,f€  Àe ÀeÉÿÀe Àe ‡æ3ÿˆ‡w4…Åe~¦f�Þ ¦æf�Þ ¦æ&f�Þ ¦æ&ff� Þ …„ƒ‚�‡ABDEFIMNOPQRSTUXYZ<>Å"BaÊ$ep|v¢­$Ê®¶ÅÏJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw ^+&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ (þÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚bÂEÊ Ö ÌЕ%„Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ *�à õ‡& æÎe*6& ¦æÎeî)/& æÎe®ý*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎe´) & ¦æÎe )Е A‚¦Þ à ÷–%‡& æÎet)òA÷ ˆýà û‡Ð• à ü‡A÷ bE‡AÂ÷ †E‡Ð• Aæ÷ TýAÎ ûÖ Â ÷ $Е.÷ <ýÂ÷ AЕ; ÷ ò(à à‡Â ýð¥ ÿÿùÀ øw t)D…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w D)DÅ… ƒ÷ &Е.À À À ce÷ J)À …Е:÷ Å ù Â÷ X(B‡ÁÉ ÷`'n4÷2X'wô%„4 ô€÷J48'4'‡C3 3 ó€ó €É,Ä, ÍUóE€s3wü3æŽBì&�¦æ&fÃhBÑ BÀ˜þ… *ƒÅ Í‹'Â% Í¥!‡Í¥EÀàúÂ%,‡À€ý… ƒÅ D„Œ†„ŒÀ5 ‚‡õ¥  õ¥PBÄ2Ì þÂ%pÀÐÿÄ‹ñó5Jó³ J€÷ àþó J÷ …„ƒ‚�€‡@ºÿµ ºÿõÅüÿ´ÿEÍ¥ó‚A�î†A� êƒÁ Ià +æ‚3‘”à �3Ãå†Î@à Çà‘‘‘‘‘‘‘‘ð†à Ãå†Çà‘”‘”‘”‘”‘”‘”‘”‘”ó†Ö ‘” ‡w&û& æ ÷ û–%÷ `÷¬7 ª÷5† ÷ R$÷5| ÷5r w÷5æ & & ÷ ¢Æe÷5L à÷5J Ü7 \æüÿˆ÷¬ ¤ù÷¢ùF÷BR÷e:÷-6Œù ‡æ& & & ÷ ÖÆe÷ ¬# ‡Æåfæ*& & ÷ 67 ,÷ ¦# G†÷5šÎ+& & ÷ ÷ ª# K†Î,& & ÷ Æe×­Ú 3ƒ7 0÷�Î *÷ &÷²Â "wÐ÷e4ž÷-šðø ƒÎ& & & ÷ :Æe Î~Îå4æÞ¦÷ "#–% ‡Æån� B ÛÎ/& & ÷ „7 z÷ $# ‡¦)]÷ à"Î0& & ÷ d÷ žRÎ2& & ÷ R7 À*÷5°7 ÷e7 ÷e Áj@`wú Á57æ÷eà7Ú÷eÔÂ@ÁwòÎ3f& ÷ ì÷ `" †÷ €" †÷¦¦÷ ‚" ‡–%÷–’–%� B àƒ–%÷ "×-†7 |ÆewÌý×-p÷fæbæÿˆ‡÷ �ýw øw¾ø÷‚p € 7h · d ƒà ÀÁ8'ÂÈ÷ .ùwº æ$ææ ÷ dø–%€7, 7( ÀÁŒÂÈ÷ øøw„ Î$ææ ÷ .ø–%Ö ‡w>ø· ð · ì ƒà ÀÁ8'ÂÈ÷ ¸øwD æ$ææ ÷ î÷Æe‡wþ÷ ÀÁD+ÂÈ÷ ˆøw æ$ææ ÷ ¾÷ÆeÃe× (çƒ÷<‡æÔææ ÷ ˜÷–%Î$ææø ÷ †÷Æe‡IFLP.TMPIFLA.TMPIFLA1.TMP00œÊ2½2l1DATADATADATADATADATADATADATA ŽP ªTtP´ PTTtP@^P PþPdd PžPT PÄ>?àP|~PÔSY:???? TI:?IFL -- %IFatal RMS error - STS = %D, STV = %D%IFile access error on %VA%IOutput file must be an indexed file%IPrologue version number too high%IClose error on %VA%IFile access error on %VA%IRead error on file prologue %VA%IExtend error on output file %VA%IMemory exhausted%IInput file is not sequential, relative, or indexed%IRead error on %VA%IClose error on %VA%IOutput file fixed record size too large for bucket size%%IIFL-I-ID, Version 2.010%IBlock I/O write error on file %VA%ISyntax error%II/O error on command line input%IFailure to open command file%ISyntax error%ICommand file nesting depth exceeded%IUndefined GCML error%IUnknown switch %VA%IOutput file switch specified with input file %VA%IInput file switch specified with output file %VA%IMissing file specification%I/KR not allowed for sequential or relative file%IInvalid /KR value%IBlock I/O read error on %VAException record: record out of sequenceException record: duplicate key where not allowedException record: record too short for primary keyException record: record long for bucket sizeException record: record doesn't fit fixed lengthException record: record too long for maximum record sizeException record: record contains an illegal packed decimal key%N%4SNumber of input records: %T%4SNumber of output records: %T%4SNumber of exception records: %T%IInput and output fixed length record sizes unequal%I/TR and/or /PD required with fixed length output records%ISORTS error code in octal: %O%ICreate error on %VA%IWrite error on %VA%N%8SPrimary key%4SSort has started%4SSort merge phase has finished%IError with00œÒ2I2¶0eaek›’ logical unit %VA%IIllegal device %VA%4SLevel-0 loading has started%4SLoading has finished%IError terminated input before expected, but continuing%8SAlternate key(s)%8SAlternate key %M%VA%P%P,%P%D%D,%UNumber of output records: ????Number of exception records: ????%IOutput file must be empty´Ðö 0 L n � ¤ Ú î !>!Z!~!Ž!°!Ð!à!""4"h"œ"º"ì"##H#z#®#Ü#$H$ˆ$ª$Ê$î$$%`%€%–%¬%¾%Ò%ô%&(&H&`&š&®&Â&Æ&Ê&Ð&Ô&Ú&ú&'%19SRMS-11 Indexed File Load Utility%19S--------------------------------%11SFunction: to build indexed files%11SFormat: IFL outfile[/switch]=infile[/switch]%N%4SGlobal switches:%7S? or HELP%15SType this message%7S/ID%21SIdentify current version and patch level%N%4SOutput file switches:%7S/ER[:filespec]%10SWrite key of exception records to terminal%31S[or write records to filespec]%7S/LO%21SHonor fill numbers%7S/NOER[:S]%15SStop processing if input record is%31Sincompatible and delete the output file%31S[if :S is specified save output file]%7S/PD[:[#]x]%14SPad input records to outfile record length%7S/TR%21STruncate input records to outfile record length%N%4SInput file switches:%7S/CL:nnn%17SSet sort work files' cluster size (RSTS/E)%7S/DE:dvn1:[...dvn5:]%5SReassign devices for sort work files%7S/KR:n%19SKey-of-reference number%7S/NOSO%19SDo not sort input before loading°'Ö'ü'"(X(l(Ž(Ä(Þ()B)`)”)À)ê)&*b*z*´*ò*+Ìää×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ \àB Àÿ T:C’Dÿ L:CÌHÿ D:CFKÿ <:CzLÿ 4:CæNÿ ,LCXLÿ $LCèEÿ ‚C¼Xÿ ”C¼Xÿ ¸CØUÿ ÊCàU¦Þ5Îe‡w þÁ,… Bv ù    ù ‡‚Ê5ôùB‡w¶ù ꄦÊ5‚ú‚‡ò û¦¦‚ Ž (Ê5(ÊUW¬ ‡Ä ò ƒ Ä ó  €ææwÿˆóE€Ê5 ÛÊE Ž‚ØÖ ‚ÇW¬ ͇Ê5 ÊÄ È„,ÅÊE éÎB4’5Ø4†4ßî&wtþÊEò ÊU ‡æ&W¬ )‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€00œÚ2½2l1DATADATADATADATADATADATADATA¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w Z…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ XW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&æf…Þ ƒ„…‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡&æ¦ff… Þ �‚ƒ„…‡›r[q›r[q šÆ7„BNn+:,-2d8R Xä7€NN‡àÀàBÎB›r˜ÆðÀ@òBÎBCIqäM Dðà@àBCIqÿM Dðà@àBòBIqÿM4DðÀÎBàBU(UHD \D:CÜC<9qQ#�\D° (CLC<9ô&)�\D (C^C<9:d1�\D<pC(C:C<9#4�˜I‚C^C¦C*yø<�¬XˆpC”C<9g@�¬X¤pC‚C<9G C�˜I0 ¸C^CpC<9ø8J�ÈU4¦CÊC<9ÙfN�ÈU˜¦C¸C<94R�4_(CU,Ø4ˆ5ˆ5ðC’5Ø4ðCt5Ø4Ø4Ø4Ø4Ø4hBÀ‚´7à‚´7à‚´7À€´700œâ2I2¶0eaek›’æ,w6Êæw.Êæ4w&Êæ$wÊæwÊæhælwÊwnÆ÷šOÖ÷�´Õ>Ö÷Ï&Ö÷"Öæ´ææ ÷ 8ÆÆe÷ ôÕ & æºæ‚ÕæTwØ÷àÕ¶Î÷ÜÕ²Î×­ßÕ "æ& & & ÷ RÍδææ\D÷ êÅ–%÷ ¨Õwž æºæ2ÕæT÷ $ÍÆew–÷5p æ;& & & ÷ Íδææ\DÙ7 RÕæ´ææ\D÷ ŒÅÆe÷ HÕª÷•#JÕæ´ææ ÷ lÅÆe÷ (Õš÷ÞÔ×-ÕƒæVæææø ÷ >ÅÆe÷ JÕ& æ ‚÷Õ Ô×­÷Ô÷�Ô÷5VÑ÷²Íl×÷h×÷�bÔr×÷ežÍ÷-šÍðÃwš÷�HÔzÕ÷ˆÍbÕ÷^Õæ^ææ ÷ ÊÄÆe÷ 0Õw²×-Õ°‚÷ Ñ ×­'Õ æ& & & wT×­Õ " ÀÝìÔÀ-ÚЇæî÷ÒOØÔ÷�ÈÐR æ^æætD÷ bÄÆe÷ ÈÔ& w$÷ÒOÍ÷�œÐÕ÷5¸Ó.ÀÀÔ×­µÔÀ-¨Ó†÷5`ÐÀ-šÓƒ÷5PÐæ%· À � À-~Óƒ÷54Ð  †À-lÓ†÷5$Ðæ&  ÀÝYÔ  ÀÝiÔt ÀLÔ) ÀÝWÔt #   ÀÝEÔt Á(ÔwhÔÀ ÷5 *Ô÷5"ÔÂÔ·JÔÂÀÔ7:Ô÷2Ôæ¦·`Ì÷-üËR‡æ�æ^ææ\D÷ <ÃÆe÷ ¢ÓæædC·¨Óæ^ææ ÷ ÃÆe÷ zÓæë÷~Ò÷ ËÆÓÀÀÓÁ÷ 0ïÁ ÷m°ÓˆËÀ‚ËÀm¤Ó7zË· vË÷-rËÈÁ»‚7ŠŒÓæ®ææø ÷ ´ÂÆe÷ jÓ ææ´æþÑæT*÷5ÖÎ.æ>æædD÷ €ÂÆe÷ ÆÔæ(æDæŽææø ÷ \ÂÆe÷ òÔ & æ”æªÑæT÷ ˜ÉÆe÷¸ÑÀ‡ ‡f÷5¤Ñ1ææælD÷ –%δææ\D÷ þÁ–%÷ ¼ÑÎæºæHÑæT÷ :É7 ˆÊÆe÷5 Ê δææ|D÷ ÂÁ–%Ö ÷58Ñ"æ®æælD÷ ¦Á–%Î^ææ\D÷ ”Á–%÷ üÑ Î ædæàÐæT÷ ÐÈÆeÖ ÷5ðÐ9æŽæælD÷ ZÁ–%÷ ÊÎ>ææ\D ÷ ÊÎ>ææ\D÷ .Á–%÷ vÓÎ æDæ|ÐæT÷ jÈÆe Î>ææ|D÷ üÀ–%Ö ÷5zÐ"æNæælD÷ àÀ–%Îþææ\D÷ ÎÀ–%÷ ÖÑ Î æææ|÷ ÈÆeÖ ÷5,Ð"æîæælD÷ ”À–%Ξææ\D÷ ‚À–%÷ *Ò Î æ¤ææ„÷ ¾ÇÆeÖ ÷5äÏ"æNæælD÷ HÀ–%Îþææ\D÷ 6À–%÷ >Ñ Î ææ æŒ÷ rÇÆeÖ ÷5¸È,ÁÈÈ÷ÆÈÂÈwÀÈæ"æ¶& ÷ ÈÇÁ°È÷®ÈªÈw¨ÈÎ#æº& ÷ ¬ÇÁ˜È÷–È’Èw�ÈÎ$æ¾& ÷ �ÇÆe�‡÷5*Ï$æ®æælD÷ ˜¿–%Î^ææ\D÷ †¿–%÷ îÏ Î ædæÒÎæT÷ ÂÆÆe7 âÎÖ ÷5âÎ$æNæælD÷ H¿–%Îþææ\D÷ 6¿–%÷ >Ð Î æææ|÷ rÆÆe7 šÎÖ ‡w¿÷&Ï÷¸Ç"Ï7 0Ï· (Ïö5 ÁžÇÀÿBd~‰æææŠD÷ ̾ÆeÀØÎæ &æææ„D÷ ª¾Æe÷ ¶Î ææ æòÍæT÷ äÅÆeÀ‡ ‡w ¾÷ FÇWæ& ÷ Zÿ–% Z†ÁÇwœfÇ7ŠÇwœgÇ7ŠýÆ÷ ’Ê@×­½Î 3ÀìÆ1¬1¬‡1¬‡Â,`Ã,C`ÀeÄD`AœÁEÿ‹¢ "÷@Ê ‚ ƒ ÀeÄeO~÷ ,Ê÷"Ê÷ Ê÷ Ê÷Êæ®ææ÷ ¤Æe ~† ÀÝhÇt 7vÆ ÀÝ[Çt 7jÆ7 `Æ÷�TÇZÆ÷5¼É÷JÇZÆ÷FÇVÆ7 NÆ7 LÆÀHÆ÷8ÆzÇ7tÇ÷ånÇ÷ Æ÷5¼Ì÷XÇÀVÇÀåÀ-ªÌƒæ & & & ÷ xÄÆeT÷ 0Ç÷(Ç7 äÅ÷�ÈÆÞÅ7 ÜÅ÷�¿ÆÖÅ7 ÔÅ÷�¶ÆÎÅæÆÅæÜæâ÷ pÆe 2†÷-²Å¬Å÷°Å²Å æ¢Åæàæ&÷ HÆe †ÀˆÅ7 ‚Å÷†Å†Å7 xÅ÷|ÅxÅ &æÞæj÷ Æe †À‡ ‡wx¼�€ týÿÀm Å && ÷ Bý–% †þ ~` € ÀEøÿt1ÂäÄ`�ÁeÀ ‘~À‡ ‡w&¼ÁÀÄ÷ ÖÄæ& ÷ êü–% I†‚ Ê @Ü7 ²ÄJ" J¦& ÷ Âü–% 5†Á~ÄíÀxÄ@lç‚C~ À,Ò~÷ tÄW¬ @Ü7 dćwœ\Ä7ŠYÄ· TÄ  @Ü7 Hăwœ@Ä7Š=ÄÀ‡ ‡88æ,w6Êæw.ÊæHw&Êæ8wÊæwÊw¦Ææ ƒ�„€ N ÂÔ @Ô€ Àÿÿ%À!Î ñ„- …mÂC aÂÿÿÅ  ÁÔv „ €M Ö ‡÷ zÿÀ À‡ ‡÷ hÿÀ À‡ ‡÷ VÿÀ À‡ ‡÷ DÿÀ À‡ ‡÷ 2ÿÀ À‡ ‡÷ ÿÀ À‡ ‡÷ ÿ‡f€�6¤D~À  �‡f€�6¤D~À  �‡f€���C~�‡w2Å€ �‚ ”‚~@‡w ¬ñ0 ø0ú0ð‹ü÷ ȇpúpM÷ $†w`ðµ€ówð \ ðµ ó÷ î‡÷ .ð%°ýwÀðµŠ0ö"0ô Áep"ð ÷ �Ãð lìp0÷ Øýð•ð *" °`øÂ Dðµó ¦�`W¨aW¢zÉÅ Â ö‚0,úw´É¥;ðµó&wöþwöð¥Ðùæûÿð%°ý7œü Ä ðµ€ó÷ Hwÿ÷ ˜ðÅ€óðŠüæöÿ& ðµ ó ðÅ óðÕ€óð•ÿÿüðµó &^&`÷ €°`°^°“òV ‡æÿÿÞæþÿÛæýÿ׿üÿÔðµó�`W¨-ð‹ó€ðÅ€óðÕ óÂ ð ø°`w4þwrÿw Æïð‹ü³ðŠüðåþù°Šü÷ €§É¥@Ñðµó 0¬üýÆ�  p€°�„°ø° ø÷ Øðµ@ó ðÕ@óðå‚ð• …÷ ð ^ �0 ø00úwÔý&^00œê2½2l1DATADATADATADATADATADATADATA&`÷ °`°^wÿ÷ TþðåþðŠüõµ€ó-0®0 °0™°0™Š0´0¶0¸ðUj0Š„÷ ˆ‡000ð•ðµŠð•0ð%°ý‡Ö Àw ¨îð \"°ŠüþðµŠ÷ `û¸¶´œŠœ°®0þ÷ Œ‡U%ð  ÜÄÃeÃEÆà°Â÷ 4Æ`0 Â÷ (e)ðEj0`0^�÷ tÀð ¡±‡0Šnð5j÷ Úúð ^�ðµŠðÕh÷ ªúðÅh÷ >À‡U%÷ Žúe)‡0ŠüÉ)fÿˆ‡Ñ Â&÷ 2‡× /×  ×  ô÷  ‡×  ú×  ÷R¨ðÕ€ó¡‡ÂåC”‡fÂEÿæÈûB`F‡÷ ~Î÷ .Îà÷ ò†Ó¥:÷ æ †Ó¥:@!÷ $Áèà Π @! ŠU`eãÈUU5ÄU€÷ þm†É¥[É¥<"Î@ ÷  †ÑÄË¥.÷ „† £ ÷ z‡Î0þQ £ÎUD’ÄeĤá„÷ ¨Ä_÷ ÖÄUÄ‹È5ÈE Î÷ lÎàÈU0 ÈE÷ pU5Î Ä.÷ ˜ †È5ÈE0 ÄU÷ LÄ. ÷ x‡Ä; ÷ n †ÄŠÄ-÷ bÄU÷ "ˆÖ …‡& N  †Ó¥"úÎ ùà  ‡U5CàƒÕM%‘Å ÄÑÄE¸ÿÄ Ä Ä AÍ5QÁ`C÷ „Á‡Ä_C& æ÷ p2†ö &Ä‹¥&Π˥A‚Ë¥Z†Ë¥a‚Ë¥z†Î Ë¥*Ë¥%Π˥$Ë¥_ Π˥0 ‚Ë¥9 ‡Ë¥7†Î ÁŽUƒ ÉÖ „– ‡ƒ  †ð‹�Ë‹øË¥ õË¥ ò±‡wÒ¾Æå÷ ¬÷ T½Á�âÊFW öÿCÂÿÿB  æ& & & ÷ ÂÅÆeW þÿ  æ& & & ÷ ¨ÅÆeW ýÿ  æ& & & ÷ ŽÅÆeW üÿ  æ& & & ÷ tÅÆe æ& & & ÷ ^ÅÆe7 ¨Æ³÷ RÊ×­JÊöÿH÷xÍG×­:Êöÿ÷fÍ?ææfRææ"Ê& ÷ ô÷Æe †÷>Í÷êÉ÷PÆ&ææbRææðÉ& ÷ Â÷Æe ‡ææ^RææÒÉ& ÷ ¤÷Æe †÷ |Å÷Æ÷êÌwh7 úÅÀ@RÁ¤ÉžÉ÷ rüE¶÷ €ææ@R w„Ì÷í~É~Ì æ& & & ÷ hÄÆe†ædÌæ^ÉæT÷ Ò÷ŽNáfæ=÷ l÷6 –%ö Îw®v!wpv• —­ /ñv• v• € 7 &÷äÈè7 ÷ÔÈá7 ÷ÊÈÚ7 ú0W£:÷ºÈÐ… wÖ‚BáÀ@RA÷ ’ûE¶÷  Îæ@Rw"÷†Èw Ë÷í šËÎ–Ëæ–æT÷ ÷–%§7 š"÷PÈW£:7Š`È… W£#w•RÈ… @÷ »w�BÈ— /— =ƒÅ ÷�0È/È‚7 N'W¥EW¥RÀüÿ@aW­ÿÿSW£OÎÎ& æ&?W£:÷ÜÇÅe�÷ÎLJ7 7 ü7 ø Î& ææýÿNa Îö… ‚BáÀ@RA÷ |úE¶÷ Šwæþ�íw’Ê÷ ŽÊ Î& & & ÷ vÂÆe w€üÎrʦŽ æT÷ Üõv! wÞv•—­/v•Î& & & Hv•€7 >÷Çá7 @ ÷ÇW¥:æ@÷ ̹wþÆ7 $÷ÚÆW¥:Ö@÷ ¬¹wÜÆÅ À7 W¥SW¥OÀüÿ@aW­ÿÿEW£RÎÎ& æ&o÷�ÆŸ7 ¾sÂZ  ÷~ÆW¥: v! �W£/W¥:Á •ƒ � JJàrW ÿŒÂe � v! çW­ÿÿ:€à à× ”ÁÁ WpÁeZB€ÀeÁÁ ˆ°Àe� W öÂZ�÷•ßÊ×­ÛÊ †·ÊÊwœÇÊÎþææ|D÷ ‚¹–%÷ ŠÊÎ.& & Nœ¦!Âe�·Š›ÊÝ÷•“ʉ7 Æ 7 Â7 À7 ¼ÎÎ& æfÎå÷ |ÀÆew†ú÷5XÅ÷5RÅ ÷5LÅ÷5FÅ÷8Å÷šÁÆe Æe‡fÀ¦Áä�  B~7 *ÅÀìÁ �  B~÷•ˆÈ�‡HELP?ID/IDERLONOPDTRCLDEKRNOæhælw0Êw¢Ææ ÷üÕ÷ NÏK· >Ï· :Ï÷5®Ò4÷6×Ù÷.× Ù÷•0$Ï÷•0Ï€ Àe7�Ï÷•:ÏæŽææ ÷ .ÆÆe÷ ÄØæ)æ”æzÕæT÷ hÍ7 PÒÆe÷5FÒ ¦ & & ÷ ÌÍŽ÷ Æe÷ ¶Îwú÷VÕ÷5Ò÷ `÷&XÁTNœvœ·äÕ É‹NœW¢vœ·ÌÕ÷JδÕ÷¬Õ÷5üÔÀøÔÀeAœÁEÿÁ @pwþ÷eø×-ô ƒ· ŒÕ· ˆÕ÷åàó÷mþÍØæææ\D÷ 4ÅÆe÷ @Õ ææ æ|ÔæT÷ nÌÆe÷5„ÔE÷¾Í˜÷e’À²ÍÀeÀ-†"‡· Õ· Õæææ\D÷ ÖÄÆe÷ âÔ ææ æÔæT÷ ÌÆeV÷å@À<Á:1¬7œ.7œ)Àm$7÷e Áÿµ9÷ 8Í×-4Íÿÿ÷ .Í· ,Í· (ÍÿÕìæææbD÷ HÄÆe÷ TÔ æ æ æ�ÓæT÷ ‚ËÆe‚ ÷5`Ð ¦& & ÷ èËŽ÷ *ÆewÀ’÷5pÓ ÷lÓŠ÷ˆ7`„ 7œx7œs7r÷e l÷-dâ̓÷ÜÍZÃV÷hÖ÷fÖNÁ1ÿŸFB· >· <ÀRÌÀeÀ-0"· ÀÓ· ¼Óæææ\D÷ vÃÆe÷ ‚Ó ææ æ¾ÒæT÷ °ÊÆe÷Ìê� C ̓÷•0Ì÷•0 Ì€Àe7�Ì÷•:ûËæŽææ ÷ ÃÆe÷ °Õæ)æ”æfÒæT÷ TÊ7 <ÏŽ& & ÷ ÆÊŽ÷ Æe Ö ‡wÃ÷5TÒ÷5Ï 7 h÷�îÌb÷e$\7 V÷�âÍP÷e*J÷5ÄÌ÷5ÐÎ00œò2I2¶0eaek›’÷&2÷,*€   �   !  †æ4æzÌæþs ÁÝÌÁ æ4æËóW æ5æÚ& `W æ6ÀÈ&W æ7ìW À¬æ8f&N Bæ8f&=W >ÁXöÊÀÀm|œÿÿÄEðÿŠQ—  —  É•-É•+�  ÀßNtüÿÀEðÄe0‘— ÀŸ4ÀEðÿÀe0�· &˜~æ4æÎ Î æX÷ JÉÆe‡  @ &À.Àe6Î% 4Î% 4Î%04– f÷ v�‡�  Á ý‡w À.ÀeF öwNÀ.Àe6@aÈ "ú±H‡æ,wrÄæwjÄæ(wbĦæ÷ Ž ÷ –ô ‚P÷ Ì@FPnPBÂmLƒ ‚B ý‡ƒ ‡÷ ÆZP C ý‡÷ ¶ÁíÂíƒ õ‚ê´FPƒ‚‡¦æFPnPC ÷ ZPBÂmôƒ ƒ PPC ý‡÷ ìÁíÎÂíʃ õ‚PB ý‡ P´FPƒ‚‡ÄÒ ÀBOŲP0âO÷ ÿÄåø7 Ä ‡Ä ôP4 P„ W!æÃxÅZP3ZPZPtZPtFPnPônPnPsnPsFPƒ4nPFP7F‡FPíZPw!F‡ÅEÿtáFPÅe÷ ÄÄ ôåP´ P„ ´ ‚P‡ÁÔW÷ ¤þ÷ Âÿ4 ‚P‡÷ 8Ë i&7&fÀdÁ��à� ÁEÿ�� ÁwÎwÆÁÁ wÄw¼B`�€e … à� ‚„ !ù!Àw€æ Âí’¦À0÷ ¶ `wˆÀ0÷ ¼À ÷ œ ‚`wnÀ ÷ ¨À÷ € ‚·N`wPÀ÷ Dý‚·:·îÂm,·úƒ„‡ÂÀW„&ÁÂ倃t PÁ`Äåú@àD�Á A°P ÷  7èÀ À7â„tZP`tnPÄåøwˆwEàÅEÿw¸Aawˆ… Åw¨‡ÁÅ÷ ýÁÅ÷ ôüÅÁ�÷ èü‡ˆ&ÀÁ†÷ püÀÁz‚÷ pü‡Å\&f¦À’Oð0öOp °P&° P(… ÅraPr P0ZPð„´âO±, P±,P ƒÀBOŲPð6 ð2 p÷ ‚üð  À’OÅ®P÷ ¢öð ‚�€‡w¦f¦&÷•0T÷ܶÄÎ ]ÂbÁrÀBO÷ ÊðU€°ðˆðð�¬ðª ð¦ ÀBOŲPð�j3÷ èûð ð% üÀ÷ ®»í4âO· p À’OÅ®P÷ Ž»ð wZÿ4öO´ZP´FPtnPÄ ôP4 P„ 4 ‚P· ·ŠœÄåÄ„‚�‡ÀwÌÅâ&À’O0öOpÄ 0P&0 P(… ÅtaPt P„ ðð²0ZPÅ®P÷ \õð  ð%°ýð w¶þ€‡Å÷ –ÿÄ ôåP´ P„ 4 ‚P‡SORT0D.TMPP#@ 8O PBO’OBOÔw yæK¨@wúÿw¹·,w·&w´øÀ.@aÈ "ú±H‡Ã¢WS“ÁU%À Ó /€ D„ „ Ä '€ K‹ K@"Äd€ BB0Ò “B‚ B@AÁE�`fSÐ Äe…!ÿ? € K×"€ ×" zׯ @÷ .ÿ7(ÿׯþ@÷ ÿ7ÿׯê @÷ ÿ7ÿׯÖ wòþÀe·ð`÷ ¸ùÀÀ À À ËÓÐ € ÅÜWÕÀ ü W!XüÓ$Ó$ “‹ÅSaDa€€àŽæ ÷ zƒ‚ÀE€ æ÷ ‚ƒAa‹S`á…`@aB`Î5aa¦¢b"" Î ó   · ( Æ ÅÄ=€‡Â¢WR’U% D 7!fÀÎ5Àeáæ &„ „ 6Ê%ØÂîÃò · è÷ :�ÄÔ÷ J÷�‘ÀºÅ°Å ý…€Å ý÷ D÷ V·®÷²wbÿÁ¢WQ‘ É%7 ÐÂŒÃ�÷ Žà Ãÿÿ÷ à ú÷v·j· Jwÿwz÷ ´�ÄN÷ ÄöÃÿÿ÷ ìÃ%ÿÿò÷ `· Ä,÷ ú÷Äåû÷ ÞøÄÅ@÷ d÷Äåù& Ä4mÜWðWmðWÄåøÄø7òÅ÷ 8÷ÃæÓ Ãåó ðWúæÄÐ÷ š÷Å@÷ ÷„7¾Å÷ ÷Ä´7 Â7!ªô ÜWô ÜWô ðWÎ · ¨÷ ªÉ5ÀÄåê÷-’tÄv´ ðW´ ÜWÛÀÉ E�ÀB·#T· >7 Z· Vw þ÷ à&Ä>÷ ´õ„÷ PÉ5ÀóÉ ã€Î ô ðW· 4÷-0è÷ <Ž w&ÿÁ¢WQ‘ ÷%æU%ffõ¥øÿwÎ5ÀÀewšý÷ â÷ Ú6Â̦Ãÿÿ÷ f�·¼÷À÷ ¶Ä¦÷ ¾É5ÀÉ š€· ¨÷-¤†÷ $7„7 Šƒ@Ámdà ˆ�SÀåü7 j‰À÷ œ½Àÿÿ÷ ’¸Â¢WÀR’Ê ¯ ÷ B÷ Xõ÷ ÷ T÷wàü$Å$Å ü‡æ  À C B � ‡Bà€ Î ÷Ö ‡& � †€cC Á Î øÖ ‡¦æÁÖWÄÌ÷ Bô´ ðW÷%¨)ô ÜW÷ Põ× ÿÿ"ÁºWCÄåÄ !ú7˜ô ÜWÉåÉBÀ„ðW 0ÜWÀåùÂ剃‚‡Ã$Ó Â À 7�‹ „‡ÀwüÆV„VÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠV�V–VœV¢V¨V®V´VºVÀV÷ ¼óÉ5ÀffÖÿÓ Ë Â€�÷ ¤þ‚ƒõÀzÿ7tÿò‹�J2…‡÷ ¨ ⃠÷ œ÷ ²þ÷’÷ Œ Åh… Áˆ€Å ý‡÷ rÁt€÷ >þ†ƒ ‡„úÿ-øÿ‚‡þÿ€÷ "þ ƒ&þÿ´þÿ‚øÿôøÿƒ7!.00œú2½2l1DATADATADATADATADATADATADATAüÿæ‡@€ÚWw ßÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w ÀÞ  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡æ4wæµæ8wÞµwn²æ Àö^Á B~Àøº7N×­å»· B÷5<· 60Š,÷.÷ø°*÷횺$÷ ÷÷8¾À€º¡7Ä@ÂÎ>ÂÀ  ÎE€~Î ÷ÿÿì7æ÷â÷ ¦÷ú^¢÷$_ž÷&_šÀ¸÷*’7`Ž÷"ºŠ÷(_†÷*_‚÷,_~÷._z÷0_v÷2_r÷‚vÂ7 ^Â7 \Â÷5’½÷¬ÀlÂ÷�¨ÀiÂ÷t^Â÷•[Â÷|PÂ÷•NÂæþææ(J÷ ±Æe÷ Âæ(æwÜæNææø ÷ ä°Æe÷ :Â& w¸÷VÀÅü^÷ æöwXÀÀÂw ÷Ôº÷Ê÷ú^Æ÷&_Â÷ ¾÷ ¨ ‡w8÷5À7 þ¿÷5ļ÷5º¼ì÷8¹Åü^÷ âúwö¿wh÷Á€º÷Á|º÷Áxº ÂÝ ºÂ ùÁ%Á`À,à \P’Á Ã~X— Á&À,— Á&À,PHF— Á&À,—  Á&À,PHÈå€2— /Á&À ¸Àe,ظÂB`¦œÿÿÎEðÿŠ…UW¡ W¡ ŠÀ à H”HŠÀ Ä~A’ÁEÿA H� È•À à H”À Ã~H’ÈÅÅ_÷ ÷w¿Àjf· `· \w¼þ×-À°ý æ1& & & ÷ ˜¶÷æ·Æe÷6Åü^÷ P÷wº¾À$CÀJÂÃ÷ pÛDÀ�÷ ~ÛwÀ·À· À· Àæþææ0J÷ Ü®Æe÷ â¿æwÎý÷ 6À÷ä÷ú^à÷fÜ÷ ØÅ_÷ ^øw6¾À  æ'æ&¾Îe&& ;æNææ ÷ v®Æe÷ Ì¿àæ)%÷fÅü^÷ Öøwê½÷•¿æNææ¬X÷ >®–%÷h¢¿ÎNææø ÷ &®–%÷ ~¿  æTææ|÷ dµÆe 7 $¸÷ ¸Ö À Ö ‡w"®æ ÷5¸÷¸H¿æNææ´X÷ Ê­ÆeÀ ¿ °ý(÷Ú·æ æTææ|æ®ææ´X÷ ’­ÆeÀH¾ °ý æ æ´æÖ¼æT÷ Æ´Æew`÷2¾x·÷5~· · ¶· ¶÷-b·b·ƒ÷Z·Z·÷5\·Á&÷5b¹Á,7 X¹Á&÷L¹ ÅÊÄÚ ÀÝж€#ÃнCc ÓÀÑ”€  üƒŽ Åe„ ê÷-ô¶¨¶†æ]ÁH¼÷5@¼Á-Ú¶†÷5ò¸ ÷Ò¶,+ƒ÷5â¸wº¶$æÁ Á-ª¶ ƒ÷5ĸwœ¶æ ÷ îåÖ ÷5î» ÀжÀí„¶À-|¶ƒæ÷ ÎåÖ ×­¶"Á½Ám¶ÂµW¢Ÿ‚— @’ÀEðÿ †@’ÀEðÿ ƒæ!÷ ˆåÖ � ›~À Ö ‡æ4wæµæ8wÞµwn²À]Á B~æîææ¬X÷ ²Æe÷ Ä & æôææ„÷ V¹Æe÷Ä÷ƺúÃ÷eôÃæîææø ÷ رÆe÷ Îà & æôææ„wÆÀŒº7þ×­y»· ò÷5ì· æ0Š,7à÷eÚ÷ˆ°Ö÷í*ºÐ÷Ì÷È÷ȽÄÀ¸Â.ºÃ(º÷ ÂÝBÀÁ÷ ÒÝwb·\· X· TÂ÷ P ÁHÂ@€ @`7‚ †÷ÿÿx÷t÷ 8÷]4÷@]0÷B],ÀJ÷*$7` ÷˜¹÷D]÷F]÷H]÷J] ÷L]÷N]÷ìÁ÷5½÷.ÀêÁ÷�*ÀçÁ÷tÜÁ÷•ÙÁ÷ŒÎÁ÷• ÌÁæþææ(J÷ ˆ°Æe÷ ŽÁæ(æwtæNææø ÷ b°Æe÷ ¸Á& wP÷Ö¿÷”¶ÁÅ]÷ ^öwпÀVw¬÷d÷]`÷\÷ Xæîææ´X÷ °Æe÷ þÁwÀÂ Ü Òw º¸ç ÁÝ©¹Á ÀÀmª¸Â#`À,Áœ¸a�’ C~]W ÂÂe$À, W ÂÂe$À,�ˆIW ÂÂe$À, W  ÂÂe$À,�ˆÈå€3W 0ÂÂe$À.¸Àe,Å&¸A�`DœÿÿÄEðÿŠQ×  ×  ŠÀ Å ˆ”HŠÀ D‚’ÂEÿB ˆ� È•À Å ˆ”À Cˆ’ÈÅ÷ ÁÅ0]÷ ˜öwоÀwÒþ2×-âÀ°ý æ1& & & ÷ *¶Æe÷êÅ]÷ èöwR¾ÀØ÷ "À÷ì÷]è÷bä÷ àÅ8]÷ Jøw"¾À¨ æ'æ¾Îe&& >æNææ ÷ b®Æe÷ ¸¿àæ)(÷nÅ]÷ ÂøwÖ½æNææ¬X÷ 0®–%÷v”¿÷ �¿÷RºÎNææø ÷ ®–%÷ d¿  æTæ æŒ÷ JµÆeÖ À‡ ‡00œ3I2¶0eaek›’æ(wúÄw`Á÷nÑ÷ÊjÑ7 xÑ· pÑö5 ÁæÉÀÿBd~‰æææbD÷ ÁÆeÀ Ñæ &æææ\D÷ òÀÆe÷ þÐ ææ æ:ÐæT÷ ,ÈÆeÀ‡ ‡wøÀ‚„…Ã`÷’~ 7Š{ ÀÒ` ÀÒ!E …,‡u„,r†? >ÉÀ:Éð7ŠÐ÷Ž(ÐÁ2æ’6ŠÁ À rÖ ÷2üÏwàøÏ€$ÀÐ7èÏ7 æÏæ´ææ˜I÷ 2ÀÆe÷ îÏ ææºæzÏæT ÷ ´Ï ÷ °Ï æ& & & ÷ TÇÆe?òÀ ò¼ òm†È r òm~ÈòxÏòtÏ÷mlÏhÈw fÈ÷mdÏ`È ÄÒ ² ²÷j À€`7r ·n  ÁÒH` ÁÒ"r 2rÀ‡ ‡w~¿€ � � ÷5–Ë ö Á Ò ËC~Á  B~‚°�ˆ��m ±�ÿÿð ð°� 0Š ðÅ ð•ð•ÿ÷Þ‡÷5ò&ÀÄÇ÷5"Ë À À, ÀÝ ÊÀe* À À& ÀÝîÈÀe$&æòTæâT÷ ~Æe ^†æ‚ÇæˆÇ÷ Úý–% U†Àvðfðb ÷mXnÀj· f÷ T ÷50 7 <÷-N6÷ n 3†À Ç7.7,÷Ç"÷"÷÷ 7 ð· ÷müÆ÷ò÷îæìÆæîæâÆ& ÷ Žþ÷ Þ÷ÈÒÆeÀ‡ ‡f÷ÌÎ÷ÈÎ÷¼þÍÁ¸wp¨ÆwðÍæææbD÷ º½Æe÷ ÆÍæ æ æÍæT÷ ôÄÆe À�‡€7¸Í7´Í÷4ÆœÍ÷LÆ”Íæææ\D÷ b½Æe÷ nÍ ææ æªÌæT÷ œÄÆeÀ‡ ‡wh½ÆåÂâѦ�÷5Ü7 Ö W¬f÷ tÿÖ y†öœ6Š ö ö“ ó‹ö•6ŠÄ¢Å €Ýa6öeö¶`ÀhÅ€oÅ‚à…-‚wdö ¶`þµþÅ÷BÀ2Å€oáÅ …aÄ ”ÅE`W£æ4Åæ:Åæ(Åæ.Å÷ ~û–% S†ñ�ñ� ñ�ñ�ÿòöòò þÅf÷ nÖ 8†÷5Æ(æØÄæÞÄ÷ .û–% +†æÆÄæžÄæ¸Ä DÓ„ &÷ `üþÕ 1‘ñ�œ ñ�— ñ�’ ñ�� Æeæ Žaæ N`f÷ hþÆe w†wœdwœ_wœZwœUW£ æRÄæ(ÄæBÄææ>ĿĿ0Ä& N“÷ ÜûÉ�"ñ�ñ�ñ�ÆeÀìÀo��ВМ—­Мˆ�—­Èœ€ ÄÔÃ�ŸŽ >þí¨Ã÷5ÚòÕ r’rœ rœ rœ W¬÷5®f÷ Ö †À Æe ‡€7ÊÊ7ÆÊ÷FòÊ÷^ÃªÊæææbD÷ tºÆe÷ €Ê æ æ æ¼ÉæT÷ ®ÁÆeÀ‡ ‡wjºÁòTÀðÕ ðð ÷ :ü h† ÀÝãÃÀ   •ÿƒ�  •ÿÕ •mÕœÀ,ĪÂÄ ��È�æ,æòTæâT÷ ˆüÆe R†Áe ñ‹ æ,ffÎå ÷ füÁe Æeð÷ÅRÃÁå wœAÃw˜@Ãwœ;Ãwœ6Ãwœ1Ã÷VpÃ÷RlÃæjÃ& ÷ þ÷–% †Â®ÀXÃÁ,�B~÷ ÂÀìÁð hðjæ4Ãæ÷ Æ÷–% †À‡ ‡w0¹÷5ø7 ò‡7 î÷ ÄÁ÷5 ÅÂ,Á&Â&Á, ÃÝþÃÃe* ÀÝîÂÀe$÷5ðÄÂÁ ÀÝqÂÀ ÃtÁ%‰¢ ‚%‡� ‚ Æ~ ‰"   ±,‰" ƒw, ù  ±,ô‚ð÷Fw û€ÀmÁ7œÿÿÀüÀEðÿ7Šö7Pò@ÀmöÀ7œÿÿåÀ�áÀEðÿ7ŠÛ7Ð××­Ó †æ!a×­Ä÷м×­¹÷б÷Ũ÷Å£÷Åþž÷Åþ™÷ œÀCÄ–À×¢ŸÛ‚!À’ÀEðÿ Ò‚ƒ ×­j÷‹c0÷‹\×­W$×­N ×­G·@BÁ:Ã>À‰¢‚‡‚ � Ã × ÷†÷­÷@÷­  ƒæ÷ ¬ðÖ ÷5( ÷5ðÀæ÷ ’ðÖ ÷5’Æ ÷5DÃ7 >Ç÷6Çw·ÁÜ¿Büÿ¦& ÷ ”õ–% Z†Ã˜¿ClþÿÀ S~÷-º¿´¿Á²¿B,üÿ¦æ÷ bõ–% A†Büÿ¦& ÷ Põ–% 8†ÃT¿ClþÿÀ S~Àt¿7 n¿ 7 l¿B,üÿ¦æ÷ õ–% †Büÿ¦& ÷ õ–% †Ã ¿ClþÿÀ S~¦æ÷ æô–% †À‡ ‡æwʸæ8w¸wBµ×­ÎÄTƒ÷5\Á÷zÄÖÆ÷�vÄÓÆ÷н¾Æ÷e¸ÆæžææÈU÷ â´Æe÷ ˆÆæ(æ¤æîææø ÷ ¾´Æe÷ ´Æ æ(æôææ„-÷"Ä÷>½v÷r¢ÆÀ2½Àm^½7*½÷e$½÷5½· ½÷-½j³ ‚7 8½÷½½÷m4½½÷-ü¼R³ ‡æ& & & ÷ œ»ÆewÞ÷Þ¼ò¼÷î¼þ÷*³ ÷í̼ÁÀ7rò¼7Ò¼wö7ìý÷ìýÀ ØæÞ¼æä¼÷ 2ó–% ؆÷Âýæý÷¾ýâý÷âý溼æ�¼æª¼æ÷ VôÁ€¼Â¤¼@Àm’¼€@`7Œý÷ ˆýwŠý@ðÕ Îx¼æ~¼÷ ÐòÖ ¥†À`ý7nýÁZýwhý7fýwdý7býw`ý÷&¼JýÎ@¼æBýæ6¼& ÷ âóÁ¼Áe÷h½"ý÷ $ý÷4ý÷ , ‡wx÷500œ 3�3l1DATADATADATADATADATADATADATA¨Â÷ ú÷5œÂw@÷5ý÷5ý ÷ ô d†ÁàüÁe7 ðü÷5èü÷5Þü÷ ¾üÀò¼Àmò¼À-¬ü †÷ Îó G†Á¦üÁe÷´ü÷5,Â÷5̼Ä Âĸ¼÷ züÀm°¼À-jü†÷ Œó e†ÁdüÁeÑ•Ñ�TüÑ�PüÑ�ZüÑ�WüÑ�TüÑ�Qü÷5ÔÁÑ�n¼Ñ�k¼Â ÃÃb¼÷ ζ÷ X¼÷ â b†· øº· ôº÷5H¼ @ÀmšÁÀí4¼÷�Á,¼7 0¼· êûÀêûð�âûÂm¼Âm¼°ÀÈûÀí¼Àí¼7¼û÷5XÁ 7 RÁ÷5¾-÷5¾w„þ÷ˆº#÷5Ú»×-l°ý×-d Î1æ´æöÀæT÷ æ¸Æe÷xû÷ :÷ †÷ zú ‡Æe÷ºÆeÀ‡ ‡wޱÆåÂ.ÂeÃ&ƒ ŠÒ�ûÒ�&ûÒ�#û ÀÝû ÁÝûÁ Ë•�J�À Ë• �‚ Á »6 ow,»i‚ñµ vœ ö 6 6 öœ´ƒ6 NÎeEÅe, @Ü€-"Ä„Á„ov“6ŠÀ “ö5 ‹­ öƒ „ € 6  Îe… Øö5÷vÂ÷íBpÂæîææ ÷ P°Æe÷ F æ)æôææ„÷ Š·Æe Áe4¶ ·-4º‹À Æe‡wB°æ ÷5&º÷¸hÁæNææÐU÷ ê¯ÆeÀ@Á °ý(÷ú¹æ æTææ|æ®ææÐU÷ ²¯ÆeÀhÀ °ý æ æ´æö¾æT÷ æ¶Æew`÷RÀ˜¹÷5ž¹ · 4¸· 0¸÷-‚¹‚¹ƒ÷z¹z¹÷5|¹Á&÷5‚»Á,7 x»Á&÷l» ÅÊÄÚ ÀÝð¸€#Ãð¿Cc ÓÀÑ”€  üƒŽ Åe„ ê÷-¹È¸†æ]Áh¾÷5`¾Á-ú¸†÷5» ÷ò¸,+ƒ÷5»wÚ¸$æÁ Á-ʸ ƒ÷5äºw¼¸æ ÷ èÖ ÷5¾ Àª¸Àí¤¸À-œ¸ƒæ÷ îçÖ ×­=¸"Á>¿Ám<¸Â8·W¢Ÿ‚— @’ÀEðÿ †@’ÀEðÿ ƒæ!÷ ¨çÖ � ›~À Ö ‡æ,wʸæ4w¸æ8wº¸w:µ÷´½Æ½÷mཬ½÷-¨½þ³ ‡æ& & & ÷ H¼Æewz÷нž½÷š½Àþ÷Ö³(÷íx½"ÁÀ7rž½7~½w7˜þ÷˜þÀ Øæнæ�½÷ Þó–% ؆÷nþ’þ÷jþŽþ÷Žþæf½æ<½æV½æ÷ õÀ,½ÂP½Ám>½�`w8þ÷ 4þ76þðÕ Î&½æ,½÷ ~óÖ ¦†Àþ7þÁþwþ7þwþ7þwþ÷Ô¼øýÎî¼æðýæä¼& ÷ �ôÁ¼¼Áe÷¾Ðý÷ Òý÷âý÷>7 <7 ^¼7 \¼ÎNææØU÷ ʳ–%÷ "Åwj÷m 8¼w 6¼÷m0¼ÄÅ ÓÂmv¼·¶½÷e°½÷5Z½÷¦½÷ž½÷ rú÷5ôÂwÞÀfýÀ57“|½7Šy½÷er½7 r½· ª· ¦÷5@ýÀ5÷ <ô †ÁýÁe7 $ý÷ ¼ A‡wR "†÷ ôüÀ(½Àm(½À-âü3†÷ ô î†ÁÜüÁe÷êü ÓÂm¼»·ü¼÷eö¼÷ô¼×-*÷ $À¦üÀm È�ð�ð� ð�÷ü7 ú÷ züÀ®¼Àm®¼À-hü†÷ Šó ±†ÁbüÁeÀ”¼1 Ñ•É�FüÑ•Ñ�<üÉ•w¶÷í4ü°÷8ü¦÷4ü¢� ŠŠ Š� wš÷J¼’Ñ�D¼Ñ�A¼ ÓaÂeÃîº÷ ž¶ ÷m(¼pÿ�llÀhð�c“���££�£�÷5Èû· ¨ûÀ¨ûð� ûÀžûÂmлÂmÈ»°À‚ûÀí¼»Àí¼»7vû÷5Á7 Á÷5Ò½^÷5Ƚ÷FºV÷5¨½÷&ØÂ7 œ½÷ ÌÂ÷޽wzý×-®Â°ý×-¦Â Î1æTæ æŒ÷ ˆ¸Æe÷5û!÷5æº÷5û÷ ¦ ‡ÀèúÀmbÈ�Vð�Sð�Nð�I÷>7 <÷Ðú÷ ’ö †÷ Òù ‡Æe,ÎNææÐU÷ ¶°–%ÎþææÈU÷ ¤°–%÷5ªÁ Îææ æŒ÷ Þ·Æe7 À÷"¹ÆeÀ‡ ‡f×-Ä ‡· ¸· ´÷å°óÀ¨À-0ú‚wN÷-"ú”úƒ÷RÀ÷ä¸NÀ÷‚XÀ7VÀæææ\D÷ °Æe÷ Àæ}À\Ám®¸ ü[ƒ ýÉ�>ñ�;ñ�6 þÉ�(ñ�% ÿÉ�æææbD÷ °¯Æe÷ ¼¿N· þÀú· ö7È¿÷îÄ¿æææ\D÷ ~¯Æe÷ Š¿·Á(¸ÀÌ ýÉ�½ þÉ�²ñ�¯ ÿÉ�¡ñ�žñ�™ É�Žñ�‹ñ�†ñ��æææbD÷ ¯Æe÷ ¿#æ æ æ\¾æT÷ N¶ÆeÀHÀíÐøt ÀmÄøÀm<É�.ñ�+ñ�&ñ�!÷7 À �‡|³ –,¿4¿4ˆÓV ›r[qÀÀÿÿ$V r700�3I2¶0eaek›’SYSYSYSYTICLSYOV¢NÀÅÎ(W(WørÔ¢À^ðt! ÅÎNÀÅÎÁe?ÁE? ‡& fŽ Ž Ž Ž Ž Ž æYÿˆ‡€–˜Ài*Éw Zf¦ÆåƒÃeÀþ‚÷ ˜ö5tƒ‚Ãe˜þB ÂeÀÁ±:÷ âà à æÁ @ Á @ CÀÁ±:÷ ÄÎ`ÁUCÀÁµ÷ ®B‚ ‚ ‚ Àd�÷ VÁ`ÁeÝfÄ€Á�÷ þÁ  €Ád÷ ìÁ €Á÷ ÞÁ  — ;ƒa @œØ€ ƒà� W ÷f÷ °Ð•-�Á �eÁe´P”P”P”Е-�Â÷ ôЕ ö50�ÁeƒÆåÀö‚÷ Šƒ‚–%ÀÁ<÷ æfÁ<÷ ÜfÁ÷ Ò@÷ (Õ•:€÷ €ö5Õ•:÷ @Æe‚�‡Á ÷ Àe0Áe0�U�‡&@�Â÷ XŽ €%œÿÿð•0þÿ‡÷ œæA…UUUUÄ    ÄT T T T Áee(e(e(e(‚ÄTä” ” Œ $)TäŒ ´ TäŒ Tä±…U U U U Î ÙÖ ‡&fæ!  E D  ‚E ‚Eà„ à±C B ΊñÖ A…„‡÷ øæ@„    Àe à ± û‡„T T T T H1C„ÔdT T L $)ÔdL t ÔdL Ôd¡Î æÖ ‡JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC&æ  †€mÎ ù–%‡VPVP¦ÐÉÿSY:CMI.CMDCMIÿ¢ ª „ >P"@ʪìP ðÿñÿ&ð P#@šïPúïÿPZ ïPºîÿw æÄ'Å  ÅUD$†BA÷ ø&�Â(÷ ÅU� ÀBQ÷ lÂЕ* ü‡Â Âw † ”Å¥ üÅ¥ ùÅå0B¡†€÷ ŒAa”ôœÿÿ‡÷ &÷ &÷ �’•’•€‡@Á(÷ pf€  Àe ÀeÉÿÀe Àe ‡æ<w2 &æ¦f&¦ v Þ €�‚ƒ„…‡TI0:RMSBCK.LIS÷ þÀ~ ÷ æ‡ÀåP ffÅ õ õP 5ffæ…÷ ØýÆe…ÁP À Á. € & & & æ &f& & & Εæææ ÿˆ…�ÀP ‡÷ øû÷5ü&÷ |ÿ€ÀåP fÁP À Á. € & & & æ &f& & & Εæææ ÿˆ�ÀP ‡&f¦÷ Èwìÿ‚�€‡÷ àÿ÷ àÿÁ ‡Â wr&f¦÷ ¬1†�Áe?� � � � � � w¬ÿw ¦ÿ‚Á ÿ& fæYÿˆ†w ’ÿƒÁŒÿô±€Á Á Á Á Á Á Ânÿw`jÿ÷ ‚ÿ‚�€½– –5‡Ô„4AÒ ?Ò 00�33l1DATADATADATADATADATADATADATASY:SY:ÂÎùÂeÂE ÷ ÐîæÆ ÿˆ&ÀìæÎ ÿˆ· Òù‡ ÁmÈù ‡ž¦ ʺùà�bŠå‚‡ABDEFIMNOPQRSTUXYZ<>Å"BaÊ$ep|v¢­$Ê®¶ÅÏJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw À && D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ ðôÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚bÂEÊ Ö ÌЕ%„Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ ¨�à õ‡& æÎeŠ6& ¦æÎev/& æÎeäó*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎe< & ¦æÎe(Е A‚¦Þ à ÷–%‡& æÎeüòA÷ úóà û‡Ð• à ü‡A÷ bE‡AÂ÷ †E‡Ð• Aæ÷ ÆóAÎ ûÖ Â ÷ $Е.÷ ®óÂ÷ AЕ; ÷ zà à‡Â ýð¥ ÿÿùÀ øw ÖD…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w ¦DÅ… ƒ÷ &Е.À À À ce÷ ¾À …Е:÷ Å ù Â÷ àB‡ÁÉ ÷èš÷&àwœ„4 ô€÷vÀ¼‡C3 3 ó€ó €É,Ä, ÍUóE€s3w(æ®t�¦æ&fÃˆÑ BÀ˜þ… *ƒÅ Í‹'Â% Í¥!‡Í¥EÀàúÂ%,‡À€ý… ƒÅ D„Œ†„ŒÀ5 ‚‡õ¥  õ¥PBÄ2Ì þÂ%pÀÐÿÄ‹ñó5Jó³ J€÷ àþó J÷ …„ƒ‚�€‡@ºÿµ ºÿõÅüÿ´ÿEÍ¥ó‚A�î†A� êƒÁ I& æTIææÿˆ& æTIææÿˆ÷ hÀþðíÂð•ÿÄðôð ö÷ ,,‡&øú÷ C€à áÅ 'Â`'Á7 (ò7 ò7 °ñ÷ þ†÷ ¦ñ÷ùÿžñ÷žñ7œñ÷ ôÀþ÷ ÌÁ÷ 0¾†æ†ñæÿˆ÷5âñ÷ ¦÷5Öñ÷ º÷ ª÷ ˆ§¬òöÿ¬òÿÿ¬òûÿ¬òüÿ¬òýÿ!¬òþÿ&÷õÿñ÷ |× ±‡ÅeõÐùÅeõöÿ÷ Zî÷óÿðð÷ NèÅeXõôÿ÷ <ßÅeXõ÷ÿ÷ *Ö& & & æ ælæ&& & & Εæææ ÿˆ‡À‚ð÷ 6ò7 xðÀrð7jð÷ "ò÷‡ BCK>%BCK-I-ID, RMSBCK Version 2.104 (March, 1986) Copyright (c) 1986, Digital Equipment Corporation×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ < Àÿ 4Z Ä!ÿ ,l ü!ÿ $l "$ÿ l <"ÿ ~ È!ÿ � ô!ÿ Ø €-¦Þ5Îe‡w ¢Á,… Bv ù    ù ‡‚Ê5ôùB‡w¶ù ꄦÊ5‚ú‚‡ò û¦¦‚ Ž (Ê5(ÊUW¬ ‡Ä ò ƒ Ä ó  €ææwÿˆóE€Ê5 ÛÊE Ž‚ØÖ ‚ÇW¬ ͇Ê5 ÊÄ È„,ÅÊE éî¢Tßî&w”þÊEò ÊU ‡æ&W¬ )‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w 4…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ DW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡w  ÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr00�"3I2¶0eaek›’‡w \  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡&æf…Þ ƒ„…‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡&æ¦ff… Þ �‚ƒ„…‡›r[q›r[qŽæ¤B6 ’–šž„FL€BB‡àÀ î›r˜ÆðÀ@ î6 IqäMt!ðà@ $ IqÿMˆ!ðà@  IqÿMœ!ðÀî U(U°! Ä!Z Ø 1ul†�Ä!$H l « ð3�Ä!¸H ~ « E,�Ä!, H � « :d�Ä!0¢ H Z « qQ�ô#è� ´ «  �ô#Œ � Æ « &%�ô#à� ¢ « ”w&�€-ìê D!« ""'�l.ÄØ ü « e†*�l.Ø !�r.�l.ÈØ !�s1�l.0Ø 2!BuCR3�l.äØ ê « t4�„4H U,TX!TX!ðTTTTTˆÀ‚Ôà‚Ôà‚ÔÀ€ÔÀö!& & & & ¦f& & & Εæææ ÿˆê‡"AO#÷F$L%ƒÏ% RMS-11 Version 2.100 Backup Utility Function: Backup RMS-11 files Format: outfile[/option(s)]=infile[/option(s)][,infile[/option(s)]...] For magnettic tapes, the output file specification must not contain any wild carded fields. For disk files, the filenam and extension must be wild carded, that is *.* Global options: ? or HELP type this help message ID identify current version number [NO]QU enable or disable query mode SL[:filespec] write a summary listing [to the specified summary listing file] Outfile options: NV create new versions of output files RA read data after writing RC read and compare data after writing RW rewind the output magtape before writing SU supercede existing files Infile options: CD:dd-mmm-yy select files based upon date of creation RD:dd-mmm-yy select files based upon date of revision Date strings are matched exactly by default. However, dates which occur either before or after that specified can be selected by adding the date modifiers :A (after) or :B (before) after the date string. The /CD and /RD options cannot be used together on the same input file specification. File specifications are in standard format: device:[directory]filename.type;version Wildcard characters such as '*' or '%' are valid in the directory, filename, type, and/or version fields of the input file specifications. æ,wÂõæ0wºõæw²õæHwªõæ8w¢õæwšõæw’õ&¦æ Á ÈÅ€¢ ‚ЋÁ ö¢a‡¢z‚ÈÅ ”ƒ Á êÁƒ‚€‡w xü0 ø0ú0ð‹ü÷ ȇpúpM÷ $†w`ðµ€ówð \ ðµ ó÷ î‡÷ .ð%°ýwÀðµŠ0ö"0ô Áep"ð ÷ „çð lìp0÷ ôþð•ð *" °`øÂ Dðµó ¦�`W¨aW¢zÉÅ Â ö‚0,úw´É¥;ðµó&wöþwöð¥Ðùæûÿð%°ý7œü Ä ðµ€ó÷ Hwÿ÷ ˜ðÅ€óðŠüæöÿ& ðµ ó ðÅ óðÕ€óð•ÿÿüðµó &^&`÷ €°`°^°“òV ‡æÿÿÞæþÿÛæýÿ׿üÿÔðµó�`W¨-ð‹ó€ðÅ€óðÕ óÂ ð ø°`w4þwrÿw ’úð‹ü³ðŠüðåþù°Šü÷ €§É¥@Ñðµó 0¬üýÆ�  p€°�„°ø° ø÷ Øðµ@ó ðÕ@óðå‚ð• …÷ ð ^ �0 ø00úwÔý&^&`÷ °`°^wÿ÷ TþðåþðŠüõµ€ó-0®0 °0™°0™Š0´0¶0¸ðUj0Š„÷ ˆ‡000ð•ðµŠð•0ð%°ý‡Ö Àw tùð \"°ŠüþðµŠ÷ |ü¸¶´œŠœ°®0þ÷ Œ‡U%ð  ÜÄÃeÃEÆà°Â÷ 4Æ`0 Â÷ (e)ðE00�*33l1DATADATADATADATADATADATADATAj0`0^�÷ ôûð ¡±‡0Šnð5j÷ þûð ^�ðµŠðÕh÷ ÆûðÅh÷ Òû‡U%÷ ¢ûe)‡0ŠüÉ)fÿˆ‡Ñ Â&÷ 2‡× /×  ×  ô÷  ‡×  ú×  ÷R¨ðÕ€ó¡‡ÂåC”‡7 Æ&f¦w°÷‹¬÷ Æ7 ¤7¢À¦È @•,€ÀåÀÿq `-KacJE[à !ÃmfÄíb@•Á †Õ Á ûα)÷ L÷ R†é  çà å÷.7•.à f@• †Õ †&Ý €…Ò€Ö À5]U ¦†E¤¯‚…€Áì‡ :Áà‚æ&@E÷ ÿA ·ÌÎà·Ä ̆ª ÷ Š÷ Р¢ÂÀEÿ÷ vœÀEÀÿÀ €cÁ”Â’¤‘Á ü¢ÿ­÷‹}‰÷­xu¦†„÷ @�Á à £.„ à · Væ&fÅNÄHÊ&Á ÷ ô÷ ø…„ƒ¶à ÷ 8 †À ÷ "†À £.£$· „ à ë÷ ü‡Ì¥Z‡£A‡Ì¥9‡£0 ‡ à £ £ ‚ „ à ö‡f¦Á2çÁeÁEÁeÀ~  ÷ Ré‡0 pðçð ç0 0 ðúæÁðæÂeæêæR”Î ýÖ ‚�‡÷5 Öæ÷øÿdæÎe÷UÄæ‡÷5 ¼æ÷øÿJæÎe÷U ªæ‡÷5 ¢æ÷øÿ0æÎe÷U�æ‡÷5€Žæ÷øÿæÎe÷U|æ‡÷5@tæ÷øÿüåÎe÷U@bæ‡÷5€Zæ÷øÿâåÎe÷U€Hæ‡÷5@æ÷øÿÈåÎe÷U.æ‡÷5&æ÷øÿ®åÎe÷Uæ‡÷5 æ÷øÿ”åÎe÷U úå‡÷5@òå÷øÿzåÎe÷U@àå‡÷5@Øå÷øÿ`åÎe÷UÆå‡÷5¾å÷øÿFåÎe÷U¬å‡÷*¦å×- åƒÎe÷ïÿ å‡×-Žå ‚÷ †åÎe÷ïÿå‡÷ôtåö×-nåd÷ƒ÷åldåî�×-^ådê†î÷Ì@å7 >å7 <å7 <å‡÷ 0å ÷²(å÷$å$å÷íååÎe‡÷ nä÷ Ôý7Žä‡÷ `ä÷ ÆýÁ‚ ñ Aú1ðòä ðîä ðêä7 Úä7 Ôä‡÷]ÒäÎä7 Ìä‡÷¼ä|ý÷¾äzý÷²ärý÷®äpý÷.¢ä‡÷ üã÷ bý7ä÷RýŽä÷NýŠä÷Lý†ä÷Dý„ä‡IDENTIFICATIONÿVERSIONÿCDÿEDÿIDENTIFICATIONÿNOQUÿQUÿRDÿSLÿVERSIONÿJANUARYÿFEBRUARYÿMARCHÿAPRILÿMAYÿJUNEÿJULYÿAUGUSTÿSEPTEMBERÿOCTOBERÿNOVEMBERÿDECEMBERÿIDENTIFICATIONÿNOQUÿNVÿQUÿRAÿRCÿRWÿSLÿSUPERCEDEÿVERSIONÿ�&Ÿ&§&ª&­&¼&Á&Ä&Ç&Ê&Ò&Ú&ã&é&ï&ó&ø&ý&''''('7'<'?'B'E'H'K'N'X'Æ 'È *Èä' 'ÈÔ'ê%¼'ʄȅò'Â',ø%¼'È)Â'ʆø%È�ò'ÈÊ)Ø'À€=„/€€D%�†D%À‚¶%È€(€ (À€Èš((ÈØ((À€*€ (%€ (.<(;h(Ò@ (Ô@ (À„z(* <(% <(.h(;h(Ò <(Ô <(À„z(* z(Ô h(À€À†Ê%_€(Ò€$†(_†(:Ò†(Ô„†([€À‚6&%  (*  (Ô  (,€% º(* º(Ô º(]†0&[€À‚6&%@ Þ(*@ Þ(Ò  Þ(Ô  Þ(]†0&/„)‚&$ D)ƒ@$  D)„D%…t$†¨$‡Z$ D)ˆ%*‰†D%:€Ì‚^%-€Š ¬)‹ ¬)Œ ¬)� ¬)Ž ¬)� ¬)� ¬)‘ ¬)’ ¬)“ ¬)” ¬)•œ ¬)-€Ì‚z%:º)À„A Bœ /€–D%—t$˜Ž$™¨$šÂ$›Ü$œö$�%*ž*%Ÿ†D%:*À„À‚<&ȃò'Ê%À†\&?4*H€E€L€Ê P€Êœ w xôÁ w nôÁ& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡æ,wÂõæ0wºõæw²õæwªõæw¢õæ wšõ& æTIææÿˆ÷ ̆wN÷ rèûÀnè&ź5œ,Àe5(ffæ…÷ šÿÆe…õýÿ÷ ¢†‡Å ffæ…÷ lÿÆe…÷èèÄèu7è7 èÅ 5�,Àe5(ffæ…÷ FÿÆe…õüÿ÷ >Þ‡7Lè7 Nè7 Jè7Fè7 ÀçõUffæ…÷ ÿÆe…õ%lûjõòÿ÷ ô †õ%ðúè×-”ç±ã÷ezçffæ…÷ ¼þÆe…õEõþÿ÷ ¶†×-^ç–È”÷ FĆ×-Lç×-Dç‰óÅúffæ…÷ VþÆe…źffæ…÷ >þÆe…‡÷5 nç÷ J†¡÷ 8f Å ffæ…÷ þÆe… ‡÷ Ææ½õûÿ÷ ·ÿ *ø¢ ô#ÿ "ø´ 'ÿ øÆ ô#ÿ øØ €-00�23I2¶0eaek›’ÀŒæ/Åú5œ,Áeu(ffæ…÷ ÈýÆe…õüÿ÷ ¨Q‡õµ(2<õµ 2ð58ð5I7ð5 7Å ÷"æ&æÄ"æ37æ5�,Àe5(ffæ…÷ XýÆe…õüÿ÷ 8‡õµ2Þ÷ìÿìå½÷úÿäå¹÷ñÿÜåµ÷ðÿÔå±÷íÿÌå­× ±‡ÿ *÷Ø €-€€@@ €€€€@@ æhælw(óæP æTæXæ`ædwóÅJ÷ Hõüåõúå÷ :Þ fÄ ttõêÿ÷ ¨…‡÷ôwˆ÷êw~Ä À°åÁ°å�  Á ýÀ å÷ ¢åÐÐ÷e”å  ÐŒå   &ÐBAÐCKÐUPÐ÷ ¸ÀePÐÐEÿ�Ý�$  ÁZP P P�1�0Àe0�$ÁÊPPPP P PPPPPPPPÐ�@âŠÐ�<âŠÈ8âÀe\ÐPUÐKCÐAB� Bd@ ý‡�‡ÂÊáÃ�Éá—¢:Ò‹Ã ú¶áÃ�µáÐ&�”à ý€‡÷5@úä÷ 4÷µ âÅúõðffæ…÷ �ûÆe…5 ÷xw Â Ò Ò�[áŠÒRá×-¶à‚Òò&Òè&ÒÞ&Òœà×->‚Òø&Ò'Ò 'Ò$7 Á°& ÀP ÷ öí÷ ¤å‡%%R-S-PROCOM, File %VA (%I) backed up with %I%D blocks%D blockemptyno errors%D error%D errors÷vã7 tã÷µ á÷edã÷`ã÷ \ÅZffæ…÷ ‚úÆe…õëÿ÷ =‡7 T÷LÅZ·Põãõã÷ €à÷6wÊ÷,wÀ÷ Äâ÷ òâ÷ ‡7æâ÷5Zã÷ Üâ÷ ‡7Ðâ‡À~ Á ÷ få‡× ±‡õÚ&õÖ(7 Âffæ…÷ hüÆe…õ  €õ%ùõ%Âÿ· ”w �w Œwˆ÷µ þß÷e€÷exw vÞ ÷5¾âõ �õÿÿ&5 (ffæ…÷ üÆe…õ8&õ4(÷ X÷ &(& & & æ æ5æt)& & & Εæææ ÿˆ& & & æ& & & & & Εæææ ÿˆ‡@Aõ¬áõ¨áffæ…÷ ^ûÆe…õ �÷èÿŒáu  ÷5ðáB¤Á ü7 ná‡w&äá÷ 0÷5Ìá÷ ,‡· r‡÷lwÆfÀ`x`)†$¸,Ô'`-b-d-&Ò'À* %BCK-I-NXTVOL, Additional output volume required ÅúÀ¼ß5œ,Àe5(ffæ…÷ ÷Æe…÷ ¦ffæ…÷ èöÆe…õ•õ•õ€ß.5ŠõýÿõE÷5ÞßõU÷5 ÐßõUffæ…÷ †öÆe…÷ ‡7 8ß÷Rþ7 PþÅJffæ…÷ RöÆe…÷6þwÊý÷,þwÀýÀìÞÁÝ Â�ÝÀh,à  à ýÀh,÷ ¾ÁðÛ Â�íÛÀˆ,÷ ¬Â È,Äh,�Š ÷µ FÜ&ô5Òœ ŠÒ� ŠÒœŠÒÒœŠÒ÷5@èÞÒœŠÒ   �Š�ŠÅúÀÀ)Á¨, ÷ DèõÀ)(u�,‡%VA%VA%VA%VA%VAÅZõÎÝõmÎÝõÆÝõíÂÝffæ…÷ v÷Æe…õ%°ý3õéÿ÷ l÷µ ,ÛÀˆÝPõ · ¦üЀõÐP P ÐfÝ   DÅJõNÝ&ÎmJݵ÷ †úÞ ±÷`üwôû‡‡‡ÿ ˜îØ €-ÿ �îØ Ð-ÿ ˆî !l.÷ dæÅŽæÀ¸$H` ` Áº$÷ °À²$Èà; ÁÂ$÷ š÷5ÌæÀÞ ÷5 ¾æÀæÀÖ÷5ªæÁÈ$æ†$ ÷5˜æÁÀ$æ‚$ÁÀ$æŠ$w ‡ ‚‡ÁÈ$À÷ ‚× ±‡ "!(!(!(‡ÿ 4÷2!l.7 Ý÷ Ýõ €÷ ÈÜwþÜ5 ÷ °†÷ ²†÷ ´7 äÜ÷æÜ±‡7 ÖÜ¡‡÷ ’Ü÷ †ð÷ ˆÜÄ$.Å<.fÿˆ&ÿˆ÷ 8û�±Ä.“ÃÅy¡‡ Do you wish to continue?  .. þ-ÿ ªíê l.ÿ ¢íü l.ÿ ší!l.00�:33l1DATADATADATADATADATADATADATAÄØ2Ì 7% ÜÔ ùÀP Á6/ Òe÷ .÷ æ÷ $Þ̵€   ÊêÛÁ@/ÀP ÷ æå÷ Þ× ±‡fõ¥ C$ssÅ ̵J�,Ò R(C&̵ÊœòÒ Ò̵ÊœóÒ Ò̵ÒrÛÊpÛ …‡?BCK-F-%I?BCK-F-UNKERR, Unknown error code %P„OPNINP, Error opening %VA as input‚CREOUT, Error opening %VA as output�PARERR, File specification %VA in errorNOFILE, No files matching %VAOUTDEV, Output files can reside on disks or tapes onlySYNTAX, Syntax error "%VA"CONOPT, Conflicting option "%VA"‚CMDOPE, Error opening %VA for command input‚CMDGET, Error reading command from %VAGCMLER, Command processor errorDEPEXC, Command file depth of 4 exceededGCMFIL, Error in command file name %VA„WCDERR, Wildcard processing error %VABADSUP, Output files on tape cannot be supercededBADREN, Output files on disk cannot be renamedBADREW, Output option /RW (rewind) appropriate for tapes onlyINPDEV, Input files can reside on disks only„CONFAL, Stream access to file %VA failed‚WRTERR, Error writing to output file %VA‚READER, Error reading from output file %VARCHKER, Check failure on file %VA block %Dþÿf/ýÿŠ/üÿ¯/ûÿØ/úÿ÷/ùÿ/0øÿK0÷ÿm0öÿš0õÿÂ0óÿã0ôÿ 1òÿ51ñÿ\1ðÿ�1íÿ¿1ìÿþ1ëÿ,2êÿV2éÿ€2èÿ¬2ÄÜ3Ì 5%Ô ùÀP ÁÐ. Êe÷ æ÷ *Þ7“üÛ÷E€ÿöÛ̵€Â JrÁÝ.ÀP ÷ Úå÷ øÝ× ±‡-RMS-E-ER$%I-RMS-E-ER$???, Unknown error: STS=%P, STV=%P�ACC, Access errorANI, Not ANSI "D" format�ATR, Attribute read error�ATW, Attribute write errorBKS, Bucket size too largeBUG, Internal RMS error condition detectedCHK, Bucket header corruptedCRE, Could not create fileDEV, Bad device or inappropriate device typeDIR, Error in directory nameDME, Dynamic memory exhaustedDNF, Directory not foundDNR, Device not ready�ENT, Enter function failedENV, Required RMS support not present�EXT, File extend failureFEX, File already existsFID, Invalid file-IDFLK, File is locked by other user�FND, Find function failedFNF, File not foundFNM, Error in file nameFUL, Device or file fullLBL, Not ANSI labeled tape�OPN, Open function failedORG, Invalid file organizationPLG, Error in file's prologuePLV, File prologue version level unsupportedPRV, Privilege violationRAT, Illegal record attributes�RER, File read errorRFM, Invalid record format�RPL, Error while reading prologueRTB, Record too big for user's bufferƒSYS, System directive errorTYP, Error in file typeVER, Error in version numberWCD, Wild-card encountered where not allowed�WER, File write errorWLK, Device is write-lockedXTR, Extraneous field in file specificationàÿ /�ÿ/`ÿ7/PÿR/@ÿn/ðþŠ/Àþ¶/�þÔ/@þð/0þ0 þ<0þ[0þu0ÐýŒ0Àý¨0�ýÏ0`ýé0Xÿ1@ý10ý<1 ýW1ýl1ðü…1üŸ1Pû»10ûÖ1 ûö1û2ðúC2Àú]2 ú}2pú“2ú¯2ÐùÒ2€ùù2`ù30ù/3ùM3ù{3ù’3àø¯3Ä®2Ì 5%Ô ù Á¤.ÀP ÷ æ÷ .އ JÁ±.ò-RSX-E-IE.%I-RSX-E-IE.???, Unknown code %PVER, Parity error on deviceEOV, End-of-volume detectedWLK, Write attempt on locked unitABO, Request terminatedRSU, Shareable resource in useBYT, Odd byte count of virtual addressBLK, Logical Block Number too largeNOD, System dynamic memoryIFU, Index file fullLCK, Locked from read/write accessHFU, File header fullWAC, Accessed for writeCKS, File header checksum failureRER, File processor device re00�B3žG3¶0eaek›’ad errorWER, File processor device write errorSNC, File ID, file number checkSOC, File ID, sequence number checkCLO, File was not properly closedNBK, File exceeds space allocated, no blocksBDR, Bad directory fileRNM, Cannot rename old file systemBBE, Bad block on deviceFHE, Fatal hardware error on deviceNFI, File ID was not specifiedEOT, End-of-tape detectedBHD, Bad file headerOFL, Device is off lineBCC, Block check, CRC, or framing errorNDR, No dynamic space availableBTF, Bad tape formatALC, Allocation failureULK, Unlock errorWCK, Write check failureüÿÐ.õÿì.ôÿ/ñÿ*/ïÿB/íÿa/ìÿˆ/éÿ¬/çÿÇ/åÿÜ/äÿÿ/ãÿ0âÿ-0àÿO0ßÿu0Ýÿœ0Ýÿ¼0Úÿà0×ÿ1Îÿ/1ÍÿG1Èÿj1Åÿƒ1Äÿ§1ÂÿÆ1Àÿà1¿ÿõ1¾ÿ 2¸ÿ52´ÿU2¬ÿj2«ÿ‚2ªÿ”2fÂEÿæÈûB`F‡÷ ~Î÷ .Îà÷ ò†Ó¥:÷ æ †Ó¥:@!÷ $Áèà Π @! ŠU`eãÈUU5ÄU€÷ þm†É¥[É¥<"Î@ ÷  †ÑÄË¥.÷ „† £ ÷ z‡Î0þQ £ÎUD’ÄeĤá„÷ ¨Ä_÷ ÖÄUÄ‹È5ÈE Î÷ lÎàÈU0 ÈE÷ pU5Î Ä.÷ ˜ †È5ÈE0 ÄU÷ LÄ. ÷ x‡Ä; ÷ n †ÄŠÄ-÷ bÄU÷ "ˆÖ …‡& N  †Ó¥"úÎ ùà  ‡U5CàƒÕM%‘Å ÄÑÄE¸ÿÄ Ä Ä AÍ5QÁ`C÷ „Á‡Ä_C& æ÷ p2†ö &Ä‹¥&Π˥A‚Ë¥Z†Ë¥a‚Ë¥z†Î Ë¥*Ë¥%Π˥$Ë¥_ Π˥0 ‚Ë¥9 ‡Ë¥7†Î ÁŽUƒ ÉÖ „– ‡ƒ  †ð‹�Ë‹øË¥ õË¥ ò±‡w Hð& & Â&‚~…ƒà Îl4/DÅ5Ã%Ž Ä „ „ Wqma…e ÃÁ&  ƒ †NaB aÅ D à ÷…„…eD Ã<R~ÀÄÁ. Ã�tæ @ A B C @ Å D †Àe€–A B C Áe˜B C Î íÖ „… aÖ%daAaB C …U•ÕÀ‡ÿÿ:Yw–´Óò/M|³Œs–,?6?6‰ÙV ›r[qÀÀÿÿ$V š<SYSYSYSYTISYOVžNÀÅÎ([([ðšÐžÀZ:â!œDRDRDRDRTIDRDB„?6Ù€X ƒÀÀŒn,ÅÎNÀ>500žJ33l1DATADATADATADATADATADATADATAÅÎÁe?ÁE? ‡& fŽ Ž Ž Ž Ž Ž æYÿˆ‡€–˜Ài*Éw ¨f¦ÆåƒÃeÀú‚÷ ˜ö5tƒ‚Ãe˜þB ÂeÀÁ±:÷ âà à æÁ @ Á @ CÀÁ±:÷ ÄÎ`ÁUCÀÁµ÷ ®B‚ ‚ ‚ Àd�÷ VÁ`ÁeÝfÄ€Á�÷ LÁ  €Ád÷ :Á €Á÷ ,Á  — ;ƒa @œÔ€ ƒà� W ÷f÷ °Ð•-�Á �eÁe°P”P”P”Е-�Â÷ BЕ ö50�ÁeƒÆåÀò‚÷ Šƒ‚–%ÀÁ<÷ æfÁ<÷ ÜfÁ÷ Ò@÷ (Õ•:€÷ €ö5Õ•:÷ @Æe‚�‡Á ÷ bÀe0Áe0�U�‡&@�Â÷ ¦Ž €%œÿÿð•0þÿ‡÷ œæA…UUUUÄ    ÄT T T T Áee(e(e(e(‚ÄTä” ” Œ $)TäŒ ´ TäŒ Tä±…U U U U Î ÙÖ ‡&fæ!  E D  ‚E ‚Eà„ à±C B ΊñÖ A…„‡÷ øæ@„    Àe à ± û‡„T T T T H1C„ÔdT T L $)ÔdL t ÔdL Ôd¡Î æÖ ‡JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC&æ  †€mÎ ù–%‡RPRP¢ÌÅÿSY:CMI.CMDCMIÿ’ž„ >P"@ƦLPP ÿQ ÿ&P#@¬ŒOPìOÿ PV OP¶Nÿw 4Ä'Å  ÅUD$†BA÷ F&�Â(÷ ÅU� ÀBQ÷ ºÂЕ* ü‡Â Âw Ô ”Å¥ üÅ¥ ùÅå0B¡†€÷ ÚAa”ôœÿÿ‡÷ &÷ &÷ �’•’•€‡@Á(÷ ¾f€  Àe ÀeÉÿÀe Àe ‡æ<w^ &æ¦f&¦ v Þ €�‚ƒ„…‡&f¦÷ Èwìÿ‚�€‡÷ àÿ÷ àÿÁ ‡Â w\&f¦÷ –1†�Áe?� � � � � � w¬ÿw ¦ÿ‚Á ÿ& fæYÿˆ†w ’ÿƒÁŒÿô±€Á Á Á Á Á Á Ânÿw`jÿ÷ ‚ÿ‚�€½– –5‡Ð06A2 ?2 SY:SY:ÂÎùÂeÂE ÷ lñæ& ÿˆ&À¶îæ. ÿˆ· Òù‡ ÁmÈù ‡ž¦ ʺùà�bŠå‚‡ABDEFIMNOPQRSTUXYZ<>Å"BaÊ$ep|v¢­$Ê®¶ÅÏJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC00žR3G3¶0eaek›’w ª && D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ Œ÷À ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚bÂEÊ Ö ÌЕ%„Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ ’ �à õ‡& æÎet 6& ¦æÎe` /& æÎe€ö*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎe& & ¦æÎe Е A‚¦Þ à ÷–%‡& æÎeæ òA÷ –öà û‡Ð• à ü‡A÷ bE‡AÂ÷ †E‡Ð• Aæ÷ böAÎ ûÖ Â ÷ $Е.÷ JöÂ÷ AЕ; ÷ d à à‡Â ýð¥ ÿÿùÀ øw À D…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w � DÅ… ƒ÷ &Е.À À À ce÷ ¨ À …Е:÷ Å ù Â÷ ÊB‡TI0:RMSRST.LIS÷ ôB÷ D„÷ Ä øB÷ ‡�Àn÷ *ô‡ÀåDffÅ õ õD5ffæ…÷ ¸óÆe…ÁDÀ Á"€ & & & æ &f& & & Εæææ ÿˆ…�ÀD‡÷ Øñ÷5þñ&÷ |ÿ€ÀåDfÁDÀ Á"€ & & & æ &f& & & Εæææ ÿˆ�ÀD‡ÁÉ ÷ ¼÷Nw¾„4 ô€÷˜âÞ‡C3 3 ó€ó €É,Ä, ÍUóE€s3wJæø–�¦æ&fÃÒÑ BÀ˜þ… *ƒÅ Í‹'Â% Í¥!‡Í¥EÀàúÂ%,‡À€ý… ƒÅ D„Œ†„ŒÀ5 ‚‡õ¥  õ¥PBÄ2Ì þÂ%pÀÐÿÄ‹ñó5Jó³ J€÷ àþó J÷ …„ƒ‚�€‡@ºÿµ ºÿõÅüÿ´ÿEÍ¥ó‚A�î†A� êƒÁ I& æTIææÿˆ& æTIææÿˆ÷ hÀúðMÂð•ÿÄðôðdö÷ N,‡&øú÷ .C€à áÅþ(º(Á7 ðû7 æû7 xû÷ †÷ nû÷ùÿfû÷fû7dû÷ Àú÷ îÁ÷ 0¾†æNûæÿˆ÷5ªû÷ ¦÷5žû÷ Ü÷ ª÷ ª§¬òöÿ¬òÿÿ¬òûÿ¬òüÿ¬òýÿ!¬òþÿ&÷õÿæú÷ ž× ±‡ÅeõÐùÅeõöÿ÷ |î÷óÿ¸ú÷ pèÅeXõôÿ÷ ^ßÅeXõ÷ÿ÷ LÖ& & & æ æqæj& & & Εæææ ÿˆ‡ÀJú÷ ü7 @úÀ:ú72ú÷ ðû÷À²ú7ªú÷ Þû÷Àžú÷ Òû‡ RST>%RST-I-ID, RMSRST Version 2.103A (September, 1985) Copyright (c) 1985, Digital Equipment Corporation×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ <J Àÿ 4¤ 4"ÿ ,¶ l"ÿ $¶ ’$ÿ ¶ ¬"ÿ È 8"ÿ Ú d"ÿ F!°/¦Þ5Îe‡w ¢Á,… Bv ù    ù ‡‚Ê5ôùB‡w¶ù ꄦÊ5‚ú‚‡ò û¦¦‚ Ž (Ê5(ÊUW¬ ‡Ä ò ƒ Ä ó  €ææwÿˆóE€Ê5 ÛÊE Ž‚ØÖ ‚ÇW¬ ͇Ê5 ÊÄ È„,ÅÊE é8 ìXžLßî&w”þÊEò ÊU ‡æ&W¬ )‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w 4…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ DW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡w  ÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w \  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡&æf…Þ ƒ„…‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡&æ¦ff… Þ �‚ƒ„…‡›r[q›r[q¶0îj– ÜàäèÎntN€jj‡àÀJ 8 ›r˜ÆðÀ@\ 8 € IqäMâ!ðà@J n IqÿMö!ðà@J \ IqÿM "ðÀ8 J U(U" 4"¤ F!1ul†�4"0’ ¶ [qð3�4"¸’ È [qE,�4"D ’ Ú [q:d�4"4ì ’ ¤ [qqQ!�h$$Ú þ [q "�h$ˆ!Ú ì [q&$�ð&"!þ 4![qr %�ø'¸!"![qƒ2)�ð&ˆþ ![q!+�°/hX!²![q"",�0äF!j![qe†/�0F!|!�r3�0ÈF!Ž!�s6�00F! !BuCR8�0äF!X![qt9�06’ U,žNNÆ!XžÆ!:žžžžžÒÀ‚à00žZ33l1DATADATADATADATADATADATADATA‚à‚À€Àf"& & & & ¦f& & & Εæææ ÿˆê‡~"ðn#÷e$/”%øŒ&Õ RMS-11 Version 2.100 Restore Utility Function: Restore backup files written by RMSBCK Format: outfile[/option(s)]=infile[/option(s)][,infile[/option(s)]...] The output filename and extension must be wild cards, that is, *.* Global options: ? or HELP type this help message ID identify current version number [NO]QU enable or disable query mode SL[:filespec] write a summary listing [to the specified summary listing file] Outfile options: [NO]CV disable or enable version radix conversion FR alter protection codes NV create new versions of output files RA read data after writing RC read and compare data after writing SU supercede existing files Infile options: BD:dd-mmm-yy select files based upon date of backup OA:[dirspec] select files based upon the original account SE:speclist select specified files for restoration from the specified backup container file(s) Dirspec is an acceptable directory specification which may or may not contain valid wildcard characters. Speclist can either be a single file specification, or a series of acceptable file specifications enclosed by a parenthesis pair, and separated by commas. File specifications are in standard format: device:[directory]filename.type;version Wildcard characters such as '*' or '%' are valid in the directory, filename, type, and/or version fields. æ,wzõæ0wrõæwjõæHwbõæ8wZõæwRõæwJõ&¦æ Á ÈÅ€¢ ‚ЋÁ ö¢a‡¢z‚ÈÅ ”ƒ Á êÁƒ‚€‡w Rü0 ø0ú0ð‹ü÷ ȇpúpM÷ $†w`ðµ€ówð \ ðµ ó÷ î‡÷ .ð%°ýwÀðµŠ0ö"0ô Áep"ð ÷ çð lìp0÷ ôþð•ð *" °`øÂ Dðµó ¦�`W¨aW¢zÉÅ Â ö‚0,úw´É¥;ðµó&wöþwöð¥Ðùæûÿð%°ý7œü Ä ðµ€ó÷ Hwÿ÷ ˜ðÅ€óðŠüæöÿ& ðµ ó ðÅ óðÕ€óð•ÿÿüðµó &^&`÷ €°`°^°“òV ‡æÿÿÞæþÿÛæýÿ׿üÿÔðµó�`W¨-ð‹ó€ðÅ€óðÕ óÂ ð ø°`w4þwrÿw lúð‹ü³ðŠüðåþù°Šü÷ €§É¥@Ñðµó 0¬üýÆ�  p€°�„°ø° ø÷ Øðµ@ó ðÕ@óðå‚ð• …÷ ð ^ �0 ø00úwÔý&^&`÷ °`°^wÿ÷ TþðåþðŠüõµ€ó-0®0 °0™°0™Š0´0¶0¸ðUj0Š„÷ ˆ‡000ð•ðµŠð•0ð%°ý‡Ö Àw Nùð \"°ŠüþðµŠ÷ |ü¸¶´œŠœ°®0þ÷ Œ‡U%ð  ÜÄÃeÃEÆà°Â÷ 4Æ`0 Â÷ (e)ðEj0`0^�÷ ôûð ¡±‡0Šnð5j÷ þûð ^�ðµŠðÕh÷ ÆûðÅh÷ Òû‡U%÷ ¢ûe)‡0ŠüÉ)fÿˆ‡Ñ Â&÷ 2‡× /×  ×  ô÷  ‡×  ú×  ÷R¨ðÕ€ó¡‡ÂåC”‡00žb3G3¶0eaek›’7 &f¦wì÷‹è÷ Æ7 à7ÞÀâÈ @•,€ÀåÀÿq `-KacJE[à !Ãm¢Äíž@•Á †Õ Á ûα)÷ L÷ R†é  çà å÷j7•jà f@• †Õ †&Ý €…Ò€Ö À5]U ¦†E¤¯‚…€Á(‡ :Á‚æ&@E÷ ÿA ·Îà· ̆ª ÷ Š÷ Р¢ÂÀEÿ÷ vœÀEÀÿÀ €cÁÐÂΤ‘Á ü¢ÿ­÷‹¹‰÷­´±¦†„÷ @�Á à £.„ à · ’æ&fÅŠÄ„Ã6$Á ÷ ÷ …„ƒ¶à ÷ 8 †À ÷ "†À £.£$· B„ à ë÷ 8‡Ì¥Z‡£A‡Ì¥9‡£0 ‡ à £ £ ‚ „ à ö‡f¦Á¤ðÁeÁEÁeÀn ÷ 4æ‡0 pð‚ðð~ð0 0 ðlðÁbðÂeæ\ðR”Î ýÖ ‚�‡÷5Hð÷øÿÖïÎe÷U6ð‡÷54ð÷øÿ¼ïÎe÷U"ð‡÷5 ð÷øÿ¢ïÎe÷U ð‡÷5ð÷øÿˆïÎe÷Uîï‡÷5€æï÷øÿnïÎe÷UÔï‡÷5@Ìï÷øÿTïÎe÷U@ºï‡÷5¬ï÷øÿ:ïÎe÷Ušï‡÷5€˜ï÷øÿ ïÎe÷U€†ï‡÷5~ï÷øÿïÎe÷Ulï‡÷5dï÷øÿìîÎe÷URï‡÷5 Dï÷øÿÒîÎe÷U 2ï‡÷5@0ï÷øÿ¸îÎe÷U@ï‡÷5@ï÷øÿžîÎe÷Uï‡÷5üî÷øÿ„îÎe÷Uêî‡÷$þèî×-âîƒÎe÷ïÿ^î‡×-Ðî ‚÷ ÈîÎe÷ïÿDî‡÷îý¶îö×-°îd÷ƒ÷ål¦îî�×- îdê†î÷Æý~î7 |î7 zî7 zî‡÷ nî ÷¬ýfî÷bîbî÷íZî\îÎe‡÷ ¸ã÷  ý7Ìí‡÷ ªã÷ ’ýÁrñ Aú1ð0îð,îð(î ð$î ð î7 î7 î7 î7 î‡÷]üíøí7 öí‡÷æí4ý÷èí2ý÷Üí*ý÷Øí(ý÷ýÌí‡÷ 2ã÷ ý7Hí÷ ý¸í÷ý´í÷ý°í÷üü®í‡÷5þ¦íæ íÎEmÿ ·5–í÷ ôâ÷ Üüð�í7Ší÷Æütí÷Âüpí÷Àülí÷¸üjí‡÷çÿöìÎeù÷5Û€VíæPíÎEÿ« ·5Fí÷ ¤â÷ Œü7>í÷|ü*í÷xü&í÷vü"í÷nü í‡÷çÿ¬ìÎeùIDENTIFICATIONÿVERSIONÿBDÿIDENTIFICATIONÿNOQUÿOAÿQUÿSEÿSLÿVERSIONÿJANUARYÿFEBRUARYÿMARCHÿAPRILÿMAYÿJUNEÿJULYÿAUGUSTÿSEPTEMBERÿOCTOBERÿNOVEMBERÿDECEMBERÿCVÿFRÿIDENTIFICATIONÿNOCVÿNOQUÿNVÿQUÿRAÿRCÿSLÿSUPERCEDEÿVERSIONÿâ'ñ'ù'ü' (((((($(,(5(;(A(E(J(O(V(`(h(q(z(}(€(�(”(™(œ(Ÿ(¢(¥(¨(²(Æþ(Ȧ+ÈB)þ(È2)œ&)ʄȅP) ),ª&)Èb* )ʆª&È�P)ÈD+6)À€=„/€€ö%�†ö%À‚h&ÈÞ)€ô`)À€Èø)n)È6*n)À€*€ôn)%€ôn).š);Æ)Ò@ôn)Ô@ôn)À„Ø)*ôš)%ôš).Æ);Æ)Òôš)Ôôš)À„Ø)*ôØ)ÔôÆ)À€À†|&_Þ)Ò€$ä)_ä):Òä)Ô„ä)[€À‚ü&%öþ)*öþ)Ôöþ),€%ö**ö*Ôö*]†ö&[€À‚ü&%@ö<**@ö<*Ò ö<*Ô ö<*]†ö&/„f*‚¤$òš*ƒö%„ %…@% +†Z%‡¨%+ˆÂ%Ž+‰†ö%:€Ì‚&-€Š+‹+Œ+�+Ž+�+�+‘+’ +“ +” +•œ +-€Ì†,&:€À‚'ȃP)|&À†˜':€((+È…4+È�4+),„(+À‚'ȃP)|&À†H'/€–¾$—Ø$˜ö%™ò$š %›&%œZ%�t%žŽ%ŸÂ%Ž+ Ü%¡†ö%:–+À„À‚'ȃP)|&À†"'?º+H€E€L€ÊøP€Êœøw <óÁ w 2óÁ& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡æ,wzõæ0wrõæwjõæwbõæwZõæ wRõ& æTIææÿˆ÷ üñ÷ Ò†wHÀîñ&Ŷ5œ,Àe5(ffæ…÷ šÿÆe…õýÿ÷ ¦†‡Å ffæ…÷ lÿÆe…÷˜ñœñĘñu7”ñ7ŒñÅ5�,Àe5(ffæ…÷ FÿÆe…õüÿ÷ BÞ‡7Ìñ7 Òñ7 Îñ7Êñ7 @ñõU÷ Üffæ…÷ ÿÆe…õ%lûWõòÿ÷ ô †õ%ðúè×-ñ¯ã÷eöðffæ…÷ ¸þÆe…7 èðõEõþÿ÷ ²†×-Öð’Æ�÷ &†×-Äð÷Ŷffæ…÷ VþÆe…‡÷ nf Åffæ…÷ 6þÆe… ‡÷�&ò%ò›÷ hðÒõûÿ÷ @Ì÷ 2æÂ€÷5 Âð ÀDðÂŒ‚ Aû·�èñ·�åñ‡ÿ ø÷ì h$ÿ ð÷þ v$ÿ è÷F!°/00žj33l1DATADATADATADATADATADATADATAÅÄðô5Iô5@ô5 ô5ô5ô5 ô5÷ìÿÚï÷ Ðe5�,Äe5(ffæ…÷ „ýÆe…õüÿ÷ ¢N‡õµ'2÷æÿ˜ï÷ ŽD÷xï|ïÄxï=7pï5�,Àe5(ffæ…÷ .ýÆe…õüÿ÷ L#‡õµ(2÷åÿBï÷ 8ô5  õµ 2÷íÿ&ï÷  ô5÷äÿï÷ × ±‡ÿ ÆöF!°/æhælw@ó÷ð7 ð÷µ ²â÷eôï÷ðï÷ TÅVffæ…÷ ’ýÆe…õëÿ÷ .\‡7 â÷Ú7 Þ7 ÜÅV·Úõ¤ïõ¢ï÷Æw–÷ hå÷ Šï÷ ‡7~ï÷5òï÷ tï÷ ‡7hï‡ÀnÁ ÷ nå‡fÅV5 &5 (÷µ úáõ\&õX(ffæ…÷ ÿÆe…õ<&õ8(…‡× ±‡÷e$w "‡Æ*À$xŽ%¸&À&r%È&Ð&Ø&à&p%ÿ �õ!ð&ÿ ˆõ4!ø'ÿ €õ4!Ž)ÿ xõ4!Ø)ÿ põ4!$*ÿ hõ4!ð&ÿ `õF!°/ÅV÷‹:ïO÷‹5ïLõ ÷ þõ%°ýEõñÿ÷ Ò?‡÷e|þw zþ÷µ à÷ r*‡÷ ”'‡÷58°í÷ Ž ‡÷5¨í÷5 í @Àm"í,ð5Z÷ h÷ l‡5 ÷(þwøý5 ÷µ ¤ß¬5 ÷ þwÜýÀÆß, &\· Æì7,Àì× ±‡ÿ zô"!)ÿ rô"!,ÿ jô"!\(ÿ bô"!˜*ÿ ZôF!°/€€@@ €€€€@@ ÷ øá æ5æ±ÿˆ‡×­´×Å ÃìÀ( ÁÜ,¤;Á ûÁ %B`Ê• ô5Z ÷5LìÅ ÷ >÷ & ô5ZÅ ÷ Å ÷ Àì(3�,‡& ÷ èà€ ÷ Zô‡& ÷ Ðà€ ÷ Tô‡÷ NáÀpëÀmrëW$BAW$CKW$UPÁeòW$PUW$KCW$AB ð  ,‚÷ × ±‡Å÷ðÿ*ë÷ 6öÀ ëÅì5œ,Àe5(ffæ…÷ ÌøÆe…D& ÝÀH*à  à ýÀH*÷ îÁÈêÁmÊêÁe BþÿÀh*÷ ÖÂÃh*ÄH*�Š Òœ ŠÒô52� üÿ2þÿÒœŠÒÒœŠÒÒœŠÒ÷5@Öê" " ÅìÀ¸%Áˆ*Â÷ Äçõ¸%(u�,‡%VA%VA%VA%VA%VA÷ ¼ßÅìÀÚéÀmÜé,÷ ‚÷ ÞõE÷52êõUõ¬÷5 ê5 ffæ…÷ V÷Æe…õýÿõ%ðúõãÿ÷ Œ‡Å<ffæ…÷ ÷Æe…÷xú7 vú7 xú‡5\ 5Z 5œ^5œ_5œ`5œa05œb15f 5d"5h5j7†4Ý7„,Ý7Œ(ú7Ž$ú7� ú‡5\5œ^õÅð5œ^õÅ5œ_5d 5b 5œl15œm05n5p7šÌÜ7˜ÄÜ7œÂÜ7fºù7h¶ù7j²ù‡÷58æè÷ FÞ÷5Úè÷ 0‡÷5 Ìè÷ |‡÷5¾è ÷  ‡÷‹W€÷ÍQêé× ±‡Å(èÀ/÷ 8À6/Èà; ÁF/÷ "ÀÚÁD/÷ x‡ÀÚÁL/÷ j‚× ±‡& ÎÝ„éÎÝ�é·“à÷•ÛÀN/Á Á ýÁ¢ÚÁm²çBÁe ÀN/÷ FÀ”çŽ †÷ †÷ŒŸAö× ±– ‡÷ LÝÄn/Å Å ýBÁeÀn/÷ þÁN/È5÷ lÈ5 œDEœ÷ r!‡È5 œDEœ÷ V‡È5œDEœ÷ 8‡÷ÍŸè× ±‡÷Õ€÷¡‡È50ÈU ÃÆæÃøó5Tô‡Å à ”¤à ü× ±‡Äœæô5@ &ÎEÿë—%÷ †÷ X‡× ±‡ "!(!(!(‡ÀN/Á Á ýÁDÙÁmTæBÁe ÀN/÷ èœ Äe÷ nÿD‡ÀN/œ Â’/÷ 6‡ÀeÂŽ/÷ "‡Á’/Ê �J"ò �r,× ±‡÷ °Û 2 ¢[÷ 4¢<ù÷ ,Ê¢, ÷ ÷ ò¢]¢>× ±‡Ð‹Á ‡& ¢*’Äå0 ‡! ‚Î ¦Î Î Žea÷ Ôÿðƒ‡Îÿÿ÷ Æÿù÷ ,Û÷ p‡ÿ °ìF!°/ÿ ¨ìŽ!0ÿ  ì !000žr3G3¶0eaek›’Åìõ¬÷5 øí5 ffæ…÷ ûÆe…÷5@Øí÷ ÷‚þwRþÂÒŒsÒ�máŠÒdáW- ‚ÒÕ'ÒË'ÒÁ'R ×-Hþ‚ÒÛ'Òå'Òî'Ò.þÁ”'ÂÀD÷ rê÷ Üî‡%%R-S-PROCOM, File %VA (%I) restored with %I%D blocks%D blockemptyno errors%D error%D errorsÅVõ  ÷ $ýõ%°ýõñÿ÷ V^‡÷µ ß@,÷zýwJý,÷hýw8ý,=÷µ àÞ÷ ê6‡÷e:ýw 8ýDÅ<&Îm ìµ&Îíìµõý&õý(ffæ…÷ ÌûÆe…õøü&õôü(õêÿ÷ °÷eàüw Þü÷ ÅV5 ‘· Òüø÷5ì/@Aõ�ëuffæ…÷ dûÆe…õéÿ÷ Z‡÷èÿlëw&èëu ô÷5Êë B¤ìÁ ü· jü7 Bë‡@fÎå,, 7,<ü 7,6ü7,ë× ±‡7ü7üö& & & æ ææÂ)& & & Εæææ ÿˆ÷ ðûwÀûRESRWT - Rewrite Table& & & æ ææ *& & & Εæææ ÿˆ÷ ¦ûwvûRESRWV - Rewritten VBNs& & & æ ææX*& & & Εæææ ÿˆ÷Zûw*ûRESSPT - Suspect tableÿ ÚñF!°/7 Öä÷ Ðäõ €÷ ”Úw¾ä5 ÷ ,†÷ .†÷ 07 ¤ä÷¦ä±‡7 –䡇÷ ^Ú÷ ðÿ HìX!0ÿ @ìj!0ÿ 8ì|!0ÄŽ5Ì 7%däÔ ùÀDÁâ0 Òe÷ .÷ ºá÷ ”æÌµ€  ÂÊ.äÁì0ÀD÷ šá÷ tæ× ±‡fõ¥ C$ssÅ ̵J�,Ò R(C&̵ÊœòÒ Ò̵ÊœóÒ Ò̵Ò¶ãÊ´ãÂ…‡?RST-F-%I?RST-F-UNKERR, Unknown error code %P„OPNINP, Error opening %VA as input‚CREOUT, Error opening %VA as output�PARERR, File specification %VA in errorNOFILE, No files matching %VA‚APPERR, Error opening %VA for appendSYNTAX, Syntax error "%VA"CONOPT, Conflicting option "%VA"‚CMDOPE, Error opening %VA for command input‚CMDGET, Error reading command from %VAGCMLER, Command processor errorDEPEXC, Command file depth of 4 exceededGCMFIL, Error in command file name %VA„WCDERR, Wildcard processing error %VA„READER, Error reading backup file %VANOTBAC, File %VA is not a backup fileSELUSE, Input option /SE (select) appropriate for tapes onlyBADOUT, Output file specification is in improper format„CONFAL, Stream access to file %VA failed‚WRTERR, Error writing to output file %VA‚READER, Error reading from output file %VARCHKER, Check failure on file %VA block %DBADVAL, Bad option value "%VA"OUTDEV, Output files can reside on disks onlyINPDEV, Input files can reside on disks or tapes onlyILOGBD, Input option /BD (backup date) appropriate for disks only„INPPRV, Insufficient Privileges to Create %VA as output„CLOOUT, Error closing %VA as outputþÿ1ýÿ61üÿ[1ûÿ„1úÿ£1ùÿÉ1øÿå1÷ÿ2öÿ42õÿ\2óÿ}2ôÿ§2òÿÏ2ñÿö2ðÿ3íÿD3ìÿ‚3ëÿ»3êÿå3éÿ4èÿ;4çÿg4æÿ‡4åÿ¶4äÿí4ãÿ05îÿi5Ĉ5Ì 5%Ô ùÀDÁ|0 Êe÷ Àá÷ šæ7“@ä÷E€ÿ:ä̵€ÂJrÁ‰0ÀD÷ Žá÷ hæ× ±‡-RMS-E-ER$%I-RMS-E-ER$???, Unknown error: STS=%P, STV=%P�ACC, Access errorANI, Not ANSI "D" format�ATR, Attribute read error�ATW, Attribute write errorBKS, Bucket size too largeBUG, Internal RMS error condition detectedCHK, Bucket header corruptedCRE, Could not create fileDEV, Bad device or inappropriate device typeDIR, Error in directory nameDME, Dynamic memory exhaustedDNF, Directory not foundDNR, Device not ready�ENT, Enter function failedENV, Required RMS support not present�EXT, File extend failureFEX, File already existsFID, Invalid file-IDFLK, File is locked by other user�FND, Find function failedFNF, File not foundFNM, Error in file nameFUL, Device or file fullLBL, Not ANSI labeled tape�OPN, Open function failedORG, Invalid file organizationPLG, Error in file's prologuePLV, File prologue version level unsupportedPRV, Privilege violationRAT, Illegal r00žz33l1DATADATADATADATADATADATADATAecord attributes�RER, File read errorRFM, Invalid record format�RPL, Error while reading prologueRTB, Record too big for user's bufferƒSYS, System directive errorTYP, Error in file typeVER, Error in version numberWCD, Wild-card encountered where not allowed�WER, File write errorWLK, Device is write-lockedXTR, Extraneous field in file specificationàÿ¶0�ÿÉ0`ÿã0Pÿþ0@ÿ1ðþ61Àþb1�þ€1@þœ10þÊ1 þè1þ2þ!2Ðý82ÀýT2�ý{2`ý•2Xÿ¯2@ýÅ20ýè2 ý3ý3ðü13üK3Pûg30û‚3 û¢3ûÁ3ðúï3Àú 4 ú)4pú?4ú[4Ðù~4€ù¥4`ùÂ40ùÛ4ùù4ù'5ù>5àø[5ÄZ4Ì 5%Ô ù ÁP0ÀD÷ Äá÷ žæ‡ÂJÁ]0ò-RSX-E-IE.%I-RSX-E-IE.???, Unknown code %PVER, Parity error on deviceEOV, End-of-volume detectedWLK, Write attempt on locked unitABO, Request terminatedRSU, Shareable resource in useBYT, Odd byte count of virtual addressBLK, Logical Block Number too largeNOD, System dynamic memoryIFU, Index file fullLCK, Locked from read/write accessHFU, File header fullWAC, Accessed for writeCKS, File header checksum failureRER, File processor device read errorWER, File processor device write errorSNC, File ID, file number checkSOC, File ID, sequence number checkCLO, File was not properly closedNBK, File exceeds space allocated, no blocksBDR, Bad directory fileRNM, Cannot rename old file systemBBE, Bad block on deviceFHE, Fatal hardware error on deviceNFI, File ID was not specifiedEOT, End-of-tape detectedBHD, Bad file headerOFL, Device is off lineBCC, Block check, CRC, or framing errorNDR, No dynamic space availableBTF, Bad tape formatALC, Allocation failureULK, Unlock errorWCK, Write check failureüÿ|0õÿ˜0ôÿ´0ñÿÖ0ïÿî0íÿ 1ìÿ41éÿX1çÿs1åÿˆ1äÿ«1ãÿÁ1âÿÙ1àÿû1ßÿ!2ÝÿH2Ýÿh2ÚÿŒ2×ÿ®2ÎÿÛ2Íÿó2Èÿ3Åÿ/3ÄÿS3Âÿr3ÀÿŒ3¿ÿ¡3¾ÿ¹3¸ÿá3´ÿ4¬ÿ4«ÿ.4ªÿ@4fÂEÿæÈûB`F‡÷ ~Î÷ .Îà÷ ò†Ó¥:÷ æ †Ó¥:@!÷ $Áèà Π @! ŠU`eãÈUU5ÄU€÷ þm†É¥[É¥<"Î@ ÷  †ÑÄË¥.÷ „† £ ÷ z‡Î0þQ £ÎUD’ÄeĤá„÷ ¨Ä_÷ ÖÄUÄ‹È5ÈE Î÷ lÎàÈU0 ÈE÷ pU5Î Ä.÷ ˜ †È5ÈE0 ÄU÷ LÄ. ÷ x‡Ä; ÷ n †ÄŠÄ-÷ bÄU÷ "ˆÖ …‡& N  †Ó¥"úÎ ùà  ‡U5CàƒÕM%‘Å ÄÑÄE¸ÿÄ Ä Ä AÍ5QÁ`C÷ „Á‡Ä_C& æ÷ p2†ö &Ä‹¥&Π˥A‚Ë¥Z†Ë¥a‚Ë¥z†Î Ë¥*Ë¥%Π˥$Ë¥_ Π˥0 ‚Ë¥9 ‡Ë¥7†Î ÁŽUƒ ÉÖ „– ‡ƒ  †ð‹�Ë‹øË¥ õË¥ ò±‡w æî& & Â&‚~…ƒà Îlà0DÅ5Ã%Ž Ä „ „ Wqma…e ÃÁ&  ƒ †NaB aÅ D à ÷…„…eD Ã<R~ÀÄÁ. Ã�tæ @ A B C @ Å D †Àe€–A B C Áe˜B C Î íÖ „… aÖ%daAaB C …U•ÕÀ‡ÿÿ:Yw–´Óò/M00Ÿ‚3G3¶0eaek›’›r[qÿÿ?€€ HÀU–%ö  .w* wDw ¶¶€æŽa† ¶^Ä‡Ä‡Ä‡Ä ‡Ä(‡Ä0‡ýÁ‡Á‡ýÁ‡Á ‡Á ‡ýÁ‡Á‡Á ‡ýÁ ‡Á‡Á‡ýÁ‡Á‡Á‡ýÁ ‡Á ‡Á‡ýÁ$‡Á$‡Á ‡ýÁ(‡Á(‡Á ‡ýÁ‡Á‡Á ‡ýÁ‡Á‡Á‡ýÁ‡Á,‡ýÁ0‡Á<‡Á8‡Á4‡Á@‡ÁD‡Á‡Á,‡Á‡Á‡Á‡Á ‡ÁH‡Á‡Á ‡Á ‡Á ‡Á ‡æ   C A @ ‡à‚ Î ÷Ö ‡æf À A �#‚�〠ö ÷ &æ  †€mÎ ù–5‡Á÷ ÞÿfÁ€÷ Òÿ€eC ‡´­ƒ�÷ ˆ‡´Šô‡æCPÎU£ à À,Á, Ãö&À. 0 0 úÿà – ó  Ä,ðúÿÃ`úw3Š ó ³óÅ ³ ƒfƒ÷ ø†–%wè± ±±CðúÿÎ5Î5ó‹ ¦Á÷ ‚†Ã`ú0 úÿVC¼óÕ 3³Š Î5ó æƒ÷ Žƒ†@ssóÅ ñµ óÕ 1 1 ÁÎ5ñµ Î5÷ ¢ †"`ú 0 úÿ1 1Š ñÅïÿ £ ÷ xñµ ÷ fØÃÈ– &V ‡£ A ñ‹ B,‡ñµD Ã5 ñµ Ã5ñ AãÁ È þ±ñµ ñµ ¦÷ ‚†È8þ‡ñÅïÿ 1 1 1 ‡£ óµÃ ‡õæ Â÷ p†55ƒæô‹  ‚Ã÷ –ý ‡úÿÂ÷ >ôŠì– ÷ Žÿà ôµ    Ã÷ bý‡úÿÂ÷ õ þw ·ƒ"±¡‡·Ê‡æ¦& ÃÿŽdà ýƒÞ ƒ‚‡Á€ ÁÀÁ@@ Á@¦õÅ 9æC@&æÎe$æÎe& Μ Á †N<B>& ŽŸ2¶ã†ŽmÁ‹€B>‚oÀ Á €€€oó‹ "�¤jÎ üóµdó¥ €€`à¥[‡Î ]Ò¬ VÎ ûö Uöe¶ Åó¥ 5ƒƒ`昃à`ö’ƒÓ$‹ÓEðð‹ËEã¥ËŠã¥ËŠÓEþþã¨Ó &€‚ËÎ ˤ!%�¤øÓ Ë Î ¦”Ôã‹ ÷‚c€cóµ  ¨ ÎŽ Î  ¨ü÷†ÎµÓ9Æe ƒ‚‡÷ ‡ú‡ð¥ œ A>Ì55,<‚lÉ¥Ÿ ‡f”ÎEðÿÊÖ¥ ‡ô—¥ ÃPü‡÷ † &&ÎeæˆÂ÷ *†ÅeLÍPÿu¼ÿwØ ÷   wê÷ ûúÿ† "`ú &&÷ ®ˆ° ±‡ñµ ‡f&öÿ&÷ À€×¢ 󬆱, ±,‡ A�`¡¢òµüÿ ÈÀþ– �Ã�&÷ p€�¡‡÷ ¬ ‚œ‚’‡÷ Áe‚œ‡Am:C”ÃEüÿÃeB@Þ ¦& & À CÜÿÿ‚R”À ý�€‚ &VP±‡5LÁxÁn÷ nfüÿfÁ �eÁañ øæÎEÿN�ŠÁÎe ¦ŠÀÅåLuH=w $EÅ AaÁañ ²÷Á&ÎEÿ„CÎŽ Ž æÎez÷Ö.*E�e{XE"Ö ‡Q�c æ & &fæ€& æÎe  Ž Ž Ž Ž Š…fæuÿˆ%‡Æe‡‡æ.æÎe÷Ö.(÷¦¶öPæ(Îe¦æXw÷æ^çæ`äÁ%ÞÀäûþó N/æ,Η%ó‚æÎeÆöŽ%û PÁQ4& ߥÿÿ&âæ1ÿˆ÷ ˆ 8àPKQà›r 8&æ9ÿˆê‡„ Ä%솀wÎà +æ‚3‘”à �3Ãå†Î@à Çà‘‘‘‘‘‘‘‘ð†à Ãå†Çà‘”‘”‘”‘”‘”‘”‘”‘”ó†Ö ‘” ‡ñÅ#  ñ‹ Ã.ÃÀ0 ¦µ1!È0úñµ ñÅ Â5ñµ Â5Â5 ÷ ú÷ ôe‡Î5&÷ €YÎ5ñµ T÷ ÆS‡PñŠ Kñµ ñ• ÷ ªE‡ñŠ >÷ ˆ÷  Î5&@¡ñµ@ ÷ ®‡÷ €)ñµ %£ Âe ƒÁ Cò ñµ óµ ÂÃòñrÂã÷ È– &V ‡p öÿ0 öÿp øÿ0 øÿ‡£ òµ  ö5òµ€¡‡wÞ£   ð ð‹ ðµ@ ðÀ pppœ ðÅïÿ 0 0 0 ñÅ 1 1 1 ±‡Ã.ÃÀñ (f&öÿ÷ 000ŸŠ33l1DATADATADATADATADATADATADATA1, 1,‡ &£ 4¬„‡ñµ ˆŠA`!’�÷ ì�÷ ºý†&&÷ ¦ý°ˆ&V ‡¦v�e�óN³*•PU5DÕ Åe0Á  Ì üS÷ Rü  æÂå,‚¦ærw( Ž`‚ ‚ u½µÿÆÿ€ó J AÁeLK›UËŠý€õ#ÂåE†@ØÿÍ€ý€ *ƒÀ ÁåPÁ5ÿ"÷ <÷ ‡05¸ÿÈEÿßBÉ5ó J õµ´ÿó‹H€Ë‹ÍÐÿQÍÀü„ MƒÄ Ì¥ IÌ5òÀ 5¸ÿAÛ‡@Ípü€ 8ƒÀ È¥ 4È5Ý ÷ ¶ÿÂ% ‚ÎDŽ`ÍPù�‡`_ ,/O&PXVUTSÁEöÿͰúÁEýÿuÊÿÎÿBÎÿ‚ ƒÈ5 =Í�ü/5 Ìÿõ Êÿ*Í@ùõ Èÿ%ÁEýÿ ÁEþÿ ÁE÷ÿõ ÎÿØ M�ÄÿÍŠ õ Ðÿ ô¥ ƒÍ`ü ÍŠ ÍÐúuºÿgÁEûÿÁEïÿÈ5 ÃÍpýÁ ñÈU H ‹ Ì5@\ôµ .Î%Íàþôµ -ó /÷ &,‡3Äe"5Àÿ5¾ÿ5Âÿ0Î% @ÅåL÷ ä@÷ ö÷ Ð Î%Pƒ�œ� � � ÁEùÿ�ewJùÍÀýuºÿæpõ¥1´ÿæ‚÷ š÷ 5 ¸ÿ÷ ŽÌE÷ Âù# ÷ |÷ ¶ù£ Æ*‡�÷ jÀÐ P�œŠÐ PÈJ! Ì €æÎeªðÖ.(ˆ 3  ó‹H�Ë æÿˆ†Á—&æ1ÿˆÁ¥ÿÿõÍ€ùu=÷ À(„ Ì €÷ 2ùÂ’4€á€ €¤F‡�’ÀŠý‡æHÎE}ÿó H÷ ù÷ 8ùA“ æ æ)ÿˆæ æÿˆóÖ ÷ ù³ Hsþÿ3(f÷ ÒøAüÿ-fÅåLÀ*ææ À.€åH@ñµ D,þ³*SAÁe@”``fÀ ýA“Ñ� ÷ 4÷ è÷�Ö ‡À.Ð æÈ  ý†€å‡&æf…Þ ƒ„…‡Ã.ÃÅD¸ÿÌ¥ ‡ w Èÿ÷ Øÿ„f÷ 2� ƒ& ÷ ¤‚‡2r€‡÷ †¦�‚÷ €‚À4 Á À8Á À<Á0w dÿ&Î�¦÷ lÿ „‚ ÷ &�•ƒap ‡…•aB#EÕ û� ÷ *‡�  Á ýÍ þu¼ÿ‡ÀDÌ5ÀeÀàÀ`w ðþÁeÁE<ó .¦f÷ ,÷�‚2  ,ú‡Â °,ôƒñÄ€pà l‡€ û‚ŒJ aƒ †¤´bõ„!ò‡±‡‡÷ Z�P PH Âæ úæ÷ 8�P PH ÂæùæfñÕ ÷ ¼ü�ñÅ È%€ù–5wÜ÷ èƒ÷ þ—# úòµ5 È¥öÿð ÈÈ‹5œÈ‹1ñÐ ÃñÀ È1ñµ€ "òµ€Ã.×# úñÕ€ &&÷ rýpp  f÷ ü�°ˆ¢åÿÈ`ú0 ¢öÿ ȰýÃñÀ òµ 0 ’ðˆòµ€ÌÖ ‚&f�÷ °ü�€0 öÿ&V ‡ƒ&öÿ÷ –ü÷ äüK&Àæ1ÿˆÀ û€‡¦Ã.ÃñÅ 1 ÷ ¶Ì¥ ñµ@ $òµ€ ñÅ! 1 ñµ€ ñÅ€ f&&÷ xü pp ÷ û°ˆ�‚‡ñÕ@ BÂeƒ‚ÂEù3£ ôµ€³  0 f÷ >û�ñµ ÷ †ñÅ@ ¡‡Bñµ f¦ÂE±Á ±2 ³ � ±‡¡U÷ jûC’Ãà À`ƒÊ5Lñµ H& æ¦&& ƒ‚Ê5€ò¥ò¥ ‚r, r, `Ëÿÿ ¶Î^æƒ ÃE× ÃñƒÂe(" âeb `vlö †““û–%Ö Ö Ö ‡& Ì¥ 4 f fñµ Jñµ ÉŠñå ± ñÕ ðµ!.p,p, &ƒfæ& & & C Bì ‚ ìæ¦Ã.Ã66 ÷ >ò–5–5–5�–5‡ñÕ ±B’ ±à ± ‚  ±Â÷ Øó‚ƒ †&&÷ Àó°ˆ– 0Ö .€ÁÂÃ÷ ôëúÿ÷ Îù ÷ Túñe q r,r, ‚à  ÊýñÕ @ÀeL÷ ¸û‡ƒá÷ Vó 1 1 &V ‡&�÷ nùB‚   ý°•p ð°Šð•ÿp�- ‡5¬ 8†æ4 5Š95œ -÷ õµ9\ƒ÷ Ò†À I'ð‹ QÎ5€KA@ñµõµ!Af�9f:õÿÿ:÷ Èõµ9 µ:µ•9 ÷ zô!‡gõµ9$5 :÷ šõµ9ðµ åf&&  ÷ @ôƒ�‚†–5KÀƒ÷ Jņ÷–%õÕ!*5¬ 86¬ Ì5Ì5 A@ñ‹ tt ÷ Æï†õÕB9õŠ-ƒ÷ ït‡ ÷ ¾ót ‡÷ ú÷5 :wºþ÷ ê÷"`ú4 ±– ‡ô Ì5õ5‡4 5 <µ>B@‚œ ÷ ªîúÿ†‡t÷ ˜÷5 :÷ z¡‡æ&D4 4 Î Bm@‚’.C@óµ#ñµ€ ÷ ÜU‡òµEóÅ;C@óµ À.È@úðÐü<ÁÀ’ ƒ÷ î4úÿ-‡÷ øöðµ ñÕ t4 ñÅ Î ö ÷ †ò‡ ÷ V‡³ ³ ÷ ˆð»†&&÷ tð°ˆ–5fLV ‡f@& ææ ÷ Ô�ÂEÿƒ÷ ¬þ`‡õµ9J@m:ȵæPþD& & ‚’ÁEüÿÁeÃeÒ”Á ý‚ƒȵ ö ô ´ &74 ñµ væ¦&œÂñµ  ÷ ¤ñ‡‚�€—-ö ¯@ÀeLæúÀ.4  ÷ jñˆ0 À.Æe�&&÷ ^ï°ˆµ@È ÷ zõfLV ‡æ Âæ¦€�ƒ÷ rçúÿ †"`úÁ ÷ <ù÷ ¬øé–%+–%0 ÷ *õ÷ üé†Ã.ÃÀÈ ûC@ò¬ %¦¦‚ ÷ Æî‚ƒ‡ È ûºÁ "`ú&&÷ –î°ˆ–%`×– fLV ‡&°£ 5@¡±õ– ‡Ã ‡b˜Ã ý‡@@& °£ †Ãe$ƒcÃ’ÃEÿà Âe‚c‚c‚Bm>÷ ¾íŽ è– ‡ðµ  ‚00Ÿ’3t—3t§3eaek›’ ÷ (ët†±‡÷ ô‡5Š9&& &lõ :€õU€,Ãõ:`Î ‡õÕ9w‚Cm:€Î ‡õÕ"9whõ:5à:õ <ð‹ s­>5Š9wBõÕ9öœÂEüÿð‹ ‚ Âe¶`ð‹ D˵˵˵Ãeƒmõ <»¾B@ò‹ ,�œÁÅøÿW � ‚m �ÜÁ�Òöe‚mv`õ <Nôµ€÷ è€÷ þç8A@Aœ ÁEÿð‹ ‚mv` ˵Â’ÂÅüÿÂe¶öeÂ`Âef �ÔÁ�ÔÁv`�õ <ôµ€÷ ¢ç€÷ †çõµ9 õ5€,ƒmw†þ€ÆeõE€,‡æC:õ6`”ƒ A@µÂEüÿÂeñ‹ Î ñÕ A@ Π“Šˊפÿÿ ôƒ`ñ‹ ¦œÎEðÿ—¥ƒl ÂÔÂÂÔƒ`àõ:– ‡ff f4  ÷ \í †ô Æe4 ±‡ô ÷ úôô €�‚Ã÷ vèúÿ‡÷ í"`úÁ ÷ Võ4 ‡.01* ; PKW105 - IMPLEMENT NEW BBR ALGORITHM) ; PKW106 - ADD MULTIPROCESSOR SUPPORTR8 ; PKW107 - ADD DEFINABLE HOST AND CONTROLLER TIMEOUT9 ; PKW109 - ADD QUEUE OPTOMIZATION SUPPORT AND CLEANUPH7 ; PKW110 - REMOVE STATE PROCESSING FROM AVL AND ONLA ;N ; J. MELVIN 2.02 < ; JJM300 - ALLOW SETTING DENSITY ON MULTI DENSITY DRIVES ; ; G. MARIGOWDA 2.03) ; GM100 - CORRECT LBN RANGE CHECKING 2 ; GM102 - SUPPORT FORMATTING OF RX33 DISKETTE ;M ; J. MELVIN 04-JUN-86 2.04K= ; JJM300 - CORRECT ORIGINAL JJM300 TO STOP POOL DEPLETIONC ; ; G. MARIGOWDA 18-JUN-86 2.05> ; GM103 - STOP RECURSIVE CALL TO DRIVER DURING SHADOWING ;O" ; P. K. M. WEISS 26-JUN-86 2.06= ; PKW112 - PUT E$$LOG CONDITIONALS BACK THE INSTALLATION V1 ; SYSTEM DOES NOT HAVE ERROR LOGGING  ; ; J. J. MELVIN 18-JUL-86 2.07; ; JJM313 - DO NOT LOG ERROR PACKETS FOR 'AVAILABLE' CMD  ;0 ; G. MARIGOWDA 18-AUG-86 2.10; ; GM104 - SAVE AND RESTORE REGISTERS BEFORE AND AFTERC4 ; THE CALL TO $IODSA TO FIX SHADOWING PROBLEM ;G ; J. MELVIN 6-NOV-86 2.12) ; JJM303 - REMOVE UNNEEDED CELLS/CODE  ;G ; J. MELVIN 10-NOV-86 2.13 1 ; JJM314 - DO NOT SET EOT ON REWIND COMMANDSD ;A ; J. MELVIN 29-NOV-86 2.14 7 ; JJM321 - USE $IDENT TO IDENTIFY MODULE AT RUNTIME  ;. ; J. MELVIN 29-NOV-86 2.15J* ; JJM308 - REDUCE DATA STRUCTURE SIZES ;M ; J. MELVIN 29-NOV-86 2.16A0 ; JJM307 - MAKE SIMPLE/OBVIOUS OPTIMIZATIONS ;B ; J. MELVIN 29-NOV-86 2.17C% ; JJM304 - CLEAN UP COMMENT LINES ;" ; P. K. M. WEISS 11-NOV-86 2.209 ; PKW119 - MOVE QUEUE OPT. PKT CHK TO CLASS FROM PORT1 ;- ; J. MELVIN 6-JAN-87 2.219 ; JJM323 - USE PROPER REGISTER IN ACCEPTANCE ROUTINE- ;1 ; G. MARIGOWDA 25-JAN-87 2.22+ ; GM112 - CONVERT TO USE EXEC VECTORINGV ;- ; G. MARIGOWDA 29-JAN-87 2.23/ ; GM113 - CHANGE CMDONL TO ONLSIO IN CMDFMTO ;2 ; J. MELVIN 05-FEB-87 2.24E3 ; JJM325 - VECTOR $MPPRO AND PLACE IN PUCOM FOR6 ; ITS USE IN VECTORING  ;N ; J. MELVIN 01-JUN-87 2.25E6 ; JJM350 - SUPPORT SINGLE DENSITY DRIVE/CONTROLLER ;  ; J. MELVIN 15-JUN-87 2.26 1 ; JJM353 - DO NOT SET MD.CMP FOR COMMANDS NOTG" ; REQUIRING IT (EG. IO.RLB) ;G ; MACRO LIBRARY CALLS2 ; C .MCALL HWDDF$,UCBDF$,SCBDF$,ABODF$,PKTDF$,UDADF$,KRBDF$ ;PKW109J .MCALL QIOSY$ ;GM112 QIOSY$ ;GM112% ABODF$ ;TKTN MESSAGES ;GM112E) UDADF$ ;(T)MSCP DEFINITIONS ;**-3  SCBDF$ ,,1 ;SCB DEFINITIONSE HWDDF$ ;HARDWARE REGISTERS-' UCBDF$ ;UNIT CONTROL BLOCK OFFSETSL4 PKTDF$ ;IOP DEFS (WITH DSA IP.XXX DEFS AS WELL). KRBDF$ ;KRB OFFSET DEFINITIONS ;PKW1090 JMPTBL PORT ;PORT ROUTINE OFFSETS ;PKW109 .PAGE ;**-28 .SBTTL JMPTAB - JUMP TABLE FOR VARIOUS CLASS ROUTINESN;===========================================================================G; THE FOLLOWING JUMP TABLE --- MUST --- BE DEFINED A00t¨33l1DATADATADATADATADATADATADATAS THE FIRST THINGTF; WITHIN THIS MODULE. VARIOUS PORT DRIVERS EXPECT TO SEE THIS TABLE; AT 120000.; J; BE CAREFUL WHEN ADDING NEW ROUTINES TO ADD THEM TO THE END AND TO ALSOL ; DEFINE THEM IN THE MACRO JMPTBL IN DSAPRE.MAC (WHICH CONTAINS THE OFFSET$!; DEFINITIONS FOR THESE ROUTINES.)N";===========================================================================O"XXBEGN::.WORD MAJOR*256.+MINOR;COMPONENT ID (SET UP IN $IDENT MACRO) ;JJM321 +$ .WORD CLADAT ;DATAGRAM HANDLER ;**-1A$% .WORD CLAEND ;END PACKET HANDLER*& .WORD CLAERR ;PORT/CLASS ERROR HANDLER+' .WORD CLACMD ;(T)MSCP COMMAND INITIATORL( .WORD SCUCB ;SCAN UCB LIST2( .WORD CLASYN ;CLASS SYNCHRONIZATION ;JJM321) .WORD -1 ;TERMINATOR2; ;**-83; LOCAL DATA4;I4; ;GM112S14; EXECUTIVE ENTRY POINT VECTOR TABLE ;GM112=4; ;GM112=4 ;GM112;4EXEVEC: .WORD 0 ; FLAG FOR VECTOR NOT YET FILLED ;GM112 4 ;GM112#4ALOCB: .WORD $ALOCB ;GM112#4ALSEC: .WORD $ALSEC ;GM112#4BLKC2: .WORD $BLKC2 ;GM112L#4BLXIO: .WORD $BLXIO ;GM112 #4CPURM: .WORD $CPURM ;GM112 #4CVLBN: .WORD $CVLBN ;GM112N#4DEACB: .WORD $DEACB ;GM112M#4DESEC: .WORD $DESEC ;GM112 #4DEUMR: .WORD $DEUMR ;GM112 #4DQUMR: .WORD $DQUMR ;GM112 #4DVMSG: .WORD $DVMSG ;GM112 #4EXRQF: .WORD $EXRQF ;GM112A#4FNERL: .WORD $FNERL ;GM112!4FORK: .WORD $FORK ;GM112$#4GSPKT: .WORD $GSPKT ;GM112$#4IODSA: .WORD $IODSA ;GM112$#4IOFIN: .WORD $IOFIN ;GM112$#4LDREG: .WORD $LDREG ;GM112$$4LOGER: .WORD $LOGER ;GM112%4MPPROR: .WORD $MPPRO ;JJM325E#4MPUB1: .WORD $MPUB1 ;GM112E#4QFORK: .WORD $QFORK ;GM112E#4QINSB: .WORD $QINSB ;GM112Q#4QINSF: .WORD $QINSF ;GM112V#4QINSP: .WORD $QINSP ;GM112X#4QRMVA: .WORD $QRMVA ;GM112N#4RCTPT: .WORD $RCTPT ;GM112R#4SRNAM: .WORD $SRNAM ;GM112K#4SCERR: .WORD $SCERR ;GM112S#4SCOFL: .WORD $SCOFL ;GM112I&4STMP1: .WORD $STMP1 ;GM112#4UMRWT: .WORD $UMRWT ;GM112R#4VOLVD: .WORD $VOLVD ;GM112O4; ;GM112P#4KISR5: .WORD KISAR5 ;GM112F#4KISR6: .WORD KISAR6 ;GM112I4; ;GM112 (4EXEVCL=<<<.-EXEVEC>/2>-1> ;GM1124; ;GM112D15IOPSEQ:.WORD 0 ;COMMAND PACKET SEQUENCE NUMBER :6LSTPKT:.WORD 0 ;ADDRESS OF LAST ABORTABLE IOP IN C.OLHD,7RADNAM:.WORD 0 ;PORT COMMON NAME IN RAD50)8 .RAD50 /OM/ ;END OF PORT COMMON NAME 09COMPCB:.WORD 0 ;STORAGE FOR PORT PCB ADDRESS1:SAVSTK:.WORD 0 ;SAVE STACK ADDRESS IN DELAYEDO'; ;CONTROLLER TRANSITION TO ON-LINEMGG .IIF DF E$$LOG KEEPR1: .WORD 0 ;TO HOLD R1 DURING CLADAT CODE ;**-11;HI .PAGE<I .SBTTL IOFUN - I/O FUNCTION TRANSLATION TABLE ;JJM304I ;PKW109OOIOFUN: ;**-5CO .IF DF,D$$DSK ;JJM3079O FUNCT RLB,RD,RD.L,CMDRLB ;READ LOGICAL BLOCK ;JJM307.:O FUNCT WLB,WR,WR.L,CMDWLB ;WRITE LOGICAL BLOCK ;JJM307O .ENDC ;D$$DSK ;JJM307DO ;JJM307TO .IF DF,T$$APE ;JJM307:O FUNCT WLB,WR,WR.L,CMDWLB ;WRITE LOGICAL BLOCK ;JJM3079O FUNCT RLB,RD,RD.L,CMDRLB ;READ LOGICAL BLOCK ;JJM307RO .ENDC ;T$$APE ;JJM307S ;**-3 T .IF DF D$$DSKU)V FUNCT LOV,RD,RD.L,CMDRLB ;LOAD OVERLAYP9W FUNCT STC,AVL,AVL.L,CMDSTC ;SET DEVICE CHARACTERISTICSJ0X FUNCT RPB,RD,RD.L,CMDRLB ;READ PHYSICAL BLOCK1Y FUNCT RLC,RD,RD.L,CMDRLB ;READ WITH READ CHECKL9] FUNCT LDO,RD,RD.L,CMDRLB ;LOAD D SPACE OVERLAY ;**-3,^ FUNCT SCF,RD,RD.L,CMDRLB ;SHADOW CATCH UP9b FUNCT WPB,WR,WR.L,CMDWLB ;WRITE PHYSICAL BLOCK ;**-3J3c FUNCT WLC,WR,WR.L,CMDWLB ;WRITE WITH WRITE CHECK 9d FUNCT WDD,WR,WR.L,CMDWDD ;WRITE WITH DELETED DATA MARK*?e FUNCT INL,GUS,GUS.L,CMDGUS ;INITIALIZE (FOR RCT REPLACEMENT)R,f FUNCT RPL,RPL,RPL.L,CMDRPL ;REPLACE BLOCK,g FUNCT RSN,0,0,CMDRSN ;READ SERIAL NUMBER2h FUNCT TRM,0,0,CMDTRM ;TERMINATE RCT 00t°3—3t§3eaek›’PROCESSING9h FUNCT SMD,FMT,FMT.L,CMDFMT ;SET MEDIA DENSITY ;GM102 ij .IFF ;D$$DSKk-l FUNCT EOF,WTM,WTM.L,CMDEOF ;WRITE EOF MARKF*m FUNCT SPF,REP,REP.L,CMDSPF ;SPACE FILES+n FUNCT SPB,REP,REP.L,CMDSPB ;SPACE BLOCKSE*o FUNCT RWD,REP,REP.L,CMDRWD ;REWIND UNIT;p FUNCT RWU,AVL,AVL.L,CMDRWU ;REWIND AND TURN UNIT OFFLINEDJp FUNCT SMO,AVL,AVL.L,CMDSMO ;MOUNT AND SET TAPE CHARACTERISTICS ; JJM300:r FUNCT STC,ONL,ONL.L,CMDSTC ;SET CHARACTERISTICS ;**-1>r FUNCT SEC,GUS,GUS.L,CMDGUS ;SENSE CHARACTERISTICS ;JJM307:s FUNCT DSE,ERS,ERS.L,CMDEOF ;ERASE (DATA SECURITY ERASE)(t FUNCT ERS,ERG,ERG.L,CMDEOF ;ERASE GAP7u FUNCT RLV,RD,RD.L,CMDRLV ;READ LOGICAL BLOCK REVERSESvw .ENDC ;D$$DSKx>yEIOFUN: FUNCT 0,0,0,ILEGAL ;ENTRY FOR ILLEGAL FUNCTION CODEz;F0{; FUNCTION TABLE ENTRIES FOR INTERNAL COMMANDS|;D4}ONLFUN: FUNCT 0,ONL,ONL.L ;ONLINE (T)MSCP COMMAND=~GUSFUN: FUNCT 0,GUS,GUS.L ;GET UNIT STATUS (T)MSCP COMMANDA3ABOFUN: FUNCT 0,ABO,ABO.L ;ABORT (T)MSCP COMMANDN7€AVNFUN: FUNCT 0,AVL,AVL.L ;AVAILABLE (T)MSCP COMMANDO@�GCSFUN: FUNCT 0,GCS,GCS.L ;GET COMMAND STATUS (T)MSCP COMMAND@‚SCCFUN: FUNCT 0,SCC,SCC.L ;SET CONTROLER CHAR (T)MSCP COMMAND‚ ;GM102‚ .IF DF D$$DSK ;GM1026‚FMTFUN: FUNCT 0,FMT,FMT.L ;FORMAT COMMAND ;GM102‚ .ENDC ;D$$DSK ;GM102‚ ;GM102‚ ;JJM350;‚ ;JJM350D‚ .IF DF,T$$APE ;JJM350F‚SNGDEN: .BYTE TK50,TK70,-1 ;SINGLE DENSITY DRIVE/CONTROLLER ;JJM350‚ .EVEN ;JJM350‚ .ENDC ;T$$APE ;JJM350M‚ ;JJM350Nƒ;C>„; TABLE FOR TRANSLATION OF MSCP END CODES TO RSX ERROR CODES…;,1…RSXTAB: .BYTE IS.SUC ;00 - SUCCESS ;PKW109 4ˆ .BYTE IE.IFC ;01 - ILLEGAL FUNCTION CODE ;**-2'‰ .BYTE IE.ABO ;02 - COMMAND ABORTED 4Š .BYTE IE.DNR ;03 - UNIT OFFLINE (TMSCP OFFLINE)&‹ .BYTE IE.DNR ;04 - UNIT AVAILABLE‹ ;GM102‹ .IF DF D$$DSK ;GM1026‹ .BYTE IE.BCC ;05 - MEDIA FORMAT ERROR ;GM102'‹ .IFF ;IF TAPE ;GM102;8‹ .BYTE IE.FHE ;05 - UNDEFINED STATUS CODE ;GM102‹ .ENDC ;D$$DSK ;GM102‹ ;GM1021� .BYTE IE.WLK ;06 - UNIT WRITE LOCKED ;**-1 %Ž .BYTE IE.VER ;07 - COMPARE ERRORE"� .BYTE IE.VER ;08 - DATA ERROR0� .BYTE IE.SPC ;09 - HOST BUFFER ACCESS ERROR(‘ .BYTE IE.FHE ;10 - CONTROLLER ERROR#’ .BYTE IE.FHE ;11 - DRIVE ERROR “” .IF DF T$$APE ;TAPE ONLY •'– .BYTE IE.VER ;12 - FORMATTER ERROR '— .BYTE IS.SUC ;13 - BOT ENCOUNTEREDI,˜ .BYTE IE.EOF ;14 - TAPEMARK ENCOUNTERED-™ .BYTE IE.FHE ;15 - UNDEFINED STATUS CODED-š .BYTE IE.DAO ;16 - RECORD DATA TRUNCATEDI%› .BYTE IE.VER ;17 - POSITION LOST )œ .BYTE IE.ABO ;18 - SERIOUS EXCEPTION+� .BYTE IE.EOV ;19 - LOGICAL END OF TAPE.žŸ .IFF ;T$$APE - IF DISKE -¡ .BYTE IE.FHE ;12 - UNDEFINED STATUS CODE.-¢ .BYTE IE.FHE ;13 - UNDEFINED STATUS CODE -£ .BYTE IE.FHE ;14 - UNDEFINED STATUS CODE -¤ .BYTE IE.FHE ;15 - UNDEFINED STATUS CODE -¥ .BYTE IE.FHE ;16 - UNDEFINED STATUS CODEE-¦ .BYTE IE.FHE ;17 - UNDEFINED STATUS CODET-§ .BYTE IE.FHE ;18 - UNDEFINED STATUS CODE -¨ .BYTE IE.FHE ;19 - UNDEFINED STATUS CODES©ª .ENDC ;T$$APE«-¬ .BYTE IE.FHE ;20 - UNDEFINED STATUS CODEO-­ .BYTE IE.FHE ;21 - UNDEFINED STATUS CODES-® .BYTE IE.FHE ;22 - UNDEFINED STATUS CODES-¯ .BYTE IE.FHE ;23 - UNDEFINED STATUS CODES-° .BYTE IE.FHE ;24 - UNDEFINED STATUS CODES-± .BYTE IE.FHE ;25 - UNDEFINED STATUS CODES-² .BYTE IE.FHE ;26 - UNDEFINED STATUS CODES-³ .BYTE IE.FHE ;27 - UNDEFINED STATUS CODES-´ .BYTE IE.FHE ;28 - UNDEFINED STATUS CODES-µ .BYTE IE.FHE ;29 - UNDEFINED STATUS CODES-¶ .BYTE IE.FHE ;30 - UNDEFINED STATUS CODEH2· .BYTE IE.FHE ;31 - MESSAGE FROM INTERNAL DIAG· .EVEN ;JJM350¸;$¹; DISK CLASS DRIVER DISPATCH TABLEº;S» .IF DF D$$DSK ;IF DISK>» .IF DF DU$CHK ;QUEUE OPTIMIZATION SUPPORTED ;PKW109C» DDT$ DU,R$$UDA,,,,NEW=Y,OPT=Y;GENERATE DISPATCH TABLE ;P00t¸33l1DATADATADATADATADATADATADATAKW109 #» .IFF ;DU$CHK ;PKW109E>» DDT$ DU,R$$UDA,,,,NEW=Y ;GENERATE DISPATCH TABLE ;PKW109$» .ENDC ;DU$CHK ;PKW109Ì; ;**-16T$Í; TAPE CLASS DRIVER DISPATCH TABLEÎ;E&Î .IFF ;D$$DSK - IF TAPE ;PKW109BÑ DDT$ MU,R$$MYA,,,,NEW=Y ;GENERATE DISPATCH TABLE ;**-2Ñ .ENDC ;D$$DSK ;PKW109SÚ .PAGE ;**-8,Û .SBTTL XXINI - I/O INITIATOR ENTRY POINTÜ;+!Ý;**-MUINI-INITIATOR ENTRY POINT$!Þ;**-DUINI-INITIATOR ENTRY POINTCß;L à; INPUTS:á; â; R4 IS THE ADDRESS OF THE SCB'ã; R5 IS THE ADDRESS OF THE UNIT'S UCBTä;B å; OUTPUTS:æ; ç; R2 - QST ADDRESSè; R4 - SCB ADDRESSé; R5 - UCB ADDRESSê; PORT MAPPED IN APR6ë;ì; TRY TO START I/Oí;-îïMUINI:ðDUINI:ñ;RIò; SET UP THE COMMON REGISTERS, MAP THE PORT IN APR6, AND JUMP TO CLACMDWó;,õ MOV S.QST(R4),R2 ;R2 IS THE QST ;**-19õ MOV S.PBIA(R4),@KISR6 ;MAP APR6 TO PORT DRIVER ;GM112O?õ MOV S.PBIA(R4),@#KINAR6 ;KERNAL INSTRUCTION SPACE ;PKW109 3ø CALLR CLACMD ;GO TRY TO START A COMMAND ;**-2Rù .PAGE,ú .SBTTL XXACC - PACKET ACCEPTANCE ROUTINEû;+*ü; **-XXACC-ACCEPTANCE ROUTINE FOR $GSPKTý;EJþ; THIS ROUTINE DECIDES WHICH PACKETS CAN BE PROCESSED. IT CHECKS UMR WAJÿ; STATUS TO MAKE SURE THAT NECESSARY RESOURCES ARE AVAILABLE. IF THE UNK; IN SERIAL MODE, NO I/O'S FOR THAT DEVICE ARE PROCESSED. FOR DISKS, I/OSK; MAY BE PREVENTED BY STALL I/O. FOR TAPES, IF ANY I/O'S ARE OUTSTANDINGRL; AND THE PACKET BEING CHECKED IS AN IO.SEC FUNCTION, THEN NO MORE PACKETSL; ARE ACCEPTED FOR THAT UNIT UNTIL ALL OUTSTANDING I/O'S COMPLETE (THIS ISM; TO INSURE THAT THE GUS TMSCP COMMAND, WHICH IS AN IMMEDIATE TYPE COMMAND,HO; IS ISSUED TO A QUIESCENT UNIT). THIS ROUTINE IS AN INTEGRAL PART OF $GSPKTA&; AND SHOULD ONLY BE CALLED FROM IT.;N ; INPUTS:  ;O ; R1 - I/O PACKET ADDRESSS ; R4 - SCB ADDRESS ; R5 - UCB ADDRESS ;L ; OUTPUTS:;I; R0-R5 PRESERVED3; CARRY SET THIS PACKET IS NOT TO BE DEQUEUEDN*; CARRY CLEAR PACKET IS TO BE DEQUEUED; ;-XXACC: ;**-6T .IF DF D$$DSK ;DISK ONLY;G7; IS THERE ANY REASON NOT TO DO THIS I/O? ;PKW109!; ;**-1L! BIT #UU.SER!UU.ATN!UU.IOS,U.UTIL(R5) ;SERIAL, ATTENTION, OR STALL ;PKW109-# BNE 40$ ;IF NE YES, REJECT PACKET ;**-1$;1$%; IS RCT IN PROGRESS ON THIS UNIT?&;S8' BIT #UU.RCT,U.UTIL(R5) ;RCT IN PROGRESS ON THIS UNIT?( BEQ 20$ ;IF EQ NO?( CMP I.TCB(R1),@RCTPT ;YES, THEN IS THIS I/O FROM RCT? ;GM112A,* BNE 40$ ;IF NE NO, REJECT PACKET ;**-1+, .IFF ;D$$DSK - IF TAPE-H- BIT #UU.SER!UU.ATN,U.UTIL(R5) ;ANY REASON NOT TO DO THIS I/O? ;PKW109'- BNE 40$ ;YES, REJECT IT ;PKW109#8. CMP #IO.SEC,I.FCN(R1) ;SENSE CHARACTERISTICS COMMAND?5. BNE 20$ ;NO. CHECK FOR TRANSFER FUNCTION ;JJM323-/. MOV S.QST(R4),R4 ;GET QST ADDRESS ;JJM323 . ASSUME Q.CST,0 ;JJM323+. MOV (R4),R4 ;GET CST ADDRESS ;JJM323E6. TST C.OLHD(R4) ;ANY OUTSTANDING COMMANDS? ;JJM323;. BNE 40$ ;YES. REJECT IT. UNIT SHOULD BE UNUSED ;JJM323:. BR 30$ ;NO. ACCEPT THE PACKET FOR PROCESSING ;JJM323. ;JJM323N8 ;**-9;9 .ENDC ;D$$DSK;:20$:E: .IF NDF M$$PRO ;WE MAY NEED TO FORK IF ON WRONG PROCESSOR ;PKW106M: ;PKW106.< ;**-1 9= CMPB #IO.RLB/256.,I.FCN+1(R1) ;DATA TRANSFER REQUEST? )> BLO 30$ ;IF LO NO, ACCEPT THE PACKET7? BIT #DV.EXT,U.CW1(R5) ;IS EXTENDED MEMORY SUPPORTED?H$@ BNE 30$ ;YES, WE DON'T NEED UMRS@ ;PKW106S@ .ENDC ;M$$PRO ;PKW106D@ ;PKW106 /@ MOV S.QST(R4),R4 ;GET QST ADDRESS ;JJM323 @ ASSUME Q.CST,0 ;JJM323+@ MOV (R4),R4 ;GET CST ADDRESS ;JJM323N6@ BIT #C1.UMR,(R4) ;UNIT WAITING FOR UMRS? ;JJM3235@ BNE 40$ ;IF NE, YES. REJECT THE PACKET ;JJM323P6@ TST C.UMCT(R4) ;ANY MORE UMR WAIT BLOCKS? ;JJM323F BEQ 40$ ;IF EQ NO ;**-5PI; ;**-2J; ACCEPT PACKETTK; L30$:3L MOV U.SCB(R00tÀ3—3t§3eaek›’5),R4 ;RESTORE SCB ADDRESS ;JJM323 ,N CLC ;INDICATE ACCEPT THE PACKET ;**-1O RETURN ;RETURNWP;Q; REJECT PACKET R;QS40$:3S MOV U.SCB(R5),R4 ;RESTORE SCB ADDRESS ;JJM323M,U SEC ;INDICATE REJECT THE PACKET ;**-1V RETURN ;AND EXITAW .PAGE)X .SBTTL XXCAN - CANCEL I/O ENTRY POINT Y;+,Z; **-DUCAN-CANCEL I/O ENTRY POINT FOR DISK,[; **-MUCAN-CANCEL I/O ENTRY POINT FOR TAPE\;QG]; THIS ROUTINE HANDLES ABORTING OUTSTANDING MSCP/TMSCP COMMANDS FOR AM^; GIVEN TASK AND UNIT._;D `; INPUTS:2a;$b; R0=ADDRESS OF CURRENT I/O PACKET"c; R1=TCB ADDRESS OF CURRENT TASKd; R3=CONTROLLER INDEXe; R4=SCB ADDRESSf; R5=UCB ADDRESSg;S h; OUTPUTS:i;Cj; R0=DESTROYEDk; R1-R5=PRESERVEDGl; IOPS IN OUTSTANDING LIST HEAD ARE MARKED FOR ABORT COMMAND ISSUANCEN$m; CONTROLLER MODE IS SET TO C1.ABOn;No;-pqMUCAN:rDUCAN:s .IF DF,T$$APEt1u CALL MAPD ;MAP PORT COMMON AREA THROUGH APR6A%v MOV S.QST(R4),R0 ;GET QST ADDRESSI,w MOV (R0),R0 ;/*Q.CST*/ ;GET CST ADDRESS)x MOV R0,R2 ;SAVE A COPY FOR USE LATER1,y MOV C.OLHD(R0),R0 ;GET FIRST IOP ADDRESSz BEQ 30$ ;NONE TO DO. EXIT /{10$: CMP I.TCB(R0),R1 ;IOP FOR CORRECT TASK?D"| BNE 20$ ;NO. GET NEXT PACKET+} CMP I.UCB(R0),R5 ;IOP FOR CORRECT UNIT?A"~ BNE 20$ ;NO. GET NEXT PACKET> BISB #IP.ABO,I.PRM+11(R0) ;MARK IT FOR ABO COMMAND ISSUANCE*€ BIS #C1.ABO,(R2) ;SET CONTROLLER STATE:� BIT #UU.SER,U.UTIL(R5) ;ALREADY IN SERIAL MODE ON UNIT?'‚ BNE 20$ ;YES. DO NOT SAY WE SET ITCCƒ BIS #UU.SER!UU.ABO,U.UTIL(R5);INDICATE SERIAL MODE AND WE SET IT(*„20$: MOV (R0),R0 ;GET NEXT IOP ADDRESS!… BNE 10$ ;AND GO CHECK IT OUTT†30$:‡ .ENDC ;T$$APEˆ&‰ RETURN ;AND RETURN TO THE CALLERŠ .PAGEAŠ .IF DF D$$DSK&DU$CHK ;IF QUEUE OPTOMIZATION SUPPORTED ;PKW109A@Š .SBTTL XXCHK - DU ONLY, SEEK OPTIMIZATION CHECKING ;PKW1096Š; **-DUCHK-VALIDATE AND CONVERT THE LBN ;PKW109Š; ;PKW109EŠ; THIS ROUTINE IS CALLED FROM $DRQRQ TO DO LBN PROCESSING ;PKW109EŠ; FOR DEVICES WHICH SUPPORT QUEUE OPTIMIZATION. IF BLKC2 ;PKW109EŠ; DETECTS AN ERROR IT WILL RETURN TO THE CORRECT PLACE IN ;PKW109 .Š; $DRQRQ AFTER CALLING $IOALT. ;PKW109Š; ;PKW109Š; INPUTS: ;PKW109DŠ; ;PKW109'Š; R1=I/O PACKET ADDRESS ;PKW109 !Š; R5=UCB ADDRESS ;PKW109 Š; ;PKW109Š; OUTPUTS: ;PKW109Š; ;PKW109@Š; IF THE CHECKS SUCCEEDS, THEN THE LBN IN THE PACKET ;PKW109HŠ; IS REPLACED BY THE CYLINDER/TRACK/SECTOR. R1 IS PRESERVED. ;PKW109Š; ;PKW109EŠ; IF THE CHECKS FAILS, THEN $IOALT IS ENTERED WITH A FINAL ;PKW109WDŠ; STATUS OF IE.BLK AND A RETURN TO THE CORRECT PLACE IN ;PKW109%Š; $DRQRQ IS EXECUTED. ;PKW109 Š; ;PKW109Š; ;PKW109HŠ; NOTE: ALL FUNCTIONS PUT INTO THE DRIVER QUEUE ARRIVE HERE. ;PKW109?Š; THESE INCLUDE IO.ATT, IO.DET, AND ACP FUNCTIONS. ;PKW109EŠ;- ;PKW109LŠ .ENABL LSB ;PKW109Š ;PKW109CHŠDUCHK: CMPB #IO.RLB/256.,I.FCN+1(R1) ;DATA TRANSFER REQUEST? ;PKW109/Š BLO 30$ ;IF LO NO, LEAVE IT ALONE ;PKW109HIŠ BITB #IO.RPB&IO.WPB,I.FCN(R1);IS IT READ/WRITE PHYSICAL BLOCK? ;PKW109I-Š BEQ 10$ ;NO, DO BLOCK CHECKING ;PKW109W@ŠREQUE: MOV R1,R3 ;WE HAVE TO SIMULATE THE SETUP THAT ;PKW109>Š CLRB I.PRM+11(R3) ;BLKC2 WOULD PERFORM FOR $CVLBN ;PKW109(Š MOV I.PRM+10(R3),R2 ;... ;PKW109(Š MOV I.PRM+12(R3),R0 ;... ;PKW109'Š BR 20$ ;NOW GO TO $CVLBN ;PKW109 8Š10$: CALL @BLKC2 ;CHECK LOGICAL BLOCK NUMBER ;GM112:Š20$: CALL @CVLBN ;CONVERT LOGICAL BLOCK NUMBER ;GM112?Š MOV R2,I.PRM+10(R3) ;SAVE DESIRED CYLINDER ADDRESS ;PKW109 .Š SWAB R1 ;SWAP TRACK TO HIGH BYTE ;PKW1090Š BIS R1,R0 ;MERGE TRACK WITH SECTOR ;PKW109FŠ MOV R0,I.PRM+12(R3) ;SAVE DESIRED TRACK AND SECTOR ADDRESS ;PKW1093Š MOV R3,R1 ;RESTORE THE PACKET ADDRESS ;PKW109,"Š30$: RETURN ;EXIT ;PKW109Š ;PKW109KŠ .DSABL LSB 00tÈ33l1DATADATADATADATADATADATADATA ;PKW109%Š .ENDC ;D$$DSK&DU$CHK ;PKW109;Š .PAGE ;PKW109$‹ .SBTTL $XXINT - INTERRUPT HANDLERŒ;+0�; **-$XXINT-CLASS CONTROLLER INTERRUPT HANDLERŽ; F�; INTERRUPTS ARE RECEIVED FROM A CONTROLLER UNDER FOUR CIRCUMSTANCES�; THEY ARE AS FOLLOWS:F‘; 1. DURING THE INITIALIZATION PROCESS (OPEN THE "VIRTUAL CIRCUIT")>’; 2. WHEN THE "COMMAND RING BUFFER" TRANSITIONS FROM "FULL"“; TO "NOT FULL",A”; 3. WHEN THE "RESPONSE RING BUFFER" TRANSITIONS FROM "EMPTY"B•; TO "NOT EMPTY"F–; 4. WHEN A FATAL CONTROLLER ERROR IS DETECTED AND AN INTERRUPT CAN—; BE GENERATED!˜; FATAL CONTROLLER ERRORS ARE:O;™; A. FAILURE TO BECOME UNIBUS MASTER FOR DATA TRANSFER 7š; B. FAILURE TO BECOME UNIBUS MASTER FOR INTERRUPTA1›; C. FAILURE TO ACCESS I/O PAGE REGISTERS ORS8œ; COMMUNICATIONS AREA (I.E. NON-EXISTENT MEMORY)&�; D. UNIBUS PARITY ERROR DETECTEDž; Ÿ;-  ¡ .IF DF D$$DSK ;IF DISK CLASS7¢ INTSE$ DU,PR5,R$$UDA ;;;GENERATE INTERRUPT SAVE CODEM ¢ .IFF ;;;IF TAPE ;PKW109?¦ INTSE$ MU,PR5,R$$MYA ;;;GENERATE INTERRUPT SAVE CODE ;**-3 ¦ .ENDC ;;;D$$DSK ;PKW109¨ ;**-1 /© ;;;R5 POINTS TO ANY UCB ON THE CONTROLLER +ª ;;;R4 = CONTROLLER INDEX (UNLESS THISR.« ;;;IS M AND THERE IS ONLY ONE CONTROLLER"¬ ;;;R4 AND R5 MAY BE MODIFIED7­ MOV U.SCB(R5),R4 ;;;POINT TO CONTROLLER STATUS BLOCKR@° BIT #UU.SPC,U.UTIL(R5) ;;;IS SPECIAL ONLINE IN EFFECT? ;**-2 ± BEQ 10$ ;;;NO, FORK NORMALLY*² CALL SAVREG ;;;COROUTINE TO SAVE R0-R48³ CALL MAPD ;;;COROUTINE TO SAVE APR6 AND MAP THE PORT4´ JMPV PORT,PORINT ;;;GO EXECUTE THE REQUEST AT PR55·10$: TST S.FRK+2(R4) ;;;FORK BLOCK IN USE? ;**-2E.· BEQ 20$ ;;;IF EQ, NO, CALL FORK ;PKW1099· RETURN ;;;IF FORK BLOCK IN USE, JUST RETURN ;PKW109· ;PKW109Y4·20$: CALL @FORK ;;;CREATE SYSTEM PROCESS ;GM112)º ;;;R5 MUST STILL BE THE UCB ;**-2 3» ;;;R4 MUST BE THE SCB BEFORE $FORK IS CALLED.;»; ;PKW109'»; RETURN AT FORK STATE ;PKW109»; ;PKW109BÍ CLR S.FRK+2(R4) ;FREE FORK BLOCK FOR FURTHER INTERRUPTS ;**-17<Í MOV S.PBIA(R4),@KISR6 ;MAP APR 6 TO PORT DRIVER ;GM112?Í MOV S.PBIA(R4),@#KINAR6 ;KERNAL INSTRUCTION SPACE ;PKW109@Í JMPV PORT,PORINT ;TRANSFER TO PORT INTERRUPT ROUTINE ;PKW109Ø .PAGE ;**-10 2Ù .SBTTL XXKRB - CONTROLLER STATE CHANGE ROUTINEÝ;+ ;**-3CÞ;*3ß; **-XXKRB-CLASS CONTROLLER STATUS CHANGE ROUTINELà;?á; THIS ROUTINE WILL HANDLE SETTING CONTROLLER ON-LINE/OFFLINE â; REQUESTS.1ã; ä; INPUTSå;;æ; R4 = DCB ADDRESSç; R3 = CTB ADDRESSè; R2 = KRB ADDRESS3é; 0(SP) = RETURN ADDRESS FOR IMMEDIATE COMPLETION.5ê; 2(SP) = RETURN ADDRESS FOR CALLER OF EXEC ROUTINE*ë; C = 1 TRANSITION TO OFF-LINE REQUESTED)ì; C = 0 TRANSITION TO ON-LINE REQUESTED1<í; $SCOFL NONZERO POSITIVE - SPECIAL ONLINE FOR SYSTEM DISK î; $SCERR = 1 PRESET TO SUCCESSï; PRIORITY = 0ð;S ñ; OUTPUTSNò;#ó; $SCERR = 0 OPERATION IS PENDINGI@ô; $SCERR < 0 OPERATION IS FAILURE ($SCERR CONTAINS ERROR CODE)#õ; $SCERR = 1 OPERATION IS SUCCESSC6ö; 0(SP) = RETURN ADDRESS OF CALLER OF $KRBSC ROUTINE÷;FDø; THE DRIVER EITHER CHOSES TO REJECT THE STATUS REQUEST, ACCEPT ITCù; IMMEDIATELY OR TO DO A DELAYED TRANSITION BY SAVING THE ADDRESSNBú; ON TOP OF THE STACK AND RETURNING TO THE SECOND ADDRESS ON THE û; STACK.ü; ý;- þDUKRB::= ÿMUKRB::O, BCC 20$ ;IF CC, GO TRANSITION TO ON-LINE;; TRANSITION TO OFF-LINE;D MOV R2,R3 ;COPY THE KRBN MOV K.OWN(R2),R4 ;GET A UCB  MOV U.SCB(R4),R4 ;GET THE SCB  MOV S.QST(R4),R2 ;GET THE QST CALL MAPD ;MAP THE PORTU1  MOV COMPCB,R0 ;GET THE ADDRESS OF THE PORT PCBT<  DECB P.RMCT(R0) ;DECREMENT THE RESIDENT MAPPED TASK COUNT;  DEC 140000+CONCNT ;DECREMENT # OF CONTROLLERS USING PORT (  BNE 10$ ;IF NE, THERE ARE STILL MORE8  BIC #P2.LMA,P.ST2(R0) ;CLEAR THE 'LEAVE ME ALONE' BIT010$: CALLV PORT,STOMP ;STOMP ON THE CONTROLLER4 BIT #KS.EXT,K.S00tÐ3—3t§3eaek›’TS(R3) ;THIS CONTROLLER HAVE UMRS? BNE 60$ ;NO, FINISH UP* MOV (R2),R3 ;/*Q.CST*/ ;SET UP THE CST( SEC ;SEC TELLS PORUMR TO DEALLOCATE1 JMPV PORT,PORUMR ;DEALLOCATE THE UMRS AND EXITS;T; TRANSITION TO ON-LINET;;720$: TST EXEVEC ; IS VECTORING DON ALREADY? ;GM112O* BNE 22$ ; YES THEN SKIP THIS ;GM112/ PUSH ; SAVE THE REGISTERS ;GM112C, MOV KINAR6,-(SP) ; SAVE KINAR6 ;GM1129 MOV @#112,R0 ; GET ADDRESS OF TABLE OF ENTRIES ;GM112BD MOV (R0),R0 ; GET ADDRESS OF APR BIAS (1ST WORD IN TABLE) ;GM112< MOV (R0),KINAR6 ; MAP COMMON THROUGH I-SPACE APR6 ;GM112- MOV #EXEVEC,R3 ; POINT TO VECTOR ;GM112R5 MOV #EXEVCL,R2 ; SPECIFY LENGTH OF VECTOR ;GM112N1 CALL @#140004 ; TRANSLATE THE VECTOR ;GM112N. MOV (SP)+,KINAR6 ; RESTORE KINAR6 ;GM112- POP ; RESTORE REGISTERS ;GM112H122$: MOV R2,R5 ; R5 = ADDRESS OF KRB ;GM112K: ADD K.OFF(R5),R5 ;R5 = ADDRESS OF KRB UCB TABLE ;**-1# MOV (R5),R5 ;R5 = A UCB ADDRESSE% MOV U.SCB(R5),R4 ;R4 = SCB ADDRESSE3 MOV R5,K.OWN(R2) ;GIVE K.OWN A VALUE, NEEDED FORP# ;$INTSE MACRO FOR INTERRUPTS. 1 TSTB @SCOFL ;IS IT A SPECIAL ONLINE? ;GM112C, BLE 30$ ;NOPE, CONTINUE NORMALLY ;**-1@ BIS #UU.SPC,U.UTIL(R5) ;SET THE SPECIAL ONLINE BIT IN THE UCBF CLRB @SCERR ;CLEAR SCERR TO SHOW THAT THE ONLINE IS PENDING ;GM112;! BR 40$ ;DON'T DELAY THE RETURN FOR SPECIAL ONLINE ;**-1R"30$:(# POP SAVSTK ;DO DELAYED STATUS CHANGE$40$:A% .IIF DF D$$DSK MOV #VCDSK,R1 ;R1 = VIRTUAL CIRCUIT ID FOR DISKA& .IIF DF T$$APE MOV #VCTAP,R1 ;R1 = VIRTUAL CIRCUIT ID FOR TAPEA9' CALL CLASUP ;DO INITIAL LOAD FUNCTIONS ON PORT COMMONN( BCS 50$ ;IF CS, ERRORN0) CALL MAPD ;CALL A COROUTINE TO MAP AND LATER&* ;RESTORE APR 6. R0 IS DESTROYED.;+ INC 140000+CONCNT ;INCREMENT # OF CONTROLLERS USING PORTI@+ MOV MPPROR,140000+MPPROX ;REVECTORED $MPPRO ADDRESS ;JJM325/+ ;PUCOM CAN VECTOR OTHER ROUTINES ;JJM325S6, CALLV PORT,PORSUP ;MORE SETUP FOR PACKET MANAGEMENT- ;SETUP FUNCTIONS;. MOV #C1.CON!C1.SYN,(R3) ;CLEAR ALL CONNECTION STATE BITSI%/ ;AND ENTER C1.SYN,C1.CON STATE.T0 ;..CON ONL FOR CONTROLLERN21 ;IS IN PROGRESS AND WE NEED TO ALLOCATE UMRS*2 JMPV PORT,PORSYN ;START SYNCHRONIZATION 350$: ;ERROR ON INITIAL LOAD%4 PUSH ;SAVE REGISTERSU*5 CALL @SAVSTK ;TELL CON ABOUT THE ERROR+6 POP ;RESTORE OUR REGISTERSO7 SEC ;ENSURE CARRY SET860$: RETURN ;P; .PAGE ;**-2'< .SBTTL XXOUT - TIME OUT ENTRY POINTO=;+ >;**-XXOUT-TIME OUT ENTRY POINT?;N@; REASONS FOR TIME-OUTS ARE:A;CEB; 1. THE TIMER ON THE OLDEST COMMAND IN THE CONTROLLER HAS EXPIRED.O4C; 2. (DISK ONLY) A CONTROLLER RE-SYNCH IS DONE AND?D; OP.ONL'S MUST BE RE-ISSUED FOR ANY UNITS STILL MARKED ASSAE; SPINNING UP (US.SPU=1). THE TIME-OUT IS SET AND PROCESSEDTF; BY THE RECSIO ROUTINE.;>G; 3. A FATAL ERROR HAS BEEN DETECTED AND NOW A RE-SYNCH MUST?H; COMMENCE. WE GET HERE BECAUSE CLAERR IS CALLED WHENEVER ;I; A FATAL ERROR IS DETECTED AND SETS A 1 SECOND TIMER.S?J; 4. A CONTROLLER SYNCHRONIZATION STEP HAS TIMED OUT WHICH ISAK; A FATAL ERROR.SL;R M; INPUTS:(N;O O; R4 ADDRESS OF SCB"P; R5 ADDRESS OF A UCBQ;O R; OUTPUTS:S;AT;-UVDUOUT:WMUOUT:9W MOV S.PBIA(R4),@KISR6 ;MAP APR6 TO PORT DRIVER ;GM112HIY .IIF DF K$$DAS MOV S.PBIA(R4),@#KINAR6 ;FOR I/D SYSTEMS MAP BOTH ;**-1C+Z MOV S.QST(R4),R2 ;R2 IS THE QST ADDRESS 2[ MOV (R2),R3 ;/*Q.CST*/ ;R3 IS THE CST ADDRESS+\ BIT #C1.RDY,(R3) ;IS THE READY BIT SET?A%] BEQ 20$ ;NO, CONTINUE, ELSE THISM#^ ;MUST BE A CMD TMO. FOR TAPER_ .IF DF D$$DSK`-a BIT #C1.R2,(R3) ;IS RECOVERY IN PROGRESS? ,b BEQ 10$ ;IF EQ, NO, THIS MUST BE A CMD.-c TST C.OLHD(R3) ;ANY COMMANDS IN PROGRESS?S2d BNE 10$ ;IF NE, YES, THIS MUST BE A CMD. TMO.Be; WE MUST BE HERE IN ORDER TO RE-TRY UNIT ON-LINES AFTER A FATALDf; ERROR RE-SYNCHRONIZATION. FOR EACH 00tØ33l1DATADATADATADATADATADATADATAUNIT THAT USED TO BE ON-LINEGg; (US.SPU=1), RE-TRYS, IN CASE OF FAILURE, ARE DONE EVERY FEW SECONDSTh;A5i BIS #C1.R1,(R3) ;NOTE THAT WE NEED TO DO ON-LINESBj JMP RECSIO ;GO DO THEMFkl .ENDC ;D$$DSKm;R0n; WE ARE HERE BECAUSE A COMMAND JUST TIMED OUTo;,Fo10$: BIT #C1.TMO!C1.GCS,(R3) ;DID THE GCS COMMAND TIME OUT? ;PKW109%o BEQ 15$ ;NO, CONTINUE ;PKW109E?o JMP TMOERR ;IF THE GCS TIMED OUT, GO START RESYNCH ;PKW109So ;PKW109RBo15$: BIS #C1.GCS,(R3) ;INDICATE WE NEED TO DO AN OP.GCS ;PKW1098o MOVB S.ITM(R4),S.CTM(R4) ;RE-SET TMO. COUNT ;PKW109Eo CALLV PORT,PKTCH1 ;DO WE HAVE THE RESOURCES TO DO IT NOW? ;PKW109B3o ; ONLY NEED ONE CREDIT SINCE THIS IS ;PKW109#o ; AN IMMEDIATE CMD ;PKW109N#o BCS 17$ ;NO, RETURN ;PKW1091'o JMP GCSSIO ;GO ISSUE IT ;PKW109Eo17$: RETURN ;PKW109Oq; ;**-1Cr; IF WE GET HERE EITHER WE TIMED OUT BEFORE THE CONTROLLER GOT UP0s; OR WE ARE HERE TO START A RE-SYNCHRONIZATIONt;E/u20$: BIT #C1.FAT,(R3) ;IS THE FATAL BIT SET?4v BEQ 30$ ;NO, CONTINUE<w BIC #C1.FAT,(R3) ;YES, IT'S A FATAL ERROR, CLEAR THE BIT5x JMPV PORT,PORSYN ;AND START RESYNCH WITH THE CONTI-x30$: SEC ;LOG CONTROLLER ERROR ;PKW109 /… JMP CLAERR ;JUMP TO ERROR ROUTINE ;**-12† .PAGE(‡ .SBTTL XXPWF - POWERFAIL ENTRY POINTˆ;+(‰; **-DUPWF- DISK POWERFAIL ENTRY POINT(Š; **-MUPWF- TAPE POWERFAIL ENTRY POINT‹;T?Œ; THIS ROUTINE WILL HANDLE POWER FAILURES AND WILL BRING THE1�; CONTROLLER(S) AND UNIT(S) ONLINE FOR RSX-11M.TŽ; �; INPUTS:O�;T‘; R3=CONTROLLER INDEX ’;, “; OUTPUTS:”;,•;-–DUPWF:—MUPWF:3³ TST R3 ;IS IT A CALL TO THE CONTROLLER? ;**-27S<´ BEQ 20$ ;NO, JUST RETURN-CLAERR WILL DEAL WITH ALL UNITS µ MOV L.DCB(R3),R3 ;GET THE DCB¶ MOV D.UCB(R3),R5 ;NOW A UCB· MOV U.SCB(R5),R4 ;THE SCB¸ CALL MAPD ;MAP THE PORTT¹ MOV S.QST(R4),R2 ;THE QST/º MOV (R2),R3 ;/*Q.CST*/ ;AND THE CST (WHEW!)P4¾ MOVB #RETRY,Q.RTY(R2);SET UP RETRY COUNT ;**-3B¾ JMP CLAERR ;RE-SET STATES, QUEUES, AND SET UP TIME-OUT ;PKW1096Á ;COUNT. THE TIMEOUT ROUTINE WILL START THE ;**-2 ;RE-SYNCH FOR DISK.S Ã20$: RETURNHÄ .PAGE.Å .SBTTL XXUCB - CON UNIT ONLINE ENTRY POINTÈ;+ ;**-2U*É; **-XXUCB - CON UNIT ONLINE ENTRY POINTÊ;UË; ROUTINE DESCRIPTIONMÌ;S Í; INPUTS:EÎ;&Ï; R3=CONTROLLER INDEX (S.KRB .NE. 0)Ð; R4=ADDRESS OF SCBMÑ; R5=ADDRESS OF UCB;Ò; 0(SP) - RETURN ADDRESS"Ó; 2(SP) - DELAYED RETURN ADDRESSÔ; C SET OFFLINECÕ; C CLEAR ONLINEÖ; $CSERR SET TO 1, SUCCESS,×; $SCOFL > 0 THEN ONLINE FOR SYSTEM DEVICEØ;A Ù; OUTPUTS:Ú; Û; R4-R5 ARE PRESERVED0Ü;T@Ý; $SCERR = 0 OPERATION IS PENDING (MAXIMUM TIME IS 60 SECONDS):Þ; $SCERR < 0 OPERATION IS A FAILURE $SCERR CONTAINS CODE%ß; $SCERR = 1 OPERATION IS A SUCCESSS6à; 0(SP) = RETURN ADDRESS OF CALLER OF $UCBSC ROUTINEá;-âMUUCB: ãDUUCB::M#ä .IF DF D$$DSK ;DISK DRIVER ONLY å"æ BCS 40$ ;IF CS OFFLINE REQUEST;ç TST U.BPKT+2(R5) ;REPLACEMENT QUEUE ALREADY INITIALIZED?Rè BNE 10$ ;IF NE YES<é MOV #U.BPKT,U.BPKT+2(R5) ;NO SET UP FOR ZERO ENTRY QUEUE(ê ADD R5,U.BPKT+2(R5) ;SHOW IT AS EMPTYë10$:&ì MOV S.KRB(R4),R2 ;RETRIEVE KRB ADDR<í MOV R5,K.OWN(R2) ;MARK THIS UNIT AS OWNING THE CONTROLLER5î MOV U.UC2X(R5),R0 ;IS THE EXTENSION ALREADY THERE? 'ï BNE 30$ ;YES, DON'T GET ANOTHER ONEC9ð MOV #1,R1 ;OBTAIN ONE 32-WORD BLOCK OF SECONDARY POOLSñ CLC ;CLR CARRY<ñ CALL @ALSEC ;ALLOCATE A CHUNK OF SECONDARY POOL ;GM112ó BCC 30$ ;IF CC OK ;**-13ó MOVB #IE.UPN,@SCERR ;SET FAILURE CODE ;GM112;+õ20$: RETURN ;EXIT WITH FAILURE ;**-1PöG÷30$: MOV R0,U.UC2X(R5) ;SAVE ADDRESS OF BLOCK IN SECOND UCB EXTENSION?÷ TSTB @SCOFL ;SPECIAL OFFLINE TO ONLINE TRANSITION? ;GM112Vù BLE 20$ ;IF LE NO ;**-1A"ú CALL MAPD ;MAP SECOND 4K WORDS$û MOV S.QST(R4),R2 ;GET QST ADDRESS+ü MOV (R2),R3 ;/*Q.CST*/ ;GET CST ADDRESS<ü CLRB @SCERR ;INDICATE STATUS CHANGE IN PROGRE00tà3—3t§3eaek›’SS ;GM112;ü BIS #UU.SPC,U.UTIL(R5) ;MARK AS SPECIAL ONLINE ;PKW110 2ü JMP ONLSIO ;GO BRING THE UNIT ONLINE ;PKW110 ;**-4H40$: CALL MAPD ;MAP THE PORTV( MOV S.QST(R4),R2 ;GET THE QST ADDRESS/ MOV (R2),R3 ;/*Q.CST*/ ;GET THE CST ADDRESSF8 MOV C.OLHD(R3),R1 ;ANY I/O OUTSTANDING IN CONTROLLER? CALL 60$ ;CHECK THIS QUEUE0 MOV U.BPKT(R5),R1 ;CHECK THE BAD PACKET QUEUE CALL 60$ ;IF ANYA  BIC #UU.SIO,U.UTIL(R5) ;CLEAR THE STALL I/O TO THIS DEVICE BITNC  MOV U.UC2X(R5),R0 ;GET ADDRESS OF BLOCK IN SECOND UCB EXTENSION,L  ;IF IT'S THERE850$: MOV #1,R1 ;SET SIZE TO ONE 32-WORD BLOCK ;**-2@ CLR U.UC2X(R5) ;ZERO ADDRESS OF BLOCK IN SECOND UCB EXTENSION> CALLR @DESEC ;DEALLOCATE A CHUNK OF SECONDARY POOL ;GM112 ;**-13;60$: BEQ 90$ ;EMPTY QUEUE, MUST BE AFTER LOAD OF R1 WITH # ; WITH FIRST (P)IOP ON QUEUEC,70$: CMP R5,I.UCB(R1) ;IS IT FOR THIS UNIT  BNE 80$ ;NO, THEN CHECK NEXT# TST (SP)+ ;CLEAR RETURN ADDRESSM2 MOVB #IE.VER,@SCERR ;SET FAILURE CODE ;GM112 RETURN ;AND EXIT ;**-1E!80$: MOV (R1),R1 ;GET NEXT IOPE* BNE 70$ ;CHECK TO SEE IF FOR THIS UNIT90$: .ENDC ;D$$DSK RETURN ;BACK TO CALLERE" .PAGE ;**-3" .IF DF,T$$APE ;JJM3042# .SBTTL ABOSIO - KILL I/O'S ON UNIT REQUIRING IT&;+ ;**-2 .'; **-ABOSIO-KILL I/O'S ON UNITS REQUIRING IT(;,J); THIS ROUTINE SCANS THROUGH THE C.OLHD QUEUE FOR THE CURRENT CONTROLLERK*; AND LOCATES ANY I/O PACKETS THAT HAVE THE IP.ABO BIT SET (BY XXCAN) AND2L+; THE IP.PND BIT RESET (SET MEANS ABO CMD ALREADY ISSUED FOR THIS PACKET).I,; WHEN SUCH A PACKET IS FOUND, AN ABO COMMAND IS ISSUED FOR THE COMMANDR-;B .; INPUT:/;0; R2=QST ADDRESS1; R3=CST ADDRESS2;; 3; OUTPUT:B4;B5;- 6ABOSIO: 7)810$: CLR LSTPKT ;SHOW NO PACKET FOUND %9 MOV S.QST(R4),R2 ;GET QST ADDRESS !: MOV (R2),R0 ;GET CST ADDRESSR1; ADD #C.OLHD,R0 ;POINT TO LIST HEAD TO PROCESS)<20$: MOV (R0),R0 ;GET NEXT I/O PACKET '= BEQ 30$ ;NO MORE THIS TIME THROUGHP8> CMP #IO.KIL,I.FCN(R0) ;IS IT A KIL COMMAND WE ISSUED?)? BEQ 20$ ;YES. SO LOOK AT ANOTHER ONEA9@ BITB #IP.ABO,I.PRM+11(R0) ;SHOULD THIS CMD BE ABORTED?"A BEQ 20$ ;NO. FIND ANOTHER ONE>B BITB #IP.PND,I.PRM+11(R0) ;WAS ABO ALREADY ISSUED FOR THIS?*C BNE 20$ ;YES. DON'T NEED ANOTHER ONE+D MOV R0,LSTPKT ;SAVE LAST PACKET ADDRESS,/E BR 20$ ;AND GO SEE IF THERE IS ANOTHER ONE *F30$: TST LSTPKT ;WAS ANY REALLY FOUND?&G BEQ 40$ ;NO. NO MORE FOR ANY UNITH;RI;S"J; ISSUE I/O ABO COMMAND FOR UNITK;;/L CALLV PORT,PKTCHK ;ANY RESOURCES AVAILABLE?.!M BCS 70$ ;NO. TRY AGAIN LATERIN"O MOV LSTPKT,R0 ;GET IOP ADDRESS%P MOV I.UCB(R0),R5 ;GET UCB ADDRESSR%Q MOV U.SCB(R5),R4 ;GET SCB ADDRESS 4R CALL PIOPAL ;ALLOCATE PIOP FOR 'DUMMY' COMMANDS BCS 70$ ;NONE AVAILABLE:T MOV #IO.KIL,I.FCN(R3) ;MAKE SURE WE KNOW WHENCE IT CAME%U ;PIOP ADDRESS IS IN R3 BY NOW.T(V MOV #ABOFUN,R0 ;FUNCTION INFORMATION(W CALL CMDCOM ;BUILD TEMPLATE COMMANDX.Y MOV LSTPKT,R0 ;GET ORIGNAL I/O PACKET ADDR?Z MOVB I.PRM+11(R0),P.OTRF(R1) ;GET COMMAND REFERENCE NUMBER 1 ;[ BIC #177760,P.OTRF(R1) ;ONLY GET 4 BITS WORTH (ACTUAL #)R;\ MOV R0,P.OTRF+2(R1) ;AND PUT IN THE ASSOCIATED IOP ADDRS]7^ BISB #IP.PND,I.PRM+11(R0) ;SHOW ABORT COMMAND ISSUEDB*_ PUSH <#10$> ;GO BACK TO SCANNING LIST&` CALL CMDSEN ;GO ISSUE THE COMMANDa; b;Ic; END PACKET PROCESSINGTd;M(e CLR R0 ;INDICATE NO I/O TO COMPLETE%f PUSH <#0> ;NO INFORMATION NEEDED/g CALL ENDCMO ;CLEAN UP AND THEN RETURN HERE/h BR 10$ ;MAKE ANOTHER PASS THROUGH THE LISTRi40$:'j PUSH <#SCUCB> ;SAVE NECESSARY ITEMSE/k50$: CALL @(SP)+ ;CALL SCUCB AS A COROUTINE)l BCS 60$ ;NO MORE TO DO.9m BIT #UU.ABO,U.UTIL(R5) ;DID XXCAN SET THE SERIAL MODE?A+n BEQ 50$ ;NO. DON'T EVEN LOOK AT UU.SERNFo BIC #UU.SER!UU.ABO,U.UTIL(R5) ;YES. RESET THE SERIAL MODE, ABO MODE&p BR 50$ ;AND LOOK FOR ANOTHER UNITq60$:'r00tè33l1DATADATADATADATADATADATADATA CALL 70$ ;RESTORE QST/CST ADRESSESR.s BIC #C1.ABO,(R3) ;TAKE US OUT OF ABO STATEt BR 80$ ;AND RETURN0u70$:/v MOV S.QST(R4),R2 ;GET THE QST ADDRESS AGAIN .w MOV (R2),R3 ;AND PUT BACK THE CST ADDRESS$x80$: RETURN ;BACK TO THE CALLERyz .ENDC ;T$$APEDÍ .PAGE ;**-82(6Î .SBTTL CLAATN - CLASS ATTENTION MESSAGE PROCESSINGÏ;+1Ð;**-CLAATN - CLASS ATTENTION MESSAGE PROCESSINGRÑ;E?Ò; ATTENTION MESSAGES WILL CAUSE A TRANSITION TO UU.ATN STATE.T$Ó; R5 WILL CONTAIN THE UCB ADDRESS.Ô;T Õ; INPUTS:RÖ; R1=ADDRESS OF END PACKET×; R2=ADDRESS OF QSTBØ; R3=ADDRESS OF CSTÙ; R4=ADDRESS OF SCBRÚ; R5=ADDRESS OF UCB Û; Ü; OUTPUTS:Ý;;Þ;-ß àCLAATN:Aá MOV R1,R2 ;SCUCB USES R1Bâ CMPB #OP.AVA,P.OPCD(R1) ; IS IT AN AVAILABLE ATTENTION MESSAGE?+ã BNE 40$ ;NO, JUST DEALLOCATE THE PACKETC0ä PUSH <#SCUCB> ;PUSH SCAN UCB ROUTINE ON STACK'å10$: CALL @(SP)+ ;CALL THE COROUTINEG#æ BCS 40$ ;IF CS -> NO MORE UCB'SSAç CMPB P.UNIT(R2),U.UNIT(R5); IS THIS ATT MESSAGE FOR THIS UCB ?è BNE 10$ ;IF NE -> NOéê .IF DF,D$$DSK ;DISK? ì ;**-17í BIT #UU.IOS,U.UTIL(R5) ;IS I/O STALLED TO THIS UNIT? î BNE 20$ ;YES, MARK THIS UNIT0ï BITB #US.MNT,U.STS(R5) ;WAS THE UNIT MOUNTED?ð BNE 30$ ;NO, SKIP THIS ONE4ñ BIT #UU.SIO,U.UTIL(R5) ;CAN THIS UNIT STALLL I/O?ò BEQ 30$ ;NO, CONTINUE>Kó ; TO GET HERE THE UNIT MUST HAVE SPUN DOWN BUT NO I/O HAS BEEN ATTEMPTEDô20$:ö .ENDC ;D$$DSK ;**-1C÷*ø BIT #UU.ATN,U.UTIL(R5) ;DID WE ALREADY?#ù BNE 30$ ;YUP, DON'T DO IT AGAIN ,ú BIS #C1.GUS,(R3) ;SET GUS TRANSTITION BIT?û BIS #UU.GUS!UU.SER!UU.ATN,U.UTIL(R5);SET GUS, SERIAL AND ATN&ü30$: ADD #10,SP ;FLUSH THE UCB SCAN)ý40$: MOV R2,R1 ;RESTORE THE END PACKET$þ MOV S.QST(R4),R2 ;RESTORE THE QST5ÿ CALLV PORT,PKTDR ;DEALLOCATE THE ATTENTION MESSAGE3 RETURN ;RETURN .PAGE9 .SBTTL CLACMD - INITIATOR AND CONTINUATION ENTRY POINTP;+?;**-CLACMD-INITIATOR ENTRY POINT AND CONTINUATION ENTRY POINT(;D=; DECIDE WHAT TO DO NEXT BASED ON CONNECTION MODES1/; A MODE IS A COMBINATION OF STATES.S;E ; INPUTS:I ;; ; R2 ADDRESS OF THE QST ; R4 ADDRESS OF THE SCB ; R5 ADDRESS OF THE UCB;E ; OUTPUTS:;V; R2,R4,R5 PRESERVED; R3 ADDRESS OF THE CST; TRY TO START I/O;- ;**-1 CLACMD: ;**-1* MOV (R2),R3 ;/*Q.CST*/ ;R3 IS THE CST- BIT #C1.RDY,(R3) ;IS THE RDY SET? ;**-2P BEQ 70$ ;NOT READY, BAG IT(C10$: BIT #^C,(R3) ;IS ANYTHING BUT RDY OR DQU SET?1- BNE 20$ ;YES, WE NEED TO DO SOMETHING SPS1 TST (R4) ;IS THERE AN I/O TO START? ;PKW109T' BEQ 70$ ;NOPE, JUST EXIT ;PKW109  ;GM103& .IF DF D$$DSK ;IF DISK ;GM103 ;GM103G BITB #C2.SHD,C.FLAG(R3) ;IS THIS A RECURSIVE ENTRY? C2.SHD IS ;GM103L5 ;ONLY FOR TESTING RECUSRSION THAT MIGHT ;GM103S' ;OCCUR DURING SHADOWING ;GM103Y+ BNE 80$ ;IF NE YES, JUST EXIT ;GM103I ;GM1033 .IF DF DU$CHK ;IF QUEUE OPTIMIZATION ;PKW119 ;PKW119 B BITB #S3.OPT,S.ST3(R4) ;IS QUEUE OPTIMIZATION ENABLED? ;PKW119( BEQ 13$ ;NO, CALL PKTCHK ;PKW119; MOV C.OLHD(R3),R1 ;GET THE OUTSTANDING REQUEST ;PKW119 5 BEQ 15$ ;IF NONE, WE CAN ISSUE A REQUEST ;PKW119;2 TST (R1) ;MORE THAN ONE OUTSTANDING? ;PKW119* BEQ 15$ ;NO, ISSUE THIS ONE ;PKW119* BR 70$ ;CAN'T ISSUE ONE NOW ;PKW119 ;PKW119N .ENDC ;DU$CHK ;PKW119  ;PKW119D .IFTF ;D$$DSK ;PKW119  ;PKW119 H13$: CALLV PORT,PKTCHK ;IS THERE A COMMAND PACKET WE CAN USE? ;PKW119+ BCS 70$ ;IF NOT, JUST RETURN ;PKW1199/15$: CALLR CMDSIO ;GO START AN I/O ;GM103EH20$: CALLV PORT,PKTCHK ;IS THERE A COMMAND PACKET WE CAN USE? ;PKW109+ BCS 70$ ;IF NOT, JUST RETURN ;PKW10997 BIT #C1.GCS,(R3) ;ARE WE IN THE GCS STATE? ;PKW109 (! BEQ 30$ ;NOPE, KEEP LOOKING ;**-2)" CALLR GCSSIO ;GO START 00tð3—3t§3eaek›’A GCS COMMAND #30$:1( BIT #C1.GUS,(R3) ;CHECK FOR GUS STATE ;**-4) BEQ 50$ ;NO. CONTINUEL* CALLR GUSSIO ;PROCESS GUS+50$:.+ .IFT ;D$$DSK - DISK DRIVER ONLY ;PKW119. ;**-29:. BIT #C1.REC,(R3) ;ARE WE IN RESYNCH RECOVERY? ;PKW110(6 BEQ 70$ ;NOPE, KEEP LOOKING ;**-7-7 CALLR RECSIO ;GO TO THE RECOVERY ROUTINEU89 .IFF ;D$$DSK - IF TAPE1:.; BIT #C1.ABO,(R3) ;ARE WE IN THE ABO STATE? < BEQ 70$ ;NOPE, KEEP LOOKING*= CALLR ABOSIO ;GO ISSUE ABORT COMMANDS>? .ENDC ;D$$DSK@70$:4C BIT #C1.DQU,(R3) ;SHOULD WE DEQUEUE UMRS? ;**-2D BEQ 80$ ;NOPE#E BIC #C1.DQU,(R3) ;CLEAR THE BIT ?E CALL @DQUMR ;AND CALL IT - NOTE THAT THIS MUST BE A ;GM112T4G ;CALL, NOT A CALLR. $DQUMR IS A COROUTI;**-1:G80$: RETURN ;DON'T KNOW WHAT TO DO, SO RETURN ;PKW109L .PAGE ;**-4#M .SBTTL CLADAT - HANDLE DATAGRAMSN;+ O;**-CLADAT - PROCESS DATAGRAMSP;TQ; R; INPUTS:;S; R1=ADDRESS OF END PACKETT; R2=ADDRESS OF QST U; R3=ADDRESS OF CST;V; R4=ADDRESS OF SCB#W; R5=ADDRESS OF UCB X;UY;S Z; OUTPUTS:[;$\;- ]CLADAT:#^ .IF DF E$$LOG:_ MOV R1,KEEPR1 ;SAVE END PACKET ADDRESS SO WE CAN USE IT<` PUSH #SCUCB ;YES, PUSH "SCAN UCB'S" ROUTINE ON THE STACK(a10$: CALL @(SP)+ ;CALL THE CO-ROUTINE!b BCS 20$ ;IF CS, NO MORE UCB'SE9c MOV KEEPR1,R1 ;GET THE END PACKET ADDRESS BACK FOR USEEd CMPB P.UNIT(R1),U.UNIT(R5) ;IS THIS ERROR LOG PACKET FOR THIS UCBEe BNE 10$ ;IF NE NO2$f ADD #10,SP ;YES, FLUSH THE STACKg MOV P.STS(R1),R0 2h BIC #^C,R0 ;R0 IS THE MAJOR STATUS CODE>i MOVB RSXTAB(R0),R0 ;R0 IS THE CORRESPONDING RSX STATUS CODEj BIC #177400,R0R0k CALL LERR ;TRY TO LOG THE ERROR LOG DATAGRAM:k20$: MOV KEEPR1,R1 ;RESTORE END PACKET ADDRESS ;PKW112k ;PKW112Sk .ENDC ;PKW112k ;PKW112;7k JMPV PORT,PKTDR ;DEALLOCATE RECEIVE BUFFER ;PKW112Ru .PAGE ;**-93v .SBTTL CLAEND - CLASS DISPATCHER FOR END PACKETS2w;+.x; **-CLAEND-CLASS DISPATCHER FOR END PACKETSy; z; ROUTINE DESCRIPTIONR{;T>|; WHEN THE PORT DRIVER RECEIVES END PACKETS IT WILLA}; CALL THE CLASS DRIVER AT CLAEND FOR EACH END PACKET. 8~; PICKS UP THE THREAD FOR EACH I/O AND RETURN?; TO THE CORRECT PLACE TO PROCESS THE END PACKET AND;€; COMPLETE THE I/O.�; ‚; INPUTS:Eƒ;A„; R0=E…; R1=ADDRESS OF END PACKET†; R2=ADDRESS OF QST ‡; R3=ADDRESS OF CSTEˆ; R4=ADDRESS OF SCB+‰; R5=ADDRESS OF UCBI"Š; ASSUMES ONE SCB PER CONTROLLER‹;NŒ;C �; OUTPUTS:Ž; �; R2-R5 ARE PRESERVEDI�;- ‘CLAEND:P7’ BITB #OP.AVA,P.OPCD(R1) ;IS IT AN ATTENTION MESSAGE?E3’ BNE 100$ ;GO HANDLE ATTENTION MESSAGE ;JJM307H™ ;**-6N1š10$: MOV P.CRF+2(R1),R5 ;GET I/O PACKET ADDRESSE+› MOV I.UCB(R5),R5 ;GET ACTUAL UCB ADDRESS œ:� CMPB #OP.GCS!OP.END,P.OPCD(R1) ;IS IT A GET CMD STATUS?-� BEQ 200$ ;GO PROCESS IN TMOGCS ;JJM307E 20$: ;**-2E(¡ MOV C.OLHD(R3),R0 ;GET ENTRY IN QUEUE.¡ BEQ 45$ ;NO ENTRIES IN THE QUEUE ;JJM3072£ MOV P.CRF+2(R1),R3 ;IOP ADDRESS IF ONE ;**-1¤30$:¥ CMP R3,R0 ;IS THIS THE ONE?N¦ BEQ 50$ ;ENTRY IS IN QUEUE§ MOV (R0),R0 ;GET NEXT ENTRY ¨ BNE 30$ ;CHECK IT*©40$:/ª MOV (R2),R3 ;/*Q.CST*/ ;RESTORE CST ADDRESSCª45$: JMPV PORT,PKTDR ;RETURN PACKET. NO MORE PROCESSING. ;JJM307E¬50$: ;**-1G#­ .IF DF D$$DSK ;DISK CONDITIONALE®8® TST P.STS(R1) ;ANYTHING OTHER THAN SUCCESS? ;PKW109.® BEQ 70$ ;NOPE, CONTINUE NORMALLY ;PKW109;® CALL ENDSIO ;GO SEE IF WE SHOULD STALL THE I/O ;PKW109E<® BCC 70$ ;IF CARRY CLEAR, THE I/O WAS NOT STALLED ;PKW1099® RETURN ;IF THE I/O WAS STALLED, JUST RETURN ;PKW109N·70$: ;**-8K¸ .ENDC ;DISK CONDITIONAL¹8¹ JMP @I.PRM+6(R3) ;GO TO END PROCESS ROUTINE ;PKW109½ ;**-3P:½100$: CALLR CLAATN ;PROCESS ATTENTION MESSAGE ;JJM307H½200$: CALLR TMOGCS ;PROCESS IN TMOGCS ROUTINE INSTEAD OF HERE ;JJM307¾ .PAGE'00tø3²ô4l1DATADATADATADATADATADATADATA¿ .SBTTL CLAERR - FATAL ERROR RECOVERY;À;+(Á;**-CLAERR- A FATAL ERROR HAS OCCURREDÂ;EJÃ; ON FATAL ERROR RESET CONTROLLER AND UNIT STATES. CLEAN UP C.OLHD QUEUEÄ; DEALLOCATING ALL PIOPSÅ;LIÆ; FOR DISK, MOVE C.OLHD OLDEST I/O TO C.REDO SO THAT IT WILL BE RETRIEDIJÇ; THE CONTROLLER COMES BACK. MOVE ALL COMMANDS IN C.OLHD TO THE FRONT OÈ;*É; FOR TAPE, MOVE ALL COMMANDSEÊ;T Ë; INPUTS:EÌ;JÍ; R2 ADDRESS OF QSTGÎ; R3 ADDRESS OF CSTRÏ; R4 ADDRESS OF SCB;Ð; R5 ADDRESS OF A UCBTÑ;E Ò; OUTPUTS:Ó;CÔ; R2,R3,R4 PRESERVEDÕ; R5 IS A UCB ADDRESSUÖ;->ÖTMOERR: MOVB #4,Q.RTY(R2) ;SET UP THE RETRY COUNT ;PKW109Ö SEC ;LOG ERROR ;PKW109G ×CLAERR:1Ø BIT #C1.FAT,(R3) ;DID WE ALREADY DO ALL THIS?O*Ù BEQ 10$ ;NOPE, IT'S TIME TO DO IT NOWÚ RETURN ;DON'T DO IT AGAINDÛ10$:Ü;O1Ý; IF CARRY IS SET THEN LOG FATAL HARDWARE ERROREFÞ; THIS ROUTINE IS CALLED ON 11M BOOT IN WHICH CASE THERE IS NO ERRORß;à .IF DF E$$LOGá â BCC 20$4ã|³|…–, ÞÞÕú QW 2”¡'TISYSYSYTIOVŠ>ßÈø”¡ ¡V(ÇȈÈ>ßÈA B C D E F H J K L M N P R S T «ð¹Š¢àæèþ*,.DLjlnœ¸º $&.$"pŠ–ž©F¡©Ö¼æ„¡ÿˆæŒ¡ÿˆ÷ 8)÷tÂä¹ — ºü‡÷Ö¾*æ̯ÿˆE‡Ä¸ÿô5 @ÀίÁ&` Š÷ ,1‡Å¥ ú÷ Å¥/wrw‘ò÷ w‘ë÷ Å¥:÷ ü5‡Å¥/÷ ð‡ÄÞ¾¥÷ Ö Ã÷ ؇¥Å~· Â÷ ʇÁÁÁÁôþAw,ˆúÁNÁ& æð¹‚w´ ·ˆþ·‚þ¡ þˆâ£·xþæØþÞ b‡÷,Lú÷ @÷:ó ò7 Rþó í7 Fþ Rƒ JÂ&æz®Þ C‡õµ4@Ð È Ð ü Á '€7Hþ÷mxþBþÿ5<þ76þ÷mbþ0þÿ ,þ?!&þ÷ ¤[‡Î~®ÔÀmFþÁE!ú÷ ˆM‡Þ Õ„Æõ ÃÁ ÷ rB‡Þ ù„»Ö Þ >‡÷,†—7Ôý÷mþÎýÿ5ÈýÀmðý @�@ ÀEþÿÁEïÿ@Põ5€õµ@€Q7”ý÷mÆýŽýÀߊý@]À ƒ@ÀìÁ÷ ¾%ÀlÀU€7Æ.ý‡Á& N�ÁBw‚þ÷ òw\þ÷ ýÁ@wpþ÷ úüÁAøÊ ÁW¦‚ñ÷ X f7 ¼þˆ¶¤Ã°ó · ª‡÷  ü¦÷ºü÷ ž·�÷ º2 2 ÷ à÷ Š÷ v÷-’üxùìÀˆü w€üA@,Aú1ÁÈüÿ ¨üÀ`üÿ ¸ü·6È÷ 4¤Ö æ4¡ÿˆwÈ À*þˆ ¥÷ "Á ž„œÂe� † Ò Ä ú ÁìFüwh õµõµ@Àeîÿð¥ð-Æ Âü�‚ û õŇæz®Þ 4‡4„@þÿ-5 þÿ& ÿ‹üÿ5èûÎÀÂEÿ€@‚ ‚ ‚ ÷Öûºû·`¶ûÿ²ûÌû‚À €PÁøûÃå÷ Ø€¦àï÷ Tÿʇõµ CÓ Ë Ó-û÷ 4ÿÎ~®¸w-ù³Âü·ö·,ö÷· ûóƒð÷懱’Ћ‡À\1¦ƒÁLBæ2ûÿÄ,ûÁe f f& ÎÜÎ쎊ÅDæfÿ û…ƒÅl¿øúÂΊïÖ ÿ€èú�‰¿àú‚‡¦ƒSÁbÁDƒƒS ú†ÈˆC&N`Ö ÈÁb¦ ’MŽb �b"€€Sp‚‡¡ô5þÿô5þÿw0úÀÿÿÅe€ !ýÀ 7¡ú±‡‡ À wVÀ%ÀƒÀe þˆ ¨÷"úÖÿ÷4úÒÿ÷,úÎÿ÷úÊÿ÷úÆÿÄü¦ÔTXÔ0X÷–JX÷$Xÿ5êù ÔHXÔ$X÷z>X÷XħÁôùA&TTñUÅÐùÿÊùºù¿ŠlÿE$TT T�õÿ¿õ€ õ•AfÍ ÅeÁ ú…ÅeÖ w0ÿÕÕÀÕÿß Õ€ Õ•Œÿ00²ú4—3t§3eaek›’Õ•Õ‡ææ Â%ÀƒÂe ÊÈ – f þˆx¨Äü¦7|W7XWÿ5Ôþ7|W7XWħÄeżþÿºþºþE$55 5•Ūþ5 ?Š þ‡ ‡$XX:Àñ¹7’ôÿ7˜ïÿ÷ @ÁewðÀ|¨÷ 0À<½HÀe x½ú‡ÂÈø÷ æ÷ÀÿÀ$¹Áf¹Â¢¹÷ 0¾¹÷¤ÿĹ÷ $ ‡ð•#÷  ‡÷ èÀ$¹÷  ‡Á!ð¥ðÿ*.÷5nÿ ¾¹ò !÷\ÿ ÷5TÿÂ0ø÷ j÷Dÿ¢¹÷ ¼Â¾¹òXò®¹À$¹Áf¹¾Á#Âl¹wÈ÷ �`Äá¾÷ z[‡¥=Ã÷ lT‡¥Rà ù÷ NM‡Å¥=J&÷ @F‡÷ JŠť/ùÀ „áÀ¸¹0°÷  1‡È•÷ B,‡€÷•X÷•P · Å¥/€ ÷ ü‡Ää¾¥÷ þÃ÷ äe‡¥cÆ~· è÷ ÔÅ¥/£÷ Ö” w¦÷ HþÀf¹7¼7¸7  þˆrªÃº÷ ¤)‡·„·�· Œ÷ º#‡‡÷ @þˆªªÀf w^A@,Aú1ÁÎöÿ ®öÀ>¾öwäßî¹ß[î¹ÿ ¼öÄ”öôЪ‡ÁºwXÁwP÷ ‡Å¥ ú¡‡±’Ћ‡Âhö‹,³, ò ‚ó‚ ‚ö±‡÷ h1†‚, .ÀJöÀåð $& !Â,  ÄÄEÿÅÅEB!B- Ä ö,áÄ!- Ã÷×× ±‡Å°õÅåEK-ús-õ±‡ÀÀ÷ Zû‡‡Á[ºwd7 âÁt¾ W ¨¾ü‡W ª¾†ÑÿÿúW Ö¾†Ñ   É%ÿÿûÑ õÁ ½À À ý÷ ¤‡÷ ÞÅåÀ À%‡÷ ïw"ÁwüÃЫÄ÷ °Ä ûÄЫ� ì‚À ø z¬Ååꇈ¬ˆ¬ˆ¬ˆ¬Š¬ˆ¬ˆ¬‡À8½& $ n¾‡ t¾†N #ö-óôµ@CÐ ˜#C(˜#Fè5CÖ ‡Ãª¾Ã%Ö¾ùƒÎ-(ÀÙ«÷ jÀåÐ¥$êôµ@Ë Ë%ÿÿÁO÷™¬Âþ·Àþ"Ó ïô5 ÍÓ$Ë%ÿÿüÓ ËÁI ÁJwˆþw†þÁKÂÜ«Ãt¹Êââââ¢(z÷ – QÀé÷ èÁl½À÷ Ü÷ "�Án¾ÿ5ÂóØÁZ½÷ N ÀÚ÷ ÖÍ%ÂÎÉ džÀÀH¼Àྷ& Á`½÷5ª¶Áf½Â¢ ÂåÂ-’¬‚Â-Ž©‡·ŒÁH½Àz÷ \ÁN½Àp÷ P÷ ò À ½ÁؼÂ$ð þÿ  ù÷ Î Á2¾æêÖ]è�‡ÁEÂl¹Á& æð¹‚wÖÀ À%ÀƒÀ% ‚‡Ö wÎþÅÎòAEÄ7 îÿA� Á DÄeawÚÿ7Ôÿ¡Þ ÄÈÿÔ 7!Äÿô‡ ²Þ ే÷ úÿ Àßðÿ· ìÿÀ$¹÷ � †ð¥öÿ*± Âl¹Á w<7Äÿ7¾ÿ‡÷ ºÿ&÷ ´ÿÀ€U‡ 0¯ &æ&f DÐEÄ%\‡Ä d¸ À °ÃŽ Ð”þÀ ÷  ÷ >ÅÄ| 7 v fL…÷ Å¥ À$¹÷ 4÷ŒÀˆw…„ƒ€‡Á °BàÀ$¯P�æ¯ÿˆ‡ææ)ÿˆwŒfÿ‡)À®¹Ð•[ ¦�Ü ÷ Е, �× ÷ öЕ]À容7Ö‡w Ö„ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ >E�€Aa×$Ò±œÿÿ‡÷ &÷ &÷ �’•’•€‡@Á(÷ f€  Àe ÀeÉÿÀe Àe ‡&æÿˆæ3ÿˆÂ Âw ö ”Å¥ üÅ¥ ùÅå0B¡†€÷  Aa”ôœÿÿ‡w ÄÄ'Å  ÅUD$†BA÷ L&�Â(÷ ÅU� ÀBQ÷ ®ÂЕ* ü‡Command I/O errorFile %X not a valid driver task imagePrivileged commandI/O error on input file %XFile %X has illegal STB formatSyntax errorDevice %2A%O: not in systemPartition/region %2R not in systemDevice not mountedFile %X not contiguousOpen failure on file %XTask image I/O error in file %XPartition %2R too smallIllegal driver task APR usagePartition/region %2R is a commonDriver already residentDriver being loaded or unloadedInsufficient pool spaceLoadable driver support not in systemDriver not loadedDriver cannot be unloadedDevice %2A%O: is attached, busy, online and/or mountedInvalid driver data base at offset %P in file %XDriver built with wrong executive STB fileWarning - KRB %3A interrupt vector %O too highInsufficient ICB pool space for CPU %1AWarning - KRB %3A interrupt vector %O in useSymbol %2R is undefined in file %XSymbol %2R is doubly defined by file %XIllegal value for symbol %2R in file %XDriver dispatch table is inconsistentCTB %2A is not supported by driver -- not loadedCannot load/unload a pseudo deviceToo many symbols of the form %2R in file %XCTB %2A does not existDCB table for CTB %2A is fullKRB table of CTB %2A will not accept KRB %2RKRB %2R not in loadable data baseCTB name %2A is a duplicateWarning - loadable driver larger than 4KPartition/region %2R is not a commonKRB %4A is not offlineIllegal use of partition or region %2RPartition/region %2R already loadedPartition/region %2R canno00²5ô4l1DATADATADATADATADATADATADATAt be loadedPartition/region %2R cannot be unloadedPartition %2R not in system, defaulting to GEN:²L²r²…² ²¿²Ì²è² ³³5³M³m³…³£³Ä³Ü³ü³´:´L´f´�´Î´ù´(µPµ}µ µÈµðµ¶G¶j¶–¶­¶Ë¶ø¶·6·_·„·›·Â·æ· ¸4¸_ € °¢¹„¹Ä™ðsâyLB®¹ABDEFIMNOPQRSTUXYZ<>Å"BaÊ$ep|v¢­$Ê®¶ÅÏJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw @&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ ÷À ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚bÂEÊ Ö ÌЕ%„Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ Œ �à õ‡& æÎen 6& ¦æÎeZ /& æÎe†ö*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎe & ¦æÎe Е A‚¦Þ à ÷–%‡& æÎeà òA÷ xõà û‡Ð• à ü‡A÷ bE‡AÂ÷ †E‡Ð• Aæ÷ DõAÎ ûÖ Â ÷ $Е.÷ ,õÂ÷ AЕ; ÷ ^ à à‡Â ýð¥ ÿÿùÀ øw V D…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w & DÅ… ƒ÷ &Е.À À À ce÷ â À …Е:÷ Å ù Â÷ Ä B‡rŒ àè 4<>BZ^`bdfÖÞ𖘬\}t¾˜¬U}v¾˜¬YMx¾˜¬|…z¾˜¬<|¾˜¬t!~¾˜¬z€¾˜¬â‚¾˜¬%„¾˜¬g'†¾;©@ˆ¾;©€ о;©ÀŒ¾;©޾;©@�¾;©€%’¾;©2”¾;©€>–¾;©ÀD˜¾;©Kš¾;©@Qœ¾;©€Wž¾;©d ¾;©€p¢¾;©Àv¤¾;©}¦¾+{Ðp ½ô¨:^ ½=©è&½D©ƒ:½L© N½e©º½t©š^½v©š½v©""½v©?T½¿©8r½ì©| ½ì©Ìe"½ì©”’$½6ªý&½6ª€(½6ªÔ€*½7ª4,½7ªf.½7ªö&0½T«|2½T«”’4½q«ˆZ6½•«[M8½ë«z}:½“U#¨¾ÿÿUNL -- VECEXPVEC×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ  ÕXÕÿ  *Õ8Õ¦Þ5Îe‡w öÁ,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡w¾ù èf¦æ&f ÅÂ…`Á Á ý°* �… !†ƒ”×  ×  Ä õ× ñƒ× ÿî× "D × a‡× z‚Ä ÃE Ñ�ÝEp(p°à„… †ƒ”× $ú× 0‡× 9ôƒ× A‡× Zîƒ× _ë× :� � ‚„… V†ƒ”× [È•]× <È•>È‹8 … |†ƒ”× %ú× *÷× -‡× .ñƒ× 0‡× 9ëƒ× A‡× ZåƒÈ ‚ … |†ƒ”× 0‡× 7÷ƒ× *ô× ,A ïlÈ jÁ hŠ„ … q†ƒ”× "A øÁ ö „ #A … c†ƒ”× $‡× %÷ƒ× *ô× 0‡× 9îƒ× A‡× Zèƒ× _å× .� £ß … †ƒ”× .× ; … f†ƒ”× 0‡× 9‚� õ]× -Á X� í× *Á QA æ × ,Á D× = Á >È5 B>ÈU °(wZþ× /*Á .�Á … .†ƒ”× $× -‡× .ƒ× 0‡× 9ƒ× A‡× Z ƒ× _ × :Áÿÿ   DÚ× " Á … †ƒ”³á°0±…„ƒ‚�‡f¦æ&fæ ÈE¢¢^Á`Å÷ úÄ ÈUQÅÿÿ÷ æÄ ÈUQ ÷ ÔÎË€ÈUIá ÈUà `¢Ãe á ÉáccD ÷   Ä”¡%¡*¡.A ÈU Å ï0 0 ��W ,ÈUw@W /D ÷ DÎÄ cBDaW£-Á�Á N�… W¥N W¥OD!†B�“Á N�{É …CÃE€€C¥ÃC¥D!‚Ñ ó�ñ‹þÿ€D! ΋ñ5 Ñ þÁe߃“ƒ Î�à UÂåÔpRpR„“pBCÃ5D ‘ƒ à KR΋KBAÁE�—­:ŒDœ0CŠÄŠý ÷ fÎÄ ÁeëB”—   ¡ƒŠDÒ� CS•ÄŠÞü ƒÐ÷ à  ‡W¤†CÅ E Cs ÉΕŠ …„ƒ‚�‡f¦¦)& 6 l(¢*¶„„íƒ †�”Å EÅ 'W "Å =N íÎ ëW :+W =Å 1 Â#W ,W /Å %W %W *ÑöÕ€ÍÄ W <ÈW [ÄW >W ]¾„ v�¢°(°* 6 ƒ…Æe‚�‡Å'ÇÿÿÿÿÎÇÊ5¦ „Ê €‚Ê5ùà ÷ƒõ…2Å Å 00² 5—3t§3eaek›’ÍUEÍ ø�‚‡Õè¾ (ÈÎǿՇÊEò ÊU ‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w Ð…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ „W ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&æf…Þ ƒ„…‡w ^ð*æ8Iðµ÷ œœ*=‡ðµ€)98÷  ÕeBÕ && ð Îå¶ �ÕU€�Ä÷ ‰�†ð¥öÿ*ð¥åÿ*Æe ð*Nlv °°΋œ*ðµ.2÷ ž „& ðµ#ðµ!ðµ)&ÎePæÂ(ÂeÊ ¦æ&æ•&Äð >€Åe >ÍE€÷ b†�•p�*÷ üwbw BÁ(DB‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±DÂ(Âe(¦„Äe$2ƒÃeäÿæÓÏÓ Ó(‹ÿˆ‡Ì%[]Ì%<> ƒ ÷ ¦„팂1 >‡w ®÷ ʇðµ)ðµ÷ X8C÷ $ð¥öÿ* ðÕ)ð ð*w‚ð•öÿ*ú÷ ì÷ ´õ‡ðep p ‡÷ „è‡ð¥#ðµ=Ä E”W¡9ƒÅ¥^éð•³ÿ*ÐÅå0ùà Å`à à CaÄ ëÃåCƒ Ôà ðµ=ðµ÷ X ð¥ð 0Àð•Øÿ*§ð¥ ðµ= ÄEÕ¥^Ä ûA¨ð¥ æÂe@ÃÎà÷ Þƒ߇÷ ðµ=� ÁEpÓðµ2ðµ!)8ÂeEÅ`l0Å …à ì0‡„ û0¡/ &l0Ä ü„…`pÄ „löÿ06°ôÿ4p 4÷ „ðp°æÄ ƒðÎà÷ 8ƒ ƒ÷ Vá÷ ù†ð•Øÿ*Á`‡ðµ)wòæ÷ jƒ‡æCàƒ#ƒÎà÷ ÚÎ ¦÷ Èÿ‚ð†– ‡DàÄ ‡ðµ@) ð 6ðÿ?0ðÅD)‡ðµ82Áe&À(÷ ¤€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡0Š+æ1ÿˆÅ(Åe à ÷ �ß%ÿÿ&ïp’*wð÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ Ì¡ðµ)"ðÕ(.÷ ¬ðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ <÷ ŒðÅ(.‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡&æ¦ff… Þ �‚ƒ„…‡ð‹*±‡ð*‡w ÌÿÁ w ÂÿÁ& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡f&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡ðµðe6p 4÷ ¬ÿ†8÷ ±‡÷ †81416÷ ÷ 6ñÅ ÷ \‡‡÷ ê†÷ ð‡ð 8 ðµðµ÷ îý‡ðÖ*±‡ðÃ*±‡ƒ  �D„PÄ5Rà ý†R”‡R”R”à üøw øÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w Ì÷  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡8Áe2 ‡÷ ìÿðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷  &‡f¦æ÷ ®÷ v†ƒ‚„÷ „‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ &0ž8*wBü±ðµ=p!†Õ•^ú‡141612Áepðµl2l0p‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ žûU•Õ8UMwªúÅåà w>û÷ ²úBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�wnû46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ ûwôú0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w ˜ú Á�   ìì� .Â% ÷ Tú ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ Dù ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡‡  85ÕÕ�8Õ, Õ*Õ �8Õ˜ÕÕÁeBÉ ð 8÷ ؇$&w Æùð*ðµ<S1 ¦à Ö KÊ ñU€ò ñU@ò æ÷ ƒ‚f&œ" ÷ X€�†‚×'&�ÿ)×'&ëÿð&* ðÊ*Ä%0þðÌ*±‡NDÅ Å ý¦æ÷ (ƒ‚÷ ñEÿû±U‡÷ ¢‡÷ À‡÷ †‡æ¦ƒ‚ÃåJ„”Ä¥[Ä¥<C…Å`¥ ¡>C÷ ˆÒ¥,÷ ~… 4ÃB‚ƒ‚× *‚㨂 DÄe $ $ $ ÷ ,‡ñz ñññ÷ (‡DEÅe     ýð•Ìÿ*1 ±‚ƒ‡ Ë•0‹¤þ‹¨‡—¢3‚¥÷ "÷ Ä ‹¨ ¥Ë”Ó”¦æ£˜Ä ýƒ‚‡‹¢‡Ê¥7‡¥‡w þ÷BC œ"¦æ&00²5ô4l1DATADATADATADATADATADATADATAæÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=wº÷Å(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡Ä Ä Ä ðµf÷ .÷ð >€5>õE€u ÷ 6ö�‡ñ ± ‡æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡ð*ðµ;ðµ7ðµ#3w ,ö *’$Ê ':æƒô �ô�…T•à ýƒñU@…Ê% D•ÄDÓÄ%][Ä%><wÔü÷  †wØññ1 ‡Ã ÄÄ%ñ,ñ,ñññ:4Š× ±‡w rõð*DÅ Å ýæ¦Y…‚T¦fÃ(ÃeŠæ„ðµ<Ó•_‚ S•Ä ýó¥:ÿÿÓ•:‚ ƒ…¦æ& œ"& ΕæÏÿˆ‚4†×'&�ÿ ð&*×'&ëÿð¤ÿ*±*ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ b ‡à ññ÷ –üð•Éÿ*‚ƒ‡w ‚ôð*æ ƒ ‚æ¦×¢"wf)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷ ¾‡eÄ%w ñU\ñ5@ƒ âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ "ñ5@\ñU@ñ5€áÄ„íÄ ñ5LñUþ¥*ñUÄ Å‚öƒàÎàà Ê¥*Ã%C!.D`÷ ê*‡ƒ‚wòþÆeCÃ5€ñU‚Ã5 ±±± Ã5€± Ã5@±‡Æeð•Êÿ*±‡ðµ=õñU„Ä EÅe& ÷ RÄEÅe÷ Ö ¼Ó¥"Ý öŽwVþö Ë¥"  ƒ Ë¥"ö Õ”Ä Â Ä î ƒ  ê¶ Õ• Ä ü‡&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡TaÞ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡±‡Â(Âe(¦Ê ññ1 ÷ `£(£(£££‚÷ ¸ø†� ‚÷ >âââââ‚:ƒô �ô�‚””à ý¡Á5Á ±‡ÂeCÃe¡‡æ5æ±ÿˆ‡ß%& Ëw >ñ&Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë å¥.‹ Ä ÅæU¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë ‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±ûw æùÁ(ñ D÷ šõð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwtÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)ÁeB÷ ž ‡÷ Lñ \ðµ#÷ üU†&œ* ðµ=ð¥æ•Øÿwô Å`p!2üƒÅàÅ… ÅEW!Åp0p2÷ Îׇðµ#(ð PðÕ)÷ „†ðµ@#ð¥Çÿ*ð*fff÷ >±±‰‡÷ N†&œ*wjðµ.÷ nB‡ð5ð(8ðe$8w2€æ•ÖÿA&À(Áe÷ îú€†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA#ðÕ@))÷ Àù †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ Šû00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ t‡0 @0 ð‡&œ*0 @÷ ÷uÄ÷ .öðµ# ÁeB&B÷ ä°B÷ ÷ ´õ°•*±‡÷ Þö ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ Xõ0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6wöð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡w šõBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=wVõÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡ðµMðµ=ðÕf�Â(& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ðµ=&Îe0æ ÷ ’ôU• Â…à  ÂE•Õð >€ >ÍE€ðµ=ufÄ÷ róp†�ñ ± wlô÷ " ‡f÷ \�†&œ*÷ °•*±‡Ä Ä Ä ðµf÷ úóð >€5>õE€u ÷ ó�‡ñ ± ‡÷ ÌóMÄwäòðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡00µJ5—3t§3eaek›’|³Œr–, ¿á¿ásQW áT¨¡TITISYSYTIOVzþØ@ÎðT¨z¢VrµxTITISYSYTIOV(‹ ¿áе@ÎþØŒr|³@ÎSY ÿÿÿALL ÿÿ Âw È ”Å¥ üÅ¥ ùÅå0B¡†€÷ XAa”ôœÿÿ‡w –„ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ äE�€Aa×$Ò±œÿÿ‡w Ä'Å  ÅUD$†BA÷ (&�Â(÷ ÅU� ÀBQ÷ vÂЕ* ü‡÷ &÷ &÷ �’•’•€‡@Á(÷ Rf€  Àe ÀeÉÿÀe Àe ‡&æ¦f&¦ v Þ €�‚ƒ„…‡JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw 2D…&&÷ bЕ-�Î �eÁaÁe»ÿP”P”P”Е-�$w DÅ… ƒ÷ &Е.À À À ce÷ �À …Е:÷ Å ù Â÷ B‡RMD - Segment '' not foundRMD - Terminal type not yet supportedRMD - Terminal/page combination not yet supportedRMD - Page does not existRMD - Terminal type not definedRMD - Allocated screen buffer too small for this deviceÚ}¬RŒrþqüX]È_àQUqÀ..M..I..P..CMDHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLATHLCGCDHLHLHLHLIOHLHLHLMDHLHLHLHLHLSSTHHLHLHLHLHLHLHLHLHLHLHL$:\^lr„†ˆ’š°ÂÒþ&*,Dr�œºÄÌÔò "$&(6<N`€‚„†”–’ž¶¼*€„´ØÞ  « ô¤  ¥%  9¥1  j¥  ƒ¥  ¢¥7  ))©¨¦;ŒþxþæD¨ÿˆ†þˆ˜¨ÿŠþDþÀ†þ>W,TI,úÀ|þõ7Œý‡ææ!ÿˆ÷ výÀÚ¥÷ Ú †ÃÜ¥w2÷ X†wˆ÷Týý÷NýýÀà¥÷ ² †Ãâ¥w à ÷p × €wdÀæ¥÷ Ž †Ãè¥wææ$§ÿˆÀý7Ôûðÿæò§ÿˆ5‡ÀþV0Šô§Áô§Ñ¥ À û)À 'CÓ¥, û€à  @ÒÀE À5@Àå À (¦7¨üw”¢üw’Ÿü  ÷šü·˜üÀ¦7’zü7’yü7’xü7”wü7’kü7’jü7’iü7’hüÀ¦ ÷ Fùw0üÀ¦ ÷ 8ùw&üÀ¦ ÷ *ùwüÀ¦ ÷ ùwüwüÀþ¥÷ ” †Ã¦wìÀì¥÷ ‚ †Ãî¥wÚÀ ¦÷ p †Ã ¦wÈ÷ <÷ úû÷ ØS7 îûÀò¥÷ J †Ãô¥w¢ÿ E‡Àø¥÷ 2 †Ãú¥wŠææ!ÿˆ÷Høvý÷Dørý÷ t"÷”ªœû÷ 0ø÷šª�ûŒûæä§ÿˆææÿˆÿ ¼æ_ÿˆ÷ Šæaÿˆæî§ÿˆ^ûÿ ž÷ rÀTûðúæ3ÿˆ÷(ª@ûÀ¦÷ ¢ †Ã¦wúÿ n‡$ûÀ"ûðæùæ3ÿˆ7Æ€ÀEÿÀ%4À%1À%DÀE À5@Àå À ð (¦7(¦Úú÷Ž©Öúææ!ÿˆæÿˆÀxæsÿˆ÷(ª¶úææ!ÿˆæÿˆÀXæsÿˆÀšúð5€ õ÷Ø«Šúææ!ÿˆæÿˆÀ,æsÿˆ÷ Vâ÷Úªdúææ!ÿˆæÿˆÀæsÿˆ÷ &ÀBúðùæ3ÿˆó%À*úðîøÁ00µR5ô4l1DATADATADATADATADATADATADATAÀ¥÷ Ð÷Á÷ Ê÷ð¥MÿÿË%È_æ<§ÿˆæ3ÿˆæT§ÿˆæ3ÿˆæl§ÿˆæ3ÿˆæ„§ÿˆæ3ÿˆæœ§ÿˆæ3ÿˆæ´§ÿˆæ3ÿˆ Œúæ ¬Þ ‡6 À,ùÁ¬ö‡Á¬ó‚ÆeBEÅì¡ÅŠÂlû‡Ã&ú„ÃÅæœÎìæf&D¡Þ „…ƒÅlΊ—£ÿÿðÖ æ±L×'&ÿÿæ1ÿˆæææÓÿˆ‡‡ßî&wÔÿ¢L‡w \Á,Dœ BÊ ±A°, °,ò5Âeaí¡‡„ôE€ò5 „ôE€ÊE f & ¢‡& ¢‡1 ù ñ  Ü…„Þ ‡ßî&w*ÿ¦Ê5‚ú‚‡ò û¦¦‚ Ž Ê5ùÊUŽ‚öÖ ‚å·^´е4µ~´ ·‡ÊEò ÊU ‡¡*‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w Z…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ àñW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&æf…Þ ƒ„…‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡&æ¦ff… Þ �‚ƒ„…‡‡  °·>·ŒrW!�°¼ø·.·Ú}¬R�°¼@··Œrþq�ð¿N·®·ÔZP�ð¿P>·^·,�ð¿P>·n·��ð¿P>·~·`Ž�ð¿,>·Ž·LP�ð¿,>·ž·��ð¿P>·N·SŽ�@À¾·NºÔZ(P�@À®·Î·,,�@ÀH®·Þ·,íQ�@ÀH®·î·�íQ�@ÀH®·þ·�íQ�@ÀH®·¸SŽíQ�@ÀH®·¸LPíQ�@ÀH®·.¸`ŽíQ�@À ®·>¸,í3�@Àü®·N¸,m �@À¨®·^¸,M~!�@À¸®·n¸,m"�@ÀÈ®·~¸,å#�@ÀÄ®·Ž¸,¥:$�@À`®·ž¸,Åy%�@À`®·®¸�Åy&�@À`®·¾¸`ŽÅy'�@À`®·Î¸LPÅy(�@ÀÄ®·Þ¸�¥:)�@ÀÄ®·î¸�¥:*�@ÀÄ®·þ¸`Ž¥:+�@ÀÄ®·¹SŽ¥:,�@ÀÈ®·¹LPå-�@ÀÈ®·.¹`Žå.�@ÀÈ®·>¹�å/�@À¸®·N¹LPm0�@À¸®·^¹`Žm1�@À¸®·n¹�m2�@À¨®·~¹�M~3�@À¨®·Ž¹�M~4�@À¨®·ž¹LPM~5�@À¨®·®¹`ŽM~6�@Àü®·¾¹�m 7�@Àü®·Î¹�m 8�@Àü®·Þ¹SŽm 9�@Àü®·î¹LPm :�@Àü®·þ¹`Žm ;�@À ®·º�í3<�@À ®·º�í3=�@À ®·.ºSŽí3>�@À ®·>ºLPí3?�@À ®·¾·`Ží3@�Â^ºîºÔZPP@�ÂNºnº,È_A�Â\Nº~ºãQÈ_D�ÂNºŽºã3È_E�ÂNºžºc È_F�ÂPNº®ºC~È_G�ÂTNº¾ºcÈ_J�Â�NºÎºÛÈ_L�ÂNºÞº›:È_M�Â8Nº^º»yÈ_N�dÆþº·ÔZxPN�dÆ8UqÀO�dÆîº»,üXP�dÆ4îº.»éQüXS�dÆ@ îº>»ðQ]Z�dÆœîºN»ãQàQ\�dÆ<îº^»é3üX^�dÆìîºn»i üX_�dÆÐîº~»I~üXa�dÆŒ»iüXc�dÆ�»áüXd�dÆt»¡:üXf�dÆà»ÁyüXg�dÆ îºÎ»Èy]l�dưîºÞ»»yàQn�dÆl îºî»¨:]s�dÆœîºþ»›:àQu�00µZ5—3t§3eaek›’dƬ è]{�dÆxÛàQ}�dÆ îº.¼p]‹�dÆ„îº>¼càQ��dư îºN¼P~]“�dÆ8îº^¼C~àQ•�dƸîºn¼p ]˜�dÆÌîº~¼c àQ›�dÆ¼ð3]œ�dÆ¼ ,]��dÆîºþº,àQ pȼ R{…9€9€9€9€9€LPSŽ����LP`ŽLPJwLPLPLPLP`Ž`Ž`Ž`Ž`Ž`ŽLPLPLP`Ž`ŽV†W†X†Y†Z†æ°¼ÿˆ×-Cþÿ÷‹¥ÿ÷`Žìè‡À�•ÿ.÷LPÞè÷‹‡ÿ÷�Òè‡ÀÒèð5#ÿ5véð‹&œ&ð5 ÷LP¢è‡ð5 ÷�’è‡÷SŽŠè‡À 7μ€è‡÷”Mxè‡ ¸½¸¼À� ÷âÿ7æÿ÷ù¿Þÿæ¼½ÿˆ¡ææ)ÿˆ‡±‡À�÷´ÿ7¸ÿ÷ À°ÿæ¼½ÿˆÀÞ¬Á^´ †Ð• ûææ)ÿˆ‡Å¸¼w„ÿÀ�° Áù¿W!¶½÷ \U”À ø7 Pþ7 JþÂÞ¬÷„Fþ·@þ�€Âmx€ yƒÐµ€ûÀ CàÃm þÃíþ÷‹€Bíz?‚ÃíþÃm’Ä�Š÷ D &f¦ÀeÀÁ ÷ t÷ô�ÀÃÜýÃmfÄ^÷  ÀeÀÁ ÷ L÷‚�€ô�ÀÃ�ÄÀW!¶½÷ ¤•à ø÷–ý–ýÃŽýÃíŒý W!¶½÷ ‚Õ• · xýà õCàW!¶½÷ fU”à øÈÅ€W!¶½÷ R”€ ƒÈµ€ó…õ¥ ÿÿW!¶½÷ 0Õ• · $ý÷ &ýwÚþÀ�^ Áù¿W!¶½÷ U”À øwÅ帼×-bæØ«wþæ¼½ÿˆ†×-T@ÿÿæ1ÿˆô÷‹Öý€÷Ø«6æÅ¸¼‡PHHJY P P 00µb5ô4l1DATADATADATADATADATADATADATA PHHJH  %,/:D&&&&33    FEEE%,/:D #(5(5  FE!$.8 #(5  BABB%,/:D&&&&33    FEEE%,/:D&&&&33    FEEE00µj5—3t§3eaek›’,6,<,<     , E , E-;(9(9(9(9(900µr5ô4l1DATADATADATADATADATADATADATA,6,<,<     , E , E-;(9(9(9(9(9,6,<,<     , E , E-;(9(9(9(9(9:D !!,,??          ! ! !!!!! ! !!!!, , ,,,,, , ,,,,7 7 77777 7 7777? ? ????? ? ????K K KKKKK K KKKK:D !!,,??      !! !! ! !,, ,, , ,77 77 7 7?? ?? ? ?KK KK K K:D !!,,??          ! ! !!!!! ! !!!!, , ,,,,, , ,,,,7 7 77777 7 7777? ? ????? ? ????K K KKKKK K KKKK4> !!,,         ! ! !!!! ! !!!, , ,,,, , ,,,7 7 7777 7 777>H)05:CL)05:CL, $05:?L $05:?L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L>H)05:CL)05:CL, $05:?L $05:?L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L00µz5—3t§3eaek›’>H)05:CL)05:CL, $05:?L $05:?L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L     $ 0 5 : ? L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L $05:?L>H#:#$2>L    0G: ".:F)5AM   ) 5 A M   ) 5 A M   ) 5 A M   ) 5 A ".F)5M)5M ".:FBBBB>H#:#$2>L    0G: ".:F)5AM   ) 5 A M   ) 5 A M   ) 5 A M   ) 5 A ".F)5M)5M ".:FBBBB>H#:#$2>L    0G: ".:F)5AM   ) 5 A M   ) 5 A M   ) 5 A M   ) 5 A ".F)5M)5M ".:FBBBB0:  ) *5@ -:G /<C     ( , ( ,(,(,(,(,(,(,(,(,(,(,(,0:) *5@ -:G /<C0:  ) *5@ -:G /<C     ( , ( ,(,(,(,(,(,(,(,(,(,(,(,0:  ) *5@ -:G /<C     ( , ( ,(,(,(,(,(,(,(,(,(,(,(,00µ‚5ô4l1DATADATADATADATADATADATADATA 0:!!!!      !      !      !      !      !!!!!!!!!!!! 0:!!!!      !      !      !      ! 0:!!!!      !      !      !      !      !!!!!!!! 0:!!!!      !      !      !      !      !!!!!!!!!!!!!0:!!!!      !      !      !      !      !!!!!!!!!!!!55 500µŠ5—3t§3eaek›’5 5#ÀVúÀmTú Òà† 7rÚû€ À-Òû†ÀíÌûÀ Àm4ú¨¡‡÷ (ú÷À Àm ú¸¡‡±‡}   ÌÿÿÔÿ   ‡00µ’5ô4l1DATADATADATADATADATADATADATAS¦�œ�œ&À€ì�ÿ ’ä€lÀEÿ€f ÷ ÒóЕ:�‚‡[òÅòÅóÅóÅôÅôÅõÅõÅöÅöÅ÷Å÷ÅøÅøÅùÅùÅúÅúÅûÅûÅüÅüÅýÅýÅþÅþÅÿÅÿÅÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ Æ Æ Æ Æ Æ Æ Æ Æ Æ ÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆ Æ!Æ"Æ#Æ$Æ%Æ&Æ'Æ(Æ)Æ*Æ+Æ,Æ-Æ.Æ/Æ0Æ1Æ2Æ3Æ4Æ5Æ6Æ7Æ8Æ9Æ:Æ;Æ<Æ=Æ>Æ?Æ@Æ@ÆAÆAÆBÆCÆCÆDÆEÆEÆFÆGÆGÆHÆIÆIÆJÆJÆKÆLÆLÆMÆNÆNÆOÆOÆPÆPÆQÆQÆRÆRÆSÆSÆTÆUÆUÆVÆWÆXÆYÆZÆ[Æãb/00µš5—3t§3eaek›’ ûÃ@À ÁÔÁ Àzùÿ ^à ÀÔÀ `ÁeÞ¬sþÿ î7 rû‡ƒ ù–ÆUP POOL=SECPOOL=TASK=FREE=IN:OUT:PARSERRSEQD÷ h÷þˆ¸Ç÷^àvûÁ<àWtúÿÁEüÿ5 àÁo:àÁå€wXû÷ôßLû÷ðßDûÁÂÂà‘‘ÉPò5ÉMò5ÉDÑ ‘ ‚W Äæƒ Äz¢ÅÓ Ý÷ @凂,‚ú´ÄeÅ ìæ ¬Áz¢Àñ +Þ 1‡õ5@úõ5öõ5 òw!Ûïw!Ûìw!Ûéw!ÛæqÉ1 ñœÅì± ÅìûÁeÀ ÎÞ ‡Æe‡Â„øÁDßÀ ÷ 2Ò• Ò•VÁ<ßÀ÷ Ò• Ò•BÒ•LÁßÀ÷ Ò• R”À ý‡Â<ø ÁöÞÉ‹ Ò•(ÀR”À ýÊ•)Àø Áîù¡ Wtüÿ ÷ ÚíÈ•KÂøÀÁiÆR”À ýÂøÀÁ{ÆR”À ýÂÜ÷ÀÁfÆR”À ýÂð÷ÀÁ€ÆR”À ýÂâ÷ÀÁƒÆR”À ý¨÷ÀÁvÆR”À ýÿ5@Þ Âœ÷ÀÁnÆR”À ýÁ÷ÁåÁEw,ù Ã’÷ € BÄÄm÷Ó•*Ô•- úÃx÷ € BÄÄíäöÓ•*Ô•- úÀ =�Á ÃòøC`à �r·ÞøÂ   ·Vý Ã8÷ÅÅmÄøÀ¡ � � � �  ÷ ´ìÃeÄm*ýC!ï‚à ÷ÅÅm–øÀ¡ � � � �  ÷ †ìÃeÄmüüC!ï‚ÂàöÁ‡ÆÀR”À ýÂÐöÁ‹ÆÀR”À ýÁ´öÁm(öÉ•EÁ¦öÁíöÉ•EÁ8ø÷ 8ü ‡€ÀmöÈ•PÀíúõÈ•PÅ~ö%ÄÂW!V´ ‚@÷ ÀÙ÷ ºÙ7rüЕ:Ð�jüÅmÆõë÷ êû臀Àm¶õÈ�RüâÀí¬õÈ�HüÝÁ¸ÜWpw¾÷ÁÞ¬Â^´B †Ñ¥ ûñÕ€ÿÿ÷ÀJÁ À ýÁnõWpw„÷÷Üx÷¡‡–Æ÷/fà~û÷(ª|߇þˆ°ÊÀÁ À ýÅÂÿµàÀ"àÀ8à? 4à÷ <†*ú =Íÿÿ:Ÿæß ·jÿ ÷ à`ÿ· \ÿ%†„Ämôß„ÄmÊßÌ‹? äß„ÄmÀßÌ „Äm¶ß÷ Ú†*úÕÿÿÕþÿÅeÂe· ÿÏÀ,   À,ÂÄLß 4"†0m° ôÿ5@<ßÁBßwŒú÷N߈úÁÛÁ] Û7Û7Û7þÚ7$ôÚ†7þÿìÚ7$êÚ†7þÿâÚ7$àÚƒ7þÿØÚ÷ÈÞHú÷ÀÞDúÁ~¢Â:ÂÀD*ô5@&ôµôµ@ôµ ñ•ÿÿÒ.2ŠÿÿÒ01ŠÿÿÁeÀ Ü ñ•ÿÿñ•ÿÿ’$ÁeÀ ÏÀJ      Á–ÞÁåAñ ñ5€÷ JÞôB&ò5€· ¨ù·l¦ùw ¤ùæ· šù·lšùw ˜ùÞ÷Þ’ùÄÞô û÷%@Bù†ô ò 7lùÄðÝÅZÂwô ù&„óô5€Hô5 Õ Õ()K&]Õ!!?ô5@Âóµ@  ô5ÆåæŽø¿Šøö ö ¿zø••••Õ++ÕÕÕ<>ó5€õ[]þÿô5õU€þÿ ÷ Fü€ÀíöÀmö mÁ ÷ *ü€ÀíøõÀmòõW!ƆwöþÖ Õÿÿ‡ð5ÿ÷Gÿ5²Ü)ð5 =æŽÜÄmt܈76ð50ð5À�D&‚&¿ BÜ ÿ PÜB‡ð ð5Àð5ð5 ÿ5€:Ü8<68¡‡±‡æ|Ææ=ÿˆ÷ Œõ÷ ¬ûÀjÆÁ|Æ÷ ”ÙÀ ÁjÆÂlõR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ Võ÷ rûÀjÆÁ‚ÆÂ÷ ˆÙÀÁjÆÂ2õR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ õEÂ÷ÂíÚöÁöö� ÁíÎöÀÎö÷ €ë  @�r<w4û rw&û7 ûÀjÆÁû ÷ ÀêЕ:Á û ÷ °êЕ:Áüú ÷  êÀ ÁjÆÂžôR¤rœÿÿÿÿòÕ€ÿÿÀ öÿ5ÛÄŸÛÄe@7‘ÂúÄå@÷•:¹úÄ Å ä Å ÷• ¢ú÷• �úô PÀ4ÀjÆÐ�ŽúÐ�‹úõ%ÿÿ õ%þÿÂAÂ÷ ¶×AÂ÷ ®× Ð*IÐDLÐE*Ð*OÐFFÐL*ÀÁjÆPÀR¤rœÿÿÿÿòÕ€ÿÿÀ 00µ¢5ô4l1DATADATADATADATADATADATADATAöÄå÷Š&úÅåÂ÷ âó5À ÁjÆÑ À üÀjÆÁšõ�  ÷ zéЕ.Е:Áˆõ�  ÷ féЕ.Е:Ávõ ÷ TéÈ•.ÀÁjÆÂŠóR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ tó5À ÁjÆÑ À üÀjÆÁºÕ�  ÷ éЕ.Е:Á¨Õ�  ÷ öèЕ.Е:Á–Õ ÷ äèÈ•.ÀÁjÆÂóR¤rœÿÿÿÿòÕ€ÿÿÀ öÿ5@|Ù}ÀÔôpd7rÊô7üø÷-RÕÂôƒ÷¼ôHÕ7FÕ÷ Þò3À ÁjÆÑ À üÀjÆÁ˜ô ÷ rèЕ.Е:Á„ô ÷ `èЕ.Е:Á¨ø ÷ NèÈ•%ÀÁjÆÂŠòR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ tò3À ÁjÆÑ À üÀjÆÁºÔ ÷ èЕ.Е:Áô ÷ ôçЕ.Е:Á˜Ô ÷ âçÈ•%ÀÁjÆÂ òR¤rœÿÿÿÿòÕ€ÿÿÀ öÅÄÁjÆÀ Ñ À üô fÀFõ x¢3ÀjÆPt¢A�v¢ ÷ ”çЕ:C�w¢Ã {šÎ¤ÎàÎ¸ÎÆÎÔÎÁ:Âaa ÷ ÐÔÈ•.ЕDЕMÈ•O ЕFЕOЕRЕOЕFЕLÀ ÁjÆfÀR¤rœÿÿÿÿòÕ€ÿÿÀ öÄåÅåª÷ bñ÷ T÷÷ P÷ÀjÆÁ&ó ÷ êæÀÁjÆÂ:ñR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ $ñ8÷ ÷÷ ÷÷ ÷÷ ÷ÀjÆÂÞòÁÜò¡  ¡  ¡  ¡  ¡  B � ÷ xæÈ•KÀÁjÆÂÆðR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ ²ð÷ žö÷ šöÀjÆÁrò ÷ 4æÀÁjÆÂŠðR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ tð;÷ ^ö÷ Zö÷ Vö÷ RöÀjÆÂ,òÁ*ò¡  ¡  ¡  ¡  ¡  ¡  B � ÷ ¼åÈ•KÀÁjÆÂðR¤rœÿÿÿÿòÕ€ÿÿÀ öÁØñ÷ œõ�ÁZ ÁZÂÀí^ïÂàïÂíVïÂmlñÄlñ  ÷ jÀÊï Àm<ïÂÀïÂm4ïÂmJñÄ,ï÷ L÷ ´ï"÷ ’õ÷ Žõ÷ ŠõÀjÆÁjñ ÷ "åÈ•.ÀÁjÆÂ‚ïR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡É%ÿÿwJ@,†wúÀ *†w,Fï†w,>ï†CClƒ  CÃí&ïÃíšîClƒ`ƒ   ‡ÃmïÃm„îƒà÷•=õñ‹�÷•-õ ‡w /&f¦ñ¥)AÀjÆ÷ .Ò�A÷ "ÒÀÁjÆaM¢M’ÍÕ€Åm&î� À ö‚�€wŠô÷: †ô÷ ‚ôä&aÅÈ¥ È• ÈÕ€ÀmìíÅ õ€1  ‚ ‡H¬HœÈÕ€€ Áe wêþ1  ‡È­ZôÈ�TôÈÕ€€ žH¬HœÈÕ€€ •È¥ È• ÈÕ€€ Œ †&aÅÈ¥ È• ÈÕ€ÀmjíÅ õ€È¥ È• ÈÕ€€ å‡VÇ   ÈÆ $ ÇêÆ( COMMAND > RMD - Illegal command - ÁßÀßÑ¥,À û€ � ÂìÞCà À wâÞ7àÞƒ é¡·Äÿ‡±‡÷ ÌÞ÷ ¢ö÷ šæ~Æÿˆæ–Æÿˆ÷êÆ®Þ÷ ÿªÞ¡‡÷ –ÿî‡÷ Dú†÷ è÷ „ÿ†¡‡÷ .ø†÷ ‡ÁfÿÀêÆP”þÀ ÀåÒÆ÷ÒÆ°þ7®þæfÆÿˆ±‡�¦¡Ê¥ Ê¥`‚ÊÅ ‰’� ‚ ƒ óC� Šw‚±‡÷VÉnþ÷LjþæfÆÿˆ÷®Æ\þ÷XþæfÆÿˆ÷ŒÉJþ÷^FþæfÆÿˆ÷ÀÉ8þ÷€4þæfÆÿˆ÷®Æ&þ÷"þæfÆÿˆ÷òÉþ÷ŽþæfÆÿˆ÷®Æþ÷þýæfÆÿˆÉ¥FÉ¥RRwnÿÉ‹µÉ¥1‚É¥4‡ñ¥=«� ñE”Å ÅEøÿWqD„ Àe÷ ÚÂ¥:˜Á%ÿ•‡7 BþþˆÉ ÝÀÓ÷ ~㇂,‚úò5@ ò5ò5 ‡· þ‡÷ þýÅez¢••÷ ¤ÙU�‡É‹É¥=� ù� É‹@÷ €Ù wjÙ‡w¦þ3The following commands are available for this page:1FREEn=ddn: to change free entry 'n' (1-4) to ddn:/RATE=s to change replot rate to 's' seconds to return$ÈUse the following keys to switch display pages:A - Active Task DisplayC - General Cache Statistics DisplayD - Detailed Cache Statistics DisplayH - Help Display (this page)I - I/O Counts DisplayM - Memory DisplayS - System Statistics DisplayT - Task Header Display lets you enter a setup command if any setup commands are available for that display page replots the current display page or exits RMD÷ ÚõÄø ÁfÆR”É‹ý� Äm´÷W –Æö‡Äø÷ Á–ÆR”É‹ý� Äm–÷W vÇö‡Äà÷ ÁvÇR”É‹ý� Ämx÷W #Èö‡ÁÞ¬Â^´B †Ñ¥ ûñÕ€ÿÿ÷¡‡00µª5—3t§3eaek›’”Æ Name Length TI Pri I/O Status flags÷ j÷À¤ùÁdà ÷ 2Е ЕVÁ\àÂ÷ Е ЕBЕLÁ2àÂ÷ Е P” ý‡Áà � � � �  ÷ ïЕKÀFùЕOЕWЕNЕ=Á²¢P”P”P”P”P”P”ÁfÆÀùP”þà• ÷ ¢öÁÞ¬Â^´B †Ñ¥ ûñÕ€ÿÿ÷‡É Task: Partition: Status: Own: I/O: Dpri: Pri: Spri: Len:R0 = R1 = R2 = R3 = R4 = R5 = PC = PS = SP = $DSW = Eflg = LUN File LUN File--- ---- --- ----   ÚÈ $ ÉäÈ(3THE FOLLOWING COMMANDS ARE AVAILABLE FOR THIS PAGE:-RATE=s TO CHANGE REPLOT RATE TO s SECONDS'TASK=t TO DISPLAY HEADER FOR TASK t TO RETURNILLEGAL COMMANDILLEGAL TASK NAMECOMMAND > ÷%ÿÿ„Ù7 ~Ù7 |Ù±‡÷ ÖôÀ÷ÁÐÝ ÷ 2Е ЕVÁÈÝÂ÷ Е ЕBЕLÁžÝÂ÷ Е P” ý‡Á†Ý � � � �  ÷ ŠìЕKÁ¶öÀ€Æ”þá• Á¦öÀ©Æ”þá• Á–öÀèÆ”þá• Á†öÀ/Ç”þá• ÁvöÀkÇ”þá• ÁföÀ›Ç”þá• ÷ ÖóÁÞ¬Â^´B †Ñ¥ ûñÕ€ÿÿ÷÷ŽÜî÷÷ÂÜê÷÷ªÜæ÷÷žÜâ÷¡‡´È V BL Cache Statistics (Detailed)Device Name:Region Name:Region Size:Cache Status:Requests Being Cached:VirtualReadaheadDirectoryLogicalOverlayTotalReadsRead Hit RateRead Load RateRead OverlapExtent Too BigMax Extent SizeWritesWrite Hit RateWrite OverlapTotal I/OPrimary Pool Allocation Failure Rate (as a % of Total I/Os):Cache Pool Allocation Failure Rate (as a % of Total Read I/Os):Read Load Failure Rate (as a % of Cache Load I/Os):Deferred Write Rate (as a % of Total Write I/Os):DÀfƞƫƸÆÅÆÓÆêÆòÆüÆÇÇÇÇ"Ç0Ç?ÇLÇ[ÇkÇrÇ�Ç�Ç™ÇÖÇÈJÈ÷ JõÂfÆÁDÞÀ ÷ "ÂtÆÁ@ÞÀ÷ Â{ÆÁÞÀ÷ R”À ý‡þˆ‚ÉÄz¢ Ý÷ \㇂,‚ú´Â÷  æ ¬Áz¢ñ $Þ &‡õ5@úõ5ö õ5 ðw!*ÙíqÉ1 ñœÅì± ÅìûÞ ‡Æe‡À|ÈCü“”þó• ÿÿöÃxÀÄz¢À ô  “�� ÷ nìÈ•:ÀòÅÁ5ÐÁ üÁÞ¬Â^´B †Ñ¥ ûñÕ€ÿÿ÷¡‡lÇ V BL Cache Statistics (General)Cache Region Name:Region Size:DeviceTotalHitFailLoadTotalHitFailDeferTotalCacheNameReadsRateRateRateWritesRateRateRateI/O OpsUsedDÀfÆ�ưƽÆÄÆÊÆÎÆÓÆØÆÞÆâÆçÆíÆóÆùÆþÆÇ ÇÇÇÇÇ$Ç)Ç1Ç÷ ’öÂfÆÁŒßÀ ÷ "ÂtÆÁˆßÀ÷ Â{ÆÁfßÀ÷ R”À ý‡÷ tß÷ëhß÷È2dßÀ6ÇCü“”þó• ÿÿöÁÞ¬Â^´B †Ñ¥ ûñÕ€ÿÿ÷¡‡<Ç V BL DeviceNameI/O CountI/OPer SecCylindersPer I/OWordsPer SecErrorCount/limitlastavgsofthardDÀfƀƇƌƖƚƢƬƴƺÆÂÆÈƼÀÔÆÔÆÔÆÔÆÔÆÔÆÙÆÙÆÙÆÙÆÙÆÙÆìÀÝÆÝÆÝÆÝÆÝÆÝÆâÆâÆâÆâÆâÆâÆ÷ ÂöÂfÆÁ¼ßÀ ÷ "ÂtÆÁ¸ßÀ÷ Â{ÆÁ–ßÀ÷ R”À ý‡þˆBÈÄz¢Å Ý÷ Ð䇂,‚ú´ÄeÅ ìÂ÷  æ ¬Áz¢Àñ 4Þ :‡õ5@ú õ5ôõ5 ïw!�Úìw!�Úéw!�Úæw!�Úãw!�Úàw!�ÚÝqÉ1 ñœÅì± ÅìûÁeÀ ÅÞ ‡Æe‡ÀèÆCü“”þó• ÿÿöCü“”þó• ÿÿöCü“”þó• ÿÿöÅÃ\ÀÄz¢À ô  “�� ÷ ~íÈ•:ÄeÅ íÁÞ¬Â^´B †Ñ¥ ûñÕ€ÿÿ÷¡‡00µ²5ô4l1DATADATADATADATADATADATADATAÊÇ V BL Total tasks run:Total logons:Shuffler runs:Error sequence:Current tasks:Current users:System pool:Secondary pool:Memory utilization:Checkpoint utilization:ItemTotalLastAvg/SecDirectivesQIOsCPU ticksZero CPU intervalsCheckpointsfÆ@À€ÆFÀ‘ÆJÀŸÆNÀ®ÆRÀ¾ÆVÀÍÆZÀÜÆ^ÀéÆbÀùÆfÀ ÇjÀ%ÇnÀ*ÇpÀ0ÇrÀ5ÇtÀ=ÇvÀHÇ~ÀMdžÀWÇŽÀjÇ–À÷ 4öÂfÆÁ.ßÀ ÷ "ÂtÆÁ*ßÀ÷ Â{ÆÁßÀ÷ R”À ý‡ÅvÇA@ûP”þà• öÁÞ¬Â^´B †Ñ¥ ûñÕ€ÿÿ÷÷lÞÌù¡‡>Ç HÀ–ÆLÀžÆPÀ¦ÆTÀ¾ÆXÀ®Æ\ÀšÆxÀŽÆ€À’ƈÀŠÆ�ÀªÆ˜À¢Æþˆ–È÷lߌÿ÷hß„ÿÿ5‚ß?÷”ß,ÿ;æªúÿ"ÿ¤ú÷¦Øÿ÷¢Øÿ÷žØÿ÷šØÿ÷–Ø ÿ÷’Øÿ÷ŽØÿ÷ŠØÿ÷œØþþ÷˜Øúþ÷”Øöþ÷�Øòþ÷ŒØîþ÷ŒØîþ÷ˆØêþ÷|ØÞþ÷xØÚþ¿:ú7 ØþÀÚÞ· Ðþ*ûÀ²Æ   À²ÆÄÎÞ 4"†0m° óÿ5@¾ÞÁÄÞw–þ÷ÐÞŽþ÷¢Þ�þŬÞ÷ 4÷†þ7„þ·‚þw€þ7 ‚þ7 €þÅlÞ÷ ÷lþ7jþ·hþwfþ    AmB DmC úEñ‡‡Á8þÂ6þÂíœù� Áí”ùÀ^Þ€ `A ÀTÞ÷ îwþ·þÁ þ þÂílù� ÁídùÀ2Þ€ `A À(Þ÷ èíwðý·îý÷ ù$÷–ýù÷’ýù÷Žýù÷Šýù÷zýù÷výù÷Žýù÷Šý ù÷zý ù÷výù÷žýù÷šýþøæxÆæ=ÿˆ÷ øö÷ ýÀfÆÁxÆ÷ ÛÀ ÁfÆÂØöR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ Âö÷ âüÀfÆÁ~ÆÂ÷ üÚÀÁfÆÂžöR¤rœÿÿÿÿòÕ€ÿÿÀ öÅöÆD6Ì 1õ ÷ ¸üÀfÆD÷ üÈ.À ÁfÆBR¤rœÿÿÿÿòÕ€ÿÿÀ öÀ ÁÞÆBR¤rœÿÿÿÿòÕ€ÿÿÀ öÅeÈ÷ .ö5À ÁfÆÑ À üÀfÆÁfü�  ÷ ÀëЕ.Е:ÁTü�  ÷ ¬ëЕ.Е:ÁBü ÷ šëÈ•.ÀÁfÆÂÖõR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ Âõ=ÿ5@,Ü9Àüpd7rü&À ÁfÆÑ À üÀfÆÁæû ÷ <ëЕ.Е:ÁÖû ÷ *ëЕ.Е:� ÷ ëÈ•%ÀÁfÆÂZõR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ Fõ+÷ >ûÀdÂ�ûÃŽû÷ vëCÄ„ûÅ‚û÷ ÁÀfÆ ÷ ¾êÈ•%ÀÁfÆÂõR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ îô7÷ âú÷ Fû ÀfÆÐ•NЕ/ЕAÀdÂ$ûÃ"û÷ ëCÄûÅû÷ œÁÀfÆ ÷ JêÈ•%ÀÁfÆÂ’ôR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ öw÷ ~ôÃÖÆÄŽÆÅÂ÷ TÀ ÁjÆÂ`ôR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ PôÃÖÆÄ’ÆÅÂ÷ À ÁjÆÂ2ôR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ "ôÃÖÆÄŠÆÅ Â÷ èÀ ÁjÆÂôR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ ôóÃÖÆÄªÆÅ(Â÷ ²À ÁjÆÂÖóR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ ÆóÃÖÆÄ¢ÆÅ0Â÷ |À ÁjÆÂ¨óR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ róÃÚÆÄŽÆÅÂ÷ FÀ ÁjÆÂTóR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ DóÃÚÆÄ’ÆÅÂ÷ À ÁjÆÂ&óR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ óÃÚÆÄŠÆÅ$Â÷ ÚÀ ÁjÆÂøòR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ èòÃ򮀻ÆÅ,Â÷ ¤À ÁjÆÂÊòR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ ºòÃÚÆÄ¢ÆÅ4Â÷ nÀ ÁjÆÂœòR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷vøöó÷røòó÷nøòó÷jøîó÷Zøîó÷Vøêó÷nøêó÷jøæó÷Zøæó÷Vøâó÷~øæó÷zøâó7 ®ó‡æCí‚ Bã€÷ Ú&fÀfÆ�Â÷ NÈ.ƒ‚Àd÷ èC÷ ²ÁÀqÆÂ ÷ ˆç‡àÀfÆÁ Е Á üЕ0Е.Е0Е0‡fÀ'÷ äç&À'÷ Úç&@�Е Е Â ÷ 0ç÷ ÷ ð¥ ÿÿð•0ÿÿ…‡�ŽÂ "ð¥ ÿÿ Á Е Е Е Е ‡Â &÷ ææ‡ æ à B A @  ‡E ‡AဠრΠñÖ ‡VÇ   ÈÆ $ ÇêÆ( COMMAND > RMD - Illegal command - ÁßÀßÑ¥,À û€ � ÂìÞCà À wâÞ7àÞƒ é¡·Äÿ‡±‡÷ ÌÞ÷ ¢ö÷ šæ~Æÿˆæ–Æÿˆ÷êÆ®Þ÷ ÿªÞ¡‡÷ –ÿî‡÷ Dú†÷ è÷ „ÿ†¡‡÷ .ø†÷ ‡ÁfÿÀêÆP”þÀ ÀåÒÆ÷ÒÆ°þ7®þæfÆÿˆ±‡�¦¡Ê¥ Ê¥`‚ÊÅ ‰’� ‚ ƒ óC� Šwp±‡÷žÈnþ÷”jþæfÆÿˆ÷®Æ\þ÷XþæfÆÿˆ÷ÒÈJþ÷¤FþæfÆÿˆ÷®Æ8þ÷4þæfÆÿˆ÷É&þ÷²"þæfÆÿˆ÷®Æþ÷þæfÆÿˆÉ¥Rw†ÿɋɥ=� ù� É‹@÷ 8Ú w"Ú‡w^ÿ1The following command is available for this page:/RATE=s to change replot rate to 's' seconds to return00µº5—3t§3eaek›’¼ÆOffline Dismounted þˆˆÇ÷îߢÿ÷êßšÿÅÀz¢ÁÂ÷Îߘÿ÷”ÿ�ÿ<òµ?òµ@A0Š¿rÿ+æ Ùæ Ùæ Ùæ ÙæÙæÙæ�øØæ�öØæ�ñØæ�ïØÿBÿBÿ±•'±•&±•%±•$±±± ±±±ÿÿÿÁe.ÀeÅ »‡ð•1 ,óð•1 ,íÁÚþÂØþÂízú� ÁírúÀl߀ `A Àbß÷ "ïwºþ·¸þæxÆæ=ÿˆ÷ ~ø÷ ÆþÀˆÆÁxÆ÷ �ÜÀ ÁˆÆÂ^øR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ Hø÷ ŒþÀˆÆÁ~ÆÂ÷ „ÜÀÁˆÆÂ$øR¤rœÿÿÿÿòÕ€ÿÿÀ ö ÅÂ÷4þhÀX&À €eð ~¢Bð¥}¢ð¥}¢*ÀˆÆAB÷ ¸È•.À ÁˆÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö/À ÁšÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀ Á¥ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀ Á°ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öõ ,uu u uu u"õDý(õ@ý*tÀ@õ ,.&À €eð ~¢'ð¥}¢#ð¥}¢æ&fÃjÆDÄeÅe÷ B…„ƒÀÁŽÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀÁ°ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö¤À@õ ,.&À €eð ~¢'ð¥}¢#ð¥}¢æ&fÃjÆDÄe Åe÷ ¼…„ƒÀ ÁŒÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀ Á°ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö€ÀVõ ,D&À €eð ~¢=ð¥}¢9ð¥}¢5ÁüÂüBí*� Aí(À”Ü€ `A ÀŠÜ÷ Jìwæû·äûæ&fÃnÆDÄeÅe÷ …„ƒÀÁŽÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀÁ°ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö°À@õ ,.&À €eð ~¢'ð¥}¢#ð¥}¢æ&fÃnÆDÄe Åe÷ „…„ƒÀ ÁŒÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀ Á°ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öŒÀVõ ,D&À €eð ~¢=ð¥}¢9ð¥}¢5~¢Àm ÛÈ5@,ABBí� Aíw®ú·¬úæ&fÃnÆDÄeÅe÷ Ò…„ƒÀ ÁŒÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀ Á°ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö˜ÀVõ ,D&À €eð ~¢=ð¥}¢9ð¥}¢5~¢ÀmXÚÈ5@,ABBí � Aíwüù·úùæ&fÃnÆDÄeÅe ÷ …„ƒÀ ÁŒÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀ Á°ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÔÀZ&À €eð ~¢Dð¥}¢@ð¥}¢<~¢Àm¬ÙÈ53ÿµÀÙ/÷• rùu­%$‡÷•*dù÷• _ùÀŠÆ AÝ% ÷ éЕ/ AÝ$ ÷ ðèÀ ÁˆÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀ Á°ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öàÀZ&À €eð ~¢Dð¥}¢@ð¥}¢<~¢ÀmòØÈ53ÿµÙ/÷• ¸øu­'&‡÷•*ªø÷• ¥øÀŠÆ AÝ' ÷ HèЕ/ AÝ& ÷ 6èÀ ÁˆÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀ Á°ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö&À €eð‹}¢õ,ÄeÅe.÷ øwÒùÀÁÂqqq qqqÁe.À ê÷Â÷fó÷¾÷bó‡æCí‚ Bã€÷ Ú&fÀˆÆ�Â÷ NÈ.ƒ‚Àd÷ ÄçC÷ ²ÁÀ“ÆÂ ÷ <ç‡àÀˆÆÁ Е Á üЕ0Е.Е0Е0‡fÀ'÷ ˜ç&À'÷ Žç&@�Е Е Â ÷ äæ÷ ÷ ð¥ ÿÿð•0ÿÿ…‡�ŽÂ "ð¥ ÿÿ Á Е Е Е Е ‡Â &÷ 𿇠æ à B A @  ‡E ‡AဠრΠñÖ ‡VÇ   ÈÆ $ ÇêÆ( COMMAND > RMD - Illegal command - ÁßÀßÑ¥,À û€ � ÂìÞCà À wâÞ7àÞƒ é¡·Äÿ‡±‡÷ ÌÞ÷ ¢ö÷ šæ~Æÿˆæ–Æÿˆ÷êÆ®Þ÷ ÿªÞ¡‡÷ –ÿî‡÷ Dú†÷ è÷ „ÿ†¡‡÷ .ø†÷ ‡ÁfÿÀêÆP”þÀ ÀåÒÆ÷ÒÆ°þ7®þæfÆÿˆ±‡�¦¡Ê¥ Ê¥`‚ÊÅ ‰’� ‚ ƒ óC� Šw‚±‡÷RÉnþ÷HjþæfÆÿˆ÷®Æ\þ÷XþæfÆÿˆ÷ˆÉJþ÷ZFþæfÆÿˆ÷ÀÉ8þ÷€4þæfÆÿˆ÷®Æ&þ÷"þæfÆÿˆ÷òÉþ÷ŽþæfÆÿˆ÷®Æþ÷þýæfÆÿˆÉ¥DÉ¥RPwnÿÉ‹µÉ¥1‚É¥6‡ñ¥=«� ñE”ÅEøÿD„ Àe÷ ÚÂ¥:›Á%ÿ˜‡7 HþþˆþÈ ÝÀÓ÷ „ã ‡‚,‚úò5@‡· þ‡÷ þ$Å fWqÅez¢••÷ ²ÙU�…Wq.5 <‡ɋÉ¥=� ù� É‹@÷ „Ù wnÙ‡wªþ3The following commands are available for this page:5DEVICEn=ddn: to change device entry 'n' (1-6) to ddn:/RATE=s to change replot rate to 's' seconds to return,ÇTotal (No such cache region) . disk blocks)ÅŠÆÄ  Ä ýÄ Â7 ,ÿçŊÆ÷\ßÿþˆ¦Çöÿ œß"‡ò5€ò5ö ÷ðþìþ· öþ´´‚·”ß¿ÖþÂhØ•ÕdØ÷6 ‡7Äþ÷ÿÿpß÷¸þ÷ß®þ´Áå€ÿ5 þÁå€� ÁE€� � w˜þÁÃfÂ@  ýô.ß÷ è÷ pþÄ ÂÖ wØÅ\þÅåÅ Å À´Â þˆXÈ<þõ-Ð׊Æõ-Ê×ŒÆ ÿ&þ&þæ,ÿ pÞ6 ö‡À Ö wÊþ00µÂ5ô4l1DATADATADATADATADATADATADATA&´¶ƒ�Àà÷ Ðß �Ü@`4¸€Âäý ÷ÞÐýþˆäÈ?ÄýÁˆ×¿¸ýÿ5¶ý Âe€¿ªýCœÄ`AúÁå CœÄ`Aø6‡7,úÅ Â@ÀeAÁeä÷ Æ@ÀeAÁeè÷ ¶@Àe,AÁeð÷ ¦@ÀeTAÁeÌ÷ –@Àe@AÁeÈ÷ †AÁeìIÌqÎImÈq qmÊQm¨I Imª@ÀehAÁeô÷ N@Àe|AÁeø÷ >@Àe�AÁeü÷ .@ÀeAÁehBÂeÐ÷ H@ÀeÐAÁe÷ u°u²A÷ ÊE÷ ¬Åeä�ÂQ ýNwþæzÆæ=ÿˆ÷ ÚüÀÊÆÁzÆ÷ bÚÀ ÁÊÆÂ0öR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ ¦üÀÊÆÁ€ÆÂ÷ \ÚÀÁÊÆÂüõR¤rœÿÿÿÿòÕ€ÿÿÀ öÃöÀÊÆÁ¶Ü÷ lÙÁ°Ü÷ dÙÀÁÊÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÅ ÂÃÞõ÷%Îû47 ÈûÀÊÆÁÇÂP” ýÀÊÆA´Â0÷ vëЕ Е(Á¤û (÷ bëÁÇÂP” ýÀÁÊÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀÁêÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ ÷ ²ÄÃÁ ÂÁeäà  1Àe( bq 1l ö$Q$à éA÷ "E÷ Ò÷ dÄÄíêú‡÷ ¤÷ RÄ ú‡CèBêEäDæ÷ ²ñÆúºCìBîEäDæ÷ ˜ñ¬ú¾CðBòEäDæ÷ ~ñ’ú¼CøBúEôDö÷ dñxúÀCüBþEôDö÷ Jñ^úÂCBEôDö÷ 0ñDúÄCB Å:ú ÷ ñ,úƇÃ"úÃezÀÃE÷ ú@ÀÁäÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö2ÃðùÃezÀÃ,÷ àù'ÀÊÆÁÇÂP” ýÀÊÆP�¶P�·A¸Â÷ „éЕ:ÀÁÊÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ :ÃŒùÃe|Àà ÷ |ùBäAæ÷ ž÷ 6ÃhùÃe~Àà ÷ XùAº÷ °÷ ÖÃHùÃe€Àà ÷ 8ùA¾÷ �÷ ¶Ã(ùÃe‚Àà ÷ ùA¼÷ p÷ –ÃùÃe„Àà ÷ øøBôAö÷ ÷ ²ÃäøÃe†Àà ÷ ÔøAÀ÷ ,÷ RÃÄøÃeˆÀà ÷ ´øAÂ÷ ÷ 2äøÃeŠÀà ÷ ”øAÄ÷ ì÷ ÄøÃeŒÀà ÷ tøBA÷ –÷ .Ã`øÃeŽÀà ÷ PøAÆ÷ ¨÷ ·Ã>øÃezÀÃ÷ ÜÃ.øÃe|ÀÃ÷ ìÃøÃe~ÀÃ÷ œÃøÃe€ÀÃ÷ ŒÃþ÷Ãe‚ÀÃ÷ |Ãî÷Ãe„ÀÃ÷ ¬ÃÞ÷Ãe†ÀÃ÷ \ÃÎ÷ÃeˆÀÃ÷ Lþ÷ÃeŠÀÃ÷ <î÷ÃeŒÀÃ÷ lÞ÷ÃeŽÀÃ÷ ‡· Š÷À†÷ÀåÁ÷ VÙwx÷‡ÀÁÇÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡ÀÁÇÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡À ÁÇÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡&f7 ÷AQ÷ *&fÁÀd÷ ÐØwôöƒ‚Àd÷ $çC÷ ÷`Üö�€‡ÀÊÆ÷ vЕ.À ÁÊÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡æ& ÀÊÆÂЕ  üÀÊÆÂ ÷ PæÖ Е%Е.ÀÁÊÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡fÀ'÷ ¦æ&À'÷ œæ&@�Е Е Â ÷ òå÷ ÷ ð¥ ÿÿð•0ÿÿ…‡�ŽÂ "ð¥ ÿÿ Á Е Е Е Е ‡Â &÷ ¨å‡ æ à B A @  ‡E ‡AဠრΠñÖ ‡ 1 dq 1d dq 1d dq 1d dq 1d‡÷ ÷ ÷ ÷ 2RdJ Rd‡VÇ   ÈÆ $ ÇêÆ( COMMAND > RMD - Illegal command - ÁßÀßÑ¥,À û€ � ÂìÞCà À wâÞ7àÞƒ é¡·Äÿ‡±‡÷ ÌÞ÷ ¢ö÷ šæ~Æÿˆæ–Æÿˆ÷êÆ®Þ÷ ÿªÞ¡‡÷ –ÿî‡÷ Dú†÷ è÷ „ÿ†¡‡÷ .ø†÷ ‡ÁfÿÀêÆP”þÀ ÀåÒÆ÷ÒÆ°þ7®þæfÆÿˆ±‡�¦¡Ê¥ Ê¥`‚ÊÅ ‰’� ‚ ƒ óC� Šw‚±‡÷4Énþ÷*jþæfÆÿˆ÷®Æ\þ÷XþæfÆÿˆ÷jÉJþ÷<FþæfÆÿˆ÷œÉ8þ÷\4þæfÆÿˆ÷®Æ&þ÷"þæfÆÿˆ÷ÎÉþ÷jþæfÆÿˆ÷®Æþ÷þýæfÆÿˆÉ¥Rwtÿñ¥Eñ¥A:w`ÿÉ‹®Ñ¥=û@ЋþÀ @àÀ%£‡@Á ÷ BÚD‡Á÷ 6ÚE7 Dþ÷ÿÿJÞç sþˆÉÿ Þ‡ò5€ò5· þ‡÷ þ‡É‹É¥=� ù� É‹@÷ ¢Ù wŒÙ‡wÈþ3The following commands are available for this page:0REGION=name to change the displayed cache region0RATE=s to change replot rate to 's' seconds to returnôÆ(Offline) (Dismounted)(Not Cached)(No UCB[X]) EnableActiveDefer Àz¢Á ÂþˆÄÇ÷¦ßbÿ÷^ÿZÿMòµMòµ@M0Š¿<ÿÿ4ÿ4ÿ;÷ öØ1÷µ@ëØ-ñ�åØ<ÃàØñ>ñ@ñBñ�ÒØDñ�ÍØFñ�ÈØHñ�ÃØJñ�¾ØLÀ´ÁªØÂ Ã^-Ä ÂÿÐþÐþÿ ßÿÄþÄþð• ð•ð•ð•‡Å Â÷ ²Úwø ÷‹§Úwî @ÀeAÁeø÷ J@ÀeAÁeü÷ :@Àe,AÁe÷ *@ÀeTAÁe÷ @Àe@AÁe÷ @ÀehAÁe÷ ú@Àe|AÁe÷ ê@Àe�AÁe÷ Ú@ÀeA00µÊ5—3t§3eaek›’ÁehBÂe$÷ ô@Àe$AÁe8÷ ´À^ÃAÁe¨ÄÃ¥$Ú•Ò Ã øÀZÃA÷‹Dý÷‹CýCBEDð°p0÷ öñŽý´ð-ˆý´·Š2ýð|ý´÷‹ýü÷‹üüCBED ð°p0 ÷ ®ñFý¶ð-@ý¶·Šëüð4ý¶÷‹¶ü÷‹µüC B"E Dð °"p 0÷ fñþü¸ð-øü¸·Š¤üðìü¸÷‹oü÷‹nüC$B&EDð$°&p0÷ ñ¶üºð-°üº·Š]üð¤üº÷‹(ü÷‹'üC(B*EDð(°*p0÷ Öñnü¼ð-hü¼·Šüð\ü¼÷‹*ü÷‹%üCüBþEøDúðü°þpø0ú÷ Žñ&üð- ü·Šîûðü÷‹”û÷‹˜ûC,B.EDð,°.p0÷ FñÞû¾ð-Øû¾·Š‡ûðÌû¾÷‹Mû÷‹QûC0B2ED ð0°2p0 ÷ þñ–ûÀð-�ûÀ·Š@ûð„ûÀ÷‹û÷‹ ûC4B6E Dð4°6p 0÷ ¶ñNûÂð-Hû·Šùúð<ûÂ÷‹¿ú÷‹ÃúC8B:EDð8°:p0÷ nñûÄð-ûķвúðôúÄ÷‹xú÷‹|úC<B>EDð<°>p0÷ &ñ¾úÆð-¸úÆ·Škúð¬úÆ÷‹zú÷‹wúCBEøDúð°pø0ú÷ Þñvúð-pú·Š@úðdú÷‹äù÷‹òùCTBVEDðT°Vp0÷ –ñ.úÒð-(úÒ·ŠáùðúÒ÷‹�ù÷‹«ùCXBZED ðX°Zp0 ÷ NñæùÔð-àùÔ·ŠšùðÔùÔ÷‹Vù÷‹dùC\B^E Dð\°^p 0÷ ñžùÖð-˜ùÖ·ŠSùðŒùÖ÷‹ù÷‹ùC`BbEDð`°bp0÷ ¾ñVùØð-PùØ·Š ùðDùØ÷‹Èø÷‹ÖøCdBfEDðd°fp0÷ vñùÚð-ùÚ·ŠÅøðüøÚ÷‹Êø÷‹ËøCBEøDúð°pø0ú÷ .ñÆøð-Àø·Š”øð´ø÷‹4ø÷‹=øC@BBEDð@°Bp0÷ æñ~øÈð-xøÈ·Š,øðløÈ÷‹í÷÷‹ö÷CDBFED ðD°Fp0 ÷ žñ6øÊð-0øÊ·Šå÷ð$øÊ÷‹¦÷÷‹¯÷CHBJE DðH°Jp 0÷ Vñî÷Ìð-è÷Ì·Šž÷ðÜ÷Ì÷‹_÷÷‹h÷CLBNEDðL°Np0÷ ñ¦÷Îð- ÷ηŠW÷ð”÷Î÷‹÷÷‹!÷CPBREDðP°Rp0÷ Æñ^÷Ðð-X÷зŠ÷ðL÷Ð÷‹÷÷‹÷CB EøDúð° pø0ú÷ ~ñ÷ ð-÷ ·Šâöð÷ ÷‹�ö÷‹œöC|B~EhDjð|°~ph0j÷ 6ñÎöÜð-ÈöܷІöð¼öÜ÷‹Wö÷‹VöC„B†EpDrð„°†pp0r÷ îñ†öàð-€öà·Š@öðtöà÷‹ö÷‹öCˆBŠEtDvðˆ°Špt0v÷ ¦ñ>öâð-8öâ·Šùõð,öâ÷‹ö÷‹þõCBEDð°p0÷ ^ñöõð-ðõ·ŠÇõðäõ÷‹}õ÷‹�õC�B’EhDjð�°’ph0j÷ ñ®õæð-¨õæ·Škõðœõæ÷‹7õ÷‹;õC˜BšEpDr𘰚pp0r÷ Îñfõêð-`õê·Š%õðTõê÷‹ðô÷‹ôôCœBžEtDv𜰞pt0v÷ †ñõìð-õì·ŠÞôð õì÷‹ãô÷‹àôCB EDð° p0÷ >ñÖô"ð-Ðô"·Š©ôðÄô"÷‹¥ô÷‹fôC¤B¦E8D:𤰦p80:÷ ö ñŽôðð-ˆôð·ŠPôð|ôð÷‹Jô÷‹ôC¨BªEøDú𨰪pø0ú÷ ® ñFôòð-@ôò·Š ôð4ôò÷‹ ô÷‹ÙóC°B²EDð°°²p0÷ f ñþóöð-øóö·ŠÃóðìóö÷‹½ó÷‹�óC¬B®ED𬰮p0÷  ñ¶óôð-°óô·Šzóð¤óôænÆæ=ÿˆ÷ hí÷ ¦óÀ~ÆÁnÆ÷ zÑÀ Á~ÆÂHíR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ 2í÷ lóÀ~ÆÁtÆÂ÷ nÑÀÁ~ÆÂíR¤rœÿÿÿÿòÕ€ÿÿÀ öÃ.ía÷ ,Ï ÀÝ#ÏÀ¥À¥6À¥CÀ¥ À ÁÖÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö?À Á¶ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö/À ÁªÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀ Á’ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀ ÁžÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÅ ÂÄZÃ÷ bÎ÷‹[Î7 Bò÷:òÃHì5÷ 0ò#÷‹ò/7ŠòÀ~ÆA>t>÷ ‚ÏA@t@÷ vÏÀÁ~ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀÁÖÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÃÚë:÷ Àñ(÷‹¦ñ47Š ñÀ~ÆÂÖÆÁ�”Á ýÀ~ÆABtBÂ0÷ báÀÁ~ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀÁÖÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÃbëV÷ FñD÷‹*ñPÀ~ÆÂÖÆÁ�”Á ýÀ~ÆA�<Á5€ÂÂÆ�”þà• Á5@Á5€Е,Е ÂÉÆ�”þà• Á5 Ð,ÂÐÆ�”þà• ÀÁ~ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀÁÖÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öòêr÷ ”ð`÷‹xðl7ŠrðÀ~ÆÂÖÆÁ�”Á ýÀ~ÆA�<t�<Á5ЕDЕiЕrЕ,Á5ЕOЕvЕrЕ,Á5ЕVЕiЕrЕ,Á5ЕLЕoЕgЕ,Á5ЕRЕdЕhЕ,Áµà• ÀÁ~ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀÁÖÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÃÊé÷ ªï÷‹,ï7Š&ïBA´t÷ 2 ÷ ÊÜé÷ zï÷‹ýî7Š÷îBA ´t ÷  ÷ šÃné÷ Jï÷‹Îî7ŠÈîB A´ t÷ Ò÷ jÃ@é÷ ï÷‹Ÿî7Š™îBA´t÷ ¢÷ :Ãé÷ êî÷‹pî7ŠjîBA´t÷ r÷ Ãäè÷ ºî÷‹Šî7Š„îBøAú´øtú÷ B÷ Úöè÷ Šî ÷‹8î 7Š2îA´÷ P÷ –Ôè÷ fî ÷‹î 7ŠîA¶÷ ,÷ rÃrè÷ Bî ÷‹òí 7ŠìíA¸÷ ÷ NÃPè÷ î ÷‹Ïí 7ŠÉíAº÷ ä÷ 00µÒ5ô4l1DATADATADATADATADATADATADATA*Ã.è÷ úí ÷‹¬í 7ЦíA¼÷ À÷ à è÷ Öí ÷‹¨í 7Š¢íA÷ œ÷ âÃêç÷ ²í ÷‹eí 7Š_íA¾÷ x÷ ¾ÃÈç÷ Ží ÷‹Bí 7Š<íAÀ÷ T÷ šÃ¦ç÷ jí ÷‹í 7ŠíAÂ÷ 0÷ vÄç÷ Fí ÷‹üì 7ŠöìAÄ÷ ÷ RÃbç÷ "í ÷‹Ùì 7ŠÓìAÆ÷ è÷ .Ã@ç÷ þì ÷‹Òì 7ŠÌìA÷ Ä÷ Ãç÷ Úì ÷‹’ì 7ŠŒìAÈ÷  ÷ æÃüæ÷ ¶ì ÷‹oì 7ŠiìAÊ÷ |÷ ÂÃÚæ÷ ’ì ÷‹Lì 7ŠFìAÌ÷ X÷ žÃ¸æ÷ nì ÷‹)ì 7Š#ìAÎ÷ 4÷ zÖæ÷ Jì ÷‹ì 7ŠìAÐ÷ ÷ VÃtæ÷ &ì ÷‹üë 7ŠöëA ÷ ì÷ 2ÃRæ÷ ì ÷‹¿ë 7йëAÒ÷ È÷ Ã0æ÷ Þë ÷‹œë 7Š–ëAÔ÷ ¤÷ êÃæ÷ ºë ÷‹yë 7ŠsëAÖ÷ €÷ ÆÃìå÷ –ë ÷‹Vë 7ŠPëAØ÷ \÷ ¢ÃÊå÷ rë ÷‹3ë 7Š-ëAÚ÷ 8÷ ~èå÷ Në ÷‹&ë 7Š ëA÷ ÷ ZÆå÷ *ë ÷‹ë 7Š ëADtD÷ æ÷ 2Ã`å÷ ë ÷‹êê 7ŠäêAFtF÷ ¾÷ Ã:å÷ Úê ÷‹Ãê 7нêAHtH÷ –÷ âÃå÷ ²ê ÷‹œê 7Š–êAJtJ÷ n÷ ºÃîä÷ Šê ÷‹uê 7ŠoêALtL÷ F÷ ’ÃÈä÷ bê÷‹ýé7Š÷éBhAj´htj÷ ê÷ ‚Úä÷ 2ê÷‹Ïé7ŠÉéBpAr´ptr÷ º÷ RÃlä÷ ê÷‹ é7ŠšéBtAv´ttv÷ Š÷ "Ã>ä÷ Òé÷‹«é7Š¥éBA´t÷ Z÷ òÃä÷ ¢é ÷‹dé 7Š^éAÜ÷ h÷ ®Ãîã÷ ~é ÷‹Bé 7Š<éAà÷ D÷ ŠÃÌã÷ Zé ÷‹é 7ŠéAâ÷ ÷ fêã÷ 6é ÷‹é 7Š éA÷ ü÷ BÃ�ã÷ é÷‹ðè7ŠêèB$A&´$t&÷ š÷ 2Ãbã÷ âè÷‹Áè7Š»èB(A*´(t*÷ j÷ Ã4ã÷ ²è÷‹’è7ŠŒèB,A.´,t.÷ :÷ ÒÃã÷ ‚è÷‹cè7Š]èB0A2´0t2÷ ÷ ¢ÃØâ÷ Rè÷‹4è7Š.èB4A6´4t6÷ Ú÷ rêâ÷ "è÷‹è7ŠÿçB8A:´8t:÷ ª÷ BÃ|â÷ òç ÷‹¾ç 7ЏçAð÷ ¸÷ þÃZâ÷ Îç ÷‹›ç 7Š•çAò÷ ”÷ ÚÃ8â÷ ªç ÷‹xç 7ŠrçAô÷ p÷ ¶Ãâ÷ †ç ÷‹Uç 7ŠOçAö÷ L÷ ’ÃØá÷ bç ÷‹)ç 7Š#çAæ÷ (÷ nöá÷ >ç ÷‹ç 7ŠçAê÷ ÷ JÔá÷ ç ÷‹äæ 7ŠÞæAì÷ à÷ &Ãrá÷ öæ ÷‹Óæ 7ŠÍæA"÷ ¼÷ ‡ÀÁÖÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡À ÁÖÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡&f7 ”æAQ÷ *&fÁÀd÷ \Èwx惂Àd÷ °ÖC÷ ÷``æ�€‡À~Æ÷ vЕ.À Á~ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡æ& À~ÆÂЕ  üÀ~ÆÂ ÷ ÜÕÖ Е%Е.ÀÁ~ÆÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡fÀ'÷ 2Ö&À'÷ (Ö&@�Е Е Â ÷ ~Õ÷ ÷ ð¥ ÿÿð•0ÿÿ…‡�ŽÂ "ð¥ ÿÿ Á Е Е Е Е ‡Â &÷ 4Õ‡ æ à B A @  ‡E ‡AဠრΠñÖ ‡ 1 dq 1d dq 1d dq 1d dq 1d‡÷ ÷ ÷ ÷ 2RdJ Rd‡VÇ   ÈÆ $ ÇêÆ( COMMAND > RMD - Illegal command - ÁßÀßÑ¥,À û€ � ÂìÞCà À wâÞ7àÞƒ é¡·Äÿ‡±‡÷ ÌÞ÷ ¢ö÷ šæ~Æÿˆæ–Æÿˆ÷êÆ®Þ÷ ÿªÞ¡‡÷ –ÿî‡÷ Dú†÷ è÷ „ÿ†¡‡÷ .ø†÷ ‡ÁfÿÀêÆP”þÀ ÀåÒÆ÷ÒÆ°þ7®þæfÆÿˆ±‡�¦¡Ê¥ Ê¥`‚ÊÅ ‰’� ‚ ƒ óC� Šw‚±‡÷BÉnþ÷8jþæfÆÿˆ÷®Æ\þ÷XþæfÆÿˆ÷xÉJþ÷JFþæfÆÿˆ÷¤É8þ÷d4þæfÆÿˆ÷®Æ&þ÷"þæfÆÿˆ÷ØÉþ÷tþæfÆÿˆ÷®Æþ÷þýæfÆÿˆÉ¥DÉ¥RHwnÿÉ‹µÑ¥=ûÉ‹° DÀe÷ $ÚÂ¥:¦Á%ÿ£‡7 ^þþˆðÈ ÝÀÓ÷ šã‡‚,‚úò5@ò5‡· (þ‡÷ "þ#fWqÅez¢••÷ ÂÙU�…Wq.5 <‡ɋÉ¥=� ù� É‹@÷ ”Ù w~Ù‡wºþ3The following commands are available for this page:*DEVICE=ddn: to change device entry to ddn:1RATE=s to change replot rate to 's' seconds to returnøÇ\ÀöÌÚÍ^ÀöÌÚÍ`ÀöÌÚÍbÀöÌ’ÎfÀÍÎhÀÍÎjÀÍÎlÀÍÎnÀÍÎpÀÍÎrÀÍÎtÀÍÎvÀÍÎxÀÍ’ÎzÀÍÎ|ÀÍÎTask not in systemTask inactive or out of memoryNo task specifiedNone÷ ÷ 6‡ÅÈÆþˆ(ÉÞ¢ÿ êÞ† ‡ð5€Õÿÿ ‡&ô5ÀÕÿÿ v7ÿ ÕÕœ00µÚ5—3t§3eaek›’œ œ? ’ùàÄ7(ÿQ Õ‹ Ü�0Á`U:Ã%À‚Ãå ÕÕÕÕÕÕÕÕ$Á%À‚Áå ñ &&A l<æ(ù$ùÕ& ¿ù <Í%†ÍCÄe>ÀE÷ † Ô à ó‡7 àø‡À/Üø‡æ`Çæ=ÿˆ÷ þö÷ ,þÀpÇÁ`Ç÷ ÛÀ ÁpÇÂÞöR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ Èö÷ òýÀpÇÁfÇÂ÷ ÛÀÁpǤöR¤rœÿÿÿÿòÕ€ÿÿÀ öÀpÇÁâØ÷ ÚÁÜØ÷ ÚÀÁpÇ€öR¤rœÿÿÿÿòÕ€ÿÿÀ öÅÈÆÍ 5÷ Rö"ÀpÇÁ®Ç÷ œØÁàÇÃÒ à üP”þÀ(ÁpÇ öR¤rœÿÿÿÿòÕ€ÿÿÀ öÀpÇÁÐ Á ü÷ ¾÷ ê÷ w¨ÀpÇÁÒ Á ü÷ ÖõÀ(ÁpÇÂÈõR¤rœÿÿÿÿòÕ€ÿÿÀ öÀpÇAÁ%ÿÿwŒ÷ 2ÙA÷ ,Ù÷ ¦õÀÁpǘõR¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ ‚õÅe(ÀpÇÁÒ Á üÂjÏA÷ A�ÁE*÷ A÷ À&ÁpÇÂ@õR¤rœÿÿÿÿòÕ€ÿÿÀ ö-÷ õÀpÇÁÁÇÃÒ à üP”þÀ(ÁpÇÂìôR¤rœÿÿÿÿòÕ€ÿÿÀ öÀpÇÁÐ Á ü÷ º÷ Þ=÷ ²÷ î÷ ü.÷ ,C6Ä~ÀÁNûÁà� wjöÀpÇÒ Ò  ÷ RêЕ. ÀÁpÇ‚R¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ ðà Ù ÀpÇÁÐ Á ü÷ †÷ ˜‡ÄFô÷ ÷ @ôÀ&ÁpÇÂ2ôR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡÷ ôÀÁpÇ ôR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡÷ üóÀÁpÇÂîóR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡ÃfÆÄÂÓ úÊ ø‡æÄ~ÀÀÁpÇÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀ#ÁpÇÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÎ ÜÖ ‡Ä ÀÁpÇR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡Ä ÀÁpÇR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡ÀpÇÈ 7(ú7&úC÷ Äô÷ óÀÁpÇÂòòR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡ÀpÇÈ 7èù7æùAÂ÷ ŠèЕ0Е0÷ ÂòÀÁpÇ´òR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡ÃfÆÄÓ ÂÊ ù‡ÀpÇ÷ Žù AÕ ÷ &èЕ.Ä ÀÁpÇR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡ ArE`ÀpÇAÂ÷ òçÄ ÀÁpÇR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡ÀpÇ÷ ù÷ ùA• ÷ °çЕ.Ä ÀÁpÇR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡ ArE`ÀpÇ÷ Ìø÷ ÈøA ÷ fçЕ.Ä ÀÁpÇR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡w€øw~ø7|ø?w ®çÀpÇÁÒ Á üÃ\ø÷ ówó·óÁJøÂHøDà ÒÅ-Ó ùÅ Í õ‡ÂòÇ�”þà• À#ÁpÇÂøR¤rœÿÿÿÿòÕ€ÿÿÀ ö‡-EXERDNMSGCIPRUNBLKCKRASTDST-CHKREXSEFTIOAFFHLTABOSTPASTPSPNASPNWFRAWFRACP-PMDREMPRVMCRSLVCLIRSTNSDCALROVNETMPCCMD&æÃÁ €Ð• „”Á ü€‘úÁ à 󃄇Directive error: FID = SY 4ÐDЄÐû :Ðÿ8Ðw æAA,ûñ5@÷ ÷ Š¡±‡þˆ4Ñ‚Â53 · Fñ/‡Â/Bñ‚Â% )‚Â%À‚Ãe€Âå øAñ5€Cl2A&ñ5ÀCl æñÿüð·.ÿ·*ÿ·œ&ÿ¿æð‡7 ÿ7 ÿ7 ÿ‡¦ÂÿÂ]ÿÂ]ÿw¼÷Æðÿ÷Âðÿ÷ êþUædÐÿˆ0‡ælÐÿˆ,‡÷‹Äþ5�ÁÄþÁ]ÆþÁ]Äþ.Á¶þ÷ PÒÁ°þ÷ HÒÁªþ÷ @Òॠý€ Е.Á˜þ÷ ,Òॠý€ Е;Á†þ ÷ >ä!ÂJÐ�”þÁ�V. ÷ DäЕ.Â\Ð�”þð•(ÿÿÁVþ ÷ ,äЕ,ÁJþ ÷ äЕ)‚‡ŽÐVÇ   ÈÆ $ ÇêÆ( COMMAND > RMD - Illegal command - ÁßÀßÑ¥,À û€ � ÂìÞCà À wâÞ7àÞƒ é¡·Äÿ‡±‡÷ ÌÞ÷ ¢ö÷ šæ~Æÿˆæ–Æÿˆ÷êÆ®Þ÷ ÿªÞ¡‡÷ –ÿî‡÷ Dú†÷ è÷ „ÿ†¡‡÷ .ø†÷ ‡ÁfÿÀêÆP”þÀ ÀåÒÆ÷ÒÆ°þ7®þæfÆÿˆ±‡�¦¡Ê¥ Ê¥`‚ÊÅ ‰’� ‚ ƒ óC� Šw”±‡÷øÈnþ÷îjþæfÆÿˆ÷®Æ\þ÷XþæfÆÿˆ÷.ÉJþ÷FþæfÆÿˆ÷®Æ8þ÷4þæfÆÿˆ÷`É&þ÷"þæfÆÿˆ÷®Æþ÷þæfÆÿˆ÷ŒÉþ÷þýæfÆÿˆ÷®Æðý÷ìýæfÆÿˆÉ¥RÉ¥T¯É‹­É¥=� ù� É‹¥@÷ Ú‹ wúهɋ›É¥=� ù� É‹“@Á÷ $ÚÁ Œw¸ÙÁ÷ Úw®Ù¡‡3The following commands are available for this page:/RATE=s to change replot rate to 's' seconds)TASK=t to display header for task 't' to return&ÈÄfÆÁ÷ ÚùÁ ü÷ ÷ ЇÅfÆþˆÆÈÄjÞ÷ `Úô-ZÚ0ô -�7­00µâ5ô4l1DATADATADATADATADATADATADATA<Ú)‚& •ƒÕ€ÀìÁÿ 4ÞÀl���ŠW!ÎÇ*ô *Ä ‡æÐÇæ=ÿˆ÷ p÷÷ ÿÀàÇÁÐÇ÷ |ÛÀ ÁàÇÂP÷R¤rœÿÿÿÿòÕ€ÿÿÀ ö÷ :÷÷ ÐþÀàÇÁÖÇÂ÷ pÛÀÁàÇÂ÷R¤rœÿÿÿÿòÕ€ÿÿÀ öÅfÆÄJÀÍ !:Á†Ä%^´ ƒÄ%Þ¬ †Ô¥ ÷ô• ÿÿôÕ€ÿÿð‡ÀàÇA÷ PÚA÷ JÚÀÁàÇÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀàÇÒ Ò Ò AÁ ÈÂS” ýÂ÷ DìЕ0Е0ÀÁàÇÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀàÇP•P•Ò Ò  AÕÂ÷ ìÀÁàÇÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀàÇÒ Ò  AÕ ÷ ¸ëЕ.ÀÁàÇÂR¤rœÿÿÿÿòÕ€ÿÿÀ öÀàÇÒ Ò  AÕ ÷ zëЕ.ÀÁàÇÂR¤rœÿÿÿÿòÕ€ÿÿÀ ö… ÀàÇÁÒ Á üÂËA÷ A�ÁE*÷ A÷ À'ÁàÇÂR¤rœÿÿÿÿòÕ€ÿÿÀ öw8þ-EXE RDN MSG CIP RUN BLK CKR AST DST -CHK REX SEF TIO AFF HLT ABO STPA STP SPNA SPN WFRA WFR ACP -PMD REM PRV MCR SLV CLI RST NSD CAL ROV NET MPC CMD &æÃ„”Á ü€‘úÁ à ÷ƒ„‡VÇ   ÈÆ $ ÇêÆ( COMMAND > RMD - Illegal command - ÁßÀßÑ¥,À û€ � ÂìÞCà À wâÞ7àÞƒ é¡·Äÿ‡±‡÷ ÌÞ÷ ¢ö÷ šæ~Æÿˆæ–Æÿˆ÷êÆ®Þ÷ ÿªÞ¡‡÷ –ÿî‡÷ Dú†÷ è÷ „ÿ†¡‡÷ .ø†÷ ‡ÁfÿÀêÆP”þÀ ÀåÒÆ÷ÒÆ°þ7®þæfÆÿˆ±‡�¦¡Ê¥ Ê¥`‚ÊÅ ‰’� ‚ ƒ óC� Šw¨±‡÷Ênþ÷ jþæfÆÿˆ÷®Æ\þ÷XþæfÆÿˆ÷LÊJþ÷FþæfÆÿˆ÷~Ê8þ÷>4þæfÆÿˆ÷¶Ê&þ÷d"þæfÆÿˆ÷öÊþ÷’þæfÆÿˆ÷®Æþ÷þýæfÆÿˆ÷"Ëðý÷šìýæfÆÿˆ÷®ÆÞý÷ÚýæfÆÿˆ‡É¥R É¥PÉ¥T(É¥OMŸÉ‹�É¥=� ù� É‹•@÷ ðÙ‹�wÚهɋ‹É¥=� ù� É‹ƒ@÷ ÌÙ‹)w� Ù‡É‹$É¥=� ù� É‹@Á÷ àÙ†Á wpÙÁ÷ Ìنȋ w^Ù÷THÖÜ÷Ž©Ò܇w¦þÉ‹üÑ¥=ûDÀe÷ bÙÂ¥:=7 ¢ýþˆªÉ ÝÀÓÀ%TIÁ ÀxÝ7Ù‡÷ È⇷ه· ný‡÷ hý÷ üØ÷ øØ÷ ôØÅ²¢••÷%TIâØ ÷ ôØ@Â÷ \ìÍ•:‡¥A°¥L­¥Lª7 °Ø÷AL¬Ø÷L ¨Ø÷ ¤Ø‡3The following commands are available for this page:/RATE=s to change replot rate to 's' seconds6PRI=p to change maximum priority displayed to 'p'=OWN=ddn: to change owning terminal to ddn: ("ALL" to reset))TASK=t to display header for task 't' to returnfƇ00ºÖ7¼�8§3eaek›’x|³»z:d ¿¥¿¥ W iä ‚dÁ0Àðä – >€¸Ÿ ¿¥Šº0ÀdÁ|³x0Àr ¢èDN¸º $&>HJr’–˜¨@BDF©– æÊ ÿˆþˆä À¸ÿ7 êÿÀÀÿ&ðUÁÿ Šÿ†ªÿ7¾ÿÁ�ÿÿ xÿ†À°ÿÁÿ pÿð7 ÿ÷ ^:¡þˆ:¡7 –ÿ7 ”ÿÅ`ÿ÷]ŠÿŠÿ7 „ÿEwú@Àe÷ð‹ ñ5õñ5ñ î7HÿD ÄWÁeÉ5É5à7*ÿ mìÉ5€ ô‹ ò5<ò584 èwþþÉUP&B� @°`ð5ÿ ªþEñÅÄþÁ–þWtÿÿ•Á ýŰþµ 5 µås5÷•žþ÷ Rž£4ÿ Xþ7†þwôþÅbþÀ>þ7 nþú ÷ jþÀ`þÁÿ þÀRþÁ&þÿ þÿ&þ&þ þÄ À:þ Âþ‚ ‚ ‚ ÿ îýþ÷ $þWÄþCÖ COF & 7 þó5ÁÜ BAñ¬ù‚ÊKÅÃíC ÎlÎl Ní u! NíÁÜ ƒA ÿ œýù‡Àÿ÷ >Nlc×  ´#ì‡ÎÀÁ÷ ö ø„´ÿ Jý!û·UtýE wÞýñ5€æB¦&‚,ò‹ƒÎ 3`‚õÖ ƒ‡À2ýEþˆn¤C+ó‹ó‹ Âò5ÃòCó‹ Äô‹ôUÃó Å÷ŠèüwwÚü÷ Rþ÷ Žž£Å¢üÿœüŽüE$ÅeÃÕÀÕÿß Õ€ Õ•ŒÿÕ•ÕUÕàÕÿÿ Õ€ Õ•ŽÿÕ•Õ? düÿdü \üÿ\ü‡ÄÀÂàÀ Å倆Åe€@ À€ € ÀåB†à”””””””””””””””””””””””””””””””””چŠþˆn¤ÿÈûºûÅÄûE$ÀÅeÍ`ÅeÍ`ÿ`Àûÿ`ºû‡þˆ:¡ÀÂû Ä ûÅ 4 3ôEP÷Eÿï¢ûô]žû œ À°àÿ TûÃôÅ ôU÷ &:¡‡Å8ûÿ2û$ûE$Åe Åe  ûÄ û´‡–,ÀÀÀ A@W SYSYSYSYTICLöÄ�©Àðÿîÿ±‡þˆ2ÀæÞÿ¿Úÿÿ Ôÿ¿Òÿ‡æ Àÿˆ‚�ÃÁàww€ À`ò‹wòŒ±w¸ÿ00¾“8ô4l1DATADATADATADATADATADATADATAÌ~€W»z:d ¯¯>> W øT¢ TIfdÁ0ÀðT¢˜ BdTI¸Ÿ ¯>Š=¾0ÀdÁ€WÌ~0À=¤ lº–öè,ž>*’.Dެ„œ©¸  æ   f|³æÞ ÿˆÄ˜  þˆH£ÅRþ@*õ5  õ5@õ ÔZ£TMìÅ(þCó5 Ôh¦ÔÔóE8ÃïEêÅúý@Àe ÿ òý:‡Ôä¤Tô%þÿ$Lt@Áÿ ÎýÅe f@ä 0% 0#  ƒsÁÿ ¤ýíEëÖ ‡÷¦jýTTL@Á ~ý|ýÀñ ÷• •ý7Š�ý>ýÅ<ý÷  ÄV­÷ àÿ‹nýÄ ÷ Ì&Àø A÷ æA÷ Þÿ‹Lý ÀeBÂm*ý‚’ÂeAˆ�€B�€ÂE€ÿ „d®„8®÷ ‚õ‹W­Ä‚­÷ lõ50Äß­÷ \W­wŽ7 ¦üþˆ6¤D&ô5€? ¶üÅÀBE: Ä¢ ÃTà ý”· hü‡÷ W­õ5@7 Jüþˆr¤Àtü, f,|³õ· (ü‡÷ "üÄ ­÷ Â÷ $þˆà¤õE õE@@ÿ 2üwˆB�—  — — &— ãõE@æ4¢ÿˆ†÷%ùÿX[ÔĽ­÷ j÷ Ì÷ Bwpý÷ nðûŪûÅ%MÅ%JÅ%GÅ%<7 –û7 ”ûþˆZ¥Â¤û‚„Ä û÷ô5€ ô 7bû7^û7Pû7Lû‡ÁDû÷ Á>û÷ Е ÿ5 ZûÃ$Ãû÷ Е-Е-Е Dj®÷ ªW!W!W!÷•6û÷@hüÅ%Å%Å%ÀåЕ"ÁÈú÷ ’ÁÂú÷ ŠЕ"÷ ^÷ ¼×-ªúþˆ¦ÀÔúð-˜úú Á°úw>üĆú÷ ²‡÷ 2Ä�¬÷ &Àü Áfú÷ 0Á`ú÷ (€÷@Ôû÷ Z÷ ÐwþûЕ È•*””Е ‡÷•xúЕ È•*””Е Áú÷ äÁú÷ ÜЕ Äû­÷ ¨÷@~û÷ w¬ûÀåÀíxû7vûÀè æ´ ÿˆÄª W Е0 ÷ ØЕ:!® òƒà• æ¢ÿˆ(‡æB¢ÿˆ$‡æ€& æ+ÿˆæÿˆ‡æL¢æ'ÿˆ÷5€6û€÷ û7 ûæ¢ÿˆ÷ôú‡ææ)ÿˆ÷Þú‡÷ Ä2®•þÀ ‡÷ Fù Ä¢ f&Å ®44 ´ à P•P•Е=Â÷ .&÷ ¶ÿ„à ò…‡Â’$�”�”&À€ìüÿ�÷ ˜€bÀEÿ€ ÷ ôЕ:È• ”‡þˆú§æúøÞ ‡ üõ5Àæø° Æe‡þ‡þˆ¨þˆ¨D-û5÷ ¡‡þˆ:¨Å”øÿ ¨øÀ¦øÿ ¤ø5‡W,VT ð °ŠÀ‚ø0 ûÁZø1‡÷ &÷ &÷ �’•’•€‡@Á(÷ ¼f€  Àe ÀeÉÿÀe Àe ‡Odd address or other trap fourMemory protect violationT-bit trap or BPT executionIOT executionReserved inst executionNon-RSX EMT executionTRAP execution11/40 F.P. exceptionSST abort. Bad stackAST abort. Bad stackAborted via directive or CLILoad failure. Read errorCheckpoint failure. Read errorTask exit with outstanding I/OParity errorAborted via CLITI: virtual terminal eliminatedTask installed in more than one systemRequired bus runs are offline or not presentSST abort. Bad CSM parametersCPU time limit exceededUnknown program detected faultExecutive interface parameter errorOverlay load failedNot readySelect errorCheckpoint write errorRead failure. Check hardware statusDismount completeUnrecoverable errorLink downLink upCheckpoint file now inactiveUnrecoverable hardware device errorMemory parity 00¾›8¿�8§3eaek›’error in partition Micro code loader not installedAccounting sec. pool allocation failure for Allocation failure on task account block for Task "XXXXXX" does not contain a debugging aidReplacement control task not installedWrite back caching data lost. Unit write lockedRemount verification task not installedI/O stalledI/O resumed Task "XXXXXX" terminated on processor "X"And with pending I/O requestsPostmortem Dump not possiblePostmortem Dump will be generatedTask load device dismountedCheckpoint space allocation failureR0R1R2R3R4R5SPPCPS ²¨Ñ¨ê¨©©,©B©Q©f©{©�©­©Æ©å©ªª!ªAªhª•ª³ªËªÌªëª«#«/«>«U«y«‹«Ÿ«©«±«Î«ò«¬4¬a¬�¬¾¬å¬­=­I­æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w �…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ DW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&æf…Þ ƒ„…‡–, ËË®® A@W ”£SYSYSYSYTICLXDT -- Initialization complete and successfulXDT -- Sorry, couldn't allocate pool space -- Node address = %P%N -- XDT Address = %P00ßøÿêôÿðÿêÿßêÿêôÿâÿÜÿ_·!Üÿ)‡w ,w &w w w w  _w E÷êô ÿ÷–ÿ˜ÿß’ÿêôÿŒÿˆÿÅe¤E…÷êô€ÿ÷vÿxÿßrÿêôÿlÿhÿ_H­XDT -- XDT being unloadedÀÀeDÁÁeFp&ÿˆþˆÂ¢ÀÀeþ67 2þÀ6à Áœÿ (p‡7þÁÁe ÿÂNP ýÀ þÁewæñòñ&ñTÁewÌÁewÄÉÉeÁe w¦ÁewžÁew–Áe(ÂÂe¢ÃRÁeÃ%Áeà ö÷r¢nð¬ÿ÷¬ÿ€ý7Šfÿ5†·ŠZÀÀe¸ÁÁe\ÂÂedýÃÃe´ß•àþÿX û‡Šþÿ‡÷ <ý÷52ýÀÀeBýÁ-÷ †ÂÂe"ýÁÁe…ýÀÀe³ý÷ jÀÀe©ý÷ f‡ÀÀe?ýÁ*÷ V±‡þˆT£ÁÁe<vÀÀe,ÂÂeÞüÃÃe.ß•àþÿ˜ ý‡ŠþÿÀ¼üÁœÃ¼ã ´ÀÀe6þÁ÷ ‡ÂÂe@þ& & & æ f&& ¦& æææ ÿˆ‡Ê‹þ‡à”£>¤>¤>¤>¤>¤>¤>¤>¤>¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿB­(­j­‚­–­°­@¯vÿtÿÿD D l«l«l«r«l«l«D´¨ 01234567SALHCQFBGIR²£Ä£Ö£è£ø£}~\/'"%! ^_@><$=CQ.;-+*,BGKLOPRSXID ¬¬ ¬¬¬¬L¬V¬¦¬²¬Ä¬Ð¬R¬r«2ª"­Z«T«`«Æ«â«Ü«ê«ô«xªè¯«<±ú¬Ò°ÖªÈ°”±Ê±Ò±$0/$1/$2/$3/ $4/$5/$6/$S/ $6/@ 172352/172354/ 172372/172374/ MOVCMPBITBICBISADDSUBCLRCOMINCDECNEGADCSBCTSTRORROLASRASLÿ‹¥ÿ•¥ÿŸ¥ÿ³¥lagellI - BKRAMMARKDPFMMFPIDPTMMTPIlagellI - BTXSSXTMULDIVASH€Æ¥XORASHCBPLBR BMIBNEBHIBEQ€ø¥BGEBVCBLTBVSBGT€ý¥BLE€¦BLOSB(CC,HIS)B(CS,LO)NOPCLCCLV€p¦CLZ€x¦€€¦€ˆ¦CLN€”¦€œ¦€¤¦€°¦€¸¦€Ä¦CCC€0§SECSEV€Ð¦SEZ€Ø¦€à¦€è¦SEN€ô¦€ü¦€§€§€§€$§SCCCLC!CLVCLC!CLZCLV!CLZCLC!CLV!CLZCLC!CLNCLV!CLNCLC!CLV!CLNCLZ!CLNCLC!CLZ!CLNCLV!CLZ!CLNSEC!SEVSEC!SEZSEV!SEZSEC!SEV!SEZSEC!SENSEV!SENSEC!SEV!SENSEZ!SENSEC!SEZ!SENSEV!SEZ!SENNOP(260)€N§€S§RTIBPTIOT€X§RTTHALTWAITRESETSPLCSMTSTSETWRTLCKJMPJSRCALLRTSRETURNEMTTRAPSWABSOBILLEGAL€²§€·§€¼§€Á§FADDFSUBFMULFDIV€;¨€p¨€”¨€�¨€¦¨€¯¨€·¨€À¨€É¨€Ñ¨€Ú¨€à¨€ñ¨€ü¨€©€©€p¨€y¨€‚¨€00¿£8ô4l1DATADATADATADATADATADATADATA‹¨€;¨€@¨€E¨€J¨€J¨€J¨€J¨€J¨€J¨€U¨€Z¨€J¨€J¨€J¨€J¨€J¨€_¨€e¨€k¨CFCCSETFSETIFPP - SET?SETDSETLLDFPSSTFPSSTSTCLR(F,D)TST(F,D)ABS(F,D)NEG(F,D)MUL(F,D)MOD(F,D)ADD(F,D)LD(F,D)SUB(F,D)CMP(F,D)ST(F,D)DIV(F,D)STEXPSTC(FI,FL,DI,DL)STC(FD,DF)LDEXPLDC(IF,ID,LF,LD)LDC(DF,FD)ø|¶ô|¶ò|¶ñÔ¶€ðζ@ðζ ðð¸ðð¸ð¾¶~¸|ð¸zZ¶pü¶@2· 2·2·Àð¸Àˆ¸ð¸@ð¸€ޏ‚¸ `· `·‰°·ˆ¶·Ê·B¸B¸B¸€B¸Àž¸ ®¸˜¾¸�ð¸ˆð¸€ø·@Ô¸ ð¸ð¸ð¸ð¸ä¸ä¸ä¸@(©ø©@p&@têLBD<>,¾:8246LPœJFRHº÷ ÷  ;‡Â w 6d¤‡DÄe¤£ w &l¤†Ä%*‡Äe”£Dlr¤÷ d ‚ ÷•®ùw,Ä À>¤Ã Å5r 4 ²£Ô û@Á²£@$iÁ%À£û† ÷ `†ˆ ÷ ý†Ä%‡4²£4Ö£ôÄ£Ô ‡÷‹Kù÷ úE‡t裠÷ =‡÷ ÷ ܇ôÿÿ裄 ‡ ÷ êÿû‡„ û à ÄöøD÷ À �ÄEøÿ=‰ ‰‘Àe0,À‰Ä à ÅÐøíè£@÷ ø ÄVøÄNøÄ´ø‚ ÷ f÷ H?‰Æpþ÷ >à‰7 žøX‰D‰T‰>‰7Š™ø  7Š�ø7 Žø÷ ¶ 7Š~øw Ò€¤à‡Â ÷ py¤¤÷vÿjø÷tÿfø‡·Š[ø÷¥UøwJøƒÚ7ŠDø÷•<ø÷•þÿ4ø ÒÄ !¸7è£$øìÀÀ 7ø7�øw�ø7ö÷7ô÷÷�ø÷ê÷À%÷5à÷ æf÷ L�ù ޵ž÷ ¢�·Šã÷÷ ˜÷‹Û÷ ÷¶÷²÷÷�­÷ª÷7ŠÉ÷÷m¦÷ ÷÷�š÷™÷à‰À”÷÷ BÀ�«÷€ œ€¤€‰Ä€÷ 7І÷7 „÷wþþ÷ H÷ín÷h÷ã÷ .a’¤7ŠX÷·V÷Ý÷ 7ŠH÷÷÷ ‘7Š<÷Á ÁeB`í÷ ÷%.÷Â$÷·"÷‡Ã Å÷DáÄå_‰ ‰&÷ 6>‰€€ ÷ ,wPþúˆw Ø"ª÷EàFR÷MPìö÷Bîö3¿!¦ü†÷SOØö÷NÚö)w ª$ª÷ODÄö÷@Æöw –&ª÷BE°ö÷D²ö7еö#w ~(ª÷IO˜ö÷Fšöw j.ª÷IL„ö÷H†ö÷•ÿÿ‡ö w P*ª÷EMjö÷Jlö÷•möö5Î-Xöü·Äõ·Âõ7®õÀ–£P�ÐP�ÆìûÀN¤Á@¤XW N¤ü‡÷‹àû÷ ÷‹ö÷‹öwÖ÷‹öæÎûæìôIJ£Ã%>¤ ÷ @÷‹¨û&"‹  "Ä%À£î†Ÿìô¿šûÅ<õ÷‹Ëõ7Ä�Æõ(÷•½õæ€ûæìôÅåC÷ ÷‹`ûK ƒÃŸìô¿\û÷ šõÄt!²£ÄåúÄTEÕ wàô7‘oõô Ä£8´ Ä£„ Äe0B7Lõ÷ f÷‹Sõ€÷5ñ÷ì¤øõà‰À.õÀ‰:‰@æõ7 õ÷ À·õ÷%BCõ ‰Àõ÷ ª ‰Àõ÷   ‰÷‹õ€F‰N‰w¨èú7 êô÷%EMØô1æNôÎå÷ ^¦ÎEÖ%üˆ$÷BC¸ôÖ5÷•ÿÿ»ôÿ  ú÷šúªô÷’ú¢ô÷žôÎe÷ ·�ôÎe÷ ·‚ôÖ ‡–%÷Áxô‡æ>úæìôƒ÷ À÷‹ úK ƒÃŸìô¿ú¦ö‡ € þ 7¬ó7Š<ô7Š6ô÷U ó÷‹.ô$÷E”óæèùæìôIJ£Ã%>¤÷ Z÷‹ÂùK ´"æô‹ ô"ËúóÄ%À£é†Ÿìô¿ªùæàæl°ßd°ÀÆeÀ?rùÀN¤Áø£X \¤ü‡? šù? ”ù? ”ù7 žó7 œó÷ šó÷e2¤ó7 ŽóÀ–£ÀÜòæèòæâò·hóùÀ•7�fó7Š`óÀ�[ó� Ä0Ä£×­Ió…÷‹Bó‚·Š:ó÷U¤ò¨ˆfÿ öø·-øø‡·-òø ƒÿ/Èøàø·-äø‡·-ÞøƒN…… 7fòà w\ò÷¥Óò ÷ Èò÷LÿÊò÷NÿÂò ‰Å<òÀ�Èòàw¢òæ  ÷ f÷ |÷ ^÷ ŠŽ Î%øòÀ–£Àìñÿøñjøÿðñføÿvòbøÿrò^øÿÞñZøø÷•Ijò÷•DbòÄ%‡Ä ‡À�Pò7`,ò÷-(ò¸ñƒ÷ –‡à‰Àò÷ ÂÀ�+ò€ œ€¤€‰Á�ò@fù ޵…‡÷‹üñ � Ämôñ7ðñ7Šêñ‚ ‡æäñÎ Î Î „cÎ Î „eð  ÷ vÀ¥0 ‚À¥7‡ÀEøÿÄ Ä Ä `‚ ðwÞA  AåÁ Ñ‹ùÕ ±…Äñæd÷æìô÷ Ü·zñÃ%êôÃ%úôÃE÷‹6÷÷‹Xñ÷¥DtñK €K�€À÷À ÷Ÿìô¿÷÷5,ñÀ‡Â ÷ –ÿ‡Àñ÷ ñ7à ñæìöæìô÷ dÀ5þÿ ÷ nÿÀÅÿÑ÷5êðÀÃ%êôÃ%úô&÷‹¨ö÷‹Êð÷¥Dæð‹ ‹�?ˆö?€öÃ%ìôŸìô¿†ö‡–%‡÷‹–ð ÷�´ð´ð7Š®ðÃ% ‚Ã%Àƒ÷¥DœðÿDöTöß>öìôÿ4öFöß.öìôÃe ‡¿4öŸìô‡÷ ñÀŸñ· ñÀ‹7 ñ÷‹†Ký€À�‚KÀE€ÿ  ß‹pÿý€À—rÿÀE€ÿÀ¥ö€  w `þ|¤‡À•$&€‰€À%a‚À%z‡Àå À¥ À•+‡¦Î妗�€ Î5 À ÖŒ€€‰À×-Âïtÿß‹pÿ€æ—rÿÎŀΥÖ¥ ß‹pÿý€æ—rÿÎÅ€Ö¥öÿ‹Šïá€?�‚ïÿ‹€ïý€À¥ ÷%LÿrïæŠ€‰Î ýÖ &Àjï÷‹Bï'ÀD Î%”£"‚Î%ö£‡$‰Î%²£ ƒ€À唣€ œ\¤ÀU À‰‡ N,t¤‚Ñ û€@ìr¤€ Àe0€‰� @œl¤ë÷‹Æô÷ ðîÀ‰÷ zî„÷ ¬�NÀe0,À‰€7`îÃÄþÿ 7 Rî7�NîÃÄÿÿÀ&Äe N @ Ä üÀe0€‰Ã ôÀ• Ö €‰‡XµJµ¤µ µšµ:¶÷ €‰À€‰ ‰‡ÅÂàµ@�÷ ( À  Àe ÀeÀe Àe €‰Å ë‡@(Ä.î æÿÿ�  ‚,裂ìè£B ‚Ð ó€‡�€ À ÷÷5ZI ÷5&?ÀÀôÐU Îôûƒ‡÷Úí”ó÷Öí©ƒ�CAûCIÁ¦§Å%z†wˆÃEçÿ÷ œÅEøÿ÷ æw‚ÁƧÃÃEðÿ÷ ˆ@ÀEÿÀ%ø À%ú‚À%ü†÷ ¸,‰÷ <wN÷ 4,‰÷ ¤w@Á¨ÃEðÿ÷ Hw2Á/¨Áö§ÃE?ÿ÷ &÷ zwA‰C‰@À À ÀÀEüÿw<Á·¥CÃEÿñÃÅEþ÷ Ã%÷ D,‰÷ 4wÚ÷ ,,‰÷ 0wÌÃàCAÅE€ÅeCÃÃE�ÿÁ3¥÷ ¸÷ þ,‰÷ wžCÃE?Ã%�Ã%À�wzCÃE?ðÃ% Áo¥÷ �@ÀEÀÿ÷ ¤wfÃå ÁK¥÷ bCC÷ ²wNÁ�§ÁŒ§÷ D @Ñ÷ rw4Áx§ÃE?Ã%À Á|§÷ "ÅEÅ%Àƒ÷ f,‰÷ jwÁ�§ÅE€00¿«8�8§3eaek›’Å%Á…§÷ ôÅ%÷ FwâÁš§÷ ÞÅE~÷ (,‰.‰-‰@ÀEÀÿÀ ÷ úw¼ÃEÿøÁȥŠ€ÃU€ÅE€Ã Ã÷ ´.‰ @‘À Àe€-‰ +‰@÷ ºw|Áb§Ám§Áf§÷ l÷ Äw`Á•§÷ \÷ ´wPÃEàÿÁ¦÷ Xw@Á^§÷ <@ÀEøÿ÷ hw*Át§÷ &÷ ~wÁ9§÷ &wÁž§÷ @÷ : ‰‡ ‰ƒ ƒ ƒ ƒ ƒ à Á`ƒ Á` ‰@” �€‰@”€‰@”€‰Å €B‰ ‰‡f”v’�ÀŒÅ �@”ô€‰ü@˜ð€‰üCà à ÃCÁÃEÇÿƒ ƒ ƒ Ã5Ã5@‰Ã æV@/Ç` ÷eŠê÷ Š Á5 ÷ +‰‡-‰(‰÷ )‰‡@ÀEøÿÀ%&R‰€Àe0€‰‡À%S‰P‰‡P‰C‰‡Ç`Ùß#‰÷ .÷e$ê‡÷ ÷eê‡æ÷eÆïÃÂï÷ ~øÀmºïÀeæ÷e¬ïèï÷ dø÷ ƒ‡& &ÎEøÿÎe0¡ € € ö€€‰ü‡Â 2À¥#/f7 nï7 lï÷ X7bï‡÷ N7Zï‡÷ Dý†�Äø¿ælïÿfïfïÿe€`ïÌ 7#2ï7-,ï%õÄåø¿„ šÇ¿<6ïˆÃÚ© ÷ þøÁ¥Z"‡Á¥AƒÁ¥9‡Á¥0ƒÁ¥$ Á¥ Á¥.ÁåÁå÷ÿÁåÒÿÁå@KpD`‚ ×$Ù±‡Â Âw t ”Å¥ üÅ¥ ùÅå0B¡†€÷ |Aa”ôœÿÿ‡w BÄ'Å  ÅUD$†BA÷ T&�Â(÷ ÅU� ÀBQ÷ ¢ÂЕ* ü‡÷ &÷ &÷ �’•’•€‡@Á(÷ f€  Àe ÀeÉÿÀe Àe ‡ABDEFIMNOPQRSTUXYZ<>Å"BaÊ$ep|v¢­$Ê®¶ÅÏJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw B&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ „þÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚bÂEÊ Ö ÌЕ%„Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ �à õ‡& æÎeæ6& ¦æÎeÒ/& æÎe þ*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎe˜ & ¦æÎe„Е A‚¦Þ à ÷–%‡& æÎeXòA÷ äýà û‡Ð• à ü‡A÷ bE‡AÂ÷ †E‡Ð• Aæ÷ °ýAÎ ûÖ Â ÷ $Е.÷ ˜ýÂ÷ AЕ; ÷ Öà à‡Â ýð¥ ÿÿùÀ øw XD…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w (DÅ… ƒ÷ &Е.À À À ce÷ BÀ …Е:÷ Å ù Â÷ <B‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w Z…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ lÿW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&æf…Þ ƒ„…‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡>©›`C©xQb©ài©Žsi©Tts©¹e ©h ©èr ©s¹©ÖW¹©)X¹©T[¿©8r¿©Wr¿©Vr¿©XrÝ©ÖWß©^(.ª›`6ªû6ªý6ªþ6ª€6ª€6ªß€6ªÔ€³ªÄ…³ªß…ÿª�Zn«›`¿«ö&Ï«ëyh¬Ž:h¬�:h¬�:h¬‘:h¬P©""©«%©xd©7MH©ü H©�K©Ž(K©5M©sP©\½©ÐªòªCT+ª¼ �ª» �ª2g�ªŠR«F^¡«@w¹«¢2¹«”4¿«‚&Á«tÌ«ÃÌ«pEÌ«­sÍ«üdë«z}¬xd¬øf¬Äq¬,t¬Ðu¬øu˜¬oM˜¬ 3©w—ì©|ì©”’T«|T«”’ô¨«ô¨:^ô¨W^ô¨Ìeô¨‹wô¨Wwô¨Kyô¨Û‰c©¹Le©ºe©×e©«e©Ìee©Wwe©‹we©KyL«áH©/H©&H©ÉH©–wr©Àr©Ár©!m¹©2X5ª? ت—ت˜ت™تšتŽتßf먃2먺3ë¨È3ë¨Ï3ë¨ß4ë¨Q5=©è&=©ï&=©°'=©·'C©r C©y C©‚ C©‡ N©~r©½’تVNت4Mت5MÊ«Ž,髲뫽’c©7‘e©ôe©e©7e©8v©?Tv©wRë©Ìeì©Ìe6ª–87ª47ªf7ªù7ªö&7ª4F7ª¿F7ªÀFx«¡Gx«¯G}«–•«�m•«§m»«„»«�ó«V}¬á©CE©WE©XEC©^KJ©;dN©^Ke©r l©8Y‹©*£ªRGتÌeتމ¡«ó¡«ôœ«ðÀ«´'À«Ï'À«þv?¬tNû¨Z…e©Z…q©Z…تYeت�ƒØª¯ƒ•«|K•«[M•«eM•«hM•«QNÌ«xQÌ«ßSÏ«¼Ï«×l¬Z…C©»J©t e©×Me©×Ê«µWÊ«t Ê«ô‘¬xQD©ƒ:D©žrD©…sì©Kyk«tLk«BMk«°Zk«Ìeq«zZq«~Zq«ˆZu«�u«œz«±Tz«¶Tz«ÄT{«je{«ne{«xe{«Öf»«ñQÊ«IÊ«‡Ê«ºƒÊ«×ƒê¨ëꨀ먗ë¨Ýë¨+€ô¨×©³K9©!ND©–ya©ôyc©L e© q©¸r©R~š©Kqš©R~ ©.s ©6s ©8s ©;s ©=s¾©+ªÈ3¤ªOq¯ªôɪ+g«€i«ãyi«ôy}«#•«®S•«·Sœ«Sœ«:dœ«ïf½«Š}½«ð}½«÷}½«½«½«ä½«áÊ«L Ê«œTÊ«ßfÊ«äyÌ«ŒdÌ«+gã« ó« Gó«¡Gó«¤Gó«:dó«ˆ}¬œw•©ÌyÀ©áfÀ©õfÀ©öf4ªƒ:7ªà¿«t'ò«½ò«Òh>©›`C©xQb©ài©Žsi©Tt ©h ©èr ©s¹©ÖW¹©)X¹©T[¿©8r¿©Wr¿©Vr¿©XrÝ©ÖWß©^(.ª›`6ªû6ªý6ªþ6ª€6ª€6ªß€6ªÔ€³ªÄ…³ªß…ÿª�Zn«›`¿«ö&Ï«ëyh¬Ž:h¬�:h¬�:h¬‘:h¬Ps©¹e#{%{�Q&{8r+{8|){+{Ðp+{P},{ 20{àG2{2{¶^3{ø3{‚3{(‚5{ˆra�ðc�Hgc�À€i�ˆri�Bxo�r�Œr�ˆrs�L £‡À€¦‡ßfµ‡�¬‡Ø^© 8^­ Œd° ° ° èq³ <}´ ´ cO¸LdOiOkOÐplO8YnOHnOH…sOød@yl8YmxxnHpvöv vÊv’GvC[vv~vmvy:vavžgvºƒuuuüX#Ið_#I(s#I�y&I8r(IHg)I8^/Ip&/Ið‘0Ièq0Iˆr3Iø5Iˆr6Iàah €bhËLch, chwdhzdhhîhhÐih8^lh8Ymh¶nhHohð‘phèqphØrrh !rhÌQrhˆrshU„<BÖÞrtv zPèêðôdöøä>vx ˜¶‚ØÚÜÞŒdfhŒ,Ž.”4–6ä|ˆ„†\Ž˜Z\^`b€:>Vbdäf¾ÀÂðòü.0¦à¸(ª8”®îj‚ÌŠŽ²°¶~üøº˜Üôöøú´ü&(:2ÀòúN~"6 ¤<@îäæèæîðòô¦öøúüþ4Zbd `b"&*¦FJìlz†ˆ "$’”ŒNpÐÖ¸ìâ þ>@t  X ^`rtŒ .¢¤¨0„¦¨ªHJLœP0šHfhŒŽ�–(š4¢ ¤®°´¸Zº\^¼`ÒÔ¢ìB,ÐÒÔÖØ~  "$&(*,0268: €‚H„ îÿþÿ üÿþÿüÿúÿøÿ üÿýÿúÿøÿþÿ ûÿ"#  $ *, 642"!$(<& @?0:5úÿüÿþÿ  "اÂçÀJìôß À‡xX€–, ?º?ºii W Ò¦ TISYSYSYTICL†ìÀ€ÀðÒ¦¡b„ TISYSYSYTICL(‹ ?ºiŠhÅ€ÀìÀX€x€ÀÂ�œ�œ&À€ì�÷ ¬€lÀEÿ€ ÷ Е:‡ þˆ¢þˆ¢ÁA7 èÿÃ5· ÞÿÃ Ë ÷ Ôÿÿ ôS† ÿ ê ‡À5LÀ 7vÀþ¶€ Eó ;& æÃ@¡# # @7Žÿ÷ pÎ ÷�‚ÿ�ÿÀ;¡À:¡÷ °N÷ ªƒsÿ ކóË|³÷ Zÿÿ z‡ÿ p ‡À5À 7üÀþ¶€ –%À@° –%6‡@ÀD0 û€ì�÷ ˆ€lÁEÿÀÁ%? †B—týÿÂe9��ÁEøÿÁe0P�‡ ÷ ćw p„ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ ØE�€Aa×$Ò±œÿÿ‡Â Âw æ ”Å¥ üÅ¥ ùÅå0B¡†€÷ �Aa”ôœÿÿ‡&æÿˆæ3ÿˆ&æ¦f&¦ v Þ €�‚ƒ„…‡w „Ä'Å  ÅUD$†BA÷ –&�Â(÷ ÅU� ÀBQ÷ ®ÂЕ* ü‡÷ &÷ &÷ �’•’•€‡@Á(÷ îf€  Àe ÀeÉÿÀe Àe ‡ABDEFIMNOPQRSTUXYZ<>Å"BaÊ$ep|v¢­$Ê®¶ÅÏJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw „&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ TþÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚bÂEÊ Ö ÌЕ%„Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ �à õ‡& æÎeò6& ¦æÎeÞ/& æÎe þ*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎe¤ & ¦æÎe�Е A‚¦Þ à ÷–%‡& æÎedòA÷ äýà û‡Ð• à ü‡A÷ bE‡AÂ÷ †E‡Ð• Aæ÷ °ýAÎ ûÖ Â ÷ $Е.÷ ˜ýÂ÷ AЕ; ÷ âà à‡Â ýð¥ ÿÿùÀ øw šD…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w jDÅ… ƒ÷ &Е.À À À ce÷ &À …Е:÷ Å ù Â÷ HB‡æt·ÿˆÀ�7ð5À…µð5 W,TTñ‹@,ÀMµ÷ ¼ÀwPÀ¢²Á@PPPPPPÀ ²÷ ˜ÃÞ·÷ B 0†æÿˆææÿˆ& ææææÿˆ&À.´Ð•IЕNЕS€Â¾¶7 ¬7 ¦÷  ÷%pÀ¦µ÷ 6ÀwÊÃâ·÷ Ø 0†æÿˆææÿˆ& ææææÿˆ&À.´Ð•IЕNЕS€ÂÕ¶7 B7 <÷ X ÷%00Å]9�8§3eaek›’ÀÞµ÷ ÌÀw`÷Ð7 ÎÀ²÷ Œw¾W ç÷‚W ƒÀê²÷ tw¨ùw  ö‚ÀÚ³÷ `w–Áew Šõ‚À'µÁm³÷ xÀ†wþ 7ŠÜ 7ŠH ò• m³ò• n³2Šo³ÀÝ´Ám³P” ýЕ Е ŠÀ ´÷ p†Àw¶ÂÀ´ÃP³À Á’”C~Ó• Ó• ÷ ÿU€dÀ·³÷ èÀô*ÁÀå ƒÁèÁ-à†ÁÚ †& æfæ æÿˆf÷ ¨�æ æ)ÿˆwàª÷ ªÖwà¤É÷ ˆÀœ7 ¶æL«æ§ÿˆð5 ÷žðU 7 ¾ 7 ¸ ÃÖ·÷  %‡È5€"À æÿˆææÿˆ& ææ ææÿˆ&À.´Ð•SЕEЕT€À�¶÷ ~Àj 7ð7 R 7 L ÷ j÷ <7 B 7 < ÃÚ·÷ Š%‡È5€"À æÿˆææÿˆ& ææææÿˆ&À.´Ð•QЕUЕE€À‘¶÷ ÿ5ü #ÿ  æÿˆææÿˆ& ææ ææÿˆ&À.´Ð•SЕTЕO€Àh¶÷ ´À÷ \æÿˆææÿˆÀW¶÷ ”ÿ Š æÿˆææÿˆ& ææææÿˆ&À.´Ð•EЕLЕI€À7¶÷ NÿU@F ÷ nÀr´÷ ÆþˆL«ÿ52 ÁR ÁO Á/ ÿ & , ÿ•ÿÿ( ÿ  ‡ß•àþÿŠþÿ‡ÿE€ø À– ðM° ÀÜ ðŠ ÀW´÷ hÀw¾÷ÅÊ  DÝ CÝÄàCó5€óµ@wœÀ¶æ÷ \õƒóµÁAñ AúA ÂP” ýÁé¶P”þÿ5 b pÀL lð ûÁ¶ÀG¶B”— :��ú��Áß¶P”þæÿˆææÿˆ& ææææÿˆ&À.´Ð•AЕCЕS€ÀC¶·~ ÷ ò7 v ÷ zÀÔ æʬ÷ ì,ð ûþˆ^¬Åî õ5€õ5õ5õ‹5@&ð5  ,@ÿ Š Eõ ܇æÿˆææÿˆ& ææææÿˆ&À.´Ð•DЕMЕO€À¶÷ B÷ Îæ<­÷ Dóµ@ö& ææææÿˆææ)ÿˆCmÄ €Ew,þw:þ‡ÿ5 ò ;ÃÅþ Àò·þˆz­EPÅ~ ‡Åò·C(À©¶÷ |óЕ ŠÀŸ¶æÿˆææÿˆ& ææææÿˆ&À.´Ð•SЕHЕA€÷ |Ö‡×- ÷• WÀ³À‘´æò·æ=ÿˆ÷ ÎÁæ À1³Ê• ²’²’ ÷  À ³ÀŽ´÷ ò‡ÿ5 Mþˆj®À  Üñ5;ñ5 1w ” .v 6÷ʇÁ /¶w¾æÿˆææÿˆ& ææææÿˆ&À.´Ð•BЕYЕE€÷ ž ƒ l¬ņ¹6 ‡ñU ®÷@®7´Ñ‹þàÁ w¨æˆ·ÿˆ‡ææ)ÿˆ÷¥Ê ÷ |户ÿˆ‡÷ Ö÷@j‡÷ ô÷$l÷ ¦ÿ÷ b7 Öæ ·ÿˆ÷Å Ê÷¥YÄ÷¥N¼è±‡æ ¹æ'ÿˆ÷5@¢ ÷5€š × ÿÿ&À$´÷ žÿ€†ææ!ÿˆ & ææææÿˆ¶Ö ‡÷$â÷ ÿÁ·Â ŠÂ ý÷ Êæ ·ÿˆÀ·÷ óÁ è�‡÷$°f÷ èþ�ÂHŠÂ ý÷ ˜·À渷ÿˆ÷‹Â�¾‡±‡ 7 Р—,TT—,RT—,HTuƒÿ5ó5 f÷%�ÿ5ðó5úÿZþˆ€°@À ÿæÂÀoâð>‡D¸ô@4 Ñ‹þàÁ tw]ú¸N&ÿˆ‡W¯&¸ïÿæ1ÿˆõÕ W!.& æææ æÿˆæ æ)ÿˆ w=ú¸ W¯&¸ D¸ô &ÿˆA� fæ)ÿˆÕ W!ç7 Ú  ƒl³ �‚÷ ÀÇþˆF±ÿ üÀð¨>‡wØþ÷ †ý¦Ò‹þ‚ã·Ò·Ì÷ž&À~ðE ð€æ·ÿˆ ‡÷ Læ@ææ‰ÿˆ ×-ˆNÿÿæ1ÿˆß±‡æ ¹æ'ÿˆ÷5Næȱ÷ ’ý‡Áö¶Âò·÷ ŽòÈ• ‡& ææææÿˆææ)ÿˆ‡þˆB²ÅRE9AAúñ5€ùñ5@õñ5@ññ îÿ >ë‡Àpúÿñ5€Ø Ö& ææææÿˆ‡ææ)ÿˆéæ1ÿˆëÁÒAñ†²‡÷ø÷ôæ|·ÿˆ‡À·‡ Shut down program Enter minutes to wait before shutdown: Enter minutes between messages: XX-XXX-XX XX:XX Please finish up, XX minutes before shutdown -- Reason for shutdown: All further logins are disabled Enter minutes to wait before disabling logins: OK to shutdown? [Y/N]: Command ( ) Timeout - Continue waiting? [Y/N]: Logins are now enabled SHUTUP operation complete XX-XXX-XX XX:XX System is now shutting down -- Reason for shutdown: Reason for shutdown ( for none): SHUTUP can be run only by privileged user or from TT0: SHUTUP's TI: is a pseudo device SHUTUP - ACSRES.TSK not found and installed in system. SHUTUP - ELIRES.TSK not found and installed in system.BYEDMO DDNN:LLLLLL/DEV/LOCK=V ELI /NOLOG ACS DDNN:/BLKS=0. @LB:[1,2]SHUTUP STOP/ACCOUNTING SHUTUP SET /COLOG=OFF QUE /STO:QMG SHA ABORT DDNNN: INS $ACSRESINS $ACSINS $ELIRESINS $ELI/BLKS=0. /DEV/LOCK=V %Y %2Z ÊQ|³¸‘¶ 0’¬®²¶þ"*,.DNTº"$&,8R^`„†–ž¨¶©6·© · @з  ·  зG,|³Ol|³|³Ë|³)!00Åe9É:l1DATADATADATADATADATADATADATA| ˆ·6¸N¸f¸~¸–¸®¸Æ¸Ð·Þ¸â¸æ¸ê¸î¸ò¸ö¸ @Þ¸  @⸠ @æ¸  @ê¸  @î¸  @ò¸  @ö¸  @€æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w �…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ DW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&æf…Þ ƒ„…‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡|³4„–, ?¸?¸aa W dÂ¥TITITITIr¾ë€»ðÂ¥’£d©NpTITITITI(‹ ?¸aŠ`É€»¾ë4„|³€»`”)?H¤Ž¥ œ¥*¥ œ¥*¥… œ¥*¥ œ¥*¥¥ œ¥*¥ œ¥*¥0¥8¥¥l¥n¥z*D$&–�øÿöÿ© ¥ 溥ÿˆæD¤ÿˆþ‰ÀH¥Á, Á ý÷x¥’ÿ7 .ÿæò£ÿˆ†‰ÿ‰Å’£õ*Zøõô£Ä˜´÷ Ê ‡÷5Rÿì÷5 Jÿ‰ç÷5>ÿ÷ÿÿFÿ÷|¥>ÿ÷5*ÿõ5‰Ó‰Ñæh¤ÿˆ†‰Ëæp¤ÿˆÀ,ÿÀEã£À%@À5‰¼‰ºþˆ”¦ÿ"ÿÿÀÿ7Büþ‡ÀÿÁòþÿ5ÿ ð5 @,þÿ ‰œÂ´þ@Àeà Á¤þ¤à  úà È‹ ‰t÷5zþ'÷%|¥€þ‰j÷%ÿÿvþ÷Ný`þ÷UXþ—¥À â• À üÀRþÁPþR”À ý÷ 8þ÷,ý0þ—¥À â• À üÂŽ¥ÃþN÷ þ÷ þÄ÷ Å0¥ÀŽ¥÷ vU÷ pU÷ jU÷ æýw àý÷‚ý÷5Îý=ÁÐý¡ � � � � � wîüw Fޤ ‡÷àýbýw 8¦¤‡w 0¾¤‡wþ÷¥ðÿÂý ‰ø‰öÅ�´ýw î¤W¡Çÿ‰ìW¡ðÿ ‰00É:�8§3eaek›’ç‰åw òÖ¤w ìÝ÷5 Lý‰kw Öv¤†‰eÂÁJ¥À*¥‚~À*¥w ¶Ö¤†ÁJ¨Q000ðU8w �v¤‡‰÷r¨Ðü.×­ýÎÿ ×­ýöÿ×­ýæÿ÷’¨°üÀ*¥000ðE8ðð0 w 2‰÷ШrüÀJ¥Á*¥Â‚~w ¦¤†ÁVüÀ�¦üwöüfÿˆ‡÷‹–ü±…÷SYZû7 Xû‡Á�küÁ]hüÁÝgüÁ]düAñ�TüÉ�Rü‡ÂÿÿB Â% ‡Á(üW „¥†‘Qwü‡ ‡‚ªWSEIF???¦6€N¦æ&fÀ%þw4À%ü7 Öþw÷vUèúÆ­÷ Äþð5øÿ7´þÁ‚©÷5¬þÑ•%÷5 þ ÂÞÃ�Ø‘”ÊýÑ•-÷5„þÂEøÿ‘œt©÷5pþ Ñ•-Âe œ‘”Êý÷5RþœÁ%‚©Ñ•,Ñ• ʦ”Î¥`†ÎÅ ‘•‘”Êý‚©�à& & & æ f¦& & & Î�üýæøýææ ÿˆÁÈ Á & & & æ f¦& & & Î�ÆýæÂýææ ÿˆ…„ƒ‚�€÷ ¨ý· ¢ýæžýæÿˆæ3ÿˆw ô „ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ `ùE�€Aa×$Ò±œÿÿ‡  î­INPUTERROR®SYN®AMBIG" &®NOSUCHDEV*( >®NOTFILES112f®DUPL:~®ENTERRB—®CREERRL±®ATTERRRÉ®PRIV\Û®IE.PRIb$î®NOPRIVj ¯IOERRORr ¯INCVOLLABELz 1¯IOERR‚:¯ONEDIRŠ Y¯FEANOTSUP’x¯NODIRœ•¯FAILDEL¤$¯¯ILLFILEÔ¯l¬€¬Ž¬ž¬²¬Æ¬Ô¬ä¬ô¬­­"­2­D­Z­j­z­Ž­ž­°­command input errorcommand syntax errorambiguous keywordno such device availabledevice not Files-11 directory structureddirectory already existsfailed to enter directoryfailed to create directorywrite attributes failurevolume not mountedprivilege violationno privilege for attempted operationI/O errorincorrect volume labelI/O errorvolume is single directory onlyfeature not currently supportedDirectory not found on deviceFailed to delete directoryDirectory not deleted -- files existUFDf¦æ& Í¥`”Ì‹€õÃ÷ ¨õ @ È Ô%Þ ýff&ÀQ€ÀEÀÿ ƒÆeN wÖÀ `NA`c<2. w¶õÕ€,õÅ€(ÁÁ@ÁáÁ ÁL Á@ Á Á÷ H‡ÁU@÷ (÷ ÷ Èu G Á÷ ‡Ä 5 3 :„µµ÷ †Ì‹†€÷ ´ ÷ ص ¹tü „µõ÷ Èþ6݇õu õà µŒ‡õ  µ 5�õƒ  µõ„& Ô5Î †Ô Î †5Î †ÀÜ À5þÿ6 ‡Ö § Î ‡A�Aaf�ö †Ί�P”üÖ Î Á @‡ PÎ Î †ÀÎ À ýÎ †6Ö �–†wþÁŒÁŒ� ‡Ì‹ø�÷ xû¶Æeö%±ø±€ƒ‚�‡õ³¸÷ ²µ÷ @°¢ÿõµõµ Ð¥ÿýÈ¥ÿ ÷  õÓ™A�–A­ “‡wæþAf f”—£`‡ÎE ¤ õ5 ñ¥_ÿÿÐ¥*À Î é Ö ‡BCõ‹ �ô¥�ô¥‚÷ º5 õ‡ÁT÷ ‡µ ƒ  øõ ‡f :À’ ‡õµÀ¥a‚À¥z‡ÀE  +‡ †À¥$& †À¥.! †À¥_À¥0‚ † 7ƒ † 9ƒÀ¥A ‚ † Fƒ † Zƒ±¡�‡Ô5Ô À ý‡ý‡  ×¢ ×¢ � ƒ  ö‡5 @AÁe  Ñ€ ‡µŠA‡÷ D÷ BA�Áå0u`‡÷ 0ff÷ &a(B�Âå0‰`B ÂEþÿ‘eB ‰`B ÂEþÿ‘eB ‰`‡Ï AÁeÑ Q I ‡õ•u�AÁeõ‹Aa a Q Q É  ‡õ•‡ALLOCATIONÿENTRIESÿOWNERUICÿPROTECTIONÿDIRECTORYÿDELETEÿCONTENTSÿLOGÿÿSYSTEMÿOWNERÿGROUPÿWORLDÿÿ€ƒ€���€´R…€à´��…˜r¶´Rƒ ©�…ø–¶j¥©´R…˜À¶´R��…€à´ €€/ ��‘€8´0µ‘€C´0µ‘€K´>µ‘€T´Nµ‘€_´à´‘˜i´´Rà´‘˜p´ ´Rà´‘˜y´ ´Rà´€=:�…ˆ·p¥à´€=:�…à–¶l¥©à´€=:�…€bµà´…€„µà´€[�…€¾µ€,�…€ìµ€,�…€¶€,�…€H¶ ]€(!…€šµ�…€šµ�,Œµ )�‘€~´ºµ‘€…´èµ‘€‹´¶‘€‘´D¶€:=�R·R¾µW·R¾µE·R¾µD·R¾µ �€:=�R·RìµW ·RìµE@·RìµD€·Rìµ �€:=�R·R¶W·R¶E·R¶D·R¶ �€:=�R·RH¶W ·RH¶E@·RH¶D€·RH¶ �€‚�†l¤�†m¤�…ˆ·n¤�€:€ƒ¡�r¥ ��<¦¶[�…€®¶ ]�…€®¶ >�…ˆ·†¥€,¡…ˆ·Š¥�<ä¶[�. :©!] :©��� @©�.Ö¶ ]�. :©!> :©��� @©�.ò¶ >€�¡… .·´…€P·¡. ´�…€P·!… .·´€.�¡� ´�� ’³€+- ª³�€#��Š °³B·`ˆ`. ��� ’³€+- ª³�à#��ˆ Ƴd· �€�f&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡&æf…Þ ƒ„…‡UFDPAR˜´00É":Ì’:l1DATADATADATADATADATADATADATA·TPNUMB·p·|³–,?)?)¥¥ AW –¼SYSYSYSYTICLz,ÇXÀð¼¬zÀVBxSYSYSYSYTICL(‹?)¥€$ÌXÀ,Ç|³XÀ  ?\)ÊQ|³|³Ì |³¤ |³| MCR &Šö•& & & ææ\æ­ÿˆ ‡À¶Ázý÷ ÞÁtý÷ ÖæÄÿˆ÷�€ý¤ÿæÈÿˆ†w4ÀÊ ÷ 2ÅÊW£0 ‡W£Z ‚W£9ƒW£A‡… wnÿðÀÖ P Ð  " ú‡x ææZZææÿˆ †€ ææZZææÿˆ†wÌÀ x‚ô „SY:SYS$LOGIN:LB:CATCHALL%vQÌSY©D ©\SYæ ÿˆ!†÷% þw°Àdøþˆ´0 û6‡7’ÿ÷5@ø7üÿ„ÿ÷4øxÿæ9æ±ÿˆ‡÷%FøÁŠ Á†æ\ææÿˆ÷^ý4ÿ÷�Zý0ÿ÷•ÿÿ+ÿæ(ÿˆ ‡À^’ ÷ úЕ:ŠÀ\÷ JŠÀ\Е Е@7ZýÁ\÷ Hæ9æ±ÿˆ‡7 âþ7 àþ÷%Â÷Ãâþ÷ 8÷ ì÷ JA†À ýÁ•÷ þþ÷ ÷ Î÷ ,2†ÀýÁ\÷ ðæ9æ±ÿˆ‡7 Šþ7 ˆþ÷%j÷Êþ÷ àÁ™÷ ¢÷ î†ÀÄüÁ•÷ ²Ãbþ÷ ¾Á™÷ €÷ ̆wNÀ\Ñ‹þÁ à¨W Pwb& & & &Šö•�fæ\& & & & & & & ¦¦æ ÿˆÃÞöÃ¥þÃ¥ù’$Ê Ùw<ÁÊ&7ÚýP”P”P”&7Ìý÷ 7Âý·å¾ýЕ ÁÊ÷ ìЇ&7¢ý÷ Þ7˜ý·å”ý‡&7’ý ÷ ì€7‚ý·å~ý‡À¢ÁeBÂ8Ã÷ ‡÷ ̇RUN $/TASK=/CMD=""À\CÁÞ ÷ 00Ì™:�8§3eaek›’x•!ýÁä ÷ jÁ÷ ® æ\ææÿˆÂ\�œ �ÜW ? ƒBWtýÿÁe9ÂEøÿÂe0P��� ÷ ¸Áë ÷ ÁÊ÷ À Áò ÷ Áå\wP”É‹ý‡Â¤ñ• \� W Pwà& & & &Šö•‚fæ\& & & & & & & ¦¦æ ÿˆ÷%Òú%Â.õòE& fæ\æ& æ& & & & ¦¦æ ÿˆÃ$õ‡ææ)ÿˆwº× �ÿwNþˆÄ ÁT÷ Øô†7 rú‡7lú ÂÆô�Á\÷ 4ÿÈ• ÁRúw®ôBÀ\Ð¥: È¥: ÷•Nò÷÷•Fí÷÷•Tè÷‡‘~‡CA. -- Command lostXXXXXX -- Task not in systemTDX -- Unable to spawn MCR to process commandXXXXXX -- Line too longTDX -- Unable to spawn INDIRECT to process commandCVT -- Syntax error÷| xö÷tö6À¶Á� ””””””÷� Vö÷Rö%÷­ Hö÷-DöÀ¶ÁÛ ””””””÷Û &ö÷"ö ÷ó ö÷2ö÷& ö÷öæ¬ÿˆææÿˆ÷ ØøÏææÿˆ²B ¸} z Ôø€Xžâ»z”çšxŽZg²B U(ús Jîv•ôD$éQÊTÄ7RSTUV÷æÿæÿˆL‡÷5Òÿ=æÿˆD‡æ2ÿˆ@‡æ<ÿˆ<‡æÿˆ÷‹¸ÿ/�æBÿˆæZÿˆæ^ÿˆ*‡÷‹šÿ ævÿˆ#‡÷‹Œÿ÷€ÿÀ6 Á€ Ћ·Pjÿ G~÷^ÿ÷Vÿ÷�TÿOÿ÷UHÿ÷�:òAÿ÷U:ÿæŽÿˆæ.ÿæÿˆ TDX -- Version 14.00 ÷’ô÷Žôæ¬ÿˆw–þPIP TI:=ACT /TERM=À?õ‹ w0À6õ‹wfþÁ\… È‹”üÍ‹Q•üÁå\÷ ÎüwúûSET /DEF=[SET /UIC=[õ‹wÔÁ\ÀˆÈ‹”ü… @È‹¤ ûð•,ÿÿÍ‹Q•üÁ Ñ•]Áå\w ûõ‹w–Á\À“È‹”ü… @È‹¤ ûð•,ÿÿÍ‹Q•üÁ Ñ•]Áå\w\ûDEV /LOGSET /SYSUICQUE /FU:ALLACT /ALLSET /DEFSET /UICNCP SHOW KNOWN NODESÀaÀOÀX ÀFÀ;À/À&Á\È‹”üÁå\wÐúMAI DIRMAI READÀºÀ²õ‹åÅ wŒþPIP /FR/PU/DE/LI=TI:Âï ÂßÂãÂçÂëÁ\ÀÚÈ‹”üÍ‹Q•üÁ Ê‹‘”üÁå\÷ ûwDúH|ÔZ yøyx"¬!�!ÃT x 5ðK Œp&�y(xå—˜™š³W¶zb"öH! z;"x(¸.xs8†@y ¦ÃPDŦ÷ Ô†wjûÁZôÀ(Å\Õ ~fÀ\ ÷ ¦ Е.Àe �Ó ÷ ” Е.Е, �Ý ÷ € Е.ÀeЕ �Â÷ x ÀeЕ  �ÓÂ÷ r Е, �ÝÂ÷ b ÀeЕ$�Â"÷ b ÀeЕ%�÷ ìÀeЕ"—£ ƒ—£‚�“Е< �ÓÁ Aâ÷ ÀЕ>ÁÔø€ —­ ƒ—­‚��Е< �ÝÁ Aâ÷ †Е>ÁÔøÀå\÷\dð7bðwÐû÷Hæý÷|þÎe7 Ðý7 Îý7 Ìý7 Êý‡÷eÄýÿ¾ý‡÷e¶ýÿ°ý‡÷e¨ýÿ¢ý‡÷ešýÿ ”ý‡÷åŒý‡Àºý÷å´ý×-tý×-rý?` ýì×-^ý×-Týõ?àŠý÷åHýÞÁŸ~ýÁv?tý7 :ýÔ×/6ý ÷å,ýÀ\ý÷åVý×-ý?pJýFý‡÷åýÁ:ý?6ý ?r0ý?,ýò×/òüÎe‡×/äüÎe‡÷ Ìü7 Æü×­�+×­ˆ-×­€, ×­x ×­pÎe ‡ÎeüÎeù÷ ˆü7 ‚ü×­L+×­D- ×­<,×­4>Îe ‡ÎeüÎeù÷eNü‡×-Jü? zü÷å<ü‡×­þ>×­ö+×­î-×­æ,×­Þ ×­ÖÎe‡÷øûû÷eòû÷êûô÷êûñ÷eàû‡÷eüÿ  ü×-Îû? þû÷ Âû÷‡÷z‡÷eèûÿ�tâû‡÷eÚûÿ�fÔû÷åÎû7 T¡÷eÂûÿ•¼û÷å¶ûÿ�B°û7 6’÷e¤û?  û‡Á�*Áå0À’ût@`?ˆû‡Á�Áå7ó÷evû? rû‡Â�üÂåÀdûp(�`Zû‡Â�äÂå@óÂ�ÚÂå î ì÷<ûZð‡w  „ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ j E�€Aa×$Ò±œÿÿ‡÷ &÷ &÷ �’•’•€‡@Á(÷ B f€  Àe ÀeÉÿÀe Àe ‡7 &f¦wì÷‹è÷ Æ7 à7ÞÀâÈ @•,€ÀåÀÿq `-KacJE[à !Ãm¢Äíž@•Á †Õ Á ûα)÷ L÷ R†é  çà å÷j7•jà f@• †Õ †&Ý €…Ò€Ö À5]U ¦†E¤¯‚…€Á(‡ :Á‚æ&@E÷ ÿA ·Îà· ̆ª ÷ Š÷ Р¢ÂÀEÿ÷ vœÀEÀÿÀ €cÁÐÂΤ‘Á ü¢ÿ­÷‹¹‰÷­´±¦†„÷ @�Á à £.„ à · ’æ&fÅŠÄ„ÃÁ ÷ z ÷ ~ …„ƒ¶à ÷ 8 †À ÷ "†À £.£$· B„ à ë÷ 8‡Ì¥Z‡£A‡Ì¥9‡£0 ‡ à £ £ ‚ „ à ö‡"  2 + ) 2 0 � p2 6  À\¦<~ºȇh~0ÈhŒ0<†Œº<šºȇhš0À†<À²ÈÀö>ö+È-È,„ÈÀ†¶0À†¾@*/îІ ü<¨ºȇh¨0*/îІ @À†6ÀR À„À`JÀ„ÜÀnÈÀÖ+È-È,È Ö„Ö-^hÀ€Âf$ÒŠ'†Þ"ä%„òÈ�´È´šÀ†öÈ´¦À†öÈ´öÀ†öÔÞAöBöCöDöEöF†öІ´À‚†ЂŽІœÀ‚È�È00Ì¡:’:l1DATADATADATADATADATADATADATAÀ†öÈöÀ†ö$.#8. Ô Ò†$2Aÿÿÿÿèæ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w …�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ ÎW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡w ÷ 4‡wƇw ÷ $ú‡w¼w ú÷ ó‡w´ÁeBÉ ð 8÷ ü‡$&w Ìð*ðµ<S1 ¦à Ö KÊ ñU€ò ñU@ò æ÷ 惂f&œ" ÷ 4€�†‚×'&�ÿ)×'&ëÿð&* ðÊ*Ä%0þðÌ*±‡NDÅ Å ý¦æ÷ Lƒ‚÷ ñEÿû±U‡÷ ~‡÷ œ‡÷ b‡f&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&æf…Þ ƒ„…‡Ä Ä Ä ðµf÷ Úð >€5>õE€u ÷ 2�‡ñ ± ‡&æ¦ff… Þ �‚ƒ„…‡w àÿBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=wHÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡ð*ðµ;ðµ7ðµ#3w Vþ *’$Ê ':æƒô �ô�…T•à ýƒñU@…Ê% D•ÄDÓÄ%][Ä%><wl÷  †wÐññ1 ‡Ã ÄÄ%ñ,ñ,ñññ:4Š× ±‡w œýð*DÅ Å ýæ¦Y…‚T¦fÃ(ÃeŠæ„ðµ<Ó•_‚ S•Ä ýó¥:ÿÿÓ•:‚ ƒ…¦æ& œ"& ΕæÏÿˆ‚4†×'&�ÿ ð&*×'&ëÿð¤ÿ*±*ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ X ‡à ññ÷ Þüð•Éÿ*‚ƒ‡w ¬üð*æ ƒ ‚æ¦×¢"wf)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷ ´‡eÄ%w ñU\ñ5@ƒ âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ "ñ5@\ñU@ñ5€áÄ„íÄ ñ5LñUþ¥*ñUÄ Å‚öƒàÎàà Ê¥*Ã%C!.D`÷ ”*‡ƒ‚wòþÆeCÃ5€ñU‚Ã5 ±±± Ã5€± Ã5@±‡Æeð•Êÿ*±‡ðµ=õñU„Ä EÅe& ÷ RÄEÅe÷ Ö ¼Ó¥"Ý öŽwVþö Ë¥"  ƒ Ë¥"ö Õ”Ä Â Ä î ƒ  ê¶ Õ• Ä ü‡w ˜úÁ w ŽúÁ& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡0Š+æ1ÿˆÅ(Åe à ÷ @ß%ÿÿ&ïp’*w„÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ `8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡ð‹*±‡ð*‡Â(Âe(¦Ê ññ1 ÷ `£(£(£££‚÷ X†� ‚÷ >âââââ‚:ƒô �ô�‚””à ý¡Á5Á ±‡ÂeCÃe¡‡æ¦ƒ‚ÃåJ„”Ä¥[Ä¥<C…Å`¥ ¡>C÷ ˆÒ¥,÷ ~… 4ÃB‚ƒ‚× *‚㨂 DÄe $ $ $ ÷ >‡ñz ñññ÷ Ö÷‡DEÅe     ýð•Ìÿ*1 ±‚ƒ‡ Ë•0‹¤þ‹¨‡—¢3‚¥÷ "÷ Ä ‹¨ ¥Ë”Ó”¦æ£˜Ä ýƒ‚‡‹¢‡Ê¥7‡¥‡æ5æ±ÿˆ‡ß%& Ëw r÷&Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë å¥.‹ Ä ÅæU¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë ‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±û&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡TaÞ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡±‡00Ö0=�8§3eaek›’|³º~–,?J?JY) W 2ˆ— ÅTITISYSYTICLWKOV†±VγøˆÚbŽ.„ γ±Vγ÷5�wJw>f&¦‚Þ €�‚‡&æÿˆæ3ÿˆ„7ÿ¤ê TKB>Ñ̆L$  À @ à € €%2€>K€Wd€p}€‰–€¢8©°©(ª ª«�«¬€¬Ð¬x¯ð¯h°à°X±Ð±H²g³p³z³ÐW <°n¬¢¯”DSYSYSYSYTICL\L&TKB -- *FATAL*-Run abortedÀôÈ Ð·Zü÷øþÆPüÅnÄ>÷ ú Ìe÷ Œ ÷ ÷  Œ ÷  Œ Í5÷  ÷  Œ Í5 ÷  ÀÈþ÷  ÷5~þÖÀû÷ þ À°þ÷ ö À�þ÷ ôúw ö ÷5bþCŠÃÁ‹ �ÁÅ€÷ ø ÷ ì BÁŒ÷ f‡÷5€0þ÷ âü× †×-Fþ †÷<þ÷5þ÷.þ±‡÷$þ÷ æ÷ 6 ÷5€îý÷  üwVÿÁnÂ÷ wVÿÀ P�æþÿˆ‡wŒfû‡ÁÂû÷ ž÷ $ȲûÁ°û÷ Ž÷ Ȧû‡f&f÷ x7Jû�÷ nwŠû7†û7‚û÷ À‚ �� �`wjû ÷ Xw^û ‡7,\û‚ó‡7,Tûï‡  ±…‡æTÂ.Þ Â.– ‡Þ ænõ@‡Ð  � ¦÷ ò‚¡Þ ’$õ€ò þÿî’$±öfE7¦ú÷ 4€`Â. æXÞ Â. ‡5,‚÷‡5,ó‡  ±– …‡Á4 u$†· ^ú†‚ ø ‡ 1,ù‡‚1,ô‡J ‡±1,ù1,õ‡Á¸÷ &Äbúô Äeø� m÷ 7Dú„¡Þ &Ä8ú÷ e$â$)d÷ ö÷„±‡÷5ü‡w Œ & Ã~ÅÄÃAÁ ÷ r7òù@m7èù÷ *1 C7ŠÜù÷ øpMŽ ÷ ˜ð w" ÷ „ð ·Š¨ù7¨ù /÷ hð *w’ù÷ ä÷ À7‚ùw€ù ÷ F÷ ̃`÷Šdù÷ Òô·ŠVùÀTù÷ òÁefA÷  ÷ ^w:ù÷ l7.ùw,ù÷ ò÷ xÁù÷ œÀ ù÷ z& &Žì—%ƒ÷ –N õÁèø÷  V €÷ ÎÃÔø÷ ÷ 2Â÷ TÃÄøÁÈø÷ �ðs÷¬ø¬ø÷¦øÁªø÷ îÄewºþ÷ ò÷ ‚÷ Ð÷ A÷ ~ø‡CàÀ(ÂÁ ÷ Ò ‡w æCB�±÷ *÷ Zø‡‡÷54ú‡w ÀÅ„eCå %Eľ& 7 .øB�d÷ ð÷ ‡wø�ãdd�cA�cAdã±Áì÷¡– 7Ö÷‡æA÷ T&ÀeÐ Ð Ð Ð ÃÂCmõ †ˆ &�‚mŠó€ƒ‡æŽ`ÎeÞæŽ`Þ‡÷‹ˆ÷00Ö8=’:l1DATADATADATADATADATADATADATAÓ Ãƒ`ƒ ¡±‡fà‘`‰²B`Šá ‡÷ J¦÷‹P÷ ÷ Òÿ‚÷ †æ÷ °ÿæƒ÷ ”ÿ÷ *÷±÷ ¡ƒ– ‡‹ ƒàò ² ‡ ±`p ð ‡f& €`ð,ø‚ ‡ð,ó‚‡ð, î‚& �à� �mV ‚– ‡·õÀBæ‚ã‚ �c€e ý‡w ÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡Á € ÁeÁE€± ,ù‡pàJ`‚2 ‡ÀÐ" &àe·#þø÷ D€÷ ~ð‡Á(  ˆ‡&÷ ÁeB—%þÿÁe‡1bÀe1^1\1H1J1L1N1P‡&&f÷ t�÷ ¤ÿ€h÷ ˆÿ÷eþÿÔõ¿ÐõÞ ÷eÈõ‡w ö÷ â‡EÅÁ‹Á÷ ÜÂr÷ AÑÁ B` ðd÷7^÷p‘AÁ÷ w”ÁL ÷ ²øw ¨EÅ÷ p†Á÷ ’Ä(÷ BÑ „` p‘÷ Šð÷7 ÷ð ÷AÁŠÅÅ @aÀe· úö· òö‡Áe?ÁE? ‡& fŽ Ž Ž Ž Ž Ž æYÿˆ‡· Æö · ÀöÀœ0 úBŠÂÀ¢ö €`±¡ Àœ±¬ùð€ö‡w ÞfÀ( ÷ øýE†Ã Â— Àÿ †Á@÷ jÿ‡w`ÞôK`/ËÿÿÄœ Ãÿÿ& D -ù‚ô‹öNñ ±òµ÷ vÃö €ÜÀ ` ƒ³ÁÀ(÷ 0ý�µ– – ‡·$ò÷ ÿ‡°Š‡·ò÷ úþ‡ðЇ·ò÷ êþ‡ðÕ‡BÁžõ¡ B — ‚ @€` ‡Š ƒ‚ B`·xõ¡±‡¦÷ *þ÷ �ÿ‚‡·°ñ€ ÷ þ÷ œÿˆv  ÷ üý÷ ‚ÿ€mˆ‡¡ �`÷ äý±@÷ Øý¡‡°&×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ ”2:%ÿ Œ2(ÿ „Jt)ÿ |n|'ÿ tž(ÿ l¶àÿ dÎFÿ \òÿ T".ÿ Ljâÿ Dލ2ÿ <¦²5ÿ 4¦ò6ÿ ,¦¬6ÿ $¦$9ÿ ¾è3ÿ îJIÿ úLI¦Þ5Îe‡w œÁ,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡w¼ù èŽ�ÿÿÿÿ4Ê5¦ „Ê €‚Ê5ùà ÷ƒõ…2Å Å ÍUEÍ ø�‚‡ ˆ Fì8‡ÊEò ÊU ‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&æ¦ff… Þ �‚ƒ„…‡&æf…Þ ƒ„…‡‡ &v ��2ž�¤$Ä&>�¤$pJ&n�&>V�&>b�&œ>J!�¤$ z&2%�Ä*´n†)�Ä*¼n’,�Ä* nz0�Ъ<�¶&=��ªÂK�|Ϊ"M�”ØÚÂòP�lìÎæZ�lp ÎÚa�”, þÂÎh�À&Àò l�À&¸òo�À&¤òþr�4 .ªjy�L#|:"^{�È&h.F€�È&€.R„�È&ô.:†�L#€".‰�Tª¶”¨2‚â”�¨2 vŽš�¨24vš��¨2 v¦£�¨2œv²¯�¨2D v¾µ�¨2PÊv‚·�ø4°¾Ö»�ø4ȾÊÀDIîÀ�DI�âúÁ�DIÄâîÂJ&æ¦f&¦ v Þ €�‚ƒ„…‡€SYxQSYâySY^SYº~xQSY¢_SY»zjL¢_LB[1,1],SY>CC@ÐDAÐLB ÐÍMPÐSSÐMA€ÑDL`ÐSHnSPoCR@nMA€+WI nHDÑPIÐCOvLI vCP€ÑDAÐFP@ÐMM€n-PIÐPRÐ'SQnTR€ÐXT€n3ACÐ'EA ÐHDÑPM@ÐSL ÐMUÐFUnROoAL€ÑCMÐSEÑIPwNMvCOvLI vSGwXHnIDnELvFMvCL vSBpFO@vîõü HÔ&$>DPb¶æØ00Ö@=�8§3eaek›’ô5b÷ Ü÷ Âw¶ÀîÁŠÀeÁ û‡w b÷7 ²ùÀféð5 b$Å6Ãçæ ÃeÎ Ë‹úÀ÷ È ±ó Ä6! Á"÷ ñwjù¡ü– ‡ñ•ñ•w öö@pdf ¦Â4÷ ‚‚�B„œ$‡Äµ4ĵ!ò%'‡ò% ‡ò%‡E$ÂeæƒÕ�@à P”üÎ öÖ ÁÁ7Âe Á:Âe Á8Âe÷ jé±& ĵ€ V ‡11@÷ �†BÂeÁ÷ :鱇w ö5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ 8œ*AdBbAÁepÂ& ¦fƒÂÁ ÷ – –‡ÁPõµ aA”Aíf@pnp÷ êC*8Ö‹Á ÷ Ì88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ õÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw 4ôõ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ R5fµ fˇðµ ÇÈ•÷ >‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ ÊDlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ ¼½•8 †õ¥öÿ*ΚÎn‡w öòõ 8µŠjDl@÷ €T”ÔÀeBTŸ8œ5l@÷ 2‡@Á(ñ D÷ 0ÁeB&÷ R‡÷ ‡& ææ©ÿˆ@ð•#÷ ú& æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡ÿ üð2T'ÿ ôð>Ò%ÿ ìð‚Z4ÿ äð‚7ÿ Üðލ2ÿ Ôðš®2ÿ Ìðšú6ÿ Äðš¸7ÿ ¼ð¦;ÿ ´ð¦ =ÿ ¬ð¦r=ÿ ¤ð¦ò7ÿ œð²î2÷ hó¦Âe°ÄeȵÄeà Ã~÷ ˆÿ‡Á DE  ȵÄ2…Åe &Âe ÷ Ö€ †ß%�ÿ&'ðÕ@±^ÃeðÅÁ5€ðÕÁ5@ðÕÁ5ðÕÁ58ðÕÅ“B„Äe€Ãe°ÈµÁeÄeÐÿ& q1””BÓ$ðñðñ„Äe q1 ””Bð ñð ñ¡–‡æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡†JA¾$?¾$2–%%%LB[1,1]ODT.OBJODTID.OBJÊ~¨@ w Æî÷ â÷ÜÝâÝ÷]ÐÝ àľàÁ,÷ Ü÷ ІwŒáA÷ Fø÷‡ô¨Ýb÷®Ýüß÷ªÝðßôZ&Ãúÿô4%d3 î3 ®$ÀeBÁ Á ýA÷ T÷‡÷ D‡÷\:%°ßÃ%úÿô5b÷E¤ßõ5 ÷E–ßõ5÷UˆßÀVß Àå� ƒÁBÂe÷ üà÷ 4÷ ¬é3®$sî× üÿ]À@@ÀMBßX7 ÞÝ7 ÜÝ&&$&ôµ!ôµÆå €&&"æÿˆÆe À5'÷UöÞ7\’Ý7^ŽÝôÒ&$Á@PP÷ `†÷E@ÌÞÁBÜ÷ &éw²Ý÷ ’÷ é7îýw*Ü4 Pô@þN÷ xwÜ$°´&4 bôe&Ãew˜þÀ²ýÁ°ý ÃÿíBÂ@°PÂ@±PÀèÂ÷ ¬è úôDdôìÛb÷üjý7 dý÷ À†Á ÷ ºßw õÀ(Á,B÷ †å&&&$ÁzÛ$÷ äæð5÷5ìÝ÷ ˆý÷$%„ýô %$÷ º(‡ðb÷ –À°ÝÀe5Â÷ ~è÷ XÞô&ô2$7 DÞ÷ ‚‡÷ dw6ÞðHÛ´$´&‡`Á9÷ ß÷ ^†Á `÷ üÞ,\NL¡±‡ÀîÝ÷ ²åÀâÙ÷ ‚÷‡ÀØÙ Á¼ÛBA°bpd÷ ˆõ‡fîwôh·ô�` Š �ÜÁ�ÒÁ%/ -Á%/*Á%//$Àp¡‡œ`Â¥öÿÁÂ¥ÿÿÁÂ¥þÿ00ÖH=’:l1DATADATADATADATADATADATADATA ÁÂ¥ýÿÁ Â¥üÿÁÂef÷ BÞ÷U Ü±‡ÂÚûÂeÂE ÷ Îåæ²$ÿˆ&À6׿º$ÿˆÀmÞû€ ‡ ÀíÒû ‡ÀíÊûž¦ ÊÀûà�bŠå‚‡÷ ÀÒÁâ Á ý· @Ü÷æÙ.Ü7 ÐÜ7 ”ÚÀÄÜ8 f÷ „ä7 ÎÚÀ(ÁòH ‰·¼ÚÁþÿæÞ$æ?ÿˆ÷xûÖÛ÷%ÎÛ 7 ÈÛ÷ <ÿ·’ÚÀ ÷U€ÊÛ÷U€ÄÛ÷ ºW‡÷@ŠÛ7 ¬Ü÷ ¸Û÷ ÀÛ÷|ÛÁf÷ 4äwÚÁ‚P” ýÁ÷ äwpÛÁ÷ äwfÛ÷UjÛ÷ Fð• ðPÛðLÛ w>ÛwèÙ7ÜÙÁe @ÁªÙ÷  Ý÷ zÝ7 Ü÷E€,Û÷FÛ÷*Ú7 úÙ7 øÙ÷\ÜÚ‡ÁK ÷ ¢Üw ˜éw0ÛÀ¢      ÷Û7 Û7 Û7 ÛÀ( W, (‡Á÷ Œ7ìÚÁ÷ €7âÚÁÜÚ ÀèÚæþÿð8úð•#÷ D †ð%è* 7 ú ï�7 úìŽ ÷ .‡Ž ±€‡÷ œù÷ "ý%‡A÷ œòö‡ñµ ÁÂp÷ ÞÛë÷rù÷ RñÀÔÚAÿ dù7^ùÞ‡÷ Rñ†ÂpÁN÷ °Û‡Áøê÷ òâ&&÷ �Á9?‡ÁäÙ÷ Üâ÷ bäÁŒÚÀePHHJ÷ Äꈠ÷  ð5@÷ jÚÂpÁ wZÚðl× ð’ê À�ÙÀe5Â÷ ^äÀ4Úð@×b÷ ÿ ‡÷ Ö†Á9`÷ Ûî‡ÀÚ&&ð5 bðð&÷ >°&‡ÿ çš®2ÿ 皎7ÿ 皨2ÿ 禲5ÿ þæ¦è5ÿ öæ¦ö5ÿ îæ¦R6ÿ ææ²¨2ÿ Þæ²¸2ô5uuuu w .î÷ "÷ &w*Á¼$A±q#úq-ö‡ÿ @íJ"'ÿ 8íVR&ÿ 0íbJ&Ö¯R(1±Rg(“±Ì…(ß±à`ý(ó¯Ð )Â&3ÿâ&ê TKB>l^SY†7 –ý÷¼$’ý7 þÀ8ßÀe`Á2& ý÷ †æÁ¼Þñ@bp$$Àß0 b÷ hö@‡Àef7úô` Š÷ žÈ¥;ìÈ‹êÅJ&% % % % ÷ ŒÂ¥:uu÷ r÷ vÀ & ”W¤ û‚ÿ ªôÁ ÷€e)Á&I#q-'ÁeW 2&õ‡Á$0Âefœ`Á × üÿÁ× ÂeâÿÁ × þÿÁ^× öÿÁ ÷ ÞÞAÁ5 Â¥;U%ÁEÉ ‹Á#wÖ ÷ øüÁ(w we)÷ ¼e)Á(Í ræ æâ)Ä�e)÷ Že)Á)Í lÄ æ æ˜)÷ ¼U%ƒ Â¥;Â¥,Q÷ d÷ Xe)S#S-ã Ó$Ë ÷Á*IÄÂË ã€ÄÒáÁ ÷ $‘%‘QüÿQ *& ÷ NüÁ&1Í &f÷ JÁVóÁe f÷ ì�Ö 7"üÒ ÁRRRÁ2óACà`Ãe ÒR”þ?jû7fû‡Á%÷ ~ü†‡Á'Âó÷ –Ý·rØÀðÜ÷ 0ö÷ „Á2&ÂÀe`P ý‡£ &€ÿ,@ÿ 3ÿ@8€„K@oMBaÿTq ÿØrÿt@,ÿYeÿÜYxx@ÿßY`èYè5ÿ 4鎨2ÿ ,馲5ÿ $é¦î7ÿ é¦,8ÿ é¦ò7ý¨X[<$09AZ (),-*! ¨'ú&4'¾&n'�'Ð&R'R'R'7 ¾ÿ7 Êÿ7 Èÿ7 Xþ7 vÝ÷¶ÿÀÀ$ P @%ú‡ÃÂ$ÀH% #ÄÒ%À¾þ$$÷ :Å"&B“‚ Á Á üœr0¤$Iz<&Ã%Â$U÷^ÿZÿ7 XÿO× Â$÷‹Jÿ8÷€Dÿ÷5€†ÞM÷5~ÞI÷€ÞE÷ ¼ý÷ ÿ· °ýÓ$× @%†Í¥pÍ¥&ðÕ€7 øþ Á-A#÷ ~ý÷ xýã(× Â$†3Á%2Â$&Õ¥J“ÊÅÅ °Ò÷ ¨þ÷ Hý° ·`Ü#7 �þ ÍEwÿÍ¥Â$&J�ÊÅ·nþî#× Â$Á.w‡È‹È¥;!Î%†%õ ‡ÀD%ü‹9ü¥;5Á&H¤1H¤/H¤-H¤‚H¤)†H¤‚H¢%†Å”u 1&Å ûÁ+wª÷ –ÿÀ@%W­7&ÀL%W­7& Á÷ ¬ðp�7&‡Å(&&÷ ¤À e)È¥:2È¥./È¥[,È¥<)È¥/&�ãW !†÷ Tý‡Ö ÷ &ÿñ‹ fAœf÷ J…‚‘”Å ý‡!R%ƒdd‰Á,w€Åê& ȋȥ-È¥)È¥(È¥*Πȥ, Ž È¥[Πȥ]Î ”âÖ Z÷ ¤þÁ,÷ ÒÅåêðêp÷ ¸J‡÷ PóÀÒÜA÷ ÀóA‡÷ TóÁN>‡À(Á,B÷ ŠãÀ®Ü&&ð5 bðð&÷ ’°&`Á90‡÷ pð5@÷ ~ÜwxÜðŠÙð²ì ÂdÜòpÙbfÁ÷ 6Ñ Ñ‘‡Á%ÂpœŠâå Àe 2÷ Ýÿ Ré‚Z4ÿ J馲5ÿ Bé¦è5ÿ :é¦î7ÿ 2鲨200ÖP=�8§3eaek›’1±o†?±y‹„'¾' '¾'À'‚(„'„'ô(Î)v)ż$÷ 0Á’Ü÷ þç7Îÿ7 Ìÿ÷€Èÿ÷5¾ÿ÷EºÿÀÀ$Ð P @%ú‡ÄÂ$ÁÊÞ÷ ’é÷ Hé÷ æÁhÝ÷ <é÷ (éÄÀ$÷ Î%!@%ù‡À@÷5hÿÀÕ7Hÿ7Lÿ÷ ªÞ÷5Nÿ÷ˆÝÁ†ÝW  Á � Á CÁ ÷  74ÞÀ`7\ÞÅ&÷ ÷ ÆÜ5Å&Á<Þ÷ é÷ ºèõµ· .Ý´ dÁ÷ ÈæpppðˆÜ ÀÞUÀe÷ pà÷ JàAÁåÀf÷ Àã÷ ðáÁÞÝ÷ Pè‡Á‚Ü÷ Ìæ7pÜÜÂEz4&ó5õUÀð¥æƒ÷ �ã‡÷ ä÷ úç÷5 Ýp  p´´pp��õµõ f&÷ f€°�p÷5`Ý&÷ N€°´p �ðÕó5õUfu°p ð¾Û7°Ûw´Û÷ tç�÷ ôå÷ zçðžÛÁñ¥<ƒ÷ ÐfwXÀð¥2ƒ÷ ÷5ØÜp  p´´pp��÷ çu ðNÛ wHÛ ÷ ç÷ ç÷ z÷ ‚å& Á,Û÷ ðæ�÷ @ç÷ öæwÛw�þÁÁeÁå@Àe÷ xß2†Á÷ øäfðððœðÅó5ðÕÀÌÚÀe ÷ ŽÞ†÷ fÞ÷5Ü Á÷ D°ÁžÚ9–1–Ö õ G@Á÷ Úä÷ `æw ŽÜÁe & NÎe ó5ðU À^ÚÀe5Â÷ ~æ�õ !÷ ”ä55ó5õUõÅÛÿõÜ÷-ÚnÛõÅõõõµóµ€÷5€VÛ÷5NÛõÕ÷ 8uµ�÷54Û÷ $u µ´w8ýÌ%æ´Ù÷ *ý�Ì$)‡Á÷ žãð]Âû · Û¶û÷e°û‡E B�œÁE€ÿÀ(E÷ NâÅ ô‡ÿ œè¦²5ÿ ”è¦R6ª*²*š*š*š*š*š*š*š*š*š*²*š*š*š*š*š*š*š*š*š*ª*º*ª*ª*ª*ª*ª*ª*ª*ª*²*ª*ª*²*ì'š*š*š*š*š*š*š*š*²*š*ª*ª*²*š*²*²*²*z*‚*ª*z*‚*ª*b*b*Š*r*ª*j*"*²*ª*²*š*š*ª*ª*š*š*š*š*š*š*š*š*š*š*š*š*š*š*š*š*²*²*²*ª*Æ.ª*²*²*š*š*š*ª*²*²*Ÿ s¥$Ä*£ @€–,A|%w „ì÷ Î÷à ¢Û÷5ÞÝ ÀvÚðÅa÷N'TÜ÷ ”‡7 JÜ•!Àê÷ bô‡&ü „øÀDÚðÕa÷ ùÀžÜÀm”Ü€  ƒ÷’Ýw^÷ ÂÀ ÷ ¤‡fÁ^Ý÷ Væ÷ Üç�‡¦÷ èÿÁHÝ÷ ªçÀed7úþAÁåÀe¾ÿ÷ Rà1†Î‹· ,Ü¿ ÞþÁ÷ Æåpp°UðÕ@pMðzÛ ÀöÜ%Àe÷ dß÷ >ß×-úÛ Åå AÀf÷ ¬â÷ Üà±‡Ö ‡·PÙÀnÙðÕa÷ FøÁÂp÷ XÞ‡w Lë÷ vw Bë÷ lÅpÛ Ä¸Û÷ r7"jÜ7,dÜ9ÃX7Žü÷EõÿˆüÃA3"3,'ó5@ó5îÄÄEõÿÄ-XüçÄÅ ÷ à #ÂŒ   B`‡ „ ‡E ‚Ö Ä¼ýÔ Äe3#3-Å õ±¡‡÷ ØÛ±€w zê&ÄBÀp'Äv'æt'ÿˆ ‡Á&ÂÊû÷5Æû €‡w >ê÷ÿÿ´û& æˆÛ· ªû¦�÷ Hæ7Úw"ÚÍ �÷ hä÷ Þå& íÖ ¶#ê–%÷ vû�÷ DäóÖ ‡ÿ "éz°/ÿ éz˜0ÿ é†+ÿ é†þ*ÿ é†î.ÿ úè†�/ÿ òè’+ÿ êè’Z0ÿ âè’21ÿ Úè‚’3ÿ Òè‚,4ÿ Êè‚44ÿ Âè‚ì2ÿ ºè‚r3ÿ ²è‚$4ÿ ªè¦²5ÿ ¢è¦¶7ÿ šè¦,8ÿ ’覰7ÿ Šè¦ò7ÿ ‚è¦â7ÃSwÊý Ä·×ÁÁ Áe ÷ ®ÿà wêw䨇·öÖ@$à ÁÈ "ú‚7$lúƒ7þÿdúÁ óÁÁ Áe÷ pÿ?:Ù76ÙÐ PAPÐÐ�Pà ý‡Ã0wRý·¢Ö÷,Úw¦Øw¤Ø÷@ ØÅø÷ ¦üÁôÙwfäW#€‚Í Í w´Ø‡ÃTwý÷5€äÙ÷âù7  Ù7  Ø7 žØ÷ÿ®ØÍe ‡ÍEM M M MŒÍw–؇·(ÖÁÁ Áe÷ Äþă ?dÙ7`ÙÐ È(ûÐåPPPà ý‡·òÕÁ'·èÕÁ'ee·ÚÕAÁåÀ\÷ Ú܆Á ÷ jþpppÀ\÷ œÜp‡·žÕæ‚“÷ ´û‡Î ðµ· ü׿ ®úðÅ ðµ÷ ä×ÿ –ú°Óp÷ PãÖ ÁÄØw6ã·JÕ& Öw¤×w¢×‡÷5 ÂØÃmwØûæXúæ00ÖX=’:l1DATADATADATADATADATADATADATAVúwPúwNú7 LúÀò,÷ èü·>ú·8ú÷ 8úÃlw¦û‡&À ×7,ú 7,ú ÁþÖ÷ ÒâðU· ú€‡÷VØÀäÔðÕa÷ ¼ówôüÀÒÔðÕa÷ ªówêüÀÀÔðÕa÷ ˜ó÷UØwâüU%Í W# †w×w ×wׇw:·hÔ@× A÷ îû@‡$Á5?7Â5?3ÂŒB B B @÷5€¶× *·t×Á=¬÷%Á ÷5€œ×÷5ž÷÷ Ôú‡· îÕƒ÷5Š÷7N×7L×wŒÖ·:Ö·8Ö÷j÷‡Ã@ÃRw|úW#ú‚w"ׇÃ5whúÍ w8ׇ·°ÓÀÌø  AÁEøÿBÜh'C ƒCÀ ö·�|Õ÷�ìÖ‡·†ÓÀ¢ø  AÁEøÿBÜh'C ƒCÀ ö·�TÕ÷�ÃÖ‡wÈÖwÆÖ‡wæÖwäÖ‡U%Í W# †wØÕwÒÕwÌÕ‡Ã6wÖùw¸Ö‡Ð¥[÷ 8Â¥,å‹f™÷ (�Â¥]å‹U�÷ °û”‡Ö ÂpÁ÷ ر‡&÷ ŒûÂ¥.€å ÷ Žû÷ ‚û”Ö ‡w#Lö‡W#ú‚w@Õ‡Ã1wVùW#& W#BaÃwBù÷ä ÒÓ‡÷à ÊÓ‡wòúW#ƒW#‚÷ÖwöÔ‡ÃUÛ·`Òæ·XÒ& Á÷ öú°?ðÕ7ìÕ PH‡Â pÂ¥;mÂ¥!÷ šÈ¥;eÅ'÷ „Â¥=7e)Ä„%t#t-Äe ! 'ô‡Á87 ÷ È‹-È¥;*ÃEÅ'· îöô­êö÷ 6Û Â¥,Â¥! Â¥;Â¥:éÁÁ ô5Á ô­¦öÁ!œÑòÕaÀ’Ñ÷ pðÂp÷ „ÖÅ'Ãzö¡±‡w hã&Á"÷ dÝwlö7föÂòˆJ· :Óõ•ÿÿ€fÅe& ÷ žÂ +— ;(— !%— ,— :)Ž —£%êŽ —£ …Õ ÷ Dµ“þÿ¶Š— ,— :Ù÷ D— : ô—£ö‹Ö …5Ї–%ÁÂpw¼Õÿ îá‚r3ÿ æá¦î7ÿ Þá¦,8ÿ Öᦰ7ÿ Îá¦ò7LB[1,1]LB[1,1]:-0-Ö.:-õU,÷ ëÀÛ÷ ÈâÁæÁeà÷ <7¤ÿÁÀÆ* Á ýÃB÷5@ú÷58ú7÷€Šÿ÷SY’ÿBÂe÷ FÁÆ*ÂÀeB ýÁeâÿ  ÷âyXÿB,D.�&Î Î Î Î ‚ÕÃC! ‚ÂU@÷5€ÊÙ„    w" Å ÿÃDÀNÚð•#÷ | ‡ð•ðð•÷ l~‡Ãd÷5„ù ÷ þ×÷ rÙp÷ jÙ÷ bÙ Ãcñ5bÂU÷U@NÙñ5€ÂU÷5€4ÙÂU@ñ5 ÂU ÷ ÄúÂU @ @ìÀEÿÀ @ @ @ 7�°úQ$@ææPÎ ý– ð5øÿðU@øÿÎ ñ– Å*þe)µÀÌ*55÷5€¼ØÂ5uí uí ÃC55a 5a ‡À4Ù÷ `À*Ù÷ Vwè÷%h×A‡7 Úý÷ ’7 ÎýÃGÀö*AÁ5·ZØ÷U@XØÁ5@$Á5Ð X ÷5€6ØÃPAÁ=,øLB BàÂe@ÂE?B B BŒÂ@$õ5÷ Fû÷ JûÃ=¸‡ÃCÄ\Œ #‡wHAW ‡wÜ×÷UÔ×Ã\Á¬ÖAmí‡w¢ÖA�÷ Xùw "ýwýw` ÖÃXu-÷5˜÷zC÷5@Š× Ã5Ã5€€õE€Á ÷ P, Ð U%ÁPÁ ý÷ T×÷ D÷ ÈÕú÷ 0÷ Žá0(fÁìÔÁEÿÁUÃ5ÁU€Ã €ÁU÷ –Õð´ø*ÁUp÷ †ùÀej1ˆ�`÷ LáÍ (e)w^þÁÌ*QQ Àn×&$&&°$ðÆ*&÷ À‡°&°$‡–%– BÂeÁ>w4Ø÷ ¼ù7 ”ÖÂâûÁæÀ(wúÝÀÓ ÁþÔBA°bpd÷ Êî‡fîwZíh·Tí�` Š �ÜÁ�ÒÁ%/ -Á%/*Á%//$Àp¡‡œ`Â¥öÿÁÂ¥ÿÿÁÂ¥þÿ ÁÂ¥ýÿÁ Â¥üÿÁÂef÷ „×÷UâÕ±‡÷ €æÄ|÷Å'fB�Á Á ýõæ*õõè* õ 5�.ô‹€õU€.5�-æ'µÄe& €÷ z÷ t�@ ѥ ûÁ àu÷ èúN#N…à áÄæö´•–%7 Üö÷m¨ú0Ô‡ÿ ü⎨2ÿ ôâš®2ÿ ìâ¦;ÿ ä⦲5ÿ Üâ¦â5ÿ Ôâ¦Ü5ÿ Ìâ¦d3ÿ ÄⲨ2?ÿ @`€ Ààÿÿ_ÿ?î*Units set to maximum assignedŽ,†,†,æÞæ=ÿˆ÷5LÚ÷PÚÀFÙÀm<Ù  ƒ÷%<Ú ƒÁV U÷-$Ù"ú †÷úÙÁ1Âê*÷ ¢ÛÀ^Á*B w,úØ‚ H`Áeó÷ÿÿ6ÿ÷ÿÿ2ÿÁìØÂšØ÷5Îù*÷5Æù& ÷ Èý†ÁF‚÷5€¨Ù ·fÙ÷ àü ‡Á=˜ù · ôׂw¢Ø·PØ·NØÁQÂB÷ Û ÷5€jÙ;÷5lù+Á ï÷5`ù%Ä*Ù"Äå5ÝÑ*Æ*5ÝÑ*Ä*÷5@ÙõÕ€Æ*õÕ€Ä*Ä 7Ü*<Ø7Ü*8Ø´ ä*Ì‚mÜ*·Ú×·Ø×õÝnׯ*õÝj×Ä*÷ ¦µÐÆ*µÐÄ*Äþÿ÷  & & ÀXdð5@t ,$õð5t°,îí ð5€  ÷ Z c€ÁHúAœÁ AÖ*ìN ׇN6Ó÷5€|Ø  ð5… ð5€ %÷  �ð5@ð5 ¦B÷ ¦– Áf÷ ÖÙwØÃØùB÷ Œ�s�œ÷  ÷ †Ow4‚€tf- w. ð5… ÷ Pð5€ ÷ ” �‚    °` °°°`ðU@wÞþÂ`ù‚œ ‚œÎ*�� BŒý€÷5¢×ð5µ°Ä*µ°Æ*ŒU‡Á îwÞü�    ÷5r×ð5µÐÄ*µÐÆ*ð5€ Ãøøó‹€ó�¦üÅ ÷5<× ð5 w Šü†w„ü ÷ ~üw vü†wpü÷ jüpp÷5€×ð5 ð5@ðU@p` p`|+Ò ÁA÷ nØ÷Ý&ü4Õ÷�!ü/Õ÷Ýü*Õ÷ ÷5¼ö÷ xÖ÷ü00Ö`=�8§3eaek›’tÕ÷üpÕ‡ÂEÿ B B B ‡B÷ ìÿ� ì÷ Þÿ‚œÎ*Á ÂŒ‡û÷5fÖð5µ°Ä*µ°Æ*‡w âä&fÁòA<÷ &ß7Ü÷�€&��æÔ % ,4,à ö–%&fÁ®÷áÖ ðE ðU€40, ôU 0, ð ð5 ‚•‡ÁgÒ wX×ÁiùÁhøÁkóÀˆ ÷5žÕÃl³ È*ƒ³È*ó È*÷ Ôþ� ÷ Èþ‚œÎ*Á ÂŒü³ÐÖ߇f¦ŽÎeÿ‚÷ žþ�‚‚í÷ ’þ‚œÎ*Á ÂŒ‡ûÖ �µ°Æ*‡Ö �‡ ÷ ù÷lÓ7 ÄÓ÷Ô7 ÆÓ7 ÚÓ7 øô7 öô7 üÓ7 ôÓ7 üÓ7 ¶Ô7 êÔ7 èÔ7 êÓ7 âÓ÷ÆÔÀ~Ï7DÌÔ7 †Ô÷:‚Ô7 ÔÔ÷’ÐÔÀX P ÁÒ÷ €Ý7šô÷5€ŠÔ÷?†ôÁäÒ Á%‡ÁA A A Á wÎÒ ÷ÿ߯Ò÷ÿ\ô÷ÿÿ¸ÒÀ^ H‡Áe÷ ÚÕë·´Ð× †5 × †5 ÷5€Ô5 @$Á d.‡Aá Ĉ÷ †×†Á ÷ L Ð AÂP ý÷ föÀeAá ÷ âÖ‡ðµ  ÷ 6ÞðÕ€pp ‡ÃZwÎöÿ tᦲ5&æ¦f&¦ v Þ €�‚ƒ„…‡:Æ!È!T"^n)š)'ɪù¬yN0†ù¬tN°² ­sN0‚ù¬sN0† ­s, ÿŠ ­øt ­~,¤ÿ ­, ÿŽ ­€,¤ÿ­3X ÿ’¼¯ªà*Ìþ):+:+Ø**w ØüÁ¸ë÷ $÷7|ÿ ÷ ×-.íÀª÷ <‡÷5îÁþí÷ öö÷ |øÃ|÷5üíÃ`÷ vÄ÷ n÷5@ìíâ÷ hìßÁÆí÷ ¾ö÷ DøÃr÷ J‡w Vü÷ ŽÁTì÷ (øÅDìw ší@Àe"ÁXñKr•@×-œí ‡ñJr÷5Šíñ;r÷5tíñå÷pí÷ Ðë÷5¢þñåK÷5”þÂÕ±�÷ Pð‡Á÷ ðšë ÂZÐ ��ˆȵµ d· ìÀªëÀe÷ lï÷ Fï÷5Dþ'÷%øë#÷ \ë×-òì‡÷5@æìÁ÷ ºð<ë ðéðv~ðÕhÀTëÀe÷ ï÷ ðî÷5@®ì÷ *ëÃr÷ ÷5�ìÃ`÷ ÄÃ|ÀòPHÄH4 ôÿÿ7ðê7 ôê÷ 0‡× ”úõµöÀöPPÐh ÷ VêÀHwê±ÀöÐ ÐÐ à‹÷-ªêúëŠ÷5Jý÷%þêÈ•@@Áôÿ ¼ü@Àb È\ýÓ ‡Áô@ üÁ÷ ®ð 07Lꇷ0èfÁ÷ ?öü7òü°‡÷æüâüÁÞü±wÖüA÷ nô¡Þ ôÂÈü·Âü÷ ø÷¼¸ü‡ÁÀ(wÔò·Òç¼€± �,ùˆ7Œü÷ Òÿ¡‡÷ „ü Àßzü· vüÀÂë÷ x †ð¥öÿ*± `Á ÷ žì7Nü7Hü‡÷ ºÿ&÷ ´ÿÀ€U‡w tù÷ÿÿ,ü& æ¾ê· "ü¦�÷ ~õ7TéwXéÍ �÷ žó÷ õ& íÖ ¶#ê–%÷ îû�÷ zóóÖ ‡·àû7 Úû÷€Òû7 Ìû7 Êû7 Èû€Áúèfj&�Ž÷ ~±‡÷ 6ó6¦vwÖèÂÊè7Æè÷‹Œû(Àe"ÁÊêÁeB$$$ÀåÁe((Á”è·<Tûw<Lû  w<Bû÷ ÷ ÷ ÷ 0ûw<&û·‘$ûð•#÷ †`Á ÷ Lë÷ ò÷%véWñ5@ñ5 O€f &�F÷ lò6¦vw è7è7 ¾ú÷ Àú*7<¶ú&ð5@ ÷‹­ú÷ ª÷•¡ú ÀØéð•ð•÷ Ї÷ |†`Á ÷ ¬ê÷ „Þ ÷ Ê�Ž÷ `ó·Ž ÷ R÷ fÞ ÷ ¬�÷ DóŽ7Š7úwvþ÷ ,ú Àpé7÷%Á÷ xýð0÷ð(÷ ðÕHÂô3Áäðµw÷÷þãþöw þö±wöö‡ÂòÁ÷ àæÀe÷ Lèf6†Ö Á÷ ýÂô°ðµð¤ö ðªã °°fÀ˜ãÀe ÷ Zç÷ 4ç÷5êä Á÷ N °Álã9–1–�÷ ´íðµ÷ ¤íN&ÁØÂ  ý€Âô&€Á5ÁEÀEÁEÀEÁE@ÀE@ÀEÁE €&&fÎEÿïöEÿï¶#‡ ‚–%€–%€ðÕ2, –%€òU2,Á�â ÷ ºåà 5Á°â÷ „î´ C� Á Á ÷ j &à ÂP ý&À(ÁÁ ÷ R뀴ˆ7JõÈVõ÷% ­Jõ÷%,Dõ7°ãƒ‡·*õƒ‡‡÷%.õ?÷-6â†ã1ÂŽô5ÂxÊ%¦Àe÷ ˆæ‚N‡ðµÁòôðµ l00Öh=’:l1DATADATADATADATADATADATADATA‡Á5RŠÂòrrÁÖ Âò² Á÷ ¼ä‡7 |ô÷ xô‡æCœóÅô5Hô5€µóµ óµ (³lóÅ óÕô5€)÷ Dá&óœô5óUó5óUó5 óEóEw,Æ w,À ñmtâóµ3ô5€óÕ€óµ(ÀØðµ "ðµ ó5ó5 3lðµ€ðµô5 õ5óÕ×-â†óµ ÷,hó÷,bó÷eâáô5ó%ɪó%J'ó;'ó%Jró;r÷ÿÿFóæÚÞ †w6óµwÎ÷(à,ó‚Á 9ÂÀeÃe‹°bˆ° ÷5@ná\÷ êßY÷-ößFáUÈ5RÈ5OÈ5Lô5HÁØßÈUB÷ Z@ˆÀð¤òÁÀß÷ �ë· ൠd÷ Xõ1¦Âðµ°ðµ€¬Š Ê ÷ êÞ ‡ðµ÷ Ú÷†Ö w÷ tòû÷-lò¸à ÷5@Êà ÷ Fß÷ ¸‡S÷ Lò7€ÁNò÷ Žéð5w”ð5wˆðµ€w|ðÅ€7œò÷ßòÁ ß÷ ÚêB÷-NàúÞ &fÁBà÷ :é÷ Àê�€÷ bw:Á÷ ø÷ †êÂÐñ°ðÕ€ðÕ÷µÀñB÷ 0÷ öè÷ lêw¶ðµ€ 7˜ñÀŒÞ7Šñw‚ñ÷~Þ~ñ7 ~ñ±¡7tñ‡ÂòÁ÷ ^áw\Á 6ÁVÞ÷ Xô÷ ê÷ $‡%ÁBÞ÷ ˆè÷ ê÷ úéw6ñððE÷$ñðððð µsõ d÷ XÞn÷ ðÖ ÁöÝ÷ ¶éwJfÁèÝ÷ þé÷ ´éð5ð5€ ô5Ö ÁÀÝ÷ ØéB÷ |éæl&æÁ¬Ý÷ Äé7œÝwÀÁžÝ÷ ´é÷ jé&÷ L(‡)€Á†ÝðµÂpÝò d÷ ÈÝÂrð°0 ðÕ€ðÕ—%÷µVð Â>ÝÁDÝ÷ À÷ .–%Á4Ý÷ ôèÁ*Ý÷ üè÷ èèÞ †wxfÁÝ÷ ,é7ݵÂòÁ÷ ü߇w ðìCô5€7(ò5³l÷âïÁ÷ žÁ:Ñ H !Ð Ð&ÁÞ÷ øæ÷ ~è€PPÐÐJ©Ðø‰ÄôÝÄ Ð· è݇² xæÃt² ræÃnf¦Á÷ ,‚Â`Ò  "°�ƒ‡¡ðµóµ ðµ€÷ læðµ 3,ô5¡±¤‡óµwRóµô5w>Áó5ó5Áe÷5@,Ý ô5€ ÷  Ûô5Áe÷ êôw¤îô5ó5óÕ€ð ðmÚÜ0 0 ÷ †÷pîððEðð0î ðHÛ ó5ðHîðð˜Üóµ óÕ€ð ðmrÜ0 0 óµ 0 µ d· PÛ÷ ªæ÷ šð÷ ²æððÀÚÚÀef÷ šÞ÷ tÞ÷%.ÛæÀÚææÆå�Àf÷ Öá÷ àÆe – ƒ‡ÀLÈ ô5PHtt ÁrÚwHæ÷ íæÐÚÎmÆÚŽ ‚— ƒ÷%ÂÛ— ƒfÁV ÷ >Ý�·  Ú7 àì1 ñLÙ÷5€†ÛfÂòÁ]÷ Ý�w`ôÖ 6f… ÷ .Á÷ @ä÷ ÆåÁðµ !ðµ ðµp`†Á ðµp ƒÁ;Ò ÷ ®Üp ƒpÅ Ó…÷ Àòô5 -ô5@)Á‚Ù÷ Hå7 4ì÷ ¨ï‡÷ äï ö7 ì÷ ”ï‡÷ ðî÷ å&fÁNÙ÷ šã÷ å°·>Ù„wÔòwVóƒ‡ô5-÷ ˜ïÃåÀ%&÷ ŠïÀ¥!ô5ôUÁþØ÷ ÔäæÃöæ÷ `ïÎ ûÖ ƒÃå Áô@÷ ÷à Û‡7 „ë‡w ÀèÄeW!€ƒÅå€÷ Å€AÁ Á ÷ ðñTÐÐÅ ü‡÷5 ë÷5˜ë÷5�ëô5Á÷ ¼ñ÷ &äðpëðÕˆB÷ ìû÷ ¦â¡‡±‡÷ VêÁšÙ÷ ’âÀe&Á0ØÁe ÷ ¨Ü‡wëÖ ‡€Á÷ ”܇wúê‡÷@ÙØêwÖêÂÐê�¦·Æê÷ äwø×Á¼êÀe÷ `Üf &wæ×Áà×÷ ¢ã€ �ã‡Þ ᱇w ÀçÅðØÁ¾×& f w€ê÷ þá÷ RÄ  öÄÀ”×& ff÷ Øá÷ ,ö� ÷ Êá– N ñ– õ„ !‚æ.ê¦í– ‡U ‡1±o†ÿ €æŽ¨2ÿ xæš®2ÿ pæ¦;ÿ hæ¦r=ÿ `榲5€,ôî&æ¦f&¦ v Þ €�‚ƒ„…‡z!¬!8%:%Æ%Ð!à, -‚*R ~¯ªà!!œ!>!p-¬.¬.J.œ! 7 Ží÷ ÷\ÿÀîð*0h8 f÷ ÖõÀü÷ 4÷ Vì÷ î·rí÷5Ní7 fí7 $ÿÀH÷ 7 Ví ÁJ÷ ÈîÀÌí÷ ö0 h‡Á÷ ®ð 07šë‡·~éfÁ÷ ê?Úþ7Öþ°‡÷ÊþÆþÁÂþ±wºþA÷ ¼õ¡Þ ô¬þ·¦þ÷ ø÷Rœþ‡ÁÀ(w"ô· éÂR€± �,ùˆ7pþ÷ Òÿ¡‡÷ hþ Àß^þ· ZþÀí÷ J †ð¥öÿ*± `Á00Öp=�8§3eaek›’ ÷ ìí72þ7,þ‡÷ ºÿ&÷ ´ÿÀ€U‡w Âú÷ÿÿþ& æ ì· þ¦�÷ Ìö7¢êw¦êÍ �÷ ìô÷ bö& íÖ ¶#ê–%÷ Òý�÷ ÈôóÖ ‡·Äý7 ¾ý÷€¶ý7 °ý7 ®ý7 ¬ý€ÁHêfj&�Ž÷ ~±‡÷ „ô6¦vw$êÂê7ê÷‹pý(Àe"ÁìÁeB$$$ÀåÁe((Áâé·<8ýw<0ý  w<&ý÷ ÷ ÷ ÷ ýw< ý·‘ýð•#÷ æ†`Á ÷ šì÷ ò÷%ÄêWñ5@ñ5 O€f &�F÷ ºó6¦vwZé7Né7 ¢ü÷ ¤ü*7<šü&ð5@ ÷‹‘ü÷ ª÷•…ü À&ëð•ð•÷ \‡÷ N†`Á ÷ úë÷ „Þ ÷ Ê�Ž÷ ®ô·Ž ÷ R÷ fÞ ÷ ¬�÷ ’ôŽ7Šüwvþ÷ ü À¾ê7ÁÃå`÷4Á� w2Â÷  †ÁOÄ ‡Á À¶ç`÷ ¦èÀªçbÂEß{·ô÷ ÜïÁ~2fü€767 &÷ r†ÁM 2÷ `è÷ òíõ d$@Àe"æ6Þ ‡ðµ ú÷ ˜ù÷æ„Þ ‡7À7¼f÷ "�– †÷ Ðùí÷ ¤êÀ(ÁhÂ`wÚí&f& 7 ŒÀNÀEøÿÉ-z ‚‡ñ-t†÷ n/÷ ,‡ìÂ,Ê-X ‡‚ò-Rƒ· L÷ ú‡ÛCƒ` ÃEP÷". ‚‡÷,& ‚ÁÁeÂÂåB èƒN ±€…„‡Á÷ ^ü÷ ð&fÁTäÁe÷ œî÷ "ðˆ·Bä„74äô ô ô]Ž ÂôôÀ æð•ð•0 40 60Š÷ J‡÷ <‡ñµôUô]z7 &÷÷ ÈÁÎã÷ ”ï‡ÀÎå`Á ÷ ºæÂ( Â ‚ �Á ±0À÷ Dó@Ámw ±%·üBÂmìæâ· êÀ À À À À À ÎÚàÎ Î Î Î Îm¼ÂÆBà ·´Àª÷ ‡‡ÀFå`Á ÷ 2æfÁ4åwœ"†öÁr‘Q$‰æfÿˆ‡wŒ‚ö‡æÌöÊö‡7 Àöæ÷ Ú÷‡÷ øÃå  ƒ7 0öÀ%ÿ‡À%Éíƒ À ø ÒèæÃªæ÷ â÷Î ûÖ ƒÃåÁ¨Bœ1Š— ‚ @ú :à ã‡ô À¬Á¦44  ÁpâwFîÂrä‚`Á÷ ^屜±, ñÕ ñ ñÅD7 °õô5W,ù¬W,sNô5 ÷5tã Áj¦wå· xõ‡æ BÂeÊÅʵ *ʵ€ °Ê5"Š Á2÷5,ã÷ Üá÷ bõ÷-\õÎá‚f&Áüâ÷ ôë€�B!F÷U@:õ&ñµôµôµ€ñÕ ñÅÁ<ª÷ bäÁ¨@ñµ"ñÕÀ-œâÁ÷ <ùðÜôðØôðÔôðÅ ÀvâÀe ÷ æä†÷ ¾ä@Á¨ñÅñµ@Kæf/Þ N‡Áøàwüðµ@õ7 žô÷ <Þ ‡ðµ@ú÷ ,÷†Ö (÷ €ô%Á÷ ¸øðrôðjô ðÕH¨3Á¤àðµwHô÷Œà@ôw @ô±w8ô‡Â¦Á÷ nãÀe÷ Úäf6†Ö Á÷ RøÂ¨°ðµðæó ð8à °°fÀ&àÀe ÷ èã÷ Âã÷5xá Á÷ `°Áúß9–1–�÷ Bêðµ÷ 2êN&ÁŒÂ  ý€Â¨&€Á5ÁEÀEÁEÀEÁE@ÀE@ÀEÁE €&&fÎEÿïöEÿï¶#‡ ‚–%€–%€ðÕ2, –%€òU2,Á�â ÷ Hâà 5Á>ß÷ ë´ C� Á Á ÷ | &à ÂP ý&À(ÁÁ ÷ à瀴ˆ7ŒòȘò÷% ­Œò÷%,†ò7>àƒ‡·lòƒ‡‡÷%pò?÷-ÄÞà1ÂŽô5ÂxÊ%¦Àe÷ ã‚N‡ðµÁ4òðµ l‡Á5RŠÂ¦rrÁÖ Â¦² Á÷ Já‡7 ¾ñ÷ ºñ‡æCœóÅô5Hô5€µóµ óµ (³lóÅ óÕô5€)÷ ÒÝ&óœô5óUó5óUó5 óEóEw,Ø w,Ò ñmßóµ3ô5€óÕ€óµ(ÀŒðµ "ðµ ó5ó5 3lðµ€ðµô5 õ5óÕ×-’Þ†óµ ÷,ªð÷,¤ð÷epÞô5ó%ɪó%J'ó;'ó%Jró;r÷ÿÿˆðæÚÞ †w6óµwÎ÷¶Ünð‚Á 9ÂÀeÃe‹°bˆ° ÷5@üÝ\÷ xÜY÷-„ÜÔÝUÈ5RÈ5OÈ5Lô5HÁfÜÈUB÷ Z@ˆÀðæïÁNÜ÷ è· œÜµ d÷ ˜ð1¦ÂÄðµ°ðµ€¬Š Ê ÷ êÞ ‡ðµ÷ Ú÷†Ö w÷ ¶ïû÷-®ïFÝ ÷5@XÝ ÷ ÔÛ÷ ¸‡S÷ Žï7€Á�ï÷ æð5w”ð5wˆðµ€w|ðÅ€7œ^ï÷žÛRïÁ˜Û÷ hçB÷-ÜÜˆÛ &fÁÐÜ÷ Èå÷ Nç�€÷ bw:Á÷ \ó÷ çÂï°ðÕ€ðÕ÷µïB÷ 0÷ „å÷ úæw¶ðµ€ 7ÚîÀÛ7ÌîwÄî÷ ÛÀî7 À7¶î‡Â¦Á00Öx=’:l1DATADATADATADATADATADATADATA÷ ìÝw\Á 6ÁäÚ÷ ˜ï÷ �æ÷ $‡%ÁÐÚ÷ å÷ œæ÷ ˆæwxîððE÷fîðð2î µsõ d÷ æÚn÷ ðÖ Á„Ú÷ DæwJfÁvÚ÷ Œæ÷ Bæð5ð5€ ô5Ö ÁNÚ÷ fæB÷ ææÞ)æÁ:Ú÷ Ræ7*ÚwÀÁ,Ú÷ Bæ÷ øå&÷ L(‡)€ÁÚðµÂþÙò d÷ VÚ´í°0 ðÕ€ðÕ—%÷µ˜í ÂÌÙÁÒÙ÷ À÷ .–%ÁÂÙ÷ ‚åÁ¸Ù÷ Šå÷ våÞ †wxfÁ¢Ù÷ ºå7’ٵ¦Á÷ ŠÜ‡w ~éCô5€7(ò5³l÷$íÁ÷ °Á:Ñ H !Ð Ð&ÁŽÚ÷ †ã÷ å€PPÐÐJ©Ðø‰Ä‚ÚÄ Ð· vÚ‡² xæÃt² ræÃnf¦Á÷ >‚Â`Ò  "°�ƒ‡¡ðµóµ ðµ€÷ úâðµ 3,ô5¡±¤‡óµwRóµô5w>Áó5ó5Áe÷5@ºÙ ô5€ ÷ .Øô5Áe÷ *ðwæëô5ó5óÕ€ð ðmhÙ0 0 ÷ †÷²ëððEððrë ðÖ× ó5ðŠëðð&Ùóµ óÕ€ð ðmÙ0 0 óµ 0 µ d· Þ×÷ 8ã÷ Úë÷ @ãððÀh×Àef÷ (Û÷ Û÷%¼×æN׿æÆå�Àf÷ dÞ÷ ”ÜÆe – ƒ‡ÀLÈ ô5PHtt Á×wÖâ÷ <êæ^×ÎmT׎ ‚— ƒ÷%PØ— ƒfÁV ÷ ÌÙ�· .×7 ê1 ñÚÕ÷5€Øf¦Á]÷  Ù�w`ôÖ 6f… ÷ .Á÷ Îà÷ TâÁðµ !ðµ ðµp`†Á ðµp ƒÁ;Ò ÷ <Ùp ƒpÅ Ó…÷ îô5 -ô5@)ÁÖ÷ Öá7 Xé÷ èê‡÷ $ë ö7 Dé÷ Ôê‡÷ 0ê÷ žá&fÁÜÕ÷ (à÷ ®á°·ÌÕ„wÔòwVóƒ‡ô5-÷ ØêÃåÀ%&÷ ÊêÀ¥!ô5ôUÁŒÕ÷ báæÃªæ÷  êÎ ûÖ ƒÃå Á¨@÷ ÷à Û‡7 ¨è‡w NåÄeW!€ƒÅå€÷ Å€AÁ Á ÷ 0íTÐÐÅ ü‡÷5âè÷5Úè÷5Òèô5Á÷ üì÷ ´àð²èðÕˆB÷ ìû÷ 4ß¡‡±‡÷ èçÁ(Ö÷ ßÀe&Á¾ÔÁe ÷ 6Ù‡wPèÖ ‡€Á÷ "Ù‡w<è‡÷ÎÕèwèÂè�¦·è÷ ¦àw†ÔÁþçÀe÷ îØf &wtÔÁnÔ÷ 0à€ �ã‡Þ ᱇w NäÅ~ÕÁLÔ& f wÂç÷ ŒÞ÷ RÄ  öÄÀ"Ô& ff÷ fÞ÷ ,ö� ÷ XÞ– N ñ– õ„ !‚æpç¦í– ‡U ‡1±o†ÿ üàŽ¨2ÿ ôàš®2ÿ ìà¦;ÿ äà¦r=ÿ Üল5`è‚<±ƒ…±VNTI ±VNSY”±VNSY[²gNSY[²hNSY?±y‹OV\±ÿ~TI\±CL2²VNCLó«@GØ„fhRVC±¥xb©ø "ªª–˜šœž ¢¤¦¨ ­,­3X ­s,w ºù÷ žÀ4ö÷ ‚ó÷ ˜éÅ:ÀëÀ ÁŠé÷ DùD÷ FÀÁxé÷ 2ùD÷ 4ÀÁfé÷ ùD÷ "ÅÚÍ ÷ Ô‡ðµ ÀU%@eA÷ ðøD÷ ò†èÅe åU%ãÅ²Í (Í%?±÷%ˆé÷ ˆ‡Ä÷ DD· téÈpéÄ èÁ÷ P?Jé7FéÐ ÐÈPéÙÅeÖÀDéÔ ÁTÉ €‚ Ée·üè·ÚèÀ À Â&õ‚b7 ÈèÂ5Àe@Â5` ÷5ðéÀeÂ5@Àe,Àe700Ö€=�8§3eaek›’šè÷  ÷ ”÷  ×-Ìè÷ Ôé÷5€Àéh· ”è÷rèÒý· lè÷eˆèÀfé²ô‚b÷5€�é0Â5-ÁfÀ ƒBBbBdBd�à ‡wPèÂ@ÀmFè‡@b‡Àm@è†÷EPéæ0èæ@èæ,è‚ÁW÷ ÖêÆeÀÿÿ7öèÂ5€!÷5"éÁÞçÂ5@Áe2Áe?ÁE?� ÁE€� � � � � @`ÀeÀE 7`ªç÷ ¾÷ Âææ=ÿˆÁNæ ÷ ´ñÀeÁ–  ýÁ–   ýÅðD ÷ ¦‡÷ fPÄ ýõÄ aU%ñÅÅeÍ = ÷ |÷‡ðµ ý~ç=lì÷4è4è· 0è÷ 8÷5Fè Áºå÷ &ñ÷ ¬ò1 ‡Áaa÷ Á:Ñ H !Ð ÷ BPPÐPP ‡÷ *@Àe"AÁå÷ ôê ‡ðµðµ€¡±‡&Á°ç÷ ¨ð÷ .ò€‡À\AÁå÷ 0ë†Á ÷ �pp0À\÷ ò걇÷ ¶ÿ@ð dDÀe"æ6Þ >‡ðµúðµö7’û7Žû÷%ɪ†ûì×-‚ûK'wD×-vûJ'w8×-jû;'w,×-^û3&w ×-Rû3&w×-Fû2&w×-:û#&ÄÁn÷ Šè‡w ~õ÷ÿÿ"û& æÈæ· û¦�÷ ˆñ7^åwbåÍ �÷ ¨ï÷ ñ& íÖ ¶#ê–%÷ äú�÷ „ïóÖ ‡æ)Pvü¬Ä"â)Ä&Òþ¬¯yó«@Gð ­ˆxC±¥­cŒb©ø ü¬³°úp>,«1z@?±y‹B5¬!™8ÿ ôÚÜÿ ôÚš ÿ úóÚ"ÿ òóÚ 1ÿ êóæ*#ÿ âóæ6$ÿ Úó¦²5ÆlÄlÈpxrÊ‚€Ààðøüþÿ?ÿÀæ÷ žþ‡w ôÅäD„C†Ået÷ BE‡AÁ%ÿÿ÷ >î÷ Äïð5f&ðÕ"ðÅ€ð5ð50ð 0ð0ð ÷- ãðäð5Ö µÄe¾ÅzãD€C‚Åen÷ hÿ‡×-Ôã÷5Æä÷eÈäÀ:!÷ Êý÷5°ä÷å²ä‡÷5@¨äÁˆä÷ €í÷ ï7rŠþ&æÄe€Ã¬÷ 䃄Á`ä÷ Xí7xfþ÷ Öîæ&Äe„ì÷ º÷5Jä„Äe°Ã¦÷ ¤„ƒ‡w ÆòÁÈâ÷ œîŸâ÷5@&ä wrþDÄe€Ã¬÷ rwxþ÷5üãDÄe°Ã¦÷ VDÄe„ì÷ Hæn÷-râÂãæ÷ 4Î ü– „TŒTŽT�5 �L’„5ŒÔm®ã5Ž5e�5’‡ÁÀ÷ ÒñÁdf÷ jì÷ ðí °c †0ÂeÁ÷ üä– %‡w ìñ7 lý÷  ÁÄà÷ 0ì7^ý÷5Xý÷ãÀ<)÷ >ü÷ RýÁBý÷ ~í÷5ãÁ4ý÷ líÁ2ý÷ dí÷5úâÁ&ý÷ Tí7 ýÀø+÷ øûÀæáÀmÜá  ƒÁV÷%Øâ ƒ÷ \äÄ0÷5ÔüÁ÷ ððL`Âx ÷5žâŠŠÊm’âŠÁ|â÷ Dí÷‹žü ÷ ÷ Þ÷‹’üw�wè@? Á÷ u~õíná~@wÞà÷4âààCÄa÷ ¾÷52â÷‹HüS@¤Cw´à÷ â¶àÄa÷ ®÷ ž÷ l& ÷ ä„A~ÁmáÁ w ¼à†w¶à÷ H÷ Ä÷5Úá*÷‹ðû'Cw`à÷¶ábàÄa÷ Z÷5¶áÁ ÷ ŽÁX÷‹¾ûÁˆàH · „àA®B¤÷ Šô‚à÷5~á÷àßàßÁ`áwÒë÷5há÷‹~ûfÅe†@ÄÁ÷ …u®õíZஇÁ Áá÷ 5÷ . th÷ T ‡Á ÷ ö Èúß7öß· ößA~Bæ&Ó ÓÚàÓØàKËmà€&Á²à÷ ¸ À ÀdÓ �÷ Ö S&„¶Ö h óE€ÃeÀÞ„ ƒ‡7 ÄúÀž%÷ ¤ù 7 ’ú÷ ÞÄ÷ Ö÷5xà  ÷vú÷ ÂÄ÷ ºÁLà÷ Dé÷5Tà& ÷ 0éÁŒ  Á w ß ÷5*à � ÷ éÁŒ  Á wèÞÀðÞÁ÷ ä †Àÿÿ7ÞÞÀÈÞ÷ ^ 7ÜÔPÞ÷5âßÀ´Þ÷ H 7ÜÔ<Þ‡w bîÁdÞ÷ 8ê7 Èù÷ ÷5¶ß÷¶ùÁFÞ÷ ‡Å4Þ÷ ¤ùC C÷ Îó@w tß ÷ ˆùw œù6w�ù2÷‹…ùÁ|ßÀ6Þ÷ @ Á w,Þ÷5Pß ÁbßÀÞ÷ & Á wÞÁ÷ èð5  · Pù÷ V Á ÷ "ùu¦uf7 2ù÷ù÷ù@ ÷ Üçð ðµ ·‘ûøA ÷ Àç÷¤Þâø÷äÞÞøÄæÁ÷ xé÷ .é&÷ ºø@¢@÷‹¼ø  ÷-6݆Þò5 ÷ ’ø5®A¤5 ¤5~A5  ÷ : ÷ lø5¢5Ca÷ XøÀXøÁ¢ÀJøÁ÷ †À Á@ø÷  ÷ .ø5ž5÷ Bø÷ Rò÷ @ ÷ øu®uœ|u~uw÷ ô÷¾Ü¶ÜA ÷ Àæ÷ Ú÷¦f ‚ ÷ ÖÂÿÿ÷ º÷µœµ€÷ ¨÷Áª÷Á ÷÷ b÷ ”÷7–÷7Œ÷÷‹–÷÷-ÜbÝ÷ v÷5`®5`~÷ f÷A¢A¤AA÷ ÁR÷÷ ‡Á ÷ 8÷u¦uf÷ L÷÷ "÷w ìÛƒwæÛw ÞÛƒwØÛõµ‚÷ J‚÷ ôörœr÷ àö@œAž@A÷ ’‚€ì2 ‡2�÷ ç÷ ÐÀx  ÷ ¢ö  ÷ ˜ö@ž@÷ ˆöw3Lõµ@÷ (4`L‡3L˜÷-FÜòÚ4L4À ÷ 4`L‡¡ ÀeÿŠÀ‡w Äê÷ ¤ÁÂÚ÷ –æÅ²Ú÷ \ð;w Ü ÷] Ü"ö÷]ÊÚö÷Uö.÷5€øÛ*÷5ö&·öÁö÷ DæwöÁö÷ Œæ÷ Bæ7úõ÷5ÄÛÁðõ÷ æw äõÁàõ÷ dæ÷ æ7Öõ Å0ÚÄ÷ ®&÷5ŠÛÄ|õ5Á ÷ N5¢ �Äxõ5Á ÷ 05 7P`õ÷UZõ÷5<Ûõ ¢÷UFõà E   Äþÿ÷ 4÷5ÛÄ|Á õ5Á ÷ Ò5¤ Äx7SþôÁõ5Á ÷ ®5÷ H‡·‘Þô· ÆÙ÷-XÙ¨Ú ÷ ºÙ÷ òîõµ÷U¸ôA2÷ €ã÷ åð]¦ô ð]žô ÷ ®ô%w-¨ô!Ĥôô]ˆô ÷ ‚ôA ÷ Hãf@÷ $ÁfÚ÷ .‡Á uft ƒt÷50ÚPÄ|7S<ô÷  ‡·‘8ô· Ù÷-°ØÚ ÷ Ù÷ Jîõµ00Öˆ=’:l1DATADATADATADATADATADATADATA÷UôA 2÷ Øâ÷ ^äð]þó ð]öó ÷ ô%w- ô!Äôô]àó ÷ ÚóA ÷  â¦@¤÷ |Á¾Ù÷ †‡Á u¦t ƒt‡ÁÁ Àv Á ý‡w èÁ Ø÷ Þã7 nó÷ ÷5\Ù÷\óÁì×÷ ‡ÅÚ×w 0Ùõµ3÷ <óA A÷ â÷ ”ãð5 õÕð÷ óðU Àe ÷ ó÷ 4íÈ ÷-*íóƒ÷"íóÈ · Ü× ‡÷U€ÔØû÷ íÈ õ÷-þìäòñƒ÷öìÜòÈ ì· °×é÷ ¬ò÷ "÷5˜Ø÷ šò÷ ‡’´’Á KŽ´ŽÁ D÷ Váæ ÷ Öâ÷5tò ÁeÿÁEÿ  Wtüÿ÷ Fp÷ >òÀl22mf÷-Ø¼Ö fÁØÁmÖÖ÷ r`�÷ Ø3l f2òll÷ À4fƒ‡@÷5Þ×Àe”&Àeæ6÷5Æ×€&÷  àÞ †‡ð5íðµ é÷5˜×÷5˜× ðµtì-ƒ ×÷ êáðµ@0 0 0 É÷ ®áf&æóµ À.ÖÁ÷ 7"Ö3ÀóÁ÷ 3 ÁÖ÷ ê7üÕ7&×w(óµÁ ÷ æß(Á÷ Æ33Á ÷ ¬4Àì3 t÷-dÕ´Ö*ÁÀˆ÷ DÚ$‡& ó óÕ€Àe33 ó 3 ÁÁ À ÷ RÁdÕ€÷ H7ZÕF ÷5hÖó5€ÄÄezÁ÷ ( @à÷ &ÁÀ\÷ ¼Ù‡óµÀ÷ î3 ƒ3€Á÷ Ô3Á÷ Ä3 Àì3 ƒ„�÷ >àw þ@Àeæ6Þ L‡æÐïÂ5  Cµ @ðµ@<÷5¦Õ÷5¦ÕµN~÷5ŒÕ"Â5€÷ ˆï%N®°c°c÷ âß÷5fÕÂ5€ ÷ bïÎdï°c°c÷ ¼ß ÷ Jï°c°c÷ ¨ß– ²‡@`!‡‡÷ ‡‡Á @`†A@ � f÷ dã�÷ FãÀ ±@‡Áe? ¡ � � � � ‡¦BÂeÁ÷ pÖ÷E0ÎÔ€‡À À ÷ 0œÌ  Áå ûÁå 4°Ö¡Œø†Á÷ 2Ö4ÐÖ‡ÀEÿÀ @ @ @ ‡±÷5€zÔ ÷5�î÷5ˆî¡‡ÀF1÷ píÀŽÐ%÷ ÀxÐ% &÷ &Ý‚ðµ "lÊmDÓ‡fÁ¾Ò÷ ’ÞÀ®ÒÀe"Åe æ6Þ †…‡ðµøðµ€ôðµ€� ðµ ë÷ RÞ÷ .Þ&f ÷ ¸Ü�€÷ (Þòµ€ &� ÷ â€p°lò5 ÇðÅ ð5À÷ üÝ÷ ØÝ&fð5÷ TÜ�€÷ ÄÝ&ð5� ÷  á€ð5p°lw ÿp°lwÿÿ ìল5!€@@€@ € L>(@*B,8.H $ 2 0 4 |‚ "| |v<@ :$ C nK " M ~B> 6 8 ˆ F D N xVZ ú\ üFæ2îPð0 èRêvò”ìNô: ö< ø4úX üV þR T ÷5>âkw ÎðÅLÍmôàMeÀBíÄæàÄmæà !‚D7Öà÷íôàÐà`ðð•#÷ J † ô�Á÷ Œã÷EêáAà €¦ÁY÷ vã‚ÁNß ¦÷ ¶ê÷ <ì‚Àe�����Á÷ ðE€ ÷  7à7àЕÿÄ üÅ ÁÅ Á üÁ `�À $÷ ˆú÷5ná÷m,à,à‡Àôßðm àðm4á÷5Náðm à˜ðm ášÁØßw¬ëw Êï7 ìñ ÷5€(áÀ<à7ðû7ôûÅ.ìEbÄ> ÌÃlÂÁ…0ûLPù÷ áÌU ÷ tßÌU÷5æàÌU÷5ÒàÌU÷5ÎàÌU÷5ºà ÀŒßÀmÊß ‡7 x߃ÀxßÀm¸ß‡7 d߃ŒÁ"÷ ¼fÄZ Ã’Å‚àÂÁ…0ûLPù…7<ûÀ<ßÀmxß72û7 ,ûƒ7&û÷5 Rà÷5Jà÷ßû÷54à ÀßÀmDß7û÷þÞ û÷m6ßûæ æ=ÿˆÄ  ÀßÀ À Àe>7Öú7`ÐúÀøÞÁn `AW  ƒ÷%êßW ƒÁV÷ ÁÊÞÀ÷ îÁeÁm–úwŠúÁe w`€úÁeÅ5` d÷5€œßÔeÀÔmªÞTÔjÞÔJÞÔbÞÔ\Þ   Ô”ß÷%xÞ Ä* ÔvßÔpßÔ|ßÄ0 Ô^ÞÔøÅ5€ôUþÿÌ>ßÌmþÝ7ú÷åúÔmHÞ÷ ¶ ÷ >ÔÞÌÞÅ5÷ßôÞômüÝþÿ ÄR ÷5ôÞ ž÷ ÔäÝ÷�èÝÀù÷�èÞ»ùæ¶&Ä|÷ Ä‚÷ ‡$Ì ‡÷5²Þnæœ'7 Rï7 \ïÀbÝ4ÅœÀ 7Hï÷TÝlÞ7 lù÷ ‚÷ Z÷5|Þ÷€Þ÷•OùÅœ÷,ÝBÞ7 Bù÷ X÷ 0÷ RÞÅ ÷(ùüî÷eöî7 ù÷ 6÷ Åx"÷Ýàî÷ Üî7 Þ7 ù÷ ÅÎ"7 öø÷%Þ÷àèø7 00Ö�=�8§3eaek›’®îCDÄ5ÄEfÄmÊøÁ÷ LÄeÎ öÖ ê‡Å^ECfÓ Å ÄÔ& ÎÔÀÀ À Àeü&A÷ €Àe÷ Î ïÖ …âÅXÄ E'õE@CÃeæ÷5@>ø Ë% &ó%„(ó[qæÁÄe÷ ´Î ø– CÃe³Ö×-6Ü÷ >Ý÷5€*Ý ÀÜÀå7¾÷Àh(÷ ö÷ à‡À¬÷Â’Û� òµ@÷e”÷÷ R‡Ìe?ÌE?  ‡÷ fÞ÷EÄÜÀØç÷ ‡Áå÷ >Àe"÷ ¼ß‡ ñµ±ñµ€A÷ tå@ñµ Àm’Û¡‡fÁ\Ü÷ Tå�‡w øê÷ 6÷ ü ÂÖÚÃÐÚÄ…”�  †w2÷· êì÷ Ä õà ð÷÷ ܇÷ Òì&À4çðf ðæ^ °4Îe°6ð•(ðl"÷ J÷ l€· Öö7 Žì‡÷µ@”ì ÷‹�ìÂ2 "‚2 &‡)2 ‡2 ƒ÷->Ú²ø ÷6ÚªøÂ0ÚÂe Áw.݇€ì· Žø·ˆøÂÂ÷ "ì÷ pø€ì· hø·bø  ÷ ì ÷ Nø7 @ø‡7 <øPƒ÷ ÿ·8øæL÷ 4øÎRŽ`ÂUÿ·øÂEÿ·øÂ‚ ‚g‚ ·úõ· ²ë&f €Á÷ PéÀmrÙÂÁ  üˆ°ˆÀ÷ |Àìåðf ðæ^ °4Îe°6ð•(ðl"÷ ú÷ $�€Àí”÷p�f ‡f&÷ ®þ€�€ Á÷ ¢þ‡ ‡ææ)ÿˆ÷Šl÷‡`Á÷ úÛÀf Á Á ý‡w àè7 F÷7 D÷Á÷ œ7,÷÷f $õÀ€+÷ :ó÷ úýÁÂ÷À(÷ Œá7 ÷7 ÷÷øôæÙ÷åàÙÀåðèô ÷ 4‡w €è&÷ H„÷5ÜÙ÷ ‡ÂÆôÅ`ØaC¢|w˜´ô· °ô ÷ ¸ö7÷¤ôžô÷žôŒÙ÷ ˆÙ· ¢ö,ÂŽôÅ(ØaC`w|ô· xô ÷ ~ö÷lôfô÷fôNÙ÷ JÙ· höÅ · êR”„ — f"÷f÷ ‚�òà ,&ÀVäð2öðæb °4Îe°6ð•(ðl"÷ d÷ Žþ€· üóÁúõÅÃ%‡ ËÃåÅÆÄ ÄU?„ àa·Ðó— f"‡÷ ·Âó‡÷ žüÂf ÷ `þ‡ÿ ŠæŽÄ3ÿ ‚æš®2ÿ zæ¦Ú@ÿ ræ¦Aÿ j榲5év~ ­ø1±o†ÿ tùæVùæw æ÷÷5Jé{7 ŒýÁºæ÷ &ò7\ý÷5Vý,÷%,è(÷ �ç×-&é‡÷5@éÁúè÷ òñÀeÁº÷ ì†&Áàè÷ ØñÀe"Á¶÷ ôë†�pÀvé÷ 8ñ7 xù7 âè ÷ýý÷ýý7` ý&ÅÄ÷ € rЀ 7  èí#Á€è÷ xñÀe"AÁå÷ ’ë‡ðµðµ€÷ Pñðµ Ámpç ‡ÀØ÷ ÷ ÈæÀ,è÷ Þ÷ @ ÷ H÷ ¶÷%,ç÷5Fü÷5>üÀ÷50ü ÷ 0*Áêç÷ ²ò÷ÔçÔç7Ìç ÷5äç¤ÁeÿÁEÿ@` Á÷ "öÁ € Àmœç7šç÷ –çÀÈò÷ ¾‡Á`÷ :é÷E˜ç‡w (öÀ*æ÷ .æ@#Þ ‡÷ xûwzÅ:E BÒ Ò ú�Áa÷ üèõ‡7 tç‡&÷ ¢�÷ 2ð7œþ÷€7 ð÷7 î÷w ç ÷êåÞ÷÷äåÚ÷Àm6æ7Â÷7º÷7Ä÷w úæ ÷mÈå¸÷÷5þæ÷möæª÷·l¤÷÷  ÷÷œ÷–÷ò  €~Àmòå7z÷€lÀ 7z÷÷5Äæ)€œÀmÔå7b÷€l¢w œæÀmjåÀm¢æÀ 7T÷€®Àm°å7:÷€l¤À 7:÷w ræ ò ¢ò ÷"÷$÷·Hæ·Dæ÷5^æ·˜:æ·š6æ÷möö÷÷mòöþö‡w Ôô÷ÿÿºú& ææ· °ú¦�÷ Þð7´äw¸äÍ �÷ þî÷ tð& íÖ ¶#ê–%÷ |ú�÷ ÚîóÖ ‡w |ô÷ 6÷ ü ÂZäÃTäÄ…”�  †wLú· nö÷ Ä õà ð÷8ú�å‡÷ Vö&À¸ððüðæô°4Îe°6ð•(ð÷ ´÷ l€· ðù7 ö‡÷µ@ö ÷‹öÂ2 "‚2 &‡)2 ‡2 ƒ÷-ÂãÌû ÷ºãÄû´ãÂe Áw²æ‡€ì· ¨û·¢ûÂÂ÷ ¦õ÷ Šû€ì· ‚û·|û  ÷ „õ ÷ hû7 Zû‡7 VûPƒ÷ ÿ·RûæL÷ NûÎRŽ`ÂUÿ·2ûÂEÿ·(û‚ ‚g‚ ·ù· 6õ&f €Á÷ ÔòÀmöâÂÁ  üˆ°ˆÀ÷ |Àpïðüðæô°4Îe°6ð•(ð÷ d÷ $�€Àí®úp�ü‡f&÷ ®þ€�€ Á÷ ¢þ‡ ‡ææ)ÿˆ÷Іú‡`Á÷ ~åÀüÁ Á ý‡w dò7 `ú7 ^úÁ÷ 7Fú÷ü>øÀü!÷ hý÷ úýÁÂ,úÀ(÷ ë7 *ú7 (ú÷øjã÷ådãÀ–îðø ÷ އw ò&÷ H„÷5`ã÷ ‡Âà÷ÅäáaC¢|w˜Î÷· Ê÷ ÷ Òù7÷¾÷¸÷÷¸÷ã÷ ã· ¼ù,¨÷ŬáaC`w–÷· ’÷ ÷ ˜ù÷†÷€÷÷€÷Òâ÷ Îâ· ‚ùÅ · ŽóR”„ — ü÷f÷ ‚�òà ,&ÀÚíðLùðæø°4Îe°6ð•(ð÷ Î÷ Žþ€· ÷ÁùÅÃ%‡ ËÃåÅÆÄ ÄU?„ àa·êö— ü‡÷ ·Üö‡÷ žüÂü÷ `þ‡·Þø7 Øø÷€Ðø7 Êø7 Èø7 Æø€Á°àfj&�Ž÷ ~±‡÷ ìê6¦vwŒà€à7|à÷‹Šø(Àe"Á€âÁe00Ö˜=’:l1DATADATADATADATADATADATADATAB$$$ÀåÁe((ÁJà·<Røw<Jø  w<@ø÷ ÷ ÷ ÷ .øw<$ø·‘"øð•#÷ –†`Á ÷ ã÷ ò÷%,áWñ5@ñ5 O€f &�F÷ "ê6¦vwÂß7¶ß7 Ê÷÷ ¾÷*7<´÷&ð5@ ÷‹«÷÷ ª÷•Ÿ÷ ÀŽáð•ð•÷ ‡÷ þ†`Á ÷ bâ÷ „Þ ÷ Ê�Ž÷ ë·Ž ÷ R÷ fÞ ÷ ¬�÷ úêŽ7Š5÷wvþ÷ *÷ À&á7Àî÷ ‚À,÷ zÍ5@ ôµ÷žúæ|ÿˆ÷ øw,w ÷À çÀeæ6Þ ‡ðµúðµ ö0ðµ€0 ÷ ºòê‡w Ôö÷ Ú÷5@4è)ÀÊæ÷ Ä÷ Â÷5 èæ6ÀªæÀeÞ ‡ðµ÷ èð÷ nò0ì0 îæ¤Þ ‡÷ †ûÀpæð d Âe¦¦ dÁœ÷ \éž÷5@¸ç÷ ‡÷5²ç À8æð d÷¨ù÷¤ùæ|ÿˆÁò"÷ ÂÁŒÉ ÷ ¢é÷~ùæ|ÿˆ‡÷ Jð7œø€7 ø7 øw 6ç ÷æö÷÷üåò÷ÀmNæ7Ú÷7Ò÷7Ü÷w ç ÷màåÐ÷÷5ç÷mçÂ÷·l¼÷÷ ¸÷÷´÷®÷ò  €~Àm æ7’÷€lÀ 7’÷÷5Üæ)€œÀmìå7z÷€l¢w ´æÀm‚åÀmºæÀ 7l÷€®ÀmÈå7R÷€l¤À 7R÷w Šæ ò ¢ò ÷:÷<÷÷m.÷:÷÷m*÷6÷‡÷ žø Àß”ø· �øÀç÷ $ †ð¥öÿ*±00Ö¨=’:l1DATADATADATADATADATADATADATA `Á ÷ äç7hø7bø‡÷ ºÿ&÷ ´ÿÀ€U‡w ºô÷ÿÿFø& ææ· <ø¦�÷ Äð7šäwžäÍ �÷ äî÷ Zð& íÖ ¶#ê–%÷ ø�÷ ÀîóÖ ‡·ú÷7 ô÷÷€ì÷7 æ÷7 ä÷7 â÷€Á@äfj&�Ž÷ ~±‡÷ |î6¦vwäÂä7 ä÷‹¦÷(Àe"ÁæÁeB$$$ÀåÁe((ÁÚã·<n÷w<f÷  w<\÷÷ ÷ ÷ ÷ J÷w<@÷·‘>÷ð•#÷ À†`Á ÷ ’æ÷ ò÷%¼äWñ5@ñ5 O€f &�F÷ ²í6¦vwRã7Fã7 Øö÷ Úö*7<Ðö&ð5@ ÷‹Çö÷ ª÷•»ö Àåð•ð•÷ 6‡÷ (†`Á ÷ òå÷ „Þ ÷ Ê�Ž÷ ¦î·Ž ÷ R÷ fÞ ÷ ¬�÷ ŠîŽ7ŠQöwvþ÷ Fö À¶ä7%ÿ Rð.ø%ÿ Jð.4&ÿ Bð:°-ÿ :ð:|*ÿ 2ðF*)ÿ *ðRf'ÿ "ð^À&ÿ ðލ2ÿ ðš®2ÿ ð¦;ÿ ð¦r=ÿ ú零5¯ÔLŠâ ¢bÒ ðµ ð5 ðµ€âm–àâm’à Ï &&& €�÷ ¾ï�eJ€‡ ò üÿò ÿüÿòœÿþÿ‡ŠŠìüÿРЇÁeBRRR R R‡w ¨ï÷‹ìþÂP#7 âþ‡÷ œ ÂP#Ã�ÒþÀŒÁ 4÷ XE`à ùA÷ "Á®5÷ ‡ÂP#¦f÷ d�‚ÀŒ÷ *À^áðŒp÷ ð†`Á÷ 6â7 tþÂP#‡f÷ Ø&@áÍ¥ 7 ZþÍ¥ · NþÕ‹À ò€…‡÷->þhò�ÀêÞ7Fò7Bò· :òæ þÂTÁ4÷ tÿ·þ‡ÂP#Ò¢æ0òÎåÖ-üý÷"òôýÁ¾4÷ :ÿÒ¦ÒªÁ5÷ *ÿʶޡ Š ŠÒÊàŠÊeÿ ŠÊÁ<5÷ ÿæP#æ=ÿˆÁÀêÂ\#"è€Êe<ò þÿÁ øÁ˜5wÜþ÷ �þÀ6Þð dæ¤ñÎå Ö-pý÷–ñhýÁc4÷ ®þÁœ$÷ ‡w îÀÞEÀe"æ6Þ ‡ðµúðµö7,ý7(ýÁ�4Í ì‡Á™4ÂP#ÀŒ÷ zBÁŒ÷ Ná‡÷-߬Ýð5ð5  Òm ÞÒ4Ò4 ¦÷ Âç‚ðµ  â4ð5 âmØÝÒ Ò ‡ÿ †ì¦¶=ÿ ~ì¦$9ODT xfr address: %P%NPRG xfr address: %P%NStack limits: %P %P %P %U.%NIdentification : %2R%NTask attributes: %VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%NTask address limits: %P %P%NTask Address limits: %P %P I-Space%N %P %P D-Space%NTotal task size : %T. Words%NTotal task size : %T. words, I-Space%N %T. words, D-Space%NPartition name : %2R%N%P %P %P %U. %VS%2R%N%P %P %P %U. I %VS%2R%N%P %P %P %U. D%2N%4N%X Overlay description:%2N---- --- ------%NBase Top Length%NTask UIC : [%O,%O]%NTask name : %2R%NTask priority : %M.%NMapped array area: %T. words%NTask extension : %T. words%NTotal address windows: %M.%NTask image size : %T. words%NTask image size : %T. words, I-Space%N %T. words, D-Space%NR-W disk blk limits: %P %P %P %U.%NR-O disk blk limits: %P %P %P %U.%N w „éÂT÷ üÒhØÒfØÒ  ƒææ=ÿˆÁ4ÂT÷ òùÂ~Ê Á1)÷ âùÂBÁ_(÷ ÖùÂLÁ*'÷ ÊùÒ�£ÚŠÒ�œÚŠÁ)÷ ²ùÂP#ÊTÚÁH)÷  ùÀ\Ú÷ óÂP#÷ `ÚÊëÊmÙŠÒ ÊNÚŠ¢hÁ '÷ rùÂxÊ%ÁÞ&÷ dùÂŽÊ%Áô&÷ RùÁ–× ÷ ã÷5 ÚÁUwpû Áz×=÷ àâÁEÿíÁ5ÁUÃŒ×BÁ@ƒ@ÁP+Å®.ÄÂP#A5ÒR w=þÿd׃ U%Õ òeþÿò üÿU%Õ Ä èò üÿÁA'— °#† Òz*ù÷ ®øÂP#ÊxØÁ¡)÷ žøÂP#ÀPØ÷ TÁ_)÷ ˆøÂP#À6Ø÷ >Á€)÷ røÂP#÷5:Ù'À2Ø÷ "÷†úˆú÷‚ú„ú÷‚ú„ú÷~ú€ú7 vú7 tú7 fú7 dúÀü×÷ òÂP#ÒÐ&ÊÌ&Áß)÷ øÀÞ×÷ ÔÁ¾)÷ ø÷5ÔØ ÷-,ú2ú ÷-&ú,ú÷-úú÷-úúÂP#÷5¦Ø00Ö°=�8§3eaek›’ ÒÐ&ÊÔ&Á (÷ Â÷ÊÐ&Áë'÷ ´÷ʜ׊ÊmR×÷5vØ Ò Êˆ×ŠÊm@×Á¢'÷ Ž÷Á…'÷ „÷÷5PØÒ×Ê&ØÊ ÷5¬ùÊØ÷ øöÁ2*÷ Z÷÷5”ù ÒØÊþ×÷ ÜöÁV*÷ >÷‡ÊÈ&Á ÷ FæwXù÷mTùZùw Tù÷mHùNù‡¦Á^Õ ÷ ÈàÀe‚Á Á ýÖ ‡×-¾Ö÷ ÈÿÁÀ(÷ ØöÁú(÷ ÐöÁÞ(÷ Èö÷þø÷5 Ž×÷ðøÀò-÷ Vñ‡w æÀÖ÷ ðÂP#÷-ÖT×÷zÖèÒèÊ è²"þÿ †òòçþÿÊöç²"þÿ†Ò   ÷ øõÒ Ê˜øÃTéÊmŽøÃ üÊ%\Ê\Ò À¤Õ ÷5×Áv(÷ &ö‡Ò ÷-ŒÕÜÖ÷Ö’çÒŽçÊ”ç²"þÿÒ   ÷ �õÒ Á�(÷ ðõ‡-AC,-AL,-CM,€-CP,-DA, -EA,@-FP,-HD,-PI,@-PM,-PR,-SE, -SL,€-TR,-MU,-ID,%N*** Root segment: %2R%3N*** Segment: %2R%3NR-O mem limits: %P %P %P %U.%NR-O mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NR/W mem limits: %P %P %P %U.%NR/W mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NDisk blk limits: %P %P %P %U.%NDisk blk limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%N%2NMemory allocation synopsis:%2NSection%44STitle Ident File%N-------%44S----- ----- ----%N%2R:(%VA%VA%VA%VA%VA%VA %P %P %U.%N%30S%P %P %U. %2R %2R %X%N%3NGlobal symbols:%2N%F) w Öê÷ &û×-<Û÷<îúÀ¾Ú Á-'÷-¶ÚÜÁ'÷(Û¶ì÷ 6ûÁ˜Úñ5-Á¤'Òžìʤì²"þÿÒ  ÷ ¢ú÷5ØÛÁÄ'Ò ÒxìÊ~ì²"þÿÒ  ÷ zú÷ àú÷-JÚšÛ÷-VìXìÒDìÊJìÁA'÷ Vú÷5ŒÛ Áa'Ò Ò(ìÊ.ì÷ <ú÷ ¢ú÷5nÛOÁüÙñµ@Iñ5JŠ@JŠ@¡Ò   ÀeÿŠÀÀ `÷ èùÁ(÷5Û#Á¨ÙÒ ñ5JšŠ@¤J˜Š@ž¡Ò   ÀeÿŠÀÀ `÷ šùÁ'(÷ üùÁi(÷ ôùÁ‹(÷ ìùÁ«(÷ äùÀFÙ÷5¬ÚÀe”&Àeæ6÷5”Ú€c&÷ nãÞ [‡ðµ÷ XãÂP#÷ ù·,üÿ Ûâ÷ ˜w´û ·°ûw®ûÁµ Á5 òmPÙþÿ7Šû  ·†û’ÁË(7 ‚ûð ·Šxûðµðµ ·Šeû÷ (ùæžÞ ‡À€Ø÷ rùÁBû÷ Êâ÷ Päð4û0ìð(û—÷ ä‡w TèÅþ-ÄJ’ p5ÊRaU%U%Ä óú%$$þÿò øÿò#)þÿ² üÿ‡„þÿô•)‡w èF�… ÂP#÷$¾ú;Ò¶úÁ¾úÁµ Á5 Á5€ €Ážú÷ –çÁm˜úRòmHØþÿÊ÷‹ŒúË ’÷‹�ú÷bpúÀ¢×ð5€  Á˜Ù÷ À÷Áï(÷ øÓ Å ½‡w rçÀl×7 ,ús&æÖêÎåÖ-¢ö�÷ÈêšöÁ )÷ à÷€Àe"æ6÷ Ú÷úú÷öùú÷žêüùÅè&ÄÚ&Þ ••UÔäù÷íàùÜù�Þ ÷ „ü‡÷ Îùù÷ Æù ÷¶ùÀùæ÷mºù¶ùô²ùþÿænĦùÂè&ÅÚ&÷@êšùÃP#Í Þ ‡÷ <‡¦Â÷ üøƒ‚Õ ¢(â î· æõÄ ÷ fùç÷ äöÛ÷ Þö– ÷ Hù¢– ‡¡ðµðµ€ðµ€±‡w \æÄÎéÄížõÄÄéÄå Á¸éaÁ ý·ùÃúøƒà�7ôø÷ìøôø  ÁìøÁíŽé�‚ ú‚ ·Òø÷Ìø‡RO,RW,€D,I,@GBL,LCL, REL,ABS,OVR,CON,SAV,$$$,%2NFile: %X Title: %2R Ident: %2R%N <%2R>: %P %P %P %U.%N >>>>>>>>>>>> Undefined reference: %2R%2N%7S^(¦'\(¨(¨(¨(n(Ú'Ü'î'ð'ò'Ü'Z(Ü'®(w šìÄ’Üô5€wúÀŒÜ÷ †ö÷ <÷ j÷‡÷ ¤÷Ãå ƒ À ø F'ðÄÎ&Å÷ „÷Å ûÃåÁÌ&Bœ— J‚ À2Üú T'à 燇Àe÷ œà<‡ÁÌ&wþ‡‡ñµ Àe"÷ ~à ‡ðµ÷ fñµæÚÞ ‡÷-äÛ2ÝðµõÖ Ö ÀÌ&÷ ‡÷µˆþÁ°Ûñ5‡‡%°݂`Á÷ œÞÖ ÄŒÛ&Ž Á÷ Òå÷ XçÁðµðµ p`Î îÖ ‡7 êî‡Àe"÷ Ê߆ÀÌ&÷ ˆ‡÷ ’ûÁHÝ÷ pûÁ.ÛR RRR ÁØ&÷ ²û‡f&÷ dû÷€îÐý€Žðµ÷ Jå‚�÷ þú ’J÷ ¨úÁþ&÷-îÜ"ú ×-ú¯÷ úwZû·Šú‡&Áþ&÷‹ûù÷ Dû÷ üú÷îhý€ Á'÷ (û‡Áþ&&÷‹Íù÷ ûÂ>ý÷ ¾ùÁB'÷ ûÂP#€÷ ®ü· ¦ù·ý÷ ý÷ ¤ú÷Àíý‡00Ö¸=’:l1DATADATADATADATADATADATADATA¦&æ|³€Æå‚¦& æ f&&æ�ÿˆ ‡æ æ‡ÿˆ€Æe#Æe¦ö|³& f&&æGÿˆ‡& & & & &&æ ÿˆÀ†×'&ùÿ±À&–‚‡ð 89f¦æ�Æå‚œ"¦ææÿˆƒÂe\¡¡¡Âeòÿ¡¡¡!ŠÂe¦¦¦¦¦�÷ � ‡Ã5Àäf÷ ÿ2*€ ÆeA ƒ‚�‡”$ðº~v%B%l&l&l&l&f&†%²%´%¶%¸%²%j&¶%¶%w æî÷ ìü÷ Îù‡÷ úÃå ƒ À ø ú$ðÄÊ$Å÷ èùÅ ûÃåÁÈ$Bœ— ‚ À–Þú %à ç‡Â˜à‚`Á÷ „á7Hÿ7Dÿ÷•Gÿw:ÿw6ÿ×-ÊÞ÷ ª‡‡‡‡ÂÔ$RRBœÂÅ×ÿ·�ÿ÷ ÜG‡Dœ ŵŵ€÷ fèŵ ÂmˆÞ·ØþÄ &ÅÅmÿwÑÎþŵ€·rßÞ †7 jß÷Å€¶þ7 ^ßðµ€ððµìðµ ÷m>Þ�þ÷-¼Ý ßá– 7Š…þÁÔ$ ‡Ö ‡‡7 &ñ‡Ànܰp°÷ >†`Á÷ và‡Àh¼$ÁÁ ý ÷5 ¾ÞÊÁ¶$ÂÙw @íÅnÍ5@bÍ5@VÀà$Á:ßPHPJPLPNPPPVPXPZP\Pœ^ŠÍ5ÈÕÀeÐøÜÐ�öÜŠ@÷ �†ÍE@@3À´Û÷ ¢æð•#÷ z7P¬ý †ÍE@`Á ÷ °ß÷ 6ÿÀ”'÷ Þ÷ÀxÛ÷ D‡À–Áà$÷ Îû À’ÞÍ5÷ Dü÷ "‡w lìæ¤Þ ‡À\Üð5€ø÷ jýõ‡ÿ ˆëލ2ÿ €ëš®2ÿ x릶=ù¬sNÿ ü<@1±o†  ­,  ­s, ­,Š’š¢ª  ­3XÔä    ­s, ­ø�wµW" & B ® ¶ w ûÀš÷÷ èôð•#÷ H†`Á ÷ î‡7bŠÿ÷5„ÿ÷50Vì÷5tÿ×-Dë÷U >ì÷U6ìÁì÷ àöÄTTÔ ÀLÔ ÷ ŠêÔ„êÔ‚êÔÁÜë÷ ÔôÀe"Áö÷ ðîj‡÷5ÿômæêþÿ4Š7 \þ÷5êþ ÷5¼ë)Ã÷ &÷ D· <þ÷5 ¤ëTTÔÕR÷5¶þôÕ ÿÿÔ•T÷ ×-tê÷ ÷ dÄ÷ ú÷ Ø÷ øÁðÂ÷ ÷50Jë×-@ê÷ ÌÁë÷ Žõ×-0ê÷ ÊÁòÂ÷ ÎÀ$ö÷ ؇Âb÷ œìÄÔÔCÃetÃ5Á÷ ÌóÁ’A ñ û1,÷1,ëòÔ œŠ÷5ÔýômºéþÿôÅ üÿ ÷ zóŒ÷ ÌÄ%� ‚æ"!ÁBà÷ („‡Á@Àe÷ líwöü7 üDÄet=Ã.÷ &ó+&  ÷ ó+Œ�÷ ó÷•ìûÎðµw ¨ü À Á Î÷• ÀûÁ ÷  Â ÷ ˜‚÷ ’÷e†ûÁÁ¸é÷ *ôÀ°wnw PøÅJèCÄrTŒÌÌEoÿÌU`ÌÍ5Ó ÔTÔTÓ ÜÔæÀ ""Á Ò ­Ê,÷ Vò<ŒþÿÎ í– Ó ÔÔÀ ""w-<éÒ­Ò3XJ�Ä@éÁf ÷ æÂa÷ ÜÁ†Â&!†Âå÷ Æ÷-¢çòè÷ éÀXÁ\ÂB�‘ˆ‰ÁF ÷ ˜Â÷ �õµ4øS�A÷ ¦ñ{ÂR�ÁJ�33óm‚ç3 3Á¬Â ÷ <Â÷ 4Â÷ ,ÁàÂ÷ ‡@÷5Zè ÀeæTÂÞ ‚‡¦÷ ÷Àe”&€&÷ ñ÷ ö‡& ðµ÷ øððµ Ö #w~úÃôÁ  ýóµ€óÅ 3 3 �4Šóµ@ ÷5òú÷ Xúw6Á ô•÷ ”ðð5ó÷ 8úð÷5Äú÷5–ç÷5 Žç÷ ü~‡@Àe"æTÂÞ ‚t‡¦4Šðµ€÷-ØùÂåð÷ 6ððµ  ðÅ ôÕ7, °ùÝðµÙÂeÁ’A ñ û±"ø±,È󔔌ÒÔÅ“ÿÔ•÷5ú óµ ó ämðåäE %óµ ÷ Lå÷5 Âæ÷5ºæëôìþÿ÷ D˜÷ *åúô5üÿöÊ5Ê5 ðôUüÿì‡Á’Añ ûTTÔ•@Ô• f÷ ø�í‡Á÷ B 7zùÀÁªÂ ýÁ¤Â÷ æÀL!÷ ÒÀV÷ ʇw ªôÀ¤ä7`ù7\ùÀœä÷ @wRùÁ¾Â ÷ ¨÷ ²æÚ#Þ I‡÷ ä†wB÷  7 (ù ñ÷ ÚìÄêø÷ ÷ ú  7 ùß÷ î÷ öø÷ ˜�ùÔ÷ äø÷ †�÷ ~�Àå7œøW!i‚Å gý ÖêÁˆøBà÷ ·‡wÆ÷ 8@÷ ’€÷ ŒÀ÷ œwª÷ Ú@ ñ5 ñ5 Å(ä@a÷ \@@a÷ R¦ÂŠãƒƒ ‚·$øÒ à ú&€÷ .€÷ @÷ À÷ 0w>÷ ,w6÷ ÷ ¸�÷ Ø÷÷ Å ÷ Å úwÂ4å‚`Á÷ æÁÁePó ±PPÔЕÐ Ä%” ‚æ!00ÖÀ=�8§3eaek›’ÁBà÷ „‡ÀVïp°÷ " †`Á÷ Âå�`‡w ´òÀ®âÀeæ6Þ ‡ðµúðµ ö0ðµ€0 ÷ \îê‡Ärâ&Ž Á÷ ¸ì÷ >îÁðµðµ p`Î îÖ ‡�À�À‡Ï ÷ ¤÷ Èö�‡&÷ –÷ ºöÎ úÖ ‡Á®ö÷ ØÿÁ ü‡÷ ¸÷ ¾ÿ7îõ÷ ¬÷ ²ÿ7äõ÷å„öÁô‡&÷ ÖÿÀØáÀe÷ Næ=‡wjö ÃÌáðµ  ƒwNö¦÷ þë‚€‡&÷ ”ÿ÷ nß ‡Ö   ðµðµ€÷ Ìëðµ Ámìá f÷ B�€‡w(þ ×-ºá&÷ ”ëŽ&Œ÷ ˆëÁm°á�e€‡÷ >ÿ÷ Ò÷å²õ@lñ5 ñ5 Àm„á÷ ºþÀ÷ ¤ÿ@÷ ®þÀ÷ ¾þ‡w âð÷ÿÿ õ& æ,â· –õ¦�÷ ìì7ÂàwÆàÍ �÷ ë÷ ‚ì& íÖ ¶#ê–%÷ bõ�÷ èêóÖ ‡÷ Tõ ÀßJõ· FõÀ†â÷ ¼ †ð¥öÿ*± `Á ÷ bã7õ7õ‡÷ ºÿ&÷ ´ÿÀ€U‡·õ7 õ÷€øô7 òô7 ðô7 îô€Áàfj&�Ž÷ ~±‡÷ Rê6¦vwòßÂæß7âß÷‹²ô(Àe"ÁæáÁeB$$$ÀåÁe((Á°ß·<zôw<rô  w<hô÷ ÷ ÷ ÷ Vôw<Lô·‘Jôð•#÷ °†`Á ÷ hâ÷ ò÷%’àWñ5@ñ5 O€f &�F÷ ˆé6¦vw(ß7ß7 æó÷ æó*7<Üó&ð5@ ÷‹Óó÷ ª÷•Çó Àôàð•ð•÷ &‡÷ †`Á ÷ Èá÷ „Þ ÷ Ê�Ž÷ |ê·Ž ÷ R÷ fÞ ÷ ¬�÷ `êŽ7Š]ówvþ÷ Ró ÀŒà7ó‡7 2óÀ`ÞÁnà÷ æçÁTÞÀbà‡÷‹óÀVà  ÷ Œ‡�÷ Vêw .îÁ�� Á EÅå‚EÁ ÷ r3Á÷ ÁÅ÷ JèÅ ý‡ÀæÝ 0 � Á Á À(÷ ²æ‡w ÈíÅøÞÁÆÝ& f wˆò÷ è÷ RÄ  öÄÀœÝ& ff÷ àç÷ ,ö� ÷ Òç– N ñ– õ„ !‚æ6ò¦í– ‡U ‡€ø&ì' ÿ 莨2ÿ øçš®2ÿ ðç¦;ÿ èç¦r=ÿ à禶=ÿ Øç¦²5&æ¦f&¦ v Þ €�‚ƒ„…‡RO€K'æ2RW€J'æ2SV€K'ç2L'BÁ Á ýõÿÿ.õî*õõð* õ &• H’ � ¢ûƒ€ ¬ÿÿ;ö ôàwà4途 — ; — !— ,— :ò&À u@à5€Åe,‡ ¤RN¢Oõ€þÿ¢WE€ ”‡5& ”— , — ! — [Ž ó— ]ðÎ îÎ ìÖ )@íÀ 55 ,õÿÿ.@÷ z‡õÊ2÷ †ÑõÜ2È•f ¦Â4÷ þ‚�ð5€ƒ@‡– ÁÂpwæÒ· JÑwÀþ· BÑw^ÿ ¢-õ€þÿЋ¤Sæ¤Vã”Íÿÿ‡f¦æ&f ÅÂ…`Á Á ý°* �… !†ƒ”×  ×  Ä õ× ñƒ× ÿî× "D × a‡× z‚Ä ÃE Ñ�ÝEp(p°à„… †ƒ”× $ú× 0‡× 9ôƒ× A‡× Zîƒ× _ë× :� � ‚„… V†ƒ”× [È•]× <È•>È‹8 … |†ƒ”× %ú× *÷× -‡× .ñƒ× 0‡× 9ëƒ× A‡× ZåƒÈ ‚ … |†ƒ”× 0‡× 7÷ƒ× *ô× ,A ïlÈ jÁ hŠ„ … q†ƒ”× "A øÁ ö „ #A … c†ƒ”× $‡× %÷ƒ× *ô× 0‡× 9îƒ× A‡× Zèƒ× _å× .� £ß … †ƒ”× .× ; … f†ƒ”× 0‡× 9‚� õ]× -Á X� í× *Á QA æ × ,Á D× = Á >È5 B>ÈU °(wZþ× /*Á .�Á … .†ƒ”× $× -‡× .ƒ× 000ÖÈ=’:l1DATADATADATADATADATADATADATA‡× 9ƒ× A‡× Z ƒ× _ × :Áÿÿ   DÚ× " Á … †ƒ”³á°0±…„ƒ‚�‡f¦æ&fæ ÈE¢¢^Á`Å÷ úÄ ÈUQÅÿÿ÷ æÄ ÈUQ ÷ ÔÎË€ÈUIá ÈUà `¢Ãe á ÉáccD ÷   Ä”¡%¡*¡.A ÈU Å ï0 0 ��W ,ÈUw@W /D ÷ DÎÄ cBDaW£-Á�Á N�… W¥N W¥OD!†B�“Á N�{É …CÃE€€C¥ÃC¥D!‚Ñ ó�ñ‹þÿ€D! ΋ñ5 Ñ þÁe߃“ƒ Î�à UÂåÔpRpR„“pBCÃ5D ‘ƒ à KR΋KBAÁE�—­:ŒDœ0CŠÄŠý ÷ fÎÄ ÁeëB”—   ¡ƒŠDÒ� CS•ÄŠÞü ƒÐ÷ Ò ‡W¤†CÅ E Cs ÉΕŠ …„ƒ‚�‡f¦¦)& 6 l(¢*¶„„íƒ †�”Å EÅ 'W "Å =N íÎ ëW :+W =Å 1 Â#W ,W /Å %W %W *ÑöÕ€ÍÄ W <ÈW [ÄW >W ]¾„ v�¢°(°* 6 ƒ…Æe‚�‡÷  ø¦Âe°ÄeȵÄeà Ã~÷ Úü‡Á DE  ȵÄ2…Åe &Âe ÷ Š€ †ß%�ÿ&'ðÕ@±^ÃeðÅÁ5€ðÕÁ5@ðÕÁ5ðÕÁ58ðÕÅ“B„Äe€Ãe°ÈµÁeÄeÐÿ& q1””BÓ$ðñðñ„Äe q1 ””Bð ñð ñ¡–‡w ´ØÁ w ªØÁ& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡w <áð*æ8Iðµ÷ 0œ*=‡ðµ€)98÷ Z ÕeBÕ && ð Îå¶ �ÕU€�Ä÷ L‰�†ð¥öÿ*ð¥åÿ*Æe ð*Nlv °°΋œ*ðµ.2÷ ä „& ðµ#ðµ!ðµ)&ÎePæÂ(ÂeÊ ¦æ&æ•&Äð >€Åe >ÍE€÷ ¨†�•p�*÷ êw"ð 8 ðµ!ðÕ€)wÌþð•Öÿ*wð‹*±‡ð*‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡0Š+æ1ÿˆÅ(Åe à ÷ �ÿß%ÿÿ&ïp’*wjÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ Fÿðµ82Áe&À(÷ Ø€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡¡ðµ)"ðÕ(.÷ <ðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ Ì÷ ðÅ(.‡8Áe2 ‡÷ ìÿðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ ^&‡f¦æ÷ (÷ †ƒ‚„÷ „‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ &0ž8*wÞý±ðµ=p!†Õ•^ú‡141612Áepðµl2l0p‡,*ÿÿ±‡æ1ÿˆ‡46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ ýwýÄÄ÷ FýU•Õ8UMwRýÅåà wæü0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w ”Ü Á�   ìì� .Â% ÷ ¸ü ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ ¨ü ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡÷ N‡w 6áÁ(ñ D÷ Bð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwtÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)ÁeB÷ î ‡÷ Lñ \ðµ#÷ ~U†&œ* ðµ=ð¥æ•Øÿwô Å`p!2üƒÅàÅ… ÅEW!Åp0p2÷ Pׇðµ#(ð PðÕ)÷ †ðµ@#ð¥Çÿ*ð*fff÷ À±±‰‡÷ І&œ*wjðµ.÷ nB‡ð5ð(8ðe$8w2€æ•ÖÿA&À(Áe÷ ÆØ€†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA#ðÕ@)00ÖÐ=�8§3eaek›’)÷ > †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ ä00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ ‡0 @0 ð‡&œ*0 @÷ uÄ÷ @ðµ# ÁeB&B÷ f°B÷ ÷ n°•*±‡÷ â ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ j0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6w€ð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡w êÜÁ(DB‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±DÂ(Âe(¦„Äe$2ƒÃeäÿæÓÏÓ Ó(‹ÿˆ‡Ì%[]Ì%<> ƒ ÷ X„팂1 >‡w VÜð*ÁeBð 8÷ ¦‡ðµ÷ æ‡w ,Üð*D÷ ¼ Õ ýwÞf&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡w šÛBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=w„Å(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡141612Áepðµl2l0p‡ðµMðµ=ðÕf�Â(& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ðµ=&Îe0æ ÷ U• Â…à  ÂE•Õð >€ >ÍE€ðµ=ufÄ÷ p†�ñ ± wh÷ " ‡f÷ Æ�†&œ*÷ °•*±‡Ä Ä Ä ðµf÷ |ð >€5>õE€u ÷ ’�‡ñ ± ‡ð‹*±‡ð*‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡÷ äÿMÄw 0Š+æ1ÿˆÅ(Åe à ÷ ‚ÿß%ÿÿ&ïp’*w\ÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ 8ÿðµ82Áe&À(÷ ÄÑ€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡ðµðe6p 4÷ „†8÷ îü±‡÷ º†81416÷ ÷ .ñÅ ÷ T‡‡÷ ê†÷ è‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ ,þU•Õ8UMwFþÅåà wÌý÷ NþBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�wvý46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ ýwüü8Áe2 ‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡Â Âw Ná ”Å¥ üÅ¥ ùÅå0B¡†€÷ ÜàAa”ôœÿÿ‡w á„ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ hàE�€Aa×$Ò±œÿÿ‡÷ &÷ &÷ �’•’•€‡@Á(÷ @àf€  Àe ÀeÉÿÀe Àe ‡w TàÄ'Å  ÅUD$†BA÷ D&�Â(÷ ÅU� ÀBQ÷ ¦ ÂЕ* ü‡%2R %P%2A -R%F%X Memory allocation map TKB %2R Page %M%N%2R%15S%Y %2Z%4N%4N************%2NUndefined references: %2N %2R%N %2RTotal task size: %M. words%N%4N*** Task builder statistics:%2N%4STotal work file references: %T.%N%4SWork file reads: %T.%N%4SWork file writes: %T.%N%4SSize of core pool: %M. words (%M. pages)%N%4SSize of work file: %M. words (%M. pages)%2N%4SElapsed time:%3Z%N%Nf÷ jÙ†Â(Á÷ DÑ�ÁeÁE�  Á ý‡Á,Á*Á(÷ ÁeÁ(÷ ð ÁeRRR‡÷ ø×¦vÁôÏð pbÁeBÂeRRRRR R RÞ �‡Á÷ Xÿð|Í&Á˜÷5ÏÁe ÷ ”×ð"ð•�ppplðe5lÂet²°”°–· È͇·:Ë÷ Špðæ4°4Îe°6ð•(ð4÷ ú ÷ xH‡· ¾Î· ¶Î‡·ôÊ÷ Hð ý pðæ4°4Îe°6ð•(ð4÷ Ô ÷ ,䇷 vη n·�7 ¼üwœ¶ü· ²üÁeÀT·‡ææ)ÿˆwŒšü †7 ˜ü±� ÁI÷ ŠÏ‡Õ ÁAæZ”� ‡Ž ‚µ�þÿ”� ‡Ž ‚µ�ÿÿ”Ö 5¨2®2È‹Õÿÿ+& È¥+È¥-Î € Ê Ö  U÷ œÿÀ ÷ Êÿ‡ �f  ÷ æúuüÿ ‡�÷ Úúuþÿ‡�÷ Îúü†Ö Â¥ Â¥ ”ø‡È¥ È¥ € ø‡JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECABDEFIMNOPQRSTUXYZ<>%`h‚¢Á*„ÅÐÜÖ „x*%/w `ÛD…00ÖØ=’:l1DATADATADATADATADATADATADATA&&÷ bЕ-�Î �eÁaÁe}ÿP”P”P”Е-�$w 0ÛDÅ… ƒ÷ &Е.À À À ce÷ ÐÚÀ …Е:÷ Å ù Â÷ 6B‡w ÜÚ&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ DùÀ ÀCƒ ÁÁeÿÂ!£ ü„  ÂaÂeîþ‚bÂEÊ Ö ÌЕ%„Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ ��à õ‡& æÎer6& ¦æÎe^/& æÎe’ù*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎe$ & ¦æÎeЕ A‚¦Þ à ÷–%‡& æÎeäòA÷ ÎøÃ û‡Ð• à ü‡A÷ ôýE‡AÂ÷ þE‡Ð• Aæ÷ šøAÎ ûÖ Â ÷ $Е.÷ ‚øÂ÷ AЕ; ÷ bà à‡Â ýð¥ ÿÿùÀ øw ÖØ÷ ¨‡ðµ)ðµ÷ æ 8C÷ $ð¥öÿ* ðÕ)ð ð*wÜð•öÿ*ú÷ ì÷ Èõ‡ðep p ‡÷ „è‡ð¥#ðµ=Ä E”W¡9ƒÅ¥^éð•³ÿ*ÐÅå0ùà Å`à à CaÄ ëÃåCƒ Ôà ðµ=ðµ÷ X ð¥ð 0Àð•Øÿ*§ð¥ ðµ= ÄEÕ¥^Ä ûA¨ð¥ æÂe@ÃÎà÷ Þƒ߇÷ ðµ=� ÁEpÓðµ2ðµ!)8ÂeEÅ`l0Å …à ì0‡„ û0¡/ &l0Ä ü„…`pÄ „löÿ06°ôÿ4p 4÷ ˜ðp°æÄ ƒðÎà÷ 8ƒ ƒ÷ Vá÷ ù†ð•Øÿ*Á`‡ðµ)wÐæ÷ øƒ‡æCàƒ#ƒÎà÷ bÎ ¦÷ Èÿ‚ð†– ‡DàÄ ‡ðµ@) ð 6ðÿ?0ðÅD)‡w rÖ÷ ÈðµðÅ)÷ `†ð¥öÿ*÷ îw–46l0ì‡w .Ö÷ n‡832cðµd& & & B öŠð 2OðµðµΕ ¶“ðµ à N”à Υ$¶“Ε Åð 2ƒ2Åà‚Î¥ Ž�Î �æ÷ JƒvÂ Š‚ ƒ“Ε f÷ rƒ�ׯe÷ ð¥óÿ*÷ ²Æeð•Øÿ*w–ðÅ@)0,÷ `÷ ìò‡ðµ ÷ h‡ðÅ)÷ pðÕ)ðµ( ð¥ Ó ðµ=Ó ð¥Ó lð 0Æl‡ð  ƒ÷ ö†ð¥øÿÿ÷ 0¶‡ð¥/ð ðð¥Ãe&ðµ=ÅBaÀ@aÁ ÷ XÔÁe0b�Å ÷ÂeÒ€ð¥Áe@Ã÷ Ô^‡÷ ÆW‡ðµ=‚ ÂE°8óÅ Ãe…l0Å Åà & ì0‡„ l0ù…Å`pÄ Älöÿ06ðôÿ4p 4÷ ªðep ðÕ)ì‚wnþðµð¥Ã% ÷ Ά,÷ À÷ ‡÷ 0w>þ÷ z‡÷ J†wv‡B æƒàƒ#ƒÎà÷ Î f÷ Ìÿ� ‡Â`‡ð¥öÿ*÷ ”w„±ðµ)0406 l0ì° ‡w Ó÷ Œ ‡Ä0,0w ¿÷ b‡÷ š‡w äÒ÷ f$‡Ä0,0wç¾÷ <†46÷ F‡÷ fðµ)0406 0 ð‹*±‡æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w hÒ…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ ÒW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡ð‹*±‡ð*‡0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w ^Ñ Á�   ìì� .Â% ÷ n ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ ® ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡±ðµ=p!†Õ•^ú‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡ƒ  �D„PÄ5Rà ý†R”‡R”R”à üøð 8 ðµðµ÷ jþ‡ðÖ*±‡ðÃ*±‡ðµ=D…÷ ì ‡ð`p4°6÷ ÿ‡æf¦÷ @°6°4/‡ðµ=Á  ÷ RðÕ@)ð 0 Ö 8wè÷ 0ÿƒ46÷ þ‡8ñÕ ÷ ®°eð‹*w®þÖ ±‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡ðµðe6p 4÷ 2þ†8÷ ±‡÷ ¨†81416÷ â÷ lñÅ ÷ ’‡‡÷ Fê†÷ Ö‡ð 8 ðµ ðµð �¡‡ð•Öÿ*±‡÷ ¦ü÷ „ 4 6Ååà ÷ .‡ðe6p 4‡ð&*‡÷ Rðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ ü&‡f¦æ÷ €÷ ø†ƒ‚„÷ V‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ º0ž8*wªû0Š+æ1ÿˆÅ(Åe à ÷ @ß%ÿÿ&ïp’*w~û÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ Zû8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡141612Áepðµl2l0p‡w vÌðµ Á¥ðÅ)÷ ¸ú‡÷ ”ÿ ÕfU�Ä÷ ôþ…‡ðµÕ%  BA °`6p 4p`4¡ ¡õ%þÿð60 4‡46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ êùwÚù¡ðµ)"ðÕ(.÷ Âðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ pú÷ <ýðÅ(00Öà=�8§3eaek›’.‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ VþU•Õ8UMw²ýÅåà wöý÷ ºýBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�wù8Áe2 ‡w Xá÷ ‡÷ ‡w HáÁeB$&w ÁeBÉ ð 8÷ ‡$&w öàð*ðµ<S1 ¦à Ö KÊ ñU€ò ñU@ò æ÷ 8ƒ‚f&œ" ÷ †€�†‚×'&�ÿ)×'&ëÿð&* ðÊ*Ä%0þðÌ*±‡NDÅ Å ý¦æ÷ Vƒ‚÷ ñEÿû±U‡÷ Ї÷ î‡÷ ´‡w ,à÷ (‡w¼‡w à÷ ú‡w²w à÷ ó‡wªw àBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=w,Å(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡Ä Ä Ä ðµf÷ €ð >€5>õE€u ÷ Ø�‡ñ ± ‡æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡ð*ðµ;ðµ7ðµ#3w .Þ *’$Ê ':æƒô �ô�…T•à ýƒñU@…Ê% D•ÄDÓÄ%][Ä%><w¸÷  †wññ1 ‡Ã ÄÄ%ñ,ñ,ñññ:4Š× ±‡w tÝð*DÅ Å ýæ¦Y…‚T¦fÃ(ÃeŠæ„ðµ<Ó•_‚ S•Ä ýó¥:ÿÿÓ•:‚ ƒ…¦æ& œ"& ΕæÏÿˆ‚4†×'&�ÿ ð&*×'&ëÿð¤ÿ*±*ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ ¤ ‡à ññ÷ –üð•Éÿ*‚ƒ‡w „Üð*æ ƒ ‚æ¦×¢"wf)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷ ‡eÄ%w ñU\ñ5@ƒ âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ "ñ5@\ñU@ñ5€áÄ„íÄ ñ5LñUþ¥*ñUÄ Å‚öƒàÎàà Ê¥*Ã%C!.D`÷ à*‡ƒ‚wòþÆeCÃ5€ñU‚Ã5 ±±± Ã5€± Ã5@±‡Æeð•Êÿ*±‡ðµ=õñU„Ä EÅe& ÷ RÄEÅe÷ Ö ¼Ó¥"Ý öŽwVþö Ë¥"  ƒ Ë¥"ö Õ”Ä Â Ä î ƒ  ê¶ Õ• Ä ü‡ð‹*±‡ð*‡0Š+æ1ÿˆÅ(Åe à ÷ @ß%ÿÿ&ïp’*wÀÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ œÿ8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡Â(Âe(¦Ê ññ1 ÷ `£(£(£££‚÷ X†� ‚÷ >âââââ‚:ƒô �ô�‚””à ý¡Á5Á ±‡ÂeCÃe¡‡æ¦ƒ‚ÃåJ„”Ä¥[Ä¥<C…Å`¥ ¡>C÷ ˆÒ¥,÷ ~… 4ÃB‚ƒ‚× *‚㨂 DÄe $ $ $ ÷ >‡ñz ñññ÷ Dù‡DEÅe     ýð•Ìÿ*1 ±‚ƒ‡ Ë•0‹¤þ‹¨‡—¢3‚¥÷ "÷ Ä ‹¨ ¥Ë”Ó”¦æ£˜Ä ýƒ‚‡‹¢‡Ê¥7‡¥‡æ5æ±ÿˆ‡ß%& Ëw þ×&Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë å¥.‹ Ä ÅæU¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë ‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±û&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡TaÞ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡±‡÷ &÷ &÷ �’•’•€‡@Á(÷ üàf€  Àe ÀeÉÿÀe Àe ‡ø45=5\5t5”5¼5Ñ5õ56B6`6{6£6Ñ6ï67L77¯7Ï7ü7&8[8“8´8Ó8û89A9e9‚9Ÿ9È9é9 :6:Y:�:«:Ö:ó:;I;w;§;Ì;ì;<:=j=¡= -- *DIAG*- -- *FATAL*-  DÐÁCÐ!n‚×  ƒÀüˆ  Á`ÁêÅôÍõµƒ ¦Áº~÷ FÀæ÷ tþ‚ÀÎ3× ‡ÀÚ3Áé”þá‹æè4!7ƒÎð4Þ Ä ð2”þÀŒÁæ‡Æå €&æ?ÿˆ,-fW >5‡W E5ƒW ¾s‡W Ås ƒW !€00Öè=’:l1DATADATADATADATADATADATADATA ‡W 8€ƒW >€‡W E€‚�W ¡Œ ‡W ¸ŒøƒW ¾Œ‡W ÅŒòƒÖ $|³Æe ‡ÿ TÞʤ<ÿ LÞÖ¼=Illegal Get Command Line error code%2NCommand syntax error%2N%VA%2NRequired input file missing%2NIllegal switch%2N%VA%2NNo dynamic storage available%2NIllegal error-severity code %P %P %P%2NCommand I/O error%2NIndirect file open failure%2N%VA%2NIndirect command syntax error%2N%VA%2NIndirect file depth exceeded%2N%VA%2NI/O error on input file %X%2NOpen failure on file %X%2NSearch stack overflow on segment %2R%2NPass control stack overflow at segment %2R%2NFile %X has illegal format%2NModule %2R ambiguously defines P-section %2R%2NModule %2R multiply defines P-section %2R%2NModule %2R multiply defines xfr addr in seg %2R%2NModule %2R illegally defines xfr addr %2R %P%2NP-section %2R has overflowed%2NModule %2R ambiguously defines symbol %2R%2NModule %2R multiply defines symbol %2R%2NInsufficient APRs available to map read-only root%2NSegment %2R has address overflow: allocation deleted%2NAllocation failure on file %X%2NI/O error on output file %X%2NLoad addr out of range in module %2R%2NTruncation error in module %2R%2N%D undefined symbols segment %2R%2NInvalid keyword identifier%2N%VA%2NOption syntax error%2N%VA%2NToo many parameters%2N%VA%2NIllegal multiple parameter sets%2N%VA%2NInsufficient parameters%2N%VA%2NTask has illegal memory limits%2NOverlay directive has no operands%2N%VA%2NIllegal overlay directive%2N%VA%2NOverlay directive syntax error%2N%VA%2NRoot segment is multiply defined%2N%VA%2NLabel or name is multiply defined%2N%VA%2NNo root segment specified%2NBlank P-section name is illegal%2N%VA%2NIllegal P-section/segment attribute%2N%VA%2NIllegal overlay description operator%2N%VA%2NToo many nested .ROOT/.FCTR directives%2N%VA%2NToo many parentheses levels%2N%VA%2NUnbalanced parentheses%2N%VA%2NIllegal logical unit number%2N%VA%2NIllegal number of logical units%2N%VA%2NIllegal default priority specified%2N%VA%2NIllegal ODT or task vector size%2NIllegal filename%2N%VA%2N‡Illegal device/volume%2N%VA%2NLookup failure on file %X%2NIllegal directory%2N%VA%2NIncompatable reference to library P-section %2R%2NIllegal reference to library P-section %2R%2NResident library memory allocation conflict%2N%VA%2NLookup failure resident library file - %X%2NIllegal partition/common block specified%2N%VA%2NNo memory available for library %2R%2NPIC libraries may not reference other libraries%N%VAIllegal APR reservation%N%VAI/O error library image file%N%VARequired partition not specified%2NInvalid APR reservation%N%VAComplex relocation error-divide by zero module %2R%2NWork file I/O error%2NLookup failure on system library file%2NUnable to open work file%2NNo virtual memory storage available%2NModule %2R not in library%2NIncorrect library module specification%N%VA%2NLibrary file %X has incorrect format%2NResident library has incorrect address alignment%2N%VA%2NPartition %2R has illegal memory limits%2NInvalid partition/common block specified%2N%VA%2NTask build aborted via request%2N%VA%2NDisk image core allocation too large%2N%VA%2NInvalid window block specification%2N%VA%2NTask requires too many window blocks%2NTask has illegal physical memory limits%N%P %P %P%2NLibrary references overlaid library%2N%VA%2NTask image file %X is non-contiguous%2NVirtual section has illegal address limits%2N%VA%2NFile %X attempted to store data in virtual section%2NResident library mapped array allocation too large%2N%VA%2NInvalid reference to mapped array by module%2R%2NEnd of f00Öð=ØD>§3eaek›’ile reached before .END in %X%2NSymbol %2R not found for patch %2NSegment %2R not found for patch %2NSupervisor mode completion routine is undefined %2NLibrary not built as a supervisor mode library%N%VA%2NSupervisor-mode library reference error%N%VA%2NIllegal system size specified %2NConflicting base addresses in cluster library %2NLibrary %2R not found in any cluster%2NIllegal cluster configuration %2NCluster library element %2R does not have null root%2NModule %2R contains incompatible autoload vectors%2NCluster library element %2R is not resident overlaid%2NSegment not found to address round%2N%VA%2NLibrary build not requested - ignoring option%2N%VA%2NIncompatible OTS module%2N‡À´ºÀe"÷´º´ºÂFIRJ÷ ¿‡w º Þ Áð»+÷¼»ÆÿÀÂÿ$7¼ÿ!÷ ü» ÷-tºÄ»w ¾»"ì&f÷ ªÄÀe"ÁDI÷ ƾ†–%ßwJº·Dº�Þ Ø±‡À²ºÀe"÷²º²ºÂFIRJ÷ ¿‡wžº Þ Áî»EæCÀfÁ@Iæ Þ ‡ÀeÐ-®ÿÐ-ªÿò– ƒÀŠ»$È '÷ Ô» ÷-Lºœ»7"–»,ïÁ’»a(Q$É éH"û7`ÿ&w ºwºA÷ bÄ¡�Þ ÀDÿÖ ±‡|³º~–,?J?JY) W 2ˆ— ÅTITISYSYTICLWKOV†°VγøˆÚbŽ.„ γ°Vγ÷5�wJw>f&¦‚Þ €�‚‡&æÿˆæ3ÿˆ„7ÿ¤ê TKB>Ñ̆L$  À @ à € €%2€>K€Wd€p}€‰–€¢8©°©(ª ª«�«¬€¬Ð¬x¯ð¯h°à°X±Ð±H²g³p³z³Ð00ØH>’:l1DATADATADATADATADATADATADATAW <°n¬¢¯”DSYSYSYSYTICL\L&TKB -- *FATAL*-Run abortedÀôÈ Ð·Zü÷øþÆPüÅnÄ>÷ ú Ìe÷ Œ ÷ ÷  Œ ÷  Œ Í5÷  ÷  Œ Í5 ÷  ÀÈþ÷  ÷5~þÖÀû÷ þ À°þ÷ ö À�þ÷ ôúw ö ÷5bþCŠÃÁ‹ �ÁÅ€÷ ø ÷ ì BÁŒ÷ f‡÷5€0þ÷ âü× †×-Fþ †÷<þ÷5þ÷.þ±‡÷$þ÷ æ÷ 6 ÷5€îý÷  üwVÿÁnÂ÷ wVÿÀ P�æþÿˆ‡wŒfû‡ÁÂû÷ ž÷ $ȲûÁ°û÷ Ž÷ Ȧû‡f&f÷ x7Jû�÷ nwŠû7†û7‚û÷ À‚ �� �`wjû ÷ Xw^û ‡7,\û‚ó‡7,Tûï‡  ±…‡æTÂ.Þ Â.– ‡Þ ænõ@‡Ð  � ¦÷ ò‚¡Þ ’$õ€ò þÿî’$±öfE7¦ú÷ 4€`Â. æXÞ Â. ‡5,‚÷‡5,ó‡  ±– …‡Á4 u$†· ^ú†‚ ø ‡ 1,ù‡‚1,ô‡J ‡±1,ù1,õ‡Á¸÷ &Äbúô Äeø� m÷ 7Dú„¡Þ &Ä8ú÷ e$â$)d÷ ö÷„±‡÷5ü‡w Œ & Ã~ÅÄÃAÁ ÷ r7òù@m7èù÷ *1 C7ŠÜù÷ øpMŽ ÷ ˜ð w" ÷ „ð ·Š¨ù7¨ù /÷ hð *w’ù÷ ä÷ À7‚ùw€ù ÷ F÷ ̃`÷Šdù÷ Òô·ŠVùÀTù÷ òÁefA÷  ÷ ^w:ù÷ l7.ùw,ù÷ ò÷ xÁù÷ œÀ ù÷ z& &Žì—%ƒ÷ –N õÁèø÷  V €÷ ÎÃÔø÷ ÷ 2Â÷ TÃÄøÁÈø÷ �ðs÷¬ø¬ø÷¦øÁªø÷ îÄewºþ÷ ò÷ ‚÷ Ð÷ A÷ ~ø‡CàÀ(ÂÁ ÷ Ò ‡w æCB�±÷ *÷ Zø‡‡÷54ú‡w ÀÅ„eCå %Eľ& 7 .øB�d÷ ð÷ ‡wø�ãdd�cA�cAdã±Áì÷¡– 7Ö÷‡æA÷ T&ÀeÐ Ð Ð Ð ÃÂCmõ †ˆ &�‚mŠó€ƒ‡æŽ`ÎeÞæŽ`Þ‡÷‹ˆ÷Ó Ãƒ`ƒ ¡±‡fà‘`‰²B`Šá ‡÷ J¦÷‹P÷ ÷ Òÿ‚÷ †æ÷ °ÿæƒ÷ ”ÿ÷ *÷±÷ ¡ƒ– ‡‹ ƒàò ² ‡ ±`p ð ‡f& €`ð,ø‚ ‡ð,ó‚‡ð, î‚& �à� �mV ‚– ‡·õÀBæ‚ã‚ �c€e ý‡w ÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡Á € ÁeÁE€± ,ù‡pàJ`‚2 ‡ÀÐ" &àe·#þø÷ D€÷ ~ð‡Á(  ˆ‡&÷ ÁeB—%þÿÁe‡1bÀe1^1\1H1J1L1N1P‡&&f÷ t�÷ ¤ÿ€h÷ ˆÿ÷eþÿÔõ¿ÐõÞ ÷eÈõ‡w ö÷ â‡EÅÁ‹Á÷ ÜÂr÷ AÑÁ B` ðd÷7^÷p‘AÁ÷ w”ÁL ÷ ²øw ¨EÅ÷ p†Á÷ ’Ä(÷ BÑ „` p‘÷ Šð÷7 ÷ð ÷AÁŠÅÅ @aÀe· úö· òö‡Áe?ÁE? ‡& fŽ Ž Ž Ž Ž Ž æYÿˆ‡· Æö · ÀöÀœ0 úBŠÂÀ¢ö €`±¡ Àœ±¬ùð€ö‡w ÞfÀ( ÷ øýE†Ã Â— Àÿ †Á@÷ jÿ‡w`ÞôK`/ËÿÿÄœ Ãÿÿ& D -ù‚ô‹öNñ ±òµ÷ vÃö €ÜÀ ` ƒ³ÁÀ(÷ 0ý�µ– – ‡·$ò÷ ÿ‡°Š‡·ò÷ úþ‡ðЇ·ò÷ êþ‡ðÕ‡BÁžõ¡ B — ‚ @€` ‡Š ƒ‚ B`·xõ¡±‡¦÷ *þ÷ �ÿ‚‡·°ñ€ ÷ þ÷ œÿˆv  ÷ üý÷ ‚ÿ€mˆ‡¡ �`÷ äý±@÷ Øý¡‡°&×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ ”2:%ÿ Œ2(ÿ „Jt)ÿ |n|'ÿ tž(ÿ l¶àÿ dÎFÿ \òÿ T".ÿ Ljâÿ Dލ2ÿ <¦²5ÿ 4¦ò6ÿ ,¦¬6ÿ $¦$9ÿ ¾è3ÿ îJIÿ úLI¦Þ5Îe‡w œÁ,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡w¼ù èŽ�ÿÿÿÿ4Ê5¦ „Ê €‚Ê5ùà ÷ƒõ…2Å Å ÍUEÍ ø�‚‡ ˆ Fì8‡ÊEò ÊU ‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&æ¦ff… Þ �‚ƒ„00ØP>D>§3eaek›’…‡&æf…Þ ƒ„…‡‡ &v ��2ž�¤$Ä&>�¤$pJ&n�&>V�&>b�&œ>J!�¤$ z&2%�Ä*´n†)�Ä*¼n’,�Ä* nz0�Ъ<�¶&=��ªÂK�|Ϊ"M�”ØÚÂòP�lìÎæZ�lp ÎÚa�”, þÂÎh�À&Àò l�À&¸òo�À&¤òþr�4 .ªjy�L#|:"^{�È&h.F€�È&€.R„�È&ô.:†�L#€".‰�Tª¶”¨2‚â”�¨2 vŽš�¨24vš��¨2 v¦£�¨2œv²¯�¨2D v¾µ�¨2PÊv‚·�ø4°¾Ö»�ø4ȾÊÀDIîÀ�DI�âúÁ�DIÄâîÂJ&æ¦f&¦ v Þ €�‚ƒ„…‡€SYxQSYâySY^SYº~xQSY¢_SY»zjL¢_LB[1,1],SY>CC@ÐDAÐLB ÐÍMPÐSSÐMA€ÑDL`ÐSHnSPoCR@nMA€+WI nHDÑPIÐCOvLI vCP€ÑDAÐFP@ÐMM€n-PIÐPRÐ'SQnTR€ÐXT€n3ACÐ'EA ÐHDÑPM@ÐSL ÐMUÐFUnROoAL€ÑCMÐSEÑIPwNMvCOvLI vSGwXHnIDnELvFMvCL vSBpFO@vîõü HÔ&$>DPb¶æØô5b÷ Ü÷ Âw¶ÀîÁŠÀeÁ û‡w b÷7 ²ùÀféð5 b$Å6Ãçæ ÃeÎ Ë‹úÀ÷ È ±ó Ä6! Á"÷ ñwjù¡ü– ‡ñ•ñ•w öö@pdf ¦Â4÷ ‚‚�B„œ$‡Äµ4ĵ!ò%'‡ò% ‡ò%‡E$ÂeæƒÕ�@à P”üÎ öÖ ÁÁ7Âe Á:Âe Á8Âe÷ jé±& ĵ€ V ‡11@÷ �†BÂeÁ÷ :鱇w ö5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ 8œ*AdBbAÁepÂ& ¦fƒÂÁ ÷ – –‡ÁPõµ aA”Aíf@pnp÷ êC*8Ö‹Á ÷ Ì88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ õÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw 4ôõ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ R5fµ fˇðµ ÇÈ•÷ >‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ ÊDlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ ¼½•8 †õ¥öÿ*ΚÎn‡w öòõ 8µŠjDl@÷ €T”ÔÀeBTŸ8œ5l@÷ 2‡@Á(ñ D÷ 0ÁeB&÷ R‡÷ ‡& ææ©ÿˆ@ð•#÷ ú& æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡Æe00ØX>’:l1DATADATADATADATADATADATADATARÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡ÿ üð2T'ÿ ôð>Ò%ÿ ìð‚Z4ÿ äð‚7ÿ Üðލ2ÿ Ôðš®2ÿ Ìðšú6ÿ Äðš¸7ÿ ¼ð¦;ÿ ´ð¦ =ÿ ¬ð¦r=ÿ ¤ð¦ò7ÿ œð²î2÷ hó¦Âe°ÄeȵÄeà Ã~÷ ˆÿ‡Á DE  ȵÄ2…Åe &Âe ÷ Ö€ †ß%�ÿ&'ðÕ@±^ÃeðÅÁ5€ðÕÁ5@ðÕÁ5ðÕÁ58ðÕÅ“B„Äe€Ãe°ÈµÁeÄeÐÿ& q1””BÓ$ðñðñ„Äe q1 ””Bð ñð ñ¡–‡æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡†JA¾$?¾$2–%%%LB[1,1]ODT.OBJODTID.OBJÊ~¨@ w Æî÷ â÷ÜÝâÝ÷]ÐÝ àľàÁ,÷ Ü÷ ІwŒáA÷ Fø÷‡ô¨Ýb÷®Ýüß÷ªÝðßôZ&Ãúÿô4%d3 î3 ®$ÀeBÁ Á ýA÷ T÷‡÷ D‡÷\:%°ßÃ%úÿô5b÷E¤ßõ5 ÷E–ßõ5÷UˆßÀVß Àå� ƒÁBÂe÷ üà÷ 4÷ ¬é3®$sî× üÿ]À@@ÀMBßX7 ÞÝ7 ÜÝ&&$&ôµ!ôµÆå €&&"æÿˆÆe À5'÷UöÞ7\’Ý7^ŽÝôÒ&$Á@PP÷ `†÷E@ÌÞÁBÜ÷ &éw²Ý÷ ’÷ é7îýw*Ü4 Pô@þN÷ xwÜ$°´&4 bôe&Ãew˜þÀ²ýÁ°ý ÃÿíBÂ@°PÂ@±PÀèÂ÷ ¬è úôDdôìÛb÷üjý7 dý÷ À†Á ÷ ºßw õÀ(Á,B÷ †å&&&$ÁzÛ$÷ äæð5÷5ìÝ÷ ˆý÷$%„ýô %$÷ º(‡ðb÷ –À°ÝÀe5Â÷ ~è÷ XÞô&ô2$7 DÞ÷ ‚‡÷ dw6ÞðHÛ´$´&‡`Á9÷ ß÷ ^†Á `÷ üÞ,\NL¡±‡ÀîÝ÷ ²åÀâÙ÷ ‚÷‡ÀØÙ Á¼ÛBA°bpd÷ ˆõ‡fîwôh·ô�` Š �ÜÁ�ÒÁ%/ -Á%/*Á%//$Àp¡‡œ`Â¥öÿÁÂ¥ÿÿÁÂ¥þÿ ÁÂ¥ýÿÁ Â¥üÿÁÂef÷ BÞ÷U Ü±‡ÂÚûÂeÂE ÷ Îåæ²$ÿˆ&À6׿º$ÿˆÀmÞû€ ‡ ÀíÒû ‡ÀíÊûž¦ ÊÀûà�bŠå‚‡÷ ÀÒÁâ Á ý· @Ü÷æÙ.Ü7 ÐÜ7 ”ÚÀÄÜ8 f÷ „ä7 ÎÚÀ(ÁòH ‰·¼ÚÁþÿæÞ$æ?ÿˆ÷xûÖÛ÷%ÎÛ 7 ÈÛ÷ <ÿ·’ÚÀ ÷U€ÊÛ÷U€ÄÛ÷ ºW‡÷@ŠÛ7 ¬Ü÷ ¸Û÷ ÀÛ÷|ÛÁf÷ 4äwÚÁ‚P” ýÁ÷ äwpÛÁ÷ äwfÛ÷UjÛ÷ Fð• ðPÛðLÛ w>ÛwèÙ7ÜÙÁe @ÁªÙ÷  Ý÷ zÝ7 Ü÷E€,Û÷FÛ÷*Ú7 úÙ7 øÙ÷\ÜÚ‡ÁK ÷ ¢Üw ˜éw0ÛÀ¢      ÷Û7 Û7 Û7 ÛÀ( W, (‡Á÷ Œ7ìÚÁ÷ €7âÚÁÜÚ ÀèÚæþÿð8úð•#÷ D †ð%è* 7 ú ï�7 úìŽ ÷ .‡Ž ±€‡÷ œù÷ "ý%‡A÷ œòö‡ñµ ÁÂp÷ ÞÛë÷rù÷ RñÀÔÚAÿ dù7^ùÞ‡÷ Rñ†ÂpÁN÷ °Û‡Áøê÷ òâ&&÷ �Á9?‡ÁäÙ÷ Üâ÷ bäÁŒÚÀePHHJ÷ Äꈠ÷  ð5@÷ jÚÂpÁ wZÚðl× ð’ê À�ÙÀe5Â÷ ^äÀ4Úð@×b÷ ÿ ‡÷ Ö†Á9`÷ Ûî‡ÀÚ&&ð5 bðð&÷ >°&‡ÿ çš®2ÿ 皎7ÿ 皨2ÿ 禲5ÿ þæ¦è5ÿ öæ¦ö5ÿ îæ¦R6ÿ ææ²¨2ÿ Þæ²¸2ô5uuuu w .î÷ "÷ &w*Á¼$A±q#úq-ö‡ÿ @íJ"'ÿ 8íVR&ÿ 0íbJ&Ö¯R(1±Rg(“±Ì…(ß±à`ý(ó¯Ð )Â&3ÿâ&ê TKB>l^SY†7 –ý÷¼$’ý7 þÀ8ßÀe`Á2& ý÷ †æÁ¼Þñ@bp$$Àß0 b÷ hö@‡Àef7úô` Š÷ žÈ¥;ìÈ‹êÅJ&% % % % ÷ ŒÂ¥:uu÷ r÷ vÀ & ”W¤ û‚ÿ ªôÁ ÷€e)Á&I#q-'ÁeW 2&õ‡Á$0Âefœ`Á × üÿÁ× ÂeâÿÁ 00Ø`>D>§3eaek›’× þÿÁ^× öÿÁ ÷ ÞÞAÁ5 Â¥;U%ÁEÉ ‹Á#wÖ ÷ øüÁ(w we)÷ ¼e)Á(Í ræ æâ)Ä�e)÷ Že)Á)Í lÄ æ æ˜)÷ ¼U%ƒ Â¥;Â¥,Q÷ d÷ Xe)S#S-ã Ó$Ë ÷Á*IÄÂË ã€ÄÒáÁ ÷ $‘%‘QüÿQ *& ÷ NüÁ&1Í &f÷ JÁVóÁe f÷ ì�Ö 7"üÒ ÁRRRÁ2óACà`Ãe ÒR”þ?jû7fû‡Á%÷ ~ü†‡Á'Âó÷ –Ý·rØÀðÜ÷ 0ö÷ „Á2&ÂÀe`P ý‡£ &€ÿ,@ÿ 3ÿ@8€„K@oMBaÿTq ÿØrÿt@,ÿYeÿÜYxx@ÿßY`èYè5ÿ 4鎨2ÿ ,馲5ÿ $é¦î7ÿ é¦,8ÿ é¦ò7ý¨X[<$09AZ (),-*! ¨'ú&4'¾&n'�'Ð&R'R'R'7 ¾ÿ7 Êÿ7 Èÿ7 Xþ7 vÝ÷¶ÿÀÀ$ P @%ú‡ÃÂ$ÀH% #ÄÒ%À¾þ$$÷ :Å"&B“‚ Á Á üœr0¤$Iz<&Ã%Â$U÷^ÿZÿ7 XÿO× Â$÷‹Jÿ8÷€Dÿ÷5€†ÞM÷5~ÞI÷€ÞE÷ ¼ý÷ ÿ· °ýÓ$× @%†Í¥pÍ¥&ðÕ€7 øþ Á-A#÷ ~ý÷ xýã(× Â$†3Á%2Â$&Õ¥J“ÊÅÅ °Ò÷ ¨þ÷ Hý° ·`Ü#7 �þ ÍEwÿÍ¥Â$&J�ÊÅ·nþî#× Â$Á.w‡È‹È¥;!Î%†%õ ‡ÀD%ü‹9ü¥;5Á&H¤1H¤/H¤-H¤‚H¤)†H¤‚H¢%†Å”u 1&Å ûÁ+wª÷ –ÿÀ@%W­7&ÀL%W­7& Á÷ ¬ðp�7&‡Å(&&÷ ¤À e)È¥:2È¥./È¥[,È¥<)È¥/&�ãW !†÷ Tý‡Ö ÷ &ÿñ‹ fAœf÷ J…‚‘”Å ý‡!R%ƒdd‰Á,w€Åê& ȋȥ-È¥)È¥(È¥*Πȥ, Ž È¥[Πȥ]Î ”âÖ Z÷ ¤þÁ,÷ ÒÅåêðêp÷ ¸J‡÷ PóÀÒÜA÷ ÀóA‡÷ TóÁN>‡À(Á,B÷ ŠãÀ®Ü&&ð5 bðð&÷ ’°&`Á90‡÷ pð5@÷ ~ÜwxÜðŠÙð²ì ÂdÜòpÙbfÁ÷ 6Ñ Ñ‘‡Á%ÂpœŠâå Àe 2÷ Ýÿ Ré‚Z4ÿ J馲5ÿ Bé¦è5ÿ :é¦î7ÿ 2鲨21±o†?±y‹„'¾' '¾'À'‚(„'„'ô(Î)v)ż$÷ 0Á’Ü÷ þç7Îÿ7 Ìÿ÷€Èÿ÷5¾ÿ÷EºÿÀÀ$Ð P @%ú‡ÄÂ$ÁÊÞ÷ ’é÷ Hé÷ æÁhÝ÷ <é÷ (éÄÀ$÷ Î%!@%ù‡À@÷5hÿÀÕ7Hÿ7Lÿ÷ ªÞ÷5Nÿ÷ˆÝÁ†ÝW  Á � Á CÁ ÷  74ÞÀ`7\ÞÅ&÷ ÷ ÆÜ5Å&Á<Þ÷ é÷ ºèõµ· .Ý´ dÁ÷ ÈæpppðˆÜ ÀÞUÀe÷ pà÷ JàAÁåÀf÷ Àã÷ ðáÁÞÝ÷ Pè‡Á‚Ü÷ Ìæ7pÜÜÂEz4&ó5õUÀð¥æƒ÷ �ã‡÷ ä÷ úç÷5 Ýp  p´´pp��õµõ f&÷ f€°�p÷5`Ý&÷ N€°´p �ðÕó5õUfu°p ð¾Û7°Ûw´Û÷ tç�÷ ôå÷ zçðžÛÁñ¥<ƒ÷ ÐfwXÀð¥2ƒ÷ ÷5ØÜp  p´´pp��÷ çu ðNÛ wHÛ ÷ ç÷ ç÷ z÷ ‚å& Á,Û÷ ðæ�÷ @ç÷ öæwÛw�þÁÁeÁå@Àe÷ xß2†Á÷ øäfðððœðÅó5ðÕÀÌÚÀe ÷ ŽÞ†÷ fÞ÷5Ü Á÷ D°ÁžÚ9–1–Ö õ G@Á÷ Úä÷ `æw ŽÜÁe & NÎe ó5ðU À^ÚÀe5Â÷ ~æ�õ !÷ ”ä55ó5õUõÅÛÿõÜ÷-ÚnÛõÅõõõµóµ€÷5€VÛ÷5NÛõÕ÷ 8uµ�÷54Û÷ $u µ´w8ýÌ%æ´Ù÷ *ý�Ì$)‡Á÷ žãð]Âû · Û¶û÷e°û‡E B�œÁE€ÿÀ(E÷ NâÅ ô‡ÿ œè¦²5ÿ ”è¦R6ª*²*š*š*š*š*š*š*š*š*š*²*š*š*š*š*š*š*š*š*š*ª*º*ª*ª*ª*ª*ª*ª*ª*ª*²*ª*ª*²*ì'š*š*š*š*š*š*š*š*²*š*ª*ª*²*š*²*²*²*z*‚*ª*z*‚*ª*b*b*Š*r*ª*j*"*²*ª*²*š*š*ª*ª*š*š*š*š*š*š*š*š*š*š*š*š*š*š*š*š*²*²*²*ª*Æ.ª*²*²*š*š*š*ª*²*²*Ÿ s¥$Ä*£’:l1DATADATADATADATADATADATADATA`.èr V%Š.;}ÀDX%”.€€‰Z%ž.«„^%À.y…ø`%&/º‰Ápc%@/}Œàe%d/ô‘¸’l%h/,„–o%Ž/,s:q%†/­/^­� R' Enter Options: TKB> @€–,A|%w „ì÷ Î÷à ¢Û÷5ÞÝ ÀvÚðÅa÷N'TÜ÷ ”‡7 JÜ•!Àê÷ bô‡&ü „øÀDÚðÕa÷ ùÀžÜÀm”Ü€  ƒ÷’Ýw^÷ ÂÀ ÷ ¤‡fÁ^Ý÷ Væ÷ Üç�‡¦÷ èÿÁHÝ÷ ªçÀed7úþAÁåÀe¾ÿ÷ Rà1†Î‹· ,Ü¿ ÞþÁ÷ Æåpp°UðÕ@pMðzÛ ÀöÜ%Àe÷ dß÷ >ß×-úÛ Åå AÀf÷ ¬â÷ Üà±‡Ö ‡·PÙÀnÙðÕa÷ FøÁÂp÷ XÞ‡w Lë÷ vw Bë÷ lÅpÛ Ä¸Û÷ r7"jÜ7,dÜ9ÃX7Žü÷EõÿˆüÃA3"3,'ó5@ó5îÄÄEõÿÄ-XüçÄÅ ÷ à #ÂŒ   B`‡ „ ‡E ‚Ö Ä¼ýÔ Äe3#3-Å õ±¡‡÷ ØÛ±€w zê&ÄBÀp'Äv'æt'ÿˆ ‡Á&ÂÊû÷5Æû €‡w >ê÷ÿÿ´û& æˆÛ· ªû¦�÷ Hæ7Úw"ÚÍ �÷ hä÷ Þå& íÖ ¶#ê–%÷ vû�÷ DäóÖ ‡ÿ "éz°/ÿ éz˜0ÿ é†+ÿ é†þ*ÿ é†î.ÿ úè†�/ÿ òè’+ÿ êè’Z0ÿ âè’21ÿ Úè‚’3ÿ Òè‚,4ÿ Êè‚44ÿ Âè‚ì2ÿ ºè‚r3ÿ ²è‚$4ÿ ªè¦²5ÿ ¢è¦¶7ÿ šè¦,8ÿ ’覰7ÿ Šè¦ò7ÿ ‚è¦â7ÃSwÊý Ä·×ÁÁ Áe ÷ ®ÿà wêw䨇·öÖ@$à ÁÈ "ú‚7$lúƒ7þÿdúÁ óÁÁ Áe÷ pÿ?:Ù76ÙÐ PAPÐÐ�Pà ý‡Ã0wRý·¢Ö÷,Úw¦Øw¤Ø÷@ ØÅø÷ ¦üÁôÙwfäW#€‚Í Í w´Ø‡ÃTwý÷5€äÙ÷âù7  Ù7  Ø7 žØ÷ÿ®ØÍe ‡ÍEM M M MŒÍw–؇·(ÖÁÁ Áe÷ Äþă ?dÙ7`ÙÐ È(ûÐåPPPà ý‡·òÕÁ'·èÕÁ'ee·ÚÕAÁåÀ\÷ Ú܆Á ÷ jþpppÀ\÷ œÜp‡·žÕæ‚“÷ ´û‡Î ðµ· ü׿ ®úðÅ ðµ÷ ä×ÿ –ú°Óp÷ PãÖ ÁÄØw6ã·JÕ& Öw¤×w¢×‡÷5 ÂØÃmwØûæXúæVúwPúwNú7 LúÀò,÷ èü·>ú·8ú÷ 8úÃlw¦û‡&À ×7,ú 7,ú ÁþÖ÷ ÒâðU· ú€‡÷VØÀäÔðÕa÷ ¼ówôüÀÒÔðÕa÷ ªówêüÀÀÔðÕa÷ ˜ó÷UØwâüU%Í W# †w×w ×wׇw:·hÔ@× A÷ îû@‡$Á5?7Â5?3ÂŒB B B @÷5€¶× *·t×Á=¬÷%Á ÷5€œ×÷5ž÷÷ Ôú‡· îÕƒ÷5Š÷7N×7L×wŒÖ·:Ö·8Ö÷j÷‡Ã@ÃRw|úW#ú‚w"ׇÃ5whúÍ w8ׇ·°ÓÀÌø  AÁEøÿBÜh'C ƒCÀ ö·�|Õ÷�ìÖ‡·†ÓÀ¢ø  AÁEøÿBÜh'C ƒCÀ ö·�TÕ÷�ÃÖ‡wÈÖwÆÖ‡wæÖwäÖ‡U%Í W# †wØÕwÒÕwÌÕ‡Ã6wÖùw¸Ö‡Ð¥[÷ 8Â¥,å‹f™÷ (�Â¥]å‹U�÷ °û”‡Ö ÂpÁ÷ ر‡&÷ ŒûÂ¥.€å ÷ Žû÷ ‚û”Ö ‡w#Lö‡W#ú‚w@Õ‡Ã1wVùW#& W#BaÃwBù÷ä ÒÓ‡÷à ÊÓ‡wòúW#ƒW#‚÷ÖwöÔ‡ÃUÛ·`Òæ·XÒ& Á÷ öú°?ðÕ7ìÕ PH‡Â pÂ¥;mÂ¥!÷ šÈ¥;eÅ'÷ „Â¥=7e)Ä„%t#t-Äe ! 'ô‡Á87 ÷ È‹-È¥;*ÃEÅ'· îöô­êö÷ 6Û Â¥,Â¥! Â¥;Â¥:éÁÁ ô5Á ô­¦öÁ!œÑòÕaÀ’Ñ÷ pðÂp÷ „ÖÅ'Ãzö¡±‡w hã&Á"÷ dÝwlö7föÂòˆJ· :Óõ•ÿÿ€fÅe& ÷ žÂ +— ;(— !%— ,— :)Ž —£%êŽ —£ …Õ ÷ Dµ“þÿ¶Š— ,— :Ù÷ D— : ô—£ö‹Ö …5Ї–%ÁÂpw¼Õÿ îá‚r3ÿ æá¦î7ÿ Þá¦,8ÿ Öᦰ7ÿ Îá¦ò7LB[1,1]LB[1,1]:-0-Ö.:-õU,÷ ëÀÛ÷ ÈâÁæÁeà÷ <7¤ÿÁÀÆ* Á ýÃB÷5@ú÷58ú7÷€Šÿ÷SY’ÿBÂe÷ FÁÆ*ÂÀeB ýÁeâÿ  ÷âyXÿB,D.�&Î Î Î Î ‚ÕÃC! ‚ÂU@÷5€ÊÙ„    w" Å ÿÃDÀNÚð•#÷ | ‡ð•ðð•÷ l~‡Ãd÷5„ù ÷ þ×÷ rÙp÷ jÙ÷ bÙ Ãcñ5bÂU÷U@NÙñ5€ÂU÷5€4ÙÂU@ñ5 ÂU ÷ ÄúÂU @ @ìÀEÿÀ @ @ @ 7�°úQ$@ææPÎ ý– ð5øÿðU@øÿÎ ñ– Å*þe)µÀÌ*55÷5€¼ØÂ5uí uí00Øp>D>§3eaek›’ ÃC55a 5a ‡À4Ù÷ `À*Ù÷ Vwè÷%h×A‡7 Úý÷ ’7 ÎýÃGÀö*AÁ5·ZØ÷U@XØÁ5@$Á5Ð X ÷5€6ØÃPAÁ=,øLB BàÂe@ÂE?B B BŒÂ@$õ5÷ Fû÷ JûÃ=¸‡ÃCÄ\Œ #‡wHAW ‡wÜ×÷UÔ×Ã\Á¬ÖAmí‡w¢ÖA�÷ Xùw "ýwýw` ÖÃXu-÷5˜÷zC÷5@Š× Ã5Ã5€€õE€Á ÷ P, Ð U%ÁPÁ ý÷ T×÷ D÷ ÈÕú÷ 0÷ Žá0(fÁìÔÁEÿÁUÃ5ÁU€Ã €ÁU÷ –Õð´ø*ÁUp÷ †ùÀej1ˆ�`÷ LáÍ (e)w^þÁÌ*QQ Àn×&$&&°$ðÆ*&÷ À‡°&°$‡–%– BÂeÁ>w4Ø÷ ¼ù7 ”ÖÂâûÁæÀ(wúÝÀÓ ÁþÔBA°bpd÷ Êî‡fîwZíh·Tí�` Š �ÜÁ�ÒÁ%/ -Á%/*Á%//$Àp¡‡œ`Â¥öÿÁÂ¥ÿÿÁÂ¥þÿ ÁÂ¥ýÿÁ Â¥üÿÁÂef÷ „×÷UâÕ±‡÷ €æÄ|÷Å'fB�Á Á ýõæ*õõè* õ 5�.ô‹€õU€.5�-æ'µÄe& €÷ z÷ t�@ ѥ ûÁ àu÷ èúN#N…à áÄæö´•–%7 Üö÷m¨ú0Ô‡ÿ ü⎨2ÿ ôâš®2ÿ ìâ¦;ÿ ä⦲5ÿ Üâ¦â5ÿ Ôâ¦Ü5ÿ Ìâ¦d3ÿ ÄⲨ2?ÿ @`€ Ààÿÿ_ÿ?î*Units set to maximum assignedŽ,†,†,æÞæ=ÿˆ÷5LÚ÷PÚÀFÙÀm<Ù  ƒ÷%<Ú ƒÁV U÷-$Ù"ú †÷úÙÁ1Âê*÷ ¢ÛÀ^Á*B w,úØ‚ H`Áeó÷ÿÿ6ÿ÷ÿÿ2ÿÁìØÂšØ÷5Îù*÷5Æù& ÷ Èý†ÁF‚÷5€¨Ù ·fÙ÷ àü ‡Á=˜ù · ôׂw¢Ø·PØ·NØÁQÂB÷ Û ÷5€jÙ;÷5lù+Á ï÷5`ù%Ä*Ù"Äå5ÝÑ*Æ*5ÝÑ*Ä*÷5@ÙõÕ€Æ*õÕ€Ä*Ä 7Ü*<Ø7Ü*8Ø´ ä*Ì‚mÜ*·Ú×·Ø×õÝnׯ*õÝj×Ä*÷ ¦µÐÆ*µÐÄ*Äþÿ÷  & & ÀXdð5@t ,$õð5t°,îí ð5€  ÷ Z c€ÁHúAœÁ AÖ*ìN ׇN6Ó÷5€|Ø  ð5… ð5€ %÷  �ð5@ð5 ¦B÷ ¦– Áf÷ ÖÙwØÃØùB÷ Œ�s�œ÷  ÷ †Ow4‚€tf- w. ð5… ÷ Pð5€ ÷ ” �‚    °` °°°`ðU@wÞþÂ`ù‚œ ‚œÎ*�� BŒý€÷5¢×ð5µ°Ä*µ°Æ*ŒU‡Á îwÞü�    ÷5r×ð5µÐÄ*µÐÆ*ð5€ Ãøøó‹€ó�¦üÅ ÷5<× ð5 w Šü†w„ü ÷ ~üw vü†wpü÷ jüpp÷5€×ð5 ð5@ðU@p` p`|+Ò ÁA÷ nØ÷Ý&ü4Õ÷�!ü/Õ÷Ýü*Õ÷ ÷5¼ö÷ xÖ÷ütÕ÷üpÕ‡ÂEÿ B B B ‡B÷ ìÿ� ì÷ Þÿ‚œÎ*Á ÂŒ‡û÷5fÖð5µ°Ä*µ°Æ*‡w âä&fÁòA<÷ &ß7Ü÷�€&��æÔ % ,4,à ö–%&fÁ®÷áÖ ðE ðU€40, ôU 0, ð ð5 ‚•‡ÁgÒ wX×ÁiùÁhøÁkóÀˆ ÷5žÕÃl³ È*ƒ³È*ó È*÷ Ôþ� ÷ Èþ‚œÎ*Á ÂŒü³ÐÖ߇f¦ŽÎeÿ‚÷ žþ�‚‚í÷ ’þ‚œÎ*Á ÂŒ‡ûÖ �µ°Æ*‡Ö �‡ ÷ ù÷lÓ7 ÄÓ÷Ô7 ÆÓ7 ÚÓ7 øô7 öô7 üÓ7 ôÓ7 üÓ7 ¶Ô7 êÔ7 èÔ7 êÓ7 âÓ÷ÆÔÀ~Ï7DÌÔ7 †Ô÷:‚Ô7 ÔÔ÷’ÐÔÀX P ÁÒ÷ €Ý7šô÷5€ŠÔ÷?†ôÁäÒ Á%‡ÁA A A Á wÎÒ ÷ÿ߯Ò÷ÿ\ô÷ÿÿ¸ÒÀ^ H‡Áe÷ ÚÕë·´Ð× †5 × †5 ÷5€Ô5 @$Á d.‡Aá Ĉ÷ †×†Á ÷ L Ð AÂP ý÷ föÀeAá ÷ âÖ‡ðµ  ÷ 6ÞðÕ€pp ‡ÃZwÎöÿ tᦲ5&æ¦f&¦ v Þ €�‚ƒ„…‡:Æ!È!T"^n)š)'ɪù¬yN0†ù¬tN°² ­sN0‚ù¬sN0† ­s, ÿŠ ­øt ­~,¤ÿ ­, ÿŽ ­€,¤ÿ­3X ÿ’¼¯ªà*Ìþ):+:+Ø**w ØüÁ¸ë÷ $÷7|ÿ ÷ ×-.íÀª÷ <‡÷5îÁþí÷ öö÷ |øÃ|÷5üíÃ`÷ vÄ÷ n÷5@ìíâ÷ hìßÁÆí÷ ¾ö÷ DøÃr÷ J‡w Vü÷ ŽÁTì÷ (øÅDìw ší@Àe"ÁXñKr•@×-œí ‡ñJr÷5Šíñ;r÷5tíñå÷pí÷ Ðë÷5¢þñåK÷5”þÂÕ±�÷ Pð‡Á÷ ðšë ÂZÐ ��ˆȵµ d· ìÀªëÀe÷ lï÷ Fï÷5Dþ'÷%øë#÷ \ë×-òì‡÷5@æìÁ÷ ºð<ë ðéðv~ðÕhÀTëÀe÷ ï÷ ðî÷5@®ì÷ *ëÃr÷ ÷5�ìÃ`÷ ÄÃ|ÀòPHÄH4 ôÿÿ7ðê7 ôê÷ 0‡× ”úõµöÀöPPÐh ÷ VêÀHwê±ÀöÐ ÐÐ à‹÷-ªêúëŠ÷5Jý÷%þêÈ•@@Áôÿ ¼ü@Àb È\ýÓ ‡Áô@ üÁ÷ ®ð 07Lꇷ0èfÁ÷ ?öü7òü°‡÷æüâüÁÞü±wÖüA÷ nô¡Þ ôÂÈü·Âü÷ ø÷¼¸ü‡ÁÀ(wÔò00Øx>’:l1DATADATADATADATADATADATADATA·Òç¼€± �,ùˆ7Œü÷ Òÿ¡‡÷ „ü Àßzü· vüÀÂë÷ x †ð¥öÿ*± `Á ÷ žì7Nü7Hü‡÷ ºÿ&÷ ´ÿÀ€U‡w tù÷ÿÿ,ü& æ¾ê· "ü¦�÷ ~õ7TéwXéÍ �÷ žó÷ õ& íÖ ¶#ê–%÷ îû�÷ zóóÖ ‡·àû7 Úû÷€Òû7 Ìû7 Êû7 Èû€Áúèfj&�Ž÷ ~±‡÷ 6ó6¦vwÖèÂÊè7Æè÷‹Œû(Àe"ÁÊêÁeB$$$ÀåÁe((Á”è·<Tûw<Lû  w<Bû÷ ÷ ÷ ÷ 0ûw<&û·‘$ûð•#÷ †`Á ÷ Lë÷ ò÷%véWñ5@ñ5 O€f &�F÷ lò6¦vw è7è7 ¾ú÷ Àú*7<¶ú&ð5@ ÷‹­ú÷ ª÷•¡ú ÀØéð•ð•÷ Ї÷ |†`Á ÷ ¬ê÷ „Þ ÷ Ê�Ž÷ `ó·Ž ÷ R÷ fÞ ÷ ¬�÷ DóŽ7Š7úwvþ÷ ,ú Àpé7÷%Á÷ xýð0÷ð(÷ ðÕHÂô3Áäðµw÷÷þãþöw þö±wöö‡ÂòÁ÷ àæÀe÷ Lèf6†Ö Á÷ ýÂô°ðµð¤ö ðªã °°fÀ˜ãÀe ÷ Zç÷ 4ç÷5êä Á÷ N °Álã9–1–�÷ ´íðµ÷ ¤íN&ÁØÂ  ý€Âô&€Á5ÁEÀEÁEÀEÁE@ÀE@ÀEÁE €&&fÎEÿïöEÿï¶#‡ ‚–%€–%€ðÕ2, –%€òU2,Á�â ÷ ºåà 5Á°â÷ „î´ C� Á Á ÷ j &à ÂP ý&À(ÁÁ ÷ R뀴ˆ7JõÈVõ÷% ­Jõ÷%,Dõ7°ãƒ‡·*õƒ‡‡÷%.õ?÷-6â†ã1ÂŽô5ÂxÊ%¦Àe÷ ˆæ‚N‡ðµÁòôðµ l‡Á5RŠÂòrrÁÖ Âò² Á÷ ¼ä‡7 |ô÷ xô‡æCœóÅô5Hô5€µóµ óµ (³lóÅ óÕô5€)÷ Dá&óœô5óUó5óUó5 óEóEw,Æ w,À ñmtâóµ3ô5€óÕ€óµ(ÀØðµ "ðµ ó5ó5 3lðµ€ðµô5 õ5óÕ×-â†óµ ÷,hó÷,bó÷eâáô5ó%ɪó%J'ó;'ó%Jró;r÷ÿÿFóæÚÞ †w6óµwÎ÷(à,ó‚Á 9ÂÀeÃe‹°bˆ° ÷5@ná\÷ êßY÷-ößFáUÈ5RÈ5OÈ5Lô5HÁØßÈUB÷ Z@ˆÀð¤òÁÀß÷ �ë· ൠd÷ Xõ1¦Âðµ°ðµ€¬Š Ê ÷ êÞ ‡ðµ÷ Ú÷†Ö w÷ tòû÷-lò¸à ÷5@Êà ÷ Fß÷ ¸‡S÷ Lò7€ÁNò÷ Žéð5w”ð5wˆðµ€w|ðÅ€7œò÷ßòÁ ß÷ ÚêB÷-NàúÞ &fÁBà÷ :é÷ Àê�€÷ bw:Á÷ ø÷ †êÂÐñ°ðÕ€ðÕ÷µÀñB÷ 0÷ öè÷ lêw¶ðµ€ 7˜ñÀŒÞ7Šñw‚ñ÷~Þ~ñ7 ~ñ±¡7tñ‡ÂòÁ÷ ^áw\Á 6ÁVÞ÷ Xô÷ ê÷ $‡%ÁBÞ÷ ˆè÷ ê÷ úéw6ñððE÷$ñðððð µsõ d÷ XÞn÷ ðÖ ÁöÝ÷ ¶éwJfÁèÝ÷ þé÷ ´éð5ð5€ ô5Ö ÁÀÝ÷ ØéB÷ |éæl&æÁ¬Ý÷ Äé7œÝwÀÁžÝ÷ ´é÷ jé&÷ L(‡)€Á†ÝðµÂpÝò d÷ ÈÝÂrð°0 ðÕ€ðÕ—%÷µVð Â>ÝÁDÝ÷ À÷ .–%Á4Ý÷ ôèÁ*Ý÷ üè÷ èèÞ †wxfÁÝ÷ ,é7ݵÂòÁ÷ ü߇w ðìCô5€7(ò5³l÷âïÁ÷ žÁ:Ñ H !Ð Ð&ÁÞ÷ øæ÷ ~è€PPÐÐJ©Ðø‰ÄôÝÄ Ð· è݇² xæÃt² ræÃnf¦Á÷ ,‚Â`Ò  "°�ƒ‡¡ðµóµ ðµ€÷ læðµ 3,ô5¡±¤‡óµwRóµô5w>Áó5ó5Áe÷5@,Ý ô5€ ÷  Ûô5Áe÷ êôw¤îô5ó5óÕ€ð ðmÚÜ0 0 ÷ †÷pîððEðð0î ðHÛ ó5ðHîðð˜Üóµ óÕ€ð ðmrÜ0 0 óµ 0 µ d· PÛ÷ ªæ÷ šð÷ ²æððÀÚÚÀef÷ šÞ÷ tÞ÷%.ÛæÀÚææÆå�Àf÷ Öá÷ àÆe – ƒ‡ÀLÈ ô5PHtt ÁrÚwHæ÷ íæÐÚÎmÆÚŽ ‚— ƒ÷%ÂÛ— ƒfÁV ÷ >Ý�·  Ú7 àì1 ñLÙ÷5€†ÛfÂòÁ]÷ Ý�w`ôÖ 6f… ÷ .Á00Ø€>D>§3eaek›’÷ @ä÷ ÆåÁðµ !ðµ ðµp`†Á ðµp ƒÁ;Ò ÷ ®Üp ƒpÅ Ó…÷ Àòô5 -ô5@)Á‚Ù÷ Hå7 4ì÷ ¨ï‡÷ äï ö7 ì÷ ”ï‡÷ ðî÷ å&fÁNÙ÷ šã÷ å°·>Ù„wÔòwVóƒ‡ô5-÷ ˜ïÃåÀ%&÷ ŠïÀ¥!ô5ôUÁþØ÷ ÔäæÃöæ÷ `ïÎ ûÖ ƒÃå Áô@÷ ÷à Û‡7 „ë‡w ÀèÄeW!€ƒÅå€÷ Å€AÁ Á ÷ ðñTÐÐÅ ü‡÷5 ë÷5˜ë÷5�ëô5Á÷ ¼ñ÷ &äðpëðÕˆB÷ ìû÷ ¦â¡‡±‡÷ VêÁšÙ÷ ’âÀe&Á0ØÁe ÷ ¨Ü‡wëÖ ‡€Á÷ ”܇wúê‡÷@ÙØêwÖêÂÐê�¦·Æê÷ äwø×Á¼êÀe÷ `Üf &wæ×Áà×÷ ¢ã€ �ã‡Þ ᱇w ÀçÅðØÁ¾×& f w€ê÷ þá÷ RÄ  öÄÀ”×& ff÷ Øá÷ ,ö� ÷ Êá– N ñ– õ„ !‚æ.ê¦í– ‡U ‡1±o†ÿ €æŽ¨2ÿ xæš®2ÿ pæ¦;ÿ hæ¦r=ÿ `榲5€,ôî&æ¦f&¦ v Þ €�‚ƒ„…‡z!¬!8%:%Æ%Ð!à, -‚*R ~¯ªà!!œ!>!p-¬.¬.J.œ! 7 Ží÷ ÷\ÿÀîð*0h8 f÷ ÖõÀü÷ 4÷ Vì÷ î·rí÷5Ní7 fí7 $ÿÀH÷ 7 Ví ÁJ÷ ÈîÀÌí÷ ö0 h‡Á÷ ®ð 07šë‡·~éfÁ÷ ê?Úþ7Öþ°‡÷ÊþÆþÁÂþ±wºþA÷ ¼õ¡Þ ô¬þ·¦þ÷ ø÷Rœþ‡ÁÀ(w"ô· éÂR€± �,ùˆ7pþ÷ Òÿ¡‡÷ hþ Àß^þ· ZþÀí÷ J †ð¥öÿ*± `Á ÷ ìí72þ7,þ‡÷ ºÿ&÷ ´ÿÀ€U‡w Âú÷ÿÿþ& æ ì· þ¦�÷ Ìö7¢êw¦êÍ �÷ ìô÷ bö& íÖ ¶#ê–%÷ Òý�÷ ÈôóÖ ‡·Äý7 ¾ý÷€¶ý7 °ý7 ®ý7 ¬ý€ÁHêfj&�Ž÷ ~±‡÷ „ô6¦vw$êÂê7ê÷‹pý(Àe"ÁìÁeB$$$ÀåÁe((Áâé·<8ýw<0ý  w<&ý÷ ÷ ÷ ÷ ýw< ý·‘ýð•#÷ æ†`Á ÷ šì÷ ò÷%ÄêWñ5@ñ5 O€f &�F÷ ºó6¦vwZé7Né7 ¢ü÷ ¤ü*7<šü&ð5@ ÷‹‘ü÷ ª÷•…ü À&ëð•ð•÷ \‡÷ N†`Á ÷ úë÷ „Þ ÷ Ê�Ž÷ ®ô·Ž ÷ R÷ fÞ ÷ ¬�÷ ’ôŽ7Šüwvþ÷ ü À¾ê7ÁÃå`÷4Á� w2Â÷  †ÁOÄ ‡Á À¶ç`÷ ¦èÀªçbÂEß{·ô÷ ÜïÁ~2fü€767 &÷ r†ÁM 2÷ `è÷ òíõ d$@Àe"æ6Þ ‡ðµ ú÷ ˜ù÷æ„Þ ‡7À7¼f÷ "�– †÷ Ðùí÷ ¤êÀ(ÁhÂ`wÚí&f& 7 ŒÀNÀEøÿÉ-z ‚‡ñ-t†÷ n/÷ ,‡ìÂ,Ê-X ‡‚ò-Rƒ· L÷ ú‡ÛCƒ` ÃEP÷". ‚‡÷,& ‚ÁÁeÂÂåB èƒN ±€…„‡Á÷ ^ü÷ ð&fÁTäÁe÷ œî÷ "ðˆ·Bä„74äô ô ô]Ž ÂôôÀ æð•ð•0 40 60Š÷ J‡÷ <‡ñµôUô]z7 &÷÷ ÈÁÎã÷ ”ï‡ÀÎå`Á ÷ ºæÂ( Â ‚ �Á ±0À÷ Dó@Ámw ±%·üBÂmìæâ· êÀ À À À À À ÎÚàÎ Î Î Î Îm¼ÂÆBà ·´Àª÷ ‡‡ÀFå`Á ÷ 2æfÁ4åwœ"†öÁr‘Q$‰æfÿˆ‡wŒ‚ö‡æÌöÊö‡7 Àöæ÷ Ú÷‡÷ 00؈>’:l1DATADATADATADATADATADATADATAøÃå  ƒ7 0öÀ%ÿ‡À%Éíƒ À ø ÒèæÃªæ÷ â÷Î ûÖ ƒÃåÁ¨Bœ1Š— ‚ @ú :à ã‡ô À¬Á¦44  ÁpâwFîÂrä‚`Á÷ ^屜±, ñÕ ñ ñÅD7 °õô5W,ù¬W,sNô5 ÷5tã Áj¦wå· xõ‡æ BÂeÊÅʵ *ʵ€ °Ê5"Š Á2÷5,ã÷ Üá÷ bõ÷-\õÎá‚f&Áüâ÷ ôë€�B!F÷U@:õ&ñµôµôµ€ñÕ ñÅÁ<ª÷ bäÁ¨@ñµ"ñÕÀ-œâÁ÷ <ùðÜôðØôðÔôðÅ ÀvâÀe ÷ æä†÷ ¾ä@Á¨ñÅñµ@Kæf/Þ N‡Áøàwüðµ@õ7 žô÷ <Þ ‡ðµ@ú÷ ,÷†Ö (÷ €ô%Á÷ ¸øðrôðjô ðÕH¨3Á¤àðµwHô÷Œà@ôw @ô±w8ô‡Â¦Á÷ nãÀe÷ Úäf6†Ö Á÷ RøÂ¨°ðµðæó ð8à °°fÀ&àÀe ÷ èã÷ Âã÷5xá Á÷ `°Áúß9–1–�÷ Bêðµ÷ 2êN&ÁŒÂ  ý€Â¨&€Á5ÁEÀEÁEÀEÁE@ÀE@ÀEÁE €&&fÎEÿïöEÿï¶#‡ ‚–%€–%€ðÕ2, –%€òU2,Á�â ÷ Hâà 5Á>ß÷ ë´ C� Á Á ÷ | &à ÂP ý&À(ÁÁ ÷ à瀴ˆ7ŒòȘò÷% ­Œò÷%,†ò7>àƒ‡·lòƒ‡‡÷%pò?÷-ÄÞà1ÂŽô5ÂxÊ%¦Àe÷ ã‚N‡ðµÁ4òðµ l‡Á5RŠÂ¦rrÁÖ Â¦² Á÷ Já‡7 ¾ñ÷ ºñ‡æCœóÅô5Hô5€µóµ óµ (³lóÅ óÕô5€)÷ ÒÝ&óœô5óUó5óUó5 óEóEw,Ø w,Ò ñmßóµ3ô5€óÕ€óµ(ÀŒðµ "ðµ ó5ó5 3lðµ€ðµô5 õ5óÕ×-’Þ†óµ ÷,ªð÷,¤ð÷epÞô5ó%ɪó%J'ó;'ó%Jró;r÷ÿÿˆðæÚÞ †w6óµwÎ÷¶Ünð‚Á 9ÂÀeÃe‹°bˆ° ÷5@üÝ\÷ xÜY÷-„ÜÔÝUÈ5RÈ5OÈ5Lô5HÁfÜÈUB÷ Z@ˆÀðæïÁNÜ÷ è· œÜµ d÷ ˜ð1¦ÂÄðµ°ðµ€¬Š Ê ÷ êÞ ‡ðµ÷ Ú÷†Ö w÷ ¶ïû÷-®ïFÝ ÷5@XÝ ÷ ÔÛ÷ ¸‡S÷ Žï7€Á�ï÷ æð5w”ð5wˆðµ€w|ðÅ€7œ^ï÷žÛRïÁ˜Û÷ hçB÷-ÜÜˆÛ &fÁÐÜ÷ Èå÷ Nç�€÷ bw:Á÷ \ó÷ çÂï°ðÕ€ðÕ÷µïB÷ 0÷ „å÷ úæw¶ðµ€ 7ÚîÀÛ7ÌîwÄî÷ ÛÀî7 À7¶î‡Â¦Á÷ ìÝw\Á 6ÁäÚ÷ ˜ï÷ �æ÷ $‡%ÁÐÚ÷ å÷ œæ÷ ˆæwxîððE÷fîðð2î µsõ d÷ æÚn÷ ðÖ Á„Ú÷ DæwJfÁvÚ÷ Œæ÷ Bæð5ð5€ ô5Ö ÁNÚ÷ fæB÷ ææÞ)æÁ:Ú÷ Ræ7*ÚwÀÁ,Ú÷ Bæ÷ øå&÷ L(‡)€ÁÚðµÂþÙò d÷ VÚ´í°0 ðÕ€ðÕ—%÷µ˜í ÂÌÙÁÒÙ÷ À÷ .–%ÁÂÙ÷ ‚åÁ¸Ù÷ Šå÷ våÞ †wxfÁ¢Ù÷ ºå7’ٵ¦Á÷ ŠÜ‡w ~éCô5€7(ò5³l÷$íÁ÷ °Á:Ñ H !Ð Ð&ÁŽÚ÷ †ã÷ å€PPÐÐJ©Ðø‰Ä‚ÚÄ Ð· vÚ‡² xæÃt² ræÃnf¦Á÷ >‚Â`Ò  "°�ƒ‡¡ðµóµ ðµ€÷ úâðµ 3,ô5¡±¤‡óµwRóµô5w>Áó5ó5Áe÷5@ºÙ ô5€ ÷ .Øô5Áe÷ *ðwæëô5ó5óÕ€ð ðmhÙ0 0 ÷ †÷²ëððEððrë ðÖ× ó5ðŠëðð&Ùóµ óÕ€ð ðmÙ0 0 óµ 0 µ d· Þ×÷ 8ã÷ Úë÷ @ãððÀh×Àef÷ (Û÷ Û÷%¼×æN׿æÆå�Àf÷ dÞ÷ ”ÜÆe – ƒ‡ÀLÈ ô5PHtt Á×wÖâ÷ <êæ^×ÎmT׎ ‚— ƒ÷%PØ— ƒfÁV ÷ ÌÙ�· .×7 ê1 ñÚÕ÷5€Øf¦Á]÷  Ù�w`ôÖ 6f… ÷ .Á÷ Îà÷ TâÁðµ !ðµ ðµp`†Á ðµp ƒÁ;Ò ÷ <Ùp ƒpÅ Ó…÷ îô5 -ô5@)ÁÖ÷ Öá7 Xé÷ èê‡÷ $ë ö7 Dé÷ Ôê‡÷ 0ê÷ žá&fÁÜÕ÷ (à÷ ®á°·ÌÕ„wÔòwVóƒ‡ô5-÷ ØêÃåÀ%&÷ ÊêÀ¥!ô5ôUÁŒÕ÷ báæÃªæ÷  êÎ ûÖ ƒÃå Á¨@÷ ÷à Û‡7 ¨è‡w NåÄeW!€ƒÅå€÷ Å€AÁ Á ÷ 0íTÐÐÅ ü‡÷5âè÷5Úè÷5Òèô5Á÷ üì÷ ´àð²èðÕˆB÷ ìû÷ 4ß¡‡±‡÷ èçÁ(Ö÷ ßÀe&Á¾ÔÁe ÷ 6Ù‡wPèÖ ‡€Á÷ "Ù‡w<è‡÷ÎÕèwèÂè�¦·è÷ ¦àw†ÔÁþçÀe÷ îØf &wtÔÁnÔ÷ 0à€ �ã‡Þ ᱇w NäÅ~ÕÁLÔ& f wÂç÷ ŒÞ÷ RÄ  öÄÀ"Ô& ff÷ fÞ÷ ,ö� ÷ XÞ– N ñ– õ„ !‚æpç¦í– ‡U ‡00Ø�>D>§3eaek›’1±o†ÿ üàŽ¨2ÿ ôàš®2ÿ ìà¦;ÿ äà¦r=ÿ Üল5`è‚<±ƒ…±VNTI ±VNSY”±VNSY[²gNSY[²hNSY?±y‹OV\±ÿ~TI\±CL2²VNCLó«@GØ„fhRVC±¥xb©ø "ªª–˜šœž ¢¤¦¨ ­,­3X ­s,w ºù÷ žÀ4ö÷ ‚ó÷ ˜éÅ:ÀëÀ ÁŠé÷ DùD÷ FÀÁxé÷ 2ùD÷ 4ÀÁfé÷ ùD÷ "ÅÚÍ ÷ Ô‡ðµ ÀU%@eA÷ ðøD÷ ò†èÅe åU%ãÅ²Í (Í%?±÷%ˆé÷ ˆ‡Ä÷ DD· téÈpéÄ èÁ÷ P?Jé7FéÐ ÐÈPéÙÅeÖÀDéÔ ÁTÉ €‚ Ée·üè·ÚèÀ À Â&õ‚b7 ÈèÂ5Àe@Â5` ÷5ðéÀeÂ5@Àe,Àe7šè÷  ÷ ”÷  ×-Ìè÷ Ôé÷5€Àéh· ”è÷rèÒý· lè÷eˆèÀfé²ô‚b÷5€�é0Â5-ÁfÀ ƒBBbBdBd�à ‡wPèÂ@ÀmFè‡@b‡Àm@è†÷EPéæ0èæ@èæ,è‚ÁW÷ ÖêÆeÀÿÿ7öèÂ5€!÷5"éÁÞçÂ5@Áe2Áe?ÁE?� ÁE€� � � � � @`ÀeÀE 7`ªç÷ ¾÷ Âææ=ÿˆÁNæ ÷ ´ñÀeÁ–  ýÁ–   ýÅðD ÷ ¦‡÷ fPÄ ýõÄ aU%ñÅÅeÍ = ÷ |÷‡ðµ ý~ç=lì÷4è4è· 0è÷ 8÷5Fè Áºå÷ &ñ÷ ¬ò1 ‡Áaa÷ Á:Ñ H !Ð ÷ BPPÐPP ‡÷ *@Àe"AÁå÷ ôê ‡ðµðµ€¡±‡&Á°ç÷ ¨ð÷ .ò€‡À\AÁå÷ 0ë†Á ÷ �pp0À\÷ ò걇÷ ¶ÿ@ð dDÀe"æ6Þ >‡ðµúðµö7’û7Žû÷%ɪ†ûì×-‚ûK'wD×-vûJ'w8×-jû;'w,×-^û3&w ×-Rû3&w×-Fû2&w×-:û#&ÄÁn÷ Šè‡w ~õ÷ÿÿ"û& æÈæ· û¦�÷ ˆñ7^åwbåÍ �÷ ¨ï÷ ñ& íÖ ¶#ê–%÷ äú�÷ „ïóÖ ‡æ)Pvü¬Ä"â)Ä&Òþ¬¯yó«@Gð ­ˆxC±¥­cŒb©ø ü¬³°úp>,«1z@?±y‹B5¬!™8ÿ ôÚÜÿ ôÚš ÿ úóÚ"ÿ òóÚ 1ÿ êóæ*#ÿ âóæ6$ÿ Úó¦²5ÆlÄlÈpxrÊ‚€Ààðøüþÿ?ÿÀæ÷ žþ‡w ôÅäD„C†Ået÷ BE‡AÁ%ÿÿ÷ >î÷ Äïð5f&ðÕ"ðÅ€ð5ð50ð 0ð0ð ÷- ãðäð5Ö µÄe¾ÅzãD€C‚Åen÷ hÿ‡×-Ôã÷5Æä÷eÈäÀ:!÷ Êý÷5°ä÷å²ä‡÷5@¨äÁˆä÷ €í÷ ï7rŠþ&æÄe€Ã¬÷ 䃄Á`ä÷ Xí7xfþ÷ Öîæ&Äe„ì÷ º÷5Jä„Äe°Ã¦÷ ¤„ƒ‡w ÆòÁÈâ÷ œîŸâ÷5@&ä wrþDÄe€Ã¬÷ rwxþ÷5üãDÄe°Ã¦÷ VDÄe„ì÷ Hæn÷-râÂãæ÷ 4Î ü– „TŒTŽT�5 �L’„5ŒÔm®ã5Ž5e�5’‡ÁÀ÷ ÒñÁdf÷ jì÷ ðí °c †0ÂeÁ÷ üä– %‡w ìñ7 lý÷  ÁÄà÷ 0ì7^ý÷5Xý÷ãÀ<)÷ >ü÷ RýÁBý÷ ~í÷5ãÁ4ý÷ líÁ2ý÷ dí÷5úâÁ&ý÷ Tí7 ýÀø+÷ øûÀæáÀmÜá  ƒÁV÷%Øâ ƒ÷ \äÄ0÷5ÔüÁ÷ ððL`Âx ÷5žâŠŠÊm’âŠÁ|â÷ Dí÷‹žü ÷ ÷ Þ÷‹’üw�wè@? Á÷ u~õíná~@wÞà÷4âààCÄa÷ ¾÷52â÷‹HüS@¤Cw´à÷ â¶àÄa÷ ®÷ ž÷ l& ÷ 00ؘ>’:l1DATADATADATADATADATADATADATAä„A~ÁmáÁ w ¼à†w¶à÷ H÷ Ä÷5Úá*÷‹ðû'Cw`à÷¶ábàÄa÷ Z÷5¶áÁ ÷ ŽÁX÷‹¾ûÁˆàH · „àA®B¤÷ Šô‚à÷5~á÷àßàßÁ`áwÒë÷5há÷‹~ûfÅe†@ÄÁ÷ …u®õíZஇÁ Áá÷ 5÷ . th÷ T ‡Á ÷ ö Èúß7öß· ößA~Bæ&Ó ÓÚàÓØàKËmà€&Á²à÷ ¸ À ÀdÓ �÷ Ö S&„¶Ö h óE€ÃeÀÞ„ ƒ‡7 ÄúÀž%÷ ¤ù 7 ’ú÷ ÞÄ÷ Ö÷5xà  ÷vú÷ ÂÄ÷ ºÁLà÷ Dé÷5Tà& ÷ 0éÁŒ  Á w ß ÷5*à � ÷ éÁŒ  Á wèÞÀðÞÁ÷ ä †Àÿÿ7ÞÞÀÈÞ÷ ^ 7ÜÔPÞ÷5âßÀ´Þ÷ H 7ÜÔ<Þ‡w bîÁdÞ÷ 8ê7 Èù÷ ÷5¶ß÷¶ùÁFÞ÷ ‡Å4Þ÷ ¤ùC C÷ Îó@w tß ÷ ˆùw œù6w�ù2÷‹…ùÁ|ßÀ6Þ÷ @ Á w,Þ÷5Pß ÁbßÀÞ÷ & Á wÞÁ÷ èð5  · Pù÷ V Á ÷ "ùu¦uf7 2ù÷ù÷ù@ ÷ Üçð ðµ ·‘ûøA ÷ Àç÷¤Þâø÷äÞÞøÄæÁ÷ xé÷ .é&÷ ºø@¢@÷‹¼ø  ÷-6݆Þò5 ÷ ’ø5®A¤5 ¤5~A5  ÷ : ÷ lø5¢5Ca÷ XøÀXøÁ¢ÀJøÁ÷ †À Á@ø÷  ÷ .ø5ž5÷ Bø÷ Rò÷ @ ÷ øu®uœ|u~uw÷ ô÷¾Ü¶ÜA ÷ Àæ÷ Ú÷¦f ‚ ÷ ÖÂÿÿ÷ º÷µœµ€÷ ¨÷Áª÷Á ÷÷ b÷ ”÷7–÷7Œ÷÷‹–÷÷-ÜbÝ÷ v÷5`®5`~÷ f÷A¢A¤AA÷ ÁR÷÷ ‡Á ÷ 8÷u¦uf÷ L÷÷ "÷w ìÛƒwæÛw ÞÛƒwØÛõµ‚÷ J‚÷ ôörœr÷ àö@œAž@A÷ ’‚€ì2 ‡2�÷ ç÷ ÐÀx  ÷ ¢ö  ÷ ˜ö@ž@÷ ˆöw3Lõµ@÷ (4`L‡3L˜÷-FÜòÚ4L4À ÷ 4`L‡¡ ÀeÿŠÀ‡w Äê÷ ¤ÁÂÚ÷ –æÅ²Ú÷ \ð;w Ü ÷] Ü"ö÷]ÊÚö÷Uö.÷5€øÛ*÷5ö&·öÁö÷ DæwöÁö÷ Œæ÷ Bæ7úõ÷5ÄÛÁðõ÷ æw äõÁàõ÷ dæ÷ æ7Öõ Å0ÚÄ÷ ®&÷5ŠÛÄ|õ5Á ÷ N5¢ �Äxõ5Á ÷ 05 7P`õ÷UZõ÷5<Ûõ ¢÷UFõà E   Äþÿ÷ 4÷5ÛÄ|Á õ5Á ÷ Ò5¤ Äx7SþôÁõ5Á ÷ ®5÷ H‡·‘Þô· ÆÙ÷-XÙ¨Ú ÷ ºÙ÷ òîõµ÷U¸ôA2÷ €ã÷ åð]¦ô ð]žô ÷ ®ô%w-¨ô!Ĥôô]ˆô ÷ ‚ôA ÷ Hãf@÷ $ÁfÚ÷ .‡Á uft ƒt÷50ÚPÄ|7S<ô÷  ‡·‘8ô· Ù÷-°ØÚ ÷ Ù÷ Jîõµ÷UôA 2÷ Øâ÷ ^äð]þó ð]öó ÷ ô%w- ô!Äôô]àó ÷ ÚóA ÷  â¦@¤÷ |Á¾Ù÷ †‡Á u¦t ƒt‡ÁÁ Àv Á ý‡w èÁ Ø÷ Þã7 nó÷ ÷5\Ù÷\óÁì×÷ ‡ÅÚ×w 0Ùõµ3÷ <óA A÷ â÷ ”ãð5 õÕð÷ óðU Àe ÷ ó÷ 4íÈ ÷-*íóƒ÷"íóÈ · Ü× ‡÷U€ÔØû÷ íÈ õ÷-þìäòñƒ÷öìÜòÈ ì· °×é÷ ¬ò÷ "÷5˜Ø÷ šò÷ ‡’´’Á KŽ´ŽÁ D÷ Váæ ÷ Öâ÷5tò ÁeÿÁEÿ  Wtüÿ÷ Fp÷ >òÀl22mf÷-Ø¼Ö fÁØÁmÖÖ÷ r`�÷ Ø3l f2òll÷ À4fƒ‡@÷5Þ×Àe”&Àeæ6÷5Æ×€&÷  àÞ †‡ð5íðµ é÷5˜×÷5˜× ðµtì-ƒ ×÷ êáðµ@0 0 0 É÷ ®áf&æóµ À.ÖÁ÷ 7"Ö3ÀóÁ÷ 3 ÁÖ÷ ê7üÕ7&×w(óµÁ ÷ æß(Á÷ Æ33Á ÷ ¬4Àì3 t÷-dÕ´Ö*ÁÀˆ÷ DÚ$‡& ó óÕ€Àe33 ó 3 ÁÁ À ÷ RÁdÕ€÷ H7ZÕF ÷5hÖó5€ÄÄezÁ÷ ( @à÷ &ÁÀ\÷ ¼Ù‡óµÀ÷ î3 ƒ3€Á÷ Ô3Á÷ Ä3 Àì3 ƒ„�÷ >àw þ@Àeæ6Þ L‡æÐïÂ5  Cµ @ðµ@<÷5¦Õ÷5¦ÕµN~÷5ŒÕ"Â5€÷ ˆï%N®°c°c÷ âß÷5fÕÂ5€ ÷ bïÎdï°c°c÷ ¼ß ÷ Jï°c°c÷ ¨ß– ²‡@`!‡‡÷ ‡‡Á @`†A@ � f÷ dã�÷ FãÀ ±@‡Áe? ¡ � � � � ‡¦BÂeÁ÷ pÖ÷E0ÎÔ€‡À À ÷ 0œÌ  Áå ûÁå 4°Ö¡Œø†Á÷ 2Ö4ÐÖ‡ÀEÿÀ @ @ @ ‡±÷5€zÔ ÷5�î÷5ˆî¡‡ÀF1÷ píÀŽÐ%÷ ÀxÐ% &÷ &Ý‚ðµ "lÊmDÓ‡fÁ¾Ò÷ ’ÞÀ®ÒÀe"Åe æ6Þ †…‡ðµøðµ€ôðµ€� ðµ ë÷ RÞ÷ .Þ&f ÷ ¸Ü�€÷ (Þòµ€ &� ÷ â€p°lò5 ÇðÅ ð5À÷ üÝ÷ ØÝ&fð5÷ TÜ�€÷ ÄÝ&ð5� ÷  á€ð5p°lw ÿp°lwÿÿ ìল500Ø >D>§3eaek›’!€@@€@ € L>(@*B,8.H $ 2 0 4 |‚ "| |v<@ :$ C nK " M ~B> 6 8 ˆ F D N xVZ ú\ üFæ2îPð0 èRêvò”ìNô: ö< ø4úX üV þR T ÷5>âkw ÎðÅLÍmôàMeÀBíÄæàÄmæà !‚D7Öà÷íôàÐà`ðð•#÷ J † ô�Á÷ Œã÷EêáAà €¦ÁY÷ vã‚ÁNß ¦÷ ¶ê÷ <ì‚Àe�����Á÷ ðE€ ÷  7à7àЕÿÄ üÅ ÁÅ Á üÁ `�À $÷ ˆú÷5ná÷m,à,à‡Àôßðm àðm4á÷5Náðm à˜ðm ášÁØßw¬ëw Êï7 ìñ ÷5€(áÀ<à7ðû7ôûÅ.ìEbÄ> ÌÃlÂÁ…0ûLPù÷ áÌU ÷ tßÌU÷5æàÌU÷5ÒàÌU÷5ÎàÌU÷5ºà ÀŒßÀmÊß ‡7 x߃ÀxßÀm¸ß‡7 d߃ŒÁ"÷ ¼fÄZ Ã’Å‚àÂÁ…0ûLPù…7<ûÀ<ßÀmxß72û7 ,ûƒ7&û÷5 Rà÷5Jà÷ßû÷54à ÀßÀmDß7û÷þÞ û÷m6ßûæ æ=ÿˆÄ  ÀßÀ À Àe>7Öú7`ÐúÀøÞÁn `AW  ƒ÷%êßW ƒÁV÷ ÁÊÞÀ÷ îÁeÁm–úwŠúÁe w`€úÁeÅ5` d÷5€œßÔeÀÔmªÞTÔjÞÔJÞÔbÞÔ\Þ   Ô”ß÷%xÞ Ä* ÔvßÔpßÔ|ßÄ0 Ô^ÞÔøÅ5€ôUþÿÌ>ßÌmþÝ7ú÷åúÔmHÞ÷ ¶ ÷ >ÔÞÌÞÅ5÷ßôÞômüÝþÿ ÄR ÷5ôÞ ž÷ ÔäÝ÷�èÝÀù÷�èÞ»ùæ¶&Ä|÷ Ä‚÷ ‡$Ì ‡÷5²Þnæœ'7 Rï7 \ïÀbÝ4ÅœÀ 7Hï÷TÝlÞ7 lù÷ ‚÷ Z÷5|Þ÷€Þ÷•OùÅœ÷,ÝBÞ7 Bù÷ X÷ 0÷ RÞÅ ÷(ùüî÷eöî7 ù÷ 6÷ Åx"÷Ýàî÷ Üî7 Þ7 ù÷ ÅÎ"7 öø÷%Þ÷àèø7 ®îCDÄ5ÄEfÄmÊøÁ÷ LÄeÎ öÖ ê‡Å^ECfÓ Å ÄÔ& ÎÔÀÀ À Àeü&A÷ €Àe÷ Î ïÖ …âÅXÄ E'õE@CÃeæ÷5@>ø Ë% &ó%„(ó[qæÁÄe÷ ´Î ø– CÃe³Ö×-6Ü÷ >Ý÷5€*Ý ÀÜÀå7¾÷Àh(÷ ö÷ à‡À¬÷Â’Û� òµ@÷e”÷÷ R‡Ìe?ÌE?  ‡÷ fÞ÷EÄÜÀØç÷ ‡Áå÷ >Àe"÷ ¼ß‡ ñµ±ñµ€A÷ tå@ñµ Àm’Û¡‡fÁ\Ü÷ Tå�‡w øê÷ 6÷ ü ÂÖÚÃÐÚÄ…”�  †w2÷· êì÷ Ä õà ð÷÷ ܇÷ Òì&À4çðf ðæ^ °4Îe°6ð•(ðl"÷ J÷ l€· Öö7 Žì‡÷µ@”ì ÷‹�ìÂ2 "‚2 &‡)2 ‡2 ƒ÷->Ú²ø ÷6ÚªøÂ0ÚÂe Áw.݇€ì· Žø·ˆøÂÂ÷ "ì÷ pø€ì· hø·bø  ÷ ì ÷ Nø7 @ø‡7 <øPƒ÷ ÿ·8øæL÷ 4øÎRŽ`ÂUÿ·øÂEÿ·øÂ‚ ‚g‚ ·úõ· ²ë&f €Á÷ PéÀmrÙÂÁ  üˆ°ˆÀ÷ |Àìåðf ðæ^ °4Îe°6ð•(ðl"÷ ú÷ $�€Àí”÷p�f ‡f&÷ ®þ€�€ Á÷ ¢þ‡ ‡ææ)ÿˆ÷Šl÷‡`Á÷ úÛÀf Á Á ý‡w àè7 F÷7 D÷Á÷ œ7,÷÷f $õÀ€+÷ :ó÷ úýÁÂ÷À(÷ Œá7 ÷7 ÷÷øôæÙ÷åàÙÀåðèô ÷ 4‡w €è&÷ H„÷5ÜÙ÷ ‡ÂÆôÅ`ØaC¢|w˜´ô· °ô ÷ ¸ö7÷¤ôžô÷žôŒÙ÷ ˆÙ· ¢ö,ÂŽôÅ(ØaC`w|ô· xô ÷ ~ö÷lôfô÷fôNÙ÷ JÙ· höÅ · êR”„ — f"÷f÷ ‚�òà ,&ÀVäð2öðæb °4Îe°6ð•(ðl"÷ d÷ Žþ€· üóÁúõÅÃ%‡ ËÃåÅÆÄ ÄU?„ àa·Ðó— f"‡÷ ·Âó‡÷ žüÂf ÷ `þ‡ÿ ŠæŽÄ3ÿ ‚æš®2ÿ zæ¦Ú@ÿ ræ¦Aÿ j榲5év~ ­ø1±o†ÿ tùæVùæ00ب>’:l1DATADATADATADATADATADATADATAw æ÷÷5Jé{7 ŒýÁºæ÷ &ò7\ý÷5Vý,÷%,è(÷ �ç×-&é‡÷5@éÁúè÷ òñÀeÁº÷ ì†&Áàè÷ ØñÀe"Á¶÷ ôë†�pÀvé÷ 8ñ7 xù7 âè ÷ýý÷ýý7` ý&ÅÄ÷ € rЀ 7  èí#Á€è÷ xñÀe"AÁå÷ ’ë‡ðµðµ€÷ Pñðµ Ámpç ‡ÀØ÷ ÷ ÈæÀ,è÷ Þ÷ @ ÷ H÷ ¶÷%,ç÷5Fü÷5>üÀ÷50ü ÷ 0*Áêç÷ ²ò÷ÔçÔç7Ìç ÷5äç¤ÁeÿÁEÿ@` Á÷ "öÁ € Àmœç7šç÷ –çÀÈò÷ ¾‡Á`÷ :é÷E˜ç‡w (öÀ*æ÷ .æ@#Þ ‡÷ xûwzÅ:E BÒ Ò ú�Áa÷ üèõ‡7 tç‡&÷ ¢�÷ 2ð7œþ÷€7 ð÷7 î÷w ç ÷êåÞ÷÷äåÚ÷Àm6æ7Â÷7º÷7Ä÷w úæ ÷mÈå¸÷÷5þæ÷möæª÷·l¤÷÷  ÷÷œ÷–÷ò  €~Àmòå7z÷€lÀ 7z÷÷5Äæ)€œÀmÔå7b÷€l¢w œæÀmjåÀm¢æÀ 7T÷€®Àm°å7:÷€l¤À 7:÷w ræ ò ¢ò ÷"÷$÷·Hæ·Dæ÷5^æ·˜:æ·š6æ÷möö÷÷mòöþö‡w Ôô÷ÿÿºú& ææ· °ú¦�÷ Þð7´äw¸äÍ �÷ þî÷ tð& íÖ ¶#ê–%÷ |ú�÷ ÚîóÖ ‡w |ô÷ 6÷ ü ÂZäÃTäÄ…”�  †wLú· nö÷ Ä õà ð÷8ú�å‡÷ Vö&À¸ððüðæô°4Îe°6ð•(ð÷ ´÷ l€· ðù7 ö‡÷µ@ö ÷‹öÂ2 "‚2 &‡)2 ‡2 ƒ÷-ÂãÌû ÷ºãÄû´ãÂe Áw²æ‡€ì· ¨û·¢ûÂÂ÷ ¦õ÷ Šû€ì· ‚û·|û  ÷ „õ ÷ hû7 Zû‡7 VûPƒ÷ ÿ·RûæL÷ NûÎRŽ`ÂUÿ·2ûÂEÿ·(û‚ ‚g‚ ·ù· 6õ&f €Á÷ ÔòÀmöâÂÁ  üˆ°ˆÀ÷ |Àpïðüðæô°4Îe°6ð•(ð÷ d÷ $�€Àí®úp�ü‡f&÷ ®þ€�€ Á÷ ¢þ‡ ‡ææ)ÿˆ÷Іú‡`Á÷ ~åÀüÁ Á ý‡w dò7 `ú7 ^úÁ÷ 7Fú÷ü>øÀü!÷ hý÷ úýÁÂ,úÀ(÷ ë7 *ú7 (ú÷øjã÷ådãÀ–îðø ÷ އw ò&÷ H„÷5`ã÷ ‡Âà÷ÅäáaC¢|w˜Î÷· Ê÷ ÷ Òù7÷¾÷¸÷÷¸÷ã÷ ã· ¼ù,¨÷ŬáaC`w–÷· ’÷ ÷ ˜ù÷†÷€÷÷€÷Òâ÷ Îâ· ‚ùÅ · ŽóR”„ — ü÷f÷ ‚�òà ,&ÀÚíðLùðæø°4Îe°6ð•(ð÷ Î÷ Žþ€· ÷ÁùÅÃ%‡ ËÃåÅÆÄ ÄU?„ àa·êö— ü‡÷ ·Üö‡÷ žüÂü÷ `þ‡·Þø7 Øø÷€Ðø7 Êø7 Èø7 Æø€Á°àfj&�Ž÷ ~±‡÷ ìê6¦vwŒà€à7|à÷‹Šø(Àe"Á€âÁeB$$$ÀåÁe((ÁJà·<Røw<Jø  w<@ø÷ ÷ ÷ ÷ .øw<$ø·‘"øð•#÷ –†`Á ÷ ã÷ ò÷%,áWñ5@ñ5 O€f &�F÷ "ê6¦vwÂß7¶ß7 Ê÷÷ ¾÷*7<´÷&ð5@ ÷‹«÷÷ ª÷•Ÿ÷ ÀŽáð•ð•÷ ‡÷ þ†`Á ÷ bâ÷ „Þ ÷ Ê�Ž÷ ë·Ž ÷ R÷ fÞ ÷ ¬�÷ úêŽ7Š5÷wvþ÷ *÷ À&á7D>§3eaek›’À ø ,'à õwú‡ Šd2Ê J ‡J ŠD,�ŠDb@ŠT&æv.Ò ¦ÂÙÂe ÁH÷ Ü‚ â æÊ�€ €€ J Þ Ò € · ¤ûƒ‡· ‚û‡w„‡÷ Ž÷ Æ÷ Àúà Á¤Ø1 ï‚AÀ À `A÷ ~÷ º&÷ Üú€e÷ ÔúÃå"Ó áÊ倷 (ûÓ†–%wLþ·DÖ7Š�ê÷5¾Ùñµ€·ŠmêÀÆ& P ý‡÷ jÀe÷ ¦Üv‡Â*Øðµ ¦÷ bâ‚@ñ5 Àm~Øñµ  ‡ÀnØÁâ×ñ5@(‡¡ñµ€ ñµ fA ÷ |ç@€e±‡÷ �ú47 ¸ï÷ ²ù#‡÷ îù æ¤ï÷ àùÀE€ÿ ÷ Òù ù¬÷ Èù sN Ö 7 |ï÷ vù‡7 rï÷ lù؆w÷mdï`ï·ã\ï·ZïƒwÞûwüÂFÙ‚`Á÷ 2Ú¦÷ ^÷ øÔ*‡Ö  ñµ#ñµ€A÷ Váñ5ñ5 ñ5@ @@ñµ ÀmPׂ‡÷ ù7šù÷ ù7”ùÃå÷ ”ù ÷%1±‚ù÷%o†|ù÷m ØtùÀ’ÖÁÜ&‡Ö Ąօ Á÷ Êà÷ PâÁðµ ðµ ðµp`Å ê‡ÅFÖÂX‚µ,ùµ,õò €ÀÕÀÕ‡· ù÷%ù÷úø÷%ôø÷ ìø7Á¬ë1˜÷e¢ë×-žë÷ Ìø(7Îø%÷%Âø ÷ ºø· ´ø÷ ®øÀÅ€÷%¤ø7¤ø÷%–øÁw`’ø÷% „ø7†ø‡÷ 8å@‡w öìÀtéð5bwD÷%NÝwBÄ.Þ÷ Þö7Šóî÷50Þ·ŠçîúÜÅÄ&ÍÄ7jÿ÷5dÿÍÄU`ÍíÆÜÄEÿÄQÀŒ÷ òÍ÷5æÝÍUÕmöÜÕÕ Õ Õ÷ 6Ü ó 7äñõE€ôÿÕÚñ ÕÕ ÷,’ÝyÀ�÷ ”5þÿ÷5ŠÝ ÷ À�÷ |Àe5þÿ÷5ÂþcÁ÷ Næ÷5@fÝ÷ ÆÛÂÄ&p ÁeÁEp� � � r÷ &rPÁ Á ý õmÜôÿ÷5Ý4Á ÷5Xþ,÷ èå÷5@Ý÷ `ÛÂÄ&p ÁeÁEp� � � ÁrP÷ ¾ÁrPÁ Á ý õm–Ûôÿ÷ $ÃÅÄ&÷ ´ÃA÷ xåÀeŒ÷ Š÷ føÄeà ð×-|Ü.‡Ã÷ €÷ vÜ'÷ v÷5ªýÃ÷5HÜDþÿÃ÷ RDöÿ÷ ”à ÷ B÷5"Ü÷ €Ã ÷ .÷5 ÜÃe÷ ÷5üÛ7гìÀ†ÚtpÀ„÷ ä÷5ÜÛÀ°÷ Ò7 ýÀfÚ÷ jô÷ î ó5ÀÀ ÐáÀå7ðÀå7ðÁlwôïÁ ÷ väÀeŒ÷ ˆ7Þïó5ó5ó5÷lÀï·à¼ï÷l´ï·à°ï÷5LÛ÷˜üºïÁâ÷ �&Ĉü·ŠïëÁÌ÷ î÷evü7ŠÝë„EªÁÈ÷ dE£ÀœÙnÀ€÷ úÀ�Ù÷ ”ó÷5êÚ7Š¡ë÷ ÁwZï÷PïÁê÷ EñÀ^Ù÷ bó÷5¸ÚZÅ:EVDÔ ú�À6Ù0%õ0%òÔ5ÁåÀe"÷ ”Ý.‡ðµ€ãðµß%ðµ Ìm|Ù l÷ . ÷5RÚ7Š ëô þÿ·ŠÿêæÀ÷ öÃeÎ øÖ õU€¹÷5@&ÚÌ%J©ô%ø‰ñÁ`÷  Ûë‡Àm�Ø&÷ ÞâÀmÙ‚€e‡ÄeA÷ Âõà ø‡A÷ ¶âÁÄ& ý óµ ÁÈØ‡fEÃ÷ ºÿ…‡@Àm®Ø5À @ @ @ 5�‡÷5|ÙæÃØ÷5ÂúÕ˜Õšõí"ØþÿÍœÕmnØÕžÕ ÷, <Ù5 þÿƒ‡fEÃ÷ Jÿ…‡÷5&Ù& ÷ â7ŠÓéð5€·ŠÇ逇ÁmØÁ A A A ‡ ­,­3X ­s,w í÷5xÞ÷•-ï÷å²ò7 ¸ÿ7 ºÿ7 ¸ÿ7 ¶ÿÄà&÷ h7 ÿl 7–ÿ&fEjEA÷ ç÷ çAó�� "$Á ûì&õ5÷ `·eNÿáÖ ÀòF÷ Öæ&÷íðÝ8ÿÂÌ&Òà÷ FÜòE€þÿœ÷ RÒ ÀeÐ 2…Dm&÷ à€œÀe …¦÷ Ü÷ 8à Ð Dm&€÷ R€ì€„÷ RÖ €¸Ö ‡ÁhwôÞ÷ ¬þ¦Ää&À÷ Hw˜þÄè&À÷ 8wŒþ‚÷å~þ÷å|þ€ð5 LÄfþÄíÝ&÷ <ÅÌ&€÷ b€ÂÌ&     Ä2þÃÅÌ&÷ ÀÌ&ÐàPHìþÿ�  Ðþ ÷ ÛÐöýÐøýPPÐèý„ÔÜÅÌ&÷ ÊwÒþ …Dm&÷  Äè&÷ z7°ýfEjEÁhwæÝA÷ .å÷ $åAï�� "$Á ûèõ5 ‚µ,µ,7lVýÖÖ €æVý÷HýPý÷ V·Hý…€ @mÀeÁ,ý÷ ¸÷w þ Äý÷ ,Ú²üÿ ÒrTÒ,` ìÛÅÌ&wâÅÌ&œœu�÷ Àuõ‚ u u ÷ ÖÙC ÃeÃEõƒ ƒ ƒ ÄP7¤üõ€5 5 5 õ�üĆüÃwn&Áð÷ ÷€Àe&Ábü÷ òö€Àe÷ æö‡&÷ l �å‡ÁÔÚ÷ ÌãÀeÁå÷ ä݇‡ÁhwbÜÁEÿ�    ‡f ÄeA÷ �öà ø�‡A*÷ ‚ãœÀe5"5,$Á ö‡ ò  ð¶û‡ð®û‡&Àšî°-˜ÀåÀ ø7 „î˜Äm.Úš˜Àe &Árû÷ ö€ÀmÚ ö€‡00ظ>’:l1DATADATADATADATADATADATADATA Âw Þü ”Å¥ üÅ¥ ùÅå0B¡†€÷ lüAa”ôœÿÿ‡ dêê  w Ò÷÷ PÀ ÀBÀå74ûÀÈé÷ ŠñÅnÍ5@2Àºé÷ vñð•#÷ ¼ †`Á ÷ ŽêÍE@ôµ 7�"ðú÷èúæ|ÿˆ7 ¬÷Òú÷5 Âè÷Äú÷ J÷ >Àî÷ ‚À,÷ zÍ5@ ôµ÷žúæ|ÿˆ÷ øw,w ÷À çÀeæ6Þ ‡ðµúðµ ö0ðµ€0 ÷ ºòê‡w Ôö÷ Ú÷5@4è)ÀÊæ÷ Ä÷ Â÷5 èæ6ÀªæÀeÞ ‡ðµ÷ èð÷ nò0ì0 îæ¤Þ ‡÷ †ûÀpæð d Âe¦¦ dÁœ÷ \éž÷5@¸ç÷ ‡÷5²ç À8æð d÷¨ù÷¤ùæ|ÿˆÁò"÷ ÂÁŒÉ ÷ ¢é÷~ùæ|ÿˆ‡÷ Jð7œø€7 ø7 øw 6ç ÷æö÷÷üåò÷ÀmNæ7Ú÷7Ò÷7Ü÷w ç ÷màåÐ÷÷5ç÷mçÂ÷·l¼÷÷ ¸÷÷´÷®÷ò  €~Àm æ7’÷€lÀ 7’÷÷5Üæ)€œÀmìå7z÷€l¢w ´æÀm‚åÀmºæÀ 7l÷€®ÀmÈå7R÷€l¤À 7R÷w Šæ ò ¢ò ÷:÷<÷÷m.÷:÷÷m*÷6÷‡÷ žø Àß”ø· �øÀç÷ $ †ð¥öÿ*± `Á ÷ äç7hø7bø‡÷ ºÿ&÷ ´ÿÀ€U‡w ºô÷ÿÿFø& ææ· <ø¦�÷ Äð7šäwžäÍ �÷ äî÷ Zð& íÖ ¶#ê–%÷ ø�÷ ÀîóÖ ‡·ú÷7 ô÷÷€ì÷7 æ÷7 ä÷7 â÷€Á@äfj&�Ž÷ ~±‡÷ |î6¦vwäÂä7 ä÷‹¦÷(Àe"ÁæÁeB$$$ÀåÁe((ÁÚã·<n÷w<f÷  w<\÷÷ ÷ ÷ ÷ J÷w<@÷·‘>÷ð•#÷ À†`Á ÷ ’æ÷ ò÷%¼äWñ5@ñ5 O€f &�F÷ ²í6¦vwRã7Fã7 Øö÷ Úö*7<Ðö&ð5@ ÷‹Çö÷ ª÷•»ö Àåð•ð•÷ 6‡÷ (†`Á ÷ òå÷ „Þ ÷ Ê�Ž÷ ¦î·Ž ÷ R÷ fÞ ÷ ¬�÷ ŠîŽ7ŠQöwvþ÷ Fö À¶ä7%ÿ Rð.ø%ÿ Jð.4&ÿ Bð:°-ÿ :ð:|*ÿ 2ðF*)ÿ *ðRf'ÿ "ð^À&ÿ ðލ2ÿ ðš®2ÿ ð¦;ÿ ð¦r=ÿ ú零5¯ÔLŠâ ¢bÒ ðµ ð5 ðµ€âm–àâm’à Ï &&& €�÷ ¾ï�eJ€‡ ò üÿò ÿüÿòœÿþÿ‡ŠŠìüÿРЇÁeBRRR R R‡w ¨ï÷‹ìþÂP#7 âþ‡÷ œ ÂP#Ã�ÒþÀŒÁ 4÷ XE`à ùA÷ "Á®5÷ ‡ÂP#¦f÷ d�‚ÀŒ÷ *À^áðŒp÷ ð†`Á÷ 6â7 tþÂP#‡f÷ Ø&@áÍ¥ 7 ZþÍ¥ · NþÕ‹À ò€…‡÷->þhò�ÀêÞ7Fò7Bò· :òæ þÂTÁ4÷ tÿ·þ‡ÂP#Ò¢æ0òÎå00ØÀ>D>§3eaek›’Ö-üý÷"òôýÁ¾4÷ :ÿÒ¦ÒªÁ5÷ *ÿʶޡ Š ŠÒÊàŠÊeÿ ŠÊÁ<5÷ ÿæP#æ=ÿˆÁÀêÂ\#"è€Êe<ò þÿÁ øÁ˜5wÜþ÷ �þÀ6Þð dæ¤ñÎå Ö-pý÷–ñhýÁc4÷ ®þÁœ$÷ ‡w îÀÞEÀe"æ6Þ ‡ðµúðµö7,ý7(ýÁ�4Í ì‡Á™4ÂP#ÀŒ÷ zBÁŒ÷ Ná‡÷-߬Ýð5ð5  Òm ÞÒ4Ò4 ¦÷ Âç‚ðµ  â4ð5 âmØÝÒ Ò ‡ÿ †ì¦¶=ÿ ~ì¦$9ODT xfr address: %P%NPRG xfr address: %P%NStack limits: %P %P %P %U.%NIdentification : %2R%NTask attributes: %VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%NTask address limits: %P %P%NTask Address limits: %P %P I-Space%N %P %P D-Space%NTotal task size : %T. Words%NTotal task size : %T. words, I-Space%N %T. words, D-Space%NPartition name : %2R%N%P %P %P %U. %VS%2R%N%P %P %P %U. I %VS%2R%N%P %P %P %U. D%2N%4N%X Overlay description:%2N---- --- ------%NBase Top Length%NTask UIC : [%O,%O]%NTask name : %2R%NTask priority : %M.%NMapped array area: %T. words%NTask extension : %T. words%NTotal address windows: %M.%NTask image size : %T. words%NTask image size : %T. words, I-Space%N %T. words, D-Space%NR-W disk blk limits: %P %P %P %U.%NR-O disk blk limits: %P %P %P %U.%N w „éÂT÷ üÒhØÒfØÒ  ƒææ=ÿˆÁ4ÂT÷ òùÂ~Ê Á1)÷ âùÂBÁ_(÷ ÖùÂLÁ*'÷ ÊùÒ�£ÚŠÒ�œÚŠÁ)÷ ²ùÂP#ÊTÚÁH)÷  ùÀ\Ú÷ óÂP#÷ `ÚÊëÊmÙŠÒ ÊNÚŠ¢hÁ '÷ rùÂxÊ%ÁÞ&÷ dùÂŽÊ%Áô&÷ RùÁ–× ÷ ã÷5 ÚÁUwpû Áz×=÷ àâÁEÿíÁ5ÁUÃŒ×BÁ@ƒ@ÁP+Å®.ÄÂP#A5ÒR w=þÿd׃ U%Õ òeþÿò üÿU%Õ Ä èò üÿÁA'— °#† Òz*ù÷ ®øÂP#ÊxØÁ¡)÷ žøÂP#ÀPØ÷ TÁ_)÷ ˆøÂP#À6Ø÷ >Á€)÷ røÂP#÷5:Ù'À2Ø÷ "÷†úˆú÷‚ú„ú÷‚ú„ú÷~ú€ú7 vú7 tú7 fú7 dúÀü×÷ òÂP#ÒÐ&ÊÌ&Áß)÷ øÀÞ×÷ ÔÁ¾)÷ ø÷5ÔØ ÷-,ú2ú ÷-&ú,ú÷-úú÷-úúÂP#÷5¦Ø ÒÐ&ÊÔ&Á (÷ Â÷ÊÐ&Áë'÷ ´÷ʜ׊ÊmR×÷5vØ Ò Êˆ×ŠÊm@×Á¢'÷ Ž÷Á…'÷ „÷÷5PØÒ×Ê&ØÊ ÷5¬ùÊØ÷ øöÁ2*÷ Z÷÷5”ù ÒØÊþ×÷ ÜöÁV*÷ >÷‡ÊÈ&Á ÷ FæwXù÷mTùZùw Tù÷mHùNù‡¦Á^Õ ÷ ÈàÀe‚Á Á ýÖ ‡×-¾Ö÷ ÈÿÁÀ(÷ ØöÁú(÷ ÐöÁÞ(÷ Èö÷þø÷5 Ž×÷ðøÀò-÷ Vñ‡w æÀÖ÷ ðÂP#÷-ÖT×÷zÖèÒèÊ è²"þÿ †òòçþÿÊöç²"þÿ†Ò   ÷ øõÒ Ê˜øÃTéÊmŽøÃ üÊ%\Ê\Ò À¤Õ ÷5×Áv(÷ &ö‡Ò ÷-ŒÕÜÖ÷Ö’çÒŽçÊ”ç²"þÿÒ   ÷ �õÒ Á�(÷ ðõ‡-AC,-AL,-CM,€-CP,-DA, -EA,@-FP,-HD,-PI,@-PM,-PR,-SE, -SL,€-TR,-MU,-ID,%N*** Root segment: %2R%3N*** Segment: %2R%3NR-O mem limits: %P %P %P %U.%NR-O mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NR/W mem limits: %P %P %P %U.%NR/W mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NDisk blk limits: %P %P %P %U.%NDisk blk limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%N%2NMemory allocation synopsis:%2NSection%44STitle Ident File%N-------%44S----- ----- ----%N%2R:(%VA%VA%VA%VA%VA%VA %P %P %U.%N%30S%P %P %U. %2R %2R %X%N%3NGlobal symbols:%2N%F) w Öê÷ &û×-<Û÷<îúÀ¾Ú Á-'÷-¶ÚÜÁ'÷(Û¶ì÷ 6ûÁ˜Úñ5-Á¤'Òžìʤì²"þÿÒ  ÷ ¢ú÷5ØÛÁÄ'Ò ÒxìÊ~ì²"þÿÒ  ÷ zú÷ àú÷-JÚšÛ÷-VìXìÒDìÊJìÁA'÷ Vú÷5ŒÛ Áa'Ò Ò(ìÊ.ì÷ <ú÷ ¢ú÷5nÛOÁüÙñµ@Iñ5JŠ@JŠ@¡Ò   ÀeÿŠÀÀ `÷ èùÁ(÷5Û#Á¨ÙÒ ñ5JšŠ@¤J˜Š@ž¡Ò   ÀeÿŠÀÀ `÷ šùÁ'(÷ üùÁi(÷ ôùÁ‹(÷ ìùÁ«(÷ äùÀFÙ÷5¬ÚÀe”00ØÈ>’:l1DATADATADATADATADATADATADATA&Àeæ6÷5”Ú€c&÷ nãÞ [‡ðµ÷ XãÂP#÷ ù·,üÿ Ûâ÷ ˜w´û ·°ûw®ûÁµ Á5 òmPÙþÿ7Šû  ·†û’ÁË(7 ‚ûð ·Šxûðµðµ ·Šeû÷ (ùæžÞ ‡À€Ø÷ rùÁBû÷ Êâ÷ Päð4û0ìð(û—÷ ä‡w TèÅþ-ÄJ’ p5ÊRaU%U%Ä óú%$$þÿò øÿò#)þÿ² üÿ‡„þÿô•)‡w èF�… ÂP#÷$¾ú;Ò¶úÁ¾úÁµ Á5 Á5€ €Ážú÷ –çÁm˜úRòmHØþÿÊ÷‹ŒúË ’÷‹�ú÷bpúÀ¢×ð5€  Á˜Ù÷ À÷Áï(÷ øÓ Å ½‡w rçÀl×7 ,ús&æÖêÎåÖ-¢ö�÷ÈêšöÁ )÷ à÷€Àe"æ6÷ Ú÷úú÷öùú÷žêüùÅè&ÄÚ&Þ ••UÔäù÷íàùÜù�Þ ÷ „ü‡÷ Îùù÷ Æù ÷¶ùÀùæ÷mºù¶ùô²ùþÿænĦùÂè&ÅÚ&÷@êšùÃP#Í Þ ‡÷ <‡¦Â÷ üøƒ‚Õ ¢(â î· æõÄ ÷ fùç÷ äöÛ÷ Þö– ÷ Hù¢– ‡¡ðµðµ€ðµ€±‡w \æÄÎéÄížõÄÄéÄå Á¸éaÁ ý·ùÃúøƒà�7ôø÷ìøôø  ÁìøÁíŽé�‚ ú‚ ·Òø÷Ìø‡RO,RW,€D,I,@GBL,LCL, REL,ABS,OVR,CON,SAV,$$$,%2NFile: %X Title: %2R Ident: %2R%N <%2R>: %P %P %P %U.%N >>>>>>>>>>>> Undefined reference: %2R%2N%7S^(¦'\(¨(¨(¨(n(Ú'Ü'î'ð'ò'Ü'Z(Ü'®(w šìÄ’Üô5€wúÀŒÜ÷ †ö÷ <÷ j÷‡÷ ¤÷Ãå ƒ À ø F'ðÄÎ&Å÷ „÷Å ûÃåÁÌ&Bœ— J‚ À2Üú T'à 燇Àe÷ œà<‡ÁÌ&wþ‡‡ñµ Àe"÷ ~à ‡ðµ÷ fñµæÚÞ ‡÷-äÛ2ÝðµõÖ Ö ÀÌ&÷ ‡÷µˆþÁ°Ûñ5‡‡%°݂`Á÷ œÞÖ ÄŒÛ&Ž Á÷ Òå÷ XçÁðµðµ p`Î îÖ ‡7 êî‡Àe"÷ Ê߆ÀÌ&÷ ˆ‡÷ ’ûÁHÝ÷ pûÁ.ÛR RRR ÁØ&÷ ²û‡f&÷ dû÷€îÐý€Žðµ÷ Jå‚�÷ þú ’J÷ ¨úÁþ&÷-îÜ"ú ×-ú¯÷ úwZû·Šú‡&Áþ&÷‹ûù÷ Dû÷ üú÷îhý€ Á'÷ (û‡Áþ&&÷‹Íù÷ ûÂ>ý÷ ¾ùÁB'÷ ûÂP#€÷ ®ü· ¦ù·ý÷ ý÷ ¤ú÷Àíý‡¦&æ|³€Æå‚¦& æ f&&æ�ÿˆ ‡æ æ‡ÿˆ€Æe#Æe¦ö|³& f&&æGÿˆ‡& & & & &&æ ÿˆÀ†×'&ùÿ±À&–‚‡ð 89f¦æ�Æå‚œ"¦ææÿˆƒÂe\¡¡¡Âeòÿ¡¡¡!ŠÂe¦¦¦¦¦�÷ � ‡Ã5Àäf÷ ÿ2*€ ÆeA ƒ‚�‡”$ðº~v%B%l&l&l&l&f&†%²%´%¶%¸%²%j&¶%¶%w æî÷ ìü÷ Îù‡÷ úÃå ƒ À ø ú$ðÄÊ$Å÷ èùÅ ûÃåÁÈ$Bœ— ‚ À–Þú %à ç‡Â˜à‚`Á÷ „á7Hÿ7Dÿ÷•Gÿw:ÿw6ÿ×-ÊÞ÷ ª‡‡‡‡ÂÔ$RRBœÂÅ×ÿ·�ÿ÷ ÜG‡Dœ ŵŵ€÷ fèŵ ÂmˆÞ·ØþÄ &ÅÅmÿwÑÎþŵ€·rßÞ †7 jß÷Å€¶þ7 ^ßðµ€ððµìðµ ÷m>Þ�þ÷-¼Ý ßá– 7Š…þÁÔ$ ‡Ö ‡‡7 &ñ‡Ànܰp°÷ >†`Á÷ và‡Àh¼$ÁÁ ý ÷5 ¾ÞÊÁ¶$ÂÙw @íÅnÍ5@bÍ5@VÀà$Á:ßPHPJPLPNPPPVPXPZP\Pœ^ŠÍ5ÈÕÀeÐøÜÐ�öÜŠ@÷ �†ÍE@@3À´Û÷ ¢æð•#÷ z7P¬ý †ÍE@`Á ÷ °ß÷ 6ÿÀ”'÷ Þ÷ÀxÛ÷ D‡À–Áà$÷ Îû À’ÞÍ5÷ Dü÷ "‡w lìæ¤Þ ‡À\Üð5€ø÷ jýõ‡ÿ ˆëލ2ÿ €ëš®2ÿ x릶=ù¬sNÿ ü<@1±o†  ­,  ­s, ­,Š’š¢ª  ­3XÔä    ­s, ­ø�wµW" & B ® ¶ w ûÀš÷÷ èôð•#÷ H†`Á ÷ î‡7bŠÿ÷5„ÿ00ØÐ>D>§3eaek›’÷50Vì÷5tÿ×-Dë÷U >ì÷U6ìÁì÷ àöÄTTÔ ÀLÔ ÷ ŠêÔ„êÔ‚êÔÁÜë÷ ÔôÀe"Áö÷ ðîj‡÷5ÿômæêþÿ4Š7 \þ÷5êþ ÷5¼ë)Ã÷ &÷ D· <þ÷5 ¤ëTTÔÕR÷5¶þôÕ ÿÿÔ•T÷ ×-tê÷ ÷ dÄ÷ ú÷ Ø÷ øÁðÂ÷ ÷50Jë×-@ê÷ ÌÁë÷ Žõ×-0ê÷ ÊÁòÂ÷ ÎÀ$ö÷ ؇Âb÷ œìÄÔÔCÃetÃ5Á÷ ÌóÁ’A ñ û1,÷1,ëòÔ œŠ÷5ÔýômºéþÿôÅ üÿ ÷ zóŒ÷ ÌÄ%� ‚æ"!ÁBà÷ („‡Á@Àe÷ líwöü7 üDÄet=Ã.÷ &ó+&  ÷ ó+Œ�÷ ó÷•ìûÎðµw ¨ü À Á Î÷• ÀûÁ ÷  Â ÷ ˜‚÷ ’÷e†ûÁÁ¸é÷ *ôÀ°wnw PøÅJèCÄrTŒÌÌEoÿÌU`ÌÍ5Ó ÔTÔTÓ ÜÔæÀ ""Á Ò ­Ê,÷ Vò<ŒþÿÎ í– Ó ÔÔÀ ""w-<éÒ­Ò3XJ�Ä@éÁf ÷ æÂa÷ ÜÁ†Â&!†Âå÷ Æ÷-¢çòè÷ éÀXÁ\ÂB�‘ˆ‰ÁF ÷ ˜Â÷ �õµ4øS�A÷ ¦ñ{ÂR�ÁJ�33óm‚ç3 3Á¬Â ÷ <Â÷ 4Â÷ ,ÁàÂ÷ ‡@÷5Zè ÀeæTÂÞ ‚‡¦÷ ÷Àe”&€&÷ ñ÷ ö‡& ðµ÷ øððµ Ö #w~úÃôÁ  ýóµ€óÅ 3 3 �4Šóµ@ ÷5òú÷ Xúw6Á ô•÷ ”ðð5ó÷ 8úð÷5Äú÷5–ç÷5 Žç÷ ü~‡@Àe"æTÂÞ ‚t‡¦4Šðµ€÷-ØùÂåð÷ 6ððµ  ðÅ ôÕ7, °ùÝðµÙÂeÁ’A ñ û±"ø±,È󔔌ÒÔÅ“ÿÔ•÷5ú óµ ó ämðåäE %óµ ÷ Lå÷5 Âæ÷5ºæëôìþÿ÷ D˜÷ *åúô5üÿöÊ5Ê5 ðôUüÿì‡Á’Añ ûTTÔ•@Ô• f÷ ø�í‡Á÷ B 7zùÀÁªÂ ýÁ¤Â÷ æÀL!÷ ÒÀV÷ ʇw ªôÀ¤ä7`ù7\ùÀœä÷ @wRùÁ¾Â ÷ ¨÷ ²æÚ#Þ I‡÷ ä†wB÷  7 (ù ñ÷ ÚìÄêø÷ ÷ ú  7 ùß÷ î÷ öø÷ ˜�ùÔ÷ äø÷ †�÷ ~�Àå7œøW!i‚Å gý ÖêÁˆøBà÷ ·‡wÆ÷ 8@÷ ’€÷ ŒÀ÷ œwª÷ Ú@ ñ5 ñ5 Å(ä@a÷ \@@a÷ R¦ÂŠãƒƒ ‚·$øÒ à ú&€÷ .€÷ @÷ À÷ 0w>÷ ,w6÷ ÷ ¸�÷ Ø÷÷ Å ÷ Å úwÂ4å‚`Á÷ æÁÁePó ±PPÔЕÐ Ä%” ‚æ!ÁBà÷ „‡ÀVïp°÷ " †`Á÷ Âå�`‡w ´òÀ®âÀeæ6Þ ‡ðµúðµ ö0ðµ€0 ÷ \îê‡Ärâ&Ž Á÷ ¸ì÷ >îÁðµðµ p`Î îÖ ‡�À�À‡Ï ÷ ¤÷ Èö�‡&÷ –÷ ºöÎ úÖ ‡Á®ö÷ ØÿÁ ü‡÷ ¸÷ ¾ÿ7îõ÷ ¬÷ ²ÿ7äõ÷å„öÁô‡&÷ ÖÿÀØáÀe÷ Næ=‡wjö ÃÌáðµ  ƒwNö¦÷ þë‚€‡&÷ ”ÿ÷ nß ‡Ö   ðµðµ€÷ Ìëðµ Ámìá f÷ B�€‡w(þ ×-ºá&÷ ”ëŽ&Œ÷ ˆëÁm°á�e€‡÷ >ÿ÷ Ò÷å²õ@lñ5 ñ5 Àm„á÷ ºþÀ÷ ¤ÿ@÷ ®þÀ÷ ¾þ‡w âð÷ÿÿ õ& æ,â· –õ¦�÷ ìì7ÂàwÆàÍ �÷ ë÷ ‚ì& íÖ ¶#ê–%÷ bõ�÷ èêóÖ ‡÷ Tõ ÀßJõ· FõÀ†â÷ ¼ †ð¥öÿ*± `Á ÷ bã7õ7õ‡÷ ºÿ&÷ ´ÿÀ€U‡·õ7 õ÷€øô7 òô7 ðô7 îô€Áàfj&�Ž÷ ~±‡÷ Rê6¦vwòßÂæß7âß÷‹²ô(Àe"ÁæáÁeB$$$ÀåÁe((Á°ß·<zôw<rô  w<hô÷ ÷ ÷ ÷ Vôw<Lô·‘Jôð•#÷ °†`Á ÷ hâ÷ ò÷%’àWñ5@ñ5 O€f &�F÷ ˆé6¦vw(ß7ß7 æó÷ æó*7<Üó&ð5@ ÷‹Óó÷ ª÷•Çó Àôàð•ð•÷ &‡÷ †`Á ÷ Èá÷ „Þ ÷ Ê�Ž÷ |ê·Ž ÷ R÷ fÞ ÷ ¬�÷ `êŽ7Š]ówvþ÷ Ró ÀŒà7ó‡7 2óÀ`ÞÁnà÷ æçÁTÞÀbà‡÷‹óÀVà  ÷ Œ‡�÷ Vêw .îÁ�� Á EÅå‚EÁ ÷ r3Á÷ ÁÅ÷ JèÅ ý‡ÀæÝ 0 � Á Á À(÷ ²æ‡w ÈíÅøÞÁÆÝ& f wˆò÷ è÷ RÄ  öÄÀœÝ& ff÷ àç÷ ,ö� ÷ Òç– N ñ– õ„ !‚æ6ò¦í– ‡U ‡€ø&ì' 00ØØ>’:l1DATADATADATADATADATADATADATAÿ 莨2ÿ øçš®2ÿ ðç¦;ÿ èç¦r=ÿ à禶=ÿ Øç¦²5&æ¦f&¦ v Þ €�‚ƒ„…‡RO€K'æ2RW€J'æ2SV€K'ç2L'BÁ Á ýõÿÿ.õî*õõð* õ &• H’ � ¢ûƒ€ ¬ÿÿ;ö ôàwà4途 — ; — !— ,— :ò&À u@à5€Åe,‡ ¤RN¢Oõ€þÿ¢WE€ ”‡5& ”— , — ! — [Ž ó— ]ðÎ îÎ ìÖ )@íÀ 55 ,õÿÿ.@÷ z‡õÊ2÷ †ÑõÜ2È•f ¦Â4÷ þ‚�ð5€ƒ@‡– ÁÂpwæÒ· JÑwÀþ· BÑw^ÿ ¢-õ€þÿЋ¤Sæ¤Vã”Íÿÿ‡f¦æ&f ÅÂ…`Á Á ý°* �… !†ƒ”×  ×  Ä õ× ñƒ× ÿî× "D × a‡× z‚Ä ÃE Ñ�ÝEp(p°à„… †ƒ”× $ú× 0‡× 9ôƒ× A‡× Zîƒ× _ë× :� � ‚„… V†ƒ”× [È•]× <È•>È‹8 … |†ƒ”× %ú× *÷× -‡× .ñƒ× 0‡× 9ëƒ× A‡× ZåƒÈ ‚ … |†ƒ”× 0‡× 7÷ƒ× *ô× ,A ïlÈ jÁ hŠ„ … q†ƒ”× "A øÁ ö „ #A … c†ƒ”× $‡× %÷ƒ× *ô× 0‡× 9îƒ× A‡× Zèƒ× _å× .� £ß … †ƒ”× .× ; … f†ƒ”× 0‡× 9‚� õ]× -Á X� í× *Á QA æ × ,Á D× = Á >È5 B>ÈU °(wZþ× /*Á .�Á … .†ƒ”× $× -‡× .ƒ× 0‡× 9ƒ× A‡× Z ƒ× _ × :Áÿÿ   DÚ× " Á … †ƒ”³á°0±…„ƒ‚�‡f¦æ&fæ ÈE¢¢^Á`Å÷ úÄ ÈUQÅÿÿ÷ æÄ ÈUQ ÷ ÔÎË€ÈUIá ÈUà `¢Ãe á ÉáccD ÷   Ä”¡%¡*¡.A ÈU Å ï0 0 ��W ,ÈUw@W /D ÷ DÎÄ cBDaW£-Á�Á N�… W¥N W¥OD!†B�“Á N�{É …CÃE€€C¥ÃC¥D!‚Ñ ó�ñ‹þÿ€D! ΋ñ5 Ñ þÁe߃“ƒ Î�à UÂåÔpRpR„“pBCÃ5D ‘ƒ à KR΋KBAÁE�—­:ŒDœ0CŠÄŠý ÷ fÎÄ ÁeëB”—   ¡ƒŠDÒ� CS•ÄŠÞü ƒÐ÷ Ò ‡W¤†CÅ E Cs ÉΕŠ …„ƒ‚�‡f¦¦)& 6 l(¢*¶„„íƒ †�”Å EÅ 'W "Å =N íÎ ëW :+W =Å 1 Â#W ,W /Å %W %W *ÑöÕ€ÍÄ W <ÈW [ÄW >W ]¾„ v�¢°(°* 6 ƒ…Æe‚�‡÷  ø¦Âe°ÄeȵÄeà Ã~÷ Úü‡Á DE  ȵÄ2…Åe &Âe ÷ Š€ †ß%�ÿ&'ðÕ@±^ÃeðÅÁ5€ðÕÁ5@ðÕÁ5ðÕÁ58ðÕÅ“B„Äe€Ãe°ÈµÁeÄeÐÿ& q1””BÓ$ðñðñ„Äe q1 ””Bð ñð ñ¡–‡w ´ØÁ w ªØÁ& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡00Øà>D>§3eaek›’w <áð*æ8Iðµ÷ 0œ*=‡ðµ€)98÷ Z ÕeBÕ && ð Îå¶ �ÕU€�Ä÷ L‰�†ð¥öÿ*ð¥åÿ*Æe ð*Nlv °°΋œ*ðµ.2÷ ä „& ðµ#ðµ!ðµ)&ÎePæÂ(ÂeÊ ¦æ&æ•&Äð >€Åe >ÍE€÷ ¨†�•p�*÷ êw"ð 8 ðµ!ðÕ€)wÌþð•Öÿ*wð‹*±‡ð*‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡0Š+æ1ÿˆÅ(Åe à ÷ �ÿß%ÿÿ&ïp’*wjÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ Fÿðµ82Áe&À(÷ Ø€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡¡ðµ)"ðÕ(.÷ <ðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ Ì÷ ðÅ(.‡8Áe2 ‡÷ ìÿðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ ^&‡f¦æ÷ (÷ †ƒ‚„÷ „‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ &0ž8*wÞý±ðµ=p!†Õ•^ú‡141612Áepðµl2l0p‡,*ÿÿ±‡æ1ÿˆ‡46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ ýwýÄÄ÷ FýU•Õ8UMwRýÅåà wæü0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w ”Ü Á�   ìì� .Â% ÷ ¸ü ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ ¨ü ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡÷ N‡w 6áÁ(ñ D÷ Bð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwtÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)ÁeB÷ î ‡÷ Lñ \ðµ#÷ ~U†&œ* ðµ=ð¥æ•Øÿwô Å`p!2üƒÅàÅ… ÅEW!Åp0p2÷ Pׇðµ#(ð PðÕ)÷ †ðµ@#ð¥Çÿ*ð*fff÷ À±±‰‡÷ І&œ*wjðµ.÷ nB‡ð5ð(8ðe$8w2€æ•ÖÿA&À(Áe÷ ÆØ€†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA#ðÕ@))÷ > †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ ä00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ ‡0 @0 ð‡&œ*0 @÷ uÄ÷ @ðµ# ÁeB&B÷ f°B÷ ÷ n°•*±‡÷ â ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ j0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6w€ð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡w êÜÁ(DB‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±DÂ(Âe(¦„Äe$2ƒÃeäÿæÓÏÓ Ó(‹ÿˆ‡Ì%[]Ì%<> ƒ ÷ X„팂1 >‡w VÜð*ÁeBð 8÷ ¦‡ðµ÷ æ‡w ,Üð*D÷ ¼ Õ ýwÞf&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡w šÛBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=w„Å(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡141612Áepðµl2l0p‡ðµMðµ=ðÕf�Â(& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ðµ=&Îe0æ ÷ U• Â…à  ÂE•Õð >€ >ÍE€ðµ=ufÄ÷ p†�ñ ± wh÷ " ‡f÷ Æ�†&œ*÷ °•*±‡Ä Ä Ä ðµf÷ |ð >€5>õE€u ÷ ’�‡ñ ± ‡ð‹*±‡ð*‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡÷ äÿMÄw 0Š+æ1ÿˆÅ(Åe à ÷ ‚ÿß%ÿÿ&ïp’*w\ÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ 8ÿðµ82Áe&À(÷ ÄÑ€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡ðµðe6p 4÷ „†8÷ îü±‡÷ º†81416÷ ÷ .ñÅ ÷ T‡‡÷ ê†÷ è‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ ,þU•Õ8UMwFþÅåà wÌý÷ NþBðµ° 0ƒ0fÁepðµ=& 00Øè>’:l1DATADATADATADATADATADATADATAÜ/°e�`p�wvý46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ ýwüü8Áe2 ‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡Â Âw Ná ”Å¥ üÅ¥ ùÅå0B¡†€÷ ÜàAa”ôœÿÿ‡w á„ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ hàE�€Aa×$Ò±œÿÿ‡÷ &÷ &÷ �’•’•€‡@Á(÷ @àf€  Àe ÀeÉÿÀe Àe ‡w TàÄ'Å  ÅUD$†BA÷ D&�Â(÷ ÅU� ÀBQ÷ ¦ ÂЕ* ü‡%2R %P%2A -R%F%X Memory allocation map TKB %2R Page %M%N%2R%15S%Y %2Z%4N%4N************%2NUndefined references: %2N %2R%N %2RTotal task size: %M. words%N%4N*** Task builder statistics:%2N%4STotal work file references: %T.%N%4SWork file reads: %T.%N%4SWork file writes: %T.%N%4SSize of core pool: %M. words (%M. pages)%N%4SSize of work file: %M. words (%M. pages)%2N%4SElapsed time:%3Z%N%Nf÷ jÙ†Â(Á÷ DÑ�ÁeÁE�  Á ý‡Á,Á*Á(÷ ÁeÁ(÷ ð ÁeRRR‡÷ ø×¦vÁôÏð pbÁeBÂeRRRRR R RÞ �‡Á÷ Xÿð|Í&Á˜÷5ÏÁe ÷ ”×ð"ð•�ppplðe5lÂet²°”°–· È͇·:Ë÷ Špðæ4°4Îe°6ð•(ð4÷ ú ÷ xH‡· ¾Î· ¶Î‡·ôÊ÷ Hð ý pðæ4°4Îe°6ð•(ð4÷ Ô ÷ ,䇷 vη n·�7 ¼üwœ¶ü· ²üÁeÀT·‡ææ)ÿˆwŒšü †7 ˜ü±� ÁI÷ ŠÏ‡Õ ÁAæZ”� ‡Ž ‚µ�þÿ”� ‡Ž ‚µ�ÿÿ”Ö 5¨2®2È‹Õÿÿ+& È¥+È¥-Î € Ê Ö  U÷ œÿÀ ÷ Êÿ‡ �f  ÷ æúuüÿ ‡�÷ Úúuþÿ‡�÷ Îúü†Ö Â¥ Â¥ ”ø‡È¥ È¥ € ø‡JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECABDEFIMNOPQRSTUXYZ<>%`h‚¢Á*„ÅÐÜÖ „x*%/w `ÛD…&&÷ bЕ-�Î �eÁaÁe}ÿP”P”P”Е-�$w 0ÛDÅ… ƒ÷ &Е.À À À ce÷ ÐÚÀ …Е:÷ Å ù Â÷ 6B‡w ÜÚ&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ DùÀ ÀCƒ ÁÁeÿÂ!£ ü„  ÂaÂeîþ‚bÂEÊ Ö ÌЕ%„Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ ��à õ‡& æÎer6& ¦æÎe^/& æÎe’ù*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎe$ & ¦æÎeЕ A‚¦Þ à ÷–%‡& æÎeäòA÷ ÎøÃ û‡Ð• à ü‡A÷ ôýE‡AÂ÷ þE‡Ð• Aæ÷ šøAÎ ûÖ Â ÷ $Е.÷ ‚øÂ÷ AЕ; ÷ bà à‡Â ýð¥ ÿÿùÀ øw ÖØ÷ ¨‡ðµ)ðµ÷ æ 8C÷ $ð¥öÿ* ðÕ)ð ð*wÜð•öÿ*ú÷ ì÷ Èõ‡ðep p ‡÷ „è‡ð¥#ðµ=Ä E”W¡9ƒÅ¥^éð•³ÿ*ÐÅå0ùà Å`à à CaÄ ëÃåCƒ Ôà ðµ=ðµ÷ X ð¥ð 0Àð•Øÿ*§ð¥ ðµ= ÄEÕ¥^Ä ûA¨ð¥ æÂe@ÃÎà÷ Þƒ߇÷ ðµ=� ÁEpÓðµ2ðµ!)8ÂeEÅ`l0Å …à ì0‡„ û0¡/ &l0Ä ü„…`pÄ „löÿ06°ôÿ4p 4÷ ˜ðp°æÄ ƒðÎà÷ 8ƒ ƒ÷ Vá÷ ù†ð•Øÿ*Á`‡ðµ)wÐæ÷ øƒ‡æCàƒ#ƒÎà÷ bÎ ¦÷ Èÿ‚ð†– ‡DàÄ ‡ðµ@) ð 6ðÿ?0ðÅD)‡w rÖ÷ ÈðµðÅ)÷ `†ð¥öÿ*÷ îw–46l0ì‡w .Ö÷ n‡832cðµd& & & B öŠð 2OðµðµΕ ¶“ðµ à N”à Υ$¶“Ε Åð 2ƒ2Åà‚Î¥ Ž�Î �æ÷ JƒvÂ Š‚ ƒ“Ε f÷ rƒ�ׯe÷ ð¥óÿ*÷ ²Æeð•Øÿ*w–ðÅ@)0,÷ `÷ ìò‡ðµ ÷ h‡ðÅ)÷ pðÕ)ðµ( ð¥ Ó ðµ=Ó ð¥Ó lð 0Æl‡ð  ƒ÷ ö†ð¥øÿÿ÷ 0¶‡ð¥/ð ðð¥Ãe&ðµ=ÅBaÀ@aÁ ÷ XÔÁe0b�Å ÷ÂeÒ€ð¥Áe@Ã÷ Ô^‡÷ ÆW‡ðµ=‚ ÂE°8óÅ Ãe…l0Å Åà & ì0‡„ l0ù…Å`pÄ Älöÿ06ðôÿ4p 4÷ ªðep ðÕ)ì‚wnþðµð¥Ã% ÷ Ά,÷ À÷ ‡÷ 0w>þ÷ z‡÷ J†wv‡B æƒàƒ#ƒÎà÷ Î f÷ Ìÿ� ‡Â`‡ð¥öÿ*00Øð>D>§3eaek›’÷ ”w„±ðµ)0406 l0ì° ‡w Ó÷ Œ ‡Ä0,0w ¿÷ b‡÷ š‡w äÒ÷ f$‡Ä0,0wç¾÷ <†46÷ F‡÷ fðµ)0406 0 ð‹*±‡æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w hÒ…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ ÒW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡ð‹*±‡ð*‡0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w ^Ñ Á�   ìì� .Â% ÷ n ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ ® ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡±ðµ=p!†Õ•^ú‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡ƒ  �D„PÄ5Rà ý†R”‡R”R”à üøð 8 ðµðµ÷ jþ‡ðÖ*±‡ðÃ*±‡ðµ=D…÷ ì ‡ð`p4°6÷ ÿ‡æf¦÷ @°6°4/‡ðµ=Á  ÷ RðÕ@)ð 0 Ö 8wè÷ 0ÿƒ46÷ þ‡8ñÕ ÷ ®°eð‹*w®þÖ ±‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡ðµðe6p 4÷ 2þ†8÷ ±‡÷ ¨†81416÷ â÷ lñÅ ÷ ’‡‡÷ Fê†÷ Ö‡ð 8 ðµ ðµð �¡‡ð•Öÿ*±‡÷ ¦ü÷ „ 4 6Ååà ÷ .‡ðe6p 4‡ð&*‡÷ Rðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ ü&‡f¦æ÷ €÷ ø†ƒ‚„÷ V‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ º0ž8*wªû0Š+æ1ÿˆÅ(Åe à ÷ @ß%ÿÿ&ïp’*w~û÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ Zû8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡141612Áepðµl2l0p‡w vÌðµ Á¥ðÅ)÷ ¸ú‡÷ ”ÿ ÕfU�Ä÷ ôþ…‡ðµÕ%  BA °`6p 4p`4¡ ¡õ%þÿð60 4‡46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ êùwÚù¡ðµ)"ðÕ(.÷ Âðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ pú÷ <ýðÅ(.‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ VþU•Õ8UMw²ýÅåà wöý÷ ºýBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�wù8Áe2 ‡w Xá÷ ‡÷ ‡w HáÁeB$&w ÁeBÉ ð 8÷ ‡$&w öàð*ðµ<S1 ¦à Ö KÊ ñU€ò ñU@ò æ÷ 8ƒ‚f&œ" ÷ †€�†‚×'&�ÿ)×'&ëÿð&* ðÊ*Ä%0þðÌ*±‡NDÅ Å ý¦æ÷ Vƒ‚÷ ñEÿû±U‡÷ Ї÷ î‡÷ ´‡w ,à÷ (‡w¼‡w à÷ ú‡w²w à÷ ó‡wªw àBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=w,Å(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡Ä Ä Ä ðµf÷ €ð >€5>õE€u ÷ Ø�‡ñ ± ‡æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡ð*ðµ;ðµ7ðµ#3w .Þ *’$Ê ':æƒô �ô�…T•à ýƒñU@…Ê% D•ÄDÓÄ%][Ä%><w¸÷  †wññ1 ‡Ã ÄÄ%ñ,ñ,ñññ:4Š× ±‡w tÝð*DÅ Å ýæ¦Y…‚T¦fÃ(ÃeŠæ„ðµ<Ó•_‚ S•Ä ýó¥:ÿÿÓ•:‚ ƒ…¦æ& œ"& ΕæÏÿˆ‚4†×'&�ÿ ð&*×'&ëÿð¤ÿ*±*ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ ¤ ‡à ññ÷ –üð•Éÿ*‚ƒ‡w „Üð*æ ƒ ‚æ¦×¢"wf)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷ ‡eÄ%w ñU\ñ5@ƒ âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ "ñ5@\ñU@ñ5€áÄ„íÄ ñ5LñUþ¥*ñUÄ Å‚öƒàÎàà Ê¥*Ã%C!.D`÷ à*‡ƒ‚wòþÆeCÃ5€ñU00Øø>’:l1DATADATADATADATADATADATADATA‚Ã5 ±±± Ã5€± Ã5@±‡Æeð•Êÿ*±‡ðµ=õñU„Ä EÅe& ÷ RÄEÅe÷ Ö ¼Ó¥"Ý öŽwVþö Ë¥"  ƒ Ë¥"ö Õ”Ä Â Ä î ƒ  ê¶ Õ• Ä ü‡ð‹*±‡ð*‡0Š+æ1ÿˆÅ(Åe à ÷ @ß%ÿÿ&ïp’*wÀÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ œÿ8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡Â(Âe(¦Ê ññ1 ÷ `£(£(£££‚÷ X†� ‚÷ >âââââ‚:ƒô �ô�‚””à ý¡Á5Á ±‡ÂeCÃe¡‡æ¦ƒ‚ÃåJ„”Ä¥[Ä¥<C…Å`¥ ¡>C÷ ˆÒ¥,÷ ~… 4ÃB‚ƒ‚× *‚㨂 DÄe $ $ $ ÷ >‡ñz ñññ÷ Dù‡DEÅe     ýð•Ìÿ*1 ±‚ƒ‡ Ë•0‹¤þ‹¨‡—¢3‚¥÷ "÷ Ä ‹¨ ¥Ë”Ó”¦æ£˜Ä ýƒ‚‡‹¢‡Ê¥7‡¥‡æ5æ±ÿˆ‡ß%& Ëw þ×&Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë å¥.‹ Ä ÅæU¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë ‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±û&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡TaÞ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡±‡÷ &÷ &÷ �’•’•€‡@Á(÷ üàf€  Àe ÀeÉÿÀe Àe ‡ø45=5\5t5”5¼5Ñ5õ56B6`6{6£6Ñ6ï67L77¯7Ï7ü7&8[8“8´8Ó8û89A9e9‚9Ÿ9È9é9 :6:Y:�:«:Ö:ó:;I;w;§;Ì;ì;<:=j=¡= -- *DIAG*- -- *FATAL*-  DÐÁCÐ!n‚×  ƒÀüˆ  Á`ÁêÅôÍõµƒ ¦Áº~÷ FÀæ÷ tþ‚ÀÎ3× ‡ÀÚ3Áé”þá‹æè4!7ƒÎð4Þ Ä ð2”þÀŒÁæ‡Æå €&æ?ÿˆ,-fW >5‡W E5ƒW ¾s‡W Ås ƒW !€ ‡W 8€ƒW >€‡W E€‚�W ¡Œ ‡W ¸ŒøƒW ¾Œ‡W ÅŒòƒÖ $|³Æe ‡ÿ TÞʤ<ÿ LÞÖ¼=Illegal Get Command Line error code%2NCommand syntax error%2N%VA%2NRequired input file missing%2NIllegal switch%2N%VA%2NNo dynamic storage available%2NIllegal error-severity code %P %P %P%2NCommand I/O error%2NIndirect file open failure%2N%VA%2NIndirect command syntax error%2N%VA%2NIndirect file depth exceeded%2N%VA%2NI/O error on input file %X%2NOpen failure on file %X%2NSearch stack overflow on segment %2R%2NPass control stack overflow at segment %2R%2NFile %X has illegal format%2NModule %2R ambiguously defines P-section %2R%2NModule %2R multiply defines P-section %2R%2NModule %2R multiply defines xfr addr in seg %2R%2NModule %2R illegally defines xfr addr %2R %P%2NP-section %2R has overflowed%2NModule %2R ambiguously defines symbol %2R%2NModule %2R multiply defines symbol %2R%2NInsufficient APRs available to map read-only root%2NSegment %2R has address overflow: allocation deleted%2NAllocation failure on file %X%2NI/O error on output file %X%2NLoad addr out of range in module %2R%2NTruncation error in module %2R%2N%D undefined symbols segment %2R%2NInvalid keyword identifier%2N%VA%2NOption syntax error%2N%VA%2NToo many parameters%2N%VA%2NIllegal multiple parameter sets%2N%VA%2NInsufficient parameters%2N%VA%2NTask has illegal memory limits%2NOverlay directive has no operands%2N%VA%2NIllegal overlay directive%2N%VA%2NOverlay directive syntax error%2N%VA%2NRoot segment is multiply defined%2N%VA%2NLabel or name is multiply defined%2N%VA%2NNo root segment specified%2NBlank00Ø?D>§3eaek›’ P-section name is illegal%2N%VA%2NIllegal P-section/segment attribute%2N%VA%2NIllegal overlay description operator%2N%VA%2NToo many nested .ROOT/.FCTR directives%2N%VA%2NToo many parentheses levels%2N%VA%2NUnbalanced parentheses%2N%VA%2NIllegal logical unit number%2N%VA%2NIllegal number of logical units%2N%VA%2NIllegal default priority specified%2N%VA%2NIllegal ODT or task vector size%2NIllegal filename%2N%VA%2N‡Illegal device/volume%2N%VA%2NLookup failure on file %X%2NIllegal directory%2N%VA%2NIncompatable reference to library P-section %2R%2NIllegal reference to library P-section %2R%2NResident library memory allocation conflict%2N%VA%2NLookup failure resident library file - %X%2NIllegal partition/common block specified%2N%VA%2NNo memory available for library %2R%2NPIC libraries may not reference other libraries%N%VAIllegal APR reservation%N%VAI/O error library image file%N%VARequired partition not specified%2NInvalid APR reservation%N%VAComplex relocation error-divide by zero module %2R%2NWork file I/O error%2NLookup failure on system library file%2NUnable to open work file%2NNo virtual memory storage available%2NModule %2R not in library%2NIncorrect library module specification%N%VA%2NLibrary file %X has incorrect format%2NResident library has incorrect address alignment%2N%VA%2NPartition %2R has illegal memory limits%2NInvalid partition/common block specified%2N%VA%2NTask build aborted via request%2N%VA%2NDisk image core allocation too large%2N%VA%2NInvalid window block specification%2N%VA%2NTask requires too many window blocks%2NTask has illegal physical memory limits%N%P %P %P%2NLibrary references overlaid library%2N%VA%2NTask image file %X is non-contiguous%2NVirtual section has illegal address limits%2N%VA%2NFile %X attempted to store data in virtual section%2NResident library mapped array allocation too large%2N%VA%2NInvalid reference to mapped array by module%2R%2NEnd of file reached before .END in %X%2NSymbol %2R not found for patch %2NSegment %2R not found for patch %2NSupervisor mode completion routine is undefined %2NLibrary not built as a supervisor mode library%N%VA%2NSupervisor-mode library reference error%N%VA%2NIllegal system size specified %2NConflicting base addresses in cluster library %2NLibrary %2R not found in any cluster%2NIllegal cluster configuration %2NCluster library element %2R does not have null root%2NModule %2R contains incompatible autoload vectors%2NCluster library element %2R is not resident overlaid%2NSegment not found to address round%2N%VA%2NLibrary build not requested - ignoring option%2N%VA%2NIncompatible OTS module%2N‡À´ºÀe"÷´º´ºÂFIRJ÷ ¿‡w º Þ Áð»+÷¼»ÆÿÀÂÿ$7¼ÿ!÷ ü» ÷-tºÄ»w ¾»"ì&f÷ ªÄÀe"ÁDI÷ ƾ†–%ßwJº·Dº�Þ Ø±‡À²ºÀe"÷²º²ºÂFIRJ÷ ¿‡wžº Þ Áî»EæCÀfÁ@Iæ Þ ‡ÀeÐ-®ÿÐ-ªÿò– ƒÀŠ»$È '÷ Ô» ÷-Lºœ»7"–»,ïÁ’»a(Q$É éH"û7`ÿ&w ºwºA÷ bÄ¡�Þ ÀDÿÖ ±‡00Ú�?’:l1DATADATADATADATADATADATADATA|³‰Š–,¿;¿;`ï W 2" Ñ@TITISYSYTICLOV‚<Á¨Àø" B ^舀¨À<Á¨À‰Š&æÿˆæ3ÿˆ&æ¦f&¦ v Þ €�‚ƒ„…‡„¸>šH(® H„Ì Jê j'ÿŠª VFY>ÑÌP{L}‰Š‚À;ÿÿVFY Version M0529 (ANSI)VFY -- [0,0]File ID %P,%P %X Owner [%O,%O]file ID %P,%P Summary: mult = %D. free = %D. bad = %D. Header map error I/O error reading file header - Error code %D. Bad file header %D. Lost files were found Rescan of volume to find all files with multiple allocation%NIndex indicates Bitmap indicates %N File header does not exist‰Š?TSYUP‚RE‚FR‚ID‚DE0‚LO@‚DV‚LI€‚RC‚¨ HD‚AL‚ºü xQ»zSYü SYt:#»zSY‰Šz& R‚w<w00 p÷ D†÷ d� °÷ $†÷ Z‚ à îÁÂH÷ nÀ”ÄÅ8ý&0ð•÷ †÷ ð•ÀÁ· ðü †÷ ÷5àü÷ ~Á òà í€÷5Êü00ð•÷ ˜‡÷ ~†÷ Èð•÷Eœü„ Å ¾Ö ÷5€Šü ÷5@‚ü ÂbÊ¢üŠ Á�÷ twÿÀ4Ãë÷ &ÀÔÃÿ÷ Á  ÷ N÷5€Bü-÷ hü*÷U€4üÁ® ÷µ)ö� ÷ &7 "üÀÔÁÂH÷ VÀ4ð•ÁÂJ÷ @Ãü ü�Á`wŽþw†þ‰Ÿ%‰¶%÷ ¢õÀ”÷ �ÅÌûpÅmØûp!+‚÷ 0‡÷5€¬û*÷5¤ûw6w,Œöw,†ö÷-øö–ö ÷-òö00Ú˜?D>§3eaek›’�ö÷5@xûw*÷5@lûwîwÁ  ÷ R÷ t÷ &‡ÁæÎEðÿÁ Î ýÖ æ‚  Î üÖ ‡0 6ðìúðèú ðàúðÜúðe p 0 ‡°ððmûp ‡ð 8÷5Þú÷EÖúÁ ÷ º†‰]%÷<óöúw\ý‡p°p°p‡ðm¶ú÷ Ž ‡÷U�úñ-Œú÷ ,‡‡ÁNwHñtúÁ~ ÷ \÷5\ú÷ ±‡Äÿ BƒdÄ ýƒ" ñ w,Jú‚¡‡±‡Âbœ* ÷ ±‡ÂbÊúòúw÷5ú÷ Àþó÷ úÀtp÷ Ά÷ þ‡w ’ÀtðµÁ ÷ ´†‰t%÷6òðùwVü÷U®ù÷5¦ù÷ @#Æå€÷5’ùÁÐŒùЊùĤô÷ � Š�ŠÁâ÷ bÿÆe÷UTù‡ ÝÁ aÃPà ý‡7 8ù7 Zù7 Rù7 Pù‡Àt÷ 8þÀ@ùÀ]>ùÀ]<ùÀbÐ,ùÐ*ùÐ(ùÁ÷ þþ÷ ù÷5ìø÷ ¦‡ Üþÿ `… ¦D ¬ýÿ‚‡ÑŠÄBC„ …% †· ØøÁ<Âb÷ žþ±‡×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ ”>*ÿ Œ>âÿ „Jÿ |V€ÿ tV(ÿ lbdÿ dbÌÿ \bÿ Tb¦ÿ LbJÿ Dbhÿ <nêÿ 4njÿ ,†B#ÿ $†*ÿ ’Ô4ÿ ¶¦'ÿ ¶à,¦Þ5Îe‡w ”Á,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡w¼ù èèçÿÿÿÿŽÊ5¦ „Ê €‚Ê5ùà ÷ƒõ…2Å Å ÍUEÍ ø�‚‡2â  F’0‡ÊEò ÊU ‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡w  ÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w \  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡&æf…Þ ƒ„…‡&æ¦ff… Þ �‚ƒ„…‡w àÿ÷ 8ðµ!÷ އ& &æ÷ µÄ÷ $Æe‡ð‹*±‡ð*‡0Š+æ1ÿˆÅ(Åe à ÷ �ß%ÿÿ&ïp’*wÀÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ œÿ¡ðµ)"ðÕ(.÷ ’ðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ "÷ rðÅ(.‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡8Áe2 ‡÷ ìÿðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ ^&‡f¦æ÷ (÷ †ƒ‚„÷ „‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ &0ž8*w,þ±ðµ=p!†Õ•^ú‡141612Áepðµl2l0p‡,*ÿÿ±‡æ1ÿˆ‡46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ `ýwPýÄÄ÷ >þU•Õ8UMwJýÅåà wÞý0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w �ü Á�   ìì� .Â% ÷ °ý ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷  ü ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡‡ Ä>z �Ä@2J�Ä42V�Äø2b�ÄÈ2n�Äœ 2>`!†2�`!l’zª(�Ì4ô†ž,�Ì4膒0�`!èz¶5�`!˜z†[1,3]The following files were not in any directoryFailed to open directory fileFailed to close directory fileI/O error reading directory file They have been entered in directory %VA They are still lost, could not find directory %VA Failed to enter file - Error code %D. File successfully entered as %X Error code %D. - Directory [%I] As a result, no files will be entered in %VAThe following directory entries were invalid[%I] File ID %P,%P,%P %X - %IFile not foundInvalid version numberReserved field was non-zero %D. Invalid directory entries were found %3A,%3A%VA‰%‰&7%À4ð•0Šðð•ðð•#÷  ‡÷ rá‡ÁÁm>í ÷ r܇÷@è÷ÚçÀ”÷ l†÷ ñøEÁíÀ”÷ R†÷ ñÀ4ðè÷ †÷ òðÁ íÁÂH÷ ò÷ÐìÀÔð•Á”p\\p^^pVBpXDpZF÷ÿÿ´ì÷NÀÂü÷NÀ¾ü7 ¼ü÷ Z÷5lì÷ €÷5@`ìwþî$òòÔÁ ÷ r†1 0 $p&÷ÿÿVìÀ4ÁÂJ÷ fñwøîÀÔ÷ Fp‡ð%hð¥dÀÔ÷ `[‡ú÷5èë÷ ú÷ ôëñ‚ à ÷ ˆðÀ4÷ Ðð÷ 2†÷ àïw0„é00Ú ?’:l1DATADATADATADATADATADATADATAß÷ ¼ðw@zé÷ ê†÷ ÎïÀÔñ-&î Ð&ÄÊ&&&ÄeH&&&÷ ¾)‡TTTÄÄTTT÷ NÿÄeB”””ÄÄ”””�÷ € ‡p÷ ’¢†ð¥öÿ* ÷ t‡‡ÁÆeÁ%ÁD& ÷ ñ€Âbœ*Ò÷ ´ÂbÁ ÷ üð÷5@ðêÁ*ÂbÊòÔ÷ Þð÷UÖê€÷ ‡÷5Äê Â(‚‚ÂåÂåÿ°ð•!#÷ ‡ÄÄå Ýà Ä`ô‹‡· °êÁÙ ÷ €ð÷5xêÂbÊòÔÁe÷ åÁŽ÷ Xð÷ pð÷5Lê,÷ êä)ÀÄ`å ÷ ÚðÀÔÁ÷ €†ð¥Çÿ*1 öœ*ÂbÊÁÁ÷ öïÁèÂ÷ èï÷ Âð‡&ñ %÷ îé‚ñ "À”ððmÞé÷ (†÷ Öí-  - ÝÁ D`ô‹#ţŲÅÉ· ²éÁX ÷ ~ïÂb÷ "€ÁÁ ýJÂbÁ…÷ XÄÄÀʦ÷ ¸÷ ²÷ ¬‚È• ÀÊW¢0‡W¤9úƒÁ Dà! ÷ PùÒ Òe ÒÑ¥ ýÁ àR‡ÂbÊ éŠ Áå&÷ Øî€‡ÿ âò†ˆ!ÿ Úò†B#ÿ Òò†¦'ÿ Êò†¨)ÿ Âò†Ò)ÿ ºò†:*ÿ ²ò†R+ÿ ªò’Ô4ÿ ¢ò’@7ÿ šò¶`!Failed to find INDEXF.SYS;1 in MFD - Will open index by file ID 1,1Failed to find BITMAP.SYS;1 in MFD - Will open bitmap by file ID 2,2%NConsistency check of index and bitmap on %2A%O: Listing of index on %2A%O: Read check of files on %2A%O: - Blocking factor %D. Storage control block (VBN 1 of BITMAP.SYS) is corruptedContinuing with an approximation of the size of the volumeOnly the "blocks free" value is validThe "blocks used" value is valid in the line beginning "index indicates"The "blocks free" value is valid in the line beginning "bitmap indicates"÷ P3‡÷5ÀtíwÞ7 èÀÔðJð® &ð•÷ T‡÷5Híð•#÷ ªð•#÷ ž†ð¥ðÿ*ð D‰%÷”åNíw´ïðBðDÁ ÷ óÇ÷ Ìñð•ÁÂJ÷ ,ò÷ <†÷ öðÞìà ÷æì À÷ €÷7ÎìwÌì CÝC÷ Äì Åe ÷ ¸ìÃ¥~‡Ã à Å`ÅeBC€ Á ‚Áå€ € Á ƒ·~ì÷|ìÁÔ ÷ bòÁ  ÷ XòÁH÷5HìÁn ÷ BòÁ¸ ÷ 8òÀÔ÷Fì÷:ìð•÷5ìœîÁÂH÷ NñÀ4ð•0Šðð•ðHðÁv$&÷ k‡7,\tæ7,^næ÷Uºëð•#÷ ‡÷ ôW‡Á¼ëÁ Ám¸ëÁ  ÷ èJ‡÷ ¾M‡÷5@„ë îÂbÊðòâæÁM÷5€fëÁM÷ bñ:Á�÷5€Pë%ÀnåÀe0ÁrëàÁEÿ'f¦À(÷ rö ‡‚�7XëwVëÁ� ÀPë ƒ@7Dë2Áž÷ ñwØí‰&7%‰%w�í‰1&÷úê°å÷ôêJåÄèêÅæêæ„  Î üÖ f÷ÿÿ‚è÷ VÁÈê ÁEðÿ±B Á ü·fèÅŽ ÷ 2ŃÅàÅEÿ7 Hè÷ ÁÂJ÷ ¼ïÊêÁˆêBÂ`w íÀ4÷  †÷ xî÷5Nê ÀÔ÷ І÷ bîÀ4Åå„ fQè‡÷âçXç÷ÞçTç÷ Îæ ÷5Üæ÷SY>ç7 <çÀtð•#÷ ` ‡ðµø• Á÷ ð‰Ü%÷Râ 걇7 åÀ”ðJ÷5¡ºéÂ(‚‚Âå÷5¤éÂåÂåÿ°÷ –#‡÷5Šéð•"#÷ äð•!#÷ ؆ð¥ðÿ*ð D ðBðDÁÄ ÷ RïÀ‰ø%÷¾áx鱇ð•ð÷ îð÷ ~†÷ 8í·&é‚·*éÂe·é7 é‡ÁeB$&÷ ‡ðµ! Áe     ‰ô$‡ÿ Þò†ˆ!ÿ Öò†R"ÿ Îò†B#ÿ Æò†¨)ÿ ¾ò†:*ÿ ¶ò’Ô4ÿ ®ò’@7ÿ ¦òž87 Failed to open file for read check - Error code %D. Error starting at VBN %O,%P, LBN %O,%P - Error code %D. Error at VBN %O,%P, LBN %O,%P - Error code %D. File ID %P,%P %X ÷ ÎèÀ4ÁvÂê ƒÜà ƒ`Ë‹l—,—,d±±ñ2êñ.êÃJðð•!#ð•÷ ÆC‡÷ vóÓ$ððÂeÅRÅ ýË# # # ãªîŪîð p!ƒ&÷ T†ÁùÅ%Á3÷ ~Å%fÅ÷ 0†Á2÷ d÷ NÎ õÖ Ö÷ BÕÁÄ÷ êóÀ4÷ wàôDÄÄ 3ÁÂ÷  †ð%é*æ1ÿˆñ±‡pá° sas ‡&æffÁbÂÃ‘Ñ  œ*‘ÉÀÈè ÜÅ `Åe @÷ ¨ô‡ñ þÿ !† á± þÿôÉ CbB a(á¡Âb�÷ \󅃀‡ÀŠíÄxè&÷5HíÎFí�÷ æóÀ:çÁk÷ TÁeô ñå‰  ÷ BЕ.Е/Áe ÷ .Е.Áíúæwüòÿ ÷†¦'ÿ úö†*ÿ òö’@7ÿ êö¶à,ÿ âö¶,00Ú¨?D>§3eaek›’ Ü Multiple allocation %O,%P Bad block number %O,%P Block is marked free %O,%P File is marked for delete I/O error writing file header - Error code %D.. blocks free, . blocks used out of %N%2A%O: has Delete this header [Y/N/Q/G]? ñµ€ Á/ ÷ žô÷5 žîÀ”ðšîñÅ€ ÷ *ð†î÷ ÚóÁžé @ÜÀ @`Àe ÷ ~õ†w4õ÷ ÃeB Ä ùów ú&·Pî÷Nî· Lî÷ H VîÁû÷ ô=÷ ÔòÀ4÷ ó÷ †÷ ,òw0Ðë· (î÷ Z w@Àë÷ úò÷ Ô†÷ òÀÔ÷ èò÷ Ò†÷ øñw0œë÷5Îí· îí÷ \÷5¾í w@~ë÷ ¸ò÷ ’†÷ Îñ€‡÷ rç· ÊíŶíÅŠCaB ÷ ’ò÷ |†÷ ¢ñw@Fë÷ €ò÷ Z†÷ –ñÁà÷ Ró‡÷ 4çÁ÷ Dó‡÷ &çÄÿ ƒdÄ ýÊðmZíp ÷ ‡÷ ‡÷ þø‡‡ÁJwôò÷ êæÀ”3 ÷E í„ð E÷ Þ ‡÷ Êø‡ ± Å ýt@þÿ‡ÁJw²ò÷5 ÚìM÷5@ÒìFÅÄõõ® õõ$fÿˆ8‡õõb õfÿˆ,‡÷ êü)Ä�hìÄ¥Y!Ä¥yÄ¥NÄ¥nÄ¥QÄ¥q÷U bìÄ¥GÄ¥g÷U@N쉲&º÷U>ì‡æ÷ œ÷50ìÂmÞæA ƒ ÷ "‡÷ €ÃbÄ Óe\^à÷ wžî¦fÁÀöå÷ ä� ÷ äÁz ÷ ÒÁæëÂäë‚í� �åŽf� ÷ ¾–%ÁŠ ÷ ªÁ” ÷ ¨Ð•.Áí¤å÷ ¦ñ‡&ÁÂJ÷ Òðð¢ëÄ�ëÅŽëÃ’ë  €÷ `A Åå„ à ö€‡÷ H†÷ nïw ÷ Ä ÅÄÃJÂÁ¡ †€ Å  øÄ ó‡ÿ 2õ†B#ÿ *õ†Ò)ÿ "õ’Ô4ÿ õ¶à,ÿ õ¶,Get Command Line - I/O ErrorGet Command Line - Bad @ File NameGet Command Line - Max @ File Depth ExceededGet Command Line - Failed to Open @ File‰1&À\ï€ÀwÚè·6ï÷ ¢æ<ææÿˆ7Š»ìæ¸& & æAÿˆÀ&æ¸æ?ÿˆÀm.ìÀí ï€ÀÿÀE @χ7öî÷ôîôî7òî÷•7ê÷Õƒê÷ÕØè÷Õ2é÷ÕŒé÷տ鯶îÀÔ÷ Ɔ‰C&‰C&À”0 0 0 0 0 ÷ œ†‰[&‰[&À4÷ ††‰v&‰v&Àt÷ Nó÷ l†‰•&‰•&ÁVîÀ(ÂJî÷ ù7 Dî7 î7 î7 .î7 6î÷ †wÎþÀüðÆéð¾é÷ :7²é†÷ NÁ>÷ >n‡ÂTCD±•à ýCD±•à ýCD ± •à ýÁ„÷ ôI‡Á(÷ âD‡÷>†ç÷(àç÷(šè÷„4è÷ ê÷>Èç÷>‚è7 ^ç÷ Rê7 èÁ°çññÝñ5 ÷5 퉾÷5í÷5 í ÷U@í÷5@üì÷5¿ûôì~ï‰Î%‰‹%Ážæ÷ \Àf÷ \Àô0 b÷ |‡ð fî‡÷ Àô‡÷ @å÷ :÷ Þ±‡w Tøð¥öÿ`ð¥üÿ` ð¥ýÿ` ð¥þÿ` ‰Ä±‡‰,‰"à‰(.÷%�ì÷ˆì¡‡w þ÷5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ œ*AdBbAÁepÂ& ¦fƒÂÁ ÷ ô– –‡ÁPõµ aA”Aíf@pnp÷ ÒC*8Ö‹Á ÷ ´88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ õÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw "öõ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ z5fµ fˇðµ ÇÈ•÷ f‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ ÂDlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ p½•8 †õ¥öÿ*ÎþÎÒ‡w äôõ 8µŠjDl@÷ jT”ÔÀeBTŸ8œ5l@÷ *‡@Á(ñ D÷ pÁeB&÷ ò‡÷ ‡& ææ©ÿˆ@ð•#÷ & æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡ÿ òñ†ˆ!ÿ êñ†‚&ÿ âñ†'ÿ Úñ†¦'ÿ Òñ†*ÿ ÊñžÔ4ÿ Âñž87ÿ ºñªî!ÿ ²ñªš$ÿ ªñªl!ÿ ¢ñªf!ÿ šñ¶*ÿ ’ñ¶¦+ÿ Šñ¶`!w "óÁ(DB‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±DÂ(Âe(¦„Äe$2ƒÃeäÿæÓÏÓ Ó(‹ÿˆ‡Ì%[]Ì%<> ƒ ÷ T„팂1 >‡w Žò÷ æòðµðÅ)÷ èþ†ð¥öÿ*÷ âþw´ò46l0ì‡f&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡00Ú°?’:l1DATADATADATADATADATADATADATAÿ 6ð’†;ÁeBÉ ð 8÷ ’‡$&w ®ñð*ðµ<S1 ¦à Ö KÊ ñU€ò ñU@ò æ÷  ƒ‚f&œ" ÷ V €�†‚×'&�ÿ)×'&ëÿð&* ðÊ*Ä%0þðÌ*±‡NDÅ Å ý¦æ÷ ⃂÷ ñEÿû±U‡÷ ‡÷ ¾ ‡÷ ” ‡w äðð*DÅ Å ýæ¦Y…‚T¦fÃ(ÃeŠæ„ðµ<Ó•_‚ S•Ä ýó¥:ÿÿÓ•:‚ ƒ…¦æ& œ"& ΕæÏÿˆ‚4†×'&�ÿ ð&*×'&ëÿð¤ÿ*±*ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ x ‡à ññ÷ Úð•Éÿ*‚ƒ‡w ôï÷ þn‡832cðµd& & & B öŠð 2OðµðµΕ ¶“ðµ à N”à Υ$¶“Ε Åð 2ƒ2Åà‚Î¥ Ž�Î �æ÷ 4 ƒvÂ Š‚ ƒ“Ε f÷ ¸ðƒ�ׯe÷ ð¥óÿ*÷ zïÆeð•Øÿ*w^ïðÅ@)ðµ÷ °†ð¥öÿ*ï0,÷ ` ÷ ðæ‡ðµ ÷ ¸‡ðÅ)÷ ïðÕ)ðµ( ð¥ Ó ðµ=Ó ð¥Ó lð 0ºl‡ð  ƒ÷  ð†ð¥øÿÿ÷ 4ª‡ð¥/ð ðð¥Ãe&ðµ=ÅBaÀ@aÁ ÷ íÁe0b�Å ÷ÂeÒ€ð¥Áe@Ã÷ Ø`‡÷ ÊY‡ðµ=‚ ÂE°8óÅ Ãe…l0Å Åà & ì0‡„ l0ù…Å`pÄ Älöÿ06ðôÿ4p 4÷ ®ðep ðÕ)ì‚wVþðµð¥Ã%÷ xï† ,÷ jï÷ ÷ N‡÷ w"þ÷ ¤î‡÷ J†÷  ‡B æƒàƒ#ƒÎà÷ ÞÎ f÷ Ìÿ� ‡Â`‡ð¥öÿ*÷ @íw0í±ðµ)0406 l0ì° ‡ðµ=D…÷ 6ï ‡ð`p4°6÷ |‡æf¦÷ Hí°6°4/‡ðµ=Á  ÷ ÜðÕ@)ð 0 Ö 8w’î÷ �ƒ46÷ ˜ï‡8ñÕ ÷ & °eð‹*wÖ ±‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡w �ëð*æ8Iðµ÷ 2ìœ*=‡ðµ€)98÷ ªì ÕeBÕ && ð Îå¶ �ÕU€�Ä÷ œë‰�†ð¥öÿ*ð¥åÿ*Æe ð*Nlv °°΋œ*ðµ.2÷ 4ì „& ðµ#ðµ!ðµ)&ÎePæÂ(ÂeÊ ¦æ&æ•&Äð >€Åe >ÍE€÷ øê†�•p�*÷  wÈêÄ Ä Ä ðµf÷ ¦ëð >€5>õE€u ÷ ®ê�‡ñ ± ‡w ,êBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=wêÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡w Žéð*ÁeBð 8÷ Lÿ‡ðµ÷ 0‡w dé÷ ¼éðµ÷ ÷ 4ýwœé÷ ‡÷ Šü‡÷ ü‡,, ð ñ‚ð•öÿ*±îw éð*D÷ Zê Õ ýwnéw üèð*f¦÷ ÷f‡÷ xþ‡ðµ! �‚f–P÷ `ìðÅ€)°B‚�‡ðµMðµ=ðÕf�Â(& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ðµ=&Îe0æ ÷ ®éU• Â…à  ÂE•Õð >€ >ÍE€ðµ=ufÄ÷ Žèp†�ñ ± wXè÷ ’ý ‡f÷ Â�†&œ*÷ xý°•*±‡w äç÷ ´ý‡wbý‡w Ôç÷ ¤ýú‡wXýw Æç÷ –ýó‡wPýæ5æ±ÿˆ‡ß%& Ëw šç&Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë å¥.‹ Ä ÅæU¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë ‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±û÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡w ªæðµ Á¥ðÅ)÷ îæ‡÷ Øç ÕfU�Ä÷ èæ…‡ðµÕ%  BA °`6p 4p`4¡ ¡õ%þÿð60 4‡÷ ‚çMÄwšæƒ  �D„PÄ5Rà ý†R”‡R”R”à üøæÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡ð*ðµ;ðµ7ðµ#3w å *’$Ê ':æƒô �ô�…T•à ýƒñU@…Ê% D•ÄDÓÄ%][Ä%><w�÷  †wôññ1 ‡Ã ÄÄ%ñ,ñ,ñññ:4Š× ±‡w \äð*æ ƒ ‚æ¦×¢"wf)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷ <ü‡eÄ%w ñU\ñ5@ƒ âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ "ñ5@\ñU@ñ5€áÄ„íÄ ñ5LñUþ¥*ñUÄ Å‚öƒàÎàà Ê¥*Ã%C!.D`÷ *‡ƒ‚wòþÆeCÃ5€ñU‚Ã5 ±±± Ã5€± Ã5@±‡Æeð•Êÿ*±‡ðµ=õñU„Ä EÅe& ÷ RÄEÅe÷ Ö ¼Ó¥"Ý öŽwVþö Ë¥"  ƒ Ë¥"ö Õ”Ä Â Ä î ƒ  ê¶ Õ• Ä ü‡÷ ¤â&f÷ …„‡D„ ÄEõµ/fCÃåŽ A ÷ áƒB f& ÷ þàB‚eA @0÷ áÁ („‚@00Ú¸?D>§3eaek›’0÷ úàa@ÂeA ‡ B0÷ âà€ABÂå� ÷ Ìà¦f ÷ ¢àC�‚áÖ @ð•Òÿ*±‡ðµ)÷ ìâ‡÷ h‡÷ P‡ðµ82Áe&À(÷ ’à€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡ðµðe6p 4÷ ú†8÷ <㱇÷ zã†81416÷ Bâ÷ ÚãñÅ ÷ ‡‡÷ :ãê†÷ ¨ã‡Â(Âe(¦Ê ññ1 ÷ `£(£(£££‚÷ X†� ‚÷ >âââââ‚:ƒô �ô�‚””à ý¡Á5Á ±‡ÂeCÃe¡‡æ¦ƒ‚ÃåJ„”Ä¥[Ä¥<C…Å`¥ ¡>C÷ ˆÒ¥,÷ ~… 4ÃB‚ƒ‚× *‚㨂 DÄe $ $ $ ÷ œ‡ñz ñññ÷ Bõ‡DEÅe     ýð•Ìÿ*1 ±‚ƒ‡ Ë•0‹¤þ‹¨‡—¢3‚¥÷ "÷ Ä ‹¨ ¥Ë”Ó”¦æ£˜Ä ýƒ‚‡‹¢‡Ê¥7‡¥‡&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡TaÞ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡±‡÷ 2ßBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�w¾Þÿ ÊÜn w bÞ÷ ª‡ðµ)ðµ÷ ,ý8C÷ 8ð¥öÿ* ðÕ)ð ð*wjÞð•öÿ*úðµ÷ Æôó‡÷ æ÷ à÷ âöë‡ðep p ‡÷ „Þ‡ð¥#ðµ=Ä E”W¡9ƒÅ¥^éð•³ÿ*ÆÅå0ùà Å`à à CaÄ ëÃåCƒ Ôà ðµ=ðµ÷ L ð¥ð 0Àð•Øÿ*�ð¥ ðµ= ÄEÕ¥^Ä ûA¨ð¥ æÂe@ÃÎà÷ Òƒ߇÷ ðµ=� ÁEpÓðµ2ðµ!)8ÂeEÅ`l0Å …à ì0‡„ û0¡/ &l0Ä ü„…`pÄ „löÿ06°ôÿ4p 4÷ ²õðp°æÄ ƒðÎà÷ ,ƒ ƒ÷ Já÷ ù†ð•Øÿ*Á`‡æ÷ Îúƒ‡æCàƒ#ƒÎà÷ öÎ ¦÷ Ôÿ‚ð†– ‡DàÄ ‡ðµ@) ð 6ðÿ?0ðÅD)‡w öÛÁ(ñ D÷ xýð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwnÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)÷ |é ‡÷ Lñ \ðµ#÷ ÊðU†&œ* ðµ=ð¥æ•Øÿwô Å`p!2üƒÅàÅ… ÅEW!Åp0p2÷ ,òׇðµ#(ð PðÕ)÷ Rð†ðµ@#ð¥Çÿ*ð*fff÷ œò±±‰‡÷ ð†&œ*wjðµ.÷ nB‡ð5ð(8ðe$8w2€æ•ÖÿA&À(Áe÷ ÖÙ€†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA#ðÕ@))÷ öø †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ êÛ00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ Hí‡0 @0 ð‡&œ*0 @÷ ’ÚuÄ÷ ¨Ùðµ# ÁeB&B÷ ²î°B÷ âò÷ ®÷°•*±‡÷ XÚ ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ ÒØ0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6wLØð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡ð 8ðµ ðµðµ ÷ îׇðÖ*±‡ðÃ*±‡ÿ ÊÜn w bÞ÷ ¨‡ðµ)ðµ÷ ,ý8C÷ $ð¥öÿ* ðÕ)ð ð*wjÞð•öÿ*ú÷ ì÷ ööõ‡ðep p ‡÷ „è‡ð¥#ðµ=Ä E”W¡9ƒÅ¥^éð•³ÿ*ÐÅå0ùà Å`à à CaÄ ëÃåCƒ Ôà ðµ=ðµ÷ X ð¥ð 0Àð•Øÿ*§ð¥ ðµ= ÄEÕ¥^Ä ûA¨ð¥ æÂe@ÃÎà÷ Þƒ߇÷ ðµ=� ÁEpÓðµ2ðµ!)8ÂeEÅ`l0Å …à ì0‡„ û0¡/ &l0Ä ü„…`pÄ „löÿ06°ôÿ4p 4÷ Æõðp°æÄ ƒðÎà÷ 8ƒ ƒ÷ Vá÷ ù†ð•Øÿ*Á`‡ðµ)wÐæ÷ >ûƒ‡æCàƒ#ƒÎà÷ öÎ ¦÷ Èÿ‚ð†– ‡DàÄ ‡ðµ@) ð 6ðÿ?0ðÅD)‡w þÛÁ(ñ D÷ €ýð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwtÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)ÁeB÷ $ñ ‡÷ Lñ \ðµ#÷ ÌðU†&œ* ðµ=ð¥æ•Øÿwô Å`p!2üƒÅàÅ… ÅEW!Åp0p2÷ .òׇðµ#(ð PðÕ)÷ Tð†ðµ@#ð¥Çÿ*ð*fff÷ žò±±‰‡÷ ð†&œ*wjðµ.÷ nB‡ð5ð(8ðe00ÚÀ?’:l1DATADATADATADATADATADATADATA$8w2€æ•ÖÿA&À(Áe÷ ØÙ€†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA#ðÕ@))÷ øø †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ ìÛ00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ Jí‡0 @0 ð‡&œ*0 @÷ ”ÚuÄ÷ ªÙðµ# ÁeB&B÷ ´î°B÷ äò÷ °÷°•*±‡÷ ZÚ ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ ÔØ0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6wNØð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡ð 8 ðµðµ÷ ø×‡ðÖ*±‡ðÃ*±‡ææ·•ˆâ&7 æÿ7 äÿ7 âÿÀüðN f ¦ÂŽ÷ þ‚�%‡1œ ð ñÕ 11 1 1 11ñ†ÿñ‚ÿñ~ÿ¡€‡f¦æ&f ÅÂ…`Á Á ý°* �… !†ƒ”×  ×  Ä õ× ñƒ× ÿî× "D × a‡× z‚Ä ÃE Ñ�ÝEp(p°à„… †ƒ”× $ú× 0‡× 9ôƒ× A‡× Zîƒ× _ë× :� � ‚„… V†ƒ”× [È•]× <È•>È‹8 … |†ƒ”× %ú× *÷× -‡× .ñƒ× 0‡× 9ëƒ× A‡× ZåƒÈ ‚ … |†ƒ”× 0‡× 7÷ƒ× *ô× ,A ïlÈ jÁ hŠ„ … q†ƒ”× "A øÁ ö „ #A … c†ƒ”× $‡× %÷ƒ× *ô× 0‡× 9îƒ× A‡× Zèƒ× _å× .� £ß … †ƒ”× .× ; … f†ƒ”× 0‡× 9‚� õ]× -Á X� í× *Á QA æ × ,Á D× = Á >È5 B>ÈU °(wZþ× /*Á .�Á … .†ƒ”× $× -‡× .ƒ× 0‡× 9ƒ× A‡× Z ƒ× _ × :Áÿÿ   DÚ× " Á … †ƒ”³á°0±…„ƒ‚�‡f¦æ&fæ ÈE¢¢^Á`Å÷ úÄ ÈUQÅÿÿ÷ æÄ ÈUQ ÷ ÔÎË€ÈUIá ÈUà `¢Ãe á ÉáccD ÷   Ä”¡%¡*¡.A ÈU Å ï0 0 ��W ,ÈUw@W /D ÷ DÎÄ cBDaW£-Á�Á N�… W¥N W¥OD!†B�“Á N�{É …CÃE€€C¥ÃC¥D!‚Ñ ó�ñ‹þÿ€D! ΋ñ5 Ñ þÁe߃“ƒ Î�à UÂåÔpRpR„“pBCÃ5D ‘ƒ à KR΋KBAÁE�—­:ŒDœ0CŠÄŠý ÷ fÎÄ ÁeëB”—   ¡ƒŠDÒ� CS•ÄŠÞü ƒÐ÷ Ò ‡W¤†CÅ E Cs ÉΕŠ …„ƒ‚�‡f¦¦)& 6 l(¢*¶„„íƒ †�”Å EÅ 'W "Å =N íÎ ëW :+W =Å 1 Â#W ,W /Å %W %W *ÑöÕ€ÍÄ W <ÈW [ÄW >W ]¾„ v�¢°(°* 6 ƒ…Æe‚�‡÷ ¶Ù¦Âe°ÄeȵÄeà Ã~÷ Úü‡Á DE  ȵÄ2…Åe &Âe ÷ Š€ †ß%�ÿ&'ðÕ@±^ÃeðÅÁ5€ðÕÁ5@ðÕÁ5ðÕÁ58ðÕÅ“B„Äe€Ãe°ÈµÁeÄeÐÿ& q1””BÓ$ðñðñ„Äe q1 ””Bð ñð ñ¡–‡w rêÁ w hêÁ& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡÷ &÷ &÷ �’•’•€‡@Á(÷ žðf€  Àe ÀeÉÿÀe Àe ‡Â Âw pñ ”Å¥ üÅ¥ ùÅå0B¡†€÷ 6ðAa”ôœÿÿ‡·kµz?TLBOÀPÀzLB  ð$00ÚÈ?Þ´@§3eaek›’Illegal deviceOpen failure on bit mapOpen failure on temporary fileFailed to allocate space for temp fileFailed to detach deviceFailed to attach deviceCommand syntax errorI/O error on input fileI/O error on output fileIllegal switchOpen failure on listing fileOpen failure on index fileNo dynamic memory available - Partition too smallClose failure on bit mapClose failure on index fileClose failure on temporary fileClose failure on listing fileIllegal response - try againSY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VAI/O Error Code %D.QI/O Error Code %D.Ü&Ô&ó&ë&' '6'.' ¦6Ž Î5  Î5œ*ð‹+€Äå€Î5ÀUÎ5 …Î5 õ Í BBCU%Í BÕ  Ã0 vÁô÷ $Ö5 €÷%–ß÷Žß÷†ßÒá Åæ!7 ÊùÁ ñµ · ºùÕÕ”"UfUhÕÕ”"¦æ&&ÁÊØ÷ *À”"÷ ÜøÐ• È•-”È• ‚ À" Á÷ Ì †¦‚Áƒ'÷ ,Ö Áå"BÃ"•ÃÎ&Õ€Q÷e8ùÀ5)ÀE$Ì %& ÁeÉ ÷eùUUÕÕÏ&÷ ÌÄ & ÕÎ&"÷eÚø Õe\^$%÷ œð5R÷ Œøÿ †ø ÕÑ&ÄeHÃà ý�ÀP"Ð -Ð- ÷ ¦ÀåP"ÕP" ÕÎ&Àð"Âæ!ÁjøÁ A’'÷ 2& & & & fæð"& & & Î�ÞýæØýææ ÿˆ‡æÊýæ)ÿˆƒ‚‡Ä Ì ‡%÷ öUÂÎ&•‡Âæ! 2À"ÁQ'÷ ÀBÃ"‰¦B Áœ"÷ 8†&Ák'— €Âå€Á~' ¦‚÷ †Ö �å‚÷%TÝ÷L݇w °èÄbø& æLB&æÿˆa‡ñ  ĺ"Ì ÷ ÈW‡111É D÷ °K‡÷ ø÷ ¸Mõ€÷ ¾?‡„Ä ¡ „ „ „ ÷ø÷÷ ’Õð"ÕU% ÷ ” ÷Ü÷÷ vM÷ ‚!‡D ‡…Å ÅEøÿÅ… … Åeð"Ä@P•Ä üÀ Áà Ä ÷& æSY&æÿˆ † ÄŠ÷& æSY&æÿˆ±‡÷ p÷÷ 5 ÷ ‡Åð"æ% Î ýÖ ‡æØ"ÿˆ ‡æH÷æ)ÿˆ÷‹Pù±‡Æå €&æ?ÿˆ,-fW >5‡W E5ƒW ¾s‡W Ås ƒW !€ ‡W 8€ƒW >€‡W E€‚�W ¡Œ ‡W ¸ŒøƒW ¾Œ‡W ÅŒòƒÖ $|³Æe ‡w ç¦&BAÀ'÷ ,æÁ „€‚A÷ ‡÷ &˜ÂA÷ Œ•‡€‚ÅЕ*Å ü‡Â є ý‡ABDEFIMNOPQRSTUXYZ<>Å"BaÊ$ep|v¢­$Ê®¶ÅÏJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw Bæ&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ ˆôÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚bÂEÊ Ö ÌЕ%„Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ Î�à õ‡& æÎe°6& ¦æÎeœ/& æÎeFþ*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎeb & ¦æÎeNЕ A‚¦Þ à ÷–%‡& æÎe"òA÷ óà û‡Ð• à ü‡A÷ bE‡AÂ÷ †E‡Ð• Aæ÷ ÚòAÎ ûÖ Â ÷ $Е.÷ ÂòÂ÷ AЕ; ÷  Ã à‡Â ýð¥ ÿÿùÀ øw XäD…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w (äDÅ… ƒ÷ &Е.À À À ce÷ ãÀ …Е:÷ Å ù Â÷ B‡æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w �ã…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ `âW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡Á(Áe(BA ‡&À(Àe(H°0 €‡Á(A ‡fÁ(± �‡Á(A‡fÁ(±�‡Á(AD‡&À()¦æ&pDCÄe(Âe$´fæÒ•[Ã÷ ,Ò•,ƒ“÷ "Ò•]ƒ…Ãe(Âì‹0 >„ƒ‚€‡ÃEÿà à ÅÃ5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡|³°x–,?H?Hç! W Ì700Þµ@’:l1DATADATADATADATADATADATADATATITISYSYSYSYOV~ÜÆ0ÀøÌFZ¾(ô*|0ÀÜÆ0À` SLP -- Command file checksum is %P SLP -- *DIAG*-Error in command file %X checksum À÷ ê ·:ÿÃZ7 œÿ7 7 ˜ÿÆ&ÿÀJÁ  Á ý÷ˆÿËU· vÿ÷ Ö†w¢÷ ž7 dÿ ÷Púý÷æýÀ*È Ô÷¥/¶&wxÁ ÷ ÞɇÀÁ ÷ ȇËU@À2Á ÷ ¶ ‡ËU À ð¼ð÷ ÄÀ| Á ÷  ‡ËUË5p¡÷]„þ„ý7Šèþ÷ n†w¬À*7pý÷ejýÁ`”þÁ À Â�À ü· :ý×-2ý‚ÀTÐ þÿÈe ‡ÈEÁýb‡w þƒwœÀÃÁ¼7’—”þÀNÈ ÈøüÈe=‡ÈE7 æý÷5èü÷•Hþ÷ Ò7‡÷5ÔüÀ<÷ ¾ ÷5ÄüÀœ ÷ ìÀ” ÷ ÜÀ÷ ÔÀä÷ Ì÷5œü ÷ òý ÷ L†÷|ýÀ ÷ Zw4þÂ*Á÷ �wfÀF ÷ ŽÀè ÷ †ÀÆ ÷ ~ÀŽ÷ vÀ<ý÷ * À¼÷ œý ÷-–ýÁ‚² ÂeHÁ\ÂZÊè÷ ÔÀ¼÷ ‡w Æ&÷ ćÀ&*”Ľ¥¥$Ë5¥%¥&¥/  Á÷ ð÷ ê÷ þ±÷ è÷5Àºû÷5 ²û7 ¦ü÷ 4Ð÷ À÷ Ô¡‡÷ ¨Ç÷‹øüÄË5Á7 zûËE¼ËU¹ ;**-EW**w (&Á&*@E”Äâ¥<¥ù¥÷¥ôE”¥1E”¥.E”¥Ã0Ä9E”Å $¡"E”Å ¡E”Å ¡E”Å ¡Å¥NE”¥ E”¥ E”¥E”¥E”Å‹ዾ÷ Òú Â&*€ †—¤ ÁEÁe� õ÷ „Äå••••Á ú ÷ Ü$7 –úŠÀå&*7X#‡w P%÷EŠú À&*à …”Å¥ DÄEÄe7!\ûòw Rûí� P‘êŠÂå&*· #‡ >À ÁÂðÕa÷ úÁÂðÅa°bpd÷ $‡ÀefÈ ÷ \û÷5öù÷ Ê÷ Xÿ7Ôù÷5âù÷¥-¦" ÷ žÁ¼P”þÀå'*7†"‡œ`Â¥öÿÁÂ¥ÿÿÁÂ¥þÿ ÁÂ¥ýÿÁÂ¥üÿÁÂef÷ ¢±‡ èd w 0$ÄZ· `ùÌ5· Vú÷•?""÷¥ "÷ "Ì5@)À~÷5€:ù÷5@2ù ÷5 *ù ÷ úðú@ðù@ð&*ðÌ!÷ l$†ÌE@`Á ÷ Ì5 qÀ"*È à ÂÞÁÐø÷5ÀÒø÷5 Êø Á¾ù÷¥.†!÷• ~! W 'Áå'R Ћü ÷ Ò"÷eV!÷ Žø Àø ð`ð‚ø÷ â#-‡Àâ ð *ð,!÷ Ì#"‡÷¥ (!&ÃÌ5Àº 0 ÷ ¬#‡ƒ ÷`:ø÷-6ø2ùÀž ðÜð÷ ˆ#†ÌE `Á ÷ .7 ø÷•.Î ÌE‡  w œ" EÐ ÁDÐW!!Å õ L À` ˆ Á`ÁæÃ,óµ„ ¦Â~ÁF!ÁÀ¼÷ @ ‚AL÷ 6 À¼à÷ l‡Á"Â\Ê À¼÷  À¼àÁå÷ F ‡!÷%*øƒ÷"ø‡÷ø· ~øÀü÷ DÀ„÷ <ÀL÷ 4ÀŽ÷ Ü w4ú7ÿw ÿæb ÿˆ‡ææ)ÿˆ‡Ë5÷ ý†‡÷  ‡÷5Èö÷ Vû÷ Jý¡‡À”÷ Ì †ð¥öÿ*`Á÷ ¼þ±0Àe÷ üû· |ö÷5À†ö÷5 ~ö÷höp÷÷5pö Á%*B� É‹W¢ W¢ ÀUB€ 7 :ö ŠÂå&*·ú‡÷E0ö÷5*öw ö÷UöÂöB À&* Ð¥ ÁU� B øB ÷5€òõÁEÁeЕ ó� Е ï‡Á&*”þ÷ އ÷ ¾öÂRÁ÷ Øý‡ÁÀ�Á@ÃÀ€AÂÆÀ€AÇÁÅ�Ä@ÌØð<(ä lx´PœˆDC•¦Î@ƒ@ƒUÄÃEðÿà ä ÄEÿ„ „ „ Ä &Î@AƒUŠÂæŽ@Â@‚UÁ â‡w âÃ-õÃõÅ" 7 Üÿ7 Þÿ÷Öÿ·Ðÿ „”÷¥-ÆÿÄ¥/7 ¼ÿ$÷ ¶ÿÄ¥,· ¬ÿ÷%¦ÿ#Ä¥;Ä­IøÄ¥ Ä¥ 7 ~ÿ÷ xÿ· rÿÄ ‘� à Íõ¥ ÿÿÁ Á Å"  ÷ þ·@þÅ" ÁÂ<ÿ÷ òý·4ÿ‡÷ &00Þ½@´@§3eaek›’÷ &÷ �’•’•€‡@Á(÷ ü!f€  Àe ÀeÉÿÀe Àe ‡&æÿˆæ3ÿˆð 89f¦æ�Æå‚œ"¦ææÿˆƒÂe\¡¡¡Âeòÿ¡¡¡!ŠÂe¦¦¦¦¦�÷ ä ‡Ã5Àäf÷ 2*€ ÆeA ƒ‚�‡Â Âw D ”Å¥ üÅ¥ ùÅå0B¡†€÷ !Aa”ôœÿÿ‡w Ä'Å  ÅUD$†BA÷ %&�Â(÷ ÅU� ÀBQ÷ rÂЕ* ü‡THôèúSY:„d‚ AU[[BF€[CMZACSZFTRZSQ ZRS@ZNS€ZäZ7ÿzº SLP>ÑÌ„NºX~ Ãê+Kn�°Ïï8Y|“±Öí„xŠ NSYÊ„žª0DBZSP[Æå €&æ?ÿˆ,-fW >5‡W E5ƒW ¾s‡W Ås ƒW !€ ‡W 8€ƒW >€‡W E€‚�W ¡Œ ‡W ¸ŒøƒW ¾Œ‡W ÅŒòƒÖ $|³Æe ‡ABDEFIMNOPQRSTUXYZ<>Å"BaÊ$ep|v¢­$Ê®¶ÅÏJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw ü&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ núÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚bÂEÊ Ö ÌЕ%„Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ ¾�à õ‡& æÎe 6& ¦æÎeŒ/& æÎeôù*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎeR & ¦æÎe>Е A‚¦Þ à ÷–%‡& æÎeòA÷ løÃ û‡Ð• à ü‡A÷ "E‡AÂ÷ FE‡Ð• Aæ÷ 8øAÎ ûÖ Â ÷ $Е.÷ øÂ÷ AЕ; ÷ �à à‡Â ýð¥ ÿÿùÀ øf¦æ**æ ææŽaææ©ÿˆ†÷¥�ÿüéÀB€÷ �øÂ¥*÷W ô‡W cñ‚@ –%‚�‡w P5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ œ*AdBbAÁepÂ& ¦fƒÂÁ ÷ Ø– –‡ÁPõµ aA”Aíf@pnp÷ ZC*8Ö‹Á ÷ ˜88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ ¨õÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw tõ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ "5fµ fˇðµ ÇÈ•÷ ‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ jDlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ ޽•8 †õ¥öÿ*ÎÎò‡w 6õ 8µŠjDl@÷ ˆT”ÔÀeBTŸ8œ5l@÷ Ò‡@Á(ñ D÷ jÁeB&÷ ‡÷ ‡& ææ©ÿˆ@ð•#÷ ª& æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡w RD…&&÷ bЕ-�Î �eÁaÁeùP”P”P”Е-�$w "DÅ… ƒ÷ &Е.À À À ce÷ üÀ …Е:÷ Å ù Â÷ 6B‡THZSYš„nzâAU[[BF€[CMZACSZFTRZSQ ZRS@ZNS€ZD%N%1R -- *DIAG* -Open failure correction input file %XOpen failure line listing file %XOpen failure source output file %XPremature EOF correction input file %XIllegal Get Command Line error codeI/O error command input fileIndirect file open failure%N%VAIndirect command syntax error%N%VAIndirect file depth exceeded%N%VAI/O error source output file %XI/O error line listing file %XIllegal switch or filespec%N%VAIllegal filename%00ÞÅ@’:l1DATADATADATADATADATADATADATAN%VAIllegal device name%N%VACommand syntax error%N%VAPremature EOF command input fileI/O error correction input file %XIllegal directory%N%VAI/O error command output fileIllegal error/severity code %P %P %PLine number error%N%VA%D lines truncated by audit trail%N%1R -- *FATAL* -%2N%VA%N×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ ¶ J9¬9ÿ ® J9z:ÿ ¦ J9(;ÿ ž J9r:ÿ – V9H:ÿ Ž ’9?ÿ † ’9tAÿ ~ ž9–?ÿ v ž9²@ÿ n n90?ÿ f z9?ÿ ^ †92?ÿ V †9ÞAÿ N ž9?¦Þ5Îe‡w ÊÁ,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡wì ù è$ ½(ÿÿÿÿd)&*. Ê5¦ „Ê €‚Ê5ùà ÷ƒõ…2Å Å ÍUEÍ ø�‚‡>9, +²*Î<9‡ÊEò ÊU ‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w Z…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ ,W ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&æf…Þ ƒ„…‡w zÁ(DB‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±DÂ(Âe(¦„Äe$2ƒÃeäÿæÓÏÓ Ó(‹ÿˆ‡Ì%[]Ì%<> ƒ ÷ †„팂1 >‡w æ÷ Pn‡832cðµd& & & B öŠð 2OðµðµΕ ¶“ðµ à N”à Υ$¶“Ε Åð 2ƒ2Åà‚Î¥ Ž�Î �æ÷ øƒvÂ Š‚ ƒ“Ε f÷ ôƒ�ׯe÷ ð¥óÿ*÷ šÆeð•Øÿ*w~ðÅ@)ðµ÷ †ð¥öÿ*ï0,÷ z÷ ðæ‡ðµ ÷ V‡ðÅ)÷ @ðÕ)ðµ00ÞÍ@´@§3eaek›’( ð¥ Ó ðµ=Ó ð¥Ó lð 0ºl‡ð  ƒ÷ :†ð¥øÿÿ÷ 4ª‡ð¥/ð ðð¥Ãe&ðµ=ÅBaÀ@aÁ ÷ „Áe0b�Å ÷ÂeÒ€ð¥Áe@Ã÷ Ø`‡÷ ÊY‡ðµ=‚ ÂE°8óÅ Ãe…l0Å Åà & ì0‡„ l0ù…Å`pÄ Älöÿ06ðôÿ4p 4÷ ®ðep ðÕ)ì‚wVþðµð¥Ã%÷ † ,÷ ÷ ÷ N‡÷ w"þ÷ à‡÷ J†÷ p‡B æƒàƒ#ƒÎà÷ ¢Î f÷ Ìÿ� ‡Â`‡ð¥öÿ*÷ `wP±ðµ)0406 l0ì° ‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡f&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡&æ¦ff… Þ �‚ƒ„…‡w àÿð*D÷  Õ ýw€w Âÿ÷ HðµðÅ)÷ †ð¥öÿ*÷ „w46l0ì‡ð‹*±‡ð*‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡w þþ÷ „ÿðµ÷ ÷ Òwdÿ÷ ð‡÷ <‡÷ äü‡,, ð ñ‚ð•öÿ*±îðµðe6p 4÷ bÿ†8÷ \±‡÷ †81416÷ p÷ €ñÅ ÷ ¦‡‡÷ Zê†÷ :‡ðµ)÷ ‡÷ ¤ÿ‡÷ Œÿ‡÷ 4ðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ ê&‡f¦æ÷ è÷ °†ƒ‚„÷ ¾‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ `0ž8*wþð 8ðµ ðµðµ ÷ úý‡ðÖ*±‡ðÃ*±‡ƒ  �D„PÄ5Rà ý†R”‡R”R”à üø±ðµ=p!†Õ•^ú‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡0Š+æ1ÿˆÅ(Åe à ÷ @ß%ÿÿ&ïp’*w¢ü÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ ~ü8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡ðµ=D…÷  ‡ð`p4°6÷ ü‡æf¦÷ ²°6°4/‡ðµ=Á  ÷ >ðÕ@)ð 0 Ö 8wþ÷ $üƒ46÷ V‡8ñÕ ÷ rü°eð‹*w¢ûÖ ±‡÷ Šû&f÷ …„‡D„ ÄEõµ/fCÃåŽ A ÷ 6þƒB f& ÷ þB‚eA @0÷ ,þÁ („‚@0÷ þa@ÂeA ‡ B0÷ þ€ABÂå� ÷ ìý¦f ÷ ÂýC�‚áÖ @ð•Òÿ*±‡141612Áepðµl2l0p‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ 0þU•Õ8UMwŒýÅåà wÐý÷ ”ýBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�wú46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ ˜ùwˆù8Áe2 ‡0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w ºø Á�   ìì� .Â% ÷ Öü ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ ü ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡w 0øðµ Á¥ðÅ)÷ ¢ø‡÷ Zü ÕfU�Ä÷ ºû…‡ðµÕ%  BA °`6p 4p`4¡ ¡õ%þÿð60 4‡¡ðµ)"ðÕ(.÷ ¢þðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ Hú÷ :ùðÅ(.‡‡ ¬9J9b9�¬9È>9V9�¬9d>9J9!?n9>9!�?, b9z9&�?b9†9*�?|b9’9/�?¸b9ž92�?Üb9n9Ë5 À‚Ö÷ š‡ð•#÷ ŒÁ?‡Ë5 ÀòØ÷ z‡ð•#÷ lÁ/‡ðÜð÷ n†ËE `Á ÷ lÏË5@À€á÷ 8‡ð•÷5€0Ç÷5`(Çð•ð•#÷ †Á`÷ (χæÁeB$&ðÕ<÷ ܃‡ñ•ñ•w –ñ@pdf ¦Âd)÷ Æ‚�B„œ$‡Äµ4ĵ!ò%'‡ò% ‡ò%‡E$ÂeæƒÕ�@à P”üÎ öÖ Á Á Âe ÁÂe Á Âe÷ dα& ĵ€ V ‡11@÷ $†BÂeÁ÷ 4α‡ÿ ¸ïn90?ÿ °ïz9?ÿ ¨ï†92?ÿ  ï†9ÜDÿ ˜ï’9tA°9w Îñ?ŠöÆÀ°9„ Á&* ƒ P”ýà ÂP>÷>ÿà ÅP> ÷ Ά¬9Á÷ ò·÷ Ð‡Þ †÷ ªøÀšÕ`Á÷ ÐÎ÷EªÆ±‡· ˜Æ†÷ âÏí‡Þ ø‡Á6:É%D:`· jÿ×-fÿZ‡7 `‡7 Z÷ Nÿ)w (ñæFÿ±Þ w <ÿ Á@:Ä&*÷ – †óÁD:BC ¡Ì‹±çÔ¤ø… Dò÷Æþþ7 Þ ‡÷5Æ÷  Ê7 þÅw�Ì· èÁêÅÂ@:Rʼ‚ŠÁ ý‡Á6:À>:"‡ÙåáD:÷º¸þ ™ ‡÷ ¢þæžþ÷-¨Å¨ ‚—#´:00ÞÕ@’:l1DATADATADATADATADATADATADATAÞ ‡÷-’Å’ú‡Þ Ö Â¬9Á÷ ¬Í±w fþ‡÷m^þpÛ· `7 XþÁ@:wHþ ÉR‰ B ‰‡7 8þ÷Š:4þ‡÷´:,þ‡Á@:w".Å÷�(ÃÉÉ Ñ Ù�¡ ‡7 ÷Åþý÷%´:üý· òý‡7 &f¦wì÷‹è÷ Æ7 à7ÞÀâÈ @•,€ÀåÀÿq `-KacJE[à !Ãm¢Äíž@•Á †Õ Á ûα)÷ L÷ R†é  çà å÷j7•jà f@• †Õ †&Ý €…Ò€Ö À5]U ¦†E¤¯‚…€Á(‡ :Á‚æ&@E÷ ÿA ·Îà· ̆ª ÷ Š÷ Р¢ÂÀEÿ÷ vœÀEÀÿÀ €cÁÐÂΤ‘Á ü¢ÿ­÷‹¹‰÷­´±¦†„÷ @�Á à £.„ à · ’æ&fÅŠÄ„ÃJ>Á ÷ <÷ .…„ƒ¶à ÷ 8 †À ÷ "†À £.£$· B„ à ë÷ 8‡Ì¥Z‡£A‡Ì¥9‡£0 ‡ à £ £ ‚ „ à ö‡;,‚>ÊÀ‚þ;È�²>,t>;B;ʆB;,B;Š>À‚ <È�²>,Š>À„ª>/V;”>À„ª>/Þ:¦>ÊÞ:І<”>À„ª>;Ê„/Þ;È>.0<ê>Ì”;À„/ä:à>.Æ:È>Êä:Іr;È>+B;ú>À„+ú>ÊÖ;À†Ö;̆Ö;ÿ ì†9Fÿ úë†9FÁeBÉ ð 8÷ Ú‡$&w xñð*ðµ<S1 ¦à Ö KÊ ñU€ò ñU@ò æ÷ ă‚f&œ" ÷ €�†‚×'&�ÿ)×'&ëÿð&* ðÊ*Ä%0þðÌ*±‡NDÅ Å ý¦æ÷ *ƒ‚÷ ñEÿû±U‡÷ \‡÷ z‡÷ @‡w ®ðBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=wÌðÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡ð*ðµ;ðµ7ðµ#3w $ï *’$Ê ':æƒô �ô�…T•à ýƒñU@…Ê% D•ÄDÓÄ%][Ä%><wô÷  †wXññ1 ‡Ã ÄÄ%ñ,ñ,ñññ:4Š× ±‡w jîð*DÅ Å ýæ¦Y…‚T¦fÃ(ÃeŠæ„ðµ<Ó•_‚ S•Ä ýó¥:ÿÿÓ•:‚ ƒ…¦æ& œ"& ΕæÏÿˆ‚4†×'&�ÿ ð&*×'&ëÿð¤ÿ*±*ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ à ‡à ññ÷ Þüð•Éÿ*‚ƒ‡w zíð*æ ƒ ‚æ¦×¢"wf)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷ <‡eÄ%w ñU\ñ5@ƒ âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ "ñ5@\ñU@ñ5€áÄ„íÄ ñ5LñUþ¥*ñUÄ Å‚öƒàÎàà Ê¥*Ã%C!.D`÷ *‡ƒ‚wòþÆeCÃ5€ñU‚Ã5 ±±± Ã5€± Ã5@±‡Æeð•Êÿ*±‡ðµ=õñU„Ä EÅe& ÷ RÄEÅe÷ Ö ¼Ó¥"Ý öŽwVþö Ë¥"  ƒ Ë¥"ö Õ”Ä Â Ä î ƒ  ê¶ Õ• Ä ü‡Â(Âe(¦Ê ññ1 ÷ `£(£(£££‚÷ X†� ‚÷ >âââââ‚:ƒô �ô�‚””à ý¡Á5Á ±‡ÂeCÃe¡‡æ¦ƒ‚ÃåJ„”Ä¥[Ä¥<C…Å`¥ ¡>C÷ ˆÒ¥,÷ ~… 4ÃB‚ƒ‚× *‚㨂 DÄe $ $ $ ÷ >‡ñz ñññ÷ ¬‡DEÅe     ýð•Ìÿ*1 ±‚ƒ‡ Ë•0‹¤þ‹¨‡—¢3‚¥÷ "÷ Ä ‹¨ ¥Ë”Ó”¦æ£˜Ä ýƒ‚‡‹¢‡Ê¥7‡¥‡æ5æ±ÿˆ‡ß%& Ëw ¸é&Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë å¥.‹ Ä ÅæU¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë ‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±û&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡TaÞ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡±‡Ä Ä Ä ðµf÷ âìð >€5>õE€u ÷ :ì�‡ñ ± ‡w ˜ñÁ(ñ D÷ íð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwtÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)ÁeB÷ B ‡÷ Lñ \ðµ#÷  U†&œ* ðµ=ð¥æ•Øÿwô Å`p!2üƒÅàÅ… ÅEW!Åp0p2÷ rׇðµ#(ð PðÕ)÷ (†ðµ@#ð¥Çÿ*ð*fff÷ â±±‰‡÷ ò†&œ*wjðµ.÷ nB‡ð5ð(8ðe$8w2€æ•ÖÿA&À(Áe÷ Ú€†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA#ðÕ@))÷ öð00ÞÝ@´@§3eaek›’ †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ õ00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ èñ‡0 @0 ð‡&œ*0 @÷ *óuÄ÷ �òðµ# ÁeB&B÷ ˆ°B÷ Â÷ ̰•*±‡÷ ðò ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ ºñ0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6wîð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡w ºèÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w vè  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡w ¨ìBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=wÆìÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡ðµMðµ=ðÕf�Â(& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ðµ=&Îe0æ ÷ ðU• Â…à  ÂE•Õð >€ >ÍE€ðµ=ufÄ÷ 0ïp†�ñ ± wÜë÷ " ‡f÷ \�†&œ*÷ °•*±‡Ä Ä Ä ðµf÷ hïð >€5>õE€u ÷ Àî�‡ñ ± ‡÷ :ïMÄw¢îðµ82Áe&À(÷ xý€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡&æ¦f&¦ v Þ €�‚ƒ„…‡f¦æ&f ÅÂ…`Á Á ý°* �… !†ƒ”×  ×  Ä õ× ñƒ× ÿî× "D × a‡× z‚Ä ÃE Ñ�ÝEp(p°à„… †ƒ”× $ú× 0‡× 9ôƒ× A‡× Zîƒ× _ë× :� � ‚„… V†ƒ”× [È•]× <È•>È‹8 … |†ƒ”× %ú× *÷× -‡× .ñƒ× 0‡× 9ëƒ× A‡× ZåƒÈ ‚ … |†ƒ”× 0‡× 7÷ƒ× *ô× ,A ïlÈ jÁ hŠ„ … q†ƒ”× "A øÁ ö „ #A … c†ƒ”× $‡× %÷ƒ× *ô× 0‡× 9îƒ× A‡× Zèƒ× _å× .� £ß … †ƒ”× .× ; … f†ƒ”× 0‡× 9‚� õ]× -Á X� í× *Á QA æ × ,Á D× = Á >È5 B>ÈU °(wZþ× /*Á .�Á … .†ƒ”× $× -‡× .ƒ× 0‡× 9ƒ× A‡× Z ƒ× _ × :Áÿÿ   DÚ× " Á … †ƒ”³á°0±…„ƒ‚�‡f¦æ&fæ ÈE¢¢^Á`Å÷ úÄ ÈUQÅÿÿ÷ æÄ ÈUQ ÷ ÔÎË€ÈUIá ÈUà `¢Ãe á ÉáccD ÷   Ä”¡%¡*¡.A ÈU Å ï0 0 ��W ,ÈUw@W /D ÷ DÎÄ cBDaW£-Á�Á N�… W¥N W¥OD!†B�“Á N�{É …CÃE€€C¥ÃC¥D!‚Ñ ó�ñ‹þÿ€D! ΋ñ5 Ñ þÁe߃“ƒ Î�à UÂåÔpRpR„“pBCÃ5D ‘ƒ à KR΋KBAÁE�—­:ŒDœ0CŠÄŠý ÷ fÎÄ ÁeëB”—   ¡ƒŠDÒ� CS•ÄŠÞü ƒÐ÷ Ò ‡W¤†CÅ E Cs ÉΕŠ …„ƒ‚�‡f¦¦)& 6 l(¢*¶„„íƒ †�”Å EÅ 'W "Å =N íÎ ëW :+W =Å 1 Â#W ,W /Å %W %W *ÑöÕ€ÍÄ W <ÈW [ÄW >W ]¾„ v�¢°(°* 6 ƒ…Æe‚�‡÷ 0ú¦Âe°ÄeȵÄeà Ã~÷ Úü‡Á DE  ȵÄ2…Åe &Âe ÷ Š€ †ß%�ÿ&'ðÕ@±^ÃeðÅÁ5€ðÕÁ5@ðÕÁ5ðÕÁ58ðÕÅ“B„Äe€Ãe°ÈµÁeÄeÐÿ& q1””BÓ$ðñðñ„Äe q1 ””Bð ñð ñ¡–‡w  êÁ w –êÁ& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡00Þå@à;Al1DATADATADATADATADATADATADATAw ˜ñ÷ €‡ðµ)ðµ÷ Æò8C÷ $ð¥öÿ* ðÕ)ð ð*wÎñð•öÿ*ú÷ ì÷ Øñõ‡ðep p ‡÷ „è‡ð¥#ðµ=Ä E”W¡9ƒÅ¥^éð•³ÿ*ÐÅå0ùà Å`à à CaÄ ëÃåCƒ Ôà ðµ=ðµ÷ X ð¥ð 0Àð•Øÿ*§ð¥ ðµ= ÄEÕ¥^Ä ûA¨ð¥ æÂe@ÃÎà÷ Þƒ߇÷ ðµ=� ÁEpÓðµ2ðµ!)8ÂeEÅ`l0Å …à ì0‡„ û0¡/ &l0Ä ü„…`pÄ „löÿ06°ôÿ4p 4÷ ¨ððp°æÄ ƒðÎà÷ 8ƒ ƒ÷ Vá÷ ù†ð•Øÿ*Á`‡ðµ)w¨æ÷ Øðƒ‡æCàƒ#ƒÎà÷ òÎ ¦÷ Èÿ‚ð†– ‡DàÄ ‡ðµ@) ð 6ðÿ?0ðÅD)‡w 4ï÷ n‡832cðµd& & & B öŠð 2OðµðµΕ ¶“ðµ à N”à Υ$¶“Ε Åð 2ƒ2Åà‚Î¥ Ž�Î �æ÷ FñƒvÂ Š‚ ƒ“Ε f÷ Bðƒ�ׯe÷ Rñð¥óÿ*÷ èîÆeð•Øÿ*wÌîðÅ@)0,÷ „ï÷ ìò‡ðµ ÷ ¼î‡ðÅ)÷ ¦îðÕ)ðµ( ð¥ Ó ðµ=Ó ð¥Ó lð 0Æl‡ð  ƒ÷  ð†ð¥øÿÿ÷ 0¶‡ð¥/ð ðð¥Ãe&ðµ=ÅBaÀ@aÁ ÷ êìÁe0b�Å ÷ÂeÒ€ð¥Áe@Ã÷ Ô^‡÷ ÆW‡ðµ=‚ ÂE°8óÅ Ãe…l0Å Åà & ì0‡„ l0ù…Å`pÄ Älöÿ06ðôÿ4p 4÷ ªðep ðÕ)ì‚wnþðµð¥Ã% ÷ xï†,÷ jï÷ ‡÷ |ïw>þ÷ Jî‡÷ J†w’‡B æƒàƒ#ƒÎà÷ ïÎ f÷ Ìÿ� ‡Â`‡ð¥öÿ*÷ Êìwºì±ðµ)0406 l0ì° ‡ð 8 ðµðµ÷ „ì‡ðÖ*±‡ðÃ*±‡¦&æ|³€Æå‚¦& æ f&&æ�ÿˆ ‡æ æ‡ÿˆ€Æe#Æe¦ö|³& f&&æGÿˆ‡& & & & &&æ ÿˆÀ†×'&ùÿ±À&–‚‡w ñð*æ8Iðµ÷ 6ùœ*=‡ðµ€)98÷ (õ ÕeBÕ && ð Îå¶ �ÕU€�Ä÷ jô‰�†ð¥öÿ*ð¥åÿ*Æe ð*Nlv °°΋œ*ðµ.2÷ ²ô „& ðµ#ðµ!ðµ)&ÎePæÂ(ÂeÊ ¦æ&æ•&Äð >€Åe >ÍE€÷ Æó†�•p�*÷ öwxðw öïð*ÁeBð 8÷  ‡÷ Äþ‡ðµ÷ ¤É‡w ÂïBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=wàïÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡÷ ~ ‡f÷ b�†&œ*÷ d°•*±‡ðµ82Áe&À(÷ „€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡÷ þòMÄwfòÄ Ä Ä ðµf÷ Öòð >€5>õE€u ÷ .ò�‡ñ ± ‡w ÎéÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w Šé  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡|³¸¢–,¿;¿;qï W \;TITISYSYSYSYOV~ÄÀ0Àø\~Z$ |0ÀÄÀ00à>A´@§3eaek›’0À̌ހSYÌ\¸¢×ð'ÿ0 ZAP>ÑÌP _€ÌŽŽ~ˆ;÷|ýÀzðbð‚d÷ Ø †ð¥öÿ`À M÷€üÿ•X|ü‡€7$¬ÿ7"¨ÿ÷ "7žÿ70û7”ÿ7&ûÀ~÷ Ê -‡÷ ö*‡‡÷ €ÿ7 zÿ÷5xÿ&÷fÿúú÷bÿöúÀ~÷   ‡÷ Ä€‡‡æNÿÎåÌÀü°÷ p ‡÷Ì6ÿ‡À ÷  ÀÿÿwX÷ø¬üæ¨üæÿˆæ3ÿˆw²‚€��m@ ‚ JÊEþÊeÌà €  à üÀE€ÿ‚ J‡ÎÎe²ÿw�æ´æ²Á¬w¨æžæ¢æ 7𿆿†æ€Àz7‚7r7p·n·áhX·hælæ·fæT‚Âe—"ÿÎeæNæ@Îe7 6À4ø Â6·.ÂÂe—"ÿ/÷ Æ À5Á·þ·ü·ôÀ·þ·ø·ì·î·è‡ÆÚ€7ÚÀeæÿæ·Â7¼÷íº¶X÷¶¶Æ¬·®€6Àe·-Ž w –ä€7 Š7|Î7 ~ö 7rÆj€Æm^ÎbÀd‡÷R‡÷ Dþ¦f�Þ ¦æf�Þ ¦æ&f�Þ ¦æ&ff� Þ …„ƒ‚�‡ ¾ w .5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ œ*AdBbAÁepÂ& ¦fƒÂÁ ÷ è– –‡ÁPõµ aA”Aíf@pnp÷ ¢C*8Ö‹Á ÷ ¨88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ ÈõÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw Rõ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ J5fµ fˇðµ ÇÈ•÷ 6‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ ŠDlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ „½•8 †õ¥öÿ*Îè μ ‡w  õ 8µŠjDl@÷ 8T”ÔÀeBTŸ8œ5l@÷ ò‡@Á(ñ D÷ 2 ÁeB&÷ Ú‡÷ ‡& ææ©ÿˆ@ð•#÷ Â& æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡wJûƒ÷5Šø4à ö€@ À€‹ÀÀEþ7š€ÀŠÀ 7ŽæV¦æVæT÷ :ùÎV÷ ‚ø÷5hÎþÿæ÷ XùÖ ÀR–%G ÁøÃ 3É ,„ ‚ ± &‡@Àÿÿ€ †æN`¦æVæT÷ ÖøÎV÷ ø÷5Îþÿæ÷ ôøÖ ÀîÆe‡Áew ÚÍ‡Ä ÀÀ÷ æþÿæ÷ ¾ø–%‡f÷õæ÷ Æ@À ð÷ º÷ øÖ �‡w(úæøæþÿŽaæ6ú·2ú÷ v÷p7n÷ V÷ b÷úúÆe‡æbææ÷ œøÆe ‡wÚùæFæþÿŽaæèù·äù€ø5÷ ÷ Æ÷÷ÊùÈùÆe‡ædææ÷ NøÆe ‡÷ `ÿw¢÷¿�ºö· ¶ö‡fÀ®ö�É‹P”ü7žö�‡w4ùÁ €@ì6‡‚ ÷vl — Âe.Âe Âe  ¦÷ ”ÿÖ ÁåÝ€‡f÷ z ÷ v�ÿ•06ö· 2ö÷ÁbÁEøÿ· Z· V· R÷EàL÷ J÷ Äÿ@Àe0?�ö· ö�‡·.·& ÷ "�ÿ•0âõ· Þõ÷÷ Žÿ‡No such relocation registerAddress not within segmentNo such segmentToo many argumentsNo such internal registerUnrecognized commandNo open locati00àFA;Al1DATADATADATADATADATADATADATAonCannot be used in byte modeError in file specificationOpen failure for task image fileError on command inputI/O error on task image fileNot a task image or no task headerVerify failureNot implementedSegment table overflowf‚ž®ÂÜò <^v”¸ÈØZAP -- (@×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ ܶ ÿ Ô¶Òÿ ÌÂòÿ Äæü+ÿ ¼æd/ÿ ´æŠ/ÿ ¬˜)ÿ ¤ò¸)ÿ œ Ä2ÿ ”æ˜)ÿ ŒæN/ÿ „Ú˜)ÿ |ÚD,ÿ tæ /¦Þ5Îe‡w ’Á,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡w$ù è#ÿÿÿÿÊÊ5¦ „Ê €‚Ê5ùà ÷ƒõ…2Å Å ÍUEÍ ø�‚‡ª $Ê®¨‡ÊEò ÊU ‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡w Àwwðw ®ð*D÷ V Õ ýwºw �Á(DB‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±DÂ(Âe(¦„Äe$2ƒÃeäÿæÓÏÓ Ó(‹ÿˆ‡Ì%[]Ì%<> ƒ ÷ ܄팂1 >‡&æ¦ff… Þ �‚ƒ„…‡0Š+æ1ÿˆÅ(Åe à ÷ @ß%ÿÿ&ïp’*wø÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ Ô8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡f&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡ð‹*±‡ð*‡‡ $¶Î�$t ªÂ�$, ª¶˜)Úª�˜)`Îæ�˜)Ä Îò&�˜), þÎ+�Ä2¼ò 0�Ä2Äòþ5�˜)ÎÚAB&RO&LI&wŒí÷ zý7 Òê7 Ðê7 Ðê7 ÐêÀüð•#÷ $ q‡÷ ÷ÕkçÀz0 b÷ ¦í†ð¥öÿ`aÀ \À†ðNçðFç÷ Ø L‡ð áÈ•÷ Ð D‡ðµ@È•ð$÷ ¸ 8‡ðµ4ðµ0À~ð´ð•#÷56êð•#÷ Œ ‡Â¾ÃRà ýÁeÑ çÑžçјçÑ–ç áea ÷Å©æ‡À À÷ Vò“÷ Pòwºêw~ì ƒm Á à B Á üä‚ Ð �ȇ÷¸éªé÷e ¤é÷-¨é¨éæÌæ?ÿˆ‡ÀRçæÌ& & æAÿˆ‡Àm~âÀE7zé÷zéré÷å né÷-héh醇À÷ Êñw4ê÷ ÈéÀz÷ ² Á¾Â~ÃRà ýÀ~÷ ˜ †wòéÀü÷ Š wüéwÞëÆå æø$æþÿŽaæèë·äë÷ þÀüèÀe 7 öè ‡À÷ Zñæÿÿæ÷ ê–%÷Øèüò÷5ÎèÀðò 0 ðÿÿ0 0Š 0 0 0Š ÷eÊòwdæ)÷ Øè ÁÝKæ÷5@HæwX÷5 <æ(À òW Áà HºðæÁæÁŒ  ÁÅ?ÁmúåpÎ÷ fþÀdò0Š 0 0 w7 ,  W ‚ Â5Àà º7 7ø7  †Àà 7¸ú· öÎ0(÷ $è7 Ø7 ÐÀÚÌÐÀôñȼˆ ÂÂí´°pÎ÷ ÔýÀÒñÈž0 0Š 0 0 0Š ÷e´ñ÷-°ñŠç ‡À÷ îïÎÿÿæ÷ œèÖ Àn7lÌZ×-V‡÷åL· Fö7lÌD÷ @÷å8· 2÷7 .÷e2©÷ää"6 6 W ¶ ö5Àà ð 00àNA´@§3eaek›’Âöö5Àà ð ̶ Áñà C`ÄD`ÂxäÅE`ÀtäÀŒ ÀÅ?6¶`ö v` ö v` €À lp)Ë•ö5Àà º7x7v ¶Œ�> > 3ŠÎ@WË•ö5Àà º7: Œ�> > 3ŠÎ@÷ :ü÷e6ðÀ2ðð•  ×­¹ãƒ Ã5Áà AÆwèHöŠã° †Áà AÌÁŒ  ÁÅ?Ámbãp0 0 0Š Î÷ ÂûMË•ö5Àà º7„7‚ ¶Œ�> > 3ŠÎ@÷ ~û÷ezïÀvïð• ×­ÿâÁà HÀðúâðöâ0 0 0Š  ÷ <û×­ÍâÀà ?º(ïwxË•ö5Àà º7è Œ�> > 3ŠÎ@÷ èú÷eäîÀàîð•  ×­g⃠Ã5Áà AÆw–Hö8â° †Áà AÌÁŒ  ÁÅ?Ámâp0 0 0Š Î÷ pú÷elîÀhîð• ×­ñáÁà HÀðìáðèá0 0 0Š  ÷ .ú ×­½á� Á5Àà ?ºî÷e îÀîð•  †Áà ØáÃeƒ ƒ ƒ ClÀÈðšáð–á0 0 0Š  ÷ Àù×­QáÀà ?Ƭí÷e¦í΀¦Îe,÷ ÖêÖ Á )Îhf÷ ÄêÖ À !ÎXfÎe÷ °êÎHf÷ ¤êÖ À5@Ám,ôÿ Xí ÷Lí"÷ ãN÷ øÖ ÷5ãhÎ)÷ NìÎ*í÷ `ìÎ$í÷ XìÎ)÷ 6ì÷ ”ãÎP)÷ *ì÷ ˆãÁÚâÉ Næ÷ ÌìÎ^)÷ ìÖ Îb)÷ ìNæ÷ ¬ìÎ-÷ àëNÎ æ÷ –ìÎ ÷ ÊëN ÷ èëN÷ àë BÜ — ƒÂ  Îl)÷ ªë ú @Ü À ê(÷ –ë÷ ôâÁe–%w fì²‡Ö ÷ååÆe‡& æð'÷ ¢ãÆe‡wÐä¦)‚· æ¦÷ né6ÀEðÿú?`öÎö¦Îe÷ Né6Îä¦Îe÷ <éö5 YÁȱ ñ±m ÷ ²À @`à ȕȕ ö5@ È• 1 1 ñ�€ ×-xÎz¦Îe ÷ Òè1 ÁdÎd¦Îe÷ ¼è1–%ÎÀH÷ h÷÷e>÷-::á†w¢À÷ šéÎÿÿæ÷ HâwˆÎ¦Îe÷ rèà Ä [Áþ€ € ÀE€1ñ ñqlÎâ¦Îe ÷ :è1 ÁÌÎ̦Îe÷ $è1À¶Á `ñ�¨÷ ¤Ä à ɕɕɕö5@ É• Î÷ šö÷ep÷-llà ‡À÷ ÐèÎÿÿæ÷ ~áÖ –%Ä ]ÎL¦Îe÷ ¤çÀm@?6Á2Î2¦Îe÷ Šç1Á1qlΦÎe ÷ jç1 ÁüÎü¦Îe÷ Tç1ÀæÁ `ñ�Ø÷ Ô É• ö5@ É• Î÷ Þõ÷e´÷-°°ß ‡À÷ èÎÿÿæ÷ ÂàÖ ÆeÖ ÀŠ7†7 €÷~¢éÎ|¦Îe÷ ÔæÖ À Î�é÷ @ýÆeÎ\¦Îe ÷ ´æ–%¶ w.ý÷ 8–%‡€Àe"þÿ À ÷ ’çæÿÿæ÷ @à–%‡ ‡ÿÿ RootI-space rootD-space rootSharedI-space sharedD-space sharedI-spaceI- andD-spaceOverlayNo disk allocationNo disk allocation (I)No disk allocation (D)Null4(6(<(J(X(`(p(€(ˆ(�(˜( (´(Ì(ä(ZAP Version COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1983Segment table: @ô’ÿ ¢ïÚ˜)ÿ šïÚD,ÿ ’ïþÄ2ÿ Šï˜)wší � €À5B`Á € ø€‡w¢í�2€/  Á  „ À  …   À5@À ƒ ø   ‚ àà �€ öö Ä  @‡! à � ü€‡ ‡& ÷ ˆÿÖ ‡æ÷ ~ÿÖ ‡f€�€ � £üÁ À Á ý�‡÷ :ê÷ ÷ :ùwÊì÷þÿ4÷ÿÿ7 7 Ü 7 Ô7 7 ÷ žÁ€À lr$@@ÀmòÀì@à ÀäÀ À ÀmÜÀ À À @`7Ð æF$÷ ¨€ À lz$Ö x÷¶¶7 °o×-ªƒ \ÀžÀ 7$˜À’À 7$ŠÀF€ 7@ Ã>$À:$Á#Á ý7 "7 ^7 \DÀ4Â>Â;Â8÷N<÷F0÷ô(÷ö ÷Õ&÷ ®×-R ×-±‚ÀÀ Àe$ÎR$÷ Ö7ìÀ÷ LñÀÜÀ Àeö#7Ò÷ÕÊÖ w¾þ÷ ˆ÷ €· |æZ$÷ ”7ºÖ ‡fÁRåÀ À�€ 7Š À À4åÀmx¢ À+’ÀEÿ�‡f÷5\÷ÅT· 7 L÷ ¢ÿ7FW 0W 7 À2À À À @`7&÷å0 ä�‡f�É‹ É­@€í� õÀÿÿ�‡fÀ7¬Æ$°†ÀÀî ܬ$œ’$ÀEÿÀ lä$Àw\÷ „À®Àm¬À lþ$À÷ ðÿ�¤Äñÿœ¼ñ÷„çÿ�Ž®ñÿ†¦ñÁ iW  ÷5f À÷ Ðï7 Z7 TY@À À l%ÀbÀm@ÀXÀí67NÀHÀm(À@ÀoNñÀHñÀŸBñÀ Àm*Àe7"÷5,÷ö(÷ À÷úÀò7ü7ú ÷5Ü€ À 7ÌW ÷5ÜÀÀ7®wœÞ$¬7Š©÷ lq樷tæ÷ ’ð÷ 8çwL×-R÷šŒ÷’„÷ > æ|æv÷ ð7j–%À bæ=÷ ŽïÎXÎEøÿÎe0÷ ~ïÎ,÷ vïÀ@ÀEøÿÀ Á:ì$wþNÃ×-èÁ"Á(æ_÷ BïÀ @àÁåNæ÷ ðïÎ ÷ $ïÎ>÷ ïNæ÷ fû7¬æ÷ Èï÷ næÆeAÀ†À l%Àðÿÿ$0 $Àåø€1×-¤ƒ À˜À ðÿÿ$0 $"×-†ñ‚À~À ð|$ðx$À÷ Ìí÷-0^ À ÷ ºíæÿÿæ÷ hæ–%�‡wøçæ|#æþÿŽaæè·è÷ æ4æ.ÎE÷ rì÷5 00àVA;Al1DATADATADATADATADATADATADATA· ,ï÷$ïÀ ï ö#‡ $ †&Îåö#æ÷ júÀ %–% 7 Ê7 ÄÀ÷ 0íwôÃEþÿÃm°À¨À l>% ÁßÌîÁÆî÷ ”:æ¬÷‹©ææ÷ |îÎ:÷ °íÎŒæ†÷ ôÖ Â ÷ .Îpæ÷ NîŽæ÷ BîÎ,÷ ví€À ÎLì$æ÷ &îÖ –% æ$÷ TíŽ÷ NíŠÂŽ÷ Dí Μ8%÷ :íÎ ÷ 2íwÌà ÇlD%NæNæ÷ ÚíÖ N÷ íŠÁN÷ íN÷ í÷ däÖ ÷”æ’æÆe‡& æŒ#÷ åÆe ‡€Àe"þÿ 7 †7 „7 ž7 ˜÷ æÀ‡w$æÀÿÿÃÁÁ ±-$±- $ ‡‚ Bì$„ ‚À„ Dì$à é‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:,;+-*.CQ$ACFHLMQX ^_@>È‹8 … |†ƒ”× %ú× *÷× -‡× .ñƒ× 0‡× 9ëƒ× A‡× ZåƒÈ ‚ … |†ƒ”× 0‡× 7÷ƒ× *ô× ,A ïlÈ jÁ hŠ„ … q†ƒ”× "A øÁ ö „ #A … c†ƒ”× $‡× %÷ƒ× *ô× 0‡× 9îƒ× A‡× Zèƒ× _å× .� £ß … †ƒ”× .× ; … f†ƒ”× 0‡× 9‚� õ]× -Á X� í× *Á QA æ × ,Á D× = Á >È5 B>ÈU °(wZþ× /*Á .�Á … .†ƒ”× $× -‡× .ƒ× 0‡× 9ƒ× A‡× Z ƒ× _ × :Áÿÿ   DÚ× " Á … †ƒ”³á°0±…„ƒ‚�‡f¦æ&fæ ÈE¢¢^Á`Å÷ úÄ ÈUQÅÿÿ÷ æÄ ÈUQ ÷ ÔÎË€ÈUIá ÈUà `¢Ãe á ÉáccD ÷   Ä”¡%¡*¡.A ÈU Å ï0 0 ��W ,ÈUw@W /D ÷ DÎÄ cBDaW£-Á�Á N�… W¥N W¥OD!†B�“Á N�{É …CÃE€€C¥ÃC¥D!‚Ñ ó�ñ‹þÿ€D! ΋ñ5 Ñ þÁe߃“ƒ Î�à UÂåÔpRpR„“pBCÃ5D ‘ƒ à KR΋KBAÁE�—­:ŒDœ0CŠÄŠý ÷ fÎÄ ÁeëB”—   ¡ƒŠDÒ� CS•ÄŠÞü ƒÐ÷ ¦ ‡W¤†CÅ E Cs ÉΕŠ …„ƒ‚�‡f¦¦)& 6 l(¢*¶„„íƒ †�”Å EÅ 'W "Å =N íÎ ëW :+W =Å 1 Â#W ,W /Å %W %W *ÑöÕ€ÍÄ W <ÈW [ÄW >W ]¾„ v�¢°(°* 6 ƒ…Æe‚�‡w ëÁ w ëÁ& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡w ¸ð÷ è‡ðµ)ðµ÷ & 8C÷ $ð¥öÿ* ðÕ)ð ð*w°ñð•öÿ*ú÷ ì÷ õ‡ðep p ‡÷ „è‡ð¥#ðµ=Ä E”W¡9ƒÅ¥^éð•³ÿ*ÐÅå0ùà Å`à à CaÄ ëÃåCƒ Ôà ðµ=ðµ÷ X ð¥ð 0Àð•Øÿ*§ð¥ ðµ= ÄEÕ¥^Ä ûA¨ð¥ æÂe@ÃÎà÷ Þƒ߇÷ ðµ=� ÁEpÓðµ2ðµ!)8ÂeEÅ`l0Å …à ì0‡„ û0¡/ &l0Ä ü„…`pÄ „löÿ06°ôÿ4p 4÷ Øðp°æÄ ƒðÎà÷ 8ƒ ƒ÷ Vá÷ ù†ð•Øÿ*Á`‡ðµ)wæ÷ 8ƒ‡æCàƒ#ƒÎà÷ ¢Î ¦÷ Èÿ‚ð†– ‡DàÄ ‡ðµ@) ð 6ðÿ?0ðÅD)‡w Tî÷ „n‡832cðµd& & & B öŠð 2OðµðµΕ ¶“ðµ à N”à Υ$¶“Ε Åð 2ƒ2Åà‚Î¥ Ž�Î �æ÷ ΃vÂ Š‚ ƒ“Ε f÷ öƒ�ׯe÷ Šð¥óÿ*÷ ÊîÆeð•Øÿ*w®îðÅ@)0,÷ ä÷ ìò‡ðµ ÷ ì‡ðÅ)÷ ˆîðÕ)ðµ( ð¥ Ó ðµ=Ó ð¥Ó lð 0Æl‡ð  ƒ÷ z†ð¥øÿÿ÷ 0¶‡ð¥/ð ðð¥00à^A´@§3eaek›’Ãe&ðµ=ÅBaÀ@aÁ ÷ >Áe0b�Å ÷ÂeÒ€ð¥Áe@Ã÷ Ô^‡÷ ÆW‡ðµ=‚ ÂE°8óÅ Ãe…l0Å Åà & ì0‡„ l0ù…Å`pÄ Älöÿ06ðôÿ4p 4÷ ªðep ðÕ)ì‚wnþðµð¥Ã% ÷ R†,÷ D÷ ‡÷ ´w>þ÷ þ‡÷ J†wú‡B æƒàƒ#ƒÎà÷ ”Î f÷ Ìÿ� ‡Â`‡ð¥öÿ*÷ ¬ìwœì±ðµ)0406 l0ì° ‡w 0ë÷ xìðµðÅ)÷ |†ð¥öÿ*÷ wFì46l0ì‡w ìê÷ Ì ‡Ä0,0wƒÐ÷ ¢‡÷ Ú‡w Æê÷ ¦$‡Ä0,0w]Ð÷ |†46÷ †‡÷ ¦ðµ)0406 0 ð‹*±‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w ê Á�   ìì� .Â% ÷ ˆê ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ Èé ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡±ðµ=p!†Õ•^ú‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡ƒ  �D„PÄ5Rà ý†R”‡R”R”à üøð 8 ðµðµ÷ þé‡ðÖ*±‡ðÃ*±‡ðµ=D…÷ < ‡ð`p4°6÷ ÿ‡æf¦÷ �°6°4/‡ðµ=Á  ÷ ¢ðÕ@)ð 0 Ö 8w8÷ 0ÿƒ46÷ þ‡8ñÕ ÷ ®°eð‹*w®þÖ ±‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡ðµðe6p 4÷ 2þ†8÷ Z±‡÷ ø†81416÷ 2÷ ¼ñÅ ÷ ⇇÷ –ê†÷ &‡ð 8 ðµ ðµð �¡‡ð•Öÿ*±‡÷ :è÷ žç 4 6Ååà ÷ Hç‡ðe6p 4‡ð&*‡÷ ¢ðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ ü&‡f¦æ÷ Ð÷ H†ƒ‚„÷ ¦‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ 0ž8*w>ç141612Áepðµl2l0p‡w Èåðµ Á¥ðÅ)÷ üæ‡÷ ^æ ÕfU�Ä÷ ¾å…‡ðµÕ%  BA °`6p 4p`4¡ ¡õ%þÿð60 4‡46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ .æwæ¡ðµ)"ðÕ(.÷ Âðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ û÷ ìýðÅ(.‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ åU•Õ8UMw|äÅåà wÀä÷ „äBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�wHå8Áe2 ‡ÁeBÉ ð 8÷ Ú‡$&w ˜ðð*ðµ<S1 ¦à Ö KÊ ñU€ò ñU@ò æ÷ ă‚f&œ" ÷ €�†‚×'&�ÿ)×'&ëÿð&* ðÊ*Ä%0þðÌ*±‡NDÅ Å ý¦æ÷ *ƒ‚÷ ñEÿû±U‡÷ \‡÷ z‡÷ @‡w ÎïBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=w®ðÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡ð*ðµ;ðµ7ðµ#3w Dî *’$Ê ':æƒô �ô�…T•à ýƒñU@…Ê% D•ÄDÓÄ%][Ä%><wô÷  †wXññ1 ‡Ã ÄÄ%ñ,ñ,ñññ:4Š× ±‡w Šíð*DÅ Å ýæ¦Y…‚T¦fÃ(ÃeŠæ„ðµ<Ó•_‚ S•Ä ýó¥:ÿÿÓ•:‚ ƒ…¦æ& œ"& ΕæÏÿˆ‚4†×'&�ÿ ð&*×'&ëÿð¤ÿ*±*ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ à ‡à ññ÷ Þüð•Éÿ*‚ƒ‡w šìð*æ ƒ ‚æ¦×¢"wf)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷ <‡eÄ%w ñU\ñ5@ƒ âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ "ñ5@\ñU@ñ5€áÄ„íÄ ñ5LñUþ¥*ñUÄ Å‚öƒàÎàà Ê¥*Ã%C!.D`÷ *‡ƒ‚wòþÆeCÃ5€ñU‚Ã5 ±±± Ã5€± Ã5@±‡Æeð•Êÿ*±‡ðµ=õñU„Ä EÅe& ÷ RÄEÅe÷ Ö ¼Ó¥"Ý öŽwVþö Ë¥"  00àfA;Al1DATADATADATADATADATADATADATAƒ Ë¥"ö Õ”Ä Â Ä î ƒ  ê¶ Õ• Ä ü‡Â(Âe(¦Ê ññ1 ÷ `£(£(£££‚÷ X†� ‚÷ >âââââ‚:ƒô �ô�‚””à ý¡Á5Á ±‡ÂeCÃe¡‡æ¦ƒ‚ÃåJ„”Ä¥[Ä¥<C…Å`¥ ¡>C÷ ˆÒ¥,÷ ~… 4ÃB‚ƒ‚× *‚㨂 DÄe $ $ $ ÷ >‡ñz ñññ÷ ¬‡DEÅe     ýð•Ìÿ*1 ±‚ƒ‡ Ë•0‹¤þ‹¨‡—¢3‚¥÷ "÷ Ä ‹¨ ¥Ë”Ó”¦æ£˜Ä ýƒ‚‡‹¢‡Ê¥7‡¥‡æ5æ±ÿˆ‡ß%& Ëw Øè&Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë å¥.‹ Ä ÅæU¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë ‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±û&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡TaÞ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡±‡Ä Ä Ä ðµf÷ nèð >€5>õE€u ÷ Æç�‡ñ ± ‡w ŒçÁ(ñ D÷ òæð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwnÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)÷ (ö ‡÷ Lñ \ðµ#÷ ÿU†&œ* ðµ=ð¥æ•Øÿwô Å`p!2üƒÅàÅ… ÅEW!Åp0p2÷ ׇðµ#(ð PðÕ)÷ ˆþ†ðµ@#ð¥Çÿ*ð*fff÷ v±±‰‡÷ Rþ†&œ*wjðµ.÷ nB‡ð5ð(8ðe$8w2€æ•ÖÿA&À(Áe÷ Ú€†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA#ðÕ@))÷ è †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ š00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ ²‡0 @0 ð‡&œ*0 @÷ �åuÄ÷ öäðµ# ÁeB&B÷ èü°B÷ ÷ °•*±‡÷ Vå ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ ä0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6wÒäð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡w âÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w ž  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡141612Áepðµl2l0p‡ðµMðµ=ðÕf�Â(& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ðµ=&Îe0æ ÷ ÒâU• Â…à  ÂE•Õð >€ >ÍE€ðµ=ufÄ÷ âp†�ñ ± wã÷ îù ‡f÷ �†&œ*÷ Ôù°•*±‡÷ TâMÄw¼áðµ82Áe&À(÷ ,þ€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡ðµðe6p 4÷ ˜†8÷ úý±‡÷ Ά81416÷ 2÷ BñÅ ÷ h‡‡÷ ê†÷ ü‡&æf…Þ ƒ„…‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ âàU•Õ8UMw>àÅåà w‚à÷ FàBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�w á46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷  àw�à8Áe2 ‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡w ŒçÁ(ñ D÷ òæð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwtÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)ÁeB÷ ÷ ‡÷ Lñ \ðµ#÷ úþU†&œ* ðµ=ð¥æ•Øÿwô Å`p!2üƒÅàÅ… ÅEW!Åp0p2÷ ׇðµ#(ð PðÕ)÷ ‚þ†ðµ@#ð¥Çÿ*ð*fff÷ v±±‰‡÷ Lþ†&œ*wjðµ.÷ nB‡ð5ð(8ðe$8w2€æ•ÖÿA&À(Áe÷ Ú€†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA#ðÕ@))÷ è00ànAtyA§3eaek›’ †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ š00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ ²‡0 @0 ð‡&œ*0 @÷ ŠåuÄ÷ ðäðµ# ÁeB&B÷ âü°B÷ ÷ °•*±‡÷ På ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ ä0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6wÌäð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡w âÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w ž  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡141612Áepðµl2l0p‡ðµMðµ=ðÕf�Â(& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ðµ=&Îe0æ ÷ ÌâU• Â…à  ÂE•Õð >€ >ÍE€ðµ=ufÄ÷ üáp†�ñ ± wþâ÷ èù ‡f÷ �†&œ*÷ Îù°•*±‡÷ NâMÄw¶áðµ82Áe&À(÷ ,þ€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡ðµðe6p 4÷ ˜†8÷ úý±‡÷ Ά81416÷ 2÷ BñÅ ÷ h‡‡÷ ê†÷ ü‡&æf…Þ ƒ„…‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ ÜàU•Õ8UMw8àÅåà w|à÷ @àBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�wá46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ šàwŠà8Áe2 ‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡w ¸ðð*æ8Iðµ÷ Jœ*=‡ðµ€)98÷ :ñ ÕeBÕ && ð Îå¶ �ÕU€�Ä÷ |ð‰�†ð¥öÿ*ð¥åÿ*Æe ð*Nlv °°΋œ*ðµ.2÷ Äð „& ðµ#ðµ!ðµ)&ÎePæÂ(ÂeÊ ¦æ&æ•&Äð >€Åe >ÍE€÷ Øï†�•p�*÷ wàððµ82Áe&À(÷ ~€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡¡ðµ)"ðÕ(.÷ àðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ p÷ ÀðÅ(.‡w |ÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w 8  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡8Áe2 ‡÷ ìÿðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ r&‡f¦æ÷ <÷ †ƒ‚„÷ ˜‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ :0ž8*wÞî±ðµ=p!†Õ•^ú‡&æf…Þ ƒ„…‡141612Áepðµl2l0p‡,*ÿÿ±‡æ1ÿˆ‡46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ þíwîíÄÄ÷ TíU•Õ8UMw°ìÅåà wôì0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w >ì Á�   ìì� .Â% ÷ Æì ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ ì ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡ MOV #IE.FHE,R0 ;PUT FATAL HARDWARE ERROR ON STACK#ä CALL CERR ;LOG CONTROLLER ERRORåæ .ENDCç.è20$: CALLV PORT,STOMP ;STOMP THE CONTROLLERé;S6ê; RESET ALL STATES EXCEPT C1.REC,C1.R2,C1.UMR,C1.CONë; +ì BIC #^C,(R3);+í BIS #C1.FAT,(R3) ;MARK THAT WE DID THISOî MOV R3,R0 ;GET THE CSTO-ï ADD #C.OLHD,R0 ;POINT TO THE C.OLHD QUEUERð;$ñ; DEALLOCATE ALL PIOPS FROM C.OLHDò;H#ó MOV R0,R1 ;COPY THE QUEUE HEAD.%ô MOV (R1),R1 ;GET THE NEXT00tzAãÁAl1DATADATADATADATADATADATADATA PACKETEõ BEQ 50$ ;NONE LEFTR)ö30$: PUSH <(R1)> ;POINTER TO NEXT IOPL+÷ BITB #IP.FAK,I.PRM+11(R1) ;IS IT A PIOP?Rø BEQ 40$ ;NOPE, CONTINUE!ù PUSH ;SAVE R0 AND R3 2ù CALL @QRMVA ;REMOVE IT FROM THE QUEUE ;GM112"û POP ;RESTORE R3 ;**-1ü CALL PIOPDE ;DEALLOCATE ITIý POP ;RESTORE R0 þ40$: POP ;RESTORE R1 ÿ BNE 30$ ;GET ANOTHER%50$: MOV S.QST(R4),R2 ;RESTORE THE6 MOV (R2),R3 ;/*Q.CST*/ ;RESTORE CST ADDRESS TO R3;EO; TAKE ANY IOP'S WAITING FOR UMR'S OUT OF THE UMR WAIT QUEUE PUT THEM BACK INXN; S.LHD. CHANGE THE PRIORITY TO INSURE THAT IT GOES AT THE BEGINNING OF THE#; QUEUE, AND CLEAR THE C1.UMR BIT ;CA  BIT #C1.UMR,(R3) ;WAS THIS CONTROLLER WAITING FOR UMRS? ;**-2O  BEQ 80$ ;IF EQ NO!  PUSH ;SAVE R2 AND R30<  MOV @UMRWT,R0 ;GET THE HEAD OF THE UMR WAIT QUEUE ;GM1122  BEQ 70$ ;IF NOTHING, SKIP THIS SECTION ;**-1) MOV R0,R1 ;COPY THE QUEUE HEAD TO R1T&60$: MOV (R1),R1 ;GET A WAIT BLOCK BEQ 70$ ;NONE LEFT 2 CMP 10(R1),R4 ;WAIT BLOCK FOR THIS CONTROLLER? ;..(SAME SCB) BNE 60$ ;NO, TRY ANOTHERN8 CALL @QRMVA ;REMOVE THE BLOCK FROM THE QUEUE ;GM112> MOV 6(R1),R1 ;GET THE IOP ADDRESS FROM THE WAIT BLOCK;**-1 ;PKW109 9 .IF DF D$$DSK&DU$CHK ;IF QUEUE OPTIMIZATION ;PKW109G ;PKW109R= MOV I.UCB(R1),R5 ;MAKE SURE WE HAVE THE RIGHT UCB ;PKW109 , CALL REQUE ;RECONVERT THE LBN ;PKW109 ;PKW109,% .ENDC |³s–,?M?M…5 W 2` ’TITISYSYSYTISYSYOVŽÄÀ0Àø`Žj¬”Œ 0ÀÄÀ0Àw � €À5B`Á € ø€‡w�2€/  Á  „ À  …   À5@À ƒ ø   ‚ àà �€ öö Ä  @‡! à � ü€‡ ‡& ÷ ˆÿÖ ‡æ÷ ~ÿÖ ‡f€�€ � £üÁ À Á ý�‡f�€‘�À ü@�‡w € ‚� ”Á ý€‡æ3ÿˆ‡¦f�Þ ¦æf�Þ ¦æ&f�Þ ¦æ&ff� Þ …„ƒ‚�‡¼00ãÆAyA§3eaek›’Êwäü÷ ÷ ®÷ *÷ .÷ jæ÷ Úæ¦ æÿˆÖ ‡¦æ÷ 0Î÷ 0À¬ðµ Žæ÷ Î÷ Î÷ �Ö ææÿˆ–%އ& & æiÿˆ& ÷ ¢ÿæ3ÿˆ‡÷ hÿw*üfÁ„Áíh € ƒ@f¦æR ÎeV÷ æûw`F Æe�‡wúû‚ €ÔÁ„Áí*  ƒ@f¦æ ÎeV÷ ®ûw` Æe‡wÄûÀ ÀeV� 6÷ Ž÷eê ‡€À ´ðµ À‡ ‡€À ´ðµ À‡ ‡f暀æ`œf& ’÷ ÷e|Æe�‡wLû‚ �@œ€ æ$÷ ˆþ—  —   @Ò€- æ,÷ jþ BÔ� B`€ƒm  †B † ¢€ � ÷ †È‹ € úB †É‹� úÀ‡ ‡f×-ê ‚æ„÷ þ÷åØ ÀÔ 7 Ò †7Ì ˆ�ÁŒ Áí„ pAÁíz pðt �‡f÷-  ¢ý‡æŒ÷ ÈýÁŸ� W ƒæ÷ ´ýÀ| ð-@  ÷ JÀl 7. À* 7" W W ÷ fÀF 7 ÷m  Åmø÷e, @�‡wöùÁæ@’À � €7 †,bø ƒ¦&Žà÷ "–%æ´÷ Ö ‡wÀùÀ¢AlAbÁeBÁeAbE ú‡ààld †7,v,†,‡0 bð‡w€ùÆå fNaÅeN!‡whC�× ‚×-r ¾‚æ„÷ –ü÷å` À\ 7 Z †7T H @Ó`@€ ÅEØ× ‡× #‚@�&÷ ´Åeg× $÷ Æ× %`‡× (]‚BÂmÄÅe�æŒ÷ üD�lÃå%à Çl&ææfÎe 9ñµæ”÷ ìû6¶v æææ Ža! ñµW,ÿÿÀ&÷ Âææf f ÷ Â÷6 ö ¶aÖ ÷ ¬–%Ö œ× )D�€ € € ÀEáÿ& ‘A�fø Åe–%†æœ÷ Lû�Æe ‡wú÷ÆåAÁmÆÅeCæ¤÷ "û BÒ @€àAlÂB`Žœ6ŠÎ5æ¬÷ òú DÜÄ5 f÷ €æä÷ ÒúÖ Ãe Ä5CClÄ5CÄ5 W,ÿÿæ´÷  úClÁ�bƒœ"× ‚ €ÜÎ5 Ä„`Î5Äe“ × D`À ä‹À ûæ&f+× f€œ&÷   –%)× f€œ&�&€œ&÷ ˆ Æe× vvæææŽa÷ Æeæ¼÷ æùÆe‡wˆö¦ ÷ ˆÀtðµæ4÷ ÀùÖ À^¬ƒ¬æ<÷ ¢ùÀBœf& œæ.÷ À(ðµ Â`ðµÂe ÜC ƒ ÜJ�ðÕÆe‡wèõ�ÁmÒBæD÷ 2ù @ÒÀ ¦à÷ N·Â÷mļ÷ ¼æL÷ ùÖ ÷¨¢÷m¦œÀ¢ðµ ,ÿÿæT÷ àøÀ†7lv‡wpõ�ÁmZBæ\÷ ºø@7Z·`VÀR ÜÁ57>7`:Á57.Á5&÷ æä÷ løÖ w÷e ‡À(7 "†6,b÷ ‡w õæ æ÷ Zv@`à‹þ€í… @ ƒÀæd÷ øÖ À� 7 Œ†œE ‚ÁeD‘¤ Ä úà ÀeçÀÖ ‡w€ôÆåæ÷ Þ6v ƒÀ6æt÷ š÷Ö À&l‚b¶¶`Âe ¶ †€’6 ƒÁ�`„€Ѥ À úÄ Âe‚båÄ æ|÷ <÷ÅewÈwaÄÅeÆe‡wÚóÄLÃFÁ‚DÄåCa@€ ÁEw *‚C †æœ÷ êö ë>þ ‡¦Â¦�€œ@    W  W W æ|÷ ¤ö÷en— à‡· h†·b €ÒÁ�`‚‡wFóæ …f÷ ”ÿv� C W!W! ‚mD„m„ ƒâ‹üæ„÷ 6öÖ €D!ÄÄ ’ŸŽ Ä ûƒ-„m„ †ŠüW!pÀÖ ‡ææ÷ ,ˆ�–%‡wvò¦ ¦ ÷ ‚ ��”Á ý–%‡w^òƒ ÀÀeÂE€Àmp7 Zô‡÷ b× ÿƒæ„€ÀmT7 >ô‡æŒ×-@¾‚æ”÷ dõ÷å.Á*À* w "†wÐ��� ·`÷-ƒ÷‡wØñ· ÁàÃ&ô÷ ìƒÂ— àù‡· âö† €ÒÀeÀEB †K€ ë‘À ýç`åwºw ºƒw´‡À¦œ‡æ æææŽa÷ <þÆe€‡æ æææŽa÷ þ €ÝÆe‡æ æææŽa÷ þ €ÝÆe‡ 00ãÎAÁAl1DATADATADATADATADATADATADATA ...!ÜèJ®î¼ÈªÿÿÔàìÿÿÊÊàààL'ÿlV RPT>ÑÌ„Üè„VÜèÜ覜¾ü¶Ö\Î ERLRPTHHHHHHHH~nv–æž&.Ž@^×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ T."ÿ L.À(ÿ D.V*ÿ <.„*ÿ 4.¸.ÿ ,.0ÿ $.Ü0ÿ : 3ÿ :Ê3ÿ :F4ÿ :À6ÿ üFîAÿ ôâš=ÿ ìâÊ=ÿ äâÜ=ÿ Üâ?ÿ ÔâH?ÿ ÌâT?ÿ Äf $3ÿ ¼r è9ÿ ´r æ:ÿ ¬~ ”;ÿ ¤~ 8@ÿ œ~ Z@ÿ ”~ &Bÿ ŒŠ ô6ÿ „– æ3ÿ |– Š9ÿ t– @ÿ l® `+ÿ dÒ `+¦Þ5Îe‡w ¾Á,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡wù 蜫ÿÿÿÿRÊ5¦ „Ê €‚Ê5ùà ÷ƒõ…2Å Å ÍUEÍ ø�‚‡ ". ¬RF ‡ÊEò ÊU ‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡&æ¦ff… Þ �‚ƒ„…‡æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w Z…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ XW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&æf…Þ ƒ„…‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡‡ !.Þ �!:"¢ � 3L F.f �l<´R:â$� Dü^Fv&�G°Rj(�G¤R^*� D”‚F¾-�´H vŽ.�´H°vš/�´Hxv¦0�´Hˆv²1�´Hv‚2� D¸FÊ5� D¬FÖ7� D´FR9�l<\î:F;�È?üúâ =�ÄB°î ?�ÄB¤îúA�È?” âZ D�\D  * E�\D° 6 F�\Dx B G�\Dˆ N H�\D  I�È?ÜâîL� 3Èr .Š P�è9¸f ~ S�è9< f r Y� 3„.– e� 3$.:m�!\ ® ".s�`+�º ¢ Ò t�ð+ ® Æ €�ð+à® º „�`+¸ ¢ ® ‹ÀJê "‹�ÀJTÞ ö ��ÀJÞ ê w¼âÀýÿ€í‚ €À À Á�a@`Å儃€ABÄ €À‡S” ùÅåÀ ñ¦&æ÷ þáÆe‡w>⃠‚ �Á5A’ÁEÿAö5 ÃeƒàÂåfæ÷ –á¦÷ Žá æÿÿ¦÷ ‚áNæ÷ xá€@Æe‡wÜáƒÃ5Â’Âæÿÿ¦÷ Pá@ ¦÷ DáB@A ަ÷ 2á@@PÃ5‹�‹Æe€ ‡÷5pðc÷ Äׯ˜ô A÷ èæE÷ÀŸ†ôÀ  ‚À l˜1æ÷ ¤äã7 8ðA÷ Îç÷ ºæ÷ Üï †æ÷ `æ,÷ ´ç÷  æ÷ Âï †EcEcÈæï÷ ˆææ÷ 6æ÷ Œç÷ žï †÷ nææ÷ æ÷ rç÷ „ï †÷ VæEcEcw¼ïwa¸ïÅeÖ Ÿ÷ <æœ÷ &™‡w!žï‡‡w˜ïA�@“À  !‚À l®1æNBÅe÷ ç¦÷ ôéeÅeW ÁW ÷ îæ÷ äîf÷ †qÅeW ÁW ÷ Ææ÷ ¼î ê÷ h÷ j÷ ÂÅe÷ >}÷ Œå   õ ~æ$H÷ r{÷ ¤}÷ "}Åeæ÷ å÷ \æ÷ nîw´îwa°îÅe _‡Á¤î÷ 0åEYÅeæ÷ Öä÷ ,æ÷ >îw„îwa€îÅe G†çÅeæ÷ °äwfîwabîÅe9Åeæòæ8÷ ö:÷ B7÷ "4÷ v1@Àm(îAÁí"îpðîEm"÷ J÷ ÷ n÷ pæ ÷ f÷ jæ ÷ rÖ ÷ Ræ ÷ Bâ÷ â ÷-ò<áæä÷ ,âwþ‡Àºí&÷ ÎèÀºí¬æ,÷ âÖ À¤íÁÌ00ãÖAyA§3eaek›’æ4÷ îáÀŽíœÀEÿ  Àßví€m?�ní‡ ¿m`í‡æ<÷ ¶á‡A�ÅeW W  ÷ Òä÷ Téæl÷ Œá· í ÷ ¶äW W ÷ ¦äæ÷ Dã÷ šéÎ÷ 8ã Ž÷  ÷ „é÷  æ÷ ã Ž÷ ü ÷ héÖ ‡×¯öðæL÷ áÀæðð¦ìw ìÁšìÁí’ìpCÃí„ìðÀ~ì7vì·vì÷mnìpìEÅmfì‡Åe÷ ä÷ ìAAcBEEbæ÷ ŽâE †…w<ìwa8ìÅeÖ ‡Åe÷ ÈãÀ&ìBlA……bæ÷ VâE B!†Ã5AAeA! †Ã5 ÷ �ãÀ&ð÷ ~áñEÃ5æEbäB!‡W#‚æT÷ ,àÖ w¼ëwa¸ëÅe÷eèï‡Åe÷ Dã÷ :ëÀœëAlBEEbæ÷ Ìá…A!†× ƒEcà øA!‡W"æ\÷ ÌßÖ w\ëwaXëÅe‡÷ Þá û ø ‡ ƒ ‡ ‚EcEc‡æd÷ †ß‡Æåf÷ ¤æÀëðµæ”÷ dßÖ Àë,ÿÿ0 vÅe�Åe÷ pâÁ úÂÜê„Äe2# Y†öÅ´êÅeÎÞ1@ÀmžêÁ²êlCÃm¦êÀ¤êlöCœ× ƒæœ÷ ÞÞ¦¦æ& Nœ÷ &à6 À5Æe ÅeEcÆeÎå·#xîʆö5 W#ƒ÷ Êá÷ Üé6ö5Â*ê„ÄeŒl ¤÷vÝ>îÀê1, ‡ðÿÿÅîéÅe�ÅeEcÁ ûEcÆe‡f�@Àå À lò1÷ ²1÷ Né&÷ \*æú÷ 2é W  f÷ >æ ÷ èÝf÷ Ðf÷ z ÷ � f÷ x f÷ x Ö �‡wrÚ÷ äèà ÷ Òè— Â¦÷ ¾æÀ€m ƒæ÷ †ÝÁ`ަf÷ žçÆe‡w8ÚÆå÷ Œè— ÂÄ„a¦æÿ&÷ ÈæŽ÷ dævAÁ`Žf÷ xçΦf&& f&æùÿ÷ ÷Æe‡wÖÙÂ& —-Ž`÷ (è÷ "èæ÷ æ€À`Å À À À @!ƒæL÷ ÊÜÖ Î5f¦¦æ÷ @–%fæ÷ Æe‡€€ € € €m&¦ÎEøÿæ& ÷ ìö÷ ŽæÆe‡w,ÙÆåææ 2& ææ Žaæûÿ÷ \öÄ€$  Ä  Ä  Ä ƒ  € À€m"'€€ € € Á �a@`¦ÎEøÿæ��m$@€ € € €m*&fÎEøÿæ& ÷ HöÆe÷  öÆe ƒ ÖÎ&æŽa÷ àåÆe‡w\Ø—- ÷ ðæ÷ êæ ƒ Ãåà Çl"2À5Â5  À5ø€` † ‡Áf÷ tåÖ ‡w$ØÆå÷ xæ× × &‚Á�aææf÷ °äÎæ¦÷ ¤ä ±, ±,±,‰"†Ã ƒ Æe !æ÷ äB…`Î÷ äD` D … †Ò‹ü … D †Ñ‹üR¤ð†Ã ƒ Ö  €Àå ‚À l*2æD÷ ˜Úà à  à à à à Áf÷ |äÆe‡w×@A %  †`M M`å @ A Ä ö‡wøÖ÷ w@ABC% % % % ‡ †`M u u U`M u •`M Í`Åå@ A B C Ä é‡w�Ö   ¯M u @ A  ‡á� �  ò‡wfÖ  Â@¯M u u u @ A  ‡á� �  î‡wNÖf   ¯@ A D E !‡Äà… Â ô… ‡wÖÄe&&&&  Â@¯N v v v @ A  ‡Àà�  ïÆe ‡@aP P P ‡wÐÕÆåƒÁ × Á × Á‚ææ¦÷ `âÎf÷ ã× €œ÷ `Ñ•-€œÀ „œaÀe32”””Ñ•-Ñ•1Ñ•9€’÷ 4à Ñ• × €œ÷ Ñ•:€œ÷ Ñ•:€œ÷ Æe‡¦æ ‚ Àå ü€ƒÃe/Ñ�Âe:‘�ƒ‚‡wêÔÆå€ Àå  ‚À lZ2æÔ÷ Ø1ÁÁ Á ÁÂÁÁ ƒ ÷ 8�ææÿf÷ ZáN&÷ `Æe Áà-Áð2‚ ÷ ¢Æe‡&× ‚à æœ÷  × × ÷ ã × ƒ÷ ¶âf&&¦÷ XÆe„‡wÔæ¦ Î ÷ ªá‚ƒ€’ÀEðÿÀe0 9ƒÀe� €Ò€ € € € Àe0 9ƒÀe�‚ à ä–%‡ —  ÷ <â× ƒæ¤÷ üÖæÉ Ö ‡wºÓ¦)�€Àå@ ‚À l‚2æÔ÷ ÐÖV÷ úá÷ ôá ƒC É@6÷ æá œp21Šææ/ö5æœ÷ ”Ö1  ‚‚ ÷ ²á÷ ¬á @¡D C À ü QñP íææ÷ ‚á ææf÷ fàÆe ÷ \á&÷ Tß À Ž ÷ 6àÖ –%‡wÔÒÆåÁâå€Àå ‚À lŒ2æÔ÷ öÕ<BCw¼å÷ 4á 4†Â2—-†æœ÷ ÐÕ„ÄåÀ @`ÁÁeBw„åæææŽa÷ "ßö ö ö € ‚À ÁàBÆe€œ&& Ž’æŽ`÷ ŽßÆe‡ ’’’*F`’˜Bfl°rx‚¤ª°¶æ &06<BHNlrrrrrx~ˆœ¢¬BJJJJJJRBXXXXXX` "(JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC  &&,Z<`ABCDEFHJKLMNPRSTUV 4‚ž ÿ ëf ¸3ÿ ëf ì5ÿ ëf :8ÿ úêr ø<ÿ òêr ä>ÿ êêr ,?ÿ âê~ <ÿ Úê~ zBÿ Òê~ ŽCÿ ÊêŠ h3ÿ ÂêŠ =ÿ ºêŠ F=ÿ ²ê– ¤8ÿ ªêö ÀJÿ ¢êö äJÿ šêö ÈKÿ ’êö àKÿ Šêö L00ãÞAÁAl1DATADATADATADATADATADATADATA¦)æææiÿˆ÷`ß÷’ß÷ L × ææŽaæŽaææö7÷ Æe Î Îö8æ¦¦æ æú7÷ Æe ‡—-8æææ8æ æú7÷ ÞÆe ‡æÔ÷ 4Ó–%‡wØÏ¦)€Àå°À l8æÔ÷ Ó,÷ <Þæ÷ (Ü÷ × æÜ÷ îÒÎæŽaæŽa¦f÷ Z—- ÿÿ6 Φ ¦÷ âÜÆe–%‡w\Ϧ)€ÀåP ‚À l8æÔ÷ ’ÒXæ÷ ¬ÛCÎ÷  Û6v÷ ަ¦¦æ÷ øÆe †ÎŽaæŽa÷ ðÖ 6 6 Φ¦ ÷ F&÷ Óæææ˜÷ 6ÜE÷ (&÷ Ó÷ ÜÖ =÷ &÷ ’Îæ÷ .Ü –%/æ¸æº÷ Vδæ¶÷ H ‡ 7 ~ÝÀváðÅ ÷lÝÀ`Ý ÷ ^Ý 7 XÝ‚÷-NÝP݃7 LÝN÷ –ÛÆe–%‡wBÎæ æ÷ ’ÚvA�m@€íá‹Å øƒ „ Å )�@W¤.À ûW¨.Ö B‚펦÷ Ž –%@€àÀ æN`÷ t Æe–%Ö À Ö ‡w¨Íæ æ÷ øÙvÂJ8 Ê ƒ ÁÔE �„@S¤ À úÄ ÂeéÄ æÜ÷ ŽÐ–%‡w>Í� D„m @àW¢ � ø@à BÔÂå0— ‚ææ ÷ ÞË€`–%íÀ‡ ‡f€Àå€ ‚À lj8æÔ÷ Ðk÷ FÛæææ¨÷ *Úw®Ûyæææª(æææ¨!æææ¬÷ Û7„Û÷ øÚæææ®÷ ÜÙwfÛwdÛPæææ°÷ ÂÙGææ`8÷ ×-jÜÿÿ7 bÜÎæZÜ÷ ÀÙÎRÜæV&÷ äËÆe -ææ÷  ÙÎæd8&÷ ÄËÆe÷ nÚæææ–÷ RÙÀÄÚÁ5À5À5@ ƒw¨ÚÆe�‡CTL>SY:ERRLOG.ULBLB:[1,6]LX:[1,6]  Œz¼ nCOMMANDINPUTOUTPUTUSERREPORT&8.848<8B8RPT>V2.00ŠÂxP4&B âÿ &åFØ@ÿ åFîAÿ åâ´<ÿ åâº<ÿ åâ?ÿ þäâz?ð‹*±‡ð*‡0Š+æ1ÿˆÅ(Åe à ÷ @ß%ÿÿ&ïp’*wÀÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ œÿ8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ ÆÿU•Õ8UMw"ÿÅåà wfÿ÷ *ÿBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�w¶þ8Áe2 ‡141612Áepðµl2l0p‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡ðµðe6p 4÷ ¬ÿ†8÷ Bÿ±‡÷ &†81416÷ ÿ÷ žþñÅ ÷ Äþ‡‡÷ xþê†÷ T‡w ÒãÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w Žã  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡ðµ82Áe&À(÷ <ÿ€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ Püw@üw ¨á5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ Žœ*AdBbAÁepÂ& ¦fƒÂÁ ÷ b– –‡ÁPõµ aA”Aíf@pnp÷ XC*8Ö‹Á ÷ "88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ ŽõÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw Ìßõ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ 5fµ fˇðµ ÇÈ•÷ ô‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ PDlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ ¶½•8 †õ¥öÿ*Î2>Î>‡w ŽÞõ 8µŠjDl@÷ °T”ÔÀeBTŸ8œ5l@÷ ¸‡@Á(ñ D÷ žÁeB&÷ x‡÷ ‡& ææ©ÿˆ@ð•#÷ `& æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡wØÂ€À ´ „Ü Ä5æÜ÷ ÆÃ ƒ`˵÷ÿÿÎÒcÄ5˵æÜ÷ ØÅ�@÷ \@œ*  öÿæÌ÷ ¼Å÷ÿÿ–ÒwŽÒ€¦¦È –%Ä58Á¢ÒÀ @`„œ1ñ‚ñ ÈVð„° °ð$ æ ÿˆ÷\Ò,Ò÷ t¾æÌ÷ >ÅÀ�FÒ  öÿæÌ÷ *ÅËÕþVþüÑ×-öÑÿÿËÕ‡f�ÀÐЕ Е f¦&÷ hÁÁeÆe÷ÐÕwÕÀÖ÷ DúÁŠÔ÷‹Õ÷Õ¢ÑæžÑæþÔæV÷ .ÁÆe÷ÿÿ†ÑñÕ �‡ÿ DÛR`Dÿ <Ûv00ãæAyA§3eaek›’hDÿ 4Û¦´Hÿ ,Û²´Hÿ $Û¾ Dÿ Û¾<w^÷  †wRññ1 ‡Ã ÄÄ%ñ,ñ,ñññ:4Š× ±‡æ¦ƒ‚ÃåJ„”Ä¥[Ä¥<C…Å`¥ ¡>C÷ ˆÒ¥,÷ ~… 4ÃB‚ƒ‚× *‚㨂 DÄe $ $ $ ÷ vý‡ñz ñññ÷ ‡DEÅe     ýð•Ìÿ*1 ±‚ƒ‡ Ë•0‹¤þ‹¨‡—¢3‚¥÷ "÷ Ä ‹¨ ¥Ë”Ó”¦æ£˜Ä ýƒ‚‡‹¢‡Ê¥7‡¥‡Â(Âe(¦Ê ññ1 ÷ `£(£(£££‚÷ Èþ†� ‚÷ >âââââ‚:ƒô �ô�‚””à ý¡Á5Á ±‡ÂeCÃe¡‡Ä Ä Ä ðµf÷ ¶ïð >€5>õE€u ÷ ï�‡ñ ± ‡w øÖð*DÅ Å ýæ¦Y…‚T¦fÃ(ÃeŠæ„ðµ<Ó•_‚ S•Ä ýó¥:ÿÿÓ•:‚ ƒ…¦æ& œ"& ΕæÏÿˆ‚4†×'&�ÿ ð&*×'&ëÿð¤ÿ*±*ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ Zý ‡à ññ÷ &ð•Éÿ*‚ƒ‡w Öð*æ ƒ ‚æ¦×¢"wf)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷ ¶ü‡eÄ%w ñU\ñ5@ƒ âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ "ñ5@\ñU@ñ5€áÄ„íÄ ñ5LñUþ¥*ñUÄ Å‚öƒàÎàà Ê¥*Ã%C!.D`÷ –ü*‡ƒ‚wòþÆeCÃ5€ñU‚Ã5 ±±± Ã5€± Ã5@±‡Æeð•Êÿ*±‡ðµ=õñU„Ä EÅe& ÷ RÄEÅe÷ Ö ¼Ó¥"Ý öŽwVþö Ë¥"  ƒ Ë¥"ö Õ”Ä Â Ä î ƒ  ê¶ Õ• Ä ü‡w ôÓBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=w(îÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡ÿ ‚Ù‚¸Hÿ zÙŽ´Hÿ rÙš´Hÿ jÙšºHÿ bÙšÀHÿ ZÙšüHÿ RÙšIÿ JÙ¦´Hÿ BÙ²¾Hw ¬ÙÁ(ñ D÷ äÿð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwtÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)ÁeB÷ ÿ ‡÷ Lñ \ðµ#÷ ÿU†&œ* ðµ=ð¥æ•Øÿwô Å`p!2üƒÅàÅ… ÅEW!Åp0p2÷ ¤þׇðµ#(ð PðÕ)÷ ’þ†ðµ@#ð¥Çÿ*ð*fff÷ „þ±±‰‡÷ \þ†&œ*wjðµ.÷ nB‡ð5ð(8ðe$8w2€æ•ÖÿA&À(Áe÷ &õ00ãîAÁAl1DATADATADATADATADATADATADATA€†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA#ðÕ@))÷ Nô †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ Hó00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ Tý‡0 @0 ð‡&œ*0 @÷ 6òuÄ÷ œñðµ# ÁeB&B÷ ôü°B÷ ý÷ Tô°•*±‡÷ üñ ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ Æð0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6w@ðð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡w `ÕBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=w”ïÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡ðµMðµ=ðÕf�Â(& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ðµ=&Îe0æ ÷ NðU• Â…à  ÂE•Õð >€ >ÍE€ðµ=ufÄ÷ ~ïp†�ñ ± wHïÄ Ä Ä ðµf÷ †ðð >€5>õE€u ÷ Þï�‡ñ ± ‡÷ ºÿ ‡f÷ �†&œ*÷  ÿ°•*±‡÷ 8ðMÄw ïðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡w `ÕÁ(DB‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±DÂ(Âe(¦„Äe$2ƒÃeäÿæÓÏÓ Ó(‹ÿˆ‡Ì%[]Ì%<> ƒ ÷ „팂1 >‡f&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡w ôÙð*æ8Iðµ÷ ¶œ*=‡ðµ€)98÷ õ ÕeBÕ && ð Îå¶ �ÕU€�Ä÷ Dô‰�†ð¥öÿ*ð¥åÿ*Æe ð*Nlv °°΋œ*ðµ.2÷ Œô „& ðµ#ðµ!ðµ)&ÎePæÂ(ÂeÊ ¦æ&æ•&Äð >€Åe >ÍE€÷  ó†�•p�*÷ löwpów ØØ÷ ‚‡ðµ)ðµ÷ Jõ8C÷ $ð¥öÿ* ðÕ)ð ð*w$óð•öÿ*ú÷ ì÷ ¦ôõ‡ðep p ‡÷ „è‡ð¥#ðµ=Ä E”W¡9ƒÅ¥^éð•³ÿ*ÐÅå0ùà Å`à à CaÄ ëÃåCƒ Ôà ðµ=ðµ÷ X 00ãöAyA§3eaek›’ð¥ð 0Àð•Øÿ*§ð¥ ðµ= ÄEÕ¥^Ä ûA¨ð¥ æÂe@ÃÎà÷ Þƒ߇÷ ðµ=� ÁEpÓðµ2ðµ!)8ÂeEÅ`l0Å …à ì0‡„ û0¡/ &l0Ä ü„…`pÄ „löÿ06°ôÿ4p 4÷ vóðp°æÄ ƒðÎà÷ 8ƒ ƒ÷ Vá÷ ù†ð•Øÿ*Á`‡ðµ)wªæ÷ \óƒ‡æCàƒ#ƒÎà÷ <Î ¦÷ Èÿ‚ð†– ‡DàÄ ‡ðµ@) ð 6ðÿ?0ðÅD)‡ƒ  �D„PÄ5Rà ý†R”‡R”R”à üøð 8 ðµðµ÷ Øð‡ðÖ*±‡ðÃ*±‡¡ðµ)"ðÕ(.÷ ìñðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ ¼÷ ðÅ(.‡÷ ¬ñðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ n&‡f¦æ÷ Úð÷ žó†ƒ‚„÷ °ð‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ ñ0ž8*w¶ï±ðµ=p!†Õ•^ú‡0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w ÆÔ Á�   ìì� .Â% ÷ Úï ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ ï ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡f¦æ&f ÅÂ…`Á Á ý°* �… !†ƒ”×  ×  Ä õ× ñƒ× ÿî× "D × a‡× z‚Ä ÃE Ñ�ÝEp(p°à„… †ƒ”× $ú× 0‡× 9ôƒ× A‡× Zîƒ× _ë× :� � ‚„… V†ƒ”× [È•]× <È•>È‹8 … |†ƒ”× %ú× *÷× -‡× .ñƒ× 0‡× 9ëƒ× A‡× ZåƒÈ ‚ … |†ƒ”× 0‡× 7÷ƒ× *ô× ,A ïlÈ jÁ hŠ„ … q†ƒ”× "A øÁ ö „ #A … c†ƒ”× $‡× %÷ƒ× *ô× 0‡× 9îƒ× A‡× Zèƒ× _å× .� £ß … †ƒ”× .× ; … f†ƒ”× 0‡× 9‚� õ]× -Á X� í× *Á QA æ × ,Á D× = Á >È5 B>ÈU °(wZþ× /*Á .�Á … .†ƒ”× $× -‡× .ƒ× 0‡× 9ƒ× A‡× Z ƒ× _ × :Áÿÿ   DÚ× " Á … †ƒ”³á°0±…„ƒ‚�‡f¦æ&fæ ÈE¢¢^Á`Å÷ úÄ ÈUQÅÿÿ÷ æÄ ÈUQ ÷ ÔÎË€ÈUIá ÈUà `¢Ãe á ÉáccD ÷   Ä”¡%¡*¡.A ÈU Å ï0 0 ��W ,ÈUw@W /D ÷ DÎÄ cBDaW£-Á�Á N�… W¥N W¥OD!†B�“Á N�{É …CÃE€€C¥ÃC¥D!‚Ñ ó�ñ‹þÿ€D! ΋ñ5 Ñ þÁe߃“ƒ Î�à UÂåÔpRpR„“pBCÃ5D ‘ƒ à KR΋KBAÁE�—­:ŒDœ0CŠÄŠý ÷ fÎÄ ÁeëB”—   ¡ƒŠDÒ� CS•ÄŠÞü ƒÐ÷ ¦ ‡W¤†CÅ E Cs ÉΕŠ …„ƒ‚�‡f¦¦)& 6 l(¢*¶„„íƒ †�”Å EÅ 'W "Å =N íÎ ëW :+W =Å 1 Â#W ,W /Å %W %W *ÑöÕ€ÍÄ W <ÈW [ÄW >W ]¾„ v�¢°(°* 6 ƒ…Æe‚�‡w öÖÁ w ìÖÁ& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡÷ &÷ &÷ �’•’•€‡@Á(÷ pâf€  Àe ÀeÉÿÀe Àe ‡÷ ö‡wÇ€À ´õµ æä÷ "Êõµ 7 öÖDM¦¦÷ ÁèÂÜ ÷ ’ ‡ÁèÂÜ ÷ ˆ†7*zÕ–%:ÁºÖ¸֎¦÷ È÷ ¦Öw Ö·žÖÁeB$&÷ 6ÆeÁ*aÉ‹w.Õ÷ 4w"ÕÉ‹&÷ ÚÖ @È õ• À‡ ‡fÀÙðÅ ñÕ1 4@È5æô÷ 8É7 øÔ�‡ÀòØðÕ ðÅ ‡÷<ÈÔ÷<ÀÔ7 ÆÔ7 ¾Ô7 ¼Ô7 ´Ô7 ªÔ‡w¤Å‚ ƒƒm 7 ÌÕ€À ¤:û�àw¸Õ÷ ´Õ·²Õ7 ®Õ€À ¤]û7žÕ·àšÕ·˜Õ÷”Õ·à�Õ·ŽÕ‡wVÅÄЃ Ôœ\Ôœ]Á^ ÷ ìßÔ•:óµ;ÀTÕ&æNÕ÷ $@�&f&÷ ÎÄÁH÷ ºýÁJ÷ °ýÁL÷ ¦ý© ý„ Ô•.ÁN÷ Žý© ý„ Ô•;ÁP ÷ b߯e7RÔ‡w’Ä€À ´@ñµ È ñµ B €÷ ‚ò‹*æì÷ ¸Ç1Š ‡÷:ÓzÓ7 4Ó‡fÀf×ðÅ ðÕ Á `p� ðÅ �‡þÐþÐÓþåЇÿ Þî@ÿ Þ ÄBÿ Þ ´Cÿ üÝ @ÿ ôÝN \Dÿ ìÝZ È?ÿ äÝZ ä@00ãþAÁAl1DATADATADATADATADATADATADATAÿ ÚÝúÊBÿ ÒÝ ÎBÿ ÊÝ ¾Cÿ ÂÝ ÌEÁeBÉ ð 8÷ äÿ‡$&w Þð*ðµ<S1 ¦à Ö KÊ ñU€ò ñU@ò æ÷ Œÿƒ‚f&œ" ÷ –€�†‚×'&�ÿ)×'&ëÿð&* ðÊ*Ä%0þðÌ*±‡NDÅ Å ý¦æ÷ 4ÿƒ‚÷ ñEÿû±U‡÷ ÿ‡÷ þþ‡÷ ÿ‡æ5æ±ÿˆ‡ß%& Ëw $Ý&Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë å¥.‹ Ä ÅæU¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë ‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±û&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡TaÞ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡±‡æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡ð*ðµ;ðµ7ðµ#3w 2Û *’$Ê ':æƒô �ô�…T•à ýƒñU@…Ê% D•ÄDÓÄ%][Ä%><w^÷  †wRññ1 ‡Ã ÄÄ%ñ,ñ,ñññ:4Š× ±‡æ¦ƒ‚ÃåJ„”Ä¥[Ä¥<C…Å`¥ ¡>C÷ ˆÒ¥,÷ ~… 4ÃB‚ƒ‚× *‚㨂 DÄe $ $ $ ÷ vý‡ñz ñññ÷ ‡DEÅe     ýð•Ìÿ*1 ±‚ƒ‡ Ë•0‹¤þ‹¨‡—¢3‚¥÷ "÷ Ä ‹¨ ¥Ë”Ó”¦æ£˜Ä ýƒ‚‡‹¢‡Ê¥7‡¥‡Â(Âe(¦Ê ññ1 ÷ `£(£(£££‚÷ Èþ†� ‚÷ >âââââ‚:ƒô �ô�‚””à ý¡Á5Á ±‡ÂeCÃe¡‡Ä Ä Ä ðµf÷ ôð >€5>õE€u ÷ fó�‡ñ ± ‡w PÛð*DÅ Å ýæ¦Y…‚T¦fÃ(ÃeŠæ„ðµ<Ó•_‚ S•Ä ýó¥:ÿÿÓ•:‚ ƒ…¦æ& œ"& ΕæÏÿˆ‚4†×'&�ÿ ð&*×'&ëÿð¤ÿ*±*ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ Zý ‡à ññ÷ &ð•Éÿ*‚ƒ‡w `Úð*æ ƒ ‚æ¦×¢"wf)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷ ¶ü‡eÄ%w ñU\ñ5@ƒ âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ "ñ5@\ñU@ñ5€áÄ„íÄ ñ5LñUþ¥*ñUÄ Å‚öƒàÎàà Ê¥*Ã%C!.D`÷ –ü*‡ƒ‚wòþÆeCÃ5€ñU‚Ã5 ±±± Ã5€± Ã5@±‡Æeð•Êÿ*±‡ðµ=õñU„Ä EÅe& ÷ RÄEÅe÷ Ö ¼Ó¥"Ý öŽwVþö Ë¥"  ƒ Ë¥"ö Õ”Ä Â Ä î ƒ  ê¶ Õ• Ä ü‡w LØBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=w€òÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡ÿ ÚÝ `Dÿ ÒÝ* \Dÿ ÊÝ6 \Dÿ ÂÝ6 bDÿ ºÝ6 hDÿ ²Ý6 ¤Dÿ ªÝ6 ÄDÿ ¢ÝB \Dÿ šÝN fDw ÞÁ(ñ D÷ äÿð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwtÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)ÁeB÷ ÿ ‡÷ Lñ \ðµ#÷ ÿU†&œ* ðµ=ð¥æ•Øÿwô Å`p!2üƒÅàÅ… ÅEW!Åp0p2÷ ¤þׇðµ#(ð PðÕ)÷ ’þ†ðµ@#ð¥Çÿ*ð*fff÷ „þ±±‰‡÷ \þ†&œ*wjðµ.÷ nB‡ð5ð(8ðe$8w2€æ•ÖÿA&À(Áe÷ ~ù€†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA#ðÕ@))÷ ¦ø †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷  ÷00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ Tý‡0 @0 ð‡&œ*0 @÷ ŽöuÄ÷ ôõðµ# ÁeB&B÷ ôü°B÷ ý÷ ¬ø°•*±‡÷ Tö ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ õ0@°Æe° 6ðµ=ðµ00ãByA§3eaek›’#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6w˜ôð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡w ¸ÙBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=wìóÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡ðµMðµ=ðÕf�Â(& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ðµ=&Îe0æ ÷ ¦ôU• Â…à  ÂE•Õð >€ >ÍE€ðµ=ufÄ÷ Öóp†�ñ ± w óÄ Ä Ä ðµf÷ Þôð >€5>õE€u ÷ 6ô�‡ñ ± ‡÷ ºÿ ‡f÷ �†&œ*÷  ÿ°•*±‡÷ �ôMÄwøóðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡w ¸ÙÁ(DB‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±DÂ(Âe(¦„Äe$2ƒÃeäÿæÓÏÓ Ó(‹ÿˆ‡Ì%[]Ì%<> ƒ ÷ „팂1 >‡f&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡w LÞð*æ8Iðµ÷ žœ*=‡ðµ€)98÷ Zù ÕeBÕ && ð Îå¶ �ÕU€�Ä÷ œø‰�†ð¥öÿ*ð¥åÿ*Æe ð*Nlv °°΋œ*ðµ.2÷ äø „& ðµ#ðµ!ðµ)&ÎePæÂ(ÂeÊ ¦æ&æ•&Äð >€Åe >ÍE€÷ ø÷†�•p�*÷ ÄúwÈ÷Á(Áe(BA ‡&À(Àe(H°0 €‡Á(A ‡fÁ(± �‡Á(A‡fÁ(±�‡Á(AD‡&À()¦æ&pDCÄe(Âe$´fæÒ•[Ã÷ ,Ò•,ƒ“÷ "Ò•]ƒ…Ãe(Âì‹0 >„ƒ‚€‡ÃEÿà à ÅÃ5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡w (Ü÷ ^$‡Ä0,0wù½÷ \ø†46÷ Ї÷ ^ðµ)0406 0 ð‹*±‡w ÔÛw¤öw�öð 8 ðµ ðµð �¡‡ð•Öÿ*±‡÷ 8ö÷ Ôö 4 6Ååà ÷ ~ö‡ðe6p 4‡ð&*‡0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w Û Á�   ìì� .Â% ÷ ,ö ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ lõ ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡¡ðµ)"ðÕ(.÷ \öðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ 00ãBÁAl1DATADATADATADATADATADATADATA¼÷ ðÅ(.‡÷ öðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ Œþ&‡f¦æ÷ Jõ÷ ø†ƒ‚„÷ õ‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ Šõ0ž8*w&ô±ðµ=p!†Õ•^ú‡ŽMÆå ÷öÿ–ßæŽaæ?ÿˆ÷ èÌæü÷ ²Ó€ ·lß÷ hß·`ß÷\ß\߯e ‡f€Àe?ÁE?@Àm>ß ‡& fæúÿ÷ žÏ6ÎYÿˆ÷ €Ìw`ßÀ �‡¦)7 àÞ@ À ‚ &÷ ÞÙÖ f÷ LÚÁÆÞ CÜÃ5æl÷ ÓÖ  1†÷ ¢Þæt÷ ôÒÀ”Þ¬æ|÷ àÒBÂmjÞò/tÞæÄ÷ ÈÒÀdÞ2,æÌ÷ ´ÒÀPÞ1, ‡æÔ÷  Ò@�ÀåÀ lŽ91 ñ v#À@`"ÿÿoBl ± †Hl fÀ@`"ÿÿ`È Èÿÿ[Hì XÀèÝ1RñÿÿNÃ5æÜ÷ *Òf÷ ÄÙæä÷ Ò2 Ê ŽŽ`f ÷ Æ1 /Ã5æÜ÷ îÑf÷ ˆÙæä÷ ÚÑÖ ÄD`#ÿÿæì÷ ÄÑC Êàòàc¦Îe æ÷ pñà 1# ‡Ìÿÿ–%BÃ5æÜ÷ ŒÑf÷ &Ùæä÷ xÑÖ C× ÿÿæì÷ dÑÄÝô "N €mÀe Â`Âe ƒà€ D 6’6Š �cH’@ù��Àà‚ Ä ïÅe–%‡¦)w°Ü÷m”ܪÜÀ¦Üð æô÷ îÐÀ”ÜðzÜÁxÜBÂílܰdÀe ÒÂeÂE`€ †0 ÀeùÅeñÿÿÎ@’ÀåÀ lž9Ä#Ä Ä& æ N`æN` ÷ ¦Ó÷ œÛ&æþÛÎe æöÛÎe÷ 2ÙÄ6 Æe ÷ ÁäÛ@ÂB` €ÒÀE ‘ Ð@œ ƒ Î5W¬ ‡  À€ ÃEö @Ü`ÀÀ‰ʵ B`€Àm`ÛBÂí`Û°÷ œ½ÀRÛðµÁ� CÃEð ðµ, †æÜ÷ ŽÏEcÀ Ûðµl ¢÷ –%‡Æåæ4Ûæ ÷ *À(ÛÈ 0 ö6`þÛ· ÛðÎÚÂÌÚ°€Àm¸Ú6öe€6œÿÿ6ŠÃ´9Ë À Ôv �þ„P¤> Ä ùþ Ãeã²2 Æe ‡f÷ äÕÄ\ÚÀZÚðµ ,ÿÿæ÷ ˜ÎÖ Äm:ÚÖ CCmÅeC!x†@Àm ÚÁmÚBbæ@�&÷ œÊõµ€2€2–%Åe–%ßC!W†BÂe ñµ €ÒÀeÀE€`ñµ‚b�ÂeñµÂe@œ q­  æ÷ âÍñµááñµæ$÷ ÈÍ€€dõµ……Ec@!‡æ$÷ ¨Í÷ ÚÐæ÷ ÀÖÀ À � Ö  æ&f÷ ¨×ÅÙN÷ –ÓEmÆe‡Z–Fø *R" TITLEERROR¨9®9ÿ äã~ ”;ÿ Üã~ Ú=ÿ Ôãê ÖJÿ Ìãê ôJÿ Äãê ØLw®É€ Àåp ‚À lv?æÔ÷ ò̇÷ Ø×-Úÿÿæ& ÷ $×-ææ÷ ×�ÁeŽfæ‚Ø÷ V€à ‚æ¤÷ ¦ÌÆeá•.ŽfæZØ÷ 0Î fŽà¦÷ äÈÆe–%‡ ÷ 0ÔÀ Áf÷ xÖÖ ‡w É‚ � €@à Á ¦æ ÷ pÈÃe0É�Žæ ÷ TÈÆeç æ¤÷ Ì@‡w°È÷µÅÛWÀÈ×÷5À×À ÷®×¶×*÷®×&· ª×÷-¦×¦×5ƒ· œ×À’×.À-’×+ƒ'À ÷|ׄ×ÁjÛñ æ´÷ ¬Ëw j×ñ ÷ `×7 `×÷ X×÷ P×ÁL×À@×@ †÷Õ1Û7 8×÷µ'ÛR÷ ,×2÷ ö÷µÛI7 ×ÁxØw xØ †É @@bÀeÁE· üÖñ÷-òÖæÖ ÀâÖ7 êÖƒÀäÖ7ÞÖ ÷5ÒÖ÷ÎÖ÷ÊÖÆÖ÷µµÚÀ²Ö7 ²Ö÷5¨Ö÷-¦ÖžÖƒ÷-œÖ”Ö†÷Õ‡Ú÷µ�Ú%Áèׂ֠@@bÀeÁE ÷wÒ×À@`7Æ×wÆ×7`Â×É ÷-º×²× ƒæ¬÷ |ʇ÷ÿÿ¤×7 ž×7 ž×‡À*Ö7®Ù7 ¸Ù‚÷ ²Ù÷Õ Ú‡æ2ÿˆ÷ nÃæÌ÷ 8Ê÷‹hÙæÌ÷ *Ê÷.L×÷VÙH×÷-ÞÕrÙ÷nÙ:×÷4×6×÷m0×0ׇwÈÆ¦)�W W ‡W ‚ÃÃÅf?Ân?ææ¦÷ HÓÎæf÷ 8Ó6 ÁåÁ Glz?@�A P@�A P@�A P@�A H@€  †À@�T�T�TˆRô@„BˆDQ„BˆDQ„BˆDQ„BˆBQ€  ã‡6 v�âµ µ µ µìµ µ µìµ µìö õ Zõ W¶ õ R¶ O�bu u u µlu u µlu µlØ×  ƒ—- ƒæ<L…Âf?„÷ jîÇ�æ,@—- ‚@÷ šà ¹D÷ ¾îµ�æ4.—- ‚@÷ vàMDC÷ úîö Φ f÷ tÒ–%€ À À À � N&&Nঠ÷ ´ëÆeæ$÷ ÈÆe‡wÜÄÅf?ææf÷ €ÑM u u u —-#Ä÷ ºîÎff÷ úÑÆe ‡wvÄæ÷ æÐCÎ÷ ÚЀ † S¤  úÎ÷ ªÑÖ ‡ €&2††††††††††`Þ$°b00ãByA§3eaek›’÷ &÷ &÷ �’•’•€‡@Á(÷ ôäf€  Àe ÀeÉÿÀe Àe ‡7 ˜Ø÷ŒØ�ØÀŒØ ð‚Ø0à÷xØxØ÷x؇wXÉ Áh؃ Á C,†DAùÁ "BÂà@— ƒÀ@`°HÄ 70Ø ñÂ&Øw ØÊ �"‚‚ú‰J@‡wþÈ�EÂB`& Å Ž Êê×JJàÀä× wÜ×"üHlÄÄeD †D„bÁ1qàÀ¬× ƒÉ¢×wž×È "†ú Hl!plHB… ‡Î5‰Ö ‡fÁZצ÷ þ÷Ö †fæF×Nà÷ –%À �‡wÈæ � B‚m @Àí×€ bÀ ý·m ×Á×÷ äÁ×÷ Ú ƒðôÖ0à ��lÁØÖÎØÖNà—# ‡ ±À HwÀÖÖ ‡w¢Çƒ ÷ tÖ#ÄÄ`Ì æ÷ ˆÖ Ë‹lÁ�`€€b@ †f÷ AbÖ ö÷6ÖÀ’€ �7*Ö‡w\Ǧ)À€m6 €0 ÃHÖ4À&È‹+ÅÅlÄDaEcÀ€m!†Âa €Ô�f”6Š À R¤À üb¨¦&÷ (–%‡cáþ  ÃËþ ¦÷ ¨Ö –%‡w®Æ€ IæÄ÷ ÜÉ@�l@l„44Â` �ÒÁeÁE�`BÁa CÒÃeÃEC`Ábcƒ †@ †±¬±ÁeÂeðc@ †æÌ÷ XɇwòÅ�1 ÂB` €ÒÀeÀE€`@@b€ †2 Âe÷‡wÈŃ ÃíâÔ‚ ¦÷ výÖ ‡¦÷ JÖ ÀÈÔ È û°à,†Á  7 ¤ÔÁžÔ·àšÔ–ÔÀ€ RÀ ýÀÀm„Ô‡wPÅÁ|Ô÷ TÀ 6,‡lw `ÔÁ^Ô÷ 4�&É‹÷ p †÷ ¶ß1 ¦÷ ,üÖ Øæ÷ XÈÓ‡@È ü‡wüÄ� Cæ÷ ’û Î÷ ”ü †Îô ÷  †Î÷ lûö ÷ HÎ÷ ZûæÌ÷ ðDZ„ƒÎf ¦f÷ Šò r&ñVÓ · PÓÆe‡f÷ „ÓÁ€Ów xÓ‚Aúw nÓ‡f÷ Ö ð�‡wDÄÀVÓƒ Á&1Ã-FÓ7@ÓÁ:ÓC"Aü ÄÁ� Á ýàpˆ!ˆ°l7ÓÃ-ÂÒwà¼Òwà¼ÒwàºÒEàÂ"Æ· èÖƒƒ(û‡„"ù†Jà÷‡w¾ÃÁÒÒ  Á @&È‹Ã|Òì Ä ƒAò ¦÷ šú2 Ö À‡ ‡f�@ðµ$&÷ rú1 Ö �‡wfæ)Á`Ò@Àe7 XÒ ƒ&ÎíPÒ÷ øòÖ ‡æ¼÷ rÆææfæ÷ W¬æÄ÷ PÆÆe@@ì À À À À vw¾Ñ7¼Ñw`¸ÑÀ´ÑÀe7 êÑ ƒ&ÎíâÑ÷ ŠòÖ ‡æ¼÷ ÆÃŒÑÄŠÑÄe÷ ‚ÑO†À|ÑÀ :†Áe!5†Å`ÎÎ`€÷ ºø÷ ²øÁÁ`‚ã‰�¨ ‚� ø€ 3 æ&fæD÷ Fs3 ŠÃeÄeÆeÂæ¦æøÐæ÷ ¶ ÄèÐÆe®÷ÞÐÑ–%‡f€ À ´ñµ ñµ æÜ÷ &Å@7œ"2Ò7Š/Ò÷&Ò·*Ò·&Ò7 $Ò7 "Ò·Òæ ÿˆ÷ ¾æÌ÷ æÄ÷‹îÑæÌ÷ ØÄ�‡÷ øæææD÷ æÎ÷ xÌæ ÷ °Ä–%N÷ ¼ùÎææD÷ ¾Î÷ ÊÌ÷(ÐÎ÷ bÆÆe‡ÆåAÁmÐBæ¤÷ fÄ‚Bl—¢æ¬÷ PͶ`ÂeÅeDDeD!†÷ hÇû¶ I†¶¶`Âe…ÎÃäÓÁÃv!‡æ´÷ Ä÷ 2Çf÷ &Å6À5Ö Ö ÁåC è†Î5ÀlÏÀ aÃåv!‡æ¼÷ ´Ã÷ æÆf÷ ÊÉÖ ÁeC ´÷šÂbÓ¦÷ žÍÀ Ï÷  ÉÀÏÀ aÆe‡f÷ �ÊÀ Ïð³æÜ÷ RÃÀøÎ÷ èÊæä÷ :ÃÀàÎp0l BŽN`& ÷ üù€àN÷ <ÊÀ¶Î l 1l AÅeÁ B÷ &ÆŽ÷ ÉÁ ø–%‡DISPATENTRY÷ &÷ &÷ �’•’•€‡@Á(÷ ¼ëf€  Àe ÀeÉÿÀe Àe ‡wHÐÆå@·Š æææö@÷ öÜ7l €XÀ  ‚À lAæt÷ XÓÎÎÎÎ ÷ „÷ Æe‚N�PÁ* Á-$ ƒ7  Â*CÃí ö5L� Ä æf÷ <Ý Â ÁàŽæ&÷ >Ï–%ÎÜ æÖ &æ A¦f&æùÿ÷ ÈìÆeR‡w~Ïæ ƒ×-¤ ‚ÂÂå€À  Á” ÷ ê7– ÷í� � ,Áˆ Áe@…Äö@÷ ùÅö@Ä÷ ¢øÎe0—#9ƒÎe¡“÷ T ë÷ P è÷ L å÷ H âÀD @à7@ ÷e@: w4 Ö ‡wâÎÃö@À$ ÄÄm Ä †Á÷ 6þÃeø7 ÷í  ‡wšÎ€À ´ BÜ Â5æÜ÷ ÜÑ—-÷ „Â5(@œ7ÖÞ÷ÎÞ÷VÒÞ÷’ÞÎÞ÷AÄÞ÷ÀÞ÷ ¼Þæ ÿˆ÷ ¾ÊæÔ÷ ˆÑ÷‹�ÞæÔ÷ zÑÂ5AñNÞñV@÷ ¨ ñ‹*æÔ÷ RÑ7 .Þ‡wèÍ÷ öÜ÷ N· ðÜÁêÜ÷ æÜ@ÀmàÜ7 Ö܃÷ .ÂøÝ7 ôÝÁÈÜæ÷ ÿÖ Á ù·ÜÝ÷¬Ü¬Ü÷ ¤Ü‡fÁÊÝfæVæÐ÷ XÍ÷†ÜˆÜ7 ˆÜ· €Ü÷• $Ý÷¢ÝÎ÷ ¼þ· bÜ7 ’ÝÎZÜ÷ ,7 †ÝÎ÷  þNæÐæV÷ ÍwlÝ÷<Ü<ÜÆe �‡wDÍæ÷ ØÀ 2ð /BlA�lD b `Ã… †�`á‹À ü¦÷ –ÐÃ5Ž÷ òÐ Î÷ þaÖ äÖ ‡¦)€Àå` ‚À lAæÔ÷ èÏ"ææ00ãBÁAl1DATADATADATADATADATADATADATAæ÷ 4Ö ÷ úÚ&æŽaæŽa÷ ”ØÎææ Ža÷ ÌÙÆe –%‡f¦)÷ ÆÚ÷ ÀÚ&æŽaæŽa÷ ZØÁ @€m6 æ”÷ fÏ–%Φ fŽm÷ xÙÆe �‡÷ОÛÀß&÷ ·B 7 @ 7 ÜÖ ‡f�W¬æ,É‹æ4÷ Ï÷ w` ÷  w’ 7Šý÷môö�‡w¬Ë¦)…W! æ÷ ò×6vÖ ÷-ÊÊr†÷ ¨÷-¾¾lÄ¶Ä  Ã0Áª¦æ ÷ *ÊÀ`Âå0w –‡æ<÷ €Î–%· „Á€ CÜÿÿ× 9‚× 0â†w lw>· `À\ Üÿÿ× C W FÅ ¼W Eë÷88´× D(@À l$A7$ W FæDzW Pu¦¦¦÷ ‚ÆepW F¦÷ L�W Pb¦÷ �Ö a× FZW C — „%†Â · ʆ÷ –· ÀGƒæ ¦Îí´æúÙ÷ þÉ7òÙ·¤W S æL5·`Ž×-Š„‡æT,æ ¦æÀÙ÷ ÄÉ7¸ÙÆe•W L €ÀŒ÷ $Á ü‡W P ÷ B÷ ×-67 ÒØwXþæ<÷ Í–%‡w¬ÉÁw 0† BÔ— ! w ‡æ<#W¢!"· ò— ‡— ~÷ƒ— ÷eØ÷EÒ×-΄ƒæT¿� Ù· ÙÑæ\÷ ¢Ìw¨‡wDÉÃ6Ø ÂÔ� �w`”×-�„‡æT� ƒæd÷ j̦ææ fæ¶Øæûÿ÷ ^æ7ªØÆe ‡wòȦ)Àä×ðµæt÷ 0ÌÀÐ× Üðµ  `ðµ �ÒÁeÁE�`Bƒ’œ  æ�׿¦÷ nÆe2 æv׿÷ ^ôÎ÷ ìÔNæ¦÷ BÆe æJ×  À>×6æŽa¦÷ ¬–%æ„÷ |Ë–%‡w.È‚Ã|ƒm „) �ÔW ‡W ~‚· ^ W ÷eP÷EJ×-F„ƒæT �‚×· ~×Á æŒ÷ ËÄ ×ö ÀÀí�æ &æR×÷ VÇ7J×÷üÆe‡æT÷ ÞʇwxÇÀxÖœ�B †æ|÷ ¾ÊBæÀXÖ& œ¦÷ ÌÔÀFÖœN¦& œ& ÷ üöÎ÷ ªÓ·`�×-Œ„‡æT÷ pÊÆe Žfæ¾Ö÷ ÜÆ7¶ÖÆe‡f& ÷ hûÎ÷ jÓ×-œÖРΔÖÎåÐæÐ÷ œÊÎ8÷ (øÖ Ö �‡ÀtÖÀåÐ&æÐ÷ xÊ–%æ÷ ø÷ÐTÖ7 Ö ‡CÅeAEcB÷ Í÷ ¬Ôæ÷ ŒúEÅeB!†÷ þÌÎ÷ Úú÷÷ dÿEcÖ ‡æ f÷ ÖÐBEmÅeAAe÷ ÌÌA!‡æì÷ ŠÉÖ ÷ ºÌ÷ PÔÎLÙÀHÙ¦÷ $ú÷ @úÀüÔð VÀÕÅ`¢Ec÷ x÷ èÔx÷ ~ÁÞÔ@œ& #‚ÂB`÷ úùʵ ʵ ÷ Þ÷ FŽ÷ ÞùÞ÷ 8À ÔTœ Ôƒ Ñò ñµ ÷   ñµ÷ N÷ öºæD÷ ´ÈµÂFÔƒÂeƒ`ƒ '†Ž÷ NÏÂeÀ6Ôðµóœ W  ‚÷ Pù÷ @Ž÷ DùãW ÷ �ÝW Ú÷ à×÷ øýÎ÷ jÑÅÚÓEmÅeEc–%‡fÅÒÓÅeÀÊÓðµ7 ¼Ó Åew²Ó @ÓÀeÀE@aæ÷ ùÀ˜Óðµ AAeA!†÷ ËÎ÷ òø÷Ö �‡wlÄÀlÓÅeðµÅeAAeæNÓœ¦÷ ë÷ ìÒ †W#EcA! †÷ ÀÊÀ*ÓœN& ÷ ®Ö –%‡wÄÆåÀ ÓÅeðµÅeAAeBEcæêÒœæÃ�æœæ÷ ÀêÎææ Ža÷ ¤Ð  ƒö ö ö EA! †ö Ecö ÷A!‡…W# ÷ ÊÀˆÒœNœf÷ Ö Æe‡w‚ÃÆå‚aææÿ¦÷ 0Ð6OÎ&Îe÷ æÐ�”Е[„�mÁ Ã/ƒ Áå ü€Ð�× 0ð• ÿÿCÃe:Ð�Е:ƒÁ/� Ãå ü€P�W 0ð• ÿÿÁÁe:P�Ä Е Е Е Е]Е �Á �”Á ýÎ÷ (÷Ö Æe‡. & "*ÿ xÜê ÖJÿ pÜê ôJÿ hÜê ØLw ÒÜ÷ ¨n‡832cðµd& & & B öŠð 2OðµðµΕ ¶“ðµ à N”à Υ$¶“Ε Åð 2ƒ2Åà‚Î¥ Ž�Î �æ÷ HƒvÂ Š‚ ƒ“Ε f÷ Lƒ�ׯe÷ Tð¥óÿ*÷ VÆeð•Øÿ*w:ðÅ@)0,÷ ¨÷ ìò‡ðµ ÷ *‡ðÅ)÷ ðÕ)ðµ( ð¥ Ó ðµ=Ó ð¥Ó lð 0Æl‡ð  ƒ÷ ¢†ð¥øÿÿ÷ 0¶‡ð¥/ð ðð¥Ãe&ðµ=ÅBaÀ@aÁ ÷ ÜÁe0b�Å ÷ÂeÒ€ð¥Áe@Ã÷ Ô^‡÷ ÆW‡ðµ=‚ ÂE°8óÅ Ãe…l0Å Åà & ì0‡„ l0ù…Å`pÄ Älöÿ06ðôÿ4p 4÷ ªðep ðÕ)ì‚wnþðµð¥Ã% ÷ z†,÷ l÷ ‡÷ ~w>þ÷ T‡÷ J†w‡B æƒàƒ#ƒÎà÷ Î f÷ Ìÿ� ‡Â`‡ð¥öÿ*÷ 8w(±ðµ)0406 l0ì° ‡ð‹*±‡ð*‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡ðµðe6p 4÷ ¬ÿ†8÷ 汇÷ –†81416÷ ú÷ ñÅ ÷ 0‡‡÷ äê†÷ ć÷ Øðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ Ž&‡f¦æ÷ Œ÷ T†ƒ‚„÷ b‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ 0ž8*wtþð 8 ðµðµ÷ fþ‡ðÖ*±‡ðÃ*±‡ƒ  �D„PÄ5Rà ý†R”‡R”R”à üø±ðµ=p!†Õ•^ú‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡141612Áepðµl2l0p‡,00ã&ByA§3eaek›’*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ òU•Õ8UMwþÅåà w’÷ Bðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�wÂü46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ XüwHü8Áe2 ‡0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w ªÕ Á�   ìì� .Â% ÷ ˜ ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ ˆ ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡0Š+æ1ÿˆÅ(Åe à ÷ �ÿß%ÿÿ&ïp’*wðú÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ Ìúw Ðæ …8€5Žm&¦& ŽŸ÷ X6Æe"¶¶à…-õ�� €€ Cà P¤à üÆe€ ¶ ö „ÞÆeÏ Ö ‡f€�6¤Á ûÀ  �‡f€�6¤Á ûÀ  �‡€Àå0 ‚À lžAæÔ÷ øÒ‡ææææ÷ Ö ‡÷ ‡÷ ˆ‡fæ÷ æÛŽæf&÷ ´Æe�‡wpÏÆå�ææf÷ ÜÎæ÷ ÐÜB’ Žæm÷ ΂ ‚ €`Bœ „l´ABœ„`À ɵW¬ƒÀ Àe<Í€QÂBaÊÃCa 5 ÷ ä÷@œæ<÷ ¬ÍDœaæ÷ œÍÄ@ D @ D ÀE& Nœ€ÎUÿ¦€e& Nœ€ÎUÿ¦ D a„"K `@#†Š ‹ IJA÷ h Æe‡w|ÎÆå…æ÷ ÈÚCÄ` 5 5 ÷ (Á5 5 5 Îæf÷ –Û@Æe ‡æ„# †—¯- ÷ @ †÷ 0Àà÷ ÒŽ €¬ÿÿ:è÷ À †÷ ÷  †À Ö ‡÷ 5�!Jפ-GÀÀ`!BÀÚAÂBa Š�’� J�È¢ð¬ð¬ÀeÁþAàí þA&A�#€’œÍAB ‚Ãeפ-÷ š lƒÀål d† �À5W­W­‚À‡ ‡÷ d5� !†!×¢ פ:÷ F5� <†! ×¢ פ: ÷ (5� <†À‡ ‡fÀàפ úà …‡¦f Àà ÁÔÁå0�W à ¦æ ÷ tË@`–%ꀅ‚‡wlÌÆå�fæ=ÿˆææ÷ üÙÂP”�  üÆe‡fÆå�ææf÷ Ù1Š1Š1ŠÎæf÷ –ÙÆe�‡w.ÌÆåÁ�aææf÷ ÌØÎæ÷ ŠÙEIJA÷ 2 ñeKÉå€kW"€”‡ñ Å …aDîA÷ T EÄ®A÷ ÐNæµ÷ $ËÀ À ÃeQÊ�Næµ÷ Ë m‡Àåm�’� J�Áµõʵ :ƒ€ Á@`CœÍA ƒÃ�Àà� ør�2�Å …aÄ„aÃ÷ øôÅ…aÄ÷ Žô²�Ž æ<÷ ˜Ê2�Žæ<÷ ’Ê2�Æe‡÷ êþ¦÷ 0õÖ ‡f÷ Šü ‡æ÷ X×ÎææþA÷ JØÆe÷ pûÀ �‡÷ :þ÷ \û‡÷ ˜þ÷ \þ÷ Nû‡w¼ÊÆå ÷ ÙÁ�aææf÷ T×Îæ÷ ØÍÀÂBaÊi*ÃCaËÉöva> ÷ Zóö5 ~ K J Š ‹ ¾ D÷ øÆe‡w6ÊÆå€Àå� ‚À lBæÔ÷ LÍx÷ vØ6À5€ÿæÄ÷ 4ÍæææŽawf÷ taæ÷ 8Ö6Îææ íæ÷ ÖCÎ÷ Ö ƒ€ÂÀ S¤ À úŽ÷ àÖ8÷ ø×÷ ò×÷ (Øæ÷ ÖÕvÀ`€`W ÿƒæ¬÷ ˜ÌÎf÷ ØÖN¦&fÎàæŽ`æûÿ÷ ~ææ¦÷ ÌÈÆet¦÷ æÖ n÷ „× æ÷ lÕ  ƒƒà�`Îæ;æ÷ PÕD÷ T× Î÷ <Õ €à£ ¦N`f&÷ (øÆeÎæ÷ :ÖÈ7ÂBàˆˆ 2÷ J×�æ÷ øÔB`À ƒ¨À ûÎ&f÷ ÞÕÆeæ÷ ÎÔΦ÷ èÕ€  BÔ— a‡— z‚Âå “�À ó–%Æe‡w<Ȧ)& & —-æ÷ €Ôv6v` †æ´÷ DËÖ æ÷ ^Ôv6v`÷ ZÖ Î÷ BÔE`„D`€ ƒæ¼÷ ËÖ D!"•€6 � ûÄ €€#ð� À ÃD! •° à øâˆ õƒ ó€ êææ÷ þÔHàÆe ‡wRÇ÷ ÒÕ æ÷ ºÓ  @ƒƒC`B`ƒ 6 ÀÔ ù $ö -‡ .ðƒ 0‡ ;êƒ A‡ Zäƒ _á a‡ zÛƒ [ƒ פ]ûÒ "ƒ פ"ûÉà À@àƒ Îæ÷ NÔÈ–%‡w´ÆÆå�‚ƒ€À À lB@€à€æT÷ ÐÉæf÷ ÔŽææ f&æûÿ÷ ¼ãÆePææB& ææ Žaæûÿ÷ šãΦ÷ R@À À À !‡æ\÷ rÉÆe€ € € ƒÀ`&&ÎEøÿæ¦÷ äÎfæ Ža÷ fÓÆefæ¦÷ *ææ ææfæ¦÷ æÖ Æe‡wÌÅÆå æŽa—-æd÷ èÈ—-ƒæ„÷ ØÈ�‚¶¶mƒ?  ;Å&æ(÷ BÄ / DÔ!0‡!9‚Äå"!A‡!Z‚Äå@!a‡!z‚Äå`!$Ä !.Ä!  a –%Å Çö ¾ƒæ¦ ¦÷ TÒÆe‡wîÄÆå ææ.B& ææ Žaæûÿ÷ âÅ…aƒ$‚&6 à  €Ò -v  00ã.BÁAl1DATADATADATADATADATADATADATA  +à ‚ êà æl÷ ºÇÆe à ( „Ô!0‡!9‚Áå0 !A‡!Z‚Áå7Áv ‡æl÷ tÇ„÷ *íD÷ @îà ×Î5 @P P P H Ä÷ $îæ¦f÷ bÑÆe‡wìà ‚� æl÷ Ç—¤ Á ö ƒ  �ÔÁå0�W æl÷ ôÆ&æ ÷ ~Â@`–%à ꇀÀå  ‚À l0BæÔ÷ ÀƇ÷ êö‡÷ ÷‡÷ F÷‡ææ÷ êÐ 0 0 ÷ ‚ø‡÷ †ø‡æ& ÷ †øÖ ‡÷ Ê󇿿÷ °Ð 0 0 0 –%‡w Ã÷ ì&÷ ì„÷ 섇wÒ   ¯M u @ A -‡‚#‚ã� í�  í‡wªÂ   Ã@¯M u u u @ A B -‡ ‚#‚ã� ‚ í� � à å‡wrÂf   ¯E D @ A s ‚‡ ‡Àâ� Áì ï… u‡&@eH p p eH p eH c„‡ (.€Q€–˜<[y˜¶Õô1OJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC 28Rˆððü r¢¼Â¶°¤2 4:FV@Pw’â€À ´ BÜ Â5æÜ÷ Ôå—-÷ „Â5(@œ7Îò÷Æò÷VÊò÷ŠòÆò÷ü"¼ò÷¸ò÷ ´òæ ÿˆ÷ ¶ÞæÔ÷ €å÷‹ˆòæÔ÷ råÂ5AñFòñV@÷ \ñ‹*æÔ÷ Jå7 &ò‡wàá÷ îð÷ N· èðÁâð÷ Þð@ÀmØð7 Îðƒ÷ .Âðñ7 ìñÁÀðæ÷ ÿÖ Á ù·Ôñ÷¤ð¤ð÷ œð‡fÁÂñfæVæÐ÷ Pá÷~ð€ð7 €ð· xð÷• ñ÷šñÎ÷ ¼þ· Zð7 ŠñÎRð÷ ,7 ~ñÎ÷  þNæÐæV÷ áwdñ÷4ð4ðÆe �‡w<áæ÷ ìÀ 2ð /BlA�lD b `Ã… †�`á‹À ü¦÷ ŽäÃ5Ž÷ êä Î÷ þaÖ äÖ ‡ w û÷ ¨n‡832cðµd& & & B öŠð 2OðµðµΕ ¶“ðµ à N”à Υ$¶“Ε Åð 2ƒ2Åà‚Î¥ Ž�Î �æ÷ HƒvÂ Š‚ ƒ“Ε f÷ Lƒ�ׯe÷ Tð¥óÿ*÷ VÆeð•Øÿ*w:ðÅ@)0,÷ ¨÷ ìò‡ðµ ÷ *‡ðÅ)÷ ðÕ)ðµ( ð¥ Ó ðµ=Ó ð¥Ó lð 0Æl‡ð  ƒ÷ ¢†ð¥øÿÿ÷ 0¶‡ð¥/ð ðð¥Ãe&ðµ=ÅBaÀ@aÁ ÷ HúÁe0b�Å ÷ÂeÒ€ð¥Áe@Ã÷ Ô^‡÷ ÆW‡ðµ=‚ ÂE°8óÅ Ãe…l0Å Åà & ì0‡„ l0ù…Å`pÄ Älöÿ06ðôÿ4p 4÷ ªðep ðÕ)ì‚wnþðµð¥Ã% ÷ z†,÷ l÷ ‡÷ ~w>þ÷ T‡÷ J†w‡B æƒàƒ#ƒÎà÷ Î f÷ Ìÿ� ‡Â`‡ð¥öÿ*÷ 8w(±ðµ)0406 l0ì° ‡ð‹*±‡ð*‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡ðµðe6p 4÷ ¬ÿ†8÷ 汇÷ –†81416÷ ú÷ ñÅ ÷ 0‡‡÷ äê†÷ ć÷ Øðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ Ž&‡f¦æ÷ Œ÷ T†ƒ‚„÷ b‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ 0ž8*wtþð 8 ðµðµ÷ fþ‡ðÖ*±‡ðÃ*±‡ƒ  �D„PÄ5Rà ý†R”‡R”R”à üø±ðµ=p!†Õ•^ú‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡141612Áepðµl2l0p‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ òU•Õ8UMwþÅåà w’÷ Bðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�wÂü46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ XüwHü8Áe2 ‡0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w îó Á�   ìì� .Â% ÷ ˜ ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ ˆ ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡0Š+æ1ÿˆÅ(Åe à ÷ �ÿß%ÿÿ&ïp’*wðú÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ Ìú00ã6ByA§3eaek›’f€€ € € ÀEàÁ¾+ ƒ&Îå!÷ V&Î ÷ TÖ 7 @èæø÷ úÛÎÚ+÷ òÛN÷ ìÛŽ÷ LõÖ �‡Unimplemented error message-F-ÿ Äñº ð+ÿ ¼ñÆ ð+€À FA‡2MODSTART, Starting module for execution not found.%STANOTIMP, Statement not implemented.3STANOTVAL, Internal error - invalid statement code.LISTNOTLS, Group referenced in SEARCH statement is not a LIST.HLISTNOMAT, Too many expressions in SEARCH statement for referenced LIST.CLISTNOEXP, No expression in LIST for corresponding SEARCH variable.MPOISETMOD, POINTER variable is from wrong module in POINTER ... LOAD or MOVE.RPOISETGRP, POINTER variable is not from correct group in POINTER ... LOAD or MOVE.CPOISETSIZ, GROUP too small for POINTER in POINTER ... LOAD or MOVE.=NOTDYNFIL, Dynamic file operation performed on invalid group.AFILNOTEXI, Internal error - declared dynamic file does not exist.=FILNOTCTX, Operation requires that dynamic file have context.HDECAGAIN, Group in declaration already declared. Redeclaration illegal.JDEFCASELS, No match for control expression in CASE conditional definition.&DEFNOSTAK, Declaration stack overflow.8DEFSTKUND, Internal error - Declaration stack underflow.IDEFNOCONT, Attempt to access data in variable in group with null context.CEXEINVCOD, Internal error - Execution stack entry has invalid code.6MATDIFTYP, Values of differing type cannot be matched.6MATVALSIZ, Values of different size cannot be matched.@WRITEACCV, Attempt to load a value into a non-writable variable.=VARNOTDAT, Attempt to load data into a BIT or FIELD variable.0ACCUDFVAR, Attempt to access undefined variable.BÁAl1DATADATADATADATADATADATADATAATNOTEXI, Data declaration is longer than data.FINTVALSTK, Internal error - statement left information on value stack.?INCFORWRI, Too few FORMAT expressions in WRITE_GROUP statement.DSIGNOTASC, Parameter or message in SIGNAL-class statement not ASCII.:SIGTOOMAN, Cannot issue a SIGNAL during SIGNAL processing.ESIGTOOBIG, Message and parameters in SIGNAL-class statement too long.$CRASH, Control file requested abort.4DECGRPCTX, Group in DECODE statement has no context.?DECNOBIT, No BIT declaration corresponding to DECODE list item.;DECNOTEXT, No bit to text translation for DECODE list item.#FORNOTASC, FORMAT clause not ASCII.FORCLSNUL, FORMAT clause null.8FORINVDIR, FORMAT error - Invalid format directive code.DFORNONAME, FORMAT error - request to print a field name for a value.DFORNOARG, FORMAT error - Format directive missing required argument.9FORLINEOV, FORMAT error - Line overflow in FORMAT clause.=FORINVCHA, FORMAT error - Invalid character in FORMAT clause.CFORFIELDW, FORMAT error - Name too long for field in !DF directive.HFORINVDTY, FORMAT error - Invalid data type for output in !DP directive.JFORNOREAD, FORMAT error - Attempt to print a variable without read access.AFORFIELDS, FORMAT error - Field too narrow for variable to print.BFORINVVTY, FORMAT error - Attempt to output invalid variable type.GFORINVCHR, FORMAT error - Invalid character in string in !DP directive.@FUNDATNOT, Specified (sub)packet is not large enough for offset."SUBPKTSIZ, Illegal subpacket size.BEXEINVPOS, Internal error - INPUT file has invalid position value.PACKETSIZ, Illegal packet size."FILTOOBIG, File too large to read.CFILNOTVIR, Could not create virtual address space for module table.EFILINVMOD, Control file library has invalid module name table format.2MODNOMEM, Insufficient free memory to load module.'CONTROLFI, Could not open control file.ü+0,V,Š,È,-T-ž-ê-0.l.°.ô.8/t/º/à/&0f0¨0è0(1r1¶12X2œ2Ú23Z3¤3ð34R4œ4à45P5’5Ð56@6€6°6Ø67 7J7ˆ7¾78J8Œ8Ì89V9”9È9î9 :h:¨:î:*;p;–;Ì; X>¤>æ>*?r?´?Ø?@<@`@¤@ê@A€À Ž2‡COPRINVLOG, Attempt to perform logical operation on an invalid type.#CONWRONGT, Cannot concatenate type.;SUBEXTBIG, Substring extraction end element exceeds string.9NUMINVOPR, Invalid numeric double-operand operation code.#DIVZERO, Attempt to divide by zero.$MODZERO, Attempt to modulus by zero.%OPRNOTIMP, Operation not implemented.'RELINVCOD, Invalid relational operator.:BITFLDSIZ, Bit or field too large in extraction operation.8ASCIIBIG, ASCII literal quoted string too long for type.;BITTOOHIG, Bit number too large for specified storage unit.8RAD50BYTE, Cannot convert a byte using RAD50 conversion..BADDIGIT, Invalid numeric digit in conversion.>INVRADCNV, Internal error - Invalid radix code for conversion.-VALUETYPE, Value in expression is wrong type.,VALUESIZE, Value in expression is too large.3HEAPOVERF, Heap too small to hold value. Overflow. VALSTKOVR, Value stack overflow.:FUNWRONGA, Incorrect number of arguments in function call.HFUNFIELDS, Invalid conversion code argument to time conversion function.8FUNSTRSIZ, Output string from string function too large.DFUNQUOODD, Quote string in STR$QUOTE function must have even length.;FUNINVPOI, Invalid string pointer value in string function.DFUNNOTCHA, Argument to STR$CHAR is not in valid range for character.FILERREAD, File read error.FILERWRIT, File write error.FFILINVCOD, Internal error - invalid file code for specified operation..FILINTOPN, Internal error - file already open.FILERCLOS, File close error.:FILERSPAN, Records in f00ãFByA§3eaek›’ile are not allowed to span blocks.4MEMINIFAI, Memory allocation initialization failure.CMEMALLFAI, Memory allocation failure - insufficient virtual memory.ü+@,d, ,Ú,þ,$-J-r-®-è-$.^.Ž.Î.ü.*/^/€/¼/0@0†0Â01$1B1Š1º1Ø12J2÷5.ç—-÷ 0·š ÷ ~÷ t÷ ´÷->ç:ç†÷ –÷-4ëhÚ÷ Â÷ ò‡wþ׿÷ ìâÀ ð BlA�lB b€`Áe C †Î ¦f÷ n×�`–%õ7 ºæÖ ‡wÄ׿ 7 Ôçæ ÷ öô÷ ¬æ0÷ ¨æ-Îö÷ âôÎ6÷ rÛÁ¬çÁeV@Àe÷eœçN&æzæ÷ ^à•.N&æhæ÷ NÎ &Nàf÷ ôÖΨ÷ ”ôÆe ÷ °çw&÷ ¨çûÎŒ÷ xôÎD6÷ ÛÀBçÀeVÁŠçÂ2÷ Ðñ÷e,çÎX6÷ æÚÎZ÷ Fô÷-jçbç‚À`ç€ 6¶ ÀLçÀíJç€ 6¶ Îd6÷ ¬ÚÎ ÷ ôΨ6÷ œÚÎ÷ üóÎê6÷ ŒÚÎ÷ ìóÎø÷ äóÎ æ„æV÷ ,Öö  2æ÷ êÕÖ Å ÀŒæÀeVà ÁÂ2÷ ñ÷e tæÀpæÀeVà Ãm²æÁÂ2÷ øð÷eTæW!6!Î~÷ jó„ 6!˃–%–%‡wúÕ‚ � €@à Á ¦æ ÷ `ÕÃe0É�Žæ ÷ DÕÆeç æ¤÷ Ù@‡f7 Þåæ÷ óÎ ÷ øòÎ7÷ ˆÙÎü÷ èòÎô÷ àòÎ&7÷ pÙÎä÷ ÐòÎÜ÷ ÈòÎNä& æLäÎíBäæBäÎí:ä÷ 0Álèw l؆N@’&ff÷ ÁeÆeîÆe�‡w*Õ�@œ&æN`÷ ÊØW¬†Î5÷ îØÎ5÷ æØDÃlÃbÀÀeáÀ@`b‚m ö‡@’æN`÷ |ØW¢†Î5÷ ¢ØÎ5÷ šØ€À ´5÷ ŒØŽÎà÷ ¸ØÎ5÷ zØŽÎà÷ ¦ØÎä÷ ÐñÆe‡w\Ô7 ˜äæÎ÷ ºñÎÆ÷ ²ñÎZ7÷ BØÎ¶÷ ¢ñή÷ šñÎv7÷ *ØÎž÷ ŠñΖ÷ ‚ñΠ7÷ ØÎúâÎíôâ÷ <ØÎz÷ fñÂ*ãÁ$ã Á  Á � †Ž÷ BóN÷ í÷ òÎ@÷ ,ñÖ ‡æ5÷ ¸×€÷ â×Î ÷ ñÖ €‡w–Óæ5÷ �×� N÷ º×Î5÷ |×@&’Ž÷ ¦×Î5÷ h×ÎN`÷ ^×W¬†Î5÷ N×Î5÷ F×ÎN`÷ <×W¬†Î5÷ ,×Î5÷ $×ÎæN`÷ âÖΊ÷ vðBÂ2â@@là—  †Î5÷ îÖŽ÷ ×Î\÷ Hð–%@‡fÀâÈ ülÁôáÉ AüAl †@æ¨7÷ ¦ÖÎÌáÎíÊá÷ ÐÖw Âá ƒÎ°7÷ ŒÖNÎí²á÷ ¸ÖÎö÷ âïÖ �‡7 ®âæä÷ ÐïÎÜ÷ ÈïÎÌ7÷ XÖÎÌ÷ ¸ïÎÄ÷ °ïÎÜ7÷ @Öδ÷  ïά÷ ˜ïÀXá7 Rá†÷ ùÎ’÷ ~ïÖ ‡w&Ò‚ €æN`÷ øÕW¬†Î5÷ èÕÎ5÷ àÕD„lÃeÎ÷ ÎÕ×¢†Î5÷ ÀÕÎ5÷ ¸Õƒ× Î8× Î8÷ šÕÎ÷ ÈÕÎ5÷ ŠÕŽ÷ ºÕÎ5÷ |Õ@m N÷ ¢ÕÎ5÷ dÕŽf÷ àÐ÷ ŠÕÎ5÷ LÕÎÀ÷ ¬î€€b–%‡fæ 8÷ 2ÕΦ÷ ’îΞ÷ ŠîÎ.8÷ ÕÎŽ÷ zîΆ÷ rîÁ4äw fÓ†N÷ Áe÷Îh÷ TîÎ`÷ LîÖ �‡wØÐ‚À6Ó€í&Ž ÷ üÔÎ5÷ ¾Ô€œÀ  6÷ °Ô Ž’÷ ÞÔÎ5÷  Ô— à ‡· ¶Ò‚ÎP8÷ ŒÔŽÎåà6· ¨ß.‡· ¦ß+‚ÎX8÷ pÔÁœß@@l€ ‡AøÁ Îl8ÎN`÷ HÔW¬†Î5÷ 8ÔÎ5÷ 0Ô@@lbŽàÎ`8÷ ÔŽ÷ JÔΈ÷ tíÖ ‡æŽ8÷ ÔÎt÷ `íÎl÷ XíÎv8÷ èÓÎ\÷ HíÎT÷ @í΢8÷ ÐÓæúÒÎåæ÷ FÏ÷ ðÓÎ5÷ ²ÓÎÜÒÎíÔâæ÷ (Ï÷ ÒÓÎ5÷ ”ÓξÒÎí¸âæ÷ Ï÷ ´ÓÎò÷ Þìδ8÷ nÓÀÎÑÀ徎 ÷ ”ÓÎ5÷ VÓÀ¶ÑÀí|⎠÷ |ÓÎ5÷ >ÓÀžÑÀíf⎠÷ dÓ΢÷ ŽìÎÂ8÷ ÓÎ:ÑÎåà÷ HÓÎ5÷ ÓÎ8âÎåà÷ 4ÓÎ5÷ öÒÎ&âÎåà÷ ÓÎ^÷ JìÎV÷ Bì×- âàÎÎ8÷ ÊÒÎüáÎåà÷ ôÒÎ2÷ ìÎü8÷ ®ÒÎâá÷ ÜÒÎ÷ ìÎ÷ þëÎ ÷ öëÆe ‡ Free Module Current Start CALL Coroutine Conditional DO ... WHILE DO ... UNTIL WHILE ... DO UNTIL ... DO ENABLE SIGNAL SIGNAL_STOP &50585@5L5Z5h5v5„5’5œ5¦5Numeric String ASCII RSXtime VMStime Pointer Logical Ì5Ö5Þ5æ5ð5ú56&Error occured while processing packet The packet size is (octal). BSince this size would cause the packet to span the block boundary,@the following dump of the packet will end at the block boundary.$An octal dump of the packet follows:Execution stack dump:2Module name Procedure name Entry code Offset BlockDynamic memory allocation:(Type Size Mapcnt Name Ident CompilerTable Files  Error - overlap (bytes): Dynamic files:2Module name File name Code Size Recsiz Records Title Error Value stack: Entry Type Length Place OffsetHeap Module Unknown Unknown  Size Current Max usedGeneral Statistics:Execution stack Value stack Value heap ,Maximum heap used after garbage collection: Heap garbage collections: 00ãNBéxDl1DATADATADATADATADATADATADATAwÄÇwÂÇwa¾Ç÷e¶Ç÷ÔJ"÷ €‡w¢¸À¢ÇÁ`¬ƒ¬Â`A’ÁEÿÁ5 ÂeÁ5ÂeÁ5 €ÒÀeÀE€` Â`A’ÁEÿÁ5ÂeÁ5‚b·2Ç÷ ‡f÷-&Ç&Ç ‡×-�ÔJ‡7 Ç÷ $òÀ ÇœW ÷ èW ÷ Pâ�‡wî·CÅàÆÅe÷ j¾÷ |ÆAAcwÊÆw`ÆÆ÷ °w¾Æ ‡w¶Æ÷²Æ²Æ÷m¬Æ¬Æ÷e¤ÆÅ‡w²·DÀ–ÆbÅ`wˆÆw`„Æ÷ n÷ ¾ A!†Ã5BBeB!†Ã5 ÷ ð½À†Ê&÷ Þ»Ö ð…Ã5åEcãA!‡W#‚æü÷ Šº÷eTÊw&Æwa"Æ÷ÆwaƇ×-€ÀJ‚æ÷ ^º÷ånÀjðöÅÈîŇ×-ZÔJ‡æ ÷ 8ºÀJ7ÔÅ7ÎÅ÷e:‡fÁÄÅÀÂÅðµ ,ÿÿæ÷ ºÀ¦Ål÷˜Å’Åw`ŽÅ�‡æ ÷ ¾@�Åe  EcEcÖ ‡æ Åe÷ B¿À Ç¬AAeA!†÷ *¿ûæ÷ ŒÃ÷躰ËÖ S@Bl€l D°` N`¦÷ xá‰`±`C`¶ö`Ä º7!fË%ƒW¬æô÷ ‚»–% BÔ� €À`Àe ƒæ÷ f»Ó•'¦fæ÷ Ô·Ó•'Ó•,Ö Øà ƒ-Šû÷@ºË–%Ö ‡×¯úÊ ׯòÊ÷ D½õ‡÷ <½  ø ÷ &½  �  õ †7 €Æ‡Á¬ÊW¢ W¢ W¢ æü÷ ƺÁew Žºî‡‡¦÷ ޼w@ÆÀ<Æ74Æw2Æ÷m*Æ,Æw(Æ÷mÆ"ÆÅÆÅeÀƬ÷ ¨½÷ *Âæl÷ bºÖ w ðÅ  Ö ÷ „½Á f÷ Ö ÷ t‡ÿ äÐ~ Ú=ÿ ÜÐ~ <T…|³–, ?Ä?Ä‘‘ AW dÀ¤SYSYTISYTICLz~Ì€»øÀ¤ú Vhªx€»~Ì€»²¤UML... - UNA ECO microcode load, controller %VAUML... - File access error = %D, file = %VA%VA%VAUML... - Microcode load error on controller %VAUML... - Partition UNAMC not foundèºö–N�øÿöÿ©´¡ †¢ˆ¤ޤ00é|DyA§3eaek›’š¤�¤ ¢¤LB:[1,1]UNAMC.TSKq…¸Q7 îÿæΡÿˆþˆX¥÷•UÎÿ÷•NÉÿ÷•U'ü÷•N"ü÷•U·ü÷•N²ü÷q…ÂÿÀÂüÀe ÿ ¸ü%‡@Ñ w¢ÿw ÿw”žÿw”›ÿ÷•L€ÿ÷•U{ÿ÷•LÙû÷•UÔû÷•Liü÷•Udü÷INtÿÁÿ hü‡Åjü`ü& æTÿææÿˆ†æ3ÿˆ÷ ¶ÀÖ¡Áþ Âú ÷ ØÀ&¢ð•#÷ ,†÷ ü9‡7 ÿ÷ ÿ· ÿÀ&¢æ¬¤°4Îe°6÷ B †÷ Ì!‡À&¢÷ X ‡& & & æÒþææ†¢& 涤& Εæææ ÿˆ‡×­°þÍ À&¢¬*öÿÀ&¢÷ îwœþÁ`¡Âú ÷ ,& & & ævþææ†¢& & & Εæææ ÿˆÞÀÖ¡÷ –ŠÀåÖ¡& & & æ &æÖ¡& & & Εæææ ÿˆ‡À&¢¬*öÿ ÂŒ¤œ*JÀÖ¡Á.¡÷ D÷ ªÿ±‡Â Âw   ”Å¥ üÅ¥ ùÅå0B¡†€÷ ÚúAa”ôœÿÿ‡w à Ä'Å  ÅUD$†BA÷ `&�Â(÷ ÅU� ÀBQ÷ @ ÂЕ* ü‡÷ &÷ &÷ �’•’•€‡@Á(÷ Túf€  Àe ÀeÉÿÀe Àe ‡ABDEFIMNOPQRSTUXYZ<>Å"BaÊ$ep|v¢­$Ê®¶ÅÏJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw à && D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ „þÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚bÂEÊ Ö ÌЕ%„Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ ¢�à õ‡& æÎe„6& ¦æÎep/& æÎe þ*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎe6 & ¦æÎe"Е A‚¦Þ à ÷–%‡& æÎeöòA÷ äýà û‡Ð• à ü‡A÷ bE‡AÂ÷ †E‡Ð• Aæ÷ °ýAÎ ûÖ Â ÷ $Е.÷ ˜ýÂ÷ AЕ; ÷ tà à‡Â ýð¥ ÿÿùÀ øw öD…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w ÆDÅ… ƒ÷ &Е.À À À ce÷ Œ÷À …Е:÷ Å ù Â÷ ÚB‡hªgªÿÿÿÿ«w .ð*æ8Iðµ÷ lœ*=‡ðµ€)98÷ ä ÕeBÕ && ð Îå¶ �ÕU€�Ä÷ Ö‰�†ð¥öÿ*ð¥åÿ*Æe ð*Nlv °°΋œ*ðµ.2÷ n „& ðµ#ðµ!ðµ)&ÎePæÂ(ÂeÊ ¦æ&æ•&Äð >€Åe >ÍE€÷ 2†�•p�*÷ Ìw2w Á(DB‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±DÂ(Âe(¦„Äe$2ƒÃeäÿæÓÏÓ Ó(‹ÿˆ‡Ì%[]Ì%<> ƒ ÷ „팂1 >‡w ~Á(ñ D÷ bÿð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwnÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)÷ Z ‡÷ Lñ \ðµ#÷ ®U†&œ* ðµ=ð¥æ•Øÿwô Å`p!2üƒÅàÅ… ÅEW!Åp0p2÷ @ׇðµ#(ð PðÕ)÷ 6†ðµ@#ð¥Çÿ*ð*fff÷ ´±±‰‡÷ †&œ*wjðµ.÷ nB‡ð5ð(8ðe$8w2€æ•ÖÿA&À(Áe÷ F€†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA#ðÕ@))÷ Æ †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ Ö00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ ”‡0 @0 ð‡&œ*0 @÷ ¶uÄ÷ Ìðµ# ÁeB&B÷ –°B÷ z÷ R°•*±‡÷ | ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ ö0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6w ð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡w 8÷ ¢ ‡Ä0,0wþ÷ ‡÷ °‡w w:w&æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w Z…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ ðW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&æf…Þ ƒ„…‡ðµ82Áe&À(÷ ^€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡0Š+æ1ÿˆÅ(Åe à ÷ �ß%ÿÿ&ïp’*wð÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ Ì¡ðµ)"ðÕ(.÷ òðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ ‚÷ ÒðÅ(.‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡&æ¦ff… Þ �‚ƒ„…‡ð‹*±‡ð*‡f&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡141612Áepðµ00é„DxDl1DATADATADATADATADATADATADATAl2l0p‡÷ ÿMÄw&þÄ Ä Ä ðµf÷ æþð >€5>õE€u ÷ îý�‡ñ ± ‡ðµðe6p 4÷  †8÷ Xÿ±‡÷ n†81416÷ ö÷ âñÅ ÷ ‡‡÷ ¼ê†÷ œ‡÷ ^ÿ ‡f÷ Bÿ�†&œ*÷ Dÿ°•*±‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡w jüÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w &ü  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡ðµMðµ=ðÕf�Â(& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ðµ=&Îe0æ ÷ ¾üU• Â…à  ÂE•Õð >€ >ÍE€ðµ=ufÄ÷ žûp†�ñ ± w˜üÁeBÉ ð 8÷ R ‡$&w Xüð*ðµ<S1 ¦à Ö KÊ ñU€ò ñU@ò æ÷ ôƒ‚f&œ" ÷ B€�†‚×'&�ÿ)×'&ëÿð&* ðÊ*Ä%0þðÌ*±‡NDÅ Å ý¦æ÷ ¢ƒ‚÷ ñEÿû±U‡÷ Œ‡÷ ª‡÷ p‡ð 8 ðµ ðµð �¡‡ð•Öÿ*±‡÷ Œû÷ Hû 4 6Ååà ÷ òú‡ðe6p 4‡ð&*‡&4&6ðµ=÷ š÷ 6°4÷  wzÄ%!°6°4ðµ=5÷ Â2‡ ì6 ð � l0Á ü&°÷ Z°46÷ R°6°4‡÷ :ðµ)0406 0 ð *±‡ì0ðe6p 4÷‡÷ òþðµ=÷ Øÿ‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡8Áe2 ‡÷ ìÿðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ ¶&‡f¦æ÷ |÷ D†ƒ‚„÷ R‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ Žù0ž8*wüø±ðµ=p!†Õ•^ú‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ ŠøU•Õ8UMw–÷Ååà w*ø÷ ž÷Bðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�wZø46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ ð÷wà÷æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡ð*ðµ;ðµ7ðµ#3w Ôö *’$Ê ':æƒô �ô�…T•à ýƒñU@…Ê% D•ÄDÓÄ%][Ä%><wX÷  †w¼ññ1 ‡Ã ÄÄ%ñ,ñ,ñññ:4Š× ±‡w öð*DÅ Å ýæ¦Y…‚T¦fÃ(ÃeŠæ„ðµ<Ó•_‚ S•Ä ýó¥:ÿÿÓ•:‚ ƒ…¦æ& œ"& ΕæÏÿˆ‚4†×'&�ÿ ð&*×'&ëÿð¤ÿ*±*ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ D ‡à ññ÷ &ð•Éÿ*‚ƒ‡w *õð*æ ƒ ‚æ¦×¢"wf)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷  ‡eÄ%w ñU\ñ5@ƒ âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ "ñ5@\ñU@ñ5€áÄ„íÄ ñ5LñUþ¥*ñUÄ Å‚öƒàÎàà Ê¥*Ã%C!.D`÷ €*‡ƒ‚wòþÆeCÃ5€ñU‚Ã5 ±±± Ã5€± Ã5@±‡Æeð•Êÿ*±‡ðµ=õñU„Ä EÅe& ÷ RÄEÅe÷ Ö ¼Ó¥"Ý öŽwVþö Ë¥"  ƒ Ë¥"ö Õ”Ä Â Ä î ƒ  ê¶ Õ• Ä ü‡w óBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=wÒòÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w <ò Á�   ìì� .Â% ÷ øñ ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ èð ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡Â(Âe(¦Ê ññ1 ÷ `£(£(£££‚÷ X†� ‚÷ >âââââ‚:ƒô �ô�‚””à ý¡Á5Á ±‡ÂeCÃe¡‡æ¦ƒ‚ÃåJ„”Ä¥[Ä¥<C…Å`¥ ¡>C÷ ˆÒ¥,÷ ~… 4ÃB‚ƒ‚× *‚㨂 DÄe $ $ $ ÷ >‡ñz ñññ÷ ”ñ‡DEÅe     ýð•Ìÿ*1 ±‚ƒ‡ Ë•0‹¤þ‹¨‡—¢3‚¥÷ "÷ Ä ‹¨ ¥Ë”Ó”¦æ£˜Ä ýƒ‚‡‹¢‡Ê¥7‡¥‡æ5æ±ÿˆ‡ß%& Ëw ð&Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë å¥.‹ Ä ÅæU¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë ‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±û&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡Ta00éŒDê�D§3eaek›’Þ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡±‡ q|³–, ¿²¿²KK AW d|© SYf>߀»ð|©æ BdSY(‹ ¿²KŠJꀻ>ß|³ q€» þ¨ ÖèDö $&–�øÿöÿ©P©æt©ÿˆ÷€†ÿ7 �ÿ7 €ÿ7 ¨ÿ7 ¦ÿ7 ªÿ7 ¨ÿþˆà©À¾ÿÀe ÿ ®ÿ‡@Ñ w`ÿw^ÿwbÿw\ÿÁbÿÿ ˆÿ÷ `÷ x‡ÅŠÿxÿÅ8ÿwF7Š'ÿ7Š%ÿ7Š"ÿ÷ ÿ ÷00ê”Dð§Fl1DATADATADATADATADATADATADATAæö÷ 6þˆª÷ $‡-Áþ wØöÀ ~Âú ÊøþâöþÃ÷°ö÷ ú †·ŠÕþ÷¥›ÿ¶þÊ~÷U€¼þ÷µ€§þ·Š¹þ÷ „÷ D†w’÷ b÷ ø†w„À£÷ ˜þ1÷ J÷ †wl÷ P÷ Ò†w^È5€÷ r-È5@÷ vw@È5È5þˆâªõU÷50øÀ ÿ zþ‡w4ÈE€`Ð] þÐ Ð.þÐ,þ÷ Ö÷ ª†wô÷‹ þ9ÁÀþ Âþ¦ R C~÷þÖõ÷üýÎõ÷ 0Ã÷þ ºõ÷ªõ÷ ÷þ¦ªõ÷ašõ÷ Ñ~w&÷  ‡Â÷þ¤Šõ÷zõ÷ ö‡„~‡Ö ·Š™ý÷ „ ‡÷µ€uý÷‹‡ýw.÷ \×­wýwP·Šký÷ V†wB÷‹^ý÷U Ný÷E€Hý÷U@BýÀ£ÈE Ð]6ý$Ð Ð\ýÐZýÐ^ýÈ\ý÷ â÷ ¶†wü7Šý÷ ò÷ fw‡Ám6ýÑýÉýÉ]öü÷5 æö÷-$ýý÷-ýý·ŠÞü÷ Ê÷ ,Z‡Ámýñ@ ÷ VN‡ þ¤÷ ”÷÷€ôÁò ÑÎüÑÈüѬüѦü ÷5ŒüÉ÷ ®!‡÷‹„ü÷Šü\ô÷‚üXô÷þ¤Jô÷:ô÷ „÷¥›ÿFü ÷ H†wÖþ÷ ‡÷$ôþˆê¬À ÿ |üÅ:üõU‡÷Èÿô ÷ z÷ ÷ è÷üÿðó÷üèó÷Öó÷ f÷ "÷ Ú÷Äó7 Êó÷ wLüæ3ÿˆ÷¸ó&Àæ &ÿˆ†÷ÚR°û÷‹ªû�¡±€‡÷ Òÿ ‡÷ Êÿ÷µ€�û¡‡±‡÷5@Œû0þˆä­Æå€È÷ ^ó€ ÷5nûˆ Ð ÐvûÐtûЈûІûЊûЈûÀÁÂ'ÄNûÄ�ûÿ zû‡ÿ €ûÆe‡÷EÀõ÷ â÷ ¶‡&f¦æÀ0ûÁûÂû÷ \ƒB ÀÝû÷ 0BÀ€÷ BÂmûA ÁmûÂeA ·êúwèú7æúƒ‚�€‡æûÿ ûúúÀûp>¿îúõU&‡¦&æ†òæ€ò´ú ÀÝ´ú÷ `ò÷ ªþ†·`hòw bòÀ ÷±·Xò·Vò€‚‡&f¦Â|ú ÀÝ|ú÷ &ò÷ pþ †Á ÷`ò÷ bþ÷ ò·`òw òÀ îÁ ±‚�€‡Àþ¤÷Dúüñ÷@úôñÀþ¦÷<úêñ÷8úâñ7Øñ‡7îùÐ 7üù7úù‡f¦æ÷ æÿ·ŠÞùÃ<©&÷ b÷ ¾ù÷  þ÷5 ªó÷-ÄùÜù ÷-¾ùÖùÀ¸ùÀ À 7 Êù÷UŽù€÷5 |ówB w÷ ƒ‚�‡À€÷ ´Âm€ùA ÁmxùÂeA “SÀ À ‡÷þ¢ñ÷\ùñ÷Xùñ‡÷þ ñ÷Hùñ÷Dùñ÷eüðw öð‡&f¦æ&÷ üø7Šþø7 *ù7 (ù Äù÷þ¤Æð÷öøÈð÷òøÀð÷ 0þ†wä �`;W 8Á Á ñ ¥Ã<©÷ x¡`÷U¤øñ5 ¥C¥ÃEðÃ-¤ø ñ-œøþ¤ÃF©·Š„ø÷ Dñ ¥€À ±A€  ÷ŽøLð÷†øDð÷e@ðw :ð¼ À�‚ — €¼ ÷e&ðw ð¯&f¦æ&Ãð ðÃíJø‚ ÂíBøÃå‚ À€÷ H‚‚ ‚ �`@ ƒSÓÞïÓØï  ‹„ƒ‚�€‡&Åä÷À0©æø, øÐÒÐÆÐ�ÌŠÐ�ÇŠ¿ð÷P� ŠH €‡&f÷ |ýÁmÆ÷ 1 ÷5 |ñ$÷‹„÷!Ám¶÷Ɇ÷ñ„÷÷ PüñU &÷-t÷–÷ ÷-n÷�÷Àh÷À À 7 „÷ñU€÷ ÒüÀ%þ¦ ÷5 "ñ÷‹*÷÷ ýÐ�€‡þˆ²õE&‡‡÷÷îî÷÷æî÷ Ðî÷þ Ôî÷5€êö÷`¼î÷ û †÷µ€Çö÷¥›ÿ¾ö±‡÷ û‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡|³š‹–,¿i¿i¢§ W LÎTITISYSYOVvÂÒøLöRV$>%tÂÒF ˜öèƒ:Ðu~VNàèUqøèÖs¨œwHÈ@4��Þ°°'Øè:dÀÀ¸¸IqPLqX;}v…ðèþvYM |…(&800ðªF�D§3eaek›’€·Äÿ÷¼ÿ÷ ^À ÷ 6÷ :ƪÿ 7 ªÿ ÷ ^"†÷5¤ÿ÷Vd ÷z÷ 4 Ád É%ÿÿÑ ûÁ�÷ ê÷rÿZÀ ÷ äÀZÿwTfhÂ` ŠÀ¾  Á”W  W  W ;W ! E ðÄ … ìð¥ ÿÿèÁ Å äP�„ áð¥ ÿÿà‹Ä È• Ä ¤À¾ ÷ D‡ÂöR ÂeÊ úÁ÷ J‘÷ ÊþW þvõ”W  W  ùÀ æjÁ¸‘‘‰ÁºÑ Ñ a(ñ þÿÜi÷ ¤wøwÀˆ7 P¦Âå·B÷X÷ & Ám®ÁMª±=& & 7$÷:÷  ÀŽ 7÷ ø w ‚õ‚Žò¶ï‚‚–%±·ä÷ Î ÀV7Ø÷  wàL·Ê÷à÷ > ÷ 8 Àm2–%¡‚‡Á ±A & ÷Šž÷´÷ n 7 �Àí7„÷ l ÎôÁ-òó‡wàêN`·h÷ à ·Ø ·X÷l÷ Ê ÷0D÷Z÷ L ÷"4÷ wà¦÷ : ¡‡æææÃL7 ÂÂå·÷÷ ì ÁmtÁMp.÷ð÷÷ Ô ÂÃZ ó†¦ÎmP €ÁmF7>·À÷ : ÷2&N`Ö ÷¬÷ – Ám w7œ÷  ƒ‡Á X & ÷r†÷œ÷ V7 x ‡ÎÎmèÂÃà ÷b÷ J ò&N`ƒ%w`Ê÷ÂwÀ7B÷ º €%æ®æ¬·.÷  ·e ·š÷ š 7� ·÷$÷ ‚ ÷èü÷÷ ÷Úì÷ Âw`^÷ ò‡w  ¡EE CC w òE E C Ä& ÃEøÿŽ Î  Ãe0Ð�Ä æ E C Î üÖ éÖ ‡” Â¥ ”� úÂ¥ ±¡‡Ð• P”É‹ý‡ÁÎÁZw |æf÷ Âÿ‡“�÷ ºÿ‡“�÷ °W †K— :ã Ád ^Áƒ÷5Rû.÷T÷$÷ ÞB8·ü÷ ÷ Ìñ"ôñ¬ðñ‹íB·Ö÷ì÷ ¦wÈ÷ Þ÷ ˜f=&ÂÀ÷ : †€à <ƒÃ¾3‹€Ád ÷ÄŠ÷ ÷ ZB(·x÷ Ž÷ Hñ"ôÄ1¡ï‡1¡ì‚ CÜBÄàBlÄ üf·:·R÷ Bƒ‡ƒÁææ‚÷ Àw’úÀ>pb°d÷ œ‡ð fô‡œ`Ã¥öÿ±ù¦fÁÃ¥ÿÿÁÃ¥þÿÁÃ¥ýÿ Á Ã¥üÿÁžÃ¥ØÿÁ÷ X�‚Ë´7ÿÔd VMR>ÑÌ„d €d ¥ÆâyfÁÿÿf İ 7dÿ÷º zü÷ 4Åd Í #Á DD 7>ÿ÷ 5"ñ5,íÁ æ€ÿ÷ � €Î€V- Áà±�‡Åd ÄH 7úþ÷P ü÷ ÊuD± 7Þþ÷ ´5"‡ó5,‡î‡Ä0 Äå&Ĥ Äå& 7¬þ÷ Âû÷ |Åd „DÎ Ä ±7Šþ·„þ÷ n7zþ÷ Põ ±5"æ5,â– ‡7 ôÁ÷ Ø wô‡÷ Ì wúó†À ‡Á÷ Ú w¬ô d æ"þÎ5yÎm4ûv‡æà÷ ‚ �Π÷5> ΀–%g‡·æ ·üæ°æÂàý À — +÷ þó· žÿ†Â”ÿÃ’ÿÃm¼ý‚ Ãåü€Â Ãe&÷ d �· xÿ†— ‡ÃÖóà à à à à à Âå Â`†Á€ƒÃEþÂ@ÂÂe÷-Bÿjý†ÂEÿ‚ B` ÷  †¬*öÿ° ‚‡l×  ‚ƒðÿ0Þ ‡‡ÁhÁÂL w¾ ÷Eàý· æ æÃýà $‡Ã "‡Ã ‡Ã ‡Ã ‡& à N ÂæüÂ`N ôþÃå ÁóÁ Á Á Á Á Á C`@   ƒwØþÀ ²ü  Œ‚ Œ‚ ŒÃ ÃmœüÁÃEþŠÁ� B`Âe”÷Eà‚ü·�æ°··†ÂrüÀ* ÁlüÀ%Á ! ÷ šòÀ Á � Á w,Dü÷ ¼ÿ À 7,6ü÷ ®ÿÀ à ÷·&ü‡Á{Á}·üw¶  ÷äÿ÷ÜÿæÚÿˆ‡ææ)ÿˆ‡÷ Ìû÷âø÷ œýÅd Cw¸û÷Îø÷ ˆýÅ„ Åm(ùÀ‚ Á%Á ýDw�¸ÿwí²ÿ· ®ÿ7Š«ÿ7|ûw’ø÷ Lý¡Þ Dm·Š‘ÿ÷ŠŒÿðÍ Ð±‡P�P�&@íA÷ 0@mÀEÿ€ ÷ ¼ Е:‡÷Ä"û÷8ø÷ òüÅd A:w’ Áeîÿwû÷ø÷ ÔüÃd ÅH ÄŽÕÄ ý‚Åå Ä7 ÿA�Á DÄeawöþ Áåw¾ú÷Ô÷÷ ŽüÃj ¡Þ Ô 7!Òþ퇲¡Þ ı‡&÷  — .”Ö €÷ ö Â¥8Â¥9±‡¡‡&”—  ü‘ É‹ø”— = —  — —  óÖ ²Ö €±¢‡00ð²F§Fl1DATADATADATADATADATADATADATA&¦æ ÷ †Aa„~@÷ ÜWtûÿÁEÁÿƒ‚€‡fÅd ÄÈÿ7è÷÷à÷÷@öô÷ Äú Aa±C ÷Ê÷÷Â÷÷Øô÷ ¦ú5¢‡Ä±C ì÷ Œ ‡Á õð‹p­î‚�‡ ÅÔW¡a‡W¡z‚ÅÅ ‡f&&¦7 8ýÅd Äü7Z÷÷pô÷ *ùw*ÿzÃÈ“÷ ÃåÈÀÄààÈàæ Î Ö f÷ Ø÷ úþ÷ "ÿ$‡÷âüÅd ÷ ÷÷÷÷@ô÷ æùõ5 BÝÂe BaÊ¥_  HÝ ÃÈ“”BÑÖ Ã˜ü7Äd ÷¾ö÷¶ö÷@Ìó÷ šù   Ý �Áe aBÔÅ ÂBÔÂÅ –%ÂE C”× 0‡× 7 ‚Ãå0tÀ`Å òÀ%ÿë‚× :ç‚€±„…Ãü‡Ô¥:Å ûHá‡À Á÷ Áe0fÀ ÷ êÿ“•‡¦æfBÂe ÷ vþR¡‡‚F~…ƒ‚‡f&¦‚Þ €�‚‡&æÿˆæ3ÿˆ“U#\“U]R^D©Ô:`H©\}býª©dÓ[ìfO« _hT«z}j“«”l5¬«sn¬”pR«Œ9rž«xtªTvÈ©sx¯ªT.zÀ«""|5{ˆr~Ï«xd€o�‚c�À€„i�Bx†¯ªâ.ˆL© NŠv„:Œ+ª¼ Ž+{8|�,{ 2’&{8r”3{ø–0{àG˜3{‚š3{(‚œ+{Ðpž+{P} »«žS¢Ÿ«t!¤I;¦“Ußf¨H©:dªœª*}¬ë«2g®¡«@w°تlz²H©†´M©s¶R«X^¸R«F^ºH©ü ¼H©�¾š©ûKÀ¼©[(Âr�ˆrÄi�ˆrÆs�P‚ÈrhˆrÊô«ø…Ì;€ô…ÎÓtÌSÐL«:dÒO«DLÔ½«ÂÖT«Ør©ÒÚ6ª€Ü˜«4Þ�«4àê¨u~D©FG© gJ©¼ e©ÄŠ" ©Bx$½©C &ì*„(6ªl;*¤ªs,¯ª-.˪s0A«Äq2:©D4Ñ««„6¢ª«„8àª#:««„<ah €>dh L@hhÐBlhè.DÀ«(F¿«“YHÑ«O JÑ«BxLÑ«hNÑ«ýxPë«ZRë«øfTl�è.Vó«FXô«xZZÓ�ò\ÿª�Z^«€»`«ÀÁb«Èd«@Îf«€Ôh«ÀÚj«ál«@çnô¨:^â©CEä=©è&æD©ƒ:èL© Nêe©ºìt©š^îv©šðv©""òv©?Tô¿©8röì©|øì©Ìeúì©”’ü6ªýþ6ª€6ªÔ€7ª47ªf7ªö&ت�ƒ T«| T«”’m«�Qq«ˆZ•«[MÌ«xQë«z}×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ ¼ 6&H(ÿ ´ 6&J*ÿ ¬ 6&ž3ÿ ¤ 6&‚9ÿ œ B&¼(ÿ ” B&Ê)ÿ Œ B&ä)ÿ „ B&æ1ÿ | N&0ÿ t Š&&)ÿ l Š&¾5ÿ d Š&Œ7ÿ \ Š&^;ÿ T Š&.=ÿ L Š&6Bÿ D Š&FFÿ < Š&dHÿ 4 –&P(ÿ , b'H(ÿ $ ’'þ1ÿ  ’'L3ÿ  ž'†(ÿ Â'º-ÿ  Â'D6ÿ ü Î'<+ÿ ô Î'>-ÿ ì æ'Iÿ ä æ'Iÿ Ü æ'LIÿ Ô æ' Mÿ Ì ò'Iÿ Ä ("Tÿ ¼ (‚Sÿ ´ (dSÿ ¬ (€Tÿ ¤ (ìVÿ œ (0Wÿ ” .(°W¦Þ5Îe‡w $ Á,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡wD ù è00ðºF�D§3eaek›’U$ÿÿÿÿü$Ê5¦ „Ê €‚Ê5ùà ÷ƒõ…2Å Å ÍUEÍ ø�‚‡*&p V%ü$À(&‡ÊEò ÊU ‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&æ¦ff… Þ �‚ƒ„…‡&æf…Þ ƒ„…‡‡ H(6&Ú'�H(t*&B&!�H(Ø*&N&.�H( Z&*&Š&3�è0ÜN&f&5�è0ôN&r&=�è0TN&~&A�è0|N&Z&B�H(È *&–&S�H(ä¢&*&b'V�,- –&®&W�,-Ô–&º&X�,-0–&Æ&Y�,-Ô–&Ò&Z�,-x–&Þ&[�,-,–&ê&\�,-¤–&ö&`�,-–&'d�,-–&'f�,-–&'h�,-¸–&&'i�,-t–&2'j�,-¬–&>'k�,-x–&J'l�,-–&V'n�,-¼–&¢&o�H(¬ n'*&ž't�ô1¬b'z'|�ô1Lb'†'€�ô1Ôb'’'‚�ô1Èb'n'†�H(hª'*&Â'‡�°)Dž'¶'ˆ�°)`ž'ª'‹�H(*&Î'™�H( *&6&�Iæ'þ'��IxÚ'ò' �IT Ú'æ'¦dS (*&¦�dSDþ'(²�dSþ'"(»�dS`þ'.(¿�dS` þ':(Å�dS þ' (÷ Bå÷ Þ— /g¤Pd¤Ra¤I^÷ öÝ— =Y÷ ÜèW úT‚w$ÙQ÷ ÞÝN†À ÷ ”ä †÷ ÙM÷ÙÙ÷|³üØ÷ |äD‡w­ ôØ8f÷0ã÷ åµ÷ 6åÂŽñ·ã÷ òäÂåAwã÷ ääõ w­ ¸Ø‡BAñ·ðâ÷ Æä5÷ öä7àâ÷ ¶äuõ�ŽØõ�ˆØ ÷ Úä‡ÁÁ>wt÷ úãù‡w­ fØffà �÷Šðšâ÷°ß÷ ¢ä÷Œâ÷„â÷ìðšß÷ håµ÷ ðå÷\ðlâ÷‚ß÷ <ä Aw\â÷Tâ÷¼ðjß÷ 8åw­ þׇBAî  ÷ð.â÷Dß÷ 6ä· â÷â÷€ð.ß÷ üä5÷ „å7â÷üá÷dðß÷ àäuõ�¤×õ�ž× ÷ \å‡Local TI: - GlobalSYSTEMGBLTerminalà 7 ÂÿÈ¥=!7 D×7 B×È¥/B÷ $Üñ5×"TIw"&æÀ*÷ †ƒ7�ÿ÷å*Šÿ€ËNá÷ ÂÛ'‡— =·öÖŤ ÷ D‡•�÷ <s‡•�÷ ÈM&CÃåÀ*÷ 8À 78ÿ÷å*2ÿ€— :]÷ rÛZ‡— /WÁ=*÷ ,†Á6*÷ "M‡÷ RÛJ†Åd ÷ ŠÖ÷ ‚ÖwH÷5úÖwÜÄøî7°à÷ ÆÝ÷ €âD87œà÷ râÂNÖµ óõ­DÖïõ‹ìõ0ÖJffÁ ÷ LÙ„7bà÷ xÝ÷ 2â�÷ dâ÷ ÖÓ‡ÁIÁÁJÁwì÷ æÕ&÷ ÜÕófÁ ÷ Ä×�ï‡ õÊÕõ�ÆÕ5Šõ¶Õ5 7öß÷ Ý÷ þáwèß÷ ¾á ÷ ðá‡Åd Ärí7Ðß÷æÜ÷  áw çÁÀ¾Èäýð*ð÷ ^Õ<ÁIÁmÊýÁmÐýWtúÿ÷ ä׬‡7^åÅÈDÁ B~DÄeÔÔU Ô�–ýÔ�œýÃ*ÁŠý÷ ÒçT‘D~Ã*Á„ýÔ”B~À¾÷ "ç÷ Jç‡÷ ŽÀå÷ FXÈ OÅd æç· ß÷ß÷@.Ü÷ üá  ·ß÷ß÷@Ü÷ äáCCaÃ*÷ìÞ÷äÞ÷úÛ÷ ÈáÄCðð‹p­ô&&÷ €„Ä Ò7®Þ÷¦Þ÷¼Û÷ ŠáâÁeW >ÂƒÖ ÷ hæ÷ �æ‡÷ Ô‡÷5²Ô_Ä´ì7lÞ÷ ‚Û÷ <àf÷ dâ€Ö wbâ7NÞ÷ dÛ÷ àNÀ¾P�P�A� ÷ àЕ:Е ff�D7Þ÷*Û÷ äßwÞ÷ Û÷ Öß÷  âЕ Á"*΋Á/*÷ ~ØÖ‹„7ÚÝ÷ðÚ÷ ªßwÌÝ÷ âÚ÷ œß÷ fâÖ ÷ |­÷ ºáÅd ÄHë7¦Ý÷¼Ú÷ vßDR7–Ý÷ŽÝ÷@¤Ú÷ ràÅd ÄÈAÂT‚~ DÈ67hÝ÷`Ý÷vÚ÷ Dà BÝ(fÀ¾CÃe Д‚~BÝ Ð• Д‚~Е Á/*÷ À×õµ Е Е(ÁA*÷ ¨×Е)÷ Ê �DÊÁeW >ƒwá÷ dׇ— A‡Â¥Z†À ‡f¦ДДÁ ÷ | Е:‚�‡&B”� ü€±Ö ‡Åd &fæ÷žÜ÷–Ü÷¬Ù÷ zßCÄ Ä^ä7~Ü÷vÜ÷@ŒÙ÷ ZßAaÉ7fÜ÷^Ü÷@tÙ÷ Òß7PÜ÷HÜ÷^Ù÷ ,ßõ78Ü÷0Ü÷FÙ÷ ¤ß€7"Ü÷Ü÷ 0Ù÷ þÞABÁEÿŠÂ�`ÁeIWtúÿæ÷ ^Õƒ�„‡ÂÈòfÅd @Á�”B~�ÂIÂmôùÂmúù—túÿ—tÅŠáw¶Û÷®Û·ÆØ÷ $ßÅd 00ðÂF§Fl1DATADATADATADATADATADATADATAÄ Äxã7˜Û÷�Û÷@¦Ø÷ tÞAaÉRá7~Û÷vÛ÷@ŒØ÷ êÞ7hÛ÷`Û÷vØ÷ DÞõ$á7NÛ÷FÛ÷\Ø÷ ºÞ�‡¯”w Dõ· ôÿ÷ô ðÿw 4õ÷ äÿ7 Þÿ7 Öÿ7 ÔÿÀÿÿÁ\Á%pü‚7 X÷ÀÿP÷ P‡÷ ŒÅåÀ À%‡Y÷ ïwÊö0Ä÷ fÄ ûĶ0� U‚À ø `1Ååê‡n1„1‚1‚1ž1„1‚1÷ VÿÀÆ0&X?‡÷ @ÿ Ô-$ÿ6Ô- ÿ3̵ 0‡À$È #û-øôµ@3Ð ÷ ÿ-/íØ%ÿÿ.(Ð æ‡÷ êþ ÀÁ°Ð%ÿÿÁeÀ%pø‚¡‡ÁÃÆþÃeP¾0Êââââwšþw˜þÁeÁgÁfÂÂ0Ã’þÃePÊââââ¢(÷ |þÀô ÷ ` wL ÷ úÿ Àßîÿ· êÿÀæÿ÷ D †ð¥öÿ*±ÂeHÁ w 7Àÿ7¼ÿ‡÷ ¸ÿ&÷ ²ÿÀ€U‡ Loading Executive data spaceData space loading completedLB:=WK:/GBL Enter filename: 3»zSYâyIMÅ ÷ÿÿ´åÂý2Á÷ Ô†wðÎw0À*3pfCfph÷ ì1fí‡È•ð”3÷ Þ†wþðµðµwúÀ Át3ÂeÃV3÷ ¾ó‡ÂF ÃRà ýÍ H÷ZÿÕð•#÷ ’N‡ð•ð€÷ †ü& À ÷ VV �‡÷%ÿÿfå=÷SY®þ7 ¬þæ3ÿˆ‡æ$3ÿˆ7,\†þ7¬^€þ÷LB†þæ3ÿˆ ‡æ$3ÿˆ7,\bþ7¬^\þÁ‹÷ æÀ ÁF Ât3Ñà ýð•#÷ ö†w&w2ð•ð•ð÷ÔÍ÷üâÖ÷òøÓ÷ àØæ6ÕÎ%0 ‡7 žØŽ ÷e–ØÎ û÷eŒØ·âÌÍ W÷ªÖ÷ÀÓ÷ zØ÷ÔjØ÷ÔfØ÷ Lä�÷DäˆÖ÷žÓ÷ XØ÷ôÓ¸Ì÷ ¢Ì ÷&älÖ÷‚Ó÷ <Ø÷ ØÓ÷ ’÷¶äRÖ÷hÓ÷ "ØÂ¾Ó¡ ‚ ‚ Âe° ƒ° ƒ° ° 0 ÷ FÌ ÷eÖ·†Ó÷eþÿ€Ó÷ Ø÷üüÕ÷òÓ÷ ú××-XÔwüÍ ‡¢¨Â   ·\Ó·ZÓ÷ Þ×÷äüË÷þãÀÕ÷ ÖÒ÷ �×Âd ·êã·âË·ÞË·ÚË·ÖË÷Îã’Õ÷¨Ò÷ b×ÁLÀ÷5¶ãà¦÷5¤Ë÷ ãdÕ÷ :×J J J J J J ‡Ê5?Ê ‡Î ‡ŠÖ wdƒ÷ ×ÁfãÁåw(Õ÷>Ò÷ øÖ·NË÷ DË6·"pã3æ¦ÊeÊE�C·úÔ÷ þÖƒåÊಒþÿJ`–"Êe?ÊE?JàÊMË÷ âÖJ`·DÒ·œÖ÷üâÀÔ÷ÖÑ÷ ÈÖw,Ò÷äâ¬Ô÷ ºÖ÷%ÿÿ â7 âÀVâÀ%÷ ¼Ê ÷Hâ†Ô÷œÑ÷ VÖ÷ òÑÀ ÷2ânÔ7†Ñ÷ @Öà 0d ,À ú÷5�Ê ÷’âLÔ÷bÑ÷ Ö÷ ¸Ñ‡÷â4Ô÷JÑ÷ Ö÷  ÑôÂWK ÷ ¨Üî†Ã ìÀ¾Áð2S”þÁ¸ÉF w ËÁñfÁ Á Á Á ÂL ÷ Žw‚ûÁ‚ù·úÿ·ÐÝæÁh VX Z1\1^À¾Á´2÷ .Î÷ TÀô Á6  ÃT ÷ rh‡Àô ð•#÷ Z`‡÷ JøÀô ÷ ,÷€ÐÓÀô ÷ FR‡ð•ðd ðð•(Àô ð•"ð•#÷ ;‡Â Àô æð °4Îe°6÷ ‡÷ .‡·øÒ÷Ð÷ ÕÂe!‡· ìÒâð¥öÿ*÷ ¢÷ÉJÐ÷„àÊÒ÷àÏ÷ ÒÔÀ¾ÁÓ2÷ NÍ÷ tƒ‡Á  ÁtÁ Àô ÷ `ÂZ ÆÄþwDTSMHRSIUICÁb9Š ý÷ úÓ&À ÷ †Ó€i‡Åb9÷ ¸Ìt‡— /3Á \— 0%‡— 9"‚À ÷¥ªÿQ÷ Dè†÷eœÿ— :NW K‚÷ ®UW ;E‚Â¥:B÷ œUW ;<‚À η jÿ÷ /‡u ÅÁ~9÷ ^× †Áz9÷ T×*‡)…Åe ÷ Þ!‡´"…¤[÷ ×u�W ÿ‚Â¥, ÷ öÖu�W ÿ‚Â¥]šÁÁ> Á=ÁÁÁwÄ�Üþ!è‚ÅHÑÁ÷ êÈð‡&fÀ ßÀå 7.Ñ÷DÎ÷ þÒÀd 0  € û‡À‚ßÀå 7 Ñ÷ àÒÅb9Ä E�÷ Cà @  �€ Á �ìr Â÷ Fu`u 5`ìÄCÃe÷ 8Îó þÿ Á �ìr �l€ Ä%ó þÿ÷ u`u 5`„ ! äÁÎÁíþÍ ï÷ ~÷ ´µ5Š÷�Þ^Ð÷tÍ÷ .ÒÄd 5cu ÂvÞ·@Ð÷VÍ÷ Òƒ ·,Ð÷ Òt-õ‚‡t-ð†�€÷Ð÷ äÑ ÷ ÒT!v ü‡7øÏ÷ Ò‡BA÷ Tu5Pµ ‡÷ ~UÃu9“ Ë‹ü±Ãåu9Õ‡õA B ÷ u 5 õ‡& f €À € �&÷ Né€v�÷ Bé6`Né�€‡ÿ ¾èæ'Iÿ ¶èæ'Iÿ ®èæ' Mÿ ¦è (‚Sÿ žè (rTÿ –è(dSÿ Žè(€Tÿ †è"(dSÿ ~è"(Vÿ vè.(dSÿ nè:(„Sw é÷ 0 ‡Ä0,0wÃ÷ ¶‡÷ >‡w èèwwüð 8 ðµ ðµð �¡‡ð•Öÿ*±‡÷ ÷ T 4 6Ååà ÷ þ‡ðe6p 4‡ð&*‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡0Š+æ1ÿˆÅ(Åe à ÷ Tß%ÿÿ&ïp’*w.÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ ð‹*±‡ð*‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡00ðÊF�D§3eaek›’ Offline Loaded Unloaded PublicRW COM RO COM <>[]()!!++DEVICE DRIVER MAINTASK CPUSEC POOL 7 öÿ7 öÿ÷ šÝ ‡·èÿ7”åÿÐ¥:s÷ †Ýp†÷ çæÞ †÷ Ìÿ Á÷¶(¾ÿ¸(÷ wôæ÷ ¬ÿ w-¤ÿÍ RÖ æ(wBàL· ’ÿÀ¾÷ bçÈ• ”3!f&Ä7¢â÷¸ß÷ rä÷”â÷ ªß÷ däÅ÷ ,ç„…&óµÁc(÷ ÝÁH(óµ÷ òÜ÷5”ðó5ÁY(õ ÷ ÔÜÁQ(õ ÷ ÆÜ÷ Z”ÁwHæ÷ ’Ü)†÷^ðâ÷(ß÷ âã%& ÷Hðþá÷ß÷ Îã7 Ìÿ7 Êÿ÷ `܇À Á÷ êw¶ÿ‡÷ àw®ÿ†À ÷ @܇ÁÖ wà÷ À忀÷ "ï�΀ÿÄd - ‡ –%w åwŒá÷âï¢Þ÷ \ãÀ¾- - †Á¯(÷ þÛ÷ @ÿ7-8ÿÛ7-2ÿ×÷ f÷ ^Е AÂ÷ JЕ  ÷ ¤Е ÷ ˜Е Á…(- ‡wVÁ•(- w.Ã{(ô5€kÃeô5 Á�(÷ rÛfwÔà÷êÝ÷ ¤âД��Е:ДlÃeÁk(ô5@Ás(÷ 4Û6ÃeДô5@ 7‚à÷ Xâô5@ ô5·dà÷\à÷ Fã ·Rà÷ (â4 4 ÷ Xw4à÷ âД÷ D÷ <Д5Áš(÷ ¨Úfw à÷rî Ý÷ Úáô5€ÃeД÷ ÷ þД·Üß÷2îòÜ÷ ¬áô5Á¦(ô5Á¢(÷ FÚ÷ Úö      w”ß÷êíªÜ÷ dáwìýÁ¤‰1 ÷ êì€ÂI q  ûÂ÷ „Ù÷ Ðì�Е0Е0‡PARITYPARTOPBOTSPEEDUICSYSUICLIBUICNETUICMAXEXTPUBBUFCHAR_LENGTHOPTPOOLSIZEPOOLPLCTLSECPOLWCHKRNDCRNDLRNDHSWPCSWPRLOGONTERMLINESHFILLVFILLTYPEAHEADCRTFORMFEEDWRAPLOWERESCSEQREMOTEABAUDBROECHOSERIALSLAVEPRIVFDXEBCHHTRPAAVOANSIBLKMODDECEDITREGISSOFTHSYNCTTSYNCPASTHRUPRINTER_PORTASR33KSR33ASR35LA30SLA30PLA36VT05BVT50VT52VT55VT61LA180SLA120LA12LA34LA38LA100LA50LN03DTC01LA210LQP03LQP02LQP01LA75LA2XXVT100VT101VT102VT105VT125VT131VT132PC3XXVT2XXDEVSYSCPUPOOLNEARELEVCSCANODDEVENDBDDDFDKDLDMDPDRDSDUEM    €úÿúÿ € €@  @€    !"#$ HBHBHBPBPB„B¨H P  P P P„B„B0„B„B„B0„B0PB0„B„B0„B0„B0„B0„B0PB0PB P P P P P P P P P€ € €€ €+€€€€[05075110134.515020030060012001800240048009600EXTAEXTB5075110134.51503006001200180020002400360048007200960005075110134.515030060012001800200024004800720096001920038400ABCDEFHJKLMNPRST/AFF=ð:<2¸3À3:44.4&44¢>B=’56 6R;¤;ª=Z>ð<ø>ø>ø>\?\?l>9L5®8"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"7"77 ÈÏ÷ tÔ!‡— /¢N¬O¤· ¨ÏÁ˜, Å¢5þÿ÷ b߇|.1Ñ‹þÔ É‹ôÁÁwÔÞ…C÷ Pu w>u ÷ Ô †÷ TÏXÏww — :ûU%È¥* € ”÷ 0 ð‡Uß÷ ÔÓ}‡— :zÈ¥* € ”÷ p‡UnÍ÷ ¬Óe‡— :f³.÷  Y†Â¯.÷ ‡Í ÷ ÈÎa÷ ÄÎ^÷56ÏHÂ%1÷ ì ]‡÷ Ô G‡÷®Î=� ·.÷ Ò #‡÷%ÿÿ�æ=÷%ˆæ9÷„æÂØ÷ ˜Ú÷ 4Ö4÷ âÎ.÷ lÎ æfæÎ Î Î Î Î Î Î Î ·Rλ.÷ € ‡÷5@¸Î � ÷`ævØ÷ LÚ÷ èÕ÷ àÒ†7 Î,ÎÁwzÁuÁvwlÁ„Â:2ùÁ‡öÁˆó,…7 òÍ(…·êÍ÷ èÍ#C÷  U%Â¥: ÍÿÿÈ¥-� È¥+� € È¥*€ ”÷ ´ ‡e÷ XÒ†¦ÍÁwô wý…Ãæù…à æõ…Ãæ~…÷ xÍ{÷ "Òx‡Â¥A‚Â¥Zi†— [o÷ úÜW ÿm‚ DÐjÄ— ,c÷ âÜW ÿa‚DÐ_— ]Y×-Í ×-Í ÷V×÷lÔ÷ &Ù÷ ÂÔQ÷ ºÑD†7¶Ô÷8×÷NÔ÷ @Ù‡÷  Ñ7‡— :4C÷ ÀÑË%VTw0ñ- × w×÷ Ô÷ ÒØóñ5!1÷ øØ7\Ô÷eüÿÜÖ÷ØÖÖÖ÷ìÓ÷ ÞØ‡À C÷ hÑË%VTnŠÌÁÁÁwÈ Áûò…÷ `ÌïC÷ 6ÑË%VTó Rñ5è÷ ðÐ ‡À ÷ ØÛÁ ÚÁ%ÿׇw�Ô÷ p؇*Ì5…÷ Ì2C÷ ðÐË%VTó /ñ5w0Ö÷ FÓ÷ Øñ-"Öôñ5÷ ŠÐ‡À ÷ rÛ÷5†ÓÁ%‚Á%ÿ‡w�zÓ÷ ؇Áw ²ËÁwü @…÷ šË=C÷ pÐË%VTó ïñ5w°Õ÷ ÆÒ÷ €×ñ-¢Õôñ5 ÷ Ð!‡À ¬ ¬.¬ ¢7÷UÓ¢8÷EÓ÷ jׇÁwr Ë4…C÷ èÏË%VTó «ñ5)w(Õ÷ þÖDÄmÎâEÅmÊâÌ5@ÌE÷ ÒÊÍÕ€÷À.Lù÷ À ‡È¥:à Ì\Ò.ÍÅ€÷ ôÖ‡®ÊÁŒÁÁwì „w\C÷ bÏË%VTó wÌþÅl Õ5wNÄ%rw2Äå6Ä Äeú.eÄ%/gÄ%,/Ä%$/7mþÿpÔ÷†Ñ÷ @ÖÁd Ä%,/Ä%(/7 Ê· Ê÷ Ê C SÄ%/ Ä% / ÷ ¨Îf†÷ <Ö‡÷ ìÉ÷÷ –Î÷‡À Ád ñ5€ fñ5@ bÄ% /æ÷€0Høñ5@ ÷:0:ø÷ 4 ‡÷Ç0.ø÷ ¢I‡ó‹ÞAF÷ ”B‡÷U JÑ÷ :Î/†÷ÅAÑ÷Ð=ÑÃ÷ xÉÃBÈ¥ ÷500ðÒF§Fl1DATADATADATADATADATADATADATAÖÉ E÷ þØÀ CA× ÿ‚à Ã%7 DÉ· @ÉÃ÷5¦É÷� Ñ�4ÉÁÁÁaÁwl ÁbûÁøì…÷ þÈéC÷ ÔÍË%VTó w>ýñ5ã÷ ŠÍÕ‡À ÷ rØÄå6Ä Äeú.Bƒ ‡B üC C Á0Ä3Cd ³Pd ÷ îÔ‡»…÷ œÈ¸C÷ rÍË%VTó wÜüEñ5±÷ &Í£‡À È¥0‚È¥9‡÷ ØÁ š�Á%ÿ—‡Ät/Ì M%üÄåv/Áæ- ÷ ؆ыþÔ É‹øÁ‹÷ &ÈwöþEÄårt//!F+õE õE¿õEõE W ‚õU „ &Ä „eÄe¼/• €Âå4�µ\&0õU ÃE€õÐ5•5“*u�&÷ øÓ‡b…÷ ¦Ç_C÷ |ÌË%VTwìûñ-ÈÑ w¾Ñ÷ ÔÎ÷ ŽÓóñ5Iñ5€ Hñ5@ D÷€0âõñ5@ ÷:0Ôõ÷ ·÷Ç0Èõ÷ îË;‡À ÷ 43‡Ä÷ ÞË#‡Â¥: ÷ )‡÷ ̈÷ š‡ô¼ÞAÞA÷5@ÀÎÄ à à à à ÄP7Š®Î7ѪÎ÷ 2Ó‡Á ÁÁÁbÁw"ÌÆý…C÷ ˜ËË%VTwûñ5äEõU@ õE€ ÷ –ÆõE@ ÷ :Ëц÷ 2Ë ‡À ÷Ø.þô÷ r҇à õU€ ÷ ®Ò‡…÷ ZÆ!È¥*,÷ R†÷ pÁ ÷ fÃðÝÃe?Å¡ Å üÁ`$†÷ J!÷ Æ ÆÁwjö…÷ ÆøÈ¥*÷ œÕ€ ”÷€ŽÿÁ÷5ZÞÁ€ Á%÷5HÞÁ%€†÷ ðC÷ tÊÕ†ÅÊÑBÂe?ÁÀ¡ à À û÷<ÞØÏ÷îÌ÷ ¨Ñw DÍB‚Å C‡ÁmÆÁå€ÂmøÅÂå€÷øÝ®Ï÷ „ÑÄd 7žÏ÷´Ì÷ nÑ- ô‡t ƒ÷ NCáÃM²Å@Å`wJÑL÷¨ÝlÏ÷‚Ì÷ tÑÁ÷ @È÷ ¾þÂP;Á…÷ n7 ¬þ‡ÁÁwZ CÃílÅÃe€÷Eÿˆþ÷P„þà à à à à à Á÷5BÝÁ€wPbþ‡"…C÷ ˜ÉË%VTwùñ5@ñ5€Ââ.Ê ‹$üñÅ÷ ŠÄñÕ÷ ÈЇ‚ÄÁwÌ „÷5ÜÜÁ‡wºdÄ÷5ÈÜöC÷ *ÉË%VTwšøñ5 wlÎ÷ ‚Ë÷ <Ðñ-^Îô÷ ÄñÕñÅ÷ TЇD…÷5rÄIÅd ÷hÜ,Î÷BË÷ üÏD÷šÛÎ÷ ðÏDã÷˜ÛÎ÷$Ë÷ ÞÏ Ð¥: ॠ÷ ZÓ,‡sd À óÓ × ‚î !!‡M%‡W#T‡M%‡W%T‡Í%ú‡Í ÷ Êχ÷5êÃw´ÁÁÁÁw´ò„÷ RÃï÷5@ºÃîDé„÷5²Ûè÷ 8Ã÷E€¤Û÷U€œÛ÷˜ÛÔÊ÷ŒÃTÍ÷jÊ÷ \χ(…÷5€|ÛÍ÷ ÃÇ¢*÷ úÁ‡÷5bÛW ÿÃw”Ê÷fÛÍ÷*Ê÷ χÁÿ÷5:ÛïÁÿÿìÄÂ+…÷5 "ÃV÷ LÒ÷jÚÞÌ÷ôÉ÷ ®ÎÅd Äå&=ä Ä 5ŠA-A‚W ú>‚uÐ05ŠÁ 7u 4‚uÐ&÷5 ÌÂ+w˜ÿ"…÷5@¾Â$÷ èÑ÷ÚzÌ÷�É÷ JÎÅd Äå,Á W ‚uW ² ‚M÷ \·÷5@zÂwFÿw”þwœþ÷ ˜Ñ— K W  †Á Á Á Á Á ”—  ”¡±‡¤±Ê‹û‡w "æ÷ lƇ“�÷ dƇ“�÷ èW  †K— :ã Ád æ,@^Á÷ æw:Â÷òÙ¸Ë÷ÎÈ÷ ˆÍB(·¦Ë÷ ¼È÷ vÍñ"ôÄ1¡ï‡1¡ì‚ CÜBÄàBlÄ üf·hË·€È÷ :ÍB¡‡±ýÁ3 ÷ XK‡÷ Ps‡”‡ €ï@÷ $ÿ†Ò‹þÊ‹ƒ ö±‡ 7 VðÐ¥[+”÷ Jð Â¥CÐ¥P!· 8ð”Á1É‹B¤üÁå1 ±B Á ýƒP”Â¥,áÂ¥] ¡Â¥UÐ¥B᱇÷ ‚æ¬ÊÁ"Èw¤Ê÷ ºÇ÷ tÌæÈ‚�wŒÊ·¤Ç÷ ^ÌÁ ÈÂ0ØÒ wvÊ·ŽÇ÷ HÌÃd ÃmØÁÁeøÿw\Ê÷rÇ÷ ,Ì÷% ÆÇ¡±‚�& w:Ê·RÇ÷ ÌV ‡&æ¦f&¦ v Þ €�‚ƒ„…‡ÿ ^ãæ'Iÿ Vãæ'LIÿ Nãæ' Mÿ Fãæ'ÌIÿ >ã (‚Sÿ 6ã (rT€LB )Ú()÷ )LB0:Á*ñº/ŠÁ ý7ÿ÷ $݇— /úÀ Àíÿ7þþÀN(÷ ns‡È•÷ ln‡ð‹kÈ•÷ \f‡ð‹cðµ_Ã)À$)÷ ôÜ÷PâB÷ ¶À˜(ÁÚ(ÂT(Ãz(÷ $3‡÷ &:‡ðµ97Hì7Jè7Brþ7Dnþ7Fjþæø(ÿˆ#‡ææ)ÿˆ‡÷ŠÿÀÿÁÿ7w 7wP@‡Á!ð¥ðÿ*ð¥æÿ* Á#Á$Á"Á÷ vwØÖ Á3øÀÈï7Œá÷¢Þ÷ \ãÁd É ïwvá÷ ŒÞ÷ Fãñ%LBóñ-Tï‡ �*÷äý÷Üý7âýwäýwâýæ”*ÿˆ ‡ææ)ÿˆ‡÷вý‡Á(÷ ÖwxÕ00ðÚF�D§3eaek›’÷%ÿÿbéÁ’ÂT ¦¦¦¦¦ff‚Áe÷ ~w Ò÷ Þø÷ R÷Nú÷ Pæ¸0÷5@¤üΰ0^!¬,‡À¬*Á0÷ 8üÁ0Äå¬,ñeI !‡Äåö÷ ü`‡ÿ ¬ôZ&¦1ÿ ¤ôf&1ÿ œôr&D1ÿ ”ô~&è0ÿ Œô (‚Sÿ „ô"(dSÿ |ô"(Vÿ tô:(„Sÿ lô:(lTB1þ1F12K1B2O1Š2S12W1ü2[143_1–2c12i1¢2m1†3q1H4u1Ì2z1¨2~1®2‚1´2†1À2Š1Ø2�1ä2’1ð2PRITASKUICCKPPARPMDINCSLVROPARRONPROAFFSYNCIOPSECXHRCLIWBFMAPDFBABCDEFHJKLMNPRST”Áî.Ãd à ý÷U@ý÷5fÐ÷5^Ð÷U,ý÷ ŽÔ‡— / Åî0Õ A ÷ ’ßú‡…Ý ï‡wnwp÷ PßwèüW ú‚‡wbÄø.İ/Äò.Á $ ÷ ˆT‡w2÷ zL‡”‡”— [w÷ ßw�ŸüwW ÿƒw— ,~÷ âÞw�€üwW ÿ}‚— ]q”‡æ÷Ufü8æ÷UZü2æ@æ=æ:÷U Büæ4÷U€6üæ@.æ ÷U@$üæ÷U ü"æ@÷U€üæ÷Uüæ@÷U€ôûÃú.÷ TÓ— Y— N'Ћ‹U¤‹E”‡Ãü.îÃþ.ë÷ &æ�÷ ÞÁe‡ � � � � w®û÷5ÎæÁ%ÿ‡÷U”û‡ÁÁÁ%Á÷ :wàÎ×Uü.7 \ý7 Zý÷²/PýÐ¥[ä÷Bý+”ÞÂ¥]Â¥,#Â¥R5Â¥W6Â¥E7Â¥D8Â¥*É÷Uðýå÷ ýÂ÷Mýýw ýÿMüüöüÿ]ôüðü”‡±7 èü· äü· àü· Üü7 Úü7 Öü7 Òü7 Îü÷ Äü¡À÷E¾ü¼÷E ¶ü¸÷E@®ü´÷E€¦ü°÷ \å��7 –üÐ¥[%”÷ Šü#Â¥C Ð¥P· xü”Á–1É‹B¤üÁå–1 ±B Á ý·P$û”Â¥,àÂ¥]”‡wÂþÂ¥UûÐ¥BøÞÿ ˜ðæ'LIÿ �ð (‚S–,Á0Àî,÷ ŒûÁ07âÿðµ÷eàÔÿÀÐÿîð þú‰`·¸ÿwŠþa w’ƒþwŒÿwˆÿæ ûÀ¬*÷ >û÷¶*”ÿ÷6ù”ÿ÷ Pù÷e2ˆÿÀð.Ð Àî,Ð À¸/ÁÂ/ !Î5@w÷ tÛ†÷ zÛ1‡Á*!Á,ÁÁ-Á.Á0Á1ÁO Á� Á‘Á2ÁU÷ Î w^ÐÁšùÁ›öÁœóÀâú÷5èÝ7Êý÷ð†ø÷ (ç€÷zøÀ¤øÁ¢øÁ Á Áe>Ä~ø!³Äe¬*&÷ þ€wŠþÃeÁ üÃeÀ ¢À5Ÿ7rþ÷U LýÎ5@ ÷5dü÷5\ü÷5Rü÷5Jü ÷5 nçÁ\÷  ÷E ýÀ:þð ökÀý7 Ù÷"Ö÷ ÜÚÀxÖ ô÷ B ‡÷5 ØüV÷5 çLQÀJçÀå7ÔØ÷<çêÕ÷ ¤ÚÁd wÖýwºØ÷"çÐÕ÷ ŠÚñ 4÷ ÔÎ ñ-þôëñ-øô"çñ­òô!ãñ-xü"Þñ­oü!ÚB$·rØ÷ˆÕ÷ BÚƒÂÞÕƒ ôÅ Ê÷5 @ü ÷5 ˆæÁ+wXþ7 TýÀFû7<ù÷>û8ùÀò,÷ ¶Ø†÷-(ù0ý÷-"ù*ýwêýÁPÂò,÷ ì ÷ýù÷ýùäõ5w 7ÜûÎ5@(Âèü„÷ Tü÷‹àú�Î5÷5@Òú÷U@¨û÷5Äú÷5¼ú Î5 ÷UŠû÷%|³lûw”ýA÷ üä€÷ ¢ À’ú÷5†úÂ�ü€ê7~úÎ5@ ÷ tú ÷5 hú÷5`úwfýÀmXø'‡ÀmTø$‡÷5råÀ%ÿ‡ ‚7û÷5\å ÷0ø$ûÎ5 ÷U úú7 úÎ5@Î5÷Uäú wÖüwØüwÚüwÄüwúwìüÁä÷Á5ÿñÁ A A A Î5ë÷5øäW W wœüÂÂBàÁ°ù÷ Æ0‡Á5?-w ùÀ¦ûð þ Ámˆ÷"‡Áí€÷ÁeÿÁEÿÁ A A A B Î5÷ b÷‚ B ÷5Zù ÷5\÷Á^÷  w:ü÷5 ú?ÃDûÂîÂìð    Áúó þÁlB ƒ÷5 8ä ÷5ùÁ\÷ Î ÷U Ìù Á[÷ º w€÷U@´ù÷ Øú ÷E@¨ù÷5 ðãÁ+w¬Î5 ÷U€ŒùÎ5÷U€~ù÷5ÈË÷5–øw¦û÷5Šø ÀNãðUº/÷5¢Ë÷5xöc÷5 fø ÷5^ø[÷5@~Ë ÁŽ÷ " R÷5@lËNÁPúf÷ FÖ5?� ÷5€*ø÷5@"ø÷5$ö÷5þ÷ ÷54ËwûÁe÷U€èø÷5âø ÷5Ë ÀôùòÀetüÿ`æºøN`÷²øºÔ÷ãÐÑ÷ ŠÖ·%4ÒƒwŒúw�¤ø÷E@Šøw`�øw` ø÷5€ ÷÷5@˜÷÷5šõ÷5t÷÷U\ø÷�n÷:ø Âù÷œæ.ø÷•2&ø÷�"ø>ø÷\õRø÷ â�Àâðøº/ðþ÷¼/÷Uø÷5@4÷ ÷5 ,÷ÀôáðUº/÷%­â÷÷%|³Ø÷ ÷%²KÒ÷ ÷5÷ÀÊáðUº/ÁîôÎ5@w<Ãò,Ô÷ LøÁÞöÀäøð þ Ál‡w´øw²øTóU€7 ÈøÂ� ÷³`÷ Ö ‡÷eÿ�ø÷EÿŠø÷ †øwvùw`ùÀ–øð þ w6wNùw\ùw^ùÖ wdù÷5ŽÉ÷÷ XøÔ@÷÷ Æ÷ÔÂ6÷lí‡ð5 8ÿ&Îm>öã‡æ÷Îí4öì2ÿ¶#ƒ¶Ö ÁN †Î Ñ00ðâF§Fl1DATADATADATADATADATADATADATAÁ úÖ ÷îööÒ÷Lá Ð÷ ÆÔÅd A� º‚·Ôö÷UÖö7Úöð5 8ÿ*ÿ¡Áe?ÁE?      wÒ÷w`²ö70ÿÆ÷7l0ÿ¤öÁ0à1úº/1ìîº/Ášõlü‰‡Tw|÷wz÷óU€· �÷÷ ¦‡Áf÷ôm„÷úÿ7 |÷w T÷ ƒwN÷÷eÿH÷÷EÿB÷÷ >÷wÎþ7 ôõ7 lõ&Ä>÷WÄ5*Ä 7Ò÷Ò÷zà(Ï÷ öÔ÷5 ¬Ï÷U úõÄtÏ87Äõ7ìÑ÷Ï÷ ¼Ó·ŠYÏ7ÚÑ÷ðÎ÷ âÓw.÷ÞöÆÑ÷.àÜÎ÷ –Ó÷5 `Ï÷U ®õÄ(Ï7xõ7 Ñ÷¶Î÷ pÓ·Š Ï7ŽÑ÷¤Î÷ –ÓwâwXw@À”ö7ô†ö÷ ‚ö7ö~öð ø"÷erö÷Elö7løfö&øN ‡N ‡Öm@ö‡&öN ‡N ‡&N ‡N ‡–e†w$÷÷ 0ö„wF÷U õ÷ öÁ· ÀôÄÃeæÀ®/÷ ²ôó ÀÀe÷ lцÁ/÷ ¸÷ Zуõ5 õ-Öõž‚À/0 ð€€ðU@0 0 ÷ VÞ�0 $0Š"0Š#ð õðšõÀ*/Ð Ðhô ð†õð÷ �ÆðíxõÈ|ôðmzôH 0 $$ Á˜Þ÷ äÇ4‡7róÄNõô þ· ,õ„÷ ‚7 "õÀ6õð þ$÷ õÂDóæ ÃeÎeÎE³e÷,òô‚wðõ· õ÷ Bf 7 þô †wÈõwÄw¤æ:/Ãeó5 ÷ ¾ôË w†÷´ô7®ôË Ö Ö Äe÷ ôÁ0ÉŠôá„ôÀ¬*÷ @ð‡À÷ pІw0�N· &ó÷ Ý�w]$î ÃbôÄ\ôAó,Á, ƒw¦BÀó5€ÀEÁ,òÁ:ô÷ $‚†wó5÷5:ÅwÞó5 ˜fÁôñ þó5· ô�÷ :f 7 öó †wÀôõµ€ó5F ó5ABÂEøÿ· ²ó7wØþ”÷ óÁ÷ ´ów Žó ÷ Šó÷,ˆïw vó‚ó5 T÷ äòÁTw^ó÷ –†±‡Ö Á5$Á6!Á7Á:Á;Á4ÂÁ<Á– Ác ÁUÁÁƒfÀ6ñ¦ÁJÜ÷ ÐÆ‚�÷ Ìw\Ä¡ � � � � � ‡¡A A A A A A ‡÷ <ò ÷ 6òÁ¶òÁì‡÷ Èÿ� TB÷ òÁ÷5ÎÛ±T÷ ò÷ BÁ÷ Pôþÿ÷ òñÁrò÷ dÔUó5€ôEþÿ÷ Òñ¡‡A A A A ÁEøÿ‡Â   ÂÂEøÿ‚ ”�‡÷ Øÿw2òÁ ó5Áe€ÿ÷ 6òÁÕT�‡� Áå@ÁE?àÁ Á L‡æ?ÀEðÿÁÞ 20Ö ‡À À À À óW ‚´Þ r Þ r Þ ´Þ Ö ±‡ÀœÚ7ªÌ÷ÀÉ÷ zÎÁd @77¶ñ7’Ì÷ŠÌ÷òÚ É÷ nÏ÷ ªÂ ñ-Ôè!ñ-Îè"ñ­Èè!ñ-Nð"ñ­Eð!B$·HÌ÷^É÷ ΃´Ƀ ôÅ @ɱ‡÷ 16ñ· 2ñ¡‡ÿ zå (‚SÊQ|³0Ì~€WR|³²K,f|³j q|³lx|³FÓ4|³vR)|³x»z_Mzx|³|ZŠ|³nÄQ|³pÀî,Á0Éea ÷ TûÀ˜ý7TùÄè*&D—#ÿF‚÷vþrÿ Í 1ä Á\þW#OV÷5Zÿ&T%CÀê0ÐÁ ÷ †È•:Àê0÷ ØÔ÷50ÿCœ·(Ú÷>×÷ øÛT÷ –þÔÁÚT÷ ˆþ ÷ ‚þU%÷ Î ÂÖ ÁÁ)÷ 0w^ÐÄeÁ ü÷ TþÔ.ö÷ LþÔ(ö÷ DþÔ"ö÷ <þ%÷ 6þÔŠý÷ .þÔ€ýÀ¬*Á0÷ hú7 êþ7 èþ÷ ÐüÁâç÷ 2Ñg‡7®ü7ÎþÅd Â*/2 •Á ýÁ¾ç7dÙw|Ö÷ nÛÁýX÷ þ†÷ ì‡Äœþ7ý7>Ù÷TÖ÷ Û·Š«Ö7,Ù÷BÖ÷ 4Û=ÁÞüB� Á ÷ ¼Ð%‡7^þ7ÜüÅd •µŠÿÿ÷ 8üÕ2ü Ã:/Õ ý7âØwúÕ÷ ìÚÀ&þÁ�ü� Á ÷ ªÑÀþ Áç÷ œÑÀòûÁç÷ ŽÑw²þÀ€æð5º/÷ À‡‡Áúæ÷ 4ÐØ‡&ÀÀûÁÖæÅd Â/2 òe ²2Š"2Š#•Á ýÁ®æ7PØwhÕ÷ ZÚ€7ü÷e ü7ü÷eü÷U€ü7 .ü7 ,ü÷5Zæ 7ü÷e,ü7 ü÷e@ü÷5>ÎÁ–å1 º/÷5.æ Á„å1 º/1¼/ñmxå¼/1 ¾/1 À/÷ Î ÷*ô¨û÷&ô¶û÷�"ô¯û· ¤ûÅd  淮×÷æÄÔ÷ ~ÙÂåAwš×÷ pÙõ w­ zû‡BAñwdû·x×÷ NÙ5÷ ~ÙÃ>ûÄ<ûÂð0Ê #Ê 2!Âeöò%ÿÿ‚· ‚å÷U"û· °ä÷5bÍ · ×÷6Ô÷ (ÙÁº/Âzå‚ U ýÁnå7þÖwÔ÷ Ù‡W!î. ‡Àî,Á0ñeI ÷ š÷‡Á>åf¡ � � � � � Ö5?� ÷ φwL&ÀèùÁþäÅd Â/2 òe ²òU2Š"2Š#•Á ýÁÐä7rÖwŠÓ÷ |Ø€÷ À>ú÷À<ú÷U€@ú÷5Œä÷,ÀFú÷@ÀTú÷5xäÁÎã1 º/ñÀ¼/ñmÀã¼/1 ¾/1 À/÷ HÌ ÷ròðù÷nòþù÷�jò÷ù· ìùÅd Âèã·öÕ÷ Ó÷ Æ×Âå·8û7 8ûAwÚÕ÷ÒÕ÷:äèÒ÷ ¶Øw­ ²ù ‡÷¼Õû÷¸Õ ûAéw’ù÷þú¦Õ÷ôúžÕ÷ä´Ò÷ ‚Ø5÷ ÙÁº/Âðã‚ U ý7zÕ÷rÕ÷ÚãˆÒ÷ æØ¡‡±‡ÄÊãÄå&Ä>ãÄå& 7FÕ÷®ã\Ò÷ ×Åd DÎ Ä 37*Õ·$Õ÷Œã:Ò÷ Ø 7Õ÷|ã*Ò÷ äÖõ @ã7Pú¸ø‚  7îÔ·Ò÷ ÀÖÀd ’÷ žøÑÀeÂ:/�$ËÃ~¡– ‡7 ú±úÿ îæ' Mÿ î (‚S00ðêF�D§3eaek›’À/ú/ððð& ð(ð(ðâýððÎðEðU€÷5€Øû ÁÂûÁ A A A ÁEøÿpPðE€ð€€÷5¦ýðU@÷U""Nþ ÷5 �ý÷5ˆýðUð2þ÷ "è�0 $0Š"0Š#À*/ЬöÐ>þÐrþÐpþОöÐ  ИöÀ/Àe÷ $ÛC†7LýÁzè÷ ÆÑ?‡÷ `èÃe ÷ Ú÷ ×÷ Ü&ÁPè÷  Ñ,‡7ýÅd Ä*/4 Á ý7ÚÙ÷,èðÖ÷ âÛÅd Ä/Áè€4 ôe Á ý7®Ù÷èÄÖ÷ ¶Û‡Á'Á÷ w Ðÿ òò (‚S"S ž(î(˜(÷ ¢(z¥Æð¥Æñ¥Æò¥ÆKŠ¥Æ…¥Æ·0ÿ7 8ÿ÷ vØ_õ5}õ5€õ w2f· ÿ@ wŠâ÷Üð ß÷ Zäf÷ ¦Ø0â(÷ *Ø$wÌþwÈþ÷ Ø ÷ØVâ÷Nâ÷¶ðdß÷ 2å÷þ×<â÷¤ðRß÷ äSS"K�! SSK�wvþwrþ7â÷\ðß÷ ÖãCeõ (õ ,%õ50Þ×ó5s-& ÷ ú×Á¢(IwPþQ"I�!Á?ÁMÁ�ÁwÀV(H"` È0Š`" @$f&7 âý÷5ªïw<Ôýf(ÎíÌýw�Øýw0Ðýw�2Ðý÷�ÌýÌý÷²ý÷®ý&w(ªý@& „ÄlÁAwá÷hï(Þ÷ ââC ƒà÷ tý †@B Bmé„à7!`ý+‡7\ý€·Rý…ÅmDý7Òà÷èÝ÷ ¢â÷>ÞÂà÷ ØÝ÷ ’â÷2ÞýÀí*ÞÁ,Þ÷ –úÀm"Þ7�ýæH(ÿˆ †Á$ÁÆøü÷ €wüÖ÷ ªÖ`À¬(Áî(  ÷ †J‡Àî(ðýðýð�ýæ€(ÿˆ7‡ææ)ÿˆ1‡÷Šîü.Àd Á¢(÷ ( Á¢(ð¥Àeà1lîI ÀP(÷ ÈÕ1lI bPPPPÁ ÁÂL «Á¨Á#wHÿÁ!ð¥ðÿ*žð¥æÿ*òÁ— Å D Å D Å D Å D Å D Å D Î Væ¶#‡Ž6 Î Î Î Î Î Î ·lÀd ÁP(÷ jÀ  BƒÃEþÂ@&Ž  ‚ÕÂÂe÷ X †¬*öÿ¨° ¥‚‡Ãm(× Ÿ‚ðd ð@ð@÷ .–‡ðe@Îå@ñÖ ÷elûw fûÅeD Î Îåª‚Ö Åd ÷ ¤Ôwš÷5žÔw÷5Õx÷UŠÔ÷|ÔÀÞ÷íÖÛ÷ �àw,ûwrÔwnÔ ñ )q- )q-)Q$ó÷tì‚Þ÷˜Û÷ Rà� AaÉ MÉâú÷ zàA!R÷Nì\Þ÷rÛ÷ ,à� AaÉ%ÿÿ<Ñ ûñ¶úþÿ÷ LàÁ’÷ .À )÷ $ß0‡Åd B BmÂ-Žú'õmÚÓ÷ àÀÂÓÁ^ì÷ äÖÁ¸Ów BìÁe͸ÓwêÝ÷Û÷ òßwnÁ‡Á?Á”w<ýÁ•÷ ¼÷6úºÝ÷ìÐÚ÷ ŠßfõbÓ÷ ´ß÷XÓœÝ÷ rßõ ú µõE€õ5õEwðù÷ ìù5 õUµŠ÷5ÓõU5Š"5Š#wÔ÷2Äæ2ÁT(÷ .Á²ù÷5€¤ùÁåWtwœù7 –ùÀ†ùÃÀ w†ùw€ù÷ ¤Ô†wý7‚ù&4 ô:4m:ôå:<Á Á Áe>Á`t$wJù4 ÷5€6ùÁ6ùfÁe€¿t 4 8÷5ù6÷5ÒÒ</Á Á Áe?WtúÿÀùtúÿ@à7ù÷mäøüøt7èøÀeÀ48Ãd Äe<÷5ˆÒ÷ ÷ BÅ õ÷5rÒ÷ Z÷ Š÷ ªøû÷5€œø€túÿÀmˆøÂ@Ád   ý7Ü÷úÛ÷€Ù÷ nßÀ\(�÷ ¨ †w’÷ \ø Â*ê²d õ@ø õ<øõPøõrÑõU÷5nÑõU÷5@ÖÑõ�ø"&7ŽÛ÷ä館÷ –ÝÁ ÷ &Ó†w 5 õ�î÷5ŠõÑ5 õ•õ• µ 7JÛ÷ `Ø÷ RÝ÷¶÷:Û÷�éPØ÷ Ýw¤÷µ÷ 4Ý·Û÷ ôÜõ�÷55 ÷ ÝÄŒ÷÷ ‚÷!ÄåÀÁEÀÿ¡„ „ „ „ „ „ ÄmX÷7àÚwÚÚ÷ð×÷ ¾Ýµ5õ2÷ ÷ <Þ7¸Ú÷Î×÷ ˆÜµ5õ÷ ÷ ®Ü÷RЖÚ÷þè¬×÷ fÜ5 Àe5,5.µ&õU ÷ €Ü÷ æöÀàöÁ¶è÷ @ÓÆÈö‡€Áªè÷ 0Ó€ÁÈö÷ &ÓÖ wZú7 8ÚÀt(  ÷ È•:Àt(÷ ¾ÔÔÚ!æ4‡÷ j !æ4‡÷ ^‡ !æ4‡÷ N !æ4‡÷ @× d ‡÷ ‡ÂÂåd æ¢Û÷d œÛ÷PöÀÙ÷¸Ù·ÐÖ÷ .ÝÃd ÷e6ö·zÛ‡À0ö· öÂö·àö÷ öæXÛ÷æ2RÛ7xÙ÷pÙ·ˆÖ÷ æÜ·<Û÷eòõæ0Û÷æ2*Û7NÙ·fÖ÷ XÛ·Û÷eÐõ÷ ¼õ Àæ2ÁV(Éea ÷ ‡ Ê2÷äý÷Üý7âýwäýwâýæÎ2ÿˆ ‡ææ)ÿˆ‡÷вý‡Á(÷ Âw>Í"S Z5 5T5÷ 25w0dÿwlÿw"dÿw�!\ÿ@$w& Ö÷`ä Ó÷ Ú×õ5w>ÿ7îÕ÷Ó÷ ¾×wàÕ÷ öÒ÷ °×wÿ@íA÷ ´ï@m7�ÿæ*5ÿˆ}‡÷ ÞË0À^5Á 5  00ðòF§Fl1DATADATADATADATADATADATADATA÷ º{‡ñäþñÜþñ�Ôþæ<5ÿˆt‡ææ)ÿˆn‡÷ŠâþkÀd Á25÷ `þð¥Àeà7lîœþw –þÀæ2Ãe<Á25÷,ü÷ 2þæ?& ö 6Ž ÷ �Ä-÷5Xþ À¾÷ zÁ ÷ òЕ:7üÔ÷Ò÷ ÌÖwîÔ÷ Ò÷ ¾ÖÀ¾÷ „ÙÈ• ” �÷ ²Е.÷ Ê÷ .Ó Ç–%‡Á$ÁB÷ ¦w"ËÁ#ð¥æÿ*öÁ(ó× æ4 ‡Àæ2Á45Éea ÷ vý‡Uqv…'Oqærz~Z÷ þÕ7 Ê7 Ê&À¾÷ $wÊ€÷ ¶ÎX‡Â¥/ ÷ ‡Âz7÷ ؇ Ä\„7Âr7Ä5Ât7Ä5Âv7Á¾É÷ °†wâW 'È¥/€  ÷ Àf‡Âz7÷ Œa‡Ä<„7^Ä\„7Ä5Y÷ <ÎV†7‚ÉÄ5À ÷ ªÔa‡æ€ÿ÷ á€Î€V- W†7PÉ÷NÉ7 LÉ5À ÷ ¾Ô9‡÷5@Éw70É÷.Éw&lÓ÷Âá‚Ð÷ <ÕÅm¸á@ÀmÄá`™Å%d ü‡7 É÷ É 7DÓ÷<Ó÷¤áRÐ÷ Ö7,Ó÷”áBÐ÷ üÔÀðÈÀæÈHÁ;÷ ÄÈ@ÁºÈ÷ ôॠ.÷¬È¬È÷|³¤È°÷%Uq¢È÷%VNšÈ ÷5šÈ÷%'ŠÈ÷%v…‚È÷%|³tÈ÷%­nÈ · rÈ÷ òÓ‡÷5hÈ w$ÿÁ>÷ ’wÉÁNùõ ú7BÈw|Ò÷’Ï÷ LÔD7jÒ÷Àà€Ï÷ :Ôõ äÀ¤  – Ê R Ó ú±‡f&ÁŽà÷ ÚɆ€V Á Åd ÁvàŠÁ ýÅd �uuµ 5 5õe5 õe �‡·ðÛæƒÃU·âÛæƒÅd 7ÄÑ÷àÚÎ÷ ”ÓD- õ5wÂõ w¸f D- õ T÷øßˆÑ÷žÎ÷ XÓf·xÑ÷àߎÎ÷ HÓN÷ ‚ó÷Lß\Ñ÷ 2ÓN ·RÑ÷JÑ÷ 4ÔN÷ \Î óÖ Ã5 À€ÿ÷ œÞ€À€ ƒ÷fßÑ÷pß0Î÷ êÒÍ uD-wüÐ÷ ÒÒõ õ¡ÃEƃ‡±ùÃ55!&ø@!7ÌÐ÷dâÍ÷ œÒB“AÑ @ �`fÎE@ û‚‚ „#à·¢Ð÷øÞ¸Í÷ rÒD- Ö ò‡ÂFÆ÷5¸Æ ÷-0Æší÷-*Æ”íwdBÄÆC ò5w*ò5€w0… B-·:Ð÷ PÍ÷ Òõ‹ Bòwüw w õ ÷€õ öD&ƒ 榀2 êu-,.æÁ ÷ ÈÈ÷àÏ÷6ÞöÌ÷ °ÑÂC÷ÌÏ÷ ¢ÑÄ ÷fC÷ vÅ 5 õEõŠõU€÷ °Ñ·šÏ÷ðݰÌ÷ jѵ÷ šÑ÷ BÅ+ÁÖÝ÷ \È€ 7pÏ÷†Ì÷ @ÑA÷ BÈ÷ÅXÏ÷ÀÝnÌ÷ (Ñ÷ xÅõµ&5 ,õòÄ.õe,.÷ >чÁAÁM÷  w”ÅÁ€ùÁöÁ�óÁ“ðÊQ|³0|³²K,f|³j q|³lÌ~€WRx|³FÓ4|³vR)|³x»z_MzZŠ|³nÄQ|³p÷ vÄwzwNwPwPfõ õ€õ ô÷5ÌÜ(õ @í÷5¼Ä!õ5÷ ¢Ä÷ &á‡÷ *Ä ÷ÄbÎ÷ZÎ÷ÂÜpË÷ >Ñ÷ÄHÎ÷°Ü^Ë÷ ÐÀøÃf,ð5÷ žý Ö k÷ âÃ÷ Öà �÷ÜÎ÷&Ë÷ Ð÷¼ÃÎ÷øÍ÷`ÜË÷ Üе÷ dÑ÷ Z ÷˜ÃÚÍ÷BÜðÊ÷ ªÏµ÷ ÚÏ÷ Ð:‡Àê<È È-lÃð-hÃÀeô7 Û÷5Ðà 7ŽÍ÷¤Ê÷ –ÏÀ:ÃÁèÛ÷ :à Áe?ÁE?Á Á ÁwÐÆwDÆÁMÁ]÷ N wÊÃÁù×-úÂÊQ×-ôÂ|³Á®Ú Á ÷¤Ú*ÍwBÊ÷ üÎ� €d 7Í÷,Ê÷ æÎÍ-ÂÂÒ Á ð¡‡Á—±û÷ ²Â ÷¤ÂêÌ÷âÌ÷ ÌÏ÷’ÂÖÌ÷ ¬ÎDw<7ÄÌ÷dÚÉ÷ ”ÎfõŠ: CÓƒ à ·¤Ì÷úÚºÉ÷ tÎõ 'õ w@õ5€fB ·rÌ÷ HÎB‚-÷µ÷ nÎÀ ÁªÚ÷ 4Å€Á¤Ú÷ *ÅÁ÷ "ÅW÷ Jη4Ì÷ŠÚJÉ÷ Îõ5€Jõ Gw-ÐÁC÷þÙÌ÷$É÷ ÞÍuAwøË÷ðË÷XÚÉ÷ ÔÎD-ð÷HÚØË÷@ÚîÈ÷ ¨ÍuAwÂË÷ ˜ÍD-÷ ·²Ë÷ÚÈÈ÷ ‚ÍuÄ õEõU÷  ÍÖ ¡‡÷ FÁÁ:Á Í2Á÷bÙrË÷ˆÈ÷ zÍwdË÷\Ë÷ÄÙrÈ÷ @ÎõÁ÷ ÆÎõüÀ÷ Nͱ×fff CfÄÚÀ÷ :ù[‡€7Ë÷dÙ(È÷ âÌ@- RÁTÙ÷ ÞÃÃ5€1Ã5÷5 Á÷-˜Àè÷-’Àüç÷ÂØÐÊ÷æÇ÷  ÌCË%ÿÿ û÷ ÈÌ‚·°Ê÷ÙÆÇ÷ €ÌBÂ-XÀôµ÷ ¦ÌÆeÂFÀ· ÐØÂe�·zÊ÷�Ç÷ ‚ÌÀ&ÀÁÂØwHÃÁÁ€÷ RwÎÀ"S ¾AB¸A÷ ¤FIXEDFILE ID:(÷ ¸Í7 ôÿ7 òÿ& ÷ ćÀ Á÷ twÜÿ ‡È¥ Ž ÷ `wÊÿ÷ê×zÉ÷�Æ÷ JËÅd DÄ @Î57^É÷VÉ÷¾×lÆ÷ :ÌD27@É÷¨×VÆ÷ ËD'Î5 Î Ž ÷fÿfÿ÷|³^ÿÊ÷ Xÿ÷%|³Pÿ÷%­Jÿ ÷èÖøÈ÷Æ÷ ÈÊDÎU¾Ö wðÌ÷ $ÿ w-ÿ´w-ÿ° 7 ˜þÎEõ �· Šþf&f(& NÝ f&fÀ¾A÷ ŠA÷ ‚Е ÷ ´¾ w4¾w"0¾w�!,¾w�! ¾w"¾&@$7ZÈ÷pÅ÷ *ÊwLÈ÷ bÅ÷ Êwîý@íA÷ â@m7�Üýæ˜Aÿˆ†w@·È÷jÖ*Å÷ äÉ÷ 4¾ ÷ Ôýõ5w¦½Á 5ÀÂAÁB  ÷ ô*‡Á ÀBppp’æ Aÿˆ‡ææ)ÿˆ‡÷Š~ýÁ¤@÷ šðÁ¤ð¥Àeà1lîI @€÷jî÷ pð€A÷ ^A÷ VЕ �B÷ BЕ ö5ð•+ÿÿЕ ·<Ç÷’ÕRÄ÷ ÉV- w &Ç÷ üÈA÷ A÷ Е �W cЕ W Е  ÷ ÖЕ.Е �÷ XÔ€A‚ ÷ Ä÷ HÔ�÷5Õ  ¨0œþÿüÿ0œÿÿýÿ0’þÿ0œÿÿÈ•0”Е Ð�VüÐ�SüÁPü ÷ ‚Е:Е-÷ ¸¼Â:¼Ã8¼æà B à B à B �ÁÁEøÿÁe0P�Î ñÖ Á(B÷ æÀÁ¼ ÷ 4Е, Áö»÷ &Е)�A- w*Æ÷ Èõ5Á"B÷ ªÀ÷ w¤üÁ$÷ w~¼:://--JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC;; c¢00ðúF�D§3eaek›’ w0& Á Â  ý÷ Zð¥0þÿwð¥9þÿwø— :Â¥- — /;ÎUÄëEæÅ:FÎUÄîEèÅ>FÎUÄèEàÅ.FU W‡U U‚SŒ „ Â¥-÷ RK‡÷ Üð¥0þÿEð¥9þÿAçÌ‹ô‹;£:8Â¥ «Â¥ 2ÀFÓÀå 7ÎÄ÷äÁ÷ žÆŽ †Àxº7¬ Ftº †À%÷5hº÷%^ºÃ¬÷Â÷Â÷ – †Ã Áj ÑÑÉ÷ ŠÆ‡Á÷ jwæºÀÖÒÀå 7^Ä÷tÁ÷ .ÆÀj Á Ñ¾ÁѼÁÉ´ÁÅ À¾ÄèE÷ PÌ‹•úЕ AMu÷ 6Е-AÁ W †Á Á PœñEPœòEPœóEЕ-÷ wêÂL Á wÖ&@Á ÷ ¾ÝÁe0Àe0€��P�‡7t¹ÂñEÁÀh¹Ê‹ ¤üÁ% Ò‹þ� ó¤wJ¹¡±‡À´Ñ7~Ã÷”À÷ NÅ@‡7hÃ÷ >Åõ-¹ôõ¥õ¥ìfÁ÷ &¼7>Ã÷TÀ÷ Å�÷ @ÅÝÿ ŽÜæ'Iÿ †Üæ'LIÿ ~Üæ'þLÿ vÜæ' Mÿ nÜæ'ÌIÿ fÜ (‚Sÿ ^Ü (rTÿ VÜ(ìVÿ NÜ(0Wÿ FÜ:(„S·øÿ÷ P÷ ²÷ €÷ œw ¾d Ä ÷÷5€Òÿ÷þ÷ ¼÷ ¸wöƼÿ÷ îwzBOOTDENS@)p)ä)÷ Ö-‡÷ Ð*‡÷ NK— :$ã5 !ò+÷ ´‡× ¾+úƒ×¢/Á˜( 7 dÿ7 \ÿ÷ Œè‡ …|¤(Ñ‹þÔ É‹õ×¢ ÁwxÿÁûƒ× ¾+Ó• úÓVM ÓÓææ=ÿˆ‡ÂÃN(÷ <à‡÷ 6݇¤:Ú¢ ×÷%DXêþÚ÷%DYâþÖÒ÷ Þç¨ ÉW €Ê· ÆþË ”×¢0‡Ó¥9†×¨A‡Ó¥Z‡ž+DD€Ú,â,MM€àº,Â,PP Ê,Ò,MS€Àº,Â,CT€ÈŠ,’,DT€š,¢,MT€àº,Â,DU�ú,-MU€àº,Â,DX‚ª,²,DY‚ê,ò,ÿÿæ )ÿˆ †Â¤)·€Êž+Á$÷%DYvÿ÷PH÷ æ¨)ÿˆ÷ þ ÷%DXR÷%DYJ÷ôýBÅ®)ÅeÕ-6û‚Á$wþÁûC÷ Êý ÷%MM÷%MUñÃU÷°ý€×­ wdþ÷ Îà €÷È÷ †à €÷@ºæà €Î·´÷ hà Ä.ÞÄåÂ(ÞÄ Âà €!pƒÄpÂà €÷ × !pæôÝÎå!‡Ä Âà €×-zÜ!ìƒÄìÂà €À÷®)<÷`,÷ ê÷5€Vþ‡7t7 *·Þü÷ ðí€Õ ]) t+FÀ   ÷ 2‡ððd ‡À !ð:ü0÷ ñ†Á ÂL '@ wZÿ÷Jÿ÷ · Tÿô…7Fÿæ|+ÿˆ†×-ÖÓÿÿ æ1ÿˆòæx+ÿˆ÷‹ÿ€×-ÿÁKwü‡÷þþß÷öþÛÿ Âø¢&,-ÿ ºø®&,-ÿ ²øº&,-ÿ ªøÆ&,-ÿ ¢øÒ&,-ÿ šøÞ&,-ÿ ’øê&,-ÿ Šøö&,-ÿ ‚ø'.-ÿ zø'.-ÿ rø',-ÿ jø&',-ÿ bø2',-ÿ Zø>',-ÿ RøJ',-ÿ JøV',-ÿ Bøæ'Iÿ :ø (‚Sÿ 2ø(€Tÿ *ø(ìV7÷äÔw ìþ²+€J-€Ê-‡ òàÁ@ÿÀÅ× à‡ÃÀße€ìôDɕɋþ€Ä SœùÉÕɵ ýÉ ÿ�×  Æß zÅ ìôÃÀÙÀ ×– ŠàÆ÷ Aßà0þÿÄàôÅÀô ÕÀe€!îôøƒä€Ÿ zÿ ÄÀ_ìôÌ ‡Åe W!€÷‡D… … … À4 ‡@À ÃÄåêôÄ aÔ ŒÔ Ô× ü‡‡öU_7Ê÷äÔÈw ìþ²+€J-€Ê-‡ ¨àÁ@ÿÀÅDɕɋþ€Ä SœùÉÕɵ ýÉ ÿ�× Æß dÅ äÀ âb VàÆ÷ '  Ì ‡Åe ÄeW!€÷‡… … … À, ‡@À ÃÄåaÔ ŒÔ Ô× ü‡‡öU_7¨÷äÔ$w ìþF-²+‡ ŠàÆ÷ Aßà0þÿÄàôÅÀô ÕÀe€!îôøƒä€Ÿ zÿ ÄÀ_ìôÌ ‡Åe W!€÷‡D… … … À4 ‡@À ÃÄåêôÄ aÔ ŒÔ Ô× ü‡‡öUÁâþÂÀ À À�ƒ Š Àe ñ€à (11 Â50ÉUɕɋþ€É ú€ñ þÿ€ÉEÉ•É5€€ö�üW,ôè‰�É‹þ€É �Âeӱɕÿ†_00ðG§Fl1DATADATADATADATADATADATADATA7t÷äÔÈw ìþF-²+‡ VàÆ÷ '  Ì ‡Åe ÄeW!€÷‡… … … À, ‡@À ÃÄåaÔ ŒÔ Ô× ü‡‡öUÁâþÂÀ 11 ÉUɕɋþ€É ú€ñ þÿ€ÉEÉ•É5€€ö�üW,ôè‰�É‹þ€É �±É•ÿ†_7l÷äÔjw ìþF-²+‡ NàÁxþÉ‹þÂÀ ÂUÀÀÄÅÆÎÎe>Þ €S’üÄ ‘¥Þ û�$©Å × à2†!‡ÄeæÀ êôá ÿ�ÂÞ ‘ñ‹þÿý÷€Þ ú! ß ÖÀ À ÄÅ ìôÃÀ€ ÂÇÅ W!óÿÒÅ ÄeÄeËÃÀße€ìôÈ ŠàÆ÷ Aßà0þÿÄàôÅÀô ÕÀe€!îôøƒä€Ÿ zÿ ÄÀ_ìôÌ ‡Åe W!€÷‡D… … … À4 ‡@À ÃÄåêôÄ aÔ ŒÔ Ô× ü‡‡öU_7 ÷äÔw ìþF-²+‡ àÁxþÉ‹þÂÀ ÂUÀÀÄÅÆÎÎe8Þ €S’üÄ ‘¥Þ û�$©Å !‡ÄeæÀ í®á ÿ�ÂÞ ‘ñ‹þÿý÷€Þ ú! ß ¾À À ÄÅ € ÂÍÅ W!óÿØÅ ÄeÄeÑ VàÆ÷ '  Ì ‡Åe ÄeW!€÷‡… … … À, ‡@À ÃÄåaÔ ŒÔ Ô× ü‡‡öU_7Ô÷äÔF÷ÞÔR÷ØÔ¾÷ÒÔ†w Úþ²+l-l/0~0�12‡  ”àÀÀ7èÿwæÿÀÄåÄ5#SMA#UMwÁ õÂ9¡ñU ‡ññþñÿ‰PÉ‹þ€É ÿ�À óÅ¡ÁRõÂ`ñÿ‡ñ5þÿüñþ‰PÃà þñ5þÿüÉ ÿ�À ðÅMÂÂePÿ7 Jÿ·NÿÂe·<ÿ7 >ÿÂeøÿC£É‹þ€÷À.ÿ÷*ÿ7 (ÿ÷$ÿ ‹É‹þ€É €DÄEñÿÄ%Ä% ÿÅ Å÷UðþWÿÄöþÄEÿ¯Ä%Pðÿ÷mÞþØþ†· Ôþ ÷EÈþÀ ÔÅÁeÀ„…þÿÊò4m ñ þÿÉ ÿ�Ê ü�f ÎEàÿÖ ÿÀ ìÅ 6öU÷þ–÷þýŽÀÿ TÀ ý÷~êý÷zæýÆ÷ 9ßà0þÿÄàôÅÀô ÕÀe€!îôøƒä€Ÿ zÿÅ>… Å Å Å w8 ÄÀ_ìôÌ ‡Åe w!"÷‡D… … … À ƒ@À Ç  2à÷ ÄåêôÄ aÔ ŒÔ Ô× ü‡‡öUÁ õÂ9¡ñU ñþñÿ‰PÉ‹þ€É ÿ�À óÄ ÿÅžÿ_ 2à÷ ÄåêôÄ aÔ ŒÔ Ô× ü‡‡öUÀÀÂêô ¡B B B B B D B D 7Èÿ7ÎÿÂe<·ÄÿÂe·²ÿÂeøÿQC£É‹þ€÷À¦ÿ7 ¤ÿ7 ¢ÿ÷žÿ ‹É‹þ€É €DÄEñÿÄ%Ä% ÿÅ Å÷UjÿWÿÄpÿÄEÿ¯Ä%Pðÿ÷mXÿRÿ†· Nÿ ÷EBÿÀ ÔÄþþÅüþ_ 2à÷ ÄåêôÄ aÔ ŒÔ Ô× ü‡‡öUÁRõÂ`1 ñ5þÿüñþ‰PÃà þñ5þÿüÉ ÿ�À ð_ 2à÷ ÄåêôÄ aÔ ŒÔ Ô× ü‡‡öUQ00t€@€€¨KPsP÷0¬ÿð þÿÈ ÿ�Ë ü�f ÎEàÿÖ ÿ‡7ÜÂÂeÌÿÃÃe¾ÿÄÄePÿÅÅe~ÿÁêô vw`ªÿw ¨ÿ7`¤ÿw`˜ÿw –ÿ7`’ÿw`ˆÿw †ÿ7`‚ÿææææÀÖþô�ÐþÁPÈ ÿ�H0üˆÁ ù€‹££³þÿô•÷ Vÿô• ÷ Lÿô•%ô ÷ <ÿô•%ô ô ÷ &ÿŒ ô•!ô ô 4 4 ÷ ÿ4m t × öÄBþÅ@þ_7¨÷äÔ÷ÞÔú÷ØÔ^÷ÒÔöw Úþ²+l-l/â/J081¢1‡  ”àÀÀ7èÿwæÿÀÄåÄ5#SMA#UMwÁ õÂ9¡ñU ‡ññþñÿ‰PÉ‹þ€É ÿ�À óÅ¡ÁRõÂ`ñÿ‡ñ5þÿüñþ‰PÃà þñ5þÿüÉ ÿ�À ðÅMÂÂePÿ7 Jÿ·NÿÂe·<ÿ7 >ÿÂeøÿC£É‹þ€÷À.ÿ÷*ÿ7 (ÿ÷$ÿ ‹É‹þ€É €DÄEñÿÄ%Ä% ÿÅ Å÷UðþWÿÄöþÄEÿ¯Ä%Pðÿ÷mÞþØþ†· Ôþ ÷EÈþÀ ÔÅÁeÀ„…þÿÊò4m ñ þÿÉ ÿ�Ê ü�f ÎEàÿÖ ÿÀ ìÅ 6öU00ð G�D§3eaek›’÷þj÷þýbÀÿ TÀ ý÷Rêý÷NæýÆ÷ #Å:… Å Å Å w4  Ì ‡Åe Äew! ÷‡… … … À ƒ@À Ç  *à÷ ÄåaÔ ŒÔ Ô× ü‡‡öUÁ õÂ9¡ñU ñþñÿ‰PÉ‹þ€É ÿ�À óĨÿŦÿ_ *à÷ ÄåaÔ ŒÔ Ô× ü‡‡öUÀÀÂÂeàÿ7 Úÿ·ÞÿÂe·ÌÿÂeøÿC£É‹þ€÷ÀÂÿ7 Àÿ7 ¾ÿ÷ºÿ ‹É‹þ€É €DÄEñÿÄ%Ä% ÿÅ Å÷U†ÿWÿÄŒÿÄEÿ¯Ä%Pðÿ÷mtÿnÿ†· jÿ ÷E^ÿÀ ÔÄ"ÿÅ ÿ_ *à÷ ÄåaÔ ŒÔ Ô× ü‡‡öUÁRõÂ`1 ñ5þÿüñþ‰PÃà þñ5þÿüÉ ÿ�À ð_ *à÷ ÄåaÔ ŒÔ Ô× ü‡‡öUQ002€Ú1€€B2KPsP÷0¬ÿð þÿÈ ÿ�Ë ü�f ÎEàÿÖ ÿ‡7´ÂÂeÌÿÃÃe¾ÿÄÄePÿÅÅe~ÿ7®ÿw¦ÿòÀÿô�ÿÁPÈ ÿ�H0üˆÁ ù€SK3sô•÷ ~ÿô• ÷ tÿô•%ô ÷ dÿô•%ô ô ÷ NÿŒ ô•!ô ô 4 4 ÷ .ÿ4m t × öÄrþÅpþ_÷ ®þÂÞ+÷Àÿ`þ÷ØÔÒ7ŠæÿÀ .æd &÷ ¬þ€Ãd Ř+JJeÍe@f•Šef•ŠeÁ”U�7Š´ÿJ`B!ø‡ ‹÷‹¨ÿ÷‹£ÿ @/ ‚Ðþ ·Š‘ÿðe þÿ 7Š…ÿ&w xþK”+€÷•pÿÎ Í‡Ä Å—%d æH/Ã. �„ ÀʾýÊEÿ¥Êåå% % Êe ‹w *þ Ô+Ö wzþÅÅe@_A Á ý÷÷ ®þÂÞ+÷Àÿ`þ÷ØÔÒ7ŠæÿÀ .æd &÷ ¬þ€Ãd Ř+JJeÍe@f•Šef•ŠeÁ”U�7Š´ÿJ`B!ø‡ ‹÷‹¨ÿ÷‹£ÿ @/ ‚Ðþ ·Š‘ÿðe þÿ 7Š…ÿ&w xþK”+€÷•pÿÎ Í‡Ä Å—%d æH/Ã. �„ ÀʾýÊEÿ¥Êåå% % Êe ‹w *þ Ô+Ö wzþÅÅe@_A Á ý÷7´÷äÔ¬w ìþF-²+‡ –à7Ö ŠàÆ÷ Aßà0þÿÄàôÅÀô ÕÀe€!îôøƒä€Ÿ zÿ ÄÀ_ìôÌ ‡Åe W!€÷‡D… … … À4 ‡@À ÃÄåêôÄ aÔ ŒÔ Ô× ü‡‡öU7ÜÁFý ìôÃÀ÷P÷ ÖÉ•÷ ÎÉ• Ä ÷ ÂÉ•÷ º ŠÅ÷ ¬ÅI‘Â÷ ¢ ŠÂ û÷ ”É•Å÷ ˆÅI‘÷ ~ÅI‘÷ z ‘Ä÷ r ‘Âa(÷ fÉ‹÷ `@Ä€÷ VS’÷ PS’à Åþÿ÷ @À õE÷ :@ÀP!ÿ áÂ÷ $ɋ ûQ$ßeìôÃÀ×  · ~ÿw*ÿDaD ñ5€þÿü‡_00ðG§Fl1DATADATADATADATADATADATADATA7€÷äÔhw ìþF-²+‡ bà7œ VàÆ÷ '  Ì ‡Åe ÄeW!€÷‡… … … À, ‡@À ÃÄåaÔ ŒÔ Ô× ü‡‡öU7ÌÁFý ÷P÷ ÌÉ•÷ ÄÉ• Ä ÷ ¸É•÷ ° ŠÅ÷ ¢ÅI‘Â÷ ˜ ŠÂ û÷ ŠÉ•Å÷ ~ÅI‘÷ tÅI‘÷ p ‘Ä÷ h ‘Âa(÷ \É‹÷ V@Ä€÷ LS’÷ FS’à Åþÿ÷ 6À õE÷ 0@ÀP!ÿ áÂ÷ ɋ ûQ$×  · ˆÿw4ÿDaD ñ5€þÿü‡_7´÷äÔ w ìþF-²+‡ –à7ž ŠàÆ÷ Aßà0þÿÄàôÅÀô ÕÀe€!îôøƒä€Ÿ zÿ ÄÀ_ìôÌ ‡Åe W!€÷‡D… … … À4 ‡@À ÃÄåêôÄ aÔ ŒÔ Ô× ü‡‡öUÄ Àñ5 ÀUÄ Â · ŠÂ ·¢À À À À 7a–7bà„ ‚„à±D à ù‘ŠÄÄ% D à Ä`Ä`Ä`ƒ „àþ„`ƒ „ ÀU É5€ýÿ�1É5€ýÿ�ñÉ5 ýÿ�ÄÀE É5€ýÿ�€±É5€ýÿ�qÉ5 ýÿ�„ !†ÅmÚÿÅmÖÿ®†À5ÀU¨ÀU ÀE£_7€÷äÔlw ìþF-²+‡ bà7j VàÆ÷ '  Ì ‡Åe ÄeW!€÷‡… … … À, ‡@À ÃÄåaÔ ŒÔ Ô× ü‡‡öUÄ Àñ5 ÀUÄ Â · ŠÂ ·¢À À À À 7a–7bà„ ‚„à±D à ù‘ŠÄÄ% D à Ä`Ä`Ä`ƒ „àþ„`ƒ „ ÀU É5€ýÿ�1É5€ýÿ�ñÉ5 ýÿ�ÄÀE É5€ýÿ�€±É5€ýÿ�qÉ5 ýÿ�„ !†ÅmÚÿÅmÖÿ®†À5ÀU¨ÀU ÀE£_7¶÷äÔ w ìþF-²+‡ ˜à7 ŠàÆ÷ Aßà0þÿÄàôÅÀô ÕÀe€!îôøƒä€Ÿ zÿ ÄÀ_ìôÌ ‡Åe W!€÷‡D… … … À4 ‡@À ÃÄåêôÄ aÔ ŒÔ Ô× ü‡‡öUL0Ü€¨€€ð þÿÈ ÿË ü�õ ÿKPsP‡7¶ÂÂeÖÿÃÃeÈÿÄÄeZÿÅÅeˆÿÁêô vw`´ÿw ²ÿ7`®ÿw`¢ÿw  ÿ7`œÿw`’ÿw �ÿ7`ŒÿææææÀhôô�ŠÿÁPÈ ÿ�H0üˆÁ ù€‹££³þÿô• 4 ÷ ^ÿô•!ô ô4 4 4 ÷ <ÿ´ 4m t × ô_7‚÷äÔ°w ìþF-²+‡ dà7à VàÆ÷ '  Ì ‡Åe ÄeW!€÷‡… … … À, ‡@À ÃÄåaÔ ŒÔ Ô× ü‡‡öUL0î-€º-€€".ð þÿÈ ÿË ü�õ ÿKPsP‡7ŽÂÂeÖÿÃÃeÈÿÄÄeZÿÅÅeˆÿ7¸ÿw°ÿòÀhôô�´ÿÁPÈ ÿ�H0üˆÁ ù€SK3sô• 4 ÷ †ÿô•!ô ô4 4 4 ÷ dÿ´ 4m t × ô_ŠÁªÒ%ÿÿÂT ¦¦¦¦¦ff‚ÁewFÁeÂ% ê†ÂF1 — z1ü‡÷ PñÁQw"÷ þ÷ "s‡·�Ä÷ ð÷ l‡·�·÷ âÂ¥:e÷ ¢Ý†wpÂ¥/]Ä~1÷ Ä¥[÷ rTÃ÷ ²¥Nà ú÷ pÝI‡÷ ÈF‡·�P÷ –÷ º?‡·�C÷ RÝ:‡ÄŠ1Ì‹6¥üÄåŠ1÷ <݇¥,Â¥/À à Ê1Ë‹!¤üÃå‹1ÃeÄ üÃ%‡ÄÄEAà „ „ „ ô<&1P1 ô\&1P1÷ æÜ\‡Â¥,Ä Áw*Ä‚1¥÷ ÈõÃ÷ ô¥ïà ú÷ ²Üê‡À ÷ Á å‡Áe?â‡÷ Üw˜/ć1¥÷ ŽÖÃ÷ ¶¥ÐÅ~÷ÿÿxÀ ÷ PÇÄz1Ã÷ ”¥¿à ú÷ Rܺ‡À �÷ °w(‡÷ ¦w †À ÷ 2܇w�þ‚æÞ ‡w-"Î(wßôó5)õ ÷é÷ü÷øø†÷%î÷Ì*”×÷ 0÷ ÷ w÷ ÆÛ‡Á ‡wÞþÁVÁnÁW÷ w¦×— A‡Â¥Z‡Ãd Àž7á÷fï&Þ÷ àâÂÄx7øà÷ Îâ³÷ þâÁBï÷ ÈÙÀb 7Úà÷ðÝ÷ ªâ3 ÷ ÚâÀ$4÷ "-÷ l*÷f°à÷òÿÆÝ÷ €âÄœÂÂe Áµ P1† Ò Ä Á ÷Åeò÷ ŠâÂê ·là÷‚Ý÷ tâÁÀ÷ >ÙÀ(0÷ Jw6 œ+¸+00ðG�D§3eaek›’æ +ÿˆ†ß%ÿÿ& æ1ÿˆôææ)ÿˆ÷оý‡Á(Âp0÷ ìwtÔ÷ úÿ Àßîÿ· êÿÀæÿ÷ Ø †ð¥öÿ*±ÂeHÁ w®7Àÿ7¼ÿ‡÷ ¸ÿ&÷ ²ÿÀ€U‡˜¬\}�/˜¬U}’/˜¬YM”/˜¬|…–/˜¬<˜/˜¬t!š/˜¬zœ/˜¬âž/˜¬% /;©@¢/;©€ ¤/;©À¦/;©¨/;©@ª/;©€%¬/;©2®/;©€>°/;©ÀD²/;©K´/;©@Q¶/;©€W¸/;©dº/;©€p¼/;©Àv¾/;©}À/ô¨:^Â/©CEÄ/=©è&Æ/D©ƒ:È/L© NÊ/e©ºÌ/t©š^Î/v©šÐ/v©""Ò/v©?TÔ/¿©8rÖ/ì©|Ø/ì©ÌeÚ/ì©”’Ü/6ªýÞ/6ª€à/6ªÔ€â/7ª4ä/7ªfæ/7ªö&è/ت�ƒê/T«|ì/T«”’î/m«�Qð/q«ˆZò/•«[Mô/Ì«xQö/ë«z}ø/“U#ú/ÿÿ€¦0ˆ0Ä™ðsâySY @€ @€PAR=CTB=SIZE=VECABCDEFHJKLMNPRSTUVWXYZÿ ªón'd4ÿ ¢ón'ú1ÿ šóz'.2ÿ ’ó†'$2ÿ Šóæ'Iÿ ‚óæ'LIÿ zó ("Tÿ ró (‚Sÿ jó(dSÿ bó(€TXXCOM÷ ºû÷m¤ú°ùw ªù÷% ²ù÷5@ºù÷ ¼ù÷-¤ù¤ùÁSÂp0 ÁzÁTÁ~ÂF1wÁUùÀF1È È`ùð^ù÷ Ú†÷ xÚî†àõ5é÷Jùúþ÷ êþ÷ ý &÷ „7TÙ÷ªçjÖ÷ $ÛÅd ÂÐþ· ¶þƒ·°þAÁ-¨þÁ‚ƒÂ%º‡Â%€†Áy÷ ¢ÂÀ À ý·”þÀF1÷ Ú †wj7|þõ€õ õ\þõ`þ7ØØ÷.çîÕ÷ àÚ7ÈØ÷ žÚB „DmAw°Ø÷ †ÚC ƒà÷ þ †@B Bmí„à7!þ†wÜþ7„Ø÷ ZÚÃþõ÷ †Ú÷pØ÷ FÚµ u7Úýw äý÷ hÚÂÜýƒ ‚ ‚ ÂeÃEøÿà ƒ À ° K‚ ÷ Ð †¬*öÿCð@ð@÷ àùÀ Á¸+Âp÷ ª 3‡÷å@‚ý Áe@ ó÷e°÷w ª÷å÷ ’ûÀõ1È�Qýà�Lý÷ V w"ý÷ N wýÀF1÷ °Ø †÷ @؆wðýÁ 7ý‡Á ÁÂL ÷ & wΡ � � � � � ‡æ¢Í7 žÍ÷  ·–͇ÅûÁ´üwêÿæÌü÷ îΆÁw67–üAàwÌÿÄÜúDà7 ü7žü7Èú7`®ÿDÄíâö ‚ÁgÂd.ø+““wàÁe?÷ fÿwvüÖ ‡à Ã�æžöæœö÷`˜öw ’ö÷d †öÄEþÄed Ãd áÂüƒ ƒ÷ vø!d Åd Á� Á ý7�Ö÷¨Ó÷ šØÀ`Âà ÷eFöw @öÄd ÃÞ·4ö·.ö÷¸+"öÃd ¼ûq÷òãPÖ÷fÓ÷ Ø w@Ö÷4VÓ÷ س  ÁôÁoæN1‚wwÎùÀ|ûÂ�`Â`Å„.Ä¢/朡 †Ì ÁpffäÊ ÁqffÛ Êívþ”$ÅeΊçÀ € ï‡Åeû÷ Îל·VþóµÂÂe· Õ÷¶Ò÷ p×ó%ÿÿÁr°Ë îË2ù÷ Ž×·îúw2Å$ùw”÷ÿÿÊúÅíþýwùÄ fwRÕ7jÒ÷ $×À÷ââ@Õ÷ ×Ë ÷4Õ÷ ×À,÷Ás7†úwöþÁÎøwÕ÷ ìÖE À,ïÁõÅ÷ Kw|úÎe ÅóµÄ÷ àsÀœÎeÀ%‡÷ ØÖÄ "Nw¼Ô÷ÒÑ÷ ŒÖË Ë% ‚w€Ë5ûÄÎe·’Ô÷ hÖÅ÷ ŠK÷ ’Öòw” 7ýÁeN·fÔ·~Ñ÷ 8ÖÂÄ …÷ TRÎeÀ ÷÷ TÖÀ¤ù ‡wFw2Ô÷HÑ÷ ÖÅõBÅeþÿwÔ÷0Ñ÷ êÕËUŽÎeÅ ÷ þs…3 Âe³ ÎeÄžáL�·zü! þ†±B Ä ü·0fü=÷ ÎÕ÷ðá¶Ó÷ÌÐ÷ †Õ÷¨Ó÷¾Ð÷ xÕó%BSË ówjÂæÄœÄ섊·xÓ÷ŽÐ÷ HÕó-ü ‚cÄŠòÖ åÖ BÂeþÿ·PÓ÷fÐ÷ ÕË5@&÷ NÕÅl ÄÜÄeÄ Îeöÿ÷ ,w Ó78Ð÷ òÔNÂÄ…Å%ÿÿ Å% ‚÷ RÎeò÷ ÕÁe÷ Šûw¤þÖ ÅbøwzýÀTøÄ&÷ Î7ÂÒ7ÚÏ÷ ”ÔÎe÷,.ø+3 ÎeÄ$Ä5!76ûÅÎeøÿ÷ ŽsΜÎ쎊 �Ó&÷ HìÀ 7 û€Aaw üúƒ&Îew0A÷ `ÔwJÒ7bÏ÷ Ô Åf÷ <@!îKÎeÅèÅ% ‚÷ "Å5àsóÕľßÄeÅÎe÷ þs÷ Ž÷ ÔwêÑ7Ï÷ ¼Ó s†ßÂ`Ê‚ßNŽ`Â`Ä … ÷ põ±Å% ‚÷ ´÷ ÒJ÷ ¸ÓÂRßÂ`Ê5!–ÑÂmHß·ŽÑ÷¤Î÷ ^ÓÅfÅENA¦Å% ‚÷ p÷ ŽÖ …UK÷ pÓÂeãÖ ÎŠÄîùawúþ7DÑ÷ZÎ÷ ÓÖËíÐùÀ÷ >ÓwVþ‡Ö Îí€öÁlø+“Âp0“““““¸+÷ œwxÇÅí–ùÅ5æw!Nöã‡w!„ùà†&Na·%zùÛ‚‡&æðÍæÐÐæ& À|ô÷ (ö7¾Ð÷ÔÍ÷ ŽÒÎ&Îe·¨Ð÷¾Í÷ xÒÎ’ Àe7’Ð÷ hÒK! ÀeΊöÖ €ÝÆe wPÿ–%‹·lз„Í€‡æ|Í&fBÂmÞ ·PÐ÷fÍ÷ Ò÷µ»Í@fÎe$ Å$÷ 2ÿs$N·$Ð÷ úÑÅÅ% ,‚÷ ÿK÷ ÒÎe·Ð÷ ÜÑÅ÷ ÿK÷ Ò00ð"G§Fl1DATADATADATADATADATADATADATAÎeøÿ·îÏ÷ ÄÑË5@Îe ·ÜÏ÷ ²ÑË%ÿÿ Å÷ ÐþK÷ ØÑÎeðÖ …„ w´Ï·Ì̇À�/  ú/ü‡ ü/†ÐÿÿúÀ%(0ƒÐ   È%ÿÿûÐ õ7 zñ÷(0rñ÷ rñ‡÷ ®ñÅåÀ À%‡÷ ïwÂwúÃ<<Ä÷ „ñÄ ûÄ<<� ì‚À ø Ú<Ååê‡è<è<è<è<ê<è<è<‡ÀH.& $ Š/‡ �/†N #ö-óôµ@DÐ ˜#D(˜#2è5/Ö ‡Ãü/Ã%(0ùƒÎ-)ÀE<÷ 6ÀåÐ¥$êôµ@ Ë Ë%ÿÿ Ám÷™¬Îþ·Ìþw"Ó îô5y ÌÓ$Ë%ÿÿüÓ ÊÁenÁfkÁL.Àâñ`÷ üÁ|.Àäñ÷ ð÷ 6ò�ÁŠ/÷-ŽÛ*òOÁj.÷ ’ó À¸ñ÷ ´ñD%¬ñ@ >†ÀžñPšñ7à5·BóÁp.÷5ˆñ-Áv.€ñ ÂåÂ-pñ#‚Â-lñ ‡·jñ÷ .ó �ÀÂ/ÁâÂ$ð þÿ! ùÁwjËæÓ ôË òË5ïË%ÀìƒÓ% é‚Ë Ë5õÓ ùÓ$ é‡Þ‚ƒ‡æf¦Îe·%ã%ƒÁ_  Âݦú‚ Â%‚Âåƒ ù·œŠ1”ú÷• �úà ÷œ‰1„ú·œŠ1úæö1‚&÷ °€Ö Ã�†à ÷*PÔwJÔ÷`Ñ÷ .×Â^"— pû‡Á`ÄÃåé�ƒ‡7 Ô7 Vú7 VúÂJúÁ�úÁEÿ� � � � ñ5þ1fÀ”áÁ÷ šË�‡ñU2¤Þ ‡Àú€0RÁd ÷þáÄÓ÷ÚÐ÷ ”Õw¶Ó÷ÌÐ÷ †ÕÉ �qñ%BSñBffœN쎊·†Ó÷œÐ÷ VÕ1 ‚mΊò–%á–%IÉmáw\Ó÷ rÐ÷ ,Õ& fþÁd €‚ ÂE·:Ó÷PÐ÷ Õ@\ ò�ÂþÿÂe€ ü†&À� ùÀEÿ€ € € € °<&1þ1°\&12¦f·,ôÒ   ·$ùÀ†àÁ÷ ŒÊ‡¤Þ �‚€Ô I�–ü· ù±ø_ ÿ ì (‚S 2j0 2÷ 2$XX:Ài17’öÿ7˜ñÿ÷ ZÁewRþÀ 2÷ JÃL.KÃe× ‚.ú‡À"2È�óþà�îþÀ ÷ (KÃe× â.ú‡À(0Áj0 È0÷ 2.‡ð•#÷ .‡÷ |À(0÷ ߀v0Áj01 ÷ ‡æô1ÿˆ‡ææ)ÿˆ‡÷ŠHÿÀFÿÁDÿ7ÚøwØøP ‡Á!ð¥ðÿ*Á Á"Âp0÷ žwbÏÀ�/  ú/ü‡ ü/†ÐÿÿúÀ%(0ƒÐ   È%ÿÿûÐ õ7 ²ú÷(0ªú÷ ªú‡÷ æúÅåÀ À%‡÷ ïwÂwúÃ3Ä÷ ¼úÄ ûÄ3� ì‚À ø ¢3Ååꇰ3°3°3°3²3°3°3‡ÀH.& $ Š/‡ �/†N #ö-óôµ@DÐ ˜#D(˜#2è5/Ö ‡Ã00ð*G�D§3eaek›’ü/Ã%(0ùƒÎ-)À 3÷ †ÀåÐ¥$êôµ@ Ë Ë%ÿÿ Ám÷™¬Îþ·Ìþw"Ó îô5y ÌÓ$Ë%ÿÿüÓ ÊÁenÁfkÁL.Àû`÷ üÁ|.Àû÷ ð÷ nû�ÁŠ/÷-ÆäbûOÁj.÷ Êü Àðú÷ ìúD%Âäú@ >†ÀÖúPÂÒú7à5·züÁp.÷5Àú-Áv.¸ú ÂåÂ-¨ú#‚Â-¤ú ‡·¢ú÷ fü �ÀÂ/ÁâÂ$ð þÿ! ùÁ†ÀæöPÂâö7à5·ŠøÁp.÷5Ðö-Áv.ÂÈö ÂåÂ-¸ö#‚Â-´ö ‡·²ö÷ vø �ÀÂ/ÁâÂ$ð þÿ! ùÁÐ�BüÐ�?üÁ ÷ �ÿÁ�6ü ÷ |Е:Е æÀ M& Ê%ÿÿŽ R ú�¡‡V ‡÷Þë<Þ÷RÛ÷ à& ÷,Þ÷ à ÎÜøÂÂeÎ Ž`þÿÿ÷ ²ÿí‡NÂÂeÁ¶)‰Ñ%ÿÿü÷¶û�‡ÿ N÷æ' Mÿ F÷ (rTPARITY=PAR=SPEED=UIC=[SYSUIC=[LIBUIC=[NETUIC=[MAXEXT=PUB=BUF=CHAR_LENGTH=OPT=LINES=HFILL=VFILLTYPEAHEADCRTFORMFEEDWRAPLOWERESCSEQREMOTEABAUDBROECHOSERIALSLAVEPRIVFDXEBCHHTREAD PASS ALLAVOANSIBLKMODDECEDITREGISSOFTHSYNCTTSYNCPASTHRUPRINTER_PORTTERM=ASR33KSR33ASR35LA30SLA30PLA36VT05BVT50VT52VT55VT61LA180SLA120LA12LA34LA38LA100LA50LN03DTC01VT100VT101VT102VT105VT125VT131VT132PC3xxVT2xxLA210LQP03LQP02LQP01LA75LA2xxPOOL=PLCTL=SECPOL=WCHK=RNDC=RNDL=RNDH=SWPC=SWPR=CPUSEC POOLDEVSYSNEARELEVCSCAN‚*‡*Œ*ODDEVENDBDDDFDKDLDMDPDRDSDUEM    €úÿúÿ € €@  @€  &&&&&&&&& & & & &&&&&&&& & &&&&&&&&&!&"&&&#&$¨(¯(µ(¿(Ã(Ì(Ñ(×(Þ(å(ë(ï(ô(û()) ))) )$)))0)4)9)?)D)J)Q)Y)l)r)x)~)„)Š)�)•)š)Ÿ)¤)©)°)¶)»)À)Å)Ë)Ð)Õ)Û)á)ç)í)ó)ù)ÿ)* ****#*)*.*¢,¤,§,ª,®,´,¸,¼,À,Ä,É,Ó,Ý,ç,ì,ñ,¤,§,ª,®,´,¼,À,Ä,É,Î,Ó,Ø,Ý,â,ç,¢,¤,§,ª,®,´,¼,À,Ä,É,Î,Ó,Ý,â,ç,ö,ü,05075110134.515020030060012001800200024003600480072009600EXTAEXTB1920038400&2ú0º1.Æ-â-þ-^.˜4„. .Ä.Ž2Ž2|3¶3:4à4à4à455Ð/v/’/0000000000000000000000000000000000000000000000000000000000000000ÃâÓÀ¾{-÷lìÞ÷4Û÷ îß÷ŠÛ¦ÛÁb(#÷RìÞ÷Û÷ Òß÷nÛŠÛÁk(÷:ìæÝ÷üÚ÷ ¶ß÷RÛnÛ!Át(÷5JÛÁ\(÷ XØ ÁÝQÛ ÷ ²Е, ÁÝ@Û ÷ ¢Е]w²Áw¢ÁûÁ}(÷ Ø÷Ðë~Ý÷”Ú÷ NßÁêÚ ÷ jw~ÁŠ(÷ ø×÷ ÊÁÞÚ÷ JЕ.wbÁ�(÷ Ü×÷ ®Е7÷5ÚÚ°ŠÿÿwBæ÷d òÿ÷d îÿ÷mÂêæÿ÷m¾êâÿÞ †‡ó5ù÷öÜ÷ ÌÞÿ5@ÂÿðÀ¾ÿµ€¸ÿ÷ ¢ÒçЕNЕO÷ ’ÒßÁœ(÷ Z×P�P� ÁÝÝà5ŠAm ÷ ¤Е:ÿµ€rÿ ÿ5fÿÑ ÿ5\ÿÑ A’*÷ ×÷ ޵Á¡(÷ ×÷ ØÁ�Ú÷ XЕ.wpÄ ÒÄå6À+÷ âÖ÷ ´Ä Äeº*Ãed ÁB �@‚ †� ü ÷ Е.w2Áf)÷ ¬Ö÷ ~Á�ªÙÁEÿÂ2+Ò R üÂåº*‚ �¾+÷ €ÖЕ  ÷ àwôæÞ †‡À¾ó5÷õ%VTóÂpÑÂå6 ÁÂeº*�bÒ%&Â%ì*Â%ä* ·lþÿ”Û÷ªØ÷ dÝÁÂ%ì*Â%è*I ‰2‰¢÷ 2ÑÈ÷ *ÑÄ÷ â¦÷ þß‚Â%Ä*÷ Ñ)÷5zÑ%  ÁÜ)÷ ,Е.Â%Ü*÷ ìМ ÂEðÿ ó5@ ÷ ̇�‚,�B,�b,÷ �Õ÷ ŒÀ¢÷ xÛæ~*†÷ ØÛ ‡Îz*æ€ÿ÷ Bè€Î€V- †Ö w†À¾ÁP(÷ LÕ7®Ú÷ „Ü÷ PA ÷ ž÷ è€ ¨Ð•:A÷ Š ¨÷ øç�¤÷ îç € ¨0œþÿüÿ0œÿÿýÿ0’þÿ0œÿÿЕ:�õ5Áq*õ5Ám*÷ ØÔ÷ R‡Áw@ÁU(÷ ÂÔ÷ ”Ħ×ÃEÿƒ ƒ ƒ ÄEðÿÄ ÷5@Œ×÷  ‡‚,÷ ’ÔЕ:Á‚,B,÷ €ÔЕ:ÁB,b,÷ nÔЕ:Áb,÷ bÔwÜæÞ †‡ó5ùõ%VTõÀ¾ó5@ ÷ bÏìЕNЕO÷ RÏäÁH(÷ Ô÷ $Þ÷ @Ï Áœ*ó5€ Á˜*÷ üÓ÷ vÎÁ4*÷ îÓ÷ŠçNÙ÷dÖ÷ ÛÃd ÁDÁe?¡  üf÷ &Е:  ÂPç·Ù÷ ìÚ· Ù÷ âÚæÎ=4Ï7Ž`·#væ3‡„#1‚‚%0ƒÓ ÷(dæ+‡Ä")†Â"'ƒ¦ÎlÖ$"‡ÅbK †ÁÂÛ¡ ÷ ¶Е.Е:A¡� ÷ ¤Е.�ÁmâÎÁå€Ð•: ÷ ”w¨Ö ææÂ-æÂ´æ¦‚Ái÷ ‚wêÎÁ:*÷ Ó÷êå`Ø÷vÕ÷ 0ÚÃÅd A ÷ >Е.à Е:õwL÷æ.Ø÷DÕ÷ þÙÅd wØ÷ræ2Õ÷ ìÙD÷öåØ÷ ÞÙC&ÁÀd÷ ÎñB÷ :…€ÁA*÷ zÒÁ ÷ РЕ.Е: ÷ À Е.Е:A ÷ ° Е%wÈ æÞ †‡À¾00ð:G�D§3eaek›’ó5@÷ó5€ó¢*Ê ïµ$û÷ HÍ óµåЕNЕOóµÜÁI*÷ öÑ÷ Ü÷ l ÓæÞ †‡ó5ùÀ¾÷ Í óµðЕNЕOóµçÁ…(÷ ®Ñ÷ ¸Û÷ $ Þ÷�ä×÷Ô÷ ÔØÅd  Ãå& ã à Á[*DÝÁU*DÝÁO*÷`äÈÖ÷ÞÓ÷ ˜ØÅd Ãå,Ág*DÁa*D÷ :Ñ ÷ � Е.w¨ Á¢P”P”A ÷ € Е:‡À¾÷ :ÌЕNЕOÁÌAŠ+÷ öÐЕ=‡ÁÐÓ÷ V ÁÊÓ÷ N Е:‡÷  æ8ÖÁ®Ów0Ö÷ FÓ÷ Øæ¤Ó‚�wÖ·0Ó÷ ê×Á–Ó¼ãÒ wÖ·Ó÷ Ô×Ãd Ãm¦ãÁÁeøÿwæÕ÷üÒ÷ ¶×÷% PÓ¡±‚�& wÄÕ·ÜÒ÷ –×V ‡LB:=WK:/GBL ˜::d÷ XËwFÀ¢÷ ÖÀXËg‡Z÷  Z‡7‚Õ÷Øã˜Ò÷ R×D- &@ õ5%f÷Jã\Õ÷rÒ÷ ,×�%> ÷0ãFÕ÷\Ò÷ N×÷"ã6Õ÷ D×÷ã,Õ÷ :ׂ@Ãe ÷Õ÷,Ò÷ × À¢÷ úÕ‡Ã-DãÃeM÷ìÔ÷Ò÷ ôÖÁ6ãw¼ÍÁÁÁ÷ Ô w<ËTÀ¢÷ °ÕR†÷rÊ7pÊæ~ÖÎe?À¡ À ü÷öâ’Ô÷¨Ñ÷ bÖ@æÁ B`6‡æ€÷ àá�΀ÿ÷ Ôá€Î€N ‡÷%Ê&ÎeŽ ‚7 Êt÷%üÉ– †€ †÷5dÊÀfÊÀå€`Á N ‡ÁÁ Á Á�` ÷‡Á÷ whʦɀ& ææ€ÿ÷ Lá€Î€Äâ7ÌÓ÷"ââÐ÷ œÕ6ÙD 7´Ó÷ ŠÕC ö ò‡Î ‡ ƒÁ ‡ÆÁ  È‚@àÁ ¼ƒ ƒÁ ¸@ @m×Á 7$É ÷É–%ƒÖ ÷%Éw†÷ ÉÀ¢ÎåÁ‚áw6Ó÷ŒáLÐ÷ ÕCÍ CA wÓ÷ òÔN- ö‡w*À@6 ÷ *†wÜ÷ ºÈµ õ€õ¤È õ È ÷%˜ÈõU€õU7ÆÒ÷áÜÏ÷ ÎÔ ÷¶Ò÷ÌÏ÷ ¾Ô÷%fÈ\÷ˆàžÒ÷ ¬ÔÍRÈ÷|à�Ò÷ žÔÍFÈ÷pà‚Ò÷ �Ôu ÷0ÈtÒ÷lÒ÷‚Ï÷ àÕ÷5˜È7&Á÷ ¢Ê†€w&A& ‘  Ée÷Ðß0Ò÷FÏ÷ 8ÔÂ`A ‚~·Ò÷Ò÷À(Ï÷ †Õ€À¾Á26S”þÁ¸ÉF w’É÷ ¨ÇaÀ¢÷ \‡õ’Ç õŽÇõU€õU€õ|Çõ|Ç÷5èÇBÂmˆßÊjÇ7 Ñ÷öß¶Î÷ ¨ÓÂTÇÂ-ØßÂe ·‚Ñ÷˜Î÷ ŠÓwtÑ÷ÊߊÎ÷ DÓBA w^Ñ÷ 4Óõ-Çô‚‡õ-Çï‚ Âe·>Ñ÷TÎ÷ FÓMÀe7*Ñ÷ 8Ó–%‡÷ .w–Ç®°²´¶¾¸º¼ÌÀ @€”<”<”<”<”<”<œ<¢<¬<´<¼<Ä<æ&Á~ÆCÄvÆaÁ Á%€-‡ÀjÞÀ À ÷   (À¢ ÷ ¼.‡�õJÆ õFÆõUõU&7tÐ÷ÊÞŠÍ÷ |Ò ÷$ÞbÐ÷xÍ÷ jÒÁw ÂØ:ÊÞ²Ê Ê Ê ÁxÖ Ö ÷ @w¨Æ À.ÁàÝÁ Ã Ó Á MÍe€Pø÷ÆÝÐ÷Í÷ Ò 7 ÚþÄ Ä Ä Ä Ä C Ä C ÷Êþ7ÈþÀØ:È ûæ ΆÝÎ ÷¨þÀÏ÷ÖÌ÷ �јþÂeÿÀØ:7 Žþ È È-‚þ‚ˆ ‡7]ò:xþÐ Ô óÄpþÅnþÅmdþD  �Áí2Ý Á ÀØ:È '·<ò:Jþ Ãí@þz ;óed s�d s�d ³Œd sò:d ómÝd óed óed Ò Ð ×À  BƒÃEþÂ@&Ž  ‚ÕÂÂe÷ ‡ðd ðð÷ ‡Î Åe D «÷e²ý÷% ¬ýwôþÖ $ð¥öÿ*° ‚ۇà ÙŠŀÁòÜÖ ÷ vÇ7 Ì÷J܈Î÷žË÷ �ÐAÂL w„·nÎ÷ÄÜ„Ë÷ >зÚË÷ nÐÖ ‡UâÅd €ÿ÷ ¸Û€Â€æÐ÷ þà À¡ À üÎmfÄÎå€ÄfÜ7Î÷pÜ0Ë÷ êÏN NmD&7þÍ÷ ÔÏB- †K-ðs-ìõ5Ó$÷ žÃ+Žó '�Í wÆÍ÷ œÏB- †N ÁÁ„Â’=÷ ´wÄ÷þÛšÍ÷°Ê÷ jÏN7ŠÍ÷àÛ Ê÷ ZÏÂ÷ @Ã* ‚Ë �B Bm Ë �Bí Bm j…B- †÷ Öd‡B- ‡7 Ö ]‡A Am�àWƒµ &@ @m ‚Ë B ‚ Ë �Bí `>… ƒ÷ €9‡ ‚7 ®Â– &‚A �à/† u÷ âÎõ5M ÷ªÚ¾Ì÷ÔÉ÷ ÆÎM÷˜ÚªÌ÷ ¸Î÷ jÂÁ†w¨‡÷ôÚ�Ì÷¦É÷ `Î� ƒÁÁ ÷ „wìÂA#wfÌ÷ <Î÷ $ B- †÷ Â$B Aw@Ì÷ ÎøA AmB ƒ÷ æÁB÷ ®†· âÁ7Ì÷lÚ,É÷ æÍ¡‡±ýÀ À À À À À ‡¡ € € € € € ‡@@m € ‡f&Á,Ú÷ xÆ€V Á Åd ÁÚŠÁ ýÅd �uuµ 5 5õe5 õe �‡·ŽÕæƒÃU·€ÕæƒÅd 7bË÷¸ÙxÈ÷ 2ÍD- õ5wÂõ w¸f D- õ T÷–Ù&Ë÷<È÷ öÌf·Ë÷~Ù,È÷ æÌN÷ ‚ó÷êØúÊ÷ ÐÌN ·ðÊ÷èÊ÷ ÒÍN÷ \Î óÖ Ã5 À€ÿ÷ :Ø€À€ ƒ÷Ù¸Ê÷ÙÎÇ÷ ˆÌÍ uD-wšÊ÷ pÌõ õ¡ÃEƃ‡±ùÃ55!&ø@!7jÊ÷d€Ç÷ :ÌB“AÑ @ �`fÎE@ û‚‚ „#à·@Ê÷–ØVÇ÷ ÌD- Ö ò‡&æ¦f&¦ v Þ €�‚ƒ„…‡ÿ jãæ'þLÿ bãæ' Mÿ Zãæ'ÌIÿ Rã (‚Sÿ Jã (rTÿ Bã(ìVÿ :ã(0W&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡00ðBG§Fl1DATADATADATADATADATADATADATA H(÷äý÷Üý7âýwäýwâýæL(ÿˆ ‡ææ)ÿˆ‡÷вý‡Á(÷ ¢wÀ×"S Ø*+Ò*÷ °*÷ Nâ&À ÷ Úá†÷ RÖ ÷JÖJÖ÷|³BÖ÷ Âá†÷ Èáu‡w06ÿw>ÿw"6ÿw�!.ÿ@$w&^à÷´îtÝ÷ .âõ5wÿ7Bà÷XÝ÷ âw4à÷ JÝ÷ âwæþ@íA÷ ú@m7�Ôþæ¨*ÿˆ3‡€÷ zÚ2‡Á 0À ÷ ^åw¬Õ*÷ fÚ'‡Á %À ì*÷ |Ú÷5’þ7 ˆÕwœ‚Õ·Æß÷ÜÜ÷ –áwrÕ÷ *Ú÷¬ßfÕ÷ Ú†Á$ÁÁ> Á#ð¥æÿ*Á(ÁHwÐ÷  Õ0ÀÜ*Á+  ÷ Âç‡ñ� þñþñþæº*ÿˆà‡ææ)ÿˆÚ‡÷Š"þ×Àd Á°*÷  ýð¥Àeà7lîÜýw ÖýÅd(@Á°*÷pû÷ výIJÔ5!<º‚Ä Ä Ä Äe>Ä% ‚Äå@Á²*Éea ÷ Hýòô„Ôd(÷5|ýôrÔf(@Á°*w0ý÷ Ùj‡À à÷ BÙŘÞw”Þ÷ªÛ÷ dàñ%TI[wÎÿ÷ ðØ— =P÷ ÙÄjÞwfÞ÷|Û÷ 6àñ%TIDñ%TT÷%NL˜ÿ?÷ ¸Ø6†Ád 74Þ÷JÛ÷ à@7 "Þôñ -ñµ2B!7Þ÷ Þßñ5!·øÝ÷ ÎßB· ìÝ„ ô7àÝ÷ ¶ßq÷ æß‡ÁÁCÁ˜ ÁDÁEÁFÁGwÿ ÷ (‚Sÿ ÷:(„S Âw öÜ ”Å¥ üÅ¥ ùÅå0B¡†€÷ „ÜAa”ôœÿÿ‡w ÄÜ„ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ ÜE�€Aa×$Ò±œÿÿ‡÷ &÷ &÷ �’•’•€‡@Á(÷ èÛf€  Àe ÀeÉÿÀe Àe ‡ABDEFIMNOPQRSTUXYZ<>Å"BaÊ$ep|v¢­$Ê®¶ÅÏJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw šÛ&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ ZþÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚bÂEÊ Ö ÌЕ%„Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ Î�à õ‡& æÎe°6& ¦æÎeœ/& æÎe•´*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎeb & ¦æÎeNЕ A‚¦Þ à ÷–%‡& æÎe"òA÷ äýà û‡Ð• à ü‡A÷ bE‡AÂ÷ †E‡Ð• Aæ÷ °ýAÎ ûÖ Â ÷ $Е.÷ ˜ýÂ÷ AЕ; ÷  Ã à‡Â ýð¥ ÿÿùÀ øw °ÙD…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w €ÙDÅ… ƒ÷ &Е.À À À ce÷ ÙÀ …Е:÷ Å ù Â÷ B‡æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w èØ…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ €ØW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡w äÜ5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ ¤œ*AdBbAÁepÂ& ¦fƒÂÁ ÷ x– –‡ÁPõµ aA”Aíf@pnp÷ êC*8Ö‹Á ÷ 888ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ èõÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw Ûõ‹jÜõŠjõålùµŠj÷ ¾Ð00ðJG�D§3eaek›’É¥@@õµaÉu­jkàÆå,b¤€p°÷ Z5fµ fˇðµ ÇÈ•÷ F‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ ªDlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ |½•8 †õ¥öÿ*ÎÖJΪJ‡w ÊÙõ 8µŠjDl@÷ @T”ÔÀeBTŸ8œ5l@÷ ‡@Á(ñ D÷ 0ÁeB&÷ *‡÷ ‡& ææ©ÿˆ@ð•#÷ ú& æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡ÿ Ð×(dSÿ È×(Wÿ À×(ìVÿ ¸×"(dSÿ °×"(Vÿ ¨×.(dSÿ  ×.(°Wÿ ˜×:(„Sw 8Ø÷ B‡ðµ)ðµ÷ Ð8C÷ $ð¥öÿ* ðÕ)ð ð*wTð•öÿ*ú÷ ì÷ ,õ‡ðep p ‡÷ „è‡ð¥#ðµ=Ä E”W¡9ƒÅ¥^éð•³ÿ*ÐÅå0ùà Å`à à CaÄ ëÃåCƒ Ôà ðµ=ðµ÷ X ð¥ð 0Àð•Øÿ*§ð¥ ðµ= ÄEÕ¥^Ä ûA¨ð¥ æÂe@ÃÎà÷ Þƒ߇÷ ðµ=� ÁEpÓðµ2ðµ!)8ÂeEÅ`l0Å …à ì0‡„ û0¡/ &l0Ä ü„…`pÄ „löÿ06°ôÿ4p 4÷ üðp°æÄ ƒðÎà÷ 8ƒ ƒ÷ Vá÷ ù†ð•Øÿ*Á`‡ðµ)wjæ÷ ⃇æCàƒ#ƒÎà÷ RÎ ¦÷ Èÿ‚ð†– ‡DàÄ ‡ðµ@) ð 6ðÿ?0ðÅD)‡w ÔÕð*D÷ Ø Õ ýw<÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡ðµðe6p 4÷ ¬ÿ†8÷ V±‡÷ †81416÷ j÷ zñÅ ÷  ‡‡÷ Tê†÷ 4‡ð 8 ðµðµ÷ H‡ðÖ*±‡ðÃ*±‡ƒ  �D„PÄ5Rà ý†R”‡R”R”à üøð‹*±‡ð*‡0Š+æ1ÿˆÅ(Åe à ÷ @ß%ÿÿ&ïp’*wÀÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ œÿ8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡141612Áepðµl2l0p‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ ”ÿU•Õ8UMwðþÅåà w4ÿ÷ øþBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�w„þ46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ þw þ8Áe2 ‡VT ~S w ŽÒ ÷„®DÐEÄ%ž‡Ä XhÂ~SJÁíÀ³TÄšT•þÀ Å& W¡W¡ ‡‚÷µ{´ êTÎâTÎДþÀ ÷ ¦BÂe‚eÁ³T÷ zÁ¢´Âœ´÷µ?´÷ fÄ®7 ü­fL…W¡‡W¡÷Ü­÷µ´ ÷-X´ ÿW¡ ÎZά÷  »À>w<‡÷¨­÷ Œ»wô­Á¾BàÀrSP�æfSÿˆ‡ææ)ÿˆwŒæþ‡VMR -- *DIAG*-*FATAL*-Illegal get command line error codeCommand syntax errorVirtual terminal errorIllegal switchTask has attached common regionsIllegal error-severity code %PCommand I/O errorIndirect file open failureIndirect command syntax errorIndirect file depth exceededI/O error on input file %XOpen failure on file %XIllegal file specificationFile %X has inconsistent dataFile %X has illegal formatIllegal functionSyntax errorDevice %2A%O: not in systemInvalid keywordInvalid UICDevice not terminalDevice not variable speed multiplexerIllegal keyword valueNonexistent memorySpace usedI/O error on output file %XWrite check not supported for devicePartition not in systemPartition already existsPartition or common region is busyUnknown main partitionNo pool spaceAlignment errorDevice not mountedFile not contiguousFile not foundIllegal device/volumeIllegal priorityNode deallocation error %P %P %P %PCommon block currently installedTask image I/O errorToo many lunsTask name already in useTask image currently installedFile not task imageSpecified partition for common blockSpecified par00ðRG§Fl1DATADATADATADATADATADATADATAtition too smallR/O partition %2R not in system, defaulting to task's Base address must be on a 4K boundryIllegal first APRNot enough APRS for task imageCannot install tasks or commons from other than LB:Common block parameter mismatch %2RCheckpoint area too smallTask and partition bases mismatchUndefined common block %2RCommon block is task partition %2RCommon block not loaded %2RLength mismatch common block %2RBase mismatch common block %2RToo many common block requestsInvalid time parameterTask or common region not in systemTask or common region already fixedTask is checkpointableTask or common region is not fixedNo lunsTI: redirect errorOld device attachedPseudo device redirect errorCircular redirect errorDevice not redirectableLUN out of rangePseudo device assignment errorLogical device not in systemI/O error on output deviceExecutive too largeTask activeTask is not multi-userAddressing extensions not supportedPartition %2R not in system, defaulting to GENLoadable driver support not in systemDriver built with wrong STB fileFile %X not a valid driver task imageIllegal driver task APR usageIllegal use of %2R partition or regionDriver already residentDriver requires running system for LOAd/UNLOAdDriver not loadedDriver cannot be UNLOAdedDevice %2A%O: is attachedCheckpoint space too small, using checkpoint fileNo checkpoint space, assuming not checkpointableReceive data or by reference list not emptyPrivileged task overmaps I/O pageKRB %4A interrupt vector %O too highKRB %4A interrupt vector %O in useLine not DZ11Invalid speedTask image virtual address overlaps common block %2RIllegal operation for saved systemSymbol %2R is undefined in file %XSymbol %2R is doubly defined by file %XIllegal value for symbol %2R in file %XInvalid record address for file %XPool link error at %P Block = %P %PCTB %2A is not supported by driver -- Not loadedDriver dispatch table is inconsistentInvalid driver data base at offset %P in file %XToo many symbols of the form %2R in file %XCannot LOAd/UNLOAd a pseudo deviceCTB %2A does not existKRB %2R not in loadable data baseKRB table of CTB %2A will not accept KRB %2RDCB table for CTB %2A is fullCTB name %2A is a duplicateData space file exceeds available space in system imageCPU partition illegal in one processor or saved systemCannot have multiple pool or CPU partitionsOperation cannot extend above first 124.K of memoryWrong CPU partition size, must be %D.K on %D. CPU systemLoadable driver larger than 4KPartition %2R not in systemCPU partition has not been createdNo ICB pool space for CPU %1ASpecified processor does not exist in system imagePartition %2R is too smallPartition %2R is not a commonTask or common is not in memoryCannot UNFIX a mapped common regionSystem image is not RSX11M-PLUSAccess to common block deniedOperation not allowed for %R partitionsTop of pool set to %O, requested amount not availableInstalled tasks or commons may no longer fit in partitionFeature not supported in system imageRequired switch missingIllegal %R specifiedIllegal or non-existant controllerIncorrect assignment of SY: or LB:Device optimization not supported for deviceDirective common(s) not installedTask not installed with external headerUser D-Space not supportedCannot FIX an I/D space taskIllegal slave attributeOptional directive common successfully loadedCannot UNFIX the directive commonNo table space for optional directive commonDirective common not contiguous with DIR11MSupervisor mode library not supportedTask not removed, CLI was not eliminatedTT redirect errorBus switch not loadedCannot install shared region with incrementFast map not supportedDeferred binding not supportedDeferred binding not overriddenCommand line too longU)U>UUUdU…U¤U¶UÑUïU V'V?VZVxV“V¤V±VÍVÝVéVýV#W9WLWWWsW˜W°WÉWìWXX!X4XHXWXmX~X¢XÃXØXæXÿXY2YWYuY¬YÑYãYZ6ZZZtZ–Z±ZÔZðZ[0[O[f[Š[®[Å[è[ð[\\4\L\d\u\”\±\Ì\à\ì\]']V]|]�]Ã]á]^ ^O^a^{^•^Ç^ø^$_F_k_Ž_œ_ª_ß_`%`M`u`˜`¿`ð`aGasa–a­aÏaüab6bnb¥bÑbc>c]cycœcºcícd&dFdjdŠd¨dÐd00ðZG�D§3eaek›’e@efe~e“e¶eÙef(fPfkfˆf fÎfðfgIgog˜gªgÀgìgh"hBhÿ ¶»æ'vJÿ ®»ò'ìJw �Òð*æ8Iðµ÷ x œ*=‡ðµ€)98÷ ° ÕeBÕ && ð Îå¶ �ÕU€�Ä÷ æ‰�†ð¥öÿ*ð¥åÿ*Æe ð*Nlv °°΋œ*ðµ.2÷ : „& ðµ#ðµ!ðµ)&ÎePæÂ(ÂeÊ ¦æ&æ•&Äð >€Åe >ÍE€÷ B†�•p�*÷ žwðw tÑ÷ ‡ðµ)ðµ÷ R 8C÷ 8ð¥öÿ* ðÕ)ð ð*w¤ð•öÿ*úðµ÷ ¤ó‡÷ æ÷ à÷ ¶ë‡ðep p ‡÷ „Þ‡ð¥#ðµ=Ä E”W¡9ƒÅ¥^éð•³ÿ*ÆÅå0ùà Å`à à CaÄ ëÃåCƒ Ôà ðµ=ðµ÷ L ð¥ð 0Àð•Øÿ*�ð¥ ðµ= ÄEÕ¥^Ä ûA¨ð¥ æÂe@ÃÎà÷ Òƒ߇÷ ðµ=� ÁEpÓðµ2ðµ!)8ÂeEÅ`l0Å …à ì0‡„ û0¡/ &l0Ä ü„…`pÄ „löÿ06°ôÿ4p 4÷ †ðp°æÄ ƒðÎà÷ ,ƒ ƒ÷ Já÷ ù†ð•Øÿ*Á`‡æ÷ lƒ‡æCàƒ#ƒÎà÷ ²Î ¦÷ Ôÿ‚ð†– ‡DàÄ ‡ðµ@) ð 6ðÿ?0ðÅD)‡w Ï÷ ˆðµðÅ)÷ ¸†ð¥öÿ*÷ RwV46l0ì‡w ÄÎ÷ Pn‡832cðµd& & & B öŠð 2OðµðµΕ ¶“ðµ à N”à Υ$¶“Ε Åð 2ƒ2Åà‚Î¥ Ž�Î �æ÷ šƒvÂ Š‚ ƒ“Ε f÷ hƒ�ׯe÷ jð¥óÿ*÷ rÆeð•Øÿ*wVðÅ@)ðµ÷ L†ð¥öÿ*ï0,÷ ¼÷ ðæ‡ðµ ÷ J‡ðÅ)÷ ðÕ)ðµ( ð¥ Ó ðµ=Ó ð¥Ó lð 0ºl‡ð  ƒ÷ ؆ð¥øÿÿ÷ 4ª‡ð¥/ð ðð¥Ãe&ðµ=ÅBaÀ@aÁ ÷ ÖÌÁe0b�Å ÷ÂeÒ€ð¥Áe@Ã÷ Ø`‡÷ ÊY‡ðµ=‚ ÂE°8óÅ Ãe…l0Å Åà & ì0‡„ l0ù…Å`pÄ Älöÿ06ðôÿ4p 4÷ ®ðep ðÕ)ì‚wVþðµð¥Ã%÷ °† ,÷ ¢÷ ÷ N‡÷ xw"þ÷ T‡÷ J†÷ þ‡B æƒàƒ#ƒÎà÷ DÎ f÷ Ìÿ� ‡Â`‡ð¥öÿ*÷ 8w(±ðµ)0406 l0ì° ‡ð‹*±‡ð*‡±ðµ=p!†Õ•^ú‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡ƒ  �D„PÄ5Rà ý†R”‡R”R”à üøð 8ðµ ðµðµ ÷ Òþ‡ðÖ*±‡ðÃ*±‡ðµ=D…÷ * ‡ð`p4°6÷ ¾þ‡æf¦÷ °6°4/‡ðµ=Á  ÷ �ðÕ@)ð 0 Ö 8w&÷ Òþƒ46÷ \‡8ñÕ ÷ º°eð‹*wPþÖ ±‡w ˜É÷ þðµ÷ ÷ ôwøý÷ ȇ÷ >ÿ‡÷ ¼ü‡,, ð ñ‚ð•öÿ*±î0Š+æ1ÿˆÅ(Åe à ÷ Lþß%ÿÿ&ïp’*wžý÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ zýðµ)÷ @‡÷ ð‡÷ ؇ðµ82Áe&À(÷ À€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡ðµðe6p 4÷ Èü†8÷ <±‡÷ Ú†81416÷ ö÷ €ñÅ ÷ ¦‡‡÷ Zê†÷ ‡÷ Ôðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ Â&‡f¦æ÷ ÷ ˜†ƒ‚„÷ ؇åÆeðÅ)ðµ . ñÕ ðe6p 4÷ Z0ž8*wtû¡ðµ)"ðÕ(.÷ ðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ Dû÷ ÿðÅ(.‡141612Áepðµl2l0p‡w vÆðµ Á¥ðÅ)÷ âú‡÷ ªû ÕfU�Ä÷ þü…‡ðµÕ%  BA °`6p 4p`4¡ ¡õ%þÿð60 4‡46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ úwú0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w LÅ Á�   ìì� .Â% ÷ rú ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ ¦û ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡÷ Fù&f÷ …„‡D„ ÄEõµ/fCÃå00ðbG§Fl1DATADATADATADATADATADATADATAŽ A ÷ ăB f& ÷ ¬B‚eA @0÷ ºÁ („‚@0÷ ¨a@ÂeA ‡ B0÷ �€ABÂå� ÷ z¦f ÷ PC�‚áÖ @ð•Òÿ*±‡w ÄÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w Òà  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ ŠøU•Õ8UMwÚùÅåà w*ø÷ âùBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�wL÷8Áe2 ‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡f¦æ&f ÅÂ…`Á Á ý°* �… !†ƒ”×  ×  Ä õ× ñƒ× ÿî× "D × a‡× z‚Ä ÃE Ñ�ÝEp(p°à„… †ƒ”× $ú× 0‡× 9ôƒ× A‡× Zîƒ× _ë× :� � ‚„… V†ƒ”× [È•]× <È•>È‹8 … |†ƒ”× %ú× *÷× -‡× .ñƒ× 0‡× 9ëƒ× A‡× ZåƒÈ ‚ … |†ƒ”× 0‡× 7÷ƒ× *ô× ,A ïlÈ jÁ hŠ„ … q†ƒ”× "A øÁ ö „ #A … c†ƒ”× $‡× %÷ƒ× *ô× 0‡× 9îƒ× A‡× Zèƒ× _å× .� £ß … †ƒ”× .× ; … f†ƒ”× 0‡× 9‚� õ]× -Á X� í× *Á QA æ × ,Á D× = Á >È5 B>ÈU °(wZþ× /*Á .�Á … .†ƒ”× $× -‡× .ƒ× 0‡× 9ƒ× A‡× Z ƒ× _ × :Áÿÿ   DÚ× " Á … †ƒ”³á°0±…„ƒ‚�‡f¦æ&fæ ÈE¢¢^Á`Å÷ úÄ ÈUQÅÿÿ÷ æÄ ÈUQ ÷ ÔÎË€ÈUIá ÈUà `¢Ãe á ÉáccD ÷   Ä”¡%¡*¡.A ÈU Å ï0 0 ��W ,ÈUw@W /D ÷ DÎÄ cBDaW£-Á�Á N�… W¥N W¥OD!†B�“Á N�{É …CÃE€€C¥ÃC¥D!‚Ñ ó�ñ‹þÿ€D! ΋ñ5 Ñ þÁe߃“ƒ Î�à UÂåÔpRpR„“pBCÃ5D ‘ƒ à KR΋KBAÁE�—­:ŒDœ0CŠÄŠý ÷ fÎÄ ÁeëB”—   ¡ƒŠDÒ� CS•ÄŠÞü ƒÐ÷ ¦ ‡W¤†CÅ E Cs ÉΕŠ …„ƒ‚�‡f¦¦)& 6 l(¢*¶„„íƒ †�”Å EÅ 'W "Å =N íÎ ëW :+W =Å 1 Â#W ,W /Å %W %W *ÑöÕ€ÍÄ W <ÈW [ÄW >W ]¾„ v�¢°(°* 6 ƒ…Æe‚�‡w æÌÁ w ÜÌÁ& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡w �ÒÁ(ñ D÷ Bð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwtÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)ÁeB÷ J ‡÷ Lñ \ðµ#÷ ÚU†&œ* ðµ=ð¥æ•Øÿwô Å`p!2üƒÅàÅ… ÅEW!Åp0p2÷ ¬ׇðµ#(ð PðÕ)÷ b†ðµ@#ð¥Çÿ*ð*fff÷ ±±‰‡÷ ,†&œ*wjðµ.÷ nB‡ð5ð(8ðe$8w2€æ•ÖÿA&À(Áe÷ n€†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA#ðÕ@))÷ š †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ @00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ d‡0 @0 ð‡&œ*0 @÷ xuÄ÷ œðµ# ÁeB&B÷ °B÷ f÷ ʰ•*±‡÷ > ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ Æ0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 600ðjG�D§3eaek›’wÜð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡w DÎÁ(DB‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±DÂ(Âe(¦„Äe$2ƒÃeäÿæÓÏÓ Ó(‹ÿˆ‡Ì%[]Ì%<> ƒ ÷ ´„팂1 >‡w ÌÍÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w ˆÍ  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡f&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡w ˜ÌBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=w„Å(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡141612Áepðµl2l0p‡ðµMðµ=ðÕf�Â(& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ðµ=&Îe0æ ÷ U• Â…à  ÂE•Õð >€ >ÍE€ðµ=ufÄ÷ p†�ñ ± wh÷ " ‡f÷ Æ�†&œ*÷ °•*±‡Ä Ä Ä ðµf÷ |ð >€5>õE€u ÷ ’�‡ñ ± ‡ð‹*±‡ð*‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡÷ äÿMÄw 0Š+æ1ÿˆÅ(Åe à ÷ ‚ÿß%ÿÿ&ïp’*w\ÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ 8ÿðµ82Áe&À(÷ ü€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡ðµðe6p 4÷ „†8÷ îü±‡÷ º†81416÷ ÷ .ñÅ ÷ T‡‡÷ ê†÷ è‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ ,þU•Õ8UMwFþÅåà wÌý÷ NþBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�wvý46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ ýwüü8Áe2 ‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡ÁeBÉ ð 8÷ ‡$&w pÒð*ðµ<S1 ¦à Ö KÊ ñU€ò ñU@ò æ÷ 8ƒ‚f&œ" ÷ †€�†‚×'&�ÿ)×'&ëÿð&* ðÊ*Ä%0þðÌ*±‡NDÅ Å ý¦æ÷ Vƒ‚÷ ñEÿû±U‡÷ Ї÷ î‡÷ ´‡w ¦Ñ÷ (‡w¼‡w –Ñ÷ ú‡w²w ˆÑ÷ ó‡wªw zÑBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=w,Å(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡Ä Ä Ä ðµf÷ €ð >€5>õE€u ÷ Ø�‡ñ ± ‡æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡ð*ðµ;ðµ7ðµ#3w ¨Ï *’$Ê ':æƒô �ô�…T•à ýƒñU@…Ê% D•ÄDÓÄ%][Ä%><w¸÷  †wññ1 ‡Ã ÄÄ%ñ,ñ,ñññ:4Š× ±‡w îÎð*DÅ Å ýæ¦Y…‚T¦fÃ(ÃeŠæ„ðµ<Ó•_‚ S•Ä ýó¥:ÿÿÓ•:‚ ƒ…¦æ& œ"& ΕæÏÿˆ‚4†×'&�ÿ ð&*×'&ëÿð¤ÿ*±*ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ ¤ ‡à ññ÷ –üð•Éÿ*‚ƒ‡w þÍð*æ ƒ ‚æ¦×¢"wf)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷ ‡eÄ%w ñU\ñ5@ƒ âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ "ñ5@\ñU@ñ5€áÄ„íÄ ñ5LñUþ¥*ñUÄ Å‚öƒàÎàà Ê¥*Ã%C!.D`÷ à*‡ƒ‚wòþÆeCÃ5€ñU‚Ã5 ±±± Ã5€± Ã5@±‡Æeð•Êÿ*±‡ðµ=õñU„Ä EÅe& ÷ RÄEÅe÷ Ö ¼Ó¥"Ý öŽwVþö Ë¥"  ƒ Ë¥"ö Õ”Ä Â Ä î ƒ  ê¶ Õ• Ä ü‡ð‹*±‡ð*‡0Š+æ1ÿˆÅ(Åe à ÷ @ß%ÿÿ&ïp’*wÀÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ œÿ8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡Â(Âe(¦Ê ññ1 ÷ `£(£(£££‚÷ X†� ‚÷ >âââââ‚:ƒô �ô�‚””à ý¡Á5Á ±‡ÂeCÃe¡‡æ¦00ðrG÷+Il1DATADATADATADATADATADATADATAƒ‚ÃåJ„”Ä¥[Ä¥<C…Å`¥ ¡>C÷ ˆÒ¥,÷ ~… 4ÃB‚ƒ‚× *‚㨂 DÄe $ $ $ ÷ >‡ñz ñññ÷ Dù‡DEÅe     ýð•Ìÿ*1 ±‚ƒ‡ Ë•0‹¤þ‹¨‡—¢3‚¥÷ "÷ Ä ‹¨ ¥Ë”Ó”¦æ£˜Ä ýƒ‚‡‹¢‡Ê¥7‡¥‡æ5æ±ÿˆ‡ß%& Ëw xÉ&Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë å¥.‹ Ä ÅæU¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë ‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±û&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡TaÞ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡±‡|³x–, ¿Ð¿Ð…à W AĤ;TITISYSYTICLOV~ÁXÀøÄ¤~¢ZH¾0¿|XÀÁXÀÁx÷ žw¼ ÷° ÷2«š÷r«Ø‡À"­ð° p&ÿˆ‡÷h ÷` æ"­ÿˆ‡ %N%R -- Invalid device%N %N%R -- Volume not mounted properly%N%N%R -- Bad volume type%N¦ & ÀТðð ð &ÿˆ†×-È\ÿÿùrþˆz£ÿÁwF ‡À 0 ú7ð ÷ ˜ðµ Zð5@YÎ @ÀТðð  ðœ &ÿˆ†×-`\ÿÿù>þˆâ£ÿœ˜Á˜wJ  ‡Àš 0 ú7Š ðµ (÷ (Áx p¬ #p, A1,Ö ‡�ðµ@ ðµ ð5¡IÀØ¢Àó¢À£Ö ±‡©f¤ è*,$&R–%N%R -- Shadow Recording not in system%N%N%R -- Privileged command%Næ^¤ÿˆ·p ÷ ¬ýÿ5 ”ÿ.þˆî¤À”ÿ7 Öÿ‡÷5Îÿ#÷ `Æ@ ÷  ‡÷ ‡÷ > ÷ H÷ :÷5 " ÷  ïé÷E  À wrÀx¤À£¤÷ – ÿ(F¯8ž¢pëÀú«÷ |‡ÀL¯ù r¯‡÷ l ÿ(F¯ÿ8€¥ž¢p±‡%N%R -- Illegal parse data (internal error)%NABDEFIMNOPRSTUXYZ<>{¦Ž¦œ¦®¦Æ¦ï¦º§´¦§§§@§I§À¦º¦V§ §¬§ã¦û¦w Ä&æ`w ¸& & &f„& …—¤ Â¥%“�÷ °ö¤ô ŠÀÁÖ �å–%B‡&Ð¥VA÷ *À ÀCƒ Â2¯¯¥…~Œ  ¦Ä¥Ž ‡AÎ Þ Ö ÉЕ%Œü¥Vå ‡Ã P”Â~‡Ð• B”f�‚÷ â�Ê~‡æÍ\:æÉ\7æÉÜ4æT1H”ÈÅ€¢ ¢È• € Í~‡÷ `Š€‡Ð• ÷ æÅ~‡Ð‹Ã~À ‡÷ ԇЕ Е È~‡æ½\æÑÜЕ A¦ N  Þ É~– ‡æÉ\õA÷ Ä~‡Ð• Ã~‡Ð• Aæ÷ AÎ ûÖ Â ÷ "Е.÷ êÂ÷ AЕ; ÷ öß~‡Â ýð¥ ÿÿùÀ øAá ÷ ¾E‡Aá Â÷ àE‡Á ¦¶6L‡¡ô  -‚�àü ±‡QIOQI/OHRC...00÷1I�D§3eaek›’I/OCSRw ¦Ä'Å  ÅUD$†BA÷ Ô&�Â(÷ ÅU� ÀBQ÷ rÂЕ* ü‡÷ &÷ &÷ �’•’•€‡@Á(÷ ¶f€  Àe ÀeÉÿÀe Àe ‡&æÿˆæ3ÿˆ&æ¦f&¦ v Þ €�‚ƒ„…‡·kµz?TLBOÀPÀzLB ,«p¬'ÿ�¬Ð¬ SHA>ÑÌP  ~¥¹"¹2¹¹*¹I/O Error Code %D.QI/O Error Code %D.¦B Áب÷ 8†&Á‚¯— €Âå€Á•¯ ¦‚÷ öÖ �å‚÷%Zÿ÷Rÿ‡w ÀÄ ù& æLB&æÿˆa‡ñ  Äö¨Ì ÷ ÈW‡111É D÷ °K‡÷ Üø÷ ¸Mõ€÷ ¾?‡„Ä ¡ „ „ „ ÷¶ø÷ ’Õ,©ÕU% ÷ ” ÷šø÷ vM÷ ‚!‡D ‡…Å ÅEøÿÅ… … Åe,©Ä@P•Ä üÀ Áà Ä^ø& æSY&æÿˆ † ÄHø& æSY&æÿˆ±‡÷ .ø÷ 5 ÷ ‡Å,©æ% Î ýÖ ‡æ©ÿˆ ‡æøæ)ÿˆ÷‹ú±‡Æå €&æ?ÿˆ,-fW >5‡W E5ƒW ¾s‡W Ås ƒW !€ ‡W 8€ƒW >€‡W E€‚�W ¡Œ ‡W ¸ŒøƒW ¾Œ‡W ÅŒòƒÖ $|³Æe ‡w *ÂÌ¢�$Ò üÁ%ÿ±ÂÀ³÷  ÷ ØЕ.‚÷ ¡‡�”þÀ ‡÷ Øö€Àe&…ÄBù„ ÄEC@ÀEøÁ� � � ÁEñÿG` ?L`_Ë �Tè�ã÷ ÄTâ÷ ¼@T”~Ë Û�× Ä%r«ü‚÷ ¤ñ‹ ÀêüÀEøÿ@¢w’ÞüwœÙüÁeÂ2«Àt«Ã„DÄî²÷ hóÁ Ât«Ì Ä2«°&æ=ÿˆË €Á’C~`¢÷ <À>­÷ Üþ †Á €A�Áå€A�÷ ØüŠ÷ 8�7RøvÖ ÷¥Vü±‡ Ë5AÀ‹�€a@@`‡&f¦æ&fÀ>­ Ћ� üÀ>­&Á È¥ È¥ Á € õÖ …„ƒ‚�€‡ DÄ Ë¥ †‚ ƒ Ä ÷Ãð§“ Äœÿÿa …æÔ¤Å üÖ ƒƒ`Ë‹í„Ä Ë¥A‚Ë¥Z‡Î ËÕ ƒ Ä ñ€`�à¸UNKNOWN ERROR CODE =JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw Ê 5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ œ*AdBbAÁepÂ& ¦fƒÂÁ ÷ Ø– –‡ÁPõµ aA”Aíf@pnp÷ ¦C*8Ö‹Á ÷ ˜88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ ,õÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw î õ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ 5fµ fˇðµ ÇÈ•÷ ‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ îDlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ À½•8 †õ¥öÿ*ÎÀµÎ”µ‡w °õ 8µŠjDl@÷ „T”ÔÀeBTŸ8œ5l@÷ V‡@Á(ñ D÷ ôÁeB&÷ Ö‡÷ ‡& ææ©ÿˆ@ð•#÷ ¾& æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAn00÷9I+Il1DATADATADATADATADATADATADATABà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡w JD…&&÷ bЕ-�Î �eÁaÁeOûP”P”P”Е-�$w DÅ… ƒ÷ &Е.À À À ce÷ |À …Е:÷ Å ù Â÷ æB‡×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ 4hÀ(Áÿ ,tÀ(Áÿ $€À”Áÿ ŒÀjÁÿ ŒÀDÂÿ ˜ÀlÁÿ °ÀôÅÿ ü°À Èÿ ô¼ÀÆÿ ìÈÀÆÿ äÔÀ\Íÿ ÜìÀ0Æÿ ÔìÀ”Èÿ ÌìÀôÅÿ ÄìÀÞÈÿ ¼ìÀ¸Èÿ ´ìÀäÈÿ ¬ìÀÌÈÿ ¤ìÀÒÈÿ œìÀØÈÿ ”ÁôÅÿ ŒÁ>Çÿ „ÁÇÿ |ìÀöÈÿ tìÀ²È¦Þ5Îe‡w âÁ,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡w$ù è(ºG¾ÿÿÿÿî¾Ê5¦ „Ê €‚Ê5ùà ÷ƒõ…2Å Å ÍUEÍ ø�‚‡\Àê¸ H¿î¾Ò¹ZÀ‡ÊEò ÊU ‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡&æf…Þ ƒ„…‡&æ¦ff… Þ �‚ƒ„…‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡‡  (!hÀ¤À�(Á\ÀtÀ�(ÁÌ\À€À�(ÁŒ\ÀŒÀ�(Á¨\À˜À�(ÁÔ\ÀhÀôŰÀ\À�ôÅ`¤À¼À�ôÅ� ¤ÀÈÀ#�ôÅhÔÀ¤ÀìÀ'�\ÍLÈÀàÀ)�\ÍØÈÀÔÀ*�ôÅ„¤ÀøÀ.�ôÅd¤ÀÁ3�ôÅä ¤À°ÀÇqš±Ú±õPsÇqÚ±À³ýØwÀú«0 b÷ Æòhf ‡ô@wþí·øí÷ È Š9œ`Á¥öÿ/ÂÈÁÁ¥üÿ ÂÁ¥ýÿ ÂKÂÁ¥þÿ™ÂÁ¥ÿÿÂèÂ*÷ Jðÿ(F¯ÿ(B¯\^ H P 8ž¢p÷ šã·÷U €í±‡¡‡%N%R -- Maximum indirect command file depth exceeded%N%4S-- %VA%N%N%R -- Bad indirect command file specification%N%4S-- %VA%N%N%R -- Open error on input command file%N%4S-- %VA%N%4SFile=%2A%B:%X, %I%N%N%R -- Input error on input command file%N%4S-- %VA%N%4SFile=%2A%B:%X, %I%N %N%R -- Unknown command error%N%4S-- %VA%N¢a‡¢z‚ÈÅ ” õ‡ÀJ¯  r¯ü‡ÁÂhÄÃî ÄþíÅvÄ÷ æ† ÷ìí7êí‡÷P¯âí‡ÿ�ÆÚí· Öí‡÷‹¿ÿ¸Èí‡÷eÀí‡Îe‡¡‡¡‡À ÂÀÞÁÁšíÁàÁ  ÷ &ðÿ(F¯ÿ(D¯ÿ<Ä 8ž¢p÷ ~ã7 tíÎe‡%N%R -- Illegal command%N%4S-- %VA%I%VA%N%N%R -- Syntax error%N%4S-- %VA%I%VA%N7 &f¦wì÷‹è÷ Æ7 à7ÞÀâÈ @•,€ÀåÀÿq `-KacJE[à !Ãm¢Äíž@•Á †Õ Á ûα)÷ L÷ R†é  çà å÷j7•jà f@• †Õ †&Ý €…Ò€Ö À5]U ¦†E¤¯‚…€Á(‡ :Á‚æ&@E÷ ÿA ·00÷AI�D§3eaek›’Îà· ̆ª ÷ Š÷ Р¢ÂÀEÿ÷ vœÀEÀÿÀ €cÁÐÂΤ‘Á ü¢ÿ­÷‹¹‰÷­´±¦†„÷ @�Á à £.„ à · ’æ&fÅŠÄ„Ã6ÄÁ ÷ †÷ Š…„ƒ¶à ÷ 8 †À ÷ "†À £.£$· B„ à ë÷ 8‡Ì¥Z‡£A‡Ì¥9‡£0 ‡ à £ £ ‚ „ à ö‡STARTÿSTOPÿDISPLAYÿCONTINUEÿABORTÿTOÿTOÿ@ÄFÄKÄSÄ\ÄbÄeÄ€\ÁL¯®Ä�^ÁL¯ÔÄ‚bÁL¯,Ń`ÁL¯ðÄ„bÁ L¯âÄÀ† ÁÈÅ’Á¼ÄÀ†šÁ…ÆÄÀ†šÁÈÅ–Á,ÅÀ†šÁÈÅ’Á,ÅÀ†šÁÈÅ’Á,ÅÀ†šÁÈÅ’ÁþÄÀ†šÁ†ÅÀ†šÁÈÅ–Á,ÅÀ†šÁÒ‚jÁÒ‚jÁÂvÁ&ÅÀ€:†„ÁÊ;!À†šÁw †úÁ w |úÁ& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡GL¯ ÊQ|³ÞÁhÁjÁ*%N%R -- Start-up error%NINS $SHC/TASK=SHA/IOP=NO/RUN=REM/EST=NO÷%¸íÀxÁð�¬íÀ{ÁÀ{ÁÐ�œíÐ�™íÁ�–í ÷ êæ2Áÿˆ†÷%ÿÿV>ø!ææ‡ÿˆÖ æsÿˆ÷%|ÿÀxÁ ÷ 4w.ÿ ÷ *w&ÿæ(Áÿˆ÷%>‡ÀLÁ÷ ¼ïÿ(F¯8ž¢p‡w „ý„ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ ’ýE�€Aa×$Ò±œÿÿ‡ÿ ’üìÀäÈ%N%R -- Not a shadowed pair%N%N%R -- Catch-up in progress%Nw Fþ÷ Æá/‡Áî@ %1¬ $1, þˆÆÁð ÁØâBA@ ü 2 2 Áÿ ªâ‡ðU‡À(ÁÀHÁ÷ ðÿ(F¯8ž¢p‡ ÊQ|³¾Â6Â: %N%R -- Not a shadowed pair%N(%N%R -- Abort error%NABO SHAw lý÷ ìà/‡Á,í@ $1¬ 1, ÀAÂÐ�ÞìÐ�ÛìÁ�Øì ÷ FæäÁÿˆ†÷%ÿÿ˜=ø ææ‡ÿˆ@wìþÀþÁÀÂ÷ *ïÿ(F¯8ž¢p‡Ö æsÿˆÿ xüìÀäÈ%S%7SUMB%5SPRIMARY%3SSECONDARY%N%S%5S%P%7S%4A%6S%4A%N÷ FçÅãÍ ÷ ^ðÿ8(Áž¢pECÀ`Á÷ ,CÀfÁ÷ ÷ 6ðÿ`ÁÿfÁÿ8IÁž¢pæ÷‚í‡Â�œ�œ&À€ì�÷ `þ€lÀEÿ€ ÷ Е:‡ÿ JýìÀØÈf¦æ&f ÅÂ…`Á Á ý°* �… !†ƒ”×  ×  Ä õ× ñƒ× ÿî× "D × a‡× z‚Ä ÃE Ñ�ÝEp(p°à„… †ƒ”× $ú× 0‡× 9ôƒ× A‡× Zîƒ× _ë× :� � ‚„… V†ƒ”× [È•]× <È•>È‹8 … |†ƒ”× %ú× *÷× -‡× .ñƒ× 0‡× 9ëƒ× A‡× ZåƒÈ ‚ … |†ƒ”× 0‡× 7÷ƒ× *ô× ,A ïlÈ jÁ hŠ„ … q†ƒ”× "A øÁ ö „ #A … c†ƒ”× $‡× %÷ƒ× *ô× 0‡× 9îƒ× A‡× Zèƒ× _å× .� £ß … †ƒ”× .× ; … f†ƒ”× 0‡× 9‚� õ]× -Á X� í× *Á QA æ × ,Á D× = Á >È5 B>ÈU °(wZþ× /*Á .�Á … .†ƒ”× $× -‡× .ƒ× 0‡× 9ƒ× A‡× Z ƒ× _ × :Áÿÿ   DÚ× " Á … †ƒ”³á°0±…„ƒ‚�‡f¦æ&fæ ÈE¢¢^Á`Å÷ úÄ ÈUQÅÿÿ÷ æÄ ÈUQ ÷ ÔÎË€ÈUIá ÈUà `¢Ãe á ÉáccD ÷   Ä”¡%¡*¡.A ÈU Å ï0 0 ��W ,ÈUw@W /D ÷ DÎÄ cBDaW£-Á�Á N�… W¥N W¥OD!†B�“Á N�{É …CÃE€€C¥ÃC¥D!‚Ñ ó�ñ‹þÿ€D! ΋ñ5 Ñ þÁe߃“ƒ Î�à UÂåÔpRpR„“pBCÃ5D ‘ƒ à KR΋KBAÁE�—­:ŒDœ0CŠÄŠý ÷ fÎÄ ÁeëB”—   ¡ƒŠDÒ� CS•ÄŠÞü ƒÐ÷ ¦ ‡W¤†CÅ E Cs ÉΕŠ …„ƒ‚�‡f¦¦)& 6 l(¢*¶„„íƒ †�”Å EÅ 'W "Å =N íÎ ëW :+W =Å 1 Â#W ,W /Å %W %W *ÑöÕ€ÍÄ W <ÈW [ÄW >W ]¾„ v�¢°(°* 6 ƒ…Æe‚�‡w &ôÁ w ôÁ& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë 00÷II+Il1DATADATADATADATADATADATADATAc ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡ÁeBÉ ð 8÷ z‡$&w °ùð*ðµ<S1 ¦à Ö KÊ ñU€ò ñU@ò æ÷ ¬ƒ‚f&œ" ÷ ú€�†‚×'&�ÿ)×'&ëÿð&* ðÊ*Ä%0þðÌ*±‡NDÅ Å ý¦æ÷ ʃ‚÷ ñEÿû±U‡÷ D‡÷ b‡÷ (‡f&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡w rø÷ (‡w¼‡w bø÷ ú‡w²w Tø÷ ó‡wªw FøBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=w,Å(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡Ä Ä Ä ðµf÷ €ð >€5>õE€u ÷ Ø�‡ñ ± ‡æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡ð*ðµ;ðµ7ðµ#3w tö *’$Ê ':æƒô �ô�…T•à ýƒñU@…Ê% D•ÄDÓÄ%][Ä%><w¸÷  †wññ1 ‡Ã ÄÄ%ñ,ñ,ñññ:4Š× ±‡w ºõð*DÅ Å ýæ¦Y…‚T¦fÃ(ÃeŠæ„ðµ<Ó•_‚ S•Ä ýó¥:ÿÿÓ•:‚ ƒ…¦æ& œ"& ΕæÏÿˆ‚4†×'&�ÿ ð&*×'&ëÿð¤ÿ*±*ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ ¤ ‡à ññ÷ –üð•Éÿ*‚ƒ‡w Êôð*æ ƒ ‚æ¦×¢"wf)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷ ‡eÄ%w ñU\ñ5@ƒ âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ "ñ5@\ñU@ñ5€áÄ„íÄ ñ5LñUþ¥*ñUÄ Å‚öƒàÎàà Ê¥*Ã%C!.D`÷ à*‡ƒ‚wòþÆeCÃ5€ñU‚Ã5 ±±± Ã5€± Ã5@±‡Æeð•Êÿ*±‡ðµ=õñU„Ä EÅe& ÷ RÄEÅe÷ Ö ¼Ó¥"Ý öŽwVþö Ë¥"  ƒ Ë¥"ö Õ”Ä Â Ä î ƒ  ê¶ Õ• Ä ü‡ð‹*±‡ð*‡0Š+æ1ÿˆÅ(Åe à ÷ @ß%ÿÿ&ïp’*wÀÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ œÿ8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡Â(Âe(¦Ê ññ1 ÷ `£(£(£££‚÷ X†� ‚÷ >âââââ‚:ƒô �ô�‚””à ý¡Á5Á ±‡ÂeCÃe¡‡æ¦ƒ‚ÃåJ„”Ä¥[Ä¥<C…Å`¥ ¡>C÷ ˆÒ¥,÷ ~… 4ÃB‚ƒ‚× *‚㨂 DÄe $ $ $ ÷ >‡ñz ñññ÷ Dù‡DEÅe     ýð•Ìÿ*1 ±‚ƒ‡ Ë•0‹¤þ‹¨‡—¢3‚¥÷ "÷ Ä ‹¨ ¥Ë”Ó”¦æ£˜Ä ýƒ‚‡‹¢‡Ê¥7‡¥‡æ5æ±ÿˆ‡ß%& Ëw Dð&Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë å¥.‹ Ä ÅæU¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë ‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±û&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡TaÞ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡±‡ÿ JùÔÀfÍÿ BùÔÀ4Îÿ :ùÔÀ˜Îÿ 2ùàÀnÍÿ *ùÔÀðÍw ¨ùÁ(ñ D÷ Äÿð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwtÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)ÁeB÷ 6ÿ ‡÷ Lñ \ðµ#÷ �U†&œ* ðµ=ð¥æ•Øÿwô Å`p!2üƒÅàÅ… ÅEW!Åp0p2÷ bׇðµ#(ð PðÕ)÷ †ðµ@#ð¥Çÿ*ð*fff÷ Ò±±‰‡÷ â†&œ*wjðµ.÷ nB‡ð5ð(8ðe$8w2€æ•ÖÿA&À(Áe÷ *þ€†æ•Ùÿ4p8Éq ñ• ðµ00÷QI�D§3eaek›’(ðµ#5ðµ=ðµA#ðÕ@))÷ ðý †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ ö00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ ‡0 @0 ð‡&œ*0 @÷ .uÄ÷ Rðµ# ÁeB&B÷ x°B÷ ÷ €°•*±‡÷ ô ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ |0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6w’ð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡141612Áepðµl2l0p‡ðµMðµ=ðÕf�Â(& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ðµ=&Îe0æ ÷ U• Â…à  ÂE•Õð >€ >ÍE€ðµ=ufÄ÷ p†�ñ ± wh÷ " ‡f÷ Æ�†&œ*÷ °•*±‡Ä Ä Ä ðµf÷ |ð >€5>õE€u ÷ ’�‡ñ ± ‡ð‹*±‡ð*‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡÷ äÿMÄw 0Š+æ1ÿˆÅ(Åe à ÷ ‚ÿß%ÿÿ&ïp’*w\ÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ 8ÿðµ82Áe&À(÷ pù€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡w hòÁ(DB‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±DÂ(Âe(¦„Äe$2ƒÃeäÿæÓÏÓ Ó(‹ÿˆ‡Ì%[]Ì%<> ƒ ÷ R„팂1 >‡w ÀñÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w |ñ  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡w 0ñBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=wºüÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡f&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡ðµðe6p 4÷ .†8÷ ìü±‡÷ D†81416÷ ÷ ¤ñÅ ÷ J‡‡÷ .ê†÷ r‡8Áe2 ‡46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ €ýwpýÄÄ÷ ´ýU•Õ8UMwÎýÅåà wTý÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡,*ÿÿ±‡æ1ÿˆ‡÷ VýBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�w~ü Âw ²ù ”Å¥ üÅ¥ ùÅå0B¡†€÷ úAa”ôœÿÿ‡w ”ù÷ ‡ðµ)ðµ÷ Œ8C÷ $ð¥öÿ* ðÕ)ð ð*wDð•öÿ*ú÷ ì÷ Îõ‡ðep p ‡÷ „è‡ð¥#ðµ=Ä E”W¡9ƒÅ¥^éð•³ÿ*ÐÅå0ùà Å`à à CaÄ ëÃåCƒ Ôà ðµ=ðµ÷ X ð¥ð 0Àð•Øÿ*§ð¥ ðµ= ÄEÕ¥^Ä ûA¨ð¥ æÂe@ÃÎà÷ Þƒ߇÷ ðµ=� ÁEpÓðµ2ðµ!)8ÂeEÅ`l0Å …à ì0‡„ û0¡/ &l0Ä ü„…`pÄ „löÿ06°ôÿ4p 4÷ žðp°æÄ ƒðÎà÷ 8ƒ ƒ÷ Vá÷ ù†ð•Øÿ*Á`‡ðµ)w@æ÷ žƒ‡æCàƒ#ƒÎà÷ ÒÎ ¦÷ Èÿ‚ð†– ‡DàÄ ‡ðµ@) ð 6ðÿ?0ðÅD)‡w 0÷ð*D÷ n Õ ýwØæ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w ºö…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ ÷W ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡ð‹*±‡ð*‡8AÁe fÕœ"Šœ(00÷YI+Il1DATADATADATADATADATADATADATAà ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡ƒ  �D„PÄ5Rà ý†R”‡R”R”à üøð 8 ðµðµ÷ bÿ‡ðÖ*±‡ðÃ*±‡0Š+æ1ÿˆÅ(Åe à ÷ :ÿß%ÿÿ&ïp’*wÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ ðþðµðe6p 4÷ ’þ†8÷ <±‡÷ ì†81416÷ P÷ `ñÅ ÷ †‡‡÷ :ê†÷ ‡141612Áepðµl2l0p‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ ˆþU•Õ8UMwêþÅåà w(þ÷ òþBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�wÒý46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ hýwXý8Áe2 ‡w Ðù÷ Þn‡832cðµd& & & B öŠð 2OðµðµΕ ¶“ðµ à N”à Υ$¶“Ε Åð 2ƒ2Åà‚Î¥ Ž�Î �æ÷ (ƒvÂ Š‚ ƒ“Ε f÷ Fƒ�ׯe÷ Hð¥óÿ*÷ VÆeð•Øÿ*w:ðÅ@)0,÷ ¢÷ ìò‡ðµ ÷ F‡ðÅ)÷ ðÕ)ðµ( ð¥ Ó ðµ=Ó ð¥Ó lð 0Æl‡ð  ƒ÷ Ô†ð¥øÿÿ÷ 0¶‡ð¥/ð ðð¥Ãe&ðµ=ÅBaÀ@aÁ ÷ ŒøÁe0b�Å ÷ÂeÒ€ð¥Áe@Ã÷ Ô^‡÷ ÆW‡ðµ=‚ ÂE°8óÅ Ãe…l0Å Åà & ì0‡„ l0ù…Å`pÄ Älöÿ06ðôÿ4p 4÷ ªðep ðÕ)ì‚wnþðµð¥Ã% ÷ ¬†,÷ ž÷ ‡÷ rw>þ÷ N‡÷ J†wT‡B æƒàƒ#ƒÎà÷ îÎ f÷ Ìÿ� ‡Â`‡ð¥öÿ*÷ 8w(±ðµ)0406 l0ì° ‡ð‹*±‡ð*‡±ðµ=p!†Õ•^ú‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡ƒ  �D„PÄ5Rà ý†R”‡R”R”à üøð 8 ðµðµ÷ 0ÿ‡ðÖ*±‡ðÃ*±‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡ðµðe6p 4÷ Îþ†8÷ 챇÷ œ†81416÷ ÷ ñÅ ÷ 6‡‡÷ êê†÷ ʇ÷ Þðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ ”&‡f¦æ÷ ’÷ Z†ƒ‚„÷ h‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ 0ž8*wzý141612Áepðµl2l0p‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ òU•Õ8UMwþÅåà w’÷ Bðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�wÂü46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ XüwHü8Áe2 ‡0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w ¨ò Á�   ìì� .Â% ÷ ˜ ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ ˆ ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡0Š+æ1ÿˆÅ(Åe à ÷ �ÿß%ÿÿ&ïp’*wðú÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ Ìúw Ðùð*æ8Iðµ÷ hœ*=‡ðµ€)98÷ n ÕeBÕ && ð Îå¶ �ÕU€�Ä÷ ü‰�†ð¥öÿ*ð¥åÿ*Æe ð*Nlv °°΋œ*ðµ.2÷ ø „& ðµ#ðµ!ðµ)&ÎePæÂ(ÂeÊ ¦æ&æ•&Äð >€Åe >ÍE€÷ X†�•p�*÷ šwxw ´ø÷ |ðµðÅ)÷ „†ð¥öÿ*÷ ºwJ46l0ì‡w pøð*ÁeBð 8÷ 2 ‡÷ €þ‡ðµ÷ ¸É‡ð‹*±‡ð*‡w (øBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%000÷aIù3J§3eaek›’ðÕ=wˆÿÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡÷ ¢ ‡f÷ †�†&œ*÷ ˆ°•*±‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡ðµ=D…÷ Ø ‡ð`p4°6÷ ‚‡æf¦÷ ž°6°4/‡ðµ=Á  ÷ âðÕ@)ð 0 Ö 8w ÷ –ƒ46÷ ‡8ñÕ ÷ °eð‹*wÖ ±‡0Š+æ1ÿˆÅ(Åe à ÷ ôþß%ÿÿ&ïp’*wþ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ ìýðµ82Áe&À(÷ €0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡¡ðµ)"ðÕ(.÷ äðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ t÷ ÄðÅ(.‡÷ ÈýMÄw|þÄ Ä Ä ðµf÷  ýð >€5>õE€u ÷ Dþ�‡ñ ± ‡141612Áepðµl2l0p‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡w ôðµ Á¥ðÅ)÷ ¸û‡÷ ¶ü ÕfU�Ä÷ bý…‡ðµÕ%  BA °`6p 4p`4¡ ¡õ%þÿð60 4‡ðµðe6p 4÷ 8ÿ†8÷ Îþ±‡÷ 4†81416÷ ÷ îñÅ ÷ ‡‡÷ Èê†÷ b‡46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ Žúw~ú0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w ~ò Á�   ìì� .Â% ÷ "û ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ ®û ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡w àñÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w œñ  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡8Áe2 ‡÷ ìÿðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ (þ&‡f¦æ÷ |÷ þý†ƒ‚„÷ R‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ øû0ž8*wTø±ðµ=p!†Õ•^ú‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ &ùU•Õ8UMwÎùÅåà wÆø÷ ÖùBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�w²÷»z_M–, ææ W ‚n§'TISYSYSYTICLzìÀ0Àøn§z¢VØÁx0ÀìÀ0À÷,ôÿ7 ôÿþˆð¢Àî¦ÄrÃÎ÷ äÀn¦Äd7 ÒÿÃv÷,Èÿ‡÷ °÷ À÷¶ÿÃæñ÷ªÿÞæÿ ÃŒÄrÀî¦ð’ÿ6÷ |‡ÁŠÿ÷ ¦‡þˆJ£æ.ÿ:( Á×ÀÁeÿ6ÀßÕ4À À×ÀÀe`Á%‚ ÿBÀòî¿ì¶‡þˆ–£æÞÿêØ€Ädÿ6ÀÊßµ4ÀÿBÀ¼øö 6 ßÅ4Àä÷ 𿜇þˆÚ£æ¤Þ ‡õ5@6 ÷õ ôævpö ßÕÀ¿`æö‡ßµÀõßÅÀß*ÀÅì 3sœÂE00ù7J+Il1DATADATADATADATADATADATADATAÿaŸ�,ÀÀÁ"¿ÿ 6Ä<CÀn¦÷ \Æe6 Õj„¬öú".r~Ž–š©0¤¤©ÔªÌªB«¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¬j«¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©¤©è¨è¨è¨è¨è¨è¨è¨è¨“»z_MæP¤ÿˆ÷ Ô ‡÷¥ ðþÀÂüÁâþþˆ”§ÿ ªü‡Á(÷  wHÀî¦Ãšü÷¼ÿÄrþˆº§÷ ʇæ„ÿæ@§æ>§æ8§�÷ $†wÆeæè¨æ§ÿˆææ\¦æiÿˆ‚Àvµ& &&&�÷ D †÷ �æ`§ÿˆþˆ"¨(üÀ&üðü÷ ÿ æb©ææÿ& æÿˆ÷ ÿ æ ©ææòþ& æÿˆÿUÎû÷ â ‡÷ êý57� ÀÝöýÀ ø X¤ïÿ5@¬ûÿE@¤û÷ ¤ÿ5šûÿE’û÷ ªÜÿ5†û ÿE~û Àvµ÷ †÷ þ þˆ`¨ÿ zû‡ÿE\ûjû÷ Ä¿÷ ¾×-ný€ææÿˆ÷€ZýÿU€.ûfÁ-÷ ��ÿEû÷ ø w€ ÿUûæj§¦öe¶æ…ÿˆÖ ÷ þ æ ©ææöý& æÿˆæsÿˆÿU@Ìúæj§¦öe¶æ…ÿˆÖ ÷ Äý æb©ææ¶ý& æÿˆæsÿˆÿ5Šú÷ ªüæ€ ÷¥ ²üæþæ�§ü6Šæn¦�÷ †w ÿÆe÷ ‡Á÷ jü&� ÁÝwü÷¥püÿ5,úÁeÁe?Á Á ÁÁEÿÀLüþˆ(ªú÷ ,ü‡fÁ)÷ f�‡fÁ.÷ X�‡÷ ˜ 7 üÀðù7 üûþˆ¢ªÿ Úù‡wüCÀn¦Ä@÷ ÷ Þû7¡ïû † ÄÝçûÄ%€ò†Ä€· Âû퇷 ¸û‡÷ ²û±‡÷ ªû ÄݹûÄ%ƒ· ˜û÷¦û¦û¡‡÷ Ôþw¬÷÷ ÌûfÁ*÷ ¼�÷ ºþ÷ ^ÿ ‡fÁ+÷ ¦�÷ ¤þ÷ Hÿû†fÁ/ÿ÷ ��Àz´÷ "†¬*æÿ÷ šÀü´÷ †¬*æÿ÷ „wÐýw :ûw 8ûæPûÎí0û·,ûÎBûŽ Îí û·û÷ <þ‡æ�û6Šæn¦�÷ \†wfý÷-úúû÷ †æûæ’¦æ�¦æЦ�÷ P †w>ýÆe�÷ $†w.ý÷-ØúÔúÀvµðÌú Æe÷ þþˆ¬ÃŒûÄrÀî¦÷ š ÷ªúTû÷¨úVû÷¦úRû÷Œú8û÷ˆú4û÷†ú2û÷‚ú.û÷ T ‡‡æfú÷dú`ú·^úæ`ú÷^úZú·XúæVú÷TúPú·Nú÷E€Lú÷ Vý‡÷ ¨öÀz´pÂn¦ð•#÷ †fÁF÷ *�Tþˆš¬ÁÀ÷ÀVÿ Ä÷Àî¦Ã°÷Ärwè ÷Õ@‚úðî¦ðr÷ œ‡°÷ ’öÁ òÕ@4 ƒÜð÷ zñ†fÁ7÷ Â�÷ à÷ À÷ º‡Àü´÷ D†¬*æÿ÷ ¼Àz´Áü´÷ x"†fÁ6÷ €�÷ žÀvµ ÷ ¨†÷ އ ÷ Zö À÷ PöÁ -÷•ù÷•<ùæ(ù÷&ù"ù· ùæ"ù÷ ùù·ùæù÷ùù·ù÷E€ùæ�åø6Šæn¦�÷ >†wHûÆė÷ t †fÁH÷ è�÷ ±‡fÁG÷ Ô�wòÒ­÷ …Àvµ&&÷ 8‡°#°-&&�÷ FF‡FfÁ÷ „�÷ ¢±‡Ã¨ÿÁ ÷ R‡B‚ ÂEÄÄe„`Ä%Ò¯†Ëÿÿ÷  ‡“D•‚~Ã%Ò¯÷ ‡÷bÿ‡÷ â‡÷ ʇÃÒ­‡Ã%Ò­Ëÿÿ÷ àÿ‡*DIAG* *WARN* *ERROR* *FATAL* I/ODSW???=†± -- ÷ D…DÁEÿÁ-|†¦f‚ÁÀưf¦ÄÄEÿÄ¥ЕЕæ–±ÿˆÁŒ±Â÷ x Е Е æf±æ?ÿˆÁdÿ÷ šÁ^ÿ÷ �Áš±P”þ� ÷ |Е.Е ‚�Ä%�ÄÄ à à Ä`Ä-h7bÄe–°Ã•Â~Á Aš·÷ æÀ寰& & & æ &æư& & & Εæææ ÿˆ‡ææ)ÿˆF‡÷e”° ææÿˆæpM‚Áÿ÷ àþÖ ‡f…&P&N&L&J&Hæ°æ°&^&Îe\&Îe*ð‹+æ¿°æ¼°Áÿ‚÷ ’þF…‡÷ ÐÀvµ ÷ ¶ü†÷ œÿ÷ ô‡‡fÁ ÷ fþ�÷ „ÿ±‡F³ÿÿ vµ÷ ’Àvµñeq q"9‚‡q,4†&& & 00 ð & & & & æL³& & æF³& Εæææ ÿˆU‡ææ)ÿˆO‡° ° °÷‹nÿ<�‡& ff& ææJ³& æF³& Εæ00ù?J3J§3eaek›’ææ ÿˆ‡ææ)ÿˆ ‡÷‹*ÿ�ñeq �÷ „þfÁ ÷ hý�±‡ÂD³fÁ ÷ Tý�±‡ÂD³fÁ ÷ @ý�±‡÷ HþfÁ ÷ ,ý�±‡Ú´æ´ê´ ï´LB0:[1,6]SYSSCAN.TMP;1\µæ´ê´ hµSYSSCAN.TMP;2ÖµÆÞ»zSY÷ ðÀvµÂeBCòòòrrðU‚>p ð•ðÒ­ðð•(ðÔ¯ð•f#÷ j‡‡fÁ÷ @û�÷ ^ü±‡÷ zÿ ÎíÂå ÄÀÿ ¶í‡÷ bÿ ¶íf¦Á „ƒÿ ˜í‡÷ &÷ &÷ �’•’•€‡@Á(÷ f€  Àe ÀeÉÿÀe Àe ‡&æ¦f&¦ v Þ €�‚ƒ„…‡Â Âw ” ”Å¥ üÅ¥ ùÅå0B¡†€÷ ˆAa”ôœÿÿ‡w bÄ'Å  ÅUD$†BA÷ *$&�Â(÷ ÅU� ÀBQ÷ 6 ÂЕ* ü‡¢¹É¹ù¹Äº„¹,ºJº`º†º­ºD¸v¸Ù¸û¸.¸a¸·¸¹?¹-¹¹p¹]¹HUAB not found in listNo startup transaction foundExiting due to errorBad transaction length.%N block(s) of secondary pool may be lostTransaction not in secondary poolUAB listhead not zero on shutdownTransactions follow SABExitingOn scan file openOn scan file PUT$Error during scan file renameOn scan file closeOn scan file deleteCan't write transaction fileUndefined message number %D. at PC %P Directive error. $DSW=%P PC is just before %P FCS %3A error code = %B %Nfile: %2A%O:[%3A,%3A]%X Can't close transaction fileCan't init new blocksCan't init new blocks. I/O error = %BCan't write attributes. I/O error = %BCan't write attributesCan't open transaction file (by ID)ABDEFIMNOPQRSTUXYZ<>Å"BaÊ$ep|v¢­$Ê®¶ÅÏJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw ^&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ €ûÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚bÂEÊ Ö ÌЕ%„Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ ”�à õ‡& æÎev6& ¦æÎeb/& æÎeû*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎe( & ¦æÎeЕ A‚¦Þ à ÷–%‡& æÎeèòA÷ äùà û‡Ð• à ü‡A÷ bE‡AÂ÷ †E‡Ð• Aæ÷ °ùAÎ ûÖ Â ÷ $Е.÷ ˜ùÂ÷ AЕ; ÷ fà à‡Â ýð¥ ÿÿùÀ øw tD…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w DDÅ… ƒ÷ &Е.À À À ce÷ JÀ …Е:÷ Å ù Â÷ ÌB‡¸½×Áÿÿÿÿ~Âæ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w æ …�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ ä W ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡w ð*æ8Iðµ÷ ^œ*=‡ðµ€)98÷ Ö ÕeBÕ && ð Îå¶ �ÕU€�Ä÷ È ‰�†ð¥öÿ*ð¥åÿ*Æe ð*Nlv °°΋œ*ðµ.2÷ ` „& ðµ#ðµ!ðµ)&ÎePæÂ(ÂeÊ 00ùGJ+Il1DATADATADATADATADATADATADATA¦æ&æ•&Äð >€Åe >ÍE€÷ $ †�•p�*÷ ¾ w$w ð*ð 8B÷ Ìþ‡pB÷ 6‡ðµ÷ 0 B÷ ì ‡w Ê Á(ñ D÷ ð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwnÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)÷ r ‡÷ Lñ \ðµ#÷ �U†&œ* ðµ=ð¥æ•Øÿwô Å`p!2üƒÅàÅ… ÅEW!Åp0p2÷ –ׇðµ#(ð PðÕ)÷ †ðµ@#ð¥Çÿ*ð*fff÷ ¨ ±±‰‡÷ â †&œ*wjðµ.÷ nB‡ð5ð(8ðe$8w2€æ•ÖÿA&À(Áe÷ €†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA#ðÕ@))÷ ¨ †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ ¸ 00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ V ‡0 @0 ð‡&œ*0 @÷  uÄ÷  ðµ# ÁeB&B÷ x °B÷ \ ÷ ž °•*±‡÷ È ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ B 0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6wì ð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡w „ Á(ñ D÷ È ð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•Óÿw¸Ä 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)ÁeB÷ h †&œ* ÷ Šñ ðµæ•ÄÿwT± ðµ.÷ PB‡ð5ð(8ðe$8w2€æ•ÖÿA&À(Áe÷ Z €†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA#ðÕ@))÷ ú †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ 00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ ¨ ‡0 @0 ð‡&œ*0 @÷ TuÄ÷ j÷ °•*±‡÷ 8 ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ ²0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6w\ð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡w ô÷ œ n‡832cðµd& & & B öŠð 2OðµðµΕ ¶“ðµ à N”à Υ$¶“Ε Åð 2ƒ2Åà‚Î¥ Ž�Î �æ÷ D ƒvÂ Š‚ ƒ“Ε f÷ @ ƒ�ׯe÷ Hð¥óÿ*÷ FÆeð•Øÿ*w*ðÅ@)ðµ÷ ° †ð¥öÿ*ï0,÷ Æ ÷ ðæ‡ðµ ÷ þ ‡ðÅ)÷ ìðÕ)ðµ( ð¥ Ó ðµ=Ó ð¥Ó lð 0ºl‡ð  ƒ÷ † †ð¥øÿÿ÷ 4ª‡ð¥/ð ðð¥Ãe&ðµ=ÅBaÀ@aÁ ÷ ¸Áe0b�Å ÷ÂeÒ€ð¥Áe@Ã÷ Ø`‡÷ ÊY‡ðµ=‚ ÂE°8óÅ Ãe…l0Å Åà & ì0‡„ l0ù…Å`pÄ Älöÿ06ðôÿ4p 4÷ ®ðep ðÕ)ì‚wVþðµð¥Ã%÷ ^ † ,÷ P ÷ ÷ N‡÷ Vw"þ÷ , ‡÷ J†÷ ø‡B æƒàƒ#ƒÎà÷ î Î f÷ Ìÿ� ‡Â`‡ð¥öÿ*÷ wü±ðµ)0406 l0ì° ‡w ´ð*&fB÷ ~óI‡°B÷ èD‡É ÷ ?‡€÷ Ö5‡ñ  ÷ ,†ð¥æÿ*+ð*�1,\\1,^^pBBpDDpFFÁeB÷ ´‡€ÁeB÷ ª ð•Ðÿ*ð•Ïÿ*�€pœ**�€0 B1 Bww úw"ww è÷ $‡Ä0,0wf ÷ (†46÷ T ‡÷ ðµ)0406 0 ð‹*±‡&æf…Þ ƒ„…‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡ðµ82Áe&À(÷ Ô€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡0Š+æ1ÿˆÅ(Åe à ÷ �ß%ÿÿ&ïp’*wð÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ Ì¡ðµ)"ðÕ(.÷  ðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ l÷ ^ðÅ(.‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡&æ¦ff… Þ �‚ƒ„…‡ð‹*±‡ð*‡÷ L ‡f÷ 0�†&œ*÷ 2°•*±‡ÁeBÉ ð 8÷ .‡$&w Œÿð*ðµ<S1 ¦à Ö KÊ ñU€ò ñU@ò æ÷ n ƒ‚f&œ" ÷ ¼€�†‚×'&�ÿ)×'&ëÿð&* ðÊ*Ä%0þðÌ*±‡NDÅ Å ý¦æ÷ ~ƒ‚÷ ñEÿû±U‡÷  ‡÷ $ ‡÷ ê ‡141612Áepðµl2l0p‡÷ xþMÄw�ýÄ Ä Ä ðµf÷ Pþð >€5>õE€u ÷ Xý�‡ñ 00ùOJ3J§3eaek›’± ‡ðµðe6p 4÷ ‚†8÷ Xÿ±‡÷ È †81416÷ r÷ < ñÅ ÷ b ‡‡÷  ê†÷ ö ‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡w ¾ûÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w zû  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡w ²üÁ(DB‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±DÂ(Âe(¦„Äe$2ƒÃeäÿæÓÏÓ Ó(‹ÿˆ‡Ì%[]Ì%<> ƒ ÷ ^ „팂1 >‡ðµMðµ=ðÕf�Â(& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ðµ=&Îe0æ ÷ ´ûU• Â…à  ÂE•Õð >€ >ÍE€ðµ=ufÄ÷ ”úp†�ñ ± wŽûw nûBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=w*ûÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡w dú÷ ˆúðµ÷ ÷ nüwhú÷ – ‡÷ â ‡÷ Š ü‡,, ð ñ‚ð•öÿ*±îðµ)÷ ‡÷ àû‡÷ Èû‡÷ rðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ &‡f¦æ÷ à÷ ¨†ƒ‚„÷ ¶‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ ˜ú0ž8*wpùð 8ðµ ðµðµ ÷ Zù‡ðÖ*±‡ðÃ*±‡ƒ  �D„PÄ5Rà ý†R”‡R”R”à üø±ðµ=p!†Õ•^ú‡ð 8 ðµ ðµð �¡‡ð•Öÿ*±‡÷ Ôø÷ �ø 4 6Ååà ÷ :ø‡ðe6p 4‡ð&*‡&4&6ðµ=÷ š÷ ®ý‡°6°4÷  wzÄ%!°6°4ðµ=5÷ ‚ý2‡ ì6 ð � l0Á ü&°÷ Z°46÷ ‚°6°4‡÷ :ðµ)0406 0 ð *±‡ì0ðe6p 4÷‡÷ òþðµ=÷ Øÿ‡0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w T÷ Á�   ìì� .Â% ÷ ÷ ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ ö ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡8Áe2 ‡æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡ð*ðµ;ðµ7ðµ#3w Žõ *’$Ê ':æƒô �ô�…T•à ýƒñU@…Ê% D•ÄDÓÄ%][Ä%><wÌ÷  †w0ññ1 ‡Ã ÄÄ%ñ,ñ,ñññ:4Š× ±‡w Ôôð*DÅ Å ýæ¦Y…‚T¦fÃ(ÃeŠæ„ðµ<Ó•_‚ S•Ä ýó¥:ÿÿÓ•:‚ ƒ…¦æ& œ"& ΕæÏÿˆ‚4†×'&�ÿ ð&*×'&ëÿð¤ÿ*±*ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ ¸ ‡à ññ÷ ˆøð•Éÿ*‚ƒ‡w äóð*æ ƒ ‚æ¦×¢"wf)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷ ‡eÄ%w ñU\ñ5@ƒ âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ "ñ5@\ñU@ñ5€áÄ„íÄ ñ5LñUþ¥*ñUÄ Å‚öƒàÎàà Ê¥*Ã%C!.D`÷ ô*‡ƒ‚wòþÆeCÃ5€ñU‚Ã5 ±±± Ã5€± Ã5@±‡Æeð•Êÿ*±‡ðµ=õñU„Ä EÅe& ÷ RÄEÅe÷ Ö ¼Ó¥"Ý öŽwVþö Ë¥"  ƒ Ë¥"ö Õ”Ä Â Ä î ƒ  ê¶ Õ• Ä ü‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ šñU•Õ8UMw¦ðÅåà w:ñ÷ ®ðBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�wjñ46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ ñwððf&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡ðµ=D…÷ ÿ ‡ð`p4°6÷ jõ‡æf¦÷ Œï°6°4/‡ðµ=Á  ÷ èðÕ@)ð 0 Ö 8w4ñ÷ ~õƒ46÷ |ø‡8ñÕ ÷ ¬ñ°eð‹*wüôÖ ±‡÷ èï&f÷ …„‡D„ ÄEõµ/fCÃåŽ A ÷ ¸øƒB f& ÷  øB‚eA @0÷ ®øÁ („‚@0÷ œøa@ÂeA ‡ B0÷ „ø€ABÂå� ÷ nø¦f ÷ DøC�‚áÖ @ð•Òÿ*±‡Â(Âe(¦Ê ññ1 ÷ `£(£(£££‚÷ X†� ‚÷ >âââââ‚:ƒô �ô�‚””à ý¡Á5Á ±‡ÂeCÃe¡‡æ¦ƒ‚ÃåJ„”Ä¥[Ä¥<C…Å`¥ ¡>00ùWJt¹Jl1DATADATADATADATADATADATADATAC÷ ˆÒ¥,÷ ~… 4ÃB‚ƒ‚× *‚㨂 DÄe $ $ $ ÷ >‡ñz ñññ÷ pï‡DEÅe     ýð•Ìÿ*1 ±‚ƒ‡ Ë•0‹¤þ‹¨‡—¢3‚¥÷ "÷ Ä ‹¨ ¥Ë”Ó”¦æ£˜Ä ýƒ‚‡‹¢‡Ê¥7‡¥‡æ5æ±ÿˆ‡ß%& Ëw Jí&Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë å¥.‹ Ä ÅæU¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë ‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±û&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡TaÞ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡±‡w Fìðµ Á¥ðÅ)÷ Vì‡÷ ì ÕfU�Ä÷ ë…‡ðµÕ%  BA °`6p 4p`4¡ ¡õ%þÿð60 4‡ ;D$$DSK&DU$CHK ;PKW109O ;PKW10912 MOV R4,R0 ;PUT THE S.LHD QUEUE ON R0 ;PKW109= CALL @QINSB ;INSERT AT THE BEGINNING OF THE QUEUE ;GM112O/70$: POP ;RESTORE R3 AND R2 ;**-3R' BIC #C1.UMR,(R3) ;CLEAR THE UMR BITC;1; DEALLOCATE ANY UMR'S USEDD;D80$:, ADD #C.OLHD,R3 ;POINT TO THE .OLHD QUEUE" 90$: MOV (R3),R3 ;GET A PACKET! BEQ 100$ ;NONE LEFT/" BITB #IP.UMR,I.PRM+11(R3) ;IS IT USING UMRS?N# BEQ 90$ ;NO, CONTINUE.$ CLR R0 ;TELL ENDCM1 NOT TO FINISH THE I/O% PUSH ;SAVE R3V(& CALL ENDCM1 ;GO DEALLOCATE THE UMRS' POP ;RESTORE R3T( BR 90$ ;GO TRY ANOTHERE8,100$: MOV (R2),R3 ;/*Q.CST*/ ;RESTORE THE CST ;**-3-- DECB Q.RTY(R2) ;DECREMENT THE RETRY COUNT1.. BGT 110$ ;IF GT, WE STILL HAVE MORE TRIES.; ;PKW109K.; WE'VE EXHAUSTED OUR TIMEOUTS. CLEAN OUT THE QUEUES AND EXIT. ;PKW109N.; ;PKW1099. MOV (R2),R1 ;/*Q.CST*/ ;GET THE CST ADDRESS ;PKW109N.. CLR (R1) ;SET THE STATE OFFLINE ;PKW1098. ADD #C.OLHD,R1 ;POINTER TO THE C.OLHD QUEUE ;PKW109*. CALL FINIO ;FLUSH THE QUEUE ;PKW109.. MOV R4,R1 ;GET THE SCB ADDDRESS ;PKW1096. ADD #S.LHD,R1 ;POINTER TO THE S.LHD QUEUE ;PKW1098. JMP FINIO ;FLUSH THAT QUEUE TUEUE, AND EXIT ;PKW1090110$: ;**-141 MOVB #1,S.CTM(R4) ;SET A 1 SECOND TIME-OUT COUNT)2 ;RESYNCH WILL START FROM TIME-OUT.(3 TST S.BSYU(R4) ;IS THERE A BUSY UNIT4 BNE 120$ ;IF NE, YES )5 MOV R5,S.BSYU(R4) ;ELSE MAKE ONE BUSYI6 BISB #US.BSY,U.STS(R5)D7120$:N/8 ADD #C.OLHD,R3 ;POINTER TO THE C.OLHD QUEUE 69 MOV R3,R0 ;INSURE QUEUE ADDRESS SET UP FOR RSX-11M:-; .IF DF D$$DSK ;IF THIS IS THE DISK DRIVERH<;H,=; SEE IF WE'VE RE-TRYED THE OLDEST COMMAND>;T7? TST C.REDO-C.OLHD(R3) ;IS THE OLDEST CMD STILL HERE?1+@ BEQ 130$ ;IF EQ, NO, SKIP THIS SECTIONA;;B;C5C; IF WE HAVE ALREADY TRYED THE OLDEST COMMAND TWICEE0D; IT MUST BE 'FUNNY' SO COMPLETE IT AS IE.ABO.E;.;F CMP (R3),C.REDO-C.OLHD(R3) ;OLDEST AT LAST FAIL THE SAMEG ; AS OLDEST THIS TIME?H BNE 130$ ;IF NE, CONTINUE(I ;ELSE THE OLDEST HAS FAILED TWICE"J ; SO COMPLETE IT AS IE.ABOK MOV R3,R0 ;R0 IS THE QUEUE &L MOV (R0),R1 ;R1 IS THE OLDEST IOP=L CALL @QRMVA ;REMOVE THE OLDEST CMD FROM THE QUEUE ;GM1121&N ;R1 IS STILL IOP ADDRESS ;**-1/O MOV S.QST(R4),R2 ;R2,R3 DESTROYED BY $QRMVATP ;FOR ENDCOM:C,Q MOV I.UCB(R1),R5 ; R5 = THE UCB ADDRESSR ; R4 = THE SCB ADDRESS"S MOV R1,R3 ; R3 = IOP ADDRESST CLR R1 ; R1 = BYTE COUNT&U MOV #IE.ABO&377,R0 ; R0 = #IE.ABO V CALL ENDCM1 ;FINISH THE IOPW;EAX; ADD C.OLHD QUEUE TO C.REQU AND REMEMBER OLDEST FAILED COMMANDUY;Z2[130$: MOV (R2),R3 ;/*Q.CST*/ ;GET THE CST BACK8\ MOV C.OLHD(R3),C.REDO(R3) ;REMEMBER OLDEST FAILED CMD!] MOV R3,R0 ;PUT THE CST IN R0S-^ ADD #C.OLHD,R0 ;R0 POINTS TO C.OLHD QUEUE ._ TST (R0) ;IS THERE ANYTHING IN THE QUEUE? ` BEQ 150$ ;NO, JUST CONTINUE00t¿J3J§3eaek›’a MOV (R2),R1 ;/*Q.CST*/ 3b ADD #C.REQU,R1 ;R1 IS THE ADDRESS OF THE C.REQUM1c PUSH <(R1)> ;SAVE THE ADDRESS OF THE FIRST P .d BNE 140$ ;WAS THERE ANYTHING IN THE QUEUE4e MOV 2(R0),2(R1) ;NO, COPY THE LAST PACKET POINTE4f140$: MOV (R0),(R1) ;COPY THE POINTER FROM C.OLHD!g CLR (R0) ;QUEUE IS NOW EMPTYR2h PUSH <2(R0)> ;SAVE THE LAST PACKET IN THE C.O1i MOV R0,2(R0) ;FINISH SETTING UP THE EMPTY QUE.j POP ;GET BACK THE ADDRESS OF THE LAS*k POP <(R0)> ;FIRST IN QUEUE NOW ON ENDlAm150$: BIS #C1.REC!C1.R1!C1.R2,(R3) ;INDICATE WE ARE IN RECOVERYMn"o .IFF ;D$$DSK ;THIS IS FOR TAPEp/q MOV R0,R1 ;MOVE THE C.OLHD POINTER TO R1 FE0r CALL FINIO ;FINISH ALL I/O IN C.OLHD AS IE.ss .IFTF ;D$$DSK ;PKW109Ou ;**-1 9v PUSH <#SCUCB> ;PUSH ADDRESS OF COROUTINE TO SCAN UCBS w160$: CALL @(SP)+ ;GET A UCBx BCS 190$ ;NONE LEFTyy .IFT ;D$$DSK ;PKW109| ;**-2 ;} BIT #UU.RDY,U.UTIL(R5) ;WAS THE UNIT IN THE READY STATE?D!~ BEQ 180$ ;NOPE, KEEP LOOKINGR. BITB #US.OFL,U.ST2(R5) ;IS THE UNIT ONLINE?)€ BNE 180$ ;NO, THEN DON'T BRING IT UP,4‰ BISB #US.SPU,U.STS(R5) ;SET SPIN UP BIT ;**-8Š170$: ‹ .ENDC ;D$$DSKŒ?� .IIF DF T$$APE BISB #US.PWF,U.STS(R5) ;SET THE POWERFAIL BITP;�180$: BIC #^C,U.UTIL(R5) ;JJM350$4� CLR U.CNT(R5) ;U.CNT USED FOR RETRY COUNT ;**-1 � BR 160$ ;GO GET ANOTHER ONE‘190$: RETURN’“ .PAGE'” .SBTTL CLASUP - CLASS SET UP ROUTINEA•;+.—; - CLASUP - CLASS SET UP ROUTINE ;**-1˜;.@™; THIS ROUTINE WILL MAKE SURE THAT THE COMMON IS IN MEMORY AND;š; PROPERLY SET UP. THE FOLLOWING FUNCTIONS ARE PERFORMED:;›;3œ; 1. DETERMINE WHICH PORT THE CONTROLLER IS USINGB'�; 2. MAKE SURE THE PORT IS IN MEMORY.PAž; 3. IF PORT IS NOT PRESENT, TRY TO LOAD IT. IF THAT FAILS, THEC9Ÿ; DRIVER MUST BE DISABLED AND SEND MESSAGE VIA TKTN.$1 ; 4. IF PORT IS PRESENT, FILL IN S.PBIA IN SCB.E¡; 5. THE PORT MUST BES ¢; - FIXEDA£; - NON SHUFFLABLE#¤; - NON REMOVABLE (BUMP P.RMCT)¥; - NOT TOUCHABLEA¦;R §; INPUTS¨; ©; R4 = SCB ADDRESSª; R1 = VIRTUAL CIRCUIT IDG«;T ¬; OUTPUTSO­;;®; ALL REG ARE PRESERVED'¯; C=0 SUCCESS, COMMON LOADED PROPERLYM+°; C=1 FAILURE, COMMON NOT LOADED PROPERLYO#±; S.PBIA IN SCB WITH BIAS OF PORT ²;-´CLASUP: ;**-1#µ CALL SAVREG ;SAVE REGISTERS 0-3 0¶ MOV S.PORT(R4),RADNAM ;GET RAD50 NAME OF PORT%· MOV #RADNAM,R3 ;NAME TO SEARCH FOR 1· CALL @SRNAM ;SEARCH FOR PORT COMMON ;GM112O*¹ ;IF FOUND, R2 IS PCB ADDRESS ;**-1º BCS 20$ ;NO COMMON1» MOV R2,COMPCB ;SAVE PCB ADDRESS OF PORT COMMONG¼ MOV R2,R1 ;SAVE R2:À BIT #PS.OUT,P.STAT(R1) ;PORT COMMON IN MEMORY ? ;**-3Á BEQ 10$ ;YES0 MOVB #160.,P.PRI(R1) ;BRING IN COMMON QUICKLY2 CALL @LDREG ;BRING COMMON INTO MEMORY ;GM112.Ä MOV COMPCB,R1 ;RESTORE PCB ADDRESS ;**-10Å BR 20$ ;WE CAN'T WAIT FOR IT TO BE IN MEMORY<Æ10$: INCB P.RMCT(R1) ;BUMP RESIDENT MAPPED TASK TASK COUNT?Ç BIS #PS.CHK!PS.FXD!PS.NSF,P.STAT(R1);MAKE NON-CHECKPOINTABLE È ; FIXED IN MEMORYÉ ; NON-SHUFFLEABLEE.Ê BIS #P2.LMA,P.ST2(R1);DON'T TOUCH PARTITION=Ò MOV P.REL(R1),S.PBIA(R4);STORE BIAS OF PORT IN SCB ;**-71Ó CLC ;INDICATE NO ERROR(Ô RETURN ;SUCCESFUL RETURNÕBÕ20$: MOVB #IE.PNT,@SCERR ;INDICATE PARTITION NOT THERE ;PKW109$å SEC ;INDICATE FAILURE ;**-15 æ RETURNI .PAGE ;**-390 .SBTTL CLASYN - CLASS SYNCHRONIZATION ROUTINE;++; **-CLASYN-CLASS SYNCHRONIZATION ROUTINE;;NE; THIS ROUTINE IS CALLED BY THE PORT DRIVER FOR ONE OF TWO REASONS:HA; HARDWARE SYNCHRONIZATION HAS COMPLETED SUCESSFULLY OR HADWAREPE; SYNCHRONIZATION HAS FAILED. IF THE SYNCHRONIZATION WAS SUCESSFUL,AG; THE CLASS DRIVER MUST ISSUE AN OP.SCC IMMEDIATELY AND PUT ALL UNITSE; INTO THEIR KNOWN STATES.;; ; INPUTS:C;N; R2=ADDRESS OF QST5; R3=ADDRESS OF CST ; R4=ADDRESS OF SCBT; R5=ADDRESS OF UCBO;I! ; 00tÇJ¹Jl1DATADATADATADATADATADATADATAC=1 IF SYNCHRONIZATION FAILEDS#!; C=0 IF SYNCHRONIZATION SUCEEDED ";R #; OUTPUTS:$; %; R0-R1 ARE DESTROYEDF&; R2-R5 ARE PRESERVEDA';N(;- )CLASYN:C-* BCC 10$ ;IF CC, SYNCHRONIZATION SUCCEEDEDZ., JMP CLAERR ;JUMP TO ERROR ROUTINE ;**-1-;L4.; SUCESSFUL COMPLETION OF HARDWARE SYNCHRONIZATION/;N010$:91 CLR IOPSEQ ;RESET SEQUENCE NUMBER ON CONTROLLER SYNCH2 BIS #C1.SCC,(R3) ;SCC STATE$3 CALL PIOPAL ;ALLOCATE PSEUDO-IOP84 MOV #SCCFUN,R0 ;POINT TO TABLE ENTRY FOR SCC COMMANDS:5 CALL CMDCOM ;GET A (T)MSCP PKT AND FILL IN SOME FIELDS6 ;R1 IS ADD OF PKT0#7 CLR P.HTMO(R1) ;SET HOST TIMEOUTS58 CLR P.UNIT(R1) ;RESERVED FIELD. MUST BE ZERO!!!!!C69 MOV #CF.ATN!CF.MSC!CF.THS,P.CNTF(R1);SET HOST FLAGS-: ;ALLOW ATTENTION MESSAGES,MISCELLANEOUSO+; ;ERROR LOGS,AND THIS HOSTS ERROR LOGSC@< MOVB #10.,S.ITM(R4) ;TIMEOUT OF 10 SECONDS ON THE SCC COMMAND+= CALL CMDSEN ;SEND COMMAND TO CONTROLLERT>;U?; END PACKET PROCESSINGP@;T A; INPUTS: B; R1-PTR TO END PACKETB; ;GM102P?B MOVB P.CNTI+6(R1),Q.ID(R2) ;SAVE CONTROLLER MODEL ID ;GM102HB ;JJM350EB .IF DF,T$$APE ;JJM350 BB BIC #UU.BLK,U.UTIL(R5) ;ASSUME MULTI DENSITY DEVICE ;JJM350DB MOV #SNGDEN,R3 ;ADDRESS OF SPECIAL DRIVE/CONTROLLERS ;JJM3500B14$: TSTB (R3) ;END OF TABLE? ;JJM3501B BLT 17$ ;YES. USE THE DEFAULT ;JJM350ABB CMPB (R3)+,Q.ID(R2) ;IS IT A SPECIAL CONTROLLER? ;JJM3506B BNE 14$ ;NO. LOOK AT ANOTHER ENTRY ;JJM350DB BIS #UU.BLK,U.UTIL(R5) ;YES. MARK IT AS SINGLE DENSITY ;JJM350(B17$: ;REFERENCE LABEL ;JJM350B .ENDC ;T$$APE ;JJM3505B ;JJM350U;B MOV (R2),R3 ;/*Q.CST*/ GET THE CST ADDRESS BACK ;GM102N3D MOV P.STS(R1),R0 ;GET STATUS/EVENT CODE ;**-131E BIC #^C,R0 ;CLEAR ALL BUT STATUS/EVENT0!H BEQ 20$ ;IF EQ, YES ;**-2EI; J; SYNCHRONIZATION HAS FAILEDK; L SEC ;LOG ERRORN7M JMP CLAERR ;INDICATE ERROR. IF ANY RETRIES ARE LEFTR)N ;A RETRY WILL BE INITIATED FROM THE5O ;TIME-OUT ROUTINE P20$:6Q BIC #C1.SCC!C1.SYN,(R3) ;LEAVE FROM THE SCC AND SYN,R BIS #C1.RDY,(R3) ;AND GO TO THE RDY STATER ;PKW107 9R .IF DF D$$DSK&DUTMO ;IF PRE-DEFINED TIMEOUT ;PKW107R@R MOVB #DUTMO,S.ITM(R4) ;SET UP INITIAL TIMEOUT VALUE ;PKW107"R .IFF ;NORMAL CASE ;PKW107DR MOVB P.CTMO(R1),S.ITM(R4) ;SET-UP INITIAL TIME-OUT VALUE ;PKW107$R .ENDC ;D$$DSK&DUTMO ;PKW107V ;**-3A<W BIT #C1.CON,(R3) ;IS THIS A CON ON-LINE FOR THE CONTROLLEX BEQ 40$ ;IF EQ, NO&Y BIC #C1.CON,(R3) ;CLEAR OUT THE BITBY MOVB #IS.SUC&377,@SCERR;INDICATE SUCCESS OF CON ON_LINE ;GM112[ ;**-1 \(] MOV S.KRB(R4),R0 ;GET THE KRB ADDRESS'^ MOV K.OWN(R0),R0 ;THE THE OWNING UCBI4_ BIT #UU.SPC,U.UTIL(R0) ;IS IT THE SPECIAL ONLINE?&` BEQ 30$ ;NO, DO THE DELAYED RETURN7a BIC #UU.SPC,U.UTIL(R0) ;CLEAR THE SPECIAL ONLINE BIT7#b BR 40$ ;SKIP THE DELAYED RETURN7c4d30$: PUSH ;SAVE REGISTERS TO BE SAFE!e MOV S.KRB(R4),R2 ;GET KRB BACK$/f CALL @SAVSTK ;CALL EXEC ROUTINE TO INDICATEBg ;CON-ONLINE HAS FINISHED'h POP ;RESTORE REGISTERS0l40$: MOV P.CRF+2(R1),R3 ;ADD OF PIOP ;**-35m MOV #IS.SUC,R0 ;TELL ENDCOM TO DEALLOCATE THE PIOP+n PUSH <#0> ;PUSH BYTE COUNT - FOR ENDCOMO,o CALL ENDCMO ;PERFORM END PROCESSING CODE(p BIT #C1.REC,(R3) ;ARE WE IN RECOVERY?q BEQ 50$ ;NO, JUST RETURN2r MOVB #1,S.CTM(R4) ;SET A 1 SECOND TIMEOUT COUNT*s TST S.BSYU(R4) ;IS A UNIT ALREADY BUSY?t BNE 50$ ;YES, RETURN$u MOV R5,S.BSYU(R4) ;SET A BUSY UCB*v BISB #US.BSY,U.STS(R5) ;MARK IT AS BUSYv50$: RETURN ;PKW109IŠ .PAGE ;**-192=‹ .SBTTL CMDCOM - ALLOCATE AND FILL IN COMMON COMMAND PACKETTŒ;+9�; **-CMDCOM- ALLOCATE AND FILL IN COMMON COMMAND PACKETOŽ;A�; THIS ROUTINE ALLOCATES A COMMAND PACKET AND A RESPONSE PACKETE?�; FOR THE TMSCP/MSCP COMMAND ABOUT TO BE ISSUED. BEFORE THISR@‘; ROUTINE IS CLALED, PKTCHK MUST H00tÏJ3J§3eaek›’AVE BEEN CALLED TO DETERMINEB’; IS THERE ARE ENOUGH RESOURCES TO START THE TMSCP/MSCP I/O. TO=“; HAVE REACHED THIS POINT, SUFFICIENT RESOURCES MUST EXIST.R”; D•; ONCE THE COMMAND PACKET IS ALLOCATED, THIS ROUTINE FILLS IN SOMEC–; OF THE COMMON FIELDS FOR VARIOUS ROUTINES. THE COMMAND PACKET,I<—; WHEN FIRST ALLOCATED, IS ZEROED OUT BEGINNING AT TEXT+0.˜;M ™; INPUTS:Nš;E:›; R0=ADDRESS OF THE ENTRY IN THE FUNCTION DISPATCH TABLEœ; R2=ADDRESS OF QST�; R3=I/O PACKET ADDRESS ž; R4=ADDRESS OF SCBOŸ; R5=ADDRESS OF UCBE ;E ¡; OUTPUTS:¢;S£; R0=PRESERVED*¤; R1=ADDRESS OF COMMAND PACKET ALLOCATED¥; R2-R5 ARE PRESERVEDI¦;?§; THE FOLLOWING FIELDS ARE INITIALIZED IN THE COMMAND PACKET:SD¨; P.CRF = COMMAND REFERENCE (PART 1) SET TO I/O SEQ NUMBERA©; P.CRF+2 = COMMAND REFERENCE (PART 2) SET TO IOP ADDRESS+1ª; P.UNIT = UNIT NUMBER SET TO U.UNIT(R5) +«; P.OPCD = OPCODE SET TO FO.OP(R0)A!¬; REST OF PACKET ZEROED OUTD­;- ®CMDCOM:D.¯ PUSH ;SAVE POINTER TO DISPATCH ENTRY1° MOVB FO.SZ(R0),R0 ;GET SIZE OF COMMAND PACKET 4± CALLV PORT,PKTAC ;ALLOCATE/ZERO A COMMAND PACKET7² INC IOPSEQ ;UP THE SEQ NUMBER. WRAP AROUND TO ZERON9³ MOV IOPSEQ,P.CRF(R1) ;IOP SEQ NUM IS FIRST CREF NUMBERS7´ BIC #177760,P.CRF(R1) ;USE ONLY RIGHT MOST FOUR BITSC6µ BICB #017,I.PRM+11(R3) ;CLEAR OUT CRF IN I/O PACKETC¶ BISB P.CRF(R1),I.PRM+11(R3) ;STORE THE ACTUAL COMMAND REF NUMBER09· MOV R3,P.CRF+2(R1) ;IOP ADDRESS IS SECOND CREF NUMBERD¹ BISB U.UNIT(R5),P.UNIT(R1) ;UNIT NUMBER (OBVIOUSLY 255 MAX) ;**-1-º POP ;RESTORE DISPATCH ENTRY POINTER $» MOVB FO.OP(R0),P.OPCD(R1) ;OPCODE8Ç BIT #IQ.X,I.FCN(R3) ;INHIBIT ERROR RECOVERY? ;**-11È BEQ 10$ ;NO. :È BIS #MD.SER!MD.SEC,P.MOD(R1) ;INHIBIT IT THEN ;PKW105Ê10$: RETURN ;**-1TËÌ .PAGE-Í .SBTTL CMDDAT - PROCESS ALL DATA TRANSFERSÎ;+.Ï; **-CMDDAT- PROCESS DATA TRANSFER REQUESTS.Ð;NLÑ; THIS SECTION DOES ALL THE PROCESSING SPECIFIC TO DATA TRANSFER REQUESTS.JÒ; THERE ARE SEPARATE ENTRY POINTS FOR DIFFERENT FUNCTIONS. ANY SPECIFICOÓ; PROCESSING IS DONE AT EACH ENTRY POINT, AND THEN THEY ALL JOIN COMMON CODE.X=Ô; WHEN THE ROUTINE CMDSEN IS CALLED, THE PACKET IS SENT AND NÕ; CONTROL IS RETURNED TO CLACMD TO PROCESS ANOTHER I/O. WHEN THE END PACKETNÖ; IS RECEIVED, CONTROL IS RETURNED TO THIS ROUTINE IMMEDIATELY FOLLOWING THE×; CALL CMDSEN COMMAND.Ø;N Ù; INPUTS:.Ú;N&Û; R0 ADDRESS OF FUNCTION TABLE ENTRYÜ; R2 QST ADDRESSÝ; R3 I/O PACKET ADDRESSRÞ; R4 SCB ADDRESSß; R5 UCB ADDRESSà;C á; OUTPUTS:â;Cã; DATA TRANSFER I/O STARTEDHä; R2-R5 PRESERVEDNå; Cæ; FIRST CHECK FOR ANY ERROR CONDITIONS THAT WE CAN DETECT WITHOUTCDç; SENDING A COMMAND TO THE CONTROLLER. IF NO ERROR CONDITIONS ARE:è; FOUND, GET AN MSCP PACKET, FILL IT IN, AND SEND IT OFFé;Tê .IF DF D$$DSK ;IF DISKL ë .ENABL LSB ì íCMDWDD:M<î PUSH #MD.CMP!MD.ERR ;SET MODS TO WRITE DELETED DATA MARK-ï BR 10$ ;SKIP OVER PUSHING 0 ON THE STACK ðCMDWLB: ñ PUSH #0@ò10$: BIT #DV.SWL,U.CW1(R5) ;IS THE UNIT SOFTWARE WRITE LOCKED?ó BEQ 20$ ;NOPE, CONTINUE7ô MOV #IE.WLK&377,R0 ;SET UP WRITE LOCKED STATUS CODET"õ BR CMDERR ;AND FINISH THE I/O öCMDRLB:N ÷ PUSH #0Aø20$: BITB #IO.RPB&IO.WPB,I.FCN(R3) ;IS IT READ/WRITE PHYS. BLK?,6ù BNE 40$ ;YES, DON'T CHECK MAX LBN, AND SET MD.CMPù ;GM100Iù .IF NDF DU$CHK ;BLOCK CHECKING DONE IN DUCHK IF Q OPT ;GM100Tù ;GM100=ù PUSH ;SAVE FUNCTION TABLE ADDRESS AND QST ;GM10006ù MOV I.PRM+10(R3),R2 ;GET HIGH PART OF LBN ;GM1005ù MOV I.PRM+12(R3),R0 ;GET LOW PART OF LBN ;GM100R>ù MOV I.PRM+4(R3),R1 ;GET NUMBER OF BYTES TO TRANSFER ;GM100.ù ADD #777,R1 ;ROUND TO NEXT BLOCK ;GM1005ù ROR R1 ;CALCULATE #OF BLOCKS IN HIGH BYTE ;GM100(ù CLRB R1 ;CLEAR EXCESS BYTE ;GM1006ù SWAB R1 ;CALCULATE # OF BLOCKS IN TRANSFER ;GM1008ù ADD R1,R0 ;CALCULTE HIGHEST BLOCK NUMBER + 1 ;GM100ù ADCB R2 ; ;00t×J¹Jl1DATADATADATADATADATADATADATAGM10020ù BCS 25$ ;IF CS ILLEGAL BLOCK NUMBER ;GM1006ù CMPB R2,U.CW2(R5) ;HIGH PART OF LBN LEGAL? ;GM100 ù BHI 25$ ;IF HI NO ;GM100!ù BLO 30$ ;IF LO YES ;GM10045ù CMP R0,U.CW3(R5) ;LOW PART OF LBN LEGAL? ;GM100D)ù BLOS 30$ ;IF LO OR SAME YES ;GM100Fù25$: POP ;RESTORE QST AND FUNCTION TABLE ADDRESS ;GM1007ù MOV #IE.BLK&377,R0 ;SET UP THE STATUS CODE ;GM100K#ù BR CMDERR ;AND EXIT ;GM100;ù ;GM100Fù30$: POP ;RESTORE QST AND FUNCTION TABLE ADDRESS ;GM100ù ;GM100ù .ENDC ;DU$CHK ;GM100ù ;GM1001Cù BITB #IO.RLC&IO.WLC,I.FCN(R3);READ/WRITE CHECK FUNCTION? ;GM1000ù ;PKW10650ù .IF DF D$$WCK ;IF DISK WRITECHECK ;PKW106,ù BNE 40$ ;YES, SET THE CMP BIT ;PKW106Bù CMPB #IO.WLB/256.,I.FCN+1(R3);IS THIS A WRITE REQUEST? ;JJM3536ù BNE 50$ ;NO. DO NOT ATTEMPT TO SET MD.CMP ;JJM353Aù BITB #US.WCK,U.STS(R5) ;DOES UNIT HAVE CHECK ENABLED? ;PKW106,ù .ENDC ;D$$WCK ;PKW106Aù ;PKW106&ù BEQ 50$ ;NO, FORGET IT ;PKW106/ 40$: BIS #MD.CMP,(SP) ;SET THE BIT ;**-19.,50$: BIT #IQ.Q,I.FCN(R3) ;HOW ABOUT IQ.Q?! BEQ CMDDAT ;NOPE, KEEP GOINGF! BIS #MD.EXP,(SP) ;SET THE BIT;  BR CMDDAT  .DSABL LSBE .IFF ;D$$DSK - IF TAPE  CMDWLB:F* PUSH #MD.CSE ;CLEAR SERIOUS EXCEPTION; CMP I.PRM+4(R3),#14 ;ENOUGH BYTES FOR A WRITE FUNCTION?T BHIS 10$ ;IF HI YES/ MOV #IE.SPC,R0 ;SET UP BAD PARAMETERS ERRORW BR CMDERR ;AND EXIT?10$: BIT #M.SWL,U.CW2(R5) ;IS THE UNIT SOFTWARE WRITE LOCKED?D BEQ CMDDAT ;NOPE, CONTINUE.7  MOV #IE.WLK&377,R0 ;SET UP WRITE LOCKED STATUS CODEQ"! BR CMDERR ;AND FINISH THE I/O "CMDRLV:P5# PUSH #MD.REV!MD.CSE ;SET MODIFIER TO READ REVERSE.)$ BR CMDDAT ;CONTINUE WITH COMMON CODEP%9&CMDRLB: PUSH #MD.CSE ;CLEAR SERIOUS EXCEPTION ON READ )' BR CMDDAT ;CONTINUE WITH COMMON CODEI() .ENDC ;D$$DSK*&+CMDERR: TST (SP)+ ;CLEAR THE STACK, CALLR CMDXIT ;AND EXIT-0.CMDDAT: CALL CMDCOM ;GO GET A COMMAND PACKET/ BIS (SP)+,P.MOD(R1)0; 31; IF WE NEED UMRS, ALLOCATE THEM FOR THE TRANSFERI2;C35 BIT #DV.EXT,U.CW1(R5) ;DO WE NEED UMRS? ;**-2&6 BNE 50$ ;NOPE, SKIP ALL THIS STUFF6 ;PKW106E6 .IF DF M$$PRO ;PKW106T6 ;PKW106G6 BITB #IP.UMR,I.PRM+11(R3) ; HAVE WE ALREADY ALLOCATED BLOCK ;PKW106;'6 BEQ 5$ ;NO, THEN WE MUST ;PKW106;)6 MOV (R2),R0 ;POINT TO CST ;PKW106E:6 MOVB I.PRM(R3),R2 ;GET UMR WAIT BLOCK POINTER ;PKW106*6 ASL R2 ; MAKE A WORD OFFSET ;PKW106%6 ADD R2,R0 ;ADD TO CST ;PKW106A56 ADD #C.UMRW,R0 ;POINT TO UMR WAIT BLOCKS ;PKW106C+6 MOV (R0),R0 ;GET THE ADDRESS ;PKW106$76 DEC R0 ;LOW BIT FLAG WAS SET - ODD ADDRESS ;PKW106F=6 BR 32$ ;WE ALREADY HAVE BLOCK--GO PAST ALLOCATION ;PKW106M65$: ;PKW1066 .ENDC ;M$$PRO ;PKW106;6 ;PKW106N.7 PUSH ;SAVE THE COMMAND PACKET ADDRESS/8 MOV (R2),R1 ;/*Q.CST*/ ;GET THE CST ADDRESSA59 DEC C.UMCT(R1) ;DECREMENT THE UMR WAIT BLOCK COUNTF:: ADD #C.UMRW,R1 ;POINT TO THE BEGINNING OF THE WAIT BLOC6; MOV #-1,R2 ;SET COUNTER TO -1 BECAUSE WE INCREMENT+<10$: INC R2 ;INCREMENT THE INDEX COUNTERD$= TST (R1) ;IS THERE A BLOCK HERE?'> BEQ 20$ ;IF EQ NO, ALLOCATE ANOTHERV%? BIT #1,(R1)+ ;IS THE BLOCK IN USE?@ BNE 10$ ;YES, TRY ANOTHER;#A MOV -(R1),R0 ;GET THE WAIT BLOCKPB BR 30$ ;GO TO COMMON CODE <C20$: PUSH ;SAVE THE TABLE ADDRESS AND BLOCK INDEX5C MOV #UMRWTB,R1 ;SET LENGTH OF CORE BLOCK ;PKW106L+C CALL @ALOCB ;GET A WAIT BLOCK ;GM112E>F POP ;RESTORE THE BLOCK INDEX AND TABLE ADDRE ;**-2&F BCC 25$ ;WE GOT ONE,OK ;PKW109,F MOV S.QST(R4),R2 ;GET THE QST ;PKW1091F MOV (R2),R1 ;/*Q.CST*/ GET THE CST ;PKW109THF INC C.UMCT(R1) ;WE'RE NOT GOING TO USE A WAIT BLOCK AFTER ALL ;PKW109/F POP ;GET BACK COMMAND PACKET ;PKW10909F MOV #IE.NDR&377,R0 ; SET NO DYNAMIC MEMORY ;PKW109EF CLR R1 ;00tßJ3J§3eaek›’ ;PKW109@F JMP @IOFIN ;COMPLETE I/O WITH NO DYNAMIC MEMORY ERROR ;GM112F ;PKW109 JF25$: .IIF DF M$$PRO MOV S.URM(R4),(R0)+ ; PUT IN UNIBUS RUN MASK ;PKW1097G MOV R0,(R1) ;PUT THE NEW BLOCK ADDRESS IN THE TABLER/H30$: INC (R1) ;SHOW THAT THE BLOCK IS IN USEC)I POP ;GET BACK THE COMMAND PACKET(EI MOVB R2,I.PRM(R3) ;SAVE UMR WAIT BLOCK INDEX IN I/O PACKET ;PKW106 MI BISB #IP.UMR,I.PRM+11(R3) ;MARK THE I/O AS HAVING A UMR WAIT BLOCK ;PKW106EKI32$: MOV I.PRM(R3),U.BUF(R5) ;SET UP FOR UMR ASSIGNMENT BLOCK .. ;PKW106TEK MOV I.PRM+2(R3),U.BUF+2(R5) ;... PROCESSING OF BUFFER ADDRE ;**-1M1L MOV I.PRM+4(R3),U.CNT(R5) ;... AND BYTE COUNT;*O MOV S.QST(R4),R2 ;GET THE QST ;**-2'P MOV (R2),R2 ;/*Q.CST*/ ;NOW THE CSTH7Q BIS #C1.UMR,(R2) ;SHOW THAT WE ARE WAITING FOR A UMRC8R MOV R0,R2 ;... AND COPY UMR WAIT BLOCK POINTER TO R20R CALL @STMP1 ;SET UP UNIBUS MAPPING ;GM112DR MOV S.PBIA(R4),@KISR6 ;MAKE SURE THE PORT IS STILL MAPPED ;GM112?R MOV S.PBIA(R4),@#KINAR6 ;KERNAL INSTRUCTION SPACE ;PKW109T,R MOV S.QST(R4),R0 ;GET THE QST ;PKW1060W MOV (R0),R0 ;/*Q.CST*/ ;NOW THE CST ;**-4.X BIC #C1.UMR,(R0) ;CLR UMR MAPPING INTERLOCK.Y ADD #10,R2 ;OFFSET TO UMR ASSIGNMENT BLOCK5Z MOV R2,R0 ;ASSIGNMENT BLOCK WHERE $MPUB1 WANTS ITR=[ PUSH ;SAVE R1 AND POINTER TO UMR ASSIGNMENT BLOCKK1[ CALL @MPUB1 ;MAP UNIBUS TO TRANSFER ;GM112IE] POP ;RESTORE POINTER TO UMR ASSIGNMENT BLOCK AND R1 ;**-1P*^ MOV S.QST(R4),R2 ;GET THE QST BACK ALSO<b50$: MOV I.PRM+2(R3),P.BUFF(R1) ;BUFFER DESCRIPTOR ;**-3*c MOV I.PRM+4(R3),P.BCNT(R1) ;BYTE COUNT2d MOVB I.PRM+10(R3),P.LBN+2(R1) ;HIGH BYTE OF LBN/e MOV I.PRM+12(R3),P.LBN(R1) ;LOW WORD OF LBN :i MOVB I.PRM+1(R3),P.BUFF+2(R1) ;BUFFER DESCRIPTOR ;**-35j BIT #DV.EXT,U.CW1(R5) ;EXTENDED MEMORY SUPPORTED?U-k BNE 60$ ;YES, NO MANIPULATION NECESSARYU)l MOV M.UMVL(R0),P.BUFF(R1) ;LO 16 BITSR-m MOVB M.UMVH(R0),P.BUFF+2(R1) ;HIGH 2 BITS*3u ASR P.BUFF+2(R1) ;SHIFT BITS 4:5 TO 0:1 ;**-70v ASR P.BUFF+2(R1) ;...w ASR P.BUFF+2(R1) ;...x ASR P.BUFF+2(R1) ;...3y BIC #^C<3>,P.BUFF+2(R1) ;CLEAR ALL BUT BITS 0:1I)z60$: PUSH <#CLACMD> ;RETURN TO CLACMD1&{ CALL CMDSEN ;SEND OFF THE PACKET|;U(}; RETURN TO THIS POINT WITH END PACKETM~; REGISTERS ARE THE SAME EXCEPT THAT R1 CONTAINS AN END PACKET INSTEAD OF AL; COMMAND PACKET€;MO�; NOW WE WILL FIND OUT HOW THE COMMAND FINISHED AND PUT THE STATUS CODE IN R0*‚; FOR ENDCOMƒ; „ .IF DF D$$DSK ;IF DISK-…5† CALL ENDERR ;TRANSLATE MSCP ERROR INTO RSX ERROR/‡ BITB #EF.BBR,P.FLGS(R1) ;BAD BLOCK REPORTED?2ˆ BEQ 80$ ;NOPE‰; HŠ; WE'VE FOUND A BAD BLOCK. IF RCT IS NOT INSTALLED OR NOT APPLICABLE,G‹; WE JUST RETURN IE.BBE, BAD BLOCK ERROR. IF WE CAN USE RCT, THEN WETEŒ; REQUEST IT TO RUN, AND PUT THE I/O PACKET IN THE BAD BLOCK QUEUE.K�; RCT WILL REPLACE THE BLOCK AND THEN RETURN THE IOP TO US TO BE REISSUED Ž; (SEE CMDTRM)�;R� CALL RQRCT ;GO REQUEST RCTD7‘ BCS 80$ ;IF CS, DON'T PUT THE I/O IN THE BBK QUEUEP’;R<“; PUT THE I/O PACKET IN THE BAD BLOCK QUEUE AND SET UU.RCT”;6• PUSH ;SAVE THE IOP AND SHOW NO BYTE COUNT+– CLR R0 ;INDICATE NOT TO FINISH THE I/O%— CALL ENDCMO ;GO CLEAN UP THE I/OR,— MOV (SP),R1 ;GET THE IOP BACK ;PKW109— PUSH ;PKW109M— .IIF DF D$$DSK&DU$CHK CALL REQUE ;RECONVERT THE LBN FOR QUEUE OPT. ;PKW109P4™ MOV R5,R0 ;PUT UCB WHERE $QINSF WANTS IT ;**-11š ADD #U.BPKT,R0 ;ADD OFFSET TO BAD BLOCK QUEUEN6š CALL @QINSF ;PUT IT IN THE QUEUE AND EXIT ;GM112)� POP ;RESTORE THEM ;**-2T ž RETURNPŸ;Ÿ80$: PUSH P.BCNT(R1) ;SET BYTE COUNT FOR ENDCOM ;PKW109IŸ ;PKW109   .IFF ;D$$DSK - IF TAPEO¡%¢ MOV P.STS(R1),R0 ;GET STATUS CODEH-£ BIC #^C,R0 ;CLEAR UNEEDED PORTIONK¤ CMP #ST.SUC,R0 ;SUCCESSFUL?L&¥ BNE 70$ ;NO. DON'T RESET ANYTHING@¦ BIC #M.BOT!M.PEOV!M.RWD!M.SER!M.TMK!M.EOT,U.CW2(R5) ;DEFAULTS#§ ;ENDERR WILL DE00tçJ¹Jl1DATADATADATADATADATADATADATATECT BOT, EOT ¨70$:5© CALL ENDERR ;SET UP STATUS TO RETURN TO THE USERG*ª CMP #IS.SUC&377,R0 ;WAS IT SUCCESSFUL?« BNE 80$ ;NO.<¬ BIC #M.AEOV,U.CW2(R5) ;NO LONGER AT LOGICAL EOT (TMK/TMK)<­80$: PUSH ;USE ACTUAL TAPE RECORD BYTE COUNT)® ;THIS IS TO MAINTAIN COMPATABILITY#"¯ ;WITH ALL OTHER RSX DRIVERS² .ENDC ;D$$DSK ;**-2F³!´ CALLR ENDCOM ;FINISH THE I/OTµ¶ .PAGE¶ .IF DF,T$$APE ;JJM304B· .SBTTL CMDEOF - PROCESS ROUTINE FOR IO.ERS, IO.EOF, AND IO.DSEº;+ ;**-2;8»; **-CMDEOF-PROCESS ROUTINE FOR IO.EOF, IO.ERS, IO.DSE¼;A@½; THIS ROUTINE ISSUES THE TMSCP REQUEST FOR IO.EOF (WRITE TAPE@¾; MARK), FOR IO.ERS (WRITE EXTENDED RECORD GAP) AND FOR IO.DSEC¿; (ERASE TO END OF TAPE). IF THE DRIVE IS SOFTWARE WRITE LOCKED,TCÀ; THE COMMAND IS NOT ISSUED AND AN ERROR IS RETURNED TO THE USER,F$Á; OTHERWISE THE COMMAND IS ISSUED.Â;CÃ; NOTE: FOR EACH OF THESE FUNCTIONS, THE CURRENT TAPE POSITION ISSBÄ; USED. FOR IO.DSE, THE TAPE IS REPOSITIONED TO BOT AFTER%Å; ERASING TO THE END OF TAPE.OÆ; Ç; INPUTS:È;H&É; R0=ADDRESS OF FUNCTION TABLE ENTRYÊ; R2=ADDRESS OF QST Ë; R3=I/O PACKET ADDRESSTÌ; R4=ADDRESS OF SCBOÍ; R5=ADDRESS OF UCB <Î; U.CW2(R5), M.SWL = FLAG INDICATING SOFTWARE WRITE LOCKEDÏ;M Ð; OUTPUTS:Ñ;NÒ; R0=STATUS CODE,Ó; R1=STATUS INFORMATION (RETURNED AS ZERO)Ô; R2-R5 ARE PRESERVED Õ;- ÖCMDEOF::7× BIT #M.SWL,U.CW2(R5) ;IS UNIT SOFTWARE WRITE LOCKED? %Ø BEQ 10$ ;NO. GO SEND THE COMMANDO0Ù MOV #IE.WLK&377,R0 ;WRITE LOCKED STATUS CODE$Ú CALLR CMDXIT ;COMMON ERROR EXIT8Ú10$: BITB #US.MNT,U.STS(R5) ;IS IT MOUNTED? ;PKW1093ß BEQ 20$ ;YES. OK TO DO THIS TYPE OF CMD ;**-454à MOV #IE.PRI&377,R0 ;ERROR. TAPE MUST BE MOUNTED$á CALLR CMDXIT ;COMMON ERROR EXIT=á20$: CALL CMDCOM ;BUILD A SKELETON COMMAND PACKET ;PKW109T<æ BIS #MD.CSE,P.MOD(R1) ;SET 'CLR SER EXCEPTION' NO. ;**-4"ç PUSH <#CLACMD> ;RETURN ADDRESS#è CALL CMDSEN ;ISSUE THE COMMAND é;NHê; END PACKET PROCESSING. CONTROL RETURNS HERE WHEN THE END PACKET FORIë; THIS COMMAND IS RECEIVED. AT THIS POINT, THE I/O IS EFFECTIVELY DONE Gì; SO IT IS NECESSARY TO SET UP THE RETURN STATUS FOR THE USER, RETURN#9í; IT TO THEM, AND THEN CLEANUP FROM THE MSCP/TMSCP I/O.Iî;C5ï CALL ENDERR ;SET UP STATUS TO RETURN TO THE USERN3ð CMP R0,#IS.SUC&377 ;WAS THE COMMAND SUCCESSFUL?E$ñ BNE 30$ ;NO. LEAVE STATES ALONEGò BIC #M.TMK!M.AEOV!M.BOT!M.RWD!M.SER!M.PEOV,U.CW2(R5) ;INDICATE STATENó30$:3ô PUSH <#0> ;NO ADDITIONAL INFORMATION AVAILABLEN3õ CALLR ENDCOM ;CLEANUP FOLLOWING I/O COMPLETIONPö÷ .ENDC ;T$$APEI÷ .PAGE ;GM102N÷ .IF DF D$$DSK ;GM102&÷ .SBTTL CMDFMT - FORMAT ;GM102÷;+ ;GM102<÷; **-CMDFMT-PROCESS ROUTINE FOR IO.SMD (FORMAT) ;GM102÷; ;GM102EI÷; THIS ROUTINE WILL PROCESS THE IO.SMD FUNCTION FOR DISKS THAT ;GM102 %÷; SUPPORT FORMATTING. ;GM102V÷; ;GM102PL÷; BEFORE ISSUING THE FORMAT COMMAND IT ISSUES AVL COMMAND TO BRING ;GM102K÷; THE UNIT TO UNIT AVAILABLE STATE AND AFTER FORMATING BRINGS THE ;GM102..÷; THE UNIT BACK TO ONLINE STATE. ;GM102÷; ;GM1021÷; ;GM102-÷; INPUTS: ;GM102÷; ;GM102*;÷; R0=ADDRESS OF THE FUNCTION TABLE ENTRY ;GM102 "÷; R2=ADDRESS OF QST ;GM102&÷; R3=ADDRESS OF I/O PKT ;GM102"÷; R4=ADDRESS OF SCB ;GM102"÷; R5=ADDRESS OF UCB ;GM102÷; ;GM102I÷; OUTPUTS: ;GM102E÷; ;GM102G#÷; R0=RSX STATUS CODE ;GM102B÷; ;GM102R÷; ;GM102MF÷CMDFMT: BITB #US.FOR,U.STS(R5) ;IS THE DISK MOUNTED FOREIGN? ;GM102(÷ BNE 2$ ;YES, THEN CONTINUE ;GM102<÷ MOV #IE.PRI&377,R0 ;NO, THEN PRIVILEGE VIOLATION ;GM102#÷ BR 5$ ;GO FINISH I/O ;GM102 @÷2$: BIT #M.SWL,U.CW2(R5) ;IS THE UNIT SFT WRITE LOCKED ;GM102(÷ BEQ 10$ ;EQ, THEN CONTINUE ;GM1026÷ MOV #IE.WLK&377,R0 ;SET WRITE LOCK ST00tïJý"K§3eaek›’ATUS ;GM102-÷5$: CALLR CMDXIT ;GO FINISH I/O ;GM102MC÷10$: CMPB #RQDX3,Q.ID(R2) ;IS IT AN RQDX3 CONTROLLER? ;GM102 )÷ BEQ 20$ ;YES, THEN CONTINUE ;GM102S3÷ CALLR ILEGAL ;NO, THEN IT IS ILEGAL ;GM1022;÷20$: BIS #UU.SER,U.UTIL(R5) ;SET THE SERIAL MODE ;GM102,,÷ MOV Q.CST(R2),R0 ;GET THE CST ;GM1027÷ MOV R3,C.EXTN(R0) ;SAVE THE I/O PKT ADDRESS ;GM102 4÷ CALL PIOPAL ;GET A PIOP FOR AVL CMD ;GM1026÷ MOV #AVNFUN,R0 ;FUNCTION CODE ENTRY TO USE ;GM1022÷ CALL CMDCOM ;BUILD THE COMMAND PACKET ;GM102:÷ BIS #MD.EXC,P.MOD(R1) ;SET THE EXCLUSIVE ACCESS ;GM1022÷ PUSH <#CLACMD> ;ADDRESS TO RETURN TO ;GM102,÷ CALL CMDSEN ;ISSUE THE COMMAND ;GM1022÷ MOV #IS.SUC,R0 ;NON ZERO STATUS TO R0 ;GM102+÷ PUSH <#0> ;NO STATUS FOR IOSB ;GM102Q&÷ CALL ENDCMO ;FINISH UP ;GM102+÷ MOV Q.CST(R2),R0 ;GET THE CST ;GM102S3÷ MOV C.EXTN(R0),R3 ;RESTORE IOP ADDRESS ;GM102D6÷ MOV #FMTFUN,R0 ;FUNCTION CODE ENTRY TO USE ;GM1022÷ CALL CMDCOM ;BUILD THE COMMAND PACKET ;GM102E÷ MOV I.PRM(R3),P.FMTI+2(R1) ;FILL THE FIRST 2 BYTES OF INFO ;GM102E÷ MOV I.PRM+2(R3),P.FMTI(R1) ;FILL THE SECOND 2 BYTES OF INFO;GM102S-÷ PUSH <#CLACMD> ;RETURN TO CLACMD ;GM102N.÷ CALL CMDSEN ;SEND OFF THE PACKET ;GM102÷; ;GM10204÷; RETURN TO THIS POINT WITH END PACKET ;GM102I÷; REGISTERS ARE THE SAME EXCEPT THAT R1 CONTAINS AN END PACKET ;GM102R-÷; INSTEAD OF A COMMAND PACKET. ;GM102E÷; ;GM102I÷; FIND OUT HOW THE COMMAND FINISHED AND PUT THE STATUS CODE IN ;GM102+7÷; R0 FOR ENDCOM AND BRING THE UNIT ONLINE. ;GM102P÷; ;GM102;<÷ CALL ENDERR ;TRANSLATE MSCP STATUS TO RSX STATUS ;GM102,÷ CMP #IS.SUC,R0 ;IS IT A SUCCESS ;GM1024÷ BEQ 40$ ;YES THEN BRING THE UNIT ONLINE ;GM1022÷ PUSH ;NEED TO USE R1, SO SAVE IT ;GM102.÷ MOV P.STS(R1),R1 ;GET THE STATUS ;GM1028÷ BIC #^C,R1 ;ISOLATE THE MAJOR STATUS ;GM1020÷ CMP #ST.DRV,R1 ;IS IT A DRIVE ERROR ;GM102$÷ BNE 30$ ;NO, CONTINUE ;GM102?÷ MOV #IE.ABO,R0 ;YES, THEN INDICATE FORMAT INCOMPLETE ;GM102L5÷30$: POP ;RESTORE END PACKET ADDRESS ;GM102 9÷ BIC #UU.SER,U.UTIL(R5) ;CLEAR THE SERIAL MODE ;GM102C(÷ PUSH <#0> ;NIL BYTE COUNT ;GM102)÷ CALLR ENDCOM ;FINISH IT UP ;GM102-÷40$: PUSH <#0> ;NIL BYTE COUNT ;GM1021%÷ CALL ENDCMO ;FINISH UP ;GM102S>÷ BIS #UU.ONL,U.UTIL(R5) ;INDICATE AN OP.ONL REQUIRED ;GM1023÷ CALLR ONLSIO ;ISSUE THE ONLINE COMMAND ;GM1132÷ .ENDC ;D$$DSK ;GM102÷ .PAGE ;GM102 ÷ .IF DF,D$$DSK ;JJM304P5ù .SBTTL CMDRPL - RCT BAD BLOCK REPLACEMENT ;**-1Rü;+ ;**-2#1ý; **-CMDRPL- PROCESS BLOCK REPLACEMENT REQUESTSþ;S6ÿ; THIS ROUTINE PROCESSES BLOCK REPLACEMENT REQUESTS.; ; INPUTS:0;+; R0 ADDRESS OF FUNCTION TABLE ENTRY; R2 QST ADDRESSU; R3 I/O PACKET ADDRESS; R4 SCB ADDRESSN; R5 UCB ADDRESSL;L ; OUTPUTS: ;L ;- CMDRPL:18x|³–, ¿ô¿ôSS W <F¤/TITISYSYOV00ý$K¹Jl1DATADATADATADATADATADATADATAvÁXÀøF¤v¢R²±š²tXÀÁXÀ %N%R -- Invalid device%N %N%R -- Volume not mounted properly%N%N%R -- Bad volume type%N¦ & Àz¢ððN ðJ &ÿˆ†×-]ÿÿùrþˆ$£ÿ ÁwFD ‡À> 0 ú7. ÷ ˜ðµ Zð5@YÎ @Àz¢ððê ðæ &ÿˆ†×-¶\ÿÿù>þˆŒ£ÿ¢žÁžwJÞ ‡ÀØ 0 ú7È ðµ (÷ (Á¶ p¬ #p, A1,Ö ‡�ðµ@ ðµ ð5¡IÀ‚¢À�¢ÀÅ¢Ö ±‡K<®©¤r*$&R%N%R -- Send/Receive error%Næ¤ÿˆ÷ Ì ÷ è æ¤ÿˆ †÷%øÿÄ[÷%ÿÿ¼[ô÷ ¢ ‡÷%Æ ÷ ¾÷ –÷ ÊûÀ&¤÷ ˜ ÿ(8®8$¯pï Ê®N© ʮڤö6¬%N%R -- System error%N%N%R -- Too many bad blocks. Volume cannot be shadowed.%NÀà®ÐþÁü ÷ Е:Àåà®7x Àj®ð"ðBðDð•#÷ ¸ h‡À¤÷ äc‡Àj®÷ ´ ^‡À6¬ŠÁÁ @`ð W7œ 7Š�7 ˜Àe 7Ž÷ ÆÀj®ðBðDð•#÷ Z 9‡Àª¤÷ †4‡÷�gôþ÷dìþÄR©×-äþ~‚ÄÜþ¡D D ÄeR©7(ÿ7$ÿ7 ø7 ö° p · ¶þ÷-²þ®þ÷ 2 ‡÷ Î÷ êî†Àj®÷ ø‡Àä¤Àý¤÷ Ðÿ(8®8$¯p‡&ÿˆ†÷%ÿÿ°Yù×­L±‡÷ žÂ¾ÀeÉ 1! †qqÁåw �ðñ1›~‡ €Ê®¤´%N%R -- I/O error on logical block %T.%N%N%R -- Catch-up completed%N÷ øÄN©ÅȦõ÷œÿõ õÆõÂ#ÿÿ\Ì¥ÿ õeu‹õô¥ÿõ÷XÿÀ¾’Aí‚ Bí6Â>ÿBà2‡1Á ÷ œƒ õ`u ÁxýÃvýCí� Aí7à 5œƒàð��°`H‹÷eXœ Á wàþWpu¿÷ Ò†÷ X÷eúw øþˆ2¨Àòðe p‹ ‡Ô !N«wÿ¡‡÷ À §÷ P±‡þˆj¨À¾Ápœ p ‡A rõ÷ ^‡µ u H~‡Àâ¦÷ ÷ pó÷ †÷ †ÿ(8®ÿȦ8$¯p‡&fWpu÷ ‡µcu ÷ ’ÿ�€‡fÿˆ†÷%ÿÿ:Wù÷%Ô±‡©&æÿˆæ3ÿˆ&æ¦f&¦ v Þ €�‚ƒ„…‡ ”« Ô®[0,0]à®ή×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ œ@´&´ÿ ”4´µÿ Œ4´¢µÿ „4´Âµÿ |4´Ô½ÿ tX´¤½ÿ lX´Âÿ dˆ´¤½¦Þ5Îe‡w ªÁ,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡wù è00ý,K"K§3eaek›’¢¯±±ÿÿÿÿX²Ê5¦ „Ê €‚Ê5ùà ÷ƒõ…2Å Å ÍUEÍ ø�‚‡(´ì® ²²X²L¯&´‡ÊEò ÊU ‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w Z…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ XW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&æf…Þ ƒ„…‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&æ¦ff… Þ �‚ƒ„…‡‡  ¤4´(´ �¤´( (´@´Ф´@(´L´�¤´ X´(´”´�¤½L´d´�¤½pp´L´ˆ´�À|d´|´ �À8d´p´"�¤½L´X´$�¤´¨(´4´ %N%R -- No room available for UMB%N%N%R -- Volume currently part of shadowed pair%N÷ âíD‡À\ùð =ÀTùð 8þˆ0µÁÿ ôî7 Ôÿ7êó‡w Êÿ'‡ÀÞóÁ B~þˆ€µÀÎóÁùÂùðÎî?Èî1 p2 °0 0 ÿ5¢î²þÿ¡‡À¤´ÀÊ´÷ Bÿ(8®8µp±‡Áx÷ twŠø÷‚ø÷R«–õ÷’«Ôõ‡À¬ð° p&ÿˆ‡÷<ö÷4öæ¬ÿˆ‡ABDEFIMNOPRSTUXYZ<>»¶Î¶Ü¶î¶·/·ú·ô¶E·V·\·€·‰··ú¶–·à·ì·#·;·w �ý&æ`w „ý& & &f„& …—¤ Â¥%“�÷ °ö¤ô ŠÀÁÖ �å–%B‡&Ð¥VA÷ À ÀCƒ Â2¯ïµ…~Œ  ¦¶Ž ‡AÎ Þ Ö ÉЕ%Œü¥Vå ‡Ã P”Â~‡Ð• B”f�‚÷ hü�Ê~‡æŸY:æœY7æœÙ4æ%\1H”ÈÅ€¢ ¢È• € Í~‡÷ `Š€‡Ð• ÷ æÅ~‡Ð‹Ã~À ‡÷ ԇЕ Е È~‡æ¥Yæ¢ÙЕ A¦ N  Þ É~– ‡æœYõA÷ XÄ~‡Ð• Ã~‡Ð• Aæ÷ >AÎ ûÖ Â ÷ "Е.÷ &Â÷ AЕ; ÷ Xûß~‡Â ýð¥ ÿÿùÀ øAá ÷ E‡Aá Â÷ .E‡Á ¦¶6L‡¡ô  -‚�àü ±‡QIOQI/OHRC...I/OCSRw rûÄ'Å  ÅUD$†BA÷ (&�Â(÷ ÅU� ÀBQ÷ ÒúÂЕ* ü‡Â Âw û ”Å¥ üÅ¥ ùÅå0B¡†€÷ ûAa”ôœÿÿ‡÷ &÷ &÷ �’•’•€‡@Á(÷ êúf€  Àe ÀeÉÿÀe Àe ‡·kµz?TLBOÀPÀzLB x»I/O Error Code %D.QI/O Error Code %D.¦B Á$¹÷ 8†&Á|»— €Âå€Á�» ¦‚÷ fúÖ �å‚÷%Vò÷Nò‡w Ò÷Ärý& æLB&æÿˆa‡ñ  ÄB¹Ì ÷ ÈW‡111É D÷ °K‡÷ .ý÷ ¸Mõ€÷ ¾?‡„Ä ¡ „ „ „ ÷ý÷ ’Õx¹ÕU% ÷ ” ÷ìü÷ vM÷ ‚!‡D ‡…Å ÅEøÿÅ… … Åex¹Ä@P•Ä üÀ Áà İü& æSY&æÿˆ † Äšü& æSY&æÿˆ±‡÷ €ü÷ 5 ÷ ‡Åx¹æ% Î ýÖ ‡æ`¹ÿˆ ‡æXüæ)ÿˆ÷‹`þ±‡Æå €&æ?ÿˆ,-fW >5‡W E5ƒW ¾s‡W Ås ƒW !€ ‡W 8€ƒW >€‡W E€‚�W ¡Œ ‡W ¸ŒøƒW ¾Œ‡W ÅŒòƒÖ $|³Æe ‡w röÂv¢�$Ò üÁ%ÿ±Âº¿÷  ÷ ‚õЕ.‚÷ ¡‡�”þÀ ‡÷ Pë€Àe&…Ähí„ ÄEC@ÀEøÁ� � � ÁEñÿG` ?L`_Ë �Tè�ã÷ ÄTâ÷ ¼@T”~Ë Û�× Ä%’«ü‚÷ ¤ñ‹ ÀæïÀEøÿ@¢w’ÚïwœÕïÁeÂR«À”«Ã„DÄè¾÷ ®÷Á ”«Ì ÄR«°&æ=ÿˆË €Á’00ý4K¹Jl1DATADATADATADATADATADATADATAC~`¢÷ <À6¬÷ Üþ †Á €A�Áå€A�÷ ØüŠ÷ 8�7xìvÖ ÷¥Rﱇ Ë5AÀ‹�€a@@`‡&f¦æ&fÀ6¬ Ћ� üÀ6¬&Á È¥ È¥ Á € õÖ …„ƒ‚�€‡ DÄ Ë¥ †‚ ƒ Ä ÷Ã0¸“ Äœÿÿa …æÔ¤Å üÖ ƒƒ`Ë‹í„Ä Ë¥A‚Ë¥Z‡Î ËÕ ƒ Ä ñ€`�à¸UNKNOWN ERROR CODE =JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw ÈóD…&&÷ bЕ-�Î �eÁaÁe»ÿP”P”P”Е-�$w ˜óDÅ… ƒ÷ &Е.À À À ce÷ žóÀ …Е:÷ Å ù Â÷ ¬òB‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡Çq”½Ô½õPsÇqÔ½º¿ýØwÿ þX´4Áÿ üýX´äÁÿ ôýX´Âÿ ìýX´˜Âÿ äýd´¼½w :ÿÁ(ñ D÷ Ôÿð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwnÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)÷ Lÿ ‡÷ Lñ \ðµ#÷ dU†&œ* ðµ=ð¥æ•Øÿwô Å`p!2üƒÅàÅ… ÅEW!Åp0p2÷ Âþׇðµ#(ð PðÕ)÷ ì†ðµ@#ð¥Çÿ*ð*fff÷ Šþ±±‰‡÷ ¶†&œ*wjðµ.÷ nB‡ð5ð(8ðe$8w2€æ•ÖÿA&À(Áe÷ Ú€†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA#ðÕ@))÷  †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ š00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ à‡0 @0 ð‡&œ*0 @÷ uÄ÷ ðµ# ÁeB&B÷ L°B÷ ý÷ F°•*±‡÷ È ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ B0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6wfð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡w ªúÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w fú  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡141612Áepðµl2l0p‡Ä Ä Ä ðµf÷ |ð >€5>õE€u ÷ „�‡ñ ± ‡ð‹*±‡ð*‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡0Š+æ1ÿˆÅ(Åe à ÷ �ÿß%ÿÿ&ïp’*wjÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ Fÿðµ82Áe&À(÷ þý€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡ðµ>ðµð¥ ’¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡ðµðe6p 4÷ „†8÷ Ìý±‡÷ º†81416÷ ÷ .ñÅ ÷ T‡‡÷ ê†÷ è‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ :þU•Õ8UMwFþÅåà wÚý÷ NþBðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�w„ý46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ ýw ý8Áe2 ‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡w böÁ(ñ D÷ Vð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•Óÿw¸Ä 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)ÁeB÷ Ȇ&œ* ÷ Šñ ðµæ•ÄÿwT± ðµ.÷ PB‡ð5ð(8ðe$8w2€æ•ÖÿA&À(Áe÷ šú€†æ•Ùÿ4p8Éq ñ• ðµ(ðµ#5ðµ=ðµA#ðÕ@))÷ Öü †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ Zú00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷  û‡00ý�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Äðµ=0Š/ðµH#ÍÕ@…&0 ðµ# Õüðµ=Õõ Õe0 Õ÷  ÷ ú0@°Æe° 6ðµ=ðµ#0œ2/002ðÿðµ#ð ðµ@#ðÿ?ðµ@#040 6wDùð•/ðµ!0Š/ l0°Š/!ú‡p!0 ðÕ.ðµ=p0p2‡ðµMðµ=ðÕf�Â(& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ðµ=&Îe0æ ÷ øøU• Â…à  ÂE•Õð >€ >ÍE€ðµ=ufÄ÷ Øøp†�ñ ± wLø÷ ø ‡f÷ ¨�†&œ*÷ ì÷°•*±‡w òÁ(DB‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±DÂ(Âe(¦„Äe$2ƒÃeäÿæÓÏÓ Ó(‹ÿˆ‡Ì%[]Ì%<> ƒ ÷ „팂1 >‡÷ æ÷MÄwþ÷f&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡w ìðBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=w²öÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡ÿ õp´Àÿ üôp´öÀÿ ôô|´ÀÁeBÉ ð 8÷ Ú‡$&w *öð*ðµ<S1 ¦à Ö KÊ ñU€ò ñU@ò æ÷ ”ÿƒ‚f&œ" ÷ €�†‚×'&�ÿ)×'&ëÿð&* ðÊ*Ä%0þðÌ*±‡NDÅ Å ý¦æ÷ *ƒ‚÷ ñEÿû±U‡÷ ÿ‡÷ ÿ‡÷ ÿ‡w `õBC œ"¦æ&æÿˆ‡÷ @†ÂÃSYïð&*‡°�p0p2ñ10Š=ÂEÏÿÂ%0ðÕ=w&ûÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡æÁ(ÁeŠfÄ Å EÅeÎÿÄ2 À ÉU„fDÁ…ƒÅ ԔŠýÁ%ô¥:ÿÿÔ•:Á î„ã…‚ƒÁÁ¦fææ¦& ¦f&f& �& ΕæÏ ÿˆò ²²²l²l�„ÂeÊ Ê ß &±‡ð*ðµ;ðµ7ðµ#3w Ôó *’$Ê ':æƒô �ô�…T•à ýƒñU@…Ê% D•ÄDÓÄ%][Ä%><wð÷  †wäññ1 ‡Ã ÄÄ%ñ,ñ,ñññ:4Š× ±‡w óð*DÅ Å ýæ¦Y…‚T¦fÃ(ÃeŠæ„ðµ<Ó•_‚ S•Ä ýó¥:ÿÿÓ•:‚ ƒ…¦æ& œ"& ΕæÏÿˆ‚4†×'&�ÿ ð&*×'&ëÿð¤ÿ*±*ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ < ‡à ññ÷ Üüð•Éÿ*‚ƒ‡æ5æ±ÿˆ‡ß%& Ëw ò&Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë å¥.‹ Ä ÅæU¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë ‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±û榃‚ÃåJ„”Ä¥[Ä¥<C…Å`¥ ¡>C÷ ˆÒ¥,÷ ~… 4ÃB‚ƒ‚× *‚㨂 DÄe $ $ $ ÷ .‡ñz ñññ÷ öö‡DEÅe     ýð•Ìÿ*1 ±‚ƒ‡ Ë•0‹¤þ‹¨‡—¢3‚¥÷ "÷ Ä ‹¨ ¥Ë”Ó”¦æ£˜Ä ýƒ‚‡‹¢‡Ê¥7‡¥‡Â(Âe(¦Ê ññ1 ÷ `£(£(£££‚÷ Èþ†� ‚÷ >âââââ‚:ƒô �ô�‚””à ý¡Á5Á ±‡ÂeCÃe¡‡&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡TaÞ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡±‡00ýDK¹Jl1DATADATADATADATADATADATADATAw òóð*æ ƒ ‚æ¦×¢"wf)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷ ¬‡eÄ%w ñU\ñ5@ƒ âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ "ñ5@\ñU@ñ5€áÄ„íÄ ñ5LñUþ¥*ñUÄ Å‚öƒàÎàà Ê¥*Ã%C!.D`÷ Œ*‡ƒ‚wòþÆeCÃ5€ñU‚Ã5 ±±± Ã5€± Ã5@±‡Æeð•Êÿ*±‡ðµ=õñU„Ä EÅe& ÷ RÄEÅe÷ Ö ¼Ó¥"Ý öŽwVþö Ë¥"  ƒ Ë¥"ö Õ”Ä Â Ä î ƒ  ê¶ Õ• Ä ü‡æ5æ±ÿˆ‡ß%& Ëw Àñ&Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë å¥.‹ Ä ÅæU¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë ‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±û&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡TaÞ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡±‡w böð*æ8Iðµ÷ üœ*=‡ðµ€)98÷ ¨ü ÕeBÕ && ð Îå¶ �ÕU€�Ä÷ šü‰�†ð¥öÿ*ð¥åÿ*Æe ð*Nlv °°΋œ*ðµ.2÷ 2ü „& ðµ#ðµ!ðµ)&ÎePæÂ(ÂeÊ ¦æ&æ•&Äð >€Åe >ÍE€÷ öû†�•p�*÷ 8üwpû¡ðµ)"ðÕ(.÷ Rþðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ ¼÷ ðÅ(.‡÷ þðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ n&‡f¦æ÷ Æü÷ Žý†ƒ‚„÷ œü‡åÆeðÅ)ðµ . ñÕ ðe6p 4÷ ú0ž8*wpú±ðµ=p!†Õ•^ú‡0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w îó Á�   ìì� .Â% ÷ :ú ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ *ú ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡w bÿ÷ n‡832cðµd& & & B öŠð 2OðµðµΕ ¶“ðµ à N”à Υ$¶“Ε Åð 2ƒ2Åà‚Î¥ Ž�Î �æ÷ hƒvÂ Š‚ ƒ“Ε f÷ "ƒ�ׯe÷ $ð¥óÿ*÷ –Æeð•Øÿ*wzðÅ@)ðµ÷ ®†ð¥öÿ*ï0,÷ Ä÷ ðæ‡ðµ ÷ n‡ðÅ)÷ <ðÕ)ðµ( ð¥ Ó ðµ=Ó ð¥Ó lð 0ºl‡ð  ƒ÷ ü†ð¥øÿÿ÷ 4ª‡ð¥/ð ðð¥Ãe&ðµ=ÅBaÀ@aÁ ÷ týÁe0b�Å ÷ÂeÒ€ð¥Áe@Ã÷ Ø`‡÷ ÊY‡ðµ=‚ ÂE°8óÅ Ãe…l0Å Åà & ì0‡„ l0ù…Å`pÄ Älöÿ06ðôÿ4p 4÷ ®ðep ðÕ)ì‚wVþðµð¥Ã%÷ Ô† ,÷ Æ÷ ÷ N‡÷ 2w"þ÷ ‡÷ J†÷ ¸‡B æƒàƒ#ƒÎà÷ Î f÷ Ìÿ� ‡Â`‡ð¥öÿ*÷ \wL±ðµ)0406 l0ì° ‡w "ü÷ n‡832cðµd& & & B öŠð 2OðµðµΕ ¶“ðµ à N”à Υ$¶“Ε Åð 2ƒ2Åà‚Î¥ Ž�Î �æ÷ (ƒvÂ Š‚ ƒ“Ε f÷ âƒ�ׯe÷ äð¥óÿ*÷ VÆeð•Øÿ*w:ðÅ@)0,÷ >÷ ìò‡ðµ ÷ F‡ðÅ)÷ ðÕ)ðµ( ð¥ Ó ðµ=Ó ð¥Ó lð 0Æl‡ð  ƒ÷ Ô†ð¥øÿÿ÷ 0¶‡ð¥/ð ðð¥Ãe&ðµ=ÅBaÀ@aÁ ÷ LúÁe0b�Å ÷ÂeÒ€ð¥Áe@Ã÷ Ô^‡÷ ÆW‡ðµ=‚ ÂE°8óÅ Ãe…l0Å Åà & ì0‡„ l0ù…Å`pÄ Älöÿ06ðôÿ4p 4÷ ªðep ðÕ)ì‚wnþðµð¥Ã% ÷ ¬†,÷ ž÷ ‡÷ w>þ÷ ê‡÷ J†wŒ‡B æƒàƒ#ƒÎà÷ îÎ f÷ Ìÿ� ‡Â`‡ð¥öÿ*÷ 8w(±ðµ)0406 l0ì° ‡ð‹*±‡ð*‡±ðµ=p!†Õ•^ú‡÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡ƒ  �D„PÄ5Rà ý†R”‡R”R”à üøð 8ðµ ðµðµ ÷ (ÿ‡ðÖ*±‡ðÃ*±‡ð 8 ðµðµ÷ øþ‡ðÖ*±‡ðÃ*±‡w Ô÷÷ Úþðµ÷ ÷ Lwºþ÷ †‡÷ Ò‡÷ zü‡,, ð ñ‚ð•öÿ*±îðµ)÷ ò‡÷ ¢‡÷ Їðµ>ðµ00ýLKþPK§3eaek›’𥠒¤ð¥’¤ðµ=’¤°0ð¥0l&ðµ8Îel2– ƒ0 ðµð•Øÿ*±¡‡ðµðe6p 4÷ 2þ†8÷ P±‡÷ †81416÷ d÷ tñÅ ÷ š‡‡÷ Nê†÷ .‡÷ Bðµ.ðµ.8Åem,†0l0!ƒD0ðe6p 4.ðµ)ðµ÷ ø&‡f¦æ÷ ö÷ ¾†ƒ‚„÷ ̇åÆeðÅ)ðµ . ñÕ ðe6p 4÷ n0ž8*wÞüðµ=D…÷  ‡ð`p4°6÷ ìü‡æf¦÷ ²°6°4/‡ðµ=Á  ÷ >ðÕ@)ð 0 Ö 8wþ÷ ýƒ46÷ V‡8ñÕ ÷ ~þ°eð‹*w~üÖ ±‡÷ Jü&f÷ …„‡D„ ÄEõµ/fCÃåŽ A ÷ VƒB f& ÷ >B‚eA @0÷ LÁ („‚@0÷ :a@ÂeA ‡ B0÷ "€ABÂå� ÷ ¦f ÷ âC�‚áÖ @ð•Òÿ*±‡141612Áepðµl2l0p‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ öU•Õ8UMwÅåà w–÷ Bðµ° 0ƒ0fÁepðµ=& Ü/°e�`p�wÂú46fðµ %8ñµ Eì„ ‡Dìœ/D!†D Ä l0ûl8Åepl0p¡�‡±üÉ¥öÿðµ.É•÷ XúwHú8Áe2 ‡0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w úò Á�   ìì� .Â% ÷ œ ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ Œ ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡w pòðµ Á¥ðÅ)÷ bù‡÷  ÕfU�Ä÷ 0…‡ðµÕ%  BA °`6p 4p`4¡ ¡õ%þÿð60 4‡¡ðµ)"ðÕ(.÷ ¢þðµ=ðÅ .ð¥ Bà— Â‚ ÂE÷ Îø÷ ,ûðÅ(.‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡0Š+æ1ÿˆÅ(Åe à ÷ �ÿß%ÿÿ&ïp’*wì÷÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ È÷x|³–, ÿ·ÿ·`` W ÈÐ¥TISYSYSYrÁXÀøÐ¥r¢N¶pXÀÁXÀ©†¢èöNP–00þTK¹Jl1DATADATADATADATADATADATADATA%N%3Z -- on %6A%N%12S%N%12SShadow pair: %4A %4A%N%12STask: %2R%N%12SLogical block: %T.%N%12SBytes in xfer: %U.%N%12SFile ID: %O,%O%N%12SFile name: %X%N%N%12S%M. errors lost due to saturation.ær¢ÿˆ7 Úþþˆ8¦À°üÀe ÿ ¢ü"‡ÿ  ü÷šüâþ? ”üCÅÚ¤ÀÕ~@7tü 7šþ@Á0bü@Á0ÿ XüÅ^üRüÀÚ¤ÅÒ¤$&ÀƤÃ0ü÷ dÀ̤ÃVþ÷ XÀ´¢Ð”¢æ¶¤æ=ÿˆÁ¶¤RRR ”¢Á ¥÷ ò w`þÁ�dþ€A�÷  w` þ”¢Ò̤Á¥Â”¢÷ Ê w`òýÁ�0þ€A�÷ Þw`âý”¢ÊƤÁ¥÷ ¦ w`Îý”¢Ò̤ÒƤÒðýÒîý&¦÷ þ‚€ÒÔ¤Òìý”¢Á"¥÷ n w`–ý÷ °ýÁ̤÷ ’‡Â”¢ÒœýÒ¶ýÁz¢ÃRÂ~”¢Á¥÷ 6 w`^ý÷ ~ý Á§¥Âؤ÷ Áew`Dýæ@ýæ´¢÷ ¾× ÅÚ¤÷ vXwBþÀw– b¯¶§û z¢&Å®§uf@÷ &u�Q$fÿˆ ‡wÀÿæ–§ÿˆ†÷%ÿÿ6Xø±€‡DFDXDIw €  Âø§Ê‹Ò-¸üû"Ähú÷%DKªü7 ¬ü÷%DSœü÷%DL”ü ÅÔ¤AB•C“�#÷ `À@`�"÷ T�`@ 7tüwrü‡Álüô%$� � ñ ÁTüBÂEÀÿÁE?Wtúÿ C ÷ ®ÿ w:ü‡ª¨Â�œ�œ&À€ì�÷ ì €lÀEÿ€ ÷ Е:‡Â Âw † ”Å¥ üÅ¥ ùÅå0B¡†€÷ Ž Aa”ôœÿÿ‡&æÿˆæ3ÿˆ&¦)€æ_ÿˆæ&& & & æ & && && Εææ@æ ÿˆ6‡¢ïÿæ1ÿˆã& ææææÿˆ†æ1ÿˆñææ)ÿˆÈ‹& & & & & & & & & Εææ æ ÿˆ†æ1ÿˆé€± & ææÿˆÖ �æaÿˆ@ –€ŽŽ‡w z Ä'Å  ÅUD$†BA÷ Œ &�Â(÷ ÅU� ÀBQ÷ Ú ÂЕ* ü‡÷ &÷ &÷ �’•’•€‡@Á(÷ B f€  Àe ÀeÉÿÀe Àe ‡·kµz?TLBOÀPÀzLB þ®”¯[0,0]I/O Error Code %D.QI/O Error Code %D. ¯f¯¦B Áª¬÷ 8†&Ál¯— €Âå€Á¯ ¦‚÷ ®Ö �å‚÷%Ô÷÷Ì÷‡w ŽÄðü& æLB&æÿˆa‡ñ  ÄÈ¬Ì ÷ ÈW‡111É D÷ °K‡÷ ¬ü÷ ¸Mõ€÷ ¾?‡„Ä ¡ „ „ „ ÷†ü÷ ’Õþ¬ÕU% ÷ ” ÷jü÷ vM÷ ‚!‡D ‡…Å ÅEøÿÅ… … Åeþ¬Ä@P•Ä üÀ Áà Ä.ü& æSY&æÿˆ † Äü& æSY&æÿˆ±‡÷ þû÷ 5 ÷ ‡Åþ¬æ% Î ýÖ ‡ææ¬ÿˆ ‡æÖûæ)ÿˆ÷‹Þý±‡ABDEFIMNOPQRSTUXYZ<>Å"BaÊ$ep|v¢­$Ê®¶ÅÏJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw ø&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ (÷À ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚bÂEÊ Ö ÌЕ%„Ì¥Vå ‡A¦¶6D‡÷ ÖŠ€‡Ð‹à üÀ ‡AP”à ý‡AЕ B”f�‚÷ º�à õ‡& æÎeœ6& ¦æÎeˆ/& æÎeˆ÷*AH”ÈÅ€¢ ¢È• € à ò‡Ð• à ü‡Ð• Е à ú‡& æÎeN & ¦æÎe:Е A‚¦Þ à ÷–%‡& æÎeòA÷ b÷à û‡Ð• à ü‡A÷ bE‡AÂ÷ †E‡Ð• Aæ÷ .÷AÎ ûÖ Â ÷ $Е.÷ ÷Â÷ AЕ; ÷ Œà à‡Â ýð¥ ÿÿùÀ øw D…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w ÞDÅ… ƒ÷ &Е.À À À ce÷ øÀ …Е:÷ Å ù Â÷ òB‡00þ\KfK§3eaek›’ö³¶ÿÿÿÿ¬¶&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡æ æ5æ±ÿˆ ‡ß¥&æ * æ + æ2æ3ÁEÿæ ÎE‚w Z…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ lÿW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡&æf…Þ ƒ„…‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡|³|…–, ?Á?Á…… QW  &[qÀÿÿÿÿ W 2 ¡TISYSYSYTI–>ßÈø ¡¡R0¾ø¿”È>ßÈA B C D E F H J K L M N P R S T «~¹Š¢àæèþ*,.DLjlnœ¸º $&.$"pŠ–ž©R¡©”¹æ�¡ÿˆæ˜¡ÿˆ÷ :÷tÂr¹ — ”¹ü‡÷”»¬æدÿˆE‡Ä¸ÿô5 @ÀÚ¯Á&` Š÷ ,1‡Å¥ ú÷ Å¥/wrw‘t÷ w‘m÷ Å¥:÷ ü5‡Å¥/÷ ð‡Äœ»¥÷ X Ã÷ ؇¥Å~· D÷ ʇÁÁÁÁôþAw, úÁNÁ& æ~¹‚w´ ·ˆþ·‚þ¡ þˆî£·xþæØþÞ b‡÷,Îú÷ Â÷¼ó ò7 Rþó í7 Fþ Rƒ JÂ&æ†®Þ C‡õµ4@Ð È Ð ü Á '€7Hþ÷mxþBþÿ5<þ76þ÷mbþ0þÿ ,þ?!&þ÷ ¤[‡ÎŠ®ÔÀmFþÁE!ú÷ ˆM‡Þ Õ„Æõ ÃÁ ÷ rB‡Þ ù„»Ö Þ >‡÷,—7Ôý÷mþÎýÿ5ÈýÀmðý @�@ ÀEþÿÁEïÿ@Põ5€õµ@€Q7”ý÷mÆýŽýÀߊý@]À ƒ@ÀìÁ÷ ¼ÀlÀU€7”Æ.ý‡ÁŠ& N�ÁBw‚þ÷ tw\þ÷ ýÁ@wpþ÷ úüÁAøÊ ÁW¦‚ñ÷ X f7 >þˆÂ¤Ã2ó · ,‡÷  ü¦÷ºü÷ ·÷ º2 2 ÷ à÷ Š÷ v÷-’üúùìÀˆü w€üA@,Aú1ÁÈüÿ ¨üÀ`üÿ ¸ü·¸È÷ ¶¤Ö æ@¡ÿˆwÈ À¬þˆ¥÷ ¤Á  ÂP„œÂe� † Ò Ä ú‚ ÁnFüwh õµõµ@Àeîÿð¥ð-H Âü�‚ û õÅ‡æ†®Þ 4‡4„@þÿ-5 þÿ& ÿ‹üÿ5èûÎÀÂEÿ€@‚ ‚ ‚ ÷Öûºû·`¶ûÿ²ûÌû‚À €PÁøûÃå÷ Ø€¦àï÷ Tÿʇõµ CÓ Ë Ó-šû÷ 4ÿΊ®¸w-ˆù³Â~·x·,x÷· ûóƒð÷h‡±’Ћ‡À1¦ƒÁþBæ2ûÿF,ûÁe f f& ÎÜÎ쎊ÅDæfÿ û…ƒÅl¿øúºΊïÖ ÿèú�‰¿àú‚‡¦ƒSÁbÁDƒƒS ú†ÈˆC&N`Ö ÈÁb¦ ’MŽb �b"€€Sp‚‡¡ô5þÿô5þÿw0úÀÿÿÅe€ !ýÀ 7 ¡ú±‡‡ À wVÀ%ÀƒÀe þˆ¨÷"úÖÿ÷4úÒÿ÷,úÎÿ÷úÊÿ÷úÆÿħÔHXÔ$X÷>X÷Xÿ5êù ÔÂL¹òÚò<¹À²¸Áô¸¾Á#Âú¸wÈ÷ `ÄŸ»÷ z[‡¥=Ã÷ lT‡¥Rà ù÷ NM‡Å¥=J&÷ @F‡÷ JŠť/ùÀ „áÀF¹0°÷ 01‡È•÷ .,‡€÷•X�÷•P‹· –Å¥/€ ÷ ü‡Ä¢»¥÷ €Ã÷ äe‡¥cÆ~· j÷ ÔÅ¥/£÷ X” w¦÷ HþÀô¸7>7:7 "þˆ~ªÃ޹÷ ¤)‡··· ÷ º#‡‡÷ @þˆ¶ªÀè wàA@,Aú1ÁÎöÿ ®öÀÀ¾öwäß|¹ß[|¹ÿ ¼öÄ”öôܪ‡ÁœÂ޹wXÁwP÷ ‡Å¥ ú¡‡±’Ћ‡Âhö‹,³, ò ‚ó‚ ‚ö±‡÷ h1†‚, .ÀJöÀåð $& !Â,  ÄÄEÿÅÅEB!B- Ä ö,áÄ!- Ã÷×× ±‡Å°õÅåEK-ús-õ±‡Àr÷ Zû‡‡Á[Â޹wd7 âÁ2» W f»ü‡W h»†ÑÿÿúW ”»†Ñ   É%ÿÿûÑ õÁȹÀ À ý÷ ¤‡÷ ÞÅåÀ À%‡÷ ïw"ÁwüÃÜ«Ä÷ °Ä ûÄÜ«� ì‚À ø †¬Ååꇔ¬”¬”¬”¬–¬”¬”¬‡Àö¹& $ ,»‡ 2»†N #ö-óôµ@CÐ ˜#C(˜#Fè5CÖ ‡Ãh»Ã%”»ùƒÎ-(Àå«÷ jÀåÐ¥$êôµ@Ë Ë%ÿÿÁO÷™¬Âþ·Àþ"Ó ïô5 ÍÓ$Ë%ÿÿüÓ ËÁI ÁJwˆþw†þÁKÂè«Ã¹Êââââ¢(z÷  QÀ¶ é÷ èÁ*ºÀ¸ ÷ Ü÷ Ô �Á,»ÿ5ÂóØÁº÷ Ð ÀŒ ÷ ˆ Í%€ É džÀr HÂn Àྷ¨ Áº÷5\ ¶Á$ºÂT ÂåÂ-D ¬‚Â-@ ©‡·> ÁºÀ, ÷ \Á ºÀ" ÷ P÷ t ÀȹÁ–¹Â$ð þÿ  ù÷ P Áðºæœ Ö]š �‡ÁEÂú¸Á& æ~¹‚wÖÀ À%ÀƒÀ% ‚‡Ö wÎþÅÎòAEÄ7 îÿA� Á DÄeawÚÿ7Ôÿ¡Þ ÄÈÿÔ 7!Äÿô‡ ²Þ ే÷ úÿ Àßðÿ· ìÿÀ²¸÷ . †ð¥öÿ*± Âú¸Á w<7Äÿ7¾ÿ‡÷ ºÿ&÷ ´ÿÀ€U‡ <¯ &æ&f DÐEÄ%\‡Ä ò· À,°Ã ДþÀ ÷ ´÷ >ÅÄþ 7 ø fL…÷ Å¥ À²¸÷ Z÷ŒÀˆw„…„ƒ€‡Á,°BàÀ0¯P�æ$¯ÿˆ‡ææ)ÿˆwŒfÿ‡)À<¹Ð•[ ¦�Ü ÷ pЕ, �× ÷ bЕ]Àå<¹7X‡w Ô„ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ <E�€Aa×$Ò±œÿÿ‡÷ &÷ &÷ �’•’•€‡@Á(÷ f€  Àe ÀeÉÿÀe Àe ‡&æ¦f&¦ v Þ €�‚ƒ„…‡Command I/O errorFile %X not a valid driver task imagePrivileged commandI/O error on input file %XFile %X has illegal STB formatSyntax errorDevice %2A%O: not in systemPartition/region %2R not in systemDevice not mountedFile %X not contiguousOpen failure on file %XTask image I/O error in file %XPartition %2R too smallIllegal driver task APR usagePartition/region %2R is a commonDriver already residentDriver being loaded or unloadedInsufficient pool spaceLoadable driver support not in systemDriver not loadedDriver cannot be unloadedDevice %2A%O: is attached, busy, online and/or mountedInvalid driver data base at offset %P in file %XDriver built with wrong executive STB fileWarning - KRB %3A interrupt vector %O too highInsufficient ICB pool space for CPU %1AWarning - KRB %3A interrupt vector %O in useSymbol %2R is undefined in file %XSymbol %2R is doubly defined by file %XIllegal value for symbol %2R in file %XDriver dispatch table is inconsistentCTB %2A is not supported by driver -- not loadedCannot load/unload a pseudo deviceToo many symbols of the form %2R in file %XCTB %2A does not existDCB table for CTB %2A is fullKRB table of CTB %2A will not accept KRB %2RKRB %2R not in loadable data baseCTB name %2A is a duplicateWarning - loadable driver larger than 4KPartition/region %2R is not a commonKRB %4A is not offlineIllegal use of partition or region %2RPartition/region %2R already loadedPartition/region %2R cannot be loadedPartition/region %2R cannot be unloadedPartition %2R not in system, defaulting to GENȱڱ²00tK M§3eaek›’².²M²Z²v²™²¬²Ã²Û²û²³1³R³j³Š³¢³È³Ú³ô³+´\´‡´¶´Þ´ µ.µVµ~µ¤µÕµøµ$¶;¶Y¶†¶¨¶Ä¶í¶·)·P·t·š·Â·_ €,°0¹¹Ä™ðsâyLB<¹rŒ àè 4<>BZ^`bdfÖÞ𖘬\}2»˜¬U}4»˜¬YM6»˜¬|…8»˜¬<:»˜¬t!<»˜¬z>»˜¬â@»˜¬%B»˜¬g'D»;©@F»;©€ H»;©ÀJ»;©L»;©@N»;©€%P»;©2R»;©€>T»;©ÀDV»;©KX»;©@QZ»;©€W\»;©d^»;©€p`»;©Àvb»;©}d»+{Ðpȹô¨:^ʹ=©è&̹D©ƒ:ιL© Nйe©ºÒ¹t©š^Ô¹v©šÖ¹v©""عv©?TÚ¹¿©8rܹì©|Þ¹ì©Ìeà¹ì©”’â¹6ªýä¹6ª€æ¹6ªÔ€è¹7ª4ê¹7ªfì¹7ªö&î¹T«|ð¹T«”’ò¹q«ˆZô¹•«[Mö¹ë«z}ø¹“U#f»ÿÿUNL -- VECEXPVECÑ(×'&ÿÿæ1ÿˆæææÓÿˆ‡¦Þ5Îe‡w ìÁ,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡wôù è ¼/¾ÿÿÿÿ0¿ñL¿æ¦»ÿˆ×-æ@ñæÀ‡÷ Vò¦ƒD- ‚ŠEŠ… %µ¬ Âó … Â ÀœÁÀ À À ÀU€À �€ÈEðU€Ö ‡¦Ê5‚ú‚‡ò û¦¦‚ Ž Ê5ùÊUŽ‚öÖ ‚åèÀª» Àº¿Ê»0¿‡ÊEò ÊU ‡¡*‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&æf…Þ ƒ„…‡&æ¦ff… Þ �‚ƒ„…‡‡æ¼Ààæ¼À àæ¼À,àæ¼À àæ¼À8Àæ¼À<Àæ¼À$Àæ¼À€Àæ¼À|Àæ¼À¨À|³º~–,¿>¿>Wû W  &[qÀÿÿÿÿ W 2ŠÅ ¦TITISYSYTICLWKOV–±VγøŠêb ” γ±Vγ÷5‚w¸w¬f&¦00 M¹Jl1DATADATADATADATADATADATADATA‚Þ €�‚‡†7ÿ¦p TKB>Ñ̆¸"  À @ à € €%2€>K€Wd€p}€‰–€¢8©°©(ª ª«�«¬€¬Ð¬x¯ð¯h°à°X±Ð±H²g³p³z³ÒW ,<²ôT¯”DSYSYSYSYTICL^Ø#TKB -- *FATAL*-Run abortedÀöÈ Ð·Zü÷øþÆPüÅpÄ@÷ † Ìe÷ – Œ ÷ ˜ ÷ œ Œ ÷ ž Œ Í5÷ š ÷ ž Œ Í5 ÷ š ÀÈþ÷ ¦÷5~þÖÀû÷ –À°þ÷ ŽÀ�þ÷ Žw – ÷5bþCŠÃÁ‹ �ÁÅ€÷ t ÷ tBÁŽ÷ f‡÷5€0þ÷ âü× †×-Fþ †÷<þ÷5þ÷.þ±‡÷$þ÷ r÷ Â÷5€îý÷  üwVÿÁpÂ÷ wVÿÀ P�æÿˆ‡wŒfû‡ÁÂû÷ *÷ °È²ûÁ°û÷ ÷  È¦û‡f&f÷ 7Jû�÷ úwŠû7†û7‚û÷ À‚ �� �`wjû ÷ äw^û ‡7,\û‚ó‡7,Tûï‡  ±…‡æVÂ0Þ Â0– ‡Þ æpõ@‡Ð  � ¦÷ ~‚¡Þ ’$õ€ò þÿî’$±öfE7¦ú÷ 4€`Â0 æZÞ Â0 ‡5,‚÷‡5,ó‡  ±– …‡Á6 u$†· ^ú†‚ ø ‡ 1,ù‡‚1,ô‡J ‡±1,ù1,õ‡Áº÷ &Äbúô Äeø� m÷ ¬7Dú„¡Þ &Ä8ú÷ ”e$â$)d÷ ‚÷„±‡÷5ü‡w , & ÀÅÄÃAÁ ÷ ö7òù@m7èù÷ *1 C7ŠÜù÷ øpMŽ ÷ $ð w" ÷ ð ·Š¨ù7¨ù /÷ ôð *w’ù÷ p÷ L7‚ùw€ù ÷ Ò÷ Xƒ`÷Šdù÷ Òô·ŠVùÀTù÷ òÁefA÷   ÷ ^w:ù÷ ø7.ùw,ù÷ ~÷ Áù÷ œÀ ù÷ z& &Žì—%ƒ÷ –N õÁèø÷  V €÷ ÎÃÔø÷ ÷ 2Â÷ TÃÄøÁÈø÷ ðs÷¬ø¬ø÷¦øÁªø÷ zÄewºþ÷ ~÷ ‚÷ Ð÷ A÷ ~ø‡CàÀ*ÂÁ ÷ ’  ‡w †CB�±÷ ¶÷ Zø‡‡÷54ú‡w `ņeCå %EÄÀ& 7 .øB�d÷ |÷ ‡wø�ãdd�cA�cAdã±Áì÷¡– 7Ö÷‡æA÷ à&ÀeÐ Ð Ð Ð ÃÂCmõ †ˆ &�‚mŠó€ƒ‡æŽ`ÎeÞæŽ`Þ‡÷‹ˆ÷Ó Ãƒ`ƒ ¡±‡fà‘`‰²B`Šá ‡÷ J¦÷‹P÷ ÷ Òÿ‚÷ †æ÷ °ÿæƒ÷ ”ÿ÷ *÷±÷ ¡ƒ– ‡‹ ƒàò ² ‡ ±`p ð ‡f& €`ð,ø‚ ‡ð,ó‚‡ð, î‚& �à� �mV ‚– ‡·*õÀBæ‚ã‚ �c€e ý‡ÀÒ" &àe·#rù÷ D€÷ Šð‡Á(  ˆ‡&÷ ÁeB—%þÿÁe‡1bÀe1^1\1H1J1L1N1P‡&&f÷ t�÷ ¤ÿ€h÷ ˆÿ÷eþÿHö¿DöÞ ÷e<ö‡w ÷ â‡EÅÁ‹Á÷ ÔÂæ÷ AÑÁ B` ðØ÷7Ò÷p‘AÁ÷ w”ÁL ÷ &ùw ¼EÅ÷ p†Á÷ ŠÄœ÷ BÑ „` p‘÷ ‚ð†÷7€÷ð~÷AÁŠÅÅ @aÀe· n÷· f÷‡Áe?ÁE? ‡& fŽ Ž Ž Ž Ž Ž æYÿˆ‡· :÷ · 4÷Àž0 úBŠÂÀ÷ €`±¡ Àž±¬ùðôö‡w òfÀ* ÷ òE†Ã¢Â— Àÿ †Á@÷ jÿ‡w`RõK`/ËÿÿÄž Ãÿÿ& D -ù‚ô‹öNñ ±òµ÷ nÃxö €ÜÀ ` ƒ³ÁÀ*÷ d�µ– – ‡·¦ò÷ ÿ‡°Š‡·–ò÷ úþ‡ðЇ·†ò÷ êþ‡ðÕ‡BÁö¡ B — ‚ @€` ‡Š ƒ‚ B`·ìõ¡±‡¦÷ *þ÷ �ÿ‚‡·2ò€ ÷ þ÷ œÿˆv  ÷ üý÷ ‚ÿ€mˆ‡¡ �`÷ äý±@÷ Øý¡‡X&À×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ ÞÔÆ"ÿ ÖÔª%ÿ Îì'ÿ Æ%ÿ ¾@Ðÿ ¶Xˆÿ ®pîÿ ¦”Âÿ žÄšÿ – Šÿ Ž0 3ÿ †0J4ÿ ~04ÿ v<À3ÿ nlÖ=ÿ fxØ=¦Þ5Îe‡w ÀÁ,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡wù è  ÿÿÿÿ 00 MM§3eaek›’Ê5¦ „Ê €‚Ê5ùà ÷ƒõ…2Å Å ÍUEÍ ø�‚‡ ¼ Ķº‡ÊEò ÊU ‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡&æ¦ff… Þ �‚ƒ„…‡&æf…Þ ƒ„…‡‡ ¼È �¼t Ô¼@�0"ÄÈà�0"pìÈ� #àø� #à� #œàì�0" ÈÔ#�P(´('�P(L4+�P( /�¼È¼L;�¼X¼È<�ÀÀLdJ�À|pLÄL�< |d”P�HìpˆZ�Hp p|a�<\  dph�˜&À”¬l�˜&¸”¸o�˜&¤” r�Àø ÐL x�¸"PÜÄ{�(hÐè€�(€Ðô„�(ôÐ܆�¸"ˆÄЈ�ÀLLX“€2$`“�€2ä0”�€2l<–�€2ˆH$˜�5°<Tœ�5È<H¡Ð=l„¡�Ð=�`x¢�Ð=Ä`l£”>¼æ¼À àæ¼À|Àæ¼À€Àæ¼À(àæ¼À$à€SYxQSYâySY^SYº~xQSY¢_SY»zjL¢_LB[1,1]²SYÄCC@VDAVLB VSMPVSSVMA€WDL`VSHpSPqCR@pMA€-WI pHDWPIVCOxLI xCP€WDAVFP@VMM€p³PIVPRV­SQpTR€VXT€p¹ACV­EA VHDWPM@VSL VMUVFUpROqAL€WCMVSEWIPyNMxCOxLI xSGyXHpIDpELxFMxCL xSBrFO@xt{‚‰�—ž¥JÖ(&ÄÊÖè<è^ô5b÷ â ÷ Âw¶ÀtÁŠÀeÁ û‡w ~÷7 ²ùÀâéð5 b$żÃmæ ÃeÎ Ë‹úÀ÷ € ±ó ļ! Á"÷ (ñwjù¡ü– ‡ñ•ñ•w ÷@pdf ¦Â ÷ :‚�B„œ$‡Äµ4ĵ!ò%'‡ò% ‡ò%‡E$ÂeæƒÕ�@à P”üÎ öÖ ÁÁ7Âe Á:Âe Á8Âe÷ æé±& ĵ€ V ‡11@÷ ˜†BÂeÁ÷ ¶é±‡w ,ö5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ 0œ*AdBbAÁepÂ& ¦fƒÂÁ ÷ – –‡ÁPõµ aA”Aíf@pnp÷ êC*8Ö‹Á ÷ Ä88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ ´öõÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw Pôõ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ Z5fµ fˇðµ ÇÈ•÷ ~‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ võDlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ ̽•8 †õ¥öÿ*Î Îô‡w óõ 8µŠjDl@÷ ˆT”ÔÀeBTŸ8œ5l@÷ Þô‡@Á(ñ D÷ HÁeB&÷ ‡÷ ‡& ææ©ÿˆ@ð•#÷ & æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆ00 M¹Jl1DATADATADATADATADATADATADATAKÂå@”‡ÿ NñÔà$ÿ Fñà^#ÿ >ñ0J5æ¼À8Àæ¼ÀÄÀæ¼À,àæ¼ÀXÀæ¼À àæ¼À$Àæ¼Ààæ¼ÀLÀæ¼À<Àæ¼ÀHÀ–”>AJ"?J"2–¢"¤"©"LB[1,1]ODT.OBJODTID.OBJP.@ w Üð÷ â÷RàXà÷]Fà–âÄ4ãÁ,÷ Ü÷ ІwäA÷ @ú÷‡ôàb÷$àrâ÷ àfâôà&ÃúÿôÀ"d3 ð3 :"ÀeBÁ Á ýA÷ Nù‡÷ D‡÷\Æ"&âÃ%úÿô5b÷Eâõ5 ÷E âõ5÷UþáÀÌá Àå� ƒÁBÂe÷ rã÷ 4÷ ®ë3:"sð× üÿ]À@@ÀM¸áX7 Tà7 Rà&&$&ôµ!ôµÆå €&&"æÿˆÆe À5'÷Ulá7\à7^àôX&$ÁÆPP÷ `†÷E@BáÁ¸Þ÷ (ëw(à÷ ’÷ ë7îýw Þ4 Pô@þN÷ xw”Þ$°´&4 bôe&Ãew˜þÀ²ýÁ°ý ÃÿíBÂ@°PÂ@±PÀêÂ÷ ®ê úôÊdôbÞb÷‚jý7 dý÷ À†Á ÷ 0âw÷À*Á,B÷ ¼ð&&&$ÁðÝ$÷ æèð5÷5bà÷ ˆý÷°"„ýô–"$÷ Š(‡ðb÷ –À&àÀe5Â÷ €ê÷ Îàô”&ô¸$7 ºà÷ R‡÷ dw¬àð¾Ý´$´&‡`Á9÷ †á÷ .†Á `÷ rá,\NL¡±‡Àdà÷ ´çÀXÜ÷ |ù‡ÀNÜ Á2ÞBA°bpd÷ ‚÷‡fîwöh· ö�` Š �ÜÁ�ÒÁ%/ -Á%/*Á%//$Àö¡‡œ`Â¥öÿÁÂ¥ÿÿÁÂ¥þÿ ÁÂ¥ýÿÁ Â¥üÿÁÂef÷ ¸à÷Uß±‡ÂÚûÂeÂE ÷ Ðçæ>"ÿˆ&ÀªÙæF"ÿˆÀmÞû€ ‡ ÀíÒû ‡ÀíÊûž¦ ÊÀûà�bŠå‚‡÷ öÀÔÁâ Á ý· ¶Þ÷\ܤÞ7 Fß7 ÝÀ:ß8 f÷ †æ7 DÝÀ*ÁôH ‰·2ÝÁþÿæj"æ?ÿˆ÷xûLÞ÷%DÞ 7 >Þ÷ <ÿ·ÝÀ ÷U€@Þ÷U€:Þ÷ ºW‡÷@Þ7 "ß÷ .Þ÷ 6Þ÷òÝÁf÷ 6æwvÜÁ‚P” ýÁ÷ æwæÝÁ÷ æwÜÝ÷UàÝ÷ Fð• ðÆÝðÂÝ w´Ýw^Ü7RÜÁe @Á Ü÷ à÷ ðß7 –Þ÷E€¢Ý÷¼Ý÷ Ü7 pÜ7 nÜ÷^R݇ÁK ÷ ßw ®ëw¦ÝÀ¤      ÷ˆÝ7 ˆÝ7 ‚Ý7 ‚ÝÀ* W, (‡Á÷ Œ7bÝÁ÷ €7XÝÁRÝ À^Ýæþÿð8úð•#÷ | †ð%è* 7 ú ï�7 úìŽ ÷ f‡Ž ±€‡÷ œù÷ "ý%‡A÷ –ôö‡ñµ ÁÂö÷ TÞë÷Šrù÷ LóÀJÝAÿ dù7^ùÞ‡÷ Ló†ÂöÁN÷ &Þ‡Áòì÷ ôä&&÷ �Á9?‡ÁZÜ÷ Þä÷ dæÁÝÀePHHJ÷ ¾ìˆ ÷  ð5@÷ àÜÂöÁ wÐÜðâÙ ðŒì ÀÜÀe5Â÷ `æÀªÜð¶Ùb÷ ÿ ‡÷ Ö†Á9`÷ †Ýî‡À„Ü&&ð5 bðv&÷ °&‡ÿ jé$4ÿ bé$4ÿ Zé$&4ÿ Ré0 3ÿ Jé0@3ÿ Bé0N3ÿ :é0ª3æ¼À àæ¼À`àô5uuuu w Dð÷ "÷ &w*ÁH"A±q#úq-ö‡ÿ Œïì®$ÿ „ïøÞ#ÿ |ïÖ#Ö¯Þ%1±Ró%“±Ì&ß±à`‰&ó¯Ð—&N$3ÿn$p TKB>l^SY†7 –ý÷H"’ý7 þÀ®áÀe`Á¾# ý÷ ˆèÁ2áñ@bp$$À~á0 b÷ bø@‡Àef7ôö` Š÷ –È¥;ìÈ‹êÅÖ#% % % % ÷ „Â¥:uu÷ j÷ nÀ & ”W¤ û‚ÿ ¤öÁ ÷€e)Á #I#q-'ÁeW ¾#õ‡Á$0Âefœ`Á × üÿÁ× ÂeâÿÁ × þÿÁ^× öÿÁ ÷ TáAÁ5 Â¥;U%ÁEÉ ‹Á#wÖ ÷ øüÁ(w we)÷ ´e)Á(Í ræ æn'Ä�e)÷ †e)Á)Í lÄ æ æ$'÷ ¼U%ƒ Â¥;Â¥,Q÷ \÷ Pe)S#S-ã Ó$Ë ÷Á*IÄÂË ã€ÄÒáÁ ÷ ‘%‘QüÿQ *& ÷ NüÁ&1Í &f÷ JÁPõÁe f÷ ä�Ö 7"üÒ ÁRRRÁ,õACà`Ãe ÒR”þ?jû7fû‡Á%÷ ~ü†‡Á'Âúô÷ à·öÚÀfß÷ *ø÷ ‚îÁ¾#ÂÀe`P ý‡£ &€ÿ,@ÿ 3ÿ@8€„K@oMBaÿTq ÿØrÿt@,ÿYeÿÜYxx@ÿßY`èYè5ÿ €ë0 3ÿ xë00  MM§3eaek›’0F5ÿ pë0„5ÿ hë0J5ý¨X[<$09AZ (),-*! 4%†$À$J$ú$%\$Þ$Þ$Þ$7 ¾ÿ7 Êÿ7 Èÿ7 Xþ7 ìß÷¶ÿÀL" P Ì"ú‡ÃN"ÀÔ" #Ä^#À¾þ$$÷ :Å®#B“‚ Á Á üœr00"IzÈ#Ã%N"U÷^ÿZÿ7 XÿO× N"÷‹Jÿ8÷€Dÿ÷5€üàM÷5ôàI÷öàE÷ ¼ý÷ ÿ· °ýÓ$× Ì"†Í¥pÍ¥&ðÕ€7 øþ Á-A#÷ ~ý÷ xýã(× N"†3Á%2°#Õ¥J“ÊÅÅ °Ò÷ ¨þ÷ Hý° ·ÖÞ#7 �þ ÍEwÿͥ°#J�ÊÅ·nþî#× N"Á.w‡È‹È¥;!Z#†%õ ‡ÀÐ"ü‹9ü¥;5Á¦#H¤1H¤/H¤-H¤‚H¤)†H¤‚H¢%†Å”u ½#Å ûÁ+wª÷ –ÿÀÌ"W­Ã#ÀØ"W­Ã# Á÷ ¬ðp�Ã#‡Å´#&÷ ¤À e)È¥:2È¥./È¥[,È¥<)È¥/&�ãW !†÷ Tý‡Ö ÷ &ÿñ‹ fAœf÷ J…‚‘”Å ý‡!Þ"ƒdd‰Á,w€Åp& ȋȥ-È¥)È¥(È¥*Πȥ, Ž È¥[Πȥ]Î ”âÖ Z÷ ¤þÁ,÷ ÒÅåpðpp÷ ØJ‡÷ JõÀHßA÷ ºõA‡÷ NõÁN>‡À*Á,B÷ ÀîÀ$ß&&ð5 bðv&÷ r°&`Á90‡÷ pð5@÷ ôÞwîÞðÜð¬î ÂÚÞòæÛbfÁ÷ 6Ñ Ñ‘‡Á%ÂöœŠâå Àe 2÷ –ßÿ žë$4ÿ –ë0 3ÿ Žë0@3ÿ †ë0F5æ¼À8À1±o†?±y‹%J%,%J%L%&%%€&Z''ÅH"÷ 0Áß÷ ê7Îÿ7 Ìÿ÷€Èÿ÷5¾ÿ÷EºÿÀL"Ð P Ì"ú‡ÄN"Á@á÷ ”ë÷ Jë÷ æÁÞß÷ >ë÷ *ëÄL"÷ Î%!Ì"ù‡À@÷5hÿÀÕ7Hÿ7Lÿ÷ á÷5Nÿ÷þßÁüßW  Á � Á CÁ ÷  7ªàÀ`7ÒàŨ#÷ ÷ <ß5Å #Á²à÷ ë÷ ¼êõµ· ¤ß´ dÁ÷ ÊèpppðþÞ ÀzàUÀe÷ æâ÷ ÀâAÁåÀh÷ 6æ÷ fäÁTà÷ Rê‡ÁøÞ÷ Îè7æÞÜÂEzÀ#ó5õUÀð¥æƒ÷ �ã‡÷ ä÷ üé÷5àp  p´´pp��õµõ f&÷ f€°�p÷5Öß&÷ N€°´p �ðÕó5õUfu°p ð4Þ7&Þw*Þ÷ vé�÷ öç÷ |éðÞÁñ¥<ƒ÷ ÐfwXÀð¥2ƒ÷ ÷5Nßp  p´´pp��÷ éu ðÄÝ w¾Ý ÷ é÷ é÷ z÷ „ç& Á¢Ý÷ òè�÷ Bé÷ øèw�Ýw�þÁÁeÁå@Àe÷ îá2†Á÷ úæfðððœðÅó5ðÕÀBÝÀe ÷ á†÷ Üà÷5’Þ Á÷ D°ÁÝ9–1–Ö õ G@Á÷ Üæ÷ bèw ßÁe & NÎe ó5ðU ÀÔÜÀe5Â÷ €è�õ !÷ –æ55ó5õUõÅÛÿõÜ÷-”ÜäÝõÅõõõµóµ€÷5€ÌÝ÷5ÄÝõÕ÷ 8uµ�÷5ªÝ÷ $u µ´w8ýÌ%æ*Ü÷ *ý�Ì$)‡Á÷  åð]Âû · ‚ݶû÷e°û‡E B�œÁE€ÿÀ*E÷ „íÅ ô‡ÿ èê0 3ÿ àê0ª36(>(&(&(&(&(&(&(&(&(&(>(&(&(&(&(&(&(&(&(&(6(F(6(6(6(6(6(6(6(6(>(6(6(>(x%&(&(&(&(&(&(&(&(>(&(6(6(>(&(>(>(>(((6(((6(î'î'(þ'6(ö'®'>(6(>(&(&(6(6(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(>(>(>(6(R,6(>(>(&(&(&(6(>(>(Ÿ s1"P(£ @€–,A#w šî÷ Î÷à Þ÷5Tà ÀìÜðÅa÷Ú$ÊÞ÷ ”‡7 ÀÞ•!Àp÷ bô‡&ü „øÀºÜðÕa÷ ûÀßÀm ߀  ƒ÷àw^÷ ÂÀ ÷ ¤‡fÁÔß÷ Xè÷ Þé�‡¦÷ èÿÁ¾ß÷ ¬éÀed7úþAÁåÀe¾ÿ÷ Èâ1†Î‹· ¢Þ¿ ÞþÁ÷ Èçpp°UðÕ@pMððÝ Àlß%Àe÷ Úá÷ ´á×-pÞ Åå AÀh÷ "å÷ Rã±‡Ö ‡·ÔÛÀäÛðÕa00 (M¹Jl1DATADATADATADATADATADATADATA÷ @úÁÂö÷ Îà‡w bí÷ vw Xí÷ lÅæÝ Ä.Þ÷ r7"àÞ7,ÚÞ9ÃZ7Žü÷EõÿˆüÃA3"3,'ó5@ó5îÄÄEõÿÄ-XüçÄÅ ÷ à #ÂŒ   B`‡ „ ‡E ‚Ö Ä¼ýÔ Äe3#3-Å õ±¡‡÷ NÞ±€w �ì&ÄDÀü$Ä%æ%ÿˆ ‡Á&ÂÊû÷5Æû €‡w Tì÷ÿÿ´û& æþÝ· ªû¦�÷ Jè7”Üw˜ÜÍ �÷ jæ÷ àç& íÖ ¶#ê–%÷ vû�÷ FæóÖ ‡ÿ në<-ÿ fë$.ÿ ^ë(ú(ÿ Vë(ô(ÿ Në(ä,ÿ Fë(†-ÿ >ë4ž(ÿ 6ë4æ-ÿ .ë4¾.ÿ &ë$H3ÿ ë$â3ÿ ë$ê3ÿ ë$¢2ÿ ë$(3ÿ þê$Ú3ÿ öê0 3ÿ îê05ÿ æê0„5ÿ Þê05ÿ Öê0J5ÿ Îê0:5ÃSwÊý Ä·–ÙÁÁ Áe ÷ ®ÿà wêwZÛ‡·zÙ@$à ÁÈ "ú‚7$lúƒ7þÿdúÁ óÁÁ Áe÷ pÿ?°Û7¬ÛÐ PAPÐÐ�Pà ý‡Ã0wRý·&Ù÷¢ÜwÛwÛ÷@ÛÅú÷ ¦üÁjÜwhæW#€‚Í Í w*Û‡ÃTwý÷5€ZÜ÷âù7 Ü7 Û7 Û÷ÿ$ÛÍe ‡ÍEM M M MŒÍw Û‡·¬ØÁÁ Áe÷ Äþă ?ÚÛ7ÖÛÐ È(ûÐåPPPà ý‡·vØÁ $·lØÁœ$ee·^ØAÁåÀ^÷ P߆Á ÷ jþpppÀ^÷ ßp‡·"Øæ‚“÷ ´û‡Î ðµ· rÚ¿ ®úðÅ ðµ÷ ZÚÿ –ú°Óp÷ RåÖ Á:Ûw8å·Î×& ÖwÚwÚ‡÷5 8ÛÃmwØûæXúæVúwPúwNú7 LúÀ~*÷ èü·>ú·8ú÷ 8úÃlw¦û‡&À€Ù7,ú 7,ú ÁtÙ÷ ÔäðU· ú€‡÷ÌÚÀZ×ðÕa÷ ¶õwôüÀH×ðÕa÷ ¤õwêüÀ6×ðÕa÷ ’õ÷U�ÚwâüU%Í W# †w†Ùw€ÙwzÙ‡w:·ìÖ@× A÷ îû@‡$Á5?7Â5?3ÂŒB B B @÷5€,Ú *·êÙÁ=¬÷%Á ÷5€Ú÷5ž÷÷ Ôú‡· d؃÷5Š÷7ÄÙ7ÂÙwÙ·°Ø·®Ø÷j÷‡Ã@ÃRw|úW#ú‚w˜Ù‡Ã5whúÍ w®Ù‡·4ÖÀÌø  AÁEøÿBÜô$C ƒCÀ ö·�ò×÷�bÙ‡· ÖÀ¢ø  AÁEøÿBÜô$C ƒCÀ ö·�Ê×÷�9Ù‡w>Ùw<Ù‡w\ÙwZÙ‡U%Í W# †wNØwHØwB؇Ã6wÖùw.هХ[÷ 8Â¥,å‹f™÷ (�Â¥]å‹U�÷ °û”‡Ö ÂöÁ÷ |Ú±‡&÷ ŒûÂ¥.€å ÷ Žû÷ ‚û”Ö ‡w#Lö‡W#ú‚w¶×‡Ã1wVùW#& W#BaÃwBù÷ä HÖ‡÷à @Ö‡wòúW#ƒW#‚÷vØwlׇÃUÛ·äÔæ·ÜÔ& Á÷ öú°?fØ7bØ PH‡Â pÂ¥;mÂ¥!÷ šÈ¥;eŪ$÷ „Â¥=7e)Ä#t#t-Äe !–$ô‡Á87 ÷ È‹-È¥;*ÃEŪ$· îöô­êö÷ 6Û Â¥,Â¥! Â¥;Â¥:éÁÁ ô5Á ô­¦öÁ!ÂÔòÕaÀÔ÷ jòÂö÷ úØÅª$Ãzö¡±‡w ~å&Á"÷ fßwlö7föÂôˆJ· °Õõ•ÿÿ€fÅe& ÷ žÂ +— ;(— !%— ,— :)Ž —£%êŽ —£ …Õ ÷ Dµ“þÿ¶Š— ,— :Ù÷ D— : ô—£ö‹Ö …5Ї–%ÁÂöw2Øÿ :ä$(3ÿ 2ä0F5ÿ *ä0„5ÿ "ä05ÿ ä0J5÷ &÷ &÷ �’•’•€‡@Á(÷ øf€  Àe ÀeÉÿÀe Àe ‡&æ¦f&¦ v Þ €�‚ƒ„…‡LB[1,1]LB[1,1]0+&+Ì,0+õU,÷ šÿÀÝ÷ `äÁæÁeà÷ ,7¤ÿÁÀ¼( Á ýÃB÷5Öù÷5Îù7÷€Šÿ÷SY’ÿBÂe÷ FÁ¼(ÂÀeB ýÁeâÿ  ÷âyXÿB,D.�&Î Î Î Î ‚ÕÃC! ‚ÂU@÷5€ÖÛ„    w" Å ÿÃDÀZÜð•#÷ Ê ‡ð•ðð•÷ º~‡Ãd÷5ù ÷ Ú÷ ~Ûp÷ vÛ÷ nÛ Ãcñ5bÂU÷U@ZÛñ5€ÂU÷5€@ÛÂU@ñ5 ÂU ÷ ZúÂU @ @ìÀEÿÀ @ @ @ 7�FúQ$@ææPÎ ý– ð5øÿðU@øÿÎ ñ– Å*þe)µÀÂ(55÷5€ÈÚÂ5uí uí ÃC55a 5a ‡À@Û÷ ¼êÀ6Û÷ ²êwè÷%tÙA‡7 Úý÷ ’7 ÎýÃGÀì(AÁ5·fÚ÷U@dÚÁ5@$Á5Ð X ÷5€BÚÃPAÁ=Â÷LB BàÂe@ÂE?B B BŒÂ@$õ5÷ Üú÷ àúÃ=¸‡ÃCÄ^Œ #‡wHAW ‡wèÙ÷UàÙÃ\Á¸ØAmí‡w®ØA�÷ îøw "ýwýw`¬ØÃXu-÷5.÷zC÷5@–Ù Ã5Ã5€€õE€Á ÷ @, Ð U%ÁPÁ ý÷ `Ù÷ 4÷ Ô×ú÷ ÷ &ã0(fÁøÖÁEÿÁUÃ5ÁU€Ã €ÁU÷ 00 0MM§3eaek›’¢×ðJø*ÁUp÷ ùÀej1ˆ�`÷ äâÍ (e)w^þÁÂ(QQ ÀzÙ&$&&°$ð¼(&÷ ˆ‡°&°$‡–%– BÂeÁ>w@Ú÷ Rù7  ØÂâûÁæÀ*wÆèÀ&Õ Á ×BA°bpd÷ Zð‡fîwêîh·äî�` Š �ÜÁ�ÒÁ%/ -Á%/*Á%//$Àö¡‡œ`Â¥öÿÁÂ¥ÿÿÁÂ¥þÿ ÁÂ¥ýÿÁ Â¥üÿÁÂef÷ �Ù÷Uî×±‡÷ ûÄ÷Ū$fB�Á Á ýõÜ(õõÞ( õ 5�.ô‹€õU€.5�-æ¤$µÄe& €÷ dú÷ ^ú�@ ѥ ûÁ àu÷ èúN#N…à áÄ|ö´•–%7 rö÷m¨ú<Ö‡ÿ Þä$4ÿ Öä0 3ÿ Îä0:3ÿ Æä043&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡æ¼À àæ¼À$À?ÿ @`€ Ààÿÿ_ÿ?z(Units set to maximum assigned***æàæ=ÿˆ÷5ÂÜ÷ÆÜÀ¼ÛÀm²Û  ƒ÷%²Ü ƒÁV U÷-šÛ"ú †÷ú�ÛÁ1Âv(÷ ÞÀ`Á,B w,pÛ‚ H`Áeó÷ÿÿ6ÿ÷ÿÿ2ÿÁbÛÂÛ÷5Îù*÷5Æù& ÷ Èý†ÁF‚÷5€Ü ·ÜÛ÷ àü ‡Á=˜ù · jÚ‚wÛ·ÆÚ·ÄÚÁQÂD÷ „Ý ÷5€àÛ;÷5lù+Á ï÷5`ù%Ä Û"Äå5Ý](R(5Ý](P(÷5¶ÛõÕ€R(õÕ€P(Ä 7h(²Ú7h(®Ú´ p(Ì‚mh(·PÚ·NÚõÝäÙR(õÝàÙP(÷ ¦µÐR(µÐP(Äþÿ÷  & & ÀZdð5@t,*$õð5t<*îí ð5€  ÷ Z c€ÁHúAœÁ Ab(ìN ׇN6Ó÷5€òÚ  ð5… ð5€ %÷  �ð5@ð5 ¦B÷ ¦– Áf÷ LÜwØÃØùB÷ Œ�s�œ÷  ÷ †Ow4‚€tò* w. ð5… ÷ Pð5€ ÷ ” �‚    °` °°°`ðU@wÞþÂ`ù‚œ ‚œZ(�� BŒý€÷5Úð5µ°P(µ°R(ŒU‡Á îwÞü�    ÷5èÙð5µÐP(µÐR(ð5€ Ãøøó‹€ó�¦üÅ ÷5²Ù ð5 w Šü†w„ü ÷ ~üw vü†wpü÷ jüpp÷5€xÙð5 ð5@ðU@p` p`|š(Ò ÁA÷ äÚ÷Ý&üª×÷�!ü¥×÷Ýü ×÷ ÷5¼ö÷ îØ÷üê×÷üæ×‡ÂEÿ B B B ‡B÷ ìÿ� ì÷ Þÿ‚œZ(Á ÂŒ‡û÷5ÜØð5µ°P(µ°R(‡w øæ&fÁôA<÷ (á7Ü÷�€&��æÔ % ,4,à ö–%&fÁ®÷áÖ ðE ðU€40, ôU 0, ð ð5 ‚•‡ÁgÒ wÎÙÁiùÁhøÁkóÀŠ ÷5ØÃl³ T(ƒ³T(ó T(÷ Ôþ� ÷ Èþ‚œZ(Á ÂŒü³ÐØß‡f¦ŽÎeÿ‚÷ žþ�‚‚í÷ ’þ‚œZ(Á ÂŒ‡ûÖ �µ°R(‡Ö �‡ ÷ ù÷âÕ7 :Ö÷|Ö7 <Ö7 PÖ7 øô7 öô7 rÖ7 jÖ7 rÖ7 ,×7 `×7 ^×7 `Ö7 XÖ÷<×ÀòÑ7DB×7 üÖ÷<øÖ7 J×÷”F×ÀZ P ÁŠÔ÷ ‚ß7šô÷5€×÷?†ôÁZÕ Á%‡ÁA A A Á wDÕ ÷ÿß<Õ÷ÿ\ô÷ÿÿ.ÕÀ` H‡Áe÷ PØë·8Ó× †5 × †5 ÷5€”Ö5 @$Á d.‡Aá ÄŠ÷ üÙ†Á ÷ L Ð AÂP ý÷ föÀeAá ÷ XÙ‡ðµ  ÷ 8àðÕ€pp ‡ÃZwÎöÿ Àã0 3&æ¦f&¦ v Þ €�‚ƒ„…‡°ân!p!ü!)B)¸&ɪù¬yN0†ù¬tN°² ­sN0‚ù¬sN0† ­s, ÿŠ ­øt ­~,¤ÿ ­, ÿŽ ­€,¤ÿ­3X ÿ’d¯ªàÒt¦)â*â*€*Òw ÒüÁì÷ ÷7|ÿ ÷ ×-ˆíÀR÷ <‡÷5xîÁXî÷ Üö÷ bøÃ$÷5VîÃ÷ vÃ,÷ n÷5@Fîâ÷ ÂìßÁ î÷ ¤ö÷ *øÃ÷ J‡w Pü÷ ŽÁ®ì÷ øÅžìw ôí@Àe"ÁñKr•@×-öí ‡ñJr÷5äíñ;r÷5Îíñå÷Êí÷ *ì÷5¢þñåK÷5”þÂÕ±�÷ ªð‡Á÷ ðôë ÂÐ ��ˆȵµ d· bìÀìÀe÷ Æï÷  ï÷5Dþ'÷%Rì#÷ ¶ë×-Lí‡÷5@@íÁ÷ ºð–ë ðéðv~ðÕhÀ®ëÀe÷ pï÷ Jï÷5@í÷ „ëÃ÷ ÷5êìÃ÷ Ã,Ã$ÀšPHÄð4 ôÿÿ7Jë7 Në÷ 0‡× <úõµöÀžPPÐh ÷ VêÀðwê±ÀžÐ ÐÐ à‹÷-ëTìŠ÷5Jý÷%XëÈ•@@Áœÿ ¼ü@Àb È\ýÓ ‡Áœ@ üÁ÷ ®ð 07¦ê‡·˜èfÁ÷ ø?öü7òü°‡÷æüâüÁÞü±wÖüA÷ Tô¡Þ ôÂÈü·Âü÷ ø÷d¸ü‡ÁÀ*wîû00 8M¹Jl1DATADATADATADATADATADATADATA·:èÂd€± �,ùˆ7Œü÷ Òÿ¡‡÷ „ü Àßzü· vüÀì÷ p †ð¥öÿ*± `Á ÷ øì7Nü7Hü‡÷ ºÿ&÷ ´ÿÀ€U‡w nù÷ÿÿ,ü& æë· "ü¦�÷ dõ7®éw²éÍ �÷ „ó÷ úô& íÖ ¶#ê–%÷ îû�÷ `óóÖ ‡·àû7 Úû÷€Òû7 Ìû7 Êû7 Èû€ÁTéfj&�Ž÷ ~±‡÷ ó6¦vw0éÂ$é7 é÷‹Œû(Àe"Á$ëÁeB$$$ÀåÁe((Áîè·<Tûw<Lû  w<Bû÷ ÷ ÷ ÷ 0ûw<&û·‘$ûð•#÷ †`Á ÷ ¦ë÷ ò÷%ÐéWñ5@ñ5 O€f &�F÷ Rò6¦vwfè7Zè7 ¾ú÷ Àú*7<¶ú&ð5@ ÷‹­ú÷ ª÷•¡ú À2êð•ð•÷ Ї÷ t†`Á ÷ ë÷ „Þ ÷ Ê�Ž÷ Fó·Ž ÷ R÷ fÞ ÷ ¬�÷ *óŽ7Š7úwvþ÷ ,ú ÀÊé7è‚`Á÷ *鱜±, ñÕ ñ ñÅD7 nøô5W,ù¬W,sNô5 ÷5@ç ÁjšwÎè· 6ø‡æ BÂeÊÅʵ *ʵ€ ¤Ê5"Š Á2÷5øæ÷ ¨å÷ ø÷-øšå‚f&ÁÈæ÷ Lï€�B!F÷U@ø÷&ñµôµôµ€ñÕ ñÅÁ<ž÷ .èÁœ@ñµ"ñÕÀ-hæÁ÷ üýðš÷ð–÷ð’÷ðÅ ÀBæÀe ÷ ²è†÷ Šè@ÁœñÅñµ@Kæœ+Þ N‡ÁÄäwüðµ@õ7 \÷÷ <Þ ‡ðµ@ú÷ ,÷†Ö (÷ >÷%Á÷ xýð0÷ð(÷ ðÕHœ3Ápäðµw÷÷Xäþöw þö±wöö‡ÂšÁ÷ :çÀe÷ ¦èf6†Ö Á÷ ýœ°ðµð¤ö ðä °°fÀòãÀe ÷ ´ç÷ Žç÷5Då Á÷ . °ÁÆã9–1–�÷ šíðµ÷ ŠíN&Á€Â  ý€Âœ&€Á5ÁEÀEÁEÀEÁE@ÀE@ÀEÁE €&&fÎEÿïöEÿï¶#‡ ‚–%€–%€ðÕ2, –%€òU2,Á�â ÷ æÃ 5Á ã÷ jî´ C� Á Á ÷ J &à ÂP ý&À*ÁÁ ÷ lô€´ˆ7JõÈVõ÷% ­Jõ÷%,Dõ7 䃇·*õƒ‡‡÷%.õ?÷-�âàã1Â�ô5ÂzÊ%¦Àe÷ âæ‚N‡ðµÁòôðµ l‡Á5RŠÂšrrÁÖ Âš² Á÷ å‡7 |ô÷ xô‡æCœóÅô5Hô5€µóµ óµ (³lóÅ óÕô5€)÷ žá&óœô5óUó5óUó5 óEóEw,Æ w,À ñmÎâóµ3ô5€óÕ€óµ(À€ðµ "ðµ ó5ó5 3lðµ€ðµô5 õ5óÕ×-^â†óµ ÷,hó÷,bó÷e<âô5ó%ɪó%J'ó;'ó%Jró;r÷ÿÿFóæêÞ †w6óµwÎ÷‚à,ó‚Á 9ÂÀeÃe‹°bˆ° ÷5@Èá\÷ DàY÷-Pà áUÈ5RÈ5OÈ5Lô5HÁ2àÈUB÷ Z@ˆÀð¤òÁà÷ vë· hൠd÷ Xõ1¦Â¸ðµ°ðµ€¬Š Ê ÷ êÞ ‡ðµ÷ Ú÷†Ö w÷ tòû÷-lòá ÷5@$á ÷  ß÷ ¸‡S÷ Lò7€ÁNò÷ téð5w”ð5wˆðµ€w|ðÅ€7œò÷jßòÁdß÷ ÀêB÷-¨àTß &fÁœà÷ é÷ ¦ê�€÷ bw:Á÷ ø÷ lêÂÐñ°ðÕ€ðÕ÷µÀñB÷ 0÷ Üè÷ Rêw¶ðµ€ 7˜ñÀæÞ7Šñw‚ñ÷ØÞ~ñ7 ~ñ±¡7tñ‡ÂšÁ÷ ¸áw\Á 6Á°Þ÷ Xô÷ èé÷ $‡%ÁœÞ÷ nè÷ ôé÷ àéw6ñððE÷$ñðððð µsõ d÷ ²Þn÷ ðÖ ÁPÞ÷ œéwJfÁBÞ÷ äé÷ šéð5ð5€ ô5Ö ÁÞ÷ ¾éB÷ béæ&æÁÞ÷ ªé7öÝwÀÁøÝ÷ šé÷ Pé&÷ L(‡)€ÁàÝðµÂÊÝò d÷ "ÞÂrð°0 ðÕ€ðÕ—%÷µVð ˜ÝÁžÝ÷ À÷ .–%ÁŽÝ÷ ÚèÁ„Ý÷ âè÷ ÎèÞ †wxfÁnÝ÷ é7^ݵšÁ÷ Và‡w êìCô5€7(ò5³l÷âïÁ÷ ~Á<Ñ H !Ð Ð&ÁZÞ÷ Þæ÷ dè€PPÐÐJ©Ðø‰ÄNÞÄ Ð· BÞ‡² xæÃt² ræÃnf¦Á÷ ‚Â`Ò  "°�ƒ‡¡ðµóµ ðµ€÷ Ræðµ 3,ô5¡±¤‡óµwRóµô5w>Áó5ó5Áe÷5@†Ý ô5€ ÷ úÛô5Áe÷ êôw¤îô5ó5óÕ€ð ðm4Ý0 0 ÷ †÷pîððEðð0î ð¢Û ó5ðHîððòÜóµ óÕ€ð ðmÌÜ0 0 óµ 0 µ d· ªÛ÷ �æ÷ šð÷ ˜æððÀ4ÛÀef÷ ôÞ÷ ÎÞ÷%ˆÛæÛææÆå�Àh÷ 0â÷ `àÆe – ƒ‡ÀNÈ ô5PHtt ÁÌÚw.æ÷ íæ*ÛÎm ÛŽ ‚— ƒ÷%Ü— ƒfÁV ÷ ˜Ý�· úÚ7 àì1 ñ¦Ù÷5€àÛfšÁ]÷ lÝ�w`ôÖ 6f… ÷ .Á00 @MM§3eaek›’÷ &ä÷ ¬åÁðµ !ðµ ðµp`†Á ðµp ƒÁ;Ò ÷ Ýp ƒpÅ Ó…÷ Àòô5 -ô5@)ÁÜÙ÷ .å7 4ì÷ ¨ï‡÷ äï ö7 ì÷ ”ï‡÷ ðî÷ öä&fÁ¨Ù÷ €ã÷ å°·˜Ù„wÔòwVóƒ‡ô5-÷ ˜ïÃåÀ%&÷ ŠïÀ¥!ô5ôUÁXÙ÷ ºäæÃžæ÷ `ïÎ ûÖ ƒÃå Áœ@÷ ÷à Û‡7 „ë‡w ºèÄeW!€ƒÅå€÷ Å€AÁ Á ÷ ðñTÐÐÅ ü‡÷5 ë÷5˜ë÷5�ëô5Á÷ ¼ñ÷ äðpëðÕˆB÷ ìû÷ Œâ¡‡±‡÷ VêÁôÙ÷ xâÀe&ÁŠØÁe ÷ ݇wëÖ ‡€Á÷ î܇wúê‡÷šÙØêwÖêÂÐê�¦·Æê÷ þãwRØÁ¼êÀe÷ ºÜf &w@ØÁ:Ø÷ ˆã€ �ã‡Þ ᱇w ºçÅJÙÁØ& f w€ê÷ äá÷ RÄ  öÄÀî×& ff÷ ¾á÷ ,ö� ÷ °á– N ñ– õ„ !‚æ.ê¦í– ‡U ‡1±o†ÿ °æ0 3æ¼À$Àæ¼À àæ¼ÀHÀ€Ôœð&æ¦f&¦ v Þ €�‚ƒ„…‡"!T!à$â$n%x!ˆ,´,**ú &¯ªà® ° D!æ -T.T.ò-D! 7 èí÷ ÷\ÿÀxîðÒ/h8 f÷ ¼õÀ¤÷ 4÷ °ì÷ Zî·Ìí÷5¨í7 Àí7 $ÿÀð÷ 7 °í ÁJ÷ "ïÀ&î÷  ý0 h‡Á÷ ®ð 07ô뇷æéfÁ÷ Ê?Úþ7Öþ°‡÷ÊþÆþÁÂþ±wºþA÷ ¢õ¡Þ ô¬þ·¦þ÷ ø÷úœþ‡ÁÀ*w<ý·ˆéÂú€± �,ùˆ7pþ÷ Òÿ¡‡÷ hþ Àß^þ· ZþÀjí÷ ¸ †ð¥öÿ*± `Á ÷ Fî72þ7,þ‡÷ ºÿ&÷ ´ÿÀ€U‡w ¼ú÷ÿÿþ& æfì· þ¦�÷ ²ö7üêwëÍ �÷ Òô÷ Hö& íÖ ¶#ê–%÷ Òý�÷ ®ôóÖ ‡·Äý7 ¾ý÷€¶ý7 °ý7 ®ý7 ¬ý€Á¢êfj&�Ž÷ ~±‡÷ jô6¦vw~êÂrê7nê÷‹pý(Àe"ÁrìÁeB$$$ÀåÁe((Á<ê·<8ýw<0ý  w<&ý÷ ÷ ÷ ÷ ýw< ý·‘ýð•#÷ d†`Á ÷ ôì÷ ò÷%ëWñ5@ñ5 O€f &�F÷  ó6¦vw´é7¨é7 ¢ü÷ ¤ü*7<šü&ð5@ ÷‹‘ü÷ ª÷•…ü À€ëð•ð•÷ Ò‡÷ ¼†`Á ÷ Tì÷ „Þ ÷ Ê�Ž÷ ”ô·Ž ÷ R÷ fÞ ÷ ¬�÷ xôŽ7Šüwvþ÷ ü Àë7Û÷ ˜ï÷ væ÷ $‡%Á*Û÷ üä÷ ‚æ÷ næwxîððE÷fîðð2î µsõ d÷ @Ûn÷ ðÖ ÁÞÚ÷ *æwJfÁÐÚ÷ ræ÷ (æð5ð5€ ô5Ö Á¨Ú÷ LæB÷ ð忆)æÁ”Ú÷ 8æ7„ÚwÀÁ†Ú÷ (æ÷ Þå&÷ L(‡)€ÁnÚðµÂXÚò d÷ °Ú´í°0 ðÕ€ðÕ—%÷µ˜í Â&ÚÁ,Ú÷ À÷ .–%ÁÚ÷ håÁÚ÷ på÷ \åÞ †wxfÁüÙ÷  å7ìÙµÂNÁ÷ ä܇w xéCô5€7(ò5³l÷$íÁ÷ �Á<Ñ H !Ð Ð&ÁèÚ÷ lã÷ òä€PPÐÐJ©Ðø‰ÄÜÚÄ Ð· ÐÚ‡² xæÃt² ræÃnf¦Á÷ ‚Â`Ò  "°�ƒ‡¡ðµóµ ðµ€÷ àâðµ 3,ô5¡±¤‡óµwRóµô5w>Áó5ó5Áe÷5@Ú ô5€ ÷ ˆØô5Áe÷ *ðwæëô5ó5óÕ€ð ðmÂÙ0 0 ÷ †÷²ëððEððrë ð0Ø ó5ðŠëðð€Ùóµ óÕ€ð ðmZÙ0 0 óµ 0 µ d· 8Ø÷ ã÷ Úë÷ &ãððÀÂ×Àef÷ ‚Û÷ \Û÷%Øæ¨×ææÆå�Àh÷ ¾Þ÷ îÜÆe – ƒ‡ÀNÈ ô5PHtt ÁZ×w¼â÷ <êæ¸×Îm®×Ž ‚— ƒ÷%ªØ— ƒfÁV ÷ &Ú�· ˆ×7 ê1 ñ4Ö÷5€nØfÂNÁ]÷ úÙ�w`ôÖ 6f… ÷ .Á÷ ´à÷ :âÁðµ !ðµ ðµp`†Á ðµp ƒÁ;Ò ÷ –Ùp ƒpÅ Ó…÷ îô5 -ô5@)ÁjÖ÷ ¼á7 Xé÷ èê‡÷ $ë ö7 Dé÷ Ôê‡÷ 0ê÷ „á&fÁ6Ö÷ à÷ ”á°·&Ö„wÔòwVóƒ‡ô5-÷ ØêÃåÀ%&÷ ÊêÀ¥!ô5ôUÁæÕ÷ HáæÃRæ÷  êÎ ûÖ ƒÃå ÁP@÷ ÷à Û‡7 ¨è‡w HåÄeW!€ƒÅå€÷ Å€AÁ Á ÷ 0íTÐÐÅ ü‡÷5âè÷5Úè÷5Òèô5Á÷ üì÷ šàð²èðÕˆB÷ ìû÷ ß¡‡±‡÷ èçÁ‚Ö÷ ßÀe&ÁÕÁe ÷ �Ù‡wPèÖ ‡€Á÷ |Ù‡w<è‡÷(ÖèwèÂè�¦·è÷ ŒàwàÔÁþçÀe÷ HÙf &wÎÔÁÈÔ÷ à€ �ã‡Þ ᱇w HäÅØÕÁ¦Ô& f wÂç÷ rÞ÷ RÄ  öÄÀ|Ô& ff÷ LÞ÷ ,ö� ÷ >Þ– N ñ– õ„ !‚æpç¦í– ‡U ‡00 PMM§3eaek›’1±o†ÿ ,á0 3&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡æ¼À$Àæ¼À àæ¼ÀHÀê*<±ƒ…±VNTI ±VNSY”±VNSY[²gNSY[²hNSY?±y‹OV\±ÿ~TI\±CL2²VNCLó«@GÚ†hjTXC±¥zb©ø "$RR>@BDFHJLNP ­,­3X ­s,w ´ù÷ žÀö÷ hó÷ òéÅâÀnëÀ Áäé÷ üD÷ FÀÁÒé÷ êD÷ 4ÀÁÀé÷ ØD÷ "Å‚Í ÷ Ô‡ðµ ÀU%@eA÷ ¨D÷ ò†èÅe åU%ãÅZÍ (Í%?±÷%âé÷ ˆ‡Ä÷ DD· ÎéÈÊéÄ èÁ÷ P?¤é7 éÐ ÐȪéÙÅeÖÀžéÃ< ÁVÉ €‚ Ée·Vé·4éÀ À  õ‚b7 "éÂ5Àe@Â5` ÷5JêÀeÂ5@Àe,Àe7ôè÷  ÷ ”÷  ×-&é÷ .ê÷5€êh· îè÷ÌèÒý· Æè÷eâèÀÀé˜ô‚b÷5€êé0Â5-ÁhÀ ƒBBbBdBd�à ‡wªèÂ@Àm è‡@b‡Àmšè†÷EªéæŠèæšèæ†è‚ÁW÷ 0ëÆeÀÿÿ7PéÂ5€!÷5|éÁ8èÂ5@Áe2Áe?ÁE?� ÁE€� � � � � @`ÀeÀE 7`è÷ ¾÷ Âææ=ÿˆÁ¨æ ÷ šñÀeÁ>  ýÁ>   ýŘD ÷ ¦‡÷ fPÄ ýõÄ aU%ñźÅeÍ = ÷ |÷‡ðµ ýØç=lì÷ŽèŽè· Šè÷ 8÷5 è Áæ÷ ñ÷ ’ò1 ‡Áaa÷ Á<Ñ H !Ð ÷ BPPÐPP ‡÷ *@Àe"AÁå÷ Në ‡ðµðµ€¡±‡&Á è÷ Žð÷ ò€‡À^AÁå÷ Šë†Á ÷ �pp0À^÷ L뱇÷ ¶ÿ@ð dDÀe"æ8Þ >‡ðµúðµö7’û7Žû÷%ɪ†ûì×-‚ûK'wD×-vûJ'w8×-jû;'w,×-^û3&w ×-Rû3&w×-Fû2&w×-:û#&ÄÁn÷ äè‡w xõ÷ÿÿ"û& æ"ç· û¦�÷ nñ7¸åw¼åÍ �÷ Žï÷ ñ& íÖ ¶#ê–%÷ äú�÷ jïóÖ ‡æ)Pxü¬Ä"â)Ä&Ôþ¬¯yó«@G˜ ­ˆxC±¥ª­cŒb©ø²ü¬³°úp@,«1zB?±y‹D5¬!™:ÿ :ô|¸ÿ 2ô|v ÿ *ô|ð!ÿ "ô|æ0ÿ ôˆ#ÿ ôˆ$ÿ ô0 3&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡¢H H¤rzt¦„€Ààðøüþÿ?ÿÀÂ÷ jþ‡w àóÅ:äD„C†Ået÷ BE‡AÁ%ÿÿ÷ ðí÷ vïð5f&ðÕ"ðÅ€ð5ð50ð 0ð0ð ÷-Æãåð5Ö µÄe¾Å ãD€C‚Åen÷ hÿ‡×-úã÷5ìä÷eîäÀ!÷ –ý÷5Öä÷åØä‡÷5@ÎäÁ®ä÷ 2í÷ ¸î7rŠþ&æÄe€Ãˆ÷ 䃄Á†ä÷ í7xfþ÷ ˆîæ&Äe„È÷ º÷5pä„Äe°Ã‚÷ ¤„ƒ‡w ŒòÁîâ÷ NîÅÞâ÷5@Lä wrþDÄe€Ãˆ÷ rwxþ00 XM¹Jl1DATADATADATADATADATADATADATA÷5"äDÄe°Ã‚÷ VDÄe„È÷ HæJ÷-˜âèãæ÷ 4Î ü– „TŒTŽT�5 �L’„5ŒÔmÔã5Ž5e�5’‡ÁÀ÷ VýÁdf÷ ì÷ ¢í °c †0ÂeÁ÷ "å– %‡w ²ñ7 lý÷  Áêà÷ âë7^ý÷5Xý÷*ãÀ)÷ ü÷ RýÁBý÷ 0í÷5:ãÁ4ý÷ íÁ2ý÷ í÷5 ãÁ&ý÷ í7 ýÀÔ+÷ ÄûÀ âÀmâ  ƒÁV÷%þâ ƒ÷ ‚äÄ2÷5ÔüÁ÷ tüL`ÂT ÷5Ä⊊Êm¸âŠÁ¢â÷ öì÷‹žü ÷ ÷ Þ÷‹’üw�wè@? Á÷ u~õí”á~@wá÷ZâáCÄa÷ ¾÷5Xâ÷‹HüS@¤CwÚà÷0âÜàÄa÷ ®÷ ž÷ l& ÷ ä„A~Ám6áÁ w âà†wÜà÷ H÷ Ä÷5â*÷‹ðû'Cw†à÷ÜáˆàÄa÷ Z÷5ÜáÁ ÷ ŽÁZ÷‹¾ûÁ®àH · ªàA®B¤÷ Šô¨à÷5¤á÷ààÁ†áw„ë÷5Žá÷‹~ûfÅe†@ÄÁ÷ …u®õí€à®‡Á Á,á÷ 5÷ . tj÷ T ‡Á ÷ ö È à7à· àA~Bæ&Ó ÓáÓþàKËm(à€&ÁØà÷ ¸ À ÀdÓ �÷ Ö S&„¶Ö j óE€ÃeÀà„ ƒ‡7 ÄúÀz%÷ pù 7 ’ú÷ ÞÄ÷ Ö÷5žà  ÷vú÷ ÂÄ÷ ºÁrà÷ öè÷5zà& ÷ âèÁŒ  Á w2ß ÷5Pà � ÷ ¼èÁŒ  Á wßÀßÁ÷ ä †Àÿÿ7ßÀîÞ÷ ^ 7ܰvÞ÷5àÀÚÞ÷ H 7ܰbÞ‡w (îÁŠÞ÷ êé7 Èù÷ ÷5Üß÷¶ùÁlÞ÷ ‡ÅZÞ÷ ¤ùC C÷ šó@w šß ÷ ˆùw œù6w�ù2÷‹…ùÁ¢ßÀ\Þ÷ @ Á wRÞ÷5vß ÁˆßÀDÞ÷ & Á w:ÞÁ÷ Òçð5  · Pù÷ V Á ÷ "ùu¦uf7 2ù÷ù÷ù@ ÷ Žçð ðµ ·‘ûøA ÷ rç÷ÊÞâø÷ ßÞøÄæÁ÷ *é÷ àè&÷ ºø@¢@÷‹¼ø  ÷-\ݬÞò5 ÷ ’ø5®A¤5 ¤5~A5  ÷ : ÷ lø5¢5Ca÷ XøÀXøÁ¢ÀJøÁ÷ †À Á@ø÷  ÷ .ø5ž5÷ Bø÷ ò÷ @ ÷ øu®uœ|u~uw÷ ô÷ÂäÜÂÜÜA ÷ ræ÷ Ú÷¦f ‚ ÷ ÖÂÿÿ÷ º÷µœµ€÷ ¨÷Áª÷Á ÷÷ b÷ ”÷7–÷7Œ÷÷‹–÷÷-8܈Ý÷ v÷5`®5`~÷ f÷A¢A¤AA÷ ÁR÷÷ ‡Á ÷ 8÷u¦uf÷ L÷÷ "÷w ܃w Üw ܃wþÛõµ‚÷ J‚÷ ôörœr÷ àö@œAž@A÷ ’‚€ì2 ‡2�÷ Àæ÷ ÐÀT  ÷ ¢ö  ÷ ˜ö@ž@÷ ˆöw3Nõµ@÷ (4`N‡3N˜÷-lÜÛ4N6À ÷ 4`N‡¡ ÀeÿŠÀ‡w Šê÷ ¤ÁèÚ÷ HæÅØÚ÷ (ð;w (Ü ÷]2Ü"ö÷]ðÚö÷Uö.÷5€Ü*÷5ö&·öÁö÷ öåwöÁö÷ >æ÷ ôå7úõ÷5êÛÁðõ÷ Îåw äõÁàõ÷ æ÷ Ìå7Öõ ÅVÚÄ÷ ®&÷5°ÛÄXõ5Á ÷ N5¢ �ÄTõ5Á ÷ 05 7P`õ÷UZõ÷5bÛõ ¢÷UFõà E   Äþÿ÷ 4÷5:ÛÄXÁ õ5Á ÷ Ò5¤ ÄT7SþôÁõ5Á ÷ ®5÷ H‡·‘Þô· ìÙ÷-~ÙÎÚ ÷ àÙ÷ ¾îõµ÷U¸ôA2÷ 2ã÷ ¸äð]¦ô ð]žô ÷ ®ô%w-¨ô!Ĥôô]ˆô ÷ ‚ôA ÷ úâf@÷ $ÁŒÚ÷ .‡Á uft ƒt÷5VÚPÄX7S<ô÷  ‡·‘8ô· DÙ÷-ÖØ&Ú ÷ 8Ù÷ îõµ÷UôA 2÷ Šâ÷ äð]þó ð]öó ÷ ô%w- ô!Äôô]àó ÷ ÚóA ÷ Râ¦@¤÷ |ÁäÙ÷ †‡Á u¦t ƒt‡ÁÁ ÀR Á ý‡w ÎçÁ0Ø÷ �ã7 nó÷ ÷5‚Ù÷\óÁØ÷ ‡ÅØw VÙõµ3÷ <óA A÷ Àá÷ Fãð5 õÕð÷ óðU Àe ÷ ó÷ íÈ ÷-öìóƒ÷îìóÈ · Ø ‡÷U€úØû÷ ÔìÈ õ÷-Êìäòñƒ÷ÂìÜòÈ ì· Ö×é÷ ¬ò÷ "÷5¾Ø÷ šò÷ ‡n´nÁ Kj´jÁ D÷ áæ ÷ ˆâ÷5tò ÁeÿÁEÿ  Wtüÿ÷ Fp÷ >òÀn22mh÷-6ØâÖ fÁ<ØÁmüÖ÷ r`�÷ Ø3n h2òln÷ À4hƒ‡@÷5ØÀe”&Àeæ8÷5ì×€&÷ RàÞ †‡ð5íðµ é÷5¾×÷5¾× ðµtÈ-ƒ ×÷ œáðµ@0 0 0 É÷ `áf&æóµ ÀTÖÁ÷ 7HÖ3ÀóÁ÷ 3 Á*Ö÷ ê7"Ö7L×w(óµÁ ÷ ˜ß(Á÷ Æ33Á ÷ ¬4Àì3 t÷-ŠÕÚÖ*ÁÀŠ÷ jÚ$‡& ó óÕ€Àe33 ó 3 ÁÁ À ÷ RÁŠÕ€÷ H7€ÕF ÷5ŽÖó5€ÄÄeVÁ÷ ( @à÷ &ÁÀ^÷ âÙ‡óµÀ÷ î3 ƒ3€Á÷ Ô3Á÷ Ä3 Àì3 ƒ„�÷ ðßw þ@Àeæ8Þ L‡æÐïÂ5  Cµ @ðµ@<÷5ÌÕ÷5ÌÕµN~÷5²Õ"Â5€÷ ˆï%N®°c°c÷ ”ß÷5ŒÕÂ5€ ÷ bïÎdï°c°c÷ nß ÷ Jï°c°c÷ Zß– ²‡@`!‡‡÷ ‡‡Á @`†A@ � f÷ èî�÷ ÊîÀ ±@‡Áe? ¡ � � � � ‡¦BÂeÁ÷ –Ö÷E0ôÔ€‡À À ÷ 0œ¨  Áå ûÁå 4°Ø¡Œø†Á÷ XÖ4ÐØ‡ÀEÿÀ @ @ @ ‡±÷5€ Ô ÷5�î÷5ˆî¡‡À"1÷ <íÀ�Ð%÷ ÀzÐ% &÷ ØÜ‚ðµ "lÊmjÓ‡fÁäÒ÷ DÞÀÔÒÀe"Åe æ8Þ †…‡ðµ00 `MM§3eaek›’øðµ€ôðµ€� ðµ ë÷ Þ÷ àÝ&f ÷ jÜ�€÷ ÚÝòµ€ &� ÷ Ží€p°lò5 ÇðÅ ð5À÷ ®Ý÷ ŠÝ&fð5÷ Ü�€÷ vÝ&ð5� ÷ $í€ð5p°lw ÿp°lwÿÿ èà0 3!€@@€@ € N@(B*D,:.$ $ü   ~„ú"~ ~x< :  p' þ) €D   Šô"  * zX6 ú8 üHæ4îRð èTêxò<ìPô ö ø6ú4 ü2 þ. 0 ÷5dâkw ”ðÅNÍmáMeÀôìÄ áÄm á !‚D7üà÷íáöà`ðð•#÷ J † ô�Á÷ ²ã÷EâAà €¦ÁY÷ œã‚Átß ¦÷ hê÷ îë‚Àe�����Á÷ ŽûE€ ÷ ä7Dà7>àЕÿÄ üÅ ÁÅ Á üÁ `�Àæ#÷ Tú÷5”á÷mRàRà‡ÀàðmFàðmZá÷5táðm2à˜ðmFášÁþßw^ëw �ï7 ¸ñ ÷5€NáÀbà7ðû7ôûÅàëEbÄ ÌÃHÂÁ…0ûLPù÷ .áÌU ÷ šßÌU÷5 áÌU÷5øàÌU÷5ôàÌU÷5àà À²ßÀmðß ‡7 žßƒÀžßÀmÞ߇7 ŠßƒÂŽÁ"÷ ¼fÄ6 ÃnŨàÂÁ…0ûLPù…7<ûÀbßÀmžß72û7 ,ûƒ7&û÷5 xà÷5pà÷.ßû÷5Zà À,ßÀmjß7û÷$ß û÷m\ßûæôæ=ÿˆÄú À4ßÀ À Àe>7Öú7`ÐúÀßÁp `AW  ƒ÷%àW ƒÁV÷ ÁðÞÀ÷ ŠùÁeÁm–úwŠúÁe w`€úÁeÅ5` d÷5€ÂßÔeÀÔmÐÞTÔ�ÞÔpÞÔˆÞÔ‚Þ   Ôºß÷%žÞ Ä ÔœßÔ–ßÔ¢ßÄ Ô„ÞÔøÅ5€ôUþÿÌdßÌm$Þ7ú÷åúÔmnÞ÷ ¶ ÷ >Ô<ÞÌ:ÞÅ5÷@ßô,Þôm"Þþÿ Ä. ÷5ß ž÷ Ô Þ÷�ÞÀù÷�ß»ùæ’&Ä~÷ Ä„÷ ‡$Ì ‡÷5ØÞnæx'7 ï7 (ïÀˆÝ4ÅxÀ 7ï÷zÝ’Þ7 lù÷ ‚÷ Z÷5¢Þ÷¦Þ÷•OùÅx÷RÝhÞ7 Bù÷ X÷ 0÷ xÞÅì÷(ùÈî÷eÂî7 ù÷ 6÷ ÅT"÷:ݬî÷ ¨î7 (Þ7 ù÷ Ū"7 öø÷%@Þ÷àèø7 zîCDÄ5ÄEfÄmÊøÁ÷ LÄeÎ öÖ ê‡Å`ECfÓ Å ÄÔ& ÎÔÀÀ À Àeü&A÷ €Àe÷ Î ïÖ …âÅZÄ E'õE@CÃeæ÷5@>ø Ë% &ó%„(ó[qæÁÄe÷ ´Î ø– CÃe³Ö×-\Ü÷ dÝ÷5€PÝ À(ÜÀå7¾÷ÀD(÷ ìõ÷ à‡À¬÷¸Û� òµ@÷e”÷÷ R‡Ìe?ÌE?  ‡÷ ŒÞ÷EêÜÀŠç÷ ‡Áå÷ >Àe"÷ â߇ ñµ±ñµ€A÷ &å@ñµ Àm¸Û¡‡fÁ‚Ü÷ å�‡w ¾ê÷ 6÷ ü ÂüÚÃöÚÄ…”�  †w2÷· ¶ì÷ Ä õà ð÷÷2܇÷ žì&ÀææðB ðæ: °4Îe°6ð•(ðH"÷ J÷ l€· Öö7 Zì‡÷µ@`ì ÷‹YìÂ2 Ê‚2 ·)2 ¼‡2 ƃ÷-dÚ²ø ÷\ÚªøÂVÚÂe ÁwT݇€ì¼· Žø·ˆøÂÂ÷ îë÷ pø€ìÀ· hø·bø  ÷ Ìë ÷ Nø7 @ø‡7 <øPƒ÷ ÿ·8øæN÷ 4øÎTŽ`ÂUÿ·øÂEÿ·øÂ‚ ‚g‚ ·úõ· ~ë&f €Á÷ ÔôÀm˜ÙÂÁ  üˆ°ˆÀ÷ |ÀžåðB ðæ: °4Îe°6ð•(ðH"÷ ÷ $�€Àí”÷p�B ‡f&÷ ®þ€�€ Á÷ ¢þ‡ ‡ææ)ÿˆ÷Šl÷‡`Á÷ ÜÀB Á Á ý‡w ¦è7 F÷7 D÷Á÷ |7,÷÷B $õÀ\+÷ ó÷ úýÁÂ÷À*÷ rê7 ÷7 ÷÷øô Ú÷åÚÀÄäðèô ÷ D‡w Fè&÷ H„÷5Ú÷ ‡ÂÆôņØaC¢|w˜´ô· °ô ÷ ¸ö7÷¤ôžô÷žô²Ù÷ ®Ù· ¢ö,ÂŽôÅNØaC`w|ô· xô ÷ ~ö÷lôfô÷fôtÙ÷ pÙ· höÅ · ÖéR”„ — B"÷f÷ ‚�òà ,&Àäð2öðæ> °4Îe°6ð•(ðH"÷ t÷ Žþ€· üóÁúõÅÃ%‡ ËÃåÅÆÄ ÄU?„ àa·Ðó— B"‡÷ ·Âó‡÷ žüÂB ÷ `þ‡ÿ †æ0 3æ¼À àæ¼À\àæ¼ÀÀæ¼ÀÀ00 hM¹Jl1DATADATADATADATADATADATADATAév~ ­ø1±o†ÿ ¤ùæ†ùæw à÷÷5¤é{7 ŒýÁç÷ ò7\ý÷5Vý,÷%†è(÷ êç×-€é‡÷5@téÁTé÷ ØñÀeÁb÷ hì†&Á:é÷ ¾ñÀe"Á^÷ Nì†�pÀÐé÷ ñ7 xù7 <é ÷ýý÷ýý7` ý&Ål÷ € rx€ 7 úèí#ÁÚè÷ ^ñÀe"AÁå÷ ìë‡ðµðµ€÷ 6ñðµ ÁmÊç ‡À€÷ ÷ "çÀ†è÷ Þ÷ @ ÷ H÷ ¶÷%†ç÷5Fü÷5>üÀ÷50ü ÷ 0*ÁDè÷ ˜ò÷.è.è7&è ÷5>è¤ÁeÿÁEÿ@` Á÷ øÁ € Àmöç7ôç÷ ðçÀ®ò÷ (ø‡Á`÷ ”é÷Eòç‡w "öÀ„æ÷ .æè"Þ ‡÷ xûwzÅ<E BÒ Ò ú�Áa÷ Véõ‡7 Îç‡&÷ ¢�÷ ð7œþ÷€7 ð÷7 î÷w xç ÷DæÞ÷÷>æÚ÷Àm�æ7Â÷7º÷7Ä÷w Tç ÷m"æ¸÷÷5Xç÷mPçª÷·l¤÷÷  ÷÷œ÷–÷ò  €~ÀmLæ7z÷€lÀ 7z÷÷5ç)€œÀm.æ7b÷€l¢w öæÀmÄåÀmüæÀ 7T÷€®Àm æ7:÷€l¤À 7:÷w Ìæ ò ¢ò ÷"÷$÷·¢æ·žæ÷5¸æ·˜”æ·š�æ÷möö÷÷mòöþö‡w Îô÷ÿÿºú& æxæ· °ú¦�÷ Äð7åwåÍ �÷ äî÷ Zð& íÖ ¶#ê–%÷ |ú�÷ ÀîóÖ ‡w vô÷ 6÷ ü ´äîäÄ…”�  †wLú· nö÷ Ä õà ð÷8úêå‡÷ Vö&Àžðð¤ð朰4Îe°6ð•(ðª÷ Â÷ l€· ðù7 ö‡÷µ@ö ÷‹öÂ2 Ê‚2 ·)2 ¼‡2 ƃ÷-äÌû ÷äÄûÂäÂe Áw 燀ì¼· ¨û·¢ûÂÂ÷ ¦õ÷ Šû€ìÀ· ‚û·|û  ÷ „õ ÷ hû7 Zû‡7 VûPƒ÷ ÿ·RûæN÷ NûÎTŽ`ÂUÿ·2ûÂEÿ·(û‚ ‚g‚ ·ù· 6õ&f €Á÷ ªÀmPãÂÁ  üˆ°ˆÀ÷ |ÀVïð¤ð朰4Îe°6ð•(ðª÷ ‚÷ $�€Àí®úp�¤‡f&÷ ®þ€�€ Á÷ ¢þ‡ ‡ææ)ÿˆ÷Іú‡`Á÷ ØåÀ¤Á Á ý‡w ^ò7 `ú7 ^úÁ÷ Î7Fú÷¤>øÀ¤!÷ hý÷ úýÁÂ,úÀ*÷ *ô7 *ú7 (ú÷øÄã÷å¾ãÀ|îðø ÷ Ô‡w þñ&÷ H„÷5ºã÷ ‡Âà÷Å>âaC¢|w˜Î÷· Ê÷ ÷ Òù7÷¾÷¸÷÷¸÷jã÷ fã· ¼ù,¨÷ÅâaC`w–÷· ’÷ ÷ ˜ù÷†÷€÷÷€÷,ã÷ (ã· ‚ùÅ · ŽóR”„ — ¤÷f÷ ‚�òà ,&ÀÀíðLùðæ °4Îe°6ð•(ðª÷ ì÷ Žþ€· ÷ÁùÅÃ%‡ ËÃåÅÆÄ ÄU?„ àa·êö— ¤‡÷ ·Üö‡÷ žü¤÷ `þ‡·Þø7 Øø÷€Ðø7 Êø7 Èø7 Æø€Á áfj&�Ž÷ ~±‡÷ Òê6¦vwæàÂÚà7Öà÷‹Šø(Àe"ÁÚâÁeB$$$ÀåÁe((Á¤à·<Røw<Jø  w<@ø÷ ÷ ÷ ÷ .øw<$ø·‘"øð•#÷ ܆`Á ÷ \ã÷ ò÷%†áWñ5@ñ5 O€f &�F÷ ê6¦vwà7à7 Ê÷÷ ¾÷*7<´÷&ð5@ ÷‹«÷÷ ª÷•Ÿ÷ Àèáð•ð•÷ R‡÷ D†`Á ÷ ¼â÷ „Þ ÷ Ê�Ž÷ üê·Ž ÷ R÷ fÞ ÷ ¬�÷ àêŽ7Š5÷wvþ÷ *÷ À€á7ÀZ÷ ‚À˜÷ zÍ5@ ôµ÷žúæèÿˆ÷ øw,w H÷À¢çÀeæ8Þ ‡ðµúðµ ö0ðµ€0 ÷ Üòê‡w ÷÷ Ú÷5@Êè)À`ç÷ Ä÷ Â÷5¶èæ8À@çÀeÞ ‡ðµ÷ ñ÷ �ò0ì0 îæÞ ‡÷ †ûÀçð d Âe¦¦ dÁœ÷ òéž÷5@Nè÷ ‡÷5Hè ÀÎæð d÷¨ù÷¤ùæèÿˆÁ^"÷ ÂÁŽÉ ÷ 8ê÷~ùæèÿˆ‡÷ lð7œRø€7 Dø7 Bøw Ìç ÷˜æ2ø÷’æ.øÀmäæ7ø7ø7øw ¨ç ÷mvæ ø÷5¬ç÷m¤çþ÷·lø÷÷ ô÷÷ð÷ê÷ò  €~Àm æ7Î÷€lÀ 7Î÷÷5rç)€œÀm‚æ7¶÷€l¢w JçÀmæÀmPçÀ 7¨÷€®Àm^æ7Ž÷€l¤À 7Ž÷w ç ò ¢ò ÷v÷x÷÷mj÷v÷÷mf÷r÷‡÷ žø Àß”ø· �øÀžç÷ $ †ð¥öÿ*± `Á ÷ zè7hø7bø‡÷ ºÿ&÷ ´ÿÀ€U‡w ðô÷ÿÿFø& æšæ· <ø¦�÷ æð70åw4åÍ �÷ ï÷ |ð& íÖ ¶#ê–%÷ ø�÷ âîóÖ ‡·ú÷7 ô÷÷€ì÷7 æ÷7 ä÷7 â÷€ÁÖäfj&�Ž÷ ~±‡÷ žî6¦vw²ä¦ä7¢ä÷‹¦÷(Àe"Á¦æÁeB$$$ÀåÁe((Ápä·<n÷w<f÷  w<\÷÷ ÷ ÷ ÷ J÷w<@÷·‘>÷ð•#÷ À†`Á ÷ (ç÷ ò÷%RåWñ5@ñ5 O€f &�F÷ Ôí6¦vwèã7Üã7 Øö÷ Úö*7<Ðö&ð5@ ÷‹Çö÷ ª÷•»ö À´åð•ð•÷ 6‡÷ (†`Á ÷ ˆæ÷ „Þ ÷ Ê�Ž÷ Èî·Ž ÷ R÷ fÞ ÷ ¬�÷ ¬îŽ7ŠQöwvþ÷ Fö ÀLå7à‡÷-ðÝœÜð5ð5  ÒmúÜÒB#Ò@# ¦÷ >æ‚ðµ  âB#ð5 âmÈÜÒ Ò ‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡æ¼À0ÀODT xfr address: %P%NPRG xfr address: %P%NStack limits: %P %P %P %U.%NIdentification : %2R%NTask attributes: %VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%NTask address limits: %P %P%NTask Address limits: %P %P I-Space%N %P %P D-Space%NTotal task size : %T. Words%NTotal task size : %T. words, I-Space%N %T. words, D-Space%NPartition name : %2R%N%P %P %P %U. %VS%2R%N%P %P %P %U. I %VS%2R%N%P %P %P %U. D%2N%4N%X Overlay description:%2N---- --- ------%NBase Top Length%NTask UIC : [%O,%O]%NTask name : %2R%NTask priority : %M.%NMapped array area: %T. words%NTask extension : %T. words%NTotal address windows: %M.%NTask image size : %T. words%NTask image size : %T. words, I-Space%N %T. words, D-Space%NR-W disk blk limits: %P %P %P %U.%NR-O disk blk limits: %P %P %P %U.%N w æçÂÀ÷ üÒ*×Ò(×Ò  ƒææ=ÿˆÁD#ÂÀ÷ ÄùÂ€Ê Áq*÷ ´ùÂDÁŸ)÷ ¨ùÂNÁj(÷ œùÒ�eÙŠÒ�^ÙŠÁV*÷ „ù¼"ÊÙÁˆ*÷ rùÀÙ÷ 0ñ¼"÷ "ÙÊnéÊmÜ׊Ò ÊÙŠ¢hÁJ(÷ DùÂzÊ%Á(÷ 6ùÂ�Ê%Á4(÷ $ùÁXÖ ÷ Ná÷5ÎØÁUwpû Á<Ö=÷ .áÁEÿíÁ5ÁUÃNÖBÁ@ƒ@ÁP+Åî/ļ"A5ÒR w=þÿ&Öƒ U%Õ òeþÿò üÿU%Õ Ä èò üÿÁ�(— #† Òº+ù÷ €øÂ¼"Ê:×Áá*÷ pøÂ¼"À×÷ TÁŸ*÷ ZøÂ¼"ÀøÖ÷ >ÁÀ*÷ DøÂ¼"÷5ü×'ÀôÖ÷ "÷†úˆú÷‚ú„ú÷‚ú„ú÷~ú€ú7 vú7 tú7 fú7 dúÀ¾Ö÷ ò¼"Ò(Ê (Á+÷ ì÷À Ö÷ ÔÁþ*÷ Ú÷÷5–× ÷-,ú2ú ÷-&ú,ú÷-úú÷-úú¼"÷5h× Ò(Ê(ÁL)÷ ”÷Ê(Á+)÷ †÷Ê^ÖŠÊmÖ÷58× Ò ÊJÖŠÊmÖÁâ(÷ `÷ÁÅ(÷ V÷÷5×ÒÐÕÊèÖÊ ÷5¬ùÊÜÖ÷ ÊöÁr+÷ ,÷÷5”ù ÒÂÖÊÀÖ÷ ®öÁ–+÷ ÷‡Ê(Á ÷ ùwXù÷mTùZùw Tù÷mHùNù‡¦Á Ô ÷ ßÀe‚Á Á ýÖ ‡×-€Õ÷ ÈÿÁ*÷ ªöÁ:*÷ ¢öÁ*÷ šö÷þø÷5 PÖ÷ðøÀ2/÷ ‚ï‡w päÀÒÔ÷ 6î¼"÷-ÆÔÖ÷<ÕpæÒlæÊræ²"þÿ †òZæþÿÊ^æ²"þÿ†Ò   ÷ ÊõÒ Ê˜øÃ€çÊmŽøÃ üÊ%\Ê\Ò ÀfÔ ÷5ÄÕÁ¶)÷ øõ‡Ò ÷-NÔžÕ÷ÄÔúåÒöåÊüå²"þÿÒ   ÷ bõÒ ÁÐ)÷ Âõ‡-AC,-AL,-CM,€-CP,-DA, -EA,@-FP,-HD,-PI,@-PM,-PR,-SE, -SL,€-TR,-MU,-ID,%N*** Root segment: %2R%3N*** Segment: %2R%3NR-O mem limits: %P %P %P %U.%NR-O mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NR/W mem limits: %P %P %P %U.%NR/W mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NDisk blk limits: %P %P %P %U.%NDisk blk limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%N%2NMemory allocation synopsis:%2NSection%44STitle Ident File%N-------%44S----- ----- ----00 ˆM¹Jl1DATADATADATADATADATADATADATA%N%2R:(%VA%VA%VA%VA%VA%VA %P %P %U.%N%30S%P %P %U. %2R %2R %X%N%3NGlobal symbols:%2N%F) w 8é÷ øú×-þÙ÷hì:øÀ€Ù Ám(÷-xÙÈÚÁR(÷êÙë÷ ûÁZÙñ5-Áä(ÒëÊ ë²"þÿÒ  ÷ tú÷5šÚÁ)Ò ÒàêÊæê²"þÿÒ  ÷ Lú÷ ²ú÷- Ù\Ú÷-¾êÀêÒ¬êʲêÁ�(÷ (ú÷5NÚ Á¡(Ò Ò�êÊ–ê÷ ú÷ tú÷50ÚOÁ¾Øñµ@Iñ5JŠ@JŠ@¡Ò   ÀeÿŠÀÀ `÷ ºùÁG)÷5ÜÙ#ÁjØÒ ñ5JšŠ@¤J˜Š@ž¡Ò   ÀeÿŠÀÀ `÷ lùÁg)÷ ÎùÁ©)÷ ÆùÁË)÷ ¾ùÁë)÷ ¶ùÀØ÷5nÙÀe”&Àeæ8÷5VÙ€c&÷ ¼áÞ [‡ðµ÷ ¦á¼"÷ Þø·,üÿÎÙâ÷ ˜w´û ·°ûw®ûÁµ Á5 òmØþÿ7Šû  ·†û’Á *7 ‚ûð ·Šxûðµðµ ·Šeû÷ úøæ Þ ‡ÀB×÷ rùÁBû÷ á÷ žâð4û0ìð(û—÷ ä‡w ¶æÅ>/ÄJ’ p5ÊRaU%U%Ä óú%$$þÿò øÿòc*þÿ² üÿ‡„þÿô•)‡w læF�… ¼"÷$¾ú;Ò¶úÁ¾úÁµ Á5 Á5€ €Ážú÷ lúÁm˜úRòm ×þÿÊ÷‹ŒúË ’÷‹�ú÷bpúÀdÖð5€  ÁZØ÷ ’÷Á/*÷ è÷Ó Å ½‡w ÔåÀ.Ö7 ,ús&æéÎåÖ-Îô�÷ôèÆôÁJ*÷ ²÷€Àe"æ8÷ Ú÷úú÷öùú÷ÊèüùÅ((Ä(Þ ••UÔäù÷íàùÜù�Þ ÷ „ü‡÷ Îùù÷ Æù ÷¶ùÀùæ÷mºù¶ùô²ùþÿæpĦùÂ((Å(÷lèšùü"Í Þ ‡÷ <‡¦Â÷ Îøƒ‚Õ ¢(â î· ôÄ ÷ fùç÷ ¶öÛ÷ °ö– ÷ Hù¢– ‡¡ðµðµ€ðµ€±‡w ¾äÄúçÄíÊóÄðçÄå ÁäçaÁ ý·ùÃúøƒà�7ôø÷ìøôø  ÁìøÁíºç�‚ ú‚ ·Òø÷Ìø‡RO,RW,€D,I,@GBL,LCL, REL,ABS,OVR,CON,SAV,$$$,%2NFile: %X Title: %2R Ident: %2R%N <%2R>: %P %P %P %U.%N >>>>>>>>>>>> Undefined reference: %2R%2N%7Sž)æ(œ)è)è)è)®))).)0)2))š))î)w üêÄTÛô5€wúÀNÛ÷ ²ô÷ <÷ –õ‡÷ ÐõÃå ƒ À ø †(ðÄ(Å÷ °õÅ ûÃåÁ (Bœ— J‚ ÀôÚú ”(à 燇Àe÷ ^ß<‡Á (wþ‡‡ñµ Àe"÷ @ß ‡ðµ÷ fñµæêÞ ‡÷-¦ÚôÛðµõÖ Ö À (÷ ‡÷µˆþÁrÚñ5‡‡%ÂrÜ‚`Á÷ ^ÝÖ ÄNÚ&Ž Á÷ ä÷ ¦åÁðµðµ p`Î îÖ ‡7 í‡Àe"÷ ŒÞ†À (÷ ˆ‡÷ dûÁ Ü÷ BûÁðÙR RRR Á(÷ „û‡f&÷ 6û÷¬ìÐý€Žðµ÷ ˜ã‚�÷ Ðú ’J÷ zúÁ>(÷-°ÛNø ×-Hø¯÷ Høw,û·Š3ø‡&Á>(÷‹'ø÷ û÷ Îú÷Dìhý€ ÁX(÷ úú‡Á>(&÷‹ù÷÷ èúÂ>ý÷ ê÷Á‚(÷ Öú¼"€÷ €ü· Ò÷·ý÷ ý÷ vú÷ìëý‡#òº~â#®#Ø$Ø$Ø$Ø$Ò$ò#$ $"$$$$Ö$"$"$w ð÷ ìý÷ Îú‡÷ ûÃå ƒ À ø f#ðÄ6#Å÷ èúÅ ûÃåÁ4#Bœ— ‚ À,àú t#à ç‡Â.â‚`Á÷ ã7Hÿ7Dÿ÷•Gÿw:ÿw6ÿ×-`à÷ ª‡‡‡‡Â@#RRBœÂÅ×ÿ·�ÿ÷ ªÝG‡Dœ ŵŵ€÷ ˆéŵ Âmà·ØþÄ &ÅÅmÿwÑÎþŵ€·áÞ †7 á÷Å€¶þ7 ôàðµ€ððµìðµ ÷mÔß�þ÷-Rß àá– 7Š…þÁ@# ‡Ö ‡‡7 &ò‡ÀÞ°p°÷ .†`Á÷ â‡ÀÔÂ(#ÁÁ ý ÷5 TàÊÁ"#ÂÙw vîÅpÍ5@bÍ5@VÀL#ÁÐàPHPJPLPNPPPVPXPZP\Pœ^ŠÍ5ÈÕÀeÐŽÞÐ�ŒÞŠ@÷ ð†ÍE@@3ÀJÝ÷ Äçð•#÷ ‚7P¬ý †ÍE@`Á ÷ Fá÷ 6ÿÀ&÷ ÞøÀÝ÷ ¶ï‡À–ÁL#÷ N À(àÍ5÷ .÷ ”ï‡w ¢íæÞ ‡ÀòÝð5€ø÷ jýõ‡æ¼À0Àæ¼Àpàæ¼À àæ¼Àtàù¬sNÿ Füäè1±o†  ­,  ­s, ­,2:BJR  ­3X|Œ    ­s, ­ø�wµWÊÎêV ^ w ûÀ€÷÷ Îôð•#÷ H†`Á ÷ Zî‡7bŠÿ÷5„ÿ00 �MM§3eaek›’÷50°ì÷5tÿ×-žë÷U ˜ì÷U�ìÁrì÷ ÆöÄÆTTÔ ÀNÔ ÷ äêÔÞêÔÜêÔÁ6ì÷ ºôÀe"Áø÷ Jïj‡÷5ÿôm@ëþÿ4Š7 \þ÷5êþ ÷5ì)Ã÷ &÷ D· <þ÷5 þëTTÔÕR÷5¶þôÕ ÿÿÔ•T÷ ×-Îê÷ ÷ dÄÆ÷ ú÷ Ø÷ øÁ˜Â÷ ÷50¤ë×-šê÷ ÌÁvë÷ tõ×-Šê÷ ÊÁšÂ÷ ÎÀ ö÷ †û‡Âb÷ öìÄÆÔÔCÃetÃ5Á÷ ²óÁ”A ñ û1,÷1,ëòÔ œŠ÷5ÔýômêþÿôÅ üÿ ÷ `óŒ÷ ÌÄ%8 ‚æÊ!ÁÆBà÷ („‡Á°@Àe÷ Æíwöü7 üDÄet=ÃÖ÷ ó+&  ÷ üò+Œ�÷ òò÷•ìûÎðµw ¨ü À²Á Î÷• ÀûÁÀ ÷  Â ÷ ˜‚÷ ’÷e†ûÁÁê÷ ôÀXwnw JøÅ¤èCÄTŒÌÌEoÿÌU`ÌÍ5Ó ÔTÔTÓ ÜÔæÀ ""Á Ò ­Ê,÷ <ò<ŒþÿÎ í– Ó ÔÔÀ ""w-–éÒ­Ò3XJ�ÄšéÁ ÷ æÂa÷ ÜÁ.Â&!†Âå÷ Æ÷-üçLé÷ léÀÁÂD�‘ˆ‰Áî ÷ ˜Â÷ �õµ4Ã`S�A÷ Œñ{ÂR�ÁJ�33ómÜç3 3ÁT ÷ <Â÷ 4Â÷ ,ÁˆÂ÷ ‡@÷5´è ÀeæVÂ¸Þ ‚‡¦÷ ÷Àe”&€&÷ úð÷ ö‡& ðµ÷ Þððµ Ö #w~úÜÁ  ýóµ€óÅ 3 3 �4Šóµ@ ÷5òú÷ Xúw6Á ô•÷ zðð5ó÷ 8úð÷5Äú÷5ðç÷5 èç÷ ü~‡@Àe"æVÂ¾Þ ‚t‡¦4Šðµ€÷-Øùæð÷ ððµ  ðÅ ôÕ7, °ùÝðµÙÂeÁ”A ñ û±"ø±,È󔔌ÒÔÅ“ÿÔ•÷5ú óµ ó ämJæäE %óµ ÷ ¦å÷5 ç÷5çëôìþÿ÷ D˜÷ „åúô5üÿöÊ5Ê5 ðôUüÿì‡Á”Añ ûTTÔ•@Ô• f÷ ø�í‡Á÷  7zùÀÁR ýÁLÂ÷ æÀô ÷ ÒÀþ÷ ʇw ¤ôÀþä7`ù7\ùÀöä÷ @wRùÁf ÷ ¨÷ ²æ‚#Þ I‡÷ ä†wB÷  7 (ù ñ÷ ÚìÄêø÷ ÷ ú  7 ùß÷ î÷ öø÷ ˜�ùÔ÷ äø÷ †�÷ ~�Àå7œøW!i‚Å gý ~êÁˆøBà÷ ·‡wÆ÷ 8@÷ ’€÷ ŒÀ÷ œwª÷ Ú@ ñ5 ñ5 Å‚ä@a÷ \@@a÷ R¦Âäッ ‚·$øÒ à ú&€÷ .€÷ @÷ À÷ 0w>÷ ,w6÷ ÷ ¸�÷ Ø÷÷ Å ÷ Å úwÂŽå‚`Á÷ zæÁÁePó ±PPÔЕÐ Ä%< ‚æÆ!ÁÄBà÷ „‡À<ïp°÷  †`Á÷ æ�`‡w ®òÀãÀeæ8Þ ‡ðµúðµ ö0ðµ€0 ÷ Bîê‡ÄÌâ&Ž Á÷ žì÷ $îÁðµðµ p`Î îÖ ‡�À�À‡Ï ÷ ¤÷ Èö�‡&÷ –÷ ºöÎ úÖ ‡Á®ö÷ ØÿÁ ü‡÷ ¸÷ ¾ÿ7îõ÷ ¬÷ ²ÿ7äõ÷å„öÁœ‡&÷ ÖÿÀ2âÀe÷ ¨æ=‡wjö Ã&âðµ  ƒwNö¦÷ äë‚€‡&÷ ”ÿ÷ Öß ‡Ö   ðµðµ€÷ ²ëðµ ÁmFâ f÷ B�€‡w(þ ×-â&÷ zëŽ&Œ÷ nëÁm â�e€‡÷ >ÿ÷ Ò÷å²õ@lñ5 ñ5 ÀmÞá÷ ºþÀ÷ ¤ÿ@÷ ®þÀ÷ ¾þ‡w Üð÷ÿÿ õ& æ†â· –õ¦�÷ Òì7áw áÍ �÷ òê÷ hì& íÖ ¶#ê–%÷ bõ�÷ ÎêóÖ ‡÷ Tõ ÀßJõ· FõÀàâ÷ Ä †ð¥öÿ*± `Á ÷ ¼ã7õ7õ‡÷ ºÿ&÷ ´ÿÀ€U‡·õ7 õ÷€øô7 òô7 ðô7 îô€Ápàfj&�Ž÷ ~±‡÷ 8ê6¦vwLàÂ@à7<à÷‹²ô(Àe"Á@âÁeB$$$ÀåÁe((Á à·<zôw<rô  w<hô÷ ÷ ÷ ÷ Vôw<Lô·‘Jôð•#÷ °†`Á ÷ Ââ÷ ò÷%ìàWñ5@ñ5 O€f &�F÷ né6¦vw‚ß7vß7 æó÷ æó*7<Üó&ð5@ ÷‹Óó÷ ª÷•Çó ÀNáð•ð•÷ .‡÷ †`Á ÷ "â÷ „Þ ÷ Ê�Ž÷ bê·Ž ÷ R÷ fÞ ÷ ¬�÷ FêŽ7Š]ówvþ÷ Ró Àæà7ó‡7 2óÀºÞÁÈà÷ ÌçÁ®ÞÀ¼à‡÷‹óÀ°à  ÷ ”‡�÷ <êw (îÁ�� Á EÅå‚EÁ ÷ J3Á÷ ÁÅ÷ 0èÅ ý‡À@Þ 0 � Á Á À*÷ Ìï‡w ÂíÅRßÁ Þ& f wˆò÷ ìç÷ RÄ  öÄÀöÝ& ff÷ Æç÷ ,ö� ÷ ¸ç– N ñ– õ„ !‚æ6ò¦í– ‡U ‡€ &îÂ& 00 ˜M¹Jl1DATADATADATADATADATADATADATAÿ 0è0 3æ¼À àæ¼À0Àæ¼À$Àæ¼ÀHÀRO€×$œ2RW€Ö$œ2SV€×$�2Ø$BÁ Á ýõÿÿ.õä(õõæ( õ &• H’ � ¢ûƒ€ ¬ÿÿ;ö ôàwà途 — ; — !— ,— :ò&À u@à5€Åe,‡ ¤RN¢Oõ€þÿ¢WE€ ”‡5& ”— , — ! — [Ž ó— ]ðÎ îÎ ìÖ )@íÀ 55 ,õÿÿ.@÷ ¦‡õ€2÷ ÒÑõ’2È•f ¦Â ÷ ˆ‚�ð5€ƒ@‡– ÁÂöw2Ó· –ÑwÀþ· ŽÑw^ÿ ¢-õ€þÿЋ¤Sæ¤Vã”Íÿÿ‡÷ 8‡w Œß÷ ‡÷ 8‡w |ßÁeB$&wæ¼À8Àæ¼ÀÄÀæ¼Ààæ¼À,àæ¼ÀTàw "á„ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ °E�€Aa×$Ò±œÿÿ‡f÷  Û†Â*Á÷ îÓ�ÁeÁE�  Á ý‡Á,Á*Á(÷ ÁeÁ(÷ ð ÁeRRR‡÷ .Ú¦vÁžÒð pbÁeBÂeRRRRR R RÞ �‡Á÷ Xÿð&Ð&Á˜÷5¬ÑÁe ÷ ÊÙð"ð•�ppplðe5lÂet²°”°–· rЇ·òÍ÷ Špðæ3°4Îe°6ð•(ð3÷ œ÷ xH‡· hÑ· `ч·¬Í÷ Hð²þ pðæ3°4Îe°6ð•(ð3÷ H÷ ,䇷 Ñ· ч�7 bþwœ\þ· XþÁeÀþЇ‡ææ)ÿˆwŒ@þ †7 >þ±� ÁI÷ 4Ò‡Õ ÁAæZ”� ‡Ž ‚µ�þÿ”� ‡Ž ‚µ�ÿÿ”Ö 5Âä5ÂÜ5È‹Õÿÿ+& È¥+È¥-Î € Ê Ö  U÷ œÿÀ ÷ Êÿ‡ �f  ÷ *ýuüÿ ‡�÷ ýuþÿ‡�÷ ýü†Ö Â¥ Â¥ ”ø‡È¥ È¥ € ø‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡æ¼ÀÀæ¼ÀÀæ¼À„Àæ¼ÀˆÀ÷ &÷ &÷ �’•’•€‡@Á(÷ Bf€  Àe ÀeÉÿÀe Àe ‡5/5M5l5„5¤5Ì5á56,6R6p6‹6³6á6ÿ6/7\7�7¿7ß7 868k8£8Ä8ã8 9-9Q9u9’9¯9Ø9ù9:F:i:‘:»:æ:;,;Y;‡;·;Ü;ü;!<J5‡W E5ƒW ¾s‡W Ås ƒW !€ ‡W 8€ƒW >€‡W E€‚�W ¡Œ ‡W ¸ŒøƒW ¾Œ‡W ÅŒòƒÖ $|³Æe ‡ÿ TÞH´<ÿ LÞTÌ=&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡Illegal Get Command Line error code%2NCommand syntax error%2N%VA%2NRequired input file missing%2NIllegal switch%2N%VA%2NNo dynamic storage available%2NIllegal error-severity code %P %P %P%2NCommand I/O error%2NIndirect file open failure%2N%VA%2NIndirect command syntax error%2N%VA%2NIndirect file depth exceeded%2N%VA%2NI/O error on input file %X%2NOpen failure on file %X%2NSearch stack overflow on segment %2R%2NPass control stack overflow at segment %2R%2NFile %X has illegal format%2NModule %200  MM§3eaek›’R ambiguously defines P-section %2R%2NModule %2R multiply defines P-section %2R%2NModule %2R multiply defines xfr addr in seg %2R%2NModule %2R illegally defines xfr addr %2R %P%2NP-section %2R has overflowed%2NModule %2R ambiguously defines symbol %2R%2NModule %2R multiply defines symbol %2R%2NInsufficient APRs available to map read-only root%2NSegment %2R has address overflow: allocation deleted%2NAllocation failure on file %X%2NI/O error on output file %X%2NLoad addr out of range in module %2R%2NTruncation error in module %2R%2N%D undefined symbols segment %2R%2NInvalid keyword identifier%2N%VA%2NOption syntax error%2N%VA%2NToo many parameters%2N%VA%2NIllegal multiple parameter sets%2N%VA%2NInsufficient parameters%2N%VA%2NTask has illegal memory limits%2NOverlay directive has no operands%2N%VA%2NIllegal overlay directive%2N%VA%2NOverlay directive syntax error%2N%VA%2NRoot segment is multiply defined%2N%VA%2NLabel or name is multiply defined%2N%VA%2NNo root segment specified%2NBlank P-section name is illegal%2N%VA%2NIllegal P-section/segment attribute%2N%VA%2NIllegal overlay description operator%2N%VA%2NToo many nested .ROOT/.FCTR directives%2N%VA%2NToo many parentheses levels%2N%VA%2NUnbalanced parentheses%2N%VA%2NIllegal logical unit number%2N%VA%2NIllegal number of logical units%2N%VA%2NIllegal default priority specified%2N%VA%2NIllegal ODT or task vector size%2NIllegal filename%2N%VA%2N‡Illegal device/volume%2N%VA%2NLookup failure on file %X%2NIllegal directory%2N%VA%2NIncompatable reference to library P-section %2R%2NIllegal reference to library P-section %2R%2NResident library memory allocation conflict%2N%VA%2NLookup failure resident library file - %X%2NIllegal partition/common block specified%2N%VA%2NNo memory available for library %2R%2NPIC libraries may not reference other libraries%N%VAIllegal APR reservation%N%VAI/O error library image file%N%VARequired partition not specified%2NInvalid APR reservation%N%VAComplex relocation error-divide by zero module %2R%2NWork file I/O error%2NLookup failure on system library file%2NUnable to open work file%2NNo virtual memory storage available%2NModule %2R not in library%2NIncorrect library module specification%N%VA%2NLibrary file %X has incorrect format%2NResident library has incorrect address alignment%2N%VA%2NPartition %2R has illegal memory limits%2NInvalid partition/common block specified%2N%VA%2NTask build aborted via request%2N%VA%2NDisk image core allocation too large%2N%VA%2NInvalid window block specification%2N%VA%2NTask requires too many window blocks%2NTask has illegal physical memory limits%N%P %P %P%2NLibrary references overlaid library%2N%VA%2NTask image file %X is non-contiguous%2NVirtual section has illegal address limits%2N%VA%2NFile %X attempted to store data in virtual section%2NResident library mapped array allocation too large%2N%VA%2NInvalid reference to mapped array by module%2R%2NEnd of file reached before .END in %X%2NSymbol %2R not found for patch %2NSegment %2R not found for patch %2NSupervisor mode completion routine is undefined %2NLibrary not built as a supervisor mode library%N%VA%2NSupervisor-mode library reference error%N%VA%2NIllegal system size specified %2NConflicting base addresses in cluster library %2NLibrary %2R not found in any cluster%2NIllegal cluster configuration %2NCluster library element %2R does not have null root%2NModule %2R contains incompatible autoload vectors%2NCluster library element %2R is not resident overlaid%2NSegment not found to address round%2N%VA%2NLibrary build not requested - ignoring option%2N%VA%2NIncompatible OTS module%2N‡00 ¨M ªMl1DATADATADATADATADATADATADATAÀ*ÆÀe"÷*Æ*ÆÂÒ=RJ÷ ŽÊ‡wÆ Þ ÁfÇ+÷2ÇÆÿÀÂÿ$7¼ÿ!÷ rÇ ÷-êÅ:Çw 4Ç"ì&f÷ ¬ÏÀe"ÁÐ=÷ <ʆ–%ßwÀÅ·ºÅ�Þ Ø±‡À(ÆÀe"÷(Æ(ÆÂÒ=RJ÷ ŒÊ‡wÆ Þ ÁdÇEæCÀhÁÌ=æ Þ ‡ÀeÐ-®ÿÐ-ªÿò– ƒÀÇ$È '÷ JÇ ÷-ÂÅÇ7" Ç,ïÁÇa(Q$É éH"û7`ÿ&w–Åw”ÅA÷ dÏ¡�Þ ÀDÿÖ ±‡|³‰Š–,ÿ;ÿ;ðð W  &[qÀÿÿÿÿ W 2Ð!TITISYSYTICLŽ<Á¨ÀøNÞZ¨7(:Œ¨À<Á¨À‰Š÷ &÷ &÷ �’•’•€‡@Á(÷ ‚9f€  Àe ÀeÉÿÀe Àe ‡&æ¦f&¦ v Þ €�‚ƒ„…‡„†â�px�Ì–’´²'ÿÒò VFY>ÑÌP{L}‰ŠŽô;00 °MM§3eaek›’ÿÿ .·kµz?TLBOÀPÀzLB  B VFY Version M0529 (ANSI)VFY -- [0,0]File ID %P,%P %X Owner [%O,%O]file ID %P,%P Summary: mult = %D. free = %D. bad = %D. Header map error I/O error reading file header - Error code %D. Bad file header %D. Lost files were found Rescan of volume to find all files with multiple allocation%NIndex indicates Bitmap indicates %N File header does not exist[1,3]The following files were not in any directoryFailed to open directory fileFailed to close directory fileI/O error reading directory file They have been entered in directory %VA They are still lost, could not find directory %VA Failed to enter file - Error code %D. File successfully entered as %X Error code %D. - Directory [%I] As a result, no files will be entered in %VAThe following directory entries were invalid[%I] File ID %P,%P,%P %X - %IFile not foundInvalid version numberReserved field was non-zero %D. Invalid directory entries were found %3A,%3A%VAFailed to find INDEXF.SYS;1 in MFD - Will open index by file ID 1,1Failed to find BITMAP.SYS;1 in MFD - Will open bitmap by file ID 2,2%NConsistency check of index and bitmap on %2A%O: Listing of index on %2A%O: Read check of files on %2A%O: - Blocking factor %D. Storage control block (VBN 1 of BITMAP.SYS) is corruptedContinuing with an approximation of the size of the volumeOnly the "blocks free" value is validThe "blocks used" value is valid in the line beginning "index indicates"The "blocks free" value is valid in the line beginning "bitmap indicates" Failed to open file for read check - Error code %D. Error starting at VBN %O,%P, LBN %O,%P - Error code %D. Error at VBN %O,%P, LBN %O,%P - Error code %D. File ID %P,%P %X Multiple allocation %O,%P Bad block number %O,%P Block is marked free %O,%P File is marked for delete I/O error writing file header - Error code %D.. blocks free, . blocks used out of %N%2A%O: has Get Command Line - I/O ErrorGet Command Line - Bad @ File NameGet Command Line - Max @ File Depth ExceededGet Command Line - Failed to Open @ FileIllegal deviceOpen failure on bit mapOpen failure on temporary fileFailed to allocate space for temp fileFailed to detach deviceFailed to attach deviceCommand syntax errorI/O error on input fileI/O error on output fileIllegal switchOpen failure on listing fileOpen failure on index fileNo dynamic memory available - Partition too smallClose failure on bit mapClose failure on index fileClose failure on temporary fileClose failure on listing fileIllegal response - try againSY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VAI/O Error Code %D.QI/O Error Code %D.‰Š?TSYUPÊREÊFRÊIDÊDE0ÊLO@ÊDVÊLI€ÊRCÊrHDÊALÊü xQ»zSYü SYt:#»zSY‰Šz"Ú)êt @.Delete this header [Y/N/Q/G]? D<[S|tž– wÈwD0 p÷ ð#†÷ d� °÷ ø#†÷ Z‚ à îÁÂ�÷ nÀÜÄÅ„ð&0ð•÷ ¬#†÷ ð•ÀÁ· <ð †÷ ÷5,ð÷ .Á òà í€÷5ð00ð•÷ l#‡÷ V#†÷ Èð•÷Eèï„ Å ¾Ö ÷5€Öï ÷5@Îï Â00 ¸MªMl1DATADATADATADATADATADATADATAªÊîïŠ Á ÷ twÿÀ|Ãs ÷ œÀÇ ÷ �Á™  ÷ N÷5€Žï-÷ ´ï*÷U€€ïÁ6  ÷µué� ÷ &7 nïÀÁÂ�÷ VÀ|ð•ÁÂ’÷ @ÃZïÂXï�Á`wŽþw†þ‰‰÷ ìèÀÜ÷ �ÅïpÅm$ïp!+‚÷ 0‡÷5€øî*÷5ðîwJ w,Øéw,Òé÷-Dêâé ÷->êÜé÷5@Äîwn÷5@¸îwŠw"Áœ  ÷ R÷ t÷ &‡ÁæÎEðÿÁ Î ýÖ æ‚  Î üÖ ‡0 6ð8îð4î ð,îð(îðe p 0 ‡°ððmTîp ‡ð 8÷5*î÷E"îÁ ÷ f!†‰Å÷@æBîw\ý‡p°p°p‡ðmî÷ :! ‡÷UÜíñ-Øí÷ ,‡‡ÁÖ wHñÀíÁ  ÷ \÷5¨í÷ ð±‡Äÿ BƒdÄ ýƒ" ñ w,–í‚¡‡±‡Âªœ* ÷ ±‡ÂªÊjíòhíw÷5Ní÷ ÀJç÷ ¦ À¼p÷ ¢ †÷ þ‡w À¼ðµÁ ÷ ` †‰Ü÷:å<íwVü÷Uúì÷5òì÷ ô #Æå€÷5ÞìÁŠ ÐØìÐÖìÄðç÷ � Š�ŠÁj ÷ bÿÆe÷U ì‡ ÝÁ aÃPà ý‡7 „ì7 ¦ì7 žì7 œì‡À¼÷ 8þÀŒìÀ]ŠìÀ]ˆìÀªÐxìÐvìÐtìÁ˜ ÷ þþ÷ hì÷58ì÷ € ‡ Üþÿ `… ¦D ¬ýÿ‚‡ÑŠÄBC„ …% †· $ìÁÄ Âª÷ žþ±‡‰�‰&ŸÀ|ð•0Šðð•ðð•#÷ ^‡÷ Há‡ÁÁmÆë ÷ (܇÷Èæ÷bæÀÜ÷ â†÷ VüøEÁšëÀÜ÷ Ȇ÷ <üÀ|ðŠæ÷ ̆÷ .üÁ íÁÂ�÷ Dý÷XëÀð•ÁÜp\\p^^pVBpXDpZF÷ÿÿ<ë÷NÀDë÷NÀ@ë7 >ë÷ Z÷5ôê÷ €÷5@èêw:ú$òò¸ Á^ ÷ H†1 0 $p&÷ÿÿÞêÀ|ÁÂ’÷ ¢üw4úÀ÷ Fp‡ð%hð¥dÀ÷ Ö[‡ú÷5pê÷ ú÷ |êñ‚ à ÷ ÄûÀ|÷ ü÷ ¨†÷ ûw0 èß÷ øûw@è÷ ¨†÷ ûÀñ-0ù Ð&Ä &&&ÄeH&&&÷ |)‡TTTÄTTT÷ NÿÄeB”””Ä”””�÷ € ‡p÷ h¢†ð¥öÿ* ÷ 2‡‡Áë ÆeÁ Á( & ÷ Tü€Âªœ*Ò÷ ´ÂªÁí ÷ 8ü÷5@xéÁªÊò¸ ÷ ü÷U^é€÷ ̇÷5Lé Â(‚‚ÂåÂåÿ°ð•!#÷ Ò‡ÄLä Ýà Ä`ô‹‡· 8éÁ½  ÷ ¼û÷5éªÊò¸ ÁI ÷ ŒãÁr ÷ ”û÷ ¬û÷5Ôè,÷ rã)À^Äèã ÷ üÀÁ^÷ 6†ð¥Çÿ*1 öœ*ªÊÁ¥ ÷ 2ûÁÌ Âd÷ $û÷ þû‡&ñ %÷ vè‚ñ "ÀÜððmfè÷ ž†÷ ù-  - ÝÁ D`ô‹#ŇŖŭ· :èÁ< ÷ ºúª÷ "€ÁÁ ýJªÁi÷ ”ú€‡ÄÀ ¦÷ Lá÷ Fá÷ @á‚È• À W¢0‡W¤9úƒÁ Dà! ÷ ÒçÒö Òe ÒþÑ¥ ýÁ àR‡ÂªÊ”çŠ ÁÉ&÷ ú€‡÷ P3‡÷5ÀJçwÞ7 ÖáÀð’ðx&ð•÷ T‡÷5çð•#÷ Âð•#÷ ¶†ð¥ðÿ*ð D‰j÷"ß$çw>öðBðDÁF ÷ ŠùÇ÷ Vøð•ÁÂ’÷ ¶ø÷ †÷ €÷ÃtæÃ ÷¼æ À÷ N7¤æw¢æ CÝC÷ šæ Åe ÷ ŽæÃ¥~‡Ã à Å`ÅeBC€ Á ‚Áå€ € Á ƒ·Tæ÷RæÁ ÷ ìøÁK ÷ âøÁ†÷5æÁ¬ ÷ ÌøÁö ÷ ÂøÀ÷æ÷æð•÷5ìåôôÁÂ�÷ Ø÷À|ð•0Šðð•ð�ðÁ¾$&÷ lk‡7,\Jà7,^Dà÷U�åð•#÷ *‡÷ W‡Á’åÁ ÁmŽåÁ  ÷ ðJ‡÷ ¾M‡÷5@ZådôªÊ8ò¸àÁ‹÷5€<åÁ‹÷ ì÷:Á¿÷5€&å%ÀDßÀe0ÁHåàÁEÿ'f¦À(÷ Ä ‡‚�7.åw,åÁ� À&å ƒ@7å2ÁÜ÷ �÷wbô‰&Ÿ‰�wô‰1z÷Ðä†ß÷Êä ßľäż俄  Î üÖ f÷ÿÿXâ÷ VÁžä ÁEðÿ±B Á ü·<âÅŽ ÷ 2ŃÅàÅEÿ7 â÷ ÁÂ’÷ FöÃ`äÁ^äBÂ`w”óÀ|÷  †÷ õ÷5$ä À÷ І÷ ìôÀ|Åå„ fQè‡÷¸á.á÷´á*á÷ ¤à ÷5²à÷SYá7 áÀ¼ð•#÷ x ‡ðµø• Á÷ zö¡‡‰D÷àÛâ㱇7 öÞÀÜð’÷5¡�ãÂ(‚‚Âå÷5zãÂåÂåÿ°÷ –#‡÷5`ãð•"#÷ üð•!#÷ ð†ð¥ðÿ*ð D ðBðDÁ ÷ ÜõÀ‰`÷LÛN㱇ð•ð÷ Œôð÷ N†÷ Âó·üâ‚·ãÂe·òâ7 Úâ‡ÁeB$&÷ @‡ðµ! Áe     ‰\‡÷ jÜÀ|Á¾Â¸Ý ƒÜà ƒ`Ë‹l—,—,d±±ñÐÝñÌÝÃ’ðð•!#ð•÷ êC‡÷ ÈóÓ$ððÂeÅRÅ ýË# # # ãHâÅHâð p!ƒ&÷ T†ÁuÅ%Á¯÷ ~Å%fÅ÷ 0†Á®÷ d÷ NÎ õÖ Ö÷ BÕÁ@÷ <ôÀ|÷ "w2õDÄÄ 3ÁÂ÷ à †ð%é*æ1ÿˆñ±‡pá° sas ‡&æffÁªÂÃ‘Ñ  œ*‘ÉÀfÜ ÜÅ `Åe @÷ úô‡ñ þÿ !† á± þÿôÉ CbB a(á¡Âª�÷ ®ó…ƒ€‡À(áÄÜ&÷5æàÎäà�÷ 8ôÀØÚÁç÷ 0Áeô ñå‰  ÷ ~Е.Е/Áe ÷ jЕ.Áí˜ÚwNóñµ€ ÁK ÷ (ó÷5 tàÀÜðpàñÅ€ ÷ *ð\à÷ dòÁtÛ @ÜÀ @`Àe ÷ ô†w¾ó÷ ÃeB Ä ùów &·&à÷$à· "à÷ à‡· ,àÁ÷ ˜ò=÷ ^ñÀ|÷ ¦ñ÷ B†÷ ¶ðw0¦Ý· þß÷ Z w@–Ý÷ „ñ÷ 00 ÀMM§3eaek›’8†÷ šðÀ÷ rñ÷ †÷ ‚ðw0rÝ÷5¤ß· Äß÷ \÷5”ß w@TÝ÷ Bñ÷ ö†÷ Xð€‡÷ FÙ·  ßÅŒßÅŠCaB ÷ ñ÷ ¸†÷ ,ðw@Ý÷ ñ÷ ¾†÷ ðÁü÷ Üñ‡÷ ÙÁ/÷ Îñ‡÷ úØÄÿ ƒdÄ ýÊðm0ßp ÷ ¬‡÷ v‡÷ `‡‡Áfw~ñ÷ ¾ØÀÜ3 ÷EâÞ„ð E÷ B ‡÷ ,‡ ± Å ýt@þÿ‡Áfw<ñ÷5 °ÞM÷5@¨ÞFÅõõì õõ$fÿˆ8‡õõª õfÿˆ,‡÷ ÊÞ)Ä�>ÞÄ¥Y!Ä¥yÄ¥NÄ¥nÄ¥QÄ¥q÷U 8ÞÄ¥GÄ¥g÷U@$Þ‰º÷UÞ‡æ÷ œ÷5ÞÂm´ØA ƒ ÷ "‡÷ €ÃªÄ Óe\^ü÷ w(í¦fÁÀÌ×÷ (� ÷ ˆÁ– ÷ Á¼Ýº݂í� �åŽf� ÷ b–%Á¦ ÷ îÁÜ ÷ LЕ.Áíz×÷ 0ð‡&ÁÂ’÷ \ïðxÝÄfÝÅdÝÃhÝ  €÷ `A Åå„ à ö€‡÷ „†÷ øíw  Ä ÅÄÃ’ÂÁ¡ †€ Å  øÄ ó‡‰1zÀ$Ý€ÀwзþÜ÷ ¸æ„ææÿˆ7ŠƒÚæ& & æAÿˆÀ&ææ?ÿˆÀmöÙÀíÔÜ€ÀÿÀE @χ7¾Ü÷¼Ü¼Ü7ºÜ÷•ÿ×÷ÕKØ÷Õ Ö÷ÕúÖ÷ÕT×÷ծׯ~ÜÀ÷ ̆‰«‰«ÀÜ0 0 0 0 0 ÷ ¢†‰Ã‰ÃÀ|÷ Œ†‰Þ‰ÞÀ¼÷ Êí÷ r†‰ý‰ýÁÜÀ(ÂÜ÷ ²7 Ü7 ÒÛ7 ÒÛ7 öÛ7 þÛ÷ †wÎþÀDðŽ×ð†×÷ �7z׆÷ rÁ†÷ ‚n‡ÂœCD±•à ýCD±•à ýCD ± •à ýÁÌ÷ 8I‡Áp÷ 4D‡÷†NÕ÷p¨Õ÷pbÖ÷ÌüÕ÷ Ô×÷†�Õ÷†JÖ7 &Õ÷ Ø7 ÜÕÁxÕññe ñ5 ÷5èÚ‰F ÷5ÚÚ÷5ÒÚ ÷U@ÎÚ÷5@ÄÚ÷5¿û¼ÚÈé‰6‰óÁ*Ô÷ À®÷ ÔÀ<0 b÷ †‡ð fî‡÷ À<‡÷ Jå÷ D÷ ä ±‡w ^ ð¥öÿ`ð¥üÿ` ð¥ýÿ` ð¥þÿ` ‰Ê±‡‰,‰"æ‰(4÷%XÚ÷PÚ¡‡ææ·•~Ö&7 fÚ7 dÚ7 bÚÀDðf ¦Â¨8÷ ö ‚�%‡1œ ð ñÕ 11 1 1 11ñÚñÚñþÙ¡€‡¦6Ž Î5  Î5œ*ð‹+€Äå€Î5ÀUÎ5 …Î5 õ Í BBCU%Í BÕ  ÃúvÁ<÷ $Ö5 €÷%DÙ÷<Ù÷4Ùè Å87 ‚ÙÁ ñµ · rÙÕÕæUfUhÕÕæ¦æ&&Á<Ò÷ *Àæ÷ 2ÒЕ È•-”È• ‚ Àb Á÷ Ì †¦‚Áë÷ ä Ö ÁåbBÃb•Ã6Õ€Q÷eðØÀ5)ÀE$Ì %& ÁeÉ ÷eÆØUUÕÕ7÷ ÌÄ & Õ6"÷e’Ø Õe\^$%÷ œð5R÷ ÈÑÿ ÂÑ Õ9ÄeHÃà ý�À¢Ð -Ð- ÷ ¦Àå¢Õ¢ Õ6ÀB Â8Á"ØÁ A ÷ ê & & & & fæB & & & Î�¼ææ¶æææ ÿˆ‡æ¨ææ)ÿˆƒ‚‡Ä Ì ‡%÷ V UÂ6•‡Â8 2ÀbÁ¹÷ x BÃb‰¦B Áî÷ 8†&ÁÓ— €Âå€Áæ ¦‚÷ > Ö �å‚÷%×÷úÖ‡w   ÄØ& æLB&æÿˆa‡ñ  Ä Ì ÷ ÈW‡111É D÷ °K‡÷ Ö×÷ ¸Mõ€÷ ¾?‡„Ä ¡ „ „ „ ÷°×÷ ’ÕB ÕU% ÷ ” ÷”×÷ vM÷ ‚!‡D ‡…Å ÅEøÿÅ… … ÅeB Ä@P•Ä üÀ Áà ÄX×& æSY&æÿˆ † ÄB×& æSY&æÿˆ±‡÷ (×÷ 5 ÷ ‡ÅB æ% Î ýÖ ‡æ* ÿˆ ‡æ׿)ÿˆ÷‹Ù±‡Æå €&æ?ÿˆ,-fW >5‡W E5ƒW ¾s‡W Ås ƒW !€ ‡W 8€ƒW >€‡W E€‚�W ¡Œ ‡W ¸ŒøƒW ¾Œ‡W ÅŒòƒÖ $|³Æe ‡Â є ý‡w þ5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ ìœ*AdBbAÁepÂ& ¦fƒÂÁ ÷ À– –‡ÁPõµ aA”Aíf@pnp÷ >C*8Ö‹Á ÷ €88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ üõÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw "õ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ Æ5fµ fˇðµ ÇÈ•÷ ʇðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ ¾DlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ ½•8 †õ¥öÿ*Έ4Î\4‡w äõ 8µŠjDl@÷ ÔT”ÔÀeBTŸ8œ5l@÷ &‡@Á(ñ D÷ |ÁeB&÷ ‡÷ ‡& ææ©ÿˆ@ð•#÷ & æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡Ñ(×'&ÿÿæ1ÿˆæææÓÿˆ‡¦Þ5Îe‡w ^Á,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡wœù è¨7§7ÿÿÿÿ¨800 ÈMÊMl1DATADATADATADATADATADATADATAñ|9æ.7ÿˆ×-¶Æñ;‡÷ ȦƒD- ‚ŠEŠ… %µ¬ Âó … Â ÀœÁÀ À À ÀU€À �€ÈEðU€Ö ‡¦Ê5‚ú‚‡ò û¦¦‚ Ž Ê5ùÊUŽ‚öÖ ‚å;27 @:ê9R7`9‡ÊEò ÊU ‡¡*‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡&æf…Þ ƒ„…‡&æ¦ff… Þ �‚ƒ„…‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡‡æ¼ÀXÀæ¼À Àæ¼ÀPÀæ¼À€Àæ¼ÀÀæ¼À àæ¼À,àæ¼ÀLàæ¼ÀPàæ¼À`àæ¼À,Àæ¼Ààæ¼À àæ¼ÀÀæ¼À$àæ¼À4àæ¼À´Àæ¼À(àæ¼Ààæ¼À8Àæ¼À|Àæ¼À$Àæ¼ÀLÀæ¼À<Àæ¼ÀHÀæ¼ÀÄÀæ¼À\À|³º~–,¿>¿>Wû W  &[qÀÿÿÿÿ W 2ŠÅ ¦TITISYSYTICLWKOV–°VγøŠêb ” γ°Vγ÷5‚w¸w¬f&¦‚Þ €�‚‡†7ÿ¦p TKB>Ñ̆¸"  À @ à € €%2€>K€Wd€p}€‰–€¢8©°©(ª ª«�«¬€¬Ð¬x¯ð¯h°à°X±Ð±H²g³p³z³ÒW %<²ôT¯”DSYSYSYSYTICL^Ø#TKB -- *FATAL*-Run abortedÀöÈ Ð·Zü÷øþÆPüÅpÄ@÷ † Ìe÷ – Œ ÷ ˜ ÷ œ Œ ÷ ž Œ Í5÷ š ÷ ž Œ Í5 ÷ š ÀÈþ÷ ¦÷5~þÖÀû÷ –À°þ÷ ŽÀ�þ÷ Žw – ÷5bþCŠÃÁ‹ �ÁÅ€÷ t ÷ tBÁŽ÷ f‡÷5€0þ÷ âü× †×-Fþ †÷<þ÷5þ÷.þ±‡÷$þ÷ r÷ Â÷5€îý÷  üwVÿÁpÂ÷ wVÿÀ P�æÿˆ‡wŒfû‡ÁÂû÷ *÷ °È²ûÁ°û÷ ÷  È¦û‡f&f÷ 7Jû�÷ úwŠû7†û7‚û÷ 00ÐMM§3eaek›’À‚ �� �`wjû ÷ äw^û ‡7,\û‚ó‡7,Tûï‡  ±…‡æVÂ0Þ Â0– ‡Þ æpõ@‡Ð  � ¦÷ ~‚¡Þ ’$õ€ò þÿî’$±öfE7¦ú÷ 4€`Â0 æZÞ Â0 ‡5,‚÷‡5,ó‡  ±– …‡Á6 u$†· ^ú†‚ ø ‡ 1,ù‡‚1,ô‡J ‡±1,ù1,õ‡Áº÷ &Äbúô Äeø� m÷ ¬7Dú„¡Þ &Ä8ú÷ ”e$â$)d÷ ‚÷„±‡÷5ü‡w , & ÀÅÄÃAÁ ÷ ö7òù@m7èù÷ *1 C7ŠÜù÷ øpMŽ ÷ $ð w" ÷ ð ·Š¨ù7¨ù /÷ ôð *w’ù÷ p÷ L7‚ùw€ù ÷ Ò÷ Xƒ`÷Šdù÷ Òô·ŠVùÀTù÷ òÁefA÷   ÷ ^w:ù÷ ø7.ùw,ù÷ ~÷ Áù÷ œÀ ù÷ z& &Žì—%ƒ÷ –N õÁèø÷  V €÷ ÎÃÔø÷ ÷ 2Â÷ TÃÄøÁÈø÷ ðs÷¬ø¬ø÷¦øÁªø÷ zÄewºþ÷ ~÷ ‚÷ Ð÷ A÷ ~ø‡CàÀ*ÂÁ ÷ ’  ‡w †CB�±÷ ¶÷ Zø‡‡÷54ú‡w `ņeCå %EÄÀ& 7 .øB�d÷ |÷ ‡wø�ãdd�cA�cAdã±Áì÷¡– 7Ö÷‡æA÷ à&ÀeÐ Ð Ð Ð ÃÂCmõ †ˆ &�‚mŠó€ƒ‡æŽ`ÎeÞæŽ`Þ‡÷‹ˆ÷Ó Ãƒ`ƒ ¡±‡fà‘`‰²B`Šá ‡÷ J¦÷‹P÷ ÷ Òÿ‚÷ †æ÷ °ÿæƒ÷ ”ÿ÷ *÷±÷ ¡ƒ– ‡‹ ƒàò ² ‡ ±`p ð ‡f& €`ð,ø‚ ‡ð,ó‚‡ð, î‚& �à� �mV ‚– ‡·*õÀBæ‚ã‚ �c€e ý‡ÀÒ" &àe·#rù÷ D€÷ Šð‡Á(  ˆ‡&÷ ÁeB—%þÿÁe‡1bÀe1^1\1H1J1L1N1P‡&&f÷ t�÷ ¤ÿ€h÷ ˆÿ÷eþÿHö¿DöÞ ÷e<ö‡w ÷ â‡EÅÁ‹Á÷ ÔÂæ÷ AÑÁ B` ðØ÷7Ò÷p‘AÁ÷ w”ÁL ÷ &ùw ¼EÅ÷ p†Á÷ ŠÄœ÷ BÑ „` p‘÷ ‚ð†÷7€÷ð~÷AÁŠÅÅ @aÀe· n÷· f÷‡Áe?ÁE? ‡& fŽ Ž Ž Ž Ž Ž æYÿˆ‡· :÷ · 4÷Àž0 úBŠÂÀ÷ €`±¡ Àž±¬ùðôö‡w òfÀ* ÷ òE†Ã¢Â— Àÿ †Á@÷ jÿ‡w`RõK`/ËÿÿÄž Ãÿÿ& D -ù‚ô‹öNñ ±òµ÷ nÃxö €ÜÀ ` ƒ³ÁÀ*÷ d�µ– – ‡·¦ò÷ ÿ‡°Š‡·–ò÷ úþ‡ðЇ·†ò÷ êþ‡ðÕ‡BÁö¡ B — ‚ @€` ‡Š ƒ‚ B`·ìõ¡±‡¦÷ *þ÷ �ÿ‚‡·2ò€ ÷ þ÷ œÿˆv  ÷ üý÷ ‚ÿ€mˆ‡¡ �`÷ äý±@÷ Øý¡‡X&À×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ ÞÔÆ"ÿ ÖÔª%ÿ Îì'ÿ Æ%ÿ ¾@Ðÿ ¶Xˆÿ ®pîÿ ¦”Âÿ žÄšÿ – Šÿ Ž0 3ÿ †0J4ÿ ~04ÿ v<À3ÿ nlÖ=ÿ fxØ=¦Þ5Îe‡w ÀÁ,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡wù è  ÿÿÿÿ Ê5¦ „Ê €‚Ê5ùà ÷ƒõ…2Å Å ÍUEÍ ø�‚‡ ¼ Ķº‡ÊEò ÊU ‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡&æ¦ff… Þ �‚ƒ„…‡&æf…Þ ƒ„…‡‡ ¼È �¼t Ô¼@�0"ÄÈà�0"pìÈ� #àø� #à� #œàì�0" ÈÔ#�P(´('�P(L4+�P( /�¼È¼L;�¼X¼È<�ÀÀLdJ�À|pLÄL�< |d”P�HìpˆZ�Hp p|a�<\  dph�˜&À”¬l�˜&¸”¸o�˜&¤” r�Àø ÐL x�¸"PÜÄ{�(hÐè€�(€Ðô„�(ôÐ܆�¸"ˆÄЈ�ÀLLX“€2$`“�€2ä0”�€2l<–�€2ˆH$˜�5°<Tœ�5È<H¡Ð=l„¡�Ð=�`x¢�Ð=Ä`l£”>¼æ¼À àæ¼À|Àæ¼À€Àæ¼À(àæ¼À$à€SYxQSYâySY^SYº~xQSY¢_SY»zjL¢_LB[1,1]²SYÄCC@VDAVLB VSMPVSSVMA€WDL`VSHpSPqCR@pMA€-WI pHDWPIVCOxLI xCP€WDAVFP@VMM€p³PIVPRV­SQpTR€VXT€p¹ACV­EA VHDWPM@VSL 00ØMÊMl1DATADATADATADATADATADATADATAVMUVFUpROqAL€WCMVSEWIPyNMxCOxLI xSGyXHpIDpELxFMxCL xSBrFO@xt{‚‰�—ž¥JÖ(&ÄÊÖè<è^ô5b÷ â ÷ Âw¶ÀtÁŠÀeÁ û‡w ~÷7 ²ùÀâéð5 b$żÃmæ ÃeÎ Ë‹úÀ÷ € ±ó ļ! Á"÷ (ñwjù¡ü– ‡ñ•ñ•w ÷@pdf ¦Â ÷ :‚�B„œ$‡Äµ4ĵ!ò%'‡ò% ‡ò%‡E$ÂeæƒÕ�@à P”üÎ öÖ ÁÁ7Âe Á:Âe Á8Âe÷ æé±& ĵ€ V ‡11@÷ ˜†BÂeÁ÷ ¶é±‡w ,ö5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ 0œ*AdBbAÁepÂ& ¦fƒÂÁ ÷ – –‡ÁPõµ aA”Aíf@pnp÷ êC*8Ö‹Á ÷ Ä88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ ´öõÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw Pôõ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ Z5fµ fˇðµ ÇÈ•÷ ~‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ võDlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ ̽•8 †õ¥öÿ*Î Îô‡w óõ 8µŠjDl@÷ ˆT”ÔÀeBTŸ8œ5l@÷ Þô‡@Á(ñ D÷ HÁeB&÷ ‡÷ ‡& ææ©ÿˆ@ð•#÷ & æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡ÿ NñÔà$ÿ Fñà^#ÿ >ñ0J5æ¼À8Àæ¼ÀÄÀæ¼À,àæ¼ÀXÀæ¼À àæ¼À$Àæ¼Ààæ¼ÀLÀæ¼À<Àæ¼ÀHÀ–”>AJ"?J"2–¢"¤"©"LB[1,1]ODT.OBJODTID.OBJP.@ w Üð÷ â÷RàXà÷]Fà–âÄ4ãÁ,÷ Ü÷ ІwäA÷ @ú÷‡ôàb÷$àrâ÷ àfâôà&ÃúÿôÀ"d3 ð3 :"ÀeBÁ Á ýA÷ Nù‡÷ D‡÷\Æ"&âÃ%úÿô5b÷Eâõ5 ÷E âõ5÷UþáÀÌá Àå� ƒÁBÂe÷ rã÷ 4÷ ®ë3:"sð× üÿ]À@@ÀM¸áX7 Tà7 Rà&&$&ôµ!ôµÆå €&&"æÿˆÆe À5'÷Ulá7\à7^àôX&$ÁÆPP÷ `†÷E@BáÁ¸Þ÷ (ëw(à÷ ’÷ ë7îýw Þ4 Pô@þN÷ xw”Þ$°´&4 bôe&Ãew˜þÀ²ýÁ°ý ÃÿíBÂ@°PÂ@±PÀêÂ÷ ®ê úôÊdôbÞb÷‚jý7 dý÷ À†Á ÷ 0âw÷À*Á,B÷ ¼ð&&&$ÁðÝ$÷ æèð5÷5bà÷ ˆý÷°"„ýô–"$÷ Š(‡ðb÷ –À&àÀe5Â÷ €ê÷ Îàô”&ô¸$7 ºà÷ R‡÷ dw¬àð¾Ý´$´&‡`Á9÷ †á÷ .†Á `÷ rá,\NL¡±‡Àdà÷ ´çÀXÜ÷ |ù‡ÀNÜ Á2ÞBA°bpd÷ ‚÷‡fîwöh· ö�` Š �ÜÁ�ÒÁ%/ -Á%/*Á%//$Àö¡‡œ`Â¥öÿÁÂ¥ÿÿÁÂ¥þÿ00àMM§3eaek›’ ÁÂ¥ýÿÁ Â¥üÿÁÂef÷ ¸à÷Uß±‡ÂÚûÂeÂE ÷ Ðçæ>"ÿˆ&ÀªÙæF"ÿˆÀmÞû€ ‡ ÀíÒû ‡ÀíÊûž¦ ÊÀûà�bŠå‚‡÷ öÀÔÁâ Á ý· ¶Þ÷\ܤÞ7 Fß7 ÝÀ:ß8 f÷ †æ7 DÝÀ*ÁôH ‰·2ÝÁþÿæj"æ?ÿˆ÷xûLÞ÷%DÞ 7 >Þ÷ <ÿ·ÝÀ ÷U€@Þ÷U€:Þ÷ ºW‡÷@Þ7 "ß÷ .Þ÷ 6Þ÷òÝÁf÷ 6æwvÜÁ‚P” ýÁ÷ æwæÝÁ÷ æwÜÝ÷UàÝ÷ Fð• ðÆÝðÂÝ w´Ýw^Ü7RÜÁe @Á Ü÷ à÷ ðß7 –Þ÷E€¢Ý÷¼Ý÷ Ü7 pÜ7 nÜ÷^R݇ÁK ÷ ßw ®ëw¦ÝÀ¤      ÷ˆÝ7 ˆÝ7 ‚Ý7 ‚ÝÀ* W, (‡Á÷ Œ7bÝÁ÷ €7XÝÁRÝ À^Ýæþÿð8úð•#÷ | †ð%è* 7 ú ï�7 úìŽ ÷ f‡Ž ±€‡÷ œù÷ "ý%‡A÷ –ôö‡ñµ ÁÂö÷ TÞë÷Šrù÷ LóÀJÝAÿ dù7^ùÞ‡÷ Ló†ÂöÁN÷ &Þ‡Áòì÷ ôä&&÷ �Á9?‡ÁZÜ÷ Þä÷ dæÁÝÀePHHJ÷ ¾ìˆ ÷  ð5@÷ àÜÂöÁ wÐÜðâÙ ðŒì ÀÜÀe5Â÷ `æÀªÜð¶Ùb÷ ÿ ‡÷ Ö†Á9`÷ †Ýî‡À„Ü&&ð5 bðv&÷ °&‡ÿ jé$4ÿ bé$4ÿ Zé$&4ÿ Ré0 3ÿ Jé0@3ÿ Bé0N3ÿ :é0ª3æ¼À àæ¼À`àô5uuuu w Dð÷ "÷ &w*ÁH"A±q#úq-ö‡ÿ Œïì®$ÿ „ïøÞ#ÿ |ïÖ#Ö¯Þ%1±Ró%“±Ì&ß±à`‰&ó¯Ð—&N$3ÿn$p TKB>l^SY†7 –ý÷H"’ý7 þÀ®áÀe`Á¾# ý÷ ˆèÁ2áñ@bp$$À~á0 b÷ bø@‡Àef7ôö` Š÷ –È¥;ìÈ‹êÅÖ#% % % % ÷ „Â¥:uu÷ j÷ nÀ & ”W¤ û‚ÿ ¤öÁ ÷€e)Á #I#q-'ÁeW ¾#õ‡Á$0Âefœ`Á × üÿÁ× ÂeâÿÁ × þÿÁ^× öÿÁ ÷ TáAÁ5 Â¥;U%ÁEÉ ‹Á#wÖ ÷ øüÁ(w we)÷ ´e)Á(Í ræ æn'Ä�e)÷ †e)Á)Í lÄ æ æ$'÷ ¼U%ƒ Â¥;Â¥,Q÷ \÷ Pe)S#S-ã Ó$Ë ÷Á*IÄÂË ã€ÄÒáÁ ÷ ‘%‘QüÿQ *& ÷ NüÁ&1Í &f÷ JÁPõÁe f÷ ä�Ö 7"üÒ ÁRRRÁ,õACà`Ãe ÒR”þ?jû7fû‡Á%÷ ~ü†‡Á'Âúô÷ à·öÚÀfß÷ *ø÷ ‚îÁ¾#ÂÀe`P ý‡£ &€ÿ,@ÿ 3ÿ@8€„K@oMBaÿTq ÿØrÿt@,ÿYeÿÜYxx@ÿßY`èYè5ÿ €ë0 3ÿ xë0F5ÿ pë0„5ÿ hë0J5ý¨X[<$09AZ (),-*! 4%†$À$J$ú$%\$Þ$Þ$Þ$7 ¾ÿ7 Êÿ7 Èÿ7 Xþ7 ìß÷¶ÿÀL" P Ì"ú‡ÃN"ÀÔ" #Ä^#À¾þ$$÷ :Å®#B“‚ Á Á üœr00"IzÈ#Ã%N"U÷^ÿZÿ7 XÿO× N"÷‹Jÿ8÷€Dÿ÷5€üàM÷5ôàI÷öàE÷ ¼ý÷ ÿ· °ýÓ$× Ì"†Í¥pÍ¥&ðÕ€7 øþ Á-A#÷ ~ý÷ xýã(× N"†3Á%2°#Õ¥J“ÊÅÅ °Ò÷ ¨þ÷ Hý° ·ÖÞ#7 �þ ÍEwÿͥ°#J�ÊÅ·nþî#× N"Á.w‡È‹È¥;!Z#†%õ ‡ÀÐ"ü‹9ü¥;5Á¦#H¤1H¤/H¤-H¤‚H¤)†H¤‚H¢%†Å”u ½#Å ûÁ+wª÷ –ÿÀÌ"W­Ã#ÀØ"W­Ã# Á÷ ¬ðp�Ã#‡Å´#&÷ ¤À e)È¥:2È¥./È¥[,È¥<)È¥/&�ãW !†÷ Tý‡Ö ÷ &ÿñ‹ fAœf÷ J…‚‘”Å ý‡!Þ"ƒdd‰Á,w€Åp& ȋȥ-È¥)È¥(È¥*Πȥ, Ž È¥[Πȥ]Î ”âÖ Z÷ ¤þÁ,÷ ÒÅåpðpp÷ ØJ‡÷ JõÀHßA÷ ºõA‡÷ NõÁN>‡À*Á,B÷ ÀîÀ$ß&&ð5 bðv&÷ r°&`Á90‡÷ pð5@÷ ôÞwîÞðÜð¬î ÂÚÞòæÛbfÁ÷ 6Ñ Ñ‘‡Á%ÂöœŠâå Àe 2÷ –ßÿ žë$4ÿ –ë0 3ÿ Žë0@3ÿ †ë0F5æ¼À8À00èMÊMl1DATADATADATADATADATADATADATA1±o†?±y‹%J%,%J%L%&%%€&Z''ÅH"÷ 0Áß÷ ê7Îÿ7 Ìÿ÷€Èÿ÷5¾ÿ÷EºÿÀL"Ð P Ì"ú‡ÄN"Á@á÷ ”ë÷ Jë÷ æÁÞß÷ >ë÷ *ëÄL"÷ Î%!Ì"ù‡À@÷5hÿÀÕ7Hÿ7Lÿ÷ á÷5Nÿ÷þßÁüßW  Á � Á CÁ ÷  7ªàÀ`7ÒàŨ#÷ ÷ <ß5Å #Á²à÷ ë÷ ¼êõµ· ¤ß´ dÁ÷ ÊèpppðþÞ ÀzàUÀe÷ æâ÷ ÀâAÁåÀh÷ 6æ÷ fäÁTà÷ Rê‡ÁøÞ÷ Îè7æÞÜÂEzÀ#ó5õUÀð¥æƒ÷ �ã‡÷ ä÷ üé÷5àp  p´´pp��õµõ f&÷ f€°�p÷5Öß&÷ N€°´p �ðÕó5õUfu°p ð4Þ7&Þw*Þ÷ vé�÷ öç÷ |éðÞÁñ¥<ƒ÷ ÐfwXÀð¥2ƒ÷ ÷5Nßp  p´´pp��÷ éu ðÄÝ w¾Ý ÷ é÷ é÷ z÷ „ç& Á¢Ý÷ òè�÷ Bé÷ øèw�Ýw�þÁÁeÁå@Àe÷ îá2†Á÷ úæfðððœðÅó5ðÕÀBÝÀe ÷ á†÷ Üà÷5’Þ Á÷ D°ÁÝ9–1–Ö õ G@Á÷ Üæ÷ bèw ßÁe & NÎe ó5ðU ÀÔÜÀe5Â÷ €è�õ !÷ –æ55ó5õUõÅÛÿõÜ÷-”ÜäÝõÅõõõµóµ€÷5€ÌÝ÷5ÄÝõÕ÷ 8uµ�÷5ªÝ÷ $u µ´w8ýÌ%æ*Ü÷ *ý�Ì$)‡Á÷  åð]Âû · ‚ݶû÷e°û‡E B�œÁE€ÿÀ*E÷ „íÅ ô‡ÿ èê0 3ÿ àê0ª36(>(&(&(&(&(&(&(&(&(&(>(&(&(&(&(&(&(&(&(&(6(F(6(6(6(6(6(6(6(6(>(6(6(>(x%&(&(&(&(&(&(&(&(>(&(6(6(>(&(>(>(>(((6(((6(î'î'(þ'6(ö'®'>(6(>(&(&(6(6(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(>(>(>(6(R,6(>(>(&(&(&(6(>(>(Ÿ s1"P(£ @€–,A#w šî÷ Î÷à Þ÷5Tà ÀìÜðÅa÷Ú$ÊÞ÷ ”‡7 ÀÞ•!Àp÷ bô‡&ü „øÀºÜðÕa÷ ûÀßÀm ߀  ƒ÷àw^÷ ÂÀ ÷ ¤‡fÁÔß÷ Xè÷ Þé�‡¦÷ èÿÁ¾ß÷ ¬éÀed7úþAÁåÀe¾ÿ÷ Èâ1†Î‹· ¢Þ¿ ÞþÁ÷ Èçpp°UðÕ@pMððÝ Àlß%Àe÷ Úá÷ ´á×-pÞ Åå AÀh÷ "å÷ Rã±‡Ö ‡·ÔÛÀäÛðÕa÷ @úÁÂö÷ Îà‡w bí÷ vw Xí÷ lÅæÝ Ä.Þ÷ r7"àÞ7,ÚÞ9ÃZ7Žü÷EõÿˆüÃA3"3,'ó5@ó5îÄÄEõÿÄ-XüçÄÅ ÷ à #ÂŒ   B`‡ „ ‡E ‚Ö Ä¼ýÔ Äe3#3-Å õ±¡‡÷ NÞ±€w �ì&ÄDÀü$Ä%æ%ÿˆ ‡Á&ÂÊû÷5Æû €‡w Tì÷ÿÿ´û& æþÝ· ªû¦�÷ Jè7”Üw˜ÜÍ �÷ jæ÷ àç& íÖ ¶#ê–%÷ vû�÷ FæóÖ ‡ÿ në<-ÿ fë$.ÿ ^ë(ú(ÿ Vë(ô(ÿ Në(ä,ÿ Fë(†-ÿ >ë4ž(ÿ 6ë4æ-ÿ .ë4¾.ÿ &ë$H3ÿ ë$â3ÿ ë$ê3ÿ ë$¢2ÿ ë$(3ÿ þê$Ú3ÿ öê0 3ÿ îê05ÿ æê0„5ÿ Þê05ÿ Öê0J5ÿ Îê0:5ÃSwÊý Ä·–ÙÁÁ Áe ÷ ®ÿà wêwZÛ‡·zÙ@$à ÁÈ "ú‚7$lúƒ7þÿdúÁ óÁÁ Áe÷ pÿ?°Û7¬ÛÐ PAPÐÐ�Pà ý‡Ã0wRý·&Ù÷¢ÜwÛwÛ÷@ÛÅú÷ ¦üÁjÜwhæW#€‚Í Í w*Û‡ÃTwý÷5€ZÜ÷âù7 Ü7 Û7 Û÷ÿ$ÛÍe ‡ÍEM M M MŒÍw Û‡·¬ØÁÁ Áe÷ Äþă ?ÚÛ7ÖÛÐ È(ûÐåPPPà ý‡·vØÁ $·lØÁœ$ee·^ØAÁåÀ^÷ P߆Á ÷ jþpppÀ^÷ ßp‡·"Øæ‚“÷ ´û‡Î ðµ· rÚ¿ ®úðÅ ðµ÷ ZÚÿ –ú°Óp÷ RåÖ Á:Ûw8å·Î×& ÖwÚwÚ‡÷5 8ÛÃmwØûæXúæ00ðMM§3eaek›’VúwPúwNú7 LúÀ~*÷ èü·>ú·8ú÷ 8úÃlw¦û‡&À€Ù7,ú 7,ú ÁtÙ÷ ÔäðU· ú€‡÷ÌÚÀZ×ðÕa÷ ¶õwôüÀH×ðÕa÷ ¤õwêüÀ6×ðÕa÷ ’õ÷U�ÚwâüU%Í W# †w†Ùw€ÙwzÙ‡w:·ìÖ@× A÷ îû@‡$Á5?7Â5?3ÂŒB B B @÷5€,Ú *·êÙÁ=¬÷%Á ÷5€Ú÷5ž÷÷ Ôú‡· d؃÷5Š÷7ÄÙ7ÂÙwÙ·°Ø·®Ø÷j÷‡Ã@ÃRw|úW#ú‚w˜Ù‡Ã5whúÍ w®Ù‡·4ÖÀÌø  AÁEøÿBÜô$C ƒCÀ ö·�ò×÷�bÙ‡· ÖÀ¢ø  AÁEøÿBÜô$C ƒCÀ ö·�Ê×÷�9Ù‡w>Ùw<Ù‡w\ÙwZÙ‡U%Í W# †wNØwHØwB؇Ã6wÖùw.هХ[÷ 8Â¥,å‹f™÷ (�Â¥]å‹U�÷ °û”‡Ö ÂöÁ÷ |Ú±‡&÷ ŒûÂ¥.€å ÷ Žû÷ ‚û”Ö ‡w#Lö‡W#ú‚w¶×‡Ã1wVùW#& W#BaÃwBù÷ä HÖ‡÷à @Ö‡wòúW#ƒW#‚÷vØwlׇÃUÛ·äÔæ·ÜÔ& Á÷ öú°?fØ7bØ PH‡Â pÂ¥;mÂ¥!÷ šÈ¥;eŪ$÷ „Â¥=7e)Ä#t#t-Äe !–$ô‡Á87 ÷ È‹-È¥;*ÃEŪ$· îöô­êö÷ 6Û Â¥,Â¥! Â¥;Â¥:éÁÁ ô5Á ô­¦öÁ!ÂÔòÕaÀÔ÷ jòÂö÷ úØÅª$Ãzö¡±‡w ~å&Á"÷ fßwlö7föÂôˆJ· °Õõ•ÿÿ€fÅe& ÷ žÂ +— ;(— !%— ,— :)Ž —£%êŽ —£ …Õ ÷ Dµ“þÿ¶Š— ,— :Ù÷ D— : ô—£ö‹Ö …5Ї–%ÁÂöw2Øÿ :ä$(3ÿ 2ä0F5ÿ *ä0„5ÿ "ä05ÿ ä0J5÷ &÷ &÷ �’•’•€‡@Á(÷ øf€  Àe ÀeÉÿÀe Àe ‡&æ¦f&¦ v Þ €�‚ƒ„…‡LB[1,1]LB[1,1]0+&+Ì,0+õU,÷ šÿÀÝ÷ `äÁæÁeà÷ ,7¤ÿÁÀ¼( Á ýÃB÷5Öù÷5Îù7÷€Šÿ÷SY’ÿBÂe÷ FÁ¼(ÂÀeB ýÁeâÿ  ÷âyXÿB,D.�&Î Î Î Î ‚ÕÃC! ‚ÂU@÷5€ÖÛ„    w" Å ÿÃDÀZÜð•#÷ Ê ‡ð•ðð•÷ º~‡Ãd÷5ù ÷ Ú÷ ~Ûp÷ vÛ÷ nÛ Ãcñ5bÂU÷U@ZÛñ5€ÂU÷5€@ÛÂU@ñ5 ÂU ÷ ZúÂU @ @ìÀEÿÀ @ @ @ 7�FúQ$@ææPÎ ý– ð5øÿðU@øÿÎ ñ– Å*þe)µÀÂ(55÷5€ÈÚÂ5uí uí ÃC55a 5a ‡À@Û÷ ¼êÀ6Û÷ ²êwè÷%tÙA‡7 Úý÷ ’7 ÎýÃGÀì(AÁ5·fÚ÷U@dÚÁ5@$Á5Ð X ÷5€BÚÃPAÁ=Â÷LB BàÂe@ÂE?B B BŒÂ@$õ5÷ Üú÷ àúÃ=¸‡ÃCÄ^Œ #‡wHAW ‡wèÙ÷UàÙÃ\Á¸ØAmí‡w®ØA�÷ îøw "ýwýw`¬ØÃXu-÷5.÷zC÷5@–Ù Ã5Ã5€€õE€Á ÷ @, Ð U%ÁPÁ ý÷ `Ù÷ 4÷ Ô×ú÷ ÷ &ã0(fÁøÖÁEÿÁUÃ5ÁU€Ã €ÁU÷ ¢×ðJø*ÁUp÷ ùÀej1ˆ�`÷ äâÍ (e)w^þÁÂ(QQ ÀzÙ&$&&°$ð¼(&÷ ˆ‡°&°$‡–%– BÂeÁ>w@Ú÷ Rù7  ØÂâûÁæÀ*wÆèÀ&Õ Á ×BA°bpd÷ Zð‡fîwêîh·äî�` Š �ÜÁ�ÒÁ%/ -Á%/*Á%//$Àö¡‡œ`Â¥öÿÁÂ¥ÿÿÁÂ¥þÿ ÁÂ¥ýÿÁ Â¥üÿÁÂef÷ �Ù÷Uî×±‡÷ ûÄ÷Ū$fB�Á Á ýõÜ(õõÞ( õ 5�.ô‹€õU€.5�-æ¤$µÄe& €÷ dú÷ ^ú�@ ѥ ûÁ àu÷ èúN#N…à áÄ|ö´•–%7 rö÷m¨ú<Ö‡ÿ Þä$4ÿ Öä0 3ÿ Îä0:3ÿ Æä043&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡æ¼À àæ¼À$À?ÿ @`€ Ààÿÿ_ÿ?z(Units set to maximum assigned***æàæ=ÿˆ÷5ÂÜ÷ÆÜÀ¼ÛÀm²Û  ƒ÷%²Ü ƒÁV U÷-šÛ"ú †÷ú�ÛÁ1Âv(÷ ÞÀ`Á,B w,pÛ‚ H`Áeó÷ÿÿ6ÿ÷ÿÿ2ÿÁbÛÂÛ÷5Îù*÷5Æù& ÷ Èý†ÁF‚÷5€Ü ·ÜÛ÷ àü ‡Á=˜ù · jÚ‚wÛ·ÆÚ·ÄÚÁQÂD÷ „Ý ÷5€àÛ;÷5lù+Á ï÷5`ù%Ä Û"Äå5Ý](R(5Ý](P(÷5¶ÛõÕ€R(õÕ€P(Ä 7h(²Ú7h(®Ú´ p(Ì‚mh(·PÚ·NÚõÝäÙR(õÝàÙP(÷ ¦µÐR(µÐP(Äþÿ÷  & & ÀZdð5@t,*$õð5t<*îí ð5€  ÷ Z00øMÊMl1DATADATADATADATADATADATADATA c€ÁHúAœÁ Ab(ìN ׇN6Ó÷5€òÚ  ð5… ð5€ %÷  �ð5@ð5 ¦B÷ ¦– Áf÷ LÜwØÃØùB÷ Œ�s�œ÷  ÷ †Ow4‚€tò* w. ð5… ÷ Pð5€ ÷ ” �‚    °` °°°`ðU@wÞþÂ`ù‚œ ‚œZ(�� BŒý€÷5Úð5µ°P(µ°R(ŒU‡Á îwÞü�    ÷5èÙð5µÐP(µÐR(ð5€ Ãøøó‹€ó�¦üÅ ÷5²Ù ð5 w Šü†w„ü ÷ ~üw vü†wpü÷ jüpp÷5€xÙð5 ð5@ðU@p` p`|š(Ò ÁA÷ äÚ÷Ý&üª×÷�!ü¥×÷Ýü ×÷ ÷5¼ö÷ îØ÷üê×÷üæ×‡ÂEÿ B B B ‡B÷ ìÿ� ì÷ Þÿ‚œZ(Á ÂŒ‡û÷5ÜØð5µ°P(µ°R(‡w øæ&fÁôA<÷ (á7Ü÷�€&��æÔ % ,4,à ö–%&fÁ®÷áÖ ðE ðU€40, ôU 0, ð ð5 ‚•‡ÁgÒ wÎÙÁiùÁhøÁkóÀŠ ÷5ØÃl³ T(ƒ³T(ó T(÷ Ôþ� ÷ Èþ‚œZ(Á ÂŒü³ÐØß‡f¦ŽÎeÿ‚÷ žþ�‚‚í÷ ’þ‚œZ(Á ÂŒ‡ûÖ �µ°R(‡Ö �‡ ÷ ù÷âÕ7 :Ö÷|Ö7 <Ö7 PÖ7 øô7 öô7 rÖ7 jÖ7 rÖ7 ,×7 `×7 ^×7 `Ö7 XÖ÷<×ÀòÑ7DB×7 üÖ÷<øÖ7 J×÷”F×ÀZ P ÁŠÔ÷ ‚ß7šô÷5€×÷?†ôÁZÕ Á%‡ÁA A A Á wDÕ ÷ÿß<Õ÷ÿ\ô÷ÿÿ.ÕÀ` H‡Áe÷ PØë·8Ó× †5 × †5 ÷5€”Ö5 @$Á d.‡Aá ÄŠ÷ üÙ†Á ÷ L Ð AÂP ý÷ föÀeAá ÷ XÙ‡ðµ  ÷ 8àðÕ€pp ‡ÃZwÎöÿ Àã0 3&æ¦f&¦ v Þ €�‚ƒ„…‡°ân!p!ü!)B)¸&ɪù¬yN0†ù¬tN°² ­sN0‚ù¬sN0† ­s, ÿŠ ­øt ­~,¤ÿ ­, ÿŽ ­€,¤ÿ­3X ÿ’d¯ªàÒt¦)â*â*€*Òw ÒüÁì÷ ÷7|ÿ ÷ ×-ˆíÀR÷ <‡÷5xîÁXî÷ Üö÷ bøÃ$÷5VîÃ÷ vÃ,÷ n÷5@Fîâ÷ ÂìßÁ î÷ ¤ö÷ *øÃ÷ J‡w Pü÷ ŽÁ®ì÷ øÅžìw ôí@Àe"ÁñKr•@×-öí ‡ñJr÷5äíñ;r÷5Îíñå÷Êí÷ *ì÷5¢þñåK÷5”þÂÕ±�÷ ªð‡Á÷ ðôë ÂÐ ��ˆȵµ d· bìÀìÀe÷ Æï÷  ï÷5Dþ'÷%Rì#÷ ¶ë×-Lí‡÷5@@íÁ÷ ºð–ë ðéðv~ðÕhÀ®ëÀe÷ pï÷ Jï÷5@í÷ „ëÃ÷ ÷5êìÃ÷ Ã,Ã$ÀšPHÄð4 ôÿÿ7Jë7 Në÷ 0‡× <úõµöÀžPPÐh ÷ VêÀðwê±ÀžÐ ÐÐ à‹÷-ëTìŠ÷5Jý÷%XëÈ•@@Áœÿ ¼ü@Àb È\ýÓ ‡Áœ@ üÁ÷ ®ð 07¦ê‡·˜èfÁ÷ ø?öü7òü°‡÷æüâüÁÞü±wÖüA÷ Tô¡Þ ôÂÈü·Âü÷ ø÷d¸ü‡ÁÀ*wîû·:èÂd€± �,ùˆ7Œü÷ Òÿ¡‡÷ „ü Àßzü· vüÀì÷ p †ð¥öÿ*± `Á ÷ øì7Nü7Hü‡÷ ºÿ&÷ ´ÿÀ€U‡w nù÷ÿÿ,ü& æë· "ü¦�÷ dõ7®éw²éÍ �÷ „ó÷ úô& íÖ ¶#ê–%÷ îû�÷ `óóÖ ‡·àû7 Úû÷€Òû7 Ìû7 Êû7 Èû€ÁTéfj&�Ž÷ ~±‡÷ ó6¦vw0éÂ$é7 é÷‹Œû(Àe"Á$ëÁeB$$$ÀåÁe((Áîè·<Tûw<Lû  w<Bû÷ ÷ ÷ ÷ 0ûw<&û·‘$ûð•#÷ †`Á ÷ ¦ë÷ ò÷%ÐéWñ5@ñ5 O€f &�F÷ Rò6¦vwfè7Zè7 ¾ú÷ Àú*7<¶ú&ð5@ ÷‹­ú÷ ª÷•¡ú À2êð•ð•÷ Ї÷ t†`Á ÷ ë÷ „Þ ÷ Ê�Ž÷ Fó·Ž ÷ R÷ fÞ ÷ ¬�÷ *óŽ7Š7úwvþ÷ ,ú ÀÊé7è‚`Á÷ *鱜±, ñÕ ñ ñÅD7 nøô5W,ù¬W,sNô5 ÷5@ç ÁjšwÎè· 6ø‡æ BÂeÊÅʵ *ʵ€ ¤Ê5"Š Á2÷5øæ÷ ¨å÷ ø÷-øšå‚f&ÁÈæ÷ Lï€�B!F÷U@ø÷&ñµôµôµ€ñÕ ñÅÁ<ž÷ .èÁœ@ñµ"ñÕÀ-hæÁ÷ üýðš÷ð–÷ð’÷ðÅ ÀBæÀe ÷ ²è†÷ Šè@ÁœñÅñµ@Kæœ+Þ N‡ÁÄäwüðµ@õ7 \÷÷ <Þ ‡ðµ@ú÷ ,÷†Ö (÷ >÷%Á÷ xýð0÷ð(÷ ðÕHœ3Ápäðµw÷÷Xäþöw þö00NM§3eaek›’±wöö‡ÂšÁ÷ :çÀe÷ ¦èf6†Ö Á÷ ýœ°ðµð¤ö ðä °°fÀòãÀe ÷ ´ç÷ Žç÷5Då Á÷ . °ÁÆã9–1–�÷ šíðµ÷ ŠíN&Á€Â  ý€Âœ&€Á5ÁEÀEÁEÀEÁE@ÀE@ÀEÁE €&&fÎEÿïöEÿï¶#‡ ‚–%€–%€ðÕ2, –%€òU2,Á�â ÷ æÃ 5Á ã÷ jî´ C� Á Á ÷ J &à ÂP ý&À*ÁÁ ÷ lô€´ˆ7JõÈVõ÷% ­Jõ÷%,Dõ7 䃇·*õƒ‡‡÷%.õ?÷-�âàã1Â�ô5ÂzÊ%¦Àe÷ âæ‚N‡ðµÁòôðµ l‡Á5RŠÂšrrÁÖ Âš² Á÷ å‡7 |ô÷ xô‡æCœóÅô5Hô5€µóµ óµ (³lóÅ óÕô5€)÷ žá&óœô5óUó5óUó5 óEóEw,Æ w,À ñmÎâóµ3ô5€óÕ€óµ(À€ðµ "ðµ ó5ó5 3lðµ€ðµô5 õ5óÕ×-^â†óµ ÷,hó÷,bó÷e<âô5ó%ɪó%J'ó;'ó%Jró;r÷ÿÿFóæêÞ †w6óµwÎ÷‚à,ó‚Á 9ÂÀeÃe‹°bˆ° ÷5@Èá\÷ DàY÷-Pà áUÈ5RÈ5OÈ5Lô5HÁ2àÈUB÷ Z@ˆÀð¤òÁà÷ vë· hൠd÷ Xõ1¦Â¸ðµ°ðµ€¬Š Ê ÷ êÞ ‡ðµ÷ Ú÷†Ö w÷ tòû÷-lòá ÷5@$á ÷  ß÷ ¸‡S÷ Lò7€ÁNò÷ téð5w”ð5wˆðµ€w|ðÅ€7œò÷jßòÁdß÷ ÀêB÷-¨àTß &fÁœà÷ é÷ ¦ê�€÷ bw:Á÷ ø÷ lêÂÐñ°ðÕ€ðÕ÷µÀñB÷ 0÷ Üè÷ Rêw¶ðµ€ 7˜ñÀæÞ7Šñw‚ñ÷ØÞ~ñ7 ~ñ±¡7tñ‡ÂšÁ÷ ¸áw\Á 6Á°Þ÷ Xô÷ èé÷ $‡%ÁœÞ÷ nè÷ ôé÷ àéw6ñððE÷$ñðððð µsõ d÷ ²Þn÷ ðÖ ÁPÞ÷ œéwJfÁBÞ÷ äé÷ šéð5ð5€ ô5Ö ÁÞ÷ ¾éB÷ béæ&æÁÞ÷ ªé7öÝwÀÁøÝ÷ šé÷ Pé&÷ L(‡)€ÁàÝðµÂÊÝò d÷ "ÞÂrð°0 ðÕ€ðÕ—%÷µVð ˜ÝÁžÝ÷ À÷ .–%ÁŽÝ÷ ÚèÁ„Ý÷ âè÷ ÎèÞ †wxfÁnÝ÷ é7^ݵšÁ÷ Và‡w êìCô5€7(ò5³l÷âïÁ÷ ~Á<Ñ H !Ð Ð&ÁZÞ÷ Þæ÷ dè€PPÐÐJ©Ðø‰ÄNÞÄ Ð· BÞ‡² xæÃt² ræÃnf¦Á÷ ‚Â`Ò  "°�ƒ‡¡ðµóµ ðµ€÷ Ræðµ 3,ô5¡±¤‡óµwRóµô5w>Áó5ó5Áe÷5@†Ý ô5€ ÷ úÛô5Áe÷ êôw¤îô5ó5óÕ€ð ðm4Ý0 0 ÷ †÷pîððEðð0î ð¢Û ó5ðHîððòÜóµ óÕ€ð ðmÌÜ0 0 óµ 0 µ d· ªÛ÷ �æ÷ šð÷ ˜æððÀ4ÛÀef÷ ôÞ÷ ÎÞ÷%ˆÛæÛææÆå�Àh÷ 0â÷ `àÆe – ƒ‡ÀNÈ ô5PHtt ÁÌÚw.æ÷ íæ*ÛÎm ÛŽ ‚— ƒ÷%Ü— ƒfÁV ÷ ˜Ý�· úÚ7 àì1 ñ¦Ù÷5€àÛfšÁ]÷ lÝ�w`ôÖ 6f… ÷ .Á÷ &ä÷ ¬åÁðµ !ðµ ðµp`†Á ðµp ƒÁ;Ò ÷ Ýp ƒpÅ Ó…÷ Àòô5 -ô5@)ÁÜÙ÷ .å7 4ì÷ ¨ï‡÷ äï ö7 ì÷ ”ï‡÷ ðî÷ öä&fÁ¨Ù÷ €ã÷ å°·˜Ù„wÔòwVóƒ‡ô5-÷ ˜ïÃåÀ%&÷ ŠïÀ¥!ô5ôUÁXÙ÷ ºäæÃžæ÷ `ïÎ ûÖ ƒÃå Áœ@÷ ÷à Û‡7 „ë‡w ºèÄeW!€ƒÅå€÷ Å€AÁ Á ÷ ðñTÐÐÅ ü‡÷5 ë÷5˜ë÷5�ëô5Á÷ ¼ñ÷ äðpëðÕˆB÷ ìû÷ Œâ¡‡±‡÷ VêÁôÙ÷ xâÀe&ÁŠØÁe ÷ ݇wëÖ ‡€Á÷ î܇wúê‡÷šÙØêwÖêÂÐê�¦·Æê÷ þãwRØÁ¼êÀe÷ ºÜf &w@ØÁ:Ø÷ ˆã€ �ã‡Þ ᱇w ºçÅJÙÁØ& f w€ê÷ äá÷ RÄ  öÄÀî×& ff÷ ¾á÷ ,ö� ÷ °á– N ñ– õ„ !‚æ.ê¦í– ‡U ‡1±o†ÿ °æ0 3æ¼À$Àæ¼À àæ¼ÀHÀ€Ôœð00NÊMl1DATADATADATADATADATADATADATA&æ¦f&¦ v Þ €�‚ƒ„…‡"!T!à$â$n%x!ˆ,´,**ú &¯ªà® ° D!æ -T.T.ò-D! 7 èí÷ ÷\ÿÀxîðÒ/h8 f÷ ¼õÀ¤÷ 4÷ °ì÷ Zî·Ìí÷5¨í7 Àí7 $ÿÀð÷ 7 °í ÁJ÷ "ïÀ&î÷  ý0 h‡Á÷ ®ð 07ô뇷æéfÁ÷ Ê?Úþ7Öþ°‡÷ÊþÆþÁÂþ±wºþA÷ ¢õ¡Þ ô¬þ·¦þ÷ ø÷úœþ‡ÁÀ*w<ý·ˆéÂú€± �,ùˆ7pþ÷ Òÿ¡‡÷ hþ Àß^þ· ZþÀjí÷ ¸ †ð¥öÿ*± `Á ÷ Fî72þ7,þ‡÷ ºÿ&÷ ´ÿÀ€U‡w ¼ú÷ÿÿþ& æfì· þ¦�÷ ²ö7üêwëÍ �÷ Òô÷ Hö& íÖ ¶#ê–%÷ Òý�÷ ®ôóÖ ‡·Äý7 ¾ý÷€¶ý7 °ý7 ®ý7 ¬ý€Á¢êfj&�Ž÷ ~±‡÷ jô6¦vw~êÂrê7nê÷‹pý(Àe"ÁrìÁeB$$$ÀåÁe((Á<ê·<8ýw<0ý  w<&ý÷ ÷ ÷ ÷ ýw< ý·‘ýð•#÷ d†`Á ÷ ôì÷ ò÷%ëWñ5@ñ5 O€f &�F÷  ó6¦vw´é7¨é7 ¢ü÷ ¤ü*7<šü&ð5@ ÷‹‘ü÷ ª÷•…ü À€ëð•ð•÷ Ò‡÷ ¼†`Á ÷ Tì÷ „Þ ÷ Ê�Ž÷ ”ô·Ž ÷ R÷ fÞ ÷ ¬�÷ xôŽ7Šüwvþ÷ ü Àë7Û÷ ˜ï÷ væ÷ $‡%Á*Û÷ üä÷ ‚æ÷ næwxîððE÷fîðð2î µsõ d÷ @Ûn÷ ðÖ ÁÞÚ÷ *æwJfÁÐÚ÷ ræ÷ (æð5ð5€ ô5Ö Á¨Ú÷ LæB÷ ð忆)æÁ”Ú÷ 8æ7„ÚwÀÁ†Ú÷ (æ÷ Þå&÷ L(‡)€ÁnÚðµÂXÚò d÷ °Ú´í°0 ðÕ€ðÕ—%÷µ˜í Â&ÚÁ,Ú÷ À÷ .–%ÁÚ÷ håÁÚ÷ på÷ \åÞ †wxfÁüÙ÷  å7ìÙµÂNÁ÷ ä܇w xéCô5€7(ò5³l÷$íÁ÷ �Á<Ñ H !Ð Ð&ÁèÚ÷ lã÷ òä€PPÐÐJ©Ðø‰ÄÜÚÄ Ð· ÐÚ‡² xæÃt² ræÃnf¦Á÷ ‚Â`Ò  "°�ƒ‡¡ðµóµ ðµ€÷ àâðµ 3,ô5¡±¤‡óµwRóµô5w>Áó5ó5Áe÷5@Ú ô5€ ÷ ˆØô5Áe÷ *ðwæëô5ó5óÕ€ð ðmÂÙ0 0 ÷ †÷²ëððEððrë ð0Ø ó5ðŠëðð€Ùóµ óÕ€ð ðmZÙ0 0 óµ 0 µ d· 8Ø÷ ã÷ Úë÷ &ãððÀÂ×Àef÷ ‚Û÷ \Û÷%Øæ¨×ææÆå�Àh÷ ¾Þ÷ îÜÆe – ƒ‡ÀNÈ ô5PHtt ÁZ×w¼â÷ <êæ¸×Îm®×Ž ‚— ƒ÷%ªØ— ƒfÁV ÷ &Ú�· ˆ×7 ê1 ñ4Ö÷5€nØfÂNÁ]÷ úÙ�w`ôÖ 6f… ÷ .Á÷ ´à÷ :âÁðµ !ðµ ðµp`†Á ðµp ƒÁ;Ò ÷ –Ùp ƒpÅ Ó…÷ îô5 -ô5@)ÁjÖ÷ ¼á7 Xé÷ èê‡÷ $ë ö7 Dé÷ Ôê‡÷ 0ê÷ „á&fÁ6Ö÷ à÷ ”á°·&Ö„wÔòwVóƒ‡ô5-÷ ØêÃåÀ%&÷ ÊêÀ¥!ô5ôUÁæÕ÷ HáæÃRæ÷  êÎ ûÖ ƒÃå ÁP@÷ ÷à Û‡7 ¨è‡w HåÄeW!€ƒÅå€÷ Å€AÁ Á ÷ 0íTÐÐÅ ü‡÷5âè÷5Úè÷5Òèô5Á÷ üì÷ šàð²èðÕˆB÷ ìû÷ ß¡‡±‡÷ èçÁ‚Ö÷ ßÀe&ÁÕÁe ÷ �Ù‡wPèÖ ‡€Á÷ |Ù‡w<è‡÷(ÖèwèÂè�¦·è÷ ŒàwàÔÁþçÀe÷ HÙf &wÎÔÁÈÔ÷ à€ �ã‡Þ ᱇w HäÅØÕÁ¦Ô& f wÂç÷ rÞ÷ RÄ  öÄÀ|Ô& ff÷ LÞ÷ ,ö� ÷ >Þ– N ñ– õ„ !‚æpç¦í– ‡U ‡1±o†ÿ ,á0 3&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡æ¼À$Àæ¼À àæ¼ÀHÀê*00NÊMl1DATADATADATADATADATADATADATA<±ƒ…±VNTI ±VNSY”±VNSY[²gNSY[²hNSY?±y‹OV\±ÿ~TI\±CL2²VNCLó«@GÚ†hjTXC±¥zb©ø "$RR>@BDFHJLNP ­,­3X ­s,w ´ù÷ žÀö÷ hó÷ òéÅâÀnëÀ Áäé÷ üD÷ FÀÁÒé÷ êD÷ 4ÀÁÀé÷ ØD÷ "Å‚Í ÷ Ô‡ðµ ÀU%@eA÷ ¨D÷ ò†èÅe åU%ãÅZÍ (Í%?±÷%âé÷ ˆ‡Ä÷ DD· ÎéÈÊéÄ èÁ÷ P?¤é7 éÐ ÐȪéÙÅeÖÀžéÃ< ÁVÉ €‚ Ée·Vé·4éÀ À  õ‚b7 "éÂ5Àe@Â5` ÷5JêÀeÂ5@Àe,Àe7ôè÷  ÷ ”÷  ×-&é÷ .ê÷5€êh· îè÷ÌèÒý· Æè÷eâèÀÀé˜ô‚b÷5€êé0Â5-ÁhÀ ƒBBbBdBd�à ‡wªèÂ@Àm è‡@b‡Àmšè†÷EªéæŠèæšèæ†è‚ÁW÷ 0ëÆeÀÿÿ7PéÂ5€!÷5|éÁ8èÂ5@Áe2Áe?ÁE?� ÁE€� � � � � @`ÀeÀE 7`è÷ ¾÷ Âææ=ÿˆÁ¨æ ÷ šñÀeÁ>  ýÁ>   ýŘD ÷ ¦‡÷ fPÄ ýõÄ aU%ñźÅeÍ = ÷ |÷‡ðµ ýØç=lì÷ŽèŽè· Šè÷ 8÷5 è Áæ÷ ñ÷ ’ò1 ‡Áaa÷ Á<Ñ H !Ð ÷ BPPÐPP ‡÷ *@Àe"AÁå÷ Në ‡ðµðµ€¡±‡&Á è÷ Žð÷ ò€‡À^AÁå÷ Šë†Á ÷ �pp0À^÷ L뱇÷ ¶ÿ@ð dDÀe"æ8Þ >‡ðµúðµö7’û7Žû÷%ɪ†ûì×-‚ûK'wD×-vûJ'w8×-jû;'w,×-^û3&w ×-Rû3&w×-Fû2&w×-:û#&ÄÁn÷ äè‡w xõ÷ÿÿ"û& æ"ç· û¦�÷ nñ7¸åw¼åÍ �÷ Žï÷ ñ& íÖ ¶#ê–%÷ äú�÷ jïóÖ ‡æ)Pxü¬Ä"â)Ä&Ôþ¬¯yó«@G˜ ­ˆxC±¥ª­cŒb©ø²ü¬³°úp@,«1zB?±y‹D5¬!™:ÿ :ô|¸ÿ 2ô|v ÿ *ô|ð!ÿ "ô|æ0ÿ ôˆ#ÿ ôˆ$ÿ ô0 3&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡¢H H¤rzt¦„€Ààðøüþÿ?ÿÀÂ÷ jþ‡w àóÅ:äD„C†Ået÷ BE‡AÁ%ÿÿ÷ ðí÷ vïð5f&ðÕ"ðÅ€ð5ð50ð 0ð0ð ÷-Æãåð5Ö µÄe¾Å ãD€C‚Åen÷ hÿ‡×-úã÷5ìä÷eîäÀ!÷ –ý÷5Öä÷åØä‡÷5@ÎäÁ®ä÷ 2í÷ ¸î7rŠþ&æÄe€Ãˆ÷ 䃄Á†ä÷ í7xfþ÷ ˆîæ&Äe„È÷ º÷5pä„Äe°Ã‚÷ ¤„ƒ‡w ŒòÁîâ÷ NîÅÞâ÷5@Lä wrþDÄe€Ãˆ÷ rwxþ÷5"äDÄe°Ã‚÷ VDÄe„È÷ HæJ÷-˜âèãæ÷ 4Î ü– „TŒTŽT�5 �L’„5ŒÔmÔã5Ž5e�5’‡ÁÀ÷ VýÁdf÷ ì÷ ¢í °c †0ÂeÁ÷ "å– %‡w ²ñ7 lý÷  Áêà÷ âë7^ý÷5Xý÷*ãÀ)÷ ü÷ RýÁBý÷ 0í÷5:ãÁ4ý÷ íÁ2ý÷ í÷5 ãÁ&ý÷ í7 ýÀÔ+÷ ÄûÀ âÀmâ  ƒÁV÷%þâ ƒ÷ ‚äÄ2÷5ÔüÁ÷ tüL`ÂT ÷5Ä⊊Êm¸âŠÁ¢â÷ öì÷‹žü ÷ ÷ Þ÷‹’üw�wè@? Á÷ u~õí”á~@wá÷ZâáCÄa÷ ¾÷5Xâ÷‹HüS@¤CwÚà÷0âÜàÄa÷ ®÷ ž÷ l& ÷ ä„A~Ám6áÁ w âà†wÜà÷ H÷ Ä÷5â*÷‹ðû'Cw†à÷ÜáˆàÄa÷ Z÷5ÜáÁ ÷ ŽÁZ÷‹¾ûÁ®àH · ªàA®B¤÷ Šô¨à÷5¤á÷ààÁ†áw„ë÷5Žá÷‹~ûfÅe†@ÄÁ÷ …u®õí€à®‡Á Á,á÷ 5÷ . tj÷ T ‡Á ÷ ö È à7à· àA~Bæ&Ó ÓáÓþàKËm(à€&ÁØà÷ ¸ À ÀdÓ �÷ Ö S&„¶Ö j óE€ÃeÀà„ ƒ‡7 ÄúÀz%÷ pù 7 ’ú÷ ÞÄ÷ Ö÷5žà  ÷vú÷ ÂÄ÷ ºÁrà÷ öè÷5zà& ÷ âèÁŒ  Á w2ß ÷5Pà � ÷ ¼èÁŒ  Á wßÀßÁ÷ ä †Àÿÿ7ßÀîÞ÷ ^ 7ܰvÞ÷5àÀÚÞ÷ H 7ܰbÞ‡w (îÁŠÞ÷ êé7 Èù÷ ÷5Üß÷¶ùÁlÞ÷ ‡ÅZÞ÷ ¤ùC C÷ šó@w šß ÷ ˆùw œù6w�ù2÷‹…ùÁ¢ßÀ\Þ÷ @ Á wRÞ÷5vß ÁˆßÀDÞ÷ & Á w:ÞÁ÷ Òçð5  · Pù÷ V Á ÷ "ùu¦uf7 2ù÷ù÷ù@ ÷ Žçð ðµ ·‘ûøA ÷ rç÷ÊÞâø÷ ßÞøÄæÁ÷ *é÷ àè&÷ ºø@¢@÷‹¼ø  ÷-\ݬÞò5 ÷ ’ø5®A¤5 ¤5~A5  ÷ : ÷ lø5¢5Ca÷ XøÀXøÁ¢ÀJøÁ÷ †À Á@ø÷  ÷ .ø5ž5÷ Bø÷ ò÷ @ ÷ øu00 NM§3eaek›’®uœ|u~uw÷ ô÷ÂäÜÂÜÜA ÷ ræ÷ Ú÷¦f ‚ ÷ ÖÂÿÿ÷ º÷µœµ€÷ ¨÷Áª÷Á ÷÷ b÷ ”÷7–÷7Œ÷÷‹–÷÷-8܈Ý÷ v÷5`®5`~÷ f÷A¢A¤AA÷ ÁR÷÷ ‡Á ÷ 8÷u¦uf÷ L÷÷ "÷w ܃w Üw ܃wþÛõµ‚÷ J‚÷ ôörœr÷ àö@œAž@A÷ ’‚€ì2 ‡2�÷ Àæ÷ ÐÀT  ÷ ¢ö  ÷ ˜ö@ž@÷ ˆöw3Nõµ@÷ (4`N‡3N˜÷-lÜÛ4N6À ÷ 4`N‡¡ ÀeÿŠÀ‡w Šê÷ ¤ÁèÚ÷ HæÅØÚ÷ (ð;w (Ü ÷]2Ü"ö÷]ðÚö÷Uö.÷5€Ü*÷5ö&·öÁö÷ öåwöÁö÷ >æ÷ ôå7úõ÷5êÛÁðõ÷ Îåw äõÁàõ÷ æ÷ Ìå7Öõ ÅVÚÄ÷ ®&÷5°ÛÄXõ5Á ÷ N5¢ �ÄTõ5Á ÷ 05 7P`õ÷UZõ÷5bÛõ ¢÷UFõà E   Äþÿ÷ 4÷5:ÛÄXÁ õ5Á ÷ Ò5¤ ÄT7SþôÁõ5Á ÷ ®5÷ H‡·‘Þô· ìÙ÷-~ÙÎÚ ÷ àÙ÷ ¾îõµ÷U¸ôA2÷ 2ã÷ ¸äð]¦ô ð]žô ÷ ®ô%w-¨ô!Ĥôô]ˆô ÷ ‚ôA ÷ úâf@÷ $ÁŒÚ÷ .‡Á uft ƒt÷5VÚPÄX7S<ô÷  ‡·‘8ô· DÙ÷-ÖØ&Ú ÷ 8Ù÷ îõµ÷UôA 2÷ Šâ÷ äð]þó ð]öó ÷ ô%w- ô!Äôô]àó ÷ ÚóA ÷ Râ¦@¤÷ |ÁäÙ÷ †‡Á u¦t ƒt‡ÁÁ ÀR Á ý‡w ÎçÁ0Ø÷ �ã7 nó÷ ÷5‚Ù÷\óÁØ÷ ‡ÅØw VÙõµ3÷ <óA A÷ Àá÷ Fãð5 õÕð÷ óðU Àe ÷ ó÷ íÈ ÷-öìóƒ÷îìóÈ · Ø ‡÷U€úØû÷ ÔìÈ õ÷-Êìäòñƒ÷ÂìÜòÈ ì· Ö×é÷ ¬ò÷ "÷5¾Ø÷ šò÷ ‡n´nÁ Kj´jÁ D÷ áæ ÷ ˆâ÷5tò ÁeÿÁEÿ  Wtüÿ÷ Fp÷ >òÀn22mh÷-6ØâÖ fÁ<ØÁmüÖ÷ r`�÷ Ø3n h2òln÷ À4hƒ‡@÷5ØÀe”&Àeæ8÷5ì×€&÷ RàÞ †‡ð5íðµ é÷5¾×÷5¾× ðµtÈ-ƒ ×÷ œáðµ@0 0 0 É÷ `áf&æóµ ÀTÖÁ÷ 7HÖ3ÀóÁ÷ 3 Á*Ö÷ ê7"Ö7L×w(óµÁ ÷ ˜ß(Á÷ Æ33Á ÷ ¬4Àì3 t÷-ŠÕÚÖ*ÁÀŠ÷ jÚ$‡& ó óÕ€Àe33 ó 3 ÁÁ À ÷ RÁŠÕ€÷ H7€ÕF ÷5ŽÖó5€ÄÄeVÁ÷ ( @à÷ &ÁÀ^÷ âÙ‡óµÀ÷ î3 ƒ3€Á÷ Ô3Á÷ Ä3 Àì3 ƒ„�÷ ðßw þ@Àeæ8Þ L‡æÐïÂ5  Cµ @ðµ@<÷5ÌÕ÷5ÌÕµN~÷5²Õ"Â5€÷ ˆï%N®°c°c÷ ”ß÷5ŒÕÂ5€ ÷ bïÎdï°c°c÷ nß ÷ Jï°c°c÷ Zß– ²‡@`!‡‡÷ ‡‡Á @`†A@ � f÷ èî�÷ ÊîÀ ±@‡Áe? ¡ � � � � ‡¦BÂeÁ÷ –Ö÷E0ôÔ€‡À À ÷ 0œ¨  Áå ûÁå 4°Ø¡Œø†Á÷ XÖ4ÐØ‡ÀEÿÀ @ @ @ ‡±÷5€ Ô ÷5�î÷5ˆî¡‡À"1÷ <íÀ�Ð%÷ ÀzÐ% &÷ ØÜ‚ðµ "lÊmjÓ‡fÁäÒ÷ DÞÀÔÒÀe"Åe æ8Þ †…‡ðµøðµ€ôðµ€� ðµ ë÷ Þ÷ àÝ&f ÷ jÜ�€÷ ÚÝòµ€ &� ÷ Ží€p°lò5 ÇðÅ ð5À÷ ®Ý÷ ŠÝ&fð5÷ Ü�€÷ vÝ&ð5� ÷ $í€ð5p°lw ÿp°lwÿÿ èà0 3!€@@€@ € N@(B*D,:.$ $ü   ~„ú"~ ~x< :  p' þ) €D   Šô"  * zX6 ú8 üHæ4îRð èTêxò<ìPô ö ø6ú4 ü2 þ. 0 ÷5dâkw ”ðÅNÍmáMeÀôìÄ áÄm á !‚D7üà÷íáöà`ðð•#00(NÊMl1DATADATADATADATADATADATADATA÷ J † ô�Á÷ ²ã÷EâAà €¦ÁY÷ œã‚Átß ¦÷ hê÷ îë‚Àe�����Á÷ ŽûE€ ÷ ä7Dà7>àЕÿÄ üÅ ÁÅ Á üÁ `�Àæ#÷ Tú÷5”á÷mRàRà‡ÀàðmFàðmZá÷5táðm2à˜ðmFášÁþßw^ëw �ï7 ¸ñ ÷5€NáÀbà7ðû7ôûÅàëEbÄ ÌÃHÂÁ…0ûLPù÷ .áÌU ÷ šßÌU÷5 áÌU÷5øàÌU÷5ôàÌU÷5àà À²ßÀmðß ‡7 žßƒÀžßÀmÞ߇7 ŠßƒÂŽÁ"÷ ¼fÄ6 ÃnŨàÂÁ…0ûLPù…7<ûÀbßÀmžß72û7 ,ûƒ7&û÷5 xà÷5pà÷.ßû÷5Zà À,ßÀmjß7û÷$ß û÷m\ßûæôæ=ÿˆÄú À4ßÀ À Àe>7Öú7`ÐúÀßÁp `AW  ƒ÷%àW ƒÁV÷ ÁðÞÀ÷ ŠùÁeÁm–úwŠúÁe w`€úÁeÅ5` d÷5€ÂßÔeÀÔmÐÞTÔ�ÞÔpÞÔˆÞÔ‚Þ   Ôºß÷%žÞ Ä ÔœßÔ–ßÔ¢ßÄ Ô„ÞÔøÅ5€ôUþÿÌdßÌm$Þ7ú÷åúÔmnÞ÷ ¶ ÷ >Ô<ÞÌ:ÞÅ5÷@ßô,Þôm"Þþÿ Ä. ÷5ß ž÷ Ô Þ÷�ÞÀù÷�ß»ùæ’&Ä~÷ Ä„÷ ‡$Ì ‡÷5ØÞnæx'7 ï7 (ïÀˆÝ4ÅxÀ 7ï÷zÝ’Þ7 lù÷ ‚÷ Z÷5¢Þ÷¦Þ÷•OùÅx÷RÝhÞ7 Bù÷ X÷ 0÷ xÞÅì÷(ùÈî÷eÂî7 ù÷ 6÷ ÅT"÷:ݬî÷ ¨î7 (Þ7 ù÷ Ū"7 öø÷%@Þ÷àèø7 zîCDÄ5ÄEfÄmÊøÁ÷ LÄeÎ öÖ ê‡Å`ECfÓ Å ÄÔ& ÎÔÀÀ À Àeü&A÷ €Àe÷ Î ïÖ …âÅZÄ E'õE@CÃeæ÷5@>ø Ë% &ó%„(ó[qæÁÄe÷ ´Î ø– CÃe³Ö×-\Ü÷ dÝ÷5€PÝ À(ÜÀå7¾÷ÀD(÷ ìõ÷ à‡À¬÷¸Û� òµ@÷e”÷÷ R‡Ìe?ÌE?  ‡÷ ŒÞ÷EêÜÀŠç÷ ‡Áå÷ >Àe"÷ â߇ ñµ±ñµ€A÷ &å@ñµ Àm¸Û¡‡fÁ‚Ü÷ å�‡w ¾ê÷ 6÷ ü ÂüÚÃöÚÄ…”�  †w2÷· ¶ì÷ Ä õà ð÷÷2܇÷ žì&ÀææðB ðæ: °4Îe°6ð•(ðH"÷ J÷ l€· Öö7 Zì‡÷µ@`ì ÷‹YìÂ2 Ê‚2 ·)2 ¼‡2 ƃ÷-dÚ²ø ÷\ÚªøÂVÚÂe ÁwT݇€ì¼· Žø·ˆøÂÂ÷ îë÷ pø€ìÀ· hø·bø  ÷ Ìë ÷ Nø7 @ø‡7 <øPƒ÷ ÿ·8øæN÷ 4øÎTŽ`ÂUÿ·øÂEÿ·øÂ‚ ‚g‚ ·úõ· ~ë&f €Á÷ ÔôÀm˜ÙÂÁ  üˆ°ˆÀ÷ |ÀžåðB ðæ: °4Îe°6ð•(ðH"÷ ÷ $�€Àí”÷p�B ‡f&÷ ®þ€�€ Á÷ ¢þ‡ ‡ææ)ÿˆ÷Šl÷‡`Á÷ ÜÀB Á Á ý‡w ¦è7 F÷7 D÷Á÷ |7,÷÷B $õÀ\+÷ ó÷ úýÁÂ÷À*÷ rê7 ÷7 ÷÷øô Ú÷åÚÀÄäðèô ÷ D‡w Fè&÷ H„÷5Ú÷ ‡ÂÆôņØaC¢|w˜´ô· °ô ÷ ¸ö7÷¤ôžô÷žô²Ù÷ ®Ù· ¢ö,ÂŽôÅNØaC`w|ô· xô ÷ ~ö÷lôfô÷fôtÙ÷ pÙ· höÅ · ÖéR”„ — B"÷f÷ ‚�òà ,&Àäð2öðæ> °4Îe°6ð•(ðH"÷ t÷ Žþ€· üóÁúõÅÃ%‡ ËÃåÅÆÄ ÄU?„ àa·Ðó— B"‡÷ ·Âó‡÷ žüÂB ÷ `þ‡ÿ †æ0 3æ¼À àæ¼À\àæ¼ÀÀæ¼ÀÀév~ ­ø1±o†ÿ ¤ùæ†ùæw à÷÷5¤é{7 ŒýÁç÷ ò7\ý÷5Vý,÷%†è(÷ êç×-€é‡÷5@téÁTé÷ ØñÀeÁb÷ hì†&Á:é÷ ¾ñÀe"Á^÷ Nì†�pÀÐé÷ ñ7 xù7 <é ÷ýý÷ýý7` ý&Ål÷ € rx€ 7 úèí#ÁÚè÷ ^ñÀe"AÁå÷ ìë‡ðµðµ€÷ 6ñðµ ÁmÊç ‡À€÷ ÷ "çÀ†è÷ Þ÷ @ ÷ H÷ ¶÷%†ç÷5Fü÷5>üÀ÷50ü ÷ 0*ÁDè÷ ˜ò÷.è.è7&è ÷5>è¤ÁeÿÁEÿ@` Á÷ øÁ € Àmöç7ôç÷ ðçÀ®ò÷ (ø‡Á`÷ ”é÷Eòç‡w "öÀ„æ÷ .æè"Þ ‡÷ xûwzÅ<E BÒ Ò ú�Áa÷ Véõ‡7 Îç‡&÷ ¢�÷ ð7œþ÷€7 ð÷7 î÷w xç ÷DæÞ÷÷>æÚ÷Àm�æ7Â÷7º÷7Ä÷w Tç ÷m"æ¸÷÷5Xç÷mPçª÷·l¤÷÷  ÷÷œ÷–÷ò  €~ÀmLæ7z÷€lÀ 7z÷÷5ç)€œÀm.æ7b÷€l¢w öæÀmÄåÀmüæÀ 7T÷€®Àm æ7:÷€l¤À 7:÷w Ìæ ò ¢ò ÷"÷$÷·¢æ·žæ÷5¸æ·˜”æ·š�æ÷möö÷÷mòöþö‡w Îô÷ÿÿºú& æxæ· °ú¦�÷ Äð7åwåÍ �÷ äî÷ Zð& íÖ ¶#ê–%÷ |ú�÷ ÀîóÖ ‡w vô÷ 6÷ ü Â000NM§3eaek›’´äîäÄ…”�  †wLú· nö÷ Ä õà ð÷8úêå‡÷ Vö&Àžðð¤ð朰4Îe°6ð•(ðª÷ Â÷ l€· ðù7 ö‡÷µ@ö ÷‹öÂ2 Ê‚2 ·)2 ¼‡2 ƃ÷-äÌû ÷äÄûÂäÂe Áw 燀ì¼· ¨û·¢ûÂÂ÷ ¦õ÷ Šû€ìÀ· ‚û·|û  ÷ „õ ÷ hû7 Zû‡7 VûPƒ÷ ÿ·RûæN÷ NûÎTŽ`ÂUÿ·2ûÂEÿ·(û‚ ‚g‚ ·ù· 6õ&f €Á÷ ªÀmPãÂÁ  üˆ°ˆÀ÷ |ÀVïð¤ð朰4Îe°6ð•(ðª÷ ‚÷ $�€Àí®úp�¤‡f&÷ ®þ€�€ Á÷ ¢þ‡ ‡ææ)ÿˆ÷Іú‡`Á÷ ØåÀ¤Á Á ý‡w ^ò7 `ú7 ^úÁ÷ Î7Fú÷¤>øÀ¤!÷ hý÷ úýÁÂ,úÀ*÷ *ô7 *ú7 (ú÷øÄã÷å¾ãÀ|îðø ÷ Ô‡w þñ&÷ H„÷5ºã÷ ‡Âà÷Å>âaC¢|w˜Î÷· Ê÷ ÷ Òù7÷¾÷¸÷÷¸÷jã÷ fã· ¼ù,¨÷ÅâaC`w–÷· ’÷ ÷ ˜ù÷†÷€÷÷€÷,ã÷ (ã· ‚ùÅ · ŽóR”„ — ¤÷f÷ ‚�òà ,&ÀÀíðLùðæ °4Îe°6ð•(ðª÷ ì÷ Žþ€· ÷ÁùÅÃ%‡ ËÃåÅÆÄ ÄU?„ àa·êö— ¤‡÷ ·Üö‡÷ žü¤÷ `þ‡·Þø7 Øø÷€Ðø7 Êø7 Èø7 Æø€Á áfj&�Ž÷ ~±‡÷ Òê6¦vwæàÂÚà7Öà÷‹Šø(Àe"ÁÚâÁeB$$$ÀåÁe((Á¤à·<Røw<Jø  w<@ø÷ ÷ ÷ ÷ .øw<$ø·‘"øð•#÷ ܆`Á ÷ \ã÷ ò÷%†áWñ5@ñ5 O€f &�F÷ ê6¦vwà7à7 Ê÷÷ ¾÷*7<´÷&ð5@ ÷‹«÷÷ ª÷•Ÿ÷ Àèáð•ð•÷ R‡÷ D†`Á ÷ ¼â÷ „Þ ÷ Ê�Ž÷ üê·Ž ÷ R÷ fÞ ÷ ¬�÷ àêŽ7Š5÷wvþ÷ *÷ À€á7ÀZ÷ ‚À˜÷ zÍ5@ ôµ÷žúæèÿˆ÷ øw,w H÷À¢çÀeæ8Þ ‡ðµúðµ ö0ðµ€0 ÷ Üòê‡w ÷÷ Ú÷5@Êè)À`ç÷ Ä÷ Â÷5¶èæ8À@çÀeÞ ‡ðµ÷ ñ÷ �ò0ì0 îæÞ ‡÷ †ûÀçð d Âe¦¦ dÁœ÷ òéž÷5@Nè÷ ‡÷5Hè ÀÎæð d÷¨ù÷¤ùæèÿˆÁ^"÷ ÂÁŽÉ ÷ 8ê÷~ùæèÿˆ‡÷ lð7œRø€7 Dø7 Bøw Ìç ÷˜æ2ø÷’æ.øÀmäæ7ø7ø7øw ¨ç ÷mvæ ø÷5¬ç÷m¤çþ÷·lø÷÷ ô÷÷ð÷ê÷ò  €~Àm æ7Î÷€lÀ 7Î÷÷5rç)€œÀm‚æ7¶÷€l¢w JçÀmæÀmPçÀ 7¨÷€®Àm^æ7Ž÷€l¤À 7Ž÷w ç ò ¢ò ÷v÷x÷÷mj÷v÷÷mf÷r÷‡÷ žø Àß”ø· �øÀžç÷ $ †ð¥öÿ*± `Á ÷ zè7hø7bø‡÷ ºÿ&÷ ´ÿÀ€U‡w ðô÷ÿÿFø& æšæ· <ø¦�÷ æð70åw4åÍ �÷ ï÷ |ð& íÖ ¶#ê–%÷ ø�÷ âîóÖ ‡·ú÷7 ô÷÷€ì÷7 æ÷7 ä÷7 â÷€ÁÖäfj&�Ž÷ ~±‡÷ žî6¦vw²ä¦ä7¢ä÷‹¦÷(Àe"Á¦æÁeB$$$ÀåÁe((Ápä·<n÷w<f÷  w<\÷÷ ÷ ÷ ÷ J÷w<@÷·‘>÷ð•#÷ À†`Á ÷ (ç÷ ò÷%RåWñ5@ñ5 O€f &�F÷ Ôí6¦vwèã7Üã7 Øö÷ Úö*7<Ðö&ð5@ ÷‹Çö÷ ª÷•»ö À´åð•ð•÷ 6‡÷ (†`Á ÷ ˆæ÷ „Þ ÷ Ê�Ž÷ Èî·Ž ÷ R÷ fÞ ÷ ¬�÷ ¬îŽ7ŠQöwvþ÷ Fö ÀLå7à‡÷-ðÝœÜð5ð5  ÒmúÜÒB#Ò@# ¦÷ >æ‚ðµ  âB#ð5 âmÈÜÒ Ò ‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡æ¼À0ÀODT xfr address: %P%NPRG xfr address: %P%NStack limits: %P %P %P %U.%NIdentification : %2R%NTask attributes: %VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%VA%NTask address limits: %P %P%NTask Address limits: %P %P I-Space%N %P %P D-Space%NTotal task size : %T. Words%NTotal task size : %T. words, I-Space%N %T. words, D-Space%NPartition name : %2R%N%P %P %P %U. %VS%2R%N%P %P %P %U. I %VS%2R%N%P %P %P %U. D%2N%4N%X Ov00HNÊMl1DATADATADATADATADATADATADATAerlay description:%2N---- --- ------%NBase Top Length%NTask UIC : [%O,%O]%NTask name : %2R%NTask priority : %M.%NMapped array area: %T. words%NTask extension : %T. words%NTotal address windows: %M.%NTask image size : %T. words%NTask image size : %T. words, I-Space%N %T. words, D-Space%NR-W disk blk limits: %P %P %P %U.%NR-O disk blk limits: %P %P %P %U.%N w æçÂÀ÷ üÒ*×Ò(×Ò  ƒææ=ÿˆÁD#ÂÀ÷ ÄùÂ€Ê Áq*÷ ´ùÂDÁŸ)÷ ¨ùÂNÁj(÷ œùÒ�eÙŠÒ�^ÙŠÁV*÷ „ù¼"ÊÙÁˆ*÷ rùÀÙ÷ 0ñ¼"÷ "ÙÊnéÊmÜ׊Ò ÊÙŠ¢hÁJ(÷ DùÂzÊ%Á(÷ 6ùÂ�Ê%Á4(÷ $ùÁXÖ ÷ Ná÷5ÎØÁUwpû Á<Ö=÷ .áÁEÿíÁ5ÁUÃNÖBÁ@ƒ@ÁP+Åî/ļ"A5ÒR w=þÿ&Öƒ U%Õ òeþÿò üÿU%Õ Ä èò üÿÁ�(— #† Òº+ù÷ €øÂ¼"Ê:×Áá*÷ pøÂ¼"À×÷ TÁŸ*÷ ZøÂ¼"ÀøÖ÷ >ÁÀ*÷ DøÂ¼"÷5ü×'ÀôÖ÷ "÷†úˆú÷‚ú„ú÷‚ú„ú÷~ú€ú7 vú7 tú7 fú7 dúÀ¾Ö÷ ò¼"Ò(Ê (Á+÷ ì÷À Ö÷ ÔÁþ*÷ Ú÷÷5–× ÷-,ú2ú ÷-&ú,ú÷-úú÷-úú¼"÷5h× Ò(Ê(ÁL)÷ ”÷Ê(Á+)÷ †÷Ê^ÖŠÊmÖ÷58× Ò ÊJÖŠÊmÖÁâ(÷ `÷ÁÅ(÷ V÷÷5×ÒÐÕÊèÖÊ ÷5¬ùÊÜÖ÷ ÊöÁr+÷ ,÷÷5”ù ÒÂÖÊÀÖ÷ ®öÁ–+÷ ÷‡Ê(Á ÷ ùwXù÷mTùZùw Tù÷mHùNù‡¦Á Ô ÷ ßÀe‚Á Á ýÖ ‡×-€Õ÷ ÈÿÁ*÷ ªöÁ:*÷ ¢öÁ*÷ šö÷þø÷5 PÖ÷ðøÀ2/÷ ‚ï‡w päÀÒÔ÷ 6î¼"÷-ÆÔÖ÷<ÕpæÒlæÊræ²"þÿ †òZæþÿÊ^æ²"þÿ†Ò   ÷ ÊõÒ Ê˜øÃ€çÊmŽøÃ üÊ%\Ê\Ò ÀfÔ ÷5ÄÕÁ¶)÷ øõ‡Ò ÷-NÔžÕ÷ÄÔúåÒöåÊüå²"þÿÒ   ÷ bõÒ ÁÐ)÷ Âõ‡-AC,-AL,-CM,€-CP,-DA, -EA,@-FP,-HD,-PI,@-PM,-PR,-SE, -SL,€-TR,-MU,-ID,%N*** Root segment: %2R%3N*** Segment: %2R%3NR-O mem limits: %P %P %P %U.%NR-O mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NR/W mem limits: %P %P %P %U.%NR/W mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NDisk blk limits: %P %P %P %U.%NDisk blk limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%N%2NMemory allocation synopsis:%2NSection%44STitle Ident File%N-------%44S----- ----- ----%N%2R:(%VA%VA%VA%VA%VA%VA %P %P %U.%N%30S%P %P %U. %2R %2R %X%N%3NGlobal symbols:%2N%F) w 8é÷ øú×-þÙ÷hì:øÀ€Ù Ám(÷-xÙÈÚÁR(÷êÙë÷ ûÁZÙñ5-Áä(ÒëÊ ë²"þÿÒ  ÷ tú÷5šÚÁ)Ò ÒàêÊæê²"þÿÒ  ÷ Lú÷ ²ú÷- Ù\Ú÷-¾êÀêÒ¬êʲêÁ�(÷ (ú÷5NÚ Á¡(Ò Ò�êÊ–ê÷ ú÷ tú÷50ÚOÁ¾Øñµ@Iñ5JŠ@JŠ@¡Ò   ÀeÿŠÀÀ `÷ ºùÁG)÷5ÜÙ#ÁjØÒ ñ5JšŠ@¤J˜Š@ž¡Ò   ÀeÿŠÀÀ `÷ lùÁg)÷ ÎùÁ©)÷ ÆùÁË)÷ ¾ùÁë)÷ ¶ùÀØ÷5nÙÀe”&Àeæ8÷5VÙ€c&÷ ¼áÞ [‡ðµ÷ ¦á¼"÷ Þø·,üÿÎÙâ÷ ˜w´û ·°ûw®ûÁµ Á5 òmØþÿ7Šû  ·†û’Á *7 ‚ûð ·Šxûðµðµ ·Šeû÷ úøæ Þ ‡ÀB×÷ rùÁBû÷ á÷ žâð4û0ìð(û—÷ ä‡w ¶æÅ>/ÄJ’ p5ÊRaU%U%Ä óú%$$þÿò øÿòc*þÿ² üÿ‡„þÿô•)‡w læF�… ¼"÷$¾ú;Ò¶úÁ¾úÁµ Á5 Á5€ €Ážú÷ lúÁm˜úRòm ×þÿÊ÷‹ŒúË ’÷‹�ú÷bpúÀdÖð5€  ÁZØ÷ ’÷Á/*÷ è÷Ó Å ½‡w ÔåÀ.Ö7 ,ús&æéÎåÖ-Îô�÷ôèÆôÁJ*÷ ²÷€Àe"æ8÷ Ú÷úú÷öùú÷ÊèüùÅ((Ä(Þ ••UÔäù÷íàùÜù�Þ ÷ „ü‡÷ Îùù÷ Æù ÷¶ùÀùæ÷mºù¶ùô²ùþÿæpĦùÂ((Å(÷lèšùü"Í Þ ‡÷ <‡¦Â÷ Îøƒ‚Õ ¢(â î· ôÄ ÷ fùç÷ ¶öÛ÷ °ö– ÷ Hù¢– ‡¡ðµðµ€ðµ€±‡w ¾äÄúçÄíÊóÄðçÄå ÁäçaÁ ý·ùÃúøƒà�7ôø÷ìøôø  ÁìøÁíºç�‚ ú‚ ·Òø÷Ìø‡RO,RW,€D,I,@GBL,LCL, REL,ABS,OVR,CON,SAV,$$$,00PNM§3eaek›’%2NFile: %X Title: %2R Ident: %2R%N <%2R>: %P %P %P %U.%N >>>>>>>>>>>> Undefined reference: %2R%2N%7Sž)æ(œ)è)è)è)®))).)0)2))š))î)w üêÄTÛô5€wúÀNÛ÷ ²ô÷ <÷ –õ‡÷ ÐõÃå ƒ À ø †(ðÄ(Å÷ °õÅ ûÃåÁ (Bœ— J‚ ÀôÚú ”(à 燇Àe÷ ^ß<‡Á (wþ‡‡ñµ Àe"÷ @ß ‡ðµ÷ fñµæêÞ ‡÷-¦ÚôÛðµõÖ Ö À (÷ ‡÷µˆþÁrÚñ5‡‡%ÂrÜ‚`Á÷ ^ÝÖ ÄNÚ&Ž Á÷ ä÷ ¦åÁðµðµ p`Î îÖ ‡7 í‡Àe"÷ ŒÞ†À (÷ ˆ‡÷ dûÁ Ü÷ BûÁðÙR RRR Á(÷ „û‡f&÷ 6û÷¬ìÐý€Žðµ÷ ˜ã‚�÷ Ðú ’J÷ zúÁ>(÷-°ÛNø ×-Hø¯÷ Høw,û·Š3ø‡&Á>(÷‹'ø÷ û÷ Îú÷Dìhý€ ÁX(÷ úú‡Á>(&÷‹ù÷÷ èúÂ>ý÷ ê÷Á‚(÷ Öú¼"€÷ €ü· Ò÷·ý÷ ý÷ vú÷ìëý‡#òº~â#®#Ø$Ø$Ø$Ø$Ò$ò#$ $"$$$$Ö$"$"$w ð÷ ìý÷ Îú‡÷ ûÃå ƒ À ø f#ðÄ6#Å÷ èúÅ ûÃåÁ4#Bœ— ‚ À,àú t#à ç‡Â.â‚`Á÷ ã7Hÿ7Dÿ÷•Gÿw:ÿw6ÿ×-`à÷ ª‡‡‡‡Â@#RRBœÂÅ×ÿ·�ÿ÷ ªÝG‡Dœ ŵŵ€÷ ˆéŵ Âmà·ØþÄ &ÅÅmÿwÑÎþŵ€·áÞ †7 á÷Å€¶þ7 ôàðµ€ððµìðµ ÷mÔß�þ÷-Rß àá– 7Š…þÁ@# ‡Ö ‡‡7 &ò‡ÀÞ°p°÷ .†`Á÷ â‡ÀÔÂ(#ÁÁ ý ÷5 TàÊÁ"#ÂÙw vîÅpÍ5@bÍ5@VÀL#ÁÐàPHPJPLPNPPPVPXPZP\Pœ^ŠÍ5ÈÕÀeÐŽÞÐ�ŒÞŠ@÷ ð†ÍE@@3ÀJÝ÷ Äçð•#÷ ‚7P¬ý †ÍE@`Á ÷ Fá÷ 6ÿÀ&÷ ÞøÀÝ÷ ¶ï‡À–ÁL#÷ N À(àÍ5÷ .÷ ”ï‡w ¢íæÞ ‡ÀòÝð5€ø÷ jýõ‡æ¼À0Àæ¼Àpàæ¼À àæ¼Àtàù¬sNÿ Füäè1±o†  ­,  ­s, ­,2:BJR  ­3X|Œ    ­s, ­ø�wµWÊÎêV ^ w ûÀ€÷÷ Îôð•#÷ H†`Á ÷ Zî‡7bŠÿ÷5„ÿ÷50°ì÷5tÿ×-žë÷U ˜ì÷U�ìÁrì÷ ÆöÄÆTTÔ ÀNÔ ÷ äêÔÞêÔÜêÔÁ6ì÷ ºôÀe"Áø÷ Jïj‡÷5ÿôm@ëþÿ4Š7 \þ÷5êþ ÷5ì)Ã÷ &÷ D· <þ÷5 þëTTÔÕR÷5¶þôÕ ÿÿÔ•T÷ ×-Îê÷ ÷ dÄÆ÷ ú÷ Ø÷ øÁ˜Â÷ ÷50¤ë×-šê÷ ÌÁvë÷ tõ×-Šê÷ ÊÁšÂ÷ ÎÀ ö÷ †û‡Âb÷ öìÄÆÔÔCÃetÃ5Á÷ ²óÁ”A ñ û1,÷1,ëòÔ œŠ÷5ÔýômêþÿôÅ üÿ ÷ `óŒ÷ ÌÄ%8 ‚æÊ!ÁÆBà÷ („‡Á°@Àe÷ Æíwöü7 üDÄet=ÃÖ÷ ó+&  ÷ üò+Œ�÷ òò÷•ìûÎðµw ¨ü À²Á Î÷• ÀûÁÀ ÷  Â ÷ ˜‚÷ ’÷e†ûÁÁê÷ ôÀXwnw JøÅ¤èCÄTŒÌÌEoÿÌU`ÌÍ5Ó ÔTÔTÓ ÜÔæÀ ""Á Ò ­Ê,÷ <ò<ŒþÿÎ í– Ó ÔÔÀ ""w-–éÒ­Ò3XJ�ÄšéÁ ÷ æÂa÷ ÜÁ.Â&!†Âå÷ Æ÷-üçLé÷ léÀÁÂD�‘ˆ‰Áî ÷ ˜Â÷ �õµ4Ã`S�A÷ Œñ{ÂR�ÁJ�33ómÜç3 3ÁT ÷ <Â÷ 4Â÷ ,ÁˆÂ÷ ‡@÷5´è ÀeæVÂ¸Þ ‚‡¦÷ ÷Àe”&€&÷ úð÷ ö‡& ðµ÷ Þððµ Ö #w~úÜÁ  ýóµ€óÅ 3 3 �4Šóµ@ ÷5òú÷ Xúw6Á ô•÷ zðð5ó÷ 8úð÷5Äú÷5ðç÷5 èç÷ ü~‡@Àe"æVÂ¾Þ ‚t‡¦4Šðµ€÷-Øùæð÷ ððµ  ðÅ ôÕ7, °ùÝðµÙÂeÁ”A ñ û±"ø±,È󔔌ÒÔÅ“ÿÔ•÷5ú óµ ó ämJæäE %óµ ÷ ¦å÷5 ç÷5çëôìþÿ÷ D˜÷ „åúô5üÿöÊ5Ê5 ðôUüÿì‡Á”Añ ûTTÔ•@Ô• f÷ ø�í00XNÊMl1DATADATADATADATADATADATADATA‡Á÷  7zùÀÁR ýÁLÂ÷ æÀô ÷ ÒÀþ÷ ʇw ¤ôÀþä7`ù7\ùÀöä÷ @wRùÁf ÷ ¨÷ ²æ‚#Þ I‡÷ ä†wB÷  7 (ù ñ÷ ÚìÄêø÷ ÷ ú  7 ùß÷ î÷ öø÷ ˜�ùÔ÷ äø÷ †�÷ ~�Àå7œøW!i‚Å gý ~êÁˆøBà÷ ·‡wÆ÷ 8@÷ ’€÷ ŒÀ÷ œwª÷ Ú@ ñ5 ñ5 Å‚ä@a÷ \@@a÷ R¦Âäッ ‚·$øÒ à ú&€÷ .€÷ @÷ À÷ 0w>÷ ,w6÷ ÷ ¸�÷ Ø÷÷ Å ÷ Å úwÂŽå‚`Á÷ zæÁÁePó ±PPÔЕÐ Ä%< ‚æÆ!ÁÄBà÷ „‡À<ïp°÷  †`Á÷ æ�`‡w ®òÀãÀeæ8Þ ‡ðµúðµ ö0ðµ€0 ÷ Bîê‡ÄÌâ&Ž Á÷ žì÷ $îÁðµðµ p`Î îÖ ‡�À�À‡Ï ÷ ¤÷ Èö�‡&÷ –÷ ºöÎ úÖ ‡Á®ö÷ ØÿÁ ü‡÷ ¸÷ ¾ÿ7îõ÷ ¬÷ ²ÿ7äõ÷å„öÁœ‡&÷ ÖÿÀ2âÀe÷ ¨æ=‡wjö Ã&âðµ  ƒwNö¦÷ äë‚€‡&÷ ”ÿ÷ Öß ‡Ö   ðµðµ€÷ ²ëðµ ÁmFâ f÷ B�€‡w(þ ×-â&÷ zëŽ&Œ÷ nëÁm â�e€‡÷ >ÿ÷ Ò÷å²õ@lñ5 ñ5 ÀmÞá÷ ºþÀ÷ ¤ÿ@÷ ®þÀ÷ ¾þ‡w Üð÷ÿÿ õ& æ†â· –õ¦�÷ Òì7áw áÍ �÷ òê÷ hì& íÖ ¶#ê–%÷ bõ�÷ ÎêóÖ ‡÷ Tõ ÀßJõ· FõÀàâ÷ Ä †ð¥öÿ*± `Á ÷ ¼ã7õ7õ‡÷ ºÿ&÷ ´ÿÀ€U‡·õ7 õ÷€øô7 òô7 ðô7 îô€Ápàfj&�Ž÷ ~±‡÷ 8ê6¦vwLàÂ@à7<à÷‹²ô(Àe"Á@âÁeB$$$ÀåÁe((Á à·<zôw<rô  w<hô÷ ÷ ÷ ÷ Vôw<Lô·‘Jôð•#÷ °†`Á ÷ Ââ÷ ò÷%ìàWñ5@ñ5 O€f &�F÷ né6¦vw‚ß7vß7 æó÷ æó*7<Üó&ð5@ ÷‹Óó÷ ª÷•Çó ÀNáð•ð•÷ .‡÷ †`Á ÷ "â÷ „Þ ÷ Ê�Ž÷ bê·Ž ÷ R÷ fÞ ÷ ¬�÷ FêŽ7Š]ówvþ÷ Ró Àæà7ó‡7 2óÀºÞÁÈà÷ ÌçÁ®ÞÀ¼à‡÷‹óÀ°à  ÷ ”‡�÷ <êw (îÁ�� Á EÅå‚EÁ ÷ J3Á÷ ÁÅ÷ 0èÅ ý‡À@Þ 0 � Á Á À*÷ Ìï‡w ÂíÅRßÁ Þ& f wˆò÷ ìç÷ RÄ  öÄÀöÝ& ff÷ Æç÷ ,ö� ÷ ¸ç– N ñ– õ„ !‚æ6ò¦í– ‡U ‡€ &îÂ& ÿ 0è0 3æ¼À àæ¼À0Àæ¼À$Àæ¼ÀHÀRO€×$œ2RW€Ö$œ2SV€×$�2Ø$BÁ Á ýõÿÿ.õä(õõæ( õ &• H’ � ¢ûƒ€ ¬ÿÿ;ö ôàwà途 — ; — !— ,— :ò&À u@à5€Åe,‡ ¤RN¢Oõ€þÿ¢WE€ ”‡5& ”— , — ! — [Ž ó— ]ðÎ îÎ ìÖ )@íÀ 55 ,õÿÿ.@÷ ¦‡õ€2÷ ÒÑõ’2È•f ¦Â ÷ ˆ‚�ð5€ƒ@‡– ÁÂöw2Ó· –ÑwÀþ· ŽÑw^ÿ ¢-õ€þÿЋ¤Sæ¤Vã”Íÿÿ‡÷ 8‡w Œß÷ ‡÷ 8‡w |ßÁeB$&wæ¼À8Àæ¼ÀÄÀæ¼Ààæ¼À,àæ¼ÀTà00`NM§3eaek›’w "á„ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ °E�€Aa×$Ò±œÿÿ‡f÷  Û†Â*Á÷ îÓ�ÁeÁE�  Á ý‡Á,Á*Á(÷ ÁeÁ(÷ ð ÁeRRR‡÷ .Ú¦vÁžÒð pbÁeBÂeRRRRR R RÞ �‡Á÷ Xÿð&Ð&Á˜÷5¬ÑÁe ÷ ÊÙð"ð•�ppplðe5lÂet²°”°–· rЇ·òÍ÷ Špðæ3°4Îe°6ð•(ð3÷ œ÷ xH‡· hÑ· `ч·¬Í÷ Hð²þ pðæ3°4Îe°6ð•(ð3÷ H÷ ,䇷 Ñ· ч�7 bþwœ\þ· XþÁeÀþЇ‡ææ)ÿˆwŒ@þ †7 >þ±� ÁI÷ 4Ò‡Õ ÁAæZ”� ‡Ž ‚µ�þÿ”� ‡Ž ‚µ�ÿÿ”Ö 5Âä5ÂÜ5È‹Õÿÿ+& È¥+È¥-Î € Ê Ö  U÷ œÿÀ ÷ Êÿ‡ �f  ÷ *ýuüÿ ‡�÷ ýuþÿ‡�÷ ýü†Ö Â¥ Â¥ ”ø‡È¥ È¥ € ø‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡æ¼ÀÀæ¼ÀÀæ¼À„Àæ¼ÀˆÀ÷ &÷ &÷ �’•’•€‡@Á(÷ Bf€  Àe ÀeÉÿÀe Àe ‡5/5M5l5„5¤5Ì5á56,6R6p6‹6³6á6ÿ6/7\7�7¿7ß7 868k8£8Ä8ã8 9-9Q9u9’9¯9Ø9ù9:F:i:‘:»:æ:;,;Y;‡;·;Ü;ü;!<J5‡W E5ƒW ¾s‡W Ås ƒW !€ ‡W 8€ƒW >€‡W E€‚�W ¡Œ ‡W ¸ŒøƒW ¾Œ‡W ÅŒòƒÖ $|³Æe ‡ÿ TÞH´<ÿ LÞTÌ=&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡Illegal Get Command Line error code%2NCommand syntax error%2N%VA%2NRequired input file missing%2NIllegal switch%2N%VA%2NNo dynamic storage available%2NIllegal error-severity code %P %P %P%2NCommand I/O error%2NIndirect file open failure%2N%VA%2NIndirect command syntax error%2N%VA%2NIndirect file depth exceeded%2N%VA%2NI/O error on input file %X%2NOpen failure on file %X%2NSearch stack overflow on segment %2R%2NPass control stack overflow at segment %2R%2NFile %X has illegal format%2NModule %2R ambiguously defines P-section %2R%2NModule %2R multiply defines P-section %2R%2NModule %2R multiply defines xfr addr in seg %2R%2NModule %2R illegally defines xfr addr %2R %P%2NP-section %2R has overflowed%2NModule %2R ambiguously defines symbol %2R%2NModule %2R multiply defines symbol %2R%2NInsufficient APRs available to map read-only root%2NSegment %2R has address overflow: allocation deleted%2NAllocation failure on file %X%2NI/O error on output file %X%2NLoad addr out of range in module %2R%2NTruncation error in module %2R%2N%D undefined symbols segment %2R%2NInvalid keyword identifier%2N%VA%2NOption syntax error%2N%VA%2NToo many parameters%2N%VA%2NIllegal multiple parameter sets%2N%VA%2NInsufficient parameters%2N%VA%2NTask has illegal memory limits%2NOverlay directive has no operands%2N%VA%2NIllegal overlay directive%2N%VA%2NOverlay directive syntax error%2N%VA%2NRoot segment is multiply defined%2N%VA%2NLabel or name is multiply defined%2N%VA%2NNo root segment specified%2NBlank P-section name is illegal%2N%VA%2NIllegal P-section/segment attribute%2N%VA%2NIllegal overlay description operator%2N%VA%2NToo many nested .ROOT/.FCTR directives%2N%VA%2NToo many parentheses levels%2N%VA%2NUnbalanced parentheses%2N%VA%2NIllegal logical unit number%2N%VA%2NIllegal number of logical units%2N%VA%2NIllegal default priority specified%2N%VA%2NIllegal ODT or task vector size%2NIllegal filename%2N%VA%2N‡00hN¾Nl1DATADATADATADATADATADATADATAIllegal device/volume%2N%VA%2NLookup failure on file %X%2NIllegal directory%2N%VA%2NIncompatable reference to library P-section %2R%2NIllegal reference to library P-section %2R%2NResident library memory allocation conflict%2N%VA%2NLookup failure resident library file - %X%2NIllegal partition/common block specified%2N%VA%2NNo memory available for library %2R%2NPIC libraries may not reference other libraries%N%VAIllegal APR reservation%N%VAI/O error library image file%N%VARequired partition not specified%2NInvalid APR reservation%N%VAComplex relocation error-divide by zero module %2R%2NWork file I/O error%2NLookup failure on system library file%2NUnable to open work file%2NNo virtual memory storage available%2NModule %2R not in library%2NIncorrect library module specification%N%VA%2NLibrary file %X has incorrect format%2NResident library has incorrect address alignment%2N%VA%2NPartition %2R has illegal memory limits%2NInvalid partition/common block specified%2N%VA%2NTask build aborted via request%2N%VA%2NDisk image core allocation too large%2N%VA%2NInvalid window block specification%2N%VA%2NTask requires too many window blocks%2NTask has illegal physical memory limits%N%P %P %P%2NLibrary references overlaid library%2N%VA%2NTask image file %X is non-contiguous%2NVirtual section has illegal address limits%2N%VA%2NFile %X attempted to store data in virtual section%2NResident library mapped array allocation too large%2N%VA%2NInvalid reference to mapped array by module%2R%2NEnd of file reached before .END in %X%2NSymbol %2R not found for patch %2NSegment %2R not found for patch %2NSupervisor mode completion routine is undefined %2NLibrary not built as a supervisor mode library%N%VA%2NSupervisor-mode library reference error%N%VA%2NIllegal system size specified %2NConflicting base addresses in cluster library %2NLibrary %2R not found in any cluster%2NIllegal cluster configuration %2NCluster library element %2R does not have null root%2NModule %2R contains incompatible autoload vectors%2NCluster library element %2R is not resident overlaid%2NSegment not found to address round%2N%VA%2NLibrary build not requested - ignoring option%2N%VA%2NIncompatible OTS module%2N‡À*ÆÀe"÷*Æ*ÆÂÒ=RJ÷ ŽÊ‡wÆ Þ ÁfÇ+÷2ÇÆÿÀÂÿ$7¼ÿ!÷ rÇ ÷-êÅ:Çw 4Ç"ì&f÷ ¬ÏÀe"ÁÐ=÷ <ʆ–%ßwÀÅ·ºÅ�Þ Ø±‡À(ÆÀe"÷(Æ(ÆÂÒ=RJ÷ ŒÊ‡wÆ Þ ÁdÇEæCÀhÁÌ=æ Þ ‡ÀeÐ-®ÿÐ-ªÿò– ƒÀÇ$È '÷ JÇ ÷-ÂÅÇ7" Ç,ïÁÇa(Q$É éH"û7`ÿ&w–Åw”ÅA÷ dÏ¡�Þ ÀDÿÖ ±‡|³°x–,?0?0ÁÁ W  &[qÀÿÿÿÿ W Ø00¿NM§3eaek›’TITISYSYSYSYŠÜÆ0ÀøØRVˆ+ž.ˆ0ÀÜÆ0Àl SLP -- Command file checksum is %P SLP -- *DIAG*-Error in command file %X checksum ÀþÁ"ÂðÕa÷ úÁ ÂðÅa°bpd÷ $‡ÀefÈ ÷ \û÷5öù÷ Ê÷ Xÿ7Ôù÷5âù÷¥-H& ÷ žÁ†"P”þÀåÕ-7(&‡œ`Â¥öÿÁÂ¥ÿÿÁÂ¥þÿ ÁÂ¥ýÿÁÂ¥üÿÁÂef÷ ¢±‡ èd w 0'Äf· `ùÌ5· Vú÷•?Ä%÷¥ À%÷®%Ì5@)Àø÷5€:ù÷5@2ù ÷5 *ù ÷ úðú@ðù@ðÔ-ðn%÷ n'†ÌE@`Á ÷ Ì5 qÀÐ-È à ÂêÁÐø÷5ÀÒø÷5 Êø Á¾ù÷¥.(%÷• % W 'Áå'R Ћü ÷ ü&÷eø$÷ Žø ÀBðlð‚ø÷ ä&-‡À,ðÎ-ðÎ$÷ Î&"‡÷¥ Ê$&ÃÌ5À0 ÷ ®&‡ƒ ÷`:ø÷-6ø2ùÀèðèð÷ Š&†ÌE `Á ÷ .7 ø÷•.p$ÌE‡  w œ% EÐ ÁDÐW!!Å õ ” Àl ˆ Á`ÁæÃh óµ„ ¦ÂøÁÌ!Á•!ÀÈ÷ º%‚A”÷ °%ÀÈà÷ l‡Á¨!ÂhÊ ÀÈ÷ Ž%ÀÈàÁå÷ F ‡!÷%*øƒ÷"ø‡÷ø· ~øÀ8 ÷ D%ÀÎ ÷ <%ÀÆ÷ 4%ÀÊ ÷ Úw4ú7ÿw ÿæn ÿˆ‡ææ)ÿˆ‡Ë5÷ ý†‡÷  ‡÷5Èö÷ Vû÷ Jý¡‡ÀÐ ÷ $% †ð¥öÿ*`Á÷ ¼þ±0Àe÷ üû· |ö÷5À†ö÷5 ~ö÷höp÷÷5pö ÁÓ-B� É‹W¢ W¢ ÀUB€ 7 :ö ŠÂåÔ-·œ"‡÷E0ö÷5*öw ö÷UöÂöB ÀÔ- Ð¥ ÁU� B øB ÷5€òõÁEÁeЕ ó� Е ï‡ÁÔ-”þ÷ 0"‡÷ ¾öÂ^Á÷ Øý‡ÁÀ�Á@ÃÀ€AÂÆÀ€AÇÁÅ�Ä@ÌØð<(ä lx´PœˆDC•¦Î@ƒ@ƒUÄÃEðÿà ð ÄEÿ„ „ „ Ð &Î@AƒUŠÂæŽ@Â@‚UÁ â‡w â!Ã-õÃõÅ. 7 Üÿ7 Þÿ÷Öÿ·Ðÿ „”÷¥-ÆÿÄ¥/7 ¼ÿ$÷ ¶ÿÄ¥,· ¬ÿ÷%¦ÿ#Ä¥;Ä­IøÄ¥ Ä¥ 7 ~ÿ÷ xÿ· rÿÄ ‘� à Íõ¥ ÿÿÁ Á Å.  ÷ þ·@þÅ. ÁÂ<ÿ÷ òý·00ÇN¾Nl1DATADATADATADATADATADATADATA4ÿ‡Ë5 Àr÷ š‡ð•#÷ Ê!Á?‡Ë5 Àð ÷ z‡ð•#÷ ª!Á/‡ðèð÷ d!†ËE `Á ÷ ûË5@À®÷ 8‡ð•÷5€äò÷5`Üòð•ð•#÷ L!†Á`÷ Üú‡æÁeB$&ðÕ<÷ !ƒ‡ñ•ñ•w J @pdf ¦Âˆ,÷ !‚�B„œ$‡Äµ4ĵ!ò%'‡ò% ‡ò%‡E$ÂeæƒÕ�@à P”üÎ öÖ Á Á Âe ÁÂe Á Âe÷ ú±& ĵ€ V ‡11@÷ b †BÂeÁ÷ èù±‡¦w ä?Š ñÀ¦„ ÁÔ- ƒ P”ýà ¶!÷>ÿà Ŷ! ÷ Ά¢Á÷ ù‡÷ (ú‡Þ †÷ ªøÀì`Á÷ æø÷EÀ𱇷 ®ð†÷ øùí‡Þ ø‡Á,É%:`· jÿ×-fÿZ‡7 è‡7 â÷ Nÿ)w >æFÿ±Þ w <ÿ Á6ÄÔ-÷ – †óÁ:BC ¡Ì‹±çÔ¤ø… Dò÷(ðþþ7 –Þ ‡÷5(ð÷ ¶ô7 ðw¦ö· pÁðÂ6Rʆ"‚ŠÁ ý‡Á,À4"‡Ùåá:÷B¸þ ™ ‡÷ ¢þæžþ÷-¾ï0 ‚—#ªÞ ‡÷-¨ïú‡Þ Ö Â¢Á÷ Â÷±w fþ‡÷m^þøÛ· è7 XþÁ6wHþ ÉÚ‰ B ‰‡7 8þ÷€4þ‡÷ª,þ‡Á6w"Dï÷�°ÙóÉ Ñ Ù�¤¡ ‡7  ÷(ïþý÷%ªüý· òý‡7 Š&f¦wt÷‹p÷ Æ7 h7fÀjÈ @•,€ÀåÀÿq `-KacJE[à !Ãm*Äí&@•Á †Õ Á ûα)÷ L÷ R†é  çà å÷ò7•òà f@• †Õ †&Ý €…Ò€Ö À5]U ¦†E¤¯‚…€Á°‡ :Á¤‚æ&@E÷ ÿA ·�Îà·ˆ ̆ª ÷ Š÷ Р¢ÂÀEÿ÷ vœÀEÀÿÀ €cÁXÂV¤‘Á ü¢ÿ­÷‹A‰÷­<9¦†„÷ @�Á à £.„ à · æ&fÅÄ ÃÈÁ ÷ F÷ 8…„ƒ¶à ÷ 8 †À ÷ "†À £.£$· Ê„ à ë÷ À‡Ì¥Z‡£A‡Ì¥9‡£0 ‡ à £ £ ‚ „ à ö‡÷ &÷ &÷ �’•’•€‡@Á(÷ ôf€  Àe ÀeÉÿÀe Àe ‡&æ¦f&¦ v Þ €�‚ƒ„…‡`T<0BSY‚„¬VbÊèAUg£BF€gCMf‰CSfŽTRfSQ fRS@fNS€f,¢7ÿ SLP>ÑÌ„ZÆÞ&Ip”±Ñô 6 U u ‹ ¤ ¾ ß !!7!\!s!ÚÎà NSY „ôh†DBfSPgÆå €&æ?ÿˆ,-fW >5‡W E5ƒW ¾s‡W Ås ƒW !€ ‡W 8€ƒW >€‡W E€‚�W ¡Œ ‡W ¸ŒøƒW ¾Œ‡W ÅŒòƒÖ $|³Æe ‡f¦æ**æ ææŽaææ©ÿˆ†÷¥�ÿòæÀB€÷ ÎÂ¥*÷W ô‡W cñ‚@ –%‚�‡w 5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ Jœ*AdBbAÁepÂ& ¦fƒÂÁ ÷ – –‡ÁPõµ aA”Aíf@pnp÷ ´C*8Ö‹Á ÷ Þ88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ ªõÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw .õ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ d5fµ fˇðµ ÇÈ•÷ €‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ lDlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ ν•8 †õ¥öÿ*Î(Îü‡w ðõ 8µŠjDl@÷ ŠT”ÔÀeBTŸ8œ5l@÷ Ô‡@Á(ñ D÷ ÚÁeB&÷ ‡÷ ‡& ææ©ÿˆ@ð•#÷ ì& æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡ÚÎà00ÏNM§3eaek›’SY „ôh†AUg£BF€gCMf‰CSfŽTRfSQ fRS@fNS€fÊ%N%1R -- *DIAG* -Open failure correction input file %XOpen failure line listing file %XOpen failure source output file %XPremature EOF correction input file %XIllegal Get Command Line error codeI/O error command input fileIndirect file open failure%N%VAIndirect command syntax error%N%VAIndirect file depth exceeded%N%VAI/O error source output file %XI/O error line listing file %XIllegal switch or filespec%N%VAIllegal filename%N%VAIllegal device name%N%VACommand syntax error%N%VAPremature EOF command input fileI/O error correction input file %XIllegal directory%N%VAI/O error command output fileIllegal error/severity code %P %P %PLine number error%N%VA%D lines truncated by audit trail%N%1R -- *FATAL* -%2N%VA%NÑ(;,è!ÊÀ‚ôÈ�",Ú!;8ʆ8,8ð!À‚È�",ð!À„"/Lú!À„"/Ô "ÊÔІú!À„";Ê„/Ô.".&P"ÌŠÀ„/ÚF".¼."ÊÚІh."+8`"À„+`"ÊÌÀ†Ì̆Ì×'&ÿÿæ1ÿˆæææÓÿˆ‡¦Þ5Îe‡w Ä Á,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡wÌ ù èî"‡+ÿÿÿÿˆ,ñ\-æ²!ÿˆ×-ÖÒñŒ/‡÷ 禃D- ‚ŠEŠ… %µ¬ Âó … Â ÀœÁÀ À À ÀU€À �€ÈEðU€Ö ‡Ô-. 00×NOl1DATADATADATADATADATADATADATA¦Ê5‚ú‚‡ò û¦¦‚ Ž Ê5ùÊUŽ‚öÖ ‚åŽ/f" ¶.`.˜"@-‡ÊEò ÊU ‡¡*‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡&æf…Þ ƒ„…‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&æ¦ff… Þ �‚ƒ„…‡‡æ¼À àæ¼Àpàæ¼À€Àæ¼Ààæ¼Àhàæ¼À0Àæ¼À|Àæ¼À�Àæ¼ÀÀæ¼À$Àæ¼À,àæ¼À àæ¼À8Àæ¼ÀÄÀæ¼À@Àæ¼ÀDÀæ¼ÀˆÀæ¼ÀXÀæ¼ÀLÀæ¼À<Àæ¼ÀHÀ|³¸¢–,ÿ'ÿ'j  W  &[qÀÿÿÿÿ W lTITISYSYSYSYOVŽÄÀ0ÀølŽZÜŒ0ÀÄÀ0ÀÜœî€SYÜl¸¢×'ÿ @ ZAP>ÑÌP _€ÜžžŽÔ'÷|ýÀŠðbð’d÷ Ø †ð¥öÿ`À M÷€üÿ•X|ü‡€7$¬ÿ7"¨ÿ÷ "7žÿ70û7”ÿ7&ûÀŽ÷ J-‡÷ L*‡‡÷ €ÿ7 zÿ÷5xÿ&÷fÿúú÷bÿöúÀŽ÷ ‡÷ €‡‡æNÿÎåÜÀ °÷ ‡÷Ü6ÿ‡00OM§3eaek›’À ÷  ÀÿÿwX÷ð÷¬üæ¨üæÿˆæ3ÿˆw²‚€��m@ ‚ JÊEþÊeÜà €  à üÀE€ÿ‚ J‡ÎÎe²ÿw�æ´æ²Á¬w¨æžæ¢æ 7𿆿†æ€Àz7‚7r7p·n·áhX·hælæ·fæT‚Âe—"ÿÎeæNæ@Îe7 6À4ø Â6·.ÂÂe—"ÿ/÷ Æ À5Á·þ·ü·ôÀ·þ·ø·ì·î·è‡ÆÚ€7ÚÀeæÿæ·Â7¼÷íº¶X÷¶¶Æ¬·®€6Àe·-Ž w –ä€7 Š7|Î7 ~ö 7rÆj€Æm^ÎbÀd‡÷R‡÷ Dþ¦f�Þ ¦æf�Þ ¦æ&f�Þ ¦æ&ff� Þ …„ƒ‚�‡, Î w l5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ xœ*AdBbAÁepÂ& ¦fƒÂÁ ÷ L– –‡ÁPõµ aA”Aíf@pnp÷ 2C*8Ö‹Á ÷ 88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ PõÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw � õ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ â 5fµ fˇðµ ÇÈ•÷ Π‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷  DlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷  ½•8 †õ¥öÿ*Îø ÎÌ ‡w R õ 8µŠjDl@÷ Ð T”ÔÀeBTŸ8œ5l@÷ z ‡@Á(ñ D÷ � ÁeB&÷ b ‡÷ ‡& ææ©ÿˆ@ð•#÷ R & æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡wJûƒ÷5Šø4à ö€@ À€‹ÀÀEþ7š€ÀŠÀ 7Žæf¦æfæd÷ :ùÎf÷ ‚ø÷5hÎþÿæ÷ XùÖ ÀR–%G ÁøÃ 3É ,„ ‚ ± &‡@Àÿÿ€ †æN`¦æfæd÷ ÖøÎf÷ ø÷5Îþÿæ÷ ôøÖ ÀîÆe‡Áew ÚÍ‡Ä ÀÀ÷ æþÿæ÷ ¾ø–%‡f÷õæ ÷ Æ@À ÷ º÷ øÖ �‡w(úææþÿŽaæ6ú·2ú÷ v÷p7n÷ V÷ b÷úúÆe‡ærææ÷ œøÆe ‡wÚùæVæþÿŽaæèù·äù€ø5÷ ÷ Æ÷÷ÊùÈùÆe‡ætææ÷ NøÆe ‡÷ `ÿw¢÷¿�ºö· ¶ö‡fÀ®ö�É‹P”ü7žö�‡w4ùÁ €@ì(6‡‚ ÷vl( — Âe.Âe Âe  ¦÷ ”ÿÖ ÁåÝ€‡f÷ z ÷ v�ÿ•06ö· 2ö÷ÁbÁEøÿ· Z· V· R÷EàL÷ J÷ Äÿ@Àe0?�ö· ö�‡·.·& ÷ "�ÿ•0âõ· Þõ÷÷ Žÿ‡No such relocation registerAddress not within segmentNo such segmentToo many argumentsNo such internal registerUnrecognized commandNo open locationCannot be used in byte modeError in file specificationOpen failure for task image fileError on command inputI/O error on task image fileNot a task image or no task headerVerify failureNot implementedSegment table overflowv’®¾Òì0Ln†¤ÈØèZAP -- (@×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ ÞÌ>ÿ ÖÌÿ ÎØ&¦Þ5Îe‡w (Á,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡w~ù è¼Ûÿÿ00OOl1DATADATADATADATADATADATADATAÿÿÜÊ5¦ „Ê €‚Ê5ùà ÷ƒõ…2Å Å ÍUEÍ ø�‚‡À. 6Üf¾‡ÊEò ÊU ‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡&æ¦ff… Þ �‚ƒ„…‡‡ XÌÀ�X| ÀØ�X, ÀÌæ¼ÀÀæ¼ÀÀæ¼ÀTÀæ¼À0Àæ¼À àæ¼À,àæ¼ÀXÀæ¼À àæ¼À$Àæ¼Ààæ¼ÀLÀæ¼À8Àæ¼À<Àæ¼ÀHÀAB6RO6LI6whï÷ 2 7 ®ì7 ¬ì7 ¬ì7 ¬ìÀ ð•#÷ , q‡÷ ÷ÕGéÀŠ0 b÷ ‚ï†ð¥öÿ`aÀ \À–ð*éð"é÷ à L‡ð áÈ•÷ Ø D‡ðµ@È•ðX÷ À 8‡ðµ4ðµ0ÀŽðÄð•#÷5ìð•#÷ ” ‡ÂÎÃRà ýÁeÑ|éÑzéÑtéÑré áea ÷Å…è‡À À÷ 2ô“÷ ,ôw–ìwZî ƒm Á à B Á üä‚ Ð �ȇ÷”ë†ë÷e €ë÷-„ë„ëæÜæ?ÿˆ‡À.éæÜ& & æAÿˆ‡ÀmJäÀE7Vë÷VëNë÷å Jë÷-DëD놇À÷ ¦ówì÷ ¤ëÀŠ÷ º ÁÎÂŽÃRà ýÀŽ÷   †wÎëÀ ÷ ’ wØëwºíÆå æ,#æþÿŽaæÄí·Àí÷ þÀØêÀe 7 Òê ‡À÷ 6óæÿÿæ÷ äë–%÷´êØô÷5ªêÀÌô 0 ðÿÿ0 0Š 0 0 0Š ÷e¦ôwdæ<'÷ ´ê ÁÝ'è÷5@$èwX÷5 è(À|ôW Áà HÊðìçÁìçÁŒ  ÁÅ?ÁmÖçpÎ÷ fþÀ@ô0Š 0 0 w7 ,  W ‚ Â5Àà Ê7 7ø7  †Àà 7Èú· öÎd&÷ ê7 Ø7 ÐÀÚÜÐÀÐóȼˆ ÂÂí´°pÎ÷ ÔýÀ®óÈž0 0Š 0 0 0Š ÷e�ó÷-Œófé ‡À÷ ÊñÎÿÿæ÷ xêÖ Àn7lÜZ×-V‡÷åL· Fö7lÜD÷ @÷å8· 2÷7 .÷e2©÷Àæ"6 6 W ¶ ö5Àà ð Òöö5Àà ð Ü¶ ÁÞòà C`ÄD`ÂTæÅE`ÀPæÀŒ ÀÅ?6¶`ö v` ö v` €À l¤'Ë•ö5Àà Ê7x7v ¶Œ�> > 3ŠÎ@WË•ö5Àà Ê7: Œ�> > 3ŠÎ@÷ :ü÷eòÀòð•  ×­•åƒ Ã5Áà AÖwèHöfå° †Áà AÜÁŒ  ÁÅ?Ám>åp0 0 0Š Î÷ ÂûMË•ö5Àà Ê7„7‚ ¶Œ�> > 3ŠÎ@÷ ~û÷eVñÀRñð• ×­ÛäÁà HÐðÖäðÒä0 0 0Š  ÷ <û×­©äÀà ?ÊñwxË•ö5Àà Ê7è Œ�> > 3ŠÎ@÷ èú÷eÀðÀ¼ðð•  ×­Cäƒ Ã5Áà AÖw–Höä° †Áà AÜÁŒ  ÁÅ?Ámìãp0 0 0Š Î÷ pú÷eHðÀDðð• ×­ÍãÁà HÐðÈãðÄã0 0 0Š  ÷ .ú ×­™ã� Á5Àà ?Êìï÷eæïÀâïð•  †Áà ÃtãÃeƒ ƒ ƒ ClÐÈðvãðrã0 0 0Š  ÷ Àù×­-ãÀà ?Öˆï÷e‚ï΀¦Îe,÷ ²ìÖ Á )Îhf÷  ìÖ À !ÎXfÎe÷ ŒìÎHf÷ €ìÖ À5@Ám,ôÿ 4ï ÷(ï"÷üäN÷ øÖ ÷5êähÎD'÷ *îÎï÷ <îÎï÷ 4îÎR'÷ î÷ på΄'÷ î÷ dåÁ¶äÉ Næ÷ ¨îÎ’'÷ èíÖ Î–'÷ ÜíNæ÷ ˆîÎ-÷ ¼íNÎ æ÷ rîÎ ÷ ¦íN ÷ ÄíN÷ ¼í BÜ — ƒÂ  Î '÷ †í ú @Ü À '÷ rí÷ ÐäÁe–%w Bî²‡Ö ÷ôæòæÆe‡& æ$&÷ ~åÆe‡w¬æ¦)‚· æ¦÷ Jë6ÀEðÿú?`öÎö¦Îe÷ *ë6Îä¦Îe÷ ëö5 YÁȱ ñ±m ÷ ²À @`à ȕȕ ö5@ È• 1 1 ñ�€ ×-xÎz¦Îe ÷ ®ê1 ÁdÎd¦Îe÷ ˜ê1–%ÎÀH÷ h÷÷e>÷-:ã†w¢À÷ vëÎÿÿæ÷ $äwˆÎ¦Îe÷ Nêà Ä [Áþ€ € ÀE€1ñ ñqlÎâ¦Îe ÷ ê1 ÁÌÎ̦Îe÷ ê1À¶Á `ñ�¨÷ ¤Ä à ɕɕɕö5@ É• Î÷ šö÷ep÷-lHâ ‡À÷ ¬êÎÿÿæ÷ ZãÖ –%Ä ]ÎL¦Îe÷ €éÀm@?6Á2Î2¦Îe÷ fé1Á1qlΦÎe ÷ Fé1 ÁüÎü¦Îe÷ 0é1ÀæÁ `ñ�Ø÷ Ô É• ö5@ É• Î÷ Þõ÷e´÷-°Œá ‡À÷ ðéÎÿÿæ÷ žâÖ ÆeÖ ÀŠ7†7 €÷~~ëÎ|¦Îe÷ °èÖ À Îlë÷ @ýÆeÎ\¦Îe ÷ �è–%¶ w.ý÷ 8–%‡€Àe"þÿ À ÷ néæÿÿæ÷ â–%‡ ‡00O2O§3eaek›’ÿÿ RootI-space rootD-space rootSharedI-space sharedD-space sharedI-spaceI- andD-spaceOverlayNo disk allocationNo disk allocation (I)No disk allocation (D)Nullh&j&p&~&Œ&”&¤&´&¼&Ä&Ì&Ô&è&''ZAP Version COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1983Segment table: @ô’æ¼Ààæ¼À8Àæ¼À<Àæ¼Ààæ¼À àwvï � €À5B`Á € ø€‡w~ï�2€/  Á  „ À  …   À5@À ƒ ø   ‚ àà �€ öö Ä  @‡! à � ü€‡ ‡& ÷ ˆÿÖ ‡æ÷ ~ÿÖ ‡f€�€ � £üÁ À Á ý�‡÷ ì÷ ÷ :ùw¦î÷þÿ4÷ÿÿ7 7 Ü 7 Ô7 7 ÷ žÁ€À l¦"@@ÀmòÀì@à ÀäÀ À ÀmÜÀ À À @`7Ð æz"÷ ¨€ À l®"Ö x÷¶¶7 °o×-ªƒ \ÀžÀ 7H"˜À’À 78"ŠÀF€ 7@ Ãr"Àn"Á#Á ý7 "7 ^7 \DÀ4Â>Â;Â8÷N<÷F0÷ô(÷ö ÷Õ&÷ ®×-R ×-±‚ÀÀ Àe8"Ά"÷ Ö7ìÀ÷ (óÀÜÀ Àe*"7Ò÷ÕÊÖ w¾þ÷ ˆ÷ €· |æŽ"÷ ”7ºÖ ‡fÁ.çÀ À�€ 7Š À ÀçÀmx¢ À+’ÀEÿ�‡f÷5\÷ÅT· 7 L÷ ¢ÿ7FW 0W 7 À2À À À @`7&÷å0 ä�‡f�É‹ É­@€í� õÀÿÿ�‡fÀ7¬ú"°†ÀÀî Üà"œÆ"ÀEÿÀ l#Àw\÷ „À®Àm¬À l2#À÷ ìñÿ�¤ óÿœ˜ó÷`éÿ�ŽŠóÿ†‚óÁ iW  ÷5f À÷ ¬ñ7 Z7 TY@À À l<#ÀbÀm@ÀXÀí67NÀHÀm(À@Ào*óÀ$óÀŸóÀ Àm*Àe7"÷5,÷ö(÷ À÷úÀò7ü7ú ÷5Ü€ À 7ÌW ÷5ÜÀÀ7®wœ#¬7Š©÷ lq樷tæ÷ nò÷ éwL×-R÷šŒ÷’„÷ > æ|æv÷ ð7j–%À bæ=÷ jñÎXÎEøÿÎe0÷ ZñÎ,÷ RñÀ@ÀEøÿÀ Á:ì8"wþNÃ×-èÁ"Á(æ_÷ ñÀ @àÁåNæ÷ ÌñÎ ÷ ñÎ>÷ øðNæ÷ fû7¬æ÷ ¤ñ÷ JèÆeAÀ†À lH#Àðÿÿ8"0 H"Àåø€1×-¤ƒ À˜À ðÿÿ8"0 H""×-†ñ‚À~À ð|8"ðxH"À÷ ¨ï÷-0^ À ÷ –ïæÿÿæ÷ Dè–%�‡wÔéæ°!æþÿŽaæâé·Þé÷ æ4æ.ÎE÷ Nî÷5 · ñ÷ñÀüð *"‡ H" †&Îå*"æ÷ júÀ N#–% 7 Ê7 ÄÀ÷ ïwôÃEþÿÃm°À¨À lr# ÁߨðÁ¢ð÷ ”:æ¬÷‹©ææ÷ XðÎ:÷ ŒïÎŒæ†÷ ôÖ Â ÷ .Îpæ÷ *ðŽæ÷ ðÎ,÷ Rï€À ÎLì8"æ÷ ðÖ –% æ$÷ 0ïŽ÷ *ïŠÂŽ÷ ï Μl#÷ ïÎ ÷ ïwÌà Çlx#NæNæ÷ ¶ïÖ N÷ èîŠÁN÷ ÞîN÷ üî÷ @æÖ ÷pènèÆe‡& æÀ!÷ úæÆe ‡€Àe"þÿ 7 †7 „7 ž7 ˜÷ äçÀ‡wèÀÿÿÃÁÁ ±-H"±- 8" ‡‚ Bì8"„ ‚À„ Dì8"à é‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:,;+-*.CQ$ACFHLMQX ^_@>œ 0ÀÄÀ0Àw � €À5B`Á € ø€‡w�2€/  Á  „ À  …   À5@À ƒ ø   ‚ àà �€ öö Ä  @‡! à � ü€‡ ‡& ÷ ˆÿÖ ‡æ÷ ~ÿÖ ‡f€�€ � £üÁ À Á ý�‡f�€‘�À ü@�‡w € ‚� ”Á ý€‡æ3ÿˆ‡¦f�Þ ¦æf�Þ ¦æ&f�Þ ¦æ&ff� Þ …„ƒ‚�‡ÌPw¤ü÷ ÷ ®÷ *÷ .÷ jæ÷ Úæ¦ æÿˆÖ ‡¦æ÷ 0Î÷ 0À¬ðµ Žæ÷ Î÷ Î÷ �Ö ææÿˆ–%އ& & æiÿˆ& ÷ ¢ÿæ3ÿˆ‡÷ hÿwêûfÁ„Áíh € ƒ@f¦æR Îe¦÷ ¦ûw`F Æe�‡wºû‚ €ÔÁ„Áí*  ƒ@f¦æ Îe¦÷ nûw` Æe‡w„ûÀ Àe¦� 6÷ €÷eê ‡€À ðµ À‡ ‡€À ðµ À‡ ‡f暀æ`œf& ’÷ ÷e|Æe�‡w û‚ �@œ€ æ$÷ ˆþ—  —   @Ò€- æ,÷ jþ BÔ� B`€ƒm  †B † ¢€ � ÷ †È‹ € úB †É‹� úÀ‡ ‡f×-ê R‚æ„÷ þ÷åØ ÀÔ 7 Ò †7Ì ˆ�ÁŒ Áí„ pAÁíz pðt �‡f÷-  ¢ý‡æŒ÷ ÈýÁŸ� W ƒæ÷ ´ýÀ| ð-@  ÷ JÀl 7. À* 7" W W ÷ fÀF 7 ÷m  Åmø÷e, @�‡w¶ùÁæ@’À � €7 †,bø ƒ¦&Žà÷ "–%æ´÷ Ö ‡w€ùÀ¢AlAbÁeBÁeAbE ú‡ààld †7,v,†,‡0 bð‡w@ùÆå fNaÅeN!‡whC�× ‚×-r ΂æ„÷ –ü÷å` À\ 7 Z †7T H @Ó`@€ ÅEØ× ‡× #‚@�&÷ ´Åeg× $÷ Æ× %`‡× (]‚BÂmÄÅe�æŒ÷ üD�lÃå%à ÇlvææfÎe 9ñµæ”÷ ìû6¶v æææ Ža! ñµW,ÿÿÀ&÷ Âææf f ÷ ‚÷6 ö ¶aÖ ÷ ¬–%Ö œ× )D�€ € € ÀEáÿ& ‘A�fø ^Åe–%†æœ÷ Lû�Æe ‡wº÷ÆåAÁmÆÅeCæ¤÷ "û BÒ @€àAlÂB`Žœ6ŠÎ5æ¬÷ òú DÜÄ5 f÷ €æä÷ ÒúÖ Ãe Ä5CClÄ5CÄ5 W,ÿÿæ´÷  úClÁ�bƒœ"× ‚ €ÜÎ5 Ä„`Î5Äe“ × D`À ä‹À ûæ&f+× f€œ&÷   –%)× f€œ&�&€œ&÷ ˆ Æe× vvæææŽa÷ Æeæ¼÷ æùÆe‡wHö¦ ÷ ˆÀtðµæ4÷ ÀùÖ À^¬ƒ¬æ<÷ ¢ùÀBœf& œæ.÷ À(ðµ Â`ðµÂe ÜC ƒ ÜJ�ðÕÆe‡w¨õ�ÁmÒBæD÷ 2ù @ÒÀ ¦à÷ N·Â÷mļ÷ ¼æL÷ ùÖ ÷¨¢÷m¦œÀ¢ðµ ,ÿÿæT÷ àøÀ†7lv‡w0õ�ÁmZBæ\÷ ºø@7Z·`VÀR ÜÁ57>7`:Á57.Á5&÷ æä÷ løÖ w÷e ‡À(7 "†6,b÷ ‡wÊôæ æ÷ Zv@`à‹þ€í… @ ƒÀæd÷ øÖ À� 7 Œ†œE ‚ÁeD‘¤ Ä úà ÀeçÀÖ ‡w@ôÆåæ÷ Þ6v ƒÀ6æt÷ š÷Ö À&l‚b¶¶`Âe ¶ †€’6 ƒÁ�`„€Ѥ À úÄ Âe‚b00þ ‡¦Â¦�€œ@    W  W W æ|÷ ¤ö÷en— ð‡· h†·b €ÒÁ�`‚‡wóæ …f÷ ”ÿv� C W!W! ‚mD„m„ ƒâ‹üæ„÷ 6öÖ €D!ÄÄ ’ŸŽ Ä ûƒ-„m„ †ŠüW!pÀÖ ‡ææ÷ ,ˆ�–%‡w6ò¦ ¦ ÷ ‚ ��”Á ý–%‡wòƒ ÀÀeÂE€Àmp7 ô‡÷ b× ÿƒæ„€ÀmT7 þó‡æŒ×-@΂æ”÷ dõ÷å.Á*À* w "†wÐ��� ·`÷-ƒ÷‡w˜ñ· ÁðÃ&ô÷ ìƒÂ— ðù‡· âö† €ÒÀeÀEB †K€ ë‘À ýç`åwºw ºƒw´‡À¦œ‡æ æææŽa÷ <þÆe€‡æ æææŽa÷ þ €ÝÆe‡æ æææŽa÷ þ €ÝÆe‡ V ~~~!,8šþ> úÿÿ$0<ÿÿPPðððœ'ÿ¼¦ RPT>ÑÌ„,8„¦,8,8öìL&¬ ERLRPT˜˜˜˜˜˜˜˜Î¾nÆæf6îv~Þ@^×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ ®ìÞ ÿ ¦ì€'ÿ žì)ÿ –ìD)ÿ Žìx-ÿ †ìÆ.ÿ ~ìœ/ÿ vøà1ÿ nøŠ2ÿ fø3ÿ ^ø€5ÿ Vî<ÿ Nš8ÿ FÊ8ÿ >Ü8ÿ 6:ÿ .H:ÿ &T:ÿ ä1ÿ (¨8ÿ (¦9ÿ 4T:ÿ þ4ø>ÿ ö4?ÿ î4æ@ÿ æ@´5ÿ ÞL¦2ÿ ÖLJ8ÿ ÎLÞ>ÿ ÆdÈ!ÿ ¾ˆÈ!¦Þ5Îe‡w Á,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡wnù èìûÿÿÿÿüÊ5¦ „Ê €‚Ê5ùà ÷ƒõ…2Å Å ÍUEÍ ø�‚‡ à~ Vü–Þ‡ÊEò ÊU ‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡&æ¦ff… Þ �‚ƒ„…‡‡ Äì”�ÄøàX�à1Œì�l7Dø!�l7 ø#�à1È(ì@'�¨8ð4*�¨8t (0�à1`ìL8�à1$ìø@�ÄdàìB�È!�pXˆC�X" d|O�X"àdpS�È!¸ XdZC àZ�CT”¬\�C” æ¼ÀœÀ00DOOl1DATADATADATADATADATADATADATAw äÀýÿ€í‚ €À À Á�a@`Å儃€ABÄ €À‡S” ùÅåÀ ñ¦&æ÷ NãÆe‡wŽãƒ ‚ �Á5A’ÁEÿAö5 ÃeƒàÂåfæ÷ æâ¦÷ Þâ æÿÿ¦÷ ÒâNæ÷ Èâ€@Æe‡w,ãƒÃ5Â’Âæÿÿ¦÷  â@ ¦÷ ”âB@A ަ÷ ‚â@@PÃ5‹�‹Æe€ ‡÷5òc÷ Äׯ(ö A÷ xèE÷ÀŸöÀ  ‚À lX0æ÷ 4æã7 ÈñA÷ ^é÷ Jè÷ lñ †æ÷ ðç,÷ Dé÷ 0è÷ Rñ †EcEcÈæï÷ èæ÷ Æç÷ é÷ .ñ †÷ þçæ÷ ¬ç÷ é÷ ñ †÷ æçEcEcwLñwaHñÅeÖ Ÿ÷ Ìçœ÷ &™‡w!.ñ‡‡w(ñA�@“À  !‚À ln0æNBÅe÷  è¦÷ „ëeÅeW ÁW ÷ ~è÷ tðf÷ †qÅeW ÁW ÷ Vè÷ Lð ê÷ h÷ j÷ ÂÅe÷ >}÷ ç   õ ~æ$H÷ r{÷ ¤}÷ "}Åeæ÷ –æ÷ ìç÷ þïwDðwa@ðÅe _‡Á4ð÷ ÀæEYÅeæ÷ fæ÷ ¼ç÷ ÎïwðwaðÅe G†çÅeæ÷ @æwöïwaòïÅe9Åeæòæ8÷ ö:÷ B7÷ "4÷ v1@Àm¸ïAÁí²ïpð¬ïEm"÷ J÷ ÷ n÷ pæ ÷ f÷ jæ ÷ rÖ ÷ Ræ ÷ Òã÷ â ÷-˜óÌâæä÷ ¼ãwþ‡ÀJï&÷ ^êÀJï¬æ,÷ –ãÖ À4ïÁÌæ4÷ ~ãÀïœÀEÿ  Àßï€m?�þî‡ ¿mðî‡æ<÷ Fã‡A�ÅeW W  ÷ bæ÷ äêæl÷ ã· ¬î ÷ FæW W ÷ 6ææ÷ Ôä÷ *ëÎ÷ Èä Ž÷  ÷ ë÷  æ÷ ¬ä Ž÷ ü ÷ øêÖ ‡×¯†òæL÷ ®âÀvòð6îw0îÁ*îÁí"îpCÃíîðÀî7î·î÷mþíîEÅmöí‡Åe÷ �å÷ ¢íAAcBEEbæ÷ äE †…wÌíwaÈíÅeÖ ‡Åe÷ XåÀ¶íBlA……bæ÷ æãE B!†Ã5AAeA! †Ã5 ÷ åÀ¶ñ÷ ãñEÃ5æEbäB!‡W#‚æT÷ ¼áÖ wLíwaHíÅe÷exñ‡Åe÷ Ôä÷ ÊìÀ,íAlBEEbæ÷ \ã…A!†× ƒEcà øA!‡W"æ\÷ \áÖ wììwaèìÅe‡÷ nã û ø ‡ ƒ ‡ ‚EcEc‡æd÷ á‡Æåf÷ 4èÀ®ìðµæ”÷ ôàÖ À˜ì,ÿÿ0 vÅe�Åe÷ äÁ úÂlì„Äe2# Y†öÅDìÅeΪß1@Àm.ìÁBìlCÃm6ìÀ4ìlöCœ× ƒæœ÷ nদæ& Nœ÷ ¶á6 À5Æe ÅeEcÆeÎå·#ðʆö5 W#ƒ÷ Zã÷ lë6ö5ºë„ÄeŒl ¤÷ßÎïÀ¤ë1, ‡ðÿÿÅ~ëÅe�ÅeEcÁ ûEcÆe‡f�@Àå À l²0÷ ²1÷ Þê&÷ \*æú÷ Âê W  f÷ >æ ÷ xßf÷ Ðf÷ z ÷ � f÷ x f÷ x Ö �‡wÂÛ÷ têà ÷ bê— Â¦÷ NèÀ€m ƒæ÷ ßÁ`ަf÷ .éÆe‡wˆÛÆå÷ ê— ÂÄ„a¦æÿ&÷ XèŽ÷ ôçvAÁ`Žf÷ éΦf&& f&æùÿ÷ ÷Æe‡w&ÛÂ& —-Ž`÷ ¸é÷ ²éæ÷ œç€À`Å À À À @!ƒæL÷ ZÞÖ Î5f¦¦æ÷ @–%fæ÷ Æe‡€€ € € €m&¦ÎEøÿæ& ÷ ìö÷ èÆe‡w|ÚÆåææà0& ææ Žaæûÿ÷ \öÄ€$  Ä  Ä  Ä ƒ  € À€m"'€€ € € Á �a@`¦ÎEøÿæ��m$@€ € € €m*&fÎEøÿæ& ÷ HöÆe÷  öÆe ƒ ÖÎ&æŽa÷ pçÆe‡w¬Ù—- ÷ €è÷ zè ƒ Ãåà Çlâ0À5Â5  À5ø€` † ‡Áf÷ çÖ ‡wtÙÆå÷ è× × &‚Á�aææf÷ @æÎæ¦÷ 4æ ±, ±,±,‰"†Ã ƒ Æe !æ÷ ¦åB…`Î÷ šåD` D … †Ò‹ü … D †Ñ‹üR¤ð†Ã ƒ Ö  €Àå ‚À lê0æD÷ (Üà à  à à à à Áf÷ æÆe‡wjØ@A %  †`M M`å @ A Ä ö‡wHØ÷ w@ABC% % % % ‡ †`M u u U`M u •`M Í`Åå@ A B C Ä é‡wà×   ¯M u @ A  ‡á� �  ò‡w¶×  Â@¯M u u u @ A  ‡á� �  î‡wž×f   ¯@ A D E !‡Äà… Â ô… ‡wT×Äe&&&&  Â@¯N v v v @ A  ‡Àà�  ïÆe ‡@aP P P ‡w ׯåƒÁ × Á × Á‚ææ¦÷ ðãÎf÷ °ä× €œ÷ `Ñ•-€œÀ „œaÀeó0”””Ñ•-Ñ•1Ñ•9€’÷ 4à Ñ• × €œ÷ Ñ•:€œ÷ Ñ•:€œ÷ Æe‡¦æ ‚ Àå ü€ƒÃe/Ñ�Âe:‘�ƒ‚‡w:ÖÆå€ Àå  ‚À l1æÔ÷ ®Ù1ÁÁ Á ÁÂÁÁ ƒ ÷ 8�ææÿf÷ êâN&÷ `Æe Á ,Á°1‚ ÷ ¢Æe‡&× ‚à æœ÷ 0Ù × ÷ �ä × ƒ÷ Fäf&&¦÷ XÆe„‡wjÕæ¦ Î ÷ :ゃ€’ÀEðÿÀe0 9ƒÀe� €Ò€ € € € Àe0 9ƒÀe�‚ à ä–%‡ —  ÷ Ìã× ƒæ¤÷ ŒØæÉ Ö ‡w Õ¦)�€Àå@ ‚À lB1æÔ÷ `ØV÷ Šã÷ „ã ƒC É@6÷ vã œ011Šææ/ö5æœ÷ $Ø1  ‚‚ ÷ Bã÷ <ã @¡D C À ü QñP íææ÷ ã ææf÷ öáÆe ÷ ìâ&÷ äà À Ž ÷ ÆáÖ –%‡w$ÔÆåÁrç€Àå ‚À lL1æÔ÷ †×00LO2O§3eaek›’<BCwLç÷ Äâ 4†Â2—-†æœ÷ `ׄÄåÀ @`ÁÁeBwçæææŽa÷ ²àö ö ö € ‚À ÁàBÆe€œ&& Ž’æŽ`÷ áÆe‡ ’’’*F`’˜Bfl°rx‚¤ª°¶æ &06<BHNlrrrrrx~ˆœ¢¬BJJJJJJRBXXXXXX` "(JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC  &&,Z<`ABCDEFHJKLMNPRSTUV 4‚ž ÿ üìx2ÿ ôì¬4ÿ ììú6ÿ äì(¸;ÿ Üì(¤=ÿ Ôì(ì=ÿ Ìì4Î:ÿ Äì4:Aÿ ¼ì4NBÿ ´ì@(2ÿ ¬ì@È;ÿ ¤ì@<ÿ œìLd7ÿ ”ì¬Cÿ Œì¬@Cÿ „ì¬$Dÿ |ì¬Ýyæææú(æææø!æææü÷ �Ü7Ý÷ ˆÜæææþ÷ lÛwöÜwôÜPæææ÷ RÛGææ 7÷ ×-úÝÿÿ7 òÝÎæêÝ÷ PÛÎâÝæ¦&÷ 4ÍÆe -ææ÷ 0ÛÎæ$7&÷ ÍÆe÷ þÛææææ÷ âÚÀTÜÁ5À5À5@ ƒw8ÜÆe�‡CTL>SY:ERRLOG.ULBLB:[1,6]LX:[1,6]  Œz¼ nCOMMANDINPUTOUTPUTUSERREPORTæ6î6ô6ü67RPT>V2.00ŠÂxP4&B âÿ çØ;ÿ çî<ÿ ç´7ÿ øæº7ÿ ðæ:ÿ èæz:w Rç5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ žœ*AdBbAÁepÂ& ¦fƒÂÁ ÷ r– –‡ÁPõµ aA”Aíf@pnp÷ 0C*8Ö‹Á ÷ 288ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ võÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw våõ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ 5fµ fˇðµ ÇÈ•÷ ì‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ 8DlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ :½•8 †õ¥öÿ*Î29Î9‡w 8äõ 8µŠjDl@÷ îT”ÔÀeBTŸ8œ5l@÷  ‡@Á(ñ D÷ ®ÁeB&÷ ˆ‡÷ ‡& ææ©ÿˆ@ð•#÷ x& æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡wèÇ€À  „Ü Ä5æÜ÷ PËà ƒ`˵÷ÿÿØcÄ5˵æÜ÷ (Ë�@÷ 4@œ*  öÿæÌ÷ Ë÷ÿÿæ×wÞ×€¦¦È –%Ä58Áò×À @`„œ1ñ‚ñ È¦ð„° °ð$ æZÿˆ÷¬×|×÷ tÃæÌ÷ ŽÊÀ�–×  öÿæÌ÷ zÊËÕþ¦þL××-F×ÿÿËÕ‡f�À Е Е f¦&÷ xÆÁeÆe÷ nÚwhÚÀ&÷ DúÁÚÙ÷‹VÚ÷VÚòÖæîÖæNÚæ¦÷ >ÆÆe÷ÿÿÖÖñÕ �‡æ¼À$Àæ¼À00TOOl1DATADATADATADATADATADATADATA àæ¼À,àæ¼ÀXÀæ¼À àæ¼Ààæ¼ÀLÀæ¼À8Àæ¼À<Àæ¼ÀHÀ÷ &÷ &÷ �’•’•€‡@Á(÷ f€  Àe ÀeÉÿÀe Àe ‡÷ ‡wÌ€À õµ æä÷ rÏõµ 7 FÜDM¦¦÷ Á8Â, ÷ Ø ‡Á8Â, ÷ Ά7*ÊÚ–%:Á ÜÂÜŽ¦÷ È÷ öÛwðÛ·îÛÁeB$&÷ ”ÆeÁ*aÉ‹w~Ú÷ ‚wrÚÉ‹&÷ ÚÖ @È õ• À‡ ‡fÀjÞðÅ ñÕ1 4@È5æô÷ ˆÎ7 HÚ�‡ÀBÞðÕ ðÅ ‡÷<Ú÷<Ú7 Ú7 Ú7 Ú7 Ú7 úÙ‡w´Ê‚ ƒƒm 7 Û€À ¤:û�àwÛ÷ Û·Û7 þÚ€À ¤]û7îÚ·àêÚ·èÚ÷äÚ·ààÚ·ÞÚ‡wfÊÄ ƒ Ôœ\Ôœ]Á^ ÷ JÔ•:óµ;À¤Ú&æžÚ÷ b@�&f&÷ ÞÉÁH÷ ºýÁJ÷ °ýÁL÷ ¦ý© ý„ Ô•.ÁN÷ Žý© ý„ Ô•;ÁP ÷ ÔÆe7¢Ù‡w¢É€À @ñµ È ñµ B €÷ Ðò‹*æì÷ Í1Š ‡÷ŠØÊØ7 „؇fÀ¶ÜðÅ ðÕ Á `p� ðÅ �‡þ þ Ùþå ‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡æ¼À Àæ¼À¨Àæ¼Ààæ¼À4àæ¼À8àæ¼À,àæ¼À àæ¼À\Àæ¼À àžpEÆå ÷öÿ&áæŽaæ?ÿˆ÷ (Îæü÷ BÕ€ ·üà÷ øà·ðà÷ìàìàÆe ‡f€Àe?ÁE?@ÀmÎà ‡& fæúÿ÷ îÐ6ÎYÿˆ÷ ÀÍw`ªàÀ �‡¦)7 pà@ À ‚ &÷ nÛÖ f÷ ÜÛÁVà CÜÃ5æl÷ ˜ÔÖ  1†÷ 2àæt÷ „ÔÀ$à¬æ|÷ pÔBÂmúßò/àæÄ÷ XÔÀôß2,æÌ÷ DÔÀàß1, ‡æÔ÷ 0Ô@�ÀåÀ lN81 ñ v#À@`"ÿÿoBl ± †Hl fÀ@`"ÿÿ`È Èÿÿ[Hì XÀxß1RñÿÿNÃ5æÜ÷ ºÓf÷ TÛæä÷ ¦Ó2 Ê ŽŽ`f ÷ Æ1 /Ã5æÜ÷ ~Óf÷ Ûæä÷ jÓÖ ÄD`#ÿÿæì÷ TÓC Êàòàc¦Îe æ÷ pñà 1# ‡Ìÿÿ–%BÃ5æÜ÷ Óf÷ ¶Úæä÷ ÓÖ C× ÿÿæì÷ ôÒÄ�Þô "N €mÀe Â`Âe ƒà€ D 6’6Š �cH’@ù��Àà‚ Ä ïÅe–%‡¦)w@Þ÷m$Þ:ÞÀ6Þð æô÷ ~ÒÀ$Þð ÞÁÞBÂíüݰdÀe ÒÂeÂE`€ †0 ÀeùÅeñÿÿÎ@’ÀåÀ l^8Ä#Ä Ä& æ N`æN` ÷ 6Õ÷ ,Ý&æŽÝÎe æ†ÝÎe÷ ÂÚÄ6 Æe ÷ ÁtÝ@ÂB` €ÒÀE ‘ Ð@œ ƒ Î5W¬ ‡  À€ ÃEö @Ü`ÀÀ‰ʵ B`€ÀmðÜBÂíðܰ÷ œ½ÀâÜðµÁ� CÃEð ðµ, †æÜ÷ ÑEcÀ°Üðµl ¢÷ –%‡ÆåæÄÜæ ÷ *À¸ÜÈ 0 ö6`þ¨Ü· ¢Üð^ÜÂ\ܰ€ÀmHÜ6öe€6œÿÿ6ŠÃt8Ë À Ôv �þ„P¤> Ä ùþ Ãeã²2 Æe ‡f÷ t×ÄìÛÀêÛðµ ,ÿÿæ÷ (ÐÖ ÄmÊÛÖ CCmÅeC!x†@ÀmœÛÁm¬ÛBbæ@�&÷ ìËõµ€2€2–%Åe–%ßC!W†BÂe ñµ €ÒÀeÀE€`ñµ‚b�ÂeñµÂe@œ q­  æ÷ rÏñµááñµæ$÷ XÏ€€dõµ……Ec@!‡æ$÷ 8Ï÷ jÒæ÷ PØÀ À � Ö  æ&f÷ 8ÙŦÚN÷ &ÕEmÆe‡Z–Fø *R" TITLEERRORh8n8ÿ Îå4T:ÿ Æå4š<ÿ ¾å 2Cÿ ¶å PCÿ ®å 4EwþÊ€ Àåp ‚À l6>æÔ÷ ‚·÷ Ø×-¨Ûÿÿæ& ÷ ´Ø-ææ÷ ¦Ø�ÁeŽfæÚ÷ V€à ‚æ¤÷ 6ÎÆeá•.ŽfæêÙ÷ 0Î fŽà¦÷ 4ÊÆe–%‡ ÷ ÀÕÀ Áf÷ ØÖ ‡wZÊ‚ � €@à Á ¦æ ÷ ÀÉÃe0É�Žæ ÷ ¤ÉÆeç æ¤÷ ¨Í@‡wÊ÷µUÝWÀXÙ÷5PÙÀ ÷>ÙFÙ*÷>Ù&· :Ù÷-6Ù6Ù5ƒ· ,ÙÀ"Ù.À-"Ù+ƒ'À ÷ ÙÙÁúÜñ æ´÷ <Íw úØñ ÷ ðØ7 ðØ÷ èØ÷ àØÁÜØÀÐØ@ †÷ÕÁÜ7 ÈØ÷µ·ÜR÷ ¼Ø2÷ ö÷µ¥ÜI7 ¬ØÁÚw Ú †É @@bÀeÁE· ŒØñ÷-‚ØvØ ÀrØ7 z؃ÀtØ7nØ ÷500\O2O§3eaek›’bØ÷^Ø÷ZØVØ÷µEÜÀBØ7 BØ÷58Ø÷-6Ø.؃÷-,Ø$؆÷ÕÜ÷µÜ%ÁxÙÂØÂ @@bÀeÁE ÷wbÙÀ@`7VÙwVÙ7`RÙÉ ÷-JÙBÙ ƒæ¬÷ ̇÷ÿÿ4Ù7 .Ù7 .Ù‡Àº×7>Û7 HÛ‚÷ BÛ÷Õ™Û‡æ‚ÿˆ÷ ®ÄæÌ÷ ÈË÷‹øÚæÌ÷ ºË÷~ÜØ÷æÚØØ÷-n×Û÷þÚÊØ÷ÄØÆØ÷mÀØÀ؇wȦ)�W W ‡W ‚ÃÃÅ&>Â.>ææ¦÷ ØÔÎæf÷ ÈÔ6 ÁåÁ Gl:>@�A P@�A P@�A P@�A H@€  †À@�T�T�TˆRô@„BˆDQ„BˆDQ„BˆDQ„BˆBQ€  ã‡6 v�âµ µ µ µìµ µ µìµ µìö õ Zõ W¶ õ R¶ O�bu u u µlu u µlu µlØ×  ƒ—- ƒæ<L…Â&>„÷ jîÇ�æ,@—- ‚@÷ P ¹D÷ ¾îµ�æ4.—- ‚@÷ ,MDC÷ úîö Φ f÷ Ô–%€ À À À � N&&Nঠ÷ ´ëÆeæ$÷ ¬ÉÆe‡w,ÆÅ&>ææf÷ ÓM u u u —-#Ä÷ ºîÎff÷ ŠÓÆe ‡wÆÅæ÷ vÒCÎ÷ jÒ€ † S¤  úÎ÷ :ÓÖ ‡ €&2††††††††††`Þ$°b&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡÷ &÷ &÷ �’•’•€‡@Á(÷ . f€  Àe ÀeÉÿÀe Àe ‡7 (Ú÷Ú ÚÀÚ ðÚ0à÷ÚÚ÷Ú‡w¨Ê ÁøÙƒ Á C,†DAùÁ "BÂà@— ƒÀ@`°HÄ 7ÀÙ ñ¶Ùw°ÙÊ �"‚‚ú‰J@‡wNÊ�EÂB`& Å Ž ÊzÙJJàÀtÙ wlÙ"üHlÄÄeD †D„bÁ1qàÀ<Ù ƒÉ2Ùw.ÙÈ "†ú Hl!plHB… ‡Î5‰Ö ‡fÁêØ¦÷ þ÷Ö †fæÖØNà÷ –%À �‡wRÉæ � B‚m @Àí®Ø€ bÀ ý·m žØÁžØ÷ äÁ’Ø÷ Ú ƒð„Ø0à ��lÁhØÎhØNà—# ‡ ±À HwPØÖ ‡wòȃ ÷ Ø#ÄÄ`Ì æ÷ ˆÖ Ë‹lÁ�`€€b@ †f÷ AbÖ ö÷Æ×À’€ �7º×‡w¬È¦)À€m6 €0 ÃØ×4À&È‹+ÅÅlÄDaEcÀ€m!†Âa €Ô�f”6Š À R¤À üb¨¦&÷ (–%‡cáþ  ÃËþ ¦÷ ¨Ö –%‡wþÇ€ IæÄ÷ lË@�l@l„44Â` �ÒÁeÁE�`BÁa CÒÃeÃEC`Ábcƒ †@ †±¬±ÁeÂeðc@ †æÌ÷ èʇwBÇ�1 ÂB` €ÒÀeÀE€`@@b€ †2 Âe÷‡wǃ ÃírÖ‚ ¦÷ výÖ ‡¦÷ JÖ ÀXÖ È û°à,†Á  7 4ÖÁ.Ö·à*ÖÂ&ÖÀ€ RÀ ýÀÀmÖ‡w ÆÁ Ö÷ TÀ 6,‡lw ðÕÁîÕ÷ 4�&É‹÷ p †÷ ¶ß1 ¦÷ ,üÖ Øæ÷ èÉÓ‡@È ü‡wLÆ� Cæ÷ ’û Î÷ ”ü †Îô ÷  †Î÷ lûö ÷ HÎ÷ ZûæÌ÷ €É±„ƒÎf ¦f÷ Šò r&ñæÔ · àÔÆe‡f÷ ÕÁÕw Õ‚Aúw þÔ‡f÷ Ö ð�‡w”ÅÀæÔƒ Á&1Ã-ÖÔ7ÐÔÁÊÔC"Aü ÄÁ� Á ýàpˆ!ˆ°l7”ÔÃ-RÔwàLÔwàLÔwàJÔEà²Ƿ x؃ƒ(û‡„"ù†Jà÷‡wÅÁbÔ  Á @&ȋà Ôì Ä ƒAò ¦÷ šú2 Ö À‡ ‡f�@ðµ$&÷ rú1 Ö �‡w¶Ä¦)ÁðÓ@Àe7 èÓ ƒ&ÎíàÓ÷ øòÖ ‡æ¼÷ Èææfæ÷ W¬æÄ÷ àÇÆe@@ì À À À À vwNÓ7LÓw`HÓÀDÓÀe7 zÓ ƒ&ÎírÓ÷ ŠòÖ ‡æ¼÷ ”ÇÃÓÄÓÄe÷ ÓO†À ÓÀ :†Áe!5†Å`ÎÎ`€÷ ºø÷ ²øÁÁ`‚ã‰�¨ ‚� ø€ 3 æ&fæD÷ Fs3 ŠÃeÄeÆeÂæ¦æˆÒæ÷ ¶ ÄxÒÆe®÷nÒ¨Ò–%‡f€ À ñµ ñµ æÜ÷ ¶Æ@7œ"ÂÓ7Š¿Ó÷¶Ó·ºÓ·¶Ó7 ´Ó7 ²Ó·®ÓæZÿˆ÷ \¿æÌ÷ vÆ÷‹~ÓæÌ÷ hÆ�‡÷ øæææØB÷ vÐ÷ Îæ ÷ @Æ–%N÷ ¼ùÎææÞB÷ NÐ÷ ZÎ÷¸ÑÎ÷ òÇÆe‡ÆåAÁm–ÑBæ¤÷ öÅ‚Bl—¢æ¬÷ àŶ¶`ÂeÅeDDeD!†÷ øÈû¶ I†¶¶`Âe…ÎÃtÕÁ¦Äv!‡æ´÷ �Å÷ ÂÈf÷ ¶Æ6À5Ö Ö ÁåC è†Î5ÀüÐÀ aÃåv!‡æ¼÷ DÅ÷ vÈf÷ ZËÖ ÁeC ´÷*ÄòÔ¦÷ .ÏÀ°Ð÷ 0ËÀ¤ÐÀ aÆe‡f÷ ÌÀšÐð³æÜ÷ âÄÀˆÐ÷ xÌæä÷ ÊÄÀpÐp0l BŽN`& ÷ üù€àN÷ ÌËÀFÐ l 1l AÅeÁ B÷ ¶ÇŽ÷ šÊÁ ø–%‡DISPATENTRY&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡00dOOl1DATADATADATADATADATADATADATA÷ &÷ &÷ �’•’•€‡@Á(÷ f€  Àe ÀeÉÿÀe Àe ‡w˜ÑÆå@·Š æææ¶?÷ †Þ7l €XÀ  ‚À lÎ?æt÷ èÔÎÎÎÎ ÷ „÷ Æe‚N�PÁ* Á-$ ƒ7  Â*CÃí ö5L� Ä æf÷ ÌÞ Â ÁàŽæ&÷ ŽÐ–%ÎÜ æÖ &æÌ?¦f&æùÿ÷ ÈìÆeR‡wÎÐæ ƒ×-¤ ‚ÂÂå€À  Á” ÷ ”ì7– ÷í� � ,Áˆ Áe@…Ķ?÷ ùŶ?Ä÷ ¢øÎe0—#9ƒÎe¡“÷ T ë÷ P è÷ L å÷ H âÀD @à7@ ÷e@: w4 Ö ‡w2Ðö?À$ ÄÄm Ä †Á÷ 6þÃeø7 ÷í  ‡wêÏ€À  BÜ Â5æÜ÷ lÓ—-÷ „Â5(@œ7fà÷^à÷¦bà÷"à^à÷Ú?Tà÷Pà÷ LàæZÿˆ÷ þËæÔ÷ Ó÷‹ àæÔ÷ ÓÂ5AñÞßñ¦@÷ Þ ñ‹*æÔ÷ âÒ7 ¾ß‡w8Ï÷ †Þ÷ N· €ÞÁzÞ÷ vÞ@ÀmpÞ7 fÞƒ÷ .ˆß7 „ßÁXÞæ÷ ÿÖ Á ù·lß÷<Þ<Þ÷ 4Þ‡fÁZßfæ¦æ ÷ ¨Î÷ÞÞ7 Þ· Þ÷• ´Þ÷2ßÎ÷ ¼þ· òÝ7 "ßÎêÝ÷ ,7 ßÎ÷  þNæ æ¦÷ \ÎwüÞ÷ÌÝÌÝÆe �‡w”Îæ÷ ¤ÙÀ 2ð /BlA�lD b `Ã… †�`á‹À ü¦÷ &ÒÃ5Ž÷ ‚Ò Î÷ þaÖ äÖ ‡¦)€Àå` ‚À lÜ?æÔ÷ xÑ"æææ÷ 4Ö ÷ ŠÜ&æŽaæŽa÷ $ÚÎææ Ža÷ \ÛÆe –%‡f¦)÷ VÜ÷ PÜ&æŽaæŽa÷ êÙÁ @€m6 æ”÷ öЖ%Φ fŽm÷ ÛÆe �‡÷ .ÝÀ à&÷ ·B 7 @ 7 œÝÖ ‡f�W¬æ,É‹æ4÷ ˜Ð÷ w` ÷  w’ 7Šý÷môö�‡wü̦)…W! æ÷ ‚Ù6vÖ ÷-ÊÊr†÷ ¨÷-¾¾lÄ¶Ä  Ã0Áª¦æ ÷ zËÀ`Âå0w –‡æ<÷ Ж%· „Á€ CÜÿÿ× 9‚× 0â†w lw>· `À\ Üÿÿ× C W FÅ ¼W Eë÷88´× D(@À lä?7$ W FæDzW Pu¦¦¦÷ ‚ÆepW F¦÷ L�W Pb¦÷ �Ö a× FZW C — „%†Â · ʆ÷ –· ÀGƒæ ¦Îí´æŠÛ÷ NË7‚Û·¤W S æL5·`Ž×-Š„‡æT,æ ¦æPÛ÷ Ë7HÛÆe•W L €ÀŒ÷ $Á ü‡W P ÷ B÷ ×-67 bÚwXþæ<÷ ¤Î–%‡wüÊÁw 0† BÔ— ! w ‡æ<#W¢!"· ò— ‡— ~÷ƒ— ÷eØ÷EÒ×-΄ƒæT¿�šÚ· –ÚÑæ\÷ 2Îw¨‡w”ÊÃÆÙ ÂÔ� �w`”×-�„‡æT� ƒæd÷ úͦææ fæFÚæûÿ÷ ^æ7:ÚÆe ‡wBʦ)ÀtÙðµæt÷ ÀÍÀ`Ù Üðµ  `ðµ �ÒÁeÁE�`Bƒ’œ  æ Ùæ¦÷ nÆe2 æÙæ÷ ^ôÎ÷ |ÖNæ¦÷ BÆe æÚØ  ÀÎØ6æŽa¦÷ ¬–%æ„÷ Í–%‡w~É‚Ã|ƒm „) �ÔW ‡W ~‚· ^ W ÷eP÷EJ×-F„ƒæT �Ù· ÙÁ æŒ÷ ¦ÌÄ ×ö ÀÀí�æ &æâØ÷ ¦È7ÚØ÷üÆe‡æT÷ ṅwÈÈÀØœ�B †æ|÷ NÌBæÀè×& œ¦÷ \ÖÀÖלN¦& œ& ÷ üöÎ÷ :Õ·`�×-Œ„‡æT÷ ÌÆe ŽfæNØ÷ ,È7FØÆe‡f& ÷ hûÎ÷ úÔ×-,Ø  Î$ØÎå æ ÷ ,ÌÎ8÷ (øÖ Ö �‡ÀØÀå &æ ÷ Ì–%æ÷ ø÷ ä×7 Ö ‡CÅeAEcB÷ ¦Î÷ <Öæ÷ ŒúEÅeB!†÷ ŽÎÎ÷ Úú÷÷ dÿEcÖ ‡æ f÷ fÒBEmÅeAAe÷ \ÎA!‡æì÷ ËÖ ÷ JÎ÷ àÕÎÜÚÀØÚ¦÷ $ú÷ @úÀŒÖð VÀ”ÖÅ`¢Ec÷ x÷ xÖx÷ ~ÁnÖ@œ& #‚ÂB`÷ úùʵ ʵ ÷ Þ÷ FŽ÷ ÞùÞ÷ 8À0ÖTœ Ôƒ Ñò ñµ ÷   ñµ÷ N÷ öºæD÷ DʵÂÖÕƒÂeƒ`ƒ '†Ž÷ ÞÐÂeÀÆÕðµóœ W  ‚÷ Pù÷ @Ž÷ DùãW ÷ �ÝW Ú÷ à×÷ øýÎ÷ úÒÅjÕEmÅeEc–%‡fÅbÕÅeÀZÕðµ7 LÕ ÅewBÕ @ÓÀeÀE@aæ÷ ùÀ(Õðµ AAeA!†÷ ¦ÌÎ÷ òø÷Ö �‡w¼ÅÀüÔÅeðµÅeAAeæÞÔœ¦÷ ë÷ |Ô †W#EcA! †÷ PÌÀºÔœN& ÷ ®Ö –%‡wlÅÆåÀœÔÅeðµÅeAAeBEcæzÔœæÃ�æœæ÷ ÀêÎææ Ža÷ 4Ò  ƒö ö ö EA! †ö Ecö ÷A!‡…W# ÷ ®ËÀÔœNœf÷ Ö Æe‡wÒÄÆå‚aææÿ¦÷ ÀÑ6OÎ&Îe÷ vÒ�”Е[„�mÁ Ã/ƒ Áå ü€Ð�× 0ð• ÿÿCÃe:Ð�Е:ƒÁ/� Ãå ü€P�W 0ð• ÿÿÁÁe:P�Ä Е Е Е Е]Е �Á �”Á ýÎ÷ (÷Ö Æe‡. & "*ÿ bÞ 2Cÿ ZÞ PCÿ RÞ 4E&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡æ¼À0À00lO2O§3eaek›’wðÑæ …8€5Žm&¦& ŽŸ÷ X6Æe"¶¶à…-õ�� €€ Cà P¤à üÆe€ ¶ ö „ÞÆeÏ Ö ‡f€�6¤Á ûÀ  �‡f€�6¤Á ûÀ  �‡€Àå0 ‚À l^@æÔ÷ ˆÔ‡ææææ÷ Ö ‡÷ ‡÷ ˆ‡fæ÷ vÝŽæf&÷ ´Æe�‡wÀÐÆå�ææf÷ ¢ÝÎæ÷ `ÞB’ Žæm÷ ZÏ‚ ‚ €`Bœ „lt@Bœ„`À ɵW¬ƒÀ Àe<Í€QÂBaÊÃCa 5 ÷ ä÷@œæ<÷ üÎDœaæ÷ ìÎÄ@ D @ D ÀE& Nœ€ÎUÿ¦€e& Nœ€ÎUÿ¦ D a„"K `@#†Š ‹ Är@÷ h Æe‡wÌÏÆå…æ÷ XÜCÄ` 5 5 ÷ (Á5 5 5 Îæf÷ &Ý@Æe ‡æ„# †—¯- ÷ @ †÷ 0Àà÷ ÒŽ €¬ÿÿ:è÷ À †÷ ÷  †À Ö ‡÷ 5�!Jפ-GÀÀ`!BÀš@ÂBa Š�’� J�È¢ð¬ð¬ÀeÁ¾@àí ¾@&A�#€’œ�@B ‚Ãeפ-÷ š lƒÀål d† �À5W­W­‚À‡ ‡÷ d5� !†!×¢ פ:÷ F5� <†! ×¢ פ: ÷ (5� <†À‡ ‡fÀàפ úà …‡¦f Àà ÁÔÁå0�W à ¦æ ÷ ÄÌ@`–%ꀅ‚‡w¼ÍÆå�fæ=ÿˆææ÷ ŒÛÂP”�  üÆe‡fÆå�ææf÷ šÚ1Š1Š1ŠÎæf÷ &ÛÆe�‡w~ÍÆåÁ�aææf÷ \ÚÎæ÷ ÛEÄr@÷ 2 ñeKÉå€kW"€”‡ñ Å …aDÃn@÷ T EÄn@÷ ÐNæµ÷ tÌÀ À ÃeQÊ�Næµ÷ hÌ m‡Àåm�’� J�Áµõʵ :ƒ€ Á@`Cœ�@ ƒÃ�Àà� ør�2�Å …aÄ„aÃ÷ øôÅ…aÄ÷ Žô²�Ž æ<÷ èË2�Žæ<÷ âË2�Æe‡÷ êþ¦÷ 0õÖ ‡f÷ Šü ‡æ÷ èØÎææ¾@÷ ÚÙÆe÷ pûÀ �‡÷ :þ÷ \û‡÷ ˜þ÷ \þ÷ Nû‡w ÌÆå ÷ ªÚÁ�aææf÷ äØÎæ÷ ¢ÙÍÀÂBaÊi*ÃCaËÉöva> ÷ Zóö5 ~ K J Š ‹ ¾ D÷ øÆe‡w†ËÆå€Àå� ‚À lÆ@æÔ÷ ÜÎx÷ Ú6À5€ÿæÄ÷ ÄÎæææŽawf÷ taæ÷ È×6Îææ íæ÷ ®×CÎ÷ ¢× ƒ€ÂÀ S¤ À úŽ÷ pØ8÷ ˆÙ÷ ‚Ù÷ ¸Ùæ÷ f×vÀ`€`W ÿƒæ¬÷ (ÎÎf÷ hØN¦&fÎàæŽ`æûÿ÷ ~ææ¦÷ ÊÆet¦÷ æÖ n÷ Ù æ÷ üÖ  ƒƒà�`Îæ;æ÷ àÖD÷ 䨠Î÷ ÌÖ €à£ ¦N`f&÷ (øÆeÎæ÷ Ê×È7ÂBàˆˆ 2÷ ÚØ�æ÷ ˆÖB`À ƒ¨À ûÎ&f÷ nׯeæ÷ ^ÖΦ÷ x×€  BÔ— a‡— z‚Âå “�À ó–%Æe‡wŒÉ¦)& & —-æ÷ Öv6v` †æ´÷ ÔÌÖ æ÷ îÕv6v`÷ ê× Î÷ ÒÕE`„D`€ ƒæ¼÷ šÌÖ D!"•€6 � ûÄ €€#ð� À ÃD! •° à øâˆ õƒ ó€ êææ÷ ŽÖHàÆe ‡w¢È÷ b× æ÷ JÕ  @ƒƒC`B`ƒ 6 ÀÔ ù $ö -‡ .ðƒ 0‡ ;êƒ A‡ Zäƒ _á a‡ zÛƒ [ƒ פ]ûÒ "ƒ פ"ûÉà À@àƒ Îæ÷ ÞÕÈ–%‡wÈÆå�‚ƒ€À À lÞ@@€à€æT÷ `Ëæf÷  ÕŽææ f&æûÿ÷ ¼ãÆePææÜ@& ææ Žaæûÿ÷ šãΦ÷ R@À À À !‡æ\÷ ËÆe€ € € ƒÀ`&&ÎEøÿæ¦÷ äÎfæ Ža÷ öÔÆefæ¦÷ *ææ ææfæ¦÷ æÖ Æe‡wÇÆå æŽa—-æd÷ xÊ—-ƒæ„÷ hÊ�‚¶¶mƒ?  ;Å&æ(÷ ’Å / DÔ!0‡!9‚Äå"!A‡!Z‚Äå@!a‡!z‚Äå`!$Ä !.Ä!  a –%Å Çö ¾ƒæ¦ ¦÷ äÓÆe‡w>ÆÆå ææî@& ææ Žaæûÿ÷ âÅ…aƒ$‚&6 à  €Ò -v    +à ‚ êà æl÷ JÉÆe à ( „Ô!0‡!9‚Áå0 !A‡!Z‚Áå7Áv ‡æl÷ É„÷ *íD÷ @îà ×Î5 @P P P H Ä÷ $îæ¦f÷ òÒÆe‡w<Å ‚� æl÷ ®È—¤ Á ö ƒ  �ÔÁå0�W æl÷ „È&æ ÷ ÎÃ@`–%à ꇀÀå  ‚À lð@æÔ÷ Pȇ÷ êö‡÷ ÷‡÷ F÷‡ææ÷ zÒ 0 0 ÷ ‚ø‡÷ †ø‡æ& ÷ †øÖ ‡÷ Ê󇿿÷ @Ò 0 0 0 –%‡wZÄ÷ ì&÷ ì„÷ 섇w"Ä   ¯M u @ A -‡‚#‚ã� í�  í‡wúà   Ã@¯M u u u @ A B -‡ ‚#‚ã� ‚ í� � à å‡wÂÃf   ¯E D @ A s ‚‡ ‡Àâ� Áì ï… u‡&@eH p p eH p eH c„‡ (.€Q€–˜<[y˜¶Õô1OJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC 28Rˆððü r¢¼Â¶°¤2 4:FV@P00tOOl1DATADATADATADATADATADATADATAwâã€À  BÜ Â5æÜ÷ dç—-÷ „Â5(@œ7^ô÷Vô÷¦Zô÷ôVô÷¼!Lô÷Hô÷ DôæZÿˆ÷ ößæÔ÷ ç÷‹ôæÔ÷ çÂ5AñÖóñ¦@÷ \ñ‹*æÔ÷ Úæ7 ¶ó‡w0ã÷ ~ò÷ N· xòÁrò÷ nò@Àmhò7 ^òƒ÷ .€ó7 |óÁPòæ÷ ÿÖ Á ù·dó÷4ò4ò÷ ,ò‡fÁRófæ¦æ ÷  â÷òò7 ò· ò÷• ¬ò÷*óÎ÷ ¼þ· êñ7 óÎâñ÷ ,7 óÎ÷  þNæ æ¦÷ Tâwôò÷ÄñÄñÆe �‡wŒâæ÷ œíÀ 2ð /BlA�lD b `Ã… †�`á‹À ü¦÷ æÃ5Ž÷ zæ Î÷ þaÖ äÖ ‡ æ¼À0Àf€€ € € ÀEàÁ&" ƒ&Îå!÷ V&Î ÷ TÖ 7 (òæH÷ âåÎB"÷ ÚåN÷ ÔåŽ÷ ¤ýÖ �‡Unimplemented error message-F-ÿ üpX"ÿ þû|X"€À ®7‡2MODSTART, Starting module for execution not found.%STANOTIMP, Statement not implemented.3STANOTVAL, Internal error - invalid statement code.LISTNOTLS, Group referenced in SEARCH statement is not a LIST.HLISTNOMAT, Too many expressions in SEARCH statement for referenced LIST.CLISTNOEXP, No expression in LIST for corresponding SEARCH variable.MPOISETMOD, POINTER variable is from wrong module in POINTER ... LOAD or MOVE.RPOISETGRP, POINTER variable is not from correct group in POINTER ... LOAD or MOVE.CPOISETSIZ, GROUP too small for POINTER in POINTER ... LOAD or MOVE.=NOTDYNFIL, Dynamic file operation performed on invalid group.AFILNOTEXI, Internal error - declared dynamic file does not exist.=FILNOTCTX, Operation requires that dynamic file have context.HDECAGAIN, Group in declaration already declared. Redeclaration illegal.JDEFCASELS, No match for control expression in CASE conditional definition.&DEFNOSTAK, Declaration stack overflow.8DEFSTKUND, Internal error - Declaration stack underflow.IDEFNOCONT, Attempt to access data in variable in group with null context.CEXEINVCOD, Internal error - Execution stack entry has invalid code.6MATDIFTYP, Values of differing type cannot be matched.6MATVALSIZ, Values of different size cannot be matched.@WRITEACCV, Attempt to load a value into a non-writable variable.=VARNOTDAT, Attempt to load data into a BIT or FIELD variable.0ACCUDFVAR, Attempt to access un00|O2O§3eaek›’defined variable.INVRADCNV, Internal error - Invalid radix code for conversion.-VALUETYPE, Value in expression is wrong type.,VALUESIZE, Value in expression is too large.3HEAPOVERF, Heap too small to hold value. Overflow. VALSTKOVR, Value stack overflow.:FUNWRONGA, Incorrect number of arguments in function call.HFUNFIELDS, Invalid conversion code argument to time conversion function.8FUNSTRSIZ, Output string from string function too large.DFUNQUOODD, Quote string in STR$QUOTE function must have even length.;FUNINVPOI, Invalid string pointer value in string function.DFUNNOTCHA, Argument to STR$CHAR is not in valid range for character.FILERREAD, File read error.FILERWRIT, File write error.FFILINVCOD, Internal error - invalid file code for specified operation..FILINTOPN, Internal error - file already open.FILERCLOS, File close error.:FILERSPAN, Records in file are not allowed to span blocks.4MEMINIFAI, Memory allocation initialization failure.CMEMALLFAI, Memory allocation failure - insufficient virtual memory.d"¨"Ì"#B#f#Œ#²#Ú#$P$Œ$Æ$ö$6%d%’%Æ%è%$&n&¨&î&*'p'Œ'ª'ò'"(@(|(²(÷5ñ—-÷ 0·š ÷ ~÷ t÷ ´÷-&ñ"ñ†÷ –÷-õPä÷ Â÷ ò‡w¦áæ÷ ÔìÀ ð BlA�lB b€`Áe C †Î ¦f÷ á�`–%õ7 ¢ðÖ ‡wláæ 7 ¼ñæ ÷ Ný÷ ”ð0÷ �ð-Îö÷ :ý΄,÷ ZåÁ”ñÁe¦@Àe÷e„ñN&æbð÷ ^à•.N&æPð÷ NÎ &Nàf÷ œàΨ÷ ìüÆe ÷ ˜ñw&÷ �ñûÎŒ÷ Ðüά,÷ ðäÀ*ñÀe¦ÁrñÂ2÷ ªü÷eñÎÀ,÷ ÎäÎZ÷ žü÷-RñJñ‚ÀHñ€ 6¶ À4ñÀí2ñ€ 6¶ ÎÌ,÷ ”äÎ ÷ düÎ-÷ „äÎ÷ TüÎR-÷ täÎ÷ DüÎø÷ <üÎ æ„æ¦÷ Ôßö  2æ÷ ’ßÖ Å ÀtðÀe¦à ÁÂ2÷ òû÷e \ðÀXðÀe¦à ÃmšðÁÂ2÷ Òû÷e<ðW!6!Î~÷ Âû„ 6!˃–%–%‡w¢ß‚ � €@à Á ¦æ ÷ ßÃe0É�Žæ ÷ ìÞÆeç æ¤÷ ðâ@‡f7 Æïæ÷ XûÎ ÷ PûÎx-÷ pãÎü÷ @ûÎô÷ 8ûÎŽ-÷ XãÎä÷ (ûÎÜ÷ ûÎ6î& æ4îÎí*îæ*îÎí"î÷ 0ÁTòw Tâ†N@’&ff÷ ÁeÆeîÆe�‡wÒÞ�@œ&æN`÷ ²âW¬†Î~+÷ ÖâÎ~+÷ ÎâDÃlÃbÀÀeáÀ@`b‚m ö‡@’æN`÷ dâW¢†Î~+÷ ŠâÎ~+÷ ‚â€À ,÷ tâŽÎà÷  âÎ~+÷ bâŽÎà÷ ŽâÎä÷ (úÆe‡wÞ7 €îæÎ÷ úÎÆ÷ úÎÂ-÷ *âζ÷ úùή÷ òùÎÞ-÷ âΞ÷ âùΖ÷ ÚùÎ.÷ úáÎâìÎíÜì÷ $âÎz÷ ¾ùÂíÁ í Á  Á � †Ž÷ BóN÷ í÷ òÎ@÷ „ùÖ ‡æ€+÷  á€÷ ÊáÎ ÷ dùÖ €‡w>Ýæ†+÷ xá� N÷ ¢áÎ~+÷ dá@&’Ž÷ ŽáÎ~+÷ PáÎN`÷ FáW¬†Î~+÷ 6áÎ~+÷ .áÎN`÷ $áW¬†Î~+÷ áÎ~+÷ áÎæN`÷ ÊàΊ÷ ÎøBÂì@@là—  †Î€+÷ ÖàŽ÷ áÎ\÷  ø–%@‡fÀêëÈ ülÁÜëÉ AüAl †@æ.÷ ŽàδëÎí²ë÷ ¸àw ªë ƒÎ.÷ tàNÎíšë÷  àÎö÷ :øÖ �‡7 –ìæä÷ (øÎÜ÷ øÎ4.÷ @àÎÌ÷ øÎÄ÷ øÎD.÷ (àδ÷ ø÷ά÷ ð÷À@ë7 :ë†÷ ùÎ’÷ Ö÷Ö ‡wÎÛ‚ €æN`÷ àßW¬†Î~+÷ ÐßÎ~+÷ ÈßD„lÃeÎ÷ ¶ß×¢†Î~+÷ ¨ßÎ~+÷  ßƒ× Îx.× Î€.÷ ‚ßÎ÷ °ßÎ~+÷ rߎ÷ ¢ßÎ~+÷ dß@m N÷ ŠßÎ~+÷ Lߎf÷ ˆÚ÷ rßÎ~+÷ 4ßÎÀ÷ ÷€€b–%‡fæˆ.÷ ßΦ÷ êöΞ÷ âöΖ.÷ ßÎŽ÷ ÒöΆ÷ ÊöÁîw N݆N÷ Áe÷Îh÷ ¬öÎ`÷ ¤öÖ �‡w€Ú‚ÀÝ€í&Ž ÷ äÞÎ~+÷ ¦Þ€œÀ t,÷ ˜Þ Ž’÷ ÆÞÎ~+÷ ˆÞ— ð ‡· ^܂θ.÷ tÞŽÎåð6· �é.‡· Žé+‚ÎÀ.÷ XÞÁ„é@@l€ ‡AøÁ ÎÔ.ÎN`÷ 0ÞW¬†Î~+÷ ÞÎ~+÷ Þ@@lbŽàÎÈ.÷ ÞŽ÷ 2ÞΈ÷ ÌõÖ ‡æö.÷ èÝÎt÷ ¸õÎl÷ °õÎÞ.÷ ÐÝÎ\÷  õÎT÷ ˜õÎ /÷ ¸ÝæâÜÎåRæ÷ îØ÷ ØÝÎ~+÷ šÝÎÄÜÎí¼ìæ÷ ÐØ÷ ºÝÎ~+÷ |ÝΦÜÎí ìæ÷ ²Ø÷ œÝÎò÷ 6õÎ/÷ VÝÀ¶ÛÀåÎŽ ÷ |ÝÎ~+÷ >ÝÀžÛÀídìŽ ÷ dÝÎ~+÷ &ÝÀ†ÛÀíNìŽ ÷ LÝ΢÷ æôÎ*/÷ ÝÎâÚÎåð÷ 0ÝÎ~+÷ òÜÎ ìÎåð÷ ÝÎ~+÷ ÞÜÎìÎåð÷ ÝÎ^÷ ¢ôÎV÷ šô×-ôëðÎ6/÷ ²ÜÎäëÎåð÷ ÜÜÎ2÷ vôÎd/÷ –ÜÎÊë÷ ÄÜÎ÷ ^ôÎ÷ VôÎ ÷ NôÆe ‡ Free Module Current Start CALL Coroutine Conditional DO ..00ŒOSQ§3eaek›’. WHILE DO ... UNTIL WHILE ... DO UNTIL ... DO ENABLE SIGNAL SIGNAL_STOP Ž+˜+ +¨+´+Â+Ð+Þ+ì+ú+,,Numeric String ASCII RSXtime VMStime Pointer Logical 4,>,F,N,X,b,l,&Error occured while processing packet The packet size is (octal). BSince this size would cause the packet to span the block boundary,@the following dump of the packet will end at the block boundary.$An octal dump of the packet follows:Execution stack dump:2Module name Procedure name Entry code Offset BlockDynamic memory allocation:(Type Size Mapcnt Name Ident CompilerTable Files  Error - overlap (bytes): Dynamic files:2Module name File name Code Size Recsiz Records Title Error Value stack: Entry Type Length Place OffsetHeap Module Unknown Unknown  Size Current Max usedGeneral Statistics:Execution stack Value stack Value heap ,Maximum heap used after garbage collection: Heap garbage collections: w¸Ïw¶Ïwa²Ï÷eªÏ÷0C"÷ €‡wVÀÀ–ÏÁ`¬ƒ¬Â`A’ÁEÿÁ5 ÂeÁ5ÂeÁ5 €ÒÀeÀE€` Â`A’ÁEÿÁ5ÂeÁ5‚b·&Ï÷ ‡f÷-ÏÏ ‡×-�0C‡7 Ï÷ $òÀþΜW ÷ èW ÷ Pâ�‡w¢¿CÅÔÎÅe÷ ^Æ÷ pÎAAcw¾Îw`ºÎ÷ °w²Î ‡wªÎ÷¦Î¦Î÷m Î Î÷e˜ÎŇwf¿DÀŠÎbÅ`w|Îw`xÎ÷ n÷ Æ A!†Ã5BBeB!†Ã5 ÷ äÅÀzÒ&÷ ÒÃÖ ð…Ã5åEcãA!‡W#‚æü÷ ~Â÷eHÒwÎwaÎ÷Îwa ·×-€C‚æ÷ RÂ÷ånÀjðêÍÈâ͇×-Z0C‡æ ÷ ,ÂÀJ7ÈÍ7ÂÍ÷e:‡fÁ¸ÍÀ¶Íðµ ,ÿÿæ÷ ôÁÀšÍl÷ŒÍ†Íw`‚Í�‡æ ÷ Æ@�Åe  EcEcÖ ‡æ Åe÷ 6ÇÀ”ϬAAeA!†÷ Çûæ÷ €Ë÷ܤÓÖ S@Bl€l D°` N`¦÷ xá‰`±`C`¶ö`Ä”Â7!ZÓ%ƒW¬æô÷ vÖ% BÔ� €À`Àe ƒæ÷ ZÃÓ•'¦fæ÷ ˆ¿Ó•'Ó•,Ö Øà ƒ-Šû÷4ÂüÒ–%Ö ‡×¯îÒ ׯæÒ÷ 8Åõ‡÷ 0Å  ø ÷ Å  �  õ †7 t·Á ÒW¢ W¢ W¢ æü÷ ºÂÁew ‚Â¦÷ ‚Äw4ÎÀ0Î7(Îw&Î÷mÎ ÎwÎ÷mÎÎÅÎÅeÀ ά÷ œÅ÷ Êæl÷ VÂÖ w äÍ  Ö ÷ xÅÁ f÷ Ö ÷ hʇÿ 2Ù4š<ÿ *Ù4Î:»z_M–, ?À?À�� W  &[qÀÿÿÿÿ W ‚~§TISYSYSYTICL00UQOl1DATADATADATADATADATADATADATAŠìÀ0Àø~§Š¢V†¾ˆ0ÀìÀ0À÷,ôÿ7 ôÿþˆ£Àþ¦ÄrÃÎ÷ äÀ~¦Äd7 ÒÿÃv÷,Èÿ‡÷ °÷ À÷¶ÿÃæñ÷ªÿÞæÿ ÃŒÄrÀþ¦ð’ÿ6÷ |‡ÁŠÿ÷ ¦‡þˆZ£æ.ÿ:( Á×ÀÁeÿ6ÀßÕ4À À×ÀÀe`Á%‚ ÿBÀòî¿ì¶‡þˆ¦£æÞÿêØ€Ädÿ6ÀÊßµ4ÀÿBÀ¼øö 6 ßÅ4Àä÷ 𿜇þˆê£æ¤Þ ‡õ5@6 ÷õ ôævpö ßÕÀ¿`æö‡ßµÀõßÅÀß*ÀÅì 3sœÂEÿaŸ�,ÀÀÁ"¿ÿ 6Ä<CÀ~¦÷ \Æe6 Õj„¬öú".r~Ž–š©@¤´©äªÜªR«´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©*¬z«´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©´©ø¨ø¨ø¨ø¨ø¨ø¨ø¨ø¨“»z_Mæ`¤ÿˆ÷ Ô ‡÷¥ ðþÀÂüÁâþþˆ¤§ÿ ªü‡Á(÷  wHÀþ¦Ãšü÷¼ÿÄrþˆÊ§÷ ʇæ„ÿæP§æN§æH§�÷ $†wÆeæø¨æ§ÿˆææl¦æiÿˆ‚À†µ& &&&�÷ D †÷ �æp§ÿˆþˆ2¨(üÀ&üðü÷ ÿ ær©ææÿ& æÿˆ÷ ÿ æ0©ææòþ& æÿˆÿUÎû÷ â ‡÷ êý57� ÀÝöýÀ ø h¤ïÿ5@¬ûÿE@¤û÷ ¤ÿ5šûÿE’û÷ ªÜÿ5†û ÿE~û À†µ÷ †÷ þ þˆp¨ÿ zû‡ÿE\ûjû÷ Ä¿÷ ¾×-ný€ææÿˆ÷€ZýÿU€.ûfÁ-÷ ��ÿEû÷ ø w€ ÿUûæz§¦öe¶æ…ÿˆÖ ÷ þ æ0©ææöý& æÿˆæsÿˆÿU@Ìúæz§¦öe¶æ…ÿˆÖ ÷ Äý ær©ææ¶ý& æÿˆæsÿˆÿ5Šú÷ ªüæ€ ÷¥ ²üæþæ�§ü6Šæ~¦�÷ †w ÿÆe÷ ‡Á÷ jü&� ÁÝwü÷¥püÿ5,úÁeÁe?Á Á ÁÁEÿÀLüþˆ8ªú÷ ,ü‡fÁ)÷ f�‡fÁ.÷ X�‡÷ ˜ 7 üÀðù7 üûþˆ²ªÿ Úù‡wüCÀ~¦Ä@÷ ÷ Þû7¡ïû † ÄÝçûÄ%€ò†Ä€· Âû퇷 ¸û‡÷ ²û±‡÷ ªû ÄݹûÄ%ƒ· ˜û÷¦û¦û¡‡÷ Ôþw¬÷÷ ÌûfÁ*÷ ¼�÷ ºþ÷ ^ÿ ‡fÁ+÷ ¦�÷ ¤þ÷ Hÿû†fÁ/ÿ÷ ��ÀŠ´÷ ª†¬*æÿ÷ šÀ µ÷ ”†¬*æÿ÷ „wÐýw :ûw 8ûæPûÎí0û·,ûÎBûŽ Îí û·û÷ <þ‡æ�û6Šæ~¦�÷ \†wfý÷-úúû÷ †æû梦栦暦�÷ P †w>ýÆe�÷ $†w.ý÷-ØúÔúÀ†µðÌú Æe÷ þþˆ(¬ÃŒûÄrÀþ¦÷ š ÷ªúTû÷¨úVû÷¦úRû÷Œú8û÷ˆú4û÷†ú2û÷‚ú.û÷ T ‡‡æfú÷dú`ú·^úæ`ú÷^úZú·XúæVú÷TúPú·Nú÷E€Lú÷ Vý‡÷ ¨öÀŠ´pÂ~¦ð•#÷ b†fÁF÷ *�Tþˆª¬ÁÀ÷ÀVÿ Ä÷Àþ¦Ã°÷Ärwè ÷Õ@‚úðþ¦ðr÷ ‡°÷ ’öÁ òÕ@4 ƒÜð÷ êñ†fÁ7÷ Â�÷ à÷ À÷ º‡À µ÷ ̆¬*æÿ÷ ¼ÀŠ´Á µ÷  †fÁ6÷ €�÷ žÀ†µ ÷ ¨†÷ އ ÷ Zö À÷ PöÁ -÷•ù÷•<ùæ(ù÷&ù"ù· ùæ"ù÷ ùù·ùæù÷ùù·ù÷E€ùæ�åø6Šæ~¦�÷ >†wHûÆė÷  †fÁH÷ è�÷ ±‡fÁG÷ Ô�wòâ­÷ …À†µ&&÷ 8‡00]QSQ§3eaek›’°#°-&&�÷ FF‡FfÁ÷ „�÷ ¢±‡Ã¨ÿÁ ÷ R‡B‚ ÂEÄÄe„`Ä%⯆Ëÿÿ÷  ‡“D•‚~Ã%â¯÷ ‡÷bÿ‡÷ ^‡÷ `‡Ãâ­‡Ã%â­Ëÿÿ÷ àÿ‡*DIAG* *WARN* *ERROR* *FATAL* I/ODSW???=–± -- ÷ D…DÁEÿÁ-ꆦf‚ÁÀÖ°f¦ÄÄEÿÄ¥ЕЕæ¦±ÿˆÁœ±Â÷ ø Е Е æv±æ?ÿˆÁdÿ÷ šÁ^ÿ÷ �Áª±P”þ� ÷ Ò Ð•.Е ‚�Ä%�ÄÄ à à Ä`Ä-h7bÄe¦°Ã•Â~Á A·÷ ˆ ÀåÖ°& & & æ &æÖ°& & & Εæææ ÿˆ‡ææ)ÿˆF‡÷e¤° ææÿˆæ`M‚Áÿ÷ àþÖ ‡f…&P&N&L&J&HæÒ°æÒ°&^&Îe\&Îe*ð‹+æϰæ̰Áÿ‚÷ ’þF…‡÷ ÐÀ†µ ÷ ¶ü†÷ œÿ÷ € ‡‡fÁ ÷ fþ�÷ „ÿ±‡V³ÿÿ †µ÷ ’À†µñeq q"9‚‡q,4†&& & 00 ð & & & & æ\³& & æV³& Εæææ ÿˆU‡ææ)ÿˆO‡° ° °÷‹nÿ<�‡& ff& ææZ³& æV³& Εæææ ÿˆ‡ææ)ÿˆ ‡÷‹*ÿ�ñeq �÷ „þfÁ ÷ hý�±‡ÂT³fÁ ÷ Tý�±‡ÂT³fÁ ÷ @ý�±‡÷ HþfÁ ÷ ,ý�±‡ê´ö´ú´ ÿ´LB0:[1,6]SYSSCAN.TMP;1lµö´ú´ xµSYSSCAN.TMP;2æµÆÞ»zSY÷ ðÀ†µÂeBCòòòrrðU‚>p ð•ðâ­ðð•(ðä¯ð•f#÷ ª ‡‡fÁ÷ @û�÷ ^ü±‡÷ zÿ ÎíÂå ÄÀÿ ¶í‡÷ bÿ ¶íf¦Á „ƒÿ ˜í‡÷ &÷ &÷ �’•’•€‡@Á(÷ Èf€  Àe ÀeÉÿÀe Àe ‡&æ¦f&¦ v Þ €�‚ƒ„…‡ ¹G¹w¹Bº¹ª¹È¹Þ¹º+ºÂ·ô·W¸y¸¬·ß·5¸‘¸½¸«¸™¸î¸Û¸HUAB not found in listNo startup transaction foundExiting due to errorBad transaction length.%N block(s) of secondary pool may be lostTransaction not in secondary poolUAB listhead not zero on shutdownTransactions follow SABExitingOn scan file openOn scan file PUT$Error during scan file renameOn scan file closeOn scan file deleteCan't write transaction fileUndefined message number %D. at PC %P Directive error. $DSW=%P PC is just before %P FCS %3A error code = %B %Nfile: %2A%O:[%3A,%3A]%X Can't close transaction fileCan't init new blocksCan't init new blocks. I/O error = %BCan't write attributes. I/O error = %BCan't write attributesCan't open transaction file (by ID)fº…¾ÿÿÿÿ†¿&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡æ¼À àæ¼Àlàæ¼ÀÀæ¼Àdàæ¼Ààæ¼ÀÀæ¼ÀTÀæ¼À°Àæ¼À00eQ#öRl1DATADATADATADATADATADATADATA€Àæ¼À”Àæ¼Àà|³|…–, ÂŠŠQW  &[qààÿÿ$W 2 ¡TISYSYSYTI–>ßÈð ¡¡R€¾¦À”TISYSYSYTI(‹ ŠŠ HŠààŽ#È>ß|…|³ÈA B C D E F H J K L M N P R S T «~¹Š¢àæèþ*,.DLjlnœ¸º $&.$"pŠ–ž©R¡©”¹æ�¡ÿˆæ˜¡ÿˆ÷ ÷tÂr¹ — ”¹ü‡÷”»¬æدÿˆE‡Ä¸ÿô5 @ÀÚ¯Á&` Š÷ ,1‡Å¥ ú÷ Å¥/wrw‘t÷ w‘m÷ Å¥:÷ ü5‡Å¥/÷ ð‡Äœ»¥÷ X Ã÷ ؇¥Å~· D÷ ʇÁÁÁÁôþAw, úÁNÁ& æ~¹‚w´ ·ˆþ·‚þ¡ þˆî£·xþæØþÞ b‡÷,Îú÷ Â÷¼ó ò7 Rþó í7 Fþ Rƒ JÂ&æ†®Þ C‡õµ4@Ð È Ð ü Á '€7Hþ÷mxþBþÿ5<þ76þ÷mbþ0þÿ ,þ?!&þ÷ ¤[‡ÎŠ®ÔÀmFþÁE!ú÷ ˆM‡Þ Õ„Æõ ÃÁ ÷ rB‡Þ ù„»Ö Þ >‡÷,—7Ôý÷mþÎýÿ5ÈýÀmðý @�@ ÀEþÿÁEïÿ@Põ5€õµ@€Q7”ý÷mÆýŽýÀߊý@]À ƒ@ÀìÁ÷ ÜÀlÀU€7”Æ.ý‡ÁŠ& N�ÁBw‚þ÷ tw\þ÷ ýÁ@wpþ÷ úüÁAøÊ ÁW¦‚ñ÷ X f7 >þˆÂ¤Ã2ó · ,‡÷  ü¦÷ºü÷ ·÷ º2 2 ÷ à÷ Š÷ v÷-’üúùìÀˆü w€üA@,Aú1ÁÈüÿ ¨üÀ`üÿ ¸ü·¸È÷ ¶¤Ö æ@¡ÿˆwÈ À¬þˆ¥÷ ¤Á  ÂP„œÂe� † Ò Ä ú‚ ÁnFüwh õµõµ@Àeîÿð¥ð-H Âü�‚ û õÅ‡æ†®Þ 4‡4„@þÿ-5 þÿ& ÿ‹üÿ5èûÎÀÂEÿ€@‚ ‚ ‚ ÷Öûºû·`¶ûÿ²ûÌû‚À €PÁøûÃå÷ Ø€¦àï÷ Tÿʇõµ CÓ Ë Ó-šû÷ 4ÿΊ®¸w-ˆù³Â~·x·,x÷· ûóƒð÷h‡±’Ћ‡À1¦ƒÁþBæ2ûÿF,ûÁe f f& ÎÜÎ쎊ÅDæfÿ û…ƒÅl¿øúºΊïÖ ÿèú�‰¿àú‚‡¦ƒSÁbÁDƒƒS ú†ÈˆC&N`Ö ÈÁb¦ ’MŽb �b"€€Sp‚‡¡ô5þÿô5þÿw0úÀÿÿÅe€ !ýÀ 7 ¡ú±‡‡ À wVÀ%ÀƒÀe þˆ¨÷"úÖÿ÷4úÒÿ÷,úÎÿ÷úÊÿ÷úÆÿħÔHXÔ$X÷>X÷Xÿ5êù ÔÂL¹òÚò<¹À²¸Áô¸¾Á#Âú¸wÈ÷ `ÄŸ»÷ z[‡¥=Ã÷ lT‡¥Rà ù÷ NM‡Å¥=J&÷ @F‡÷ JŠť/ùÀ „áÀF¹0°÷ 1‡È•÷ ,‡€÷•X�÷•P‹· –Å¥/€ 00#ýRSQ§3eaek›’÷ ü‡Ä¢»¥÷ €Ã÷ äe‡¥cÆ~· j÷ ÔÅ¥/£÷ X” w¦÷ HþÀô¸7>7:7 "þˆ~ªÃ޹÷ ¤)‡··· ÷ º#‡‡÷ @þˆ¶ªÀè wàA@,Aú1ÁÎöÿ ®öÀÀ¾öwäß|¹ß[|¹ÿ ¼öÄ”öôܪ‡ÁœÂ޹wXÁwP÷ ‡Å¥ ú¡‡±’Ћ‡Âhö‹,³, ò ‚ó‚ ‚ö±‡÷ h1†‚, .ÀJöÀåð $& !Â,  ÄÄEÿÅÅEB!B- Ä ö,áÄ!- Ã÷×× ±‡Å°õÅåEK-ús-õ±‡Àr÷ Zû‡‡Á[Â޹wd7 âÁ2» W f»ü‡W h»†ÑÿÿúW ”»†Ñ   É%ÿÿûÑ õÁȹÀ À ý÷ ¤‡÷ ÞÅåÀ À%‡÷ ïw"ÁwüÃÜ«Ä÷ °Ä ûÄÜ«� ì‚À ø †¬Ååꇔ¬”¬”¬”¬–¬”¬”¬‡Àö¹& $ ,»‡ 2»†N #ö-óôµ@CÐ ˜#C(˜#Fè5CÖ ‡Ãh»Ã%”»ùƒÎ-(Àå«÷ jÀåÐ¥$êôµ@Ë Ë%ÿÿÁO÷™¬Âþ·Àþ"Ó ïô5 ÍÓ$Ë%ÿÿüÓ ËÁI ÁJwˆþw†þÁKÂè«Ã¹Êââââ¢(z÷  QÀ¶ é÷ èÁ*ºÀ¸ ÷ Ü÷ Ô �Á,»ÿ5ÂóØÁº÷ Ð ÀŒ ÷ ˆ Í%€ É džÀr HÂn Àྷ¨ Áº÷5\ ¶Á$ºÂT ÂåÂ-D ¬‚Â-@ ©‡·> ÁºÀ, ÷ \Á ºÀ" ÷ P÷ t ÀȹÁ–¹Â$ð þÿ  ù÷ P Áðºæœ Ö]š �‡ÁEÂú¸Á& æ~¹‚wÖÀ À%ÀƒÀ% ‚‡Ö wÎþÅÎòAEÄ7 îÿA� Á DÄeawÚÿ7Ôÿ¡Þ ÄÈÿÔ 7!Äÿô‡ ²Þ ే÷ úÿ Àßðÿ· ìÿÀ²¸÷  †ð¥öÿ*± Âú¸Á w<7Äÿ7¾ÿ‡÷ ºÿ&÷ ´ÿÀ€U‡ <¯ &æ&f DÐEÄ%\‡Ä ò· À,°Ã ДþÀ ÷ ” ÷ >ÅÄþ 7 ø fL…÷ Å¥ À²¸÷ : ÷ŒÀˆwd …„ƒ€‡Á,°BàÀ0¯P�æ$¯ÿˆ‡ææ)ÿˆwŒfÿ‡)À<¹Ð•[ ¦�Ü ÷ P Е, �× ÷ B Е]Àå<¹7X‡w ô„ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ \E�€Aa×$Ò±œÿÿ‡÷ &÷ &÷ �’•’•€‡@Á(÷ 4f€  Àe ÀeÉÿÀe Àe ‡&æ¦f&¦ v Þ €�‚ƒ„…‡Command I/O errorFile %X not a valid driver task imagePrivileged commandI/O error on input file %XFile %X has illegal STB formatSyntax errorDevice %2A%O: not in systemPartition/region %2R not in systemDevice not mountedFile %X not contiguousOpen failure on file %XTask image I/O error in file %XPartition %2R too smallIllegal driver task APR usagePartition/region %2R is a commonDriver already residentDriver being loaded or unloadedInsufficient pool spaceLoadable driver support not in systemDriver not loadedDriver cannot be unloadedDevice %2A%O: is attached, busy, online and/or mountedInvalid driver data base at offset %P in file %XDriver built with wrong executive STB fileWarning - KRB %3A interrupt vector %O too highInsufficient ICB pool space for CPU %1AWarning - KRB %3A interrupt vector %O in useSymbol %2R is undefined in file %XSymbol %2R is doubly defined by file %XIllegal value for symbol %2R in file %XDriver dispatch table is inconsistentCTB %2A is not supported by driver -- not loadedCannot load/unload a pseudo deviceToo many symbols of the form %2R in file %XCTB %2A does not existDCB table for CTB %2A is fullKRB table of CTB %2A will not accept KRB %2RKRB %2R not in loadable data baseCTB name %2A is a duplicateWarning - loadable driver larger than 4KPartition/region %2R is not a commonKRB %4A is not offlineIllegal use of partition or region %2RPartition/region %2R already loadedPartition/region %2R cannot be loadedPartition/region %2R cannot be unloadedPartition %2R not in system, defaulting to GENȱڱ²².²M²Z²v²™²¬²Ã²Û²û²³1³R³j³Š³¢³È³Ú³ô³+´\´‡´¶´Þ´ µ.µVµ~µ¤µÕµøµ$¶;¶Y¶†¶¨¶Ä¶í¶·)·P·t·š·Â·_ €,°0¹¹Ä™ðsâyLB<¹rŒ àè 4<>BZ^`bdfÖÞ𖘬\}2»00#S,Tl1DATADATADATADATADATADATADATA˜¬U}4»˜¬YM6»˜¬|…8»˜¬<:»˜¬t!<»˜¬z>»˜¬â@»˜¬%B»˜¬g'D»;©@F»;©€ H»;©ÀJ»;©L»;©@N»;©€%P»;©2R»;©€>T»;©ÀDV»;©KX»;©@QZ»;©€W\»;©d^»;©€p`»;©Àvb»;©}d»+{Ðpȹô¨:^ʹ=©è&̹D©ƒ:ιL© Nйe©ºÒ¹t©š^Ô¹v©šÖ¹v©""عv©?TÚ¹¿©8rܹì©|Þ¹ì©Ìeà¹ì©”’â¹6ªýä¹6ª€æ¹6ªÔ€è¹7ª4ê¹7ªfì¹7ªö&î¹T«|ð¹T«”’ò¹q«ˆZô¹•«[Mö¹ë«z}ø¹“U#f»ÿÿUNL -- VECEXPVECÑ(×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ ê>Âàÿ â> àÿ Ú>Â,àÿ Ò> àÿ Ê,Â8àÿ Â,Â<àÿ º,Â$àÿ ²,€àÿ ª,Â|àÿ ¢,¨à¦Þ5Îe‡w ¼Á,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡wRù èp¼¾ÿÿÿÿ€¿ñœ¿æ¦»ÿˆ×-–@ñ‡÷ ò¦ƒD- ‚ŠEŠ… %µ¬ Âó … Â ÀœÁÀ À À ÀU€À �€ÈEðU€Ö ‡„¦Ê5‚ú‚‡ò û¦¦‚ Ž (Ê5(ÊUW¬ ‡Ä ò ƒ Ä ó  €ææwÿˆóE€Ê5 ÛÊE Ž‚ØÖ ‚ÇW¬ ͇Ê5 ÊÄ È„,ÅÊE 骻ÆÀ À¼€¿ßî&wäúÊEò ÊU ‡æ&W¬ )‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&æf…Þ ƒ„…‡&æ¦ff… Þ �‚ƒ„…‡ &[q &[q‡àà, &ìrðà Â>Â[q}RÂðà Â,ÂE`€WfÂà€‚Âà€€‚Â|³º~–,?A?AbW  &[qààÿÿ$W 2Š» ¨TITISYSYTICLWKOV–±VγøŠêbÔô” γ±Vγ÷5‚w€wtf&¦00,TSQ§3eaek›’‚Þ €�‚‡†7ÿ¦ TKB>Ñ̆,%  À @ à € €%2€>K€Wd€p}€‰–€¢8©°©(ª ª«�«¬€¬Ð¬x¯ð¯h°à°X±Ð±H²g³p³z³ÒW !$<²ˆè¢¯”DSYSYSYSYTICL^&TKB -- *FATAL*-Run abortedÀöÈ Ð·Zü÷øþÆPüÅpÄ@÷ þ Ìe÷  Œ ÷  ÷  Œ ÷  Œ Í5÷ 2 ÷ 6 Œ Í5 ÷ J ÀÈþ÷ J ÷5~þÖÀû÷ : À°þ÷ 2 À�þ÷ 2 w ú ÷5bþCŠÃÁ‹ �ÁÅ€÷ < ÷  BÁŽ÷ f‡÷5€0þ÷ âü× †×-Fþ †÷<þ÷5þ÷.þ±‡÷$þ÷ r÷ : ÷5€îý÷  üwVÿÁpÂ÷ wVÿÀ P�æÿˆ‡wŒfû‡ÁÂû÷ *÷ °È²ûÁ°û÷ ÷  È¦û‡f&f÷ 7Jû�÷ úwŠû7†û7‚û÷ À‚ �� �`wjû ÷ äw^û ‡7,\û‚ó‡7,Tûï‡  ±…‡æVÂ0Þ Â0– ‡Þ æpõ@‡Ð  � ¦÷ ~‚¡Þ ’$õ€ò þÿî’$±öfE7¦ú÷ 4€`Â0 æZÞ Â0 ‡5,‚÷‡5,ó‡  ±– …‡Á6 u$†· ^ú†‚ ø ‡ 1,ù‡‚1,ô‡J ‡±1,ù1,õ‡Áº÷ &Äbúô Äeø� m÷ ¬7Dú„¡Þ &Ä8ú÷ ”e$â$)d÷ ‚÷„±‡÷5ü‡w � & ÀÅÄÃAÁ ÷ ®7òù@m7èù÷ *1 C7ŠÜù÷ øpMŽ ÷ $ð w" ÷ ð ·Š¨ù7¨ù /÷ ôð *w’ù÷ p÷ L7‚ùw€ù ÷ Ò÷ Xƒ`÷Šdù÷ Òô·ŠVùÀTù÷ òÁefA÷   ÷ ^w:ù÷ ø7.ùw,ù÷ ~÷ Áù÷ œÀ ù÷ z& &Žì—%ƒ÷ –N õÁèø÷  V €÷ ÎÃÔø÷ ÷ 2Â÷ TÃÄøÁÈø÷ ðs÷¬ø¬ø÷¦øÁªø÷ zÄewºþ÷ ~÷ ‚÷ Ð÷ A÷ ~ø‡CàÀ*ÂÁ ÷ 6 ‡w ê CB�±÷ ¶÷ Zø‡‡÷54ú‡w Ä Å†eCå %EÄÀ& 7 .øB�d÷ |÷ ‡wø�ãdd�cA�cAdã±Áì÷¡– 7Ö÷‡æA÷ à&ÀeÐ Ð Ð Ð ÃÂCmõ †ˆ &�‚mŠó€ƒ‡æŽ`ÎeÞæŽ`Þ‡÷‹ˆ÷Ó Ãƒ`ƒ ¡±‡fà‘`‰²B`Šá ‡÷ J¦÷‹P÷ ÷ Òÿ‚÷ †æ÷ °ÿæƒ÷ ”ÿ÷ *÷±÷ ¡ƒ– ‡‹ ƒàò ² ‡ ±`p ð ‡f& €`ð,ø‚ ‡ð,ó‚‡ð, î‚& �à� �mV ‚– ‡·*õÀBæ‚ã‚ �c€e ý‡ÀÒ" &àe·#rù÷ Ä€÷ .ð‡Á(  ˆ‡&÷ ÁeB—%þÿÁe‡1bÀe1^1\1H1J1L1N1P‡&&f÷ t�÷ ¤ÿ€h÷ ˆÿ÷eþÿHö¿DöÞ ÷e<ö‡w n÷ â‡EÅÁ‹Á÷ ŒÂæ÷ AÑÁ B` ðØ÷7Ò÷p‘AÁ÷ w”ÁL ÷ &ùw EÅ÷ p†Á÷ BÄœ÷ BÑ „` p‘÷ :ð†÷7€÷ð~÷AÁŠÅÅ @aÀe· n÷· f÷‡Áe?ÁE? ‡& fŽ Ž Ž Ž Ž Ž æYÿˆ‡· :÷ · 4÷Àž0 úBŠÂÀ÷ €`±¡ Àž±¬ùðôö‡w VfÀ* ÷ –E†Ã¢Â— Àÿ †Á@÷ jÿ‡w`RõK`/ËÿÿÄž Ãÿÿ& D -ù‚ô‹öNñ ±òµ÷ &Ãxö €ÜÀ ` ƒ³ÁÀ*÷ �µ– – ‡·¦ò÷ ÿ‡°Š‡·–ò÷ úþ‡ðЇ·†ò÷ êþ‡ðÕ‡BÁö¡ B — ‚ @€` ‡Š ƒ‚ B`·ìõ¡±‡¦÷ *þ÷ �ÿ‚‡·2ò€ ÷ þ÷ œÿˆv  ÷ üý÷ ‚ÿ€mˆ‡¡ �`÷ äý±@÷ Øý¡‡ì(T×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ ÌV àÿ ÄD|àÿ ¼D€àÿ ´V(àÿ ¬V$àÿ ¤D8àÿ œDÄàÿ ”V,àÿ ŒDXàÿ „V àÿ |D$àÿ tVàÿ lDLàÿ dD<àÿ \DHàÿ TŒ %ÿ LŒî'ÿ DV`àÿ <°D)ÿ 4æL'ÿ ,.dÿ $Rÿ v‚ÿ V\àÿ Dàÿ Dàÿ ü¬Vÿ ôô.ÿ ìD0àÿ äVpàÿ ÜVtàÿ Ô`ÿ ÌVTàÿ Ä–†5ÿ ¼–Æ6ÿ ´–€6ÿ ¬D„àÿ ¤Dˆàÿ œ¨<6ÿ ”ðR@ÿ ŒT@¦Þ5Îe‡w \Á,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡w<ù èÔÓÿÿÿÿ00,TTl1DATADATADATADATADATADATADATAÔÊ50„ ´Å (¦ƒr-€‚ù… DÍUt-ÍE Dô €Ä ôE€ù EÍ Ü�‚‡ 2Œ~0ßî&wüÊEò ÊU ‡æ&W¬ )‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡&æ¦ff… Þ �‚ƒ„…‡&æf…Þ ƒ„…‡ &[q &[q‡`àD22ðà 2V2(ðà 2D2< Pzrh �P$ Œh.h�t$´zžh�t$p°zæh�ä%žÂh�ä%øžÔh�ä%œž°h!�t$ øzŒh%�”*´æ h)�”*<æh-�”* æøh1�P°h@h=�PRhzh>�T¨@dhL�T|v@ôhN�Ð ˆd¬hR�Ü!ìvšh\�Ü!P vˆhc�Ð, ¾dvhj�ü(À¬Ðhn�ü(¸¬âhq�ü(¤¬¾ht�TØ @`hz�,%HôNh}�t*h*h‚�t*€<h†�t*ôhˆ�,%hôhŠ�T,@Rh•ü4„Þr•�ü4¼r–r–�ü4Lr¨r˜�ü4ˆºr„rš�„7°¨Ìrž�„7Ȩºr£L@ðÞ£�L@�ÞÞ¤�L@ÄÞðÞ¥Ahà€‚à€€‚€SYxQSYâySY^SYº~xQSY¢_SY»zjL¢_LB[1,1]FSYXCC@êDAêLB êçMPêSSêMA€ëDL`êSHpSPqCR@pMA€-WI pHDëPIêCOxLI xCP€ëDAêFP@êMM€pGPIêPRêASQpTR€êXT€pMACêAEA êHDëPM@êSL êMUêFUpROqAL€ëCMêSEëIPyNMxCOxLI xSGyXHpIDpELxFMxCL xSBrFO@x$+29JÖ(&X^j|Ðèòô5b÷ ’ ÷ Âw¶ÀÁŠÀeÁ û‡w Nö7 ²ùÀNçð5 b$ÅPÃæ ÃeÎ Ë‹úÀ÷ € ±ó ÄP! Á"÷ ”îwjù¡ü– ‡ñ•ñ•w âõ@pdf ¦ÂÔ÷ &ñ‚�B„œ$‡Äµ4ĵ!ò%'‡ò% ‡ò%‡E$ÂeæƒÕ�@à P”üÎ öÖ ÁÁ7Âe Á:Âe Á8Âe÷ Rç±& ĵ€ V ‡11@÷ „ð†BÂeÁ÷ "籇w üô5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµ00,$TSQ§3eaek›’Á ÷ ðœ*AdBbAÁepÂ& ¦fƒÂÁ ÷ ðï– –‡ÁPõµ aA”Aíf@pnp÷ ÖïC*8Ö‹Á ÷ °ï88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ ÄîõÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw óõ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ Fî5fµ fˇðµ ÇÈ•÷ jî‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ †íDlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ ¸í½•8 †õ¥öÿ*δ!Έ!‡w âñõ 8µŠjDl@÷ tíT”ÔÀeBTŸ8œ5l@÷ îì‡@Á(ñ D÷ 4íÁeB&÷ í‡÷ ‡& ææ©ÿˆ@ð•#÷ öì& æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡ÿ ¨ïŒ$'ÿ  ïž¢%ÿ ˜ï–Æ7–AAŽ$?Ž$2–æ$è$í$LB[1,1]ODT.OBJODTID.OBJä˜Â@ w üï÷ â÷ÞÞ÷]ÞRàÄðàÁ,÷ Ü÷ Іw¾áA÷ �ú÷‡ôÚÝb÷àÝ.à÷ÜÝ"àôt&Ãúÿô%d3 ð3 ~$ÀeBÁ Á ýA÷ žù‡÷ D‡÷\ %âßÃ%úÿô5b÷EÖßõ5 ÷EÈßõ5÷UºßÀˆß Àå� ƒÁBÂe÷ .á÷ 4÷ jé3~$sð× üÿ]À@@ÀMtßX7 Þ7 Þ&&$&ôµ!ôµÆå €&&"æÿˆÆe À5'÷U(ß7\ÄÝ7^ÀÝôì&$ÁZPP÷ `†÷E@þÞÁtÜ÷ äèwäÝ÷ ’÷ Èè7îýw\Ü4 Pô@þN÷ xwPÜ$°´&4 bôe&Ãew˜þÀ²ýÁ°ý ÃÿíBÂ@°PÂ@±PÀêÂ÷ jè úô^dôÜb÷jý7 dý÷ À†Á ÷ ìßwj÷À*Á,B÷ é&&&$Á¬Û$÷ ¢æð5÷5Þ÷ ˆý÷ô$„ýôÚ$$÷ Š(‡ðb÷ –ÀâÝÀe5Â÷ <è÷ ŠÞô(&ôL$7 vÞ÷ R‡÷ dwhÞðzÛ´$´&‡`Á9÷ Bß÷ .†Á `÷ .ß,\NL¡±‡À Þ÷ påÀÚ÷ Ìù‡À Ú ÁîÛBA°bpd÷ Ò÷‡fîwböh·\ö�` Š �ÜÁ�ÒÁ%/ -Á%/*Á%//$ÀŠ¡‡œ`Â¥öÿÁÂ¥ÿÿÁÂ¥þÿ ÁÂ¥ýÿÁ Â¥üÿÁÂef÷ tÞ÷UÒܱ‡ÂÚûÂeÂE ÷ Œåæ‚$ÿˆ&Àf׿Š$ÿˆÀmÞû€ ‡ ÀíÒû ‡ÀíÊûž¦ ÊÀûà�bŠå‚‡÷ öÀÔÁâ Á ý· rÜ÷Ú`Ü7 Ý7 ÆÚÀöÜ8 f÷ Bä7 ÛÀ*ÁôH ‰·îÚÁþÿæ®$æ?ÿˆ÷xûÜ÷%Ü 7 úÛ÷ <ÿ·ÄÚÀ ÷U€üÛ÷U€öÛ÷ ºW‡÷@¼Û7 ÞÜ÷ êÛ÷ òÛ÷®ÛÁf÷ òãw2ÚÁ‚P” ýÁ÷ Úãw¢ÛÁ÷ Îãw˜Û÷UœÛ÷ Fð• ð‚Ûð~Û wpÛwÚ7ÚÁe @ÁÜÙ÷ ÒÝ÷ ¬Ý7 RÜ÷E€^Û÷xÛ÷\Ú7 ,Ú7 *Ú÷^Û‡ÁK ÷ ÔÜw ÎêwbÛÀ¤      ÷DÛ7 DÛ7 >Û7 >ÛÀ* W, (‡Á÷ Œ7ÛÁ÷ €7ÛÁÛ ÀÛæþÿð8úð•#÷ Ôå †ð%è* 7 ú ï�7 úìŽ ÷ ö凎 ±€‡÷ œù÷ "ý%‡A÷ æôö‡ñµ ÁŠ÷ Üë÷rù÷ œóÀÛAÿ dù7^ùÞ‡÷ œó†ÂŠÁN÷ âÛ‡ÁBí÷ °â&&÷ �Á9?‡ÁÚ÷ šâ÷ äÁ¾ÚÀePHHJ÷ 툠÷  ð5@÷ œÚŠÁ wŒÚðž× ðÜì ÀÂÙÀe5Â÷ äÀfÚðr×b÷ ÿ ‡÷ Ö†Á9`÷ BÛî‡À@Ú&&ð5 bð &÷ °&‡ÿ 脌6ÿ è„’6ÿ è„¢6ÿ üç–†5ÿ ôç–¼5ÿ ìç–Ê5ÿ äç–&6ô5uuuu w dï÷ "÷ &w*ÁŒ$A±q#úq-ö‡ÿ 6î°ò&ÿ .îÂ"&ÿ &îÔ&00,,TTl1DATADATADATADATADATADATADATAÖ¯"(1±R7(“±ÌU(ß±à`Í(ó¯ÐÛ(’&3ÿ²& TKB>l^SY†7 –ý÷Œ$’ý7 þÀjßÀe`Á& ý÷ DæÁîÞñ@bp$$À:ß0 b÷ ²ø@‡Àef7D÷` Š÷ –È¥;ìÈ‹êÅ&% % % % ÷ „Â¥:uu÷ j÷ nÀ & ”W¤ û‚ÿ ôöÁ ÷€e)Áä%I#q-'ÁeW &õ‡Á$0Âefœ`Á × üÿÁ× ÂeâÿÁ × þÿÁ^× öÿÁ ÷ ßAÁ5 Â¥;U%ÁEÉ ‹Á#wÖ ÷ øüÁ(w we)÷ ´e)Á(Í ræ æ²)Ä�e)÷ †e)Á)Í lÄ æ æh)÷ ¼U%ƒ Â¥;Â¥,Q÷ \÷ Pe)S#S-ã Ó$Ë ÷Á*IÄÂË ã€ÄÒáÁ ÷ ‘%‘QüÿQ *& ÷ NüÁ&1Í &f÷ JÁ õÁe f÷ ä�Ö 7"üÒ ÁRRRÁ|õACà`Ãe ÒR”þ?jû7fû‡Á%÷ ~ü†‡Á'ÂJõ÷ ÈÝ·²ØÀ"Ý÷ zø÷ âæÁ&ÂÀe`P ý‡£ &€ÿ,@ÿ 3ÿ@8€„K@oMBaÿTq ÿØrÿt@,ÿYeÿÜYxx@ÿßY`èYè5ÿ *ê–†5ÿ "ê–Â7ÿ ê–8ÿ ê–Æ7ý¨X[<$09AZ (),-*! x'Ê&'Ž&>'`' &"'"'"'7 ¾ÿ7 Êÿ7 Èÿ7 Xþ7 ¨Ý÷¶ÿÀ�$ P %ú‡Ã’$À% #Ä¢%À¾þ$$÷ :Åò%B“‚ Á Á üœr0t$Iz &Ã%’$U÷^ÿZÿ7 XÿO× ’$÷‹Jÿ8÷€Dÿ÷5€¸ÞM÷5°ÞI÷²ÞE÷ ¼ý÷ ÿ· °ýÓ$× %†Í¥pÍ¥&ðÕ€7 øþ Á-A#÷ ~ý÷ xýã(× ’$†3Á%2Âô%Õ¥J“ÊÅÅ °Ò÷ ¨þ÷ Hý° ·’Ü#7 �þ ÍEwÿÍ¥Âô%J�ÊÅ·nþî#× ’$Á.w‡È‹È¥;!ž%†%õ ‡À%ü‹9ü¥;5Áê%H¤1H¤/H¤-H¤‚H¤)†H¤‚H¢%†Å”u &Å ûÁ+wª÷ –ÿÀ%W­&À%W­& Á÷ ¬ðp�&‡Åø%&÷ ¤À e)È¥:2È¥./È¥[,È¥<)È¥/&�ãW !†÷ Tý‡Ö ÷ &ÿñ‹ fAœf÷ J…‚‘”Å ý‡!"%ƒdd‰Á,w€Å& ȋȥ-È¥)È¥(È¥*Πȥ, Ž È¥[Πȥ]Î ”âÖ Z÷ ¤þÁ,÷ ÒÅåðp÷ \çJ‡÷ šõÀÝA÷ öA‡÷ žõÁN>‡À*Á,B÷ çÀàÜ&&ð5 bð &÷ r°&`Á90‡÷ pð5@÷ °ÜwªÜð¼Ùðüî –Üò¢ÙbfÁ÷ 6Ñ Ñ‘‡Á%ŠœŠâå Àe 2÷ RÝÿ Hê„’6ÿ @ê–†5ÿ 8ê–¼5ÿ 0ê–Â71±o†?±y‹T'Ž'p'Ž'�'R(T'T'Ä(ž)F)ÅŒ$÷ 0ÁÄÜ÷ ¼ç7Îÿ7 Ìÿ÷€Èÿ÷5¾ÿ÷EºÿÀ�$Ð P %ú‡Ä’$ÁüÞ÷ Pé÷ é÷ æÁšÝ÷ úè÷ æèÄ�$÷ Î%!%ù‡À@÷5hÿÀÕ7Hÿ7Lÿ÷ ÜÞ÷5Nÿ÷ºÝÁ¸ÝW  Á � Á CÁ ÷  7fÞÀ`7ŽÞÅì%÷ ÷ øÜ5Åä%ÁnÞ÷ Âè÷ xèõµ· `Ý´ dÁ÷ †æpppðºÜ À6ÞUÀe÷ ¢à÷ |àAÁåÀh÷ òã÷ "âÁÞ÷ è‡Á´Ü÷ Šæ7¢ÜÜÂEz&ó5õUÀð¥æƒ÷ �ã‡÷ ä÷ ¸ç÷5ÒÝp  p´´pp��õµõ f&÷ f€°�p÷5’Ý&÷ N€°´p �ðÕó5õUfu°p ððÛ7âÛwæÛ÷ 2ç�÷ ²å÷ 8çðÐÛÁñ¥<ƒ÷ ÐfwXÀð¥2ƒ÷ ÷5 Ýp  p´´pp��÷ Ìæu ð€Û wzÛ ÷ Öæ÷ Âæ÷ z÷ @å& Á^Û÷ ®æ�÷ þæ÷ ´æwLÛw�þÁÁeÁå@Àe÷ ªß2†Á÷ ¶äfðððœðÅó5ðÕÀþÚÀe ÷ ÀÞ†÷ ˜Þ÷5NÜ Á÷ D°ÁÐÚ9–1–Ö õ G@Á÷ ˜ä÷ æw ÀÜÁe & NÎe ó5ðU À�ÚÀe5Â÷ <æ�õ !÷ Rä55ó5õUõÅÛÿõÜ÷-PÚ ÛõÅõõõµóµ€÷5€ˆÛ÷5€ÛõÕ÷ 8uµ�÷5fÛ÷ $u µ´w8ýÌ%ææÙ÷ *ý�Ì$)‡Á÷ \ãð]Âû · >Û¶û÷e°û‡E B�œÁE€ÿÀ*E÷ äåÅ ô‡ÿ ’é–†5ÿ Šé–&600,4TSQ§3eaek›’z*‚*j*j*j*j*j*j*j*j*j*‚*j*j*j*j*j*j*j*j*j*z*Š*z*z*z*z*z*z*z*z*‚*z*z*‚*¼'j*j*j*j*j*j*j*j*‚*j*z*z*‚*j*‚*‚*‚*J*R*z*J*R*z*2*2*Z*B*z*:*ò)‚*z*‚*j*j*z*z*j*j*j*j*j*j*j*j*j*j*j*j*j*j*j*j*‚*‚*‚*z*–.z*‚*‚*j*j*j*z*‚*‚*Ÿ su$”*£ @€–,AL%w ºí÷ Î÷à ÔÛ÷5Þ À¨ÚðÅa÷'†Ü÷ ”‡7 |Ü•!À÷ bô‡&ü „øÀvÚðÕa÷ fûÀÐÜÀmÆÜ€  ƒ÷ÄÝw^÷ ÂÀ ÷ ¤‡fÁ�Ý÷ æ÷ šç�‡¦÷ èÿÁzÝ÷ hçÀed7úþAÁåÀe¾ÿ÷ „à1†Î‹· ^Ü¿ ÞþÁ÷ „åpp°UðÕ@pMð¬Û À(Ý%Àe÷ –ß÷ pß×-,Ü Åå AÀh÷ Þâ÷ á±‡Ö ‡·�ÙÀ ÙðÕa÷ �úÁŠ÷ ŠÞ‡w ‚ì÷ vw xì÷ lÅ¢Û ÄêÛ÷ r7"œÜ7,–Ü9ÃZ7Žü÷EõÿˆüÃA3"3,'ó5@ó5îÄÄEõÿÄ-XüçÄÅ ÷ à #ÂŒ   B`‡ „ ‡E ‚Ö Ä¼ýÔ Äe3#3-Å õ±¡‡÷ ܱ€w °ë&ÄDÀ@'ÄF'æD'ÿˆ ‡Á&ÂÊû÷5Æû €‡w të÷ÿÿ´û& æºÛ· ªû¦�÷ æ7PÚwTÚÍ �÷ &ä÷ œå& íÖ ¶#ê–%÷ vû�÷ äóÖ ‡ÿ êø€/ÿ êøh0ÿ ê >+ÿ ê 8+ÿ øé (/ÿ ðé Ê/ÿ èéâ*ÿ àé*0ÿ Øé1ÿ Ðé„Ä5ÿ Èé„^6ÿ Àé„f6ÿ ¸é„5ÿ °é„¤5ÿ ¨é„V6ÿ  é–†5ÿ ˜é–Š7ÿ �é–8ÿ ˆé–„7ÿ €é–Æ7ÿ xé–¶7ÃSwÊý Ä·R×ÁÁ Áe ÷ ®ÿà wêwÙ‡·6×@$à ÁÈ "ú‚7$lúƒ7þÿdúÁ óÁÁ Áe÷ pÿ?lÙ7hÙÐ PAPÐÐ�Pà ý‡Ã0wRý·âÖ÷^ÚwØØwÖØ÷@ÒØÅú÷ ¦üÁ&Úw$äW#€‚Í Í wæØ‡ÃTwý÷5€Ú÷âù7 ÒÙ7 ÒØ7 ÐØ÷ÿàØÍe ‡ÍEM M M MŒÍwÈØ‡·hÖÁÁ Áe÷ Äþă ?–Ù7’ÙÐ È(ûÐåPPPà ý‡·2ÖÁä&·(ÖÁà&ee·ÖAÁåÀ^÷ ݆Á ÷ jþpppÀ^÷ ÎÜp‡·ÞÕæ‚“÷ ´û‡Î ðµ· .Ø¿ ®úðÅ ðµ÷ Øÿ –ú°Óp÷ ãÖ ÁöØwôâ·ŠÕ& ÖwÖ×wÔׇ÷5 ôØÃmwØûæXúæVúwPúwNú7 LúÀÂ,÷ èü·>ú·8ú÷ 8úÃlw¦û‡&À<×7,ú 7,ú Á0×÷ �âðU· ú€‡÷ˆØÀÕðÕa÷ öwôüÀÕðÕa÷ ôõwêüÀòÔðÕa÷ âõ÷ULØwâüU%Í W# †wB×w<×w6ׇw:·¨Ô@× A÷ îû@‡$Á5?7Â5?3ÂŒB B B @÷5€è× *·¦×Á=¬÷%Á ÷5€Î×÷5ž÷÷ Ôú‡· Öƒ÷5Š÷7€×7~×w¾Ö·lÖ·jÖ÷j÷‡Ã@ÃRw|úW#ú‚wTׇÃ5whúÍ wjׇ·ðÓÀÌø  AÁEøÿBÜ8'C ƒCÀ ö·�®Õ÷�ׇ·ÆÓÀ¢ø  AÁEøÿBÜ8'C ƒCÀ ö·�†Õ÷�õÖ‡wúÖwøÖ‡w×wׇU%Í W# †w ÖwÖwþÕ‡Ã6wÖùwêևХ[÷ 8Â¥,å‹f™÷ (�Â¥]å‹U�÷ °û”‡Ö ŠÁ÷ 8ر‡&÷ ŒûÂ¥.€å ÷ Žû÷ ‚û”Ö ‡w#Lö‡W#ú‚wrÕ‡Ã1wVùW#& W#BaÃwBù÷ä Ô‡÷à üÓ‡wòúW#ƒW#‚÷2Öw(Õ‡ÃUÛ· Òæ·˜Ò& Á÷ öú°?"Ö7Ö PH‡Â pÂ¥;mÂ¥!÷ šÈ¥;eÅî&÷ „Â¥=7e)ÄT%t#t-Äe !Ú&ô‡Á87 ÷ È‹-È¥;*ÃEÅî&· îöô­êö÷ 6Û Â¥,Â¥! Â¥;Â¥:éÁÁ ô5Á ô­¦öÁ!ÂÎÑòÕaÀÄÑ÷ ºòŠ÷ ¶ÖÅî&Ãzö¡±‡w žä&Á"÷ "Ýwlö7föÂôˆJ· lÓõ•ÿÿ€fÅe& ÷ žÂ +— ;(— !%— ,— :)Ž —£%êŽ —£ …Õ ÷ Dµ“þÿ¶Š— ,— :Ù÷ D— : ô—£ö‹Ö …5Ї–%ÁŠwîÕÿ äℤ5ÿ Üâ–Â7ÿ Ôâ–8ÿ Ìâ–„7ÿ Äâ–Æ700,wü×÷ Rù7 \ÖÂâûÁæÀ*w&áÀâÒ ÁÆÔBA°bpd÷ ªð‡fîw:ïh·4ï�` Š �ÜÁ�ÒÁ%/ -Á%/*Á%//$ÀŠ¡‡œ`Â¥öÿÁÂ¥ÿÿÁÂ¥þÿ ÁÂ¥ýÿÁ Â¥üÿÁÂef÷ L×÷UªÕ±‡÷ ûÄ÷Åî&fB�Á Á ýõ +õõ"+ õ 5�.ô‹€õU€.5�-æè&µÄe& €÷ dú÷ ^ú�@ ѥ ûÁ àu÷ èúN#N…à áÄ|ö´•–%7 rö÷m¨úøÓ‡ÿ ˆã„’6ÿ €ã–†5ÿ xã–¶5ÿ pã–°5&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡?ÿ @`€ Ààÿÿ_ÿ?¾*Units set to maximum assigned^,V,V,æàæ=ÿˆ÷5~Ú÷‚ÚÀxÙÀmnÙ  ƒ÷%nÚ ƒÁV U÷-VÙ"ú †÷úLÙÁ1º*÷ ÔÛÀ`Á,B w,,Ù‚ H`Áeó÷ÿÿ6ÿ÷ÿÿ2ÿÁÙÂÌØ÷5Îù*÷5Æù& ÷ Èý†ÁF‚÷5€ÚÙ ·˜Ù÷ àü ‡Á=˜ù · &Ø‚wÔØ·‚Ø·€ØÁQÂD÷ @Û ÷5€œÙ;÷5lù+Á ï÷5`ù%Ä\Ù"Äå5Ý¡*–*5Ý¡*”*÷5rÙõÕ€–*õÕ€”*Ä 7¬*nØ7¬*jØ´ ´*Ì‚m¬*· Ø· ØõÝ ×–*õݜה*÷ ¦µÐ–*µÐ”*Äþÿ÷  & & ÀZdð5@tp,$õð5t€,îí ð5€  ÷ Z c€ÁHúAœÁ A¦*ìN ׇN6Ó÷5€®Ø  ð5… ð5€ %÷  �ð5@ð5 ¦B÷ ¦– Áf÷ ÚwØÃØùB÷ Œ�s�œ÷  ÷ †Ow4‚€t6- w. ð5… ÷ Pð5€ ÷ ” �‚    °` °°°`ðU@wÞþÂ`ù‚œ ‚œž*�� BŒý€÷5Ô×ð5µ°”*µ°–*ŒU‡Á îwÞü�    ÷5¤×ð5µÐ”*µÐ–*ð5€ Ãøøó‹€ó�¦üÅ ÷5n× ð5 w Šü†w„ü ÷ ~üw vü†wpü÷ jüpp÷5€4×ð5 ð5@ðU@p` p`|Þ*Ò ÁA÷  Ø÷Ý&üfÕ÷�!üaÕ÷Ýü\Õ÷ ÷5¼ö÷ ªÖ÷ü¦Õ÷ü¢Õ‡ÂEÿ B B B ‡B÷ ìÿ� ì÷ Þÿ‚œž*Á ÂŒ‡û÷5˜Öð5µ°”*µ°–*‡w æ&fÁôA<÷ äÞ7Ü÷�€&��æÔ % ,4,à ö–%&fÁ®÷áÖ ðE ðU€40, ôU 0, ð ð5 ‚•‡ÁgÒ wŠ×ÁiùÁhøÁkóÀŠ ÷5ÐÕÃl³ ˜*ƒ³˜*ó ˜*÷ Ôþ� ÷ Èþ‚œž*Á ÂŒü³ÐØß‡f¦ŽÎeÿ‚÷ žþ�‚‚í÷ ’þ‚œž*Á ÂŒ‡ûÖ �µ°–*‡Ö �‡ ÷ ù÷žÓ7 öÓ÷8Ô7 øÓ7 Ô7 øô7 öô7 .Ô7 &Ô7 .Ô7 èÔ7 Õ7 Õ7 Ô7 Ô÷øÔÀ®Ï7DþÔ7 ¸Ô÷<´Ô7 Õ÷”ÕÀZ P ÁFÒ÷ >Ý7šô÷5€¼Ô÷?†ôÁÓ Á%‡ÁA A A Á wÓ ÷ÿßøÒ÷ÿ\ô÷ÿÿêÒÀ` H‡Áe÷ Öë·ôÐ× †5 × †5 ÷5€PÔ5 @$Á d.‡Aá ÄŠ÷ ¸×†Á ÷ L Ð AÂP ý÷ föÀeAá ÷ ×‡ðµ  ÷ ôÝðÕ€pp ‡ÃZwÎöÿ jâ–†500,DTSQ§3eaek›’&æ¦f&¦ v Þ €�‚ƒ„…‡D v $$�$š ª+Ö+L)ɪù¬yN0†ù¬tN°² ­sN0‚ù¬sN0† ­s, ÿŠ ­øt ­~,¤ÿ ­, ÿŽ ­€,¤ÿ­3X ÿ’ø¯ªàf  :,v-v--f w ¢ûÁ~é÷ vô7|ÿ ÷ ×-ôêÀæ÷ <‡÷5äëÁÄë÷ Hô÷ Îõø÷5ÂëÜ÷ vÃÀ÷ n÷5@²ëâ÷ .êßÁŒë÷ ô÷ –õî÷ J‡w û÷ ŽÁê÷ zõÅ êw `ë@Àe"Á”ñKr•@×-bë ‡ñJr÷5Pëñ;r÷5:ëñå÷6ë÷ –é÷5¢þñåK÷5”þÂÕ±�÷ î‡Á÷ ð`é –Р��ˆȵµ d· ÎéÀpéÀe÷ 2í÷ í÷5Dþ'÷%¾é#÷ "é×-¸ê‡÷5@¬êÁ÷ ºðé ðéðv~ðÕhÀéÀe÷ Üì÷ ¶ì÷5@tê÷ ðèî÷ ÷5VêÜ÷ ÃÀøÀ.PHÄ„4 ôÿÿ7¶è7 ºè÷ 0‡× ÐúõµöÀ2PPÐh ÷ VêÀ„wê±À2Ð ÐÐ à‹÷-pèÀéŠ÷5Jý÷%ÄèÈ•@@Á0ÿ ¼ü@Àb È\ýÓ ‡Á0@ üÁ÷ ®ð 07臷æfÁ÷ ø?öü7òü°‡÷æüâüÁÞü±wÖüA÷ Àñ¡Þ ôÂÈü·Âü÷ ø÷ø¸ü‡ÁÀ*wþó·¦åÂø€± �,ùˆ7Œü÷ Òÿ¡‡÷ „ü Àßzü· vüÀˆé÷ öó †ð¥öÿ*± `Á ÷ dê7Nü7Hü‡÷ ºÿ&÷ ´ÿÀ€U‡w >ø÷ÿÿ,ü& æ„è· "ü¦�÷ Ðò7çwçÍ �÷ ðð÷ fò& íÖ ¶#ê–%÷ îû�÷ ÌðóÖ ‡·àû7 Úû÷€Òû7 Ìû7 Êû7 Èû€ÁÀæfj&�Ž÷ ~±‡÷ ˆð6¦vwœæÂ�æ7Œæ÷‹Œû(Àe"Á�èÁeB$$$ÀåÁe((ÁZæ·<Tûw<Lû  w<Bû÷ ÷ ÷ ÷ 0ûw<&û·‘$ûð•#÷ ’ò†`Á ÷ é÷ ò÷%<çWñ5@ñ5 O€f &�F÷ ¾ï6¦vwÒå7Æå7 ¾ú÷ Àú*7<¶ú&ð5@ ÷‹­ú÷ ª÷•¡ú Àžçð•ð•÷ ò‡÷ úñ†`Á ÷ rè÷ „Þ ÷ Ê�Ž÷ ²ð·Ž ÷ R÷ fÞ ÷ ¬�÷ –ðŽ7Š7úwvþ÷ ,ú À6ç7÷%Á÷ xýð0÷ð(÷ ðÕHÂ03ÁÜáðµw÷÷Äáþöw þö±wöö‡Â.Á÷ ¦äÀe÷ æf6†Ö Á÷ ýÂ0°ðµð¤ö ðpá °°fÀ^áÀe ÷ å÷ úä÷5°â Á÷ . °Á2á9–1–�÷ ëðµ÷ öêN&Á  ý€Â0&€Á5ÁEÀEÁEÀEÁE@ÀE@ÀEÁE €&&fÎEÿïöEÿï¶#‡ ‚–%€–%€ðÕ2, –%€òU2,Á�â ÷ €ãà 5Ávà÷ Öë´ C� Á Á ÷ J &à ÂP ý&À*ÁÁ ÷ |쀴ˆ7JõÈVõ÷% ­Jõ÷%,Dõ7vჇ·*õƒ‡‡÷%.õ?÷-üßLá1Â�ô5ÂzÊ%¦Àe÷ Nä‚N‡ðµÁòôðµ l‡Á5RŠÂ.rrÁÖ Â.² Á÷ ‚â‡7 |ô÷ xô‡æCœóÅô5Hô5€µóµ óµ (³lóÅ óÕô5€)÷ ß&óœô5óUó5óUó5 óEóEw,Æ w,À ñm:àóµ3ô5€óÕ€óµ(Àðµ "ðµ ó5ó5 3lðµ€ðµô5 õ5óÕ×-Ê߆óµ ÷,hó÷,bó÷e¨ßô5ó%ɪó%J'ó;'ó%Jró;r÷ÿÿFóæêÞ †w6óµwÎ÷îÝ,ó‚Á 9ÂÀeÃe‹°bˆ° ÷5@4ß\÷ °ÝY÷-¼Ý ßUÈ5RÈ5OÈ5Lô5HÁžÝÈUB÷ Z@ˆÀð¤òÁ†Ý÷ âè· Ôݵ d÷ Xõ1¦ÂLðµ°ðµ€¬Š Ê ÷ êÞ ‡ðµ÷ Ú÷†Ö w÷ tòû÷-lò~Þ ÷5@�Þ ÷ Ý÷ ¸‡S÷ Lò7€ÁNò÷ àæð5w”ð5wˆðµ€w|ðÅ€7œò÷ÖÜòÁÐÜ÷ ,èB÷-ÞÀÜ &fÁÞ÷ Œæ÷ è�€÷ bw:Á÷ ø÷ ØçÂÐñ°ðÕ€ðÕ÷µÀñB÷ 0÷ Hæ÷ ¾çw¶ðµ€ 7˜ñÀRÜ7Šñw‚ñ÷DÜ~ñ7 ~ñ±¡7tñ‡Â.Á÷ $ßw\Á 6ÁÜ÷ Xô÷ Tç÷ $‡%ÁÜ÷ Úå÷ `ç÷ Lçw6ñððE÷$ñðððð µsõ d÷ Ün÷ ðÖ 00,LTTl1DATADATADATADATADATADATADATAÁ¼Û÷ çwJfÁ®Û÷ Pç÷ çð5ð5€ ô5Ö Á†Û÷ *çB÷ Îææ¨(æÁrÛ÷ ç7bÛwÀÁdÛ÷ ç÷ ¼æ&÷ L(‡)€ÁLÛðµÂ6Ûò d÷ ŽÛÂrð°0 ðÕ€ðÕ—%÷µVð ÂÛÁ Û÷ À÷ .–%ÁúÚ÷ FæÁðÚ÷ Næ÷ :æÞ †wxfÁÚÚ÷ ~æ7ÊÚµÂ.Á÷ Â݇w ºëCô5€7(ò5³l÷âïÁ÷ ~Á<Ñ H !Ð Ð&ÁÆÛ÷ Jä÷ Ðå€PPÐÐJ©Ðø‰ÄºÛÄ Ð· ®Û‡² xæÃt² ræÃnf¦Á÷ ‚Â`Ò  "°�ƒ‡¡ðµóµ ðµ€÷ ¾ãðµ 3,ô5¡±¤‡óµwRóµô5w>Áó5ó5Áe÷5@òÚ ô5€ ÷ fÙô5Áe÷ êôw¤îô5ó5óÕ€ð ðm Ú0 0 ÷ †÷pîððEðð0î ðÙ ó5ðHîðð^Úóµ óÕ€ð ðm8Ú0 0 óµ 0 µ d· Ù÷ üã÷ šð÷ äððÀ ØÀef÷ `Ü÷ :Ü÷%ôØæ†ØææÆå�Àh÷ œß÷ ÌÝÆe – ƒ‡ÀNÈ ô5PHtt Á8Øwšã÷ íæ–ØÎmŒØŽ ‚— ƒ÷%ˆÙ— ƒfÁV ÷ Û�· fØ7 àì1 ñ×÷5€LÙfÂ.Á]÷ ØÚ�w`ôÖ 6f… ÷ .Á÷ ’á÷ ãÁðµ !ðµ ðµp`†Á ðµp ƒÁ;Ò ÷ tÚp ƒpÅ Ó…÷ Àòô5 -ô5@)ÁH×÷ šâ7 4ì÷ ¨ï‡÷ äï ö7 ì÷ ”ï‡÷ ðî÷ bâ&fÁ×÷ ìà÷ râ°·ׄwÔòwVóƒ‡ô5-÷ ˜ïÃåÀ%&÷ ŠïÀ¥!ô5ôUÁÄÖ÷ &âæÃ2æ÷ `ïÎ ûÖ ƒÃå Á0@÷ ÷à Û‡7 „ë‡w ŠçÄeW!€ƒÅå€÷ Å€AÁ Á ÷ ðñTÐÐÅ ü‡÷5 ë÷5˜ë÷5�ëô5Á÷ ¼ñ÷ xáðpëðÕˆB÷ ìû÷ øß¡‡±‡÷ VêÁ`×÷ äßÀe&ÁöÕÁe ÷ nÚ‡wëÖ ‡€Á÷ ZÚ‡wúê‡÷רêwÖêÂÐê�¦·Æê÷ jáw¾ÕÁ¼êÀe÷ &Úf &w¬ÕÁ¦Õ÷ ôà€ �ã‡Þ ᱇w пŶÖÁ„Õ& f w€ê÷ Pß÷ RÄ  öÄÀZÕ& ff÷ *ß÷ ,ö� ÷ ß– N ñ– õ„ !‚æ.ê¦í– ‡U ‡1±o†ÿ å–†5€h0ð&æ¦f&¦ v Þ €�‚ƒ„…‡¶#è#t'v'( $/H/¾,Ž º¯ªàB#D#Ø#z#¬/è0è0†0Ø# 7 Të÷ ÷\ÿÀäëðf2h8 f÷ (óÀ8÷ 4÷ ê÷ Æë·8ë÷5ë7 ,ë7 $ÿÀ„÷ 7 ë ÁJ÷ ŽìÀ’ë÷ °õ0 h‡Á÷ ®ð 07`釷RçfÁ÷ Ê?Úþ7Öþ°‡÷ÊþÆþÁÂþ±wºþA÷ ó¡Þ ô¬þ·¦þ÷ ø÷Žœþ‡ÁÀ*wLõ·ôæÂŽ€± �,ùˆ7pþ÷ Òÿ¡‡÷ hþ Àß^þ· ZþÀÖê÷ Dõ †ð¥öÿ*± `Á ÷ ²ë72þ7,þ‡÷ ºÿ&÷ ´ÿÀ€U‡w Œù÷ÿÿþ& æÒé· þ¦�÷ ô7hèwlèÍ �÷ >ò÷ ´ó& íÖ ¶#ê–%÷ Òý�÷ òóÖ ‡·Äý7 ¾ý÷€¶ý7 °ý7 ®ý7 ¬ý€Áèfj&�Ž÷ ~±‡÷ Öñ6¦vwêçÂÞç7Úç÷‹pý(Àe"ÁÞéÁeB$$$ÀåÁe((Á¨ç·<8ýw<0ý  w<&ý÷ ÷ ÷ ÷ ýw< ý·‘ýð•#÷ àó†`Á ÷ `ê÷ ò÷%ŠèWñ5@ñ5 O€f &�F÷ ñ6¦vw ç7ç7 ¢ü÷ ¤ü*7<šü&ð5@ ÷‹‘ü÷ ª÷•…ü Àìèð•ð•÷ nó‡÷ Hó†`Á ÷ Àé÷ „Þ ÷ Ê�Ž÷ ò·Ž ÷ R÷ fÞ ÷ ¬�÷ äñŽ7Šüwvþ÷ ü À„è7ß Á÷ @°ÁÀÝ9–1–�÷ ”çðµ÷ „çN&ÁÈ  ý€Âä&€Á5ÁEÀEÁEÀEÁE@ÀE@ÀEÁE €&&fÎEÿïöEÿï¶#‡ ‚–%€–%€ðÕ2, –%€òU2,Á�â ÷ àà 5ÁÝ÷ dè´ C� Á Á ÷ \ &à ÂP ý&À*ÁÁ ÷ 逴ˆ7ŒòȘò÷% ­Œò÷%,†ò7Þƒ‡·lòƒ‡‡÷%pò?÷-ŠÜÚÝ1Â�ô5ÂzÊ%¦Àe÷ Üà‚N‡ðµÁ4òðµ l‡Á5RŠÂârrÁÖ Ââ² Á÷ ߇7 ¾ñ÷ ºñ‡æCœóÅô5Hô5€µóµ óµ (³lóÅ óÕô5€)÷ ˜Û&óœô5óUó5óUó5 óEóEw,Ø w,Ò ñmÈÜóµ3ô5€óÕ€óµ(ÀÈðµ "ðµ ó5ó5 3lðµ€ðµô5 õ5óÕ×-X܆óµ ÷,ªð÷,¤ð÷e6Üô5ó%ɪó%J'ó;'ó%Jró;r÷ÿÿˆðæêÞ †w6óµwÎ÷|Únð‚Á 9ÂÀeÃe‹°bˆ° ÷5@ÂÛ\÷ >ÚY÷-JÚšÛUÈ5RÈ5OÈ5Lô5HÁ,ÚÈUB÷ Z@ˆÀðæïÁÚ÷ på· bÚµ d÷ ˜ð1¦Âðµ°ðµ€¬Š Ê ÷ êÞ ‡ðµ÷ Ú÷†Ö w÷ ¶ïû÷-®ï Û ÷5@Û ÷ šÙ÷ ¸‡S÷ Žï7€Á�ï÷ nãð5w”ð5wˆðµ€w|ðÅ€7œ^ï÷dÙRïÁ^Ù÷ ºäB÷-¢ÚNÙ &fÁ–Ú÷ ã÷  ä�€÷ bw:Á÷ \ó÷ fäÂï°ðÕ€ðÕ÷µïB÷ 0÷ Öâ÷ Läw¶ðµ€ 7ÚîÀàØ7ÌîwÄî÷ÒØÀî7 À7¶î‡ÂâÁ÷ ²Ûw\Á 6ÁªØ÷ ˜ï÷ âã÷ $‡%Á–Ø÷ hâ÷ îã÷ ÚãwxîððE÷fîðð2î µsõ d÷ ¬Øn÷ ðÖ ÁJØ÷ –ãwJfÁ<Ø÷ Þã÷ ”ãð5ð5€ ô5Ö ÁØ÷ ¸ãB÷ \ãæ,æÁØ÷ ¤ã7ð×wÀÁò×÷ ”ã÷ Jã&÷ L(‡)€ÁÚ×ðµÂÄ×ò d÷ ØÂ´í°0 ðÕ€ðÕ—%÷µ˜í Â’×Á˜×÷ À÷ .–%Áˆ×÷ ÔâÁ~×÷ Üâ÷ ÈâÞ †wxfÁh×÷ ã7X×µÂâÁ÷ PÚ‡w HèCô5€7(ò5³l÷$íÁ÷ �Á<Ñ H !Ð Ð&ÁTØ÷ Øà÷ ^â€PPÐÐJ©Ðø‰ÄHØÄ з <؇² xæÃt² ræÃnf¦Á÷ ‚Â`Ò  "°�ƒ‡¡ðµóµ ðµ€÷ Làðµ 3,ô5¡±¤‡óµwRóµô5w>Áó5ó5Áe÷5@€× ô5€ ÷ ôÕô5Áe÷ *ðwæëô5ó5óÕ€ð ðm.×0 0 ÷ †÷²ëððEððrë ðœÕ ó5ðŠëððìÖóµ óÕ€ð ðmÆÖ0 0 óµ 0 µ d· ¤Õ÷ Šà÷ Úë÷ ’àððÀ.ÕÀef÷ îØ÷ ÈØ÷%‚ÕæÕææÆå�Àh÷ *Ü÷ ZÚÆe – ƒ‡ÀNÈ ô5PHtt ÁÆÔw(à÷ <êæ$ÕÎm00,\TTl1DATADATADATADATADATADATADATAÕŽ ‚— ƒ÷%Ö— ƒfÁV ÷ ’×�· ôÔ7 ê1 ñ Ó÷5€ÚÕfÂâÁ]÷ f×�w`ôÖ 6f… ÷ .Á÷ Þ÷ ¦ßÁðµ !ðµ ðµp`†Á ðµp ƒÁ;Ò ÷ ×p ƒpÅ Ó…÷ îô5 -ô5@)ÁÖÓ÷ (ß7 Xé÷ èê‡÷ $ë ö7 Dé÷ Ôê‡÷ 0ê÷ ðÞ&fÁ¢Ó÷ zÝ÷ ß°·’Ó„wÔòwVóƒ‡ô5-÷ ØêÃåÀ%&÷ ÊêÀ¥!ô5ôUÁRÓ÷ ´ÞæÃææ÷  êÎ ûÖ ƒÃå Áä@÷ ÷à Û‡7 ¨è‡w äÄeW!€ƒÅå€÷ Å€AÁ Á ÷ 0íTÐÐÅ ü‡÷5âè÷5Úè÷5Òèô5Á÷ üì÷ Þð²èðÕˆB÷ ìû÷ †Ü¡‡±‡÷ èçÁîÓ÷ rÜÀe&Á„ÒÁe ÷ üÖ‡wPèÖ ‡€Á÷ èÖ‡w<è‡÷”ÓèwèÂè�¦·è÷ øÝwLÒÁþçÀe÷ ´Öf &w:ÒÁ4Ò÷ ‚Ý€ �ã‡Þ ᱇w ãÅDÓÁÒ& f wÂç÷ ÞÛ÷ RÄ  öÄÀèÑ& ff÷ ¸Û÷ ,ö� ÷ ªÛ– N ñ– õ„ !‚æpç¦í– ‡U ‡1±o†ÿ †ß–†5&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡œê¾<±ƒ…±VNTI ±VNSY”±VNSY[²gNSY[²hNSY?±y‹OV\±ÿ~TI\±CL2²VNCLó«@GÚ†hjTXC±¥zb©ø "$ææÒÔÖØÚÜÞàâä ­,­3X ­s,w „ø÷ žÀ†ó÷ Ôð÷ ^çÅvÀÚèÀ ÁPç÷ üD÷ FÀÁ>ç÷ êD÷ 4ÀÁ,ç÷ ØD÷ "Å!Í ÷ Ô‡ðµ ÀU%@eA÷ ¨D÷ ò†èÅe åU%ãÅîÍ (Í%?±÷%Nç÷ ˆ‡Ä÷ DD· :çÈ6çÄ èÁ÷ P?ç7 çÐ ÐÈçÙÅeÖÀ çÃÐ ÁVÉ €‚ Ée·Âæ· æÀ À Âxò‚b7 ŽæÂ5Àe@Â5` ÷5¶çÀeÂ5@Àe,Àe7`æ÷  ÷ ”÷  ×-’æ÷ šç÷5€†çh· Zæ÷8æÒý· 2æ÷eNæÀ,çÂò‚b÷5€Vç0Â5-ÁhÀ ƒBBbBdBd�à ‡wæÂ@Àm æ‡@b‡Àmæ†÷Eçæöåæææòå‚ÁW÷ œèÆeÀÿÿ7¼æÂ5€!÷5èæÁ¤åÂ5@Áe2Áe?ÁE?� ÁE€� � � � � @`ÀeÀE 7`på÷ ¾÷ Âææ=ÿˆÁä ÷ ïÀeÁÒ  ýÁÒ   ýÅ,D ÷ ¦‡÷ fPÄ ýõÄ aU%ñÅN!ÅeÍ = ÷ |÷‡ðµ ýDå=lì÷úåúå· öå÷ 8÷5 æ Á€ã÷ xî÷ þï1 ‡Áaa÷ Á<Ñ H !Ð ÷ BPPÐPP ‡÷ *@Àe"AÁå÷ ºè ‡ðµðµ€¡±‡&Ávå÷ úí÷ €ï€‡À^AÁå÷ öè†Á ÷ �pp0À^÷ ¸è±‡÷ ¶ÿ@ð dDÀe"æ8Þ >‡ðµúðµö7’û7Žû÷%ɪ†ûì×-‚ûK'wD×-vûJ'w8×-jû;'w,×-^û3&w ×-Rû3&w×-Fû2&w×-:û#&ÄÁn÷ Pæ‡w Hô÷ÿÿ"û& æŽä· û¦�÷ Úî7$ãw(ãÍ �÷ úì÷ pî& íÖ ¶#ê–%÷ äú�÷ ÖìóÖ ‡æ)Pxü¬Ä"â)Ä&Ôþ¬¯yó«@G, ­ˆxC±¥>­cŒb©øFü¬³°úp@,«1zB?±y‹D5¬!™:ÿ ”òˆL"ÿ Œòˆ #ÿ „òˆ„$ÿ |òˆz3ÿ tòšš%ÿ lòš¦&ÿ dò–†5&æ  †€mÎ ù æf À A N ‡�ã00,dTSQ§3eaek›’€ ö ÷–%‡6"Ü!4"Ü!8"rzt:"„€Ààðøüþÿ?ÿÀV"÷ jþ‡w °òŦáD„C†Ået÷ BE‡AÁ%ÿÿ÷ \ë÷ âìð5f&ðÕ"ðÅ€ð5ð50ð 0ð0ð ÷-2á‚âð5Ö µÄe¾Å áD€C‚Åen÷ hÿ‡×-fá÷5Xâ÷eZâÀª#÷ –ý÷5Bâ÷åDâ‡÷5@:âÁâ÷ žê÷ $ì7rŠþ&æÄe€Ã"÷ 䃄Áòá÷ vê7xfþ÷ ôëæ&Äe„Ã"÷ º÷5Üá„Äe°Ã"÷ ¤„ƒ‡w \ñÁZà÷ ºëÅJà÷5@¸á wrþDÄe€Ã"÷ rwxþ÷5ŽáDÄe°Ã"÷ VDÄe„Ã"÷ HæÞ!÷-àTáæ÷ 4Î ü– „TŒTŽT�5 �L’„5ŒÔm@á5Ž5e�5’‡ÁÀ÷ VýÁdf÷ ˆé÷ ë °c †0ÂeÁ÷ Žâ– %‡w ‚ð7 lý÷  ÁVÞ÷ Né7^ý÷5Xý÷–àÀ¬+÷ ü÷ RýÁBý÷ œê÷5¦àÁ4ý÷ ŠêÁ2ý÷ ‚ê÷5ŒàÁ&ý÷ rê7 ýÀh.÷ ÄûÀxßÀmnß  ƒÁV÷%jà ƒ÷ îáÄ2÷5ÔüÁ÷ tüL`Âè! ÷50àŠŠÊm$àŠÁà÷ bê÷‹žü ÷ ÷ Þ÷‹’üw�wè@? Á÷ u~õíß~@wpÞ÷ÆßrÞCÄa÷ ¾÷5Äß÷‹HüS@¤CwFÞ÷œßHÞÄa÷ ®÷ ž÷ l& ÷ ä„A~Ám¢ÞÁ w NÞ†wHÞ÷ H÷ Ä÷5lß*÷‹ðû'CwòÝ÷HßôÝÄa÷ Z÷5HßÁ ÷ ŽÁZ÷‹¾ûÁÞH · ÞA®B¤÷ ŠôÞ÷5ß÷rÝrÝÁòÞwðè÷5úÞ÷‹~ûfÅe†@ÄÁ÷ …u®õíìÝ®‡Á Á˜Þ÷ 5÷ . tj÷ T ‡Á ÷ ö ÈŒÝ7ˆÝ· ˆÝA~Bæ&Ó ÓlÞÓjÞKËm”Ý€&ÁDÞ÷ ¸ À ÀdÓ �÷ Ö S&„¶Ö j óE€ÃeÀà„ ƒ‡7 ÄúÀ(÷ pù 7 ’ú÷ ÞÄ÷ Ö÷5 Þ  ÷vú÷ ÂÄ÷ ºÁÞÝ÷ bæ÷5æÝ& ÷ NæÁŒ  Á wžÜ ÷5¼Ý � ÷ (æÁŒ  Á wzÜÀ‚ÜÁ÷ ä †Àÿÿ7pÜÀZÜ÷ ^ 7ÜD"âÛ÷5tÝÀFÜ÷ H 7ÜD"ÎÛ‡w øìÁöÛ÷ Vç7 Èù÷ ÷5HÝ÷¶ùÁØÛ÷ ‡ÅÆÛ÷ ¤ùC C÷ šó@w Ý ÷ ˆùw œù6w�ù2÷‹…ùÁÝÀÈÛ÷ @ Á w¾Û÷5âÜ ÁôÜÀ°Û÷ & Á w¦ÛÁ÷ >åð5  · Pù÷ V Á ÷ "ùu¦uf7 2ù÷ù÷ù@ ÷ úäð ðµ ·‘ûøA ÷ Þä÷6Üâø÷vÜÞøÄæÁ÷ –æ÷ Læ&÷ ºø@¢@÷‹¼ø  ÷-ÈÚÜò5 ÷ ’ø5®A¤5 ¤5~A5  ÷ : ÷ lø5¢5Ca÷ XøÀXøÁ¢ÀJøÁ÷ †À Á@ø÷  ÷ .ø5ž5÷ Bø÷ ò÷ @ ÷ øu®uœ|u~uw÷ ô÷ÂPÚÂHÚA ÷ Þã÷ Ú÷¦f ‚ ÷ ÖÂÿÿ÷ º÷µœµ€÷ ¨÷Áª÷Á ÷÷ b÷ ”÷7–÷7Œ÷÷‹–÷÷-¤ÙôÚ÷ v÷5`®5`~÷ f÷A¢A¤AA÷ ÁR÷÷ ‡Á ÷ 8÷u¦uf÷ L÷÷ "÷w ~ÙƒwxÙw pÙƒwjÙõµ‚÷ J‚÷ ôörœr÷ àö@œAž@A÷ ’‚€ì2 ‡2�÷ ,ä÷ ÐÀè!  ÷ ¢ö  ÷ ˜ö@ž@÷ ˆöw3Nõµ@÷ (4`N‡3N˜÷-ØÙ„Ø4N6À ÷ 4`N‡¡ ÀeÿŠÀ‡w Zé÷ ¤ÁTØ÷ ´ãÅDØ÷ (ð;w ”Ù ÷]žÙ"ö÷]\Øö÷Uö.÷5€ŠÙ*÷5ö&·öÁö÷ bãwöÁö÷ ªã÷ `ã7úõ÷5VÙÁðõ÷ :ãw äõÁàõ÷ ‚ã÷ 8ã7Öõ ÅÂ×Ä÷ ®&÷5ÙÄì!õ5Á ÷ N5¢ �Äè!õ5Á ÷ 05 7P`õ÷UZõ÷5ÎØõ ¢÷UFõà E   Äþÿ÷ 4÷5¦ØÄì!Á õ5Á ÷ Ò5¤ Äè!7SþôÁõ5Á ÷ ®5÷ H‡·‘Þô· X×÷-êÖ:Ø ÷ L×÷ ¾îõµ÷U¸ôA2÷ žà÷ $âð]¦ô ð]žô ÷ ®ô%w-¨ô!Ĥôô]ˆô ÷ ‚ôA ÷ fàf@÷ $Áø×÷ .‡Á uft ƒt÷5Â×PÄì!7S<ô÷  ‡·‘8ô· °Ö÷-BÖ’× ÷ ¤Ö÷ îõµ÷UôA 2÷ öß÷ |áð]þó ð]öó ÷ ô%w- ô!Äôô]àó ÷ ÚóA ÷ ¾ß¦@¤÷ |ÁP×÷ †‡Á u¦t ƒt‡ÁÁ Àæ! Á ý‡w žæÁœÕ÷ üà7 nó÷ ÷5îÖ÷\óÁ~Õ÷ ‡ÅlÕw ÂÖõµ3÷ <óA A÷ ,ß÷ ²àð5 õÕð÷ óðU Àe ÷ ó÷ íÈ ÷-öìóƒ÷îìóÈ · nÕ ‡÷U€fÖû÷ ÔìÈ õ÷-Êìäòñƒ÷ÂìÜòÈ ì· BÕé÷ ¬ò÷ "÷5*Ö÷ šò÷ ‡"´"Á Kþ!´þ!Á D÷ tÞæ ÷ ôß÷5tò ÁeÿÁEÿ  Wtüÿ÷ Fp÷ >òÀn22mh÷-¢ÕNÔ fÁ¨ÕÁmhÔ÷ r`�÷ Ø3n00,lTTl1DATADATADATADATADATADATADATA h2òln÷ À4hƒ‡@÷5pÕÀe”&Àeæ8÷5XÕ€&÷ ¾ÝÞ †‡ð5íðµ é÷5*Õ÷5*Õ ðµt\0ƒ ×÷ ßðµ@0 0 0 É÷ ÌÞf&æóµ ÀÀÓÁ÷ 7´Ó3ÀóÁ÷ 3 Á–Ó÷ ê7ŽÓ7¸Ôw(óµÁ ÷ Ý(Á÷ Æ33Á ÷ ¬4Àì3 t÷-öÒFÔ*ÁÀŠ÷ Ö×$‡& ó óÕ€Àe33 ó 3 ÁÁ À ÷ RÁöÒ€÷ H7ìÒF ÷5úÓó5€ÄÄeê!Á÷ ( @à÷ &ÁÀ^÷ NׇóµÀ÷ î3 ƒ3€Á÷ Ô3Á÷ Ä3 Àì3 ƒ„�÷ \Ýw þ@Àeæ8Þ L‡æÐïÂ5  Cµ @ðµ@<÷58Ó÷58ÓµN~÷5Ó"Â5€÷ ˆï%N®°c°c÷ Ý÷5øÒÂ5€ ÷ bïÎdï°c°c÷ ÚÜ ÷ Jï°c°c÷ ÆÜ– ²‡@`!‡‡÷ ‡‡Á @`†A@ � f÷ èî�÷ ÊîÀ ±@‡Áe? ¡ � � � � ‡¦BÂeÁ÷ Ô÷E0`Ò€‡À À ÷ 0œ<"  Áå ûÁå 4°Ø¡Œø†Á÷ ÄÓ4ÐØ‡ÀEÿÀ @ @ @ ‡±÷5€ Ò ÷5�î÷5ˆî¡‡À¶3÷ <íÀ�Ð%÷ ÀzÐ% &÷ DÚ‚ðµ "lÊmÖЇfÁPÐ÷ °ÛÀ@ÐÀe"Åe æ8Þ †…‡ðµøðµ€ôðµ€� ðµ ë÷ pÛ÷ LÛ&f ÷ ÖÙ�€÷ FÛòµ€ &� ÷ Ží€p°lò5 ÇðÅ ð5À÷ Û÷ öÚ&fð5÷ rÙ�€÷ âÚ&ð5� ÷ $í€ð5p°lw ÿp°lwÿÿ Bß–†5!€@@€@ € N@(B*D,:.¸"$�"¢"  "¤"~„Ž""~ ~x<°":”"³"p»"’"½"€D®"¦"¨"Šˆ"¶" ´" ¾"zXÊ"úÌ"üHæ4îRð "èTêxòÐìPôª"ö¬"ø6úÈ"üÆ"þÂ"Ä"÷5Ðßkw dïÅNÍm†ÞMeÀ`êÄxÞÄmxÞ !‚D7hÞ÷í†ÞbÞ`ðð•#÷ žê † ô�Á÷ á÷E|ßAà €¦ÁY÷ á‚ÁàÜ ¦÷ Ôç÷ Zé‚Àe�����Á÷ ŽûE€ ÷ ä7°Ý7ªÝЕÿÄ üÅ ÁÅ Á üÁ `�Àz&÷ Tú÷5ß÷m¾Ý¾Ý‡À†Ýðm²ÝðmÆÞ÷5àÞðmžÝ˜ðm²ÞšÁjÝwÊèw `î7 ¸ñ ÷5€ºÞÀÎÝ7ðû7ôûÅLéEbÄ®"ÌÃÜ!ÂÁ…0ûLPù÷ šÞÌU ÷ ÝÌU÷5xÞÌU÷5dÞÌU÷5`ÞÌU÷5LÞ ÀÝÀm\Ý ‡7 ݃À ÝÀmJ݇7 ö܃ŽÁ"÷ ¼fÄÊ" Ã"ÅÞÂÁ…0ûLPù…7<ûÀÎÜÀm Ý72û7 ,ûƒ7&û÷5 äÝ÷5ÜÝ÷šÜû÷5ÆÝ À˜ÜÀmÖÜ7û÷�Ü û÷mÈÜûæˆ"æ=ÿˆÄŽ" À ÜÀ À Àe>7Öú7`ÐúÀŠÜÁp `AW  ƒ÷%|ÝW ƒÁV÷ Á\ÜÀ÷ ŠùÁeÁm–úwŠúÁe w`€úÁeÅ5` d÷5€.ÝÔeÀÔm<ÜTÔüÛÔÜÛÔôÛÔîÛ   Ô&Ý÷% Ü Äš"ÔÝÔÝÔÝÄ "ÔðÛÔøÅ5€ôUþÿÌÐÜÌm�Û7ú÷åúÔmÚÛ÷ ¶ ÷ >Ô¨Û̦ÛÅ5÷¬Üô˜ÛômŽÛþÿ ÄÂ"÷5†Ü ž÷ ÔvÛ÷�zÛÀù÷�zÜ»ùæ&)Ä~÷ Ä„÷ ‡$Ì ‡÷5DÜnæ *7 ï7 (ïÀôÚ4Å "À 7ï÷æÚþÛ7 lù÷ ‚÷ Z÷5Ü÷Ü÷•OùÅ "÷¾ÚÔÛ7 Bù÷ X÷ 0÷ äÛÅ€"÷(ùÈî÷eÂî7 ù÷ 6÷ Åè$÷¦Ú¬î÷ ¨î7 ”Û7 ù÷ Å>%7 öø÷%¬Û÷àèø7 zîCDÄ5ÄEfÄmÊøÁ÷ LÄeÎ öÖ ê‡Å`ECfÓ Å ÄÔ& ÎÔÀÀ À Àeü&A÷ €Àe÷ Î ïÖ …âÅZÄ E'õE@CÃeæ÷5@>ø Ë% &ó%„(ó[qæÁÄe÷ ´Î ø– CÃe³Ö×-ÈÙ÷ ÐÚ÷5€¼Ú À”ÙÀå7¾÷ÀØ*÷ ìõ÷ à‡À¬÷Â$Ù� òµ@÷e”÷÷ R‡Ìe?ÌE?  ‡÷ øÛ÷EVÚÀöä÷ Ìå‡Áå÷ >Àe"÷ N݇ ñµ±ñµ€A÷ ’â@ñµ Àm$Ù¡‡fÁîÙ÷ râ�‡w Žé÷ 6÷ ü ÂhØÃbØÄ…”�  †w2÷· ¶ì÷ Ä õà ð÷÷žÙ‡÷ žì&ÀRäðÖ"ðæÎ"°4Îe00,tTSQ§3eaek›’°6ð•(ðÜ$÷ å÷ l€· Öö7 Zì‡÷µ@`ì ÷‹YìÂ2 ^‚2 b‡)2 P‡2 Zƒ÷-Ðײø ÷ÈתøÂÂ×Âe ÁwÀÚ‡€ìP· Žø·ˆøÂÂ÷ îë÷ pø€ìT· hø·bø  ÷ Ìë ÷ Nø7 @ø‡7 <øPƒ÷ ÿ·8øæN÷ 4øÎTŽ`ÂUÿ·øÂEÿ·øÂ‚ ‚g‚ ·úõ· ~ë&f €Á÷ ÔôÀm×ÂÁ  üˆ°ˆÀ÷ |À ãðÖ"ðæÎ"°4Îe°6ð•(ðÜ$÷ Æã÷ $�€Àí”÷p�Ö"‡f&÷ ®þ€�€ Á÷ ¢þ‡ ‡ææ)ÿˆ÷Šl÷‡`Á÷ ŒÙÀÖ"Á Á ý‡w vç7 F÷7 D÷Á÷ |7,÷÷Ö"$õÀð-÷ ó÷ úýÁÂ÷À*÷ ‚â7 ÷7 ÷÷øôx×÷år×À0âðèô ÷ ã‡w ç&÷ H„÷5n×÷ ‡ÂÆôÅòÕaC¢|w˜´ô· °ô ÷ ¸ö7÷¤ôžô÷žô×÷ ×· ¢ö,ÂŽôźÕaC`w|ô· xô ÷ ~ö÷lôfô÷fôàÖ÷ ÜÖ· höÅ · ÖéR”„ — Ö$÷f÷ ‚�òà ,&Àtáð2öðæÒ"°4Îe°6ð•(ðÜ$÷ 0â÷ Žþ€· üóÁúõÅÃ%‡ ËÃåÅÆÄ ÄU?„ àa·Ðó— Ö$‡÷ ·Âó‡÷ žüÂÖ"÷ `þ‡ÿ àä–†5év~ ­ø1±o†ÿ þ÷æà÷æw °ö÷5ç{7 ŒýÁ€ä÷ xï7\ý÷5Vý,÷%òå(÷ Vå×-ìæ‡÷5@àæÁÀæ÷ DïÀeÁö÷ Ôé†&Á¦æ÷ *ïÀe"Áò÷ ºé†�pÀ<ç÷ Šî7 xù7 ¨æ ÷ýý÷ýý7` ý&Å÷ € r € 7 fæí#ÁFæ÷ ÊîÀe"AÁå÷ Xé‡ðµðµ€÷ ¢îðµ Ám6å ‡À ÷ ÷ ŽäÀòå÷ Þ÷ @ ÷ H÷ ¶÷%òä÷5Fü÷5>üÀ÷50ü ÷ 0*Á°å÷ ð÷šåšå7’å ÷5ªå¤ÁeÿÁEÿ@` Á÷ øÁ € Àmbå7`å÷ \åÀð÷ 8ð‡Á`÷ ç÷E^å‡w òôÀðã÷ .æ|%Þ ‡÷ xûwzÅ<E BÒ Ò ú�Áa÷ Âæõ‡7 :å‡&÷ ¢�÷ „í7œþ÷€7 ð÷7 î÷w ää ÷°ãÞ÷÷ªãÚ÷Àmüã7Â÷7º÷7Ä÷w Àä ÷mŽã¸÷÷5Ää÷m¼äª÷·l¤÷÷  ÷÷œ÷–÷ò  €~Àm¸ã7z÷€lÀ 7z÷÷5Šä)€œÀmšã7b÷€l¢w bäÀm0ãÀmhäÀ 7T÷€®Àmvã7:÷€l¤À 7:÷w 8ä ò ¢ò ÷"÷$÷·ä· ä÷5$䷘䷚üã÷möö÷÷mòöþö‡w žó÷ÿÿºú& æäã· °ú¦�÷ 0î7zâw~âÍ �÷ Pì÷ Æí& íÖ ¶#ê–%÷ |ú�÷ ,ìóÖ ‡w Fó÷ 6÷ ü  âÃâÄ…”�  †wLú· nö÷ Ä õà ð÷8úVã‡÷ Vö&À îð8ðæ0°4Îe°6ð•(ð>÷ ¾î÷ l€· ðù7 ö‡÷µ@ö ÷‹öÂ2 ^‚2 b‡)2 P‡2 Zƒ÷-ˆáÌû ÷€áÄûÂzáÂe Áwx䇀ìP· ¨û·¢ûÂÂ÷ ¦õ÷ Šû€ìT· ‚û·|û  ÷ „õ ÷ hû7 Zû‡7 VûPƒ÷ ÿ·RûæN÷ NûÎTŽ`ÂUÿ·2ûÂEÿ·(û‚ ‚g‚ ·ù· 6õ&f €Á÷ ªÀm¼àÂÁ  üˆ°ˆÀ÷ |ÀÂìð8ðæ0°4Îe°6ð•(ð>÷ ~í÷ $�€Àí®úp�8‡f&÷ ®þ€�€ Á÷ ¢þ‡ ‡ææ)ÿˆ÷Іú‡`Á÷ DãÀ8Á Á ý‡w .ñ7 `ú7 ^úÁ÷ Î7Fú÷8>øÀ8$÷ hý÷ úýÁÂ,úÀ*÷ :ì7 *ú7 (ú÷ø0á÷å*áÀèëðø ÷ ¸ì‡w Îð&÷ H„÷5&á÷ ‡Âà÷ŪßaC¢|w˜Î÷· Ê÷ ÷ Òù7÷¾÷¸÷÷¸÷Öà÷ Òà· ¼ù,¨÷ÅrßaC`w–÷· ’÷ ÷ ˜ù÷†÷€÷÷€÷˜à÷ ”à· ‚ùÅ · ŽóR”„ — 8÷f÷ ‚�òà ,&À,ëðLùðæ4°4Îe°6ð•(ð>÷ èë÷ Žþ€· ÷ÁùÅÃ%‡ ËÃåÅÆÄ ÄU?„ àa·êö— 8‡÷ ·Üö‡÷ žüÂ8÷ `þ‡·Þø7 Øø÷€Ðø7 Êø7 Èø7 Æø€ÁvÞfj&�Ž÷ ~±‡÷ >è6¦vwRÞÂFÞ7BÞ÷‹Šø(Àe"ÁFàÁeB$$$ÀåÁe((ÁÞ·<Røw<Jø  w<@ø÷ ÷ ÷ ÷ .øw<$ø·‘"øð•#÷ Hê†`Á ÷ Èà÷ ò÷%òÞWñ5@ñ5 O€f &�F÷ tç6¦vwˆÝ7|Ý7 Ê÷÷ ¾÷*7<´÷&ð5@ ÷‹«÷÷ ª÷•Ÿ÷ ÀTßð•ð•÷ Öé‡÷ °é†`Á ÷ (à÷ „Þ ÷ Ê�Ž÷ hè·Ž ÷ R÷ fÞ ÷ ¬�÷ LèŽ7Š5÷wvþ÷ *÷ ÀìÞ7+D+P+\+j+`,„,´,~+/ˆ+þ+,à,˜+ -- -*-0--&----Î-È-//‚-Ž-¼-ˆ-w zë7 �ÿ7 ŽÿÀ()Á Á ýÀXÚð5· tÿð5· fÿð5€· ¦Û· Pÿð5· Fÿ÷ öýÁôÙ÷ úã÷ ìÀÚ÷ Tö÷ Tþ‡÷ ŽþÃå  ƒ7 @ôÀ%ÿ‡À%Éíƒ À ø 8)è÷5@Ûv÷ ^þÃåÂ)òµ Dòµ €lÀm4ÚÀå7 þ÷ îýÁ)÷ ¾þW, ­W,s, · ®þ÷%¨þ÷ þ÷% ˜þ÷ T÷ †þ W, ­ W,,÷ &Ù÷ d÷ ‚÷„ à ʇÁ[Â>Û‚`÷ .Ü÷5ŒÚ÷ hý7þ÷ `ýÃåÄmþÀþýÀE€ÿ ‚À Å)ø F)à ç‡wæ7 2ó‡÷ lý&@A÷ 8‡ÀmPÙ€et÷ Òs÷ LýáÀåk÷ ÀáÀåg÷ ´&÷ .ý€e^÷ ¦&÷ ý€eáÀåT÷ ˆ÷ æQ÷ ~÷ ÜáÀåI÷ ¶&÷ òü€e&÷ 4Ø'÷ zýÀ€ýÁxý÷ Ô÷ÀtýÀeÁjýÁe? ¡ � � � � ÁeÁE� � � ‚ B B B �P÷ ˜÷€÷ ÷ f&÷ ˆü€e ÷ ö÷ T&÷ vü€eáÀåÃåæ’#÷5€ÊüÎH"À5ÿ � &¶×Âe Á÷ ´Ú€^÷ ¦÷ v&€÷ Þó÷ üÃå€eÀå7~ü‡÷ ü& Ãåõµ @A÷ ʇÀmâ×€eÀå7Nü‡ÁÒ×Ámv×÷ ÐöÁ€×÷‹�ëÁx×� Ám´×Àew²ö¦)‚·üÆå0·&ü÷ ^ûà  ‚À ø h)à õwú‡ Šd2Ê J ‡J ŠD,�ŠDb@ŠT&æ²0Ò ¦ÂÈÖÂe ÁH÷ ÆÙ‚ â æÜ(�€ €€ J Þ Ò € · ¤ûƒ‡· ‚û‡w„‡÷ Ž÷ Æ÷ Àúà ÁjÖ1 ï‚AÀ À `A÷ ~÷ º&÷ Üú€e÷ ÔúÃå"Ó áÊ倷 (ûÓ†–%wLþ·Ô7Š�ê÷5„×ñµ€·ŠmêÀ) P ý‡÷ jÀe÷ lÚv‡ÂðÕðµ ¦÷ ´ß‚@ñ5 ÀmDÖñµ  ‡À4ÖÁ¨Õñ5@(‡¡ñµ€ ñµ fA ÷ Rú@€e±‡÷ �ú47 ¸ï÷ ²ù#‡÷ îù æ¤ï÷ àùÀE€ÿ ÷ Òù ù¬÷ Èù sN Ö 7 |ï÷ vù‡7 rï÷ lù؆w÷mdï`ï·ã\ï·ZïƒwÞûwü ׂ`Á÷ ø×¦÷ ^÷ ÌÒ*‡Ö  ñµ#ñµ€A÷ ¨Þñ5ñ5 ñ5@ @@ñµ ÀmÕ‚‡÷ ù7šù÷ ù7”ùÃå÷ ”ù ÷%1±‚ù÷%o†|ù÷mÐÕtùÀXÔÁ)‡Ö ÄJÔ… Á÷ Þ÷ ¢ßÁðµ ðµ ðµp`Å ê‡Å ÔÂZ‚µ,ùµ,õò €ÀÕÀÕ‡· ù÷%ù÷úø÷%ôø÷ ìø7Á¬ë1Ô÷e¢ë×-žë÷ Ìø(7Îø%÷%Âø ÷ ºø· ´ø÷ ®øÀÅ€÷%¤ø7¤ø÷%–øÁw`’ø÷% „ø7†ø‡÷ ø@‡w ÀëÀÆæð5bwD÷%ÛwBÄôÛ÷ Þö7Šóî÷5öÛ·ŠçîÀÚÅ)ÍÄ7jÿ÷5dÿÍÄU`ÍíŒÚÄEÿÄQÀŒ÷ òÍ÷5¬ÛÍUÕm¼ÚÕÕ Õ Õ÷ üÙ ó 7äñõE€ôÿÕÚñ ÕÕ ÷,XÛyÀ�÷ ”5þÿ÷5PÛ ÷ À�÷ |Àe5þÿ÷5ÂþcÁ÷  ã÷5@,Û÷ ŒÙÂ)p ÁeÁEp� � � r÷ &rPÁ Á ý õmÆÙôÿ÷5ÖÚ4Á ÷5Xþ,÷ :ã÷5@ÆÚ÷ &ÙÂ)p ÁeÁEp� � � ÁrP÷ ¾ÁrPÁ Á ý õm\Ùôÿ÷ $ÃÅ)÷ ´ÃA÷ ÊâÀeŒ÷ Š÷ føÄeà ð×-BÚ.‡Ã÷ €÷ <Ú'÷ v÷5ªýÃ÷5ÚDþÿÃ÷ RDöÿ÷ ”à ÷ B÷5èÙ÷ €Ã ÷ .÷5ÒÙÃe÷ ÷5ÂÙ7гìÀLØtpÀ„÷ ä÷5¢ÙÀ°÷ Ò7 ýÀ,Ø÷ jô÷ î ó5ÀÀ  áÀå7ðÀå7ðÁlwôïÁ ÷ ÈáÀeŒ÷ ˆ7Þïó5ó5ó5÷lÀï·à¼ï÷l´ï·à°ï÷5Ù÷˜üºïÁ÷ �&Ĉü·ŠïëÁ÷ î÷evü7ŠÝë„EªÁ÷ dE£Àb×nÀ€÷ úÀV×÷ ”ó÷5°Ø7Š¡ë÷ ÁwZï÷PïÁ&÷ EñÀ$×÷ bó÷5~ØZÅ<EVDÔ ú�ÀüÖ0%õ0%òÔ5ÁåÀe"÷ ZÛ.‡ðµ€ãðµß%ðµ ÌmB× l÷ . ÷5Ø7Š ëô þÿ·ŠÿêæÀ÷ öÃeÎ øÖ õU€¹÷5@ì×Ì%J©ô%ø‰ñÁ`÷ fÙë‡ÀmVÖ&÷ 0àÀmÌÖ‚€e‡ÄeA÷ Âõà ø‡A÷ àÁ) ý óµ ÁŽÖ‡fEÃ÷ ºÿ…‡@ÀmtÖ5À @ @ @ 5�‡÷5B׿ÃÎÕ÷5ÂúÕ˜ÕšõíèÕþÿÍœÕm4ÖÕžÕ ÷, ×5 þÿƒ‡fEÃ÷ Jÿ…‡÷5ìÖ& ÷ Vß7ŠÓéð5€·ŠÇ逇ÁmâÕÁ A A A ‡00,„TSQ§3eaek›’ ­,­3X ­s,w Þë÷5>Ü÷•-ï÷å²ò7 ¸ÿ7 ºÿ7 ¸ÿ7 ¶ÿÄ)÷ h7 ÿl 7–ÿ&fEjEA÷ jä÷ `äAó�� "$Á ûì&õ5÷ `·eNÿáÖ ÀôF÷ (ä&÷í¶Û8ÿÂ)Òà÷ ÚòE€þÿœ÷ RÒ ÀeÐ 2…Dm&÷ à€œÀe …¦÷ ÊÙ÷ 8à Ð Dm&€÷ R€ì€„÷ RÖ €¸Ö ‡ÁhwºÜ÷ ¬þ¦Ä )À÷ Hw˜þÄ$)À÷ 8wŒþ‚÷å~þ÷å|þ€ð5 LÄfþÄíÞÚ&÷ <Å)€÷ b€Â)     Ä2þÃÅ)÷ À)ÐàPHìþÿ�  Ðþ ÷ ÜØÐöýÐøýPPÐèý„ÃZÚÅ)÷ ÊwÒþ …Dm&÷  Ä$)÷ z7°ýfEjEÁhw¬ÛA÷ €â÷ vâAï�� "$Á ûèõ5 ‚µ,µ,7lVýÖÖ €æVý÷HýPý÷ V·Hý…€ @mÀeÁ,ý÷ ¸÷w þ Äý÷ òײüÿ ÒrTÒ,` ÃrÙÅ)wâÅ)œœu�÷ Àuõ‚ u u ÷ œ×C ÃeÃEõƒ ƒ ƒ ÄP7¤üõ€5 5 5 õ�üĆüÃwn&Áð÷ ÷€Àe&Ábü÷ òö€Àe÷ æö‡&÷ l �å‡ÁšØ÷ áÀeÁå÷ ªÛ‡‡Áhw(ÚÁEÿ�    ‡f ÄeA÷ �öà ø�‡A*÷ ÔàœÀe5"5,$Á ö‡ ò  ð¶û‡ð®û‡&Àšî°-ÔÀåÀ ø7 „îÔÄmô×ÖÔÀe &Árû÷ ö€Àmä× ö€‡ dêì  w Øö÷ PÀ ÀBÀå74ûÀÊç÷ ïÅpÍ5@2À¼ç÷ ïð•#÷ ò †`Á ÷ �èÍE@ôµ 7�"ðú÷èúæ|ÿˆ7 Œ÷Òú÷5 Äæ÷Äú÷ J÷ >Àî÷ ‚À,÷ zÍ5@ ôµ÷žúæ|ÿˆ÷ øw,w öÀåÀeæ8Þ ‡ðµúðµ ö0ðµ€0 ÷ Hðê‡w Úõ÷ Ú÷5@6æ)ÀÌä÷ Ä÷ Â÷5"ææ8À¬äÀeÞ ‡ðµ÷ vî÷ üï0ì0 îæ¤!Þ ‡÷ †ûÀräð d Âe¦¦ dÁœ÷ ^çž÷5@ºå÷ ‡÷5´å À:äð d÷¨ù÷¤ùæ|ÿˆÁò$÷ ÂÁŽÉ ÷ ¤ç÷~ùæ|ÿˆ‡÷ Øí7œRø€7 Dø7 Bøw 8å ÷ä2ø÷þã.øÀmPä7ø7ø7øw å ÷mâã ø÷5å÷måþ÷·lø÷÷ ô÷÷ð÷ê÷ò  €~Àm ä7Î÷€lÀ 7Î÷÷5Þä)€œÀmîã7¶÷€l¢w ¶äÀm„ãÀm¼äÀ 7¨÷€®ÀmÊã7Ž÷€l¤À 7Ž÷w Œä ò ¢ò ÷v÷x÷÷mj÷v÷÷mf÷r÷‡÷ žø Àß”ø· �øÀ å÷ xï †ð¥öÿ*± `Á ÷ æå7hø7bø‡÷ ºÿ&÷ ´ÿÀ€U‡w Àó÷ÿÿFø& æä· <ø¦�÷ Rî7œâw âÍ �÷ rì÷ èí& íÖ ¶#ê–%÷ ø�÷ NìóÖ ‡·ú÷7 ô÷÷€ì÷7 æ÷7 ä÷7 â÷€ÁBâfj&�Ž÷ ~±‡÷ ì6¦vwâÂâ7â÷‹¦÷(Àe"ÁäÁeB$$$ÀåÁe((ÁÜá·<n÷w<f÷  w<\÷÷ ÷ ÷ ÷ J÷w<@÷·‘>÷ð•#÷ î†`Á ÷ ”ä÷ ò÷%¾âWñ5@ñ5 O€f &�F÷ @ë6¦vwTá7Há7 Øö÷ Úö*7<Ðö&ð5@ ÷‹Çö÷ ª÷•»ö À ãð•ð•÷ ¢í‡÷ |í†`Á ÷ ôã÷ „Þ ÷ Ê�Ž÷ 4ì·Ž ÷ R÷ fÞ ÷ ¬�÷ ìŽ7ŠQöwvþ÷ 00,ŒTTl1DATADATADATADATADATADATADATAFö À¸â7ùÂ�Ê%Á *÷ ,ùÁìÓ ÷ âÞ÷5bÖÁUwpû ÁÐÓ=÷ ÂÞÁEÿíÁ5ÁUÃâÓBÁ@ƒ@ÁP+ÅZ2ÄÂ0%A5ÒR w=þÿºÓƒ U%Õ òeþÿò üÿU%Õ Ä èò üÿÁí*— �%† Ò&.ù÷ ˆøÂ0%ÊÎÔÁM-÷ xøÂ0%À¦Ô÷ TÁ -÷ bøÂ0%ÀŒÔ÷ >Á,-÷ LøÂ0%÷5�Õ'ÀˆÔ÷ "÷†úˆú÷‚ú„ú÷‚ú„ú÷~ú€ú7 vú7 tú7 fú7 dúÀRÔ÷ òÂ0%Ò|*Êx*Á‹-÷ ô÷À4Ô÷ ÔÁj-÷ â÷÷5*Õ ÷-,ú2ú ÷-&ú,ú÷-úú÷-úúÂ0%÷5üÔ Ò|*Ê€*Á¸+÷ œ÷Ê|*Á—+÷ Ž÷ÊòÓŠÊm¨Ó÷5ÌÔ Ò ÊÞÓŠÊm–ÓÁN+÷ h÷Á1+÷ ^÷÷5¦ÔÒdÓÊ|ÔÊ ÷5¬ùÊpÔ÷ ÒöÁÞ-÷ 4÷÷5”ù ÒVÔÊTÔ÷ ¶öÁ.÷ ÷‡Êt*Á ÷ $ùwXù÷mTùZùw Tù÷mHùNù‡¦Á´Ñ ÷ ªÜÀe‚Á Á ýÖ ‡×-Ó÷ ÈÿÁl,÷ ²öÁ¦,÷ ªöÁŠ,÷ ¢ö÷þø÷5 äÓ÷ðøÀž1÷ ªï‡w hãÀfÒ÷ ^îÂ0%÷-ZÒªÓ÷ÐÒ˜æÒ”æÊšæ²"þÿ †ò‚æþÿʆæ²"þÿ†Ò   ÷ ÒõÒ Ê˜øÃ¨çÊmŽøÃ üÊ%\Ê\Ò ÀúÑ ÷5XÓÁ",÷ ö‡Ò ÷-âÑ2Ó÷XÒ"æÒæÊ$æ²"þÿÒ   ÷ jõÒ Á<,÷ Êõ‡-AC,-AL,-CM,€00,”TSQ§3eaek›’-CP,-DA, -EA,@-FP,-HD,-PI,@-PM,-PR,-SE, -SL,€-TR,-MU,-ID,%N*** Root segment: %2R%3N*** Segment: %2R%3NR-O mem limits: %P %P %P %U.%NR-O mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NR/W mem limits: %P %P %P %U.%NR/W mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NDisk blk limits: %P %P %P %U.%NDisk blk limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%N%2NMemory allocation synopsis:%2NSection%44STitle Ident File%N-------%44S----- ----- ----%N%2R:(%VA%VA%VA%VA%VA%VA %P %P %U.%N%30S%P %P %U. %2R %2R %X%N%3NGlobal symbols:%2N%F) w 0è÷ û×-’×÷�ìBøÀ× ÁÙ*÷- ×\ØÁ¾*÷~×Fë÷ ûÁîÖñ5-ÁP+Ò.ëÊ4ë²"þÿÒ  ÷ |ú÷5.ØÁp+Ò ÒëÊë²"þÿÒ  ÷ Tú÷ ºú÷- Öð×÷-æêèêÒÔêÊÚêÁí*÷ 0ú÷5â× Á +Ò Ò¸êʾê÷ ú÷ |ú÷5Ä×OÁRÖñµ@Iñ5JŠ@JŠ@¡Ò   ÀeÿŠÀÀ `÷ ÂùÁ³+÷5p×#ÁþÕÒ ñ5JšŠ@¤J˜Š@ž¡Ò   ÀeÿŠÀÀ `÷ tùÁÓ+÷ ÖùÁ,÷ ÎùÁ7,÷ ÆùÁW,÷ ¾ùÀœÕ÷5×Àe”&Àeæ8÷5êÖ€c&÷ PßÞ [‡ðµ÷ :ßÂ0%÷ æø·,üÿb×â÷ ˜w´û ·°ûw®ûÁµ Á5 òm¦Õþÿ7Šû  ·†û’Áw,7 ‚ûð ·Šxûðµðµ ·Šeû÷ ùæž!Þ ‡ÀÖÔ÷ rùÁBû÷ ¬Þ÷ 2àð4û0ìð(û—÷ ä‡w ®åŪ1ÄJ’ p5ÊRaU%U%Ä óú%$$þÿò øÿòÏ,þÿ² üÿ‡„þÿô•)‡w dåF�… Â0%÷$¾ú;Ò¶úÁ¾úÁµ Á5 Á5€ €Ážú÷ túÁm˜úRòmžÔþÿÊ÷‹ŒúË ’÷‹�ú÷bpúÀøÓð5€  ÁîÕ÷ š÷Á›,÷ ð÷Ó Å ½‡w ÌäÀÂÓ7 ,ús&æ*éÎåÖ-Öô�÷éÎôÁ¶,÷ º÷€Àe"æ8÷ Ú÷úú÷öùú÷òèüùÅ”*Ć*Þ ••UÔäù÷íàùÜù�Þ ÷ „ü‡÷ Îùù÷ Æù ÷¶ùÀùæ÷mºù¶ùô²ùþÿæpĦù”*ņ*÷”èšùÃ0%Í Þ ‡÷ <‡¦Â÷ Öøƒ‚Õ ¢(â î· ôÄ ÷ fùç÷ ¾öÛ÷ ¸ö– ÷ Hù¢– ‡¡ðµðµ€ðµ€±‡w ¶ãÄ"èÄíÒóÄèÄå Á èaÁ ý·ùÃúøƒà�7ôø÷ìøôø  ÁìøÁíâç�‚ ú‚ ·Òø÷Ìø‡RO,RW,€D,I,@GBL,LCL, REL,ABS,OVR,CON,SAV,$$$,%2NFile: %X Title: %2R Ident: %2R%N <%2R>: %P %P %P %U.%N >>>>>>>>>>>> Undefined reference: %2R%2N%7S ,R+,T,T,T,,†+ˆ+š+œ+ž+ˆ+,ˆ+Z,w ôéÄèØô5€wúÀâØ÷ Úô÷ <÷ ¾õ‡÷ øõÃå ƒ À ø ò*ðÄz*Å÷ ØõÅ ûÃåÁx*Bœ— J‚ ÀˆØú +à 燇Àe÷ òÜ<‡Áx*wþ‡‡ñµ Àe"÷ ÔÜ ‡ðµ÷ fñµæêÞ ‡÷-:؈ÙðµõÖ Ö Àx*÷ ‡÷µˆþÁØñ5‡‡%ÂÚ‚`Á÷ òÚÖ Äâ×&Ž Á÷ ´á÷ :ãÁðµðµ p`Î îÖ ‡7 >í‡Àe"÷ ܆Àx*÷ ˆ‡÷ lûÁžÙ÷ JûÁ„×R RRR Á„*÷ Œû‡f&÷ >û÷ÔìÐý€Žðµ÷ ,á‚�÷ Øú ’J÷ ‚úÁª*÷-DÙVø ×-Pø¯÷ Pøw4û·Š;ø‡&Áª*÷‹/ø÷ û÷ Öú÷lìhý€ ÁÄ*÷ û‡Áª*&÷‹ø÷ ðúÂ>ý÷ ò÷Áî*÷ ÞúÂ0%€÷ ˆü· Ú÷·ý÷ ý÷ ~ú÷ìý‡t%òº~V&"&L'L'L'L'F'f&’&”&–&˜&’&J'–&–&w ï÷ þ÷ îú‡÷ (ûÃå ƒ À ø Ú%ðĪ%Å÷ ûÅ ûÃåÁ¨%Bœ— ‚ À¸Ýú è%à ç‡Âºß‚`Á÷ ¦à7Hÿ7Dÿ÷•Gÿw:ÿw6ÿ×-ìÝ÷ ª‡‡‡‡Â´%RRBœÂÅ×ÿ·�ÿ÷ 6ÛG‡Dœ ŵŵ€÷ çŵ ÂmªÝ·ØþÄ &ÅÅmÿwÑÎþŵ€·”ÞÞ †7 ŒÞ÷Å€¶þ7 €Þðµ€ððµìðµ ÷m`Ý�þ00,œTTl1DATADATADATADATADATADATADATA÷-ÞÜ,Þá– 7Š…þÁ´% ‡Ö ‡‡7 Fò‡À�Û°p°÷ °é†`Á÷ ˜ß‡Àhœ%ÁÁ ý ÷5 àÝÊÁ–%ÂÙw fíÅpÍ5@bÍ5@VÀÀ%Á\ÞPHPJPLPNPPPVPXPZP\Pœ^ŠÍ5ÈÕÀeÐÜÐ�ÜŠ@÷ 2è†ÍE@@3ÀÖÚ÷ Påð•#÷ \è7P¬ý †ÍE@`Á ÷ ÒÞ÷ 6ÿÀt(÷ þøÀšÚ÷ æç‡À–ÁÀ%÷ Èè À´ÝÍ5÷ °è÷ Äç‡w ’ìæ¤!Þ ‡À~Ûð5€ø÷ jýõ‡ù¬sNÿ  úx|1±o†  ­,  ­s, ­,ÆÎÖÞæ  ­3X     ­s, ­ø�wµW^"b"~"ê"ò"w èùÀìô÷ :òð•#÷ Fõ†`Á ÷ Æë‡7bŠÿ÷5„ÿ÷50ê÷5tÿ×- é÷U ê÷UüéÁÞé÷ 2ôÄZTTÔ ÀNÔ ÷ PèÔJèÔHèÔÁ¢é÷ &òÀe"Áø÷ ¶ìj‡÷5ÿôm¬èþÿ4Š7 \þ÷5êþ ÷5‚é)Ã÷ &÷ D· <þ÷5 jéTTÔÕR÷5¶þôÕ ÿÿÔ•T÷ ×-:è÷ ÷ dÄZ÷ ú÷ Ø÷ øÁ,Â÷ ÷50é×-è÷ ÌÁâè÷ àò×-öç÷ ÊÁ.Â÷ ÎÀvó÷ –ó‡Âb÷ bêÄZÔÔCÃetÃ5Á÷ ñÁ”A ñ û1,÷1,ëòÔ œŠ÷5Ôýôm€çþÿôÅ üÿ ÷ ÌðŒ÷ ÌÄ%Ì ‚æ^!ÁZBà÷ („‡ÁD@Àe÷ 2ëwöü7 üDÄet=Ãj÷ xð+&  ÷ hð+Œ�÷ ^ð÷•ìûÎðµw ¨ü ÀFÁ Î÷• ÀûÁT ÷  Â ÷ ˜‚÷ ’÷e†ûÁÁ~ç÷ |ñÀìwnw ÷ÅæCÄ®TŒÌÌEoÿÌU`ÌÍ5Ó ÔTÔTÓ ÜÔæÀ ""Á Ò ­Ê,÷ ¨ï<ŒþÿÎ í– Ó ÔÔÀ ""w-çÒ­Ò3XJ�ÄçÁ¢Â ÷ æÂa÷ ÜÁÂÂ&!†Âå÷ Æ÷-h叿÷ ØæÀ”Á˜ÂD�‘ˆ‰Á‚ ÷ ˜Â÷ �õµ4ÃôS�A÷ øî{ÂR�ÁJ�33ómHå3 3Áè ÷ <Â÷ 4Â÷ ,ÁÂ÷ ‡@÷5 æ ÀeæVÂLÞ ‚‡¦÷ ÷Àe”&€&÷ fî÷ ö‡& ðµ÷ Jîðµ Ö #w~úÃ0Á  ýóµ€óÅ 3 3 �4Šóµ@ ÷5òú÷ Xúw6Á ô•÷ æíð5ó÷ 8úð÷5Äú÷5\å÷5 Tå÷ ü~‡@Àe"æVÂRÞ ‚t‡¦4Šðµ€÷-Øùˆãð÷ ˆíðµ  ðÅ ôÕ7, °ùÝðµÙÂeÁ”A ñ û±"ø±,È󔔌ÒÔÅ“ÿÔ•÷5ú óµ ó äm¶ãäE %óµ ÷ ã÷5 ˆä÷5€äëôìþÿ÷ D˜÷ ðâúô5üÿöÊ5Ê5 ðôUüÿì‡Á”Añ ûTTÔ•@Ô• f÷ ø�í‡Á÷  7zùÀÁæÂ ýÁàÂ÷ æÀˆ#÷ ÒÀ’!÷ ʇw tóÀjâ7`ù7\ùÀbâ÷ @wRùÁú ÷ ¨÷ ²æ&Þ I‡÷ ä†wB÷  7 (ù ñ÷ ÚìÄêø÷ ÷ ú  7 ùß÷ î÷ öø÷ ˜�ùÔ÷ äø÷ †�÷ ~�Àå7œøW!i‚Å gý êÁˆøBà÷ ·‡wÆ÷ 8@÷ ’€÷ ŒÀ÷ œwª÷ Ú@ ñ5 ñ5 Åîá@a÷ \@@a÷ R¦ÂPჃ ‚·$øÒ à ú&€÷ .€÷ @÷ À÷ 0w>÷ ,w6÷ ÷ ¸�÷ Ø÷÷ Å ÷ Å úwÂúâ‚`Á÷ æãÁÁePó ±PPÔЕÐ Ä%Ð ‚æZ!ÁXBà÷ „‡À¨ìp°÷  í†`Á÷ ˆã�`‡w ~ñÀtàÀeæ8Þ ‡ðµúðµ ö0ðµ€0 ÷ ®ëê‡Ä8à&Ž Á÷ ê÷ �ëÁðµðµ p`Î îÖ ‡�À�À‡Ï ÷ ¤÷ Èö�‡&÷ –÷ ºöÎ úÖ ‡Á®ö÷ ØÿÁ ü‡÷ ¸÷ ¾ÿ7îõ÷ ¬÷ ²ÿ7äõ÷å„öÁ0‡&÷ ÖÿÀžßÀe÷ ä=‡wjö Ã’ßðµ  ƒwNö¦÷ Pé‚€‡&÷ ”ÿ÷ BÝ ‡Ö   ðµðµ€÷ éðµ Ám²ß f÷ B�€‡w(þ ×-€ß&÷ æèŽ&Œ÷ ÚèÁmvß�e€‡÷ >ÿ÷ Ò÷å²õ@lñ5 ñ5 ÀmJß÷ ºþÀ÷ ¤ÿ@÷ ®þÀ÷ ¾þ‡w ¬ï÷ÿÿ õ& æòß· –õ¦�÷ >ê7ˆÞwŒÞÍ �÷ ^è÷ Ôé& íÖ ¶#ê–%÷ bõ�÷ :èóÖ ‡÷ Tõ ÀßJõ· FõÀLà÷ ºê †ð¥öÿ*± `Á ÷ (á7õ7õ‡÷ ºÿ&÷ ´ÿÀ€U‡·õ7 õ÷€øô7 òô7 ðô7 îô€ÁÜÝfj&�Ž÷ ~±‡÷ ¤ç6¦vw¸Ý¬Ý7¨Ý÷‹²ô(Àe"Á¬ßÁeB$$$ÀåÁe((ÁvÝ·<zôw<rô  w<hô÷ ÷ ÷ ÷ Vôw<Lô·‘Jôð•#÷ ®é†`Á ÷ .à÷ ò÷%XÞWñ5@ñ5 O€f &�F÷ Úæ6¦vwîÜ7âÜ7 æó÷ æó*7<Üó&ð5@ ÷‹Óó÷ ª÷•Çó 00,¤TSQ§3eaek›’ÀºÞð•ð•÷ <é‡÷ é†`Á ÷ Žß÷ „Þ ÷ Ê�Ž÷ Îç·Ž ÷ R÷ fÞ ÷ ¬�÷ ²çŽ7Š]ówvþ÷ Ró ÀRÞ7ó‡7 2óÀ&ÜÁ4Þ÷ 8åÁÜÀ(Þ‡÷‹óÀÞ Â ÷ ¢è‡�÷ ¨çw øìÁ�� Á EÅå‚EÁ ÷ J3Á÷ ÁÅ÷ œåÅ ý‡À¬Û 0 � Á Á À*÷ Üç‡w ’ìžÜÁŒÛ& f wˆò÷ Xå÷ RÄ  öÄÀbÛ& ff÷ 2å÷ ,ö� ÷ $å– N ñ– õ„ !‚æ6ò¦í– ‡U ‡€4)îV) ÿ Šæ–†5RO€'5RW€'5SV€'5'BÁ Á ýõÿÿ.õ(+õõ*+ õ &• H’ � ¢ûƒ€ ¬ÿÿ;ö ôàwà途 — ; — !— ,— :ò&À u@à5€Åe,‡ ¤RN¢Oõ€þÿ¢WE€ ”‡5& ”— , — ! — [Ž ó— ]ðÎ îÎ ìÖ )@íÀ 55 ,õÿÿ.@÷ LÚ‡õü4÷ VÏõ5È•f ¦ÂÔ÷ .Ú‚�ð5€ƒ@‡– ÁŠw¶Ð· ÏwÀþ· Ïw^ÿ ¢-õ€þÿЋ¤Sæ¤Vã”Íÿÿ‡÷ þÙ‡w tÞ÷ ‡÷ –Ú‡w dÞÁeB$&w¶Ùw à„ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ °E�€Aa×$Ò±œÿÿ‡f÷ $Ù†Â*Á÷ rÑ�ÁeÁE�  Á ý‡Á,Á*Á(÷ ÁeÁ(÷ ð ÁeRRR‡÷ ²×¦vÁ"Ðð pbÁeBÂeRRRRR R RÞ �‡Á÷ XÿðªÍ&Á˜÷50ÏÁe ÷ N×ð"ð•�ppplðe5lÂet²°”°–· ö͇·vË÷ Špðæ|5°4Îe°6ð•(ð€5÷ JÚ÷ xH‡· ìη ä··0Ë÷ Hð²þ pðæ|5°4Îe°6ð•(ð€5÷ öÙ÷ ,䇷 ¤Î· œÎ‡�7 bþwœ\þ· XþÁeÀ‚·‡ææ)ÿˆwŒ@þ †7 >þ±� ÁI÷ ¸Ï‡Õ ÁAæZ”� ‡Ž ‚µ�þÿ”� ‡Ž ‚µ�ÿÿ”Ö 5Â^ÂVÈ‹Õÿÿ+& È¥+È¥-Î € Ê Ö  U÷ œÿÀ ÷ Êÿ‡ �f  ÷ *ýuüÿ ‡�÷ ýuþÿ‡�÷ ýü†Ö Â¥ Â¥ ”ø‡È¥ È¥ € ø‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡÷ &÷ &÷ �’•’•€‡@Á(÷ Bf€  Àe ÀeÉÿÀe Àe ‡„7«7É7è78 8H8]8�8¨8Î8ì89/9]9{9«9Ø9 :;:[:ˆ:²:ç:;@;_;‡;©;Í;ñ;<+3>X>x>�>Æ>ò>?„7£7À7Û78<8q8ž8Ð8÷8,9I9k9�9¬9â9ù9":>:e:‚:±:Ù:;>;p;˜;Æ;ò;X>ˆ>ª>Ü>?&?]?’?Ê?ö?-@ -- *DIAG*- -- *FATAL*-  DÐÁCÐ!n‚×  ƒÀþˆ  Á`ÁêÅ¢Ëõµƒ ¦Áº~÷ FÀè÷ tþ‚À"6× ‡À.6Áë”þá‹æ<7!7ƒÎD7Þ Ä D5”þÀŽÁè‡Æå €&æ?ÿˆ,-fW >5‡W E5ƒW ¾s‡W Ås ƒW !€00,¬TTl1DATADATADATADATADATADATADATA ‡W 8€ƒW >€‡W E€‚�W ¡Œ ‡W ¸ŒøƒW ¾Œ‡W ÅŒòƒÖ $|³Æe ‡ÿ ÆÜº0?ÿ ¾ÜÌH@&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡Illegal Get Command Line error code%2NCommand syntax error%2N%VA%2NRequired input file missing%2NIllegal switch%2N%VA%2NNo dynamic storage available%2NIllegal error-severity code %P %P %P%2NCommand I/O error%2NIndirect file open failure%2N%VA%2NIndirect command syntax error%2N%VA%2NIndirect file depth exceeded%2N%VA%2NI/O error on input file %X%2NOpen failure on file %X%2NSearch stack overflow on segment %2R%2NPass control stack overflow at segment %2R%2NFile %X has illegal format%2NModule %2R ambiguously defines P-section %2R%2NModule %2R multiply defines P-section %2R%2NModule %2R multiply defines xfr addr in seg %2R%2NModule %2R illegally defines xfr addr %2R %P%2NP-section %2R has overflowed%2NModule %2R ambiguously defines symbol %2R%2NModule %2R multiply defines symbol %2R%2NInsufficient APRs available to map read-only root%2NSegment %2R has address overflow: allocation deleted%2NAllocation failure on file %X%2NI/O error on output file %X%2NLoad addr out of range in module %2R%2NTruncation error in module %2R%2N%D undefined symbols segment %2R%2NInvalid keyword identifier%2N%VA%2NOption syntax error%2N%VA%2NToo many parameters%2N%VA%2NIllegal multiple parameter sets%2N%VA%2NInsufficient parameters%2N%VA%2NTask has illegal memory limits%2NOverlay directive has no operands%2N%VA%2NIllegal overlay directive%2N%VA%2NOverlay directive syntax error%2N%VA%2NRoot segment is multiply defined%2N%VA%2NLabel or name is multiply defined%2N%VA%2NNo root segment specified%2NBlank P-section name is illegal%2N%VA%2NIllegal P-section/segment attribute%2N%VA%2NIllegal overlay description operator%2N%VA%2NToo many nested .ROOT/.FCTR directives%2N%VA%2NToo many parentheses levels%2N%VA%2NUnbalanced parentheses%2N%VA%2NIllegal logical unit number%2N%VA%2NIllegal number of logical units%2N%VA%2NIllegal default priority specified%2N%VA%2NIllegal ODT or task vector size%2NIllegal filename%2N%VA%2N‡Illegal device/volume%2N%VA%2NLookup failure on file %X%2NIllegal directory%2N%VA%2NIncompatable reference to library P-section %2R%2NIllegal reference to library P-section %2R%2NResident library memory allocation conflict%2N%VA%2NLookup failure resident library file - %X%2NIllegal partition/common block specified%2N%VA%2NNo memory available for library %2R%2NPIC libraries may not reference other libraries%N%VAIllegal APR reservation%N%VAI/O error library image file%N%VARequired partition not specified%2NInvalid APR reservation%N%VAComplex relocation error-divide by zero module %2R%2NWork file I/O error%2NLookup failure on system library file%2NUnable to open work file%2NNo virtual memory storage available%2NModule %2R not in library%2NIncorrect library module specification%N%VA%2NLibrary file %X has incorrect format%2NResident library has incorrect address alignment%2N%VA%2NPartition %2R has illegal memory limits%2NInvalid partition/common block specified%2N%VA%2NTask build aborted via request%2N%VA%2NDisk image core allocation too large%2N%VA%2NInvalid window block specification%2N%VA%2NTask requires too many window blocks%2NTask has illegal physical memory limits%N%P %P %P%2NLibrary references overlaid library%2N%VA%2NTask image file %X is non-contiguous%2NVirtual section has illegal address limits%2N%VA%2NFile %X attempted to store data in virtual section%2NResident library mapped array allocation too large%2N%VA%2NInvalid reference to mapped array by module%2R%2NEnd of f00,´T.ÿT§3eaek›’ile reached before .END in %X%2NSymbol %2R not found for patch %2NSegment %2R not found for patch %2NSupervisor mode completion routine is undefined %2NLibrary not built as a supervisor mode library%N%VA%2NSupervisor-mode library reference error%N%VA%2NIllegal system size specified %2NConflicting base addresses in cluster library %2NLibrary %2R not found in any cluster%2NIllegal cluster configuration %2NCluster library element %2R does not have null root%2NModule %2R contains incompatible autoload vectors%2NCluster library element %2R is not resident overlaid%2NSegment not found to address round%2N%VA%2NLibrary build not requested - ignoring option%2N%VA%2NIncompatible OTS module%2N‡À®ÃÀe"÷®Ã®ÃÂN@RJ÷ ȇwšÃ Þ ÁêÄ+÷¶ÄÆÿÀÂÿ$7¼ÿ!÷ öÄ ÷-nþÄw ¸Ä"ì&f÷ 0ÍÀe"ÁL@÷ Àdž–%ßwD÷>Ã�Þ Ø±‡À¬ÃÀe"÷¬Ã¬ÃÂN@RJ÷ ȇw˜Ã Þ ÁèÄEæCÀhÁH@æ Þ ‡ÀeÐ-®ÿÐ-ªÿò– ƒÀ„Ä$È '÷ ÎÄ ÷-FÖÄ7"�Ä,ïÁŒÄa(Q$É éH"û7`ÿ&wÃwÃA÷ èÌ¡�Þ ÀDÿÖ ±‡|³º~–,?A?AbW  &[qààÿÿ$W 2Š» ¨TITISYSYTICLWKOV–°VγøŠêbÔô” γ°Vγ÷5‚w€wtf&¦‚Þ €�‚‡†7ÿ¦ TKB>Ñ̆,%  À @ à € €%2€>K€Wd€p}€‰–€¢8©°©(ª ª«�«¬€¬Ð¬x¯ð¯h°à°X±Ð±H²g³p³z³Ò00.UTl1DATADATADATADATADATADATADATAW !0.<²ˆè¢¯”DSYSYSYSYTICL^&TKB -- *FATAL*-Run abortedÀöÈ Ð·Zü÷øþÆPüÅpÄ@÷ þ Ìe÷  Œ ÷  ÷  Œ ÷  Œ Í5÷ 2 ÷ 6 Œ Í5 ÷ J ÀÈþ÷ J ÷5~þÖÀû÷ : À°þ÷ 2 À�þ÷ 2 w ú ÷5bþCŠÃÁ‹ �ÁÅ€÷ < ÷  BÁŽ÷ f‡÷5€0þ÷ âü× †×-Fþ †÷<þ÷5þ÷.þ±‡÷$þ÷ r÷ : ÷5€îý÷  üwVÿÁpÂ÷ wVÿÀ P�æÿˆ‡wŒfû‡ÁÂû÷ *÷ °È²ûÁ°û÷ ÷  È¦û‡f&f÷ 7Jû�÷ úwŠû7†û7‚û÷ À‚ �� �`wjû ÷ äw^û ‡7,\û‚ó‡7,Tûï‡  ±…‡æVÂ0Þ Â0– ‡Þ æpõ@‡Ð  � ¦÷ ~‚¡Þ ’$õ€ò þÿî’$±öfE7¦ú÷ 4€`Â0 æZÞ Â0 ‡5,‚÷‡5,ó‡  ±– …‡Á6 u$†· ^ú†‚ ø ‡ 1,ù‡‚1,ô‡J ‡±1,ù1,õ‡Áº÷ &Äbúô Äeø� m÷ ¬7Dú„¡Þ &Ä8ú÷ ”e$â$)d÷ ‚÷„±‡÷5ü‡w � & ÀÅÄÃAÁ ÷ ®7òù@m7èù÷ *1 C7ŠÜù÷ øpMŽ ÷ $ð w" ÷ ð ·Š¨ù7¨ù /÷ ôð *w’ù÷ p÷ L7‚ùw€ù ÷ Ò÷ Xƒ`÷Šdù÷ Òô·ŠVùÀTù÷ òÁefA÷   ÷ ^w:ù÷ ø7.ùw,ù÷ ~÷ Áù÷ œÀ ù÷ z& &Žì—%ƒ÷ –N õÁèø÷  V €÷ ÎÃÔø÷ ÷ 2Â÷ TÃÄøÁÈø÷ ðs÷¬ø¬ø÷¦øÁªø÷ zÄewºþ÷ ~÷ ‚÷ Ð÷ A÷ ~ø‡CàÀ*ÂÁ ÷ 6 ‡w ê CB�±÷ ¶÷ Zø‡‡÷54ú‡w Ä Å†eCå %EÄÀ& 7 .øB�d÷ |÷ ‡wø�ãdd�cA�cAdã±Áì÷¡– 7Ö÷‡æA÷ à&ÀeÐ Ð Ð Ð ÃÂCmõ †ˆ &�‚mŠó€ƒ‡æŽ`ÎeÞæŽ`Þ‡÷‹ˆ÷Ó Ãƒ`ƒ ¡±‡fà‘`‰²B`Šá ‡÷ J¦÷‹P÷ ÷ Òÿ‚÷ †æ÷ °ÿæƒ÷ ”ÿ÷ *÷±÷ ¡ƒ– ‡‹ ƒàò ² ‡ ±`p ð ‡f& €`ð,ø‚ ‡ð,ó‚‡ð, î‚& �à� �mV ‚– ‡·*õÀBæ‚ã‚ �c€e ý‡ÀÒ" &àe·#rù÷ Ä€÷ .ð‡Á(  ˆ‡&÷ ÁeB—%þÿÁe‡1bÀe1^1\1H1J1L1N1P‡&&f÷ t�÷ ¤ÿ€h÷ ˆÿ÷eþÿHö¿DöÞ ÷e<ö‡w n÷ â‡EÅÁ‹Á÷ ŒÂæ÷ AÑÁ B` ðØ÷7Ò÷p‘AÁ÷ w”ÁL ÷ &ùw EÅ÷ p†Á÷ BÄœ÷ BÑ „` p‘÷ :ð†÷7€÷ð~÷AÁŠÅÅ @aÀe· n÷· f÷‡Áe?ÁE? ‡& fŽ Ž Ž Ž Ž Ž æYÿˆ‡· :÷ · 4÷Àž0 úBŠÂÀ÷ €`±¡ Àž±¬ùðôö‡w VfÀ* ÷ –E†Ã¢Â— Àÿ †Á@÷ jÿ‡w`RõK`/ËÿÿÄž Ãÿÿ& D -ù‚ô‹öNñ ±òµ÷ &Ãxö €ÜÀ ` ƒ³ÁÀ*÷ �µ– – ‡·¦ò÷ ÿ‡°Š‡·–ò÷ úþ‡ðЇ·†ò÷ êþ‡ðÕ‡BÁö¡ B — ‚ @€` ‡Š ƒ‚ B`·ìõ¡±‡¦÷ *þ÷ �ÿ‚‡·2ò€ ÷ þ÷ œÿˆv  ÷ üý÷ ‚ÿ€mˆ‡¡ �`÷ äý±@÷ Øý¡‡ì(T×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ ÌV àÿ ÄD|àÿ ¼D€àÿ ´V(àÿ ¬V$àÿ ¤D8àÿ œDÄàÿ ”V,àÿ ŒDXàÿ „V àÿ |D$àÿ tVàÿ lDLàÿ dD<àÿ \DHàÿ TŒ %ÿ LŒî'ÿ DV`àÿ <°D)ÿ 4æL'ÿ ,.dÿ $Rÿ v‚ÿ V\àÿ Dàÿ Dàÿ ü¬Vÿ ôô.ÿ ìD0àÿ äVpàÿ ÜVtàÿ Ô`ÿ ÌVTàÿ Ä–†5ÿ ¼–Æ6ÿ ´–€6ÿ ¬D„àÿ ¤Dˆàÿ œ¨<6ÿ ”ðR@ÿ ŒT@¦Þ5Îe‡w \Á,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡w<ù èÔÓÿÿÿÿÔÊ50„ ´Å (¦ƒr-€‚ù… DÍUt-ÍE Dô €Ä ôE€ù EÍ Ü�‚‡ 200. UÿT§3eaek›’Œ~0ßî&wüÊEò ÊU ‡æ&W¬ )‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡&æ¦ff… Þ �‚ƒ„…‡&æf…Þ ƒ„…‡ &[q &[q‡`àD22ðà 2V2(ðà 2D2< Pzrh �P$ Œh.h�t$´zžh�t$p°zæh�ä%žÂh�ä%øžÔh�ä%œž°h!�t$ øzŒh%�”*´æ h)�”*<æh-�”* æøh1�P°h@h=�PRhzh>�T¨@dhL�T|v@ôhN�Ð ˆd¬hR�Ü!ìvšh\�Ü!P vˆhc�Ð, ¾dvhj�ü(À¬Ðhn�ü(¸¬âhq�ü(¤¬¾ht�TØ @`hz�,%HôNh}�t*h*h‚�t*€<h†�t*ôhˆ�,%hôhŠ�T,@Rh•ü4„Þr•�ü4¼r–r–�ü4Lr¨r˜�ü4ˆºr„rš�„7°¨Ìrž�„7Ȩºr£L@ðÞ£�L@�ÞÞ¤�L@ÄÞðÞ¥Ahà€‚à€€‚€SYxQSYâySY^SYº~xQSY¢_SY»zjL¢_LB[1,1]FSYXCC@êDAêLB êçMPêSSêMA€ëDL`êSHpSPqCR@pMA€-WI pHDëPIêCOxLI xCP€ëDAêFP@êMM€pGPIêPRêASQpTR€êXT€pMACêAEA êHDëPM@êSL êMUêFUpROqAL€ëCMêSEëIPyNMxCOxLI xSGyXHpIDpELxFMxCL xSBrFO@x$+29JÖ(&X^j|Ðèòô5b÷ ’ ÷ Âw¶ÀÁŠÀeÁ û‡w Nö7 ²ùÀNçð5 b$ÅPÃæ ÃeÎ Ë‹úÀ÷ € ±ó ÄP! Á"÷ ”îwjù¡ü– ‡ñ•ñ•w âõ@pdf ¦ÂÔ÷ &ñ‚�B„œ$‡Äµ4ĵ!ò%'‡ò% ‡ò%‡E$ÂeæƒÕ�@à P”üÎ öÖ ÁÁ7Âe Á:Âe Á8Âe÷ Rç±& ĵ€ V ‡11@÷ „ð†BÂeÁ÷ "籇w üô5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ ðœ*AdBbAÁepÂ& ¦fƒÂÁ ÷ ðï– –‡ÁPõµ aA”Aíf@pnp÷ ÖïC*8Ö‹Á ÷ °ï88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ ÄîõÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw óõ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ Fî5fµ fˇðµ ÇÈ•÷ jî‡ðµ¾ðµº÷ Ê‚Âe00.UTl1DATADATADATADATADATADATADATAõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ †íDlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ ¸í½•8 †õ¥öÿ*δ!Έ!‡w âñõ 8µŠjDl@÷ tíT”ÔÀeBTŸ8œ5l@÷ îì‡@Á(ñ D÷ 4íÁeB&÷ í‡÷ ‡& ææ©ÿˆ@ð•#÷ öì& æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡ÿ ¨ïŒ$'ÿ  ïž¢%ÿ ˜ï–Æ7–AAŽ$?Ž$2–æ$è$í$LB[1,1]ODT.OBJODTID.OBJä˜Â@ w üï÷ â÷ÞÞ÷]ÞRàÄðàÁ,÷ Ü÷ Іw¾áA÷ �ú÷‡ôÚÝb÷àÝ.à÷ÜÝ"àôt&Ãúÿô%d3 ð3 ~$ÀeBÁ Á ýA÷ žù‡÷ D‡÷\ %âßÃ%úÿô5b÷EÖßõ5 ÷EÈßõ5÷UºßÀˆß Àå� ƒÁBÂe÷ .á÷ 4÷ jé3~$sð× üÿ]À@@ÀMtßX7 Þ7 Þ&&$&ôµ!ôµÆå €&&"æÿˆÆe À5'÷U(ß7\ÄÝ7^ÀÝôì&$ÁZPP÷ `†÷E@þÞÁtÜ÷ äèwäÝ÷ ’÷ Èè7îýw\Ü4 Pô@þN÷ xwPÜ$°´&4 bôe&Ãew˜þÀ²ýÁ°ý ÃÿíBÂ@°PÂ@±PÀêÂ÷ jè úô^dôÜb÷jý7 dý÷ À†Á ÷ ìßwj÷À*Á,B÷ é&&&$Á¬Û$÷ ¢æð5÷5Þ÷ ˆý÷ô$„ýôÚ$$÷ Š(‡ðb÷ –ÀâÝÀe5Â÷ <è÷ ŠÞô(&ôL$7 vÞ÷ R‡÷ dwhÞðzÛ´$´&‡`Á9÷ Bß÷ .†Á `÷ .ß,\NL¡±‡À Þ÷ påÀÚ÷ Ìù‡À Ú ÁîÛBA°bpd÷ Ò÷‡fîwböh·\ö�` Š �ÜÁ�ÒÁ%/ -Á%/*Á%//$ÀŠ¡‡œ`Â¥öÿÁÂ¥ÿÿÁÂ¥þÿ ÁÂ¥ýÿÁ Â¥üÿÁÂef÷ tÞ÷UÒܱ‡ÂÚûÂeÂE ÷ Œåæ‚$ÿˆ&Àf׿Š$ÿˆÀmÞû€ ‡ ÀíÒû ‡ÀíÊûž¦ ÊÀûà�bŠå‚‡÷ öÀÔÁâ Á ý· rÜ÷Ú`Ü7 Ý7 ÆÚÀöÜ8 f÷ Bä7 ÛÀ*ÁôH ‰·îÚÁþÿæ®$æ?ÿˆ÷xûÜ÷%Ü 7 úÛ÷ <ÿ·ÄÚÀ ÷U€üÛ÷U€öÛ÷ ºW‡÷@¼Û7 ÞÜ÷ êÛ÷ òÛ÷®ÛÁf÷ òãw2ÚÁ‚P” ýÁ÷ Úãw¢ÛÁ÷ Îãw˜Û÷UœÛ÷ Fð• ð‚Ûð~Û wpÛwÚ7ÚÁe @ÁÜÙ÷ ÒÝ÷ ¬Ý7 RÜ÷E€^Û÷xÛ÷\Ú7 ,Ú7 *Ú÷^Û‡ÁK ÷ ÔÜw ÎêwbÛÀ¤      ÷DÛ7 DÛ7 >Û7 >ÛÀ* W, (‡Á÷ Œ7ÛÁ÷ €7ÛÁÛ ÀÛæþÿð8úð•#÷ Ôå †ð%è* 7 ú ï�7 úìŽ ÷ ö凎 ±€‡÷ œù÷ "ý%‡A÷ æôö‡ñµ ÁŠ÷ Üë÷rù÷ œóÀÛAÿ dù7^ùÞ‡÷ œó†ÂŠÁN÷ âÛ‡ÁBí÷ °â&&÷ �Á9?‡ÁÚ÷ šâ÷ äÁ¾ÚÀePHHJ÷ 툠÷  ð5@÷ œÚŠÁ wŒÚðž× ðÜì ÀÂÙÀe5Â÷ äÀfÚðr×b÷ ÿ ‡÷ Ö†Á9`÷ BÛî‡À@Ú&&ð5 bð &÷ °&‡ÿ 脌6ÿ è„’6ÿ è„¢6ÿ üç–†5ÿ ôç–¼5ÿ ìç–Ê5ÿ äç–&6ô5uuuu w dï÷ "÷ &w*ÁŒ$A±q#úq-ö‡ÿ 6î°ò&ÿ .îÂ"&ÿ &îÔ&Ö¯"(1±R7(“±ÌU(ß±à`Í(ó¯ÐÛ(’&3ÿ²& TKB>l^SY†7 –ý÷Œ$’ý7 þÀjßÀe`Á& ý÷ DæÁîÞñ@bp$$À:ß0 b÷ ²ø@‡Àef7D÷` Š÷ –È¥;ìÈ‹êÅ&% % % % ÷ „Â¥:uu÷ j÷ nÀ & ”W¤ û‚ÿ ôöÁ ÷€e)Áä%I#q-'ÁeW &õ‡Á$0Âefœ`Á × üÿÁ× ÂeâÿÁ 00.UÿT§3eaek›’× þÿÁ^× öÿÁ ÷ ßAÁ5 Â¥;U%ÁEÉ ‹Á#wÖ ÷ øüÁ(w we)÷ ´e)Á(Í ræ æ²)Ä�e)÷ †e)Á)Í lÄ æ æh)÷ ¼U%ƒ Â¥;Â¥,Q÷ \÷ Pe)S#S-ã Ó$Ë ÷Á*IÄÂË ã€ÄÒáÁ ÷ ‘%‘QüÿQ *& ÷ NüÁ&1Í &f÷ JÁ õÁe f÷ ä�Ö 7"üÒ ÁRRRÁ|õACà`Ãe ÒR”þ?jû7fû‡Á%÷ ~ü†‡Á'ÂJõ÷ ÈÝ·²ØÀ"Ý÷ zø÷ âæÁ&ÂÀe`P ý‡£ &€ÿ,@ÿ 3ÿ@8€„K@oMBaÿTq ÿØrÿt@,ÿYeÿÜYxx@ÿßY`èYè5ÿ *ê–†5ÿ "ê–Â7ÿ ê–8ÿ ê–Æ7ý¨X[<$09AZ (),-*! x'Ê&'Ž&>'`' &"'"'"'7 ¾ÿ7 Êÿ7 Èÿ7 Xþ7 ¨Ý÷¶ÿÀ�$ P %ú‡Ã’$À% #Ä¢%À¾þ$$÷ :Åò%B“‚ Á Á üœr0t$Iz &Ã%’$U÷^ÿZÿ7 XÿO× ’$÷‹Jÿ8÷€Dÿ÷5€¸ÞM÷5°ÞI÷²ÞE÷ ¼ý÷ ÿ· °ýÓ$× %†Í¥pÍ¥&ðÕ€7 øþ Á-A#÷ ~ý÷ xýã(× ’$†3Á%2Âô%Õ¥J“ÊÅÅ °Ò÷ ¨þ÷ Hý° ·’Ü#7 �þ ÍEwÿÍ¥Âô%J�ÊÅ·nþî#× ’$Á.w‡È‹È¥;!ž%†%õ ‡À%ü‹9ü¥;5Áê%H¤1H¤/H¤-H¤‚H¤)†H¤‚H¢%†Å”u &Å ûÁ+wª÷ –ÿÀ%W­&À%W­& Á÷ ¬ðp�&‡Åø%&÷ ¤À e)È¥:2È¥./È¥[,È¥<)È¥/&�ãW !†÷ Tý‡Ö ÷ &ÿñ‹ fAœf÷ J…‚‘”Å ý‡!"%ƒdd‰Á,w€Å& ȋȥ-È¥)È¥(È¥*Πȥ, Ž È¥[Πȥ]Î ”âÖ Z÷ ¤þÁ,÷ ÒÅåðp÷ \çJ‡÷ šõÀÝA÷ öA‡÷ žõÁN>‡À*Á,B÷ çÀàÜ&&ð5 bð &÷ r°&`Á90‡÷ pð5@÷ °ÜwªÜð¼Ùðüî –Üò¢ÙbfÁ÷ 6Ñ Ñ‘‡Á%ŠœŠâå Àe 2÷ RÝÿ Hê„’6ÿ @ê–†5ÿ 8ê–¼5ÿ 0ê–Â71±o†?±y‹T'Ž'p'Ž'�'R(T'T'Ä(ž)F)ÅŒ$÷ 0ÁÄÜ÷ ¼ç7Îÿ7 Ìÿ÷€Èÿ÷5¾ÿ÷EºÿÀ�$Ð P %ú‡Ä’$ÁüÞ÷ Pé÷ é÷ æÁšÝ÷ úè÷ æèÄ�$÷ Î%!%ù‡À@÷5hÿÀÕ7Hÿ7Lÿ÷ ÜÞ÷5Nÿ÷ºÝÁ¸ÝW  Á � Á CÁ ÷  7fÞÀ`7ŽÞÅì%÷ ÷ øÜ5Åä%ÁnÞ÷ Âè÷ xèõµ· `Ý´ dÁ÷ †æpppðºÜ À6ÞUÀe÷ ¢à÷ |àAÁåÀh÷ òã÷ "âÁÞ÷ è‡Á´Ü÷ Šæ7¢ÜÜÂEz&ó5õUÀð¥æƒ÷ �ã‡÷ ä÷ ¸ç÷5ÒÝp  p´´pp��õµõ f&÷ f€°�p÷5’Ý&÷ N€°´p �ðÕó5õUfu°p ððÛ7âÛwæÛ÷ 2ç�÷ ²å÷ 8çðÐÛÁñ¥<ƒ÷ ÐfwXÀð¥2ƒ÷ ÷5 Ýp  p´´pp��÷ Ìæu ð€Û wzÛ ÷ Öæ÷ Âæ÷ z÷ @å& Á^Û÷ ®æ�÷ þæ÷ ´æwLÛw�þÁÁeÁå@Àe÷ ªß2†Á÷ ¶äfðððœðÅó5ðÕÀþÚÀe ÷ ÀÞ†÷ ˜Þ÷5NÜ Á÷ D°ÁÐÚ9–1–Ö õ G@Á÷ ˜ä÷ æw ÀÜÁe & NÎe ó5ðU À�ÚÀe5Â÷ <æ�õ !÷ Rä55ó5õUõÅÛÿõÜ÷-PÚ ÛõÅõõõµóµ€÷5€ˆÛ÷5€ÛõÕ÷ 8uµ�÷5fÛ÷ $u µ´w8ýÌ%ææÙ÷ *ý�Ì$)‡Á÷ \ãð]Âû · >Û¶û÷e°û‡E B�œÁE€ÿÀ*E÷ äåÅ ô‡ÿ ’é–†5ÿ Šé–&6z*‚*j*j*j*j*j*j*j*j*j*‚*j*j*j*j*j*j*j*j*j*z*Š*z*z*z*z*z*z*z*z*‚*z*z*‚*¼'j*j*j*j*j*j*j*j*‚*j*z*z*‚*j*‚*‚*‚*J*R*z*J*R*z*2*2*Z*B*z*:*ò)‚*z*‚*j*j*z*z*j*j*j*j*j*j*j*j*j*j*j*j*j*j*j*j*‚*‚*‚*z*–.z*‚*‚*j*j*j*z*‚*‚*Ÿ su$”*£ @€–,AL%w ºí÷ Î÷à ÔÛ÷5Þ À¨ÚðÅa÷'†Ü÷ ”‡7 |Ü•!À÷ bô‡&ü „øÀvÚðÕa÷ fûÀÐÜÀmÆÜ€  ƒ÷ÄÝw^÷ ÂÀ ÷ ¤‡fÁ�Ý÷ æ÷ šç�‡¦÷ èÿÁzÝ÷ hçÀed7úþAÁåÀe¾ÿ÷ „à1†Î‹· ^Ü¿ ÞþÁ÷ „åpp°UðÕ@pMð¬Û À(Ý%Àe÷ –ß÷ pß×-,Ü Åå AÀh÷ Þâ÷ á±‡Ö ‡·�ÙÀ ÙðÕa÷ �úÁŠ÷ ŠÞ‡w ‚ì÷ vw xì÷ lÅ¢Û ÄêÛ÷ r7"œÜ7,–Ü9ÃZ7Žü÷EõÿˆüÃA3"3,'ó5@ó5îÄÄEõÿÄ-XüçÄÅ ÷ à #ÂŒ   B`‡ „ ‡E ‚Ö Ä¼ýÔ Äe3#3-Å õ±¡‡÷ ܱ€w °ë&ÄDÀ@'ÄF'æD'ÿˆ ‡Á&ÂÊû÷5Æû €‡w të÷ÿÿ´û& æºÛ· ªû¦�÷ æ7PÚwTÚÍ �÷ &ä÷ œå& íÖ ¶#ê–%÷ vû�÷ äóÖ ‡ÿ êø€/ÿ êøh0ÿ ê >+ÿ ê 8+ÿ øé (/ÿ ðé Ê/ÿ èéâ*ÿ àé*0ÿ Øé1ÿ Ðé„Ä5ÿ Èé„^6ÿ Àé„f6ÿ ¸é„5ÿ °é„¤5ÿ ¨é„V6ÿ  é–†5ÿ ˜é–Š7ÿ �é–8ÿ ˆé–„7ÿ €é–Æ7ÿ xé–¶7ÃSwÊý Ä·R×ÁÁ Áe ÷ ®ÿà wêwÙ‡·6×@$à ÁÈ "ú‚7$lúƒ7þÿdúÁ óÁÁ Áe÷ pÿ?lÙ7hÙÐ PAPÐÐ�Pà ý‡Ã0wRý·âÖ÷^ÚwØØwÖØ÷@ÒØÅú÷ ¦üÁ&Úw$äW#€‚Í Í wæØ‡ÃTwý÷5€Ú÷âù7 ÒÙ7 ÒØ7 ÐØ÷ÿàØÍe ‡ÍEM M M MŒÍwÈØ‡·hÖÁÁ Áe÷ Äþă ?–Ù7’ÙÐ È(ûÐåPPPà ý‡·2ÖÁä&·(ÖÁà&ee·ÖAÁåÀ^÷ ݆Á ÷ jþpppÀ^÷ ÎÜp‡·ÞÕæ‚“÷ ´û‡Î ðµ· .Ø¿ ®úðÅ ðµ÷ Øÿ –ú°Óp÷ ãÖ ÁöØwôâ·ŠÕ& ÖwÖ×wÔׇ÷5 ôØÃmwØûæXúæVúwPúwNú7 LúÀÂ,÷ èü·>ú·8ú÷ 8úÃlw¦û‡&À<×7,ú 7,ú Á0×÷ �âðU· ú€‡÷ˆØÀÕðÕa÷ öwôüÀÕðÕa÷ ôõwêüÀòÔðÕa÷ âõ÷ULØwâüU%Í W# †wB×w<×w6ׇw:·¨Ô@× A÷ îû@‡$Á5?7Â5?3ÂŒB B B @÷5€è× *·¦×Á=¬÷%Á ÷5€Î×÷5ž÷÷ Ôú‡· Öƒ÷5Š÷7€×7~×w¾Ö·lÖ·jÖ÷j÷‡Ã@ÃRw|úW#ú‚wTׇÃ5whúÍ wjׇ·ðÓÀÌø  AÁEøÿBÜ8'C ƒCÀ ö·�®Õ÷�ׇ·ÆÓÀ¢ø  AÁEøÿBÜ8'C ƒCÀ ö·�†Õ÷�õÖ‡wúÖwøÖ‡w×wׇU%Í W# †w ÖwÖwþÕ‡Ã6wÖùwêևХ[÷ 8Â¥,å‹f™÷ (�Â¥]å‹U�÷ °û”‡Ö ŠÁ÷ 8ر‡&÷ ŒûÂ¥.€å ÷ Žû÷ ‚û”Ö ‡w#Lö‡W#ú‚wrÕ‡Ã1wVùW#& W#BaÃwBù÷ä Ô‡÷à üÓ‡wòúW#ƒW#‚÷2Öw(Õ‡ÃUÛ· Òæ·˜Ò& Á÷ öú°?"Ö7Ö PH‡Â pÂ¥;mÂ¥!÷ šÈ¥;eÅî&÷ „Â¥=7e)ÄT%t#t-Äe !Ú&ô‡Á87 ÷ È‹-È¥;*ÃEÅî&· îöô­êö÷ 6Û Â¥,Â¥! Â¥;Â¥:éÁÁ ô5Á ô­¦öÁ!ÂÎÑòÕaÀÄÑ÷ ºòŠ÷ ¶ÖÅî&Ãzö¡±‡w žä&Á"÷ "Ýwlö7föÂôˆJ· lÓõ•ÿÿ€fÅe& ÷ žÂ +— ;(— !%— ,— :)Ž —£%êŽ —£ …Õ ÷ Dµ“þÿ¶Š— ,— :Ù÷ D— : ô—£ö‹Ö …5Ї–%ÁŠwîÕÿ äℤ5ÿ Üâ–Â7ÿ Ôâ–8ÿ Ìâ–„7ÿ Äâ–Æ7÷ &÷ &÷ �’•’•€‡@Á(÷ øf€  Àe ÀeÉÿÀe Àe ‡&æ¦f&¦ v Þ €�‚ƒ„…‡LB[1,1]LB[1,1]t-j-/t-õU,÷ šÿÀÌÚ÷ âÁæÁeà÷ ,7¤ÿÁÀ+ Á ýÃB÷5Öù÷5Îù7÷€Šÿ÷SY’ÿBÂe÷ FÁ+ÂÀeB ýÁeâÿ  ÷âyXÿB,D.�&Î Î Î Î ‚ÕÃC! ‚ÂU@÷5€’Ù„    w" Å ÿÃDÀÚð•#÷ xä ‡ð•ðð•÷ hä~‡Ãd÷5ù ÷ Æ×÷ :Ùp÷ 2Ù÷ *Ù Ãcñ5bÂU÷U@Ùñ5€ÂU÷5€üØÂU@ñ5 ÂU ÷ ZúÂU @ 00.+UÿT§3eaek›’@ìÀEÿÀ @ @ @ 7�FúQ$@ææPÎ ý– ð5øÿðU@øÿÎ ñ– Å*þe)µÀ+55÷5€„ØÂ5uí uí ÃC55a 5a ‡ÀüØ÷ ãÀòØ÷ ãwè÷%0×A‡7 Úý÷ ’7 ÎýÃGÀ0+AÁ5·"Ø÷U@ ØÁ5@$Á5Ð X ÷5€þ×ÃPAÁ=Â÷LB BàÂe@ÂE?B B BŒÂ@$õ5÷ Üú÷ àúÃ=¸‡ÃCÄ^Œ #‡wHAW ‡w¤×÷Uœ×Ã\ÁtÖAmí‡wjÖA�÷ îøw "ýwýw`hÖÃXu-÷5.÷zC÷5@R× Ã5Ã5€€õE€Á ÷ @, Ð U%ÁPÁ ý÷ ×÷ 4÷ �Õú÷ ÷ âà0(fÁ´ÔÁEÿÁUÃ5ÁU€Ã €ÁU÷ ^ÕðJø*ÁUp÷ ùÀej1ˆ�`÷  àÍ (e)w^þÁ+QQ À6×&$&&°$ð+&÷ ˆ‡°&°$‡–%– BÂeÁ>wü×÷ Rù7 \ÖÂâûÁæÀ*w&áÀâÒ ÁÆÔBA°bpd÷ ªð‡fîw:ïh·4ï�` Š �ÜÁ�ÒÁ%/ -Á%/*Á%//$ÀŠ¡‡œ`Â¥öÿÁÂ¥ÿÿÁÂ¥þÿ ÁÂ¥ýÿÁ Â¥üÿÁÂef÷ L×÷UªÕ±‡÷ ûÄ÷Åî&fB�Á Á ýõ +õõ"+ õ 5�.ô‹€õU€.5�-æè&µÄe& €÷ dú÷ ^ú�@ ѥ ûÁ àu÷ èúN#N…à áÄ|ö´•–%7 rö÷m¨úøÓ‡ÿ ˆã„’6ÿ €ã–†5ÿ xã–¶5ÿ pã–°5&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡?ÿ @`€ Ààÿÿ_ÿ?¾*Units set to maximum assigned^,V,V,æàæ=ÿˆ÷5~Ú÷‚ÚÀxÙÀmnÙ  ƒ÷%nÚ ƒÁV U÷-VÙ"ú †÷úLÙÁ1º*÷ ÔÛÀ`Á,B w,,Ù‚ H`Áeó÷ÿÿ6ÿ÷ÿÿ2ÿÁÙÂÌØ÷5Îù*÷5Æù& ÷ Èý†ÁF‚÷5€ÚÙ ·˜Ù÷ àü ‡Á=˜ù · &Ø‚wÔØ·‚Ø·€ØÁQÂD÷ @Û ÷5€œÙ;÷5lù+Á ï÷5`ù%Ä\Ù"Äå5Ý¡*–*5Ý¡*”*÷5rÙõÕ€–*õÕ€”*Ä 7¬*nØ7¬*jØ´ ´*Ì‚m¬*· Ø· ØõÝ ×–*õݜה*÷ ¦µÐ–*µÐ”*Äþÿ÷  & & ÀZdð5@tp,$õð5t€,îí ð5€  ÷ Z c€ÁHúAœÁ A¦*ìN ׇN6Ó÷5€®Ø  ð5… ð5€ %÷  �ð5@ð5 ¦B÷ ¦– Áf÷ ÚwØÃØùB÷ Œ�s�œ÷  ÷ †Ow4‚€t6- w. ð5… ÷ Pð5€ ÷ ” �‚    °` °°°`ðU@wÞþÂ`ù‚œ ‚œž*�� BŒý€÷5Ô×ð5µ°”*µ°–*ŒU‡Á îwÞü�    ÷5¤×ð5µÐ”*µÐ–*ð5€ Ãøøó‹€ó�¦üÅ ÷5n× ð5 w Šü†w„ü ÷ ~üw vü†wpü÷ jüpp÷5€4×ð5 ð5@ðU@p` p`|Þ*Ò ÁA÷  Ø÷Ý&üfÕ÷�!üaÕ÷Ýü\Õ÷ ÷5¼ö÷ ªÖ÷ü¦Õ÷ü¢Õ‡ÂEÿ B B B ‡B÷ ìÿ� ì÷ Þÿ‚œž*Á ÂŒ‡û÷5˜Öð5µ°”*µ°–*‡w æ&fÁôA<÷ äÞ7Ü÷�€&��æÔ % ,4,à ö–%&fÁ®÷áÖ ðE ðU€40, ôU 0, ð ð5 ‚•‡ÁgÒ wŠ×ÁiùÁhøÁkóÀŠ ÷5ÐÕÃl³ ˜*ƒ³˜*ó ˜*÷ Ôþ� ÷ Èþ‚œž*Á ÂŒü³ÐØß‡f¦ŽÎeÿ‚÷ žþ�‚‚í÷ ’þ‚œž*Á ÂŒ‡ûÖ �µ°–*‡Ö �‡ ÷ ù÷žÓ7 öÓ÷8Ô7 øÓ7 Ô7 øô7 öô7 .Ô7 &Ô7 .Ô7 èÔ7 Õ7 Õ7 Ô7 Ô÷øÔÀ®Ï7DþÔ7 ¸Ô÷<´Ô7 Õ÷”ÕÀZ P ÁFÒ÷ >Ý7šô÷5€¼Ô÷?†ôÁÓ Á%‡ÁA A A Á wÓ ÷ÿßøÒ÷ÿ\ô÷ÿÿêÒÀ` H‡Áe÷ Öë·ôÐ× †5 × †5 ÷5€PÔ5 @$Á d.‡Aá ÄŠ÷ ¸×†Á ÷ L Ð AÂP ý÷ föÀeAá ÷ ×‡ðµ  ÷ ôÝðÕ€pp ‡ÃZwÎöÿ jâ–†5&æ¦f&¦ v Þ €�‚ƒ„…‡D v $$�$š ª+Ö+L)ɪù¬yN0†ù¬tN°² ­sN0‚ù¬sN0† ­s, ÿŠ ­øt ­~,¤ÿ ­, ÿŽ ­€,¤ÿ­3X ÿ’ø¯ªàf  :,v-v--f w ¢ûÁ~é÷ vô7|ÿ ÷ ×-ôêÀæ÷ <‡÷5äëÁÄë÷ Hô÷ Îõø÷5ÂëÜ÷ vÃÀ÷ n÷5@²ëâ÷ .êßÁŒë÷ ô÷ –õî÷ J‡w û÷ ŽÁê÷ zõÅ êw `ë@Àe"Á”ñKr•@×-bë ‡ñJr÷5Pëñ;r÷5:ëñå÷6ë÷ –é÷5¢þ00.3UTl1DATADATADATADATADATADATADATAñåK÷5”þÂÕ±�÷ î‡Á÷ ð`é –Р��ˆȵµ d· ÎéÀpéÀe÷ 2í÷ í÷5Dþ'÷%¾é#÷ "é×-¸ê‡÷5@¬êÁ÷ ºðé ðéðv~ðÕhÀéÀe÷ Üì÷ ¶ì÷5@tê÷ ðèî÷ ÷5VêÜ÷ ÃÀøÀ.PHÄ„4 ôÿÿ7¶è7 ºè÷ 0‡× ÐúõµöÀ2PPÐh ÷ VêÀ„wê±À2Ð ÐÐ à‹÷-pèÀéŠ÷5Jý÷%ÄèÈ•@@Á0ÿ ¼ü@Àb È\ýÓ ‡Á0@ üÁ÷ ®ð 07臷æfÁ÷ ø?öü7òü°‡÷æüâüÁÞü±wÖüA÷ Àñ¡Þ ôÂÈü·Âü÷ ø÷ø¸ü‡ÁÀ*wþó·¦åÂø€± �,ùˆ7Œü÷ Òÿ¡‡÷ „ü Àßzü· vüÀˆé÷ öó †ð¥öÿ*± `Á ÷ dê7Nü7Hü‡÷ ºÿ&÷ ´ÿÀ€U‡w >ø÷ÿÿ,ü& æ„è· "ü¦�÷ Ðò7çwçÍ �÷ ðð÷ fò& íÖ ¶#ê–%÷ îû�÷ ÌðóÖ ‡·àû7 Úû÷€Òû7 Ìû7 Êû7 Èû€ÁÀæfj&�Ž÷ ~±‡÷ ˆð6¦vwœæÂ�æ7Œæ÷‹Œû(Àe"Á�èÁeB$$$ÀåÁe((ÁZæ·<Tûw<Lû  w<Bû÷ ÷ ÷ ÷ 0ûw<&û·‘$ûð•#÷ ’ò†`Á ÷ é÷ ò÷%<çWñ5@ñ5 O€f &�F÷ ¾ï6¦vwÒå7Æå7 ¾ú÷ Àú*7<¶ú&ð5@ ÷‹­ú÷ ª÷•¡ú Àžçð•ð•÷ ò‡÷ úñ†`Á ÷ rè÷ „Þ ÷ Ê�Ž÷ ²ð·Ž ÷ R÷ fÞ ÷ ¬�÷ –ðŽ7Š7úwvþ÷ ,ú À6ç7÷%Á÷ xýð0÷ð(÷ ðÕHÂ03ÁÜáðµw÷÷Äáþöw þö±wöö‡Â.Á÷ ¦äÀe÷ æf6†Ö Á÷ ýÂ0°ðµð¤ö ðpá °°fÀ^áÀe ÷ å÷ úä÷5°â Á÷ . °Á2á9–1–�÷ ëðµ÷ öêN&Á  ý€Â0&€Á5ÁEÀEÁEÀEÁE@ÀE@ÀEÁE €&&fÎEÿïöEÿï¶#‡ ‚–%€–%€ðÕ2, –%€òU2,Á�â ÷ €ãà 5Ávà÷ Öë´ C� Á Á ÷ J &à ÂP ý&À*ÁÁ ÷ |쀴ˆ7JõÈVõ÷% ­Jõ÷%,Dõ7vჇ·*õƒ‡‡÷%.õ?÷-üßLá1Â�ô5ÂzÊ%¦Àe÷ Nä‚N‡ðµÁòôðµ l‡Á5RŠÂ.rrÁÖ Â.² Á÷ ‚â‡7 |ô÷ xô‡æCœóÅô5Hô5€µóµ óµ (³lóÅ óÕô5€)÷ ß&óœô5óUó5óUó5 óEóEw,Æ w,À ñm:àóµ3ô5€óÕ€óµ(Àðµ "ðµ ó5ó5 3lðµ€ðµô5 õ5óÕ×-Ê߆óµ ÷,hó÷,bó÷e¨ßô5ó%ɪó%J'ó;'ó%Jró;r÷ÿÿFóæêÞ †w6óµwÎ÷îÝ,ó‚Á 9ÂÀeÃe‹°bˆ° ÷5@4ß\÷ °ÝY÷-¼Ý ßUÈ5RÈ5OÈ5Lô5HÁžÝÈUB÷ Z@ˆÀð¤òÁ†Ý÷ âè· Ôݵ d÷ Xõ1¦ÂLðµ°ðµ€¬Š Ê ÷ êÞ ‡ðµ÷ Ú÷†Ö w÷ tòû÷-lò~Þ ÷5@�Þ ÷ Ý÷ ¸‡S÷ Lò7€ÁNò÷ àæð5w”ð5wˆðµ€w|ðÅ€7œò÷ÖÜòÁÐÜ÷ ,èB÷-ÞÀÜ &fÁÞ÷ Œæ÷ è�€÷ bw:Á÷ ø÷ ØçÂÐñ°ðÕ€ðÕ÷µÀñB÷ 0÷ Hæ÷ ¾çw¶ðµ€ 7˜ñÀRÜ7Šñw‚ñ÷DÜ~ñ7 ~ñ±¡7tñ‡Â.Á÷ $ßw\Á 6ÁÜ÷ Xô÷ Tç÷ $‡%ÁÜ÷ Úå÷ `ç÷ Lçw6ñððE÷$ñðððð µsõ d÷ Ün÷ ðÖ Á¼Û÷ çwJfÁ®Û÷ Pç÷ çð5ð5€ ô5Ö Á†Û÷ *çB÷ Îææ¨(æÁrÛ÷ ç7bÛwÀÁdÛ÷ ç÷ ¼æ&÷ L(‡)€ÁLÛðµÂ6Ûò d÷ ŽÛÂrð°0 ðÕ€ðÕ—%÷µVð ÂÛÁ Û÷ À÷ .–%ÁúÚ÷ FæÁðÚ÷ Næ÷ :æÞ †wxfÁÚÚ÷ ~æ7ÊÚµÂ.Á÷ Â݇w ºëCô5€7(ò5³l÷âïÁ÷ ~Á<Ñ H !Ð Ð&ÁÆÛ÷ Jä÷ Ðå€PPÐÐJ©Ðø‰ÄºÛÄ Ð· ®Û‡² xæÃt² ræÃnf¦Á÷ ‚Â`Ò  "°�ƒ‡¡ðµóµ ðµ€÷ ¾ãðµ 3,ô5¡±¤‡óµ00.;UÿT§3eaek›’wRóµô5w>Áó5ó5Áe÷5@òÚ ô5€ ÷ fÙô5Áe÷ êôw¤îô5ó5óÕ€ð ðm Ú0 0 ÷ †÷pîððEðð0î ðÙ ó5ðHîðð^Úóµ óÕ€ð ðm8Ú0 0 óµ 0 µ d· Ù÷ üã÷ šð÷ äððÀ ØÀef÷ `Ü÷ :Ü÷%ôØæ†ØææÆå�Àh÷ œß÷ ÌÝÆe – ƒ‡ÀNÈ ô5PHtt Á8Øwšã÷ íæ–ØÎmŒØŽ ‚— ƒ÷%ˆÙ— ƒfÁV ÷ Û�· fØ7 àì1 ñ×÷5€LÙfÂ.Á]÷ ØÚ�w`ôÖ 6f… ÷ .Á÷ ’á÷ ãÁðµ !ðµ ðµp`†Á ðµp ƒÁ;Ò ÷ tÚp ƒpÅ Ó…÷ Àòô5 -ô5@)ÁH×÷ šâ7 4ì÷ ¨ï‡÷ äï ö7 ì÷ ”ï‡÷ ðî÷ bâ&fÁ×÷ ìà÷ râ°·ׄwÔòwVóƒ‡ô5-÷ ˜ïÃåÀ%&÷ ŠïÀ¥!ô5ôUÁÄÖ÷ &âæÃ2æ÷ `ïÎ ûÖ ƒÃå Á0@÷ ÷à Û‡7 „ë‡w ŠçÄeW!€ƒÅå€÷ Å€AÁ Á ÷ ðñTÐÐÅ ü‡÷5 ë÷5˜ë÷5�ëô5Á÷ ¼ñ÷ xáðpëðÕˆB÷ ìû÷ øß¡‡±‡÷ VêÁ`×÷ äßÀe&ÁöÕÁe ÷ nÚ‡wëÖ ‡€Á÷ ZÚ‡wúê‡÷רêwÖêÂÐê�¦·Æê÷ jáw¾ÕÁ¼êÀe÷ &Úf &w¬ÕÁ¦Õ÷ ôà€ �ã‡Þ ᱇w пŶÖÁ„Õ& f w€ê÷ Pß÷ RÄ  öÄÀZÕ& ff÷ *ß÷ ,ö� ÷ ß– N ñ– õ„ !‚æ.ê¦í– ‡U ‡1±o†ÿ å–†5€h0ð&æ¦f&¦ v Þ €�‚ƒ„…‡¶#è#t'v'( $/H/¾,Ž º¯ªàB#D#Ø#z#¬/è0è0†0Ø# 7 Të÷ ÷\ÿÀäëðf2h8 f÷ (óÀ8÷ 4÷ ê÷ Æë·8ë÷5ë7 ,ë7 $ÿÀ„÷ 7 ë ÁJ÷ ŽìÀ’ë÷ °õ0 h‡Á÷ ®ð 07`釷RçfÁ÷ Ê?Úþ7Öþ°‡÷ÊþÆþÁÂþ±wºþA÷ ó¡Þ ô¬þ·¦þ÷ ø÷Žœþ‡ÁÀ*wLõ·ôæÂŽ€± �,ùˆ7pþ÷ Òÿ¡‡÷ hþ Àß^þ· ZþÀÖê÷ Dõ †ð¥öÿ*± `Á ÷ ²ë72þ7,þ‡÷ ºÿ&÷ ´ÿÀ€U‡w Œù÷ÿÿþ& æÒé· þ¦�÷ ô7hèwlèÍ �÷ >ò÷ ´ó& íÖ ¶#ê–%÷ Òý�÷ òóÖ ‡·Äý7 ¾ý÷€¶ý7 °ý7 ®ý7 ¬ý€Áèfj&�Ž÷ ~±‡÷ Öñ6¦vwêçÂÞç7Úç÷‹pý(Àe"ÁÞéÁeB$$$ÀåÁe((Á¨ç·<8ýw<0ý  w<&ý÷ ÷ ÷ ÷ ýw< ý·‘ýð•#÷ àó†`Á ÷ `ê÷ ò÷%ŠèWñ5@ñ5 O€f &�F÷ ñ6¦vw ç7ç7 ¢ü÷ ¤ü*7<šü&ð5@ ÷‹‘ü÷ ª÷•…ü Àìèð•ð•÷ nó‡÷ Hó†`Á ÷ Àé÷ „Þ ÷ Ê�Ž÷ ò·Ž ÷ R÷ fÞ ÷ ¬�÷ äñŽ7Šüwvþ÷ ü À„è7ß Á÷ @°ÁÀÝ9–1–�÷ ”çðµ÷ „çN&ÁÈ  ý€Âä&€Á5ÁEÀEÁEÀEÁE@ÀE@ÀEÁE €&&fÎEÿïöEÿï¶#‡ ‚–%€–%€ðÕ2, –%€òU2,Á�â ÷ àà 5ÁÝ÷ dè´ C� Á Á ÷ \ &à ÂP ý&À*ÁÁ ÷ 逴ˆ7ŒòȘò÷% ­Œò÷%,†ò7Þƒ‡·lòƒ‡‡÷%pò?÷-ŠÜÚÝ1Â�ô5ÂzÊ%¦Àe÷ Üà‚N‡ðµÁ4òðµ l‡Á5RŠÂârrÁÖ Ââ² Á÷ ߇7 ¾ñ÷ ºñ‡æCœóÅô5Hô5€µóµ óµ (³lóÅ óÕô5€)÷ ˜Û&óœô5óUó5óUó5 óEóEw,Ø w,Ò ñmÈÜóµ3ô5€óÕ€óµ(ÀÈðµ "ðµ ó5ó5 3lðµ€ðµô5 õ5óÕ×-X܆óµ ÷,ªð÷,¤ð÷e6Üô5ó%ɪó%J'ó;'ó%Jró;r÷ÿÿˆðæêÞ †w6óµwÎ÷|Únð‚Á 9ÂÀeÃe‹°bˆ° ÷5@ÂÛ\÷ >ÚY÷-JÚšÛUÈ5RÈ5OÈ5Lô5HÁ,ÚÈUB÷ Z@ˆÀðæïÁÚ÷ på· bÚµ d÷ ˜ð1¦Âðµ°ðµ€¬Š Ê ÷ êÞ ‡ðµ÷ Ú÷†Ö w÷ ¶ïû÷-®ï Û ÷5@Û ÷ šÙ÷ ¸‡S÷ Žï7€Á�ï÷ nãð5w”ð5wˆðµ€w|ðÅ€7œ^ï÷dÙRïÁ^Ù÷ ºäB÷-¢ÚNÙ &fÁ–Ú÷ ã÷  ä�€÷ bw:Á÷ \ó÷ fäÂï°ðÕ€ðÕ÷µïB÷ 0÷ Öâ÷ Läw¶ðµ€ 7ÚîÀàØ7ÌîwÄî÷ÒØÀî7 À7¶î‡ÂâÁ÷ ²Ûw\Á 6ÁªØ÷ ˜ï÷ âã÷ $‡%Á–Ø÷ hâ÷ îã÷ ÚãwxîððE÷fîðð2î µsõ d÷ ¬Øn÷ ðÖ ÁJØ÷ –ãwJfÁ<Ø÷ Þã÷ ”ãð5ð5€ ô5Ö ÁØ÷ ¸ãB÷ \ãæ,æÁØ÷ ¤ã7ð×wÀÁò×÷ ”ã÷ Jã&÷ L(‡)€ÁÚ×ðµÂÄ×ò d÷ ØÂ´í°0 ðÕ€ðÕ—%÷µ˜í Â’×Á˜×÷ À÷ .–%Áˆ×÷ ÔâÁ~×÷ Üâ÷ ÈâÞ †wxfÁh×÷ ã7X×µÂâÁ÷ PÚ‡w HèCô5€7(ò5³l÷$íÁ÷ �Á<Ñ H !Ð Ð&ÁTØ÷ Øà÷ ^â€PPÐÐJ©Ðø‰ÄHØÄ з <؇² xæÃt² ræÃnf¦Á÷ ‚Â`Ò  "°�ƒ‡¡ðµóµ ðµ€÷ Làðµ 3,ô5¡±¤‡óµwRóµô5w>Áó5ó5Áe÷5@€× ô5€ ÷ ôÕô5Áe÷ *ðwæëô5ó5óÕ€ð ðm.×0 0 ÷ †÷²ëððEððrë ðœÕ ó5ðŠëððìÖóµ óÕ€ð ðmÆÖ0 0 óµ 0 µ d· ¤Õ÷ Šà÷ Úë÷ ’àððÀ.ÕÀef÷ îØ÷ ÈØ÷%‚ÕæÕææÆå�Àh÷ *Ü÷ ZÚÆe – ƒ‡ÀNÈ ô5PHtt ÁÆÔw(à÷ <êæ$ÕÎmÕŽ ‚— ƒ÷%Ö— ƒfÁV ÷ ’×�· ôÔ7 ê1 ñ Ó÷5€ÚÕfÂâÁ]÷ f×�w`ôÖ 6f… ÷ .Á÷ Þ÷ ¦ßÁðµ !ðµ ðµp`†Á ðµp ƒÁ;Ò ÷ ×p ƒpÅ Ó…÷ îô5 -ô5@)ÁÖÓ÷ (ß7 Xé÷ èê‡÷ $ë ö7 Dé÷ Ôê‡÷ 0ê÷ ðÞ&fÁ¢Ó÷ zÝ÷ ß°·’Ó„wÔòwVóƒ‡ô5-÷ ØêÃåÀ%&÷ ÊêÀ¥!ô5ôUÁRÓ÷ ´ÞæÃææ÷  êÎ ûÖ ƒÃå Áä@÷ ÷à Û‡7 ¨è‡w äÄeW!€ƒÅå€÷ Å€AÁ Á ÷ 0íTÐÐÅ ü‡÷5âè÷5Úè÷5Òèô5Á÷ üì÷ Þð²èðÕˆ00.KUÿT§3eaek›’B÷ ìû÷ †Ü¡‡±‡÷ èçÁîÓ÷ rÜÀe&Á„ÒÁe ÷ üÖ‡wPèÖ ‡€Á÷ èÖ‡w<è‡÷”ÓèwèÂè�¦·è÷ øÝwLÒÁþçÀe÷ ´Öf &w:ÒÁ4Ò÷ ‚Ý€ �ã‡Þ ᱇w ãÅDÓÁÒ& f wÂç÷ ÞÛ÷ RÄ  öÄÀèÑ& ff÷ ¸Û÷ ,ö� ÷ ªÛ– N ñ– õ„ !‚æpç¦í– ‡U ‡1±o†ÿ †ß–†5&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡œê¾<±ƒ…±VNTI ±VNSY”±VNSY[²gNSY[²hNSY?±y‹OV\±ÿ~TI\±CL2²VNCLó«@GÚ†hjTXC±¥zb©ø "$ææÒÔÖØÚÜÞàâä ­,­3X ­s,w „ø÷ žÀ†ó÷ Ôð÷ ^çÅvÀÚèÀ ÁPç÷ üD÷ FÀÁ>ç÷ êD÷ 4ÀÁ,ç÷ ØD÷ "Å!Í ÷ Ô‡ðµ ÀU%@eA÷ ¨D÷ ò†èÅe åU%ãÅîÍ (Í%?±÷%Nç÷ ˆ‡Ä÷ DD· :çÈ6çÄ èÁ÷ P?ç7 çÐ ÐÈçÙÅeÖÀ çÃÐ ÁVÉ €‚ Ée·Âæ· æÀ À Âxò‚b7 ŽæÂ5Àe@Â5` ÷5¶çÀeÂ5@Àe,Àe7`æ÷  ÷ ”÷  ×-’æ÷ šç÷5€†çh· Zæ÷8æÒý· 2æ÷eNæÀ,çÂò‚b÷5€Vç0Â5-ÁhÀ ƒBBbBdBd�à ‡wæÂ@Àm æ‡@b‡Àmæ†÷Eçæöåæææòå‚ÁW÷ œèÆeÀÿÿ7¼æÂ5€!÷5èæÁ¤åÂ5@Áe2Áe?ÁE?� ÁE€� � � � � @`ÀeÀE 7`på÷ ¾÷ Âææ=ÿˆÁä ÷ ïÀeÁÒ  ýÁÒ   ýÅ,D ÷ ¦‡÷ fPÄ ýõÄ aU%ñÅN!ÅeÍ = ÷ |÷‡ðµ ýDå=lì÷úåúå· öå÷ 8÷5 æ Á€ã÷ xî÷ þï1 ‡Áaa÷ Á<Ñ H !Ð ÷ BPPÐPP ‡÷ *@Àe"AÁå÷ ºè ‡ðµðµ€¡±‡&Ávå÷ úí÷ €ï€‡À^AÁå÷ öè†Á ÷ �pp0À^÷ ¸è±‡÷ ¶ÿ@ð dDÀe"æ8Þ >‡ðµúðµö7’û7Žû÷%ɪ†ûì×-‚ûK'wD×-vûJ'w8×-jû;'w,×-^û3&w ×-Rû3&w×-Fû2&w×-:û#&ÄÁn÷ Pæ‡w Hô÷ÿÿ"û& æŽä· û¦�÷ Úî7$ãw(ãÍ �÷ úì÷ pî& íÖ ¶#ê–%÷ äú�÷ ÖìóÖ ‡æ)Pxü¬Ä"â)Ä&Ôþ¬¯yó«@G, ­ˆxC±¥>­cŒb©øFü¬³°úp@,«1zB?±y‹D5¬!™:ÿ ”òˆL"ÿ Œòˆ #ÿ „òˆ„$ÿ |òˆz3ÿ tòšš%ÿ lòš¦&ÿ dò–†5&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡00.SUTl1DATADATADATADATADATADATADATA6"Ü!4"Ü!8"rzt:"„€Ààðøüþÿ?ÿÀV"÷ jþ‡w °òŦáD„C†Ået÷ BE‡AÁ%ÿÿ÷ \ë÷ âìð5f&ðÕ"ðÅ€ð5ð50ð 0ð0ð ÷-2á‚âð5Ö µÄe¾Å áD€C‚Åen÷ hÿ‡×-fá÷5Xâ÷eZâÀª#÷ –ý÷5Bâ÷åDâ‡÷5@:âÁâ÷ žê÷ $ì7rŠþ&æÄe€Ã"÷ 䃄Áòá÷ vê7xfþ÷ ôëæ&Äe„Ã"÷ º÷5Üá„Äe°Ã"÷ ¤„ƒ‡w \ñÁZà÷ ºëÅJà÷5@¸á wrþDÄe€Ã"÷ rwxþ÷5ŽáDÄe°Ã"÷ VDÄe„Ã"÷ HæÞ!÷-àTáæ÷ 4Î ü– „TŒTŽT�5 �L’„5ŒÔm@á5Ž5e�5’‡ÁÀ÷ VýÁdf÷ ˆé÷ ë °c †0ÂeÁ÷ Žâ– %‡w ‚ð7 lý÷  ÁVÞ÷ Né7^ý÷5Xý÷–àÀ¬+÷ ü÷ RýÁBý÷ œê÷5¦àÁ4ý÷ ŠêÁ2ý÷ ‚ê÷5ŒàÁ&ý÷ rê7 ýÀh.÷ ÄûÀxßÀmnß  ƒÁV÷%jà ƒ÷ îáÄ2÷5ÔüÁ÷ tüL`Âè! ÷50àŠŠÊm$àŠÁà÷ bê÷‹žü ÷ ÷ Þ÷‹’üw�wè@? Á÷ u~õíß~@wpÞ÷ÆßrÞCÄa÷ ¾÷5Äß÷‹HüS@¤CwFÞ÷œßHÞÄa÷ ®÷ ž÷ l& ÷ ä„A~Ám¢ÞÁ w NÞ†wHÞ÷ H÷ Ä÷5lß*÷‹ðû'CwòÝ÷HßôÝÄa÷ Z÷5HßÁ ÷ ŽÁZ÷‹¾ûÁÞH · ÞA®B¤÷ ŠôÞ÷5ß÷rÝrÝÁòÞwðè÷5úÞ÷‹~ûfÅe†@ÄÁ÷ …u®õíìÝ®‡Á Á˜Þ÷ 5÷ . tj÷ T ‡Á ÷ ö ÈŒÝ7ˆÝ· ˆÝA~Bæ&Ó ÓlÞÓjÞKËm”Ý€&ÁDÞ÷ ¸ À ÀdÓ �÷ Ö S&„¶Ö j óE€ÃeÀà„ ƒ‡7 ÄúÀ(÷ pù 7 ’ú÷ ÞÄ÷ Ö÷5 Þ  ÷vú÷ ÂÄ÷ ºÁÞÝ÷ bæ÷5æÝ& ÷ NæÁŒ  Á wžÜ ÷5¼Ý � ÷ (æÁŒ  Á wzÜÀ‚ÜÁ÷ ä †Àÿÿ7pÜÀZÜ÷ ^ 7ÜD"âÛ÷5tÝÀFÜ÷ H 7ÜD"ÎÛ‡w øìÁöÛ÷ Vç7 Èù÷ ÷5HÝ÷¶ùÁØÛ÷ ‡ÅÆÛ÷ ¤ùC C÷ šó@w Ý ÷ ˆùw œù6w�ù2÷‹…ùÁÝÀÈÛ÷ @ Á w¾Û÷5âÜ ÁôÜÀ°Û÷ & Á w¦ÛÁ÷ >åð5  · Pù÷ V Á ÷ "ùu¦uf7 2ù÷ù÷ù@ ÷ úäð ðµ ·‘ûøA ÷ Þä÷6Üâø÷vÜÞøÄæÁ÷ –æ÷ Læ&÷ ºø@¢@÷‹¼ø  ÷-ÈÚÜò5 ÷ ’ø5®A¤5 ¤5~A5  ÷ : ÷ lø5¢5Ca÷ XøÀXøÁ¢ÀJøÁ÷ †À Á@ø÷  ÷ .ø5ž5÷ Bø÷ ò÷ @ ÷ øu®uœ|u~uw÷ ô÷ÂPÚÂHÚA ÷ Þã÷ Ú÷¦f ‚ ÷ ÖÂÿÿ÷ º÷µœµ€÷ ¨÷Áª÷Á ÷÷ b÷ ”÷7–÷7Œ÷÷‹–÷÷-¤ÙôÚ÷ v÷5`®5`~÷ f÷A¢A¤AA÷ ÁR÷÷ ‡Á ÷ 8÷u¦uf÷ L÷÷ "÷w ~ÙƒwxÙw pÙƒwjÙõµ‚÷ J‚÷ ôörœr÷ àö@œAž@A÷ ’‚€ì2 ‡2�÷ ,ä÷ ÐÀè!  ÷ ¢ö  ÷ ˜ö@ž@÷ ˆöw3Nõµ@÷ (4`N‡3N˜÷-ØÙ„Ø4N6À ÷ 4`N‡¡ ÀeÿŠÀ‡w Zé÷ ¤ÁTØ÷ ´ãÅDØ÷ (ð;w ”Ù ÷]žÙ"ö÷]\Øö÷Uö.÷5€ŠÙ*÷5ö&·öÁö÷ bãwöÁö÷ ªã÷ `ã7úõ÷5VÙÁðõ÷ :ãw äõÁàõ÷ ‚ã÷ 8ã7Öõ ÅÂ×Ä÷ ®&÷5ÙÄì!õ5Á ÷ N5¢ �Äè!õ5Á ÷ 05 7P`õ÷UZõ÷5ÎØõ ¢÷UFõà E   Äþÿ÷ 4÷5¦ØÄì!Á õ5Á ÷ Ò5¤ Äè!7SþôÁõ5Á ÷ ®5÷ H‡·‘Þô· X×÷-êÖ:Ø ÷ L×÷ ¾îõµ÷U¸ôA2÷ žà÷ $âð]¦ô ð]žô ÷ ®ô%w-¨ô!Ĥôô]ˆô ÷ ‚ôA ÷ fàf@÷ $Áø×÷ .‡Á uft ƒt÷5Â×PÄì!7S<ô÷  ‡·‘8ô· °Ö÷-BÖ’× ÷ ¤Ö÷ îõµ÷UôA 2÷ öß÷ |áð]þó ð]öó ÷ ô%w- ô!Äôô]àó ÷ ÚóA ÷ ¾ß¦@¤÷ |ÁP×÷ †‡Á u¦t ƒt‡ÁÁ Àæ! Á ý‡w žæÁœÕ÷ üà7 nó÷ ÷5îÖ÷\óÁ~Õ÷ ‡ÅlÕw ÂÖõµ3÷ <óA A÷ ,ß÷ ²àð5 õÕð÷ óðU Àe ÷ ó÷ íÈ ÷-öìóƒ÷îìóÈ · nÕ ‡÷U€fÖû÷ ÔìÈ õ÷-Êìäòñƒ÷ÂìÜòÈ ì· BÕé÷ ¬ò÷ "÷5*Ö÷ šò÷ ‡"´"Á Kþ!´þ!Á D÷ tÞæ ÷ ôß÷5tò ÁeÿÁEÿ  Wtüÿ÷ Fp÷ >òÀn22mh÷-¢ÕNÔ fÁ¨ÕÁmhÔ÷ r`�÷ Ø3n h2òln÷ À4hƒ‡@÷5pÕÀe”&Àeæ8÷5XÕ€&÷ ¾ÝÞ †‡ð5íðµ é÷5*Õ÷5*Õ ðµt\0ƒ ×÷ ßðµ@0 0 0 É÷ ÌÞf&æóµ ÀÀÓÁ÷ 7´Ó3ÀóÁ÷ 3 Á–Ó÷ ê7ŽÓ7¸Ôw(óµÁ ÷ Ý(Á÷ Æ33Á ÷ ¬4Àì3 t÷-öÒFÔ*ÁÀŠ÷ Ö×$‡& ó óÕ€Àe33 ó 3 ÁÁ À ÷ RÁöÒ€÷ H7ìÒF ÷5úÓó5€ÄÄeê!Á÷ ( @à÷ &ÁÀ^÷ NׇóµÀ÷ î3 ƒ3€Á÷ Ô00.[UÿT§3eaek›’3Á÷ Ä3 Àì3 ƒ„�÷ \Ýw þ@Àeæ8Þ L‡æÐïÂ5  Cµ @ðµ@<÷58Ó÷58ÓµN~÷5Ó"Â5€÷ ˆï%N®°c°c÷ Ý÷5øÒÂ5€ ÷ bïÎdï°c°c÷ ÚÜ ÷ Jï°c°c÷ ÆÜ– ²‡@`!‡‡÷ ‡‡Á @`†A@ � f÷ èî�÷ ÊîÀ ±@‡Áe? ¡ � � � � ‡¦BÂeÁ÷ Ô÷E0`Ò€‡À À ÷ 0œ<"  Áå ûÁå 4°Ø¡Œø†Á÷ ÄÓ4ÐØ‡ÀEÿÀ @ @ @ ‡±÷5€ Ò ÷5�î÷5ˆî¡‡À¶3÷ <íÀ�Ð%÷ ÀzÐ% &÷ DÚ‚ðµ "lÊmÖЇfÁPÐ÷ °ÛÀ@ÐÀe"Åe æ8Þ †…‡ðµøðµ€ôðµ€� ðµ ë÷ pÛ÷ LÛ&f ÷ ÖÙ�€÷ FÛòµ€ &� ÷ Ží€p°lò5 ÇðÅ ð5À÷ Û÷ öÚ&fð5÷ rÙ�€÷ âÚ&ð5� ÷ $í€ð5p°lw ÿp°lwÿÿ Bß–†5!€@@€@ € N@(B*D,:.¸"$�"¢"  "¤"~„Ž""~ ~x<°":”"³"p»"’"½"€D®"¦"¨"Šˆ"¶" ´" ¾"zXÊ"úÌ"üHæ4îRð "èTêxòÐìPôª"ö¬"ø6úÈ"üÆ"þÂ"Ä"÷5Ðßkw dïÅNÍm†ÞMeÀ`êÄxÞÄmxÞ !‚D7hÞ÷í†ÞbÞ`ðð•#÷ žê † ô�Á÷ á÷E|ßAà €¦ÁY÷ á‚ÁàÜ ¦÷ Ôç÷ Zé‚Àe�����Á÷ ŽûE€ ÷ ä7°Ý7ªÝЕÿÄ üÅ ÁÅ Á üÁ `�Àz&÷ Tú÷5ß÷m¾Ý¾Ý‡À†Ýðm²ÝðmÆÞ÷5àÞðmžÝ˜ðm²ÞšÁjÝwÊèw `î7 ¸ñ ÷5€ºÞÀÎÝ7ðû7ôûÅLéEbÄ®"ÌÃÜ!ÂÁ…0ûLPù÷ šÞÌU ÷ ÝÌU÷5xÞÌU÷5dÞÌU÷5`ÞÌU÷5LÞ ÀÝÀm\Ý ‡7 ݃À ÝÀmJ݇7 ö܃ŽÁ"÷ ¼fÄÊ" Ã"ÅÞÂÁ…0ûLPù…7<ûÀÎÜÀm Ý72û7 ,ûƒ7&û÷5 äÝ÷5ÜÝ÷šÜû÷5ÆÝ À˜ÜÀmÖÜ7û÷�Ü û÷mÈÜûæˆ"æ=ÿˆÄŽ" À ÜÀ À Àe>7Öú7`ÐúÀŠÜÁp `AW  ƒ÷%|ÝW ƒÁV÷ Á\ÜÀ÷ ŠùÁeÁm–úwŠúÁe w`€úÁeÅ5` d÷5€.ÝÔeÀÔm<ÜTÔüÛÔÜÛÔôÛÔîÛ   Ô&Ý÷% Ü Äš"ÔÝÔÝÔÝÄ "ÔðÛÔøÅ5€ôUþÿÌÐÜÌm�Û7ú÷åúÔmÚÛ÷ ¶ ÷ >Ô¨Û̦ÛÅ5÷¬Üô˜ÛômŽÛþÿ ÄÂ"÷5†Ü ž÷ ÔvÛ÷�zÛÀù÷�zÜ»ùæ&)Ä~÷ Ä„÷ ‡$Ì ‡÷5DÜnæ *7 ï7 (ïÀôÚ4Å "À 7ï÷æÚþÛ7 lù÷ ‚÷ Z÷5Ü÷Ü÷•OùÅ "÷¾ÚÔÛ7 Bù÷ X÷ 0÷ äÛÅ€"÷(ùÈî÷eÂî7 ù÷ 6÷ Åè$÷¦Ú¬î÷ ¨î7 ”Û7 ù÷ Å>%7 öø÷%¬Û÷àèø7 zîCDÄ5ÄEfÄmÊøÁ÷ LÄeÎ öÖ ê‡Å`ECfÓ Å ÄÔ& ÎÔÀÀ À Àeü&A÷ €Àe÷ Î ïÖ …âÅZÄ E'õE@CÃeæ÷5@>ø Ë% &ó%„(ó[qæÁÄe÷ ´Î ø– CÃe³Ö×-ÈÙ÷ ÐÚ÷5€¼Ú À”ÙÀå7¾÷ÀØ*÷ ìõ÷ à‡À¬÷Â$Ù� òµ@÷e”÷÷ R‡Ìe?ÌE?  ‡÷ øÛ÷EVÚÀöä÷ Ìå‡Áå÷ >Àe"÷ N݇ ñµ±ñµ€A÷ ’â@ñµ Àm$Ù¡‡fÁîÙ÷ râ�‡w Žé÷ 6÷ ü ÂhØÃbØÄ…”�  †w2÷· ¶ì÷ Ä õà ð÷÷žÙ‡÷ žì&ÀRäðÖ"ðæÎ"°4Îe°6ð•(ðÜ$÷ å÷ l€· Öö7 Zì‡÷µ@`ì ÷‹YìÂ2 ^‚2 b‡)2 P‡2 Zƒ÷-Ðײø ÷ÈתøÂÂ×Âe ÁwÀÚ‡€ìP· Žø·ˆøÂÂ÷ îë÷ pø€ìT· hø·bø  ÷ Ìë ÷ Nø7 @ø‡7 <øPƒ÷ ÿ·8øæN÷ 4øÎTŽ`ÂUÿ·øÂEÿ·øÂ‚ ‚g‚ ·úõ· ~ë&f €Á÷ ÔôÀm×ÂÁ  üˆ°ˆÀ÷ |À ãðÖ"ðæÎ"°4Îe°6ð•(ðÜ$÷ Æã÷ $�€Àí”÷p�Ö"‡f&÷ ®þ€�€ Á÷ ¢þ‡ ‡ææ)ÿˆ÷Šl÷‡`Á÷ ŒÙÀÖ"Á Á ý‡w vç7 F÷7 D÷Á÷ |7,÷÷Ö"$õÀð-÷ ó÷ úýÁÂ÷À*÷ ‚â7 ÷7 ÷÷øôx×÷å00.cUTl1DATADATADATADATADATADATADATAr×À0âðèô ÷ ã‡w ç&÷ H„÷5n×÷ ‡ÂÆôÅòÕaC¢|w˜´ô· °ô ÷ ¸ö7÷¤ôžô÷žô×÷ ×· ¢ö,ÂŽôźÕaC`w|ô· xô ÷ ~ö÷lôfô÷fôàÖ÷ ÜÖ· höÅ · ÖéR”„ — Ö$÷f÷ ‚�òà ,&Àtáð2öðæÒ"°4Îe°6ð•(ðÜ$÷ 0â÷ Žþ€· üóÁúõÅÃ%‡ ËÃåÅÆÄ ÄU?„ àa·Ðó— Ö$‡÷ ·Âó‡÷ žüÂÖ"÷ `þ‡ÿ àä–†5év~ ­ø1±o†ÿ þ÷æà÷æw °ö÷5ç{7 ŒýÁ€ä÷ xï7\ý÷5Vý,÷%òå(÷ Vå×-ìæ‡÷5@àæÁÀæ÷ DïÀeÁö÷ Ôé†&Á¦æ÷ *ïÀe"Áò÷ ºé†�pÀ<ç÷ Šî7 xù7 ¨æ ÷ýý÷ýý7` ý&Å÷ € r € 7 fæí#ÁFæ÷ ÊîÀe"AÁå÷ Xé‡ðµðµ€÷ ¢îðµ Ám6å ‡À ÷ ÷ ŽäÀòå÷ Þ÷ @ ÷ H÷ ¶÷%òä÷5Fü÷5>üÀ÷50ü ÷ 0*Á°å÷ ð÷šåšå7’å ÷5ªå¤ÁeÿÁEÿ@` Á÷ øÁ € Àmbå7`å÷ \åÀð÷ 8ð‡Á`÷ ç÷E^å‡w òôÀðã÷ .æ|%Þ ‡÷ xûwzÅ<E BÒ Ò ú�Áa÷ Âæõ‡7 :å‡&÷ ¢�÷ „í7œþ÷€7 ð÷7 î÷w ää ÷°ãÞ÷÷ªãÚ÷Àmüã7Â÷7º÷7Ä÷w Àä ÷mŽã¸÷÷5Ää÷m¼äª÷·l¤÷÷  ÷÷œ÷–÷ò  €~Àm¸ã7z÷€lÀ 7z÷÷5Šä)€œÀmšã7b÷€l¢w bäÀm0ãÀmhäÀ 7T÷€®Àmvã7:÷€l¤À 7:÷w 8ä ò ¢ò ÷"÷$÷·ä· ä÷5$䷘䷚üã÷möö÷÷mòöþö‡w žó÷ÿÿºú& æäã· °ú¦�÷ 0î7zâw~âÍ �÷ Pì÷ Æí& íÖ ¶#ê–%÷ |ú�÷ ,ìóÖ ‡w Fó÷ 6÷ ü  âÃâÄ…”�  †wLú· nö÷ Ä õà ð÷8úVã‡÷ Vö&À îð8ðæ0°4Îe°6ð•(ð>÷ ¾î÷ l€· ðù7 ö‡÷µ@ö ÷‹öÂ2 ^‚2 b‡)2 P‡2 Zƒ÷-ˆáÌû ÷€áÄûÂzáÂe Áwx䇀ìP· ¨û·¢ûÂÂ÷ ¦õ÷ Šû€ìT· ‚û·|û  ÷ „õ ÷ hû7 Zû‡7 VûPƒ÷ ÿ·RûæN÷ NûÎTŽ`ÂUÿ·2ûÂEÿ·(û‚ ‚g‚ ·ù· 6õ&f €Á÷ ªÀm¼àÂÁ  üˆ°ˆÀ÷ |ÀÂìð8ðæ0°4Îe°6ð•(ð>÷ ~í÷ $�€Àí®úp�8‡f&÷ ®þ€�€ Á÷ ¢þ‡ ‡ææ)ÿˆ÷Іú‡`Á÷ DãÀ8Á Á ý‡w .ñ7 `ú7 ^úÁ÷ Î7Fú÷8>øÀ8$÷ hý÷ úýÁÂ,úÀ*÷ :ì7 *ú7 (ú÷ø0á÷å*áÀèëðø ÷ ¸ì‡w Îð&÷ H„÷5&á÷ ‡Âà÷ŪßaC¢|w˜Î÷· Ê÷ ÷ Òù7÷¾÷¸÷÷¸÷Öà÷ Òà· ¼ù,¨÷ÅrßaC`w–÷· ’÷ ÷ ˜ù÷†÷€÷÷€÷˜à÷ ”à· ‚ùÅ · ŽóR”„ — 8÷f÷ ‚�òà ,&À,ëðLùðæ4°4Îe°6ð•(ð>÷ èë÷ Žþ€· ÷ÁùÅÃ%‡ ËÃåÅÆÄ ÄU?„ àa·êö— 8‡÷ ·Üö‡÷ žüÂ8÷ `þ‡·Þø7 Øø÷€Ðø7 Êø7 Èø7 Æø€ÁvÞfj&�Ž÷ ~±‡÷ >è6¦vwRÞÂFÞ7BÞ÷‹Šø(Àe"ÁFàÁeB$$$ÀåÁe((ÁÞ·<Røw<Jø  w<@ø÷ ÷ ÷ ÷ .øw<$ø·‘"øð•#÷ Hê†`Á ÷ Èà÷ ò÷%òÞWñ5@ñ5 O€f &�F÷ tç6¦vwˆÝ7|Ý7 Ê÷÷ ¾÷*7<´÷&ð5@ ÷‹«÷÷ ª÷•Ÿ÷ ÀTßð•ð•÷ Öé‡÷ °é†`Á ÷ (à÷ „Þ ÷ Ê�Ž÷ hè·Ž ÷ R÷ fÞ ÷ ¬�÷ LèŽ7Š5÷wvþ÷ *÷ ÀìÞ7+D+P+\+j+`,„,´,~+/ˆ+þ+,à,˜+ -- -*-0--&----Î-È-//‚-Ž-¼-ˆ-w zë7 �ÿ7 ŽÿÀ()Á Á ýÀXÚð5· tÿð5· fÿð5€· ¦Û· Pÿð5· Fÿ÷ öýÁôÙ÷ úã÷ ìÀÚ÷ Tö÷ Tþ‡÷ ŽþÃå  ƒ7 @ôÀ%ÿ‡À%Éíƒ À ø 8)è÷5@Ûv÷ ^þÃåÂ)òµ Dòµ €lÀm4ÚÀå7 þ÷ îýÁ)÷ ¾þW, ­W,s, · ®þ÷%¨þ÷ þ÷% ˜þ÷ T÷ †þ W, ­ W,,÷ &Ù÷ d÷ ‚÷„ à ʇÁ[Â>Û‚`÷ .Ü÷5ŒÚ÷ hý7þ÷ `ýÃåÄmþÀþýÀE€ÿ ‚À Å)ø F)à ç‡wæ7 2ó‡÷ lý&@A÷ 8‡ÀmPÙ€et÷ Òs÷ LýáÀåk÷ ÀáÀåg÷ ´&÷ .ý€e^÷ ¦&÷ ý€eáÀåT÷ ˆ÷ æQ÷ ~÷ ÜáÀåI÷ ¶&÷ òü€e&÷ 4Ø'÷ zýÀ€ýÁxý÷ Ô÷ÀtýÀeÁjýÁe? ¡ � � � � ÁeÁE� � � ‚ B B B �P÷ ˜÷€÷ ÷ f&÷ ˆü€e ÷ ö÷ T&÷ vü€eáÀåÃåæ’#÷5€ÊüÎH"À5ÿ � &¶×Âe Á÷ ´Ú€^÷ ¦÷ v&€÷ Þó÷ üÃå€eÀå7~ü‡÷ ü& Ãåõµ @A÷ ʇÀmâ×€eÀå7Nü‡ÁÒ×Ámv×÷ ÐöÁ€×÷‹�ëÁx×� Ám´×Àew²ö¦)‚·üÆå0·&ü÷ ^ûà  ‚À ø h)à õwú‡ Šd2Ê J ‡J ŠD,�ŠDb@ŠT&æ²0Ò ¦ÂÈÖÂe ÁH÷ ÆÙ‚ â æÜ(�€ €€ J Þ Ò € · ¤ûƒ‡· ‚û‡w„‡÷ Ž÷ Æ÷ Àúà ÁjÖ1 ï‚AÀ À `A÷ ~÷ º&÷ Üú€e÷ ÔúÃå"Ó áÊ倷 (ûÓ†–%wLþ·Ô7Š�ê÷5„×ñµ€·ŠmêÀ) P ý‡÷ jÀe÷ lÚv‡ÂðÕðµ ¦÷ ´ß‚@ñ5 ÀmDÖñµ  ‡À4ÖÁ¨Õñ5@(‡¡ñµ€ ñµ fA ÷ Rú@€e±‡÷ �ú47 ¸ï÷ ²ù#‡÷ îù æ¤ï÷ àùÀE€ÿ ÷ Òù ù¬÷ Èù sN Ö 7 |ï÷ vù‡7 rï÷ lù؆w÷mdï`ï·ã\ï·ZïƒwÞûwü ׂ`Á÷ ø×¦÷ ^÷ ÌÒ*‡Ö  ñµ#ñµ€A÷ ¨Þñ5ñ5 ñ5@ @@ñµ ÀmÕ‚‡÷ ù7šù÷ ù7”ùÃå÷ ”ù ÷%1±‚ù÷%o†|ù÷mÐÕtùÀXÔÁ)‡Ö ÄJÔ… Á÷ Þ÷ ¢ßÁðµ ðµ ðµp`Å ê‡Å ÔÂZ‚µ,ùµ,õò €ÀÕÀÕ‡· ù÷%ù÷úø÷%ôø÷ ìø7Á¬ë1Ô÷e¢ë×-žë÷ Ìø(7Îø%÷%Âø ÷ ºø· ´ø÷ ®øÀÅ€÷%¤ø7¤ø÷%–øÁw`’ø÷% „ø7†ø‡÷ ø@‡w ÀëÀÆæð5bwD÷%ÛwBÄôÛ÷ Þö7Šóî÷5öÛ·ŠçîÀÚÅ)ÍÄ7jÿ÷5dÿÍÄU`ÍíŒÚÄEÿÄQÀŒ÷ òÍ÷5¬ÛÍUÕm¼ÚÕÕ Õ Õ÷ üÙ ó 7äñõE€ôÿÕÚñ ÕÕ ÷,XÛyÀ�÷ ”5þÿ÷5PÛ ÷ À�÷ |Àe5þÿ÷5ÂþcÁ÷  ã÷5@,Û÷ ŒÙÂ)p ÁeÁEp� � � r÷ &rPÁ Á ý õmÆÙôÿ÷5ÖÚ4Á ÷5Xþ,÷ :ã÷5@ÆÚ÷ &ÙÂ)p ÁeÁEp� � � ÁrP÷ ¾ÁrPÁ Á ý õm\Ùôÿ÷ $ÃÅ)÷ ´ÃA÷ ÊâÀeŒ÷ Š÷ føÄeà ð×-BÚ.‡Ã÷ €÷ <Ú'÷ v÷5ªýÃ÷5ÚDþÿÃ÷ RDöÿ÷ ”à ÷ B÷5èÙ÷ €Ã ÷ .÷5ÒÙÃe÷ ÷5ÂÙ7гìÀLØtpÀ„÷ ä÷5¢ÙÀ°÷ Ò7 ýÀ,Ø÷ jô÷ î ó5ÀÀ  áÀå7ðÀå7ðÁlwôïÁ ÷ ÈáÀeŒ÷ ˆ7Þïó5ó5ó5÷lÀï·à¼ï÷l´ï·à°ï÷5Ù÷˜üºïÁ÷ �&Ĉü·ŠïëÁ÷ î÷evü7ŠÝë„EªÁ÷ dE£Àb×nÀ€÷ úÀV×÷ ”ó÷5°Ø7Š¡ë÷ ÁwZï÷PïÁ&÷ EñÀ$×÷ bó÷5~ØZÅ<EVDÔ ú�ÀüÖ0%õ0%òÔ5ÁåÀe"÷ ZÛ.‡ðµ€ãðµß%ðµ ÌmB× l÷ . ÷5Ø7Š ëô þÿ·ŠÿêæÀ÷ öÃeÎ øÖ õU€¹÷5@ì×Ì%J©ô%ø‰ñÁ`÷ fÙë‡ÀmVÖ&÷ 0àÀmÌÖ‚€e‡ÄeA÷ Âõà ø‡A÷ àÁ) ý óµ ÁŽÖ‡fEÃ÷ ºÿ…‡@ÀmtÖ5À @ @ @ 5�‡÷5B׿ÃÎÕ÷5ÂúÕ˜ÕšõíèÕþÿÍœÕm4ÖÕžÕ ÷, ×5 þÿƒ‡fEÃ÷ Jÿ…‡÷5ìÖ& ÷ Vß7ŠÓéð5€·ŠÇ逇ÁmâÕÁ A A A ‡ ­,­3X ­s,w Þë÷5>Ü÷•-ï÷å²ò7 ¸ÿ7 ºÿ7 ¸ÿ7 ¶ÿÄ)÷ h7 ÿl 7–ÿ&fEjEA÷ jä÷ `äAó�� "$Á ûì&õ5÷ `·eNÿáÖ ÀôF÷ (ä&÷í¶Û8ÿÂ)Òà÷ ÚòE€þÿœ÷ RÒ ÀeÐ 2…Dm&÷ à€œÀe …¦÷ ÊÙ÷ 8à Ð Dm&€÷ R€ì€„÷ RÖ €¸Ö ‡ÁhwºÜ÷ ¬þ¦Ä )À÷ Hw˜þÄ$)À÷ 8wŒþ‚÷å~þ÷å|þ€ð5 LÄfþÄíÞÚ&÷ <Å)€÷ b€Â)     Ä2þÃÅ)÷ À)ÐàPHìþÿ�  Ðþ00.sUTl1DATADATADATADATADATADATADATA ÷ ÜØÐöýÐøýPPÐèý„ÃZÚÅ)÷ ÊwÒþ …Dm&÷  Ä$)÷ z7°ýfEjEÁhw¬ÛA÷ €â÷ vâAï�� "$Á ûèõ5 ‚µ,µ,7lVýÖÖ €æVý÷HýPý÷ V·Hý…€ @mÀeÁ,ý÷ ¸÷w þ Äý÷ òײüÿ ÒrTÒ,` ÃrÙÅ)wâÅ)œœu�÷ Àuõ‚ u u ÷ œ×C ÃeÃEõƒ ƒ ƒ ÄP7¤üõ€5 5 5 õ�üĆüÃwn&Áð÷ ÷€Àe&Ábü÷ òö€Àe÷ æö‡&÷ l �å‡ÁšØ÷ áÀeÁå÷ ªÛ‡‡Áhw(ÚÁEÿ�    ‡f ÄeA÷ �öà ø�‡A*÷ ÔàœÀe5"5,$Á ö‡ ò  ð¶û‡ð®û‡&Àšî°-ÔÀåÀ ø7 „îÔÄmô×ÖÔÀe &Árû÷ ö€Àmä× ö€‡ dêì  w Øö÷ PÀ ÀBÀå74ûÀÊç÷ ïÅpÍ5@2À¼ç÷ ïð•#÷ ò †`Á ÷ �èÍE@ôµ 7�"ðú÷èúæ|ÿˆ7 Œ÷Òú÷5 Äæ÷Äú÷ J÷ >Àî÷ ‚À,÷ zÍ5@ ôµ÷žúæ|ÿˆ÷ øw,w öÀåÀeæ8Þ ‡ðµúðµ ö0ðµ€0 ÷ Hðê‡w Úõ÷ Ú÷5@6æ)ÀÌä÷ Ä÷ Â÷5"ææ8À¬äÀeÞ ‡ðµ÷ vî÷ üï0ì0 îæ¤!Þ ‡÷ †ûÀräð d Âe¦¦ dÁœ÷ ^çž÷5@ºå÷ ‡÷5´å À:äð d÷¨ù÷¤ùæ|ÿˆÁò$÷ ÂÁŽÉ ÷ ¤ç÷~ùæ|ÿˆ‡÷ Øí7œRø€7 Dø7 Bøw 8å ÷ä2ø÷þã.øÀmPä7ø7ø7øw å ÷mâã ø÷5å÷måþ÷·lø÷÷ ô÷÷ð÷ê÷ò  €~Àm ä7Î÷€lÀ 7Î÷÷5Þä)€œÀmîã7¶÷€l¢w ¶äÀm„ãÀm¼äÀ 7¨÷€®ÀmÊã7Ž÷€l¤À 7Ž÷w Œä ò ¢ò ÷v÷x÷÷mj÷v÷÷mf÷r÷‡÷ žø Àß”ø· �øÀ å÷ xï †ð¥öÿ*± `Á ÷ æå7hø7bø‡÷ ºÿ&÷ ´ÿÀ€U‡w Àó÷ÿÿFø& æä· <ø¦�÷ Rî7œâw âÍ �÷ rì÷ èí& íÖ ¶#ê–%÷ ø�÷ NìóÖ ‡·ú÷7 ô÷÷€ì÷7 æ÷7 ä÷7 â÷€ÁBâfj&�Ž÷ ~±‡÷ ì6¦vwâÂâ7â÷‹¦÷(Àe"ÁäÁeB$$$ÀåÁe((ÁÜá·<n÷w<f÷  w<\÷÷ ÷ ÷ ÷ J÷w<@÷·‘>÷ð•#÷ î†`Á ÷ ”ä÷ ò÷%¾âWñ5@ñ5 O€f &�F÷ @ë6¦vwTá7Há7 Øö÷ Úö*7<Ðö&ð5@ ÷‹Çö÷ ª÷•»ö À ãð•ð•÷ ¢í‡÷ |í†`Á ÷ ôã÷ „Þ ÷ Ê�Ž÷ 4ì·Ž ÷ R÷ fÞ ÷ ¬�÷ ìŽ7ŠQöwvþ÷ Fö À¸â7ùÂ�Ê%Á *÷ ,ùÁìÓ ÷ âÞ÷5bÖÁUwpû ÁÐÓ=÷ ÂÞÁEÿíÁ5ÁUÃâÓBÁ@ƒ@ÁP+ÅZ2ÄÂ0%A5ÒR w=þÿºÓƒ U%Õ òeþÿò üÿU%Õ Ä èò üÿÁí*— �%† Ò&.ù÷ ˆøÂ0%ÊÎÔÁM-÷ xøÂ0%À¦Ô÷ TÁ -÷ bøÂ0%ÀŒÔ÷ >Á,-÷ LøÂ0%÷5�Õ'ÀˆÔ÷ "÷†úˆú÷‚ú„ú÷‚ú„ú÷~ú€ú7 vú7 tú7 fú7 dúÀRÔ÷ òÂ0%Ò|*Êx*Á‹-÷ ô÷À4Ô÷ ÔÁj-÷ â÷÷5*Õ ÷-,ú2ú ÷-&ú,ú÷-úú÷-úúÂ0%÷5üÔ Ò|*Ê€*Á¸+÷ œ÷Ê|*Á—+÷ Ž÷ÊòÓŠÊm¨Ó÷5ÌÔ Ò ÊÞÓŠÊm–ÓÁN+÷ h÷Á1+÷ ^÷÷5¦ÔÒdÓÊ|ÔÊ ÷5¬ùÊpÔ÷ ÒöÁÞ-÷ 4÷÷5”ù ÒVÔÊTÔ÷ ¶öÁ.÷ ÷‡Êt*Á ÷ $ùwXù÷mTùZùw Tù÷mHùNù‡¦Á´Ñ ÷ ªÜÀe‚Á Á ýÖ ‡×-Ó÷ ÈÿÁl,÷ ²öÁ¦,÷ ªöÁŠ,÷ ¢ö÷þø÷5 äÓ÷ðøÀž1÷ ªï‡w hãÀfÒ÷ ^îÂ0%÷-ZÒªÓ÷ÐÒ˜æÒ”æÊšæ²"þÿ †ò‚æþÿʆæ²"þÿ†Ò   ÷ ÒõÒ Ê˜øÃ¨çÊmŽøÃ üÊ%\Ê\Ò ÀúÑ ÷5XÓÁ",÷ ö‡Ò ÷-âÑ2Ó÷XÒ"æÒæÊ$æ²"þÿÒ   ÷ jõÒ Á<,÷ Êõ‡-AC,-AL,-CM,€-CP,-DA, -EA,@-FP,-HD,-PI,@-PM,-PR,-SE, -SL,€-TR,-MU,-ID,00.ƒUTl1DATADATADATADATADATADATADATA%N*** Root segment: %2R%3N*** Segment: %2R%3NR-O mem limits: %P %P %P %U.%NR-O mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NR/W mem limits: %P %P %P %U.%NR/W mem limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%2NDisk blk limits: %P %P %P %U.%NDisk blk limits: %P %P %P %U. I-Space%N%17S%P %P %P %U. D-Space%N%2NMemory allocation synopsis:%2NSection%44STitle Ident File%N-------%44S----- ----- ----%N%2R:(%VA%VA%VA%VA%VA%VA %P %P %U.%N%30S%P %P %U. %2R %2R %X%N%3NGlobal symbols:%2N%F) w 0è÷ û×-’×÷�ìBøÀ× ÁÙ*÷- ×\ØÁ¾*÷~×Fë÷ ûÁîÖñ5-ÁP+Ò.ëÊ4ë²"þÿÒ  ÷ |ú÷5.ØÁp+Ò ÒëÊë²"þÿÒ  ÷ Tú÷ ºú÷- Öð×÷-æêèêÒÔêÊÚêÁí*÷ 0ú÷5â× Á +Ò Ò¸êʾê÷ ú÷ |ú÷5Ä×OÁRÖñµ@Iñ5JŠ@JŠ@¡Ò   ÀeÿŠÀÀ `÷ ÂùÁ³+÷5p×#ÁþÕÒ ñ5JšŠ@¤J˜Š@ž¡Ò   ÀeÿŠÀÀ `÷ tùÁÓ+÷ ÖùÁ,÷ ÎùÁ7,÷ ÆùÁW,÷ ¾ùÀœÕ÷5×Àe”&Àeæ8÷5êÖ€c&÷ PßÞ [‡ðµ÷ :ßÂ0%÷ æø·,üÿb×â÷ ˜w´û ·°ûw®ûÁµ Á5 òm¦Õþÿ7Šû  ·†û’Áw,7 ‚ûð ·Šxûðµðµ ·Šeû÷ ùæž!Þ ‡ÀÖÔ÷ rùÁBû÷ ¬Þ÷ 2àð4û0ìð(û—÷ ä‡w ®åŪ1ÄJ’ p5ÊRaU%U%Ä óú%$$þÿò øÿòÏ,þÿ² üÿ‡„þÿô•)‡w dåF�… Â0%÷$¾ú;Ò¶úÁ¾úÁµ Á5 Á5€ €Ážú÷ túÁm˜úRòmžÔþÿÊ÷‹ŒúË ’÷‹�ú÷bpúÀøÓð5€  ÁîÕ÷ š÷Á›,÷ ð÷Ó Å ½‡w ÌäÀÂÓ7 ,ús&æ*éÎåÖ-Öô�÷éÎôÁ¶,÷ º÷€Àe"æ8÷ Ú÷úú÷öùú÷òèüùÅ”*Ć*Þ ••UÔäù÷íàùÜù�Þ ÷ „ü‡÷ Îùù÷ Æù ÷¶ùÀùæ÷mºù¶ùô²ùþÿæpĦù”*ņ*÷”èšùÃ0%Í Þ ‡÷ <‡¦Â÷ Öøƒ‚Õ ¢(â î· ôÄ ÷ fùç÷ ¾öÛ÷ ¸ö– ÷ Hù¢– ‡¡ðµðµ€ðµ€±‡w ¶ãÄ"èÄíÒóÄèÄå Á èaÁ ý·ùÃúøƒà�7ôø÷ìøôø  ÁìøÁíâç�‚ ú‚ ·Òø÷Ìø‡RO,RW,€D,I,@GBL,LCL, REL,ABS,OVR,CON,SAV,$$$,%2NFile: %X Title: %2R Ident: %2R%N <%2R>: %P %P %P %U.%N >>>>>>>>>>>> Undefined reference: %2R%2N%7S ,R+,T,T,T,,†+ˆ+š+œ+ž+ˆ+,ˆ+Z,w ôéÄèØô5€wúÀâØ÷ Úô÷ <÷ ¾õ‡÷ øõÃå ƒ À ø ò*ðÄz*Å÷ ØõÅ ûÃåÁx*Bœ— J‚ ÀˆØú +à 燇Àe÷ òÜ<‡Áx*wþ‡‡ñµ Àe"÷ ÔÜ ‡ðµ÷ fñµæêÞ ‡÷-:؈ÙðµõÖ Ö Àx*÷ ‡÷µˆþÁØñ5‡‡%ÂÚ‚`Á÷ òÚÖ Äâ×&Ž Á÷ ´á÷ :ãÁðµðµ p`Î îÖ ‡7 >í‡Àe"÷ ܆Àx*÷ ˆ‡÷ lûÁžÙ÷ JûÁ„×R RRR Á„*÷ Œû‡f&÷ >û÷ÔìÐý€Žðµ÷ ,á‚�÷ Øú ’J÷ ‚úÁª*÷-DÙVø ×-Pø¯÷ Pøw4û·Š;ø‡&Áª*÷‹/ø÷ û÷ Öú÷lìhý€ ÁÄ*÷ û‡Áª*&÷‹ø÷ ðúÂ>ý÷ ò÷Áî*÷ ÞúÂ0%€÷ ˆü· Ú÷·ý÷ ý÷ ~ú÷ìý‡t%òº~V&"&L'L'L'L'F'f&’&”&–&˜&’&J'–&–&w ï÷ þ÷ îú‡÷ (ûÃå ƒ À ø Ú%ðĪ%Å÷ ûÅ ûÃåÁ¨%Bœ— ‚ À¸Ýú è%à ç‡Âºß‚`Á÷ ¦à7Hÿ7Dÿ÷•Gÿw:ÿw6ÿ×-ìÝ÷ ª‡‡‡‡Â´%RRBœÂÅ×ÿ·�ÿ÷ 6ÛG‡Dœ ŵŵ€÷ çŵ ÂmªÝ·ØþÄ &ÅÅmÿwÑÎþŵ€·”ÞÞ †7 ŒÞ÷Å€¶þ7 €Þðµ€ððµìðµ ÷m`Ý�þ÷-ÞÜ,Þá– 7Š…þÁ´% ‡Ö ‡‡7 Fò‡À�Û°p°÷ °é†`Á÷ ˜ß‡Àhœ%ÁÁ ý ÷5 àÝÊÁ–%ÂÙw fíÅpÍ5@bÍ5@VÀÀ%Á\ÞPHPJPLPNPPPVPXPZP\Pœ^ŠÍ5ÈÕÀeÐÜÐ�ÜŠ@÷ 2è†ÍE@@3ÀÖÚ÷ Påð•#÷ \è7P¬ý †ÍE@`Á ÷ ÒÞ÷ 6ÿÀt(÷ þøÀšÚ÷ æç‡À–ÁÀ%÷ Èè À´ÝÍ5÷ °è÷ Äç‡w ’ìæ¤!Þ ‡À~Ûð5€ø÷ jýõ‡00.‹UÿT§3eaek›’ù¬sNÿ  úx|1±o†  ­,  ­s, ­,ÆÎÖÞæ  ­3X     ­s, ­ø�wµW^"b"~"ê"ò"w èùÀìô÷ :òð•#÷ Fõ†`Á ÷ Æë‡7bŠÿ÷5„ÿ÷50ê÷5tÿ×- é÷U ê÷UüéÁÞé÷ 2ôÄZTTÔ ÀNÔ ÷ PèÔJèÔHèÔÁ¢é÷ &òÀe"Áø÷ ¶ìj‡÷5ÿôm¬èþÿ4Š7 \þ÷5êþ ÷5‚é)Ã÷ &÷ D· <þ÷5 jéTTÔÕR÷5¶þôÕ ÿÿÔ•T÷ ×-:è÷ ÷ dÄZ÷ ú÷ Ø÷ øÁ,Â÷ ÷50é×-è÷ ÌÁâè÷ àò×-öç÷ ÊÁ.Â÷ ÎÀvó÷ –ó‡Âb÷ bêÄZÔÔCÃetÃ5Á÷ ñÁ”A ñ û1,÷1,ëòÔ œŠ÷5Ôýôm€çþÿôÅ üÿ ÷ ÌðŒ÷ ÌÄ%Ì ‚æ^!ÁZBà÷ („‡ÁD@Àe÷ 2ëwöü7 üDÄet=Ãj÷ xð+&  ÷ hð+Œ�÷ ^ð÷•ìûÎðµw ¨ü ÀFÁ Î÷• ÀûÁT ÷  Â ÷ ˜‚÷ ’÷e†ûÁÁ~ç÷ |ñÀìwnw ÷ÅæCÄ®TŒÌÌEoÿÌU`ÌÍ5Ó ÔTÔTÓ ÜÔæÀ ""Á Ò ­Ê,÷ ¨ï<ŒþÿÎ í– Ó ÔÔÀ ""w-çÒ­Ò3XJ�ÄçÁ¢Â ÷ æÂa÷ ÜÁÂÂ&!†Âå÷ Æ÷-h叿÷ ØæÀ”Á˜ÂD�‘ˆ‰Á‚ ÷ ˜Â÷ �õµ4ÃôS�A÷ øî{ÂR�ÁJ�33ómHå3 3Áè ÷ <Â÷ 4Â÷ ,ÁÂ÷ ‡@÷5 æ ÀeæVÂLÞ ‚‡¦÷ ÷Àe”&€&÷ fî÷ ö‡& ðµ÷ Jîðµ Ö #w~úÃ0Á  ýóµ€óÅ 3 3 �4Šóµ@ ÷5òú÷ Xúw6Á ô•÷ æíð5ó÷ 8úð÷5Äú÷5\å÷5 Tå÷ ü~‡@Àe"æVÂRÞ ‚t‡¦4Šðµ€÷-Øùˆãð÷ ˆíðµ  ðÅ ôÕ7, °ùÝðµÙÂeÁ”A ñ û±"ø±,È󔔌ÒÔÅ“ÿÔ•÷5ú óµ ó äm¶ãäE %óµ ÷ ã÷5 ˆä÷5€äëôìþÿ÷ D˜÷ ðâúô5üÿöÊ5Ê5 ðôUüÿì‡Á”Añ ûTTÔ•@Ô• f÷ ø�í‡Á÷  7zùÀÁæÂ ýÁàÂ÷ æÀˆ#÷ ÒÀ’!÷ ʇw tóÀjâ7`ù7\ùÀbâ÷ @wRùÁú ÷ ¨÷ ²æ&Þ I‡÷ ä†wB÷  7 (ù ñ÷ ÚìÄêø÷ ÷ ú  7 ùß÷ î÷ öø÷ ˜�ùÔ÷ äø÷ †�÷ ~�Àå7œøW!i‚Å gý êÁˆøBà÷ ·‡wÆ÷ 8@÷ ’€÷ ŒÀ÷ œwª÷ Ú@ ñ5 ñ5 Åîá@a÷ \@@a÷ R¦ÂPჃ ‚·$øÒ à ú&€÷ .€÷ @÷ À÷ 0w>÷ ,w6÷ ÷ ¸�÷ Ø÷÷ Å ÷ Å úwÂúâ‚`Á÷ æãÁÁePó ±PPÔЕÐ Ä%Ð ‚æZ!ÁXBà÷ „‡À¨ìp°÷  í†`Á÷ ˆã�`‡w ~ñÀtàÀeæ8Þ ‡ðµúðµ ö0ðµ€0 ÷ ®ëê‡Ä8à&Ž Á÷ ê÷ �ëÁðµðµ p`Î îÖ ‡�À�À‡Ï ÷ ¤÷ Èö�‡&÷ –÷ ºöÎ úÖ ‡Á®ö÷ ØÿÁ ü‡÷ ¸÷ ¾ÿ7îõ÷ ¬÷ ²ÿ7äõ÷å„öÁ0‡&÷ ÖÿÀžßÀe÷ ä=‡wjö Ã’ßðµ  ƒwNö¦÷ Pé‚€‡&÷ ”ÿ÷ BÝ ‡Ö   ðµðµ€÷ éðµ Ám²ß f÷ B�€‡w(þ ×-€ß&÷ æèŽ&Œ÷ ÚèÁmvß�e€‡÷ >ÿ÷ Ò÷å²õ@lñ5 ñ5 ÀmJß÷ ºþÀ÷ ¤ÿ@÷ ®þÀ÷ ¾þ‡w ¬ï÷ÿÿ õ& æòß· –õ¦�÷ >ê7ˆÞwŒÞÍ �÷ ^è÷ Ôé& íÖ ¶#ê–%÷ bõ�÷ :èóÖ ‡÷ Tõ ÀßJõ· FõÀLà÷ ºê †ð¥öÿ*± `Á ÷ (á7õ7õ‡÷ ºÿ&÷ ´ÿÀ€U‡·õ7 õ÷€øô7 òô7 ðô7 îô€ÁÜÝfj&�Ž÷ ~±‡÷ ¤ç6¦vw¸Ý¬Ý7¨Ý÷‹²ô(Àe"Á¬ßÁeB$$$ÀåÁe((ÁvÝ·<zôw<rô  w<hô÷ ÷ ÷ ÷ Vôw<Lô·‘Jôð•#÷ ®é†`Á ÷ .à÷ ò÷%XÞWñ5@ñ5 O€f &�F÷ Úæ6¦vwîÜ7âÜ7 æó÷ æó*7<Üó&ð5@ ÷‹Óó÷ ª÷•Çó ÀºÞð•ð•÷ <é‡÷ é†`Á ÷ Žß÷ „Þ ÷ Ê�Ž÷ Îç·Ž ÷ R÷ fÞ ÷ ¬�÷ ²çŽ7Š]ówvþ÷ Ró ÀRÞ7ó‡7 2óÀ&ÜÁ4Þ÷ 8åÁÜÀ(Þ‡÷‹óÀÞ Â ÷ ¢è‡�÷ ¨çw øìÁ�� Á EÅå‚EÁ ÷ J3Á÷ ÁÅ÷ œåÅ ý‡À¬Û 0 � Á Á À*÷ Üç‡w ’ìžÜÁŒÛ& f wˆò÷ Xå÷ RÄ  öÄÀbÛ& ff÷ 2å÷ ,ö� ÷ $å– N ñ– õ„ !‚æ6ò¦í– ‡U ‡€4)î00.“UTl1DATADATADATADATADATADATADATAV) ÿ Šæ–†5RO€'5RW€'5SV€'5'BÁ Á ýõÿÿ.õ(+õõ*+ õ &• H’ � ¢ûƒ€ ¬ÿÿ;ö ôàwà途 — ; — !— ,— :ò&À u@à5€Åe,‡ ¤RN¢Oõ€þÿ¢WE€ ”‡5& ”— , — ! — [Ž ó— ]ðÎ îÎ ìÖ )@íÀ 55 ,õÿÿ.@÷ LÚ‡õü4÷ VÏõ5È•f ¦ÂÔ÷ .Ú‚�ð5€ƒ@‡– ÁŠw¶Ð· ÏwÀþ· Ïw^ÿ ¢-õ€þÿЋ¤Sæ¤Vã”Íÿÿ‡÷ þÙ‡w tÞ÷ ‡÷ –Ú‡w dÞÁeB$&w¶Ùw à„ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ °E�€Aa×$Ò±œÿÿ‡f÷ $Ù†Â*Á÷ rÑ�ÁeÁE�  Á ý‡Á,Á*Á(÷ ÁeÁ(÷ ð ÁeRRR‡÷ ²×¦vÁ"Ðð pbÁeBÂeRRRRR R RÞ �‡Á÷ XÿðªÍ&Á˜÷50ÏÁe ÷ N×ð"ð•�ppplðe5lÂet²°”°–· ö͇·vË÷ Špðæ|5°4Îe°6ð•(ð€5÷ JÚ÷ xH‡· ìη ä··0Ë÷ Hð²þ pðæ|5°4Îe°6ð•(ð€5÷ öÙ÷ ,䇷 ¤Î· œÎ‡�7 bþwœ\þ· XþÁeÀ‚·‡ææ)ÿˆwŒ@þ †7 >þ±� ÁI÷ ¸Ï‡Õ ÁAæZ”� ‡Ž ‚µ�þÿ”� ‡Ž ‚µ�ÿÿ”Ö 5Â^ÂVÈ‹Õÿÿ+& È¥+È¥-Î € Ê Ö  U÷ œÿÀ ÷ Êÿ‡ �f  ÷ *ýuüÿ ‡�÷ ýuþÿ‡�÷ ýü†Ö Â¥ Â¥ ”ø‡È¥ È¥ € ø‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡÷ &÷ &÷ �’•’•€‡@Á(÷ Bf€  Àe ÀeÉÿÀe Àe ‡„7«7É7è78 8H8]8�8¨8Î8ì89/9]9{9«9Ø9 :;:[:ˆ:²:ç:;@;_;‡;©;Í;ñ;<+3>X>x>�>Æ>ò>?„7£7À7Û78<8q8ž8Ð8÷8,9I9k9�9¬9â9ù9":>:e:‚:±:Ù:;>;p;˜;Æ;ò;X>ˆ>ª>Ü>?&?]?’?Ê?ö?-@ -- *DIAG*- -- *FATAL*-  DÐÁCÐ!n‚×  ƒÀþˆ  Á`ÁêÅ¢Ëõµƒ ¦Áº~÷ FÀè÷ tþ‚À"6× ‡À.6Áë”þá‹æ<7!7ƒÎD7Þ Ä D5”þÀŽÁè‡Æå €&æ?ÿˆ,-fW >5‡W E5ƒW ¾s‡W Ås ƒW !€ ‡W 8€ƒW >€‡W E€‚�W ¡Œ ‡W ¸ŒøƒW ¾Œ‡W ÅŒòƒÖ $|³Æe ‡ÿ ÆÜº0?ÿ ¾ÜÌH@&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡00.›UÿT§3eaek›’Illegal Get Command Line error code%2NCommand syntax error%2N%VA%2NRequired input file missing%2NIllegal switch%2N%VA%2NNo dynamic storage available%2NIllegal error-severity code %P %P %P%2NCommand I/O error%2NIndirect file open failure%2N%VA%2NIndirect command syntax error%2N%VA%2NIndirect file depth exceeded%2N%VA%2NI/O error on input file %X%2NOpen failure on file %X%2NSearch stack overflow on segment %2R%2NPass control stack overflow at segment %2R%2NFile %X has illegal format%2NModule %2R ambiguously defines P-section %2R%2NModule %2R multiply defines P-section %2R%2NModule %2R multiply defines xfr addr in seg %2R%2NModule %2R illegally defines xfr addr %2R %P%2NP-section %2R has overflowed%2NModule %2R ambiguously defines symbol %2R%2NModule %2R multiply defines symbol %2R%2NInsufficient APRs available to map read-only root%2NSegment %2R has address overflow: allocation deleted%2NAllocation failure on file %X%2NI/O error on output file %X%2NLoad addr out of range in module %2R%2NTruncation error in module %2R%2N%D undefined symbols segment %2R%2NInvalid keyword identifier%2N%VA%2NOption syntax error%2N%VA%2NToo many parameters%2N%VA%2NIllegal multiple parameter sets%2N%VA%2NInsufficient parameters%2N%VA%2NTask has illegal memory limits%2NOverlay directive has no operands%2N%VA%2NIllegal overlay directive%2N%VA%2NOverlay directive syntax error%2N%VA%2NRoot segment is multiply defined%2N%VA%2NLabel or name is multiply defined%2N%VA%2NNo root segment specified%2NBlank P-section name is illegal%2N%VA%2NIllegal P-section/segment attribute%2N%VA%2NIllegal overlay description operator%2N%VA%2NToo many nested .ROOT/.FCTR directives%2N%VA%2NToo many parentheses levels%2N%VA%2NUnbalanced parentheses%2N%VA%2NIllegal logical unit number%2N%VA%2NIllegal number of logical units%2N%VA%2NIllegal default priority specified%2N%VA%2NIllegal ODT or task vector size%2NIllegal filename%2N%VA%2N‡Illegal device/volume%2N%VA%2NLookup failure on file %X%2NIllegal directory%2N%VA%2NIncompatable reference to library P-section %2R%2NIllegal reference to library P-section %2R%2NResident library memory allocation conflict%2N%VA%2NLookup failure resident library file - %X%2NIllegal partition/common block specified%2N%VA%2NNo memory available for library %2R%2NPIC libraries may not reference other libraries%N%VAIllegal APR reservation%N%VAI/O error library image file%N%VARequired partition not specified%2NInvalid APR reservation%N%VAComplex relocation error-divide by zero module %2R%2NWork file I/O error%2NLookup failure on system library file%2NUnable to open work file%2NNo virtual memory storage available%2NModule %2R not in library%2NIncorrect library module specification%N%VA%2NLibrary file %X has incorrect format%2NResident library has incorrect address alignment%2N%VA%2NPartition %2R has illegal memory limits%2NInvalid partition/common block specified%2N%VA%2NTask build aborted via request%2N%VA%2NDisk image core allocation too large%2N%VA%2NInvalid window block specification%2N%VA%2NTask requires too many window blocks%2NTask has illegal physical memory limits%N%P %P %P%2NLibrary references overlaid library%2N%VA%2NTask image file %X is non-contiguous%2NVirtual section has illegal address limits%2N%VA%2NFile %X attempted to store data in virtual section%2NResident library mapped array allocation too large%2N%VA%2NInvalid reference to mapped array by module%2R%2NEnd of file reached before .END in %X%2NSymbol %2R not found for patch %2NSegment %2R not found for patch %2NSupervisor mode completion routine is undefined %2NLibrary not built as a supervisor mode library%N%VA%2NSupervisor-mode library reference error%N%VA%2NIllegal system size specified %2NConflicting base addresses in cluster library %2NLibrary %2R not found in any cluster%2NIllegal cluster configuration %2NCluster library element %2R does not have null root%2NModule %2R contains incompatible autolo00.£U0Vl1DATADATADATADATADATADATADATAad vectors%2NCluster library element %2R is not resident overlaid%2NSegment not found to address round%2N%VA%2NLibrary build not requested - ignoring option%2N%VA%2NIncompatible OTS module%2N‡À®ÃÀe"÷®Ã®ÃÂN@RJ÷ ȇwšÃ Þ ÁêÄ+÷¶ÄÆÿÀÂÿ$7¼ÿ!÷ öÄ ÷-nþÄw ¸Ä"ì&f÷ 0ÍÀe"ÁL@÷ Àdž–%ßwD÷>Ã�Þ Ø±‡À¬ÃÀe"÷¬Ã¬ÃÂN@RJ÷ ȇw˜Ã Þ ÁèÄEæCÀhÁH@æ Þ ‡ÀeÐ-®ÿÐ-ªÿò– ƒÀ„Ä$È '÷ ÎÄ ÷-FÖÄ7"�Ä,ïÁŒÄa(Q$É éH"û7`ÿ&wÃwÃA÷ èÌ¡�Þ ÀDÿÖ ±‡|³‰Š–,((U¢W  &[qààÿÿ$W 2$ 'TITISYSYTICLOV’<Á¨Àø$ R ^¢Â�¨À<Á¨À‰Š&æ¦f&¦ v Þ €�‚ƒ„…‡„º@œJ*° J†Î Lì l'ÿŒ¬ VFY>ÑÌP{L}‰Š000 VÿT§3eaek›’’H(ÿÿVFY Version M0529 (ANSI)VFY -- [0,0]File ID %P,%P %X Owner [%O,%O]file ID %P,%P Summary: mult = %D. free = %D. bad = %D. Header map error I/O error reading file header - Error code %D. Bad file header %D. Lost files were found Rescan of volume to find all files with multiple allocation%NIndex indicates Bitmap indicates %N File header does not exist‰Š?TSYUP„RE„FR„ID„DE0„LO@„DV„LI€„RC„ª HD„AL„¼ü xQ»zSYü SYt:#»zSY‰Šz( Üd”<wäwØ0 p÷ Ô†÷ d� °÷ ܆÷ Z‚ à îÁÂJ÷ nÀ–ÄÅ8ý&0ð•÷ �†÷ ð•ÀÁ· ðü †÷ ÷5àü÷ Á òà í€÷5Êü00ð•÷ P‡÷ :†÷ Èð•÷Eœü„ Å ¾Ö ÷5€Šü ÷5@‚ü ÂdÊ¢üŠ Á‘÷ twÿÀ6Ãí÷ ®ÀÖà ÷ ¢Á  ÷ N÷5€Bü-÷ hü*÷U€4üÁ° ÷µ)ö� ÷ &7 "üÀÖÁÂJ÷ VÀ6ð•ÁÂL÷ @Ãü ü�Á`wŽþw†þ‰‡!‰ž!÷ ¢õÀ–÷ �ÅÌûpÅmØûp!+‚÷ 0‡÷5€¬û*÷5¤ûw¾w,Œöw,†ö÷-øö–ö ÷-òö�ö÷5@xûw²÷5@lûwNwšÁ  ÷ R÷ t÷ &‡ÁæÎEðÿÁ Î ýÖ æ‚  Î üÖ ‡0 6ðìúðèú ðàúðÜúðe p 0 ‡°ððmûp ‡ð 8÷5Þú÷EÖúÁ ÷ J†‰E!÷:óöúw\ý‡p°p°p‡ðm¶ú÷  ‡÷U�úñ-Œú÷ ,‡‡ÁPwHñtúÁ€ ÷ \÷5\ú÷ ž±‡Äÿ BƒdÄ ýƒ" ñ w,Jú‚¡‡±‡Âdœ* ÷ ±‡ÂdÊúòúw÷5ú÷ Àþó÷ ŠÀvp÷ ††÷ þ‡w &ÀvðµÁ ÷ D†‰\!÷4òðùwVü÷U®ù÷5¦ù÷ È#Æå€÷5’ùÁÐŒùЊùĤô÷ � Š�ŠÁä÷ bÿÆe÷UTù‡ ÝÁ aÃPà ý‡7 8ù7 Zù7 Rù7 Pù‡Àv÷ 8þÀ@ùÀ]>ùÀ]<ùÀdÐ,ùÐ*ùÐ(ùÁ÷ þþ÷ ù÷5ìø÷ .‡ Üþÿ `… ¦D ¬ýÿ‚‡ÑŠÄBC„ …% †· ØøÁ>Âd÷ žþ±‡×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ ÌXàÿ Ä àÿ ¼Pàÿ ´€àÿ ¬àÿ ¤$ àÿ œ$,àÿ ”$Làÿ Œ$Pàÿ „$`àÿ |,àÿ t$àÿ lH²ÿ dHjÿ \$ àÿ Tàÿ L$$àÿ D$4àÿ <ZBÿ 4´àÿ ,lÀÿ $lhÿ ~¤ÿ ~ ÿ ~Hÿ ~æÿ ü~Šÿ ô~¨ÿ ì$(àÿ ä$àÿ Ü8àÿ Ô|àÿ Ì�rÿ Ä�òÿ ¼$àÿ ´Làÿ ¬<àÿ ¤Hàÿ œÄàÿ ”ÆŽ#ÿ Œ\à¦Þ5Îe‡w pÁ,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡w<ù 袡ÿÿÿÿ¢Ê50„ ´Å (¦ƒr-€‚ù… DÍUt-ÍE Dô €Ä ôE€ù EÍ Ü�‚‡äâZLþßî&wüÊEò ÊU ‡æ&W¬ )‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡&æf…Þ ƒ„…‡&æ¦ff… Þ �‚ƒ„…‡ &[q &[q‡`àðà $Úðà î H¢6 �p6Z6�ô6l6�Ð6~6� 6�6�€6H6„´6¢�„�¢Æ¢�„Ä ¢´¢à€‚ìà€€‚ì000VVl1DATADATADATADATADATADATADATA÷ &÷ &÷ �’•’•€‡@Á(÷ *f€  Àe ÀeÉÿÀe Àe ‡[1,3]The following files were not in any directoryFailed to open directory fileFailed to close directory fileI/O error reading directory file They have been entered in directory %VA They are still lost, could not find directory %VA Failed to enter file - Error code %D. File successfully entered as %X Error code %D. - Directory [%I] As a result, no files will be entered in %VAThe following directory entries were invalid[%I] File ID %P,%P,%P %X - %IFile not foundInvalid version numberReserved field was non-zero %D. Invalid directory entries were found %3A,%3A%VA‰!‰&!À6ð•0Šðð•ðð•#÷ €÷‡÷ j÷á‡ÁÁm¸ï ÷ J÷܇÷ºê÷TêÀ–÷ ÷†÷ ”óøEÁŒïÀ–÷ êö†÷ zóÀ6ð|ê÷ îö†÷ lóÁ íÁÂJ÷ ‚ô÷JïÀÖð•Á–p\\p^^pVBpXDpZF÷ÿÿ.ï÷NÀÂü÷NÀ¾ü7 ¼ü÷ Z÷5æî÷ €÷5@Úîwxñ$òò\Á ÷ jö†1 0 $p&÷ÿÿÐîÀ6ÁÂL÷ àówrñÀÖ÷ Fp‡ð%hð¥dÀÖ÷ øõ[‡ú÷5bî÷ ú÷ nîñ‚ à ÷ óÀ6÷ Jó÷ Êõ†÷ Zòw0þëß÷ 6ów@ôë÷ Êõ†÷ HòÀÖñ- ð Ð&ÄR&&&ÄeH&&&÷ žõ)‡TTTÄLTTT÷ NÿÄeB”””ÄL”””�÷ € ‡p÷ Šõ¢†ð¥öÿ* ÷ Tõ‡‡Á�ÆeÁ­ÁÌ& ÷ ’ó€Âdœ*Ò÷ ´ÂdÁ‘÷ vó÷5@jíÁ²ÂdÊò\÷ Xó÷UPí€÷ îô‡÷5>í Â(‚‚ÂåÂåÿ°ð•!#÷ ôô‡Ä>è Ýà Ä`ô‹‡· *íÁa ÷ úò÷5òìÂdÊò\Áí÷ ~çÁ÷ Òò÷ êò÷5Æì,÷ dç)ÀÄÚç ÷ TóÀÖÁ÷ Xô†ð¥Çÿ*1 öœ*ÂdÊÁI÷ pòÁpÂ÷ bò÷ <ó‡&ñ %÷ hì‚ñ "À–ððmXì÷ Àó†÷ Pð-  - ÝÁ D`ô‹#Å+Å:ÅQ· ,ìÁà ÷ øñÂd÷ "€ÁÁ ýJÂdÁ ÷ Òñ€‡ÄLÀR¦÷ 8ù÷ 2ù÷ ,ù‚È• ÀRW¢0‡W¤9úƒÁ Dà! ÷ PùÒš Òe Ңѥ ýÁ àR‡ÂdÊ†ëŠ Ám&÷ Rñ€‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡Failed to find INDEXF.SYS;1 in MFD - Will open index by file ID 1,1Failed to find BITMAP.SYS;1 in MFD - Will open bitmap by file ID 2,2%NConsistency check of index and bitmap on %2A%O: Listing of index on %2A%O: Read check of files on %2A%O: - Blocking factor %D. Storage control block (VBN 1 of BITMAP.SYS) is corruptedContinuing with an approximation of the size of the volumeOnly the "blocks free" value is validThe "blocks used" value is valid in the line beginning "index indicates"The "blocks free" value is valid in the line beginning "bitmap indicates"÷ P3‡÷5À6ðwÞ7 ÂêÀÖðLð° &ð•÷ T‡÷5 ðð•#÷ î÷ð•#÷ â÷†ð¥ðÿ*ð D‰ê ÷TèðwvòðBðDÁH ÷ ÂõÇ÷ Žôð•ÁÂL÷ îô÷ (÷†÷ ¸óÃ`ïà ÷¨ï À÷ z÷7�ïwŽï CÝC÷ †ï Åe ÷ zïÃ¥~‡Ã à Å`ÅeBC€ Á ‚Áå€ € Á ƒ·@ï÷>ïÁ ÷ $õÁM ÷ õÁˆ÷5 ïÁ® ÷ õÁø ÷ úôÀÖ÷ï÷üîð•÷5Øî^ñÁÂJ÷ ôÀ6ð•0Šðð•ðJðÁx$&÷ ˜ök‡7,\6é7,^0é÷U|îð•#÷ Fö‡÷ 0öW‡Á~îÁ ÁmzîÁ  ÷ öJ‡÷ ¾M‡÷5@FîÎðÂdÊòò¤éÁ�÷5€(îÁ�÷ $ô:ÁÁ÷5€î%À0èÀe0Á4îàÁEÿ'f¦À(÷ ðõ ‡‚�7îwîÁ� Àî ƒ@7î2ÁÞ÷ Èówšð‰&!‰!wRð‰1ú!÷¼írè÷¶í èĪíÅ¨íæ„  Î üÖ f÷ÿÿDë÷ VÁŠí ÁEðÿ±B Á ü·(ëÅŽ ÷ 2ŃÅàÅEÿ7 ë÷ ÁÂL÷ ~òÃLíÁJíBÂ`wÌïÀ6÷ ¼ô†÷ :ñ÷5í ÀÖ÷ ¦ô†÷ $ñÀ6Åå„ fQè‡÷¤êê÷ êê÷ �é ÷5žé÷SYê7 þéÀvð•#÷ ”ô ‡ðµø• Á÷ ²ò¡‡‰Ä!÷åÎ챇7 âçÀ–ðL÷5¡|ìÂ(‚‚Âå÷5fìÂåÂåÿ°÷ –#‡÷5Lìð•"#÷ ôð•!#÷ ô†ð¥ðÿ*ð D ðBðDÁ ÷ òÀ‰à!÷~ä:챇ð•ð÷ Äðð÷ jó†÷ úï·èë‚·ìëÂe·Þë7 Æë‡ÁeB$&÷ \ó‡ðµ! Áe     ‰Ü ‡000VÿT§3eaek›’ Failed to open file for read check - Error code %D. Error starting at VBN %O,%P, LBN %O,%P - Error code %D. Error at VBN %O,%P, LBN %O,%P - Error code %D. File ID %P,%P %X ÷ �ëÀ6ÁxÂÜì ƒÜà ƒ`Ë‹l—,—,d±±ñôìñðìÃLðð•!#ð•÷ >ùC‡÷ 8öÓ$ððÂeÅRÅ ýË# # # ãlñÅlñð p!ƒ&÷ T†Á9Å%Ás÷ ~Å%fÅ÷ 0†Ár÷ d÷ NÎ õÖ Ö÷ BÕÁ÷ ¬öÀ6÷ vøw¢÷DÄÄ 3ÁÂ÷ 4ø †ð%é*æ1ÿˆñ±‡pá° sas ‡&æffÁdÂÃ‘Ñ  œ*‘ÉÀŠë ÜÅ `Åe @÷ j÷‡ñ þÿ !† á± þÿôÉ CbB a(á¡Âd�÷ ö…ƒ€‡ÀLðÄ:ë&÷5 ðÎð�÷ ¨öÀüéÁ«÷ „÷Áeô ñå‰  ÷ ê÷Е.Е/Áe ÷ Ö÷Е.Áí¼éw¾õ  Multiple allocation %O,%P Bad block number %O,%P Block is marked free %O,%P File is marked for delete I/O error writing file header - Error code %D.. blocks free, . blocks used out of %N%2A%O: has Delete this header [Y/N/Q/G]? ñµ€ Áo ÷ `÷÷5 `ñÀ–ð\ññÅ€ ÷ *ðHñ÷ œöÁ`ì @ÜÀ @`Àe ÷ @ø†wö÷÷ ÃeB Ä ùów Vý&·ñ÷ñ· ñ÷ ñ‡· ñÁ;÷ Ðö=÷ –õÀ6÷ Þõ÷ ^ø†÷ îôw0’î· êð÷ Z w@‚î÷ ¼õ÷ Tø†÷ ÒôÀÖ÷ ªõ÷ *ø†÷ ºôw0^î÷5�ð· °ð÷ \÷5€ð w@@î÷ zõ÷ ø†÷ �ô€‡÷ 4ê· ŒðÅxðÅŠCaB ÷ Tõ÷ Ô÷†÷ dôw@î÷ Bõ÷ Ú÷†÷ XôÁ ÷ ö‡÷ öéÁS÷ ö‡÷ èéÄÿ ƒdÄ ýÊðmðp ÷ È÷‡÷ ’÷‡÷ |÷‡‡ÁŠw¶õ÷ ¬éÀ–3 ÷EÎï„ð E÷ ^÷ ‡÷ H÷‡ ± Å ýt@þÿ‡ÁŠwtõ÷5 œïM÷5@”ïFÅõõî õõ$fÿˆ8‡õõd õfÿˆ,‡÷ êü)Ä�*ïÄ¥Y!Ä¥yÄ¥NÄ¥nÄ¥QÄ¥q÷U $ïÄ¥GÄ¥g÷U@"º÷Uï‡æ÷ œ÷5òîÂm éA ƒ ÷ "‡÷ €ÃdÄ Óe\^Ãà÷ w`ñ¦fÁÀ¸è÷ Dö� ÷ ¼öÁº ÷ 2öÁ¨î¦î‚í� �åŽf� ÷ –ö–%ÁÊ ÷ öÁ– ÷ €öЕ.Áífè÷ hô‡&ÁÂL÷ ”óðdîÄRîÅPîÃTî  €÷ `A Åå„ à ö€‡÷  õ†÷ 0òw Zú Ä ÅÄÃLÂÁ¡ †€ Å  øÄ ó‡÷ &÷ &÷ �’•’•€‡@Á(÷ :f€  Àe ÀeÉÿÀe Àe ‡Get Command Line - I/O ErrorGet Command Line - Bad @ File NameGet Command Line - Max @ File Depth ExceededGet Command Line - Failed to Open @ File‰1ú!ÀÖñ€Àw ú·°ñ÷ òùæ>ææÿˆ7Š5ïæº& & æAÿˆÀ&æºæ?ÿˆÀm¨îÀí†ñ€ÀÿÀE @χ7pñ÷nñnñ7lñ÷•±ì÷Õýì÷ÕRë÷Õ¬ë÷Õì÷Õ`ìÆ0ñÀÖ÷ ®ø†‰+"‰+"À–0 0 0 0 0 ÷ „ø†‰C"‰C"À6÷ nø†‰^"‰^"Àv÷ Èõ÷ Tø†‰}"‰}"ÁÐðÀ(ÂÄð÷ ìø7 ¾ð7 „ð7 „ð7 ¨ð7 °ð÷ †wÎþÀþð@ìð8ì÷ Êø7,ì†÷ Á@÷ ön‡ÂVCD±•à ýCD±•à ýCD ± •à ýÁ†÷ ¬I‡Á*÷ šD‡÷@ê÷*Zê÷*ë÷†®ê÷ †ì÷@Bê÷@üê7 Øé÷ Ìì7 ŽêÁ*êññßñ5 ÷5šï‰À÷5Œï÷5„ï ÷U@€ï÷5@vï÷5¿ûnïøñ‰¶!‰s!Á&é÷ Àh÷ ÌüÀö0 b÷ |‡ð fî‡÷ Àö‡÷ @å÷ :÷ Æö±‡w bûð¥öÿ`ð¥üÿ` ð¥ýÿ` ð¥þÿ` ‰L±‡‰,Љ"h‰(¶÷% ï÷w û5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ Øõœ*AdBbAÁepÂ& ¦fƒÂÁ ÷ ¬õ– –‡ÁPõµ aA”Aíf@pnp÷ ’öC*8Ö‹Á ÷ lõ88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ èôõÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw 0ùõ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ õ5fµ fˇðµ ÇÈ•÷ 000%VVl1DATADATADATADATADATADATADATAõ‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ ªóDlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ lô½•8 †õ¥öÿ*ΆÎZ‡w ò÷õ 8µŠjDl@÷ (ôT”ÔÀeBTŸ8œ5l@÷ ó‡@Á(ñ D÷ ÀóÁeB&÷ úò‡÷ ‡& ææ©ÿˆ@ð•#÷ ó& æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡ÿ ¤õ´�ÿ œõ´Šÿ ”õÆî%ÿ ŒõÆŽ'&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡ææ·•fæ&7 æÿ7 äÿ7 âÿÀþðP f ¦Â¢÷ vò‚�%‡1œ ð ñÕ 11 1 1 11ñ†ÿñ‚ÿñ~ÿ¡€‡÷ &÷ &÷ �’•’•€‡@Á(÷ ~ f€  Àe ÀeÉÿÀe Àe ‡·kµz?TLBOÀPÀzLB  Ø Illegal deviceOpen failure on bit mapOpen failure on temporary fileFailed to allocate space for temp fileFailed to detach deviceFailed to attach deviceCommand syntax errorI/O error on input fileI/O error on output fileIllegal switchOpen failure on listing fileOpen failure on index fileNo dynamic memory available - Partition too smallClose failure on bit mapClose failure on index fileClose failure on temporary fileClose failure on listing fileIllegal response - try againSY%X%N%VA%VA%N%VA%VA%N%VA %N%VA%VA%N%VA%VA%N%VA:%VA%VA%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%I%VA %N%VA%VA%N%VA%VA%N%2A%O:%VA%VA%VA Command syntax error%N%VAI/O Error Code %D.QI/O Error Code %D.Ä"¼"Û"Ó"ü"ô"## ¦6Ž Î5  Î5œ*ð‹+€Äå€Î5ÀUÎ5 …Î5 õ Í BBCU%Í BÕ  Ã2 vÁö÷ $Ö5 €÷%°ã÷¨ã÷ ãìå ÅÎ7 ÊùÁ ñµ · ºùÕÕ|UfUhÕÕ|¦æ&&ÁòÜ÷ *À|÷ ùЕ È•-”È• ‚ Àø Á÷ Ì †¦‚Ák#÷ €êÖ ÁåøBÃø•ö"Õ€Q÷e8ùÀ5)ÀE$Ì %& ÁeÉ ÷eùUUÕÕ·"÷ ÌÄ & Õ¶""÷eÚø Õe\^$%÷ œð5R÷ Œøÿ †ø Õ¹"ÄeHÃà ý�À8Ð -Ð- ÷ ¦Àå8Õ8 Õ¶"ÀØÂÎÁjøÁ Az#÷ †é& & & & fæØ& & & Î�ÞýæØýææ ÿˆ‡æÊýæ)ÿˆƒ‚‡Ä Ì ‡%÷ bêU¶"•‡ÂÎ 2ÀøÁ9#÷ éBÃø‰¦B Á„÷ 8†&ÁS#— €Âå€Áf# ¦‚÷ ÚèÖ �å‚÷%ná÷fá‡w ^íÄbø& æLB&æÿˆa‡ñ  Ä¢Ì ÷ ÈW‡111É D÷ °K‡÷ ø÷ ¸Mõ€÷ ¾?‡„Ä ¡ „ „ „ ÷ø÷÷ ’ÕØÕU% ÷ ” ÷Ü÷÷ vM÷ ‚!‡D ‡…Å ÅEøÿÅ… … ÅeØÄ@P•Ä üÀ Áà Ä ÷& æSY&æÿˆ † ÄŠ÷& æSY&æÿˆ±‡÷ p÷÷ 5 ÷ ‡ÅØæ% Î ýÖ ‡æÀÿˆ ‡æH÷æ)ÿˆ000-V3‰V§3eaek›’÷‹Pù±‡Æå €&æ?ÿˆ,-fW >5‡W E5ƒW ¾s‡W Ås ƒW !€ ‡W 8€ƒW >€‡W E€‚�W ¡Œ ‡W ¸ŒøƒW ¾Œ‡W ÅŒòƒÖ $|³Æe ‡Â є ý‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡|³°x–,11ÆÆW  &[qààÿÿ$W ØTITISYSYSYSYŠÜÆ0ÀøØRV0,¤/ˆ0ÀÜÆ0Àl SLP -- Command file checksum is %P SLP -- *DIAG*-Error in command file %X checksum +÷ ćÀ|.”ÄÉ¥¥$Ë5¥%¥&¥/  Á÷ ð÷ ê÷ þ±÷ è÷5Àºû÷5 ²û7 ¦ü÷ 4Ð÷ À÷ Ô¡‡÷ n Ç÷‹øüÄË5Á7 zûËE¼ËU¹ ;**-EW**w  *Á|.@E”Äî¥<¥ù¥÷¥ôE”¥1E”¥.E”¥Ã0Ä9E”Å $¡"E”Å ¡E”Å ¡E”Å ¡Å¥NE”¥ E”¥ E”¥E”¥E”Å‹ዾ÷ Òú Â|.€ †—¤ ÁEÁe� õ÷ „Äñ••••Á ú ÷ ü7 –úŠÀå|.7¢'‡w È)÷EŠú À|.à …”Å¥ DÄEÄe7!\ûòw Rûí� P‘êŠÂå|.·T'‡ >ÀþÁ"ÂðÕa÷ úÁ ÂðÅa°bpd÷ $‡ÀefÈ ÷ \û÷5öù÷ Ê÷ Xÿ7Ôù÷5âù÷¥-ð& ÷ žÁ.#P”þÀå}.7Ð&‡œ`Â¥öÿÁÂ¥ÿÿÁÂ¥þÿ ÁÂ¥ýÿÁÂ¥üÿÁÂef÷ ¢±‡ èd w ¨(Äf· `ùÌ5· Vú÷•?l&÷¥ h&÷V&Ì5@)Àø÷5€:ù÷5@2ù ÷5 *ù ÷ úðú@ðù@ð|.ð&÷ d†ÌE@`Á ÷ Ì5 qÀx.È à ÂêÁÐø÷5ÀÒø÷5 Êø Á¾ù÷¥.Ð%÷• È% W 'Áå'R Ћü ÷ ò÷e %÷ Žø ÀBðlð‚ø÷ Ú-‡À,ðv.ðv%÷ Ä"‡÷¥ r%&ÃÌ5À0 ÷ ¤‡ƒ ÷`:ø÷-6ø2ùÀèðèð÷ €†ÌE `Á ÷ .7 ø÷•.%ÌE‡  w ' EÐ ÁDÐW!!Å õ ” Àl ˆ Á`ÁæÃh óµ„ ¦ÂøÁÌ!Á•!ÀÈ÷ °‚A”÷ ¦ÀÈà÷ l‡Á003�VVl1DATADATADATADATADATADATADATA¨!ÂhÊ ÀÈ÷ „ÀÈàÁå÷ F ‡!÷%*øƒ÷"ø‡÷ø· ~øÀ8 ÷ :ÀÎ ÷ 2ÀÆ÷ *ÀÊ ÷ Úw4ú7ÿw ÿæn ÿˆ‡ææ)ÿˆ‡Ë5÷ ý†‡÷  ‡÷5Èö÷ Vû÷ Jý¡‡ÀÐ ÷  †ð¥öÿ*`Á÷ ¼þ±0Àe÷ üû· |ö÷5À†ö÷5 ~ö÷höp÷÷5pö Á{.B� É‹W¢ W¢ ÀUB€ 7 :ö ŠÂå|.·D#‡÷E0ö÷5*öw ö÷UöÂöB À|. Ð¥ ÁU� B øB ÷5€òõÁEÁeЕ ó� Е ï‡Á|.”þ÷ Ø"‡÷ ¾öÂ^Á÷ Øý‡ÁÀ�Á@ÃÀ€AÂÆÀ€AÇÁÅ�Ä@ÌØð<(ä lx´PœˆDC•¦Î@ƒ@ƒUÄÃEðÿà ð ÄEÿ„ „ „ Ð &Î@AƒUŠÂæŽ@Â@‚UÁ â‡w Z#Ã-õÃõÅ. 7 Üÿ7 Þÿ÷Öÿ·Ðÿ „”÷¥-ÆÿÄ¥/7 ¼ÿ$÷ ¶ÿÄ¥,· ¬ÿ÷%¦ÿ#Ä¥;Ä­IøÄ¥ Ä¥ 7 ~ÿ÷ xÿ· rÿÄ ‘� à Íõ¥ ÿÿÁ Á Å.  ÷ þ·@þÅ. ÁÂ<ÿ÷ òý·4ÿ‡Ë5 Àr÷ š‡ð•#÷ ÀÁ?‡Ë5 Àð ÷ z‡ð•#÷  Á/‡ðèð÷ Z†ËE `Á ÷ ûË5@À®÷ 8‡ð•÷5€äò÷5`Üòð•ð•#÷ B†Á`÷ Üú‡æÁeB$&ðÕ<÷ ƒ‡ñ•ñ•w Â!@pdf ¦Â0-÷ ú‚�B„œ$‡Äµ4ĵ!ò%'‡ò% ‡ò%‡E$ÂeæƒÕ�@à P”üÎ öÖ Á Á Âe ÁÂe Á Âe÷ ú±& ĵ€ V ‡11@÷ X†BÂeÁ÷ èù±‡¦w \ ?Š ñÀ¦„ Á|. ƒ P”ýà ¶!÷>ÿà Ŷ! ÷ Ά¢Á÷ ù‡÷ (ú‡Þ †÷ ªøÀì`Á÷ æø÷EÀ𱇷 ®ð†÷ øùí‡Þ ø‡Á,É%:`· jÿ×-fÿZ‡7 è‡7 â÷ Nÿ)w ¶æFÿ±Þ w <ÿ Á6Ä|.÷ – †óÁ:BC ¡Ì‹±çÔ¤ø… Dò÷(ðþþ7 –Þ ‡÷5(ð÷ ¶ô7 ðw¦ö· pÁðÂ6RÊ.#‚ŠÁ ý‡Á,À4"‡Ùåá:÷B¸þ ™ ‡÷ ¢þæžþ÷-¾ï0 ‚—#ªÞ ‡÷-¨ïú‡Þ Ö Â¢Á÷ Â÷±w fþ‡÷m^þøÛ· è7 XþÁ6wHþ ÉÚ‰ B ‰‡7 8þ÷€4þ‡÷ª,þ‡Á6w"Dï÷�°ÙóÉ Ñ Ù�¤¡ ‡7  ÷(ïþý÷%ªüý· òý‡7 Š&f¦wt÷‹p÷ Æ7 h7fÀjÈ @•,€ÀåÀÿq `-KacJE[à !Ãm*Äí&@•Á †Õ Á ûα)÷ L÷ R†é  çà å÷ò7•òà f@• †Õ †&Ý €…Ò€Ö À5]U ¦†E¤¯‚…€Á°‡ :Á¤‚æ&@E÷ ÿA ·�Îà·ˆ ̆ª ÷ Š÷ Р¢ÂÀEÿ÷ vœÀEÀÿÀ €cÁXÂV¤‘Á ü¢ÿ­÷‹A‰÷­<9¦†„÷ @�Á à £.„ à · æ&fÅÄ ÃÈÁ ÷ <÷ .…„ƒ¶à ÷ 8 †À ÷ "†À £.£$· Ê„ à ë÷ À‡Ì¥Z‡£A‡Ì¥9‡£0 ‡ à £ £ ‚ „ à ö‡÷ &÷ &÷ �’•’•€‡@Á(÷ lf€  Àe ÀeÉÿÀe Àe ‡&æ¦f&¦ v Þ €�‚ƒ„…‡`T<0BSY‚„¬VbÊèAUg£BF€gCMf‰CSfŽTRfSQ fRS@fNS€f,¢7ÿ SLP>ÑÌ„ZÆÞ&Ip”±Ñô 6 U u ‹ ¤ ¾ ß !!7!\!s!ÚÎà NSY „ôh†DBfSPgÆå €&æ?ÿˆ,-fW >5‡W E5ƒW ¾s‡W Ås ƒW !€ ‡W 8€ƒW >€‡W E€‚�W ¡Œ ‡W ¸ŒøƒW ¾Œ‡W ÅŒòƒÖ $|³Æe ‡f¦æ**æ ææŽaææ©ÿˆ†÷¥�ÿòæÀB€÷ Ä Â¥*÷W ô‡W cñ‚@ –%‚�‡w ‚5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ @ œ*AdBbAÁepÂ& ¦fƒÂÁ ÷  – –‡003˜V‰V§3eaek›’ÁPõµ aA”Aíf@pnp÷ ªC*8Ö‹Á ÷ Ô88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷  õÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw ¦õ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ Z5fµ fˇðµ ÇÈ•÷ v‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ bDlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ Ľ•8 †õ¥öÿ*Î(Îü‡w hõ 8µŠjDl@÷ €T”ÔÀeBTŸ8œ5l@÷ ʇ@Á(ñ D÷ ÐÁeB&÷ ú‡÷ ‡& ææ©ÿˆ@ð•#÷ â& æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡ÚÎàSY „ôh†AUg£BF€gCMf‰CSfŽTRfSQ fRS@fNS€fÊ%N%1R -- *DIAG* -Open failure correction input file %XOpen failure line listing file %XOpen failure source output file %XPremature EOF correction input file %XIllegal Get Command Line error codeI/O error command input fileIndirect file open failure%N%VAIndirect command syntax error%N%VAIndirect file depth exceeded%N%VAI/O error source output file %XI/O error line listing file %XIllegal switch or filespec%N%VAIllegal filename%N%VAIllegal device name%N%VACommand syntax error%N%VAPremature EOF command input fileI/O error correction input file %XIllegal directory%N%VAI/O error command output fileIllegal error/severity code %P %P %PLine number error%N%VA%D lines truncated by audit trail%N%1R -- *FATAL* -%2N%VA%NÑ(;,è!ÊÀ‚ôÈ�",Ú!;8ʆ8,8ð!À‚È�",ð!À„"/Lú!À„"/Ô "ÊÔІú!À„";Ê„/Ô.".&P"ÌŠÀ„/ÚF".¼."ÊÚІh."+8`"À„+`"ÊÌÀ†Ì̆Ì×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ , <1 àÿ $ <1pàÿ  *1€àÿ  <1àÿ <1hàÿ  *10àÿ ü *1|àÿ ô *1�àÿ ì *1àÿ ä *1$àÿ Ü <1,àÿ Ô <1 àÿ Ì *18àÿ Ä *1Äàÿ ¼ *1@àÿ ´ *1Dàÿ ¬ *1ˆàÿ ¤ *1Xàÿ œ *1Làÿ ” *1<àÿ Œ *1Hà¦Þ5Îe‡w ” Á,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡w* ù è003 V5×Vl1DATADATADATADATADATADATADATA–#/,ÿÿÿÿ0-ñ.æ²!ÿˆ×-.Òñ1‡÷ x榃D- ‚ŠEŠ… %µ¬ Âó … Â ÀœÁÀ À À ÀU€À �€ÈEðU€Ö ‡|.. „¦Ê5‚ú‚‡ò û¦¦‚ Ž (Ê5(ÊUW¬ ‡Ä ò ƒ Ä ó  €ææwÿˆóE€Ê5 ÛÊE Ž‚ØÖ ‚ÇW¬ ͇Ê5 ÊÄ È„,ÅÊE é1f"Ä//@#è-ßî&w¢òÊEò ÊU ‡æ&W¬ )‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡&æf…Þ ƒ„…‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&æ¦ff… Þ �‚ƒ„…‡ &[q &[q‡àà*11 &ìrðà 1<1[q}P1ðà 1*1E`€Wd1à€‚1à€€‚1|³¸¢–,ÿ(ÿ(n¤W  &[qààÿÿ$W lTITISYSYSYSYOVŽÄÀ0ÀølŽZT¼Œ0ÀÄÀ0ÀÜœî€SYÜl¸¢×'ÿ @ ZAP>005ÛV‰V§3eaek›’ÑÌP _€ÜžžŽÐ(÷|ýÀŠðbð’d÷ Ø †ð¥öÿ`À M÷€üÿ•X|ü‡€7$¬ÿ7"¨ÿ÷ "7žÿ70û7”ÿ7&ûÀŽ÷ ² -‡÷ ´ *‡‡÷ €ÿ7 zÿ÷5xÿ&÷fÿúú÷bÿöúÀŽ÷ x ‡÷ ‚ €‡‡æNÿÎåÜÀ °÷ p ‡÷Ü6ÿ‡À ÷  ÀÿÿwX÷ð÷¬üæ¨üæÿˆæ3ÿˆw²‚€��m@ ‚ JÊEþÊeÜà €  à üÀE€ÿ‚ J‡ÎÎe²ÿw�æ´æ²Á¬w¨æžæ¢æ 7𿆿†æ€Àz7‚7r7p·n·áhX·hælæ·fæT‚Âe—"ÿÎeæNæ@Îe7 6À4ø Â6·.ÂÂe—"ÿ/÷ Æ À5Á·þ·ü·ôÀ·þ·ø·ì·î·è‡ÆÚ€7ÚÀeæÿæ·Â7¼÷íº¶X÷¶¶Æ¬·®€6Àe·-Ž w –ä€7 Š7|Î7 ~ö 7rÆj€Æm^ÎbÀd‡÷R‡÷ Dþ¦f�Þ ¦æf�Þ ¦æ&f�Þ ¦æ&ff� Þ …„ƒ‚�‡, Î w €5 funhõ‹j÷ ’‡uhdB$÷ 0†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷  œ*AdBbAÁepÂ& ¦fƒÂÁ ÷ ì– –‡ÁPõµ aA”Aíf@pnp÷ ÒC*8Ö‹Á ÷ ¬88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ àõÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ nµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw ¤õ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ "5fµ fˇðµ ÇÈ•÷ ‡ðµ¾ðµº÷ Ê‚ÂeõSY�÷ ð ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ ¢DlõålõŠjõµ€aCÃeH###33™÷ � ‡&™÷ ¤½•8 †õ¥öÿ*Îø ÎÌ ‡w f õ 8µŠjDl@÷ hT”ÔÀeBTŸ8œ5l@÷ ‡@Á(ñ D÷ ØÁeB&÷ ‡÷ ‡& ææ©ÿˆ@ð•#÷ ò& æææ©ÿˆV ‡An5ŠjÀPõµ a@”@`÷ †>‡÷ ~‡Ò Ã&‘”@ .†Ã ûÆeRõµaá¥-ìÆeR� BAnBà÷ X‡ /    ô÷ @ ‡  ú  ÷R¨õÕ€a¡‡ÆeRÕØwýÆeR±‡ƒÆåR‚Ê)¦ÿˆKÂå@”‡wJûƒ÷5Šø4à ö€@ À€‹ÀÀEþ7š€ÀŠÀ 7Žæf¦æfæd÷ :ùÎf÷ ‚ø÷5hÎþÿæ÷ XùÖ ÀR–%G ÁøÃ 3É ,„ ‚ ± &‡@Àÿÿ€ †æN`¦æfæd÷ ÖøÎf÷ ø÷5Îþÿæ÷ ôøÖ ÀîÆe‡Áew ÚÍ‡Ä ÀÀ÷ æþÿæ÷ ¾ø–%‡f÷õæ ÷ Æ@À ÷ º÷ øÖ �‡w(úææþÿŽaæ6ú·2ú÷ v÷p7n÷ v÷ ª÷úúÆe‡ærææ÷ œøÆe ‡wÚùæVæþÿŽaæèù·äù€ø5÷ Z÷ Æ÷÷ÊùÈùÆe‡ætææ÷ NøÆe ‡÷ `ÿw¢÷¿�ºö· ¶ö‡fÀ®ö�É‹P”ü7žö�‡w4ùÁ €@ì(6‡‚ ÷vl( — Âe.Âe Âe  ¦÷ ”ÿÖ ÁåÝ€‡f÷ z ÷ v�ÿ•06ö· 2ö÷ÁbÁEøÿ· Z· V· R÷EàL÷ J÷ Äÿ@Àe0?�ö· ö�‡·.·& ÷ "�ÿ•0âõ· Þõ÷÷ Žÿ‡No such relocation registerAddress not within segmentNo such segmentToo many argumentsNo such internal registerUnrecognized commandNo open locationCannot be used in byte modeError in file specificationOpen failure for task image fileError on command inputI/O error on task image fileNot a task image or no task headerVerify failureNot implementedSegment table overflowv’®¾Òì0Ln†¤ÈØèZAP -- (@×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ |øàÿ tøàÿ løTàÿ dø0àÿ \.bÿ T àÿ Lø8àÿ Dø<àÿ < àÿ 4  àÿ ,.*ÿ $@Jÿ  ,àÿ øXàÿ   àÿ ø$àÿ üøLàÿ ôøHà¦Þ5Îe‡w ÄÁ,… Bv 005ãV×Vl1DATADATADATADATADATADATADATAù    ù ‡Ê €‚Ê5ò÷B‡w¤ù è4SÿÿÿÿTÊ50„ ´Å (¦ƒr-€‚ù… DÍUt-ÍE Dô €Ä ôE€ù EÍ Ü�‚‡æ.ÜTÞäßî&wRùÊEò ÊU ‡æ&W¬ )‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡&æ¦ff… Þ �‚ƒ„…‡ &[q &[q‡`àøææðà æ æTðà æøæh |.�|T @�|, .à€‚Òà€€‚ÒAB6RO6LI6wDî÷ Ø÷7 Šë7 ˆë7 ˆë7 ˆëÀ ð•#÷ Ò÷q‡÷ ÷Õ#èÀŠ0 b÷ ^î†ð¥öÿ`aÀ \À–ðèðþç÷ †÷L‡ð áÈ•÷ ~÷D‡ðµ@È•ð|÷ f÷8‡ðµ4ðµ0ÀŽðÄð•#÷5îêð•#÷ :÷‡ÂÎÃRà ýÁeÑXèÑVèÑPèÑNè áea ÷Åaç‡À À÷ ó“÷ ówrëw6í ƒm Á à B Á üä‚ Ð �ȇ÷pêbê÷e \ê÷-`ê`êæÜæ?ÿˆ‡À èæÜ& & æAÿˆ‡Àm&ãÀE72ê÷2ê*ê÷å &ê÷- ê ꆇÀ÷ ‚òwìê÷ €êÀŠ÷ `öÁÎÂŽÃRà ýÀŽ÷ Fö†wªêÀ ÷ 8öw´êw–ìÆå æP$æþÿŽaæ ì·œì÷ þÀ´éÀe 7 ®é ‡À÷ òæÿÿæ÷ Àê–%÷�é´ó÷5†éÀ¨ó 0 ðÿÿ0 0Š 0 0 0Š ÷e‚ówdæ`(÷ �é ÁÝç÷5@çwX÷5 ôæ(ÀXóW Áà HÊðÈæÁÈæÁŒ  ÁÅ?Ám²æpÎ÷ fþÀó0Š 0 0 w7 ,  W ‚ Â5Àà Ê7 7ø7  †Àà 7Èú· öΈ'÷ Üè7 Ø7 ÐÀÚÜÐÀ¬òȼˆ ÂÂí´°pÎ÷ ÔýÀŠòÈž0 0Š 0 0 0Š ÷elò÷-hòBè ‡À÷ ¦ðÎÿÿæ÷ TéÖ Àn7lÜZ×-V‡÷åL· Fö7lÜD÷ @÷å8· 2÷7 .÷e2©÷œå"6 6 W ¶ ö5Àà ð Òöö5Àà ð ܶ Áºñà C`ÄD`Â0åÅE`À,åÀŒ ÀÅ?6¶`ö v` ö v` €À lÈ(Ë•ö5Àà Ê7x7v ¶Œ�> > 3ŠÎ@WË•ö5Àà Ê7: Œ�> > 3ŠÎ@÷ :ü÷eîðÀêðð•  ×­qäƒ Ã5Áà AÖwèHöBä° †Áà AÜÁŒ  ÁÅ?Ámäp0 0 0Š Î÷ ÂûMË•ö5Àà Ê7„7‚ ¶Œ�> > 3ŠÎ@÷ ~û÷e2ðÀ.ðð• ×­·ãÁà HÐð²ãð®ã0 0 0Š  ÷ <û×­…ãÀà ?ÊàïwxË•ö5Àà Ê7è Œ�> > 3ŠÎ@÷ èú÷eœïÀ˜ïð•  ×­ãƒ Ã5Áà AÖw–Höðâ° †Áà AÜÁŒ  ÁÅ?ÁmÈâp0 0 0Š Î÷ pú÷e$ïÀ ïð• ×­©âÁà HÐð¤âð â0 0 0Š  ÷ .ú ×­uâ� Á5Àà ?ÊÈî÷eÂîÀ¾îð•  †Áà ÃPâÃeƒ ƒ ƒ ClÐÈðRâðNâ0 0 0Š  ÷ Àù×­ âÀà ?Ödî÷e^î΀¦Îe,÷ ŽëÖ Á )Îhf÷ |ëÖ À !ÎXfÎe÷ hëÎHf÷ \ëÖ À5@Ám,ôÿ î ÷î"÷ØãN÷ øÖ ÷5ÆãhÎh(÷ íÎ005ëV‰V§3eaek›’âí÷ íÎÜí÷ íÎv(÷ îì÷ LäΨ(÷ âì÷ @äÁ’ãÉ Næ÷ „íζ(÷ ÄìÖ Îº(÷ ¸ìNæ÷ díÎ-÷ ˜ìNÎ æ÷ NíÎ ÷ ‚ìN ÷  ìN÷ ˜ì BÜ — ƒÂ  ÎÄ(÷ bì ú @Ü À B(÷ Nì÷ ¬ãÁe–%w í²‡Ö ÷ÐåÎåÆe‡& æH'÷ ZäÆe‡wˆå¦)‚· æ¦÷ &ê6ÀEðÿú?`öÎö¦Îe÷ ê6Îä¦Îe÷ ôéö5 YÁȱ ñ±m ÷ ²À @`à ȕȕ ö5@ È• 1 1 ñ�€ ×-xÎz¦Îe ÷ Šé1 ÁdÎd¦Îe÷ té1–%ÎÀH÷ h÷÷e>÷-:òá†w¢À÷ RêÎÿÿæ÷ ãwˆÎ¦Îe÷ *éà Ä [Áþ€ € ÀE€1ñ ñqlÎâ¦Îe ÷ òè1 ÁÌÎ̦Îe÷ Üè1À¶Á `ñ�¨÷ ¤Ä à ɕɕɕö5@ É• Î÷ šö÷ep÷-l$á ‡À÷ ˆéÎÿÿæ÷ 6âÖ –%Ä ]ÎL¦Îe÷ \èÀm@?6Á2Î2¦Îe÷ Bè1Á1qlΦÎe ÷ "è1 ÁüÎü¦Îe÷ è1ÀæÁ `ñ�Ø÷ Ô É• ö5@ É• Î÷ Þõ÷e´÷-°hà ‡À÷ ÌèÎÿÿæ÷ záÖ ÆeÖ ÀŠ7†7 €÷~ZêÎ|¦Îe÷ ŒçÖ À ÎHê÷ @ýÆeÎ\¦Îe ÷ lç–%¶ w.ý÷ 8–%‡€Àe"þÿ À ÷ Jèæÿÿæ÷ øà–%‡ ‡ÿÿ RootI-space rootD-space rootSharedI-space sharedD-space sharedI-spaceI- andD-spaceOverlayNo disk allocationNo disk allocation (I)No disk allocation (D)NullŒ'Ž'”'¢'°'¸'È'Ø'à'è'ð'ø' ($(<(ZAP Version COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1983Segment table: @ô’wRî � €À5B`Á € ø€‡wZî�2€/  Á  „ À  …   À5@À ƒ ø   ‚ àà �€ öö Ä  @‡! à � ü€‡ ‡& ÷ ˆÿÖ ‡æ÷ ~ÿÖ ‡f€�€ � £üÁ À Á ý�‡÷ òê÷ ÷ :ùw‚í÷þÿ4÷ÿÿ7 7 Ü 7 Ô7 7 ÷ žÁ€À lÊ#@@ÀmòÀì@à ÀäÀ À ÀmÜÀ À À @`7Ð æž#÷ ¨€ À lÒ#Ö x÷¶¶7 °o×-ªƒ \ÀžÀ 7l#˜À’À 7\#ŠÀF€ 7@ Ö#À’#Á#Á ý7 "7 ^7 \DÀ4Â>Â;Â8÷N<÷F0÷ô(÷ö ÷Õ&÷ ®×-R ×-±‚ÀÀ Àe\#Ϊ#÷ Ö7ìÀ÷ òÀÜÀ ÀeN#7Ò÷ÕÊÖ w¾þ÷ ˆ÷ €· |æ²#÷ ”7ºÖ ‡fÁ æÀ À�€ 7Š À ÀìåÀmx¢ À+’ÀEÿ�‡f÷5\÷ÅT· 7 L÷ ¢ÿ7FW 0W 7 À2À À À @`7&÷å0 ä�‡f�É‹ É­@€í� õÀÿÿ�‡fÀ7¬$°†ÀÀî Ü$œê#ÀEÿÀ l<$Àw\÷ „À®Àm¬À lV$À÷ Èðÿ�¤|òÿœtò÷<èÿ�Žfòÿ†^òÁ iW  ÷5f À÷ ˆð7 Z7 TY@À À l`$ÀbÀm@ÀXÀí67NÀHÀm(À@ÀoòÀòÀŸúñÀ Àm*Àe7"÷5,÷ö(÷ À÷úÀò7ü7ú ÷5Ü€ À 7ÌW ÷5ÜÀÀ7®wœ6$¬7Š©÷ lq樷tæ÷ Jñ÷ ðçwL×-R÷šŒ÷’„÷ > æ|æv÷ ð7j–%À bæ=÷ FðÎXÎEøÿÎe0÷ 6ðÎ,÷ .ðÀ@ÀEøÿÀ Á:ì\#wþNÃ×-èÁ"Á(æ_÷ úïÀ @àÁåNæ÷ ¨ðÎ ÷ ÜïÎ>÷ ÔïNæ÷ fû7¬æ÷ €ð÷ &çÆeAÀ†À ll$Àðÿÿ\#0 l#Àåø€1×-¤ƒ À˜À ðÿÿ\#0 l#"×-†ñ‚À~À ð|\#ðxl#À÷ „î÷-0^ À ÷ rîæÿÿæ÷ ç–%�‡w°èæÔ"æþÿŽaæ¾è·ºè÷ æ4æ.ÎE÷ *í÷5 · äï÷ÜïÀØï N#‡ l# †&ÎåN#æ÷ júÀ r$–% 7 Ê7 ÄÀ÷ èíwôÃEþÿÃm°À¨À l–$ Áß„ïÁ~ï÷ ”:æ¬÷‹©ææ÷ 4ïÎ:÷ hîÎŒæ†÷ ôÖ Â ÷ .Îpæ÷ ïŽæ÷ úîÎ,÷ .î€À ÎLì\#æ÷ ÞîÖ –% æ$÷ îŽ÷ îŠÂŽ÷ üí Μ�$÷ òíÎ ÷ êíwÌà Çlœ$NæNæ÷ ’îÖ N÷ ÄíŠÁN÷ ºíN÷ Øí÷ åÖ ÷LçJçÆe‡& æä"÷ ÖåÆe ‡€Àe"þÿ 7 †7 „7 ž7 ˜÷ ÀæÀ‡wÜæÀÿÿÃÁÁ ±-l#±- \# ‡‚ Bì\#„ ‚À„ Dì\#à é‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:,;+-*.CQ$ACFHLMQX ^_@>ýÆe�÷ $†w.ý÷-ØúÔúÀ†µðÌú Æe÷ þþˆ(¬ÃŒûÄrÀþ¦÷ š ÷ªúTû÷00@Y‰V§3eaek›’¨úVû÷¦úRû÷Œú8û÷ˆú4û÷†ú2û÷‚ú.û÷ T ‡‡æfú÷dú`ú·^úæ`ú÷^úZú·XúæVú÷TúPú·Nú÷E€Lú÷ Vý‡÷ ¨öÀŠ´pÂ~¦ð•#÷ 0†fÁF÷ *�Tþˆª¬ÁÀ÷ÀVÿ Ä÷Àþ¦Ã°÷Ärwè ÷Õ@‚úðþ¦ðr÷ Ú ‡°÷ ’öÁ òÕ@4 ƒÜð÷ ¸ ñ†fÁ7÷ Â�÷ à÷ À÷ º‡À µ÷ 𠆬*æÿ÷ ¼ÀŠ´Á µ÷ n †fÁ6÷ €�÷ žÀ†µ ÷ ¨†÷ އ ÷ Zö À÷ PöÁ -÷•ù÷•<ùæ(ù÷&ù"ù· ùæ"ù÷ ùù·ùæù÷ùù·ù÷E€ùæ�åø6Šæ~¦�÷ >†wHûÆė÷ Î †fÁH÷ è�÷ ±‡fÁG÷ Ô�wòâ­÷ …À†µ&&÷ 8‡°#°-&&�÷ FF‡FfÁ÷ „�÷ ¢±‡Ã¨ÿÁ ÷ R‡B‚ ÂEÄÄe„`Ä%⯆Ëÿÿ÷  ‡“D•‚~Ã%â¯÷ ‡÷bÿ‡÷ , ‡÷ . ‡Ãâ­‡Ã%â­Ëÿÿ÷ àÿ‡*DIAG* *WARN* *ERROR* *FATAL* I/ODSW???=–± -- ÷ D…DÁEÿÁ-ꆦf‚ÁÀÖ°f¦ÄÄEÿÄ¥ЕЕæ¦±ÿˆÁœ±Â÷ ÆЕ Е æv±æ?ÿˆÁdÿ÷ šÁ^ÿ÷ �Áª±P”þ� ÷  Е.Е ‚�Ä%�ÄÄ à à Ä`Ä-h7bÄe¦°Ã•Â~Á A·÷ VÀåÖ°& & & æ &æÖ°& & & Εæææ ÿˆ‡ææ)ÿˆF‡÷e¤° ææÿˆæ`M‚Áÿ÷ àþÖ ‡f…&P&N&L&J&HæÒ°æÒ°&^&Îe\&Îe*ð‹+æϰæ̰Áÿ‚÷ ’þF…‡÷ ÐÀ†µ ÷ ¶ü†÷ œÿ÷ N‡‡fÁ ÷ fþ�÷ „ÿ±‡V³ÿÿ †µ÷ ’À†µñeq q"9‚‡q,4†&& & 00 ð & & & & æ\³& & æV³& Εæææ ÿˆU‡ææ)ÿˆO‡° ° °÷‹nÿ<�‡& ff& ææZ³& æV³& Εæææ ÿˆ‡ææ)ÿˆ ‡÷‹*ÿ�ñeq �÷ „þfÁ ÷ hý�±‡ÂT³fÁ ÷ Tý�±‡ÂT³fÁ ÷ @ý�±‡÷ HþfÁ ÷ ,ý�±‡ê´ö´ú´ ÿ´LB0:[1,6]SYSSCAN.TMP;1lµö´ú´ xµSYSSCAN.TMP;2æµÆÞ»zSY÷ ðÀ†µÂeBCòòòrrðU‚>p ð•ðâ­ðð•(ðä¯ð•f#÷ x‡‡fÁ÷ @û�÷ ^ü±‡÷ zÿ ÎíÂå ÄÀÿ ¶í‡÷ bÿ ¶íf¦Á „ƒÿ ˜í‡÷ &÷ &÷ �’•’•€‡@Á(÷ º f€  Àe ÀeÉÿÀe Àe ‡&æ¦f&¦ v Þ €�‚ƒ„…‡ ¹G¹w¹Bº¹ª¹È¹Þ¹º+ºÂ·ô·W¸y¸¬·ß·5¸‘¸½¸«¸™¸î¸Û¸HUAB not found in listNo startup transaction foundExiting due to errorBad transaction length.%N block(s) of secondary pool may be lostTransaction not in secondary poolUAB listhead not zero on shutdownTransactions follow SABExitingOn scan file openOn scan file PUT$Error during scan file renameOn scan file closeOn scan file deleteCan't write transaction fileUndefined message number %D. at PC %P Directive error. $DSW=%P PC is just before %P FCS %3A error code = %B %Nfile: %2A%O:[%3A,%3A]%X Can't close transaction fileCan't init new blocksCan't init new blocks. I/O error = %BCan't write attributes. I/O error = %BCan't write attributesCan't open transaction file (by ID)Ñ(×'&ÿÿæ1ÿˆæææÓÿˆ‡ÿ à àÿ úÃlàÿ òðÂàÿ êÃdàÿ âÃàÿ ÚðÂàÿ ÒðÂTàÿ Êð°àÿ Âð€àÿ ºð”àÿ ²Ãà¦Þ5Îe‡w ¸Á,… Bv ù    ù ‡Ê €‚Ê5ò÷B‡wbù è00@!YA[l1DATADATADATADATADATADATADATA8»W¿ÿÿÿÿXÀñtÀæfºÿˆ×-¾?ñ܇÷ €ö¦ƒD- ‚ŠEŠ… %µ¬ Âó … Â ÀœÁÀ À À ÀU€À �€ÈEðU€Ö ‡„¦Ê5‚ú‚‡ò û¦¦‚ Ž (Ê5(ÊUW¬ ‡Ä ò ƒ Ä ó  €ææwÿˆóE€Ê5 ÛÊE Ž‚ØÖ ‚ÇW¬ ͇Ê5 ÊÄ È„,ÅÊE éÞÂjºžÁâÀâºXÀßî&wÌøÊEò ÊU ‡æ&W¬ )‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&æ¦ff… Þ �‚ƒ„…‡ &[q &[q‡ààðÂÞ &ìrðà ÞÂÃ[q}Ãðà ÞÂðÂE`€W*Ãà€‚ÊÂà€€‚ÊÂ#:d?\?\€ €  A@WY2SYSYSYSYTICL`ààØààâàˆà"àøàwX&é`ê`ëlHàHà`î`ï`à`á`â`ã`ä`å`æ`ç`è`ér1àTkàœ&à`í`î`ï`à`á¨)à`ãÂ$àMà`æ`ç`è`éòà°!àkà`í`î`ïz.à`á`â`ã @à`å–8à`ç`è`é`ê`ë`ì`í`î`ïCOPR. (C) DIGITAL 1983&÷ Šþÿæ¦f&Í :&D4ŠÄeŒd¤$ æ—þÿß•àþÿ?Ê7ÆŸ•þÿ·Œ×†÷*˜ÿ‡&D�&÷ Ž¿RwEôýÍ ß•àþÿ÷ x ÷ †Šþÿæ¦f&ß•àþÿÃn÷‹ÜÅHõ‹€w–Å>€�‚ƒ· 2„…÷<÷¢6ŠþÿÃe÷pòÄÅë ÔŠþÿ÷ ê÷ ú Ì7 öÁÄ@B@0"1 C&ÂÀ5@º<E*é÷XºÁ¾7Š�¡Š÷ Šù ŠÒõ À&w�aÃZw!„wÐÂ:�bbbbbbbbF ‹3&w\C&· „$ô �`PPPPPÀ€ÿÈ7,üÁ ÿÀàô ÷€ÿ6ü À€ÿ        &Äeðÿ$)À mþÿ••“Ñ•1Àe€Ã ÷!Π莆 €:� õ‹€÷ jwBþæ¦ö¨ßlßl00A [‰V§3eaek›’¨Þ ŸßEàzÿŸ¨‡&f…Þ „…‡ ŠÅìôÍ~ûåxûårûÅKNŃ 7 N^ 0‰÷ Þw!&7 õU€7аæ0õ‹õ5@À÷ " ¦Þ ‡÷ ºûÞ ;‡õ-ôÄBõ‚ ó‡Ä–%fÁ$÷ Žƒ$‡Ð ÂƦœ²Š�œŠ�ÐPÄ%½ ‹    ý÷ Å’V­µƒõU@wÈõ‹øÄHÅeåU€ÕE@ ÍEÿÓ7 4À`÷ v w’ƒ ÅPÄ�Ž -<‡÷ rø‡Ë ƒð·38B*fÿfÿ,l,ZXXXÌQ°jÿÿ¢€(d–XÜk°j      @€ @€€ ÿÿ <<<JRSX11Mìh¦æÂîw¼îvŸ·²î æ¬îw¦î½�·œî޵ W-à‡õå õe€‡À iÀ%ÁfƒfÅìôfÍfMæ‚3””À „3*ÀåB†@À à”””””””””””””””””””””””””””””””””׆'À ÀåB†à””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””Ú†Ö ””•�…‡À~bD±€ ,ú‡Ð Hà` !Hà ‡ÁÁÁ$÷ Àÿ†ÿ‰Á$Ã~ÁbÁDƒ û†È&N`Ö ÈÁb¦Žb �b"€p‡ SYSTEM CRASH AT LOCATION REGISTERS R0=R1=R2=R3= R4=R5=SP=PS= SYSTEM STACK DUMP LOCATION CONTENTS öU·Lÿ·Jÿ÷DÿÆÿ7ÄÿÀLP�ÐPð.ÿˆÆlÅtÿÁHÄÈ• •÷ ’ûC÷ bô•÷ €ûÁ„ÿC÷ $C÷ ÷ ,W šõ‡ÀV÷ H÷ Dwwúÿ• ÷ 6•  æ æ à B à B à B Âe0÷ Î óÖ Â• Å%tÿõ‹üÿ€f�þÿÎÅ€—¥ õ‹üÿý€f�þÿÎÅ€—¥ö͋瀵�Â¥ Å%Lÿ æ÷ ´ÿÎ üÖ ‡Á$�ÀÀ  ‚À `À<÷ .À W  ‚À÷ À,üÀ À$ü÷ BP� ‡£‰Âê ·üDô‹ ]@YECñ% õ �BÂ-øûò5õ5ñ¥ ƒ Þÿ ÈûÛ‡H4t Bœ Â¥@à Àø"ñµ õ5€õÕÀþÂ¥Àùà  õÅ5õµÀ÷ 6ž±×-Pûê uuu´Š õÕ€�B�¡‡ DõÅ€4Š   æàé÷ÚéJ·ÒéÁBÂeñŠÊE@fÅÀœ÷ À÷ Hü…‡DÁ<úõ €õµ@ƒs ús!÷Ê´Àñ3 ÷ €ÿàõµõ‹€ BæNéƒ÷ Bé‚ ��þÿú Šþÿ·&é‡Ã�„ÃÅõ5øæœÎ쎊æf&D¡Þ „…ƒÅlΊòÖ ã±LÀ÷  ‡÷ wÒ胇÷ '†ž‰€ $‡À ÂXù¡ò5Á `‡Âù‚$¦Ò  ‡r ƒÂeÎ õò5 N V ‡Ö ‡À”ƒ ±À  AÁe ‡€à †Á\‚  ‡€àÑ À ʇŸ‰‡ ÁÔƒ Á t <†Á Á aÁe>±@0 úò%TI@ò¡‡ ‰&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡CÁeŠ@BæÎeÿ ŠÎ€eB‹ ‡µ  ‚‡5 ‚B@‡@ Àìwˆý&& Á @Á÷ Žÿ& Á à B û€ÀEÿÀå÷ ÀÁe„aa€€ ÀEÿÀÿ! ‚@‰@@‰P@É@@ÉPÀ�„ �‡&w ç@"¦�ûÿ‚c�úÿ�Á ý‚€‡õµ@  ¡ Œ� ŒÂBЊ� � � � ‡ Á B Á B Á B  ŠÁ �l ÿÂEÀÿÂUÀ‡÷ Ôÿw˜æ€‡&A@��c@ æ Î Á @ ûÁ� � Ö 7læÁeÀ€‡7 æö÷ 0æÆ Þ †‡õµùõµõ‹ò€Â ïæ.æÃ÷ "æ�ú ·æà ‘€ PÂm¨öA �H²�B2"ú‚‡2,þÿõ†Àå ˆÄ¥ðÖå ‡À²Àú0¡úp!÷ ð¥ò÷ :øí ƒs¬ùƒÉp J‡À0öw¦ƒ±‡ÂƒúC úƒóC s øÊ°Á¡‡ÁâõñE1qœ@ÁeÑE@ÉEÉUÀÀá ÷ Z&‡&A1q ð5@0 0 IB:ÂåJb ÁZB�*p¬ù†2*p*7 Zõð­'õ‚‡w„@ÁHõ p¬‚ó74õ‡÷ üõ5À P@Á W ^ƒ÷ þôwDw¨ÿÀ4õ ,3,ð ô±‡ÁZB�*ø ú2**‡ÀÊôðUwbÿ@B  f Žà´%†@B Blñf NmŽà´%‡´ 0t‡æDæ>Àe Þ Àå ð50ðE0÷ úþ Â~ôÃe怓3Ó5ð5 Ë5 ã(“C p°÷ lþÖ ‡Ñ B&‘õ5 I‚Bí6¦ÎŒ  ‰eÑ Ñ ‘Q6�  ÂÂåÿ‚ ‘� ‰É•‡Áe ‡…ÎEÿÎ æ Å5Î æ.w ¾ïæ'÷ ¨ów ®ïæw ¤ïÅ~ÿf¦fvÍEàææ w „ïæ —!†· „ówJöw lï& æÅ ó÷%ÿÿPó€€c T‡ dMƒ ܇ äGƒ œ‡  Aƒ÷ ó4DÄe÷ æâŒ- †ƒmÀÁ÷ Žù‡K ƒÔ ‡Ö �F Nà€† ÷ rù‡÷ ’û�a(� Ö Á �üÄ–ÔÌð‡ö€Æˆw´ü· œòž‰w ï Ä Œ ‡÷ ÀîÄÅÂ¥ )‚ B!ø‚� ö‡�@œ½ Á ðâ5íŒ ë· LòÀ²ð ûÄ`ò;ô 8ô-,ò4‡7Lò�Ga ærá7 láü ·dáã ÷ Æü ÷ ŠýÅ¥÷ ÂóÌ  D÷ ûÂ÷ Bò'æÆ Þ #‡�þÿõ‹€ô‹ôŠÀýÁ  æêà00A([[l1DATADATADATADATADATADATADATAÃ÷ Þà�ù ·ÒàŠþÿÛ÷ ~ñ‡wÞþ !#%')+-/13579;=?AC˜˜@6<V< @40N|p p„ÔP²rRÒNHp–€î€`€‚"æìž€8€T€(€¨P®÷ ’ðŠþÿ€œþÿ÷U0ðêÆˆ&€¿ xðwÔwÐw tì÷ dðÃ&ðÓ$Åe Î%ÿˆw¾ÎÅ’Õ“C F ƒK Î5̓^ � @ÐwðŠÁÁ D& € † D‚ Ü* Âenr Ž„R€s ƒÁ÷ `öÓ Í  ‘ŠÎ 2ÅÌïÄ †ã óEð Ä †÷ ¤ö †Ä #�÷ ¦ú!‡Ó$ÁeBÂeÄhïÞ Ÿ &F Îm˜ï† ‡ÅTïE$õ —#þˆw îw û�‰Ÿ‰þ‰Ñ �É‹�Àwrùù‰÷ töÉ @&DÂÀ’Ã�Ã9³ û3 ø‡3 õ‚ÀìÀEÿÁ÷ ~öÁlƒ s!f@÷ Fö �ÅæD d‡Á¾îÁe<fQ$D @þÿ÷ ö Ö �éÎ ñ¦‰¤‰÷¾îÄî7 ªî‡Å¶î@*wœîwbù¦öÞ·üݶŽÞ ·î݇Dõµ ÷ 4øBæÔ݃÷ ÈÝ‚ ú ·¼Ý‡  Ï Ô wØ÷÷ jõ‡ÃÁ ÷ ¸ôÒ €ä“‹�÷ ¢õ`ã•€Ê  Šƒ Äe ‡û‰ÃÁ÷ ~ôÁSW üƒËfî‡&$Š— B‚‚ ‹‹ ‹ ÓË ;¦Îb8‡—#5‚fã(ô ÀÀ À €-ƒm€ †N "÷ HÎ Ó$ôôÀ˜À Àe€ÿ4� £“Kà ÄeÁ ÙÖ Ö „óU€ ó5€ ‡¬‰«‰÷ Ê÷ æ†óU@ 4 óU ‡÷ ®Ãe÷ ˆB ¦&Ó À2 X†Á�àt ƒSfÎŒ  Î Žmf&N @‚À5Ë5:&@`2 5‚& õµ0æË5õ5'ÎµŠ ÷ B†ËU@� ‚ ‚m6жа �Âe€Áå€öÁŠN```Ãe£Ä ý‚‡¬‰ð‰÷ Ú÷ ö†óU@ ‡ø‰æþÿf @÷ Vð&f& æÃe& æ÷ <ð&fÄÀä(÷ *ð&f÷ òí° ° ‚�°°•w@õæ÷ ó†û‰É5Æeðåwýò ú‰&fæ’÷ ¨ò @æÀÀ5ž‰& � & ˆ ÷ ”íµŠƒ׬øÿ &€�÷ vò÷ Î€Ô T�”•T”…TŒ&& ·rÿ& À÷ ôóT”Ô‚ŠÂ-— /‚AÁe — ƒÁeÂå ‚Ê‘0 õµ‘0!‘0‰0 ôöÿö¥ôöÿ÷ Ú÷ hó÷ ¾÷ ¦ðÄÄþÄ¿wŠ÷ ¦Îµõ5€—­—­õµ-ÁP÷ @ñ‡÷ 8óTŒÖ%õ €ÃˆêÀ$÷ Äñ äl"d Àœ! `Ö �wÞûÄô ÄúÄîÄíÄðÆVþ€÷ @ì ƒÅw¬ïT”ÔÔÔÔÔ̇ÀA�€À5 ÁEüÿK0Á÷ ¤ð‡w–òw ÿw�ÿÃeB&‚ Ë ÷ ŽH‡² Eò5 A€ã ã ÷ r †æ& æ ÎEˆ& æè&& & & æþÿ& && ææó5 6 & & ‚ó5 ÷ èÎ VEÁ"÷ "ëQ‡Á�Á ý (0ã(¢‰5  & & @B ì ‚ã-‚6@îB Bmì ‚å-‚‚$€4@2 l ít óU€ ó5@ ôE‡öE „ÎÄÎŒÅÁ"ô Î´Þ ÿ‰ÃeË £÷ > ‡ò5€œò5 ² ²¼‘ÀÀ5 A2ÁåB, Aøª‰‡ ‡õ5÷ ÷ T‡£c‡ÿ‰õ‹c÷ ~@ ð5€Z$Ô ð5  ó5€ õµLðU-÷ ‚óU@ Äeõ‹ ó@ Àe f5 ÷ ¸ñf æ:È ð5 úÿð æÿð5úÿÀå @,Aú1Î.Þ Ö €Àe2 5 ÷ bñ@Á wb骉ð‰€Á"÷ Ré‡ÁB÷ îò‡‡ÿ‰ù‰Ñ �‰0É €Â ‰0‰@w¼ñù‰ø‰ÊU÷ Äñ‰ 0 @‰ÁÃ÷ |íSSÓÂæÓÀæ‡ 0ï P‰Ê €°‰Ê ý�ÁW  ‚Á ÀW ÁeXŸ‰AaÁeõU4twXñÄeÄeÀ Á×" ‚Á ÷ "í†�ÌÌ ä‡ž‰Ž±‡ÊE@Šþÿ ±ñµ ¡‡±‡Âzæ‹,³,ò5 ò ‚ï‚ ‚뱇æŒÀEðÿÁÞ 20Ö ‡À À À À óW ‚´Þ r Þ r Þ ´Þ ð‰æ¦Á ÷ �ç‡`¡!ÉEðÿá @Àe2÷ rïa!Ša�á €Àe÷ dï¡‚ƒ‡E2æÎeN!Eüª‰ÅåÖ ‡$À’  †À À À À `ô ‡©‰Ì !f¦ 4 ðŠ Àå$� ò 0`õ Ð ôŠ ó‚�±‡�  0°GE M{s$i,˜ ¬!L"®!‡÷ Réü‡sn õ õ õ õ ñ¥ À‚ 5”1¤ À%Ž øÀþõ•yñ¥ †w¤õåóp 5Š ÷ À÷ &ìÁÀ B — ¢‡Â墀 Á ö3€Á÷ âëÀ@P3  4�ÂeÊ J�bbb âæñ% N\õµ ÎU²Àýrƒ C Ã5Àò5@ ñµ w®wàJ‡‡w Fà@Å´þ ÷ ößD  Àñµ <Ê5 *Ê5`Hò5 üÀôò5 >Àü ñµ 6� Á5F1ò5-ò5çÁ5€<ó p #w”Àüó%€ r ò5@ wàþ÷ Êü†÷ ‚ë ñµ õµ wóŠp  �Á ÁlÊ @÷ dèwþõ¥yØõÕ w²õ¥y×�\ Á%€Ò€À @mwJ�$ƒ&‚÷ ’êÊ• ÷ Þuàw�ÿµœõÅüÿµ ±±J�‡À +5à5`5`u‹À€  @lÀ¥ ‚ÀåÀeÀ%ö‚Àå± ñ1÷ hÁOó•q ÀÁ5@�õÕ óŠq óer Àr éÁMó•q ò5€ŒÀE@Ê @2õÅ 4�J�‡wrýó•q ór r ‡Ê @4�ÊG‡M IE$C,Gú#¾$~%À$‡÷ ðåü‡00A0[‰V§3eaek›’sØ#óÚ#ñ¥ ÀÜ#1$ Ð À%ð# ø ä#‚³ŠÛ#5RÀþõUEñ¥ †w*õå÷ ÌèÁ ÷ ¦è€ †ÁUÀB�‚ ‚ ‚ @P3  4�ÂeJbb â Àýò‹üÿ�ñµ )w®J‡‡w 4Ý@Å ÿ ô‹Û# &D �Ä5 Ö ‡„÷ ÆÜD À ñµ =Ê €�þÿ ðµ óŠÚ#Ê3ŠÛ#Á5�ó•Û#4� rÊM‡³ŒÛ#†w(ÿÀôÁ5 Àü�Á AmÊ÷ våw|þ÷ ˜ù†÷ PèïÁ�Áœ%˜&š'š&÷ N䆇s�%ó’%µ�ÀþõULñ¥ †w¾õå@ ñµ ÷ Bçó¥ óµ óe÷ .çÀ D Á(÷ ôæÀ À À À À À @P3sÀ(@àÀ@-ƒ5  4�÷ d�ÀýÁEÀ Ê5Á%wÀ÷ fÁ÷ JG�ÂeA  Jâbb‡‡w ZÛ@Åêþ ÷ ÛD³Œ“%‡ À�$� síXõ×,(ƒõ(ÁE€uµÀÀE?Àe@3÷ wfÿÁ5�ÁEÀ Á%ô•µŠ ‡�ÀÈfN Ö5 %ÀüÁ5 Á5@ ÷ lò5ò5 Àô ñµ �óŠ’%w¼þÀü ��ì÷ Zãwþõ‹ Šþÿw„ÿ÷ n÷÷ Úò ÷ òÁfv�ŠÊ‹þ€�‡æÁ÷ âÿ€Î ù–%�÷ ¾ÿò�Á÷ Äÿ¿�ÁEÿÁUHó•“%4�J‡Ö �ÀE?ÁE? &ÎE¿ÿŽ Ž ÀE@ÁE@à† ÁU� �Ur‡KO MUW$Y,�  0°x(¤)Š*¦)‡÷ ráü‡sT(õ õ õ õ ñ¥ ÀX(5”1¤ À%d(øÀþõ•Qñ¥ †w õeóV(÷ \÷ Jäó¥ óµ 3óe÷ 4äÀÁB÷ ä3@Á÷ ôãÀ@P35Š   4�ÂeÊ @� âbb â À÷ Ê‹þ€Àýò� A Á5Á€ò5@ ÷  ‡w2W­O ‚õÕ W­Mò@wć‡w NØ@Å¢þ æCà õµ Ë5Àƒ‡ËE@€ƒ÷ Ü×D Ê �ò �÷ VÀ÷ C‡õµ @� @ À5 ( ÀÜW(õÅ w°Ê /€� ÀôÁ5ÀÈÁ5€ÀüÁ5V ò5? óµ ,w†)Àüõµ Ê € ó%k(l(Ê �w˜þ5 wF÷ Œ‡÷ †ôõµ  ñµ �óŠV(æ�Á  uõµ �3�W(  AAí÷ àw”ýò5@Øò €w€Ê5(ÐÁ5ÍÁ5 ÷ N÷ 0ÀKõÕ 4�wDÁ5Á ·€õ¥Q³ óµ ¸�óŠV(w.ÿó•V(€À @mwlÁ%€wb¦�ƒ‚÷ äá÷ ¬‚uàw ÿ�ÁÁÅüÿu�µ ±±÷ ¢÷ „rrrwÊýÀ 5à5`5`u‹À€ ÷ Ê÷ BóŠW(ó•W(³ l(Àžl(ó•W(÷ B÷ $2ÀMõÕ wìþwLþó•W(óc(l(‡&À&À÷ Ê‹þ€€‡Ê€f�²‡õ €ÀU ‡�óŠV(w.þ€ÀÿÿÀ @mÀEÿ5à 5`u‹À€ ÷ õ 5`w^ü @lÀ¥ ‚ÀåÀeÀ%ö‚Àå± ñ1‡Ã¦�à ý‚÷ `ÿò÷ Fÿ��ƒ × ò÷ Dÿw&ÿæ ¡óµ &À‹€÷ æñ ó%  ÷ á‘‘‘Á÷ ”ÇÀ"÷ ˆÿ±€ƒ‡  E$C,GŠ-v.&/x.‡÷ `Üü‡sh-µ�ñ¥ Àl-1$ Ð À%€-ø5RÀþõUEñ¥ †wNõåój-÷ Bß‚ B Ád÷ ß3Á �P@Á ÷ ßÀ@P3  4�÷ 0ÂeJbbb â Àý¦üÿN Ö5Àñµ 5w¾ñ¥ ñ¥$ ò5ðüò5ðøJ�‡‡w |Ó@Åäþ D ÌE@ ô•ÿüÿ4Šüÿ÷ ÓD� Àñµ 9³Œk-‡Ê €ñµ óŠj-ò5ùþÿò5üÿ ó•k-4�÷ ZÊU ‡wÿ Ê û€Àô�þÿ�Àü�Á Am÷ .÷ ÎÛwdþ÷ ðï†÷ ¨Þïr� ñµ æóŠj-ãËÊ–É–ÉÊ–É–Ér�‡€` ` ®³dÀÕ € ¢  ¢ €a2 € €a2 € GE M]li,y|qty„qŒ{s$}Tu\udÜ/n1~2p1‡÷ Úü‡sd/sh/1 ÷ ðõ õ õ õ ñ¥ $À¶/óf/÷ l5”1¤ À%Ò/øÀþw|õ¥ @À%È/=‡ñU€À%Ð/7ñU@3Àþõ•yñ¥ †wDõåóf/÷ ÷ ¤Üó¥ %óµ !fÁÜþ& Nܳes‹�÷ ‚ÜÁÄþ& NÜ€å‚ ÷ ¨†ñUCÁeŠ@B÷ ÎóU  4�ÂeÊ J�bbb âñ5 �2h/Àýrƒ C Ã5Àò5@ ñµ w>wRæò5 ñµÊ• N\²J‡‡w „Ð@Åèý ÷ 4ÐD À ò5€ "ò5 "ñUÊ• ¦N\²€ÀÿÿÀ @mÀEÿ÷ >÷ �‡±Šwüþò5ñE÷ tH‡Ê58 Àüñµ Gò5@ > wšÊ5`AÀüñµ ò5ˆ".ò53� Á5F.ò5@" � Á54Á5€Á5w0ò5€"ÀÈò5  ÷ ˜ì†÷ PÛ  ñµ óŠf/  �Á ÁlÊ @÷ >Øw&ýwxõ¥yä�\"�Ü Á%€Ý€À @m%�$ƒ&‚÷ zÚÊ• ÷ ’uàwžÿµœõÅüÿµ ±±J�‡ À ÷ ÞñÕ÷ J"ò5@� ×,j/l/‡ñUóŠg/ò5 óej/ó%p/j/Àü3Šf/w ÿó•g/wVýó•g/ój/j/‡Ê @4�Ê•G‡ÁÊû& NÜ�æÀ B � ‡Bà€ Î øÖ Á¨û& NÜ�÷ 0Ù3ÁBP³‡Àt/5¢ ÷ t†Àe7vû‡Àe00A8[[l1DATADATADATADATADATADATADATAÈ ñÀÿÖ wžþ5à5`‡5`u‹õÅüÿÀ€ @l& Ã:ûÀ¬‚ÎÜ€ãÀeΊ€#ó‚€ã± ï1Ö �‡ñ¥„ ñ¥Œ ñ5 ±‡¡‡y ;[q ;U@ ;YW ;UU G` CYü9[ Yü9[@PpÐ6°6Ð6¼6¼677ü5ü5Œ6ž6V6(;‚;";|;²;ž;ž;Ò9Ò9Ò9Ò9†6D9Ø–ø—ضȅ""""è:Ì:è:Ì:D9š9š9:L::L:D9D9f9Š:L9Š:D9š9š9Ò9Ò9¾9¾9D9Â:€5†8è7”8÷ jÔ†‡s†4˜4@ õÅ3Љ4Àµó€ˆ4õÕÀµõÕÀÅ Âe— ø4ù‡Àþwܳ–4Ò µ"@�"3 Š4ó ˆ4�ó ˆ4÷ xø4À3 Œ4f#�Àõõ5@  õE@ õ•[#õe"5 û% –4µ±Îµ³Š4WÖ w\õ5 ÀÅ$õE@ õEÏ õE7÷u] õGwŽ÷ v õEÏ õE7÷u] õE€ A ÀwÀúñ%'‚Àôõ5@ !õ¥"AÁeI I I I õ¥" õåqm†q‹õeÀñõµw¤u�#@�ÀUõ5 ÀEÀUõ5 ÀUÀUÀ3Ž4õ5 4ò5 Fr òŽ4ò @²rõ¥" 2 ²2 r4�õEC ß• þÿõ¥"rŠþÿ‡Àýõµõ õU ôŠ Àô• ÷ ÐÔô•‡wÊõµ5õ5 ò5 Øò5 êò5 æõU õE õU ÁŠ4 r ³Š44�‡÷ Øæ ‡Šþÿõ5 ÷ ¬­‡wæþ÷ òU õµwB ñµ dòU w,,õÕ‡‡w `É@Åæû ÷ ÉD4� õµÀñBÀA�"õ5 õU€ õE0 ò5@ò5@ y5ò5 $€ÀEÿÀ5¡À5 À5@@ €lwþ€ @<*5 À5ðò5 y^5ÀÅwfÀ5 ò5 õõU 2 À5ØÀ5ò5 w ò5 ÀöõU Ày5õE ó5Ž4õU ó% ˆ4ÇóŠˆ4wVýò5 õU ÀÀ5 ¶Àò5 Àö÷ à†õ"wøyD55 ÀõõU@  ñ¥  !ò ò5 @€ì3`Œ4µ³Š4$A�ìÁlŒ4µ Àò5 ò5 õ5@ µ  AAí w.w¶üA�"õµóŠˆ4s"�4s’4s”4õ"yD5À5€!ÀÈy5ÀüûÁñÞ:5õ[õ5€ —,‡ÁÀ–4Àe155õÿÿ õ�4"õ’4õ”4wüõE @ �ò5 õ5" õE ò5 õU À‹0�ò5 ,—,†õ5 $wÿu ƒÀóõU A�lò5 ÀÂõU ò5 õU õE@  ÷ ²õE€ õÅ÷ (Ïw´ù¡ò5¦Ní—%¡ õµõ5€ ±õU ‡ r ¦N�²õE% ±ò5 õU ò5 ò5 õU õE ò5 õU ò5 õU ¡‡f ñµ fñ¥ ñ¥ ÷ JÑ�q "q ÷ 6Ñ�q q" �‡CrAE´@Gº@OÐ@`AÐ@Iü@ Ið@@ÿÿÿÿPÿÿÿÿpÿÿÿÿ=¶?†>Ä?÷ Ö̆‡s´<ôV@"4 ¼<@ 3Š·<@ Àµó€¶<À%DóU@¶<À1 ÀEÀÅ Âe— =÷Àþw‚õÅ´4Š3 ¸<5 Ò‹€w21q5 u1 wD �õ5@ Àõ1 w25 1 õU—¬ÿÿu5 õÿÿs¸<3 ¸<—¬þÿ —¢EÀúW,~‡5 —¢GÀôõ5@ rµÔ³º<ó ¶<�ó ¶<÷ ,o‡A Á5õUõU`Á5Á5 Á5õE Á5õE@wè õµõÅõE 5�õ5 À¸< 2 ÷ ^à$³¸<4�‡÷ Jà‡ÊE@Šþÿõ5 õE õ5 ©ò5@þÿÊ•<õ5 Àý÷ òÊUwæò5@þÿò5"þÿÀýó ¶Þ ÀõõU@ µ r æ ÎEÖ%3 2 >õU ò³¸<ÊeÁÿÞ ¿ÀÈÁ5,ÀóÁ5'ÀöÁ5@"ÀÁ5Àüf ñµ ��óж<õº<÷ žÞ sº<5 Ö w°ýÖ CÃe æËE0 Á5 ËU Á5@—¢ŠËU f÷ þ�—¢‚Á5 À‹�ÀÂËU¦ÊU²Ö  A�l÷ ¶ÈwÖú¦Nm—%¡Ê5õ5 ±‡õÕòÿÿÊ•K‡÷ Lµœ¦þÿõE7 ±Î5@Î5 ò5 Î5 ÎE ÎÎEÿɵS õÅ– †õU ‡ r�æ2Î þò5þÿõ• õ• ò5þÿõ• õ• Ö ‡ ¡ñµ fñ¥ ñ¥ ÷ ´Ê�q "q ÷  Ê�q q" òE@±‡ MCR>^Z ^U  õ‹�Dwþõ‹"�õÕõ‹*ð÷ ^ƇCÃeñ¥ ËE Àñ¥ ÷ †Àé÷ 0ÇÝ ‡ËU@Ë5#wËE_}ËU€÷ üõ ËE @œÀ¥$ËUÀ¥+00A@[‰V§3eaek›’ À¥1Ëe8ËeÀ¥0Ëe�þÿw$ó5óEô‹ Ë €æHDæwàË5KË5xæž Ö Ë ;€Ë5 õ �÷ ´Á<æ• ËUË55Ö ÷ 0½ÀËåæ• *³ 'õ¥ñÿ5�õ U€ Aõ5 B��à@ŠÀ÷ Æw¤þË5?õÅ‡Ë æœ —£A‚Î¥ Î¥ )Î¥ (Î¥ *Î¥ HΜÎUøÿ‹ãó• Ö w$ÿËUõ5 & ÎÜŽ Ž Ž ÎeaC¦—ÎEðÿ‹e3ŠËe Ëe ã+(ËEõ5 Ëe3Š ËE—£z ‚—£a‡õ5 ÎE ΋�õ¬†³ŠË €Ë5 »w�÷ ¼CÃeÓ5@ûœÁaá ÷ –ÉõÅ€4Š w ýÁfÎâË•6ŠÀ€ŠÀ ƒ_ìôBà R”ü�÷ àÄ@ (ÁT÷ nÁÛõµõÕÎ¥ æ ÎBËE ‹U÷ ˜þÖ ‡ô‹ 9õ‹ ö�Î¥õ ð΋ô‹ éËU€Ö ÷ >»f*5Š*õE€÷ ¿Úu÷ 8Ô‡õÕ€´Š Ë5Ëe�þÿÎ¥ ÎPC ÀË Å�Î¥ÂÎ¥ó,óó Ξ³ŠË59ËUÎΕ\³ÎÎe³ wBýÎ¥ Î\CËEsóîÎ¥Šó•Î¥}øƒÎ¥ó•öËUÎWCØÎ¥ ³“ËUË5xÉw„ý»“óŠËU³ óE�Ë5ëËE±B�Â5@p Â5õ‹.€Â �õÕõ•ñõUô•õE��.‡ÁT÷ n¿‡ PCÃeË%P†ËPæÓEý“ Ãå‡zCŒG.HØHw î¹`÷Ø tÿõµ‡õÅ4ŠwöûõÅŠþÿw`üõ5. 4�³•óU@õÕ‡µ•,õU€.‡w й`÷t& Îe¦Î5`ÎE€ÿΥΥ Î¥w€ýóUÖ ‡óEó‹ø€ÎœóE€wxÿóE󋿀óUï sþG€œÊU@‡æÅÿDCÃeÞ ƒ‡ÂILLLPNXN–NÒNORP^PfP�€ bQÖJ…€ bQ J@�� bQÒJ‰€jQ´JˆÄÿ¬PbK`ŠÁ¬PnKˆ€úÂPäJ ˆ‚úÖPäJ@�À¦PHKP�€¦PZKp�ÀŠPHK‰� jQ´J÷ (À†‡sI3 I3 I3ŠI õµÀUÀÂI02 -ü5 ) Â:I@ À5óUIÀEÀµóU€IÀE ÂeÂ%²IùÀþd�´” ´”³Izô•óUIAÁe ÁEB BsIÁe r2 ò2Áeò„€r2 òw.W-†õ Àú(5 ó@IóœIIõ5@ TÀô³ŠIó(IóœIIHÀusI �õ5@ Àõ÷ æ¿w¶þõµõ5 Á%ˆ€õÿÿ3 IÁEóU@IÁU5 óU IõE õE=ÿu] óUIõU óU I5 ÀñõµÂÂIRÁEàÿW õEÀ W †õ5 òUþÿRõ5R�ŠJŠ Š Š ’ J4�ß• þÿ Ê‹€òIþÿóUI ô•óU IóÎKIŠþÿ‡,óUI‡õÕ‡ó5Ió5@I ó5 Ió5 IóUIŠþÿõ5  wÊ‹ €Šþÿ´Š óE I{IôŠ é4�‡ó5€Iõ ó IIÀýwÔó%ðLI;ÂI³IÊ�€3� I3� Iô•ô• óI IóðLIóU@IôŠ À÷ Ê¿ô• ô•‡õ5 îóE@IÊIó IIôœ Iôœ I w¶þw Þ´@ÅÞû ô5I‡ôEI÷ ~´DÂI2 �¦ÎEàÿ—#J—#Gõµ'ò5 #ò5 õ5 ò5€—#², —# €À €,ó‹IõU€ õ5€ õE €ÀE€þÀ%ò5€õU 3ŠIò5 ³ŠIÖ õE- ò5õU ò5õU ò5õU ò5õU Á5@õU ÀÁEñÿ±¬ ²IÁ y*Ió5IQóEI3 I�ÁEÿõÁ%³ Iõ• Á ÷ Ž·Á%³Š!Iwfûõ5 Ê¥…€Ê¥‰€Ê¥‰�ÀÂ"ò5€Àöò5Àóó5Iõ5 w”ýò5õ5 Àô{Iw\ó‹ I �ÁEðÿÁ%Á% ò5ó5€I4€ÀEàòó IÀ¥ À¥À¥ Ûõ5€ !ÊUóIÀ¥ó@IÀ¥ õ5 ó¥ I†ó• IóŠIhó I`À¥bó‹ IZóIIóÞOI³I³IóIó‹Ió Iʈ�òI13 Iô•ô• 8¦Žì³eIó‹Iò  ò5æIÎìI²âóIIó‹Ió I³ Iʈ€Îò èÊIÊEòIô• ô• óIIw|ûóŠIûÀüÀÅw< ó^PIóU Iô•ô•ð 4�‡õ5 õ5 õÅÀÅA _À �õųŠIõE Tõ5€ LóÒPI !Ê5=ó5@I#õ5€ ;³ìIóQIʈ�òô• ô•Ÿó IÁIõE€ õU@ Àõ ó0QI³ Iõ5€ ó,II…ÀÁIóIIÎõ5 ÀA�ì÷ óEI÷ x¹wFøó5€I#f¦ ÂIñ¥ ñ¥ ÷ 4¼q "q ÷ "¼ q q" ‚�‡RêQDBŽ áàÌQêQÑHÈÀ¾2JRbR&RDBŽ áàR&RÑHÈÀ¾2JRJR +ÀýžR€RDKð#áàbR€RÑHÈÀÀàRøR¼RDKð#áàžR¼RÑHÈÀÀàRüàR $ÿ4SSDL”%áàøRSÑHÈÀPvSŽSRSDL”%áà4SRSÑHÈÀPvSvS ùÊS¬SDMn(áàŽS¬SÑHÈÀöi T$TèSDMn(áàÊSèSÑHÈÀöi T00AH[[l1DATADATADATADATADATADATADATA T " ÿ`TBTDP€-áà$TBTÓHÈÀ€€8¢TºT~TDP€-áà`T~TÓHÈÀ€€8¢T ü¢T 0ÌýöTØTDRÒ/áàºTØTÑHÈÀ`8UPUUDRÒ/áàöTUÑHÈÀ`8U8U ÀüÂUnUDUTÊ ?á8àpkPUnUÑHÈÀ:V’UZVàUDUTÊ ?á8àpkÂUàUÑHÈÀ:VV::V hôÌKgÂVxVMU$¸ ¡xà0kZVxVÑ@á¢V:¢V ,@ù Kg&WàVMM(x5¡xàÂVàVÑ@áWW 6 õ¦WDWMSD"I¡xà&WDWÐ@áŽWfW ŽW %RõXÄWMT =¡xà¦WÄWÑ@áêWþêW 4àxX0XTT0HààX0XH`X€€Ë`X€ pÿŒX‚XTI xX‚X X–XCO ŒX0X´XªXCL  X0XÈX¾XLB ´XêQÒXSY ÈXêQ RSX-11M/RSX-11M-PLUS Standalone Copy System V03 ÀîÐ�P��P÷à0֦ƊÀàôÁÀô ÿÀÿÄ PRÉSÅe€Ä ÷à€ÿ· ¦æ*÷ „ªw ¬ÜXÀÀ7 z› È ‡Áe ÷e j›×-f›€õ‡w^¬÷X›ÀÒ«È †À`õ7Æ«÷bõ¾«÷¼«÷<L¬È †Àfÿ7¨«7¢«7 ¢«÷<2¬ß`@÷ôh¦À%`õ÷ôX¦÷`V¦Áv«Év«ÈM÷à0þ¥ÀÜXÀmv«ÀMr«ÁPwx­A@”7�X¥÷‹R¥‡ü€÷…ü Øi8edødÜkdød>dPdd–,ðj¬ ñød(tdDdDd‚¾ëÀÁðÂd"'ôdÒX‚XÒX‚XPd?d2eFePeF–,Pdðj>ndPdd–,ðj¬ ñød(td6DdDd‚¾ëÀÁðÂd"'ôdÒX‚XÒX‚XPd?d2eFePeF–,Pdðj>nevf„h2(gˆf2–,PeðjéU(g(¬f|f|fz$ÔXÀðzzrg$g‚XÒXÒX‚X‚XªXˆf?•|fU€TXÀ$Ôû2û2g6gX€$@2üu¾XˆfUU‚f‚fbgAhtgA–,ˆfðjâh(˜ghghgÔiz~ÌÈðzzîghÒX‚XÒX‚X‚XªXtgxhgâ€aÈ~Ìœ'Aœ'h"hØi€$@A u¾XtgâângngNhdìh`hd–,tgðj½Jìh(„hThTh¬jf¾ÒÀÁðP©æ ÆhèhÒX`h ²ThJŠIúÀÁ¾Ò|³ qd q|³öhúhød€$Pd¦t¾X`hJJZhZh&iêô2Øi8i2–,`hðj}@Øi(\i_ ,i,iæz~ÌÀÁð††z‚²iÔiÒXÒXÒXÒX‚XªX8i€ÿ�,i@ˆ?øÀÁ~Ìö2öâiæi(g€$P2•t¾X8i@@2i2ij–°j$j––,8iðjE8°j(HjjjfþØÀÁ𠡦 Ê Šj¬j‚X$j ÿ­j8Š7öÀÁþØ|³ÊQ–ÊQ|³ºj¾jìh€$R–ƒt¾X$j88jjêj–,$jðjE; k€€ k_ ú@æêôß êôß D¡Ÿêô‡æ:d”k 8ZV0Nk_ ú@æêôßÌêôß ¡Ÿêô‡æ:d0k”kÌAPU0Žkðjæ:dpk”kÌy¤k€€ ²k”kKgÈ_¸k°Èk€€†Ök¸kR%Ük°ìk€€À8d8e00AX[[l1DATADATADATADATADATADATADATA00A`[‰V§3eaek›’00Ah[[l1DATADATADATADATADATADATADATA00Ap[‰V§3eaek›’–ÄzÄ ÃDÄ”Ä<ÃŽÃjÃÆtÃÿÿŽÁòÂÿÿ4À>À,À~À†À†ÀŠÀ~À~À‚ÀrÀvÀ’ÀÒÀÁRÁ<<<<BÀ˜Á¢Á�ÁâÁêÁêÁîÁâÁâÁæÁÖÁÚÁöÁ6Âv¶Â<<<<¦Á€&ò­&ý†·Šýð €Àe2 *ƒ€(ï7 ý�ì(@Á÷ ØI€l,¡±‡&� �ì"@Á÷ ¶I€l.€À 1üÿ@ Î ý€‡�W,  �ñ � ñ ±¡‡ñ<üÿ€&ðU€‡Dƒ Ë5Gò  €ñ €wìò <zñ €±,Ü�1 üÿ1 þÿ7 8ü÷ ÿ'‡@œþÿÀEðÿ3` @þÿÀEÿÀ¥ À¥ÿ îÛÀ¥ÿ äÛ÷ hÿ€&Àe2 *ƒ€(2&ÖÆÛ‡f€1œÿÿ� ð ñUÀ ð Áer $ƒ�"r �‡Á @lÀ� ´ƒs�‡‡ò•2 ò€ËU ó ²" ²(&òŠò±2Û€Àe    æƒÃe �ÓÕ€€œ Áÿÿ� € ýÁ Á Á K�€œÁÿÿ� € ýKÐËÕ€ƒò2  ÷ Z÷ À‡÷ øæƒÃe €÷ ÚSÓƒô• ô• tõÕ€òlŇ÷ Ö†w:ÿ4�ò„Ň÷ ¾†w"ÿ4�òœÅ‡÷ ¦†w ÿ÷ ò¡JÚ&榃„œ‚,€ð<üÿ0 þÿ÷ FKÓUÀÄ ò‚„œ ‚.€ð<üÿ0 þÿ÷ SÄ ô‚ƒ„‡ 0 ò‡ ÀmúA Ámþù‡Áìô vÁåÀ€ wæù7äù‡ ñ �±<À ÷€€`p1 ò òe¡±‡0 æ2Î þÖ ‡úõ5@ËUõUIÆe�ÿ &‡ƒÿ ‡Ë5Ë5þýw°ì£*¢0¢Š¢è¡Z¯ÿÿÈ_!î¤"Þ¤Pª!î¤@æ§ !î¤!î¤ "Þ¤"Þ¤`"ؤª€¦`Ц¨H/Ü¥H§ /þñýý¾ôüüúÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÔ ¡:¡x¡Dìôwæõ5Aõ5 õ500Ax[[l1DATADATADATADATADATADATADATAw,eƒ¡‡ƒ±‡‡ ŶÿDô  ÷ Œ`4 ìô̇ìôƒË5 Ë5€ó ËU@w w^Ë5ËEޱwÁ÷ œþw”þsÒ ÷ è ‡÷ * ÷vÿ bò•÷ à‡Bñ¥@æZ¯Þ ‡µ¬úõ5@ËUõUIÆe�ÿ &‡ƒÿ ‡Ë5Ë5þýw¢Ë5w¬Ë5wæ Ë5wøË5@wH ‡ÿ Þ‡ñµ@wpÿEEñ¥‚wš ÀCÀ üƒ¤@ ÀEàÿÀ%À%÷ އû ƒ‡Ë5‡ÿ zËE?~ËUÀÀeAfñµ&æ÷ ¸lƒ÷ š €�ñƒƒòŠwŽô•ô tõÕ€ÃeÀó ó"À÷ jlEC Àñ÷ ªƒóÀÀeÈ �Áef1  &0€ˆËU@ÀæZ¯Þ ‡õµ@õÕõEßó5 ñ‡÷ X7’üà÷ 0 ‡·ˆü�ñUt ¡‡À¦æ÷ þhƒ‚÷ V ±‡Âøa‹,³,ò5 ò ‚ï‚ ‚뱇†±w–þ7 üËU÷ * Àž ÷ „1 1 ñÐô• ÷ 6rœ@ ÀEàÿƒÀ ±wPþËE$ËUtœCÀ& ÷ Ë5@ ô•ô tõÕ€fæZ¯Þ ‡õUIú�ËU‡&œÿ t· vûñrûñEðÿóÅsÜñ1 qÝ€1œó5 ñU ‡æP& õ5Àô3& óµ %&¦æÂÀÃÃeÿ ŠÃÀ`B‹‡µ  ‚ ‡5 ƒƒ‚€À샂€óµ ÎU@ó5 ÎU€Ö wò÷ .ÿ±U ññ ñœññœ± ± ± ± ñEüÿæè¡÷ ¸÷ Jñµ€ ÷ ·æ& ÷ ®�@Àe$f¦æ÷ riƒ‚�‡f w˜õ5@ Àôw`ò¥wPõU€ð÷ À’ ÷ zþñU æè¡÷ 6À& ÷ >€À¤ ÷ Rþññæè¡÷ ÷ šÀ% ñ% ÀñÿõE& w& ÷ òõUwzó5 w¼÷ üýññ ñññ óæè¡÷ š@0÷ "& w¤óµ wl¦ææÁ Àœ€ € € € æ Î Á @ ûÁ� � Ö æìôìôÁeÀQPQRó%I*öeŸìô�ƒ‚Àæè¡w€Àþ æè¡wr³ÿ ¨¦€ÀeÁ÷ Òg‚Àƒ3 4�ñÅ€õÕ€tóÿÿóÿÿ‡Âæ ðÅ€÷ ¤ö¢ü¢<£´¢­ÿÿÈ_!V¥"0¥PJª$Ò¥ % @§% ª¦% ¦` ¦pX¦@ l¨ Ò¥Ò¥@!P¥Î§ þñýýÅôüüúÅÅüöÅóüñõÅÅÅÅÅÅÅÅÅÅÅÅ ¡h¡’¡00A€[‰V§3eaek›’Dìôwàæõ5Añ%P ÃÃÅ,Ãûƒ¡‡ƒ±‡÷ ` ,, ðÕ ÊUõ5õUì‡ ÅvÿDô  ÷ ^`4 ìôž‡ìôƒË5w Ë5ËEt±wªÁ÷ ‚þwzþsÀ ÷  ‡÷ ¼ ÷\ÿ Hò•÷ x‡7 Hþ€Àeð% úðµ öðµ@ò7þï÷ þ)ÿ 7‡À þD÷ v .‡ó À€ ÷ ¼Àìý1œ ñEðÿ 1ðÕ@æÆ¡÷ ˜ & ÷ p¼æ­Þ ‡õ5úõEö÷ ËEƒ‡Bñ¥@æ­Þ ‡µ¬úõ5@ËUõUIÆe�ÿ Z‡ƒÿ T‡Ë5Ë5þýw\Ë5wË5wÆË5wfË5wÒþ‡ÿ ‡ñµ@wpÿEEñ¥‚w� ÀCÀ üƒØû ƒ‡Ë5‡ÿ ÈËE?~ËUÀÀeAfñµ&æ÷ lƒ÷ F €�ñƒƒòŠwô•ô tõÕ€ÃeÀ÷ æ­Þ ‡õÕõEßû5 õ‡÷ ²7@üà÷ 0 ‡·6ü�ñUt ¡‡À¦æ÷ ¬hƒ‚÷ Ʊ‡Â¦a‹,³,ò5 ò ‚ï‚ ‚뱇†±wöþ7 ÆûËU÷ 6À’ ÷ „1 1 ñÐô• ÷ jrœ@ ÀEàÿƒÀ ±w°þËE$ËUtœCÀ& ÷ Ë5@ ô•ô tõÕ€fæ­Þ ‡õUIú�ËU‡&œÿ "· $ûñ ûñEðÿóÅsÜñ1 qÝ€1œñE ó5 ñU ‡æ ×, †Àúÿ õ5@ Àôæ æ Ö wp÷ xÿ±U ññ ñœññœ± ± ± ± ñEüÿæ´¢÷ 6@ ÀEàÿÀ%õE0£ ÷ ‚À%õE@ f wöõ5@ Àôwð÷ øþñU æ´¢÷ è÷ H õE ã & w¾æ æB ÷ Æþ±U æ´¢÷ ¸ñÅ ñ% 1 ÷ À% õÕõE0à õU & wpõ5 wjõ5€ð÷ À† ÷ ^þñU æ´¢÷ N&fÀ& ÷ "€�€wöó Àwõµ õ5@ ó Àõwü÷ þñU 1 ñ ñU 1 õµó ñU€ 1 1 æ´¢÷ Â÷ " õõU@ õE0£ f  öŽ wˆó Àw„õµ õ5@ ó Àõwf÷ nýñU 1 ññU 1 õµó ñU€ 1 1 æ´¢÷ ,÷ Œ õõU@ õE0£ fwúÀþ æ´¢w@³ÿ "¦€ÀeÁ÷ Lg‚Àƒ3 4�ñÅ€õÕ€tóÿÿóÿÿ‡ÂÔ ðÅ€÷ ¶aðÕ€†ƒ‡C3ŠA ÁE÷ txõ5 "õ5€ð÷ À† ÷ NüñU æ´¢÷ >ÿ&fÀ& ÷ €�€w䦶¶&æÿ <Á€ÀeH É AAõÅ€ñÕ€t4�4ŠõÅ€4 ÷ bfƒ€�À óµÁƒwŠ÷ ÎaDƒ‡ñµ @œÀE€ÿ ! ÀÂõE c õU ‡fA ÁEàÿÁ%Á% õU õE0à @œ˜ ÀEÿW õÕ�‡� Áe÷ Áe÷ ÷ ‡Cà  qÀÅ æ÷ Fÿƒø‡wŽöÀ  H Àeû‡ó ËEw¶øËU ËEÀŒ œÿ øÀñ1œ ñEðÿ 111q�1Šÿ Àwjøæ´¢æ­Þ †wöõ5øõEõU÷ æ\«Àz ÷ ^ú÷ XýõEu u"@ ÀEàÿÀ¥ õ5@€ÈUõUõE@÷ ~þf ÎEàÿÎ%ÀÖ õEX� õEñµ õÕ ñ5 õU ñ5 õU ñ5 õU ñ5 õUÀ%õU &×, @×, pN wvýƒËEwX÷ÿ ´‡wîþÆe‡€æìôìôÈ Ÿìô‡&€Žf¦æ&€Þ ƒ‚�€‡æ´¢æ­Þ †w¼õ5øõEP÷ Äæx¬Àt õU÷ ùõ5ó5ñU ó5ñU ÷ ÜûõE@ ÀEàÿ€ÈUõU‰õÅ×, @×, põÅfA Á%#ÀýÁ%À¤ÀÁEàÿÀ¿�& wZüƒËEw<öÿ ’‡w(ÿÆe‡Á$¦÷ ²Z‚‡æ Î ýÖ ó•s¡Ãûÿ±‡¦æ@Á$÷ ÄZƒ‚‡f¦æÁ¸XW,MUBœCœÂEÿÃEÿÂà‚ C3!óÕCl öA⃂�‡�fæÃ Ã$Åõ5ó%MUô÷ÜòæœÎEÿÎ쎊D-ƒf¡Þ �øòÅlΊñÖ Ú7 ¨òƒ…Df±‡Ë50ò•±w¦õËU4�ÿ p‡wFü‡ËE @3 œÀEðÿ1 ñ ñ  s,‚‡s,‡ÿ "wœÿÿ ‡fþØÀÁ𠡦 Ê Bd‚Xðj ÿ­8Š7öÀÁþØ|³ÊQÀÁ Æ ‚¢Ÿæ¢öì¢[qò¢Ösî¦u~nªLqò¤Uq¨¥ >ÊQ·ÐÿÆÌÿ÷�ÿ÷ ˜ÿ÷äÿ¶ÿÀ°ÿ ÁTþˆ6¡wVf×­¦ÿ÷ ü7 ’ÿþˆ„¡À:dÀe ÷ n†Å,dwîbwtÿ@ÀE0 û7bÿÂÚc2>‡ÀPÿð5Á÷ FÿÉ$ÂP ‰Á’W a‡W z‚Áå S�W  W W öÿêã• wÿ (Àøþ$ ÷ D †‰Ââ ÷ <Ê Âø ÷ 0Ê ‰ÁÒþñ5 ‰”W  W  ùÀ ·²þú wÞþJ ÂeÊ ú‡Å² Õ¡Õ w榠ÿˆ†÷%ÿÿÈ] ææ)ÿˆ †÷¥éÿRþæ1ÿˆé‰‡€–%÷þ&Ž ÀDþ7þЕ Á:þ÷ Ò Ð• Е-Е-Е � ÷ ö Àíòý00Aˆ[[l1DATADATADATADATADATADATADATA7ðý÷ ˆÿwBþþÿùÿøÿ ‰ ‰‰‰S/æöÿæòÿæîÿ÷ °÷ êì†ÂÚ¢’Ò´ýʲýÀ°ýÁÂý@ ñ5 ‰æÚ¢ÿˆ‡‡Àð\ 1 Ì¢Ñ ûqÒ¢Â�œ�œ&À€ì�÷ ¤i€lÀEÿ€ ÷ J Е:‡ ”3”÷ ¼ W +†s— :&þˆä£Âôaò"‚úÅr¡÷‡r¡ô‚„œ�á�lÅ üv¶‡Ã|a³Š ±‡” —  � ”ú—  —  ¡±‡&÷ & — .”€÷  Ö ‡&”—  ü‘ É‹ø”— = —  — —  óÖ ²Ö €±¢‡‡þˆf¤÷ a÷-aawPr÷aø`ÀÐ`° ‡þˆ¨¤÷-ò`ä`7 Þ`÷ Ô`÷ r‡¢ ÃÀ  # Á÷ nS‡÷ dS‡”þ 7 ìûþˆæ¤÷ ¤k‡7Þû‡÷ Øû‡ ‰‰’—  Vþ ÷ xþ†Ã O‰S÷ Öþ— =H÷ `þ†Ã C‰Kñµ‰÷ ´þ9†Å†ûÄ„ûð%TI+@ð%TI%0 ûð5€ðµ@ð !ô5 A@  øt‡‰‰‰‰‰‰÷ þþ÷ 8þ‡‰À ûð �‰þˆ¡Â¢€,‚ú2&D ð5ô5 &f¦&@ € ú2‚�€ÅeMÅtÉÄ÷ ìhÔ ÷ æh%÷ àhDÄe ÷ &i‡@÷ w¸`TSMHRSIUIC‰ ‰‰‰÷ ¸ýÀ ž 5 5 þˆ§Á÷ 8`‡5‡D‰Ã à ýİù1$ ÷ ®üňù[‡— //· ~ù— 0‡— 9‚À ÷ lù÷%fùNÀ ÷  ‡ä— :EAC÷ ~ ?‡À ÷@ùÖ÷ :ù8Á 6· 0ù÷ ~1‡uÉÁá¦÷ ~ü†Áݦ÷ tü"‡!…Åe ÷ H‡å Ò� µ…¤[÷ 8üu�Â¥,÷ (üu�Â¥]¡wD„ „ „ ÷ "Ä tæ¦÷ .U÷ ‡M‡ ± Ô¦� ñ‹Ô¦ù±AœÙ¦‡‰ ‰‰‰ 7 ðÿž @EÀ À H@@] ÷ ¤÷ zõVøþˆ„©@œwNfdw6ø÷ Nw*øÁ(øw"øu÷ \õøõ øÃøþˆ„©Ã ×  �Á �ìÂ÷ Ðu`u 5`ìþˆ„©æCÃe÷ ]ó þÿ‚  Á�ì�lÎ%ó þÿ‚÷ ˆu`u 5`Ž —#äÁÆ\ÁíÐ\ ïÖ õx÷÷ ’�Àl÷ð5€þˆ„©AÂr÷÷¥p÷ðU÷ ºg‡÷ ¦‡÷ ªþ‡„ „ „ 7œþ÷ ô[ó÷ „ÄŽþÄ t4¨& f €À �&÷ &c€v�÷ c6`Né�€‡A B ÷ ºÿu 5 õ•õ•‡BA÷ ˜ÿu5Pµ ‡þˆ4ªÁÀ”ö÷ X]‡:://¶>J&zQÒ�QÖAÔA� ˜wL^îYË;; c¢ [Ádöñ5 ‰7 æÿÁ¾ Â  ý÷ ¢— :— /÷UÂÿÄ9ªÃÄ Å`ª÷ F‡÷U¨ÿþ ÷ ,‡—  Â¥ ݉×=Œÿ÷ è‡ß•àþÿÃÊ ×=tÿwúZ÷[÷[÷úZ÷5ZÿÃÄ ÁáááŠþÿ?‰À Á¾ ß•àþÿÑÄZÑÂZɺZŠþÿž Ã‚õÄ6ª÷ ZÌ‹•úÓ• AMu÷ @Ó•-AÁ Á A<ªÀ÷ êÓ•-÷ "÷>õõ÷õ÷ ªö‡U U ¡±‡@Á ÷ DaÁe0Àe0�S�‡ÀðôÀ À œ½À ÷5Þô� w Ôô±‡Ä6ªÅTª÷ ¤ÿ‡SŒ „ ÷ (öÌ‹ô‹£:±¡‡w Ž„ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ \`E�€Aa×$Ò±œÿÿ‡æ æ * æ + æ2æ3ÁEÿæ ÎE‚w Þ…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ ø_W ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡Â Âw v ”Å¥ üÅ¥ ùÅå0B¡†€÷ †_Aa”ôœÿÿ‡÷ &÷ &÷ �’•’•€‡@Á(÷ j_f€  Àe ÀeÉÿÀe Àe ‡&æf…Þ ƒ„…‡z~ÌÀÁð††z‚VxÒXÒXÒXÒX‚XªXðj€ÿ�@ˆ?øÀÁ~ÌöÀÁ  z‚”‚PDB°!؇DKÂ$Ö‡DLœ&àˆDM¨) ˆDPz.‰DRr1 ˆDU:‰MM–8Ö‡MSMÖ‡MT @Ö‡MU:‰fƒ� RSX-11M/RSX-11M-PLUS Standalone Configuration and Disk Sizing Program Valid switches are: /CSR=nnnnnn to change the default device CSR úƒ™ /VEC=nnn to change the default device vector /FOR=n to change the default magtape formatter number /DEV to list all default device CSR and vectors ˜„) Device CSR Vector CSR Statu00A�[‰V§3eaek›’sÆ„) ------ ------ ------ ----------ô„ Invalid device… Device not in system"…) Only one device of this type is allowedP… Input I/O errorf… Input line too long€… Enter first device: š… Enter second device: ¶… Syntax errorÈ… Invalid CSRÚ… Invalid vectorî… Invalid formatter number † Waiting for UDA to initialize0†< Hit RETURN and enter date and time as 'TIM HH:MM MM/DD/YY'p† FOR=Not PresentÀbƒ÷ Àöƒ÷ ü7 äû·ðûÀ|…÷ ‚÷–†äû÷ ,÷ÐûÈûÀ–…÷ j÷¶†Ìû÷ ÷Ö†ÂûÀ,†w°æ3ÿˆ ÂzŽÄ”‚Å‚Ž7 –û÷ p‡÷ Œû„û‚ ÷ ª÷ ˆû Ápû1Š tûÀ²…wfÀ…w^÷$Ðû÷ læƒÿˆ"‡÷¥ö:û÷‹4û÷‹/ûÃ*ûê3Š”‚Á”‚W¢a‡W¢z‚ÉÅ Ñ‹ö‡wRÿÀb…wÀL…w÷ Æûþú7 hû÷ `û7Xû7Tûæî‚ÿˆ‡þˆÔ‡ß•àþÿæЇ7 Ðú÷ "|Ê †· Äú‡Šþÿ‡X÷ ˆ  ñ• ñŸ ‡ Nñ• ñ¾2 ‡÷ V  ñ• ñ` ‡ ñ• ñ®³ ‡ ñ• ñ ¢ ‡ "!ñ• ñ€a ‡ò rœ€ÀEþò5ò5 ñŇÀ…wîþÀð„wæþò @œ2ÊÊ‹þ€ò5éò5 å÷ ¾ÿñöi ò5 ñÒ ‡ò @œÀÀU Ê5€€ýÊ5É÷ †ÿñ( ò5€ñ ‡ñ@œ @œÀ –É–Éò5 üÿñ qŒ §þˆz‰7 PùED�A@A õÅæêô êôù Ÿêô‡· ù‡÷ ù‡õÕÀ…wöý÷�Îîø‡÷�Æçø7 äø7 âø‡÷ºØø‡ÀƒÐ-Ìø$È úÀð„w¾ý7¾ø7¼øÂÌQò-¬ø‚úÀ…wžý÷-˜ø�ø €ð-ŽøÀ…w„ý‚ò�~øò�xø�ñ�nø÷%MMdøñ�bøñÕwNøwJø‡Â(— à‡÷ hý÷ Fø Á.ø÷ 2þÂ(øò ‡ÀÄ…wýÀø †À5Âø �ÜÁ Á ÷%:‰þ÷wö÷Ñ`Èî÷p€ € 2�‡ÀÖ…wÔü÷%MMÌ÷ ×-¨‚÷ À÷wäþÀê…w²üÀ²…wªüÀ”„÷ ´üÀ„÷ ¦üÁƒÃÌQÉ,ÃûW×,MUó OÅDÀ”‚7Z÷Е P’Pœó%MM Âr†÷ ’B�÷ |ÂÂ Е  ü ÷ Tü÷ ^ÂЕ  ü Ý  ÷ DÂЕ  üÂx†÷ ÷÷ 8Â}†÷ 0ŠÀíØö7ÖöÀz‚÷ êûÁeÉ �Àl†wÈûf� ÷ �‡�”þà‹‡æ æ * æ + æ2æ3ÁEÿæ ÎE‚w Ê…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ ÈW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡7 &f¦wì÷‹è÷ Æ7 à7ÞÀâÈ @•,€ÀåÀÿq `-KacJE[à !Ãm¢Äíž@•Á †Õ Á ûα)÷ L÷ R†é  çà å÷j7•jà f@• †Õ †&Ý €…Ò€Ö À5]U ¦†E¤¯‚…€Á(‡ :Á‚æ&@E÷ ÿA ·Îà· ̆ª ÷ Š÷ Р¢ÂÀEÿ÷ vœÀEÀÿÀ €cÁÐÂΤ‘Á ü¢ÿ­÷‹¹‰÷­´±¦†„÷ @�Á à £.„ à · ’æ&fÅŠÄ„ÃdŽÁ ÷ 6÷ :…„ƒ¶à ÷ 8 †À ÷ "†À £.£$· B„ à ë÷ 8‡Ì¥Z‡£A‡Ì¥9‡£0 ‡ à £ £ ‚ „ à ö‡DEVÿCSRÿVECÿFORÿjŽnŽrŽvŽÊ/ŽŽÀ„”Ž€†ÜŠÒ‚�‰Ò‚˜‰Â¨‰¤ŽÀ€:‚°‰Ê/€�ºŽ‚ÂŽƒ„ÊŽ=€Â†:ЍŽ=€Â†jЍŽ=€Â†²Š¨Ž&æf…Þ ƒ„…‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡w °Á w ¦Á& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡&æ¦ff… Þ �‚ƒ„…‡f¾ÒÀÁðP©æ BdÒXðj ²JŠIúÀÁ¾Ò|³ qÀÁ þ¨00A˜[[l1DATADATADATADATADATADATADATA ÷€¸ÿ7 Âÿ7 ²ÿ7 Úÿ7 Øÿ7 Üÿ7 Úÿþˆ®©À\Àe ÷ ìe‡@Ñ w’ÿw�ÿw”ÿwŽÿÁ”ÿ÷ ð]÷ f÷ Œ‡ÅÞ[w ZÅjÿwZ7ŠYÿ7ŠWÿ7ŠTÿ÷ Rÿ ÷÷÷ JþˆÞ©÷ *‡/Áþ w ÷À À ýÂú Ê(ÿâ&ÿÃ÷àö÷  †·Šÿ÷¥æþà õ÷U€êþ÷µ€Õþ·Šçþ÷ †÷ F†w¢÷ d÷ ú†w”À£÷ Æþ1÷ L÷ †w|÷ R÷ Ô†wnÈ5€÷ t-È5@÷ xwFÈ5È5þˆ´ªõU÷5^øÀ÷ úa‡wDÈE€`Ð]NþÐ Ð\þÐZþ÷ Ø÷ ¬†w÷‹;þ<ÁÀþ Âþ¦ R Á ü÷,þö÷(þúõ÷ 2Ã÷þ æõ÷Öõ÷ ÷þ¦Öõ÷aÆõ÷ à îw(÷ ‡Â÷þ¤´õ÷¤õ÷ ‡Â û‡Ö ·ŠÁý÷ n ‡÷µ€�ý÷‹¯ýw8÷ f×­ŸýwZ·Š“ý÷ R†wL÷‹†ý÷U vý÷E€pý÷U@jýÀ£ÈE Ð]^ý$РЄýЂýІýÈ„ý÷ Þ÷ ²†w7Š>ý÷ î÷ b|‡Ám^ýÑ8ýÉ6ýÉ]ý÷5 ÷÷-Lý@ý÷-Fý:ý·Šý÷ Æ÷ (_‡Ám.ýñ@ ÷ RS‡ þ¤÷ �÷÷¨ôÁò ÑöüÑðüÑÔüÑÎü ÷5´üÉ÷ ¸&‡÷‹¬ü÷²ü„ô÷ªü€ô÷þ¤rô÷bô÷ Ž÷¥nü÷‹hü€wÖþ÷ (†wÌþ÷ ‡÷BôþˆÌ¬À÷ ì_ÅXüõU‡÷Èÿ"ô ÷ Z÷ ì÷ è÷üÿô÷0üô÷ôó÷ f÷ "÷ º÷âó7 èó÷ w>üæ3ÿˆ÷Öó&Àæ &ÿˆ†÷øRÎû÷‹Èû�¡±€‡÷ Òÿ ‡÷ Êÿ÷µ€«û¡‡±‡÷5@ªû0þˆÆ­Æå€È÷ |ó€ ÷5Œûˆ РДûÐ’ûЦûФûШûЦûÀÁÂ'ÄlûÄÐW÷ xq‡÷ tqÆe‡÷EÀ8õ÷ Ô÷ ¨‡&f¦æÀNûÁ<ûÂ6û÷ <ƒB ÀÝ:û÷ BÀ€÷ "Âm,ûA Ám$ûÂeA ·ûwû7ûƒ‚�€‡À$Wp>õU‡¦&æ²òæ¬òÂàú ÀÝàú÷ Œò÷ ¸þ†·`”òw ŽòÀ ÷±·„ò·‚ò€‚‡&f¦Â¨ú Àݨú÷ Rò÷ ~þ †Á ÷`Dò÷ pþ÷ :ò·`Hòw BòÀ îÁ ±‚�€‡Àþ¤÷pú(ò÷lú òÀþ¦÷húò÷dúò7ò‡7úÐ 7(ú7&ú‡f¦æ÷ æÿ·Š úÃ<©&÷ b÷ êù÷ ®þ÷5 Öó÷-ðùú ÷-êùúÀäùÀ À 7 öù÷Uºù€÷5 ¨ówB w÷ ƒ‚�‡À€÷ ¢Âm¬ùA Ám¤ùÂeA “SÀ À ‡÷þ¢Fñ÷ˆùFñ÷„ùBñ‡÷þ 2ñ÷tù2ñ÷pù.ñ÷e(ñw "ñ‡&f¦æ&÷ (ù7Š*ù7 Vù7 Tù Ä0ù÷þ¤òð÷"ùôð÷ùìð÷ 0þ†wä �`;W 8Á Á ñ ¥Ã<©÷ x¡`÷UÐøñ5 ¥C¥ÃEðÃ-Ðø ñ-Èøþ¤ÃF©·Š°ø÷ Dñ ¥€À ±A€  ÷ºøxð÷²øpð÷elðw fð¼ À�‚ — €¼ ÷eRðw Lð¯&f¦æ&Ã>ðÂ8ðÃívø‚ ÂínøÃå‚ À€÷ 6‚‚ ‚ �`@ ƒSÓ ðÓð  ‹„ƒ‚�€‡&ÅøÀ0©PHP@P�JŠP�KŠP� ŠH €‡&f÷ ŽýÁmø 1 ÷5 ºñ$÷‹Â÷!Ámô÷ÉÄ÷ñÂ÷÷ püñU &÷-²÷Ô÷ ÷-¬÷Î÷À¦÷À À 7 Â÷ñU€÷ äüÀ%þ¦ ÷5 `ñ÷‹h÷÷ (ýÐ�€‡þˆÆ±õE‡‡÷V÷,ï÷R÷$ï÷ ï÷þ ï÷5€(÷÷`úî÷ &û †÷µ€÷÷¥üö±‡÷ 6û‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡z~ÌÈðzzVxÒX‚XÒX‚X‚XªXðjxâ€aÈ~Ìœ'00A [‰V§3eaek›’È7Š„ 7Š‚ 7Šƒ 7Š� 7Šy 7Šv 7Šo 7Šl ÷•c ÷•j 7Šg ÷ 8Xfæ` ææÿˆÀ†wèæ" ææÿˆÀÞÁ" w2 w”0 Ñ‹÷ ŽTÑ Ñ5€æw˜Q7Š•Qw’QÃæTÓ- ÃeË ùÀÞw’Ë ó Ë-hQðó-dQìÓ$÷ÜR÷ÚR÷ØR÷ÖR÷íÎRFQ· @Q÷ÈRÃ÷ TÃE÷ 6÷�—²Ã¦÷ ÊVÃÊ÷ ¦TÀ† ÷ ÈÀÓ÷ ¸T÷‹l÷�g‚Ãl À† ÷ zTÀ† ÷ œÀÓ÷ ŒTi÷¥Y\eÀ.÷‹2ÀÏ÷‹+÷ r7 ®P7 ¨P7 ¢P÷%DU"÷ Tÿ $R÷%DU÷ þS÷‹ú;÷¥ü7÷‹ëÀ¢ ÷ .÷pP÷ LS÷EdPæ˜TÿˆÃº ÷ Vÿ ÷ ÜS÷‹´ÃÄ ÷ ÎSÀå† 7|PæÈTÿˆ†ÀÉ w>ææ)ÿˆö‡÷�šŒ÷‹}À£÷ ÀwBÃÃ$÷öOwüOæ˜Tÿˆ†÷%ÿÿpûø÷jû^¡÷‹V€7ŠQÀ(7"H$È ú±‡ O÷‹÷%DB÷%ìðÀd7 Á� ÷ ŠmЕ.ŠÀO÷•ìwŽúÿ¹ý~øüÈÅOð’¿@OÀjæÁ ŰTõ5 5 uЋµ ûfÿˆ†÷%ÿÿ¤úù‡Å°Tõõ" õPfÿˆ ‡÷¥öt÷‹n÷‹i¡‡À°À±‡ FMT -- Syntax errorDevice does not support formattingDevice not in systemFailed to attach device Start formattingDevice offlineUnrecoverable error - Device write lockedDevice not ready Start verification Operation complete Device driver missing Entering manual modeCylinder = Track = Sector = Manufacturer's Bad Sector File corruptDisk is an alignment cartridgeFatal hardware errorFailed to read Manufacturer's Bad Sector FilePrivilege violation ** WARNING - Data will be lost on : ** FMT>Invalid value for the DENSITY switchFailed to format -- volume has been alteredMedia format error -- volume has been alteredVerify Operation of FMT failedInvalid OperationParity error on deviceBad Block on deviceCommand I/O errorCommand too long Continue? [Y OR N]: Response out of rangeMarked bad in Manufacturer's Bad Sector File Error reading dataBlock = Header compare error Error writing header Error reading header Error writing data Start badblock utilityBAD :/LI/OVRUnable to run badblock utilityError limit exceededDisplacement = No track descriptor foundInvalid switchError setting diskette densitySkip displacement = ECC position = Error reading track descriptor recordError writing track descriptor recordTrack descriptor record: Manual defect information: Unable to read any Skip Sector FileSkip Sector File is corrupt, reading nextMarked defect in Skip Sector File ** WARNING - Error rate may increase**WLT switch missing÷•b÷•Z&À" ÃÈ÷ dLƒ÷ ^LЕ ŠÀ" ÷ zù÷¼H÷ ˜K÷E°Hæ˜Tÿˆ÷‹À�wºgwxöÿ)00A¨[[l1DATADATADATADATADATADATADATA00A°[‰V§3eaek›’00A¸[[l1DATADATADATADATADATADATADATA00AÀ[‰V§3eaek›’00AÈ[[l1DATADATADATADATADATADATADATAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  \T  |³¬  † €DKÀÈ ¶\DBŸ›6kDB¾2/6kDMöi› È]DMÒ/ È]DR`7 kDR®³/ äfDR ¢7 kDRD³/" lnDR€av 2 lnDL( `DLP `DYîŠnDYÜŠnDY¸ŠnDP@œÈ VoDP€8� VoDUÐp??æL æ, æx æz æŽ æ  æb ÷•Àµ&€7Æÿv¦æ÷ ì®ÃåÁ þ÷ ÂÃñÁþ÷ ¶÷%L œÿ ÷%, ”ÿ÷%Ž Œÿ÷%DMxµÃýÁìý÷ ŠÀºQÃ@ ÷ rÁªT ÷ f÷ ~÷%DRJµ÷5 €¬ý �ÀJ ÷‹ˆý€Àÿ÷ h®÷‹µÁ^RÂVT÷ – †W VTцýÑ�†ýÉ�€ýƒ‚€�÷Šì´ Àè ÷ ,®÷•ä´±‡¡‡ÀºQ÷ ì ÷ \Е.ŠÀºQw®Á:ýÀÂþ÷ ÔÀ0ý@`Á¶þ÷ ÆÁm$ý@ 76ýw4ý‡÷%DL”´÷%DYŒ´‡÷‹t´"Àå÷ Dw |þ†wìüÀñ÷ 2w lþ†wÜü ÷‹Q´Àý÷ w Tþ†wÄü÷ ‡‡ÀéR÷ j ‡À" È¥#÷ ˆ€ ÷ †ÀÑ‹>‡7  ü7 žü÷ hÿ ÷ŒüÃÅ" wz¬‡Ð”þà‹‡&æ  †€mÎ ù–%‡Á$÷ ­7 ̳÷ ,­‡Ã¾³3Š" À" ¢a‡¢z‚ÈŠЋöà ‡w,³÷(Vˆ³ ÷FV€³÷.Vx³÷:Vp³÷ ¬÷%DKh³÷%DP`³÷ ¦û÷ œû €7Ìûÿ H³†Ö ‡7 ¾û„ 7!Bý‡÷‹'³1÷‹³<÷¸û÷¢û¶û÷žû²ûÅZRÃÁý� ÷ ”« †÷e˜ûw ’ûÁ öÀd¯÷ 4ù÷ 0ùÀ ¦À(ù€ øÀ0žÃüÀZRм²Ðº²  Ðÿÿà ü‡÷‹�²Ö ‡÷ –þ÷‹Ž² ÷‹‹²À�÷ Ϋ7 û7 û7 û‡÷‹n²Q$W"ÿÿCÃEð÷ äúfŠÎ·%Øúw¬ÒúÃ@¡‡B 屇÷ zý÷­Ðú¸ú‚‡÷-Èú°ú‚¡‡±‡÷‹²%7 ˜ú· ’ú÷ ü÷¥ý± æüÎ Ö-xúæþûÎ Ö-nú÷-húðû7 `ú· Zú÷-VúÞû¡‡±‡À† ÷ ÜýÐ�ıÐ�Á± Áݼ± wJ÷‹£±?÷:úÅZRÀ" PPPPÁüÐÿÿÁ üÁ�ûÅ" à ÷üùú÷øù ú÷ ü©÷eúw üùÁ ÷÷%ÿÿª÷÷Öùêù÷ÒùæùÅZRÁPû� ÷ Ì©÷eÒùw ÌùÁ ÷±‡æ ÿˆÃ6¥3Š" ·Š±Á" ɋɥ É¥ É¥ Ñ• ò7Šó°ÀÏ÷ $ý÷¥öî°õ·ŠÝ°w ° Â0vÄ" ÅTv7 ʰ÷ x‡÷ À°â÷ T÷‹¤° ÷‹¡°÷‹œ°÷‹—°wÊ÷‹�°÷‹„°øÁ�°‡ÀÑw °÷�2~°‡÷�*w°7 t°‡÷"l°‡‡‡·ŠO°‡7ŠI°‡÷%DYR°>÷%DLJ°:÷%DUB°6·Š*°‡÷%DM4°÷%DR,°+÷%DU$°'·Š°‡÷%DY°÷%DU°·Šý¯‡÷%DY°7Šï¯‡÷�ªö¯‡÷�¢﯇÷�š诇÷�’᯷ŠÌ¯‡À' wh¯÷%DUƯø÷•Y¯¯‡÷%DU¶¯ð·Š¢¯‡÷` ¯÷ V÷P”¯÷%DM”¯÷%DRŒ¯÷%DL„¯×·Šq¯·Ši¯‡wèþ÷%ÿ$ú‡÷ ÷÷�T¯‡÷ Ðú÷ ’ú÷N¯Å" ÷Ö÷÷ ȧ÷ ˆ÷ €÷5 ~÷wf¨‡÷ &¯ë÷ Tùù‡÷‹ ¯ · ®÷· �÷÷-Œ÷ùÚ÷ âü׆÷ Nü÷‹ê®÷†÷À‚÷€ Å"  À ý÷ úÅ" ÷ Z§÷ ÷€÷‹¼®÷X÷ ÷ @û÷J÷÷e@÷· D÷ó÷ Àø÷ ÞùÀb  Â÷     �� Á-ŽøûÀ" Áb Âöö �`Ã÷ƒ 7 èö$÷ pø ‡· Úö· ðöà õ÷ ,üª†‡·Š?®÷ ºù÷ û÷‹/®·Š)®÷m:ø²öw ¬ö÷$®Ä" ÷ ¤÷ Ö÷ Rù÷„¢öÅ" ÷ �¦÷ Lö €÷5Pöw.§‡÷ î­ê÷ øù‡÷ ÀûÛ†÷‹Ñ­÷ŠË­÷íÜ÷Tö· Nö÷ û7 DöÂ" ÷,NöÀ6öA ÀRà ü· "ö÷-ö¦÷ð7 ö÷ ÐøÃÅ" ÷ ¦÷ Ìõ€÷5Ðõw®¦÷ö ÷ òù· üõ÷eîõ÷÷ ”øÅ" ÷,àõÃ÷ Ò¥÷ Šõ €÷Ìõ ÷ ¤ù· Æõ÷e¸õ÷7  õ÷ ZøÂ" À”õA À R à ú Ò Ã Ò Ò û÷ þö‡· hõ· ~õ÷-`õèöâ÷ ¶ú‡†÷ û‡‡7Š¿¬÷ �ù÷%ÿÿó"7 6õ7 4õ7 2õÄ" ÷ 2÷ d÷ Þ÷÷„.õÅ" ÷�¬÷ ¥÷ Òô€÷ ‚¬ø÷ Zú䆇ÁðôTÌìôÌŒ Œ Œ Ì]âôÌUÀ@@E@P· Ðô÷-ÌôTöèƒ7 Äô‡Á^RÂVT& ÷ ´ù‡ŽDœ  aaÂe" òEÀòP¦ƒƒCŽDƒUÊç· ‚ô÷-~ôöá7 vôÖ ‡÷‹ã«À” w‚«÷ ªøÀæõÀÀ 7hô÷ ÷ÃÅ" ÷ R¤-†÷PôÄÂõ÷ J¤†÷¥È¶«Á^RÂVT÷ ù†W VTÑôÉ�ôÑŒÑ�ôÑ�ôIœüÿ‘ŠÑ�øó· öó÷e ôw ôÄ Ø÷ BùÁ†÷ ¬ù‡®³®³/ÀÕ1 @Ò/ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ00AÐ[‰V§3eaek›’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7Š¥·Š¥ÃÐ`÷ ê÷ ’ð÷€@¸ù÷´ù÷°ùÃÈ`÷ Ì÷ ÆñÃÐ`÷ À÷ ÷‹Ü¤ÃØ`÷ ®÷‚ùpí7 †ùÀ" Ádí� ÐmÛÁ üÀ" 7 nù÷ · 6í÷-2íºîø7 *í÷ äïÅ" ÷ (� †·ŠFù÷�„¤Aù·Š~¤÷í×÷ Ìì€÷5Ðìw®�÷‹`¤ ÷ùúì÷ Üð ÷eôìw‹îì÷møøâìô÷ ~î÷‹ôø ÷‹ïø· ºì÷-¶ì>îÒ÷�Ýø¤÷ ò‡÷Æø´ì¬÷ jñ÷ºø¨ì7 ¾øÁ ì� À" ÐmÛÁ ü÷zì¢øÀ" 7  øÄ”ø÷ <÷‹’ø ÷„øpì· XìÄ ô÷tøbì· ^ì÷pøDì÷ þîÅb,÷ <œ †·Š`ø÷�ž£[ø·Š˜£÷6ìî÷ æë"€÷‹†£÷6ø"ìÄ4ø72ø÷m*ø,ø÷ þï7!$ø ÷e ìw‹ì÷møøëò÷ |í÷øÚë÷ ”îÄ" Åb,Ã÷‹6£Ãè÷ # 5-5-5- &f÷ Ì÷÷ &í…„#‡Äm²÷Åm®÷· „ë÷e˜ëw‹’ëà Û÷‹â¢÷-lëôì÷Œ÷bëwàþ÷ ¸ðû†ÃÈ`÷ œ÷ ñ>‡‡÷‹r÷õ÷‹m÷ò÷-8ëÀìë÷BëåÈ$ëð�$ëð�ëÈEðÈUÐÁ^RÂVT÷ ð‡ÈEÀÈP·Š-÷Áô`Âàf÷ ðï‡ÈU ·Š÷÷‹÷×-ÜêÈU Àmöö‡7Š?¢÷ ïÃÐ`÷ 7 ¶ê7 ´ê7 ²êÀ" ÁÎöw¸ê� ÐmÛÁ üÁ^RÂVT÷ Žï‡MÍUu÷ :í÷ö¡÷ |š÷ 8ê€÷ è¡ø·Šbê÷­^êæëà÷ ´ï݆‡÷‹À¡C÷Zê÷töXê÷pöTêÁà`Åâ`Ä÷ 8š †÷e<êw‹6êÁ òÀü w0¡fÀâ`Á ÷ @P Àø`Áô÷ 0H ÷-<ö²ç÷-6ö¬çÀ ÷ ˜š�Ö÷ $ö÷÷ öôÖ ‡ædN Á ü�‡÷²é÷°é÷.ë÷”.ë÷”(ë÷í&ëžé· ˜é‡÷ Îí÷€@êÿ÷æÿ÷âÿ÷‹ã ·ŠÝ ÷mîêféw `é ÷°,Âÿ÷¾ÿ÷ ºÿ÷ >ì÷®ÿTé7 ²ÿ÷‹¨ ÷ ÿDéÀ" Á<é� ЪªÁ üÀ" ÷ "÷‹‚ · é÷-é�êõ7 é÷ ºëÅ" ÷ þ˜ †·Šdÿ÷�Z _ÿ·ŠT ÷òèÖ÷ ¢è€÷5¦èw„™÷‹6  ÷,ÿÐè÷ ²ì ÷eÊèw‹Äè÷mÿ¸èô÷ Tê÷‹ÿ ÷‹ ÿ· �è÷-ŒèêÒ÷�ûþòŸ÷ Üí‡÷äþŠè«÷‹åŸ÷ŠßŸ÷íðéhè· bè÷ ,í÷Äþjè7 ÈþÁbè� À" ЪªÁ ü÷<è¬þÀ" Ä¢þ÷ :÷‹ þ÷’þ6è÷‹ŽŸ · èÄ ñ÷|þ"è· è÷xþè÷ ¾êÅb,÷ ü— †·Šhþ÷�^Ÿcþ·ŠXŸ÷öçî÷ ¦ç"€÷‹FŸ÷>þâçÄ<þ7:þ÷m2þ4þ÷ ¾ë7!,þ ÷eÊçw‹Äç÷mþ¸çò÷ <é÷þšç÷ TêÄ" Åb,Ã÷‹öžÃðý #5- ÷ üè5-5-&f÷ æè…„‡ÄmºýÅm¶ý· Dç÷eXçw‹Rçà Û÷‹¢ž÷-,ç´è÷”ý"çwÞþ÷ xìû†÷ âì/‡‡÷‹‚ýù÷‹}ýö÷-çˆèï÷ çéÈìæÈUð�èæð�àæ÷ hè ÈUÀÁ^RÂVT÷ Êë‡ÈEÀÈP0 0 Àm$ý‡7Š%ž÷ öêÀ" Áýw²æ� ЪªÁ üÂbRÊ%ÿÿ�·€æÍUµ·”xæ·”ræ5 5 ÷ &é÷â�÷ h–÷ $æä€÷ Ô�øà‡The RP07 is not supported at this timeÃÈÀ† ÷ °éÃDn÷ ¨éÀ† ÷ Ê–‡7 æ÷‹w�÷ æ÷Húå÷ –,‡ÃP÷ ò•'‡÷ ®êæ" ææÿˆÁÜ÷‹?�ÁîÁ-V�7 ºåw¸å7 Êå7 Äå÷ $ ‡÷¦åºå÷ ¶å÷ ‡‡À6 ÷•�Ö w¨œÁ" E·Šå‚ ѪªÂ üÃ÷ r•‡Å Ã÷ d• ‡Á" ÂU$ ü¡‡±‡÷ 0è÷ À" Ã,å÷ ê÷ âçÅ" ÷ &•÷ æä€÷ Þä€wÆ•÷‹xœ ÷å÷ ôè ÷e åw‹å÷eúäô÷ –æ÷ <êÒ†÷ ¨é÷ ¸À ÃÌä÷ Š÷ ‚çÅ" ÷ À”÷ †ä€÷‹"œ÷¾ä ÷ ¦è ÷e¶äw‹°ä÷e¤äô÷ (æ÷ FçÀ" Á ÷ ` "1,1,÷ ôå‡ÀeÁe· Vä÷ejäw‹däÂåå÷  é´†‡ È4äÈŒ  È]*äÐm&äЃ Âåð‡Â÷‹„›Â<·ä‡The RA80 is not supported at this timeÃÈÀ† ÷ jçÊp÷ bçÀ† ÷ „”‡ÀäÁ ä÷‹.›À6›Á4›& & & & f&& æ & ΕææHæ ÿˆ,‡÷¥›,÷¥ñÿ›Àúw‚š÷¥þÿðšÀswrš÷¥ôÿàšÀjwbš÷¥¾ÿКÀ&wRš÷¥ýÿÀšÀ~wBšÀ°w:š÷‹‘š7À�÷ Ô“7 ã÷_ ã÷ã7 ã7 ã÷" ã÷øâÀãÁ÷ 8‡ÀââÀåÁ÷ & ‡ÀÁ÷ ‡Àe B öÀTwÄ™‡7Ââæ˜TÿˆQ‡÷¥$šH÷¥ñÿšÀTwž™÷¥þÿ šÀswŽ™÷¥¾ÿü™ÀTw~™÷¥ýÿì™À~wn™÷¥ÅÿÜ™00AØ[[l1DATADATADATADATADATADATADATAÀOw^™÷¥ÈÿÌ™ÀœwN™÷¥üÿ¼™À…w>™÷¥ðÿ¬™À’w.™÷¥¿ÿœ™ À@w™Á · ⫱‡æ æ * æ + æ2æ3ÁEÿæ ÎE‚w N…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ LW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡w ðÄ'Å  ÅUD$†BA÷ 8&�Â(÷ ÅU� ÀBQ÷ \ÿÂЕ* ü‡Â Âw � ”Å¥ üÅ¥ ùÅå0B¡†€÷ „Aa”ôœÿÿ‡&æÿˆæ3ÿˆ7 &f¦wì÷‹è÷ Æ7 à7ÞÀâÈ @•,€ÀåÀÿq `-KacJE[à !Ãm¢Äíž@•Á †Õ Á ûα)÷ L÷ R†é  çà å÷j7•jà f@• †Õ †&Ý €…Ò€Ö À5]U ¦†E¤¯‚…€Á(‡ :Á‚æ&@E÷ ÿA ·Îà· ̆ª ÷ Š÷ Р¢ÂÀEÿ÷ vœÀEÀÿÀ €cÁÐÂΤ‘Á ü¢ÿ­÷‹¹‰÷­´±¦†„÷ @�Á à £.„ à · ’æ&fÅŠÄ„ÃÈuÁ ÷ Z÷ ^…„ƒ¶à ÷ 8 †À ÷ "†À £.£$· B„ à ë÷ 8‡Ì¥Z‡£A‡Ì¥9‡£0 ‡ à £ £ ‚ „ à ö‡VEÿVERIFYÿNOVEÿNOVERIFYÿMANÿMANUALÿOVRÿDENSÿDENSITYÿWLTÿERLÿBADÿVEÿVERIFYÿDOUBLEÿHIGHÿSINGLEÿLOWÿÎuÑuØuÝuæuêuñuõuúuvv vvvvv$v+vÊÒ‚�[Ò‚˜[¤[hvÀ€:‚¬[Ê/€€¸v�¸v‚¾vƒ¾v„²v…²v†Äv‡ÊvˆÊv‰ wŠw-ªv@üv‹„wŒ¾v�„¾vÀ†¼[lvÀ†°[lvÀ†¶[lvÀ†Ú[lv=€Žø[lv�ø[lv�\lv‘\lv‚\:€Â‚$\:€Â‚,\:€Â†4\lvY€À†H\lvÀ†X\lv=€Ì†f\lv=€Ì† \lv&æf…Þ ƒ„…‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡w °Á w ¦Á& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡&æ¦ff… Þ �‚ƒ„…‡z$ÔXÀðzzrVx‚XÒXÒX‚X‚XªXðj?•U€TXÀ$ÔûXÀÀÜÁ~ Á ýÀ\ÁŠÁ ý÷ hgÀþ� 7 ‚û·F÷ ´Àì÷5€2Â4ÂÁ�Á ýÀü÷5€ÂD Á �Á ýÀ÷ œ@ÿ ðÿ îÀ ÷ –@÷5€à÷ÿÿlwlÿ Þÿ Ü  ÄŠ�ÿ ‡ÿ Ìø7 |7 „ ÷¶÷ÿÿ8ÿ ¤q‡ÿ ®÷¬7 ª÷-¦À÷-œ¶]‚÷-–È÷-Œ¾3‚Á�Ä�ÿ lÁü€Ä"�ÿ `Ä�ÿ Z†÷ ^4 ÿ Z†÷ ¬Äþ€ÿ >†÷ B4 ÷5€&÷U÷E€ÿ *†÷ |Å÷- :÷-0‚ÿ ü†÷ `ÿ ÷5€æÄ¦€÷ |÷5Ö÷EÎ÷U€Ê›7 Š7 ’ŒÄh€4 Äv€4 ÷5@¦· ˜ Ķ÷ ŠaÀÿ ¨÷5@ˆ ÷5‚Ú‰÷UxÆvÆpwôýÀ*€0 À €0 7 d7 7 , 7 ÷n÷ X÷5€67  ÷U,À ÷ È>÷ ø'  ÄÜ4 ÷ )‡4 ú÷E÷5€ø÷ x>À÷ �>À ÷ ’>ÄŽ4 7 žÄ˜4 7 ª ÷5€Â÷5¾÷ .S÷ �'  Äp4 ÷ °(‡4 ú ÄZ4 ÷5€Š÷ ê(7 HÄB4 ÷~7 ~ÿ n†÷5€` ÷5\w˜þ÷5@HÄ4 Äè~4 ÂÃ8ÿ D†Æ&wªüÅÄ ÷ ´?wx7v5 5 ÷7 ÷÷ ÷7 ÷-ü÷-ò g‚ÁÁíæÀ€ ÀíÞD�Áe@ w R~ƒÁL~Är~4 ÄT~4 fÿ ¢ÄF~ÿ œ�ÄR~ÿ ¦÷ ¢÷œžÀ*~Àeˆ Á"~Â4~R$݉À úÀô}Á÷ ^|B‚ Àú}Á ~ !  ü²÷54÷-F`÷-<V ‚Äâ}4 ÿ ‡ÄÔ}4 ‘7 Ì7 ÔĬ}4 ĺ}4 w~þ£öÿeÅeW-$w-Þ w- Øw- ÒAÁeÿŠÁ� wÄw`Àw¼w ¸÷²¸÷®´‡£öÿ7Ö ÷5€€׉Åÿÿ÷ |Äv÷ ÅeÿÿöÁ÷ 4£öÿÁÅ÷ F÷UDÀÞ|Á÷ H{� Àæ|Âø| " Á ü7 ì7 ôwxûÖ wZüÿÿ00Aà[‰V§3eaek›’àèXT.$3D)Ö^ÄB8XXðKrIÚOªO&ÁÅeÁÅe÷5Rò ÷5€Hòw ¤èƒ=÷5€2òW Pƒ3æ÷ œ€& æ¦& ff& && Ε&ææ ÿˆô†Ì&Ì‹ ææ)ÿˆææÿˆó£ÂÿÌ&“VŒ‡÷ ÷ V‡Åe÷ && æ¦& ff& && Εæææ ÿˆ†Ì&ôÀð ð ú04 ‡÷ Ö& æ¦& ff& && Εæææ ÿˆ†Ì&ôD‡& & & & & & & && Εæææ ÿˆ)ÁÅe÷5€ðð—#~ ÷5âðW P÷ !· þð& æ¦& ff& && Εæææ ÿˆ†Ì&ôeÀò ð ú04 ‡  ÷ †÷Upð!‰‡Àô Àö f&È‹ ææ)ÿˆææÿˆóðå>È‹00Aè[[l1DATADATADATADATADATADATADATA/¢Âÿ È•—#ö ÷5€ð÷Uð÷5ðÅðÅøï¢öÿ—#ô Å5€ ÷5àï÷UØï÷ þÈ‹  µÖ …&’VŒ‡÷ Lÿ†Þ‰ôU€  ö¡‡÷ :ÿ†÷U”ïÞ‰ôU€  ó¡‡÷ ÿ†÷5vï÷5€lï"‰Þ‰£öÿ ÷5Zﱇ߉‡ ãÅeõ ¡‡@ÀE€  ÷5$ï÷5€ï7‰ɉDw-ïw- ïw- ï ÷5ôî÷5€êî8‰ȉ,w-úîw-ôî ÷5Ìî÷5€Âî6‰ʉAÁeÿŠÁ� w`Æîw Äî÷¾î´î÷ºî°îõ5€܉¡‡‡† ‰Ì‹ ææ)ÿˆææÿˆó£ÂÿÌÌ‹!‰‡† ‰Ì‹ ææ)ÿˆææÿˆóÌ‹÷U0î!‰‡& & & & & f& && Εfææ ÿˆ‡& & & & & f& && Εfæ æ ÿˆ‡& & & & & & & && Εfææ ÿˆ‡& & & & & & & && Εfæ`æ ÿˆ‡Á2hÁ À÷ šf�  Á ý4 Áe÷ tüC‡w ªf&fææ<ÁæÁ üö [÷ èM— :ö5}öåv÷ ÌMv— :÷ ¾Mv :ö5hö — / v÷ žM— /\v— -VvÅÂÄ ¤¤¤Õ‹U¥@Ä óö 6á¤-:÷ PMW d†ÁelN— — ¢À ‚ö5—"C‡—$�âƒ�Á W ƒAœåÊ �$ƒÂe—$ †—$<†—$<†6wvIÆe�Ö Â€±‡JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC÷ .Mæ@„    Àe à ± û‡„T T T T H1C„ÔdT T L $)ÔdL t ÔdL Ôd¡Î æÖ ‡ÃĤm÷ ´à ø74O÷nëÁ¤qÅÀq÷ ¸L†ÄmO‰÷ ré‰ÀÁ "1,‰À4ëÀ5€ÀE©ÀE@Á"ëÁ5€ÁE«ÁÁE@ñ@P‰÷U@ë÷5€ë÷E@úê÷5€ðê÷U€ìê÷5@äê÷5€Üê×-ØêÀ‰‡÷ „N÷ü|N‡÷vN÷ nN÷®ê®ê7 ¨ê‡×/^N‰ÿ�HNTN· PN‡ÿ@NHNÀDNÀåÁåw 4N ƒ "1,‰Áåó&&ææÿˆ†‰&Ä("DYæ~pÿˆ÷ ´û "DU æ–pÿˆ÷ ¢ûæ®pÿˆ÷ ˜û„æÆpÿˆ7ŠÏêÀÊMÀåÁ¤ Hp’Áåÿ °MH"‰÷5 ¢ê ÷U€Þé÷5@Øé‰ ÷5@ˆê‰÷U@Âéÿ zM‰÷erM¿ lM‡ÀhMÀåÂ^Mð^êðVê  Àå ô‡À0M ‰Á&MÂ0MÒ R”À ý÷5€fé À ÀíMÒ• À ü‡÷UJé‡÷-øLàc‡÷îLæc÷ ÖG‡÷E ,é‡÷5 (é‡÷U é‡) î"$ XXX -- COMMAND I/O ERROR XXX -- COMMAND TOO LONG7ºÿ÷¸ÿÁæÔ ÿˆ‡Ã&ÁàÄÖ ÷ .†„ à ú÷  ‡„ à úÄÖ  Á÷ läs · däÀ`¬ÿÿ-,À � à æÖ"ÿˆ7‡÷‹Zÿ4& & & æ f&& æî"& Εæææ ÿˆ‡÷‹*ÿ÷‹%ÿ" ÿ�àƒ`€`Ð&æ¨a¢zÈÅ Ã ôƒ€Ї׭ìþöÿ(Àò"ÁÀ #Á‚ Ãľþ•à ý& & & æ f&& & & Εæææ ÿˆ÷‚ã÷ ~ã ×-xãÿÿÀ Àfãw F£ £ ±‡¡‡DSC> LBN(S)=DMöi DMÒ DL( DLP DR` DR€a 2(DR ¢ DR®³ÿÿ÷¶_äâ÷ .÷5ìä÷ ˜ÂÔâ ÁÐâ� w ’å· Žå‡Ã÷ ²‡Â|åÃzåÄfå!DU0ĨñÀÅž Á& & & & ff& && Ε&æ`æ ÿˆ†Ì&Ì‹ ææ)ÿˆææÿˆóÌ‹÷UXä!‰Å $ !µ õ PÅe W#ÿÿñ÷5 *䇿Ãå‚ ÀÄñ÷ ¢ñ‡÷ ¶‡D%£üÿ÷Uôã!‰Äæð4 Î —#ß̉Ö �ÂÃ÷ º&6ŠŽ  Õ Õ÷ ¢†Î‰Î —#óÖ ‡Åew•öÿw•ìÿw•êÿw“âÿ¦æÃíÜÿ‚ ÄÖÿÄ ¦æ�Â÷ Vƒ‚÷5 `ã–%‡÷5 Vã–%w&ÿÀÄ>ð÷ Òð†£üÿ÷U4ã!‰Ä&ð4 ÃeB ¶ ƒ¶ äÎ â‡Ì‰]¦æ÷5@ã÷U@úâDÀž DÄeÔ 5‰ ÿÿ,Á8ÿ÷ à[7.ÿÃ*ÿŠÃ÷Eÿ ÿ÷ ÿ· ÿÁ`À ÿÂC÷ r[BÂmþþ@ Ã÷ ~†Î‰À<]Àe!ЇÄxï4 Ã4ãƒåÂ,ã‚ ‚å ÷ ÂþÃãÃí¸þÂã‚ ƒ–%‡æ6à7 2àà Ĕ$÷ pûÁÂÀqÅ€r÷ ‚C†÷‰÷5Âüê·à‡Åþßf¦Â`A Àôß÷ ìZƒÃeBB Àâß÷ ¼ZU‚�ÀÒß÷ ÊZƒBÀÆß÷  ZUÅåw-¸ßw#°ßƒ±‡Ãr\÷ žßG†ÁÀææææN`v 6`õ,õ" †µ-µ#(‡‚ƒvvõ,Í"‚‡ µ-�#†Nvã(Ží¶ ¶í““““ÆeÓ$¶w!Ü[‡3‰Míµ uíwôÞ÷eîÞ‡÷¬D”û÷¤D�û÷Œû7 Šû7 ˆû‡÷�D|û÷ˆDxû‡æf÷ nûö‰ Ãbûà ÁZûÂTû÷  þ†õ‰…ƒ‡ÅÒÞÀ®à±‡Á÷ ºY5  ‡÷”à· ”à÷-�àˆàƒ±‡æf7 á&C`BB ÄØ÷ øí†‰4 ·ààÄØÅà€Á÷ `Y DÜjÀ500Að[‰V§3eaek›’ÄÀE@aÃ.àƒ 1 D û†Ð Ä àõ‡÷à®÷5Žà÷ và ÷ tà÷ nà÷ìßš÷æßÂ÷ 2 ‡wØß @ÝÀ @að‹4 wÿÄ^Z÷ $ïôÄfZ÷ ïÅJZÕÕ  Õ”ßÕ’ßÕ�ß ÕBAÕCKÕUPÕÖÝÕ @ÐÁÂ÷ ~?Е:ÃÀ Ä÷ œX€ ÃÝàà Ãe¸ ÄÁ÷ @Ä ûЕ.Á÷ þ?Е;ÁÂ÷ 8?AáeÄPDãŠÄ ýŸ ÷ ’RÁ�Äß@€ € € € ÀEðÿ�Ò�±ßÁEðÿR�Ò�µßÒ�°ß÷ j2œ\ŠÒ”ßÒ’ßÒŠß ÷µ€~ßÊÒ ÀÝdßÀ ÀeÑ �÷ ÁeÀeóÿ÷ ÁeÀe÷ þÁeÑ�@ߊÑ�;ߊÀ6ßÃ Ä  Ä ü‚ ‚ ‚ ‚ ‘�à ñÀ¶ À ýÑPUÑKCÑABÄìX÷ J1‡÷ ºÄÌXt`Zt \4`\ÄÎX4 ìÄÄX4 ÷5öÝÄžX4 İ w(þÁÿÅŽX÷ ŠôÀ”XÁzXÂP ýðòÿððÿÁ¸ ÂP ý    ÅLXwZÆÝw\ÂÝÅRX÷ "wÌÝ7ÊÝ¡‡&f¦Â6XÈ‹””Ò•-”””Ò•-””È‹ Ò• ””Ò•:””Ò•:””ŠÀúW÷ Äï‚�€‡÷ š+ÄäW4 Á÷ ¶ê†I‰ÀEÀ ‰W- J‰w�Ýw�jxÝ÷5æÜÀþÀÅžWw4¾ÚwTHÝwV>ÝwX:ÝwFBÝ×->Ýdƒ÷DÝÅeÁ ¤J‰Á û÷5€�ÜÅTWõ h À 5, · ݲ‰÷5l܇ÀþÈ‹ Å$WÅeEÁ ”Á ýÅWõ R÷U:Ü÷E2ÜÅøVÅe÷VÜ÷ ü.†‰÷‹§Ü÷ ´/ð  74ÜÅe÷ Ö.†‰ð‡× ÿÿ±‡Á€VÁÁ ÁeÄžV÷ xé†G‰W-W-W- w- ÂÛ õ CC¡‡H‰÷ÄÙBÜæÌpÿˆ7ŠGÜÄ6V Ã÷ é‡Á÷ &‡÷  ‡@@]õ À õ £üÿ!‰ÃEÃeB · ôÛ÷ ðÛƒ‰4 ÔW- W- ‰W- ÷¤ÛÃ0ÙsssswfÛwÐØÀþÈ‹ ÷5€ÒÚ÷5€ÊÚ BÂeÁ �”Á üÁ À ÷5€¦ÚЕ ŠÁ öÄZU÷ êôÀNUÐÐ Á Á ýÀ8UÀeÈ•÷•ñÚÀ(UÀe[È•ÀUÀeÂþÁ �”Á ýÐÁÂ÷ X:ÁöTÁeàЕ Á üBÂeÌÁ �”Á ýBÂeÁ �”Á ý$PвÚЬÚЪÚФÚÀ®TÀeJPPPÐlTÐÀ’TÀeTÈ@ÚÀlT0 æ÷ÖÙ÷ÒÙ ÷lT>Ú÷e\8ÚæÂ¾ÙøÙÄ`ÄæSÄehÌÂÙ„÷e4Ùw 2Ù4 Î —#±Ö ÷5öØÄÐÄÈÅ®SÅeF ÂÙÃþØ÷ r憉÷ fÙ ×-DÙóɃÍÊ×-6Ù‰eƒÍdÂtSÂeAÃRà ý¦÷ 8,ð ‚÷ Ù‰Âp Ê Êò4 ÷ Œ+†‰‚Á"SÉe×÷ îÅSÅeFM`wÎØW#dƒ÷ÒØÂÃ÷ ^*†‰ÂÃ÷ ò÷5ØÅ*×Å4ÖuõµfĦR÷ ’冉4 æÃ®RÃe:ÀDÁ ‹ ³ Á úÀ õƒÃeB Î —#ÞÖ 7 xØÂÃ÷ Ø)÷ >ff÷ <+ð '÷•ØÂRRÂeZÊ•7ö×7ò×Á:RÁeV �Å(RÅe:Mൠ…4 ÷ r*÷ ä ÷ ¼×ÁRÁeVÑ®×ɬ×�…ÅðQÅe:MൠÅâQ÷ ÀÀÚQÀeø  ý÷5úÖÅÖÅÕòQÃe:õž×õäõ’× µ õ⠇à (÷ØÖ7 ÖÖÁÄzQ÷ †÷ F憉ôôô¨Ö&Ä@Q÷ æ4 4 „Ãô‡Ä8Q÷ èå× ÿÿ7 lÖ4 ±‡æÃåÁà ÁmêPÅvÔu ‡ÂýÿAÁàBÁÎPÁÁ ¦BCmB ÅèP÷ Äã†GƒÃeŬPMµõ‡÷ 70 &&Ä ÷ Zå†=‰ô 4 Åe ÁP„÷ >ã†=‰4 W PW#EO‰W-F1'÷5@vÕ÷5pÕ4 wâ÷5`Õ×-ˆÕ ÷5LÕ×-rÕÁ÷ xçÌ•öÿ–%‡W-V1‰4 ÁP„÷ ºâ†Ã‰W PW#EOW-V2ò‰÷EôÔ4 ÷5@ìÔ ÷5æÔ÷EÞÔwVÁ÷ ç÷5ÌÔ÷5@ÂÔ÷ w ÷5´Ô· ÜÔ÷eÂÓÀ¾ÓÀå Á÷ ¼M7  Ó‡÷ ¦ÓÀ¢Ó· ®Ô÷e¦ÒÀ¢ÒÀåÁ÷ �M7 „Ò‡÷ŠÒÀ†Ò&&ææÿˆ÷5FÔÀáÀÙˆŠ¢9‡È•0 Š÷5&Ô÷• ÛÀOו ÚÀGÁ Š¢9ƒÈ•0Á ø÷ l,„À ‰wH÷5âÓÅÚÓÅÒÓÅ5÷ ü÷ î÷ 2†w÷5@´Ówö÷5ªÓ1ÀÎÑ&&ææÿˆ÷-ZÔdÖ#÷¾Ó¸Ó÷ºÓ´Ó÷àÓÄÓ÷ÜÓÀÓ÷€ÓxÓ÷|ÓtÓ7 *Ô÷E^ÓÂÃ,Ö÷ „%÷"ØÖ÷ØÖ÷dÓdÓ÷Eÿ?:ÓÀX ÷PÓFÓ÷LÓBÓ÷ŠÓ„Ó÷†Ó€ÓÐ8ÓÐ6ÓÐÓÐÓÐàÕÐPÓÐNÓ÷ÆÕ6Ó÷ÂÕ2Ó÷Æ×.Ó÷Â×*ÓÐÓÐÓÀ¤MÀeÐàÒÐÞÒÐÜÒÀzMÀeÐÌÒÐÊÒÐÈÒÄdM4 ÄrM4 ƨÒÙ‰wÌÁ÷ Øä4 w–þÁP„÷ &à÷5~ÒÀØ÷ �ÀÐ÷ ††±‡4 ÁÅ÷ (ä÷ Èã†Ã‰±‡ÁP÷ âß÷5:ÒÀ0÷ LÀ(÷ B†±‡4 ÁP÷ ¶ß÷5ÒÀˆ÷ À€÷ †±‡4 ÁÅ÷ Üㆠ‰Ì‹ ÷5ÖÑ÷5€ÌÑ!‰߉÷E¼Ñ4 ‡„æNLÎÎ Îe�÷ îß÷ :á�„ ô ÷ Úßô÷ à‡Ú‰÷U|Ñ÷ xÑ×- ÑÀ„Ð&&ææÿˆ÷UTÑ ÷ LÑ×-rÑÆ>ÑwÎˉ÷ ¨)À ûÄÖK4 æÎK÷ Ñ÷HDTØ÷R1PØÀfÁÐ00Á ü÷HD�Ø÷R2ŒØ÷ ^þ‡Á÷ "ã4 ÓÀÏ&&ææÿˆÀX 7ÖÐ7ÔÐ7ÂÐ7ÀÐ7ÀÐ7öÐ7ôÐ7ÖÐ7ÔÐ÷ÎÐÐÐ÷ÊÐÌÐ7 žÐ÷¢Ð¤Ð÷žÐ Ð÷àÐâÐ÷ÜÐÞÐ÷ŠÐ�Ð÷†ÐŒÐ÷¢Ð.Ó÷žÐ*Ó÷šÐ.Õ÷–Ð*Õ÷tÐpÐ÷5HÐ÷5@<Ð 7 Ñ÷E4ÐÂ00Aø[[l1DATADATADATADATADATADATADATAÃ<Ð÷ Z"÷5 Ð ÷5@Ð7 äÒÂÃÐ÷ X"÷EÐÆþÏĦJ4 Ä´J4 7 ìÏwüˆÉW Pò‰ CÁ(“$Á ü¡‡Á‰‡÷ ì0À÷ î÷E¨Ï· ÔÏ÷eºÎÀ¶ÎÀå Á÷ ´H7 ˜Î‡÷ žÎÀšÎ&&ææÿˆ÷ (÷5dÏ÷ € ÷ r Àሊ¢9‡È•0 Š÷• 4ÖÁPÄÐ÷ 8Þ÷ ˜+÷HDlÖ÷R1hÖÀOÁ Š¢9ƒÈ•0Á øÀfÁЕ0Á üÁPÄ(÷ ôÝ÷HD„Ö÷R2€ÖÁPÄ€÷ ÜÝÄØ÷ ªÝ÷ lÞ†÷UÆÎ!‰‡÷U¼Î&ÄØ÷ ŠÝ÷EOìÕ÷EO>ÖÎ ÷F1ÞÕ÷F20Ö ÷V1ÐÕ÷V2"Ö÷E€Î÷E|ÎÀgÁžÎÂ÷ †.7 ’ÎÁPÄ(÷ ^ÝÁPÄ€÷ RÝÄà÷ ÝÄè÷ Ý÷ Ú݆!‰ÁÄðÅþÿ÷ à7*Î÷ ¾Ý÷ Äß ÷EÎ÷5@ Îw„üÖ ×-.ÎÁ÷ 4à‡×-ÎÁ÷ "à‡ÁvHÁ À÷ ÞF�  Á ý4 7 ØÍ7ÔÍÀeÿŠÀ€ &Y&&ÎeÅÄ Ã°ÍCíª͂ Bí÷ Z %†÷5zÍD÷  u`u 5`&ļ 4 ÷ Œ „±Ú†Ö „ôô÷ œÜÖ Ç‰‡À v ƒ �w`>Íw <ÍvàÀ÷ F…ö Äå÷ ÜE`f„÷ Ü«Ö ‡%2A%O:%P,%P,%P%N%VA%NI/O error on DSC -- *FATAL* DSC -- *WARNING* DSC -- ·jþŽ÷5bþÆNËæz÷Tþ÷k>Pþ÷É7 @þ÷Eÿ:þ÷6þ÷z>2þ÷ É ×-üÈÿÿ÷ýÿòÈ÷þÿêÈ÷ 2, ÂþÃâ=�W  ƒAx�aÅÉ‹U”ü�ù ‚Å=�ÁeBCDÁÐýù ¬rÁÈýÁâ=À=Â=÷ È.& & & & fæ=& & & Εæææ ÿˆ×-fÈþÿ7 ^ȱ‡‡UÑ U‡Äí.!„ƒÄ„Õ.‡× üÕrÊÕnÊÁ÷ Ìÿ÷Fý÷‹>Bý×-Èýÿ÷ÿÿȇÁ4ÉÕ÷5ÊÁ&ÉÁ0ÈË÷ âÿÁÄDÁe<UU‡÷5ìÉ÷ Èÿ÷ ÈÿÕÕÄe‡÷5ÈÉÀþÀ W¤  ûàÁ U÷5žÉ¾¿÷5�É÷ lÿ÷ lÿh÷5|É÷ Xÿ÷ XÿÕœÉ ‡÷ àÿ5 þÿ‡÷ .‡÷ ÕZÉÕTɇ÷ ÿÕdÉ ‡÷ ÿ ÷5$É÷ ÿ÷ ÿÕÉÕÉÕɇ÷ ÜÿÕ"ÉÕɇ÷ îÿ ‡÷ Àÿ÷ ´ÿ÷ xÿ÷ ¨ÿï÷ ¨ÿì÷ öÿ ÷5ÄÈ÷  þ÷  þ÷ ”þÌ‹ô‹4ŠÀNsÁ#Á üB •“‡Õ•%Õ•N ЇÃL>ÃeÄÕ”Ä ý ЇÃL>Ä Õ”Ä ý ЇÃL>ÄÕ”Ä ý8 ЇÃL>ÃeÄÕ”Ä ý‡ÃF>ÄÕ”Ä ýÕ•%Õ•N ЇÃL>ÃeÄ Õ”Ä ýÃ\>Ãe K™Ã\>ÄÕ”Ä ýÃF>ÄÕ”Ä ý÷ ”ÿå‹ÃL>ÃeÄÕ”Ä ý Ї&f DÝÄ DaÄe ÓÅ aÅeŒŠŒŠ4£‚À W ‚fæ•��“ÕŠÕƒcB �å€ &VP¡äÌŠÌŠ±…„‡fÁÿf&f @eÁ ý ¡± …€�‡÷  Öô:Ç ô6Ç4 ô f&&ÎeŸ ÃÇCíÂÇ‚ Bíö ,÷ ¾)‡À v ƒ �w`èÆw æÆvàÀ÷ Î?…€p`ö  Äå4 ÷ öÔE`f„÷ êÔÈÖ ‡Ö „ôô÷ ÕÖ ‡À ÷ ÷UnÆ÷ Îê÷JÍ÷E^Ƈ7‚ÄÁ7hÅÁ&&fæÿˆ‡À$ÄÁ$ÄÂÄ÷ ?À÷ ?ÁàÀÄ÷ ?Âü÷ Ê@† ûRÒîÃÒìÃÀðÒÁ Á ýÐ Áž@AÁ W ~‚ЋP�Ð Á ûÐ PÐ|ÆÐzÆ7 ®Ã· ¬Ã7 ØÅ7 ÖÅ÷ ÁÿÿBÅT@ÅeÄV@Äe õ üÿõ þÿw-ªÅw#¢Å ‡A-B#†ABCÅeD!æ‡W ÿÿ� U·xÅ÷erÅwpÅw lÅÀ.ÃÁþÿÂüÿ÷ >À f¦ÀÃÁÂ÷ >À÷ þ=‚ · ÆÂ-ú†÷ vúÁ÷ >À ÀmêÑ�  ±B Á ýˆ@Îå¶ Î ö B ô†ÂРļÑÄe ë‡÷ ,À¬Ñæ–%�ÄÂÃô-˜Â †÷ À’ÑÁ Á ýò‡ÃÄœÃ÷ p ÃtÑÅÓÿÿÅ ü· `· Z‡¦f   BÝ …`ÅeBÂEÿ‚ … æNÕŽ �e@ Õ Â ö…‚‡&fÃå‚  DÝÄ aÅeDÄEÿ„  @Ý€ à‚ ‡U%Ä ö±#Á `BÂEÿCeB Ä ¦æN`v @ÀEÿN% 6 –% @Ýýÿ`� –%Ä è …„‡7 8ÄB÷ ~<À ÂeA w‚Á·€ÁÁ€ÁÁ ÁpÐÀÃbÁà  m÷tÁÉ ÅRÐÅeþE †Ñ ö÷ \Á 0 À ü†@ ïÀ€÷ Øè†‡ÅìBCUÍÁæ¦ÅôG÷ ú†öàŽ Žà÷µÁ Åü÷ŽÃ‚ƒÂ𥥥Í7ôÀÃàÀ÷ ÌÀ÷ Ä‚ƒwÐÀÀÄÀÁÂÀÅúG÷  ‚ƒ÷ x;7¤Àw¢ÀÁ¢ÀÁí–ÏÁ Á Á Â’À¡ ‡� üCÀ†ÀÃeB À û÷ :;CÀbÀÁ`À÷fÀ^À‡À †@ Ñ æ ÎFÏÎeþ�%† I÷ PÀæÃ(Àƒ -†Ã÷ ƒÁÏ € ‡¡ 0Í ‡Ãå‚ æ–P÷ ¦ÿô†‡±‡ @÷U⿇æÒpÿˆ‡æêpÿˆ‡æqÿˆ‡æqÿˆ‡Är<4 Á÷ ºÐÄx<4 ÅeÅe÷ LúÁ÷ œÐ‡ÄX<4 ÁR<Áe÷ †Ð‡÷ öÐ÷UxÁÀŽÀ&&ææÿˆÁÄÁÁívÁÀ¾Á€ ÀínÁ€0Áä;ÁÁ Áe÷ †Ïÿ XÎ÷E4ÁÂö;Âe‚ÁÖ;Áe‰ ‰‚ ·`.Áw ,Á÷&Á Á÷"ÁÁÀ*¿&&ææÿˆ‡÷ *Ī;4 ¯÷ TÐ÷-ðÀ"Á÷-æÀÁ ‚w`ÞÀw ÜÀÁÁ Áe÷ χ4 4 Ìô÷ $χ @ÝÀeÁþàÀ @aŠP� Á ý‡¦æ÷‹Á × w:× w.À;¬,»z!"¬ " 00A\‰V§3eaek›’"°· ÖÀÐ ¬ ×-¦À²‰÷šÀ7 ¸À³‰÷ ²À÷ ®À¾:Àe70À7.ÀÀ¿Áª:Áe ÀþÈ‹Á’:ÁeÊ:ÃeØÂ ”S” û Á à ŠÓ•  ûÅb:Åe÷ ,Àõ õ Áž uÈuÊÁ÷ ø÷ øÄ*:÷ ‚ñ÷ î¿×-è¿ 7 à¿°‰÷5F¿ωω÷56¿ωƒ‚¡‡4 ÷‹±¿4Åâ9ACÃåÅ&¾BCmB ÅÄ9Åeĺ9÷ úÍ÷ ŒÎ†-‰—#ÿÿ÷‹l¿×­f¿×­\¿ ÁÄÚ½À6¿÷ ƒ‚‡fÀ Á÷ Ê7f� t ƒ–%Ô‰‡mB Ä29÷ øÍÀ÷ Ì€Á÷ ’7@aÖ HÌjHÜj4 ÷ TÍ÷ ð͆-‰‡Äd½!DB!DM7 Ⱦ‡ !DR!DU7 ´¾‡×-®¾²‰‡7 ¢¾‡ü xQ»z¬ k»zĪ8÷ pÍÁ  Á ý÷½”¾æ2qÿˆ7Š™¾÷–¾È»÷޾Ļ÷ ÐØÀä¼ÁŽ8Áe:1,  ,†:‰÷ ÀÀļÀeÁj8Áe0PÁ`8ÁeBPÁV8Áe:Päˆ PâÐÁD8ÁeJPÁ*8ÁePPÈ 8Ð Á8ÁePPÁ8Áe4PÁ8Áe\ÀŽ 7Ú½ÃPà ýÁø7ÁehÉ w"н÷¬½Ã²7à æÃæÄÌ7Ãe à ýƒà æÄ¼ƒÀz½ÀåÁ÷ 6f�Ä”7ÿ�7&÷ ÊË÷ bÌ€ƒmB ? z7À ó�ÆeÁ ÁÁ ÷ ¤Ë÷ <Ì? \7÷ \öÄÐ÷ ÌôÅØAÂF7ÂeÀ‘À ý¦÷ ÌûÄ7÷ Ž÷ Š÷ ††÷à¼À7Àe¦fAÂP ý�‚÷ À¼±†f�÷ \�¦f‚AÀ‘À ý÷ jû�‚ÎeÀ÷ @ôä‚ÄÐ÷ &ļ ÷ \ËÅÄ AÂØÀ‘À ýõõ @ÝÀ ÀeÄ ÁàKÂP ý÷ û÷ D ÄV6Äe Á÷ ÒóÁå€ ÷ Äóļ ÷ ®Ä¼ ÷ äÊõõ @ÝÀ ÀeÄ ÁèKÂP ý÷ ¤úÄú57!&¹†÷ `†÷ h÷÷ Ê   W-7 �»Ä¼ ÷ Hļ ÷ ~ÊôÀÄ ÁÀ5ÁeÂP ý  À�50 Àž50 ‡÷ ó‡÷ ö÷ `W-÷ ,»3‰ Ð"»È »ˆ ÷Õ(»ð 0‰ÁíV5W 7»7üºDÄå÷ ªW-õÞºõÚºµ ÷ ö Ð  ÷ ªù‡ÄÄ &÷‹K¸ Åü4÷ Ìõwzº7xºææ÷ ðw7 –º7 –º7Џļ ÷ zÉôÅÄ 7 Ⱦ7 ƾ@Á²4fÂP ý7 *º7 (ºÁ‚4ñ‹c ñ j æõÕ€ @\AZ æõÅ€ Åj4÷ :õwè¹7æ¹÷ "º$ÂÃÅL4÷ VõÂ-À¹Ã-¸¹‡Ãí²¹‚ Âí®¹  ‚ € Á †ÃeB   ÷’¹·�¹Àò30 ÷ æÅÄ ÷ ’ø÷ Î ÷5$¹�•Š  7 p¹Ö Ä*¸Àâ»78¹÷‹‘¹Á÷ HúÄîÅ4 ÷â¶·•ù¶Äþ·Å.¹Å],¹÷ 4¹ Å  Ã-¾¶÷ ¶À¹À] ¹À] ¹À]¹_ÅB A@CB&VPÀì¸Áæ¸÷ ðô†*‰7 ܸw Ô¸‡7 θ7 ̸wàĸ· ¸7ྸÅÄ ÷ ®ðÅB UÕ•1†×-®¸ ÷mž¸˜¸w –¸÷m–¸�¸wŠ÷‹I¶ ÷5*¸ÀÂ¸È 7¢¸7 ¸ 7°¸÷j¸ÀޏÁÄ·÷ LùÖÕ‰˜÷ ˆ¸ô-Þµ ôÖµ ÷ÖÄܵ÷صîµ÷èµÎµæʵ渵÷‹ÑµææÄäÅ Å ýÖ 7Нµ÷•§µ·†µ·�µÄ¼ ÷ À÷ Þ· ÀD2ÁB�Á ûÀ22Àe÷ º·÷ ¶· 7 Ü·Äh¶ À ÷ ’ø7 ·7 ¼·÷¸·º·ƒ×-ˆ·7 ö¹Âÿ 6ÄÄÆ14 ÄÔ14 æN·Ö]L·&„ ƒ‚ÀÄ 1÷ ~ÄÂ2·Ã,·ÅÄ ÷ ´ò´ ô4 Ãb·Â`·Ät1÷ ÀÅ· N·7 ·7 þ¶¡‡ÅÄ ÷ L æ�·´&œŽ Äd1÷ ô¶ô·ô·7 ·00ļ ÷ ¬÷ ʶ ÷ ì¶À*17,à¶· ²¶À1ÁB�Á û÷ œ¶×-–¶7 Œ¶· жwòü7 €¶7 ~¶Åæ0÷ ¼ ö ÷‹´‡÷ ‚¶uµ õr¶õn¶7 f¶÷6¶Á ‡wV¶·T¶÷"¶‡Åe÷ fîCÀδ÷àµÃ llB Á÷  Ä÷ 2ņK‰‡HDR1 00010001000100 00000 00000 000000DECFILE11A D%B1111001001÷U*µ÷Rµ÷ º & ÄÐ÷ ŒÄÎ ÷Uµ÷5µ÷Uú´{÷Uô´÷Eì´‚ Î K— ÷ öò÷ øòÀÄÐ÷ \†TÄ(æ8qÿˆ÷ bÆô5— E÷U(¢´÷E š´W PW#VOW-L1‰W-01‰Ä(ÁÄ(Å÷ <Æ÷ ÆÌ‹!‰W­ A÷ ròÄ(ÁÄ(Åÿ÷ 6Ɔ ‰Î£õÿ£Èÿ£Âÿ ‰!‰— ƒ!‰÷U´÷ ¨  7 îºwèþÄ(Î fæPqÿˆ÷ šÅô5÷Uâ³÷EÚ³ÁÄ(Åÿÿ÷ ÄÅ÷ pÅÁÄ(Åþÿ÷ ŒÅ÷ \ÅÀ÷ <Á†!‰W PW#EOW-F1W-V1 ‰‰@Àe¤0 ¤0¤0¤1‰ÀÄ€÷ ìÀ†!‰W PW#EOW-F2‰W­U‰÷ Þ÷ ÂÄÐô FÀØÐVOÐL1Î ÁEÂP” ýÁÊ-ÁeÂH”¢ È•X€  ÷Ð01÷5ܲ÷5 Ô²ЕAЕ ÁЕ Á üÁ²T P” ýÁЕ Á üЕ1ôÎ ÷5 ޲÷ ªð÷ œðÁP÷ ~Á÷ Þ÷5 p²÷5h²÷ „ðÄ(À0Ö ÐHDÐR1ÀSÁ Š¢9ƒÈ•0Á øÀfÁЕ0Á üÁbTÂPP” ýÀEÁÜÂP” ýôÀ4ÁÀ,Áe P” ýÁP÷ äÀÄ€ÀˆÁZÂP” ýÁAЕ Á ü÷•Mv¹÷00~¹ÁP÷ ®ÀÄØ÷ |À7 ʱ÷Eš±‡D%B1111001001÷5„±÷ª±÷ ±÷ æ & ÷5f±÷5^±Àî Àì ÷5L±ÈUÄèÁÅýÿ÷ ,Ã÷ ¨ÂÈE÷E&±÷5 ±ÄÐÀî ÄÈÀì 4 È5¦&÷ p „‚ Î t ÷ ï÷ ïÁP÷ |¾†w¨÷5ΰÄ(Ä & & & & & & & && ΕææPæ ÿˆ÷ Âô5 w^W PW#VOW-L1‰fÁÅ÷ :Â÷ ÚÁÌ‹!‰…W­ A÷ ~î4 ÁP÷ 但£Èÿw £öÿ00A\[l1DATADATADATADATADATADATADATA‰£óÿ!‰ W PW#HDW-R14 àJ÷U°÷5ü¯Ä(÷Eê¯Ä ÃÁÅ÷ ÒÁ÷ NÁ †£ÈÿQ£õÿÁ÷ ÜÁD‰!‰4 ÁP÷ R½ †£öÿÁ÷ ¼ÁD‰£óÿ!‰ W PW#HDW-R14 à ȉU%÷5l¯ ÀþÈ Á P•Á ý+ÀÈ‹Á P•Á ý Á ¤Á ü4 ’‚ — ƒ!‰÷5¯÷U¯7 öµ÷U¯7 â³w”ýÅe W¥0 W¥0W¥0W¥1‰Ö ÷5ڮĀÀî ÄxÀì 4 & & & & & & & && ΕææPæ ÿˆ÷ Àô5ÈUÈEÁP÷ "¼†!‰W PW#HDW-R2‰÷ ÷5\®ÄÐÄÈô 1ÀeÐVOÐL1÷56®Á0ÁeÁ(ÁeÂP” ýÁЕ Á üÁXX P” ýÁЕ Á üЕ1ôÄ�(ÁÄŠ(Å÷ Ì¿÷ H¿‡Ä° ÀÁì«÷5¼­ÅØÅÐļ ÀÁ¼¬ÅØ÷Ê­&ClÃe÷5€ˆ­W W!Ø BÃåClB €÷ ®× d‚ð×-Ö­óÉƒ× Ê‚èÃåÊÃådÂ÷ 逆ç‰wJ÷ ¼º†è‰ W-å‰÷-F­Ž­‡õ æ‰õµ€ æ‰ w-$­ä‰÷ ”å†ã‰†À­÷ Ї÷EÔ¬ææ÷ h€f• AÕ CÖ ±‡fÀ ÷ Üþ÷ öþ‡÷ <µ% Ž °¥¡‡á‰À°¬÷ *â‰Ö À¢¬÷ –%Àp¬÷ ±‡ @ÝÀ @a‡4 ÷5@F¬÷5€>¬ ÷58¬& ÄH«÷ xí„÷U"¬±‡÷ ’»ô0¬ ô,¬4 ô f&&ÎeÅÄ Ã ¬Cí¬‚ Bíö V÷ °ç%†÷5ЫD÷ fçu`u 5`&ļ 4 ÷ âþ„±×†Ö „ôô÷ òºÖ lj‡À v ƒ �w`”«w ’«vàÀ÷ v$…ö  Äå÷ ø¹ÿ t¸E`f„÷ è¹ÿ d¸¤÷T«V«÷P«R«Ö ‡Ö „ôô÷ |ºÖ ‡Å¸ ÷ ®æu`u 5`İ 4 ÷ þ†Ò‰‡÷ Œæw`6«w 4«7`0«Ä¤%÷ TºôÀ˜%ÐÐ  Ð̪ÐʪÐȪ ÁPÁ ý‡÷U¦ªÀ¼©&&ææÿˆÄ<%4 ÁÄ0%÷ ¸†£öÿ±‡÷5lª÷5€bªA‰÷5Tª¿‰bW-÷5@ªÀ‰XÄì$ÄeZ7dª7bªwXªÁÄä$÷ ¾·†÷5ª÷5€ ªB‰¾‰£öÿ±‡5W- ÷5ê©÷5€à©F‰º‰wD§wÚ©w Ö©w Ò©Åe÷ –ü ‡÷5°©½‰÷E¦©w2 ÷5ž©÷5€”©F‰4 ÷U„©Ä2$4 Ä@$4 wêþ7 ’©Å4$÷ åwš©7˜©÷5Z©"÷ER©7 "®7 ®÷|©¨©÷x©¤©÷R©7 P©÷¬ÀT§&&ææÿˆÀÄ ÷F©X©÷B©T©Ä° ÷ x¸ôÀ¸ ÷©7 ©÷©©÷©©÷æ¨ê¨÷â¨æ¨÷Þ¨â¨ÁPÁ ý¡‡÷5º¨ À¼ ðp«ðl«À° 0 ÁÄZ#÷ 4¶†÷5Ѝ÷5€€¨.‰¾‰£öÿj]W-eW-Uõ-j¨Põ-d¨ Lõ-^¨ HÅewr¨÷ û@‡÷ Úû· V¨7¬P¨8Åð"÷ ÀãwV¨7T¨÷5¨÷mF¨X¨w V¨÷m>¨P¨÷Eú§Ä° ÷ n·ôÀ¸ ÷m¨H¨w F¨÷m¨@¨ÀÄ ÁPÁ ý÷ú§ü§÷ö§ø§¡‡ ÷5°§º‰÷U¦§4 wâþ÷5œ§÷5€’§.‰»‰±‡÷5„§Ã˜¦Å Ø¥Â Ã|¦ÂÅ7 d¦)„& & & & & & & && Ε¦æPæ ÿˆ7<Äd— ÷ –¸÷ À¸„Ö Î5÷ Ö qÎUÎ5$Î5  ÷ ü  Å ÷UÚ¦÷UÔ¦ÀÅ Î5Ö '÷5€º¦Ö ؉Û‰¦)�& & & & æf& && Εæææ ÿˆ† ‰# çÖ ’À ‡Å ÷5b¦×-Œ¦ÄÈ  ÷5L¦×-v¦ÄЇ÷ F · @�÷ F¸÷ ž·wÌþ& ææææÿˆ† ‰ææ)ÿˆææÿˆwœþÄž ÌÔ£Ã÷ Ì%7l¦7h¦U÷UÄ¥±‰Ì®£#ƒÀ Ã÷ �÷ äÄeÀŽ£ Å` ÅeFBeAA Âå� ÷ nƒBÀj£÷ DUÃ÷ LÄeÀP£ÁP£ÂJ£÷ @ÂeÿA À÷ 2Âm2£Â À,£÷ $ƒBÀ £÷ úL4Ã÷ ‡4üÿ4þÿæ÷ ®!†Î Ó$KsSeK Ke÷"ä¢÷(Ü¢ƒ0‰Ó$U%Ksã‹ †0‰ í†0‰ÜÖ ‡Â f¦À¤¢÷ œƒBÀ˜¢÷ rt4÷ <†&‚ƒÄN÷ „³÷ ´„‚�ÂEÂeA w `¢· X¢‡/‰Ò–%‡Å!CÁÀBPÁd@ Àd4 t ƒÁÀÁd@ Àd@-A-†±‡Åew!¢Ü‡¡‡÷ >÷ ü¡æ&Ãð¡mB Äæ°÷ è²÷ „³†<‰„ƒô 7 Ê¡÷ Ä¡à ž°5 ÷²¡ô ƒmB ÀÄœ°÷ 0±†;‰‡&fÀzfÁŠÁ ý�€Äzf÷ z²÷ ³‡ ÆÀÀe”÷ û_�vÿß‹tÿý€‡ ***THIS VOLUME DOES NOT CONTAIN A HARDWARE BOOTABLE SYSTEM *** <€–˜w $&fæÆå�fæ=ÿˆÎel…C    ö5pÄ€Á�÷ ÈÁ  €Ád÷ ¶Á €Á÷ ¨Á  €ÀåAÁ�÷ ”&@Ád÷ ˆ&@Á÷ |&Àm÷ ZMÀµ�÷ NM`À¬Ž�÷ BM`5u À¬Ž�÷ .Á @ Á @ �e@ M`u 5`€ÁBœåW á@ †�`u � ó‚#;‚�eu Íåìoµ õåÆe„ÆåÀòfA‚÷ ¾µƒeS S S Àúf�B÷ ¨µCeS S S A‚÷ –µƒeS S S Àg�B÷ €µÆe‚�€‡Æe€�€±‡÷ ’÷-ô‚w¼×-ø ƒ;Àþßæß¾hÈ ŸŸL‰ÄàÀÎÀí¼Á÷ "ÅÅ E`fÅ ÅmÒ‡BÅe?‡ÅE?D!‚CáÃE?¡      & ææYÿˆ†L‰·–Þ„Å S`Å ý…E`ô„ÁSaÁ ý÷RBÀNÐ7 dú÷<*Á6ÁÁ ÁeÀŽ„Â÷ ’ÁŽ„ÂP” ýÀ_ÁŽ„Â P” ý‡÷ †Åe@ÁŽ„Â¤ ü‡À“„AÂ00A\‰V§3eaek›’P• ýÀå÷ ÄÁåÁ5ÿ‰Á� w¸W ƒ‰÷5€þŸ÷5€öŸ‡÷ Žþ‡‡æ æ * æ + æ2æ3ÁEÿæ ÎE‚w ú…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ ®W ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡Â Âw ’ ”Å¥ üÅ¥ ùÅå0B¡†€÷ <Aa”ôœÿÿ‡÷ &÷ &÷ �’•’•€‡@Á(÷ f€  Àe ÀeÉÿÀe Àe ‡&æÿˆæ3ÿˆ&æ¦f&¦ v Þ €�‚ƒ„…‡7 X&f¦wB÷‹>÷ Æ7 674À8È @•,€ÀåÀÿq `-KacJE[à !ÃmøÄíô@•Á †Õ Á ûα)÷ L÷ R†é  çà å÷À7•Àà f@• †Õ †&Ý €…Ò€Ö À5]U ¦†E¤¯‚…€Á~‡ :Ár‚æ&@E÷ ÿA ·^Îà·V ̆ª ÷ Š÷ Р¢ÂÀEÿ÷ vœÀEÀÿÀ €cÁ&Â$¤‘Á ü¢ÿ­÷‹‰÷­ ¦†„÷ @�Á à £.„ à · èæ&fÅàÄÚÞmÁ ÷ ð÷ ô…„ƒ¶à ÷ 8 †À ÷ "†À £.£$· ˜„ à ë÷ Ž‡Ì¥Z‡£A‡Ì¥9‡£0 ‡ à £ £ ‚ „ à ö‡w îÄ'Å  ÅUD$†BA÷ v&�Â(÷ ÅU� ÀBQ÷ ®üÂЕ* ü‡DSC>ABDEFIMNOPQRSTUXYZ<>ÉØâô=öMXd^Œ•öêžèò)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ BüÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚b‚ ‡AÂ Ê Ö ÊЕ%„Ì¥Vå ‡P”à ý‡Ð• B”f�‚÷ nû�à õ‡& æÎePûB& ¦æÎe<û;& æÎehþ6H”ÈÅ€¢ ¢È• € à ò‡÷ nŠ€‡Ð• à ü‡Ð‹à üÀ ‡Ð• Е à ú‡& æÎeìú & ¦æÎeØúЕ A‚¦Þ à ÷–%‡& æÎe¬úóA÷ dûà û‡Ð• à ü‡Ð• Aæ÷ FûAÎ ûÖ Â ÷ $Е.÷ .ûÂ÷ AЕ; ÷ `úà à‡Â ýð¥ ÿÿùÀ øAá ÷ &E‡Aá Â÷ HE‡Á ¦¶6D‡w 4D…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w DÅ… ƒ÷ &Е.À À À ce÷ ÀÀ …Е:÷ Å ù Â÷ ŒùB‡ P( ( (¤ ¤  @ @ @ @¤  P( P(RWÿDENSÿAPÿBADÿVEÿCMPÿBLÿ800ÿ1600ÿ6250ÿ1600ÿMANÿOVRÿNOAUTOÿhqkqpqsqwqzq~q�q…qŠq�q”q˜qœqÀ‚ È�ØqÊ=‚.È�Øqʄ҂FÒ‚FÂ\êqÀ‚b:€,Øq/ rÄd rÀ†> / rÀ†> €ì r�6r‚ì rƒTr„@ì r…€ì r†„tr=A&A AAA ?¶?¶?°?Ø?À@À@´@:AÆ@Ò?Ò?Ò?Ò?Ò?Ò?Ò?ô@æ@”@¦@ì?:A:A&AØ?þ?Æ@AAÆ@"@Æ@Æ@&AØ?&AØ?A~?~?~?~?Ò?ýüôóðìÈÅöÂõ¿¾þÿÿúÿ<€L€b€u€�€”€¤€·€Ë€ß€ó€ ��0�@�W�k�  %N%VA2 Conflicting dev. types%N%VA3 Mixed tape types%N%VA4 Illegal switch%N%VA5 File label too long%N%VA6 Syntax error%N%VA7 Dup. dev. name%N%VA8 Too many dev's%N%VA9 Dev. %2A%O: not in system%N%VA10 Dev. %2A%O: not FILES-11%N%VA11 Bad block syntax error%N%VA12 Bad block count too large%N%VA13 Bad block cluster out of range%N%VA15 Output tape %2A%O: full%N%VA16 Output tape %2A%O: not only reel in set%N%VA17 Tape %2A%O: not ANSI format%N%VA18 %2A%O: not DSC tape%N%VA19 Tape %2A%O: a continuation tape%N%VA21 Failed to find home block %N%VA22 File structure level on %2A%O: not supported%N%N%VA23 A%N%VA24 B%N%VA25 Code A%N%VA26 C%N%VA27 D%N%VA31 I/O error E on %2A%O:, File ID %N%VA32 Input device %2A%O: File ID %P,%P not present%N%VA33 Input device %2A%O: File ID %P,%P is deleted%N%VA34 Input device %2A%O: File ID %P,%P unsupported structure level%N%VA35 Input device %2A%O: File ID %P,%P file number check%N%VA36 Input device %2A%O: File ID %P,%P file header checksum error%N%VA37 Input device %2A%O: File ID %P,%P sequence number check%N%VA38 Input device %2A%O: File ID %P,%P segment number check%N%VA39 Directive error - %VA%N%N%VA40 F%N%VA41 I/O error I on %2A%O:%NFile ID %P,%P,%P,VBN %P,%P%N%VA%N%N%VA42 Verification error on %2A%O:%NFile ID %P,%P,%P, VBN %N%VA43 Bad data block on %2A%O:%NFile ID %P,%P,%P,VBN %P,%P%N%N%VA44 Mount reel %D on %2A%O: and hit RETURN%N%VA45 Starting verify pass%N%VA46 Resume copying%N%VA47 %2A%O: is write locked. Insert write ring and hit RETURN%N%VA48 Input 00A\A\l1DATADATADATADATADATADATADATAfile on %2A%O: will be resynchronized%N%VA49 Output device %2A%O: full%NFile ID %N%VA50 Output file header full on %2A%O:%N- File ID %N%VA51 Output file header on %2A%O: not mapped - File ID %N%VA52 G%N%VA53 Failed to read file extension header on %2A%O: - File ID %N%VA54 Failed to allocate home block %N%VA55 Index file allocation failure %N%VA56 Output disk %2A%O: is not bootable%N%VA57 Invalid bad block data %N%VA58 Bad block file full %N%VA59 No bad block data found %N%VA60 Output device %2A%O: is a diagnostic pack. Do not use it!%N%VA61 Code B on %2A%O:%NFile ID %P,%P,%P%N - VBN %P,%P expected, %P,%P found%N%N%VA62 Code C on %2A%O:%NFile ID %P,%P,%P%N - VBN %P,%P%N%N%VA63 Code D on %2A%O:%NFile ID %P,%P,%P expected, %P,%P,%P found%N%N%VA64 Failed to map output file on %2A%O:%NFile ID %P,%P,%P, VBN %N%VA65 Output disk %2A%O: is too small - %P,%P blocks needed%N%VA66 C%N%VA67 H%N%VA68 J%N%VA69 Input tape on %2A%O: must be at BOT%N%VA70 Wrong input tape on %2A%O:%N Expecting "%VA", found "%VA"%N%VA71 Code E on %2A%O: after file ID %N%VA72 I/O error K on %2A%O:%NAfter file ID %N%VA73 I/O error L on %2A%O:%NAfter file ID %N%VA74 Input tape %2A%O: resynchronized at file ID %N%VA75 Tape file "%VA" not found %N%VA76 Expected extension header not present on %2A%O: - File ID %N%VA77 Code F on %2A%O: after file ID %N%VA78 M%N%VA79 Index file data not present %N%VA80 N%N%VA81 Volume summary data not present %N%VA82 I/O error O on %2A%O: - File ID %N%VA83 Bad blocking factor%N%VA84 Input disk not bootable%N%VA85 Input/output disks differ%N%VA86 Bad LBN #0%N%VA87 Output disk %2A%O: may not be bootableDevice not readyParity error on deviceDevice write lockedData overrunPrivilege violationBad block numberBad block on deviceFatal hardware errorEnd of file detectedEnd of tape detectedEnd of volume detectedDevice off-lineBlock check or CRC errorIllegal functionInsufficient pool spaceHandler not residentError code is´sÒsêstt/tEt[t|t�t¼tÞtu%uUuyu•u½uàuv!v+v:vDvNvvv¬váv'wcw¨wèw'xGxQx’xÏxy=yZyqy²yæyzHzƒz�zÏzöz{H{h{…{¦{è{9|t|º|þ|<}F}P}Z}†}È}ñ}~M~‚~¥~è~@Jsœ¸Øú €´A´A´A´A´A´A´AlAlAlAlAlAlAlAlAlAlAÈAlAöAöAlAöAöAâAlAlAlAlAlAlAlA"BöA"BxA°A°AlAlA°AlAŽAŽAxAöAŽAÈAÈAlAÈAÈAÈAlA°A°A°AxAlAöAöAöAlAlAŽA A AŽAÈAŽAŽAöAÈAöAÈA AlAlAlAlAlA&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&æf…Þ ƒ„…‡f&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡w °Á w ¦Á& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡&æ¦ff… Þ �‚ƒ„…‡0206402064/0¼„Ô„Ü„ì„Ü„ä„ì„ô„ü„äˆìˆôˆ� ��•00A \‰V§3eaek›’ÆdÁðÍðÚÆrêJÄ ‚X‚X‚XÒX¾XªX¾XðjM6€5ÜkÀÿÿŒðÍdÁeðÍiÌ #·2÷&7 Þ÷üæÿæÆÿˆ‡p·ŠËÆ7 Ðÿ7 È7 ¤7 n 7 ¨7 ` 7 X 7 V 7 V 7 ¾ 7 P 7 R 7 P 7 N 7 L 7 Î÷ øE÷5ð÷ Ô:W÷5â÷5 Ø÷5Ô÷ 6EH÷ `EE÷ ¢+÷ nE@÷5¶÷ ˜:9÷5¨÷ ‚+÷ NE0÷ x+÷ |:÷5Š÷ç, ÷÷( ÷5º 7 4‰÷U¦ ¨‰÷Õ ÷õ ÷ E÷5€N ÷E€F÷U@÷U<À÷5 2÷5.÷ |7÷5b 7 ܉÷UN 7 Ì7 ´7 Êò‰÷5÷ JD÷ ”Dw°þ00A(\\l1DATADATADATADATADATADATADATA|F˜$ê2UFDDECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJANXX=´ BRU> ü  ü   x 00A0\‰V§3eaek›’” ° Ìý èû    <  X%N%VA%VR on %VA%O:%VA%D%N [%R,%R] %X Tape %M Disk %M . Press "RETURN" when done%NFile ID %P LBN %T.%N%NFile ID %P,%P LBN %T.%N File ID %P%NFile ID %P,%P VBN %T.%N%NFile ID %P,%P "BRU -- *FATAL* -- BRU -- *WARNING* -- BRU - I/O error code w $7 Pÿ÷ Îá÷ÆáDÿ7 ÀဠÀ54ÀE‹À ¶÷54ë÷5ðâ ÷Ð"Xþ÷Pþ÷¬ã÷EÖâ.÷<þ÷â"8þ÷%’ã$÷Šã ÷ þ÷ö"þ÷EâêÀ Î6÷UÔê÷þ÷Ð"üý÷Vã÷U xð7 &á7 6ã  ÀáÀå€À À €C‚C°C²C„ 7ÀýÄ À®!÷ (Á "Àü ¨!÷ Ô!&Á"÷ Ê!ð¥ ÿÿÀ ú�Cà÷ ÂÞâ‚-ƒÃÍ"Ä÷ à�Ñ•"ƒ�àD÷ ÎwÐ÷5 $ê÷„àœâ÷ ˜âÁ6"÷5 êÁ?"Âþ÷ Z!00A8\\l1DATADATADATADATADATADATADATA7 zâ÷ pâ¨!Á"ÒÃ^âÒÒœŠ7 Râ¨!÷ ,!÷ HâÂBâ·ìü·êü¨!Á)"÷ !7 *â÷ (âÂ"âÁ2"÷ ø 7 â÷ â÷ â÷ â÷âªü¨!÷ üá÷öáœüÁ½"÷ Ä Á—"÷ º 7 Üá×-¾ß‹ÁH"ÂP” ýЕ Е Àåü 7ôîæ0ÿˆ÷ ¢á÷Lü÷ü"HüÀ��á7BüÁ!"Àü ¨!÷ ` 7 xáw¼îæ0ÿˆ÷ zá ÷náü÷jáü÷há üÁ£"÷ Zá%÷Páöû÷ Lá ÷Fáìû÷BáèûÁ}"÷6áÚûÁf"¨!Àü ÷ ú7 á7 á7 áwNîæ0ÿˆ÷5zèw B–%÷E (î¡7 ÖÞ÷ Pü÷JüÈÞ‡Ð”Ä ý‡÷ D ÷ (†÷ .÷÷ †W¢ ÷÷ ÷ "õÉÕ ÷ ðW¢A‡É¥Z‡Ñ‹Ã €Ö ‡ÂŸ&fæ�ƒR¤Ê‹ à úÒ‹�ýóƒ�‡–%à ´‡BOTBPIEOTIDINDEXF.SYSIOMFDOPENUFDVBNÿ,9^w~†W�`»zÕ}ùÈK# Övµ_RuL`;Jm9ahw~€WJm9a½)í&€pÐt!w:<¥½% N Ðt!w:<ü0À ¬ \C^¡(}""�`¬ \C^ùÈKÔ(K”Tl~C;Q�d_s€pox# Övµ_RBx@ç}[MÉDÂvàç}[MÉDÃv¢`Ô…ç}[MÒDlÚêrç}[MÖD"h)""�`öìYÕïyHq&o~­…¹x%åeÌ}&i'é˜X‰mnL9Àv<IÇ qZŠI9Úêr<RÇ qZŠI9Úêr<W8 kM}„X˜:""£`Þ½8‡|XÌ8Þ½8? }“WLŸH!Þ½8?}Ð…¤`àz̵;ÚêrzÌ©`uîqEœ_s€p{ÉDÁv�WoL�Y ZúÙa\g¥ëŠIÆv,…{ÒDlÚêr{×DüqE_s€pmy¥ö&à‰mnL9XkLe \C^Ævat!^t!^UNEX„…"`« Hý}à`í' X""�`»K"w:ùÈK""�`»K"w:N`Ð:w:""�`IqvÄ+a \C^Àv""�`IqvÕ+ &""�`IqvÕ+ &É2Ú¬! =r…p_s€p""�`uL`;# à#t!w:vàùÈK±%ÌK/Õଠ\C^ùÈKô&Hl"Iq_s€pô&Hl"ZŠI9Úêrô&IIquîqEœ_s€pô&I}–ó u—H…ÕZZ ^ùÛKô&Iý!s!NJ…"""�`ô&Iø4‘Kà`H ÕfšwLŠô&M àê'¥ÜK@ô&Nà`í' XÉ2ÚlÕ*"h)""�`É2ÚÕà""�`e4B[MÒDlÚêre4B[MÖD"h)""�`e4B[M×DüqE_s€p,:Y Kˆw°^zÌ©`½)í&€pt:#ô&Hl"Iq_s€pt:#ô&WüqE_s€pt:#²ÉvÆv,…y:i~‚LQtƒ99#"v´‰à8‘�Wp†`†8;8}@€:`†Þ½8ÙtƒÏvp†`†Þ½8€:`†vLT`fMÀ+€:`†ä‹M… ËsZ€Lµ"K69#"È_a\gUN@„:" ""�`†:)e j)R†:)ƒ!y;†:)Åÿ‰r}†:)5OŽpMvQ1„õZqQÌ�`ô&IÃv¢`Ô…4REå’plÚêr4RÕà""�`»R6xÃ+¯_€W­S Z­S ZE~”pŵWE}–ó u—H…,]a w!@~ØY¬ \C^¡(}ô&FaØYô&8"í' XæY¼% ‰mnL9‡|XÌ8Âv¶ É+ÿ-LqÕZZ ^Eåxss:`L;„!¡@~€Q]:FQ%:Àva\g©xxge„!àX[qj@5aYsȆ:)h;?ŒWL 2Ã¥ëŠ@¶pm}“%:dF%:lÀvKq”`?}…˜åUÖ÷þÿ6Ý7 >Þ7 <Þ7 :Þ÷ †7‰÷Ý*Ö÷%þÿÝ÷%úcôì‚÷ùcìì÷Ö÷ÊüÕ÷çÚÜ7 ØÜ÷ÿÿêÜ÷ Ä ÷ ðÝ ƒ ÷ æÝƒ ÷ Ü݃ ÷ ú ÷ ªÜ7 Û÷çžÜ÷ÂÕ÷¬Ü÷ ††D‰÷mŠÜæÚ÷˜Ü|Ü÷€Ü’Ý÷|ÜŽÝ÷vÜzÜ7 ŒÝÂ¨Ê ò%‚· xÝòe@J ·"f݇·,`݇· ^Ýòå@Š ÷5¸ÔÀV ÷5¬ÔÀ„ÀxÁšÂ ý÷5ŒÔÀ„ÀxÂÁ¨ ýÀFÁÕ œÃEÿÂ`‚ ÀeÁ ö·ÚÜ÷5 JÔ÷5 †Üwð‡÷5@pÜ÷ `n‡÷ Pj‡Àìð÷5Ô!÷5 Ôðû ÷ b ‡ð¦ ð÷ P‡÷e4Ü1÷UH ܸ‰÷ îü÷E@܇ððÕ ÷ ÷ þðe ÷ ü÷ ðÁûÂÕÃR$à üô‰Á¦ÃR$à ü̉ðç ÷ÕPâ÷5nÓ ÷0Dâ÷2â÷ ¸ð÷ âw(÷5@‚Û÷ ʆw÷ Ȇw ÷Ò÷$bÒ÷5Ó÷ r Ä|ôôôû ô4 4 ô”÷ 4†÷p Óõ‰7 ¢Ç÷5ÖÒ÷5ÌÒ÷ûÒ÷˜Ñ÷ .÷ÀòÑ÷5€¬Ò÷¦äÑ÷ ÷eìÚ)÷nÑ÷ÕÌÑ÷ þ÷eÂÑ÷ ôÁûÂÕÃR$à üô‰Á¦÷5^ÒÁÀÃR$à ü̉÷Õ€Ñ÷5<Ò ÷Ñ÷Ñ÷ ¦÷üЇ÷5€XÚ ÷E€PÚ÷EHÚÀ²Ù÷ ȇ÷58Ú ÷E0Ú À˜Ù÷ > ‡÷5âÑÀç7‚Ù÷÷~ÙÀÕ7rÙ÷õnÙÁÚ7 Ú÷ 00A@\‰V§3eaek›’ ‡&ÿˆ ‡ææ)ÿˆü‹€7VÒ±‡w Œ7 ÙÂÒ€ „ôðØ  ‚€lƒ€lC Àåƒ 4ô+€lÀe… ƒ DÁœÁEÿ� a@ †ÃeÅ ó‚÷‹´Ñ±•‰±wáÀ „ô’ô4`t ÷ pØxôô&ô4ôe÷ "ÿ´†÷‹Zѱ2‰Î‰±[ w0Øw,Øñ ÷ "ØCœà C`Á÷"ØÃe ÷4ØAœÁEÿ@� w`ö×Âî×ÒÀ ýÀø×0·Ü×ÂòÐ÷ ì×)ôe ÷ Þ× · Ø×—, ò¶× ÷‹ÆÐ—, ÷¢×ÄЗ, ÅÒÍ Åeû w�þw ‡&æ¦f&¦ …€€�‚ƒ„…f÷ R@�ÀeÁe÷ .ÀåÁå÷ "ÀåÁå÷ ÀeÁe÷ ÷ ÷ ‡Â÷ Ž¡±Ö ‡ÁeÀæÂ ¢1¬1¬+Àe ò÷¼ Ð÷Ð÷eÐ÷5Œ×÷-×ÊÖ ÷-×ÄÖ ÷58Ï÷5l×Á‰7 èÏ¡÷5 Z×±–‡‘�Š ŠÁ凤 ü‡÷5<×2÷5òÎ÷U0&×÷’¾Ï ÷5ÜÎ÷U(×÷Ÿ¨Ï÷5ÆÎ÷UPúÖ÷¬’Ï ÷5°Î ÷¹‚Ï÷UHÞÖÁxÏ÷ ÿ÷UÖև¤Ì*· ^Ï÷5‚Î÷U@ºÖÅÿÍ%ÿÿH#õ%ÿÿp- Åeî±Í%ÿÿ÷5@η Ï¡÷52Îõ  õ%ÿÿ õ%ÿÿ õ%ÿÿ w¨‡ÅÿÂÌMÍ%ÿÿw#zÕ@õ%ÿÿw-lÕ8õ  õ õ ÷UÖ2õ%ÿÿ õ%ÿÿ õ%ÿÿ ðK-s-s-õ%ÿÿ s-  õ%ÿÿ õ s-  Åeµ±¡÷5`͇±¡‡Âç÷5LÍÂ0Ì÷5<ÍÃÁVR$*à ü÷5(Í ÌÂçÁÂ9‘ Ñ ‘Ñí9Ñ ‰ÑeÑí9ÃÂe‘à ýÂÂ9Á¦9÷ 8¡±‡Âe ÁÞ9÷ "‡!é Ì ÂeÁè9÷ Äeñ‡Àü ÷ @ w¸ÚæHÿˆ‡%NVOL%M. %VA%A%VA%A%Y %3Z%N[%R,%R]%N%X ÷5FÌ÷ D ÷58Ì÷ x÷5,Ì÷ (÷5Ì÷ \ ÷5Ì÷ ÷ J÷Uþˇ÷:Ú÷�+Ê6Ú÷•2Úæ|ÿˆææ)ÿˆ7 ’Ì7 �Ì÷PÚæ|ÿˆææ)ÿˆ‡÷ Ú÷� ÊÚ÷�Ê&Ú÷�ýÉ<Ú÷üÙæ˜ÿˆææ)ÿˆ7 DÌ7 BÌ÷PÞÙæ˜ÿˆææ)ÿˆ‡÷5fËJ÷5@^Ë÷5TËB÷5ŒÓ>· �Ó÷U~Ó7lˆÓw ‚Ó7l|Ó ÷5*Ë,÷5@"Ë÷5Ë$÷5€Ë w ûÁ†;· šÉ÷5€üÊ÷5ôÊw èúÁx;¼ Àü ÷ ~ wöØæHÿˆw Úú÷NÒˆÒ÷JÒ„Ò‡%N%N[%R,%R]%N%N%X¡‡÷5àÒ7 \Ë÷ 0ɵ‰÷5€�Ê÷ ÉDÀü Âô;ÁÎ;÷  w�ØæHÿˆ‡%NTotal of %T. blocks in %M. files%N„ÅÐÊ÷ç†Ø÷ÈʆØ÷ÄÊ‚Ø Ä|÷ lø†÷àÊæ‰ ÂçÊ%ÿÿ � Âe— é÷Å *· NØw HØäfÀ÷ �À  €„ ! ú‡a‡W e‚fÅÒÍ ÅeûM…à áç�ÏÖ ‡÷çÑ÷Ê(Ê÷ Ñ÷*Ê7 Ñ÷ ð÷÷üÐÑ÷òÐNχ ÆÀÀe”÷ û_�vÿß‹tÿý€‡ ***THIS VOLUME DOES NOT CONTAIN A HARDWARE BOOTABLE SYSTEM *** &÷¥RÑ Â(Åú=ÀRÀ ý÷5@"Ñ$ÂLÅú=À•À ýÕÒÉÕÐÉ÷ªLÐ÷FТ÷NÐŽÂJз„Å>À•À ý÷¦É~€‡&÷ ìþ†D‰÷ ~Ç÷xÇÐÀlÇ7ÐÀ À À Àe 7@ÎÐVÇÈTÇ÷ÀdÉ÷E’Ð÷çøÏ÷÷ôÏ÷æÏ€‡÷5 È÷ ¾û÷ @ ÷U€:Ð÷5øÇ÷U@òÇ÷  ÷5êÇ÷ –û÷ ˆ ÷U€Ð÷5ÐÇ÷U@ÊÇ÷ X ÷5Ð÷UöÏ÷� ÆŽÕæÿˆ7 tÕ÷ÝŠÕnÕ÷†ÕjÕ÷5”Ç÷5€ŠÇ÷ ‚ ÷ ^ ÷ b ÷ f ÷ j ÷E@°Ï÷Eÿû¨Ï÷U ¢Ï÷ b÷‚@*Õ÷5 TÇ÷\HÕ÷5FÇ÷¼H Õ÷  ÷5pÏ)÷–Õ÷ ø ÷5^Ï �‰ÀÂ<7 „Õ7 ‚Õ÷ ®÷5€DÏÀý÷¦ÔhÕ÷¢ÔdÕ÷ ~÷–Ô²½÷’Ô®½÷ €÷5 ØÆe÷5€ÎÆ÷U`ÈÆ÷ ö÷E ¾Æ÷E€¶Æ7 ˆÇž÷UèÎ÷úÎjÇ÷tÇ^Çâ‰÷EÔÎ÷ æÎ ÷`@Õæìÿˆæ æ)ÿˆ7÷5²Îæìÿˆæ æ)ÿˆ÷5šÎæ æ)ÿˆæìÿˆæ æ)ÿˆ×­Õöÿ÷ æÔ÷êÔæìÿˆæ æ)ÿˆ×­âÔõÿ÷ ÚÔ€Û‰÷5Æ%÷5€üÅ÷U`öÅ÷ |÷E ìÅ÷E€äÅ7 ¶Æwhþ÷UÎ÷&Î|Ä÷hÄŠÆ÷ÿÿrÄâ‰÷EúÍ÷ ··œý·–ý‡æ�ýŽý&& ÁÿdÁ ý�€‡Á¢Å÷\ÎW ùcƒ· RÎW óɃ· HÎ÷5 nÅ E †÷5 ÍÒ‰÷U”Í ÷æÍ÷âÍ÷ÞÍÀÎÀ 7ÐÒÍ Â÷  � wÂŇæÃ ¦ Á @ B Ž ‡‚ã� à ÷Ö ƒ‡÷56Í;æ¦Å`ÜĪ ô€÷ lÁ÷ Vˆ €Áÿ÷ Hˆ à ôEôeL‹7£xÒ䇂7-pÒ߇÷�XÅU‰€Ð 7LÒ7JÒ7œÄ7TÍ÷ îþ‡  RdÁ ü‡÷ÊÒ÷ ÷�ØÒʼn÷¸Ò÷ ÷�ÆÒ ʼn7²Ò7ŠµÒæ˜ÿˆ†÷�ôĉ÷‹¦Ò�Ö ‡÷�âćæ æ * æ + æ2æ3ÁEÿæ ÎE‚w Ì …�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ € W ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡Â Âw d  ”Å¥ üÅ¥ ùÅå0B¡†€÷  Aa”ôœÿÿ‡w 2 Ä'Å  ÅUD$†BA÷ D &�Â(÷ ÅU� ÀBQ÷ ÿÂЕ* ü‡÷ &÷ &÷ �’•’•€‡@Á(÷ œf€  Àe ÀeÉÿÀe Àe ‡P.l.‚.š.ª. ¶. Ö.æ.ö. ///Î& î& ú&''&'4'B'R'd' p'~'Œ'œ'®'´'Ä'Ö'æ'ú' (( ( *(:(N(\( f( r(‚(’(–( ¶(Ä(Ø(ê( ö() ) ).)B)R)b)t)Ž)¢)¶)Æ) Ð)ä) ð)00AH\\l1DATADATADATADATADATADATADATAþ)**6*J*Z* f*"ˆ*ž*¬*&Ò* Ü*ê* ô*++*+8+ B+ L+P+ \+t+ˆ+ ’+®+"Ð+ê+,,*,>,R,Z,n,‚,ˆ,–,ž, ª,º, Ú, ú,-2- <-N- Z-$~- Š-ž-"À-Ð- Ú- æ-ø- . .. &.4. @.ABDEFIMNOPQRSTUXYZ<>ÉØâô=öMXd^Œ•öêžèò)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw :&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ ŒüÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚b‚ ‡AÂ Ê Ö ÊЕ%„Ì¥Vå ‡P”à ý‡Ð• B”f�‚÷ ¸û�à õ‡& æÎešûB& ¦æÎe†û;& æÎe@ü6H”ÈÅ€¢ ¢È• € à ò‡÷ nŠ€‡Ð• à ü‡Ð‹à üÀ ‡Ð• Е à ú‡& æÎe6û & ¦æÎe"ûЕ A‚¦Þ à ÷–%‡& æÎeöúóA÷ üà û‡Ð• à ü‡Ð• Aæ÷ æûAÎ ûÖ Â ÷ $Е.÷ ÎûÂ÷ AЕ; ÷ ªúà à‡Â ýð¥ ÿÿùÀ øAá ÷ &E‡Aá Â÷ HE‡Á ¦¶6D‡w PD…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w DÅ… ƒ÷ &Е.À À À ce÷ ÜÀ …Е:÷ Å ù Â÷ ÖùB‡×'&ÿÿæ1ÿˆ‡ÿ œœL`ÿ ”œL’bÿ ŒœLšdÿ „œL>bÿ |œLBgÿ tœLngÿ lœLœjÿ dœLâqÿ \œLnuÿ TœL8wÿ L®L–`ÿ D®Ljÿ <®L€jÿ 4®Loÿ ,®LXnÿ $®Læuÿ ®Lîwÿ ®Lœwÿ ÒL€ÿ ÒL$€ÿ üÒLÄ�ÿ ôÒL0‘ÿ ìÒL¢¡ÿ ääL€ÿ ÜäL¢�ÿ ÔäL…ÿ ÌäL’‡ÿ ÄäL>�ÿ ¼äLÞ•¦Þ5Îe‡w Á,… Bv ù    ù ‡‚Ê5ôùB‡wnù ꄦÊ5‚ú‚‡ò û¦¦‚ Ž (Ê5(ÊUW¬ ‡Ä ò ƒ Ä ó  €ææwÿˆóE€Ê5 ÛÊE Ž‚ØÖ ‚ÇW¬ ͇Ê5 ÊÄ È„,ÅÊE é ŠLHHKNJDIßî&w@ýÊEò ÊU ‡æ&W¬ )‡ƒ&ó #�Äô  �4 &æ9ÿˆ‡ôU€3ææuÿˆ†óE ææuÿˆ‡óU€¡„ƒ.‡Ê5`.ÊU & ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊE ÊU±‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&æf…Þ ƒ„…‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡&æ¦ff… Þ �‚ƒ„…‡‡ €MœLÀLçr}'°`@ŠL®LeIqøL4°`@ŠLœL÷Q€p Mpð€ÒLŠLZ£À] MD°€€,ÀLäLFwz4M[°€)ÀLÒLee4HM`e6‚`}›‚€€€²‚€¤Ê‚÷h`´÷â´÷çæ´÷0â´÷5Z®$÷ä´÷Õè´÷0ä´æÿˆ_‡÷p`ʳæìÿˆX‡æ æ)ÿˆÀÕÁÈ´÷‹Â´€À�¼´w(æìÿˆ÷:`”³æÿˆ=‡æ æ)ÿˆÀçÁv´÷‹p´€À�j´wòW ‡"HE7"DAð%÷U ¼­ð ÷U ®­÷E¨­/ð%+÷U˜­÷E ’­$"UF*$EOA‰÷¦ú¥‰¢F#÷ �÷5h­wÿwNÿ÷5 X­÷E P­÷5@L­÷5 @­÷U 8­ ‡÷ À¾²÷T³÷5 ­÷ ²ÂÐ÷ ²×- ²h`×-˜²p`æ æ)ÿˆæ æ)ÿˆÖ ‡ öÿp²7�X¥÷j¥T¥ üÿ óÿ`‰ ‰÷ ˆ¤&‰÷5¶¬÷ÿÿ.³÷ L÷@³÷ H÷¥þÿ&³wþæ�³æ³÷³÷ $÷ò²·³·•³€wöý÷5h¬wZþwnþ÷βæìÿˆ†wÌþ÷çÆ²æ æ)ÿˆ‡÷²ÂÁPÉ wœ²wœ”²æ`ÿˆæ æ)ÿˆÁe ì÷U€ú«7Š ¬7Š ¬7 p¤‡w žÓ÷P\¤÷5˜£'÷�ä«T¤÷^¤H¤÷UÀ«â‰÷P:¤÷ †wÞ÷5j£÷ ²÷ûÿ²÷ Ì÷‹ ²÷UŽ«w^‰÷�]¡ø±÷�W¡²7Šˆ«÷50£"÷Þ±÷ ˜÷‹ì±€÷¥Âÿä±÷�ޱΣT‰÷5£ ÷5 £÷5ú¢w\w÷ p÷Pš±÷ T÷5 ¨±n÷5Ò¢wö÷@|±7 ‚±÷ î÷5¸¢÷Up±÷ ÷\±÷ç`±÷\±÷ Àç÷‹Z±�×-V±P÷•óÿJ±×­Îª÷¥óÿ<±÷%6±÷�.±£`‰÷UœªÀç÷5P¢ È-V¢ð-R¢ð-L¢q‰÷ ä°÷ÿè°÷ ˜÷%ì°÷EZª÷¥õÿܰ÷�Ö°Æ¢÷¥Âÿΰ_‰‰÷5ö¡÷5ð¡wø\‰÷5â¡w¬þ÷Pа÷Uª÷ >÷5’° ÷5¼¡rü‰÷U²¡m÷5ª¡iý‰÷E ¡dw –ÑÅì÷f¢P¢÷5Œ¡<÷5@À©#÷5|¡÷ †wÜ÷U¦©÷�¸©(¢â‰÷0¢¢÷5 V¡ ×­¢©õ7 ”© 7 Ž©÷5@r©wœõ`÷ ˜À�ì¯$€À%Âÿ!7Ò¡¬‰÷ ¤†wtõ÷U8©÷�J©º¡â‰÷¡¬¡÷ \À�°¯&€À%Âÿ#á7Š(©Åì÷5@ ©÷5 Ä ÷­©ÐžðÀ�©À À ð Pé÷Pz¡7`v¡5œSw�j¯5 ÷5Œ õU ÷5¾¨õP÷ ä÷ œõ@÷ Ö÷5\ ÷‹ª¨ ÷5’¨ ÷ ÷ È÷5> %÷Ex¨÷5 . M÷5( ÷ 2 ÷E\¨÷E R¨ †÷UJ¨¸‰÷U B¨wÆþ÷5úŸõ ÷ ¬Åìõõ0õç ÷5ÒŸ÷5@¨·Š¨÷5¾Ÿ÷Š t ÷Uì§÷�þ§n ÷50¤Ÿ÷5šŸ©‰¨‰w šÏ‡æìÿˆæ æ)ÿˆ‡ ÷%`(®÷U¬§÷p®÷ Ôÿ÷‹(®"€÷5–§À ÷  ÷�˜§ ÷5 z§· 00AP\‰V§3eaek›’üŸ÷Un§¹‰Àxæˆbÿˆææ)ÿˆÀ Ù÷PÆ­÷ €ÿ÷ 8÷@¸­÷ rÿ÷E:§‡æ æ)ÿˆ÷‹´­€÷¥õÿ¬­ ÷¥öÿ¤­ ÷�ž­ŽŸ¦‰‰æìÿˆ†‰‡÷n­÷çr­÷n­÷ ÿ÷‹p­�×-l­P(÷•óÿ`­÷¥õÿZ­à÷¥öÿR­Ü×­Ô¦÷¥óÿB­÷%<­ ÷ ­÷ ­÷ Ðþ÷Uš¦Ë÷�­ Ÿ±¡÷P­‡·Š�¦÷ zÿ†¦‰ÀìÁç÷%HDî~÷%R1è~4÷%R2à~4÷%VOÖ~K÷%L1Ð~G÷Ôž¾ž÷5ú� ÷-¾~þ�>÷-¸~ø�:÷-²~ò�6÷ ¢æ æ)ÿˆ÷ ”æ æ)ÿˆ÷‹Š¬€÷�„¬tž¦‰÷ x÷ ¶þ÷ pæ æ)ÿˆðP÷ \÷ šþ÷­à¥^~ £‰÷ŠÖ¥Ö w@ü�‰ø“‰ö�‰ô÷5h�AÁçÂVÃR$à ü6×­ ¥çð ð ÷ ÷ >þððPðç ÷ æ÷ $þ÷%V1Þ}‰÷%F1Ô}A‰ð ð ÷ ¾÷ üýððç £÷5àœ ÁçÂxÃR$­à ü÷˜�‚�÷Uú¤÷� ¥|�÷5@²œ©‰¨‰ÃÁçšRà ý×­æ¤&ðû ð÷ ˆý÷ Bð¦ ÷ zý÷ 4÷ rýðç ÷ &÷ dý÷¥öÿ «ø÷%P«ô÷%UF }ð‡÷�«øœZ‰æìÿˆ†‰‡õ õþÿ ÷ �üÀ�䪀7М^‰õõPõç ÷ nü÷ jüÀ�¾ª€7ªœZ‰÷%EO¬|m‰÷%F1¤|÷%V1œ|÷‰Àç÷ 4Ø� ÀçÂ÷ ž×÷�}|É ÷x|Ä ÷�t|À ÷ ü÷ ü‡÷À©÷5€Ì£÷ –÷÷E€À£÷�È©ª©æ`ÿˆ÷�Ø©ž©æ`ÿˆ‡Åì÷5`› ÷U–£÷�¨£œ÷"œ œâ‰÷ Þ 9‡÷¥’£!÷56›õõ õÿÿ æìÿˆæ æ)ÿˆ÷‹Ø©€÷¥öÿЩ÷�Ê©º›¢‰õ`æìÿˆæ æ)ÿˆÀ�¬©€À%Âÿ7’›¬‰‡÷5˜© ÷U‚©÷‹£÷U@ø¢æ€©Î Î ÎEÿ¿æè¢ÎEÿ¿–%@‰÷5˜š%÷5\©!÷5†š÷5À¢o‰7 6›‘‰¸‰÷`"©÷ Üú†T‰æ æ)ÿˆ÷‹"©€T‰ Ö wÐú‡÷mž¢,›w *›÷5t¢ ÂP÷Eh¢÷m~¢›w ›&fÁp¢À\¢÷ ºßw`öšw ôš�€ÂH¢Â ÷54¢Âe0÷mH¢Ôšw Òš÷5â™÷5Ø™÷5@¢w<÷5¢8÷Uø¡·z¨æìÿˆ÷ÕV¡÷åR¡· ò¡÷UØ¡÷5Ò¡wžæ æ)ÿˆ÷E¼¡Â�d¨J€Â%Âÿiæ æ)ÿˆ÷E ¡Â�,¨w¢Â%ÂÿYM÷Eˆ¡·&¨æÿˆ÷çæ ÷÷â · ‚¡÷Uh¡÷5b¡w.æ æ)ÿˆ÷EL¡Â�ا€Â%Âÿ1æ æ)ÿˆ÷E0¡Â�ا€Â%Âÿ#÷5€à˜Ý÷-ƙșه‚÷-º™¼™Ô‡ÂÂÿ÷5þ Û÷5ö Ÿ÷5 î B÷E æ ÷Uâ ;·\™÷n™X™ž‰÷E’˜÷UÈ ¸‰÷U À ÷¥Р÷UÀ² ÷ Òö÷ fÏ÷ ÒÏ÷E ž ÷Eš Îàx÷ D—Îøx÷E€† wR÷U@| ÷ RÁ÷E@r Îèxw:÷ "Ï÷5$˜Y÷5˜@÷5€˜h÷U ˜·î÷¥T ÷ Á±‡Îèx÷À¦÷0Ʀ÷5  ÷E w€÷U wv÷ *ö˜‡÷ ,Ï÷UÀúŸÎàx÷ ¤–Îøx÷E€æŸ÷t¦÷0z¦wB÷U П÷ ðõ÷5@ÆŸJ÷0^¦÷ &÷ç Ÿ÷E¬Ÿ/÷5¦Ÿ ÷5 œŸ ÎB÷E�Ÿ÷U ŒŸ-÷EH—÷U ~Ÿ÷ ¦÷ ˜õ†wšþ÷5hŸ÷E`Ÿ÷U XŸ÷ÕÀž÷ULŸ÷5HŸ÷E@Ÿ÷ Æ ÷ ° ÷U0Ÿ7 6Ÿ‡÷5æ–!÷5Ÿæ æ)ÿˆ÷EŸÂ�°¥€Ö wþ÷5öž æ æ)ÿˆ÷EäžÂ�p¥î‡÷U@Þž÷ ,û†wúý‡÷5@ÆžwX÷EŒ&€7 ^¥¯‰÷Uz€ ÷5 žw ÷5”ž!À%(&fÁÂÕÅçÀ•$À üÁ Ê öÍ Õ‰�€ÀåÂ0ÕÅ0çÂÕÅç•$À üwd÷UfÀ &÷5*ž$÷%UF¬v÷%HE¤vωt÷¼ ’–™‰oÅåçÅEÿfÅeçf�ÎEÿÎ …ewr–…÷ð h–Ö‰Z÷%DAdvð‰Tï‰Åå2çÅEÿf… ÅÀç… œ‚ B!Àe…à÷7p7œp7lÅ waf…7ð•÷¦Àœ7 Öœ÷ÊÒ•7 ´œ÷ ¦Ã†÷Ò•ú•׉7 4÷˜¦,Àü Â>rÁ$r÷ ¶Ô& & & & fæü & & & Εæææ ÿˆ€�À ÀEÿÀ #ÅeÂÕBaÅeç÷5 �Âe0Åe0€ w²þÀ%(w þÂÕÅçÍ •$À ú鉀÷5¢÷Eš÷5’÷UŠ÷5‚÷Uz ÷5r÷Ujl‰æÿˆæ æ)ÿˆÂ�*£ €Â%öÿwü·ð”÷•ì” ‰÷çΛ÷EZœ7 bœ‡%NFile ID %P,%P LBN %T.%NDr÷ Ê÷5ä“÷5Þ“ ÷5@ œ·Š"œ÷�œ6œÀìð÷ª°÷¦¬ÁÚÂ4xÒÁ ý÷5Ü›÷5’“÷5Œ“QððPÕ ÷5v“wdwdÂçÁÃxÒÁ ý÷5V“ ò\“úÿòX“üÿòT“þÿÁ#à ÒÁ ýÁÂ%çÃxÒ”Á ý÷•11tðP÷5“C÷5“?ðç ÷ 08‡ðÂ< ð÷ /‡Á00ÂfxRRRð0x ðP÷ þ‡÷¶÷²ð€x ÷ æ‡ð÷ Ú ‡ððš ðP÷ · Øš‡ððÕ ð÷ äò÷‹8¡�×-4¡P%÷•óÿ(¡×­¬š÷¥óÿ¡÷%¡ð ð ÷ ¨ò÷UpšðPÕ ð ÷�è Ø’Z‰ððeP ÷ >ðPðe ÷ .÷¥öÿ¾ ‰ðeP ÷ ðeP ÷ ÷ ÷5Б÷5È‘ÁV ÃR$ð ð ÷ ÜððPÕ Èà íÁÕÂç÷5È™Ã(÷ ¤Áœ`ÁeZÕÂê<Ã$÷ �÷údž`ÃÁPÕÂÂ<÷ zÁP×Ñ%HDÑ%R1ÂfxÃ00ÒÒÊ÷5.‘Ã&Â4x÷ H¥‰Á ×Ñ%HD Ñ%R2Ã&„x÷ (¥‰Áðךà ÷ ÂÄÁØÃ÷ ¡‡R$à ü¥‰‡æìÿˆ†‰æ æ)ÿˆ÷‹~Ÿ#€×­xŸöÿ÷�pŸ`‘÷r‘\‘÷¥ôÿbŸ‘‰ð%ð% ÷5z�÷%ƘZ‰¦‰±‡ÅìÁ°˜Àgx÷ >Ì÷5 �˜Dõ÷ ö=‡õõ0x õP÷5 h˜÷¾÷º÷ Ê'‡õ€x ÷ªT÷¦P÷ ö÷œò÷ ¤‡õ€x ÷Œ.÷ˆ*÷ Œ‡õ÷ €‡÷ z‡õÕ õõP÷ bõeP ÷ X÷¥Fl^ÀÐx÷U@Ô—ÀØx÷%Š�7|7z7Ä7ÂÀ0xÁÕÂP$ ü÷ ÷ ¥‰÷E �—‡æìÿˆ†‰æ æ)ÿˆÀ�ž00AX\\l1DATADATADATADATADATADATADATA €À¥öÿÀ¥Âÿ7ä�Û‰±‡À°Ã,� ÷ Õwü�7ú�7 ð�7 î�‡÷ ë÷ Rë÷U0—÷ 0ð†`‰Åìõ õ ÷ †A‡õPõç õ÷ n÷%P†�ú÷ `Á‡÷5ªŽ¡õ ßÄçô% õ÷ 8‡÷%PN�ùÌ%UFö÷ "‡Äç÷%4�÷ šÁôÌ%UF÷ ~Áî‡æìÿˆæ æ)ÿˆÁ��€W õÿwîŽ`‰±‡VOL1BACKUPD%B1111001001 HDR1HDR2 00010001000100 00000 00000 000000DECFILE11A U0414404144 M 00 EOF1EOF2EOV1EOV2ÿ ÒÒLš€ÿ ÒÒL€ÿ ÒÒL&Šÿ ÒÒL$€ÿ øÑÒL.Šÿ ðÑÒLÄ�ÿ èÑÒL>¡ÿ àÑÒL¢%NBackup file ID %P,%P LBN %T.%NRecovered Š`w šÕ÷v¤´ÿ7 x¤÷5 Ô­w° ×-\¤÷5¾­ÀR¤ÁP¤ÁíV¤€ ÀíN¤ ‚Á-vÿ‡wpÿ÷U ”­÷mfÿ4¤w .¤À&Å` À ýÂV¤Å÷-N¤N¤i‚À¤Á¤ ƒÜ „Ò¦�å€ áw–£÷”£÷íŽ£Ž£· Š£ W!fþ_@Ýý_€ `·%Ä£Å嵊`DÝ` DÝ`õª£`õ¦£`· €þ÷-ÐþH£†DÝ`ÄmÄþÄ ÷m¾þ„£5‘`÷m´þ~£w x£9Äm"£÷m£j£5‘`õŠ`÷í£”þÂe· –£ †·Ž£·L£·H£÷Eÿ@£Åe—Áù CÜà C`ó fÅÃe ÂæÚ¤wÖ¤÷ j·Τ…Ø÷ H×-ð¢×-è¢×-à¢÷e è¢w â¢÷-Þ¢Ò¢‡‚÷-֢ʢƒ7 Æ¢÷å È¢· ¢w àÓ‡w ÊÓ÷¦¢äý  ÷Ôý÷ø¢Ìý÷`Êý7 ÈýÅê¢õ<À¸ý¸ý÷-¬ý\ýœÄEÿ„ ÷ *†÷ ^7 6¤7á�ý7aŠý· ‚ý÷e~ýwmtýÝw fÓ‡õhý ¦ µ5’5‚õ¢fÿˆ†‰÷‹.²€÷�(²à£±‡w Ó÷%7’^ý7Zý7 Ê£÷ÿÿª¡æ‰÷ Š7 Hý÷U *«ƒ7’>ý7:ý÷4ý,ý÷0ý(ýÀ�`Â÷ pÿ†÷ÿÿn¡æ‰·ý÷ Jà ÷eÀü÷eýw úüà÷ òü& & & & æ æw`& & & Εæææ ÿˆw zÒ‡w dÒÀü „`ÁV`÷ úá& & & & fæü & & & Εæææ ÿˆ÷U‚üw 4Ò‡×-ì” æÆ¢÷ À¢÷ T·¸¢Áù CÜà C`Ãe   €ÜÀEÿ€ `D 7!Ì ‚‡w!Æ ‚Âe· ö í‡ó øÿ æp¢÷øÿj¢÷ þ·b¢ß·Ò Åí– „ @áÀ ‡Âæ©Â ÷5–¡÷5Œ¡÷5@©wÖ÷5´©0÷U¬©÷ ´©÷®©@ ÷眠÷$˜ ÷, ÷ ¬û÷Õò¨÷å Ž©÷Ut©÷5n©w:÷Eb©÷  4÷EV©wb÷EL©÷ T©÷N©àŸ÷ØŸ÷@8 ÷Õ0 ÷ Lû÷ç’¨÷÷ލ· .©÷U©÷5©wÚ÷E©÷ ¦Ÿ÷Eö¨wÂ÷5 ê¨=÷E â¨÷UÞ¨6·X¡÷2ŸT¡ž‰÷EŽ ÷UĨ¸‰÷U ¼¨÷¥̨÷UÀ®¨÷ 4 ÷ b×÷Êò ÷ È×÷E ”¨÷E�¨ÎŒ~wX÷U@‚¨÷ XÉ÷E@x¨Î”~w@÷ (×÷5* \÷5  C÷5€ k÷U ·÷¥Z¨÷ ɶ‡Î”~÷Ξ÷Êž÷5&¨÷E¨w¬÷U¨w¢÷ –�‡÷ÊV ÷ ,×÷UÀú§ÎŒ~÷ ¤žÎ¤~÷E€æ§÷|ž÷ xžwh÷E Ч÷ V÷5@ƧJ÷ \ž÷ L÷ç §÷E¬§/÷5¦§ ÷5 œ§ Îh÷E�§÷E Œ§-÷EHŸ÷E ~§÷ž÷ þ†wžþ÷5h§÷E`§÷U X§÷ÕÀ¦÷UL§÷5H§÷E@§÷ r÷ \÷U0§7 6§‡÷5æž÷5§ ÷E§Â�Ö­€Ö w,þ÷5§÷Eø¦Â�¼­ó‡÷ J †wþ‡÷5@à¦w˜÷EÌ&€€ ÷-Ô¦f�æ`�ÎÎ ·cº�ÎÀ¦ÎíP�·L�÷ ÊøÀå×-,mUF×-$mHE×-mDA×-TnyòÀ(÷5|¦wœ÷5p¦À%(&fÁÂÕÅçÀ•$À üÁ Ê öÍ Õ‰�€Â0ÕÅ0çÂÕÅç•$À üwj÷UfÀ &÷5 ¦$÷%UFŒ~÷%HE„~ωt÷¼ rž™‰oÅåçÅEÿfÅeçf�ÎEÿÎ …ewRž…÷ð HžÖ‰Z÷%DAD~ð‰Tï‰Åå2çÅEÿf… ÅÀç… œ‚ B!Àe…à÷7v7œv7rÅ wal…7Ð�÷¦ ¤7 ¶¤÷ʲ�7 ”¤÷ †Ë†÷²�Ú�׉7 :÷x®2Àü ÂdjÁJj÷ –Ü& & & & fæü & & & Εæææ ÿˆ€�À ÀEÿÀ &ÅeÂÕBaÅeç÷5ê¤ÂeÅe€ w²þ÷%UF^kÀ(wšþÂÕÅçÍ •$À ú鉀÷5¢÷Eš÷5’÷UŠ÷5‚÷Uz ÷5r÷Ujl‰÷›÷Õb›÷ ~ö÷ ›wèûÂ�«€·Êœ÷¤šÆœ ‰÷稣÷E4¤7 <¤‡%NFile ID %P,%P LBN %T.%Njj÷Äj„©÷E ò£÷çàÿ÷zš÷ Òÿ÷5Ô£÷ÕÆÿ÷¾ÿ7 ¾ÿ7 ¼ÿ7 ºÿ÷¶ÿÀªÿÀmªÿ÷5 ¬£÷-¢ÿ¤ÿQwz÷ ”ÿL÷ˆÿŠš÷€ÿ"š÷‚ÿ÷$zš÷ ”õ7 pÿ7 jÿ÷ šwF÷-šVÿ÷U \£÷ö™VÿÀFÿÀmDÿ"HE"DA"UF,üCO/,þNT+ð ú(÷U £,@yò ÷ ÿÿ· ÿ· ÿ÷eúþ÷-öþìþÕ÷îþ7 äþ7 âþ¨÷U â¢wxÁÒþwp".M÷ Äþ÷ 7 ¸þ7 ¶þÀ®þÁm¬þW".· ¦þ·  þ÷e˜þ×-˜þ ï÷-Žþ„þ7 †þÁ€þÀxþ‡÷-xþnþñ‡÷jþl™÷mhþf™÷\þþ˜÷í`þø˜· ô˜÷ rô÷mô˜Tþ÷-î˜ä˜÷U F¢7 <þ÷8þ7 0þ¾÷ Â÷ &þ×- þ'×-þ #÷þþ· þ÷þ÷ þÁþý÷mþúý· öý÷möýòý· îý÷-èýÞý7 àý×-Üý ÷eÐý‡÷ &÷ÀýÄý÷íÂý¾ý÷ºý÷ ¶ý÷®ý°˜÷m¬ýª˜÷¨ýB˜÷ Àó÷mB˜¢ý÷-<˜2˜÷U ”¡÷Žýˆý· „ý÷€ý|ý÷xý÷ tý÷rýrý÷5j¡wÒþwÚþ"HE&"DA÷U R¡ð ÷U D¡÷E>¡"ð%÷U.¡÷E (¡"UF#÷5¡)÷ šwý÷5 ¡÷E ¡÷5@ü ÷5 ð  ÷U è  ÷-âüØü7 Úü‡÷ ÷-ÐüÆü7 ÈüV¦÷ì¦÷5¸ 00A`\‰V§3eaek›’÷ þÂÐ÷ Ö ‡w ^ÈÀ˜üÁm–üÂŒü ÂíŠü‚ P  ü ÷|üÂ�uü‚ ·àvüw 8ȇw "È  È  Ü‚ …` ‡ÀeÁeW 0ñ‡W! ÷‰¦–ù‰w þÇÖ w4üw,üw ðLJw ØÇ÷~––˜÷5Ò—÷� t–÷`–‚˜÷UúŸ÷Šd–ù‰÷V–n˜÷ º ÷Ü–Ò–÷ؖΖwhÁ�÷5ÖŸÁpwœt¦wœЦ7Š$–÷5x—wœ´¥ wœÈ¥wœÞ¥wœô¥÷5R— ÷5 J—÷5D—wüw„w 0ÇÅ$÷È•ê—÷5&—(÷5@ZŸ÷5ZŸ÷  ÷UFŸ÷�XŸ®•÷ÿÿª•â‰÷’•´—÷5 ð–7 <Ÿ÷5@Ÿ÷UŸwl÷ Þ ÷UŸ÷�Ÿn•÷ÿÿj•â‰<7Š^•Å$÷5@èž4÷5 ¢–0÷­F••ðÀ�>•À À ÷5О ð på÷p•5œs7œs¸¤ð �Ø÷�þ”5œ“7œ“º¤7œ“Ф7œ“æ¤7`â”w�L¥ ÷ Ú÷5zž-÷5 ,–b÷5$–÷ 2 ÷5–÷ Ò ÷5€–÷ ê÷E :ž †÷ÿÿ¢”¸‰÷U *žwÿ÷5â•÷´”÷5Ô•÷ àÅ$÷œ”÷ ˜”÷çô”÷5²•÷5@æ�·ŠL”÷5â�÷2”T–÷UÌ�÷�Þ�4”÷50„• ÷5z•÷ÿÿ ”©‰÷ÿÿ”¨‰w nŇ÷ø“–÷�ª�”÷5P•/÷5 „�· ì“÷5>•÷5€0•!÷5*•÷U^�÷‹È“ù‰æt~ÿˆ÷@ú£7 ¤7 ¤÷ø£æ$ÿˆ†÷àŽô£‰‡·Š<�÷5@(� ÂÀ¦ÁÀ ý÷U@�÷ Š÷çü“÷”“÷Œ“÷$ì“÷E ìœ÷ ï÷Eâœ÷ 8w÷UÖœ÷­àœ^u÷…0“ù‰÷ŠÐœÖ wŽý�‰ø“‰ö�‰ô÷5b”÷  ÷’“@“÷Ž“<“÷ 8÷"“÷ç~“÷ šî×- u ÷Etœ÷ Êv÷Uhœ÷5” ÁçÂxÃR$Ïà ü÷ž’À”÷U8œ÷�Jœ ’÷5@ð“ ÷5æ“>÷ÿÿŒ’©‰÷ÿÿ‚’¨‰ÃÁçšRà ý×­œ(÷ûð’÷ˆ’÷€’÷ î÷¦Ú’÷ öí÷çÐ’÷ ìí÷ n’÷ Lüw”þ÷%UFBtó÷%HE:tï÷%AD4të‡Å$÷5\“÷U’›÷�¤›ú‘÷””÷ÿÿð‘â‰÷ L ‡×-Š›‡À¦Áï ýÀ¦Á¦ÄûÃñ üÄ$ôôôû ô4 4 ô”÷ "Á†÷àŽ“õ‰7 �‡ô¦ ´ ÷ Á† æ ÁÂdÁ ý‹ ôEôet ¯ìÿæU‰Áÿæ ÂdÁ ý‹ ß÷Þ©“÷Ú©“÷Ö©“×-Ø©×-Щj‰À´Áx÷5ˆš÷5:’÷54’Á„Â÷5hš ÷5’$÷âÎ’q‰Â ðÁÂŽwÃŽ“$p‰Á û÷5ì‘×-:š×"p‰÷êJ™÷¦B™÷æX’÷|’÷J’æF’7 B™÷ À†7‰·6’÷™Z’÷Ú™÷¦ ™÷J’7 ™÷ ô¿†D‰æ™æ™æ™÷™÷¦™÷ö˜÷Úø˜÷ð˜÷Uš™÷ Ì ÷E�™·Þ˜·ؘ·И†E‰À¦Áð%« ÀeÁ øE‰ð%Hùð öð%»z ò7À‘÷æ�‘7 Š˜7 n˜÷ùf˜÷ Z¿†2‰÷ù�÷ef�÷þ�þ� Âö��ÜþÿÁ w`î�7 ª�·Ò¦�·¢�7  �÷œ�÷ŠƒŠ�÷†ƒ†�÷5ž�÷rƒv�÷nƒr�÷UИ×-Ú˜‡À¦ÁïÂP ýÀ¦Á¦ÄûÃñÂPÔ ü‡÷ ²÷œ˜÷�ŽŠž÷ ý÷$x�÷52�1÷�÷Õb�÷øŽ÷ xê÷ úŽ" ÅW,üÖCOW,þÖNTñ úÖÁe… w!ÒŽÞî÷ÕÒŽw`ÎŽf÷ ˆÂ�÷5Ô�ì‡÷ ¶÷e¬Žw ¦Ž÷ h÷òŽ Ž÷Ž÷ ˜÷‚Ž÷çÞŽ÷E à—÷ ôé÷ç~Ž÷ :Â:‡÷5„�5Äçô% /÷ Îé÷5 °—)÷%HE*p÷%AD$p!÷%UFpî÷ ¨é÷5 Š—÷%UFp ÷%HEüo÷%ADöo Äç÷ \ÂéÄç÷ BÂ䇿¼�÷ ¶�÷ J÷ù$Ž÷efŽ ÂŽ�ÜþÿÁ ÷ŽŽw` Ž÷ ºì·Ž·Ž7` Žw Ž÷Eÿþ�÷ú�ð�÷ö�ì�÷æ�œ�÷â�˜�·X�‡BRUBACKUPVOL÷ÀœÂÁp÷5ŒŽÁ�É wœ¤œwœb�æ`ÿˆæ æ)ÿˆÁe ì÷U€�–7Ф–7 �‡÷nœ÷5€z–÷ ¢ÿ÷E€n–÷�vœXœæ`ÿˆ÷�†œLœæ`ÿˆ‡w ¾÷E T–7 ôŒ÷ðŒ÷5@D– ÂÀ¦ÁÀ ý÷5ä�÷5@"–÷ œú ÷ D÷ ¸þ7 �÷þŒ÷5¼�:÷5@ú•6÷çêŒ÷‚Œ÷zŒ÷ vë÷$ÖŒ÷ ðç7 Rp÷¥\n÷….Œ‰÷ fþÀP€ÁN€ÂL€ÃJ€·PŒ÷NŒ·˜Œ÷–ŒÁà€ €à‚Á%@ƒ‰÷ 2þ÷U@†•w H½w 4½÷52�÷5,� ÷5@ `•·Šp•÷�l•„•÷5�÷5 �÷š>Œ÷Ö‹÷΋÷$.Œ÷COF—÷NTB—÷ <ç· *•÷ÕŒ÷¨‹÷ ‹÷$Œ÷ çÁÕšà ÂÄÁ*ÕÃ÷ w ¨¼‡R$à ü¥‰‡w „¼÷UÈ”÷U ~Œ÷•@‹÷•<‹7 ú”÷ö”÷�½Š>šæÿˆ7 $š÷Ý:šš÷6šš÷U`BŒ÷îîZŒÀ¦Á׿Ä÷ÂÔ üÁ¦ÂõÀRÀ ý÷ ðÀ¦Á×ÂP ý ÀÝÆŸ € 7ÈŠÄ ÷ ¼ ÀÝ®¡€ 7`²ŠÄ ÷ ¦÷¶À¢Š ÁÝŒ™ÁÁ݉™@`€  Àåf�� û� w®‹÷ª‹²‹÷¤‹(Š÷e¦‹×-¢‹‚÷˜‹÷ BÀÁŽwÂŽRÀ ýʼ“÷ 0÷΢Œ÷Ê¢ Œ÷Æ¢Œ÷ "÷ &÷UŠ“÷ ü÷Þ‹ê‹÷à‹ì‹÷Ö‹â‹À Áê‘À ýÀ¦Á÷ÂP ýÀ¦ÁõÂP ýÀLŠÀmÄ“ÀmÚÀe÷²˜Â‰÷®˜¾‰7ຉ· ´‰7 FŠ÷¬‰t˜÷¨‰p˜÷ j‹÷ ª÷ý’ŠÀŽŠ7ŒŠ÷ef†Š÷‚Š|Š÷åvŠ÷ *wá>˜· 8˜7á4˜÷ 2æ,˜Ö]*˜ñÀVŠÂPŠ÷Œæ‰Ê�â‰ððB‰ð>‰·Љ·†‰÷ þÂÐ÷ æ÷ ‰Ì’÷‰Ä’7 r’÷Er’w 4º‡ ݃`ƒ ÄeÀ ÷‡÷˜ŠÅ²Š÷ ž÷p˜D‰÷l˜@‰· žŠ‡÷50’÷U@ ’÷5€Ú‰÷5Ô‰÷ ’6÷5ĉ2÷ hŠ÷ üÀùðšˆð–ˆ÷Žˆ‚ˆ÷Šˆ~ˆ÷ ÷nˆ÷fˆ÷ÕĈ÷ &÷ Üã÷Z÷5 ®‘7 Z÷@ˆ÷ ÷ ¼ã‡÷’ˆ@ˆ÷Žˆ<ˆ÷ &ç÷vˆ,ˆ÷rˆ(ˆ‡w 6¹÷ à‰÷5.‰ ÷ ÿÀÁýÂùRÀ ý÷ T÷:ˆð‡÷6ˆì‡· è‡w â‡7 â‡÷Þ‡÷5ìˆ×-:‘ ÷ˆÆ‡÷ˆÂ‡÷e¼‡w ¶‡÷ ¢æ÷U‘w ʸ‡æH‰æB‰÷<‰÷V‰b‰7 2�÷æ.‰÷ù �7 �÷ ü¶†÷‰6‡‰·‰·‰‡÷00Ah\\l1DATADATADATADATADATADATADATAd—÷ ÎÂpþæ$ÿˆ†‰÷‹d—€÷�‰‰‡w L¸÷6‡÷å,‡· &‡÷‡÷Õr‡÷‡÷‡b‡÷‡^‡÷ |â÷ þ†÷5 ˆ#p‰ ÅW,üÖCOW,þÖNTÁe… w!Ò†ÖñÂÕB`ÃVÄÒ$ðÄ üÅ wa ‡w ‡w Ò·‡ Vnÿ lÌÒLš€ÿ dÌÒL€ÿ \ÌÒL&Šÿ TÌÒL$€ÿ LÌÒL.Šÿ DÌÒL’‹ÿ <ÌÒLÄ�ÿ 4ÌÒL>¡ÿ ,ÌÒLh™ÿ $ÌÒL¬¡ÿ ÌÒL¢ÿ ÌÒL\¢ÿ ÌÒLÞ¡ÿ ÌÒL0‘ÿ üËäL€ÿ ôËäL¢�ÿ ìËäL…ÿ äËäL’‡ÿ ÜËäL>�÷UpŽ÷EjŽ÷çÐ�÷÷Ì�7 ò†÷E‡RŽ÷²�÷À‡÷¦‡÷¦‡÷E4Ž÷ è ÂÿÅÿÿÁüƒ÷UŽJ!r!r! r! ò r! ÷Uð�Á Âeç÷ |‹÷:�÷ �/÷0�(�÷f‹$�÷^‹�÷�÷¦�÷E@°�Â�·d†·b†÷úŒX†÷àŒX†÷ ² †»‰÷æŒêŒ÷⌠‹÷mތČÑ÷ ÖŒ(÷5r�? ØŒ÷p�÷ $÷ ž÷EX�7 ì…÷ n»‡wøþD‰÷U @�÷ H�w¶÷%˜ŒwØwÈ÷|Œ€Œ÷xŒ¶Š÷ítŒZŒÁnŒÁÁ Áe¦À¦÷5€�À¼ƒð Àe ùw ÿð%z öð%ò÷5ÐŒÀe÷ øµ †Àå÷5@ÀŒã÷E@¸Œw8ÿÀå7…÷苌÷䋌7Ú‹7Ö‹÷E†Œ÷¦¸‹7 ¶‹7 Ê‹÷ÊÆ„÷ ž²†÷¼ ì„܉wnÿ7ä„÷eÞ„÷ „�7,€�÷5JŒ÷µ€y�÷54Œщ÷5*ŒЉw.ÿ÷5ŒúÓ‰ø7 ˜„÷UŒÅ¦÷ ¹î‡÷EŒ÷`‹`‹7V‹÷(‹N‹÷$‹&‹÷ ‹"‹÷‹ò÷‹î÷.‹÷5Æ‹÷5x¾‹ ÷ �÷5@¶‹wºþ÷U¦‹÷5€¢‹÷\‚ÜŠÃP‚÷òŠÃ à à ÃmðŠ÷îŠÓ<‚Ë:‚÷ ºŠw~þ÷ЊÀŠ÷ÈŠ¾Š÷¦¶Š÷¬Š÷ÀŠ®Š÷E@L‹÷¢Š„ÂžŠ·„·„÷zŠüƒ÷ N†÷¼ ®ƒÝ‰÷ådŠ÷xІŠ÷pŠvж÷ lŠwþ÷^ŠdŠ÷ZŠhŠ÷-VŠ:Šƒ÷4ŠLŠ÷íHŠ,ŠÄBŠÄÄ Äe¦Ã¦÷5€ÔŠÃ’�ó ð%ó%z ó%‡ÃeÄ íwüþ÷5€žŠ ÷E€–Š÷Þ‰ð‚÷UˆŠ-÷5†Šç÷5vŠ÷5nŠ Ãe÷ ´†Ãå×Ãå÷5TŠ÷5JŠ ÷5BŠ÷ ÷U6Š÷ fÁ÷Œ‚÷-”‰”‰&‡÷5â� ÷5 Ú�÷5Ô�÷mŠŠ÷ Ä÷5Š¥÷5@ô‰ ÷-º‚À€ ÷%DAnP÷E@܉÷ �÷@‰‰7 ‰÷Ê‚7 üˆ÷ î¯ †÷¼ <‚÷:‚÷e4‚׉wøþ‰ò  ÷5˜‰*³,òµ€ "÷¼ ‚÷‚÷eü�ò ÷5j‰ Љ ³,÷5V‰Ó‰wžþ÷5H‰úщø÷5:‰æ ÷5,‰#æÅ�ˆf�ÎEÿÎ …e…e&fÁ €R•Á ýÁš�÷ Ö°�€÷5 w8þý‡ÅNˆ÷ ôµø‡÷5Ôˆ ÷ ¦÷5@̈wÐû÷U¼ˆwâþ÷5´ˆ÷ àwúýˆ÷ · ¨ˆ÷ Ô‡w÷-ʇô‡wÔ÷ Žˆ÷5@€ ÷5 8€÷52€÷mpˆpˆ÷ "÷®‡÷í¼‡¨‡÷5 €÷5 Nˆ w þ¯÷E0>ˆ÷U4ˆ÷ f w ú¯÷5@&ˆ÷è~v‡Âà~·p‡Å@RRrÂe·Ì€÷E@ú‡÷ÀL‡÷D‡÷Uæ‡÷ ’÷U@Ú‡÷5 š÷5” ÷5ˆ ÷Õ‡÷ ‡÷5®‡÷çþ†÷Õö†÷ì†÷ ²†Þ‰÷ ^÷ ä†÷Þ†Š‡÷5> ÷5 6÷mv‡z‡w t‡÷5&· d‡÷ ¼÷5N‡÷5@L‡  ÷5 :‡÷5 ø~÷5ò~÷5è~ ÷5‡ ÷5€Ö~÷U ‡÷ ô÷ ‡÷Eü†÷ °÷X†÷À¸7°Â.ÅLÀ•À ýÀš÷˜7 †÷5Ćwü÷†wˆü÷íꅆ†…œÅEÿ… ÅhæÒ…••U%Õî~÷ Ä…ø·¾…wLwð…÷åê…÷5p†÷Eh†÷ ¶÷ Â÷eÄ…÷ ¢…wžû÷˜…¨~÷UB†wü÷5 ü}÷5ö}Âwì#w à­÷ À«w è­‡wÒ#÷5Ô}÷ î#wú#÷ Þ#wê#÷5 º}÷5´}÷ Î#wº#÷ ¾#wª#÷5Ö… w Ž­÷ÿÿÔ…÷ h«w �­‡÷5€}÷ š#‡÷ Œ#‡÷5 j}÷5d}ÂÂe÷ &²‡¦œÎEÿÎ ‚eòòò ò ò‡÷5^…÷%ç„÷%Õº„? ´„÷L… ÷5 þ|÷5ø|÷ w ä¬÷ ¾ÿ÷ (…÷5Ú| ÷5 Ò|÷5Ì|÷m … …÷ ¼þÀb„Ð…Ð…ÁÂJ„�Á ýð-òöÿð-êøÿ ÐÐÜÐÚÐô•Ðò•Á Á ýЖЖÈþ•÷5b|ðyòò÷UŒ„÷U€ˆ„÷mބބ÷{÷ :þ÷5@r„ ÷-8}>{ ÷%DAìJ÷E@Z„÷ w ¬‡&Àˆ‹&À„‹ÂªƒÅ(Å û÷U(„À’ƒð÷5„ð÷5 „0 È-ðð÷5²{ðyò@€÷5¢{÷Þƒ÷ ’ý‡×-6ƒ××-.ƒé÷ƒ÷ výÂŃæÕ ýƒw ƒ‡w V«7 ž7 œÃÚ‚Àð‚Á¾‚ œÂEÿ‚ ·`€w zÀeÁ ó÷ ²‚)÷¬‚¼{÷5{÷5{ · ¸‚÷%²‚÷ Hƒ÷ Bƒ÷ >ƒ÷¦b‚7 x‚÷Êt{7 V‚÷ H©Æ†÷t{œ{׉Àx‚ðð÷J‚w ƪ‡HEADDATANÀw žª  ÷5Ö‚÷5 ΂÷5 Šz÷5„z ÷5xzææ‚÷e`ü�ææò�÷e0ì�7 î�Å|÷5�‚Å$õXÀÒ�ÂÆ�n÷-Æ�À�jœÄEÿ„ ! ÷ F`‡·`®�„àÄ 0‘°`H V÷ *R‡7áˆ�7aŽ�· †�÷5@&‚÷ez�÷et�wmj�Ëõd� ¦ µ÷5ü�÷5 ô�‚ö  2’²“òŠ2öe5’5‚� uÃeõefÿˆ †÷Xs&zê‰fæ!ÿˆ3 X‡Á !÷5 Œ�3 \fæ)ÿˆó%X ÷ ΀7 È€÷XæyóÿÿXÃåÁ é÷ °€±÷5J� ÷5 B�€–Èw ©‡w ê¨æ‚€æ|€æt€7 "÷U �   7 õ‹\w^ÅeÃe„ ô÷5 ²x÷5¬x ÷5 x ÂÕ÷`Õ(€¦æ÷5€÷0ç€æçæ÷0Õ€æÕæÂöÂå0Á �`& €Ü€ `Âe� ÷‡�·x·€·v·z·pB ·`¸÷~�¶÷®÷¢÷žÁœ÷ ^ýC†7 ¼xæ:7Š7f÷*Œx÷¦\7 r÷Ênx7 P÷ B¦†÷nx–x׉7 ÷4‰üÀü Âr�00Ap\‰V§3eaek›’ÁL�÷ R·& & & & fæü & & & Εæææ ÿˆ÷UÈ�·¾÷ · ¼w¬þÁewú~®÷E œ7 ô~‚€È œ� w`â~Àe õ÷ €& & & & æ æf�& & & Εæææ ÿˆ· ~· ~·ž~×-LÁDÁ –%üw ú¦‡%NFile ID %P,%P LBN %T.%NRecovered x�  7 øÿæ–�ÿˆ‡÷5 Ê~÷5€v÷5 ¼~wp÷5lvùÀô}Áö¿Â÷5 –~ ÷5Ž~Áe À ÷U ~~‡q¢ õ‡‚q, ðƒÂ î÷Ub~7 |ÿ7 zÿ÷Ðvvÿæ–�ÿˆ×-š}¶w÷ÀÈt÷ Ät÷‘Ât÷|}ºt×-v}‚wBÿ7 8ÿ7 6ÿ÷Œv2ÿæ–�ÿˆ÷ 6÷U~ ÀJ}Áö¿À Áe q¢ ‡‚q, ƒ‚ À ó wôþw †¥ÄTtÅB ÁHt€À ÷ @CÃm8tÿ :t÷-°þ²þ‡‚÷-¨þªþ ‡ÀÁt@`� æ�Á ûß… Å- tÚw >¥‡÷‹»u@pw̺‡÷jþ÷’dþ÷ dþ÷œ \þ‡÷ ¦÷¶Ìt÷؈u÷˜’u÷ý`|÷�¦‚Šu÷¢‚†u÷†u÷J|÷0ƒ· Xu÷þÿR|÷ ,£÷ Ju÷0|`u÷5ð|÷´Hu÷U@â|÷�D‚t÷@‚t÷�T‚t÷P‚üs÷}ðs÷}ìs÷¦ìs÷ePæs´òý ò�"‚ò‚÷ *ÂÐò�‚ò‚òer‹÷„s÷„s÷ 7 Öt7 js÷ fs7 ^s÷Ât÷þÿ^s÷€Zs÷et÷mÖ| t÷mÒ|t÷58|÷E0|‡÷5 äs÷5Þsÿ ¦�÷ ÷Ötºsÿ ˜�÷²sÊtÁ ÷‹ø{€÷5ð{wPw÷5 ¢s÷5œsÁÁ f".î‰w¨÷5@¾{Ãe.÷Fs÷5 ns÷5hs ÷ T¥†÷U–{÷ lù‡÷ Â.`÷‹€{�7 ä€7 â€7*s7&s7Š�r÷ ¸§÷5\{÷  Â\`÷E€J{ò $÷U€>{÷58{÷50{×-¸r†·,ör ‚¿¦r÷e r¿šr÷e”r   Ò Âe7’r·(z÷5êz ·„r·|r÷åvr7Š r¡7Œz÷‹Êz€w‚÷5¾z÷ ^÷5²zwPw ÷ Â÷‹ z€wX÷ <÷5�zw‚÷5„zw"÷5€xzG7r÷Elz÷‹hz€÷U`z÷5 Zz*÷5 Rz&÷U@Jzæ°æ®÷øq¦÷ôq¢÷U4z÷ ·”·Ž÷5"zÀ¶qÎwô÷Ez÷U z÷q0€÷q,€À’q÷ B­7`Œq7`„q÷5âyB÷UÞy÷ Æ÷5ÔyÀhqÎw¦÷EÀywá$· 7á÷ „÷ Œ æÖ] ßÀ8qÂ2q÷ŒÈpÊ�Äp÷5ˆyðE€ ÷ â ÷‹¯p ÷�q¢÷qž÷ ¸¬ðE€ ÷  ÷‹Xy€÷íðpðp÷íêpæp7Œ|pwn÷5‰ÈMXhÃå‚ ¦ÖP¡w Fhð†w @h÷e8h×-4hã÷ 7 (h÷$h¡Úƒ‚‡¦ÂÐò�†vò‚vòmhr‹÷ Ž· òg¦ÂÐ÷-ægðgƒ± ò�TvòPvòmÎgr‹÷ J‚‡÷ tÓ$÷ED¦p÷5 bh÷5\h÷Ôo÷ÐoÀ¼ ÷ °™†÷U@zp‡÷54h÷ ,�÷¬oâo÷¨oÞo÷5Zp ÷ERpó  ÷UFpó · ¦h‡À¦Â  ýÀ¦ð•ð•.ððððð ðF(00Ax\\l1DATADATADATADATADATADATADATAðH*ðJ,ð•ðæ÷ d÷ƒ÷5Òo÷U@Êow÷ôuÚf÷ðuÖfðÕ€ ÷U¦oÓ œÁ `ÁeÑÑÑÑÑÁeÂ ÄØ• ýœÁ `ÁeÑѕѕÌÓ ÷Èt÷Æt÷ ¾t· ºtð´tð°t0 ðæf÷ ú7�NfwLf7Bfw@f‚¦Îåæ8fæ0fæ.fö öå ‡’“Ò•ÿ’þeöeN ïöeÿ’“’�’–%–%JÀ¦÷ LƒÃå÷ À¦7ÚeÁ Á ý‡w `–&ÁÒeW ¦ ‡Á ÷ –÷¼e¼t÷¸e¸t ÷®e®t÷ªeªtÀ¦÷ À¡€Áœe÷5bn÷ øÂÑ ýw€eÀ¦÷ ¨¡w –‡÷58nwŠÿÁTeW ¦‡&À¦÷@eNt÷oDX÷ FÀý÷ ðœ÷ tü÷U‚i÷5€~i÷Uvi÷ÔnÀh×-În ÷ n÷Ân®h×-¼nN‰÷ºa¼h÷ |ê÷E0DiÄb4 ÄÀ7þaÿ ÀnÁ €‡ ÷No÷5i÷ üwüì÷(ÿ7&ÿ÷e0 ÿ÷5 ¼`÷5¶`=f&&Äð 00"(&& Ü� v`N 6, ¬ Ü � Áp`à a² Âeà ù–% Ó–%Ä ÀeÍ„€�wF÷5ph÷e0ˆþB Ä,a% Ý ‚ ƒàô�÷ èæ÷ ƒƒ Âàì€7awþþ÷ Jþ€wôþÐ wìþ¤( Ô Õ$(ƒ  ÷ Æéƒ à`` Âà°�à ÷ ²è÷ þÈ ‰‚ ¤`d ƒàô�ô�%÷ lÍ‚ ÔÐ ä‹‚$)7úÿ<`î‰÷eÌý û€» Ó$¨ ($) 4Š7`÷e`÷ Ðî‰÷ hú ÓÂ`A‹ ÒAá�ì‚Äe Ÿ� ‰’”�ƒàô`L ´�$)�&ô ÷ePýà û€%wfƒ Ãà ÷Jm7Jm7HmÀ0ý÷5 gÀÕ÷ Pšƒ $à ü7Š!mÀåÕŠÀ€ 7`mw m÷ªb_÷ ï‰÷ *š÷mðlàüÔ 7 B_7 @_€‡÷ âùw2_w bŽ÷.U*_Àš¤Á�)U‚÷ PšÁ�U÷ HšÀš¤÷ ¾w ü÷ ¶wšü7 ˜ü÷š¤î^÷.ýê^w .އƒà ÷ ÿä ¤`d $)‡Å Å ÃA÷ T��… à ø‡À � ‚�à±A À ù@�ŠÁÁ% A À ```€ Â�àþ�`€ � ‡w ¬�÷üÀÀ ÜW ÿe0,a�  ÒC`B ð W Ü „ R ÜC`B ð H Ü„ C÷¸ûwà´û Ü w!ªûAap�p�&ÂÔjÂí–ûÁ0 ÀeÁ ù õ÷ ¶j÷å ^÷å ^€ð•ÿð•ÿ Ü ÁíTûp� p�ðmHû p ðm>ûp · 6ûÀe ÷-.ûfj�‡w ÈŒ‡÷À¼]÷À¸]7 Lj7 êÿ‡÷Eÿd?÷5 Ôd·¢“÷Zz:“7 8“ö‰÷Uº�÷$„&„7 „�‰÷„„÷U¤�7 Ò“7 Г÷ üÀÀ¦7 Ž÷5@F…7V…7Ü…Á¨÷52…Á„ÂÃeÄeØST üðÂŒÈð¾ŒÊ÷5€B�÷娒· ¢’÷5ì„ð…$7$ü„÷5 Ø„ð�,…,÷5Ê„ð�Є-7œ-È„÷5¶„ð¸„.Àe<ÁØÂ P” ý‡÷5 Ž„÷�”„÷厄÷í …ˆ„×-ì›d‡÷ |„×-à›Ê‡÷ p„÷.’’÷*’’÷5P„7 ’7 ’ ÷5>„· ø‘7 00A€\‰V§3eaek›’ö‘÷5,„÷5$„÷8„Ü‘÷4„Ø‘×-ªŒßç÷U„À¦ÁÐÿÿÁ üÀÀ‘Á¾‘Â÷ Ⱦ � ®Œ÷ º¾w,ƒW ‡7Š‘‘w�‹‘Å4›÷ ,¾ÁmăÁe÷5ô‹ÁeÁmzŒÁmxŒwpŒÀnŒÁ Œ÷5 ŒƒÁ\ŒW ùcƒW óɃÀ À À M‰÷-„ƒxƒ†M‰×-zƒ†M‰×-pƒÜÿƒM‰÷5Lƒwà‘· ‘÷íЋþ�· ú�掂Îe2·åî�· è�÷•Ø�ÀÀ Ãò ó÷ Ò†÷z‘÷v‘÷ ‚_‡óEóeK‹íÀ ÷¤�¦�÷�p‹¡�÷Š��÷–�˜�÷�Ž�”�÷Š���÷ ˆ†óeK‹øÀ öÀ¦ðNƒ0 ðÝ`�ð\�ð¬‚& ð ×-\‹° , ÷5¸ŠÉ&Á÷ 轈€Áÿ÷ ܽˆ÷� �Â�÷�¾�·²�÷ Ƈ‡5‰f¦&fÁœ� � Ê"ŠÉœ× þÉn�× öÉÞŠâ’÷ L†‰Å Ä�Ê•÷ b‡÷ ÆŠÅ Ä�¶—÷ N‡ÅîÄ�Š�÷ @‡“’S’“÷ev�…„‚�‡f…¦EbN Î-v�‚‡Å-p�‚±¡– …‡ÄEÿ„ /f& N“¶ìŽ Žâ � N’× þÎÀ€× öÎ%ÿÿ6  N�W!þΞ€W!öΊ–%†–%U%Ä Ñ¡±‡ÀÁ¦ À ýÀÁ¦wr�ÑÿÿÀ ü÷�ÀŽj�÷¼Žf�ÀF€ ÷ l ÷eV�w P�À ÷À¤ŽÁ¢ŽÂ÷ ¬»Â � w�1–7 šÿW ~· �ÿ Á Á fÅ÷ €ÿõ¦U%E ÷ ÷ ¶€qA¦÷ `ÿð ¦Å ÷Ñ W  1 ¦÷ Fÿ÷ðå¦óÖ ÷ Ü Â ÷ d÷ $‰Â ÷ VÂî÷ NÀŽ÷ ÿ€ À À Àðî�¦Ð ðè�¦÷%ÿh7Š{•÷^z•÷¦jŽ÷�À�jŽ÷¼�fŽ÷ r ‡ �Üþÿ� ÷ "’$Á û‡�Â÷ ®ºÁ ‚  ±E  ý‡w ´¯÷¦Ž ƒÜ— þÃú~— öÃjˆƒ €Ò�Â÷ fºÄ¬ô�B�þÿÌ>�� L`d Á Á wDþ÷ Žÿ÷ Ü †n‰q1¦ qA¦÷ ,þÀ$þð ¦à ƒÅ ðÑ … Á%ë ÷ ° †o‰ôeL Ý÷ ž †o‰±w ¯‡J‡R‡Z‡b‡j‡r‡z‡‚‡Š‡t:#»zü xQ»z¬ k»zNÀNÀz*O:»zt:#»zt:#»z¬ k»z« H»z7 –ÿ÷ žÍU÷�TŒ�÷PŒ�wöŒÂœ~÷ h÷eðŒw ꌗ ƒÂå÷ jñ÷ÖŒ^ÿ÷ÒŒZÿ×-.‡ Áê†÷ ÞÁà†÷ Ö÷ ‡ÁÖ†÷ ÈÃ<~Ãm‡Ãm‡Ãe÷5d†ÃeÀÕ7|ŒÁwvŒ÷ rŒ÷üþpŒ÷øþlŒ Á ý×  ‡÷ ÎÃå÷eRŒw LŒó÷@ŒÃ ÷ °÷e8Œw 2ŒÃ ÷÷¨þ÷ xÃe   Ó^‹Ó\‹ ÀÝX‹ÁV‹Âf†÷ ´÷ P4Š ô�H‹ ôD‹ Ãe ÀÝ4‹Á2‹� @ º|æ•�“�S— ÿƒ3ŠýÿÎeÁe@ óŠýÿÂåî‚´•÷ HŦ÷ ôw’‹÷ 8÷ äõõõ�ÑŠµŠõô•ôºŠ ô¶Š wX‹÷ þ÷V‹ˆŠ÷R‹„Š÷ ž÷ êÃ÷ øÃ÷ ðŦ÷ †÷ �…w‹÷ Ä÷5î„÷4{”ý÷ �ý �Áˆý÷ &÷ T÷  ô÷ „ ÄJ‡� UUÕ ÕW ó‡÷5¤„Ä%Ї‡ÄЇÁeç÷� ЏŠ÷Š´Š÷ "‡÷ 6õ•õ•.ÀýÀ õý×- ý ‡5Æ÷5P„õöüu· êüõõõà ÷5ä{ õîî ×-Æü ÀЇ6‡D�Ä DaÄeÔÄeÀ ÁØT”À ýD�Ä Daôô•Ì õ- „ô‡õ-„´ ‡õ%õ-øƒõ%!÷ &„ôæƒôàƒ‡×-„ỗôƃ‡´ ×-öƒô´ƒô®ƒ÷5Pƒ÷ øû×-ðû ôèûôå ÷ ÞûôÖûôÐû‡æÃ-¦ƒ· ¼û‡÷ ŠþÃe & À®ûÁ¬ûªû �“�S— ‡ó•ÿýÿÎeÁe@ ´£ Âåì†Âå´•7nûwlû·jûw‚'Á Ãÿÿƒ W ÿƒÁåùD„ „ „ ÁEøÿ ±E Á ý€÷�ú‡¬ˆ÷ö‡¨ˆ÷`¤ˆw‹žˆÀ¦÷ ¶µtѦwÀµP‰æ˜ÿˆ‡÷‹†ˆ�‡÷~ˆÂz8‰‰Å¦wdˆ@Á Á ý‡@ ÁÿdÁ ýˆ÷ÒúFˆ÷ÎúBˆB ·`8ˆw 2ˆ÷ ¢ÿ‡DMöi› DMÒ/ DL(( DLP( DRD³/"" DR€av 22 (DR ¢7  DR®³/ DR`7  À¦Á Á ý÷ü¸Œ÷ü²ŽÀ¦ÐüÁþ Á ý„ŒÒ�”†ŠÊ�†7 ÿ7 l€7 j€×-’†DU÷ì ‡÷‡÷`ü†æ˜ÿˆ†÷�|rJy÷�Fy‰÷‹ø†€÷�ò†6y÷�2y5‰À”ŒÈ ð-F†Àe÷ð-$†ùð-†õ7Œþ÷5•CREATED™˜�DENSITY Ꙙ� DIRECTORYꙞ�€DISPLAYø™˜�@ERRORSâšž�EXCLUDEš’�EXTENDš’� HEADERS²™´�\•IMAGE š’�€INITIALIZE*šž�INVOLUME>š˜�€LENGTHJš’�@MAXIMUM âšž� NOPRESERVE Xšž�OUTVOLUMEbš´�ДPOSITION €š´�–”PROTECTION®š´�>•REVISED⚘�REWIND 4šž�TAPE_LABELÚš˜�€VERIFYÊš’� WINDOWSøžGROUPøžOWNERøžSYSTEMøž WORLD ’�BEGINNING’�BLOCK’�END’�MIDDLE ’�AUTOMATIC’�MANUAL’�OVERRIDEAFTERBEFORE¤�RESTORE¤�SAVERWED / .; 89.[,]@2 2  From: To: BRU>LBN(s)=æ5æ±ÿˆ‡÷56j÷U„x÷þÿ¤ÿ7 žÿ÷Pœÿ÷p˜ÿ÷ú}÷òþŽÿÀ=ÁL À ýÀpÁÿ À ýÁFÑ Ñ É ÀÁV À ý÷Î̦h÷ÎÌ¢h÷ ¬ý‡w ÊŸæ&ÿˆ‚ÁBxÀØ÷ š«À4xÀ Àm.xÁ àÀÚP”P”H’ÁxÀÝ÷ t«Áx÷ l«Á x÷ d«Áx÷ \«w „Ÿ÷ þÀpoÀEóù÷ tÀdo÷5^o÷ Vo÷5�€Po‰÷‹°þ ÷ $ý‡÷þÿ¤þ÷ ö÷‹šþR‰÷5 (o ÷‹‹þ ÷ o÷5�çowÔ6‰÷‹qþ ÷ îý‡÷ ¼÷‹aþS‰÷ Hm÷5èn÷U€Þn÷ 4m÷ m÷5�În÷5Èn´‰÷-ölm÷­ðlm;‰÷U¬n÷ ¤n:‰÷5aœn ´‰÷U’n÷5�Šn‰÷ ˜÷5@~n ÷5€rn‰÷5ln‰Á¶•÷5\n ÷5–vÁ®•Á¾•ÂŽÃRà ý÷5 4n ÷ fl ÷`l~l÷\lzl÷Un÷5nwP÷NÀˆl÷NÀ„l÷« €l÷H|l÷xl÷»ztl÷pl÷5 àm‰÷5Øm÷Uv÷U v÷5¾m7 Šn7 .l÷5´m÷Ýý l÷5¤m÷Ýýl÷5 ’m ÷ Äk÷¾kÜk÷ºkØk÷Š{‡W¢/ W¤ W¨ 7 0n‡� w(nÀè’÷ X†À Ø çi‰‰w‚ˆÀ�•÷ `·tˆÀz!÷ d †ÁtˆwîmÁmjˆY‰÷ <¦Â–IÀz!È•÷ æ ‚÷ ¨×½;ˆðÁ6ˆÁm0ˆ½÷5âl÷UÚl÷ àl÷5@Ðl÷U@Èl÷Êl÷E@ºl‡÷5°lwòØ XØ ÷ \÷ ¸7 l‡Ø ÷ òÐ ÅeŸwd÷5„lwÀØ XØ ÷ * @   j÷Ušt÷ERl‡@‰÷ZzæHÿˆXØ ÷ ô7>l‡Ø ÷ è÷ D70l‡Ø ÷ Ø7&l‡÷5€lXØ ÅxwúØ ÅFwðØ ÷ ®7l‡Ø ÷ ¢7úk‡‰Ø Å„wÌ÷5Îk Ø Ø È 3÷ ÅPw‰÷ÿÿÎkØ � À–”÷ 6Ø  à ý·@°kW¢,ðwäØ Ð ÷ âÅe’wVØ ÅVwdØ ÷ "÷ ~7¸k‡÷5XkºX×½“†wÁކCw”yw”y÷ .fÎàÖ-v†h÷øk7þxæ ÿˆ`‡÷îxôxæÿˆÀ •÷ rú�€ ×=æx ×=Þx×=ÖxSÈ‹GÈŠ· öh×-òhA÷‹>ú€÷‹9úA�À6ú÷e0ú#×=¤x:È‹.�ˆŠ· (i÷5®j×-id‰×-i×­úù×­óùÀðù÷eêùÐPxÐ�NxÈ�Fx· Bx×-@xMF÷U r ‰‰7 $kd‰7 ke‰7 ka‰‰×½ƒ…F×-Nhñ· Fh÷ešùÅ–ùW!ÿƒMòÿuôÿ×½U…0ÁX…� W¤* À�•÷ &f÷ ,M�Íÿÿ� W¤* À�•÷ ÷ uõÿÿ Àª•Ð00Ћ`˜Â ý€Àª•÷ l‡×½í„>Áô„W¢*À“•÷ À D%ÀÚ„ ÷ >Tû†à‹õÿÿ� W¢.� W¢* @÷ †à‹u õÿÿ � W¢; � W¢*� ÷ Þ5 B‰‡À*ÁÀÆ•Á ÀÍ•ÁÀÒ•Á ÷ ‚Á¤ B`¡‡¡ þ†‰‡À  €†‡B‰· >ø÷�8ø÷�jg ÷5Àh÷pZg÷pø7 "g‡Y‰æ6æ8æ:æ<>2T‡‰÷ ÄW¢(� ¦öÒ�÷ r‡‡W¤)‡À ‰h‰Y‰æ i÷ ·i‡÷ †wi B”Âå0— †À 1‡À .‡À ,‡À`*‡€`(‡îW¨.w Þh � wÔh B”Âå0—  †À ‡À ‡À ‡€`‡ñW¨8 W¢9W¢- w žh � W¢0W¢9� øB‰‡w‚hÀ W¢#� À B”Âå0‡€ †Í e ffÍ e õ U  –%�ee •e�`u þÿåW¨.�  ‡å ‡÷5’o÷ ÿ÷ :ÿ‡÷ € ƕċ•S¢Ó� Ô‹Ë‹ù‡÷ bÀØf” ý…W¢(� & W¬:HW¬:D÷ È&W¤-mÀæÂ H¢p¬p¬Àe òÁeXU”U”U”¦W¤-Q÷ Vþ EL dI÷•ÛõÀåD0·ŠÍõÀy•€eˆ¥:UœþÿUœÿÿW¢ Î � Åe÷ < (æ(g÷ ˜· g÷ & <W¢:� ÷  <Î Ö W¤) Y‰÷ ÎýÕ•0 uœþÿÿÿUœÿÿ‡?‰÷ JfÀ�•÷ (ÁW!FÁ� �U” ý‡B‰Á¨f�`I‰& ¤È‹ü€� ‚ ø–‡W¤:w‚f‡á‹F‰ ” $7ðÿwîÿÀ¤ Á 椠ÿˆ7Àÿw¾ÿ挠ÿˆ×­®söÿ!÷‹§s¢s�àƒ`€`¬ÿÿ-À � à á&¨a¢zÈÅ Ã ö€È• ‡<‰æ3ÿˆ /:,+-) 7 îÿf÷ �†ÀÿÿwfÂÀÃe�÷ x‡S¤  ù÷ j†÷ ºÿ  Á´ÿ– ‡ƒ`ÃEË ã÷ žÿòÀÿÿ÷ ’ÿ · Œÿƒ`ƒ ÃEÂäÃew¤ÿ ÎW¢0ÝW¢ZÚW¢9W¢AÔ� ò&À6¡È‹P¢üwFÿ±€‡w ª„ææ00A�\‰V§3eaek›’(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ ˆ©E�€Aa×$Ò±œÿÿ‡f¦æ&f ÅÂ…`Á Á ý°* �ƒ”… ‚×  ×  Ä õ× ñƒ× ÿî× "D × a‡× z‚Ä ÃE Ñ�ÝEp(p°à„ƒ”… ‚× $ú× 0‡× 9ôƒ× A‡× Zîƒ× _ë× :� � ‚„ƒ”… V‚× [È•]× <È•>È‹8 ƒ”… ~‚× %ú× *÷× -‡× .ñƒ× 0‡× 9ëƒ× A‡× ZåƒÈ ‚ ƒ”… y‚× 0‡× 7÷ƒ× *ô× ,A ïjÈ hÁ fŠ„ ƒ”… o‚× "A øÁ ö „ #A ƒ”… a‚× $‡× %÷ƒ× *ô× 0‡× 9îƒ× A‡× Zèƒ× _å× .� £ß ƒ”× .× ; ƒ”… d‚× 0‡× 9‚� õ]× -Á X� í× *Á QA æ × ,Á D× = Á >È5 B>ÈU °(w^þ× /*Á .�Á ƒ”… ,‚× $× -‡× .ƒ× 0‡× 9ƒ× A‡× Z ƒ× _ × :Áÿÿ   DÚ× " Á ƒ”… ´ƒ¡á°0±…„ƒ‚�‡f¦æ&fæ ÈE¢¢^Á`Å÷ ðÄ ÈUQÅÿÿ÷ ÜÄ ÈUQ ÷ ÊÎË€ÈUIá ÈUÄ `¢Äe á  !ddC ÷   D”¡%¡*¡.C ÈU Å ï0 0 ��W ,ÈUw6W /@ ÷ :ÎÄ ^BDaW£-Ί… W¥NW¥OD!†BΊzÉ …CÃE€€C¥ÃC¥D!‚Ñ ó�ñ‹þÿ€D! ΋ñ5 Ñ þÁe߃“ƒ Î�à TÂåÔpRpR΋pBCÃ5NŠƒ à KR΋KBAÁE•—­:‘Dœ0CŠÄŠý ÷ fÎÄ ÁeëB”—   ¡ƒŠDÒ� CS•ÄŠÞü ƒÐ÷ ¤ ‡W¤†BÅ E Br ÉΕŠ …„ƒ‚�‡f¦¦)& 6 l(¢*¶„„í�”ƒ ƒÅ EÅ 'W "Å =N îÎ ìW :+W =Å 1 Â#W ,W /Å %W %W *ÒöÕ€ÎÄ W <ÉW [ÅW >W ]¿„ v�¢°(°* 6 ƒ…Æe‚�‡w Z¤Á w P¤Á& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡‚¾ëÀÁðN"'€ÒX‚XÒX‚Xðj?<ñ€pÜkÀÿÿŒÿÀÁ¾ë¬ ÀÁ÷R7 f7ŠI7ŠJ7ŠG7ŠD7Š<7Š97Š9À|à à ý÷Z\÷VX÷•ŒæÀ& & æAÿˆ!‡ÀÊþæÀæ?ÿˆ‡Àm®¾ÀåÀÀEÿ7ÞÀ 7ÔÀ˜¾À%À%À%·Š¿÷ rfæÀææÿˆ†Àwž7 ¾÷‹¡Ã÷ ’÷%DY”ÃP÷ ‚æˆææÿˆÃˆó5Àô Ý÷œv7Šs÷nÅÀÃ÷®÷ @÷%DFfæP7  7 š·c˜w ’÷ ‡·c6w 0ôÖ ÃèË Ó-2ÃeøË-úó-öÓ$ÀÆÐÐÐÐÐÐÐw ö÷‹ð ÷‹ÌÀ·Š¾w¸÷í*Ô· Î÷‹°÷  ó‡À Áþ Á ý7ŠÖ7 –÷ n7 ö7 ô÷Ô–÷tâ÷ `÷ ‡÷ ¢†÷ ò÷mVÌw ÆñæJ÷¶÷ 4÷ ä ‡÷ v ‡÷e¦w  Î ñÖ ‡÷‹'À¬ÁÊ ÷ òЕ.ŠÀ•÷ ÷ r÷ n· · úÛÁÄæX‰æT± 7 ÷ bÄ·>·8ÆfÃ÷‹Â ÷‹µ ÷‹Ñ÷%DBÖÃE÷  ‡æ  Õ-ÎÕ-ÊÎ ø¡±– …‡ Ãݶƒ Ä ÁÖÂÔ Ýí� Aá ÝB †Äeà 뱇Àÿ CdÀ ý‡¢'ÿ BAD>ÑÌP(mëÛ¶ü¦�ö j n DMöiB DMÒB DRD³""ü DR€a 22@ (DR`    DR ¢  ` DR®³² DL((( DLP(( ????÷Þšü÷ (ú 4 ÷‹’ü÷‹nü÷ œ!†Áœ÷ û00A˜\\l1DATADATADATADATADATADATADATAÉÀ÷åÀþ· ºþ÷ Îú‡À ö Åœ7Š<ü÷ Ô†÷ ΆÀÈwÀ§Á"ü÷ü ÷ bЕ.ŠÀ•wÀ¸ðp &ÿˆ†÷´ööû ÷‹ðû€÷¥›èû7ŠãûÀÈ 7"Úû$È ú±‡ cÀx7 ºûÁ�¶û ÷ ö Е.ŠÀcwŽúÿ±ðÿçðçý‹ô~øüÈÅ<쪬cæÆýÎ Î ÀÀýþýƒe@ À-`û‚‡Ã-Zû‚PûÃ÷‹4û ÷‹'û ÷‹Cû÷%DBHûÃEŠÅÀævý¡  Õ>ûÕ<ûÎ úÅÀÖ ‡÷‹êú&¦ÀÀÁØ P”þà‹Ð�ÞúÐ�ÛúÁØú ÷ ( Е:Е ‚�P”þÀÀÁ ÷•"ýÅÐõ5 5 uЋµ ûfÿˆ†÷%ÿÿHõù7Štú‡ÅÐõõÀ õ•õPfÿˆ ‡÷¥ö`ú÷‹Zú÷‹Uú¡‡À·ÀзŠ*ú±‡À,0 b÷ f†œ`Á¥öÿ!Á¥ýÿ÷ ú· úëÀ·÷ Dÿ÷ðùw$Àà ÷ 2ÿÝÁùCÙÁmù ŠÀ ù‡w&÷ $†wÄÂÃÀÔÔÔÔÅ N!W@ BÝ C݃ Åe·2¸70¸ÁÀ B · ðü‡Âíêü€ Á ö7¸€ÁØü÷ Ž7� ¸ÀÊü7vù÷ fw�ú·fÅÀW! †W#ÿÿ ÍEðÕ-Þ·Í-Ú· Õ ð!Ä9†ÔÈ·ÔÆ·…÷ 4ù·Šº·ß®·À¬·ÀeB à µ§!ĆÔÿÿú÷ùVû÷ùRû÷mRüLûw FûÅÂÃÁBü� ÷ Æü ‡÷e.ûw (ûÁ öÖ ‡Ö ÀKÀÈV ‡÷¸ø û÷´øûÅÀÁü� ÷ ,‡÷ &³÷ "³Á ³ � À"ÀûÀQ±‡Ã÷¼ú÷ Nü†÷e¶úw‹°úÁ ö±‡÷mªû¤úw‹žúÅÂÁžû� ÷ Æÿ&‡ÅÀÂÂÃR%à ü ÅÀÂÂRRRRÊÿÿÍ%ÿÿ÷ úÅÂÍ%ÿÿ÷ úÄø‡ÀdwÆAÁEðÀ,û÷ Ð@�@`Á$û÷ ÂC“Âûƒà‡Áe@ ú7>¶w<¶ÁÄ f÷  …Õ ‡BAD -- BAD -- Syntax errorIllegal deviceNot in systemFailed to attachBlock 0 bad - Do not use as system diskBad Block File overflowUnrecoverable error - Write lockedNot readyTotal bad blocks= 000000000Handler/Driver missingFailed to write Bad Block FilePrivilege violationManufacturer's Bad Sector File corruptis an alignment cartridgeFatal hardware errorFailed to read Manufacturer's Bad Sector FileBAD -- Invalid switchBad block found - LBN= 0000000000BAD -- Command I/O errorBAD -- Command too longBAD>LBN(S)= BAD -- Invalid block number - 00000000000BAD -- Duplicate block number - 00000000000Bad Block File not foundFailed to read Software Bad Sector File Volume label incorrectHome block not foundFailed to read BADBLK.SYS headerBAD -- Block already allocated LBN= 00000000000LBNS allocated to BADBLK.SYS= LBNS in bad block file= Allocation failure÷þó÷ ô &À"÷ þø€×-èó÷Þó÷ êøÀ¸ð&ÿˆwvïÀÄówô÷�þÄó‡÷�ö½ó7 ºó‡÷î²ó‡‡·Š¡ó‡·Ššó‡·Š™ó·Š“ó·ŠŽó‡÷ Â÷% º†ÀŽwnÿÁ®Â|R”÷ ¢ü‡·Šbó‡÷œ’ó‡÷”Œó‡÷ ù‡ ÂÔÅî÷ v‡÷ ŠÿÁ6ó‡Àà ·Šówÿ7Jó÷‹ó0÷‹ó@÷‹ ó-÷‹"ó ÷‹þòÅÀÍ%ÿÿ÷ "ûú÷ š…‡÷ l†È‹÷÷ ¶öÁÂ?÷ Dí ÃÝóéÄ ÷ JäÄàò‡÷ ÈÎõæõ7Îò÷ ®ÿ·õ·õwö7 øô÷ôô÷èôÅÂÃ÷ rö‡õ A÷ &ñÉ ÷EÿÊô÷eÄôw ¾ô÷-fò¸ô‡÷-`ò²ô‡âÀ¥ÀŽw*þÀ 0¬|ÂöÀ ú€÷ :Άôæ„ô7@ò÷ ¾D‡„w &æƒ ÷BôwBôw>ôÃÅÆÕœÕ&ôÕ$ô Å´Íe÷ Ìõƒ€÷.ô†÷%¬ÈñÁÛÂÿ÷ (ÍÀ�ý÷ îöÈ÷ (‡ÁÂ?÷ ¾È‹¼÷ d»Å²ÍMÃÅÆÕ¬  Ų÷ ^õ†Àº–%wLý ÄÝñ­Ä ô‹ÂÀ ÷ ˆö ÝÂÄe Â÷ À ÄÝË­Ä 7Âtó7ÂnóÎÀ*÷ Xö ÃÝHñÄ ÷ �wèþÄ$ñ÷Xó·Zó·Tówdô÷øðJó÷ôðFó÷‹ðð÷‹Ìð÷ Œø:÷f¯ÅÀÃ÷ ²ô †÷åó·‹ó÷ J¯ñÀKw’üÁÀ÷ RïÉ î÷-Èð*«êÁÀÄžT”T¤ ÃÝ´ð ƒ T” BÒ‚ ·`hðT”Tà ö÷eÄòw‹¾ò‡ÀèÁ$÷•¸ò÷ ’õ÷ ÂõD‡÷¥öBðCÃ>ðE3ŠÀÀÀ7JðÁÄÃ÷ .‡Â¥: ÁÄ÷ ø&‡Ñ É W"ÿ‚CÁÄà ñ‹fNlÖ fDÄ`N ·%ä7!Þï‡ÁõÂ÷ 0²Àà ÷ öô­²¡‡¯‡÷%ªïÀŒ ÷ âôñ±¢‡Ã®ïÒ”À ý Š&@÷ ¼ô€‡ƒ ÀÀЕ Е ÁÄ1Šÿÿ á A 2÷ ¾ ÷ Е: Ý�  ÷ ¢ŠÀÀÁ ÷•Œñ÷ fô%à Ї  Å ”Âå0‡… †„É a ffÉ a ñ Q Å% –%‰ea ‘e‰`q þÿä˜Ä Â¥#ÅЋÚá Â¥.Ћ’ȋȥ È¥ È¥:È¥,±‡Ð‹È¥ üÈ¥ ù¡‡ææwÚðwØð÷ êìQ†÷eÌðw ÆðÎ öÖ Ž ÷ð¬¸ð÷쬴ð÷å®ð·‹¨ð÷ ¼ì-†�� w`œðw‹–ð÷ ªì‡ Ý�cW ÿ ‚ô¶¬ô�®¬t�Ä.îÔ�ž¬Œ“ÔŠÔ˜¬Ä%˜ 4 ÷e"î7 î  Ý�cW ÿå‚t�·eÊí±‡–%¡‡ÀKw¬ùæ æ * æ + æ2æ3ÁEÿæ ÎE‚w Æ…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ zW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡w hÄ'Å  ÅUD$†BA÷ z&�Â(÷ ÅU� ÀBQ÷ \ÿÂЕ* ü‡&æÿˆæ3ÿˆ7 &f¦wì÷‹è÷ Æ7 à7ÞÀâÈ @•,€ÀåÀÿq `-KacJE[à !Ãm¢Äíž@•Á00A \‰V§3eaek›’ †Õ Á ûα)÷ L÷ R†é  çà å÷j7•jà f@• †Õ †&Ý €…Ò€Ö À5]U ¦†E¤¯‚…€Á(‡ :Á‚æ&@E÷ ÿA ·Îà· ̆ª ÷ Š÷ Р¢ÂÀEÿ÷ vœÀEÀÿÀ €cÁÐÂΤ‘Á ü¢ÿ­÷‹¹‰÷­´±¦†„÷ @�Á à £.„ à · ’æ&fŊĄÞÁ ÷ Ø÷ Ü…„ƒ¶à ÷ 8 †À ÷ "†À £.£$· B„ à ë÷ 8‡Ì¥Z‡£A‡Ì¥9‡£0 ‡ à £ £ ‚ „ à ö‡w î5 funhõ‹j÷ t‡uhdB$÷ 8†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ .œ*AdBbAÁepÂ& ¦fƒÂÁ ÷ – –‡ÁPõµ aA”Aíf@pnp÷ DC*8Ö‹Á ÷  88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ Ð õÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ vµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw õ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ ª5fµ fˇðµ ÇÈ•÷ 6‡ðµ¾ðµº÷ Ò‚ÂeõSY�÷ ø ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ ’ DlõålõŠjõµ€a!CÃeH###33™@ð•#÷ ¾ ‡&™÷ ½•8 †õ¥öÿ*ÎjÎ>‡w Ìõ 8µŠjDl@÷ T”ÔÀeBTŸ8œ5l@÷ ò ‡@Á(ñ D÷ 8ÁeB&÷ ü ‡ð•#÷ * ‡An5ŠjÉ)fÿˆ‡Ñ Â&÷ 2‡ /    ô÷  ‡  ú  ÷R¨õÕ€a¡‡Âå@”‡LIÿOVRÿMANÿUPDÿRETRYÿLISTÿOVERRIDEÿMANUALÿUPDATEÿPATÿPATTERNÿALOÿALLOCATEÿŠ�‘•™Ÿ¤­´»¿ÇËÒ‚šÒ‚¢Â®þÀ€:‚¶Ê/€€<�B‚HƒN„d…<†B‡HˆN‰jŠj‹TŒ„TÀ†¸À†¾À†ÌÀ†ÈÀ‚Ä:€ÄÒÀ„À†ú=€Â‚:€Â†f¦æ&f ÅÂ…`Á Á ý°* �ƒ”… ‚×  ×  Ä õ× ñƒ× ÿî× "D × a‡× z‚Ä ÃE Ñ�ÝEp(p°à„ƒ”… ‚× $ú× 0‡× 9ôƒ× A‡× Zîƒ× _ë× :� � ‚„ƒ”… V‚× [È•]× <È•>È‹8 ƒ”… ~‚× %ú× *÷× -‡× .ñƒ× 0‡× 9ëƒ× A‡× ZåƒÈ ‚ ƒ”… y‚× 0‡× 7÷ƒ× *ô× ,A ïjÈ hÁ fŠ„ ƒ”… o‚× "A øÁ ö „ #A ƒ”… a‚× $‡× %÷ƒ× *ô× 0‡× 9îƒ× A‡× Zèƒ× _å× .� £ß ƒ”× .× ; ƒ”… d‚× 0‡× 9‚� õ]× -Á X� í× *Á QA æ × ,Á D× = Á >È5 B>ÈU °(w^þ× /*Á .�Á ƒ”… ,‚× $× -‡× .ƒ× 0‡× 9ƒ× A‡× Z ƒ× _ × :Áÿÿ   DÚ× " Á ƒ”… ´ƒ¡á°0±…„ƒ‚�‡f¦æ&fæ ÈE¢¢^Á`Å÷ ðÄ ÈUQÅÿÿ÷ ÜÄ ÈUQ ÷ ÊÎË€ÈUIá ÈUÄ `¢Äe á  !ddC ÷   D”¡%¡*¡.C ÈU Å ï0 0 ��W ,ÈUw6W /@ ÷ :ÎÄ ^BDaW£-Ί… W¥NW¥OD!†BΊzÉ …CÃE€€C¥ÃC¥D!‚Ñ ó�ñ‹þÿ€D! ΋ñ5 Ñ þÁe߃“ƒ Î�à TÂåÔpRpR΋pBCÃ5NŠƒ à KR΋KBAÁE•—­:‘Dœ0CŠÄŠý ÷ fÎÄ ÁeëB”—   ¡ƒŠDÒ� CS•ÄŠÞü ƒÐ÷ Š  ‡W¤†BÅ E Br ÉΕŠ …„ƒ‚�‡f¦¦)& 6 l(¢*¶„„í�”ƒ ƒÅ EÅ 'W "Å =N îÎ ìW :+W =Å 1 Â#W ,W /Å %W %W *ÒöÕ€ÎÄ W <ÉW [ÅW >W ]¿„ v�¢°(°* 6 ƒ…Æe‚�‡%!'ÿÿÿÿn'&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&æf…Þ ƒ„…‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡w šð*æ8Iðµ÷ <œ*=‡ðµ€)98÷ € ÕeBÕ && ð Îå¶ �ÕU€�Ä÷ ¦‰�†ð¥öÿ*ð¥åÿ*Æe ð*Nlv °°΋œ*ðµ.)÷  „& ðµ#ðµ!ðµ)&ÎePæÂ(ÂeÊ ¦æ&æ•&Ä÷ †�•p�*÷ ®w00A¨\\l1DATADATADATADATADATADATADATAÄÁeBÉ ð 8÷ T ‡$&w pð*÷ F‡÷ ¦‡÷ º‡w Tð*D÷ ` Õ ýw¨w 6Á(ñ D÷ êð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)ÁeB÷ \ ‡÷ ‚ñ :ðµ#÷ & 3†&œ*w®÷ ª ù‡ðµ#(ð PðÕ)÷ ò †ðµ@#ð¥Çÿ*ð*fff÷ > ±±‰‡÷ ¼ †&œ*wLðµ.÷ P3‡ð5ð(8ðe$8wä2€æ•Öÿ2&À(Áe÷ ° €†æ•Ùÿ%p8Éq ðµðµ#)÷ Ž †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ °00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ < ‡0 @0 ð‡&œ*0 @÷ úuÄ÷ Dðµ# ÁeB&B÷ p°B÷ T÷ ʰ•*±‡÷ À ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Ä…&0 ðµ#Õü Õ÷  ÷ ˜0@°Æe° 6ðµ@#040 6w0ðµ!p2‡w è÷  ‡ðµ)ðµ÷ ®8C÷ Úð¥öÿ* ðÕ)ð ð*wÐð•öÿ*ú÷ X ÷‡ðep p ‡÷ êê‡ð¥Cƒ óà ðµ=ðµ÷ ü ð¥ð 0ßð•Øÿ*Èð¥ ðµ= ÄEÕ¥^Ä ûAÇð¥ æÂe@ÃÎà÷ ‚ƒ߇÷ � ÁEp×ðµ÷ ˆðp°æÄ ƒðÎà÷ 8ƒ ƒ÷ Vá÷ ù†ð•Øÿ*Á`‡ðµ)wÖæ÷ ^ƒ‡æCàƒ#ƒÎà÷ ¾Î ¦÷ Èÿ‚ð†– ‡DàÄ ‡w BÁ(B‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±Dñÿÿ(1 >‡&æ¦ff… Þ �‚ƒ„…‡w àÿð*ðµðÅ)÷ H†ð¥öÿ*÷ ôwä46l0ì‡w šÿÁ w �ÿÁ& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡ðµ82Áe&À(÷ n€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡0Š+æ1ÿˆÅ(Åe à ÷ \ß%ÿÿ&ïp’*w ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ |¡ðµ)ðÕ .÷ ðÅ .‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡ð‹*±‡w Àýð*ðµðµðµ# ò  ñU@¦Âe÷ l‚‡÷  †æÎe`w¶ññ1 ‡Ã ÄÄ%ñ,ñ, ñññ× ±‡w &ýð*DÅ Å ýæ¦!…‚ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ ö ‡à ññ÷ Œð•Éÿ*‚ƒ‡w ¦üð*æ ƒ ‚æ¦)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷ t‡aÄ%wñUXñ5@ƒ âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ ñ5@XñU@ñ5€áÄ„íÄ ñUþ¥*ñUÄ Å‚öƒàÎàà Ê¥*Ã%C!.D`÷ F*‡ƒ‚wúþÆeCÃ5€ñU‚Ã5 ±±± Ã5€± Ã5@±‡Æeð•Êÿ*±‡w ,ûBC œ"¦æ&æÿˆ‡÷ <†ÂÃSYïð&*‡°�p0p2ñ1ÂEÏÿÂ%0ð•ðÿ*wýÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡141612Áepðµl2l0p‡÷ xüMÄwÄûÄ Ä Ä ðµ f÷ Püu ÷ žû�‡ñ ± ‡ðµðe6p 4÷ ö†8÷ jÿ±‡÷ |÷ :÷ V‡‡÷ õ†‡÷ �ÿ ‡f÷ tÿ�†&œ*÷ vÿ°•*±‡ðµ.ðµ 𥒤𥒤°0ð¥0l°  ƒ0 ðµð•Øÿ*±¡‡w fòÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w "ò  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡ðµ0f�Â(& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ÷ šúU• Â…à  ÂE•ÕfÄ÷ Èùp†�ñ ± wrú÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡ð 8 ðµðµ ð*‡ðÖ*±‡ðÃ*±‡ƒ  �D„PÄ5Rà ý†R”‡R”R”à üø° 6 p 4 ì0Á`p÷ ÿ‡æf¦÷ ù°6°4‡÷ `ÿƒ46÷ ô ‡÷ $ý°eð‹*wèþÖ ±‡÷ žðµ)ðµ÷ š!‡f¦æ÷ F†ƒ‚„÷  ‡çÆeðÅ)ðµ . ðe6p 4÷ 2ü0ž8*wîøÄ(ð•Ùÿ*±G¦æÄe(Ì  ññ1 5&Âe´ ÷ Ò„Œ íƒ1-1- 111þ ‡rrrrrƒ‚– ‡æ¦& ƒ÷ Þƒ‡BÂeÄ÷ XÃÂà„ä ÷ ¢1 wð•Ìÿ*‚ƒ±‡ Ëw Îõ&Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë å¥.‹ Ä Åæ00A°\‰V§3eaek›’U¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë ‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±û&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡TaÞ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡±‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ ÄöU•Õ4 6wö÷ öBfÁep�`p�w¬ö8Áe2 ‡0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w ,ô Á�   ìì� .Â% ÷ ö ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ <õ ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡f&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡w .ó�‚Á Ò¥[Ä,÷ &‡æÄ]÷ …‡Á Å5ÿ ó‹s‘‡…¡Á ü±‡Á „DáÄ wüüæ¦1 ññz ññ÷ hø†ñ÷ 1 1 1 1 1 1 ‚ƒ‡DEÄeÅe $ $ ‡Ê«t HèÊ«IH0Ê«Ž,HÂÊ«µWH8Ê«äyH‚Ê«ô‘H Ì«ÃHšÌ«pEHŽÌ«ŒdHºÌ«+gH¾Ï«xdH–Ï«ÐfH–Ï«ëyH$Ñ«,xH`zÑ«BxHìÑ«ýxHÑ««„Hnå«àSHé«­FHë«ZHdë«øfHë«z}Hˆ뫽’HÎò«½Hò«„:Hlò«ÒhHò«àHøó«FHºó« GH6zó«¡GH6ó«¤GH2ô«xZHô«ÝfHô«\}HHô«€»H`X¬sH¬xQH& ¬sH’l¬ÊH®l¬UH®ƒ¬ç_H¼ƒ¬è_H¼„¯€»HªX‡¯€»H–Xz¢¯€»HêQ¢¯ÀÁH&R«¯€»H€R«¯ÀÁH¼R¬¯€»HS¬¯ÀÁHRS­¯€»H¬S­¯ÀÁHèS°¯€»HBT°¯ÀÁH~T²¯€»HØT²¯ÀÁHU³¯À�H$µ¯€»HnUµ¯ÀÁHàUzâ°€»H¾X±€»HàV±€»HDW±€»HÄW±€»HxV²€»HÒX)²€»H‚X4²€»H0X×ÈHÀŒýfHŒ9€HŒL…H€S}žHd@yH mxxH znHHpHrŽ{Hr˜{Hÿÿr¶{Höÿr¼{Hðÿr½{Hïÿr¾{Hîÿr¿{HíÿrÀ{Hþÿrà{Hr8|Hûÿr`|Húÿrˆ|Hùÿr°|HøÿzrÎ|H°ÿrÏ|H¯ÿrÑ|H­ÿrÒ|H¬ÿrÓ|H«ÿrÔ|HªÿrÕ|H©ÿr×|H§ÿrö|H¦ÿr÷|H¥ÿrø|H¤ÿrù|H£ÿrú|H¢ÿrû|H¡ÿrü|H ÿzrý|HŸÿrþ|Hžÿrÿ|H�ÿuHuHuüXHvöHvy:HvaHvžgH&ŽH &zH@&&H&ë�H€d&ôH zd& H d&æHd&õHd&#H€d&#Hd&#Hd&4&Hd&NHd&˜THd&UH@d&gYH€d&¶^Hd&ÌeH@d&áeHd&#›Hzä)NqHä)½rH æ)#H"æ)ÕZHæ)faHæ)ßfH æ)™wHæ)vyHæ)Þ‰H$è)âHì)°Hì)è.H,ì){:Hì) FH(î)ËHzî)ƒKHî)ë�Hó)H ó)Ue� ™Hg�°,H>h�îH>i�8^Hl�°H!l�pH$zl�è.H>l�8YHm�™H(n�HHn�ýHo�H>o�p&H6p�H&p�èqHr�<H r�ŒHBr�|qH:s�L H,s� qH9s�<}Hzs�‚Hs�(‚Ht�Ht�˜:H/t�ÒGH0u�H�ƒÐfH€ðÔƒt HÔƒ4FHÔƒ LHÔƒZH@ÔƒžgHóƒ. H°ÿóƒîH�ÿ»„. H ÿz»„2 H¨ÿ»„3 Hªÿ»„4 H¬ÿ»„5 H®ÿ»„îH€ÿ»„òHˆÿ»„óHŠÿ»„ôHŒÿ»„õHŽÿT†‘H€T†*KHT†„SH@T†¼^HT†L…H¡‡H2z¡‡@H¡‡ H6¡‡g'H4¡‡ €H¢‡0„H£‡hLHúÿ00A¸\\l1DATADATADATADATADATADATADATA£‡ ZH£‡ñ`H£‡z}H£‡à~H£‡ø€H*£‡˜”H£‡À”H £‡è”H £‡•Hz¤‡H¦‡eH"¦‡ÕZH ¬‡«„Hüÿ­‡À…Húÿ¯‡ð‘Hþÿ²‡àH²‡ H³‡H³‡xdH³‡øH³‡‚H´‡H"´‡@H#´‡k'H z´‡a(H´‡ ì�ËsH/ð�ÊGHó� H!ó�bH$ó�’H"zó�ÖKHó�øH2ô� qHô�ÅžHö�Hö�faH(ö�ßfH*÷�R;H D‘ëHD‘ #H@D‘#HD‘ƒKHD‘4fH D‘6qHD‘C�H€zD‘¦’H!”àH"”ËLH#”à~H&”H)”8^H,” FH -”ÀH2”æH3”ÖKHüÿ4”H5”H6”°H7”p:H 7”R;Hzdš(xHfš›`H iš�yHjš�yHlšp!Hlš8YHpšXzHrš !HtšHvš¸HvšxdH©®xH¾©©Hÿÿì©”’Hÿÿýª©H:T«”’HÿÿÌ«©Hÿÿ¬¢sH6ªl;HYO« _HÜXÑ«O H,ZÑ«hH,\é�’Hé�!)H CLAEND ;END PACKET HANDLER( .WORD CLAERR ;PORT/CLASS ERROR HANDLER) .WORD CLACMD ;(T)MSCP COMMAND INITIATORE .WORD SCUCB ;SCAN UCB LIST .WORD -1 ;TERMINATOR FBITS = 0N$ .IIF DF,E$$LOG FBITS = FBITS!JM.ERL$ .IIF DF,DU$CHK FBITS = FBITS!JM.CHK$ .IIF DF,M$$EXT FBITS = FBITS!JM.EXT$ .IIF DF,K$$DAS FBITS = FBITS!JM.DAS# .IIF DF,DEBUG FBITS = FBITS!JM.DBG=$ .IIF DF,TERMNL FBITS = FBITS!JM.TER;= ; LOCAL DATA;R/IOPSEQ:.WORD 0 ;COMMAND PACKET SEQUENCE NUMBERC8LSTPKT:.WORD 0 ;ADDRESS OF LAST ABORTABLE IOP IN C.OLHD*RADNAM:.WORD 0 ;PORT COMMON NAME IN RAD50' .RAD50 /OM/ ;END OF PORT COMMON NAMEO.COMPCB:.WORD 0 ;STORAGE FOR PORT PCB ADDRESS/SAVSTK:.WORD 0 ;SAVE STACK ADDRESS IN DELAYEDT% ;CONTROLLER TRANSITION TO ON-LINE! .IF NDF R$$MPL ;RSX-11M ONLY! .IF DF D$$DSK ;IF DISK CLASS 1DUDCB: .WORD 0 ;POINTER TO DU:'S FIRST DCB4DUDCB2: .WORD 0 ;POINTER TO DU:'S CURRENT DCB .ENDC ;D$$DSK0 .IF DF T$$APE ;IF TAPE CLASS1MUDCB: .WORD 0 ;POINTER TO MU:'S FIRST DCB 4MUDCB2: .WORD 0 ;POINTER TO MU:'S CURRENT DCB .ENDC ;T$$APEF .ENDC ;NDF R$$MPL> .IIF DF E$$LOG KEEPR1: .WORD 0 ;TO HOLD R1 DURING CLADAT CODE .PAGE. .SBTTL IOFUN - I/O FUNCTION TRANSLATION TABLE;T; I/O FUNCTION DISPATCH TABLE;;-IOFUN:- FUNCT RLB,RD,RD.L,CMDRLB ;READ LOGICAL BLOCK . FUNCT WLB,WR,WR.L,CMDWLB ;WRITE LOGICAL BLOCK2 FUNCT SEC,GUS,GUS.L,CMDGUS ;SENSE CHARACTERISTICS .IF DF D$$DSK' FUNCT LOV,RD,RD.L,CMDRLB ;LOAD OVERLAY 7 FUNCT STC,AVL,AVL.L,CMDSTC ;SET DEVICE CHARACTERISTICSD. FUNCT RPB,RD,RD.L,CMDRLB ;READ PHYSICAL BLOCK/ FUNCT RLC,RD,RD.L,CMDRLB ;READ WITH READ CHECK  .IF DF R$$MPL/ FUNCT LDO,RD,RD.L,CMDRLB ;LOAD D SPACE OVERLAY * FUNCT SCF,RD,RD.L,CMDRLB ;SHADOW CATCH UP .ENDC/ FUNCT WPB,WR,WR.L,CMDWLB ;WRITE PHYSICAL BLOCKR1 FUNCT WLC,WR,WR.L,CMDWLB ;WRITE WITH WRITE CHECKE7 FUNCT WDD,WR,WR.L,CMDWDD ;WRITE WITH DELETED DATA MARKT= FUNCT INL,GUS,GUS.L,CMDGUS ;INITIALIZE (FOR RCT REPLACEMENT)V* FUNCT RPL,RPL,RPL.L,CMDRPL ;REPLACE BLOCK0 FUNCT TRM,0,0,CMDTRM ;TERMINATE RCT PROCESSING .IFF ;D$$DSKK+ FUNCT EOF,WTM,WTM.L,CMDEOF ;WRITE EOF MARKC( FUNCT SPF,REP,REP.L,CMDSPF ;SPACE FILES) FUNCT SPB,REP,REP.L,CMDSPB ;SPACE BLOCKSR( FUNCT RWD,REP,REP.L,CMDRWD ;REWIND UNIT9 FUNCT RWU,AVL,AVL.L,CMDRWU ;REWIND AND TURN UNIT OFFLINEWG FUNCT SMO,AVL,AVL.L,CMDSMO ;MOUNT AND SET TAPE CHARACTERISTICS ;JJM300I8 FUNCT STC,ONL,ONL.L,CMDSTC ;SET CHARACTERISTICS ;**-18 FUNCT DSE,ERS,ERS.L,CMDEOF ;ERASE (DATA SECURITY ER .IIF NDF S$$YDF , .NLIST .TITLE RSXMC .IDENT /M4.1/;,; COPYRIGHT (C) 1976, 1977, 1978, 1979, 1983/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.E; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AG00AÀ\‰V§3eaek›’REES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; O; VERSION M4.1 BASELEVEL 35E; 0; CREATED BY SYSGEN VERSIONS 3.2.2d / 2:3.2.2d ;AR$$11S=0 ;RSX-11S SYSTEMSM$$MGE=0 ;MEMORY MANAGEMENTI$$RDN=0 ;I/O RUNDOWN$D$$YNM=0 ;DYNAMIC MEMORY ALLOCATIONP$$LAS=0 ;PLAS SUPPORTM D$$IAG=0 ;USER MODE DIAGNOSTICS%N$$MOV=33. ;SIZE OF BLXIO 'MOV' TABLE T$$SYN=0 ;XON/XOFF SUPPORTE5C$$TTY=177564 ;REGISTER/STACK DUMP DEVICE CSR ADDRESSUC$$RSH=177564 ;CRASH REPORTING+C$$ORE=256. ;SIZE OF DYNAMIC STORAGE REGIONM6S$$YSZ=108.*32. ;SIZE OF PHYSICAL MEMORY IN 32W BLOCKSH$$RTZ=60. ;LINE FREQUENCY %K$$CSR=177546 ;LINE CLOCK CSR ADDRESS%K$$CNT=177546 ;COUNT REGISTER ADDRESS0K$$TPS=60. ;TICKS PER SECOND K$$LDC=1 ;LOAD COUNT VALUEM9K$$IEN=115 ;CLOCK INTERRUPT ENABLE (KW11-P AT LINE FREQ)U&;;;;D$$WCK=0 ;DISK WRITECHECK SUPPORT"R$$JPO=0 ;OFFSET RECOVERY SUPPORT*R$$JP1=1. ;RJ/RWP04\05\06 PACK CONTROLLERS%R$$K11=1. ;RK11 RK05 DISK CONTROLLERS6*R$$L11=1. ;RL11 DISK CARTRIDGE CONTROLLERS&R$$611=1. ;RK611 DISK CART CONTROLLERS)R$$P11=1. ;RP11-C\E DISK PACK CONTROLLERSZ&R$$M11=1. ;RWM03 DISK PACK CONTROLLERS&R$$UDA=1. ;RA80/UDA50 DISK CONTROLLERS&T$$J16=1. ;TM02/03 MAGTAPE CONTROLLERS$T$$M78=1. ;TM78 MAGTAPE CONTROLLERS+T$$M11=1. ;TM/TMA/TMB11 MAGTAPE CONTROLLERSK$T$$S11=1. ;TS04/TS11 MAGTAPE SYSTEMSS$$ECC=0 ;SHARRED ECC CODEO(D$$L11=1. ;DL11 A/B/C/D LINE INTERFACES$V$$CTR=400 ;HIGHEST INTERRUPT VECTOR-R$$JPO=0 ;RP04/05/06 OFFSET RECOVERY SUPPORT1'R$$6OF=0 ;RK06 OFFSET RECOVERY SUPPORTR'R$$MOF=0 ;RM03 OFFSET RECOVERY SUPPORT1LD$DU=0 ;LOADABLE DUDRVZ1DU$R0=2 ;NUMBER OF RESPONSE RINGS, CONTROLLER 0 0DU$C0=2 ;NUMBER OF COMMAND RINGS, CONTROLLER 0"L$$DRV=0 ;LOADABLE DRIVER SUPPORTB$$LV1="38 ;BASE LEVELMB$$LV2="B* ;REVISIONP#S$$NM1="RS ;SYSTEM NAME (6 CHARS)M S$$NM2="X1 S$$NM3="1M0S$$HFC=30. ;MINIMUM TICKS BETWEEN SHUFFLER RUNS&M$$CRB=84. ;MCR COMMAND BUFFER LENGTHR$$11M=0 ;RSX-11M SYSTEM/;0;F& .IIF DF C$$CKP&T$$BUF!A$$BIO K$$AST=0 .IIF DF A$$BIO&T$$BUF K$$AST=0 .IIF DF P$$OFF K$$AST=0 .IIF DF P$$SRF&G$$EFN K$$AST=0;R; ; EXEC MACROSS;S;GB; ASSUME MACRO FOR CHECKING ADJACENCY AND OFFSET VALUE ASSUMPTIONS;D 0 .MACRO ASSUME A,B=0 .IF NE - " .ERROR ;EXPRESSION(S) NOT EQUAL .ENDC .ENDM Y;M; CALL SUBROUTINE$;2 .MACRO CALL SUBR ARG3 .IF IDN <$INTSV>, JSR R5,$INTSV .IF DF L$$SI1 .WORD ARG .IFFG .WORD ^C&PR7 .ENDC .IFF .IF IDN <$SAVNR>, JSR R5,$SAVNR .IFF  .IF IDN <$SWSTK>, EMT 376 .WORD ARG .IFF JSR PC,SUBR .ENDC .ENDC .ENDC .ENDM;C!; CALL AND RETURN FROM SUBROUTINEC;K .MACRO CALLR SUBR JMP SUBRS .ENDM;; CRASH SYSTEM;A .MACRO CRASH- IOT .ENDM;P*; DIRECTIVE REGISTER SAVE AND SET PRIORITY;  .MACRO DIRSV$ JSR R5,$DIRSV .ENDM;; SET DIRECTIVE STATUS;J .MACRO DRSTS VALUE TRAP VALUEA .ENDM;..; GENERATE INTERRUPT ROUTINE ENTRY POINT LABEL;, .IF DF E$$DVC .MACRO INTLB NUM,NAMS $'NAM'NUM'T::E .ENDM .ENDC;F;; INTERRUPT SAVE GENERATION MACRO FOR ERROR LOGGING DEVICESL;D. .MACRO INTSE$ DEV,PRI,NCTRLR,PSWSV,UCBSV,?LAB! .IF DF L$$DRV & LD$'DEV & M$$MGE $'DEV'INT:: .IF NDF E$$DVCI .IF EQ NCTRLR-1 CLR R4V .ENDC .ENDC .IFF  .IF NDF E$$DVC.,$'DEV'INT::INTSV$ DEV,PRI,NCTRLR,PSWSV,UCBSV .IF EQ NCTRLR-1 CLR R4 .ENDC .MEXITL .IFFA$$$=0A .REPT NCTRLR INTLB \$$$,DEVU JSR R5,$INTSE SCBLB \$$$,DEV .IF DF L$$SI1 .WORD PRI .IFFU .WORD ^C&PR7 .ENDC .IF GT NCTRLR-$$$-1 BR LAB  .ENDC $$$=$$$+1R .ENDRLAB: .ENDC .ENDC GTUCB$ UCBSV,NCTRLR .ENDM;S9; INTERR00AÈ\BÎ\l1DATADATADATADATADATADATADATAUPT SAVE GENERATION FOR NON-ERROR LOGGING DEVICESN;) .MACRO INTSV$ DEV,PRI,NCTRLR,PSWSV,UCBSVV" .IF NDF L$$DRV ! M$$MGE ! LD$'DEV .IF GT NCTRLR-1 .IF B MFPS TEMP .IFF MFPS PSWSVR .ENDC .IFTF JSR R5,$INTSV .IF DF L$$SI1 .WORD PRI .IFFT .WORD ^C&PR7 .ENDC .IFTB .IF B MOV TEMP,R4 .IFFI MOV PSWSV,R4D .ENDC BIC #177760,R4F ASL R4R .ENDC .ENDC GTUCB$ UCBSV,NCTRLR .ENDM;.5; GENERATE CODE TO LOAD UCB ADDRESS INTO R5 -- CALLEDN; ONLY BY INTSE$ AND INTSV$O;R .MACRO GTUCB$ UCBSV,NCTRLRA .IF NB I .IF GT NCTRLR-1 MOV UCBSV(R4),R5  .IFFE MOV UCBSV,R5F .ENDC .IFF. .IF GT NCTRLR-1 MOV CNTBL(R4),R5P .IFFR MOV CNTBL,R5F .ENDC .ENDC .ENDM;1; PROCESSOR STATUS READ/WRITE<;> .IF NDF L$$SI1B .MACRO MFPS DST MOVB @#PS,DST .ENDM .MACRO MTPS SRC .IF IDN <#0>, CLRB @#PS .IFF. MOVB SRC,@#PS .ENDC .ENDM .ENDC;E; SAVE NONVOLATILE REGISTERS;N .MACRO SAVNR JSR R5,$SAVNR .ENDM;/; GENERATE STATUS CONTROL BLOCK REFERENCE LABELV; .IF DF E$$DVC .MACRO SCBLB NUM,NAME .WORD $'NAM'NUM .ENDM .ENDC; ; RETURN FROM SUBROUTINE; .MACRO RETURN RTS PCN .ENDM;.; SOB LOOP INSTRUCTION;T .IF NDF M$$EIS .MACRO SOB A,BB DEC A BNE B .ENDM .ENDC;.; STATE SWITCHING MACRO.;I .MACRO SWSTK$ ARG CALL $SWSTK,ARG .ENDM;.=; GET I/O PACKET MACRO -- USED FOR RSX-11M-PLUS COMPATIBILITY;.( .MACRO GTPKT$ DEV,NCTRLR,ADDR,UCBSV,SUC CALL $GTPKT .IF B L BCC 65535$  RETURN65535$:F .IFFD BCS ADDR  .ENDC .IF B  .IFFM .IF GT NCTRLR-1 MOV R5,UCBSV(R3)O .IFFU MOV R5,UCBSVA .ENDC .ENDC .ENDM;MQ; GENERATE THE DRIVER DISPATCH TABLE -- DDT (USED FOR RSX-11M-PLUS COMPATIBILITY);E) .MACRO DDT$ DEV,NCTRLR,INY,INX,UCBSV,NEW $'DEV'TBL:: .IF B  .WORD DEV'INI .IFF .WORD DEV'INX .ENDC .WORD DEV'CAN .WORD DEV'OUT .WORD DEV'PWF .IF NB NEWA, .ERR NEW ; UNSUPPORTED RSX-11M-PLUS FEATURE .ENDC .IF NB CUCBSV: .BLKW NCTRLR5 .ENDC .ENDM .IIF NDF S$$YDF , .LIST  .IFFM .IF GT NCTRLR-1 MOV R5,UCBSV(R3)O .IFFU MOV R5,UCBSVA .ENDC .ENDC .ENDM;MQ; GENERATE THE DRIVER DISPATCH TABLE -- DDT (USED FOR RSX-11M-PLUS COMPATIBILITY);E) .MACRO DDT$ DEV,NCTRLR,INY,INX,UCBSV,NEW $'DEV'TBL:: .IF B  .WORD DEV'INI .IFF .WORD DEV'INX .ENDC .WORD DEV'CAN .WORD DEV'OUT .WORD DEV'PWF .IF NB NEWA, .ERR zoM�´ÆXÀ¯”DÓpHn1ê¨ëH¢ê¨u~HŠê¨€H¦먃2H& 먺3H, ë¨È3H ë¨Ï3H ë¨D~H„ë¨ÝH¢ë¨+€Hô¨«Hpzô¨¯Hô¨J!Hô¨:^HDô¨W^HHô¨ÌeH|©³KHÖ©CEH$ ©WEH, ©w—Hl$©CTHÊ$©žrH”$©ðyH =©è&Hx =©ï&Hx =©°'Ht z=©·'Ht >©”MHšC©»HjC©HhC©ÊHjC©„:HôC©£KHlD©É8HD©ƒ:HÖD©FH²D©žrHE©O HXE©ö&H$G©RH\G© gH´zH©\}HJ©4H|J©@ HtJ©t H¨J©¼ H€J©ðKH J©;dHØ J©VdHHJ©ÌeH4J© gHlJ©wHPJ©Ã…HÄJ©L†HÆM©sH[N©­sH  zP©\Hb©„:zoM�´ÆXÀ¯”DÓpHn1ê¨ëH¢ê¨u~HŠê¨€H¦먃2H& 먺3H, ë¨È3H ë¨Ï3H ë¨D~H„ë¨ÝH¢ë¨+€Hô¨«Hpzô¨¯Hô¨J!Hô¨:^HDô¨W^HHô¨ÌeH|©³KHÖ©CEH$ ©WEH, ©w—Hl$©CTHÊ$©žrH”$©ðyH =©è&Hx =©ï&Hx =©°'Ht z=©·'Ht >©”MHšC©»HjC©HhC©ÊHjC©„:HôC©£KHlD©É8HD©ƒ:HÖD©FH²D©žrHE©O HXE©ö&H$G©RH\G© gH´zH©\}HJ©4H|J©@ HtJ©t H¨J©¼ H€J©ðKH J©;dHØ J©VdHHJ©ÌeH4J© gHlJ©wHPJ©Ã…HÄJ©L†HÆM©sH[N©­sH  zP©\Hb©„:H°!b©\}HŽ b©€»HJRc©L H‚e©ºHŒe©×H�e©«Hve©ÌeHˆe©×H´e©ÄŠH�e©¢ŒHÌQi©ÎH†i©ŽsHši©TtH*zi©€‰H k©„:HÂ$k©\}Hð#k©€»HàRl©€:HlHl©„:Hœ&l©aHHl©\}H”%l©€»HvSm©„:H¨)m©\}Hn(m©€»H Tp©„:Hz.p©'MHœp©(MH zp©@QHúp©\}H€-p©€»H¢Tq©'MHÜq©(MHär©ŸH"r©? H6r©p HÌr©r Hîr©ŽH|r©ÛH0r©ÜH0r©¢H–r©§Hžr©ÊH4zr©ýHÂr©H.r©2H`r©® HHr©7!H8r©#HNr©#HNr©©-H@r©ð.H‚r©„:Hr1r©'MHTr©(MHdr©xQHTr© SH<r©·kH˜zr©!mHþr©®pH„r©YqH<r©[q00BÐ\‰V§3eaek›’HRr©ÖsHVr©vwHær©ŽwH r©#yHòr©NyHrr©ìyH®r©óyH¨r©öyHìr©\}HÒ/r©àHr©}…H(zr©ŒH’r©´�HÔr©¼�H²r©½’HÒr©€»H8Ut©š^Ht©·qH´u©€»H:Vv©?TH¬ v©Hy©fH¾‹©*Hf Œ©`;H$ •©ÌyH¼•©àH"zš©sH˜š©‰sHp ©+sH, ©.sH ©6sH ©8sH  ©;sH0 ©=sH& ©BxHr¼©àHؽ©C H¦¾©HÈ¿©8rH¶¿©VrHÈ¿©WrHÆzÀ©áfHØÀ©õfHØÀ©öfHØ©FH¢ß©0 H¼ë©ÌeHò ì©|H$ì©ÌeHî ªòHXªCTH¬,ªŒKH¼,ªüKH½,ª”MH¾4ªƒ:HØ6ªŒ}H z6ªýHð6ª€Hú6ªÔ€Hî6ªß€H 7ª4Hî 7ªfHð 7ªö&H 7ª4FHD 7ªàHâ8ªºƒH"¢ª«„Hn¤ªžgH¸¤ªsH¸¯ª-Hx³ªë~H|zɪ+gHn˪úpHz˪sH–Õª„:H–8Õª\}Hx5Õª€»HWת3…HتóH°ت4MHÌ Øª5MH¼ تVNH® تYeHü تßfHÞÛª„:HMÛª\}H"IzÛª€»HŽWܪ«HV@ܪ„:H @ܪ\}H =ܪ€»HêWݪKHî ݪ€»H¢Vàª#Hÿª�ZH`«€»H`«ÀÁH`«ÈH`«@ÎH`«€ÔH`«ÀÚH`z«áH`«@çH`««„Hn-«}HL -«P}HH A«ëXH A«ÄqH¶A«sH®F«’sH®K«€QHK«ÕZHL«áHÂO«`KH®O«üKH®O« NH®zO«š�HŠR«Œ9H®R«,:H®R«R;H®R«œSHêT«|H<T«z}H®W«|qHtk«tLHfk«BMHjm«�QHq«~ZH>q«ˆZHDu«�Hbu«œHbzz«±THtz«¶THjz«ÄTH‚}«#Hº}«ÌeH6“«”H •«[MH$•«eMHL•«hMHXž«xH–ž«@H–ž«àH–¡«@wHŒ¹«ñyH‚¹«Â‹Hz»«„HÆ »«�HÊ ½«Š}H*½«ð}HZ½«÷}HZ½«H^½«H^½«áH@½«äH>¿«ö&Hè¿«t'HòÀ« &HêÀ«(HfÀ«­(HêÁ«¼,HvzÊ«L H‚Ê«t HèÊ«IH0Ê«Ž,HÂÊ«µWH8Ê«äyH‚Ê«ô‘H Ì«ÃHšÌ«pEHŽÌ«ŒdHºÌ«+gH¾Ï«xdH–Ï«ÐfH–Ï«ëyH$Ñ«,xH`zÑ«BxHìÑ«ýxHÑ««„Hnå«àSHé«­FHë«ZHdë«øfHë«z}Hˆ뫽’HÎò«½Hò«„:Hlò«ÒhHò«àHøó«FHºó« GH6zó«¡GH6ó«¤GH2ô«xZHô«ÝfHô«\}HHô«€»H`X¬sH¬xQH& ¬sH’l¬ÊH®l¬UH®ƒ¬ç_H¼ƒ¬è_H¼„¯€»HªX‡¯€»H–Xz¢¯€»HêQ¢¯ÀÁH&R«¯€»H€R«¯ÀÁH¼R¬¯€»HS¬¯ÀÁHRS­¯€»H¬S­¯ÀÁHèS°¯€»HBT°¯ÀÁH~T²¯€»HØT²¯ÀÁHU³¯À�H$µ¯€»HnUµ¯ÀÁHàUzâ°€»H¾X±€»HàV±€»HDW±€»HÄW±€»HxV²€»HÒX)²€»H‚X4²€»H0X×ÈHÀŒýfHŒ9€HŒL…H€S}žHd@yH mxxH znHHpHrŽ{Hr˜{Hÿÿr¶{Höÿr¼{Hðÿr½{Hïÿr¾{Hîÿr¿{HíÿrÀ{Hþÿrà{Hr8|Hûÿr`|Húÿrˆ|Hùÿr°|HøÿzrÎ|H°ÿrÏ|H¯ÿrÑ|H­ÿrÒ|H¬ÿrÓ|H«ÿrÔ|HªÿrÕ|H©ÿr×|H§ÿrö|H¦ÿr÷|H¥ÿrø|H¤ÿrù|H£ÿrú|H¢ÿrû|H¡ÿrü|H ÿzrý|HŸÿrþ|Hžÿrÿ|H�ÿuHuHuüXHvöHvy:HvaHvžgH&ŽH &zH@&&H&ë�H€d&ôH zd& H d&æHd&õHd&#H€d&#Hd&#Hd&4&Hd&NHd&˜THd&UH@d&gYH€d&¶^Hd&ÌeH@d&áeHd&#›Hzä)NqHä)½rH æ)#H"æ)ÕZHæ)faHæ)ßfH æ)™wHæ)vyHæ)Þ‰H$è)âHì)°Hì)è.H,ì){:Hì) FH(î)ËHzî)ƒKHî)ë�Hó)H ó)Ue� ™Hg�°,H>h�îH>i�8^Hl�°H!l�pH$zl�è.H>l�8YHm�™H(n�HHn�ýHo�H>o�p&H6p�H&p�èqHr�<H r�ŒHBr�|qH:s�L H,s� qH9s�<}Hzs�‚Hs�(‚Ht�Ht�˜:H/t�ÒGH0u�H�ƒÐfH€ðÔƒt HÔƒ4FHÔƒ LHÔƒZH@ÔƒžgHóƒ. H°ÿóƒîH�ÿ»„. H ÿz»„2 H¨ÿ»„3 Hªÿ»„4 H¬ÿ»„5 H®ÿ»„îH€ÿ»„òHˆÿ»„óHŠÿ»„ôHŒÿ»„õHŽÿT†‘H€T†*KHT†„SH@T†¼^HT†L…H¡‡H2z¡‡@H¡‡ H6¡‡g'H4¡‡ €H¢‡0„H£‡hLHúÿ£‡ ZH£‡ñ`H£‡z}H£‡à~H£‡ø€H*£‡˜”H£‡À”H £‡è”H £‡•Hz¤‡H¦‡eH"¦‡ÕZH ¬‡«„Hüÿ­‡À…Húÿ¯‡ð‘Hþÿ²‡àH²‡ H³‡H³‡xdH³‡øH³‡‚H´‡H"´‡@H#´‡k'H z´‡a(H´‡ ì�ËsH/ð�ÊGHó� H!ó�bH$ó�’H"zó�ÖKHó�øH2ô� qHô�ÅžHö�Hö�faH(ö�ßfH*÷�R;H D‘ëHD‘ #H@D‘#HD‘ƒKHD‘4fH D‘6qHD‘C�H€zD‘¦’H!”àH"”ËLH#”à~H&”H)”8^H,” FH -”ÀH2”æH3”ÖKHüÿ4”H5”H6”°H7”p:H 7”R;Hzdš(xHfš›`H iš�yHjš�yHlšp!Hlš8YHpšXzHrš !HtšHvš¸HvšxdH©®xH¾©©Hÿÿì©”’Hÿÿýª©H:T«”’HÿÿÌ«©Hÿÿ¬¢sH6ªl;HYO« _HÜXÑ«O H,ZÑ«hH,\é�’Hé�!)H|³š‹–,¿B¿Bn  W¦TITISYSYOVvìÀpÁðöRjôtTITIDRDRDBh„ÿB € … pÁìÀƒF|³pÁF àöP(ƒ:u~HVN (Uq8(Ösðœwxp4ØØÞøø'(:dIq€Lqˆ;}@v…0(þvXYM`|…h·êÿ÷âÿ÷ ´À÷ ´÷ ¸ ÆÐÿ 7 Ðÿ ÷ œ!†÷5Êÿ÷Ô j÷®÷ ÷ ÷ Áz÷ J÷šÿ�À÷ dÀ‚ÿwˆ fhÂ` ŠÀ®  Á”W  W  W ;W ! E ðÄ … ìð¥ ÿÿèÁ Å äP�„ áð¥ ÿÿà‹Ä È• Ä ¥À® ÷ ¬ ‡ÂöR ÂeÊ úÁ÷ ª ’÷ òþW þvõ”W  W  ùÀ æ4Á¨‘‘‰ÁªÑ Ñ a(ñ þÿÜiÁmºþÁM¶þ±?& & Àþ 7R÷–÷ ôÀê 7<÷ äw Þõ‚Žò¶ï‚‚–%±·÷ ºÀ²7÷ ®w਷ø÷<÷ Ò÷ ÌÀmŽ–%¡‡Ám.þÁM*þ2æÃv ÷Ê÷÷ lÂÃb ó†¦ÎmX €ÁmN7F·š÷ z÷:&N`Ö ÷†÷ .Ám(w$7v÷ Vƒ‡w |¡EE CC w jE E C Ä& ÃEøÿŽ Î  Ãe0Ð�Ä æ E C Î üÖ éÖ ‡” Â¥ ”� úÂ¥ ±¡‡Ð• P”É‹ý‡Á Áfw ôf÷ Äÿ‡“�÷ ¼ÿ‡“�÷ ¢ W †K— :ã Áb^Áe÷` ª÷î÷ LB$·˜÷ Ü÷ :ñ"ôñ¬ðñ‹íB·r÷¶÷ wd÷ ¨÷ f)÷ú N÷’÷ ðB'·<÷ €÷ Þñ"ôÄ1¡ï‡1¡ì‚ CÜBÄàBlÄ üf·þ·D÷ ¢B‡Áææ‚÷ à wTüÀ<pb°d÷ Ä ‡ð fô‡œ`Ã¥öÿ±00Cà\‰V§3eaek›’ù¦fÁÃ¥ÿÿÁÃ¥þÿ ÁÃ¥ýÿÁ Ã¥üÿÁ÷ ‚ �‚в'ÿÒb VMR>ÑÌPbĶ7ôÿ÷´8ý÷ –ÅbD± 7Úÿ÷ ‚5"õ5,ñ‡Ä´Äå7ºÿ÷ þü÷ \ÅbD7¢ÿ÷ Jõ ±5"ò5,î‡7 Z÷Á÷ bwN÷‡÷ VwD÷†À ‡Á÷ \wÐ÷æPÿÎ5YÎm�üV‡æà÷ ž�Π÷5Þ΀–%G‡·`æÀ·VæÐæÀ ÿ ÷ R÷· ¤ÿ†Â ÿÞÿÃmðþ‚ Ãåü€Â Ãe ƒÃEþÂ@Âe‚ B` ÷ Ö †¬*öÿ° ‚‡l×  ‚ƒðb0Þ ‡‡ÁhÁÂJw„÷Eà€þ·ºæÀæÀÃpþà ‡Ã ‡Ã ‡Ã ‡Ã ‡Ã ‡ÂRþÂ`‡Ãö ƒw8ÿÂ@þ  Œ‚ Œ‚ ŒÃ Ãm*þÁÃEþŠÁ� B`Âe¤÷Eàþ·JæÐÇ ÷äÿ÷Üÿæ´ ÿˆ‡ææ)ÿˆ‡÷pÄý÷û÷ fþÅbCw°ý÷ôú÷ RþÅb À€Á%Á ýDw�¾ÿwí¸ÿ· ´ÿ7|ýwÀú÷ þ¡Þ Dm÷ŠšÿòÍ Ö±‡P�P�&@íA÷  @mÀEÿ€ ÷ Е:‡&÷ — .”Ö €÷ êÂ¥8Â¥9±‡¡‡&”—  ü‘ É‹ø”— = —  — —  óÖ ²Ö €±¢‡f&¦‚Þ €�‚‡&æÿˆæ3ÿˆ“U#“U]RO« _ÓtÌS ƒ¬ç_"ƒ¬è_$-{ÐfXê¨u~ZD©F\G© g^H©\}`J©¼ be©ÄŠd ©Bxf½©C h6ªl;j¤ªsl¯ª-n˪spàª#rýª©t««„vA«Äqxah €zhhÐ|lhè.~phØr€R«Œ9‚T«z}„“«”†ž«xˆž«àŠž«@ŒÀ«(ŽÏ«xd�Ï«Ðf’Ñ«O ”Ñ«Bx–Ñ«ýx˜Ñ«hšÑ««„œa� €žë«Z ë«øf¢l�è.¤o�¦g�°,¨h�îªó«F¬ô«xZ®Ó�ò°ÿª�Z²«€»´«ÀÁ¶«È¸«@κ«€Ô¼«ÀÚ¾«áÀ«@çÂô¨:^&©CE(=©è&*D©ƒ:,e©º.t©š^0v©š2v©""4v©?T6¿©8r8ì©|:ì©Ìe<ì©”’>6ªý@6ª€B6ªÔ€D7ª4F7ªfH7ªö&JT«|LT«”’Nm«�QPq«ˆZR•«[MTë«z}V×'&ÿÿæ1ÿˆ‡ÿ *îHÿ "î@ÿ î¼ ÿ î$ÿ úšÿ ú”ÿ úúf#ÿ òV"ÿ êBüÿ âBü&ÿ ÚB^(ÿ ÒNHÿ ÊNÿ ÂNd!ÿ ºNú$ÿ ²N'ÿ ªZPÿ ¢&Hÿ šVŒ#ÿ ’bz ÿ ŠbÌ&ÿ ‚n:ÿ znÄÿ r†0ÿ j†0ÿ b†L0ÿ Z†Þ0ÿ R’0ÿ Jª’8ÿ B L8ÿ : ö9ÿ 2 <:ÿ *"š;ÿ ":L8¦Þ5Îe‡w ´Á,… Bv ù    ù ‡‚Ê5ôùB‡wÔù ê00Cè\Û\l1DATADATADATADATADATADATADATA:iÿÿÿÿ¶¦Ê5‚ú‚‡ò û¦¦‚ Ž Ê5ùÊUŽ‚öÖ ‚åâÄ ¶è‡ÊEò ÊU ‡¡*‡Ê5@*& ¦ÎEð& & ¦¦f&ËDÄeæÎfææ ÿˆ ‡Ã‹ ææ)ÿˆÌ‹€ÊU±‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&æ¦ff… Þ �‚ƒ„…‡&æf…Þ ƒ„…‡‡ Hîz�H âú�HÈâ �H°âB$�ø"è%�ø"¼**�ø"ð6,�ø"€.�H¼ âN5�Hl âZ<�H$fâ&?�l $Zr@�l ÔZ~A�l 4ZŠB�l ÔZ–C�l |Z¢D�l ,Z®E�l ¤ZºI�l ZÆM�l ZÒO�l ZÞQ�l ¼ZêR�l tZöS�l °ZT�l xZU�l ZW�l ÄZfX�H@2âb]�ˆ#0&>b�ˆ#Ø&Jf�ˆ#&Vh�ˆ#ð&2l�H$ânv�H”âîy�0†žy�0dz’|�0<z†��L8ªâ��L8<¶ž ƒ�ˆ:øªÂ„�ˆ:ôªÎ…�ˆ:hªÚ‡�ˆ:øªæˆ�ˆ:̪òŠ�ˆ:ìªþŒ�ˆ:¤ª¶��L8` ž“�L8`ž"—�L8\ž.œ�L8¸ž: �L8pžª÷ èî÷ Ré— /c¤P`¤R]¤IZ÷ 6é— =U÷ ñW úP‚wæM÷ éJ†À�÷ dî †÷ üåE÷ôåôå÷|³ìå÷ Lî<‡f÷î÷ °îµ÷ àîÂêó·ôí÷ œîÂåAwæí÷ Žîõ w­ °å‡BAñ·Èí÷ pî5÷  î7¸í÷ `îuõ�†åõ�€å ÷ „î‡ÁÁ>wü Local TI: - GlobalÃ� È¥=7 Bå7 @åÈ¥/$÷ rèñ5×"TIlËJí÷ .èj‡— =g·åÅ” ÷ Ô ‡•�÷ Ì[‡•�÷ t M— :T÷ üçQ‡— /N¤GK¤BH¤LE÷ ÞçB†ÅbÄ ò7èì÷ ,ê÷ Ší÷ ´ä÷ ¬äeD87Èì÷ píÂšäµ óõ­�äïõ‹ìõ|äJffÁ ÷ ¶æ„7Žì÷ Òé÷ 0í�÷ bí÷ TäÓ‡ÁIÁÁJÁwÈ ÷ 2ä&÷ (äófÁ ÷ Üå�ï‡ õäõ�ä5Šõä5 7"ì÷ fé÷ üìwì÷ ¼ì ÷ îì‡f÷ î€Ö wî7ôë÷ 8é÷ –ìNÀ®P�P�A� ÷ 6 Е:Е ff�D7ºë÷þè÷ \ìw¬ë÷ ðè÷ Nì÷ BîЕ Á*΋Á8÷ ”æÖ‹„7€ë÷Äè÷ "ìwrë÷ ¶è÷ ì÷ îÖ ÷ Ò­÷ @懗 A‡Â¥Z†À ‡¯”w <ú·öÿ7 îÿ7 ìÿÀÿÿÁÁ%Äü‚7 ÷÷ ‡÷ JÅåÀ À%‡L÷ ïwªÃxÄ÷ $Ä ûÄx� E‚À ø Ååê‡(&&<(&Àˆ&X2‡Ô-Hÿ,Ô-Dÿ)̵ &‡À $È #û-øôµ@ Ð Ø%ÿÿ(Ð í‡ÀXÁ> Ð%ÿÿ ÁeÀ%Äø‚¡‡ÁÂJwäþwâþÁeÁf„ÃRÊââââ¢(÷ lÆÌþ±‡÷ úÿ Àßîÿ· êÿÀæÿ÷ T †ð¥öÿ*±ÂeHÁ w*7Àÿ7¼ÿ‡÷ ¸ÿ&÷ ²ÿÀ€U‡ Enter filename: . »zSYâyIMÅ ÷ÿÿTî Á÷ å†wšáwØÀH pfCfph÷ F1fí‡È•ð² ÷ 8†w¦ðµðµw¢ÀÁ’ ÂeÃt ÷ ó‡ÂDÃRà ýÍ H÷Zÿøåð•#÷ ìN‡ð•ð€÷ ý& À÷ àV �‡÷%ÿÿ˜í=÷SY®þ7 ¬þæ: ÿˆ‡æB ÿˆ7,\†þ7¬^€þ÷LB†þæ: ÿˆ ‡æB ÿˆ7,\bþ7¬^\þÁv÷ HÀÁDÂ’ Ñà ýð•#÷ P†wÎwÚð•ð•ð÷æäìßÍ $÷ní�ç÷Ôä÷ 2èÂ*å¡ ‚ ‚ Âe° ƒ° ƒ° ° 0 ÷åüç÷üäøç÷üHç÷òŒä÷ è×-Òåw>æ¾å—#0 ‚7 ÊçŽ ÷eÂçÎ û÷e€¸ç·\ßÍ w¢¨Â   ·°ä·®ä÷ Öç÷œìBß÷–ìææ÷*ä÷ ˆçÂb·‚ì·&ß·"ß÷pìÂæ÷ä÷ dç÷ ì �ÁLÊ%€÷5RìÊ% ^‡ƒÁ>ìÁåwŽæ÷Òã÷ 0ç·ÔÞ÷ ÊÞ4·"Pì1æ¦ÊeÊE�C·`æ÷ 6çƒåÊಒþÿJ`–"Êe?ÊE?JàÊMŽÞ÷ çJ`·Øã÷Øë*æ÷nã÷ çwÄã÷Àëæ÷ öæ÷%ÿÿpë7 jë‡ÁñfÁ Á Á Á ÂJ÷ HwÚüÁùTSMHRSIUICÁè#Š ý÷ æ&À�÷ Òå€i‡Åè#÷ tàt‡— /3Á \— 0%‡— 9"‚À ÷¥ªÿQ÷ @è†÷eœÿ— :NW K‚÷ ªUW ;E‚Â¥:B÷ ˜UW ;<‚À η jÿ÷ /‡u ÅÁ$÷ è †Áþ#÷ è*‡)…Åe ÷ Ú!‡´"…¤[÷ Äçu�W ÿ‚Â¥, ÷ ®çu�W ÿ‚Â¥]šÁÁ> Á=ÁÁÁwÄ�Üþ!è‚Å”äÁ÷ "Þð‡&fÀjêÀå 7zä÷¾á÷ 00Cð\‰V§3eaek›’åÀb0  ~û‡ÀRêÀå 7Vä÷ þäÅè#Ä E�÷ Cà @  �~Á �ìpÂ÷ Bu`u 5`ìÄCÃe÷ ²áó þÿ Á �ìp�l~Ä%ó þÿ÷ þu`u 5`„ ! äÁŠáÁíxá ï÷ z÷ °µ÷Pé®ã÷òà÷ PäÄb5cu Â6é·�ã÷Ôà÷ 2äƒ ·|ã÷ $ät-õ‚‡t-ð†�€÷^ã÷ ä ÷ 8äT!rü‡7Hã÷ (ä‡BA÷ Tu5Pµ ‡÷ ~UÃù#“ Ë‹ü±Ãåù#Õ‡õA B ÷ u 5 õ‡& f €À ~�&÷ †ñ€v�÷ zñ6`Né�€‡ÿ ôð†0ÿ ìð†0ÿ äð†Þ0ÿ Üðª’8ÿ Ôðª¬9ÿ Ìð L8ÿ ÄðL8ÿ ¼ðø:ÿ ´ð"L8ÿ ¬ð.l8ÿ ¤ð:L8 Offline Loaded UnloadedCOMDEVDRIVERDYNAMICMAINSUB SYS TASK 7 öÿ7 öÿ÷ üè ‡·èÿ7”åÿÐ¥:k÷ èèh†÷ ðæð Þ †÷ Ìÿ Á÷”¾ÿ–÷ wðï÷ ¬ÿ w-¤ÿÍ JÖ æ wbëD· ’ÿÀ®÷ PðÈ• ”3!f&Ä7”í÷Øê÷ 6î÷†í÷ Êê÷ (îÅ÷ ð„…ÁHóµ÷ dè÷5óó5ÁYõ ÷ FèÁQõ ÷ 8è÷ ~œÁwl÷ 4ï÷Üòí÷`ê÷ ¾íÄbw ïwí÷ÂòFê÷ ¤íÀ®- ô5  ô5€ÁŽ÷ Úç÷ ÷ Е A÷ ðЕ ÷ ò � ÷ .Е ÷ "  ÷ ÈЕ ÷ ¼Áz- Á÷ xçÁ„ô5 H- ^Árô5€XÁkô5 ÷ JçЕ Е-Е fw0ì÷té÷ Òì��Е:·ì÷ÖñZé÷ ¸ì4Е Е(fwøë÷ <é÷ šì÷ $÷ Е)ßÁ‰ô5€Ácæà÷ "ñ�΀÷ ñ�΀ÿ- ‡Ág÷ ¦æ÷ ìô5     wˆë÷HñÌè÷ *ìwlþÁ”‰1 ÷ Ìð€ÂI q  ûÂ÷ èå÷ ²ð�Е0Е0‡MAINSUBTOPBOTPARITYSPEEDUICSYSUICNETUICMAXEXTPUBBUFPOOLSIZEPOOLPLCTLWCHKRNDCRNDLRNDHSWPCSWPRLOGONCRTLOWERESCSEQREMOTESLAVEPRIVBROECHOASR33LA30SVT05BFORMFEEDHFILLVFILLTYPEAHEADFORMFEEDWRAPFDXEBCHHTRPAABAUDAVOANSIBLKMODDECEDITREGISSOFTHSYNCTTSYNCPASTHRUPRINTER_PORTASR33KSR33ASR35LA30SLA30PLA36VT05BVT50VT52VT55VT61LA180SLA120LA12LA34LA38LA100LA50LQP01LQP02LN03DTC01LA210LQP03VT100VT101VT102VT105VT125VT131VT132PC3XXVT2XXTERMLINESTASKCOMDEVSYSODDEVEN    € úÿ   €@ € @€    !" HBHBHBPBPB„B¨H P  P P P„B„B0„B„B„B0„B0PB0„B0„B0„B„B0„B0„B P P P P P P P P P€ € €€ €+€€€€[05075110134.515020030060012001800240048009600EXTAEXTB5075110134.51503006001200180020002400360048007200960005075110134.515030060012001800200024004800720096001920038400ô#ô#<%D% *¼)°%ª%ª%ô-/ò&ø*V+-¼,J.J.J.¬.¬.¾-^'^'^'^'^'^'^'^'^'^'^'^'ˆ(^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'^'Ú(¸&7 8Þ÷ 4á:‡— /7¢N¬O¤· ÞÁt Å’÷5ÎëÄ%<ÄDÁ25þÿ& ÷ é‡„Ž ÷5¨ëÄ%DÖ ²|²"Ñ‹þÔ Ö É‹ÛÁÁw Á&Ö ú„w(C÷ œ u wu ÷ |Ý ÷ Šà†w— :~÷ r Ë z÷ rà†÷ jÝrnÝ— :oU%È¥* ÷ @Ýl÷ Æêl� € ”÷ ^‡U\÷ 6àY‡— :VÈ¥* ÷ ÝT÷ –êT� € ”÷ Ð F‡UD ÷ àÁìÜ(=‡— ::Â{ ÷ Ø †� € ÷ Ê †� „ ÷ ¼ †÷ Bê#�÷5†ê)� ˆ ÷   ‡÷ ¬ß†Í%÷ –ÜÍ%÷ ˆÜ ÷5Rêå%ÿ‡†ÜÁwÖ ÁpûÁdøÁõ/…7 ^Ü+…·VÜ÷ TÜ&÷ Èé'�C÷ @ U%Â¥: ÍÿÿÈ¥-� È¥+� € È¥*€ ”÷ Ø ‡e÷ ߆ ÜÁw\ Ádû„wê„wè÷ èÛû÷ âÞø‡CÂ¥A‚Â¥Zb†— [d÷ ´æW ÿb‚ DÐ_Ä— ,X÷ œæW ÿV‚DÐT— ]N÷–é²ã×-„Û ×-|Û÷5öÛI÷Ré”ã÷ xÞ9†72á÷Îà÷ dä‡÷ bÞ.‡— :+÷ „Þñ-jã w`ã÷&¤à÷ äóñ51$÷ (ä÷5ìè 7àà÷eüÿ2ã÷và÷ ä‡À ÷ 6ÞÛÁÁÁwN Áûò…÷ äÚïC÷ Þñ5î÷ ÐÝ ‡À ÷ ´åÁ àÁ%ÿ݇w�¥à÷ ²ã‡ºÚ/…÷ ªÚ,C÷ ÐÝñ5w¬â÷&ðß÷ Nãñ-žâôñ5÷ v݇À ÷ Zå÷50àÁ%‚Á%ÿ‡00Cø\Û\l1DATADATADATADATADATADATADATAw�$à÷ Nã‡Áw¦NÚ„wC÷ fÝÅjÕ5wÄ%nwÄÄå,Ä Äe– eÄ%° ÷5~Ú_7mþÿâ÷`ß÷ ¾âÁbÄ%´ 7 êÙ· æÙ÷ âÙ C SÄ%¤ Ä%ì ÷ ÊÜ;†÷ Àâ‡÷ ¾Ù÷÷ ¸Ü÷‡À Ábñ5€ ;ñ5@ 7Ä%ì æ÷"Èùñ5@ ÷Ø!ºùñ¥ * ÷f"¬ù÷ Їó‹Ø/÷ |‡÷ `܆÷Å%ß÷Ð!ßÅÁÁÁaÁw–ÁbûÁøÄ%8÷5’Ùé$Ùã…÷ ÙàC÷ :Üñ5â÷ Üé‡À ÷ äãÄå,Ä Äe– Bƒ ‡B üC C Á0Ã3Cb³Pb÷ Æá‡º…÷ ÂØ·C÷ èÛEñ5¸÷ ¬Û¿‡À È¥0‚È¥9‡÷ „ãÁ ¡�Á%ÿž‡Ä!Ì K%üÄå!Á² ÷ Šã†Ñ‹þÔ É‹øÁ’÷ \Ø„EÄån!/!B+õE õE¿õEõE W ‚õU „ &Ä „eÄe`!• €Âå0�µ\Ä!õU ÃE€õÐ5•5“+u�&÷ äà‡_…÷ à×\C÷ Ûñ-ìß wâß÷&&Ý÷ „àóñ5Kñ5€ Jñ5@ F÷"Ô÷ñ5@ ÷Ø!Æ÷ñ¥ *÷f"¸÷÷ €Ú<‡À ÷ Ž4‡Ä÷ pÚ$‡Â¥:!÷ z*‡÷ ^Ú†÷¥ @Ýô¼Ø/Ø/÷5@ÝÄ à à à à ÄP7ŠüÜ7ÑøÜ÷ $à‡Á ÁÁÁbÁwd ×ý…C÷ (Úñ5éEõU@ õE€ ÷ àÖõE@ ÷ ÔÙÖ†÷ ÌÙ ‡À ÷Œ öö÷ Ôׇà õU€ ÷ ªß‡"…÷ ä(�÷ žÖ!È¥*2÷ T†÷ �Á ÷ †ÃúãÃe?Å¡ Å üÁ`-†÷ j*÷ `ÖdÖÁw°Ádûó…÷ FÖõÈ¥*÷ &á÷ °ã�÷ ¨ãí�€ ”÷€vÿÁ÷5ÞãÁ€ Á%÷5ÌãÁ%€†÷ þC÷ öØÌ†÷²ãÞ÷HÛ÷ ¦ÞÅžÛBÂe?ÁÀ¡ à À û÷¸ãÚÝ÷ ‚Þw zÛE‚Å F‡÷†ãÆÝ÷ nÞÄb7¶Ý÷úÚ÷ XÞf÷ ã�Ž- ï‡æ÷ øâ�N´% ƒ÷ êâ#�÷ PCáÃMÐÕ@Å`L÷ãnÝ÷²Ú÷ HÞÁ÷ €×÷ –þÂö*Áq÷ ’7 „þ‡ÁÁw~Ádû C÷Eÿbþ÷P^þà à à à à à Á÷5¸âÁ€wP<þ‡&…C÷ Øñ5@!ñ5€Ë%DXË%DYË%MTË%MMË%MSñÅ÷ ¦ÔñÕ÷ –݇žÔÁwêD…÷5öÔHÅb÷>â�Ü÷ÔÙ÷ 2ÝD÷äá~Ü÷ &ÝDã÷<ârÜ÷¶Ù÷ Ý Ð¥: ॠ÷ *ß)‡sbÀ óÓ × ‚î !‡M%‡W#T‡M%‡W%T‡Í%ú‡Í ÷ ݇÷5nÔNÁÁwHÁûõ„÷5¢áô÷ ÖÓ÷E€”á÷U€Œá÷ˆá€Ù÷*ÔÒÛ÷Ù÷ ¬Ü‡(…÷5€láÙ÷  ÓÓ¢*÷ V͇÷5RáW ÿÍw@Ù÷Lá’Û÷ÖØ÷ l܇Áÿ÷5*áïÁÿÿìbÓ*…÷5 ÀÓU÷ 6Þ÷,á\Û÷ Ø÷ þÛÅbÄå <ä 5ŠA-A‚W ú>‚uÐ05ŠÁ 7u 4‚uÐ&÷5 lÓ+wšÿ"…÷5@^Ó$÷ ÔÝ÷ÒàúÚ÷>Ø÷ œÛÅbÄå&Á W ‚uW ² ‚M÷ ®Û‡÷5@ÓwHÿw®þw²þ „÷5ZàÁwè�Ò÷5FàöC÷ ¦Õñ5 w‚Ú÷&Æ×÷ $Ûñ-tÚô÷ TÒñÕñÅ÷ <Û‡÷ &Ý— K W  †Á Á Á Á Á ”—  ”¡±‡¤±Ê‹û‡Á3 ÷ BK‡÷ :s‡”‡ Âò@÷ Êÿ†Ò‹þÊ‹ƒ ö±‡ÿ è†L0ÿ è†Þ0ÿ è†Z1ÿ 誒8ÿ ú窬9€LB Ú÷ LB0:ÁxóÂ"ŠÁ ý7ÿ÷ d臗 /úÀ Àíÿ7þþÀN÷ ~s‡È•÷ |n‡ð‹kÈ•÷ lf‡ð‹cðµ_ÃÀ$÷ 4è÷ íŒ÷ ¶À˜ÁÚÂTÃz÷ 43‡÷ 6:‡ðµ97H67J27Brþ7Dnþ7Fjþæøÿˆ#‡ææ)ÿˆ‡÷ŠÿÀÿÁÿ7JwH7>w<P@‡Á!ð¥ðÿ*ð¥æÿ* Á#Á$Á"Á÷ †wâäÖ ÁtøÀ ò7\ì÷ é÷ þìÁbÉ ïwFì÷ Šé÷ èìñ%LBóñ-žï‡ �÷äý÷Üý7âýwäýwâýæ”ÿˆ ‡ææ)ÿˆ‡÷вý‡Á(÷ æwBâ00C]‰V§3eaek›’÷ Îù÷ R÷>û÷ PæÈ"÷5@”ýÎÀ"^!¬‡À¬ÁR"÷ (ýÁR"Äå¬ñeI !‡Äåö÷ ý`‡ÿ RõT#ÿ Jõ#ÿ Bõ*þ"ÿ :õ6#ÿ 2õª’8ÿ *õL8ÿ "õø:ÿ õ.l8ÿ õ.¦8&#�#*#ª#/#Ê#3#$7#¤#;#>$?#~$C#2$G#$K#$O#&$PRITASKUICCKPPARPMDINCSLVIOPCLIFIX”Áî!à  à ý÷ <ᇗ / Åö"Õ A ÷ <éú‡…Ý ï‡w&w(÷ úèwVþW ú‚‡wÄø!Äò!Á $ ÷ T{‡÷ L‡”‡”— [p÷ ¸èw�þtW ÿq‚— ,e÷ ¢èw�þiW ÿf‚— ]Z”‡æ÷Uîý÷Uèýæ÷U Üýæ÷U@Ðýæ€æ÷U¾ýæ@÷U€²ýÃú!Ãü!÷ Là— Y— N(¤O%‹U¤E ¤S‹E”‡÷ šê�÷ èÁe‡ � � � � wbý÷5ÆêÁ%ÿ‡÷UJý‡ÁÁÁ%Á÷ w`Ýÿ 2ó†L0ÿ *óª’8–,ÁN"Àî÷ ’ü÷¥ãü.ÁT"²ý‰`wöþa w’ïþw¾ÿwºÿæÂüÀ¬÷ `üÀð!Ð ÀîÐ À"Á " !Î5@wÀ÷ ~æ‡Á*Á,ÁÁ-Á. Á0Á1ÁOÁ2÷ úw|Þ÷öùBÿ÷ ú÷e26ÿÀ6ü÷5–ëç7bþ÷ðÚù÷ :ë€÷ÎùÀøùÁöùÁ Á Áe>ÄÒù÷ ë€ÀíîûÄíêû!¶Äe¬&÷ ^þ€wÞþÃeÁ üÃeÀ ¥À5¢7ÆþÀæý÷U ØýÎ5@ ÷5¦ý÷5žýj÷5”ýe÷5Œýa÷5 òêÁ\÷ *X÷E ˜ý7.å÷râ÷ ÐåÀÈâ ôÀëÀå7å÷ôêRâ÷ °åÁbwúä÷ ¢åñ 4÷ :Ý ñ-töññ-nö"íñ­hö#éñ-8ý"äñ­/ý!àB$·¸ä÷üá÷ ZåƒÂR⃠ôÅ Ð÷5 Hê÷UøüÁ+wzþÀÀü7¶ú÷¸ü²úÀò÷ tä†÷-¢ú¸ý÷-œú²ýw$þÁPÂò÷ >÷šý€ú÷–ý|úä7¬üÎ5@(õ5€wúýÂpý„÷ Þü÷‹Zü�Î5÷5@Lü÷U@lü÷5>ü÷56üÎ5÷UNüA÷ @é€÷ è õ5  Àü÷5üÀÜú7þûÀmúùB‡Àmöù?‡÷5VéÀ%ÿ8‡ 6‚õ5 7 Ôû@7üûÁÈù÷ äè€÷ œwòû÷5 é ÷²ùêûÎ5 ÷U Æû7 žûÎ5@Î5÷U°û÷ ¦è€W-`vƒÁ/÷ "qwýwýwýwb÷ ~èf�ÁRùÁ5ÿòÁ A A A Î5ì÷5¨èW W wÊüÂÂBàÁû÷ ô@‡Á5?=w ûõ5  ÷5 "ûA÷ ÐÁmðú,ƒÁmâø(‡ÁíÚøÁeÿÁEÿÁ A A A B Î5÷ ¼ø‚ B ÷5´ú÷5¬ú ®øÂ5Á^÷ Dw<ü÷5 ®úEÂdùÂíbù   æ¤ú÷ �ç€ÂŒ  N‚%ƒ÷5 Äç ÷5JúÁ\÷ ð÷U `ú Á[÷ Üw°÷U@Hú÷5@ú÷E@:ú÷5 zçÁ+wÊ÷E"úÎ5 ÷U€úÎ5÷U€ ú÷ çN�Î5K÷5èÙ5ÁÌúf÷ ”Ö5?� ÷5¶ù÷5®ù÷5 Êù÷5@Äù÷5 çõ5 w`¸ù÷5îæw`ºùõ-¨ùƒwûÃçs�"Á{÷ wŽÙÁ|÷ w‚ÙÁ}÷ ôwvÙ÷5 <ù÷54ù÷56÷÷5ù÷UBù÷� ù ù÷�è÷ù÷•2ù÷� ù(ùÁöö÷ æ€u wzÎ5@PÃòÔ÷ Xù÷ öå�õ5 ÷5 ìø A÷ Üå�÷ ”ÁlÁåÁªøÁl‡w ùwžùTóU€÷ | ‡÷ ¨å �÷eÿ‚ù÷Eÿ|ù÷ xùwúwúÃeó5 ÷ bùË w ÷Xù7RùË Ö Äe÷ ºøÁT"É2ùá,ùÀ¬÷ Øõ‡À÷ âßY‡õ5€Wu½VÃùÄ ùó,A÷ å€÷ ¼s- IÁ, C‚ó5 ¶”÷ PøÁ÷ êä�w ÆøA‡T÷ :øÁw¸øT÷ œ†wNùõµ@ó5%ó5 ÷ ªä�BÂEøÿ· ˆø†Á5Á6Á7Á8 Á9Á:Á;Á4Á<ÁcÂ÷ äwfס � � � � � ‡¡A A A A A A ‡÷ Œ÷ ÷ †÷ÁøÁì÷ Êÿ� TB÷ p÷Á÷5Rä±%T÷ X÷÷ öã�÷ JÁ÷ Rôþÿ÷ >÷ÁÀ÷÷ TÔUó5€ôEþÿ ÷ ÷ ÷ ÷¡‡A A A A ÁEøÿ‡Â  ÂÂEøÿ‚ ”�‡÷ Þÿwz÷Á Áe€ÿT�‡� Áå@ÁE?àÁ Á L‡ÿ X쪒8Àî÷FÿŽÞ÷BÿŠÞÁP"Éea ÷ ŽüÀÒþ7ŽúÄè&(—#ÿ*‚ Í ä ÁæþW#OVCÀø"ÐÁ ÷ |È•:Àø"÷ dáÁPæT÷ ÿ ÷ ÿU%÷ <Î ÛÖ ÁÁ)÷ LwšÞÄeÁ ü÷ ÖþÔ ÷÷ ÎþÔš÷÷ ÆþÔ”÷÷ ¾þ%÷ ¸þÔFþ÷ °þÔ<þÄe÷ ¤þÁÊë÷ rßÒ‡&7 "þ7&þ÷e þ7 þ÷eþ÷U�þ÷5bë 7,þ÷e2&þ7*þ÷e:$þ÷5Fë Á~ë1 "1"ñmrë"1 "÷5ÒÝ÷5ÊÝÁZë1Š"÷5ºÝÁLë1Š"÷ ¢Ý ÷Üöšý÷Øö²ý÷�Ôö«ý·  ýÅbÂ&ë·0å÷ëtâ÷ ÒåÂåAwå÷ Äåõ w­ vý‡BAñw`ý·úä÷ ¢å5÷ ÒåÃ:ýÄ8ý˜ê× ÊQ!|³÷U8ý,°ê× Ì~!00C]Û\l1DATADATADATADATADATADATADATA€W$Âlê× ²K!|³Â~ê× x!|³Âfê× q!|³ ÂTê× f!|³ ÷5ÒÜ ·pä÷´á÷ JåÁ"ÂHê‚ U ýÁ<ê7Näw”á÷ *å÷5@‚ü÷5€züÖ ‡ÅbÁ"Âê‚ U ýÁ�ÑfüÑdü‘ÅbÀFÐ xW!î! ‡ÀîÁN"ñeI ÷ Øù‡ÿ ,ò†Þ0ÿ $òª’8Åî7 öÿ÷ÿ¬æ÷lìðã÷ NçÀbð5€0¼wìwþw 0ÜðEðU@÷5€¶ü Á üÁ A A A ÁEøÿpPðE@÷ ¬ë € W à†÷ Îwvÿ7 nÿ÷5Öë×-bÿð‡· ^ÿwæ×-Rÿ€ø†wJÿk÷5øÿBÿ÷<ÿàù7 6ÿ÷Ôù÷å(ÿÀ÷ ÆùÀ üÀ¬ÁR"÷ ÀûŲùÃÿ¡ ‚ ‚  ÂeÃEøÿÀà À ýÀ÷ L†ð¥öÿ*wú° z‚‡Ca× u‚ð¬ð@ð@÷ l‡ðe@Åå@ñÁBùÁe?÷ æw`ŽþÁe� � � w`Úýw Ôý÷ zþ˜‚÷ù& ÷ Œê"�÷5zÝ÷ `þ÷%#Àâ÷%ç_ºâÎ ÷%è_®â Ž ÷:û¬âÁ¸êñÿÿbÁy÷ ˆ÷PýÞä÷žê"â÷ ¸åÖ  €÷~âpâ÷,êÂä÷â÷ œå ÷fâXâ÷êªä÷îá÷ „å‡Á'Á�ÁÂJ Á3Á4ÂfÁN÷ wâÜ¡ � � � � � ‡ÿ ¤òª’8ÿ œò ö9ÿ ”ò <:"S ŽÞˆ÷ ’õ5õ5 ÷ øå Á’QQ"I�!wHwJÀVH"` È0Š`" 7 ÿ÷5ÂåDÄmRóÌ‹÷2ÿ@$f&w(úþw�êþw0æþ7 Øþ÷5âòw6Êþ·(í÷èòlê÷ Êíõµ ,·¾þB „Dmw´þw°þC÷òì÷²ò6ê÷ ”íA �àw Žþ †÷„þB Bmé„à7!xþ†w„…õ‹=N- w ¬ì÷ Tíõ‹2�·žì÷ FíE  Åm.þ7Œì÷Ðé÷ .í÷&ê|ì÷ Àé÷ í÷êþýÀíêÁê÷ 8ûÀm ê7�ìýæHÿˆ†Á$Á? Á@ÁÁ,Á÷ B wœä÷ päTÀœÁÞ  ÷ P >‡ÀÞðÞýðÚýð�Öýæpÿˆ+‡ææ)ÿˆ%‡÷Š´ý"ÀbÁ’÷ >7lî¦ýw  ýÀPИýЖýÐ�ýÈŽýÁ¿Á¼€ÁDý÷ ¾åôÁ#wdÿÁ!ð¥ðÿ*¬ð¥æÿ*òÁ¥÷ Öð �Å D Å D Å D Å D Å D Å D ÷5®ã5÷5úð1À&$Á˜É †�÷ ¦0,%ð ì"7Ðü7úüwøü7ôüÁ˜1lìI ÷ t&€÷ „‡Îe÷Ö 7 –ü2wºþ÷ Fð€Á†ü÷ bö‡'æzüÎEøÿÎ Î Î Î Î Î ædüŽ Ž Ž Á�#�NàÁ Á Á Á Á Á Á Á Á ÷ Ò‡ìÖ �ÕÅb@ÁT÷Ú÷ à÷ Òïe�Awü÷ üõ "7 üÁmüwòû÷ òû÷ lÅbÁàû÷ Îã†w€þ&@ÁT÷ ’€5:um:÷ Äûu:"õm¸ûõå:A<Á Á Áe>`u$C&7Šû· €ûÂzû·àvû7Òé·ç÷ ®ê÷ fûÀbÁVÉea ÷ ÷eNûÀJûÝ€· é÷`ïäæ÷ Bê7 @û÷5 LçW&ÅbÁDï÷ ã†wÐý7 û÷ûlé÷,ï°æ÷ êf w- ûNmf f5÷ &ê÷ìú<é÷ äé5 õÖúõÜúõØúµµ µ õÂú5 5 5 õÚàõ(€÷5žî æ˜úÎm¦îDÄm î Œ÷ :î�”î2b÷ xúÁ�€æwÐ}æ÷–àxæ÷ šé÷dæ°è÷ XéwÐeæ÷ ˆé÷ NúÀÀe7”è÷Øå÷ 6éõ4ú÷ dé÷Vàzè÷`î¾å÷ é÷E,æ÷U(æ÷ ú÷ú&æ÷þå,ú÷ 2é÷5öífÅb÷>è÷‚å÷ àèwúÃe ÷&è÷jå÷ ÈèwòùÄõ5ÄUÁ ÷ ’á†wJü÷òç÷6å÷ ”è5÷ ÄèÀ ,7Øç÷ å÷ zèõ�¤ù5Šõšß5õEðÿµŠ õˆù ÷ Šè&ÀzßÀm€í�Áe÷ jÀjùÀmJí�÷ pÃe÷ Tù§‡fæ¶#‡Ž·ÆÀbÁP÷ Ä÷  †¬*öÿ/° ,‚‡Ãm × &‚ðbð@ð@÷ Z‡ðe@Îå@ñÖ ÷e¤øw žøÎ%†ÅeD ÎåÀ…cD Ö ¡‡Á�ÁÂJ–%±õæ¬øæªøf,Îírø·ežøw ˜ø÷e”øw ŽøÄŠøÅˆø÷ ^ðbðð÷ ¼…„æ4äÎí2ø…eD ÷ 4ðbðð÷ ’÷ ä ÷U ä÷ Š÷ ŽÅm.øD å‡À BƒÃEþÂ@&Ž  ‚ÕÂÂe÷ Z‡7$æ÷hã÷ ÆæB7æ÷Tã÷ ²æD7úå÷ ¢æõ­Ì÷õƒwêå÷ ’æ ÷ Äæ7Úå÷ ‚æu÷ ²æwÊå÷ ræ ÷ ¤æ·¼å÷ dæM÷ –æ‡  $00C]‰V§3eaek›’÷äý÷Üý7âýwäýwâýæ$ÿˆ ‡ææ)ÿˆ‡÷вý‡Á(÷ nwÈÛ"S ˜&Þ&’&÷ p&wrÿw"jÿw�!bÿ@$7¤â÷èß÷ Fãw–â÷ Úß÷ 8ãw8ÿ@íA÷ Rñ@m7�&ÿæh&ÿˆf‡÷ ´Ú)Àœ&ÁÞ&  ÷ ”d‡ñÿñÿñ�øþæz&ÿˆ]‡ææ)ÿˆW‡÷ŠÿT@Áp&÷ ˆþ7lîÎþw ÈþÀ&$Ãe<Áp&÷`ü÷ fþæ/& ö &Ž ÷ pÄ7àá÷$ß÷ ‚âwÒá÷ ß÷ tâÀ®÷ däÈ• ” �÷ ºÐ•.÷ Ê÷ .Ó ×–%‡Á$ÁB÷ ¦wÚÁ#ð¥æÿ*öÁ(ó× && ‡À&$Ár&Éea ÷ Êý‡÷ Òá÷ <܆À�÷ „á‡7Ù÷Ù÷ÿÿÙÀ(ÙÀÙHÁ÷ üØ@ÁòØ÷ (ॠ÷äØäØ÷|³ÜØÙÁ>÷ wnÙÿ @ï†Ò0ÿ 8ï†Z1ÿ 0朗8ÿ (窱9ÿ ï L8ÿ ï ö9ÿ ï <:ÿ ï.l8õ5wFõ �wBõEõU÷ 0ï÷ ªó=�÷5îó9ææÎmô·2î÷vë÷ ÔîD+Äå7î÷ `ë÷ ¾î@ ÀmÊóf5 ÷ âî÷ ì7öí÷ :ë÷ ˜î€ÀmÊó5 ÷ Âî÷ ÌÁ ÷ òçÌÖ D&7Äí÷„óë÷ fîB�µÀ÷ ’îCÃmjóæC Á÷œí÷ DîµÀ÷ tîõ5 $ÂC÷~í÷ &îÄ ÷f·ní÷ îµ÷ Fî÷8å\í÷Bó ê÷ þíu&÷ .îÁó÷ bç€÷ œò �74í÷xê÷ ÖíA÷ Dç‡ÁAÁM÷ ò w„å7 í÷Nê÷ ¬íÂC÷öì÷:ê÷ ˜íõ ôf·àì÷ ˆí�÷ ºíÖ 7Îì÷ê÷ píµ÷  í‡fffõ x€õ x÷5Jòõ :q÷5èäõ5÷ Îä ÷ Ôe‡÷Närì÷Xò¶é÷ íõ5÷ êý÷ ¶ ÷0äRì÷8ò–é÷ ôìµ÷ $í‚�Àò÷5ŒäW f— |³(ÀÖñW ÊQ— |³ ÀÂñW ²K— |³ÀæñW Ì~— €WÀ¼ñW q— |³À´ñW x — |³ 7Îë÷é÷ ¨ìÀšãÁ¦ñwÚåÁMÁ]÷ Š wäW-ÊQW-|³ÁLñ Á ÷0ñˆëwÎè÷ ,ì� €b 7të÷¸è÷ ìÍ-@ãÒ Á ð¡‡Á~±û h÷äý÷Üý7âýwäýwâýælÿˆ ‡ææ)ÿˆ‡÷вý‡Á(÷ Øwjá"S ì 2!æ ÷ ”FIXEDFILE ID:(÷ dê7 ôÿ7 òÿ& ÷ ,ã‡À Á÷ úwÜÿ ‡È¥ Ž ÷ æwÊÿ÷îè÷`å÷ ¾èÅbD7è÷îíLå÷ ªèDÎ5 Î Ž ÷ŒÿŒÿ÷|³„ÿÝÖ wðé÷ xÿw-pÿÞw-jÿÚ ff(& NÝ f&fÀ®A÷ vA÷ nЕ ÷ Üß w\ßw"Xßw�!Tßw�!Hßw"Dß&@$7bç÷¦ä÷ èwTç÷ ˜ä÷ öçwTþ@íA÷ ö@m7�BþæÆ ÿˆ†wú÷ nß%@Á�·ç÷øìVä÷ ´çõ5Dw&úæ÷ºì>ä÷ œçõ5€8Àm¦ì7àæ÷ $ä÷ ‚ç3Àð Á2!  ÷ ´#‡Á�À2!ppp’æÎ ÿˆ‡ææ)ÿˆ‡÷ŠÈý Á”@÷ TýÁ”qmîI €÷2û÷ 8ý€A÷ <A÷ 4Е �B÷ Е ·Hæ÷ìŒã÷ êæõµ w 0æ÷ ØæA÷ üA÷ ôЕ �W cЕ W Е  ÷ ÄЕ.Е �÷ Pë€A‚ ÷ ²÷ @ë�÷5„ë  ¨0œþÿüÿ0œÿÿýÿ0’þÿ0œÿÿÈ•0”Е Ð�¾üÐ�»üÁ¸ü ÷ pЕ:Е-÷ âÝÂdÝÃbÝæà B à B à B �ÁÁEøÿÁe0P�Î ñÖ ÁV!÷ `àÁ.Ý ÷ "Е, Á Ý÷ Е)ÁP!Ö5÷ 6à÷ wýÁ$÷ w”Ý:://--JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC;; c¢ w0& Á�  ý÷ Zð¥0þÿwð¥9þÿwø— :Â¥- — /;ÎUÄŸ$ÖÅî$ÎUÄ¢$ØÅò$ÎUÄœ$Ã�Åâ$U W‡U U‚SŒ „ Â¥-÷ RK‡÷ Üð¥0þÿEð¥9þÿAçÌ‹ô‹;£:8Â¥ «Â¥ 2ÀæéÀå 7êã÷.á÷ ŒäŽ †À´Û7¬Ô$°Û †À%÷5¤Û÷%šÛÜ÷Zá÷Zá÷Tá– †Ã�ÁhÑÑÉ÷ xä‡Á÷ jwüÛÀvéÀå 7zã÷¾à÷ äÀhÁ�ÑáÑáÉþàÅ�À®Äœ$÷ PÌ‹•úЕ AMu÷ 6Е-AÁ W †Á Á Pœ¥$Pœ¦$Pœ§$Е-÷ wêÂJÁ wÖ&@Á ÷ ÂñÁe0Àe0€��P�‡7°ÚÂ¥$ÁÀ¤ÚÊ‹ ¤üÁ% Ò‹þ� ó¤w†Ú¡±‡À@è7šâ÷Þß÷ <ã@‡7„â÷ ,ãõ-VÚôõ¥00C]Û\l1DATADATADATADATADATADATADATAõ¥ìfÁ÷ €Ü7Zâ÷žß÷ üâ�÷ .ãÝÿ �ð†0ÿ ˆð†L0ÿ €ð†Ò0ÿ xð†Þ0ÿ pð†Z1ÿ hðª’8ÿ `ðª¬9ÿ Xð.l8·øÿ÷ P÷ º÷ Â÷ Þw bÄ ÷÷5@Òÿ÷@÷ þ÷ úw8Ƽÿ÷ 0w¼BOOTDENS@pä÷ Ö-‡÷ Ð*‡÷ �K— :$ã5 !Ãô÷ ´‡× úƒ7 lÿ×¢/Á˜ 7 `ÿ÷ Èð‡ …|¤Ñ‹þÔ É‹õ×¢ ÁwxÿÁûƒ× Ó• úÓVM ÓÓææ=ÿˆ‡ÂÃN÷ <à‡÷ 6݇¤:Ú¢ ×÷%DXêþÚ÷%DYâþÖÒ÷ ð¨ ÉW €Ê· ÆþË ”×¢0‡Ó¥9†×¨A‡Ó¥Z‡ààDD€ $ MM@àü PP  MS@Àü CT@ÄÌÔDT€ÜäMT@àü DU€€< D MU@àü DX�ìôDY�, 4 ÿÿæ ÿˆ †Â¤·ºÊàÁ,÷%DYnÿ 7 Ž7 ’÷Pz÷ 8æ®ÿˆÀ˜†æ¨ÿˆÀ€÷ êýÀ%DXÀ%DY ÀØýŶÅe ü‚Á$wþÁûC÷ ²ýÀ%MMÀ%MUóÃU÷œý€×­@ wPþ÷ üà €÷ö÷ ´à €÷@èæà €Î·â÷ –à ÄéÄåÂéÄ Â&à ÷ ñ€!ìƒÄìÂà €!pƒÄpÂà €÷ Îã !pæÄèÎå!‡Ä Âà €×-ŽÜ!ìƒÄèÂà €À÷¶P÷`@÷ þ÷5€0þwôþ7„7 :·¬ü!Á€Â÷ ¨÷ lð€Õ ]) ¶FÀ  ÷ 2‡ððb‡À!ðøû0÷ ñ†Á ÂJ'@ wZÿ÷Jÿ÷ · Tÿô…7Fÿæ¾ÿˆ†×-”àÿÿ æ1ÿˆòæºÿˆ÷‹ÿ€×-ÿÁKwÒû‡÷þþß÷öþÛÿ 6øfl ÿ .ørl ÿ &ø~l ÿ øŠl ÿ ø–l ÿ ø¢l ÿ ø®l ÿ þ÷ºl ÿ ö÷Æn ÿ î÷Òn ÿ æ÷Þl ÿ Þ÷êl ÿ Ö÷öl ÿ Î÷l ÿ Æ÷l ÿ ¾÷l ÿ ¶÷†0ÿ ®÷ª’8ÿ ¦÷ L8ÿ ž÷ ö97÷”áw îþô€Š € !‡ öàÁ@ÿÀÅ× à‡ÃÀße€ìôDɕɋþ€Ä SœùÉÕɵ ýÉ ÿ�×  Æß zÅ ìôÃÀÙÀ ך ŽàÆ÷ Cßà0þÿÄàôÅÀô ÕÀe€!îôøƒä€ NõŸ zÿ ÄÀ_ìôÌ ‡Åe W!€÷‡D… … … À4 ‡@À ÃÄåêôÄ aÔ ŒÔ Ô× ü‡‡öU_7Ê÷”áÈw îþô€Š € !‡ ¨àÁ@ÿÀÅDɕɋþ€Ä SœùÉÕɵ ýÉ ÿ�× Æß dÅ äÀ âb VàÆ÷ '  Ì ‡Åe ÄeW!€÷‡… … … À, ‡@À ÃÄåaÔ ŒÔ Ô× ü‡‡öU_7¬÷”á(w îþ† ô‡ ŽàÆ÷ Cßà0þÿÄàôÅÀô ÕÀe€!îôøƒä€ NõŸ zÿ ÄÀ_ìôÌ ‡Åe W!€÷‡D… … … À4 ‡@À ÃÄåêôÄ aÔ ŒÔ Ô× ü‡‡öUÁâþÂÀ À À�ƒ Š Àe ñ€à (11 Â50ÉUɕɋþ€É ú€ñ þÿ€ÉEÉ•É5€€ö�üW,ôè‰�É‹þ€É �Âeӱɕÿ†_7t÷”áÈw îþ† ô‡ VàÆ÷ '  Ì ‡Åe ÄeW!€÷‡… … … À, ‡@À ÃÄåaÔ ŒÔ Ô× ü‡‡öUÁâþÂÀ 11 ÉUɕɋþ€É ú€ñ þÿ€ÉEÉ•É5€€ö�üW,ôè‰�É‹þ€É �±É•ÿ†_00C ]‰V§3eaek›’7p÷”ánw îþ† ô‡ RàÁxþÉ‹þÂÀ ÂUÀÀÄÅÆÎÎe>Þ €S’üÄ ‘¥Þ û�$©Å × à2†!‡ÄeæÀ êøá ÿ�ÂÞ ‘ñ‹þÿý÷€Þ ú! ß ÖÀ À ÄÅ ìôÃÀ€ ÂÇÅ W!óÿÒÅ ÄeÄeËÃÀße€ìôÈ ŽàÆ÷ Cßà0þÿÄàôÅÀô ÕÀe€!îôøƒä€ NõŸ zÿ ÄÀ_ìôÌ ‡Åe W!€÷‡D… … … À4 ‡@À ÃÄåêôÄ aÔ ŒÔ Ô× ü‡‡öU_7 ÷”áw îþ† ô‡ àÁxþÉ‹þÂÀ ÂUÀÀÄÅÆÎÎe8Þ €S’üÄ ‘¥Þ û�$©Å !‡ÄeæÀ í®á ÿ�ÂÞ ‘ñ‹þÿý÷€Þ ú! ß ¾À À ÄÅ € ÂÍÅ W!óÿØÅ ÄeÄeÑ VàÆ÷ '  Ì ‡Åe ÄeW!€÷‡… … … À, ‡@À ÃÄåaÔ ŒÔ Ô× ü‡‡öU_7Ô÷”áF÷ŽáR÷ˆá¾÷‚á†w Üþô¬ ¬"N#¾#Ð$B%‡  ”àÀÀ7èÿwæÿÀÄåÄ5#SMA#UMwÁ õÂ9¡ñU ‡ññþñÿ‰PÉ‹þ€É ÿ�À óÅ¡ÁRõÂ`ñÿ‡ñ5þÿüñþ‰PÃà þñ5þÿüÉ ÿ�À ðÅMÂÂePÿ7 Jÿ·NÿÂe·<ÿ7 >ÿÂeøÿC£É‹þ€÷À.ÿ÷*ÿ7 (ÿ÷$ÿ ‹É‹þ€É €DÄEñÿÄ%Ä% ÿÅ Å÷UðþWÿÄöþÄEÿ¯Ä%Pðÿ÷mÞþØþ†· Ôþ ÷EÈþÀ ÔÅÁeÀ„…þÿÊò4m ñ þÿÉ ÿ�Ê ü�f ÎEàÿÖ ÿÀ ìÅ 6öU÷þ–÷þýŽÀÿ TÀ ý÷~êý÷zæýÆ÷ 9ßà0þÿÄàôÅÀô ÕÀe€!îôøƒä€Ÿ zÿÅ>… Å Å Å w8 ÄÀ_ìôÌ ‡Åe w!"÷‡D… … … À ƒ@À Ç  2à÷ ÄåêôÄ aÔ ŒÔ Ô× ü‡‡öUÁ õÂ9¡ñU ñþñÿ‰PÉ‹þ€É ÿ�À óÄ ÿÅžÿ_ 2à÷ ÄåêôÄ aÔ ŒÔ Ô× ü‡‡öUÀÀÂêô ¡B B B B B D B D 7Èÿ7ÎÿÂe<·ÄÿÂe·²ÿÂeøÿQC£É‹þ€÷À¦ÿ7 ¤ÿ7 ¢ÿ÷žÿ ‹É‹þ€É €DÄEñÿÄ%Ä% ÿÅ Å÷UjÿWÿÄpÿÄEÿ¯Ä%Pðÿ÷mXÿRÿ†· Nÿ ÷EBÿÀ ÔÄþþÅüþ_ 2à÷ ÄåêôÄ aÔ ŒÔ Ô× ü‡‡öUÁRõÂ`1 ñ5þÿüñþ‰PÃà þñ5þÿüÉ ÿ�À ð_ 2à÷ ÄåêôÄ aÔ ŒÔ Ô× ü‡‡öUQ00t€@€€¨KPsP÷0¬ÿð þÿÈ ÿ�Ë ü�f ÎEàÿÖ ÿ‡7ÜÂÂeÌÿÃÃe¾ÿÄÄePÿÅÅe~ÿÁêô vw`ªÿw ¨ÿ7`¤ÿw`˜ÿw –ÿ7`’ÿw`ˆÿw †ÿ7`‚ÿææææÀÖþô�ÐþÁPÈ ÿ�H0üˆÁ ù€‹££³þÿô•÷ Vÿô• ÷ Lÿô•%ô ÷ <ÿô•%ô ô ÷ &ÿŒ ô•!ô ô 4 4 ÷ ÿ4m t × öÄBþÅ@þ_7¨÷”á÷Žáú÷ˆá^÷‚áöw Üþô¬ ¬""#Š#x$â$‡  ”àÀÀ7èÿwæÿÀÄåÄ5#SMA#UMwÁ õÂ9¡ñU ‡ññþñÿ‰PÉ‹þ€É ÿ�À óÅ¡ÁRõÂ`ñÿ‡ñ5þÿüñþ‰PÃà þñ5þÿüÉ ÿ�À ðÅMÂÂePÿ7 Jÿ·NÿÂe·<ÿ7 >ÿÂeøÿC£É‹þ€÷À.ÿ÷*ÿ7 (ÿ÷$ÿ ‹É‹þ€É €DÄEñÿÄ%Ä% ÿÅ Å÷UðþWÿÄöþÄEÿ¯Ä%Pðÿ÷mÞþØþ†· Ôþ ÷EÈþÀ ÔÅÁeÀ„…þÿÊò4m ñ þÿÉ ÿ�Ê ü�f ÎEàÿÖ ÿÀ ìÅ 6öU÷þj÷þýbÀÿ TÀ ý÷Rêý÷NæýÆ÷ #Å:… Å Å Å w4  Ì ‡Åe Äew! ÷‡… … … À ƒ@À Ç  *à÷ ÄåaÔ ŒÔ Ô× ü‡‡öUÁ õÂ9¡ñU ñþñÿ‰PÉ‹þ€É ÿ�À óĨÿŦÿ_ *à÷ ÄåaÔ ŒÔ Ô× ü‡‡öUÀÀÂÂeàÿ7 Úÿ·ÞÿÂe·ÌÿÂeøÿC£É‹þ€÷ÀÂÿ7 Àÿ7 ¾ÿ÷ºÿ ‹É‹þ€É €DÄEñÿÄ%Ä% ÿÅ Å÷U†ÿWÿÄŒÿÄEÿ¯Ä%Pðÿ÷mtÿnÿ†· jÿ ÷E^ÿÀ Ô00C(]Û\l1DATADATADATADATADATADATADATAÄ"ÿÅ ÿ_ *à÷ ÄåaÔ ŒÔ Ô× ü‡‡öUÁRõÂ`1 ñ5þÿüñþ‰PÃà þñ5þÿüÉ ÿ�À ð_ *à÷ ÄåaÔ ŒÔ Ô× ü‡‡öUQ00N%€%€€‚%KPsP÷0¬ÿð þÿÈ ÿ�Ë ü�f ÎEàÿÖ ÿ‡7´ÂÂeÌÿÃÃe¾ÿÄÄePÿÅÅe~ÿ7®ÿw¦ÿòÀÿô�ÿÁPÈ ÿ�H0üˆÁ ù€SK3sô•÷ ~ÿô• ÷ tÿô•%ô ÷ dÿô•%ô ô ÷ NÿŒ ô•!ô ô 4 4 ÷ .ÿ4m t × öÄrþÅpþ_÷ °þ ÷Àÿbþ÷ˆáÒ7ŠæÿÀ`!æb &÷ ®þ€ÃbÅÚJJeÍe@f•Šef•ŠeÁ”U�7Š´ÿJ`B!ø‡ ‹÷‹¨ÿ÷‹£ÿ €" ‚Ðþ ·Š‘ÿðe þÿ 7Š…ÿ&w zþKÖ€÷•pÿÎ Í‡Ä Å—%b æˆ"ÃH! �„ ÀÊÀýÊEÿ¥Êåå% % Êe ‹w ,þ Ö w|þÅÅe@_A Á ý÷÷ °þ ÷Àÿbþ÷ˆáÒ7ŠæÿÀ`!æb &÷ ®þ€ÃbÅÚJJeÍe@f•Šef•ŠeÁ”U�7Š´ÿJ`B!ø‡ ‹÷‹¨ÿ÷‹£ÿ €" ‚Ðþ ·Š‘ÿðe þÿ 7Š…ÿ&w zþKÖ€÷•pÿÎ Í‡Ä Å—%b æˆ"ÃH! �„ ÀÊÀýÊEÿ¥Êåå% % Êe ‹w ,þ Ö w|þÅÅe@_A Á ý÷7¸÷”á°w îþ† ô‡ šà7Ú ŽàÆ÷ Cßà0þÿÄàôÅÀô ÕÀe€!îôøƒä€ NõŸ zÿ ÄÀ_ìôÌ ‡Åe W!€÷‡D… … … À4 ‡@À ÃÄåêôÄ aÔ ŒÔ Ô× ü‡‡öU7ÜÁFý ìôÃÀ÷P÷ ÖÉ•÷ ÎÉ• Ä ÷ ÂÉ•÷ º ŠÅ÷ ¬ÅI‘Â÷ ¢ ŠÂ û÷ ”É•Å÷ ˆÅI‘÷ ~ÅI‘÷ z ‘Ä÷ r ‘Âa(÷ fÉ‹÷ `@Ä€÷ VS’÷ PS’à Åþÿ÷ @À õE÷ :@ÀP!ÿ áÂ÷ $ɋ ûQ$ßeìôÃÀ×  · ~ÿw*ÿDaD ñ5€þÿü‡_7€÷”áhw îþ† ô‡ bà7œ VàÆ÷ '  Ì ‡Åe ÄeW!€÷‡… … … À, ‡@À ÃÄåaÔ ŒÔ Ô× ü‡‡öU7ÌÁFý ÷P÷ ÌÉ•÷ ÄÉ• Ä ÷ ¸É•÷ ° ŠÅ÷ ¢ÅI‘Â÷ ˜ ŠÂ û÷ ŠÉ•Å÷ ~ÅI‘÷ tÅI‘÷ p ‘Ä÷ h ‘Âa(÷ \É‹÷ V@Ä€÷ LS’÷ FS’à Åþÿ÷ 6À õE÷ 0@ÀP!ÿ áÂ÷ ɋ ûQ$×  · ˆÿw4ÿDaD ñ5€þÿü‡_00C0]‰V§3eaek›’7¸÷”á¤w îþ† ô‡ šà7¢ ŽàÆ÷ Cßà0þÿÄàôÅÀô ÕÀe€!îôøƒä€ NõŸ zÿ ÄÀ_ìôÌ ‡Åe W!€÷‡D… … … À4 ‡@À ÃÄåêôÄ aÔ ŒÔ Ô× ü‡‡öUÄ Àñ5 ÀUÄ Â · ŠÂ ·¢À À À À 7a–7bà„ ‚„à±D à ù‘ŠÄÄ% D à Ä`Ä`Ä`ƒ „àþ„`ƒ „ ÀU É5€ýÿ�1É5€ýÿ�ñÉ5 ýÿ�ÄÀE É5€ýÿ�€±É5€ýÿ�qÉ5 ýÿ�„ !†ÅmÚÿÅmÖÿ®†À5ÀU¨ÀU ÀE£_7€÷”álw îþ† ô‡ bà7j VàÆ÷ '  Ì ‡Åe ÄeW!€÷‡… … … À, ‡@À ÃÄåaÔ ŒÔ Ô× ü‡‡öUÄ Àñ5 ÀUÄ Â · ŠÂ ·¢À À À À 7a–7bà„ ‚„à±D à ù‘ŠÄÄ% D à Ä`Ä`Ä`ƒ „àþ„`ƒ „ ÀU É5€ýÿ�1É5€ýÿ�ñÉ5 ýÿ�ÄÀE É5€ýÿ�€±É5€ýÿ�qÉ5 ýÿ�„ !†ÅmÚÿÅmÖÿ®†À5ÀU¨ÀU ÀE£_7º÷”áw îþ† ô‡ œà7 ŽàÆ÷ Cßà0þÿÄàôÅÀô ÕÀe€!îôøƒä€ NõŸ zÿ ÄÀ_ìôÌ ‡Åe W!€÷‡D… … … À4 ‡@À ÃÄåêôÄ aÔ ŒÔ Ô× ü‡‡öUL0à€¬€€ð þÿÈ ÿË ü�õ ÿKPsP‡7´Áêô vÂÂeÄÿR`J `R`J `Ò R`J `ÂÂe²ÿÃÃe¤ÿÄÄe6ÿÅÅedÿææææÀhôô�”ÿÁPÈ ÿ�H0üˆÁ ù€‹££³þÿÂ( þô• 4 ÷ `ÿô•!ô ô4 4 4 ÷ >ÿ´ 4m t × ô_7‚÷”á¸w îþ† ô‡ dà7à VàÆ÷ '  Ì ‡Åe ÄeW!€÷‡… … … À, ‡@À ÃÄåaÔ ŒÔ Ô× ü‡‡öUL0.!€ú €€b!ð þÿÈ ÿË ü�õ ÿKPsP‡7–ÂÂeÖÿÃÃeÈÿÄÄeZÿÅÅeˆÿ7¸ÿw°ÿòÀhôô�´ÿÁPÈ ÿ�H0üˆÁ ù€SK3sÂ( þô• 4 ÷ ~ÿô•!ô ô4 4 4 ÷ \ÿ´ 4m t × ô_÷ø¼æÂÚ" — .#ü‡÷5ôwh÷ T÷ ~‡·�r÷ F÷ p‡·�e÷ 8Â¥:÷ é†w®Â¥/Áw@Ä1#÷ ¥!÷ 0óÃ÷ ¥íà ú÷ Øèè‡Â¥=å÷ Ìèâ‡À ÷ xÁ ݇Áe?Ú‡÷ Jwô#À ÷ âÑÄ.#Ã÷ ¸¥Éà ú÷ �èć¥=Á÷ „辇À �÷ 6w®‡÷ ,w¦†À ÷ dè‡wRÿæð Þ .‡w-”úó5?õ 9÷‚7Š Þ ‡w-lúÂ,÷· n·,í÷pê÷ Îí÷­ËêNèƒ÷�ÃêFä÷ ¢æØÖ]Ö÷ „wˆ÷ àç‡Á ‡wÎþÁQÁVÁuÁW÷ †wDå— A‡Â¥Z‡ÃbÀð37´ì÷tòøé÷ VíÄœ3ÁÂóE÷ xíÀ, Ä ÷ „ì÷ ,í3Á÷ \íó5 Ä”7fì÷ í³÷ >íÁò÷ tæÀ~ 7Hì÷Œé÷ êì3 ÷ íÀVÁR÷ JæÃþ"ÀÁP÷ :æ× #÷ÀÜ!÷ Îw² ´Ðæ¸ÿˆ†ß%ÿÿ& æ1ÿˆôææ)ÿˆ÷оý‡Á(Â$"÷ hw&â÷ úÿ Àßîÿ· êÿÀæÿ÷ L †ð¥öÿ*±ÂeHÁ w*7Àÿ7¼ÿ‡÷ ¸ÿ&÷ ²ÿÀ€U‡˜¬„:~!˜¬ ¾€!˜¬\}‚!˜¬€:„!˜¬a†!˜¬YMˆ!˜¬|…Š!˜¬<Œ!˜¬t!Ž!˜¬%�!v©€:’!v©a”!l©€:–!l©a˜!h©€:š!h©aœ!j©€:ž!j©a !z©€:¢!z©a¤!m©šÆ¦!¤‡ËQ¨!ô¨:^ª!©CE¬!=©è&®!D©ƒ:°!e©º²!t©š^´!v©š¶!v©""¸!v©?Tº!¿©8r¼!ì©|¾!ì©ÌeÀ!ì©”’Â!6ªýÄ!6ª€Æ!6ªÔ€È!00C8]Û\l1DATADATADATADATADATADATADATA7ª4Ê!7ªfÌ!7ªö&Î!T«|Ð!T«”’Ò!m«�QÔ!q«ˆZÖ!•«[MØ!ë«z}Ú!€Z"<"Ä™ðsâySYPARSIZEÿ Ìô2â&ÿ Äô2Ž#ÿ ¼ô>ˆ#ÿ ´ôJ¸#ÿ ¬ô†0ÿ ¤ô†L0ÿ œôªd9ÿ ”ôª’8ÿ Œô L8ÿ „ô:L8XXCOM÷ >ü÷m(û4úw .ú÷ |ë�÷% 0ú÷5@8ú÷ :ú÷-"ú"úÁSÂ$"Ám ÁT ÁUÁlÁ6ÂÚ"wêÀÚ"È ÈØùðÖù÷ ¸åá‡õ5€ä÷ ë€õ-¾ù ã÷¼ùòþ÷ Âþ÷ ^ý &÷ ΄7~å÷>ëÂâ÷ æÅbÂÈþ· ’þƒ·ŒþA÷ ¼ê€÷ |Á-zþ¹‚ƒÂ%¯‡Â%€†Ák÷ pÂÀ À ý·‚þõ5 2Áàê÷ ®Þ†w7Dþ5 5 õ"þõþ5 5 5 õþ5 5 5 õ ÷5~ê&ÎmˆêBÂm‚ê Šõ‹w´D- w ¦ä÷ Nåõ‹ó�7˜ä÷ @å7Æýõ¼ýõUõ5 >7xä÷8ê¼á÷ Rå7hä÷ åB „DmAwPä÷ øäC ƒà÷ lý †@B Bmí„à7!Xý†wLþ7$ä÷ ÌäÃRýõ÷ øä÷ä÷ ¸äµ u7(ýw 2ýC�õÐ÷ Òäw- ý à w Üã÷ „äõÐ÷ ´äÂý÷ *é€ ‚ ‚ ‚ ‚ ‚ ƒ ‚ ‚ ÂeÃEøÿà ƒ À° V‚ ÷ €†¬*öÿKð@ð@÷ �ùÀÁÐÂp÷ Z>‡÷å@¸ü Áe@ ó÷e`÷w Z÷å÷ ûÀ‰#È�güà�bü÷ wNü÷ wHüÀÚ"÷ "ã†w(ýõ5€Án70ü‡ÁÁoÂÚ" Á Á�ÁÂJ÷ ÀwNÛ¡ � � � � � ‡æÛ7 Û÷  ·Û‡Á†úÅ€úAá‚wFæÒûwÂûwöû÷ *܆w(7®û7¶û7`àûDÄíšö ‚ÁgÂŽ ÃГ“wÁe?÷ „ÿw´ûÖ ‡à Ã�æVöæTö÷`Pöw Jö÷b>öÄEþÄebÃb áÂHûƒ ƒ÷ .ø!bÅbÁ� Á ý7â÷Fß÷ ÜâÀ`Âà ÷eþõw øõÄbÃÞ·ìõ·æõ÷ÐÚõ Àîú÷˜ù$û7à ûÃbÄ&÷ ~7¬á7òÞ÷ PâÎe÷,Æú+3 ÎeÄ$Ä5!7âúÅÎeúÿ÷ >sΜÎ쎊 �Ó&÷ ðÀ 7 °ú€Aaw ¨úƒ&ÎewàA÷ â÷ púwjúw*á7pÞ÷ Îá Åf÷ â@!éKÅÎe÷ ÐA!àsÄ÷ Xæ�Ô ÅÎe÷ °Ö s÷ ÀáB!B¦·Ðà7Þ÷ táÅÎe÷ †B!»Ö s· èù÷¬Úùƒ÷œÒù÷ €áΊÄöùaE÷ Z®7†à÷ÊÝ÷ (áÖËíÔùÀ÷ Ráw®þwVÁÖ Îí~ùÁjÃГÂ$"“““““ÂÐ÷ w¬ØÅí’ùÅ5æw!Lùã‡w!€ùà‚&Na·%vùÛ‚‡À~!  Ü!ü‡7 Jö÷Ü!Bö÷ Bö‡÷ ~öÅåÀ À%‡=÷ ïwfæ)Ä÷ XöÄ ûĦ)� î‚À ø *Ååê‡,*,*,*,*.*,*,*‡À` $ ~!#ú-÷ôµ@nÐ Ø n(rØ5o‡Áp À÷e÷ Áš À÷÷ ÷ lø÷ ÷pÁ” ÷ ÷RÀª!Á&Â$ð þÿ[ ùÁþXþ÷ w|÷ $÷ Œ÷Dþ<þ÷ À·Šþ‡Á,÷5rêá ÷ ”†w¾÷%TTÜýh÷nü ÷lü÷èýþ÷ †÷^üò÷Øýòý÷ t÷Ìýâý ÷%TT¢ýK÷4üÒý÷2üÊý7 ¢ýæd)Þ †wìw-|ýø÷,ˆýô÷€ý÷ ð÷ $‚ý÷ 00C@]‰V§3eaek›’’é€Âöû äæ†ý·‚ý·Š\ý÷ ·výÙ÷5¸éÐ÷�Âþ*Âú*�— +ü‡÷ 0Â+�— +ü‡wŒ÷D+Jý÷ 6ér�÷0+>ý÷Ô$6ý×-üü÷ª%(ý÷�û ÷øüýÿ ý÷€û÷êüýÿ ý÷• Óü÷dûì ÷Øüìüÿ îü÷TûÚ÷ÊüÜüÿ Þü÷JûÊ÷²üÊüÿ Ìü÷:û¸÷¤üºüÿ ¼ü÷4û¨÷˜ü¨üÿ ªü÷û– ÷vü–üÿ ˜ü÷ û„÷hü†üÿ ˆü÷üút ÷Pütüÿ vü÷ìúb÷Büdüÿ fü×-,ühæd)Þ d‡w- üú÷üÁFü Â5@Q$Â5@Q$Â5€ Q$÷5`è׬* Q$wü÷ R÷, ü÷ ‚Ó¦÷ öû÷ p·ŠÂûwàû÷ d‚Â5@@ÃÂ5€À÷5è÷œžû¸Â5 ´Â<úâ a·Fâ÷Šß÷ èâ÷�áßxû÷Šû”û÷ Žç€÷úˆû÷ 2šY÷Þùzû÷ tç�ÁÀ Áe ûw2û÷ �Û†ÁwT÷ &û÷bLû7Lû7Bû7 ûæd)Þ "‡w-øúú÷,ûö÷üú÷ l÷  ÷-tùzù·Šêú÷ ¶÷Šâú÷e þú÷ øæß�÷ öÜ÷ ìæ�÷îú‚á÷²úÆÞ÷ $âÀÚú÷4ùÐ÷ ÀbÁ’úw^á÷¢Þ÷ â7,zúðù ðxú÷ âëÁ ù ÈXú÷bú*áw$á÷hÞ÷ ãÂ:ú;úæ÷ á÷PÞ÷ ®á7úà÷>Þ÷ œá7¬ú7¬ú7Øà÷ Þ÷ záð5H߈÷ºà÷þÝ÷ ”á·¬à÷ Táú÷ ‚á‡÷ 6w ÙÀ À ÷ ‡×-²ùTT÷ JøÀe7tà÷¸Ý÷ áÁ²Ñ- ÞW Äú‡±‡÷‚ùøÝw’â÷ˆùFà÷®ùŠÝ÷ èà÷�äÝyù÷�ßÝrù÷�ÜÝ’ù‡wXù÷%TTJù÷ ®Ù+‡÷ Þ÷7Zù÷ žÙ#‡7NùÄD+Å0+æÜ ÷ ‚Ù‡÷ zÙ‡U%Ô Î ñÖ ÷ ¼÷÷ `Ù‡7ùÀb‡ÐÐ>å÷5^åÐàðÍéøþÿ‡Ð�áøЇ÷ù”ß÷ÄøØÜ÷ 6àÀìøÐðÐåкø÷ Àÿ÷ ¬ø ¦øÐÔðeþÿ û7¾ø÷ 8à‡Ð¤Ð¢Ð ÐzøÐœÐšÐ˜Ð–ДВ÷�ø$ß÷TøhÜ÷ þßÀb‡÷ "÷ nä �÷Føß÷løHÜ÷ ¦ß÷.ø²Ü÷ Ô߇Àd ÂÝ&øÂ   È�Bøˆ ÈUàà4ø·ÌÞ÷Ü÷ ¦ß‡÷—þÿ$_ @ÄÄEðÿÄ æêôßêôß Ÿêô‡_ @þ"##### # ###¢!¤!ž! !–!˜!š!œ!’!”!ÿ ªìª’8 ¦#" #÷ ª#$XX:Àç"7’öÿ7˜ñÿ÷ ¢ÁewrþÀ´#÷ ’Àd HÀe   ú‡ÀÜ!Á" Ã<"÷ ˆ.‡ð•#÷ t.‡÷ |ÀÜ!÷ ~߀*"Á"1 ÷ d‡æˆ#ÿˆ‡ææ)ÿˆ‡÷ŠfÿÀdÿÁbÿ7|ùwzùP ‡Á!ð¥ðÿ*Á Á"Â$"÷ üw¶ÝÀ~!  Ü!ü‡7 vû÷Ü!nû÷ nû‡÷ ªûÅåÀ À%‡=÷ ïwfÃz$Ä÷ „ûÄ ûÄz$� î‚À ø ò$Ååê‡%%%%%%%‡À` $ ~!#ú-÷ôµ@nÐ Ø n(rØ5o‡Áp ÀFüe÷ Áš ÀFü÷ ÷ ˜ý÷ 4üpÁ” ÷ ,üRÀª!Á&Â$ð þÿ[ ùÁÿ÷ z·�7ÿ÷ rÂ¥:÷ äà‡ÁÁQÁ& ææ"‚ÁuÁXÁY÷ jw>Þ& Ž�ÁZëæð Þ ä‡w-Üþúó5ã÷Ðþõ àwÊþß 7 Ìþ7ŠÊþ7 ¾þÞ 4‡w-¤þú øÂ\ @íA÷ 6ô@m�ÂU€è÷,Œþä· €þ÷€þ÷‹~þÜ÷vþ4å÷xâ÷ Öå÷ÜVþ÷œ`þ÷œ[þÊ ¥÷ ÀbÂ6þ·å÷Fâ÷ ¤å7,þ0 0 ÷ Èå÷ \ë÷þÖä÷–êâ÷ xå0 7 �þ7ŒþœðÀðE÷ Šå7  ä÷ HåËðÀ÷ tåð5 7,¸ý7zä÷ "åö°÷ PåÀžýÁ(ê÷ ‚Þ÷ Žýw÷ ´é,�†ý÷µ‰ý Á Á,÷5àé á Á Áe ûwNý÷%TT@ý%÷ "÷ Öû÷µEý·Š>ý÷ ÷%TTý\w ÂÝ(ý  ·Þã÷"á÷ €äÀxáÁýwêÝæn'Þ 9‡w-æüú Áþ"Â5@Q$Â5@Q$Â5€ Q$÷5@é׬* Q$É ß÷¾ü|ã÷Àà÷ ä÷œ®ü÷ 6É÷ J÷œœüÊÁ#÷ ÅÃþ"ÀÁvü÷ `Ý× #÷‡· û+ ÀÝnüÀ À 7$ã÷hà÷ Æãч Â5@@Â5€÷5°èˇÂ5 ÂÞúâ a·èâ÷,à÷ Šã‡÷ –7 ü7Šüæn'Þ =‡w-îûú÷,úûö÷ðûÀ ÷èû÷äû¢â÷<èæß÷ Dã÷ öç�3 ÷ nã÷¬ÆûÛ÷œ¾û÷ ž÷ @úӷаû÷ �÷%TT�ûË÷ Fÿ÷œ˜ûÄ÷ vÁ‡÷xûîßwˆäÁàçÄbw6â÷zß÷ ØâB%w"â÷ Êâô¥õ÷ tç �ô%  î†7- Ðûê ÃíÄûÃ-Âûâƒ&·êá÷ ’âŒ÷ Äâ�Û‡ ÁÝûfÁ Á ÂÂçÂ-Àç‚‚ ‚ ‚ ‚  ‚´ÎEðÿÎUà·Pß·Nßw á÷äÞ÷ zâ‡÷ x܇Á ‡wŠû÷%TTªú6÷5$ç2&&ÄœÄì„ŠÅæwXá÷*œÞ÷ úáÀ(3 (÷ $âÀ5À%  ƒ70á÷tÞ÷ Òá ÁÜ÷ >Û…cÄŠÝÖ €ˆ‡$XX:Àç"7’öÿ7˜ñÿ÷ �ÁewzùÀ¬(÷ €Àd HÀe   ú‡ÀÜ!Á" Ã<"÷ v ‡ð•#÷ b ‡÷ 4ÀÜ!÷ d‡Á!ð¥ðÿ*Á Â$"÷ 2wÙÀ~!  Ü!ü‡7 Æö÷Ü!¾ö÷ ¾ö‡÷ úöÅåÀ À%‡=÷ ïwfÃ*)Ä÷ ÔöÄ ûÄ00CH]Û\l1DATADATADATADATADATADATADATA*)� î‚À ø ¢)Ååꇰ)°)°)°)²)°)°)‡À` $ ~!#ú-÷ôµ@nÐ Ø n(rØ5o‡Áp À–÷e÷ Áš À–÷÷ ÷ èø÷ „÷pÁ” ÷ |÷RÀª!Á&Â$ð þÿ[ ùÁ&>& " " " " " " " " " " " "�! " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "Î!t!ÃáÀ®{ÆÂïÁhÂâîÁq·é÷bæ÷ Àé÷¸æÚæ÷5¶æÁb÷ ä ÁÝÃæ ÷ € Е, Áݲæ ÷ p Е]w€ Áwp Áz÷ Òã÷|îÂè÷æ÷ déÁ\æ ÷ > wR æð Þ †‡ó5ùÀ®÷ xà óµðЕNЕOóµçÁ‚÷ vã÷ ë÷ ÞÁ‡÷ dã÷ Áæ÷ Ö Ð•.wî Áž÷ Hã÷ üÁ� æ÷ º Е.wÒ ÄüßÄå,‚÷ $ã÷ ØÄ ÄexÃebÁB �@‚ †� ü ÷ | Е.w” ÁO÷ îâ÷ ¢Á�ªåÁEÿÂüÒ R üÂåx‚ �€÷ ÂâЕ  ÷ B wV æð Þ †‡À®ó5÷ÂjßÂå, ÁÂex�bÒ%&Â%’ ·lþÿtç÷¸ä÷ èÁÂ%–I ‰2‰¢÷ 8ßÒ÷ 0ßÎ÷ ¦÷ àéÖ%†÷ ßœ ÂEðÿ ó5@ ó¥ *�F��&÷ â÷ ¦ ©À’÷ øæ†wòÀ®ÁN5! ÁH÷ âáD- w Ìæ÷ tç÷ À7Àæ÷ hç÷ ´A ÷ @ ÷ ì€ ¨Ð•:A÷ , ¨÷ øë�¤÷ îë € ¨0œþÿüÿ0œÿÿýÿ0’þÿ0œÿÿ÷ FÞD- #Е:ÁQõ5 ÁDõ5€ÁIæà÷ ¢ë�΀ÿ÷ –ë€Î€V- ‡ÁM÷ ,á÷ Æ ÷ ðÝ õ5  D7æ÷ ®æwÿ‡Áw” Á[÷ öà÷ ªÄ˜ãÃEÿƒ ƒ ƒ ÄEðÿÄ ÷5@~ã÷¥ –ã F÷ ÄàЕ:ÁF÷ ²àЕ:Á&÷  àЕ:Á&÷ ”àw. æð Þ †‡ó5ùÀ®ó5@ ÷ LÝðЕNЕO÷ <ÝèÁS÷ Tà÷ êç÷ *Ý ÁZó5€ ÁV÷ 6à÷ Ð ÒÁ÷ (à÷Æêå÷\â÷ ºåÃbÁDÁe?¡  ü÷ ‚ Е:  ÂŽê·âä÷ Šå·Øä÷ €åæÎ= Ý-Ž`·#(ê)‡„#'‚‚%&ƒÓ ÷(ê!‡Ä"†Â"ƒ¦ÎlÖ$‡ÅbK †ÁÂÛ¡ ÷  Е.Е:A¡� ÷ Е.w Ö ææÂ-ÈéÂꦂÁi÷ òwÄÜÁ÷ Pß÷ ê@ä÷„á÷ âäÃÅbA ÷ ®Е.à Е:õw¼æð Þ †‡À®ó5@÷ó5€óÂ`Ê ïµ$û÷ ÌÛ óµåЕNЕOóµÜÁ ÷ ÊÞ÷ `æ÷ `Ó÷€é°ã÷ôà÷ RäÅb Ãå ã Á2DÝÁ,DÝÁ&÷Névã÷ºà÷ äÅbÃå&Á>DÁ8D÷ XÞ ÷ ÎЕ.wæÁ’P”P”A ÷ ¾Е:‡À®÷ ÛЕNЕOÁèÚAV÷ ÞЕ=‡Á¬à÷ ”Á¦à÷ ŒЕ:‡÷%¾Úw®À’7 ÄÚ÷5,ÛÈ%#ð%ç_· ªÚð%è_÷šÚ÷ °âÀ�Ú‡r÷ ¤x‡&æ÷ lÚ D- jD÷ ˆj‡ùD- `w tâ÷ ãw-LÚWw-FÚSƒ„7Xâ÷èœß÷ úâ@f÷Dâ÷ ìâ÷ Úµ ÷ ãÁîç÷ HÜ÷ øÙ„7â÷Øç\ß÷ ºâ@N÷â÷ ¬âäÖ ÷ âÙ ×-ÚÙ ÷Pçæá÷*ß÷ Àâ÷@çÔá÷ß÷ ®âÁw÷ b‡ÁÁ÷ Rw$ÚÁùV÷Nç á÷äÞ÷ Bâf÷lçŽá÷ 6â@ÖÁ B`B‡Ë%æ€÷ Ìæ�΀ÿ÷ Àæ€Î€N 1‡Îe– -‚€ -†÷ ¦æ €À÷ š  À÷ Ž B`÷ ÙË%ó%€þÿÎe?À¡ À üÁ N ‡ÁÁ ÁÁ ÁxÁ�` î‡Á÷ hw:Ù÷%žØÄvæ7´à÷tæøÝ÷ VáD7 à÷ HáøÖ w÷ fØÀœ÷ Šà·5! Ëõ5 Í€00CP]‰V§3eaek›’&@ CmÂ@Ø& ææ(Â4Ø& ÷,æNà÷’Ý÷ ðà÷ ¢å€@÷ –&æàfæ€ÿ÷ †å€Î€€ÄÖå7à÷ÔåXÝ÷ ¶à6ˆ÷ Ö×DD7ðß÷ ˜à÷ ¾×5! ëC ö æ‡Î ‡ ƒÁ ‡wÎþÁ  ƒwàþ@àÁ w´þƒ ƒÁ w¨þ@ @mÄÁ 7f× ÷`×–%ƒÖ ÷ N×÷ ÊõÕ€õ5 õ•€5 7VßwœÜ÷ 2à÷Jß÷ òß ÷ $à‡·:ß÷úä~Ü÷ Üß7 ×õ5€÷U€þÖÁ@7ß÷ ¸ßAÍöÁ )À@ÁŒ� ü&÷ðÞ÷ ˜ßf ff÷ 6�µµ µÕ7ÌÞwÜ÷ ¨ß÷ÀÞ÷ hß5 ÷ –߇ÁwHÁhäf÷ 4Ø.‡&Á’B RR  RR ŠÒe   É ò€þÿÉ%ò þÿ÷ ¾ã� ÷5ä  ŠÊmä€�‡Á÷ ØwªÖÃ’Åb€ÿ÷ „ã€Â€÷ÆãÞ÷\Û÷ ºÞfÀ¡ À ü„&Ķã7ôÝ÷´ã8Û÷ –ÞN NmD-7ØÝ÷ €Þ5! ÷v- ó‡B- †K-és-åõ5 Ó$÷ ŠÕ)Žó %�Í w’Ý÷ :ÞB- †N ÁÁr÷ wæÕ÷HãjÝ÷®Ú÷ ÞN7ZÝ÷ãžÚ÷ üÝÂ÷ 0Õ* ‚Ë �B Bm Ë �Bí Bm V…B- †÷ ®P‡B- ‡7 òÔ– I‡A Am�àCƒµ &@ @m ‚Ë B ‚ Ë �Bí `*… ƒ÷ X%‡ ‚7 žÔ– ‚A �à u÷ „ÝÖ ÷ ‚ÔÁsw0‡÷fâˆÜ÷ÌÙ÷ *Ý� ƒÁÁ ÷ wÞÔA#w^Ü÷ Ý÷ <Ô B- †÷ &Ô$B Aw8Ü÷ àÜøA AmB ƒ÷ þÓB÷ †· úÓ7Ü÷ÎáRÙ÷ °Ü¡‡±ýÀêáÀå7ðÛ÷Öá4Ù÷ ’ÜwàÛ÷ ˆÜõ 5!&ô7ÊÛ÷ŠáÙ÷ lÜõ5 õ õ5¡‡±ýÀ À À À À À ‡¡ € € € € € ‡@@m € ‡ÿ Àé†Ò0ÿ ¸é†Þ0ÿ °é†Z1ÿ ¨éª’8ÿ  éª¬9 H÷äý÷Üý7âýwäýwâýæLÿˆ ‡ææ)ÿˆ‡÷вý‡Á(÷ (wŠä"S ÖÐ÷ ®÷ öë÷ `æV‡Á TÀ ÷ @îwBãN÷ LæK‡Á IÀ ê÷ bæ÷Në(ã÷ 0æ>†À�÷ xë †÷ ã9÷ãã÷|³ã÷ `ë0‡wÿw"ÿw�!ÿ@$7 ë÷Nè÷ ¬ëwüê÷ @è÷ žëwÜþ@íA÷ ¸ù@m7�Êþæ¦ÿˆ†Á$ÁÁ> Á#ð¥æÿ*Á(ÁHw´÷ îâ)ÀÚÁ  ÷ ¦ç‡ñ�|þñxþñtþæ¸ÿˆà‡ææ)ÿˆÚ‡÷Š~þ×@Á®÷ þ7lîFþw @þÅd@Á®÷Üû÷ âýÄâ5!<Á‚Ä Ä Ä Äe>Ä% ‚Äå@Á°Éea ÷ ´ýòôàád@Á®wªý÷ Úäj‡À Ã�÷ üäÅâéwÞé÷"ç÷ €êñ%TI[wÎÿ÷ ªä— =P÷ ÎäÄ´éw°é÷ôæ÷ Rêñ%TIDñ%TT÷%NL˜ÿ?÷ rä6†Áb7~é÷Âæ÷ ê@7 léôñ -ñµ2B!7Ré÷ úéñ5!·Bé÷ êéB· 6é„ ô7*é÷ Òéq÷ ê‡ÁÁCÁ ÁDÁEÁFÁGwÿ 8÷ª’8ÿ 0÷.l8 Âw ®è ”Å¥ üÅ¥ ùÅå0B¡†€÷ <èAa”ôœÿÿ‡w |è„ææ(æ@ƒf ”Å¥Z+‡Å¥AƒÅ¥9%‡Å¥0ƒÅ¥$ Å¥ Πť.ÅåÅå÷ÿÅåÒÿÅå@&ÀfA÷ ÈçE�€Aa×$Ò±œÿÿ‡æ æ * æ + æ2æ3ÁEÿæ ÎE‚w Ìç…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ dçW ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡÷ &÷ &÷ �’•’•€‡@Á(÷ çf€  Àe ÀeÉÿÀe Àe ‡ABDEFIMNOPQRSTUXYZ<>ÉØâô=öMXd^Œ•öêžèò)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw Äæ&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ ÌýÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚b‚ ‡AÂ Ê Ö ÊЕ%„Ì¥Vå ‡P”à ý‡Ð• B”f�‚÷ Bþ�à õ‡& æÎe$þB& ¦æÎeþ;& æÎe5Í6H”ÈÅ€¢ ¢È• € à ò‡÷ nŠ€‡Ð• à ü‡Ð‹à üÀ ‡Ð• Е à ú‡& æÎeÀý & ¦æÎe¬ýЕ A‚¦Þ à ÷–%‡& æÎe€ýóA÷ üýà û‡Ð• à ü‡Ð• Aæ÷ ÞýAÎ ûÖ Â ÷ $Е.÷ ÆýÂ÷ AЕ; ÷ 4ýà à‡Â ýð¥ ÿÿùÀ øAá ÷ &E‡Aá Â÷ HE‡Á ¦¶6D‡w ÚäD…&&÷ bЕ-�Î �eÁaÁeÑý00CX]Û\l1DATADATADATADATADATADATADATAP”P”P”Е-�$w ªäDÅ… ƒ÷ &Е.À À À ce÷ JäÀ …Е:÷ Å ù Â÷ `üB‡w œè5 funhõ‹j÷ t‡uhdB$÷ 8†õŠjw�õµ€aw<õ 8÷ vý¥öÿ8w & õµÁ ÷ `œ*AdBbAÁepÂ& ¦fƒÂÁ ÷ 4– –‡ÁPõµ aA”Aíf@pnp÷ dC*8Ö‹Á ÷ ô88ð*Ë7�ABµ`f Võµa¦�`& W¨aW¢zÎ ÉŠɥ"N  ðÖ ‚õµ€aõ‹jfu-nhwFÉ¥;]õµa)w´þ× ØÿæØÿ"Ã¥öÿ.@�j À õµ€a÷ BwÄþ@÷ šõÅ€aõŠjõTI�õ•æöÿ& õµaf*÷ vµ*µ“`V @‡æÿÿîæþÿëÆe,æýÿææüÿãw Àæõ‹jÜõŠjõålùµŠj÷ ¾ÐÉ¥@@õµaÉu­jkàÆå,b¤€p°÷ Ì5fµ fˇðµ ÇÈ•÷ ¸‡ðµ¾ðµº÷ Ò‚ÂeõSY�÷ ø ‡Æe,5 funhwÂýÆe, õµaõ‹jõµ€a�`W¨- õ fµ`nw^ýuhnwäþ@÷ \DlõålõŠjõµ€a!CÃeH###33™@ð•#÷  ‡&™÷ 潕8 †õ¥öÿ*ÎÖ1Ϊ1‡w zåõ 8µŠjDl@÷ ªT”ÔÀeBTŸ8œ5l@÷ ¼‡@Á(ñ D÷ šÁeB&÷ ”‡ð•#÷ x‡An5ŠjÉ)fÿˆ‡Ñ Â&÷ 2‡ /    ô÷  ‡  ú  ÷R¨õÕ€a¡‡Âå@”‡ÿ ä &:ÿ ä ö9ÿ üãL8ÿ ôãø:ÿ ìã"L8ÿ äã"š;ÿ Üã.l8ÿ Ôã:L8w vä÷ d‡ðµ)ðµ÷ 8C÷ Úð¥öÿ* ðÕ)ð ð*wxð•öÿ*ú÷ r÷‡ðep p ‡÷ êê‡ð¥Cƒ óà ðµ=ðµ÷ ü ð¥ð 0ßð•Øÿ*Èð¥ ðµ= ÄEÕ¥^Ä ûAÇð¥ æÂe@ÃÎà÷ ‚ƒ߇÷ � ÁEp×ðµ÷ ˆðp°æÄ ƒðÎà÷ 8ƒ ƒ÷ Vá÷ ù†ð•Øÿ*Á`‡ðµ)w,æ÷ ƒ‡æCàƒ#ƒÎà÷ Î ¦÷ Èÿ‚ð†– ‡DàÄ ‡w Ðâð*D÷ ² Õ ýw÷ *‡ðµ) l0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡ðµðe6p 4÷ ¬ÿ†8÷ 0±‡÷ ¬÷ j÷ †‡‡÷ Jõ†‡ð 8 ðµðµ ð*‡ðÖ*±‡ðÃ*±‡ƒ  �D„PÄ5Rà ý†R”‡R”R”à üøð‹*±‡0Š+æ1ÿˆÅ(Åe à ÷ @ß%ÿÿ&ïp’*wÈÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ ¤ÿ8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡141612Áepðµl2l0p‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ ”ÿU•Õ4 6wôþ÷ ÿBfÁep�`p�wÀþ8Áe2 ‡Â8'Æ8;(Ê8O<Î8cPÒ8wdÖ8xÚ8 Ž8 w 6à ÷dÉDÐEÄ%�‡ÁL8!ÁeûDäÄ æÞ8ywŠwŽw’w–wšwžw¢ÂŽ8JÁÔÀí9ÃÔ9ДþÀ Å& W¡W¡ ‡‚÷µ7Í Ãä9ÎÃÜ9ÎДþÀ ÷ BÂe‚eÁí9÷ rÁ^ÍÂXÍ÷µûÌ÷ ^İÈ7 ªÈfL…W¡‡W¡÷ŠÈ÷µÍÌW¡ Î$Ît÷ @ÒÀ<w¬‡÷^È÷ ,Òw„ÈÁ®BàÀ‚8P�æv8ÿˆ‡ææ)ÿˆwŒ¼þ‡VMR -- *DIAG*-*FATAL*-ÿ Â݆2ÿ ºÝ’ì1ÿ ²Ý¶ˆ:ÿ ªÝˆ:ÿ ¢ÝΈ:ÿ šÝÚˆ:ÿ ’Ýæˆ:ÿ ŠÝòˆ:ÿ ‚Ýþˆ:00C`]‰V§3eaek›’ÄeX<‡Illegal Get Command Line error codeCommand syntax errorSystem image is RSX-11M-PLUSIllegal switchIllegal error severity code %PCommand I/O errorIndirect file open failureIndirect command syntax errorIndirect file depth exceededI/O error on input file %XOpen failure on file %XIllegal file specificationFile %X has inconsistent dataFile %X has illegal formatIllegal functionSyntax errorDevice %2A%O: not in systemInvalid keywordInvalid UICŽ:²:Ç:ä:ó:ô:;%;@;^;{;–;®;É;ç;<< <<<ÄeÆ<‡Task image I/O errorToo many lunsTask name already in useTask image currently installedFile not task imageSpecified partition for common blockSpecified partition too smallPrivileged task larger than 12KBase address must be on a 4K boundaryIllegal first APRNot enough APRs for task imagePartition not commonCommon block parameter mismatch %2RCheckpoint area too smallTask and partition bases mismatchUndefined common block %2RCommon block is task partition %2RCommon block not loaded %2RLength mismatch common block %2RBase mismatch common block %2RŽ:£:±:Ê:é:ý:";@;`;†;˜;·;Ì;ð; <,;[;s;‹;œ;»;Ø;ó;<<4<Äe,=‡Partition %2R not in system, defaulting to GENLoadable driver support not in systemDriver built with wrong STB fileFile %X not a valid driver task imageIllegal driver task APR usagePartition %2R is a commonDriver already residentDriver requires running system for LOAd/UNLoadDriver not loadedDriver cannot be unloadedDevice %2A%O: is attachedCheckpoint space too small, using checkpoint fileNo checkpoint space, ^assuming not checkpointableReceive data or by reference list not emptyPrivileged task overmaps I/O pageInvalid interrupt vectorInterrupt vector already in useLine not DZ11Invalid speedTask image virtual address overlaps common block %2RŽ:½:ã:;*;H;b;z;©;»;Õ;ï;!‡÷ xÿ‡÷ 2ü‡,, ð ñ‚ð•öÿ*±îðµ)÷ ²‡÷ ‚‡÷ j‡ðµ.ðµ 𥒤𥒤°0ð¥0l°  ƒ0 ðµð•Øÿ*±¡‡ðµðe6p 4÷ þ†8÷ (±‡÷ ¤÷ b÷ ~‡‡÷ Bõ†‡÷ Œðµ)ðµ÷ d!‡f¦æ÷ 4†ƒ‚„÷  ‡çÆeðÅ)ðµ . ðe6p 4÷ ¶0ž8*wÊý¡ðµ)ðÕ .÷ ŒÿðÅ .‡0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w ÚØ Á�   ìì� .Â% ÷ P ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ � ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡ð*&f÷ …„‡D„ ÄEõµ/fCÃåŽ A ÷ ΃B f& ÷ ¶B‚eA @0÷ ÄÁ („‚@0÷ ²a@ÂeA ‡ B0÷ š€ABÂå� ÷ „¦f ÷ ZC�‚áÖ @ð•Òÿ*±‡141612Áepðµl2l0p‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ ØU•Õ4 6w8÷ LBfÁep�`p�wšû8Áe2 ‡0Š+æ1ÿˆÅ(Åe à ÷ @ß%ÿÿ&ïp’*w^û÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ :û8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡00Cp]‰V§3eaek›’f¦æ&f ÅÂ…`Á Á ý°* �… !†ƒ”×  ×  Ä õ× ñƒ× ÿî× "D × a‡× z‚Ä ÃE Ñ�ÝEp(p°à„… †ƒ”× $ú× 0‡× 9ôƒ× A‡× Zîƒ× _ë× :� � ‚„… V†ƒ”× [È•]× <È•>È‹8 … |†ƒ”× %ú× *÷× -‡× .ñƒ× 0‡× 9ëƒ× A‡× ZåƒÈ ‚ … |†ƒ”× 0‡× 7÷ƒ× *ô× ,A ïlÈ jÁ hŠ„ … q†ƒ”× "A øÁ ö „ #A … c†ƒ”× $‡× %÷ƒ× *ô× 0‡× 9îƒ× A‡× Zèƒ× _å× .� £ß … †ƒ”× .× ; … f†ƒ”× 0‡× 9‚� õ]× -Á X� í× *Á QA æ × ,Á D× = Á >È5 B>ÈU °(wZþ× /*Á .�Á … .†ƒ”× $× -‡× .ƒ× 0‡× 9ƒ× A‡× Z ƒ× _ × :Áÿÿ   DÚ× " Á … †ƒ”³á°0±…„ƒ‚�‡f¦æ&fæ ÈE¢¢^Á`Å÷ úÄ ÈUQÅÿÿ÷ æÄ ÈUQ ÷ ÔÎË€ÈUIá ÈUà `¢Ãe á ÉáccD ÷   Ä”¡%¡*¡.A ÈU Å ï0 0 ��W ,ÈUw@W /D ÷ DÎÄ cBDaW£-Á�Á N�… W¥N W¥OD!†B�“Á N�{É …CÃE€€C¥ÃC¥D!‚Ñ ó�ñ‹þÿ€D! ΋ñ5 Ñ þÁe߃“ƒ Î�à UÂåÔpRpR„“pBCÃ5D ‘ƒ à KR΋KBAÁE�—­:ŒDœ0CŠÄŠý ÷ fÎÄ ÁeëB”—   ¡ƒŠDÒ� CS•ÄŠÞü ƒÐ÷ ¦ ‡W¤†CÅ E Cs ÉΕŠ …„ƒ‚�‡f¦¦)& 6 l(¢*¶„„íƒ †�”Å EÅ 'W "Å =N íÎ ëW :+W =Å 1 Â#W ,W /Å %W %W *ÑöÕ€ÍÄ W <ÈW [ÄW >W ]¾„ v�¢°(°* 6 ƒ…Æe‚�‡w ¶ÚÁ w ¬ÚÁ& W£+W£-Ž … Ä Ba—¨.Á W£#Á… Ä  B•Âå0 ‡� †Ë c ææË c ó S W –%‹ec “e‹`s þÿÄ äÖ # 3 ‹ ¯‡Ö ±‡& æƒË¥÷ Zÿ÷ ^ÿC …„‡w `àÁ(ñ D÷ Dð 8#ðµðÿ"ðµ#)ðµ%œœÃŃŒ‡ƒŒ‡ƒŒ†Ä¥ Ä¥ †æ•Õÿæ•Ëÿæ•Ôÿæ•ÓÿwÄ 0 ð*0 @Q$   Ñ 0 40 60Š)ðÕ)ÁeB÷ Š ‡÷ ‚ñ :ðµ#÷ Ü3†&œ*w®÷ ,ù‡ðµ#(ð PðÕ)÷ ¨†ðµ@#ð¥Çÿ*ð*fff÷ b±±‰‡÷ r†&œ*wLðµ.÷ P3‡ð5ð(8ðe$8wä2€æ•Öÿ2&À(Áe÷ f€†æ•Ùÿ%p8Éq ðµðµ#)÷ Ä †ð¥öÿ*Rð*ðÕ)ðµ@#0l æ•ÕÿCðµ# 02ð•ðµðÕ8÷ Þ00œÄ¥‚Û‡œAÄ¥ÕÄŠ ð ð•000÷ ®‡0 @0 ð‡&œ*0 @÷ ÂuÄ÷ æðµ# ÁeB&B÷ &°B÷ °÷ °•*±‡÷ ˆ ÕeBÆå•Åe>�Ä€ … ðµ #ÍÕÄ ðµ#ÄDÃÍÅ ÑÄðµ#Ä…&0 ðµ#Õü Õ÷  ÷ :0@°Æe° 6ðµ@#040 6w–ðµ!p2‡w ÝÁ(B‰ Cƒàƒ òñ€€DBÂe ¦æ?ÿˆ‡±Dñÿÿ(1 >‡w èÜÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w ¤Ü  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡w (ÜBC œ"¦æ&æÿˆ‡÷ <†ÂÃSYïð&*‡°�p0p2ñ1ÂEÏÿÂ%0ð•ðÿ*w8Å(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡141612Áepðµl2l0p‡ðµ0f�Â(& Âe Ê%ÿÿ¦æ&æ&ÎeHæ ÷ àU• Â…à  ÂE•ÕfÄ÷ èp†�ñ ± wV÷ " ‡f÷ ¬�†&œ*÷ °•*±‡Ä Ä Ä ðµ f÷ bu ÷ Š�‡ñ ± ‡ð‹*±‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡÷ äÿMÄw 0Š+æ1ÿˆÅ(Åe à ÷ ‚ÿß%ÿÿ&ïp’*wdÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ @ÿðµ82Áe&À(÷ Úü€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡ðµ.ðµ 𥒤𥒤°0ð¥0l°  ƒ0 ðµð•Øÿ*±¡‡ðµðe6p 4÷ ¶†8÷ bý±‡÷ f÷ $÷ @‡‡÷ õ†‡,*ÿÿ±‡æ1ÿˆ‡ÄÄ÷ lþU•Õ4 6wŠþ÷ žþBfÁep�`p�wòý8Áe2 ‡÷ *‡ðµ) 00Cx]Û\l1DATADATADATADATADATADATADATAl0ì, ¡‡ð•öÿ*±‡ðÅ)÷ $‡‚ð ðÕ)¡‡ð•öÿ*ðÕ)±‡0,40,6 ‡ÁeBÉ ð 8÷ X‡$&w @àð*÷ ®‡÷ ‡÷ "‡w $à÷ (‡w¸‡w à÷ ú‡w®w à÷ ó‡w¦w øßBC œ"¦æ&æÿˆ‡÷ <†ÂÃSYïð&*‡°�p0p2ñ1ÂEÏÿÂ%0ð•ðÿ*wÅ(ð•Ùÿ*Åe œ"f¦æÿˆ ‡D CÓBðÕ.E‡Ä Ä Ä ðµ f÷ Pu ÷ º�‡ñ ± ‡w (ßð*ðµðµðµ# ò  ñU@¦Âe÷ ¶‚‡÷  †æÎeªwññ1 ‡Ã ÄÄ%ñ,ñ, ñññ× ±‡w ŽÞð*DÅ Å ýæ¦!…‚ñU€q•q•ÂåC Ó¥:„  úÄ CÃe÷ D ‡à ññ÷ (þð•Éÿ*‚ƒ‡w Þð*æ ƒ ‚æ¦)Ä”Ä%.&Ä%;D ÷ƒ ñ5À)ñ5@D…ÄDáÄ Í¥*CÃe÷ ‡aÄ%wñUXñ5@ƒ âñ5€ñU€Ä„íÄ ñUþ¥*ñU ÄÅ ñ5@XñU@ñ5€áÄ„íÄ ñUþ¥*ñUÄ Å‚öƒàÎàà Ê¥*Ã%C!.D`÷ ”*‡ƒ‚wúþÆeCÃ5€ñU‚Ã5 ±±± Ã5€± Ã5@±‡Æeð•Êÿ*±‡ð‹*±‡0Š+æ1ÿˆÅ(Åe à ÷ @ß%ÿÿ&ïp’*wÈÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ ¤ÿ8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡Ä(ð•Ùÿ*±G¦æÄe(Ì  ññ1 5&Âe´ ÷ ®„Œ íƒ1-1- 111þ ‡rrrrrƒ‚– ‡æ¦& ƒ÷ ºƒ‡ñBÂeÄ÷ 0ÃÂà„ä ÷ ¢1 wîð•Ìÿ*‚ƒ±‡ Ëw èÚ&Ba —¢+—¢-� ‚ Ä Ê¥#‚ Ë å¥.‹ Ä ÅæU¥ Ä €”Àå0� ‚Ë ‡Î Àb‡Ë ‡Ë ‡ ` ‡€Î Ä éÁ  ¡€€‡±û&fæÎe…”Þ ‡Ã ûÖ �€‡÷ :‡÷ $÷ LÞ ÷ ( ‡÷ LaÞ ÷ ‡TaÞ ê‡Å Å Å @Å Å `‡W!Z‚W!A†W!9‚W!0‡ÅåÒÿÅå@‡±‡f&æÄ5Ò•[Ã÷ "Ä5Ò•,ƒ“÷ Ä5Ò•]ƒ„…‡ÃEÿà à ÅÄ5 Ã5ÿà à à Šø… ÃÃe0Ò�ŠÃà à à Šõ‡w pÙ�‚Á Ò¥[Ä,÷ &‡æÄ]÷ …‡Á Å5ÿ ó‹s‘‡…¡Á ü±‡Á „DáÄ w$þæ¦1 ññz ññ÷ žù†ñ÷ 1 1 1 1 1 1 ‚ƒ‡DEÄeÅe $ $ ‡w `àð*æ8Iðµ÷ ôœ*=‡ðµ€)98÷  ÕeBÕ && ð Îå¶ �ÕU€�Ä÷ ‰�†ð¥öÿ*ð¥åÿ*Æe ð*Nlv °°΋œ*ðµ.)÷ ¨ „& ðµ#ðµ!ðµ)&ÎePæÂ(ÂeÊ ¦æ&æ•&Ä÷ ~†�•p�*÷ Àwð‹*±‡8AÁe fÕœ"Šœ(à ÕU�ÿˆ†CÉ—&ð•ÿÿ+‡Å(Åe$&Ä% Ä ý„‡0Š+æ1ÿˆÅ(Åe à ÷ �ÿß%ÿÿ&ïp’*wrÿ÷ øfœ(Á fæ)ÿˆ‡fæÿˆ‡�‡÷ Nÿðµ82Áe&À(÷ J€0 0 0 80 B0 0 0 0Š)ðÅ#0Š.‡¡ðµ)ðÕ .÷ ¬ðÅ .‡w LÞÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w Þ  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡÷ ¢ðµ)ðµ÷ ¾!‡f¦æ÷ ˜†ƒ‚„÷ b ‡çÆeðÅ)ðµ . ðe6p 4÷ 0ž8*wÖý141612Áepðµl2l0p‡,*ÿÿ±‡æ1ÿˆ‡8Áe2 ‡ÄÄ÷ ¼ýU•Õ4 6wÌý0,0, †f¦ ÷ ‚�톇,,†÷ ÷†‡w zÜ Á�   ìì� .Â% ÷ >ý ÕeB ÁÁ �ÁU€Á5ÁUU�Á‹åÕÄ÷ .ý ‡plp & Nœ°eðÕ€)‡ð•×ÿ*±‡00D€]‰V§3eaek›’ .TITLE BFCTLP .IDENT /07/ E;N ; COPYRIGHT (C) 1974, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.E;AA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDV9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.R;B ; VERSION 07;.; D. N. CUTLER 26-DEC-73;N; PREVIOUSLY MODIFIED BY:A;R; D. N. CUTLER; T. J. MILLER;1; MODIFIED BY:;A; T. J. MILLER 9-MAY-77E;*; TM082 -- SAVE AND RESTORE R5 IN $BLXIO.;S; T. J. MILLER 14-AUG-77;T;; TM099 -- REMOVE UNEEDED CONDITIONALIZATION FOR RSX-11M+. ; ; J. E. PROVINO 24-JUN-79 ;I:; JP131 -- CHANGE CONDITIONALS FOR NEW REAL TIME DEVICES.;I;D; BUFFER CONTROL ROUTINESL;E; MACRO LIBRARY CALLSA;R .MCALL HWDDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS;+*; **-$GTBYT-GET NEXT BYTE FROM USER BUFFER;FB; THIS ROUTINE IS CALLED TO GET THE NEXT BYTE FROM THE USER BUFFERC; AND RETURN IT TO THE CALLER ON THE STACK. AFTER THE BYTE HAS BEENL0; FETCHED, THE NEXT BYTE ADDRESS IS INCREMENTED.;E ; INPUTS:D;N:; R5=ADDRESS OF THE UCB THAT CONTAINS THE BUFFER POINTERS.; ; OUTPUTS:; <; THE NEXT BYTE IS FETCHED FROM THE USER BUFFER AND RETURNEDC; TO THE CALLER ON THE STACK. THE NEXT BYTE ADDRESS IS INCREMENTED.$;H*; ALL REGISTERS ARE PRESERVED ACROSS CALL.;- .ENABL LSBB0$GTBYT::MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESS* MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING ) MOV U.BUF(R5),KISAR6 ;MAP TO USER BUFFER 8 MOVB @U.BUF+2(R5),4(SP) ;GET NEXT BYTE FROM USER BUFFER* MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING. BR 20$ ;TAKE COMMON EXIT FOR ADDRESS UPDATE ;+(; **-$PTBYT-PUT NEXT BYTE IN USER BUFFER;D>; THIS ROUTINE IS CALLED TO PUT A BYTE IN THE NEXT LOCATION IND; USER BUFFER. AFTER THE BYTE HAS BEEN STORED, THE NEXT BYTE ADDRESS; IS INCREMENTED.; ; INPUTS:S;:; R5=ADDRESS OF THE UCB THAT CONTAINS THE BUFFER POINTERS.B; 2(SP)=BYTE TO BE STORED IN THE NEXT LOCATION OF THE USER BUFFER.;F ; OUTPUTS:;B8; THE BYTE IS STORED IN THE USER BUFFER AND REMOVED FROM2; THE STACK. THE NEXT BYTE ADDRESS IS INCREMENTED.; *; ALL REGISTERS ARE PRESERVED ACROSS CALL.;-1$PTBYT::MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING D, MOV U.BUF(R5),KISAR6 ;MAP TO USER BUFFER 3 MOVB 4(SP),@U.BUF+2(R5) ;STORE BYTE IN USER BUFFERE* MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING/ MOV (SP)+,(SP) ;COLLAPSE STACK REMOVING BYTE U. BR 20$ ;TAKE COMMON EXIT FOR ADDRESS UPDATE ;+*; **-$GTWRD-GET NEXT WORD FROM USER BUFFER;BB; THIS ROUTINE IS CALLED TO GET THE NEXT WORD FROM THE USER BUFFERC; AND RETURN IT TO THE CALLER ON THE STACK. AFTER THE WORD HAS BEENR/; FETCHED, THE NEXT WORD ADDRESS IS CALCULATED.S;; ; INPUTS:T;P:; R5=ADDRESS OF THE UCB THAT CONTAINS THE BUFFER POINTERS.;( ; OUTPUTS:;)<; THE NEXT WORD IS FETCHED FROM THE USER BUFFER AND RETURNEDB; TO THE CALLER ON THE STACK. THE NEXT WORD ADDRESS IS CALCULATED.;;*; ALL REGISTERS ARE PRESERVED ACROSS CALL.;-2$GTWRD::MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESS * MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING ) MOV U.BUF(R5),KISAR6 ;MAP TO USER BUFFER 7 MOV @U.BUF+2(R5),4(SP) ;GET NEXT WORD FROM USER BUFFERX* MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING. BR 10$ ;TAKE COMMON EXIT FOR ADDRESS UPDATE ;+ R(; **-$PTWRD-PUT NEXT WORD IN USER BUFFER;T=; THIS ROUTINE IS CALED TO PUT A WORD IN THE NEXT LOCATION INSD; USER BUFFER. AFTER THE WORD HAS BEEN STORED, THE NEXT WORD ADDRESS; IS CALCULATED.; ; INPUTS:D;O:; R5=ADDRESS OF THE UCB THAT CONTAINS THE BUFFER POINTERS.=; 2(SP)=WORD TO BE STORED IN THE NEXT LOCATION OF THE BUFFER.F; ; OUTPUTS:;(8; THE WORD IS STORED IN THE USER BUFFER AND REMOVED FROM1; THE STACK. THE NEXT WORD ADDRESS IS CALCULATED. ;T*; ALL REGISTERS ARE PRESERVED ACROSS CALL.;-1$PTWRD::MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING , MOV U.BUF(R5),KISAR6 ;MAP TO USER BUFFER 1 MOV 4(SP),@U.BUF+2(R5);STORE WORD IN USER BUFFERN* MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING/ MOV (SP)+,(SP) ;COLLAPSE STACK REMOVING WORD 610$: INC U.BUF+2(R5) ;CALCULATE ADDRESS OF NEX00Dˆ]E�]l1DATADATADATADATADATADATADATAT WORD 320$: INC U.BUF+2(R5) ;INCREMENT NEXT BYTE ADDRESS H2 CMP U.BUF+2(R5),#160000 ;OVERFLOW 28K BOUNDARY?  BLO 30$ ;IF LO NOX% SUB #20000,U.BUF+2(R5) ;REDUCE BY 4KL+ ADD #200,U.BUF(R5) ;ADJUST RELOCATION BIAS30$: RETURN S .DSABL LSBE;+2; **-$GTCWD-GET NEXT WORD FROM USER CONTROL BUFFER;C; THIS ROUTINE IS CALLED TO GET THE NEXT WORD FROM THE USER CONTROL E; BUFFER AND RETURN IT TO THE CALLER ON THE STACK. AFTER THE WORD HAS 4; BEEN FETCHED, THE NEXT WORD ADDRESS IS CALCULATED.; ; INPUTS:U;F:; R5=ADDRESS OF THE UCB THAT CONTAINS THE BUFFER POINTERS.;0 ; OUTPUTS:;BD; THE NEXT WORD IS FETCHED FROM THE USER CONTROL BUFFER AND RETURNEDB; TO THE CALLER ON THE STACK. THE NEXT WORD ADDRESS IS CALCULATED.;*; ALL REGISTERS ARE PRESERVED ACROSS CALL.;-1 .IF DF A$$D01!A$$F11!I$$CAD!U$$ADM!I$$PAD!I$$P14 0$GTCWD::MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESS* MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING 1 MOV U.CBF(R5),KISAR6 ;MAP TO USER CONTROL BUFFERR7 MOV @U.CBF+2(R5),4(SP) ;GET NEXT WORD FROM USER BUFFERH* MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING5 ADD #2,U.CBF+2(R5) ;CALCULATE ADDRESS OF NEXT WORD S/ BIT #20000,U.CBF+2(R5) ;OVERFLOW 4K BOUNDRY? N BEQ 10$ ;IF EQ NOW+ BIC #20000,U.CBF+2(R5) ;CLEAR OVERFLOW BITR+ ADD #200,U.CBF(R5) ;ADJUST RELOCATION BIAS 10$: RETURN ;  .ENDC;+; **-$BLXIO-MOVE BLOCK OF DATA.L;TC; THIS ROUTINE IS CALLED TO MOVE DATA IN MEMORY IN A MAPPED SYSTEM.C;R ; INPUTS:M;T; R0=NUMBER OF BYTES TO MOVE..; R1=SOURCE APR5 BIAS.; R2=SOURCE DISPLACEMENT.M; R3=DESTINATION APR6 BIAS.E; R4=DESTINATION DISPLACEMENT.;L ; OUTPUTS:;O!; DESCRIBED MOVE IS ACCOMPLISHED.(; R0 ALTERED D; R1,R3 PRESERVED 8; R2,R4 POINT TO LAST BYTE OF SOURCE AND DESTINATION + 1 ; ?; NOTE: THE COUNT INPUT IN R0 MUST NOT BE ZERO AND IT MUST NOT ;; BE LARGE ENOUGH TO CROSS APR BOUNDARIES (THIS TYPICALLY D!; MEANS A MAXIMUM OF 4K-63). ;- !$BLXIO::MOV R5,-(SP) ;SAVE R5 T( MOV #KISAR6,R5 ;POINT TO KERNAL APR6 $ MOV (R5),-(SP) ;SAVE KERNAL APR6 / MOV R3,(R5) ;SET UP KERNAL APR6 FOR TRANSFER % MOV -(R5),-(SP) ;SAVE KERNAL APR5 P/ MOV R1,(R5) ;SET UP KERNAL APR5 FOR TRANSFER 2 .IF NDF N$$MOVY%10$: MOVB (R2)+,(R4)+ ;MOVE NEXT BYTE  DEC R0 ;MORE TO MOVE?U BNE 10$ ;IF NE YES .IFF MOV #1,-(SP) ;PUSH LOW BIT MASK" BIT (SP),R2 ;SOURCE ADDRESS ODD? BEQ 10$ ;IF EQ NOO" MOVB (R2)+,(R4)+ ;MOVE FIRST BYTE DEC R0 ;REDUCE COUNT+10$: BIT (SP),R4 ;DESTINATION ADDRESS ODD? ( BNE 50$ ;IF NE YES, PERFORM BYTE MOVES)20$: SUB #N$$MOV*2,R0 ;MOVE ENTIRE BLOCK?F BCC 40$ ;IF CC YES# BIC R0,(SP) ;REMAINING COUNT ODD?  BNE 30$ ;IF NE NOO DEC R0 ;ADJUST NEGATIVE COUNTN-30$: SUB R0,PC ;INDEX INTO MOVE INSTRUCTIONSB40$: ;REF LABEL .REPT N$$MOV$ MOV (R2)+,(R4)+ ;MOVE A WORD, .ENDR BCC 20$ ;IF CC MORE TO GOU" BR 80$ ;EXIT THROUGH COMMON CODE50$: ASL R0 ;DOUBLE COUNT)60$: SUB #N$$MOV*2,R0 ;MOVE ENTIRE BLOCK?T BCC 70$ ;IF CC YES. SUB R0,PC ;ELSE INDEX INTO MOVE INSTRUCTIONS70$: ;REF LABEL .REPT N$$MOVN MOVB (R2)+,(R4)+ ;MOVE A BYTE .ENDR BCC 60$ ;IF CC MORE TO GOE80$: TST (SP)+ ;POP CONSTANTU BNE 90$ ;IF NE NO MORE TO MOVE! MOVB (R2)+,(R4)+ ;MOVE LAST BYTE090$: ;REF LABEL .ENDC( MOV (SP)+,(R5)+ ;RESTORE KERNAL APR5 ' MOV (SP)+,(R5) ;RESTORE KERNAL APR6 B MOV (SP)+,R5 ;RESTORE R5 E RETURN ; .END SUB #N$$MOV*2,R0 ;MOVE ENTIRE BLOCK?T BCC 7 .TITLE CTDRV .IDENT /08/;; COPYRIGHT (C) 1974, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 08;; D. N. CUTLER 13-MAR-74;; PREVIOUSLY MODIFIED BY:;; P. J. BEZEREDI; D. N. CUTLER; C. A. D'ELIA ; B. LYONS;; MODIFIED BY:;; P. J. BEZEREDI 05-JUL-78;9; PB079 -- INSURE R2 CONTAINS CSR ADDRESS BEFORE LOGGING ; 00E�]‰V§3eaek›’ AN ERROR.T;; P. J. BEZEREDI 18-JUL-78;H7; PB081 -- EXPAND I/O ACTIVITY IMFORMATION REPORTED ATD; TIME OF AN ERROR.F;R&; TA11 TAPE CASSETTE CONTROLLER DRIVER; @; NOTE: THIS IS A MINIMAL DRIVER AND CONTAINS NO ERROR RECOVERY.;; MACRO LIBRARY CALLS ;N .MCALL HWDDF$,PKTDF$ $ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS; ; ERROR PROCESSING CONTROL TABLE;.2ERRTB: .BYTE IE.DNR&377,1000/400 ;DEVICE NOT READY/ .BYTE IE.WLK&377,10000/400 ;DRIVE WRITE LOCKED( .BYTE IE.EOT&377,20000/400 ;END OF TAPE' .BYTE IE.EOF&377,4000/400 ;END OF FILEO( .BYTE IE.DAO&377,2000/400 ;DATA OVERRUN( .BYTE IE.VER&377,377 ;BLOCK CHECK ERROR; ; LEGAL FUNCTION DISPATCH TABLEA; (LGFCN: .WORD IO.RLB ;READ LOGICAL BLOCK .BYTE 105,10. ;W .WORD RDBLK ;D# .WORD IO.WLB ;WRITE LOGICAL BLOCKT .BYTE 103,10. ;A .WORD WRBLK ; ! .WORD IO.EOF ;WRITE END OF FILE .BYTE 101,10. ;I .WORD WREOF ;0 .WORD IO.RWD ;REWIND .BYTE 117,34. ;/ .WORD WREOF ;L .WORD IO.SPB ;SPACE BLOCK0 .BYTE 115,128. ; .WORD SPCBK ;, .WORD IO.SPF ;SPACE FILE .BYTE 113,128. ;4 .WORD SPCBK ;;E; DRIVER DISPATCH TABLEE;E( DDT$ CT,T$$A11 ;GENERATE DISPATCH TABLE;+2; **-CTINI-TA11 TAPE CASSETTE CONTROLLER INITIATOR;1H; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUEG; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THE1H; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN AH; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IH; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER>; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.;I ; INPUTS:E;:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;H ; OUTPUTS:;NB; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAB; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OP; ATION IS INITIATED.E;- .ENABL LSBS=CTINI: GTPKT$ CT,T$$A11,CTPWF ;GET NEXT I/O PACKET TO PROCESS.; 1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:E;T'; R1=ADDRESS OF THE I/O REQUEST PACKET.R-; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.I; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.E:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;ID; TA11 TAPE CASSETTE FUNCTION INDEPENDENT I/O REQUEST PACKET FORMAT:;E"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK.T@; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.B; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTOR TASK HEADEB; WD. 05 -- I/O FUNCTION CODE (IO. RLB 1 IO.RWD/IO.SPB/IO.SPF/IO.E0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.B; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140003; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.U; - MOV #LGFCN,R3 ;POINT TO LEGAL FUNCTION TABLE + MOV #6,R0 ;SET NUMBER OF ENTRIES IN TABLE-.10$: CMP I.FCN(R1),(R3)+ ;FUNCTION CODE MATCH? BEQ 20$ ;IF EQ YES+ CMP (R3)+,(R3)+ ;POINT TO NEXT TABLE ENTRYK! DEC R0 ;ANY MORE TABLE ENTRIES?D BGT 10$ ;IF GT YES0 MOV #IE.IFC&377,R0 ;SET ILLEGAL FUNCTION STATUS BR 50$ ;FINISH IN COMMON CODEO;N; FUNCTION CODE MATCH FOUND ; ,20$: SWAB R2 ;SWAP UNIT NUMBER TO LEFT BYTE- BISB (R3)+,R2 ;MERGE FUNCTION CODE WITH UNITT( MOVB (R3)+,S.ITM(R4) ;SPACING FUNCTION? BPL 30$ ;IF PL NOO;L/; SPACING FUNCTION DEPENDENT I/O PACKET FORMAT:;:@; WD. 12 -- SPACING COUNT (POSITIVE=FORWARD, NEGATIVE=BACKWARD).; WD. 13 -- NOT USED. ; WD. 14 -- NOT USED.D; WD. 15 -- NOT USED.E; WD. 16 -- NOT USED. ; WD. 17 -- NOT USED.7; WD. 20 -- NOT USED.O;T5 BISB #S3.SIP,S.ST3(R4) ;SET POSITIONING IN PROGRESSC= MOV U.BUF(R5),I.PRM+4(R1) ;MOVE SPACING COUNT TO COMMON PLAC < MOV U.BUF(R5),U.CNT(R5) ;MOVE SPACING COUNT TO COMMON PLACE$ BEQ 40$ ;IF EQ NO SPACING REQUIRED BPL 30$ ;IF PL SPACE FORWARD00E˜]�]l1DATADATADATADATADATADATADATA) NEG U.CNT(R5) ;CONVERT TO POSITIVE COUNT:+ NEG I.PRM+4(R1) ;CONVERT TO POSITIVE COUNT,( SUB #4,R2 ;CONVERT TO REVERSE FUNCTION; :; READ/WRITE LOGICAL FUNCTION DEPENDENT I/O PACKET FORMAT:;S+; WD. 12 -- RELOCATION BIAS OF DATA BUFFER. ; WD. 13 -- DATA BUFFER ADDRESS.-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.R; WD. 15 -- NOT USED.A; WD. 16 -- NOT USED.A; WD. 17 -- NOT USED.T; WD. 20 -- NOT USED.T; H; NO FUNCTION DEPENDENT PARAMETERS ARE REQUIRED FOR REWIND AND WRITE EOF;R?30$: MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNT;2 MOV (R3),U.CW2(R5) ;SET INITIAL INTERRUPT ADDRESS( CALL $BMSET ;SET I/O ACTIVE IN BIT MAP% MOV R2,@S.CSR(R4) ;INITIATE FUNCTION:;8; CANCEL I/O OPERATION IS A NOP FOR TA11 TAPE CASSETTES.;ACTCAN: ;REF LABEL; H; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUH; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDIT3; THAT COULD EXIST IN RESTARTING THE I/O OPERATION.I;ECTPWF: RETURN ;.;4; NO SPACING REQUIREDT;V940$: MOV #IS.SUC&377,R0 ;SET SUCCESSFUL COMPLETION STATUST50$: BR 110$ ;B;+4; **-$CTINT-TA11 TAPE CASSETTE CONTROLLER INTERRUPTS;-5 INTSE$ CT,PR6,T$$A11 ;;;GENERATE INTERRUPT SAVE CODET MOV R3,-(SP) ;;;SAVE R3' MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCBN> MOVB S.ITM(R4),S.CTM(R4) ;;;RESET CURRENT DEVICE TIMEOUT COUN' MOV S.CSR(R4),R3 ;;;GET ADDRESS OF CSR $ BIT #200,(R3)+ ;;;TRANSFER REQUEST? BNE 60$ ;;;IF NE YES, MOV -2(R3),U.CW3(R5) ;;;SAVE CURRENT STATUS.60$: CALL @U.CW2(R5) ;;;CALL INTERRUPT ROUTINE. BIS #S2.ACT,S.ST2(R4) ;;;SET I/O ACTIVE FLAG5 MOV (SP)+,U.CW2(R5) ;;;SAVE INTERRUPT RETURN ADDRESSR MOV (SP)+,R3 ;;;RESTORE R3E# JMP $INTXT ;;;EXIT FROM INTERRUPT ;C#; SPACING FUNCTION (FILE AND BLOCK)U;BSPCBK: BMI 70$ ;;;IF MI ERROR) DEC U.CNT(R5) ;;;DECREMENT SPACING COUNTV BLE 70$ ;;;IF LE DONEC& INC -(R3) ;;;INITIATE NEXT OPERATION- CALL @(SP)+ ;;;SET INTERRUPT RETURN ADDRESS  BR SPCBK ;;;GO AGAIN)70$: CLR -(R3) ;;;CLEAR INTERRUPT ENABLEC' TST (SP)+ ;;;REMOVE RETURN FROM STACK2 MOV (SP)+,R3 ;;;RESTORE R3T' CALL $FORK ;;;CREATE A SYSTEM PROCESST# MOV U.CW3(R5),R1 ;GET FINAL STATUS  BPL 90$ ;IF PL SUCCESS. BICB #^C<7*2>,R1 ;CLEAR ALL BUT FUNCTION CODE, CMPB #5*2,R1 ;FORWARD OR REVERSE FUNCTION? BLE 100$ ;IF LE FORWARDR5 BIC #120777,R1 ;CLEAR ERROR, BOT, UNIT, AND FUNCTIONC BEQ 40$ ;IF EQ NO ERRORS BR 100$ ;ANALYZE ERROR;S; READ LOGICAL FUNCTIONS; RDBLK: BMI WREOF ;;;IF MI ERROR& DEC U.CNT(R5) ;;;DECREMENT BYTE COUNT" BLT 80$ ;;;IF LT NO MORE TO READ/ MOV (R3),-(SP) ;;;READ BYTE FROM DATA REGISTERE( CALL $PTBYT ;;;PUT BYTE IN USER BUFFER- CALL @(SP)+ ;;;SET INTERRUPT RETURN ADDRESS  BR RDBLK ;;;GO AGAIN;N; WRITE LOGICAL FUNCTION;O WRBLK: BMI WREOF ;;;IF MI ERROR& DEC U.CNT(R5) ;;;DECREMENT BYTE COUNT# BLT 80$ ;;;IF LT NO MORE TO WRITEB* CALL $GTBYT ;;;GET BYTE FROM USER BUFFER1 MOVB (SP)+,(R3) ;;;WRITE BYTE INTO DATA REGISTER:- CALL @(SP)+ ;;;SET INTERRUPT RETURN ADDRESSE BR WRBLK ;;;GO AGAIN'80$: INC U.CNT(R5) ;;;ADJUST BYTE COUNT,- BIS #20,-(R3) ;;;INITIATE LAST BYTE SEQUENCEP- CALL @(SP)+ ;;;SET INTERRUPT RETURN ADDRESS ;T(; REWIND AND WRITE END OF FILE FUNCTIONS;A+WREOF: CLR -(R3) ;;;CLEAR INTERRUPT ENABLEL' TST (SP)+ ;;;REMOVE RETURN FROM STACKR MOV (SP)+,R3 ;;;RESTORE R3B' CALL $FORK ;;;CREATE A SYSTEM PROCESS <90$: MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL COMPLETION STATUS# MOV U.CW3(R5),R1 ;GET FINAL STATUSP BPL 110$ ;IF PL SUCCESS +100$: SWAB R1 ;SWAP ERROR BITS TO LOW BYTEC2 MOV #ERRTB,R2 ;GET ADDRESS OF ERROR CONTROL TABLE,105$: CLR R0 ;PICKUP NEXT ERROR STATUS CODE BISB (R2)+,R0 ; BITB (R2)+,R1 ;ERROR BIT SET? BEQ 105$ ;IF EQ NO. BITB #26,R1 ;WRITE LOCK, TIMING OR OFF-LINE? BEQ 110$ ;IF EQ NO' MOV S.CSR(R4),R2 ;RETREIVE CSR ADDRESS  CALL $DVERR ;LOG DEVICE ERRORR BR 110$ ;FINISH I/O;MH; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING TERMINATED. TIMEF; USUALLY CAUSED BY POWERF00E ]F¡]G¥]eaek›’AILURE BUT ALSO MAY BE THE RESULT OF A HARD-; WARE FAILURE.T;)CTOUT: CALL $DTOER ;;;LOG DEVICE TIMEOUTT6110$: MOV S.PKT(R4),R1 ;RETRIEVE ADDRESS OF I/O PACKET7 BICB #S3.SIP,S.ST3(R4) ;RESET POSITIONING IN PROGRESS;- MOV I.PRM+4(R1),R1 ;GET ORIGINAL COUNT VALUEO+ SUB U.CNT(R5),R1 ;SUBTRACT COUNT REMAINING)2 MOV #401,R2 ;SET CURRENT AND FINAL RETRY COUNT=1# CALL $IODON ;FINISH I/O OPERATIONM JMP CTINI ;GO AGAINL .DSABL LSBR .ENDTION BEING TERMINATED. TIMEF; USUALLY CAUSED BY POWERF .TITLE CVRTM .IDENT /02/ ;; ; COPYRIGHT (C) 1974, 1976, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;.A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED$9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.M;R ; VERSION 02;I; D. N. CUTLER 12-AUG-73;,; PREVIOUSLY MODIFIED BY:;V; D. N. CUTLER;E; MODIFIED BY:;R;+; **-$CVRTM-CONVERT TIME;;C; THIS ROUTINE IS CALLED TO CONVERT A TIME INTERVAL-TIME UNITS PAIRR; TO A CLOCK TICKS COUNT.P; ; INPUTS:T;.; R3=ADDRESS OF TIME INTERVAL-TIME UNITS PAIR.;9 ; OUTPUTS:;Q7; IF AN ILLEGAL TIME INTERVAL (GREATER THAN 15 BITS) OR ;; ILLEGAL TIME UNITS (ZERO OR GREATER THAN 4) IS SPECIFIED,E;; THEN A DIRECTIVE STATUS OF 'D.RS93' IS RETURNED. ELSE THEO<; TICKS COUNT IS RETURNED WITH THE HIGH ORDER PART IN R0 AND=; THE LOW ORDER PART IN R1. R3 IS ADVANCED BY 4 THUS POINTINGT); PAST THE TIME INTERVAL-TIME UNITS PAIR.D;-'$CVRTM::MOV (R3)+,R1 ;GET TIME INTERVAL & BMI 70$ ;IF MI ILLEGAL TIME INTERVAL MOV (R3)+,R0 ;GET TIME UNITSR DEC R0 ;BACK OFF BY ONE  CMP R0,#3 ;LEGAL UNITS?A BHI 70$ ;IF HI NOT# ASL R0 ;CONVERT TO DISPATCH INDEXU ADD R0,PC ;DISPATCHH10$: BR 50$ ;1=TICKS  BR 30$ ;2=SECONDSU BR 20$ ;3=MINUTESR MOV #60.,R0 ;4=HOURS( CALL $MUL ;CALCULATE NUMBER OF MINUTES TST R0 ;OVERFLOW 16 BITS?A BNE 70$ ;IF NE YES120$: CMP R1,#1440. ;MORE THAN ONE DAY OF MINUTES?M BHI 70$ ;IF HI YES( MOV #30.,R0 ;MULTIPLY BY 60. SECONDS/2- CALL $MUL ;PRODUCT CANNOT OVERFLOW 16 BITS.3# MOV $TKPS,R0 ;GET TICKS PER SECONDK ASL R0 ;MULTIPLY BY 2 BR 40$ ;'30$: MOV $TKPS,R0 ;GET TICKS PER SECONDR&40$: CALL $MUL ;CALCULATE TICKS COUNT"50$: MOV R0,R2 ;TICKS COUNT ZERO? BIS R1,R2 ; BNE 60$ ;IF NE NO INC R1 ;MAKE TICKS COUNT 160$: RETURN ;N(70$: DRSTS D.RS93 ;SET DIRECTIVE STATUS .ENDE 70$ ;IF NE YES120$: CMP R1,#1440. ;MORE THAN ONE DAY OF MINUTES?M BHI 70$ ;IF HI YES( MOV #30.,R0 ;MULTIPLY BY 60. SECONDS/2- CALL $MUL ;PRODUCT C .TITLE DKDRV .IDENT /09/;; COPYRIGHT (C) 1974, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 09;; D. N. CUTLER 19-OCT-73;; PREVIOUSLY MODIFIED BY:;; P. J. BEZEREDI; D. N. CUTLER; C. A. D'ELIA;; MODIFIED BY:;; P. J. BEZEREDI 14-DEC-77;6; PB050 -- REMOVE UNNEEDED CONDITIONALS FOR RSX-11M+.;; P. J. BEZEREDI 21-AUG-78;6; PB083 -- ADDITION OF SOFTWARE VOLUME VALID SUPPORT.; ; P. J. BEZEREDI 06-OCT-78; 1; PB089 -- MAKE USE OF EXTENDED INSTRUCTION SET.C;E;D; RK11 CARTRIDGE DISK DRIVER;N; MACRO LIBRARY CALLSR;O .MCALL HWDDF$,PKTDF$E$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;J; EQUATED SYMBOLS ;LRETRY=8. ;ERROR RETRY COUNTD; ; LOCAL DATA;E>; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER);1<RTTBL: .BLKW R$$K11 ;ERROR RETRY COUNT AND DRIVE RESET FLAG;A; DIAGNOSTIC FUNCTION TABLE;.!FUNTBL: .WORD IO.HMS!IQ.UMD, 05159 .WORD IO.BLS!IQ.UMD, 0511!FUNTB0: .WORD IO.RDH!IQ.UMD, 2505R .WORD IO.WDH!IQ.UMD, 2503 .WORD IO.WCK!IQ.UMD, 0507FUNTBE:$;E; DRIVER DISPATCH TABLEA;R( DDT$ DK,R$$K11 ;GENERATE DISPATCH TABLE;+3; **-DKINI-RK11 CARTRIDGE DISK CONTROLLER INITIATOR ;NH; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUEG; IS QUEUED AND AT THE END OF A PREVIOUS I00G¨]�]l1DATADATADATADATADATADATADATA/O OPERATION TO PROPAGATE THE H; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN AH; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IH; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER>; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.;P ; INPUTS:;+:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;H ; OUTPUTS:;NB; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAB; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OP; ATION IS INITIATED.E;- .ENABL LSBS=DKINI: GTPKT$ DK,R$$K11,DKCAN ;GET NEXT I/O PACKET TO PROCESS.; 1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:E;T'; R1=ADDRESS OF THE I/O REQUEST PACKET.R-; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.I; R3=CONTROLLER INDEX.(; R4=ADDRESS OF THE STATUS CONTROL BLOCK:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;E0; RK11 CARTRIDGE DISK I/O REQUEST PACKET FORMAT:;A"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK.A@; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.B; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTOR TASK HEADE1; WD. 05 -- I/O FUNCTION CODE (IO.RLB OR IO.WLB).I0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.B; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140003; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.A; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER.S+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.3-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.K; WD. 15 -- NOT USED.O9; WD. 16 -- LOW BYTE MUST BE ZERO AND HIGH BYTE NOT USED. 0; WD. 17 -- LOGICAL BLOCK NUMBER OF I/O REQUEST.A; WD. 20 -- RELOCATION BIAS OF DIAGNOSTIC REG. ADRS ELSE NOT USEDN<; WD. 21 -- DIAGNOSTIC REG. BLK ADRS (REAL OR DISPL.+140000);(= MOV #RETRY&377,RTTBL(R3) ;CLEAR POSITIONING AND SET RETRIESS$ CALL $VOLVD ;VALIDATE VOLUME VALID BCS 8$ ;IF CS WE FAILED) TST R0 ;TRANSFER FUNCTION? BMI 1$ ;IF MI YES/ TST I.PRM+2(R1) ;SIZE THE DISK? BPL 8$ ;IF PL NO# ASH #13.,R2 ;POSITION UNIT NUMBER ' MOV S.CSR(R4),R0 ;RETREIVE CSR ADDRESS  MOV R2,6(R0) ;SELECT THE DRIVEL MOV R0,R2 ;COPY CSR ADDRESSD# JMP 130$ ;PASS REGISTERS AND EXIT 1$: ;REF LABELU .IF DF M$$EXT, CALL $STMAP ;SET UP UNIBUS MAPPING ADDRESS .ENDC8 CMPB #IO.HMS/^D<256>,I.FCN+1(R1) ;DIAGNOSTIC FUNCTION? BNE 5$ ;IF NE NO. MOV #FUNTBL,R0 ;GET ADDRESS OF FUNCTION TABLE-2$: CMP (R0)+,I.FCN(R1) ;FUNCTION CODE MATCH? BEQ 3$ ;IF EQ YESE# TST (R0)+ ;BYPASS CONTROLLER CODE#' CMP #FUNTBE,R0 ;END OF FUNCTION TABLE?R BEQ 5$ ;IF EQ YES  BR 2$ ;TRY AGAIN)3$: CMP R0,#FUNTB0 ;POSITIONING FUNCTION?S BHI 4$ ;IF HI NO6 INCB RTTBL+1(R3) ;YES, INDICATE POSITIONING OPERATION44$: BIS (R0),U.BUF(R5) ;SET CONTROLLER FUNCTION BITS BR 10$ ;GO CHECK BLOCK NUMBERM/5$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTIONE1 BIS #505,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTIONC6 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?% BHIS 9$ ;IF HIS FUNCTION IS ILLEGALB8$: JMP 120$ ;EXIT#,9$: BEQ 10$ ;IF EQ FUNCTION IS READ LOGICAL4 SUB #2,U.BUF(R5) ;CONVERT TO WRITE LOGICAL FUNCTION-10$: CALL $BLKCK ;CHECK LOGICAL BLOCK NUMBERO+ CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBERG TST R1 ;WHICH SURFACE? BEQ 15$ ;IF EQ SURFACE 0 BIS #20,R0 ;SET SURFACE 1 BITO-15$: MOVB U.UNIT(R5),R1 ;RETREIVE UNIT NUMBERG( ASH #13.,R1 ;POSITION UNIT SELECT BITS% ASH #5,R2 ;POSITION CYLINDER NUMBER51 BIS R1,R2 ;MERGE UNIT BITS WITH CYLINDER NUMBERI( BIS R0,R2 ;MERGE TRK/SEC WITH CYLINDER0 MOV R2,I.PRM+10(R3) ;SAVE STARTING DISK ADDRESS;S; INITIATE I/O OPERATION;R30$: ;REF LABEL .IF DF M$$EXT% CALL $MPUBM ;MAP UNIBUS TO TRANSFER  .ENDC% MOV S.CSR(R4),R2 ;GET ADDRESS OF CSRC9 MOV S.PKT(R4),R1 ;RETRIEVE ADDRESS OF I/O REQUEST PACKET ; MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUN00G°]¡]G¥]eaek›’T3+ ADD #6,R2 ;POINT TO DISK ADDRESS REGISTER , MOV I.PRM+10(R1),(R2) ;INSERT DISK ADDRESS. MOV U.BUF+2(R5),-(R2) ;INSERT BUFFER ADDRESS8 MOV U.CNT(R5),-(R2) ;INSERT NUMBER OF BYTES TO TRANSFER! ROR (R2) ;CONVERT TO WORD COUNTE$ NEG (R2) ;MAKE NEGATIVE WORD COUNT TST -(R2) ;POINT BACK TO CSR+ MOV #IE.DNR&377,R0 ;ASSUME DRIVE NOT READY TSTB -4(R2) ;IS DRIVE READY? BMI 31$ ;IF MI YES/ BITB #US.SPU,U.STS(R5) ;IS DRIVE SPINNING UP?M BNE 35$ ;IF NE YES/ BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC OPERATION?  BNE 51$ ;IF NE YES# CALL $DVERR ;LOG DEVICE NOT READYI JMP 110$ ;FINISH UPV531$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UPR( CALL $BMSET ;SET I/O ACTIVE BIT IN MAP+ MOV U.BUF(R5),(R2) ;;;LOAD FUNCTION AND GO(;;<; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.;E#DKCAN: RETURN ;;;NOP FOR THE RK11T;+:; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND>; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT=; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVES?; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANY1A; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESS ; THE UNIT IS ALREADY READY.;-3DKPWF: TSTB S.STS(R4) ;IS THE DRIVE CURRENTLY BUSY?I BEQ 36$ ;IF EQ NO 0 MOVB #3,S.STS(R4) ;WAIT A MAXIMUM OF 45 SECONDS.35$: MOVB #15.,S.CTM(R4) ;15 SECONDS AT A TIME236$: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UP RETURNT;+*; **-$DKINT-RK11 DISK CONTROLLER INTERUPTS;-8 INTSE$ DK,PR5,R$$K11 ;;;SAVE REGISTERS AND SET PRIORITY- TSTB RTTBL+1(R4) ;;;DRIVE RESET IN PROGRESS?E BEQ 50$ ;;;IF EQ NO & MOV R4,-(SP) ;;;SAVE CONTROLLER INDEX' MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCBD) MOV @S.CSR(R4),R4 ;;;GET CONTENTS OF CSRV$ BMI 40$ ;;;IF MI DRIVE RESET ERROR' BIT #20000,R4 ;;;DRIVE RESET COMPLETE?  BNE 40$ ;;;IF NE YES TST (SP)+ ;;;CLEAN STACK RETURN ;;;S-40$: MOV (SP)+,R4 ;;;RESTORE CONTROLLER INDEXT+50$: CALL $FORK ;;;CREATE A SYSTEM PROCESSI" MOV R4,R3 ;COPY CONTROLLER INDEX% MOV U.SCB(R5),R4 ;GET ADDRESS OF SCBT% MOV S.CSR(R4),R2 ;GET ADDRESS OF CSRE/ MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFERV) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESST7 BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION EXECUTED?S51$: BNE 130$ ;IF NE YESE TST (R2) ;ANY ERRORS?, BPL 65$ ;IF PL NOP CALL $DVERR ;LOG DEVICE ERRORT* MOV -2(R2),R1 ;SAVE ERROR STATUS REGISTER-53$: MOV S.PKT(R4),R0 ;GET I/O PACKET ADDRESS0& BITB #IQ.X,I.FCN(R0) ;INHIBIT RETRIES BNE 80$ ;IF NE YES" DECB RTTBL(R3) ;ANY MORE RETRIES? BLE 80$ ;IF LE NO MOV #1,(R2) ;CLEAR CONTROLLER 9 CLRB RTTBL+1(R3) ;CLEAR POSSIBLE DRIVE RESET IN PROGRESSV*55$: BIT #110000,R1 ;DRIVE RESET REQUIRED? BEQ 70$ ;IF EQ NO;560$: MOVB #1,RTTBL+1(R3) ;SET DRIVE RESET IN PROGRESSE. MOVB S.ITM(R4),S.CTM(R4) ;RESET TIMEOUT COUNT, MOV S.PKT(R4),R1 ;GET ADDRESS OF I/O PACKET0 MOV I.PRM+10(R1),6(R2) ;SET PROPER DRIVE NUMBER MOV #515,(R2) ;RESET DRIVES RETURN ;./65$: ASRB RTTBL+1(R3) ;DRIVE RESET IN PROGRESS?S BCC 75$ ;IF CC NOY70$: JMP 30$ ;RETRY FUNCTIONE975$: BITB #IO.WLC&377,I.FCN(R1) ;WRITE WITH WRITE CHECK?E BNE 76$ ;IF NE YES- BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED?T BEQ 110$ ;IF EQ NO076$: MOV U.BUF(R5),R1 ;GET CURRENT FUNCTION CODE- BIT #1*2,R1 ;WRITE OR WRITE CHECK FUNCTION?S BEQ 110$ ;IF EQ NO- BIS #2*2,U.BUF(R5) ;SET WRITE CHECK FUNCTIONI* BIT #2*2,R1 ;WAS FUNCTION A WRITE CHECK? BNE 110$ ;IF NE YESR4 MOV #RETRY&377,RTTBL(R3) ;REINITIALIZE RETRY COUNT% BR 70$ ;START WRITE CHECK OPERATION0080$: MOV #IE.WLK&377,R0 ;ASSUME WRITE LOCK ERROR! BIT #20000,R1 ;WRITE LOCK ERROR?K BNE 110$ ;IF NE YESS- MOV #IE.WCK&377,R0 ;ASSUME WRITE CHECK ERRORT ASR R1 ;GOOD ASSUMPTION?# BCS 110$ ;IF CS WRITE CHECK ERRORO, MOV #IE.VER&377,R0 ;SET UNRECOVERABLE ERROR.110$: MOV 2(R2),R1 ;GET WORDS LEFT TO TRANSFER+ ASL R1 ;CONVERT TO BYTES LEFT TO TRANSFER 6 ADD U.CNT(R5),R1 ;CALCULATE BYTES ACTUALLY TRANSFERED MOV #1,(R2) ;CLEAR CONTROLLERA2120$: MOVB S.CON(R4),R3 ;RETREIVE 00G¸]ĺ]Ž]DATADATADATADATADATADATADATACONTROLLER INDEX/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTK/ BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNT1# CALL $IODON ;FINISH I/O OPERATION ! JMP DKINI ;PROCESS NEXT REQUEST ;DE; DEVICE TIMEOUT RESULTS IN A CONTROL AND DRIVE RESET FOLLOWED BY THE C; I/O OPERATION BEING REPEATED UNLESS THE OPERATION WAS DIAGNOSTIC.FA; TIMEOUTS ARE USUALLY CAUSED BY POWERFAILURE BUT MAY ALSO BE THE ; RESULT OF A HARDWARE FAILURE.R;7DKOUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP?R BEQ 125$ ;;;IF EQ NO- DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET?N BEQ 125$ ;;;IF EQ YESM MTPS #0 ;;;ALLOW INTERRUPTSL JMP 30$ ;N-125$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSYE3 BICB #US.SPU,U.STS(R5) ;;;RESET DRIVE SPINNING UPN# CALL $DTOER ;;;LOG DEVICE TIMEOUT 0 BCC 140$ ;IF CC TIMEOUT DURING NORMAL FUNCTION5130$: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASKL) BR 110$ ;DIAGNOSTIC PROCESSING COMPLETED)140$: MOV #110000,R1 ;SET FOR DRIVE RESET. BR 53$ ; .DSABL LSBN .END BEQ 1E TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER (FROM IOSUB.MAC)E;N E;+); .KRLOC -- RELOCATE USER VIRTUAL ADDRESS ;E5; THIS ROUTINE TRANSFORMAS A 16 BIT USER ADDRESS INTOO?; A RELOCATION BIAS AND DISPLACEMENT IN BLOCK RELATIVE TO APR6. ;O ; INPUTS:T; %; R0 USER VIRTUAL ADDRESS TO RELOCATE;O ; OUTPUTS:; ,; R1 RELOCATION BIAS TO BE LOADED INTO PAR6.2; R2 DISPLACEMENT IN BLOCK PLUS 140000 (PAR6 BIAS);B; REGISTERS ALTERED:;A; R1;S;-.KRLOC:: ;REF LABEL .IF NDF M$$MGEE" MOV R0,R2 ;COPY PHYSICAL ADDRESS CLR R1 ;CLEAR RELOCATION BIAS .IFFL! MOV R0,R1 ;COPY VIRTUAL ADDRESS% CLR R2 ;ZERO APR NUMBER ACCUMULATOR  ASL R1 ;COLLECT APR NUMBER ROL R2 ; ASL R1 ; ROL R2 ; ASL R1 ; ROL R2 ; ASL R2 ;CONVERT TO APR INDEX CLRB R1 ;CLEAR EXTRANEOUS BITS+ SWAB R1 ;COLLECT BLOCK NUMBER IN LOW BYTEN ROR R1 ;- ADD UISAR0(R2),R1 ;CALCULATE RELOCATION BIAS)! MOV R0,R2 ;COPY VIRTUAL ADDRESS14 BIC #177700,R2 ;CLEAR ALL BUT DISPLACEMENT IN BLOCK BIS #140000,R2 ;SET APR 6 BIASD .ENDC ;M$$MGE RETURN ;A .ENDFFL! MOV R0,R1 ;COPY VIRTUAL ADDRESS% CLR R2 ;ZERO APR .NLIST .TITLE KPRE .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I;  ;HB; ASSEMBLY PREFIX FILE FOR K-SERIES PERIPHERAL SUPPORT SUBROUTINES; YM$$MGE=0 ;MAPPED SYSTEM%N$$MBF=8. ;MAXIMUM NUMBER OF BUFFERSAK$$W11=1 ;KW11-K CLOCK SUPPORTLK$W11K=1 ;KW11-K CLOCK G$$HST=0 ;GTHIST DATA BASEO$FT$MOP=0 ;MULT. CLOCK DRIVEN SWEEPS'N$AD11=1 ;AD11-K A/D CONVERTER SUPPORTNA$$M11=0 ;AM11-K SUPPORTIN$DR11=1 ;DR11-K SUPPORTT N$AA11=1 ;AA11-K D/A CONVERTERS)N$$SWB=5 ;NUMBER OF SWEEP CONTROL BLOCKST;OC; MACRO TO DEFINE JUMP TO SUBROUTINE WITH RETURN TO CALLER'S CALLERE;Y .MACRO CALLR ARGS JMP ARG .ENDM;O3; MACROS TO REFERENCE PSW FOR NON-LSI-11 PROCESSORSM;8 .IF NDF L$$SI1R .00ÅÀ]ÆÁ]¥]eaek›’MACRO MFPS DST1 MOVB @#PS,DST .ENDM .MACRO MTPS SRC .IF IDN <#0>, CLRB @#PS .IFF MOVB SRC,@#PS .ENDC .ENDM .ENDC .LIST;AD11-K A/D CONVERTER SUPPORTNA$$M11=0 ;AM11-K SUPPORTIN$DR11=1 ;DR11-K SUPPORTT N$AA11=1 ;AA11-K D/A CONVERTERS)N$$SWB=5 ;NUMBER OF SWEEP CONTROL BLOCKST;OC; MACRO TO DEFINE JUMP TO SUBROUTINE WITH RETURN TO CALLER'S CALLERE;Y .MACRO CALLR ARGS JMP ARG .ENDM;O3; MACROS TO REFERENCE PSW FOR NON-LSI-11 PROCESSORSM;8 .IF NDF L$$SI1R .$ .TITLE KSTB SETUP BUFFERS FOR SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 19-JUL-77;E<; THIS MODULE SETS UP THE BUFFER INFORMATION PART OF THE SWB;T; SYSTEM MACRO CALLS;T .MCALL KSWDF$ KSWDF$  2 .SBTTL .K.STB SET UP BUFFER INFORMATION FOR SWEEP;+'; .K.STB -- SETUP BUFFER INFO FOR SWEEP ;C ; INPUTS:U;1; R4 POINTS TO SWEEP CONTROL BLOCK WHICH HAS BEENT; SETUP BY .K.SET;N ; OUTPUTS:;; C-CLEAR ALL OK:; THE BUFFER POINTERS (CURRENT AND INITIAL) ARE SETUP FOR%; EACH BUFFER SPECIFIED BY THE USER. ;D!; C-SET ILLEGAL NUMBER OF BUFFERSB;1; REGISTERS ALTERED:;L; R0-R3 ; ;-.K.STB::MOV R5,-(SP) ;SAVE R52 MOV S.WBPT(R4),R5 ;PICKUP POINTER TO 'IBUF' ARRAY ; (SETUP BY .K.SET)S- MOV R5,S.WUSW(R4) ;SET USER MODE USW ADDRESSS MOV R5,R0 ;COPY FOR .KRLOC CALL .KRLOC ;RELOCATE TO APR6I# MOV R1,S.WUSW+2(R4) ;SET APR6 BIASB& MOV R2,S.WUSW+4(R4) ;AND DISPLACEMENT* ADD #IB.DVQ,R5 ;POINT TO THE DEVICE QUEUE4 MOVB (R5),S.WBNO(R4) ;GET THE CURRENT BUFFER SET UP3 BMI 220$ ;IF MI RLSBUF HAS NOT BEEN CALLED--ERRORO .REPT 7' MOVB 1(R5),(R5)+ ;MOVE THE QUEUE DOWN  .ENDM! MOVB #-1,(R5) ;MARK END OF QUEUEP) MOV S.WBPT(R4),R5 ;GET PTR TO IBUF AGAIN 0 ADD #IB.NBF,R5 ;POINT TO NUMBER OF BUFFERS WORD3 MOV (R5)+,-(SP) ;PUSH NUMBER OF BUFFERS ONTO STACKC BLE 200$ ;IF LE THEN ERROR) CMP (SP),#8. ;CHECK FOR TOO MANY BUFFERSV BHI 200$ ;IF HI YESI. CLRB 1(SP) ;@SP=<#BUFFERS>,;E9; RUN THROUGH THE USER BUFFER LIST AND RELOCATE AS NEEDEDB;2/20$: MOV (R5)+,R0 ;GET NEXT USER BUFFER ADDRESS CALL .KRLOC ;RELOCATE TO APR6V! MOVB 1(SP),R3 ;GET BUFFER NUMBERV ASL R3 ;MULTIPLY ASL R3 ; BY 4W5 ADD R4,R3 ; TO INDEX INTO THE SWEEP CONTROL BLKI: ADD #S.WIBP,R3 ;INDEX INTO S.WIBP INITIAL BUFFER POINTERS4 MOV R1,(R3)+ ;SET APR6 BIAS (0 ON UNMAPPED SYSTEMS)7 MOV R2,(R3)+ ;SET DISPLACEMENT (PHYS ADDR ON UNMAPPED)F> CMPB 1(SP),S.WBNO(R4);IS THIS BUFFER THE FIRST BUFFER TO USE? BNE 40$ ;IF NE NOB3 MOV R1,S.WBPT(R4) ;YES--SET CURRENT BUFFER POINTER+ MOV R2,S.WBPT+2(R4) ; ...40$: INCB 1(SP) ;NEXT BUFFER  DECB (SP) ;MORE TO DO? BGT 20$ ;IF GT YES CLR (SP)+ ;NO--CLEAR STACK BR 300$ ;GO RETURN; ; ILLEGAL NUMBER OF BUFFERSO;L4200$: TST (SP)+ ;CLEAR NUMBER OF BUFFERS FROM STACK220$: SEC ;FLAG AN ERROR300$: MOV (SP)+,R5 ;RESTORE R5 RETURN ;RETURN WITH C CORRECT .ENDDDR ON UNMAPPED)F> CMPB 1(SP),S.WBNO(R4);IS THIS BUFFER THE FIRST BUFFER TO USE? BNE 40$ ;IF NE NOB3 MOV R1,S.WBPT(R4) ;YES--SET CURRENT BUFFER POINTER+ MOV R2,S.WBPT+2(R4) ; ...40$: INCB 1(SP) ;NEXT BUFFER  DECB (SP) ;MORE TO DO? BGT 20$ ;IF GT YES CLR (SP)+ ;NO--CLEAR STACK00ÇÈ]IÌ]½]DATADATADATADATADATADATADATA) .TITLE KSTIBF SETUP IBUF ARRAY FOR SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-AUG-77;E'; THIS ROUTINE SETS UP THE 'IBUF' ARRAYT A;+#; SETIBF -- INITIALIZE 'IBUF' ARRAYR; 3; THIS ROUTINE SETS UP THE 'IBUF' ARRAY FOR A SWEEPL;T; CALLING SEQUENCE:C;8; CALL SETIBF (IBUF, IND, LPATAB, BUF1, BUF2,... , BUFN);I ; INPUTS:O;E#; IBUF IS AN ARRAY OF DIMENSION 40.M#; BUFN IS THE ADDRESS OF BUFFER 'N'R1; LPADTB UNUSED--PRESENT FOR LPA-11 COMPATIBILITY ; ; OUTPUTS:;O; IND RETURNS THE STATUS4; 0 TOO MANY BUFFERS--ADJUSTED FOR MAXIMUM (N$$MBF); 1 IBUF SET OK ; THE IBUF ARRAY IS INITIALIZED;T;-)SETIBF::MOVB (R5),R1 ;GET # OF ARGUMENTS' TST (R5)+ ;SKIP COUNTERU MOV (R5)+,R2 ;GET IBUF ADDRESS  MOV (R5)+,R3 ;GET IND ADDRESS INC R3 ;CHECK FOR -1 BEQ 5$ ;IF EQ LEAVE IT 0 DEC R3 ;GET ADDRESS BACK MOV #1,(R3) ;INIT TO SUCCESS5$: TST (R5)+ ;SKIP LPATABR# SUB #3,R1 ;ONLY COUNT THE BUFFERSP: MOV #I$BFVW,(R2)+ ;SET THE IBUF VALIDATION WORD INTO WD 1& CLR (R2)+ ;CLEAR SECOND WORD OF IBUF MOV #-1,(R2) ;INITIALIZE QUEUES .REPT 9.  MOV (R2)+,(R2) ;... .ENDM TST (R2)+ ;MOVE TO NEXT WORD) CMP R1,#N$$MBF ;LEG .TITLE DPDRV .IDENT /08/; ; COPYRIGHT (C) 1974, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 08;; D. N. CUTLER 9-FEB-74;; PREVIOUSLY MODIFIED BY:;; P. J. BEZEREDI; D. N. CUTLER; C. A. D'ELIA;; MODIFIED BY:;;; P. J. BEZEREDI 14-DEC-77;6; PB050 -- REMOVE UNNEEDED CONDITIONALS FOR RSX-11M+.;; P. J. BEZEREDI 21-AUG-78; 6; PB083 -- ADDITION OF SOFTWARE VOLUME VALID SUPPORT.;I; P. J. BEZEREDI 01-FEB-79;S8; PB097 -- ISSUE RECALIBRATE IF HEADER NOT FOUND ERROR.;O&; RP11-C/E DISK PACK CONTROLLER DRIVER;H; MACRO LIBRARY CALLSN; .MCALL HWDDF$,PKTDF$ $ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;.; EQUATED SYMBOLS ;LRETRY=8. ;ERROR RETRY COUNT ; ; LOCAL DATA;7>; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER); <RTTBL: .BLKW R$$P11 ;ERROR RETRY COUNT AND POSITIONING FLAG;A ; DIAGNOSTIC FUNCTION CODE TABLE;-"FUNTBL: .WORD IO.HMS!IQ.UMD, 20015 .WORD IO.BLS!IQ.UMD, 20011O .WORD IO.RDH!IQ.UMD, 14105C .WORD IO.WDH!IQ.UMD, 14103  .WORD IO.WCK!IQ.UMD, 00107 FUNTBE:T;H; DRIVER DISPATCH TABLER;S( DDT$ DP,R$$P11 ;GENERATE DISPATCH TABLE;+2; **-DPINI-RP11-C/E DISK PACK CONTROLLER INITIATOR; H; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUEG; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THENH; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN AH; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IH; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER>; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.;I ; INPUTS:E;:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;H ; OUTPUTS:;NB; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAB; 00IÐ]Á]¥]eaek›’ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OP; ATION IS INITIATED.E;- .ENABL LSBS5DPINI: GTPKT$ R$$P11 ;GET NEXT I/O PACKET TO PROCESS ;S1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:E;Q'; R1=ADDRESS OF THE I/O REQUEST PACKET. -; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB. ; R3=CONTROLLER INDEX.); R3=ADDRESS OF THE STATUS CONTROL BLOCK.C:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;T:; RP11-C/E DISK PACK CONTROLLER I/O REQUEST PACKET FORMAT:; "; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK. @; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.B; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTOR TASK HEADE1; WD. 05 -- I/O FUNCTION CODE (IO.RLB OR IO.WLB).R0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.B; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140003; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.A; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER.S+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.3-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.K; WD. 15 -- NOT USED.O9; WD. 16 -- LOW BYTE MUST BE ZERO AND HIGH BYTE NOT USED. 0; WD. 17 -- LOGICAL BLOCK NUMBER OF I/O REQUEST.A; WD. 20 -- RELOCATION BIAS OF DIAGNOSTIC REG. ADRS ELSE NOT USEDN<; WD. 21 -- DIAGNOSTIC REG. BLK ADRS (REAL OR DISPL.+140000);(< MOV #RETRY&377,RTTBL(R3) ;CLEAR RECAL FLAG AND SET RETRIES$ CALL $VOLVD ;VALIDATE VOLUME VALID BCS 8$ ;IF CS WE FAILED  TST R0 ;TRANSFER FUNCTION? BMI 1$ ;IF MI YES TST I.PRM+2(R1) ;SIZE THE DISK? BPL 8$ ;IF PL NO, MOVB R2,U.BUF+1(R5) ;STUFF UNIT SELECT BITS' MOV S.CSR(R4),R2 ;RETREIVE CSR ADDRESSS- CALL 200$ ;ABORT CONTROLLER AND SELECT UNITE# JMP 105$ ;PASS REGISTERS AND EXITF1$: ;REF LABELR .IF DF M$$EXT, CALL $STMAP ;SET UP UNIBUS MAPPING ADDRESS .ENDC) MOVB R2,U.BUF+1(R5) ;INSERT DRIVE NUMBER 8 CMPB #IO.HMS/^D<256>,I.FCN+1(R1) ;DIAGNOSTIC FUNCTION? BNE 5$ ;IF NE NO. MOV #FUNTBL,R0 ;GET ADDRESS OF FUNCTION TABLE-3$: CMP (R0)+,I.FCN(R1) ;FUNCTION CODE MATCH? BEQ 4$ ;IF EQ YESM# TST (R0)+ ;BYPASS CONTROLLER CODE ' CMP #FUNTBE,R0 ;END OF FUNCTION TABLE?R BEQ 5$ ;IF EQ YESO BR 3$ ;TRY AGAIN44$: BIS (R0),U.BUF(R5) ;SET CONTROLLER FUNCTION BITS' BR 10$ ;GO CHECK LOGICAL BLOCK NUMBERL/5$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTIONC1 BIS #105,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTIONC6 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?# BHIS 9$ ;IF HIS FUNCTION IS LEGALG"8$: JMP 100$ ;FUNCTION IS ILLEGAL%9$: BEQ 10$ ;IF EQ FUNCTION WAS READ4 SUB #2,U.BUF(R5) ;CONVERT TO WRITE LOGICAL FUNCTION-10$: CALL $BLKCK ;CHECK LOGICAL BLOCK NUMBERR+ CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBER$3 MOV R2,I.PRM+10(R3) ;SAVE DESIRED CYLINDER ADDRESSB" SWAB R1 ;SWAP TRACK TO HIGH BYTE$ BIS R1,R0 ;MERGE TRACK WITH SECTOR3 MOV R0,I.PRM+12(R3) ;SAVE TRACK AND SECTOR ADDRESSC;N; INITIATE I/O OPERATION;F30$: ;REF LABEL .IF DF M$$EXT% CALL $MPUBM ;MAP UNIBUS TO TRANSFER$ .ENDC% MOV S.CSR(R4),R2 ;GET ADDRESS OF CSRW9 MOV S.PKT(R4),R1 ;RETRIEVE ADDRESS OF I/O REQUEST PACKETI; MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNTL- CALL 200$ ;ABORT CONTROLLER AND SELECT UNITR, ADD #10,R2 ;POINT TO DISK ADDRESS REGISTER8 MOV I.PRM+12(R1),(R2) ;INSERT TRACK AND SECTOR ADDRESS1 MOV I.PRM+10(R1),-(R2) ;INSERT CYLINDER ADDRESSC. MOV U.BUF+2(R5),-(R2) ;INSERT BUFFER ADDRESS8 MOV U.CNT(R5),-(R2) ;INSERT NUMBER OF BYTES TO TRANSFER! ROR (R2) ;CONVERT TO WORD COUNTC$ NEG (R2) ;MAKE NEGATIVE WORD COUNT TST -(R2) ;POINT BACK TO CSR+ MOV #IE.DNR&377,R0 ;ASSUME DRIVE NOT READYT8 MOV -4(R2),-(SP) ;GET CONTENTS OF DRIVE STATUS REGISTER COM (SP) ;COMPLEMENT STATUSE, BIT #140000,(SP)+ ;DRIVE READY AND ON-LINE? BEQ 31$ ;IF EQ YES/ BITB #US.SPU,U.STS(R5) ;IS DRIVE SPINNING UP?V BNE 35$ ;IF NE YES- BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC REQUE00IØ]Ì]½]DATADATADATADATADATADATADATAST?) BNE 39$ ;IF NE YES) CALL $DVERR ;LOG DEVICE NOT READY ERRORB JMP 90$ ;FINISH I/O(531$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UP : CMPB #IO.RDH!IQ.UMD&377,I.FCN(R1) ;READ HEADER FUNCTION? BEQ 33$ ;IF EQ YES; CMPB #IO.WDH!IQ.UMD&377,I.FCN(R1) ;WRITE HEADER FUNCTION?T BNE 34$ ;IF NE NOE833$: BIT #360,10(R2) ;SYNCHRONIZE THE SECTOR COUNTER ...2 BNE 33$ ;... ON THE NEXT INDEX PULSE IN CASE ...1 BIT #360,10(R2) ;... A UNIT OTHER THAN 0 WAS ...I. BNE 33$ ;... SELECTED FOR HEADER OPERATIONS.,34$: CALL $BMSET ;SET I/O ACTIVE IN BIT MAP* MOVB U.BUF(R5),(R2) ;LOAD FUNCTION AND GO;.<; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.;7DPCAN: RETURN ;;;NOP FOR RP11;+:; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND>; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT=; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVED?; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANYAA; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESSB; THE UNIT IS ALREADY READY.;-/DPPWF: TSTB S.STS(R4) ;IS DRIVE CURRENTLY BUSY?  BEQ 36$ ;IF EQ NOI0 MOVB #5,S.STS(R4) ;WAIT A MAXIMUM OF 75 SECONDS.35$: MOVB #15.,S.CTM(R4) ;15 SECONDS AT A TIME236$: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UP RETURNE;+4; **-$DPINT-RP11-C/E DISK PACK CONTROLLER INTERRUPTS;-8 INTSE$ DP,PR5,R$$P11 ;;;SAVE REGISTERS AND SET PRIORITY' MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCBT' MOV S.CSR(R4),R4 ;;;GET ADDRESS OF CSR * BIC #20100,(R4) ;;;CLEAR INTERRUPT ENABLE4 MOVB #377,-4(R4) ;;;CLEAR ATTENTION SUMMARY BITS ON/ CLRB -4(R4) ;;;BOTH OLD AND ECO'D CONTROLLERSV' CALL $FORK ;;;CREATE A SYSTEM PROCESSN MOV R4,R2 ;COPY ADDRESS OF CSR* MOV U.SCB(R5),R4 ;RETRIEVE ADDRESS OF SCB- MOVB S.CON(R4),R3 ;RETRIEVE CONTROLLER INDEX*) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSR/ MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFERR7 BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION EXECUTED?C39$: BNE 105$ ;IF NE YEST) ASRB RTTBL+1(R3) ;HOME SEEK IN PROGRESS?  BCS 59$ ;IF CS YES TST (R2) ;ANY ERRORS?T BPL 50$ ;IF PL NON CALL $DVERR ;LOG DEVICE ERRORC+40$: BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?S BNE 60$ ;IF NE YES" DECB RTTBL(R3) ;ANY MORE RETRIES? BLE 60$ ;IF LE NOR% BIT #1371,-2(R2) ;RECOVERABLE ERROR?E BEQ 60$ ;IF EQ NOM BIT #14000,-4(R2) ;SKI OR HNF?D BEQ 46$ ;IF EQ NO3845$: MOVB #1,RTTBL+1(R3) ;SET HOME SEEK IN PROGRESS FLAG5 MOVB S.ITM(R4),S.CTM(R4) ;RESET DEVICE TIMEOUT COUNTN- CALL 200$ ;ABORT CONTROLLER AND SELECT UNITS- BIS #20015,(R2) ;INITIATE HOME SEEK FUNCTIONS RETURN ; %46$: JMP 30$ ;RETRY ENTIRE OPERATIONR@50$: BITB #IO.WLC&377,I.FCN(R1) ;WRITE FOLLOWED BY WRITE CHECK? BNE 51$ ;IF NE YES5 BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED BY MCR?( BEQ 90$ ;IF EQ NOR)51$: MOVB U.BUF(R5),R1 ;GET LAST FUNCTION)- BIT #1*2,R1 ;WRITE OR WRITE CHECK FUNCTION?  BEQ 90$ ;IF EQ NOO- BIS #2*2,U.BUF(R5) ;SET WRITE CHECK FUNCTION(/ BIT #2*2,R1 ;WAS LAST FUNCTION A WRITE CHECK?O BNE 90$ ;IF NE YES. MOV #RETRY,RTTBL(R3);REINITIALIZE RETRY COUNT% BR 46$ ;START WRITE CHECK OPERATIONR%59$: TST (R2) ;HOME SEEK SUCCESSFUL?L BPL 46$ ;IF PL YES260$: MOV #IE.WLK&377,R0 ;ASSUME DRIVE WRITE LOCKED. MOV -2(R2),R1 ;GET CONTENTS OF ERROR REGISTER! BMI 90$ ;IF MI WRITE LOCK ERRORV- MOV #IE.WCK&377,R0 ;ASSUME WRITE CHECK ERROR1 BIT #10,R1 ;WRITE CHECK ERROR? BNE 90$ ;IF NE YES( MOV #IE.VER&377,R0 ;UNRECOVERABLE ERROR290$: MOV 2(R2),R1 ;GET WORDS REMAINING TO TRANSFER+ ASL R1 ;CONVERT TO BYTES LEFT TO TRANSFER(6 ADD U.CNT(R5),R1 ;CALCULATE BYTES ACTUALLY TRANSFERED! CALL 200$ ;ABORT THE CONTROLLERE2100$: MOVB S.CON(R4),R3 ;RETREIVE CONTROLLER INDEX/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNT(/ BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNT # CALL $IODON ;FINISH I/O OPERATIONK! JMP DPINI ;PROCESS NEXT REQUEST;#E; DEVICE TIMEOUT RESULTS IN A HOME SEEK FOLLOWED BY THE I/O OPERATIONUC; BEING REPEATED UNLESS THE OPERATION WAS DIAGNOSTIC. TIMEOUTS ARER@; USUALLY CA00Ià]Jã]¥]eaek›’USED BY POWERFAILURE BUT MAY ALSO BE THE RESULT OF A; HARDWARE FAILURE.A; 7DPOUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP?S BEQ 104$ ;;;IF EQ NO- DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET?R BEQ 104$ ;;;IF EQ YESE MTPS #0 ;;;ALLOW INTERRUPTSR BR 46$ ;RETRY ENTIRE OPERATION-104$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY3 BICB #US.SPU,U.STS(R5) ;;;RESET DRIVE SPINNING UPW# CALL $DTOER ;;;LOG DEVICE TIMEOUTE0 BCC 110$ ;IF CC TIMEOUT DURING NORMAL FUNCTION5105$: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASKE( BR 90$ ;DIAGNOSTIC PROCESSING COMPLETE5110$: MOVB U.UNIT(R5),1(R2) ;SET CURRENT UNIT NUMBER ) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS4' BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?4 BNE 90$ ;IF NE YES" DECB RTTBL(R3) ;ANY RETRIES LEFT? BLE 90$ ;IF LE NOI BR 45$ ;;+?; THIS ROUTINE WILL ABORT THE CONTROLLER AND SELECT THE CURRENTE>; UNIT. A DELAY IS INITIATED BETWEEN EACH CONTROLLER ABORT TO<; ALLOW THE HARDWARE TIME TO SETTLE DOWN ON FAST PROCESSORS.;-(200$: MOV #1,(R2) ;ABORT THE CONTROLLER- BICB -(SP),(SP)+ ;GIVE THE HARDWARE TIME ...U% BICB -(SP),(SP)+ ;... TO SETTLE DOWN 3 MOV #1,(R2) ;CLEAR ANY ERRORS CAUSED BY THE ABORTI- BICB -(SP),(SP)+ ;GIVE THE HARDWARE TIME ... % BICB -(SP),(SP)+ ;... TO SETTLE DOWNF) MOVB U.BUF+1(R5),1(R2) ;SELECT THE UNIT RETURN ;E .DSABL LSB  .ENDR AND SELECT THE CURRENTE>; UNIT. A DELAY IS INITIATED BETWEEN EACH CONTROLLER ABORT TO<; ALLOW THE HARDWARE TIME TO SETTLE DOWN ON FAST PROCESSORS. .TITLE DRAFFI .IDENT /01/ N; ; COPYRIGHT (C) 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.E;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED 9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;A ; VERSION 01;P; J. E. PROVINO 18-JUL-781; ;+ ; **-$DRSAF-SPECIFY CPU AFFINITY;N9; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ADD CPU AFFINITYA; TO THE CURRENT TASK.;M ; DPB FORMAT:S;R#; WD. 00 -- DIC(161.),DPB SIZE(2.).R; WD. 01 -- AFFINITY MASKI; ; INPUTS:D; 2; R2=ADDRESS OF SECOND STATUS WORD OF CURRENT TASK ; R3=POINTER TO WD. 1 IN THE DPB/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.C,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;A5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK);-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.-&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.U6; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THE TASK1; HAS AN INSTALLED AFFINITY OR IF THE SPECIFIED-; AFFINITY IS INVALID.;-   .IF DF M$$PRO D .ENABL LSBO;$DRSAF::BIT #T2.AFF,(R2) ;WAS TASK INSTALLED WITH AFFINITY?S BNE 10$ ;YES IF NE( MOV T.RRM(R5),R0 ;GET REQUIRED RUN MASK% BIS (R3),R0 ;ADD SPECIFIED AFFINITYE, CALL $TSTAM ;IS TASK'S NEW AFFINITY VALID? BCS 10$ ;NO IF CSU- MOV R0,T.RRM(R5) ;SET AFFINITY IN TASK'S TCB+1 MOV T.PCB(R5),R0 ;GET ADDRESS OF TASK REGION PCB 4 BIS (R3),P.RRM(R0) ;SAVE DIRECTIVE RELATED AFFINITY6 CALL $SETRT ;FORCE TASK TO RUN ON REQUIRED PROCESSOR CLC ;SUCCESSI RETURN910$: DRSTS D.RS8 ;DIRECTIVE INCONSISTANT WITH TASK STATEF R;+; **-DRRAF-REMOVE AFFINITY;YC; THIS DIRECTIVE REMOVES AFFINITY WHICH WAS PREVIOUSLY SPECIFIED BYB; THE DRAAF DIRECTIVE.;A ; DPB FORMAT: ;T#; WD. 0 -- DIC. (163.),DBP SIZE(2.)B;1 ; INPUTS:C;8; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK; R3=ADDRESS OF THE DBP + 2R.; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK+; R5=ADDRESS OF THE TCB OF THE CURRENT TASKO;N5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK):;S-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.T&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED6; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF TASK WAS; INSTALLED WITH AFFINITY;- D<$DRRMA::BIT #T2.AFF,(R2) ;WAS TASK INSTALLED WITH AFFINITY? BNE 10$ ;YES IF NE1 MOV T.PCB(R5),R0 ;GET ADDRESS OF TASK REGION PCB . CLR P.RRM(R0) ;CLR DIRECTIVE RELATED AFFINITY* CALL $SETAP ;RECALCULATE TASK'S AFFINITY CLC ;SUCCESSP RETURNE .DSAB00Jè]Ké]Lï]DATADATADATADATADATADATADATAL LSBA P .ENDC T A .ENDS-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.T&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED6; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF TASK WAS; INSTALLED WITH AFFINITY;- D<$DRRMA::BIT #T2.AFF,(R2) ;WAS TASK INSTALLED WITH AFFINITY? BNE 10$ ;YES IF NE1 MOV T.PCB(R5),R0 ;GET ADDRESS OF TASK REGION PCB . CLR P.RRM(R0) ;CLR DIRECTIVE RELATED AFFINITY* CALL $SETAP ;RECALCULATE TASK'S AFFINITY CLC ;SUCCESSP RETURNE .DSAB .TITLE DRDARI .IDENT /04/ F; ; COPYRIGHT (C) 1974, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.P;5A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDA9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.E; ; VERSION 04;O; D. N. CUTLER 30-AUG-73;O; PREVIOUSLY MODIFIED BY:D;.; T. J. MILLER;U; MODIFIED BY:;N; T. J. MILLER 14-AUG-77; ;; TM099 -- REMOVE UNEEDED CONDITIONALIZATION FOR RSX-11M+. ;F+; DISABLE/ENABLE AST RECOGNITION DIRECTIVESL;R; MACRO LIBRARY CALLS; .MCALL TCBDF$, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;+#; **-$DRDAR-DISABLE AST RECOGNITIONF;IL; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DISABLE RECOGNITION OF ASYNCHRONOUSK; SYSTEM TRAPS FOR THE ISSUING TASK. FURTHER AST'S ARE QUEUED AS THEY OCCUR7; AND WILL BE EFFECTED WHEN AST RECOGNITION IS ENABLED.I;D ; DPB FORMAT:J;I"; WD. 00 -- DIC(99.),DPB SIZE(1.).;U ; INPUTS:I;N9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.I+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.L,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;O5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)D;B-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.F&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE REJECTED.8; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST RECOG-; NITION IS ALREADY DISABLED.9;- . .ENABL LSBS;$DRDAR::BIT #T2.DST,(R2) ;AST RECOGNITION ALREADY DISABLED?A BNE 10$ ;IF NE YES* BIS #T2.DST,(R2) ;DISABLE AST RECOGNITION( RETURN ;RETURN DIRECTIVE STATUS OF +1;+"; **-$DREAR-ENABLE AST RECOGNITION; G; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO RECOGNIZE ASYNCHORONOUS SYSTEMIJ; TRAPS FOR THE ISSUING TASK. AST'S THAT HAVE BEEN QUEUED WHILE AST RECOG-/; NITION WAS DISABLED ARE EFFECTED IMMEDIATELY.';S ; DPB FORMAT:I;S#; WD. 00 -- DIC(101.),DPB SIZE(1.).L;9 ; INPUTS: ;.9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.L+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.#/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.R,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;N5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)E;S-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. &; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.I8; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST RECOG-; NITION IS NOT DISABLED..;-3$DREAR::BIT #T2.DST,(R2) ;AST RECOGNITION DISABLED?A BEQ 10$ ;IF EQ NO ) BIC #T2.DST,(R2) ;ENABLE AST RECOGNITIONR2 CALLR $SETRT ;FORCE A REDISPATCHING OF PROCESSOR'10$: DRSTS D.RS8 ;SET DIRECTIVE STATUSF .DSABL LSBT  .END: (DIRECTIVE STATUS AND PS RETURNED TO TASK)E;S-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. &; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.I8; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF AST RECOG-; NITION IS NOT DISABLED..;-3$DREAR::BIT #T2.DST,(R2) ;AST RECOGNITION DISABLED?A BEQ 10$ ;IF EQ NO ) BIC #T2.DST,(R2) ;ENABLE AST RECOGNIT .TITLE DRDCPE .IDENT /05/ I;T ; COPYRIGHT (C) 1974, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDR9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.+;S ; VERSION 05; ; D. N. CUTLER 5-SEP-73I; ; PREVIOUSLY MODIFIED BY:'; ; T. J. MILLER;O; MODIFIED BY:;O; T. J. MILLER 6-JUN-77R;I7; TM088 -- CLEAR CHECKPOINT PCB WORD ON DISABLE CHECK- ; POINTING.2;T; T. J. MILLER 14-AUG-7700Lð]Mö]¥]eaek›’;.;; TM099 -- REMOVE UNEEDED CONDITIONALIZATION FOR RSX-11M+.8;9; T. J. MILLER 7-FEB-78O;R); TM122 -- DISABLE CHECKPOINTING IN PCB. ;F); DISABLE/ENABLE CHECKPOINTING DIRECTIVESE;; MACRO LIBRARY CALLSC;I .MCALL TCBDF$, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;+!; **-$DRDCP-DISABLE CHECKPOINTING ;'F; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DISABLE THE CHECKPOINTABILITY; OF THE ISSUING TASK.;P ; DPB FORMAT:N;S"; WD. 00 -- DIC(95.),DPB SIZE(1.).;J ; INPUTS:-;-9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.S+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.I,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;R6; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK).;A-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.A&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.T;; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF CHECKPOINTINGT); IS ALREADY DISABLED FOR ISSUING TASK.:; DIRECTIVE STATUS OF 'D.RS10' IS RETURNED IF THE ISSUING; TASK IS NOT CHECKPOINTABLE.O;- .ENABL LSB .$DRDCP::BIT #T2.CHK,(R2) ;TASK CHECKPOINTABLE? BNE 20$ ;IF NE NOH$ MOV T.PCB(R5),R0 ;POINT TO TASK PCB8 BIT #PS.CHK,P.STAT(R0) ;CHECKPOINTING ALREADY DISABLED? BNE 30$ ;IF NE YES. BIS #PS.CHK,P.STAT(R0) ;DISABLE CHECKPOINTING  .IF DF C$$INT ' CLR P.DPCB(R0) ;CLEAR DISK PCB ADDRESSI  .ENDC ,10$: RETURN ;RETURN DIRECTIVE STATUS OF +1(20$: DRSTS D.RS10 ;SET DIRECTIVE STATUS;+ ; **-$DRECP-ENABLE CHECKPOINTING;:E; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ENABLE THE CHECKPOINTABILITYB; OF THE ISSUING TASK.; ; DPB FORMAT:S;("; WD. 00 -- DIC(97.),DPB SIZE(1.).;B ; INPUTS: ;Y9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. +; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)S;R-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.N&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.H;; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF CHECKPOINTINGT; IS ALREADY ENABLED.7;-1$DRECP::BIT #T2.CHK,(R2) ;IS TASK CHECKPOINTABLE?  BNE 30$ ;IF NE NOH$ MOV T.PCB(R5),R0 ;POINT TO TASK PCB0 BIT #PS.CHK,P.STAT(R0) ;CHECKPOINTING DISABLED? BEQ 30$ ;IF EQ YES  5 .IF DF C$$INT 1 TST P.DPCB(R0) ;IS TASK CONNECTED TO INTERRUPTS?T' BNE 30$ ;IF NE YES, CANNOT ENABLE CKPF R .ENDC U S- BIC #PS.CHK,P.STAT(R0) ;ENABLE CHECKPOINTINGS/ CALLR $NXTSK ;REASSIGN PARTITION IF NECESSARYD'30$: DRSTS D.RS8 ;SET DIRECTIVE STATUS .DSABL LSBT R .ENDABLED.7;-1$DRECP::BIT #T2.CHK,(R2) ;IS TASK CHECKPOINTABLE?  BNE 30$ ;IF NE NOH$ MOV T.PCB(R5),R0 ;POINT TO TASK PCB0 BIT #PS.CHK,P.STAT(R0) ;CHECKPOINTING DISABLED? BEQ 30$ ;IF EQ YES  5 .IF DF C$$INT 1 TST P.DPCB(R0) ;IS TASK CONNECTED TO  .TITLE DRGLIS .IDENT /09.03/2 U;&; COPYRIGHT (c) 1974,1978,1979,1986 1; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;RC; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED1; ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.e ;  ; VERSION 08 ;V ; D. N. CUTLER 18-SEP-73;; PREVIOUSLY MODIFIED BY:n;v; D. N. CUTLER; T. J. MILLER; T. J. MILLER; J. E. PROVINO.;<; MODIFIED BY:;.; K. L. NOEL 17-DEC-86 09.00;ID; KLN031 - ADD SUPPORT FOR REMOTE LUN ASSIGNMENTS AND GDVI DIREC.;9!; B. S. MCCARTHY 5-MAR-87 09.01R;,.; BM385 -- ADD $DRGL1 LABEL FOR MOVEMENT TO; VECTOR COMMONE;M; K. L. NOEL 6-APR-87 09.02 ;C+; KLN040 -- CHANGE $IMASG CALL TO A JUMP ; ; K. L. NOEL 12-MAY-87 09.03;-C; KLN044 -- CHANGE ERROR PATHS TO NOT DO A DRSTS IN REMOTE CASES";J#;L$; MACRO LIBRARY CALLS %; &' .MCALL HWDDF$&( HWDDF$ ;DEFINE HARDWARE REGISTERS( 00Mø]é]Lï]DATADATADATADATADATADATADATA ;KLN031K3( .IF DF C$$RMT ;REMOTE TASK SUPPORT ;KLN031V( ;KLN031.( .MCALL CPRDF$ ;KLN031,( CPRDF$ ;KLN031L( ;KLN031 ( .ENDC ; C$$RMT ;KLN031(; ;KLN031!(; LOCAL SYMBOLS ;KLN031A(; ;KLN031(MAP5 = 120000 ;KLN031(MAP6 = 140000 ;KLN031?(GL$BUF = 2 ;SIZE OF LOCAL BUFFER STORAGE FOR GLUN$ ;KLN031A.(GL$SIZ = 3. ;DPB SIZE FOR GLUN$ ;KLN031-(GD$SIZ = 4. ;DPB SIZE FOR GDVI$ ;KLN031 ?(GN$SIZ = 8. ;DPB SIZE FOR GIN$ (GET ASSIGNED DEVICE) ;KLN031V( ;KLN031.)*;+!+; **-$DRGLI-GET LUN INFORMATION ,; F-; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO FILL A SIX WORD BUFFER WITHJ.; INFORMATION ABOUT A DEVICE THAT IS ASSIGNED TO A SPECIFIED LUN. IF RE-L/; QUESTS TO THE DEVICE HAVE BEEN RE-DIRECTED, THEN THE INFORMATION RETURN-(0; ED PERTAINS TO THE RE-DIRECT DEVICE.1;32; DPB FORMAT:.3;B#4; WD. 00 -- DIC(5.),DPB SIZE(3.).=,5; WD. 01 -- LUN TO RETURN INFORMATION FOR.+6; WD. 02 -- ADDRESS OF A SIX WORD BUFFER.E7;N8; BUFFER FORMAT:9;.&:; WD. 00 -- NAME OF ASSIGNED DEVICE.<;; WD. 01 -- UNIT NUMBER OF ASSIGNED DEVICE AND FLAGS BYTE.0<; WD. 02 -- FIRST DEVICE CHARACTERISTICS WORD.1=; WD. 03 -- SECOND DEVICE CHARACTERISTICS WORD.0>; WD. 04 -- THIRD DEVICE CHARACTERISTICS WORD.1?; WD. 05 -- FOURTH DEVICE CHARACTERISTICS WORD.-@;T A; INPUTS:3B; ;C; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. %D; R3=ADDRESS OF THE LUN IN THE DPB..1E; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.N.F; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.G;I7H; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)EI;F/J; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.S(K; DIRECTIVE STATUS OF +1 IS RETURNED.!L; C=1 IF DIRECTIVE IS REJECTED. 9M; DIRECTIVE STATUS OF 'D.RS5' IS RETURNED IF NO DEVICEV'N; IS ASSIGNED TO THE SPECIFIED LUN.UO;-P Q .ENABL LSBSQ ; BM385OQ .IF DF D$$PAR ; BM385AQ ; BM385TQ$DRGL1:: ; BM385Q ; BM385R!Q .IFF ; DF D$$PAR ; BM385CQ ; BM385.Q$DRGLI:: ; BM385Q ; BM385U"Q .ENDC ; DF D$$PAR ; BM385Q ; BM385YQ ;KLN031RUQ;IF GDVI SUPPORT IS INCLUDED, DPB VALIDATION OF THE SIZE FIELD HAS NOT BEEN ;KLN031A0Q;DONE AT THIS POINT. DO IT HERE. ;KLN031Q ;KLN031IQ .IF EQ G$$DVI ;KLN031SQ ;KLN0318?Q CMPB #GL$SIZ,-1(R3) ;IS SIZE CONSISTENT WITH GLUN? ;KLN031G"Q BEQ 98$ ;IF EQ YES ;KLN031Q ;KLN031D?Q CMPB #GD$SIZ,-1(R3) ;IS SIZE CONSISTENT WITH GDVI? ;KLN031B"Q BEQ 98$ ;IF EQ YES ;KLN031Q ;KLN031B.Q DRSTS D.RS99 ;DPB INVALID ERROR ;KLN031Q ;KLN031I!Q .ENDC ;EQ G$$DVI ;KLN031IQ ;KLN031 6Q98$: CALL $MPLUN ;MAP LUN TO UCB ADDRESS ;KLN031+Q BCC 105$ ;IF CC DEVICE FOUND ;KLN031 Q ;KLN031 Q .IF DF C$$RTB ;KLN031RQ ;KLN031T?Q BIT #T4.DFB,T.ST4(R5) ;TASK HAVE DEFERRED BINDING? ;KLN031 !Q BEQ 99$ ;IF EQ NO ;KLN031RQ ;KLN031T3Q BIT #F5.RTB,$FMSK5 ;RUN TIME BINDING? ;KLN031L/Q BNE 100$ ;IF SO, DO IMPLICIT ALUN ;KLN031 Q ;KLN0310.Q99$: DRSTS D.RS5 ;IF NOT, ERROR ;KLN031Q100$: ;KLN031,Q JMP $IMASG ;DO IMPLICIT ALUN ; KLN040Q ; KLN040 Q .ENDC ;C$$RTB ; KLN035Q105$: ; KLN0353Q; ; KLN035 LQ; THIS ENTRY POINT IS FOR GIN$ SUBFUNCTION GET ASSIGNED DEVICE ; KLN0356Q; AT THIS POINT: R3 = WD 02 OF THE DPB ; KLN0358Q; R2 = UCB ADDRESS OF DEVICE OR 0 (GIN$) ; KLN035Q; ; KLN035Q$RTINF:: ; KLN035T-Q MOV R3,-(SP) ;SAVE DPB ADDRESS ; KLN035D1T MOV R2,R4 ;SAVE ADDRESS OF DEVICE UCB ;**-2 .V MOV #6*2,R1 ;SET LENGTH OF BUFFER ;**-11V CMPB #GL$SIZ,-3(R3) ;IS THIS GLUN? ;KLN031B#V BEQ 110$ ;IF EQ YES ;KLN031N8V MOV 2(R3),R1 ;GET LENGTH OF BUFFER FROM DPB ;KLN0316V110$: MO00M^ö]¥]eaek›’V (R3),R3 ;GET ADDRESS OF BUFFER ;KLN031%W CALL $ACHKP ;ADDRESS CHECK BUFFER /W MOV (SP)+,R5 ;RESTORE DPB ADDRESS ;KLN031GW ;KLN031 1W .IF DF C$$RTK ;REMOTE TASK SUPPORT ;KLN031W ;KLN031P5W BIT #F5.RTK,$FMSK5 ;REMOTE TASK SUPPORT ;KLN031D#W BNE 130$ ;IF NE YES ;KLN031SW ;KLN031 0W120$: JMP 2$ ;JOIN NON REMOTE CODE ;KLN031W ;KLN031 W130$: ;KLN031W; ;KLN031@W; IF THIS IS GIN$, THERE IS NO UCB ADDRESS TO CHECK ;KLN031W; ;KLN0310W CMPB #GN$SIZ,-3(R5) ;IS THIS GIN$ ;KLN031#W BEQ 140$ ;IF EQ YES ;KLN031NW; ;KLN031DW; CHECK FOR GENERIC DEVICE TYPE BEFORE SENDING TO CPRAME ;KLN031W; ;KLN031+W MOV (R4),R1 ;GET DCB ADDRESS ;KLN031:W CMP R1,$XXLOW ;IS DCB LOWER THAN LOWER BOUND? ;KLN031/W BLO 120$ ;IF LO YES, NOT GENERIC ;KLN031:W CMP R1,$XXHGH ;IS DCB HIGHER THAN UPPER BOUND? ;KLN0310W BHI 120$ ;IF HIGH YES, NOT GENERIC ;KLN031W; ;KLN0311W; GET A REQUEST PACKET FROM CPRBUF ;KLN031TW; ;KLN031QW; NOTE: IF SIZE OF REQUEST PACKET OR DPB OF GLUN, GDVI OR GIN$ IS EVER ;KLN031ERW; MADE LARGER, THE NUMBER OF BLOCK TO ALLOCATE MAY NEED TO BE INCREASED ;KLN031W; ;KLN031<W140$: MOV #1,R1 ;ASSUME ONLY ONE BLOCK IS NEEDED ;KLN031DW MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START ;KLN0312W CALL $CPALO ;GET BUFFER FROM CPRBUF ;KLN031W; ;KLN031)W; FILL IN REQUEST PACKET ;KLN031W; ;KLN031(W MOV R0,KISAR6 ;MAP PACKET ;KLN0311W MOV #MAP6,R1 ;GET ADDRESS OF HEADER ;KLN031B8W MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST ;KLN031(W CLRB H$ICNT(R1) ;NO ITEMS ;KLN031.W ADD #P$DPB,R1 ;POINT TO DPB AREA ;KLN031W; ;KLN031.W; COPY DPB INTO REQUEST PACKET ;KLN031W; ;KLN031;W MOV R5,R3 ;COPY POINTER TO USER BUFFER ADDRESS ;KLN031B2W SUB #4,R3 ;POINT TO BEGINNING OF DPB ;KLN031,W MOVB 1(R3),R2 ;GET SIZE OF DPB ;KLN0310W160$: MOV (R3)+,(R1)+ ;COPY A WORD ;KLN031+W SOB R2,160$ ;LOOP UNTIL DONE ;KLN031EW; ;KLN031AW; CHANGE ADDRESS IN DPB TO OFFSET FROM TOP OF HEADER ;KLN031TW; ;KLN031-W MOVB -3(R5),R2 ;GET SIZE OF DPB ;KLN031L W ASL R2 ;IN BYTES ;KLN031MW ADD #,R2 ;ADD SIZE OF HEADER AND EXTRA STORAGE AREA ;KLN031C7W MOV R2,MAP6+H$SIZE+4 ;STORE OFFSET IN DPB ;KLN0313W; ;KLN031BW; STORE REAL ADDRESS OF USER BUFFER IN REQUEST PACKET ;KLN031W; ;KLN0318W MOV (R5),(R1) ;STORE ADDRESS OF USER BUFFER ;KLN031W ;KLN031 W; ;KLN031(W; SEND REQUEST TO CPRAME ;KLN031W; ;KLN031:W SUB #,R1 ;GET SIZE OF REQUEST PACKET ;KLN031%W CPSEN$ #SN$DIR,R0,R1 ;KLN031W; ;KLN031&W; GET RESPONSE PACKET ;KLN031W; ;KLN031/W MOV R0,-(SP) ;SAVE PACKET ADDRESS ;KLN0313(W MOV R0,KISAR6 ;MAP PACKET ;KLN031W; ;KLN031 W; CHECK STATUS ;KLN031WW; - IF ERROR OCCURED AND THIS IS GIN$, CHECK DEVICE NAME FIELD FOR TRANSLATED ;KLN031N!W; DEVICE NAME ;KLN031DW; ;KLN031;W CMP #IS.SUC,MAP6+H$STAT ;WAS SUCCESS RETURNED? ;KLN031I"W BNE 200$ ;IF NE NO ;KLN031W; ;KLN0310W; TRANSFER BUFFERS INTO USER AREA ;KLN031W; ;KLN0314W MOVB MAP6+H$SIZE+1,R0 ;GET SIZE OF DPB ;KLN031 W ASL R0 ;IN BYTES ;KLN031BW ADD #,R0 ;POINT TO ADDRESS OF USER BUFFER ;KLN0315W MOV (R0),R0 ;GET ADDRESS OF USER BUFFER ;KLN031N8W CALL $RELOC ;GET BIAS AND OFFSET OF BUFFER ;KLN0313W MOV R1,R3 ;SET UP DEST BIAS FOR BLXIO ;KLN0311W MOV R2,R4 ;SET UP DEST DISPLACEMENT ;KLN031K6W MOV (SP),R1 ;SET UP SOURCE BIAS FOR APR5 ;KLN031BW MOV #<6*2>,R0 ;GET SIZE OF BUFFER ASSUMING THIS IS GLUN ;KLN0314W MOVB MAP6+H$SIZE+1,R2 ;GET SIZE OF DPB ;KLN031-W CMPB #GL$SIZ,R2 ;IS THIS GLUN? ;KLN031#W BEQ 180$ ;IF EQ YES ;KLN031D>W00M^é]Lï]DATADATADATADATADATADATADATA MOV MAP6+H$SIZE+6,R0 ;GET SIZE OF BUFFER FROM DPB ;KLN031!W ASL R0 ; IN BYTES ;KLN031C3W180$: ASL R2 ;GET SIZE OF DPB IN BYTES ;KLN031,@W ADD #,R2 ;SET UP SOURCE DISPLACEMENT ;KLN031>W190$: CALL $BLXIO ;RETURN EQUIVALENCE NAME STRING ;KLN031W; ;KLN031.W; CPRAME HAS RETURNED AN ERROR ;KLN031RW; - IF THIS IS GIN$, CHECK DEVICE NAME FIELD FOR TRANSLATED DEVICE NAME ;KLN031W; ;KLN031W200$: ;KLN0310W MOV (SP)+,R0 ;GET BUFFER BIAS BACK ;KLN031W ;KLN031 6W CMPB #GN$SIZ,MAP6+H$SIZE+1 ;IS THIS GIN? ;KLN031"W BNE 210$ ;IF NE NO ;KLN031W ;KLN031A9W MOV MAP6+H$SIZE+10,R4 ;DEVICE NAME RETURNED? ;KLN0311#W BNE 250$ ;IF NE YES ;KLN031LW ;KLN031L3W210$: CALLR $CPDEA ;DEALLOCATE BUFFER ;KLN031NW ;KLN031W245$: ;KLN044=W RETURN ;JUST RETURN SINCE KXDRV SET ERROR IN DSW ;KLN044 W ;KLN044$W250$: ;KLN0319W MOV MAP6+H$SIZE+4,-(SP) ;SAVE BUFFER ADDRESS ;KLN031N4W MOV MAP6+H$SIZE+12,R5 ;GET UNIT NUMBER ;KLN031-W CALL $CPDEA ;DEALLOCATE BUFFER ;KLN031 W; ;KLN031SW; CPRAME HAS RETURN A TRANSLATED LOGICAL DEVICE NAME, LOOK FOR IT IN OUR ;KLN031KW; TABLES ;KLN031W; ;KLN031)W MOV R4,R0 ;GET DEVICE NAME ;KLN031 )W MOV R5,R1 ;AND UNIT NUMBER ;KLN031T+W CALL $CVDVN ;GET UCB ADDRESS ;KLN031S%W BCS 245$ ;IF CS ERROR ;KLN031$W; ;KLN031;W; NOW WE REJOIN COMMON CODE TO FILL IN BUFFER ;KLN031MW; ;KLN0312W MOV (SP)+,R3 ;RESTORE BUFFER ADDRESS ;KLN031W ;KLN031 W; ;KLN0316W; MAKE SURE THIS IS NOT A GENERIC DEVICE ;KLN031W; ;KLN0311W MOV R2,R4 ;MOVE UCB ADDRESS INTO R4 ;KLN031;2W MOV (R4),R2 ;GET BACK POINTER TO DCB ;KLN0313W CMP R2,$XXLOW ;LOWER THAN LOWER BOUND? ;KLN031C!W BLO 3$ ;IF LO YES ;KLN0313W CMP R2,$XXHGH ;HIGHER THAN HIGH BOUND? ;KLN031;!W BHI 3$ ;IF HI YES ;KLN031DW ;KLN031 3W RETURN ;RETURN WITH ERROR STATUS SET ;KLN031SW ;KLN031 W .ENDC ;C$$RTK ;KLN031W ;KLN031W2$: ;KLN031W$GLINF:: ;KLN0312W MOV (R4),R2 ;GET BACK POINTER TO DCB ;KLN031W3$: ;KLN0314Y TST (R2)+ ;POINT TO ADDRESS OF FIRST UCB ;**-1"Z MOV R4,R0 ;COPY ADDRESS OF UCB2[ SUB (R2)+,R0 ;CALCULATE RELATIVE ADDRESS OF UCB.\ MOV (R2)+,(R3)+ ;INSERT GENERIC DEVICE NAME2] MOV (R2)+,(R3) ;PICK UP LOW UNIT NUMBER FOR DCB#^ MOV (R2)+,R1 ;PICK UP UCB LENGTHE-_ CALL $DIV ;CALCULATE RELATIVE UNIT NUMBER .` ADD R0,(R3)+ ;CALCULATE LOGICAL UNIT NUMBER*a MOVB #200,-(R3) ;ASSUME RESIDENT DRIVERb TST (R2) ;DRIVER RESIDENT?c BNE 5$ ;IF NE YESD2d CLRB (R3) ;ELSE INDICATE DRIVER IS NONRESIDENTe5$: INC R3 ;ADVANCE POINTER5f ADD #U.CW1,R4 ;POINT TO FIRST CHARACTERISTICS WORD+7g MOV (R4)+,(R3)+ ;INSERT DEVICE CHARACTERISTICS WORDS+h MOV (R4)+,(R3)+ ;i MOV (R4)+,(R3)+ ;j MOV (R4),(R3) ; >k BIT #DV.ISP!DV.OSP,U.CW1-U.CW4(R4) ;IS IT A SPOOLED DEVICE?l BEQ 9$ ;IF EQ NO>m CMP U.ATT-U.CW4(R4),R5 ;IS ISSUING TASK THE DESPOOLER TASK?n BEQ 9$ ;IF EQ YES, DONES>o MOV U.RED-U.CW4(R4),R0 ;PICK UP ADDRESS OF INTERMEDIATE UCB=p MOV U.CW4(R0),(R3) ;RETURN BUFFER SIZE OF INTERMEDIATE DEV 6q TST -(R3) ;THIRD CHARACTERISTICS WORD IS UNDEFINED7r MOV (R4),-(R3) ;RETURN BUFFER SIZE OF SPOOLED DEVICEC7s BIC #^C,-(R3) ;CLR ALL BUT SPOOL BITS4:t BIS U.CW1(R0),(R3) ;RETURN INTERMEDIATE CHARACTERISTICS-u9$: RETURN ;RETURN DIRECTIVE STATUS OF +1 )v10$: DRSTS D.RS5 ;SET DIRECTIVE STATUSSwx .ENDE DESPOOLER TASK?n BEQ 9$ ;IF EQ YES, DONES>o MOV U.RED-U.CW4(R4),R0 ;PICK UP ADDRESS OF INTERMEDIATE UCB=p MOV U.CW4(R0),(R3) ;RETURN BUFFER SIZE OF INTERMEDIATE DEV 6q TST -(R3) ;THIRD CHARACTERISTICS WORD IS UNDEFINED7r MOV (R4),-(R3) ;RETURN BUFFER SIZE OF SPOOLED DEVICEC7s BIC #^C,-(R3) ;CLR ALL BUT SPOOL BITS4:t BIS U.CW1(R0),(R300N^O^¥]eaek›’ .TITLE DRGSS( .IDENT /04.01/P ;(; COPYRIGHT (C) 1974, 1976, 1979, 19871; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.H;(C; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED; ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.# ;H ; VERSION 04 ;N ; D. N. CUTLER 31-AUG-73;R; PREVIOUSLY MODIFIED BY:;;$; D. N. CUTLER; J. E. PROVINO ;T;K&; MODIFIED FOR RSX-11M-PLUS V4.0 BY:;!; L. B. MCCULLEY 23-MAR-87 4.01O;.9; LBM050 - SUPPORT PROCESSORS WITHOUT SWITCH REGISTERS ;9;9;9; MACRO LIBRARY CALLSI;  .MCALL HWDDF$& HWDDF$ ;DEFINE HARDWARE REGISTERS ;+ !; **-$DRGSS-GET SENSE SWITCHES";RL#; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO STORE THE CONTENTS OF THE CONSOLE@$; SWITCH REGISTER IN THE ISSUING TASK'S DIRECTIVE STATUS WORD.%;&; DPB FORMAT:L';%(; WD. 00 -- DIC(125.),DPB SIZE(1.).I);R *; INPUTS: +;B;,; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.5--; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. 1.; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK../; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.0;G71; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)2;H<3; C=0 WITH A DIRECTIVE STATUS EQUAL TO THE CONTENTS OF THE4; CONSOLE SWITCH REGISTER.N5;-678 .IF DF G$$TSS99$DRGSS:: ;LBM050B9 BIT #HF.SWR,$HFMSK ; HARDWARE SWITCH REGISTER PRESENT? ;LBM050/9 BEQ 1$ ; NO, DON'T TRY TO READ IT ;LBM050 :9 MOV SWR,$SWR ; YES, READ IT INTO SYSCM STORAGE ;LBM050891$: MOV $SWR,2(SP) ; RETURN VALUE FROM SYSCM ;LBM0509 RETURN ;LBM050 H ;**-14I .ENDCJKL .ENDTIVE STATUS AND PS RETURNED TO TASK)2;H<3; C=0 WITH A DIRECTIVE STATUS EQUAL TO THE CONTENTS OF THE4; CONSOLE SWITCH REGISTER.N5;-678 .IF DF G$$TSS99$DRGSS:: ;LBM050B9 BIT #HF.SWR,$HFMSK ; HARDWARE SWITCH REGISTER PRESENT? ;LBM050/9 BEQ 1$ ; NO, DON'T TRY TO READ IT ;LBM050 .TITLE DRSST .IDENT /05/ I;Z ; COPYRIGHT (C) 1974, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.T;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDA9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.H;D ; VERSION 05;; D. N. CUTLER 30-AUG-73;N; PREVIOUSLY MODIFIED BY:M;:; D. N. CUTLER;K; MODIFIED BY:;I; T. J. MILLER 14-AUG-77;I;; TM099 -- REMOVE UNEEDED CONDITIONALIZATION FOR RSX-11M+.K;W; T. J. MILLER 10-DEC-77; :; TM100 -- ACCEPT ODD SST VECTOR ADDRESS AS SPECIFICATION4; OF "OTHER" MODE FOR SST SERVICE ROUTINE IF SUPER; LIBRARIES ARE SUPPORTED.;W; MACRO LIBRARY CALLSA;C .MCALL HDRDF$% HDRDF$ ;DEFINE TASK HEADER OFFSETSH;+,; **-$DRSDV-SPECIFY DEBUGGING AID SST VECTOR;.F; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO RECORD THE ADDRESS AND LENGTHF; OF A VECTOR OF SST SERVICE ROUTINE ENTRY POINTS FOR USE BY AN INTRA-; TASK DEGUGGING AID (E.G. ODT) ;- ; DPB FORMAT:.; $; WD. 00 -- DIC (103.),DPB SIZE(3.).&; WD. 01 -- ADDRESS OF THE SST VECTOR.0; WD. 02 -- NUMBER OF ENTRIES IN THE SST VECTOR.;P; SST VECTOR FORMAT:;P7; WD. 00 -- TRAPS TO 4 (ODD ADDRESS, NONEX MEM, ETC.).; WD. 01 -- SEGMENT FAULT. @; WD. 02 -- TRACE TRAP (T-BIT) OR EXECUTION OF BPT INSTRUCTION.-; WD. 03 -- EXECUTION OF AN IOT INSTRUCTION. =; WD. 04 -- EXECUTION OF AN ILLEGAL OR RESERVED INSTRUCTION.T4; WD. 05 -- EXECUTION OF A NON RSX EMT INSTRUCTION.-; WD. 06 -- EXECUTION OF A TRAP INSTRUCTION. 6; WD. 07 -- PDP 11/40 FLOATING POINT EXCEPTION FAULT.;C ; INPUTS: ;-9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.R+; R3=ADDRESS OF THE SECOND WORD IN THE DPB.S/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)R;I-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.E&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED..=; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF PART OF VECTO00O^P^ï]DATADATADATADATADATADATADATARP/; IS OUTSIDE OF ISSUING TASK'S ADDRESS SPACE,N0; VECTOR ADDRESS OF ZERO IS SPECIFIED, OR THE*; VECTOR SIZE IS GREATER THAN 31. WORDS.;- .ENABL LSBB<$DRSDV::ADD #H.ODVL,R4 ;POINT TO ODT VECTOR LENGTH IN HEADER" BR 10$ ;FINISH UP IN COMMON CODE;+#; **-$DRSTV-SPECIFY TASK SST VECTORE;NI; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO RECORD THE ADDRESS AND LENGTH OFIJ; A VECTOR OF SST SERVICE ROUTINE ENTRY POINT FOR USE BY THE ISSUING TASK.;A ; DPB FORMAT: ;R#; WD. 00 -- DIC(105.),DPB SIZE(3.).T&; WD. 01 -- ADDRESS OF THE SST VECTOR.0; WD. 02 -- NUMBER OF ENTRIES IN THE SST VECTOR.; ; SST VECTOR FORMAT:;A7; WD. 00 -- TRAPS TO 4 (ODD ADDRESS, NONEX MEM, ETC.).;; WD. 01 -- SEGMENT FAULT. B; WD. 02 -- TRACE TRAP (T-BIT) OR EXECUTION OF A BPT INSTRUCTION.-; WD. 03 -- EXECUTION OF AN IOT INSTRUCTION.C=; WD. 04 -- EXECUTION OF AN ILLEGAL OR RESERVED INSTRUCTION.O4; WD. 05 -- EXECUTION OF A NON RSX EMT INSTRUCTION.-; WD. 06 -- EXECUTION OF A TRAP INSTRUCTION.I6; WD. 07 -- PDP 11/40 FLOATING POINT EXCEPTION FAULT.;O ; INPUTS:2; 9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.A+; R3=ADDRESS OF THE SECOND WORD IN THE DPB. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)R;I-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.E&; DIRECTIVE STATUS OF +1 IF RETURNED.; C=1 IF DIRECTIVE IS REJECTED..=; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF PART OF VECTORP/; IS OUTSIDE OF ISSUING TASK'S ADDRESS SPACE,N/; VECTOR ADDRESS OF ZERO IS SPECIFIED, OR THEO*; VECTOR SIZE IS GREATER THAN 31. WORDS.;-=$DRSTV::ADD #H.TKVL,R4 ;POINT TO TASK VECTOR LENGTH IN HEADERK(10$: MOV (R3)+,R0 ;GET ADDRESS OF VECTOR BEQ 20$ ;IF EQ DEASSIGN VECTOR' MOV (R3),R1 ;GET LENGTH OF SST VECTOR= BEQ 15$ ;IF EQ DEASSIGN VECTOR CMP (R3),#31. ;VECTOR TOO BIG?+ BHI 30$ ;IF HI YES# ASL R1 ;CONVERT LENGTH TO BYTES I S U .IF DF S$$LIB T$ BIC #1,R0 ;INSURE LOW BIT IS CLEAR O .IFTF A' CALL $ACHKW ;ADDRESS CHECK SST VECTORO,15$: MOV (R3),(R4) ;SET SST VECTOR LENGTH # ASL (R4) ;CONVERT LENGTH TO BYTESS : .IFTT ,-20$: MOV -(R3),R2 ;PICK UP SST VECTOR ADDRESS:. CALL $CALTA ;CALCULATE PROPER VECTOR ADDRESS# MOV R2,-(R4) ;STORE PROPER ADDRESS  T .IFF  S,20$: MOV -(R3),-(R4) ;SET SST VECTOR ADDRESS P .ENDC ; T( RETURN ;RETURN DIRECTIVE STATUS OF +1(30$: DRSTS D.RS98 ;SET DIRECTIVE STATUS .DSABL LSB .END#1,R0 ;I .TITLE DTDRV .IDENT /10/;; COPYRIGHT (C) 1974, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 10;; D. N. CUTLER 1-DEC-73;; PREVIOUSLY MODIFIED BY:;; P. J. BEZEREDI; D. N. CUTLER; C. A. D'ELIA; F. L. STRAIGHT; T. J. MILLER;; MODIFIED BY:;; P. J. BEZEREDI 13-MAY-77;'; PB029 -- I/O DATA STRUCTURE CHANGES.;.; P. J. BEZEREDI 14-DEC-77;6; PB050 -- REMOVE UNNEEDED CONDITIONALS FOR RSX-11M+.;O; E. L. BAATZ 18-JUN-78 ;S); EB148 -- REMOVE EXPLICIT PS REFERENCE.M;O; P. J. BEZEREDI 05-JUL-78;C9; PB079 -- INSURE R2 CONTAINS CSR ADDRESS BEFORE LOGGING ; AN ERROR.L;1; P. J. BEZEREDI 18-JUL-78;F7; PB081 -- EXPAND I/O ACTIVITY INFORMATION REPORTED AT'; TIME OF AN ERROR.;.; P. J. BEZEREDI 21-AUG-78;6; PB083 -- ADDITION OF SOFTWARE VOLUME VALID SUPPORT.;R ; TC11 DECTAPE CONTROLLER DRIVER;I; MACRO LIBRARY CALLS0;  .MCALL ABODF$,HWDDF$,PKTDF$" ABODF$ ;DEFINE TASK ABORT CODES$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;-; EQUATED SYMBOLS ;U-WAIT=100000 ;WAITING TO SELECT UNIT (1=YES)N,ABRT=40000 ;ABORT CURRENT FUNCTION (1=YES)RETRY=5. ;ERROR RETRY COUNT ;T ; LOCAL DATA;>; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER);3>; DIAGNOSTIC FUNCTIONS IO.RNF AND IO.RNR USE BIT 7 OF RTTBL AS!00P ^^¥]eaek›’; A FLAG FOR INTERRUPT SERVICING.I<RTTBL: .BLKW T$$C11 ;ERROR RETRY COUNT AND DRIVE RESET FLAG;+; DRIVER DISPATCH TABLE ;-( DDT$ DT,T$$C11 ;GENERATE DISPATCH TABLE;+,; **-DTINI-TC11 DECTAPE CONTROLLER INITIATOR;TH; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUEG; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THEH; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN AH; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IH; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER>; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.;R ; INPUTS:H;B:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;H ; OUTPUTS:;NB; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAB; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OP; ATION IS INITIATED.E;- .ENABL LSBS=DTINI: GTPKT$ DT,T$$C11,DTPWF ;GET NEXT I/O PACKET TO PROCESS.; 1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:E;T'; R1=ADDRESS OF THE I/O REQUEST PACKET.R-; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.I; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.E:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;I); TC11 DECTAPE I/O REQUEST PACKET FORMAT:E;I"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTER TASK.,@; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTER TASK HEADER.B; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTER TASK HEADE@; WD. 05 -- I/O FUNCTION CODE (IO.RLB,IO.RLV,IO.WLB, OR IO.WLV).0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.B; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140003; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.EA; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER.O+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.O-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.D; WD. 15 -- NOT USED. 9; WD. 16 -- LOW BYTE MUST BE ZERO AND HIGH BYTE NOT USED.C0; WD. 17 -- LOGICAL BLOCK NUMBER OF I/O REQUEST.;; WD. 20 -- RELOCATION BIAS OF DIAGNOSTIC REG. BLK. ADDRESSOB; WD. 21 -- DIAGNOSTIC REG. BLK. ADDRESS (REAL OR DISPL. + 140000);($ CALL $VOLVD ;VALIDATE VOLUME VALID BCS 8$ ;IF CS WE FAILEDS TST R0 ;TRANSFER FUNCTION? BPL 8$ ;IF PL NO .IF DF M$$EXT, CALL $STMAP ;SET UP UNIBUS MAPPING ADDRESS .ENDC: MOV #<8.*256.>+RETRY,RTTBL(R3) ;SET ROCK AND RETRY COUNTS$ MOV R1,R0 ;COPY I/O PACKET ADDRESS& ADD #I.FCN,R0 ;POINT TO FUNCTION CODE- BITB #IQ.UMD,(R0) ;DIAGNOSTIC FUNCTION CALL?D BEQ 4$ ;IF EQ NO5 CLRB RTTBL(R3) ;NO RETRIES FOR DIAGNOSTIC OPERATIONSO. CMP #IO.RNF!IQ.UMD,(R0) ;READ BLOCK FORWARD? BNE 2$ ;IF NE NO: MOV #IO.RLB!IQ.UMD,(R0) ;CONVERT TO READ LOGICAL FORWARD BR 3$ ;F12$: CMP #IO.RNR!IQ.UMD,(R0) ;READ BLOCK REVERSE? BNE 4$ ;IF NE NO: MOV #IO.RLV!IQ.UMD,(R0) ;CONVERT TO READ LOGICAL REVERSE23$: BIS #200,RTTBL(R3) ;SET READ BLOCK NUMBER FLAG/4$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTIONO MOV R5,R3 ;COPY ADDRESS OF UCB4 ADD #U.BUF+1,R3 ;POINT TO HIGH BYTE OF MEM.EXT WORD# MOVB R2,(R3) ;INSERT DRIVE NUMBERC. BISB #105,-(R3) ;ASSUME READ LOGICAL FUNCTION7 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?)# BHIS 9$ ;IF HIS FUNCTION IS LEGALB8$: JMP 195$ ;ILLEGAL FUNCTION($9$: BEQ 10$ ;IF EQ FUNCTION IS READ0 BIS #10,(R3) ;CONVERT TO WRITE LOGICAL FUNCTION310$: BIT #IO.WLV&377,I.FCN(R1) ;REVERSE DIRECTION?B BEQ 20$ ;IF EQ NO * BIS #4000,(R3) ;SET REVERSE DIRECTION BIT'20$: CLRB U.CW2+1(R5) ;CLEAR ABORT FLAG#) CALL $BLKCK ;CHECK LOGICAL BLOCK NUMBERO, MOV R0,U.PRM(R5) ;SAVE LOGICAL BLOCK NUMBER;5; INITIATE I/O OPERATION;U30$: ;REF LABEL .IF DF M$$EXT% CALL $MPUBM ;MAP UNIBUS TO TRANSFER  .ENDC% MOV S.CSR(R4),R0 ;GET ADDRESS OF CSR2 CMP (R0)+,(R0)+ ;POINT TO BUFFER ADDRESS REGISTER, MOV U.BUF+2(R5),(R0) ;INSERT BUFFER ADDRESS8 MOV U.C00P(^^ï]DATADATADATADATADATADATADATANT(R5),-(R0) ;INSERT LENGTH OF TRANSFER IN BYTES* CLR U.PRM+2(R5) ;CLEAR FINAL ERROR STATUS( ROR (R0) ;CONVERT LENGTH TO WORD COUNT$ NEG (R0) ;MAKE NEGATIVE WORD COUNT6 MOVB U.BUF+1(R5),-(R0) ;INSERT UNIT AND DIRECTION BIT0 BIS #WAIT,U.CW2(R5) ;SET WAITING TO SELECT UNIT- MOVB #11,-(R0) ;STOP TRANSPORT (SELECT UNIT) $35$: BIT #100200,(R0) ;SELECT ERROR? BMI 40$ ;IF MI YES# BEQ 35$ ;IF EQ DRIVE NOT SELECTED;2 BIC #WAIT,U.CW2(R5) ;CLEAR WAITING TO SELECT UNIT; MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNTT% CALL $BMSET ;INDICATE I/O IS ACTIVE)3 BISB #S3.SIP,S.ST3(R4) ;;;SHOW SEARCH IN PROGRESSH( MOVB #103,(R0) ;START SEARCH FOR BLOCK.;CH; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUH; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDIT3; THAT COULD EXIST IN RESTARTING THE I/O OPERATION.I;$DTPWF: RETURN ;$; ; OUTPUT SELECT ERROR MESSAGEA;U840$: MOV #T.NDSE,R0 ;SET FOR DEVICE SELECT ERROR MESSAGE6 MOVB #1,S.CTM(R4) ;RESET CURRENT DEVICE TIMEOUT COUNT( DECB S.STS(R4) ;TIME TO OUTPUT MESSAGE? BNE DTPWF ;IF NE NO = MOVB #15.,S.STS(R4) ;SET TO OUTPUT NEXT MESSAGE IN 15. SECON  CALLR $DVMSG ;OUTPUT MESSAGE;IB; CANCEL I/O OPERATION - FORCE I/O TO COMPLETE IF DEVICE NOT READY;T4DTCAN: CMP R1,I.TCB(R0) ;;;REQUEST FOR CURRENT TASK? BNE 50$ ;;;IF NE NOE9 BIS #ABRT,U.CW2(R5) ;;;SET FOR ABORT IF DEVICE NOT READYR50$: RETURN ;;;;M@; DEVICE TIMEOUT USUALLY OCCURS BECAUSE THE DRIVER IS WAITING TOB; SELECT A UNIT. TIMEOUTS MAY ALSO OCCUR AS A RESULT OF A HARDWARE; FAILURE OR A POWERFAILURE.;E1DTOUT: MOV S.PKT(R4),R1 ;;;GET I/O PACKET ADDRESSE4 BITB #IQ.UMD,I.FCN(R1) ;;;DIAGNOSTIC FUNCTION CALL? BNE 165$ ;;;IF NE YESF. MOV U.CW2(R5),R1 ;;;WAITING TO SELECT A UNIT? BMI 55$ ;;;IF MI YES# CALL $DTOER ;;;LOG DEVICE TIMEOUT$(55$: MTPS #0 ;;;ALLOW DEVICE INTERRUPTS4 MOV #IE.ABO&377,R0 ;ASSUME REQUEST IS TO BE ABORTED ASL R1 ;ABORT REQUEST? BPL 30$ ;IF PL NOH JMP 190$ ;ABORT REQUESTE;+-; **-$DTINT-TC11 DECTAPE CONTROLLER INTERUPTS ;-8 INTSE$ DT,PR6,T$$C11 ;;;SAVE REGISTERS AND SET PRIORITY MOV R3,-(SP) ;;;SAVE R38 MOV U.SCB(R5),R3 ;;;GET ADDRESS OF STATUS CONTROL BLOCK> MOVB S.ITM(R3),S.CTM(R3) ;;;RESET CURRENT DEVICE TIMEOUT COUN4 MOV S.CSR(R3),R3 ;;;GET ADDRESS OF COMMAND REGISTER+ TSTB RTTBL(R4) ;DIAGNOSTIC READ BLOCK NO.?D BMI 150$ ;IF MI YES#* BIT #2,(R3) ;;;BLOCK SEARCH IN PROGRESS? BEQ 150$ ;;;IF EQ NO TST (R3) ;;;SEARCH ERROR?J BPL 70$ ;;;IF PL NOE TST -(R3) ;;;END ZONE? BMI 110$ ;;;IF MI YEST& BIT #20000,(R3)+ ;;;MARK TRACK ERROR?( BNE 120$ ;;;IF NE YES-TRY TO BYPASS IT860$: MOV #100000,U.PRM+2(R5) ;;;SET UNRECOVERABLE ERROR( BIC #100,(R3) ;;;CLEAR INTERRUPT ENABLE BR 160$ ;;;V070$: MOV 6(R3),-(SP) ;;;GET CURRENT BLOCK NUMBER5 CMPB U.BUF+1(R5),1(R3) ;;;MOVING IN FINAL DIRECTION?B BNE 80$ ;;;IF NE NO;* CMP (SP),U.PRM(R5) ;;;BLOCK NUMBER MATCH? BEQ 130$ ;;;IF EQ YES;380$: BIT #4000,(R3) ;;;MOVING IN FORWARD DIRECTION?I BEQ 90$ ;;;IF EQ YES% ADD #2,(SP) ;;;ADD TURN AROUND BIASB. CMP U.PRM(R5),(SP)+ ;;;TURN AROUND NECESSARY? BR 100$ ;;;R.90$: SUB #2,(SP) ;;;SUBTRACT TURN AROUND BIAS. CMP (SP)+,U.PRM(R5) ;;;TURN AROUND NECESSARY?100$: BLE 120$ ;;;IF LE NO & TST -(R3) ;;;POINT TO ERROR REGISTER-110$: TST (R3)+ ;;;POINT TO COMMAND REGISTERN DECB RTTBL+1(R4) ;;;DRIVE HUNG? BLT 60$ ;;;IF LT YES% MOV #4000,-(SP) ;;;GET DIRECTION BIT17 BIC (R3),(SP) ;;;.NOT.COMMAND REGISTER.AND.DIRECTION BA8 BIC #4000,(R3) ;;;.NOT.DIRECTION BIT.AND.COMMAND REGIST4 BIS (SP)+,(R3) ;;;DIRECTION BIT.OR.COMMAND REGISTER"120$: INC (R3) ;;;CONTINUE SEARCH) MOV U.SCB(R5),R4 ;;;RETREIVE SCB ADDRESS BR 140$ ;;;M2130$: TST (SP)+ ;;;REMOVE BLOCK NUMBER FROM STACK, MOV U.SCB(R5),R4 ;;;RETRIEVE ADDRESS OF SCB4 BICB #S3.SIP,S.ST3(R4) ;;;RESET SEARCH IN PROGRESS0 MOV U.BUF(R5),(R3) ;;;START READ/WRITE FUNCTION 140$: MOV (SP)+,R3 ;;;RESTORE R3. BIS #S2.ACT,S.ST2(R4) ;;;SET I/O ACTIVE FLAG RETURN ;;;O.150$: BICB #100,00P0^Ç3^È4^eaek›’(R3) ;;;CLEAR INTERRUPT ENABLE TST (R3) ;;;ANY ERRORS?( BPL 160$ ;;;IF PL NO ERRORS , MOV -(R3),U.PRM+2(R5) ;;;SAVE ERROR STATUS 160$: MOV (SP)+,R3 ;;;RESTORE R3' CALL $FORK ;;;CREATE A SYSTEM PROCESS " MOV R4,R3 ;COPY CONTROLLER INDEX6 MOV U.SCB(R5),R4 ;GET ADDRESS OF STATUS CONTROL BLOCK2 MOV S.CSR(R4),R2 ;GET ADDRESS OF COMMAND REGISTER1 MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL COMPLETION ) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSR2 BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION CALL?165$: BNE 180$ ;IF NE YES* MOV U.PRM+2(R5),R1 ;RETREIVE ERROR STATUS BEQ 180$ ;IF EQ SUCCESS CALL $DVERR ;LOG DEVICE ERRORR" BIT #63000,R1 ;RECOVERABLE ERROR? BEQ 170$ ;IF EQ NO" DECB RTTBL(R3) ;ANY MORE RETRIES? BLE 170$ ;IF LE NO' MOVB #8.,RTTBL+1(R3) ;RESET ROCK COUNT  JMP 30$ ;TRY AGAIN3170$: MOV #IE.WLK&377,R0 ;ASSUME DRIVE WRITE LOCKEDM# BIT #10000,R1 ;DRIVE WRITE LOCKED?C BNE 180$ ;IF NE YESR( MOV #IE.VER&377,R0 ;UNRECOVERABLE ERROR3180$: MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS82 BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION CALL? BEQ 187$ ;IF EQ NO+ CALL $CRPAS ;PASS UNIBUS DEVICE REGISTERSR/187$: MOV U.CNT(R5),R1 ;GET ORIGINAL BYTE COUNT;3 ADD 2(R2),R1 ;CALCULATE NUMBER OF BYTES TRANSFERED0 ADD 2(R2),R1 ;V%190$: MOVB #11,(R2) ;STOP TAPE MOTIONJ/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTU/ BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNTT(195$: CALL $IODON ;FINISH I/O OPERATION JMP DTINI ;GO AGAINR .DSABL LSB8 .END.T(R4),R1 ;RETREIVE I/O PACKET ADAL NUMBER OF BUFFERS?O BLOS 10$ ;IF LOS YES. MOV #N$$MBF,R1 ;NO--SET FOR MAX WE CAN HANDLE TST R3 ;SEE IF IND DEFAULTED, BEQ 10$ ;IF EQ YES--SKIP STATUS ALTERATION, CLR (R3) ;NOTE THAT TOO MANY BUFFERS GIVEN(10$: MOV R1,(R2)+ ;SET NUMBER OF BUFFERS220$: MOV (R5)+,(R2)+ ;SET BUFFER ADDRESS INTO IBUF DEC R1 ;DONE?  BGT 20$ ;IF GT NOE RETURN  .ENDBUF MOV #-1,(R2) ;INITIALIZE QUEUES .REPT 9.  MOV (R2)+,(R2) ;... .ENDM TST (R2)+ ;MOVE TO NEXT WORD) CMP R1,#N$$MBF ;LEG .TITLE KSTOP STOP A SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 16-AUG-77; ; SYSTEM MACRO CALLS;O .MCALL KSWDF$ KSWDF$  ( .SBTTL STPSWP STOP AN IN PROGRESS SWEEP;+%; STPSWP -- STOP AN IN-PROGRESS SWEEP ;M; CALLING SEQUENCE:;I ; CALL STPSWP (IBUF, IWHEN, IND);I ; INPUTS:O;A2; IBUF IS THE IBUF USED IN A CALL TO START A SWEEP ; IWHEN SPECIFIES THE STOP TIME:; 0 IMMEDIATELY (DEFAULT) ; +N AT END OF CURRENT BUFFER ; -N (RESERVED)O; IND RETURNS THE STATUS+; 0 COULD NOT FIND SWB OR SWEEP NOT ACTIVEE; 1 SWEEP STOPPED;R ; OUTPUTS:; ; THE SWEEP IS STOPPED;;-STPSWP:: ;REF LABEL & CALL .K.PAA ;VALIDATE ARGS AND STACK .WORD 3 ;THREE ARGST .WORD 4 ;IBUF REQUIRED BCS 80$ ;IF CS CAN'T HELP OUTA CLR R2 ;ASSUME FAILURE MOV (SP)+,R0 ;GET IBUF ADDRESS  CALL .FDSWI ;FIND SWBO BCC 10$ ;IF CC CONTINUEC TST (SP)+ ;POP IWHEN ADDRESS BR 60$ ;FINISH UP %10$: MTPS #PR6 ;;;DISABLE INTERRUPTS(/ MOV #S$WSEB,R0 ;;;ASSUME STOP AT END OF BUFFERN" MOV (SP)+,R3 ;;;GET IWHEN ADDRESS. BEQ 20$ ;;;IF EQ DEFAULTED--STOP IMMEDIATELY" TST (R3) ;;;NO--SEE WHEN TO STOP( BNE 40$ ;;;IF NE STOP AT END OF BUFFER00È8^É9^Ê?^DATADATADATADATADATADATADATA&20$: MOV #S$WSTP,R0 ;;;SET TO STOP NOW; CLR S.WCNT(R1) ;;;THIS SHOULD FORCE A BUFFER SWITCH TO GET % ;;; THE ISR TO REALIZE HE IS DONEU+40$: BIS R0,S.WFL2(R1) ;;;SET THE STOP FLAG$ MTPS #0 ;;;ALLOW INTERRUPTS  INC R2 ;SET SUCCESS "60$: MOV (SP)+,R0 ;GET IND ADDRESS BEQ 80$ ;IF EQ NOT SUPPLIEDS MOV R2,(R0) ;SET STATUS 80$: RETURNM .ENDR3 ;;;GET IWHEN ADDRESS. BEQ 20$ ;;;IF EQ DEFAULTED--STOP IMMEDIATELY" TST (R3) ;;;NO--SEE WHEN TO STOP( BNE 40$ ;;;IF NE STOP AT END OF BUFFER .NLIST .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; A; MACROS TO FACILITATE CALLING FORTRAN SUBROUTINES FROM MACRO-11.U;O ; VERSION 01; C. D'ELIA 17-NOV-77S;  S;+8; INITS -- INITIALIZE FOR STRUCTURED FORTRAN CALL MACROS;L; CALLING SEQUENCE:N; ; INITS; ; EFFECTS:;O; SETS THE GLOBAL LISTING FLAG; SETS THE ASSEMBLER PASS FLAG;L;- .MACRO INITS LST=0M$LST=LST .IF NDF $PASS$PASS=0P .IFF.$PASS=1E .ENDC .ENDM S L;+"; CALLS -- CALL FORTRAN SUBROUTINE;O; CALLING SEQUENCE:H; ; CALLS SUBR,;S; WHERE:;E ; SUBR IS THE SUBROUTINE TO CALL;R:; ARG1,..ARGN ARE THE ARGUMENTS TO PASS TO THE SUBROUTINE.1; THEY MAY EITHER BE CONSTANTS (1,5,8,12,ETC.-- ,; TAKEN AS DECIMAL NUMBERS ("." APPENDED))+; OR MEMORY LOCATIONS (IDATA, BUF, ETC.).N(; IF AN ARGUMENT IS DEFAULTED (",,") A-; MINUS 1 (177777) WILL BE INSERTED FOR THEF(; ARGUMENT ADDRESS (FORTRAN STANDARD).;. ; EXAMPLES:;; CALLS SUB1,<5,18,ARG3>; CALLS SUB2,N; CALLS SUB3,<,,,IOUT>;1;- .MACRO CALLS SUBR,ARGLST .PSECT $ARGL$$$1=.E .BLKB 2$NARG=01 .IRP X, .IF B .WORD 177777O .IFF .NTYPE $T,X .IF NE $T-67N .ERROR X ;INVALID ARGUMENTE .MEXITM .ENDC GENARG XE .ENDC $NARG=$NARG+1O .ENDM$$2=. .=$$1C .BYTE $NARG,0.=$$2T .PSECTL .IIF GT $LST, .LIST MOV #$$1,R5 JSR PC,SUBR .IIF GT $LST, .NLISTT .ENDM O A T A .MACRO GENARG ARG .IF DF $C'ARG .WORD $C'ARG> .PSECT $CONS$ .IF EQ .-$C'ARG$C'ARG: .WORD ARG'. .ENDC .PSECT $ARGL$ .IFFG .IF NDF $PASS .ERROR ;FAILED TO CALL "INITS" .MEXITA .ENDC .IF EQ $PASSO TSTARG ARG,\ARG .IFFP .WORD ARG .ENDC .ENDC .ENDM L A .MACRO TSTARG SYM,VAL .IF IDN , .PSECT $CONS$$C'SYM: .WORD SYM'.$ .PSECT $ARGL$ .WORD $C'SYMS .IFF. .WORD SYM .ENDC .ENDM .LIST PC,SUBR .IIF GT $LST, .NLISTT .ENDM O A T A .MACRO GENARG ARG .IF DF $C'ARG .WORD $C'ARG> .PSECT $CONS$ .IF EQ .-$C'ARG$C'ARG: .WORD ARG'. .ENDC .PSECT $ARGL$ .IFFG .IF NDF $PASS .ERROR ;FAILED TO CALL "INITS" .MEXITA .ENDC .IF EQ $PASSO TSTARG ARG,\ARG .IFFP .WORD ARG .ENDC1 .TITLE KSUB SINGLE PRECISION FL. PT. SUBTRACTION .IDENT /M02.00/A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;:; COPYRIGHT (C) 1977, 1978, DIGITAL EQUIPMENT CORPORATION.; H.J.;+'; .KSUB -- SINGLE PRECISION SUBTRACTION;); THIS ROUTINE SUBTRACTS R2:R3 FROM R0:R1; ; INPUTS:;,; R0:R1, R2:R3 SINGLE PRECISION REAL NUMBERS; ; OUTPUTS:;; R0:R1 = R0:R1 - R2:R31; PRECISION SHOULD BE GOOD TO 00Ê@^3^È4^eaek›’24 BITS OF MANTISSAL;R;-,.KSUB:: ADD #100000,R2 ;NEGATE SECOND NUMBER MOV R4,-(SP) ;SAVE R4 AND R5R MOV R5,-(SP)M2 MOV #2,R5 ;R5 GETS SIGNS AND C GETS 1 EVENTUALLY ASL R0 ;GET SIGN OF 1 BEQ NOAD1 ;ITS 0., RESULT IS 2 ROR R5 ;SAVE SIGNR ASL R2 ;GET SIGN OF 2K BEQ NOAD2 ;ITS 0., RESULT IS 1 RORB R5 ;SAVE ITS SIGN' MOV R5,-(SP) ;PUT SIGNS AWAY FOR LATER, RORB R0 ;CARRY IS 1 - SET IMPLIED NORM BIT MOV R0,R4 ;MAKE COPY OF IT CLRB R4 ;ISOLATE EXPONENTO+ BIC R4,R0 ;CLEAR EXPONENT OUT OF MANTISSA SWAB R4 ;GET EXPONENT, SEC ;PERFORM SAME FOR 2 RORB R2 MOV R2,R5 CLRB R5 BIC R5,R2# SWAB R5 ;R4 IS EXP 1, R5 IS EXP 2T=;WE WANT R5 TO BE FINAL EXPONENT AND R4 TO BE NEGATIVE SCALERR# SUB R5,R4 ;HOW ARE WE NORMALIZED?L BEQ ALGND ;PERFECT+ BMI 5$ ;1 IS SMALLER, SCALE IT TO 2'S EXPS# ADD R4,R5 ;1 IS BIGGER, SWITCH'EMS NEG R4 ;FIX SHIFT COUNT  SWAB (SP) ;CORRECT SIGNS MOV R2,-(SP) ;SWITCH MANTISSA'S MOV R3,R2 MOV R1,R3 MOV R2,R1 MOV R0,R2 MOV (SP)+,R0U F*5$: CMP #-9.,R4 ;IS SHIFT LESS THAN BYTE?$ BLT BITSHF ;BRANCH IF YES TO DO IT& ADD #16.,R4 ;IS SHIFT LESS THAN WORD) BGE BYTSHF ;BRANCH IF YES TO BYTE SHIFT & CLR R1 ;SHIFT > WORD, CLEAR LOW WORD! ADD #8.,R4 ;IS SHIFT > 24 BITS?L) BGE WRDSHF ;BRANCH IF NOT TO WORD SHIFTS' ;ADDEND IS INSIGNIFICANT - CLEAN UP54INAD: ASL R3 ;FORCE MANTISSA UP FOR PUTTING IN SIGN$ ROL R2 ;ALWAYS LEAVES CARRY CLEAR!%INAD2: SWAB R5 ;PUT EXP IN HIGH PARTM3 BISB R2,R5 ;PUT IN MANTISSA WITHOUT IMPLIED BIT!!! ROLB (SP)+ ;GET SIGN FROM STACKN ROR R5 ;PUT INTO RESULTH ROR R3 ;RESCALE LOW PART* MOV R5,R2 ;MOVE HIGH PART TO RESULT SPOT&NOAD1: MOV (SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R4L" MOV R2,R0 ;SET RESULT INTO R0:R1 MOV R3,R1 ;... RETURN ;DONEINOAD2: ROL R5 ;GET SIGN OF 1  ROR R0 ;PUT BACK INTO IT MOV R0,R2 ;MOVE TO RESULT REGS MOV R1,R3! BR NOAD1 ;BRANCH INTO EXIT CODEA4BYTSHF: CLRB R1 ;BYTE SHIFT, LOW BYTE INSIGNIFICANT SWAB R1 ;PERFORM BYTE SHIFTH SWAB R04WRDSHF: BIS R0,R1 ;MOVES R0 INTO CORRECT BYTE OF R1- CLR R0 ;R0 ONLY HAD 1 BYTE, NOW IT HAS NONE SUB #8.,R4 ;REFIX SHIFT COUNTS#BITSHF: ASR R0 ;NORMALIZE TO COUNTE ROR R1S INC R4P BMI BITSHF ;BRANCH IF NOT DONE- ROL R4 ;R4 IS ZERO FROM SHIFT LOOP - SET IT+ ADD R4,R1 ;TO THE ROUNDING BIT AND ROUND.  ADC R0 1ALGND: CMPB 1(SP),(SP) ;SEE IF SIGNS ARE THE SAMEB* BNE SUBT ;BRANCH IF NOT SAME TO SUBTRACT ADD R1,R3 ;ADD LOW PARTS ADC R2 ;ADD IN CARRY TO HIGH ADD R0,R2 ;ADD HIGH PARTSS. CMP #377,R2 ;ANOTHER HACK TO HANDL@ OVERFLOW. BCC INAD ;BRANCH IF NO CARRY OUT OF MANTISSA- INCB R5 ;BUMP EXP SINCE WE DON'T SHIFT LEFT 1 BEQ 1$ ;CANT ALTER CARRY SO WE USE INCB AND BEQB- SBC R4 ;THIS CLEARS THE CARRY IF R4=1, THUSO' ;PREVENTING US FROM ROUNDING TWICE.T& ADC R3 ;NOW ROUND WITH THE CAREFULLY BCC INAD2 ;(SHORTCUT); ADCB R2 ;MANIPULATED CARRY.E0 ADCB R5 ;BUMP EXP IF MANTISSA OVERFLOWED TWICE. BCC INAD2 ;WE ARE EVER VIGILANT FOR OVERFLOW1$: ;REF LABELH SETZ: CLR R2 CLR R3 ;ZERO THE RESULTO0NOAD0: CMP (SP)+,R0 ;POP THE SIGNS OFF THE STACK BR NOAD1 ;AND GO STORE ITM X$SUBT: SUB R1,R3 ;SUBTRACT LOW PARTS SBC R2 ;REDUCE HIGH BY CARRY SUB R0,R2 ;SUBTRACT HIGH PARTS+ BMI 2$ ;MAKE POSITIVE AND FIX RESULT SIGNF% TSTB R2 ;ARE WE ALREADY NORMALIZED?N BMI INAD ;BRANCH IF YESI DEC R5 ;ADJUST EXPONENT2 BLE 6$ ;BRANCH IF UNDERFLOW5! ASR R4 ;SHIFT ROUND BIT BACK INT ROL R3 ;NORMALIZE 1 PLACER ROL R2 , BEQ 3$ ;BRANCH IF HIGH PART 0 TO CHECK LOW(5$: TSTB R2 ;ARE WE ALREADY NORMALIZED? BMI INAD ;BRANCH IF YEST ASL R3 ;NORMALIZE RESULT ROL R2M DEC R5 ;ADJUST EXP&4$: BGT 5$ ;BRANCH IF DIDNT UNDERFLOW6$: ;REF LABELR BR SETZ ;GO SET RESULT TO 0.$2$: SWAB @SP ;SWITCH RESULTANT SIGN NEG R2 ;MAKE RESULT UNSIGNED NEG R3 SBC R2 ' BGT 5$ ;BRANCH IF NOT ZERO TO NORM ITN&3$: MOV R3,R2 ;START WITH 8 BIT SHIFT2 BEQ NOAD0 ;BRANCH IF LOW PART ZERO, RESULT IS 0.& SWAB R3 ;TEST HIGH PART OF LOW ORDER)00ÊH^ËI^?^DATADATADATADATADATADATADATA BEQ 1$ ;BRANCH IF ZERO FOR 16 BIT SHIFTE! CLR R2 ;IF NOT JUST 8 BIT SHIFTR0 BISB R3,R2 ;MOVE HIGH PART OF LOW ORDER 8 BITS CLRB R3 ;REMOVE THEM SUB #8.,R5 ;ADJUST EXP BR 4$ ;NORMALIZE WHATS LEFTR1$: CLR R3 ;CLEAR LOW ORDER SUB #16.,R5 ;ADJUST EXPE' BR 4$ ;NORMALIZE WHATS LEFT, OPTIMIZEN$ ;TO COMBINE WITH JUST ABOVE CODE .END ZERO TO NORM ITN&3$: MOV R3,R2 ;START WITH 8 BIT SHIFT2 BEQ NOAD0 ;BRANCH IF LOW PART ZERO, RESULT IS 0.& SWAB R3 ;TEST HIGH PART OF LOW ORDER)$ .TITLE KGHIST EVENT TIMING ROUTINES .IDENT /M01.01/; ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01.01 ; B. SCHREIBER 25-OCT-77;E; MODIFIED BY:;U; M. S. HARVEY 7-JUN-79T-; MSH037 -- CLEAR CLOCK A COUNTER ON ST1 FORE; POST-STIMULUS TIME MODET;E>; THIS MODULE CONTAINS ALL ROUTINES NECESSARY FOR EVENT TIMING;T; SYSTEM MACRO CALLS;O .MCALL KSWDF$, KDVDF$, CINT$S KSWDF$  KDVDF$U A) .SBTTL GTHIST EVENT TIMING START ROUTINEP;+$; GTHIST -- START EVENT TIMING SWEEP;O; CALLING SEQUENCE:I;O;; CALL GTHIST (IBUF, LBUF, NBUF, MODE, IPRSET, IEFN, KOUNT)I; ; OUTPUTS:;0; SWEEP IS STARTED;C;-"GTHIST::MOV R5,-(SP) ;SAVE ARG PTR0 CALL .K.PAA ;VALIDATE ARGS AND PUSH ONTO STACK .WORD 7 ;MAX OF 7 ARGS .WORD 140 ;IBUF, LBUF REQUIRED BCC 20$ ;IF CC CONTINUEE' MOV #-,R3 ;SET ERROR CODEO BR 600$ ;STORE ERROR AND EXIT$!20$: MOV #.TDSWB,R4 ;POINT TO SWB.- BEQ 200$ ;IF EQ DATA BASE WAS NOT GENNED IN' CALL .K.SET ;SET UP IBUF THROUGH IEFN BCS 200$ ;IF CS ERROR MOV R4,R3 ;POINT TO SWBN( ADD #S.WKNT,R3 ;POINT TO KOUNT ARGUMENT- MOV (SP)+,R0 ;GET KOUNT ADDRESS OFF OF STACKT+ MOV R0,(R3)+ ;SET VIRTUAL ADDRESS INTO SWBV BNE 40$ ;IF NE GO RELOCATE- CLR (R3)+ ;ELSE CLEAR BOTH WORDS OF ADDRESS, CLR (R3)+ ;... BR 60$ ;SKIP AHEAD#40$: CALL .KRLOC ;RELOCATE TO APR6R" MOV R1,(R3)+ ;SET APR6 RELOCATION MOV R2,(R3)+ ;SET APR6 BIAS)60$: CALL .K.STB ;SET UP BUFFER POINTERS ' BCS 400$ ;IF CS ILLEGAL SPECIFICATIONF& CALL .KLQIN ;INSERT INTO CLOCK QUEUE! CALL .TDCNI ;CONNECT AND ENABLE#) BCS 300$ ;IF CS CALL IT RESOURCE IN USEP- BIS #S$WACT,S.WFL2(R4) ;FLAG SWEEP IS ACTIVE,9 BIS #K$AGTD,.KAFLG ;FLAG TIME DATA GATHERING IN PROGRESSE MOV (SP)+,R5 ;RESTORE ARG PTR RETURNS; ; ERROR RETURNS3; ; BAD PARAMETERS;A200$: MOV #-,R3 T BR 500$;M; RESOURCE IN USER;E300$: MOV #-,R3 BR 500$;:; ILLEGAL BUFFER SPECIFICATION;R400$: MOV #-,R32500$: MOV R5,SP ;RESTORE PRE-.K.PAA STACK POINTER+600$: CALL .KLQRM ;REMOVE FROM CLOCK QUEUE3& MOV #1,R4 ;STORE INTO FIRST ARGUMENT MOV (SP)+,R5 ;RESTORE ARG PTR+ CALLR .IESTO ;STORE ERROR CODE AND RETURND * .SBTTL .TDCNI CONNECT CLOCK TO INTERRUPTS;+2; .TDCNI -- CONNECT TO INTERRUPTS FOR EVENT TIMING;E ; INPUTS:$;O!; .TDSWB SET UP (R4 POINTS TO IT)M; ; OUTPUTS:;R!; C-CLEAR CONNECT OK, CLOCK ARMED; C-SET COULD NOT CONNECTF;S;-..TDCNI: CALL .TDSLI ;SELECT INTERRUPT ROUTINE* MOV .KAVEC,R2 ;PICK UP THE VECTOR ADDRESS .IF DF Q$$BUS+ ADD #4,R2 ;CONNECT SCHMITT TRIGGER VECTORE .IFTF ;Q$$BUS CLR R3 ;FIRST DISCONNECT CALL 200$ ;ENSURE DISCONNECTED MOV #.TDINT,R3 ;NOW CONNECT .IF00ËP^3^È4^eaek›’T ;Q$$BUSO! CALL 200$ ;CONNECT CLOCK VECTORO) BCS 220$ ;IF CS DO NOT TRY OTHER VECTOR % SUB #4,R2 ;POINT TO OVERFLOW VECTORS CLR R3 ;FIRST DISCONNECT CALL 200$ ;... MOV #.TDOVF,R3 ;NOW CONNECT .ENDC ;Q$$BUS/200$: CINT$S R2,#$KBASE,R3,#.TDEDI,#PR6,#.KWASTU 220$: RETURN;+1; .TDSLI -- SELECT EVENT TIMING INTERRUPT ROUTINEA;#!; SETS UP .TDINT IN THE DATA BASEO;;-%.TDSLI: MOV #.TDIN1,R3 ;ASSUME MODE 1T .IF NDF Q$$BUSR TST S.WFLG(R4) ;IS IT?T BNE 20$ ;IF NE YES# MOV #.TDIN0,R3 ;NO--SET FOR MODE 0C20$: ;REF LABEL .ENDC ;Q$$BUS .IF DF M$$MGE ADD $KRLC5,R3 ;RELOCATE TO APR5 .ENDC ;M$$MGE+ MOV R3,-2(R4) ;POINT ISR TO PROPER ROUTINER RETURNN T6 .SBTTL .TDEDI ENABLE/DISABLE ROUTINE FOR EVENT TIMING;+"; .TDEDI -- ENABLE/DISABLE ROUTINE;->; THIS ROUTINE IS CALLED BY THE EXEC ON A CONNECT TO INTERRUPT; OR A DISCONNECT.;- ; INPUTS: ; ; NONE;; ; OUTPUTS:;; CLOCK IS ARMED IF CONNECTW!; CLOCK IS DISABLED IF DISCONNECTY;;- .PSECT .KSCT1,.TDEDI: MOV .KACSR,R0 ;GET CLOCK CSR ADDRESS BCS 60$ ;IF CS THEN DISCONNECT CLR (R0) ;STOP CLOCK2 MOV @#$TKTCB,.KTKCB ;GET MY TCB ADDRESS FOR LATER1 BIC #K$AOVF,.KAFLG ;CLEAR SOFTWARE OVERFLOW FLAG/ .IF DF M$$MGE6 MOV #.TDSWB+120000-<$KBASE & 177700>,R3 ;POINT TO SWB .IFF ;M$$MGEE MOV #.TDSWB,R3 ;POINT TO SWBC .ENDC ;M$$MGE .IF NDF Q$$BUS-) TST S.WFLG(R3) ;WHAT MODE ARE WE TIMING?- BNE 40$ ;IF NE THEN INTER STIMULUS INTERVALE;F*; SET FOR POST-STIMULUS TIME DATA (MODE 0);I; MOV #KA$EEM!KA$STI!KA$STE,R2 ;EXTERNAL EVENT MODE, SCHMITT + ; TRIGGER INTERRUPT ENABLE, AND SCHMITTK ; TRIGGER ENABLES COUNTERF BR 50$ ;START CLOCK AND RETURN .ENDC ;Q$$BUS;A,; INTER-STIMULUS INTERVAL TIME DATA (MODE 1);S40$: ;REF LABEL B MOV #KA$EZB!KA$MFE!KA$STI!KA$ENB,R2 ;SET EXT EVENT TIME FROM ZERO ;BASE, MODE FLAG ENABLE,$ ;ST INTERRUPT ENABLE, AND CLOCK ;COUNT ENABLEE&50$: BIS .KARAT,R2 ;INCLUDE CLOCK RATE MOV R2,(R0) ;ARM CLOCK RETURN ;; ; DISCONNECT;T60$: CLR (R0) ;STOP CLOCK RETURNM - .SBTTL .TDIN0 MODE 0 (PST) INTERRUPT ROUTINE;+*; .TDIN0 -- MODE 0 (PST) INTERRUPT ROUTINE; ; INPUTS:;.:; JSR R4 HERE FROM DATA BASE. R4 WILL THEN POINT TO .TDSWB;) ; OUTPUTS:A; IF ST1 FIRED, CLR CLOCK AND ENABLE OVERFLOWS AND ST2 INTERRUPTS 2; IF OVERFLOW, NOTE THAT AND ENABLE ST1 INTERRUPTSA; IF NEITHER OF ABOVE, STORE CLOCK BUFFER CONTENTS IN USER BUFFERA; OR -1 IF RECENT OVERFLOWM;R;- .ENABL LSB .IF NDF Q$$BUS 6.TDIN0::MOV R3,(SP) ;;;SAVE R3, OVERWRITE R4 ON STACK .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE' MOV .KACSR,R3 ;;;GET CLOCK CSR ADDRESS.' TST (R3) ;;;CHECK FOR SCHMITT TRIGGERH+ BMI 200$ ;;;IF MI SCHMITT TRIGGER 1 FIREDF( BIT #KA$OVF,(R3) ;;;DID CLOCK OVERFLOW?" BNE 300$ ;;;IF NE YES--GO HANDLE> BIC #KA$MDF,(R3) ;;;NO--SCHMITT TRIG 2 FIRED--CLEAR MODE FLAG MOV 2(R3),R3 ;;;READ CLOCKF3 BIT #K$AOVF,.KAFLG ;;;DID CLOCK OVERFLOW RECENTLY?  BEQ 20$ ;;;IF EQ NO % BIC #K$AOVF,.KAFLG ;;;YES--CLEAR FLGE6 MOV #177777,R3 ;;;STORE -1 TO INDICATE CLOCK OVERFLOW/20$: CALL .KWRWD ;;;WRITE VALUE TO USER BUFFER, .IFT ;M$$MGES# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6M .ENDC ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3 " BCC 120$ ;;;IF CC NO FORK NEEDED .IFTF ;Q$$BUS;+<; .TDFXT -- INTERRUPT EXIT FROM TIME DATA INTERRUPT ROUTINES; 2; THIS EXIT IS TAKEN WHEN IT IS NECCESARY TO FORK.; ; INPUTS:F;A; R4 POINTS TO SWB;O ; OUTPUTS:;B<; FORK REQUESTED, AST QUEUED OR EVENT FLAG SET. IF STOPPING; SWEEP, CLOCK IS DISABLED.O;D;-..TDFXT: BIT #S$WSTP,S.WFL2(R4) ;;;STOP NEEDED? BEQ 100$ ;;;IF EQ NO CLR @.KACSR ;;;YES--STOP CLOCK+ BIC #K$AGTD,.KAFLG ;;;NO LONGER DOING THISP100$: ;;;REF LABELB .IF NDF FT$MOPO5 CALLR .KEFQI ;;;FORK, SET EFN OR QUEUE AST AND EXITP .IFF ;FT$MOPD/ BIS #S$WAST,S.WFLG(R4) ;;;SET AST REQUEST FLAGE5 CALLR .KWEFQ ;;;FORK, SET EFN OR QUEUE AST AND EXITI .ENDC ;00ËX^Ì^^?^DATADATADATADATADATADATADATAFT$MOP 120$: RETURN .IFT ;Q$$BUSS;U; HERE IF SCHMITT TRIGGER FIREDG; ;200$: BIC #KA$STF!KA$ENB,(R3) ;;;CLEAR SCHMITT TRIGGER FLAGF ;;; AND STOP CLOCK" CLR 2(R3) ;;; CLEAR CLOCK BUFFER6 BIS #KA$MFE!KA$ENB,(R3) ;;;ENABLE OVERFLOW INTERRUPTS& ;;; AND START CLOCK W/COUNTER=0. MOV S.WKNT+4(R4),R3 ;;;GET KOUNT ADDRESS BIAS' BEQ 400$ ;;;IF EQ SKIP THE WHOLE DEALD .IF DF M$$MGE/ MOV S.WKNT+2(R4),@#KISAR6 ;;;MAP TO KOUNT WORD; .IFTF ;M$$MGE INC (R3) ;;;INKREMENT KOUNTT( BR 400$ ;;;RESTORE REGISERS AND RETURN;; CLOCK OVERFLOW;G300$: CLR (R3) ;;;STOP CLOCKT1 BIS #K$AOVF,.KAFLG ;;;FLAG THAT CLOCK OVERFLOWED;< MOV #KA$EEM!KA$STI!KA$STE,-(SP) ;;;SET EXT EVENT TIME MODE,& ;;; SCHMITT TRIG INTERRUPT ENABLE,' ;;; AND SCHMITT TRIG ENABLE COUNTERT* BIS .KARAT,(SP) ;;;INCLUDE THE CLOCK RATE$ MOV (SP)+,(R3) ;;;JAM THE CLOCK CSR400$: ;;;REF LABEL .IFT ;M$$MGEW# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6; .ENDC ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3N RETURN0 .ENDC ;Q$$BUS .DSABL LSBN < .SBTTL .TDIN1 INTER-STIMULUS INTERVAL (MODE 1) EVENT TIMING;+%; .TDIN1 -- ISI (MODE 1) EVENT TIMING;V ; INPUTS:$6; JSR R4 HERE FROM DATA BASE. R4 THEN POINTS TO .TDSWB;T ; OUTPUTS:+; IF OVERFLOW, SET SOFTWARE FLAG AND RETURN K; ELSE STORE CLOCK BUFFER CONTENTS OR -1 IF RECENT OVEFLOW INTO USER BUFFERT;C;- .ENABL LSB;6.TDIN1: MOV R3,(SP) ;;;SAVE R3, OVERWRITE R4 ON STACK' MOV .KACSR,R3 ;;;GET CLOCK CSR ADDRESSP .IF NDF Q$$BUSN$ BIT #KA$OVF,(R3) ;;;CLOCK OVERFLOW? BNE 100$ ;;;IF NE YESI. BIC #KA$MDF,(R3) ;;;NO--CLEAR MODE (ST2) FLAG .IFF ;Q$$BUSS# BIC #KA$STF,(R3) ;;;CLEAR ST2 FLAG$ .ENDC ;Q$$BUS .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE# MOV 2(R3),R3 ;;;READ CLOCK COUNTERO0 BIT #K$AOVF,.KAFLG ;;;DID WE RECENTLY OVERFLOW? BEQ 40$ ;;;IF EQ NO-& BIC #K$AOVF,.KAFLG ;;;YES--CLEAR FLAG, MOV S.WKNT+4(R4),R3 ;;;GET ADDRESS OF KOUNT BEQ 30$ ;;;IF EQ SKIP IT .IFT ;M$$MGE$* MOV S.WKNT+2(R4),@#KISAR6 ;;;MAP TO KOUNT .IFTF ;M$$MGE INC (R3) ;;;INKREMENT KOUNTC%30$: MOV #177777,R3 ;;;AND STORE A -1/40$: CALL .KWRWD ;;;WRITE VALUE TO USER BUFFER; .IFT ;M$$MGE # MOV (SP)+,@#KISAR6 ;;;RESTORE APR6P .ENDC ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3C# BCS .TDFXT ;;;IF CS GO FORK, ETC.D RETURN ;;;INTERRUPT EXIT4 .IF DF Q$$BUS;+0; .TDOVF -- OVERFLOW INTERRUPT ROUTINE FOR KWV11;3 ; INPUTS:R; !; CALLED HERE FROM INTERRUPT SAVET; ; OUTPUTS:;%; SOFTWARE CLOCK OVERFLOW FLAG IS SETK;T;-.TDOVF::MOV R3,-(SP) ;;;SAVE R3R' MOV .KACSR,R3 ;;;GET CLOCK CSR ADDRESSS .IFTF ;Q$$BUS;K; HERE IF CLOCK OVERFLOW;B6100$: BIS #K$AOVF,.KAFLG ;;;FLAG WE HAD CLOCK OVERFLOW .IFF ;Q$$BUSC7 BIC #KA$OVF!KA$MDF,(R3) ;;;CLEAR OVERFLOW , MODE FLAGSF .IFT ;Q$$BUSD. BIC #KA$OVF,(R3) ;;;CLEAR CLOCK OVERFLOW FLAG .ENDC ;Q$$BUS MOV (SP)+,R3 ;;;RESTORE R3K RETURN ;;;EXIT INTERRUPTA .DSABL LSBI .ENDSAVET; ; OUTPUTS:;%/1 SUB XRATE (DWELL, IRATE%, IPRSET%, IFLAG%) &! &! COPYRIGHT (C) 1977 &1! DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. &! &@! THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A &@! SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE &@! INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR &@! ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE &@! MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH &@! SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE &@! TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN & ! IN DEC. & ! &RA! THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT &AA! NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL & ! EQUIPMENT CORPORATION. &! &L?! DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF & ;! ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. & ! &A! VERSION 01 &! B. SCHREIBER 15-JUL-77 &! & 3! CONVERTED TO BASIC-PLUS-2: K. ALTMANN 8-DEC-700Ì`^Íe^4^eaek›’7 &S?! THIS ROUTINE COMPUTES RATES AND PRESETS FOR THE CLOCK GIVEN &L*! THE DESIRED DWELL (INTER-SAMPLE TIME). &2 !+ &$! XRATE -- COMPUTE RATE AND PRESET &! &I! CALLING SEQUENCE: &S/! CALL XRATE (DWELL, IRATE%, IPRSET%, IFLAG%) & ! & ! INPUTS: &P! &O9! DWELL (FLOATING) THE DESIRED DWELL IN DECIMAL SECONDS &R3! IFLAG% (INTEGER) 0 IF CLOCK A, NON-0 IF CLOCK B &S! &S ! OUTPUTS: &! &7! IRATE% (INTEGER) THE SELECTED CLOCK RATE (1-7) OR 0 & #! IF NO RATE COULD BE SELECTED & 9! IPRSET% (INTEGER) THE TWOS-COMPLEMENT CLOCK PRESET TO & +! BE USED IN A CALL TO A SWEEP ROUTINE &R! &L! &E!- &#5 DIMENSION DWLMAX(5), TICKS(5) &R! &&&! DWLMAX CONTAINS THE MAXIMUM DWELL &2! (INTER-SAMPLE TIME) WHICH MAY BE OBTAINED FOR &3! PARTICULAR CLOCK RATE FOR EITHER CLOCK A OR B. &I! &I7 IF IFLAG% = 0% THEN &E DWLMAX(1%) = 0.065535 & \DWLMAX(2%) = 0.65535 &: \DWLMAX(3%) = 6.5535 & \DWLMAX(4%) = 65.535 & \DWLMAX(5%) = 655.35 & ELSE & DWLMAX(1%) = 0.000255 & \DWLMAX(2%) = 0.00255 &  \DWLMAX(3%) = 0.0255 & \DWLMAX(4%) = 0.255 &E \DWLMAX(5%) = 2.55 &25 ! &4! TICKS IS THE NUMBER OF CLOCK TICKS OBTAINED FOR &! A PARTICULAR CLOCK RATE. & ! &E TICKS(1%) = 1000000.0 &  \TICKS(2%) = 100000.0 & \TICKS(3%) = 10000.0 &  \TICKS(4%) = 1000.0 & \TICKS(5%) = 100.0 &N%30 IF DWELL < .000001 THEN GOTO 700 &A40 ! &2! FIND THE FASTEST CLOCK RATE WHICH WILL PERMIT &4! THE REQUESTED DWELL. CHOOSING THE FASTEST RATE &%! WILL GIVE THE FINEST RESOLUTION. &.! &  FOR I% = 1% TO 5% &( \ IF DWELL > DWLMAX(I%) THEN GOTO 500 &&70 ! I% CONTAINS THE SELECTED RATE &! &  IRATE% = I% &! &R*! COMPUTE THE CLOCK PRESET FOR THE USER &! &( \ PRESET = DWELL * TICKS(I%) & 3 \ IF PRESET = 32768.0 THEN IPRSET% = 32767% + 1% &0< ELSE IF PRESET > 32768.0 THEN IPRSET% = 65535.0 - PRESET & ELSE IPRSET% = - PRESET &H-400 XRATE = INT(PRESET + 0.05) / TICKS(I%) &R \ GOTO 900 & 500 NEXT I% &700 IRATE% = 0% &I 900 SUBENDRESOLUTION. &.! &  FOR I% = 1% TO 5% &( \ IF DWELL > DWLMAX(I%) THEN GOTO 500 &&70 ! I% CONTAINS THE SELECTED RATE &! &  IRATE% = I% &! &R*! COMPUTE THE CLOCK PRESET FOR THE USER &! &( \ PRESET = DWELL * TICKS(I%) & 3 \ IF PRESET = 32768.0 THEN IPRSET% = 32767% + 1% &0< ELSE IF PRESET > 32768.0 THEN IPRSET% = 65535.0 - PRESET & ELSE IPRSET% = - PRESET &H-400 XRATE = INT(PRESET + 0.05) / TICKS(I%) &R \ GOTO 900 & 500 NEXT I% &700 IRATE% = 0% &I<Á0ÀO*9@>¦ZvE ÏG  ¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬O .MACRO KDVDF$ .IF NDF L$$SI1ÿ;+/; KA$XXX - KW11-K CLOCK 'A' CSR BIT DEFINITIONSÿ;-(KA$STF = 100000 ;ST1 EVENT HAS OCCURRED,KA$STI = 40000 ;ST1 EVENT INTERRUPT ENABLE2KA$STE = 20000 ;ST1 EVENT ENABLES KA$ENA (ENABLE ; COUNTER)(KA$RIM = 0400 ;REPEATED INTERVAL MODE*KA$EEM = 1000 ;EXTERNAL EVENT TIME MODE/KA$EZB = 1400 ;EXTERNAL EVENT TIME FROM ZEROÿ ; BASE MODE3KA$MDF = 200 ;OVERFLOW OR COUNTER TO BUFFER XFRÿ ; HAS OCCURREDÿ,KA$MFE = 1000Íh^^^?^DATADATADATADATADATADATADATA0 ;MODE FLAG INTERRUPT ENABLE3KA$OVF = 40 ;COUNTER 'A' OVERFLOW HAS OCCURREDA*;KA$RAT = 16 ;MASK FOR CLOCK 'A' RATE"KA$ENB = 1 ;ENABLE CLOCK 'A';+.; KB$XXX - KW11-K CLOCK 'B' CSR BIT DEFINTIONS;-3KB$OVF = 200 ;COUNTER 'B' OVERFLOW HAS OCCURREDM+KB$OIE = 100 ;OVERFLOW INTERRUPT ENABLE $KB$B2A = 40 ;FEED B TO A ENABLE&;KB$ATO = 20 ;AUTO INCREMENT MODE*;KB$RAT = 16 ;MASK FOR CLOCK 'B' RATE"KB$ENB = 1 ;CLOCK 'B' ENABLE;+3; AD$XXX - AD11-K A/D CONVERTOR CSR BIT DEFINITIONS ;-AD$ERR = 100000 ;ERROR FLAGAD$DON = 200 ;DONE FLAGK"AD$ENB = 100 ;INTERRUPT ENABLE7AD$OVE = 40 ;KW11-K OVERFLOW STARTS A/D CONVERSIONK9AD$ESE = 20 ;EXTERNAL EVENT INITIATES A/D CONVERSIONO%AD$GO = 1 ;START A/D CONVERSIONE;+4; DO$XXX - DR11-K DIGITAL OUTPUT CSR BIT DEFINITIONS4; DI$XXX - DR11-K DIGITAL INPUT CSR BIT DEFINITIONS;-7DO$FLG = 100000 ;EXTERNAL DATA ACCEPTED ON EXT. DEVICE )DO$ENB = 40000 ;ENABLE OUTPUT INTERRUPT-2DO$BUF = 4 ;OFFSET FROM CSR TO OUTPUT BUFFER6DI$FLG = 200 ;EXTERNAL DATA READY FROM EXT. DEVICE(DI$ENB = 100 ;ENABLE INPUT INTERRUPT1DI$BUF = 2 ;OFFSET FROM CSR TO INPUT BUFFERE  .IF NDF L$$PS1E;+3; DA$XXX - AA11-K D/A CONVERTOR CSR BIT DEFINITIONSD;-4DA$ERA = 10000 ;ERASE DATA IN STORAGE OSCILLOSCOPE!DA$WTU = 4000 ;WRITE THRU MODEIDA$STO = 2000 ;STORET2DA$BT9 = 1000 ;BIT 9 (DIGITAL SIGNAL AVAILABLE)DA$RDY = 200 ;READY #;DA$ENB = 100 ;INTERRUPT ENABLEB DA$EXD = 20 ;EXTERNAL DELAYDA$MDE = 14 ;MASK FOR MODEX'DA$FIE = 2 ;FAST INTENSIFY ENABLEB4DA$INT = 1 ;GENERATE INTENSIFY PULSE IN MODE 09DA$SCO=DA$ERA!DA$WTU!DA$STO$DA$BT9!DA$MDE!DA$FIE!DA$INT ;( ;BITS LEGAL FOR USER TO SET IN SCOPE ;CONTROL WORDE .IFF ;L$$PS1R4DA$ERA = 10000 ;ERASE DATA IN STORAGE OSCILLOSCOPE(DA$WTU = 4000 ;SET WRITE THROUGH MODEDA$STO = 2000 ;STORED DA$CHN = 1000 ;CHANNEL SELECT DA$COL = 400 ;COLOR SELECTDA$RDY = 200 ;READYE#;DA$ENB = 100 ;INTERRUPT ENABLE= DA$EXD = 20 ;EXTERNAL DELAYDA$MDE = 14 ;MODE(DA$FIE = 2 ;FAST INTENSIFY ENABLEDA$INT = 1 ;INTENSIFYD@DA$SCO = DA$ERA!DA$WTU!DA$STO!DA$CHN!DA$COL!DA$MDE!DA$FIE!DA$INT* ;BITS LEGAL FOR USER TO SET WITH SCOPE .ENDC ;L$$PS1 .IFF ;L$$SI10 .IF DF Q$$BUS;+!; KWV11 CLOCK CSR BIT DEFINITIONS0;-'KA$STF = 100000 ;ST2 EVENT HAS OCCURED;,KA$STI = 40000 ;ST2 EVENT INTERRUPT ENABLE)KA$STE = 20000 ;ST2 EVENT ENABLES CLOCK0:KA$MDF = 200 ;OVERFLOW OR CTR TO BUFFR XFR HAS OCCURED'KA$OVF = 200 ;OVERFLOW HAS OCCURRED;.KA$IOO = 100 ;INTERRUPT ON OVERFLOW ENABLE"KA$MFE = 100 ;MODE FLAG ENABLE&;KA$RAT = 30 ;MASK FOR CLOCK RATE(KA$RIM = 2 ;REPEATED INTERVAL MODE*KA$EEM = 4 ;EXTERNAL EVENT TIME MODE9KA$EZB = 6 ;EXTERNAL EVENT TIME FROM ZERO BASE MODEIKA$ENB = 1 ;ENABLE CLOCK;+1; AD$XXX - ADV11 A/D CONVERTOR CSR BIT DEFINTIONSP;-AD$ERR = 100000 ;ERROR FLAG(AD$IEN = 40000 ;ERROR INTERRUPT ENABLEAD$DON = 200 ;DONE FLAGO"AD$ENB = 100 ;INTERRUPT ENABLE6AD$OVE = 40 ;CLOCK OVERFLOW STARTS A/D CONVERSION6AD$ESE = 20 ;EXTERNAL EVENT STARTS A/D CONVERSION%AD$GO = 1 ;START A/D CONVERSION ;+3; DO$XXX - DRV11 DIGITAL OUTPUT CSR BIT DEFINITIONSE3; DI$XXX - DRV11 DIGITAL INPUT CSR BIT DEFINITIONSR;-(DO$FLG = 100000 ;EXTERNAL DATA ACCEPTED)DO$ENB = 40 ;OUTPUT INTERRUPT ENABLER2DO$BUF = 2 ;OFFSET TO OUTPUT BUFFER FROM CSR%DI$FLG = 200 ;EXTERNAL DATA READYE(DI$ENB = 100 ;INPUT INTERRUPT ENABLE1DI$BUF = 4 ;OFFSET TO INPUT BUFFER FROM CSRV .ENDC ;Q$$BUS .ENDC ;L$$SI1 .MACRO KDVDF$ .ENDM .ENDM®O .MACRO KSWDF$;+#; SWB - SWEEP CONTROL BLOCK OFFSETS-;VC; THERE IS ONE SWEEP CONTROL BLOCK FOR EACH POSSIBLE TYPE OF SWEEP:T>; A/D, D/A, DIGITAL INPUT, DIGITAL OUTPUT, GATHERING HISTOGRAM; DATA.E;=;- .ASECTP.=0T2S.WLNK: .BLKW 1 ;LINK TO NEXT SWEEP CONTROL BLOCK%S.WFLG: .BLKW 1 ;SWEEP CONTROL FLAGSN00Íp^e^4^eaek›’S.WFL2: .BLKW 1 ;MORE FLAGSBS.WUSW: .BLKW 3 ;USER STATUS WORD: USER, EXEC APR6 RELOC AND BIAS'S.WBNO: .BLKB 1 ;CURRENT BUFFER NUMBER1 .BLKB 1 ;SPARE BYTEM!S.WEBF: .BLKB 1 ;BUFFER IN ERROR 7S.WLBF: .BLKB 1 ;LAST BUFFER COMPLETED (SEE KRWBF.MAC)H/S.WIBP: .BLKW 2*N$$MBF ;INITIAL BUFFER POINTERST;S.WBPX: .BLKW 1 ;POINTER TO S.WBPT <.+2>(+RELOC IF MAPPED)T)S.WBPT: .BLKW 2 ;CURRENT BUFFER POINTERSP(S.WSIZ: .BLKW 1 ;SIZE OF BUFFER (WORDS)/S.WCNT: .BLKW 1 ;COUNT OF WORDS LEFT IN BUFFER @S.WNBF: .BLKW 1 ;NUMBER OF BUFFERS TO FILL OR NEGATIVE IF CONT- ; INUOUS SAMPLING ?S.WEFN: .BLKW 1 ;0, EFN, OR ADDRESS OF USER COMPLETION ROUTINE13S.WSCR: .BLKW 1 ;SYNCHRONOUS CLOCK ROUTINE ADDRESS.S.WSTS: .BLKW 1 ;FINAL STATUS1S.WSTR: .BLKW 1 ;SCHMITT TRIGGER ROUTINE ADDRESST! ;**NOTE**USER VIRTUAL ADDRESS .S.WEFM: .BLKW 1 ;EVENT FLAG MASK (FROM $CEFI)1S.WEFA: .BLKW 1 ;EVENT FLAG ADDRESS (FROM $CEFI) 5S.WKNT: ;VIRTUAL ADDRESS, EXEC APR6 RELOC AND BIASN1 ;OF KOUNT PARAMETER FOR GTHIST. NOTE: THESER4 ;THREE WORDS OVERLAP S.WMSK, S.WCSR, AND S.WPRI.8S.WMSK: .BLKW 1 ;MASK OF BITS TO SIMULATE ST1 ON (DR11))S.WCSR: .BLKW 1 ;ACTIVE UNIT CSR ADDRESSR0S.WPRI: .BLKW 1 ;DEVICE HARDWARE PRIORITY LEVEL .IF DF FT$MOP .IF NDF M$$MGEM3S.WCLX: ;ACTIVE CLOCK QUEUE--UNMAPPED EXEC LEVELA .IFF ;M$$MGEE2S.WCLX: .BLKW 1 ;ACTIVE CLOCK QUEUE--APR5 MAPPING .ENDC ;M$$MGE2S.WCLQ: .BLKW 1 ;ACTIVE CLOCK QUEUE--TASK MAPPING .ENDC ;FT$MOP*S.WUBX: ;DR11 UNIT CONTROL BLOCK OFFSET ;+ ; FOLLOWING CELLS ARE FOR AD/DA SWEEP ONLYS ;>S.WCHB: .BLKB 1 ;CHANNEL BYTE TO LOAD IN HIGH BYTE OF A/D CSR-S.WCBX: .BLKB 1 ;SAVED ORIGINAL CHANNEL BYTE )S.WICH: .BLKW 1 ;STARTING CHANNEL NUMBERW(S.WCCH: .BLKW 1 ;CURRENT CHANNEL NUMBER5S.WHCH: .BLKW 1 ;HIGHEST CHANNEL ACCESSED THIS SWEEPE7S.WCHX: .BLKW 1 ;NUMBER OF CHANNELS (RESET FOR S.WNCH)Q2S.WNCH: .BLKW 1 ;NUMBER OF CHANNELS (DECREMENTED),S.WMXC: .BLKW 1 ;MAXIMUM NUMBER OF CHANNELS#S.WCHI: .BLKW 1 ;CHANNEL INCREMENTL0S.WGNW: .BLKW 1 ;DATA WORD FOR GAIN INFORMATION0S.WUNT: .BLKW 1 ;NUMBER OF UNITS ON THIS DEVICE0S.WAUA: .BLKW 1 ;OFFSET TO ACTIVE UCB. (ADD R4) S.WUCB: ;THE UCB'S START HERE;+"; UCB - UNIT CONTROL BLOCK OFFSETS;H(; UCB'S ARE USED BY THE ADSWP, AND DASWP,; THE DR11 UCB HAS U.FLG, U.IVEC, AND U.OVEC;;-.=0BU.FLG: .BLKW 1 ;UNIT FLAGSE%U.IVEC: ;DR11 INPUT VECTOR ADDRESSBU.VEC: .BLKW 1 ;VECTOR ADDRESSM&U.OVEC: ;DR11 OUTPUT VECTOR ADDRESS!U.CSR: .BLKW 1 ;CSR OF THIS UNITN-U.MAXC: .BLKW 1 ;MAX # CHANNELS ON THIS UNITAU.LGTH=.;+; OFFSETS INTO IBUF ARRAYN;-.=0I"IB.IOS: .BLKW 2 ;I/O STATUS BLOCK#IB.USQ: .BLKW 5 ;USER BUFFER QUEUE'%IB.DVQ: .BLKW 5 ;DEVICE BUFFER QUEUEB#IB.NBF: .BLKW 1 ;NUMBER OF BUFFERS $IB.BUF: ;BEGINNING OF BUFFER LIST U;+4; FLAGS IN THE SWEEP CONTROL BLOCK (SWB) WORD S.WFLG;-7S$WAST = 100000 ;AST REQUEST FOR THIS SWEEP (SIGN BIT)L;(FREE) = 40000 ;M;(FREE) = 20000 ;T;(FREE) = 10000 ;.;(FREE) = 4000 ; 'S$WTSS = 2000 ;TIME-STAMPED SAMPLINGE4S$WNOV = 1000 ;NON-CLOCK OVERFLOW DRIVEN SAMPLING&S$WEXT = 400 ;EXTERNAL START (ST1);(FREE) = 200 ;B;(FREE) = 100 ;U;(FREE) = 40 ; +S$WAGR = 5 ;AUTO GAIN RANGING (AD11)B9S$WSIB = 2 ;SET INTENSIFY BIT AFTER X/Y PAIR (AA11)+4S$WEZB = 1 ;EXTERNAL EVENT TIME FROM ZERO BASE ; MODE (HISTOGRAM)3S$WSCW = 1 ;SCOPE CONTROL WORD PRESENT (AA11)07S$WSTZ = 1 ;ST2 FIRING ZEROES COUNTER (HISTOGRAM) 9S$WUSR = S$WTSS!S$WNOV!S$WEXT!7 ;FLAGS WHICH USER MAY SETN% ;(N O T E: SOME FLAGS IN LOW BYTE  ; ARE NOT USED AT PRESENT);+; FLAGS IN WORD S.WFL2;-,S$WACT = 100000 ;SWEEP IS ACTIVE (SIGN BIT)/S$WDLY = 40000 ;SWEEP REQUESTS DELAY (LDELAY)B+S$WDIF = 20000 ;DIFFERENTIAL INPUT (AD11)//S$WEFN = 10000 ;EFN SETTING AS OPPOSED TO ASTT#S$WSTP = 4000 ;REQUESTED TO STOPT'S$WSEB = 2000 ;STOP AT END OF BUFFERO-S$WACA = 1000 ;ABSOLUTE CHANNEL ADDRESSINGG6S$WSST = 400 ;SIMULATE SCHMITT TRIGGER (DIGO SETS)9S$WA$D00Íx^Îz^?^DATADATADATADATADATADATADATA = 200 ;THIS IS A/D SWEEP BLOCK (MUST BE 200!!) (S$WADC = 100 ;SETADC HAS BEEN CALLED"S$WFRK = 40 ;FORK IN PROGRESS0S$WIOF = 20 ;INPUT (1) OR OUTPUT (0) (DR11)BS$W2CL = ^C ;CLEAR ALL BITS BUT THESE;+; FLAGS IN U.FLG;-9UF$ACT = 100000 ;UNIT WILL BE/IS ACTIVE IN CURRENT SWEEP45UF$CIN = 40000 ;UNIT IS CONNECT TO INTERRUPT VECTOR %UF$AMK = 20000 ;AD11 HAS AM11 ON ITC N;+; FLAGS IN .KAFLG AND .KBFLG;-!K$ACTV = 100000 ;CLOCK IS ACTIVE$#K$ADLY = 40000 ;DELAY IN PROGRESSC"K$AGTD = 20000 ;GTHIST IS ACTIVE2K$ACIN = 10000 ;CLOCK IS CONNECTED TO INTERRUPTS(K$ACAC = 4000 ;CLOCKA HAS BEEN CALLED1K$AOVF = 2000 ;CLOCK A HAS OVERFLOWED (GTHIST)S6K$AFRK = 1000 ;FORK IN PROGRESS FOR CLOCK (MULTIPLE ;CLOCK DRIVEN SWEEPS ONLY) .PSECTI .MACRO KSWDF$ .ENDM .ENDMNNECT TO INTERRUPT VECTOR %UF$AMK = 20000 ;AD11 HAS AM11 ON ITC N;+; FLAGS IN .KAFLG AND .KBFLG;-!K$ACTV = 100000 ;CLOCK IS ACTIVE$#K$" .TITLE KSET SETUP ARGS FOR SWEEPS .IDENT /M02.00/;O ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;K>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 02.00 ; B. SCHREIBER 23-JUN-77;E; PREVIOUSLY MODIFIED BY:U;; B. SCHREIBER; M. S. HARVEY;H; MODIFIED BY:; ; M. S. HARVEY 9-OCT-79P6; MSH025 -- TRAP GROUP GLOBAL EVENT FLAG USE AS ERROR;I; ;; THIS ROUTINE POPS THE ARGUMENTS OFF OF THE STACK AND SETS "; UP THE SWEEP CONTROL BLOCK (SWB);A;O; SYSTEM MACRO CALLS;Q .MCALL KSWDF$, CLEF$S KSWDF$U ) .SBTTL .K.SET SET UP SWEEP CONTROL BLOCKY;+%; .K.SET -- SETUP SWEEP CONTROL BLOCKT;P ; INPUTS:C;; STACK SETUP FROM .K.PAAS.; R5 OLD SP BEFORE .K.PAA (RETURNED BY .K.PAA)&; R4 SWEEP CONTROL BLOCK (SWB) POINTER; ; OUTPUTS:;#; C-CLEAR SWEEP CONTROL BLOCK SETUP2); ALL ARGUMENTS THROUGH 'IEFN' HAVE BEENR; POPPED OFF OF THE STACK; ; C-SET ARGUMENT ERROR"; SP RESET TO VALUE BEFORE .K.PAA;L; REGISTERS ALTERED:; ; R3,R2C;C;-,.K.SET::MOV (SP)+,R3 ;POP OFF RETURN ADDRESS& TST S.WFL2(R4) ;SWEEP ALREADY ACTIVE? BMI 300$ ;IF MI YES--ERROR. BIC #S$W2CL,S.WFL2(R4) ;CLEAR FLAGS AS NEEDED, CLR S.WSTS(R4) ;CLEAR SWEEP I/O STATUS WORD MOV (SP)+,R1 ;GET IBUF ADDRESSN% CMP (R1),#I$BFVW ;WAS SETIBF CALLED?:# BNE 300$ ;IF NE NO--BAD ARGUMENTSE# CLR (R1) ;YES--SET OP IN PROGRESS 6 TSTB IB.DVQ(R1) ;HAS RLSBUF BEEN CALLED FOR 1 BUFFER? BMI 300$ ;IF MI NO--ERRORL/ MOV R1,S.WBPT(R4) ;YES--SAVE ADDRESS FOR LATER ; MOVB #-1,S.WEBF(R4) ;INIT ERROR BUFFER NUMBER TO NO BUFFERS+ MOV @(SP)+,S.WSIZ(R4) ; PICKUP BUFFER SIZEI BLE 300$ ;IF LE THEN ERROR, MOV S.WSIZ(R4),S.WCNT(R4) ;INIT THE COUNTER! MOV (SP)+,R2 ;GET 'NBUF' ADDRESSU BEQ 10$ ;IF EQ SET DEFAULT TST (R2) ;WAS IT POSITIVE? BGT 20$ ;IF GT YES&10$: MOV #.NEG1,R2 ;DEFAULT TO FOREVER/20$: MOV (R2),S.WNBF(R4) ;SET NUMBER OF BUFFERSR! MOV (SP)+,R2 ;GET 'MODE' ADDRESSF BNE 60$ ;IF NE GO STORE-* MOV #.ZEROW,R2 ;IF DEFAULTED STORE A ZERO$60$: MOV (R2),R2 ;PICKUP USER FLAGS8 BIC #^C,R2 ;CLEAR FLAGS USER SHOULD NOT HAVE ON( MOV R2,S.WFLG(R4) ;SET THE FLAGS IN SWB/ BIT #S$WTSS,R2 ;IS THIS TIME-STAMPED SAMPLING?E BEQ 100$ ;IF EQ NO--SKIP9 BIC #1,S.WSIZ(R4) ;YES--ENSURE EVEN # OF WORDS IN BUFFER;7 BIC #1,S.WCNT(R4) ; (JUST00΀^χ^4^eaek›’ A BIT OF PROTECTION FOR ISR)27100$: MOV S.WSIZ(R4),2(R1) ;INIT IOSB(2) TO BUFFER SIZER# MOV (SP)+,R2 ;GET 'IPRSET' ADDRESSE .IF DF K$$W11 BEQ 140$ ;IF EQ SKIP/ BIT #S$WNOV,S.WFLG(R4) ;NON-OVERFLOW SAMPLING?(! BNE 160$ ;IF NE YES--SKIP CHECKC .IF DF FT$MOP, TST .KAFLG ;IS THERE ANOTHER ACTIVE SWEEP? BPL 140$ ;IF PL NO--SKIP CHECK# CMP (R2),.KAPRE ;YES--SAME PRESET?G BNE 300$ ;IF NE NO--ERRORP .IFTF ;FT$MOP MOV (R2),.KAPRE ;SET THE PRESET4140$: BIT #S$WNOV,S.WFLG(R4) ;NON-OVERFLOW SAMPLING? BNE 160$ ;IF NE YES.. TST .KAFLG ;NO--ARE ANY OTHER SWEEPS ACTIVE? .IFF ;FT$MOP' BMI 300$ ;IF MI YES--ERROR .IFT ;FT$MOP; BPL 150$ ;IF PL NO--OKAY' BIT #K$AGTD,.KAFLG ;YES--IS IT GTHIST?  BNE 300$ ;IF NE YES--ERROR150$:T .ENDC ;FT$MOP) BIT #K$ACAC,.KAFLG ;WAS 'CLOCKA' CALLED? , BEQ 300$ ;IF EQ NO--NO CLOCK RATE, AND NOT$ ; NON-OVERFLOW DRIVEN SAMPLING .IFF ;K$$W11;;140$: BIT #S$WNOV,S.WFLG(R4) ;NON-OVERFLOW DRIVEN SAMPLING?.+ BEQ 300$ ;IF EQ NO--LOSE BECAUSE NO CLOCK; .ENDC ;K$$W11; 7;LAST ARG TO CHECK IS THE EVENT FLAG/COMPLETION ROUTINEB;3$160$: MOV (SP)+,R2 ;GET ADDRESS OR 0! BEQ 165$ ;IF EQ USE DEFAULT EFNB; TST (R2) ;SEE IF EFN PRESENT (0 IS HALT SO CAN'T BE AST!)-& BNE 170$ ;IF NE YES--GO CHECK IT OUT4165$: MOV #.KDFEF,R2 ;NO--USE THE DEFAULT EVENT FLAG$ BR 180$ ;WE KNOW ITS AN EVENT FLAG8170$: CMP (R2),#96. ;IS IT AN EVENT FLAG OR ROUTINE ADDR# BLOS 180$ ;IF LOS THEN EVENT FLAGD$ BIT #1,R2 ;MAKE SURE LEGAL ADDRESS BNE 300$ ;IF NE ERROR2 MOV R2,S.WEFN(R4) ;SET COMPLETION ROUTINE ADDRESS BR 200$ ;GO EXIT-180$: CMP (R2),#64. ;GROUP GLOBAL EVENT FLAG?R BHI 300$ ;IF HI YES, ERROR TST (R2) ;CHECK EFN LEGALITY BLE 300$ ;IF LE THEN ILLEGAL+ MOV (R2),S.WEFN(R4) ;SET EVENT FLAG NUMBERT# CLEF$S (R2) ;CLEAR THE EVENT FLAGE BCS 300$ ;ILLEGAL EVENT FLAG2 BIS #S$WEFN,S.WFL2(R4) ;NOTE THAT EVENT FLAG USED200$: CLC ;FLAG ALL IS WELLB BR 900$ ;RETURNH;E3;SOME SORT OF ERROR--RESET SP AND RETURN WITH C-SETE;0.300$: MOV R5,SP ;RESTORE SP TO ORIGINAL VALUE" SEC ;LET CALLER KNOW OF PROBLEM!900$: JMP (R3) ;RETURN TO CALLERO + .SBTTL .K.DLY SETUP/CHECK DELAY FROM STARTT;+3; .K.DLY -- SETUP/CHECK 'LDELAY' ARGUMENT FOR SWEEPL;M ; INPUTS:E;R(; (SP) ADDRESS OF 'LDELAY' ARGUMENT OR 0 ; R4 SWEEP CONTROL BLOCK POINTER#; R5 ORIGINAL SP AS SETUP BY .K.PAAW;( ; OUTPUTS:;E; C-CLEAR SETUP OK; .KADLY ZERO OR DELAY;&; C-SET CLOCK ACTIVE, OR DELAY ILLEGAL"; SP RESET TO VALUE BEFORE .K.PAA;0; REGISTERS ALTERED:;R; R3,R2R;N;--.K.DLY::MOV (SP)+,R3 ;PICK OFF RETURN ADDRESSM( MOV (SP)+,R2 ;GET 'LDELAY' ADDRESS OR 0 BNE 20$ ;IF NE GO USE IT& MOV #.ZEROW,R2 ;SET ADDRESS OF A ZERO20$: .IF DF K$$W11" TST .KAFLG ;IS THE CLOCK ACTIVE? BMI 60$ ;IF MI YES/ BIT #S$WA$D,S.WFL2(R4) ;IS THIS THE A/D SWEEP?I$ BNE 40$ ;IF NE YES--DELAY IS LEGAL0 BIT #S$WNOV,S.WFLG(R4) ;NO--IS IT CLOCK DRIVEN?& BNE 60$ ;IF NE YES--DELAY IS ILLEGAL'40$: MOV (R2),.KADLY ;NO--SET THE DELAYA BEQ 100$ ;IF EQ NO DELAY& NEG .KADLY ;MAKE IT TWO'S COMPLEMENT2 BIS #S$WDLY,S.WFL2(R4) ;NOTE THAT DELAY NECESSARY BR 80$ ;RETURN .ENDC ;K$$W11; ;CLOCK IS ACTIVE ALREADY;A(60$: TST (R2) ;WAS AN LDELAY SPECIFIED? BEQ 80$ ;IF EQ NO--OKO70$: SEC ;YES--ERROR MOV R5,SP ;RESET SP ON ERROR BR 100$ ;GO RETURN80$: CLC ;GOOD RETURNS!100$: JMP (R3) ;RETURN TO CALLERL .END--IS IT CLOCK DRIVEN?& BNE 60$ ;IF NE YES--DELAY IS ILLEGAL'40$: MOV (R2),.KADLY ;NO' .TITLE KADGCH GET CHANNEL INFO FOR A/DL .IDENT /02.00/T; ; COPYRIGHT (C) 1977, 1978, 1980/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.C;$>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO TH00Rˆ^ω^U�^DATADATADATADATADATADATADATA .TITLE EXENDU .IDENT /00/ ;E; COPYRIGHT (C) 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.F; A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;E ; VERSION 00;; T. J. MILLER 23-OCT-77;S@; THIS MODULE ENDS THE READ-ONLY EXECUTIVE IN SYSTEMS SUPPORTING; KERNEL DATA SPACE.;) P&$EXEND:: ;END OF READ ONLY EXECUTIVE - .END ;PLACE SECOND OF MINUTE IN BUFFERR CLC RETURN  E;H ; ERESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 02.00 ; B. SCHREIBER 5-JUL-77E;E; MODIFIED BY:;U; M. S. HARVEY 4-JAN-80T(; MSH082 -- CORRECT GAIN RANGING OPTION;T:; THIS MODULE CHECKS THE CHANNEL INFORMATION FOR A/D SWEEP;N; SYSTEM MACRO CALLS;N .MCALL KSWDF$ KSWDF$I .IF DF N$AD11 .IF DF A$$M11<GAINTB: .BYTE 20,40,60 ;TABLE OF GAIN BITS FOR GAINS 4,16,64 .EVEN .ENDC ;A$$M11 E- .SBTTL .ADGCH GATHER A/D CHANNEL INFORMATIONA;+'; .ADGCH -- GET A/D CHANNEL INFORMATIONS;T ; INPUTS:Y;C7; STACK SETUP FROM .K.PAA AND ALL INFORMATION UP TO THE ; CHANNEL PICKED OFFS1; R5 HOLDS OLD SP BEFORE .K.PAA (SETUP BY .K.PAA)N ; R4 SWEEP CONTROL BLOCK ADDRESS;E ; OUTPUTS:;A ; C-CLEAR CHANNEL STUFF SETUP OK-; S.WICH SETUP WITCH STARTING CHANNEL NUMBER'; S.WNCH SETUP WITH NUMBER OF CHANNELSB0; S.WAUA SETUP WITH THE ACTIVE UNIT UCB ADDRESS;4;.'; C-SET ERROR IN CHANNEL SPECIFICATIONSH!; SP RESET TO VALUE BEFORE .K.PAA;;-+.ADGCH::MOV (SP)+,R3 ;PICKUP RETURN ADDRESSU+ BIT #S$WADC,S.WFL2(R4) ;WAS SETADC CALLED?N3 BNE 300$ ;IF NE YES--WE DON'T HAVE TO DO ANYTHINGL0 TST S.WCHI(R4) ;DO WE HAVE A CHANNEL INCREMENT? BNE 10$ ;IF NE YES$ MOV #1,S.WCHI(R4) ;NO--DEFAULT TO 12 BIC #S$WDIF,S.WFL2(R4) ;AND NO DIFFERENTIAL INPUT .IF DF A$$M11110$: BIT #S$WACA,S.WFL2(R4) ;ABS CHAN ADDRESSING?E BNE 15$ ;IF NE YES. BIT #7,S.WFLG(R4) ;NO--ARE ANY GAIN BITS SET?- BNE 15$ ;IF NE YES--NOT ABS CHAN ADDRESSING.4 BIS #S$WACA,S.WFL2(R4) ;NO--SET ABS CHAN ADDRESSING .IFF ;A$$M11A710$: BIS #S$WACA,S.WFL2(R4) ;SET ABS CHANNEL ADDRESSINGW .IFTF ;A$$M11.15$: CALL .ADCMC ;COMPUTE CHANNEL I .TITLE LRDRV3 .IDENT /05/; COPYRIGHT (C) 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.B2; DIGITAL EQUIPMENT OF CANADA LTD, KANATA, ONTARIO;RA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDR9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.E;T ; VERSION 05; ; DAVID R. CROWE;I; PREVIOUSLY MODIFIED BY: ;E; DAVID H. CHAN; HELEN GORDON; PATRICIA C. LEE ;L; MODIFIED BY:;;; R. E. CALDWELL 21-AUG-79;T'; RC011 -- USE CORRECT FORM OF GTPKT$..;LF; PARALLEL COMMUNICATIONS LINK (PCL) RECEIVER DRIVER FOR RSX-11M-PLUS.;T; MACRO LIBRARY CALLS.;I .MCALL PKTDF$,TCBDF$,UCBDF$$ PKTDF$ ;DEFINE I/O PACKET OFFSETS- TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS. UCBDF$ ;DEFINE UCB OFFSETST;+A; THIS DRIVER IS IN ONE OF A NUMBER OF SOFTWARE STATES DURING ITS @; OPERATION. ITS CURRENT STATE IS DEFINED IN THE LOW ORDER BYTE9; OF U.CW2 IN THE UCB. HANDLER STATES ARE DEFINED BELOW.2;U; INDEX MEANING; 0 NO TASK CONNECTED.%; 2 TASK CONNECTED BUT NOT TRIGGERED.K); 4 TASK TRIGGERED & AWAITING ATF OR RTF.T3; 6 TASK CONNECTED & TIMED OUT AWAITING ATF OR RTF.C;$; ... BUSY STATES .../8; THE CONTROLLER IS CONSIDERED BUSY BY RSX-11M WHILE THEE; HANDLER IS IN THESE STATES. THEREFORE ONLY THE INTERRUPT PROCESSORF=; NEED CONCERN ITSELF WITH THEM. BUSY STATES ARE AS FOLLOWS:R; ; -2 ATF IN PROGRESS. 6; -4 TASK CONNECTED, NOT TRIGGERED, & HAS ATF PENDING.; -6 RTF IN PROGRESS.; ; LEGAL FUNCTIONS BY STATE. ; FUN00U�^‡^4^eaek›’CTION LEGAL STATES; CRX 0T ; RTF 4, 6 ; ATF 2, 4, 6G ; DRX 2, 4, 6 ;-;++; HANDLER UCB WORK AREA OFFSET DEFINITIONS.T;-4U.TASK = U.CNT+2 ;TCB ADDR OF CONNECTED TASK [WORD]/U.TEF = U.TASK+2 ;TRIGGER EVENT FLAG NO. [WORD]S1U.TRSB = U.TEF+2 ;REAL ADDRESS OF TRIGGER STATUSC3U.BUF1 = U.TRSB+4 ;ADDRESS OF RETURN BUFFER (2 WDS) +U.AADA = U.BUF1+4 ;ATACHMENT DESCR. STORAGE ; BUFFER [2 WORDS];+?; THE HARDWARE REGISTERS ARE DEFINED RELATIVE TO THE RCR, WHOSECA; ADDRESS IS FOUND IN THE S.CSR FIELD OF THE SCB AT RUN TIME.;-$RCR = 0 ;RECEIVER COMMAND REGISTER.#RSR = 2 ;RECEIVER STATUS REGISTER.O,RDDB = 4 ;RECEIVER DESTINATION DATA BUFFER.+RDBC = 6 ;RECEIVER DESTINATION BYTE COUNT. -RDBA = 10 ;RECEIVER DESTINATION BUS ADDRESS. %RDCRC = 12 ;RECEIVER DESTINATION CRCT;+"; RECEIVER COMMAND REGISTER (RCR).;-REJ = 100000 ;REJECT (R/W) "RCNPR = 40000 ;RECEIVER NPR (R/W)"RCVWD = 20000 ;RECEIVE WORD (R/W)'IB04 = 10000 ;IDENTIFICATION BITS (RO)SIB03 = 4000 ; "IB02 = 2000 ; "IB01 = 1000 ; "IB00 = 400 ; " LDSILO = 200 ;LOAD SILO (R/W)!IE = 100 ;INTERRUPT ENABLE (R/W)O&A17 = 40 ;EXTENDED ADDRESS BITS (R/W) A16 = 20 ; "6#DTIRDY = 10 ;DATA INPUT READY (RO),INHADI = 4 ;INHIBIT ADDRESS INCREMENT (R/W)"BDINIT = 2 ;BOARD INITIALIZE (WO)RCVDAT = 1 ;RECEIVE DATA (R/W)G;IB = IB04!IB03!IB02!IB01!IB00 ;UNION OF IDENTIFICATION BITS ;+!; RECEIVER STATUS REGISTER (RSR).V;-ERR = 100000 ;ERROR (RO)T*NEXLOC = 40000 ;NONEXISTENT LOCATION (RO)&MEMOFL = 20000 ;MEMORY OVERFLOW (R/W))TXMERR = 10000 ;TRANSMISSION ERROR (R/W)EPAR = 4000 ;PARITY (R/W)RTIMOUT = 2000 ;TIME OUT (R/W)(BCOFL = 1000 ;BYTE COUNT OVERFLOW (R/W)%DTORDY = 400 ;DATA OUTPUT READY (RO)I(SUCTXF = 200 ;SUCCESSFUL TRANSFER (R/W)BUSY = 100 ;BUSY (RO)"RECOM = 40 ;REJECT COMPLETE (R/W)CHNOPN = 20 ;CHANNEL OPEN (RO)URSPB1 = 10 ;RESPONSE B1 (RO)RSPB0 = 4 ;RESPONSE B0 (RO)RSPA1 = 2 ;RESPONSE A1 (RO)RSPA0 = 1 ;RESPONSE A0 (RO);+; FUNCTION DISPATCH TABLEO;- FUNTBL: .IRP X, .WORD IO.'X, XS .ENDM .WORD 0 ;TERMINATOR0;+; DEVICE DISPATCH TABLE ;-- DDT$ LR,L$$R11,,CHK ;GENERATE DISPATCH TABLE(;+0; LRCHK - PCL RECEIVER DRIVER PARAMETER CHECKING; B; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/OD; REQUEST IS RECEIVED FOR THE PARALLEL COMMUNICATIONS LINK RECEIVER.E; SOME PCL RECEIVER REQUESTS CONTAIN INFORMATION THAT MUST BE CHECKEDRG; IN THE CONTEXT OF THE ISSUING TASK; THEREFORE, THE I/O REQUEST IS NOT#; QUEUED BEFORE CALLING THE DRIVER.O;I ; INPUTS:.;M ; R1 = ADDRESS OF THE I/O PACKET*; R4 = ADDRESS OF THE STATUS CONTROL BLOCK;; R5 = ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATEDR;I ; OUTPUTS:;HE; IF FUNCTION IS IO.CRX, ADDRESS CHECK IS PERFORMED FOR IOSB(8 BYTES) ;IA; IF THE QIO FUNCTION IS IO.ATF THEN THE RETURN BUFFER ADDRESS ISI9; CHECKED TO DETERMINE WHETHER IT LIES WITHIN THE ISSUING D; TASK'S ADDRESS SPACE. IF IT DOES THEN THE RETURN BUFFER ADDRESS IS>; RELOCATED AND STORED IN THE I/O PACKET. IF IT IS NOT A VALID@; ADDRESS THEN AN ILLEGAL BUFFER STATUS IS RETURNED AS THE FINAL; I/O STATUS OF THE REQUEST.;=;; FOR ALL FUNCTION CODES, THE I/O PACKET IS INSERTED IN THE ?; CONTROLLER QUEUE AND THE DEVICE INITIATOR IS ENTERED TO START ; THE CONTROLLER.;-1LRCHK: CMP #IO.CRX,I.FCN(R1) ;IS FUNCTION 'CRX'?R BNE 5$ ;IF NE NO# MOV R1,R3 ;SAVE IO PACKET ADDRESSI2 MOV I.PRM+2(R3),R0 ;GET VIRTUAL ADDRESS OF BUFFER MOV #4.,R1 ;GET LENGTH 4 BYTES CALL $ACHKB ;CHECK THE ADDRESS BCS 10$ ;IF CS BAD' MOV W.BATT(R2),R2 ;GET ATT. DESC. ADD.S$ INCB A.IOC(R2) ;INCREMENT I/O COUNT) MOV R2,I.PRM+6(R3) ;SAVE ATT. DESC. ADDRI" CALL $RELOC ;RELOCATE THE BUFFER MOV R1,I.PRM+2(R3) ;STORE BIAST" MOV R2,I.PRM+4(R3) ;STORE ADDRESS& MOV R3,R1 ;RESTORE IO PACKET ADDRESS BR 20$ ;CONTINUE55$: CMP #IO.ATF,I.FCN(R1) ;IS FUNCTION CODE = 'ATF'?  BNE 20$ ;IF NE NOS;D; 'ATF' FUNCTION - SET UP REGISTERS FOR ADDRESS CHECK AND RELOCATION;G$; R000U˜^‰^U�^DATADATADATADATADATADATADATA = ADDRESS TO CHECK AND RELOCATE ; R3 = ADDRESS OF THE I/O PACKET;B+ MOV R1,R3 ;SAVE ADDRESS OF THE I/O PACKET(9 MOV I.PRM+6(R3),R0 ;GET VIRTUAL ADDRESS OF RETURN BUFFERS;A2; VALIDATE THE RETURN BUFFER ADDRESS FOR THIS TASK;+5 MOV #12.,R1 ;SET LENGTH OF RETURN BUFFER TO 6 WORDS CALL $ACHCK ;CHECK THE ADDRESS BCC 15$ ;IF CC OKN;F; INVALID RETURN BUFFER ADDRESS - SET ILLEGAL BUFFER STATUS AND FINISH;S210$: MOV #IE.SPC&377,R0 ;SET ILLEGAL BUFFER STATUS$ CALLR $IOFIN ;FINISH I/O OPERATION;S$; RELOCATE THE RETURN BUFFER ADDRESS; ,15$: MOV W.BATT(R2),R2 ;GET ATT. DESC. ADDR.$ INCB A.IOC(R2) ;INCREMENT I/O COUNT* MOV R2,I.AADA+2(R3) ;SAVE PTR FOR $IODONE CALL $RELOC ;RELOCATE ADDRESSD3 MOV R1,I.PRM+6(R3) ;RELOCATION BIAS ==> I/O PACKETR3 MOV R2,I.PRM+10(R3) ;16-BIT ADDRESS ==> I/O PACKETD% MOV R3,R1 ;RESTORE R1 TO I/O PACKETI;E$; INSERT THE I/O PACKET IN THE QUEUE;S(20$: MOV R4,R0 ;R0 = I/O QUEUE LISTHEAD( CALL $QINSP ;GO INSERT PACKET IN QUEUE; $; NOW GET THE I/O PACKET TO PROCESS.;E1LRINI: GTPKT$ LR,L$$R11,,,T ;GET I/O PACKET MACRO;1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:C;T!; R1 = ADDRESS OF THE I/O PACKET.R/; R2 = PHYSICAL UNIT NUMBER OF THE REQUEST UCB.R; R3 = CONTROLLER INDEX.+; R4 = ADDRESS OF THE STATUS CONTROL BLOCK.6<; R5 = ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;E; I/O REQUEST PACKET FORMAT:;N; WD.00 = I/O QUEUE THREAD WORDR.; WD.01 = REQUEST PRIORITY, EVENT FLAG NUMBER.(; WD.02 = TCB ADDRESS OF REQUESTER TASK.;; WD.03 = POINTER TO 2ND LUN WORD IN REQUESTER TASK HEADER.CB; WD.04 = CONTENTS OF 1ST LUN WORD IN REQUESTER TASK HEADER (UCB).; WD.05 = I/O FUNCTION CODE..; WD.06 = VIRTUAL ADDRESS OF I/O STATUS BLOCK..; WD.07 = RELOCATION BIAS OF I/O STATUS BLOCK.9; WD.10 = I/O STATUS BLOCK ADDRESS DISPLACEMENT + 140000. 1; WD.11 = VIRTUAL ADDRESS OF AST SERVICE ROUTINE.S;; WD.12 = FIRST PARAMETER OR RELOCATION BIAS OF DATA BUFFER0;; WD.13 = SECOND PARAMETER OR 16-BIT ADDRESS OF DATA BUFFERS2; WD.14 = THIRD PARAMETER OR LENGTH OF DATA BUFFER>; WD.15 = FOURTH PARAMETER OR RELOCATION BIAS OF RETURN BUFFER<; WD.16 = FIFTH PARAMETER OR 16-BIT ADDRESS OF RETURN BUFFER;/ MOV I.TCB(R1),R0 ;GET TCB ADDRESS OF REQUESTOR 0 BITB #T2.ABO,T.ST2(R0) ;IS TASK BEING ABORTED? BEQ 10$ ;IF EQ NOK CALLR IEVER ;YES, IT'S FATAL210$: MOV #FUNTBL,R0 ;GET ADDRESS OF FUNCTION TABLE.20$: CMP (R0),I.FCN(R1) ;FUNCTION CODES MATCH? BEQ 30$ ;IF EQ YES$ CMP (R0)+,(R0)+ ;MOVE TO NEXT ENTRY TST (R0) ;END OF TABLE?  BNE 20$ ;IF NE NON$ CALLR IEIFC ;YES, ILLEGAL FUNCTION*30$: JMP @2(R0) ;GO TO FUNCTION PROCESSOR;+; PROCESS 'CRX' FUNCTION;-4CRX: CMP I.PRM(R1),#96. ;IF TRIGGER EVENT FLAG > 64, BHI 20$ ;IF HI BAD. TSTB U.CW2(R5) ;IS A TASK ALREADY CONNECTED ? BNE 10$ ;IF NE YES6 MOV I.PRM(R1),U.TEF(R5) ;SAVE TRIGGER EVENT FLAG NO.< MOV I.PRM+2(R1),U.TRSB(R5) ;SAVE THE ADDRESS OF THE TRIGGER- MOV I.PRM+4(R1),U.TRSB+2(R5) ;STATUS BUFFER(, MOV I.TCB(R1),U.TASK(R5) ;SAVE TCB ADDRESS2 MOV I.PRM+6(R1),U.AADA(R5) ;SAVE ATT. DESC. ADDR.( CALL PRCRX ;CONNECT TASK FOR RECEPTION( CALLR ISSUC ;INDICATE SUCCESS AND EXIT,10$: CALLR IEDAA ;SOMEONE ALREADY CONNECTED*20$: CALLR IEBAD ;BAD PARAMETER SPECIFIED;+/; **-PRCRX-PERFORM ACTUAL CONNECT FOR RECEPTIONE;$?; THIS ROUTINE IS CALLED TO CONNECT THE RECEIVER FOR RECEPTION.N<; IT ACTIVATES THE HARDWARE TO RECEIVE A WORD, WHICH WILL BEE; TREATED AS A FLAGS WORD. IT SETS THE SOFTWARE STATE OF THE HANDLERS@; TO 2. THE ROUTINE SHOULD BE CALLED WHENEVER THE HANDLER WISHES; TO RECEIVE A FLAGS WORD.;C ; INPUTS:R0; R4 = ADDRESS OF THE STATUS CONTROL BLOCK (SCB).; R5 = ADDRESS OF THE UNIT CONTROL BLOCK (UCB);0 ; OUTPUTS:6; THE RECEIVER IS INITIALIZED (BDINIT) & RCVWD IS SET.); THE HANDLER IS SET TO SOFTWARE STATE 2.U ; R0 IS SET POINTING TO THE RCR.;-'PRCRX: MOV U.BUF(R5),-(SP) ;SAVE BUFFERR MOV U.BUF+2(R5),-(SP) ;ADDRESS MOV U.CNT(R5),-(SP) ;& COUNT./ MOV U.TRSB(R5),U.BUF(R5) ;MOVE TRIGGER STATUS 5 MOV U.TRSB+2(R5),U.BUF+2(00U ^‡^4^eaek›’R5) ;BUFFER ADDR TO U.BUF.S# MOV #4,U.CNT(R5) ;LOAD BYTE COUNT.N% CLR -(SP) ;SET STATUS BYTE TO ZERO.N CALL $PTBYT ; " $ MOV (SP)+,U.CNT(R5) ;RESTORE BUFFER MOV (SP)+,U.BUF+2(R5) ;ADDRESS MOV (SP)+,U.BUF(R5) ;& COUNT.% MOV S.CSR(R4),R0 ;GET ADDRESS OF RCRO' BIS #BDINIT,(R0) ;INITIALIZE RECEIVER. 2 BIS #RCVWD!IE,(R0) ;PREPARE TO RECEIVE A FLAG WD.+ MOVB #2,U.CW2(R5) ;SET HANDLER STATE TO 2.U RETURN ;);+; PROCESS 'RTF' FUNCTION;-8RTF: CMP I.TCB(R1),U.TASK(R5) ;RTF FROM CONNECTED TASK? BEQ 10$ ;IF EQ YES' CALLR IEDNA ;NO, DEVICE NOT AVAILABLER*10$: MOVB U.CW2(R5),R0 ;GET HANDLER STATE.% BIC #^C6,R0 ;MASK OUT UNWANTED BITSR2 JMP @RTFJMP(R0) ;PROCESS FUNCTION ACCORDING STATERTFJMP: .WORD IEDNA ;STATE 0R .WORD IENTR ;STATE 2 .WORD RTFS4 ;STATE 4 .WORD RTFS6 ;STATE 6+RTFS4: MOV S.CSR(R4),R0 ;GET ADDRESS OF RCRW+ BIS #REJ!IE,(R0) ;SET REJECT & INT ENABLE.2- MOVB #-6,U.CW2(R5) ;SET HANDLER STATE TO -6.N( MOVB S.ITM(R4),S.CTM(R4) ;SET TIME OUT RETURN ;T1RTFS6: MOVB #2,U.CW2(R5) ;SET HANDLER STATE TO 2.V$ CALLR IEDNR ;FORCE DRIVE NOT READY;+; PROCESS 'ATF' FUNCTION;-ATF: ;REF LABEL .IF DF M$$EXT( CALL $STMAP ;SET UP UNIBUS MAP ADDRESS .ENDC4 MOV I.PRM+6(R1),U.BUF1(R5) ;RELOCATION BIAS ==> UCB6 MOV I.PRM+10(R1),U.BUF1+2(R5) ;16-BIT ADDRESS ==> UCB4 CMP I.TCB(R1),U.TASK(R5) ;ATF FROM CONNECTED TASK? BEQ 10$ ;IF EQ YES' CALLR IEDNA ;NO, DEVICE NOT AVAILABLEN*10$: MOVB U.CW2(R5),R0 ;GET HANDLER STATE." BIC #^C6,R0 ;CLEAR UNWANTED BITS5 JMP @ATFJMP(R0) ;PROCESS FUNCTION ACCORDING TO STATEIATFJMP: .WORD IEDNA ;STATE 0F .WORD ATFS2 ;STATE 2 .WORD PRATF ;STATE 4 .WORD RTFS6 ;STATE 6ATFS2: MOVB #-4,U.CW2(R5)% CLRB S.CTM(R4) ;NO TIME OUT ON THIS5 RETURN ;;+); **-PRATF-PERFORM ACCEPTANCE OF TRANSFERB;AA; THIS ROUTINE IS CALLED TO INITIATE THE RECEPTION OF THE MESSAGE?@; WHICH HAS JUST BEEN ACCEPTED. THE STATE OF THE HANDLER IS SET<; TO -2, WHICH INDICATES THAT THE HANDLER IS BUSY PERFORMING; THE ACCEPT TRANSFER FUNCTION.);R ; INPUTS:I0; R4 = ADDRESS OF THE STATUS CONTROL BLOCK (SCB).; R5 = ADDRESS OF THE UNIT CONTROL BLOCK (UCB);E ; OUTPUTS:D; THE RDBC & RDBA ARE SET UP, & AN NPR RCVDAT FUNCTION IS INITIATED.!; THE HANDLER IS SET TO STATE -2. ; R0 IS SET POINTING TO THE RCR.; R2 IS DESTROYED.;-PRATF: ;REF LABEL .IF DF M$$EXT# CALL $MPUBM ;MAP UNIBUS TO MEMORYE. MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS .ENDC% MOV S.CSR(R4),R0 ;GET ADDRESS OF RCR9 MOV U.BUF+2(R5),RDBA(R0) ;LOAD BUFFER ADDRESS REGISTER.D" MOV U.CNT(R5),R2 ;GET BYTE COUNT. NEG R2 ;NEGATE IT & LOAD& MOV R2,RDBC(R0) ;BYTE COUNT REGISTER.- MOVB #-2,U.CW2(R5) ;SET HANDLER STATE TO -2.U9 BIS #RCNPR!RCVDAT!IE,U.BUF(R5) ;SET RCNPR, RCVDAT, IE, & 0 BIS U.BUF(R5),(R0) ;EXTENDED ADDR BITS IN RCR.( MOVB S.ITM(R4),S.CTM(R4) ;SET TIME OUT RETURN ;L;+; PROCESS 'DRX' FUNCTION;-,DRX: TSTB U.CW2(R5) ;IS ANY TASK CONNECTED ? BEQ 10$ ;IF EQ NOR( MOV I.TCB(R1),R1 ;YES, GET TCB ADDRESS., CMP R1,U.TASK(R5) ;IS THIS TASK CONNECTED ? BNE 10$ ;IF NE NOG CALL PRDRX ;DO THE DISCONNECTI CALLR ISSUC ;EXIT WITH SUCCESS'10$: CALLR IEDNA ;DEVICE NOT AVAILABLEN;+3; **-PRDRX-PERFORM ACTUAL DISCONNECT FROM RECEPTIONN; =; THIS ROUTINE DISCONNECTS THE RECEIVING TASK FROM RECEPTION..;M ; INPUTS:4; R1 = ADDRESS OF TCB FOR TASK.R; R4 = SCB ADDRESS.S; R5 = UCB ADDRESS.;R ; OUTPUTS:4; THE I/O REQUEST COUNT FOR THE TASK IS DECREMENTED.'; THE RECEIVER IS INITIALIZED (BDINIT). ; THE HANDLER STATE IS SET TO 0. ; R0 IS SET POINTING TO THE RCR.;-;PRDRX: MOV U.AADA(R5),R0 ;GET ATTACHMENT DESCRIPTOR ADDRESS$ DECB A.IOC(R0) ;DECREMENT I/O COUNT% MOV S.CSR(R4),R0 ;GET ADDRESS OF RCRI- BIS #BDINIT,(R0) ;INITIALIZE RECEIVER BOARD.S, CLR U.AADA(R5) ;CLEAR ATTACHED REGION DESC.4 CLR U.TASK(R5) ;CLEAR TCB ADDRESS OF CONNECTED TASK% CLR U.TEF(R5) ;CLEAR EVENT FLAG ALSO( CLRB U.CW2(R5) ;SET HANDLER STATE TO 0. RETURN ; ;+,; **-$LRINT-PCL RECE00U¨^‰^U�^DATADATADATADATADATADATADATAIVER INTERRUPT PROCESSOR;<; INTERRUPTS ARE PROCESSED DEPENDING UPON THE HANDLER STATE.;-$LRINT::6 INTSV$ LR,PR5,L$$R11 ;;;GENERATE INTERRUPT SAVE STUFF% MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS.% MOV S.CSR(R4),R4 ;;;GET RCR ADDRESS.( BIC #IE,(R4) ;;;DISABLE PCL INTERRUPTS.& CALL $FORK ;;;CREATE A FORK PROCESS. MOV R4,R0 ;COPY RCR ADDRESSE# MOV U.SCB(R5),R4 ;GET SCB ADDRESS.R& MOVB U.CW2(R5),R2 ;GET HANDLER STATE.6 JMP @INTJMP(R2) ;PROCESS INTERRUPT ACCORDING TO STATE .WORD INTM6 ;STATE -6I .WORD INTM4 ;STATE -4  .WORD INTM2 ;STATE -2DINTJMP: .WORD INTP0 ;STATE 0 .WORD INTP2 ;STATE 2  .WORD INTP4 ;STATE 4  .WORD INTP6 ;STATE 6V;B<; THE VARIOUS INTERRUPT STATE PROCESSORS WHICH ARE JUMPED TOG; THROUGH THE INTJMP TABLE ARE ENTERED WITH REGISTERS SET AS FOLLOWS:A; R0 = RCR ADDRESS; R2 = HANDLER STATE; R4 = SCB ADDRESS; R5 = UCB ADDRESS;1INTM6: BIT #ERR!SUCTXF,RSR(R0) ;ERROR OF SUCTXF?R BNE 10$ ;IF NE YES" BIT #RECOM,RSR(R0) ;IS RECOM SET? BEQ 10$ ;IF EQ NOT% CALL PRCRX ;RECONNECT FOR RECEPTIOND CALLR ISSUC ;EXIT WITH SUCCESS'10$: CALLR IEFHE ;FATAL HARDWARE ERRORAINTM4:INTP2: INTP6: TST RSR(R0) ;ANY ERRORS? BMI 10$ ;IF MI YES' BIT #RECOM,RSR(R0) ;REJECT COMPLETION?  BNE 20$ ;IF NE YES( BIT #DTORDY,RSR(R0) ;DATA OUTPUT READY? BNE 40$ ;IF NE YES/ CALLR PRCRX ;RECONNECT FOR RECEPTION AND EXITD(10$: BIT #PAR,(R0) ;IS IT PARITY ERROR ? BNE 20$ ;IF NE YES NOP)20$: CALL PRCRX ;RECONNECT FOR RECEPTION , MOVB R2,U.CW2(R5) ;MOVE STATE TO AS BEFORE. RETURN ;E#40$: TST R2 ;IS HANDLER STATE -4 ?S, BGE 60$ ;IF GE NO, GIVE FLAGS WORD TO TASK TST RDDB(R0) ; CALLR PRATF ;ACCEPT TRANSFER360$: MOV U.BUF(R5),-(SP) ;SAVE BUFFER ADDR & COUNT.P MOV U.BUF+2(R5),-(SP) ;Y MOV U.CNT(R5),-(SP) ;= MOV U.TRSB(R5),U.BUF(R5) ;LOAD TRIGGER STATUS BLOCK ADDRESSN MOV U.TRSB+2(R5),U.BUF+2(R5) ;+ MOV #4,U.CNT(R5) ;LOAD A BIG ENOUGH COUNT.2 CMP R2,#2 ;IS THE STATUS=2?  BEQ 70$ ;IF EQ YES4 MOV #&377,R2 ; STATE 6 ==> STATUS IE.DAO70$: ASRB R2 ; " MOV (R0),R3 ;GET CONTENTS OF RCR( BIC #^C,R3 ;ISOLATE TRANSMITTER ID. BIS R3,R2 ;MERGE WITH STATUS.P$ MOV R2,-(SP) ;GET FIRST STATUS WORD" CALL $PTWRD ;PUT IN USERS BUFFER+ MOV RDDB(R0),-(SP) ;GET SECOND STATUS WORDR" CALL $PTWRD ;PUT IN USERS BUFFER6 MOV (SP)+,U.CNT(R5) ;RESTORE COUNT AND BUFFER ADDRESS MOV (SP)+,U.BUF+2(R5) ;. MOV (SP)+,U.BUF(R5) ;# MOVB #4,U.CW2(R5) ;SET STATE TO 4.S# BIS #IE,(R0) ;REENABLE INTERRUPTS..- MOV U.TEF(R5),R0 ;GET TRIGGER EVENT FLAG NO.:4 MOV U.TASK(R5),R5 ;GET TCB ADDR FOR CONNECTED TASK. BEQ 90$ ;IF EQ NONEA- CALL $CEFI ;CONV EVENT FLAG TO MASK & ADDR." BCS 90$ ;IF CS NO FLAG SPECIFIED BIS R0,(R1) ;SET FLAGS.90$: CALLR $DRDSE ;DECLARE SIGNIFICANT EVENT. INTM2: TST RSR(R0) ;ANY ERRORS? BMI M2ERR ;IF MI YES$ TSTB RSR(R0) ;SUCCESSFUL TRANSFER? BPL M2PAR ;IF PL NOR)M2SUC: MOV (R0),R2 ;GET CONTENTS OF RCR.2) BIC #^C,R2 ;RETRIEVE TRANSMITTER ID.A' BIS #IS.SUC,R2 ;MERGE IN RETURN STATUST% BIT #RECOM,RSR(R0) ;REJECT COMPLETE?, BEQ 10$ ;IF EQ NOC% INC R2 ; +2 FOR TRUNCATED RECEPTION210$: MOV RDBC(R0),R1 ;COMPUTE LENGTH OF RECEPTION. ADD U.CNT(R5),R1 ;S MOV U.BUF(R5),-(SP) ;SAVE U.BUF% MOV U.BUF+2(R5),-(SP) ;SAVE U.BUF+2N MOV U.CNT(R5),-(SP) ;SAVE U.CNT3 MOV U.BUF1(R5),U.BUF(R5) ;RELOCATION BIAS ==> UCBU BEQ 20$ ;IF EQ ZEROL5 MOV U.BUF1+2(R5),U.BUF+2(R5) ;16-BIT ADDRESS ==> UCB  BR 30$ ;GO MOVE THE REGISTERSV;R7; RELOCATION BIAS = 0 CHECK FOR NON-ZERO 16-BIT ADDRESS;T920$: MOV U.BUF1+2(R5),U.BUF+2(R5) ;16-BIT ADDRESS ==> UCBI" BEQ 40$ ;IF EQ NO RETURN ADDRESS;0#; REGISTERS REQUESTED - RETURN THEM ;E.30$: MOV (R0)+,-(SP) ;GET CONTENTS OF REGISTER% CALL $PTWRD ;PUT IT IN USERS BUFFER * MOV (R0)+,-(SP) ;GET CONTENTS OF REGISTER% CALL $PTWRD ;PUT IT IN USERS BUFFERA* MOV (R0)+,-(SP) ;GET CONTENTS OF REGISTER% CALL $PTWRD ;PUT IT IN USERS BUFFERD* MOV (R0)+,-(SP) ;GET CONTENTS OF REGISTER% CALL $PTWRD ;PUT IT IN USERS BUFFERO* M00U°^‡^4^eaek›’OV (R0)+,-(SP) ;GET CONTENTS OF REGISTER% CALL $PTWRD ;PUT IT IN USERS BUFFER=;C; CONTINUE PROCESSING ;U'40$: MOV (SP)+,U.CNT(R5) ;RESTORE U.CNTE( MOV (SP)+,U.BUF+2(R5) ;RESTORE U.BUF+2# MOV (SP)+,U.BUF(R5) ;RESTORE U.BUFP% CALL PRCRX ;RECONNECT FOR RECEPTION) MOV R2,R0 ;COPY STATUS CODEL" CALLR IODON ;FINISH I/O AND EXIT*M2ERR: MOV RSR(R0),R1 ;GET CONTENTS OF RSR$ BIT #BCOFL,R1 ;CHECK FOR BYTE COUNT BNE 10$ ;IF NE OVERFLOWN2 BIT #PAR!TXMERR,R1 ;PARITY OR TRANSMISSION ERROR? BNE M2PAR ;IF NE YES$ BIT #TIMOUT,R1 ;CHECK FOR TIME OUT. BNE M2TIME ;IF NE YES) BIT #MEMOFL!NEXLOC,R1 ;NEM OR OVERFLOW?P BNE M2OFL ;IF NE YES* CALLR IEBBE ;INDICATE TRANSMISSION ERROR;; BYTE COUNT OVERFLOWE;R/10$: BIC #BCOFL,RSR(R0) ;CLEAR ERROR CONDITION.# BIS #REJ!IE,(R0) ;TRUNCATE MESSAGER RETURN ;S;/; PARITY OR TRANSMISSION ERROR; +M2PAR: CALL PRCRX ;RECONNECT FOR RECEPTIONO BR IEBBE ;FLAG IE.BBEI;E; RECEIVER TIMEOUT;X,M2TIME: CALL PRCRX ;RECONNECT FOR RECEPTION! BR IEDNR ;FLAG DEVICE NOT READYC;K*; NONEXISTENT LOCATION OR MEMORY OVERFLOW.;#+M2OFL: CALL PRCRX ;RECONNECT FOR RECEPTIONO) BR IESPC ;INDICATE NONEXISTENT LOCATIONN*INTP0: BIS #BDINIT,(R0) ;INITIALIZE BOARD. RETURN ;F+INTP4: CALL PRCRX ;RECONNECT FOR RECEPTIONE+ MOVB #6,U.CW2(R5) ;SET HANDLER STATE TO 6. RETURN ;N;+%; **-LRCAN-CANCEL I/O SERVICE ROUTINEN; :; THIS ENTRY POINT IS ENTERED WHEN AN IO.KIL FUNCTION IS9; ISSUED REGARDLESS OF WHETHER THE DEVICE IS BUSY OR NOT. ;N ; INPUTS:V,; R0 = ADDRESS OF ACTIVE I/O PACKET (IF ANY)%; R1 = ADDRESS OF TCB OF CURRENT TASK ; R3 = CONTROLLER INDEXO; R4 = SCB ADDRESS; R5 = UCB ADDRESS;N ; OUTPUTS:6; 1. IF TASK TERMINATION IS IN PROGRESS, THEN BOARD IS1; INITIALIZED & TASK (IF ANY) IS DISCONNECTED.67; 2. OTHERWISE, IF REQUEST IS OUTSTANDING, THEN TASK IS; RECONNECTED FOR RECEPTION.T>; 3. REGARDLESS OF RUN DOWN STATUS, IF REQUEST IS OUTSTANDING,2; THEN COMPLETION IS INDICATED WITH STS=IE.ABO.;-7LRCAN: CMP R1,U.TASK(R5) ;;;REQUEST FOR CONNECTED TASK?E BNE 10$ ;;;IF NE NOE% MOV S.CSR(R4),R3 ;;;GET RCR ADDRESS.R$ BIC #IE,(R3) ;;;DISABLE INTERRUPTS. MTPS #0 ;;;LOWER PRIORITY:/ BITB #T2.HLT,T.ST2(R1) ;TASK BEING TERMINATED?O BEQ 20$ ;IF EQ NOZ0 MOVB U.CW2(R5),R2 ;YES, RETRIEVE HANDLER STATE. CALL PRDRX ;DISCONNECT TASKT TSTB R2 ;IS UNIT BUSY? BLT 30$ ;IF LT YES10$: RETURN ;F"20$: TSTB U.CW2(R5) ;IS UNIT BUSY? BGE 10$ ;IF GE YES+ CALL PRCRX ;ABORT OPERATION AND RECONNECTR30$: BR IEABO ;;+; POWERFAIL AND TIMEOUTK;-)LROUT: TSTB U.CW2(R5) ;IS TASK CONNECTED?G BEQ 10$ ;IF EQ YES% CALL PRCRX ;RECONNECT FOR RECEPTION /10$: BITB #US.BSY,U.STS(R5) ;IS THE UNIT BUSY?T BEQ LRPWF ;IF EQ NO* BR IEDNR ;YES, ABORT OUTSTANDING REQUESTLRPWF: RETURN ;T;+-; PROCESS ERROR CONDITIONS AND CALL I/O DONE.N;-%IEABO: MOV #IE.ABO&377,R0 ;ABORT TASK BR IODON ;)IEBAD: MOV #IE.BAD&377,R0 ;BAD PARAMETERSY BR IODON ;3IEDAA: MOV #IE.DAA&377,R0 ;DEVICE ALREADY CONNECTED BR IODON ;1IEBBE: MOV #IE.BBE&377,R0 ;BAD TRANSMISSION ERRORK BR IODON ;/IEDNA: MOV #IE.DNA&377,R0 ;DEVICE NOT AVAILABLEE BR IODON ;+IEDNR: MOV #IE.DNR&377,R0 ;DEVICE NOT READYB BR IODON ;/IEFHE: MOV #IE.FHE&377,R0 ;FATAL HARDWARE ERROR BR IODON ;0IEIFC: MOV #IE.IFC&377,R0 ;INVALID FUNCTION CODE BR IODON ;-IENTR: MOV #IE.NTR&377,R0 ;TASK NOT TRIGGEREDO BR IODON ;)IESPC: MOV #IE.SPC&377,R0 ;ILLEGAL BUFFERO BR IODON ;6IEVER: MOV #IE.VER&377,R0 ;PARITY OR HARD DEVICE ERROR BR IODON ;/ISSUC: MOV #IS.SUC&377,R0 ;SUCCESSFUL OPERATIONO%IODON: CALL $IOALT ;PROCESS I/O DONE  JMP LRINI ;AND TRY FOR MORE .ENDV #IE.DNR&377,R0 ;DEVICE NOT READYB BR IODON ;/IEFHE: MOV #IE.FHE&377,R0 ;FATAL HARDWARE ERROR BR IODON ;0IEIFC: MOV #IE.IFC&377,R0 ;INVALID FUNCTION CODE BR IODON ;-IENTR: MOV #IE.NTR&377,R0 ;TASK NOT TRIGGEREDO BR IODON ;)IESPC: MOV #IE.SPC&377,R0 ;ILLEGAL BUFFERO BR IODON ;6IEVER: MOV #IE00V¸^‰^U�^DATADATADATADATADATADATADATA .TITLE MKDRV .IDENT /02/;; COPYRIGHT (C) 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 02;; J. REED 6-OCT-78;; MODIFIED BY:;; J.E.POLLACK 18-JUL-79;%; EP011 -- ADD CLEAR MEMORY FUNCTION;; B. S. MCCARTHY;'; VARIOUS BUG FIXES THROUGHOUT HISTORY;;;; MKA11 MEMORY DRIVER;; >; THE MKA11 MEMORY DRIVER IS THE INTERFACE BETWEEN HRC AND THE@; MEMORY CSRS. THE ONLY TASK THAT MAY ACCESS THIS DRVIER IS HRC.; ;S; MACRO LIBRARY CALLSU;R# .MCALL HWDDF$,PKTDF$,MKDEF$,UCBDF$R HWDDF$N PKTDF$C MKDEF$E UCBDF$ ; DEFINE UCB OFFSETS;S; BIT ASSIGNMENTSE;- BIT0 = 1I BIT1 = 2J BIT2 = 4L BIT3 = 101 BIT4 = 20O BIT5 = 40 BIT6 = 100 BIT7 = 200B BIT8 = 400U BIT9 = 1000 BIT10 = 2000O BIT11 = 4000  BIT12 = 10000E BIT13 = 20000E BIT14 = 40000N BIT15 = 100000E;C ; CSR OFFSETSA;T CSR1 = 0 ;$ CSR2 = 2 ; SECOND CSR CONTROL WORD R;A; BIT DEFINITIONS FOR MK11 CSRSK;$> PROG = BIT10 ; BOX CONTROL 1 => PROGRAMMMABLE, 0 => MANUAL? ECC = BIT1 ; ECC DISABLE 1 => SINGLE BIT ERRORS DETECTABLE  SIZ = BIT3 ;L4 SEIND = BIT4 ; SBE SEEN 1=> SINGLE BIT ERROR SEEN CONSEL = BIT9 ;& IIN = BIT11 ; INTERNAL INTERLEAVE OGMSK = PROG!777 ; BAS1 = EPT ; BAS2 = OGMSK!PROG ;6 INMSK = BIT12!BIT13!BIT14 ; EXTERNAL INTERLEAVE MASK$ PROPTR = BIT3 ; PROTECTION POINTER;&; OFFSETS INTO THE MK UCB PRIVATE DATA;A? U.KCTR = U.CNT+2 ; COUNTER OF KRBS SCANNED FOR THE CURRENT BOXN< U.STAD = U.CNT+4 ; POINTER TO STATUS WORD OF USER PARAMETER ; BUFFER; U.PWRV = U.CNT+6 ; POWER FAIL VECTOR FOR INTERNAL ROUTINES4: U.CSAV = U.CNT+10 ; START OF 8-WORD CSR SAVE AREA FOR CSR( ; CONTENTS OF ALL PORTS OF THIS BOX.;K;R; MISC. PARAMETERS; ' GRANUL = +10. ; GRANULARITY OF MEMORY!0 ; ONE UNIT OF BASE ADDRESS = 2**GRANUL BYTES GRASHF = 2000 ; 1**GRANUL;F; FUNCTION JUMP TABLER;TFCNLST:' .BYTE IO.ORG/400 ; SET/READ BOX ORIGINN' .BYTE IO.INT/400 ; SET/READ INTERLEAVE+, .BYTE IO.IIN/400 ; READ INTERNAL INTERLEAVE) .BYTE IO.PRG/400 ; SET/READ PROGRAMMABLEL% .BYTE IO.ERR/400 ; READ ERROR STATUS $ .BYTE IO.GRN/400 ; READ GRUNULARITY! .BYTE IO.SIZ/400 ; READ BOX SIZE * .BYTE IO.RSA/400 ; READ ERROR INFORMATION .BYTE IO.CST/400 ; ' .BYTE IO.MSK/400 ; SET DIAGONSTIC MASK .BYTE IO.CLM/400 ; CLEAR MEMORY .BYTE 0 ; TERMINATOR;A; SERVICE ROUTINE ADDRESSES ;L8FCNJMP: .WORD IOORG ; SERVICE ROUTINE ADDRESSES FOR THE% .WORD IOINT ; ABOVE FUNCTIONS CODES+ .WORD IOIIN ;0 .WORD IOPRG ;  .WORD IOERR ;E .WORD IOGRN ;/ .WORD IOSIZ ;L .WORD IORSA ;0 .WORD IOCST ;A .WORD IOMSK ;R .WORD IOCLM ;U;Y;.; ERROR CODE STORAGE BUFFERZ;;Y8ECOD1: .WORD 0 ; STATUS RETURN VALUES FOR I/O OPERATIONECOD2: .WORD 0 ;0; ;G; DEVICE DISPATCH TABLEL;0;  DDT$ MK,M$$K11,,,,T; ;M;TD; IN ADDITION TO THE NORMAL $GTPKT OPERATION, A CALL WILL BE MADE TO@; THE ROUTINE $CFORK. THIS ROUTINE WILL DETERMINE THE PROCESSOR>; THAT IS CURRENTLY EXECUTING THIS ROUTINE AND COMPARE IT WITH=; THE ONE INDICATED IN THE SCB AT S.URM. IF THEY ARE THE SAMECA; THEN A RETURN IS EXECUTED AND PROCESSING CONTINUES. IF THEY ARES?; DIFFERENT THEN $CFORK SAVES THE CONTEXT IN THE FORK BLOCK ANDRA; ENTERS THIS REQUEST INTO THE FORK QUE FOR THE PROPER PROCESSOR.AC; CONTROL IS RETURNED TO THE CALLERS CALLER WITH THE CARRY BIT SET.NB; IN THIS CASE CONTROL WILL RETURN TO THE DRIVER WHICH WILL RETURN; TO THE EXEC.;L;T.PAGET;P;E;R; DRIVER INITALIZE ENTRY POINT;S .ENABLE LSBMKINI: GTPKT$ MK,M$$K11,,,T ;E;B; REGISTER SUMMARY:E;E; R0 = UNDEFINED; R1 = ADDRESS OF I/O PACKET(; R2 = PHYICAL UNIT NUMBER ON CONTROLLERD; R3 = CONTROLLER INDEX IN LIST OF ALL SIMILAR CONTROLLERS IN SYSTEM; R4 =00VÀ^‡^4^eaek›’ ADDRESS OF SCBO; R5 = ADDRESS OF UCBA; ;T; ; I/O PACKET FORMAT:;S;L; I.LNK: I/O QUEUE THREAD WORDN; I.PRI: REQUEST PRIORITY; I.EFN: EVENT FLAG NUMBERE*; I.TCB: ADDRESS OF TCB OF REQUESTOR TASK9; I.LN2: ADRESS OF LUN2 WORD IN HEADER OF REQUESTOR TASK; I.UCB: ADDRESS OF UCB; I.FCN: I/O FUNCTION CODEM.; I.IOSB: VIRTUAL ADDRESS OF I/O STATUS BLOCK.; +2: RELOCATION BIAS OF I/O STATUS BLOCK>; +4: DISPLACEMENT OF I/O STATUS BLOCK (RELATIVE TO APR6)0; I.AST: VIRTUAL ADDRESS OF AST SERVICE ROUTINE-; I.PRM: RELOCATION BIAS OF FIRST I/O BUFFER&; +2: DISPLACMENT RELATIVE TO APR6; +4: BUFFER SIZE IN BYTES; ;N;L;N;E;;I;B; IN THE USER BUFFER.U;O;A5 CLR U.KCTR(R5) ; CLEAR THE PORT POINTER JUST IN CASER8 MOV U.BUF+2(R5),-(SP) ; SAVE THE PRESENT BUFFER ADDRESS6 MOV (SP),U.STAD(R5) ; SAVE THE INITIAL BUFFER ADDRESS; ADD #10,U.STAD(R5) ; AND ADD THE OFFSET TO THE STATUS WORDL@ MOV U.STAD(R5),U.BUF+2(R5) ; SET UP THE USER BUFFER STATUS WORD3 MOV #IS.SUC,-(SP) ; INDICATE SUCCESS TO START WITHB' MOV (SP),ECOD1 ; INITALIZE FOR SUCCESSA CLR ECOD2 ;T* CALL $PTWRD ; AND PUT IT INTO THE BUFFER3 MOV (SP)+,U.BUF+2(R5) ; RESTORE THE BUFFER ADDRESSO;A;C;U; THEN WE EXIT WITH AN ERROR.T;J; 8 MOV I.TCB(R1),R3 ; GET THE ADDRESS OF THE TASK CONTROL  ; BLOCK INTO R3.; BIT #T3.PRV,T.ST3(R3); TEST THE PRIVILEGE BIT OF THE THIRD5 ; STATUS WORD IN THE TCB) BEQ 3$ ; IF EQUAL THEN THE TASK IS NOT ' ; PRIVILEGED AND WE RETURN AN ERROR# CMP R3,$HRCPT ; WAS IT HRC... ? BEQ 5$ ; YES -- PROCEEDDA3$: MOV #IE.PRI&377,-(SP) ; ELSE WE MOVE THE ERROR ONTO THE STACK " JMP ERROR ; AND REPORT THE ERROR;)+; SELECT SERVICE ROUTINE FROM FUNCTION CODE ;N5$:T3 MOV #FCNLST,R0 ; POINT TO VECTOR OF FUNCTION CODES 6$:S8 CMPB I.FCN+1(R1),(R0) ; IS THIS THE REQUESTED FUNCTION? BEQ 7$ ; BR IF YES/ TSTB (R0)+ ; HAVE WE SEEN THE TERMINATOR YET?E BNE 6$ ; BR IF NOT2 MOV #IE.IFC&377,-(SP) ; SET ILLEGAL FUNCTION CODE JMP ERROR ; TAKE ERROR RETURNW7$: 0 SUB #FCNLST,R0 ; OBTAIN OFFSET IN FUNCTION LIST! ASL R0 ; CONVERT TO WORD OFFSETR= MOV FCNJMP(R0),U.PWRV(R5) ; SAVE THE FUNCTION ROUTINE IN THE  ; POWERFAIL RECOVERY BUFFERI, JMP @FCNJMP(R0) ; AND GO TO SERVICE ROUTINE;C.PAGEF; STARTING ADDRESS OF BOX:;CA; IF MS.SET BIT IS SET THIS FUNCTION WILL CHANGE ALL OF THE PORTSS@; ON THIS BOX TO THE STARTING ADDRESS SUPPLIED IN THE FIRST WORDD; OF THE USER BUFFER. IF ANY OF THE PORTS ARE IN THE 'FORCED PANEL'B; MODE SO THAT THEY CANNOT BE PROGRAMMED THE ERROR CODE IE.WLK&377D; IS RETURNED IN THE IOSB AND NO FURTHER ATTEMPT IS MADE TO CONTINUE@; PROGRAMMING THE REST OF THE PORTS. IF ANY PORT FAILS TO ACCEPTA; THE STARTING ADDRESS BUT INDICATES THAT IT IS PROGRAMMABLE, THEPG; ERROR CODE IE.FHE&377 IS RETURNED IN THE IOSB AND NO FURTHER ATTEMPT N9; IS MADE TO CONTINUE PROGRAMMING THE STARTING ADDRESSES.N;DG; IF MS.SET IS NOT SET THIS FUNCTION WILL REPORT THE STARTING ADDRESSESR@; OF ALL OF THE PORTS ON THIS BOX IN THE FIRST FOUR WORDS OF THE; USER BUFFER.; :; STATUS IS RETURNED IN THE FIFTH WORD OF THE USER BUFFER.; ;EIOORG:11$:' CALL ROUND ; SET UP ON EACH PROCESSORN12$:" TST U.KCTR(R5) ; ARE WE THRU YET? BEQ 19$ ; IF EQUAL THEN WE ARE9 CALL RESET ; RESET THE REGISTERS AFTER RETURN FROM FORKI. BITB #MS.SET,I.FCN(R1) ; IS IT A SET FUNCTION$ BEQ 16$ ; GIVE HIM THE INFORMATION' CALL $GTWRD ; GET THE ADDRESS DESIREDW= SUB #2,U.BUF+2(R5) ; RESET THE BUFFER ADDRESS SO THAT WE CANI+ ; GET THE SAME PARAMETER THE NEXT TIME.B MOV (SP)+,R0 ; INTO R0E, BIC #^C777,R0 ; RESET ALL BUT ADDRESS FIELD+ BIS #PROG,R0 ; MASK IN THE PROGRAMABLE BITN; MOV CSR2(R4),R3 ; GET THE PRESENT STATE OF THE CSR INTO R3B4 BIC #OGMSK,R3 ; CLEAR OUT THE STARTING ADDRESS BITS6 BIS R0,R3 ; PUT THE DESIRED STARTING ADDRESS INTO R3/ MOV R3,CSR2(R4) ; PUT THE RESULTS INTO THE CSRH" BIT #PROG,CSR2(R4) ; DID IT TAKE?! BNE 13$ ; IF NOT EQUAL THEN YES,; MOV #IE.WLK&377,-(SP) ; PUSH THE ERROR CODE O00VÈ^‰^U�^DATADATADATADATADATADATADATANTO THE STACK : CALL STATUS ; REPORT THE PRESENT OF A WRITE LOCKED PORT, ; TO THE USER IN THE BUFFER STATUS WORD. BR 11$ ; AND GO AROUND AGAIN13$:4 CMPB R0,CSR2(R4) ; IS THE CORRECT ADDRESS ASSERTED? BEQ 11$ ; IF EQUAL THEN YESS< MOV #IE.FHE&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK JMP ERROR ; REPORT THE ERROR16$:0 MOV CSR2(R4),-(SP) ; GET THE ADDRESS INTO -(SP). BIC #^C777,(SP) ; RESET ALL BUT ADDRESS FIELD. CALL GTURM ; GET THE UNIBUS RUN MASK INTO R3( ASH #4,R3 ; SHIFT MASK TO UPPER 4 BITS2 BIS R3,(SP) ; THEN SET IT INTO THE RETURN TO THE ; BUFFER.E0 CALL $PTWRD ; PUT THE RESULTS INTO THE BUFFER" BR 11$ ; AND GO GET THE NEXT ONE19$: JMP SUC ; FINISH UPA;R;?;B; EXTERNAL INTERLEAVINGE;;VIOINT:21$:' CALL ROUND ; SET UP ON EACH PROCESSORK22$:" TST U.KCTR(R5) ; ARE WE THRU YET? BEQ 29$ ; IF EQUAL THEN WE ARE9 CALL RESET ; RESET THE REGISTERS AFTER RETURN FROM FORKD. BITB #MS.SET,I.FCN(R1) ; IS IT A SET FUNCTION BEQ 26$ ; GIVE THE INFORMATION: CALL $GTWRD ; GET THE DESIRED INTERLEAVING FUNCTION CODE" MOV (SP)+,R0 ; AND GET IT INTO R0" BIT #370,R0 ; IS IT A GOOD CODE? BEQ 23$ ; IF EQUAL THE YES< MOV #IE.BAD&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK JMP ERROR ; REPORT THE ERROR23$:@ SUB #2,U.BUF+2(R5) ; RESET THE BUFFER ADDRESS TO THE FIRST WORD/ ; SO THAT WE CAN GET THE FACTOR ON THE NEXTE ; PASS( ASL R0 ; GET THE INTERLEAVING FUNCTION$ ASL R0 ; INTO THE RIGHT POSISTION# ASL R0 ; FOR ASSERTION ON THE CSRI ASL R0L SWAB R0, BIS #PROG,R0 ; MASK IN THE PROGRAMMABLE BIT; MOV CSR2(R4),R3 ; GET THE PRESENT STATE OF THE CSR INTO R3O9 BIC #INMSK,R3 ; CLEAR OUT THE INTERNAL INTERLEAVING BITSS* BIS R0,R3 ; SET THE INTERLEAVING FACTOR/ MOV R3,CSR2(R4) ; PUT THE RESULTS INTO THE CSR+" BIT #PROG,CSR2(R4) ; DID IT TAKE?, BNE 24$ ; IF EQUAL THEN IT IS PROGRAMMABLE< MOV #IE.WLK&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK6 CALL STATUS ; REPORT THE EXISTANCE OF A WRITE LOCKED) ; PORT IN THE USER BUFFER STATUS WORDS BR 21$ ; AND GO AGAINA24$:4 CMPB R3,CSR2(R4) ; IS THE CORRECT ADDRESS ASSERTED? BEQ 21$ ; IF EQUAL THEN YESB26$:7 MOV CSR2(R4),-(SP) ; GET THE CSR WORD 2 ONTO THE STACK 2 BIC #107777,(SP) ; CLEAR OUT THE REST OF THE WORD/ SWAB (SP) ; GET THE CODE INTO A READABLE FORMR ASR (SP) ASR (SP)B ASR (SP)F ASR (SP) . CALL GTURM ; GET THE UNIBUS RUN MASK INTO R30 BIS R3,(SP) ; SET IT INTO THE HIGH BYTE OF THE ; RETURNED WORDO& CALL $PTWRD ; BUT IT INTO THE BUFFER# BR 21$ ; GO TO THE NEXT PROCESSORG29$: JMP SUC ; FINISH UP(;S;E; INTERNAL INTERLEAVING?;B;2IOIIN:31$:' CALL ROUND ; SET UP ON EACH PROCESSORE32$:" TST U.KCTR(R5) ; ARE WE THRU YET? BEQ 39$ ; IF EQUAL THEN WE ARE9 CALL RESET ; RESET THE REGISTERS AFTER RETURN FROM FORK5 BITB #MS.SET!MS.CLR,I.FCN(R1) ; IS IT A SET FUNCTIONT BEQ 36$ ; IF EQUAL THEN NO; MOV CSR2(R4),R0 ; GET THE PRESENT CONTENTS OF THE CSR INTO  ; R0' BITB #MS.CLR,I.FCN(R1); IS IT A CLEAR?  BEQ 34$ ; IF EQUAL THEN NO3 BIC #IIN,R0 ; CLEAR THE INTERNAL INTERLEAVING BIT- MOV R0,CSR2(R4) ; MOV THE IMAGE INTO THE CSR1! BIT #IIN,CSR2(R4) ; DID IT WORK?R' BEQ 31$ ; IF EQUAL THEN YES IT WORKEDT33$:< MOV #IE.FHE&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK JMP ERROR ; REPORT THE ERROR34$:1 BIS #IIN,R0 ; SET THE INTERNAL INTERLEAVING BITT* MOV R0,CSR2(R4) ; TRY TO PROGRAM THE PORT BIT #IIN,CSR2(R4) ; IS IT SET?F. BNE 31$ ; IF NOT EQUAL THEN YES AND GO AGAIN35$:< MOV #IE.WLK&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK5 CALL STATUS ; INDICATE THAT ONE OF THE PORTS CANNOTM ; BE INTERLEAVED BR 31$ ; AND GO AGAIN;36$: BIT #IIN,CSR2(R4) ; IS IT SET% BEQ 38$ ; IF EQUAL THEN IT IS CLEAR3 MOV #1,-(SP) ; INDICATE SET37$:/ CALL GTURM ; GET THE UNIBUS RUN MASK INTO R3 BIS R3,(SP) ; REPORT ITE' CALL $PTWRD ; PUT IT INTO THE BUFFER;# BR 31$ ; GO TO THE NEXT PROCESSORS38$: MOV #0,-(SP) ; SHOW CLEARED BR 37$ ; GO AGAINN39$: JMP SUC ; FINISH U00VÐ^‡^4^eaek›’PK;7;S; MANUAL-PROGRAMMABLE MODE;T;SIOPRG:41$:' CALL ROUND ; SET UP ON EACH PROCESSORN42$:" TST U.KCTR(R5) ; ARE WE THRU YET? BEQ 49$ ; IF EQUAL THEN WE ARE9 CALL RESET ; RESET THE REGISTERS AFTER RETURN FROM FORKV5 BITB #MS.SET!MS.CLR,I.FCN(R1) ; IS IT A SET FUNCTION  BEQ 46$ ; IF EQUAL NO. BITB #MS.CLR,I.FCN(R1); IS IT A CLEAR COMMAND! BNE 43$ ; IF NOT EQUAL THEN YES 2 BIS #PROG,CSR2(R4) ; SET THE BANK TO PROGRAMMABLE BIT #PROG,CSR2(R4) ; IS IT SET:! BNE 41$ ; IF NOT EQUAL THEN YES < MOV #IE.WLK&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK1 CALL STATUS ; INDICATE THAT ONE OF THE PORTS IS  ; FORCED TO THE PANEL. BR 41$ ; AND GO AGAINC43$:, BIC #PROG,CSR2(R4) ; SET THE BANK TO MANUAL# BIT #PROG,CSR2(R4) ; IS IT CLEARED;' BEQ 41$ ; IF EQUAL THEN IT IS CLEAREDU< MOV #IE.FHE&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK JMP ERROR ; REPORT THE ERROR46$:# MOV #1,-(SP) ; ASSUME PROGRAMMABLEM BIT #PROG,CSR2(R4) ; IS IT SET?0 BNE 48$ ; IF NOT EQUAL THEN IT IS PROGRAMMABLE3 MOV CSR2(R4),R2 ; GET THE IMAGE OF THE CSR INTO R2+ BIS #PROG,R2 ; SET THE PROGRAMMABILITY BITS* MOV R2,CSR2(R4) ; MOVE IT BACK TO THE CSR0 BIT #PROG,CSR2(R4) ; IS IT FORCED TO THE PANEL?6 BEQ 47$ ; IF EQUAL THEN IT IS NOT AND WE REPORT THIS ; PORT AS NOT PROGRAMMABLE.L/ BIC #PROG,CSR2(R4) ; PUT IT BAC THE WAY IT WASC( BR 48$ ; AND REPORT IT AS PROGRAMMABLE47$:4 CLR (SP) ; ELSE INDICATE FORCED TO THE FRONT PANEL48$:4 CALL GTURM ; GET THE UNIBUS RUN MASK INTO THE HIGH ; BYTE OF R3+ BIS R3,(SP) ; SET IT INTO THE RETURN WORDN/ CALL $PTWRD ; PUT THE RESULTS INTO THE PACKETI# BR 41$ ; GO TO THE NEXT PROCESSORO49$: JMP SUC ; FINISH UP ;S; !; ERROR CORRECTION ENABLE-DISABLEF;U;TIOERR:. CALL GTONE ; GET ONTO THE DESIRED PROCESSOR52$:9 CALL RESET ; RESET THE REGISTERS AFTER RETURN FROM FORK 5 BITB #MS.SET!MS.CLR,I.FCN(R1); IS IT A SET FUNCTION?;/ BEQ 55$ ; IF NOT EQUAL THEN REPORT THE STATUSC2 BITB #MS.CLR,I.FCN(R1) ; IS IT A DISABLE REQUEST?! BNE 53$ ; IF NOT EQUAL THEN YESE' BIC #ECC,(R4) ; ELSE CLEAR THE ECC BIT  BIT #ECC,(R4) ; IS IT CLEAR?E% BEQ 59$ ; IF EQUAL THEN IT IS CLEARO< MOV #IE.FHE&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK JMP ERROR ; REPORT THE ERROR53$: BIS #ECC,(R4) ; SET THE ECC BIT BIT #ECC,(R4) ; IS IT SET?S' BNE 59$ ; IF NOT EQUAL THEN IT IS SET< MOV #IE.FHE&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK JMP ERROR ; REPORT THE ERROR55$: MOV #0,-(SP) ; ASSUME DISABLEDS BIT #ECC,(R4) ; IS IT ENABLED? , BNE 56$ ; IF NOT EQUAL THEN IT IS DISABLED" INC (SP) ; ELSE INDICATE ENABLED56$: CALL $PTWRD ; REPORT SAMEU59$: JMP SUC ; FINISH UPE;E;7; GRANULARITY CHECKR;C; IOGRN:5 MOV #GRASHF,-(SP) ; SET THE GRANULARITY AT 64K BYTES,& CALL $PTWRD ; PUT IT INTO THE BUFFER JMP SUC2 ; GO HOME; ;N; BOX SIZE CHECK;E;IOSIZ:- CALL GTONE ; GET ONTO THE DESIRED PROCESSORS72$:9 CALL RESET ; RESET THE REGISTERS AFTER RETURN FROM FORKE% MOV #SIZ,(R4) ; REQUEST THE BOX SIZEL3 MOV (R4),-(SP) ; GET THE SIZE ONTO THE STACK FOR AI ; CALL TO $PTWRD( BIC #100377,(SP) ; CLEAN UP THE GARBAGE$ SWAB (SP) ; SET SIZE INTO LOW BYTE& CALL $PTWRD ; OUT IT INTO THE BUFFER JMP SUC ; GO HOME ;S;T$; GET PARAMETERS ON SINGLE BIT ERROR;D; IORSA:- CALL GTONE ; GET ONTO THE DESIRED PROCESSOR 82$:9 CALL RESET ; RESET THE REGISTERS AFTER RETURN FROM FORKE5 BIT #SEIND,(R4) ; IS THE SINGLE BIT ERROR INDICATED?A! BNE 83$ ; IF NOT EQUAL THEN YESR< MOV #IE.IDS&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK JMP ERROR ; REPORT THE ERROR83$:7 MOV (R4),-(SP) ; PUSH THE ARRAY ADDRESS ONTO THE STACK 3 MOV CSR2(R4),R0 ; GET THE STARTING ADDRESS INTO R0 ( ASRB (SP) ; GET THE ARRAY ADDRESS INTO% ASRB (SP) ; THE FORM OF X TIMES 32KD ASRB (SP) ; AND THEN WE WILL+ ASRB (SP) ; CORRECT FOR WHICH SIDE OF THEE BIT #CONSEL,R0 ; OF THE BOX.R1 BEQ 84$ ; IF EQUAL THEN IT IS ON THE RIGHT SIDEB" ; AND WE HAVE THE RIGHT NUMBER7 ADD #1,(SP) ; ELSE WE AR00VØ^‰^U�^DATADATADATADATADATADATADATAE ON THE ODD SIDE AND WE MUSTE ; ADD ONE TO CORRECT.J84$:7 ADD R0,(SP) ; ADD THE STARTING ADDRESS TO THE RESULTSA/ SWAB (SP) ; NOW WE GET INTO A 32. WORD FACTORG$ BIC #377,(SP) ; WITHOUT THE GARBAGE ASL (SP)E ASL (SP) - MOV (SP),R0 ; AND WE SAVE THE RESULTS IN R0 < CALL $PTWRD ; THEN WE PUT THE LOWER END OF THE RANGE INTO- ; INTO THE FIRST OUTPUT WORD OF THE ARRAYB4 ADD #GRASHF,R0 ; ADD THE GRANULARITY TO THE RESULTS# MOV R0,-(SP) ; AND PUT THE RESULTSR9 CALL $PTWRD ; INTO THE SECOND WORD OF THE BUFFER AS THE ; UPPER LIMIT OF THE RANGE JMP SUC ; AND GO HOME ;R;G; SYSTEM STATUS FUNCTION;A;SIOCST:91$:' CALL GTKRB ; GET THE NEXT KRB INTO R3)0 BEQ 93$ ; IF EQUAL THEN THIS IS THE END OF THE) ; KRB TABLE AND WE ARE THRU WITH THIS  ; PART OF THE FUNCTION.T= MOVB K.URM(R3),-(SP) ; PUT THE UNIBUS RUN MAP ONTO THE STACKO0 BIT K.URM(R3),$URMST ; IS THE PROCESSOR ONLINE?5 BEQ 92$ ; IF EQUAL THEN IT IS OFFLINE AND WE DO NOTT ; SET THE SIGN BIT.T6 BISB #200,(SP) ; ESLE IT IS ONLINE AND WE SO INDICATE92$:+ CALL $PTBYT ; PUT IT IN THE OUTPUT BUFFERY' ADD #2,U.KCTR(R5) ; UPDATE THE COUNTER: BR 91$ ; AND GO AGAINN93$:* CLR U.KCTR(R5) ; CLEAR THE OFFSET COUNTER> MOV U.STAD(R5),U.BUF+2(R5) ; SET THE BUFFER TO THE FIFTH WORD? SUB #4,U.BUF+2(R5) ; AND SUBTRACT FOUR SO THAT WE POINT TO THES ; THIRD WORD.T94$:0 MOV U.DCB(R5),R3 ; GET THE DCB ADDRESS INTO R3@ MOV D.MSK(R3),-(SP) ; GET THE FIRST FUNCTION MASK WORD ONTO THE ; STACKT& CALL $PTWRD ; PUT IT INTO THE BUFFER; MOV D.MSK+10(R3),-(SP) ; GET THE SECOND FUNCTION MASK WORDB ; ONTO THE STACK' CALL $PTWRD ; PUT IT INTO THE BUFFERD JMP SUC ; GO HOMER;K;(; ; DIAGNOSTIC MASK FUNCTION;V;S;(IOMSK:- CALL GTONE ; GET ONTO THE DESIRED PROCESSORB) CALL RESET ; AND GET THE REGISTERS BACK 0 BITB #MS.SET,I.FCN(R1) ; IS THIS A SET FUNCTION, BEQ 102$ ; IF EQUAL THEN IT IS A READ ONLY ; FUNCTION5 CALL $GTWRD ; ELSE WE GET THE #2 WORD OF THE BUFFERT* MOV (SP)+,(R4) ; AND MOVE IT INTO THE CSR4 CALL $GTWRD ; AND WE GET THE #3 WORD OF THE BUFFER. MOV (SP)+,CSR2(R4) ; AND MOVE IT INTO THE CSR102$: : MOV (R4),-(SP) ; PUSH THE FIRST WORD OF THE CSR ONTO THE ; STACKC* CALL $PTWRD ; AND PUT IT INTO THE BUFFER. MOV CSR2(R4),-(SP) ; AND THEN THE SECOND WORD CALL $PTWRD ; INTO THE BUFFERM! JMP SUC ; THEN EXIT WITH STATUSC/ JMP SNAP ; AND END WITH THE SNAPSHOT ROUTINE.Y; ; CLEAR MEMORY BOX; IOCLM:6 CALL GTONE ; MOVE OURSELVES TO THE CLOSEST PROCESSOR CALL RESET ; SETUP REGISTERS;N=; R4 = CSR ADDRESS FOR THE PORT ACCESSING THE TARGET BOX FROMO; 'THIS' PROCESSOR;$ MOV R5,-(SP) ; SAVE UCB ADDRESS* MOV (R4),-(SP) ; SAVE STARTING CSR1 VALUE' MOV CSR2(R4),R3 ; PICK UP BASE ADDRESSM( BIT #PROG,R3 ; IS THE BOX PROGRAMMABLE? BEQ 118$ ; BR IF NOT% BIC #^C777,R3 ; ISOLATE BASE ADDRESSS* CMP #77,R3 ; IS THE BOX SET AT INFINITY?' BLOS 120$ ; BR IF YES, NOT ACCESSABLE= ASH #GRANUL,R3 ; CONVERT TO UNITS OF 32WORDS FROM 32K WORDS.S! MOV #SIZ,(R4) ; ASK FOR BOX SIZE MOV (R4),R5 ; PICK UP SIZE$ BIC #100377,R5 ; ISOLATE SIZE FIELD- ASL R5 ; CONVERT TO COUNT OF 32 WORD BLOCKSU4 BEQ 118$ ; BR IF SIZE=0 (A MEMORY ERROR CONDITION);M ; NOW CLEAR ALL CELLS IN THE BOX;M CLR R2 ; SOURCE DATA- MOV #ECC,(R4) ; SET BOX TO IGNORE ECC ERRORSC112$:,! MOV R3,-(SP) ; SAVE BASE ADDRESS7% MOV R5,-(SP) ; AND SAVE THE BOX SIZEO114$: 5 MOV R3,KISAR6 ; MAP VIA APR6 TO THE NEXT 32WORD UNITR- MOV #140000,R1 ; POINT TO THE BLOCK TO CLEAR# .REPT 32.4 MOV R2,(R1)+ ; USE A VECTOR OF MOVE INSTRUCTIONS TO .ENDR ; CLEAR MEMORYE! INC R3 ; BUMP THE BLOCK POINTER . SOB R5,114$ ; LOOP FOR ALL BLOCKS IN THE BOX MOV (SP)+,R5 ; RESTORE SIZE( MOV (SP)+,R3 ; AND RESTORE BASE ADDRESS+ BIT #PROPTR,(R4) ; IS THIS THE SECOND PASSO! BNE 116$ ; BR IF YES, WERE DONEP? MOV #PROPTR ! ECC,(R4) ; TOGGLE THE PROTECTION POINTER FOR THE$ ; SECOND PASS; BR 112$ ; AND CLEAR IT AGAIN116$: MOV (SP)+,(R4) ; 00Và^‡^4^eaek›’RESTORE CSR1 MOV (SP)+,R5 ; RESTORE UCB JMP SUC2 ; WERE DONE!T118$:O MOV (SP)+,(R4) ; RESTORE CSR1 MOV (SP)+,R5 ; RESTORE UCBM( MOV #IE.BAD&377,-(SP) ; PARAMETER ERROR JMP ERROR ; 120$:B MOV (SP)+,(R4) ; RESTORE CSR1 MOV (SP)+,R5 ; RESTORE UCBR. MOV #IE.OFL&377,-(SP) ; MEMORY NOT ACCESSABLE JMP ERROR ; .DSABLE LSB;S&; INTERRUPT ENTRY POINT LABEL FOR LOAD-; MEMORY ERRORS ARE SERVICED BY THE EXECUTIVE ;O$MKINT::- RETURN ; THIS IS THE INTERRUPT ENTRY POINTP ; THAT WILL NEVER BE USEDP.PAGE ;T; ;;J&; UTILITY SUBROUTINES AND ENTRY POINTS;(; ;E;R;S; SUBROUTINE ROUND;T?; THIS ROUTINE IS USED TO STEP THRU ALL OF THE PORTS ASSOCIATED 0; WITH THE BOX OF MEMORY CURRENTLY BE ACCESSED. ;; THE CURRENT OFFSET INTO THE KTB IS RETAINED IN THE UCB ATE:; U.KCTR. THIS POSITION IS CLEARED WHEN ALL KRBS HAVE BEEN ; DELT WITH.;O;O ; INPUTS:Y;R=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDH ; OUTPUTS:5; THE CARRY BIT INDICATES IF THE DRIVER IS EXECUTINGP4; ON THE PROPER PROCESSOR. IF THE BIT IS CLEAR THEN3; THE PROPER PROCESSOR HAS CONTROL AND THE ROUTINE -; MAY CONTINUE EXECUTION. IF THE BIT IS SETR7; THEN THE CALLER MUST DISMISS HIMSELF AND RETURN FROME*; THE FORK LEVEL ON THE PROPER PROCESSOR.;T;EROUND: U/ MOV U.SCB(R5),R4 ; GET THE SCB ADDRESS INTO R4L' CALL GTKRB ; GET THE NEXT KRB INTO R3 A MOV R3,S.KRB(R4) ; MOVE THE TABLE ENTRY INTO THE KRB WORD IN THEA ; SCB 3 BEQ 5$ ; IF EQUAL THEN THE ENTRY IN THE KRB TABLE . ; IS THE ZERO WORD AT THE END OF THE TABLE* ; SO WE ARE FINISHED AND MUST CLEAN UP- ; THE COUNTER AND INDICATE SUCCESS TO THEC ; CALLER4 ADD #2,U.KCTR(R5) ; ELSE WE MUST UPDATE THE COUNTER< MOV K.URM(R3),S.URM(R4) ; MOVE THE UNIBUS RUN MASK FOR THIS0 BIT K.URM(R3),$URMST ; IS THE PROCESSOR ONLINE?0 BEQ ROUND ; IF EQUAL THEN IT IS OFFLINE AND WE ; SKIP THIS PORT6 BIT #KS.OFL,K.STS(R3) ; ELSE IS THE CONTROLER ONLINE?5 BEQ 2$ ; IF EQUAL THEN IT IS ONLINE AND WE CONTINUER- TST (SP)+ ; ELSE WE HAVE A BAD SITUATION SOT# ; WE THROW AWAY THE DRIVER CALLD1 MOV #IE.OFL&377,-(SP) ; SET UP THE OFFLINE ERRORE! BR ERROR ; AND REPORT THE ERROR.2$:R( MOV (SP)+,R4 ; SAVE THE CALLER INTO R4 2 CALL $CFORK ; CALL THE CONDITIONAL FORK ROUTINE.2 ; IF WE ARE EXECUTING ON THE CORRECT PROCESSOR+ ; THEN WE WILL RETURN HERE AND CONTINUE / ; IF NOT THEN WE WILL RETURN TO THE CALLERSR/ ; CALLER AFTER WE ARE ENTERED INTO THE FORK 3 ; QUEUE. WHEN WE ARE DEQUEUED WE SHALL CONTINUE  ; FROM HERE.....MAYBEI1 MOV R4,-(SP) ; RESTORE THE CALLER ONTO THE STACK# RETURN ; AND RETURN TO HIM.5$: 4 CLR U.KCTR(R5) ; CLEAR THE COUNTER TO INDICATE THAT* ; WE HAVE COMPLETED THE CIRCUIT OF THE ; PORTS.$ RETURN ; AND RETURN TO THE CALLER;W; SUBROUTINE RESET;C>; THIS ROUTINE RESETS R4 AND R1 AFTER A RETURN FROM FORK LEVELA; USING THE UCB ADDRESS IN R5 TO LINK WITH THE CSR ADDRESS IN THER!; KRB AND THE I/O PACKET ADDRESS. ;U ; INPUTS:E;E=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDR;( ; OUTPUTS:; R1=ADDRESS OF THE I/O PACKETT; R4=ADDRESS OF THE CSR;$;-RESET: MOV U.SCB(R5),R4 ; GET THE SCB ADDRESS 2 MOV S.PKT(R4),R1 ; GET THE PACKET ADDRESS INTO R1/ MOV S.KRB(R4),R4 ; GET THE KRB ADDRESS INTO R4# MOV (R4),R4 ; AND THE CSR INTO R4U RETURN ; RETURN TO CALLER;U;F; ; SUBROUTINE ERROR; =; THIS ROUTINE IS THE COMMON ERROR REPORTING PROCESS FOR THISN=; DRIVER. THE COMMUNICATION WITH THE CALLER IS THRU THE IOSB.F<; AFTER THE ERROR PARAMETERS ARE SET UP IN R0 AND R1 CONTROLB; IS PASSED TO THE ROUTINE 'SNAP' WHICH LOGS THE PRESENT CONDITION9; OF THE PORTS IN THE DEVICE DEPENDENT BUFFER IN THE UCB.T;; THAT ROUTINE CALLS $IODON AND JUMPS TO THE INITIALIZATION ; ENTRY POINT FOR MORE WORK.;V;4 ; INPUTS: ; ; (SP)=ERROR CODE; R4=CSR ADDRESSL;=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDN;R;R ; OUTPUTS:;S;R; R0=ERROR CODE; 9; R1=PORT NUMBER IN HIGH BYTE AND00Vè^‰^U�^DATADATADATADATADATADATADATA BOX NUMBER IN LOW BYTEH;R=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDT;R;I;'ERROR:* MOV (SP)+,R0 ; GET THE ERROR CODE INTO R0' MOV R0,ECOD1 ; SAVE THE CODE FOR IODONU. CMP #IE.IFC&377,R0 ; IS IT A BAD PARAMETER OR ; ILLEGAL FUNCTION?R2 BGE 3$ ; IF EQUAL OR GREATER YES AND WE WILL NOT ; REPORT A URM3 CMP #IE.PRI&377,R0 ; IS IT A PRIVILEDGE VIOLATION?N1 BEQ 3$ ; IF EQUAL THEN YES AND WE RETURN NO URMS6 CALL GTURM ; ELSE WE GET THE CURRENT UNIBUS RUN MASK3 MOV R3,R1 ; AND SET IT UP TO REPORT THRU THE IOSBT3$:BA MOVB U.UNIT(R5),ECOD2 ; GET THE UNIT NUMBER INTO THE LOW BYTE OFP ; R1 FOR THE $IODON CALL. = MOV U.STAD(R5),U.BUF+2(R5) ; GET THE BUFFER STATUS WORD INTOR ; BUFFER ADDRESS= MOV #IE.ABO&377,-(SP) ; PUT THE FUNCTION STATUS ON THE STACKR3 CALL $PTWRD ; PUT IT INTO THE BUFFER STATUS WORDI6 JMP SNAP ; NOW GO TO THE SNAPSHOT ROUTINE TO LOG THE! ; CURRENT STATUS OF THIS BOX.S;C; ;R;;; SUBROUTINE GTONE;T;I>; THIS ROUTINE CONTINUES PROCESSING ON THE PROCESSOR INDICATED;; IN THE USER BUFFER. IF THE PORT REQUESTED IS OUT OF RANGEH8; FOR THIS BOX THEN THE CALLER IS CLEARED FROM THE STACK4; AND THE ERROR IS REPORTED THRU THE ROUTINE 'ERROR'; ; INPUTS:D;S=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDR;C:; THE PORT DESIRED IN THE CURRENT WORD OF THE USER BUFFER;;;WGTONE:4 CALL $GTWRD ; GET THE DESIRED PORT FROM THE BUFFER4 CMP #-1,(SP) ; DID THE CALLER SPECIFY A 'WILD CARD' ; PORT NUMBER? BNE 1$ ; BR IF NOT/ MOV $CPBIT,(SP) ; IF SO SUBSTITUTE THE URM FORT ; THE CURRENT PROCESSORA1$:+ CALL GTPRT ; GT THE KRB OF THE PORT IN R4M& TST R4 ; IS IT THE END OF THE TABLE? BNE 2$ ; IF NOT EQUAL THEN NON4 TST (SP)+ ; ELSE WE HAVE AN ERROR CONDITION AND WE ; MUST THROW AWAY THE CALLERB MOV #IE.BAD&377,-(SP) ; AND INDICATE THAT WE HAVE A BAD PARAMETER BR ERROR ; AND REPORT SAME. 2$:F0 BIT K.URM(R4),$URMST ; IS THE PROCESSOR ONLINE?) BNE 4$ ; IF NOT EQUAL THEN IT IS ONLINEB3$: 5 TST (SP)+ ; ELSE WE HAVE AND ERROR CONDITION AND WER ; MUST THROW AWAY THE CALLER< MOV #IE.OFL&377,-(SP) ; ELSE PUSH ERROR CODE ONTO THE STACK BR ERROR ; REPORT THE ERROR?4$:E, BIT #KS.OFL,K.STS(R4) ; IS THE PORT ONLINE?1 BNE 3$ ; IF NOT EQUAL THEN IT IS OFFLINE AND WER ; HAVE AN ERROR CONDITION./ MOV U.SCB(R5),R3 ; GET THE SCB ADDRESS INTO R3M4 MOV R4,S.KRB(R3) ; PUT THE KRB ADDRESS INTO THE SCB7 MOV K.URM(R4),S.URM(R3) ; PUT THE UNIBUS RUN MASK INTO ; THE SCBS% MOV (SP)+,R4 ; SAVE THE CALLER IN R4A, CALL $CFORK ; GET ON THE CORRECT PROCESSOR" MOV R4,-(SP) ; RESTORE THE CALLER RETURN ; AND CONTINUE; ;O;E;A;; SUBROUTINE GTPRT; ;O<; THIS ROUTINE RETURNS THE KRB ADDRESS THAT IS ON THE UNIBUSC; RUN MASK INDICATED BY THE CURRENT STACK WORD. IF THE MASK IS NOTD&; FOUND THEN A ZERO VALUE IS RETURNED.;R; ; INPUTS:M;R=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDS;M;); (SP)=THE UNIBUS RUN MASKT;; ; OUTPUT;M.; R4=ADDRESS OF THE KRB WITH THE DESIRED MASK; ;E;NGTPRT:' CALL GTKRB ; GET THE NEXT KRB INTO R3H% TST R3 ; IS IT THE END OF THE TABLE+ BEQ 3$ ; IF EQUAL THEN YES AND WE USE THE ( ; ZERO VALUE OF R3 TO INDICATE SAME.0 CMP 2(SP),K.URM(R3) ; IS THIS THE DESIRED PORT?0 BEQ 3$ ; IF EQUAL THEN IT IS AND WE RETURN THE ; VALUE.; ADD #2,U.KCTR(R5) ; ELSE WE BUMP THE OFFSET COUNTER TO THEB ; NEXT ADDRESS BR GTPRT ; AND GO AGAIN3$:P0 MOV R3,R4 ; GET IT INTO THE REPORTING REGISTER5 MOV (SP),2(SP) ; GET THE CALLER INTO THE SECOND SLOT TST (SP)+ ; CLEAN THE STACKN" CLR U.KCTR(R5) ; ZERO THE COUNTER RETURN ; AND GO BACKQ; ;I;Q; ;N; SUBROUTINE GTKRB; ; ?; THIS ROUTINE RETURNS THE ADDRESS OF THE KRB POINTED TO BY THES%; OFFEST COUNTER AT U.KCTR(R5) IN R3. ;N; ; INPUTS:E;N;E=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDU;R; 7; U.KCTR(R5)=OFFSET TO DESIRED KRB IN THE S.KTB TABLE.P;M;RGTKRB:+ MOV U.KCTR(R5),R3 ; GET00Vð^‡^4^eaek›’ THE OFFSET INTO R3,* ADD U.SCB(R5),R3 ; ADD IN THE SCB ADDRESS3 MOV S.KTB(R3),R3 ; GET THE ADDRESS OF THE KRB INTOE ; R3 RETURN ; GO BACK ;B;Q; ;I;Q; ;N; ; SUBROUTINE STATUS;;H=; THIS ROUTINE WILL PUT THE SECOND WORD ON THE STACK INTO THE !; STATUS WORD OF THE USER BUFFER. ;N; ; INPUTS:E=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDA; 2(SP)=ERROR CODE;K;(;=STATUS: > MOV U.BUF+2(R5),-(SP) ; PUT THE CURRENT BUFFER ADDRESS ON THE ; STACKEC MOV U.STAD(R5),U.BUF+2(R5) ; MOVE THE STATUS WORD ADDRESS INTO THEK ; BUFFER SLOT 4 MOV 4(SP),-(SP) ; PUT THE ERROR CODE ONTO THE STACK2 CALL $PTWRD ; PUT THE ERROR CODE INTO THE BUFFER3 MOV (SP)+,U.BUF+2(R5) ; RESTORE THE BUFFER ADDRESS ( MOV (SP)+,(SP) ; AND CLEAN UP THE STACK RETURN ; GO BACK;;N; SUBROUTINE SUC; >; THIS ROUTINE HANDLES A SUCCESSFULL COMPLETION OF A FUNCTION.;E=; SUCCESS IS INDICATED IN THE IOSB AND THE BUFFER STATUS WORDT;F ; INPUTS: ;T=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSED ;D;DSUC:3 MOV #IS.SUC,ECOD1 ; SET UP SUCCESS IN FOR THE IOSBT$ CLR ECOD2 ; ZERO THE 2ND IOSB WORD;D; ; ; SUBROUTINE SNAP ; D; THIS ROUTINE IS USED TO GET A 'SNAPSHOT' OF THE MEMORY CSRS STORED@; IN WORDS U.CSAV TO U.CSAV+2. THESE WORDS ARE USED AFTER A REAL;; POWERFAIL TO RESET THE MEMORY TO IT'S PREVIOUS CONDITION.LA; THIS ROUTINE IS ENTERED FROM BOTH ERROR AND SUCCESS CONDITIONS.E;F; ; INPUTS:T;F5; R0= DATA FOR THE FIRST WORD OF THE I/O STATUS BLOCKC;E6; R1= DATA FOR THE SECOND WORD OF THE I/0 STATUS BLOCK=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDS;O;SNAP:2 CALL SNAP1 ; GET ALL OF THE CSRS COPIED INTO THE ; U.CSAV AREAOSUC2:E5 CLR U.PWRV(R5) ; CLEAR THE POWERFAIL RECOVERY VECTORW MOV ECOD1,R0 ; FIRST IOSB WORDE MOV ECOD2,R1 ; SECOND IOSB WORD% CALL $IODON ; CLEAN UP THE FUNCTION # MOV U.SCB(R5),R0 ; GET SCB ADDRESSO" CLR S.KRB(R0) ; CLEAR KRB ADDRESS- CLR S.URM(R0) ; AND REQUIRED UNIBUS RUN MASK $ JMP MKINI ; GO GET THE NEXT PACKET;D; ; ; ; SUBROUTINE SNAP1;R; ;; THIS ROUTINE IS USED TO GET AN IMAGE OF THE CSRS THAT AREP<; CURRENTLY ONLINE INTO THE IMAGE STORAGE BUFFER THAT STARTS; AT U.CSAV IN THE UCB.R;P;( ; INPUTS: ; ;E=; R5=ADDRESS OF THE UCB OF THE UNIT CURRENTLY BEING ACCESSEDE;2; ; OUTPUT:S;O;&; CSR IMAGES ARE IN THE STORAGE BUFFER;V;S;R;R .ENABLE LSB5$:C) ADD #2,U.KCTR(R5) ; ADVANCE TO NEXT PORTMSNAP1:& CALL GTKRB ; GET A KRB ADDRESS IN R3 BEQ 10$+ BIT K.URM(R3),$URMST ; IS THIS CPU ONLINE?S# BEQ 5$ ; BR IF NOT. TRY NEXT PORTT* MOV U.SCB(R5),R4 ; ENSURE WE HAVE THE SCB MOV R3,S.KRB(R4) ; SET THE SCB : MOV K.URM(R3),S.URM(R4) ; SET THE MASK FOR THE CONTROLLER, MOV (SP)+,R4 ; GET RETURN ADDRESS TO CALLER! CALL $IFORK ; GO TO A PROCESSOR- MOV R4,-(SP) ; SAVE RETURN ADDRESS TO CALLER ( CALL GTKRB ; AND REFRESH THE REGISTERS/ MOV (R3),R3 ; OBTAIN CSR ADDRESS. SINCE "ALL"T$ ; ACCESSABLE REGISTERS HAVE BEEN& ; SET THE SAME BY OUR CALLER, PCIK$ ; ANY KRB TO GET THE CSR ADDRES.? MOV CSR1(R3),U.CSAV(R5) ; SAVE THE MEMORY CONTROLLER REGISTERS 0 MOV CSR2(R3),U.CSAV+2(R5) ; AGAINS A POWER FAIL% CLR U.KCTR(R5) ; CLEAN UP FROM GTKRB 10$: RETURN ;V .DSABLE LSB;U;A;E;T;A; SUBROUTINE GTURM;O7; THIS ROUTINE PUTS THE UNIBUS RUN MASK FOR THE CURRENTC ; PORT INTO THE HIGH BYTE OF R3.;E;G ; INPUTS:V;3; R4=KRB ADDRESSA;E; ; OUTPUT:T; +; R3=UNIBUS RUN MASK FOR PORT IN HIGH BYTE ; ;EGTURM: MOV U.SCB(R5),R4  MOV S.KRB(R4),R4C= MOV K.URM(R4),R3 ; GET THE UNIBUS RUN MASK INTO THE LOW BYTEL, SWAB R3 ; MOVE THE MASK INTO THE HIGH BYTE RETURNO; ;L.PAGER;K;(; MKPWF:MKOUT:MKCAN:1 RETURN ; THESE TWO POINTS SHOULD NEVER BE USED& ; ON THIS DRIVER BUT JUST IN CASE.;P7; THESE ARE THE ENTRY POINTS FOR THE ONLINE AND OFFLINE ; STATUS CHANGES.E;G; .ENABLE LSB;=MKKRB:! BCS 30$ ; BR IF OFFLINE REQUEST=" ; 00Vø^Wû^Xÿ^DATADATADATADATADATADATADATAOFFLINE IS CONSIDERED ALWAYS! ; SUCCESSFUL. *** CAUTION ***R% ; THIS ASSUMPTION IS MADE SO THATR" ; A UNIT CAN GO OFFLINE WHEN A& ; CPU GOES OFFLINE. HRC MUST CHECK& ; TO INSURE THAT OFFL COMMANDS MAY" ; NEVER GET HERE WITH THE BOX  ; MEMORY ON-LINE.W;N; CONTROLLER ONLINE SERVICE ;N& MOV K.OWN(R2),R1 ; PICK UP OWNING UCB BEQ 25$ ; BR IF NONE) MOVB U.UNIT(R1),R1 ; GET BOX UNIT NUMBERE ASL R1 ; CONVERT TO WORD INDEX= CMP #160000,$MKCSR(R1) ; IS THE EXECUTIVE TABLE ENTRY DUMMY?E% BLO 30$ ; NO, SKIP CSR MODIFICATION ' MOV K.CSR(R2),R1 ; PICK UP CSR ADDRESSR& MOV #BAS1,(R1) ; MOVE BOX TO INFINITY. MOV #BAS2,CSR2(R1) ; LOAD ADDRESS AND CONTROL BR 30$ ; RETURN TO EXECUTIVE;E; UNIT ONLINE/OFFLINE SERVICE ;OMKUCB:& BCC 30$ ; NOP IF UNIT ONLINE REQUEST; UNIT OFFLINE SERVICE;U MOV R5,R1 ; COPY UCB ADDRESS BR 15$ ; TO COMMON CODE 10$: MOV K.OWN(R2),R1 ; GET UCBN BEQ 25$ ; BR IF NO UCB15$:( MOVB U.UNIT(R1),R1 ; PICK UP BOX NUMBER! ASL R1 ; CONVERT TO WORD OFFSETR/ CMP #160000,$MKCSR(R1) ; IS BOX ADDRESS DUMMY?D* BHI 30$ ; BR IF YES, OFFLINE MAY PROCEED25$:9 MOVB #IE.ONL,$SCERR ; OTHERWISE MARK STATUS CHANGE ERRORR30$: RETURN ; TO EXEC .DSABLE LSB .ENDCE ;OMKUCB:& BCC 30$ ; NOP IF UNIT ONLINE REQUEST; UNIT OFFLINE SERVICE;U MOV R5,R1 ; COPY UCB ADDRESS BR 15$ ; TO COMMON CODE 10$: MOV K.OWN(R2),R1 ; GET UCBN BEQ 25$ ; BR IF NO UCB15$:( MOVB U.UNIT(R1),R1 ; PICK UP .TITLE NLDRV( .IDENT /04/ ;;E; COPYRIGHT (C) 1976, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.$;IA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDG9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.C;M ; VERSION 03;O; E. L. BAATZ 22-JUL-76 ; ; MODIFIED BY:;.; ERIC BAATZ 20-JAN-794; EB188 -- CONVERT FOR RSX-11M-PLUS (USE DDT$ MACRO);W; ; NULL DEVICE DRIVER.A;;; MACRO LIBRARY CALLSO;A; EQUATED SYMBOLS+; ; LOCAL DATA;T9; NO CONTROLLER IMPURE DATA TABLES (THERE IS NO DEVICE TO ; CAUSE INTERRUPTS)I; ; DRIVER DISPATCH TABLEY;D DDT$ NL,,NONE,,,NEW;+7; NLDRV AND DRQIO IMPLEMENT A DEVICE NL:, WHICH ACTS AS 5; 1) A SINK FOR ALL INFORMATION SEND TO IT (IO.WLB)C?; 2) A SOURCE FOR AN INFINITE NUMBER OF END OF FILES (IO.RLB)B?; 3) A SOURCE FOR AN INFINITE NUMBER OF NULL RECORDS (IO.RLB)U$; IF "IE.EOF" IS CHANGED TO "IS.SUC";-;VE; DRQIO (BECAUSE THE UC.QUE BIT IS SET IN THE UCB) SETS THE REGISTERSA; TO THE FOLLOWING:E;M; R1 = ADDRESS OF I/O PACKET; R4 = ADDRESS OF SCBE; R5 = ADDRESS OF UCBD;A); ONLY TWO FIELDS OF AN I/O PACKET MATTER /; I.FCN+1 = THE I/O FUNCTION CODE. ONLY IO.WLBS ; AND IO.RLB MAKE IT TO NLDRV-; I.PRM+4 = IF I.FCN+1 IS IO.WLB, THIS IS THE .; NUMBER OF BYTES THE CALLER WANTS TO WRITE;)-NLINI: MOV R1,R3 ;POINT AT PACKET FOR $IOFINS, MOV #IS.SUC&377,R0 ;A WRITE ALWAYS SUCCEEDS/ MOV I.PRM+4(R1),R1 ;SAY EVERYTHING WAS WRITTENT. CMPB #IO.WLB/400,I.FCN+1(R3) ;WANTS TO WRITE? BEQ 10$ ;IF EQ YES! MOV #IE.EOF&377,R0 ;IT IS A READO CLR R1 ;READ NO CHARACTERS%10$: CALLR $IOFIN ;FINISH OFF PACKETT TNLCAN:NLOUT:NLPWF:NLKRB:NLUCB: RETURN. .END AND IO.RLB MAKE IT TO NLDRV-; I.PRM+4 = IF I.FCN+1 IS IO.WLB, THIS IS THE .; NUMBER OF BYTES THE CALLER WANTS TO WRITE;)-NLINI: MOV R1,R3 ;POINT AT PACKET FOR $IOFINS, MOV #IS.SUC&377,R0 ;A WRITE ALWAYS SUCCEEDS/ MOV I.PRM+4(R1),R1 ;SAY EVERYTHING WAS WRITTENT. CMPB #IO.WLB/400,I.FCN+1(R3) ;WANTS TO WRIT .TITLE PPDRVN .IDENT /03.01/1 M; ; COPYRIGHT (C) 1975, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.O;$A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDN9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.B;2; VERSION 03.01'; ; THOMAS J. MILLER 25-NOV-74;S; PREVIOUSLY MODIFIED BY:V;K; C. A. D'ELIA; T. J. MILLER;I; MODIFIED BY:;:; K. E. KINNEAR 22-JUN-77E;D&; KK004 -- NEW I/O DATA BASE SUPPORT.;T; E. L. BAATZ 18-JUN-78;N(; E00X_‡^4^eaek›’B148 -- REMOVE EXPLICIT PS REFERENCE;; PC11 PAPER TAPE PUNCH DRIVER;I; MACRO LIBRARY CALLST;,# .MCALL ABODF$,HWDDF$,PKTDF$,TCBDF$S" ABODF$ ;DEFINE TASK ABORT CODES+ HWDDF$ ;DEFINE HARDWARE REGISTER SYMBOLST$ PKTDF$ ;DEFINE I/O PACKET OFFSETS, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS; ; EQUATED SYMBOLS ;V6; PAPER TAPE PUNCH STATUS WORD BIT DEFINITIONS (U.CW2);:9WAIT=100000 ;WAITING FOR DEVICE TO COME ON-LINE (1=YES)S0ABORT=40000 ;ABORT CURRENT I/O REQUEST (1=YES)/TRAIL=200 ;CURRENTLY PUNCHING TRAILER (1=YES)P; ;**-16; DRIVER DISPATCH TABLEA;T ; KK004$ DDT$ PP,P$$P11 ; KK004 ;**-4;+5; **-PPINI-PC11 PAPER TAPE PUNCH CONTROLLER INITIATOR;TJ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUESTN; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THE EXECU-N; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN ATTEMPTI; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER ISNI; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER- >; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.; ; INPUTS:1;A:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;E ; OUTPUTS:;EE; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT-RE; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-T; ATION IS INITIATED. ;- .ENABL LSBN,PPINI: GTPKT$ PP,P$$P11,PPPWF,,T ; KK004 ;**-2;N1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:M;I'; R1=ADDRESS OF THE I/O REQUEST PACKET. -; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.H; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.N:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;D-; PAPER TAPE PUNCH I/O REQUEST PACKET FORMAT:A;R"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTER TASK.,@; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTER TASK HEADER.J; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTER TASK HEADER (UCB).9; WD. 05 -- I/O FUNCTION CODE (IO.WLB, IO.ATT OR IO.DET).E0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.E; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140000). 3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. *; WD. 12 -- RELOCATION BIAS OF I/O BUFFER.+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.D-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED. ; WD. 15 -- NOT USED.-; WD. 16 -- NOT USED. ; WD. 17 -- NOT USED.A; WD. 20 -- NOT USED. ;-* CLR U.CW2(R5) ;CLEAR ALL SWITCHES ;**-1= CMPB I.FCN+1(R1),#IO.WLB/256. ;WRITE LOGICAL BLOCK FUNCTION?- BEQ 10$ ;IF EQ YES, MOV I.TCB(R1),R0 ;GET REQUESTOR TCB ADDRESS+ BIT #T2.ABO,T.ST2(R0) ;TASK BEING ABORTED? * BNE 65$ ;IF NE YES - DON'T PUNCH TRAILER= BIS #TRAIL,U.CW2(R5) ;OTHERWISE FUNCTION IS ATTACH OR DETACH " ; SET FLAG TO PUNCH TRAILER- MOV #170.,U.CNT(R5) ;SET COUNT FOR 170 NULLS 910$: BIS #WAIT,U.CW2(R5) ;ASSUME WAIT FOR DEVICE OFF LINEO! TST @S.CSR(R4) ;DEVICE OFF LINE?- BMI 80$ ;IF MI YES>20$: BIC #WAIT,U.CW2(R5) ;DEVICE ON LINE, CLEAR WAIT CONDITION, MOVB S.ITM(R4),S.CTM(R4) ;SET TIMEOUT COUNT' MOV #100,@S.CSR(R4) ;ENABLE INTERRUPTSD;K; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUSESNK; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDITION 2; THAT COULD EXIST IN RESTARTING THE I/O OPERATION;;PPPWF: RETURN ;L;+6; **-$PPINT-PC11 PAPER TAPE PUNCH CONTROLLER INTERUPTS;-$PPINT:: ;;;REF LABELI5 INTSV$ PP,PR4,P$$P11 ;;;GENERATE INTERRUPT SAVE CODEE8 MOV U.SCB(R5),R4 ;;;GET ADDRESS OF STATUS CONTROL BLOCK0 MOVB S.ITM(R4),S.CTM(R4) ;;;RESET TIMEOUT COUNT8 MOV S.CSR(R4),R4 ;;;POINT R4 TO CONTROL STATUS REGISTER# MOV (R4)+,U.CW3(R5) ;;;SAVE STATUSE BMI 60$ ;;;IF MI, ERRORN. SUB #1,U.CNT(R5) ;;;DECREMENT CHARACTER COUNT BCS 50$ ;;;IF CS, THEN DONET. TSTB U.CW2(R5) ;;00X_Y _ÿ^DATADATADATADATADATADATADATA;CURRENTLY PUNCHING TRAILER? BPL 30$ ;;;IF PL NOC- CLRB (R4) ;;;LOAD NULL INTO OUTPUT REGISTER BR 40$ ;;;BRANCH TO LOAD ITV330$: CALL $GTBYT ;;;GET NEXT BYTE FROM USER BUFFERV2 MOVB (SP)+,(R4) ;;;LOAD BYTE INTO OUTPUT REGISTER'40$: JMP $INTXT ;;;EXIT FROM INTERRUPTO&50$: INC U.CNT(R5) ;;;RESET BYTE COUNT+60$: CLR -(R4) ;;;DISABLE PUNCH INTERRUPTSR% CALL $FORK ;;;CREATE SYSTEM PROCESS " MOV U.SCB(R5),R4 ;POINT R4 TO SCB) MOV S.PKT(R4),R1 ;POINT R1 TO I/O PACKETN3 MOV I.PRM+4(R1),R1 ; AND PICK UP CHARACTER COUNT?3 SUB U.CNT(R5),R1 ;CALCULATE CHARACTERS TRANSFERREDT/ MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFERV TST U.CW3(R5) ;DEVICE ERROR?  BPL 70$ ;IF PL NOV:65$: MOV #IE.VER&377,R0 ;UNRECOVERABLE HARDWARE ERROR CODE*70$: CALL $IODON ;INITIATE I/O COMPLETION( BR PPINI ;BRANCH BACK FOR NEXT REQUEST; G; DEVICE TIMEOUT RESULTS IN A NOT READY MESSAGE BEING PUT OUT 4 TIMES AVI; MINUTE. TIMEOUTS ARE CAUSED BY POWERFAILURE AND PUNCH FAULT CONDITIONS.;V1PPOUT: CLRB @S.CSR(R4) ;;;DISABLE PUNCH INTERRUPTB MTPS #0 ;;;ALLOW INTERRUPTST680$: MOV #IE.DNR&377,R0 ;ASSUME DEVICE NOT READY ERROR3 MOV U.CW2(R5),R1 ;ARE WE WAITING FOR DEVICE READY? * BPL 70$ ;IF PL NO, TERMINATE I/O REQUEST4 MOV #IE.ABO&377,R0 ;ASSUME REQUEST IS TO BE ABORTED ASL R1 ;ABORT REQUEST? BMI 70$ ;IF MI YES TST @S.CSR(R4) ;PUNCH READY?O BPL 20$ ;IF PL YES* MOV #T.NDNR,R0 ;SET FOR NOT READY MESSAGE, MOVB #1,S.CTM(R4) ;SET TIMEOUT FOR 1 SECOND( DECB S.STS(R4) ;TIME TO OUTPUT MESSAGE? BNE PPPWF ;IF NE NOU? MOVB #15.,S.STS(R4) ;SET TO OUTPUT NEXT MESSAGE IN 15. SECONDS3 CALLR $DVMSG ;OUTPUT MESSAGE .DSABL LSBC;)C; CANCEL I/O OPERATION-FORCE I/O TO COMPLETE IF DEVICE IS NOT READYE;O4PPCAN: CMP R1,I.TCB(R0) ;;;REQUEST FOR CURRENT TASK? BNE 10$ ;;;IF NE NO : BIS #ABORT,U.CW2(R5) ;;;SET FOR ABORT IF DEVICE NOT READY10$: RETURN ;;;L .ENDV #T.NDNR,R0 ;SET FOR NOT READY MESSAGE, MOVB #1,S.CTM(R4) ;SET TIMEOUT FOR 1 SECOND( DECB S.STS(R4) ;TIME TO OUTPUT MESSAGE? B .TITLE PRDRVE .IDENT /03.01/S S;); COPYRIGHT (C) 1975, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;SA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDI9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.F;C; VERSION 03.01E;$; THOMAS J. MILLER 2-DEC-74.;(; PREVIOUSLY MODIFIED BY:I;N; C. A. D'ELIA;R; MODIFIED BY:;#; K. E. KINNEAR 22-JUN-77Y;S&; KK004 -- NEW I/O DATA BASE SUPPORT.; ; E. L. BAATZ 18-JUN-78T; (; EB148 -- REMOVE EXPLICIT PS REFERENCE;N$; PC11/PR11 PAPER TAPE READER DRIVER; ; MACRO LIBRARY CALLSN;O .MCALL ABODF$,HWDDF$,PKTDF$" ABODF$ ;DEFINE TASK ABORT CODES+ HWDDF$ ;DEFINE HARDWARE REGISTER SYMBOLSN$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;F; EQUATED SYMBOLS0;7; PAPER TAPE READER STATUS WORD BIT DEFINITIONS (U.CW2)E;Y)TRAIL=100000 ;CURRENTLY READING TRAILER#; ;**-16; DRIVER DISPATCH TABLE ;  ; KK004. DDT$ PR,P$$R11 ; KK004 ;**-4;+;; **-PRINI-PC11/PR11 PAPER TAPE READER CONTROLLER INITIATOR ;VJ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUESTN; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THE EXECU-N; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN ATTEMPTI; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER ISDI; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER- >; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.;I ; INPUTS:1;P:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;E ; OUTPUTS:;EE; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT-RE; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-T; ATION IS INITIATED. ;- .ENABL LSBN,PRINI: GTPKT$ PR,P$$R11,PRPWF,,T ; KK004 ;**-2;N1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:M;I'; R1=ADDRESS OF THE I/O REQUEST PACKET. -; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.H; R3=CONTR00Y_‡^4^eaek›’OLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.N:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;D.; PAPER TAPE READER I/O REQUEST PACKET FORMAT:;R"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTER TASK.,@; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTER TASK HEADER.J; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTER TASK HEADER (UCB).9; WD. 05 -- I/O FUNCTION CODE (IO.RLB, IO.ATT OR IO.DET).E0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.E; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140000). 3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. *; WD. 12 -- RELOCATION BIAS OF I/O BUFFER.+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.D-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED. ; WD. 15 -- NOT USED.-; WD. 16 -- NOT USED. ; WD. 17 -- NOT USED.A; WD. 20 -- NOT USED. ;-5 MOVB I.FCN+1(R1),R2 ;MOVE FUNCTION CODE TO R2 ;**-163 CMPB R2,#IO.RLB/256. ;READ LOGICAL BLOCK FUNCTION?  BEQ 10$ ;IF EQ YES3 MOV #IS.SUC&377,R0 ;OTHER FUNCTIONS ALWAYS SUCCEED(2 CLR R1 ;RETURN 0 IN SECOND WORD OF STATUS BUFFER' CMPB R2,#IO.ATT/256. ;ATTACH FUNCTION? BNE 50$ ;IF NE NO, CALL $IODON9 BIS #TRAIL,U.CW2(R5) ;SET FLAG TO READ TRAILER IF ATTACH- BR 60$ ;CALL $IODON 010$: MOVB S.ITM(R4),S.CTM(R4) ;SET TIMEOUT COUNT2 TST @S.CSR(R4) ;ERROR BIT SET IN STATUS REGISTER? BPL 15$ ;IF PL NO, INITIATE IO< TST U.CW2(R5) ;IS THIS THE FIRST READ FOR ATTACHED PROCESS?2 BMI 70$ ;IF MI YES, RETURN DEVICE NOT READY CODE0 ; (OTHERWISE HANDLE AS EOF UPON INTERRUPT)715$: MOV #101,@S.CSR(R4) ;ENABLE READER WITH INTERRUPTSP;#+; IN-PROGRESS TRANSFERS ARE NOT TERMINATED. ;NPRCAN:;K; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUSESOK; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDITIONR2; THAT COULD EXIST IN RESTARTING THE I/O OPERATION;IPRPWF: RETURN ;);+<; **-$PRINT-PC11/PR11 PAPER TAPE READER CONTROLLER INTERUPTS;-$PRINT:: ;;;REF LABEL5 INTSV$ PR,PR4,P$$R11 ;;;GENERATE INTERRUPT SAVE CODEM8 MOV U.SCB(R5),R4 ;;;GET ADDRESS OF STATUS CONTROL BLOCK0 MOVB S.ITM(R4),S.CTM(R4) ;;;RESET TIMEOUT COUNT8 MOV S.CSR(R4),R4 ;;;POINT R4 TO CONTROL STATUS REGISTER# MOV (R4)+,U.CW3(R5) ;;;SAVE STATUS  BMI 40$ ;;;IF MI, ERRORD" TST U.CW2(R5) ;;;READING TRAILER? BPL 20$ ;;;IF PL NOD# TSTB (R4) ;;;IS BYTE READ A NULL?N BEQ 30$ ;;;IF EQ YES+ CLR U.CW2(R5) ;;;NO LONGER READING TRAILERA&20$: MOVB (R4),-(SP) ;;;PUSH BYTE READ( CALL $PTBYT ;;;PLACE IT IN USER BUFFER& DEC U.CNT(R5) ;;;DECREMENT BYTE COUNT BEQ 40$ ;;;IF EQ READ COMPLETE 30$: INC -(R4) ;;;ENABLE READER# JMP $INTXT ;;;EXIT FROM INTERRUPTS%40$: CLR -(R4) ;;;DISABLE INTERRUPTSE% CALL $FORK ;;;CREATE SYSTEM PROCESSA" MOV U.SCB(R5),R4 ;POINT R4 TO SCB) MOV S.PKT(R4),R1 ;POINT R1 TO I/O PACKET 3 MOV I.PRM+4(R1),R1 ; AND PICK UP CHARACTER COUNTB3 SUB U.CNT(R5),R1 ;CALCULATE CHARACTERS TRANSFERREDD/ MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFERE TST U.CW3(R5) ;DEVICE ERROR?N BPL 50$ ;IF PL NOC, MOV #IE.EOF&377,R0 ;RETURN END OF FILE CODE#50$: CLR U.CW2(R5) ;CLEAR FLAG WORD;*60$: CALL $IODON ;INITIATE I/O COMPLETION( BR PRINI ;BRANCH BACK FOR NEXT REQUEST;UH; DEVICE TIMEOUT RESULTS IN THE RETURN OF A DEVICE NOT READY ERROR CODE.;S2PROUT: CLR @S.CSR(R4) ;;;DISABLE READER INTERRUPTS MTPS #0 ;;;ALLOW INTERRUPTSH.70$: MOV #IE.DNR&377,R0 ;DEVICE NOT READY CODE BR 50$ ;CALL $IODONM .DSABL LSB7 .ENDME SUCCESSFUL TRANSFERE TST U.CW3(R5) ;DEVICE ERROR?N BPL 50$ ;IF PL NOC, MOV #IE.EOF&377,R0 ;RETURN END OF FILE CODE#50$: CLR U.CW2(R5) ;CLEAR FLAG WORD;*60$: CALL $IODON ;INITIATE I/O COMPLETION( BR PRINI ;BRANCH BACK FOR NEXT REQUEST;UH; DEVICE TIMEOUT RESULTS IN THE RETURN OF A DEVICE NOT READY ERROR CODE.;S2PROUT: CLR @S.CSR(R4) ;;;DISABLE READER INTERRUPTS MTPS #0 ;;;ALLOW INTERRUPTSH.70$: MOV #IE.DNR&377,R0 ;DEVICE NOT RE00Ï_ _ÿ^DATADATADATADATADATADATADATANFORMATION2 MOV (SP)+,R2 ;GET ADDRESS OF FIRST CHANNEL NUMBER BNE 20$ ;IF NE GO GET IT) MOV #.ZEROW,R2 ;DEFAULT--POINT AT A ZERO)20$: MOV (R2),R2 ;GET THE CHANNEL NUMBER(! BMI 200$ ;IF MI SURELY AN ERROR$, BIT #S$WDIF,S.WFL2(R4) ;DIFFERENTIAL INPUT? BEQ 40$ ;IF EQ NO1' BIC #1,R2 ;YES--FORCE AN EVEN CHANNEL-40$: CMP R2,S.WMXC(R4) ;LEGAL CHANNEL NUMBER?S BHI 200$ ;IF HI NO$ MOV (SP)+,R1 ;GET ADDRESS OF 'NCHN' BNE 60$ ;IF NE GO GET IT) MOV #.ZEROW,R1 ;DEFAULT--POINT AT A ZEROC60$: MOV (R1),R1 ;GET 'NCHN'R! BMI 200$ ;IF MI CANNOT BE LEGALB BNE 80$ ;IF NE OKG INC R1 ;ELSE SET TO 1 CHANNELT'80$: MOV R1,-(SP) ;SAVE 'NCHN' ON STACKT& MOV R1,-(SP) ;MAKE A DESTROYABLE COPY! MOV R2,R1 ;SET STARTING CHANNELL)90$: ADD S.WCHI(R4),R1 ;INCREMENT CHANNELQ1 DEC (SP) ;THE FULL NUMBER OF CHANNEL INCREMENTS: BGT 90$ ;...$ TST (SP)+ ;KEEP THE STACK STRAIGHT0 DEC R1 ;DON'T CHECK ONE AFTER THE LAST CHANNEL' CMP R1,S.WMXC(R4) ;LAST CHANNEL LEGAL?R BHI 200$ ;IF HI NO--ERROR6 MOV R1,S.WHCH(R4) ;SET HIGHEST CHANNEL WE WILL ACCESS' MOV R2,S.WICH(R4) ;SET INITIAL CHANNEL ' MOV R2,S.WCCH(R4) ;AND CURRENT CHANNELP2 MOV (SP),S.WNCH(R4) ;AND NUMBER OF CHANNELS TO DO7 MOV (SP)+,S.WCHX(R4) ;SET THE SAVED NUMBER OF CHANNELSD3 MOV R3,-(SP) ;PUT RETURN ADDRESS BACK ON THE STACKU .IF GT N$AD11-12 CALL .ADXCH ;GO SETUP THE UCB POINTER IN THE SWB .ENDC ;N$AD11-1 CLR S.WGNW(R4) ;CLEAR GAIN WORD .IFT ;A$$M11.* BIT #7,S.WFLG(R4) ;WAS ANY GAIN SELECTED?3 BEQ .STCHB ;IF EQ NO--SET CHANNEL BYTE AND RETURNE& MOV S.WFLG(R4),R3 ;YES--GET FLAG WORD" BIC #^C<7>,R3 ;CLEAR ALL BUT GAIN% CMP R3,#5 ;IS IT PROGRAMMABLE GAIN?N. BEQ .STCHB ;IF EQ YES--WILL SAMPLE AT GAIN 1# BHI .STCHB ;IF HI NOT A REAL GAINC DEC R3 ;MAKE 2-4 IN RANGE 1-3R% BEQ .STCHB ;IF GAIN 1 SKIP THE REST % MOVB R3,S.WGNW(R4) ;STORE GAIN VALUE 7 MOVB GAINTB-1(R3),S.WGNW+1(R4) ;STORE GAIN BITS IN SWB( .ENDC ;A$$M11( BR .STCHB ;SET CHANNEL BYTE AND RETURN;N; ERROR--RESET STACK;T200$: MOV R5,SP ;RESET STACKE SEC!240$: JMP (R3) ;RETURN TO CALLERT; 1; SETADC WAS CALLED...JUST CLEAR STACK AND RETURN5;I9300$: CMP (SP)+,(SP)+ ;POP OFF ADDRESSES OF ICHN AND NCHNP CLC ;FLAG SUCCESS JMP (R3) ;RETURN TO CALLER C- .SBTTL .STCHB COMPUTE CHANNEL BYTE FOR SWEEPG;+$; .STCHB -- SET S.WCHB FOR A/D SWEEP;EB; THIS ROUTINE COMPUTES THE INITIAL CHANNEL BYTE FOR THE A/D SWEEP; ; INPUTS:$;1; SWEEP CONTROL BLOCK SET UP; ; OUTPUTS:;N; S.WCHB AND S.WCBX SET UP;$;-6.STCHB::MOV S.WAUA(R4),R3 ;GET ACTIVE UNIT UCB ADDRESS ADD R4,R3 ;POINT TO THE UCBE' MOV S.WICH(R4),R2 ;GET INITIAL CHANNEL$ .IF DF A$$M110 BIT #S$WACA,S.WFL2(R4) ;ABS CHANNEL ADDRESSING? BEQ 100$ ;IF EQ NO .IFTF ;A$$M11;B; ABS CHANNEL ADDRESSING;T-40$: MOV R4,-(SP) ;SET SWB ADDRESS ONTO STACKA% ADD #S.WUCB,(SP) ;POINT TO FIRST UCBH%45$: CMP R3,(SP) ;BACK TO FIRST UCB?P BHI 50$ ;IF HI NO% TST (SP)+ ;YES--KEEP STACK STRIAGHTP BR 120$ ;FINISH UP$50$: SUB #U.LGTH,R3 ;NO--BACK UP ONE+ MOV #16.,-(SP) ;ASSUME NO AM11 ON THIS A/DA BIT #UF$AMK,U.FLG(R3) ;CORRECT? BEQ 60$ ;IF EQ YES$ MOV #64.,(SP) ;NO--MAKE 64 CHANNELS"60$: SUB (SP)+,R2 ;BACK UP CHANNEL BR 45$ ;GO ON1 .IFT ;A$$M11&100$: BIC #^C<17>,R2 ;CLEAR EXTRA BITS .ENDC ;A$$M11)120$: BISB S.WGNW+1(R4),R2 ;SET GAIN BITS#% MOVB R2,S.WCHB(R4) ;SET CHANNEL BYTEC* MOVB R2,S.WCBX(R4) ;AND SAVE CHANNEL BYTE) CLC ;FLAG SUCCESS (RETURN FROM .ADGCH)R RETURNB 2) .SBTTL .ADCMC COMPUTE NUMBER OF CHANNELSC;+>; .ADCMC -- COMPUTE NUMBER OF CHANNELS INFORMATION FOR A SWEEP;G@; THIS ROUTINE WILL SET UP THE SWB FOR THE AD11 WITH THE CORRECT<; CHANNEL INFORMATION DEPENDING ON WHETHER ABSOLUTE CHANNEL D; ADDRESSING IS IN EFFECT. IT WILL ALSO SET THE CORRECT MAX CHANNEL+; INFORMATION INTO THE SWEEP CONTROL BLOCK.A;B ; INPUTS: ;S$; R4 POINTS TO A SWEEP CONTROL BLOCK;W ; OUTPUTS:;V.; THE SWB AND UNIT CONTROL BLOCKS ARE MODIFIED;A;-.ADCMC: MOV R3,-(SP) ;SAVE R3C MOV R4,R3 ;GET00Ï _[#_4^eaek›’ SWB POINTER# ADD #S.WUCB,R3 ;POINT TO FIRST UCBN( MOV #-1,R2 ;INIT CHANNEL COUNTER TO -1 .IF GT N$AD11-10 MOV S.WUNT(R4),-(SP) ;SET # OF UNITS ONTO STACK .IFTF ;N$AD11-1;H; BACK HERE FOR EACH UNITR;I%20$: MOV #16.,R1 ;ASSUME 16 CHANNELSC .IF DF A$$M11/ BIT #UF$AMK,U.FLG(R3) ;THIS AD11 HAVE AN AM11? BEQ 40$ ;IF EQ NOP> BIT #S$WACA,S.WFL2(R4) ;YES--ARE WE DOING ABSOLUTE CHAN ADDR?+ BEQ 40$ ;IF EQ NO--16 CHAN EVEN WITH AM11+ MOV #64.,R1 ;YES--INCREASE TO 64 CHANNELSG .ENDC ;A$$M1140$: ADD R1,R2 ;UP THE COUNTER/ MOV R2,U.MAXC(R3) ;SET MAX CHANNEL WORD IN UCBG .IFT ;N$AD11-1S! ADD #U.LGTH,R3 ;MOVE TO NEXT UCBS DEC (SP) ;SEE IF MORE TO DO BGT 20$ ;IF GT YES--GO DO IT( INC (SP)+ ;CLEAR UNIT COUNT FROM STACK .ENDC ;N$AD11-1< MOV R2,S.WMXC(R4) ;SET MAX CHANNEL # IN SWEEP CONTROL BLOCK MOV (SP)+,R3 ;RESTORE R34 RETURNR E* .SBTTL .ADNXC ADVANCE TO NEXT A/D CHANNEL;+-; .ADNXC -- INCREMENT TO THE NEXT A/D CHANNELR;E7; THIS ROUTINE ADVANCES .ADSWB TO THE NEXT A/D CHANNEL. ; ; INPUTS:M;R; R4 POINTS TO SWB; .ADSWB SETUP;C ; OUTPUTS:;A2; R3 SETUP TO THE UCB OF THE CORRECT A/D CONVERTOR(; .ADSWB INCREMENTED TO THE NEXT CHANNEL;S;- .PSECT .KSCT1;.ADNXC::DEC S.WNCH(R4) ;;;DECR THE NUMBER OF CHANNELS TO DO.& BLE 60$ ;;;IF LE WE HAVE DONE ENOUGH2 ADD S.WCHI(R4),S.WCCH(R4) ;;;MOVE TO NEXT CHANNEL9 ADD S.WCHI(R4),S.WCHB(R4) ;;;INCREMENT CHANNEL BYTE ALSOC .IF GT N$AD11-1, MOV S.WAUA(R4),R3 ;;;GET ACTIVE UCB .TITLE UTSUB1 .IDENT /02/;C; COPYRIGHT (C) 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDT9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.1; ; VERSION 02;E; T. J. MILLER 23-OCT-77;XB; THIS MODULE CONTAINS ROUTINES WHICH MAY BE CALLED AT TASK STATE.;E; MODIFIED BY:;.; J. E. PROVINO 22-JUN-79;; JP130 -- FIX CONDITIONALS. ;U; J. E. PROVINO 16-JUL-79A;F2; JP135 -- USE EIS INSTRUCTIONS IN $MUL AND $DIV.;;+,; **-$MUL-INTEGER MULTIPLY MAGNITUDE NUMBERS;P ; INPUTS:Y;D; R0=MULTIPLIER.; R1=MULTIPLICAND.;D ; OUTPUTS:;E); DOUBLE WORD RESULT IS RETURNED WITH THER); HIGH PART IN R0 AND THE LOW PART IN R1.;E9; REGISTERS R2, R3, R4, AND R5 ARE PRESERVED ACROSS CALL.O;-$$MUL:: TST R0 ;NEGATIVE MULTIPLIER? BMI 5$ ;IF MI YESD TST R1 ;NEGATIVE MULTIPLICAND? BMI 5$ ;IF MI YESI MUL R1,R0 ;MULTIPLY R1 BY R0 RETURN ;7"5$: MOV R0,-(SP) ;SAVE R0 FOR ADDS MOV #21,-(SP) ;SET REPEAT COUNT CLR R0 ;CLEAR HIGH PARTM 10$: ROR R0 ;DOUBLE RIGHT SHIFT ROR R1 ; BCC 20$ ;IF CC DO NOT ADD ADD 2(SP),R0 ;E&20$: DEC (SP) ;DECREMENT REPEAT COUNT BGT 10$ ;IF GT MORE TO GOH CMP (SP)+,(SP)+ ;CLEAN STACKT RETURN ;4;+*; **-$DIV-INTEGER DIVIDE MAGNITUDE NUMBERS;T ; INPUTS:I;M; R0=DIVIDEND.; R1=POSITIVE DIVISOR.;; ; OUTPUTS:;L1; QUOTIENT IS RETURNED IN R0 AND REMAINDER IN R1. ;B9; REGISTERS R2, R3, R4, AND R5 ARE PRESERVED ACROSS CALL.V;-;$DIV:: MOV R2,-(SP) ;SAVE R2 FOR INTERFACE TO DOUBLE DIVIDER$ MOV R1,R2 ;COPY DIVISOR FOR $DBDIV$ BMI 20$ ;IF MI DIVISOR IS NEGATIVE BEQ 30$ ;IF EQ DIVISOR IS ZERO) MOV R0,R1 ;SET UP DIVIDEND IN R0 AND R1 CLR R0 ; DIV R2,R0 ;DIVIDE R0,R1 BY R210$: MOV (SP)+,R2 ;RESTORE R2M RETURN ;E-20$: CLR R1 ;ZERO HIGH-ORDER WORD FOR $DBDIVS+ CALL $DBDIV ;PERFORM THE DIVIDE OPERATIONT BR 10$ ;$30$: MOV R0,R1 ;MOVE DIVIDEND TO R1 MOV #177777,R0 ;QUOTIENTA BR 10$ ;;+7; **-$DBDIV-DOUBLE-PRECISION DIVIDE MAGNITITUDE NUMBERSE; ; INPUTS:D; ; R0=LOW-ORDER PART OF DIVIDEND.!; R1=HIGH-ORDER PART OF DIVIDEND.A; R2=POSITIVE DIVISOR.;S ; OUTPUTS:;V ; R0=LOW-ORDER PART OF QUOTIENT.; R1=REMAINDER.'; R2=UNDEFINED FOR POSSIBLE FUTURE USE.V; R3-R5 ARE PRESERVED.;T<; NOTE: IT IS THE CALLER'S RESPONSIBILITY TO INSURE THAT THE5; DIVISION OF THE INPUT OPERANDS YIELDS NO MORE THAN0; 16 BITS IN THE QUOTIENT.T;-&$DBDIV::MOV #16.,-(SP) ;SET LOOP COU00[(_\._ÿ^DATADATADATADATADATADATADATANT30$: ASL R0 ;DOUBLE LEFT SHIFTN ROL R1 ;" CMP R1,R2 ;SUBTRACT OUT DIVISOR? BLO 40$ ;IF LO NO ! SUB R2,R1 ;SUBTRACT OUT DIVISORO INC R0 ;ADD IN LOW BIT$40$: DEC (SP) ;DECREMENT LOOP COUNT BGT 30$ ;IF GT MORE TO GO  TST (SP)+ ;CLEAN STACK RETURN ;I;+!; **-$CAT5-CONVERT ASCII TO RAD50; ; INPUTS:I;H/; R0=ADDRESS OF NEXT CHARACTER IN INPUT BUFFER.D; R1=PERIOD DISPOSITION FLAG.I+; IF R1 EQ 0, THEN PERIOD IS A TERMINATOR.T0; IF R1 NE 0, THEN PERIOD IS A RAD50 CHARACTER.;: ; OUTPUTS:;E6; C=1 IF SCAN WAS TERMINATED BY A NON-RAD50 CHARACTER./; C=0 IF THREE RAD50 CHARACTERS WERE CONVERTED. 9; NOTE: IF EITHER CASE THE FOLLOWING VALUES ARE RETURNED.R0; R0=ADDRESS OF NEXT CHARACTER IN INPUT BUFFER.; R1=PACKED RAD50 CHARACTERS.; R2=TERMINAL CHARACTER.E; R3 IS PRESERVED.;- S .IF DF R$$DSP S+$CAT5:: SAVNR ;SAVE NONVOLITILE REGISTERSR MOV R3,-(SP) ;SAVE R3 AS WELL+ MOV R1,-(SP) ;SAVE PERIOD DISPOSITION FLAG1 CLR R1 ;CLEAR ACCUMULATION/ MOV #CVTBL,R3 ;GET ADDRESS OF CONVERSION TABLE &10$: MOVB (R0)+,R5 ;GET NEXT CHARACTER- MOV #CNTRL,R4 ;GET ADDRESS OF CONTROL STRING CMPB (R4)+,R5 ;RAD50 CHARACTER? BLO 60$ ;IF LO NOD CMPB (R4)+,R5 ;ALPHABETIC?R BLOS 50$ ;IF LOS YES CMPB (R4)+,R5 ;RAD50 CHARACTER? BLO 60$ ;IF LO NOR CMPB (R4)+,R5 ;NUMERIC? BLOS 40$ ;IF LOS YES CMPB (R4)+,R5 ;"$"? BEQ 30$ ;IF EQ YES CMPB (R4)+,R5 ;"SPACE"? BEQ 60$ ;IF EQ YES# TST (SP) ;PERIOD RAD50 CHARACTER? BEQ 60$ ;IF EQ NOU CMPB (R4)+,R5 ;"."? BEQ 40$ ;IF EQ YES BR 60$ ;20$: SUB #' -11,R5 ;SPACEE30$: SUB #11-22,R5 ;"$",!40$: SUB #22-100,R5 ;PERIOD/DIGIT50$: SUB #100,R5 ;ALPHABETIC?% MOV R0,-(SP) ;SAVE NEXT BYTE ADDRESS;& MOV (R3)+,R0 ;GET CONVERSION CONSTANT MOV R1,-(SP) ;SAVE ACCUMULATION MOV R5,R1 ;SET MULTIPLIER)" CALL $MUL ;SCALE RAD50 CHARACTER MOV R1,R5 ;RESULT TO R5B- MOV (SP)+,R1 ;RETRIEVE PREVIOUS ACCUMULATIONB) MOV (SP)+,R0 ;RETRIEVE NEXT BYTE ADDRESS0 ADD R5,R1 ;ACCUMULATE RESULT& CMP R3,#CVTBL+6 ;CONVERTED THREE YET? BLO 10$ ;IF LO NO0$ TST (SP)+ ;CLEAN STACK-CLEAR CARRY BR 70$ ;*60$: COM (SP)+ ;CLEAN STACK AND SET CARRY+70$: MOVB -1(R0),R2 ;GET TERMINAL CHARACTER  MOV (SP)+,R3 ;RESTORE R33 RETURN ;N6CNTRL: .BYTE 'Z,'A,'9,'0,'$,' ,'. ;CONTROL BYTE STRING .EVEN.CVTBL: .WORD 50*50 ;RAD50 PACK MULTIPLICATION .WORD 50 ; .WORD 1 ;R .ENDC + ;+&; **-$SAVNR-SAVE NONVOLATILE REGISTERS; >; THIS ROUTINE IS A CO-ROUTINE THAT SAVES REGISTERS R4 AND R5.;-$SAVNR::MOV R4,-(SP) ;SAVE R4! MOV R5,-(SP) ;SET RETURN ADDRESSC MOV 4(SP),R5 ;RESTORE R5  CALL @(SP)+ ;CALL THE CALLER MOV (SP)+,R4 ;RESTORE R4V MOV (SP)+,R5 ;RESTORE R5H$ RETURN ;RETURN TO ORIGINAL CALLER;+&; **-$UTEND-END OF UTILITY SUBROUTINES; G; THIS ADDRESS IS THE LAST ADDRESS IN THE KERNEL DATA SPACE EXEC OR THEI<; MULTIPROCESSING EXEC WHICH A PRIVILEGED TASK NEEDS TO MAP.;-;- N $UTEND:: ; S .END THIS ROUTINE IS A CO-ROUTINE THAT SAVES REGISTERS R4 AND R5.;-$S .TITLE XWDRV .IDENT /02/ ;; COPYRIGHT (C) 1976, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 02;; SCOTT G. DAVIS 21-JUL-76;; DUE ALMOST ENTIRELY TO XUDRV;; MODIFIED BY:;; R. E. CALDWELL 26-JUL-79;3; RC003 -- REMOVE UNNEEDED CONDITIONALS FOR M-PLUS#; AND USE DDT$ AND GTPKT$ MACROS.;); DUP11 SYNCHRONOUS COMMUNICATIONS DRIVER;D; MACRO LIBRARY CALLSY;H .MCALL PKTDF$,HWDDF$A$ PKTDF$ ;DEFINE I/O PACKET OFFSETS$ HWDDF$ ;DEFINE HARDWARE REGISTERS .MCALL UCBDF$,CUCDF$O UCBDF$ ; DEFINE UCB OFFSETS$ CUCDF$ ;COMMUNICATIONS UCB LABELS;; EQUATED SYMBOLS ;T;D; RXCSR BIT ASSIGNMENTS ;O!DTSTCH= 100000 ;DATA SET CHANGEB"RING= 40000 ;RING LINE ASSERTEDCTS= 20000 ;CLEAR TO SENDCRRIER= 10000 ;CARRIER STATEN!RECACT= 4000 ;RECEIVER ACTIVEDSRDY= 1000 ;DATA 00\0_#_4^eaek›’SET READYSSTRSYN= 400 ;STRIP SYNCRXDONE= 200 ;RECEIVER DONEF+RCVENB= 100 ;RECEIVER INTERRUPT ENABLED2DSINTE= 40 ;DATA SET CHANGE INTERRUPT ENABLE&SCHSYN= 20 ;SEARCH SYNC MODE BITRTS= 4 ;REQUEST TO SEND%TRMRDY= 2 ;DATA TERMINAL READYD;X; RXDBUF BIT ASSIGNMENTS;T(RXERR= 100000 ;RECEIVER ERROR "OR" BIT/OVRNER= 40000 ;RECEIVER OVERRUN ERROR IF SET ;; PARCSR INITIALIZATION VALUES;E(DECMOD= 100000 ;SET DDCMP/BISYNCH MODE&CRCINH=1000 ;INHIBIT CRC CALCULATION4INITMD=DECMOD!CRCINH ;PARAMETER INITIALIZATION BITS;1'TSOM=400 ;TRANSFER - START OF MESSAGE ; ;A; TXCSR BIT ASSIGNMENTSN;E5DNAINT= 100000 ;SET ON DATA NOT AVAILABLE INTERRUPTR%MSTRST= 400 ;MASTER DEVICE RESETT&TXDONE= 200 ;TRANSMITTER DONE BIT2TXINTE= 100 ;TRANSMITTER INTERRUPT ENABLE BIT4DNAEN= 40 ;ENABLE DATA NOT AVAILABLE INTERRUPT+SEND= 20 ;TRANSMITTER ENABLE (GO) BITE"HDPX= 10 ;HALF DUPLEX IF SET;I; DRIVER DISPATCH TABLEL;A DDT$ XW,D$$W11,P .PAGE;+G;**- XWINI - DUP-11 SYNCHRONOUS COMMUNICATION CONTROLLER I/O INITIATOR ;S?; XWINI IS ENTERED WHEN AN I/O REQUEST IS QUEUED ON THE DEVICE,A4; AND AT THE END OF EACH QIO REQUEST WHICH OBEYS THE;; NORMAL RSX-11M INPUT/OUTPUT LOGIC FLOW. IF THE DEVICE ISR8; AVAILABLE AND A REQUEST IS IN THE QUEUE FOR THAT UNIT,; THE REQUEST IS INITIATED.E0; IF NO REQUEST EXISTS FOR THAT UNIT OR IF IT IS>; BUSY, AN EXIT IS TAKEN TO THE CALLER. NOTE THAT BECAUSE OF=; THE NATURE OF THE DUP-11, EACH UNIT IS A CONTROLLER ITSELF, /; HAS ITS OWN SCB, AND THEREFORE ITS OWN QUEUE. 9; EACH TIME XWINI IS CALLED, IT IS CALLED TO SERVICE ONLYU!; THE UNIT SPECIFIED IN THE CALL.E;O ; INPUTS:R;E#; R4 = STATUS CONTROL BLOCK ADDRESSI*; R5 = ADDRESS OF THE UCB TO BE INITIATED.;V ; OUTPUTS:;E,; IF A REQUEST IS SUCCESSFULLY DEQUEUED, THE$; DEVICE IS INITIATED APPROPRIATELY.;- R .ENABL LSB  I9XWINI: TSTB U.CW2(R5) ;UNSOLICITED (HDPX) RECEIVE ACTIVE?A BPL 10$ ;IF NOT, PROCEED% JMP 180$ ;ACTIVATE NO NEW OPERATIONF710$: GTPKT$ XW,D$$W11,,,T ;GET AN I/O PACKET TO PROCESSH;M1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT: ; ); R1 = ADDRESS OF THE I/O REQUEST PACKET.R/; R2 = PHYSICAL UNIT NUMBER OF THE REQUEST UCB.=; R3 = CONTROLLER INDEX +; R4 = ADDRESS OF THE STATUS CONTROL BLOCK.T*; R5 = ADDRESS OF THE UCB SPECIFIED IN THE; XWINI CALL. .;-!; DUP11 I/O REQUEST PACKET FORMATT; ; WORD CONTENTD;D; 0 I/O QUEUE THREAD WORD$); 1 REQUEST PRIORITY, EVENT FLAG NUMBER .; 2 ADDRESS OF THE TCB OF THE REQUESTER TASK/; 3 POINTER TO SECOND LUN WORD IN TASK HEADERR&; 4 CONTENTS OF FIRST LUN WORD (UCB); 5 I/O FUNCTION CODEE); 6 VIRTUAL ADDRESS OF I/O STATUS BLOCK ); 7 RELOCATION BIAS OF I/O STATUS BLOCKE=; 10 I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT +140000)S,; 11 VIRTUAL ADDRESS OF AST SERVICE ROUTINE#; 12 RELOCATION BIAS OF I/O BUFFERT!; 13 BUFFER ADDRESS FOR TRANSFER"; 14 TOTAL BYTE COUNT TO TRANSFER5; 15 BYTE COUNT FOR SECOND PART OF TRANSMISSION OR 0 ; 16 NOT USED; 17 NOT USED; 20 NOT USED;S/20$: MOV S.CSR(R4),R2 ;GET RECEIVER CSR ADDRESSI, ADD #I.FCN+1,R1 ;POINT TO I/O FUNCTION CODE3 CMPB #IO.INL/256.,(R1) ;CHECK IF TRANSFER FUNCTIONO& BLOS 70$ ;BRANCH ON CONTROL FUNCTION8 BIT #U2.ONL,U.CW2(R5) ;IS DEVICE ON LINE (INITIALIZED?) BEQ 90$ ;CAN'T TRANSFER IF NOT$ BIT #DSRDY,(R2) ;IS DATA SET READY?! BEQ 90$ ;IF NOT, CAN'T TRANSFERR& CMPB #IO.RLB/256.,(R1) ;READ LOGICAL?$ BEQ 40$ ;YES, SERVICE READ REQUEST;O/; FALL THROUGH HERE ON TRANSMIT (WRITE LOGICAL)S;& BIS #RTS,(R2) ;ASSERT REQUEST TO SEND( MOVB U.SYNC(R5),R0 ;LOAD SYNC CHARACTER3 MOVB S.ITM(R4),S.CTM(R4) ;INITIALIZE TIMEOUT COUNT.. MOVB U.NSYN(R5),R3 ;NUMBER OF SYNCS IN LEADER/30$: MOVB R3,U.NSYC(R5) ;LOAD SYNC LEADER COUNT)" ADD #4,R2 ;POINT TO TRANSMIT CSR% BIS #SEND,(R2)+ ;ENABLE TRANSMISSION#;D; ***** NOTE *****;D:; SINCE TSOM IS SET THROUGHOUT THE TRANSMISSION, DAT00\8_._ÿ^DATADATADATADATADATADATADATAA LATE ; ERRORS WILL NEVER BE DETECTED.;E; ***** *****; BIC #177400,R0 ;CLEAR HIGH BYTE BIS #TSOM,R0 ;SET TSOMB MOV R0,(R2) ;SEND CHAR+TSOM # TST -(R2) ;CLEAR DATA LATE ERRORSC* BIS #DNAEN!TXINTE,(R2) ;ENABLE INTERRUPTS: BR 180$ ;RETURN - INTERRUPT CODE PROPAGATES TRANSMISSION;R; RECEIVE FUNCTION INITIATION ;C40$: ;REFERENCE LABEL# MOV R5,R0 ;SET UP TRANSFER VECTOR22 ADD #U.RBUF,R0 ;RECEIVE TRANSFER INFORMATION HERE# MOV U.BUF(R5),(R0)+ ;TRANSFER BIAST" MOV U.BUF+2(R5),(R0)+ ;AND OFFSET MOV U.CNT(R5),(R0) ;AND COUNT$ BIC #SCHSYN,(R2) ;FORCE RE-SYNCHING* TSTB 2(R2) ; ENSURE RECEIVE BUFFER CLEAR1 BIS #STRSYN!RCVENB!SCHSYN,(R2) ; ENABLE RECEIVERE5 BR 180$ ;RETURN - INTERRUPT CODE PROPAGATES RECEIVEB;$@; CONTROL FUNCTION INITIATION (INITIATE OR TERMINATE CONTROLLER,; OR CHANGE OPERATING MODE);:170$: BNE 110$ ;IF NOT EQUAL, MODE CHANGE REQUESTC CMP (R2)+,(R2)+ ;POINT TO TXCSR BIS #MSTRST,(R2) ;RESET DEVICEF TSTB -(R1) ;START FUNCTION?V" BNE 100$ ;IF NON-ZERO, TERMINATE;C; DO START FUNCTION INITIATION;N, TST U.CW2(R5) ;DEVICE TO BE IN HALF DUPLEX? BPL 80$ ;NO, IF PLUS( BIS #HDPX,(R2) ;PUT IN HALF DUPLEX MODE-80$: MOV #INITMD,R0 ;GET WORD SIZE, SYNC MODEO) BISB U.SYNC(R5),R0 ;OR IN SYNC CHARACTERI+ MOV R0,-(R2) ;INITIALIZE DEVICE PARAMETERS; BIS #STRSYN!TRMRDY!SCHSYN,-(R2) ;NOW INITIALIZE CONTROLLERU) BIS #U2.ONL,U.CW2(R5) ;MARK UNIT ON LINE; BR 160$ ;RETURN SUCCESSFUL;R ; CAN'T ESTABLISH COMMUNICATIONS;C@90$: MOV #IE.DNR&377,R0 ;SAY CAN'T INITIALIZE DEVICE (NOT READY) BR 170$ ;DO I/O DONE;); FUNCTION WAS TERMINATE LINE;LE100$: BIC #^C,U.CW2(R5) ;CLEAR OPERATING STATUSN# BR 160$ ;RETURN SUCCESSFUL STATUSB;.$; SERVICE DEVICE MODE CHANGE REQUEST;R6110$: BITB #IO.HDX,-(R1) ;SUBFUNCTION SAY HALF DUPLEX? BEQ 120$ ;IF ZERO, NOA6 BIS #U2.HDX,U.CW2(R5) ;SAY HALF DUPLEX CHARACTERISTIC1120$: BITB #IO.FDX,(R1) ;SET MODE TO FULL DUPLEX?S! BEQ 150$ ;DON'T SET FULL DUPLEXM, BIT #U2.LIN,U.CW2(R5) ;IS LINK FULL DUPLEX?" BEQ 140$ ;IF SO, RUN FULL DUPLEX2130$: MOV #IE.IFC&377,R0 ;MARK AS ILLEGAL FUNCTION BR 170$ ;AND TERMINATE6140$: BIC #U2.HDX,U.CW2(R5) ;PUT IN FULL DUPLEX IN UCB2150$: BITB #IO.SYN,(R1) ;SYNC CHARACTER SPECIFIED? BEQ 160$ ;NO, IF NOT SET9 MOVB I.PRM-I.FCN(R1),U.SYNC(R5) ;MARK NEW SYNC CHARACTERFXWSUCC: ;REFERENCE LABEL22160$: MOV #IS.SUC&377,R0 ;RETURN SUCCESSFUL STATUSXWFIN: ;REFERENCE LABEL-170$: CLRB S.STS(R4) ;CLEAR CONTROLLER STATUSB- BICB #US.BSY,U.STS(R5) ;MARK UNIT IDLE, ALSOQ! MOV R0,-(SP) ;SAVE STATUS WORD 1$- MOV S.PKT(R4),-(SP) ;SAVE OLD PACKET ADDRESS" CALL XWINI ;INITIATE NEXT PACKET% MOV (SP)+,R3 ;GET OLD PACKET ADDRESS 0 MOV I.PRM+4(R3),R1 ;RETURN REQUESTED ITEM COUNT$ MOV (SP)+,R0 ;RESTORE STATUS WORD 1$ CALLR $IOFIN ;TERMINATE OLD PACKET180$: RETURN ;;U; POWER FAIL SERVICE;XWPWF: ;REFERENCE LABEL( CLRB S.CTM(R4) ;DISABLE DEVICE TIMEOUTS3 MOV #IE.DNR&377,R0 ;PUT ERROR CODE IN R0 FOR DWTMOB BR XWOUT ;FINISH I/O ABORT;T; I/O CANCELLATION SERVICE;V ; INPUTS: ; R0=I/O PACKET ADDRESS#; R1=TCB ADDRESS OF TASK TO CANCEL ; R4=SCB ADDRESSK; R5=UCB ADDRESSGXWCAN: ;;;REFERENCE LABEL* CMP R1,I.TCB(R0) ;;;CANCEL FOR THIS TASK? BNE 180$ ;;;JUST RETURN IF NOT4 CMPB #IO.WLB/256.,I.FCN+1(R0) ;;;TRANSMIT FUNCTION?! BEQ 180$ ;;;LET TRANSMIT FINISH% TST U.RCNT(R5) ;;;RECEIVER FINISHED?. BLE 180$ ;;;RETURN IF YESU0 BIC #RCVENB!SCHSYN,@S.CSR(R4) ;DISABLE RECEIVER5 MOV #IE.ABO&377,R0 ;;;PUT ERROR CODE IN R0 FOR XWOUTL' BR XWOUT ;;;FINISH OFF RECEIVE PACKET/;K; TIMEOUT SERVICE ROUTINES;F ; INPUTS:N; &; R0 = DEVICE TIMEOUT STATUS 'IE.DNR'; R3 = CONTROLLER INDEX; R4 = ADDRESS OF SCB; R5 = ADDRESS OF UCB;XWOUT: ;;;REFERENCE LABEL% MOV S.CSR(R4),R4 ;;;GET RECEIVER CSRN4 BIC #TXINTE!SEND!DNAEN,4(R4) ;;;DISABLE TRANSMITTER" BIC #RTS,(R4) ;;;TURN OFF CARRIER MTPS #0 ;;;ALLOW INTERRUPTS,210$: JMP XWTXND ;WAIT FOR SOFTWARE TIMEOUT .DSAB00\@_ÏG_4^eaek›’L LSBO 7;;-; **- $XWINP - DUP-11 INPUT INTERRUPT SERVICE;;I$XWINP:: ;;;REFERENCE LABELI5 INTSV$ XW,PR5,D$$W11 ;;;GENERATE INTERRUPT SAVE CODEI( CALL XWSET ;;;SET CSR IN R4, UCB IN R5+ BIC #STRSYN,(R4)+ ;;; EXIT STRIP SYNC MODED- MOV (R4),R4 ;;;CONTENTS OF RCV BUFFER IN R4L) MOV KISAR6,-(SP) ;;;SAVE CURRENT MAPPINGB, MOV U.RBUF(R5),KISAR6 ;;;MAP TO USER BUFFER3 MOVB R4,@U.RBUF+2(R5) ;;;STORE BYTE IN USER BUFFER;, MOV (SP)+,KISAR6 ;;;RESTORE CURRENT MAPPING) DEC U.RCNT(R5) ;;;SEE IF COUNT SATISFIED; BEQ 30$ ;;;YES, IF EQUAL& INC U.RBUF+2(R5) ;;;BUMP BYTE ADDRESS3 BIT #20000,U.RBUF+2(R5) ;;;OVERFLOWED 4K BOUNDARY?  BEQ 20$ ;;;NO, IF ZERO. BIC #20000,U.RBUF+2(R5) ;;;CLEAR OVERFLOW BIT! ADD #200,U.RBUF(R5) ;;;BUMP BIAS$20$: RETURN ;;;EXIT FROM INTERRUPT;N; REQUEST SATISFIEDP;;30$: ;REFERENCE LABEL$ MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS+ BIC #RCVENB,@S.CSR(R4) ;;;DISABLE RECEIVERS CALL $FORK ;;;GO TO FORK LEVEL% JMP XWSUCC ;COMPLETE SUCCESSFUL I/O  S; ,; **- $XWOUT - TRANSMITTER INTERRUPT SERVICE;C$XWOUT:: ;;;REFERENCE LABELS5 INTSV$ XW,PR5,D$$W11 ;;;GENERATE INTERRUPT SAVE CODE0 CALL XWSET ;;;SET RECEIVE CSR IN R4, UCB IN R5 ADD #4,R4 ;;;POINT TO TX CSR" TST (R4)+ ;;;DATA NOT AVAILABLE? BPL 10$ ;;;NO, IF NOT SET; ; CHECK DATA LATE;& TSTB -2(R4) ;;;TRANSMITTER DONE SET?& BPL 60$ ;;;IF NOT, DISMISS INTERRUPT*10$: BIT #CTS,-6(R4) ;;;CLEAR TO SEND SET? BEQ 20$ ;;;IF NOT, SEND A SYNC$ TSTB U.NSYC(R5) ;;;SYNC COUNT ZERO?" BEQ 30$ ;;;IF YES, TRANSMIT DATA/ DECB U.NSYC(R5) ;;;DECREMENT SYNC LEADER COUNTI! BLE 30$ ;;;IF LE, TRANSMIT DATAE220$: MOVB U.SYNC(R5),(R4) ;;;SEND A SYNC CHARACTER BR 50$ ;;;EXIT;4; SET UP AND TRANSMIT A BYTE; /30$: DEC U.CNT(R5) ;;;CHECK COUNT (0 NOT VALID)E BGE 40$ ;;;IF NOT, CONTINUE! TST U.CW2(R5) ;;;IN HALF DUPLEX? " BPL 80$ ;;;IF NOT, NO TURNAROUND% CMP #-3,U.CNT(R5) ;;;SENT TWO MARKS? $ BGE 70$ ;;;IF SO, TURN LINE AROUND MOVB #-1,(R4) ;;;OUTPUT A MARKC BR 50$ ;;;DISMISS INTERRUPTE.40$: CALL $GTBYT ;;;GET NEXT BYTE FROM BUFFER$ MOVB (SP)+,(R4) ;;;OUTPUT CHARACTER-50$: MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS BACKN0 MOVB S.ITM(R4),S.CTM(R4) ;;;RESET TIMEOUT COUNT%60$: BR XWSXT ;;;EXIT FROM INTERRUPTU'70$: BIC #SEND,-(R4) ;;;DON'T IDLE SYNCE+ TST -(R4) ;;;CLEAR RECEIVE DONE AND ERROR;* BIC #SCHSYN!RTS,-(R4) ;;;TURN OFF CARRIER% BIS #SCHSYN,(R4) ;;;FORCE RESYNCHINGO' ADD #6,R4 ;;;POINT TO TRANSMIT BUFFERR880$: BIC #TXINTE!DNAEN!SEND,-(R4) ;;;DISABLE TRANSMITTER% CALL $FORK ;;;CREATE SYSTEM PROCESST- MOV #IS.SUC&377,R0 ;RETURN SUCCESSFUL STATUSPXWTXND: ;REFERENCE LABELR$ MOV U.SCB(R5),R4 ;RESTORE SCB TO R4 JMP XWFIN ;MARK COMPLETION .PAGE;6; XWSET - SET UP REGISTER R4 WITH CSR ADDRESS, R5 WITH8; UCB ADDRESS. UNIT NUMBER IN LOW ORDER 4 BITS OF UNIT.; XWSET: ;;;REFERENCE LABEL& TST R5 ;;;TEST FOR VALID UCB ADDRESS BEQ 10$ ;;;IF NO UCB, TROUBLE;' BIT #U2.ONL,U.CW2(R5) ;;;UNIT ON LINE?N+ BEQ 10$ ;;;IF NOT ON LINE, CAN'T TRANSFERC* MOV U.SCB(R5),R4 ;;;FIRST GET SCB ADDRESS+ MOV S.CSR(R4),R4 ;;;NOW DEVICE CSR ADDRESSX RETURN ;;;AND NOW RETURNV010$: TST (SP)+ ;;;CLEAR STACK OF RETURN ADDRESS'XWSXT: JMP $INTXT ;;;DISMISS INTERRUPTP .END R4 WITH CSR ADDRESS, R5 WITH8; UCB ADDRESS. UNIT NUMBER IN LOW ORDER 4 BITS OF UNIT.; XWSET: ;;;REFERENCE LABEL& TST R5 ;;;TEST FOR VALID UCB ADDRESS BEQ 10$ ;;;IF NO UCB, TROUBLE;' BIT #U2.ONL,U.CW2(R5) ;;;UNIT ON LINE?N+ BEQ 10$ ;;;IF NOT ON LINE, C ADDRESS ADD R4,R3 ;;;REALLY GET IT520$: CMP S.WCCH(R4),U.MAXC(R3) ;;;GOING TO NEXT AD11?T! BLOS 40$ ;;;IF LOS NO--ALL DONET;H ; MOVE TO THE NEXT A/D CONVERTOR;  .IF DF A$$M11; BICB #^C<77>,S.WCHB(R4) ;;;ASSUME AM11/ABS CHAN ADDRESSING.! BIT #UF$AMK,U.FLG(R3) ;;;AM11-K?N# BEQ 25$ ;;;IF EQ NO--MUST RE-MASKE2 BIT #S$WACA,S.WFL2(R4) ;;;ABS CHANNEL ADDRESSING?$ BNE 30$ ;;;IF NE YES--MASK IS FINE .ENDC ;A$$M11?25$: BICB #^C<17>,S.WCHB(R4) ;;;NO--MUST RE-MASK TO 16 CHANNELSC*30$: A00ÏH_ÐK_ÿ^DATADATADATADATADATADATADATADD #U.LGTH,R3 ;;;MOVE R3 TO NEXT UCB% MOV R3,S.WAUA(R4) ;;;POINT SWB TO ITO6 SUB R4,S.WAUA(R4) ;;;MAKE IT RELATIVE TO START OF SWB9 MOV U.CSR(R3),S.WCSR(R4) ;;;PUT ACTIVE UNIT CSR INTO SWB .ENDC ;N$AD11-140$: RETURN ;;;/; (; ALL REQUESTED CHANNELS ARE DONE--RESET;MD60$: MOV S.WCHX(R4),S.WNCH(R4) ;;;RESET THE NUMBER OF CHANNELS TO DO4 MOV S.WICH(R4),S.WCCH(R4) ;;;AND THE CHANNEL NUMBER1 MOVB S.WCBX(R4),S.WCHB(R4) ;;;RESET CHANNEL BYTE. ;;;DROP INTO .ADXCH K+ .SBTTL .ADXCH COMPUTE UCB ADDRESS FOR AD11 ;+0; .ADXCH -- COMPUTE THE UCB ADDRESS FOR THE AD11;B=; THIS ROUTINE COMPUTES THE UCB ADDRESS OF THE AD11 GIVEN THER,; CHANNEL NUMBER IN THE SWEEP CONTROL BLOCK.; ; INPUTS:D;1&; R4 POINTS TO A/D SWEEP CONTROL BLOCK; .ADSWB SETUP;N ; OUTPUTS:;0; R3 POINTS TO CORRECT UCB; S.WAUA SETUP IN THE SWBN; S.WCSR SET UP IN SWB;,; NOTE:);;:; THIS ROUTINE MAY BE EXECUTED AT EITHER TASK OR INTERRUPT; LEVEL.;.;- .IF GT N$AD11-1 .ADXCH::MOV R4,R3 ;POINT TO SWB& ADD #S.WUCB,R3 ;POINT UP TO FIRST UCB<20$: CMP S.WCCH(R4),U.MAXC(R3) ;CAN CHANNEL BE ON THIS UNIT?* BLOS 40$ ;IF LOS YES--FOUND CORRECT UNIT% ADD #U.LGTH,R3 ;NO--BUMP TO NEXT UCB BR 20$ ;KEEP A'LOOKING/40$: MOV R3,S.WAUA(R4) ;POINT TO UCB IN THE SWB5 SUB R4,S.WAUA(R4) ;MAKE PTR RELATIVE TO START OF SWBA3 MOV U.CSR(R3),S.WCSR(R4) ;SET CSR ADDRESS INTO SWBE ;FOR FASTER ACCESS  .ENDC ;N$AD11-1 RETURN ;BACK TO CALLER. .ENDC ;N$AD11 .END.ADXCH::MOV R4,R3 ;POIN) .TITLE KBFSTS RETURN SWEEP BUFFER STATUST .IDENT /M01.02/;4 ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.N;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01.01 ; B. SCHREIBER 16-AUG-77;E; MODIFIED BY:;U; M. S. HARVEY 11-MAY-795; MSH031 -- CORRECT EVENT FLAG AND ARG LIST HANDLINGA;O1; TL092 -- CORRECT IWTBUF USE OF THE DEFAULT EFNN; C; THIS ROUTINE RETURNS INFORMATION ABOUT BUFFERS IN USE FOR A SWEEP ;U; SYSTEM MACRO CALLS;O .MCALL WTSE$S, KSWDF$, CLEF$S KSWDF$ Q# .SBTTL IBFSTS RETURN BUFFER STATUSE;+ ; IBFSTS -- RETURN BUFFER STATUS;I; CALLING SEQUENCE:E; ; CALL IBFSTS (IBUF, ISTAT)E;Y ; INPUTS:;E'; IBUF IS THE 'IBUF' FROM A SWEEP STARTE5; ISTAT IS AN ARRAY OF DIMENSION 'N' (N IS THE NUMBER3(; OF BUFFERS) WHICH RECEIVES THE STATUS; 2 IN DEVICE QUEUEO; 1 IN USER QUEUEH ; 0 UNKNOWN; -1 CURRENT BUFFERR;I;-"IBFSTS::TST (R5)+ ;SKIP ARG COUNT MOV (R5)+,R0 ;GET IBUF ADDRESSO MOV (R5)+,R2 ;GET ISTAT ADDRESS MOV R2,R3 ;COPY FOR A SECOND+ MOV IB.NBF(R0),R4 ;GET # OF BUFFERS IN USEN&20$: CLR (R3)+ ;CLEAR OUT ISTAT ARRAY DEC R4A BGT 20$ ;... CALL .FDSWI ;FIND SWB BCS 120$ ;SKIP IT IF NOT FOUND" MTPS #PR6 ;;;LOCK OUT INTERRUPTS0 MOVB S.WBNO(R1),R3 ;;;GET CURRENT BUFFER NUMBER ASL R3 ;;;MAKE WORD INDEX % ADD R2,R3 ;;;POINT INTO ISTAT ARRAY3 MOV #-1,(R3) ;;;STORE CURRENT BUFFER STATUS FOR ITS MOV R0,R3 ;;;POINT AT IBUF( ADD #IB.DVQ,R3 ;;;POINT TO DEVICE QUEUE+ MOV #2,R4 ;;;SET 'IN DEVICE QUEUE' STATUS %40$: MOVB (R3)+,R5 ;;;GET NEXT BUFFER  BMI 60$ ;;;IF MI END OF QUEUE+ ASL R5 ;;;MAKE WORD INDEXC ADD R2,R5 ;;;INDEX INTO ISTATI MOV R4,(R5) ;;;STORE STATUSI BR 40$ ;;;CONTINUE260$: ADD #IB.USQ,R0 ;;;POINT TO USER QUEUE IN IBUF DEC R4 ;;;MA00ÐP_`T_4^eaek›’KE A 2 INTO A 1L380$: MOVB (R0)+,R5 ;;;GET NEXT ITEM FROM USER QUEUES BMI 100$ ;;;IF MI ALL DONE ASL R5 ;;;MAKE WORD INDEXR ADD R2,R5 ;;;POINT INTO ISTATF MOV R4,(R5) ;;;STORE STATUSE BR 80$ ;;;CONTINUE"100$: MTPS #0 ;;;ALLOW INTERRUPTS 120$: RETURN 5 .SBTTL IWTBUF WAIT FOR BUFFER;+#; IWTBUF -- WAIT FOR BUFFER TO FILLR;N;; THIS ROUTINE WAITS FOR A BUFFER TO FILL BY WAITING ON THEE; SPECIFIED EVENT FLAG.T;E; CALLING SEQUENCE: ;P(; IBUFNO = IWTBUF (IBUF, IEFN [,IBUFNO]);A ; INPUTS:L;0-; IBUF IS THE 'IBUF' PARAM FROM A SWEEP STARTU3; IEFN IS (HOPEFULLY) THE 'IEFN' FROM A SWEEP STARTR;N ; OUTPUTS:;5*; IBUFNO IS THE NEXT BUFFER NUMBER TO USE.;S;+;-$IWTBUF::MOVB (R5),R3 ;GET ARG COUNT" TST (R5)+ ;POINT TO IBUF POINTER MOV (R5)+,R0 ;GET IBUF POINTER) MOV .KDFEF,R2 ;ASSUME DEFAULT EVENT FLAGN' CMP R3,#2 ;IS IEFN ARGUMENT POSSIBLE?L BLT 3$ ;IF LT NO& CMP (R5),#-1 ;USE DEFAULT EVENT FLAG? BEQ 3$ ;IF EQ YESB- TST @(R5) ;ARE WE SURE ITS NOT THE DEFAULT?U# BEQ 3$ ;IF EQ NO, ITS THE DEFAULTF MOV @(R5),R2 ;GET EVENT FLAGH(3$: TST (R5)+ ;POINT TO IBUFNO ARGUMENT* CALL .FDSWI ;FIND SWB ASSOCIATED WITH IT BCS 6$ ;IF CS SKIP IT+' TST S.WSTS(R1) ;IS SWEEP STILL ACTIVE?U) BNE 5$ ;IF NE WE ARE NO LONGER SAMPLINGV ;SO GO RETURN -1 TO USER1 MOVB IB.USQ(R0),R1 ;SEE IF A BUFFER IS AVAILABLE,# BPL 5$ ;IF PL BUFFER IS AVAILABLET WTSE$S R2 ;WAIT FOR ONE- 5$: CLEF$S R2 ;CLEAR EVENT FLAG 6$: BR IGTB0 ;GO TO COMMON CODE U .SBTTL IGTBUF GET BUFFER NUMBER ; IGTBUF -- RETURN BUFFER NUMBER;)4; THIS ROUTINE RETURNS THE NEXT BUFFER NUMBER TO USE;U; CALLING SEQUENCE:F; "; IBUFNO = IGTBUF (IBUF [,IBUFNO]); ; INPUTS:T;S1; IBUF IS THE 'IBUF' FROM A CALL TO START A SWEEP ;A ; OUTPUTS:;M$; IBUFNO IS THE BUFFER NUMBER TO USE;V;-)IGTBUF::MOVB (R5),R3 ;GET ARGUMENT COUNTB INC R3 ;MAKE SAME AS IWTBUFL TST (R5)+ ;SKIP COUNT WORD# MOV (R5)+,R0 ;GET IBUF/USW ADDRESS$-IGTB0: CALL .FDSWI ;FIND SWEEP CONTROL BLOC .TITLE DQDRV .IDENT /04.07/ ;5; COPYRIGHT (C) 1981 BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; VERSION 04.07;; P. J. BEZEREDI 01-NOV-77;; PREVIOUSLY MODIFIED BY:;; P. J. BEZEREDI;; MODIFIED BY:;; P. J. BEZEREDI 06-DEC-79;4; PB144 -- RETURN IE.BBE IF MANUFACTURER BAD HEADER; IS DETECTED.;; R. T. PERRON 12-DEC-79;Q/; RP026 -- CORRECT MULTI-CONTROLLER OPERATION.9;B; R. T. PERRON 16-OCT-80;O2; RP040 -- CORRECT SEEK ERROR RECOVERY ALGORITHM.;I; P. J. BEZEREDI 18-MAR-81; -; PB228 -- ADD SUPPORT FOR RLV12 CONTROLLER.E; ; P. J. BEZEREDI 08-APR-81; 4; PB232 -- RESTORE SCB ADDRESS AFTER CALL TO $FORK.;Y; P. J. BEZEREDI 09-APR-81;E;; PB235 -- ADDITION OF REQUEST QUEUE OPTIMIZATION SUPPORT.;P; P. J. BEZEREDI 06-MAY-81;C3; PB242 -- ADD SUPPORT FOR RTEM AND CLEANUP A BIT.N;-; RL11/RL01 DISK DRIVERO;C;U.MCALL HWDDF$,PKTDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS; ;****************.; ; EQUATED SYMBOLS;,RETRY= ^D<8> ;CONTROLLER ERROR RETRY COUNT;RLCNT= ^D<7> ;NUMBER OF REGISTERS TO LOG ON ERROR ; PB228 2RLBPT= ^D<512*20> ;BYTES PER RL01 SURFACE ;**-1)RLSPU= ^D<15> ;TIME FOR RL01 TO SPIN UPSLD$DQ=0P;I;****************P; ; RL11 DEVICE REGISTER OFFSETS;2"RLCS= 0 ;CONTROL STATUS REGISTERRLBA= 2 ;BUS ADDRESS REGISTERD RLDA= 4 ;DISK ADDRESS REGISTER!RLMP= 6 ;MULTI-PURPOSE REGISTERS4RLBAE= 10 ;BUS ADDRESS EXTENSION REGISTER ; PB228;*;****************A; ; RLCS BIT ASSIGNMENTS; ERR= 100000 ;COMPOSITE ERRORDE= 040000 ;DRIVE ERRORE"NXM= 020000 ;NON-EXISTANT MEMORYDLT= 010000 ;DATA LATEHNF= 010000 ;HEADER NOT FOUND<DCK= 004000 ;DATA CHECK ERROR HCRC= 004000 ;HEADER CRC ERROR#OPI= 002000 ;OPERATION INCOMPLETE2/A17= 000040 ;EXTENDED ADDRESS BIT 17 ; PB2200`X_K_ÿ^DATADATADATADATADATADATADATA8B/A16= 000020 ;EXTENDED ADDRESS BIT 16 ; PB228IDRDY= 1 ;DRIVE READYWCHK= 2 ;WRITE CHECK FUNCTIONSWRITE= 2 ;WRITE OFFSET$GSTS= 4 ;GET DRIVE STATUS FUNCTIONSEEK= 6 ;SEEK FUNCTION RDH= 10 ;READ HEADERS FUNCTIONREAD= 14 ;READ DATA FUNCTIONIE= 100 ;INTERRUPT ENABLEOCRDY= 200 ;CONTROLLER READYN;0;**************** ;N; RLDA STATUS CODEST;HMRK= 1 ;MARKER BITSTS= 2 ;GET STATUS BITSN= 4 ;SIGN BIT FOR SEEKRST= 10 ;DRIVE RESET BIT(HS= 20 ;HEAD SELECT BIT FOR DIFFERENCE,REV= 200!MRK ;REVERSE SEEK DIFFERENCE WORD;D;**************** ;W!; RLMP GET STATUS BIT ASSIGNMENTSR; WDE= 100000 ;WRITE DATA ERRORU!CHE= 040000 ;CURRENT HEAD ERRORN WLS= 020000 ;WRITE LOCK STATUS"SKTO= 010000 ;SEEK TIMEOUT ERRORSPD= 004000 ;SPEED ERRORWGE= 002000 ;WRITE GATE ERROR0VC= 001000 ;VOLUME CHECK!DSE= 000400 ;DRIVE SELECT ERRORADT= 000200 ;DRIVE TYPE!HSS= 000100 ;HEAD SELECT STATUSKCO= 000040 ;COVER OPENHH= 000020 ;HEADS HOMEBH= 000010 ;BRUSHES HOME.SLM= 000005 ;DRIVE IN SEEK-LINEAR MODE STATE;*;****************P;T ; LOCAL DATA;N; CONTROLLER IMPURE DATA TABLESD,; THESE ARE INDEXED BY THE CONTROLLER NUMBER;L7RTTBL: .BLKW R$$L11 ;RETRY COUNT FOR CURRENT OPERATIONOBPRMSV: .BLKW R$$L11*6 ;PARAMETER SAVE AREA FOR WRITE CHECK ; PB228; ;**-1;;****************0;0;DRIVER DISPATCH TABLE;T> DDT$ DQ,R$$L11,NEW=Y,OPT=Y ;GENERATE DISPATCH TABLE ; PB228;0;****************H;0;+.; **-DLINI-RL11/RL01 DISK CONTROLLER INITIATOR;0B; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/OA; REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TOEE; PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED CONTROLLER G; IS NOT BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST.CB; ELSE A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPTD; IS SUCCESSFUL, THEN THE NEXT I/O OPERATION IS INITIATED. A RETURN!; TO THE CALLER IS THEN EXECUTED.0;+ ; INPUTS:I8; R5= ADRS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;N ; OUTPUTS:?; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST ISE?; WAITING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THEF-; DRIVER INITIATES THE REQUESTED I/O FUNCTIONS;- DQINI: NOP NOP NOP CALL $GTPKT BCC X NOP RETURNTX: NOP;A1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:A;M$; R1= ADRS OF THE I/O REQUEST PACKET1; R2= PHYSICAL UNIT NUMBER OF THE REQUESTED DRIVE ; R3= CONTROLLER INDEX,; R4= ADRS OF THE STATUS CONTROL BLOCK (SCB)2; R5= ADRS OF THE UCB OF THE DRIVE TO BE INITIATED;I6; RL11/RL01 DISK CONTROLLER I/O REQUEST PACKET FORMAT:; !; WD. 00 -- I/O QUEUE THREAD WORDS/; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBERT1; WD. 02 -- ADRS OF THE TCB OF THE REQUESTOR TASK <; WD. 03 -- POINTER TO 2ND LUN WORD IN REQUESTOR TASK HEADER1; WD. 04 -- CONTENTS OF FIRST LUN WORD (UCB ADRS) ; WD. 05 -- I/O FUNCTION CODEH,; WD. 06 -- VIRTUAL ADRS OF I/O STATUS BLOCK/; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCKN;; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT +140000)I/; WD. 11 -- VIRTUAL ADRS OF AST SERVICE ROUTINES1; WD. 12 -- MEMORY EXTENSION BITS OF I/O TRANSFERW'; WD. 13 -- BUFFER ADRS OF I/O TRANSFER ,; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED; WD. 15 -- NOT USED.D;; WD. 16 -- LOW BYTE MUST BE ZERO AND HIGH BYTE IS NOT USEDD9; WD. 17 -- LOW PART OF LOGICAL BLK NUMBER OF I/O REQUEST A; WD. 20 -- RELOCATION BIAS OF DIAGNOSTIC REG. BLK. ELSE NOT USED C; WD. 21 -- DIAGN. REG. BLOCK ADDRESS (DISPL.+140000) ELSE NOT USEDS;O&; DRIVER USAGE OF WORDS IN I/O PACKET:5; I.PRM+6 (WD. 15) - EXTENDED ADDRESS BITS ; PB228-A; I.PRM+10 (WD. 16) - CYLINDER # OR DESIRED DISK ADDRESS ; PB235FI; I.PRM+12 (WD. 17) - SECTOR/SURFACE # OR BYTES REMAINING TO XFER ; PB235O; ;**-364 CALL $RQCND ;REQUEST ACCESS TO CONTROLLER ; PB2353 MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS ; PB235S, MOV S.KRB(R4),R3 ;GET KRB ADDRESS ; PB2426 MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX ; PB200``_T_4^eaek›’426 MOV #RETRY,RTTBL(R3);SET INITIAL RETRY COUNT ; PB2424 CALL DLVV ;PROCESS VOLUME VALID FUNCTIONS ; PB2426 BIT #FE.EXT,$FMASK ;IS THIS A 22-BIT SYSTEM? ; PB228 BEQ 15$ ;IF EQ NO ; PB2287 BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST? ; PB228  BEQ 10$ ;IF EQ NO ; PB2288 MOVB U.BUF+1(R5),R0 ;GET EXTENDED ADDRESS BITS ; PB2282 MOV R0,I.PRM+6(R1) ;SAVE THEM FOR LATER ; PB2281 ASH #4,R0 ;PUT THEM IN THE RIGHT PLACE ; PB228;1 BIC #^C<60>,R0 ;JUST GET THE LOW 2 BITS ; PB228E' MOV R0,U.BUF(R5) ;SAVE THEM ; PB228T BR 15$ ; ; PB228:10$: CALL $STMAP ;SETUP UNIBUS MAPPING REGISTERS ; PB228;15$: MOVB U.UNIT(R5),U.BUF+1(R5) ;SET UNIT NUMBER ; PB228 4 MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION ;**-226 BIS #READ!IE,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTION+ CMPB #IO.RLB/^D<256>,I.FCN+1(R1) ;REALLY?B- BHIS 20$ ;IF HIS FUNCTION IS LEGAL ; PB242R, CALLR DLFIN ;FUNCTION IS ILLEGAL ; PB242020$: BEQ 25$ ;IF EQ FUNCTION IS A READ ; PB242? SUB #WRITE,U.BUF(R5) ;CONVERT TO WRITE LOGICAL FUNCTION ;**-3T>25$: MOV I.PRM+12(R1),R0 ;RETRIEVE SECTOR AND SURFACE ; PB2357 MOV I.PRM+10(R1),R2 ;RETRIEVE CYLINDER NUMBER ; PB235S) ASH #7,R2 ;PUT IT IN POSITION ; PB235R4 BIS R0,R2 ;MERGE IN THE SECTOR AND SURFACE ; PB2358 MOV R2,I.PRM+10(R1) ;SAVE DESIRED DISK ADDRESS ; PB2350 BIC #^C<77>,R0 ;ISOLATE SECTOR NUMBER ; PB235A MOV U.CNT(R5),I.PRM+12(R1) ;ASSUME ONLY ONE XFER NEEDED ; PB23521 MOV #^D<40>,R2 ;SET SECTORS PER SURFACE ; PB2356 SUB R0,R2 ;CALCULATE SECTORS LEFT ON SURFACE ; PB235- SWAB R2 ;GET BYTES LEFT ON SURFACE ; PB235C= CMP U.CNT(R5),R2 ;ARE ADDITIONAL TRANSFERS REQUIRED? ; PB235E BLOS 30$ ;IF LOS NO ; PB235< MOV R2,U.CNT(R5) ;SET BYTE COUNT FOR FIRST TRANSFER ; PB228030$: MOV S.KRB(R4),R3 ;GET KRB ADDRESS ; PB2356 MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX ; PB235; MUL #6,R3 ;FORM AN INDEX INTO PARAMETER SAVE AREA ; PB235O- ADD #PRMSV,R3 ;POINT TO THIS ENTRY ; PB235S6 MOV U.BUF(R5),(R3)+ ;SAVE INITIAL PARAMETERS ; PB235( MOV U.BUF+2(R5),(R3)+ ;... ; PB235% MOV U.CNT(R5),(R3)+ ;... ; PB235( MOV I.PRM+10(R1),(R3)+ ;... ; PB235( MOV I.PRM+12(R1),(R3)+ ;... ; PB235( MOV I.PRM+6(R1),(R3)+ ;... ; PB228 ;**-37R;+*; THIS SECTION WILL INITIATE THE OPERATION;-=DLINIO: BIT #FE.EXT,$FMASK ;IS THIS A 22-BIT SYSTEM? ; PB2282 BEQ 5$ ;IF EQ NO ; PB228I7 BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST? ; PB228O BNE 5$ ;IF NE YES ; PB228/ CALL $MPUBM ;MAP UNIBUS TO TRANSFER ; PB228M55$: MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS ; PB228(4 MOV S.PKT(R4),R3 ;GET ADDRESS OF I/O PACKET ;**-11. CLRB U.CW2+1(R5) ;CLEAR DRIVE FLAGS ; PB242( CALL DLGST ;GET DRIVE STATUS ; PB242- MOV RLMP(R2),R1 ;GET THE STATUS INFO ;**-4 + BIC #WLS!DT!HSS,R1 ;REMOVE IRRELEVANT BITS.$ BIT #DRDY,(R2) ;IS THE DRIVE READY? BEQ 20$ ;IF EQ NO ; PB242= BITB #US.VV,U.STS(R5);IS SOFTWARE VOLUME VALID SET? ; PB2422 BEQ 10$ ;IF EQ NO ; PB242, BIT #VC,R1 ;IS VOLUME CHECK SET? ; PB242% BNE 25$ ;IF NE YES, ERROR ; PB242 *10$: BIC #VC,R1 ;IGNORE VC BIT ; PB2427 CMP #HH!BH!SLM,R1 ;HEADS, BRUSHES AND STATE OK? ;**-1R BEQ 30$ ;IF EQ YES ; PB242S@20$: BITB #US.SPU,U.STS(R5) ;IS THE DRIVE SPINNING UP? ; PB2427 BNE DLPWF1 ;IF NE YES, WAIT FOR IT TO SPIN UP ; PB242./ CALL DLDVER ;LOG DRIVE NOT READY ERROR ;**-3 825$: MOV #IE.DNR&377,R0 ;SET RETURN ERROR CODE ; PB242$ CALLR DLFIN ;EXIT FATAL ; PB242>30$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UP ; PB242* CALL DLRST ;RESET DRIVE ERRORS ; PB242; MOV I.PRM+10(R3),R0 ;RETREIVE STARTING DISK ADDRESS ;**-31( CALL DLDIFF ;CALCULATE DIFFERENCE WORD3DLGO: BEQ 40$ ;IF EQ NO SEEK IS NECESSARY ; PB242T0 MOV #SEEK,R1 ;GET CODE FOR SEEK FUNCTION ;**-1 CALL DLXCT ;EXECUTE THE SEEK6 BMI DLEROR ;IF MI ERROR DURING SEEK FUNCTION ; PB242;40$: MOVB S.ITM(R4),S.CTM(R4) ;SET TIMEOUT COUNT ; PB228 7 BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST? ; PB228  BEQ 45$ ;IF EQ NO ; PB228? MOV I.PRM+6(R3),RLBAE(R2) 00`h_K_ÿ^DATADATADATADATADATADATADATA;LOAD EXTENDED ADDRESS BITS ; PB228+45$: ADD #RLMP,R2 ;POINT TO RLMP ; PB228A, MOV U.CNT(R5),R1 ;GET BYTE COUNT ; PB228& ROR R1 ;MAKE IT A WORD COUNT ;**-3 NEG R1 ;ALSO NEGATIVE MOV R1,(R2) ;LOAD WORD COUNT4 MOV I.PRM+10(R3),-(R2) ;LOAD STARTING DISK ADDRESS* MOV U.BUF+2(R5),-(R2) ;LOAD BUS ADDRESS( CALL $BMSET ;SET I/O ACTIVE BIT IN MAP, MOV U.BUF(R5),-(R2) ;;;LOAD FUNCTION AND GO;+<; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.;-DQCAN: RETURN ;;;NOP FOR RL11X;+:; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND>; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT=; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVER?; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANY A; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESSS; THE UNIT IS ALREADY READY.;-/DQPWF: TSTB S.STS(R4) ;IS DRIVE CURRENTLY BUSY? ! BEQ DLPWF2 ;IF EQ NO ; PB242I< MOVB #4,S.STS(R4) ;ALLOW FOR A FULL MINUTE TO SPIN UP ;**-1>DLPWF1: MOVB #RLSPU,S.CTM(R4);EXTEND TIMEOUT FOR UNIT ; PB242>DLPWF2: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UP ; PB242 RETURN ; ;**-2 ;+%; **-$DLINT-RL11/RL01 DISK CONTROLLER &; INTERRUPT AND ERROR SERVICE ROUTINES;-8 INTSE$ DQ,PR5,R$$L11 ;;;SAVE REGISTERS AND SET PRIORITY' CALL $FORK ;;;CREATE A SYSTEM PROCESSI1 MOV U.SCB(R5),R4 ;RETRIEVE SCB ADDRESS ; PB232R5 TSTB U.CW2+1(R5) ;REVERSE SEEK IN PROGRESS? ; PB242I" BMI DLINIO ;IF MI YES ; PB2422 MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS ; PB2357 MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL OPERATION ;**-5S. MOV S.PKT(R4),R3 ;RETREIVE I/O PACKET ADDRESS# MOV (R2),R1 ;GET CONTENTS OF RLCSN. BMI DLEROR ;IF MI AN ERROR OCCURRED ; PB228@ SUB U.CNT(R5),I.PRM+12(R3) ;GET BYTES LEFT TO TRANSFER ; PB228' BEQ DLPASS ;IF EQ NONE LEFT ; PB228AA MOV I.PRM+12(R3),U.CNT(R5) ;ASSUME LAST TRANSFER COMING ; PB228R= CMP I.PRM+12(R3),#RLBPT ;IS THIS THE LAST TRANSFER? ; PB228D! BLOS 10$ ;IF LOS YES ; PB228@< MOV #RLBPT,U.CNT(R5);TRANSFER A WHOLE TRACKS WORTH ; PB228810$: BIC #CRDY,R1 ;CLEAR CRDY TO START FUNCTION ; PB228? MOV R1,U.BUF(R5) ;SAVE CURRENT FUNCTION AND ADDRESS BITS ;**-8C4 MOV RLBA(R2),U.BUF+2(R5) ;SAVE CURRENT BUS ADDRESS7 BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST? ; PB228P BEQ 20$ ;IF EQ NO ; PB228? MOV RLBAE(R2),I.PRM+6(R3) ;SAVE EXTENDED ADDRESS BITS ; PB228R;20$: MOV I.PRM+10(R3),R0 ;GET INITIAL DISK ADDRESS ; PB228 & MOV R0,R1 ;COPY DISK ADDRESS ;**-1- BIS #77,R0 ;UPDATE CYLINDER AND SURFACE ...A& INC R0 ;... LEAVING SECTOR BITS ZERO+ MOV R0,I.PRM+10(R3) ;SAVE NEW DISK ADDRESS80 CALL DLDIF0 ;CALCULATE MID-TRANSFER DIFFERENCE+ CALLR DLGO ;GO DO THE OPERATION ; PB242; ; PB2423DLEROR: BIT #DRDY,R1 ;IS THE DRIVE READY? ; PB242?! BNE DLERR ;IF NE YES ; PB242;> MOVB S.ITM(R4),S.CTM(R4) ;WAIT FOR DRIVE TO QUIESCE ; PB242; MOVB #1,U.CW2+1(R5) ;FLAG SETTLE DOWN IN PROGRESS ; PB242  RETURN ; ;**-6C7DLERR: MOV (R2),R1 ;RETRIEVE CONTENTS OF RLCS ; PB242 5 BITB #IQ.UMD,I.FCN(R3) ;DIAGNOSTIC FUNCTION? ;**-1M3 BNE DLPASS ;IF NE YES, GO PASS REGISTERS ; PB242I) MOV R1,-(SP) ;SAVE RLCS CONTENTS ;**-1L CALL DLDVER ;LOG DEVICE ERROR 1 MOV (SP),R1 ;RETRIEVE CONTENTS OF RLCS ; PB144T5 MOV #IE.BBE&377,R0 ;ASSUME BAD BLOCK ERROR ; PB144 % COM (SP) ;TOGGLE THE BITS ; PB144T0 BIT #HCRC!OPI,(SP)+ ;BAD BLOCK ERROR? ; PB144! BEQ DLFIN ;IF EQ YES ; PB144 6 MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERROR ;**-1# BIT #NXM,R1 ;NON-EXISTANT MEMORY?B! BNE DLFIN ;IF NE YES ; PB242F% BIT #DE,R1 ;DRIVE PROBLEMS? ;**-1E BEQ 50$ ;IF EQ NO ; PB2425 CALL DLGST ;EXECUTE GET DRIVE STATUS FUNCTION ;**-1R% BIT #WGE,RLMP(R2) ;WRITE GATE ERROR?T BEQ DLFIN ;IF EQ NO ; PB2425 BIT #WLS,RLMP(R2) ;IS THE DRIVE WRITE LOCKED? ;**-1 BEQ DLRTY ;IF EQ NO ; PB2425 MOV #IE.WLK&377,R0 ;SET WRITE LOCK ERROR CODE ;**-1 BR DLFIN ; ; PB242750$: BIT #10,U.BUF(R5) ;WRITE CHECK FUNCTION? ; PB242 BNE DLRTY ;IF NE NO ;00`p_T_4^eaek›’ PB242, BIT #OPI,R1 ;OPERATION INCOMPLETE? ;**-3! BNE DLRTY ;IF NE YES ; PB242*) BIT #DCK,R1 ;WRITE CHECK ERROR? ;**-1 BEQ DLRTY ;IF EQ NO ; PB242: MOV #IE.WCK&377,R0 ;YES, SET WRITE CHECK ERROR CODE ;**-1=DLRTY: MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS ; PB242W/ BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES? ;**-1P! BNE DLFIN ;IF NE YES ; PB242E1 MOV S.KRB(R4),R3 ;RETRIEVE KRB ADDRESS ; PB2422 MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX ; PB242/ DECB RTTBL(R3) ;ANY MORE RETRIES LEFT? ;**-1, BLE DLFIN ;IF LE NO ; PB242/DLIO: CALL DLRST ;RESET DRIVE ERRORS ; PB2421. JMP DLINIO ;RETRY ENTIRE OPERATION ; PB242 ;**-2>DLPASS: BITB #IQ.UMD,I.FCN(R3) ;DIAGNOSTIC FUNCTION? ; PB242 BEQ 10$ ;IF EQ NO ; PB242; MOV I.PRM+14(R3),KISAR6 ;SET BUFFER RELOCATION BIAS ;**-2R1 MOV I.PRM+16(R3),R3 ;GET REGISTER BUFFER ADDRESSE) CALL REGPAS ;MOVE REGISTERS INTO BUFFER  BR DLFIN ;EXIT ; PB242B10$: BITB #IO.WLC&377,I.FCN(R3) ;WRITE WITH WRITE CHECK? ; PB242 BNE 20$ ;IF NE YES ; PB242N5 BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED? ;**-3 BEQ DLFIN ;IF EQ NO ; PB242920$: MOV U.BUF(R5),R1 ;GET CURRENT FUNCTION CODE ; PB242I4 BIT #WCHK,R1 ;WRITE OR WRITE CHECK FUNCTION? ;**-2 BEQ DLFIN ;IF EQ NO ; PB242. BIT #10,R1 ;WAS FUNCTION WRITE CHECK? ;**-1! BEQ DLFIN ;IF EQ YES ; PB242B, MOV S.KRB(R4),R1 ;GET KRB ADDRESS ; PB2356 MOVB K.CON(R1),R1 ;RETRIEVE CONTROLLER INDEX ; PB235/ MOV #RETRY,RTTBL(R1);RESET RETRY COUNT ;**-2P; MUL #6,R1 ;FORM AN INDEX INTO PARAMETER SAVE AREA ; RP0265 ADD #PRMSV,R1 ;... ;**-1 1 MOV (R1)+,U.BUF(R5) ;RESTORE STARTING PARAMETERSR MOV (R1)+,U.BUF+2(R5) ;... MOV (R1)+,U.CNT(R5) ;...  MOV (R1)+,I.PRM+10(R3) ;...  MOV (R1)+,I.PRM+12(R3) ;... ( MOV (R1)+,I.PRM+6(R3) ;... ; PB228* BR DLIO ;START THE WRITE CHECK ; PB242 ; PB242;DLFIN: MOV S.PKT(R4),R2 ;GET ADDRESS OF I/O PACKET ; PB242E3 MOV I.PRM+4(R2),R1 ;GET TOTAL TRANSFER SIZE ;**-4E9 SUB I.PRM+12(R2),R1 ;CALCULATE BYTES TRANSFERED ; PB228A, MOV S.KRB(R4),R3 ;GET KRB ADDRESS ; PB2356 MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX ; PB2351 MOVB RTTBL(R3),R2 ;GET FINAL RETRY COUNT ;**-2U3 BIS #RETRY*^D<256>,R2 ;MERGE STARTING RETRY COUNT(. CALL $RLCN ;RELEASE THE CONTROLLER ; PB235# CALL $IODON ;FINISH I/O OPERATIONT! JMP DQINI ;PROCESS NEXT REQUEST;;+$; **-DLOUT-RL11/RL01 DISK CONTROLLER; DEVICE TIMEOUT ROUTINE;V9; DEVICE TIMEOUT RESULTS IN THE OPERATION BEING REPEATED.M=; TIMEOUTS ARE USUALLY CAUSED BY A POWER FAILURE BUT MAY ALSO)*; BE THE RESULT OF A HARDWARE MALFUNCTION.;-6DQOUT: MOV S.PKT(R4),R3 ;;;RETREIVE I/O PACKET ADDRESS1 BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP?6 BEQ 20$ ;;;IF EQ NO ; PB2426 DECB S.STS(R4) ;;;HAVE WE WAITED A MINUTE YET? ;**-1 BNE 10$ ;;;IF NE NO ; PB242/ INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY ;**-1T( BR 30$ ;;;LOG DEVICE TIMEOUT ; PB242+10$: MTPS #0 ;;;ALLOW INTERRUPTS ; PB242H+ BR DLIO ;RETRY ENTIRE OPERATION ; PB242U920$: ASRB U.CW2+1(R5) ;;;IS DRIVE SETTLING DOWN? ; PB242S BNE 30$ ;;;IF NE NO ; PB242) MTPS #0 ;;;YES, ALLOW INTERUPTS ;**-5 ( JMP DLERR ;PROCESS THE ERROR ; PB242+30$: MTPS #0 ;;;ALLOW INTERRUPTS ; PB242N5 BITB #IQ.UMD,I.FCN(R3) ;DIAGNOSTIC FUNCTION? ;**-2E3 BNE DLPASS ;IF NE YES, GO PASS REGISTERS ; PB242 ) CALL DLDTER ;LOG DEVICE TIMEOUT ;**-11 MOV #IE.DNR&377,R0 ;SET DEVICE NOT READY ;**-1 & JMP DLRTY ;RETRY OPERATION ; PB242 ;**-6;+0; **-DLXCT,DLGST,DLRST-RL11/RL01 DISK CONTROLLER; FUNCTION EXECUTION ROUTINES;E5; THIS ROUTINE WILL EXECUTE A GET DRIVE STATUS OR ANYN9; NON-INTERRUPTABLE FUNCTION AND WAIT FOR ITS COMPLETION.;: ; INPUTS:;; R1 = FUNCTION CODE; R2 = CSR ADDRESS; R5 = UCB ADDRESS;C ; OUTPUTS: ; R1 = CONTENTS OF RLCS (TESTED); FUNCTION EXECUTEDB;-<DLRST: MOV #RST!STS!MRK,RLDA(R2) ;SET MESSAGE CODES IN RLDA/ CALL DLDST ;DO THE DRIVE RESET FIRST ; PB242T?DLGST: MOV #STS!MRK,RLDA(R2) ;SET MESSAGE CODES IN 00`x_K_ÿ^DATADATADATADATADATADATADATARLDA ;**-1T5DLDST: MOV #GSTS,R1 ;SET GET STATUS FUNCTION ; PB242E/DLXCT: MOV R1,-(SP) ;SAVE FUNCTION CODE ;**-1T/ MOVB U.UNIT(R5),1(SP);MERGE CURRENT DRIVE BITSI MOV (SP)+,(R2) ;LOAD RLCS;10$: BIT #100200,(R2) ;FUNCTION COMPLETE OR ERROR? ; PB242U BEQ 10$ ;IF EQ NO ; PB2423 MOV (R2),R1 ;SAVE RLCS AND TEST FOR ERRORS ;**-2- RETURN ;V;+%; **-DLDIFF-RL11/RL01 DISK CONTROLLER (; CYLINDER ADDRESS DIFFERENCE CALCULATOR; <; THIS SUBROUTINE CALCULATES THE DIFFERENCE WORD USED IN THE@; SEEK OPERATION. IF A HEADER CANNOT BE READ AFTER 16. RETRIES,A; AN ERROR WILL BE LOGGED AND A ONE CYLINDER REVERSE SEEK WILL BER=; ISSUED. THE SEEK IS FOLLOWED BY A READ HEADERS TO CAUSE AN ; INTERRUPT.;( ; INPUTS:O; R0 = DESIRED DISK ADDRESSU; ;**-1Q ; OUTPUTS:; R1 = DIFFERENCE WORD$; RLDA = LOADED WITH DIFFERENCE WORD&; IF EQ NO SEEK IS NECESSARY ;**-1;-7DLDIFF: MOV #RETRY*2,-(SP) ;SET READ HEADER RETRY COUNT :10$: MOV #RDH,R1 ;CODE FOR READ HEADERS FUNCTION ; PB242* CALL DLXCT ;EXECUTE THE FUNCTION ;**-1. BPL 20$ ;IF PL FUNCTION EXECUTED OK ; PB242% DEC (SP) ;ANY RETRIES LEFT? ;**-1R BGT 10$ ;IF GT YES ; PB242 > CMP (SP)+,(SP)+ ;REMOVE RETRY COUNT AND CALLERS ADDRESS ;**-1 CALL DLDVER ;LOG HEADER ERROR  CALL DLRST ;RESET DRIVE15 MOV #REV,RLDA(R2) ;LOAD REVERSE SEEK DIFFERENCE WORDD) MOV #SEEK,R1 ;GET CODE FOR SEEK FUNCTION-7 MOV #IE.VER&377,R0 ;ASSUME THE SEEK WILL FAIL ; PB242N CALL DLXCT ;EXECUTE THE SEEK& BMI DLFIN ;IF MI WE FAILED ; PB242- BIC #377,R1 ;CLEAR OUT FUNCTION BITS ;**-1I+ BIS #IE!RDH,R1 ;LOAD CODES FOR READ HEADER @ MOVB #200,U.CW2+1(R5);INDICATE REVERSE SEEK IN PROGRESS ; PB242< MOVB S.ITM(R4),S.CTM(R4) ;SET DEVICE TIMEOUT COUNTER ;**-1# MOV R1,(R2) ;LOAD FUNCTION AND GOL! RETURN ;WAIT FOR THE INTERRUPTL-20$: TST (SP)+ ;REMOVE RETRY COUNT ; PB242V. MOV RLMP(R2),R1 ;RETREIVE HEADER WORD ;**-13DLDIF0: BIC #77,R0 ;MASK OUT SECTOR BITS ; PB228L BIC #77,R1 ;... ;**-2B% CMP R0,R1 ;DO WE NEED TO DO A SEEK?B BEQ 40$ ;IF EQ NO ; PB242/ MOV R0,-(SP) ;SAVE DESIRED DISK ADDRESS ;**-1D' BIC #^C<100>,(SP) ;ISOLATE SURFACE BIT ( ASR (SP) ;PUT INTO THE PROPER POSITION ASR (SP) ;... ! BIC #100,R0 ;REMOVE SURFACE BIT BIC #100,R1 ;...) SUB R0,R1 ;SUBTRACT DESIRED FROM ACTUALN.; BEQ 30$ ;IF EQ ONLY CHANGE SURFACE ; PB242- BCC 30$ ;IF CC ACTUAL .GE. DESIRED ; PB242D6 NEG R1 ;ACTUAL < DESIRED, MAKE POSITIVE DIFFERE;**-21 BIS #SN,R1 ;SET SIGN FOR MOVE TO CENTER OF DISKD'30$: INC R1 ;SET MARKER BIT ; PB242Q+ BIS (SP)+,R1 ;MERGE IN SURFACE BIT ;**-1I& MOV R1,RLDA(R2) ;LOAD DIFFERENCE WORD40$: RETURN ; ; PB242P ;**-2;+%; **-DLDXXX-RL11/RL01 DISK CONTROLLER,; ERROR LOGGING ROUTINES;CB; THIS ROUTINE IS CALLED WHENEVER A DEVICE ERROR OR DEVICE TIMEOUTD; OCCURS. A CORE BLOCK THE SIZE OF THE REGISTER BUFFER IS ALLOCATEDB; AND THE UNIBUS REGISTERS ALONG WITH THE DRIVE STATUS INFORMATIONB; ARE TRANSFERED INTO THE CORE BLOCK AND THE APPROPRIATE EXECUTIVE>; ERROR LOGGING ROUTINE IS CALLED. FINALLY, THE CORE BLOCK IS<; DEALLOCATED AND THE CSR AND CONTROLLER INDEX ARE RESTORED.; ?; IF FOR ANY REASON THE CORE BLOCK CANNOT BE ALLOCATED THEN THEKB; EXECUTIVE ERROR LOGGING ROUTINE WILL NOT BE CALLED AND THE ERRORA; SEQUENCE NUMBER WILL BE UPDATED TO INDICATE THAT A MISSED ERROR ; CONDITION OCCURRED.R;F ; INPUTS:C; R2 = CSR ADDRESS; R4 = SCB ADDRESS; ; OUTPUTS:#; R0, R1 ARE DESTROYED ; PB242T"; R3 = CONTROLLER INDEX ;**-1;- .ENABL LSB ; PB242NADLDVER: MOV #$DVERR,-(SP) ;ADDRESS OF EXEC ERROR ROUTINE ; PB242  BR 10$ ; ; PB242BDLDTER: MOV #$DTOER,-(SP) ;ADDRESS OF EXEC TIMEOUT ROUTINE ; PB24210$: TST (SP)+ ; PB242 BR 30$ ; PB242N9 MOV #RLCNT*2,R1 ;GET NUMBER OF BYTES TO ALLOCATE ; PB242E, CALL $ALOCB ;ALLOCATE A CORE BLOCK ;**-6- BCC 20$ ;IF CC BLOCK WAS ALLOCATED ; PB242S5 INC $ERRSQ ;INDICATE A MISSED ERROR CONDITION ;**-1R< CMP (SP)+,#$DTOER ;ALLOCATION FAILURE, TIMEOUT IN PROGRES00`€_T_4^eaek›’S? BNE 30$ ;IF NE NO ; PB2354 MOV @S.KRB(R4),R2 ;;;RETRIEVE CSR ADDRESS ; PB2350 BIC #IE,(R2) ;;;CLEAR INTERRUPT ENABLE ; PB235% MTPS #0 ;;;ALLOW INTERRUPTS ;**-2I7 BR 30$ ;DON'T LOG ERROR IF ALLOCATION FAILURE ; PB242 320$: MOV R0,R3 ;SET POINTER TO CORE BLOCK ; PB242C2 MOV @S.KRB(R4),R2 ;GET REAL CSR ADDRESS ; PB2354 CALL REGPAS ;MOVE REGISTERS INTO CORE BLOCK ;**-3$ MOV R0,R2 ;COPY CORE BLOCK ADDRESS. CALL @(SP)+ ;CALL EXEC ERROR LOGGING ROUTINE) MOV R2,R0 ;GET BACK CORE BLOCK ADDDRESS 3 MOV #RLCNT*2,R1 ;GET NUMBER OF BYTES TO DEALLOCATEC( CALL $DEACB ;DEALLOCATE THE CORE BLOCK030$: MOV S.KRB(R4),R3 ;GET KRB ADDRESS ; PB235- MOV (R3),R2 ;RETRIEVE CSR ADDRESS ; PB235F6 MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX ; PB235 RETURN ;**-3 .DSABL LSB ; PB242E;+@; MOVE THE CONTROLLER/DRIVE REGISTERS INTO THE SPECIFIED BUFFER.; ; INPUTS:V; R2 = CSR ADDRESS; R3 = BUFFER ADDRESSP;-!REGPAS: MOV (R2),(R3)+ ;MOVE RLCSV MOV RLBA(R2),(R3)+ ;MOVE RLBA MOV RLDA(R2),(R3)+ ;MOVE RLDA MOV RLMP(R2),(R3)+ ;MOVE RLMP& CLR (R3)+ ;ASSUME NO RLBAE ; PB2287 BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST? ; PB2283 BEQ 10$ ;IF EQ NO ; PB228+ MOV RLBAE(R2),-2(R3);MOVE RLBAE ; PB228E.10$: CLR (R3)+ ;EXTRA WORD IS BLANK ; PB2287 CALL DLGST ;EXECUTE GET DRIVE STATUS FUNCTION ; PB228I- MOV RLMP(R2),(R3) ;SAVE DRIVE STATUS ;**-1V RETURN ;A ; PB242;+ ; PB2423; **-DLVV-PROCESS VOLUME VALID FUNCTIONS ; PB242); ; PB242RD; THIS ROUTINE WILL VALIDATE VOLUME VALID AND HANDLE DEVICE ; PB2428; SPECIFIC VOLUME VALID AND SIZING FUNCTIONS. ; PB242; ; PB242 ; INPUTS: ; PB242&; R1 = I/O PACKET ADDRESS ; PB242; R4 = SCB ADDRESS ; PB242+; R5 = UCB ADDRESS ; PB242; ; PB242T; OUTPUTS: ; PB242 ?; IF THIS IS A TRANSFER FUNCTION ONLY R0 IS DESTROYED. ; PB242 @; IF THIS IS A VOLUME VALID FUNCTION, THE PROPER ACTION ; PB242?; IS TAKEN AND CONTROL IS TRANSFERED DIRECTLY TO THE ; PB242E+; PROPER PLACE IN THE DRIVER. ; PB242 ;- ; PB242 ; PB2423DLVV: CALL $VOLVD ;VALIDATE VOLUME VALID ; PB242N$ BCS 20$ ;IF CS WE FAILED ; PB242/ TST R0 ;IS THIS A TRANSFER FUNCTION? ; PB242  BMI 30$ ;IF MI YES ; PB242 2 MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS ; PB242- MOV R1,R3 ;COPY I/O PACKET ADDRESS ; PB242 1 CALL DLRST ;RESET DRIVE AND GET STATUS ; PB242U+ TST I.PRM+2(R3) ;SIZE THE DISK? ; PB242K BPL 10$ ;IF PL NO ; PB242% TST (SP)+ ;REMOVE RETURN ; PB242E0 CALLR DLPASS ;PASS REGISTERS AND EXIT ; PB242:10$: BIT #VV$SET,I.PRM+2(R3) ;SET VOLUME VALID? ; PB242 BEQ 25$ ;IF EQ NO ; PB2425 MOV RLMP(R2),R1 ;GET THE STATUS INFORMATION ; PB242?. BIT #DRDY,(R2) ;IS THE DRIVE READY? ; PB242 BEQ 20$ ;IF EQ NO ; PB2425 BIC #WLS!DT!HSS,R1 ;REMOVE IRRELEVANT BITS ; PB242 9 CMP #HH!BH!SLM,R1 ;HEADS, BRUSHES AND STATE OK? ; PB242U BEQ 25$ ;IF EQ YES ; PB242??20$: BICB #US.VV,U.STS(R5);CLEAR SOFTWARE VOLUME VALID ; PB242 2 MOV #IE.DNR&377,R0 ;SET DRIVE NOT READY ; PB242)25$: TST (SP)+ ;REMOVE RETURN ; PB242R# CALLR DLFIN ;FINISH UP ; PB242Q30$: RETURN ; ; PB242M ; PB235;+ ; PB2353; **-DLCHK-VALIDATE AND CONVERT THE LBN ; PB235 ; ; PB235 B; THIS ROUTINE IS CALLED FROM $DRQRQ TO DO LBN PROCESSING ; PB235B; FOR DEVICES WHICH SUPPORT QUEUE OPTIMIZATION. IF BLKC2 ; PB235B; DETECTS AN ERROR IT WILL RETURN TO THE CORRECT PLACE IN ; PB235+; $DRQRQ AFTER CALLING $IOALT. ; PB235R; ; PB235N; INPUTS: ; PB235&; R1 = I/O PACKET ADDRESS ; PB235; R4 = SCB ADDRESS ; PB235Q; R5 = UCB ADDRESS ; PB235 ; ; PB235 ; OUTPUTS: ; PB235V@; IF THE CHECKS SUCCEED, THEN THE LBN IN THE I/O PACKET ; PB235=; IS REPLACED BY THE DISK ADDRESS. R1 IS PRESERVED. ; PB235; ; PB235 A; IF THE CHECKS FAIL, THE $IOALT IS ENTERED WITH A FINAL ; PB235I@; STATUS OF IE.BLK AND A RETURN TO THE CORRE00`ˆ_K_ÿ^DATADATADATADATADATADATADATACT PLACE IN ; PB235"; $DRQRQ IS EXECUTED. ; PB235; ; PB235S+; R0, R2, AND R3 ARE DESTROYED. ; PB235 ; ; PB235SE; NOTE: ALL FUNCTIONS PUT INTO THE DRIVER QUEUE ARRIVE HERE. ; PB235 E; THESE FUNCTIONS INCLUDE, IO.ATT, IO.DET, AND ACP FUNCTIONS. ; PB235B;- ; PB235 ; PB235 ; PB2357DQCHK: CALL $LEKAS ;CHECK FOR AN ACP FUNCTION ; PB235/ BCS 30$ ;IF CS IT IS, LEAVE IT ALONE ; PB235A< CMPB #IO.ATT/256.,I.FCN+1(R1) ;IS THIS AN ATTACH? ; PB235- BEQ 30$ ;IF EQ YES, LEAVE IT ALONE ; PB235 ; CMPB #IO.DET/256.,I.FCN+1(R1) ;IS THIS A DETACH? ; PB235 - BEQ 30$ ;IF EQ YES, LEAVE IT ALONE ; PB235U1 MOV I.FCN(R1),-(SP) ;GET FUNCTION CODE ; PB235B. BIC #7,(SP) ;REMOVE QUALIFIER BITS ; PB2359 CMP #IO.STC,(SP)+ ;IS IT A SET CHARACTERISTICS? ; PB235;- BEQ 30$ ;IF EQ YES, LEAVE IT ALONE ; PB235C= MOV I.PRM+12(R1),R0 ;RETRIEVE STARTING BLOCK NUMBER ; PB235V> BITB #IO.WPB&377,I.FCN(R1) ;PHYSICAL BLOCK FUNCTION? ; PB235 BNE 20$ ;IF NE YES ; PB235 2 CALL $BLKC2 ;CHECK LOGICAL BLOCK NUMBER ; PB2359 CMPB #IO.WLB/256.,I.FCN+1(R3) ;WRITE FUNCTION? ; PB235Q BNE 10$ ;IF NE NO ; PB235@ BITB #IO.WLT&377,I.FCN(R3) ;WRITE LAST TRACK FUNCTION? ; PB235 BNE 10$ ;IF NE YES ; PB2358 MOV R0,I.PRM+6(R3) ;SAVE STARTING BLOCK NUMBER ; PB2355 ADD #20.,(R1) ;ADD 1 TRACKS WORTH OF BLOCKS ; PB235I- MOV R3,R1 ;COPY I/O PACKET ADDRESS ; PB235 2 CALL $BLKC2 ;CHECK LOGICAL BLOCK NUMBER ; PB235C MOV I.PRM+6(R3),R0 ;RESTORE ORIGINAL STARTING BLOCK NUMBER ; PB235 010$: ASL R0 ;CONVERT BLOCKS TO SECTORS ; PB235;20$: MOV S.PKT(R4),R3 ;RETRIEVE I/O PACKET ADDRESS ; PB235 ! CLR R2 ;NO HIGH BITS ; PB235,3 CALL $CVLBN ;CONVERT LBN TO DISK ADDRESS ; PB2351+ ASH #6,R1 ;POSITION SURFACE BIT ; PB2353/ BIS R1,R0 ;MERGE SURFACE WITH SECTOR ; PB235,= MOV R0,I.PRM+12(R3) ;SAVE SECTOR AND SURFACE ADDRESS ; PB235 = MOV R2,I.PRM+10(R3) ;SAVE STARTING CYLINDER ADDRESS ; PB235K- MOV R3,R1 ;COPY I/O PACKET ADDRESS ; PB235O30$: RETURN ; ; PB235  ; PB228;+ ; PB2287; **-DLKRB-CONTROLLER ONLINE/OFFLINE ROUTINE ; PB228 ; ; PB228BD; THIS ROUTINE WILL HANDLE RECONFIGURATION CALLS FOR ONLINE ; PB228J; CONTROLLER AND OFFLINE CONTROLLER FOR THE RL11, RLV11 AND RLV12. ; PB228; ; PB228AK; FOR ONLINE, IT WILL DETERMINE IF THE RLBAE REGISTER EXISTS AND IF ; PB228SH; SO, IT WILL INSURE THAT THE ADDRESS BITS ARE REPLICATED IN THE ; PB228; CSR. ; PB228; ; PB228B2; FOR OFFLINE, KS.EXT WILL BE CLEARED. ; PB228; ; PB2288; INPUTS: ; PB228; R2 = KRB ADDRESS ; PB228; R3 = CTB ADDRESS ; PB228E%; C=1 IF OFFLINE REQUEST ; PB228O$; C=0 IF ONLINE REQUEST ; PB228; ; PB228H; OUTPUTS: ; PB228PA; FOR ONLINE, KS.EXT WILL BE SET IF THE CONTROLLER HAS A ; PB228B; VALID RLBAE. ; PB228-; FOR OFFLINE, KS.EXT IS CLEARED. ; PB228S;- ; PB228 ; PB2288DQKRB: BIC #KS.EXT,K.STS(R2) ;ASSUME NO RLBAE ; PB228* BCS 20$ ;IF CS OFFLINE REQUEST ; PB2286 BIT #FE.EXT,$FMASK ;IS THIS A 22-BIT SYSTEM? ; PB228 BEQ 20$ ;IF EQ NO ; PB2286 CALL $SGFIN ;TURN NXM'S INTO SET CARRY BITS ; PB228- MOV (R2),R4 ;RETREIVE CSR ADDRESS ; PB228 6 BIS #A16!A17,(R4) ;SET EXTENDED ADDRESS BITS ; PB228* CLR RLBAE(R4) ;CLEAR RLBAE BITS ; PB228. BCS 10$ ;IF CS RLBAE DOES NOT EXIST ; PB2288 BIT #A16!A17,(R4) ;DID THE ADDRESS BITS CLEAR? ; PB228 BNE 10$ ;IF NE NO ; PB2288 BIS #KS.EXT,K.STS(R2) ;YES, SET RLBAE PRESENT ; PB228410$: BIC #A16!A17,(R4) ;RESET ADDRESS BITS ; PB22820$: RETURN ; ; PB228B ; PB228;+ ; PB2282; **-DLUCB-UNIT ONLINE/OFFLINE ROUTINE ; PB228; ; PB228 D; THIS ROUTINE WILL HANDLE RECONFIGURATION CALLS FOR ONLINE ; PB228;; UNIT AND OFFLINE UNIT FOR RL01 AND RL02 DRIVES. ; PB228$; ; PB228 F; FOR ONLINE, IF KS.EXT IS SET THEN DV.EXT IS ALSO SET. THIS ; PB228D; IS DONE TO ELIMINATE UNNECESSARY CODE TO RETREIVE THE KRB 00`�_a’_b“_c”_d–_k›’ ; PB228; ADDRESS. ; PB2280; ; PB228)-; FOR OFFLINE, DV.EXT IS CLEARED. ; PB228 ; ; PB228 ; INPUTS: ; PB228$; R3 = CONTROLLER INDEX ; PB228; R4 = SCB ADDRESS ; PB228B; R5 = UCB ADDRESS ; PB228R$; C=1 IF ONLINE REQUEST ; PB228%; C=0 IF OFFLINE REQUEST ; PB228D; ; PB228B; OUTPUTS: ; PB228 <; FOR ONLINE, DV.EXT IS SET IN THE UCB IF KS.EXT IS ; PB228; SET IN THE KRB. ; PB228N-; FOR OFFLINE, DV.EXT IS CLEARED. ; PB228D;- ; PB228 ; PB2288DQUCB: BIC #DV.EXT,U.CW1(R5) ;ASSUME NO RLBAE ; PB228* BCS 10$ ;IF CS OFFLINE REQUEST ; PB2281 MOV S.KRB(R4),R2 ;RETREIVE KRB ADDRESS ; PB228E7 BIT #KS.EXT,K.STS(R2) ;DOES THE RLBAE EXIST? ; PB228  BEQ 10$ ;IF EQ NO ; PB2286 BIS #DV.EXT,U.CW1(R5) ;YES, SET BIT IN UCB ; PB22810$: RETURN ; ; PB228  ;**-1 .ENDISET IN THE UCB IF KS.EXT IS ; PB228; SET IN THE KRB. ; PB228N-; FOR OFFLINE, DV.EXT IS CLEARED .TITLE DR1ST .IDENT /01/ ;; COPYRIGHT (C) 1981, 1982/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 01;; B. S. MCCARTHY 14-JUL-81;; MODIFIED BY:;;; THIS MODULE MARKS THE START OF THE FIRST DIRECTIVE COMMON;$DR1ST:: .END .TITLE DR1ND .IDENT /01/ ;; COPYRIGHT (C) 1981, 1982/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 01;; B. S. MCCARTHY 14-JUL-81;; MODIFIED BY:;9; THIS MODULE MARKS THE END OF THE FIRST DIRECTIVE COMMON;$DR1ND:: .END .TITLE NETLC .IDENT /01.02/ ;; COPYRIGHT (C) 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; VERSION 01;; J. E. PROVINO 21-SEP-78;; MODIFIED BY:;; J. FORECAST 19-OCT-78*; JF001 -- ADD ACTIVE LINE COUNT ($ACTLN);; J. FORECAST 22-OCT-80; JF002 -- NEW TIMER SUPPORT;+*; LOW CORE DATABASE FOR DECNET SUPPORT ;- .IF DF M$$NET8$PUMR:: .WORD 0 ; STARTING UMR BIAS FOR THIS PROCESSOR 2$UMRPT::.WORD 0 ; POINTER TO UMR ALLOCATION BLOCK ; FOR THIS PROCESSOR,$ACTLN::.WORD 0 ; COUNT OF ACTIVE NPR LINES .IF DF M$$PRO?$M100Q::.WORD 0,.-2 ; PROCESSOR DEPENDANT 100 MSEC TIMER QUEUEV .IFFP$M100Q:: .ENDC  .ENDC  9 T .END JF001 -- ADD ACTIVE LINE COUNT ($ACTLN);; J. FORECAST 22-OCT-80; JF002 -- NEW TIMER SUPPORT;+*; LOW CORE DATABASE FOR DECNET SUPPORT ;- .  .IIF NDF L$$CDA .TITLE CRASH! .IIF DF DL$$CD .TITLE DLCRSH ! .IIF DF DU$$CD .TITLE DUCRSH ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;B;$; P. J. BEZEREDI 24-OCT-77;I&; MODIFIED FOR RSX-11M-PLUS V2.0 BY:;$; P. J. BEZEREDI; B. S. MCCARTHY; R. T. PERRON; C. SESTOKAS ;E&; MODIFIED FOR RSX-11M-PLUS V2.1 BY:;; P. J. BEZEREDI ; T. LEKAS; B. S. MCCARTHY; J. M. LAWLER ; C. SESTOKAS !; S. M. THOMAS";N-"; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:"; "; J. W. BERZLE"; G. N. LARSEN"; J. M. LAWLER"; B. S. MCCARTHY"; M. PETTENGILL"; C. SESTOKAS"; J. G. WEHNER"; P. K. M. WEISS";C"; MODIFIED BY:";D"; C. SESTOKA00d˜_K_ÿ^DATADATADATADATADATADATADATAS 28-OCT-86 05.00";.,"; CS008 -- FIX DU CONTROLLER ONLINE CHECK";"; K. L. NOEL 19-AUG-86 05.01";F+"; KLN020 -- ADD SUPPORT FOR CRASH ON KXJEh;i;.j; CRASH DUMP ROUTINESYk; l; m; MACRO LIBRARY CALLSn;.%o .MCALL HWDDF$,BTJMP$,UDADF$,BGCK$A1 o .MCALL CPRDF$ ; KLN020 p UDADF$Z q HWDDF$Nq CPRDF$ ; KLN020rs; t; LOCAL MACROSu;Tv .MACRO PUSH ARG w SUB #2,SPx MOV ARG,(SP). y .ENDM PUSHz{|;I,}; C$$CDA = 0 LOADABLE CRASH DRIVER SUPPORT,~; C$$CDA = N RESIDENT CRASH DRIVER SUPPORT;KD€; WHEN RESIDENT CRASH DRIVER SUPPORT IS SELECTED, THIS MODULE WILLB�; INCLUDE THE EXECUTIVE CRASH CODE ALONG WITH A SPECIFIC DRIVER.‚;Dƒ; WHEN LOADABLE CRASH DRIVER SUPPORT IS SELECTED, THIS MODULE WILLD„; ONLY INCLUDE THE EXECUTIVE CRASH CODE. THIS MODULE IS ASSEMBLED>…; ONCE FOR EACH LOADABLE CRASH DRIVER AFTER THE EXECUTIVE IS?†; ASSEMBLED. WHEN THIS MODULE IS BEING ASSEMBLED FOR A CRASHI=‡; DRIVER THE FOLLOWING CONDITIONALS ARE DEFINED IN A PREFIXR ˆ; FILE:S"‰; L$$CDA - LOADABLE CRASH DRIVER%Š; XX$$CD - XX CRASH DRIVER SELECTED ‹Œ .IF DF C$$CDA� .IIF GT,C$$CDA R$CRSH = 0Ž .ENDC��.‘ .IF DF, L$$CDA ;IF ASSEMBLING CRASH DRIVER’,“ .NLIST CND ;DON'T LIST EXEC CRASH MODULE”• .IFF ; DF L$$CDAC– .PAGE— .IF DF C$$CDA˜™;+'š; **-$CRASH-SYSTEM CRASH DUMP ROUTINEF9›; **-$PANIC-SYSTEM CRASH DUMP ROUTINE (REF. ENTRY ONLY)Eœ;SD�; THIS ROUTINE IS ENTERED VIA A JUMP WHENEVER A FATAL SYSTEM ERRORž; (IOT) IS DETECTED.Ÿ;A ; THIS ROUTINE PERFORMS A MEMORY DUMP THAT CAN BE DIRECTED TO AC>¡; DISK OR TAPE. ONCE THE DUMP IS FINISHED THE SYSTEM MAY BE+¢; RE-BOOTED OR ANOTHER DUMP MAY BE TAKEN. C£; IF ENTRY IS AT $CRALT, IT IS ASSUMED THAT THE MEMORY MANAGEMENT"¤; REGISTERS ARE PROPERLY SET UP.¥;$ ¦; INPUTS:+§; ¨; KERNEL STACK©;D ª; OUTPUTS:«;*>¬; A CORE IMAGE OF THE SYSTEM IS DUMPED ONTO THE DUMP DEVICE.­;-®¯;+.°;**-$TRINT-GENERAL TRAP INTERCEPTION ROUTINE±; E²; THIS ENTRY POINT ADDRESS MAY BE PLACED IN ANY VECTOR TO ALLOW THEC-³; SETTING OF THE C BIT AND AN RTI EXECUTED.H´;-µ¶$TRINT:: ;REFERENCE LABEL ·3¸TRP04: BIS #1,2(SP) ;SET CARRY ON TRAPS THROUGH 4 ¹ RTI ;RETURNº»¼ .IFTF ;C$$CDA½¾ .IF DF M$$PRO¿À;P?Á; NOTE: THIS CODE ONLY WORKS PROPERLY FOR UP TO 4 PROCESSORS.4Â; MODIFICATIONS WILL HAVE TO BE MADE TO HANDLE THEÃ; DEC HARDWARE ALPHABET.Ä;Å/Æ$CRAL1::MOV #$STACK-4,SP ;POINT TO PS PC PAIRI5Ç MOV #$CRMS5,R1 ;GET ADDRESS OF MESSAGE TO BE TYPED &È MOV R4,R3 ;COPY PROCESSOR BIT MASKÉ BR WRMSG ;%Ê$CRAL2::ADD #6,SP ;CLEAN THE STACK 5Ë MOV #$CRMS4,R1 ;GET ADDRESS OF MESSAGE TO BE TYPEDY"Ì MOV R5,R3 ;COPY PROCESSOR MASK:ÍWRMSG: CALL $DISAN ;DISABLE SANITY TIMERS (ALL OF THEM)'Î CLR R0 ;INITIALIZE PROCESSOR NUMBER $Ï10$: CLC ;CLEAR CARRY FOR ROTATE#Ð ROR R3 ;ROTATE R3 RIGHT ONE BITTÑ BCS 30$ ;IF CS TYPE MESSAGEÒ BEQ 50$ ;IF EQ DONET3Ó BR 40$ ;INCREMENT PROCESSOR NUMBER AND GO AGAINT'Ô30$: MOV R0,R2 ;CALCULATE CPU LETTERRÕ ADD #'A,R2 ;Ö MOVB R2,$CRCPU ;R(× MOV R1,-(SP) ;SAVE ADDRESS OF MESSAGEØ CALL TYPE ;TYPE MESSAGEA,Ù MOV #$CRCPU,R1 ;GET ADDRESS OF CPU LETTER$Ú CALL TYPE ;TYPE PROCESSOR LETTER+Û MOV (SP)+,R1 ;RESTORE ADDRESS OF MESSAGE(Ü40$: INC R0 ;ADVANCE PROCESSOR NUMBERÝ BR 10$ ;GO AGAINÞß50$: ;REFERNCE LABELEàá .IF DF D$$DXDâ)ã CLR $DXDRL ;INDICATE DON'T JMP TO DXD äå .ENDC ; DF D$$DXDMæçè BR $CRASH ;GO DO THE CRASHéê .ENDC ;M$$PROëì .PAGEí;ACî; THIS ROUTINE IS ENTERED FROM THE DIRECTIVE DISPATCHER IF AN EMTM@ï; IS DONE AT SYSTEM STATE. THE PC PRIOR TO THE TRAP IS SAVED.ð; <ñ; IF WE GOT HERE DUE TO A BUGCHECK (EMT 374 OR 375) AND IFEò; THE FACILITY ERROR CODE AT $BCFAC IS ZERO THEN THE NEXT TWO WORDSBHó; IN THE I-STREAM AFTER THE EMT INSTRUCTION ARE THE FACILITY AND ERROR@ô; CODES. THESE CODES WILL BE STORED AND A CRASH WILL BE DONE.Hõ00d _’_b“_c”_d–_k›’; THIS ROUTINE IS ALSO CALLED WHEN AN IOT HAS OCCURED IN SYSTEM STATE.Dö; THIS IS USUALLY AS A RESULT OF AN OLD STYLE CRASH. IN THIS CASE@÷; THE FACILITY AND ERROR CODES WILL HAVE BEEN SETTUP BY SSTSR.Fø; THIS IS ALSO CALLED FOR A TRAP OR NON BUGCHECK EMT IN SYSTEM STATEAù; IN THIS CASE THE FACILITY AND ERROR CODES ARE FILLED IN AND AHú; CRASH IS DONE.û;ü0ý$CREMT::MOV (SP),$BCPC ;SAVE THE PRE-CRASH PC3þ TST $BCFAC ;HAVE THE CODES BEEN SAVED ALREADY?R"ÿ BNE $CRENT ;NE YES - GO CRASH- MOV (SP),-(SP) ;DUPLICATE PC ON THE STACKE3 SUB #2,(SP) ;POINT AT THE TRAP/EMT INSTRUCTIONF$ MFPI @(SP) ;GET THE INSTRUCTION( BIC #1,(SP) ;GET READY FOR THE TEST3 CMP (PC)+,(SP) ;IS THIS EMT 374/375 (BUGCHECK)?R  EMT 374( BEQ 20$ ;IF EQ YES - SAVE THE CODES8 BGCK$A BF.INT,BE.EMT,INTERNAL ;ASSUME EMT INSTRUCTION. CMPB #&377,1(SP) ;EMT INSTRUCTION?"  BEQ 10$ ;IF EQ YES - GO CRASH2  BGCK$A BF.INT,BE.TRP,INTERNAL ;TRAP INSTRUCTION( 10$: CMP (SP)+,(SP)+ ;CLEAN THE STACK  BR $CRENT ;GO CRASH# 20$: TST (SP)+ ;CLEAN THE STACKT, ADD #2,(SP) ;POINT TO THE FACILITY CODE& MFPI @(SP) ;GET THE FACILITY CODE MOV (SP)+,$BCFAC ;STORE IT, ADD #2,(SP) ;GET THE ERROR CODE ADDRESS' MFPI @(SP)+ ;GET THE FACILITY CODEE MOV (SP)+,$BCERR ;STORE IT;N .PAGE?; IF CDA SUPPORT IS INCLUDED IN THE SYSTEM THIS ENTRY WILL DOA; A CRASH DUMP. IF CDA SUPPORT IS NOT INCLUDED AND THIS IS NOTLB; A P/OS SYSTEM A HALT WILL BE DONE. IF THERE IS NO CDA SUPPORTA; AND THIS IS A P/OS SYSTEM R0 AND R1 WILL BE SETTUP AND A JUMP,D; INTO THE BOOT ROM WILL BE DONE TO DISPLAY THE FACILITY AND ERROR ; CODES.;+ $CRENT::$PANIC:: ;REFERENCE LABELR $CRASH::!" .IFF ;C$$CDA #$ .IF DF R$$PRO%'& MOV $BCFAC,R0 ;GET THE FACILITY CODE.$' MOV $BCERR,R1 ;GET THE ERROR CODE*( BTJMP$ ;HAVE THE ROM SHOW THE MESSAGE)* .IFF ;R$$PROR+*,60$: HALT ;WE DON'T HAVE CRASH SO HALT- BR 60$ ;OH NO YOU DON'T!./ .ENDC ;R$$PRO012 .IFT ;C$$CDAS3495 MOV #TRP04,@#4 ;SET UP TO SET CARRY ON TRAPS THROUGH 4 678 .IF DF M$$PRO9(: BIS #4,SR3 ;ENABLE KERNEL DATA SPACE); BIS #1,SR0 ;TURN ON MEMORY MANAGEMENT$< ;THIS TRANSFERS CONTROL TO THE*= ;CRASH ROUTINE IN THE PRIVATE MEMORY> ;FOR THIS PROCESSORC?@ .ENDCAB0C MOV (SP)+,$CRUPC ;SAVE USER PC FROM THE STACK0D MOV (SP)+,$CRUST ;SAVE USER PS FROM THE STACK>E$CRALT:: ;ALTERNATE ENTRY POINT USED BY 'X' COMMAND TO XDTFGH .IF DF M$$PROI4J CALL $DISAN ;DISABLE SANITY TIMERS (ALL OF THEM)KL .ENDCMNO .IF DF D$$DXDP(Q MOV KINAR5,$DXDK5 ;SAVE APR 5 FOR DXD R MOV $DXDRL,KINAR5 ;MAP TO DXD%S BEQ CRSH ;IF EQ DXD NOT INSTALLEDT(T JMP @$DXDEP ;JUMP TO DXD ENTRY POINT0U$DXDRT::MOV $DXDK5,KINAR5 ;RESTORE KERNEL APR5$V RTT ;RETURN FROM WHENCE WE CAME8WCRSH: MOV $DXDK5,KINAR5 ;RESTORE MAPPING FOR THE CRASHXY .ENDC ; DF D$$DXDZ[9\ MOV #TRP04,@#4 ;SET UP TO SET CARRY ON TRAPS THROUGH 4.]^_ .IF DF M$$PRO`#a CACHE$ BYPASS ;BYPASS THE CACHEEbc .ENDCdef .PAGEgAh; DUMP ALL VOLATILE PROCESSOR REGISTERS TO CRASH STACK ($CRSST),i4j TSTB $CRDMP ;HAVE REGISTERS ALREADY BEEN DUMPED?k BEQ 5$ ;NO IF EQ l JMP 70$ ;P"m5$: MOV PS,$CRSST ;STORE FULL PS=n MOV #PMODE!PR7,PS ;LOCK OUT INTERRUPTS, PREVIOUS MODE USERHo MOV SP,$CRSST-2 ;;;SAVE SPP2p MOV $CRUPC,$CRSST-4 ;;;SAVE PC BEFORE IOT CRASH2q MOV $CRUST,$CRSST-6 ;;;SAVE PS BEFORE IOT CRASH1r MOV #$CRSST-6,SP ;;;RESET SP TO INTERNAL STACKYs MFPI SP ;;;SAVE USER'S SPtuv .IF DF S$$LIBw3x MOV #PSMODE!PR7,PS ;;;SET PREVIOUS MODE TO SUPERAyz .ENDC{|} MFPI SP ;;;GET SUPER SPL*~ PUSH CPUERR ;;;SAVE CPU ERROR REGISTER- NOP ;;;THIS INSTRUCTION MUST BE HERE FORS+€ ;;;THE 11/60. UNLESS THE APPROPRIATEP(� ;;;ECO HAS BEEN APPLIED, ACCESSING$‚ ;;;THE CPU ERROR REGISTER WILL#ƒ ;;;CAUSE THE NEXT INSTRUCTION,„ ;;;T00d¨_K_ÿ^DATADATADATADATADATADATADATAO BE SKIPPED4… PUSH MEMERR ;;;SAVE MEMORY SYSTEM ERROR REGISTER/† PUSH MEMCTL ;;;SAVE MEMORY CONTROL REGISTER&‡ MOV R0,-(SP) ;;;SAVE REGISTER SET 1ˆ MOV R1,-(SP) ;;; ‰ MOV R2,-(SP) ;;;Š MOV R3,-(SP) ;;;P‹ MOV R4,-(SP) ;;;LŒ MOV R5,-(SP) ;;;S0� PUSH SR0 ;;;SAVE MEMORY MANAGEMENT REGISTERSŽ PUSH SR0+2 ;;;� PUSH SR0+4 ;;;� PUSH SR3 ;;;%‘ BIC #40,SR3 ;;;DISABLE UNIBUS MAP,4’ MOV #UINDR0,R0 ;;;SETUP TO SAVE FIRST SET OF APRS“ MOV #32.,R1 ;;;N”10$: PUSH (R0) ;;;SAVE APRP!• ADD #2,R0 ;;;MOVE TO NEXT ONES*– SOB R1,10$ ;;;LOOP UNTIL ALL ARE SAVED6— MOV #SISDR0,R0 ;;;SETUP TO SAVE SECOND SET OF APR'S˜ MOV #64.,R1 ;;;,™20$: PUSH (R0) ;;;SAVE APR!š ADD #2,R0 ;;;MOVE TO NEXT ONE(*› SOB R1,20$ ;;;LOOP UNTIL ALL ARE SAVED,œ MOV #UBMPR,R0 ;;;GET ADDRESS OF FIRST UMR*� MOV #62.,R1 ;;;NUMBER OF UMR'S TO SAVEž30$: PUSH (R0) ;;;SAVE A UMRU!Ÿ ADD #2,R0 ;;;MOVE TO NEXT ONET*  SOB R1,30$ ;;;LOOP UNTIL ALL ARE SAVED6¡ INCB $CRDMP ;;;PROCESSOR REGISTERS HAVE BEEN SAVED¢£ .PAGE¤;:¥; AT THIS POINT, THE FORMAT OF THE CRASH STACK (STARTING#¦; FROM THE BOTTOM, IS AS FOLLOWS:S§;M%¨; OFFSET REGISTER NAME ADDRESSS&©; ------ ------------- -------ª;;«; - - - - - - UNIBUS MAPPING REGISTERS - - - - - -;¬; 8­; $CRSST-540 UNIBUS MAP REGISTER 31 (HIGH HALF) 1703667®; $CRSST-536 UNIBUS MAP REGISTER 31 (LOW HALF) 170364; ¯; ... ...8°; $CRSST-350 UNIBUS MAP REGISTER 1 (HIGH HALF) 1702027±; $CRSST-346 UNIBUS MAP REGISTER 1 (LOW HALF) 170200A²;>³; - - - - - - MEMORY MANAGEMENT REGISTERS - - - - - -´;R9µ; $CRSST-344 KERNEL DATA SPACE ADDRESS REG. 7 172376R ¶; ... ...9·; $CRSST-326 KERNEL DATA SPACE ADDRESS REG. 0 172360 9¸; $CRSST-324 KERNEL INST SPACE ADDRESS REG. 7 172356 ¹; ... ...9º; $CRSST-306 KERNEL INST SPACE ADDRESS REG. 0 172340I9»; $CRSST-304 KERNEL DATA SPACE DESCRIPTOR REG. 7 172336C ¼; ... ...9½; $CRSST-266 KERNEL DATA SPACE DESCRIPTOR REG. 0 172320 9¾; $CRSST-264 KERNEL INST SPACE DESCRIPTOR REG. 7 172316- ¿; ... ...9À; $CRSST-246 KERNEL INST SPACE DESCRIPTOR REG. 0 172300 9Á; $CRSST-244 SUPER DATA SPACE ADDRESS REG. 7 172276S Â; ... ...9Ã; $CRSST-226 SUPER DATA SPACE ADDRESS REG. 0 172260 9Ä; $CRSST-224 SUPER INST SPACE ADDRESS REG. 7 172256S Å; ... ...9Æ; $CRSST-206 SUPER INST SPACE ADDRESS REG. 0 172240 9Ç; $CRSST-204 SUPER DATA SPACE DESCRIPTOR REG. 7 172236S È; ... ...9É; $CRSST-166 SUPER DATA SPACE DESCRIPTOR REG. 0 172220 9Ê; $CRSST-164 SUPER INST SPACE DESCRIPTOR REG. 7 172216S Ë; ... ...9Ì; $CRSST-146 SUPER INST SPACE DESCRIPTOR REG. 0 172200 9Í; $CRSST-144 USER DATA SPACE ADDRESS REG. 7 177676S Î; ... ...9Ï; $CRSST-126 USER DATA SPACE ADDRESS REG. 0 177660 9Ð; $CRSST-124 USER INST SPACE ADDRESS REG. 7 177656S Ñ; ... ...9Ò; $CRSST-106 USER INST SPACE ADDRESS REG. 0 177640 9Ó; $CRSST-104 USER DATA SPACE DESCRIPTOR REG. 7 177636S Ô; ... ...9Õ; $CRSST-066 USER DATA SPACE DESCRIPTOR REG. 0 177620 9Ö; $CRSST-064 USER INST SPACE DESCRIPTOR REG. 7 177616S ×; ... ...9Ø; $CRSST-046 USER INST SPACE DESCRIPTOR REG. 0 177600 Ù .PAGEÚ%Û; OFFSET REGISTER NAME ADDRESS%Ü; ------ ------------- ------- Ý;.@Þ; - - - - - - MEMORY MANAGEMENT CONTROL REGISTERS - - - - - -ß;#à; $CRSST-044 SR3 (MMR3) 172516N#á; $CRSST-042 SR2 (MMR2) 177576#â; $CRSST-040 SR1 (MMR1) 177574P#ã; $CRSST-036 SR0 (MMR0) 177572 ä;T:å; - - - - - - USERS GENERAL REGISTERS - - - - - -æ;Uç; $CRSST-034 USER R5 è; ... ...é; $CRSST-022 USER R0ê;TAë; - - - - - - MEMORY CONTROL/ERROR REGISTERS - - - - - - ì;S/í; $CRSST-020 MEMORY CONTROL REGISTER 177746-3î; $CRSST-016 MEMORY SYSTEM ERROR REGISTER 177744A*ï; $CRSST-014 CPU ERROR REGISTER 177766ð;C@ñ; - - - - - - STACK POINTERS, CRASH CONTEXT - - - - - -ò;'ó; $CRSST-012 SUPERVISOR STACK POINTERC!ô; $CRSST-010 USER STACK PO00d°_’_b“_c”_d–_k›’INTERT õ; $CRSST-006 PS PRIOR TO CRASH ö; $CRSST-004 PC PRIOR TO CRASH"÷; $CRSST-002 SP AT TIME OF CRASHø; $CRSST PS AFTER CRASHù .PAGEú'û; SET UP SYSTEM TO PERFORM CRASH DUMPRüýþÿ .IF DF M$$PRO- MOVB $PROC2,R0 ;;;GET PROCESSOR NUMBER * 2T .IFFY3 CLR R0 ;;;USE PROC 0 ON SINGLE PROCESSOR SYSTEMG .IFTF8  INC $CRFLG(R0) ;;;INDICATE (TO OTHER PROCESSORS) THAT+  ;;;THIS PROCESSOR HAS DUMPED ITS REGST   .IFF  .IF DF K$$DAS* BIS #4,SR3 ;;;ENABLE KERNEL DATA SPACE .ENDC* BIS #1,SR0 ;;;MAKE SURE MEM MGMT IS ON .IFTR8 TSTB $CRFPR ;;;IS THIS THE FIRST PROCESSOR TO CRASH? BGE 31$ ;;;IF GE NOP- MOVB $PROCN,$CRFPR ;;;SAVE ID OF PROCESSORE ! .IF NE M$$PRO-1"/# MOV $URMST,R1 ;;;DETERMINE ONLINE PROCESSORS$ BIC $CPMSK,R1 ;;;*% BIC $CPBIT,R1 ;;;EXCLUDE THIS PROCESSOR,& MOV #MP.CRH,R2 ;;;GET CRASH FUNCTION CODE3' CALL $IIFNX ;;;NOTIFY OTHER PROCESSORS TO CRASH3( CACHE$ BYPASS ;;;SET THE CACHE BYPASS BIT AGAIN.)* .IFTF+',31$: CALL $IIOPN ;;;OPEN UP THE IIST-. .IFTR/01 .ENDC ; NE M$$PRO-123 .IFTF ; DF M$$PRO45;B@6; IF WE'RE HERE DUE TO A BUGCHECK, OUTPUT THE BUGCHECK MESSAGE7;87 .IF NE C$$CDA-20 ; NOT CRASH TRHOUGH KXJ ; KLN0208)9 TST $BCFAC ;;;BUGCHECK FACILITY SET ?B: BEQ 315$ ;;;IF EQ NO+; MOV #$BCMSG,R0 ;;;POINT TO FIRST MESSAGEF%< MOV $BCPC,R3 ;;;GET PC OF BUGCHECK != CALL OCTSTR ;;;OUTPUT MESSAGEE,> MOV $BCFAC,R3 ;;;GET FACILITY OF BUGCHECK!? CALL OCTSTR ;;;OUTPUT MESSAGEN.@ MOV $BCERR,R3 ;;;GET ERROR CODE OF BUGCHECK!A CALL OCTSTR ;;;OUTPUT MESSAGE;B CALL TYPE ;;;OUTPUT TRAILEREC315$: ;;;REFERENCE LABEL &C .ENDC ; NE C$$CDA-20 ; KLN020DE .IFT ; DF M$$PROUFG .IF NE M$$PRO-1H2I MOV #$CRMS2,R1 ;;;INDICATE REGS HAVE BEEN SAVED!J CALL TYPE ;;;TYPE THE MESSAGEP0K MOV $CRKRB,R1 ;;;GET CRASH DEVICE KRB ADDRESS0L BEQ 35$ ;;;IF EQ ASSUME PROCESSOR HAS ACCESS?M BIT K.URM(R1),@$CPURM ;;;DOES THIS PROC HAVE ACCESS TO DISK?ON BNE 35$ ;;;YES IF NEO32$: JMP $CRSHT ;;;HALT*P35$: ASRB $CRLCK ;;;LOCK THE CRASH LOCK%Q BCC 32$ ;;;HALT IF LOCK IS LOCKED19R MOV #$CRMS1,R1 ;;;PROC IS WAITING FOR OTHERS TO FINISH !S CALL TYPE ;;;TYPE THE MESSAGE7T40$: MOV #,R0 ;;;GET NUMBER OF PROCESSORSE9U50$: BIT $BTMSK(R0),$URMST ;;;IS THIS PROCESSOR ONLINE?MV BEQ 55$ ;;;NO IF EQ 8W TST $CRFLG(R0) ;;;HAS PROCESSOR DUMPED ITS REGISTERS?3X BEQ 40$ ;;;IF EQ NO, WAIT FOR ALL PROCS TO DUMPC)Y55$: SUB #2,R0 ;;;CHECK NEXT PROCESSORIZ BGE 50$ ;;;GO AGAIN;[\ .ENDC]^_ .ENDC`a4b70$: MOV #PR7,PS ;;;MAKE SURE WE'RE AT PRIORITY 7cd0e .IF EQ, C$$CDA ;LOADABLE CRASH DRIVER SUPPORTf.g BIS #60,@#SR3 ;;; TURN ON MEMORY MANAGEMENT:h MOV @#$CRPAR,@#KINAR5 ;;; RELATIVE ADDRESS OF CRASH PARij .IF DF K$$DASk-l MOV @#$CRPAR,@#KDSAR5 ;;; MAP D SPACE ALSOTmn .ENDC ;DF K$$DASo&p BNE 80$ ;;; CRASH DRIVER IS LOADED)q MOV #$CRMS7,R1 ;;; MOVE IN THE MESSAGESr CALL TYPE ;;; TYPE IT OUTOs75$: HALT ;;; AND STOPt BR 75$ ;;; STOP !.u80$: JMP @120000 ;;; JMP TO CRASH PARTITIONvw .ENDC ; EQ, C$$CDAxy .ENDC ; DF C$$CDAz{ .ENDC ; DF L$$CDA|%} .IF DF, C$$CDA ;CRASH DUMP SUPPORTA4} .IF EQ C$$CDA-20 ; CRASH THROUGH KXJ ; KLN020} ; KLN0207}PBNH== 0 ; SET UP TO IGNORE THIS IN LOWCR ; KLN020A}PBNL== 0 ; KLN020$} ; KLN020} ; KLN020>} MOV $CSFSV,@#KXCSRF ;;; SET ALL OF MEMORY SHARED ; KLN020,} MOV $CSHSV,@#KXCSRH ;;; ... ; KLN020>} MOV $KXPTR,R0 ;;; GET ADDRESS OF KXJ DRIVER'S DCB ; KLN0206} MOV D.UCB(R0),R0 ;;; GET ADDRESS OF UCB ; KLN0206} MOV U.SCB(R0),R0 ;;; GET ADDRESS OF SCB ; KLN0206} MOV S.KRB(R0),R0 ;;; GET ADDRESS OF KRB ; KLN0204} MOV K.CSR(R0),R0 ;;; GET TPR0 ADDRESS ; KLN020?} MOV #RI$CRH,4(R0) ;;; SET CRASH NOTIFICATION CODE ; KLN020K;} MOV $KXVC1,R1 ;;; GET00d¸_K_ÿ^DATADATADATADATADATADATADATA ADDRESS OF FIRST VECTOR ; KLN020S8} ADD #4,R1 ;;; GET ADDRESS OF SECOND VECTOR ; KLN020A} MOV R1,@#KXJQIR ;;; NOTIFY HOST THROUGH VECTOR 2 ; KLN020A8}90$: HALT ;;; HALT TO LET HOST COPY MEMORY ; KLN020*} BR 90$ ;;; DON'T CONTINUE ; KLN020} ; KLN020%} .IFF ; EQ C$$CDA-20 ; KLN020R} ; KLN020~>; THE FOLLOWING CODE SHOULD BE ASSEMBLED INTO EXECUTIVE WHEN>€; RESIDENT CRASH DUMP DRIVER SUPPORT IS INCLUDED. IT SHOULD?�; BE INCLUDED IN THE CRASH DRIVER WHEN LOADABLE CRASH SUPPORT2‚; IS SELECTED.ƒ„8… .IF DF, L$$CDA!R$CRSH ;RESIDENT CRASH OR CRASH DRIVER†‡;F"ˆ; TYPE MESSAGE AND WAIT FOR USER‰;:Š‹AGAIN:Œ .IF DF, L$$CDA �%Ž MOV CRMS0,R1 ;;; TYPE USER MESSAGET�� .IFF0‘(’ MOV #$CRMS0,R1 ;;; USER CRASH MESSAGE“” .ENDC ; DF L$$CDA•– CALL TYPE ;;; — HALT ;;;WAIT FOR THE USER˜ JMP DUMP ;;;GO DUMP MEMORY™š›œ .IFTF ; DF L$$CDA!R$CRSHL�ž;+7Ÿ; **-OCTSTR-OUTPUT AN ASCIZ STRING, THEN OCTAL NUMBER , ; **-OCTOUT-OUTPUT OCTAL NUMBER TO CONSOLE¡;, ¢; INPUTS:H(£; R0=ADDRESS OF ASCIZ STRING IF OCTSTR¤; (RETURNED UPDATED) ¥; R3=BINARY VALUE TO OUTPUT¦;-§.¨OCTSTR: MOV R0,R1 ;;;COPY ADDRESS OF STRING© CALL TYPE ;;;OUTPUT IT&ª MOV R1,R0 ;;;UPDATE OUTPUT POINTER«¬ .IF DF, L$$CDA ; GL003L­7®OCTOUT: MOV BCBUF,R1 ;;;POINT TO SCRATCH AREA ; GL003;¯° .IFF ; DF L$$CDA ; GL003F±1²OCTOUT: MOV #$BCBUF,R1 ;;;POINT TO SCRATCH AREAA³´ .ENDC ; DF L$$CDA ; GL003µ!¶ MOV #6,R2 ;;;SET LOOP COUNTERC!·10$: MOV R3,R4 ;;;COPY RESIDUEA6¸ BIC #177770,R4 ;;;STRIP OFF ALL BUT LAST OCT. DIGIT,¹ ADD #60,R4 ;;;MAKE IT AN ASCII CHARACTER'º MOVB R4,-(R1) ;;;STORE THE CHARACTER .» ROR R3 ;;;SHIFT RESIDUE ONE RIGHT (WE KNOW'¼ ;;;C IS CLEAR FROM THE ADD ABOVE),0½ ASR R3 ;;;SHIFT TWO (C MAY NOT BE CLEAR, BUT ¾ ;;;NOW WE KNOW SIGN BIT IS¿ ASR R3 ;;;SHIFT THREEF+À SOB R2,10$ ;;;LOOP UNTIL SIX CHARACTERSR*Á ;;;FALL THROUGH TO TYPE ROUTINE WITH$ ;;;R1 POINTING TO SCRATCH AREAÃ;+!Ä; **-TYPE-TYPE AN ASCIZ MESSAGEÅ;# Æ; INPUTS:SÇ; R1=ADDRESS OF TEXT STRINGTÈ;-É9ÊTYPE: MOV #C$$RSH,R5 ;;;GET CSR ADDRESS OF PRINT DEVICET%Ë10$: MOVB (R1)+,R2 ;;;GET CHARACTER #Ì BEQ 40$ ;;;IF EQ END OF MESSAGECÍ CALL 30$ ;;;PRINT CHARACTER3Î CMPB #15,R2 ;;;CARRIAGE RETURN (OR LINE FEED) ? Ï BLT 10$ ;;;IF LT NOT EITHERR)Ð CLR R2 ;;;OUTPUT SOME FILL CHARACTERSP$Ñ MOV #5,R4 ;;;FIVE WILL BE ENOUGH!Ò20$: CALL 30$ ;;;OUTPUT A FILL !Ó SOB R4,20$ ;;;LOOP UNTIL DONE+Ô BR 10$ ;;;LOOP%Õ30$: TSTB (R5) ;;;IS DEVICE READY?Ö BPL 30$ ;;;IF PL NON#× MOVB R2,2(R5) ;;;PRINT CHARACTER;Ø40$: RETURN ;;;PÙÚÛ .IFT ; DF L$$CDA!R$CRSHÜÝ;+.Þ; **-CKSUM-VERIFY CHECKSUM OF DEVICE ADDRESSß; 4à; THIS ROUTINE WILL VERIFY THAT THE DEVICE ADDRESS(á; HAS NOT BEEN CORRUPTED BY THE CRASH.â;-ãäå .IF DF, L$$CDA ; GL003æ8çCKSUM: MOV @CRSBN,-(SP) ;;;GET HIGH ORDER BITS ; GL0030è ADD @CRSB2,(SP) ;;;ADD LOW ORDER BITS ; GL0033é CMP (SP)+,@CRSCS ;;;COMPARE WITH CHECKSUM; GL003)êë .IFF ; DF L$$CDA ; GL003$ì2íCKSUM: MOV @#$CRSBN,-(SP) ;;;GET HIGH ORDER BITS,î ADD @#$CRSBN+2,(SP) ;;;ADD LOW ORDER BITS.ï CMP (SP)+,@#$CRSCS ;;;COMPARE WITH CHECKSUMðñ .ENDC ; DF L$$CDA ; GL003òó BEQ 10$ ;;;IF EQ OK ô HALT ;;;WAIT FOR USERõ BR CKSUM ;;;TRY AGAIN.ö10$: RETURN ;;;F÷ø;+!ù; **-DUMP-DUMP THE SYSTEM IMAGE,ú; @û; THIS ROUTINE IS USED TO DUMP THE SYSTEM IMAGE ONTO THE CRASHCü; DUMP MEDIA. WHEN THE DUMP IS FINISHED THE SYSTEM MAY BE EITHER+ý; RE-BOOTED OR ANOTHER DUMP MAY BE TAKEN.:þ;@ ÿ; INPUTS: ; NONE. ; ; OUTUTS:@; IMAGE DUMPED.D;-#DUMP: ;;;DUMP IMAGE ONTO MEDIAA* .IF DF, L$$CDA ; LOADABLE CRASH DRIVER 8  MOV @CRKRB,R0 ;;; GET DUMP DEVICE KRB ADDRESS ; GL003-  BNE 5$ ;;; IF NE GET CSR FROM KRB ; GL003F8  MOV CRCSR,R0 ;;; GET ADDRESS OF WORD WITH CSR ADDRESS5 5$: MOV (R0),R0 ;;; G00dÀ_’_b“_c”_d–_k›’ET CSR OF DUMP DEVICE ; GL003C- ;;; (K.CSR IS GUARANTEED TO BE 0);GL003D- MOV @CRSUN,R3 ;;; GET UNIT NUMBER ; GL003O .IFF ; DF L$$CDA ; GL0031 MOV @#$CRKRB,R0 ;;;GET DUMP DEVICE KRB ADDRESSU$ BNE 5$ ;;;IF NE GET CSR FROM KRB9 MOV #$CRCSR,R0 ;;;GET ADDRESS OF WORD WITH CSR ADDRESSR,5$: MOV (R0),R0 ;;;GET CSR OF DUMP DEVICE& ;;;(K.CSR IS GUARANTEED TO BE 0)% MOV @#$CRSUN,R3 ;;;GET UNIT NUMBERC .ENDC ; DF L$$CDA ; GL003/DUMP1: ;;;DUMMY LABEL SO DUMP ROUTINES CAND) ;;;USE ANY LOCAL LABEL THEY WANT TOE  ;;;USE ! .IFTF ; DF L$$CDA!R$CRSHU"#$ .IF EQ C$$CDA-1%&;D'; DT(;@); THIS ROUTINE DUMPS ALL OF PHYSICAL MEMORY UP TO A MAXIMUM OF*; 124K WORDS+;B,-,.PBNH== 0 ;;;HIGH ORDER TC11 BLOCK NUMBER+/PBNL== 1 ;;;LOW ORDER TC11 BLOCK NUMBER 051 CALL CKSUM ;;;CHECK BLOCK NUMBER AGAINST CHECKSUMR!2 SWAB R3 ;;;POSITION UNIT BITS.3 MOV R3,R1 ;;;COPY3.4 BIS #4003,R1 ;;;SET FOR READ LBN IN REVERSE!5 MOV R1,(R0) ;;;START THE TAPEL*610$: BIT #100200,(R0) ;;;ERROR OR READY?7 BEQ 10$ ;;;IF EQ NO(8 BPL DUMP ;;;IF PL MOVE UNTIL ENDZONE'920$: MOV R3,R1 ;;;RETRIEVE UNIT BITSH(: BIS #3,R1 ;;;SET TO READ LBN FORWARD!; MOV R1,(R0) ;;;START THE TAPE;*<30$: BIT #100200,(R0) ;;;ERROR OR READY?$= BMI DUMP ;;;IF MI ERROR, RESTART> BEQ 30$ ;;;IF EQ WAITC6? SUB @#$CRSBN+2,6(R0);;;ARE WE AT THE BLOCK WE WANT?@ BNE 20$ ;;;IF NE NOC/A CLR 2(R0) ;;;SET WRITE ALL OF MEMORY (UP TOR.B CLR 4(R0) ;;;TO 124K) IN 64K WORD SEGMENTS#C MOV R3,R1 ;;;RETRIEVE UNIT BITS+D BIS #15,R1 ;;;SET TO WRITE DATA FORWARD #E MOV R1,(R0) ;;;WRITE ALL MEMORY !F50$: CLR 2(R0) ;;;KEEP WRITING1G TST (R0) ;;;ANY ERRORS?H BPL 50$ ;;;IF PL NOT)I BIT #400,-2(R0) ;;;NONEXISTENT MEMORY?OJ BEQ WERR ;;;IF EQ NO, RETRYR!K BIS #1,R3 ;;;SET TO STOP TAPEWL MOV R3,(R0) ;;;STOP TAPE M BR $CRSHT ;;;SUCCESS, FINISHNO .ENDCPQR .IF EQ C$$CDA-2ST;AU; DKV;P=W; IF THE EXECUTIVE DOES NOT SUPPORT 22-BIT ADDRESSING, THIS,;X; ROUTINE DUMPS ALL OF PHYSICAL MEMORY UP TO A MAXIMUM OFTY; 124K WORDS.VZ;R=[; IF THE EXECUTIVE SUPPORTS 22-BIT ADDRESSING, THIS ROUTINE>\; DUMPS ALL OF PHYSICAL MEMORY UP A MAXIMUM OF APPROXIMATELY0]; 1.2 MEGAWORDS OF MEMORY (FILLS UP THE RK05).^; _,`PBNH== 0 ;;;HIGH ORDER RK11 DISK ADDRESS+aPBNL== 1 ;;;LOW ORDER RK11 DISK ADDRESSSb5c CALL CKSUM ;;;CHECK DISK ADDRESS AGAINST CHECKSUM%d ASH #13.,R3 ;;;POSITION UNIT BITSU)e MOV #401,(R0) ;;;RESET RK11 CONTROLLERI1f BIS @#$CRSBN+2,R3 ;;;SET STARTING DISK ADDRESSA#g MOV R3,6(R0) ;;;SET DISK ADDRESS'h CLR @#UBMPR ;;;INITIALIZE FIRST UMREi CLR @#UBMPR+2 ;;;... 8j BIS #60,@#SR3 ;;;ENABLE 22-BIT MAPPING AND UNIBUS MAP2k ;;;(KERNEL D HAS BEEN CONDITIONALLY ENABLED)'l40$: MOV 6(R0),R3 ;;;GET DISK ADDRESS 1m BIC #160017,R3 ;;;EXTRACT CYLINDER AND SURFACED0n CMP #14420,R3 ;;;ABOUT TO WRITE CYLINDER THAT#o ;;;CANNOT ORDINARILY BE READ?P)p BEQ $CRSHT ;;;IF EQ YES, STOP WRITINGE,q CLR 4(R0) ;;;INITIALIZE TRANSFER ADDRESS2r MOV #-6000,2(R0) ;;;WRITE 3K WORDS (1 CYLINDER)#s MOV #403,(R0) ;;;START THE WRITEL*t45$: BIT #100200,(R0) ;;;ERROR OR READY?u BEQ 45$ ;;;IF EQ NO2v BMI 50$ ;;;IF MI ERROR6w ADD #14000,@#UBMPR ;;;POINT TO NEXT 3K WORD SEGMENTx ADC @#UBMPR+2 ;;;...D*y BR 40$ ;;;GO AGAIN UNTIL END OF MEMORY.z50$: BIT #2000,-2(R0) ;;;NONEXISTENT MEMORY? { BNE $CRSHT ;;;YES IF NE HALT|} .ENDC~€ .IF EQ C$$CDA-3�‚; ƒ; MT„;N>…; THIS ROUTINE DUMPS ALL OF PHYSICAL MEMORY (UP TO A MAXIMUM;†; OF 124K WORDS) IN 512 BYTE RECORDS AT 800 BPI (9-TRACK)R‡; ˆ-‰PBNH== 0 ;;;BLOCK NUMBER IGNORED FOR TM11ŠPBNL== 0 ;;;‹(Œ SWAB R3 ;;;POSITION UNIT SELECT BITS-� BIS #60001,R3 ;;;MERGE DENSITY AND GO BITSŽ MOV R3,R2 ;;;COPY%� BIS #16,R2 ;;;SET REWIND FUNCTIONO#� MOV R2,(R0) ;;;START THE REWINDS*‘10$: BIT #100200,(R0) ;;;ERROR OR READY?"’ BMI WERR ;;;IF MI 00dÈ_K_ÿ^DATADATADATADATADATADATADATAERROR, RETRY“ BEQ 10$ ;;;IF EQ NO "” CLR (R0) ;;;CLEAR MTC REGISTER*• CLR 4(R0) ;;;START TO WRITE ALL MEMORY"– MOV R3,R2 ;;;RETRIEVE MTC BITS(— BIS #4,R2 ;;;SET WRITE DATA FUNCTION˜ BIC #1,R2 ;;;CLEAR GO BIT1$™ MOV R2,(R0) ;;;LOAD MTC REGISTER3š30$: MOV #500,R1 ;;;WAIT FOR TAPE TO SETTLE DOWNG›35$: DEC R1 ;;;WAITœ BNE 35$ ;;;IF NE LOOPB,� MOV #-512.,2(R0) ;;;SET 512. BYTE RECORDS"ž BIS #1,(R0) ;;;START THE WRITE*Ÿ40$: BIT #100200,(R0) ;;;ERROR OR READY?  BEQ 40$ ;;;IF EQ NOY#¡ BPL 30$ ;;;IF PL WRITE FINISHED0&¢ TSTB -2(R0) ;;;NONEXISTENT MEMORY?£ BPL WERR ;;;IF PL NO, RETRYM"¤ MOV R3,R2 ;;;RETRIEVE MTC BITS&¥ BIS #10000,R2 ;;;SET CLEAR FUNCTION ¦ MOV R2,(R0) ;;;LOAD FUNCTION§50$: TSTB (R0) ;;;READY?T¨ BPL 50$ ;;;IF PL NO;'© BIS #6,R3 ;;;SET WRITE EOF FUNCTIONC#ª MOV R3,(R0) ;;;DO THE WRITE EOFO«60$: TSTB (R0) ;;;READY?T¬ BPL 60$ ;;;IF PL NOS"­ CLR (R0) ;;;CLEAR MTC REGISTER&® BR $CRSHT ;;;SUCCESSFUL COMPLETION¯° .ENDC±²³ .IF EQ C$$CDA-4´µ;F¶; MM·;T9¸; THIS ROUTINE DUMPS ALL OF PHYSICAL MEMORY IN 512 BYTE ¹; RECORDS AT 800 BPIº;I».¼PBNH== 0 ;;;BLOCK NUMBER IGNORED FOR TJU16½PBNL== 0 ;;;¾'¿ BIS (PC)+,R3 ;;;SET MODE AND DENSITYT8À$TDNSY::.WORD 1300 ;;;DEFAULT TO 800 BPI, NORMAL MODE/Á MOV @#$CRSFM,R2 ;;;RETRIEVE FORMATTER NUMBER& CALL 120$ ;;;SELECT FORMATTER/UNIT1à MOV 26(R0),R4 ;;;RETRIEVE DEVICE TYPE REGISTER+Ä BIT #40000,R4 ;;;IS THIS A MASSBUS TAPE?Å BEQ 10$ ;;;IF EQ NO +Æ BIT #10000,10(R0) ;;;NON EXISTENT DRIVE?RÇ BNE WERR ;;;IF NE, YES.M#È BIT #50,R4 ;;;TM02/3 FORMATTER?0É BNE 20$ ;;;IF NE YES+Ê10$: MOV #$CRMS6,R1 ;;;NO, ILLEGAL DEVICE=/Ë BR WERR1 ;;;PRINT OUT MESSAGE AND TRY AGAINS-Ì20$: BIT #2000,R4 ;;;IS SLAVE UNIT PRESENT?PÍ BEQ WERR ;;;IF EQ NO&Î CLR @#$CRBAE ;;;INITIALIZE BAE FLAG"Ï MOV R0,R4 ;;;;COPY CSR ADDRESS3Ð ADD #26,R4 ;;;ADD OFFSET TO DRIVE TYPE REGISTER3Ñ30$: ADD #2,R4 ;;; R4 > REGISTER (11/24 PROBLEM)Q'Ò TST (R4) ;;; DEVICE REGISTER THERE?;Ó BCC 30$ ;;;IF CC IT EXISTS/Ô SUB #34,R4 ;;;SUB # OF DEVICE REGISTERS + 2RÕ SUB R0,R4 ;;;$,Ö BNE 40$ ;;;IF NE IT'S AN RH70 CONTROLLER+× COM @#$CRBAE ;;;IT'S NOT, RESET BAE FLAGS2Ø CLR @#UBMPR ;;;AND INITIALIZE FIRST UNIBUS ...*Ù CLR @#UBMPR+2 ;;;;... MAPPING REGISTERS<Ú40$: BIS #60,@#SR3 ;;;ENABLE 22 BIT MAPPING AND UNIBUS MAP7Û MOV #<4*4>,R5 ;;;NUMBER OF 512 BYTE RECORDS/4K BLOCKG&Ü CALL 120$ ;;;SELECT FORMATTER/UNIT+Ý MOV #7,(R0) ;;;START THE TAPE REWINDING Þ MOV #40000,R1 ;;;PAUSE$)ß50$: SOB R1,50$ ;;;LOOP FOR DELAY TIME :à60$: BIT #20000,12(R0) ;;;POSITIONING STILL IN PROGRESS?á BNE 60$ ;;;IF NE YESâ TSTB 12(R0) ;;;DRIVE READY?Oã BPL 60$ ;;;IF PL NOR*ä MOV #60,(R0) ;;;LOAD THE WRITE FUNCTION+å CLR 4(R0) ;;;SET TO WRITE ALL OF MEMORY)æ70$: MOV #-256.,2(R0) ;;;SET WORD COUNTN&ç MOV #-512.,6(R0) ;;;SET FRAME COUNT/è BIS #1,(R0) ;;;START TO WRITE ALL OF MEMORY #é80$: TSTB 12(R0) ;;;DRIVE READY?Rê BPL 80$ ;;;IF PL NOI#ë DEC R5 ;;;DECREMENT BLOCK COUNT"ì BNE 100$ ;;;IF NE USE SAME UMR.í TST @#$CRBAE ;;;;IS THE BAE REGISTER THERE?î BEQ 90$ ;;;IF EQ YES?ï ADD #<1024.*4*2>,@#UBMPR ;;;NO, POINT UMR TO NEXT 4K OF MEM;#ð ADC @#UBMPR+2 ;;;DOUBLE WORD ADDH"ñ CLR 4(R0) ;;;RESET BUS ADDRESS0ò90$: MOV #<4*4>,R5 ;;;RESET TO # BLOCKS PER 4K+ó100$: BIT #40000,(R0) ;;;TRANSFER ERRORS?Sô BEQ 70$ ;;;IF EQ NO,*õ BIT #4000,10(R0) ;;;NONEXISTENT MEMORY?ö BEQ WERR ;;;IF EQ NO&÷ CALL 130$ ;;;SELECT FORMATTER/UNIT$ø MOV #27,(R0) ;;;WRITE EOF ON TAPE,ù110$: TSTB 12(R0) ;;;IS TAPE DRIVE READY?ú BPL 110$ ;;;IF PL NO)û CLR (R0) ;;;CLEAR CONTROLLER REGISTER2&ü BR $CRSHT ;;;SUCCESSFUL COMPLETION-ý120$: BIS #40,10(R0) ;;;RESET RH CONTROLLERD$þ MOV R2,10(R0) ;;;SELECT FORMATTERÿ MOV R3,32(R0) ;;;SELECT UNITO0130$: TSTB 12(R0) ;;;IS THE TAPE DRIVE READY? BPL 130$ ;;;IF PL NO RETURN ;;;EXIT# .ENDC! .IIF EQ C$$CDA-5 CDA$DB=0 ;;; " 00dÐ_’_b“_c”_d–_k›’ .IIF EQ C$$CDA-11 CDA$DR=0 ;;;   .IF DF CDA$DB!CDA$DRE  ;E ; DB AND DR1; >; THE LOCAL SYMBOLS REFERENCED ABOVE, CDA$DB AND CDA$DR, ARE:; USED WITHING THE FOLLOWING COMMON CODE DRIVER BELOW TO<; DIFFERENTIATE BETWEEN RP04/5/6 AND RM02/3/5 TYPE DRIVES.;R-; THIS ROUTINE DUMPS ALL OF PHYSICAL MEMORY;;E(PBNH== 0 ;;;DEFAULT CYLINDER ADDRESS0PBNL== 1 ;;;DEFAULT TRACK AND SECTOR ADDRESS5 CALL CKSUM ;;;CHECK DISK ADDRESS AGAINST CHECKSUMB( MOV #40,10(R0) ;;;RESET RH CONTROLLER  MOVB R3,10(R0) ;;;SELECT UNIT1 MOV 26(R0),R4 ;;;RETRIEVE DEVICE TYPE REGISTERY+ BIT #40000,R4 ;;;IS THIS A MASSBUS DISK?E BNE 5$ ;;;IF NE NO)  BIC #^C<777>,R4 ;;;CLR EXTRANEOUS BITSI+! BIT #20,R4 ;;;IS IT A DISK OF INTEREST?E" BEQ 5$ ;;;IF EQ NO+# CMP #25,R4 ;;;IS IT RP04/5/6 OR RM02/3?$ BHIS 10$ ;;;IF HIS YES% CMP #27,R4 ;;;IS IT RM05?;& BEQ 10$ ;;;IF EQ YES*'5$: MOV #$CRMS6,R1 ;;;NO, ILLEGAL DEVICE+( BR WERR1 ;;;PRINT MESSAGE AND TRY AGAIN;*)10$: CLR @#$CRBAE ;;;INITIALIZE BAE FLAG"* MOV R0,R4 ;;;;COPY CSR ADDRESS3+ ADD #26,R4 ;;;ADD OFFSET TO DRIVE TYPE REGISTERI>,20$: ADD #2,R4 ;;; R4 > register (11/24 and 11/84 problem)."- TST (R4) ;;; Device reg there?. BCC 20$ ;;;IF CC IT EXISTS// SUB #50,R4 ;;;SUB # OF DEVICE REGISTERS + 2 0 SUB R0,R4 ;;;,1 BNE 30$ ;;;IF NE IT'S AN RH70 CONTROLLER+2 COM @#$CRBAE ;;;IT'S NOT, RESET BAE FLAG$23 CLR @#UBMPR ;;;AND INITIALIZE FIRST UNIBUS ...*4 CLR @#UBMPR+2 ;;;;... MAPPING REGISTERS<530$: BIS #60,@#SR3 ;;;ENABLE 22 BIT MAPPING AND UNIBUS MAP%6 MOV #40,10(R0) ;;;CLEAR CONTROLLER 7 MOVB R3,10(R0) ;;;SELECT UNIT(8 MOV #23,(R0) ;;;DO A PACK ACKNOWLEDGE)9 MOV @#$CRSBN,34(R0) ;;;SELECT CYLINDER?.: MOV @#$CRSBN+2,6(R0);;;SET SECTOR AND TRACK$; CLR 4(R0) ;;;ZERO BUFFER ADDRESS)< MOV #14000,32(R0) ;;;SET 16-BIT FORMAT 7=40$: MOV #-<256.*4*4>,2(R0) ;;;WORD COUNT = 4K WORDSE0> MOVB #61,(R0) ;;;START TO WRITE ALL OF MEMORY2?50$: MOV #10,-(SP) ;;; Stack - delay loop count.8@51$: BIS -(SP),(SP)+ ;;; Delay for 11/84 (DR) problem.A DEC (SP) ;;; End of delay?,B BNE 51$ ;;; IF NE, No - delay some more.!C TST (SP)+ ;;; Maintain stack.O&D BIT #100200,(R0) ;;;READY OR ERROR?E BEQ 50$ ;;;IF EQ NEITHER.F TST @#$CRBAE ;;;;IS THE BAE REGISTER THERE?G BEQ 60$ ;;;IF EQ YES?H ADD #<1024.*4*2>,@#UBMPR ;;;NO, POINT UMR TO NEXT 4K OF MEM0#I ADC @#UBMPR+2 ;;;DOUBLE WORD ADD "J CLR 4(R0) ;;;RESET BUS ADDRESS)K60$: BIT #40000,(R0) ;;;TRANSFER ERROR?yL BEQ 40$ ;;;IF EQ NO-0M BIT #4000,10(R0) ;;;NONEXISTENT MEMORY ERROR?+N BNE $CRSHT ;;;IF NE YES, ELSE I/O ERRORFOP .ENDCQRS .IF EQ C$$CDA-6TU;aV; DMW;B=X; IF THE EXECUTIVE DOES NOT SUPPORT 22-BIT ADDRESSING, THISR;Y; ROUTINE DUMPS ALL OF PHYSICAL MEMORY UP TO A MAXIMUM OF Z; 124K WORDS.A[;1=\; IF THE EXECUTIVE SUPPORTS 22-BIT ADDRESSING, THIS ROUTINE@!]; DUMPS ALL OF PHYSICAL MEMORY.R^;)<_; NOTE THAT THE STANDARD METHOD OF DUMPING ALL OF PHYSICAL<`; MEMORY (DUMPING UNTIL THE CONTROLLER DETECTS NONEXISTENTDa; MEMORY) DOES NOT WORK, BECAUSE THE RK611 WRITES AN UNCORRECTABLEBb; ECC ERROR IN THE LAST SECTOR IT WRITES UNDER THOSE CONDITIONS.c;Ed-ePBNH== 0 ;;;RK06 DEFAULT CYLINDER ADDRESSR0fPBNL== 1 ;;;DEFAULT SECTOR AND TRACK ADDRESSg5h MOV #TRP04,@#114 ;;;POSITION TRAP CATCHER FOR NON-S#i ;;;EXISTENT MEMORY TRAPS WHENN'j ;;;SIZE REGISTER > SIZE OF MEMORY5k CALL CKSUM ;;;CHECK BLOCK NUMBER AGAINST CHECKSUM %l CLR R2 ;;;ASSUME DRIVE IS AN RK06 .m MOV #40,10(R0) ;;;CLEAR THE RK611 SUBSYSTEM#n MOV R3,10(R0) ;;;SELECT THE UNITN,o MOV #1,(R0) ;;;SELECT THE DRIVE FUNCTIONp10$: TSTB (R0) ;;;READY?Iq BPL 10$ ;;;IF PL NO=&r BIT #400,12(R0) ;;;IF THIS AN RK07?%s BEQ 20$ ;;;IF EQ NO, IT'S AN RK06Kt BIS #2000,R2 ;;;SET RK07 BIT 2u20$: MOV #40,10(R0) ;;;CLEAR THE RK611 SUBSYSTEM#v MOV R3,10(R0) ;;;SELECT THE UNITE$w MOV R2,R1 ;;;COPY DRIVE TYPE BIT+x BIS #3,R1 ;;;GET PACK ACK FUNCTION CODE(00dØ_K_ÿ^DATADATADATADATADATADATADATAy MOV R1,(R0) ;;;DO A PACK ACKNOWLEDGEz30$: TSTB (R0) ;;;READY?6{ BPL 30$ ;;;IF PL NO0$| MOV 12(R0),R1 ;;;GET DRIVE STATUS} COM R1 ;;;COMPLEMENT'~ BIT #100301,R1 ;;;DRIVE READY TO GO?B# BNE WERR ;;;IF NE NO, TRY AGAINR'€ MOV @#$CRSBN,20(R0) ;;;LOAD CYLINDER +� MOV @#$CRSBN+2,6(R0);;;LOAD SECTOR/TRACKR$‚ BIS #23,R2 ;;;SET WRITE FUNCTION'ƒ CLR @#UBMPR ;;;INITIALIZE FIRST UMR;„ CLR @#UBMPR+2 ;;;...V8… BIS #60,@#SR3 ;;;ENABLE 22-BIT MAPPING AND UNIBUS MAP2† ;;;(KERNEL D HAS BEEN CONDITIONALLY ENABLED),‡ MOV #140000,R5 ;;;SET TO MAP THROUGH APR61ˆ CLR @#KISAR6 ;;;POINT AT FIRST BYTE OF 4K WORDT!‰ MOV #77406,@#KISDR6 ;;;SEGMENTB5Š50$: CLR 4(R0) ;;;START AT BEGINNING OF MEMORY ...F‹ ;;;... OR UNIBUS MAP2Œ MOV #-2000,2(R0) ;;;WRITE 1K WORDS PER TRANSFER � BIS R2,(R0) ;;;START WRITING*Ž60$: BIT #100200,(R0) ;;;READY OR ERROR?� BEQ 60$ ;;;IF EQ NEITHER� BMI WERR ;;;IF MI ERRORB6‘ ADD #4000,@#UBMPR ;;;POINT TO NEXT 1K WORD BOUNDARY’ ADC @#UBMPR+2 ;;;2“ ADD #40,@#KISAR6 ;;;POINT AT FIRST WORD OF NEXT” ;;;TRANSFER6=• CMP #170000,@#KISAR6 ;;;IS IT ABOVE HIGHEST POSSIBLE WORD?7– BEQ $CRSHT ;;;IF EQ YES00— TST (R5) ;;;DOES FIRST WORD OF NEXT TRANSFER˜ ;;;EXIST? ™ BCC 50$ ;;;IF CC YESš BR $CRSHT ;;;DONE ›œ .ENDC�žŸ .IIF EQ C$$CDA-7 CDA$DL=0 ¡¢ .IF DF CDA$DL!DL$$CD!H$$GEN£¤¥;;¦; DL§;E¨; IF THE EXECUTIVE DOES NOT SUPPORT 22-BIT ADDRESSING, THIS ROUTINEW?©; DUMPS ALL OF PHYSICAL MEMORY UP TO A MAXIMUM OF 124K WORDS.Aª;S=«; IF THE EXECUTIVE SUPPORTS 22-BIT ADDRESSING, THIS ROUTINEI!¬; DUMPS ALL OF PHYSICAL MEMORY.­;Q<®; NOTE THAT THE STANDARD METHOD OF DUMPING ALL OF PHYSICAL@¯; MEMORY (DUMP MEMORY UNTIL THE CONTROLLER DETECTS NONEXISTENTD°; MEMORY) DOES NOT WORK ON A Q-BUS CPU WHERE SOME MEMORY IS UNUSEDE±; BECAUSE IT "OVERLAPS" THE I/O PAGE. FOR EXAMPLE, A 124K WORD CPUFA²; WITH FOUR 32K WORD MEMORY BOARDS. UNDER THOSE CIRCUMSTANCES,C³; BECAUSE THE RL01/02 CONTROLLER DOES NOT ASSERT THE Q-BUS SIGNAL@´; DECLARING AN I/O PAGE ADDRESS TO BE AN I/O PAGE ADDRESS, THE*µ; MEMORY WILL ANSWER I/O PAGE ADDRESSES.¶;T·¸$¹ .IF NE C$$CDA ;IF RESIDENT CRASHº»PBNH== 0 ;;;NOT USED1¼PBNL== 2 ;;;RL01/02 CYLINDER,TRACK AND SECTORY½¾ .ENDC ; EQ C$$CDA¿À;E(Á; **** IMPORTANT - PLEASE NOTE ****Â;SDÃ; WITH LOADABLE CRASH DUMP SUPPORT, PBNL AND PBNH ARE DEFINED WITH>Ä; GLOBAL DEFINITIONS IN THE BUILD FILE FOR EACH DRIVER. ANYDÅ; MODIFICATIONS MADE HERE TO PBNL OR PBNH MUST BE ALSO MADE IN THEÆ; CORRESPONDING BUILD FILE.GÇ;RÈÉÊËÌ .IF DF H$$GENÍÎ .IF DF, L$$CDA ; GL003ÏÐDLDU: INCB CRDEV ; GL003C'Ñ CMPB #'L,@CRDEV ;;;IS THIS THE RL11?LÒÓ .IFF ; DF L$$CDARÔÕ.ÖDLDU: CMPB #'L,$CRDEV+1 ;;;IS THIS THE RL11?ר .ENDC ; DF L$$CDAÙÚ BEQ RL11 ;;;IF EQ YESL&Û ;;;ONLY DL/DU FOR P$$GEN SYSTEMS*Ü JMP MSCPDV ;;;GO TO MSCP CRASH ROUTINEÝÞ .ENDCßà,áRL11: CALL CKSUM ;;;CHECKSUM DISK ADDRESSâã .IF DF, L$$CDA ; GL003ä-å CLR @CRBAE ;;;INITIALIZE BAE FLAG ; GL003æç .IFF ; DF L$$CDA ; GL003èé CLR @#$CRBAEGêë .ENDC ; DF L$$CDA ; GL003ì,í BIS #60,(R0) ;;;SET EXTENDED ADDRESS BITS"î CLR 10(R0) ;;;CLEAR RLBAE BITS(ï BCS 2$ ;;;IF CS RLBAE DOES NOT EXIST'ð BIT #60,(R0) ;;;DID ADDRESS BITS SET1ñ BEQ 3$ ;;;IF EQ YES;òó .IF DF, L$$CDA ; GL003ô/õ2$: COM @CRBAE ;;;NO, RESET BAE FLAG ; GL003Nö÷ .IFF ; DF L$$CDA ; GL003;ø(ù2$: COM @#$CRBAE ;;;NO, RESET BAE FLAGúû .ENDC ; DF L$$CDA ; GL003ü2ý CLR @#UBMPR ;;;AND INITIALIZE FIRST UNIBUS ...*þ CLR @#UBMPR+2 ;;;;... MAPPING REGISTERS;ÿ3$: BIS #60,@#SR3 ;;;ENABLE 22 BIT MAPPING AND UNIBUS MAP ; MOV #<1920.*4>,-(SP) ;;;NUMBER OF BLOCKS IN 1920K WORDS 1 MOV #<4*4>,R5 ;;;NUMBER OF BLOCKS PER 4K WORDSS, SWAB R3 ;;;MOVE UNIT NUMBER TO HIGH BYTE( BIS #4,R3 ;;;SET GET STATUS FUNCTION- MOV #13,4(R0) ;;;SET CODES TO CLEAR DRIVER ' MOV R3,(R0)00dà_’_b“_c”_d–_k›’ ;;;EXECUTE THE FUNCTIONB*10$: BIT #100200,(R0) ;;;READY OR ERROR? BEQ 10$ ;;;IF EQ NEITHER# BMI WERRX ;;;IF MINUS I/O ERROR.0  ADD #4,R3 ;;;CONVERT TO READ HEADER FUNCTION   .IF DF, L$$CDA ; GL003 7  MOV @CRSB2,R4 ;;; SAVE STARTING DISK ADDRESS ; GL003R .IFF ; DF L$$CDA ; GL003V2 MOV @#$CRSBN+2,R4 ;;;SAVE STARTING DISK ADDRESS .ENDC ; DF L$$CDA ; GL0033 CLR 2(R0) ;;;SET BUFFER ADDRESS FOR FIRST WRITER"15$: MOV R3,(R0) ;;;READ HEADER)20$: BIT #100200,(R0) ;;;DONE OR ERROR?0 BEQ 20$ ;;;IF EQ NEITHER# BMI WERRX ;;;IF MINUS I/O ERRORR) MOV 6(R0),R1 ;;;GET HEADER INFORMATIONA* MOV R4,R2 ;;;COPY DESIRED DISK ADDRESS" XOR R1,R2 ;;;FORM A DIFFERENCE$ BIC #77,R2 ;;;IGNORE SECTOR BITS% BEQ 40$ ;;;IF EQ NO SEEK REQUIREDL* MOV R4,R2 ;;;COPY DESIRED DISK ADDRESS+  BIC #177,R1 ;;;ISOLATE CYLINDER ADDRESS 3! BIC #177,R2 ;;;ISOLATE CYLINDER ADDRESS DESIREDS-" SUB R2,R1 ;;;SUBTRACT DESIRED FROM ACTUAL '# BHIS 25$ ;;;IF HIS ACTUAL >=DESIREDR/$ NEG R1 ;;;ACTUAL < DESIRED, MAKE POS. DIFF.R4% BIS #4,R1 ;;;SET SIGN FOR MOVE TO CENTER OF DISK &25$: INC R1 ;;;SET MARKER BIT(' BIT #100,R4 ;;;WHICH HEAD DO WE WANT ( BEQ 30$ ;;;IF EQ IT'S HEAD 0) BIS #20,R1 ;;;SET HEAD 1+*30$: MOV R1,4(R0) ;;;LOAD DIFFERENCE WORD,)+ SUB #2,R3 ;;;CONVERT TO SEEK FUNCTION7!, MOV R3,(R0) ;;;START THE SEEK*-35$: BIT #100200,(R0) ;;;READY OR ERROR?. BEQ 35$ ;;;IF EQ NEITHER / BMI WERRX ;;;IF MI I/O ERROR0040$: MOV R4,4(R0) ;;;LOAD DESIRED DISK ADDRESS01 MOV #-256.,6(R0) ;;;LOAD ONE BLOCK WORD COUNT&2 BIC #17,R3 ;;;REMOVE FUNCTION BITS$3 BIS #12,R3 ;;;SET WRITE FUNCTION"4 MOV R3,(R0) ;;;START THE WRITE*545$: BIT #100200,(R0) ;;;ERROR OR READY?6 BEQ 45$ ;;;IF EQ NEITHER7 BMI 70$ ;;;IF MI ERROR08 DEC (SP) ;;;DUMPED MAXIMUM AMOUNT OF MEMORY?9 BEQ 72$ ;;;IF EQ YES#: DEC R5 ;;;DECREMENT BLOCK COUNT !; BNE 60$ ;;;IF NE USE SAME UMRI<= .IF DF, L$$CDA ; GL003>4? TST @CRBAE ;;;IS THE BAE REGISTER THERE? ; GL003@A .IFF ; DF L$$CDA ; GL003AB5C TST @#$CRBAE ;;;IS THE BAE REGISTER THERE? ; GL003IDE .ENDC ; DF L$$CDA ; GL003FG BEQ 50$ ;;;IF EQ YES?H ADD #<1024.*4*2>,@#UBMPR ;;;NO, POINT UMR TO NEXT 4K OF MEM4#I ADC @#UBMPR+2 ;;;DOUBLE WORD ADDI"J CLR 2(R0) ;;;RESET BUS ADDRESS5K50$: MOV #<4*4>,R5 ;;;NUMBER OF BLOCKS PER 4K WORDSDL60$: MOV (R0),R3 ;;;GET CSR3M BIC #^C<1460>,R3 ;;;ISOLATE UNIT AND EX MEM BITSL$N ADD #2,R4 ;;;MOVE TO NEXT SECTOR"O MOV R4,R1 ;;;COPY DISK ADDRESS(P BIC #^C<77>,R1 ;;;GET THE SECTOR BITS!Q CMP #50,R1 ;;;OVERRUN COMING?TR BNE 40$ ;;;IF NE NON$S BIS #77,R4 ;;;INCREMENT TRACK... T INC R4 ;;;...SET SECTOR TO 0*U BIS #10,R3 ;;;SET READ HEADER FUNCTIONV BR 15$ ;;;AND GO AGAIN-W70$: BIT #20000,(R0) ;;;NONEXISTENT MEMORY?S X BEQ WERRX ;;;IF EQ I/O ERROR$Y72$: TST (SP)+ ;;;CLEAN THE STACKZ[\ .IF NDF H$$GENC]^ BR $CRSHT ;;;DUMP DONE_` .IFFab JMP $CRSHT ;;;DUMP DONERcd .IFTFe&fWERRX: TST (SP)+ ;;;CLEAN THE STACKgh .IFFOi#j JMP WERR ;;;GO TO ERROR HANDLERTkl .ENDCmn"o .ENDC ; DF CDA$DL!H$$GEN!DL$$CDpqr .IF EQ C$$CDA-10Sst;0u; DDv; >w; THIS ROUTINE DUMPS ALL OF PHYSICAL MEMORY UP TO A LIMIT OFx; 124K WORDSy;Oz/{PBNH== 0 ;;;NOT USED BY TU58 TAPE CARTRIDGE%|PBNL== 1 ;;;STARTING BLOCK NUMBER}F~; THIS CODE INTERFACES WITH A TU58 VIA A DL11 ASYNCHRONOUS INTERFACE0€ CALL CKSUM ;;;CHECKSUM STARTING BLOCK NUMBER7� MOV #TRP04,@#114 ;;;POSITION NONEXISTENT MEMORY TRAPP,‚ ;;;CATCHER FOR CPU'S WHERE MEMORY SIZE"ƒ ;;;REGISTER > SIZE OF MEMORY3„ CLR @#KISAR6 ;;;WANT TO POINT TO PHYSICAL MEMORY &… MOV #77406,@#KISDR6 ;;;THROUGH APR6†‡; INITIALIZE TU58Iˆ'‰ CLR -(SP) ;;;RESERVE SPACE ON STACK #Š MOV R3,-(SP) ;;;SAVE UNIT NUMBER‹ BIS #1,4(R0) ;;;SEND BREAKN$Œ MOV #6,R2 ;;;SET TO SEND 6 NULLS �5$: CLRB 6(R0) ;;;SEND A NULLŽ CALL XWAIT ;;;� SOB R2,5$ ;;00dè_K_ÿ^DATADATADATADATADATADATADATA;LOOPS� CLR 4(R0) ;;;CLEAR BREAK%‘ TST 2(R0) ;;;DUMP RECEIVER BUFFERO’ MOVB #4,6(R0) ;;;SEND INITC“ CALL XWAIT ;;;WAIT%” MOVB #4,6(R0) ;;;SEND ANOTHER INITC• CALL XWAIT ;;;WAIT%–10$: TSTB (R0) ;;;RECEIVED A BYTE?,— BPL 10$ ;;;IF PL NO)˜ CMPB #20,2(R0) ;;;RECEIVED A CONTINUE? "™ BNE 35$ ;;;IF NE NO, I/O ERRORš›; SEND COMMAND PACKETœ2� MOV @#$CRSBN+2,R2 ;;;SAVE STARTING TU58 ADDRESS9ž15$: MOV #140000,R1 ;;;INITIALIZE POINTER TO FIRST BYTEIŸ ;;;MAPPED BY APR6L%  MOVB #2,6(R0) ;;;SEND COMMAND FLAGT¡ CALL XWAIT ;;;WAIT3¢ MOVB #12,6(R0) ;;;SEND COMMAND PACKET BYTE COUNTW;£ MOV #<12*400+2>,R4 ;;;INITIALIZE COMMAND PACKET CHECKSUM ¤ CALL XWAIT ;;;WAIT&¥ MOVB #3,6(R0) ;;;SEND WRITE OP CODE¦ CALL XWAIT ;;;WAIT+§ CLRB 6(R0) ;;;SEND A NULL MODIFIER BYTE31¨ MOV #3,R5 ;;;UPDATE PACKET CHECKSUM FOR THOSEC#© CALL CKSM ;;;TWO BYTES AND WAITE&ª MOVB (SP),6(R0) ;;;SEND UNIT NUMBER,« MOV #4,R3 ;;;SET COUNTER TO SEND 4 NULLS(¬ ;;;(SWITCHES, LOW BYTE OF SEQUENCE&­ ;;;NUMBER, HIGH BYTE OF SEQUENCE(® ;;;NUMBER, LOW BYTE OF BYTE COUNT)#¯20$: CALL XWAIT ;;;WAIT FOR DL11R° CLR 6(R0) ;;;SEND A NULL± SOB R3,20$ ;;;LOOP3² MOV (SP),R5 ;;;UPDATE PACKET CHECKSUM FOR FIRST-³ CALL CKSM ;;;FOUR OF THOSE BYTES AND WAITN7´ MOVB #<1024.*2/400>,6(R0) ;;;SEND HIGH ORDER BYTE OFU)µ ;;;NUMBER OF BYTES TO TRANSFERD2¶ MOV #<1024.*2>,R5 ;;;UPDATE PACKET CHECKSUM FOR2· CALL CKSM ;;;TRANSFER BYTE COUNT AND THEN WAIT/¸ MOV R2,R3 ;;;COPY TU58 LOGICAL BLOCK NUMBERH*¹ MOVB R3,6(R0) ;;;SEND LOW ORDER BYTE OFº ;;;LOGICAL BLOCK NUMBER » SWAB R3 ;;;R¼ CALL XWAIT ;;;WAIT FOR DL11U+½ MOVB R3,6(R0) ;;;SEND HIGH ORDER BYTE OF;¾ ;;;LOGICAL BLOCK NUMBERS+¿ MOV R2,R5 ;;;UPDATE PACKET CHECKSUM FORW.À CALL CKSM ;;;LOGICAL BLOCK NUMBER AND WAIT3Á MOVB R4,6(R0) ;;;SEND LOW ORDER BYTE OF CHECKSUMS SWAB R4 ;;;2à CALL XWAIT ;;;WAIT FOR DL11M4Ä MOVB R4,6(R0) ;;;SEND HIGH ORDER BYTE OF CHECKSUMÅ2Æ; SEND PROMISED DATA TO TU58 IN 128 BYTE PACKETSÇ:È MOV #<1024.*2/128.>,2(SP) ;;;NUMBER OF 128 BYTE PACKETS%É ;;;PER 1K WORDS OF MEMORYI*Ê30$: TSTB (R0) ;;;RECEIVED A CHARACTER?Ë BPL 30$ ;;;IF PL NO)Ì CMPB #20,2(R0) ;;;RECEIVED A CONTINUE? 'Í35$: BNE DEND ;;;IF NE NO, I/O ERRORK1Î MOV #<128./2>,R3 ;;;NUMBER OF WORDS PER PACKETRÏ CALL XWAIT ;;;WAIT FOR DL11K1Ð MOVB #1,6(R0) ;;;SEND DATA PACKET COMMAND FLAGDÑ CALL XWAIT ;;;WAIT FOR DL11G4Ò MOVB #128.,6(R0) ;;;SEND NUMBER OF DATA BYTES PERÓ ;;;DATA PACKET:Ô MOV #<128.*400+1>,R4 ;;;INITIALIZE DATA PACKET CHECKSUMÕ CALL XWAIT ;;;WAIT FOR DL11O5Ö40$: MOV (R1),R5 ;;;WILL USE DATA WORD IN CHECKSUME3× MOVB (R1)+,6(R0) ;;;SEND FIRST BYTE OF DATA WORDCØ CALL XWAIT ;;;WAIT FOR DL11N'Ù MOVB (R1)+,6(R0) ;;;SEND SECOND BYTE//Ú CALL CKSM ;;;FACTOR DATA WORD INTO CHECKSUMIÛ ;;;AND THEN WAIT3Ü SOB R3,40$ ;;;LOOP FOR EACH DATA WORD OF PACKETC3Ý MOVB R4,6(R0) ;;;SEND LOW ORDER BYTE OF CHECKSUMSÞ SWAB R4 ;;;Aß CALL XWAIT ;;;WAIT FOR DL114à MOVB R4,6(R0) ;;;SEND HIGH ORDER BYTE OF CHECKSUM'á DEC 2(SP) ;;;DECREMENT PACKET COUNT(â BNE 30$ ;;;IF NE SEND ANOTHER PACKETã*ä; CLEAR OUT END PACKET MESSAGE FROM TU58å3æ MOV #14.,R3 ;;;NUMBER OF BYTES IN AN END PACKETV*ç50$: TSTB (R0) ;;;RECEIVED A CHARACTER?è BPL 50$ ;;;IF PL NO !é TST 2(R0) ;;;DUMP CHARARACTERAê SOB R3,50$ ;;;LOOP3ë CMP #<7600-40>,@#KISAR6 ;;;HAVE SENT 124K WORDS?;ì BNE 70$ ;;;IF NE NOU)í60$: CMP (SP)+,(SP)+ ;;;CLEAN OFF STACKTî BR $CRSHT ;;;SUCCESS4ï70$: TST (R1) ;;;DOES NEXT MEMORY LOCATION EXIST?+ð BCS 60$ ;;;IF CS NO (NONEXISTENT MEMORY 'ñ ;;;TRAP CATCHER CAUGHT REFERENCE) 1ò ADD #4,R2 ;;;UPDATE TU58 LOGICAL BLOCK NUMBER;0ó ADD #40,@#KISAR6 ;;;POINT AT NEXT 1K WORDS OFô ;;;PHYSICAL MEMORY&õ JMP 15$ ;;;REPEAT 1K WORD TRANSFERö0÷CKSM: ADD R5,R4 ;;;ADD 2ND WORD TO FIRST WITH+ø ADC R4 ;;;END AROUND TREATMENT OF C-BITS,ùXWAIT: TSTB 4(R0) ;;;DL11 TRANSMIT RE00dð_’_b“_c”_d–_k›’ADY?ú BPL XWAIT ;;;IF PL NOCû RETURN ;;; ü(ýDEND: CMP (SP)+,(SP)+ ;;;RESTORE STACKþÿ .ENDC .IIF EQ, C$$CDA-12 CDA$MS=0: .IF DF CDA$MS!MS$$CD ;LOADABLE OR RESIDENT CRASH DRIVER; ; MS ;O= ; IF THE EXECUTIVE DOES NOT SUPPORT 22-BIT ADDRESSING, THIS< ; ROUTINE DUMPS ALL OF PHYSICAL MEMORY (UP TO A MAXIMUM OF/ ; 124K WORDS) IN 512 BYTE BLOCKS AT 1600 BPI.  ;=; IF THE EXECUTIVE SUPPORTS 22-BIT ADDRESSING, THIS ROUTINE0@; DUMPS ALL OF PHYSICAL MEMORY IN 512 BYTE BLOCKS AT 1600 BPI.; $ .IF NE C$$CDA ;IF RESIDENT CRASH-PBNH== 0 ;;;BLOCK NUMBER IGNORED FOR TS11PBNL== 0 ;;; .ENDC ; EQ C$$CDAD; (; **** IMPORTANT - PLEASE NOTE ****;ED; WITH LOADABLE CRASH DUMP SUPPORT, PBNL AND PBNH ARE DEFINED WITH>; GLOBAL DEFINITIONS IN THE BUILD FILE FOR EACH DRIVER. ANYD ; MODIFICATIONS MADE HERE TO PBNL OR PBNH MUST BE ALSO MADE IN THE!; CORRESPONDING BUILD FILE.";U#$%& .IF DF, L$$CDA1'( ADD #12,MSCR12) MOV MSCR1,R5 ;;; ADDRESS OF COMMAND PACKET MUST*+ .IFF ; DF L$$CDA ; GL003C,9- MOV #<$MSCR1+12>,R5 ;;; ADDRESS OF COMMAND PACKET MUSTQ./ .ENDC ; DF L$$CDA ; GL0030-1 BIC #3,R5 ;;;BE ON A DOUBLE WORD BOUNDARY 52 MOV #8.,-(R5) ;;;LENGTH OF COMMAND PACKET IN BYTES /3 CLR -(R5) ;;;UPPER 2 BITS OF COMMAND PACKETV4 ;;;ADDRESS56 .IF DF, L$$CDAP7(8 MOV MSCR2,-(R5) ;;; LOW ORDER 16 BITS9: .IFF ; DF L$$CDA;*< MOV #$MSCR2,-(R5) ;;; LOW ORDER 16 BITS=> .ENDC ; DF L$$CDA?7@ MOV #100004,-(R5) ;;;WANT TO "WRITE CHARACTERISTICS" 0A MOV R5,R4 ;;;COPY POINTER TO COMMAND PACKET.'B ;;;IF R4.EQ.R5, MS: BEING SET UP.$0C MOV R0,R1 ;;;FORM POINTER TO STATUS REGISTERD TST -(R1) ;;;M3E CALL 200$ ;;;ISSUE COMMAND, WAIT FOR SUBSYSTEM,%F ;;;READY, AND HANDLE ANY ERRORSP4G MOV #142010,(R5) ;;;REWIND AND CLEAR VOLUME CHECK'H CALL 200$ ;;;ISSUE COMMAND AND WAIT%I MOV #100005,(R5)+ ;;;WANT TO WRITEM6J MOV #20000,(R5) ;;;ASSUME DATA TRANSFER VIA UMR #1.KL .IF DF, L$$CDA ; GL003MN BIT #HF.UBM,@HFMSK ;;;UMPs ?MOP .IFF ; DF L$$CDA ; GL003AQ!R BIT #HF.UBM,@#$HFMSK ;;;UMPs ?EST .ENDC ; DF L$$CDA ; GL003U,V BNE 10$ ;;;IF NE, YES. DT TRFR - UMR #1.1W CLR (R5) ;;;Q BUS - NO UMR'S; START FROM @ 0.,X10$: TST (R5)+ ;;;R5 > CMD PKT, 3RD WORD.#Y CLR (R5)+ ;;;CLR HI ORD @ BITS.O0Z MOV #512.,(R5) ;;;512 BYTE PER DATA TRANSFER.'[ CLR @#UBMPR+4 ;;;INITIALIZE UMR #1 -M0\ CLR @#UBMPR+6 ;;; USED TO MAP DATA TRANSFERS.9] BIS #60,@#SR3 ;;;ENABLE 22 BIT MAPPING AND UNIBUS MAP.@1^ MOV #<1920./4>,R3 ;;;R3 - MAX # OF 4KW BLOCKS.=_40$: MOV #<4*4>,R2 ;;;R2 - #512 BYTE RECORDS/4KW MEM BLOCK.A#`50$: MOV #9.,R5 ;;;RETRY COUNT+1E%a CALL 200$ ;;;ISSUE WRITE AND WAIT 0b ADD #512.,2(R4) ;;;BUMP START ADDRESS OF DATAc ADC 4(R4) ;;;3/d SOB R2,50$ ;;;LOOP UNTIL REACH RECORD LIMIT"e ;;; (OR UNTIL ERROR IN 200$)9f ADD #<1024.*4*2>,@#UBMPR+4 ;;;BUMP ADDRESS OF UMR 1 BYR!g ADC @#UBMPR+6 ;;;4K WORDSNhi .IF DF, L$$CDA ; GL003j.k BIT #HF.UBM,@HFMSK ;;;USING UMR'S? ; GL003lm .IFF ; DF L$$CDA ; GL003n'o BIT #HF.UBM,@#$HFMSK ;;;USING UMR'S?Rpq .ENDC ; DF L$$CDA ; GL003rs BEQ 60$ ;;;IF EQ, NO. +t MOV #20000,2(R4) ;;;DT TRF PER UMR #1 @.2)u60$: DEC R3 ;;;WROTE MAX # 4KW BLOCKS?4v BNE 40$ ;;;IF NE, NO.;wx;TCy; NOTE THAT THE FOLLOWING BRANCH IS NEVER TAKEN IF 180$ IS FALLEN1Bz; INTO (R5 IS NEVER EQUAL TO R4, BECAUSE R5 IS A RETRY COUNT AND<{; R4 IS AN ADDRESS, UNLESS 180$ IS BRANCHED TO FROM BELOW)|;M}.~180$: CMP R4,R5 ;;; MS: DEVICE BEING SETUP?% BEQ 280$ ;;;IF EQ YES, ERROR EXITF3€ MOV #100011,(R4) ;;;WANT TO FORMAT (WRITE A TAPE3� ;;;MARK) ‚ MOV R4,(R1) ;;;ISSUE COMMAND&ƒ190$: TSTB (R0) ;;;SUBSYSTEM READY?„ BPL 190$ ;;;IF PL NO)… JMP $CRSHT ;;; SUCCESSFUL TERMINATIONT†*‡200$: MOV R3,-(SP) ;;;SAVE BLOCK COUNTER%ˆ210$: MOV R4,(R1) ;;;ISSUE COMMAND &‰225$: TSTB (R0) ;00dø_K_ÿ^DATADATADATADATADATADATADATA;;SUBSYSTEM READY?Š BPL 225$ ;;;IF PL NO‹ MOV (R0),R3 ;;;GET STATUS Œ BMI 250$ ;;;IF MI ERROR8(� MOV (SP)+,R3 ;;;RESTORE BLOCK COUNTER1Ž BIC #1000,(R4) ;;;MAKE SURE "WRITE DATA RETRY"0� ;;;BIT IS CLEARR� RETURN ;;;3‘’“” .IF DF, L$$CDA ; GL003•–250$: ADD #6,MSCR3 ; GL003.— BIT #1,@MSCR3 ;;;END OF TAPE SEEN? ; GL003˜™ .IFF ; DF L$$CDA ; GL003Tš.›250$: BIT #1,@#$MSCR3+6 ;;;END OF TAPE SEEN?œ� .ENDC ; DF L$$CDA ; GL003žŸ BNE 180$ ;;;IF NE YESU&  BIT #4000,R3 ;;;NONEXISTENT MEMORY?¡ BNE 180$ ;;;IF NE YESA-¢ BIC #^C<16>,R3 ;;;ISOLATE TERMINATION CODE+-£ CMP #12,R3 ;;;RECOVERABLE ERROR (TAPE HAS ¤ ;;;NOT MOVED)?¥ BEQ 270$ ;;;IF EQ YES -¦ CMP #10,R3 ;;;RECOVERABLE ERROR (TAPE HAS,§ ;;;MOVED ONE RECORD)? #¨ BNE 280$ ;;;IF NE NO, I/O ERROR36© BIS #1000,(R4) ;;;CHANGE COMMAND TO "SPACE REVERSE,ª ;;;ERASE, WRITE DATA"@)«270$: DEC R5 ;;;EXHAUSTED RETRY COUNT?C¬ BNE 210$ ;;;IF NE NO,­280$: TST (SP)+ ;;;DISCARD RETURN ADDRESS®¯° .ENDC ; DF CDA$MS!MS$$CD;±²:³ .IIF EQ C$$CDA-13 .ERROR C$$CDA ;DX CRASH NOT SUPPORTED´:µ .IIF EQ C$$CDA-14 .ERROR C$$CDA ;DY CRASH NOT SUPPORTED¶:· .IIF EQ C$$CDA-15 .ERROR C$$CDA ;MF CRASH NOT SUPPORTED¸¹º .IIF EQ C$$CDA-16 CDA$DU=0»¼ .IF DF CDA$DU!H$$GEN!DU$$CD½¾¿;0À; DUÁ; @Â; THIS ROUTINE DUMPS ALL OF MEMORY ONTO A REMOVABLE MEDIA MSCPAÃ; TYPE DEVICE. CURRENTLY THE VALID DEVICES ARE RA60, RC25, AND$ Ä; RX50. Å;IÆÇ$È .IF NE C$$CDA ;IF RESIDENT CRASHÉÊ)ËPBNH== 0 ;;;STARTING BLOCK NUMBER ...$ÌPBNL== 1 ;;;...PÍÎ .ENDC ; EQ C$$CDAÏÐ;R(Ñ; **** IMPORTANT - PLEASE NOTE ****Ò; DÓ; WITH LOADABLE CRASH DUMP SUPPORT, PBNL AND PBNH ARE DEFINED WITH>Ô; GLOBAL DEFINITIONS IN THE BUILD FILE FOR EACH DRIVER. ANYDÕ; MODIFICATIONS MADE HERE TO PBNL OR PBNH MUST BE ALSO MADE IN THEÖ; CORRESPONDING BUILD FILE.V×; ØÙ.ÚMSCPDV: CALL CKSUM ;;;CHECKSUM DISK ADDRESSÛ;Ü; AT THIS TIME:FÝ;$Þ; R0=CSR ADDRESSß; R3=UNIT NUMBER%à; CONTROLLER IS IN AN UNKNOWN STATEá;=â!ã .IF EQ,C$$CDA ; LOADABLE CRASHä'å CLR RELOC ;;;CLEAR RELOCATION WORDS æ CLR RELOC+2çè .ENDC ; EQ C$$CDAé7ê MOV #$DUCSH,R2 ;;;GET ADDRESS OF INTIALIZATION TABLES0ë MOV (R2)+,R4 ;;;GET ADDRESS OF COMMAND PACKET1ì MOV (R2)+,R5 ;;;GET ADDRESS OF RESPONSE PACKETD<í MOVB R3,P.UNIT(R4) ;;;STORE UNIT NUMBER IN COMMAND PACKET,î CLR R3 ;;;ASSUME EXTENDED MEMORY SUPPORT#ï MOV #4000,R1 ;;;SETUP FOR STEP 1R,ð MOV R1,(R0)+ ;;;INITIALIZE PORT INTERFACE*ñ10$: TST (R0) ;;;ANY CONTROLLER ERRORS?ò BPL 12$ ;;;IF PL NOó JMP WERR ;;;ERROR ROUTINEC3ô12$: BIT R1,(R0) ;;;IS CONTROLLER AT RIGHT STEP?Aõ BEQ 10$ ;;;IF EQ NO, WAITA)ö CMP #4000,R1 ;;;DID WE JUST DO STEP 1?+÷ BNE 15$ ;;;IF NE NOMø!ù .IF EQ,C$$CDA ; LOADABLE CRASHEúû;Pü; FIGURE RELOCATION WORD:IEý; - IF 22 BIT ADDRESSING, THEN THE RELOCATION BIAS WILL BE ADDED TON:þ; THE VIRTUAL ADDRESS TO GIVE A 22 BIT PHYSICAL ADDRESSGÿ; - IF NOT, THE RELOCATION BIAS WILL BE USED AS THE UMR VALUE AND THEO0; PHYSICAL ADDRESS WILL BE MAPPED USING UMR 5;;. MOV @KISA5,RELOC ;;;ADDRESS OF CODE ; GL003  .REPT 6! ASL RELOC ;;;CHANGE TO 22 BITA ROL RELOC+2 .ENDR  CLR 4(R2) ;;;CLEAR HIGH WORD'  MOV #RINGS,2(R2) ;;;ADDRESS OF RINGSR8  BIT #1000,(R0) ;;;CONTROLLER SUPPORT EXTENDED MEMORY?&  BEQ 13$ ;;; EQ, NO - MUST USE UMRS/  SUB #120000,RELOC ;;;SUBTRACT VIRTUAL 120000I1 SBC RELOC+2 ;;;TO MAKE ADDR RELOCATION EASIERO0 ADD RELOC,2(R2) ;;;ADD RELOCATION (LOW WORD) ADC 4(R2) ;;;ADD THE CARRY2 ADD RELOC+2,4(R2) ;;;ADD RELOCATION (HIGH WORD)* BR 15$ ;;;BRANCH AROUND UMR SETUP CODE413$: MOV RELOC,@#UBMPR+24;;;SET UP UMR 5 ; GL003$ MOV RELOC+2,@#UBMPR+26 ; GL003 COM R3 ;;;SET UMR FLAG .ENDC ; EQ C$$CDA" .IF NE,C$$CDA ; RESIDENT CRASH8 BIT #1000,(R0) ;;;CONTROLLER SUPPORT EXTENDED MEMORY? BNE 15$ ;;;IF 00d`’_b“_c”_d–_k›’EQ YES COM R3 ;;;NO, SET UMR FLAG .ENDC ; NE C$$CDA 5!15$: MOV (R2)+,(R0) ;;;SEND STEP WORD TO CONTROLLERC" ASL R1 ;;;MOVE STEP BITA!# BPL 10$ ;;;IF PL KEEP STEPING(/$ MOV (R2)+,R2 ;;;GET ADDRESS OF RESPONSE RING %"& .IF EQ, C$$CDA ; LOADABLE CRASH'%( TST R3 ;;;EXTENDED MEMORY SUPPORT2&) BNE 17$ ;;;NE, NO - MUST USE UMR'S&* MOV R5,(R2) ;;;RESET RESPONSE RING/+ ADD RELOC,(R2)+ ;;;ADD RELOCATION (LOW WORD) -, MOV RELOC+2,(R2) ;;;RELOCATION (HIGH WORD)1- ADC (R2)+ ;;;ADD THE CARRY%. MOV R4,(R2) ;;;RESET COMMAND RINGC// ADD RELOC,(R2)+ ;;;ADD RELOCATION (LOW WORD)O-0 MOV RELOC+2,(R2) ;;;RELOCATION (HIGH WORD)B1 ADC (R2) ;;;ADD THE CARRY'2 CMP -(R2),-(R2) ;;;DECREMENT 2 WORDSE"3 BR 18$ ;;;BRANCH AROUND RESETS45 .ENDC ; EQ C$$CDA6*717$: MOV R5,(R2)+ ;;;RESET RESPONSE RING%8 MOV R4,2(R2) ;;;RESET COMMAND RING;2918$: CALL RSET ;;;RESET OWNERSHIP WORDS IN RING:;N!;; CONTROLLER IS NOW INITIALIZED;(<; NEXT, PUT CONTROLLER AND UNIT ONLINE=;T>; R0=CSR ADDRESS +2)?; R1=100000 ("OWN")C.@; R2=ADDRESS OF SECOND WORD OF RESPONSE RINGA; R3=EXTENDED MEMORY FLAGLB; R4=COMMAND PACKET ADDRESS2C; R5=RESPONSE PACKET ADDRESSD;R8E MOVB #OP.ONL,P.OPCD(R4) ;;;LOAD ONLINE FUNCTION CODE)F CLR P.BCNT(R4) ;;;NO WORD COUNT NEEDEDV%G CALL IO ;;;DO THE ONLINE FUNCTIONV<H MOVB #OP.GUS,P.OPCD(R4) ;;;LOAD GET UNIT STATUS FUNCTION I CALL IO ;;;DO THE GET STATUS>J BIT #UF.RMV,P.UNFL(R5) ;;;IS THIS A REMOVEABLE MEDIA UNIT?K BNE 20$ ;;;IF NE YESL%M .IF DF, L$$CDA ;;; LOADABLE CRASH2N"O MOV CRMS6,R1 ;;; ILLEGAL DEVICEPQ .IFF ; DF L$$CDAFR#S MOV #$CRMS6,R1 ;;;ILLEGAL DEVICE TU .ENDC ; DF L$$CDAV+W BR WERR1 ;;;PRINT MESSAGE AND TRY AGAINE?X20$: MOVB #OP.WR,P.OPCD(R4) ;;;LOAD WRITE DATA FUNCTION CODEL4Y MOV #<512.*4*4>,P.BCNT(R4) ;;;BYTE COUNT FOR 4KWZ&[ .IF DF, L$$CDA ;;; LOADABLE CRASH\,] MOV @CRSB2,P.LBN(R4) ;;; SET STARTING LBN!^ MOV @CRSBN,P.LBN+2(R4) ;;; ...D_` .IFF ; DF L$$CDAIa0b MOV @#$CRSBN+2,P.LBN(R4) ;;; SET STARTING LBN#c MOV @#$CRSBN,P.LBN+2(R4) ;;; ...Ede .ENDC ; DF L$$CDAf(g CLR P.BUFF(R4) ;;;START AT PHYSICAL 0h CLR P.BUFF+2(R4) ;;;...*i BIS #60,@#SR3 ;;;ENABLE 22-BIT AND UMRS,j TST R3 ;;;EXTENDED ADDRESSING SUPPORTED?k BEQ 30$ ;;;IF EQ YES l CLR @#UBMPR+4 ;;;NO, USE UMRSm CLR @#UBMPR+6 ;;;...F:n MOV #20000,P.BUFF(R4) ;;;SET BUFFER ADDRESS THRU UMR 1o; 9p; ALL INITIAL VALUES ARE SETUP. NOW TRANSFER THE DATA.q; $r30$: CALL IO ;;;WRITE 4KW TO DISK3s ADD #<4*4>,P.LBN(R4);;;MOVE TO NEXT STARTING LBN(t ADC P.LBN+2(R4) ;;;...;(u TST R3 ;;;EXTENDED MEMORY SUPPORTED?v BEQ 40$ ;;;IF EQ YES2w ADD P.BCNT(R4),@#UBMPR+4 ;;;UPDATE UMR ADDRESSx ADC @#UBMPR+6 ;;;...Xy BR 30$ ;;;KEEP WRITING:z40$: ADD P.BCNT(R4),P.BUFF(R4) ;;;UPDATE BUFFER ADDRESS{ ADC P.BUFF+2(R4) ;;;...| BR 30$ ;;;};R?~; DO THE I/O AND CHECK FOR ERRORS. THE ONLY VALID ERRORS ARES,; NON-EXISTANT MEMORY AND INVALID COMMAND.€;C � .ENABL LSBE6‚IO: TST -2(R0) ;;;FORCE CONTROLLER TO LOOK AT RINGS,ƒ10$: TST (R0) ;;;CONTROLLER STILL ONLINE?$ƒ BMI 20$ ;;;IF MI, NO. ;CS0087… TST (R2) ;;;CONTROLLER SEND BACK A RESPONSE? ;**-1P3† BMI 10$ ;;;IF MI NO, IT STILL "OWNS" THE PACKET ‡ TST P.STS(R5) ;;;ANY ERRORS?Nˆ BNE 20$ ;;;IF NE YES3‰RSET: BIS #100000,(R2) ;;;SET OWN FLAG INTO RINGS0Š BIS #100000,4(R2) ;;;...A‹ RETURN ;;;R"Œ20$: TST (SP)+ ;;;CLEANUP STACK1� CMP #ST.NXM,P.STS(R5) ;;;NON-EXISTANT MEMORY?.%Ž BEQ $CRSHT ;;;IF EQ YES, ALL DONEC6� CMPB #ST.CMD,P.STS(R5) ;;;DID WE OVERRUN THE DISK?%� BEQ $CRSHT ;;;IF EQ YES, ALL DONE #‘ ;;;NO, FATAL ERROR, FALL THRUO ’ .DSABL LSBA“"” .ENDC ; DF CDA$DU!H$$GEN!DU$$CD•– .PAGE— .IIF EQ, C$$CDA-17 CDA$MU=0˜:™ .IF DF CDA$MU!MU$$CD ;LOADABLE OR RESIDENT CRASH DRIVERš;R›; MUœ;LH�; IF 22-BIT ADDRESSING IS NOT SUPPORTED, THEN THIS ROUTINE DUMPS ALLDž; OF PHYSICAL MEMORY (TO A MAX OF 124K WORDS) IN 00d`K_ÿ^DATADATADATADATADATADATADATA512 BYTE BLOCKS.Ÿ;.@ ; IF 22-BIT ADDRESSING IS SUPPORTED, THEN THIS ROUTINE DUMPS/¡; ALL OF PHYSICAL MEMORY IN 512 BYTE BLOCKS.;¢; £$¤ .IF NE C$$CDA ;IF RESIDENT CRASH¥3¦PBNH== 0 ;;;BLOCK NUMBER IGNORED FOR MU: DEVICEE§PBNL== 0 ;;;¨© .ENDC ; NE C$$CDAª«; RESTRICTION:¬;DA­; WITH LOADABLE CRASH DUMP SUPPORT, PBNL .AND. PBNH ARE DEFINEDL?®; WITH GLOBAL DEFINITIONS IN THE BUILD FILE FOR EACH DRIVER.D¯;AA°; ANY MODIFICATIONS MADE HERE TO PBNL OR PBNH MUST BE ALSO MADEO%±; IN THE CORRESPONDING BUILD FILE. ²;R³9´; R0 - CSR, R3 = UNIT NUMBER, CNTRL IN AN UNKNOWN STATE5µ"¶ .IF EQ C$$CDA ; LOADABLE CRASH·(¸ CLR RELOC ;;; Clear relocation words¹ CLR RELOC+2º .ENDC ; EQ C$$CDA»3¼ MOV #$MUCSH,R2 ;;; R2 > MU: Initialization tableI'½ MOV (R2)+,R4 ;;; R4 > Command packetP(¾ MOV (R2)+,R5 ;;; R5 > Response packet8¿ MOVB R3,P.UNIT(R4) ;;; Command packet <-- Unit number)À CLR R3 ;;; R3 - IF EQ, THEN 22 bit @. *Á MOV #4000,R1 ;;; R1 - setup for Step 1.1 MOV R1,(R0)+ ;;; Initialize the MU: controllerC'Ã10$: TST (R0) ;;; Controller errors? Ä BPL 12$ ;;; IF PL, No.(Å JMP WERR ;;; Else - indicate error.Æ3Ç12$: BIT R1,(R0) ;;; Controller at correct step?C(È BEQ 10$ ;;; IF EQ, No - Wait for it.)É CMP #4000,R1 ;;; Just complete Step 1?>Ê BNE 15$ ;;; IF NE, No.Ë .PAGE"Ì .IF EQ C$$CDA ; LOADABLE CRASHÍÎ; Setup relocation words:iÏ;b@Ð; If 22 bit @, THEN the relocation bias will be added to the*Ñ; virtual @ to give a 22 bit physical @.Ò;tDÓ; If not, THEN the relocation bias will be used as the UMR value2Ô; and the physical @ will be mapped using UMR 5.Õ1Ö MOV @KISA5,RELOC ;;; > MU: crash code. ; GL003r × .REPT 6Ø ASL RELOC ;;; Convert toÙ ROL RELOC+2 ;;; 22 bit @.RÚ .ENDRÛ%Ü CLR 4(R2) ;;; Clear high (@) wordN+Ý MOV #RINGS,2(R2) ;;; and setup Rings @.A6Þ BIT #1000,(R0) ;;; MU: controller in 22 bit @ mode?%ß BEQ 13$ ;;; IF EQ, NO - use UMRS. à; Setup 22 bit RING @.(á SUB #120000,RELOC ;;; Subtract APR #5)â SBC RELOC+2 ;;; virtual @ (120000).u*ã ADD RELOC,2(R2) ;;; RELOC,+2 > physicalä ADC 4(R2) ;;; 22 bit @&å ADD RELOC+2,4(R2) ;;; of Rings.'æ BR 15$ ;;; 22 bit @ of Rings setup. çè; Setup Rings @ via UMR #5. *é13$: MOV RELOC,@#UBMPR+24 ;;; Use UMR #5*ê MOV RELOC+2,@#UBMPR+26 ;;; for Rings @.,ë COM R3 ;;; R3 - IF NEQ, THEN using UMRs.ì .ENDC ; EQ C$$CDAíî"ï .IF NE,C$$CDA ; RESIDENT CRASHð6ñ BIT #1000,(R0) ;;; MU: controller in 22 bit @ mode?ò BNE 15$ ;;; IF NEQ, No.C,ó COM R3 ;;; R3 - IF NEQ, THEN using UMRs.ô .ENDC ; NE C$$CDAõö<÷15$: MOV (R2)+,(R0) ;;; Next Init step word to controller.+ø ASL R1 ;;; Prepare for next Init phase.p(ù BPL 10$ ;;; IF PL, more Init phases.'ú MOV (R2)+,R2 ;;; R2 > Response ring.û .PAGE"ü .IF EQ C$$CDA ; LOADABLE CRASHýþ TST R3 ;;; 22 bit @ mode?g%ÿ BNE 17$ ;;; IF NE, No - use UMRs.; 22 bit @ modeE MOV R5,(R2) ;;; Update ADD RELOC,(R2)+ ;;; > to" MOV RELOC+2,(R2) ;;; Response ADC (R2)+ ;;; ring. MOV R4,(R2) ;;; Update ADD RELOC,(R2)+ ;;; > to! MOV RELOC+2,(R2) ;;; Command  ADC (R2) ;;; ring.!  CMP -(R2),-(R2) ;;; R2 > RSP+2p  BR 18$ ;;; and cont.P  .ENDC ; EQ C$$CDA  ; Use UMRs217$: MOV R5,(R2)+ ;;; Update > to Response ring.. MOV R4,2(R2) ;;; Update > to Response ring.,18$: CALL RSET ;;; Controller owns rings.- MOV #401,-2(R4) ;;; Setup virt ckt/credit.;; Controller initialized - put controller and unit online;C#; R0 > Device SA register (CSR+2) ; R1 = 100000 ("OWN" mask); R2 > RSP+2+; R3 IF EQ - 22 BIT @, ELSE NE - UMRs.;-; R4 > Command packet R5 > Response packetp;B$; Clear the command packet fields.+ MOV R4,R1 ;;; R1 > Command packet area. 7 MOV -4(R4),-(SP) ;;; Stack has size of CMD PKT area.t*117$: CLR (R1)+ ;;; Clear CMD PKT area./  SUB #2,(SP) ;;; At the end of CMD PKT area?v+! BNE 117$ ;;; I00d`’_b“_c”_d–_k›’F NE, No - keep clearing.z%" TST (SP)+ ;;; Maintain the stack.%#; Setup controller characteristics. ?$ MOVB #OP.SCC,P.OPCD(R4) ;;; Setup CONTROLLER characteristics25% MOV #0,P.CNTF(R4) ;;; for no extraneous messages. & CALL IO ;;; Issue request.'; ONLINE the controller.+( MOVB #OP.ONL,P.OPCD(R4) ;;; Setup ONLINE %) CLR P.BCNT(R4) ;;; function code.a* CALL IO ;;; Issue request.+;Rewind the unit4, MOVB #OP.REP,P.OPCD(R4) ;;; Setup to Reposition -2- MOV #MD.CSE!MD.RWD,P.MOD(R4) ;;; Rewind to BOT.. CALL IO ;;; Issue request.)/; Write 512. byte memory areas to tape.t=0 MOVB #OP.WR,P.OPCD(R4) ;;; Setup WRITE DATA function code,r11 MOV #512.,P.BCNT(R4) ;;; 512. byte count anda52 MOV #MD.CSE,P.MOD(R4) ;;; no serious exceptions.N3 CLR (R4) ;;; CMD Ref <-- 0..)4 CLR P.BUFF(R4) ;;; Assume 22 bit @ andB.5 CLR P.BUFF+2(R4) ;;; start at physical 0.36 BIS #60,@#SR3 ;;; Enable 22-bit @ mode and UMRS.P7 TST R3 ;;; 22 bit @ mode?-8 BEQ 20$ ;;; IF EQ, Yes.((9 CLR @#UBMPR+4 ;;; Initialize UMR #1 -1: CLR @#UBMPR+6 ;;; used to map data transfers.a<;19$: MOV #20000,P.BUFF(R4) ;;; Data transfer per UMR #1 @.><20$: MOV #<4*4>,R1 ;;; R1-#512 byte records/4KW mem block.$=25$: INC (R4) ;;; CMD Ref <-- +1.+>; Cmd PKT setup - write 512. byte record..+?30$: CALL IO ;;; Write 512. byte record.'@ ADD #512.,P.BUFF(R4) ;;; > next 512.a(A ADC P.BUFF+2(R4) ;;; byte of memory.3B SOB R1,25$ ;;; Keep writing until 4KW boundary.BC TST R3 ;;; 22 bit @ mode?RD BEQ 20$ ;;; IF EQ, Yes. 2E ADD #<1024.*4*2>,@#UBMPR+4 ;;; Increment UMR #1F ADC @#UBMPR+6 ;;; by 4KW.R+G BR 19$ ;;; Write next 4KW memory block.VHJI; Start I/O and check for errors - only valid error is non-existing mem.)J; All other errors are unrecoverable.b K .ENABL LSB6LIO: MOV #60,-4(R5) ;;; Response packet - max lenght.6M TST -2(R0) ;;; Start I/O - Controller polls rings.+N10$: TST (R0) ;;; Controller yet ONLINE?nO BPL 15$ ;;; IF PL, OK.(P TST (SP)+ ;;; Else - maintain stack,*Q MOV #SAMSG,R1 ;;; R1 > SA error message R BR WERR1 ;;; and issue it.S1T15$: TST (R2) ;;; Controller yet own RSP ring?oU BMI 10$ ;;; IF MI, Yes. "V MOV P.STS(R5),-(SP) ;;; Isolate"W BIC #^C<37>,(SP) ;;; end code.X TST (SP)+ ;;; Success?2Y BNE 20$ ;;; IF NE, No -error, can't handle it.Z.[RSET: BIS #100000,(R2) ;;; Controller 'OWNS'%\ BIS #100000,4(R2) ;;; the rings.T ] RETURNC^%_20$: TST (SP)+ ;;; Maintain stack.P1` CMP #ST.NXM,P.STS(R5) ;;; Non-existing memory?0a BEQ WTMK ;;; IF EQ, Yes - write TMK and end.0b CMP #ST.HST,P.STS(R5) ;;; Max allowed memory?0c BEQ WTMK ;;; IF EQ, Yes - write TMK and end.7d MOV #PSTMSG,R1 ;;; Else - R1 > P.STS error message.Ce1f; Write a TMK and complete Crash to MU: device.:gWTMK: CMPB #OP.WTM,P.OPCD(R4) ;;; Already tried to WTMK?.h BEQ WERR1 ;;; IF EQ, Yes - then end crash..i MOVB #OP.WTM,P.OPCD(R4) ;;; Write a TMK and5j MOV #MD.CSE,P.MOD(R4) ;;; no serious exceptions.M,k CALL RSET ;;; Controller owns the rings.l CALL IO ;;; Issue request.(m CMP #PSTMSG,R1 ;;; Had a P.STS error?.n BEQ WERR1 ;;; IF EQ, Yes - then end crash.o BR $CRSHT ;;; All done.Sp q .DSABL LSB rs .ENDC ; DF CDA$MU!MU$$CDt .PAGEuvw .IFT ; DF L$$CDA!R$CRSHxyz;+G{; WHEN AN ERROR IS DETECTED BY A CRASH ROUTINE, CONTROL IS TRANSFERED,G|; HERE EITHER BY A JUMP, BR, OR BY SIMPLY FALLING THRU TO THIS SIMPLE}; ERROR HANDLER.~;-€� .IF DF, L$$CDA‚+ƒWERR: MOV CRMS3,R1 ;;; INDICATE I/O ERRORC„… .IFF ; DF L$$CDA.†,‡WERR: MOV #$CRMS3,R1 ;;;INDICATE I/O ERRORˆ‰ .ENDC ; DF L$$CDAŠ'‹WERR1: CALL TYPE ;;;TYPE OUT MESSAGE"Œ JMP AGAIN ;;;WAIT FOR THE USER�Ž�;+G�; AFTER THE DUMP HAS SUCCESSFULLY COMPLETED, THE CRASH ROUTINE SHOULDAG‘; BRANCH TO HERE SO THAT THE PROCESSOR MAY BE HALTED AND ANOTHER DUMPE ’; BE TAKEN.,“;-”!•$CRSHT: HALT ;;;WAIT FOR USER–— .IF DF L$$CDA˜ ™ JMP @CRALTFš› .IFF ;DF L$00d`…`†`t`TADATADATADATADATADATA$CDAœ� JMP @#$CRALTDžŸ .ENDC ;DF L$$CDA. ¡ .PAGE,¢ .IF DF DU$$CD!MU$$CD ; DU/MU CRASH DRIVER£%¤; CRASH DATA BASE FOR DU/MU DEVICESR¥¦K§; RESTRICTION - any changes to this table must ALSO BE MADE IN LOWCR.MAC.¨:©; For Resident crash - this is in exec CRASH module area:ª; and for loadable CRASH, it's in the DU/MU crash area.«¬ ­; COMMAND AND RESPONSE PACKETS®"¯ .WORD 60 ; Packet length - 48.5° .WORD 1 ; Virtual circuit and credit/debit field.F±)²CMDPKT: .WORD 1 ; Command packet area.C ³ .REPT 23.´ .WORD 0 ; initially - 0s.µ .ENDR¶· .BLKW 2 ; Envelope.S,¸RSPPKT: .BLKW 24. ; Response packet area.¹º; COMMAND RINGS » .BLKW 2¼RINGS:-½RSP: .WORD RSPPKT ; Response packet ring -c1¾ .WORD 100000 ; Packet "owned" by controller.f,¿CMD: .WORD CMDPKT ; Command packet ring -1À .WORD 100000 ; Packet "owned" by controller.ÁÂÃ; INITIALIZATION TABLEÄ Å$DUCSH::'Æ$MUCSH::.WORD CMDPKT ; > CMD packet. Ç .WORD RSPPKT ; > RSP packet.9È .WORD 100000 ; STEP 1 - lenght of rings,IE,Int vec/4.!É .WORD RINGS ; 2 - lo ordS.Ê .WORD 0 ; 3 - and hi ord @ of Rings.Ë .WORD 1 ; 4.Ì .WORD RSP ; > Response ringDÍ%ÎRELOC: .WORD 0,0 ;RELOCATION WORDSDÏ .ENDC ; DF DU$$CD!MU$$CD Ð)Ñ .IF DF CDA$MU!MU$$CD ; MU CRASH DRIVERcÒÓP.NDCD = P.OPCD0Ô Õ .NLIST BEXe=ÖSAMSG: .ASCIZ <15><12><12>!CRASH -- I/O [SA] DEVICE ERROR;!CA×PSTMSG: .ASCIZ <15><12><12>!CRASH -- I/O (P.STS) DEVICE ERROR;!> Ø .LIST BEXÙÚ .ENDC ; DF CDA$MU!MU$$CDtÛ .PAGEÜÝÞ .IF DF H$$GENß.à .IIF EQ C$$CDA-7, PBNL==2 ;DEFAULT TO RL11áâ .ENDCãäå .ENDC ; DF L$$CDA!R$CRSHO&å .ENDC ; EQ C$$CDA-20 ; KLN020æ .ENDC ;C$$CDAçèé .END.ENDC ; DF DU$$CD!MU$$CD Ð)Ñ .IF DF CDA$MU!MU$$CD ; MU CRASH DRIVERcÒÓP.NDCD = P.OPCD0Ô Õ .NLIST BEXe=ÖSAMSG: .ASCIZ <15><12><12>!CRASH -- I/O [SA] DEVICE ERROR;!CA×PSTMSG: .ASCIZ <15><12><12>!CRASH -- I/O (P.ST;O?; MSPRE.MAC - PREFIX FILE FOR BUILDING MS LOADABLE CRASH DRIVER;O; Created 13-MAY-83A;3L$$CDA=0 ; LOADABLE CRASH DRIVERS TO BE ASSEMBLEDSMS$$CD=0 ; CRASH DRIVER IS MSER IS MSS.LIST;?; DLPRE.MAC - PREFIX FILE FOR BUILDING DL LOADABLE CRASH DRIVERO;p; Created 13-MAY-83O;3L$$CDA=0 ; LOADABLE CRASH DRIVERS TO BE ASSEMBLEDBDL$$CD=0 ; CRASH DRIVER IS DL3-MAY-83;3L$$CDA=0 ; LOADABLE CRASH DRIVERS TO BE ASSEMBLEDDL$$CD=0 ; CRASH DRIVER IS DU  BIT #IQ.X!IQ.Q!IQ.UMD,I.FCN(R3) ;ILLEGAL SUBMODIFIERS BEQ 10$ ;IT'S OK 0 JMP ILEGAL ;EXIT WITH ILLEGAL FUNCTION CODE*10$: CALL CMDCOM ;GET A COMMAND PACKET6 MOV I.PRM(R3),P.RBN+2(R1) ;REPLACEMENT BLOCK NUMBER6 MOV I.PRM+2(R3),P.RBN(R1) ;REPLACEMENT BLOCK NUMBER4 MOV I.PRM+4(R3),P.LBN+2(R1) ;LOGICAL BLOCK NUMBER2 MOV I.PRM+6(R3),P.LBN(R1) ;LOGICAL BLOCK NUMBER' MOV I.PRM+10(R3),P.MOD(R1) ;MODIFIERS? MOV I.PRM+6(R3),I.PRM+12(R3) ;CLEAR SPACE FOR RETURN ADDRESSM$ PUSH <#CLACMD> ;RETURN TO CLACMD' CALL CMDSEN ;ISSUE THE RPL COMMAND;;O(; RETURN TO THIS POINT WITH END PACKET; + MOV P.CRF+2(R1),R0 ;GET THE IOP ADDRESS B MOV I.PRM+12(R0),I.PRM+6(R0) ;PUT THE LOGICAL BLOCK NUMBER BACK% CALL ENDERR ;SET UP THE END CODEL  PUSH <#0> ;NO BYTE COUNTP! CALLR ENDCOM ;FINISH UP"# .PAGE,$ .SBTTL CMDRSN - READ VOLUME SERIAL NUMBER%;+'&; **-CMDRSN-READ VOLUME SERIAL NUMBERP';RL(; THE READ VOLUME SERIAL ROUTINE WILL READ THE 4-BYT00t `’_b“_c”_d–_k›’E VOLUME SERIAL NUMBERJ); CONTAINED IN THE DEVICE'S SECOND UCB EXTENSION INTO A BUFFER SPECIFIED*; IN THE I/O PACKET.+; ,; INPUTS:2-;R&.; R0 ADDRESS OF FUNCTION TABLE ENTRY/; R2 QST ADDRESS0; R3 I/O PACKET ADDRESS 1; R4 SCB ADDRESS2; R5 UCB ADDRESS3; 4; OUTPUTS:5;B6; R0 SUCCESS CODE7; R1 BYTES TRANSFERED8; R2-R5 PRESERVEDR9;-<CMDRSN: ;**-2F= BITB #IQ.X!IQ.Q!IQ.UMD,I.FCN(R3) ;DO WE HAVE ANY ILLEGAL MODIFIERS?> BEQ 10$ ;NOPE, CONTINUE(? CALLR ILEGAL ;ILLEGAL FUNCTION CODEF?10$: PUSH ;SAVE SCB, IOP, QST, AND BYTE COUNT ;PKW109DE MOV #X.VSER+120000,R0 ;GET DISPLACEMENT FOR SERIAL NUMBER ;**-5)F CALL 30$ ;TRANSFER THE SERIAL NUMBERP-G MOV 4(SP),R3 ;RETRIEVE I/O PACKET ADDRESSA6H CMP #6,I.PRM+4(R3) ;DO WE WANT THE UNIT FLAGS TOO?I BNE 20$ ;IF NE NO4J ADD #4,I.PRM+2(R3) ;POINT AT WORD FOR UNIT FLAGSK ADCB I.PRM+1(R3) ;...,)L MOV #2,(SP) ;TRANSFER JUST TWO BYTES?;M MOV #X.UNFL+120000,R0 ;GET DISPLACEMENT FOR UNIT FLAGSN&N CALL 30$ ;TRANSFER THE UNIT FLAGS,O MOV #6,(SP) ;SET TOTAL BYTES TRANSFERED'P20$: POP ;SET BYTES TRANSFEREDT7Q POP ;RESTORE QST, IOP, AND SCB ADDRESSESI#R MOV #IS.SUC&377,R0 ;SET SUCCESSE6S PUSH <#CLACMD> ;RETURN TO STARTING ANOTHER COMMANDT CALLR ENDCM1OU5V30$: MOVB I.PRM+1(R3),R2 ;SET HI 6-BITS OF ADDRESST1W MOV I.PRM+2(R3),R3 ;SET LO 16-BITS OF ADDRESS2X ASHC #10.,R2 ;CALCULATE DISPLACEMENT AND BIASY ASHC #-10.,R3 ;...5Z MOV R3,R4 ;COPY DESTINATION DISPLACEMENT INTO R4 1[ BIS #140000,R4 ;SET DESTINATION BIAS FOR APR6F-\ MOV R2,R3 ;COPY DESTINATION BIAS INTO R3(] MOV R0,R2 ;COPY SOURCE DISPLACEMENT)^ MOV 2(SP),R0 ; GET # OF BYTES TO MOVE ._ MOV U.UC2X(R5),R1 ;GET SOURCE BIAS INTO R13_ CALLR @BLXIO ;MOVE THE DATA AND RETURN ;GM112.ž ;**-62Ÿ .ENDC ;D$$DSKT  .PAGE  .IF DF,T$$APE ;JJM304J  .SBTTL CMDRWD - PROCESS ROUTINE FOR IO.RWD AND IO.RWU FUNCTIONS ;JJM304¤;+ ;**-3,/¥; **-CMDRWD-ROUTINE TO HANDLE REWIND FUNCTIONB¦;4K§; THIS ROUTINE WILL PROCESS THE RSX IO.RWD AND IO.RWU FUNCTIONS FOR TAPESA¨;O©; ª; INPUTS: «;Y&¬; R0=ADDRESS OF FUNCTION TABLE ENTRY­; R2=ADDRESS OF QST ®; R3=ADDRESS OF I/O PKTT¯; R4=ADDRESS OF SCB°; R5=ADDRESS OF UCBH±;A ²; OUTPUTS:³;.´; R0=STATUS CODEµ; R2-R5 ARE PRESERVED.;¶; U.CW2, BIT M.AEOV CLEAR ON SUCCESSFUL REWIND OPERATIONE8·; U.CW2, BIT M.REW SET TO INDICATE TAPE IS REWINDING<¸; U.STS, BIT US.PWF CLEAR POWERFAIL BIT TO ALLOW COMMANDS¹;º;<»; THE VALUE TO PUT INTO IOSB+2 IS ON THE STACK FOR ENDCOM¼;- ½CMDRWU:OA¾ PUSH #MD.UNL!MD.CSE ;SET UNLOAD AND 'CLR SER EXCEPT' MODIFIER ¿ BR CMDRWC ;JOIN COMMON CODE ÀCMDRWD: ;Á PUSH #MD.RWD!MD.IMM!MD.CSE ;SET REWIND, IMMEDIATE, AND" ;'CLR SER EXCEPT' MODIFIERS!ÃCMDRWC: ;COMMON ENTRY POINTW2Ä CALL CMDCOM ;ALLOCATE (T)MSCP PACKET AND FILLÅ ;COMMAND FIELDS)Æ BIS (SP)+,P.MOD(R1) ;SET THE MODIFIERST,Ç PUSH <#CLACMD> ;SAVE ROUTINE ADD ON STACK+È CALL CMDSEN ;SEND COMMAND TO CONTROLLEROÉ;+Ê; END PACKET PROCESSINGMË;-CË BICB #EF.EOT,P.FLGS(R1) ;DO NOT USE EOT FLAG ON REWINDS ;JJM314'(Ì CMP #ST.AVL,P.STS(R1);UNIT AVAILABLE?Í BNE 5$ ;NO.+Î CLR P.STS(R1) ;INDICATE SUCCESS (ST.SUC)MÏ5$: 0Ð CALL ENDERR ;SET UP STATUS TO RETURN TO USER)Ñ CMP #IS.SUC&377,R0 ;WAS IT SUCCESSFUL? Ò BNE 10$ ;NOP+Ó BISB #US.PWF,U.STS(R5);SET POWERFAIL BITBCÔ BIC #M.PEOV!M.RWD!M.SER!M.TMK!M.EOT!M.AEOV,U.CW2(R5) ;NEW STATESNAÕ BIS #M.BOT,U.CW2(R5) ;INDICATE THAT TAPE IS AT BOT (OR WILL BE-Ö ;WHEN THE CONTROLLER GETS DONE WITH IT)O+×10$: PUSH <#0> ;VALUE TO PUT INTO IOSB+2 *Ø CALLR ENDCOM ;DO COMMON END PROCESSINGÙÙ .PAGE ;JJM300?Ù .SBTTL CMDSMO - MOUNT AND SET TAPE CHARACTERISTICS ;JJM300 Ù;+ ;JJM300NQÙ; **-CMDSMO-PROCESS ROUTINE FOR IO.SMO (MOUNT AND SET CHARACTERISTICS) ;JJM300.Ù; ;JJM300VÙ; THIS ROUTINE PERFORMS THE FUNCTION00t(``†`t`TADATADATADATADATADATA OF SETTING THE TAPE CHARACTERISTICS AND ;JJM300WÙ; BRINGING THE UNIT TMSCP ONLINE. FOR TAPES THAT SUPPORT MULTIPLE DENSITIES, ;JJM300GVÙ; THIS MUST FIRST MAKE SURE THE TAPE UNIT IS TMSCP AVAILABLE. IF IT IS NOT, ;JJM300VÙ; AN AVAILABLE COMMAND MUST BE ISSUED, FOLLOWED BY AN ONLINE COMMAND SO THAT ;JJM300JÙ; THE TAPE DENSITY CAN BE SET TO THAT SPECIFIED BY THE USER. ;JJM300Ù; ;JJM300Ù; INPUTS: ;JJM300 Ù; ;JJM3002Ù; R0=ADDRESS OF FUNCTION TABLE ENTRY ;JJM300#Ù; R2=ADDRESS OF QST ;JJM300;'Ù; R3=I/O PACKET ADDRESS ;JJM300E#Ù; R4=ADDRESS OF SCB ;JJM300N#Ù; R5=ADDRESS OF UCB ;JJM300 Ù; ;JJM300Ù; OUTPUTS: ;JJM300Ù; ;JJM300!Ù; R0=STATUS CODE ;JJM300FÙ; R1=DESTROYED ;JJM300H%Ù; R2-R5 ARE PRESERVED ;JJM300 Ù;- ;JJM300YÙ ;JJM3000ÙCMDSMO: ;JJM300>Ù BIT #M.BOT,U.CW2(R5) ;ARE WE AT BEGINNING OF TAPE? ;JJM3008Ù BNE 10$ ;YES. CONTINUE WITH DENSITY SETTING ;JJM3006Ù CALLR ILEGAL ;NO. IO.SMO IS ILLEGAL THEN ;JJM300Ù ;JJM300CLÙ10$: BIT #UU.BLK,U.UTIL(R5) ;DOES UNIT SUPPORT MULTIPLE DENSITIES? ;JJM3002Ù BNE 200$ ;NO. NOTHING TO DO IN HERE ;JJM300/Ù MOV Q.CST(R2),R0 ;GET CST ADDRESS ;JJM300Y4Ù MOV R3,C.EXTN(R0) ;SAVE R3 TEMPORARILY ;JJM3008Ù CALL PIOPAL ;A "FALSE" IOP FOR AVN COMMAND ;JJM3007Ù MOV #AVNFUN,R0 ;FUNCTION CODE ENTRY TO USE ;JJM300B2Ù CALL CMDCOM ;BUILD TEMPLATE COMMAND ;JJM300HÙ BIS #MD.CSE,P.MOD(R1) ;SET 'CLEAR SERIOUS EXCEPTION' MODIFIER ;JJM3000Ù PUSH <#CLACMD> ;WHERE TO RETURN TO ;JJM300-Ù CALL CMDSEN ;ISSUE THE COMMAND ;JJM300E8Ù PUSH ;SAVE WHAT WILL BE USED LATER ;JJM300;Ù MOV #IS.SUC,R0 ;NON-ZERO -> RETURN IOP TO POOL ;JJM300-Ù PUSH <#0> ;NO IOSB DATA EITHER ;JJM300J0Ù CALL ENDCMO ;CLEAN UP PACKET USED ;JJM300/Ù MOV Q.CST(R2),R0 ;GET CST ADDRESS ;JJM300N4Ù MOV C.EXTN(R0),R3 ;RESTORE IOP ADDRESS ;JJM300,Ù POP ;RETURN REGISTERS ;JJM3009Ù200$: CALLR CMDONL ;ISSUE THE ONLINE COMMAND ;JJM300LÚ .PAGE.Û .SBTTL CMDSPB - PROCESS ROUTINE FOR IO.SPBÜ;+7Ý; **-CMDSPB-PROCESS ROUTINE FOR IO.SPB (SPACE BLOCKS)EÞ; Jß; THIS ROUTINE PERFORMS THE FUNCTION OF SPACING FORWARD OR BACKWARD OVER?à; A SPECIFIED NUMBER OF BLOCKS. IF A NEGATIVE BLOCK COUNT IS Lá; SPECIFIED, THE SKIPPING IS DONE IN THE REVERSE DIRECTION. FOR UNLABELEDJâ; TAPE, SPACING BLOCKS PAST EOV (TWO CONSECUTIVE TAPE MARKS OR BOT/TMRK)ã; IS NOT PERMITTED.Jä; å; INPUTS: æ;L&ç; R0=ADDRESS OF FUNCTION TABLE ENTRYè; R2=ADDRESS OF QSTDé; R3=I/O PACKET ADDRESSOê; R4=ADDRESS OF SCBPë; R5=ADDRESS OF UCBO1ì; U.CW2, BIT M.AEOV=TAPE AT OR PAST LOGICAL EOTMí; î; OUTPUTS:ï; ð; R0=STATUS CODE4ñ; R1=STATUS INFORMATION (NUMBER OF BLOCKS SKIPPED)ò; R2-R5 ARE PRESERVEDC1ó; U.CW2, BIT M.AEOV=TAPE AT OR PAST LOGICAL EOTNô;- õCMDSPB::1ö TST I.PRM(R3) ;ANY BLOCKS ACTUALLY SPECIFIED?T-÷ BNE 10$ ;YES. FURTHER PROCESSING NEEDED6ø MOV #IS.SUC&377,R0 ;INDICATE SUCCESS (NOP THE I/O)$ù CALLR CMDXIT ;COMMON ERROR EXIT=ù10$: BITB #US.MNT,U.STS(R5) ;IS THE UNIT MOUNTED? ;PKW109O3ý BEQ 20$ ;YES. OK TO DO THIS TYPE OF CMD ;**-3 4þ MOV #IE.PRI&377,R0 ;ERROR. TAPE MUST BE MOUNTED$ÿ CALLR CMDXIT ;COMMON ERROR EXITDÿ20$: BITB #US.LAB,U.STS(R5) ;WORKING WITH A LABELED TAPE? ;PKW1092 BNE 30$ ;YES. SKIP LOGICAL EOV CHECKS ;**-49 BIT #M.AEOV,U.CW2(R5) ;ARE WE PAST LOGICAL END OF TAPE ) BEQ 30$ ;NO. GO TO COMMON PROCESSING3) TST I.PRM(R3) ;TEST SPACING DIRECTIONC BLE 30$ ;BACKWARD IS OK.T6 MOV #IE.EOV&377,R0 ;INDICATE EOV ON UNLABELED TAPE$ CALLR CMDXIT ;COMMON ERROR EXIT 5 30$: CALL CMDCOM ;BUILD A SKELETON COMMAND PACKETA7 BIS #MD.CSE,P.MOD(R1) ;SET 'CLR SER EXCEPT' MODIFIER4 CLR P.RECC+2(R1) ;HIGH ORDER WORD OF BLOCK COUNT6 MOV I.PRM(R3),P.RECC(R1) ;DEFAULT SPACE BLOCK COUNT& BGE 40$ ;GOING FORWARD DIRECTION.4 BIS #MD.REV,P.MOD(R1) ;INDICA00t0`’_b“_c”_d–_k›’TE REVERSE DIRECTION6 NEG P.RECC(R1) ;INDICATE POSITIVE NUMBER OF BLOCKS4 40$: BITB #US.LAB,U.STS(R5) ;IS THIS LABELED TAPE?' BNE 50$ ;YES. SKIP LEOT PROCESSINGE% TST I.PRM(R3) ;FORWARD DIRECTION?& BLE 50$ ;NO. SKIP LEOT PROCESSING@ BIS #MD.DLE,P.MOD(R1) ;SET TO DETECT LEOT FOR UNLABELED TAPES< 50$: CLR P.TMGC(R1) ;INSURE NO TAPE MARKS WILL BE SKIPPED8 CLR P.TMGC+2(R1) ;HIGH ORDER WORD OF TAPE MARK COUNT" PUSH <#CLACMD> ;RETURN ADDRESS% CALL CMDSEN ;ISSUE TMSCP COMMANDE ;RH ; END PACKET PROCESSING. CONTROL RETURNS HERE WHEN THE END PACKET FORI ; THIS COMMAND IS RECEIVED. AT THIS POINT, THE I/O IS EFFECTIVELY DONEEG ; SO IT IS NECESSARY TO SET UP THE RETURN STATUS FOR THE USER. OTHER = ; FLAGS HAVE TO BE SET TO SHOW THE RESULT OF THE OPERATION.E! ;R%" CALL ENDERR ;GET RSX STATUS CODE -# CMP R0,#IE.EOV&377 ;WAS LEOT ENCOUNTERED?P$ BNE 60$ ;NO.O7% BIS #M.AEOV,U.CW2(R5) ;INDICATE THAT LOGICAL EOT HITAB& BIC #M.BOT!M.PEOV!M.RWD!M.SER!M.TMK!M.EOT,U.CW2(R5) ;NEW STATES3' 60$: PUSH ;NUMBER OF BLOCKS SKIPPEDT4( CMP R0,#IE.EOF&377 ;WAS A TAPE MARK ENCOUNTERED?) BNE 70$ ;NO.Y/* INC (SP) ;COUNT TAPE MARK AS BLOCK SKIPPEDR0+ 70$: CALLR ENDCOM ;GO TO COMMON CLEANUP CODE, .PAGE.- .SBTTL CMDSPF - PROCESS ROUTINE FOR IO.SPF. ;+6/ ; **-CMDSPF-PROCESS ROUTINE FOR IO.SPF (SPACE FILES)0 ;EJ1 ; THIS ROUTINE PERFORMS THE FUNCTION OF SPACING FORWARD OR BACKWARD OVERG2 ; A SPECIFIED NUMBER OF TAPE MARKS. IF A NEGATIVE TAPE MARK COUNT ISEL3 ; SPECIFIED, THE SKIPPING IS DONE IN THE REVERSE DIRECTION. FOR UNLABELEDI4 ; TAPE, SPACING FILES PAST EOV (TWO CONSECUTIVE TAPE MARKS OR BOT/TMRK)C5 ; IS NOT PERMITTED. 6 ;E 7 ; INPUTS:L8 ;D&9 ; R0=ADDRESS OF FUNCTION TABLE ENTRY: ; R2=ADDRESS OF QST ; ; R3=I/O PACKET ADDRESS< ; R4=ADDRESS OF SCBC= ; R5=ADDRESS OF UCB(1> ; U.CW2, BIT M.AEOV=TAPE AT OR PAST LOGICAL EOTU? ;N @ ; OUTPUTS:A ; B ; R0=STATUS CODE3C ; R1=STATUS INFORMATION (NUMBER OF FILES SKIPPED)PD ; R2-R5 ARE PRESERVEDC1E ; U.CW2, BIT M.AEOV=TAPE AT OR PAST LOGICAL EOTNF ;- G CMDSPF::5H TST I.PRM(R3) ;ANY TAPE MARKS ACTUALLY SPECIFIED?M-I BNE 10$ ;YES. FURTHER PROCESSING NEEDEDE6J MOV #IS.SUC&377,R0 ;INDICATE SUCCESS (NOP THE I/O)$K CALLR CMDXIT ;COMMON ERROR EXIT=K 10$: BITB #US.MNT,U.STS(R5) ;IS THE UNIT MOUNTED? ;PKW109C3P BEQ 20$ ;YES. OK TO DO THIS TYPE OF CMD ;**-4U4Q MOV #IE.PRI&377,R0 ;ERROR. TAPE MUST BE MOUNTED$R CALLR CMDXIT ;COMMON ERROR EXITDR 20$: BITB #US.LAB,U.STS(R5) ;WORKING WITH A LABELED TAPE? ;PKW1092W BNE 30$ ;YES. SKIP LOGICAL EOV CHECKS ;**-49X BIT #M.AEOV,U.CW2(R5) ;ARE WE PAST LOGICAL END OF TAPE )Y BEQ 30$ ;NO. GO TO COMMON PROCESSING3)Z TST I.PRM(R3) ;TEST SPACING DIRECTIONC[ BLE 30$ ;BACKWARD IS OK.T6\ MOV #IE.EOV&377,R0 ;INDICATE EOV ON UNLABELED TAPE$] CALLR CMDXIT ;COMMON ERROR EXIT^ 5_ 30$: CALL CMDCOM ;BUILD A SKELETON COMMAND PACKETA7` BIS #MD.CSE,P.MOD(R1) ;SET 'CLR SER EXCEPT' MODIFIER8a CLR P.TMGC+2(R1) ;HIGH ORDER WORD OF TAPE MARK COUNT5b MOV I.PRM(R3),P.TMGC(R1) ;DEFAULT SPACE FILE COUNT &c BGE 40$ ;GOING FORWARD DIRECTION.4d BIS #MD.REV,P.MOD(R1) ;INDICATE REVERSE DIRECTION5e NEG P.TMGC(R1) ;INDICATE POSITIVE NUMBER OF TMRKST4f 40$: BITB #US.LAB,U.STS(R5) ;IS THIS LABELED TAPE?'g BNE 50$ ;YES. SKIP LEOT PROCESSING %h TST I.PRM(R3) ;FORWARD DIRECTION?&i BLE 50$ ;NO. SKIP LEOT PROCESSING@j BIS #MD.DLE,P.MOD(R1) ;SET TO DETECT LEOT FOR UNLABELED TAPES8k 50$: CLR P.RECC(R1) ;INSURE NO BLOCKS WILL BE SKIPPED4l CLR P.RECC+2(R1) ;HIGH ORDER WORD OF BLOCK COUNT"m PUSH <#CLACMD> ;RETURN ADDRESS%n CALL CMDSEN ;ISSUE TMSCP COMMAND;o ;AHp ; END PACKET PROCESSING. CONTROL RETURNS HERE WHEN THE END PACKET FORIq ; THIS COMMAND IS RECEIVED. AT THIS POINT, THE I/O IS EFFECTIVELY DONE.Gr ; SO IT IS NECESSARY TO SET UP THE RETURN STATUS FOR THE USER. OTHER$=s ; FLAGS HAVE TO BE SET TO SHOW THE RESULT OF THE OPERATION.Dt ; %u CALL ENDERR ;GET RSX STATUS C00t8``†`t`TADATADATADATADATADATAODER-v CMP R0,#IE.EOV&377 ;WAS LEOT ENCOUNTERED?Cw BNE 60$ ;NO.I7x BIS #M.AEOV,U.CW2(R5) ;INDICATE THAT LOGICAL EOT HITAAy BIC #M.PEOV!M.BOT!M.RWD!M.SER!M.TMK!M.EOT,U.CW2(R5) ;NEW STATET7z 60$: PUSH ;NUMBER OF TAPE MARKS SKIPPEDR,{ CALLR ENDCOM ;GO TO COMMON CLEANUP CODE| } .ENDC ;T$$APEY~ .PAGE; .SBTTL CMDXIT - COMMON ERROR EXIT - INCLUDES ILEGAL EXIT.€ ;+� ; -‚ ; **-ILEGAL-EXIT WITH ILLEGAL FUNCTION CODEEƒ ; **-CMDXIT-COMMON ERROR EXITR„ ;EJ… ; THIS ROUTINE PROVIDES A SIMPLE AND COMMON EXIT PATH FOR COMMAND ERRORSI† ; THAT ARE DETECTED BEFORE ANY I/O IS ACTUALLY ISSUED TO THE CONTROLLERC‡ ;E ˆ ; INPUTS:D‰ ;R$Š ; R0=RSX ERROR CODE TO BE RETURNED‹ ;P Œ ; OUTPUTS:� ;NŽ ; CONTROL IS PASSED TO ENDCM1C� ;E� ;-4‘ ILEGAL: MOV #IE.IFC&377,R0 ;ILLEGAL FUNCTION CODE ’ CMDXIT: “ CLR R1 ;NO BYTE COUNT6” PUSH #CLACMD ;RETURN TO CLACMD TO FIND MORE TO DO-• CALLR ENDCM1 ;JOIN COMMON END PROCESSINGI– .PAGE*— .SBTTL CMDSEN - SEND OFF COMMAND PACKET˜ ;+A™ ; **-CMDSEN-ROUTINE TO SEND CMD PKT AND ADD IOP TO C.OLHD QUEUEEš ;A@› ; THIS ROUTINE WILL SEND THE (T)MSCP PACKET TO THE CONTROLLER.Aœ ; IT ALSO WILL ADD THE IOP TO THE END OF THE OUTSTANDING QUEUE.ND� ; IF THE COMMAND IS THE OLDEST, THEN THE COMMAND STATUS IS UPDATED@ž ; AND THE TIMEOUT COUNT IS UPDATED AND THE TIMER GETS STARTED.Ÿ ;   ; INPUTS:M¡ ;R¢ ; R1=COMMAND PACKET ADDRESS £ ; R2=QST ADDRESS¤ ; R3=I/O PACKET ADDRESSN¥ ; R4=SCB ADDRESS¦ ; R5=UCB ADDRESS§ ;M ¨ ; OUTPUTS:© ; ª ; R0-R1-R3 DESTROYEDN« ; R2-R4-R5 PRESERVEDC¬ ;- ­ CMDSEN:A<® POP ;ADDR TO RETURN TO WHEN END PKT ARRIVES0¯ CALLV PORT,PORSEN ;SEND CMD PKT TO CONTROLLER0± MOV (R2),R0 ;/*Q.CST*/ ;ADDR OF CST ;**-1<² ADD #C.OLHD,R0 ;POINT TO QUEUE OF OUTSTANDING I/O PACKETS#³ MOV R3,R1 ;POINTS TO IOP TO ADD 0³ CALL @QINSF ;INSERT IOP INTO QUEUE ;GM112!µ ;R2 GETS DESTROYED ;**-1S6µ MOV S.QST(R4),R2 ;RESTORE THE QST ADDRESS ;PKW109'· MOV R3,R0 ;I/O PKT ADDRESS ;**-1 '¸ MOV (R2),R3 ;/*Q.CST*/ ;ADDR OF CSTS6¹ CMP R0,C.OLHD(R3) ;IS THIS COMMAND NOW THE OLDEST ?º BNE 20$ ;NOD» ;AF¼ ; RESET TIME-OUT COUNT FOR NEW OLDEST COMMAND AND MAYBE RESET BSYUCB½ ;Q¾ ¿ MOVB S.ITM(R4),S.CTM(R4)AAÀ MOV S.BSYU(R4),R1 ;R1 IS THE ADDRESS OF THE PREVIOUS BUSY UNIT,-Á BEQ 10$ ;IF NO UNIT IS BUSY CHANGE BSYUCBS: BICB #US.BSY,U.STS(R1) ;CLEAR BUSY BIT ON OLD BUSY UNIT<à 10$: BISB #US.BSY,U.STS(R5) ;SET BUSY BIT ON NEW BUSY UNIT#Ä MOV R5,S.BSYU(R4) ;CHANGE BSYUCB-9Å MOV #-1,C.CMST(R3) ;SET COMMAND STATUS PROGRESS TO MAXL1Æ MOV #-1,C.CMST+2(R3);UNSIGNED DOUBLE PRECISION$Ç 20$:&È RETURN ;RETURN TO CALLER'S CALLERÉ Ê .PAGE)Ë .SBTTL CMDSIO - START NEXT I/O REQUEST.Ì ;+:Í ; **-CMDSIO-TRY TO START NEXT I/O REQUEST FROM SCB QUEUEÎ ;IDÏ ; THIS ROUTINE WILL TRY TO START THE NEXT I/O REQUEST FROM THE SCBCÐ ; QUEUE. THIS ROUTINE WILL DISPATCH TO THE FUNCTION CODE SPECIFIC.(Ñ ; ROUTINE WHICH WILL RETURN TO CLACMD.Ò ; Ó ; INPUTS:UÔ ;;Õ ; R2=ADDRESS OF QST#Ö ; R3=ADDRESS OF CSTA× ; R4=ADDRESS OF SCBAØ ; R5=ADDRESS OF UCB(Ù ;NÚ ;D Û ; OUTPUTS:Ü ;.Ý ; R0=ADDRESS OF FUNCTION CODE ENTRY IN TABLEÞ ; R1=DESTROYEDß ; R3=I/O PACKET ADDRESS/à ; R2-R4-R5 ARE PRESERVEDá ;Râ ;-ã å CMDSIO: ;**-1/æ MOV #XXACC,R2 ;ADDRESS OF ACCEPTANCE ROUTINETç ;X'è ; MAKE BUSY UNIT TEMPORARILY NON-BUSYIIé ; IT IS ONLY BUSY SO THAT THE TIME-OUT COUNT IN THE SCB IS DECREMENTED.Iê ;Të ì MOV S.BSYU(R4),R0 í BEQ 10$î BICB #US.BSY,U.STS(R0)î 10$: ;GM103'î .IF DF D$$DSK ;IF DISK ;GM103 î ;GM1037î BISB #C2.SHD,C.FLAG(R3);SET RECURSIVE FLAG ;GM103Nî ;GM103î .IFTF ;D$$DSK ;GM103î ;GM1034î CALL @GSPKT ;GET I/O PACKET TO PROCESS ;GM112ñ ; ;**-2ò ; MAKE BUSY UNIT BUSY AGAINXó ; .ó MOV S.QST(R4),R2 ;WE NEED THE QST ;GM103ó ;GM103ó .IFT ;D$$DSK ;GM103Dó ;GM103'ó MOV (R2),R3 ;GET THE00t@`’_b“_c”_d–_k›’ CST ;GM103B<ó BICB #C2.SHD,C.FLAG(R3);CLEAR THE RECURSION FLAG ;GM103ó ;GM103ó .ENDC ;D$$DSK ;GM103ó ;GM103ô MOV S.BSYU(R4),R0 õ BEQ 20$ö BISB #US.BSY,U.STS(R0)F÷ 20$:÷ ;PKW109 A÷ .IF DF D$$DSK&DU$CHK ;IF QUEUE OPTOMIZATION SUPPORTED ;PKW1093÷ BCS 30$ ;IF CS, NO PACKETS LEFT, EXIT ;PKW109 ÷ ; ;PKW109V÷ ; UNFORTUNATELY WE NOW HAVE TO CHANGE SECTOR, TRACK, AND CYLINDER THAT QUEUE ;PKW109<÷ ; OPTOMIZATION NEEDED BACK INTO AN LBN NUMBER. ;PKW109÷ ; ;PKW109B÷ CMPB #IO.RLB/256.,I.FCN+1(R1) ;DATA TRANSFER REQUEST? ;PKW1092÷ BLO CMDRED ;IF LO NO, LEAVE IT ALONE ;PKW1096÷ MOV I.PRM+10(R1),R2 ;GET CYLINDER NUMBER ;PKW1096÷ MOVB U.PRM+1(R5),R0 ;GET TRACKS/CYLINDER ;PKW1096÷ MUL R0,R2 ;TRACKS UP TO CURRENT CYLINDER ;PKW109;÷ MOVB I.PRM+13(R1),R2 ;GET CURRENT TRACK NUMBER ;PKW109OC÷ ADD R3,R2 ;ADD TRACKS IN CYLINDERS TO GET CURRENT TRACK ;PKW109E2÷ MOVB U.PRM(R5),R0 ;GET SECTORS/TRACK ;PKW1094÷ MUL R0,R2 ;SECTORS UP TO CURRENT TRACK ;PKW1096÷ MOVB I.PRM+12(R1),R0 ;GET CURRENT SECTOR ;PKW1090÷ ADD R0,R3 ;GET TOTAL SECTOR NUMBER ;PKW109$÷ ADC R2 ;HIGH AND LOW ;PKW1097÷ MOV R2,I.PRM+10(R1) ;SAVE HIGH LBN NUMBER ;PKW109L6÷ MOV R3,I.PRM+12(R1) ;SAVE LOW LBN NUMBER ;PKW109,÷ MOV S.QST(R4),R2 ;GET THE QST ;PKW109/÷ BR CMDRED ;GO PROCESS THE PACKET ;PKW109A÷ 30$: ;PKW109 ÷ .IFF ;PKW109E÷ BCC CMDRED ;PKW109T%÷ .ENDC ;D$$DSK&DU$CHK ;PKW109C÷ ;PKW109Aû ;**-3V1û MOV (R2),R3 ;**Q.CST** GET THE CST ;PKW106 4þ BIT #C1.DQU,(R3) ;SHOULD WE CALL $DQUMR? ;**-2!þ BEQ 40$ ;IF EQ NO ;PKW109M/ BIC #C1.DQU,(R3) ;CLEAR THE BIT OUT ;**-10 ; ;PKW106X ; DO NOT CHANGE THE FOLLOWING CALL AND RETURN TO A JUMP: $DQUMR IS A COROUTINE ;PKW106 ; ;PKW106' CALL @DQUMR ;AND CALL IT ;GM112W 40$: RETURN ;PKW109 ;+ ;**-5  ; - THE MAGIC IS BACK!! -D ; 2 ; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GSPKT ; + ; R1 = ADDRESS OF THE I/O REQUEST PACKET.01 ; R2 = PHYSICAL UNIT NUMBER OF THE REQUEST UCB.;; ; R3 = KRB ADDRESS (UNLESS 0 THEN R3 = CONTROLLER INDEX). 0 ; R4 = ADDRESS OF THE STATUS CONTROLLER BLOCK.> ; R5 = ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ;S/ ; UDA50 CLASS DISK I/O REQUEST PACKET FORMAT.L ;U, ; WD 00 -- I/O QUEUE THREAD WORD (I.LINK).A ; WD 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER (I.EFN & I.PRI).> ; WD 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK (I.TCB).I ; WD 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER (I.LN2). F ; WD 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTOR'S TASK HEADER ; (I.UCB).7 ; WD 05 -- I/O FUNCTION CODE (IO.RLB/IO.WLB) (I.FCN).D: ; WD 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK (I.IOSB).< ; WD 07 -- RELOCATION BIAS OF I/O STATUS BLOCK (I.IOSB+2).E ; WD 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140000)E ; (I.IOSB+4).F< ; WD 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE (I.AST). ; < ; FOLLOWING FORMAT APPLIES TO ALL DATA TRANSFER FUNCTIONS:! ; J" ; WD 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER (I.PRM).6# ; WD 13 -- BUFFER ADDRESS OF I/O TRANSFER (I.PRM+2).8$ ; WD 14 -- NUMBER OF BYTES TO BE TRANSFERED (I.PRM+4).G% ; WD 15 -- DIAGNOSTIC SUPPLIMENTAL PARAMETER ELSE NOT USED (I.PRM+6).TE& ; WD 16 -- HIGH PART OF LOGICAL BLOCK NUMBER AND HIGH BYTE NOT USEDS' ; (I.PRM+10).EH( ; WD 17 -- LOW PART OF LOGICAL BLOCK NUMBER OF I/O REQUEST (I.PRM+12).H) ; WD 20 -- RELOCATION BIAS OF DIAGNOSTIC REG. BLOCK ADRS ELSE NOT USED* ; (I.PRM+14). G+ ; WD 21 -- DIAGNOSTIC REG. BLOCK ADRS (REAL OR DISPLACEMENT + 140000)1, ; (I.PRM+16). - ;O%. ; SET CHARACTERISTICS FUNCTION CODEE/ ;B 0 ; WD 12 --.1 ; WD 13 -- PARAMETER SPECIFICATION (I.PRM+2)2 ; 0 = RESET VOLUME VALID3 ; 1 = SET VOLUME VALID,4 ; 2 = RESET VOLUME VALID, SPIN UNIT DOWN(5 ; 3 = SET VOLUME VALID, SPIN UNIT UP,6 ; -1 = 00tH``†`t`TADATADATADATADATADATASIZE UNIT (VOLUME VALID UNCHANGED) 7 ; WD 14 --8 ;9 ;-9: CMDRED: ;ENTRY POINT FOR REISSUING I/O'S ON RECOVERYO: ;PKW10618: CLRB I.PRM+11(R1) ;CLEAR INTERNAL FLAG BYTE ;PKW106*: MOV R1,R3 ;SAVE IOP ADDRESS ;PKW106: ;PKW106I3: .IF DF M$$PRO ;MULTIPROCESSOR SYSTEM ;PKW106-,: TST S.URM(R4) ;UNIBUS RUN MASK ;PKW106': BEQ 37$ ;NONE, CONTINUE ;PKW106V : MOV @CPURM,-(SP) ;GM1121: BIT S.URM(R4),@(SP)+ ;OK ON THIS CPU ;GM112U': BNE 37$ ;YES, JUST EXIT ;PKW106 7: ; GET FORK BLOCK AND QUEUE IT IN FORK LIST ;PKW106 9: MOV (R2),R1 ;/*Q.CST*/ ;GET THE CST ADDRESS ;PKW1061>: DEC C.UMCT(R1) ;DECREMENT THE UMR WAIT BLOCK COUNT ;PKW106B: ADD #C.UMRW,R1 ;POINT TO THE BEGINNING OF THE WAIT BLOC ;PKW106?: MOV #-1,R2 ;SET COUNTER TO -1 BECAUSE WE INCREMENT ;PKW106;5: 32$: INC R2 ;INCREMENT THE INDEX COUNTER ;PKW106 /: TST (R1) ;IS THERE A BLOCK HERE? ;PKW106 1: BEQ 33$ ;IF EQ NO, ALLOCATE ANOTHER ;PKW106 0: BIT #1,(R1)+ ;IS THE BLOCK IN USE? ;PKW106(: BNE 32$ ;YES, TRY ANOTHER ;PKW106.: MOV -(R1),R0 ;GET THE WAIT BLOCK ;PKW106(: BR 35$ ;GO TO COMMON CODE ;PKW106E: 33$: PUSH ;SAVE THE TABLE ADDRESS AND BLOCK INDEX ;PKW106 5: MOV #UMRWTB,R1 ;SET LENGTH OF CORE BLOCK ;PKW106 +: CALL @ALOCB ;GET A WAIT BLOCK ;GM112.: POP ;RESTORE REGISTERS ;PKW106&: BCC 34$ ;WE GOT ONE,OK ;PKW106): ;NO POOL, EXIT GRACEFULLY ;PKW106L,: MOV S.QST(R4),R2 ;GET THE QST ;PKW1061: MOV (R2),R1 ;/*Q.CST*/ GET THE CST ;PKW106 H: INC C.UMCT(R1) ;WE'RE NOT GOING TO USE A WAIT BLOCK AFTER ALL ;PKW1068: MOV #IE.NDR&377,R0 ;SET NO DYNAMIC MEMORY ;PKW106: CLR R1 ; ;PKW106B': JMP @IOFIN ;COMPLETE I/O ;GM112S=: 34$: MOV S.URM(R4),(R0)+ ;PUT IN UNIBUS RUN MASK ;PKW106 @: MOV R0,(R1) ;PUT THE NEW BLOCK ADDRESS IN THE TABLE ;PKW1069: 35$: INC (R1) ;SHOW THAT THE BLOCK IS IN USE ;PKW106TE: MOVB R2,I.PRM(R3) ;SAVE UMR WAIT BLOCK INDEX IN I/O PACKET ;PKW106 M: BISB #IP.UMR,I.PRM+11(R3) ;MARK THE I/O AS HAVING A UMR WAIT BLOCK ;PKW106G1: MOV R0,R4 ;PUT THE FORK BLOCK IN R4 ;PKW106#-: CLR (R0)+ ;CLEAR THE FORK LINK ;PKW10663: MOV #36$,(R0)+ ;PUT IN RETURN ADDRESS ;PKW106E+: MOV R5,(R0)+ ;R5, UCB ADDRESS ;PKW106;9: MOV R3,(R0)+ ;IOP ADDRESS (COMES BACK IN R4) ;PKW106E*: MOV @KISR5,(R0)+ ;APR 5 BIAS ;GM1121: CALLR @QFORK ;QUEUE THE FORK BLOCK ;GM112W1: 36$: MOV R4,R3 ;RESTORE IOP ADDRESS ;PKW106EC: MOV U.SCB(R5),R4 ;RECOVER R4 WHICH IS DESTROYED BY FORK ;PKW106A,: MOV S.QST(R4),R2 ;RESTORE QST ;PKW106;: MOV S.PBIA(R4),@KISR6 ;MAP APR 6 TO PORT DRIVER ;GM112R9: MOV S.PBIA(R4),@#KINAR6 ; KERNAL INST SPACE ;PKW106N8: MOV R3,R1 ;RESTORE THE IOP IN R1 FOR $VOLVD ;PKW106: 37$: ;PKW106 : .ENDC ;M$$PRO ;PKW106 : ;PKW106R> ;**-3 .> .IF DF D$$DSK ;DISK DRIVER ONLY ;PKW109D> CMP #IO.SMD,I.FCN(R1) ;IS IT A SET MEDIA DENSITY FUNCTION? ;GM102*> BNE 39$ ;NO, THEN CALL VOLVD ;GM102B> BITB #US.UMD,U.ST2(R5) ;DEVICE ATTACHED FOR DIAGNOSTICS? ;GM102*> BEQ 39$ ;NO, THEN CALL VOLVD ;GM102@> BISB #US.VV,U.STS(R5) ;SET THE VV BIT FOR LATER CHECK ;GM1025> 39$: CALL @VOLVD ;CHECK THE VOLUME VALID ;GM102$,B BCC 40$ ;IF IT WAS OK, CONTINUE ;**-3#C CALLR ENDCM1 ;GO FINISH THE I/O D 40$:D .ENDC ;D$$DSK ;PKW109DF ;**-1V1F MOV I.FCN(R3),R1 ;GET FUNCTION CODE ;PKW106 ;H BIC #IQ.Q!IQ.X!IQ.UMD,R1 ;CLEAR OUT ANY MODIFIERS ;**-1CDH MOV R1,EIOFUN ;INITIALIZE END OF TABLE WITH USER I/O CODE ;PKW1095H MOV #IOFUN,R0 ;ADD OF I/O FUNCTION TABLE ;PKW109GH 50$: ;PKW109S-H CMP R1,(R0) ;I/O CODES MATCH ? ;PKW109 H BEQ 60$ ;YES ;PKW109O7H ADD #FOSIZ,R0 ;POINT TO NEXT FUNCTION CODE ;PKW109 &H BR 50$ ;KEEP ON LOOKING ;PKW109JH 60$: JMP @FO.CMD(R0) ;DISPATCH TO FUNCTION CODE SPECIFIC ROUTINE ;PKW109L .PAGE ;**-3M .SBTTL CMDSTC - SET STATUSQN ;+O ; **-CMDSTC-P ;TLQ 00tP`’_b“_c”_d–_k›’; THIS ROUTINE DISPATCHES ALL IO.STC COMMANDS. ONLINE AND GET UNIT STATUSUR ; COMMANDS ARE PASSED OFF TO OTHER ROUTINES. AVAILABLE COMMANDS ARE PROCESSED HERE S ;0QT ; FOR DISKM THE IO.STC FUNCTION WILL DO ONE OF THE FOLLOWING ACTIONS, DEPENDINGU ; ON THE VALUE IN I.PRM+2:V ;CW ; I.PRM+2 ActionX ; ------- ------OY ; 0 SET UNIT AS AVAILABLECZ ; 1 SET UNIT AS ONLINE0[ ; 2 SET UNIT AVAILABLE, AND SPIN UNIT DOWN\ ; 3 SAME AS 1-] ; -1 GET UNIT STATUSC^ ;-J_ ; FOR TAPE, THIS ROUTINE PERFORMS THE SET CHARACTERISTIC FUNCTION. THISG` ; MEANS THAT A TMSCP ONLINE COMMAND IS ISSUED, FOLLOWED BY A GET UNITNIa ; STATUS COMMAND. IF THE STC FUNCTION IS ISSUED BY CON/HRC, THE ONLINE Ab ; COMMAND IS NOT ISSUED; THE GET UNIT STATUS COMMAND IS ISSUED.Ic ; CON/HRC IS CONSIDERED TO HAVE SENT THE STC FUNCTION IF BOTH ARE TRUE:Id ;C8e ; 1. UNIT IS ATTACHED FOR DIAGNOSTICS (US.UMD IS SET)5f ; 2. STC COMMAND HAS THE IQ.UMD SUBFUNCTION BIT SET g ;N h ; INPUTS: i ; &j ; R0 ADDRESS OF FUNCTION TABLE ENTRYk ; R2 QST ADDRESSl ; R3 I/O PACKET ADDRESSTm ; R4 SCB ADDRESSn ; R5 UCB ADDRESSo ;Y p ; OUTPUTS:q ;Tr ;- s CMDSTC: t .IF DF D$$DSK ;IF DISK u -v TST I.PRM+2(R3) ;IS IT A GET UNIT STATUS?E w BGE 10$ ;NOPE, KEEP LOOKING!x CALLR CMDGUS ;GO DO IT THEREVy 1z 10$: BIT #1,I.PRM+2(R3) ;IS IT AN ONL COMMAND?.{ BEQ 20$ ;NOPE,CONTINUET!| CALLR CMDONL ;GO DO IT THEREM} -~ 20$: CALL CMDCOM ;GO GET A COMMAND PACKET 7‚ TST I.PRM+2(R3) ;SHOULD WE SPIN IT DOWN TOO? ;**-3 ƒ BEQ 30$ ;NOPE,KEEP GOINGC?ƒ MOV U.UC2X(R5),@KISR6 ;MAP SECOND UCB EXTENSION ;GM112U4† MOV X.UNFL+140000,R0 ;RETRIEVE UNIT FLAGS ;**-2;† MOV S.PBIA(R4),@KISR6 ;RESTORE PORT MAPPING ;GM112 2‰ BIT #UF.RMV,R0 ;IS THE DISK REMOVABLE? ;**-2-Š BEQ 30$ ;NO, DON'T SPIN DOWN FIXED DISKS;0‹ MOV #MD.SPD,P.MOD(R1) ;SET SPIN DOWN MODIFIERA‹ 30$: PUSH <#CLACMD> ;RETURN TO STARTING OTHER COMMANDS ;PKW109O� CALL CMDSEN ;**-4T‘ ’ ;R(“ ; RETURN TO THIS POINT WITH END PACKETM” ; REGISTERS ARE THE SAME EXCEPT THAT R1 CONTAINS AN END PACKET INSTEAD OF AT• ; COMMAND PACKET.M– ;U<– CALL ENDERR ;CHANGE END CODE TO RSX STATUS CODE ;PKW110(– PUSH <#0> ;NO BYTE COUNT ;PKW110@– CMP #ST.SDI!ST.CON,P.STS(R1) ;WAS SPIN DOWN IGNORED? ;PKW110*– BNE 70$ ;NO, JUST FINISH UP ;PKW110– ; ;PKW1104– ; WE HAVE TO SPIN DOWN THE OTHER UNIT ;PKW110– ; ;PKW110>– CALL ENDCMO ;GO FINISH THE COMMAND, AND COME BACK ;PKW110:– MOV U.UC2X(R5),@KISR6 ;MAP SECOND UCB EXTENSION ;GM1126– MOV X.MLUN+140000,R2 ;GET MULTI-UNIT CODE ;PKW1107– MOV S.PBIA(R4),@KISR6 ;RESTORE PORT MAPPING ;GM112O4– MOV R5,R0 ;SAVE THE ORIGINAL UCB IN R0 ;PKW110<– PUSH #SCUCB ;NOW SEARCH TO FIND ONE THAT MATCES ;PKW110*– 40$: CALL @(SP)+ ;GET A UCB ;PKW110/– BCC 50$ ;WE GOT ONE, CHECK IT OUT ;PKW110V=– MOV S.QST(R4),R2 ;RESTORE THE QST BEFORE EXITING ;PKW1100.– RETURN ;END OF UCB SEARCH, EXIT ;PKW110– ;PKW110M;– 50$: CMP R0,R5 ;IS IT THE UCB WE STARTED WITH? ;PKW110V-– BEQ 40$ ;YES, GET THE NEXT ONE ;PKW1100:– MOV U.UC2X(R5),@KISR6 ;MAP SECOND UCB EXTENSION ;GM1129– MOV X.MLUN+140000,R1 ;GET THE MULTI-UNIT CODE ;PKW110S7– MOV S.PBIA(R4),@KISR6 ;RESTORE PORT MAPPING ;GM112 2– CMP R1,R2 ;MULTI UNIT CODE THE SAME? ;PKW110-– BNE 40$ ;NOPE, GET ANOTHER ONE ;PKW110S8– ADD #10,SP ;WE FOUND IT, FLUSH THE UCB SCAN ;PKW110:– BIS #UU.IOS,U.UTIL(R5) ;SET THE STALL I/O BIT ;PKW1108– MOV #T.NIOS,R0 ;I/O STALLED CONSOLE MESSAGE ;PKW110'– CALL @DVMSG ;GO PRINT IT ;GM112X,– MOV S.QST(R4),R2 ;GET THE QST ;PKW1101– MOV (R2),R3 ;/*Q.CST*/ AND THE CST ;PKW1100+– CALL PIOPAL ;ALLOCATE A PIOP ;PKW110V?– MOV #AVNFUN,R0 ;SET UP THE AVAILABLE FUNCTION TABLE ;PKW110 +– CALL CMDCOM ;GO GET A PACKET ;PKW1104=– MOV #MD.SPD,P.MOD(R1) ;SET THE SPIN DOWN MODIFIER ;PKW110N<– PUSH #CLACMD ;SEE IF WE CAN START MORE COMMANDS ;PKW110/– CALL CMDSEN 00tX``†`t`TADATADATADATADATADATA ;SEND OFF THE PACKET ;PKW110 – ; ;PKW110X– ; END PACKET RETURNS HERE. WE CAN'T REALLY DO ANYTHING INTELLIGENT IF THE I/O ;PKW1106– ; IS NOT A SUCCESS, SO JUST COMPLETE IT. ;PKW110– ; ;PKW110(– PUSH <#0> ;NO BYTE COUNT ;PKW1101– MOV #IS.SUC&377,R0 ;SHOW SUCCESSFUL ;PKW110P)– 70$: JMP ENDCOM ;FINISH IT ;PKW110 ¤ ;**-13¥ .IFF ;D$$DSK - IF TAPEN§ ;**-1W7¨ BIT #IQ.UMD,I.FCN(R3) ;USER MODE DIAGNOSTIC BIT SET?S,© BEQ 20$ ;NO. DO ONLINE/GET-UNIT-STATUS4ª BITB #US.UMD,U.ST2(R5) ;ATTACHED FOR DIAGNOSTICS?,« BEQ 20$ ;NO. DO ONLINE/GET-UNIT-STATUS¬ 3­ MOV #GUSFUN,R0 ;ISSUE A GET-UNIT-STATUS COMMANDO1® CALL CMDCOM ;BUILD THE COMMAND PACKET NEEDEDS$¯ PUSH <#CLACMD> ;WHENCE TO RETURN#° CALL CMDSEN ;ISSUE THE COMMAND ± ;W² ; END PACKET PROCESSINGF³ ; )´ MOV P.STS(R1),R0 ;GET THE STATUS CODE -µ BIC #^C,R0 ;GET MAJOR STATUS CODE#)¶ CMP R0,#ST.AVL ;IS IT AVAILABLE CODE?S· BNE 10$ ;NO.;1¸ CLR R0 ;/*ST.SUC*/ ; INDICATE SUCCESS ANYWAYT0¹ 10$: CALL ENDERR ;CONVERT TO RSX STATUS CODE&º PUSH <#0> ;NO STATUS FOR IOSB + 2+» CALLR ENDCOM ;AND GO CLEAN UP PROPERLYO6» 20$: BIT #M.BOT,U.CW2(R5) ;ARE WE AT BOT? ;JJM3000» BEQ 25$ ;NO. DO NOT WORRY ABOUT IT ;JJM300H» BIT #UU.BLK,U.UTIL(R5) ;DOES UNIT SUPPORT MULTIPLE DENSITIES? ;JJM3001» BNE 25$ ;NO. NOTHING TO DO IN HERE ;JJM300>/» MOV Q.CST(R2),R0 ;GET CST ADDRESS ;JJM300;4» MOV R3,C.EXTN(R0) ;SAVE R3 TEMPORARILY ;JJM3005» CALL PIOPAL ;GET A PIOP FOR THE COMMAND ;JJM300N7» MOV #AVNFUN,R0 ;FUNCTION CODE ENTRY TO USE ;JJM300A2» CALL CMDCOM ;BUILD TEMPLATE COMMAND ;JJM300C» BIS #MD.CSE,P.MOD(R1) ;SET 'CLEAR SERIOUS EXCEPTION' MOD ;JJM300 0» PUSH <#CLACMD> ;WHERE TO RETURN TO ;JJM300-» CALL CMDSEN ;ISSUE THE COMMAND ;JJM300I4» PUSH ;SAVE REGISTERS FOR LATER ;JJM300=» MOV #IS.SUC,R0 ;NON-ZERO -> RETURN PACKET TO POOL ;JJM300J-» PUSH <#0> ;NO IOSB DATA EITHER ;JJM300I0» CALL ENDCMO ;CLEAN UP PACKET USED ;JJM300/» MOV Q.CST(R2),R0 ;GET CST ADDRESS ;JJM300C,» MOV C.EXTN(R0),R3 ;RESTORE R3 ;JJM300-» POP ;RESTORE REGISTERS ;JJM300E<» 25$: CALLR CMDONL ;ISSUE ONLINE/GET-UNIT-STATUS ;JJM300À ;**-4 Á .ENDC ;D$$DSK .PAGE .IF DF,D$$DSK ;JJM304*à .SBTTL CMDTRM - PROCESS RCT TERMINATIONÆ ;+ ;**-2/Ç ; **-CMDTRM- PROCESS RCT TERMINATION REQUESTSPÈ ;JJÉ ; THIS SECTION DOES ALL THE PROCESSING SPECIFIC TO TERMINATION REQUESTS.MÊ ; I.PRM CONTAINS THE ADDRESS OF THE I/O THAT MUST BE RESTARTED, AND I.PRM+2/Ë ; CONTAINS THE STATUS CODE RETURNED FROM RCT.PÌ ;1 Í ; INPUTS:RÎ ;I+Ï ; R0 ADDRESS OF FUNCTION TABLE ENTRYEÐ ; R2 QST ADDRESS;Ñ ; R3 I/O PACKET ADDRESSÒ ; R4 SCB ADDRESS Ó ; R5 UCB ADDRESS3Ô ; Õ ; OUTPUTS:Ö ;O× ;- Ø CMDTRM:I?Ù BIT #IQ.X!IQ.Q!IQ.UMD,I.FCN(R3) ;THESE MODIFIERS ARE ILLEGALRÚ BEQ 10$ ;IT'S OKSÛ CALLR ILEGAL Ü &Ý 10$: MOV R5,R0 ;COPY THE UCB TO R09Þ ADD #U.BPKT,R0 ;ADD THE OFFSET TO THE BAD BLOCK QUEUEE<ß MOV I.PRM(R3),R1 ;GET THE I/O THAT INITIATED THE REPLACE5à BEQ 40$ ;IF NO IOP THEN JUST COMPLETE WITH SUCCERá PUSH ;SAVE R3R2á CALL @QRMVA ;REMOVE IT FROM THE QUEUE ;GM1129ã MOV (SP),R3 ;GET R3, BUT LEAVE IT ON THE STACK ;**-13-ä CMPB #IS.SUC,I.PRM+2(R3) ;DID RCT SUCCEED? "å BNE 20$ ;NO, COMPLETE THE I/O2æ MOV R4,R0 ;COPY THE SCB TO R0 (S.LHD IS AT 0)=æ CALL @QINSP ;INSERT THE IOP BACK IN THE SCB QUEUE ;GM112 )è MOV S.QST(R4),R2 ;RESTORE R2 ;**-1 é BR 30$ ;COMMON END POINTRê 20$: ë MOV S.QST(R4),R2 ;RESTORE R2+ì MOV I.PRM+2(R3),R0 ;GET THE STATUS CODEW1í MOV I.PRM(R3),R3 ;MOVE THE ORIGINAL IOP TO R3Aî CLR R1 ;NO BYTE COUNT ï CALL ENDCM1 ;FINISH THE I/Oð ñ 30$: POP ;RESTORE R3*ò 40$: MOV #IS.SUC&377,R0 ;SUCCESS STATUSó CLR R1 ;NO BYTE COUNT)ô PUSH <#CLACMD> ;TRY TO START MORE I/O #õ CALLR ENDCM1 ;FINISH THE I.TRM;ö ÷ .ENDC ;D$$DSKTø .PA00t``’_b“_c”_d–_k›’GE?ù .SBTTL ENDCOM - COMMON PROCESSING TO COMPLETE AN I/O REQUEST ú ;+<û ; **-ENDCOM - COMMON PROCESSING TO COMPLETE AN I/O REQUESTCü ; **-ENDCMO - ALTERNATE ENTRY POINT FOR ENDCOM (RETURN TO CALLER)Tý ; ROUTINE DESCRIPTION þ ;R ÿ ; INPUTS:C ;: ; R0=STATUS (0 -> DO NOT CALL $IOFIN, I/O STILL PENDING) ; R1=END PACKETV ; R2=ADDRESS OF QSTS ; R3=I/O PACKET ADDRESSY ; R4=ADDRESS OF SCBC ; R5=ADDRESS OF UCB  ; (SP)=BYTECOUNT ;F( ; OUTPUTS: (FALLING THROUGH TO ENDCM1) ;A ; R0,R2-R5 ARE PRESERVED ; R1 IS SET TO BYTECOUNT ;-  ENDCMO:+6 MOV (SP),-(SP) ;COPY TOP OF STACK TO A TEMPORY CELL. MOV 4(SP),2(SP) ;GET SPACE FOR SECOND VALUE' MOV (SP)+,2(SP) ;FINISH THE EXCHANGE  ENDCOM:  .IF DF E$$LOG " TST R0 ;IS THERE ENDING STATUS- BEQ 10$ ;NO, THEN WE DON'T LOG THE PACKETVA BITB #EF.LOG,P.STS(R1) ; IS THERE AN ERRORLOG PACKET TO FOLLOWS BEQ 10$ ;NO, THEN DON'T LOG; CMPB #OP.ONL!OP.END,P.OPCD(R1);ONLINE COMMAND? ;JJM313D) BEQ 10$ ;DO NOT LOG PACKET ;JJM313  ;JJM313T .IF DF,T$$APE ;JJM313> CMPB #OP.AVL!OP.END,P.OPCD(R1);AVAILABLE COMMAND? ;JJM313) BEQ 10$ ;DO NOT LOG PACKET ;JJM313S .ENDC ;T$$APE ;JJM313M ;JJM313& CALL LERR ;LOG THE ERROR ;**-3 10$: .ENDC ;E$$LOG ;**-16! BIT #IQ.UMD,I.FCN(R3);USER MODE DIAGNOSTIC REQUEST?" BEQ 70$ ;NOQ,# PUSH ;SAVE WORK REGISTERS"$ MOV R3,R0 ;COPY OF IOP ADDRESS% & .IF DF T$$APE' 5( CMPB #IO.EOF/256.,I.FCN+1(R3) ;WRITE EOF FUNCTIOND) BEQ 20$ ;IF EQ YES1* CMPB #IO.RWD/256.,I.FCN+1(R3) ;REWIND FUNCTION?+ BNE 30$ ;IF EQ YES3, 20$: MOV I.PRM+14(R3),I.PRM+16(R3) ;RELOCATE BIAS 2- MOV I.PRM+12(R3),I.PRM+14(R3) ;RELOCATE ADDRESS. 30$:/ .IFTF ;T$$APE0 .1 MOV I.PRM+14(R0),R3 ;DESTINATION APR 6 BIAS2 BEQ 40$ ;NO BUFFER/3 MOV I.PRM+16(R0),R4 ;REGISTER BUFFER ADDRESSR4 BEQ 40$ ;NO BUFFER5 $6 MOV R1,R2 ;R2 IS THE SOURCE DISP*7 SUB #ENVLEN,R2 ;BACK TO START OF HEADER/8 BIC #160000,R2 ;R2 IS ADDRESS IN APR 5 RANGEQ9 BIS #120000,R2 ;C29 MOV @KISR6,R1 ;R1 IS SOURCE APR 5 BIAS ;GM1120; MOV #RPLEN+ENVLEN,R0;NUMBER OF BYTES ;**-1); CALL @BLXIO ;MOVE THE DATA ;GM112,= 40$: ;**-1A> .IFT ;T$$APE.? %@ MOV 2(SP),R3 ;RESTORE IOSB ADDRESS;5A CMPB #IO.EOF/256.,I.FCN+1(R3) ;WRITE EOF FUNCTIONIB BEQ 50$ ;IF EQ YES1C CMPB #IO.RWD/256.,I.FCN+1(R3) ;REWIND FUNCTIONVD BNE 60$ ;IF EQ YES2E 50$: MOV I.PRM+14(R3),I.PRM+12(R3) ;RESTORE BIAS1F MOV I.PRM+16(R3),I.PRM+14(R3) ;RESTORE ADDRESS G 60$:H .ENDC ;T$$APEI 1J POP ;RESTORE ORIGINAL CONTENTSEM 70$: ;**-2Y2N PUSH ;SAVE COMPLETION CODE/IOP ADDRESS*O CALLV PORT,PKTDR ;DEALLOCATE END PACKET&P MOV R3,R1 ;SAVE THE PACKET ADDRESS/Q MOV (R2),R0 ;/*Q.CST*/ ;GET THE CST ADDRESSE&R ADD #C.OLHD,R0 ;POINT TO QUEUE HEAD7S CMP R1,(R0) ;IS THIS THE OLDEST PACKET IN THE QUEUEE(T BNE 90$ ;NO, DON'T BOTHER WITH TIMERU ;+:V ; MUST TAKE CARE OF TIMER BECAUSE OLDEST COMMAND IS DONEW ;D$X TST (R1) ;OTHER PACKETS ON QUEUE)Y BEQ 80$ ;NO, THEN DON'T RESTART TIMERCZ ;TB[ ; RESET TIME-OUT COUNT FOR NEW OLDEST COMMAND AND RESET BUSY UCB\ ;D>^ MOV (R1),R1 ;R1 IS THE ADDRESS OF THE NEW OLDEST CMD ;**-14_ MOV I.UCB(R1),R1 ;R1 IS THE UCB OF THE NEW OLDEST.` BICB #US.BSY,U.STS(R5) ;CLEAR OLD BUSY UNIT,a BISB #US.BSY,U.STS(R1) ;SET NEW BUSY UNIT,b MOV R1,S.BSYU(R4) ;REMEMBER NEW BUSY UNIT&c MOVB S.ITM(R4),S.CTM(R4) ;SET TIMER2d MOV (R0),R1 ;GET BACK THE IOP WE'RE WORKING ON e BR 90$1f ;T9g ; STOP THE TIMER THERE ARE NO MORE COMMANDS OUTSTANDINGIh ;i 80$:j CLRB S.CTM(R4) ;STOP TIMEROk BICB #US.BSY,U.STS(R5)Yl CLR S.BSYU(R4) ;CLEAR BSYUCBSm 90$:9m CALL @QRMVA ;REMOVE THE PACKET FROM THE QUEUE ;GM112S1o MOV S.QST(R4),R2 ;RESTORE QST ADDRESS ;**-15;p POP ;RESTORE IOP ADDR, COMPL CODE, BYTE COUNTSq ;Tr ; FALL THROUGH TO ENDCM1s ;Nt .PAGEKu .SBTTL ENDCM1 - A00th``†`t`TADATADATADATADATADATALTERNATE ENTRY POINT FOR COMMANDS WITHOUT AN END PACKET v ;+Hw ; **-ENDCM1 - ALTERNATE ENTRY POINT FOR COMMANDS WITHOUT AN END PACKETx ; ROUTINE DESCRIPTION0y ; z ; INPUTS:4{ ;O:| ; R0=STATUS (0 -> DO NOT CALL $IOFIN, I/O STILL PENDING)} ; R1=BYTECOUNT~ ; R2=ADDRESS OF QSTV ; R3=I/O PACKET ADDRESS € ; R4=ADDRESS OF SCBR� ; R5=ADDRESS OF UCBE‚ ; ƒ ; OUTPUTS:„ ;R… ; R0-R1 DESTROYED† ; R2,R4-R5 ARE PRESERVED‡ ; R3 IS SET TO CSTˆ ;-‰ Š ENDCM1:.‹ Œ ;.)� ;DEALLOCATE UMRS IF THEY WERE ALLOCATEDMŽ ; F‘ BITB #IP.UMR,I.PRM+11(R3) ;A UMR WAIT BLOCK ALLOCATED FOR THI ;**-2’ BEQ 20$ ;IF EQ NO “ PUSH ;SAVE R2 AND R30” BICB #IP.UMR,I.PRM+11(R3) ;CLEAR THE UMR FLAG'• MOV (R2),R2 ;/*Q.CST*/ ;GET THE CST1/– BIS #C1.DQU,(R2) ;SET THE BIT TO CALL $DQUMRC:— ADD #C.UMRW,R2 ;POINT TO THE BEGINNING OF THE WAIT BLOC)˜ MOVB I.PRM(R3),R3 ;GET THE BLOCK INDEXR#™ PUSH ;SAVE THE BLOCK INDEX (š ASL R3 ;MAKE THE INDEX A WORD OFFSET3› ADD R3,R2 ;ADD IT TO THE BEGINNING OF THE TABLE "œ DEC (R2) ;CLEAR THE IN USE BIT%� PUSH ;SAVE THE TABLE ADDRESS7ž MOV (R2),R2 ;GET THE ADDRESS OF THE BLOCK FOR DEUMR)Ÿ ADD #10,R2 ;POINT TO THE MAPPING INFO   MOV S.QST(R4),R3 ;GET THE QST'¡ MOV (R3),R3 ;/*Q.CST*/ ;NOW THE CSTE;¢ INC C.UMCT(R3) ;INCREMENT THE UMR ASSIGNMENT BLOCK COUNTN,¢ CALL @DEUMR ;DEASSIGN THE UMRS ;GM112@¤ POP ;RESTORE THE BLOCK INDEX AND BLOCK ADDRESS ;**-1M¤ .IIF DF D$$DSK CMP #DUUMR,R3 ;IS IT A DYNAMICALLY ALLOCATED BLOCK? ;PKW107AM¤ .IIF DF T$$APE CMP #MUUMR,R3 ;IS IT A DYNAMICALLY ALLOCATED BLOCK? ;PKW107 § BGE 10$ ;IF GE, NO ;**-2 ¨ PUSH ;SAVE R0 AND R1+© MOV (R2),R0 ;MOV THE ADDRESS FOR $DEACBQD© .IIF DF M$$PRO TST -(R0) ;ADJUST FOR EXTRA WORD FOR URM ;PKW1066© CLR (R2) ;CLEAR THE ADDRESS IN THE TABLE ;PKW1062© MOV #UMRWTB.,R1 ;LENGTH OF THE BLOCK ;PKW1063© CALL @DEACB ;DEALLOCATE THE WAIT BLOCK ;GM112S+­ POP ;RESTORE R1 AND R0 ;**-3T&® 10$: POP ;RESTORE R3 AND R2/² 20$: TST R0 ;DO WE COMPLETE THIS IO ;**-3C³ BEQ 40$ ;NO, THEN WE EXIT*´ BITB #IP.FAK,I.PRM+11(R3) ;IS IT A PIOPµ BEQ 30$ ;NO, FINISH THE I/O2:¶ MOV R3,R1 ;MOVE ADDRESS OF PIOP TO R1 FOR DEALLOCATION2· MOV (R2),R3 ;/*Q.CST*/ ;WE NEED CST FOR PIOPDE%¸ CALLR PIOPDE ;DEALLOCATE THE PIOP ¸ ;GM104¸ 30$: PUSH ;GM104¸ ;GM104=¸ CALL @IODSA ;SPECIAL ENTRY POINT FOR MSCP DEVICES ;GM104S¸ ;GM104¸ POP ;GM104R¸ ;GM104CÈ MOV U.SCB(R5),R4 ;RECOVER R4 WHICH IS DESTROYED BY $IOFIN ;**-15 (É MOV S.QST(R4),R2 ;RESTORE QST ADDRESSÊ 40$:+Ë MOV (R2),R3 ;/*Q.CST*/ ;CST IS RESTOREDRÌ RETURN ;RETURN TO CALLERRÍ Î .PAGE8Ï .SBTTL ENDERR - TRANSLATE MSCP ERROR CODE TO RSX CODEÐ ;+4Ñ ; **-ENDERR- TRANSLATE MSCP ERROR CODE TO RSX CODEÒ ;:GÓ ; THIS ROUTINE LOOKS AT THE CURRENT END PACKET, POINTED TO BY R1, ANDTFÔ ; TRANSLATES THE MSCP ERROR RETURNED TO THE RSX EQUIVALENT. IN SOMEIÕ ; ERRORS, ADDITIONAL ACTION IS REQUIRED, E.G. FOR POSITION LOST ERRORS,S#Ö ; THE POWER FAIL BIT MUST BE SET.T× ;R Ø ; INPUTS:TÙ ;EÚ ; R1=ADDRESS OF END PACKETÛ ; R2=ADDRESS OF QSTEÜ ; R3=I/O PACKET ADDRESSCÝ ; R4=ADDRESS OF SCB Þ ; R5=ADDRESS OF UCBAß ;C à ; OUTPUTS:á ; /â ; R0=RSX ERROR STATUS (CAN BE IS.SUC AS WELL)Oã ; R1-R5=PRESERVED>ä ; POWERFAIL FLAG SET IF TMSCP ERROR IS ST.POL(POSITION LOST)å ;Næ ;- ç ENDERR:Sè .IF DF T$$APE ;TAPE ONLY é 5ê BITB #EF.EOT,P.FLGS(R1) ;WAS PHYSICAL EOT REACHED?Rë BEQ 10$ ;NO.O5ì MOVB P.OPCD(R1),R0 ;GET US THE ACTUAL OPCODE USEDT9í BIC #177400!OP.END,R0 ;CLEAR ALL BUT THE OPCODE ITSELF1î CMP R0,#OP.RD ;WAS THIS EITHER READ FUNCTION?2ï BEQ 10$ ;YES. DON'T REPORT EOT ON SUCH THINGS5ð MOV #IE.EOT&377,R0 ;INDICATE PHYSICAL END OF TAPES<ñ BIC #M.AEOV!M.BOT!M.RWD!M.SER!M.TMK,U.CW2(R5) ;NEW STATES"ò BIS #M.EOT,U.CW2(R5) ;NEW STATE-ó RETURN ;THAT'S ALL WE NEED FOR THIS ONE;ô 10$:õ .IFTF ;T$$APEO00tp`’_b“_c”_d–_k›’ö .÷ PUSH ;SAVE. NEED AS A WORK REGISTER,ø MOV P.STS(R1),R1 ;GET TMSCP STATUS CODES-ù BIC #^C,R1 ;CLEAR OUT THE SUBCODELú û .IFT ;T$$APEü *ý CMP #ST.AVL,R1 ;IS THE UNIT AVAILABLE?,þ BEQ 20$ ;YES. THIS MEANS CERTAIN STATE.ÿ CMP #ST.BOT,R1 ;IS THERE A BOT INDICATION? BNE 30$ ;NO.T, 20$: BIS #M.BOT,U.CW2(R5) ;INDICATE AT BOTD BIC #M.AEOV!M.PEOV!M.RWD!M.SER!M.TMK!M.EOT,U.CW2(R5) ; NEW STATES 30$: .IFTF ;T$$APE  0 MOVB RSXTAB(R1),R0 ;TRANSLATE THE ERROR CODE5 BIC #177400,R0 ;CLEAR OUT THE HIGH BYTE OF STATUS;  .IFT ;T$$APE ) CMPB R1,#ST.POL ;POSITION LOST ERROR? BNE 40$ ;NO. GO CLEAN UP5 BISB #US.PWF,U.STS(R5) ;SET POWERFAIL BIT FOR UNITE 40$:2 POP ;RESTORE END PACKET ADDRESS ;PKW105 ;PKW105B  .IFF ;DISK ONLY ;PKW105 ;PKW105T2 POP ;RESTORE END PACKET ADDRESS ;PKW1057 CMP P.STS(R1),#ST.DAT ;IS IT FORCED ERROR? ;PKW105* BNE 50$ ;NO, LEAVE IT ALONE ;PKW105= MOV #IE.FER&377,R0 ;SET FORCED ERROR STATUS CODE ;PKW105  50$: ;PKW105 .ENDC ;PKW105 ;PKW105B8 CMP #ST.OFL,P.STS(R1) ;WAS IT UNIT OFFLINE? ;PKW105' BNE 60$ ;NOPE, JUST EXIT ;PKW105<: MOV #IE.IDU&377,R0 ;ST.OFL MEANS NO SUCH UNIT ;PKW105 60$: ;PKW105L. RETURN ;AND GO BACK TO THE CALLER ;**-3  .PAGE .IF DF,D$$DSK ;JJM304# .SBTTL ENDSIO - TRY TO STALL I/OR ;+ ;**-25 ;**-ENDSIO- TRY TO STALL I/O ;  ; INPUTS: ;**-1O ;E ; R1 END PACKET ADDRESS ; R2 QST ADDRESS ; R3 (P)IOP ADDRESS;! ; R4 SCB ADDRESS" ; R5 UCB ADDRESS# ;P $ ; OUTPUTS:2% ; CARRY CLEAR - R1-R5 PRESERVED, I/O NOT STALLED/& ; CARRY SET - R2,R4,R5 PRESERVED, I/O STALLEDM& ;- ;PKW10916& ENDSIO: MOV P.STS(R1),R0 ;GET STATUS WORD ;PKW1096& BIC #^C,R0 ;CLEAR SUBSTATUS BITS ;PKW109.& CMP #ST.OFL,R0 ;OFFLINE TO DISK ;PKW1092& BEQ 5$ ;YES, SHOULD TRY TO STALL I/O ;PKW1092& CMP #ST.AVL,R0 ;HOW ABOUT AVL STATE? ;PKW1090& BNE 20$ ;NOT THAT EITHER, CONTINUE ;PKW109& 5$: ;PKW1094* BITB #IP.FAK,I.PRM+11(R3) ;IS IT A PIOP? ;**-32+ BNE 20$ ;YES, LET PIOP'S THROUGH FOR RECOVERY=+ BIT #UU.SIO,U.UTIL(R5) ;DOES THIS UNIT STALL I/O? ;PKW109W/ BEQ 20$ ;IF EQ NO ;**-3;/0 BITB #US.MNT,U.STS(R5) ;IS THE UNIT MOUNTED? !1 BNE 20$ ;NO, DON'T STALL I/O 01 CLR R0 ;INDICATE NOT TO FINISH I/O ;PKW109<3 PUSH ;SAVE THE IOP AND SHOW NO BYTE COUNT ;**-1)4 CALL ENDCMO ;CLEAN UP THE END PACKETE%4 POP ;GET THE IOP ;PKW10914 ;PKW109K94 .IF DF D$$DSK&DU$CHK ;IF QUEUE OPTIMIZATION ;PKW1094 ;PKW109T=4 MOV I.UCB(R1),R5 ;MAKE SURE WE HAVE THE RIGHT UCB ;PKW109H,4 CALL REQUE ;RECONVERT THE LBN ;PKW1094 ;PKW109B%4 .ENDC ;D$$DSK&DU$CHK ;PKW109T4 ;PKW109O=4 MOV R4,R0 ;MOVE THE S.LHD QUEUE TO R0 FOR $QINSB ;PKW109K=4 CALL @QINSB ;INSERT AT THE BEGINNING OF THE QUEUE ;GM112*=4 BIT #UU.IOS,U.UTIL(R5) ;DID WE ALREADY STALL I/O? ;PKW109G54 BNE 10$ ;YES, DON'T REISSUE THE MESSAGE ;PKW109 89 BIS #UU.IOS,U.UTIL(R5) ;SET THE STALL I/O BIT ;**-4+: MOV #T.NIOS,R0 ;SET I/O STALLED MESSAGE &: CALL @DVMSG ;GO SEND IT ;GM112)> MOV S.QST(R4),R2 ;RESTORE R2 ;**-3 /> 10$: SEC ;SHOW THAT WE STALLED IT ;PKW109W@ RETURN ;**-1OA !B 20$: CLC ;WE DIDN'T STALL ITT C RETURNID E .ENDC ;D$$DSKQb .PAGE ;**-28I/c .SBTTL FINIO - FINISH UP ALL I/O IN A QUEUE(d ;+/e ;**-FINIO-FINISH ALL I/O IN A QUEUE AS IE.FHE;f ;D g ; INPUTS:Th ;S i ; R1 INITIAL POINTER FOR QUEUEj ; R2 QST ADDRESSk ; R4 SCB ADDRESSl ; R5 UCB ADDRESSm ;/ n ; OUTPUTS:o ; R2,R4,R5 PRESERVEDp ;-q FINIO:+r MOV R1,R3 ;COPY THE QUEUE ADDRESS TO R3-%s MOV (R3),R3 ;GET THE FIRST PACKET ,t BEQ 20$ ;THERE AREN'T ANY, SO JUST LEAVE$u CLR (R1) ;REINITIALIZE THE QUEUEv MOV R1,2(R1) ;.../w 10$: MOV #IE.FHE&377,R0 ;FATAL H00tx``†`t`TADATADATADATADATADATAARDWARE ERRORIx CLR R1 ;NO BYTE COUNT 3y PUSH <(R3)> ;SAVE LINK TO NEXT IOP IN THE QUEUESz CALL ENDCM1 ;GO FINISH IT /{ POP ;GET LINK TO NEXT IOP IN THE QUEUEA| BNE 10$ ;GO DO THE NEXT ONE5 } 20$: RETURN ~ ¤ .PAGE ;**-3750¥ .SBTTL GCSSIO - INITIATE A GET COMMAND STATUS¦ ;+;§ ;**-GCSSIO-INITIATE A GET COMMAND STATUS COMMAND (OP.GCS)B¨ ;$ © ; INPUTS:'ª ;, « ; R2 ADDRESS OF QST ¬ ; R3 ADDRESS OF CST ­ ; R4 ADDRESS OF SCB ® ; R5 ADDRESS OF UCB¯ ;B ° ; OUTPUTS:± ; ² ;- ³ GCSSIO:K$´ TST C.OLHD(R3) ;I/O STILL THERE?%µ BNE 10$ ;IF NE, YES, CHECK ON IT 1¶ BIC #C1.GCS,(R3) ;FORGET ABOUT ISSUING OP.GCST*· JMP CLACMD ;GO TRY TO START SOMETHING¸ ; 9¹ ; ISSUE 'GET COMMAND STATUS' COMMAND FOR OLDEST COMMANDº ;» ¼ 10$:0½ BIS #C1.TMO,(R3) ;WE'RE NOW IN TIMEOUT STATE.¾ BIC #C1.GCS,(R3) ;SHOW THAT WE DID THE GCS.¿ MOV #GCSFUN,R0 ;GET THE GCS FUNCTION TABLE1À MOVB FO.SZ(R0),R0 ;GET THE SIZE OF THE PACKETD"Á CALLV PORT,PKTAC ;GET A PACKET< MOV C.OLHD(R3),R0 ;GET THE ADDRESS OF THE OLDEST COMMAND-à MOV #OP.GCS,P.OPCD(R1) ;SET UP GCS OP CODE1=Ä MOVB I.PRM+11(R0),P.OTRF(R1) ;OUTSTANDING REFERENCE NUMBERR>Å BIC #^C<17>,P.OTRF(R1) ;CLEAR OUT ALL BUT THE SEQUENCE BITS=Æ MOV R0,P.OTRF+2(R1) ;IOP ADDRESS IS THE SECOND CRF NUMBER;=Ç MOV R0,P.CRF(R1) ;USE THE IOP FOR BOTH OF THE CRF NUMBERSDÈ MOV R0,P.CRF+2(R1) ;... 1É MOV I.UCB(R0),R5 ;GET THE CORRECT UCB ADDRESS 5Ê MOVB U.UNIT(R5),P.UNIT(R1) ;SET UP THE UNIT NUMBER +Ë CLRB P.UNIT+1(R1) ;UNIT IS ALWAYS <=255E'Ì CALLV PORT,PORSEN ;SEND THE COMMANDP/Í JMP CLACMD ;GO TRY TO START OTHER COMMANDSRÎ Ï .PAGE@Ï .SBTTL GUSSIO - START AND PROCESS AN OP.GUS REQUEST ;JJM304.Ï .SBTTL CMDGUS - GET UNIT STATUS ;JJM304Ñ ;+ ;**-1 2Ò ;**-GUSSIO - START AND PROCESS AN OP.GUS REQUESTÓ ; JÔ ; THIS ROUTINE ISSUES GUS COMMANDS. THE GUSSIO ENTRY POINT WILL ISSUE A%Õ ; FOR ANY UNIT THAT HAS UU.GUS SET.MÖ ;. × ; INPUTS:IØ ; "Ù ; ASSUMES ONE SCB PER CONTROLLERÚ ; R2=ADDRESS OF QSTWÛ ; R4=ADDRESS OF SCBRÜ ; R5=ADDRESS OF UCBMÝ ; Þ ; OUTPUTS:ß ; IF C1.GUS IS CLEARED THENDà ; á ; R2=ADDRESS OF QSTUâ ; R3=ADDRESS OF CSTSã ; R4=ADDRESS OF SCBJä ; R5=ADDRESS OF UCB-å ;Uæ ;**-CMDGUS - GET UNIT STATUSç ; è ; ROUTINE DESCRIPTIONAé ;DOê ; CONTROL IS PASSED TO THIS POINT WHEN A GET UNIT STATUS COMMAND IS ISSUED BYI*ë ; THE USER, SUCH AS IN AN IO.STC COMMANDì ; í ; INPUTS:Tî ; &ï ; R0=ADDRESS OF FUNCTION TABLE ENTRYð ; R2=ADDRESS OF QST ñ ; R3=ADDRESS OF IOP ò ; R4=ADDRESS OF SCB ó ; R5=ADDRESS OF UCBô ; õ ; OUTPUTS:ö ;.÷ ; R2-R5 ARE PRESERVED ø ; ù ;- ú .ENABL LSB û ü CMDGUS: *ý PUSH <#CLACMD> ;RETURN TO CLASS COMMANDþ BR 30$ ;GO TO COMMON CODEG ÿ GUSSIO:T ; # ; LOOK FOR UNITS NEEDING OP.GUS'S  ;T" PUSH <#SCUCB> ;START A UCB SCAN! 10$: CALL @(SP)+ ;GO GET A UCBI BCC 20$ ;WE GOT ONEN JMP 190$ ;NONE LEFT, EXITN5 20$: BIT #UU.GUS,U.UTIL(R5) ;IS AN OP.GUS REQUIRED? $ BEQ 10$ ;IF EQ, NO, TRY NEXT ONE- BIC #UU.GUS,U.UTIL(R5) ;LEAVE UU.GUS STATEO9 BIS #UU.SER,U.UTIL(R5) ;MAKE SURE WE'RE IN SERIAL MODE CALL PIOPAL ;GO GET A PIOP5 PUSH <#200$> ;RETURN TO ISSUING MORE GUS COMMANDS: 30$: MOV #GUSFUN,R0 ;R0 POINTS TO TABLE ENTRY FOR OP.GUS& CALL CMDCOM ;SET UP COMMAND PACKET3 CALL CMDSEN ;SEND THE COMMAND TO THE CONTROLLER   ;I+ ; PROCESS END PACKET FOR OP.GUS - INPUTS:E ;, ; R1=ADDRESS OF END PKTU ; R3=ADDRESS OF IOP  ; R2=ADDRESS OF QST  ; R4=ADDRESS OF SCBE ; R5=ADDRESS OF UCB( ;L   .IF DF D$$DSK ;S% ; SAVE INFORMATION IN UCB EXTENSIONL ;. PUSH ;SAVE END PACKET, QST, IOP>$ MOV #,R0 ;SET NUMBER OF BYTES TO MOVE ;**-3.% MOV R1,R2 ;COPY MSCP PACKET POINTER TO R22& ADD #P.MLUN,R2 ;UPDATE OFFSET INTO MSCP PACKET4& MOV @KISR6,R1 ;GET PACKET'S BASE ADDRESS ;GM112+( SUB #20000,R2 ;BIAS IT PROPERLY ;**-110) MOV U.UC200t€`’_b“_c”_d–_k›’X(R5),R3 ;GET DESTINATION APR6 BIAS6* MOV #X.MLUN+140000,R4 ;GET DESTINATION DISPLACEMENT)* CALL @BLXIO ;MOVE THE DATA ;GM1126* MOV U.SCB(R5),R4 ;RESTORE THE SCB ADDRESS ;PKW109* ;PKW109 A* .IF DF D$$DSK&DU$CHK ;IF QUEUE OPTOMIZATION SUPPORTED ;PKW109E* ;PKW109M7* MOV 4(SP),R2 ;RETRIEVE MSCP PACKET POINTER ;PKW109N<* MOVB P.TRCK(R2),U.PRM(R5) ;SET UP SECTORS/TRACK ;PKW1091* MOVB P.GRP(R2),R0 ;GET TRACKS/GROUP ;PKW109A:* MUL P.CYL(R2),R0 ;MULTIPLY BY GROUPS/CYLINDER ;PKW1099* MOVB R1,U.PRM+1(R5) ;SET UP TRACKS/CYLINDER ;PKW109P-* MOV R1,R0 ;SET UP FOR MULTIPLY ;PKW109M8* MUL P.TRCK(R2),R0 ;COMPUTE SECTORS/CYLINDER ;PKW1092* MOV U.CW3(R5),R3 ;SET UP MAX LBN ... ;PKW109&* MOVB U.CW2(R5),R2 ;... ;PKW1090* DIV R1,R2 ;COMPUTE CYLINDERS/UNIT ;PKW1097* MOV R2,U.PRM+2(R5) ;SET UP CYLINDERS/UNIT ;PKW109R* ;PKW109A%* .ENDC ;D$$DSK&DU$CHK ;PKW109TG ; ;**-280PH ; THE NEXT SECTION OF CODE SETS MULTI-UNIT CODES FOR THE UNIT. IF THE MULTI-RI ; UNIT CODE OF THIS UNIT MATCHES THAT OF ANY OTHER UNITS ON THE CONTROLLER, UU.SPJ ; IS SET IN THE UCB OF THE FIXED DISK. THIS INDICATES THAT I/O CAN BE STALLEDNK ; TO THIS UNIT. FOR M-PLUS, US.MUN IS SET IN THE UCB OF THE REMOVABLE DISK.PL ; THIS TELLS DISMOUNT TO ISSUE WARNING MESSAGES ABOUT MULTI-UNIT SPIN DOWN AND?M ; TO PREVENT NON-PRIVILEGED USERS FROM SPINNING DOWN THE DISKHN ; 0Q MOV 4(SP),R1 ;GET THE END PACKET BACK ;**-2(R MOV P.UNFL(R1),R0 ;GET THE UNIT FLAGS-S MOV P.MLUN(R1),R2 ;AND THE MULTI-UNIT CODET(T BEQ 90$ ;IF NO CODE, UNIT IS OFFLINEU MOV R5,R3 ;SAVE THE UCB +V PUSH #SCUCB ;GET THE UCB SEARCH ADDRESSA!W 50$: CALL @(SP)+ ;GO GET A UCBNX BCS 90$ ;ALL DONE "Y CMP R5,R3 ;IS IT THE SAME UCB? Z BEQ 50$ ;YES, GO GET ANOTHER1Z PUSH <@KISR6> ;SAVE THE PORT MAPPING ;GM112D:Z MOV U.UC2X(R5),@KISR6 ;MAP THE SECOND EXTENSION ;GM1123a MOV 140000+X.UNFL,R1 ;GET THE UNIT FLAGS ;**-6K0b MOV 140000+X.MLUN,R4 ;AND THE MULTI-UNIT CODE*b POP <@KISR6> ;REMAP THE PORT ;GM1129m CMP R2,R4 ;ARE THE MULTI-UNIT CODES THE SAME? ;**-103n BNE 50$ ;NO, GO TRY ANOTHER -o BIT #UF.RMV,R0 ;IS THE ORIGINAL REMOVABLE?+p BNE 60$ ;IF NE YESCq BIS #UU.SIO,U.UTIL(R3) ;SET BIT TO INDICATE DEVICE CAN STALL I/OSAq BICB #US.MUN,U.ST2(R3) ;DON'T HAVE DMO ISSUE MESSAGES ;PKW109D#s BR 70$ ;BRANCH AROUND ;**-1EEs 60$: BISB #US.MUN,U.ST2(R3) ;INDICATE DEVICE IS MULTI-UNIT ;PKW109*6u 70$: BIT #UF.RMV,R1 ;IS THE OTHER REMOVABLE? ;**-1v BNE 80$ ;IF NE YESCw BIS #UU.SIO,U.UTIL(R5) ;SET BIT TO INDICATE DEVICE CAN STALL I/O Aw BICB #US.MUN,U.ST2(R5) ;DON'T HAVE DMO ISSUE MESSAGES ;PKW109H$y BR 50$ ;FINISH THE SCAN ;**-1Ey 80$: BISB #US.MUN,U.ST2(R5) ;INDICATE DEVICE IS MULTI-UNIT ;PKW109L${ BR 50$ ;FINISH THE SCAN ;**-1@{ 90$: POP ;RESTORE IOP, QST, AND END PACKET ;PKW110{ ;PKW110 &{ .IFF ;D$$DSK - IF TAPE ;PKW110{ ;PKW110 9{ MOV P.MEDI(R1),U.MEDI(R5) ;SAVE THE MEDIA ID ;PKW110E:{ MOV P.MEDI+2(R1),U.MEDI+2(R5) ;IT'S TWO WORDS ;PKW110{ ;PKW110 ,{ .IFTF ;D$$DSK - BOTH DRIVERS ;PKW110{ ;PKW110W{ ; ;PKW110I{ ; NOW WE CHECK OUT THE STATUS CODE AND TAKE APPROPRIATE ACTION ;PKW110T{ ; ;PKW110E{ CALL ENDERR ;TRANSLATE THE MSCP END CODE INTO AN RSX CODE ;PKW110S3{ PUSH #0 ;PUT A FLAG WORD ON THE STACK ;PKW110.C{ MOV P.STS(R1),-(SP) ;PUT THE STATUS IN A TEMPORARY CELL ;PKW110D6{ BIC #^C,(SP) ;GET THE MAJOR CODE ;PKW1107{ CMP #ST.AVL,(SP)+ ;WAS IT UNIT AVAILABLE? ;PKW110 0{ BNE 140$ ;NO, LEAVE THE ERROR CODE ;PKW110{ ; ;PKW110A{ ; SPECIAL PROCESSING IF THE STATUS WAS UNIT-AVAILABLE ;PKW110O{ ; ;PKW110={ MOV #IS.SUC,R0 ;RETURN SUCCESS AS THE STATUS CODE ;PKW110SL{ BIT #UU.ATN,U.UTIL(R5) ;WAS THIS A GUS FROM AN ATTENTION MESSAGE? ;PKW110,{ BEQ 170$ ;NOPE, JUST CONTINUE ;PKW110{ ;PKW110 ({ .IFF ;D$$DSK - TAPE ONLY ;PK00tˆ``†`t`TADATADATADATADATADATAW110{ ;PKW110J={ BIT #UU.BLK,U.UTIL(R5) ;SHOULD WE DO THE ONLINE? ;PKW110?,{ BEQ 170$ ;NOPE, JUST CONTINUE ;PKW110{ ;PKW110 ,{ .IFTF ;D$$DSK - BOTH DRIVERS ;PKW110{ ;PKW110I;{ INC (SP) ;MARK THE FLAG WORD AS NEEDING AN ONL ;PKW110T%{ BR 170$ ;GO FINISH UP ;PKW110S{ ;PKW110I*{ .IFT ;D$$DSK - DISK DRIVER ;PKW110{ ;PKW11018{ 140$: TST P.STS(R1) ;WAS THE STATUS SUCCESS? ;PKW110'{ BNE 170$ ;NO, FINISH UP ;PKW1100{ ; ;PKW110G{ ; SPECIAL PROCESSING IF THE STATUS WAS SUCCESS - UNIT ONLINE ;PKW1101S{ ; IF THIS IS THE GUS AFTER AN ONL, THEN REQUEST RCT AND RESTART STALL I/O ;PKW110D{ ; ;PKW110<{ BIT #UU.SER,U.UTIL(R5) ;WERE WE IN SERIAL MODE? ;PKW1104{ BEQ 170$ ;NO, MUST HAVE BEEN AN IO.STC ;PKW1103¤ PUSH ;R1 IS A PARAMETER FOR RQRCT ;**-40R.¥ CLR R1 ;R1=0 TELLS RCT WE ARE INITIALIZING ¦ CALL RQRCTW§ POP ;RESTORE R1© ;**-1 ª ; SEE IF INIT WAS STALLING I/O« B« BIT #UU.IOS,U.UTIL(R5) ;IS I/O STALLED TO THIS DEVICE? ;PKW110&® BEQ 170$ ;NOPE, CONTINUE ;**-2:± BIC #UU.IOS,U.UTIL(R5) ;CLEAR THE STALL I/O BIT ;**-25± BISB #US.VV,U.STS(R5) ;SET VOLUME VALID ;PKW109WG± PUSH ;SAVE STUFF THAT $DVMSG IS GOING TO WRECK ;PKW110S6´ MOV #T.NIOR,R0 ;SET THE I/O RESUMED MESSAGE ;**-2'´ CALL @DVMSG ;GO PRINT IT ;GM112 .´ POP ;GET 'EM BACK ;PKW110¹ ; ;**-4@º ; IF SPECIAL ONLINE PUT STATUS CODE IN $SCERR AND CLEAR UU.SPC» ;(I» 170$: BIC #UU.ATN!UU.SER,U.UTIL(R5) ;EXIT SERIAL AND ATN STATE ;PKW110 -» BIT #UU.SPC,U.UTIL(R5) ;$SCOFL? ;PKW110S!½ BEQ 180$ ;IF EQ, NO ;**-1V6½ MOVB R0,@SCERR ;SET UP ERROR CODE FOR EXEC ;GM1128¿ BIC #UU.SPC,U.UTIL(R5) ;NOLONGER SPECIAL CASE ;**-1-¿ 180$: PUSH <#0> ;NO BYTE COUNT ;PKW110EÆ ;**-6DÇ .IFF ;IF TAPEÇ 140$: ;PKW110GÇ 170$: BIC #UU.ATN!UU.SER,U.UTIL(R5) ;CLEAR ATN AND SER FLAGS ;JJM350N8ç BIC #M.DEFM,U.CW2(R5) ;CLEAR DEFAULT FLAGS ;**-316ë BITB #EF.EOT,P.FLGS(R1) ;EOT ENCOUNTERED ? ;**-3ì BEQ 60$ ;NO0í BISB #M.EOT,U.CW2(R5) ;YES, ENCOUNTERED EOTî 60$:5ï BIT #UF.WPH,P.UNFL(R1) ;HARDWARE WRITE-PROTECTED ?Dð BEQ 70$ ;NO8ñ BIS #M.HWL,U.CW2(R5) ;YES, HARDWARE WRITE-PROTECTEDò 70$:%ó BIT #TF.PE,P.FORM(R1) ;1600 BPI ?ô BEQ 80$ ;NO(õ BIS #M.1600,U.CW2(R5) ;YES, 1600 BPI1õ BR 90$ ;DO NOT CHECK MORE DENSITIES ;JJM350N÷ 80$: ;**-1N%ø BIT #TF.GCR,P.FORM(R1) ;6250 BPI ?Uù BEQ 90$ ;NO(ú BIS #M.6250,U.CW2(R5) ;YES, 6250 BPI%ú 90$: ;REFERENCE LABEL ;JJM350S2 CMP #ST.OFL,R0 ;UNIT OFFLINE ? ;**-6 BNE 110$ ;NO(, BIS #M.SER,U.CW2(R5) ;YES, SELECT ERROR110$: " PUSH ;SET IOSB+2 VALUE CMP I.FCN(R3),#IO.STC  BEQ 120$P CMP I.FCN(R3),#IO.SMO  BEQ 120$  2  MOV U.CW2(R5),(SP) ;VALUE TO BE USED FOR IOSB+2 120$: ;PKW110 .ENDC ;D$$DSK ;**-2 : CALL ENDCMO ;GO FINISH UP, AND COME BACK HERE ;PKW1100 TST (SP)+ ;SHOULD WE DO AN ONLINE? ;PKW110* BEQ 220$ ;NOPE, JUST RETURN ;PKW1105 JMP ONLSIO ;GO ISSUE THE ONLINE COMMAND ;PKW1101 ;PKW110#7; NO UNIT'S REQUIRE OP.GUS'S - LEAVE THE C1.GUS STATER190$:O1 MOV (R2),R3 ;/*Q.CST*/ ;R3 IS THE CST ADDRESS' BIC #C1.GUS,(R3) ;LEAVE C1.GUS STATE7 JMP CLACMD ;GOTO CLACMD TO LOOK FOR SOMETHING TO DO2; 6; GO BACK TO TOP OF LOOP FOR PROCESSING MORE PACKETS200$:G+ CALLV PORT,PKTCH1 ;DO WE HAVE RESOURCES?T' ; ONLY NEED ONE CREDIT SINCE THIS1 ; IS AN IMMEDIATE CMDR  BCS 210$ ;NO RESOURCES, QUIT% JMP 10$ ;WE'RE OK, GO TRY ANOTHER'210$: ADD #10,SP ;FLUSH THE UCB SCANR%220$: RETURN ;GO HOME ;PKW1106! .DSABL LSB ;DISABLE LOCAL SYMBOL DEFINITION ;**-1" .PAGE," .SBTTL LERR - LOG AN ERROR ;JJM3045" .SBTTL CERR - LOG A CONTROLLER ERROR ;JJM304 % .IF DF E$$LOG ;**-2R&;+/'; **- CERR - CONTROLLER ER00t�`’_b“_c”_d–_k›’ROR LOGGING ROUTINEK(;;L); THE CONTROLLER ERROR LOGGING ROUTINE WILL CAUSE THE CREATION OF AN ERRORL*; LOG PACKET, COPY THE VALUES OF THE TWO I/O PAGE REGISTERS INTO THE ERRORL+; LOG PACKET AND REQUEST THE ERROR LOGGING SUB-SYSTEM TO CAPTURE THE DATA.,; -; INPUTS:3.; R0 = ERROR CODE (IE.FHE FOR CONTROLLER FAILURE)/; R3 = CST ADDRESS0; R4 = SCB ADDRESS1; R5 = UCB ADDRESS2; 3; OUTPUTS:4; B5; THE ERROR (OR TIME OUT) ON THE SPECIFIED CONTROLLER IS LOGGED.6;C7;-9 .ENABL LSB ;**-1:CERR: 5; PUSH ;SAVE REGISTERS (WE NEED R0)A-? MOV S.KRB(R4),R2 ;GET KRB ADDRESS ;**-3E%@ MOV K.CSR(R2),R2 ;GET CSR ADDRESSEH; ;**-7&I; SET UP CONTROLLER ERROR LOG PACKETJ;OK'L MOV #4,C.MLNG(R3) ;SET PACKET LENGTH0.M MOVB #-2,C.VCIX(R3) ;SET VIRTUAL CIRCUIT ID(N MOVB #20,C.CRED(R3) ;SET CREDIT FIELD&O MOV (R2),C.IP(R3) ;SAVE IP REGISTER'P MOV 2(R2),C.SA(R3) ;SAVE SA REGISTERT"Q MOV #C.IP,R1 ;ADJUST R1 TO ...7R ADD R3,R1 ;... POINT TO CONTROLLER ERROR LOG PACKET .S ;THIS IS ADJUSTED LATER TO POINT TO MLNG T BR 10$ ;AND LOG ERROR PACKETV;+ ;**-1K)W; **- LERR - UNIT ERROR LOGGING ROUTINE X;7JY; THE UNIT ERROR LOGGING ROUTINE WILL CAUSE THE CREATION OF AN ERROR LOGIZ; PACKET, COPY THE CONTENTS OF THE MSCP ERROR LOG PACKET INTO THE ERROR2L[; LOG PACKET AND REQUEST THE ERROR LOGGING SUB-SYSTEM TO CAPTURE THE DATA.\;) ]; INPUTS:V^;R-_; R0 = COMPLETION STATUS (IS.SUC OR IE.XXX)0`; R1 = ADDRESS OF CURRENT RESPONSE RING PACKETa; R4 = SCB ADDRESSb; R5 = UCB ADDRESSc;L d; OUTPUTS:e; .f; THE ERROR ON THE SPECIFIED UNIT IS LOGGED.h;- ;**-1GijLERR:(k PUSH ;SAVE REGISTERSBl10$: CLRB S.ROFF(R4) ;ZERO OFFSET TO FIRST REGISTER OF ERROR ...m ;... LOG PACKET 6n MOV #MSGLNG,R2 ;GET OFFSET TO BEGINNING OF ENVELOPE2o ADD R1,R2 ;ADD BASE ADDRESS OF RESPONSE PACKET!p PUSH (R2) ;GET MESSAGE LENGTHT2q ADD #-,(SP) ;ADD EXTRA FOR THE ENVELOPE7r CMP #RSPLNG,(SP) ;DID WE EXCEED MAXIMUM PACKET SIZE?5s BHIS 30$ ;IF HIS NO B{20$: TST (SP)+ ;PACKET PLUS ENVELOPE EXCEEDS MAXIMUM SIZE ;**-7$| BR 80$ ;EXIT, CAN'T ERROR LOG IT/}30$: MOV (SP),R2 ;COPY NUMBER OF BYTES TO R2.H MOVB (SP)+,S.RCNT(R4) ;SET NUMBER OF REGISTERS TO COPY FOR ... ;**-1€ ;... ERROR LOG-� CLR S.PKT(R4) ;ASSUME NO I/O PACKET ACTIVE,2‚ MOV CREDIT(R1),R0 ;OBTAIN MESSAGE/CREDIT FIELDS5ƒ BIC #^C,R0 ;CLR ALL BUT MESSAGE TYPE FIELDXA„ CMPB #,R0 ;IS THIS RESPONSE A DATAGRAM PACKET?C… BEQ 40$ ;IF EQ Y*† MOV P.CRF+2(R1),R3 ;GET THE IOP ADDRESS*‡ BEQ 40$ ;NO PACKET...... NOT POSSIBLE?Gˆ BITB #IP.FAK,I.PRM+11(R3);NO, ARE WE DOING AN INTERNAL I/O FUNCTION?E‰ BNE 40$ ;IF EQ YESBŠ MOV P.CRF+2(R1),S.PKT(R4) ;NO, COPY I/O PACKET ADDRESS FOR ...‹ ;... ERROR LOGGERTŒ ;IS I/O ACTIVE?K�Ž BR 50$ ;NO, GO ON TO LOG ITA�40$: CLR R4 ;NO, CLR R4�50$: PUSH R1 ;SAVE R1 AGAIN+‘ MOV R2,R1 ;COPY NUMBER OF BYTES INTO R1>’“;T”; INTERFACE TO $LOGER:•;C –; INPUTS: —;Q.˜; R1 = LENGTH OF DATA TO BE LOGGED, IN BYTES,™; R4 = SCB ADDRESS (ZERO IF NO I/O PACKET)š; R5 = UCB ADDRESS›;N œ; OUTPUTS:�;Iž; C = 1 UNABLE TO LOG ERROR4Ÿ;I ; C = 0 ABLE TO LOG ERRORS¡;R2¢; R1 = ADDRESS OF DATA AREA IN ERROR LOG PACKET%£; R3 = ADDRESS OF ERROR LOG PACKET¤; ¥; NOTE:O¦;O§; R4 AND R5 ARE PRESERVED;#¨; R0, R2, AND R3 MAY BE DESTROYEDA-©; KISAR6 IS DESTROYED BY $LOGER ON 11M PLUSRª;«5« CALL @LOGER ;ATTEMPT TO LOG ERROR PACKET ;GM112=­ BCS 20$ ;EXIT IF WE CAN'T LOG THE ERROR (POP STACK) ;**-1D5¯ MOV R1,R4 ;COPY R1 INTO R0 FOR DESTINATION ;**-1N5° POP R2 ;RESTORE POINTER TO MSCP PACKET FOR SOURCE.± BCS 80$ ;IF CS, UNABLE TO LOG ERROR PACKET$² PUSH R2 ;SAVE DESTROYED REGISTER2³ ADD #MSGLNG,R2 ;OFFSET TO BEGINNING OF ENVELOPE/´ BIC #160000,R2 ;R2 IS ADDRESS IN APR 5 RANGEµ BIS #120000,R2 ;B(¶ MOV U.SCB(R5),R3 ;RESTORE SCB ADDRESS(·00t˜``†`t`TADATADATADATADATADATA MOV S.PBIA(R3),R1 ;MAP TO PORT DRIVER¸ CLR R0 ;SETUP FOR "BISB">¹ BISB S.RCNT(R3),R0 ;SET NUMBER OF REGISTERS (WORDS) TO COPY1¹ MOV @KISR6,R3 ;GET DESTINATION BIAS ;GM112S-» PUSH R3 ;MAY BE NEEDED FOR $FNERL ;**-1O*» CALL @BLXIO ;MOVE THE DATA ;GM112½ ;**-1O"¾ MOV U.SCB(R5),R4 ;R4 IS THE SCB>¾ MOV S.PBIA(R4),@KISR6 ;MAP APR 6 TO PORT DRIVER ;GM112=À .IIF DF,K$$DAS MOV S.PBIA(R4),@#KINAR6 ; KERNAL DATA ;**-104Á POP R3 ;RECOVER MAPPING BIAS FOR ERRORLOG PACKET&Ð POP R1 ;RESTORE REGISTER ;**-14,Ñ MOV (SP),R0 ;GET STATUS WHICH CAME IN R0 Ò TST S.PKT(R4) ;IS I/O ACITVE?Ó BNE 70$ ;IF NE YESÔ CLR R4 ;NO, CLR R4Õ CLR R2 ;DON'T FORGET R2MÖ; ×;DØ; INTERFACE TO $FNERL:Ù;B Ú; INPUTS:TÛ;TÜ; R0 = FIRST I/O STATUS WORD.Ý; R2 = STARTING AND FINAL ERROR RETRY COUNTS4Þ; R3 = ADDRESS OF ERROR LOG PACKET (BIAS IF MPLUS),ß; R4 = SCB ADDRESS (ZERO IF NO I/O PACKET)à; R5 = UCB ADDRESSá; â; OUTPUTS:ã;I,ä; THE SPECIFIED ERROR LOG PACKET IS LOGGEDå;R æ; NOTE:ç;Vè; R4 AND R5 ARE PRESERVEDA#é; R1, R2, AND R3 MAY BE DESTROYEDIê;Bê70$: CALL @FNERL ;FINISH LOGGING THIS ERROR LOG PACKET ;GM112ì ;**-1D.í80$: POP ;RESTORE REGISTERS;í MOV S.PBIA(R4),@KISR6 ;MAP APR 6 TO PORT DRIVER ;GM112I=ð .IIF DF,K$$DAS MOV S.PBIA(R4),@#KINAR6 ; KERNAL DATA ;**-2Iò RETURN ;EXIT ;**-1ó ô .DSABL LSBOõ .ENDCö .PAGE7ö .SBTTL MAPD - COROUTINE TO MAP THE PORT ;JJM304R5ö .SBTTL SAVREG - COROUTINE TO SAVE R0-R3 ;JJM3044ø;+ ;**-1A(ù; **-MAPD-SAVE AND LATER RESTORE APR 6ú; R0 IS DESTROYEDû;-üýMAPD:I$þ POP R0 ;REMEMBER WHERE TO RETURN&þ PUSH @KISR6 ;SAVE APR 6 ;GM112=þ MOV S.PBIA(R4),@KISR6 ;MAP APR 6 TO PORT DRIVER ;GM112R ;**-2. ;**-1.8 PUSH @#KINAR6 ;SAVE INSTRUCTION SPACE APR 6 ;PKW109C MOV S.PBIA(R4),@#KINAR6 ;FOR I/D SYSTEMS MAP BOTH I AND D ;**-1- ;**-1O/  CALL (R0) ;CALL CALLER BACK AS A CO-ROUTINEA ;- ; COROUTINE RETURN POINT ;- 9  POP @#KINAR6 ;RESTORE INSTRUCTION SPACE APR 6 ;PKW109R  ;PKW109D6  POP @KISR6 ;RESTORE PREVIOUS APR6 MAPPING ;GM112 ;**-2G RETURN ;RETURN4;+*; **-SAVREG-SAVE AND LATER RESTORE R0-R3;- SAVREG: 0 PUSH ;STORE R0 TEMPORARILY ON THE STACK- MOV 2(SP),R0 ;GET THE RETURN ADDRESS IN R0 < POP <(SP)> ;MOVE THE ORIGINAL R0 OVER THE RETURN ADDRESS8 PUSH ;SAVE R1-R3 AND THE RETURN ADDRESS MOV 10(SP),R0 ;RESTORE R04 CALL @(SP)+ ;CALL BACK THE CALLER AS A COROUTINE;W ; COROUTINE RETURN POINT!;P+" POP ;RESTORE THE REGISTERS1 # RETURN $% .PAGE4% .SBTTL CMDONL - ISSUE ONLINE COMMANDS ;PKW110%;+ ;PKW110)4; **-CMDONL- DEVICE ONLINE ;**-14R5;PQ6; CONTROL IS PASSED TO THIS POINT WHEN AN ONLINE REQUEST IS ISSUED BY THE USER, 7; AS IN AN IO.STC COMMANDH8;U 9; INPUTS::; &;; R0=ADDRESS OF FUNCTION TABLE ENTRY<; R1==; R2=ADDRESS OF QSTR>; R3=ADDRESS OF IOPC?; R4=ADDRESS OF SCBA@; R5=ADDRESS OF UCBOA;N B; OUTPUTS:C; IF C1.ONL IS CLEARED THENED; E; R2=ADDRESS OF QSTRF; R3=ADDRESS OF IOPBG; R4=ADDRESS OF SCBNH; R5=ADDRESS OF UCBI; J;-;JONLSIO: MOV (R2),R3 ;MAKE SURE WE HAVE THE CST ;PKW1105J CALL PIOPAL ;GO GET A PSEUDO I/O PACKET ;PKW110EMCMDONL: ;**-27M MOV #ONLFUN,R0 ;GET TABLE ENTRY FOR OP.ONL ;PKW110<] BIS #UU.SER,U.UTIL(R5) ;SERIAL MODE FOR THIS ONE ;**-15&^ CALL CMDCOM ;SET UP COMMAND PACKET_#` .IF DF T$$APE ;TAPE CONDITIONALOa;N1b; TAPE SET UP DENSITY AND (USER SETTABLE BITS?) c; 5d BIT #UU.BLK,U.UTIL(R5) ;ONLY 1 DENSITY SUPPORTED?E6e BNE 40$ ;YES. USE 0 (CONTROLLER PICKS DENSITY)f)g BIT #M.1600,I.PRM(R3) ;YES, 1600 BPIWh BEQ 30$ ;NO $i BIS #TF.PE,P.FORM(R1) ;1600 BPI)j BR 40$ ;IGNORE NEXT DENSITY CHECKRk30$:)l BIT #M.6250,I.PRM(R3) ;00t `’_b“_c”_d–_k›’YES, 6250 BPIUm BEQ 40$ ;NOA&n BIS #TF.GCR,P.FORM(R1) ;6250 BPI ?o40$:p .ENDC ;T$$APEq6q PUSH #CLACMD ;TRY TO ISSUE MORE COMMANDS ;PKW1103r CALL CMDSEN ;SEND THE COMMAND TO THE CONTROLLERBst;K+u; PROCESS END PACKET FOR OP.ONL - INPUTS:Bv;$w; R1=ADDRESS OF END PKTEx; R2=ADDRESS OF QSTy; R3=ADDRESS OF (P)IOPz; R4=ADDRESS OF SCB3{; R5=ADDRESS OF UCBF|;.7}; FOR DISK SAVE SOME INFORMATION IN THE UCB EXTENSION ~;R, BIC #UU.SER,U.UTIL(R5) ;LEAVE SERIAL MODE€� .IF DF D$$DSK‚6ƒ CMP #ST.ONL,P.STS(R1) ;WAS THE UNIT ALREADY ONLINE?)„ BEQ 70$ ;YES, SKIP ALL OF THIS STUFFI‰; ;**-4%Š; SAVE INFORMATION IN UCB EXTENSIONM‹;O;‹ PUSH ;SAVE END PACKET, QST, AND IOP ;PKW109 >� MOV #,R0 ;SET NUMBER OF BYTES TO MOVE ;**-1.Ž MOV R1,R2 ;COPY MSCP PACKET POINTER TO R22� ADD #P.UNSZ,R2 ;UPDATE OFFSET INTO MSCP PACKET4� MOV @KISR6,R1 ;GET PACKET'S BASE ADDRESS ;GM112+‘ SUB #20000,R2 ;BIAS IT PROPERLY ;**-10’ MOV U.UC2X(R5),R3 ;GET DESTINATION APR6 BIAS6“ MOV #X.UNSZ+140000,R4 ;GET DESTINATION DISPLACEMENT)“ CALL @BLXIO ;MOVE THE DATA ;GM112E5• MOV 4(SP),R2 ;RETRIEVE MSCP PACKET POINTER ;**-1>)– MOV U.SCB(R5),R4 ;RESTORE SCB ADDRESS3— MOV P.UNSZ(R2),U.CW3(R5) ;SET UP THE MAX LBN ...V8˜ MOVB P.UNSZ+2(R2),U.CW2(R5) ;... FOR PROPER OPERATION<˜ POP ;RESTORE IOP, QST, AND END PACKET ;PKW109© ;**-16ª .ENDC ;D$$DSK«¬ MOV P.STS(R1),R0B*­ BIC #^C,R0 ;ISOLATE MAJOR CODE*® BNE 70$ ;IF NOT SUCCESS, ST.SUC, SKIP¯°;,=±; UNIT IS NOW ON-LINE, FIND OUT ABOUT IT BY DOING AN OP.GUST²;;³*´ MOV (R2),R0 ;/*Q.CST*/ ;R0 IS THE CST)µ BIS #C1.GUS,(R0) ;ENTER C1.GUS STATER¶ ;STATE= SERIAL, GUS, RDY,'· BIS #UU.SER!UU.GUS!UU.RDY,U.UTIL(R5)V¸0¹ BICB #US.SPU,U.STS(R5) ;CLEAR SPINNING UP BITº» .IF DF T$$APE¼½;QA¾; IF TAPE AND IF (IO.STC!IO.SMO) THEN LEAVE THE POWERFAIL STATE¿;MÀ CMP I.FCN(R3),#IO.STC Á BEQ 60$ CMP I.FCN(R3),#IO.SMO à BNE 70$Ä60$: BICB #US.PWF,U.STS(R5)ÅÆ .ENDC ;T$$APEÇ70$:È PUSH ;SAVE R1*É MOV P.STS(R1),R1 ;R1 IS COMPLETION CODE&Ê CMP #ST.VOL,R1 ;IS IT A MEDIA ERRORË BNE 80$ ;NO. CONTINUET'Ì MOV #IE.DNR&377,R0 ;DEVICE NOT READYBÍ BR 110$ ;JOIN COMMON CODE(DÎ80$: CMP #ST.OFL,R1 ;IS IT MSCP OFFLINE, WHICH MEANS NO SUCH UNIT?Ï BNE 90$ ;NO. CONTINUEF-Ð MOV #IE.IDU&377,R0 ;ILLEGAL DEVICE OR UNITEÑ BR 100$ ;JOIN COMMON CODENÒ90$:%Ó MOV #IS.SUC&377,R0 ;ASSUME SUCCESSS3Ô BIC #^C,R1 ;ISOLATE MAJOR CODE IS ST.SUCÕ BEQ 110$ ;IF SUCCESS OKSÕ .IF DF D$$DSK ;PKW110)6Õ CMP #ST.MFE,R1 ;IS IT MEDIA FORMAT ERROR? ;PKW110%Õ BNE 95$ ;NO, CONTINUE ;PKW110>Õ MOV #IE.BCC&377,R0 ;SET UP FOR MEDIA FORMAT ERROR ;PKW110(Õ BR 110$ ;JOIN COMMON CODE ;PKW110Õ .ENDC ;D$$DSK ;PKW110I?Õ95$: MOV #IE.OFL&377,R0 ;ELSE SET TO DEVICE OFFLINE ;PKW110VU×100$: .IIF NDF R$$MPL&T$$APE BISB #US.OFL,U.ST2(R5) ;RSX-11M DISK DRIVER ONLY ;**-1CØ110$:BÙ POP ;RESTORE R12Ú PUSH <#0> ;ZERO BYTE COUNT FOR ONLINE COMMANDSÛ CALLR ENDCOMKÜ; é .PAGE ;**-12E/ê .SBTTL PIOPAL - ALLOCATE A PSEUDO I/O PACKET9ë;+5ì; **-PIOPAL-ROUTINE TO ALLOCATE A PSEUDO I/O PACKET í;EDî; THIS ROUTINE WILL ALLOCATE A PSEUDO I/O PACKET FROM PRIMARY POOLï;N ð; INPUTS: ñ;Pò; R2=ADDRESS OF QSTOó; R3=ADDRESS OF CSTDô; R4=ADDRESS OF SCBVõ; R5=ADDRESS OF UCBPö;A÷;S ø; OUTPUTS:ù; ú; R0-R1 ARE DESTROYED û; R2-R4-R5 ARE PRESERVED,ü; R3=PIOP ADDRESS IF SUCESSFULLY ALLOCATED%ý; C=0 PIOP IS SUCESSFULLY ALLOCATED þ; C=1 PIOP CANNOT BE ALLOCATEDÿ;- PIOPAL:A3 MOV #18.*2,R1 ;SIZE OF PIOP TO ALLOCATE IN BYTEST PUSH ;SAVE R21 CALL @ALOCB ;ALLOCATE PIOP FROM POOL ;GM112A" POP ;RESTORE R2 ;**-1+ BCS 30$ ;CANNOT ALLOCATE PIOP - GET OUT $ MOV R0,R3 ;PUT I/O PKT ADD IN R3 PUSH <#18.> ;PACKET LENGTH)20$: CLR (R0)+ ;CLEAR A WORD AT A00t¨``†`t`TADATADATADATADATADATA TIME $  DEC (SP) ;ONE LESS WORD TO CLEAR  BGT 20$ ;GO DO ENTIRE PACKET!  TST (SP)+ ;CLEAN UP THE STACKP7  MOVB #IP.FAK,I.PRM+11(R3) ;SET TO 1 TO INDICATE PIOPT'  MOV R5,I.UCB(R3) ;SET UP UCB ADDRESSI CLC ;CLEAR CARRYI BR 40$ ;AND EXIT730$: MOV #177773,R3 ;PUT A BAD ADDRESS IN R3 SINCE NOM ;POOL AVAILABLET SEC ;SET CARRYB 40$: RETURN  .PAGE1 .SBTTL PIOPDE - DEALLOCATE A PSEUDO I/O PACKET;+7; **-PIOPDE-ROUTINE TO DEALLOCATE A PSEUDO I/O PACKETT;M<; THIS ROUTINE WILL DEALLOCATE A PSEUDO I/O PACKET. IF THE;; PIOP IS FROM POOL, THEN DEALLOCATE IT FROM SYSTEM POOL,.=; ELSE IT IS FROM THE CST SO JUST MARK THE FIRST WORD AS -13 ; TO INDICATE THAT IT IS FREE.; ; INPUTS:  ;;!; R1=ADDRESS OF PIOP"; R3=ADDRESS OF CSTE#; R4=ADDRESS OF SCB $; R5=ADDRESS OF UCBS%;;&;A '; OUTPUTS:(; ); R0-R1 DESTROYEDB*; R2-R5 ARE PRESERVED +;O,;- -PIOPDE:+. PUSH ;SAVE R2,R3L1/ MOV R1,R0 ;ADD OF PIOP IN POOL TO DEALLOCATEW00 MOV #18.*2,R1 ;NUMBER OF BYTES TO DEALLOCATE*0 CALL @DEACB ;DEALLOCATE PIOP ;GM112(2 POP ;RESTORE R3,R2 ;**-13 RETURN ;4] .PAGE ;**-40C] .IF DF,D$$DSK ;JJM304N^ .SBTTL RECSIO - CONTINUE RECOVERY FROM A CONDITION THAT REQUIRED A RE-SYNCHa;+ ;**-2SHb;**-RECSIO-CONTINUE RECOVERY FROM A CONDITION THAT REQUIRED A RE-SYNCHc;REd; AFTER ALL UNITS ARE BROUGT BACK ON-LINE FROM THE TIME-OUT ROUTINEVEe; THEN ALL OUTSTANDING I/O IS RE-ISSUED AND C1.REC STATE IS CLEARED f;T g; INPUTS:Ah; i; R2 ADDRESS OF QST j; R3 ADDRESS OF CST k; R4 ADDRESS OF SCB"l; R5 ADDRESS OF A UCBm;D n; OUTPUTS:o;p; R2,R3,R4 PRESERVEDq; R5 IS A UCB ADDRESSIr;- sRECSIO:tFu; PROPER OPERATION OF THIS CODE DEPENDS ON THE FACT THAT THIS DRIVERDv; ALWAYS TRYS TO START MORE COMMANDS AFTER IT COMPLETES PROCESSINGw; ANY RECEIVED END PACKETS.Hx;LAy; RECOVERY INVOLVES THREE STAGES AND IS CONTROLLED BY THE STATE@z; BITS C1.R1, C1.R2 AND C1.REC. THE THREE BITS ARE RELATED TOA{; THREE PARTS OF RECOVERY; ISSUING ON-LINES, RE-TRYING ON-LINES (|; AND RE-ISSUING OUTSTANDING COMMANDS.};=~; C1.R1 IS SET TO INDICATE THAT IT IS TIME TO TRY AND BRING<; "SPINNING UP" UNITS (US.SPU SET) BACK ON-LINE. C1.R1 IS;€; CLEARED AFTER UNITS ARE MARKED AS NEEDING TO BE BROUGHTO>�; ON-LINE. IF, AFTER ALL ON-LINES COMPLETE, THERE ARE STILL6‚; UNITS THAT DIDN'T COME READY THE DRIVER WILL SET A<ƒ; TIME-OUT. WHEN THE TIME-OUT COMES DUE C1.R1 WILL BE SET>„; AND CONTROL WILL TRANSER HERE WHERE WE WILL TRY TO ON-LINE<…; THE UNITS AGAIN. THIS BEHAVIOR IS REPEATED UNTIL EITHER1†; ALL UNITS ARE READY OR RE-TRYS ARE EXHAUSTED. ‡; <ˆ; IF POSSIBLE IT WOULD BE BETTER TO HAVE LIMITLESS RE-TRYS9‰; FOR THE SYSTEM DISK. THIS IS NOT CURRENTLY THE CASE.AŠ;D?‹; C1.R2 REMAINS SET AS LONG AS THERE ARE STILL UNITS SPINNING,Œ; UP.E�;L?Ž; C1.REC REMAINS SET UNTIL ALL OUTSTANDING COMMANDS HAVE BEENE>�; RE-ISSUED AND COMPLETED. THE OLDEST COMMAND MUST COMPLETE@�; BEFORE SUBSEQUENT OUTSTANDING COMMANDS ARE RE-ISSUED AND ALLC‘; RE-ISSUED COMMANDS MUST COMPLETE BEFORE NEW I/O MAY BE STARTED.E’;R=“; IF C1.R1 IS SET THEN MARK UNITS THAT NEED TO COME ON-LINET)”; AND GOTO ONLSIO TO START THE COMMANDSY•;D– BIT #C1.R1,(R3)0— BEQ 40$ ;THIS SECTION DONE ONLY IF C1.R1 SET1˜ BIC #C1.R1,(R3) ;CLEAR C1.R1 SO THAT THIS WILL™ ;ONLY BE DONE ONCE.T;š MOV #SCUCB,-(SP) ;PUSH "SCAN UCB'S" ROUTINE ON THE STACK (›10$: CALL @(SP)+ ;CALL THE CO-ROUTINEœ BCS 30$ ;IF CS, ALL DONE3� BITB #US.SPU,U.STS(R5) ;IS THIS UNIT SPINNING UP ž BEQ 10$ ;IF NOT, GO AGAINEŸ BIT #UU.SER,U.UTIL(R5)R-  ;ON-LINE IN PROGRESS (FROM ATTEN. MSG)? ¡ BNE 10$ ;IF SO, GO AGAIN,¢ INC U.CNT(R5) ;COUNT THIS ON-LINE ATTEMPT.£ CMP U.CNT(R5),#120. ;RE-TRY COUNT EXCEEDED?!¤ BLE 20$ ;IF LE, NO, TRY AGAINL?¥ BICB #US.SPU,U.STS(R5) ;RE-TRYS EXHAUSTED, 00t°`’_b“_c”_d–_k›’CLEAR SPINNING UP#%¦ CLR U.CNT(R5) ; AND RE-TRY COUNT.OC§ BIS #UU.ABO,U.UTIL(R5); REMEMEBER TO ABORT ALL I/O FOR THIS UNITI-¨ ;OTHERWISE IF THE UNIT SUDDENLY BECOMESH5© ;ON-LINE SUBSEQUENT RE-ISSUED I/O WILL SUCCEED.ª BR 10$ ;TRY NEXT UNITRª20$: BIS #UU.SER!UU.GUS!UU.ATN,U.UTIL(R5) ;GET UNIT STATUS, AND THEN ONL ;PKW110$­ BR 10$ ;GO THROUGH LOOP ;**-2<­30$: BIS #C1.GUS,(R3) ;SET GET UNIT STATUS STATE ;PKW110­ JMP GUSSIO ;PKW110°; ;**-2B±; AT THIS POINT C1.R1 IS CLEAR BUT C1.R2 MAY BE SET. C1.R2 WILLE²; BE CLEARED WHEN ALL UNITS HAVE BECOME READY AND HAVE BEEN BROUGHTSE³; BACK ON-LINE OR WHEN RE-TRYS HAVE BEEN EXHAUSTED. THIS CONDITIONS/´; IS TRUE WHEN US.SPU IS CLEAR FOR ALL UNITS. µ; >¶; THIS SECTION OF CODE WILL SET A TIME-OUT IF ANY UNITS HAVE?·; FAILED TO SPIN UP. AT THE END OF THE TIME-OUT CONTROL WILL*@¸; TRANSFER TO RECSIO WITH C1.R1 SET SO THAT MORE ON-LINES WILL ¹; BE TRYED. º;;4»40$: BIT #C1.R2,(R3) ;IN SECOND STAGE OF RECOVERY?'¼ BEQ 90$ ;IF EQ, NO, TRY THIRD STAGE.½ BIC #C1.R2,(R3) ;ASSUME ALL UNITS ARE READY;¾ MOV #SCUCB,-(SP) ;PUSH "SCAN UCB'S" ROUTINE ON THE STACK (¿50$: CALL @(SP)+ ;CALL THE CO-ROUTINEÀ BCS 60$ ;IF CS, ALL DONE3Á BITB #US.SPU,U.STS(R5) ;IS THIS UNIT SPINNING UP  BEQ 50$ ;IF NOT, GO AGAIN +à BIS #C1.R2,(R3) ;SET C1.R2, NOT DONE YETTÄ BR 50$ ;TRY NEXT UNITRÅ60$: BIT #C1.R2,(R3) ;DONE?A&Æ BEQ 90$ ;IF EQ, YES, DO NEXT STAGE/Ç TST C.OLHD(R3) ;WAITING FOR I/O TO COMPLETE?CÈ BEQ 70$ ;IF YES, EXIT É ;LATER AFTER END PACKETS,Ê ;ARE COMPLETED WE WILL BE CALLED AGAIN*Ë ;AT WHICH TIME WE CAN SET A TIME-OUTÌ ;FOR ON-LINE RE-TRYS Í RETURN Î70$:*Ï TST S.BSYU(R4) ;IS A UNIT BUSY ALREADY?*Ð BNE 80$ ;IF NE, YES WE MUST BE WAITING(Ñ ;FOR A TIME-OUT SO DON'T RE-SET IT+Ò MOV R5,S.BSYU(R4) ;ELSE, SET A UNIT BUSY Ó BISB #US.BSY,U.STS(R5)T-Ô MOVB #2,S.CTM(R4) ;SET A 2 SECOND TIME-OUTDÕ80$: RETURN ;EXITOÖ×;WHØ; AT THIS POINT C1.R1 AND C1.R2 MUST BE CLEAR AND IT IS THEREFORE TIMEÙ; TO RE-ISSUE I/O.Ú;CÛÜ90$:,Ý BIC #C1.REC,(R3) ;ASSUME WE ARE FINISHED6Þ MOV C.REQU(R3),R1 ;R1 IS THE FIRST IOP FROM C.REQUß ;ANY I/O TO RESTART? +à BEQ 130$ ;NO, THEN SEE IF WE ARE DONE? )á BIS #C1.REC,(R3) ;WE ARE NOT DONE YETU:â CMP R1,C.REDO(R3) ;IS THIS THE OLDEST AT TIME OF FAIL?"ã BEQ 110$ ;IF YES, GO START IT6ä TST C.OLHD(R3) ;WE KNOW THE OLDEST HAS STARTED BUT#å ;ARE WE STILL WORKING ON IT? ,æ BEQ 100$ ;IF EQ, NO, SO GO CLEAR C.REDO9ç CMP C.OLHD(R3),C.REDO(R3) ;ARE WE STILL WORKING ON IT?B,è BEQ 150$ ;YES, SO WAIT FOR IT TO FINISH<é100$: CLR C.REDO(R3) ;OTHERWISE WE MUST HAVE FINISHED THE%ê ;OLDEST COMMAND SO ITS TIME TOTë ;FORGET IT.ì;&í; START PROCESS OF RE-ISSUING AN I/Oî; R1 IS THE I/O PACKETï; R3 IS THE CST ð; R4 IS THE SCBñ;1ò0ó110$: MOV I.UCB(R1),R5 ;R5 IS THE UCB ADDRESS ô MOV R3,R02õ ADD #C.REQU,R0 ;R0 IS THE POINTER TO THE QUEUE1õ CALL @QRMVA ;REMOVE THE FIRST ENTRY ;GM112CD÷ BIT #UU.ABO,U.UTIL(R5) ;DID THIS UNIT FAIL TO BECOME READY? ;**-1-ø BEQ 120$ ;IF EQ, NO, GO RE-ISSUE THE I/OE'ù ;OTHERWISE COMPLETE IT AS IE.DNRT$ú MOV R1,R3 ;R3 IS THE I/O PACKET7û MOV #IE.DNR&377,R0 ;R0 IS IE.DNR (DEVICE NOT READY)S$ü CLR R1 ;R1 IS A ZERO BYTE COUNT"ý CALL ENDCM1 ;COMPLETE THE I/O(þ BR 90$ ;GO TRY TO START ANOTHER I/Oÿ4ÿ120$: MOV S.QST(R4),R2 ;RESTORE THE QST ;PKW1061ÿ JMP CMDRED ;RESTART ENTRY IN CMDSIO ;PKW106E; ;**-1.; WE ARE NOT DONE UNTIL I/O'S HAVE COMPLETED;F130$:C- TST C.OLHD(R3) ;STILL WORKING ON COMMANDS?R BNE 150$ ;YES, JUST EXIT ;ELSE WE ARE DONEN* CLRB S.CTM(R4) ;STOP TIMER JUST IN CASE%  MOV S.BSYU(R4),R1 ;GET UCB ADDRESSI  BEQ 140$ ;IF NONE SKIP)  BICB #US.BSY,U.STS(R1) ;CLEAR BUSY BIT;)  CLR S.BSYU(R4) ;CLEAR BUSY UNIT IN SCBA 140$:R8 CLR C.REDO(R3) ;FORGET ABOUT OLDEST COMMAND IF IT WAS ;THE ONLY COMMANDS' CALLR CLACMD 00t¸``†`t`TADATADATADATADATADATA ;START ANY PENDING I/O +150$: BIS #C1.REC,(R3) ;STILL RECOVERINGE RETURN ;RETURN TO CALLERT .PAGE3 .SBTTL RQRCT - REQUEST REPLACEMENT CONTROL TASKJ;+8; **- RQRCT - REQUEST REPLACEMENT CONTROL TASK ROUTINE;T>; THE REQUEST THE REPLACEMENT CONTROL TASK ROUTINE IS CALLEDA; TO INITIALIZE THE SPECIFIED UNIT OR TO REPLACE A BAD BLOCK ONB; THE SPECIFIED UNIT.I;A ; INPUTS:;C?; R1 = ADDRESS OF CURRENT RESPONSE RING PACKET IF REPLACEMENT '; OR ELSE ZERO IF INITIALIZATIOND ; R2 = ADDRESS OF THE QST,!; R3 = ADDRESS OF THE IOPR"; R4 = ADDRESS OF THE SCB#; R5 = ADDRESS OF THE UCB.$;R %; OUTPUTS:&;T8'; THE REPLACEMENT CONTROL TASK IS REQUESTED TO REPLACE((; THE BAD BLOCK ON THE SPECIFIED UNIT.);N*;-+,-RQRCT: ;REF LABEL!. PUSH ;SAVE R0-R3 :. MOV U.UC2X(R5),@KISR6 ;MAP SECOND UCB EXTENSION ;GM11264 MOV X.UNFL+140000,R1 ;RETRIEVE UNIT FLAGS ;**-5+5 MOV X.RCTS+140000,R0 ;RETRIEVE RCT SIZEE75 MOV S.PBIA(R4),@KISR6 ;RESTORE PORT MAPPING ;GM112-8 TST R0 ;DOES IT EVEN HAVE AN RCT? ;**-2 9 BEQ 20$ ;NOPE, JUST EXIT>: BIT #UF.RPL,R1 ;CONTROLLER INITIATED BAD BLOCK REPLACEMENT? D BNE 20$ ;IF NE YES ;**-9+D TST @RCTPT ;IS RCT INSTALLED? ;GM112 F BNE 40$ ;IF NE YES ;**-1=G MOV #T.NRCT,R0 ;SET MESSAGE "REPLACEMENT CONTROLL TASK ...;H ;... NOT INSTALLED"G+H10$: CALL @DVMSG ;GO PRINT IT ;GM112 5H20$: TST R1 ;WAS THIS ON INITIALIZATION? ;PKW109S6H BEQ 30$ ;YES, DON'T CHANGE THE ERROR CODE ;PKW109CH MOV #IE.BBE&377,6(SP) ;SET BAD BLOCK ERROR IN STORED R0 ;PKW109N;K30$: SEC ;SET CARRY TO INDICATE NO NEED TO REQUES ;**-2LL BR 90$ ;EXITM40$: ;REF LABEL8M CMP @RCTPT,I.TCB(R3) ;IS THE I/O FROM RCT? ;GM112%O BNE 50$ ;NO, REQUEST RCT ;**-1V"P CLR R0 ;GET A WORKING REGISTER#Q MOV 4(SP),R1 ;GET THE END PACKETI$R BISB P.FLGS(R1),R0 ;GET THE FLAGS+S SWAB R0 ;PUT THE FLAGS IN THE HIGH BYTEO=T BIS R0,6(SP) ;SET THE FLAG BITS IN THE I/O STATUS ON STACKEU BR 30$ ;EXITV/W50$: MOV #12.,R1 ;SET LENGTH OF BLOCK NEEDEDS+W CALL @ALOCB ;GET A CORE BLOCK ;GM112O$Y BCC 60$ ;IF CC GOT ONE ;**-1Z MOV #T.NUER,R0 ;SET MESSAGE[ BR 10$ ;GO ON,/\60$: MOV R0,R3 ;SET ADDRESS OF MESSAGE BLOCKE,] TST (R0)+ ;POINT TO SECOND WORD IN BLOCK6^ MOV 4(SP),R1 ;DO WE HAVE AN INITIALIZATION REQUEST?_ BEQ 70$ ;IF EQ YESE` MOV P.CRF+2(R1),(R0)+ ;NO, INSERT I/O PACKET ADDRESS (REPLACEMENTSa ;REQUIRED INDICATOR)#b MOV R5,(R0)+ ;INSERT UCB ADDRESS08c MOV P.FBBK+2(R1),(R0)+ ;INSERT HI LBN TO BE REPLACED6d MOV P.FBBK(R1),(R0)+ ;INSERT LO LBN TO BE REPLACEDe BR 80$ ;AND CONTINUE2f70$: CLR (R0)+ ;INSERT INITIALIZATION INDICATOR#g MOV R5,(R0)+ ;INSERT UCB ADDRESSS"h CLR (R0)+ ;CLR LO LBN POSITION"i CLR (R0)+ ;CLR HI LBN POSITION0j80$: MOV R3,R1 ;COPY ADDRESS OF MESSAGE BLOCK4j MOV @RCTPT,R0 ;PICK UP RCT'S TCB ADDRESS ;GM112-j CALL @EXRQF ;REQUEST RCT TO RUN ;GM112 4m CLC ;CLR CARRY TO INDICATE RCT REQUESTED ;**-21n90$: POP ;RESTORE R3,R2,R1 AND R0Bo RETURN ;EXITPpq .ENDC ;D$$DSKT  .PAGE ;**-46=¡ .SBTTL SCUCB - GET ADDR OF NEXT UCB ON CONTROLLERN¢;+N£; ** - SCUCB - SCAN UCB'S ASSOCIATED WITH SPECIFIED CONTROLLER (SCB ADDRESS)¤;R¥;+ ¦; INPUTS: §;I¨; R5 = UCB ADDRESS©;S ª; OUTPUTS:«;¬;V­; R1=DESTROYED®; R4 = SCB ADDRESS¯; R5 = UCB ADDRESS°; CARRY CLEAR=UCB FOUNDR ±; CARRY SET=NO MORE UCBS²;-³SCUCB:-¶ POP ;RETRIEVE RETURN ADDRESS ;**-2 · PUSH ;SAVE R5 AND R3'¸ MOV U.SCB(R5),R3 ;GET ADDRESS OF SCBL'¹ MOV S.KRB(R3),R3 ;GET ADDRESS OF KRBL,º ADD K.OFF(R3),R3 ;OFFSET TO THE UCB TABLE8»10$: CMP #-1,(R3) ;ARE WE AT THE END OF THE UCB TABLE?¼ BEQ 20$ ;IF EQ YES7½ MOV (R3)+,R5 ;GET ADDRESS OF NEXT UCB, IS THERE ONE?¾ BEQ 10$ ;IF EQ NO5¿ MOV U.SCB(R5),R4 ;GET ADDRESS OF SCB FOR THIS UNIT%À PUSH ;SAVE UCB TABLE PO00tÀ`uÄ`“_c”_d–_k›’INTER %Á MOV 2(SP),R3 ;RETRIEVE CALLER'S R3:( CLC ;CLR CARRY TO SHOW WE FOUND ONE#à CALL (R1) ;CALL THE CALLER BACK AÄ POP ;GET RETURN ADDRESS AND POINTER TO NEXT UCB ENTRYGÅ BR 10$ ;TRY THE NEXT UCBÆ20$: ;REF LABELÇ+È POP ;RESTORE ORIGINAL R3 AND R5E5É MOV U.SCB(R5),R4 ;GET ADDRESS OF SCB FOR THIS UNIT3#Ê SEC ;SET CARRY TO SHOW THE ENDEË JMP (R1) ;EXITJ .PAGE ;**-1261K .SBTTL TMOGCS - PROCESS END PACKET FROM OP.GCS L;+=M;**-TMOGCS-RESPOND TO RECEIPT OF END PKT FOR OP.GCS COMMAND:N;CQ; INPUTS: ;**-2FR;O$S; R1 ADDRESS OF END PKT T; R2 ADDRESS OF QST U; R3 ADDRESS OF CSTV; W; OUTPUTS:X;ELY; IF THE COMMAND IS MAKING PROGRESS OR HAS COMPLETED THEN DO NOTHING1Z; OTHERWISE INITIATE A RE-SYNCHRONIZATIONU[;- \TMOGCS:E/] BIC #C1.TMO,(R3) ;INDICATE OP.GCS COMPLETED.,^ MOV P.OTRF+2(R1),R0 ;GET THE IOP ADDRESS._ CMP R0,C.OLHD(R3) ;IS IT THE SAME COMMAND?0` BNE 30$ ;NO, THE COMMAND MUST HAVE FINISHED1a MOVB I.PRM+11(R0),R0 ;GET THE SEQUENCE NUMBER13b BIC #^C<17>,R0 ;CLEAR ALL BUT THE LOW FOUR BITSF7c CMP R0,P.OTRF(R1) ;BOTH REFERENCE NUMBERS THE SAME?:,d BNE 30$ ;NO, COMMAND MUST HAVE FINISHED$e TST P.CMST(R1) ;REF NUMBER ZERO?4f BNE 10$ ;NO, WE HAVE TO SEE IF IT MADE PROGRESS5g TST P.CMST+2(R1) ;HOW ABOUT THE OTHER REF NUMBER? 5h BEQ 30$ ;IT'S ZERO TOO, THE COMMAND HAS FINISHEDS;i10$: CMP P.CMST+2(R1),C.CMST+2(R3) ;DID IT MAKE PROGRESS? j BHI 20$ ;NO, TIME OUT ERRORk BLO 30$ ;YES, JUST RETURNAl CMP P.CMST(R1),C.CMST(R3) ;HIGH WORD WAS EQUAL, CHECK LOW WORDO0m BLO 30$ ;IF LOWER THEN IT DID MAKE PROGRESS.n20$: CALLV PORT,PKTDR ;DEALLOCATE END PACKET%o JMP TMOERR ;JMP TO TIME OUT ERROR .p30$: CALLV PORT,PKTDR ;DEALLOCATE END PACKET q RETURNRrs .ENDT P.CMST+2(R1) ;HOW ABOUT THE OTHER REF NUMBER? 5h BEQ 30$ ;IT'S ZERO TOO, THE COMMAND HAS FINISHEDS;i10$: CMP P.CMST+2(R1),C.CMST+2(R3) ;DID IT MAK .TITLE OLRSRT .IDENT /04.01/S;C; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.E; ALL RIGHTS RESERVED.;R<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; K. E. KINNEAR 27-JUN-78;;); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:<;C; P. J. BEZEREDI;G; MODIFIED BY:;.; J. M. LAWLER 01-JUN-82 04.01;O,; JL110 -- CONDITIONALIZE MODULE ON R$$CON &; ADD SUBROUTINE $VOLSC FOR PHASE 2"; SUPPORT OF AUTOMOUNT/DISMOUNT;S;; ); ONLINE RECONFIGURATION SERVICE ROUTINESE;P T;+3; **-$KRBSC-CALL DRIVER AT KRB STATUS CHANGE ENTRY.R;SB; THIS ROUTINE WILL CALL THE DRIVER AT ITS KRB STATUS CHANGE ENTRYD; SPECIFIED IN THE DDT. IF THE DRIVER IS A COMMON INTERRUPT DRIVER,C; THEN IT WILL BE CALLED AT THE CI.KRB ENTRY. ENTRY CONDITIONS AREG9; DETAILED IN THE ROUTINE BODY. IF THE ENTRY ADDRESS = 0 9; THEN THE DRIVER OR COMMON INTERRUPT ROUTINE WILL NOT BET ; CALLED.F;P ; INPUTS: ;P3; $SCDEV=KRB ADDRESS OF CONTROLLER CHANGING STATUS.N"; $SCOFL=BYTE FLAG ONLINE/OFFLINE:;+'; -1 --> ONLINE TO OFFLINE TRANSITION.H'; 0 --> OFFLINE TO ONLINE TRANSITION.L;; 100 --> OFFLINE TO ONLINE TRANSITION SPECIAL CASE.E;T3; $SCCTB=CTB ADDRESS OF CONTROLLER CHANGING STATUS.N; ; OUTPUTS:;A=; DRIVER HAS BEEN CALLED AT ENTRY. WHEN $SCDEV GOES TO ZERO,OB; THEN $SCERR (BYTE VALUE) CONTAINS STATUS (I.E. WHETHER OPERATION?; WAS ACCEPTED OR REJECTED). NEGATIVE VALUES SIGNAL REJECTION, $; ONE SIGNALS SUCCESSFUL COMPLETION.; B; $SCDEV MAY TAKE SOME TIME TO GO TO ZERO. ALLOW AT LEAST 60 SECS.;F; NO REGISTERS ARE PRESERVED.F;N"; APR5/APR6 MAPPING IS PRESERVED.;-<; NOTE: $KRBSC AND $UCBSC MUST NOT BE USED TOGETHER, AS THEY%; USE COMMON PARAMETER PASSING AREAS.S;- ( .IF DF R$$CON ;RECONFIGURATION SUPPORT .ENABL LSBC&$KRBSC::MOV $SCCTB,R3 ;GET CTB ADDRESS$ MOVB #1,$SCERR ;SHOW SUCCESS STATUS' MOV KINAR5,-(SP) ;SAVE I-SPACE MAPPINGE I V .IF DF K$$DAS00uÈ``†`t`TADATADATADATADATADATA I' MOV KDSAR5,-(SP) ;SAVE D-SPACE MAPPING.  .ENDC M T8 MOV #REMAP,-(SP) ;SET ADDRESS TO RESTORE KISAR5, KDSAR5+ MOV L.DCB(R3),R4 ;GET DCB POINTER FROM CTBP8 BITB #LS.CIN,L.STS(R3) ;IS THIS A COMMON INTERRUPT CTB? BNE 10$ ;IF NE YES A;H:; DRIVER IS NOT COMMON INTERRUPT DRIVER -- HAS UCB AND MAY; OR MAY NOT BE LOADED DRIVER.; .1 MOV D.UCB(R4),R5 ;GET ANY UCB FOR DRIVER MAPPING, MOV D.DSP(R4),R4 ;GET DRIVER DISPATCH TABLE BNE 5$ ;IF NE DRIVER IS LOADED ;D; DRIVER IS NOT LOADED -- RETURN IE.HWR (HANDLER NOT RESIDENT) ERROR; $ MOVB #IE.HWR,$SCERR ;SET ERROR CODE T25$: MOV U.SCB(R5),R2 ;GET SCB ADDRESS (OF ANY SCB)) MOV S.KS5(R2),KINAR5 ;MAP DRIVER I SPACEH A M .IF DF K$$DAS ) MOV S.KS5(R2),KDSAR5 ;MAP DRIVER D SPACEO O .ENDC U D BR 15$ ;REENTER FLOW910$: ADD #CI.KRB-D.VKRB,R4 ;MAKE R4 LOOK LIKE DDT POINTER 15$: ;REFERENCE LABEL N  .IF DF M$$PRO G MOV $SCDEV,R2 ;GET KRB ADDRESS & MOV K.URM(R2),R2 ;GET UNIBUS RUN MASK MOV #20$,R3 ;SET UP FOR $EXROP CALLR $EXROPS N .IFTF ;&; AT THIS POINT, WE ARE ON CORRECT CPU; 20$: ;REFERENCE LABEL R .IFT  % MOV $SCCTB,R3 ;GET CTB ADDRESS AGAIN  P .ENDC M . MOV $SCDEV,R2 ;GET KRB ADDRESSK) ASRB $SCOFL ;CHECK IF ONLINE OR OFFLINE4 BCS 30$ ;IF CS OFFLINE TRANSITION (DONT CHECK CSR)" MOV #30$,-(SP) ;SET UP FOR $SGFIN" CALL $SGFIN ;WE EXPECT NXM TRAPS ;P>; SEE IF DRIVER IS COMMON INTERRUPT DRIVER. IF IT IS, THEN IF>; ITS CI.CSR ENTRY IS NON-ZERO, CALL IT THERE TO TEST THE CSR.@; OTHERWISE, TEST THE CSR JUST LIKE WE DO FOR ALL OTHER DEVICES.;  00 BITB #LS.CIN,L.STS(R3) ;IS IT COMMON INT DRIVER" BEQ 23$ ;IF EQ NO -- NORMAL TEST/ TST D.VKRB+(R4) ;IS CI.CSR ZEROA# BEQ 23$ ;IF EQ YES -- NORMAL TESTN ;S5; CALL COMMON INTERRUPT DRIVER AT CI.CSR ENTRY POINT.#;,; ENTRY CONDITIONS:F;; R2=KRB ADDRESS.X; R3=CTB ADDRESS.;7; $SGFIN HAS BEEN CALLED, THEREFORE DRIVER IS PROTECTEDE5; FROM NXM TRAPS. ON TST INSTRUCTIONS, IF C BIT CLR,T6; THEN LOCATION WAS THERE. IF C BIT SET, THEN LOCATION; CAUSED A NXM TRAP.; 3; NO REGISTERS ARE AVAILABLE FOR USE -- DRIVER MUSTR&; SAVE AND RESTORE ANY REGISTERS USED.;D; EXIT CONDTIONS:B;4; NO REGISTERS CAN BE CHANGED.;Q; IF DEVICE PRESENT, C BIT CLR.A#; IF DEVICE NOT PRESENT, C BIT SET.E;Y I. CALL @D.VKRB+(R4) ;CALL DRIVER BR 24$ ;REENTER CODE FLOW#23$: TSTB @(R2) ;IS THE CSR THERE? 24$: BCC 25$ ;IF CC YES. MOVB #IE.OFL,$SCERR ;SHOW NO CSR ERROR STATUS25$: RETURN ;EXIT $SGFIN230$: TSTB $SCERR ;HAVE WE ALREADY FOUND AN ERROR?4 BMI 50$ ;IF MI YES -- SKIP CALL TO DRIVER AND EXIT, ASRB $SCOFL ;GET OFFLINE BIT INTO SIGN BIT ;X@; CALL DRIVER AT KRB STATUS CHANGE ENTRY. ENTRY CONDITIONS ARE:;R; INPUTS TO DRIVER: ;D); R2=KRB ADDRESS FOR KRB CHANGING STATUS.L#; R3=CTB ADDRESS FOR THE ABOVE KRB.R); 0(SP)=RETURN ADDRESS FOR COMPLETION.T.; 2(SP)=RETURN ADDRESS TO CALLER OF $KRBSC.'; CARRY BIT CONTAINS STATUS TRANSITION: ;O(; C=1 --> ONLINE TO OFFLINE TRANSITION.(; C=0 --> OFFLINE TO ONLINE TRANSITION.;? ; $SCERR=1.I=; $SCOFL=POSITIVE/NON-ZERO IF SPECIAL OFFLINE TO ONLINE CASE.F;E#; RETURNED INFORMATION FROM DRIVER:I; +; DRIVER MUST EVENTUALLY RETURN CONTROL TO: ;:6; 0(SP) THEN THE RETURN STATUS IS CONTAINED IN $SCERR:;A,; $SCERR < 0 --> OPERATION NOT SUCCESSFUL.(; $SCERR = 1 --> OPERATION SUCCESSFUL./; $SCERR = 0 --> SPECIAL CASE OPERATION STILL$; IN PROGRESS.;T+; IF $SCERR < 0, THEN VALUE IS ERROR CODE.N;O;; DRIVER MUST RETURN WITHIN 60 SECS. (USE THE S.CTM TIMEOUT.; FEATURE IF NECESSARY.);P,; ALL REGISTERS ARE AVAILABLE TO THE DRIVER.;E ;A; AT THIS TIME, THE CARRY BIT CONTAINS INFORMATION FOR THE DRIVERR;R O<40$: MOV D.VKRB(R4),R0 ;TEST FOR ZERO WITHOUT CHANGING C-BIT! BEQ 50$ ;IF EQ DONT CALL DRIVERE CALL @D.VKRB(R4) ;CALL DRIVER#50$: MOV $SCDEV,R2 ;GET KRB ADDRESS # MOVB $SCOFL,R0 ;GET DESIRED STATUS  MOVB $SCERR,R1 ;GET ERROR TYPE S00uÐ`Ä`“_c”_d–_k›’XT R1 ;MAKE R1 ALL 1'S OR 0'S- XOR R1,R0 ;FLIP BITS IN R0 IF R1 SHOW ERRORC+ BIC #^C,R0 ;R0 CONTAINS KS.OFL BITS= BIC #KS.OFL,K.STS(R2) ;MAKE SURE OFFLINE BIT IS PROPER STATE4 BIS R0,K.STS(R2) ;SET OFFLINE BIT TO DESIRED STATUS F;+8; **-$OLRNT-ONLINE RECONFIGURATION NOTIFICATION ROUTINE.;H=; THIS ROUTINE WILL CLEAR $SCDEV AND SET EVENT FLAG 1 FOR THED; TASK POINTED TO BY $HRCPT.;$ ; INPUTS:E;R; NONE. ;M ; OUTPUTS:;G; NONE.D;A; NO REGISTERS ARE PRESERVED.R;- ,$OLRNT::CLR $SCDEV ;SHOW OPERATION COMPLETE" MOV #1,R0 ;SET EVENT FLAG TO SET& MOV $HRCPT,R5 ;GET HRC... TCB ADDRESS BEQ 60$ ;IF EQ NOT INSTALLED( BIT #TS.EXE,T.STAT(R5) ;IS TASK ACTIVE?' BNE 60$ ;IF NE NO -- DON'T CALL $SETF 7 BIT #T2.SEF,T.ST2(R5) ;IS TASK STOPPED FOR EVENT FLAG?C( BNE 60$ ;IF NE YES -- DON'T CALL $SETF MOV R5,R1 ;CREATE ADDRESS WORD) ADD #T.EFLG,R1 ;POINT TO FIRST TASK WORD ' CALLR $SETM ;SET HRC'S EVENT FLAG ONEG 60$: RETURNA ;+9; **-$UCBSC-CALL DRIVER AT UCB STATUS CHANGE ENTRY POINT. ; @; THIS ROUTINE WILL CALL A DRIVER AT ITS UCB STATUS CHANGE ENTRY; POINT.;T ; INPUTS:;Q2; $SCDEV=UCB ADDRESS OF UNIT WITH CHANGING STATUS.-; $SCOFL=BYTE VALUE OF DESIRED STATUS CHANGE:C; '; -1 --> ONLINE TO OFFLINE TRANSITION.T(; 0 --> OFFLINE TO ONLINE TRANSITION.;; 100 --> OFFLINE TO ONLINE TRANSITION SPECIAL CASE.D;. ; OUTPUTS:;T>; DRIVER HAS BEEN CALLED AT D.VUCB ENTRY. WHEN $SCDEV GOES TO<; ZERO THEN $SCERR (BYTE VALUE) CONTAINS RETURN STATUS (I.E.?; WHETHER OPERATION WAS ACCEPTED OR REJECTED). NEGATIVE VALUESB7; SIGNIFY REJECTION, ONE SIGNALS SUCCESSFUL COMPLETION.D4; IF THE ENTRY POINT IN THE DRIVER EQUALS ZERO, THEN; THE DRIVER IS NOT CALLED. ;N); $SCDEV MAY TAKE UP TO 60 SECS TO CLEAR.I;N; NO REGISTERS ARE PRESERVED.E;A!; APR5/APR6 MAPPING IS PRESERVED.T;N<; NOTE: $UCBSC SHOULD NOT BE USED WHILE $KRBSC IS IN USE DUE#; TO COMMON USE OF PARAMETER AREAS. ;- G&$UCBSC::MOV $SCDEV,R5 ;GET UCB ADDRESS T S .IF DF M$$PRO ." MOV U.SCB(R5),R4 ;GET SCB ADDRESS* MOV S.KRB(R4),R3 ;GET KRB ADDRESS, IF ANY BEQ 65$ ;IF EQ NO KRB ADDRESSO) MOV K.URM(R3),S.URM(R4) ;SET URM FOR SCBV65$: ;REFERENCE LABEL R .ENDC  L' MOV KINAR5,-(SP) ;SAVE I-SPACE MAPPING  C R .IF DF K$$DAS E' MOV KDSAR5,-(SP) ;SAVE D-SPACE MAPPINGN S .ENDC T N8 MOV #REMAP,-(SP) ;SET ADDRESS TO RESTORE KISAR5, KDSAR5 E  .IF DF M$$PRO R0 CALL $IFORK ;CONTINUE EXECUTION ON CORRECT CPU B D .ENDC S .;D/; WE ARE NOW EXECUTING ON THE CORRECT PROCESSOR;V K"70$: MOV (R5),R3 ;GET DCB ADDRESS" MOV U.SCB(R5),R4 ;GET SCB ADDRESS" MOV D.DSP(R3),R2 ;GET DDT ADDRESS! BNE 80$ ;IF NE DRIVER IS LOADED N;; DRIVER IS NOT LOADED;S $ MOVB #IE.HWR,$SCERR ;SET ERROR CODE BR 90$ ;EXIT WITH COMMON CODE-(80$: MOVB #1,$SCERR ;SHOW SUCCESS STATUS" MOV S.KRB(R4),R3 ;GET KRB ADDRESS BEQ 85$ ;IF EQ NO KRB.( MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX85$: ;REFERENCE LABEL   .IF NDF M$$PROD , MOV S.KS5(R4),KINAR5 ;SET UP KERNEL MAPPING V K .IF DF K$$DAS 7 MOV S.KS5(R4),KDSAR5 ;SET UP KERNEL DATA SPACE MAPPINGV D .ENDC G D .ENDC  E3 TST D.VUCB(R2) ;DOES THE DRIVER WANT TO BE CALLED?O BEQ 90$ ;IF EQ NOV4 ASRB $SCOFL ;SET CARRY BIT FOR DRIVER IF NECESSARY M;C); CALL DRIVER AT UCB STATUS CHANGE ENTRY.T;; INPUTS TO DRIVER:T;B5; R3=CONTROLLER INDEX. IF S.KRB=0 THEN R3 UNDEFINED.;); R4=ADDRESS OF THE STATUS CONTROL BLOCK.B'; R5=ADDRESS OF THE UNIT CONTROL BLOCK.K); 0(SP)=RETURN ADDRESS FOR COMPLETION.K.; 2(SP)=RETURN ADDRESS TO CALLER OF $UCBSC.'; CARRY BIT CONTAINS STATUS TRANSITION:C;G(; C=1 --> ONLINE TO OFFLINE TRANSITION.(; C=0 --> OFFLINE TO ONLINE TRANSITION.;I ; $SCERR=1.R=; $SCOFL=POSITIVE/NON-ZERO IF SPECIAL OFFLINE TO ONLINE CASE.L;I#; RETURNED INFORMATION FROM DRIVER:;N/; THE DRIVER MUST EVENTUALLY RETURN CONTROL TO:S;B,; 0(SP) AND THEN RETURN STATUS IS IN $SCERR:;S+; $SCERR < 0 --> OPERATION NOT SUCCESSFUL.N00uØ``†`t`TADATADATADATADATADATA'; $SCERR = 1 --> OPERATION SUCCESSFUL.O/; $SCERR = 0 --> SPECIAL CASE OPERATION STILLE; IN PROGRESS.;I*; IF $SCERR < 0, THEN VALUE IS ERROR CODE.;O@; DRIVER MUST RETURN CONTROL WITHIN 60 SECS. (USE S.CTM TIMEOUT; IF NECESSARY.);R,; ALL REGISTERS ARE AVAILABLE TO THE DRIVER.;O L CALL @D.VUCB(R2) ;CALL DRIVER(90$: MOV $SCDEV,R5 ;GET UCB ADDRESS BACK. MOVB $SCOFL,R0 ;GET DESIRED STATUS OF OFL BIT MOVB $SCERR,R1 ;GET ERROR VALUE. SXT R1 ;MAKE R1 ALL 1'S OR 0'S FROM SIGN BIT. XOR R1,R0 ;FLIP BITS IN R0 IF R1 SHOWS ERROR8 BIC #^C,R0 ;R0 CONTAINS DESIRED STATE OF US.OFL; BICB #US.OFL,U.ST2(R5) ;CLEAR OUT OFFLINE BIT JUST IN CASE3 BISB R0,U.ST2(R5) ;SET ACTUAL BIT VALUE INTO U.ST2C" BR $OLRNT ;EXIT THRU COMMON CODE .DSABL LSB  ;I=; REMAP -- RESET KINAR5/(KDSAR5) WITH SAVED VALUE AND RETURN.0;M $REMAP: ;REFERENCE LABEL  V .IF DF K$$DAS S. MOV (SP)+,KDSAR5 ;RESTORE DATA SPACE REGISTER V .ENDC R ;/ MOV (SP)+,KINAR5 ;RESTORE ALTERNATIVE REGISTER  RETURNS ;+&; **-$CPUSC-CPU STATUS CHANGE ROUTINE.;O>; THIS ROUTINE WILL PERFORM THE EXECUTIVE ACTIONS NECESSARY TO.; BRING A CPU ONLINE OR TO TAKE A CPU OFFLINE.;E ; INPUTS:T;LC; $SCDEV=MASK WITH BIT SET FOR CPU WHOSE STATUS SHOULD CHANGE. ONLY; ONE BIT SHOULD BE SET./-; $SCOFL=BYTE VALUE OF DESIRED STATUS CHANGE:;A'; -1 --> ONLINE TO OFFLINE TRANSITION.$'; 0 --> OFFLINE TO ONLINE TRANSITION. ;C ; OUTPUTS:; ; CPU ONLINE:;V4; THE CPU HAS BEEN "BOOTED" THRU THE IIST, AND THEN0; INTERRUPTED INTO THE $PENT PROCESSOR ENTRY. 7; AT THIS POINT THIS ROUTINE WILL RETURN TO THE CALLERE; WITH:;RF; R2=MASK OF PROCESSORS WHO DIDN'T RESET THE INTERRUPT MASKS (IF ANY).;S:; WHEN THE PROCESSOR COMMING ONLINE CALLS $CPNIT (AT THE 5; VERY END OF THE $PENT PROCESS) IT WILL ATTEMPT TO D9; INTERRUPT THE CURRENTLY ONLINE CPUS TO SEE IF THEY CANN8; RECEIVE FROM IT. IT WILL LEAVE THE MASK OF THOSE WHO5; CAN'T HEAR IT IN $SCRET, AND THEN ENTER $OLRNT TO "(; NOTIRY HRC... THAT THE CPU IS ONLINE.; ; CPU OFFLINE:; 9; THE CALLER WILL BE RETURNED TO AFTER THE NECESSARY CPUC8; HAS BEEN INTERRUPTED WITH THE OFFLINE FUNCTION. WHEN9; LOCAL EVENT FLAG ONE IS SET, THE PROCESSOR HAS HALTED.O;O; NO REGISTERS ARE PRESERVED.H;!; APR5/APR6 MAPPING IS PRESERVED.T;LD; THIS ROUTINE SHARES COMMON DATA AND PARAMETER AREAS WITH THE OTHERD; $XXXSC ROUTINES IN THIS MODULE. THEY SHOULD ONLY BE USED ONE AT A; TIME.T;- R  .IF DF M$$PRO N($CPUSC::TSTB $SCOFL ;ONLINE OR OFFLINE? BMI 30$ ;IF MI GOING OFFLINE T;C; BRING CPU ONLINE;T F% CLRB $SCERR ;NO IMMEDIATE ERROR YETE% MOV #C.LGTH,R1 ;ALLOCATE CLOCK BLOCKN( CALL $ALOCB ;OF CORRECT SIZE FROM POOL/ BCC 10$ ;IF CC BLOCK ALLOCATED OK, ADDR IN R0V4 MOVB #IE.NOD,$SCERR ;BAD NEWS -- NO POOL SPACE LEFT RETURN ;EXIT BACK TO OLRSRN310$: MOV R0,-(SP) ;SAVE CLOCK QUEUE BLOCK FOR LATERN) BIS $SCDEV,$IIMSK ;SET INTERRUPT MASK UP / CALL $IISTM ;MAKE EVERYONE SET UP THEIR MASKSC0 MOV R2,-(SP) ;SAVE PEOPLE WHO DIDN'T DO THE JOB/ MOV $SCDEV,R1 ;GET THE CPU COMING ONLINE AGAIN' CALL $IBXMT ;SEND HIM A BOOT MESSAGE!  CLR $SCRET ;CLEAR OUT STATUS) MOV 2(SP),R0 ;GET CLOCK QUEUE BLOCK BACKE3 MOV (SP)+,(SP) ;SLIDE STATUS RETURN DOWN ONE FRAME + MOV #20$,C.SUB(R0) ;SET SUBROUTINE ADDRESSP# MOV $TKPS,R2 ;GET TICKS PER SECONDT) CLR R1 ;CLEAR OUT HIGH ORDER DELTA TIMEU ASL R2O ASL R2 ;WAIT FOR 4 SECONDS! MOV #C.SYST,R4 ;SET REQUEST TYPEM& MOV $TKTCB,R5 ;SET REQUEST IDENTIFIER$ CALL $CLINS ;INSERT IN CLOCK QUEUE MOV (SP)+,R2 ;GET STATUS BACK RETURNI O;N); SUBROUTINE FOR INTERPROCESSOR INTERRUPTS;E (20$: MOV R4,R0 ;GET CLOCK BLOCK ADDRESS MOV #C.LGTH,R1 ;SET LENGTHC% CALL $DEACB ;DEALLOCATE CLOCK BLOCKN MOV $SCDEV,R1 ;GET PROCESSOR(S) CALLR $IIXMT ;INTERRUPT THEM $;S; BRING CPU OFFLINEC;T C&30$: MOV #MP.STP,R2 ;SET STOP FUNCTION% MOV $SCDEV,R1 ;GET CPU'S TO DO IT TOS% CLR $SCRET ;CLEAR OUT STATUS RETURNM& CLRB $SCERR ;CLEAR OUT STATUS RE00uà`vå`“_c”_d–_k›’TURN! CALLR $IIFNX ;TRANSMIT FUNCTION V;+; **-$CPOFF-TAKE CPU OFFLINE.I;OD; THIS ROUTINE WILL TAKE A CPU OFFLINE. IT WILL RESET THE INTERRUPTC; MASKS OF ALL OTHER ONLINE PROCESSORS TO NOT ALLOW INTERRUPTS FROMAD; THIS ONE, WILL RESET THE IIST ON THIS CPU TO ALLOW INTERRUPTS FROMD; ANYONE, WILL DECLARE A SIGNIFICANT EVENT, AND CLEAR OUT THE ONLINE%; BIT FROM $URMST FOR THIS PROCESSOR.$;E ; INPUTS:P; ; NONE.T; ; OUTPUTS:;L; NONE.T;S; NO REGISTERS ARE PRESERVED.O;- UB$CPOFF::BIC $CPBIT,$IIMSK ;PREPARE TO RESET THE INTERRUPT MASKS OF% CALL $IISTM ;ALL OTHER ONLINE CPUS.L: CALL $IIOPN ;INITIALIZE OUR IIST, TO ALLOW INT AND BOOTS1 CLRB $CXDBL ;IN CASE CONTEXT SWITCHING DISABLEDP. BIC $CPBIT,$URMST ;SHOW US NOT ONLINE ANYMORE2 CALLR $DRDSE ;DECLARE SIGNIFICANT EVENT AND EXIT A .ENDC T .IFF ; DF R$$CON $KRBSC::$OLRNT::$UCBSC::$CPOFF:: RETURNE .ENDC ; DF R$$CON!; **-$VOLSC-VOLUME STATUS CHANGE S; <; THIS SUBROUTINE IS CALLED BY A DRIVER WHEN HARDWARE VOLUME;; VALID STATUS CHANGES. MINIMALLY, $VOLSC RE-SETS SOFTWAREL8; VOLUME VALID. IF THE VOLUME MOUNTED FOREIGN THEN THIS9; IS THE ONLY ACTION TAKEN ON THE UNIT. IF THE VOLUME ISC9; MOUNTED FILE-STRUCTURED OR NOT MOUNTED THE VERIFICATIONO9; TASK WILL BE REQUESTED TO EITHER MOUNT OR RE-MOUNT THE 5; VOLUME. ADDITIONALLY, I/O WILL BE STALLED TO UNITS0; MOUNTED WITH A FILE-STRUCTURE UNTIL THE VOLUME; STATUS CAN BE VERIFIED.A; ; INPUTS: ; (; R5=UCB ADDRESS OF UNIT WITH TRANSITION;R ; OUTPUTS:; ; NONE.T;C; R4,R5 PRESERVED ;L;- .ENABL LSBL $VOLSC:: ;# .IF DF R$$AMD ;AUTOMOUNT/DISMOUNT  SAVNR T5 BICB #US.VV,U.STS(R5) ;RE-SET SOFTWARE VOLUME VALID 1 BITB #US.FOR,U.STS(R5) ;VOLUME MOUNTED FOREIGN ?T* BNE 20$ ;IF NE, YES - NOTHING MORE TO DO) BITB #US.MNT,U.STS(R5) ;VOLUME MOUNTED ?L BNE 10$ ;IF NE, NO6 BISB #US.SIO,U.ST2(R5) ;STALL I/O FOR MOUNTED VOLUMES;10$: BISB #US.TRN,U.ST2(R5) ;SET FLAG FOR VERIFICATION TASKB0 MOV $VERTK,R0 ;TCB ADDRESS OF VERIFICATION TASK" CALLR $EXRQN ;UNSTOP/REQUEST VER .IFTF ; DF R$$AMD20$: RETURN ; .DSABL LSB  .ENDC ; DF R$$AMD S .END BICB #US.VV,U.STS(R5) ;RE-SET SOFTWARE VOLUME VALID 1 BITB #US.FOR,U.STS(R5) ;VOLUME MOUNTED FOREIGN ?T* BNE 20$ ;IF NE, YES - NOTHING MORE TO DO) BITB #US.MNT,U.STS(R5) ;VOLUME MOUNTED ?L BNE 10$ ;IF NE, NO6 BISB #US.SIO,U.ST2(R5) ;STALL I/O FOR MOUNTED VOLUMES;10$: BISB #US.TRN,U.ST2(R5) ;SET FLAG FOR VERIFICATION TASKB0 MOV $VERTK,R0 ;TCB ADDR .TITLE NVRUPT .IDENT /01.01/$; ; COPYRIGHT (C) 1982; ALL RIGHTS RESERVED/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.$;D?; THIS SOFTWARE IS FURNISHED UNDER LICENSE AND MAY ONLY BE USED 6; OR COPIED ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;2; VERSION 01.01 ;H; M. C. OZUR 16-APR-82;N; MODIFIED BY:; ;N; T. LEKAS 3-JUNE-82 01.01;B/; TL191 -- CHANGE REFERENCES TO $CTFEA AND CF.M-; TO THE SECOND HARDWARE FEATURE MASK WORDE;I; MACRO LIBRARY CALLST;0 .MCALL HWDDF$% HWDDF$ ; DEFINE HARDWARE REGISTERSY .ENABL LC; *; INCREMENT THE KEYSTROKE COUNT IN THE NVR;R+$KEYUP::BIT #H2.NVR,$HFMSK+2 ;NVR PRESENT?S BEQ 10$ ;IF EQ NON SEC ;SET CARRY FOR INCREMENTP' ADCB @#N.KEY ;ADD CARRY TO FIRST BYTEE) ADCB @#N.KEY+2 ;CASCADE CARRY THROUGH...R" ADCB @#N.KEY+4 ; THE NEXT 3 BYTES ADCB @#N.KEY+6 ;N10$: RETURN ;DONE1; 2; INCREMENT THE RX50'S READ/WRITE COUNT IN THE NVR;D+$DZAUP::BIT #H2.NVR,$HFMSK+2 ;NVR PRESENT?R BEQ 10$ ;IF EQ NOC SEC ;SET CARRY FOR INCREMENTR' ADCB @#N.DZA ;ADD CARRY TO FIRST BYTER) ADCB @#N.DZA+2 ;CASCADE CARRY THROUGH...K" ADCB @#N.DZA+4 ; THE NEXT 3 BYTES ADCB @#N.DZA+6 ;I10$: RETURN ;DONE ; 2; INCREMENT THE RD50'S READ/WRITE COUNT IN THE NVR;E+$DWAUP::BIT #H2.NVR,$HFMSK+2 ;NVR PRESENT? BEQ 10$ ;IF EQ NO  SEC ;SET CARRY FOR INCREMENT' ADCB @#N.DWA ;ADD CARRY TO FIRST BYTEH) ADCB @#N.DWA+2 ;CASCADE CARRY THROUGH...D" ADCB @#N.DWA+4 ; THE NEXT 3 BYTES ADCB @#N.DWA+6 ;I10$: RET00vè`wë``t`TADATADATADATADATADATAURN ;DONE ; 0; INCREMENT THE MINUTES OF O/S UPTIME IN THE NVR;T+$UPTUP::BIT #H2.NVR,$HFMSK+2 ;NVR PRESENT?K BEQ 10$ ;IF EQ NOH SEC ;SET CARRY FOR INCREMENTI' ADCB @#N.UPT ;ADD CARRY TO FIRST BYTE ) ADCB @#N.UPT+2 ;CASCADE CARRY THROUGH..." ADCB @#N.UPT+4 ; THE NEXT 3 BYTES ADCB @#N.UPT+6 ; ! MOV $NVRCT,$NVRTM ;RESET COUNTERN10$: RETURN ;DONEW;+7; $SETCK - SETUP NONVOLATILE CLOCK (MC146818 CMOS Chip)R;H; Description:;+5; Copies the RSX date/time vector (from SYSCM) to the 8; NV clock chip. This is done when the date/time vector8; is modified via the SET TIME directive. Once the chip2; is update, RSX and the clock chip maintain time6; independently of each other. The clock chip will be7; read at boot time to reload the RSX date/time vector.T;-,$SETCK::MOV $CKCSR,R5 ;GET THE CT CLOCK CSR2: BIS #206,-2(R5) ;ENABLE "SET" MODE, BINARY DATA, 24 HOUR. ; UPDATES INHIBITED.-5$: BIT #200,-4(R5) ;IS AN UPDATE IN PROGRESSt( BNE 5$ ;IF NE, YES WAIT FOR COMPLETION- MOV #$TTNS,R4 ;GET POINTER TO SECONDS VECTORt MOV R5,R3 ;POINT TO SECONDS...! SUB #30,R3 ; IN THE CLOCK CHIP) MOV #3,R2 ;COPY SECONDS, MINUTES, HOURSi10$: MOV -(R4),(R3)+ ;MOVE IT  CLR (R3)+ ;CLEAR THE ALARMS SOB R2,10$ ;DONE?o CLR (R3)+ ;CLEAR DAY OF WEEK" MOV #3,R2 ;COPY DAY, MONTH, YEAR20$: MOV -(R4),(R3)+ ;MOVE IT2 SOB R2,20$ ;DONE?D5 BIC #200,-2(R5) ;DISABLE "SET" MODE. UPDATE STARTED.I RETURN ;DONE  .END IN PROGRESSt( BNE 5$ ;IF NE, YES WAIT FOR COMPLE .TITLE DDDRVH .IDENT /03.02/4;5D; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;S ;C ; M. B. GROSSMAN 10/15/78E ;  ; P. J. CARR ; J. GALLANT ; ! ; MODIFIED BY: 15-AUG-86 3.02 I ; 8 ; G. MARIGOWDA GM001 -- CONVERT TO USE EXEC VECTORING ; ;A; TU58 TAPE CARTRIDGE DRIVER;A; THIS DRIVER INTERFACES WITH THE TU58 VIA A DL11 AT 9600 BAUD. B; COMMANDS, DATA AND DEVICE STATUS ARE FORMATTED INTO STRUCTURED?; PACKETS OF BYTES IN ACCORDANCE WITH RADIAL SERIAL PROTOCOL.B;D; MACRO LIBRARY CALLSC;N0 .MCALL HWDDF$,PKTDF$,QIOSY$,SCBDF$ ;GM001 QIOSY$ ;GM001 SCBDF$ ,,SYSDEF ;GM001L. HWDDF$ ;DEFINE HARDWARE REGISTERS ;**-1&! PKTDF$ ;DEFINE I/O PACKET OFFSETS"; #; EQUATED SYMBOLS$;%RTRY= 2 ;RETRY COUNT1&DDNUM= 6 ;NUMBER OF REGISTERS TO LOG ON ERROR ';V'(; TU58 RADIAL SERIAL PROTOCOL SYMBOLSA);D*; INSTRUCTION SETR+;D,READ= 2 ;READ INSTRUCTIONF-WRITE= 3 ;WRITE INSTRUCTIONS4.POSIT= 5 ;POISITION INSTRUCTION -USER MODE DIAG.3/DIAG= 7 ;DIAGONOSE INSTRUCTION -USER MODE DIAG.40TYPU58= 12 ;OPCODE TO CHECK FOR OLD OR NEW TU581; 2; FLAGSD3; 4DATA= 1 ;DATA FLAG5CNTL= 2 ;CONTROL FLAG 6INIT= 4 ;INITIALIZE FLAG7CONT= 20 ;CONTINUE FLAG 8END= 2 ;END FLAG9; !:; DL11 INTERFACE OFFSET SYMBOLSO;;-<DDRCS= 0 ;RECEIVE CONTROL STATUS REGISTER%=DDRBF= 2 ;RECEIVE BUFFER REGISTER 1>DDXCS= 4 ;TRANSMITTER CONTROL STATUS REGISTERT)?DDXBF= 6 ;TRANSMITTER BUFFER REGISTERU@;OA; DL11 BIT ASSIGNMENTSB;ECRDONE= 200 ;RECEIVER DONE'DRIE= 100 ;RECEIVER INTERRUPT ENABLER$EERR= 100000 ;RECEIVER DATA ERROR FTRDY= 200 ;TRANSMITTER READY*GTIE= 100 ;TRANSMITTER INTERRUPT ENABLEHBRK= 1 ;TRANSMIT BREAKI;J; LOCAL BIT ASSIGNMENTSK;12LFLCTL = 10 ;FLOW CONTROL BIT IN SWITCH BYTE OFM ;COMMAND PACKET (BIT 3)!NNTU58 = 1 ;NEW TU58 MICROCODE $OCHKDON = 2 ;TU58 TYPE CHECK DONE(PTU58C = 10 ;TU58 IS SENDING CONTINUE/QTRNACK = 20 ;TRANSMITTING THE ACK CHARACTERR;S; LOCAL DATAT;V=UWORD1: .BLKW T$$U58 ;STORAGE FOR LAST THREE WORDS THAT ARE0-VWORD2: .BLKW T$$U58 ;TO GO IN ERROR PACKETIWWORD3: .BLKW T$$U58 ;W; ;GM001 *W; MAKE GTPKT$ A LOCAL MACRO ;GM001W; ;G00wð`å`“_c”_d–_k›’M0014W .MACRO GTPKT$ DEV,NCTRLR,ADDR,UCBSV,SUC ;GM001W CALL @GTPKT ;GM001W .IF B ;GM0015W BCC 65535$ ;GM001;W RETURN ;GM001W65535$: ;GM001 W .IFF ;GM001W BCS ADDR ;GM001RW .ENDC ;GM001AW .IF B ;GM001W $$$=0 ;GM001WW .IF B ;GM001W .IF EQ $$$ ;GM001E W MOV R5,S.OWN(R4) ;GM001W .ENDC ;GM001EW .ENDC ;GM001 W .IFF ;GM001W .IF GT NCTRLR-1 ;GM001L W MOV R5,UCBSV(R3) ;GM001W .IFF ;GM001W MOV R5,UCBSV ;GM001W .ENDC ;GM001MW .ENDC ;GM001GW .ENDM ;GM001;W ;GM001W; ;GM001D1W; EXECUTIVE ENTRY POINT VECTOR TABLE ;GM001BW; ;GM0011W ;GM001;WEXEVEC: .WORD 0 ;FLAG FOR VECTOR NOT YET FILLED ;GM001MW ;GM001#W ALOCB: .WORD $ALOCB ;GM001;#W BLKCK: .WORD $BLKCK ;GM001.#W DEACB: .WORD $DEACB ;GM0011#W DTOER: .WORD $DTOER ;GM001 #W DVERR: .WORD $DVERR ;GM001#W ERRSQ: .WORD $ERRSQ ;GM001 "W FORK: .WORD $FORK ;GM001#W GTBYT: .WORD $GTBYT ;GM001 #W GTPKT: .WORD $GTPKT ;GM001#W IODON: .WORD $IODON ;GM001 #W PTBYT: .WORD $PTBYT ;GM001 #W VOLVD: .WORD $VOLVD ;GM001AW ; ;GM001F#W KISR6: .WORD KISAR6 ;GM001W ; ;GM001B(W EXEVCL=<<<.-EXEVEC>/2>-1> ;GM001W ; ;GM001 %Y;DRIVER DISPATCH TABLE ;**-1WZ;D<Z DDT$ DD,T$$U58,,,,NEW ;2 INT. ENTRY PTS ; GM001\ ;**-1 ];;^; PROGRAM SEQUENCE CONTROL_; 9`; PROGRAM FLOW IS CONTROLLED BY A POINTER TO A TABLE OFR;a; ADDRESSES. THIS SEQUENCE CREATES AND DECODES THE RADIAL6b; SERIAL PACKET INFORMATION. THE ACTUAL USER DATA IS;c; TRANSFERRED WITHIN THE INTERRUPT SERVICE ROUTINE (ISR).A9d; THIS METHOD PERMITS US TO WAIT FOR INTERRUPTS WITHOUTE=e; HAVING TO PRESERVE ANY PROCESSOR REGISTERS (INCLUDING THET9f; STACK). REPETITIVE SECTIONS OF CODE CAN BE EXECUTED A ;g; NUMBER OF TIMES WITHOUT LOOP COUNTERS. THIS METHOD ALSOG9h; DECREASES PROGRAM SIZE BY ALLOWING US TO USE BRANCHESBi; RATHER THAN JSR'S.j;;k; THE POINTER (LOCATION RADD) IS INCREMENTED VIA THE CODE:l; IN RTBK (RETURN BACK). RTBK THEN SHIFTS CONTROL TO THE>m; ADDRESS POINTED TO BY RADD. RTBK IS CALLED BY RMSG/SMSG OR<n; THE INTERRUPT SERVICE ROUTINE WHENEVER THE DL11 IS READY4o; TO PERFORM THE NEXT NON-DATA TRANSFER OPERATION.p;TCq; THE MODIFIED RADIAL SERIAL PROTOCOL ALGORITHM IS THE FOLLOWING:Ir;I?s; ISSUE A COMMAND TO THE TU58 WITH THE OPCODE 12 AND THE FLOWECt; CONTROL BIT SET. RECEIVE THE FIRST BYTE OF THE TU58'S RESPONSE.HDu; IF IT'S A '1', IT IS AN OLD TU58. THE '1' IS THE FLAG FOR A DATAFv; PACKET. IF THE RESPONSE IS A '2', IT IS A NEW TU58. THE '2' IS THEDw; FLAG FOR AN END PACKET. FLUSH THE REST OF THE TU58'S RESPONSE BYEx; SENDING THE TU58 AN INIT COMMAND. THE MEMORY LOCATION FLGTYP WILL Dy; HAVE BIT 0 SET FOR THE NEW TU58 AND BIT 0 WILL BE CLEARED FOR AN z; OLD TU58.I{;IE|; THE COMMAND PACKET THAT AUTOCONFIGURES THE TU58 LOOKS AS FOLLOWS: };O~; BYTE BYTE CONTENTSR; ---- ---------------N€; 0 FLAG - 2I�; 1 BYTE COUNT 12 ‚; 2 OPCODE 12ƒ; 3 MODIFIER 0S„; 4 UNIT #6…; 5 SWITCHES 10 (FLOW CONTROL BIT SET - BIT 3)†; 6 SEQUENCE # 0U‡; 7 SEQUENCE # 0Dˆ; 8 BYTE COUNT 0A‰; 9 BYTE COUNT 0LŠ; 10 BLOCK # 00‹; 11 BLOCK # 0 Œ; 12 CHECK SUM-LOWO�; 13 CHECK SUM-HIGHŽ;�; !�; CTAB- COMMAND PACKET SEQUENCET‘;5=’; CONE IS THE ADDRESS RETURNED TO WHEN THE DL11 IS READY TO <“; SEND THE FIRST BYTE OF THE 14. BYTE COMMAND PACKET. CTWO>”; IS THE ADDRESS RETURNED TO WHEN READY FOR THE SECOND BYTE,?•; ETC. CFIF IS EXECUTED AFTER ALL BYTES IN THE COMMAND PACKET –; ARE SENT.E—; =˜CTAB: .WORD CHALF,CONE,CTWO,CTHR,CFOUA,CFOUB,CFIV,CSIX,CSEV 0™ .WORD CEIG,CNIN00wø`ë``t`TADATADATADATADATADATA,CTEN,CELE,CTWE,CTHI,CFOR,CFIFš;C!›; ITAB- INITIALIZATION SEQUENCEOœ; P�ITAB: .WORD IONE,ITWOA,ITWOB,ITWOC,ITWOD,ITWOE,ITHR,IFOU,IFIV,ISIX ;INIT. SEQ.ž;H Ÿ; TTAB- TRANSMIT DATA SEQUENCE ;R1¡TTAB: .WORD TONE,TTWO,TTHR,TFOU,TFOUA,TFIV,TSIXO¢; £; RTAB- RECEIVE DATA SEQUENCER¤;EH¥RTAB: .WORD RONE,RTWO,RTHR,RFOU ;INCOMING (READ) DATA PACKET ADDRESSES¦; $§; ETAB- END PACKET DECODE SEQUENCE¨; A©ETAB: .WORD EONE,ETWO,ETHR,EFOU,EFIV,ESIX,ESEV ;READ END PACKET1ª .WORD EEIG,ENIN,ETEN,EELE,ETWE,ETHI ;FROM TU58C«; #¬; TYPTAB - DETERMINE TYPE OF TU58­;B@®TYPTAB: .WORD CONE,CTWO,TYPTHR,CFOUB,CFIV,TYPSIX,TYPSEV,TYPSEV5¯ .WORD TYPSEV,TYPSEV,TYPSEV,TYPSEV,CTHI,CFOR,TYPFIF@° .WORD TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSXT2± .WORD TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSVT²;T@³; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER)´;K$µRDAT: .BLKW T$$U58 ;RECEIVED DATA-¶RADD: .BLKW T$$U58 ;RETURN ADDRESS POINTERP*·DBUF: .BLKW T$$U58 ;DL11 BUFFER ADDRESS1¸CKSM1: .BLKW T$$U58 ;CHECKSUM STORAGE-1ST WORDF$¹ ;ALSO TEMPORARY DRIVER STORAGE1ºCKSM2: .BLKW T$$U58 ;CHECKSUM STORAGE-2ND WORDT$» ;ALSO TEMPORARY DRIVER STORAGE*¼FLAG: .BLKW T$$U58 ;LOW BYTE-BYTE COUNT½ ;HIGH BYTE-SEND/REC. FLAG./¾WCNT: .BLKW T$$U58 ;BYTES LEFT TO BE WRITTEN#¿ ;ALSO USED FOR RETURN ADDRESS À ;DURING IOPKT SUBROUTINE/Á ;ALSO USED FOR INITIALIZATION RETRY COUNTD+ÂFLGTYP: .BLKW T$$U58 ;BIT 0 - 0 OLD TU58Bà ; 1 NEW TU581.Ä ;BIT 1 - 0 NOT COMPLETED TU58 TYPE CHECK$Å ; 1 COMPLETED TU58 TYPE CHECK*Æ ;BIT 3 - 0 TU58 NOT SENDING CONTINUE)Ç ; - 1 TU58 IS SENDING CONTINUEE.È ;BIT 4 - 0 NOT TRANSMITTING THE ACK CHAR*É ; - 1 TRANSMITTING THE ACK CHARÊË;++Ì; **-DDINI- TU58 TAPE CARTRIDGE INITIATOREÍ;@Î; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN ANDÏ; I/O REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION>Ð; TO PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIEDBÑ; CONTROLLER IS NOT BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THEAÒ; NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IS EXECUTED. IF5BÓ; THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPERATION:Ô; IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.Õ;D Ö; INPUT:×;A=Ø; R5 = ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATEDQÙ;I Ú; OUTPUT:WÛ;N>Ü; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST<Ý; IS WAITING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED7Þ; AND THE DRIVER INITIATES THE REQUESTED I/O FUNCTIONMß;- à .ENABL LSB3áDDINI: GTPKT$ DD ;GET NEXT I/O PACKET TO PROCESSEâ;.3ã; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT: ä;I)å; R1=ADDRESS OF THE I/O REQUEST PACKET. æ; R2=PHYSICAL UNIT NUMBER.ç; R3=CONTROLLER INDEX.+è; R4=ADDRESS OF THE STATUS CONTROL BLOCK.O<é; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.ê;R8ë; TU58 TAPE CARTRIDGE DRIVE I/O REQUEST PACKET FORMAT:ì;E$í; WD. 00 -- I/O QUEUE THREAD WORD.2î; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.7ï; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK./?ð; WD. 03 -- POINTER TO 2ND LUN WORD IN REQUESTOR TASK HEADER.N@ñ; WD. 04 -- CONTENTS OF 1ST LUN WORD IN REQUESTOR TASK HEADER.@ò; WD. 05 -- I/O FUNCTION CODE (IO.RLB, IO.WLB, IO.DGN, IO.BLS)2ó; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.2ô; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.&õ; WD. 10 -- I/O STATUS BLOCK ADDRESS4ö; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE,÷; WD. 12 -- RELOCATION BIAS OF DATA BUFFER,ø; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER)ù; WD. 14 -- NUMBER OF BYTES TO TRANSFERNú; WD. 15 -- NOT USED7û; WD. 16 -- LOW BYTE MUST BE ZERO, HIGH BYTE NOT USED .ü; WD. 17 -- LOGICAL OR PHYSICAL BLOCK NUMBERý; WD. 20 -- NOT USEDþ;Lÿ; DRIVE USUAGE OF UCBD;-+; U.CW2+1 --- STORES DRIVER'S RETRY COUNTD;-;+5; THE TU58 UTILIZES RADIAL SERIAL PROTOCOL. ALL I/OT7; COMMANDS ARE INITIATED BY SENDING A COMMAND MESSAGER00waå`“_c”_d–_k›’7; PACKET CONSISTING OF 14. BYTES OF INFORMATION. DATAR5; IS THEN TRANSFERRED TO THE UNIT (WRITE) OR TO THE 8; USER'S BUFFER (READ) IN MESSAGE PACKETS OF UP TO 1287 ; BYTES EACH. TERMINATION OF AN OPERATION BY THE TU58 4 ; IS SIGNALED BY THE UNIT'S SENDING AN END MESSAGE4 ; PACKET WHICH CONTAINS INFORMATION CONCERNING THE ; SUCCESS OF THE TRANSFER. ;-; ;D, MOVB #RTRY,U.CW2+1(R5) ;STORE RETRY COUNT1 CALL @VOLVD ;VALIDATE VOLUME VALID ; GM001B$ BCC 10$ ;IF CC SUCCESS ;**-15$: JMP XIT ;EXIT"10$: TST R0 ;TRANSFER FUNCTION? BPL 5$ ;IF PL NO4 MOV S.CSR(R4),DBUF(R3) ;STORE DL11 BUFFER ADDRESS1 MOV R3,R4 ;R4 IS USED FOR CONTROLLER INDEXINGN, CALL @BLKCK ;CHECK PARAMETERS ; GM0018 ADD #DDXBF,DBUF(R4) ;SAVE DL11 XMITTER BUFFER ;**-1;N; SEND COMMAND PACKETI;E<RINI: MOV #TYPTAB-2,RADD(R4); POINT TO WORD PRIOR TO TABLE1 CLR FLAG(R4) ;SET FLAG FOR TRANSMIT INTERRUPTSV; CLR FLGTYP(R4) ;CLEAR FLAG TYPE WORD,DEFAULT IS OLD TU58 !  BR 145$ ;PREPARE TO SEND BYTE0;!RINI1: MOV #CTAB-2,RADD(R4) ;POINT TO WORD PRIOR TO TABLESA" BIC #TU58C!TRNACK,FLGTYP(R4); CLEAR ACK AND TU58 CONTINUE FLAGU1# CLR FLAG(R4) ;SET FLAG FOR TRANSMIT INTERRUPTSK!$ BR 145$ ;PREPARE TO SEND BYTEB%;F&; SEND COMMAND PACKET.'; ,(CHALF: BITB #NTU58,FLGTYP(R4) ; NEW TU58 ?) BNE 15$ ; YES0* JMP RTBK ; NO - DON'T SEND INITIAL CONTINUEA+15$: MOVB #CONT,@DBUF(R4) ; SEND CONTINUE TO ASSURE A RESPONSER#, BR 145$ ; PREPARE TO SEND BYTE4-CONE: MOVB #CNTL,@DBUF(R4) ;SEND COMMAND FLAG BYTE!. BR 145$ ;PREPARE TO SEND BYTE +/CTWO: MOV #10.,@DBUF(R4) ;SEND BYTE COUNTR30 MOVB #10.,CKSM1+1(R4) ;CREATE CHECKSUM WORD FROMA)1 MOVB #CNTL,CKSM1(R4) ; FIRST TWO BYTESE 2 BR 145$03CTHR: CALL IOPKT ;STORE I/O PKT ADDRESS IN R14;BF5; POSITION AND DIAGNOSE FUNCTIONS ARE USER MODE DIAGNOSTIC FUNCTIONS6;D;7 CMP #IO.DGN!IQ.UMD,I.FCN(R1) ;TU58 INTERNAL DIAGNOSTICS?N8 BNE 40$ ;IF NE NOR19 MOV #DIAG,CKSM2(R4) ;CREATE NEXT CHECKSUM WORDO0: MOVB #DIAG,@DBUF(R4) ;SEND DIAGNOSTIC OP CODE; BR 140$ ;CONTINUE OPERATION 7<40$: CMP #IO.BLS!IQ.UMD,I.FCN(R1) ;POSITION FUNCTION?1= BNE 60$ ;IF NE NOC2> MOV #POSIT,CKSM2(R4) ;CREATE NEXT CHECKSUM WORD&? MOVB #POSIT,@DBUF(R4) ;SEND OP CODE@ BR 140$ ;CONTINUEE9A60$: CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL BLOCK?RB BNE 72$ ; IF NO NES1C MOV #READ,CKSM2(R4) ;CREATE NEXT CHECKSUM WORDN)D MOVB #READ,@DBUF(R4) ;SEND READ OPCODEE BR 110$ ;CONTINUER:F72$: CMPB #IO.WLB/256.,I.FCN+1(R1); WRITE LOGICAL BLOCK?G BEQ 100$ ;IF EQ YES$H MOV (SP)+,R1 ;RESTORE R1:>H CALL @FORK ;ENSURE PRIORITY=0 AND REGISTERS SAVED ; GM0015J MOV #IE.IFC&377,R0 ;ILLEGAL FUNCTION CODE ;**-1U/K CLR CKSM2(R4) ;CLEAR BYTES TRANSFERRED COUNTL JMP IOCMP ;EXIT7M100$: MOV #WRITE,CKSM2(R4) ;CREATE NEXT CHECKSUM WORDR+N MOVB #WRITE,@DBUF(R4) ;SEND WRITE OPCODE20O110$: BITB #US.WCK,U.STS(R5) ;WRITE CHECK SET? P BNE 141$ /Q CMPB #20,I.FCN(R1) ;IS WLC OR RLC REQUESTED? R BNE 140$ ;IF NE NO S BR 141$T;L>U; SEND A MODIFIER BYTE OF ONE FOR WRITECHECKS AND READCHECKSV; ,WCFOUA: MOVB #1,CKSM2+1(R4) ;ALTER CHECKSUM#X MOVB #1,@DBUF(R4) ;SEND MODIFIERG1Y ADD #2,RADD(R4) ;SKIP OVER NEXT RETURN ADDRESS Z BR 160$ ;CONTINUE6[140$: ADD #2,RADD(R4) ;SKIP OVER NEXT RETURN ADDRESS \141$: MOV (SP)+,R1 ;RESTORE R1>] MOV CKSM2(R4),WORD1(R4) ;STORE OP CODE AND COMMAND MODIFIER^145$: JMP SMSG_;5`; SEND A MODIFIER BYTE OF ZERO FOR READS AND WRITESEa; &bCFOUB: CLRB @DBUF(R4) ;SEND MODIFIER)c160$: CALL CHKPT ;CHECKSUM CALCULATIONT d BR 145$.eCFIV: MOVB U.UNIT(R5),@DBUF(R4) ;SEND UNIT #f MOVB U.UNIT(R5),CKSM2(R4) g BR 145$*hCSIX: BITB #NTU58,FLGTYP(R4) ;OLD TU58 ?i BEQ 162$ ;YES=j MOVB #FLCTL,@DBUF(R4); SET FLOW CONTROL BIT IN SWITCH WORD 2k MOVB #FLCTL,CKSM2+1(R4); KEEP TRACK OF CHECKSUM l BR 160$ ;Wm162$: CLRB @DBUF(R4) ; SEND 0Nn CLRB CKSM2+1(R4)M o BR 160$pCSEV:D+qCEIG: CLRB @DBUF(R4) ;SEND TWO ZERO BYTESE r B00waë``t`TADATADATADATADATADATAR 145$3sCNIN: CALL IOPKT ;STORE I/O PACKET ADDRESS IN R1T%t ADD #I.PRM,R1 ;POINT TO PARAMETERS.u MOV (R1)+,U.BUF(R5) ;INSERT RELOCATION BIAS/v MOV (R1)+,U.BUF+2(R5) ;INSERT BUFFER ADDRESSI&w MOV (R1),CKSM2(R4) ;CREATE CHECKSUM+x MOVB (R1),@DBUF(R4) ;SEND LOW BYTE COUNTL y BR 141$z; {; NOTE: |;M@}; THE TU58 REQUIRES THAT THE NUMBER OF BYTES TO BE TRANSFERREDA~; BE EVEN AND THAT THE STARTING ADDRESS OF THE DATA TRANSFER BE; ON A WORD BOUNDARY.F€;; �CTWE: ;SEND HIGH BLOCK NO.8‚CTEN: MOVB CKSM2+1(R4),@DBUF(R4) ;SEND HIGH BYTE COUNT ƒ BR 160$0„CELE: CALL IOPKT ;STORE I/O PKT ADDRESS IN R12… MOVB I.PRM+12(R1),@DBUF(R4) ;SEND LOW BLOCK NO.† MOV I.PRM+12(R1),CKSM2(R4), ‡ BR 141$3ˆCTHI: MOVB CKSM1(R4),@DBUF(R4) ;SEND LOW CHECKSUM ‰ BR 145$6ŠCFOR: MOVB CKSM1+1(R4),@DBUF(R4) ;SEND HIGH CHECKSUM‹;E7Œ; AFTER THE COMMAND PACKET IS SENT THE TU58 RESPONDS.T4�; ITS RESPONSE DEPENDS ON THE OPERATION REQUESTED.8Ž; A CONTINUE IS SENT IN RESPONSE TO A WRITE, THE FIRST5�; DATA PACKET IS SENT IN RESPONSE TO A READ, AND ANT5�; END PACKET IS SENT IN RESPONSE TO A DIAGNOSTIC ORS8‘; POSITION COMMAND. ALSO AN END PACKET MAY BE RECEIVED3’; ON A FAILURE TO READ THE FIRST RECORD PROPERLY. “;C<”; DETERMINE THE APPROPRIATE INITIAL RESPONSE FROM THE TU58-•; AND RECEIVE THE FIRST BYTE FROM THE TU58.–;(— INCB FLAG+1(R4) ;SET FLAG FOR RECEIVE0˜ SUB #DDXBF-DDRBF,DBUF(R4) ;SET RECEIVE BUFFER,™ BR 25$ ;READ THE RESPONSE BYTE FROM TU580šCFIF: CALL IOPKT ;STORE I/O PKT ADDRESS IN R1-› CMPB #IO.DGN/256.,I.FCN+1(R1) ;DIAGNOSTIC?Kœ BEQ 170$ ;IF EQ YES �+ž JMP DPACK ;ELSE DATA PACKET OR CONTINUEN Ÿ170$: MOV (SP)+,R1 ;RESTORE R1%  BR ENDP ;DO END PACKET PROCESSINGR¡;¢; DETERMINE TU58 TYPE COMMANDT£;T:¤TYPTHR: MOV #TYPU58,CKSM2(R4); CREATE NEXT CHECKSUM WORD0¥ MOVB #TYPU58,@DBUF(R4); SEND TU58 TYPE OPCODE"¦ JMP 145$ ;PREPARE TO SEND BYTED§TYPSIX: MOVB #FLCTL,@DBUF(R4); SET FLOW CONTROL BIT IN SWITCH BYTE+¨ MOVB #FLCTL,CKSM2+1(R4); CREATE CHECKSUMS© JMP 160$ ; CREATE CHECKSUM;ªTYPSEV: CLRB @DBUF(R4) ; NOT IMPORTANT FOR COMMAND PACKETD#« JMP 145$ ; PREPARE TO SEND BYTE@¬TYPFIF: CMPB RDAT(R4),#END ;NEW TU58? (WILL RETURN END PACKET)­ BNE 200$ ;NO<® BIS #NTU58!CHKDON!TRNACK,FLGTYP(R4); SET FLAG TO NEW TU58¯ BR 206$ ; FLUSH END PACKET6°200$: CMPB RDAT(R4),#DATA ; DATA PACKET - OLD TU58 ?&± BEQ 204$ ; YES - FLUSH DATA PACKET² JMP NTRY ; RETRY;³204$: BIS #CHKDON,FLGTYP(R4); TU58 TYPE CHECK IS COMPLETE1.´ JMP NTRY1 ;FLUSH DATA PACKET BY DOING INIT>µ206$: ADD #DDXBF-DDRBF,DBUF(R4); POINT TO TRANSMITTER BUFFER¶ JMP SMSG ; SEND A CONTINUE6·TYPSXT: JMP RMSG ; FLUSH THE REST OF THE END PACKET@¸TYPSVT: ADD #DDXBF-DDRBF,DBUF(R4); POINT TO TRANSMITTER BUFFER#¹ JMP RINI1 ; NEW TU58 - USE MRSPº;0<»; RECEIVE AND MANIPULATE THE TU58'S END PACKET INFORMATION¼; :½ENDP: MOV #ETAB-2,RADD(R4) ;POINT TO END PACKET SEQUENCE+¾ CMPB RDAT(R4),#CNTL ;COMMAND/END PACKET? ¿ BR 24$HÀ;SCÁ; AT EONE WE SHOULD HAVE RECEIVED THE BYTE COUNT OF AN END PACKETD Â; WHICH IS ALWAYS EQUAL TO 10.Ã;M+ÄEONE: CMPB RDAT(R4),#10. ;BYTE COUNT=10.?Å24$: BEQ 25$ ;IF EQ YESÆ JMP NTRY ;Ç25$: JMP RMSG ;READ A BYTEF/ÈETWO: CMPB RDAT(R4),#100 ;OP CODE=END PACKET?J É BR 24$ 3ÊETHR: MOVB RDAT(R4),CKSM1(R4) ;STORE SUCCESS CODEEË MOVB RDAT(R4),WORD2(R4) ; Ì BR 25$ ;4ÍEFOU: MOVB RDAT(R4),WORD2+1(R4) ;STORE UNIT SELECTÎEFIV: ;DUMP BYTESÏESIX:NÐESEV: BR 25$BÑEEIG: MOVB RDAT(R4),CKSM2(R4) ;STORE BYTE TRANSFERRED COUNT -LOWÒ MOVB RDAT(R4),WORD3(R4) ; Ó BR 25$QEÔENIN: MOVB RDAT(R4),CKSM2+1(R4) ;STORE BYTE TRANSFERRED COUNT -HIGHBÕ MOVB RDAT(R4),WORD3+1(R4) ;ÖETEN::×EELE: ØETWE: BR 25$ ;DUMP BYTESRCØETHI: CALL @FORK ;ENSURE PRIORITY=0 AND REGISTERS SAVED ; GM001,/Ú MOV #IS.SUC&377,R0 ;ASSUME SUCCESS ;**-1WÛ TSTB CKSM1(R4) ;SUCCESSFUL?)Ü BGT ERRPT ;IF GT YES, BUT HAD RETRIESE&Ý BEQ ENDOP ;IF EQ, COMPLETE SUCCESS.Þ MOV #IE.DNR&377,R0 ;ASSUME DE00waå`“_c”_d–_k›’VICE NOT READY/ß CMPB CKSM1(R4),#-9. ;CARTRIDGE NOT IN PLACE?)à BEQ ERRPT ;IF EQ YES*á MOV #IE.WLK&377,R0 ;ASSUME WRITE-LOCKED&â CMPB CKSM1(R4),#-11. ;WRITE-LOCKED?ã BEQ ERRPT ;IF EQ YES.ä MOV #IE.FHE,R0 ;ASSUME FATAL HARDWARE ERROR'å CMPB CKSM1(R4),#-33. ;MOTOR STOPPED?Gæ BEQ ERRPT ;IF EQ YES1ç MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERRORT'èERRPT: CALL LOGERR ;LOG DEVICE ERROR é BR ENDOP ;ê;+ë; **-LOGERR-LOG DEVICE ERROR ì; **-LOGTMO-LOG DEVICE TIMEOUTí;Aî; Dï; ALLOCATE A CORE BLOCK, FILL IT WITH THE APPROPRIATE INFORMATION,Að; CALL THE EXECUTIVE ERROR LOGGING ROUTINE, DEALLOCATE THE CORE)ñ; BLOCK, AND RETURN BACK TO THE CALLER.Bò;R=ó; IF FOR ANY REASON THE CORE BLOCK CANNOT BE ALLOCATED THEN:ô; THE EXECUTIVE ERROR LOGGING ROUTINE WILL NOT BE CALLED=õ; AND THE ERROR SEQUENCE NUMBER WILL BE UPDATED TO INDICATER+ö; THAT A MISSED ERROR CONDITION OCCURRED.N÷;-(øLOGERR: MOV R0,-(SP) ;SAVE STATUS CODE2ø MOV DVERR,-(SP) ;TO LOG DEVICE ERROR ; GM001ú BR 70$ ; ;**-1T(ûLOGTMO: MOV R0,-(SP) ;SAVE STATUS CODE4û MOV DTOER,-(SP) ;TO LOG DEVICE TIMEOUT ; GM001;ý70$: MOV #DDNUM*2,R1 ;NUMBER OF BYTES TO ALLOCATE ;**-1 1ý CALL @ALOCB ;ALLOCATE A CORE BLOCK ; GM001D.ÿ BCC 80$ ;IF CC BLOCK WAS ALLOCATED ;**-16 TST (SP)+ ; POP CO-ROUTINE ADDRESS THAT WAS PUT ON: INC @ERRSQ ;INDICATE A MISSED ERROR CONDITION ; GM001$ BR 90$ ;END I/O ROUTINE ;**-1+80$: MOV R0,R1 ;COPY CORE BUFFER POINTERO( MOV DBUF(R4),R3 ;STORE BUFFER ADDRESS  TST -(R3) ;POINT TO DL11 CSR: MOV (R3)+,(R1)+ ;MOVE DL11 RECEIVE CSR INTO CORE BUFFER* MOV (R3)+,(R1)+ ;...DL11 RECEIVE BUFFER, MOV (R3)+,(R1)+ ;... DL11 TRANSMITTER CSR3  MOV WORD1(R4),(R1)+ ;OPCODE AND COMMAND MODIFIERI4  MOV WORD2(R4),(R1)+ ;SUCCESS CODE AND UNIT SELECT9  MOV WORD3(R4),(R1) ;BYTE COUNT LOW AND BYTE COUNT HIGHE$  MOV R4,R3 ;SAVE CONTROLLER INDEX$  MOV U.SCB(R5),R4 ;GET SCB ADDRESS+ MOV R0,R2 ;SET WITH CORE BUFFER POINTER+ CALL @(SP)+ ;CALL ERROR LOGGING ROUTINET* MOV R2,R0 ;RESTORE CORE BUFFER POINTER' MOV R3,R4 ;RESTORE CONTROLLER INDEXR5 MOV #DDNUM*2,R1 ;GET NUMBER OF BYTES TO DEALLOCATE31 CALL @DEACB ;DEALLOCATE CORE BLOCK ; GM001)490$: MOV (SP)+,R0 ;RESTORE I/O STATUS CODE ;**-1  RETURNCENDOP: CALL IOPKT- CMPB #IO.DGN/256.,I.FCN+1(R1) ;DIAGNOSTIC?C BNE 95$ ;IF NE NO3@ MOV I.PRM+14(R1),@KISR6 ;SET BUFFER RELOCATION BIAS ; GM001; MOV I.PRM+16(R1),R0 ;GET REGISTER BUFFER ADDRESS ;**-1C3 MOV DBUF(R4),R3 ;GET DL11 RECEIVE BUFFER ADDRESSR( TST -(R3) ;POINT TO REC. CSR ADDRESS7 MOV (R3)+,(R0)+ ;MOV REC. CSR CONTENTS TO USER BUFF. * MOV (R3)+,(R0)+ ;MOV REC. BUFF CONTENTS+  MOV (R3)+,(R0)+ ;MOV TRANS. CSR CONTENTSR,! MOV (R3)+,(R0)+ ;MOV TRANS. BUFF CONTENTS/" MOV CKSM1(R4),(R0) ;MOV TU58 END PACKET INFON2# MOV #IS.SUC&377,R0 ;STORE I/O COMPLETION STATUS $95$: TST (SP)+ ;RESTORE STACK%;T1&; COMMON EXIT CODE-ALL OPERATIONS COMPLETE HEREI';B9(IOCMP: MOV CKSM2(R4),R1 ;PICKUP BYTES TRANSFERRED COUNTE3)XIT: MOVB U.CW2+1(R5),R2 ;STORE FINAL RETRY COUNTD1* BIS #RTRY*^D<256>,R2 ;MERGE INTIAL RETRY COUNTU* CALL @IODON ; GM001;', JMP DDINI ;NEXT I/O PACKET ;**-1+ - .DSABL LSBR.;ED/; WE ENTER HERE WHEN AN UNEXPECTED AND UNDESIRED BYTE IS RECEIVED.A0; THE TU58 IS REINITIALIZED AND IF THE RETRY COUNT IS => 0, THEMC1; I/O FUNCTION IS STARTED OVER. OTHERWISE, AN ERROR IS LOGGED ANDI2; THE OPERATION IS ABORTED.H3; 4 .ENABL LSBM/5NTRY: DECB U.CW2+1(R5) ;DECREMENT RETRY COUNT?6NTRY1: ADD #DDXBF-DDRBF,DBUF(R4); POINT TO TRANSMITTER BUFFERY7;5=8; TINIT TRIES TO REINITIALIZE THE TU58. IT WILL ATTEMPT THE;<9; INITIALIZATION ROUTINE OF SENDING BREAK, CLEARING BREAK,1:; SENDING TWO INIT'S, AND RECEIVING A CONTINUE.R;;TC<TINIT: CLR FLAG(R4) ;SET FOR TRANSMIT WITH NO USER DATA TRANSFERI2= MOV #ITAB-2,RADD(R4) ;POINT TO INITIALIZE TABLE> BR 50$ ;WAIT?;E=@; NULL TIMING CHARACTERS ARE SENT AT IONE AND ITWO TO ALLOW@00waë``t`TADATADATADATADATADATAA; ENOUGH TIME FOR THE BREAK BIT TO CAUSE A FRAMING ERROR. THIS5B; SIGNALS THE TU58 TO STOP TRANSMITTING AND LISTEN.C;I2DIONE: MOV DBUF(R4),CKSM1(R4) ;TEMP. STORE BUFFER,E SUB #DDXBF-DDXCS,CKSM1(R4) ;POINT TO XCSR*F BIS #BRK,@CKSM1(R4) ;SEND BREAK TO TU58GITWOA: ;SEND TIMING NULLSHITWOB:IITWOC:JITWOD:*KITWOE: CLRB @DBUF(R4) ;SEND ANOTHER NULLL50$: JMP SMSG ;WAITM;T:N; ITHR AND IFOU WILL CLEAR THE BREAK CONDITION AND ISSUE>O; TWO INITIALIZE COMMANDS TO THE TU58. (THE FIRST IS IGNOREDP; BY THE CONTROLLER).EQ;A(RITHR: BIC #BRK,@CKSM1(R4) ;CLEAR BREAK7S SUB #DDXCS-DDRBF,CKSM1(R4) ;TEMP. STORE REC. BUFFER)%T TSTB @CKSM1(R4) ;DUMP REC. BUFFER#0UIFOU: MOVB #INIT,@DBUF(R4) ;SEND ANOTHER INIT.V BR 50$ ;WAITW;T<X; A CHARACTER IS RECEIVED AT ISIX. IF IT IS A CONTINUE, WE-Y; HAVE SUCCESSFULLY INITIALIZED THE DEVICE.UZ;6[IFIV: SUB #DDXBF-DDRBF,DBUF(R4) ;POINT TO REC. BUFF.(\ INCB FLAG+1(R4) ;SET FLAG FOR RECEIVE9] BISB #TU58C,FLGTYP(R4) ; TU58 MUST SEND A CONTINUE NOWY^ JMP RMSG ;WAIT0_ISIX: ADD #DDXBF-DDRBF,DBUF(R4) ;POINT TO XBUFC` BICB #TU58C,FLGTYP(R4) ; TU58 CONTINUE ALREADY SENT - CLEAR FLAG1a TSTB U.CW2+1(R5) ;RETRY?Fb BGT 60$ ;IF GT YES>b CALL @FORK ;ENSURE PRIORITY=0 AND REGISTERS SAVED ; GM001,d MOV #IE.FHE&377,R0 ;FATAL ERROR ;**-1+e CLR CKSM2(R4) ;CLEAR BYTE TRANSFER COUNT%f MOV #200,CKSM1(R4) ;SET ERROR CODE 2g SUB #DDXBF-DDRBF,DBUF(R4) ;POINT TO REC. BUFFER!h JMP ERRPT ;ERROR LOG AND EXIT4)i60$: BITB #NTU58,FLGTYP(R4); NEW TU58 ?Rj BNE 62$ ;YES7k BITB #CHKDON,FLGTYP(R4); COMPLETED TU58 TYPE CHECK ?C&l BNE 62$ ;YES - IT MUST BE OLD TU58)m JMP RINI ;DETERMINE TU58 TYPE - RETRYF.n62$: JMP RINI1 ;SEND COMMAND PACKET - RETRYo;R>p; HERE DATA PACKETS SENT BY THE TU58 ARE READ. THE NUMBER OF>q; DATA BYTES IN THE PACKET IS RECEIVED AT RONE. IT IS STORED>r; IN LOCATION FLAG AND THE CHECKSUM IS INITIALIZED. THE DATA=s; IS TRANSFERRED WITHIN THE INTERRUPT SERVICE ROUTINE WHERE=t; THE CHECKSUM IS ALSO VERIFIED. THE FIRST BYTE OF THE NEXT=u; PACKET IS RECEIVED AT RFOU AND IF IT IS A DATA FLAG, THIS6v; CODE IS ENTERED AGAIN.w;-xDPACK: CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ?:$y BNE 102$ ;IF NE NO -IT'S A WRITEz MOV (SP)+,R1 ;RESTORE R1T){RFOU: CMPB RDAT(R4),#DATA ;DATA PACKET?| BEQ 96$ ;IF EQ YES}94$: JMP ENDPA+~96$: MOVB #DATA,CKSM1(R4) ;START CHECKSUMD, MOV #RTAB-2,RADD(R4) ;POINT TO READ TABLE€ BR 100$ ;READ A BYTE0�RONE: MOVB RDAT(R4),FLAG(R4) ;STORE BYTE COUNT?‚ MOVB RDAT(R4),CKSM1+1(R4) ;STORE HIGH BYTE OF FIRST CHECKSUMVƒ100$: JMP RMSG„; 4…; AT THIS POINT WE SEND A DATA PACKET TO THE TU58.:†; THE DATA FLAG BYTE IS SENT AT TONE. THE NUMBER OF DATA6‡; BYTES IN THIS PACKET IS SENT AT TTWO. DATA IS THEN<ˆ; TRANSFERRED ALONG WITH THE CHECKSUM WITHIN THE INTERRUPT;‰; SERVICE ROUTINE. RETURN TO THIS SEGMENT IS MADE AT TFIVE8Š; AND THE FIRST BYTE OF THE NEXT PACKET IS RECEIVED AT5‹; TSIX, IF IT IS A CONTINUE ANOTHER PACKET IS SENT.T8Œ; WHEN THE TU-58 HAS RECEIVED ALL THE DATA IT SENDS AN;�; END PACKET FLAG INSTEAD OF A CONTINUE (THIS ALSO OCCURSO6Ž; IF THE TU58 ENCOUNTERS AN ERROR WRITING THE DATA).�;E6�102$: MOV I.PRM+4(R1),WCNT(R4) ;DUPLICATE BYTE COUNT‘ MOV (SP)+,R1 ;RESTORE R1IH’TSIX: BICB #TU58C,FLGTYP(R4) ; TU58 ALREADY SENT CONTINUE - CLEAR FLAG(“ CMPB RDAT(R4),#CONT ; CONTINUE FLAG ?” BNE 94$ ;IF NE NO 8• MOV #TTAB-2,RADD(R4) ;POINT TO TRANSMIT (WRITE) TABLE%– CLRB FLAG+1(R4) ;SET TRANSMIT FLAG 1— ADD #DDXBF-DDRBF,DBUF(R4) ;SET TRANSMIT BUFFERA'˜ BR 130$ ;PREPARE TO SEND FIRST BYTE ,™TONE: MOVB #DATA,@DBUF(R4) ;SEND FLAG BYTE'š MOVB #DATA,CKSM1(R4) ;START CHECKSUM./› CMP #128.,WCNT(R4) ;MORE THAN 1 PACKET LEFT?Tœ BLO 120$ ;IF L0 YES+?�125$: MOVB WCNT(R4),CKSM1+1(R4) ;CREATE HIGH BYTE OF CHECKSUME+ž CLRB WCNT(R4) ;ZERO REMAINING BYTE COUNTO Ÿ BR 130$< 120$: MOVB #128.,CKSM1+1(R4) ;CREATE HIGH BYTE OF CHECKSUM.¡ SUB #128.,WCNT(R4) ;ADJUST REMAINING COUNT¢130$: JMP SMSG3£TTWO: 00w aå`“_c”_d–_k›’MOVB CKSM1+1(R4),@DBUF(R4) ;SEND BYTE COUNTA4¤ MOVB CKSM1+1(R4),FLAG(R4) ;SET UP FLAG BYTE COUNT ¥ BR 130$)¦TFIV: INCB FLAG+1(R4) ;SET RECEIVE BYTE(0§ SUB #DDXBF-DDRBF,DBUF(R4) ;SET RECEIVE BUFFER?¨ BISB #TU58C,FLGTYP(R4) ;TU58 CAN SEND CONTINUE FOR MORE DATA(© BR 100$ ;READ A BYTE ª .DSABL LSBK«;'¬; IOPKT PUTS I/O PACKET ADDRESS IN R1N­; ®; OUTPUT:2¯;O°; R1 = I/O PACKET ADDRESSH=±; (SP) = FORMER CONTENTS OF R1 TO BE RESTORED BY THE CALLERC²;0³IOPKT: MOV (SP)+,WCNT(R4) ;SAVE RETURN ADDRESS´ MOV R1,-(SP) ;PRESERVE R1µ MOV R4,-(SP) ;PRESERVE R4$¶ MOV U.SCB(R5),R4 ;GET SCB ADDRESS(· MOV S.PKT(R4),R1 ;GET I/O PKT ADDRESS¸ MOV (SP)+,R4 ;RESTORE R4E5¹ JMP @WCNT(R4) ;NOTE R1 WILL BE RESTORED BY PROGRAMNº; @»; RTBK (RETURN BACK) INCREMENTS THE RETURN ADDRESS POINTER AND¼; THEN JUMPS THERE. ½;S/¾RTBK: ADD #2,RADD(R4) ;POINT TO NEXT LOCATIONP?¿ MOV @RADD(R4),-(SP) ;MOVE RETURN ADDRESS LOCATION ONTO STACKY*À JMP @(SP)+ ;RETURN TO ADDRESS IN TABLEÁ;S;Â; THIS ROUTINE IS JUMPED TO IN ORDER TO SEND INFORMATION.(@Ã; THE MAIN PROGRAM CONTINUES VIA THE INTERRUPT SERVICE ROUTINEBÄ; CODE (SPT), UNLESS WRITE DATA IS TO BE TRANSFERRED (DATA COUNTÅ; FLAG = NON-ZERO).LÆ;E Ç .ENABL LSBA/ÈSMSG: SUB #DDXBF-DDXCS,DBUF(R4) ;POINT TO CSRE,É BIT #TRDY,@DBUF(R4) ;IS TRANSMITTER READY Ê BEQ 20$2ËSREC: ADD #DDXBF-DDXCS,DBUF(R4) ;POINT TO BUFFER%Ì BITB #NTU58,FLGTYP(R4); NEW TU58 ? Í BEQ 16$ ;NOC9Î BITB #TRNACK,FLGTYP(R4) ; ACK CHAR FOR NEW TU58 MRSP ?HÏ BEQ 16$ ; NO2Ð MOVB #CONT,@DBUF(R4) ;MUST BE READING FROM TU58+Ñ ;ACK TU58 THAT CHAR HAS BEEN RECEIVEDU5Ò BICB #TRNACK,FLGTYP(R4); COMPLETED THE ACKNOWLEDGEE(Ó JMP RPT1 ;PROCESS THE CHAR JUST READÔ16$:Õ TSTB FLAG(R4) ;BYTE COUNT 0Ö BEQ RTBK ;IF EQ YES $× JMP SPT ;GO TO SEND DATA ROUTINE0Ø20$: BIS #S2.ACT,S.ST2(R4) ;SET I/O ACTIVE BIT/Ù BIS #TIE,@DBUF(R4) ;SET TRANS. INTER. ENABLE(&Ú MOV U.SCB(R5),R4 ;STORE SCB ADDRESS(Û MOVB S.ITM(R4),S.CTM(R4) ;SET TIMEOUT Ü RETURNH Ý .DSABL LSB Þ;Aß; THIS ROUTINE IS JUMPED TO IN ORDER TO RECEIVE INFORMATION VIAH@à; THE DL11. IF RECEIVER DONE IS SET, THEN A RETURN TO THE MAINAá; PROGRAM IS INITIATED VIA THE INTERRUPT SERVICE ROUTINE (RPT).?â; IF THE DL11 DONE BIT IS CLEAR, A RETURN IS EXECUTED AND THES@ã; INTERRUPT SERVICE ROUTINE WILL RETURN CONTROL TO THE PROGRAM<ä; WHEN THE DONE BIT IS SET AND WHEN ALL READ DATA HAS BEEN%å; TRANSFERRED TO THE USER'S BUFFER.Sæ;M ç .ENABL LSB./èRMSG: SUB #DDRBF-DDRCS,DBUF(R4) ;POINT TO CSR$é BIT #RDONE,@DBUF(R4) ;BYTE READY?ê BEQ 20$ ;IF EQ NOM+ëRREC: JMP RPT ;IF YES ENTER READ ROUTINE ì20$: BIS #S2.ACT,S.ST2(R4) ;0í BIS #RIE,@DBUF(R4) ;SET REC. INTERRUPT ENABLE(î MOV U.SCB(R5),R4 ;RESTORE SCB ADDRESS#ï MOVB #40.,S.CTM(R4) ;SET TIMEOUTH ð RETURNE ñ .DSABL LSBOò; ó; CHKPT CREATES A CHECKSUMô; õ; INPUT:ö; ÷; CKSM2(R4) = WORD TO BE ADDEDø; CKSM1(R4) = OLD CHECKSUMù;E ú; OUTPUT:û;ü; CKSM1(R4) = NEW CHECKSUMý;D/þCHKPT: ADD CKSM2(R4),CKSM1(R4) ;ADD TWO WORDS(ÿ ADC CKSM1(R4) ;ADD CARRY  ;FALL THROUGH TO RETURNF;E; END LOCAL ROUTINES;S;+ ; DDCAN-CANCEL I/O ENTRY POINT4; CANCEL I/O IS A NOP FOR FILE STRUCTURED DEVICES.;-DDCAN: RETURN ;GM001 ;GM001;+ ;GM0019; **-DDKRB-CONTROLLER ONLINE/OFFLINE ROUTINE ;GM001; ;GM001 2DDKRB: BCS 20$ ;IF CS OFFLINE REQUEST ;GM001) TST EXEVEC ;IF DONE ALREADY ;GM001H! BNE 20$ ;SKIP THIS ;GM001)# MOV R2,-(SP) ;SAVE R2 ;GM001S# MOV R3,-(SP) ;SAVE R3 ;GM001G+ MOV KINAR6,-(SP) ;SAVE KINAR6 ;GM0018 MOV @#112,R0 ;GET ADDRESS OF TABLE OF ENTRIES ;GM001C MOV (R0),R0 ;GET ADDRESS OF APR BIAS (1ST WORD IN TABLE) ;GM001 ; MOV (R0),KINAR6 ;MAP COMMON THROUGH I-SPACE APR6 ;GM001B, MOV #EXEVEC,R3 ;POINT TO VECTOR ;GM0014 MOV #EXEVCL,R2 ;SPECIFY LENGTH OF VECTOR ;GM0010 CALL @#140004 ;TRANSLATE THE VECTOR ;GM001. MOV (SP)+,KINAR6 00w(aë``t`TADATADATADATADATADATA;RESTORE KINAR6 ;GM001& MOV (SP)+,R3 ;RESTORE R3 ;GM001& MOV (SP)+,R2 ;RESTORE R2 ;GM00120$: RETURN ;GM001 ;GM001  ;**-1D ;+5 ; POWERFAIL REQUIRES NO OPERATION. REINITIALIZATIONS? ; OF THE TU58 WILL OCCUR DURING NORMAL OPERATION IF REQUIRED.  ;-DDPWF: RETURNA ; GM001#;+ ; GM001T5; **-DDUCB-UNIT ONLINE/OFFLINE ROUTINE ; GM001O;- ; GM0014DDUCB: RETURN ; GM0010 ; GM001R;+ ;**-1 ,; **-$DDINT TU58 INTERRUPT SERVICE ROUTINE;M); INTERRUPTS ARE ISSUED WHEN EITHER THER'; RECEIVE OR TRANSMIT CSR'S INTERRUPT%; ENABLE IS SET BY ROUTINES RMSG OR &; SMSG. THEY INDICATE THAT THE DL-11&; HAS RECEIVED A BYTE OF INFORMATION'; OR CAN ACCEPT A BYTE OF INFORMATION:; FOR TRANSMITTING. ;-  .ENABL LSB $DDOUT:: ;;;2 INT. ENTRY PTS8 INTSE$ DD,PR4,T$$U58 ;;;SAVE REGISTERS & SET PRIORITY/ BIC #,@DBUF(R4) ;;;CLEAR INTERRUPTS0 MOV R1,-(SP) ;;;SAVE R1&  MOV U.SCB(R5),R1 ;;;GET SCB ADDRESS"! CLRB S.CTM(R1) ;;;CLEAR TIMEOUT" MOV (SP)+,R1 ;;;RESTORE R1R#;S:$; FLAG+1 IS SET FOR A TRANSMIT OPERATION AND CLEARED FOR;%; A RECEIVE OPERATION. FLAG IS CHECKED TO DETERMINE IF WEB&; HAVE DATA TO TRANSFER.';C(( TSTB FLAG+1(R4) ;;;RECEIVE INTERRUPT?) BEQ 3$ ;IF EQUAL NO =* BIT #TRNACK,FLGTYP(R4); IN PROCESS OF ACKNOWLEDGING CHAR ? ++ BEQ RPT ;NO -- JUST A RECEIVE INTERRUPTE6, ADD #DDXBF-DDXCS,DBUF(R4); POINT TO TRANSMIT BUFFER3- MOVB #CONT,@DBUF(R4) ;ACK THE CHAR THAT WAS READC5. BICB #TRNACK,FLGTYP(R4); COMPLETED THE ACKNOWLEDGEO2/ JMP RPT1 ; CONTINUE WITH THE RECEIVE INTERRUPT03$:D/1 ADD #DDXBF-DDXCS,DBUF(R4) ;;;POINT TO BUFFERE)2 TSTB FLAG(R4) ;;;TRANSMIT DATA PACKET?T3 BNE SPT ;;;IF NE YES45$: JMP RTBK ;;;ELSE RETURN5;QA6; SPT IS THE CODE USED TO SEND USER DATA TO THE TU58. A RUNNINGL@7; CHECKSUM IS KEPT AND IS SENT AS THE LAST TWO CHARACTERS OF AB8; DATA PACKET (TTHR,TFOU). AFTER ALL DATA HAS BEEN SENT, CONTROL"9; IS PASSED TO THE MAIN PROGRAM.:;B=:SPT: CALL @GTBYT ;;;PUT USER'S DATA BYTE ON STACK ; GM001 << BITB #1,FLAG(R4) ;;;CHECK FOR EVEN OR ODD BYTE NO. ;**-1-= BNE 20$ ;;;IF NE ODD,THEREFORE HIGH ORDERG> ;;;BYTE IN CHECKSUMT7? MOVB (SP)+,CKSM2(R4) ;;;SAVE LOW ORDER CHECKSUM BYTEU,@ MOVB CKSM2(R4),@DBUF(R4) ;;;TRANSMIT BYTE A BR 30$H>B20$: MOVB (SP)+,CKSM2+1(R4) ;;;SAVE HIGH ORDER CHECKSUM BYTE.C MOVB CKSM2+1(R4),@DBUF(R4) ;;;TRANSMIT BYTE#D CALL CHKPT ;;;GENERATE CHECKSUMR,E30$: DECB FLAG(R4) ;;;DECREMENT DATA COUNTF35$: JMP SMSGT@GTTHR: MOVB CKSM1(R4),@DBUF(R4) ;;;SEND LOW ORDER CHECKSUM BYTE H BR 35$R:ITFOU: MOVB CKSM1+1(R4),@DBUF(R4) ;;;SEND HIGH ORDER BYTE J BR 35$R+KTFOUA: BITB #NTU58,FLGTYP(R4); NEW TU58 ?)L BNE 39$ ; YES 3M38$: JMP RTBK ; NO - CONTINUE NOT NEEDED FOR RSP JN39$: MOVB #CONT,@DBUF(R4) ; SEND CONTINUE AFTER TRANSMITTING DATA PACKET O BR 35$ ;P;;Q; RPT CHECKS FOR AN ERROR CONDITION IN THE DL11'S RECEIVE;<R; BUFFER. IF DATA IS TO BE RECEIVED THIS ROUTINE TRANSFERS:S; THE CHARACTER IN THE USER'S BUFFER AND KEEPS A RUNNING=T; CHECKSUM. AFTER ALL DATA IS RECEIVED, THE FINAL TWO BYTESR@U; OF THE PACKET ARE PRESENT AT RTWO AND RTHR AND IF THEY EQUAL?V; THE CHECKSUM, THEN CONTROL IS RETURNED TO THE MAIN PROGRAM. W; 3XRPT: ADD #DDRBF-DDRCS,DBUF(R4) ;;;POINT TO BUFFERU1Y MOV @DBUF(R4),RDAT(R4) ;;;STORE RECEIVED INFO.TZ BPL 80$ ;;;IF PL NO ERRORH![40$: JMP NTRY ;;;ATTEMPT RETRYD)\80$: BITB #NTU58,FLGTYP(R4); NEW TU58 ?E4] BEQ RPT2 ;NO-DO NOT HAVE TO ACKNOWLEDGE THE DATAB^ BITB #TU58C,FLGTYP(R4) ; DATA COULD BE A CONTINUE IF FLAG SET ?_ BEQ 82$ ; NO - MUST ACK IT,` CMPB RDAT(R4),#CONT ; IS DATA A CONTINE ?7a BEQ RPT2 ; YES - THE CONTINUE IS FROM TU58 - NO ACK 8b82$: BIS #TRNACK,FLGTYP(R4); YES - MUST ACKNOWLEDGE IT6c ADD #DDXBF-DDRBF,DBUF(R4); POINT TO TRANSMIT BUFFER1d JMP SMSG ;NEW TU58-ACKNOWLEDGE CHAR JUST READN:eRPT1: SUB #DDXBF-DDRBF,DBUF(R4); POINT TO 00w0ax4a“_c”_d–_k›’RECEIVE BUFFER(fRPT2: TSTB FLAG(R4) ;;;DATA TO RECEIVEg BEQ 5$ ;;;IF EQ NO+h MOVB RDAT(R4),-(SP) ;;;PUT DATA ON STACK 8h CALL @PTBYT ;;;PUT DATA INTO USER'S BUFFER ; GM001=j BITB #1,FLAG(R4) ;;;ODD OR EVEN BYTE (FOR CHECKSUM) ;**-1B3k BNE 90$ ;;;IF NE ODD (HIGH ORDER CHECKSUM BYTE)5l MOVB RDAT(R4),CKSM2(R4) ;;;LOW ORDER CHECKSUM BYTET m BR 100$<n90$: MOVB RDAT(R4),CKSM2+1(R4) ;;;HIGH ORDER CHECKSUM BYTE o CALL CHKPTD-p100$: DECB FLAG(R4) ;;;DECREMENT DATA COUNTU q BR 160$=rRTWO: MOVB RDAT(R4),CKSM2(R4) ;;;RECEIVE LOW ORDER CHECKSUM s BR 160$7tRTHR: MOVB RDAT(R4),CKSM2+1(R4) ;;;RECEIVE HIGH ORDER4u CMP CKSM1(R4),CKSM2(R4) ;;;ARE CHECKSUMS CORRECT? v BNE 40$3w160$: JMP RMSG ;;;READ FIRST BYTE OF NEXT PACKET x .DSABL LSBIy;+<z; TIMEOUT IS ENTERED WHEN THE DL11 DOES NOT RESPOND WITHIN;{; A CERTAIN PRESET TIME TO THE SUBROUTINES SMSG AND RMSGS7|; SETTING INTERRUPT ENABLE AND ISSUING A RETURN. THIS05}; INDICATES A HARDWARE FAILURE OF THE DL11 OR TU58.~;-DDOUT:5€ BIC #,@DBUF(R3) ;;;CLEAR INTERRUPT ENABLE6$� MOV R3,R4 ;COPY CONTROLLER INDEX&‚ TSTB FLAG+1(R4) ; RECEIVE TIMEOUT ?ƒ BNE 2$ ; YES8„1$: SUB #DDXBF-DDXCS,DBUF(R4); POINT TO RECEIVE BUFFER … BR 6$ ; 5†2$: BIT #TRNACK,FLGTYP(R4);IN PROCESS OF ACK CHAR ?R(‡ BEQ 4$ ; NO - JUST A RECEIVE TIMEOUT2ˆ BIC #TRNACK,FLGTYP(R4);CLEAR MUST ACK CHAR FLAG ‰ BR 1$ ; 8Š4$: ADD #DDRBF-DDRCS,DBUF(R4); POINT TO RECEIVE BUFFER&‹6$: CALL LOGTMO ; LOG TIMEOUT ERROR%Œ MOV R4,R3 ; COPY CONTROLLER INDEXE9� ADD #DDXBF-DDRBF,DBUF(R4); POINT TO TRANSMITTER BUFFERC*Ž DECB U.CW2+1(R5) ;DECREMENT RETRY COUNT#� BLE 10$ ;IF LE, NO RETRIES LEFT � JMP TINIT ;RE-INIT AND RETRY2‘10$: CLR CKSM2(R3) ;CLEAR BYTE TRANSFERRED COUNT$’ MOV #IE.TMO&377,R0 ;TIMEOUT ERROR “ JMP ENDOP”•– .ENDIVE TIMEOUT2ˆ BIC #TRNACK,FLGTYP(R4);CLEAR MUST ACK CHAR FLAG ‰ BR 1$ ; 8Š4$: ADD #DDRBF-DDRCS,DBUF(R4); POINT TO RECEIVE BUFFER&‹6$: CALL LOGTMO ; LOG TIMEOUT ERROR%Œ MOV R4, .TITLE DLDRV  .IDENT /07.01/ o;2P; COPYRIGHT (C) 1982, 1983, 1984, 1985, 1986 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;. ; P. J. BEZEREDI ; R. T. PERRON ; P. J. CARR ; D. R. DONCHINR ; J. GALLANT;s; MODIFIED BY:; ; G. MARIGOWDA 18-NOV-85;=; GM101 FIX ERROR RECOVERY, WAIT FOR DRIVE SANE 85P V07.00.; ; GM102 EXEC VECTORING V07.01;;O; RL11/RL01 DISK DRIVER4 ;5!;6*!.MCALL HWDDF$,PKTDF$,QIOSY$ ;GM102.# HWDDF$ ;DEFINE HARDWARE REGISTERS ;**-1&$ PKTDF$ ;DEFINE I/O PACKET OFFSETS$ QIOSY$ ;GM102$; ;GM102 &; EQUATED SYMBOLS ;**-1';E.(RETRY= ^D<8> ;CONTROLLER ERROR RETRY COUNT5)RLCNT= ^D<7> ;NUMBER OF REGISTERS TO LOG ON ERROR,*RLBPT= ^D<512*20> ;BYTES PER RL01 SURFACE++RLSPU= ^D<15> ;TIME FOR RL01 TO SPIN UP7,; -; RL11 DEVICE REGISTER OFFSETS.;$/RLCS= 0 ;CONTROL STATUS REGISTER!0RLBA= 2 ;BUS ADDRESS REGISTER$"1RLDA= 4 ;DISK ADDRESS REGISTER#2RLMP= 6 ;MULTI-PURPOSE REGISTERP-3RLBAE= 10 ;BUS ADDRESS EXTENSION REGISTER 4; 5; RLCS BIT ASSIGNMENTS6; 7ERR= 100000 ;COMPOSITE ERROR8DE= 040000 ;DRIVE ERRORL$9NXM= 020000 ;NON-EXISTANT MEMORY:DLT= 010000 ;DATA LATE!;HNF= 010000 ;HEADER NOT FOUNDY!<DCK= 004000 ;DATA CHECK ERROR5"=HCRC= 004000 ;HEADER CRC ERROR%>OPI= 002000 ;OPERATION INCOMPLETE(?A17= 000040 ;EXTENDED ADDRESS BIT 17(@A16= 000020 ;EXTENDED ADDRESS BIT 16ADS0= 000400 ;DRIVE SELECT 0PBDS1= 001000 ;DRIVE SELECT 1CDRDY= 1 ;DRIVE READY!DWCHK= 2 ;WRITE CHECK FUNCTIONBEWRITE= 2 ;WRITE OFFSET&FGSTS= 4 ;GET DRIVE STATUS FUNCTIONGSEEK= 6 ;SEEK FUNCTION"HRDH= 10 ;READ HEADERS FUNCTION IREAD= 14 ;READ DATA FUNCTIONJIE= 100 ;INTERRUPT ENABLE4KCRDY= 200 ;CONTROLLER READY L;0M; RLDA S00x8aë``t`TADATADATADATADATADATATATUS CODESN;0OMRK= 1 ;MARKER BITPSTS= 2 ;GET STATUS BITQSN= 4 ;SIGN BIT FOR SEEKRRST= 10 ;DRIVE RESET BIT*SHS= 20 ;HEAD SELECT BIT FOR DIFFERENCE.TREV= 200!MRK ;REVERSE SEEK DIFFERENCE WORDU;#V; RLMP GET STATUS BIT ASSIGNMENTSW;=!XWDE= 100000 ;WRITE DATA ERRORT#YCHE= 040000 ;CURRENT HEAD ERRORS"ZWLS= 020000 ;WRITE LOCK STATUS$[SKTO= 010000 ;SEEK TIMEOUT ERROR\SPD= 004000 ;SPEED ERROR!]WGE= 002000 ;WRITE GATE ERRORE^VC= 001000 ;VOLUME CHECK#_DSE= 000400 ;DRIVE SELECT ERRORT`DT= 000200 ;DRIVE TYPE#aHSS= 000100 ;HEAD SELECT STATUS=bCO= 000040 ;COVER OPENcHH= 000020 ;HEADS HOMEdBH= 000010 ;BRUSHES HOME0eSLM= 000005 ;DRIVE IN SEEK-LINEAR MODE STATEf; g; DRIVE STATUS FLAGSh;='iRVSK= 200 ;REVERSE SEEK IN PROGRESS02jSDWN= 100 ;DRIVE ERROR SETTLE DOWN IN PROGRESSkl;m; LOCAL DATAn;K!o; CONTROLLER IMPURE DATA TABLESE.p; THESE ARE INDEXED BY THE CONTROLLER NUMBERq;09rRTTBL: .BLKW R$$L11 ;RETRY COUNT FOR CURRENT OPERATION<sPRMSV: .BLKW R$$L11*6 ;PARAMETER SAVE AREA FOR WRITE CHECKsVC$DL = 0 ;GM102s; ;GM102E1s; EXECUTIVE ENTRY POINT VECTOR TABLE ;GM1020s; ;GM102Ns ;GM102;sEXEVEC: .WORD 0 ; FLAG FOR VECTOR NOT YET FILLED ;GM102Ns ;GM102#sALOCB: .WORD $ALOCB ;GM102G#sBLKC2: .WORD $BLKC2 ;GM102#sBMSET: .WORD $BMSET ;GM102#sCVLBN: .WORD $CVLBN ;GM102 #sDEACB: .WORD $DEACB ;GM102;#sDTOER: .WORD $DTOER ;GM102#sDVERR: .WORD $DVERR ;GM102 #sERRSQ: .WORD $ERRSQ ;GM102 !sFORK: .WORD $FORK ;GM102#sFMASK: .WORD $FMASK ;GM102 #sGTPKT: .WORD $GTPKT ;GM102 #sIODON: .WORD $IODON ;GM102L#sMPUBM: .WORD $MPUBM ;GM102N!sRLCN: .WORD $RLCN ;GM102D#sRQCND: .WORD $RQCND ;GM102D#sSTMAP: .WORD $STMAP ;GM102D#sSGFIN: .WORD $SGFIN ;GM102D#sVOLVD: .WORD $VOLVD ;GM102Ds; ;GM102;#sKISR6: .WORD KISAR6 ;GM102s; ;GM102R!sSCTM: .WORD S.CTM ;GM102R!sSITM: .WORD S.ITM ;GM102F!sSKRB: .WORD S.KRB ;GM102$!sSOWN: .WORD S.OWN ;GM102D!sSPKT: .WORD S.PKT ;GM102O!sSSTS: .WORD S.STS ;GM102.!sSST2: .WORD S.ST2 ;GM102 s; ;GM102M(sEXEVCL=<<<.-EXEVEC>/2>-1> ;GM102s; ;GM102AsS.VCTM = -1 ;GM102sS.VITM = -1 ;GM102sS.VKRB = -1 ;GM102sS.COWN = -1 ;GM102sS.VPKT = -1 ;GM102sS.VSTS = -1 ;GM102sS.VST2 = -1 ;GM102s; ;GM102 *s; SCB REFERENCE PATCH TABLE ;GM102s; ;GM102 s ;GM102&sSCBPAT: .WORD CTM1,SCTM ;GM102s .WORD CTM2,SCTM ;GM102s .WORD CTM3,SCTM ;GM102s .WORD CTM4,SCTM ;GM102<s .WORD ITM1,SITM ;GM102 s .WORD ITM2,SITM ;GM102 s .WORD ITM3,SITM ;GM102 s .WORD RKRB1,SKRB ;GM102s .WORD KRB1,SKRB ;GM1022s .WORD KRB2,SKRB ;GM102s .WORD KRB3,SKRB ;GM102Ss .WORD KRB4,SKRB ;GM102 s .WORD KRB5,SKRB ;GM102Ts .WORD KRB6,SKRB ;GM102 s .WORD KRB7,SKRB ;GM102 s .WORD KRB10,SKRB ;GM102 s .WORD KRB11,SKRB ;GM102 s .WORD KRB12,SKRB ;GM102 s .WORD KRB13,SKRB ;GM102 s .WORD KRB14,SKRB ;GM102s .WORD PKT1,SPKT ;GM1020s .WORD PKT2,SPKT ;GM1020s .WORD PKT3,SPKT ;GM1021s .WORD PKT4,SPKT ;GM1020s .WORD PKT5,SPKT ;GM1020s .WORD PKT6,SPKT ;GM1020s .WORD PKT7,SPKT ;GM1020s .WORD STS1,SSTS ;GM1020s .WORD STS2,SSTS ;GM1020s .WORD STS3,SSTS ;GM1020s .WORD STS4,SSTS ;GM1021 s .WORD RST21,SST2 ;GM102.s .WORD 0 ;END OF THE TABLE ;GM102s; ;GM1022u; ;**-1v;DRIVER DISPATCH TABLEw;P7x DDT$ DL,R$$L11,NEW=Y,OPT=Y ;GENERATE DISPATCH TABLEOyz;+0{; **-DLINI-RL11/RL01 DISK CONTRO00x@a4a“_c”_d–_k›’LLER INITIATOR|;.D}; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/OC~; REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TODG; PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED CONTROLLER,I€; IS NOT BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST.ND�; ELSE A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPTF‚; IS SUCCESSFUL, THEN THE NEXT I/O OPERATION IS INITIATED. A RETURN#ƒ; TO THE CALLER IS THEN EXECUTED.I„;/ …; INPUTS:T:†; R5= ADRS OF THE UCB OF THE CONTROLLER TO BE INITIATED.‡;E ˆ; OUTPUTS:A‰; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST ISOAŠ; WAITING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THES/‹; DRIVER INITIATES THE REQUESTED I/O FUNCTIONTŒ;-9�DLINI: GTPKT$ DL,R$$L11 ;GET NEXT I/O PACKET TO PROCESS Ž;E3�; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:S�;S&‘; R1= ADRS OF THE I/O REQUEST PACKET3’; R2= PHYSICAL UNIT NUMBER OF THE REQUESTED DRIVEI“; R3= CONTROLLER INDEX.”; R4= ADRS OF THE STATUS CONTROL BLOCK (SCB)4•; R5= ADRS OF THE UCB OF THE DRIVE TO BE INITIATED–; 8—; RL11/RL01 DISK CONTROLLER I/O REQUEST PACKET FORMAT:˜;,#™; WD. 00 -- I/O QUEUE THREAD WORDS1š; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER3›; WD. 02 -- ADRS OF THE TCB OF THE REQUESTOR TASKT>œ; WD. 03 -- POINTER TO 2ND LUN WORD IN REQUESTOR TASK HEADER3�; WD. 04 -- CONTENTS OF FIRST LUN WORD (UCB ADRS)ž; WD. 05 -- I/O FUNCTION CODEH.Ÿ; WD. 06 -- VIRTUAL ADRS OF I/O STATUS BLOCK1 ; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK5=¡; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT +140000)R1¢; WD. 11 -- VIRTUAL ADRS OF AST SERVICE ROUTINE,3£; WD. 12 -- MEMORY EXTENSION BITS OF I/O TRANSFER )¤; WD. 13 -- BUFFER ADRS OF I/O TRANSFERD.¥; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED¦; WD. 15 -- NOT USED.2=§; WD. 16 -- LOW BYTE MUST BE ZERO AND HIGH BYTE IS NOT USED ;¨; WD. 17 -- LOW PART OF LOGICAL BLK NUMBER OF I/O REQUESTC©; WD. 20 -- RELOCATION BIAS OF DIAGNOSTIC REG. BLK. ELSE NOT USEDIEª; WD. 21 -- DIAGN. REG. BLOCK ADDRESS (DISPL.+140000) ELSE NOT USEDI«;E(¬; DRIVER USAGE OF WORDS IN I/O PACKET:-­; I.PRM+6 (WD. 15) - EXTENDED ADDRESS BITSE:®; I.PRM+10 (WD. 16) - CYLINDER # OR DESIRED DISK ADDRESSC¯; I.PRM+12 (WD. 17) - SECTOR/SURFACE # OR BYTES REMAINING TO XFERD°;-±6± CALL @RQCND ;REQUEST ACCESS TO CONTROLLER ;GM1026± MOV S.VPKT(R4),R1 ;GET I/O PACKET ADDRESS ;GM102±PKT1=.-2 ;GM102 /± MOV S.VKRB(R4),R3 ;GET KRB ADDRESS ;GM102 ±KRB1=.-2 ;GM102-7µ MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX ;**-3I/¶ MOV #RETRY,RTTBL(R3);SET INITIAL RETRY COUNT-· CALL DLVV ;PROCESS VOLUME VALID FUNCTIONS7· BIT #FE.EXT,@FMASK ;IS THIS A 22-BIT SYSTEM ;GM102S¹ BEQ 15$ ;IF EQ NO ;**-1S0º BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST?» BEQ 10$ ;IF EQ NOA1¼ MOVB U.BUF+1(R5),R0 ;GET EXTENDED ADDRESS BITS;*½ MOV R0,I.PRM+6(R1) ;SAVE THEM FOR LATER*¾ ASH #4,R0 ;PUT THEM IN THE RIGHT PLACE*¿ BIC #^C<60>,R0 ;JUST GET THE LOW 2 BITSÀ MOV R0,U.BUF(R5) ;SAVE THEM Á BR 15$ ;<Á10$: CALL @STMAP ;SETUP UNIBUS MAPPING REGISTERS ;GM102/Á CALL @MPUBM ;MAP UNIBUS TO MEMORY ;GM102I:Á15$: MOV S.VPKT(R4),R1 ;GET I/O PACKET ADDRESS ;GM102ÁPKT2=.-2 ;GM102 8Å MOVB U.UNIT(R5),U.BUF+1(R5) ;SET UNIT NUMBER ;**-3.Æ MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION8Ç BIS #READ!IE,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTION-È CMPB #IO.RLB/^D<256>,I.FCN+1(R1) ;REALLY?R&É BHIS 20$ ;IF HIS FUNCTION IS LEGAL$Ê CALLR DLFIN ;FUNCTION IS ILLEGAL)Ë20$: BEQ 25$ ;IF EQ FUNCTION IS A READ ;Ì SUB #WRITE,U.BUF(R5) ;CONVERT TO WRITE LOGICAL FUNCTIONP7Í25$: MOV I.PRM+12(R1),R0 ;RETRIEVE SECTOR AND SURFACEE0Î MOV I.PRM+10(R1),R2 ;RETRIEVE CYLINDER NUMBER!Ï ASH #7,R2 ;PUT IT IN POSITION1.Ð BIS R0,R2 ;MERGE IN THE SECTOR AND SURFACE1Ñ MOV R2,I.PRM+10(R1) ;SAVE DESIRED DISK ADDRESSU(Ò BIC #^C<77>,R0 ;ISOLATE SECTOR NUMBER;Ó MOV U.CNT(R5),I.PRM+12(R1) ;ASSUME ONLY ONE XFER N00xHaë``t`TADATADATADATADATADATAEEDEDH*Ô MOV #^D<40>,R2 ;SET SECTORS PER SURFACE0Õ SUB R0,R2 ;CALCULATE SECTORS LEFT ON SURFACE&Ö SWAB R2 ;GET BYTES LEFT ON SURFACE7× CMP U.CNT(R5),R2 ;ARE ADDITIONAL TRANSFERS REQUIRED?0Ø BLOS 30$ ;IF LOS NOF6Ù MOV R2,U.CNT(R5) ;SET BYTE COUNT FOR FIRST TRANSFER3Ù30$: MOV S.VKRB(R4),R3 ;GET KRB ADDRESS ;GM102RÙKRB2=.-2 ;GM102E7Û MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX ;**-1B5Ü MUL #6,R3 ;FORM AN INDEX INTO PARAMETER SAVE AREAI%Ý ADD #PRMSV,R3 ;POINT TO THIS ENTRYE/Þ MOV U.BUF(R5),(R3)+ ;SAVE INITIAL PARAMETERSß MOV U.BUF+2(R5),(R3)+ ;...à MOV U.CNT(R5),(R3)+ ;...Gá MOV I.PRM+10(R1),(R3)+ ;...Uâ MOV I.PRM+12(R1),(R3)+ ;...Fã MOV I.PRM+6(R1),(R3)+ ;...äå;+,æ; THIS SECTION WILL INITIATE THE OPERATIONç;-è<èDLINIO: MOV @S.VKRB(R4),R2 ;RETREIVE CSR ADDRESS ;GM102èKRB3=.-2 ;GM102 8è MOV S.VPKT(R4),R3 ;GET ADDRESS OF I/O PACKET ;GM102èPKT3=.-2 ;GM102A/ë CLRB U.CW2+1(R5) ;CLEAR DRIVE FLAGS ;**-2I7ì BITB #US.VV,U.STS(R5) ;IS SOFTWARE VOLUME VALID SET?í BEQ 5$ ;IF EQ NO î CALL DLGST ;GET DRIVE STATUSï BR 6$ ;SKIP RESET(-ð5$: CALL DLRST ;RESET DRIVE AND GET STATUS.*ñ6$: MOV RLMP(R2),R1 ;GET THE STATUS INFO-ò BIC #WLS!DT!HSS,R1 ;REMOVE IRRELEVANT BITS&ó BIT #DRDY,(R2) ;IS THE DRIVE READY?ô BEQ 20$ ;IF EQ NO 6õ BITB #US.VV,U.STS(R5);IS SOFTWARE VOLUME VALID SET?ö BEQ 10$ ;IF EQ NOC$÷ BIT #VC,R1 ;IS VOLUME CHECK SET?.ø BNE 20$ ;IF NE ERROR OR POWERFAIL RECOVERY6ù CALL DLRST ;CLEAR ANY OTHER DRIVE ERROR CONDITIONS'ú MOV RLMP(R2),R1 ;GET THE STATUS INFOS-û BIC #WLS!DT!HSS,R1 ;REMOVE IRRELEVANT BITS&ü BIT #DRDY,(R2) ;IS THE DRIVE READY?ý BEQ 20$ ;IF EQ NO)6þ10$: CMP #HH!BH!SLM,R1 ;HEADS, BRUSHES AND STATE OK?ÿ BEQ 35$ ;IF EQ YES920$: BITB #US.SPU,U.STS(R5) ;IS THE DRIVE SPINNING UP?1 BNE DLPWF1 ;IF NE YES, WAIT FOR IT TO SPIN UP?* CALL DLDVER ;LOG DRIVE NOT READY ERROR025$: MOV #IE.DNR&377,R0 ;SET RETURN ERROR CODE CALLR DLFIN ;EXIT FATALS&30$: CALL DLRST ;RESET DRIVE ERRORS635$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UP6 MOV I.PRM+10(R3),R0 ;RETREIVE STARTING DISK ADDRESS* CALL DLDIFF ;CALCULATE DIFFERENCE WORD, DLGO: BEQ 40$ ;IF EQ NO SEEK IS NECESSARY+  MOV #SEEK,R1 ;GET CODE FOR SEEK FUNCTIONT  CALL DLXCT ;EXECUTE THE SEEK0  BMI DLEROR ;IF MI ERROR DURING SEEK FUNCTION= 40$: MOVB S.VITM(R4),S.VCTM(R4) ;SET TIMEOUT COUNT ;GM102 ITM1=.-4 ;GM102T CTM1=.-2 ;GM102R8 BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST? ;**-1 BEQ 45$ ;IF EQ NO,9 MOV I.PRM+6(R3),RLBAE(R2) ;LOAD EXTENDED ADDRESS BITS;"45$: ADD #RLMP,R2 ;POINT TO RLMP# MOV U.CNT(R5),R1 ;GET BYTE COUNTD  ROR R1 ;MAKE IT A WORD COUNT NEG R1 ;ALSO NEGATIVER  MOV R1,(R2) ;LOAD WORD COUNT6 MOV I.PRM+10(R3),-(R2) ;LOAD STARTING DISK ADDRESS, MOV U.BUF+2(R5),-(R2) ;LOAD BUS ADDRESS3 CALL @BMSET ;SET I/O ACTIVE BIT IN MAP ;GM10247 MOV U.BUF(R5),-(R2) ;;;LOAD FUNCTION AND GO ;**-1E;+>; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.;-!DLCAN: RETURN ;;;NOP FOR RL11E !;+<"; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND@#; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT?$; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVE2A%; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANYSC&; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESSV'; THE UNIT IS ALREADY READY.(;-)5*DLPWF: BCS DLCAN ;IGNORE CONTROLLER POWERFAIL CALLO4* TSTB S.VSTS(R4) ;IS DRIVE CURRENTLY BUSY ;GM102*STS1=.-2 ;GM102+", BEQ DLPWF2 ;IF EQ NO ;**-1A, MOVB #4,S.VSTS(R4) ;ALLOW FOR A FULL MINUTE TO SPIN UP ;GM102N,STS2=.-2 ;GM102A,DLPWF1: MOVB #RLSPU,S.VCTM(R4);EXTEND TIMEOUT FOR UNIT ;GM102 ,CTM2=.-2 ;GM102K?/DLPWF2: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UP ;**-2R 0 RETURN ;X12;+'3; **-$DLINT-RL11/RL01 DISK CONTROLLERD(4; INTERRUPT AND 00xPa4a“_c”_d–_k›’ERROR SERVICE ROUTINES5;-:6 INTSE$ DL,PR5,R$$L11 ;;;SAVE REGISTERS AND SET PRIORITY36 CALL @FORK ;;;CREATE A SYSTEM PROCESS ;GM102P28 MOV U.SCB(R5),R4 ;RETRIEVE SCB ADDRESS ;**-159 BITB #RVSK,U.CW2+1(R5) ;REVERSE SEEK IN PROGRESS? #9 BEQ 5$ ; ;GM102..9 JMP DLIO1 ;IF NE YES ;GM102A9 5$: MOV @S.VKRB(R4),R2 ;RETRIEVE CSR ADDRESS ;GM102 9KRB4=.-2 ;GM102T:< MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL OPERATION ;**-2:< MOV S.VPKT(R4),R3 ;RETRIEVE I/O PACKET ADDRESS ;GM102<PKT4=.-2 ;GM102T.> MOV (R2),R1 ;GET CONTENTS OF RLCS ;**-1'? BMI DLEROR ;IF MI AN ERROR OCCURREDR:@ SUB U.CNT(R5),I.PRM+12(R3) ;GET BYTES LEFT TO TRANSFERA BEQ DLPASS ;IF EQ NONE LEFT;B MOV I.PRM+12(R3),U.CNT(R5) ;ASSUME LAST TRANSFER COMING 7C CMP I.PRM+12(R3),#RLBPT ;IS THIS THE LAST TRANSFER? D BLOS 10$ ;IF LOS YES5E MOV #RLBPT,U.CNT(R5);TRANSFER A WHOLE TRACKS WORTHR1F10$: BIC #CRDY,R1 ;CLEAR CRDY TO START FUNCTIONK;G MOV R1,U.BUF(R5) ;SAVE CURRENT FUNCTION AND ADDRESS BITS 6H MOV RLBA(R2),U.BUF+2(R5) ;SAVE CURRENT BUS ADDRESS0I BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST?J BEQ 20$ ;IF EQ NO(9K MOV RLBAE(R2),I.PRM+6(R3) ;SAVE EXTENDED ADDRESS BITSE4L20$: MOV I.PRM+10(R3),R0 ;GET INITIAL DISK ADDRESS M MOV R0,R1 ;COPY DISK ADDRESS/N BIS #77,R0 ;UPDATE CYLINDER AND SURFACE ...0(O INC R0 ;... LEAVING SECTOR BITS ZERO-P MOV R0,I.PRM+10(R3) ;SAVE NEW DISK ADDRESSR2Q CALL DLDIF0 ;CALCULATE MID-TRANSFER DIFFERENCE#R CALLR DLGO ;GO DO THE OPERATIONBS+TDLEROR: BIT #DRDY,R1 ;IS THE DRIVE READY?B!T BEQ 25$ ;IF NE YES ;GM101)2T MOV RLMP(R2),R1 ;GET THE STATUS INFO ;GM1018T BIC #WLS!DT!HSS,R1 ;REMOVE IRRELEVANT BITS ;GM101;T CMP #HH!BH!SLM,R1 ;HEADS, BRUSHES AND STATE OK? ;GM101R+T BEQ DLERR ;YES, THEN DO RETRY ;GM101ADT25$: MOVB S.VITM(R4),S.VCTM(R4);WAIT FOR DRIVE TO QUIESCE ;GM101TITM2=.-4 ;GM101ATCTM3=.-2 ;GM101L?W MOVB #SDWN,U.CW2+1(R5) ;FLAG SETTLE DOWN IN PROGRESS ;**-2D X RETURN ;BY0ZDLERR: MOV (R2),R1 ;RETRIEVE CONTENTS OF RLCS0[ BITB #IQ.UMD,I.FCN(R3) ;DIAGNOSTIC FUNCTION?,\ BNE DLPASS ;IF NE YES, GO PASS REGISTERS#] MOV R1,-(SP) ;SAVE RLCS CONTENTS !^ CALL DLDVER ;LOG DEVICE ERRORD*_ MOV (SP),R1 ;RETRIEVE CONTENTS OF RLCS-` MOV #IE.BBE&377,R0 ;ASSUME BAD BLOCK ERRORVa COM (SP) ;TOGGLE THE BITSR(b BIT #HCRC!OPI,(SP)+ ;BAD BLOCK ERROR?c BEQ DLFIN ;IF EQ YES1d MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERRORT%e BIT #NXM,R1 ;NON-EXISTANT MEMORY? f BNE DLFIN ;IF NE YESg BIT #DE,R1 ;DRIVE PROBLEMS?h BEQ 50$ ;IF EQ NO31i CALL DLGST ;EXECUTE GET DRIVE STATUS FUNCTION,'j BIT #WGE,RLMP(R2) ;WRITE GATE ERROR? k BEQ DLFIN ;IF EQ NOL0l BIT #WLS,RLMP(R2) ;IS THE DRIVE WRITE LOCKED?m BEQ DLRTY ;IF EQ NOV0n MOV #IE.WLK&377,R0 ;SET WRITE LOCK ERROR CODEo BR DLFIN ;/p50$: BIT #10,U.BUF(R5) ;WRITE CHECK FUNCTION?q BNE DLRTY ;IF NE NO&r BIT #OPI,R1 ;OPERATION INCOMPLETE?s BNE DLRTY ;IF NE YES#t BIT #DCK,R1 ;WRITE CHECK ERROR?Nu BEQ DLRTY ;IF EQ NOR6v MOV #IE.WCK&377,R0 ;YES, SET WRITE CHECK ERROR CODE@vDLRTY: MOV S.VPKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS ;GM102vPKT5=.-2 ;GM102F2x BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES? ;**-1y BNE DLFIN ;IF NE YES4y MOV S.VKRB(R4),R3 ;RETRIEVE KRB ADDRESS ;GM102yKRB5=.-2 ;GM1023{ MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX ;**-1E)| DECB RTTBL(R3) ;ANY MORE RETRIES LEFT?I} BLE DLFIN ;IF LE NOR'~DLIO: CALL DLRST ;RESET DRIVE ERRORSE,DLIO1: JMP DLINIO ;RETRY ENTIRE OPERATION€7�DLPASS: BITB #IQ.UMD,I.FCN(R3) ;DIAGNOSTIC FUNCTION?S‚ BEQ 10$ ;IF EQ NOI>‚ MOV I.PRM+14(R3),@KISR6;SET BUFFER RELOCATION BIAS ;GM102;„ MOV I.PRM+16(R3),R3 ;GET REGISTER BUFFER ADDRESS ;**-1 +… CALL REGPAS ;MOVE REGISTERS INTO BUFFERD† BR DLFIN ;EXIT;‡10$: BITB #IO.WLC&377,I.FCN(R3) ;WRITE WITH WRITE CHECK?Iˆ BNE 20$ ;IF NE YES0‰ BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED?00xXaë``t`TADATADATADATADATADATAŠ BEQ DLFIN ;IF EQ NOD2‹20$: MOV U.BUF(R5),R1 ;GET CURRENT FUNCTION CODE/Œ BIT #WCHK,R1 ;WRITE OR WRITE CHECK FUNCTION?I� BEQ DLFIN ;IF EQ NOC)Ž BIT #10,R1 ;WAS FUNCTION WRITE CHECK?M� BEQ DLFIN ;IF EQ YES/� MOV S.VKRB(R4),R1 ;GET KRB ADDRESS ;GM102;�KRB6=.-2 ;GM102 7‘ MOVB K.CON(R1),R1 ;RETRIEVE CONTROLLER INDEX ;**-1)’ MOV #RETRY,RTTBL(R1);RESET RETRY COUNT.5“ MUL #6,R1 ;FORM AN INDEX INTO PARAMETER SAVE AREAY” ADD #PRMSV,R1 ;...T3• MOV (R1)+,U.BUF(R5) ;RESTORE STARTING PARAMETERSD– MOV (R1)+,U.BUF+2(R5) ;...— MOV (R1)+,U.CNT(R5) ;...#˜ MOV (R1)+,I.PRM+10(R3) ;...C™ MOV (R1)+,I.PRM+12(R3) ;...š MOV (R1)+,I.PRM+6(R3) ;...5› BIC #10,U.BUF(R5) ;CONVERT TO WRITE CHECK FUNCTION,"œ BR DLIO ;START THE WRITE CHECK�>�DLFIN: MOV S.VPKT(R4),R2 ;GET ADDRESS OF I/O PACKET ;GM102�PKT6=.-2 ;GM102,6Ÿ MOV I.PRM+4(R2),R1 ;GET TOTAL TRANSFER SIZE ;**-12  SUB I.PRM+12(R2),R1 ;CALCULATE BYTES TRANSFERED/  MOV S.VKRB(R4),R3 ;GET KRB ADDRESS ;GM102T KRB7=.-2 ;GM102R7¢ MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX ;**-1M+£ MOVB RTTBL(R3),R2 ;GET FINAL RETRY COUNT.5¤ BIS #RETRY*^D<256>,R2 ;MERGE STARTING RETRY COUNT)0¤ CALL @RLCN ;RELEASE THE CONTROLLER ;GM102/¤ CALL @IODON ;FINISH I/O OPERATION ;GM102,,§ JMP DLINI ;PROCESS NEXT REQUEST ;**-2¨©;+&ª; **-DLOUT-RL11/RL01 DISK CONTROLLER«; DEVICE TIMEOUT ROUTINE¬;B;­; DEVICE TIMEOUT RESULTS IN THE OPERATION BEING REPEATED.4?®; TIMEOUTS ARE USUALLY CAUSED BY A POWER FAILURE BUT MAY ALSOM,¯; BE THE RESULT OF A HARDWARE MALFUNCTION.°;-±B±DLOUT: MOV S.VPKT(R4),R3 ;;;RETRIEVE I/O PACKET ADDRESS ;GM102±PKT7=.-2 ;GM102N;³ BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP? ;**-1 ´ BEQ 20$ ;;;IF EQ NOT;´ DECB S.VSTS(R4) ;;;HAVE WE WAITED A MINUTE YET? ;GM102´STS3=.-2 ;GM102/!¶ BNE 10$ ;;;IF NE NO ;**-1M4¶ INCB S.VSTS(R4) ;;;LEAVE CONTROLLER BUSY ;GM102¶STS4=.-2 ;GM102)¸ BR 30$ ;;;LOG DEVICE TIMEOUT ;**-1F#¹10$: MTPS #0 ;;;ALLOW INTERRUPTSL#º BR DLIO ;RETRY ENTIRE OPERATION9»20$: BITB #SDWN,U.CW2+1(R5) ;;;IS DRIVE SETTLING DOWN? ¼ BEQ 30$ ;;;IF EQ NO #½ MTPS #0 ;;;YES, ALLOW INTERUPTS ¾ JMP DLERR ;PROCESS THE ERROR#¿30$: MTPS #0 ;;;ALLOW INTERRUPTS.0À BITB #IQ.UMD,I.FCN(R3) ;DIAGNOSTIC FUNCTION?,Á BNE DLPASS ;IF NE YES, GO PASS REGISTERS# CALL DLDTER ;LOG DEVICE TIMEOUT)+à MOV #IE.DNR&377,R0 ;SET DEVICE NOT READY2Ä JMP DLRTY ;RETRY OPERATIONÅÆ;+2Ç; **-DLXCT,DLGST,DLRST-RL11/RL01 DISK CONTROLLERÈ; FUNCTION EXECUTION ROUTINESPÉ;O7Ê; THIS ROUTINE WILL EXECUTE A GET DRIVE STATUS OR ANYO;Ë; NON-INTERRUPTABLE FUNCTION AND WAIT FOR ITS COMPLETION.EÌ; Í; INPUTS:RÎ; R1 = FUNCTION CODEÏ; R2 = CSR ADDRESSÐ; R5 = UCB ADDRESSÑ;M Ò; OUTPUTS:"Ó; R1 = CONTENTS OF RLCS (TESTED)Ô; FUNCTION EXECUTEDGÕ;-Ö>×DLRST: MOV #RST!STS!MRK,RLDA(R2) ;SET MESSAGE CODES IN RLDA(Ø CALL DLDST ;DO THE DRIVE RESET FIRST:ÙDLGST: MOV #STS!MRK,RLDA(R2) ;SET MESSAGE CODES IN RLDA.ÚDLDST: MOV #GSTS,R1 ;SET GET STATUS FUNCTION)ÛDLXCT: MOV R1,-(SP) ;SAVE FUNCTION CODE 1Ü MOVB U.UNIT(R5),1(SP);MERGE CURRENT DRIVE BITSWÝ MOV (SP)+,(R2) ;LOAD RLCS6Þ10$: BIT #ERR!CRDY,(R2) ;FUNCTION COMPLETE OR ERROR?ß BEQ 10$ ;IF EQ NOE.à MOV (R2),R1 ;SAVE RLCS AND TEST FOR ERRORS á RETURN ; âã;+'ä; **-DLDIFF-RL11/RL01 DISK CONTROLLER!*å; CYLINDER ADDRESS DIFFERENCE CALCULATORæ; >ç; THIS SUBROUTINE CALCULATES THE DIFFERENCE WORD USED IN THEBè; SEEK OPERATION. IF A HEADER CANNOT BE READ AFTER 16. RETRIES,Cé; AN ERROR WILL BE LOGGED AND A ONE CYLINDER REVERSE SEEK WILL BER?ê; ISSUED. THE SEEK IS FOLLOWED BY A READ HEADERS TO CAUSE ANë; INTERRUPT.ì;( í; INPUTS: î; R0 = DESIRED DISK ADDRESS ï;Q ð; OUTPUTS:ñ; R1 = DIFFERENCE WORD&ò; RLDA = LOADED WITH DIFFERENCE WORDó; IF EQ NO SEEK IS NECESSARYô;-õ9öDLDIFF: MOV #RETRY*2,-(SP) ;SET READ HEADER RETRY COUNTS3÷10$: MOV #RDH,00x`a4a“_c”_d–_k›’R1 ;CODE FOR READ HEADERS FUNCTION$ø CALL DLXCT ;EXECUTE THE FUNCTION'ù BPL 20$ ;IF PL FUNCTION EXECUTED OKRú DEC (SP) ;ANY RETRIES LEFT?Rû BGT 10$ ;IF GT YES:ü CMP (SP)+,(SP)+ ;REMOVE RETRY COUNT AND CALLERS ADDRESS!ý CALL DLDVER ;LOG HEADER ERRORUþ CALL DLRST ;RESET DRIVED7ÿ MOV #REV,RLDA(R2) ;LOAD REVERSE SEEK DIFFERENCE WORD + MOV #SEEK,R1 ;GET CODE FOR SEEK FUNCTION 0 MOV #IE.VER&377,R0 ;ASSUME THE SEEK WILL FAIL  CALL DLXCT ;EXECUTE THE SEEK BMI DLFIN ;IF MI WE FAILED1 BIC #^C,R1 ;GET ONLY UNIT SELECT BITST- BIS #IE!RDH,R1 ;LOAD CODES FOR READ HEADERC= MOVB #RVSK,U.CW2+1(R5) ;INDICATE REVERSE SEEK IN PROGRESSYA MOVB S.VITM(R4),S.VCTM(R4) ;SET DEVICE TIMEOUT COUNTER ;GM102CITM3=.-4 ;GM102OCTM4=.-2 ;GM102R. MOV R1,(R2) ;LOAD FUNCTION AND GO ;**-1#  RETURN ;WAIT FOR THE INTERRUPTC% 20$: TST (SP)+ ;REMOVE RETRY COUNT3(  MOV RLMP(R2),R1 ;RETREIVE HEADER WORD+ DLDIF0: BIC #77,R0 ;MASK OUT SECTOR BITSI  BIC #77,R1 ;...C' CMP R0,R1 ;DO WE NEED TO DO A SEEK? BEQ 40$ ;IF EQ NO * MOV R0,-(SP) ;SAVE DESIRED DISK ADDRESS) BIC #^C<100>,(SP) ;ISOLATE SURFACE BIT* ASR (SP) ;PUT INTO THE PROPER POSITION ASR (SP) ;...0# BIC #100,R0 ;REMOVE SURFACE BIT4 BIC #100,R1 ;...+ SUB R0,R1 ;SUBTRACT DESIRED FROM ACTUAL1'; BEQ 30$ ;IF EQ ONLY CHANGE SURFACE& BCC 30$ ;IF CC ACTUAL .GE. DESIRED6 NEG R1 ;ACTUAL < DESIRED, MAKE POSITIVE DIFFERENCE3 BIS #SN,R1 ;SET SIGN FOR MOVE TO CENTER OF DISK30$: INC R1 ;SET MARKER BIT% BIS (SP)+,R1 ;MERGE IN SURFACE BITR( MOV R1,RLDA(R2) ;LOAD DIFFERENCE WORD40$: RETURN ;L !;+'"; **-DLDXXX-RL11/RL01 DISK CONTROLLERI#; ERROR LOGGING ROUTINES$;#D%; THIS ROUTINE IS CALLED WHENEVER A DEVICE ERROR OR DEVICE TIMEOUTF&; OCCURS. A CORE BLOCK THE SIZE OF THE REGISTER BUFFER IS ALLOCATEDD'; AND THE UNIBUS REGISTERS ALONG WITH THE DRIVE STATUS INFORMATIOND(; ARE TRANSFERED INTO THE CORE BLOCK AND THE APPROPRIATE EXECUTIVE@); ERROR LOGGING ROUTINE IS CALLED. FINALLY, THE CORE BLOCK IS>*; DEALLOCATED AND THE CSR AND CONTROLLER INDEX ARE RESTORED.+; A,; IF FOR ANY REASON THE CORE BLOCK CANNOT BE ALLOCATED THEN THERD-; EXECUTIVE ERROR LOGGING ROUTINE WILL NOT BE CALLED AND THE ERRORC.; SEQUENCE NUMBER WILL BE UPDATED TO INDICATE THAT A MISSED ERROR /; CONDITION OCCURRED.T0; 1; INPUTS:B2; R2 = CSR ADDRESS3; R4 = SCB ADDRESS4;I 5; OUTPUTS:6; R0, R1 ARE DESTROYED7; R3 = CONTROLLER INDEXU8;-9 : .ENABL LSBOA:DLDVER: MOV DVERR,-(SP) ;ADDRESS OF EXEC ERROR ROUTINE ;GM102H< BR 10$ ; ;**-1XB<DLDTER: MOV DTOER,-(SP) ;ADDRESS OF EXEC TIMEOUT ROUTINE ;GM102?>10$: MOV #RLCNT*2,R1 ; GET NUMBER OF BYTES TO ALLOCATE ;**-1T0> CALL @ALOCB ;ALLOCATE A CORE BLOCK ;GM102.@ BCC 20$ ;IF CC BLOCK WAS ALLOCATED ;**-19@ INC @ERRSQ ;INDICATE A MISSED ERROR CONDITION ;GM102DC@ CMP (SP)+,DTOER ;ALLOCATION FAILURE, TIMEOUT IN PROGRESS? ;GM102YC BNE 30$ ;IF NE NO ;**-25C MOV @S.VKRB(R4),R2 ;RETRIEVE CSR ADDRESS ;GM102ECKRB10=.-2 ;GM1021E BIC #IE,(R2) ;;;CLEAR INTERRUPT ENABLE ;**-1EF MTPS #0 ;;;ALLOW INTERRUPTSR1G BR 30$ ;DON'T LOG ERROR IF ALLOCATION FAILURE ,H20$: MOV R0,R3 ;SET POINTER TO CORE BLOCK0H MOV @S.VKRB(R4),R2 ;GET CSR ADDRESS ;GM102HKRB11=.-2 ;GM1027J CALL REGPAS ;MOVE REGISTERS INTO CORE BLOCK ;**-1M&K MOV R0,R2 ;COPY CORE BLOCK ADDRESS0L CALL @(SP)+ ;CALL EXEC ERROR LOGGING ROUTINE+M MOV R2,R0 ;GET BACK CORE BLOCK ADDDRESST5N MOV #RLCNT*2,R1 ;GET NUMBER OF BYTES TO DEALLOCATE23N CALL @DEACB ;DEALLOCATE THE CORE BLOCK ;GM1023N30$: MOV S.VKRB(R4),R3 ;GET KRB ADDRESS ;GM102ONKRB12=.-2 ;GM102.Q MOV (R3),R2 ;RETRIEVE CSR ADDRESS ;**-2/R MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX2 S RETURN- T .DSABL LSB2UV;+BW; MOVE THE CONTROLLER/DRIVE REGISTERS INTO THE SPECIFIED BUFFER.X;E Y; INPUTS:SZ; R2 = CSR ADDRESS[; R3 = BUFFER ADDRESSI00xhaë``t`TADATADATADATADATADATA\;-]#^REGPAS: MOV (R2),(R3)+ ;MOVE RLCST _ MOV RLBA(R2),(R3)+ ;MOVE RLBA ` MOV RLDA(R2),(R3)+ ;MOVE RLDA a MOV RLMP(R2),(R3)+ ;MOVE RLMPb CLR (R3)+ ;ASSUME NO RLBAE0c BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST?d BEQ 10$ ;IF EQ NO2"e MOV RLBAE(R2),-2(R3);MOVE RLBAE&f10$: CLR (R3)+ ;EXTRA WORD IS BLANK1g CALL DLGST ;EXECUTE GET DRIVE STATUS FUNCTIONO'h MOV RLMP(R2),(R3) ;SAVE DRIVE STATUSE i RETURN ;Ejk;+*l; **-DLVV-PROCESS VOLUME VALID FUNCTIONSm;E=n; THIS ROUTINE WILL VALIDATE VOLUME VALID AND HANDLE DEVICEM/o; SPECIFIC VOLUME VALID AND SIZING FUNCTIONS.)p;V q; INPUTS:Vr; R1 = I/O PACKET ADDRESSs; R4 = SCB ADDRESSt; R5 = UCB ADDRESSu;1 v; OUTPUTS:8w; IF THIS IS A TRANSFER FUNCTION ONLY R0 IS DESTROYED.9x; IF THIS IS A VOLUME VALID FUNCTION, THE PROPER ACTION8y; IS TAKEN AND CONTROL IS TRANSFERED DIRECTLY TO THE!z; PROPER PLACE IN THE DRIVER.{;-|5|DLVV: CALL @VOLVD ;VALIDATE VOLUME VALID ;GM102S%~ BCS 20$ ;IF CS WE FAILED ;**-1V( TST R0 ;IS THIS A TRANSFER FUNCTION?€ BMI 40$ ;IF MI YES0€ MOV @S.VKRB(R4),R2 ;GET CSR ADDRESS ;GM102€KRB13=.-2 ;GM102.‚ MOV R1,R3 ;COPY I/O PACKET ADDRESS ;**-1*ƒ CALL DLRST ;RESET DRIVE AND GET STATUS"„ TST I.PRM+2(R3) ;SIZE THE DISK?… BPL 10$ ;IF PL NOH† TST (SP)+ ;REMOVE RETURN0‡ MOV #IE.SZE&377,R0 ;ASSUME NON-EXISTANT DRIVE%ˆ MOV (R2),R1 ;GET CONTENTS OF RLCS0‰ BIC #^C,R1 ;GET RID OF UNWANTED BITS)Š CMP #ERR!OPI,R1 ;DOES THE DRIVE EXIST?-‹ BEQ 30$ ;IF EQ NO *Œ MOV #IS.SUC&377,R0 ;YES, ASSUME SUCCESS)� CALLR DLPASS ;PASS REGISTERS AND EXIT 2Ž10$: BIT #VV$SET,I.PRM+2(R3) ;SET VOLUME VALID?� BEQ 25$ ;IF EQ NO .� MOV RLMP(R2),R1 ;GET THE STATUS INFORMATION&‘ BIT #DRDY,(R2) ;IS THE DRIVE READY?’ BEQ 15$ ;IF EQ NO-“ BIC #WLS!DT!HSS,R1 ;REMOVE IRRELEVANT BITS72” CMP #HH!BH!SLM,R1 ;HEADS, BRUSHES AND STATE OK?• BEQ 25$ ;IF EQ YES.–15$: MOV #IE.DNR&377,R0 ;SET DRIVE NOT READY9—20$: BICB #US.VV,U.STS(R5) ;CLEAR SOFTWARE VOLUME VALIDQ ˜25$: TST (SP)+ ;REMOVE RETURN™30$: CALLR DLFIN ;FINISH UPš40$: RETURN ;D›œ;+)�; **-DLCHK-VALIDATE AND CONVERT THE LBNAž;;Ÿ; THIS ROUTINE IS CALLED FROM $DRQRQ TO DO LBN PROCESSINGF; ; FOR DEVICES WHICH SUPPORT QUEUE OPTIMIZATION. IF BLKC2 ;¡; DETECTS AN ERROR IT WILL RETURN TO THE CORRECT PLACE IN ¢; $DRQRQ AFTER CALLING $IOALT.£;S ¤; INPUTS:B¥; R1 = I/O PACKET ADDRESSV¦; R4 = SCB ADDRESS§; R5 = UCB ADDRESS¨; ©; OUTPUTS:9ª; IF THE CHECKS SUCCEED, THEN THE LBN IN THE I/O PACKET 6«; IS REPLACED BY THE DISK ADDRESS. R1 IS PRESERVED.¬;:­; IF THE CHECKS FAIL, THE $IOALT IS ENTERED WITH A FINAL9®; STATUS OF IE.BLK AND A RETURN TO THE CORRECT PLACE IN¯; $DRQRQ IS EXECUTED.P°;U!±; R0, R2, AND R3 ARE DESTROYED.E²; >³; NOTE: ALL FUNCTIONS PUT INTO THE DRIVER QUEUE ARRIVE HERE.?´; THESE FUNCTIONS INCLUDE, IO.ATT, IO.DET, AND ACP FUNCTIONS.Sµ;-¶·;¸DLCHK: CMPB #IO.ATT/256.,I.FCN+1(R1) ;IS THIS AN ATTACH?T&¹ BEQ 30$ ;IF EQ YES, LEAVE IT ALONE4º CMPB #IO.DET/256.,I.FCN+1(R1) ;IS THIS A DETACH?&» BEQ 30$ ;IF EQ YES, LEAVE IT ALONE)¼ MOV I.FCN(R1),-(SP) ;GET FUNCTION CODE &½ BIC #7,(SP) ;REMOVE QUALIFIER BITS2¾ CMP #IO.STC,(SP)+ ;IS IT A SET CHARACTERISTICS?&¿ BEQ 30$ ;IF EQ YES, LEAVE IT ALONE6À MOV I.PRM+12(R1),R0 ;RETRIEVE STARTING BLOCK NUMBER-Á MOV R1,R3 ;ASSUME PHYSICAL BLOCK FUNCTIONE8 BITB #IO.WPB&377,I.FCN(R1) ;PHYSICAL BLOCK FUNCTION?à BNE 20$ ;IF NE YES4à CALL @BLKC2 ;CHECK LOGICAL BLOCK NUMBER ;GM102:Å CMPB #IO.WLB/256.,I.FCN+1(R3) ;WRITE FUNCTION? ;**-1Æ BNE 10$ ;IF NE NOE:Ç BITB #IO.WLT&377,I.FCN(R3) ;WRITE LAST TRACK FUNCTION?È BNE 10$ ;IF NE YES1É MOV R0,I.PRM+6(R3) ;SAVE STARTING BLOCK NUMBERR.Ê ADD #20.,(R1) ;ADD 1 TRACKS WORTH OF BLOCKS&Ë MOV R3,R1 ;COPY I/O PACKET ADDRESS4Ë CALL @BLKC2 ;CHECK LOGICAL BLOCK NUMBER ;GM102DÍ MOV I.PRM+6(R3),R0 ;RESTORE ORIGINAL STARTING BLOCK NUMBER ;**-1)Î10$: ASL R0 ;CONVER00xpa4a“_c”_d–_k›’T BLOCKS TO SECTORS Ï20$: CLR R2 ;NO HIGH BITS5Ï CALL @CVLBN ;CONVERT LBN TO DISK ADDRESS ;GM102O,Ñ ASH #6,R1 ;POSITION SURFACE BIT ;**-1(Ò BIS R1,R0 ;MERGE SURFACE WITH SECTOR7Ó MOV R0,I.PRM+12(R3) ;SAVE SECTOR AND SURFACE ADDRESSV6Ô MOV R2,I.PRM+10(R3) ;SAVE STARTING CYLINDER ADDRESS&Õ MOV R3,R1 ;COPY I/O PACKET ADDRESSÖ30$: RETURN ;ר;+.Ù; **-DLKRB-CONTROLLER ONLINE/OFFLINE ROUTINEÚ;M=Û; THIS ROUTINE WILL HANDLE RECONFIGURATION CALLS FOR ONLINE:DÜ; CONTROLLER AND OFFLINE CONTROLLER FOR THE RL11, RLV11 AND RLV12.Ý; EÞ; FOR ONLINE, IT WILL DETERMINE IF THE RLBAE REGISTER EXISTS AND IF Bß; SO, IT WILL INSURE THAT THE ADDRESS BITS ARE REPLICATED IN THEà; CSR.á;R(â; FOR OFFLINE, KS.EXT WILL BE CLEARED.ã;, ä; INPUTS:;å; R2 = KRB ADDRESSæ; R3 = CTB ADDRESSç; C=1 IF OFFLINE REQUESTè; C=0 IF ONLINE REQUEST+é; ê; OUTPUTS::ë; FOR ONLINE, KS.EXT WILL BE SET IF THE CONTROLLER HAS Aì; VALID RLBAE.#í; FOR OFFLINE, KS.EXT IS CLEARED.Aî;-ï0ðDLKRB: BIC #KS.EXT,K.STS(R2) ;ASSUME NO RLBAE"ñ BCS 20$ ;IF CS OFFLINE REQUEST)ñ TST EXEVEC ;IF DONE ALREADY ;GM102 ñ BNE 2$ ;SKIP THIS ;GM102#ñ MOV R2,-(SP) ;SAVE R2 ;GM102#ñ MOV R3,-(SP) ;SAVE R3 ;GM102L+ñ MOV KINAR6,-(SP) ;SAVE KINAR6 ;GM102E8ñ MOV @#112,R0 ;GET ADDRESS OF TABLE OF ENTRIES ;GM102Cñ MOV (R0),R0 ;GET ADDRESS OF APR BIAS (1ST WORD IN TABLE) ;GM102L;ñ MOV (R0),KINAR6 ;MAP COMMON THROUGH I-SPACE APR6 ;GM102F,ñ MOV #EXEVEC,R3 ;POINT TO VECTOR ;GM1024ñ MOV #EXEVCL,R2 ;SPECIFY LENGTH OF VECTOR ;GM1020ñ CALL @#140004 ;TRANSLATE THE VECTOR ;GM102-ñ MOV (SP)+,KINAR6 ;RESTOR KINAR6 ;GM1021&ñ MOV (SP)+,R3 ;RESTORE R3 ;GM102&ñ MOV (SP)+,R2 ;RESTORE R2 ;GM1023ñ MOV #SCBPAT,R0 ;GET PATCH TABLE ADDRESS ;GM102@/ñ1$: MOV (R0)+,R1 ;MOVE TABLE ENTRY ;GM102,ñ BEQ 2$ ;IF EQ END OF THE TABLE ;GM1023ñ MOV @(R0)+,(R1) ;IF NEQ START TO PATCH ;GM102N#ñ BR 1$ ;COMPLETE IT ;GM102V;ñ2$: BIT #FE.EXT,@FMASK ;IS THIS A 22-BIT SYSTEM? ;GM102Eó BEQ 20$ ;IF EQ NO ;**-18ó CALL @SGFIN ;TURN NXM'S INTO SET CARRY BITS ;GM102.õ MOV (R2),R4 ;RETREIVE CSR ADDRESS ;**-1/ö BIS #A16!A17,(R4) ;SET EXTENDED ADDRESS BITSS"÷ CLR RLBAE(R4) ;CLEAR RLBAE BITS'ø BCS 10$ ;IF CS RLBAE DOES NOT EXIST$1ù BIT #A16!A17,(R4) ;DID THE ADDRESS BITS CLEAR?Qú BNE 10$ ;IF NE NOT1û BIS #KS.EXT,K.STS(R2) ;YES, SET RLBAE PRESENT 2ü ADD K.OFF(R2),R2 ;CALCULATE OFFSET TO UCB TABLE6ý MOV #RLBAE,KE.RHB(R2) ;SET BAE OFFSET IN DATA BASE,þ10$: BIC #A16!A17,(R4) ;RESET ADDRESS BITSÿ20$: RETURN ; ;+(; **-DLUCB-UNIT ONLINE/OFFLINE ROUTINE;E=; THIS ROUTINE WILL HANDLE RECONFIGURATION CALLS FOR ONLINED3; UNIT AND OFFLINE UNIT FOR RL01 AND RL02 DRIVES.S; ?; FOR ONLINE, IF KS.EXT IS SET THEN DV.EXT IS ALSO SET. THISS=; IS DONE TO ELIMINATE UNNECESSARY CODE TO RETREIVE THE KRB) ; ADDRESS. ;R# ; FOR OFFLINE, DV.EXT IS CLEARED.E ;E ; INPUTS:E; R3 = CONTROLLER INDEX ; R4 = SCB ADDRESS; R5 = UCB ADDRESS; C=1 IF ONLINE REQUESTI; C=0 IF OFFLINE REQUEST; ; OUTPUTS:5; FOR ONLINE, DV.EXT IS SET IN THE UCB IF KS.EXT IS ; SET IN THE KRB.N#; FOR OFFLINE, DV.EXT IS CLEARED.I;-0DLUCB: BIC #DV.EXT,U.CW1(R5) ;ASSUME NO RLBAE" BCS 10$ ;IF CS OFFLINE REQUEST/ MOV S.VKRB(R4),R2 ;GET KRB ADDRESS ;GM102CKRB14=.-2 ;GM1028 BIT #KS.EXT,K.STS(R2) ;DOES THE RLBAE EXIST? ;**-1 BEQ 10$ ;IF EQ NO3. BIS #DV.EXT,U.CW1(R5) ;YES, SET BIT IN UCB 10$: RETURN ;!" .ENDN#QUESTI; C=0 IF OFFLINE REQUEST; ; OUTPUTS:5; FOR ONLINE, DV.EXT IS SET IN THE UCB IF KS.EXT IS ; SET IN THE KRB.N#; FOR OFFLINE, DV.EXT IS CLEARED.I;-0DLUCB: BIC #DV.EXT,U.CW1(R5) ;ASSUME NO RLBAE" BCS 10$ ;IF CS OFFLINE REQUEST/ MOV S.VKRB(R4),R2 ;GET KRB ADDRESS ;GM102CKRB14=.-2 ;GM1028 BIT #KS.EXT,K.STS(R2) ;DOES THE RLBAE EXIST? ;**-1 BEQ 10$ ;IF EQ NO3. BIS #00yxaë``t`TADATADATADATADATADATA .TITLE DXDRVL .IDENT /06.02/#;BD; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;O ; H. J. LEV 16-JAN-75 ; P. J. BEZEREDI ; P. J. CARR ;  ; MODIFIED BY:T ;C' ; G. MARIGOWDA 4-AUG-86 V06.02D1 ; GM001 -- CONVERT TO USE EXEC VECTORINGL ; ;G#; RX01 - RX11 FLOPPY DISK DRIVER ;L; FUNCTIONS RECOGNIZED:>; IO.RPB - READ PHYSICAL BLOCK (MAY READ ANY SECTOR ON DISK)@; IO.WPB - WRITE PHYSICAL BLOCK (MAY WRITE ANY SECTOR ON DISK):; IO.WDD - WRITE DELETED DATA - WRITE ANY SECTOR ON DISK5; SETTING THE DELETED DATA MARK IN SECTOR HEADER ?; THE FOLLOWING TWO FUNCTION CODES OPERATE ON 256 WORD BLOCKS=; OF DATA (4 SECTORS) THE DRIVER AUTOMATICALLY INTERLEAVESD6 ; AND SKEWS SECTORS TO OPTIMIZE THE TRANSFER OF DATA9!; SO THAT A LONG READ/WRITE MAY BE DONE WITHOUT LOOSINGU9"; A REVOLUTION OF THE DISK. THE INTERLEAVE FACTOR IS 2 #; AND THE SKEW FACTOR IS 6.O.$; IO.RLB - READ LOGICAL BLOCKS OF 256. WORDS0%; IO.WLB - WRITE LOGICAL BLOCKS OF 256. WORDS.&; :'; IF DELETED DATA IS READ, THE STATUS CODE RETURNED WILL%(; BE IS.RDD, OTHERWISE IT IS IS.SUCI);D*1* .MCALL HWDDF$,PKTDF$,QIOSY$,SCBDF$ ; GM001 /, HWDDF$ ; DEFINE HARDWARE REGISTERS ;**-1K'- PKTDF$ ; DEFINE I/O PACKET OFFSETSA- QIOSY$ ; GM001/ - SCBDF$ ,,SYSDEF ; GM001/; ;**-10; EQUATED SYMBOLSR1; 2!3RETRY = 8. ; ERROR RETRY COUNTS/4DXNUM = 4 ; NUMBER OF REGISTERS TO ERROR LOGR56;O47; RX11 DEVICE REGISTER OFFSETS AND BIT DEFINITIONS8;L9%:RXCS = 0 ; CONTROL STATUS REGISTER ;RXDB = 2 ; DATA BUFFERI<UNIT = 20 ; UNIT SELECT BIT=DONE = 40 ; RX11 DONE">INTEBL = 100 ; INTERRUPT ENABLE0?TR = 200 ; RX11 TRANSFER READY BIT (CPU-SILO)!@INIT = 40000 ; INITIALIZE RX11YAB; C; FUNCTION CODESD;DEGO = 1 ; GO BITFFILL = 0+GO ; FILL SILOGEMPTY = 2+GO ; EMPTY SILO HWRITE = 4+GO ; WRITE A SECTORIREAD = 6+GO ; READ A SECTORJRDSTS = 12+GO ; READ STATUS%KWRTDD = 14+GO ; WRITE DELETED DATAO"LRDERC = 16+GO ; READ ERROR CODEMN;G#O; STATUS REGISTER BIT DEFINITIONSP;=QRDD = 100 ; DELETED DATA READ;SRDY = 200 ; UNIT READY TU;PV; LOCAL DATAW; X;1JY; CONTROLLER TABLE AND RETRY COUNT TABLE ( INDEXED BY CONTROLLER NUMBER)Z; ;[RTTBL: .BLKW R$$X11 ; ERROR RETRY COUNT FOR CURRENT UNITL&\CSRSV: .BLKW R$$X11 ; CSR SAVE AREA\; ; GM001+\; MAKE GTPKT$ A LOCAL MACRO ; GM001D\; ; GM0015\ .MACRO GTPKT$ DEV,NCTRLR,ADDR,UCBSV,SUC ; GM001 \ CALL @GTPKT ; GM001\ .IF B ; GM001\ BCC 65535$ ; GM001\ RETURN ; GM001D\65535$: ; GM001\ .IFF ; GM001 \ BCS ADDR ; GM001\ .ENDC ; GM001\ .IF B ; GM001 \ $$$=0 ; GM001\ .IF B ; GM001U\ .IF EQ $$$ ; GM001!\ MOV R5,S.OWN(R4) ; GM0011\ .ENDC ; GM001\ .ENDC ; GM001\ .IFF ; GM001R \ .IF GT NCTRLR-1 ; GM001!\ MOV R5,UCBSV(R3) ; GM001 \ .IFF ; GM001 \ MOV R5,UCBSV ; GM001 \ .ENDC ; GM001\ .ENDC ; GM001\ .ENDM ; GM001\; ; GM0012\; EXECUTIVE ENTRY POINT VECTOR TABLE ; GM001\; ; GM001<\EXEVEC: .WORD 0 ; FLAG FOR VECTOR NOT YET FILLED ; GM001\ ; GM001 $\ALOCB: .WORD $ALOCB ; GM001$\BMSET: .WORD $BMSET ; GM001$\DEACB: .WORD $DEACB ; GM001$\DTOER: .WORD $DTOER ; GM001$\DVERR: .WORD $DVERR ; GM001$\ERRSQ: .WORD $ERRSQ ; GM001"\FORK: .WORD $FORK ; GM001$\GTPKT: .WORD $GTPKT ; GM001$\IODON: .WORD $IODON ; GM001$\VOLVD: .WORD $VOLVD ; GM001\; ; GM001$\KISR6: .WORD KISAR6 ; GM001\; 00y€a4a“_c”_d–_k›’ ; GM001)\EXEVCL=<<<.-EXEVEC>/2>-1> ; GM001 \; ; GM001^; ;**-1_; DRIVER DISPATCH TABLE `; :` DDT$ DX,R$$X11,,,,NEW ;GENERATE DISPATCH TABLE ; GM001b ;**-1Gc;+1d; *** - DXINI FLOPPY DISK CONTROLLER INITIATORDe;SFf; THIS ROUTINE IS ENTERED FROM THE QIO DIRECTIVE WHEN AN I/O REQUESTIg; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPOGATE THEOFh; EXECUTION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY,Gi; THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST. OTHERWISEJj; A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSHk; THE NEXT I/O OPERATION IS INITIATED. A RETURN TO THE CALLER IS THEN l; EXECUTED. m; n; INPUTS: Do; R5 - ADDRESS OF UCB WHICH IS ASSOCIATED WITH CONTROLLER TO BE INp;D q; OUTPUTS:>r; IF THE CONTROLLER ASSOCIATED WITH THE SPECIFIED UCB IS NOTCs; BUSY AND AN I/O REQUEST IS WAITING TO BE PROCESSED, THE REQUESTI@t; IS DEQUEUED AND THE DRIVER INITIATES THE REQUESTED FUNCTION.u;Ev;- w .ENABL LSBT:xDXINI: GTPKT$ DX,R$$X11 ; GET NEXT I/O PACKET TO PROCESSyz;E2{; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT|; "}; R1 - ADDRESS OF THE I/O PACKETB~; R2 - PHYSICAL UNIT NUMBER OF THE DEVICE TO PERFORM FUNCTION ON,; R3 - CONTROLLER NUMBER MULTIPLIED BY TWO€; R4 - ADDRESS OF SCBL9�; R5 - ADDRESS OF UCB FOR DEVICE TO PERFORM FUNCTION ONA‚; .ƒ; RX11 FLOPPY DISK I/O REQUEST PACKET FORMAT„; #…; WD. 00 -- I/O QUEUE THREAD WORDT1†; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER3‡; WD. 02 -- ADDRESS OF TCB OF THE REQUESTING TASKOCˆ; WD. 03 -- POINTER TO SECOND LUN WORD OF REQUESTING TASKS HEADER7‰; WD. 04 -- CONTENTS OF FIRST LUN WORD ( UCB ADDRESS) CŠ; WD. 05 -- I/O FUNCTION CODE (IO.RLB, IO.RPB, IO.WLB, OR IO.WPB) 1‹; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK1Œ; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCKID�; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT +1400004Ž; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE,�; WD. 12 -- RELOCATION BIAS OF DATA BUFFER,�; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER)‘; WD. 14 -- NUMBER OF BYTES TO TRANSFERU ’; WD. 15 -- NOT USED (IGNORED)7“; WD. 16 -- LOW BYTE MUST BE ZERO, HIGH BYTE NOT USED-.”; WD. 17 -- LOGICAL OR PHYSICAL BLOCK NUMBER•; WD. 20 -- NOT USED–;A'—; DRIVER USAGE OF WORDS IN I/O PACKET77˜; I.PRM+6 (WD. 15) - STATUS REGISTER AFTER INTERRUPT/9™; I.PRM+10 (WD. 16) - LOGICAL OR PHYSICAL SECTOR NUMBERD/š; I.PRM+12 (WD. 17) - SIZE OF "THIS" TRANSFER6›; I.PRM+14 (WD. 20) - PHYSICAL SECTOR NUMBER (1-26.)5œ; I.PRM+15 (WD. 20) - PHYSICAL TRACK NUMBER (0-77.)O�;Ež;TŸ; INITIALIZE DRIVER  ;S-¡10$: MOV #RETRY,RTTBL(R3) ; SET RETRY COUNTR2¡ CALL @VOLVD ; VALIDATE VOLUME VALID ; GM001&£ BCS 16$ ; IF CS WE FAILED ;**-1¤ TST R0 ; TRANSFER FUNCTION?D¥ BPL 16$ ; IF PL NO,¦ TSTB I.PRM+10(R1) ; HIGH BLOCK SPECIFIED?§ BEQ 20$ ; NO¨15$: JMP 180$ ; YES, ERROR ©16$: JMP 210$ ; EXIT+ª;D'«; SET UP FIRST BLOCK OR SECTOR NUMBERR¬;(A­20$: MOV I.PRM+12(R1),R0 ; GET PHYSICAL OR LOGICAL BLOCK NUMBERH1® MOV #128.,I.PRM+12(R1) ; PRESET TRANSFER SIZEA9¯ BITB #IO.RPB&377,I.FCN(R1) ; PHYSICAL BLOCK FUNCTION? ° BNE 30$ ; YESL-± ASL R0 ; CONVERT TO LOGICAL SECTOR NUMBER1² ASL R0 ; WHICH IS LBN*41%³30$: MOV R0,I.PRM+10(R1) ; STORE ITB+´ MOV #RDSTS,R0 ; GET READ STATUS FUNCTIONGµ TSTB U.UNIT(R5) ; UNIT 1?¶ BEQ 31$ ; IF EQ NO*· BIS #UNIT,R0 ; YES, SET UNIT SELECT BIT4¸31$: MOVB S.CON(R4),R3 ; RETREIVE CONTROLLER INDEX(¹ MOV R0,CSRSV(R3) ; SAVE THIS FUNCTION,º MOVB #2,RTTBL+1(R3) ; FLAG THE GET STATUS*» MOV S.CSR(R4),R2 ; RETREIVE CSR ADDRESS#¼ MOV R0,(R2) ; DO THE GET STATUSC!½ JMP 155$ ; START THE FUNCTIONR0¾32$: MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS+¿ BIT #RDY,I.PRM+6(R1); IS THE UNIT READY?)À BNE 35$ ; IF NE YEST(Á33$: CALL LOGERR ; LOG UNIT NOT READY5 MOV #IE.DNR&377,R0 ; SET UNIT NOT READY ERROR CODENà JMP 200$ ; GOOD-BYE!0Ä35$: MOV S00yˆaë``t`TADATADATADATADATADATA.PKT(R4),R3 ; GET I/O PACKET ADDRESS1Å CALL TRKSEC ; CONVERT BLOCK # TO TRACK/SECTORN$Æ BCS 15$ ; IF CS BAD BLOCK NUMBER(Ç MOV S.CSR(R4),R2 ; GET ADDRESS OF CSR3È CMPB #IO.WLB/256.,I.FCN+1(R3) ; WRITE FUNCTION?JÉ BNE 140$ ;IF NE NOÊ;RË; FILL SILO BEFORE WRITEÌ;/8Í CALL SETBUF ; SET UP BUFFER POINTER AND MAPPING REGI.Î MOV #FILL,(R2) ; SET "FILL BUFFER" FUNCTION+Ï70$: CLR R3 ; ASSUME NO DATA TO TRANSFERR#Ð DEC R1 ; MORE DATA TO TRANSFER?Ñ BLT 74$ ; NO%Ò MOVB (R0)+,R3 ; YES, GET NEXT BYTE ,Ó74$: BITB #TR!DONE,(R2) ; CONTROLLER DONE?Ô BMI 75$ ; IF MI YESBÕ BEQ 74$ ; IF EQ NOÖ BR 90$ ; SILO IS FULLR/×75$: MOVB R3,RXDB(R2) ; PUT NEXT BYTE IN SILON(Ø BR 70$ ; AND WAIT TILL IT'S ACCEPTED&Ù90$: TST R1 ; ALL BYTES TRANSFERED?Ú BMI 130$ ; IF MI YES'Û95$: JMP DXRTY ; RETRY LAST FUNCTIONÜ;VÝ; EMPTY SILO AFTER READFÞ;U5ß100$: MOV #EMPTY,(R2) ; SET "EMPTY BUFFER" FUNCTION8à CALL SETBUF ; SET BUFFER POINTER AND MAPPING REGISTE-á110$: BITB #TR!DONE,(R2) ; CONTROLLER DONE? â BMI 111$ ; IF MI YESã BEQ 110$ ; IF EQ NOMä BR 120$ ; SILO IS EMPTYO2å111$: MOVB RXDB(R2),R3 ; GET NEXT BYTE FROM SILOæ DEC R1 ; DO WE WANT IT?ç BLT 110$ ; NO (è MOVB R3,(R0)+ ; YES, PUT IT IN BUFFERé BR 110$ ; GET NEXT BYTE 'ê120$: TST R1 ; ALL BYTES TRANSFERED?Aë BGT 95$ ; IF GT ERRORT,ì MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS'í CALL NXTSEC ; UPDATE TO NEXT SECTORLî BNE 35$ ; IF NE CONTINUEï JMP 193$ ; FINISHED1ð;I+ñ; INITIATE TRANSFER BETWEEN SILO AND DISK1ò;;1ó130$: MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS (ô MOV #WRITE,R0 ; ASSUME WRITE FUNCTION(õ MOV I.FCN(R3),R1 ; COPY FUNCTION CODE%ö BIC #7,R1 ; REMOVE QUALIFIER BITSV'÷ CMP #IO.WDD,R1 ; WRITE DELETED DATA? ø BNE 141$ ; IF NE NO4ù MOV #WRTDD,R0 ; SET "WRITE DELETED DATA" FUNCTION ú BR 141$ ;(û140$: MOV #READ,R0 ; SET READ FUNCTION!ü141$: TSTB U.UNIT(R5) ; UNIT 1?Sý BEQ 142$ ; IF EQ YES+þ BIS #UNIT,R0 ; YES, SET TO SELECT UNIT 15ÿ142$: MOVB S.CON(R4),R1 ; RETREIVE CONTROLLER INDEX$3 MOV R0,CSRSV(R1) ; SAVE FUNCTION AND UNIT NUMBER#! CLRB RTTBL+1(R1) ; RESET FLAGS' MOV R0,(R2) ; INITIATE THE FUNCTION4143$: BITB #TR!DONE,(R2) ; TRANSFER READY OR DONE?# BMI 150$ ; IF MI TRANSFER READY  BEQ 143$ ; IF EQ LOOP,' BR 95$ ; ERROR, NO TRANSFER REQUEST8150$: MOVB I.PRM+14(R3),RXDB(R2) ; LOAD SECTOR NUMBER4151$: BITB #TR!DONE,(R2) ; TRANSFER READY OR DONE?#  BMI 152$ ; IF MI TRANSFER READYE  BEQ 151$ ; IF EQ LOOPS'  BR 95$ ; ERROR, NO TRANSFER REQUEST7 152$: MOVB I.PRM+15(R3),RXDB(R2) ; LOAD TRACK NUMBERC5 155$: MOVB S.ITM(R4),S.CTM(R4) ; SET TIME OUT COUNTA3  CALL @BMSET ;SET I/O ACTIVE IN BITMAP ; GM001E4 BIS #INTEBL,(R2) ;;; SET INTERRUPT ENABLE ;**-1 ; GM001Q;+ ; GM001R8; DXKRB-CONTROLLER ONLINE/OFFLINE ROUTINE ; GM001; ; GM001;- ; GM001N2DXKRB: BCS 2$ ;IF CS OFFLINE REQUEST ; GM001* TST EXEVEC ;IF ALREADY DONE ; GM001! BNE 2$ ;SKIP THIS ; GM001 $ MOV R2,-(SP) ;SAVE R2 ; GM001$ MOV R3,-(SP) ;SAVE R3 ; GM001, MOV KINAR6,-(SP) ;SAVE KINAR6 ; GM0019 MOV @#112,R0 ;GET ADDRESS OF TABLE OF ENTRIES ; GM001BD MOV (R0),R0 ;GET ADDRESS OF APR BIAS (1ST WORD IN TABLE) ; GM001< MOV (R0),KINAR6 ;MAP COMMON THROUGH I-SPACE APR6 ; GM001- MOV #EXEVEC,R3 ;POINT TO VECTOR ; GM001-5 MOV #EXEVCL,R2 ;SPECIFY LENGTH OF VECTOR ; GM001U1 CALL @#140004 ;TRANSLATE THE VECTOR ; GM001;/ MOV (SP)+,KINAR6 ;RESTORE KINAR6 ; GM001V( MOV (SP)+,R3 ;RESTORE R3 ; GM001' MOV (SP)+,R2 ;RESTORE R2 ; GM001,2$: RETURN ; GM001-; DXPWF - POWER FAIL ENTRY POINT ;**-1I=; POWER FAIL IS HANDLED BY THE DEVICE TIMING OUT, THEREFORED=; NO WNRK IS DNNE HERE. IT WILL BE HANDLED WHEN THE DEVICEA; TIME OUT ENTRY IS EXECUTED.R;IDXPWF: ; GM001V; ; GM001+; UNIT STATUS CHANGE ROUTINE ; GM001;DXUCB: 00y�a4a“_c”_d–_k›’; GM001M ; GM001N; ;**-1"; DXCAN - CANCEL I/O ENTRY POINT6; CANCEL I/O IS A NOP OP FOR FILE STRUCTURED DEVICES;DXCAN: RETURN ;;;+:; *** - $DXINT - RX11 FLOPPY DISK INTERRUPT ENTRY POINT ;A!;-8" INTSE$ DX,PR5,R$$X11 ;;; GENERATE INTERRUPT SAVE CODE!# MOV R3,-(SP) ;;; SAVE REGISTERD'$ MOV U.SCB(R5),R4 ;;; GET SCB ADDRESS.% MOV S.PKT(R4),R3 ;;; GET I/O PACKET ADDRESS'& MOV S.CSR(R4),R4 ;;; GET CSR ADDRESSE7' MOV RXDB(R4),I.PRM+6(R3) ;;; SAVE CONTROLLER STATUS $( MOV (SP)+,R3 ;;; RESTORE REGISTER*) BIC #INTEBL,(R4) ;;; DISABLE INTERRUPTS4) CALL @FORK ;;; CREATE A SYSTEM PROCESS ; GM001)+ MOV R4,R2 ; COPY CSR ADDRESS ;**-1X%, MOV U.SCB(R5),R4 ; GET SCB ADDRESS+- MOVB S.CON(R4),R3 ; GET CONTROLLER INDEXE. TST (R2) ; ANY ERRORS?/ BPL 160$ ; IF PL NOE-0 BITB #2,RTTBL+1(R3) ; GET STATUS FUNCTION?1 BEQ 156$ ; IF EQ NO 2 JMP 33$ ; DRIVE NOT READYR'3156$: CALL LOGERR ; LOG DEVICE ERROR(4 BR DXRTY ; RETRY FUNCTIONO55160$: BITB #1,RTTBL+1(R3) ; INITIALIZE IN PROGRESS?B6 BNE 170$ ; IF NE YES-7 BITB #2,RTTBL+1(R3) ; GET STATUS FUNCTION?M8 BEQ 161$ ; IF EQ NOV#9 JMP 32$ ; TEST IF UNIT IS READY6:161$: MOV S.PKT(R4),R3 ; RETREIVE I/O PACKET ADDRESS); CMPB #IO.RLB/256.,I.FCN+1(R3) ; READ?;< BNE 165$ ; IF NE NO = JMP 100$ ; GO EMPTY SILO,>165$: CALL NXTSEC ; UPDATE TO NEXT SECTOR? BEQ 195$ ; ALL DONE "@170$: JMP 35$ ; WRITE MORE DATA0A180$: MOV #IE.BLK&377,R0 ; SET BAD BLOCK ERROR B BR 210$ ;I4C190$: MOV #IE.VER&377,R0 ; SET UNRECOVERABLE ERROR D BR 200$ ;SCE193$: BITB #IO.RPB&377,I.FCN(R3) ; READ PHYSICAL BLOCK FUNCTION?Q0F BEQ 195$ ; NO, THEN IGNORE DELETED DATA MARK<G MOV #IS.RDD&377,R0 ; YES, DEFAULT ON READ TO DELETED DATA/H BIT #DD,I.PRM+6(R3) ; WAS DELETED DATA READ? I BNE 200$ ; YES3J195$: MOV #IS.SUC&377,R0 ; NO, SET NORMAL SUCCESSX1K200$: MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS ,L MOV I.PRM+4(R1),R1 ; SET BYTES TRANSFERED9M SUB U.CNT(R5),R1 ; CALCULATE BYTES ACTUALLY TRANSFERED&0N MOVB S.CON(R4),R3 ; RETREIVE CONTROLLER INDEX,O MOVB RTTBL(R3),R2 ; SET FINAL RETRY COUNT/P BIS #RETRY*256.,R2 ; SET INITIAL RETRY COUNTG+P210$: CALL @IODON ; SET DONE ; GM001 /R JMP DXINI ; TRY FOR ANOTHER REQUEST ;**-1DS;MT;+1U; *** - DXOUT - FLOPPY DISK TIMEOUT ENTRY POINT9V;-W,XDXOUT: CALL LOGTMO ;;; LOG DEVICE TIMEOUTYZ;K[; RETRY LAST FUNCTION \;S5]DXRTY: MOVB S.CON(R4),R3 ; RESTORE CONTROLLER INDEXB,^ MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS*_ BITB #IQ.X,I.FCN(R1) ; INHIBIT RETRIES?` BNE 190$ ; IF NE YES%a DECB RTTBL(R3) ; ANY RETRIES LEFT?Sb BEQ 190$ ; NO, ERROR8c MOVB #1,RTTBL+1(R3) ; YES, SET INITIALIZE IN PROGRESS+d MOV #INIT,CSRSV(R3) ; SAVE FUNCTION CODE *e MOV #INIT,(R2) ; INITIALIZE RX01 DRIVESf JMP 155$ ; AND DO IT g .DSABL LSBhi;+j; **-LOGERR-LOG DEVICE ERROR k; **-LOGTMO-LOG DEVICE TIMEOUTl;?m; THESE ROUTINES WILL ALLOCATE A CORE BLOCK, FILL IT WITH THEV>n; REGISTER INFORMATION, CALL THE APPROPRIATE EXECUTIVE ERRORBo; LOGGING ROUTINE, DEALLOCATE THE CORE BLOCK, AND RETURN BACK TOp; THE CALLER.q;Q r; INPUTS:Es; R3=CONTROLLER INDEXRt; R4=SCB ADDRESSu; R5=UCB ADDRESSv;# w; OUTPUTS:x; R2=CSR ADDRESSy; R4=SCB ADDRESSz; R5=UCB ADDRESS{;S |; R0, R1 AND R3 ARE DESTROYED.};-~  .ENABL LSB*7LOGERR: MOV DVERR,-(SP) ; LOG DEVICE ERROR ; GM001T� BR 10$ ; ;**-1S;�LOGTMO: MOV DTOER,-(SP) ;;; LOG DEVICE TIMEOUT ; GM001I?ƒ10$: MOV #DXNUM*2,R1 ; GET NUMBER OF BYTES TO ALLOCATE ;**-1T4ƒ CALL @ALOCB ; ALLOCATE THE ERROR BLOCK ; GM001 … BCC 20$ ; IF CC OK ;**-11… INC @ERRSQ ; INDICATE A MISSED ERRO ; GM001 )… CMP (SP)+,DTOER ; TIMEOUT? ; GM001C ˆ BNE 30$ ; IF NE NO ;**-25‰ BIC #INTEBL,@S.CSR(R4) ;;; CLEAR INTERRUPT ENABLE. Š MTPS #0 ;;; ALLOW INTERRUPTS ‹ BR 30$ ;+Œ20$: MOV R0,R1 ; COPY CORE BLOCK ADDRESS0*� MOV S.CSR(R4),R2 ; RETREIVE CSR ADDRESS$Ž MOV (R2),(R00y˜aë``t`TADATADATADATADATADATA1) ; SAVE CSR CONTENTS-� BIS CSRSV(R3),(R1)+ ; SET BITS 0-4 IN RXCSL!� MOV RXDB(R2),(R1)+ ; SAVE RXDBL,‘ MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS%’ MOV I.PRM+6(R3),(R1)+ ; SAVE RXESI5“ MOV #RDERC,(R2) ; EXECUTE READ ERROR CODE FUNCTIONT(”25$: BITB #DONE,(R2) ; WAIT UNTIL DONE• BEQ 25$ ; IF EQ NO – MOV RXDB(R2),(R1) ; SAVE RXER&— MOV R0,R2 ; GET CORE BLOCK ADDRESS˜ CALL @(SP)+ ; LOG THE ERROR,+™ MOV R2,R0 ; GET BACK CORE BLOCK ADDRESSR6š MOV #DXNUM*2,R1 ; GET NUMBER OF BYTES TO DEALLOCATE6š CALL @DEACB ; DEALLOCATE THE ERROR BLOCK ; GM0017œ30$: MOV S.CSR(R4),R2 ; RETREIVE CSR ADDRESS ;**-1R � RETURN ;K ž .DSABL LSBMŸ ¡;+@¢; *** - TRKSEC - CONVERT LOGICAL OR PHYSICAL BLOCK NUMBER TO£; TRACK-SECTOR PAIR 5¤; FROM ALGORITHM BY J GILBERT MODIFIED BY H. JACOBS¥;R ¦; INPUT:§; R3 - I/O PACKET ADDRESS -¨; I.PRM+10(R3) - LOGICAL OR PHYSICAL SECTORH©;O ª; OUTPUT:,!«; I.PRM+14(R3) - SECTOR (1-26.) ¬; I.PRM+15(R3) - TRACK (0-77.)­; R3 - UNCHANGED®; C CLEAR - VALID BLOCKA2¯; C SET - BAD BLOCK NUMBER (PHYSICAL OR LOGICAL)°;E±;-=²TRKSEC: MOV I.PRM+10(R3),R1 ; GET LOGICAL OR PHYSICAL BLOCK³ MOV #8.,R0 ; SET LOOP COUNTT´ MOV #6400,R2 ; SET DIVISORE,µ1$: CMP R2,R1 ; DOES 26 GO INTO DIVIDEND?#¶ BHI 2$ ; BRANCH IF NOT, C CLEAR)· SUB R2,R1 ; SUBTRACT 26 FROM DIVIDENDR¸ SEC ; SET CARRY+¹2$: ROL R1 ; SHIFT DIVIDEND AND QUOTIENTPº DEC R0 ; DONE?» BGT 1$ ; NO, LOOP!¼ MOVB R1,R0 ; GET TRACK NUMBER ½ CLRB R1 ; CLEAR TRACK NUMBER&¾ SWAB R1 ; SHIFT DONE SECTOR NUMBER7¿ BITB #IO.RPB&377,I.FCN(R3) ; PHYSICAL BLOCK WANTED?RÀ BNE 10$ ; YES 'Á CMP #12.,R1 ; NO, C=1 IF 13<=R1<=25L) ROL R1 ; DOUBLE FOR INTERLEAVE FACTOR"à ASL R0 ; ADD TRACK -TRACK SKEWÄ ADD R0,R1 ; SKEW BY 2*TRACKNÅ ADD R0,R1 ; SKEW BY 4*TRACKTÆ ADD R0,R1 ; SKEW BY 6*TRACK;!Ç ASR R0 ; RESTORE TRACK NUMBERIÈ MOV #26.,R2 ; SET MODULUS 7É5$: SUB R2,R1 ; MODULO SECTOR INTO RANGE -26. TO -1.A)Ê BGE 5$ ; LOOP TILL REMAINDER GOES NEGR&Ë ADD R2,R1 ; CONVERT TO RANGE 0-25.#Ì INC R0 ; LBN0 STARTS ON TRACK 1Y'Í10$: INC R1 ; CONVERT TO RANGE 1-26.+Î MOV R1,I.PRM+14(R3) ; SAVE SECTOR NUMBERR+Ï MOVB R0,I.PRM+15(R3) ; SAVE TRACK NUMBERL<Ð CMP #77.*256.,I.PRM+14(R3) ; IS IT A VALID TRACK/SECTOR? Ñ RETURN ; ÒÓ;+9Ô; *** - NXTSEC - UPDATE BLOCK NUMBER , BUFFER ADDRESSSÕ; AND BUFFER POINTERÖ;, ×; INPUT:Ø; R3 - I/O PACKET ADDRESSDÙ; R5 - UCB ADDRESS'Ú; I.PRM+10(R3) - CURRENT BLOCK NUMBERI8Û; I.PRM+12(R3) - BYTES TRANSFERED DURING LAST FUNCTION&Ü; U.CNT(R5) - BYTES LEFT TO TRANSFERÝ; U.BUF(R5) - BUFFER ADDRESSÞ; ß; OUTPUT:R'à; I.PRM+10(R3) - UPDATED BLOCK NUMBER0%á; U.BUF(R5) - UPDATED BY 128. BYTESC5â; U.CNT(R5) - UPDATED BY NUMBER OF WORDS TRANSFERED? ã; Z SET - ALL BYTES TRANSFERED$ä; Z CLEAR - MORE BYTES TO TRANSFER å; C CLEAR - VALID TRACK/SECTORæ; C SET - BAD BLOCK NUMBERç;Iè;+0éNXTSEC: INC I.PRM+10(R3) ; UPDATE BLOCK NUMBER0ê ADD #2,U.BUF(R5) ; UPDATE MEMORY BLOCK NUMBER>ë SUB I.PRM+12(R3),U.CNT(R5) ; UPDATE BYTES LEFT TO TRANSFER ì RETURN ; íî;+Cï; *** - SETBUF - SET UP BUFFER POINTER FOR CPU - SILO TRANSFERSKð;E ñ; INPUT:ò; R3 - I/O PACKET ADDRESSCó; R5 - UCB ADDRESSô;Y õ; OUTPUT:R$ö; I.PRM+12(R3) - BYTES TO TRANSFER÷; R0 - BUFFER ADDRESS ø; R1 - BYTES TO TRANSFERù;Aú;-1ûSETBUF: MOV U.BUF+2(R5),R0 ; GET BUFFER ADDRESSI/ü MOV #128.,R1 ; DEFAULT TO 128. BYTE TRANSFER 2ý CMP U.CNT(R5),R1 ; 128. BYTES LEFT TO TRANSFER?þ BHIS 10$ ; YES,ÿ MOV U.CNT(R5),R1 ; NO, GET RESIDUAL COUNT410$: MOV R1,I.PRM+12(R3) ; STORE BYTES TO TRANSFER9 MOV U.BUF(R5),@KISR6 ; SET MAPPING REGISTER ; GM001U RETURN ; ;**-1 .END5 - UCB ADDRESSô;Y õ; OUTPUT:R$ö; I.PRM+12(R3) - BYTES TO TRANSFER÷; R0 - BUFFER ADDRESS ø; R1 - BYTES TO TRANSFERù;Aú;-1ûSETBUF: MOV U.BUF+2(R5),R0 ; GET BUFFER ADDRESSI/ü MOV #128.,R1 ; DEFAULT TO 128. BYTE TRANSFER 2ý CMP U.CNT00z a4a“_c”_d–_k›’% .TITLE SAVXT - DW/DZ COMMON DRIVER .IDENT /01.06/O;I7; COPYRIGHT (C) 1982 BY DIGITAL EQUIPMENT CORPORATION:; ALL RIGHTS RESERVED.;S>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;I ; . ; P. J. BEZEREDI / I. P. ZATKOVICH 05-MAY-82 ;M ; MODIFIED BY: ; ; T. LEKAS 11-JUL-822 ; TL203 -- REMOVE UNNEEDED INSTRUCTIONS IN ORDER ; TO GET SAVXT TO FIT. ;  ; P. J. BEZEREDI 13-JUL-82, ; PB322 -- STREAMLINE DRIVER EVEN FURTHER. ;. ; T. LEKAS 15-JUL-82= ; TL205 -- FIX PB322 - THE DRIVER WAS UNMAPPING ITSELF WHENS ; WHEN RUNNING IN APR6S ;I ; M. Pettengill 15-July-1982; ; MLP074 - Correct retry logic to actually retry 4 times 5 ; and to jump to the correct location in boot romI ;- ;2?; THIS MODULE CONTAINS A SPECIAL DRIVER USED BY BOOT AND SAVE $; TO READ AND WRITE SYSTEM IMAGES.;; DRIVER INPUTS:; R2 = NOT USEDJ; R3 = NOT USED2; R4 = UNIT NUMBER/; R5 = 0 USE CSR ADDRESS STORED IN THE DRIVERU(; R5 <> 0 USE CSR ADDRESS STORED IN R5;N; DRIVER OUTPUTS:; R0 = RESIDUAL BLOCK COUNTS@; R2 = POSSIBLE MEMORY SIZE FROM CONFIGURATION TABLE ; PB322; R1 = DEVICE NAME IN ASCIIe; R4 = PHYSICAL UNIT NUMBERr; R5 = CSR ADDRESS; .MCALL HWDDF$ HWDDF$I!";I#; DRIVER TABLE$;A%!& .PSECT DRVTAB,RW,D,GBL,REL,CONI'"( .ASCII /XT/ ; XT COMMON DRIVER)) .WORD XTLLEN ; ADDRESS OF LOAD LENGTHU** .WORD XTSA ; ADDRESS OF BUFFER ADDRESS/+ .WORD XTFUN ; ADDRESS OF FUNCTION CODE/UNITR', .WORD $XTDRV ; DRIVER ENTRY ADDRESS 2- .WORD /2; SIZE OF DRIVER IN WORDS#. .WORD 160 ; WRITE FUNCTION CODE3"/ .WORD 100 ; READ FUNCTION CODE0 .WORD 0 ; UNIT SELECT BITS/1 .WORD XTFUN ; ADDRESS OF FUNCTION CODE WORD(2 .WORD XTCSR ; ADDRESS OF CSR ADDRESS3 4 .PSECTC56;R7; SPECIAL DRIVER8;.9+:$XTDRV::BR XT0 ;;; BR AROUND FIXED STUFF;+;XTNAM: .WORD "XT ;;; GENERIC DEVICE NAMED)<XTCSR: .WORD 0 ;;; DEFAULT CSR ADDRESSD3=XTFUN: .WORD 0 ;;; FUNCTION CODE AND UNIT NUMBERE(>XT0: TST R5 ;;; CSR ADDRESS SUPPLIED?? BNE 5$ ;;; IF NE YES-@ MOV XTCSR,R5 ;;; NO, GET SAVED CSR ADDRESSD8A5$: MOV #1,@#SR0 ;;; MAKE SURE MEMORY MANAGEMENT IS ONFA MOV #1400,@#KISAR3 ;;; MAP TO POSSIBLE CONFIGURATION TABLE ; PB3226A MOVB @#77707,XTSIZ+1;;; SAVE MEMORY SIZE ; PB322*B MOV PC,R3 ;;; SET ADDRESS FOR PIC CODEC ADD #,R3 ;;; .../D MOV @#6,XTBLK ;;; SAVE STARTING BLOCK NUMBER.&E MOVB R4,1(R3) ;;; SAVE THE UNIT NO..F BITB #20,(R3) ;;; IS THIS A WRITE FUNCTION?G BEQ 6$ ;;; IF EQ NOD5H MOV 15$,MOVE ;;; SET GENERIC FILL SILO INSTRUCTIONR(I6$: CMP #401,(R5) ;;; IS THIS AN RD50?J BNE 20$ ;;; IF NE NOK; L; RD50 SETUP CODEMM;4*N MOV #"DW,XTNAM ;;; SET RD50 DEVICE NAME0O BIC #100000,MOVE ;;; CONVERT A MOVB TO A MOVB-P BITB #20,(R3) ;;; IS THIS A READ FUNCTION?DQ BEQ 10$ ;;; IF EQ YES#*R MOVB #60,(R3) ;;; NO, SET WRITE COMMANDS BR XTRTY ;;;)T10$: MOVB #40,(R3) ;;; SET READ COMMANDTU BR XTRTY ;;;0V15$: MOVB (R1)+,(R2) ;;; FILL SILO INSTRUCTIONW;QX; RX50 SETUP CODE Y;E.Z20$: MOV #"DZ,XTNAM ;;; SET RX50 DEVICE NAME [ ASL R4 ;;; SHIFT UNIT NUMBER$\ BISB R4,(R3) ;;; SET UNIT NUMBER];D^; COMMON PARAMETER SETUP_;E7`; TEST NUMBER OF RETRIES. IF MORE THAN FOUR, QUIT ANDB3a; JUMP TO DIAGNOSTIC ROM TO CONTINUE BOOT PROCESSIb; WITH NEXT DEVICE.Fc;E*dXTRTY: DEC (PC)+ ;;; ANY RETRIES LEFT ?e .WORD 4 ;;; (FOUR RETRIES) &e BPL 25$ ;;; IF NE YES ; MLP074De JMP @#167700 ;;; TRY BOOTING THE NEXT DEVICE IN SEQUENCE ; MLP0743h25$: MOV (PC)+,R1 ;;; GET BUFFER ADDRESS ;**-2 iXTSA: .WORD 0 ;;;*j CLC ;;; CONVERT TO 32WD BLOCK ADDRESSk ROL R1 ;;; ...l ROL R1 ;;; ...m SWAB R1 ;;; ...E2n MOV R1,@#KISAR3 ;;; SETUP APR3 TO MAP TO BUFFER#o MOV (PC)+,R4 ;;; GET LOAD LENGTH pXTLLEN: .WORD 0 ;;;$q MOV #0,SBLK ;;; SET STARTING LBNrXTBLK= .00z¨aë``t`TADATADATADATADATADATA-4 ;;;*sXTLOOP: MOV (PC)+,R1 ;;; GET CURRENT LBNtSBLK: .WORD 0 ;;;,t TST MOVE ;;; IS THIS AN RD50? ; PB322't BMI DZLOOP ;;; IF MI NO ; PB322Lw; ;**-2x; RD50 BASIC LOOPAy;S+zDWLOOP: TST 20(R5) ;;; IS THE UNIT BUSY?;){ BMI DWLOOP ;;; IF MI YES, WAIT FOR IT;"| INC R1 ;;; MAKE IT LOGICAL I/O} MOV R1,R2 ;;; COPY ITI+~ BIC #177760,R2 ;;; ISOLATE SECTOR NUMBER(/ ASH #-4,R1 ;;; RIGHT JUSTIFY TRACK AND HEAD;'€ CLR R0 ;;; GET READY FOR THE DIVIDE-� DIV #4,R0 ;;; CALCULATE CYLINDER AND HEADG!‚ MOVB R2,6(R5) ;;; SET SECTOR #;!ƒ MOVB R0,12(R5) ;;; SET TRACK # „ MOV R1,14(R5) ;;; SET HEAD # *… MOVB (R3),16(R5) ;;; START THE FUNCTION&† BR COMMON ;;; GET INTO COMMON LOOP‡; ˆ; RX50 BASIC LOOP;‰;B5ŠDZLOOP: CALL DZTRK ;;; CONVERT LBN TO DISK ADDRESSM(‹ MOVB (R3),4(R5) ;;; LOAD THE FUNCTION"Œ MOVB R1,10(R5) ;;; SET SECTOR # � MOVB R0,6(R5) ;;; SET TRACK ##Ž TSTB 22(R5) ;;; CLEAR RX50 SILOR�;;�; COMMON TRANSFER LOOP‘;4’COMMON: BITB #20,(R3) ;;; IS THIS A READ FUNCTION?“ BEQ 10$ ;;; IF EQ YES.” CALL SILO ;;; NO, FILL SILO BEFORE WRITING1•10$: CALL WAIT ;;; WAIT FOR FUNCTION TO FINISH (– BCS XTRTY ;;; IF CS ERROR, TRY AGAIN#— INC SBLK ;;; UPDATE CURRENT LBN;.˜ BITB #20,(R3) ;;; WAS THIS A READ FUNCTION?&™ BNE 20$ ;;; IF NE NO, TEST FOR END!š CALL SILO ;;; YES, EMPTY SILO 1›20$: SOB R4,XTLOOP ;;; LOOP IF MORE LBNS REMAIN)› BR XTDONE ;;; ALL FINISHED ; PB322� ;**-1 ž;!Ÿ; PERFORM SILO/MEMORY TRANSFERSS ; ¡ ¢ .ENABL LSB3£SILO: MOV #512.,R0 ;;; SET COUNT OF BYTES IN SILOS"¤ MOV R5,R2 ;;; COPY CSR ADDRESS,¥ ADD #20,R2 ;;; POINT TO RX50 DATA BUFFER.¦ MOV #60000,R1 ;;; SET BASE FOR APR6 MAPPING,¦ TST MOVE ;;; IS THIS AN RD50? ; PB322#¦ BMI 5$ ;;; IF MI NO ; PB322;4© SUB #10,R2 ;;; POINT TO RD50 DATA BUFFER ;**-2%ª ASR R0 ;;; CONVERT BYTES TO WORDSF*«5$: CMP #"DW,XTNAM ;;; IS THIS THE RD50?¬ BNE MOVE ;;; IF NE NO (­ TSTB 20(R5) ;;; READY FOR NEXT MOVE?® BPL 5$ ;;; IF PL NO.A¯MOVE: MOVB (R2),(R1)+ ;;; EMPTY SILO (WILL CHANGE TO FILL SILO)!° SOB R0,5$ ;;; LOOP UNTIL DONE9± ADD #10,@#KISAR3 ;;; UPDATE APR3 MAPPING BY 256. WORDS1(² TST (PC)+ ;;; IS THE NXM TRAP SETUP?-³TRPFLG: .WORD 0 ;;; FLAG=0 FIRST TIME THRU;´ BNE XIT ;;; IF NE NO/µ MOV @#4,(PC)+ ;;; SAVE CURRENT TRAP 4 VECTOR*¶TRPPC: .WORD 0 ;;;E· MOV @#6,(PC)+ ;;; ...¸TRPPS: .WORD 0 ;;;H2¹ INC TRPFLG ;;; INDICATE THAT WE HAVE BEEN HEREº MOV #PR7,@#6 ;;; SET NEW PS(» MOV PC,R0 ;;; CALCULATE TRAP ADDRESS¼ ADD #,R0 ;;; ...C½ MOV R0,@#4 ;;; SET NEW PC,¾XIT: RETURN ;;;N ¿ .DSABL LSB@ÀÁ;;"Â; WAIT FOR OPERATION TO COMPLETEÃ;TÄ2ÄWAIT: TST MOVE ;;; IS THIS THE RD50? ; PB322$Ä BMI 10$ ;;; IF MI NO ; PB322%È5$: TST 20(R5) ;;; DONE? ;**-3SÉ BMI 5$ ;;; IF MI NO*!Ê BITB #1,17(R5) ;;; ANY ERRORS?6Ë BR 20$ ;;; EXITP!Ì10$: TST 24(R5) ;;; START RX50;)Î15$: BITB #10,4(R5) ;;; DONE? ;**-1RÏ BEQ 15$ ;;; IF EQ NO"Ð BITB #200,4(R5) ;;; ANY ERRORS?Ñ20$: BEQ 30$ ;;; IF EQ NOÒ SEC ;;; INDICATE ERRORPÓ30$: RETURN ;;;;ÔÕ;S-Ö; CONVERT RX50 LBN TO PHYSICAL DISK ADDRESSO×;EØ.ØDZTRK: CLR R0 ;;; SIGN EXTEND R1 ; TL203=Ø DIV #10.,R0 ;;; DIVIDE BY # OF SECTORS PER TRACK ; TL203R,ä CMP #4,R1 ;;; C=1 IF 5<=R1<=9. ;**-11+å ROL R1 ;;; DOUBLE FOR INTERLEAVE FACTORB*æ ASL R0 ;;; ADD FOR TRACK TO TRACK SKEW!ç ADD R0,R1 ;;; SKEW BY 2*TRACK è ASR R0 ;;; RESTORE TRACK #é MOV #10.,R2 ;;; SET MODULUS;4ê30$: SUB R2,R1 ;;; PUT SECTOR IN RANGE -10. TO -13ë BGE 30$ ;;; IF GE LOOP UNTIL REMAINDER IS MINUS$ì ADD R2,R1 ;;; NORMALIZE SECTOR #í INC R1 ;;; FORGET SECTOR 01î INC R0 ;;; CONVERT TRACK TO LOGICAL OPERATION;'ï CMP R0,#120 ;;; DO WE NEED TO WRAP?0ð BNE 40$ ;;; IF NE NOñ CLR R0 ;;; WRAP AROUNDò40$: RETURN ;;; óô;Eõ; WE ARE FINISHED;ö;D÷øTRP4: &ùXTDONE: MOV TRPPC,@#4 ;;; RESTORE PCú MOV TRPPS,@#6 ;;; R00z°a{±a“_c”_d–_k›’ESTORE PSA*û MOV R4,R0 ;;; GET RESIDUAL BLOCK COUNT.û MOV (PC)+,R2 ;;; GET SYSTEM SIZE ; PB322"ûXTSIZ: .WORD 0 ;;; ; PB322$ü MOVB 1(R3),R4 ;;; GET UNIT NUMBER#ý MOV XTNAM,R1 ;;; GET DEVICE NAMERþXTEND: RETURN ;;; ÿ .ENDTRACK TO LOGICAL OPERATION;'ï CMP R0,#120 ;;; DO WE NEED TO WRAP?0ð BNE 40$ ;;; IF NE NOñ CLR R0 ;;; WRAP AROUNDò40$: RETURN ;;; óô;Eõ; WE ARE FINISHED;ö;D÷øTRP4: &ùXTDONE: MOV TRPPC,@#4 ;;; RESTORE PCú MOV TRPPS,@#6 ;;; R .TITLE DRGTKD .IDENT /06.00/ ; N; COPYRIGHT (c) 1982, 1983, 1984, AND 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;C>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;R ; VERSION 05.05  ;C ; D. N. CUTLER 27-MAR-74 ;T ;T ; PREVIOUSLY MODIFIED BY:E ;E ; T. J. MILLER ; P. J. BEZEREDI ; J. M. LAWLER ; T. M. MARTIN ; T. LEKAS ;C ;$G ; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 UPDATE F (OR VERSION 4.0) BY:I ;c ; ERIC POSTPISCHIL 9-MAR-87 @ ; 06.00 edp050 -- CORRECT MOVEMENT OF T.PRI FROM WORD TO BYTE' ; AS INDICATED BY HANS PILMEYER.N ;D!;B";D#; MACRO LIBRARY CALLSC$;N%& .MCALL HDRDF$,PCBDF$,TCBDF$'' HDRDF$ ;DEFINE TASK HEADER OFFSETS 3( PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS .) TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS*+;+!,; **-$DRGTK-GET TASK PARAMETERSL-;J.; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO FILL A SIXTEEN WORD BUFFER WITH/; TASK PARAMETERS.0;S1; DPB FORMAT: 2; $3; WD. 00 -- DIC(63.),DPB SIZE(2.)./4; WD. 01 -- ADDRESS OF A SIXTEEN WORD BUFFER.H5;I6; BUFFER FORMAT:7;D08; WD. 00 -- FIRST HALF OF ISSUING TASK'S NAME.19; WD. 01 -- SECOND HALF OF ISSUING TASK'S NAME. 2:; WD. 02 -- FIRST HALF OF TASK'S PARTITION NAME.3;; WD. 03 -- SECOND HALF OF TASK'S PARTITION NAME.F@<; WD. 04 -- FIRST HALF OF REQUESTER TASK NAME (NOT SUPPORTED).A=; WD. 05 -- SECOND HALF OF REQUESTER TASK NAME (NOT SUPPORTED).>; WD. 06 -- TASK PRIORITY.?; WD. 07 -- CURRENT TASK UIC.-&@; WD. 10 -- NUMBER OF LOGICAL UNITS.!A; WD. 11 -- PROCESSOR INDICATOR-B; WD. 12 -- STD FLAGS WORD (NOT SUPPORTED).I/C; WD. 13 -- ADDRESS OF TASK SST VECTOR TABLE.E5D; WD. 14 -- SIZE OF TASK SST VECTOR TABLE IN WORDS. $E; WD. 15 -- SIZE OF TASK IN BYTES..F; WD. 16 -- SYSTEM ID CODE (6 FOR RSX-11M+)."G; WD. 17 -- PROTECTION UIC WORD.H;K I; INPUTS:PJ;D;K; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.P5L; R3=ADDRESS OF THE SIXTEEN WORD BUFFER IN THE DPB.U1M; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.N.N; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.O;-CP; NOTE THAT IF THE REQUESTING TASK HAS A NON RESIDENT TASK HEADER ?Q; WE WILL ENTER AT $DRGTK WITH THE TASK HEADER MAPPED THROUGHR?R; KERNEL APR 6. HOWEVER, WE ALSO NEED TO MAP THE USER BUFFERI>S; AREA WITH APR 6. THEREFORE, WE WILL SAVE NECESSARY HEADER@T; INFORMATION IN THE INTERNAL DPB SAVE AREA (WE NO LONGER NEED,U; THE DPB) BEFORE MAPPING THE USER BUFFER.V;O7W; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)HX;R&Y; C=0 WITH A DIRECTIVE STATUS OF +1.Z;-[6\$DRGTK::MOV (R3),R3 ;GET ADDRESS OF 16. WORD BUFFER]^ .IF DF X$$HDRA_3` MOV #$DICSV+2,R0 ;USE INTERNAL DPB FOR SAVE AREAPab .IF DF M$$MUPc)d MOV H.DUIC(R4),(R0)+ ;SAVE DEFAULT UICRef .IFF g'h MOV H.CUIC(R4),(R0)+ ;OR CURRENT UICEij .ENDCk,l MOV H.NLUN(R4),(R0)+ ;SAVE NUMBER OF LUNS2m MOV H.TKVA(R4),(R0)+ ;SAVE TASK SST VECTOR ADDR2n MOV H.TKVL(R4),(R0) ;SAVE LENGTH OF SST VECTOR o ASR (R0)+ ;IN TERMS OF WORDS5p MOV H.WND(R4),R1 ;POINT TO NUMBER OF WINDOW BLOCKSOqr .IF DF U$$DASs7t BIT #T4.DSP,T.ST4(R5) ;TASK HAVE I/D SPACE ENABLED ?Cu BEQ 10$ ;IF EQ, NO8v ADD #W.BLGH,R1 ;YES, POINT TO WINDOW 1 (D SPACE ROOT)w10$: ;REFERENCE LABELxy .ENDC ; DF U$$DASz6{ MOV W.BHVR+2(R1),(R0) ;CALCULATE TASK SIZE IN BYTES| SUB W.BLVR+2(R1),(R0) ;00{¸aнaÑ¿a`TADATADATADATADATADATA} INC (R0)+ ;V+~ MOV H.CUIC(R4),(R0) ;SAVE PROTECTION UIC€ .ENDC�/‚ MOV #16.*2,R1 ;SET LENGTH OF BUFFER IN BYTESI.ƒ CALL $ACHKP ;ADDRESS CHECK PARAMETER BLOCK+„ MOV T.NAM(R5),(R3)+ ;INSERT NAME OF TASKS… MOV T.NAM+2(R5),(R3)+ ;,† MOV T.PCB(R5),R0 ;GET ADDRESS OF TASK PCB0‡ MOV P.NAM(R0),(R3)+ ;INSERT NAME OF PARTITIONˆ MOV P.NAM+2(R0),(R3)+ ;2‰ CMP (R3)+,(R3)+ ;POINT TO TASK PRIORITY ADDRESS:‰ MOVB T.PRI(R5),(R3)+ ; INSERT TASK PRIORITY. ;edp050,‰ CLRB (R3)+ ; CLEAR HIGH BYTE. ;edp050‹ ;**-1;Œ� .IF DF X$$HDRŽ1� MOV #$DICSV+2,R4 ;ADDRESS OF SAVED HEADER INFOR�‘ MOV (R4)+,(R3)+ ;INSERT UICC*’ MOV (R4)+,(R3)+ ;INSERT NUMBER OF LUNS*“ MOV $PRMOD,(R3)+ ;INSERT PROCESSOR TYPE/” TST (R3)+ ;POINT TO TASK SST VECTOR ADDRESSP3• MOV (R4)+,(R3)+ ;INSERT TASK SST VECTOR ADDRESS8– MOV (R4)+,(R3)+ ;INSERT LENGTH OF SST VECTOR IN WORDS'— MOV (R4)+,(R3)+ ;TASK SIZE IN BYTESR˜™ .IF DF R$$PROš#› MOV #11,(R3)+ ;SET CODE FOR P/OSHœ� .IFF ;R$$PROž&Ÿ MOV #6,(R3)+ ;SET CODE FOR RSX-11M+ ¡ .ENDC ;R$$PRO¢$£ MOV (R4),(R3) ;SET PROTECTION UIC¤¥ .IFF ¦§¨ .IF DF M$$MUP©+ª MOV H.DUIC(R4),(R3)+ ;INSERT DEFAULT UIC)«¬ .IFFC­+® MOV H.CUIC(R4),(R3)+ ;INSERT CURRENT UICO¯° .ENDC±².³ MOV H.NLUN(R4),(R3)+ ;INSERT NUMBER OF LUNS*´ MOV $PRMOD,(R3)+ ;INSERT PROCESSOR TYPE/µ TST (R3)+ ;POINT TO TASK SST VECTOR ADDRESSR¶7· MOV H.TKVA(R4),(R3)+ ;INSERT TASK SST VECTOR ADDRESSO<¸ MOV H.TKVL(R4),(R3) ;INSERT LENGTH OF SST VECTOR IN WORDS)¹ ASR (R3)+ ;CONVERT TO LENGTH IN WORDS45º MOV H.WND(R4),R1 ;POINT TO NUMBER OF WINDOW BLOCKSF»¼ .IF DF U$$DAS½7¾ BIT #T4.DSP,T.ST4(R5) ;TASK HAVE I/D SPACE ENABLED ?M¿ BEQ 20$ ;IF EQ, NO8À ADD #W.BLGH,R1 ;YES, POINT TO WINDOW 1 (D SPACE ROOT)Á20$: ;REFERENCE LABELÂà .ENDC ; DF U$$DASÄ6Å MOV W.BHVR+2(R1),(R3) ;CALCULATE TASK SIZE IN BYTESÆ SUB W.BLVR+2(R1),(R3) ;Ç INC (R3)+ ; ÈÉ .IF DF R$$PROÊ#Ë MOV #11,(R3)+ ;SET CODE FOR P/OS ÌÍ .IFF ;R$$PROSÎ&Ï MOV #6,(R3)+ ;SET CODE FOR RSX-11M+ÐÑ .ENDC ;R$$PROÒ*Ó MOV H.CUIC(R4),(R3) ;SET PROTECTION UICÔÕ .ENDCÖ × RETURN ;4ØÙ .ENDVE I/D SPACE ENABLED ?M¿ BEQ 20$ ;IF EQ, NO8À ADD #W.BLGH,R1 ;YES, POINT TO WINDOW 1 (D SPACE ROOT)Á20$: ;REFERENCE LABELÂà .ENDC ; DF U$$DASÄ6Å MOV W.BHVR+2(R1),(R3) ;CALCULATE TASK SIZE IN BYTESÆ SUB W.BLVR+2(R1),(R3) ;Ç INC (R3)+ ; ÈÉ .IF DF R$$PROKB3 BCS 40$ ;IF CS JUST RETURN -1 AND BE DONE WITH ITB/ ADD #IB.USQ,R0 ;POINT AT THE USER BUFFER QUEUEM" MTPS #PR6 ;;;LOCK OUT INTERRUPTS, MOVB (R0),R2 ;;;GET THE NEXT BUFFER TO USE, BMI 10$ ;;;IF MI NO NEED TO MOVE THE QUEUE .REPT 7/ MOVB 1(R0),(R0)+ ;;;MOVE THE QUEUE DOWN A BYTER .ENDM+ MOVB #-1,(R0) ;;;MARK THE END OF THE QUEUEM9 CMPB R2,S.WEBF(R1) ;;;SHOULD THIS BUFFER SET ERROR CODE?I BNE 10$ ;;;IF NE NO+2 MOV S.WSTS(R1),@S.WUSW(R1) ;;;YES--SET ERROR CODE!10$: MTPS #0 ;;;ALLOW INTERRUPTSI* MOV (R5),R1 ;GET POSSIBLE IBUFNO ADDRESS% CMP R3,#3 ;CAN IBUFNO BE SPECIFIED?  BLT 20$ ;IF LT NO; CMP R1,#-1 ;WAS IT SPECIFIED?R BEQ 20$ ;IF EQ NOF' MOV R2,(R1) ;YES--STORE BUFFER NUMBER '20$: MOV R2,R0 ;POSITION BUFFER NUMBER,+ RETURN ;BACK TO CALLER WITH NUMBER IN R0M;; CANNOT FIND SWB FOR IBUF;O'40$: MOV #-1,R2 ;JUST RETURN NO BUFFERL BR 10$ ;STORE CODE AND RETURNB .END;;IF NE NO+2 MOV S.WSTS(R1),@S.WUSW(R1) ;;;YES--SET ERROR CODE!10$: MTPS #0 ;;;A .TITLE KDIO SINGLE DIGITAL I/OG .IDENT /1.03/;D ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.A;T>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENS00ÑÀa±a“_c”_d–_k›’E TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 1.03; B. SCHREIBER 5-SEP-77T; ; MODIFIED BY:; ; B. SCHREIBER 15-MAY-78;; BLS048 -- CORRECT USE OF MASK. CLEAR SAVED R5 FROM STACKO1; BEFORE SUCCESSFUL ROUTINE EXIT. WRITE VALUEN3; READ FROM DIGITAL REGISTER BACK TO REGISTER INI; ALL CASES.G;I; M. S. HARVEY 12-MAY-79;; MSH034 -- ALTER ONLY THOSE OUTPUT REGISTER BITS THAT HAVEO; BEEN MASK MARKEDS;E9; HB008 -- CONDITIONALIZE WRITE ACCESS TO RECEIVE BUFFERO; FOR Q-BUS DRV11; ;N3; THIS MODULE PROCESSES SINGLE DIGITAL INPUT/OUTPUTB;S; SYSTEM MACRO CALLS;: .MCALL KSWDF$,KDVDF$- KSWDF$L KDVDF$O C' .SBTTL IDINP/DINP SINGLE DIGITAL INPUTO;+#; IDINP/DINP -- SINGLE DIGIAL INPUTT;A; CALLING SEQUENCES:;T(; CALL DINP (IUNIT, [MASK], IOSB, INPUT); OR,; IND = IDINP (IUNIT, [MASK], IOSB, [INPUT]);E-; OR IND = IDINP (IUNIT) !FAST VERSION ONLY ;B ; INPUTS:R;S'; IUNIT IS THE DR11 UNIT (DEFAULT IS 0)C@; MASK SELECTS WHICH BITS WILL BE CLEARED IN DR11 INPUT REGISTER;R ; OUTPUTS:;D-; INPUT RECEIVES THE DATA INPUT FROM THE DR11S+; IND RECEIVES THE DATA INPUT FROM THE DR11V; IOSB RECEIVES THE I/O STATUS; ;- .IF NDF Q$$DIO IDINP::-DINP:: MOV R5,-(SP) ;SAVE ARG PTR & CALL .K.PAA ;VALIDATE AND STACK ARGS .WORD 4 ;4 ARGS  .WORD 2 ;IOSB REQUIRED BCS DIOBAD ;IF CS BAD ARGS MOV (SP)+,R1 ;GET UNIT NUMBER BNE 20$ ;IF NE OKN MOV #.ZEROW,R1 ;ELSE USE 01"20$: MOV (R1),R1 ;GET UNIT NUMBER ASL R1 ;MAKE INDEX& MOV .DRUTB(R1),R1 ;GET POINTER TO SWB+ CMP R1,#DRSW0 ;MAKE SURE LEGAL SWB ADDRESSR BLO 80$ ;IF LO NOT LEGAL& CMP R1,#.DRUTB ;THIS FOLLOWS LAST SWB BHIS 80$ ;IF HIS NOT LEGAL# MOV S.WCSR(R1),R1 ;GET CSR ADDRESSP' MOV DI$BUF(R1),R0 ;READ INPUT REGISTERK MOV (SP)+,R2 ;GET MASK ADDRESS. BNE 30$ ;IF NE GO USE MASK+ MOV #.NEG1,R2 ;ELSE USE DEFAULT OF ALL 1'SM .IF DF L$$SI130$: .IFFB>30$: MOV (R2),DI$BUF(R1) ;CLEAR BITS IN DIGITAL INPUT REGISTER .ENDC&40$: MOV #IS.SUC,@(SP)+ ;STORE SUCCESS" MOV (SP)+,R1 ;GET 'INPUT' ADDRESS BEQ 60$ ;IF EQ SKIP IT MOV R0,(R1) ;ELSE STORE DATA*60$: TST (SP)+ ;CLEAR SAVED R5 FROM STACK RETURNI80$:+DIOBD0: MOV R5,SP ;ILL UNIT--RESTORE STACKS;D; BAD PARAMETERS;12DIOBAD: MOV #-,R3 ;SET VALUE TO STORE" MOV #3,R4 ;STORE IN 3RD ARGUMENT MOV (SP)+,R5 ;GET ARG PTR BACKU- CALLR .IESTO ;TRY TO STORE ERROR AND RETURN .IFF ;Q$$DIOIDINP::!IDINP:: MOV @2(R5),R1 ;GET UNIT #R ASL R1 ;MAKE WORD INDEXS# MOV .DRUTB(R1),R1 ;GET SWB ADDRESSR# MOV S.WCSR(R1),R1 ;GET CSR ADDRESS , MOV DI$BUF(R1),R0 ;READ DR11 INPUT REGISTER .IF NDF L$$SI1E& MOV R0,DI$BUF(R1) ;CLEAR BITS IN DR11 .ENDC RETURN  .ENDC ;Q$$DIO ( .SBTTL IDOUT/DOUT SINGLE DIGITAL OUTPUT;+%; DOUT/IDOUT -- SINGLE DIGITAL OUTPUT4;S; CALLING SEQUENCES:;V(; CALL DOUT (IUNIT, [MASK], IOSB, IDATA); OR+; IOUT = IDOUT (IUNIT, [MASK], IOSB, IDATA)I; ; INPUTS:N; .; IUNIT IS THE DR11 UNIT NUMBER (DEFAULT IS 0)%; MASK SELECTS THE BITS TO BE ALTEREDR.; IDATA IS THE DATA WORD TO OUTPUT TO THE DR11;$ ; OUTPUTS:;D; IOSB RECEIVES THE I/O STATUS<; IOUT RECEIVES A COPY OF THE DR11 OUTPUT REGISTER IF CALLED; AS A FUNCTION.;;D>; NOTE: FOR THE QUICK VERSION, THE ARGUMENTS MASK AND IOSB ARE<; NOT USED, BUT ARE REQUIRED (OR DEFAULTED) TO KEEP THE SAME ; STRUCTURE AS THE SLOW VERSION.;- .IF NDF Q$$DIOIDOUT::IDOUT::, MOV R5,-(SP) ;SAVE ARG PTRN& CALL .K.PAA ;VALIDATE AND STACK ARGS .WORD 4 ;4 ARGSK .WORD 2 ;MASK  BCS DIOBAD ;IF CS BAD ARGS MOV (SP)+,R1 ;GET UNIT NUMBER BNE 20$ ;IF NE GO USEO MOV #.ZEROW,R1 ;ELSE USE 0 "20$: MOV (R1),R1 ;GET UNIT NUMBER A00ÑÈaÒËa¿a`TADATADATADATADATADATASL R1 ;MAKE WORD INDEXA" MOV .DRUTB(R1),R1 ;GET PTR TO SWB! CMP R1,#DRSW0 ;SEE IF A REAL SWBN BLO DIOBD0 ;IF LO NO CMP R1,#.DRUTB ;... BHIS DIOBD0 ;IF HIS ILLEGALT# MOV S.WCSR(R1),R1 ;GET CSR ADDRESS. MOV (SP)+,R2 ;GET MASK ADDRESS, BNE 40$ ;IF NE OK  MOV #.NEG1,R2 ;ELSE USE ALL 1S 40$: MOV (R2),R2 ;GET MASKA8 MOV DO$BUF(R1),R0 ;GET CURRENT OUTPUT REGISTER CONTENTS' BIC R2,R0 ;INITIALIZE THE MASKED BITS  COM R2 ;COMPLEMENT MOV (SP)+,R3 ;GET IOSB ADDRESS, MOV @(SP)+,R4 ;GET OUTPUT DATAA BIC R2,R4 ;MASKV3 BIS R0,R4 ;RECOVER PROTECTED OUTPUT REGISTER BITSF- MOV R4,DO$BUF(R1) ;STORE DIGITAL OUTPUT DATA. MOV #IS.SUC,(R3)+ ;SET SUCCESS . MOV R4,R0 ;COPY IN CASE CALLED AS A FUNCTION& TST (SP)+ ;CLEAR SAVED R5 FROM STACK RETURNE .IFF ;Q$$DIO,IDOUT::E DOUT:: MOV @2(R5),R1 ;GET UNIT # ASL R1 ;MAKE WORD INDEXE# MOV .DRUTB(R1),R1 ;GET SWB ADDRESSB( MOV S.WCSR(R1),R1 ;GET DR11 CSR ADDRESS+ MOV @10(R5),DO$BUF(R1) ;WRITE DATA TO DR11D RETURNM .ENDC ;Q$$DIO .ENDTAA BIC R2,R4 ;MASKV3 BIS R0,R4 ;RECOVER PROTECTED OUTPUT REGISTER BITSF- MOV R4,DO$BUF(R1) ;STORE DIGITAL OUTPUT DATA. MOV #IS.SUC,(R3)+ ;SET SUCCESS . MOV R4,R0 ;COPY IN CASE CALLED AS A FUNCTION& TST (SP)+ ;CLEAR SAVED R5 FROM STACK RETURNE .IFF ;Q$$DIO,IDOUT::E DOUT:: MOV @2(R5),R1 ;GET UNIT # ASL R1 ;MAKE WORD INDEXE# MOV .DRUTB(R1),R1 ;GET SWB ADDRESSB( MOV S.WCSR(R1),R1 ;GET DR11 CSR ADDRESS+ MOV @10(R5),DO$BUF(R1) ;WRITE DATA TO DR11D RETURNM .ENDC ;Q$$DIO .TITLE KAADRV ROUTINES FOR AA11 .IDENT /1.01/;O; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;V>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 1.01; B. SCHREIBER 26-SEP-77; ; MODIFIED BY -O;U; HOWARD BERNSTEIN - 8/817; HB013 -- ALLOW SWEEPS TO MULTIPLE AA11'S IN ONE CALLR;P1; THIS MODULE CONTAINS ROUTINES TO DRIVE THE AA11D;; SYSTEM MACRO CALLS;T .MCALL KDVDF$,KSWDF$  KDVDF$  KSWDF$ .IF DF N$AA11 O: .SBTTL DASWP INITIATE SYNCHRONOUS OR BURST MODE D/A SWEEP;+; DASWP -- START D/A SWEEP;S; CALLING SEQUENCE:R;LG; CALL DASWP (IBUF, LBUF, NBUF, MODE, IPRSET, IEFN, LDELAY, ICHN, NCHN); ; INPUTS:.;; SEE DOCUMENTATION-;;-"DASWP:: MOV R5,-(SP) ;SAVE ARG PTR' CALL .K.PAA ;VALIDATE ARGS ONTO STACKT .WORD 9. ;NINE ARGSE# .WORD 600 ;MASK FOR REQUIRED ARGSU0 MOV #.AASWB,R4 ;POINT TO AA SWEEP CONTROL BLOCK BCC 20$ ;IF CC CONTINUEF/ MOV #-,R3 ;ELSE SET BAD ARGUMENTSB& BR 600$ ;STORE ERROR CODE AND RETURN%20$: CALL .K.SET ;SET UP COMMON ARGSD BCS 200$ ;IF CS BAD ARGS CALL .K.DLY ;SEE ABOUT DELAY! BCS 300$ ;IF CS RESOURCE IN USEL# CALL .AAGCH ;GET D/A CHANNEL INFO BCS 200$ ;IF CS BAD ARGS! CALL .K.STB ;SET UP BUFFER INFOP% BCS 400$ ;IF CS ILLEGAL BUFFER SPECT$ BIT #S$WNOV,S.WFLG(R4) ;BURST MODE? BEQ 40$ ;IF EQ NOD# MOV (SP)+,R5 ;YES--RESTORE ARG PTRS% JMP .AADMP ;GO DO BURST MODE OUTPUTN40$: .IF DF K$$W11* CALL .AASSC ;SELECT SYNCH. CLOCK ROUTINE& CALL .KLQIN ;INSERT INTO CLOCK QUEUE CALL .KWCNI ;CONNECT CLOCK! BCS 300$ ;IF CS RESOURCE IN USED- BIS #S$WACT,S.WFL2(R4) ;FLAG SWEEP IS ACTIVEE MOV (SP)+,R5 ;RESTORE R5T RETURNN .IFF ;K$$W110/ MOV #-,R3 ;SET OPTION NOT PRESENTF0 BR 500$ ;AND LET HIM FIGURE OUT CLOCK NOT HERE00ÒÐa±a“_c”_d–_k›’ .ENDC ;K$$W11;T; ERROR RETURNS ; ; BAD PARAMETERS; 200$: MOV #-,R3 BR 500$; ; RESOURCE IN USE;:300$: MOV #-,R3 BR 500$; ; ILLEGAL BUFFER SPECIFICATION; 400$: MOV #-,R33500$: MOV R5,SP ;RESTORE PRE-.K.PAA STACK POINTER I6600$: CALL .KLQRM ;REMOVE FROM QUEUE IN CASE INSERTED MOV #1,R4 ;STORE IN FIRST ARGR MOV (SP)+,R5 ;RESTORE ARG PTR CALLR .IESTO  T .SBTTL SCOPE SCOPE CONTROL$;+; SCOPE -- AA11 SCOPE CONTROLE;; CALLING SEQUENCE:T; "; CALL SCOPE (IUNIT, ICNTRL, IOSB); ; INPUTS: ;I; IUNIT AA11 UNIT #0; ICNTRL DATA FOR CSR OF AA11; IOSB RECEIVES STATUS;3 ; OUTPUTS:;#; ICNTRL MOVED INTO PROPER AA11 CSR0; ;- .IF NDF Q$$BUS!SCOPE:: MOV @2(R5),R0 ;GET UNIT #S BMI 120$ ;IF MI ERRORL MOV #.AASWB,R4 ;POINT TO AASWBS CMP R0,S.WUNT(R4) ;LEGAL UNIT?  BGE 120$ ;IF GE NO MOV @4(R5),R1 ;GET CSR BITS9 BIC #^C,R1 ;CLEAR ILLEGAL BITS FOR USER TO TOUCHA, MOV #<.AASWB+S.WUCB>,R2 ;POINT TO FIRST UCB20$: DEC R0 ;AT CORRECT UNIT? BLT 40$ ;IF LT YES! ADD #U.LGTH,R2 ;NO--MOVE TO NEXTL BR 20$ ;KEEP GOING040$: MOV R1,@U.CSR(R2) ;FOUND IT...OUTPUT TO CSR MOV #IS.SUC,@6(R5) ;SET SUCCESS 100$: RETURN'120$: MOV #3,R4 ;STORE IN 3RD ARGUMENTT& MOV #-,R3 ;BAD ARGUMENTS CALLR .IESTOI .IFF ;Q$$BUSP$SCOPE:: MOV #3,R4 ;STORE IN 3RD ARG+ MOV #-,R3 ;OPTION NOT PRESENTC CALLR .IESTO  .ENDC ;Q$$BUS O* .SBTTL .AAGCH GET D/A CHANNEL INFORMATION;+'; .AAGCH -- GET D/A CHANNEL INFORMATIONI ; INPUTS:$;I; STACK >> RETURN ADDRESSN; ICHN ADDRESS; NCHN ADDRESS; ; OUPUTS:,+; C-CLEAR CHANNEL INFORMATION SET UP IN SWBS; C-SET ILLEGAL CHANNEL NUMBER;U;-(.AAGCH::MOV (SP)+,R3 ;GET RETURN ADDRESS MOV (SP)+,R2 ;GET ICHN ADDRESSN BNE 20$ ;IF NE GO" MOV #.ZEROW,R2 ;ELSE DEFAULT TO 020$: MOV (R2),R2 ;GET ICHNE BMI 200$ ;IF MI ERROR " CMP R2,S.WMXC(R4) ;LEGAL CHANNEL? BHI 200$ ;IF HI NO MOV (SP)+,R1 ;GET NCHNR BNE 40$ ;IF NE OKH MOV #.ZEROW,R1 ;ELSE USE 0O40$: MOV (R1),R1 ;GET NCHN> BMI 200$ ;IF MI ERRORN BNE 60$ ;IF NE OKD INC R1 ;ELSE USE 1 CHANNEL 60$: MOV R1,-(SP) ;SAVE ON STACK ADD R2,R1 ;COMPUTE END CHANNEL$ DEC R1 ;DON'T GO PAST LAST CHANNEL% CMP R1,S.WMXC(R4) ;LEGAL END CHANNEL  BHI 200$ ;IF HI NO$ MOV R1,S.WHCH(R4) ;YES--FILL IN SWB MOV R2,S.WICH(R4) ;... ' MOV R2,S.WCCH(R4) ;SET CURRENT CHANNELP- MOV (SP),S.WNCH(R4) ;SET # OF CHANNELS TO DOH- MOV (SP)+,S.WCHX(R4);AND SAVED # OF CHANNELSE BIC #^C<3>,R2 ;CLEAR TO 0-3 .IF NDF Q$$BUS, INC R2 ;MAKE IT 1-4  .ENDC ;Q$$BUS ASL R2 ;CREATE WORD INDEXL% MOVB R2,S.WCHB(R4) ;SET CHANNEL BYTEV+ MOVB R2,S.WCBX(R4) ;AND SAVED CHANNEL BYTE/ MOV R3,-(SP) ;PUT RETURN ADDRESS BACK ON STACKM .IF GT N$AA11-1! CALL .AAXCH ;SET UP CSR ADDRESS, .ENDC ;N$AA11-1 CLC ;SUCCESS. RETURN;; ; SOME SORT OF ERROR; 200$: MOV R5,SP ;RESET SP SEC ;FLAG PROBLEM JMP (R3) ;RETURN TO CALLER (* .SBTTL .AANXC ADVANCE TO NEXT D/A CHANNEL;+%; .AANXC -- GO TO NEXT CHANNEL ON D/A ;A ; INPUTS:;.; R4 POINTS TO SWB ; R3 FREEE;R ; OUTPUTS:; !; SWB INCREMENTED TO NEXT CHANNELM; ); THIS ROUTINE MAY BE CALLED AT ANY LEVELV;,;- .PSECT .KSCT1/.AANXC::DEC S.WNCH(R4) ;;;DONE ENOUGH CHANNELS?X BLE 60$ ;;;IF LE YES--RESETN) INC S.WCCH(R4) ;;;NO--GO TO NEXT CHANNEL& ADD #2,S.WCHB(R4) ;;;INC CHANNEL BYTE .IF GT N$AA11-1, MOV S.WAUA(R4),R3 ;;;GET ACTIVE UCB ADDRESS ADD R4,R3 ;;;...5 CMP S.WCCH(R4),U.MAXC(R3) ;;;GOING TO NEXT CONVERTERE BLOS 40$ ;;;IF LOS NO ) ADD #U.LGTH,R3 ;;;YES--POINT TO NEXT D/AE6 MOV U.CSR(R3),S.WCSR(R4) ;;;CHANGE ACTIVE CSR IN SWB# SUB R4,R3 ;;;MAKE RELATIVE TO SWB 2 MOV R3,S.WAUA(R4) ;;;STORE ACTIVE UNIT UCB OFFSET# MOV S.WCCH(R4),R3 ;;;GET CHANNEL # BIC #^C<3>,R3 ;;;MAKE 0-3 .IF NDF Q$$BUS : MOVB #2,S.WCHB(R4) ;;;START WITH FIRST CHANNEL ON NEW DAC .IFF ;Q$$BUS$7 CLRB S.WCHB(R4) ;;;START WITH FIRST CHANNEL ON NEW DACD .00ÒØaËa¿a`TADATADATADATADATADATAENDC ;Q$$BUS .IFTF ;N$AA11-140$: RETURN ;;; ;V; ALL CHANNELS DONE;;L560$: MOV S.WCHX(R4),S.WNCH(R4) ;;;RESET CHANNEL COUNTV: MOV S.WICH(R4),S.WCCH(R4) ;;;RESET CURRENT CHANNEL NUMBER1 MOVB S.WCBX(R4),S.WCHB(R4) ;;;RESET CHANNEL BYTE; .IFT ;N$AA11-1C;+; .AAXCH -- SET UP CSR AND SWB;E ; INPUTS:#;3; R4 POINTS TO SWB ; R3 FREE$; ; OUTPUTS:;W2; S.WAUA OFFSET FILLED IN SWB (> 1 AA11 IN SYSTEM);; NO OPERATION (1 AA11 IN SYSTEM--DATA FILLED IN AT SYSGEN)O;E;-&.AAXCH::MOV R4,R3 ;POINT TO FIRST UCB# ADD #S.WUCB,R3 ;REALLY POINT AT ITE+20$: CMP S.WCCH(R4),U.MAXC(R3) ;ON THIS AA?; BLOS 40$ ;IF LOS YES& ADD #U.LGTH,R3 ;NO--POINT TO NEXT UCB BR 20$ ;KEEP LOOKING,40$: MOV R3,S.WAUA(R4) ;POINT TO CURRENT UCB$ SUB R4,S.WAUA(R4) ;MAKE IT RELATIVE+ MOV U.CSR(R3),S.WCSR(R4) ;GET CSR INTO SWB4 .ENDC ;N$AA11-1 RETURN U3 .SBTTL .AASSC SELECT D/A SYNCHRONOUS CLOCK ROUTINEN;+:; .AASSC -- SELECT SYNCHRONOUS CLOCK ROUTINE FOR D/A SWEEP;O ; INPUTS:;X; R4 POINTS TO SWB; SWB SET UP FOR SWEEP;B ; OUTPUTS:;N:; S.WSCR IN SWB MODIFIED TO POINT TO CORRECT CLOCK ROUTINE;0;- .PSECT8.AASSC::MOV #.AASO0,R3 ;ASSUME SINGLE CHANNEL D/A OUTPUT .IF NDF Q$$BUSA7 BIT #S$WSCW,S.WFLG(R4) ;SEE IF SCOPE CONTROL WORD MODEE BNE 60$ ;IF NE YES .IFTF ;Q$$BUS0 MOV S.WNCH(R4),R2 ;GET NUMBER OF CHANNELS TO DO DEC R2 ;ONE CHANNEL? BEQ 80$ ;IF EQ YES DEC R2 ;TWO CHANNELS?E BNE 40$ ;IF NE NOK4 CMPB #6,S.WCHB(R4) ;SEE IF TWO CHANNELS ON SAME D/A3 BHI 40$ ;IF HI NO--LAST ON ONE, AND FIRST ON NEXT* MOV #.AASO1,R3 ;YES--SET FOR TWO CHANNELS BR 80$ ;GO STORE ADDRESS+40$: MOV #.AASO2,R3 ;MORE THAN TWO CHANNELSL .IFT ;Q$$BUSP BR 80$ ;GO STORE ADDRESS460$: MOV #.AASO3,R3 ;SET FOR SCOPE CONTROL WORD MODE .ENDC ;Q$$BUS80$: .IF DF M$$MGE ADD $KRLC5,R3 ;RELOCATE TO APR5 .ENDC ;M$$MGE5 MOV R3,S.WSCR(R4) ;STORE SYNC. CLOCK ROUTINE ADDRESSH: MOV #.AAXIT,S.WSTR(R4) ;SET DUMMY SCHMITT TRIGGER ROUTINE RETURNE O+ .SBTTL .AASOX D/A CLOCK INTERRUPT ROUTINES ;+>; .AASO0 -- SYNCH. CLOCK ROUTINE FOR SINGLE CHANNEL D/A OUTPUT;;F; THIS ROUTINE IS CALLED AT CLOCK INTERRUPTS TO OUTPUT ONE D/A CHANNEL;$ ; INPUTS: ; ; R4 POINTS TO SWB ; R3 FREEA;3 ; OUTPUTS:;O(; C-CLEAR WORD OUTPUT, NOT END OF BUFFER@; C-SET WORD OUTPUT, END OF BUFFER, FORK TO SET EFN OR QUEUE AST;$;- .PSECT .KSCT1:.AASO0: MOV S.WCSR(R4),-(SP) ;;;GET CSR ADDRESS ONTO STACK* MOVB S.WCHB(R4),R3 ;;;GET 2*(CHANNEL + 1)- ADD R3,(SP) ;;;POINT AT PROPER DAC REGISTERU( CALL .KRDWD ;;;GET DATA WORD TO OUTPUT% MOV R3,@(SP)+ ;;;WRITE TO PROPER DAC0.AAXIT: RETURN ;;;RETURN WITH C-BIT FROM KRDWD;+F; .AASO1 -- SYNCH. CLOCK ROUTINE FOR 2-CHANNEL D/A OUTPUT ON SAME AA11;UH; THIS ROUTINE IS CALLED AT CLOCK INTERRUPT LEVEL TO OUTPUT TWO CHANNELS; TO THE D/A ON THE SAME AA11.;Q ; INPUTS:$;-; R4 POINTS TO SWB ; R3 FREEO;. ; OUTPUTS:;;$; C-CLEAR TWO CHANNELS OUTPUT TO D/A9; C-SET TWO CHANNELS OUTPUT, FORK TO SET EFN OR QUEUE ASTA;RB; NOTE: IN THE Q-BUS VERSION, IF S$WSIB IS SET, AN INTENSIFY PULSE6; WILL BE SENT THROUGH DAC3 OF THE SELECTED CONVERTER.;N;- .ENABL LSBD/.AASO1: MOV S.WCSR(R4),-(SP) ;;;GET CSR ADDRESSA* MOVB S.WCHB(R4),R3 ;;;GET 2*(CHANNEL + 1)# ADD R3,(SP) ;;;POINT TO FIRST DACE( CALL .KRDWD ;;;READ FIRST CHANNEL DATA! MOV R3,@(SP) ;;;WRITE TO THE DAC$ ADD #2,(SP) ;;;POINT TO SECOND DAC& CALL .KRDWD ;;;READ SECOND DATA WORD% MOV R3,@(SP)+ ;;;WRITE TO SECOND DAC, .IF DF Q$$BUS- BIT #S$WSIB,S.WFLG(R4) ;;;SET INTENSIFY BIT?F BEQ 20$ ;;;IF EQ NON>.A0DLY::BIT -(SP),(SP)+ ;;;YES--DELAY FOR SECOND DAC TO SETTLE/ MOV S.WCSR(R4),R3 ;;;GET CSR (1ST DAC) ADDRESSR" BIS #1,6(R3) ;;;SET INTENSIFY BIT..A1DLY::BIT -(SP),(SP)+ ;;;DO A DELAY OF SORTS$ BIC #1,6(R3) ;;;CLEAR INTENSIFY BIT .ENDC ;Q$$BUS 20$: RETURNM .DSABL LSBW E# .SBTTL .AASO2 N-CHANNEL D/A OUTPUTT;+9; .AASO2 -- SYNCH. CLOCK ROUTINE FOR N-CHANNEL D/A OUTPUTP;;E; THIS ROUTINE IS CALLED AT CL00ÒàaÓãa“_c”_d–_k›’OCK INTERRUPT LEVEL TO OUTPUT MORE THANS; TWO CHANNELS OF D/A OUTPUT.;; ; INPUTS:D;:; R4 POINTS TO SWB ; R3 FREEO;E ; OUTPUTS:;T2; C-CLEAR ALL CHANNELS OUTPUT--DO NOT NEED TO FORK9; C-SET ALL CHANNELS OUTPUT--FORK FOR END OF BUFFER/SWEEP);;F; NOTE: THIS ROUTINE EXPECTS THAT THE SIZE OF THE BUFFER IS A MULTIPLE>; OF WORDS. IF THIS IS NOT THE CASE, UNEXPECTED RESULTS ; WILL OCCUR.;+;-0.AASO2: CLR -(SP) ;;;SET C-BIT SAVER ONTO STACK%10$: CALL .KRDWD ;;;READ A DATA WORDL ROL (SP) ;;;SAVE C-BIT MOV R3,-(SP) ;;;SAVE DATA WORD % MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSP, MOVB S.WCHB(R4),-(SP);;;GET 2*(CHANNEL + 1). CLRB 1(SP) ;;;MAKE SURE WE ONLY ADD LOW BYTE$ ADD (SP)+,R3 ;;;POINT TO PROPER DAC$ MOV (SP)+,(R3) ;;;WRITE DATA TO DAC ROR (SP) ;;;CHECK C-BITH BCC 20$ ;;;IF CC CONTINUET& ROL (SP) ;;;SET PERMANENT C-BIT FLAG) BIT #S$WSTP,S.WFL2(R4) ;;;SHOULD WE STOP BNE 40$ ;;;IF NE YES+20$: CALL .AANXC ;;;NO--GO TO NEXT CHANNELL3 CMP S.WCHX(R4),S.WNCH(R4) ;;;DONE ENOUGH CHANNELS?B BNE 10$ ;;;NO--DO MORE 40$: ROR (SP)+ ;;;RESTORE C-BIT RETURND .ENDC ;N$AA11 .ENDSP);;;GET 2*(CHANNEL + 1). CLRB 1(SP) ;;;MAKE SURE WE ONLY ADD LOW BYTE$ ADD (SP)+,R3 ;;;POINT TO PROPER DAC$ MOV (SP)+,(R3) ;;;WRITE DATA TO DAC ROR (SP) ;;;CHECK C-BITH BCC 20$ ;;;IF CC CONTINUET& ROL (SP) ;;;SET PERMANENT C-BIT FLAG) BIT #S$WSTP,S.WFL2(R4) ;;;SHOULD WE STOP BNE 40$ ;;;IF NE YES+20$: CALL .AANXC ;;;NO--GO TO NEXT CHANNELL3 CMP S.WCHX(R4),S.WNCH(R4) ;' .TITLE KDRDRV DRIVER ROUTINES FOR DR11- .IDENT /V04.00/;+<; COPYRIGHT (c) 1977, 1982 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;(<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.N;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION V04.00; B. SCHREIBER 4-SEP-77E;E; MODIFIED BY:;U; B. SCHREIBER 15-MAY-78<; BLS048 -- CLEAR BITS IN DR11 INPUT REGISTER ON SYNCH. I/O.;H; M. S. HARVEY 12-MAY-799; MSH032 -- IGNORE INTERRUPTS FOLLOWING END OF DATA SWEEPT; ; M. S. HARVEY 12-MAY-79*; MSH033 -- CORRECT STACK MANIPULATION BUG;U; M. S. HARVEY 13-MAY-79B; MSH035 -- IMPLEMENT INPUT SERVICE FOR INTERRUPTS BY CONTROL LINE; ; H. BERNSTEIN 16-SEP-81:; HB015 -- CORRECT ACCESS TO READ ONLY REGISTER FOR Q-BUS;;EB; THIS MODULE CONTAINS THE DR11 INTERRUPT AND CONNECT TO INTERRUPT ; ROUTINES.-;8; SYSTEM MACRO CALLS;I .MCALL KSWDF$, KDVDF$, CINT$S KSWDF$  KDVDF$V 1/ .SBTTL .DRCNI CONNECT DR11 TO INTERRUPT VECTOR ;+,; .DRCNI -- CONNECT DR11 TO INTERRUPT VECTOR;0 ; INPUTS:C;T; R4 SWB ADDRESS; ; OUTPUTS:;V; C-SET COULD NOT CONNECTM; C-CLEAR SUCCESSC;O;-..DRCNI::CALL .DRSLI ;SELECT INTERRUPT ROUTINE1 BIT #UF$CIN,S.WUBX+U.FLG(R4) ;ALREADY CONNECTED?I! BNE 20$ ;IF NE YES--DON'T RETRYL MOV R4,R3 ;COPY SWB ADDRESSN' SUB #4,R3 ;POINT TO INTERRUPT ROUTINE8/ MOV S.WUBX+U.IVEC(R4),R2 ;ASSUME INPUT CONNECT$ BIT #S$WIOF,S.WFL2(R4) ;IS IT? BNE 10$ ;IF NE YES& MOV S.WUBX+U.OVEC(R4),R2 ;NO--GET OVA410$: CINT$S R2,#$KBASE,R3,#.DREDI,S.WPRI(R4),#.DRAST ;CONNECT TO INTERRUPT VECTOR BCS 40$120$: BIS #UF$CIN,S.WUBX+U.FLG(R4) ;FLAG CONNECTEDO CLC 40$: RETURNL R/ .SBTTL .DREDI DR11 ENABLE/DISABLE CINT ROUTINEB;+A; .DREDI -- ENABLE/DIS00ÓèaËa¿a`TADATADATADATADATADATAABLE ROUTINE FOR DR11 CONNECT TO INTERRUPTSR;3<; THIS ROUTINE IS CALLED BY THE EXECUTIVE WHEN CONNECTING OR'; DISCONNECTING FROM INTERRUPT VECTORS. ;N ; INPUTS:#;I&; R1 POINT TO INTERRUPT TRANSFER BLOCK;S ; OUTPUTS:;.1; INTERRUPTS FOR THE SPECIFIED DR11 ARE DISABLED.,9; ALL INPUT BITS ARE CLEARED IF THIS IS AN INPUT CONNECT.R;B;- .PSECT .KSCT19.DREDI::MOV X.VEC(R1),R0 ;GET VECTOR ADDRESS OF THIS DR115 MOV .DRXPT,R2 ;GET POINTER TO DR11 SWB POINTER TABLE+,20$: MOV (R2)+,R3 ;GET NEXT DR11 SWB ADDRESS BEQ 60$ ;IF EQ I AM CONFUSED7 CMP S.WUBX+U.IVEC(R3),R0 ;IS THE INPUT VECTOR CORRECT? BEQ 40$ ;IF EQ YES8 CMP S.WUBX+U.OVEC(R3),R0 ;NO--IS OUTPUT VECTOR CORRECT?& BNE 20$ ;IF NE NO--LOOK AT NEXT DR11,40$: MOV S.WCSR(R3),R2 ;GET DR11 CSR ADDRESS4 CMP S.WUBX+U.IVEC(R3),R0 ;IS THIS AN INPUT CONNECT? BNE 50$ ;IF NE NO0 BIC #DI$ENB,(R2) ;YES--DISABLE INPUT INTERRUPTS .IF NDF Q$$BUSH2 MOV #177777,DI$BUF(R2) ;YES--CLEAR ALL INPUT BITS .ENDC ;Q$$BUS BR 60$ ;ALL DONE050$: BIC #DO$ENB,(R2) ;DISABLE OUTPUT INTERRUPTS:60$: MOV @#$TKTCB,.KTKCB ;AND GET MY TCB ADDRESS FOR LATER RETURNI Q/ .SBTTL .DRSSC SELECT SYNCHRONOUS CLOCK ROUTINEC;+,; .DRSSC -- SELECT SYNCHRONOUS CLOCK ROUTINE;0<; THIS ROUTINE SELECTS EITHER .DRISR OR .DROSR FOR THE CLOCK; INTERRUPT ROUTINE TO CALL.;? ; INPUTS: ; ; R4 POINTS TO A COMPLETE SWB-;A ; OUTPUTS:;R>; S.WSCR IS FILLED IN THE SWEEP CONTROL BLOCK POINTED TO BY R48; S.WSTR IS FILLED IN WITH .DRSTR (USER VIRTUAL ADDRESS);B;- .IF DF K$$W11@.DRSSC::MOV #.DRSTR,S.WSTR(R4) ;SET SCHMITT TRIGGER ROUTINE ADDR' MOV #.DROSR,-(SP) ;ASSUME OUTPUT SWEEPC1 BIT #S$WIOF,S.WFL2(R4) ;IS THIS AN OUTPUT SWEEP?- BEQ 20$ ;IF EQ YES* MOV #.DRISR,(SP) ;NO--SET FOR INPUT SWEEP .IF DF K$W11K; BIT #S$WTSS,S.WFLG(R4) ;IS IT TIME-STAMPED INPUT SAMPLING? BEQ 20$ ;IF EQ NO--ALL SET" MOV #.DRIST,(SP) ;YES--SET FOR IT .ENDC ;K$W11K20$: ;REF LABEL .IF DF M$$MGE6 ADD $KRLC5,(SP) ;RELOCATE TO APR5 FOR CLOCK INTERRUPT .ENDC ;M$$MGE! MOV (SP)+,S.WSCR(R4);SET THE SWB; RETURN ;BACK TO CALLER  .ENDC ;K$$W11 S, .SBTTL .DRSLI SELECT DR11 INTERRUPT ROUTINE;+); .DRSLI -- SELECT DR11 INTERRUPT ROUTINEY; ; INPUTS:R;P; R4 POINTS TO SWB ; SWB SET UP; ; OUTPUTS:;#8; PROPER INTERRUPT ROUTINE ADDRESS LOADED INTO INTERRUPT!; TRANSFER VECTOR IN FRONT OF SWBD;T;-..DRSLI::MOV #.DRIN0,-(SP) ;ASSUME SIMPLE INPUT% BIT #S$WIOF,S.WFL2(R4) ;IS IT INPUT?C BNE 20$ ;IF NE YES% MOV #.DRIN2,(SP) ;NO--SET FOR OUTPUTE BR 40$ ;SKIP20$: ;REF LABEL .IF DF K$W11K/ BIT #S$WTSS,S.WFLG(R4) ;TIME STAMPED SAMPLING?S BEQ 40$ ;IF EQ NOR" MOV #.DRIN1,(SP) ;YES--SET FOR IT .ENDC ;K$W11K40$: ;REF LABEL .IF DF M$$MGE" ADD $KRLC5,(SP) ;RELOCATE TO APR5 .ENDC ;M$$MGE0 MOV (SP)+,-2(R4) ;STORE ADDRESS IN FRONT OF SWB+ ; (THIS IS 2ND WORD OF JSR INSTRUCTION)  RETURN ;BACK TO CALLERE P% .SBTTL DRINT DR11 INTERRUPT ROUTINEST;++; .DRIN0 -- DIGITAL INPUT INTERRUPT ROUTINET;R8; THIS ROUTINE IS ENTERED WITH A JSR R4, .DRIN0 FROM THE;; DATA BASE. THIS WILL LEAVE R4 POINTING TO THE PROPER SWB.Q;$ ; INPUTS:R;M; R4 POINT TO SWBS;E ; OUTPUTS:;N8; WORD READ INTO USER BUFFER. IF NECESSARY, FORK TO SET; EVENT FLAG OR QUEUE AN AST.;.;-1.DRIN0::MOV R3,(SP) ;;;SAVE R3--OVERWRITE OLD R4  .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESST6 BIT #S$CTRL,S.WFLG(R4) ;;;INTERRUPT BY CONTROL LINES? BEQ 5$ ;;;IF EQ NO2 BIS #DI$ENB,(R3) ;;;ENABLE INTS AND CLEAR IN FLAG MOV DI$BUF(R3),R3 ;;;GET DATUMI BR 7$%5$: MOV DI$BUF(R3),-(SP) ;;;READ DR114 .IF NDF Q$$BUS% MOV (SP),DI$BUF(R3) ;;;WRITE IT BACKF .ENDC ;Q$$BUS. BIS #DI$ENB,(R3) ;;;ENABLE FOR NEXT INTERRUPT MOV (SP)+,R3 ;;;GET DATUM(7$: CALL .KWRWD ;;;WRITE TO USER BUFFER BR .DRINX ;;;GO TO COMMON CODE .IF DF K$W11K;+3; .DRIN1 -- DR11 INPUT INTERRUPT WITH TIME STAMPINGT;SB; THIS ROUTINE IS ENTE00Óðaãa“_c”_d–_k›’RED WITH A JSR R4,.DRIN1 FROM THE DATA BASE,!; LEAVING R4 POINTING TO THE SWB.E;I ; INPUTS:V;$; R4 POINTS TO SWB;I ; OUTPUTS:;O6; DATA WORD AND VALUE OF 16-BIT SOFTWARE CLOCK AT TIME=; OF SAMPLE ARE WRITTEN INTO THE USER BUFFER. FORK REQUESTEDS.; IF NECCESARY TO SET EVENT FLAG OR QUEUE AST.;P;--.DRIN1::MOV R3,(SP) ;;;SAVE R3--OVERWRITE R4  .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSP5 BIT #S$CTRL,S.WFLG(R4) ;;;INTERRUPT BY CONTROL LINE?1 BEQ 5$ ;;;IF EQ NO2 BIS #DI$ENB,(R3) ;;;ENABLE INTS AND CLEAR IN FLAG MOV DI$BUF(R3),R3 ;;;GET DATUMP BR 7$*5$: MOV DI$BUF(R3),-(SP) ;;;READ DATA WORD .IF NDF Q$$BUSS% MOV (SP),DI$BUF(R3) ;;;WRITE IT BACKF .ENDC ;Q$$BUS. BIS #DI$ENB,(R3) ;;;ENABLE FOR NEXT INTERRUPT MOV (SP)+,R3 ;;;GET DATA WORD(7$: CALL .KWRWD ;;;WRITE TO USER BUFFER" MOV .CLK16,R3 ;;;GET 16 BIT CLOCK CALL .KWRWD ;;;WRITE TO BUFFER BR .DRINX ;;;GO TO COMMON CODE .ENDC ;K$W11K R, .SBTTL .DRIN2 DR11 OUTPUT INTERRUPT ROUTINE;+); .DRIN2 -- DR11 OUTPUT INTERRUPT ROUTINEG;MA; THIS ROUTINE IS CALLED WITH A JSR R4,.DRIN2 FROM THE DATA BASE.;-; THIS LEAVES R4 POINTING TO THE CORRECT SWB.,;B ; INPUTS:R; ; R4 POINTS TO SWB$;S ; OUTPUTS:;B9; WORD IS READ FROM USER BUFFER AND OUTPUT TO DR11. FORKT9; REQUESTED IF END OF BUFFER OR END OF SWEEP TO SET EVENT1; FLAG OR QUEUE AST.;;-1.DRIN2::MOV R3,(SP) ;;;SAVE R3--OVERWRITE OLD R4M .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE+ CALL .KRDWD ;;;READ WORD FROM USER BUFFERO MOV R3,-(SP) ;;;SAVE DATUM % MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESST% BIS #DO$ENB,(R3) ;;;ENABLE INTERRUPTT$ MOV (SP)+,DO$BUF(R3) ;;;OUTPUT DATA;+5; .DRINX -- FINISH UP DR11 INTERRUPT ROUTINE AND EXIT ;R); ENTER HERE TO FINISH UP DR11 INTERRUPT.S; ; INPUTS:U;R.; KISAR6 ON TOP OF STACK (MAPPED SYSTEMS ONLY); R3 NEXT ON STACK; C-SET IF FORK NECESSARY-;E ; OUTPUTS:;3; KISAR6, R3 RESTORED. FORK REQUESTED IF C-BIT SET8; IF STOPPING SWEEP, DR11 IS DISABLED FROM INTERRUPTING.;E;-.DRINX: ;;;REF LABEL .IFT ;M$$MGE,# MOV (SP)+,@#KISAR6 ;;;RESTORE APR63 .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3O! BCC 80$ ;;;IF CC NO FORK NEEDEDH* BIT #S$WSTP,S.WFL2(R4) ;;;STOPPING SWEEP? BEQ 60$ ;;;IF EQ NO ( CALL .DSBDR ;;;YES--DISABLE INTERRUPTS960$: CALLR .KEFQI ;;;FORK, SET EFN OR QUEUE AST AND EXITA 80$: RETURNF;+(; .DSBDR -- DISABLE DR11 FROM INTERRUPTS;R0; THIS ROUTINE DISABLES A DR11 FROM INTERRUPTING; ; INPUTS: ;D; R4 POINTS TO SWBT;. ; OUTPUTS:;I<; INPUT OR OUTPUT INTERRUPTS (AS APPROPRIATE) ARE DISABLED.;R;-1.DSBDR: MOV #DI$ENB,-(SP) ;;;ASSUME INPUT DISABLEE/ BIT #S$WIOF,S.WFL2(R4) ;;;CHECK WITH THE FLAGS$" BNE 20$ ;;;IF NE YES--GO DISABLE2 MOV #DO$ENB,(SP) ;;;NO--DISABLE OUTPUT INTERRUPTS020$: BIC (SP)+,@S.WCSR(R4) ;;;DISABLE INTERRUPTS; MOV #.DRNOP,-2(R4) ;;;REDIRECT INTERRUPTS TO DUMMY ROUTINEL .IFT ;M$$MGER* ADD $KRLC5,-2(R4) ;;;RELOCATE THRU KISAR5 .IFTF ;M$$MGE RETURN;+*; .DRNOP -- DUMMY DR11-K INTERRUPT ROUTINE;T; THIS ROUTINE EATS INTERRUPTS;T ; INPUTS:B;.; R4 POINTS TO SWB; (SP) CONTAINS OLD R4; ; OUTPUTS:;!; EFFECT A NOOP INTERRUPT SERVICET;H;-!.DRNOP::TST (SP)+ ;;;CLEAN STACKB RETURN ;;;LOSE INTERRUPT HERE O2 .SBTTL .DRIN3 SCHMITT TRIGGER SIMULATOR INTERRUPT;+6; .DRIN3 -- SIMULATE SCHMITT TRIGGER INTERRUPT ROUTINE;M<; THIS ROUTINE IS ENTERED WITH A JSR R4,.DRIN3 FROM THE DATA'; BASE, LEAVING R4 POINTING TO THE SWB.; ; INPUTS:P; ; R4 POINTS TO SWB;R ; OUTPUTS:;H9; ALL SWEEPS REQUESTING EXTERNAL EVENT START ARE STARTED. 4; IF CLOCK IS IN THE SYSTEM, IT IS ENABLED TO COUNT.;E;--.DRIN3::MOV R3,(SP) ;;;SAVE R3, OVERWRITE R4S .IFT ;M$$MGEC MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE& MOV S.WCSR(R4),R3 ;;;SET UP R3 TO CSR+ MOV DI$BUF(R3),-(SP) ;;;READ DIGITAL INPUTR .IF NDF Q$$BUS % MOV (SP),DI$BUF(R3) ;;;WRITE IT BACKI00ÓøaËa¿a`TADATADATADATADATADATA .ENDC ;Q$$BUS2 BIT (SP)+,S.WMSK(R4);;;ANY LIT BITS SATISFY DIGO?! BNE 10$ ;;;IF NE YES--GO HANDLEU2 BIS #DI$ENB,(R3) ;;;NO--ENABLE FOR NEXT INTERRUPT BR 100$ ;;;GO EXIT210$: BIC #S$WSST,S.WFL2(R4) ;;;YES--CLEAR SST FLAG .IF DF FT$MOP .IF DF M$$MGE< MOV #<.KLQUX-S.WCLX>+120000-<$KBASE & 177700>,R4 ;;;PT TO Q .IFF ;M$$MGEN' MOV #<.KLQUX-S.WCLX>,R4 ;;;PT TO QUEUER .ENDC ;M$$MGE .IF DF K$$W11( MTPS #PR6 ;;;LOCK OUT CLOCK INTERRUPTS .ENDC ;K$$W11/15$: MOV S.WCLX(R4),R4 ;;;LINK TO NEXT IN QUEUES BEQ 80$ ;;;IF EQ ALL DONES/ BIT #S$WEXT,S.WFLG(R4) ;;;WANT EXTERNAL START?S# BEQ 15$ ;;;IF EQ NO--LOOK AT NEXTI* BIC #S$WEXT,S.WFLG(R4) ;;;YES--CLEAR FLAG .IFF ;FT$MOP;! MOV .KASWX,R4 ;;;GET SWB ADDRESSP- BEQ 100$ ;;;I DON'T KNOW WHAT TO DO IF 0!!!00 BIT #S$WEXT,S.WFLG(R4) ;;;DOING EXTERNAL START? BEQ 100$ ;;;IF EQ NO-60$: BIC #S$WEXT,S.WFLG(R4) ;;;YES--CLEAR FLGF .ENDC ;FT$MOP .IF DF M$$MGE3 MOV S.WSTR(R4),-(SP) ;;;PREPARE TO CALL ST ROUTINE4, ADD $KRLC5,(SP) ;;;RELOCATE ADDRESS TO APR5 CALL @(SP)+ ;;;CALL ST ROUTINE .IFF ;M$$MGEE: CALL @S.WSTR(R4) ;;;CALL SCHMITT TRIGGER ROUTINE TO START ;;; SWEEP .ENDC ;M$$MGE .IF DF FT$MOP! BR 15$ ;;;EXAMINE REST OF QUEUE .ENDC ;FT$MOP80$: ;;;REF LABEL .IF DF K$$W11) MOV .KACSR,R3 ;;;GET CLOCK A CSR ADDRESS0; BIC #KA$STF!KA$STI!KA$STE,(R3) ;;CLEAR SCHMITT TRIG ENABLEF# INC (R3) ;;;ENABLE CLOCK TO COUNTE .IF DF FT$MOP2 MTPS S.WPRI(R4) ;;;LOWER PRIORITY TO DEVICE AGAIN .ENDC ;FT$MOP .ENDC ;K$$W11100$: ;;;REF LABELI .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6  .ENDC ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3C RETURN ;;;F > .SBTTL .DRISR/.DROSR/.DRSTR SYNCHRONOUS CLOCK DRIVEN ROUTINES .IF DF K$$W11;+(; .DRISR -- SYNCH. DIGITAL INPUT ROUTINE;CC; THIS ROUTINE IS CALLED AT CLOCK INTERRUPT LEVEL TO INPUT ONE WORDG; FROM THE DR11.;; ; INPUTS:O;T; R4 POINTS TO SWB ; R3 FREEM; ; OUTPUTS:;O<; DATA WORD IS INPUT FROM DR11 AND WRITTEN INTO USER BUFFER.); C-SET NEED FORK TO SET EFN OR QUEUE ASTM; C-CLEAR ALL IS WELLR;;;-,.DRISR::MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESS* MOV DI$BUF(R3),-(SP);READ VALUE FROM DR11 .IF NDF Q$$BUSS0 MOV (SP),DI$BUF(R3) ;;;WRITE BACK TO CLEAR BITS .ENDC ;Q$$BUS MOV (SP)+,R3 ;RETRIEVE VALUE, CALLR .KWRWD ;;;WRITE TO BUFFER AND RETURN .IF DF K$W11K;+0; .DRIST -- DR11 SYNCH. INPUT WITH TIME STAMPING;B>; THIS ROUTINE IS CALLED AT CLOCK INTERRUPT LEVEL TO INPUT ONEB; DATA WORD FROM THE DR11 AND STORE IT AND THE VALUE OF THE 16-BIT$; SOFTWARE CLOCK IN THE USER BUFFER.; ; INPUTS: ;C; R4 POINT TO SWBR ; R3 FREEM;D ; OUTPUTS:;;9; BOTH DATA WORDS (DR11 INPUT AND 16-BIT CLOCK VALUE) AREF; WRITTEN INTO USER BUFFER.I); C-SET NEED FORK TO SET EFN OR QUEUE ASTI; C-CLEAR ALL OK;W;-,.DRIST::MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESS* MOV DI$BUF(R3),-(SP);READ VALUE FROM DR11 .IF NDF Q$$BUS0 MOV (SP),DI$BUF(R3) ;;;WRITE BACK TO CLEAR BITS .ENDC ;Q$$BUS MOV (SP)+,R3 ;RETRIEVE VALUEA* CALL .KWRWD ;;;WRITE WORD TO USER BUFFER( MOV .CLK16,R3 ;;;GET 16-BIT CLOCK VALUE1 CALLR .KWRWD ;;;WRITE TO USER BUFFER AND RETURN .ENDC ;K$W11K;+); .DROSR -- SYNCH. DIGITAL OUTPUT ROUTINEE;N?; THIS ROUTINE IS CALLED AT CLOCK INTERRUPT LEVEL TO OUTPUT ONE-; WORD TO THE DR11.;D ; INPUTS:.;R; R4 POINTS TO SWB ; R3 FREEV;$ ; OUTPUTS:;E.; NEXT DATA WORD FROM BUFFER IS OUTPUT TO DR11+; C-SET FORK NEEDED TO SET EFN OR QUEUE AST; C-CLEAR ALL OK;V;-&.DROSR::CALL .KRDWD ;;;READ DATA WORD MOV R3,-(SP) ;;;SAVE DATA WORDL% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSR6 MOV (SP)+,DO$BUF(R3) ;;;WRITE DATA TO OUTPUT REGISTER- RETURN ;;;RETURN WITH C INTACT FROM .KRDWD  .ENDC ;K$$W11;+2; .DRSTR -- HANDLE SCHMITT TRIGGER START INTERRUPT;A; THIS ROUTINE IS CALLED BY THE SCHMITT TRIGGER INTERRUPT ROUTINEFD; TO START A DIGITAL I/O SWEEP AFTER THE ST FIRING AND/OR DELAY FROM; START EVENT.;-?.DRSTR00ÓbÔb“_c”_d–_k›’::BIT #S$WNOV,S.WFLG(R4) ;;;NON-OVERFLOW DRIVEN SAMPLING?A$ BEQ 40$ ;;;IF EQ NO--NOTHING TO DO2 CALL .DRSLI ;;;SELECT INTERRUPT ROUTINE -- COULD* ;;; HAVE BEEN DIGO STARTING THIS SWEEP/ MOV S.WCSR(R4),R3 ;;;YES--GET UNIT CSR ADDRESSH( MOV #DI$ENB,-(SP) ;;;ASSUME INPUT SWEEP+ BIT #S$WIOF,S.WFL2(R4) ;;;CHECK TO BE SURET BNE 20$ ;;;IF NE INPUT SWEEP* MOV #DO$ENB,(SP) ;;;NO--SET OUTPUT ENABLE,20$: BIS (SP)+,(R3) ;;;ENABLE FOR INTERRUPTS 40$: RETURNA .ENDAY FROM; START EVENT.;-?.DRSTR* .TITLE KSTADC SET A/D CHANNEL INFORMATION .IDENT /02.01/; ; COPYRIGHT (C) 1977, 1978, 1980/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 02.01 ; B. SCHREIBER 16-AUG-77;E; MODIFIED BY:;U; M. S. HARVEY 3-JAN-80T/; MSH081 -- CORRECT ARGUMENT VALIDATION CHECKS;O9; HB021 -- FLAG SETADC CALLED WHEN CALL .ADGCH SUCCEEDS;N;C?; THIS ROUTINE SETS UP A/D CHANNEL INFORMATION FOR AN A/D SWEEPI; ; SYSTEM MACRO CALLS;  .MCALL KSWDF$ KSWDF$T ;+'; SETADC -- SET A/D CHANNEL INFORMATION ;U; CALLING SEQUENCE: ; 5; CALL SETADC(IBUF,[IFLAG],[ICHN],[NCHN],[INC],[IND]) ; OR0; INC = (IBUF,[IFLAG],[ICHN],[NCHN],[INC],[IND]);S ; INPUTS:-;-1; IBUF (IGNORED--PRESENT FOR LPA11 COMPATIBILITY)TA; IFLAG IS 0 (DEFAULT) IF ABS CHANNEL ADDRESSING, NON-0 OTHERWISE-1; ICHN IS THE FIRST CHANNEL NUMBER (DEFAULT IS 0)9; NCHN IS THE NUMBER OF CHANNEL INCREMENTS (DEFAULT IS 1)/9; INC IS THE SIZE OF THE CHANNEL INCREMENT (DEFAULT IS 1); USE 2 FOR DIFFERENTIAL INPUT ; ; OUTPUTS:;T!; IND 0 IF ILLEGAL CHANNEL NUMBER; 1 IF ALL OK.; CHANNEL INFORMATION SET IN SWB FOR A/D SWEEP; ;-SETADC:: ;REF LABEL,ISTADC:: ;REF LABELU/ CALL .K.PAA ;VALIDATE AND SETUP ARGS ON STACKA .WORD 6 ;SIX ARGUMENTS. .WORD 40 ;ALL MAY BE DEFAULTED (EXCEPT IBUF) BCS 100$ ;IF CS ERROR % MOV #.ADSWB,R4 ;POINT AT THE A/D SWBI, TST (SP)+ ;POP OFF IBUF ADDRESS (NOT USED)" CLR S.WFLG(R4) ;CLEAR SWEEP FLAGS/ MOV (SP)+,R3 ;GET 'IFLAG' AND SEE IF DEFAULTEDE BNE 10$ ;IF NE NOU% MOV #.ZEROW,R3 ;YES--POINT AT A ZERON10$: MOV (SP)+,R0 ;GET 'ICHN'E MOV (SP)+,R1 ;GET 'NCHN'R MOV (SP)+,R2 ;GET 'INC' BNE 20$ ;IF NE USE GIVEN 'INC'! MOV #.ONE,R2 ;DEFAULT 'INC' TO 1N&20$: CMP #2,(R2) ;DIFFERENTIAL INPUT? BNE 40$ ;IF NE NO;% BIS #S$WDIF,S.WFL2(R4) ;YES--FLAG ITS340$: MOV (R2),S.WCHI(R4) ;SET THE CHANNEL INCREMENT/9 BIS #S$WACA,S.WFL2(R4) ;FLAG ABSOLUTE CHANNEL ADDRESSINGS TST (R3) ;CHECK WITH 'IFLAG' BEQ 45$ ;IF EQ YES- BIC #S$WACA,S.WFL2(R4) ;NO--CLEAR BIT IN SWB3 BIS #7,S.WFLG(R4) ;SET GAIN BITS FOR .ADGCH TO SEE+(45$: MOV SP,R5 ;SET SAVED STACK POINTER' MOV R1,-(SP) ;SET ARGS BACK ONTO STACKI MOV R0,-(SP) ; ...( CALL .ADGCH ;SETUP CHANNEL INFORMATION50$: MOV #1,R0 ;ASSUME SUCCESS BCC 60$ ;IF CC CORRECT CLR R0 ;ELSE SET FOR FAILUREC60$: BIS #S$WADC,S.WFL2(R4) ;FLAG THAT WE WERE HERE (SETADC CALLED)A( MOV (SP)+,R5 ;GET ADDRESS OF IND OR 0  BEQ 80$ ;IF EQ NO 'IND' GIVENA$ MOV R0,(R5) ;STORE RESULT IN 'IND'80$: RETURN ;BACK TO CALLERW;; HERE IF ERROR FROM .K.PAAB; (100$: CLR R0 ;CLEAR FOR FUNCTION RETURN CLR R3 ;SET CODE FOR .IESTOP& MOV #6,R4 ;STORE INTO SIXTH ARGUMENT- CALLR .IESTO ;TRY TO STORE ERROR AND RETURNA .END: MOV #1,R0 ;ASSUME SUCCESS BCC 60$00ÕbËa¿a`TADATADATADATADATADATA$ .TITLE KADINP SINGLE CHAN A/D INPUT .IDENT /2.02/;#; COPYRIGHT (C) 1977, 1981/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.T;D>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 2.02; B. SCHREIBER 20-OCT-77; ; MODIFIED BY:; ; M. S. HARVEY 4-JAN-80D(; MSH082 -- CORRECT GAIN RANGING OPTION;T; H. BERNSTEIN 20-OCT-815; HB018 -- ADD UCB OFFSET TO ACCESS SUBSEQUENT UCBs;'; HB039 -- MAKE U.LGTH IMMEDIATE MODEJ; ;C1; THIS MODULE PERFORMS A SINGLE A/D CHANNEL INPUTD; ; SYSTEM MACRO CALLS; .MCALL KSWDF$, KDVDF$ KSWDF$E KDVDF$  R- .SBTTL ADINP/IADINP SINGLE CHANNEL A/D INPUT ;+6; ADINP/IADINP -- SINGLE CHANNEL A/D SINGLE SHOT INPUT;E=; THIS ROUTINE SAMPLES ONE A/D CHANNEL ONE TIME (SINGLE SHOT) ;S; CALLING SEQUENCE: ;H ; CALL ADINP (MODE, ICHAN, IVAL);T; WHERE:;E.; MODE DESCRIBES THE MODE (SEE DOCUMENTATITON) ; ICHAN IS THE CHANNEL TO SAMPLE; IVAL IS THE SAMPLED VALUED; ; OUTPUTS:;M; IVAL THE SAMPLE VALUE/;H;-ADINP:: IADINP::# CALL .K.PAA ;PUSH ARGS ONTO STACKD .WORD 3 ;THREE ARGS .WORD 0 ;NONE REQUIRED. BCS 140$ ;HOW CAN YOU LOSE IF NONE REQUIRED? MOV (SP)+,R0 ;GET MODE ADDRESSI BNE 20$ ;IF NE CONTINUEM& MOV #.ZEROW,R0 ;ELSE USE DEFAULT OF 020$: MOV (R0),R4 ;GET MODE $ MOV (SP)+,R1 ;GET CHANNEL # ADDRESS BNE 40$ ;BR IF SUPPLIEDD MOV #.ZEROW,R1 ;USE CHANNEL 0"40$: MOV (R1),R5 ;GET THE CHANNEL0 CALL .ADIFU ;FIND A/D UNIT AND RETURN WITH CSR( ; ADDRESS IN R3, AND LH OF CSR IN R2( BCS 120$ ;IF CS ILLEGAL CHANNEL NUMBER, MOVB R2,1(R3) ;SET THE CHANNEL INTO THE CSR INC (R3) ;START THE CONVERSION( MOV #TMO$AD,R2 ;GET THE TIMEOUT COUNTER,60$: BIT #AD$ERR!AD$DON,(R3) ;ERROR OR DONE? BMI 80$ ;IF MI ERROR BNE 100$ ;IF NE DONE DEC R2 ;NEITHER--TIMEOUT? BGT 60$ ;NOT YET' MOV #ADTMOV,R0 ;YES--SET TIMEOUT VALUEE BR 120$ ;FINISH UP;C; A/D CONVERSION ERROR; $80$: MOV 2(R3),R0 ;READ VALUE ANYHOW .IF DF Q$$BUS" BIC #AD$ERR,(R3) ;CLEAR ERROR BIT .ENDC ;Q$$BUS MOV #ADERRV,R0 ;SET ERROR VALUE BR 120$ ;FINISH;; "; CONVERSION COMPLETED--READ VALUE;T100$: ;REF LABELM .IF DF A$$M11 CMP R4,#5 ;GAIN RANGING? BNE 110$ ;IF NE NO- CALL .ADIGR ;YES--PERFORM AUTO-GAIN RANGING0 BR 120$ ;RETURNC .IFTF ;A$$M11(110$: MOV 2(R3),R0 ;READ CONVERTED VALUE .IFT ;A$$M11 & TST R4 ;ABSOLUTE CHANNEL ADDRESSING?. BEQ 120$ ;IF EQ YES--SKIP GAIN BIT INSERTION MOV (R3),R1 ;NO--GET CSR WORDC( BIC #147777,R1 ;CLEAR ALL BUT GAIN BITS& BIS R1,R0 ;SET GAIN BITS INTO RESULT .ENDC ;A$$M11$120$: MOV (SP)+,R1 ;GET IVAL ADDRESS- BEQ 140$ ;IF EQ NOPLACE TO STORE--JUST EXIT1 MOV R0,(R1) ;STORE INTO IVAL140$: RETURN ;DONE L' .SBTTL .ADIFU FIND A/D UNIT AND SET UP0;+; .ADIFU -- FIND A/D UNIT$;1 ; INPUTS:O;(; R4 MODE FLAGE; R5 CHANNEL NUMBERA;1 ; OUTPUTS:;;; R3 CSR ADDRESS; R2 LH (CHANNEL) OF CSR; ;-E.ADIFU: MOV #.ADSWB+S.WUCB-U.LGTH,R3 ;POINT TO FIRST UCB MINUS U.LGTHR& MOV #-1,R2 ;INIT THE CHANNEL COUNTER3 MOV .ADSWB+S.WUNT,R1 ;GET NUMBER OF A/D CONVERTERS ; ; HERE FOR EACH CONVERTER;Q%20$: MOV #16.,R0 ;ASSUME 16 CHANNELSI+ ADD #U.LGTH,R3 ;POINT TO FIRST OR NEXT UCBU .IF DF A$$M11) BIT #UF$AMK,U.FLG(R3) ;IS THERE AN AM11? BEQ 40$ ;NO--ONLY 16 CHANNELS % TST R4 ;GAIN RANGING (OF ANY00Õbb“_c”_d–_k›’ SORT)?A- BNE 40$ ;IF NE YES--NOT ABS CHAN ADDRESSINGE0 MOV #64.,R0 ;ABS CHAN MODE W/AM11--64 CHANNELS .IFTF ;A$$M11-40$: ADD R0,R2 ;COMPUTE LAST CHANNEL ON UNIT#- CMP R5,R2 ;IS DESIRED CHANNEL ON THIS UNIT?. BLOS 100$ ;IF LOS YESD" DEC R1 ;NO--LOOKED AT ALL UNITS? BGT 20$ ;IF GT NOV& CLR R0 ;CLEAR IN CASE WE STORE VALUE SEC ;FLAG A SCREW UPR RETURNU;; WE FOUND THE UNITT;F"100$: MOV R5,R2 ;COPY THE CHANNEL .IFT ;A$$M11L% BIC #^C<77>,R2 ;ASSUME ABS CHAN MODEF TST R4 ;SEE IF SO$ BEQ 120$ ;IF EQ YESH .ENDC ;A$$M11# BIC #^C<17>,R2 ;NO--TRIM SOME MOREH BIC #^C<7>,R4 ;TRIM MODE FLAG( MOVB GAINTB-1(R4),R1 ;GET THE GAIN BITS$ ADD R1,R2 ;TO GET THE CHANNEL BYTE3120$: MOV U.CSR(R3),R3 ;GET THE CSR ADDRESS OF UNITO CLC RETURNT;B; TABLE OF GAIN VALUES; GAINTB: .BYTE 0,20,40,60,0,0,0,0 .EVEN A4 .SBTTL .ADIGR A/D GAIN RANGING FOR SINGLE A/D INPUT;+.; .ADIGR -- SINGLE A/D INPUT AUTO-GAIN RANGING;C ; INPUTS: ;S*; A/D CONVERTER MUST HAVE THE DONE BIT SET; R3 POINTS TO CSR; ; OUTPUTS:;; R0 CONVERTED VALUE;I;-*.ADIGR: MOV 2(R3),R0 ;READ CONVERTED VALUE .IF DF A$$M11 CLR R1 ;CLEAR GAIN BITS2) CMP R0,#4000 ;IS VALUE IN POSITIVE RANGE( BGE 20$ ;IF GE YES NEG R0 ;NEGATE RESULTT BEQ 100$ ;IF EQ GET OUT NOWU& BIC #^C<7777>,R0 ;TRIM TO TWELVE BITS/20$: CMP R0,#4200 ;NEED TO SAMPLE ABOVE GAIN 4?  BLT 30$ ;IF LT YES$ CMP R0,#5000 ;NO--SAMPLE AT GAIN 1? BGE 100$ ;IF GE YESS0 MOV #<1*20>*400,R1 ;NO--SET TO SAMPLE AT GAIN 4 BR 40$ ;GO SAMPLE130$: MOV #<2*20>*400,R1 ;SET TO SAMPLE AT GAIN 16! CMP R0,#4040 ;SAMPLE AT GAIN 16?D BGE 40$ ;IF GE YES1 MOV #<3*20>*400,R1 ;NO--SET TO SAMPLE AT GAIN 64 "40$: BIS R1,(R3) ;SET MUX CHANNEL INC (R3) ;START CONVERSION" MOV #TMO$AD,R0 ;GET TIMEOUT COUNT,60$: BIT #AD$ERR!AD$DON,(R3) ;ERROR OR DONE? BMI 80$ ;IF MI ERROR BNE 100$ ;IF NE DONE DEC R0 ;NOT YET--CHECK TIMEOUT BGT 60$ ;IF GT NOT TIMEOUT' MOV #ADTMOV,R0 ;YES--SET TIMEOUT VALUEN BR 120$ ;RETURN $80$: MOV 2(R3),R0 ;READ VALUE ANYHOW MOV #ADERRV,R0 ;SET ERROR VALUE BR 120$ ;RETURN4(100$: MOV 2(R3),R0 ;READ CONVERTED VALUE BIS R1,R0 ;SET THE FULL VALUET .ENDC ;A$$M11(120$: RETURN ;RETURN WITH SAMPLE IN R0 .END;START CONVERSION" MOV #TMO$AD,R0 ;GET TIMEOUT COUNT,60$: BIT #AD$ERR!AD$DON,(R3) ;ERROR OR DONE? BMI 80$ ;IF MI ERROR BNE 100$ ;IF NE DONE DEC R0 ;NOT YET--CHECK TIMEOUT BGT 60$ ;IF GT NOT TIMEOUT' MOV #ADTMOV,R0 ;YES--SET TIMEOUT VALUEN B .TITLE DRSWS .IDENT /02.00/; ; COPYRIGHT (C) 1982, 1983, 1984/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;?; THIS SOFTWARE IS FURNISHED UNDER LICENSE AND MAY ONLY BE USED6; OR COPIED ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; J. M. LAWLER 03-DEC-82;G; THIS MODULE WAS ORIGINALLY WRITTEN FOR P/OS BY M.C. OZUR ON 21-DEC-81;; MODIFIED BY:;; MACRO LIBRARY CALLS; .MCALL HWDDF$,TCBDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS TCBDF$ ;DEFINE TCB OFFSETS;+; **-$DRSWS-SWITCH STATE 0;0D; THIS DIRECTIVE ALLOWS A PRIVILEGED TASK WHICH IS NOT MAPPED TO THEA; EXECUTIVE TO EXECUTE A SUBROUTINE IN SYSTEM STATE. THE USER ISN@; CALLED BACK ON THE SYSTEM STACK WITH ALL REGISTERS PRESERVED. >; TO RETURN TO TASK LEVEL THE CALLER MERELY EXECUTES A RETURN.; ; DPB FORMAT:T;F#; WD. 00 -- DIC(175.),DPB SIZE(3.).@; WD. 01 -- BASE ADDRESS FOR MAPPING USERS SYSTEM STATE ROUTINE.:; WD. 02 -- VIRTUAL ADDRESS OF USERS SYSTEM STATE ROUTINE.;N ; INPUTS:T;9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.W); R3=ADDRESS OF USER BASE ADDRESS IN DPB.T/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)S;E-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. &; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.A<; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE SPECIFIED; TASK IS NOT PRIVILEGED. :; DIRECTIVE STATUS OF 'D.RS81' IS R00b€b¿a`TADATADATADATADATADATAETURNED IF THE VIRTUAL4; ADDRESS OF SYSTEM STATE SUBROUTINE IS NOT WITHIN; 4KW OF BASE ADDRESS;4;- .IF DF S$$WST .ENABL LSB 0$DRSWS::TST (SP)+ ;REMOVE RETURN ADDR TO DRDSP , BIT #T3.PRV,T.ST3(R5) ;IS TASK PRIVILEGED ? BEQ 10$ ;IF EQ, NO& MTPD$ @#H.DSW ;RETURN SUCCESSFUL DSW MOV (R3)+,R0 ;GET BASE ADDRESSS5 MOV (R3)+,-(SP) ;GET ADDRESS OF SYSTEM STATE ROUTINEI. BIC #77,R0 ;CLEAR OUT BYTE WITHIN 32WD BLOCK .IF DF U$$DAS( CALL $RELUI ;RELOCATE TO APR 6 ADDRESS .IFF ; DF U$$DASE( CALL $RELOC ;RELOCATE TO APR 6 ADDRESS .ENDC ; DF U$$DAS ) SUB #20000,R2 ;RELOCATE TO APR 5 ADDRESST; SUB R0,(SP) ;GET DISPLACEMENT FROM BASE TO SYS STATE CODE 8 CMP (SP),#20000 ;TARGET SUBROUTINE WITHIN APR OF BASE ?+ BHIS 20$ ;IF GE, NO - ILLEGAL COMBINATIONC# ADD R2,(SP) ;MAKE APR 5 ADDRESSESD+ MOV R1,KINAR5 ;SET UP KERNEL INSTRUCTION 5E .IF DF K$$DAS B$ MOV R1,KDSAR5 ;SET UP KERNEL DATA 5 .ENDC ; DF K$$DAS5 MOV #$STACK-4,R0 ;POINT TO USER'S PC ON KERNEL STACKF MOV -(R0),R5 ;RESTORE USER'S R5 MOV -(R0),R4 ; R4 MOV -(R0),R3 ; R3 MOV -(R0),R2 ; R2 MOV -(R0),R1 ; R1 MOV -(R0),R0 ; R0<; COMPLETE DIRECTIVE PROCESSING FOR TASK. UPDATE USER SP TO<; REMOVE DPB OR ADDRESS OF DPB FROM THE STACK. A SUCCESSFUL,; DSW HAS ALREADY BEEN RETURNED TO THE USER.! MFPI SP ;GET USER STACK POINTERE. ADD $BTRMV,(SP) ;REMOVE BYTES FROM USER STACK% MTPI SP ;RESTORE USER STACK POINTERR, CLR $BTRMV ;ZERO 'BYTES TO REMOVE' IN CASE" ;PRIVILEGED TASK ISSUES A TRAPA; THE USER IS CALLED BACK WITH THE SAME STACK FORMAT AS A CALL TOV5; $SWSTK. THE STACK WAS ADJUSTED TO REMOVE THE RETURN 5; ADDRESS TO THE DIRECTIVE DISPATCHER AND THE +1 DSW.D; ; 20(SP)=PS PUSHED BY TRAP; 16(SP)=PC PUSHED BY TRAP; 14(SP)=SAVED R5 ; 12(SP)=SAVED R4N; 10(SP)=SAVED R3E; 06(SP)=SAVED R2T; 04(SP)=SAVED R1E; 02(SP)=SAVED R0;!; 00(SP)=RETURN ADDRESS TO SYSXT ) CALLR @(SP)+ ;JUMP TO USER'S SUBROUTINE '10$: DRSTS D.RS16 ;PRIVILEGE VIOLATIONI-20$: DRSTS D.RS81 ;ILLEGAL MAPPING SPECIFIEDD .DSABL LSBS .ENDC ;DF S$$WST  .END; $SWSTK. THE STACK WAS ADJUSTED TO REMOVE THE RETURN 5; ADDRESS TO THE DIRECTIVE DISPATCHER AND THE +1 DSW.D; ; 20(SP)=PS PUSHED BY TRAP; 16(SP)=PC PUSHED BY TRAP; 14(SP)=SAVED R5 ; 12(SP)=SAVED R4N; 10(SP)=SAVED R3E; 06(SP)=SAVED R2T; 04(SP)=SAVED R1E; 02(SP)=SAVED R0;!; 00(SP)=RETURN ADDRESS TO SYSXT ) CALLR @(SP)+ ;JUMP TO USER'S S .TITLE UTLDEF .IDENT /01/;; COPYRIGHT (C) 1982; ALL RIGHTS RESERVED/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;?; THIS SOFTWARE IS FURNISHED UNDER LICENSE AND MAY ONLY BE USED6; OR COPIED ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; T. LEKAS 04-JUN-82;; MODIFIED BY:;;4; THIS MODULE CONTAINS DEFINITIONS AND ROUTINES FROM0; EXEC MODULES THAT HAVE GONE AWAY IN XT SYSTEMS;$ALEB1::SEC ;FAIL MOV (SP)+,(SP)$QEMB:: RETURN$DVCER::$DVERR::$DTOER:: .WORD 0;D;++; **-$LDPWF-CALL DRIVER AT POWERFAIL ENTRY.L;ID; THIS ROUTINE WILL UNCONDITIONALLY CALL THE DRIVER AT ITS POWERFAIL; ENTRY FOR A SINGLE UNIT.;D ; INPUTS:A;M; R2=DDT ADDRESS. ; R3=DCB ADDRESS.E; R4=SCB ADDRESS.S; R5=UCB ADDRESS. ;L ; OUTPUTS:;; NONE;I; NO REGISTERS ARE PRESERVED!;-;S6$LDPWF::MOV KINAR5,-(SP) ;SAVE KERNEL INSTR ADDR REG 5/ MOV KINAR6,-(SP) ;SAVE KERNEL INSTR ADDR REG 6) MOV D.PCB(R3),R3 ;GET DRIVER PCB ADDRESS:% MOV P.REL(R3),KINAR5 ;MAP THE DRIVER+&55$: MOV S.KRB(R4),R3 ;GET KRB ADDRESS BEQ 60$ ;IF EQ NO KRB ADDRESSN( MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX;:; CALL DRIVER AT POWERFAIL ENTRY POINT WITH THE ARGUMENTS:;S; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.'; R5=ADDRESS OF THE UNIT CONTROL BLOCK.R;R"; IF S.KRB=0 THEN R3 IS UNDEFINED.;5(60$: TST D.VPWF(R2) ;IS THERE AN ENTRY ? BEQ 70$ ;IF EQ NON CLC6 CALL @D.VPWF(R2) ;CALL DRIVER AT POWERFAIL ENTRYPOINT70$: ;REFERENCE LABEL00€ b�!b“_c”_d–_k›’2 MOV (SP)+,KINAR6 ;RESTORE KERNEL INSTR ADDR REG 62 MOV (SP)+,KINAR5 ;RESTORE KERNEL INSTR ADDR REG 5 RETURN ;O .ENDIÿÿEX;:; CALL DRIVER AT POWERFAIL ENTRY POINT WITH THE ARGUMENTS:;S; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.'; R5=ADDRESS OF THE UNIT CONTROL BLOCK.R;R"; IF S.KRB=0 THEN R3 IS UNDEFINED.;5(60$: TST D.VPWF(R2) ;IS THERE AN ENTRY ? BEQ 70$ ;IF EQ NON CLC6 CALL @D.VPWF(R2) ;CALL DRIVER AT POWERFAIL ENTRYPOINT70$: ;REFERENCE LABEL .TITLE MFDRV .IDENT /0.00/;; COPYRIGHT (c) 1983. /; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;=; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE >; USED OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; VERSION 0.00;1 .ENABL LC ; Lower Case - Comments Field, Only !;+;O; MFDRV is presently NOT SUPPORTED and should NOT YET BE USED on RSX11M-PLUS. M; Such support will be provided in an upcoming update. This driver reservesF; space for a supported MFDRV to be provided in that upcoming update.; ;3F; MFDRV is the software interface between the RSX11M Operating System ); and DEC RH70/TM78/TU78 configurations. ;E; The TM78/TU78 DEC Magtape System has the following characteristics: ;SG; TM78 Control Unit - May have up to four (4) TU78 Tape Units attached.G; TU78 Tape Unit - Data Recording Mode is 6250BPI (GCR) or 1600BPI (PE)-F; at 125IPS (Inches/Sec.) Data recording is per ANSI X3.39 (1600BPI); and ANSI X3.54 (6250BPI).;-; d; C. SESTOKAS March 1983; ; EDIT DATE AUTHOR REASONF; ____ ____ ______ ______ ; 001; ;1;O a .SBTTL MACROS;+; MACRO LIBRARY CALLSf;- .MCALL HWDDF$,PKTDF$,UCBDF$ HWDDF$ ; Hardware Registerso PKTDF$ ; I/O Packet OffsetsM% UCBDF$ ; Unit Control Block Offsets4 .IF DF D$$IAG1 .MCALL UMDIO$ ; User Mode Diagnostic Defenitions  .ENDC;+F; Linkage Macros - Used by this Driver servicing TM78/TU78 interrupts.;- ; -- SUBR --.MACRO SUBR ARG.1 MOV #.+12,@#ARG-2*T$$M78 ; Setup Linkage AddressD" JMP ARG ; and GO TO Subroutine. .ENDM SUBR ; -- RTRN --.MACRO RTRN ARGA, JMP @ARG-2*T$$M78 ; Return from Subroutine. .ENDM RTRN , D;+; MACRO DEFENITIONSe;-; -- PUSH -- following forms:t;,; 1. Arguments may be defined or undefined. 7; They are enclosed in < > and separated by commas. i@; Undefined Arguments are null elements signified by a comma.; 2. No Arguments.).MACRO PUSH ARGS ; Push Items on Stack.B,.NARG HWMNY ; Number of Arguments in Call.$ .IF EQ HWMNY ; IF No Arguments,) CLR -(SP) ; THEN Reserve Stack Space.M .MEXIT ;HWMNY .IFF ; IF Arguments. .IRP X,E) .IF B X ; IF Argument missing,-( CLR -(SP) ; THEN Reserve Stack Space. .IFF ; IF Arguments( MOV X,-(SP) ; THEN Put Them on Stack. .ENDC ;X .ENDM ;X, .ENDC ;HWMNY .ENDM PUSH#; -- POP -- same forms as for PUSH.*.MACRO POP ARGS ; Pop Items from Stack.,.NARG HWMNY ; Number of Arguments in Call.$ .IF EQ HWMNY ; IF No Arguments,) INC (SP)+ ; THEN Skip Stack Element. .MEXIT ;HWMNY .IFF ; IF Arguments. .IRP X,& .IF B X ; IF Argument missing,( INC (SP)+ ; THEN Skip Stack Element. .IFF ; IF Arguments2 MOV (SP)+,X ; THEN Pop Them off Stack & to ARG. .ENDC ;X .ENDM ;X, .ENDC ;HWMNY .ENDM POP-:; **** Note PUSH/POP Usage: IF PUSH R2,R3 THEN POP R3,R2. f& .SBTTL TM78 DEVICE, MASSBUS REGISTERSGTMREGS = 22. ; # TM78 Device Registers - not including MFBAE, MFCS3.H3 ; Accessing MFIA may result in MFCS1 C1.CPE set.  ;#MFCS1 = +00 ; Control and Status 1IMFWC = + 2 ; Word CountMFBA = 4 ; UNIBUS AddressMFBC = 6 ; Byte Count#MFCS2 = 10 ; Control and Status 2 MFDI = 12 ; Data InterruptMFDM = 14 ; Data Mode MFAS = 16 ; Attention Summary MFDS = 20 ; Drive StatusMFDB = 22 ; Data BufferPMFDE = 24 ; Diagnostic ErrorMFDT = 26 ; Driv00�(bb¿a`TADATADATADATADATADATAe TypeMFSN = 30 ; Serial Number2 MFDR = 32 ; Diagnostic RequestMFDD = 34 ; Diagnostic Data;!MFNDI = 36 ; Non Data Interrupt -MFND0 = 40 ; Non Data Command - Tape Unit 0S*MFND1 = 42 ; | | | - Tape Unit 1*MFND2 = 44 ; | | | - Tape Unit 2-MFND3 = 46 ; Non Data Command - Tape Unit 3=MFIA = 50 ; Internal AddressMFCR = 52 ; Control register .IF DF M$$EXT ; 22 Bit Addr. -MFBAE = 54 ; Bus Address Extension Register4#MFCS3 = 56 ; Control and Status 3r .ENDC ;M$$EXT0 & .SBTTL REGISTER BIT/FIELD DEFENITIONS;+*; MFCS1 REGISTER RH/TM Shareable Register.;-+C1.SC = 100000 ; RH Reg - Special ConditionD*C1.TRE = 40000 ; RH Reg - Transfer Error 3C1.CPE = 20000 ; RH Reg - Control Bus Parity Error *C1.DVA = 4000 ; TM Reg - Drive Available&C1.PSL = 2000 ; RH Reg - Port Select-C1.A17 = 1000 ; RH Reg - UNIBUS @ - A171C1.A16 = 400 ; RH Reg - Extension Bits - A16B4C1.RDY = 200 ; RH Reg - Ready (for Data Transfer)*C1.IE = 100 ; RH Reg - Interrupt Enable6C1.DFC = 76 ; TM Reg - Data Transfer Function Code4C1.GO = 1 ; TM Reg - Go. Initiate data transfer;+3; Data Transfer Function Codes - GO and IE Bit set. ;-$FC.PE = 61 ! C1.IE ; Write 1600 (PE)&FC.GCR = 63 ! C1.IE ; Write 6250 (GCR)"FC.RDF = 71 ! C1.IE ; Read Forward"FC.RDR = 77 ! C1.IE ; Read Reverse$FC.XSN = 73 ! C1.IE ; Extended Sense;+,; MFWC REGISTER MASSBUS Word Count Register ;- 2's complement WORD COUNT.;+); MFBA REGISTER UNIBUS Address Register.n;- 177776. LSB not used.7;+5; MFBC REGISTER TM (Read/Write) Byte Count Register. ;-;+; MFCS2 REGISTER RH REGISTER;-C2.DLT = 100000 ; Data LateG#C2.WCE = 40000 ; Write Check ErrorC%C2.UPE = 20000 ; UNIBUS Parity Error1$C2.NED = 10000 ; Non-existent Drive%C2.NEM = 4000 ; Non-existent MemoryIC2.PGE = 2000 ; Program Error1!C2.MXF = 1000 ; Missed TransferR+C2.DPE = 400 ; MASSBUS Data Parity Error' ;RH TRE Err.NCS2ERR = C2.DLT ! C2.WCE ! C2.UPE ! C2.NED ! C2.NEM ! C2.PGE ! C2.MXF ! C2.DPEC2.OR = 200 ; Output ReadyEC2.IR = 100 ; Input Ready"C2.CLR = 40 ; Controller ClearC2.PAT = 20 ; Parity Test02C2.BAI = 10 ; UNIBUS Address Increment Inhibit&C2.UNT = 7 ; TM Unit Select (0-7) ;+; MFDI REGISTER TM Register;-,DTFLCD = 176000 ; Data Transfer Failure Code"DPR = 400 ; "1" - Drive Present%DTINTC = 77 ; Data Interrupt Code ;+; MFDM REGISTER TM Register;-)DM.SER = 100000 ; Suppress Error Recovery 9DM.FMT = 70000 ; Data (assembly/disassembly) Format Mode;>DM.SKP = 7400 ; Skip Count - Read:'0' fill followed by data.>DM.CNT = 374 ; Record Count - number of to be read/written.&DM.UNT = 3 ; TU Unit Select (0-3);+; MFAS REGISTER TM Register;->AS.BTS = 377 ; Attention Summary: Bit0-Drive0, Bit7-Drive7.;+; MFDS REGISTER TM Register;-4DS.RDY = 100000 ; Unit online - ready for execution.)DS.PRS = 40000 ; Unit has power applied.DS.ONL = 20000 ; Unit online.$DS.REW = 10000 ; Unit is Rewinding.1DS.PE = 4000 ; Unit in 1600(PE) recording mode. #DS.BOT = 2000 ; Unit at tape BOT.y)DS.EOT = 1000 ; Unit detected tape EOT.m9DS.FPT = 400 ; Unit write protected (No Write Ring). t-DS.AVL = 200 ; Drive available to MASSBUS.8DS.SHR = 100 ; Drive shareable to both MASSBUS ports.BDS.MNT = 40 ; Drive in maintenance mode - unavailable for use.9DS.DSE = 20 ; Unit in erase portion of DSE operation.p;+*; MFDB REGISTER RH REGISTER - Data Buffer;-;+/; MFDE REGISTER TM Register - Diagnostic Errorn;-;+); MFDT REGISTER TM Register - Drive Type ;-#DT.TAP = 40000 ; '1' - Tape Devicee#DT.DPT = 4000 ; Dual Port Featurew/DT.WCS = 2000 ; '1' - Writeable Control Store09DT.DTP = 777 ; Drive Type - TM78= 100, TM78/TU78= 101.h a;+,; MFSN REGISTER TM Register - Serial Number;-%SN.SN3 = 170000 ; BCD Serial Number 3.%SN.SN2 = 7400 ; | | | 2o%SN.SN1 = 360 ; | | | 1S%SN.SN0 = 17 ; BCD Serial Number 0+00�0b!b“_c”_d–_k›’;+1; MFDR REGISTER TM Register - Diagnostic Request;-;+.; MFDD REGISTER TM Register - Diagnostic Data;-;+8; MFNDI REGISTER TM Register - Non Data Interrupt Status;-'NDFLCD = 176000 ; Non Data Failure Codet"NDUNIT = 1400 ; Tape Unit Number*NDINTCD = 77 ; Non Data Interrupt Code;+F; MFNDx REGISTER(S) TM Register - Non Data Command, Tape Unit (x) 0-3.;-0CMCNTx = 177400 ; Command Count for Tape Unit x.9NDFCTx = 76 ; Non Data Function Code for Tape Unit x.l>GOBITx = 1 ; Go Bit for Non Data Command for Tape Unit x.*; Non Data Transfer Commands - GO Bit set.%ERGGCR= 37 ; Erase 3" Gap, GCR.T#ERGPE= 35 ; Erase 3" Gap, PE.t(WTMGCR= 17 ; Write Tape Mark, GCR.&WTMPE= 15 ; Write Tape Mark, PE.%DSE= 13 ; Data Security Erase.r1SNSE= 11 ; Sense Tape Unit Characteristics.o*RWND= 7 ; Rewind Tape on Tape Unit.5UNLD= 5 ; Rewind and Unload Tape on Tape Unit. $SFTMK= 25 ; Space Forward TMK.$SRTMK= 27 ; Space Reverse TMK.ASLTMK= 47 ; Space Forward TMK/LEOT. IF LEOT, position AEOV.s$SFREC= 21 ; Space Forward REC.$SRREC= 23 ; Space Reverse REC. s;+4; MFIA REGISTER TM Register - TM78 Internal Address;-;+4; MFCR REGISTER TM Register - TM78 Control Register;-5TMRDY = 100000 ; TM78 available for command executionsTMCLR = 40000 ; TM78 Clearn%MCPE = 20000 ; TM78 ROM parity errorR=ILR = 10000 ; TM78 reference to nonexistent MASSBUS registero>CPE = 4000 ; TM78 parity error detect - write to MASSBUS regDEVPAR = 2000 ; TM78 even parity generate/check on MASSBUS cntl bus6HLDA = 1000 ; TM78 microprogram sequencing inhibited?HOLD = 400 ; TM78 HOLD bit - inhibit microprogram sequencingINTDT = 377 ; Internal Data;+=; MFBAE REGISTER RH REGISTER - Bus Address Extension Registero;-GBA.BTS = 77 ; Bus Address bits 21-16. Logical extn of MFBA registerp;+7; MFCS3 REGISTER RH REGISTER - Control and Status Reg 3B;-&C3.APE = 100000 ; Address Parity Error.C3.PEO = 40000 ; Data Parity Error - Odd Word1C3.PEE = 20000 ; Data Parity Error - Even Word b.C3.CEO = 10000 ; Write Check Error - Odd Word/C3.CEE = 4000 ; Write Check Error - Even WordiC3.DW = 2000 ; Double Word!C3.IE = 100 ; Interrupt Enable'C3.IPC = 17 ; Inverted Parity Checks;+; Extended Sense DataB;-0XNDREG = 60. ; 60. bytes - TM78 Error Log Data A .SBTTL TM78 INTERRUPT CODES;+C; TM78 INTERRUPT CODES - Data/Non Data Transfers and TM78 Initiateds;-#; Bit Mask Values Int Code tILG = 1 ; Illegal 0."DON = 2 ; NDT or DT. 1, Done.'TMK = 4 ; NDT or DT. 2, Tape Mark. 0BOT = 10 ; NDT or DT. 3, Beginning of Tape.'EOT = 20 ; NDT or DT. 4, End of Tape.+LEOT = 40 ; NDT. 5, Logical End of Tape. %NOOP = 100 ; NDT. 6, NO OP Command. !RWD = 200 ; NDT. 7, Rewinding. -FPT = 400 ; NDT or DT. 10, Write Protect.BBNRDY = 1000 ; NDT or DT. 11, TM78 not ready to execute command.<NAVL = 2000 ; NDT or DT. 12, TU78 not avail to this port.-OFLN = 4000 ; NDT or DT. 13, TU78 Offline. 3NTEX = 10000 ; NDT or DT. 14, TU78 Non Existant..?NTCP = 20000 ; NDT or DT. 15, Read initiated, not performed.p UNDF = 40000 ; Undefined. 16,AONLN = 100000 ; TM Initiated 17, TU78 < Online. TU78 Sense Data.06RLL = 1 ; DT. 20, Read data OK. GT requested.6RLS = 2 ; DT. 21, Read data OK. LT requested.<RTRY = 4 ; DT. 22, Retry operation - same direction.<RDOP = 10 ; DT. 23, Read Data in opposite direction.:UNRD = 20 ; DT. 24, Data Unreadable after retries.@ERR = 40 ; DT. 25, Data Transfer error - Surp Err RcvryAEOTE = 100 ; DT. 26, Write err after EOT - Surp Err RcvryeCBDTP = 200 ; NDT or DT. 27, Bad tape- Write failure ! Lost PositeBTMFA = 400 ; NDT or DT. 30, TM Fault A - Failure, I/O operationCTUFA = 1000 ; NDT or DT. 31, TU Fault A - Failure, I/O operation <TMFB = 2000 ; TM Initiated 32, TM Fault B - Failure, no I/OTMFB = 4000 ; Not Used. 33,s;00�8bb¿a`TADATADATADATADATADATAMBFL = 10000 ; TM Initiated 34, Massbus Control Bus Fault.f; TM78 Initiated Interrupts. TMI1= ONLNTMI2= TMFB ! MBFLp%; Data Transfer Operation Interrupts.i ; WRITE2WRTI1= DON ! EOT ! FPT ! NRDY ! NAVL ! OFLN ! NTEX-WRTI2= RTRY ! ERR ! EOTE ! BDTP ! TMFA ! TUFA0 ; READ FWD,3RDFI1= DON ! TMK ! NRDY ! NAVL ! OFLN ! NTEX ! NTCPN@RDFI2= RLL ! RLS ! RTRY ! RDOP ! UNRD ! ERR ! BDTP ! TMFA ! TUFA ; READ REV 9RDRI1= DON ! TMK ! BOT ! NRDY ! NAVL ! OFLN ! NTEX ! NTCP3@RDRI2= RLL ! RLS ! RTRY ! RDOP ! UNRD ! ERR ! BDTP ! TMFA ! TUFA ; XTND SNSd XNSI1= DON ); Non Data Transfer Operation Interrupts.T ; WRITE TMK2WTMI1= DON ! EOT ! FPT ! NRDY ! NAVL ! OFLN ! NTEXWTMI2= BDTP ! TMFA ! TUFA ; SENSE SNSI1= DONSNSI2= TMFA ! TUFA ; SPACE TMK, FWD=.SFTMI1= DON ! NRDY ! NAVL ! OFLN ! NTEX ! NTCPSFTMI2= BDTP ! TMFA ! TUFA ; SPACE TMK, REV 4SRTMI1= DON ! BOT ! NRDY ! NAVL ! OFLN ! NTEX ! NTCPSRTMI2= BDTP ! TMFA ! TUFA ; SPACE TMK/LEOT, FWD5SLTMI1= DON ! LEOT ! NRDY ! NAVL ! OFLN ! NTEX ! NTCPXSLTMI2= BDTP ! TMFA ! TUFA ; SPACE RECORD, FWD4SFRCI1= DON ! TMK ! NRDY ! NAVL ! OFLN ! NTEX ! NTCPSFRCI2= BDTP ! TMFA ! TUFA ; SPACE RECORD, REV:SRRCI1= DON ! TMK ! BOT ! NRDY ! NAVL ! OFLN ! NTEX ! NTCPSRRCI2= BDTP ! TMFA !TUFAO ; ERASE 3" GAP!2ERGI1= DON ! EOT ! FPT ! NRDY ! NAVL ! OFLN ! NTEXERGI2= BDTP ! TMFA ! TUFA  ; DATA SECURITY ERASE,DSEI1= DON ! FPT ! NRDY ! NAVL ! OFLN ! NTEXDSEI2= TMFA ! TUFA ; REWIND ,RWDI1= DON ! RWD ! NRDY ! NAVL ! OFLN ! NTEXRWDI2= TMFA ! TUFA ; UNLOADE&UNLI1= DON ! NRDY ! NAVL ! OFLN ! NTEXUNLI2= TMFA ! TUFA .SBTTL Function Tables ;+$;TM78/TU78 Spacing Subfunction Table;-<.MACRO SPCFCT SPCGCR,SPCPE,TIMOUT,TIMES,SPCVL1,SPCVL2,ISRSRV# .BYTE SPCGCR ; Commands: 6250BPI, .BYTE SPCPE ; 1600BPI. ? .BYTE TIMOUT,TIMES ; Subcycle Time (S.CTM), Subcycles (S.STS).U- .WORD SPCVL1 ; Interrupt validation Mask 1.L- .WORD SPCVL2 ; Interrupt validation Mask 2.' .WORD ISRSRV ; > ISR Service Routine.T .ENDM SPCFCT *SVALI1= +4 ; > Spacing Validation Mask(s).JSPFTMK: SPCFCT SFTMK,SFTMK, 2,120., SFTMI1,SFTMI2, SPCISR ;Space FWD TMK.JSPRTMK: SPCFCT SRTMK,SRTMK, 2,120., SRTMI1,SRTMI2, SPCISR ;Space REV TMK.NSPLTMK: SPCFCT SLTMK,SLTMK, 2,120., SLTMI1,SLTMI2, SPCISR ;Space FWD TMK/LEOTJSPFREC: SPCFCT SFREC,SFREC, 2,120., SFRCI1,SFRCI2, SPCISR ;Space FWD REC.JSPRREC: SPCFCT SRREC,SRREC, 2,120., SRRCI1,SRRCI2, SPCISR ;Space REV REC. v;+ ; Valid TM78/TU78 Function Table;-F.MACRO FUNCT FCT,PREPRO,CMNDGC,CMNDPE,TIMOUT,TIMES,VALI1,VALI2,ISRSRV# .WORD IO.'FCT ; I/O Function Code + .WORD PREPRO ; Preprocessing indications..# .BYTE CMNDGC ; Commands: 6250BPI, # .BYTE CMNDPE ; | 1600BPI. .? .BYTE TIMOUT,TIMES ; Subcycle Time (S.CTM), Subcycles (S.STS).c, .WORD VALI1 ; Interrupt Validation Mask 1., .WORD VALI2 ; Interrupt Validation Mask 2.' .WORD ISRSRV ; > ISR Service Routine.1 .ENDM FUNCT PWR= 1 ; Test US.PWF Indication.WRT= 2 ; Test M.SWL Indication.M2WTPW= PWR!WRT ; Test US.PWF and M.SWL Indication.REV= 4 ; Test for Read Reverse. DT= 8. ; Test for Data Request.R'PREPRO= +2 ; > Pre process I/O request.NCMDGCR= +4 ; > GCR Command..CMDPE= +5 ; > PE Command.$TMOUT= +6 ; > Time out information.#VALI1= +10 ; > Validation Mask(s)..$ISRSRV= +14 ; > ISR Service Routine.*IO.XSN= 37400 ; Function - Not in QIO.MAC.FTBL:OIFUNCT WLB, WTPW!DT, FC.GCR,FC.PE, 3,1, WRTI1,WRTI2, 0 ; WRITEdLFUNCT RLB, PWR!DT, FC.RDF,FC.RDF, 20.,1, RDFI1,RDFI2, 0 ; READ FWDNFUNCT RLV, PWR!REV!DT, FC.RDR,FC.RDR, 20.,1, RDRI1,RDRI2, 0 ; READ REVMFUNCT EOF, WTPW, WTMGCR,WTMPE, 3,1, WTMI1,WTMI2, WTMISR ; WRITE TMKLFUNCT STC, 0, SNSE, SNSE, 2,1, SNSI1,SNSI2, SNSISR ; SET CHARLFUNCT SEC, 0, SNSE, SNSE, 2,1, SNSI1,SNSI2, SNSISR ; SNS CHARMFUNCT SMO, 0, SNSE, SNSE, 2,1, SNSI1,SNSI2, SNSISR ; S/MOU CHR,LFUNCT SPF, P00�@b!b“_c”_d–_k›’WR, 0, 0, 2,120., 0, 0, 0 ; SPC TMKSMFUNCT SPB, PWR, 0, 0, 2,120., 0, 0, 0 ; SPC BLCKS MFUNCT ERS, WTPW, ERGGCR,ERGPE, 3,1, ERGI1,ERGI2, ERGISR ; ERS 3" GP GFUNCT DSE, WTPW, DSE, DSE, 2,160., DSEI1,DSEI2, DSEISR ; DSEEIORWD:CFUNCT RWD, 0, RWND, RWND, 2,60., RWDI1,RWDI2, RWDISR ; REWINDE LNGHT=.-IORWD1FFUNCT RWU, 0, UNLD, UNLD, 2,1, UNLI1,UNLI2, UNLISR ; RWND/UNLD S .IF DF E$$DVC XNDSNS:HLFUNCT XSN, 0, FC.XSN,FC.XSN, 2,1, XNSI1, 0, XNSISR ; XTND SNS .ENDC ;E$$DVCENDFTB=.  .SBTTL OPERATION RETURN CODES;+<; I/O Operation Return Codes per TM78 Interrupt Code Values.;- ; Interrupt Designation/Code+RTRNTB: .BYTE 0 ; ILG 0 - Illegal.D! .BYTE IS.SUC ; DON 1 - Done. & .BYTE IE.EOF ; TMK 2 - Tape Mark./ .BYTE IS.SUC ; BOT 3 - Beginning of Tape. ,( .BYTE IE.EOT ; EOT 4 - End of Tape.0 .BYTE IE.EOV ; LEOT 5 - Logical End of Tape.) .BYTE 0 ; NOOP 6 - No operation.,, .BYTE IS.SUC ; RWD 7 - Start of Rewind.+ .BYTE IE.WLK ; FPT 10 - File Protected.N2 .BYTE IE.DNR ; NRDY 11 - Not ready for Command.7 .BYTE IE.FHE ; NAVL 12 - Not available to this port.o* .BYTE IE.DNR ; OFLN 13 - TU78 Offline. / .BYTE IE.FHE ; NTEX 14 - TU78 non-existant. I: .BYTE IE.FHE ; NTCP 15 - Not cpbl- Rd Init, Not Prfrmd.& .BYTE 0 ; UNDF 16 - Undefined.1 .BYTE 0 ; ONLN 17 - Online (Unsolicited). ( .BYTE IE.DAO ; RLL 20 - Long Record.) .BYTE IS.SUC ; RLS 21 - Short Record.W, .BYTE IE.VER ; RTRY 22 - Retry operation.* .BYTE IE.VER ; RDOP 23 - Read opposite.' .BYTE IE.VER ; UNRD 24 - Unreadable.I6 .BYTE IE.VER ; ERR 25 - Error, Retries suppressed.: .BYTE IE.VER ; EOTE 26 - Error/EOT. Retries suppressed.; .BYTE IE.BBE ; BDTP 27 - Bad Tape. Write err/Posit lost.p' .BYTE IE.FHE ; TMFA 30 - TM Fault A.;' .BYTE IE.FHE ; TUFA 31 - TU Fault A. 6 .BYTE 0 ; TMFB 32 - TM Fault B (Unsolicited). ' .BYTE 0 ; TUFB 33 - Undefined. 5 .BYTE 0 ; MBFL 34 - MASSBUS Control Bus Fault  ; (Unsolicited). .EVEN 2! .SBTTL DEFENITION OF U.CW2/U.CW3;;+; U.CW2 - Characteristics WordB; U.CW3 - Supported Tape Density Identification (Set up by SYSGEN);-;+#; TAPE CHARACTERISTICS (U.CW2) WORD 7; Bits 6,7 and 11 user settable via IO.STC or IO.SMO. .D; Bit 11 only allowed to be updated when tape unit not beyond BOT.5; Returned per IO.SEC request in second status word.);-?M.PEOV= 100000 ; Returned to user as '0' - Driver internal use. 7 ; Unlabelled tape operation - Tape in gap after EOV V< ; (double TMK) having completed forward motion operation.CM.AEOV= 40000 ; Unlabelled tape operation - Tape positioned in gapS? ; between double TMK's (EOV) after forward motion operation. M.BOT= 20000 ; Tape at BOT.@M.1600= 4000 ; * Tape density control - '0'=6250BPI, '1'=1600.$M.HWL= 2000 ; Hardware Write Lock.9M.RWD= 1000 ; Driver indication that unit is rewinding..;M.SER= 400 ; Tape Unit select error (Tape Unit Offline). EM.IWR= 200 ; * Inhibit Write with Extended Inter-record gap (IRG).e(M.SWL= 100 ; * Software write locked.2M.TMK= 40 ; Last Tape Command encountered TMK.2M.EOT= 20 ; Last command encountered EOT mark.6NEWBTS= M.AEOV ! M.BOT ! M.EOT ! M.HWL ! M.SER ! M.TMK7NWBTS1= M.BOT ! M.EOT ! M.HWL ! M.SER ! M.1600=&NWBTS2= M.BOT ! M.EOT ! M.SER;+/; SUPPORTED TAPE DENSITY (U.CW3) IDENTIFICATIONu; 1; Low byte: U.CW2, Bit11='0' - UD.625, 6250BPI.r1; High byte: U.CW2, Bit11='1' - UD.160, 1600BPI. ;- i .SBTTL DRIVER PARAMETERSp#US.SUP=2 ; Supress Error Recoveryw;+5; Driver Parameters - Indexed by RH Controller NumberM;-(CNTBL: .BLKW T$$M78 ; > UCB, I/O Dequd.-DQDIO: .BLKW T$$M78 ; > FTBL, Dequd request.L.DQDUCB: .BLKW T$$M78 ; > UCB - Dequd request.0IOFCT: .BLKW T$$M78 ; > FTBL, I/O Command code..IORTN: .BLKW T$$M78 ; I/O Request restart @. BINPROG: .BLKW T$$M78 ; I/O Status - NEQ= 00�Hbb¿a`TADATADATADATADATADATALo Byte,I/O in Progress;% ; Hi Byte,Passed DEV REG's(UMD).'6DTCMD: .BLKW T$$M78 ; I/O Status - NEQ=Data Transfer.DXNSCMD: .BLKW T$$M78 ; I/O Status - NEQ= Lo Byte,XND SNS Operation; ; Hi Byte,Unsolicited I/O.3DTCNT: .BLKW T$$M78 ; Current DATA I/O Byte Count..8DTADR1: .BLKW T$$M78 ; Current Address - U.BUF,U.BUF+1.2DTADR2: .BLKW T$$M78 ; | | | | - U.BUF+2.DRDOPCM: .BLKW T$$M78 ; > FTBL - Read Opposite Function, preprocess.5INTRPT: .BLKW T$$M78 ; I/O Interrupt being serviced.t6INTCD1: .BLKW T$$M78 ; Interrupt code to Int 0 - 172INTCD2: .BLKW T$$M78 ; Bit Code value: 20 - 343TMUNIT: .BLKW T$$M78 ; Lo Byte= TM#, Hi Byte= TU#.B;RSTATN: .BLKW T$$M78 ; MFAS Reg Reset Mask - NDT Commands.TBSPCYET: .BLKW T$$M78 ; Residual (to be yet) spaced BLCK/TMK count6TPCHAR=SPCYET ; Tape Characteristics; IO.SMO/IO.STC.?SPACED: .BLKW T$$M78 ; Spaced BLCK/TMK count - Already spaced.L/SPCNG: .BLKW T$$M78 ; Current I/O Space Count. @RTTBL: .BLKW T$$M78 ; Retry count: +0,Rtrs left. +1,Total rtrs.+ERRPKT: .BLKW T$$M78 ; > Error Log Packet.B .IF GT T$$M78-18TEMP: .BLKW 1 ; PS Save Area. Lo 4 bits - Controller #. .ENDCDCBPTR: .WORD 0 ; > DCB.8$WTRTRY= 50. ; # Re-write attempts.:RDRTRY= 21. ; # Re-read attempts (embedded tape cleans).;+; DRIVER DISPATCH TABLEa;-$MFTBL::' .WORD MFINI ; Initiate I/O Operation 8$ .WORD MFCAN ; Cancel I/O Operation .WORD MFOUT ; Device Timeout .WORD MFPWF ; Powerfail Entry: .PAGE .SBTTL INITIATE I/O OPERATIONSt;+8; -- MFINI -- Initiate TU78/TM78 Mag Tape I/O Operation ;N; Service QIO Directive or Completed I/O request, services remaining requests.;K; IF the Dqu successful, THEN service the request. ELSE RETURN to Caller. ; ; Prior to CALL $GTPKT:m; R5 - > UCB.;; Return from $GTPKT: ;LF; C=1 - Dequeue unsuccessful. Controller Busy or No Request to DQU.; ; C=0 - Dequeue successful.O; R1 - > I/O Pckt..(; R2 - Physical Tape Unit # (U.UNIT).&; R3 - RH Controller Index (S.CON).; R4 - > SCB.; R5 - > UCB.;-0MFINI: CALL $GTPKT ; Outstanding I/O request ?$ BCC 10$ ; IF CC, Yes. Service it./ RETURN ; Controller Busy or No I/O Request. 10$: MOV S.CSR(R4),R2 ; R2=CSR.2 MOV R5,CNTBL(R3) ; Save > UCB, Dqud I/O Request.( MOV I.FCN(R1),R1 ; R1 - Function code./ MOV #FTBL,R0 ; R0 > TM78/TU78 Function Table.e9 BICB #US.SUP,U.STS(R5) ; Assume Error recovery allowed. , CLR RTTBL(R3) ; Assume recovery count = 0. .IF DF D$$IAG) BITB #IQ.UMD,R1 ; Diagnostic function ?. BEQ 15$ ; IF EQ, No.. MOV #100000,RTTBL(R3) ; Diagnostic function," BR 18$ ; No error recovery. 15$: .ENDC ;D$$IAG* BITB #IQ.X,R1 ; Inhibit error recovery ? BEQ 20$ ; IF EQ, No.R=18$: BISB #US.SUP,U.STS(R5) ; Inhibit Driver error recovery. ; Validate I/O Request Support.R>20$: BICB #IQ.X!IQ.UMD!IQ.Q,R1 ; Validate only function code.122$: CMP R1,(R0) ; I/O supported by TM78/TU78 ?  BEQ 30$ ; IF EQ, Yes. $ ADD #LNGHT,R0 ; Next I/O function.1 CMP R0,#ENDFTB ; Any more TM78/TU78 Functions ?+ BNE 22$ ; IF NE, No. Look for match/end.,# MOV #IE.IFC&377,R0 ; Unsupported, BR 45$ ; End request.; Preprocess I/O Request.r!30$: MOV R0,DQDIO(R3) ; > FTBL, / MOV R5,DQDUCB(R3) ; and > UCB Dequd request.e& TST (R0)+ ; > Preprocess functions.,; Function allowed if Powerfailure occured ?6 BIT #PWR,(R0) ; I/O allowed if powerfailure occured? BEQ 40$ ; IF EQ, Yes.2 BITB #US.PWF,U.STS(R5) ; Powerfailure occurence? BEQ 40$ ; IF EQ, No.,< MOV #IE.ABO&377,R0 ; Fnctn not allowed until US.PWF Reset. BR 45$ ; End request.-; Function allowed if Software write locked ? 640$: BIT #WRT,(R0) ; User write locked verification ? BEQ DQD ; IF EQ, No.M< BIT #M.SWL,U.CW2(R5) ; Device user software write locked? BEQ DQD ; IF EQ, No.- MOV #IE.WLK&377,R0 ; Indicate write locked,B"45$: SUBR ENDRQS ; End request, BR MFINI ; Service others. ?; Request DQD - RWD completion or TM78 RDY return entry 00�Pb!b“_c”_d–_k›’point. 4B; R2 - CSR, R3 - RH Cont Index(S.CON), R4 - > SCB, R5 - > UCB. ; No I/O to Rewinding Tape Unit.8DQD: MOV DQDUCB(R3),R5 ; > UCB - restart Dequd request.. BIT #M.RWD,U.CW2(R5) ; Tape Unit Rewinding ? BEQ 50$ ; IF EQ, No.o" MTPS #PR5 ; INHIBIT INTERRUPTS.? MOVB #C1.IE,MFCS1(R2) ;;; Allow further interrupts on this RHW2 MOVB #60.,S.STS(R4) ;;; Allow up to 60 checks at1 MOVB #2,S.CTM(R4) ;;; 2 sec intervals for RWD.s" MTPS #PR0 ;;; ALLOW INTERRUPTS.0 BR MFINI ; Service other controller requests.; I/O - only if TM78 Ready.-50$:,; MOV U.SUB(R5),MFCS2(R2) ; Select TM UNIT.) TST MFCR(R2) ; TM78 Ready for command ?t BMI ACTIVE ; IF MI, Yes.W> MOVB S.ITM(R4),S.CTM(R4) ; Check TM78 ready after 2 seconds.1 BR MFINI ; Service other controller requests.C4ACTIVE: PUSH DQDIO(R3) ; Save DQD > preprocessing.1 CLR DQDIO(R3) ; Request about to become active.  POP R0 ; R0 >  TST (R0)+ ; current requestP TST (R0)+ ; I/O Command. ) MOV R0,IOFCT(R3) ; IOFCT > I/O Command.. INC INPROG(R3) ; I/O Active." BIT #DT,-2(R0) ; Data Transfer ? BNE DTIO ; IF NE, Yes.( JMP NDTIO ; Initiate NDT I/O. .PAGE& .SBTTL INITIATE DATA (I/O) SERVICING ;+&; R0 > FTBL I/O Command, R2 - CSR, ;; R3 - Controller Index (S.CON), R4 - > SCB, R5 - > UCB.E;-)DTIO: INC DTCMD(R3) ; Data transfer I/O.C- MOVB U.UNIT(R5),-(SP) ; Tape Unit selection. 3 BIC #^C<3>,(SP) ; Perhaps won't suppress retries.P1 BITB #US.SUP,U.STS(R5) ; Inhibit Error Recovery?  BNE 9$ ; IF NE, Yes./ MOV #RDRTRY,RTTBL(R3) ; Read recovery retries.;, MOV IOFCT(R3),RDOPCM(R3) ; > Read Opposite 0 ADD #LNGHT+2,RDOPCM(R3) ; Function preprocess." BIT #WRT,-2(R0) ; Write request? BEQ 10$ ; IF EQ, No. 9 BIT #M.IWR,U.CW2(R5) ; Inhibit write retries (long gap)?, BNE 8$ ; IF NE, Yes.O3 MOV #WTRTRY,RTTBL(R3) ; Set up for Write recovery.R BR 10$ ; . . Cont. (8$: CLR RTTBL(R3) ; No retries allowed./9$: BIS #DM.SER,(SP) ; Inhibit error recovery.n910$: MOVB RTTBL(R3),RTTBL+1(R3) ; Error Recovery Retries.T' MOV #DTIOGO,IORTN(R3) ; Restart I/O @.M/ POP MFDM(R2) ; Data transfer for Tape Unit x.#3 .IF DF M$$EXT ; 22 Bit Extnd Addr (11/70, 11/44).2 BIT #DV.MBC,U.CW1(R5) ; RH11 ?; BNE 20$ ; IF NE, No - RH70.& CALL $STMAP ; Setup UNIBUS mapping. ASL U.BUF(R5) ; Setup A17,A16# ASL U.BUF(R5) ; address bitst ASL U.BUF(R5) ; into  ASL U.BUF(R5) ; HI Byte.N) CALL $MPUBM ; Setup UMRs for transfer. % MOV S.CSR(R4),R2 ; Restore R2 - CSRB20$: .ENDC ;M$$EXTr .IF NDF M$$EXTs% .IF DF M$$MGE ; 18 Bit Addressing.O MOV R5,R1 ; R1 >D ADD #U.BUF,R1 ; U.BUF. ROL (R1) ; Setup A17,A16t ROL (R1) ; address bits ROL (R1) ; into ROL (R1) ; HI Byte.I .ENDC ;M$$MGE .ENDC ;M$$EXTS& MOV IOFCT(R3),R0 ; R0 > I/O Command.* BIT #REV,-2(R0) ; Read Reverse request ? BEQ 30$ ; IF EQ, No.n6 SUB #2*LNGHT-2,RDOPCM(R3) ; > Read Opposite Function./30$: CALL SETUP ; Setup Data trfr parameters.s; -- DTIOGO -- Start DATA I/OX;G; DTCNT, DTADR1, DTADR2, R0 - > FTBL I/O Command: Normal.or.Opposite, F; R2 - CSR, R3 - Controller Index (S.CON), R4 - > SCB, R5 - > UCB.;18DTIOGO: MOV DTCNT(R3),MFBC(R2) ; Data byte count for TM. MOV MFBC(R2),MFWC(R2) ; and N INC MFWC(R2) ; Word R CLC ; countm ROR MFWC(R2) ; for RH.R$ NEG MFWC(R2) ; (2's complement).? MOV DTADR2(R3),MFBA(R2) ; Transfer address - 16 lo order bits.:1 MOVB (R0),DTADR1(R3) ; I/O code - 6250BPI mode.-' BIT #M.1600,U.CW2(R5) ; 1600BPI mode ?  BEQ 10$ ; IF EQ, No.T1 MOVB 1(R0),DTADR1(R3) ; I/O code - 1600BPI mode. 110$: BITB #US.ABO,U.STS(R5) ; Abort I/O request ? .ENABL LSBT BEQ 15$ ; IF EQ, No.R3ABOEND: MOV #IE.ABO&377,R0 ; Aborting I/O request.;"ENDIT: SUBR ENDRQS ; End request/ JMP MFINI ; and service other I/O requests. 915$: BIC #M.SER,U.CW2(R5) ; Assume Tape Unit selectable.F .DSABL LSBs! MTPS #PR5 ; INHIBIT INTERRUPTSV ; Start I/O; .IF DF M$$EXT 6 BIT #DV.MBC,U.CW100�Xbb¿a`TADATADATADATADATADATA(R5) ;;; RH70 (MASSBUS Controller) ? BEQ 20$ ;;; IF EQ, No. / MOVB DTADR1+1(R3),MFBAE(R2) ;;; Start transfer:) MOVB DTADR1(R3),MFCS1(R2) ;;; on 11/70.  BR 22$ ;;; . . cont . .IFTF;20$: MOV DTADR1(R3),MFCS1(R2) ;;; Start transfer on others.22$: .ENDC ;M$$EXT- MOVB 2(R0),S.CTM(R4) ;;; Start I/O Timeout.  MTPS #0 ;;; ALLOW INTERRUPTS.( RETURN ; EXIT while I/O in progress. .PAGE( .SBTTL INITIATE NONDATA (I/O) SERVICING;+&; Initiate Non Data (I/O) servicing:;M%; R0 - > FTBL I/O Command, R2 - CSR,e;; R3 - Controller Index (S.CON), R4 - > SCB, R5 - > UCB.);-4NDTIO: MOV #NDTCMD,IORTN(R3) ; Restart I/O return @.A MOV U.BUF(R5),SPCYET(R3) ; Space Count .or. Tape Characteristics(, CLR U.BUF(R5) ; Init for NDT Command word. TST (R0) ; Spacing Request? BEQ SPACE ; IF EQ, Yes.4; -- STRTIO -- Start NON DATA (not SPACING) requests;l'; U.BUF+1(R5) - Command request count.A;N&; R0 - > FTBL I/O Command, R2 - CSR,;; R3 - Controller Index (S.CON), R4 - > SCB, R5 - > UCB.2;C-NDTCMD: MOVB (R0),U.BUF(R5) ; 6250BPI Mode.C) BIT #M.1600,U.CW2(R5) ; 1600BPI Command?I BEQ 10$ ; IF EQ, No.t9 MOVB 1(R0),U.BUF(R5) ; NDT Command Word - 1600BPI Mode.h010$: BITB #US.ABO,U.STS(R5) ; Abort I/O request? BNE ABOEND ; IF NE, Yes.c TST (R0)+ ; > Timeouts.! MTPS #PR5 ; INHIBIT INTERRUPTSN ; Start I/OI1 MOV #C1.TRE,MFCS1(R2) ;;; Make sure no previous c7 BIC #C1.TRE,MFCS1(R2) ;;; transfer error holds us up. ! MOVB U.UNIT(R5),R3 ;;; Prepare  ASL R3 ;;; for MFNDx ADD R2,R3 ;;; accessing.5 MOV U.BUF(R5),MFND0(R3) ;;; Start Non Data Transfer.d8 MOVB #C1.IE,MFCS1(R2) ;;; Allow interrupts on this RH.$ MOVB (R0)+,S.CTM(R4) ;;; Start I/O$ MOVB (R0)+,S.STS(R4) ;;; Timeout. MTPS #0 ;;; ALLOW INTERRUPTS( RETURN ; EXIT While I/O in progress. H .ENABL LSBT)SPACE: TST SPCYET(R3) ; Space count =0 ?) BNE 10$ ; IF NE, No.s" CLR INPROG(R3) ; No active I/O. & MOV #IS.SUC&377,R0 ; Successful end,$ CLR R1 ; no blocks/files spaced, BR ENDIT ; End request.; Handle Spacing Count.R010$: CLR R1 ; R1 - Space Dir; EQ-FWD, NEQ-REV." TST SPCYET(R3) ; Space Forward ? BPL 20$ ; IF PL, Yes.' NEG SPCYET(R3) ; Count adjustment and. INC R1 ; REV indication.; Space Files/Block's ?,20$: CMP #IO.SPF,-4(R0) ; Space via TMK's ? BEQ 40$ ; IF EQ, Yes.!; Determine Space Blocks Command.B, MOV #SPFREC,IOFCT(R3) ; > Space FWD blocks. TST R1 ; Space records FWD ?  BEQ 30$ ; IF EQ, Yes., MOV #SPRREC,IOFCT(R3) ; > Space REV blocks.; Setup NDT Command.030$: CLR SPACED(R3) ; No Blks/TMK's yet spaced.6 MOVB @IOFCT(R3),U.BUF(R5) ; Set up NDT Function Code.3SPCAGN: MOV #255.,R1 ; R1 - Spacing command count.m/ CMP SPCYET(R3),R1 ; Space GT 255 Blcks/TMKs ?  BHI 35$ ; IF HI, Yes.. MOV SPCYET(R3),R1 ; Space LT 255 Blcks/TMKs.'35$: SUB R1,SPCYET(R3) ; To yet space.s; MOVB R1,U.BUF+1(R5) ; Set up NDT command (spacing) count.T- MOV R1,SPCNG(R3) ; Current I/O space count.Q4 MOV IOFCT(R3),R0 ; R0 > Spacing Subfunction Table./ MOV #NDTCMD,IORTN(R3) ; Restart spacing I/O @.  BR NDTCMD ; Now issue I/O.I ; Determine Space Files Command.-40$: MOV #SPRTMK,IOFCT(R3) ; > Space REV TMK.g TST R1 ; REV TMK ?S BNE 30$ ; IF NE, Yes.) MOV #SPFTMK,IOFCT(R3) ; > Space FWD TMK.) BITB #US.LAB,U.STS(R5) ; Labelled tape ?K BNE 30$ ; IF NE, Yes.. MOV #SPLTMK,IOFCT(R3) ; > Space FWD TMK/LEOT. BR 30$ ; . . cont . u .DSABL LSB, .PAGE .SBTTL CANCEL I/O OPERATION;+; -- MFCAN -- ;R7; Called for QIO IO.KIL request (UC.KIL set in U.CTL) R0; .or. EXEC Task rundown (US.BSY set in U.STS).;I&; Active I/O ends in one of two ways:;; 1. Normal end - Data transfers are allowed to complete. ); Error recovery attempts are aborted.TI; 2. Abnormal end - Other requests are aborted via the Timeout routine.KE; The driver attempts to leave the hardware in a controlled state.O;-; Register configuration upon entry to MFCAN:E6; R0 - > Current I/O Packet. R3 - RH Con00�`b!b“_c”_d–_k›’troller Index.&; R1 - > Current Task TCB. R4 - > SCB.; R5 - > UCB. ;-;MFCAN: CMP I.TCB(R0),R1 ;;; Active I/O owned by requestor?n BNE 10$ ;;; IF NE, No. + BISB #US.ABO,U.STS(R5) ;;; End active I/O. 10$: RETURN  .SBTTL POWERFAIL ENTRY POINTt;+ ; -- MFPWF --a;nB; Called due to: 1. System power failure and subsequent recovery.; 2. System Bootstrapped.; 3. Driver loaded.;eN; A. US.PWF set: indicates that normal QIO functions are disallowed with the :; exception of IO.RWD, IO.RWU, IO.SMO, IO.SEC, and IO.STC.J; *** Successful IO.RWD, IO.RWU and IO.SMO reset US.PWF and allow normal ; operations to resume.B:; B. Reset controller/devices/U.CW2 and allow Interrupts.;e-; Register configuration upon entry to MFPWF:R; R3 - RH Controller index ; R4 - > SCB ; R5 - > UCB;-8MFPWF: BISB #US.PWF,U.STS(R5) ; Normal QIO's dissalowed.& MOV S.CSR(R4),R2 ; R2 > Device REGS.2 CLR U.CW2(R5) ; Reset Tape Characteristics word.6 BIS #C2.CLR,MFCS2(R2) ; Reset controller and devices.> MOVB #C1.IE,MFCS1(R2) ; Allow Interrupts on this controller.8 MOV U.DCB(R5),DCBPTR ; DCB > - Driver restart fallback.7 MOV R5,CNTBL(R3) ; UCB > - Unsolicited Intrpt Hndlng.w RETURN  .PAGE .SBTTL TIMEOUT ENTRY POINTn;+ ; -- MFOUT --3;R; Called due to S.CTM expiring:;5; 1. Active I/O - :O; a. IF US.ABO set - End request (no recovery), if possible end physical I/O.i*; b. IF Timeout (S.STS=0) - End request.; 2. Request DQD - 5; a. DQD, no I/O issued; M.RWD .or. TM78 not ready.V<; b. I/O issued; TU78 Offline (Sel Err) .or. TM78 cleared.;U-; Register configuration upon entry to MFOUT:c3; R0 = IE.DNR, Device Not Ready, R2 = CSR (S.CSR),n:; R3 - RH Cntrlr Index (S.CON), R4 - > SCB, R5 - > UCB.;-5MFOUT: DECB S.STS(R4) ;;; One less Timeout Subcycle. / BITB #US.ABO,U.STS(R5) ;;; Abort I/O request ?q BEQ 10$ ;;; IF EQ, No.i, MOV #IE.ABO&377,R0 ;;; Request end status.35$: BIC #C1.IE,@S.CSR(R4) ;;; Disable TM Interrupt.D MTPS #0 ;;; Allow interrupts.%7$: SUBR ENDRQS ; End I/O request.l$ CALL CLRTM ; Abort physical I/O. RETURNr*10$: TST INPROG(R3) ;;; I/O In Progress ? BEQ 20$ ;;; IF EQ, No.2- TSTB S.STS(R4) ;;; Timeout Subcycles left ?)) BNE 15$ ;;; IF NE, Yes. Restart Timer.D112$: .IF DF E$$DVC ;;; If Error Logging Device. " PUSH S.RCNT(R5) ;;; Error log - ? MOV #TMREGS,S.RCNT(R5) ;;; Dev Reg's, no MFBAE/MFCS3/XND SNS.e& CALL $DTOER ;;; Log Device Timeout.8 POP S.RCNT(R5) ; Normally Log Dev Reg's and Extnd Sns. .ENDC BR 7$ ; End request.r; Restart TIMER.115$: MOVB S.ITM(R4),S.CTM(R4) ;;; Restart timer.O" RETURN ;;; Until next Timeout.7; DQD Request. Could not previously issue I/O request. l120$: TSTB S.STS(R4) ;;; Timeout Subcycles left ?) BNE 15$ ;;; IF NE, Yes. Restart Timer.e; DQD Request. Timeout.;1 BIT #M.RWD,U.CW2(R5) ;;; Tape Drive Rewinding ?s, BNE 12$ ;;; IF NE, Yes - End DQD request..; MOV U.SUB(R5),MFCS2(R2) ;;; Select TM UNIT.+ TST MFCR(R2) ;;; TM78 Ready for Command ? + BPL 12$ ;;; IF PL, No - End DQD request.5 MTPS #0 ; Allow interrupts.R& JMP DQD ; Servvice pending request. .PAGE .SBTTL INTERRUPT SERVICINGn;+7; $MFINT - TM78/TU78 Mag Tape Interrupt Service Routine;;-MFINT:<; INTSE$ MF,PR5,T$$M78 ;;; Map ISR, Set Processor Priority.;u$; R5 > UCB. R4= RH Controller Index.;; MOV U.SCB(R5),R4 ;;; R4 > SCB18 BICB #C1.IE,@S.CSR(R4) ;;; No IE in TM CS1 pseudo reg.4 MOVB S.CON(R4),R4 ;;; Restore RH Controller Index.5 CALL $FORK ;;; Become Interuptable System Process.D;+=; Interrupt servicing first handles Data Transfer interrupts E; - followed by servicing all Non Data Transfer Attentions present.T;/>; A data transfer request defers non data transfer interrupts &; pending data transfer completion. ;r9; The TM78 can generate solicited/unsolicited interrupts:;VO; 1.Solicited interrupts occur as a result of Data/Non Data Transfer Requests. ;.O; 2.Unsolicited interrupts result from tape units00�hbb¿a`TADATADATADATADATADATA coming on line and hardware II; failure. If MFCS1 C1.IE is enabled, unsolicited interrupts can occur.T;-( MOV R4,R3 ; R3 - RH Controller Index.- MOV U.SCB(R5),R4 ; R4 - > SCB. R5 - > UCB. MOV S.CSR(R4),R2 ; R2=CSR.! TST DTCMD(R3) ; Data Transfer ?  BEQ 10$ ; IF EQ, No.e0 SUBR DTINT ; Service Data Transfer Interrupt.+10$: TST MFAS(R2) ; Attention Interrupts ?t BEQ 20$ ; IF EQ, No.r5 SUBR NDINT ; Service Non Data Transfer Interrupts.s&20$: TST INPROG(R3) ; I/O yet active? BEQ 30$ ; IF NE, No.d$ MOV IOFCT(R3),R0 ; R0 > active I/O TST (R0)+ ; timeouts.! MOVB (R0)+,S.CTM(R4) ; Re-start;& MOVB (R0)+,S.ITM(R4) ; I/O timeout., MOVB #C1.IE,MFCS1(R2) ; Wait for interrupt. RETURN;630$: TST DQDIO(R3) ; DQD request to be yet completed? BNE 40$ ; IF EQ, Yes.2 JMP MFINI ; Service any other pending requests.040$: JMP DQD ; Service previously DQD request. .PAGE .SBTTL NDT INTERRUPT SERVICINGT;+(; Non Data Transfer Interrupt Servicing.;y9; Service active ATTNS - both solicited and unsolicited.R; K; The ATTN bit position identifies the TM Unit, Register MFNDI identifies M*; NDT Interrupt Code/Tape Unit (Attn Adr).;.D; If unsolicited: appropriate measures are taken and ATTN is reset.; 4; If solicited: verify interrupt an expected value.<; Unexpected values end the request and driver dependencies.'; If expected, call I/O ending routine.; EI; Control is returned to the ATTN scan routine to service active ATTN's.c;-1 .BLKW T$$M78 ; Reserve space - Return address.s6NDINT: SUBR FNDUNT ; Obtain a TM Unit, ATTN pending.$ BCC 10$ ; IF CC, Found a TM Unit." RTRN NDINT ; No further ATTN's.,10$: SUBR UNSLCT ; Unsolicited Interrupt ?% BCS NDINT ; IF CS, Yes. Any more ?' SUBR VALNDI ; Reasonable Interrupt ?c BCC 20$ ; IF CC, Yes. SUBR LOGERR ; Log Error.v7 MOV #IE.FHE&377,R0 ; Indicate Unrecoverable Situation" SUBR ENDRQS ; and End Request./ RTRN NDINT ; Service pending NDT Interrupts.-120$: CALL RTRNCD ; Set up I/O Return Code - R0.s+ MOV IOFCT(R3),R1 ; R1 > I/O Command code.T9 BIT #M.RWD,U.CW2(R5) ; Perhaps previous RWD operation ?N BEQ 30$ ; IF EQ, No.2 MOV #IORWD+CMDGCR,R1 ; R1 > I/O RWD command code.;30$: ADD #ISRSRV-CMDGCR,R1 ; R1 > I/O Interrupt servicing.  MOV (R1),R1 ; > and Service  MOV #.+10,-2(R1) ; NDT I/O  JMP (R1) ; Requests.I# BR NDINT ; Service other ATTN's.B .PAGE  .SBTTL NDT INTRPT ROUTINESD;+; -- FNDUNT --; F; Subroutine scans MFAS L <- R, to find first active ATTN, TM Unit #. ;V; TM Unit (ATTN) Found - CC:n;; Sets up ATTN reset mask (RSTATN(R3)), Selects TM Unit.t; !; TM Unit (ATTN) Not Found - CS.#;W; R1 - Modified.I;-1 .BLKW T$$M78 ; Reserve space - Return Address./,FNDUNT: MOV #1,R1 ; R1- HI Byte,TM UNIT#. ! ; LO Byte,MFAS Rst Mask. % MOV MFAS(R2),-(SP) ; (SP) - ATTN's,B5 MOVB #8.,1(SP) ; 1(SP) - # of ATTN's to be checked.D10$: ASRB (SP) ; This ATTN ? BCS 20$ ; IF CS, Yes." ASLB R1 ; Update MFAS Rst Mask, SWAB R1 ; and  INCB R1 ; next  SWAB R1 ; UNIT.s' DECB 1(SP) ; One less ATTN to check.s2 BNE 10$ ; IF NE, Check for other ATTN's active. SEC ; No TM UNIT found. BR 30$$920$: MOVB R1,RSTATN(R3) ; NDT Command - ATTN Reset Mask.  SWAB R1 ; Select## MOVB R1,MFCS2(R2) ; and remember # MOVB R1,TMUNIT(R3) ; TM UNIT #.s CLC ; TM UNIT found.%30$: POP ; Return Stack as found.A RTRN FNDUNT .PAGE ?;+; -- UNSLCT --;eG; Unsolicited ATTN's (NDT INTRPT) occur due to tape units coming ONLINE ; .or. equipment failure.T;; Unsolicited ATTN - CS.; Solicited ATTN - CC.;;#; ONLINE interrupts are dismissed..;S?; Equipment Failures (NDT INTRPT's #32.or.#34) are logged and ;2; their TM's reset (no further I/O may proceed).; /; R0 - modified, R4 - cleared if unsolicited.U;-1 .BLKW T$$M78 ; Reserve space - Return Address.P*UNSLCT: MOV MFNDI(R2),R0 ; R0 - [MFNDI];  MOV R0,INTRPT(R3) ; NDT # BIC #^C<1477>,R0 ; 00�pb!b“_c”_d–_k›’ INTRPT code.R SWAB R0 ; Remembern# MOVB R0,TMUNIT+1(R3) ; TU Unti#.f SWAB R0 ; n& CMP #17,R0 ; Tape Unit put Online ? BNE 10$ ; IF NE, No.r4 MOV RSTATN(R3),MFAS(R2) ; Unit Online - Reset ATTN.1 BIC #M.RWD,U.CW2(R5) ; Any previous Rewind over.s#7$: SEC ; Unsolicited interrupt. BR 20$ 610$: CMP #32,R0 ; TM Fault B (TM Detected Failure) ? BEQ 15$ ; IF EQ, Yes.4 CMP #34,R0 ; MB Fault (MASSBUS Cntrl Bus Fault) ? BNE 19$ ; IF NE, No.)#15$: TST INPROG(R3) ; Active I/O ?T BNE 17$ ; IF NE, Yes." CLR R4 ; Unsolicited interrupt.-17$: SUBR LOGERR ; Log the Error, Clear TM.a# TST R4 ; Unsolicited interrupt ?  BEQ 7$ ; IF EQ, Yes.,"19$: CLC ; Solicited interrupt.20$: RTRN UNSLCT .PAGE n;+; -- VALNDI --; 8; Validate Non Data Interrupts. Obtain UCB/SCB for ATTN.;#:; 1. If not in configuration, not INPROG or Tape Unit not 5; previously set into Rewind - will take no action. >; Reset the ATTN and continue scanning for additional ATTN's.;/N; This happens when OS systems moved about without correcting the system data N; bases or by adding on equipment that data bases have not been generated for.; H; 2. Validate NDT Interrupt for I/O INPROG or Tape Unit in previous RWD.;n ; INPUTS - ; R2 - CSR, R3 - RH CNTL INDX.;e9; OUTPUTS - CS, INVALID. CC, Valid. Registers preserved.u;-1 .BLKW T$$M78 ; Reserve space - Return Address. "VALNDI: MOV DCBPTR,R5 ; R5 > DCB.E PUSH ; UCB lenght,HI/LO UCB unit #s on Stack " MOV D.UCB(R5),R5 ; R5 > 1st UCB.(5$: CMP R5,U.RED(R5) ; UCB Redirected ? BNE 20$ ; IF NE, Yes. TST INPROG(R3) ; I/O Active ?b BEQ 10$ ; IF EQ, No. 1 CMP R5,CNTBL(R3) ; UCB same as for I/O INPROG ?i BEQ 40$ ; IF EQ, Yes.510$: BIT #M.RWD,U.CW2(R5) ; Tape Unit prev set RWD ?T BEQ 20$ ; IF EQ, No.d0 CMPB U.UNIT(R5),TMUNIT+1(R3) ; Same Tape Unit ? BNE 20$ ; IF NE, No.e,; CMPB U.SUB(R5),TMUNIT(R3) ; Same TM UNIT ? BNE 20$ ; IF NE, No.  MOV U.SCB(R5),R4 ; R4 > SCB. CMPB S.CON(R4),R3 ; Same RH ?  BEQ 42$ ; IF EQ, Yes."20$: CMPB (SP),1(SP) ; Last UCB ? BEQ 30$ ; IF EQ, Yes. ADD 2(SP),R5 ; R5 > next UCB.$$ INCB (SP) ; LO # - Current UCB #.* BR 5$ ; Keep Checking rest of MF UCB's.*30$: MOV RSTATN(R3),MFAS(R2) ; Reset ATTN,! SEC ; Unreasonable Interrupt.; BR 50$ "40$: MOV U.SCB(R5),R4 ; R4 > SCB.,42$: CALL VALIDT ; Validate NDT Interrupt.,50$: POP <,> ; Maintain stack integrity. RTRN VALNDI .PAGE M;+; -- VALIDT -- ;CI; Validate INPROG or prev RWD request INTRPT Code - defined and in range.S;1,; Valid: CC - Described in INTCD1 or INTCD2.;D; Invalid, CS. ;-,VALIDT: PUSH ; Reference values.& MOV IOFCT(R3),R1 ; R1 > I/O command.( CMP R5,CNTBL(R3) ; INPROG Validation ? BEQ 10$ ; IF EQ, Yes.- MOV #IORWD+CMDGCR,R1 ; R1 > RWD I/O command.R110$: ADD #SVALI1,R1 ; R1 > 1st validation mask. n+ MOVB INTRPT(R3),R0 ; R0 - Interrupt Code.n. CMPB R0,#35 ; Interrupt code out of range ? BGE 30$ ; IF GE, Yes.- CLR INTCD1(R3) ; Initialize 0-17 and 20-34 n. CLR INTCD2(R3) ; interrupt bit descriptors.6 MOV #INTCD1,R2 ; R2 > Interrupt 0-17 bit descriptor.& CMPB R0,#17 ; Interrupt 0-17 range? BLOS 20$ ; IF BLOS, Yes.n7 MOV #INTCD2,R2 ; R2 > Interrupt 20-34 bit descriptor.;3 BIC #20,R0 ; Interrupt code in binary/bit range.m( TST (R1)+ ; R1 > 2nd validation mask.620$: ADD R3,R2 ; R2 > correct Intrpt bit descriptor." ASL R0 ; Convert Interrupt Code ADD #$BTMSK,R0 ; TO MOV (R0),R0 ; Bit Mask Value.' MOV R0,(R2) ; Current Intrpt code - I ; per Bit descrition." BIT R0,(R1) ; Valid Interrupt ? BEQ 30$ ; IF EQ, No.r( CLC ; Indicate Interrupt Code Valid.025$: POP ; Maintain stack integrity. RETURN .30$: SEC ; Indicate interrupt code Invalid. BR 25$  .PAGE .SBTTL NDT INTRPT SERVICING;+; Non Data Interrupt Servicing.A;-;+*; Sense Tape Charecteristics - Completion.:; Result of servicing IO.SMO, IO.STC and IO.SEC requests.;000�xbb¿a`TADATADATADATADATADATA ; INPUTS -7; R0 - LO BYTE; I/O Request Return Code HI BYTE; 0's. /; R2 - CSR. R3 - RH CNTL INDX. R5 - > UCB.I;r ; OUTPUTS -37; R2 - CSR, R3 - RH CNTL INDX, R4 - > SCB, R5 - > UCB.i;-1 .BLKW T$$M78 ; Reserve space - Return Address.T'SNSISR: CMPB #IS.SUC,R0 ; Successful ?c BEQ 5$ ; IF EQ, Yes.. SUBR LOGERR ; Log Error.I- BIS #M.SER,U.CW2(R5) ; Not avalable for use.-3$: MOV #IE.FHE&377,R0 ; Hardware problems. . BR 25$ ; End request.?5$: BIC #NWBTS1,U.CW2(R5) ; Update BOT,EOT,HWL,SER,1600 status.;- CLR R1 ; Temp BOT,EOT,HWL,SER,1600 status. 1 PUSH MFDS(R2) ; Local copy - Tape Drive Status.U BIT #DS.RDY,(SP) ; Ready ? BNE 10$ ; IF NE, Yes.# BIS #M.SER,R1 ; Not avail for usee BR 20$c10$: BIT #DS.BOT,(SP) ; BOT ? BEQ 12$ ; IF EQ, No.  BIS #M.BOT,R1 ; Status- BOT.12$: BIT #DS.EOT,(SP) ; EOT ? BEQ 14$ ; IF EQ, No.v BIS #M.EOT,R1 ; Status- EOT.'14$: BIT #DS.FPT,(SP) ; Write Locked ?  BEQ 16$ ; IF EQ, No.I' BIS #M.HWL,R1 ; Status- Write locked.S*16$: BIT #DS.PE,(SP) ; Tape Unit 1600BPI? BEQ 20$ ; IF EQ, No.S# BIS #M.1600,R1 ; Status- 1600BPI. /20$: BIS R1,U.CW2(R5) ; Update Tape Char word.  POP ; Maintain Stack.,+ MOV IOFCT(R3),R1 ; R1 > I/O Command code.T' CMP #IO.SEC,-4(R1) ; IO.SEC request ?Q BNE 30$ ; IF NE, No. 925$: MOV U.CW2(R5),R1 ; 2nd I/O Status Word - Tape Char I SUBR ENDRQS ; End Request.t3 RTRN SNSISR ; Return to NDT Interrupt Servicing.; IO.SMO/IO.STC - F30$: BIC #M.SWL!M.IWR,U.CW2(R5) ; Perhaps - No Soft Write Lock, IWR. 0 PUSH TPCHAR(R3) ; Setup - Software write lock< BIC #^C,(SP) ; and Extended gap write control& BIS (SP)+,U.CW2(R5) ; per request.%35$: MOV U.CW2(R5),-(SP) ; (SP)+2 > o1 BIC #^C,(SP) ; Setup - density control.  MOV TPCHAR(R3),-(SP) ; (SP) >3 BIC #^C,(SP) ; Request - density control.r1 CMP (SP),+2(SP) ; Setup/Request densities same?; BEQ 37$ ; IF EQ, Yes.& BIT #M.BOT,U.CW2(R5) ; TU78 at BOT ?. BEQ 40$ ; IF EQ, No - can't change density., BIC #M.1600,U.CW2(R5) ; Set density control$ BIS (SP),U.CW2(R5) ; per request. 37$: POP <,> ; Restore stack. CMP #IO.SMO,-4(R1) ; IO.STC ?  BNE 25$ ; IF NE, Yes.4 BIT #M.BOT,U.CW2(R5) ; IO.SMO only succeeds at BOT. BEQ 3$ ; IF EQ, failure.9 BICB #US.PWF,U.STS(R5) ; Reset Power Failed Indication.q BR 25$ ; End Request. 40$: POP <,> ; Restore stack.0 BR 3$ ; Not BOT, Setup/Request densities NEQ. ,;+!; Completed Space Tape Operation:;B; FWD/REV via TMKS, FWD to LEOT, FWD/REV via Blocks (Records).;y ; INPUTS -7; R0 - LO BYTE; I/O Request Return Code HI BYTE; 0's.t/; R2 - CSR. R3 - RH CNTL INDX. R5 - > UCB.E;$ ; OUTPUTS -e7; R2 - CSR, R3 - RH CNTL INDX, R4 - > SCB, R5 - > UCB.;-1 .BLKW T$$M78 ; Reserve space - Return Address.RFSPCISR: BIT #DON!TMK!BOT!LEOT!NAVL!NTEX!NTCP,INTCD1(R3) ; End request? BNE 20$ ; IF NE, Yes.B BIT #NRDY!OFLN,INTCD1(R3) ; Not ready for command or Unit Offl ? BNE 40$ ; IF NE, Yes. SUBR LOGERR ; Log Error.T710$: MOV SPACED(R3),R1 ; Indicate TMK's/Blocks Spaced. !15$: SUBR ENDRQS ; End Request.I218$: RTRN SPCISR ; Service other NDT Interrupts.O; IS.SUC (Normal End). IF Interrupt code is DON, THEN may need to Restart I/O. B!20$: MOVB MFNDI+1(R2),R1 ; R1 = BIC #^C<3>,R1 ; Tape Unit #. ASL R1 ; Make word index -!# ADD R2,R1 ; To access Residual 2+ MOVB MFND0+1(R1),R1 ; TMK/Block Count.)2 BIC #^C<377>,R1 ; R1 = Residual TMK/Block Count.0 BEQ 30$ ; IF EQ, Current req count exhausted.2 SUB R1,SPCNG(R3) ; SPCNG - TMK's/Block's spaced.?30$: ADD SPCNG(R3),SPACED(R3) ; Maintain TMK's/Block's spaced.e, BIT #DON,INTCD1(R3) ; Interrupt code DON ?$ BEQ 10$ ; IF EQ, No. End Request.2 TST SPCYET(R3) ; Further TMK's/Blocks to Space ? BEQ 10$ ; IF EQ, No.  MOV U.SCB(R5),R4 ; R4 > SCB.0 JMP SPCAGN ; Restart I/O to complete request.-40$: CALL MSG ; OFLN .or. NRDY Intrpt Code. BCC 15$ ; IF CC, End request.# BR 18$ ; Service NDT Interr00�€b!b“_c”_d–_k›’upts.  r;+C; Completed: Write Tape Mark; Erase 3" Gap; Data Security Erase;e); Rewind Tape; Rewind/unload Tape.i;M ; INPUTS -7; R0 - LO BYTE; I/O Request Return Code HI BYTE; 0's.B/; R2 - CSR. R3 - RH CNTL INDX. R5 - > UCB.3;; ; OUTPUTS -s7; R2 - CSR, R3 - RH CNTL INDX, R4 - > SCB, R5 - > UCB.R;-8RWDRET: .BLKW T$$M78 ; Reserve space - Return Address.<RWDISR: BIT #M.RWD,U.CW2(R5) ; Rewind previously initiated ? BEQ 30$ ; IF EQ, No..0 BIC #M.RWD,U.CW2(R5) ; End of previous Rewind.& CMPB #IS.SUC,R0 ; Any complications. BEQ 10$ ; IF EQ, No.e- CLR R4 ; TMFA/TUFA error - Req prev ended.M SUBR LOGERR ; Log it.*10$: MOV RSTATN(R3),MFAS(R2) ; Reset ATTN.5 TST DQDIO(R3) ; Driver need compl prev DQD request? BEQ 20$ ; IF EQ, No.,% JMP DQD ; Service pending request.U220$: RTRN RWDISR ; Service other NDT Attentions.@30$: BIT #DON!NRDY!NAVL!OFLN!NTEX,INTCD1(R3) ; Initiated Rewind? BNE 40$ ; IF NE, No. * BIS #M.RWD,U.CW2(R5) ; Rewind initiated.+40$: MOV RWDRET,WTMRET ; Maintain linkage.i BR WTMISR ; End Request. 8WTMRET: .BLKW T$$M78 ; Reserve space - Return Address.WTMISR:LERGISR:0DSEISR:TBUNLISR: BIT #DON!RWD,INTCD1(R3) ; Clear Power Failed Indication ? BEQ 5$ ; IF EQ, No.9 BICB #US.PWF,U.STS(R5) ; Reset Power Failed Indication.U* BIT #RWD,INTCD1(R3) ; Rewind initiated ? BEQ 5$ ; IF EQ, No.' BIS #M.RWD,U.CW2(R5) ; Rewind started.i=5$: BIT #DON!RWD!EOT!FPT!NAVL!NTEX,INTCD1(R3) ; End Request ?; BNE 10$ ; IF NE, Yes.C BIT #NRDY!OFLN,INTCD1(R3) ; Not ready for command, Unit Offline ? BNE 30$ ; IF NE, Yes. SUBR LOGERR ; Log Error.r!10$: SUBR ENDRQS ; End Request.720$: RTRN WTMISR ; Return to NDT Interrupt Servicing.i-30$: CALL MSG ; OFLN .or. NRDY Intrpt Code.. BCC 10$ ; IF CC, End request.# BR 20$ ; Service NDT interrupts.i .PAGE .SBTTL DT INTERRUPT SERVICING;+$; Data Transfer Interrupt Servicing.; .; Service Read/Write/Extended Sense Requests.; ; INPUTS -;$; R2 - CSR R3 - RH CNTRL INDX; R4 - > SCB R5 - > UCB; "; XNSCMD - NEQ=XND SNS Operation.;-1 .BLKW T$$M78 ; Reserve space - Return Address. 3DTINT: BIT #C1.TRE,MFCS1(R2) ; DATA Transfer error?  BNE 30$ ; IF NE, Yes.# TST XNSCMD(R3) ; Extended Sense ?Y BEQ 10$ ; IF EQ, No. - JMP XNSISR ; Endup Extended Sense Request. ; Interrupt code= DON.&10$: MOV #IS.SUC&377,R0 ; Success and.12$: MOV U.CNT(R5),R1 ; # bytes transferred.!14$: SUBR ENDRQS ; End request. '16$: RTRN DTINT ; Service NDT ATTN's.R'25$: MOV #IE.FHE&377,R0 ; Fatal Error.S#27$: SUBR LOGERR ; Log the Error.L BR 14$ ; End request.9; Data trnsfr err; C1.TRE = MFCS2 ! Drive Intrpt NOT DON.n(30$: MOV MFCS2(R2),R0 ; R0 - possible , BIC #^C,R0 ; RH Error indication. BEQ 40$ ; IF EQ, no.S; *****uM; FOR NOW - MFCS2 errors will be considered fatal. Will complete this later.; BR 25$a1; Data trnsfr err; C1.TRE = Drive intrpt NOT DON.4=40$: MOV MFDI(R2),INTRPT(R3) ; Dt Fail Cd, DPR, Dt Intrpt Cd.D' CALL VALIDT ; Validate DT Interrupt.F* BCS 25$ ; IF CS, Invalid - End request.- CALL RTRNCD ; Set up I/O Return Code - R0.f2 MOV INTCD1(R3),R1 ; R1 - Intrpt code 0-17 range?0 BEQ 60$ ; IF EQ, No. Intrpt code 20-34 range.7 BIT #FPT!NAVL!NTEX!NTCP,R1 ; End request (no status) ?S BEQ 44$ ; IF EQ, No.F BIT #NTCP,R1 ; Not capable ?$ BNE 27$ ; IF NE, Yes - log error.42$: CLR R1 ; No status, BR 14$ ; end request.N&44$: BIT #TMK,R1 ; TMK (file mark) ? BEQ 46$ ; IF EQ, No. PUSH R0 ; Remember IE.EOF+ MOV IOFCT(R3),R0 ; R0 - I/O Command code.  BIT #REV,-2(R0) ; REV ?S BNE 45$ ; IF NE, Yes. BIS #M.TMK,U.CW2(R5) ; TMK -I45$: POP R0 ; Restore IE.EOF,  BR 42$ ; end request.0"46$: BIT #BOT,R1 ; Rev into BOT? BEQ 48$ ; IF EQ, No.s BIS #M.BOT,U.CW2(R5) ; BOT andB! BR 42$ ; no bytes transfered.2#48$: BIT #EOT,R1 ; EOT on write ?R BEQ 50$ ; IF EQ, No.4 BIS #M.EOT,U.CW2(R5) ; EOT and# BR 12$ ; bytes transfered.-50$:00�ˆbb¿a`TADATADATADATADATADATA CALL MSG ; OFLN .or. NRDY Intrpt Code.E BCC 14$ ; IF CC, End request.# BR 16$ ; Service NDT interrupts.E460$: MOV INTCD2(R3),R1 ;Interrupt code 20-34 range.! BIT #RLL,R1 ; Data GT request?E BNE 42$ ; IF NE, Yes.0 BIT #UNRD!ERR!BDTP!TMFA!TUFA,R1 ; Fatal error ?$ BNE 27$ ; IF NE, Yes - log error.# BIT #EOTE,R1 ; EOT error (write)?e BEQ 64$ ; IF EQ, No.T$ BIS #M.EOT,U.CW2(R5) ; Indicate EOT BR 42$ ; End request.(64$: BIT #RLS,R1 ; Data LT requested ? BEQ 70$ ; IF EQ, No. " MOV MFBC(R2),R1 ; Data trasfered BR 14$ ; and End request.s; Error Recovery: RTRY ! RDOP. p70$: SUBR LOGERR ; Log error.I! DECB RTTBL(R3) ; Retries left ?L% BEQ 14$ ; IF EQ, No - end request.;" BIT #RTRY,R1 ; Retry operation ? BNE 75$ ; IF NE, Yes.1 MOV RDOPCM(R3),R0 ; R0 > FTBL I/O Command code.R.75$: CALL SETUP ; Setup transfer parameters./ JMP @IORTN(R3) ; Restart RH - Error recovery.  .PAGE4 .SBTTL Handle 'Not Ready' or 'Offline' return codes;+ ; -- MSG --Q;o ; INPUTS -(-; INTCD1(R3) - Interrupt code OFLN .or. NRDY.r;e ; OUTPUT -o; CC - end request.O"; CS - MSG handled Interrupt Code.;;-MSG: 3$; Preprocess OFLN/NRDY Intrpt codes.' BIT #NRDY,INTCD1(R3) ; NRDY interrupt?R BNE 20$ ; IF NE, Yes.; OFLN Interrupt.M+5$: BITB #US.SUP,U.STS(R5) ; IQ.X or UMD's?e& BNE 18$ ; IF NE, Yes - end request.! TST U.ACP(R5) ; Associated ACP?a& BNE 15$ ; IF NE, Yes - end request.#10$: PUSH ; Save REG's.u* MOV #T.NDSE,R0 ; 'Select Error' message. CALL $DVMSG ; Output message." POP ; Restore REG's.! CLR INPROG(R3) ; No I/O active,l( INCB DQDIO+1(R3) ; retry I/O Request.& MOV RSTATN(R3),MFAS(R2) ; Reset ATTN.+ MOVB #1,S.STS(R4) ; Start 15 sec timeout. / MOVB #15.,S.CTM(R4) ; Try again in 15 sec. S)14$: SEC ; MSG handled Interrupt code.; 15$: RETURN 18$: CLC ; End request. BR 15$t&; NRDY Interrupt. Check failure code.20$: BPT ; *** DEBUG *** PUSH R0 ; Save R0.# TST DTCMD(R3) ; Data Request?g BEQ 25$ ; IF EQ, NDT.7 MOVB MFDI+1(R2),R0 ; R0 - DT failure code, 0 and DPR.O BR 26$ ; . . Cont.l?25$: MOVB MFNDI+1(R3),R0 ; R0 - NDT failure code, Tape Unit #.R26$: ASR R0 ; R0 =! ASR R0 ; NDT/DT failure code.o! CMP #2,R0 ; Failure Code = 2?  POP R0 ; Restore R0.S BNE 5$ ; IF NE, No.6; Fatal TM error - Clear TM; Log Error; Retry request./ BR 10$ ; DON'T KNOW IF THAT'S WHERE TO GO !!d .PAGE .SBTTL LOG DEVICE ERRORS ;+; -- LOGERR --;T ; INPUTS - /; R2 - CSR, R3 - RH CNTRL INDX, R5 - > UCB,F5; R4 = EQ - Unsolicited I/O error, R0 - Don't care.6;; R4 - > SCB - Solicited I/O error, R0 - I/O Status Code.e;d+; OUTPUTS - REG's Preserved. R1 Altered.R;-1 .BLKW T$$M78 ; Reserve space - Return Address.d$LOGERR: TST R4 ; Unsolicited I/O ? BEQ 10$ ; IF EQ, Yes.+; IF UMD THEN Pass REG's, Don't Log Error.u# .IF DF D$$IAG ; If Diagnostics -S) CALL MFDGNT ; IF UMD - pass DEV REG's.E BCC 10$ ; IF CC, Not UMD.- INCB INPROG+1(R3) ; UMD - DEV REG's passed.I BR 30$ ; May require TM CLR.  .ENDC ;D$$IAG,; NOT UMD. Solicited/unsolicited I/O Error.-10$: .IF DF E$$DVC ; IF Log Device Errors - 1 MOV #,R1 ; R1 - # Bytes to log.L6 .IF DF M$$EXT ; IF 22 Bit Ext Addr (11/70,11/44) - BIT #DV.MBC,U.CW1(R5) ; RH11 ? BEQ 15$ ; IF EQ, Yes.& ADD #4,R1 ; Log MFBAE/MFCS3 Reg(s).15$: .ENDC ;M$$EXT: PUSH <,R3,R2,R0> ; > Error Packet, Save R3,R2,R0 Reg(s).) CALL $LOGER ; Request an Error Packet.G3 ; IF Got it: R1 > Data Area, R3 > Error packet.e6 MOV R3,+6(SP) ; Assume Got it - Save > Error Packet.C POP ; Restore R0,R2,R3 & > to Error Packet.) BCS 30$ ; IF CS, Not logging an error.o7 INC XNSCMD(R3) ; Extended Sense Request to log error.4 TST R4 ; Solicited I/O ?  BNE 18$ ; IF NE, Yes.4 INCB XNSCMD+1(R3) ; Logging Unsolicited I/O error."18$: PUSH ; Save R2,R0. 5 MOV #TMREGS-2,R0 ; R0 - # Dev Reg(s) thru NDT Regs. /20$: MOV (R2)+,(R1)+ ; Mo00��b!b“_c”_d–_k›’ve a Device Register. , DEC R0 ; One less Device Register to log.1 BNE 20$ ; IF NE, log rest of device registers.03 CLR (R1)+ ; Log MFIA reg- 0's (might set C1.CPE)a TST (R2)+ ; R2 > MFCR Reg. MOV (R2),(R1)+ ; Log MFCR Reg. POP ; Restore R0,R2.g5 .IF DF M$$EXT ; IF 22 bit Ext Addr (11/70, 11/44) BIT #DV.MBC,U.CW1(R5) ; RH11 ? BEQ 25$ ; IF EQ, Yes.& MOV MFBAE(R2),(R1)+ ; Move MFBAE Reg& MOV MFCS3(R2),(R1)+ ; Move MFCS3 Reg25$: .ENDC ;M$$EXT .ENDC ;E$$DVCC;IF INTRPT #32.OR.#34 - REQUIRE TM CLR BEFORE ANY I/O MAY COMMENCE..330$: MOVB MFDI(R2),-(SP) ; Data request interrupt.$ TST DTCMD(R3) ; QIO Data request ? BNE 35$ ; IF NE, Yes.3 MOVB MFNDI(R2),(SP) ; Else - Non data interrupt..135$: CMP #32,(SP) ; TM Fault B - requires TM CLR  BEQ 40$ ; IF EQ, Yes.. CMP #34,(SP) ; MB Fault B - requires TM CLR. BNE 50$ ; IF NE, No."40$: TST (SP)+ ; Maintain Stack.- CALL CLRTM ; TM CLR and Unit dependencies.:) TST MFCR(R2) ; TM78 ready for command ?R BMI 50$ ; IF MI, Yes.- MOVB S.ITM(R4),S.CTM(R4) ; Check TM78 after F RETURN ; 2 seconds."50$: TST (SP)+ ; Maintain Stack.2; WHAT IS REG STATE IF RETURN HERE AFTER TMOUT ???CONTLG: .IF DF E$$DVC % TST XNSCMD(R3) ; Logging an error ?  BEQ RTNLGR ; IF EQ, No.2 MOV #60.,DTCNT(R3) ; Extended Sense - 60. bytes.2 CLR DTADR1(R3) ; Error Packet in Exec POOL area.A; IS [R1] STILL HERE ? - WHAT IF RETURNED HERE FROM TMOUT ROUTINEd: MOV R1,DTADR2(R3) ; R1 > Dt in Err pckt- after DEV REG's/ MOV #XNDSNS+CMDGCR,R0 ; R0 > FTBL I/O command.h; *** PROBLEM HERE ***" BR RTNLGR ; Handle other ATTNS.:XNSISR: TSTB XNSCMD+1(R3) ; Log error (Unsolicited I/O) ?, BEQ RTNLGR ; IF EQ, No. Return to caller. PUSH ; Save REG's. CLR R2 ; Retry count EQ.M( MOV ERRPKT(R3),R3 ; R3 > Error Packet.& CLR R4 ; R4 .EQ. (Unsolicited I/O).# CALL $FNERL ; End Error Logging.  POP ; Restore REG's.O" CLR XNSCMD(R3) ; Error log done. .ENDC ;E$$DVC=; WILL WE ALWAYS GET BACK TO WHERE ORIGINALLY CALLED FROM ???c)RTNLGR: RTRN LOGERR ; Return to Caller.R .PAGE: .SBTTL ABORT TM78 OPERATION/DRIVER DATA BASE DEPENDENCIES;+ ; -- CLRTM --?;B;; Called by LOERR Interrupt codes #32.or.#34 to reset TM78 %; or by MFOUT to abort physical I/O.Q;; 1. Reset TM78 via TM CLR.<; 2. Update driver data base - for all TU78's on that TM78.); a. Previously started rewinds ended.;;-CLRTM:(; MOVB U.SUB(R5),MFCS2(R2) ; Select and $ BIS #TMCLR,MFCR(R2) ; Reset TM78. PUSH ; Save 'em.D; MOV U.SUB(R5),R0 ; R0 - TM#. % ASL R0 ; Compatibility with S.CON.B MOV DCBPTR,R5 ; R5 > DCB.A# MOV D.UCBL(R5),-(SP) ; UCB lenght,?3 MOV D.UNIT(R5),-(SP) ; HI/LO UCB unit #s on Stack. " MOV D.UCB(R5),R5 ; R5 > 1st UCB.10$:-; CMP U.SUB(R5),R0 ; Same TM Subcontroller ?  BNE 20$ ; IF NE, NO.s) CMPB S.CON(R4),R3 ; Same RH Controler ?r BNE 20$ ; IF NE, No.e% CMP R5,U.RED(R5) ; UCB Redirected ?M BNE 20$ ; IF NE, Yes./ BIC #M.RWD,U.CW2(R5) ; Any previous RWD ended. ( CLRB S.STS(R4) ; No timeout subcycles."20$: CMPB (SP),1(SP) ; Last UCB ? BEQ 30$ ; IF EQ, Yes. ADD 2(SP),R5 ; R5 > next UCB.($ INCB (SP) ; LO # - Current UCB #.. BR 10$ ; Handle other TU's on same RH/TM78.,30$: ADD #4,SP ; Maintain Stack integrity. POP ; Restore 'em.B RETURN  .PAGE .SBTTL SETUP I/O RETURN CODEe;+; -- RTRNCD --;2+; Convert Interrupt to Request Return Code.R;r ; OUTPUT -; *; R0 - LO BYTE: I/O Request Return Code. ;-7RTRNCD: MOVB INTRPT(R3),R0 ; R0 - Interrupt Code only.e, ADD #RTRNTB,R0 ; > I/O Request Return Code$ MOVB (R0),R0 ; and provide it to BIC #^C<377>,R0 ; Caller.L RETURN # .SBTTL SETUP DATA TRFR PARAMETERS ;+ ; -- SETUP --;: ; INPUT - ;M<; R0 > FTBL, I/O command code R3 - Controller Index (S.CON)"; R2 - CSR. R4 > SCB R5 > UCB;C ; OUTPUT -;R@; Correctly setup DTCNT, DTADR1 and DTADR2 for I/O sequencing.; Registers preserved.B;-6SETUP: MOV U00�˜b‚Ÿb¿a`TADATADATADATADATADATA.CNT(R5),DTCNT(R3) ; Setup I/O byte count.8 MOV U.BUF(R5),DTADR1(R3) ; I/O request code, Hi @ bits,- MOV U.BUF+2(R5),DTADR2(R3) ; and Lo @ bits.o BIT #REV,-2(R0) ; Read REV ? BEQ 20$ ; IF EQ, No. SUB #2,DTCNT(R3) ; Read REV -S1 ADD DTCNT(R3),DTADR2(R3) ; Adjust Buffer pointer  BCC 10$ ; to end of $ ADCB DTADR1+1(R3) ; Buffer Area.010$: ADD #2,DTCNT(R3) ; Restore Transfer count. 20$: RETURNp .PAGE .SBTTL END I/O REQUESTO;+ ; -- ENDRQS--g;e-; End solicited request: DQD or I/O active. T;) ; INPUT -O;t;; R0 - I/O Request Return Code, R1 - 2nd I/O Status Word,b.; R2 - CSR, R3 - RH CNTRL INDX, R5 - > UCB.;-1 .BLKW T$$M78 ; Reserve space - Return Address.Q%ENDRQS: MOV U.SCB(R5),R4 ; R4 > SCB.S-; If Usermode Diagnostic - Pass Device Reg's.e, .IF DF D$$IAG ; If Usermode Diagnostics -0 TSTB INPROG+1(R3) ; Passed DEV REG's already ? BNE 5$ ; IF NE, Yes.R. CALL MFDGNT ; IF UMD, THEN Pass TM78 REG's. 5$: .ENDCg+; If Logged an Error - Endup Error Logging.v, .IF DF E$$DVC ; If Error Logging Device - u-; BITB #SP.EIP,S.PRI(R4) ; Logged an Error ?S BEQ 10$ ; IF EQ, No.R. MOV RTTBL(R3),R2 ; Setup Error Retry Counts,- MOV ERRPKT(R3),R3 ; > Error Log Packet and 6 CALL $FNERL ; Endup Err Logging for this request. 10$: .ENDC ; End Request.1 BICB #US.ABO,U.STS(R5) ; Clear Abort indication.D CALL $IODON ; End Request. & MOV U.SCB(R5),R4 ; Restore R4, >SCB./ MOVB S.CON(R4),R3 ; R3, RH CNTL INDX.n% MOV S.CSR(R4),R2 ; R2, CSR.  D! TST DTCMD(R3) ; Data transfer ?u BNE 20$ ; IF NE, Yes.* MOV RSTATN(R3),MFAS(R2) ; Reset TM ATTN.20$: CLR DTCMD(R3) ; Cleart" CLR INPROG(R3) ; Driver Request+ CLR XNSCMD(R3) ; Processing indicators.E RTRN ENDRQS .PAGE7 .SBTTL PASS DEV REG'S TO USER MODE DIAGNOSTIC REQUEST B;+; -- MFDGNT --; 2; Determine if User Mode Diagnostic Function Call.; +; If so - Then pass TM78 device registers.V;. ; INPUTS - ; R2 - CSR ; R4 - > SCB.;V ; OUTPUTS - ; Reg(s) preserved.; CC - Not User Mode Diagnostic Function CallF; CS - User Mode Diagnostic Function Call. TM78 device reg(s) passed.;-1MFDGNT: MOV R1,-(SP) ; Save R1. $CRPAS mungs it.C- MOV S.PKT(R4),R1 ; R1 > current I/O packet.R> BITB #IQ.UMD,I.FCN(R1) ; User Mode Diagnostic Function Call? BEQ 20$ ; IF EQ, No.N2 MOVB S.RCNT(R4),-(SP) ; Pass TM78 Device Reg(s)-? MOVB #TMREGS,S.RCNT(R4) ; MFBAE, MFCS3, XND SNS not included. # MOV R1,-(SP) ; Save > I/O packet..6 CMPB #IO.EOF/256.,I.FCN+1(R1) ; QIO Control Code #6 ? BEQ 10$ ; IF EQ, Yes.6 CMPB #IO.RWD/256.,I.FCN+1(R1) ; QIO Control Code #5 ? BEQ 10$ ; IF EQ, Yes.2 CALL $CRPAS ; Pass device reg(s) - Other QIO's. MOV (SP)+,R1 ; Maintain Stack. BR 15$a510$: MOV I.PRM+14(R1),I.PRM+16(R1) ; Setup I/O packet - MOV I.PRM+12(R1),I.PRM+14(R1) ; for $CRPAS. $ CALL $CRPAS ; Pass device reg(s).1 MOV (SP)+,R1 ; Maintain Stack. R1 > I/O packet.N4 MOV I.PRM+14(R1),I.PRM+12(R1) ; Re-setup I/O packet/ MOV I.PRM+16(R1),I.PRM+14(R1) ; after $CRPAS.l@15$: MOVB (SP)+,S.RCNT(R4) ; Restore # REG(s) passed to ERR LOG.- SEC ; User Mode Diagnostic Function Call. 18$: MOV (SP)+,R1 ; Restore R1. RETURN .20$: CLC ; No User Mode Diag Function Call. BR 18$0 .ENDP+14(R1),I.PRM+16(R1) ; Setup I/O packet - MOV I.PRM+12(R1),I.PRM+14(R1) ; for $CRPAS. $ CALL $CRPAS ; Pass device reg(s).1 MOV (SP)+,R1 ; Maintain Stack. R1 > I/O packet.N4 MOV I.PRM+14(R1),I.PRM+12(R1) ; Re-setup I/O packet/ MOV I.PRM+16(R1),I. .TITLE RDDRV .IDENT /3.1/Q; C; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.S; ALL RIGHTS RESERVED.;#<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;M; MODIFIED BY:; ; B. S. MCCARTHY 3-OCT-82 3.1I;3; BM258 -- CORRECT DRIVER TO USE $CKBFB FOR BUFFER ; CHECKING DUE TO P.IOCC;R ; RECONFIGURATION CONTROL DRIVER;I;+C; THE RECONFIGURATION CONTROL DRIVER PROVIDES THE INTERFACE BE00‚ b!b“_c”_d–_k›’TWEENID; USER COMMAND LEVEL TASKS WHICH GENERATE REQUESTS TO PERFORM SYSTEMG; RECONFIGURATION FUNCTIONS AND TO RETURN SYSTEM STATUS INDICATIONS ANDR-; A PRIVILEDGED RECONFIGURATION CONTROL TASK.E; THIS DRIVER ACCESS AND ADDRESS CHECKS QIO REQUESTS FROM THE COMMANDOD; TASKS, ENQUEUES THEM INTO THE RECIEVE QUEUE OF THE RECONFIGURATION$; TASK, AND INITIATES ITS EXECUTION.B; EXCEPT IN THE CASE OF ACCESS ERRORS, I/O COMPLETION IS PERFORMED'; DIRECTLY BY THE RECONFIGURATION TASK.P;-;H; LOCAL MACRO DEFINITIONSR;M;D .MCALL OLRDF$,UCBDF$R3 OLRDF$ ; DEFINE ONLINE RECONFIGURATION INTERFACEC UCBDF$ ; DEFINE UCB OFFSETS;I; DEFINE LOCAL VARIABLES; 1 U.LIST=U.CNT+2 ; LISTHEAD FOR PACKET EXTENSION A;D; DRIVER DISPATCH TABLEF; / DDT$ RD,1,NONE ; DEFINE DRIVER DISPATCH TABLEV;+8; **-RDINI-RECONFIGURATION DRIVER INITIATIOR ENTRY POINT;.; B; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE EACH TIME AD; RECONFIGURATION COMMAND TASK ISSUES A QIO TO A LUN ASSIGNED TO THED; RD0: UNIT. THE COMMAND TASK SUPPLIES ONE OR TWO BUFFER ADDRESS ANDB; SIZE DESCRIPTORS AND A FUNCTION CODE. THE QIO DIRECTIVE CODE HASF; VALIDATED THE FIRST BUFFER AND PLACED THE TWO-WORD BUFFER DESCRIPTORE; AT OFFSETS I.BUF+0 AND I.BUF+2 IN THE PACKET. THIS DRIVER IS CALLEDRE; DIRECTLY FROM THE DIRECTIVE SERVICE CODE TO VALIDATE THE ADDITIONALRD; PARAMETERS. THE PACKET IS THEN QUEUED TO THE SCB I/O REQUEST QUEUED; FOR THE UNIT AND A CALL MADE TO $GTPKT TO DEQUEUE THE NEXT REQUEST; IN THAT QUEUE.; ; INPUTS:T; R1= ADDRESS OF I/O PACKETO; R4= ADDRESS OF SCB; R5= ADDRESS OF UCB;D%; THE PACKET IS FORMATTED AS FOLLOWS:E;S; I.LNK: I/O QUEUE THREAD WORD; I.PRI: REQUEST PRIORITYE; I.EFN: EVENT FLAG NUMBER); I.TCB: ADDRESS OF TCB OF REQUESTOR TASKE9; I.LN2: ADDRESS OF LUN2 WORD IN HEADER OF REQUESTOR TASK ; I.UCB: ADDRESS OF UCB; I.FCN: I/O FUNCTION CODE-; I.IOSB: VIRTUAL ADDRESS OF I/O STATUS BLOCK -; +2: RELOCATION BIAS OF I/O STATUS BLOCKH=; +4: DISPLACEMENT OF I/O STATUS BLOCK (RELATIVE TO APR6) .; I.AST: VIRTUA ADDRESS OF AST SERVICE ROUTINE,; I.PRM: RELOCATION BIAS OF FIRST I/O BUFFER<; +2: DISPLACEMENT TO FIRST I/O BUFFER (RELATIVE TO APR6)*; +4: SIZE IN BYTES OF FIRST I/O BUFFER; +6: ; +10:R; +12:; +14:; +16:;O-; I/O FUNCTION CODES SERVICED BY THIS DRIVER:C;AA; IO.MFC = 0,1 MULTIPLE FUNCTIONS AND I/O PARAMETERS ARE SUPPLIEDS; IN THE USERS BUFFER (; IO.RSC = 0,2 READ SYSTEM CONFIGURATION; IO.ATT = 0,3 ATTACH TO UNIT/ ; IO.DET = 0,4 DEATACH FROM UNIT); IO.WSC = N,6 WRITE SYSTEM CONFIGURATIONU; 'N' IS A FUNCTION CODE.S; ;-RDINI:$ MOV R1,R3 ; COPY ADDRESS OF PACKET+ ADD #I.FCN,R1 ; AND POINT TO FUNCTION CODEB! CMPB #IO.ATT/400,1(R1) ; ATTACH?  BEQ 95$ ; YES, GO ENQUEUE1- CMPB #IO.DET/400,1(R1) ; HOW ABOUT A DETACH? BEQ 95$ ; YES, SAME OPERATION.9 CMP #IO.RSC,(R1) ; IS THIS A 'READ FULL CONFIGURATION'? - BEQ 95$ ; YES, THEN JUST GO ENQUEUE REQUESTM2 CMP #IO.HRC,(R1) ; IS THIS A MODE-CHANGE COMMAND? BEQ 140$ ; BR IF YES9 MOV #IE.RSU&377,R0 ; ASSUME THIS CALLER IS NOT ATTACHED.A3 ; FOR THE REMAINDER OF THE FUNCTIONS THE CALLERY, ; MUST BE ATTACHED BEFORE THE REQUEST IS( ; ENQUEUED. THIS SERVES TO GUARENTEE ; CONTINUTITY OF ACCESS,2 ; IF MORE THAN ONE REQUESTOR IS SIMULTANIOUSLY/ ; ATTEMPTING TO ADDRESS THE RECONFIGURATION# ; TASK.;8 CMP I.TCB(R3),U.ATT(R5) ; IS THIS CALLER ATTATCHED YET?& BNE 125$ ; GO ISSUE I/O ERROR RETURN20$:# MOV R3,-(SP) ; SAVE PACKET ADDRESSQ MOV R3,-(SP) ; TWICE.B MOV R3,U.BUF+2(R5) ; SETUP FOR CALL TO $GETWRD, POINT INTO PACKET< ADD #I.PRM,U.BUF+2(R5) ; POINT TO FIRST PARAMETER IN PACKET;F?; COME HERE IF THIS IS EITHER A 'WRITE DEVICE CONFIGURATION' OR ; 'MULTIPLE FUNCTION',; 30$:< MOV #14,U.CNT(R5) ; COUNT OF REMAINING BYTES IN THE PACKET., CMP #IO.MFC,I.FCN(R3) ; MULTI-FUNCTION QIO? BNE 40$ ; BR IF NOTI;SB; CHANGE INPUT BUFFER DESCRIPTOR TO REFERENCE USER SUPPLIED BUFFER;+ ADD #I.PRM+0,00‚¨bŸb¿a`TADATADATADATADATADATAR3 ; POINT TO FIRST PARAMETER(/ MOV (R3)+,U.BUF+0(R5) ; SET ADDRESS FOR $GTWRDA= MOV (R3)+,U.BUF+2(R5) ; REFERENCING THE USERS MULTI-FUNCTIONN MOV (R3),U.CNT(R5) ; BUFFER.40$:/ ; AT THIS POINT U.BUF/U.CNT REFER TO EITHERG, ; THE REMAINDER OF THE PARAMETERS IN THE. ; PACKET ITSELF (FOR A IO.WSC FUNCTION) OR/ ; TO THE USERS SPECIFICATION BUFFER (FOR ANI ; IO.MFC FUNCTION)C MOV #IE.BAD&377,R0 ; ASSUME THE CALLER SUPPLIED A TOO-LARGE BUFFERS: CMP U.CW3(R5),U.CNT(R5); CHECK AGAINST MAXIMUM PARAMETERS! BLO 120$ ; BR IF BUFFER TOO BIG;8 CALL NXTNOD ; ALLOCATE THE FIRST PACKET EXTENSION NODE/ ; AND LINK IT TO THE PACKET EXTENSION LIST. # BCS 110$ ; BR IF ALLOCATION ERRORN50$:( MOV (SP),R1 ; GET PACKET ADDRESS AGAIN> BEQ 150$ ; BR IF THIS WAS A ONESHOT QIO (IO.WSC) AND WE HAVE# ; FINISHED PARAMETER PROCESSINGI* MOV I.FCN(R1),R0 ; GET USER FUNCTION CODE) SWAB R0 ; GET FUNCTION CODE TO LOW BYTEE( CMPB #IO.WSC/400,R0 ; SINGLE OPERATION?% BNE 60$ ; NO, BR IF MULTI-OPERATIONA+ CLR (SP) ; FLAG SINGLE OPERATION COMPLETE BR 70$ ;60$: ; PICKUP TRUE FUNCTION CODEO" ; FROM THE USER COMMAND BUFFER= CALL GETWRD ; GET NEXT WORD FROM USER MULTI-FUNCTION BUFFER: BCS 150$ ; BR IF END OF BUFFER# MOV R1,R0 ; POSITION FUNCION CODE ) SWAB R0 ; GET FUNCTION CODE TO LOW BYTEI;D; VALIDATE NEXT FUNCTION CODEF;R70$:B CMPB #IO.WSC/400,R0 ; THIS MUST BE A WRITE CONFIGURATION FUNCTION BNE 100$ ; ILLEGAL FUNCTION  SWAB R0 ; GET SUBFUNCTIONR) CMPB #MAXFC,R0 ; VERIFY CODE IS IN RANGEG" BLO 100$ ; ILLEGAL FUNCTION CODE: CALL PUTWRD ; PUT FUNCTION CODE TO PACKET EXTENSION LIST# BCS 110$ ; BR IF ALLOCATION ERRORT$ CLR R1 ; COUNT REQUIRED PARAMETERS BIC #^C377,R0 ; ISOLATE COMMAND# BEQ 100$ ; BR IF ILLEGAL FUNCTION + MOVB LEGFCN-1(R0),R0 ; PICKUP CONTROL BYTE$ MOV R0,-(SP) ; SAVE FOR SECOND HALF& CALL MOVPAR ; COPY PARAMETERS IF ANY% MOV (SP)+,R0 ; GET CONTROL WORD BACKB" BCS 110$ ; BR IF PARAMETER ERROR& ASH #-4,R0 ; SHIFT TO SECOND QUARTET' CALL MOVDES ; COPY DESCRIPTORS IF ANYI" BCS 110$ ; BR IF PARAMETER ERROR BR 50$ ; GO FOR NEXT COMMAND80$:% MOV #IE.SPC&377,R0 ; PARAMETER ERRORR BR 120$ ; TAKE ERROR EXITE95$:# BR 170$ ; RELAY BRANCH FROM ABOVEA100$:Q+ MOV #IE.IFC&377,R1 ; ILLEGAL FUNCTION CODEN110$:R5 MOV R1,R0 ; CODE WAS SET BY DETECTING ROUTINE ABOVEN120$: TST (SP)+ ; REMOVE FLAG WORD" MOV (SP)+,R3 ; GET PACKET ADDRESS125$:C2 CLR R1 ; RESET SECOND WORD OF I/O STATUS RETURN ' CALL $IOFIN ; AND RETURN ERROR STATUS ;Y9; NOW CLEAR ANY PARTIAL PACKET EXTENSION LIST BUILT ABOVEB;0130$:O MOV R5,R0 ; POINT TO LISTHEADS ADD #U.LIST,R0E CALL $QRMVF ; REMOVE NEXT NODE" BCS 200$ ; BR IF NO MORE IN LIST+ MOV R1,R0 ; SET ADDRESS OF NODE TO RETURN ( MOV #I.LGTH,R1 ; AND SET ALLOCATED SIZE* CALL $DEACB ; RETURN NODE TO SYSTEM POOL BR 130$ ; GO FOR NEXT IN LISTA;D-; PROCESS PRIVILEGED TASK MODE CHANGE REQUESTC;R140$:T1 MOV I.TCB(R3),R2 ; PICK UP REQUESTOR TCB ADDRESS * BIT #T3.PRV,T.ST3(R2) ; IS IT PRIVILEGED?0 BEQ 146$ ; BR IF NO. NON-PRIVILEGED REQUESTORS ; JUST WAKE UP HRC...O; ADD #I.PRM+0-I.FCN,R1 ; ADVANCE POINTER TO FIRST PARAMETERX1 BIC (R1),U.CW2(R5) ; RESET 'MASK' FROM MODE BITS0 COM (R1) ; OBTAIN 'NOT MASK'9 BIC (R1)+,(R1) ; AND ENSURE 'TRUE' BITS DONT CONTAIN ANY . ; OTHER THAN WHAT WERE SPECIFIED IN 'MASK'< BIS (R1),U.CW2(R5) ; AND SET IN NEW BITS INTO MODE CONTROL.146$:R MOV #IS.SUC,R0 ; SET STATUS" CLR R1 ; SET SECOND STATUS VALUE TST $HRCPT ; DOES HRC EXIST? BNE 147$ ; BR IF NOT/ MOV #IE.OFL&377,R0 ; REVISE STATUS ACCORDINGLYK147$:C+ CALL $IOFIN ; AND TERMINATE I/O OPERATIONR, MOV $HRCPT,R0 ; PICK UP TCB ADDRESS FOR HRC2 BEQ 200$ ; IGNORE OPERATION OF HRC NOT INSTALLED. CALLR $EXRQN ; REQUEST HRC TO CHECK NEW MODE; @; THE FINAL COMMAND HAS BEEN TRANSFERRED TO THE PACKET EXTENSION;1150$:51 CLR R0 ; SET A ZERO COMMAND AS A STOPPER IN THER ; PACKET EXTENSION% CALL PUTWRD ; PUT TO EXTENSION L00‚°b!b“_c”_d–_k›’ISTL# BCS 110$ ; BR IF ALLOCATION ERRORB160$:  TST (SP)+ ; REMOVE FLAG3" MOV (SP)+,R3 ; GET PACKET ADDRESS;CE; COPY PACKET EXTENSION LISTHEAD TO THE PACKET AND ENQUEUE THE PACKET ; TO THE SCB QUEUE.C;B170$:;$ MOV R3,R1 ; RESTORE PACKET ADDERSSB MOV U.LIST+0(R5),I.PRM+14(R1) ; COPY EXTENSION LISTHEAD TO PACKET175$:  CLR U.LIST(R5) ;D% MOV R5,U.LIST+2(R5) ; RESET LISTHEAD$ ADD #U.LIST,U.LIST+2(R5) ; TO EMPTY/ MOV U.SCB(R5),R0 ; POINT TO I/O QUEUE LISTHEAD * CALL $QINSP ; AND INSERT PACKET IN QUEUE& ; FALL THROUGH INTO PACKET DEQUEUE;O,; FETCH THE NEXT PACKET FROM THE INPUT QUEUE6; PERFORM ATTACH AND DETACH FUNCTIONS AS A SIDE EFFECT;Q180$:P. BICB #US.BSY,U.STS(R5) ; MARK DRIVER NOT BUSY# MOV U.SCB(R5),R4 ; GET SCB ADDRESSV* CLRB S.STS(R4) ; TO ALLOW ANOTHER DEQUEUEE GTPKT$ RD,1,130$,,T ; GET NEXT PACKET FROM QUEUE OR RETURN TO CALLERS;S; INPUT:; R1= ADDRESS OF NEXT PACKET; R4= ADDRESS OF SCB; R5= ADDRESS OF UCB;L; PACKET FORMAT:;P ; AS ABOVE.T;C3 MOV $HRCPT,R0 ; GET ADDRESS OF HRC PROCESSING TASK) BNE 190$ ; BR IF SERVICE TASK AVAILABLEQ& MOV #IE.OFL&377,R0 ; 'DEVICE' OFFLINE MOV R1,R3 ; SET UP FOR $IOFINP0 MOV I.PRM+14(R1),R2 ; GET ADDRESS OF FIRST NODE( BEQ 187$ ; NO LIST, GO TAKE ERROR EXIT% MOV R2,U.LIST+0(R5) ; BUILD LISTHEAD185$:T( MOV R2,U.LIST+2(R5) ; LAST NODE POINTER' MOV (R2),R2 ; LOOK FOR REAL LAST NODE  BNE 185$ ; NOT YET187$: , CALL 125$ ; DO I/O DONE ON THIS PACKET AND# ; ELIMENATE ANY PARAMETER LISTSC( BR 180$ ; GO RESET DEVICE NOT BUSY AND ; CHECK FOR ANOTHER PACKET190$:I: CALL $EXRQP ; ENQUEUE TO HRC AND ACTIVATE IF NOT ALREADY BR 180$ ; GO FOR NEXT PACKET;P+; POWERFAIL AND TIMEOUT DRIVER ENTRY POINTSQ;7200$:IRDPWF:RDOUT:RDCAN: RETURNI;R; UTILITY ROUTINES;8;B; COPY PARAMETERS OR BUFFER DESCRIPTORS TO EXTENSION AS INDICATED ; IN THE CONTROL BYTE.;;MOVPAR:8$ BIC #^C17,R0 ; ISOLATE CONTROL BITS BEQ 15$ ; BR IF DONE" MOV R0,R2 ; COPY PARAMETER COUNT10$:. CALL GETWRD ; GET NEXT WORD FROM USER BUFFER$ BCS 15$ ; BR IF NO MORE PARAMETERS MOV R1,R0 ; COPY FOR PUT. CALL PUTWRD ; PUT IT TO THE PACKET EXTENSION' BCS 15$ ; BR IF NODE ALLOCATION ERRORT& SOB R2,10$ ; LOOP FOR ALL PARAMETERS15$: RETURNTMOVDES:, BIC #^C17,R0 ; ISOLATE COUNT OF DESCRIPTORS BEQ 35$ ; BR IF NONE TO MOVE MOV R5,-(SP) ; SAVE A REGISTERR MOV R0,-(SP) ; SAVE THE COUNT10$:; CALL GETBUF ; GET NEXT BUFFER DESCRIPTOR FROM USER BUFFER 1 BCS 28$ ; BRANCH IF INPUT EXHAUSTED PREMATURELYE MOV R0,-(SP) ; SAVE BUFFER SIZE2 MOV R1,R0 ; SET BUFFER RELOCATION ADDRESS (APR6) CALL PUTWRD ; PUT TO EXTENSION" BCS 25$ ; BR IF ALLOCATION ERROR# MOV R2,R0 ; PUT RELOCATION OFFSET 2 CALL PUTWRD ; AND PUT IT TO THE PACKET EXTENSION" BCS 25$ ; BR IF ALLOCATION ERROR! MOV (SP),R0 ; SET BUFFER LENGTHE2 CALL PUTWRD ; AND PUT IT TO THE PACKET EXTENSION25$:4 INC (SP)+ ; CLEAR STACK WITHOUT CHANGING CARRY BIT BCS 30$ ; EXIT IF ERRORE% DEC (SP) ; DEC COUNT OF DESCRIPTORSE BNE 10$ ; LOOP28$: INC (SP)+ ; CLEAN THE STACKR30$:" MOV (SP)+,R5 ; RESTORE A REGISTER35$: RETURN ; ;EC; GET A BUFFER DESCRIPTOR FROM THE USER, ADDRESS CHECK AND RELOCATEA; TO AN APR6 BASE PLUS OFFSET.;UGETBUF: - CALL GETWRD ; GET VIRTUAL ADDRESS OF BUFFERE BCS 50$ ; BR IF NO MOREU MOV R1,R0 ; SET ADDRESS  CALL GETWRD ; GET SIZE WORDN BCS 50$ ; BR IF NO MOREL$ MOV R1,-(SP) ; SAVE SIZE FOR RETURN BNE 5$ ; BR IF REAL DESCRIPTOR' CLR R2 ; INDICATE NO BUFFER AVAILABLE$ BR 40$ ; COMPLETE SCAN5$:L) CALL $CKBFB ; CHECK AND LOCK THE BUFFERR7 BCS 40$ ; AND EXIT IF THERE IS A BUFFER MAPPING ERRORD+ CALL $RELOC ; AND RELOCATE TO APR6 OFFSETL40$:" MOV (SP)+,R0 ; RETURN BUFFER SIZE50$: RETURNC;W1; GET NEXT WORD FROM USER INPUT BUFFER OR PACKET.R; GETWRD:M( MOV #IE.BAD&377,R1 ; ASSUME FETCH ERROR* SUB #2,U.CNT(R5) ; ACCOUNT FOR WORD TAKEN BCS 10$ ; BR IF NO MOREO9 CALL $GTWRD ; USER SYSTEM ROUTIN00‚¸bƒ½b¿a`TADATADATADATADATADATAE TO ADDRESS THE BUFFERC MOV (SP)+,R1 ; LOAD VALUE CLC ; ENSURE CARRY CLEAR10$: RETURN ; #; PUT WORD TO PACKET EXTENSION LIST ;T; INPUT:; R0=WORD TO PUT); R3=BYTECOUNT OF SPACE REMAINING IN NODEP; R4=NODE FILL POINTER;+PUTWRD:N' SUB #2,(R3) ; ACCOUNT FOR SPACE TAKENE$ BGE 20$ ; BR IF SPACE IS AVAILABLE! ADD #2,(R3) ; CORRECT UNDERFLOWD5 CALL NXTNOD ; ALLOCATE NEXT NODE AND LINK IT TO THEN ; EXTENSION LIST BCC PUTWRD ; TRY AGAIN BR 30$ ; ALLOCATE ERRORO20$: MOV R0,(R4)+ ; PUT WORD TO NODE30$: RETURNE;CH; ALLOCATE ANOTHER NODE FOR THE PACKET EXTENSION LIST AND LINK IT TO THE; LISTHEAD AT U.LIST+0,+2 ;WNXTNOD: JSR R2,$SAVVR ; SAVE R0,R1,R2, MOV #I.LGTH,R1 ; SET SIZE OF EXTENSION NODE MOV R1,R3 ; SET FILL COUNT CALL $ALOCB ; ALLOCATE NODER BCS 10$ ; BR IF ALLOCATE ERROR MOV R0,R4 ; SET FILL POINTER MOV R0,R1 ; AND NODE ADDRESS" MOV R5,R0 ; SET LISTHEAD ADDRESS ADD #U.LIST,R0 ;; CLR (R4)+ ; ZERO LINKWORD % MOV R3,(R4) ; SET 'SPACE REMAINING'T/ MOV R4,R3 ; COPY POINTER TO 'SPACE REMAINING'N3 SUB #4,(R4)+ ; ADJUST TO ACTUAL SPACE AND POINT TO ; FIRST FILL LOCATION$ MOV R3,-(SP) ; AGAINST MODIFICATION4 CALL $QINSF ; INSERT NODE AT END OF EXTENSION LIST! MOV (SP)+,R3 ; RESTORE REGISTERSA RETURNL10$:& MOV #IE.NOD&377,R1 ; ALLOCATION ERROR RETURN,;E0; SPECIFICATION OF LEGAL FUNCTIONS AND ARGUMENTS;R .MACRO CMD NAME $$$TMP=.A .=LEGFCN+-1 .BYTE IO$'NAME&377 .IIF GT .-$$$TMP $$$TMP=. .=$$$TMP $$$CNT=$$$CNT+1 .ENDM $$$CNT=0MLEGFCN:* CMD ONL ; ONLINE, TWO BUFFER DESCRIPTORS+ CMD OFL ; OFFLINE, TWO BUFFER DESCRIPTORS,/ CMD MAI ; MAINTENANCE, TWO BUFFER DESCRIPTORSN CMD ONE ; ON CONDITION CMD IF ; IF CONDITION ( CMD CAC ; CACHE CONTROL, ONE PARAMETER6 CMD MEM ; MIND CONTROL, ONE DESCRIPTOR,ONE PARAMETER- CMD HRC ; CONTROL - SET HRC OPERATING MODES# CMD STN ; SET TASK NAME TWO WORDS. CMD STA ; RETURN DEVICE STATUS! CMD RLI ; LINK, TWO DESCRIPTORST" CMD RUL ; UNLINK, ONE DESCRIPTOR= CMD MBO ; MEMORY BOX ONLINE, 2 PARAMETERS AND 4 DESCRIPTORSD CMD MBF ; MEMORY BOX OFFLINE# CMD RSW ; SWITCH, TWO DESCRIPTORS * CMD WAT ; WRITE ATTRIBUTES, 1 DESCRIPTOR) CMD RAT ; READ ATTRIBUTES, 1 DESCRIPTOR > ASSUME $$$CNT,<<.-LEGFCN>> ; ENSURE NO COMMANDS WERE LEFT OUT MAXFC=.-LEGFCNO .ENDR- CMD HRC ; CONTROL - SET HRC OPERATING MODES# CMD STN ; SET TASK NAME TWO WORDS. CMD STA ; RETURN DEVICE STATUS! CMD RLI ; LINK, .TITLE DRCMTT .IDENT /5.1/N K;N6; COPYRIGHT (c) 1983 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;M<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;I; MODIFIED FOR VERSION 2.1 BY:;C; J. R. KAUFFMAN 17-OCT-82 5.1N;W/; JRK263 -- MOVE MORE CODE TO DIRECTIVE COMMOND;C; 3; CANCEL MARK TIME AND SCHEDULE REQUESTS DIRECTIVESA;N; MACRO LIBRARY CALLSA;  .MCALL CLKDF$3 CLKDF$ ;DEFINE CLOCK QUEUE CONTROL BLOCK OFFSETSN;+%; **-$DRCMT-CANCEL MARK TIME REQUESTSI3; **-$DRCMS-CANCEL SELECTIVE MARK TIME REQUESTS S;FF; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CANCEL ALL MARK TIME REQUESTSG; (DPB SIZE=1) OR ALL REQUESTS WITH MATCHING EVENT FLAG OR AST ADDRESS 1; (DPB SIZE=3). N ; ; DPB FORMAT.K; ,; WD. 00 -- DIC(27.),DPB SIZE(1. OR 3.). $; WD. 01 -- MATCHING EFN NUMBER %; WD. 02 -- MATCHING AST ADDRESS A ; ; INPUTS:D;9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF WD. 00 + 2. 2; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; ;; NOTE: $DRCMT IS ALSO CALLED FROM THE EXIT DIRECTIVE AND S/; ONLY REQUIRES R5 TO BE LOADED ON ENTRANCE. D;S5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ;-$; C=0 WITH A DIRECTIVE STATUS OF +1.;- .ENABL LSBE%$DRCMS::CMPB -(R3),#1 ;DPB SIZE=1 T/ BEQ $DRCMT ;IF EQ YES, CANCEL ALL MARK TIMES A CMPB (R3)00ƒÀb„Áb“_c”_d–_k›’+,#3 ;DPB SIZE=3 & BNE 5$ ;IF NE NO, INVALID DPB SIZE ' MOV (R3)+,R1 ;PICK UP SPECIFIED EFN R. MOV (R3),R2 ;PICK UP SPECIFIED AST ADDRESS  CLR R4 ;SET MARK TIME CODE E, CALLR $CLRSM ;CANCEL SELECTED MARK TIMES .$DRCMT::CLR R4 ;SET TYPE OF REQUEST TO REMOVE, CALLR $CLRMV ;REMOVE ALL REMAINING ENTRIES&5$: DRSTS D.RS99 ;INVALID DPB SIZE  .ENDIVE STATUS OF +1.;- .ENABL LSBE%$DRCMS::CMPB -(R3),#1 ;DPB SIZE=1 T/ BEQ $DRCMT ;IF EQ YES, CANCEL ALL MARK TIMES A CMPB (R3) .TITLE DRRESR .IDENT /07.01/R;RC; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.I; ALL RIGHTS RESERVED.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;C); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ;C ; M. S. FOX ; J. M. LAWLER; T. M. MARTIN; B. S. MCCARTHY;); MODIFIED BY:;L; J. R. KAUFFMAN 7-MAR-83 7.1G;A6; JRK277 -- CORRECT STACK DEPTH FOR ACP QUEUE REORDER;P; MACRO LIBRARY CALLS ;E# .MCALL HDRDF$,PKTDF$,PCBDF$,TCBDF$c% HDRDF$ ;DEFINE TASK HEADER OFFSETST$ PKTDF$ ;DEFINE I/O PACKET OFFSETS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSA, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS ;+ ; **-$DRUNS-UNSTOP TASK ; H; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO UNSTOP A TASK THAT HAS STOPPED ?; ITSELF VIA A STOP DIRECTIVE OR A RECEIVE OR STOP DIRECTIVE. ; ; DPB FORMAT: K ; '; WD. 00 -- DIC(133.),DPB SIZE(3.). L(; WD. 01 -- FIRST HALF OF TASK NAME. ); WD. 02 -- SECOND HALF OF TASK NAME. T ; ; INPUTS: O ; 6; R0=ADDRESS OF THE TCB OF THE TASK TO BE UNSTOPPED. B; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO BE UNSTOPPED. ;; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. S.; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. 2; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. /; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; 8; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; 0; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ); DIRECTIVE STATUS OF +1 IS RETURNED. $; C=1 IF DIRECTIVE IS REJECTED. ;; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF THE SPECIFIEDH; TASK IS NOT ACTIVE. 2;; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THE SPECIFIED3.; TASK IS NOT STOPPED, OR STOPPED FOR EVENT ; FLAG(S) OR BUFFERED I/O. R ;-  .ENABL LSB -$DRUNS::TST (R1)+ ;SPECIFIED TASK ACTIVE? T BMI 20$ ;IF MI NO D. BIT #T2.SEF,(R1) ;TASK STOPPED FOR EVENT FLAG BNE 30$ ;IF NE YES$ MOV #T2.STP,R2 ;PICK UP STOP BIT ' BR 5$ ;JOIN COMMON CODE WITH RESUME D ;+!; **-$DRRES-RESUME TASK EXECUTIONI;HL; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO RESUME THE EXECUTION OF A TASK THAT!; HAS ISSUED A SUSPEND DIRECTIVE.K; ; DPB FORMAT: ;P"; WD. 00 -- DIC(47.),DPB SIZE(3.).$; WD. 01 -- FIRST HALF OF TASK NAME.%; WD. 02 -- SECOND HALF OF TASK NAME. ;P ; INPUTS:K;T2; R0=ADDRESS OF THE TCB OF THE TASK TO BE RESUMED.?; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO BE RESUMED.P9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.S+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.S/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.S,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;A5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK);D-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.S&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.S:; DIRECTIVE STATUS OF 'D.RS7 IS RETURNED IF THE SPECIFIED; TASK IS NOT ACTIVE.S;; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THE SPECIFIEDA; TASK IS NOT SUSPENDED.;-$$DRRES::TST (R1)+ ;TASK ACTIVE?  BMI 20$ ;IF MI NOE MOV #T2.SPN,R2 ;GET SUSPEND BIT-5$: BIT R2,(R1) ;TASK CURRENTLY SUSPENDED? S BNE 10$ ;IF NE YES  TST (R1) ;AST IN PROGRESS? BPL 30$ ;IF PL NOD! ASL R2 ;SET PRE AST SUSPEND BITS" BIT R2,(R1) ;WAS TASK SUSPENDED? BEQ 30$ ;IF EQ NOI610$: CMPB $DICSV,#133. ;IS THIS AN00„Èb½b¿a`TADATADATADATADATADATA UNSTOP DIRECTIVE?  BEQ 15$ ;IF EQ YES ) BIC R2,(R1) ;CLEAR TASK'S SUSPEND BIT F3 CALLR $SETCR ;SET A CONDITIONAL SCHEDULE REQUEST O,15$: CALLR $EXRQN ;UNSTOP SPECIFIED TASK '20$: DRSTS D.RS7 ;SET DIRECTIVE STATUS2'30$: DRSTS D.RS8 ;SET DIRECTIVE STATUS ;+ Y; **-$DRSTP-STOP TASK ; A; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO STOP THE ISSUING TASK. R ; ; DPB FORMAT: W ; '; WD. 00 -- DIC(131.),DPB SIZE(1.). D ; ; INPUTS: I ; A; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK. F.; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. 2; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. /; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. D ; 8; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; -; C=0 IF DIRECTIVE SUCCESSFULLY COMPLETED. E.; DIRECTIVE STATUS OF 'D.RS22' IS RETURNED. $; C=1 IF DIRECTIVE IS REJECTED. ;; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE ISSUING ; TASK IS AT AST STATE. O ;- T 2$DRSTP::TST (R2) ;IS ISSUING TASK AT AST STATE?  BMI 35$ ;IF MI YES # CALL $STPCT ;STOP ISSUING TASK N) DRSTS D.RS22 ;RETURN SUCCESS WITH +2 C235$: DRSTS D.RS80 ;ISSUING TASK IS AT AST STATE ;+; **-$DRSPN-SUSPEND EXECUTION;=M; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SUSPEND THE EXECUTION OF THE ISSUINGR; TASK. ; ; DPB FORMAT:E; "; WD. 00 -- DIC(45.),DPB SIZE(1.).;' ; INPUTS:R;R9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. +; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.U/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;R5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)S;N*; C=0 WITH A DIRECTIVE STATUS OF 'D.RS22'.;-.$DRSPN::BIS #T2.SPN,(R2) ;SUSPEND CURRENT TASK1 CALL $SETRT ;FORCE A REDISPATCHING OF PROCESSORS$ DRSTS D.RS22 ;SET DIRECTIVE STATUS;+; **-$DRATP-ALTER TASK PRIORITY;A; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CHANGE THE TASK PRIORITY ; OF THE SPECIFIED TASK.;A ; DPB FORMAT:D;2 ; WD. 00 -- DIC(9.),DPB SIZE(4.)$; WD. 01 -- FIRST HALF OF TASK NAME.%; WD. 02 -- SECOND HALF OF TASK NAME.T; WD. 03 -- NEW PRIORITY. ;U ; INPUTS:K;2; R0=ADDRESS OF THE TCB OF THE TASK TO BE ALTERED.?; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO BE ALTERED.F9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.E); R3=ADDRESS OF THE LAST WORD IN THE DPB.P/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.E,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;D5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ;E-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.D&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.U1; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF THE ; TASK IS NOT ACTIVE. 0; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF A(; NONPRIVILEGED TASK ATTEMPTS TO RAISE(; ITS PRIORITY ITS INSTALLED PRIORITY.0; DIRECTIVE STATUS OF 'D.RS17' IS RETURNED IF A'; TASK ATTEMPTS TO ALTER THE PRIORITYC+; OF A CHECKPOINTED TASK WITH OUTSTANDINGT; I/O.2; DIRECTIVE STATUS OF 'D.RS95' IS RETURNED IF THE&; NEW PRIORITY SPECIFIED IS INVALID.;A;-$DRATP:: ;REF LABEL D .IF DF M$$MUP0 BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED? BNE 39$ ;IF NE YES$ CMP R0,R5 ;MODIFYING OWN PRIORITY?) BNE 180$ ;IF NE NO, PRIVILEGE VIOLATIONA8 CMPB (R3),T.DPRI(R0) ;RAISING SELF ABOVE INSTALLED PRI? BLOS 39$ ;IF LOS NOF(180$: DRSTS D.RS16 ;PRIVILEGE VIOLATION .IFTF%170$: DRSTS D.RS95 ;ILLEGAL PRIORITYK39$: ;REF LABEL .ENDC0 MOV R0,R5 ;SAVE TCB ADDR OF TASK TO BE ALTERED TST (R1) ;TASK ACTIVE? BMI 20$ ;IF MI NOD+ MOV (R3),R3 ;GET NEW PRIORITY AND TEST IT" BNE 40$ ;IF NE ONE WAS SPECIFIED) BISB T.DPRI(R5),R3 ;USE DEFAULT PRIORITYR)40$: CMP R3,#250. ;NEW PRIORITY .GT. 250?; BHI 170$ ;IF HI YESL! MOVB R3,-(SP) ;SAVE NEW PRIORITYI TSTB T.IOC(R5) ;ANY I/O ACTIVE? BEQ 100$ ;IF EQ NO1 MOV T.PCB(R5),R1 ;GET PCB A00„ÐbÁb“_c”_d–_k›’DDRESS OF TARGET TASK9 BIT #PS.OUT!PS.CKP,P.STAT(R1) ;TASK REGION CHECKPOINTED?B* BNE 190$ ;IF NE YES, RETURN IE.RSU ERROR( CLR -(SP) ;PUSH INITIAL LUN NUMBER - 1 .IF DF X$$HDR050$: MOV T.PCB(R5),R1 ;GET ADDRESS OF TASK'S PCB" MOV P.HDR(R1),R4 ;GET HEADER ADDR+ BNE 60$ ;IF NE, RESIDENT HEADER (IN POOL)R1 MOV P.REL(R1),KISAR6 ;OTHERWISE, MAP TASK HEADER1 MOV #140000,R4 ;GET HEADER ADDR60$: ;REFERENCE LABEL .IFF5/50$: MOV T.PCB(R5),R1 ;GET ADDRES OF TASK'S PCBB* MOV P.HDR(R1),R4 ;GET TASK HEADER ADDRESS .ENDC$ CMP (SP),H.NLUN(R4) ;PAST LAST LUN? BHIS 90$ ;IF HIS YES MOV (SP),R1 ;GET LUN -1% CALL $MPLNE ;MAP LUN TO UCB ADDRESS1$ BCS 80$ ;IF CS LUN IS NOT ASSIGNED" MOV R0,-(SP) ;SAVE UCB ADDRESS 0 MOV U.SCB(R0),R4 ;GET PTR TO SCB FOR THIS UCB  CALL 130$ ;REORDER I/O QUEUE# MOV (SP),R0 ;RETRIEVE UCB ADDRESS ! TST U.CW1(R0) ;DEVICE MOUNTABLE?H BPL 79$ ;IF PL NOR! BITB #US.MNT,U.STS(R0) ;MOUNTED?T BNE 79$ ;IF NE NOE% MOV U.ACP(R0),R4 ;PICK UP TCB OF ACPT, BEQ 79$ ;IF EQ MOUNTED FOREIGN WITH NO ACP0 ADD #T.RCVL,R4 ;POINT TO RECEIVE QUEUE LISTHEAD CALL 130$ ;REORDER ACP QUEUE.79$: TST (SP)+ ;REMOVE UCB ADDRESS FROM STACK$80$: INC (SP) ;UPDATE LUN NUMBER # BR 50$ ;CONTINUE THROUGH LUN LOOP)*90$: TST (SP)+ ;POP LUN NUMBER FROM STACK 100$: ; .IF DF A$$CNT' BIT #T2.ABO,T.ST2(R5) ;IS TASK ABORTED) BNE 106$ ;IF NE YESB MOV KISAR6,R0 ;SAVE MAPPING+ MOV T.ACN(R5),KISAR6 ;MAP ACCOUNTING BLOCKE BEQ 105$ ;IF EQ NO ACCOUNTINGO+ CMPB #BT.TAB,@#B.TYP+140000 ;IS THIS A TAB  BNE 105$ ;IF NE NO; CMPB (SP),@#B.PRI+140000 ;IS NEW PRIORITY HIGHER THAN PREVQ BLOS 105$ ;IF LOS NO5 MOVB (SP),@#B.PRI+140000 ;RECORD NEW HIGHER PRIORITYN$105$: MOV R0,KISAR6 ;RESTORE MAPPING 106$: ; .ENDC ;A$$CNT, MOVB (SP)+,T.PRI(R5) ;SET NEW TASK PRIORITY2 MOV R5,R0 ;GET TCB ADDRESS OF TASK TO BE ALTERED" CALL $ACTRM ;REMOVE TCB FROM ATL$ BCS 110$ ;IF CS TCB NOT YET IN ATL# CALL $ACTTK ;RE-INSERT TCB IN ATL;)110$: MOV T.PCB(R5),R1 ;POINT TO TASK PCB+0 TST P.ATT(R1) ;TASK ATTACHED TO OWN REGION YET? BNE 115$ ;IF NE YESI MOV R5,R0 ;COPY TCB POINTERQ) CALL $ALTRG ;ALTER TASK REGION PRIORITYI BR 129$ ;R<115$: MOV T.ATT(R5),R4 ;POINT TO FIRST ENTRY IN ATTACH QUEUE9120$: TSTB A.MPCT-A.TCBL(R4) ;TASK MAPPED TO THIS REGION?T BEQ 125$ ;IF EQ NO MOV R5,R0 ;COPY TCB POINTERA- MOV A.PCB-A.TCBL(R4),R1 ;POINT TO MAPPED PCBM$ CALL $ALTRG ;ALTER REGION PRIORITY7125$: MOV (R4),R4 ;POINT TO NEXT ATTACHMENT DESCRIPTORC BNE 120$ ;IF NE THERE IS ONE.129$: CALLR $DRDSE ;DECLARE SIGNIFICANT EVENT:130$: MOV #-2,-(SP) ;CONSTRUCT TEMPORARY LISTHEAD ON STACK ADD SP,(SP) ;T CLR -(SP) ;R.140$: MOV R4,R0 ;GET I/O PACKET LISTHEAD ADDR/ MOV R5,R1 ;GET TCB ADDR OF TASK TO BE ALTEREDC, CALL $QRMVT ;REMOVE I/O PACKET BY TCB ADDR% BCS 150$ ;IF CS NO I/O PACKET FOUNDC0 CMPB I.PRI(R1),#250. ;PRIORITY HIGHER THAN 250?" BHI 145$ ;IF HI YES, DON'T TOUCH( MOVB 12(SP),I.PRI(R1) ;SET NEW PRIORITY0145$: MOV SP,R0 ;SET TEMPORARY LISTHEAD ADDRESS2 CALL $QINSF ;INSERT I/O PACKET IN TEMPORARY LIST/ BR 140$ ;CONTINUE THROUGH PACKET REMOVAL LOOPS-150$: MOV SP,R0 ;SET TEMPORARY LISTHEAD ADDRR0 CALL $QRMVF ;REMOVE FIRST I/O PACKET FROM LIST% BCS 160$ ;IF CS NO I/O PACKET FOUND ) MOV R4,R0 ;GET I/O PACKET LISTHEAD ADDRB3 CALL $QINSP ;RE-INSERT I/O PACKET BY NEW PRIORITYC1 BR 150$ ;CONTINUE THROUGH PACKET INSERTION LOOPI9160$: CMP (SP)+,(SP)+ ;CLEAN TEMPORARY LISTHEAD OFF STACK RETURN ;(190$: DRSTS D.RS17 ;RETURN IE.RSU ERROR .DSABL LSB  .END PACKET IN TEMPORARY LIST/ BR 140$ ;CONTINUE THROUGH PACKET REMOVAL LOOPS-150$: MOV SP,R0 ;SET TEMPORARY LISTHEAD ADDRR0 CALL $QRMVF ;REMOVE FIRST I/O PACKET FROM LIST% BCS 160$ ;IF CS NO I/O PACKET FOUND ) MOV R4,R0 ;GET I/O PACKET LISTHEAD ADDRB3 CALL $QINSP ;RE-INSERT I/O PACKET BY NEW PRIORITYC1 BR 150$ ;CONTINUE THROUGH PACKET INSERTION LOOPI9160$: CMP (SP)+,(SP)+ ;CLEAN TEMPORARY LISTHEAD OFF STACK RETURN ;(190$: DRSTS D.RS17 ;RET00QØb‡ÛbˆÝb`TADATADATADATADATADATA .TITLE DRSPW  .IDENT /5.00/;G(; COPYRIGHT (C) 1982, 1983, 1984, 1985$; BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; M. S. FOX 21-MAY-81  ; C ; THIS MODULE WAS ORIGINALLY WRITTEN BY T. J. MILLER ON 26-MAY-77S(; AND HAS BEEN PREVIOUSLY MODIFIED BY:;B; R. E. CALDWELL; B. S. MCCARTHY; T. J. MILLER; J. E. PROVINO.; -; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:C;2; J. M. LAWLER; T. M. MARTIN; B. S. MCCARTHY; -; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:S; ; B. S. MCCARTHY; J. W. BERZLE; J. R. KAUFFMAN;O; MODIFIED BY:;F; J. W. BERZLE 17-OCT-85 5.00O;M+; JWB167 -- USE $QRMVA INSTEAD OF $QRMVTW;N!; P. K. M. WEISS 12-JUN-86 5.01 ;A4; PKW111 -- ALLOW A CLI'S RPOI DIRECTIVES TO WORK;G7; THIS MODULE CONTAINS THE DIRECTIVE ROUTINES AND PRIMARY SUBROUTINESD38; WHICH PROVIDE PARENT-OFFSPRING TASKING SUPPORT.A9;:; MACRO LIBRARY CALLSS;;A<=>%? .MCALL DCBDF$,PKTDF$,TCBDF$,UCBDF$.@A .IF DF N$$DIRBC .MCALL LNMDF$D)E LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETSBFG .ENDC ;DF N$$DIREH0I DCBDF$ ;DEFINE DEVICE CONTROL BLOCK SYMBOLS.J PKTDF$ ;DEFINE I/O PACKET AND OCB OFFSETS.K TCBDF$ ;DEFINE TASK CONTROL BLOCK SYMBOLS.L UCBDF$ ;DEFINE UNIT CONTROL BLOCK SYMBOLSMN;+LO; **-$DRSRC- .TITLE DYCOMW .IDENT /1.0/I;K5; COPYRIGHT (C) 1983 BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;.<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; J. L. GALLANT 26-JUN-83;E; THE RX02 DEVICE DRIVER IS USING THIS DATA COMMON AS AN INTERMEDIATEF; BUFFER SO THAT TASKS ABOVE THE 124K MEMORY SPACE CAN STILL DO I/O TOG; THE FLOPPY. THIS DATA COMMON IS NEEDED ONLY ON 22BIT QBUS PROCESSORS.; .PSECT DYCOM,D,GBL,RW;.3; BUFFER IS 1K WORDS, 1K BYTES FOR EACH CONTROLLER.I;N .BLKW 512.  .IF GT R$$X21-1 .BLKW 512.S .ENDC .ENDDNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; J. L. GALLANT 26-JUN-83;E; THE RX02 DEVICE DRIVER IS USING THIS DATA COMMON AS AN INTERMEDIATEF; BUFFER SO THAT TASKS ABOVE THE 124K MEMORY SPACE CAN STILL DO I/O TOG; THE FLOPPY. THIS DATA COMMON IS NEEDED ONLY ON 22BIT QBUS PROCESSORS.; .PSEC .TITLE DRCPCC .IDENT /03.00/0 ;[; COPYRIGHT (C) 1984/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.F;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDO9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.H;S1; ORIGINALLY PART OF DRREG, ADDED BY T. M. MARTIN;TB; SPLIT INTO SEPARATE MODULE BY B. S. MCCARTHY AS PART OF CREATING?; THIRD DIRECTIVE COMMON WITH PLAS DIRECTIVES (BM292) 28-NOV-83;+;$; **-$DRCPC-CHECKPOINT COMMON REGION;3; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CHECKPOINT08; A NAMED STATIC COMMON REGION. THE ISSUING TASK MUST BE;; PRIVILEGED AND ATTACHED TO THE COMMON BUT NOT NECESSARILYR9; MAPPED. ANY TASK WHICH IS MAPPED TO THE COMMON WHICH IS 8; BEING CHECKPOINTED IS BLOCKED UNTIL THE CHECKPOINT HAS ; COMPLETED.;T ; DPB FORMAT:T; %; WD. 00 -- DIC (205.), DPB SIZE (6.)A.; WD. 01 -- FIRST WORD OF RAD50 PARTITION NAME/; WD. 02 -- SECOND WORD OF RAD50 PARTITION NAME&;(soon) WD. 03 -- SPECIFIED EVENT FLAG2;(soon) WD. 04 -- ADDRESS OF I/O STATUS DOUBLEWORD-;(soon) WD. 05 -- ADDRESS OF USER AST ROUTINEU; ; INPUTS:E; ; R3=ADDRESS OF WD. 00 + 2.E.; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; ; OUTPUTS:; ; DIRECTIVE STATUS;P .IF DF, C$$PCRE8$DRCPC::BIT #T3.PRV,T.ST3(R5) ;IS THE ISSUER PRIVILEGED?" BEQ 25$ ;IF EQ NO, RETURN ERROR& MOV T.ATT(R5),R0 ;POINT TO FIRST ADB110$: MOV A.PCB-A.TCBL(R0),R1 ;PICK UP PCB ADDRESSC) CMP P.NAM(R1),(R3) ;IS THIS THE REGI00ˆàb‰âb“_c”_d–_k›’ON?  BNE 20$ ;IF NE NO CMP P.NAM+2(R1),2(R3) ;REALLY?U BEQ 30$ ;IF EQ, FOUND ITS 20$: MOV (R0),R0 ;GET NEXT ADB BNE 10$ ;TRY NEXT ATTACHMENT & DRSTS D.RS94 ;RETURN ERROR 'IE.PNS'*25$: DRSTS D.RS16 ;RETURN ERROR 'IE.PRV')26$: DRSTS D.RS8 ;RETURN ERROR 'IE.ITS'"30$: MOV R1,R4 ;SAVE PCB ADDRESS* ADD #P.STAT,R1 ;POINT TO PCB STATUS WORD9 BIT #PS.CKP!PS.CHK,(R1) ;PARTITION NON CHECKPOINTABLE OR:! ;HAS CHECKPOINT IN PROGRESS?C# BNE 26$ ;IF NE YES, RETURN ERRORT$ BIT #PS.COM,(R1)+ ;IS IT A COMMON? BEQ 26$ ;IF EQ NO- BIT #P2.CPC,(R1) ;CPCR ALREADY IN PROGRESS?: BNE 26$ ;IF NE YEST! MOV R4,R1 ;RESTORE PCB ADDRESSN, TST P.DPCB(R1) ;IS REGION A STATIC COMMON? BEQ 26$ ;IF EQ NO1 BIS #P2.CPC,P.ST2(R1) ;INDICATE CPCR IN PROGRESSR2 CALLR $ICHKP ;AND INITIATE CHECKPOINT OF REGION .ENDC ; DF C$$CPR .ENDUS WORD9 BIT #PS.CKP!PS.CHK,(R1) ;PARTITION NON CHECKPOINTABLE OR:! ;HAS CHECKPOINT IN PROGRESS?C# BNE 26$ ;IF NE YES, RETURN ERRORT$ BIT #PS.C .TITLE DRSRFS .IDENT /05.00/$;B7; COPYRIGHT (c) 1984 BY DIGITAL EQUIPMENT CORPORATION.L; ALL RIGHTS RESERVED.;F<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; ORIGINALLY PART OF DRMAP;A; MOVED TO THIS MODULE BY B. S. MCCARTHY 28-NOV-83 TO ALLOW DRMAPA; TO BE INCLUDED IN THE THIRD DIRECTIVE COMMON. SEE NOTE IN DRMAP$; REGARDING PLACEMENT OF DRSRF/DRRRF; .IF DF P$$LAS# .MCALL HDRDF$,PCBDF$,TCBDF$,WDBDF$ 1 HDRDF$ ;DEFINE HEADER AND WINDOW BLOCK OFFSETS 2 PCBDF$ ;DEFINE PCB AND ATTACHMENT DESCR OFFSETS TCBDF$ ;DEFINE TCB OFFSETSF1 WDBDF$ ;DEFINE WINDOW DEFINITION BLOCK OFFSETSE;+; **-$DRSRF-SEND BY REFERENCEF;CE; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CREATE A SPECIALLY FORMATTEDBD; PACKET INCLUDING A REFERENCE TO A SPECIFIED REGION WITH ADDITIONALE; OPTIONAL INFORMATION SUPPLIED BY THE ISSUING TASK. THE SENDER TASKFI; MUST ITSELF HAVE THE ACCESS SPECIFIED IN THE REFERENCE. THE REFERENCEDF+; REGION IS ATTACHED TO THE RECEIVING TASK.;B ; DPB FORMAT:C;N!; WD. 00 -- DIC(69.),DPB SIZE(5.) ,; WD. 01 -- FIRST HALF OF RECEIVER TASK NAME-; WD. 02 -- SECOND HALF OF RECEIVER TASK NAME-:; WD. 03 -- OPTIONAL EVENT FLAG TO SET WHEN RECEIVE OCCURS.; WD. 04 -- ADDRESS OF WINDOW DEFINITION BLOCK;I ; INPUTS:N;T,; R0=ADDRESS OF THE TCB OF THE RECEIVER TASK9; R1=ADDRESS OF THE TASK STATUS WORD OF THE RECEIVER TASKS9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.E*; R3=ADDRESS OF THE EFN NUMBER IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.D,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; 2; INPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:/; W.NRID=ID OF REGION TO BE SENT BY REFERENCE.T.; W.NOFF=OFFSET WORD PASSED WITHOUT CHECKING..; W.NLEN=LENGTH WORD PASSED WITHOUT CHECKING.=; W.NSTS=ALLOWED ACCESS (DEFAULTS TO ACCESS OF SENDER TASK).S-; WS.RED=1 IF READ ACCESS IS TO BE ALLOWED..; WS.WRT=1 IF WRITE ACCESS IS TO BE ALLOWED./; WS.EXT=1 IF EXTEND ACCESS IS TO BE ALLOWED. /; WS.DEL=1 IF DELETE ACCESS IS TO BE ALLOWED.A?; W.NSRB=OPTIONAL ADDRESS OF 8 WORD BUFFER OF ADDITIONAL INFO.I;S5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)E;N-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.R&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED..;; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF A SEND PACKET)4; OR ATTACHMENT DESCRIPTOR COULD NOT BE ALLOCATED.;; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF AN ATTEMPT IS ; MADE TO SEND TO AN ACP TASK.;; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE SPECIFIEDP; HAS HAD A PARITY ERROR.E:; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE DESIRED#; ACCESS TO THE REGION IS DENIED.D9; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF AN INVALIDF; REGION ID WAS SPECIFIED.=; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN INVALID EFND; NUMBER IS SPECIFIED.:; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE ADDRESS7; CHECK OF THE WINDOW DEF BLOCK OR S00‰èbÛbˆÝb`TADATADATADATADATADATAEND BUFFER FAILS.E; 3; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:I; NONE.; 0; THE FORMAT OF THE SEND BY REFERENCE PACKET IS:"; WD. 00 -- RECEIVE QUEUE THREAD.5; WD. 01 -- TCB ADDRESS IF EFN SPECIFIED / 0 IF NOT.D7; WD. 02 -- EFN MASK / FIRST WORD OF SENDER TASK NAME.I;; WD. 03 -- EFN ADDRESS / SECOND WORD OF SENDER TASK NAME.S7; WD. 04 -- REGION ID (ATTACHMENT DESCRIPTOR ADDRESS).E#; WD. 05 -- OFFSET IN REGION WORD.S ; WD. 06 -- LENGTH OF MAP WORD.; WD. 07 -- STATUS WORD.R2; WD. 08 THRU WD. 017 -- CONTENTS OF SEND BUFFER.;->$DRSRF::BIT #T3.ACP!T3.NSD,T.ST3(R0) ;SENDS LEGAL TO RECEIVER? BNE 3$ ;IF NE NO- MOV R0,-(SP) ;SAVE RECEIVER TASK TCB ADDRESS 3 CALL $CEFNG ;CONVERT EFN AND LOCK IF GROUP GLOBAL0$ BCS 4$ ;IF CS NO EFN WAS SPECIFIED6 INCB T.SRCT(R5) ;INCREMENT NUMBER OF INCOMPLETE SREFS& MOV R5,-(SP) ;SAVE SENDER TCB ADDRESS MOV R0,-(SP) ;SAVE EFN MASK MOV R1,-(SP) ;SAVE EFN ADDRESSO BR 5$ ; 03$: DRSTS D.RS2 ;ATTEMPT TO SEND TO AN ACP TASK)4$: CLR -(SP) ;INDICATE NO EFN SPECIFIEDS+ MOV T.NAM(R5),-(SP) ;SAVE SENDER TASK NAME3 MOV T.NAM+2(R5),-(SP) ;55$: MOV (R3),R3 ;PICK UP ADDRESS OF WINDOW DEF BLOCK ( MOV #8.*2,R1 ;SET SIZE TO ADDRESS CHECK5 CALL $ACHKP ;ADDRESS CHECK AND MAP WINDOW DEF BLOCK , ADD #W.NRID,R3 ;POINT TO REGION ID IN BLOCK9 CALL $SRATT ;SEARCH FOR SPECIFIED ATTACHMENT DESCRIPTORT6 CMP (R3)+,-(SP) ;BUMP POINTERS FOR REGION ID (W.NRID)+ MOV (R3)+,-(SP) ;SAVE OFFSET WORD (W.NOFF)S+ MOV (R3)+,-(SP) ;SAVE LENGTH WORD (W.NLEN)(+ MOV (R3)+,-(SP) ;SAVE STATUS WORD (W.NSTS)R% BIC #^C17,(SP) ;CLEAR ALL BUT ACCESST BNE 6$ ;IF NE ACCESS SPECIFIED7 MOVB A.STAT(R5),(SP) ;DEFAULT TO ACCESS OF SENDER TASKS=6$: MOVB A.STAT(R5),-(SP) ;PUSH ATTACHMENT DESCRIPTOR ADDRESSW' COMB (SP) ;COMPUTE ACCESS DENIED MASKT< BITB (SP)+,(SP) ;CHECK SPECIFIED ACCESS AGAINST SENDER TASK BNE 70$ ;IF NE ACCESS DENIED/ MOV -2(R3),-(SP) ;SAVE W.NSTS FOR WS.NAT CHECK(# MOV (R3),R3 ;POINT TO SEND BUFFERS BEQ 10$ ;IF EQ THERE IS NONE( MOV #8.*2,R1 ;SET SIZE TO ADDRESS CHECK0 CALL $ACHKP ;ADDRESS CHECK AND MAP SEND BUFFER* ADD #8.*2,R3 ;POINT TO END OF SEND BUFFER)10$: CALL $ALPKT ;ALLOCATE A SEND PACKET  .IF DF R$$DSP4 ADD #20.*2,R0 ;POINT PAST DESTINATION FOR TASK NAME9 MOV $TNAME+2,-(R0) ;STORE SECOND WORD OF MULTI-USER NAME)# MOV $TNAME,-(R0) ;STORE FIRST WORDE/ CMP -(R0),-(R0) ;POINT TO AREA FOR SEND BUFFER3 .IFFS6 ADD #16.*2,R0 ;POINT PAST DESTINATION FOR SEND BUFFER .ENDC% MOV #8.,R1 ;SET LOOP COUNT FOR COPYR MOV R1,R2 ;COPY LOOP COUNT/20$: MOV R3,-(R0) ;WAS A SEND BUFFER SPECIFIED? BEQ 30$ ;IF EQ NOT$ MOV -(R3),(R0) ;ELSE COPY NEXT WORD30$: DEC R2 ;DONE YET?  BGT 20$ ;IF GT NO- MOV (SP)+,R3 ;RESTORE POINTER TO SEND BUFFERS" MOV (SP),R4 ;PICK UP STATUS WORD140$: MOV (SP)+,-(R0) ;INSERT SAVED WORDS ON STACKS DEC R1 ;DONE YET?P BGT 40$ ;IF GT NOO: MOV A.PCB(R5),R2 ;PICK UP PCB ADDRESS FROM ATT DESCRIPTOR& BIT #PS.PER,P.STAT(R2) ;PARITY ERROR? BNE 90$ ;IF NE YES2 MOV (R0),R5 ;PICK UP SAVED RECEIVER TASK ADDRESS3 MOV $PTCPT,KISAR6 ;REMAP TCB IF IT WAS A PROTOTYPEB. BIT #WS.NAT,R3 ;SHOULD ATT DESCR BE CREATED ? BEQ 45$ ;YES IF EQ/ CMP #^R...,T.NAM(R5) ;SEND TO MULTIUSER TASK ?  BNE 41$ ;IF NE NOE; MOV T.RRFL(R5),R3 ;POINT TO FIRST SEND BY REFERENCE PACKET+,400$: BEQ 45$ ;END OF LIST, DIDN'T FIND ADB9 CMP $TNAME,44(R3) ;THIS SREF FOR RIGHT MULTI-USER COPY ?  BNE 410$ ;IF NE NO CMP $TNAME+2,46(R3) ;MAYBES BNE 410$ ;DEFINITELY NOT* MOV 10(R3),R1 ;POINT TO ADB FOR THIS SREF% CMP A.PCB(R1),R2 ;ADB FOR THIS PCB ?I1 BEQ 49$ ;IF EQ YES, WE DON'T NEED TO CREATE ONET-410$: MOV (R3),R3 ;POINT TO NEXT SREF PACKETY BR 400$ ;AND GO AROUND AGAIN641$: MOV T.ATT(R5),R1 ;GET FIRST ATTACHMENT DESCRIPTOR BEQ 45$ ;IF EQ END OF LIST542$: SUB #A.TCBL,R1 ;POINT TO START OF ATT DESCRIPTORD CMP A.PCB(R1),R2 ;MATCH?, BEQ 49$ ;YES IF EQ. MOV A.TCBL(R1),R1 ;GET NEXT ATT DESCR ADDRESS BNE 42$ ;IF NE GO AGAINS.45$: MOV R0,-(SP) ;SAVE ADDRESS OF SEND PACKET- CALL $CRATT 00‰ðbŠób“_c”_d–_k›’;ATTACH RECEIVER TASK TO REGIONB) MOV (SP)+,R0 ;RETRIEVE ADDRESS OF PACKETD# BCS 80$ ;IF CS ALLOCATION FAILURER) CMP #120000,R5 ;TARGET TCB IN SEC POOL ?$ BHI 49$ ;IF HI NON; BISB #AS.PRO,A.STAT(R1) ;INDICATE A.TCB POINTS TO SEC POOLQ2 MOV $PTCPT,A.TCB(R1) ;INSERT BIAS OF SEC POOL TCB+49$: MOV R1,10(R0) ;SET REGION ID IN PACKETR# MOV R0,R1 ;COPY POINTER TO PACKETV! TST (R0)+ ;POINT TO TCB ADDRESSA TST (R0)+ ;EFN SPECIFIED?G BEQ 50$ ;IF EQ NOP% MOV (R0)+,-(SP) ;GET EVENT FLAG MASKC* MOV (R0),R0 ;GET EVENT FLAG MASK ADDRESS. BIC #1,R0 ;CLR GRP GLOBAL 2ND WORD INDICATOR/ BIC (SP)+,(R0) ;CLEAR SPECIFIED EVENT FLAG NOWR750$: MOV R5,R0 ;POINT TO RECEIVE BY REFERENCE LISTHEADR ADD #T.RRFL,R0 ;A& CALL $QINSF ;INSERT IN RECEIVE QUEUE1 MOV #AS.RRA,R4 ; GET CODE FOR RECEIVE BY REF ASTR/ CALL $DASTT ;DECLARE RECEIVE BY REFERENCE ASTC+ CALLR $DRDSE ;DECLARE A SIGNIFICANT EVENT 160$: DRSTS D.RS2 ;ATTEMPT TO SEND TO AN ACP TASK$'70$: DRSTS D.RS16 ;PRIVILEGE VIOLATION )80$: CALL $DEPKT ;DEALLOCATE SEND PACKETA! DRSTS D.RS1 ;ALLOCATION FAILUREO)90$: CALL $DEPKT ;DEALLOCATE SEND PACKETE DRSTS D.RS6 ;PARITY ERROR .ENDC .ENDT TO RECEIVE BY REFERENCE LISTHEADR ADD #T.RRFL,R0 ;A& CALL $QINSF ;INSERT IN RECEIVE QUEUE1 MOV #AS.RRA,R4 ; GET CODE FOR RECEIVE BY REF ASTR/ CALL $DASTT ;DECLARE RECEIVE BY REFERENCE ASTC+ CALLR $DRDSE ;DECLARE A SIGNIFICANT EVENT 160$: DRSTS D.RS2 ;ATTEMPT TO SEND TO AN ACP TASK$'70$: DRSTS D.RS16 ;PRIVILEGE VIOLATION )80$: CALL $DEP .TITLE DRSUBL .IDENT /03.35/;;H7; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATIONN; ALL RIGHTS RESERVED.;O>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;T ; B. S. MCCARTHY ;)+ ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:L ;E ; M. S. FOX.; J. M. LAWLER; T. LEKASN; B. S. MCCARTHY;C-; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:N;E; J. R. KAUFFMAN; T. LEKAS.; J. M. LAWLER; T. M. MARTIN; B. S. MCCARTHY;7-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:H;S; S. C. ADAMS ; J. W. BERZLE; J. GEMIGNANI, JR.; J. R. KAUFFMAN; B. S. MCCARTHY; L. B. MCCULLEY; D. P. RABAHY;&; MODIFIED FOR RSX-11M-PLUS V4.0 BY:;R"; R. D. HANEY 14-NOV-85 03.25;.3; RDH010 -- SAVE R2 AROUND $DESEC CALL IN $DLCTXS;A; S. C. ADAMS 03.26;17; SA452 -- REMOVE CHECK FOR TERMINAL NAME IN $SNCMD.;E%; P. K. M. WEISS 12-DEC-86 03.27N; $; PKW120 -- ADD CPR STUB ROUTINES;1%; B. S. MCCARTHY 13-DEC-86 03.28C;M.; BM377 -- MOVE DREIF AND DRDSP INTO DIR11M;.!; K. L. NOEL 06-FEB-86 03.29;B3; KLN034 -- ADD $IMASG CALL FOR RUN TIME BINDINGR;M%; P. K. M. WEISS 10-FEB-87 03.304;80; PKW122 -- MAKE ENTRY POINTS NON-CONDITIONAL;C$; B. S. MCCARTHY 5-MAR-87 03.31;02; BM384 -- ADD STUB TO JUMP BACK TO DISPATCHER ; FOR CPR.;E$; B. S. MCCARTHY 5-MAR-87 03.32;/; BM385 -- NOW MOVE DRGIN, DREXP, DRGLI, AND,; DRGCL INTO THE VECTOR COMMON (A 32 BIT); VIRTUAL ADDRESS SPACE WOULD BE NICEM; RIGHT ABOUT NOW!)-;6 ; K. L. NOEL 6-APR-87 03.33;M7; KLN040 -- CHANGE $IMASG CALL TO A JMP FOR IMPLICIT1 ; ALUN 3;%; B. S. MCCARTHY 12-JUN-87 03.34N;I<; BM400 -- FIX MAPPING OF DISPATCHER WHEN $DRGMX DOES ITS ; RETURN;T#; J. W. BERZLE 1-SEP-87 03.35 ;4; JWB220 -- ADD CHECK FOR PSEUDO DEVICE IN $SNCMD;5K;OLM .IF DF S$$HDWNO .MCALL SHDDF$,PKTDF$T,P SHDDF$ ;DEFINE SHADOW RECORDING OFFSETSQR .ENDC ;S$$HDWSTUV .IF DF P$$LASW%X .MCALL HDRDF$,PCBDF$,TCBDF$,WDBDF$3Y HDRDF$ ;DEFINE HEADER AND WINDOW BLOCK OFFSETSI4Z PCBDF$ ;DEFINE PCB AND ATTACHMENT DESCR OFFSETS[ TCBDF$ ;DEFINE TCB OFFSETSI\ WDBDF$ ;DEFINE WDB OFFSETSM]^^ ;PKW120TN^; THE FOLLOWING TABLE OF VALUES MUST BE ID00ŠøbÛbˆÝb`TADATADATADATADATADATAENTICAL TO THE ONE AT THE ;PKW120,^; BEGINNING OF THE KX DRIVER. ;PKW120^ ;PKW120 6^ .IF DF C$$RMT ;IF REMOTE SYSTEM SERVICES ;PKW120^ ;PKW120;^ .ASECT ;PKW120D^ ;PKW120L^ .=120000 ;PKW120^ ;PKW120N6^CPRCON: .BLKW 1 ;UNIT CONNECT ENTRY POINT ;PKW120C^CPRALO: .BLKW 1 ;ALLOCATE BUFFER SPACE AND COMMAND RING ;PKW1205^CPRDEA: .BLKW 1 ;DEALLOCATE BUFFER SPACE ;PKW120W1^CPRSEN: .BLKW 1 ;SEND PACKET TO VMS ;PKW120N^ ;PKW120H^ .PSECT ;PKW120F^ ;PKW120;^ .ENDC ;C$$RMT ;PKW120.^ ;PKW120O_ .PAGE`;+'a; **-$DRDSE-DECLARE SIGNIFICANT EVENTSb; Gc; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DECLARE A SIGNIFICANT EVENT. d;Pe; DPB FORMAT: f; $g; WD. 00 -- DIC(35.),DPB SIZE(1.).h;P i; INPUTS: j;O;k; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. -l; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.N1m; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. .n; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.o; 7p; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)Pq;O&r; C=0 WITH A DIRECTIVE STATUS OF +1.s;F4t; NOTE: THIS DIRECTIVE IS ALSO CALLED A SUBROUTINEu;-vwxy .IF NDF M$$PRO z;{$DRDSE::MOV $ACTHD,@$RQSCH ;SET DISPATCH TO FRONT OF LIST.|} .IFF ~$DRDSE::MOV R0,-(SP) ;SAVE R0 ,€ MOV #$RQTAB,R0 ;POINT TO RESCHEDULE TABLE6�15$: MOV $ACTHD,(R0)+ ;SET DISPATCH TO FRONT OF LIST.‚ CMP R0,#$RQTAB+ ;AT END OF TABLE?ƒ BLO 15$ ;IF LO NOC„…;SD†; WE HAVE JUST CHANGED THE RESCHEDULE POINTERS FOR ALL PROCESSORS.$‡; WE SHOULD INTERRUPT ALL OF THEM.ˆ;‰%Š MOV $URMST,R0 ;GET ONLINE BUS RUNSE%‹ BIC $CPMSK,R0 ;ONLY PROCESSORS NOWFŒ BIC $CPBIT,R0 ;NOT US EITHERA&� BEQ 25$ ;IF EQ NOBODY TO INTERRUPT Ž MTPS #PR7 ;INHIBIT DEADLOCKS� LOCK$ $FORKL,SPIN&� BIS R0,$IIPND ;SHOW WORK IS WAITING‘ ULOCK$ $FORKL,SPINH ’ MTPS #0“25$: MOV (SP)+,R0 ;RESTORE R0P”• .ENDC–—8˜ CLR $SIGFL ;CLEAR TASK WAITING FOR SIGNIFICANT EVENT+™ RETURN ;RETURN DIRECTIVE STATUS OF +1Fš›;+'œ; **-$DFWFS-WAITFOR SINGLE EVENT FLAGT�;Gž; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SUSPEND THE EXECUTION OF THEP5Ÿ; ISSUING TASK UNTIL A SPECIFIED EVENT FLAG IS SET.Q ; ¡; DPB FORMAT:I¢;U$£; WD. 00 -- DIC(41.),DPB SIZE(2.).3¤; WD. 01 -- EVENT FLAG NUMBER OF FLAG TO WAITFOR.W¥;G ¦; INPUTS:F§;S¨; R0=EVENT FLAG MASK WORD.©; R1=EVENT FLAG MASK ADDRESS.C;ª; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.E-«; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.+1¬; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.A.­; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.®;S7¯; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)E°;D&±; C=0 WITH A DIRECTIVE STATUS OF +1.²;-³6´$DRWFS::BIC #1,R1 ;CLR GRP GLOBAL 2ND WORD INDCATOR:µ$DRWS1::BIS #T2.WFR,T.ST2(R5) ;PUT TASK IN WAITFOR STATE+¶ ;(DO NOT USE R2 BECAUSE OF QIOW CALL)T&· MOV R0,T.EFLM(R5) ;SET WAITFOR MASK0¸ MOV R1,T.EFLM+2(R5) ;SET WAITFOR MASK ADDRESS(¹ CALLR $SETRT ;SET A SCHEDULE REQUESTº»¼;+&½; **-$DRCSR-CANCEL SCHEDULE REQUESTS¾;AM¿; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CANCEL ALL SCHEDULE REQUESTS FOR ADÀ; SPECIFIED TASK.EÁ;DÂ; DPB FORMAT:DÃ;I$Ä; WD. 00 -- DIC(25.),DPB SIZE(3.).&Å; WD. 01 -- FIRST HALF OF TASK NAME.'Æ; WD. 02 -- SECOND HALF OF TASK NAME.TÇ; È; INPUTS:AÉ;:Ê; R0=ADDRESS OF THE TCB TO CANCEL SCHEDULE REQUESTS FOR.LË; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO CANCEL SCHEDULE REQUES;Ì; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.R-Í; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.R1Î; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.R.Ï; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.Ð;O7Ñ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)DÒ;-&Ó; C=0 WITH A DIRECTIVE STATUS OF +1.Ô;-ÕÖ(×$DRCS1:: ;REF LABEL FOR ERROR LOGGERØ%Ù$DRCSR::MOV R0,R5 ;SET TCB ADDRESSE*Ú CLR R4 ;SET 00Šcób“_c”_d–_k›’INITIAL ENTRY TYPE MINUS 23Û CALL (PC) ;REMOVE PERIODIC/SINGLE SHOT REQUESTS )Ü TST (R4)+ ;ADVANCE TO NEXT ENTRY TYPEU.Ý CALLR $CLRMV ;REMOVE ALL REMAINING ENTRIESÞß;+!à; **-$DRGMX-GET MAPPING CONTEXT á;UHâ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO RETURN THE MAPPING CONTEXT OF?ã; THE TASK, I.E. TO FILL IN UP TO N WINDOW DEFINITION BLOCKS, Dä; WHERE N IS THE TOTAL NUMBER OF WINDOW BLOCKS IN THE TASK HEADER.7å; NO INFORMATION IS RETURNED ON UNUSED WINDOW BLOCKS.Sæ;ç; DPB FORMAT:Tè;N$é; WD. 00 -- DIC(113.),DPB SIZE(2.)7ê; WD. 01 -- ADDRESS OF THE N WINDOW DEFINITION BLOCKSTë;T ì; INPUTS:í;L;î; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.R.ï; (R3)=ADDRESS OF N WINDOW DEFINITION BLOCKS1ð; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.X.ñ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.ò;F5ó; INPUT FIELDS IN THE WINDOW DEFINITION BLOCKS ARE:N ô; NONE.õ; 7ö; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)N÷;L/ø; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.-(ù; DIRECTIVE STATUS OF +1 IS RETURNED.!ú; C=1 IF DIRECTIVE IS REJECTED.O<û; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE ADDRESS7ü; CHECK OF THE N WINDOW BLOCKS PLUS TERMINATOR WORDD ý; FAILS.þ;S6ÿ; OUTPUT FIELDS IN EACH WINDOW DEFINITION BLOCK ARE:@; W.NID=ADDRESS WINDOW ID OF NEXT ESTABLISHED ADDRESS WINDOW.#; W.NAPR=BASE APR OF THE WINDOW.E/; W.NBAS=VIRTUAL BASE ADDRESS OF THE WINDOW.T'; W.NSIZ=SIZE OF THE ADDRESS WINDOW.=.; W.NRID=REGION ID IF MAPPED OR UNMODIFIED.5; W.NOFF=OFFSET IN REGION IF MAPPED OR UNMODIFIED.I2; W.NLEN=LENGTH OF MAP IF MAPPED OR UNMODIFIED.-; W.NSTS=NECESSARY BITS TO RESTORE WINDOW.N2; WS.SIS=1 IF WINDOW IS IN SUPERVISOR I SPACE.# ; WS.MAP=1 IF WINDOW IS MAPPED.W5 ; WS.WRT=1 IF WINDOW IS MAPPED WITH WRITE ACCESS.  ;E> ; NOTE: ON SYSTEMS SUPPORTING NON RESIDENT TASK HEADERS, THE6 ; DIRECTIVE DISPATCHER MAPS THE NON RESIDENT HEADER7; THROUGH APR6. ON THESE SYSTEMS WE WILL USE APR5 TOI7; MAP TO THE USER TASK (N WINDOW DEFINITION BLOCKS).I:; THEREFORE, THIS DIRECTIVE CAN NOT GO INTO A DIRECTIVE*; PARTITION WITHOUT SOME MODIFICATIONS.;E7; WHEN MAPPING TO A TASK REGION, W.BOFF IS OFFSET BY :; THE SIZE OF THE EXTERNAL TASK HEADER. WE WILL ADJUST;; THAT VALUE HERE SO THAT THE TASK DOES NOT KNOW WHETHERN&; OR NOT IT HAS AN EXTERNAL HEADER.;-F$DRGMX::MOV H.WND(R4),R4 ;POINT TO NUMBER OF WINDOW BLOCKS IN HEADER0 MOV (R4)+,R1 ;PICK UP NUMBER OF WINDOW BLOCKS- MOV R1,-(SP) ;SAVE NUMBER OF WINDOW BLOCKS)- ASL R1 ;CONVERT TO BYTES TO ADDRESS CHECKN  ASL R1 ;  ASL R1 ;) INC R1 ;(INCLUDE WORD FOR TERMINATOR)W  ASL R1 ;9! MOV (R3),R3 ;PICK UP VIRTUAL ADDRESS OF WINDOW BLOCKSE"# .IF DF X$$HDR$&% MOV R3,R0 ;GET VA TO ADDRESS CHECK& CALL $ACHCK ;ADDRESS CHECK)' BCS 50$ ;IF CS, ADDRESS CHECK FAILURE+( CALL $RELOC ;RELOCATE TO KERNEL ADDRESSN!) MOV R1,KISAR5 ;MAP USER BUFFER)* MOV R2,R3 ;GET KERNEL VIRTUAL ADDRESSC-+ SUB #20000,R3 ;AND MAKE IT AN APR5 ADDRESSK,- .IFF ; DF X$$HDRO.7/ CALL $ACHKP ;ADDRESS CHECK AND MAP TO WINDOW BLOCKSR01 .ENDC ; DF X$$HDR23+4 CLR -(SP) ;INITIALIZE WINDOW ID COUNTERU;510$: TST W.BSIZ(R4) ;IS NEXT BLOCK AN ESTABLISHED WINDOW?V6 BNE 11$ ;IF NE YES-7 ADD #W.BLGH,R4 ;POINT TO NEXT WINDOW BLOCKS.8 BR 40$ ;BRANCH TO DETERMINE IF MORE BLOCKS-911$: MOVB (SP),(R3)+ ;SET WINDOW ID (W.NID)I-: MOV (R4)+,-(SP) ;SAVE PCB ADDRESS (W.BPCB)E5; MOV (R4)+,R1 ;PICK UP LOW VIRTUAL ADDRESS (W.BLVR)R9< MOVB -1(R4),(R3) ;GET ITS HIGH BYTE (W.BLVR+1)(W.NAPR)A0= ASLB (R3) ;SHIFT TO FORM APR NUMBER (W.NAPR)> ROLB (R3) ;? ROLB (R3) ;)@ ROLB (R3)+ ;2A MOV R1,(R3)+ ;SET VIRTUAL BASE ADDRESS (W.NBAS)6B MOV (R4)+,R2 ;PICK UP HIGH VIRTUAL ADDRESS (W.BHVR)5C MOV (R4)+,R0 ;PICK ATT DESCRIPTOR ADDRESS (W.BATT)R4D MOV (R4)+,(R3)+ ;SET WINDOW SIZE (W.BSIZ)(W.NSIZ)EF .IF DF X$$HDRG0H MOV (SP)+,R2 ;GET PCB ADDRESS FOR THIS WINDOWI00ŠcÛbˆÝb`TADATADATADATADATADATAJ .IFF ; DF X$$HDRLK%L TST (SP)+ ;IS THIS WINDOW MAPPED?)MN .ENDC ;DF X$$HDR(OP BEQ 20$ ;IF EQ NO 'Q MOV R0,(R3)+ ;SET REGION ID (W.NRID)CR MOV T.ATT(R5),-(SP) ;PUSH ADDRESS OF FIRST ATTACHMENT DESCRIPTOR (S SUB #A.TCBL,(SP) ;POINT TO FIRST WORDT CMP R0,(SP)+ ;TASK REGION? U BNE 15$ ;IF NE NOV9V CLR -2(R3) ;SET IT TO DEFAULT TO TASK REGION (W.NRID)4WX .IF DF X$$HDRY2Z15$: MOV (R4)+,(R3) ;SET OFFSET W.BOFF TO W.NOFF8[ MOVB P.HDLN(R2),R2 ;GET SIZE OF XTRNL HEADER (IF ANY)/\ SUB R2,(R3)+ ;ADJUST OFFSET BY HEADER LENGTHD5] MOV W.BHVR-W.BFPD(R4),R2 ;RESTORE HIGH VA (W.BHVR) ^_ .IFF ; DF X$$HDR`3a15$: MOV (R4)+,(R3)+ ;SET OFFSET (W.BOFF)(W.NOFF) bc .ENDC ; DF X$$HDRde SUB R1,R2 ;CALCULATE LENGTHSf ADD #1,R2 ;,!g ROL R2 ;CONVERT TO 32W BLOCKSI h ROL R2 ; i ROLB R2 ; j SWAB R2 ;O(k MOV R2,(R3)+ ;SET THE LENGTH (W.NLEN)1l TST (R4)+ ;ADVANCE TO LAST PDR IMAGE (W.BFPD) :m MOV (R4)+,(R3) ;PICK UP LAST PDR IMAGE (W.BLPD)(W.NSTS)9n BIC #^C4,(R3) ;CLEAR ALL BUT WRITE ACCESS BIT (W.NSTS)M'o ASR (R3) ;SHIFT INTO PLACE (W.NSTS)(pqr .IF DF U$$DASs4t BITB #20,W.BFPD-W.BLGH(R4) ;USER D SPACE WINDOW ?u BEQ 18$ ;IF EQ NO;2v BIS #WS.UDS,(R3) ;SET USER D SPACE BIT (W.NSTS)w BR 19$ ;SKIP SUPER I CHECKx18$: ;REFERENCE LABELyz .ENDC ; DF U$$DAS{|} .IF DF S$$LIB~5 TSTB W.BFPD-W.BLGH(R4) ;SUPERVISOR I SPACE WINDOW?P€ BMI 19$ ;IF MI NOM8� BIS #WS.SIS,(R3) ;SET SUPERVISOR I SPACE BIT (W.NSTS)‚ƒ .ENDC„…<†19$: BIS #WS.MAP,(R3)+ ;INDICATE WINDOW IS MAPPED (W.NSTS) ‡ BR 30$ ;;ˆ20$: ADD #W.NSTS-W.NRID,R3 ;POINT TO NEXT WINDOW ID BLOCK 4‰ ADD #W.BLGH-W.BOFF,R4 ;POINT TO NEXT WINDOW BLOCK Š CLR (R3)+ ;CLEAR STATUS WORDA‹30$: TST (R3)+ ;SKIP OVER SEND/RECEIVE BUFFER ADDRESS (W.NSRB)B Œ40$: INC (SP) ;BUMP WINDOW ID� CMP (SP),2(SP) ;DONE YET?Ž BLO 10$ ;IF LO NOS=� MOV (SP)+,(R3) ;STORE NUMBER OF HEADER SLOTS AS TERMINATORS� NEG (R3) ;AND NEGATE‘ TST (SP)+ ;CLEAN STACK‘ ; BM400B ‘ .IF NDF K$$DAS ; BM400‘ ; BM400;‘ MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACE ; BM400W‘ ; BM400.#‘ .ENDC ; NDF K$$DAS ; BM400B‘ ; BM400C ’ RETURN ;D’ ; BM400S” .IF DF X$$HDR ;**-1D•!–50$: DRSTS D.RS98 ;BAD ADDRESSW—˜ .ENDC ; DF X$$HDR™"™ .ENDC ; DF P$$LAS ;JWB213› ;**-1Oœ;+�; **-$DRQRQ-QUEUE I/O REQUESTSž;NBŸ; THIS ROUTINE IS CALLED TO OPTIONALLY INSERT AN I/O PACKET INTO9 ; A CONTROLLER QUEUE AND TO CALL THE DRIVER TO INITIATE¡; ACTIVITY ON THE DEVICE.I¢;HB£; IF THE DEVICE SUPPORTS SEEK OPTIMIZATION AND THE PACKET IS FOR;¤; A LOGICAL TRANSFER FUNCTION, THE LBN FOR THE REQUEST IS B¥; BLOCK CHECKED AND CONVERTED TO THE SECTOR/TRACK/CYLINDER FORM.;¦; THE BLOCK CHECK ROUTINE IS IN THE CORRESPONDING DRIVER.D§;L ¨; INPUTS:2©;!ª; R1=ADDRESS OF THE I/O PACKET.R)«; R5=ADDRESS OF THE UNIT CONTROL BLOCK.E¬;A ­; OUTPUTS:®;I7¯; IF NO I/O PACKET IS SPECIFIED AS INPUT (R1 = 0) THEA7°; DRIVER IS SIMPLY CALLED TO INITIATE ACTIVITY ON THE1±; DEVICE. THIS OPTION ALLOWS US TO RE-INITIATEA0²; ACTIVITY ON A DEVICE WHEN IT HAS SATISFIED A³; STALLED I/O STATE.´;I8µ; IF AN I/O PACKET IS SPECIFIED AS INPUT, IT IS PLACED5¶; IN THE CONTROLLER QUEUE AND ACTIVITY IS INITIATEDR·; ON THE DEVICE.¸;*¹; NOTE: R4 IS DESTROYED BY THIS ROUTINE.º;-»¼$DRQRQ:: ;REFERENCE LABELN½8¾ MOV U.SCB(R5),R4 ;GET ADDRESS OF STATUS CONTROL BLOCK¿'À MOV (R5),R2 ;GET ADDRESS OF THE DCBR1Á MOV KINAR5,-(SP) ;SAVE KERNEL INSTRUCTION APR5 ÂÃÄ .IF DF K$$DASÅ*Æ MOV KDSAR5,-(SP) ;SAVE KERNEL DATA APR5ÇÈ .IFTF ;K$$DASÉ+Ê MOV D.PCB(R2),R3 ;GET DRIVER PCB ADDRESSK)Ë BEQ 20$ ;IF EQ DRIVER IS PART OF EXEC >Ì MOV P.REL(R3),KINAR5 ;MAP KERNEL INSTRUCTION APR5 TO DRIVERÍÎ .IFT ;K$$DASEÏ7Ð MOV P.REL(R3),KDSAR5 ;MAP KERNEL DATA APR5 TO DRIVEREÑÒ .IFTF ;K$$DASÓ%Ô20$:00Šcób“_c”_d–_k›’ TST R1 ;I/O PACKET TO QUEUE ?N+Õ BEQ 40$ ;IF EQ, NO - SIMPLY CALL DRIVEROÖ× .IF DF S$$HDWØÙ; %Ú; COPY THE I/O PACKET FOR SHADOWINGÛ;F%Ü MOV R4,-(SP) ;SAVE THE SCB ADDRESSV5Ý MOV R1,R3 ;COPY THE I/O PACKET ADDRESS FOR $SHFNDP&Þ CALL $SHFND ;THIS DEVICE SHADOWED?!ß BCS 35$ ;IF CS NO, DON'T COPYE1à CMP ML.PRI(R4),R1 ;IS THIS THE PRIMARY PACKET? !á BNE 35$ ;IF NE NO, DON'T COPYE:â MOV #I.LGTH/2,R0 ;GET THE NUMBER OF WORDS IN THE PACKET8ã32$: MOV (R1)+,(R2)+ ;COPY THE NEXT WORD IN THE PACKET'ä SOB R0,32$ ;LOOP FOR REST OF PACKETL5å SUB #I.LGTH,R1 ;GET THE PRIMARY I/O PACKET ADDRESSY(æ MOV U.UMB(R5),R0 ;GET THE UMB POINTER@ç MOV M.UCBS+2(R0),I.UCB-I.LGTH(R2) ;COPY THE UCB POINTER INTOè ;THE SECONDARY PACKETL$é35$: MOV (SP)+,R4 ;RESTORE THE SCB'ê MOV (R5),R2 ;GET ADDRESS OF THE DCB.ëì .ENDC ;S$$HDWí,î .IF DF D$$CHE ;DISK DATA CACHING SUPPORTï-ð .IF DF K$$DAS ;KERNEL I/D SPACE EXECUTIVE ñ7ò CMP 2(SP),$DRCHE ;REQUEST FROM CACHE? (CHECK KINAR5) óô .IFF ;K$$DAS;õ6ö CMP (SP),$DRCHE ;REQUEST FROM CACHE? (CHECK KISAR5)÷ø .IFTF ;K$$DASù4ú BEQ 350$ ;YES IF EQ; CACHE ALWAYS BYPASSES CACHE1û BIT #DV.MSD,U.CW1(R5) ;POSSIBLY A DISK DEVICE? +ü BEQ 350$ ;NO IF EQ; DON'T BOTHER CACHERR>ý BIT #DV.SQD,U.CW1(R5) ;IS THIS POSSIBLE DISK REALLY A TAPE?1þ BNE 350$ ;YES IF NE; DON'T CACHE THESE EITHERA:ÿ MOV $DRCHE,R0 ;GET BIAS OF CACHER [DIRECTIVE] PARTITION4 BEQ 350$ ;IF EQ NOT PRESENT IN RUNNING EXECUTIVE5 MOV R0,KINAR5 ;ELSE LOAD [I-SPACE] MAPPING IN APR5(2 CALL @#120000 ;HOPE THIS CACHE CALL IS WORTH IT ; NOTE:DG; AN INLINE RETURN FROM THE CACHER FORWARDS THE REQUEST TO THE DRIVERM>; THEREFORE, THE DRIVER MUST BE REMAPPED PRIOR TO CONTINUING- MOV D.PCB(R2),R3 ;GET DRIVER'S PCB ADDRESST2  BEQ 350$ ;IF EQ DRIVER IS RESIDENT OR UNLOADED4  MOV P.REL(R3),KINAR5 ;MAP KERNEL INSTRUCTION APR5   .IFT ;K$$DAST 2 MOV KINAR5,KDSAR5 ;MAP KERNEL DATA APR5 AS WELL .ENDC ;K$$DAS350$:L .ENDC ;D$$CHE7 BIT #S2.OPT,S.ST2(R4) ;SEEK OPTIMIZATION SUPPORTED? BEQ 30$ ;IF EQ NOL9 MOV D.DSP(R2),R2 ;GET ADDRESS OF DRIVER DISPATCH TABLEE8 CALL @D.VCHK(R2) ;CALL DRIVER FOR BLOCK CHECK AND CVT930$: BITB #UC.QUE,U.CTL(R5) ;QUEUE PACKET BEFORE CALL?T BNE 40$ ;IF NE NOR0 MOV R4,R0 ;SET ADDRESS OF I/O QUEUE LISTHEAD1 CALL $QINSP ;QUEUE I/O PACKET IN DEVICE QUEUE$840$: MOV (R5),R2 ;GET ADDRESS OF DEVICE CONTROL BLOCK;+ ; ** W A R N I N G **!;$"; SPM HOOKPOINT NUMBER 16.#;B+$; DO NOT CHANGE THE INSTRUCTION FOLLOWINGO%; LABEL WITHOUT CHECKING SPM&;-'-($SPH16==. ;SPM CHANGES THE INSTRUCTION ATE!) ;THE LOCATION OF THIS LABELF*9+ MOV D.DSP(R2),R2 ;GET ADDRESS OF DRIVER DISPATCH TABLEA,*- CALL @D.VINI(R2) ;CALL DRIVER INITIATOR0.$QOPDN:: ;$BLKC2 RETURNS HERE AFTER AN ERROR/0 .IFTQ1-2 MOV (SP)+,KDSAR5 ;RESTORE KERNEL DATA APR5234 .ENDC5647 MOV (SP)+,KINAR5 ;RESTORE KERNEL INSTRUCTION APR5 8 RETURN ;O9:B;$DRWFA::MOV #$DRWFS,-(SP) ;POINT TO WAIT FOR SINGLE FLAG ROUTINE<=;+->;**-$MPDC1-MAP TO AND CALL DIRECTIVE COMMONG?;EH@; THIS ROUTINE IS CALLED TO TRANSFER CONTROL TO A ROUTINE IN THE FIRSTHA; DIRECTIVE COMMON, THEN RESTORE THE CURRENT MAPPING AND RETURN TO THE B; CALLER.TC; D; INPUTS:BE;R$F; (SP) = RETURN ADDRES AFTER CALL#G; 2(SP) = ROUTINE ADDRESS TO CALLKH; I; OUTPUTS:J;. K; NONE.L;M1M; REGISTERS AND C-BIT ARE PRESERVED ACROSS CALLN;RO;- P .ENABL LSBWQ R$MPDC3::ST .IF DF D$$PARUV .IF DF K$$DASW1X MOV KDSAR5,-(SP) ;SAVE CURRENT D SPACE MAPPINGOY $$$=4Z[ .IFF ; DF K$$DASD\] $$$=2^_ .IFTF ; DF K$$DAS`-a MOV $$$(SP),-(SP) ;COPY ADDRESS OF ROUTINEE;b MOV $$$(SP),$$$+2(SP) ;PUT RETURN ADDRESS IN RIGHT PLACEB0c MOV KINAR5,$$$(SP) ;SAVE CURRENT APR5 MAPPINGde.f MOV $DRAP3,KINAR5 ;MAP 2ND DIRECTIVE COMMONgh .IFT ; DF K$$DAS i2j MOV $DRAP3,00ŠcÛbˆÝb`TADATADATADATADATADATAKDSAR5 ;MAP IT IN DATA SPACE AS WELLkl .ENDC ; DF K$$DASm2n BR 10$ ;FINISH IN COMMON WITH MAP FIRST COMMONop .IFTF ; DF D$$PARq r$MPDC4::st .IFT ; DF D$$PARuv .IF DF K$$DASw1x MOV KDSAR5,-(SP) ;SAVE CURRENT D SPACE MAPPINGSy $$$=4z{ .IFF ; DF K$$DAS|} $$$=2~ .IFTF ; DF K$$DAS€-� MOV $$$(SP),-(SP) ;COPY ADDRESS OF ROUTINEU;‚ MOV $$$(SP),$$$+2(SP) ;PUT RETURN ADDRESS IN RIGHT PLACEE0ƒ MOV KINAR5,$$$(SP) ;SAVE CURRENT APR5 MAPPING„….† MOV $DRAP4,KINAR5 ;MAP 2ND DIRECTIVE COMMON‡ˆ .IFT ; DF K$$DAS ‰2Š MOV $DRAP4,KDSAR5 ;MAP IT IN DATA SPACE AS WELL‹Œ .ENDC ; DF K$$DAS�2Ž BR 10$ ;FINISH IN COMMON WITH MAP FIRST COMMON�� .IFTF ; DF D$$PAR‘ ’$MPDC2::“” .IFT ; DF D$$PAR•– .IF DF K$$DAS—1˜ MOV KDSAR5,-(SP) ;SAVE CURRENT D SPACE MAPPINGS™ $$$=4š› .IFF ; DF K$$DASœ� $$$=2žŸ .ENDC ; DF K$$DAS -¡ MOV $$$(SP),-(SP) ;COPY ADDRESS OF ROUTINEU;¢ MOV $$$(SP),$$$+2(SP) ;PUT RETURN ADDRESS IN RIGHT PLACEE0£ MOV KINAR5,$$$(SP) ;SAVE CURRENT APR5 MAPPING¤¥.¦ MOV $DRAP2,KINAR5 ;MAP 2ND DIRECTIVE COMMON2§ BR 10$ ;FINISH IN COMMON WITH MAP FIRST COMMON¨"¨ .IFTF ; DF D$$PAR ; BM385¨ ; BM385¨$MPDCV:: ; BM385¨ ; BM385!¨ .IFT ; DF D$$PAR ; BM385 ¨ ; BM385$¨ .IF DF K$$DAS ; BM385¨ ; BM385N;¨ MOV KDSAR5,-(SP) ;SAVE CURRENT D SPACE MAPPING ; BM385T¨ $$$=4 ; BM385¨ ; BM385E!¨ .IFF ; DF K$$DAS ; BM385$¨ ; BM385P¨ $$$=2 ; BM385¨ ; BM385N"¨ .ENDC ; DF K$$DAS ; BM385¨ ; BM385 7¨ MOV $$$(SP),-(SP) ;COPY ADDRESS OF ROUTINE ; BM385 D¨ MOV $$$(SP),$$$+2(SP) ;PUT RETURN ADDRESS IN RIGHT PLACE ; BM385:¨ MOV KINAR5,$$$(SP) ;SAVE CURRENT APR5 MAPPING ; BM385¨ ; BM385 ¨ ; BM385 8¨ MOV $DRAPV,KINAR5 ;MAP 2ND DIRECTIVE COMMON ; BM385;¨ BR 10$ ;FINISH IN COMMON WITH MAP FIRST COMMON ; BM385¨ ; BM385 © .IFTF ; DF D$$PARª «$MPDC1::¬­ .IFT ; DF D$$PAR ®¯° .IF DF K$$DAS±7² MOV KDSAR5,-(SP) ;SAVE CURRENT D SPACE APR 5 MAPPINGS³´ .ENDC ; DF K$$DASµ-¶ MOV $$$(SP),-(SP) ;COPY ADDRESS OF ROUTINEE;· MOV $$$(SP),$$$+2(SP) ;PUT RETURN ADDRESS IN RIGHT PLACES0¸ MOV KINAR5,$$$(SP) ;SAVE CURRENT APR5 MAPPING-¹ MOV $DRAPR,KINAR5 ;MAP TO DIRECTIVE COMMONA)º10$: CALL @(SP)+ ;CALL DESIRED ROUTINEB»¼½ .IF DF K$$DAS¾;¿ MOV (SP)+,KDSAR5 ;RESTORE PREVIOUS D SPACE APR 5 MAPPINGDÀÁ .ENDC ; DF K$$DASÂÃ-Ä MOV (SP)+,KINAR5 ;RESTORE PREVIOUS MAPPING Å RETURN ;(ÆÇ .IFF ; DF D$$PAR È,É CALLR @(SP)+ ;DIRECT TRANSFER TO ROUTINEÊË .ENDC ; DF D$$PARÌ Í .DSABL LSBÎÏÏ;+ ;PKW120U1Ï; **-$CPXXX- STUB ROUTINES FOR CPR ;PKW120SÏ;- ;PKW120GEÏ; THIS MODULE PROVIDES GLOBAL ENTRY POINTS TO MAP AND CALL ;PKW120C8Ï; ROUTINES IN THE KXJ COMMUNICATION DRIVER. ;PKW120Ï; ;PKW120Ï ;PKW120 Ï .ENABL LSB ;PKW120Ï ;PKW120VÏ$CPCON:: ;PKW1206Ï .IF DF C$$RMT ;IF REMOTE SYSTEM SERVICES ;PKW120Ï ;PKW120;5Ï MOV #CPRCON,R3 ;SAVE OUR CALLING ADDRESS ;PKW120'Ï BR 10$ ;JOIN COMMON CODE ;PKW120PÏ ;PKW120-Ï .IFTF ;C$$RMT ;PKW1202Ï$CPALO:: ;PKW120Ï .IFT ;C$$RMT ;PKW120Ï ;PKW120N5Ï MOV #CPRALO,R3 ;SAVE OUR CALLING ADDRESS ;PKW120 'Ï BR 10$ ;JOIN COMMON CODE ;PKW120Ï ;PKW120Ï .IFTF ;C$$RMT ;PKW120 Ï$CPDEA:: ;PKW120Ï .IFT ;C$$RMT ;PKW120Ï ;PKW120 5Ï MOV #CPRDEA,R3 ;SAVE OUR CALLING ADDRESS ;PKW120N'Ï BR 10$ ;JOIN COMMON CODE ;PKW120Ï ;PKW120OÏ .IFTF ;C$$RMT ;PKW120PÏ$CPSEN:: ;PKW120Ï .IFT ;C$$RMT ;PKW120Ï ;PKW120C5Ï MOV #CPRSEN,R3 ;SAVE OUR CALLING ADDRESS ;PKW120OÏ10$: ;PKW120R:Ï MOV @#KINAR5,-(SP) ;SAV00Š cób“_c”_d–_k›’E APR5 I SPACE MAPPING ;PKW120:Ï MOV @#KISAR5,-(SP) ;SAVE APR5 D SPACE MAPPING ;PKW1202Ï MOV $KXBAS,@#KISAR5 ;MAP THE DRIVER ;PKW1202Ï MOV $KXBAS,@#KINAR5 ;MAP THE DRIVER ;PKW120+Ï CALL @(R3) ;CALL THE ROUTINE ;PKW120C=Ï MOV (SP)+,@#KISAR5 ;RESTORE APR5 D SPACE MAPPING ;PKW120T=Ï MOV (SP)+,@#KINAR5 ;RESTORE APR5 I SPACE MAPPING ;PKW120 Ï ;PKW120 Ï .ENDC ;C$$RMT ;PKW120VÏ ;PKW120 Ï RETURN ;PKW120 Ï ;PKW120NÏ .DSABL LSB ;PKW120Ï ;PKW120M2Ï;$IMASG - IMPLICIT ASSIGN LUN CALL ; KLN034Ï; ; KLN034AYÏ; THIS ROUTINE IS USED BY QIO, GLUN, GDVI ETC. TO JUMP TO ALUN FROM THE OTHER ; KLN034 7Ï; DIRECTIVE COMMONS FOR RUN TIME BINDING ; KLN034RÏ; ; KLN034 Ï$IMASG:: ; KLN034PÏ ; KLN0346Ï .IF DF C$$RTB ;RUN TIME BINDING SUPPORT ; KLN034Ï ; KLN0345Ï MOV $DRAPR,KINAR5 ;MAP TO FIRST COMMON ; KLN03426Ï MOV $DRAPR,KDSAR5 ;MAP IN D-SPACE ALSO ; KLN034Ï ; KLN0342Ï JMP $IMAS1 ;JUMP TO ROUTINE IN DRASG ;KLN040Ï ;KLN034AÏ .ENDC ; C$$RTB ;KLN034,Ï ;KLN034UÐ;+CÑ; **-$MPPRO- MAP AND CALL SPECIFIED PROCESS THEN RETURN TO CALLERNÒ; GÓ; THIS ROUTINE IS CALLED TO MAP AND CALL THE ROUTINE INDICATED BY THE @Ô; ADDRESS DOUBLE WORD ON THE STACK. MAPPING IS DONE VIA APR5.Õ; Ö; INPUTS: ×;4%Ø; (SP) = RETURN ADDRESS AFTER CALLM#Ù; 2(SP) = ROUTINE ADDRESS TO CALL5&Ú; 4(SP) = MAPPING OF ROUTINE TO CALLÛ; Ü; OUTPUTS:Ý;$ Þ; NONE.Pß;O à; ALL REGISTERS ARE PRESERVED.á;-âã ä$MPPRO::+å MOV 2(SP),-(SP) ;COPY ADDRESS OF ROUTINE$æ MOV KISAR5, 4(SP) ;COPY APR5 BIAS-ç MOV 6(SP),KISAR5 ;MAP ROUTINE TO BE CALLEDH(è MOV 2(SP), 6(SP) ;COPY RETURN ADDRESSéê .IF DF K$$DASë0ì MOV KINAR5,2(SP) ;FOR I/D SYSTEMS SAVE KINAR5%í MOV KISAR5, KINAR5 ;AND MAP KINAR54îï .IFF ; DF K$$DASEð,ñ MOV (SP)+, (SP) ;MOVE ADDRESS OF ROUTINEòó .IFTFô,õ CALL @(SP)+ ;TRANSFER CONTROL TO PROCESSö÷ .IFT ;DF K$$DASø$ù MOV (SP)+,KINAR5 ;RESTORE MAPPINGúû .ENDC ; DF K$$DASü$ý MOV (SP)+,KISAR5 ;RESTORE MAPPING,þ RETURN ;TRANSFER CONTROL BACK TO CALLERÿ;+(; **-$FNCLI-FIND CPB FOR SPECIFIED CLI; 6; THIS ROUTINE LOCATES THE CPB FOR THE SPECIFIED CLI; ; INPUTS:E;V*; R3=ADDRESS OF CLI NAME STORED IN RAD50 ; ; OUTPUTS: ;$ ; C=1 CLI DOES NOT EXIST ; C=0 CLI SUCCESSFULLY FOUND); R1=OFFSET TO ENTRY FOR CLI IN $CPTBLT; R4=CPB ADDRESS; 5; REGISTERS R0, R2 AND R3 ARE PRESERVED ACROSS CALL;.;- .IF DF A$$CLIH$FNCLI::MOV #$NMCLI!40000,-(SP) ;GET NUMBER OF CLIS SYSTEM CAN SUPPORT' CLR R1 ;START AT BEGINNING OF TABLES+10$: MOV $CPTBL(R1),R4 ;POINT TO NEXT CPBT BEQ 20$ ;IF EQ, EMPTY SLOT' CMP C.PNAM(R4),(R3) ;IS THIS THE CLI  BNE 20$ ;IF NE NO0  CMP C.PNAM+2(R4),2(R3) ;MAYBE BEQ 30$ ;IF EQ YES420$: TST (R1)+ ;SET OFFSET FOR NEXT SLOT IN TABLE#  DECB (SP) ;IS THERE A SLOT LEFTS! BGT 10$ ;IF GT YES." ASL (SP) ;PUT BIT IN POSITION TO SET CARRY6#30$: ASL (SP)+ ;POP STACK AND SET APPROPRIATE CARRY $ RETURNG%& .IFF ;A$$CLIT'@($FNCLI::MOV #$MCRPT,R4 ;POINT TO MCR'S CPB, ONLY ONE IN SYSTEM*) CLR R1 ;OFFSET TO MCR'S SLOT IN $CPTBL'* CMP C.PNAM(R4),(R3) ;LOOKING FOR MCRR+ BNE 10$ ;IF NE NO", TST 2(R3) ;MATCH MUST BE EXACT- BEQ 20$ ;IF EQ, OK!.10$: SEC ;NOT LOOKING FOR MCR+ /20$: RETURNO0%1$STCLI==-1 ;DEFINE SYMBOL FOR MCRR23;+4; **-$STCLI-SET CLIT5;A6; THIS ENTRY POINT EXISTS SO ROUTINES OUTSIDE THE EXECUTIVE CANPC7; CALL THE ROUTINE TO SET A TERMINALS CLI ON SYSTEMS THAT SUPPORTA8; THE DIRECTIVE COMMON. THE ROUTINE ITSELF RESIDES IN THE DRCLIM(9; MODULE. CHECK THERE FOR ALL DETAILS.:;;;-<= .IFT ;A$$CLIN>?@ .IF DF D$$PARA?B$STCLI::MOV #$STCL1,-(SP) ;GET ADDRESS OF ALT ENTRY IN COMMONC;:CD; R3 POINTS TO THE NAME OF THE CLI THAT THE TE00Š(cÛbˆÝb`TADATADATADATADATADATARMINAL IS TO BE SETIDE; TO. IF A TASK IS CALLING $STCLI, THE NAME COULD BE IN TASK SPACE>F; THAT WILL BE UNMAPPED WHEN THE DIRECTIVE COMMON IS MAPPED.CG; THEREFORE, $FNCLI MUST BE CALLED BEFORE THE MAPPING IS CHANGED.H;H; NOTE: $MPCM2 MUST PRESERVE ALL REGISTERS AND THE C BIT.I;O'J CALL $FNCLI ;FIND THE SPECIFIED CLI%K CALL $MPDC2 ;MAP AND CALL ROUTINE. L RETURN ;MN .ENDC ;D$$PAROPQ .ENDC ;A$$CLIRST;+1U; **-$SNCMD-SEND NEXT COMMAND TO CLI DISPATCHERAV; @W; THIS ROUTINE IS CALLED UPON COMPLETION OF THE EXECUTION OF ACX; CLI COMMAND, WHEN THE TI: TERMINAL HAS SERIAL COMMAND EXECUTIONIAY; ENABLED. IT CALLS THE TTDRV AT THE APPROPRIATE ENTRY POINT TOHFZ; CAUSE IT TO FIND THE NEXT COMMAND IN THE TYPEAHEAD BUFFER AND SEND$[; IT TO MCR... TO START EXECUTION.\;H ]; INPUTS:L^;"_; R0=UCB ADDRESS OF TI: TERMINAL`;R a; OUTPUTS:b;.c; NONEd;e;-f g$SNCMD::h3i .IF NDF R$$PRO ;NO SERIAL COMMAND MORE FOR P/OSSj;j BIT #DV.PSE,U.CW1(R0) ;IS TI: A PSEUDO DEVICE? ;JWB220 $j BNE 10$ ;IF NE, EXIT ;JWB220:k BIT #UM.SER,U.MUP(R0) ;TERMINAL IN SERIAL COMMAND MODE?l BEQ 10$ ;IF EQ NOTm MOV (R0),R2 ;POINT TO DCB2s MOV KINAR5,-(SP) ;SAVE CURRENT MAPPING ;**-5t MOV KINAR6,-(SP) ;...uvw .IF DF K$$DASx,y MOV KDSAR5,-(SP) ;SAVE DATA SPACE MAPPINGz MOV KDSAR6,-(SP) ;...{| .IFTF}+~ MOV D.PCB(R2),R3 ;POINT TO PCB FOR TTDRV.# MOV P.REL(R3),KINAR5 ;MAP DRIVERE€� .IFT‚.ƒ MOV P.REL(R3),KDSAR5 ;MAP DRIVER IN D SPACE„… .IFTF†,‡ MOV D.DSP(R2),R2 ;POINT TO DISPATCH TABLE4ˆ CALL @D.VNXC(R2) ;CALL TTDRV TO SEND NEXT COMMAND‰Š .IFTT‹/Œ MOV (SP)+,KDSAR6 ;RESTORE DATA SPACE MAPPING /� MOV (SP)+,KDSAR5 ;RESTORE DATA SPACE MAPPINGPŽ� .ENDC�‘6’ MOV (SP)+,KINAR6 ;RESTORE INSTRUCTION SPACE MAPPING6“ MOV (SP)+,KINAR5 ;RESTORE INSTRUCTION SPACE MAPPING”• .ENDC ;R$$PRO– —10$: RETURN˜B™; THIS MODULE CONTAINS ROUTINES WHICH MUST BE REMOVED FROM OTHERCš; DIRECTIVE MODULES SINCE THEY CAN NOT BE PLACED IN THE DIRECTIVEP ›; COMMONœ�žŸ .IF DF G$$GEF ;+E¡; **-$ELGEF-SUBROUTINE TO ELIMINATE A GROUP GLOBAL EVENT FLAG BLOCKS¢;DK£; THIS SUBROUTINE UNCONDITIONALLY UNLINKS A GROUP GLOBAL EVENT FLAG BLOCK.¤; AND DEALLOCATES IT.+¥;R ¦; INPUTS:S§;I;¨; R0=ADDRESS OF BLOCK POINTING TO BLOCK TO BE DEALLOCATEDA(©; R1=ADDRESS OF BLOCK TO BE ELIMINATEDª;T «; OUTPUTS:¬;M ­; NONE.I®;-¯)°$ELGEF::MOV (R1),(R0) ;UNLINK THE BLOCKE-± MOV R1,R0 ;SET UP TO DEALLOCATE THE BLOCKH² MOV #10.,R1 ;O&³ CALLR $DEACB ;DEALLOCATE THE BLOCK´µ;+/¶; **-$DEAGF-DEACCESS GROUP GLOBAL EVENT FLAGST·; I¸; THIS ROUTINE DETERMINES IF GROUP GLOBAL EVENT FLAGS EXIST FOR A TASK.E-¹; IF THEY DO, THE ACCESS COUNT IN THE GROUPGº; GLOBAL EVENT FLAG BLOCK IS DECREMENTED AND THE BLOCK IS DEALLOCATEDO»; IF IT IS MARKED FOR DELETE.O¼;L ½; INPUTS:T¾; ¿; R3=EVENT FLAG MASK ADDRESSÀ; R4=TASK HEADER ADDRESSÁ; R5=TASK TCB ADDRESS.Â;, Ã; OUTPUTS:Ä;L Å; NONE.LÆ;Ç;-È.É$DEAGF::SAVNR ;SAVE NON-VOLATILE REGISTERS)Ê MOVB H.CUIC+1(R4),R4 ;GET GROUP NUMBERO4Ë CALL $SRGEF ;SEARCH FOR GROUP GLOBAL EVENT FLAGSÌ BCS 10$ ;IF CS NOT FOUND4Í BIC #1,R3 ;CLEAR GROUP GLOBAL 2ND WORD INDICATOR(Î CMP R3,R1 ;GROUP GLOBAL EVENT FLAG ?Ï BLO 10$ ;IF LO NOK.Ð SUB #G.LGTH,R3 ;POINT TO BEGINNING OF BLOCK(Ñ CMP R3,R1 ;GROUP GLOBAL EVENT FLAG ?Ò BHIS 10$ ;IF HIS NO45Ó DECB T.GGF(R5) ;DECR GRP GLOBAL USE COUNT FOR TASK(Ô DEC G.CNT(R1) ;DECREMENT ACCESS COUNT,Õ BNE 10$ ;IF NE CAN'T ELIMINATE FLAGS YET/Ö BITB #GS.DEL,G.STAT(R1) ;MARKED FOR DELETE ?/× BNE $ELGEF ;IF NE YES, ELIMINATE FLAG GROUPAØ10$: RETURN ; ÙÚÛ .ENDC ; DF G$$GEFÜÝ;+9Þ;**-$CLEDI-CALL USERS ENABLE DISABLE INTERRUPTS ROUTINENß;GDà; THIS ROUTINE IS CALLED FROM THE CINT$ DIRECTIVE TO MAP THE USERS2á; ENABLE/DISABLE INTERRUPTS ROUTINE AND CALL IT.â;0 ã; INPUTS:4ä;Då; R1=ITB00Š0cób“_c”_d–_k›’ ADDRESSæ; C=0 TO ENABLE INTERRUPTSç; C=1 TO DISABLEè;M é; OUTPUTS:ê; ë; NONE.Iì;-í;î$CLEDR::MOV X.DSI(R1),R2 ; GET ADDRESS OF USER ROUTINE TOD!ï ; ENABLE/DISABLE INTERRUPTS,ð BEQ 10$ ; NONE - EXIT02ñ MOV KINAR5,-(SP) ; SAVE CURRENT MAPPING OF APR55ò MOV X.REL(R1),KINAR5 ; MAP ROUTINE IN KERNEL APR 5Oóô .IF DF K$$DASõ,ö MOV KDSAR5,-(SP) ; SAVE D SPACE APR 5 TOO5÷ MOV X.REL(R1),KDSAR5 ; MAP IN DATA SPACE APR 5 TOOAøù .ENDCú&û CALL @R2 ; CALL ROUTINE AND RETURNü ; R1 = POINTER TO ITB &ý ; CC-C = 0 TO ENABLE INTERRUPTS,&þ ; = 1 TO DISABLE INTERRUPTSÿ .IF DF K$$DAS3 MOV (SP)+,KDSAR5 ; RESTORE D SPACE APR 5 MAPPING, .ENDC ; DF K$$DAS* MOV (SP)+,KINAR5 ; RESTORE APR5 MAPPING10$: RETURN ; EXIT;+ ; BM384R/;**-$DRGLI-GET LUN INFORMANTION ; BM384R*;**-$DRGIN-GET INFORMATION ; BM384+;**-$DREXP-EXTEND PARTITION ; BM384+;**-$DRGCL-GET COMMAND LINE ; BM384 ; ; BM384W; THESE ARE THE TRANSFER STUBS TO MAP THE VECTOR COMMON FOR THESE DIRECTIVES. ; BM384N2; TWO THINGS ARE IMPORTANT TO NOTE: ; BM384; ; BM384K; 1) THE DRTBL TABLES MARK THE DIRECTIVES AS BEING IN THE SECOND ; BM384PL; COMMON SO THAT SAVE AND RESTORE OF THE FIRST COMMONS MAPPING ; BM384J; OCCURS (OTHERWISE RETURN TO THE DISPATHCER IS IMPOSSIBLE). ; BM384; ; BM384K; 2) SINCE THESE STUB ROUTINES USE R1, ALL THE DIRECTIVES IN THE ; BM384 ;; VETOR COMMON MUST NOT USE R1 AS AN INPUT. ; BM384 ;- ; BM384  .ENABL LSB ; BM384 ; BM384T@$DREXP::MOV #$DRXP1,R1 ; GET ADDRESS OF REAL ROUTINE ; BM384- BR 10$ ; FINISH IN COMMON CODE ; BM384  ; BM384 @$DRGCL::MOV #$DRGC1,R1 ; GET ADDRESS OF REAL ROUTINE ; BM384- BR 10$ ; FINISH IN COMMON CODE ; BM384  ; BM3843@$DRGIN::MOV #$DRGN1,R1 ; GET ADDRESS OF REAL ROUTINE ; BM384- BR 10$ ; FINISH IN COMMON CODE ; BM384T ; BM384E@$DRGLI::MOV #$DRGL1,R1 ; GET ADDRESS OF REAL ROUTINE ; BM384- BR 10$ ; FINISH IN COMMON CODE ; BM384P ; BM384TC10$: MOV $DRAPV,KINAR5 ; MAP TO VECTOR COMMON IN I SPACE ; BM384E ; BM384  .IF DF K$$DAS ; BM384C ; BM384 ? MOV $DRAPV,KDSAR5 ; MAP TO VECTOR COMMON IN D SPACE ; BM384M ; BM384M" .ENDC ; DF K$$DAS ; BM384 ; BM384I/ JMP (R1) ; TO PROCESSING ROUTINE ; BM384  ; BM384  .DSABL LSB ; BM384 ; BM384O!;+ ;**-240";**-$DRLOG-LOGICAL NAME TRANSLATION DIRECTIVES#; @$; THIS ENTRY POINT MAPS THE FOURHT COMMON AND TRANSFERS TO THEI%; LOGICAL NAME ROUTINES. SEE MODULE DRLOG FOR DETAILS ON THE OPERATION.C&; ';-( )$DRLOG::*+ .IF DF L$$GCL!N$$DIRT,- .IF DF D$$PAR.1/ MOV $DRAP3,KINAR5 ; MAP THIRD COMMON (I-SPACE) 01 .IF DF K$$DAS213 MOV $DRAP3,KDSAR5 ; MAP THIRD COMMON (D-SPACE)M45 .ENDC ; DF K$$DAS67 .ENDC ; DF D$$PAR8&9 JMP $DRLG1 ; JUMP TO VECTOR COMMON:; .ENDC ; DF L$$GCL!N$$DIRR<= .IF DF L$$GCL> ? .ENABL LSBY@;+IA;**-$DELO1-ROUTINE STUB FILE FOR FOURTH DIRECTIVE COMMON ROUTINE $DELOGEB;L@C; THIS ENTRY POINT MAPS THE FOURTH COMMON AND TRANSFERS TO THED; ROUTINE $DELOG.LE;IF;-G .IFTF ; DF L$$GCLH I$DELO1::JK .IFT ; DF L$$GCL L:M MOV #$DELOG,-(SP) ;GET ADDRESS OF ROUTINE IN 4TH DIRCOMN BR 10$ ;JOIN COMMON CODEOP;+IQ;**-$CRLO1-ROUTINE STUB FILE FOR FOURTH DIRECTIVE COMMON ROUTINE $CRLOGOR;@S; THIS ENTRY POINT MAPS THE FOURTH COMMON AND TRANSFERS TO THET; ROUTINE $CRLOG.-U;1V;-W .IFTF ; DF L$$GCLX Y$CRLO1::Z[ .IFT ; DF L$$GCL\@] MOV #$CRLOG,-(SP) ;GET ADDRESS OF ROUTINE IN DIRECTIVE COMMON^ BR 10$ ;JUMP TO COMMON CODE._`;+Ia;**-$LNTD1-ROUTINE STUB FILE FOR FOURTH DIRECTIVE COMMON ROUTINE $LNTDR;b;D@c; THIS ENTRY POINT MAPS THE FOURTH COMMON 00Š8cÛbˆÝb`TADATADATADATADATADATAAND TRANSFERS TO THEd; ROUTINE $LNTDR.Ue;Sf;-g .IFTF ; DF L$$GCLh i$LNTD1::jk .IFT ; DF L$$GCLEl@m MOV #$LNTDR,-(SP) ;GET ADDRESS OF ROUTINE IN DIRECTIVE COMMONn BR 10$ ;JOIN COMMON CODEop;+Iq;**-$RLRLN-ROUTINE STUB FILE FOR FOURTH DIRECTIVE COMMON ROUTINE $LNTDRDr; @s; THIS ENTRY POINT MAPS THE FOURTH COMMON AND TRANSFERS TO THEt; ROUTINE $RLRL1u;Uv;-w .IFTF ; DF L$$GCLx y$RLRLN::z{ .IFT ; DF L$$GCL |@} MOV #$RTRL1,-(SP) ;GET ADDRESS OF ROUTINE IN DIRECTIVE COMMON~ BR 10$ ;JOIN COMMON CODE€�;+M‚; $TBTRN - ROUTINE TO TRANSLATE THE LOGICAL TABLE NUMBER INTO AN HASH TABLER5ƒ; OFFSET AND THEN MAP THE HASH TABLE THROUGH KISAR6M„;O …; INPUTS:†; R3 - TABLE NUMBERU ‡; OUTPUTS:ˆ; CC - SUCCESS:N5‰; KISAR6 - CONTAINS MAPPING TO START OF HASH TABLEO&Š; CS - NO HASH TABLE VALUE AVAILABLE‹; $Œ; R3, KISAR6 ARE DESTROYED BY CALL�;FŽ; THIS ROUTINE TAKES THE SPECIFIED LOGICAL TABLE NUMBER AND TURNS ITH�; INTO A WORD OFFSET INTO THE HIERARCHY TABLE IN SYSCM. THE HIERARCHYI�; TABLE CONTAINS THE SECONDARY POOL POINTERS TO EACH OF THE HASH TABLESHH‘; IN AN ORDERED, PRECEDENCE-DERIVED SEQUENCE. SINCE THE TABLE NUMBERSG’; NO LONGER HAVE ANY PRETENSE OF PRECEDENCE ORDERING, IT IS NECESSARYG“; TO HASH THE VALUES INTO THE CORRECT WORD OFFSET. FROM THIS OFFSET,BD”; THE APR BIAS OF THE HASH TABLE IS PLACED INTO KISAR6 SO THAT ANYD•; 140000-140100 KERNEL DATA REFERENCES WILL ACCESS THE HASH TABLE.–;-— .IFTF ;DF L$$GCLT˜ ™$TBTRN::š› .IFT ;DF L$$GCLœ� MOV #$TBTRL,-(SP) ž BR 10$AŸ ;+I¡;**-$LDEL1-ROUTINE STUB FILE FOR FOURTH DIRECTIVE COMMON ROUTINE $LDELXE¢;E@£; THIS ENTRY POINT MAPS THE FOURTH COMMON AND TRANSFERS TO THE¤; ROUTINE $LDELX.I¥;E¦;-§ .IFTF ; DF L$$GCL¨ ©$LDEL1::ª« .IFT ; DF L$$GCLI¬7­ MOV #$LDELX,-(SP) ; SET ADDRESS TO DIRECTIVE ROUTINE ®A¯10$: CALL $MPDC3 ; MAP THE ROUTINE IN THE 3RD DIRECTIVE COMMONS°± .IFF ; DF L$$GCL²³ SEC´µ .IFTF ; DF L$$GCL¶ · RETURN$¸ ¹ .DSABL LSBTº» .ENDC ; DF L$$GCL¼½¾ .IF DF P$$3XX¿À;+:Á; $FLIPM -- THIS ROUTINE COPIES A BUFFER AND INVERTS IT.Â;T Ã; INPUTS: 7Ä; R0 = APR 5 ADDRESS OF LAST WD. +2 OF SOURCE BUFFERXÅ; R1 = BIAS OF SOURCE BUFFERG%Æ; R2 = NUMBER OF WORDS TO TRANSFER$,Ç; R3 = APR6 ADDRESS OF TARGET USER BUFFERÈ;E É; OUTPUTS:Ê;Ë; BUFFER IS TRANSFERREDÌ; APR5 BIAS IS NOT RESTOREDÍ;- Î$FLIPM::3Ï MOV R1,KISAR5 ;SET UP APR5 BIAS OF SOURCE BUFFER#Ð10$: MOV -(R0),(R3)+ ;MOVE A WORDÑ SOB R2,10$ ;LOOP TILL DONE Ò RETURN$ÓÔ .ENDC ; DF P$$3XXÕÖ×ØÙ .MCALL LNMDF$Ú Û LNMDF$ÜÝ MAP5 = 120000Þ MAP6 = 140000ßà .IF DF N$$DIROá;+.â; $DLCTX -- DELETE A SPECIFIED CONTEXT BLOCKã;U ä; INPUT:3å; R1 = ADDRESS OF THE CONTEXT BLOCK TO BE DELETED æ;R ç; OUTPUT:U:è; USE COUNT IN CONTEXT BLOCK IS DECREMENTED. IF CONTEXT;é; BLOCK IS NOT USE BY SOMEONE ELSE, THE SPECIFIED CONTEXT ê; BLOCK IS DELETEDë;0Bì; ***** NOTE: IT IS THE RESPONSIBILTY OF THE CALLER TO ZERO THEí; POINTER TO THE CTX.î;3ï;ð; REGISTER R1 DESTROYED.ñ;ò; -Mó .IFTF ;DF N$$DIR2ô õ$DLCTX::ö÷ .IFTøù MOV R0,-(SP) ;SAVE R0C*ú MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING$û MOV R1,KISAR6 ;MAP OLD CTX BLOCK+ü BEQ 20$ ;IF EQ, NO BLOCK TO DEALLOCATET+ý CMPB #1,C.REF+MAP6 ;ONLY ONE REFERENCE?N#þ BEQ 10$ ;YES, DEALLOCATE BLOCKE(ÿ DECB C.REF+MAP6 ;DECREMENT USE COUNT  BR 20$ ;L*10$: MOV R1,R0 ;OLD CONTEXT BLOCK BIAS  CLR R1 ;L( BISB C.DDSL+MAP6,R1 ;GET SIZE OF DDS4 ADD #C.FIXL+77,R1 ;GET FIXED LENGTH PLUS MODULOS( ASH #-6,R1 ;CONVERT INTO 32W BLOCKS$ MOV R2,-(SP) ;SAVE R2 ;RDH010# CALL $DESEC ;DEALLOCATE PACKETT' MOV (SP)+,R2 ;RESTORE R2 ;RDH010B)20$: MOV (SP)+,KISAR6 ;RESTORE MAPPINGL  MOV (SP)+,R0 ;RESTORE R0  RETURNR  ;+. ; $CRCTX -- CREATE A SPECIFIED CONTEXT BLOCK;+'00Š@cób“_c”_d–_k›’; R0 = SIZE OF USER BUFFER (IN BYTES)L; R1 = BIAS OF USER BUFFER); R2 = APR5 DISPLACEMENT TO USER BUFFER ;L ; OUTPUT:T; &; R3 = ADDRESS OF NEW CONTEXT BLOCK;T; -M .IFTF ;DF N$$DIRC $CRCTX:: .IFT ;DF N$$DIR* MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING#  MOV R2,-(SP) ;SAVE DISPLACEMENT ! MOV R1,-(SP) ;SAVE BIASP" MOV R0,-(SP) ;SAVE DDS SIZEM## MOV R0,R1 ;GET SIZE OF NEW DDS/$ ADD #C.FIXL+77,R1 ;ADD FIXED SIZE + MODULUST"% ASH #-6,R1 ;CONVERT TO BLOCKS,& CALL $ALSEC ;ALLOCATE BLOCK FOR DDS LNB'' BCS 50$ ;IF CS, ALLOCATION FAILUREF2( MOV R0,R3 ;SET UP SEC. POOL BLK BIAS FOR COPY) MOV R3,KISAR6 ;MAP BLOCK)* CLRB C.REF+MAP6 ;ZERO REFERENCE COUNT:5+ MOV (SP)+,R0 ;SET UP BYTE COUNT OF STRING TO COPYE%, MOVB R0,C.DDSL+MAP6 ;FILL IN SIZEE$- BEQ 10$ ;IF EQ, ZERO LENGTH DDS/. MOVB #1,C.REF+MAP6 ;FILL IN REFERENCE COUNTR/ MOV (SP)+,R1 ;SET UP BIAS%0 MOV (SP)+,R2 ;SET UP DISPLACEMENTO=1 MOV #C.DDS+MAP6,R4 ;SETUP DISPLACEMENT TO STRING IN BLOCKL2 CALL $BLXIO ;COPY DDS 3 BR 20$ ;C$410$: CMP (SP)+,(SP)+ ;CLEAN STACK)520$: MOV (SP)+,KISAR6 ;RESTORE MAPPINGV6 CLC ;INDICATE SUCCESSR7 RETURN ;8$950$: CMP (SP)+,(SP)+ ;CLEAN STACK: MOV (SP)+,R2 ;RESTORE R2%; MOV (SP)+,KISAR6 ;RESTORE MAPPINGS<= .IFTF ;DF N$$DIR,>? SEC ;INDICATE FAILUREF@ RETURN ;AB .ENDC ;DF N$$DIR(CDE .IF DF L$$GCLFG;+EH; $CMPST -- THIS ROUTINE IS USED TO COMPARE A USER SPECIFIED STRINGT6I; AGAINST A CURRENTLY MAPPED LOGICAL NAME BLOCK.J;C K; INPUTS:(1L; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCK;M; BLOCK CONTAINS:'N; WD 1 - BYTE COUNT OF LOGICAL NAME0O; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME8P; WD 3 - APR6 BIASED OFFSET TO START OF LOGICAL NAME.Q; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)*R; BLOCK TYPE NUMBER (HIGH BYTE);S; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLE-T;S=U; THE LOGICAL NAME STRING TO BE COMPARED AGAINST IS MAPPEDG>V; THROUGH APR6. THIS ROUTINE IS ONLY TO BE USED WHEN IT IS@W; KNOWN THAT THE LENGTHS OF THE TWO STRINGS TO BE CHECKED AREX; THE SAME.Y;- Z; OUTPUT:F[;C\; C=0 AND R1 = 0 MATCHD*]; C=0 AND R1 <>0 NO MATCH BUT TRY NEXT0^; C=1 NO MATCH AND EITHER INSERT ON PREVIOUS!_; OR STOP ANY FURTHER SEARCHW`;)a; R2,R3 ARE PRESERVEDb;Rc;-6d$CMPST::MOV KISAR5,-(SP) ;SAVE CURRENT APR5 MAPPINGe MOV R2,-(SP) ;SAVE R2Ef MOV R3,-(SP) ;SAVE R3C1g MOV (R0),R1 ;GET LENGTH OF STRINGS TO VERIFYS0h MOV 4(R0),R3 ;GET APR6 OFFSET TO USER BUFFER"i MOV 2(R0),KISAR5 ;MAP USER LNS.j SUB #20000,R3 ;REDUCE IT TO AN APR5 OFFSET6k MOV #L.NNAM+140000,R2 ;POINT AT LOGICAL NAME STRING:l15$: CALL $CVBUC ;CONVERT NEXT USER CHAR TO UPPER CASE*m CMPB R5,(R2)+ ;COMPARE THE TWO STRINGS3n BLO 30$ ;IF LO INPUT STRING SHOULD OCCUR FIRST-3o BHI 30$ ;IF HI INPUT STRING SHOULD OCCUR LATERI&p SOB R1,15$ ;COMPARE ENTIRE STRING q30$: MOV (SP)+,R3 ;RESTORE R3r MOV (SP)+,R2 ;RESTORE R2,s MOV (SP)+,KISAR5 ;RESTORE KISAR5 MAPPINGt RETURN ;RETURN TO CALLERuvwx;+Cy; $CVBUC - ROUTINE TO CONVERT A SPECIFIED CHARACTER TO UPPER CASE2z;N {; INPUTS:N9|; R3 - POINTER TO NEXT CHARACTER TO DO TRANSLATION UPON }; ~; OUTPUTS:0; R3 - POINTS TO BYTE PAST CHARACTER PROCESSED €; R5 - UPCASED CHARACTER VALUE�;- ‚$CVBUC::)ƒ CLR R5 ;INITIALIZE THE RETURNED VALUE„ BISB (R3)+,R5 ;GET THE VALUEI0… CMPB R5,#141 ;CHARACTER IN LOWER CASE RANGE?† BLO 10$ ;IF LO NOV5‡ CMPB R5,#172 ;CHARACTER OUTSIDE LOWER CASE RANGE?Eˆ BHI 10$ ;IF HI YES&‰ BICB #40,R5 ;CONVERT TO UPPER CASE Š10$: RETURNH‹Œ�;+LŽ; $GTUSR - ROUTINE TO TAKE A RAW UCB ADDRESS, WALK DOWN THE REDIRECT CHAINC�; UNTIL A NON-PSEUDO DEVICE IS FOUND, AND THEN PLUG THE USER HASHR?�; TABLE ADDRESS WITH THE SECONDARY POOL VALUE FOR THAT DEVICE‘;R ’; INPUTS:E“; R1 - RAW UCB ADDRESS”;R •; OUTPUTS:D–; R1 - UCB A00ŠHcÛbˆÝb`TADATADATADATADATADATADDRESS OF FIRST DEVICE IN REDIRECT CHAIN THAT IS NOT A—; PSEUDO DEVICE=˜; $USRLG - UPDATED TO HOLD THE U.LOG VALUE OF THE FOUND UCBI™;Yš;-› .IFTF ;DF L$$GCLT œ$GTUSR::<� BIT #DV.PSE,U.CW1(R1) ;CHECK IF SPECIFIED UCB IS A PSEUDO+ž BEQ 10$ ;IF EQ, NO, GO AND PLUG $USRLGA7Ÿ MOV U.RED(R1),R1 ;GET NEXT DEVICE IN REDIRECT CHAIN "  BR $GTUSR ;GO BACK FOR CHECKS¡10$:¢ .IFT ;DF L$$GCL£,¤ CLR $USRLG ;INITIALIZE TO NO HASH TABLE¥¦ .IFTF ;DF L$$GCLU§3¨ BIT #DV.TTY,U.CW1(R1) ;IS THIS DEVICE A TERMINALC,© BEQ 20$ ;IF EQ, NO, LEAVE NO HASH TABLEª« .IFT ;DF L$$GCL¬;­ MOV U.LOG(R1),$USRLG ;SET UP THE USER HASH TABLE ADDRESST®¯ .IFTF ;DF L$$GCLP° ±20$: RETURN ²³´ .ENDC ;DF L$$GCLµµ .IF DF D$$PAR ; BM377$µ ; BM377Rµ;+ ; BM377 $µ; **-$DREIF-EXIT IF ; BM377µ; ; BM377Rµ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TERMINATE THE EXECUTION OF THE ; BM377Lµ; ISSUING TASK IF, AND ONLY IF, AN INDICATED EVENT FLAG IS CLEAR. ; BM377µ; ; BM377µ; DPB FORMAT: ; BM377Dµ; ; BM3770µ; WD. 00 -- DIC(53.),DPB SIZE(2.). ; BM377Jµ; WD. 01 -- EVENT FLAG NUMBER OF EVENT FLAG THAT MUST BE CLEAR. ; BM377µ; ; BM377µ; INPUTS: ; BM377 µ; ; BM377)µ; R0=EVENT FLAG MASK WORD. ; BM377;,µ; R1=EVENT FLAG MASK ADDRESS. ; BM377Eµ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; BM377 8µ; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. ; BM377<µ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; BM3779µ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; BM377Sµ; ; BM377Bµ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; BM377µ; ; BM377:µ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; BM377Fµ; DIRECTIVE STATUS OF 'D.RS22' IS RETURNED IF THE SPECIFIED ; BM377$µ; EVENT FLAG IS SET. ; BM377.µ; C=1 IF DIRECTIVE IS REJECTED. ; BM377Dµ; DIRECTIVE STATUS OF 'D.RS97' IF NO OR AN INVALID EVENT ; BM377*µ; FLAG NUMBER IS SPECIFIED. ; BM377µ;- ; BM377Sµ ; BM377Rµ .ENABL LSB ; BM377µ ; BM377U4µ$DREIF::BIT R0,(R1) ;EVENT FLAG CLEAR? ; BM377%µ BEQ $DREXT ;IF EQ YES ; BM377F1µ DRSTS D.RS22 ;SET DIRECTIVE STATUS ; BM377µ ; BM377Fµ;+ ; BM377F!µ; **-$DREXT-EXIT ; BM377 µ; ; BM377Rµ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TERMINATE THE EXECUTION OF THE ; BM377!µ; ISSUING TASK. ; BM3777µ; ; BM377µ; DPB FORMAT: ; BM377 µ; ; BM3770µ; WD. 00 -- DIC(51.),DPB SIZE(1.). ; BM377µ; ; BM377µ; INPUTS: ; BM377Cµ; ; BM377Eµ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; BM377T8µ; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. ; BM377<µ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; BM3779µ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; BM377Eµ; ; BM377Hµ; NOTE: THIS DIRECTIVE IS ALSO CALLED FROM THE DISPATCHER AND ; BM377Bµ; THEREFORE ONLY REQUIRES R5 TO BE LOADED ON ENTRANCE. ; BM377µ; ; BM377Hµ; PRIVILEGED TASKS WHICH DESIRE TO CALL $DREXT DIRECTLY ; BM377Fµ; SHOULD SWITCH TO SYSTEM STATE AND IMMEDIATELY CALL $DREXT ; BM377:µ; WITHOUT CALLING ANY OTHER EXEC SUBROUTINES. ; BM377:µ; THIS IS BECAUSE OF POSSIBLE SIDE EFFECTS OF ; BM3775µ; OTHER EXEC ROUTINES (SUCH AS $TSKRP). ; BM377Mµ; ; BM377<µ; BECAUSE MANY PRIVILEGED TASKS CALL $DREXT, WE ; BM377>µ; WILL UNCONDITIONALLY MAP THE TASK HEADER SO THAT ; BM377=µ; THIS CODE DOES NOT HAVE TO BE ADDED ELSEWHERE. ; BM377Dµ; ; BM377µ; ; BM377Bµ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; BM377µ; ; BM377Kµ; NO STATUS IS RETURNED TO THE ISSUING TASK SINCE THIS DIRECTIVE ; BM377O*µ; TERMINATES ITS EXECUTION. ; BM377µ;- ; BM377 µ ; BM377(µ$DREXT:: ;REFERE00ŠPcób“_c”_d–_k›’NCE LABEL ; BM377µ ; BM377Dµ .IF DF X$$HDR ; BM377Oµ ; BM377A7µ MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADER ; BM377Tµ ; BM377 "µ .ENDC ; DF X$$HDR ; BM377µ ; BM377µ .IF DF P$$OFF ; BM377Pµ ; BM377 7µ BIT #T3.ACP,T.ST3(R5) ;IS TASK AN ACP? ; BM377 *µ BNE $DREX1 ;IF NE YES ; BM377@µ MOV #EX$SUC,T.EFLG+2(R5) ;SET SUCCESSFUL EXIT STATUS ; BM377Kµ$DREX2::MOV #S.CEXT,T.EFLG(R5) ;SET SUCCESS CODE IN ABORT CODE ; BM377 µ ; BM377.µ .ENDC ; BM377µ ; BM3777µ ; BM377A?µ$DREX1::MOV $DRAPR,KINAR5 ;MAP THE DIRECTIVE COMMON ; BM377.µ ; BM377 5µ JMP $DREX3 ;AND GO THERE TO FINISH EXIT ; BM377 µ ; BM377 µ .PAGE ; BM377µ ; BM377Aµ;+ ; BM377B&µ; **-$TRTRP-TRAP TRAP ; BM377µ; ; BM377Rµ; THIS ROUTINE IS TRAPPED TO WHEN A TRAP INSTRUCTION IS EXECUTED. IF THE ; BM377Qµ; STACK DEPTH IS ZERO, THEN A DIRECTIVE STATUS IS TO BE RETURNED. ELSE ; BM3777Iµ; CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE. ; BM377Mµ; ; BM377µ; INPUTS: ; BM377Mµ; ; BM3778µ; 2(SP)=PS WORD PUSHED BY TRAP INSTRUCTION. ; BM3778µ; 0(SP)=PC WORD PUSHED BY TRAP INSTRUCTION. ; BM377µ; ; BM377µ; OUTPUTS: ; BM377µ; ; BM377Lµ; IF THE STACK DEPTH IS ZERO, THEN A DIRECTIVE STATUS IS RETURNED. ; BM377Lµ; ELSE CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE. ; BM377µ;- ; BM377Oµ ; BM377Oµ .ENABL LSB ; BM377µ ; BM377 5µ$TRTRP::TST $STKDP ;;;STACK DEPTH ZERO? ; BM377 &µ BNE $EMTRP ;;;IF NE NO ; BM377?µ MOV (SP)+,R0 ;;;GET ADDRESS + 2 OF TRAP INSTRUCTION ; BM377I4µ MFPI -(R0) ;;;PICK UP TRAP INSTRUCTION ; BM377Bµ MOV $DRAPR,KINAR5 ;;;MAP TO DIRECTIVE COMMON (I SPACE) ; BM377Aµ JMP $TRTR1 ;;;CONTINUE PROCESSING IN DIRECTIVE COMMON ; BM377Rµ ; BM377Hµ;+ ; BM377 %µ; **-$EMTRP-EMT TRAP ; BM377Oµ; ; BM377Rµ; THIS ROUTINE IS TRAPPED TO WHEN AN EMT INSTRUCTION IS EXECUTED. IF THE ; BM377Nµ; STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED. ELSE A TEST IS ; BM377Oµ; MADE TO SEE IF THE EMT INSTRUCTION HAD A CODE OF 377. IF NOT, THEN ; BM377PQµ; CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE. ELSE THE ; BM377;3µ; APPROPRIATE DIRECTIVE IS EXECUTED. ; BM377Cµ; ; BM377µ; INPUTS: ; BM377 µ; ; BM3777µ; 2(SP)=PS WORD PUSHED BY EMT INSTRUCTION. ; BM3777µ; 0(SP)=PC WORD PUSHED BY EMT INSTRUCTION. ; BM377Xµ; ; BM377µ; OUTPUTS: ; BM377µ; ; BM377Kµ; IF THE STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED. ELSE ; BM377DOµ; CONTROL IS GIVEN TO THE EMT/TRAP SST ROUTINE OR A DIRECTIVE ROUTINE ; BM377A>µ; DEPENDENT ON WHETHER THE EMT HAD A CODE OF 377. ; BM377µ;- ; BM377Cµ ; BM3777µ; ; BM377Jµ; DETERMINE IF LEGITIMATE ENTRY FROM USER STATE. IF NOT, CRASH ; BM377µ; ; BM377µ ; BM377M<µ$EMTRP::TST $STKDP ;;;ARE WE AT STACK DEPTH +1? ; BM377#µ BGT 2$ ;;;IF GT YES ; BM3777.µ JMP $CREMT ;;;ELSE CRASH SYSTEM ; BM377:µ2$: DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITY ; BM377@µ MOV $DRAPR,KINAR5 ;MAP TO DIRECTIVE COMMON (I SPACE) ; BM377Aµ JMP $EMTR1 ;;;CONTINUE PROCESSING IN DIRECTIVE COMMON ; BM377 µ ; BM377 Jµ; ROUTINES USED BY DISPATCHER TO CALL OTHER COMMONS THAN FIRST ; BM377µ ; BM377;<µ$DRCL2::MOV $DRAP2,KINAR5 ;MAP TO SECOND COMMON ; BM377µ ; BM377 µ .IF DF K$$DAS ; BM377Bµ ; BM377 5µ MOV $DRAP2,KDSAR5 ;MAP IN D-SPACE ALSO ; BM3773µ ; BM377;"µ .ENDC ; DF K$$DAS ; BM377µ ; BM377I)µ CALL @2(SP) ;CALL ROUTINE ; BM377B;µ MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACE ; BM377O-µ MOV (SP)+,(SP) ;COLLAPSE STACK 00ŠXc‹ZcÝb`TADATADATADATADATADATA; BM377U.µ RETURN ;AND BACK TO DISPATCHER ; BM377µ ; BM377 ;µ$DRCL3::MOV $DRAP3,KINAR5 ;MAP TO THIRD COMMON ; BM377O)µ CALL @2(SP) ;CALL ROUTINE ; BM377D;µ MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACE ; BM377,-µ MOV (SP)+,(SP) ;COLLAPSE STACK ; BM377 .µ RETURN ;AND BACK TO DISPATCHER ; BM377µ ; BM3777µ ; BM384CBµ$FINDR::MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACE ; BM384:µ JMP $DRFIN ;AND JUMP TO DISPATCHER COMPLETION ; BM384µ ; BM384A"µ .ENDC ; DF D$$PAR ; BM384µ ; BM384¶· .ENDDRAP3,KINAR5 ;MAP TO THIRD COMMON ; BM377O)µ CALL @2(SP) ;CALL ROUTINE ; BM377D;µ MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACE ; BM377,-µ MOV (SP)+,(SP) ;COLLAPSE STACK ; BM377 .µ RETURN ;AND BACK TO DISPATCHER ; BM377µ ; BM3777µ ; BM384CBµ$FINDR::MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACE ; BM384:µ JMP $DRFIN ;AND JUMP TO DISPATCHER COMPLETION ; BM3 .TITLE ERSUB0 .IDENT /02.06/3;DI; COPYRIGHT (C) 1983, 1984, 1985, 1986 BY DIGITAL EQUIPMENT CORPORATIONU; ALL RIGHTS RESERVED.;R>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;N ;$ ; P. J. BEZEREDI 16-NOV-81 ;E; ;?; J. R. KAUFFMAN ; C. PUTNAM,; S. C. ADAMS ; G. MARIGOWDA;3; ; MODIFIED BY:;W; G. MARIGOWDA 14-JUL-86>; CHANGE THE STACK OFFSET TO ACCESS APR5 MAPPING V02.06;;D3; 4; ERROR LOGGING SUBROUTINES 5;B67; 8; MACRO LIBRARY CALLS9; :: .MCALL CLKDF$,EPKDF$,F11DF$,HDRDF$,HWDDF$,PKTDF$,UCBDF$; .MCALL BGCK$A'< CLKDF$ ;DEFINE CLOCK QUEUE OFFSETSE(= EPKDF$ ;DEFINE ERROR PACKET OFFSETS$> F11DF$ ;DEFINE FILES-11 OFFSETS'? HDRDF$ ;DEFINE TASK HEADER OFFSETSP!@ HWDDF$ ;DEFINE CPU REGISTERSR&A PKTDF$ ;DEFINE I/O PACKET OFFSETSB UCBDF$ ;DEFINE UCB OFFSETSCD;AE; EQUATED SYMBOLSTF;EGHERRTIM= H$$RTZ*2 ;2 SECONDSIIOC= X.IOC+140000 ;I/O COUNTI(JERHL= X.ERHL+140000 ;HARD ERROR LIMIT(KERSL= X.ERSL+140000 ;SOFT ERROR LIMIT(LERSC= X.ERSC+140000 ;SOFT ERROR COUNT(MERHC= X.ERHC+140000 ;HARD ERROR COUNT,NASSUME ERSC, IOC+6 ;ORDERING IS IMPORTANT1OASSUME X.WCNT, X.IOC+10 ;WORDS TRANSFERED COUNT 2PASSUME X.CYLC, X.IOC+14 ;CYLINDERS CROSSED COUNT/QASSUME V.PKSR, V.LABL+12. ;PACK SERIAL NUMBERERSTU .IF DF E$$LOGVW;+ X; **-$DVER1-LOG A DEVICE ERRORY;FZ; THIS ROUTINE IS CALLED TO LOG A DEVICE ERROR. AN ERROR LOG PACKETE[; WILL BE ALLOCATED AND THE CONTEXT OF THE CURRENT TRANSFER WILL BELI\; SAVED. IF AN ERROR IS ALREADY IN PROGRESS FOR THIS DEVICE, THE ERRORDI]; WILL BE IGNORED. INFORMATION CONCERNING ALL ACTIVE DEVICES WILL ALSO, ^; BE SAVED.S_;SH`; THE ERROR CODE IS SETUP TO MARK THIS AS A HARD DEVICE ERROR. IF THEFa; OPERATION IS SUCCESSFUL, THE CODE WILL BE CHANGED TO A SOFT DEVICE/b; ERROR WHEN THE I/O OPERATION IS TERMINATED.c;H d; INPUTS: e;D<f; R2=ADDRESS OF THE BLOCK OF REGISTERS TO LOG (MUST BE THE$g; CSR ADDRESS IF KS.MBC IS SET)h; R4=SCB ADDRESSi; R5=UCB ADDRESSj;A k; OUTPUTS:l;F>m; IF THIS IS THE FIRST OCCURENCE OF THE ERROR, THE ERROR LOG=n; PACKET IS FILED AND THE SCB IS SET TO POINT TO THE PACKET1o; ADDRESS AND THE ERROR IN PROGRESS BIT IS SET.Vp;R&q; NOTE: ALL REGISTERS ARE PRESERVED.r;- s .ENABL LSBHtu .IFTF ; DF E$$LOGvw$DVER1:: ;LOG DEVICE ERRORxy .IFT ; DF E$$LOGUz{ MOV R0,-(SP) ;SAVE REGISTER8| MOV #E$CERR+<400*E$SDVH>,R0 ;GET THE HARD ERROR CODE'} BR 10$ ;JOIN COMMON PROCESSING CODE ~ .IFTF ; DF E$$LOG€ �$DVTM2::‚ƒ .IFT ; DF E$$LOGO„… MOV R0,-(SP) ;SAVE REGISTERB† MOV #E$CERR+<400*E$STMO>,R0 ;SET UP THE ERROR LOG PACKET FOR...!‡ ;... A DEVICE TIMEOUT ERROR ˆ*‰10$: CALL LOGTST ;CAN WE LOG THE ERROR?Š BCS 50$ ;IF CS NON‹ MOV R1,-(SP) ;SAVE REGISTERSGŒ MOV R2,-(SP) ;;�00‹`cób“_c”_d–_k›’ MOV R3,-(SP) ;=Ž MOV #SM.HDR!SM.DID!SM.DOP!SM.DAT!SM.DAC,R2 ;SET FLAGS ...M+� ;... HEADER SUBPACKET, DEVICE ID, ...O+� ;... DEVICE OPERATION, DATA, ACTIVITYD:‘ MOVB S.RCNT(R4),R1 ;GET THE NUMBER OF REGISTERS TO SAVE-’ ASL R1 ;CONVERT IT INTO A NUMBER OF BYTES,“ MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS1” BIT #KS.MBC,K.STS(R3) ;BAE REGISTERS PRESENT?R• BEQ 30$ ;IF EQ NOO2– ADD #4,R1 ;YES, ADD SPACE FOR 2 MORE REGISTERS$— BIS #SM.MBC,R2 ;FLAG IT FOR LATER?˜30$: MOVB S.ROFF(R4),R3 ;GET THE OFFSET TO THE FIRST REGISTERP2™ ADD 2(SP),R3 ;COMPUTE ACTUAL START OF REGISTERSš›;E$œ; AT THIS POINT THE REGISTERS ARE:�;T)ž; R0 = ENTRY TYPE CODE AND SUBTYPE CODE ,Ÿ; R1 = LENGTH OF DEVICE REGISTERS IN BYTES ; R2 = CONTROL MASK WORD.¡; R3 = BEGINNING ADDRESS OF DEVICE REGISTERS¢; R4 = SCB ADDRESS£; R5 = UCB ADDRESS¤;S¥"¦ MOV KISAR6,-(SP) ; SAVE MAPPING"§ CALL $CRPK1 ;CREATE THE PACKET¨ BCS 45$ ;IF CS FAILURE9© CMP R0,#E$CERR+<400*E$STMO> ;IS THIS A TIMEOUT ERROR?Fª BNE 40$ ;IF NE NOE3« MOVB S.ROFF(R4),R2 ;GET OFFSET TO FIRST REGISTERS¬ ASL R2 ;CONVERT IT TO BYTES 4­ SUB R2,R1 ;COMPUTE ADDRESS TO STORE CSR CONTENTS7® MOV $DVSAV,(R1) ;PUT SAVED CSR CONTENTS IN SUBPACKET:¯40$: MOV R3,S.EMB(R4) ;SAVE THE ERROR LOG PACKET ADDRESS.°45$: MOV (SP)+,KISAR6 ; RESTORE APR6 MAPPING#± MOV (SP)+,R3 ; RESTORE REGISTERS(² MOV (SP)+,R2 ;³ MOV (SP)+,R1 ;E´50$: MOV (SP)+,R0 ;4µ¶ .ENDC ; DF E$$LOG·¸5¹ BIS #S2.EIP,S.ST2(R4) ;INDICATE ERROR IN PROGRESS$"º CLC ;INDICATE NO UMD FUNCTION » RETURN ;F¼ ½ .DSABL LSBA¾¿;+@À; **-$LGER1-LOG AN ERROR LOG PACKET (NO ERROR NEED BE PRESENT)Á;SFÂ; THIS ROUTINE IS CALLED BY DRIVERS THAT WISH TO CREATE AN ERROR LOGGÃ; PACKET WHEN NO ERROR IS PRESENT, I.E. FOR AN UNSOLICITED INTERRUPT. HÄ; THE PACKET WILL BE CREATED AND THE DRIVER IS RESPONSIBLE FOR FILLING&Å; IN THE NECESSARY DATA INFORMATION.Æ; Ç; INPUTS:NÈ;D+É; R1=LENGTH OF DATA TO BE LOGGED IN BYTESI:Ê; R4=SCB ADDRESS (IF ZERO THEN NO I/O PACKET IS PRESENT)Ë; R5=UCB ADDRESSÌ; Í; OUTPUTS:Î;0Ï; C=1 IF ERROR CANNOT BE LOGGED FOR ANY REASONÐ; C=0 IF ERROR CAN BE LOGGED0Ñ; R1=ADDRESS OF DATA AREA IN ERROR LOG PACKET#Ò; R3=ADDRESS OF ERROR LOG PACKETRÓ; Ô; R4 AND R5 ARE PRESERVEDTÕ; R0, R2 AND R3 ARE DESTROYEDL.Ö; APR6 MAPPING DESTROYED: KISAR6 MAPS PACKET×;-ØÙÚ .IF DF E$$LOGÛ,Ü$LGER1::CALL LOGTST ;CAN WE LOG THE ERRORÝ BCS 20$ ;IF CS NOG:Þ MOV #E$CDVI+<400*E$SDVI>,R0 ;ASSUME DEVICE INFORMATION2ß MOV #SM.HDR!SM.DID!SM.DAT!SM.DAC,R2 ;SET FLAGS&à TST R4 ;DO WE HAVE AN SCB ADDRESS?á BEQ 10$ ;IF EQ NO=2â BIS #SM.DOP,R2 ;YES, LOG I/O PACKET INFORMATION/ã MOV #E$CERR+<400*E$SDVH>,R0 ;SET HARD ERRORL/ä10$: CLR R3 ;DO NOT FILL DATA SUBPACKET AREA,å CALL $CRPK1 ;CREATE THE ERROR LOG PACKETæ BCS 20$ ;IF CS FAILURE,ç TST R4 ;DO SE HAVE AN SCB ADDRESS? (C=0)è BEQ 20$ ;IF EQ NO 2é MOV R3,S.EMB(R4) ;SAVE ERROR LOG PACKET ADDRESS0ê BIS #S2.EIP,S.ST2(R4) ;SET ERROR IN PROGRESSë20$: RETURN ;Iìí;+(î; **-LOGTST-SEE IF WE CAN LOG AN ERRORï; Dð; THIS ROUTINE WILL CHECK TO SEE IF THE ERROR CANNOT BE LOGGED. IFDñ; LOGGING IS OFF, OR IF THERE IS ALREADY AN ERROR IN PROGRESS, OR Gò; IF BOTH LIMITS HAVE BEEN REACHED, THE PACKET WILL BE REJECTED HERE Hó; INSTEAD OF LATER IN $FERL1 THE ERROR SEQUENCE NUMBER IS INCREMENTED Cô; IF LOGGING IS ON AND THERE IS NOT ALREADY AN ERROR IN PROGRESS.Võ;O ö; INPUTS:A÷;S$ø; R4=SCB ADDRESS OF ZERO IF NO SCBù; R5=UCB ADDRESSú;R û; OUTPUTS:ü;*ý; C=0 IF ERROR CAN POTENTIALLY BE LOGGED!þ; C=1 IF ERROR CANNOT BE LOGGEDEÿ;--LOGTST: MOV KISAR6,-(SP) ;SAVE APR6 MAPPINGR2 BIT #ES.LOG,$ERFLA ;IS ERROR LOGGING TURNED ON? BEQ 20$ ;IF EQ NON TST R4 ;SCB PRESENT? BEQ 5$ ;IF EQ NO@ BIT #S2.EIP!S2.ENB,S.ST2(R4) ;ERROR IN PROGRESS/LOGGING OFF? BNE 20$ ;IF NE YES"5$: INC $ERRSQ ;COUNT THE ERROR,  BITB #ES.LIM,$ERFLA ;IS LIMIT00‹hcZcÝb`TADATADATADATADATADATAING ENABLED?  BEQ 10$ ;IF EQ NOI>  MOV U.UCBX(R5),KISAR6 ;MAP UCB EXTENSION IN SECONDARY POOL  BEQ 10$ ;IF EQ NO EXTENSIOND2  CMPB ERHC,ERHL ;IS THE HARD THRESHOLD EXCEEDED? BLO 10$ ;IF LO NO;2 CMPB ERSC,ERSL ;IS THE SOFT THRESHOLD EXCEEDED? BHIS 20$ ;IF HIS YES"10$: TST R4 ;DO WE HAVE AN SCB? BEQ 30$ ;IF EQ NOE- CLR S.EMB(R4) ;INDICATE NO PACKET JUST YETN  BR 30$ ;"20$: SEC ;CANNOT LOG THE ERROR-30$: MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPINGI  RETURN ;M .ENDC ; DF E$$LOG;+*; **-$FERL1-FINISH ERROR LOGGING PROCESS;EC; THIS ROUTINE IS CALLED AT I/O DONE TIME OR WHEN IT IS NECESSARY A ; TO QUEUE AN ERROR LOG PACKET AFTER A SUCCESSFUL RECOVERY OF AE!; MID-TRANSFER ERROR.D";E #; INPUTS: $; R0=FIRST I/O STATUS WORD,%; R2=STARTING AND FINAL ERROR RETRY COUNTS(&; R3=ERROR LOG PACKET APR BIAS IF R4=0'; R4=SCB ADDRESS OR ZERO(; R5=UCB ADDRESS);R *; OUTPUTS:3+; THE ERROR PACKET IS QUEUED TO THE ERROR LOGGER.),; THE ERROR IN PROGRESS BIT IS CLEARED. -;E.; R1 AND R2 ARE DESTROYED./;-0*1$FERL1:: ;FINISH ERROR LOGGING PROCESS234 .IF DF E$$LOG5"6 MOV KISAR6,-(SP) ; SAVE MAPPING7 MOV R3,-(SP) ;SAVE REGISTER8 TST R4 ;DO WE HAVE AN SCB?+9 BEQ 5$ ;IF EQ NO, R3 HAS PACKET ADDRESS24: MOV S.EMB(R4),R3 ;GET ADDRESS OF ERROR LOG PACKET; BEQ 40$ ;IF EQ NO PACKET!<5$: MOV R0,-(SP) ;SAVE REGISTERB = MOV R3,KISAR6 ; MAP TO PACKET3> MOV @#140004+E$HSBF,R1 ; GET SUBPACKET MASK WORD ? MOV R4,-(SP) ;SAVE R4.@ ROR R1 ;HEADER SUBPACKET IS ALWAYS PRESENT?A MOV #E$HLEN+4,R4 ;ACCOUNT FOR THE LINK WORD, THE LENGTH WORD)B ;...AND THE HEADER SUBPACKET LENGTHA*C ROR R1 ;IS THE TASK SUBPACKET PRESENT?D BCC 6$ ;IF CC - NOT PRESENT8E ADD #E$TLEN,R4 ;ACCOUNT FOR THE TASK SUBPACKET LENGTH2F6$: ROR R1 ;IS THE DEVICE ID SUBPACKET PRESENT?G BCC 7$ ;IF CC - NOT PRESENTS=H ADD #E$ILEN,R4 ;ACCOUNT FOR THE DEVICE ID SUBPACKET LENGTH19I7$: ROR R1 ;IS THE DEVICE OPERATION SUBPACKET PRESENT? J BCC 8$ ;IF CC - NOT PRESENTA3K ADD #E$ORTY,R4 ;GET TO THE "RETRY COUNTS" OFFSETF+L ;...IN THE DEVICE OPERATION SUBPACKET.,M ADD #140000,R4 ; POINT R4 TO RETRY COUNTS0N MOV R2,(R4) ;...AND INSERT THE RETRY COUNTS O8$: MOV (SP)+,R4 ;RESTORE R4P TST R2 ;ANY RETRY COUNTS?E(Q BEQ 30$ ; IF EQ DO NOT UPDATE COUNTS>R MOV U.UCBX(R5),KISAR6 ;MAP UCB EXTENSION IN SECONDARY POOLS BEQ 30$ ;IF EQ NO EXTENSIOND*T MOV #ERHC,R2 ;POINT TO HARD ERROR COUNT!U TSTB R0 ;SUCCESSFUL FUNCTION?V BMI 10$ ;IF MI NO W*X MOV #ERSC,R2 ;POINT TO SOFT ERROR COUNTY10$:-Z BITB #ES.LIM,$ERFLA ; IS LIMITING ENABLED?C9[ BEQ 25$ ; IF EQ NO, DON'T TEST LIMITS OR UPDATE COUNTR:\ CMPB (R2),-2(R2) ;IS THE THRESHOLD EQUALED OR EXCEEDED?] BLO 15$ ;IF LO NO ^; J_; THE LIMIT (HARD OR SOFT) HAS ALREADY BEEN REACHED. DISCARD THE PACKET.`;6a MOV R3,KISAR6 ; REMAP PACKET *b MOV R3,R0 ; SET UP FOR DESEC (POINTER))c MOV @#140002, R1 ; GET LENGTH IN BYTEST<d ADD #77+4,R1 ; ACCOUNT FOR LINK AND LENGTH AND TRUNCATION*e ASH #-6,R1 ; CONVERT TO 32 WORD BLOCKS+f CALL $DESEC ; DEALLOCATE SECONDARY POOLA&g BR 37$ ;...AND FINISH THE CLEAN UPh;MJi; THE LIMIT (HARD OR SOFT) HAS NOT BEEN REACHED. UPDATE THE APPROPRIATE j; COUNTER.k;I&l15$: INCB (R2) ;COUNT ANOTHER ERROR-m INCB (R2) ;ADD ONE MORE FOR OVERFLOW TESTEn BNE 20$ ;IF NE NO OVERFLOW$o DECB (R2) ;NORMALIZE ERROR COUNTp20$: DECB (R2) ;...%q CMPB (R2), -2(R2) ; LIMIT REACHED?r BNE 25$ ; BR IF NO&s MOV R3, KISAR6 ; MAP BACK TO PACKET1t BISB #EH$LMR, E$HFLG+140004 ; YES. TELL ERRLOGS!u25$: CMP R2,#ERHC ; HARD ERROR?v BEQ 30$ ; BR IF YESHw MOV R3,KISAR6 ; REMAP PACKETH2x CMPB #E$STMO,E$HTYS+140004 ;WAS THIS A TIMEOUT?4y BEQ 27$ ;IF EQ - YES, SO CONVERT TO SOFT TIMEOUT4z MOVB #E$SDVS, E$HTYS+140004 ; SET SOFT ERROR CODE{ BR 30$ ; GO TO QUEUE PACKETR;|27$: MOVB #E$STMS,E$HTYS+140004 ;MAKE THIS A SOFT TIMEOUT }30$:(~ CALL $QUPK1 ; QUEUE THE ERROR 00‹pcób“_c”_d–_k›’PACKET&37$: MOV (SP)+,R0 ;RESTORE REGISTERS€40$: MOV (SP)+,R3 ;B%� MOV (SP)+,KISAR6 ; RESTORE MAPPINGE‚ƒ .ENDC ; DF E$$LOG„…† TST R4 ;DO WE HAVE AN SCB?‡ BEQ 50$ ;IF EQ NOR7ˆ BIC #S2.EIP,S.ST2(R4) ;CLEAR ERROR IN PROGRESS FLAGI*‰ CLR S.EMB(R4) ;SHOW NO ERROR LOG PACKETŠ50$: RETURN ;‹Œ�;+%Ž; **-$CRPK1-CREATE ERROR LOG PACKET�;0I�; THIS ROUTINE IS CALLED TO CREATE AN ERROR LOG PACKET, EITHER FROM THEFI‘; SEND MESSAGE DIRECTIVE PROCESSING, OR WITHIN THE EXECUTIVE AS PART OFPF’; THE PROCESSING OF A MEMORY ERROR, NONSENSE INTERRUPT, TIME CHANGE,)“; POWER FAIL RECOVERY, OR DEVICE ERROR.”; •; INPUTS:;–; —; R0=PACKET CODE˜; R1=LENGTH OF DATA SUBPACKETS™; R2=CONTROL MASK WORD3š; R3=BEGINNING ADDRESS OF DATA FOR DATA SUBPACKETA'›; R4=TCB ADDRESS (FOR TASK SUBPACKET)8œ; R5=UCB ADDRESS (FOR DEVICE IDENTIFICATION SUBPACKET)�; ž; OUTPUTS:Ÿ;  ; R0=UNCHANGED8¡; R1=BEGINNING ADDRESS OF DATA SUBPACKET DATA (OFFSET)¢; R2=UNCHANGED.£; R3=BEGINNING ADDRESS OF PACKET (APR VALUE)¤; R4=UNCHANGED¥; R5=UNCHANGED¦;§; C=0 IF A PACKET WAS CREATEDE#¨; C=1 IF A PACKET WAS NOT CREATED©; KISAR6 MAPS PACKETª;T«; OUTPUT PACKET FORMAT:2¬;R5­; +-----------------------------------------------+ '®; | RESERVED FOR PACKET LINK WORD |S5¯; +-----------------------------------------------+O5°; | PACKET LENGTH (LENGTH OF REMAINDER OF PACKET) |D5±; +-----------------------------------------------+E²; | HEADER SUBPACKET |B ³; . .´; µ; | |5¶; +-----------------------------------------------+ ·; | OTHER SUBPACKETS | ¸; . .¹; º; | |5»; +-----------------------------------------------+2¼;-½¾¿ .IF DF E$$LOGÀ*Á$CRPK1::MOV R5,-(SP) ;SAVE ALL REGISTERS MOV R4,-(SP) ;...à MOV R3,-(SP) ;...Ä MOV R2,-(SP) ;...Å MOV R1,-(SP) ;...Æ MOV R0,-(SP) ;...ÇÈ;DBÉ; CHECK FOR TYPE OF SUBPACKET. NOTE THAT THERE WILL ALWAYS BE AAÊ; HEADER SUBPACKET. AN EXTRA 4 BYTES IS ADDED TO THE LENGTH OF|@Ë; THE HEADER SUBPACKET TO ACCOUNT FOR THE PRECEEDING LINK WORDÌ; AND PACKET LENGTH.Í(Î ROR R2 ;BYPASS HEADER SUBPACKET FLAGÏ BCS 5$ ;IF CS IT'S THERE7Ð BGCK$A BF.ERR,BE.HSP,FATAL ;HEADER SUBPACKET PROBLEM::Ñ5$: MOV #E$HLEN+4,R1 ;ADD IN THE LENGTH OF THE SUBPACKET&Ò ROR R2 ;CHECK FOR A TASK SUBPACKET$Ó BCC 10$ ;IF CC NO TASK SUBPACKET.Ô ADD #E$TLEN,R1 ;ADD IN THE SUBPACKET LENGTH/Õ10$: ROR R2 ;CHECK FOR A DEVICE ID SUBPACKETB)Ö BCC 20$ ;IF CC NO DEVICE ID SUBPACKETE.× ADD #E$ILEN,R1 ;ADD IN THE SUBPACKET LENGTH0Ø20$: ROR R2 ;CHECK FOR A DEVICE OP. SUBPACKET*Ù BCC 30$ ;IF CC NO DEVICE OP. SUBPACKET.Ú ADD #E$OLEN,R1 ;ADD IN THE SUBPACKET LENGTHÛÜ;,)Ý; CHECK FOR A DEVICE ACTIVITY SUBPACKET Þ;EGß; IF THERE IS A DEVICE ACTIVITY SUBPACKET, THERE WILL BE ONE ENTRY INSEà; THE SUBPACKET FOR EACH ACTIVE DEVICE (LESS ONE IF THERE IS ALSO AICá; DEVICE OPERATION SUBPACKET) PLUS THE PREFIX HEADER LENGTH WORD.Eâ;ã5ä30$: ROR R2 ;CHECK FOR A DEVICE ACTIVITY SUBPACKET /å BCC 60$ ;IF CC NO DEVICE ACTIVITY SUBPACKETC<æ BIT #SM.DOP,4(SP) ;IS THERE A DEVICE OPERATION SUBPACKET?ç BNE 35$ ;IF EQ NOLè CLR R5 ;CLEAR FOR NO UCB&é35$: MOV R5,R0 ;SAVE FOR COMPARISON.ê MOV #$SCDVT,-(SP) ;SETUP FOR COROUTINE CALL%ë40$: CALL @(SP)+ ;GET THE NEXT UCBEì BCS 50$ ;IF CS NO MORE%í MOV S.ST2(R4),R3 ;COPY STATUS BITSHî COM R3 ;REVERSE THEM7ï BIT #S2.LOG!S2.ACT,R3 ;ACTIVE ERROR LOGGING DEVICE?Eð BNE 40$ ;IF NE NORñ CMP R5,R0 ;IS THIS OUR UCB?U)ò BEQ 40$ ;IF EQ YES, IGNORE THIS ENTRYV%ó ADD #E$ALEN,R1 ;YES, COUNT THE I/OSô BR 40$ ;LOOP2õ50$: ADD #2,R1 ;ADD IN THE LENGTH OF THE PREFIXö÷; ø; CHECK FOR A DATA SUBPACKETù;Oú*û60$: ROR R2 ;CHECK FOR A DATA SUBPACKET$ü BCC 70$ ;IF CC NO DATA SUBPACKET3ý ADD 2(SP),R1 ;ADD IN THE LENGTH OF THE SUBPACKETS,þ ADD #2,R1 ;ADD IN THE PREFIX LENGTH WORDÿ;; ALLOCATE THE PACKET ;V770$: CMP #512.,R1 ;I00‹xcZcÝb`TADATADATADATADATADATAS THE PACKET A REASONABLE LENGTH?0 BLO 75$ ;IF LO NO;4(; CONVERT FROM BYTES TO 32 WORD BLOCKS;L!  MOV R1,-(SP) ; SAVE BYTE VALUE0*  ADD #77,R1 ; COMPENSATE FOR TRUNCATION  ASH #-6,R1 ; CONVERT)  CALL $ALSEC ; ALLOCATE SECONDARY POOL$  MOV (SP)+,R1 ; RESTORE BYTE VALUE BCC 80$ ;IF CC WE GOT IT975$: CALLR PKTXIT ;FAILURE, RESTORE REGISTERS AND EXITE480$: MOV R0,-(SP) ;SAVE THE ADDRESS FOR FUTURE USE/ MOV 14(SP),R5 ;RETRIEVE POSSIBLE UCB ADDRESSC;R; CREATE THE PACKETO; ; AT THIS POINT:; ;; R0=ADDRESS OF ALLOCATED BLOCK (TO BE USED AS APR VALUE) ; R1=LENGTH OF ALLOCATED BLOCK; R2=UNDEFINED; R3=UNDEFINED; R4=UNDEFINED; R5=UCB ADDRESS;  7!; AFTER SAVING THE APR6 MAPPING ON THE STACK WE HAVE: ";V4#; 0(SP) SAVED APR6 MAPPING (WILL NOT BE RESTORED),$; 2(SP) SAVED APR BIAS OF ALLOCATED BLOCK%; 4(SP) SAVED ENTRY CODE &&; 6(SP) SAVED DATA SUBPACKET LENGTH"'; 10(SP) SAVED CONTROL WORD MASK(; 12(SP) SAVED DATA ADDRESS); 14(SP) SAVED TCB ADDRESS*; 16(SP) SAVED UCB ADDRESS+; ,;E- .CREPKT:L-/ MOV KISAR6,-(SP) ; SAVE APR6 ON THE STACKU0;N 1 MOV R0,KISAR6 ; MAP TO PACKET2 MOV #140000,R0 ; USE APR 6#3 CLR (R0)+ ; SETUP THE LINK WORD 14 SUB #4,R1 ;THE DATA LENGTH IS LESS THE HEADER )5 MOV R1,(R0)+ ;PUT IN THE PACKET LENGTHS16 MOV #E$HLEN,(R0)+ ;PUT IN THE SUBPACKET LENGTHE17 MOV 10(SP),R2 ;GET THE SAVED CONTROL MASK WORD-8 MOV R2,(R0)+ ;INSERT IT INTO THE SUBPACKETS09 MOV #6+,(R0)+ ;INSERT M-PLUS CODE1: MOV $SYSID,(R0)+ ;INSERT SYSTEM IDENTIFICATIONP; MOV $SYSID+2,(R0)+ ;...<=;6@>; INSERT THE FLAGS WORD, THE ENTRY AND ERROR SEQUENCE NUMBERS,=?; AS WELL AS THE ENTRY CODE, TIME STAMP, PROCESSOR AND URM.S@;,A<B MOV #EH$NOR!<*400>,R3 ;CREATE FLAGS-C BIT #HF.QB,$HFMSK ;IS THIS A Q-BUS SYSTEM?ND BEQ 5$ ;IF EQ NO, SO GO ON0E BIS #,R3;YES, SO SET THE FLAG BIT/F5$: MOV R3,(R0)+ ;NOW PUT IT IN THE SUBPACKET#$G INC $ENTSQ ;COUNT THE NEXT ENTRYH MOV $ENTSQ,(R0)+ ;WRITE IT 4I MOV $ERRSQ,(R0)+ ;PUT IN THE ERROR SEQUENCE COUNT:J MOV 4(SP),(R0)+ ;PUT IN THE ENTRY TYPE CODE AND SUBCODE:K MOV #$TTNS-<6*2>,R3 ;GET THE POINTER TO THE SYSTEM TIME5L MOV #6,R1 ;GET THE NUMBER OF PARAMETERS TO INSERTE:M10$: MOVB (R3)+,(R0)+ ;INSERT THE ITEM IN THE TIME STAMP"N TSTB (R3)+ ;POINT AT NEXT ITEM O SOB R1,10$ ;LOOP UNTIL DONE.6P MOVB $PRMOD,(R0)+ ;PUT IN THE PROCESSOR INFORMATION'Q CLRB (R0)+ ;CLEAR THE RESERVED BYTE RST .IF DF M$$PROU'V MOV @$CPURM,(R0)+ ;GET PROCESSOR URMRWX .IFF ; DF M$$PROUYZ MOV #1,(R0)+ ;ASSUME CPAU[\ .ENDC ; DF M$$PRO]^+_ ROR R2 ;DISCARD THE FLAG FOR THE HEADERO`a;Eb; CREATE THE TASK SUBPACKETNc; d;Re; AT THIS POINT:f;:4g; R0=POINTER TO NEXT FREE ENTRY IN ALLOCATED BLOCKh; R1=UNDEFINED)i; R2=CONTROL MASK WORD, SHIFTED RIGHT 1Lj; R3=UNDEFINEDk; R4=UNDEFINEDl; R5=UCB ADDRESSm;Nn4oCRETSK: ROR R2 ;CHECK THE FLAG FOR TASK SUBPACKET'p BCC CREDID ;IF CC NO TASK SUBPACKET 1q MOV #E$TLEN,(R0)+ ;PUT IN THE SUBPACKET LENGTHV+r MOV 14(SP),R1 ;GET THE SAVED TCB ADDRESSP*s CALL CRTASP ;CREATE THE TASK SUBPACKETtu;E.v; CREATE THE DEVICE IDENTIFICATION SUBPACKETw;x; AT THIS POINT:y;4z; R0=POINTER TO NEXT FREE ENTRY IN ALLOCATED BLOCK{; R1=UNDEFINED)|; R2=CONTROL MASK WORD, SHIFTED RIGHT 2 }; R3=UNDEFINED~; R4=UNDEFINED; R5=UCB ADDRESS€;�2‚CREDID: ROR R2 ;IS THERE A DEVICE ID SUBPACKET?ƒ BCC CREDOP ;IF CC NO)„ MOV U.SCB(R5),R4 ;RETRIEVE SCB ADDRESS;8… MOV #E$ILEN,(R0)+ ;INSERT THE LENGTH OF THE SUBPACKET*† CALL CRDEVP ;CREATE DEVICE INFORMATION5‡ BIT #DV.DIR,U.CW1(R5) ;IS THIS A DIRECTORY DEVICE?I)ˆ BEQ 5$ ;IF EQ NO, DON'T INTERPRET VCB:-‰ MOV U.VCB(R5),R3 ;GET A POINTER TO THE VCBLŠ BNE 15$ ;IF NE VCB EXISTSB‹5$: MOV #/2,R3 ;GET THE NUMBER OF WORDS TO CLEAR9Œ10$: CLR (R0)+ ;CLEAR OUT THE VOLUME NAME AND00‹€cób“_c”_d–_k›’ PACK ID. (� SOB R3,10$ ;LOOP UNTIL DONE CLEARING,Ž BR 30$ ;DONE WITH THE VOLUME INFORMATION)�15$: ADD #V.LABL,R3 ;POINT AT THE LABELT>� MOV #/2,R1 ;GET THE NUMBER OF WORDS TO MOVE8‘20$: MOV (R3)+,(R0)+ ;TRANSFER VOLUME NAME AND PACK ID’ SOB R1,20$ ;LOOP UNTIL DONE'*“ BIT #DV.SQD,U.CW1(R5) ;IS THIS A DISK?” BEQ 30$ ;IF EQ YES4• CMP -(R0),-(R0) ;NO, BACKUP TO PACK SERIAL NUMBER'– CLR (R0)+ ;CLEAR PACK SERIAL NUMBERR— CLR (R0)+ ;....˜30$: MOV #1,(R0)+ ;ALL DEVICES ARE OF TYPE 16™ MOV U.CW3(R5),(R0)+ ;GET LOW ORDER BLOCKS IN DEVICE8š MOVB U.CW2(R5),(R0)+ ;GET HIGH ORDER BLOCKS IN DEVICE› CLRB (R0)+ ;œ�;-Až; INSERT THE I/O COUNT INFORMATION AND CLEAR THEM IF REQUESTED.0>Ÿ; NOTE THAT THIS INFORMATION IS IN SECONDARY POOL AND MAY OR ; MAY NOT BE PRESENT.C¡;)¢>£ MOV U.UCBX(R5),KISAR6 ;MAP UCB EXTENSION IN SECONDARY POOL¤ BEQ 35$ ;IF EQ NO EXTENSIONC¥;0@¦; MAP TO UCB EXTENSION, SAVE COUNTS ON THE STACK THEN MAP BACK#§; TO ERROR PACKET AND FILL IT IN.M¨;C*© MOV #IOC+20, R1 ; GET END OF I/O COUNTS'ª MOV -(R1),-(SP) ; SAVE THE LOW ORDER <« MOV -(R1),-(SP) ; SAVE HIGH ORDER CYLINDERS CROSSED COUNT#¬ MOV -(R1),-(SP) ; SAVE LOW ORDERF<­ MOV -(R1),-(SP) ; SAVE HIGH ORDER BLOCKS TRANSFERED COUNT4® MOV -(R1),-(SP) ; SAVE SOFT AND HARD ERROR COUNTS#¯ TST -(R1) ; BYPASS ERROR LIMITSN#° MOV -(R1),-(SP) ; SAVE I/O COUNTI± MOV -(R1),-(SP) ;...(² BIT #SM.ZER,26(SP) ; ZERO THE COUNTS?³ BEQ 33$ ; IF EQ NO´ CLR (R1)+ ;CLEAR THE COUNTSNµ CLR (R1)+ ;...¶ TST (R1)+ ;...· CLR (R1)+ ;...¸ CLR (R1)+ ;...¹ CLR (R1)+ ;...º CLR (R1)+ ;...» CLR (R1)+ ;...(¼33$: MOV 20(SP), KISAR6 ; REMAP PACKET&½ MOV #7,R3 ; MOVE 7 ITEMS TO PACKET¾34$: MOV (SP)+,(R0)+ ; GOC¿ SOB R3,34$ ;...S"À BR 40$ ;JOIN COMMON CODE BELOW:Á35$: ADD #16,R0 ;UPDATE POINTER. NOTE: A FLAG IS SET BY, ;...CRDEVP TO INDICATE THE DATA IN THE3à ;...UCB EXTENSION AREA IS INVALID. IT IS DONE 2Ä ;...THERE RATHER THAN HERE FOR GENERALITY AS%Å ;...OTHER ROUTINES CALL CRDEVP.(%Æ40$: MOV 2(SP), KISAR6 ; MAP PACKET(ÇÈ;.)É; CREATE THE DEVICE OPERATION SUBPACKETÊ;MË; AT THIS POINT:Ì; 4Í; R0=POINTER TO NEXT FREE ENTRY IN ALLOCATED BLOCKÎ; R1=UNDEFINED)Ï; R2=CONTROL MASK WORD, SHIFTED RIGHT 3NÐ; R3=UNDEFINEDÑ; R4=UNDEFINEDÒ; R5=UCB ADDRESSÓ; Ô2ÕCREDOP: ROR R2 ;CHECK FOR PRESENCE OF SUBPACKET'Ö BCC CREIOA ;IF CC NO SUCH SUBPACKETN)× MOV U.SCB(R5),R4 ;RETRIEVE SCB ADDRESST1Ø MOV #E$OLEN,(R0)+ ;INSERT THE SUBPACKET LENGTHS/Ù MOV S.PKT(R4),R1 ;GET THE I/O PACKET POINTERC(Ú MOV I.TCB(R1),R1 ;GET THE TCB POINTER,Û CALL CRTASP ;INSERT THE TASK INFORMATION2Ü CALL CRIOPP ;INSERT THE I/O PACKET INFORMATION%Ý CLR (R0)+ ;NO CURRENT RETRY COUNTMÞß; à; I/O ACTIVITY SUBPACKETá;Dâ; AT THIS POINT:ã;54ä; R0=POINTER TO NEXT FREE ENTRY IN ALLOCATED BLOCKå; R1=UNDEFINED)æ; R2=CONTROL MASK WORD, SHIFTED RIGHT 4Nç; R3=UNDEFINEDè; R4=UNDEFINEDé; R5=UCB ADDRESSê;(ë6ìCREIOA: ROR R2 ;CHECK FOR AN I/O ACTIVITY SUBPACKET/í BCC CREDAT ;IF CC NO I/O ACTIVITY SUBPACKETTîï;PFð; THE LENGTH OF THE I/O ACTIVITY SUBPACKET WILL BE COMPUTED WHEN THEEñ; ENTIRE SUBPACKET HAS BEEN CREATED. SAVE THE BEGINNING ADDRESS OFM!ò; THE SUBPACKET FOR FUTURE USE.Kó;ô5õ MOV R0,-(SP) ;SAVE THE BEGINNING SUBPACKET ADDRESSN5ö CLR (R0)+ ;GET RID OF ANYTHING IN THE LENGTH WORDL-÷ MOV R5,R2 ;SAVE UCB ADDRESS FOR REFERENCE2ø MOV #$SCDVT,-(SP) ;SETUP FOR THE COROUTINE CALL(ù10$: CALL @(SP)+ ;GET THE NEXT DEVICEú BCS 20$ ;IF CS DONE;%û MOV S.ST2(R4),R3 ;COPY STATUS BITSü COM R3 ;TOGGLE THEM 7ý BIT #S2.LOG!S2.ACT,R3 ;ACTIVE ERROR LOGGING DEVICE?Iþ BNE 10$ ;IF NE NORÿ CMP R5,R2 ;IS THIS OUR UCB?S! BEQ 10$ ;IF EQ YES, IGNORE ITU. CALL CRDEVP ;CREATE THE DEVICE INFORMATION+ MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSD/ MOV I.TCB(R1),R1 ;GET THE TASK'S TCB ADDRESSS, CALL CRTASP ;CREATE THE TASK INFORMATION000‹ˆcZcÝb`TADATADATADATADATADATA TST -(R0) ;POINT BACK TO THE TI: UNIT NUMBER: MOVB (R0),E$ATIU-E$AFNC(R0) ;INSERT THE TI: UNIT NUMBER2 CALL CRIOPP ;CREATE THE I/O PACKET INFORMATION BR 10$ ;LOOP UNTIL DONEC 5 20$: MOV R0,R2 ;COPY THE CURRENT SUBPACKET ADDRESSR-  SUB (SP),R2 ;COMPUTE THE SUBPACKET LENGTH ;  MOV R2,@(SP)+ ;INSERT THE LENGTH IN THE SUBPACKET PREFIXF ;; CREATE THE DATA SUBPACKETC;D; AT THIS POINT:;R4; R0=POINTER TO NEXT FREE ENTRY IN ALLOCATED BLOCK; R1=UNDEFINED; R2=UNDEFINED; R3=UNDEFINED; R4=UNDEFINED; R5=UNDEFINED;$:CREDAT: BIT #SM.DAT,10(SP) ;DO WE HAVE A DATA SUBPACKET? BEQ 20$ ;IF EQ NON. MOV 6(SP),R3 ;GET THE DATA SUBPACKET LENGTH5 MOV R3,(R0) ;PUT IN THE LENGTH OF THE DATA ITSELF,3 ADD #2,(R0)+ ;ADD IN THE SUBPACKET HEADER LENGTH;7  BIT #SM.MBC,10(SP) ;MASSBUS RHBAE REGISTERS PRESENT? ! BEQ 5$ ;IF EQ NO." SUB #4,R3 ;YES, THEY MAY NOT BE CONTIGUOUS/#5$: MOV R0,-(SP) ;SAVE SUBPACKET DATA ADDRESS1'$ MOV 14(SP), R2 ;GET THE DATA ADDRESSF% BEQ 15$ ;IF EQ, NO DATA5'& MOV R3,R0 ;GET NUMBER BYTES TO MOVEA%' MOV 2(SP),R1 ;DATA BUFFER APR BIAS(;QB); IF THE DATA BUFFER IS MAPPED THROUGH ANY APR'S BUT 5 OR 6, THED*; MAPPING WILL BE TRANSPARENT TO BLXIO. HOWEVER, IF IT'S IN APR6,B+; WE MUST CONVERT IT TO USE 5 AND IF IT'S IN 5, WE MUST RETRIEVE,,; THE SAVED APR5 MAPPING TO PASS TO BLXIO.-;'. CMP #160000,R2 ;IS DATA IN I/O PAGE?O/ BLOS 10$ ;IF YES, BRANCH)0 CMP #140000,R2 ;IS IT LOWER THAT APR6?G1 BHI 7$ ;SEE IF IT'S IN APR5 02 SUB #20000, R2 ;CONVERT APR6 ADDRESS TO APR5 3 BR 10$ ;AND CONTINUE'47$: CMP #120000, R2 ;IS THIS IN APR5?D5 BHI 10$ ;BR IF NOT6;AK7; WARNING: THIS STATEMENT REACHES OUT OF THIS MODULE'S "KNOWN" STACK AREA >8; TO GET THE APR5 MAPPING WHICH WAS SAVED BY ANOTHER MODULE:9;E29 MOV 40(SP),R1 ;ELSE, GET THE SAVED APR5 MAPPING*;10$: MOV 4(SP),R3 ;GET MAPPING TO PACKET< MOV (SP),R4 ;ADDR OF BUFFERS= CALL $BLXIO ;MOVE DATA> MOV R4,R0 ;UPDATE POINTERI7? BIT #SM.MBC,12(SP) ;MASSBUS RHBAE REGISTERS PRESENT?R@ BEQ 15$ ;IF EQ NOB!A MOV 20(SP),R5 ;GET UCB ADDRESS0$B MOV U.SCB(R5),R4 ;GET SCB ADDRESS,C MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESSD MOV R3,R2 ;COPY KRB ADDRESSN'E ADD K.OFF(R3),R2 ;POINT TO UCB TABLEP+F MOV KE.RHB(R2),R2 ;RETREIVE RHBAE OFFSETG MOV 2(SP),KISAR6 ;MAP DATA *H ADD 14(SP),R2 ;FORM AN I/O PAGE ADDRESS'I MOV 2(R2),-(SP) ;COPY BOTH REGISTERS J MOV (R2),-(SP) ;...#K MOV 10(SP), KISAR6 ;REMAP PACKET ,L MOV (SP)+,(R0)+ ;MOVE REGISTERS TO PACKET,M MOV (SP)+,(R0)+ ;MOVE REGISTERS TO PACKET-N15$: MOV (SP)+,R1 ;GET SUBPACKET DATA ADDR.B%O20$: CLC ;PACKET COULD BE CREATEDR&P TST (SP)+ ;DISCARD MAPPING TO DATA+Q MOV (SP)+,R3 ;RESTORE THE PACKET ADDRESS .RPKTXIT: MOV (SP)+,R0 ;RESTORE THE ENTRY CODE0S INC (SP)+ ;DISCARD THE DATA SUBPACKET LENGTH.T MOV (SP)+,R2 ;RESTORE THE CONTROL MASK WORD'U INC (SP)+ ;DISCARD THE DATA ADDRESS(V MOV (SP)+,R4 ;RESTORE THE TCB ADDRESS(W MOV (SP)+,R5 ;RESTORE THE UCB ADDRESSX RETURN ;DONETYZ[;+%\; **-CRTASP-CREATE TASK INFORMATION:];(?^; CREATES THE FOLLOWING INFORMATION IN THE CURRENT SUBPACKET: _;E5`; +-----------------------------------------------++a; | TASK NAME IN RAD50 | b; | |5c; +-----------------------------------------------+Ad; | TASK UIC |5e; +-----------------------------------------------+f; | TASK TI: DEVICE NAME |D5g; +-----------------------+-----------------------+V&h; | FLAGS | TASK TI: UNIT NUMBER |5i; +-----------------------+-----------------------+ j;M k; FLAGS:l; ET$PRV TASK IS PRIVILEGED"m; ET$PRI TERMINAL IS PRIVILEGEDn; o; INPUTS:-)p; R0=POINTER TO SUBPACKET FOR INSERTIONq; R1=POINTER TO TASK TCBr; s; OUTPUTS:t; R0=UPDATEDu; R1 AND R3 ARE DESTROYED-v; R4 AND R5 ARE PRESERVEDw;-x!yCRTASP: SAVNR ;SAVE R4 AND R5-,z MOV T.NAM(R1),(R0)+ ;PUT IN THE TASK NAME{ MOV T.NAM+2(R1),(R0)+ ;...-| MOV T.PCB(R1),R00‹�cób“_c”_d–_k›’4 ;GET A POINTER TO THE PCBI2} BIT #PS.OUT!PS.CKP,P.STAT(R4) ;TASK IN MEMORY ?)~ BEQ 2$ ;IF EQ, YES - UIC IS AVAILABLER( CLR (R0)+ ;OTHERWISE, ASSUME UIC 0,0 € BR 7$ ;D�2$: ;REFERENCE LABEL0‚ƒ„ .IF DF X$$HDR….† MOV KISAR6,-(SP) ;SAVE CURRENT APR6 MAPPING0‡ MOV P.HDR(R4),R5 ;GET A POINTER TO THE HEADERˆ BNE 5$ ;IF NE IT'S RESIDENT;‰ MOV P.REL(R4),KISAR6;SET APR6 MAPPING TO EXTERNAL HEADER)"Š MOV #140000,R5 ;SET TO MAP APR6‹;M5Œ;SAVE UIC AND REMAP PACKET AND INSERT UIC IN PACKETT�; 'Ž5$: MOV H.CUIC(R5),R5 ; SAVE THE UICA-� MOV (SP)+, KISAR6 ; RESTORE PACKET MAPPING � MOV R5,(R0)+ ; INSERT UIC‘’ .IFF ; DF X$$HDR“0” MOV P.HDR(R4),R4 ;GET A POINTER TO THE HEADER&• MOV H.CUIC(R4),(R0)+;INSERT THE UIC–— .ENDC ; DF X$$HDR˜™š7$: ;REFERENCE LABEL ,› MOV T.UCB(R1),R5 ;GET THE TI: UCB POINTER4œ10$: MOV U.RED(R5),R5 ;FOLLOW THE REDIRECT POINTER.� CMP R5,U.RED(R5) ;IS THE DEVICE REDIRECTED?ž BNE 10$ ;IF NE YES,Ÿ MOV U.DCB(R5),R3 ;GET THE TI: DCB POINTER.  MOV D.NAM(R3),(R0)+ ;INSERT THE DEVICE NAME(¡ CALL CALDEV ;CALCULATE DEVICE UNIT #'¢ CLRB (R0) ;INITIALIZE THE FLAG BYTEX1£ BIT #U2.PRV,U.CW2(R5) ;IS THE TI: PRIVILEGED?H¤ BEQ 20$ ;IF EQ NO(-¥ BISB #ET$PRI,(R0) ;MARK THE TI: PRIVILEGEDH6¦20$: BIT #T3.PRV,T.ST3(R1) ;IS THE TASK PRIVILEGED?§ BEQ 25$ ;IF EQ NOI.¨ BISB #ET$PRV,(R0) ;MARK THE TASK PRIVILEGED-©25$: TSTB (R0)+ ;POINT PAST THE FLAG ENTRYRª RETURN ;DONE1«¬­;+'®; **-CRDEVP-CREATE DEVICE INFORMATIONI¯;?°; CREATES THE FOLLOWING INFORMATION IN THE CURRENT SUBPACKET:C±;A5²; +-----------------------------------------------+T&³; | LOGICAL DEVICE NAME MNEMONIC |5´; +-----------------------+-----------------------+,.µ; | CONTROLLER NUMBER | DEVICE UNIT NUMBER |5¶; +-----------------------+-----------------------+ ,·; | PHYSICAL SUBUNIT # | PHYSICAL UNIT # |5¸; +-----------------------+-----------------------+R'¹; | PHYSICAL DEVICE NAME MNEMONIC |*5º; +-----------------------------------------------+H»; | RESERVED | FLAGS |E5¼; +-----------------------+-----------------------+-½;- ¾; INPUTS:-¿; R0=POINTER TO DATA AREANÀ; R4=SCB ADDRESSÁ; R5=UCB ADDRESSÂ;- Ã; OUTPUTS:Ä; R0=UPDATEDÅ; R1 AND R3 ARE DESTROYEDEÆ; R4 AND R5 ARE PRESERVED-Ç;-È!ÉCRDEVP: SAVNR ;SAVE R4 AND R5 Ê CLR -(SP) ;CLEAR FLAG WORD-Ë MOV U.DCB(R5),R3 ;GET A POINTER TO OUR DCB-0Ì TST U.UCBX(R5) ;DOES THE UCB EXTENSION EXIST?Í BNE 10$ ;IF NE - YES?Î BIS #EI$NUX,(SP) ;INDICATE ANY UCB EXTENSION DATA IS INVALID >Ï10$: MOV D.NAM(R3),(R0)+ ;PUT IN THE LOGICAL DEVICE MNEMONIC(Ð CALL CALDEV ;CALCULATE DEVICE UNIT #,Ñ MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESSÒ BEQ 15$ ;IF EQ - NO KRBT*Ó MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX!Ô15$: ASRB R3 ;MAKE IT A NUMBERE)Õ MOVB R3,(R0)+ ;INSERT CONTROLLER INDEX 5Ö MOVB U.UNIT(R5),(R0)+;GET THE PHYSICAL UNIT NUMBER (× CLRB (R0)+ ;CLEAR THE SUBUNIT NUMBER5Ø BITB #S3.SLV,S.ST3(R4) ;IS THERE ANY SLAVE UNITS?NÙ BEQ 20$ ;IF EQ NOC6Ú MOVB U.SNUM(R5),-1(R0) ;YES, INSERT SUBUNIT NUMBER3Û BIS #EI$SUB,(SP) ;FLAG AS A SUBCONTROLLER DEVICE ÜÝ;E>Þ; GET THE PHYSICAL CONTROLLER NAME BY SCANNING THE CTB LIST.ß;1à2á20$: MOV #$CTLST,R3 ;GET ADDRESS OF CTB LISTHEAD-â25$: MOV (R3),R3 ;GET THE NEXT CTB ADDRESSã BNE 30$ ;IF NE WE GOT ONEE)ä MOV U.DCB(R5),R3 ;ELSE GET DCB ADDRESSP8å MOV D.NAM(R3),(R0)+ ;USE DCB NAME FOR CONTROLLER NAME æ BR 55$ ;1ç30$: MOV L.DCB(R3),R1 ;GET DCB POINTER FROM CTBBBè BITB #LS.CIN,L.STS(R3) ;IS THIS A COMMON INTERRUPT CONTROLLER?,é BNE 40$ ;IF NE YES, SEARCH TABLE FOR DCB-ê CMP R1,U.DCB(R5) ;IS THIS THE CORRECT CTB?Cë BNE 25$ ;IF NE NO, LOOPEì BR 50$ ;IT MUST BE0í40$: TST (R1)+ ;SKIP COMMON INTERRUPT ADDRESS/î45$: TST (R1) ;IS THIS THE END OF THE TABLE?ï BEQ 25$ ;IF EQ YES3ð CMP (R1)+,U.DCB(R5) ;DOES THE DCB MATCH OUR DCB?Mñ BNE 45$ ;IF NE NO ;ò50$: MOV L.NAM(R3),(R0)+ ;INSERT PHYSICAL CONTROLLER NAMER00‹˜cZcÝb`TADATADATADATADATADATA!ó55$: MOV (SP)+,(R0)+ ;SET FLAGS ô RETURN ;.õö÷;+*ø; **-CRIOPP-INSERT I/O PACKET PARAMETERSù;I0ú; INSERTS THE FOLLOWING I/O PACKET PARAMETERS:û; 5ü; +-----------------------------------------------+ý; | I/O FUNCTION CODE |5þ; +-----------------------+-----------------------+1ÿ; | RESERVED | FLAGS |B5; +-----------------------+-----------------------+O$; | TRANSFER OPERATION ADDRESS | ; | |5; +-----------------------------------------------+N'; | TRANSFER OPERATION BYTE COUNT |5; +-----------------------------------------------+P; ; INPUTS: ; R0=POINTER TO SUBPACKET DATA ; R4=SCB ADDRESS ; R5=UCB ADDRESS ;- ; OUTPUTS: ; R0=UPDATED; R1 AND R3 ARE DESTROYED ; R4 AND R5 ARE PRESERVED-;-%CRIOPP: MOV R2,-(SP) ;SAVE REGISTER + MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS-& MOV I.FCN(R1),R3 ;GET FUNCTION CODE MOV R3,(R0)+ ;INSERT IT! CLR (R0) ;SETUP FOR THE FLAGS-;-/; OBTAIN A MASK BIT FOR THE I/O FUNCTION CODEN;( MOV U.DCB(R5),R1 ;GET THE DCB POINTER2 ADD #D.MSK+2,R1 ;AND POINT TO THE FUNCTION MASK CLRB R3 ;CLR MODIFIER FLAGS* SWAB R3 ;PUT FUNCTION CODE IN LOW BYTE5  CMP R3,#15. ;IS THE FUNCTION IN THE SECOND MASKS? +! BLOS 10$ ;IF LOS FUNCTION IN FIRST MASKS," SUB #16.,R3 ;NORMALIZE THE FUNCTION CODE'# ADD #8.,R1 ;POINT TO THE SECOND SETG/$10$: ASL R3 ;MAKE FUNCTION CODE A WORD INDEXC?% MOV $BTMSK(R3),R3 ;GET BIT THAT CORRESPONDS TO FUNCTION CODEO&'; 9(; SEE IF THE FUNCTION IS OTHER THAN A TRANSFER FUNCTIONP);R**+ BIT R3,(R1)+ ;IS IT A CONTROL FUNCTION?, BNE 20$ ;IF NE YES)- BIT R3,(R1)+ ;IS IT A NOOPED FUNCTION?O. BNE 20$ ;IF NE YES'/ BIT R3,(R1)+ ;IS IT AN ACP FUNCTION?S0 BNE 20$ ;IF NE YES01 BIS #EO$TRA,(R0) ;FLAG AS A TRANSFER FUNCTION23;F4; INSERT THE OTHER FLAGS5;N62720$: BITB #UC.NPR,U.CTL(R5) ;IS IT A DMA DEVICE?8 BEQ 40$ ;IF EQ NO$)9 BIS #EO$DMA,(R0) ;FLAG AS A DMA DEVICEU,: MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS;; BIT #KS.MBC!KS.EXT,K.STS(R3) ;22-BIT ADDRESSING DEVICE?)< BEQ 35$ ;IF EQ NOT7= BIS #EO$EXT,(R0) ;FLAG AS EXTENDED ADDRESSING DEVICEO:>35$: BITB #S3.SIP,S.ST3(R4) ;IS THE DEVICE POSITIONING?? BEQ 40$ ;IF EQ NOE@40$: MOV S.PKT(R4),R2 ; GET THE POINTER TO THE I/O PACKETCA BIT #1,I.IOSB+4(R2) ; TEST IF THIS IS AN INTERNAL I/O PACKET.B BEQ 41$ ; IF EQ NO<C BIS #EO$IIO,(R0) ; THEN SET THE BIT TO INDICATE IT7D41$: MOV (R0)+,R1 ; GET COPY OF FLAG WORD B2E BIT #EO$EXT,R1 ;DO WE HAVE AN EXTENDED ADDRESS?F BNE 70$ ;IF NE YES(G BIT #EO$DMA,R1 ;IS THIS A DMA DEVICE?H BEQ 90$ ;IF EQ NOIJ; 4K; INSERT THE TRANSFER OPERATION ADDRESS AND LENGTHL; M(N ADD K.OFF(R3),R3 ;POINT TO UMR AREA+2.O MOV -(R3),2(R0) ;INSERT LOW BITS OF ADDRESS0P MOVB -(R3),(R0)+ ;INSERT HIGH BITS OF ADDRESS"Q CLRB (R0)+ ;FORGET ANY GARBAGE"R TST (R0)+ ;POINT PAST LOW BITS S BR 100$ ;I8T70$: MOVB U.BUF+1(R5),(R0);ASSUME HIGH BITS ARE IN UCB:U BIT #KS.EXT,K.STS(R3) ;IS THIS A 22-BIT UNIBUS DEVICE?V BEQ 80$ ;IF EQ NOY+W MOV S.PKT(R4),R2 ;GET I/O PACKET ADDRESS0X MOV I.PRM+6(R2),(R0);GET HIGH BITS OF ADDRESS(Y80$: BIC #^C<377>,(R0)+ ;CLEAR GARBAGEZ BR 95$ ;GO GET LOW BITSI6[90$: MOV U.BUF(R5),(R0)+ ;STORE HIGH BITS OF ADDRESS8\95$: MOV U.BUF+2(R5),(R0)+ ;STORE LOW BITS OF ADDRESS3]100$: MOV U.CNT(R5),(R0)+ ;MOVE IN THE BYTE COUNTP!^ MOV (SP)+,R2 ;RESTORE REGISTER _ RETURN ;U`a;+*b; **-CALDEV-CALCULATE DEVICE UNIT NUMBERc;S;d; THIS ROUTINE WILL CALCULATE THE LOGICAL UNIT NUMBER FORNe; THE GIVEN UCB.f;G g; INPUTS: h; R0=POINTER TO PACKET DATA0i; R3=DCB ADDRESSj; R5=UCB ADDRESSk;7 l; OUTPUTS:+m; UNIT NUMBER STORED IN NEXT PACKET BYTE.:n;-o!pCALDEV: SAVNR ;SAVE R4 AND R5E1q SUB D.UCB(R3),R5 ;COMPUTE RELATIVE UCB ADDRESSF$r CLR R4 ;GET READY FOR THE DIVIDE2s DIV D.UCBL(R3),R4 ;COMPUTE REALTIVE UNIT NUMBER2t ADD D.UNIT(R3),R4 ;CO00‹ cób“_c”_d–_k›’MPUTE ABSOLUTE UNIT NUMBER'u MOVB R4,(R0)+ ;STORE IN ERROR PACKETS v RETURN ;Awxy;+/z; **-$CREQ1-CREATE AND QUEUE ERROR LOG PACKET{;NE|; THIS ROUTINE CREATES AND QUEUES ERROR LOG PACKET. IT USES $CRPK1AG}; AND $QUPK1. IT'S INPUT IS THE SAME AS THE INPUT TO $CRPK1 AND IT'SE~; OUTPUT IS THE SAME AS THAT FROM $QUPK1. IF THE PACKET CANNOT BE UF; CREATED, $QUPKT IS NOT CALLED AND A RETURN IS MADE WITH CARRY SET. €; KISAR6 MAPPING IS PRESERVED.�;B‚;- ƒ$CREQ1::"„ MOV KISAR6,-(SP) ; SAVE MAPPING#… CALL $CRPK1 ; CREATE THE PACKETC%† MOV (SP)+,KISAR6 ; RESTORE MAPPING +‡ BCC $QUPK1 ; IF WE GOT PACKET, QUEUE IT)ˆ RETURN ; ELSE, RETURN WITH CARRY SETR‰Š‹;+$Œ; **-$QUPK1-QUEUE ERROR LOG PACKET�;NHŽ; THIS ROUTINE IS CALLED TO QUEUE AN ERROR LOG PACKET. IF THERE IS NOJ�; OTHER PACKET IN THE QUEUE, THE ERROR LOGGER IS REQUESTED WITH A DELAY.H�; IF THERE IS ANOTHER PACKET ALREADY IN THE QUEUE, THE ERROR LOGGER IS‘; REQUESTED IMMEDIATLY.’;V “; INPUTS: ”;E;•; R3=POINTER TO PACKET FOR INSERTION IN QUEUE (APR VALUE)K–; —; OUTPUTS:˜;™; R4 AND R5 ARE PRESERVEDC%š; ALL OTHER REGISTERS ARE DESTROYEDU›;-œ!�$QUPK1::SAVNR ;SAVE R5 AND R4K-ž MOV R3,R1 ;COPY THE POINTER TO THE PACKETE7Ÿ MOV $ERRPT,R5 ;SAVE FOR USE WHEN REQUESTING THE TASK$  BEQ 40$ ;IF EQ NO ERROR LOG TASK7¡ MOV #$ERHEA,R0 ;GET A POINTER TO THE QUEUE LIST HEADT>¢ CALL $QSPIF ;INSERT THE ENTRY FIFO IN THE QUEUE (2ND POOL)8£ CMP (R0)+,(R0) ;IS THIS THE FIRST ENTRY IN THE QUEUE?¤ BNE 20$ ;IF NE NON'¥ MOV KISAR6,-(SP) ; SAVE APR6 MAPPING:¦ MOV R1,KISAR6 ; MAP PACKETR8§ BIT #SM.CMD,E$HSBF+140004 ;IS THIS A COMMAND PACKET?¨ BNE 10$ ; IF NO YESA%© MOV (SP)+,KISAR6 ; RESTORE MAPPING .ª MOV #C.LGTH,R1 ;SIZE OF A CLOCK QUEUE ENTRY(« CALL $ALOCB ;ALLOCATE THE CORE BLOCK1¬ BCS 20$ ;IF CS FAILURE, TRY IMMEDIATE REQUESTT&­ CLR C.UIC(R0) ;INDICATE DEFAULT UIC®¯° .IF DF A$$CNT±%² CLR C.UAB(R0) ;BILL TASK TO SYSTEM ³´ .ENDC ; DF A$$CNTµ¶· CLR R1 ;HIGH TIME = 0N¸ MOV #ERRTIM,R2 ;LOW TIMEA+¹ MOV #C.SSHT,R4 ;SINGLE SHOT TASK REQUEST/º CALLR $CLINS ;INSERT THE ENTRY IN THE QUEUEP»¼;?½; THERE IS ANOTHER PACKET IN THE QUEUE, SO IMMEDIATLY REQUEST¾; THE ERROR LOGGER.F¿;OÀ)Á10$: MOV (SP)+,KISAR6 ; RESTORE MAPPINGO)Â20$: MOV R5,R0 ;COPY THE ERROR LOG TCBM)à TST T.STAT(R0) ;IS IT ALREADY RUNNING?E(Ä BPL 30$ ;IF PL YES, DON'T REQUEST IT Å CLR R1 ;INDICATE DEFAULT UIC"Æ CALLR $TSKRT ;REQUEST THE TASKÇÈ;CAÉ; THE ERROR LOG TASK IS ALREADY RUNNING, SO DISMISS THE REQUESTTÊ;SËÌ30$: RETURN ;EXITÍÎ;LBÏ; THE ERROR LOG TASK HAS BEEN REMOVED. DISCARD THE QUEUED ENTRYÐ;EÑ4Ò40$: MOV R1,R0 ;COPY THE ERROR LOG PACKET POINTER#Ó MOV KISAR6, -(SP) ; SAVE MAPPINGR Ô MOV R1,KISAR6 ; MAP TO PACKET0Õ MOV @#140002,R1 ; GET SIZE OF PACKET IN BYTES8Ö ADD #77+4,R1 ; ACCOUNT FOR LINK + LENGTH + TRUNCATION*× ASH #-6,R1 ; CONVERT TO 32 WORD BLOCKS%Ø MOV (SP)+,KISAR6 ; RESTORE MAPPING,Ù CALLR $DESEC ; DEALLOCATE SECONDARY POOLÚÛÜ;+/Ý; **-$QRMV1-REMOVE ENTRY FROM ERROR LOG QUEUEÞ;LHß; THIS ROUTINE REMOVES AN ENTRY FROM THE ERROR LOG QUEUE AND TRANSFERSà; IT INTO A USER BUFFER.á; â; INPUTS:Kã;Iä; R4=LENGTH OF USER BUFFERå; R5=ADDRESS OF USER BUFFER;æ;T ç; OUTPUTS:è;1é; R1=LENGTH OF PACKETCê; R4=UNCHANGEDë; R5=UNCHANGEDì;O'í; C=0 PACKET WAS REMOVED SUCCESSFULLYR=î; C=1 NO PACKET TO REMOVE OR PACKET TOO LONG. IF R1<>0 THEA?ï; PACKET WAS TOO LONG, AND R1 CONTAINS THE PACKET LENGTH.+ð;-ñ"ò$QRMV1::SAVNR ; SAVE R4 AND R5.ó CLR R1 ; SAY THE PACKET HAS LENGTH OF ZERO(ô MOV #$ERHEA,R0 ;GET THE QUEUE POINTER*õ CALL $QSPRF ; REMOVE PACKET FROM QUEUE!ö BCS 30$ ;IF CS NO SUCH PACKET"÷ MOV KISAR6,-(SP) ; SAVE MAPPING8ø MOV R1,KISAR6 ; MAP TO PACKET - VALUE CAME FROM QSPRF'ù MOV @#140002,R0 ; GET SIZE OF PACKETA%ú MOV (SP)+,KISAR6 ; RESTORE MAPPING û MOV R0,-(SP) ; SAVE SIZ00‹¨cÖ«cÝb`TADATADATADATADATADATAE 'ü MOV R4,-(SP) ; SAVE USER BUFFER SIZEW#ý MOV R5,R4 ; USER BUFFER ADDRESSE)þ CMP R0,(SP)+ ; IS THE PACKET TOO LONG?A%ÿ BHI 20$ ;IF HI PACKET IS TOO LONGE; A; PREPARE FOR $BLXIO.. INPUT IS R0= #BYTES, R1=SOURCE APR5 BIASQE; R2=SOURCE DISPLACEMENT, R3=DESTINATION APR6 BIAS, R4=DEST. DISPL.G; OUTPUT FROM BLXIO IS: R0 ALTERED, R1,R3 PRESERVED, R2 AND R4 POINTE'; TO LAST BYTE OF SOURCE AND DEST. +1T; . MOV #120004,R2 ; SKIP LINK AND LENGTH WORDS# MOV KISAR6,R3 ; PRIV.TASK'S APR6M! CALL $BLXIO ; MOVE THE BUFFERW. 20$: MOV R1,-(SP) ; SWAP R0 AND R1 FOR DESEC  MOV (SP)+,R0 ;...  MOV (SP)+,R1 ;.../  MOV R1,-(SP) ; SAVE SIZE IN BYTES FOR OUTPUT 9  ADD #77+4,R1 ; ACCOUNT FOR LENGTH, LINK AND TRUNCATION " ASH #-6,R1 ; CONVERT TO BLOCKS# CALL $DESEC ; DEALLOCATE PACKETU* MOV (SP)+,R1 ;RESTORE THE PACKET LENGTH DEC R4 ;ADJUST SO THAT IF:! ; R4>R5 WE TRANSFERRED DATA& ; R4R5 WE TRANSFERRED DATA& ; R4; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 02; B. SCHREIBER 5-SEP-77 ;E; MODIFIED BY:;O!; PAUL K. M. WEISS 27-SEP-83 2.00 ; (; PKW036 - ENABLE THE A/D FOR MODE 512.;A*; THIS MODULE INITIATES AN A/D INPUT SWEEP; ; SYSTEM MACRO CALLS;  .MCALL KSWDF$ KSWDF$U T# .SBTTL ADSWP START A/D INPUT SWEEPI;+ ; ADSWP -- START A/D INPUT SWEEP;E; CALLING SEQUENCE:I;N?; CALL ADSWP (IBUF,LBUF,NBUF,MODE,IPRSET,IEFN,LDELAY,ICHN,NCHN)R;L-; SEE DOCUMENTATION FOR ARGUMENT DESCRIPTIONS ;N;-'ADSWP:: MOV R5,-(SP) ;SAVE R5 (ARG PTR)H. CALL .K.PAA ;VALIDATE ARGS AND PUSH ON STACK .WORD 9. ;NINE ARGS2# .WORD 600 ;MASK FOR REQUIRED ARGSF1 MOV #.ADSWB,R4 ;POINT TO A/D SWEEP CONTROL BLOCKP BCC 20$ ;IF CC CONTINUEC, MOV #-,R3 ;ELSE SET ERROR CODE! BR 600$ ;STORE ERROR AND RETURNI*20$: CALL .K.SET ;SETUP COMMON SWEEP ARGS BCS 200$ ;IF CS BAD ARGS) CALL .K.DLY ;SEE ABOUT DELAY FROM STARTF! BCS 300$ ;IF CS RESOURCE IN USEU0 CALL .ADGCH ;GET A/D CHANNEL INFORMATION SETUP BCS 200$ ;IF CS BAD ARGS+ CALL .K.STB ;SETUP BUFFER POINTERS IN SWBP. BCS 400$ ;IF CS ILLEGAL BUFFER SPECIFICATION. CALL .ADCNI ;CONNECT FIRST A/D TO INTERRUPTS) BCS 300$ ;IF CS CALL IT RESOURCE IN USEI& CALL .KLQIN ;INSERT INTO CLOCK QUEUE5 BIT #S$WDLY,S.WFL2(R4) ;IS THERE A DELAY FROM START?I BNE 80$ ;IF NE YES--NEED CLOCK .IF DF K$$W11( BIT #S$WEXT,S.WFLG(R4) ;EXTERNAL START? BNE 80$ ;IF NE YES--NEED CLOCK' ;IF NO CLOCK IN SYSTEM CAN STILL DOT ;EXTERNAL START VIA DIGO .IFTF ;K$$W111 BIT #S$WNOV,S.WFLG(R4) ;TRIGGER DRIVEN SAMPLING?W' BNE 90$ ;IF NE YES--NO NEED FOR CLOCKI80$: .IFT ;K$$W11 00Ö°cײcسcÙ´cÚµcÛ¶c�·c›’ CALL .KWCNI ;INITIALIZE CLOCKB) BCS 300$ ;IF CS CALL IT RESOURCE IN USEC- BIS #S$WACT,S.WFL2(R4) ;FLAG SWEEP IS ACTIVED( BIT #S$WEXT,S.WFLG(R4) ;EXTERNAL START?1 BNE 100$ ;IF NE YES--ST ROUTINE WILL ENABLE A/DW .IFF ;K$$W11T1 MOV #-,R3 ;CLOCK OPTION NOT PRESENTE# BR 500$ ;GO RETURN STATUS TO USERC .ENDC ;K$$W11'90$: CALL .ADSTR ;ENABLE A/D CONVERTOR#100$: MOV (SP)+,R5 ;RESTORE ARG PTRI RETURNI;W; ERROR RETURNSE;S; BAD PARAMETERS;&200$: MOV #-,R3 ;SET CODE BR 500$ ;GO TO COMMON CODE;F; RESOURCE IN USEE; &300$: MOV #-,R3 ;SET CODE BR 500$;; ILLEGAL BUFFER SPECIFICATION;T&400$: MOV #-,R3 ;SET CODE2500$: MOV R5,SP ;RESTORE PRE-.K.PAA STACK POINTER1600$: CALL .KLQRM ;REMOVE FROM QUEUE IF INSERTED ' MOV #1,R4 ;SET ARG # TO STORE IT INTO MOV (SP)+,R5 ;RESTORE ARG PTR+ CALLR .IESTO ;SET CODE AND RETURN TO USERT .ENDRNI;W; ERROR RETURNSE;S; BAD PARAMETERS;&200$: MOV #-; within the cacher module itself. On non-I/D systems, only<; APR6 can be used to reference the partition's pool area.%; This limits the pool size to 4KW.o<; On I/D systems, D-space is used to reference 8KW in both; APR5 and APR6.; 4; The UCB extension (UCBX) is mapped in APR6, as a=; convention. It is usually mapped only in the dispatching?; code, and may be dynamically (temporarily) mapped to accessO=; the cells used to maintain the device-specific listheads.l;d< ; The cache statistics buffer is also only mapped in APR6.<!; It is also dynamically (temporarily) mapped by the macro>"; USTAT$ (Update STATistics), in the various pieces of code.#;-A$; The actual cache buffers themselves are never directly mapped>%; during operation, although the executive subroutine $BLXIO#&; will map them to transfer data. ';t'; CHEDBG = 0 '; CHESAN = 0c' CHEDFR = 02) CHESTS = 0 ;Define to enable cache statistics*;d+; Macro callss,;s%- .MCALL CHEDF$ ;Cache definitionse1. .MCALL FILIO$ ;File oriented I/O definitionsm&/ .MCALL PKTDF$ ;Packet definitions30 .MCALL QIOSY$ ;QI/O error and code definitionse&1 .MCALL UCBDF$ ;UCB[X] definitions 2 CHEDF$s 3 FILIO$e 4 PKTDF$y 5 QIOSY$ 6 UCBDF$e7;n8; Macro definitionse9;o%:; USTAT$ - Update Statistics Buffers;;a< .MACRO USTAT$ OFFSET .= .IF DF CHESTS ; Cache statistics enabled?>? MOV #OFFSET, -(SP)h@ CALL $USTAT A TST (SP)+BC .ENDC ; .IFDF CHESTS$D .ENDM USTAT$iE;4F; MESAG$ - Display a message at the system consoleG;L!G .MACRO COPY$ SIZE,ADDRESS,CODE. G .IF B CODE;G MOV #SIZE,-(SP)G .IFFnG MOV #>,-(SP)fG .ENDCG MOV ADDRESS,-(SP) G CALL $COPYG .ENDMG(G .MACRO MESAG$ TEXT,OPCODE,SIZE,PRMLSTG .IF DF CHEDBG G CALL $SAVEBG .IF NB TEXTG MOV #TEXT,-(SP)G CALL .TTMSGG .ENDCG .IF NB OPCODEG .IF NB SIZEG MOV #SIZE,R1hG .ENDC G .IF B SIZE( G CLR R1G .ENDCG MOV #OPCODE,R2NG CALL $PTMSGG .IF NB SIZEG .IRP X, G COPY$ XG .ENDMG .ENDCG CALL $RSTORG .ENDCL .ENDC ;CHEDBGM .ENDM MESAG$N;FO; Offset definitions in I.PRMPP;#Q P1 = 0 ;Parameter 1 (I.PRM+0) R P1.1 = 0 ;S P1.2 = 2 ;A#T P2 = 4 ;Parameter 2 (I.PRM+4) #U P3 = 6 ;Parameter 3 (I.PRM+6)T%V P4 = 10 ;Parameter 4 (I.PRM+10)%W P5 = 12 ;Parameter 5 (I.PRM+12)E%X P6 = 14 ;Parameter 6 (I.PRM+14)SY P6.1 = 14 ;[UQ.UMD]Z P6.2 = 16 ;[UQ.UMD][;P?\; Symbols used internally as "base values" for APR relocation];C8^ APR5.BASE = 120000 ;Base address for APR5 references8_ APR6.BASE = 140000 00�ÀcŽÂc³cÙ´cÚµcÛ¶c�·c›’ ;Base address for APR6 references`.a .IF DF K$$DAS ;Kernel I/D space supported.b APRD.BASE = APR5.BASE ;Data begins in APR5c .IFF ;K$$DAS8d APRD.BASE = APR6.BASE ;Non-I/D systems begin in APR6e .ENDCf; g; Macro status bits.h;2?i; BYPASS: All modifiers in the function code to indicate thatM+j; the operation is to be cache bypassed.lk;d>l; EXBUSY: All bits which mark the extent as "busy" or locked/m; pending the completion of another process.n;Ro;EEp BYPASS = ;<1!2!4=7> If set, request is "bypassed"eFp EXBUSY = ;<> If set, extent in use or lockedpp; +p; Definitions for large extent transfers.Dp;e@pMAXTR = 17700 ; size of largest permissible transfer, in bytes<pMAXTRB = 177 ; size of largest transfer, in 64-byte blocks+j; the operation is to be cache bypassed.lk;d>l; EXBUSY: All bits which mark the extent as "busy" or locked/m; pending the completion of another process.n;Ro;EEp BYPAS& .TITLE DCQUE - DC Queue Maintenance .IFDF D$$CHE, .IDENT /1.01/ .PSECT DC$QUE,RO,ID;(; Modified By:;E; J. Kauffman 17-Feb-87 1.01@; JRK330 - Convert E.UCBX to E.UCB for deferred write support; , .SBTTL QINLBN - Insert CED into LBN queue;R= ; This routine will use the two temporary cells, H.TMP1 andB< ; H.TMP2 to place the specified CED into the ascending LBN< ; queue for a device. The two temporaries are supplied by@ ; SEARCH (DCSUB), and are retained in order to position withinA ; the LBN list only once, thereby increasing cache performance.; ; Passed:B0; R0 -> CED to be inserted into the LBN queue.; ; Returned:t; All registers preservedp;; Processing:B;I; CASE TMP1 TMP2L+; ----------------------------- ---- ---- (; I. No elements in queue EQ 0 EQ 0*; II. Becomes first in queue EQ 0 NE 0); III. Becomes last in queue NE 0 EQ 0t); IV. Inserted within queue NE 0 NE 0U+; ----------------------------- ---- ----h;; The following is performed:  ;a !; IF TMP1=0o"; IF TMP2=0#; { ;Case I.E$; CURR.PREV <- 0%; CURR.NEXT <- 0&; X.CCED <- CURRs'; X.CCED+2 <- CURRB (; } ); ELSE 0>-*; { ;Case II.+; CURR.PREV <- 0,; CURR.NEXT <- TMP20-; TMP2.PREV <- CURRq.; X.CCED <- CURRo /; } 0; ELSE 0>V1; IF TMP2=0i2; { ;Case III.-3; CURR.PREV <- TMP1-4; CURR.NEXT <- 05; TMP1.NEXT <- CURR6; X.CCED+2 <- CURR= 7; } 8; ELSE 0> 9; { ;Case IV.:; CURR.PREV <- TMP1.;; TMP1.NEXT <- CURR.<; CURR.NEXT <- TMP2=; TMP2.PREV <- CURR >; }a?; END P@; END UA;X BQINLBN::(C MOV R1,-(SP) ;Obtain a work registerD/E MOV APRD.BASE+H.TMP1,R1 ;Beginning of queue?F BNE 20$ ;No if NEG(H MOV APRD.BASE+H.TMP2,R1 ;Empty queue?I BNE 10$ ;No if NEJ"K CLR E.LPRV(R0) ;CURR.PREV <- 0"L CLR E.LNXT(R0) ;CURR.NEXT <- 0M,N MOV KISAR6,-(SP) ;Save partition mapping/O MOV U.UCBX(R5),KISAR6 ;Map the UCB extensionX,P MOV R0,APR6.BASE+X.CCED ;X.CCED <- CURR.Q MOV R0,APR6.BASE+X.CCED+2 ;X.CCED+2 <- CURR/R MOV (SP)+,KISAR6 ;Restore partition mappingNS BR 40$ ;And exitbT&U10$: CLR E.LPRV(R0) ;CURR.PREV <- 0(V MOV R1,E.LNXT(R0) ;CURR.NEXT <- TMP2(W MOV R0,E.LPRV(R1) ;TMP2.PREV <- CURRX,Y MOV KISAR6,-(SP) ;Save partition mapping/Z MOV U.UCBX(R5),KISAR6 ;Map the UCB extension ,[ MOV R0,APR6.BASE+X.CCED ;X.CCED <- CURR)\ MOV (SP)+,KISAR6 ;Remap the partitionA] BR 40$ ;And exito^*_20$: TST APRD.BASE+H.TMP2 ;End of queue?` BNE 30$ ;No if NEa(b MOV R1,E.LPRV(R0) ;CURR.PREV <- TMP1"c CLR E.LNXT(R0) ;CURR.NEXT <- 0(d MOV R0,E.LNXT(R1) ;TMP1.NEXT <- CURRe,f MOV KISAR6,-(SP) ;Save partition mapping/g MOV U.UCBX(R5),KISAR6 ;Map the UCB ex00ŽÈc«cÝb`TADATADATADATADATADATAtensionU/h MOV R0,APR6.BASE+X.CCED+2 ;X.CCED+2 <- CURRi)i MOV (SP)+,KISAR6 ;Remap the partitionxj BR 40$ ;And exit6k,l30$: MOV R1,E.LPRV(R0) ;CURR.PREV <- TMP1(m MOV R0,E.LNXT(R1) ;TMP1.NEXT <- CURR$n MOV APRD.BASE+H.TMP2,R1 ;Get TMP2(o MOV R1,E.LNXT(R0) ;CURR.NEXT <- TMP2(p MOV R0,E.LPRV(R1) ;TMP2.PREV <- CURRq&r40$: MOV (SP)+,R1 ;Restore saved R1 s RETURNTt ,u .SBTTL QRMLBN - Remove CED from LBN queuev;p w; Passed:ix; R0 -> CED to removeAy;a z; Returned:s{; All registers preservedC|;;}; Processing:i~;M; CASE .PREV .NEXTh-€; ----------------------------- ----- -----:*�; I. Only element in queue EQ 0 EQ 0+‚; II. First element in queue EQ 0 NE 0A*ƒ; III. Last element in queue NE 0 EQ 0)„; IV. Element within queue NE 0 NE 0V-…; ----------------------------- ----- -----R†;e‡; IF CURR.PREV=0ˆ; IF CURR.NEXT=0 ‰; {RŠ; X.CCED <- 0‹; X.CCED+2 <- 0 Œ; }r�; ELSE 0> Ž; {i �; X.CCED <- CURR.NEXT�; NEXT.PREV <- 0 ‘; }h’; END “; ELSE 0>”; IF CURR.NEXT=0 •; {Q –; X.CCED+2 <- CURR.PREV—; PREV.NEXT <- 0 ˜; } ™; ELSE 0> š; {t ›; PREV.NEXT <- CURR.NEXT œ; NEXT.PREV <- CURR.PREV �; }ž; END Ÿ; END  ; ¡QRMLBN::%¢ MOV R1,-(SP) ;Get a work register £0¤ MOV E.LPRV(R0),R1 ;Is this the first extent?¥ BNE 20$ ;No if NE¦,§ MOV E.LNXT(R0),R1 ;Is this the last one?¨ BNE 10$ ;No if NE©0ª MOV KISAR6,-(SP) ;Save the partition mapping9ª MOV E.UCB(R0),R1 ;Get pointer to UCB address ;JRK33001ª MOV U.UCBX(R1),KISAR6 ;Map the UCBX ;JRK330 /¬ CLR APR6.BASE+X.CCED ;X.CCED <- 0 ;**-1E(­ CLR APR6.BASE+X.CCED+2 ;X.CCED+2 <- 0(® MOV (SP)+,KISAR6 ;Remap te partition¯ BR 40$ ;And exit°10$:± MOV E.LNXT(R0),R1 ;Get NEXT0² MOV KISAR6,-(SP) ;Save the partition mapping=² MOV R0,-(SP) ;Save the CED address across mapping ;JRK330l;² MOV E.UCB(R0),R0 ;Get the UCB address from CED ;JRK330a1² MOV U.UCBX(R0),KISAR6 ;Map the UCBX ;JRK330 2² MOV (SP)+,R0 ;Restore the CED address ;JRK3308´ MOV R1,APR6.BASE+X.CCED ;X.CCED <- CURR.NEXT ;**-1(µ MOV (SP)+,KISAR6 ;Remap te partition"¶ CLR E.LPRV(R1) ;NEXT.PREV <- 0· BR 40$ ;And exitr¸20$:%¹ MOV E.LNXT(R0),R1 ;Last in queue?Eº BNE 30$ ;No if NE» MOV E.LPRV(R0),R1 ;a0¼ MOV KISAR6,-(SP) ;Save the partition mapping=¼ MOV R0,-(SP) ;Save the CED address across mapping ;JRK330e;¼ MOV E.UCB(R0),R0 ;Get the UCB address from CED ;JRK33061¼ MOV U.UCBX(R0),KISAR6 ;Map the UCBX ;JRK330r2¼ MOV (SP)+,R0 ;Restore the CED address ;JRK330;¾ MOV R1,APR6.BASE+X.CCED+2 ;X.CCED+2 <- CURR.PREV ;**-1 (¿ MOV (SP)+,KISAR6 ;Remap te partition"À CLR E.LNXT(R1) ;PREV.NEXT <- 0Á BR 40$ ;And exit1Â30$:à MOV E.LPRV(R0),R1 ;Get PREVE4Ä MOV E.LNXT(R0),E.LNXT(R1) ;PREV.NEXT <- CURR.NEXTÅ MOV E.LNXT(R0),R1 ;Get NEXT,4Æ MOV E.LPRV(R0),E.LPRV(R1) ;NEXT.PREV <- CURR.PREVÇ40$:"È MOV (SP)+,R1 ;Restore saved R1É RETURN ;And all doneÊ 0/Ë .SBTTL QUPAGE - Move CED to end of age queueRÌ;e Í; Passed: Î; R0 -> CED to updateRÏ;6 Ð; Returned:;Ñ; All registers preserved Ò;M ÓQUPAGE::&Ô CALL QRMAGE ; Remove it from list(Õ CALL QADAGE ; Add it at end of list Ö RETURN× V,Ø .SBTTL QRMAGE - Remove CED from age queueÙ;T Ú; Passed:X%Û; R0 -> CED to remove from age listGÜ;X Ý; Returned:RÞ; All registers preserved-ß;.à; Processing:Má;Pâ; CASE .PREV .NEXT.ã; ------------------------------ ----- ------ä; I. Element is only in queue EQ 0 EQ 0a.å; II. Element is first in queue EQ 0 NE 0-æ; III. Element is last in queue NE 0 EQ 0U,ç; IV. Element is within queue NE 0 NE 0.è; ------------------------------ ----- -----é;ê; IF CURR.PREV=0ë; IF CURR.NEXT=0 ì; 00ŽÐc�Öc³cÙ´cÚµcÛ¶c�·c›’{í; H.CEDH <- 0î; H.CEDH+2 <- 0 ï; }Xð; ELSE 0> ñ; {r ò; H.CEDH <- CURR.NEXTó; NEXT.PREV <- 0 ô; }-õ; ELSE 0>ö; IF CURR.NEXT=0 ÷; {yø; PREV.NEXT <- 0 ù; H.CEDH+2 <- CURR.PREV ú; }û; ELSE 0> ü; {E ý; NEXT.PREV <- CURR.PREV þ; PREV.NEXT <- CURR.NEXT ÿ; }-; END ; END ;. QRMAGE::% MOV R1,-(SP) ;Get a work register & MOV E.APRV(R0),R1 ;First in queue? BNE 20$ ;No if NE%  MOV E.ANXT(R0),R1 ;Only in queue?   BNE 10$ ;No if NE 0  CLR APRD.BASE+H.CEDH ;Initialize the pointers  CLR APRD.BASE+H.CEDH+2  BR 40$-10$:* MOV R1,APRD.BASE+H.CEDH ;H.CEDH <- NEXT" CLR E.APRV(R1) ;NEXT.PREV <- 0  BR 40$ 20$:% MOV E.ANXT(R0),R1 ;Last in queue?- BNE 30$ ;No if NE MOV E.APRV(R0),R1 ;Get PREVi" CLR E.ANXT(R1) ;PREV.NEXT <- 0+ MOV R1,APRD.BASE+H.CEDH+2 ;H.CEDH+2 <- 0M  BR 40$030$:4 MOV E.APRV(R0),E.APRV(R1) ;NEXT.PREV <- CURR.PREV MOV E.APRV(R0),R1 ;Get PREVB4 MOV E.ANXT(R0),E.ANXT(R1) ;PREV.NEXT <- CURR.NEXT40$:"  MOV (SP)+,R1 ;Restore saved R1 ! RETURN0" 8# .SBTTL QADAGE - Add a CED at the end of the age queue$;( %; Passed:E&; R0 -> CED to append to listV';X (; Returned: ); All registers preservedi*;+; Processing:(,;1-; CASE H.CEDH H.CEDH+211.; ----------------------------- ------ --------.*/; I. No elements in queue EQ 0 EQ 0,0; II. First element in queue EQ 0 NE 0+1; III. Last element in queue NE 0 EQ 0(*2; IV. Element within queue NE 0 NE 013; ----------------------------- ------ --------4;5; CURR.NEXT <- 06; IF H.CEDH+2=0 7; {e8; H.CEDH <- CURR9; H.CEDH+2 <- CURRl:; CURR.PREV <- 0;; }l<; ELSE 0>=; {r>; CURR.PREV <- H.CEDH+2.?; PREV.NEXT <- CURR-@; H.CEDH+2 <- CURR-A; }.B; END C; DQADAGE::%E MOV R1,-(SP) ;Get a work register F"G CLR E.ANXT(R0) ;CURR.NEXT <- 0H+I MOV APRD.BASE+H.CEDH+2,R1 ;Is list null? J BNE 10$ ;No if NEK>L MOV R0,APRD.BASE+H.CEDH ;This extent becomes first and last&M MOV R0,APRD.BASE+H.CEDH+2 ;in queue/N CLR E.APRV(R0) ;Indicate no previous eitherUO BR 20$ ;And exitP10$:,Q MOV R1,E.APRV(R0) ;CURR.PREV <- H.CEDH+2(R MOV R0,E.ANXT(R1) ;PREV.NEXT <- CURR.S MOV R0,APRD.BASE+H.CEDH+2 ;H.CEDH+2 <- CURRT20$:"U MOV (SP)+,R1 ;Restore saved R1 V RETURN WX .ENDC ; .IFDF D$$CHEEY .END ;CURR.NEXT <- 0H+I MOV APRD.BASE+H.CEDH+2,R1 ;Is list null? J BNE 10$ ;No if NEK>L MOV R0,APRD.BASE+H.CEDH ;This extent becomes first and last&M MOV R0,APRD.BASE+H.CEDH+2 ;in queue/N CLR E.APRV(R0) ;Indicate no previous eitherUO BR 20$ ;And exitP10$:,Q MOV R1,E.APRV(R0) ;CURR.PREV <- H.CEDH+2(R MOV R0,E.ANXT(R1) ;PREV.NEXT <- CURR.4 .IIF DF R$$MPL .TITLE NETCM - CEX COMMON DATABASE3 .IIF NDF R$$MPL .TITLE CEXCM - CEX COMMON DATABASEr .IDENT /V03.19/ e;e; COPYRIGHT (C) 1987 BYg/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.c;s;"H; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIEDH; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THEH; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHERH; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANYH; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY; TRANSFERRED.;MH; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICEH; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT; CORPORATION.;EH; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS9; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.R;T;T; MODULE DESCRIPTION: ; *; COMMUNICATIONS EXECUTIVE COMMON DATABASE;R; IDENT HISTORY:;A; 1.0000�Øc«cÝb`TADATADATADATADATADATA 14-DEC-79; DECNET-11M/S V3.0O; DECNET-11M-PLUS V1.0;T; 3.00 16-APR-82; DECNET-11M V3.1; DECNET-11M-PLUS V1.1;O; 3.01 09-Sep-82,; Add Network management completion listhead?; Add Phase 4 cells ($NA, $NBRA, $NBEA, $AMAXH, $AMAXC, $HIORD)T;.; 3.02 12-Oct-823; Add cell for maximum protocol overhead from CETABO;I; 3.03 17-Nov-825; Add secondary host listhead for Server Base systems ;U; 3.04 30-Nov-82E; Add Broadcast routing timer ($ROUTB) and Broadcast router priority A ; ($RPRI)-;-; 3.05 16-Dec-82@; Merge NETCM M+ specific cells into common CEXCM, remove unused>; cells ($PBIAS,$PAVL) and remove IAS/D comditionals and code./; Condense new cells to one area of the common. /; Add $DECPT, $NMLST, $SPAR1, and $SPAR2 cells.T; Removed 50msec timer labels.;f; 3.06 20-Dec-82@; Conditionalized $PUMR for RSX11M only. This cell is defined in!; LOWCR for RSX-11M-PLUS systems.;; 3.07 21-DEC-82>; Keep Phase III symbols in for 1 release ($PAVL,$T50Q,$T50CL);y; 3.08 22-Dec-82>; Modify (correct) $XAVL cell to be .WORD 0 instead of .WORD 1;C; 3.09 22-Dec-82=; Remove S$$BAS conditional from $SHLST (Secondary Host List);o; 3.10 22-Dec-82?; Local node name ($NTNAM) must follow remote listhead ($RNNHD)A;c; 3.11 4-Jan-83 ; Correct URM location; ; 3.12 19-Jan-83'; conditionalize title for M and M Plusi;e; 3.13 03-Mar-83?; Place M+ conditional around cells moved to DECnet Home Block.P;e; 3.14 22-Mar-838; Add URM cells at the end of all timer queue blocks for&; RSX-11M-Plus multi-processor systems;n; 3.15 28-Mar-838; Put back 4 cells for 3271 product (uses 1.0 comm exec); ; 3.16 3-May-83i3; Correct table of timer blocks for multiprocessors);s; 3.17 16-Oct-84'; Add symbols for $ZTIME+2 and $NMCLH+2 ;r; 3.18 20-Oct-86(; Add $LTEEP LAT exit entry point vector;f; 3.19 29-May-87<; Increase the size of the Event Descriptor Block by 3 words;o .IF DF M$$NET .IF NDF R$$MPL- .MCALL CCBDF$,NKRDF$,OPTDF$ CCBDF$ ; DEFINE CCB OFFSETS- NKRDF$ <:>,<=> ; DEFINE NETWORK KRB OFFSETS.$ OPTDF$ ; DEFINE CEX OPTIONS FLAGS .PSECT CEXCOM .ENDC ; NDF R$$MPL. M;+(; COMMUNICATION SYSTEM COMMON DATA BASE; ( ORDERING IMPACTS VNP );-;- d/$PDVTA::.BLKW 1 ; ADDRESS OF PDV ADDRESS TABLE2/$SLTMA::.BLKW 1 ; ADDRESS OF SLT ADDRESS TABLEr8$LLCTA::.BLKW 1 ; ADDRESSS OF LLC REVERSE MAPPING TABLE($PDVNM::.BLKW 1 ; NUMBER OF PDV ENTRIES)$SLTNM::.BLKW 1 ; NUMBER OF SYSTEM LINESN'$CCBNM::.BLKW 1 ; # OF CCB'S ALLOCATEDF $CCBSZ::.BLKW 1 ; # BYTES / CCB'$RDBNM::.BLKW 1 ; # OF RDB'S ALLOCATEDX $RDBSZ::.BLKW 1 ; # BYTES / RDB'$SDBNM::.BLKW 1 ; # OF SDB'S ALLOCATEDU $SDBSZ::.BLKW 1 ; # BYTES / SDB7$CCBCT::.BLKW 1 ; COUNTER OF CURRENT # OF CCBS IN POOL :$CCBAF::.BLKW 1 ; COUNTER OF # OF CCB ALLOCATION FAILURES:$LDBAF::.BLKW 1 ; COUNTER OF # OF LDB ALLOCATION FAILURES:$CCBAL::.BLKW 1 ; COUNTER OF # OF DYNAMIC CCB ALLOCATIONS;$RDBTH::.BLKW 1 ; POOL THRESHOLD FOR LDB ALLOCATON FAILURE :$CMPDV::.BLKW 1 ; PDV INDEX OF CURRENT DISPATCHED PROCESS2$ZTIME::.BLKW 1 ; TIME SINCE COUNTERS LAST ZEROED0$ZTIM2::.BLKW 1 ; TIME SINCE SYSTEM LAST ZEROED ' .IF DF M$$PRO .WORD 0 ; UNIBUS RUN MASK  .ENDC5$CMFRK::.WORD 0 ; INITIAL LINK MARKS FORK BLOCK FREE:# .WORD 0 ; ADDRESS OF FORK PROCESST .WORD 0 ; FORK PROCESS QUEUE .WORD .-2- .WORD 0 ; APR5 BIAS FOR FORK LEVEL DISPATCHC# ; FREE WORD ON UNMAPPED SYSTEMSS%$T50Q:: ; PHASE III COMPATIBILITY D'$T100Q::.WORD 0 ; 100 MSEC TIMER QUEUEP .WORD .-2$STMFC:: .IF NDF R$$MPLZA .WORD FC.TIM+FS.STM ; FUNCTION CODE TO DISPATCH 50 MSEC TIMEOUTS; .IFF ; NDF R$$MPL .WORD 0 .ENDC ; R$$MPLP$$T50CL:: ; PHASE III COMPATIBILITY4$T100C::.WORD 0,0,0,0,0 ; 100 MSEC CLOCK QUEUE ENTRY) .WORD 0 ; ADDRESS OF PROCESSING ROUTINET ; (FILLED IN BY NTL)* .WORD 0 ; APR5 BIAS FOR LOADABLE DRIVERS .IF DF M$$PRO .WORD 0 ; Unibus run maskM .ENDC M$LTMFC:: .IF NDF R$$MPLI> .WORD FC.TIM+FS.LTM ; FUNCTION CODE TO DISPATCH L00�àcÖc³cÙ´cÚµcÛ¶c�·c›’ONG TIMEOUTS .IFF ; NDF R$$MPL .WORD 0 .ENDC ; NDF R$$MPL+4$T1SCL::.WORD 0,0,0,0,0 ; 1 SECOND CLOCK QUEUE ENTRY) .WORD 0 ; ADDRESS OF PROCESSING ROUTINEP ; (FILLED IN BY NTL)* .WORD 0 ; APR5 BIAS FOR LOADABLE DRIVERS .IF DF M$$PRO .WORD 0 ; Unibus run maskF .ENDC/$DECPT::.WORD 0 ; Pointer to DECnet Home Block -$PSIPT::.WORD 0 ; POINTER TO PSI HOME BLOCKO"$SNAPT::.WORD 0 ; POINTER FOR SNA $DDFNC:: .IF NDF R$$MPLP1 .WORD FC.PWR ; POWERFAIL RECOVERY FUNCTION CODEH .IFF ; NDF R$$MPL .WORD 0 .ENDC ; NDF R$$MPLC,$CCBLH::.BLKW 1 ; POINTER TO FIRST FREE CCB3$SDBCT::.BLKW 1 ; COUNTER OF CURRENT SDB'S IN POOLS:$SDBLH::.BLKW 1 ; POINTER TO FIRST FREE SMALL DATA BUFFER- .BLKW 1 ; SECOND HALF OF ADDRESS DOUBLEWORDD:$SDBAF::.BLKW 1 ; COUNTER OF # OF SDB ALLOCATION FAILURES3$RDBCT::.BLKW 1 ; COUNTER OF CURRENT RDB'S IN POOLO7$RDBLH::.BLKW 1 ; POINTER TO FIRST FREE RECEIVE BUFFER- .BLKW 1 ; SECOND HALF OF ADDRESS DOUBLEWORDW:$RDBAF::.BLKW 1 ; COUNTER OF # OF RDB ALLOCATION FAILURES?$RDQSL::.BLKW 1 ; SYSTEM LINE # TO CHECK ON NEXT BUFFER RETURNE:$RDQCT::.BLKW 1 ; NUMBER OF BUFFER WAIT REQUESTS AND FLAG7$NTLPT::.BLKW 1 ; NTL POINTER TO IMPURE AREA IN NTPOOLR-$CXOPT::.BLKW 1 ; COMM/EXEC OPTIONS INCLUDEDD S1$NBIAS::.BLKW 1 ; POINTER TO NON-UMR MAPPED POOLL8$QBIAS::.BLKW 1 ; POINTER TO UMR-MAPPED PORTION OF POOL>$QSTRT::.BLKW 1 ; ORIGINAL BIAS OF UMR-MAPPED PORTION OF POOL .IF NDF R$$MPLL$$PUMR:: .BLKW 1 ; STARTING UMR BIAS .ENDC U"$PWRF1::.BLKW 1 ; POWER FAIL FLAG4$XBIAS::.BLKW 1 ; BIAS OF EXTENDED SINGLE WORD POOL$$PAVL:: ; PHASE III COMPATIBILITY?$XAVL:: .WORD 0 ; POINTER TO FIRST FREE BLOCK IN EXTENDED POOLR($NMLST::.WORD 0 ; Logical Name Listhead($OBJHD::.BLKW 1 ; OBJECT TABLE LISTHEAD.$TK100:: ; NUMBER OF CLOCK TICKS IN 100 MSEC3$TCK50::.WORD 4 ; NUMBER OF CLOCK TICKS IN 50 MSECL@$SQRCM::.BYTE 0 ; SQ ROOT LIMIT FOR COMPONENT BUFFER ALLOCATION' .BYTE 0 ; NUMBER OF ACTIVE COMPONENTST-$MAXOV::.BLKW 1 ; MAXIMUM PROTOCOL OVERHEAD F,$LGPDV::.BLKW 1 ; PDV INDEX OF EVENT LOGGER3$LGDDB::.BLKW 1 ; ADDRESS OF EVENT LOGGER DATABASE($FILHD::.BLKW 1 ; EVENT FILTER LISTHEAD&$LGSTT::.BLKW 1 ; EVENT LOGGER STATUS+$EVDSC::.BLKW 11. ; EVENT DESCRIPTOR BLOCKJ8$LGFNB::.BLKW 3 ; EVENT LOGGER FILENAME BLOCK - FILE ID .RAD50 /EVENTLOG/ ; FILENAMEM .RAD50 /SYS/ ; FILE TYPE .BLKW ; VERSION NUMBERO .ASCII /LB/ ; DEVICE NAME  .BLKW ; AND UNIT;$LGUIC::.BYTE 6,1 ; UIC FOR LOGGING FILE (DEFAULT = [1,6])P+$LGMON::.RAD50 /MON.../ ; MONITOR TASK NAMEI*$LGCON::.ASCII /CO/ ; CONSOLE DEVICE NAME .WORD 0 ; AND UNITT;$CELFN::.WORD 0 ; CEX LOGGING FUNCTION CODE (MUST BE ZERO)K9$NMCLH::.WORD 0 ; NETWORK MANAGEMENT COMPLETION LISTHEADR$NMCL2::.WORD .-2F .IF DF R$$MPL)$NETPF::.WORD 0 ; POWERFAIL ENTRY POINT 3$NTLAL::.WORD 0 ; NTL POINTER TO CEX POOL LISTHEAD. W .IF DF M$$PRO .,TIMERS: .WORD -1 ; SHOW TIMER IS NOT ACTIVE4 .WORD 0,0,0,0,0 ; PROCESSOR #1 DEPENDANT ONE SECOND .WORD 0 ; TIMER QUEUE BLOCK .WORD 0 .WORD 0$$$STM=.-TIMERSI2 .WORD 0,0,0,0,0 ; PROCESSOR #1 DEPENDANT 100 MSEC .WORD 0 ; TIMER QUEUE BLOCK .WORD 0 .WORD 0$$$LEN=.-TIMERSH .REPT M$$PRO-1K% .WORD -1 ; SHOW TIMER IS NOT ACTIVE28 .WORD 0,0,0,0,0 ; PROCESSOR #2 - N DEPENDANT ONE SECOND .WORD 0 ; TIMER QUEUE BLOCK .WORD 0 .WORD 06 .WORD 0,0,0,0,0 ; PROCESSOR #2 - N DEPENDANT 100 MSEC .WORD 0 ; TIMER QUEUE BLOCK .WORD 0 .WORD 0 .ENDR$$$OFF=2$1SCTB::.REPT M$$PRO@ .WORD TIMERS+$$$OFF ; POINTER TO PROCESSOR DEPENDANT TIMER CELL$$$OFF=$$$OFF+$$$LEN .ENDR $$$OFF=$$$STM0$STMTB::.REPT M$$PRO@ .WORD TIMERS+$$$OFF ; POINTER TO PROCESSOR DEPENDANT TIMER CELL$$$OFF=$$$OFF+$$$LEN .ENDR=$CRESL::LCKDF$ SPIN ; SERIALIZE ACCESS TO COMMEXEC RESOURCES   .ENDC ; M$$PRO  .ENDC ; R$$MPLO*$SHLST::.WORD 0 ; SECONDARY HOST LISTHEAD8$IMASK:: ; For 3271 back compatibility (1.0 comm exec)$EMASK:: ; ....$ETIMR:: ; ...$/$SPAR1::.WORD 0 ; First Dou00�èc�ìcÝb`TADATADATADATADATADATAble word spare cellF .WORD 08$PBIAS:: ; For 3271 back combatibility (1.0 comm exec)0$SPAR2::.WORD 0 ; Second Double word spare cell .WORD 0;$< .IF DF R$$MPL ; Leave cells for M+ backwards compatability;$,; Cells to be moved to the DECnet Home Block;A+$ANNHD::.BLKW 1 ; ALIAS NODE NAME LISTHEAD$.$RNNHD::.WORD .+2 ; REMOTE NODE NAME LISTHEAD1 .WORD 0 ; TEMPORARY END OF REMOTE NAME LISTHEADc"$NTNAM::.BLKB 6 ; LOCAL NODE NAME$$NSPNM::.BLKW 1 ; LOCAL NODE NUMBER4$NODID::.BLKW 1 ; LENGTH OF LOCAL NODE IDENT STRING' .BLKB 32. ; LOCAL NODE IDENTIFICATIONy$$HOST:: .BLKW 1 ; HOST NODE ADDRESS4$NLN:: .BLKW 1 ; NUMBER OF ROUTING CHANNELS FOR NSP+$NN:: .BLKW 1 ; NUMBER OF NODES IN NETWORKi$MAXC:: .BLKW 1 ; MAXIMUM COSTt$MAXH:: .BLKW 1 ; MAXIMUM HOPS:-$MAXV:: .WORD 20. ; MAXIMUM VISITATION COUNTW.$SQRTL::.BLKW 1 ; SQUARE ROOT LIMITING FACTOR,$ROUTM::.WORD 30. ; ROUTING TIMER (SECONDS);: .ENDC ; R$$MPLN; !; SYNC AND PAD BUFFER DESCRIPTORS ;B $SYNC==226K $SYNCT==8. $PAD==377 $PADSH==2. $PADKL==10.$SYNB::I .WORD 0 .WORD $SYNBFB .WORD $SYNCTO$PADB:: .WORD 0 .WORD $PADBFO .WORD $PADKLE$PADBF:: .REPT $PADKL; .BYTE $PADD .ENDR$SYNBF:: .REPT $SYNCT; .BYTE $SYNC .ENDR;K; COMM EXEC FREE SPACE POINTER;  .IF NDF R$$MPLS .PSECT $$$POL .WORD 3 ; ROUNDING FACTORL.$CEAVL::.WORD 0 ; POINTER TO FIRST FREE BLOCK .WORD 0 .PSECTN .IFF ; NDF R$$MPL .IF NDF K$$DASE9$LTEEP::.WORD $SPVEX ; LAT PROCESS TASK EXIT ENTRY POINT$) ; ADDRESS. INITIALIZED TO A RETURN IND& ; IN IOSUB, WILL BE FILLED IN WHEN ; LAT IS LOADEDO .IFF ; NDF K$$DAS$LTEEP::.WORD 0. .ENDC ; NDF K$$DASA .ENDC ; NDF R$$MPL. .ENDC ; DF M$$NET .IF DF R$$MPL3$NTEND:: ; END OF ARE TO DEALLOCATE IN SET /NOCEXS ; MCR COMMAND .ENDC ; R$$MPLI C .ENDC .TITLE DRMAP" .IDENT /05.05/P;T8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;0>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;+ ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ;  ; B. S. MCCARTHY ; J. M. LAWLER;F-; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:N;D; J. R. KAUFFMAN;N-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:N;P; B. S. MCCARTHY;R,; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY;9"; J. R. KAUFFMAN 10-FEB-86 05.01; 9; JRK324 -- CORRECT CONDITIONALIZATION ERROR IN $STFMPU;A!; J. R. KAUFFMAN 9-MAY-86 05.02P;N=; JRK329 -- PREVENT UNMAPPED WINDOW CHANGE IN FAST MAPPINGI;F"; B. S. MCCARTHY 13-DEC-86 05.03; 5; BM378 -- RECONDITIONALIZE CACHE BYPASS IN CRAW$,R; AND MAP$ ON C$$CBP;"; B. S. MCCARTHY 31-DEC-86 05.04;I5; BM378 -- CONDITIONALIZE CALLS TO $GTMCT IN ABOVEC;Y ; J. W. BERZLE 24-FEB-87 05.05;E*; JWB195 -- ADD LINE BACK TO RESTORE R17;08 .PAGE9; (:; **-CSM DISPATCHER-DISPATCH CSM ENTRY;;$F<; THIS MODULE IS MAPPED AT SUPERVISOR MODE VIRTUAL ZERO ON DETECTINGI=; THE PRESENCE OF THE FIRST SUPERVISOR MODE WINDOW IN A CONTEXT SWITCH.-H>; THIS ALLOWS TASKS TO HAVE SUPER MODE LIBRARIES AT ARBITRARY STARTING,?; ADDRESSES, DESPITE THE OPERATION OF CSM.@;Y&A; * * * N O T E W E L L * * *B;OHC; THIS CODE MUST BE AT VIRTUAL 0 IN SUPERVISOR MODE. SINCE WE JUST MAPJD; THIS COMMON AS 32WORDS RO IN SYSXT, THIS CODE MUST BE AT THE BEGINNINGE; OF THIS COMMON.PF;C6G; THE ENTRY VECTOR TO SUPERVISOR MODE IS AS FOLLOWS:H;V!I; MOV #COMPLETION-ROUTINE,-(SP)RJ; CSM #ROUTINEK;EEL; NOTE: IMMEDIATE MODE EMULATION OF THE CSM INSTRUCTION IS REQUIRED M; IN THE EXECUTIVE.N;REO; THE CSM INSTRUCTION TRANSFERS CONTROL TO THE ADDRESS CONTAINED IN*JP; SUPERVISOR MODE VIRTUAL 10. AT THIS POINT THE STACK IS THE FO00�ðcÖc³cÙ´cÚµcÛ¶c�·c›’LLOWING:Q;ER; (SP) ROUTINE ADDRESS+S; 2(SP) PC (PAST END OF TRANSFER VECTOR)H*T; 4(SP) PS WITH CONDITION CODES CLEARED%U; 6(SP) COMPLETION-ROUTINE ADDRESSTV; 10(SP) RETURN ADDRESSLW;@X; A ROUTINE ADDRESS OF 0 IS SPECIAL CASED TO SUPPORT RETURN TOGY; SUPERVISOR MODE FROM A USER MODE DEBUGGING AID (ODT). IN THIS CASEZ; STACK IS THE FOLLOWING:[; \; (SP) ZEROR&]; 2(SP) PC FROM CSM TO BE DISCARDED&^; 4(SP) PS FROM CSM TO BE DISCARDED-_; 6(SP) SUPER MODE PC SUPPLIED BY DEBUGGER-`; 10(SP) SUPER MODE PS SUPPLIED BY DEBUGGER a;Fbc .IF DF S$$LIBd e .ENABL LSBNf:g; BASE ADDRESS USED FOR RELATIVE ADDRESSES WITHIN MODULEhiBASE:RjCk; DEBUGGER RETURN TO SUPER MODE ENTRY. MUST START AT VIRTUAL ZERORl0m CMP (SP)+,(SP)+ ;CLEAN OFF PS AND PC FROM CSMno;DEp; THIS ENTRY POINT PERFORMS THE NECESSARY STACK MANAGEMENT TO ALLOWR=q; AN RTI FROM SUPER MODE TO EITHER SUPER MODE OR USER MODE.M"r; THE IS AS REQUIRED FOR AN RTI:s;Ct; (SP) SUPER MODE PCu; 2(SP) SUPER MODE PSPv&w TST 2(SP) ;RETURNING TO USER MODE?x BR 70$ ;JOIN COMMON CODEyGz; CSM TRANSFER ADDRESS, THIS WORD MUST BE AT VIRTUAL 10 IN SUPER MODE{*| .WORD CSMSVR-BASE ;CSM DISPATCHER ENTRY}~; DISPATCH CSM ENTRYD€CSMSVR: MOV 6(SP),2(SP) ;SET COMPLETION ROUTINE ADDRESS FOR RETURN6� JMP @(SP)+ ;TRANSFER TO SUPER MODE LIBRARY ROUTINE‚&ƒ; EXIT DISPATCHER FOR ODT AND $SRTI:„…70$: BPL 80$ ;IF PL YES5† MOV #6,-(SP) ;NUMBER OF BYTES FOR (SP), PS, AND PC*‡ ADD SP,(SP) ;COMPUTE CLEAN STACK VALUE*ˆ MTPI SP ;SET UP PREVIOUS STACK POINTER0‰80$: RTT ;RETURN TO PREVIOUS MODE AND CALLERŠ ‹ .DSABL LSB1Œ� .ENDC ; DF S$$LIBŽ .PAGE�;EM�; THE FOLLOWING DIRECTIVES RECEIVE AS INPUT POINTERS TO A WINDOW DEFINITIONPL‘; BLOCK, WHICH SERVES AS A COMMUNICATION AREA BETWEEN THE ISSUING TASK AND@’; THE EXECUTIVE. THE FORMAT OF THE WINDOW DEFINITION BLOCK IS:“;6”; -------------------------------------------------•; W.NID ! ! !D#–; W.NAPR ! BASE APR ! WINDOW ID !S—; ! ! !6˜; !-----------------------------------------------! ™; ! !S,š; W.NBAS ! VIRTUAL BASE ADDRESS (BYTES) ! ›; ! !B6œ; !-----------------------------------------------! �; ! !S(ž; W.NSIZ ! WINDOW SIZE (32W BLOCKS) ! Ÿ; ! !M6 ; !-----------------------------------------------! ¡; ! !R¢; W.NRID ! REGION ID !B £; ! !6¤; !-----------------------------------------------! ¥; ! ! /¦; W.NOFF ! OFFSET IN PARTITION (32W BLOCKS) !! §; ! !!6¨; !-----------------------------------------------! ©; ! !.*ª; W.NLEN ! LENGTH TO MAP (32W BLOCKS) ! «; ! ! 6¬; !-----------------------------------------------! ­; ! ! ®; W.NSTS ! STATUS WORD !S ¯; ! ! 6°; !-----------------------------------------------! ±; ! ! /²; W.NSRB ! SEND/RECEIVE BUFFER ADDR (BYTES) ! ³; ! !-6´; -------------------------------------------------µ; ¶; MACRO LIBRARY CALLSI·;2¸¹º .IF DF P$$LAS»%¼ .MCALL HDRDF$,PCBDF$,TCBDF$,WDBDF$-3½ HDRDF$ ;DEFINE HEADER AND WINDOW BLOCK OFFSETSO4¾ PCBDF$ ;DEFINE PCB AND ATTACHMENT DESCR OFFSETS¿ TCBDF$ ;DEFINE TCB OFFSETS-3À WDBDF$ ;DEFINE WINDOW DEFINITION BLOCK OFFSETSÁ .PAGEÂ;+#Ã; **-$DRCRW-CREATE ADDRESS WINDOW-Ä;-LÅ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ALLOCATE AN ADDRESS WINDOW IN THEIÆ; HEADER OF THE ISSUING TASK, UNMAPPING AND ELIMINATING ANY OVERLAPPING CÇ; ADDRESS WINDOWS OF THE SAME TYPE, AND OPTIONALLY TO MAP THE NEWC È; WINDOW.BÉ;CÊ; DPB FORMAT:HË; $Ì; WD. 00 -- DIC(117.),DPB SIZE(2.)0Í; WD. 01 -- ADDRESS OF WINDOW DEFINITION BLOCKÎ;E Ï; INPUTS: Ð;F;Ñ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. .Ò; R3=ADDRESS OF THE WINDOW DEFINITION BLOCK.1Ó; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.T.Ô; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.Õ;E4Ö; INPUT FIELDS IN THE WINDOW DEFINITION BL00�øcìcÝb`TADATADATADATADATADATAOCK ARE:×; W.NAPR=BASE APR OF REGION.W+Ø; W.NSIZ=DESIRED SIZE OF ADDRESS WINDOW. CÙ; W.NRID=ID OF REGION TO MAP OR 0 FOR TASK REGION (IF WS.MAP=1).16Ú; W.NOFF=OFFSET WITHIN REGION TO MAP (IF WS.MAP=1).CÛ; W.NLEN=LENGTH TO MAP OR 0 TO DEFAULT TO SMALLER OF WINDOW SIZEU.Ü; OR SIZE LEFT IN PARTITION (IF WS.MAP=1). Ý; W.NSTS=CONTROL INFORMATION.3Þ; WS.SIS=1 IF WINDOW IS TO BE IN SUPER I SPACE.5&ß; WS.MAP=1 IF MAPPING IS TO OCCUR.8à; WS.WRT=1 IF MAPPING IS TO OCCUR WITH WRITE ACCESS.á;7â; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)Oã;R/ä; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.0(å; DIRECTIVE STATUS OF +1 IS RETURNED.!æ; C=1 IF DIRECTIVE IS REJECTED. 7ç; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE THES2è; DIRECTIVE FAILS IN THE MAPPING STAGE BECAUSE0é; THE SPECIFIED REGION HAS INCURRED A PARITY ê; ERROR.>ë; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE SPECIFIED,ì; ACCESS IS DENIED IN THE MAPPING STAGE.@í; DIRECTIVE STATUS OF 'D.RS84' IS RETURNED IF AN INVALID APR-3î; WINDOW SIZE COMBINATION IS SPECIFIED OR IF ANI;ï; INVALID REGION OFFSET-LENGTH COMBINATION IS SPECIFIEDSð; IN THE MAPPING STAGE.I=ñ; DIRECTIVE STATUS OF 'D.RS85' IS RETURNED IF THERE ARE NOIò; AVAILABLE WINDOW BLOCKS.Bó; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF AN INVALID REGION+ô; ID IS SPECIFIED IN THE MAPPING STAGE.Aõ;F5ö; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE: ÷; W.NID=ASSIGNED WINDOW ID.+ø; W.NBAS=VIRTUAL BASE ADDRESS OF WINDOW.F#ù; W.NLEN=LENGTH ACTUALLY MAPPED.O8ú; W.NSTS=INDICATION OF ANY CHANGES IN MAPPING STATUS.:û; WS.CRW=1 IF ADDRESS WINDOW SUCCESSFULLY ESTABLISHED.6ü; WS.ELW=1 IF ANY ADDRESS WINDOWS WERE ELIMINATED.4ý; WS.UNM=1 IF ANY ADDRESS WINDOWS WERE UNMAPPED.þ;I:ÿ; NOTE: ON SYSTEMS SUPPORTING EXTERNAL TASK HEADERS, THE5; DIRECTIVE DISPATCHER COPIES THE USER WDB INTO ANP6; INTERMEDIATE BUFFER AREA. ON EXIT, THE DIRECTIVE3; DISPATCHER WILL WRITE ANY OUTPUT FIELDS TO THEE; USER BUFFER. ;E;-3$DRCRW::MOV R4,-(SP) ;SAVE ADDRESS OF TASK HEADERE5 MOV H.WND(R4),R4 ;POINT TO NUMBER OF WINDOW BLOCKSS0  MOV (R4)+,R1 ;PICK UP NUMBER OF WINDOW BLOCKS   .IF DF U$$DAS -  MOV R1,-(SP) ;SAVE NUMBER OF WINDOW BLOCKSE .ENDC ; DF U$$DAS8 MOV (R3)+,R2 ;PICK UP APR NUMBER IN HIGH BYTE (W.NID) CLRB R2 ;CLEAR OUT LOW BYTED$ CMP R2,#7*256. ;LEGAL APR NUMBER? BLOS 3$ ; IF LOS YES  JMP 40$ ;C3$:L1 ASR R2 ;CONVERT TO BASE ADDRESS IN 32W BLOCKS 4 MOV R2,(R3) ;STORE VIRTUAL BASE ADDRESS (W.NBAS)' ASR (R3) ;CONVERT TO BYTES (W.NBAS)I ASR (R3) ; SWAB (R3)+ ;' MOV R2,-(SP) ;CALCULATE HIGH ADDRESSL ADD (R3),(SP) ;(W.NSIZ) BCS 40$ ;IF CS ILLEGAL SIZEO% CMP (SP),#2000 ;LEGAL TOP ADDRESS?D  BHI 40$ ;IF HI NO '! MOV R1,-(SP) ;SAVE NUMBER OF WINDOWS"# .IF DF U$$DAS$4% BIT #T4.DSP,T.ST4(R5) ;TASK USE USER DATA SPACE ?&& BEQ 5$ ;IF EQ NO, ONLY WINDOW ZERO' ;CAN'T BE OVERLAPPED'( DEC (SP) ;YES IT DOES, WINDOWS ZERO ) ;AND ONE ARE OFF LIMITSN*+ .ENDC ; DF U$$DAS,/-5$: CMP -(R3),-(R3) ;POINT TO START OF WINDOW;. ;BLOCK (W.NBAS) (W.NID)G3/ MOV #WS.EDS,R0 ;GET NECESSARY BITS FOR SELECTIONI.0 BIC W.NSTS(R3),R0 ;ALL BITS SET IN W.NSTS ?"1 BNE 10$ ;IF NE NO, LEAVE ALONE23 .IF DF U$$DAS485 BIC #WS.SIS,W.NSTS(R3) ;ALWAYS CLEAR SUPER I SINCE IT6 ;WAS JUST A FLAG BIT.>7 BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH SEPARATE I/D SPACE ?/8 BNE 10$ ;IF NE YES, LEAVE WINDOW IN D SPACE @9 BIC #WS.UDS,W.NSTS(R3) ;CLEAR USER DATA SPACE FOR I ONLY TASK:; .IFF ; DF U$$DAST<<= BIC #WS.EDS,W.NSTS(R3) ;ALWAYS LOOKS LIKE IT DEFAULTED TO$> ;I SPACE ON NON I/D SYSTEMS?@ .ENDC ; DF U$$DASAAB10$: TST W.BSIZ(R4) ;POINTING TO AN ESTABLISHED ADDRESS WINDOW?FC BEQ 20$ ;IF EQ NO#DEF .IF DF S$$LIBG>H BIT #WS.SIS,W.NSTS(R3) ;CREATING SUPERVISOR I SPACE WINDOW?I BEQ 14$ ;IF EQ NOT9J TSTB W.BFPD(R4) ;LOOK00�dÖc³cÙ´cÚµcÛ¶c�·c›’ING AT SUPERVISOR I SPACE WINDOW?IK BMI 30$ ;IF MI NOC L BR 15$ ;MN .IFTF ; DF S$$LIBOP14$: ;REFERENCE LABELQR .IF DF U$$DASS9T BIT #WS.UDS,W.NSTS(R3) ;CREATING USER D SPACE WINDOW ? U BEQ 141$ ;IF EQ NO7V BIT #20,W.BFPD(R4) ;LOOKING AT USER D SPACE WINDOW ?4W BEQ 30$ ;IF EQ NOLX BR 15$ ;YESDY141$: ;REFERENCE LABELZ[ .ENDC ; DF U$$DAS\] .IFT ; DF S$$LIB(^_ .IF DF U$$DAS`9a CMPB #216,W.BFPD(R4) ;LOOKING AT USER I SPACE WINDOW ?;b BLT 30$ ;IF LT NO cd .IFF ; DF U$$DAS$e5f TSTB W.BFPD(R4) ;LOOKING AT SUPER I SPACE WINDOW ?g BPL 30$ ;IF PL YEShi .ENDC ; DF U$$DASjkl .IFTFm5n15$: MOV W.BLVR(R4),R0 ;PICK UP LOW VIRTUAL ADDRESSF"o SWAB R0 ;CONVERT TO 32W BLOCKS p ASL R0 ; q ASL R0 ;2r CMP 2(SP),R0 ;POSSIBLE VIRTUAL ADDRESS OVERLAP?s BLOS 30$ ;IF LOS NO,t ADD W.BSIZ(R4),R0 ;CALCULATE HIGH ADDRESS'u CMP R2,R0 ;VIRTUAL ADDRESS OVERLAP?Wv BHIS 30$ ;IF HIS NORwx .IF DF U$$DASy*z TST (SP) ;ALREADY ESTABLISHED WINDOW ?#{ BEQ 17$ ;IF EQ YES, ALLOW UNMAPP|} .IFTF ; DF U$$DAS~0 CMP R1,(SP) ;OVERLAPPING WINDOW ZERO (OR ONE€ ;IF I/D TASK ?)V�‚ .IFT ; DF U$$DASOƒ+„ BHIS 40$ ;IF HIS YES, DON'T ALLOW UNMAPL…† .IFF ; DF U$$DASL‡)ˆ BEQ 40$ ;IF EQ YES, DON'T ALLOW UNMAPS‰Š .ENDC ; DF U$$DAS‹Œ17$: ;REFERENCE LABEL'� CALL ELAW ;ELIMINATE ADDRESS WINDOWV0Ž20$: TST (SP) ;HAS A WINDOW BEEN ESTABLISHED?� BEQ 30$ ;IF EQ YESA� CMP (R3)+,(R3)+ ;POINT TO WINDOW SIZE IN BLOCK (W.NID)(W.NBAS)Y@‘ MOV (R3),W.BSIZ(R4) ;STORE SIZE, ESTABLISHING WINDOW (W.NSIZ)9’ MOV -(R3),W.BLVR(R4) ;SET LOW VIRTUAL ADDRESS (W.NBAS)3“ MOVB -(R3),R0 ;PICK UP FIRST APR NUMBER (W.NAPR)O-” ASL R0 ;CONVERT APR NUMBER TO WORD OFFSET•– .IFTI—=˜ BIT #WS.SIS,W.NSTS-W.NAPR(R3) ;CREATING SUPERVISOR WINDOW? ™ BNE 25$ ;IF NE YESš› .ENDCœ�ž .IF DF U$$DASŸ;  BIT #WS.UDS,W.NSTS-W.NAPR(R3) ;CREATING D SPACE WINDOW ?Q¡ BEQ 23$ ;IF EQ NO+-¢ ADD #UDSDR0,R0 ;POINT TO FIRST D SPACE PDRY£ BR 25$ ;ENTER COMMON CODE ¤¥ .ENDC ; DF U$$DAS¦1§23$: ADD #UINDR0,R0 ;POINT TO FIRST I SPACE PDRE0¨25$: MOVB R0,W.BFPD(R4) ;SET FIRST PDR ADDRESS©%© .IF DF M$$PRO!C$$CBP ; BM378U« ;**-14¬ CLR W.BLPD(R4) ;INITIALIZE CACHE BITS IN LAST PDR6­ BIT #WS.NBP,W.NSTS-W.NAPR(R3) ;OK TO BYPASS CACHE ?.® BEQ 27$ ;IF EQ YES, LEAVE CACHE BITS ALONE<¯ BIS #WB.NBP,W.BLPD(R4) ;REMEMEBER NOT TO BYPASS THE CACHE°27$: ;REFERENCE LABEL±(± .ENDC ; DF M$$PRO!C$$CBP ; BM378³ ;**-1D´ .IF DF U$$DASµ4¶ MOVB 4(SP),-(R3) ;PICK UP TOTAL NUMBER OF WINDOWS· ;(W.NID)¸¹ .IFF ; DF U$$DASFº3» MOVB (SP),-(R3) ;PICK UP TOTAL NUMBER OF WINDOWS7¼ ;(W.NID)½¾ .ENDC ; DF U$$DAS¿.À SUB R1,(R3) ;SET ADDRESS WINDOW ID (W.NID)2Á CLR (SP) ;INDICATE WINDOW HAS BEEN ESTABLISHED1Â30$: ADD #W.BLGH,R4 ;POINT TO NEXT WINDOW BLOCKWà DEC R1 ;MORE WINDOW BLOCKS?SÄ BGT 10$ ;IF GT YES1Å TST (SP)+ ;WAS AN ADDRESS WINDOW ESTABLISHED? Æ BNE 50$ ;IF NE NO*ÇÈ .IF DF U$$DASÉ3Ê CMP (SP)+,(SP)+ ;POP CALCULATED HIGH ADDRESS ANDSË ;SAVED NUMBER OF WINDOWSÌÍ .IFF ; DF U$$DASSÎ*Ï TST (SP)+ ;POP CALCULATED HIGH ADDRESSÐÑ .ENDC ; DF U$$DASÒÓ,Ô MOV (SP)+,R4 ;RESTORE TASK HEADER ADDRESS>Õ BIS #WS.CRW,W.NSTS(R3) ;INDICATE ADDRESS WINDOW WAS CREATED2Ö BIT #WS.MAP,W.NSTS(R3) ;IS WINDOW TO BE MAPPED?+× BNE $DRMAP ;MAP ADDRESS WINDOW AND EXITI Ø RETURN ;T%Ù40$: DRSTS D.RS84 ;ALIGNMENT ERRORH*Ú50$: DRSTS D.RS85 ;NO AVAILABLE WINDOWSÛ .PAGEÜ;+&Ý; **-$DRELW-ELIMINATE ADDRESS WINDOWÞ;NJß; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ELIMINATE THE SPECIFIED ADDRESS,à; WINDOW, UNMAPPING IT FIRST IF NECESSARY.á; â; DPB FORMAT:ã;($ä; WD. 00 -- DIC(119.),DPB SIZE(2.)0å; WD. 01 -- ADDRESS OF WINDOW DEFINITION BLOCKæ;C ç; INPUTS:Tè;M;é; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.D.ê; R3=A00�dìcÝb`TADATADATADATADATADATADDRESS OF THE WINDOW DEFINITION BLOCK.1ë; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. .ì; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.í;-4î; INPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:-ï; W.NID=ID OF ADDRESS WINDOW TO ELIMINATE.Dð;7ñ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)Pò;M/ó; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.(ô; DIRECTIVE STATUS OF +1 IS RETURNED.!õ; C=1 IF DIRECTIVE IS REJECTED.;ö; DIRECTIVE STATUS OF 'D.RS87' IS RETURNED IF AN INVALID#÷; ADDRESS WINDOW WAS SPECIFIED. ø;.5ù; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:8ú; W.NSTS=INDICATION OF ANY CHANGES IN MAPPING STATUS.9û; WS.ELW=1 IF ADDRESS WINDOW SUCCESSFULLY ELIMINATED.I2ü; WS.UNM=1 IF THE ADDRESS WINDOW WAS UNMAPPED.ý;-þ>ÿ$DRELW::CALL $SRWND ;SEARCH FOR AND VERIFY SPECIFIED WINDOW(ELAW: CALL $UNMAP ;UNMAP IF NECESSARY. BCC 10$ ;IF CC UNMAPPING WAS NOT PERFORMED9 BIS #WS.UNM,W.NSTS(R3) ;INDICATE A WINDOW WAS UNMAPPEDR<10$: CLR W.BSIZ(R4) ;INDICATE ADDRESS WINDOW IS ELIMINATED= BIS #WS.ELW,W.NSTS(R3) ;INDICATE ADDRESS WINDOW ELIMINATEDW  RETURN ;N .PAGE;+"; **-$DRMAP-MAP WINDOW TO REGION ;RD ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO MAP THE SPECIFIED ADDRESSH ; WINDOW TO AN OFFSET IN THE SPECIFIED REGION, UNMAPPING IF NECESSARY. ;C ; DPB FORMAT:L;A$; WD. 00 -- DIC(121.),DPB SIZE(2.)0; WD. 01 -- ADDRESS OF WINDOW DEFINITION BLOCK;M ; INPUTS:I;T;; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.R.; R3=ADDRESS OF THE WINDOW DEFINITION BLOCK.1; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. .; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;I4; INPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:; W.NID=ID OF WINDOW TO MAP.DB; W.NRID=ID OF REGION TO MAP TO OR 0 TO DEFAULT TO TASK REGION.+; W.NOFF=OFFSET WITHIN REGION TO MAP TO.(>; W.NLEN=LENGTH TO MAP OR 0 TO DEFAULT TO SMALLER OF WINDOW%; SIZE OR SIZE LEFT IN PARTITION.A ; W.NSTS=CONTROL INFORMATION.* ; WS.WRT=1 IF WRITE ACCESS IS DESIRED.!;D7"; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)R#;A/$; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.S(%; DIRECTIVE STATUS OF +1 IS RETURNED.!&; C=1 IF DIRECTIVE IS REJECTED. ;'; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE DESIREDO)(; REGION HAS INCURRED A PARITY ERROR.T<); DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE DESIRED%*; ACCESS TO THE REGION IS DENIED.E;+; DIRECTIVE STATUS OF 'D.RS84' IS RETURNED IF AN INVALID.2,; REGION OFFSET-SIZE COMBINATION IS SPECIFIED.;-; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF AN INVALIDA.; REGION ID IS SPECIFIED.S;/; DIRECTIVE STATUS OF 'D.RS87' IS RETURNED IF AN INVALID%0; ADDRESS WINDOW ID IS SPECIFIED. 1;C52; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE: #3; W.NLEN=LENGTH ACTUALLY MAPPED.T84; W.NSTS=INDICATION OF ANY CHANGES IN MAPPING STATUS.05; WS.UNM=1 IF THE WINDOW WAS UNMAPPED FIRST.6;CH7; THIS DIRECTIVE FIRST BUILDS AN IMAGE OF A MAPPED WINDOW BLOCK ON THEJ8; STACK. THEN IF NO ERRORS ARE ENCOUNTERED, THE CORRESPONDING WINDOW IS<9; UNMAPPED, IF NECESSARY, AND SET UP FROM THE STACK IMAGE.:;-;< =$DRMAP::>??; FOR EITHER USER D OR SUPER LIBRARY SYSTEMS, WE PUSH THE TWOC@; MAPPING MASKS (H.DMAP,H.SMAP) ONTO THE STACK FOR USE DURING APRGDA; UPDATE. H.DMAP MUST BE RE-WRITTEN TO THE HEADER AFTER THE UPDATEB; SINCE IT MAY HAVE CHANGED.CD .IF DF S$$LIB!U$$DASE=F ASSUME H.SMAP+1,H.DMAP ;H.SMAP,H.DMAP MUST BE IN SAME WORDC:G MOV H.SMAP(R4),-(SP) ;GET SUPER/USER D MASKS ONTO STACKHI .ENDC ; DF S$$LIB!U$$DASAJ0K CALL $SRWND ;SEARCH FOR AND VALIDATE ADDRESSL ;WINDOW ID/M ADD #W.NRID,R3 ;POINT TO SPECIFIED REGION IDY:N CALL $SRATT ;SEARCH FOR MATCHING ATTACHMENT DESCRIPTOR*O MOV A.PCB(R5),R2 ;POINT TO ATTACHED PCB<P CMP $TKTCB,$FXRPT ;IS THIS THE PARITY ERROR RECOVER TASK?Q BEQ 5$ ;IF EQ YES (R BIT #PS.PER,P.STAT(R2) ;PARITY ERROR?S BEQ 5$ ;IF EQ NO T JMP 90$ ;.:U5$: BIT #W00�dÖc³cÙ´cÚµcÛ¶c�·c›’S.RES,W.NSTS-W.NRID(R3) ;MAP ONLY IF RESIDENT?V BEQ 10$ ;NO IF EQA:W BIT #PS.CKP!PS.CKR!PS.OUT,P.STAT(R2) ;REGION IN MEMORY?X BEQ 10$ ;IF EQ YESY JMP 100$ ;-Z10$: MOV R2,-(SP) ;SET PCB ADDRESS (W.BPCB) :[ MOV W.BLVR(R4),-(SP) ;COPY LOW VIRTUAL ADDRESS (W.BLVR)'\ TST (R3)+ ;POINT TO OFFSET (W.NRID) ]^ .IF NDF X$$HDRK_2` MOV (R3)+,R0 ;PICK UP SPECIFIED OFFSET (W.NOFF)ab .IFF ; NDF X$$HDRc?d MOVB P.HDLN(R2),R0 ;PICK UP LENGTH OF EXTERNAL HEADER (OR 0) 5e ADD (R3)+,R0 ;CALCULATE REAL OFFSET INTO PARTITIONSf ;(ADD IN W.NOFF)2g BCS 35$ ;IF CS THE OFFSET WRAPPED AROUND. THIS-h ;MAY CAUSE A MAP INTO THE EXTERNAL HDR,1+i ;SO IT IS TREATED ALWAYS AS AN ERROR,("j ;REGARDLESS OF FINAL OFFSET.kl .ENDC ; NDF X$$HDRBm'n CMP R0,P.SIZE(R2) ;WITHIN PARTITION? o BHIS 35$ ;IF HIS NO/p MOV (R3),R1 ;PICK UP LENGTH TO MAP (W.NLEN)N$q BNE 20$ ;IF NE ONE WAS SPECIFIED8r MOV P.SIZE(R2),R1 ;CALCULATE SIZE TO END OF PARTITIONs SUB R0,R1 ;+Dt CMP R1,W.BSIZ(R4) ;SIZE TO END GREATER THAN WINDOW SIZE? (W.BSIZ)u BLOS 20$ ;IF LOS NOE5v MOV W.BSIZ(R4),R1 ;DEFAULT TO WINDOW SIZE (W.BSIZ) 1w20$: MOV R1,(R3)+ ;PASS BACK SIZE USED (W.NLEN)N8x MOV R1,-(SP) ;CALCULATE HIGH VIRTUAL ADDRESS (W.BHVR)y SWAB (SP) ;MULTIPLY BY 64.z RORB (SP) ;P{ ROR (SP) ;| ROR (SP) ;,} DEC (SP) ;POINT TO LAST ADDRESSABLE BYTE~ ADD 2(SP),(SP) ; = MOV R5,-(SP) ;STORE ADDR OF ATTACHMENT DESCRIPTOR (W.BATT)T2€ MOV W.BSIZ(R4),-(SP) ;COPY WINDOW SIZE (W.BSIZ)%� CMP R1,(SP) ;LEGAL SIZE? (W.BSIZ) ‚ BHI 35$ ;IF HI NO ƒ„ .IF DF X$$HDR…)† MOV R0,-(SP) ;COPY THE OFFSET (W.NOFF)Z6‡ CLR R5 ;SUBTRACT THE HEADER LENGTH FROM THE OFFSET2ˆ MOVB P.HDLN(R2),R5 ;FOR CORRECT ALIGNMENT CHECK:‰ SUB R5,(SP) ;SUB THE HEADER LENGTH FOR ALIGNMENT CHECK#Š BIT #7,(SP)+ ;64-BYTE ALIGNMENT?P‹Œ .IFF ; DF X$$HDRA�!Ž BIT #7,R0 ;64-BYTE ALIGNMENT?R�� .IFTF ; DF X$$HDR‘’ BEQ 30$ ;IF EQ NOT5“ BIT #WS.64B,(R3) ;64-BYTE ALIGNMENT BEING ALLOWED?” BEQ 35$ ;IF EQ NOZ•– .IFT ; DF X$$HDR —˜30$: MOV 2(SP),R5 ;RESTORE R51™ MOV R0,-(SP) ;SET OFFSET IN PARTITION (W.BOFF)Rš› .IFF ; DF X$$HDREœ5�30$: MOV R0,-(SP) ;SET OFFSET IN PARTITION (W.BOFF)IžŸ .ENDC ; DF X$$HDR 2¡ ADD R1,R0 ;POINT PAST LAST 32W BLOCK MAPPED TO'¢ CMP R0,P.SIZE(R2) ;WITHIN PARTITION? £ BLOS 37$ ;IF LOS YES¤35$: JMP 70$ ;N=¥37$: MOV W.BFPD(R4),-(SP) ; SAVE FIRST PDR ADDRESS (W.BFPD)7¦ BITB #AS.RED!AS.WRT,A.STAT(R5) ;READ ACCESS ALLOWED?B§ BEQ 38$ ;IF NE NO¨©%© .IF DF M$$PRO!C$$CBP ; BM378R« ;**-1R9¬ MOV W.BLPD(R4),-(SP) ;GET PREVIOUS STATE OF CACHE BITSF8­ BIC #^C,(SP) ;CLEAR ALL BUT THE NO BYPASS BIT9® BIS #77402,(SP) ;SET FOR READ ACCESS, 4K SIZE (W.BLPD)I¯'¯ .IFF ; DF M$$PRO!C$$CBP ; BM378.± ;**-1R:² MOV #77402,-(SP) ;SET FOR READ ACCESS, 4K SIZE (W.BLPD)³(³ .ENDC ; DF M$$PRO!C$$CBP ; BM378µ ;**-1T3¶ BIT #WS.WRT,(R3) ;WRITE ACCESS DESIRED? (W.NSTS)· BEQ 40$ ;IF EQ NO1¸ BITB #AS.WRT,A.STAT(R5) ;WRITE ACCESS ALLOWED? ¹ BNE 39$ ;IF NE YESº38$: JMP 80$ ;P»39$: ;REFERENCE LABEL¼%¼ .IF DF M$$PRO!C$$CBP ; BM378E¾ ;**-1B,¿ BIS #4,(SP) ;CHANGE ACCESS TO READ/WRITEÀ(À .IFF ; DF M$$PRO!C$$CBP ; BM378 ;**-1 9à MOV #77406,(SP) ;SET FOR 4K READ/WRITE ACCESS (W.BLPD) Ä(Ä .ENDC ; DF M$$PRO!C$$CBP ; BM378Æ ;**-1 Ç40$: ;REF SYMBOLTÈÉ%É .IF DF M$$PRO!C$$CBP ; BM3784Ë ;**-1B=Ì BIT #WS.BPS,(R3) ;SHOULD ACCESSES ALWAYS BYPASS THE CACHE? Í BEQ 401$ ;IF EQ NO9Î BIS #WB.BPS!100000,(SP) ;SET UP TO ALWAYS BYPASS CACHE Î ; BM378 Î .IF DF M$$PRO ; BM378AÎ ; BM378I Ï BR 43$ ;Ï ; BM378 "Ï .IFTF ; DF M$$PRO ; BM378Ï ; BM378 Ï401$: ; BM378Ï ; BM378C!Ï .IFT ; DF M$$PRO ; BM378Ï ; BM3780>Ï BIT #WB.NBP,(SP) ;NOT B00�dìcÝb`TADATADATADATADATADATAYPASSING CACHE THIS WINDOW? ; BM3781Ñ BNE 43$ ;IF NE YES, SKIP BYPASS TESTS ;**-1 Ò41$: MOV R1,-(SP) ;SAVE R1$Ó MOV A.PCB(R5),R1 ;GET PCB ADDRESS1Ô CALL $GTMCT ;DETERMINE NUMBER OF MAPPED TASKS Õ TST R2 ;IS BYPASS NECESSARY?Ö BEQ 42$ ;NO IF EQ+× BIS #100000,2(SP) ;SET BYPASS BIT IN PDR &Ø42$: MOV R1,R2 ;RESTORE PCB ADDRESSÙ MOV (SP)+,R1 ;RESTORE R1Ù ;JWB1958"Ù .ENDC ; DF M$$PRO ;JWB195Ú(Ú .ENDC ; DF M$$PRO!C$$CBP ; BM378Ü ;**-1 Ý.Þ43$: CALL $UNMAP ;UNMAP WINDOW IF NECESSARY(ß BCC 45$ ;IF CC WINDOW WAS NOT MAPPED<à BIS #WS.UNM,(R3) ;INDICATE A WINDOW WAS UNMAPPED (W.NSTS)áIâ; SINCE THE UNMAP MAY HAVE CAUSED THE USER-D MAPPING TO CHANGE, WE MUSTSHã; UPDATE THE COPY OF H.SMAP ON THE STACK FROM THE CHANGED VALUE IN THE ä; HEADER.2å .IF DF S$$LIB!U$$DASBæç .IF DF X$$HDRè,é MOV $SAHPT,R0 ;GET POINTER TO TASK HEADERêë .IFF ; DF X$$HDRì,í MOV $HEADR,R0 ;GET POINTER TO TASK HEADERîï .ENDC ; DF X$$HDRðBñ MOV H.SMAP(R0),W.BLGH(SP) ; UPDATE THE STORED MAPPING FLAG WORDòó .ENDC ; DF S$$LIB!U$$DASIô-õ45$: MOVB W.BFPD(R4),R0 ;POINT TO FIRST PDRCö÷ø .IF DF S$$LIBùú BMI 46$ ;IF MI USER WINDOW0û ADD #SISDR0,R0 ;POINT TO FIRST SUPERVISOR PDR2ü TSTB $SUPFL ;IS THIS FIRST SUPER MODE WINDOW ?ý BNE 455$ ;IF NE YES.þ MOV R0,-(SP) ;SAVE REGISTERS0ÿ MOV R1,-(SP) ;S' CALL $LSUP1 ;MAP SUPERVISOR D SPACE" MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R0 ;C8455$: INCB $SUPFL ;INDICATE ADDITIONAL SUPER I WINDOW .IFTF746$: MOV P.REL(R2),R2 ;CALCULATE OFFSET FOR FIRST PDRV ADD 4(SP),R2 ;(W.BOFF)I-  CLRB 3(SP) ;INIT NUMBER OF PDR'S (W.BNPD)40 50$: INCB 3(SP) ;INC NUMBER OF PDR'S (W.BNPD),  MOV R2,UISAR0-UISDR0(R0) ;SET UP USER APR'  MOV (SP),(R0)+ ;SET UP NEXT USER PDR   .IFTJ; FIRST CHECK FOR A SUPERVISOR WINDOW. IF IT IS SUPERVISOR, THEN WE MUSTF; CHECK THE SUPERVISOR MAPPING MASK, AND POSSIBLY UPDATE THE SUPER D ; PAR/PDR.1 CMP R0,#UINDR0+2 ;USER SPACE (I OR D) WINDOW ?0 BHIS 52$ ;IF HIS YES, GO DO USER SPACE TESTS@ BITB $BTMSK-2-SISDR0-2(R0),W.BLGH(SP) ;SUPER I/D OVERMAPPED ? BEQ 55$ ;IF EQ NO01 MOV R2,SDSAR0-SISDR0-2(R0) ;UPDATE SUPER D PARV3 MOV (SP),SDSDR0-SISDR0-2(R0) ;UPDATE SUPER D PDRR BR 55$ ;GO DO NEXT PAR/PDR52$: ;REFERENCE LABEL .IFTF ; DF S$$LIBG ; CHECK FOR USER I OR USER D WINDOW. IF A USER I WINDOW, CHECK TO SEE,H!; IF BOTH SPACES MUST BE UPDATED. IF NOT, UPDATE IS DONE. IF SO, CHECKF"; TO SEE IF THIS APR IS USED FOR AN EXPLICIT D WINDOW. IF SO, UPDATE)#; IS DONE. IF NOT UPDATE USER D PAR/PDRH$% .IF DF U$$DAS&-' CMP R0,#UDSDR0+2 ;USER DATA SPACE WINDOW ?S+( BHIS 53$ ;IF HIS YES, GO UPDATE D SPACED;) BITB $BTMSK-UINDR0-2(R0),W.BLGH+1(SP) ;D SPACE MAPPED BYT* ;OTHER WINDOW ?&+ BNE 55$ ;IF NE YES, UPDATE IS DONE0, MOV R2,UDSAR0-UINDR0-2(R0) ;UPDATE USER D PAR2- MOV (SP),UDSDR0-UINDR0-2(R0) ;UPDATE USER D PDR./ .ENDC ; DF U$$DAS0>1; WE HAVE JUST UPDATED A USER D PAR/PDR. CHECK TO SEE IF THEF2; CORRESPONDING SUPER D SPACE PAR/PDR IS CURRENTLY MAPPED INTO USERD83; OR SUPER I SPACE. IF USER D, UPDATE SUPER D PAR/PDR.45 .IFT ; DF S$$LIB 6;7 BITB $BTMSK-2-UINDR0-2(R0),W.BLGH(SP) ;SUPER D MAPPED TOL8 ;USER D THIS APR ?%9 BNE 55$ ;IF NE NO, UPDATE IS DONEI1: MOV R2,SDSAR0-UINDR0-2(R0) ;UPDATE SUPER D PAR(3; MOV (SP),SDSDR0-UINDR0-2(R0) ;UPDATE SUPER D PDR0<= .ENDC ; DF S$$LIB>? .IF DF U$$DAS@&A BR 55$ ;BRANCH AROUND D SPACE CODEBC .IFTF ; DF U$$DASDE53$: ;REFERENCE LABELFG .IFT ; DF U$$DAS HBI; SET BIT IN H.DMAP PROTOTYPE INDICATING THAT THIS APR IS IN USE#J; FOR AN EXPLICIT D SPACE WINDOW.BK@L BISB $BTMSK-UDSDR0-2(R0),W.BLGH+1(SP) ;INDICATE USER D WINDOWM ;USES THIS APRINCO; CHECK TO SEE IF USER D AND SUPER D ARE OVERMAPPED FOR THIS APR.A-P; IF THEY ARE, THEN UPDATE SUPER D PAR/PDR.EQR .IF DF S$$LIBS>T B00� dÖc³cÙ´cÚµcÛ¶c�·c›’ITB $BTMSK-2-UDSDR0-2(R0),W.BLGH(SP) ;SUPER D/USER D OVER-U ;MAPPED FOR THIS APR ?D%V BNE 55$ ;IF NE NO, UPDATE IS DONE1W MOV R2,SDSAR0-UDSDR0-2(R0) ;UPDATE SUPER D PART3X MOV (SP),SDSDR0-UDSDR0-2(R0) ;UPDATE SUPER D PDREYZ .ENDC ; DF S$$LIB[\ .ENDC ; DF U$$DAS]^ .IF DF S$$LIB_` .IFTFa'b55$: ADD #200,R2 ;ADVANCE APR OFFSETCc SUB #200,R1 ;DONE YET?d BGT 50$ ;IF GT NOHef%f .IF DF M$$PRO!C$$CBP ; BM378Ph ;**-1F,i ADD #177,R1 ;CALCULATE VALUE OF LAST APR&j SWAB R1 ;PLACE IT IN THE HIGH BYTE#k BIC #77400,(SP) ;INITIALIZE SIZE$%l BIS R1,(SP) ;SET SIZE OF LAST PDR,m MOV (SP),-(R0) ;SET LAST PDR n(n .IFF ; DF M$$PRO!C$$CBP ; BM378p ;**-1+q SWAB R1 ;SHIFT UNUSED SIZE TO HIGH BYTESr CLRB R1 ;CLEAR LOW BYTE+s ADD R1,(SP) ;CALCULATE SIZE IN LAST PDROt ADD R1,-(R0) ;SET LAST PDREu(u .ENDC ; DF M$$PRO!C$$CBP ; BM378w ;**-1 xyz .IFT {|J}; FIRST CHECK FOR A SUPERVISOR WINDOW. IF IT IS SUPERVISOR, THEN WE MUSTF~; CHECK THE SUPERVISOR MAPPING MASK, AND POSSIBLY UPDATE THE SUPER D ; PAR/PDR.€/� CMP R0,#UINDR0 ;USER SPACE (I OR D) WINDOW ?;0‚ BHIS 56$ ;IF HIS YES, GO DO USER SPACE TESTS>ƒ BITB $BTMSK-2-SISDR0(R0),W.BLGH(SP) ;SUPER I/D OVERMAPPED ?„ BEQ 59$ ;IF EQ NO,…%… .IF DF M$$PRO!C$$CBP ; BM378R‡ ;**-1D1ˆ MOV (SP),SDSDR0-SISDR0(R0) ;UPDATE SUPER D PDR‰(‰ .IFF ; DF M$$PRO!C$$CBP ; BM378‹ ;**-1 /Œ ADD R1,SDSDR0-SISDR0(R0) ;UPDATE SUPER D PDRU�(� .ENDC ; DF M$$PRO!C$$CBP ; BM378� ;**-1E� BR 59$ ;UPDATE IS DONE‘56$: ;REFERENCE LABEL’“ .IFTF ; DF S$$LIB”G•; CHECK FOR USER I OR USER D WINDOW. IF A USER I WINDOW, CHECK TO SEELH–; IF BOTH SPACES MUST BE UPDATED. IF NOT, UPDATE IS DONE. IF SO, CHECKF—; TO SEE IF THIS APR IS USED FOR AN EXPLICIT D WINDOW. IF SO, UPDATE)˜; IS DONE. IF NOT UPDATE USER D PAR/PDR ™š .IF DF U$$DAS›+œ CMP R0,#UDSDR0 ;USER DATA SPACE WINDOW ?(+� BHIS 57$ ;IF HIS YES, GO UPDATE D SPACE$(ž TST W.BLGH+2(SP) ;UPDATE ALL SPACES ?Ÿ BNE 59$ ;IF NE NOI9  BITB $BTMSK-UINDR0(R0),W.BLGH+1(SP) ;D SPACE MAPPED BYB¡ ;OTHER WINDOW ?&¢ BNE 59$ ;IF NE YES, UPDATE IS DONE£%£ .IF DF M$$PRO!C$$CBP ; BM378D¥ ;**-1E0¦ MOV (SP),UDSDR0-UINDR0(R0) ;UPDATE USER D PDR§(§ .IFF ; DF M$$PRO!C$$CBP ; BM378© ;**-1 .ª ADD R1,UDSDR0-UINDR0(R0) ;UPDATE USER D PDR«(« .ENDC ; DF M$$PRO!C$$CBP ; BM378­ ;**-1H® .ENDC ; DF U$$DAS¯>°; WE HAVE JUST UPDATED A USER D PAR/PDR. CHECK TO SEE IF THEF±; CORRESPONDING SUPER D SPACE PAR/PDR IS CURRENTLY MAPPED INTO USERD8²; OR SUPER I SPACE. IF USER D, UPDATE SUPER D PAR/PDR.³´ .IFT ; DF S$$LIBBµ9¶ BITB $BTMSK-2-UINDR0(R0),W.BLGH(SP) ;SUPER D MAPPED TO(· ;USER D THIS APR ?%¸ BNE 59$ ;IF NE NO, UPDATE IS DONE¹%¹ .IF DF M$$PRO!C$$CBP ; BM378(» ;**-1P1¼ MOV (SP),SDSDR0-UINDR0(R0) ;UPDATE SUPER D PDR½(½ .IFF ; DF M$$PRO!C$$CBP ; BM378¿ ;**-1T/À ADD R1,SDSDR0-UINDR0(R0) ;UPDATE SUPER D PDRRÁ(Á .ENDC ; DF M$$PRO!C$$CBP ; BM378à ;**-1Ä .ENDC ; DF S$$LIBÅÆ .IF DF U$$DASÇ&È BR 59$ ;BRANCH AROUND D SPACE CODEÉÊ .IFTF ; DF U$$DASËÌ57$: ;REFERENCE LABELÍÎ .IFT ; DF U$$DAS ÏCÐ; CHECK TO SEE IF USER D AND SUPER D ARE OVERMAPPED FOR THIS APR. -Ñ; IF THEY ARE, THEN UPDATE SUPER D PAR/PDR.DÒÓ .IF DF S$$LIBÔ<Õ BITB $BTMSK-2-UDSDR0(R0),W.BLGH(SP) ;SUPER D/USER D OVER-Ö ;MAPPED FOR THIS APR ?U%× BNE 59$ ;IF NE NO, UPDATE IS DONE.Ø%Ø .IF DF M$$PRO!C$$CBP ; BM378 Ú ;**-1N1Û MOV (SP),SDSDR0-UDSDR0(R0) ;UPDATE SUPER D PDR Ü(Ü .IFF ; DF M$$PRO!C$$CBP ; BM378Þ ;**-1:/ß ADD R1,SDSDR0-UDSDR0(R0) ;UPDATE SUPER D PDRà(à .ENDC ; DF M$$PRO!C$$CBP ; BM378â ;**-1Aã .ENDC ; DF S$$LIBäå .ENDC ; DF U$$DASæç00�(dìcÝb`TADATADATADATADATADATAè/é59$: MOV R4,R3 ;COPY POINTER TO WINDOW BLOCK.1ê ADD #W.BLGH,R3 ;POINT PAST END OF WINDOW BLOCKRBë60$: MOV (SP)+,-(R3) ;COPY IMAGE OF WINDOW BLOCK INTO REAL BLOCKì CMP R3,R4 ;DONE YET?í BHI 60$ ;IF HI NOîIï; IF THIS IS A USER D OR SUPER LIB SYSTEM, THEN THERE IS A FLAG WORD ON$Jð; THE STACK. IF SUPER LIB SYSTEM ONLY, WE CAN DISCARD THIS WORD. IF USERJñ; D, THEN THE HIGH BYTE OF THIS WORD MUST BE RE-WRITTEN TO H.DMAP IN THEIò; TASK HEADER. IN ADDITION, USER D SYSTEMS HAVE AN OVERMAP DEFAULT FLAG,)ó; WHICH MUST BE REMOVED FROM THE STACK.#ôõ .IF NDF U$$DASNö÷ .IF DF S$$LIBø"ù TST (SP)+ ;CLEAN OFF FLAG WORDúû .ENDC ; DF S$$LIBüý .IFF ; NDF U$$DASþÿ .IF DF X$$HDR, MOV $SAHPT,R0 ;GET ADDRESS OF TASK HEADER .IFFF, MOV $HEADR,R0 ;GET ADDRESS OF TASK HEADER .ENDC  ;  MOV (SP)+,H.SMAP(R0) ;UPDATE SUPER/USER D MASK IN HEADER    .ENDC ; DF U$$DAS2 MOV $TKTCB,R0 ;PICK UP CURRENT TASK TCB ADDRESS, MOV W.BPCB(R4),R1 ;PICK UP PCB OF MAPPING .IF DF M$$PRO: CALL $SETBP ;SET UP OTHER RUNNING MAPPED TASK (IF ANY) .ENDC: TSTB A.MPCT(R5) ;IS THIS FIRST MAP THROUGH ATTACHMENT ?( BNE 65$ ;IF NE NO, DON'T CALL $ACCRG1 MOV #$ACCRG,-(SP) ;FORCE RETURN THROUGH $ACCRGE:65$: INCB A.MPCT(R5) ;INCREMENT MAPPING THROUGH THIS ADB .IF DF X$$HDR&F$$MAP  ,! CALL $STFMC ;SETUP FAST MAP IF NECESSARY"# .ENDC ; DF X$$HDR&F$$MAPU$'% RETURN ;BACK TO CALLER (OR $ACCRG),7&70$: DRSTS D.RS84 ;INVALID OFFSET-LENGTH COMBINATION5'80$: DRSTS D.RS16 ;DESIRED ACCESS TO REGION DENIEDN<(90$: DRSTS D.RS6 ;REGION HAD LOAD FAILURE OR PARITY ERROR,)100$: DRSTS D.RS8 ;REGION IS NON RESIDENT* .PAGE+;+",; **-$DRUNM-UNMAP ADDRESS WINDOW-;RF.; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO UNMAP THE SPECIFIED ADDRESS /; WINDOW.D0;H1; DPB FORMAT:2; $3; WD. 00 -- DIC(123.),DPB SIZE(2.)04; WD. 01 -- ADDRESS OF WINDOW DEFINITION BLOCK5; 6; INPUTS: 7;G;8; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK..9; R3=ADDRESS OF THE WINDOW DEFINITION BLOCK.1:; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.E.;; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.<; 4=; INPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:!>; W.NID=ID OF WINDOW TO UNMAP.S?;S<@; OUTPUTS: (DIRECTIVE STATUS AND PS WORD RETURNED TO TASK)A; /B; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.I(C; DIRECTIVE STATUS OF +1 IS RETURNED.!D; C=1 IF DIRECTIVE IS REJECTED.=E; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THE SPECIFIEDK F; ADDRESS WINDOW NOT MAPPED.;G; DIRECTIVE STATUS OF 'D.RS87' IS RETURNED IF AN INVALID %H; ADDRESS WINDOW ID IS SPECIFIED.EI;E5J; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:O8K; W.NSTS=INDICATION OF ANY CHANGES IN MAPPING STATUS.7L; WS.UNM=1 IF THE WINDOW WAS SUCCESSFULLY UNMAPPED.)M;-N7O$DRUNM::CALL $SRWND ;SEARCH FOR AND VERIFY WINDOW IDC#P CALL $UNMAP ;UNMAP IF NECESSARY=(Q BCC 10$ ;IF CC WINDOW WAS NOT MAPPED?R BIS #WS.UNM,W.NSTS(R3) ;INDICATE ADDRESS WINDOW WAS UNMAPPED S RETURN ;E2T10$: DRSTS D.RS8 ;ADDRESS WINDOW WAS NOT MAPPEDUVWX;+Y; DRSRF HAS MOVED.Z;I'[; ITS FORWARDING ADDRESS IS DRSRF.MACN\;E<]; THIS IS DUE TO THE ADDITION OF A SEPARATE COMMON FOR THE^; PLAS DIRECTIVES._;U@`; YOU MAY BE WONDERING WHY DRRRF IS STILL HERE. ALL DIRECTIVESAa; WHICH USE A PLAS DEFINITION BLOCK WHICH IS RELOCATED BY DRDSPUAb; MUST BE IN THE SAME DIRECTIVE COMMON, SINCE THE RELOCATION OFSAc; THE RDB/WDB TRIGGERS MAPPING THE PLAS COMMON. DRSRF RELOCATESRCd; THE BLOCK ITSELF AND THEREFORE CAN'T BE INCLUDED IN THE COMMON.e;-f .PAGEg;+"h; **-$DRRRF-RECEIVE BY REFERENCEi;IFj; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DEQUEUE THE NEXT RECEIVE BYIk; REFERENCE PACKET IN THE RECEIVE QUEUE, OPTIONALLY EXITING IF THERE IS l; NOT ONE THERE.m;Sn; DPB FORMAT: o;D#p; WD. 00 -- DIC(81.),DPB SIZE(2.) 0q; WD. 01 -- ADDRESS OF WINDOW DEFINITI00�0dÖc³cÙ´cÚµcÛ¶c�·c›’ON BLOCKr; s; INPUTS:Nt;;u; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.A.v; R3=ADDRESS OF THE WINDOW DEFINITION BLOCK.1w; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK..x; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.y;C4z; INPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE: {; W.NSTS=CONTROL INFORMATION.5|; WS.MAP=1 IF RECEIVED REFERENCE IS TO BE MAPPED.N7}; WS.RCX=1 IF TASK EXIT DESIRED IF NO PACKET FOUND.(C~; W.NSRB=OPTIONAL ADDRESS OF 10 WORD BUFFER FOR ADDITIONAL INFO.;7€; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)D�;H/‚; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.F(ƒ; DIRECTIVE STATUS OF +1 IS RETURNED.!„; C=1 IF DIRECTIVE IS REJECTED.D3…; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE 2†; DIRECTIVE FAILS IN THE MAPPING STAGE BECAUSE0‡; THE SPECIFIED REGION HAS INCURRED A PARITY ˆ; ERROR.;‰; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THERE IS NOA.Š; RECEIVE BY REFERENCE ENTRY IN THE QUEUE.<‹; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE ADDRESS(Œ; CHECK OF THE RECEIVE BUFFER FAILS.�; 5Ž; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:C8�; W.NRID=ASSIGNED REGION ID OF THE REFERENCED REGION.1�; W.NOFF=OFFSET WORD SPECIFIED BY SENDER TASK.N1‘; W.NLEN=LENGTH WORD SPECIFIED BY SENDER TASK.A1’; W.NSTS=STATUS WORD SPECIFIED BY SENDER TASK. ,“; WS.RED=1 IF ATTACHED WITH READ ACCESS.-”; WS.WRT=1 IF ATTACHED WITH WRITE ACCESS.E.•; WS.EXT=1 IF ATTACHED WITH EXTEND ACCESS..–; WS.DEL=1 IF ATTACHED WITH DELETE ACCESS.)—; WS.RRF=1 IF RECEIVE WAS SUCCESSFUL.L˜;-™*š$DRRRF::MOV KISAR6,-(SP) ;SAVE APR6 BIAS5› MOV R3,-(SP) ;SAVE WINDOW DEFINITION BLOCK POINTERE9œ MOV T.RRFL(R5),R2 ;PICK UP FIRST RECEIVE BY REF PACKETA � BEQ 60$ ;IF EQ THERE IS NONEž CLR -(SP) ;INIT EFN ADDRESSTŸ CLR -(SP) ;INIT EFN MASK6  TST (R2)+ ;POINT TO RECEIVER TCB ADDRESS IN PACKET$¡ MOV (R2)+,R0 ;PICK UP TCB ADDRESS!¢ BEQ 20$ ;IF EQ NONE SPECIFIEDH8£ DECB T.SRCT(R0) ;DECREMENT SENDER'S OUTSTANDING SREFS#¤ MOV (R2),(SP) ;SET REAL EFN MASKV(¥ MOV 2(R2),2(SP) ;SET REAL EFN ADDRESS%¦20$: MOV R0,-(SP) ;SAVE TCB ADDRESSR%§ CMP (R2)+,(R2)+ ;SKIP TO REGION IDO7¨ ADD #W.NRID,R3 ;POINT TO REGION ID WORD IN DEF BLOCKF#© MOV (R2)+,(R3)+ ;STORE REGION ID ª MOV (R2)+,(R3)+ ;STORE OFFSET « MOV (R2)+,(R3)+ ;STORE LENGTH ¬ BIS (R2)+,(R3)+ ;STORE ACCESS=­ MOV (R3),R3 ;PICK UP VIRTUAL ADDR OF EXTENDED INFO BUFFER.® BEQ 40$ ;IF EQ THERE ONE WAS NOT SPECIFIED+¯ MOV #10.*2,R1 ;SET SIZE TO ADDRESS CHECK° MOV R2,-(SP) ;SAVE R2)± CALL $ACHKP ;ADDRESS CHECK THE BUFFERA² MOV (SP)+,R2 ;RESTORE R2S7³ MOV -14(R2),(R3)+ ;STORE THE TASK NAME IN THE BUFFER´ MOV -12(R2),(R3)+ ;-µ MOV -16(R2),R0 ;PICK UP SENDER TCB ADDRESS( ¶ BEQ 25$ ;IF EQ THERE IS NONE,· MOV T.NAM+2(R0),-(R3) ;SET REAL TASK NAME¸ MOV T.NAM(R0),-(R3) ;(¹ CMP (R3)+,(R3)+ ;POINT PAST TASK NAME3º25$: MOV #8.,R0 ;SET LOOP COUNT FOR REST OF INFO /»30$: MOV (R2)+,(R3)+ ;MOVE REST OF EXTRA INFO,¼ DEC R0 ;DONE YET? ½ BGT 30$ ;IF GT NO 1¾40$: MOV R5,R3 ;SAVE RECEIVER TASK TCB ADDRESSA1¿ MOV (SP)+,R5 ;RETRIEVE SENDER TASK TCB ADDRESS+)À MOV (SP)+,R0 ;RETRIEVE EVENT FLAG MASKV1Á MOV (SP)+,R1 ;RETRIEVE EVENT FLAG WORD ADDRESS ! BEQ 50$ ;IF EQ NO FLAG TO SETE3à CALL $SETMG ;SET EFN AND UNLOCK IF GROUP GLOBALA&Ä50$: MOV R3,R5 ;RESTORE TCB ADDRESS5Å MOV R5,R0 ;POINT TO RECEIVE BY REFERENCE LISTHEAD Æ ADD #T.RRFL,R0 ;F(Ç CALL $QRMVF ;REMOVE PROCESSED PACKET%È MOV R1,R0 ;COPY POINTER TO PACKET"É CALL $DEPKT ;DEALLOCATE PACKET2Ê MOV (SP)+,R3 ;RESTORE WINDOW DEFINITION POINTER-Ë MOV (SP)+,KISAR6 ;RESTORE KERNAL APR6 BIAS(CÌ BIS #WS.RRF,W.NSTS(R3) ;INDICATE SUCCESSFUL RECEIVE BY REFERENCEL.Í BIT #WS.MAP,W.NSTS(R3) ;WINDOW MAP DESIRED?Î BEQ 80$ ;IF EQ NOSÏ CALLR $DRMAP ;MAP WINDOW@Ð60$: CMPB #213.,$DICSV ;IS THIS RECEIVE BY REFERENCE OR STOP?Ñ BNE 61$ ;IF NE NOEÒ CMP (SP)+,(SP)+ ;CLEAN STACKÓ JMP $STPCT ;GO STOP TASK6Ô61$: BIT #WS.RCX,W.NSTS(00�8dìcÝb`TADATADATADATADATADATAR3) ;DOES TASK WISH TO EXIT?Õ BEQ 70$ ;IF EQ NO Ö CMP (SP)+,(SP)+ ;CLEAN STACKW!× JMP $DREXT ;PERFORM TASK EXITP+Ø70$: DRSTS D.RS8 ;NO REFERENCES IN QUEUE#Ù80$: RETURN ;IÚ .PAGEÛ;+/Ü; **-$DRFMP-FAST REMAP OF TASK ADDRESS WINDOW3Ý;N?Þ; THIS DIRECTIVE IS INVOKED TO PERFORM A FAST REMAP OF A TASKI?ß; ADDRESS WINDOW. THIS IS NOT A DIRECTIVE PER SE (REQUIRES NOS@à; DPB), BUT IS INVOKED BY LOADING USER REGISTERS AND EXECUTINGá; AN IOT INSTRUCTION.Kâ;1<ã; TASKS BUILT TO MAKE USE OF THE FAST MAP FACILITY HAVE AN>ä; ADDITIONAL DATA AREA APPENDED TO THEIR HEADERS. THE FORMAT0å; OF THIS BLOCK IS DOCUMENTED IN $STFMP BELOW.æ;I ç; INPUTS:0è;Té; R0 = FAST MAP IDê; R1 = NEW MAP OFFSETMë; ì; OUTPUTS:í;3î; R0 = COMPLETION STATUSï; +1 = SUCCESSFð; IE.ALG = INVALID OFFSETñ;I ò; NOTES:ó; 6ô; R0 -> R3 ARE DESTROYED DURING FAST MAP PROCESSING.õ; =ö; FAST MAP TAKES PLACE AT PR7, KERNEL MODE, STACK DEPTH +1.÷;Gø; FAST MAP WITH WINDOW LENGTH CHANGE TAKES PLACE AT PR0, KERNEL MODE,N@ù; STACK DEPTH 0 (LOOKS LIKE INTERRUPT STATE FOR A PR0 DEVICE).ú;SKû; ALTHOUGH SUPERVISOR MODE WINDOWS CAN'T YET BE FAST MAPPED, THE COMMENTSGü; IN THIS MODULE INCLUDE INFORMATION RELATIVE TO THAT IMPLEMENTATION.Tý;Hþ; BLKMUL IS SET TO 2 IF SYSTEM HAS BOTH USER D AND SUPER MODE SUPPORT,Fÿ; 1 OTHERWISE. THIS IS BECAUSE THE OFFSET INTO JUMP TABLE FIELD MUST/; BE BIGGER THAN 255. IF THE SYSTEM HAS BOTH.T;- .IF DF X$$HDR&F$$MAPD .IF DF U$$DAS&S$$LIBA  BLKMUL = 1N  BLKDIV = 2T   .IFF ; DF U$$DAS & S$$LIB   BLKMUL = 2  BLKDIV = 1H .ENDC ; DF U$$DAS & S$$LIBB;+$$DRFMP::NOP ;;;* * * DEBUG * * *4 MOV $SAHDB,KISAR6 ;;;MAP CURRENT USER TASK HEADER4 BIC #77607,R0 ;;;VALIDATE USER'S FAST MAP POINTER$ ;;;(FORCE POINTER TO BE VALID). ;;;(ALSO, TEST HIGH BIT TO SEE IF WINDOW$ ;;;LENGTH CHANGE WAS DESIRED.)* BMI 20$ ;;;IF MI LENGTH CHANGE DESIRED1 ADD $FMAPP,R0 ;;;GET POINTER TO FAST MAP AREAU' CMP R1,(R0)+ ;;;PAST MAXIMUM OFFSET?A BHIS 10$ ;;;IF HI YES (  MOV (R0)+,R2 ;;;GET ADDRESS OF W.BOFF7! MOV R1,(R2) ;;;STORE NEW OFFSET FIELD (LESS P.HDLN)G"1# ADD @(R0)+,R1 ;;;ADD IN P.REL OF PCB TO OFFSETE$7% MOVB (R0)+,R3 ;;;GET P.HDLN VALUE AND EXPAND TO WORD1& ADD R3,R1 ;;;FORM REAL ADDRESS OF MAPPED AREA 0' ADD R3,(R2)+ ;;;ADJUST OFFSET IN WINDOW BLOCK(#) MOVB (R2)+,R2 ;;;GET APR ADDRESSL7* ADD #UISAR0-UISDR0,R2 ;;;POINT TO PAR INSTEAD OF PAR +(, MOVB (R0),R0 ;;;GET JUMP TABLE VALUE-. .IF DF U$$DAS & S$$LIB;/"0 ASL R0 ;;;SHIFT INDEX TO WORDS12 .ENDC ; DF U$$DAS & S$$LIB;3*4 MOV #200,R3 ;;;SET OFFSET BETWEEN PARS)5 CALL FMPW1(R0) ;;;AND DISPATCH INTO ITE6#7 MOV #1,R0 ;;;SET SUCCESS STATUSL8 RTT ;;;AND RETURN9':10$: MOV #D.RS8,R0 ;;;INDICATE IE.ITSA; RTT ;;;RETURN TO USER TASKF<!=; ERROR EXITS FOR LENGTH CHANGE,>'?11$: MOV #D.RS8,R0 ;;;INDICATE IE.ITS,%@ JMP $INTX1 ;;;RETURN TO USER TASKA(B12$: MOV #D.RS84,R0 ;;;INDICATE IE.ALG%C JMP $INTX1 ;;;RETURN TO USER TASKRDE .PAGEF;+"G; FAST MAP WITH CHANGE IN LENGTHH;-IJ20$: ;;;REFERENCE LABELK3L; SAVE SOME REGISTERS AND DROP PROCESSOR PRIORITYEMN MOV R5,-(SP) ;;;SAVE R5O MOV R4,-(SP) ;;;AND R4 &P DEC $STKDP ;;;SHOW ENTRY TO SYSTEMQ MTPS #0 ;;;ALLOW INTERRUPTST&R NOP ;;; * * * D E B U G * * *S9T; CALCULATE ADDRESS OF FAST MAP HEADER BLOCK AND SET UPJU; REGISTERS.V1W ADD #100002,R0 ;REMOVE LENGTH CHANGE INDICATORT X ;AND SKIP MAX OFFSET FIELD2Y ADD $FMAPP,R0 ;SET UP POINTER TO FAST MAP BLOCK-Z MOV (R0)+,R4 ;R4 -> W.BOFF IN WINDOW BLOCKR/Z BEQ 11$ ;IF EQ, WINDOW NOT MAPPED ;JRK329P#[ MOV (R0)+,R5 ;R5 -> P.REL IN PCBP.\ MOVB (R0)+,R3 ;GET P.HDLN FOR PARTITION AND] ;SIGN EXTEND,^ ADD R3,R1 ;ADJUST OFFSET FIELD BY P.HDLN_D`; CALCULATE LENGTH TO MAP AND TEST IF LEGAL. IF NOT, RETURN IE.ITSa!b TST R2 ;L00�@dÖc³cÙ´cÚµcÛ¶c�·c›’ENGTH SPECIFIEDI,c BEQ 30$ ;IF EQ NO, CALCULATE LENGTHd MOV R2,R3 ;COPY LENGTH !e ADD R1,R3 ;ADD IN OFFSET;*f BCS 11$ ;IF CS ADD WRAPPED AROUND*g CMP R3,P.SIZE-P.REL(R5) ;LENGTH LEGAL?h BLOS 40$ ;IF LOS YES i BR 11$ ;IF HI NO j3k30$: MOV P.SIZE-P.REL(R5),R2 ;GET PARTITION SIZER3l SUB R1,R2 ;SUBTRACT OFFSET TO CALC. LENGTH /m BCS 11$ ;IF CS SUBTRACT WRAPPED AROUNDT*n CMP R2,W.BSIZ-W.BOFF(R4) ;LENGTH LEGAL?o BLOS 40$ ;IF LOS YES 3p MOV W.BSIZ-W.BOFF(R4),R2 ;SUBSTITUTE WINDOW SIZEGq%r; CALCULATE NEW END VIRTUAL ADDRESSDs4t40$: MOV R1,(R4) ;SET NEW W.BOFF FIELD VALUE8u ADD (R5),R1 ;CONVERT OFFSET TO PHYSICAL ADDRESS0v MOV R0,R5 ;SAVE POINTER TO OFFSET VALUE/w MOV R2,R3 ;COPY LENGTH IN 32 WD BLOCKSG$x ASH #6,R3 ;CONVERT TO BYTES.y DEC R3 ;BACK OFF TO LAST BYTE ADDRESS7z ADD W.BLVR-W.BOFF(R4),R3 ;ADD IN LOW VIRTUAL ADDRESSB{=|; SAVE VALUES NEEDED IN PAR UPDATE CODE OR RETURNED TO USERI}/~ MOV R2,-(SP) ;SAVE NEW LENGTH OF WINDOWC/ MOV R1,-(SP) ;SAVE PHYSICAL MAP ADDRESS,:€ CMP R3,W.BHVR-W.BOFF(R4) ;SIZE OF WINDOW CHANGE AT ALL?� BEQ 100$ ;IF EQ NOA9‚ MOV R3,W.BHVR-W.BOFF(R4) ;TO FORM HIGH VIRTUAL ADDRESSƒ „; CALCULATE NEW NUMBER OF PDRS…'† MOV R2,R3 ;COPY SIZE OF WINDOWS$‡ ADD #177,R3 ;ROUND UP BY 4K.ˆ ASH #-7,R3 ;CONVERT TO NUMBER OF PDRS/‰ MOV R3,-(SP) ;SAVE FOR LAST PDR ADDRESSIŠ ;CALCULATION LATERO5‹ CMPB R3,W.BNPD-W.BOFF(R4) ;NUMBER OF PDRS CHANGE ?N-Œ BEQ 80$ ;IF EQ NO, NO NEED TO UPDATED&� ;OFFSET OR CLEAR/RESET PDRS4Ž MOVB W.BNPD-W.BOFF(R4),R2 ;GET OLD NUMBER OF PDRS5� MOVB R3,W.BNPD-W.BOFF(R4) ;SET NEW NUMBER OFR PDRSD�8‘; CALCULATE NEW OFFSET FIELD FOR FAST MAP WINDOW BLOCK’5“ SUB R2,R3 ;FORM DIFFERENCE IN NUMBER OF PDRSP”#•; HANDLE SIMPLEST CASES (1,3,4,7)U–— .IF DF U$$DAS!S$$LIB ˜6™ CMPB #</BLKDIV>,(R0) ;IS THIS A CASE 1š BHI 50$ ;IF HI YESF›œ .IFTF ; DF U$$DAS ! S$$LIBB�)ž ASL R3 ;MULTIPLY DIFFERENCE BY 2 Ÿ  .IF EQ BLKMUL-2¡¢ ASL R3 ;BY 4W£¤ .ENDC ; EQ BLKMUL-2¥¦ .IFT ; DF U$$DAS ! S$$LIB§¨ BR 70$ ;AND UPDATE©50$:ª>«; HANDLE CASE 2 (ALSO HANDLES CASE 6) IN I/D & SUPER SYSTEMS¬­ .IF DF U$$DAS&S$$LIBM®6¯ CMPB #</BLKDIV>,(R0) ;IS THIS A CASE 2° BHI 60$ ;IF HI NO1± MUL #,R3 ;CALCULATE DIFFERENCEA² BR 70$ ;AND UPDATE ³´ .ENDC ; DF U$$DAS&S$$LIBSµ¶60$:·<¸; HANDLE CASE 5 (ALSO CASE 2 IN SUPER, NO D-SPACE SYSTEMS)¹1º MUL #,R3 ;CALCULATE DIFFERENCE2»¼ .ENDC ; DF U$$DAS ! S$$LIB½¾70$:¿%À MOV R3,-(SP) ;SAVE FOR UPDATEEÁ!Â; CLEAR ALL PDRS FOR OLD WINDOWSÃ'Ä CLR R3 ;NO OFFSET BETWEEN PDRS*Å MOVB W.BFPD-W.BOFF(R4),R2 ;POINT TO PDR3Æ MOV (R2),-(SP) ;SAVE A PDR FOR ACCESS VALUEK'Ç CLR R1 ;VALUE TO STORE IS ZERO'È MOVB (R0),R0 ;GET OFFSET VALUE;ÉÊ .IF DF U$$DAS&S$$LIB:Ë&Ì ASL R0 ;CONVERT TO BYTE INDEXÍÎ .ENDC ; DF U$$DAS&S$$LIBLÏ"Ð CALL FMPW1(R0) ;CLEAR PDRSÑÒ; SET ALL PDRS FOR NEW WINDOWIÓÔ .IF DF U$$DAS&S$$LIB,Õ2Ö MOVB (R5),R0 ;RETRIEVE OFFSET FIELD AGAINר .IFTF ; DF U$$DAS & S$$LIBNÙ#Ú MOV (SP)+,R1 ;GET PDR VALUEB)Û SUB (SP)+,R0 ;ADJUST OFFSET FIELD &Ü BIS #77400,R1 ;FORCE 4K ACCESS1Ý MOVB R0,(R5) ;STORE UPDATED OFFSET VALUER5Þ MOVB W.BFPD-W.BOFF(R4),R2 ;GET PDR ADDRESS (AGAIN):ßà .IFT ; DF U$$DAS & S$$LIBYá%â ASL R0 ;ADJUST TO WORD VALUEãä .ENDC ; DF U$$DAS & S$$LIBDå-æ CALL FMPW1(R0) ;SET PDRS TO NEW VALUEFç#è; SETUP LAST PDR TO CORRECT VALUE é.ê80$: MOV 4(SP),R2 ;RETRIEVE WINDOW SIZE'ë DEC R2 ;BACK OFF TO LAST BLOCK (ì BIC #177600,R2 ;ISOLATE PLF BITS*í BNE 85$ ;IF NE NOT MULTIPLE OF 4K)î TST (SP)+ ;REMOVE NUMBER OF P00�HdìcÝb`TADATADATADATADATADATADRSEï BR 95$ ;AND CONTINUE 4ð85$: SWAB R2 ;PUT IN RIGHT PLACE IN REGISTER3ñ MOVB W.BFPD-W.BOFF(R4),R3 ;GET FIRST PDR ADDRESSJ*ò MOV (R3),R1 ;FETCH VALUE OF A PDR/ó BIC #77400,R1 ;CLEAR PLF FROM SAVED PDRT%ô BIS R2,R1 ;AND MERGE NEW PLF &õ DEC (SP) ;BACK OFF BY ONE PDR/ö ASL (SP) ;MULTIPLY NUMBER OF PDRS BY 2 +÷ ADD (SP)+,R3 ;FORM LAST PDR ADDRESSSøù .IF DF S$$LIB!U$$DAS ú6û CMPB #</BLKDIV>,(R5) ;IS THIS A CASE 1ü BLOS 90$ ;IF HI YESý'þ; UPDATE LAST PDR FOR A CASE 2 WINDOWRÿ .IF DF U$$DAS6 CMPB #</BLKDIV>,(R0) ;IS THIS A CASE 2 BHI 84$ ;IF LO NO3 MOV R1,UDSAR0-UINAR0(R3) ;;;FILL IN LAST PDR (D)E BR 90$ ;AND CONTINUE %; UPDATE LAST PDR FOR CASE 6 WINDOW  84$:6  CMPB #</BLKDIV>,(R0) ;IS THIS A CASE 6  BLOS 86$ ;IF HI NO 3  MOV R1,SDSAR0-UDSAR0(R3) ;;;FILL IN LAST PDR (D)<  BR 100$ ;AND UPDATE86$: .ENDC ; DF U$$DAS%; UPDATE LAST PDR FOR CASE 5 WINDOW 9 MOV R1,SDSAR0-UINAR0(R3) ;;;FILL IN LAST PDR (SUPER D)P .IF DF U$$DAS8 MOV R1,UDSAR0-UINAR0(R3) ;;;FILL IN LAST PDR (USER D) .ENDC ; DF U$$DAS .ENDC ; DF U$$DAS ! S$$LIBU*90$: MOV R1,(R3) ;FILL IN LAST PDRG95$: MOV R1,W.BLPD-W.BOFF(R4) ;SAVE VALUE OF LAST PDR IN WINDOW BLOCKO' ; DISPATCH TO REGULAR PAR UPDATE CODER!8"100$: MOV #200,R3 ;SET OFFSET BETWEEN PARS TO 4K:# MOVB W.BFPD-W.BOFF(R4),R2 ;GET FIRST PDR ADDRESS AGAIN.8$ ADD #UINAR0-UINDR0,R2 ;POINT TO PAR INSTEAD OF PDR;% MOV (SP)+,R1 ;GET BACK VALUE OF START (THIS RIGHT?)0-& MOVB (R5),R0 ;GET OFFSET VALUE AGAIN'( .IF DF U$$DAS&S$$LIBN)%* ASL R0 ;ADJUST TO BYTE INDEX,+, .ENDC ; DF U$$DAS & S$$LIB:-&. CALL FMPW1(R0) ;GO ADJUST PARS2/ MOV (SP)+,R2 ;SET LENGTH TO RETURN TO USER)0 MOV #1,R0 ;SET IS.SUC FOR RETURN &1 JMP $INTX1 ;GO RETURN TO USER23 .ENDC ; DF X$$HDR & F$$MAP 4 .PAGE56;+57; **-$STFMP-SETUP FAST MAP BLOCK FOR ADDRESS WINDOWRE8; **-$STFMC-SETUP FAST MAP BLOCK FOR ADDRESS WINDOW (CONDITIONALLY) 9;RC:; THESE ROUTINES SETS OR RE-SETS THE FAST MAP BLOCK IN THE HEADERB;; EXTENSION CORRESPONDING TO A WINDOW IN THE NORMAL HEADER AREA.<;B=; $STFMC IS CALLED FROM DRMAP TO EXAMINE WHETHER OR NOT A WINDOWF>; REQUIRES FAST MAP UPDATE AND TO RE-FILL THE POINTERS IF NECESSARY.?;P @; INPUTS: A;E*B; R4=ADDRESS OF WINDOW TO BE FAST MAPPEDC; D; OUTPUTS:E;F; R2,R3 ARE MODIFIED ($STFMC)K!G; R0,R2,R3 ARE MODIFIE ($STFMP)-H; BI; THE FORMAT OF A FAST MAP HEADER EXTENSION BLOCK IS AS FOLLOWS:J;N5K; +-----------------------------------------------+%L; | MAXIMUM 32WD BLOCK OFFSET | 0N5M; +-----------------------------------------------+O,N; | POINTER TO W.BOFF IN WINDOW BLOCK | 25O; +-----------------------------------------------+I#P; | POINTER TO P.REL IN PCB | 4E5Q; +-----------------------+-----------------------+ :R; 7 | DISPATCH OFFSET INTO | COPY OF P.HDLN FOR | 60S; | FMPW1 UPDATE VECTOR | TARGET PARTITION |5T; +-----------------------------------------------+U;-VW .IF DF X$$HDR&F$$MAP-X Y .ENABL LSBZ2[$STFMC::TST $FMAPP ;TASK HAVE FAST MAP ENABLED? \ BEQ 10$ ;IF EQ NO, NO UPDATE-] TSTB W.BFPD(R4) ;IS IT A USER MODE WINDOW?| ^ BPL 10$ ;IF PL NO, NO UPDATE _ MOV R0,-(SP) ;SAVE A REGISTER/` MOVB W.BFPD(R4),R0 ;GET ADDRESS OF FIRST PDR- a ASL R0 ;CONVERT TO QUAD WORDb ASL R0 ;INDEXT+c BIC #177607,R0 ;GET RID OF ALL BUT INDEX .d ADD $FMAPP,R0 ;GET ADDRESS OF FAST MAP AREA+e CALL 20$ ;GO ADJUST FAST MAP PARAMETERS-$f5$: MOV (SP)+,R0 ;RESTORE REGISTER g10$: RETURNNhi$STFMP:: ;j(k; CALCULATE ADDRESS OF FAST MAP WINDOWl/m MOVB W.BFPD(R4),R0 ;GET ADDRESS OF FIRST PDR; n ASL R0 ;CONVERT TO QUAD WORDo ASL R0 ;INDEX +p BIC #177607,R0 ;GET RID OF ALL BUT INDEXM.q ADD $FMAPP,R0 ;GET ADDRESS OF FAST MAP AREA00�PdÖc³cÙ´cÚµcÛ¶c�·c›’r(s; CALCULATE MAXIMUM OFFSET INTO REGIONt7u ASSUME W.BPCB,0 ;W.BPCB MUST BE FIRST WORD OF WINDOWM$v20$: MOV (R4),R2 ;GET PCB ADDRESS.w MOV P.SIZE(R2),(R0) ;SAVE SIZE OF PARTITION6x SUB W.BSIZ(R4),(R0) ;MAX OFFSET IS LESS WINDOW SIZE4y MOVB P.HDLN(R2),R3 ;CONVERT HEADER LENGTH TO WORD3z SUB R3,(R0) ;MAX OFFSET IS ALSO WITHOUT HDR LENS3{ INC (R0)+ ;THE MAX OFF FIELD IS KEPT +1 SO THAT;)| ;A VAL. OF ZERO CAN MEAN "UNMAPPED"U},~; SET UP POINTER TO W.BOFF IN WINDOW BLOCK'€ MOV R4,(R0) ;INIT POINTER TO W.BOFF 8� ADD #W.BOFF,(R0)+ ;AND POINT TO CORRECT WORD IN BLOCK‚"ƒ; SET UP POINTER TO P.REL IN PCB„.… MOV R2,(R0) ;SET ADDRESS OF PCB INTO BLOCK'† ADD #P.REL,(R0)+ ;AND POINT TO P.RELI‡(ˆ; COPY PARTITIONS EXTERNAL HEADER SIZE‰;Š MOVB P.HDLN(R2),(R0)+ ;SET SIZE OF PARTITION'S EXT. HDR.I‹ .PAGEŒ;+/�; NOW CALCULATE OFFSET INTO APR UPDATE TABLE.A+Ž; THERE ARE SEVEN CASES TO BE CONSIDERED.U�;-�; SUPER MODE MAPPED SUPER MODE NOT MAPPED‘;M<’; I-SPACE WINDOW (1) UPDATE I ONLY (4) UPDATE SUPER I ONLY“; (WITH OVERLAPPING ”; D-SPACE WINDOW(S))P•;R:–; I-SPACE WINDOW (2) UPDATE I+D (5) UPDATE I,D, SUPER D—; (NO OVERLAP)˜;,:™; D-SPACE WINDOW (3) UPDATE D-ONLY (6) UPDATE D, SUPER Dš;E-›; SUPER I WINDOW N/A (7) SUPER I ONLYOœ;T;�; SYSTEMS WITH USER I/D AND NO SUPERVISOR MODE HAVE CASESIž; (1), (2), AND (3) ONLY.HŸ;R? ; SYSTEMS WITH NO USER I/D BUT SUPER MODE HAVE CASE (1) AND AU¡; SUBSET OF CASE 5.¢;-£6¤; IN MULTI-CASE SYSTEMS, ASSUME IT'S THE SIMPLE CASE¥¦ .IF DF U$$DAS!S$$LIBD§1¨ CLR -(SP) ;ASSUME NO EXTRA OFFSET INTO VECTOR 1© MOV #BLK1SZ*BLKMUL,-(SP) ;ASSUME CASE 1 LENGTH,ª« .ENDC ; DF U$$DAS!S$$LIB-¬'­; CHECK FOR SUPERVISOR I-SPACE WINDOW ®¯ .IF DF S$$LIB°2±; TSTB W.BFPD(R4) ;IS IT A SUPER I-SPACE WINDOW?²; BEQ 50$ ;IF EQ YES³´ .ENDC ; DF S$$LIBµ!¶; CHECK FOR USER D-SPACE WINDOWB·¸ .IF DF U$$DAS¹3º BITB #20,W.BFPD(R4) ;IS IT A USER D-SPACE WINDOWL» BEQ 30$ ;IF EQ NO ¼=½; IF USER D-SPACE WINDOW, CHECK FOR SUPERVISOR MODE WINDOWS)¾¿ .IF DF S$$LIBÀ,Á TSTB $SUPFL ;ANY SUPERVISOR MODE WINDOWS BEQ 50$ ;IF EQ NO?à MOV #</BLKDIV>,2(SP) ;SET PARAMETERS FOR CASE 6E!Ä MOV #BLK6SZ*BLKMUL,(SP) ;ÅÆ .ENDC ; DF S$$LIBÇÈ BR 50$ ;TO COMMON CODEÉÊ .ENDC ; DF U$$DASË7Ì; CHECK USER I WINDOW FOR OVERLAPPING D-SPACE WINDOWSÍ Î30$: ;SÏÐ .IF DF U$$DASÑ&Ò MOVB W.BFPD(R4),R3 ;GET PDR ADDRESS(Ó SUB #UINAR0,R3 ;ADJUST TO OFFSET ZERO!Ô ASR R3 ;CONVERT TO BYTE INDEXI)Õ MOVB W.BNPD(R4),R2 ;GET NUMBER OF PDRSS(Ö ADD R3,R2 ;FORM ENDING PDR NUMBER +10× MOVB $BCMSK-1(R2),R2 ;GET MASK UP TO LAST APR1Ø BICB $BCMSK-1(R3),R2 ;GET MASK UP TO FIRST APRK!Ù MOV $SAHPT,R3 ;POINT TO HEADER #Ú BITB R2,H.DMAP(R3) ;ANY OVERLAP?E%Û BNE 50$ ;IF NE YES, UPDATE I ONLYCÜÝ .ENDC ; DF U$$DASÞ*ß; USER I-SPACE WITH NO OVERLAP D WINDOWSàá .IF DF S$$LIBâ$ã TSTB $SUPFL ;SUPER MODE WINDOWS?ä BEQ 40$ ;IF EQ NOOå?æ MOV #</BLKDIV>,2(SP) ;SET PARAMETERS FOR CASE 5R!ç MOV #BLK5SZ*BLKMUL,(SP) ;2è BR 50$ ;TO COMMON CODEéê .ENDC ; DF S$$LIBê40$: ;JRK324ì .IF DF U$$DAS ;**-1SíGí MOV #</BLKDIV>,2(SP) ;SET PARAMETERS FOR CASE 6 ;JRK324 +ï MOV #BLK2SZ*BLKMUL,(SP) ; ;**-1Eðñ .ENDC ; DF U$$DASò/ó50$: MOVB W.BNPD(R4),R3 ;FETCH NUMBER OF PDRSOôõ .IF DF U$$DAS!S$$LIBö(÷ MUL (SP)+,R3 ;CONVERT TO N WORD INDEX-ø ADD (SP)+,R3 ;ADD IN ANY ADDITIONAL OFFSETIùú .IFF ; DF U$$DAS!S$$LIBû"ü ASL R3 ;CONVERT TO WORD INDEX&ý ASL R3 ;CONVERT TO TWO WORD INDEXþÿ .ENDC ; DF U$$DAS!S$$LIBJ NEG R3 ;MAKE IT NEGATIVE  MOVB R3,(R0)+ ;SET JUMP INDEX RETURN ;DONEA  .DSABL LSB  .ENDC ; DF X$$HDR&F$$MAPS  .PAGE  ;+E ; FAST MAP APR UPDATE TABLES. THERE ARE FOUR SETS OF UPDATE CODE TOP ; COVER THE SEVEN CASES.00�Xd‘^dÝb`TADATADATADATADATADATA;- .IF DF F$$MAP&X$$HDRT;+H; CASE 5 - UPDATE SUPER AND USER DATA SPACE AND PAR POINTED TO BY FAST:; MAP WINDOW BLOCK (THIS WILL ALWAYS BE USER I-SPACE);- .IF DF S$$LIB  .REPT 76 MOV R1,SDSAR0-UINAR0(R2) ;;;FILL IN SUPER D PAR/PDR .IF DF U$$DAS5 MOV R1,UDSAR0-UINAR0(R2) ;;;FILL IN USER D PAR/PDRN ! .ENDC ; DF U$$DAS".# MOV R1,(R2)+ ;;;FILL IN USER I PAR/PDR($ ADD R3,R1 ;;;AND ADVANCE BY 4KW%& .ENDR'( .IF DF U$$DAS) * BLK5SZ = 6X+, .IFF ; DF U$$DASE- . BLK5SZ = 4N/0 .ENDC ; DF U$$DAS1 2 $$$ = .3 . = . + < BLK5SZ * 2 > *4FMPW5: ;;;POINT TO END OF BLOCKS 5 . = $$$6;7 MOV R1,SDSAR0-UINAR0(R2) ;;;FILL IN LAST SUPER D PAR/PDRN89 .IF DF U$$DAS::; MOV R1,UDSAR0-UINAR0(R2) ;;;FILL IN LAST USER D PAR/PDR<= .ENDC ; DF U$$DAS>3? MOV R1,(R2) ;;;FILL IN LAST USER I PAR/PDRP @ RETURN ;;;AND GO BACKAB .ENDC ; DF S$$LIBCDE;+JF; CASE 6 - UPDATE SUPER DATA SPACE AND PAR POINTED TO BY FAST MAP WINDOW/G; BLOCK (THIS WILL ALWAYS BE USER D-SPACE)=H;-IJ .IF DF U$$DAS&S$$LIB K L .REPT 7M6N MOV R1,SDSAR0-UDSAR0(R2) ;;;FILL IN SUPER D PAR/PDR.O MOV R1,(R2)+ ;;;FILL IN USER D PAR/PDR(P ADD R3,R1 ;;;AND ADVANCE BY 4KWQR .ENDRS T BLK6SZ = 4U V $$$ = .W . = . + < BLK6SZ * 2 > *XFMPW6: ;;;POINT TO END OF BLOCKS Y . = $$$Z;[ MOV R1,SDSAR0-UDSAR0(R2) ;;;FILL IN LAST SUPER D PAR/PDRU3\ MOV R1,(R2) ;;;FILL IN LAST USER U PAR/PDR ] RETURN ;;;AND GO BACKL^_ .ENDC ; DF U$$DAS & S$$LIB`a;+Ib; CASE 2 - UPDATE USER DATA SPACE AND PAR POINTED TO BY FAST MAP WINDOWP/c; BLOCK (THIS WILL ALWAYS BE USER I SPACE)Rd;-ef .IF DF U$$DASg h .REPT 7i5j MOV R1,UDSAR0-UINAR0(R2) ;;;FILL IN USER D PAR/PDR.k MOV R1,(R2)+ ;;;FILL IN USER I PAR/PDR(l ADD R3,R1 ;;;AND ADVANCE BY 4KWmn .ENDRo p BLK2SZ = 4 q r $$$ = .s . = . + < BLK2SZ * 2 > *tFMPW2: ;;;POINT TO END OF BLOCKS u . = $$$v:w MOV R1,UDSAR0-UINAR0(R2) ;;;FILL IN LAST USER D PAR/PDR3x MOV R1,(R2) ;;;FILL IN LAST USER I PAR/PDR y RETURN ;;;AND GO BACKz{ .IFF ; DF U$$DASS|2}FMPW2: ;;;MAKE SURE THIS LABEL IS ALWAYS(~ ;;;DEFINED SO THAT THE OFFSET1 ;;;ADJUST CODE CAN COMPARE AGAINST IT.I€� .ENDC ; DF U$$DAS‚ƒ;+;„; CASES 1, 3, 4, AND 7. UPDATE JUST THE APR POINTED TO BY=…; THE FAST MAP WINDOW.†;-‡ ˆ .REPT 7‰'Š MOV R1,(R2)+ ;;;FILL IN PAR/PDR(‹ ADD R3,R1 ;;;AND ADVANCE BY 4KWŒ� .ENDRŽ � BLK1SZ = 2 � ‘ $$$ = .’ . = . + < BLK1SZ * 2 >R*“FMPW1: ;;;POINT TO END OF BLOCKS ” . = $$$•,– MOV R1,(R2) ;;;FILL IN LAST PAR/PDR — RETURN ;;;AND GO BACK˜™ .ENDC ; DF F$$MAP & X$$HDR š›œ .ENDC�žŸ .ENDNDC ; DF U$$DAS‚ƒ;+;„; CASES 1, 3, 4, AND 7. UPDATE JUST THE APR POINTED TO B .TITLE SYSCMS .IDENT /16.06/);O7; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION ; ALL RIGHTS RESERVED.;A>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;  ; D. N. CUTLER 11-AUG-73 ;E- ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:; ;N; P. J. BEZEREDI; J. R. KAUFFMAN; J. M. LAWLER; T. LEKAS ; T. M. MARTIN;C; MODIFIED BY:;R"; J. R. KAUFFMAN 3-SEP-86 16.01; 5; JRK332 - ADD SUPPORT FOR DATA CACHE WRITE DEFERS7;I; K. L. NOEL 17-NOV-86 16.02 ;I"; KLN011 -- ADD SUPPORT FOR CPR;S; B. S. MCCARTHY 16.03D; 2; BM387 -- ADD $WCFLG FOR COMPLETING WINDOW I/O; COUNT SUPPORT;#; L. B. MCCULLEY 29-DEC-86 16.04 ;I&; LBM050 -- MAKE $SWR UNCONDITIONAL;; K. L. NOEL 10-APR-87 16.05M;7; KLN041 -- ADD FAKE WINDOW BLOCK FOR REMOTE DEVICES;O#; B. S. MCCARTHY 12-JUN-87 16.06 ;-.00‘`dÖc³cÙ´cÚµcÛ¶c�·c›’; BM399 -- ADDITION OF SET /VTLOGON COMMAND;C´;Iµ;F¶; SYSTEM COMMON DATA AREA-·;6¸; MACRO LIBRARY CALLS1¹;Aº» .MCALL HDRDF$,HWDDF$,TCBDF$1¼ .MCALL EPKDF$ ;ERRLOG PACKET/MASK DEFINITIONSF'½ HDRDF$ ;DEFINE TASK HEADER OFFSETSP&¾ HWDDF$ ;DEFINE HARDWARE REGISTERS.¿ TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS&À EPKDF$ ;DEFINE FEATURE MASK FLAGSÁÂà .IF DF A$$CNTÄÅ .MCALL ACNDF$1Æ ACNDF$ ;DEFINE OFFSETS FOR ACCOUNTING BLOCKS-ÇÈ .ENDCÉÊËÌ;9 Í; MAKE CLOCK PARAMETERS GLOBALÎ;Ï"ÐS$$RTZ==H$$RTZ ;LINE FREQUENCY'ÑS$$IEN==K$$IEN ;ENABLE BITS PATTERNA1ÒS$$LDC==K$$LDC ;LOAD VALUE FOR COUNT REGISTERD/ÓS$$TPS==K$$TPS ;TICKS PER SECOND ON P CLOCK ÔÕ;AÖ; LOCAL SYMBOL DEFINITIONS×;FØ; FUNCTION MASK LITERALTÙ; ÚDÛFMASK= FE.EXV!FE.DRV!FE.CAL!FE.EXP!FE.FDT ;INITIALIZE FEATURE MASKÜFMASK= FMASK!FE.DYM$ÝÞß .IF DF M$$EXT&M$$MGENà4áFMASK= FMASK!FE.EXT ;INCLUDE EXTENDED MEMORY MASKâã .ENDCäåæ .IF DF M$$MUPç:èFMASK= FMASK!FE.MUP ;INCLUDE MULTI-USER PROTECTION MASKéê .ENDCëìí .IF DF P$$LASî$ïFMASK= FMASK!FE.PLA ;PLAS SUPPORTðñ .ENDCòóô .IF DF Q$$OPTõ0öFMASK= FMASK!FE.PKT ;QIO PACKET PREALLOCATION÷ø .ENDCùúû .IF DF P$$OFFü8ýFMASK= FMASK!FE.OFF ;PARENT OFFSPRING TASKING SUPPORTþÿ .ENDC2F2MASK=0 ;INITIALIZE SECOND MASK WORD CONTENTS .IF DF K$$DAS2F2MASK=F2MASK!F2.DAS ;KERNEL DATA SPACE SUPPORT  .ENDC    .IF DF S$$LIB 8F2MASK=F2MASK!F2.LIB ;SUPERVISOR MODE LIBRARY SUPPORT .ENDC .IF DF M$$PRO.F2MASK=F2MASK!F2.MP ;MULTIPROCESSOR SUPPORT .ENDC .IF DF E$$VNT5F2MASK=F2MASK!F2.EVT ;EVENT TRACE FACILITY SUPPORTF .ENDC ! .IF DF A$$CNT"/#F2MASK=F2MASK!F2.ACN ;CPU ACCOUNTING SUPPORTK$% .ENDC&'( .IF DF S$$HDW)1*F2MASK=F2MASK!F2.SDW ;SHADOW RECORDING SUPPORTS+, .ENDC-./ .IF DF P$$OOL0/1F2MASK=F2MASK!F2.POL ;SECONDARY POOL SUPPORTL23 .ENDC456 .IF DF D$$PAR7>8F2MASK=F2MASK!F2.DPR ;SYSTEM SUPPORTS A DIRECTIVE PARTITION9: .ENDC;<= .IF DF P$$WND>??F2MASK=F2MASK!F2.WND ;SYSTEM SUPPORTS SECONDARY POOL WINDOWST@A .ENDCB'C; DEFINE CONSTANT FEATURE MASK 2 BITS2D:E F2MASK=F2MASK!F2.IRR!F2.GGF!F2.RAS!F2.RBN!F2.SWP!F2.STPFG; FEATURE MASK 3 BITS2H'I; DEFINE CONSTANT FEATURE MASK 3 BITSSJKL F3MASK=F3.AST!F3.EIS!F3.RLKMNOP F3MASK=F3MASK!F3.SHFAQRST .IF DF A$$CLIUV F3MASK=F3MASK!F3.CLIWX .ENDCYZ[ .IF DF X$$HDR\0] F3MASK=F3MASK!F3.XHR ;EXTERNAL HEADER SUPPORT^_ .ENDC`ab .IF DF U$$DASc0d F3MASK=F3MASK!F3.UDS ;USER DATA SPACE SUPPORTef .ENDCgh .IF DF P$$OOLi3j F3MASK=F3MASK!F3.PRO ;SEC POOL PROTO TCB SUPPORTRkl .ENDCmn .IF DF T$$COMo7p F3MASK=F3MASK!F3.TCM ;TTDRV HAS SEPARATE BUFFER POOLqr .ENDCst .IF DF P$$CTLu0v F3MASK=F3MASK!F3.PMN ;POOL MONITORING SUPPORTwx .ENDCyz{|}; FEATURE MASK 4 BITSC~"; DEFINE MASK (NO CONSTANT BITS)€ � F4MASK=0E‚ƒ .IF DF R$$PRO„+… F4MASK=F4MASK!F4.XT ;THIS IS A CT SYSTEMF†‡ .ENDC ;R$$PROˆ‰Š .IF DF E$$LOG‹.Œ F4MASK=F4MASK!F4.ERL ;ERROR LOGGING SUPPORT�Ž .ENDC��‘ .IF DF P$$RTY’.“ F4MASK=F4MASK!F4.PTY ;PARITY MEMORY SUPPORT”• .ENDC–— .IF DF, F$$DVNR˜0™ F4MASK=F4MASK!F4.DVN ;DECIMAL VERSION NUMBERSš› .ENDC ; DF F$$DVNœ� .IF DF C$$CDAžŸ .IF EQ, C$$CDA 4¡ F4MASK=F4MASK!F4.LCD ;LOADABLE CRASH DUMP SUPPORT¢£ .ENDC ; EQ C$$CDA¤¥ .ENDC¦§ .IF DF F$$NIM¨2© F4MASK=F4MASK!F4.NIM ;DELETED FIXED TASK IMAGESª« .ENDC¬­ .IF DF D$$CHE®*¯ F4MASK=F4MASK!F4.CHE ;DISK DATA CACHING°± .ENDC²³ .IF DF L$$GCL´-µ F4MASK=F4MASK!F4.LOG ;LOGICAL NAME SUPPORTT¶· .ENDC¸¹ .IF DF N$$DIRº0» F4M00‘hd^dÝb`TADATADATADATADATADATAASK=F4MASK!F4.NAM ;NAMED DIRECTORY SUPPORT¼½ .ENDC ;DF N$$DIRD¾¿À .IF DF P$$LAS&X$$HDR&F$$MAPÁ) F4MASK=F4MASK!F4.FMP ;FAST MAP SUPPORT Ã"Ä .ENDC ; DF P$$LAS&X$$HDR&F$$MAPÅÆÇ .IF DF D$$DCLÈ+É F4MASK=F4MASK!F4.DCL ;DCL IS DEFAULT CLITÊË .ENDC ;DF D$$DCLÌÍÎ .IF DF D$$DDSÏ4Ð F4MASK=F4MASK!F4.DDS ;DDS IS DEFAULT (NAMED MODE)ÑÒ .ENDC ;DF D$$DDS$ÓÔ .IF DF T$$ACDÕ.Ö F4MASK=F4MASK!F4.ACD ;SYSTEM SUPPORTS ACD'Sר .ENDC ;DF T$$ACDÙÚ .IF DF T$$TSAÛ/Ü F4MASK=F4MASK!F4.NCT ;SYSTEM HAS NCT SUPPORTÝÞ .ENDC ;DF T$$TSA$ßà&á; DEFINE MASK (NO CONSTANT FEATURES)â6â F5MASK=F5.VTL ;INIT TO VTLOGONS DISABLED ; BM399â ; KLN011/â; Remote services feature mask ; KLN011Sâ; If HF.RMT is set as SAV brings the system up, the mask in $FMSKR will ; KLN011E4â; replace the bits defined by $FMSKM ; KLN011Tâ; This scheme allows the system to be SAVed on a processor that does not ; KLN011Xâ; require host services and then run on a processor like the KXJ11 which does ; KLN011â ; KLN011â FMASKR=0 ; KLN011Aä ;**-1å .IF DF P$$3XXæ9ç F5MASK=F5MASK!F5.PRO ;SYSTEM SUPPORTS PROFESSIONAL 3XXe è ;SERIES PERSONAL COMPUTERSé .ENDC ; DF P$$3XXê ê .IF DF C$$DFB ; KLN011ê ; KLN011Dê F5MASK=F5MASK!F5.DFB ; SYSTEM SUPPORTS DEFERRED BINDING ; KLN011ê ; KLN011#ê .ENDC ; DF C$$DFB ; KLN011tê ; KLN011 ê .IF DF C$$ODB ; KLN011ê ; KLN011Bê F5MASK=F5MASK!F5.ODB ; CAN OVERRIDE DEFERRED BINDING ; KLN011ê ; KLN011#ê .ENDC ; DF C$$ODB ; KLN011ê ; KLN011 ê .IF DF C$$RTB ; KLN011ê ; KLN011Dê F5MASK=F5MASK!F5.RTB ; SYSTEM SUPPORTS RUN TIME BINDING ; KLN011ê ; KLN011#ê .ENDC ; DF C$$RTB ; KLN011Tê ; KLN011 ê .IF DF C$$RTK ; KLN011ê ; KLN011Hê FMASKR=FMASKR!F5.RTK ; SYSTEM SUPPORTS REMOTE TASK INSTALLS ; KLN011ê ; KLN011#ê .ENDC ; DF C$$RTK ; KLN011Rê ; KLN011 ê .IF DF C$$NSY ; KLN011ê ; KLN011Hê FMASKR=FMASKR!F5.NSY ; SYSTEM SUPPORTS NO LOCAL SYSTEM DISK ; KLN011ê ; KLN011#ê .ENDC ; DF C$$NSY ; KLN011Tê ; KLN011 ê .IF DF C$$NCO ; KLN011ê ; KLN011?ê FMASKR=FMASKR!F5.NCO ; SYSTEM SUPPORTS NO CONSOLE ; KLN0111ê ; KLN011#ê .ENDC ; DF C$$NCO ; KLN011Pê ; KLN011 ê .IF DF C$$XDJ ; KLN011ê ; KLN011<ê FMASKR=FMASKR!F5.XDJ ; SYSTEM SUPPORTS KXJ XDT ; KLN011ê ; KLN011#ê .ENDC ; DF C$$XDJ ; KLN011 ê ; KLN011 ê .IF DF C$$RDR ; KLN011ê ; KLN011Lê FMASKR=FMASKR!F5.RDR ; SYSTEM SUPPORTS REMOTE DIRECTORY DEFAULTS ; KLN011ê ; KLN011#ê .ENDC ; DF C$$RDR ; KLN011Yê ; KLN011 ê .IF DF C$$RLG ; KLN011ê ; KLN011Cê FMASKR=FMASKR!F5.RLG ; SYSTEM SUPPORTS REMOTE LOGICALS ; KLN011Lê ; KLN011#ê .ENDC ; DF C$$RLG ; KLN011Mê ; KLN011 ê .IF DF C$$LDR ; KLN011ê ; KLN011Iê FMASKR=FMASKR!F5.LDR ; SYSTEM SUPPORTS REMOTE LOADER/OVERLAYS ; KLN011 ê ; KLN011#ê .ENDC ; DF C$$LDR ; KLN011Oê ; KLN0119ê .IF NDF C$$RMT ; IF NO REMOTE HOST SUPPORT ; KLN011;ê ; KLN011;ê F5MASK=F5MASK!FMASKR ; SET $FMASK5 TO BE BOTH ; KLN0110ê ; KLN011!ê .ENDC ; C$$RMT ; KLN011Cê ; KLN011ëìí;1î; NULL TASK CONTROL BLOCK;ï;1Gð; THIS TCB TERMINATES THE SYSTEM AND ACTIVE TASK LISTS. IT MUST HAVE Eñ; A PRIORITY OF ZERO AND ALWAYS BE BLOCKED. REQUIRED POSITIONS ARES#ò; ENFORCED BY THE "ASSUME" MACRO..ó;;ô-õ$CMBEG:: ;BEGINNING OF SYSCM AREA FOR CDAö;NH÷; $ACCLK MUST REFERENCE THE SAME TWO WORDS AS $ABTIM FOR ACCOUNTING TOHø; WORK, UNLESS ACCOUTING HAS ITS OWN CLOCK. IN THIS CASE, $ACCLK WILLFù; BE THE ADDRE00‘pdÖc³cÙ´cÚµcÛ¶c�·c›’SS OF WHERE ACCOUNTING CAN ACCESS IT. ACCOUNTING WILL=ú; USE A TWO WORD $ABTIM IF A PRIVATE CLOCK IS NOT AVAILABLEIû; /ü$ACCLK:: ;ABSOLUTE TIME CLOCK FOR ACCOUTING.ý$ABTM2::.WORD 0 ;ADDITIONAL WORD FOR $ABTIM)þ$ABTIM::.WORD 0 ;ABSOLUTE TIME COUNTER 3ÿ$ACTHD::.WORD . ;T.LNK-ACTIVE TASK LIST LISTHEADF, ASSUME .-$ACTHD,T.PRI ;T.PRI MUST BE ZERO- .BYTE 0 ;T.PRI-NULL TASK PRIORITY IS ZEROT .IF DF M$$PRO?$NCPU:: .BYTE M$$PRO ;T.IOC - NUMBER OF PROCESSORS IN SYSTEMD .IFF  5 $NCPU:: .BYTE 0 ;T.IOC - NOT MULTIPROCESSOR SYSTEMO   .ENDC 2$COMEF::.WORD 0 ;T.DPCB-COMMON EVENT FLAGS 1-16+ .WORD 0 ;T.NAM-COMMON EVENT FLAGS 17-32 1$HRCPT::.WORD 0 ;T.NAM+2-POINTER TO HRC... TCB;A$DEVHD::.WORD $DEVTB ;T.RCVL-PTR TO FIRST DEVICE CONTROL BLOCKL0$TKNPT::.WORD 0 ;T.RCVL+2-POINTER TO TKTN TCB2$SHFPT::.WORD 0 ;T.ASTL-POINTER TO SHUFFLER TCB<$CKCNT::.WORD K$$CNT ;T.ASTL+2-ADDRESS OF CLOCK COUNT REG>$CKCSR::.WORD K$$CSR ;T.EFLG-ADDR OF CLOCK CNTRL STATUS REG .IF EQ K$$CSR-177546S-$CKLDC::.WORD 0 ;T.EFLG+2-CLOCK LOAD COUNT  .IFFO2$CKLDC::.WORD K$$LDC ;T.EFLG+2-CLOCK LOAD COUNT ! .ENDC"#6$$SYUIC::.BYTE 54,1 ;T.UCB-DEFAULT MAPPED SYSTEM UIC.% ASSUME .-$ACTHD,T.TCBL ;T.TCBL MUST BE ZERO$& .WORD 0 ;T.TCBL-LINK TO NEXT TCB1' ASSUME .-$ACTHD,T.STAT ;T.STAT MUST BE NONZEROT9($EXSIZ::.WORD $SYTOP ;T.STAT-ADDR OF LAST BYTE IN EXECF9)$PWRFL::.WORD 0 ;T.ST2-POWERFAIL RECOVERY REQUEST FLAGL4*$SIGFL::.WORD 0 ;T.ST3-TASK WAITING FOR SIG EVENT-+ .WORD 0 ;T.DPRI MUST BE 0, T.LBN - UNUSEDO8,$FXRPT::.WORD 0 ;T.LBN+1-POINTER TO PARITY ERROR TASK:-$LSTLK::.WORD 0 ;T.LDV-LOCK WORD (TCB ADDRESS OF OWNER)3. .WORD 3 ;T.PCB-CONSTANT FOR ALLOCATION ROUTINESD/01 .IF NDF K$$DASO263$ICAVL:: ;ICB POOL SAME AS CORE POOL IF NO D SPACE45 .ENDC6798$CRAVL::.WORD $SYBEG ;T.MXSZ-ACTIVE TASK LIST LISTHEAD .9 ASSUME .-$ACTHD,T.ACTL ;T.ACTL MUST BE ZERO:;< .IF NDF M$$PROG=,>$K6TAB:: ;REFERENCE LABEL FOR MAPPING IN ? ;NON-MULTIPROCESSOR SYSTEM@A .ENDCBC3D .WORD 0 ;T.ACTL-NEXT ACTIVE TASK-DUMMY BLK SIZETEF; 9G; END OF SUPERIMPOSED AREA-REMAINING SYSTEM COMMON AREAPH;NI J$ACPTK::KL .IF DF R$$AMDM+N .WORD 0 ;TCB POINTER FOR DEFAULT F11ACPSOP .ENDC ; DF R$$AMDQ5R$VERTK::.WORD 0 ;TCB POINTER FOR VERIFICATION TASK-S6T$LOGHD::.WORD 0 ;LOGICAL DEVICE ASSIGNMENT LISTHEAD8U$CFLPT::.WORD 0 ;POINTER TO FIRST CHECKPOINT FILE PCBV$MOULS::.WORD 0 ;MOUNT LIST"W$LBUIC::.BYTE 54,3 ;LIBRARY UIC"X$NTUIC::.BYTE 54,1 ;NETWORK UICYZ9[$SPMAX::.WORD 0 ;POINTER TO AUXILARY MONITOR POOL NODER3\$SPMVC::.BLKW 1 ;POINTER TO SPM NODE IN ICB POOL+]$HKSTS::.BLKW 1 ;SPM MONITOR STATUS WORDD^I_; SPM ENTRY VECTORS - EXTERNAL TASKS (LOADER,F11ACP) CALL THROUGH THESEW7`; HOOKS. THEY POINT TO THE RETURN IN $GTPKT IF:=a; SPM IS TURNED OFF, AND SPM INTERCEPTS THEM WHEN IT b; IS ENABLED.c; de .IF DF K$$DASf6g$SPV01::.WORD 0 ;SPM VECTOR FOR ACP HOOKPOINT ENTRY8h$SPV02::.WORD 0 ;SPM VECTOR FOR LOADR HOOKPOINT ENTRY8i$SPV03::.WORD 0 ;SPM VECTOR FOR LOADR HOOKPOINT ENTRYjk .IFF ; DF K$$DASNl;m$SPV01::.WORD $SPVEX ;SPM VECTOR FOR ACP HOOKPOINT ENTRY =n$SPV02::.WORD $SPVEX ;SPM VECTOR FOR LOADR HOOKPOINT ENTRY =o$SPV03::.WORD $SPVEX ;SPM VECTOR FOR LOADR HOOKPOINT ENTRY:pq .ENDC ; DF K$$DASrst; Au; $BTTIM HOLDS THE ABSOLUTE TIME OF WHEN THE SYSTEM WAS BOOTED.DEv; THE TWO WORDS MUST BE CONSECUTIVE, THE LABEL IS ON THE SECOND ONE!w; FOR COMPATABILITY WITH $ABTIMAx;O-y$BTTM2::.WORD 0 ;HIGH ORDER WORD OF $BTTIMR3z$BTTIM::.WORD 0 ;VALUE OF $ABTIM WHEN SYS BOOTED{|} .IF DF D$$MND~4$DICSR::.WORD D$$MND ;ADDRESS OF DIAMOND REGISTER9€$DITCB::.WORD 0 ;ADDRESS OF TCB FOR TASK BEING WATCHEDS�‚ .ENDCƒ„… .IF DF M$$PRO†5‡$CKURM::.WORD 1 ;URM OF PROCESSOR THAT KEEPS CLOCKLˆ‰ .ENDC00‘xd^dÝb`TADATADATADATADATADATAŠ‹,Œ .BLKW 1 ;CLOCK INTERRUPT FORK BLOCK LINK*� .BLKW 1 ;CLOCK INTERRUPT FORK BLOCK PC0Ž$INTCT::.WORD -1 ;CLOCK INTERRUPT TICKS COUNT'�$FRKHD::.WORD 0 ;FORK QUEUE LISTHEAD 2� .WORD $FRKHD ;(LAST POINTS TO FIRST INITIALLY)+‘$FMASK::.WORD FMASK ;SYSTEM FEATURE MASK;’$FMSK2:: .WORD F2MASK ;SECOND WORD OF SYSTEM FEATURE MASK::“$FMSK3:: .WORD F3MASK ;THIRD WORD OF SYSTEM FEATURE MASK;”$FMSK4:: .WORD F4MASK ;FOURTH WORD OF SYSTEM FEATURE MASKP:•$FMSK5:: .WORD F5MASK ;FIFTH WORD OF SYSTEM FEATURE MASK3–$FMEND:: ;REF. LABLE DELIMITING FEATURE MSK WDSK – .IF DF C$$RMT ; KLN011– ; KLN011–$XXWIN:: ; KLN041:L–$FMSKR::.WORD FMASKR ; THIS WORD BECOMES $FMSK5 IF HF.RMT IS SET ; KLN011>– .WORD 0 ; W.IOC MUST BE ZERO, EVERYTHING ELSE IS ; KLN041– ; IRRELIVANT ; KLN041M– ; KLN041 – .IFF ; C$$RMT ; KLN041– ; KLN041–$XXWIN:: ; KLN041 –$FMSKR:: ; KLN011– ; KLN011!– .ENDC ; C$$RMT ; KLN011K– ; KLN011*—$PRMOD::.WORD 0 ;PROCESSOR MODEL NUMBER˜$CLKHD::.WORD 0 ;CLOCK QUEUE 4™$COPT:: .WORD .CO0 ;POINTER TO COMMAND OUTPUT UCB-š$PARHD::.WORD 0 ;POINTER TO PARTITION LISTT)›$LDRPT::.WORD 0 ;POINTER TO LOADER TCBB9œ$TSKHD::.WORD $ACTHD ;POINTER TO SYSTEM TASK DIRECTORY 3�$CBDHD::.WORD 0 ;COMMON BLOCK DIRECTORY LISTHEAD žŸ .IF DF G$$GEF ,¡$GGEF:: .WORD 0 ;GROUP GLOBAL EVENT FLAGS5¢$GFTCB::.WORD $GEFPT+2 ;GRP GLOBAL USER TCB POINTER;;£$GEFPT::.WORD $GEFPT+2 ;GROUP GLOBAL MASK ADDRESS POINTERR.¤ .WORD 0 ;DUMMY WORD FOR NON-GRP GLOBAL USE¥¦ .ENDC ; DF G$$GEF§.¨$LDPCB::.WORD 0 ;CURRENT LOADER PCB POINTER0©$VECTR::.WORD V$$CTR-4 ;HIGHEST VECTOR ADDRESS>ª$MXEXT::.WORD 177777 ;INITIALLY NO LIMIT FOR TASK EXTENSION9«$AVRHD::.WORD 0 ;AUTOMATIC VOLUME RECOGNITION LISTHEADO/¬$PRIFR::.WORD 0 ;CURRENT AMOUNT OF FREE POOL5­$ULDPT::.WORD 0 ;MICROCODE LOADER TASK TCB ADDRESS:4®$GNLST::.WORD 0 ;GENERAL USE POOL PACKET LISTHEAD*¯$PTCBL::.WORD 0 ;PROTOTYPE TCB LISTHEAD0°$PTCPT::.WORD 0 ;KISAR5 BIAS OF PROTOTYPE TCB.±$PASTH::.WORD 0,.-2 ;PARTITION AST LISTHEAD²; 8³; P/OS $NXTSK LOCK AND BASE FROM WHICH TO START SEARCH´;S)µ$NXTLK::.WORD 0 ;$NXTSK RECURSION LOCKI+¶$NXTBA::.WORD 0 ;$NXTSK BASE SEARCH BIASD·¸; )¹; LOGICAL NAME TRANSLATION SUPPORT DATAº;R»¼ .IF DF L$$GCL½=¾$LOGTB::.WORD 0 ;APR BIAS PTR TO SYSTEM LOGICAL HASH TABLED5¿ .WORD 0 ;APR BIAS PTR TO GROUP LOGICAL HASH TABLET;À$USRLG::.WORD 0 ;APR BIAS PTR TO USER LOGICAL HASH TABLEW4Á .WORD 0 ;APR BIAS PTR TO TASK LOGICAL HASH TABLE5 .WORD 0 ;RESERVED WORD FOR P/OS LT.USR (ALWAYS 0)OÃÄ .IFF ; DF L$$GCL Å$LOGTB:: Æ$USRLG::ÇÈ .ENDC ; DF L$$GCLÉÊ;C)Ë; NAMED DIRECTORY CONTEXT BLOCK POINTERBÌ;Í Î$CTXPT::ÏÐ .IF DF N$$DIRÑ Ò .WORD 0ÓÔ .ENDC ;DF N$$DIRLÕÖ×;B@Ø; THE FOLLOWING WORDS ARE USED FOR THE POOL MONITOR INTERFACE.EÙ; THE ORDERING OF THESE WORDS CANNOT BE CHANGED BECAUSE PMT AND VMRI Ú; ARE WRITTEN TO DEPEND ON IT.Û;.ÜÝ .IF DF P$$CTLÞ5ß$PTTCB::.WORD 0 ;TCB ADDRESS OF POOL RECOVERY TASKP+à$PRISZ::.WORD 0 ;TOTAL SIZE OF FREE POOLC6á$POLST::.WORD 0 ;EXEC/POOL TASK COMMUNICATIONS WORD<â$PRIHL::.WORD P$$HIL ;HIGH WATER MARK FOR POOL MONITORING;ã$PRILL::.WORD P$$LOL ;LOW WATER MARK FOR POOL MONITORINGC9ä$PFRSZ::.WORD P$$FRS ;MINIMUM SIZE OF LARGEST FRAGMENTD;å$POLBP::.WORD P$$BPR ;MINIMUM PRIORITY OF NONPRIVILEGEDO'æ ;TASKS TO EXECUTE DURING LOW POOLI6ç$POLFL::.WORD 0 ;EXECUTIVE POOL USAGE CONTROL FLAGSèé .IFFê(ë$PTTCB:: ;ALWAYS DEFINE THESE LABELS ì$PRISZ:: í$POLST:: î$PRIHL:: ï$PRILL:: ð$PFRSZ:: ñ$POLBP:: ò$POLFL::óô .ENDCõö;D%÷; SHADOW RECORDING IMPURE DATA AREAAø;Rù%ú$SHUMB::.WORD 0 ;ROOT FOR UMB LISTL6û$SHERR::.WORD 0 ;POINTS TO TCB OF SHADOW ERROR TASK(ü$SHLIM::.WORD 10. ;ERROR PACKET LIMIT.ý$SHPCT::.WORD 0 ;CURRENT SHADOW ERROR COUNT:þ$SHLOS::.WORD 0 ;00‘€dÖc³cÙ´cÚµcÛ¶c�·c›’NUMBER OF PACKETS LOST FROM SATURATIONÿ1$RCTPT::.WORD 0 ;POINTER TO CURRENT RCT... TCB+$EXCRC::.WORD 0 ;EXECUTIVE RO CODE CRC16; ; BM387H; WINDOW I/O COUNT FLAG. THE FOLLOWING WORD IS USED BY DREIF, ; BM387G; IOFIN, AND DEACC IN THE ACP TO DETERMINE WHETHER TO MANAGE ; BM387 F; THE WINDOW I/O COUNT. IF SET TO DV.F11 THE BEHAVIOR IS TO ; BM387H; MANAGE THE I/O COUNT (NEW). IF SET TO ZERO THE I/O COUNT IS ; BM387C; LEFT ALONE AND THE WINDOW MAY BE DEALLOCATED WITH I/O ; BM387O6; PENDING. THIS MAY CAUSE CRASHES LATER. ; BM387; ; BM387F$WCFLG::.WORD 0 ; DV.F11 ; WINDOW I/O COUNT MANAGEMENT FLAG ; BM387 ; BM387F, .IF DF D$$CHE ;DISK DATA CACHING SUPPORT; !; DATA CACHING IMPURE DATA AREAR ;W ; $DCPCB::.WORD 0 ;PCB ADDRESS OF SYSTEM DEFAULT CACHE PARV  ;B3; THESE CELLS ARE FILLED IN BY $MPVBN (MDSUB) FOR):; VIRTUAL TO LOGICAL I/O TRANSLATIONS. THIS INFORMATION7; IS USED BY THE CACHER WHEN PROCESSING THE RESULTING ; I/O PACKET. ; )$DCCEL::.WORD 0 ;CURRENT EXTENT LENGTH7-$DCCEB::.WORD 0,0 ;CURRENT EXTENT BASE LBN &$DCNEL::.WORD 0 ;NEXT EXTENT LENGTH*$DCNEB::.WORD 0,0 ;NEXT EXTENT BASE LBNA$DCSTS::.WORD 0 ;STATUS INFORMATION FROM WINDOW BLOCK ;JRK332 .ENDC ;D$$CHE;EE; POINTER TO FIRST IP11 UCB, USED BY IP11 POWERFAIL CODE (IN POWER) ;B. $IPUCB::.WORD 0 ; POINTER TO FIRST IP11 UCB!"#;N:$; PARAMETER AREA FOR STATUS CHANGE ROUTINES IN OLRSR.MAC%;/&0'$SCDEV::.BLKW 1 ;UCB OR KRB FOR STATUS CHANGE0($SCRET:: ;REFERENCE LABEL (ALIAS FOR $SCCTB).)$SCCTB::.BLKW 1 ;CTB IF $SCDEV CONTAINS KRB/*$SCOFL::.BLKB 1 ;ONLINE OR OFFLINE PARAMETERD,+$SCERR::.BLKB 1 ;ERROR RETURN FROM DRIVER,-;J$.; EVENT TRACE READ/WRITE DATA AREA/;E012 .IF DF E$$VNT34;E5; CURRENT BUFFER INFORMATION6;7+8$EVKS6::.WORD 0 ;KISAR6 OFFSET TO BUFFERP29$EVDIS::.WORD 0 ;BUFFER POSITION FOR NEXT EVENT4:$EVLEN::.WORD 0 ;PTR TO WORD BEYOND END OF BUFFER);$EVSEQ::.WORD 0 ;EVENT SEQUENCE NUMBERT<<$EVLOS::.WORD 0 ;NUMBER OF EVENTS LOST THROUGH SATURATION4=$EVTCB::.WORD 0 ;TCB ADDRESS OF EVENT LOGGER TASK>?;N@; EVENT SWITCH TABLEA; B; INDEXED BY EVENT NUMBER$C; IF BYTE NEGATIVE, EVENT DISABLED.D; IF BYTE POSITIVE, VALUE IS LENGTH OF EVENTE;AF; EVERY EVENT MUST CONTAIN AN ENTRY IN THIS TABLE, OF THE FORM:OG; *H; .BYTE -EV.XXX ;THIS IS A SAMPLE EVENTI;O+J; WHERE XXX IS THE NUMBER OF THE EVENT. K;DLM$EVTAB:: ;REFERENCE LABEL;NOP .REPT E$$VNT.Q .BYTE -1 ;SET ALL EVENTS TO NULL INITIALLYR .ENDR#S .BYTE 0 ;THERE IS NO EVENT ZEROETUV .EVENWX;Y; EVENT BUFFER MANAGEMENTZ;N[6\$EVBSQ::.WORD 1 ;BUFFER SEQUENCE NUMBER (NEVER = 0)]$EVLST:: ;REFERENCE LABELS^_` .REPT E$$BUF+1 a%b .WORD 0 ;KISAR6 POINTER TO BUFFERAcd .ENDRef .IFFgh$EVKS6:: ;REFERENCE LABELE i$EVDIS:: j$EVLEN:: k$EVSEQ:: l$EVTAB:: m$EVBSQ:: n$EVLST::op .ENDCqrst; WATCHPOINT DEBUG INFOuv .IF DF R$$WPTw4x$WPLST::.WORD 0 ;LAST SYSTEM STATE ROUTINE CALLED1y$WPVAL::.WORD 0 ;VALUE TO WATCH FOR OR AGAINSTN.z$WPADR::.WORD $WPVAL ;PLACE TO WATCH FOR IT{| .ENDC ; DF R$$WPT}~;=€; ADDITIONAL ARGUMENT TO $POWER FOR MULTIPROCESSOR SYSTEMS.�;O‚ƒ„ .IF DF M$$PRO…$†$PFURM::.WORD 0 ;URM TO POWERFAIL‡ˆ .ENDC‰ŠŠ ;LBM050GŠ$SWR:: .WORD 0 ;SOFTWARE SWITCH REGISTER IF NONE IN HARDWARE ;LBM050Š ;LBM050I� ;**-5‘; EXECUTIVE COMMON APR TABLE’; “; * * * N O T E * * *”;DG•; THIS TABLE IS ORDER DEPENDENT, SINCE THERE IS A TABLE IN VMR OF THEVG–; STANDARD COMMON NAMES THAT OCCUR IN THE DIRECTIVE PARTITION. A SIDEDG—; EFFECT OF THIS IS THAT THE ENTRIES BELOW MAY NOT BE CONDITIONALIZED˜;D™š› .IF DF D$$PARœ8�$DRAPR::.WORD 0 ;APR VALUE TO MAP DIRECTIVE PARTITION3ž$D00‘ˆd^dÝb`TADATADATADATADATADATARAP2::.WORD 0 ;BIAS OF SECOND DIRECTIVE COMMONF2Ÿ$DRAP3::.WORD 0 ;BIAS OF THIRD DIRECTIVE COMMON3 $DRAP4::.WORD 0 ;BIAS OF FOURTH DIRECTIVE COMMON 4¡$DRAPV::.WORD 0 ;BIAS OF EXEC VECTORING DIRECTIVE5¢$DRCHE::.WORD 0 ;BIAS OF DATA CACHE MANAGER COMMONV/£ .WORD -1 ;FLAG FOR END OF COMMON BIAS TABLEE¤¥ .IFFO¦'§$DRAPR:: ;ALWAYS DEFINE THIS SYMBOLT¨© .ENDCªA«; $ENVEC - TABLE OF ENTRY POINTS FOR VECTORING CODE WHICH CAN'T:¬; USE $DRGIN ­;P<®; THIS TABLE CONTAINS A *SMALL* NUMBER OF ADDRESSES AND ISA¯; INTENDED TO PROVIDE THE MINIMUM AMOUNT OF INFO TO ACCESS THEN&°; SYSTEM WITHOUT BEING LINKED TO IT.±;M²9³$ENVEC::.WORD $DRAPV ;POINTER TO APR BIAS OF VECTORINGD ´ ;COMMON;µ¶ .IF DF C$$CDA·1¸$CRKRB::.WORD 0 ;CRASH DUMP DEVICE KRB ADDRESS 9¹$CRSFM::.WORD 0 ;CRASH FORMATTER NUMBER (RH TAPE ONLY)SEº$CRSUN::.WORD C$$RUN ;CRASH PHSICAL UNIT NUMBER. NOTE: C$$RUN ISI0» ;...A LOGICAL UNIT NUMBER. INITL CONVERTS+¼ ;...$CRSUN TO A PHYSICAL UNIT NUMBER.R8½$CRCSR::.WORD 0 ;CRASH DEVICE CSR ADDRESS WHEN NO KRB3¾$CRLCK::.BYTE 1 ;ONLY ONE CPU SHOULD DUMP MEMORYE$¿ .BYTE 0 ;PRESERVE WORD ALIGNMENTÀÁ .ENDC ; DF C$$CDAÂÃÄÅ .IF DF R$$NDCÆ>Ç$RNDCT::.WORD R$$NDC ;CLOCK TICKS TO NEXT SCHEDULE INTERVAL<È$RNDC:: .WORD R$$NDC ;CLOCK TICKS PER SCHEDULING INTERVAL:É$RNDL:: .BYTE R$$NDL ;LOWEST PRIORITY CLASS TO CONSIDER/Ê$RNDH:: .BYTE R$$NDH ;HIGHEST PRIORITY CLASSMËÌ .ENDCÍÎÏ .IF DF S$$WPC&D$$ISKSÐ>Ñ$SWPCT::.WORD S$$WPC ;CLOCK TICKS TO NEXT SWAPPING INTERVAL:Ò$SWPC:: .WORD S$$WPC ;CLOCK TICKS PER SWAPPING INTERVAL*Ó$SWPR:: .WORD S$$WPR ;SWAPPING PRIORITYÔÕ .ENDCÖר;<Ù; DAYS PER MONTH TABLE (ENTRY CONTAINS DAYS PER MONTH + 1)Ú;TÛ)Ü$DYPMN::.BYTE 29.,32. ;FEBRUARY, MARCHCÝ .BYTE 31.,32. ;APRIL, MAYNÞ .BYTE 31.,32. ;JUNE, JULY $ß .BYTE 32.,31. ;AUGUST, SEPTEMBER$à .BYTE 32.,31. ;OCTOBER, NOVEMBER$á .BYTE 32.,32. ;DECEMBER, JANUARYâã;Cä; BIT MASK TABLEå;WæHç; NOTE: DUE TO THE ORGANIZATION OF THE SUPERVISOR MODE MAPPING CONTROLBè; SUPPORT, NAMELY THE FACT THAT BIT 0 OF THE BYTE CORRESPONDS TO<é; APR 1, NOT APR 0, THERE MUST BE A ZERO PRECEDING $BTMSK.ê;R#ë .WORD 0 ;DUMMY FOR APR0 BITMASKì$BTMSK::.WORD 1 ;BIT 0.í .WORD 2 ;BIT 1.î .WORD 4 ;BIT 2.Lï .WORD 10 ;BIT 3.ð .WORD 20 ;BIT 4.ñ .WORD 40 ;BIT 5.ò .WORD 100 ;BIT 6..ó .WORD 200 ;BIT 7.Rô .WORD 400 ;BIT 8.Cõ .WORD 1000 ;BIT 9.ö .WORD 2000 ;BIT 10.W÷ .WORD 4000 ;BIT 11.Eø .WORD 10000 ;BIT 12.ù .WORD 20000 ;BIT 13.ú .WORD 40000 ;BIT 14.û .WORD 100000 ;BIT 15. ü9ý; BIT MASK TABLE FOR FORMING ADDRESS MASKS IN $ACHRO INEþ; USER I/D SYSTEMSÿ .IF DF U$$DAS!S$$LIBM  .BYTE 0&$BCMSK::.BYTE 1,3,7,17,37,77,177,377 .ENDC ; DF U$$DAS!S$$LIB 6; TABLE OF APR ADDRESSES USED BY GIN SF.APR FUNCTION  .EVEN7 $APRTB::.WORD KINAR0,KINDR0 ;KERNEL I SPACE REGISTERSO   .IF DF K$$DAS 0 .WORD KDSAR0,KDSDR0 ;KERNEL D SPACE REGISTERS .ENDC ; DF K$$DAS. .WORD UINAR0,UINDR0 ;USER I SPACE REGISTERS .IF DF U$$DAS. .WORD UDSAR0,UDSDR0 ;USER D SPACE REGISTERS .ENDC ; DF U$$DAS .IF DF S$$LIB/ .WORD SISAR0,SISDR0 ;SUPER I SPACE REGISTERS,/ .WORD SDSAR0,SDSDR0 ;SUPER D SPACE REGISTERS  .ENDC ; DF S$$LIB ! .WORD 0 ;END OF TABLEI"#$;VB%; SHUFFLER TASK REQUEST LIMIT FLAGS. $SHFTM CONTAINS THE NUMBER@&; OF CLOCK TICKS THAT MUST EXPIRE BEFORE THE SHUFFLER TASK CANB'; BE REQUESTED BY THE EXECUTIVE. IT IS INITIALIZED TO THE VALUE8(; CONTAINED IN $SHFCT EACH TIME THE SHUFFLER EXECUTES.);;*@+$SHFTM:: .WORD 0 ;TIME REMAINING BEFORE NEXT POSSIBLE REQUEST,A-$SHFCT:: .WORD S$$HFC ;MINIMUM TICKS BETWEEN SHUFFLER REQUESTS,./0; "1; ONLINE ERROR LOGGING DATA BASE2;L345 .IF DF E$$LOG67;"8; ERROR LOG FEATURE MASK SUPPORT9;I :EFEAT = 0S&; .IIF DF,E$$ICM EFEAT = EFEAT!00‘�dÖc³cÙ´cÚµcÛ¶c�·c›’EL.ICM&< .IIF DF,E$$MOU EFEAT = EFEAT!EL.MOU&= .IIF DF,E$$SEF EFEAT = EFEAT!EL.SEF3>$EFMSK::.WORD EFEAT ;SELECTED FEATURE MASK WORDS ?/@$ERHEA::.WORD 0, .-2 ;MESSAGE QUEUE LISTHEAD)A$ENTSQ::.WORD 0 ;ENTRY SEQUENCE NUMBERN*B$ERFLA::.WORD 0 ;ERROR LOGGER FLAG WORD9C$ERRX:: .WORD 0 ;POINTER TO SECONDARY POOL ERRLOG DATADE .IFFEFG$ERFLA:: ;REFERENCE LABELHI .ENDC ; DF E$$LOGJK/L$ERRPT::.WORD 0 ;POINTER TO ERROR LOGGER TCB )M$ERRSQ::.WORD 0 ;ERROR SEQUENCE NUMBERNO P$NCTPT::Q .IF DF T$$TSAR .WORD 0 ;APR BIAS OF NT.NCTL*S .WORD 0 ;APR5 ADDRESS OF QUEUE ROUTINET .WORD 0 ;NCT... TCB ADDRESSRU .ENDC ; T$$TSAQVWX .IF DF R$$PROYZ;;C[; $NVRTM CONTAINS THE NUMBER OF TICKS THAT MUST ELAPSE BEFORE THEF\; O/S UPTIME CELL IN THE PROFESSIONAL 3XX NVR IS UPDATED. IN GENERALF]; IT IS SET TO THE NUMBER OF TICKS PER SECOND TIMES 60. THIS RESULTSF^; IN UPTIME IN MINUTES BEING RECORDED. IT IS INITIALIZED WITH $NVRCT"_; EACH TIME THAT NVR IS UPDATED.`;a.b$NVRTM::.WORD 0 ;TICKS TILL NEXT NVR UPDATE3c$NVRCT::.WORD N$$VRC ;TICKS PER NVR UPDATE CYCLE0def; %g; TASK NAME OF THE P/OS DISPATCHER.*h; USED TO SEND MESSAGES AND AST'S TO IT.i; j6k$CTBNM::.RAD50 /C$CTEX/ ;NAME OF THE P/OS DISPATCHERlmn .ENDC ; DF R$$PROo&p$DVSAV::.BLKW 1 ;SAVED CSR CONTENTSqr;E2s; SYSTEM BOOTSTRAP AND SAVE CONFIGURATION VECTORt;Muvw .IF NDF K$$DAS.xy$SYALT:: ;REFERENCE LABEL z{ .ENDC|}5~$SYSIZ::.WORD S$$YSZ ;SIZE OF MEMORY IN 32W BLOCKS / .BLKB 1 ;LOGICAL UNIT NUMBER OF LOAD DEVICER+€ .BLKB 3 ;LBN OF LOAD/SAVE IMAGE ON DISKF)� .BLKW 1 ;NAME OF LOAD DEVICE IN ASCIIS.‚ .BLKW 1 ;SIZE OF LOAD IMAGE IN 256W BLOCKSƒ„;X…; TIME LIMIT PARAMETERSH†;‡ ˆ .WORD -1 ;YEARS PER UNIVERSE‰ .WORD 13. ;MONTHS PER YEAR*Š .WORD 32. ;DAYS PER MONTH (CALCULATED)‹ .WORD 24. ;HOURS PER DAYŒ .WORD 60. ;MINUTES PER HOURA!� .WORD 60. ;SECONDS PER MINUTENŽ;G�; ACCOUNTING USES $ACTPS TO GET THE NUMBER OF CLOCK TICKS PER SECOND. F�; ON SYSTEMS WHERE ACCOUNTING IS USING THE SYSTEM CLOCK, $ACTPS MUSTG‘; REFERENCE THE SAME WORD AS $TKPS. IF ACCOUNTING HAS ITS OWN CLOCK, 0’; IT WILL CONTAIN THE TICK RATE OF THAT CLOCK.“;P'”$ACTPS:: ;CLOCK RATE FOR ACCOUNTING •–— .IF EQ K$$CSR-177546H˜)™$TKPS:: .WORD H$$RTZ ;TICKS PER SECONDUš› .IFFOœ)�$TKPS:: .WORD K$$TPS ;TICKS PER SECONDPžŸ .ENDC ¡¢;C£; CURRENT TIME VECTOR¤;O¥,¦ .WORD 82. ;YEAR OF UNIVERSE - HAPPY 30TH)§ .WORD 3. ;MONTH OF YEAR - BIRTHDAYT,¨ .WORD 30. ;DAY OF MONTH - MS. LAWLER© .WORD 0 ;HOUR OF DAYª .WORD 0 ;MINUTE OF HOURI« .WORD 0 ;SECOND OF MINUTET"¬$TTNS:: .WORD 0 ;TICK OF SECOND­® .IF DF P$$3XX¯9°$CKCSA::.WORD $CKCSA ;THIS WORD IS SET EITHER TO POINT%± ;TO ITSELF (PDP-11 HARDWARE) ORU(² ;TO THE CLOCK CSR (SAME AS $CKCSR))³ ;(PRO HARDWARE) TO MAKE TDSCH CLOCK$´ ;TICKLING RUN TIME CONDITIONALµ¶ .ENDC ; DF P$$3XX·¸¹;A?º; LIFO SEND AND I/O PREALLOCATION LIST POINTER AND PARAMETERS.»;Y¼½¾ .IF DF Q$$OPT¿3À$PKAVL::.WORD 0 ;POINTER TO FIRST PACKET IN LIST7Á$PKNUM::.BYTE 0 ;NUMBER OF PACKETS CURRENTLY IN LISTO7Â$PKMAX::.BYTE Q$$OPT ;MAXIMUM NUMBER ALLOWED IN LISTAÃÄ .IFFIÅÆ$PKNUM:: ;REF LABEL FOR MCREÇ$PKMAX:: ;REF LABEL FOR MCRTÈÉ .ENDCÊËÌ;K3Í; SAVE AREA FOR CALCULATED MULTI-USER TASK NAMES. Î;CÏÐÑ .IF DF R$$DSPÒ:Ó$TNAME::.BLKW 2 ;(2ND WORD IS ALSO FLAG FOR RQST & RUN)ÔÕ .ENDCÖר;A6Ù; TEMPORARY STORAGE VARIABLES FOR DIRECTIVE SERVICESÚ;:ÛÜ$TEMP0::.BLKW 1 ;Ý$TEMP1::.BLKW 1 ;6Þ$TEMP2::.BLKW 1 ;COMPLETION ROUTINE ADDR FOR $GSPKT5ß$TEMP3::.WORD 0 ;SCRATCH SPACE FOR SPWN$ AND RPOI$5à$TEMP4::.WORD 0 ;SCRATCH SPACE FOR SPWN$ AND RPOI$P9á$TONYL::.WORD 0 ;SCRATCH STORAGE FOR SEEK OPTIMIZATION4â$IOTMP::.WORD 0 ;SCRATCH WD FOR ADDR CHECKING AND00‘˜d^dÝb`TADATADATADATADATADATAã ;ACP QIO TEMPORARY WORK7ä$ATTPT::.WORD 0 ;POINTER TO I.AADA IN CURRENT PACKETUå-æ$CTLST::.WORD $CTB0 ;START OF THE CTB LISTGçèéê; KERNEL AST DISPATCH TABLEëCì; THIS TABLE IS FILLED IN BY INITL AT BOOT TIME. ANY CHANGES MADEI-í; HERE MUST BE REFLECTED IN INITL AT DBTBL.;î;CHï; IF THE SYSTEM DOES NOT SUPPORT KERNEL I/D SPACE, THEN THE REFERENCESð; ARE RESOLVED DIRECTLY.ñ;C9ò$KATBL::.WORD $FINBF ;$FINBF-BUFF I/O FINISH (AK.BUF)C2ó .WORD $FINXT ;$FINXT-OFF. TASK EXIT (AK.OCB)2ô .WORD $GENBF ;$GENBF-GEN. BUFF. I/O (AK.GBI)2õ .WORD $DBTRP ;$DBTRP-FORCE T-BIT TRAP (AK.TBT)2ö .WORD $FINDI ;$FINBF-DELAYED I/O FIN (AK.DIO)÷ø .IF DF G$$GEFù2ú .WORD $GGFRN ;$GGFRN-GROUP GBL RUNDWN (AK.GGF)ûü .IFF ; DF G$$GEFFý/þ; .WORD 0 ;IF OTHER KASTS ARE INVENTED, MAKEO'ÿ ;THIS A PLACEHOLDER IN THE TABLE.  .ENDC ; DF G$$GEF .IF DF M$$PRO0$URMST::.WORD 0 ;UNIBUS RUN MASK STATUS TABLE .IF DF X$$DBT , $XDTFL::.WORD 1 ;XDT INITIALIZATION TABLE+ $XDTPR::.WORD 0 ;FLAG FOR PROMPTS OF XDTR   .IFFR@$XDTFL::.WORD 177777 ;ALWAYS LOOKS INITIALIZED WHEN NOT THERE6$XDTPR:: ;REFERENCE LABEL -- UNUSED IF XDT ALREADY ;INITIALIZED .ENDC OFF=177777 .REPT M$$PROF OFF=OFF+OFFE .ENDR.$CPMSK::.WORD OFF ;PROCESSOR BIT CLEAR MASK,$IIMSK::.WORD 0 ;IIST INTERRUPT MASK WORD=$IIPND::.WORD 0 ;PENDING URM WORK WORD. LOCKED WITH $FORKL;$IICPU::.WORD 0 ;MASK OF URMS THAT HAVE BEEN INTERRUPTEDB4$IINXT::.WORD $BTMSK ;ROUND ROBIN WORD FOR $IISVC9 $STENB::.WORD 0 ;SANITY TIMER ENABLED ON VARIOUS CPU'SI/!$STFLG::.WORD 0 ;SECONDARY SANITY TIMER FLAG 7"$STALR::.WORD 0 ;SANITY TIMER ALARM ENABLED ON CPU'SC8#$PWRMK::.WORD 0 ;MASK OF CPUS IN THEIR POWERFAIL CODE:$$CPPAR::.WORD 0 ;POINTER TO PARTITION FOR CPU LOCAL MEM%E&; NOTE THAT THE NEXT TWO TABLES FOLLOW AN INDEX STRUCTURE LIKE THAT H'; OF $PARTB+2 INS LOWCR, AND THE TWO SHOULD BE UPDATED IN HARMONY WITH(; HRC (MODULE HRBOX))*+ .IF DF M$$K11,0-$MKCS1::.WORD 1 ;CONTENTS FOR CSR 1 OF MK11'S'. .WORD 8. ;NUMBER OF MK11'S POSSIBLEG6/$MKCSR::.BLKW 8. ;CSR ADDRESS TABLE FOR MK11 PARITY,0$MKCS2::.BLKW 8. ;CSR CONTENTS FOR MK11'S12 .ENDC ; DF M$$K11345; 6; MULTIPROCESSOR LOCKS7; 18; BYTE 0 -- LOCK VALUE (0 IF LOCKED, 1 IF FREE) 9; BYTE 1 -- IF BYTE 0 EQUALS:L1:; 0, THEN BYTE 1 EQUALS PROCESSOR ID OF OWNERN/;; 1, THEN BYTE 1 EQUALS COMPLEMENT OF ID OF <; PREVIOUS OWNERO=; >; IF LOCK TYPE IS "WAIT" THEN:?;W@@; BYTE 2,3 = SECONDARY LOCK WORD (ABOVE FORMAT) FOR WAIT MASK.*A; BYTE 4,5 = MASK OF WAITING PROCESSORS.B;B-C; NOTE: BYTES 4+5 ARE REFERENCED AS A WORD.ND; E:F$EXECL::LCKDF$ WAIT ;SERIALIZE ACCESS TO EXECUTIVE DATA5G$FORKL::LCKDF$ SPIN ;SERIALIZE ACCESS TO FORK LISTE2H$IIFNL::LCKDF$ SPIN ;SERIALIZE ACCESS TO $MPTAB2I$PWRLK::LCKDF$ SPIN ;SERIALIZE ACCESS TO $PWRMKJK;EL; MULTIPROCESSOR TABLEM;DN$O$TKTAB:: ;CURRENT TASK TCB TABLEP .REPT M$$PROW-Q .WORD $ACTHD ;INITIALIZE TO NULL TASK TCB R .ENDRST .IFTFU5V$RQTAB::.WORD $ACTHD ;RESCHEDULE POINTER TCB TABLEBWX .IFTYYZ .REPT M$$PRO-1A-[ .WORD $ACTHD ;INITIALIZE TO NULL TASK TCBE\ .ENDR]^ .IFTF_9`$PRTAB::.WORD 0 ;PROCESSOR CURRENT TASK PRIORITY TABLEEab .IFTCcd .REPT M$$PRO-1C(e .WORD 0 ;INITIALIZE TO PRIORITY ZEROf .ENDRg$h$MPTAB:: ;PROCESSOR STATUS TABLEi .REPT M$$PRO#j .WORD MP.STP ;INITIALLY STOPPEDEk .ENDRl$mOFF=0 ;START K6 OFFSETS AT ZERO/n$K6TAB:: ;PROCESSOR IMPURE AREA APR OFFSETSTo .REPT M$$PRO p .WORD OFF%qOFF=OFF+40 ;INCREASE OFFSET BY 1K.r .ENDRs%tOFF=1 ;START PROCESSOR URMS AT 1T.u$URMTB:: ;PROCESSOR URM CONNECTIVITY TABLEv .REPT M$$PROO w .WORD OFF&xOFF=OFF+OFF ;POOR MAN'S LEFT SHIFTy .ENDRz%{OFF=1 ;START PROCESSOR URMS AT 1E4|$CRMTB:: ;COMPLEMENT OF CPU URM CONNECTIVITY TBL}00‘ dÖc³cÙ´cÚµcÛ¶c�·c›’ .REPT M$$PRO~ .WORD ^C&OFF=OFF+OFF ;POOR MAN'S LEFT SHIFT€ .ENDR�‚ .IFTFƒ=„$CRFLG::.WORD 0 ;FLAG INDICATING REGISTERS HAVE BEEN SAVEDT…† .IFT.‡ˆ .REPT M$$PRO-1 ‰ .WORD 0Š .ENDR‹8Œ$CRFPR::.WORD 377 ;$PROCN OF FIRST PROCESSOR TO CRASH�Ž .IFTC�)� .WORD 1 ;URM IN FORK BLOCK FOR ERRLOG‘’ .IFTF“%” .BLKW 2 ;ERROR LOGGING FORK BLOCK.•$PBEZ:: ;REFERENCE LABELC–— .IFT ˜™URM=2:š .REPT M$$PRO-1P › .WORD URM ;URM IN FORK BLOCK œURM=URM*2O� .BLKW 3 ;3 WORD FORK BLOCKž .ENDRŸ  .ENDC¡¢£ .IF DF F$$LPP¤¥ .IF DF M$$PRO¦§ .WORD 1 ;URM IN FORK BLOCK¨© .IFTFª« .BLKW 2 ;2 WORD FORK BLOCK¬$FLFTB:: ;REFERENCE LABELR­® .IFTN¯°URM=2C± .REPT M$$PRO-1 ² .WORD URM ³URM=URM*2U ´ .BLKW 2µ .ENDR¶· .ENDC¸¹ .ENDCº»¼;R+½; DEFINITIONS FOR NON MK11 MEMORY SYSTEMSC¾;E¿ .IF NDF M$$K11À Á$MKCS1::2 .WORD 0 ;# OF MK11 REGISTERS (FOR BOO,SAV,HRC) Ã$MKCSR:: Ä$MKCS2::ÅÆ .ENDC ; DF M$$K11ÇÈ .IF NDF M$$PROÉÊ;D.Ë; DEFINITIONS FOR NON-MULTIPROCESSOR SYSTEMSÌ;IÍ$CKURM:: ;REFERENCE LABELS Î$CPBIT::#Ï$CPCRM:: ;COMPLEMENTED RUN MASKE Ð$CPMSK:: Ñ$CPURM::%Ò$CPUSC:: ;CPU STATUS CHANGE ENTRY)Ó$CRMTB:: ;COMPLEMENTED RUN MASK TABLEN Ô$EXECL::)Õ$IBXMT:: ;IIST INTERCPU BOOT TRANSMITI Ö$IIMSK::)×$IISTM:: ;IIST SUBROUTINE ENTRY POINT$&Ø$IIXMT:: ;IIST TRANSMIT SUBROUTINE Ù$MPTAB:: Ú$PROCN:: Û$PROC2:: Ü$PFURM::!Ý$STENB:: ;SANITY TIMER ENABLE Þ$STFLG:: ß$STALR::á$TKTAB:: ;**-1 â$URMST:: ã$URMTB:: ä$XDTFL:: å$XDTPR:: æ$XDTIN::çè .ENDCéêHë; HERE WE DEFINE A SINGLE "FAKE WORD" WHICH RECEIVES ALL THE ADDRESSESFì; FOR THINGS WHICH ARE NOT GENNED INTO THE SYSTEM, BUT WHICH REQUIREDí; THAT THE ADDRESSES ALWAYS BE RESOLVED FOR TASKBUILDING MCR, ETC.Dî; THIS ONE (IN SYSCM) IS TO BE USED FOR D SPACE LOCATIONS, AND THEEï; ONE IN LOWCR IS USED FOR I SPACE REFERENCES AND CPU SPECIFIC INFO Cð; (ALSO THINGS WHICH MUST BE ACCESSED WHEN D SPACE IS TURNED OFF)*ñò .IF NDF R$$WPTBó ô$WPVAL:: õ$WPADD:: ö$WPLST::÷ ø FAKE = 0ùú .ENDC ; NDF R$$WPTNûüý .IF NDF E$$LOGVþ ÿ$ERHEA:: $ENTSQ::  FAKE = 0E .ENDC ; NDF E$$LOG, .IF DF FAKE/ .WORD -1 ;FAKE DATA LOCATION FOR ALL OF THEL  ;ABOVE   .ENDC ; DF FAKE   .IF DF P$$OOL1$PLPAR::.WORD 0 ;POINTER TO SECONDARY POOL PCBA:$POLHD::.WORD 0 ;LIST HEAD FOR SECONDARY POOL FREE LIST;$SECFR::.WORD 0 ;NUMBER OF FREE BLOCKS IN SECONDARY POOLF .IFF $PLPAR:: $POLHD:: $SECFR:: .ENDC .IF DF A$$CNT3$SYLHD::.WORD 0 ;LISTHEAD FOR SYSLOG INPUT QUEUE%  .WORD $SYLHD ;END OF LIST POINTER$3!$SABPT::.WORD 0 ;POINTER TO SYSTEM ACCOUNT BLOCK "#$ .IF DF X$$ACC%2&$ACNFE::.WORD BF.TRN!BF.XAC ;EXTENDED ACCOUNTING'( .IFF ;X$$ACC:)4*$ACNFE::.WORD BF.TRN ;NORMAL SUPPORTED ACCOUNTING+, .ENDC ;X$$ACC-.9/$APLIM::.WORD 0 ;FREE SEC POOL SPACE ACNT MUST RESERVES30$SYUAB::.WORD 0 ;ADDRESS OF UAB FOR SYSTEM TASKSD51$CKUAB::.WORD 0 ;UAB FOR TASK RUN FROM CLOCK QUEUE23 .IFF:4 5$SABPT:: 6$SYLHD:: 7$ACNFE:: 8$APLIM:: 9$SYUAB:::; .IFTF<1=$LOGPT::.WORD 0 ;POINTER TO TCB OF SYSLOG TASKC>?@ .ENDCABC;D; CLI DATABASE AREANE;A*F$CLICQ::.WORD 0 ;COMMAND QUEUE LISTHEADG .WORD $CLICQW6H$CNTLN::.WORD 0 ;CONTINUATION LINE SEGMENT LISTHEADI .WORD $CNTLNJ/K$CPTBL::.WORD $MCRPT ;POINTER TO CPB FOR MCRVLM .IF DF A$$CLINO .REPT A$$CLI-1SP$Q .WORD 0 ;TABLE FOR CPB ADDRESSESRS .ENDRT2U$NMCLI==A$$CLI ;NUMBER OF CLIS SYSTEM SUPPORTSVW .IFTF ;A$$CLIXY;:Z; CPB FOR MCR[;L<\$MCRPT::.WORD 0 ;POINTER TO MCR'S TCB, START OF MCR'S CPB] .RAD50 /MCR / ;CLI NAME^ .WORD CP.LGO ;STATUS WORDR/_ .BYTE MDPL ;LENGTH OF DEFAULT PROMPT STRING1` .BYTE M00‘¨d’«dÝb`TADATADATADATADATADATACPL ;LENGTH OF CONTROL/C PROMPT STRINGDa$$$=.Dbc .IF DF R$$MICd,e .ASCIZ <15><12>/$ / ;MICRO DEFAULT PROMPTfg .IFF ; DF R$$MICTh,i .ASCIZ <15><12>/>/ ;DEFAULT PROMPT STRINGjk .ENDC ; DF R$$MICl mMDPL=.-$$$no$$$=.Spq .IF DF R$$MICr*s .ASCIZ <15><12>/DCL>/ ;CONTROL/C PROMPTtu .IFF ; DF R$$MICNv1w .ASCIZ <15><12>/MCR>/ ;CONTROL/C PROMPT STRING/xy .ENDC ; DF R$$MICz {MCPL=.-$$$|} .EVEN~ .IFF ;A$$CLIR€*�$NMCLI==0 ;ALTERNATE CLI NOT SUPPORTED‚ƒ .ENDC ;A$$CLI„…†(‡$CMFIN:: ; END OF SYSCM AREA FOR CDAˆ;RC‰; PARAMETER WORD TO CONTROL TERMINAL DRIVER SYSTEM-WIDE BEHAVIOR: Š;UH‹; BIT 0 = 0 FOR REMOTE LINES, DON'T HANGUP IMMEDIATELY ON CARRIER LOSS<Œ; 1 FOR REMOTE LINES, HANGUP IMMEDIATELY ON CARRIER LOSSC�; BIT 1 = 0 FOR REMOTE LINES, DON'T ENABLE DTR UNTIL RING IS SEENT8Ž; 1 FOR REMOTE LINES, ENABLE DTR BEFORE RING IS SEEN�;$4�$TTPRM::.WORD 2 ;DEFAULT TERMINAL DRIVER BEHAVIOR‘;T3’; TERMINAL DRIVER DATA BUFFER - NOT DUMPED BY CDA“;”• .IF DF K$$DAS&T$$COMR–(—$DALED::.BLKW 1 ;TERMINAL DRIVER DATA˜™ .ENDC ;DF K$$DAS&T$$COMš›œ .IF DF T$$ACD�<ž$ACDHD::.WORD 0 ;ANCILLARY CONTROLL DRIVER BLOCK LISTHEADŸ  .ENDC ; DF T$$ACD¡¢ .ENDELY ON CARRIER LOSSC�; BIT 1 = 0 FOR REMOTE LINES, DON'T ENABLE DTR UNTIL RING IS SEENT8Ž; 1 FOR REMOTE LINES, ENABLE DTR BEFORE RING IS SEEN�;$4�$TTPRM::.WORD 2 ;DEFAULT TERMINAL DRIVER BEHAVIOR‘;T .TITLE LOWCRA .IDENT /2.02/; J; COPYRIGHT (c) 1984, 1985, 1986, 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;0>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;F ; D. N. CUTLER 11-AUG-73 ;P+ ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:; ; ; P. J. BEZEREDI; J. M. LAWLER; B. S. MCCARTHY; R. T. PERRON;N-; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:N;; B. S. MCCARTHY A ; T. LEKAS 0; T. M. MARTIN; J. R. KAUFFMAN ; P. J. BEZEREDI; J. M. LAWLER T;-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:R;F; J. W. BERZLE; B. S. MCCARTHY; C. A. SILVER; L. B. MCCULLEY;H; MODIFIED BY:;.; K. L. NOEL 15-AUG-86 V2.003;P); KLN018 -- ADD KXJ SPECIFIC LOCATIONSY;; K. L. NOEL 08-MAY-87 V2.01;L+; KLN053 -- ADD SUPPORT TICK INCREMENTERN; ; K. L. NOEL 15-JUNE-87 V2.02 ;Y3; KLN054 -- ADD SUPPORT FOR REMOTE TASK KILL I/O.;AK;:L; LOW CORE POINTERS, TRAP VECTORS, AND INTERRUPT VECTORSM;BN; THIS FILE MUST BE FIRST IN THE TASK BUILDER COMMAND FILE SINCE0O; IT OCCUPIES LOCATIONS STARTING AT REAL ZERO.P;CQ; MACRO LIBRARY CALLSDR;ST .MCALL HDRDF$,HWDDF$,PCBDF$"U HDRDF$ ;DEFINE HEADER OFFSETS&V HWDDF$ ;DEFINE HARDWARE REGISTERS/W PCBDF$ ,,SYSDEF ;DEFINE PCB OFFSETS AND SIZETX Y .PSECTNZ[;\; LOCAL MACROS]; ^; GENVT-GENERATE VECTOR ENTRYS_;T`a .MACRO GENVT ARG.b .IF DF E$$NSIc .WORD $NS'ARGd .IFFTe .WORD $NONSITf .ENDC!g .WORD PR7!<<<$$$-START>/4>&17>Nh .ENDMij k .MACRO NSINl .IF DF E$$LOG&E$$NSIIm CALL $NSIERn .IFF.o IOTp .ENDC q .ENDM NSIrsSTART:tu .REPT V$$CTR/4Cv$$$=.Hw GENVT \<<$$$-START>/<4*20>>x .ENDRy z.=START+4E2{ .WORD $TRP04 ;TRAPS TO 4 (ODD,STACK,NONEX MEM)| .WORD PR7 ;.6} .WORD $ILINS ;ILLEGAL (RESERVED) INSTRUCTION TRAPS~ .WORD PR7 ;S+ .WORD $TRACE ;BREAK POINT (TRACE) TRAPS$€ .WORD PR7 ;S� .WORD $IOTRP ;‚ .WORD PR7 ;.$ƒ .WORD $NONSI ;NONSENSE INTERRUPT„ .WORD PR7 ;'… .WORD $EMTRP ;EMT INSTRUCTION TRAPSS† .WORD PR7 ;R(‡ .WORD $TRTRP ;TRAP INSTRUCTION TRAPSˆ .WORD PR7 ;‰Š‹ .IF DF C$$CDAŒ*� JMP $CRASH ;JUMP TO CRASH DUMP ROUTINEŽ� .IFF ; DF C$$CDAD�'‘ HALT ;HALT - NO CRASH DUMP SUPPORT(’ BR .-2 ;DON'T ALLOW CONTINUE, EITHER“” .ENDC ; DF C$$CDA•–000’°dÖc³cÙ´cÚµcÛ¶c�·c›’—.DSW:: .WORD .+2 ;ADDRESS OF DIRECTIVE STATUS"˜ .BLKW 1 ;DIRECTIVE STATUS WORD$™ .BLKW 1 ;FCS IMPURE AREA POINTER(š .BLKW 1 ;FORTRAN IMPURE AREA POINTER8› .BLKW 1 ;OVERLAY RUN TIME SYSTEM IMPURE AREA POINTER#œ .BLKW 1 ;RESERVED FOR EXPANSIONC� .BLKW 12. ;O0ž .WORD 0 ;CONSTANTLY CHANGING WORD FOR M9312..Ÿ .WORD $ENVEC ;112 - FIXED POINTER TO TABLE&  ; OF NECESSARY ENTRY POINTS¡ .BLKB V$$CTR-114 ;B¢£;O¤; EXECUTIVE STACK AREA¥;¦:§ .ASCII /COPR. (C) DIGITAL 1983/ ;ASCII COPYRIGHT NOTICE¨ .BLKW 49. ;SYSTEM STACKD©ª« .IF DF P$$MON¬5­ .BLKW 16. ;DEFINE EXTRA STACK SPACE FOR P-MONITORR®¯ .ENDC°±² .IF DF I$$C11³´ .BLKW 30. ;Rµ¶ .ENDC·¸¹ .IF DF P$$LASº6» .BLKW P.LGTH/2 ;DEFINE EXTRA STACK FOR PLAS SYSTEMS¼½ .ENDC¾¿ÀÁ .IF DF M$$NETÂ/à .BLKW 10. ;ADD 10. WORDS TO STACK SPACE FOR &Ä ;DECNET TO SUPPORT FDX CHARACTERÅ ;INTERRUPT DEVICES.ÆÇ .ENDC ; DF M$$NET#È$UMR4:: .BLKW 1 ;USER'S SAVED R4O#É$UMR5:: .BLKW 1 ;USER'S SAVED R5#Ê$UMPC:: .BLKW 1 ;USER'S SAVED PC1#Ë$UMPS:: .BLKW 1 ;USER'S SAVED PSOÌÍÎ$STACK:: ;REF LABEL.ÏÐ;CÑ; PROCESSOR IMPURE DATA AREAÒ;CÓÔÕ .IF DF M$$PROÖ(×$PROC2::.BYTE 0 ;PROCESSOR NUMBER * 2$Ø$PROCN::.BYTE 0 ;PROCESSOR NUMBERÙÚ .ENDCÛÜ)Ý$STKDP::.WORD 0 ;STACK DEPTH INDICATORP/Þ$TKTCB::.WORD 0 ;POINTER TO CURRENT TASK TCB9ß$CURPR::.WORD $PRTAB ;POINTER TO CURRENT TASK PRIORITYRàáâã2ä$SGFFR:: .WORD 0 ;POINTER INTO STACK FOR $SGFINå+æ$HFMSK::.WORD HF.EIS ;HARDWARE MASK WORD +ç .WORD H2.BRG ;SECOND HARDWARE MASK WORD:,è ;H2.BRG IS SET BECAUSE THE VIRGIN BOOT+é ;OF A PROFESSIONAL 300 SERIES MACHINE+ê ;IS CURRENTLY ALWAYS DONE ON A BRIDGE-ë ;SYSTEM AND INITL DOES NOT SET THIS BITC4ì$HFEND:: ;REF. LABLE TO DELIMIT HARDWARE FEATUREí ;MASK WORDS.îï>ð; $RBTAD IS THE ADDRESS OF THE RE-BOOT ENTRY TO THE BOOT ROMñòó .IF DF B$$OOTô4õ$RBTAD::.WORD B$$OOT ;ADDRESS OF REBOOT ROM ENTRYö÷ .ENDC ; DF B$$OOTøùú; Cû; THE FOLLOWING BYTE IS A FLAG SET WHENEVER SUPERVISOR I SPACE ISRJü; MAPPED READ/WRITE, MEANING THE PDR'S MUST BE CLEARED ON CONTEXT SWITCHý;þ*ÿ$SIRWF::.BYTE 0 ;SUPER I SPACE R/W FLAG/$CXDBL::.BYTE 0 ;CONTEXT SWITCH DISABLE FLAGE)$SAHDB:: ;BIAS OF CURRENT TASK HEADERU .IF DF X$$HDR  .WORD 08$SAVSP::.WORD $UMR4 ;SAVED SP - ALWAYS POINTS TO UMR4  .IFTF 4 $SAHPT:: ;VIRTUAL ADDRESS OF CURRENT TASK HEADER   .IFT  .WORD 0 .ENDC2$HEADR::.WORD 0 ;POINTER TO CURRENT TASK HEADER .IF DF F$$MAP6$FMAPP::.WORD 0 ;POINTER TO FAST MAP AREA OF HEADER .ENDC ; DF F$$MAP>$RQSCH::.WORD $RQTAB ;POINTER TO CURRENT RESCHEDULE POINTER;SJ; THE FOLLOWING CELLS CONDITIONALLY DESCRIBE THE EXECUTIVE CONFIGURATION&; IF KERNEL DATA SPACE IS SUPPORTED. ;;!"# .IF DF K$$DAS$G%$ROEND::.WORD <<<$EXEND+77>&177700>/100>&1777 ;LENGTH IN 32 WD BLOCKSR$& ;OF R/O SECTION OF EXECUTIVE;'$SCMOF::.WORD 0 ;OFFSET TO DATA SPACE OR 0 IF NOT LOADEDR!( .WORD 3 ;ALLOCATION SIZE MASKP8)$ICAVL::.WORD $ICBEG ;BEGINNING OF ALLOCATED ICB POOL'* .WORD 0 ;DUMMY SIZE FOR FIRST BLOCKB+, .IFF -0.$SCMOF:: ;MAKE SURE SYMBOL IS ALWAYS DEFINED/0 .ENDC123;ID4; UMR ALLOCATION LISTHEAD AND WAIT QUEUE LISTHEAD. THE ALLOCATIONH5; LISTHEAD DOUBLES AS A DESCRIPTOR OF THE UMRS STATICALLY ALLOCATED TO6; THE EXEC AND ANYONE ELSE.O7;89: .IF DF M$$EXT&U$$UMRI;5<$UMRHD::.WORD 0 ;MAPPING ASSIGNMENT BLOCK LISTHEADA.= .WORD UBMPR ;ADDRESS OF FIRST ASSIGNED UMR7> .WORD N$$UMR ;NUMBER OF UMR'S STATICLY ASSIGNED * 4O/?$UMRWT::.WORD 0,.-2 ;UMR WAIT QUEUE LISTHEAD@A .ENDC ; DF M$$EXT&U$$UMRLBCD;F+E; DATA STRUCTURES FOR EXECUTIVE IDLE CODEOF;NG+H$IDLCT::.BYTE 0 ;IDLE PATTERN COUNT BYTEN*I$IDLFL::.BYTE 0 ;IDLE PATTERN FLAG BYTE(J00’¸d«dÝb`TADATADATADATADATADATA$IDLPT::.WORD 7760 ;IDLE PATTERN WORD-K .WORD 0 ;WORKING STORAGE FOR IDLE PATTERN$LM;MN; SYSTEM POWER FAIL STACKAO; PQR .IF DF P$$RFLSTU .IF DF M$$PROV;W$PWKA0::.BLKW M$$PRO ;;;STORAGE FOR KINAR0 IN CPA'S AREAY-X$PWCSR::.WORD FKCSR ;;;POINTER TO IIST CSRT3YFKCSR: .WORD 0 ;;;CPA CSR (WHEN NO IIST PRESENT)Z[ .ENDC\]%^$PWBTM::.BLKW 7 ;R0 THRU R5 AND SPN_`a .IF DF M$$EXTb)c .BLKW 31.*2 ;UNIBUS MAPPING REGISTERSDde .ENDCfg/h .BLKW 25. ;MEMORY MANAGEMENT REGS & USER SPDijk .IF DF F$$LPPl'm .BLKW 27. ;FLOATING POINT REGISTERS no .ENDCpqr .IF DF K$$DASs"t .BLKW 8. ;KERNEL D SPACE APR'Suv .ENDCwxy .IF DF S$$LIBz*{ .BLKW 16. ;SUPER I SPACE PARS AND PDRS*| .BLKW 16. ;SUPER D SPACE PARS AND PDRS} .BLKW 1 ;SUPER SP~ .ENDC€�‚ .IF DF U$$DASƒ%„ .BLKW 16. ;USER D SPACE REGISTERST…† .ENDC ; DF U$$DAS‡ˆ‰$PWSTK==.-2 ;REF LABELŠ‹1Œ$POWSP:: .BLKW 1 ;SAVED SP FOR POWERFAIL STACK�Ž� .ENDC�‘’;$“; FLOATING POINT SUPPORT WORK AREA”;•–— .IF DF F$$LPP˜)™$FLSTS::.BLKW 2 ;FLOATING POINT STATUSS>š$FLFRK::.WORD $FLFTB ;POINTER FOR FLOATING POINT FORK BLOCK9›$FLTCB::.BLKW 1 ;ADDRESS OF TCB CAUSING EXCEPTION TRAP œ� .ENDCžŸ ;R;¡; SAVE AREA FOR ERROR LOGGING NONSENSE INTERRUPT HANDLING.¢;E£¤ .IF DF E$$LOG&E$$NSI.¥¦$§$VID:: .BLKB 1 ;VECTOR ID STORAGE%¨$NSI:: .BYTE -1 ;RECURSION COUNTERV!©$OPS:: .BLKW 1 ;OLD PS STORAGE!ª$OPC:: .BLKW 1 ;OLD PC STORAGEG;«$ERLFK::.WORD $PBEZ ;POINTER TO ERROR LOGGING FORK BLOCK¬­® .ENDC ; DF E$$LOG&E$$NSIA¯°;F&±; DATA STRUCTURES FOR PARITY SUPPORT²;N³; EXEC PARITY ERROR MESSAGE ´;Rµ¶· .IF DF P$$RTY¸ ¹ .NLIST BEXNEº$EXMSG::.ASCIZ <15><12>/***EXEC PARITY ERROR STOP***/<15><12><12> ;N » .LIST BEX¼ .EVEN½¾;G%¿; INTERRUPT RECURSION LEVEL COUNTERCÀ;DÁÂ$PARLV::.WORD -1 ; ÃÄ;O0Å; PARITY CONTROL STATUS REGISTER ADDRESS TABLEÆ;:ÇÈ; ******* NOTE WELL ! *******:É; FÊ; THE FOLLOWING TABLES ARE REFERENCED IN INITL AND PARTY, AS WELL ASGË; BY SAVE AND HRC. THE ADJACENCY OF THE ITEMS STARTING AT $PARTB ANDXCÌ; INCLUDING $MEMR1, $MPCSR, AND $CPUER IS NOT ONLY ASSUMED, IT ISSDÍ; CRUCIAL AND MUST BE PRESERVED. NOTE ALSO THAT ANY CHANGE IN THEJÎ; STRUCTURE OF $PARTB SHOULD PROBABLY BE REFLECTED IN $MKCSR AND $MKCS2,Ï; BOTH FOUND IN SYSCM.ÐÑ$CSRTB:: ;REFERENCE LABELYGÒ$MEMRG::.BYTE 16.,<172100&177400>/400,172100&377 ;MEMORY PARITY CSR'S @Ó .BYTE 6. ,<177740&177400>/400,177740&377 ;CACHE CONTROL CSR'S?Ô .BYTE 1. ,<177766&177400>/400,177766&377 ;CPU ERROR REGISTERIÕ .BYTE 0 ;END OF TABLEXÖ4× .BLKW 1 ;DUMMY STORAGE FOR MEMORY ERROR REGISTERØÙ .IFTF ; DF P$$RTYÚ7Û$PARTB::.WORD 1 ;DUMMY CSR FOR NONEXISTANT REGISTERS ÜÝ .IFT ; DF P$$RTYDÞß; Gà; TABLE OF CSR ADDRESSES. IF THE CSR DOES NOT EXIST, THE ENTRY POINTSBGá; TO $PARTB ABOVE. THIS MUST BE THE CASE SO THAT CODE REFERENCING THE7Gâ; CSRS PRIOR TO THE CSR SCAN (SUCH AS THE LOCK$ $EXECL IN INITL) WILLE,ã; ACCESS A DUMMY LOCATION, NOT LOCATION 0.ä;7å%æ$MEMR1:: ;MEMORY PARITY CSR TABLEE ç .REPT 16.$è .WORD $PARTB ;POINT TO DUMMY CSRé .ENDR+ê$MPCSR:: ;VECTOR OF CACHE CSR ADDRESSESR ë .REPT 6.;$ì .WORD $PARTB ;POINT TO DUMMY CSRí .ENDRîï .IFTF ; DF P$$RTYð ñ$CPUER:: ;CPU ERROR REGISTER$ò .WORD $PARTB ;POINT TO DUMMY CSRóô .IFT ; DF P$$RTYUõö÷ø; 'ù; PDP-11/70 CACHE PARITY STATUS TABLERú;Hûüý .IF DF P$$D70þ*ÿ$MSTAT::.BLKW 2 ;FIRST TWO PARITY CSR'S*$STAT:: .BLKW 1 ;MEMORY STATUS REGISTER$ .BLKW 3 ;LAST THREE PARITY CSR'S-$ERTRK::.BYTE 44,120 ;ADDRESS/DATA GROUP 0 .WORD 0 ;TIME OF LAST ERRORA& .BYTE 30,240 ;ADDRESS/DATA GROUP 1 .WORD 0 ;TIME OF LAST ERROR .WORD 0 ;END OF TABLE$;! ; NEW CACHE PARITY CSR CONTENTS ;D  $MPCTL::.WOR00’ÀdÖc³cÙ´cÚµcÛ¶c�·c›’D 1 ;  .ENDC .IFF ; DF P$$RTY$CSRTB:: ;REFERENCE LABELU .ENDC ; DF P$$RTY1; DATA AREA FOR DYNAMIC EXEC DEBUGGER INTERFACER .IF DF D$$DXD($DXDK5::.WORD 0 ;SAVED KINAR5 FOR DXD+$DXDRL::.WORD 0 ;RELOCATION BIAS FOR DXDS&$DXDEP::.WORD 0 ;ENTRY POINT TO DXD !" .ENDC ; D$$DXD;#$;A"%; DATA AREA FOR BUGCHECK SUPPORT&;O'!($BCFAC::.WORD 0 ;FACILITY CODE)$BCERR::.WORD 0 ;ERROR CODE*+;D%,; DATA AREA FOR SYSTEM CRASH MODULEC-;./0 .IF DF C$$CDA142$CRBAE::.WORD 0 ;DEFINE EXISTENCE OF BAE REGISTER374 .IIF EQ C$$CDA-12 CDA$MS=0 ;MS RESIDENT CRASH DRIVERR45 .IIF EQ C$$CDA CDA$MS=0 ;LOADABLE CRASH DRIVERS687 .IF DF CDA$MS ;MS RESIDENT OR LOADABLE CRASH DRIVER89.:$MSCR1:: ;COMMAND BUFFER FOR MS CRASH DUMP4; .BLKW 5 ;NEED FOUR WORDS ON DOUBLE WORD BOUNDARY"<$MSCR2:: ;CHARACTERISTICS DATA.= .WORD $MSCR3 ;LOW ORDER 16 BITS OF MESSAGE> ;BUFFER ADDRESSE? .WORD 0 ;HIGH ORDER 2 BITS)@ .WORD 14. ;SIZE OF THE MESSAGE BUFFERWA .WORD 0 ;FLAG WORDB"C$MSCR3::.BLKW 7 ;MESSAGE BUFFERDE .ENDC ;DF CDA$MSCFGH .IIF EQ C$$CDA-16 CDA$DU=0SI .IIF EQ C$$CDA-17 CDA$MU=0JK .IF DF CDA$DU!CDA$MU!H$$GENLM;R"N; CRASH DATA BASE FOR DU DEVICESO; P; *** NOTE WELL ***P?Q; ANY CHANGES TO THIS DATABASE MUST ALSO BE MADE IN CRASH.MAC:R S; COMMAND AND RESPONSE PACKETSTU .WORD 60 ;PACKET LENGTHE3V .WORD 1 ;VIRTUAL CIRCUIT AND CREDIT/DEBIT FIELDI'WCMDPKT: .WORD 1 ;COMMAND PACKET AREAFX .BLKW 23. ; Y .BLKW 2 ;ENVELOPE3*ZRSPPKT: .BLKW 24. ;RESPONSE PACKET AREA [ .BLKW 2 ;\]; COMMAND RINGSC^_RINGS:*`RSP: .WORD RSPPKT ;RESPONSE PACKET RING/a .WORD 100000 ; PACKET "OWNED" BY CONTROLLER )bCMD: .WORD CMDPKT ;COMMAND PACKET RINGP/c .WORD 100000 ; PACKET "OWNED" BY CONTROLLERAde; INITIALIZATION TABLEf g$MUCSH::4h$DUCSH::.WORD CMDPKT, RSPPKT ;ADDRESSES OF PACKETS%i .WORD 100000, RINGS ;STEPS 1 AND 2Lj .WORD 0, 1 ;STEPS 3 AND 4 'k .WORD RSP ;ADDRESS OF RESPONSE RING2lm .ENDCnop .IFF ; DF C$$CDAEq/r$BCPC:: .WORD 0 ;BUGCHECK PC FOR TYPE DIRECTst .IFT ; DF C$$CDADu*v$BCPC:: ;ALTERNATE LABEL FOR CRASH PCw*x$CRUPC::.WORD 0 ;USER PC IS STORED HERE*y$CRUST::.WORD 0 ;USER PS IS STORED HEREz { .NLIST BEX C|$CRMS0::.ASCII <15><12><12>/CRASH -- CONT WITH SCRATCH MEDIA ON /H}~$CRDEV:: ;REFERENCE SYMBOLF€.IIF EQ C$$CDA-1, .ASCII /DT/P�.IIF EQ C$$CDA-2, .ASCII /DK/ ‚.IIF EQ C$$CDA-3, .ASCII /MT/Oƒ.IIF EQ C$$CDA-4, .ASCII /MM/„.IIF EQ C$$CDA-5, .ASCII /DB/….IIF EQ C$$CDA-6, .ASCII /DM/ †.IIF EQ C$$CDA-7, .ASCII /DL/$ ‡.IIF EQ C$$CDA-10, .ASCII /DD/ ˆ.IIF EQ C$$CDA-11, .ASCII /DR/ ‰.IIF EQ C$$CDA-12, .ASCII /MS//Š.IIF EQ C$$CDA-13, .ASCII /DX/ ;NOT SUPPORTED/‹.IIF EQ C$$CDA-14, .ASCII /DY/ ;NOT SUPPORTED /Œ.IIF EQ C$$CDA-15, .ASCII /MF/ ;NOT SUPPORTED �.IIF EQ C$$CDA-16, .ASCII /DU/Ž.IIF EQ C$$CDA-17 .ASCII /MU/ �@�.IIF EQ <.-$CRDEV> .ASCII /XX/ ;ALWAYS ALLOW FOR A DEVICE NAME‘’$CRUNT::.BYTE <60+C$$RUN>$“ .ASCIZ <15><12><12>”•– .IF DF M$$PRO—E˜$CRMS1::.ASCIZ <15><12>/CRASH -- WAITING FOR PROCESSORS TO QUIESCE/G™$CRMS2::.ASCIZ <15><12>/CRASH -- PROCESSOR REGISTERS HAVE BEEN SAVED/EHš$CRMS4::.ASCIZ <15><12>/CRASH -- SANITY TIMER EXPIRED ON PROCESSOR CP/C›$CRMS5::.ASCIZ <15><12>/CRASH -- CRASH REQUESTED BY PROCESSOR CP/œ$CRCPU::.ASCIZ /?/�ž .ENDCŸ B¡$CRMS3::.ASCIZ <15><12>\CRASH -- I/O ERROR ON CRASH DUMP DEVICE\8¢$CRMS6::.ASCIZ <15><12>/CRASH -- ILLEGAL CRASH DEVICE/;£$CRMS7::.ASCIZ <15><12>/CRASH -- CRASH DRIVER NOT LOADED/1¤?¥; ALL THE SECTIONS OF THE BUGCHECK MESSAGE MUST BE CONTIGUOUSM¦7§$BCMSG::.ASCIZ <15><12>/SYSTEM FAULT DETECTED AT PC=/V¨ .ASCIZ / FACILITY=/5© .ASCIZ / ERROR CODE=/ª .ASCIZ <15><12><12>«(¬ .BLKB 6 ;BUFFER FOR OCTAL CONVERSION&­$BCBUF::.BYTE 0 ;OF VALUES IN CRASH® ¯ .LIST BEX°00’Èd«dÝb`TADATADATADATADATADATA±² .ENDC ; DF C$$CDA³´µ .IF DF A$$CNT¶,·$BILNG::.BYTE 1 ;BILLING IS INITIALLY OFF¸¹ .IFFGº »$BILNG::¼½ .ENDC¾¿ÀÁ .IF DF S$$LIBÂ*Ã$SUPFL::.BYTE 0 ;SUPERVISOR WINDOW FLAGÄÅ .ENDC ; DF S$$LIBÆÇ .EVENÈ*É ; *** THE FOLLOWING MUST BE ADJACENTÊË .IF DF C$$CDAÌ,Í .BLKW 6 ;STACK AREA FOR SUBROUTINE CALLS4Î$CRSBF::.BLKW 177. ;CRASH STACK IS THIS SIZE (NOT$Ï ;169.+4 AS PREVIOUSLY THOUGHT)!Ð ;(SEE CRASH.MAC FOR FORMAT)#Ñ$CRSST==.-2 ;TOP OF CRASH STACK"Ò ; *** ABOVE MUST BE ADJACENT1Ó .IF EQ, C$$CDA ;LOADABLE CRASH DRIVER SUPPORTBÔ%Õ PBNH = 0 ;STARTING DEVICE ADDRESS Ö PBNL = 0 ;UNKNOWNBר .IFTFÙ2Ú$CRSBN::.WORD PBNH,PBNL ;STARTING DEVICE ADDRESS5Û$CRSCS::.WORD PBNH+PBNL ;CHECKSUM OF DEVICE ADDRESS8Ü$CRDMP::.BYTE 0 ;FLAG INDICATING REGS HAVE BEEN SAVED$Ý .BYTE 0 ;PRESERVE WORD ALIGNMENTÞ ß$CRPAR::àá .IFT ; EQ, C$$CDAâ)ã .WORD 0 ;P.REL OF LOADED CRASH DRIVEROäå .ENDC ; EQ, C$$CDAPæç .ENDC ; DF C$$CDAèéêëì .IF DF A$$CNTí;î$STRTM::.BLKW 2 ;ABSOLUTE TIME OF CONTEXT SWITCH TO TASKTïð .IFF ñ ò$STRTM::óô .ENDCõö÷Hø; HERE WE DEFINE A SINGLE "FAKE WORD" WHICH RECEIVES ALL THE ADDRESSESFù; FOR THINGS WHICH ARE NOT GENNED INTO THE SYSTEM, BUT WHICH REQUIREDú; THAT THE ADDRESSES ALWAYS BE RESOLVED FOR TASKBUILDING MCR, ETC.Dû; THIS ONE (IN LOWCR) IS TO BE USED FOR I SPACE REFERENCES AND CPUEü; SPECIFIC INFO (ALSO THINGS WHICH MUST BE ACCESSED WHEN D SPACE ISCý; TURNED OFF), AND THE ONE IN SYSCM IS USED FOR D SPACE LOCATIONSMþÿ .IF NDF R$$WPTT $WPBR::F  FAKE = 0: .ENDC ; NDF R$$WPT .IF NDF P$$RTY   $PARLV::   FAKE = 0E  .ENDC ; NDF P$$RTYW .IF NDF D$$DXDE $DXDEP:: $DXDK5:: $DXDRL::  FAKE = 0  .ENDC ; NDF D$$DXDG .IF DF FAKE/ .WORD -1 ;FAKE DATA LOCATION FOR ALL OF THEA  ;ABOVE  .ENDC ; DF FAKE!"#;+/$; **-$NS0,$NS1,$NS2,$NS3,$NS4,$NS5,$NS6,$NS7-T*%; NONSENSE INTERRUPT IDENTIFIER ROUTINES&;A'; EACH OF THESE ROUTINES IS VECTORED TO BY ONE OF A GROUP OF 16CI(; UNUSED VECTORS. THE VECTORS ARE SUB-CODED IN THE PS CONDITION CODES.E);-*+, .IF DF M$$PRO-.;.C/; IN A MULTIPROCESSING SYSTEM, SOME STACK SPACE IS NECESSARY WHEN A0; THE CPU IS INTERRUPTED. THE M9312MP BOOTSTRAP SETS R6 TO THE :1; VALUE POINTED TO BY PHYSICAL ZERO. THIS IS THAT AREA.2;;3#4 .BLKW 20. ;STACK SPACE FOR IIST$56 .ENDC78%9$NS0:: NSI ;;;CALL COMMON ROUTINEF: .WORD 0 ;;;GROUP 0-17H;$NS1:: NSI ;;;< .WORD 20 ;;;GROUP 20-37U=$NS2:: NSI ;;;> .WORD 40 ;;;GROUP 40-57B?$NS3:: NSI ;;;@ .WORD 60 ;;;GROUP 60-77A$NS4:: NSI ;;;B .WORD 100 ;;;GROUP 100-117C$NS5:: NSI ;;;D .WORD 120 ;;;GROUP 120-137E$NS6:: NSI ;;;F .WORD 140 ;;;GROUP 140-157G$NS7:: NSI ;;;H .WORD 160 ;;;GROUP 160-177IJ;T0K; INDIRECT POINTERS INTO MULTIPROCESSOR TABLESL;MNO .IF DF M$$PROP8Q$TKPTR::.WORD $TKTAB ;POINTER INTO CURRECT TASK TABLE6R$MPSWT::.WORD $MPTAB ;POINTER INTO CPU STATUS TABLE3S$CPURM::.WORD $URMTB ;POINTER INTO CPU URM TABLE:?T$CPCRM::.WORD $CRMTB ;POINTER INTO COMPLEMENTED RUN MASK TBL.4U$TTUQP::.WORD $TTUQ ;TTDRV MULTIPROCESSOR POINTERVW;;&X; MULTIPROCESSOR LOCAL MEMORY WORDS.Y;1Z2[$CPBIT::.WORD 1 ;PROCESSOR BIT FOR USE IN MASKS2\$FRKCT::.WORD 0 ;NUMBER OF FORK BLOCKS DEQUEUED]^ .ENDC^; ; KLN018+^; KXJ11 SPECIFIC LOCATIONS ; KLN018B^; ; KLN018 .^ .IF DF C$$KXJ ; KXJ SUPPORTED? ; KLN018^ ; KLN018C^$KXVC1::.BLKW 1 ; KXJ VECTOR 1 - DRIVER COMMUNICATION ; KLN018CD^$CSFSV::.BLKW 1 ; SAVED KXJ CSR F - FULLY SHARED MEMORY ; KLN018A^$CSHSV::.BLKW 1 ; SAVED KXJ CSR H - " " " ; KLN018M=^$KXPTR::.BLKW 1 ; POINTER TO KXJ DRIVER'S DCB ; KLN018S6^$KXBAS::.BLKW 1 ; BASE ADDRESS OF KXDRV 00’Ðd“Ôd³cÙ´cÚµcÛ¶c�·c›’; KLN018^ ; KLN018^ .IFF ; KLN018 ^ ; KLN018^$KXVC1:: ; KLN018 ^$CSFSV:: ; KLN018J^$CSHSV:: ; KLN0188^$KXPTR:: ; KLN018V^$KXBAS:: ; KLN018 ^ ; KLN018"^ .ENDC ; C$$KXJ ; KLN018^; ; KLN018A2^; REMOTE SYSTEM SPECIFIC LOCATIONS ; KLN018^; ; KLN018 ,^ .IF DF C$$RMT ; REMOTE HOST ; KLN018^ ; KLN0189^$XXLOW::.BLKW 1 ; FIRST GENERIC DCB ADDRESS ; KLN018L8^$XXHGH::.BLKW 1 ; LAST GENERIC DCB ADDRESS ; KLN0184^ ; USED TO IDENTIFY A GENERIC DEVICE ; KLN018^ ; KLN018^ .IFF ; KLN018^ ; KLN018^$XXLOW:: ; KLN018 ^$XXHGH:: ; KLN018 ^ ; KLN018 ^ .ENDC ; C$$RMT ; KLN018^ ; KLN018^; ; KLN053O9^; ADDRESS TO INCREMENT ON EVERY CLOCK TICK ; KLN053 @^; THIS IS EITHER 110 OR ON KXJ REMOTE SYSTEMS TPR5 ; KLN053^; ; KLN053A4^$CKINC::.WORD 110 ; INITIALIZE TO 110 ; KLN053^; ; KLN0540^; REMOTE TASK SPECIFIC LOCATIONS ; KLN054^; ; KLN05483^ .IF DF C$$RTK ; REMOTE TASK SUPPORT ; KLN054X^ ; KLN054C^$CPPKT:: .WORD 0 ; PRE-ALLOCATED CPRBUF PACKET ADDRESS ; KLN054$?^$CPLUN:: .WORD 0 ; LUN NUMBER FOR REMOTE I/O KILLS ; KLN054^ ; KLN054^ .IFF ; KLN054^ ; KLN054^$CPPKT:: ; KLN054 ^$CPLUN:: ; KLN054 ^ ; KLN054 ^ .ENDC ; C$$RTK ; KLN054_`a .END^; ; KLN0540^; REMOTE TASK SPECIFIC LOCATIONS ; KLN054^; ; KLN05483^ .IF DF C$$RTK ; REMOTE TASK SUPPORT ; KLN054X^ ; KLN054C^$CPPKT:: .WORD 0 ; PRE-ALLOCATED CPRBUF PACKET ADDRESS ; KLN054$?^$CPLUN:: .WORD 0 ; LUN NUMBER FOR REMOTE I/O KILLS ; KLN054^ ; KLN054^ .IFF ; KLN054^ ; KLN054^$CPPKT:: ; KLN054 ^$CPLUN:: ; KLN054 ^ ; KLN054 ^ .ENDC .TITLE INICRA .IDENT /1.08/;R; J. WEHNER 06-MAY-83;0&; LOADABLE CRASH INITIALIZATION MODULE;R; MODIFIED BY:;E; J. G. WEHNER 26-MAY-83 1.01 ; -; JGW024 - CLEAR $CRUNT AND $CRCSR ON UNLOAD$;O; J. W. BERZLE 08-JUN-83 1.02A;I8; JWB026 - ADD WORD TO JUMP INDIRECT THROUGH FROM CRASH; ; J. W. BERZLE 29-JUN-83 1.03 ;94; JWB032 - CLEAR $CRPAR WHEN UNLOADING CRASH DRIVER; ; J. W. BERZLE 05-JUL-83 1.04B;A ; JWB034 - CHANGE TRANSFER WORD;; G. N. LARSEN 22-OCT-84 1.05.;L; GL003 - ADD EXEC VECTORING;.; P. K. M. WEISS 19-DEC-84 1.06E;A; PKW082 - FIX EXEC VECTORING;I; J. W. BERZLE 03-JAN-85 1.07-;-0; JWB123 - MAKE CODE PIC, REMOVE $CRSFM, KISDR6;U; J. W. BERZLE 21-JUN-85 1.08U;3; JWB156 -- VECTOR $CRALT O;T;***********************;HF; THE FOLLOWING IS A TRANSFER WORD WHICH MUST BE THE FIRST LOCATION OFI; THIS MODULE. WHEN A CRASH OCCURS, A JUMP IS MADE INDIRECT THROUGH THIS 5; LOCATION TO BYPASS THE EXP INITIALIZATION ROUTINES..;L .WORD TRNSFR E;*********************** .MCALL DIR$,GIN$E;A; EXEC ENTRY VECTOR TABLEO;GEXEVEC:. .WORD 0BCBUF:: .WORD $BCBUFCRALT:: .WORD $CRALTCRBAE:: .WORD $CRBAECRCSR:: .WORD $CRCSRCRDEV:: .WORD $CRDEVCRDV1:: .WORD $CRDEVCRKRB:: .WORD $CRKRBCRMS0:: .WORD $CRMS0CRMS3:: .WORD $CRMS3CRMS6:: .WORD $CRMS6CRPAR:: .WORD $CRPARCRSBN:: .WORD $CRSBNCRSB2:: .WORD $CRSBNCRSCS:: .WORD $CRSCSCRSUN:: .WORD $CRSUNCRUNT:: .WORD $CRUNTHFMSK:: .WORD $HFMSKKISA5:: .WORD KISAR5KISA6:: .WORD KISAR6MSCR1:: .WORD $MSCR1MSCR2:: .WORD $MSCR2MSCR3:: .WORD $MSCR3UISA6:: .WORD UISAR6EXEVCL=<<.-EXEVEC>/2>B>TRNVEC: GIN$ GI.VEC,EXEVEC,EXEVCL ; TRANSLATE EXECUTIVE VECTOR;R; INITIALIZE CRASH DATA BASE R;C$XPLOA:: MOV PC,R0 ; MAKE CODE PIC* ADD #TRNVEC-.,R0 ; RELOCATED ADDR OF DPB MOV PC,R1  ADD #EXEVEC-.,R1:, MOV R1,4(R0) ; RELOCATE EXEVEC ADDR IN DPB' DIR$ R0 ; TRANSLATE EXECUTIVE VECTOR: BCC 5$C BPT5$: # ADD #2,CRSB2 00“Ød”ÚdÝb`TADATADATADATADATADATA ; MAKE THIS $CRSBN+2I! INC CRDV1 ; MAKE THIS $CRDEV+1M& CALL $SWSTK,10$ ; GO TO SYSTEM STATE( MOV PC,R0 ;; CALCULATE RETURN ADDRESS ADD #10$-.,R0% MOV R0,16(SP) ;; SET RETURN ADDRESSR7 MOV @UISA6,@CRPAR ;; STORE THE PARTITION LOAD ADDRESSA+ MOV #PBNH,@CRSBN ;; STARTING BLOCK NUMBERE MOV #PBNL,@CRSB2.# MOV #PBNH,@CRSCS ;; SBN CHECK SUM, ADD #PBNL,@CRSCSC%10$: RETURN ;; BACK TO USER STATEA;N.; CLR DATA BASE BEFORE UNLOADING THE PARTITION;C$XPUNL::& CALL $SWSTK,10$ ; GO TO SYSTEM STATE( MOV PC,R0 ;; CALCULATE RETURN ADDRESS ADD #10$-.,R0% MOV R0,16(SP) ;; SET RETURN ADDRESS ' CLRB @CRDEV ;; CLEAR THE DEVICE NAME CLRB @CRDV1- CLR @CRSUN ;; CLEAR THE DEVICE UNIT NUMBER;/ CLRB @CRUNT ;; CLEAR THE ASCII DEVICE NUMBERR% CLR @CRCSR ;; CLEAR THE DEVICE CSRB$ CLR @CRSCS ;; CLEAR THE CHECK SUM( CLR @CRPAR ;; CLEAR PARTITION ADDRESS CLR @CRKRB ;; CLEAR THE KRB$10$: RETURN ;; BACK TO USER STATETRNSFR:I .END$XPUNL::& CALL $SWSTK,10$ ;  .TITLE DRGINM .IDENT /05.02/ .;77; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION,; ALL RIGHTS RESERVED.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; MODIFIED BY: ;; ; J. KAUFFMAN 5-FEB-86 04.01 ; < ; JRK322 -- INCLUDE SECONDARY ABORT CODE FOR ^C ABORT AST ;. ; J. KAUFFMAN 11-JUN-86 04.02D ;) ; JRK331 -- ADD T3.CLI CHECK TO $SFABOS ; - ; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:0 ;$ ; ERIC POSTPISCHIL 12-DEC-86 05.00< ; edp040 -- ADD SON OF GET DEVICE INFORMATION SUBFUNCTION ; TO GIN DIRECTIVE.R ;D# ; ERIC POSTPISCHIL 6-JAN-87 05.01 A ; edp046 -- USE PROPER REGISTER AFTER REDIRECTION IS FOLLOWED. ;O ; K. L. NOEL 13-JAN-87 05.02 > ; KLN033 -- ADD REMOTE SUPPORT FOR GET ASSIGNED DEVICE NAME ; 9;O:;T;<=;.>; LOCAL DATA?;4:@ GBLMSK = 7 ;SEARCH INHIBIT MASK TO ONLY SYSTEM LOGICALS9A USRMSK = 15 ;SEARCH INHIBIT MASK TO ONLY USER LOGICALS )B MAP6 = 140000 ;OFFSET TO START OF APR64CC .PAGE ; BM385C; ; BM3857C; DEFINE SUBFUNCTION DISPATCH TABLE ENTRY ; BM385JC; ; BM3854C; SFDIR FLAGS,DPBSIZ,BUFSIZ,ADDR,COND ; BM385C; ; BM385C; WHERE: ; BM385C; ; BM385KC; FLAGS= SF.IN SET IF THE SUBFUNCTION RETURNS SYSTEM INFORMATION. ; BM385A7C; SF.PRV IF THE SUBFUNCTION IS PRIVILEGED. ; BM385S;C; (BITS 15-13 IN THE FIRST WORD OF THE ENTRY). ; BM385S*C; DPBSIZ=DPB SIZE IN WORDS. ; BM385:C; (BITS 12-8 IN THE FIRST WORD OF THE ENTRY). ; BM385BC; BUFSIZ=SIZE OF THE MINIMUM BUFFER REQUIRED IN WORDS. ; BM3859C; (BITS 7-0 IN THE FIRST WORD OF THE ENTRY). ; BM385 >C; ADDR=ADDRESS OF ROUTINE TO PERFORM THE FUNCTION. ; BM385,C; (SECOND WORD OF THE ENTRY). ; BM385DC; COND=EXPRESSION ON WHICH DIRECTIVE IS CONDITIONALIZED. ; BM385>C; DEFAULT OF $SFTBL IS USED FOR CONVENIENCE (I.E. ; BM385"C; UNCONDITIONAL). ; BM385C; ; BM385C ; BM3855>C .MACRO SFDIR FLAGS,DPBSIZ,BUFSIZ,ADDR,COND=$SFTBL ; BM385C ; BM385MC ; BM385DC .IF DF COND ; BM385SC ; BM385D1C .WORD FLAGS!! ; BM385TC .WORD ADDR ; BM385C ; BM385DC .IFF ; BM385;C ; BM385EC .WORD 0 ; BM385 C .WORD 0 ; BM385C ; BM385LC .ENDC ; BM385C ; BM385UC ; BM385;C .ENDM ; BM385C ; BM3858C .PAGE ; BM385C ; BM385NC;+ ; BM385 NC; SUBFUNCTION DISPATCH TABLE FOR THE GET/SET INFORMATION DIRECTIVE. ; BM385C;- ; BM385FC ; BM385UC ; BM385PC$SFTBL::SFDIR SF.PRV!SF.IN, 8., 6.,$SFGAS ;000.-GET ASSIGNMENT INFO ; BM385HC SFDIR SF.IN, 4., 5.,$SFUIC ;001.-GET SYSUIC, LIBUIC, ; BM385@C SFDIR 0, 3., 0.,$SFDEF ;002.-SET DEFAULT UIC ; B00”àdÔd³cÙ´cÚµcÛ¶c�·c›’M385KC SFDIR SF.IN, 4., 9.,$SFFMK ;003.-GET FEATURE MASK WORDS ; BM385AGC SFDIR 0, 4., 2.,$SFQMC ;004.-QUEUE MCR COMMAND LINE ; BM385F8C SFDIR 0, 6., ,$SFUAB,A$$CNT ; BM385-C ;005.-GET USER ACCOUNT BLK ; BM385 KC SFDIR SF.IN, 6., 1.,$SFDEV ;006.-GET DEVICE INFORMATION ; BM385 CC SFDIR 0, 3., 0.,$SFSPR ;007.-SET TASK PRIVILEGE ; BM385FAC SFDIR 0, 4., 0.,$SFREN ;008.-CHANGE TASK NAME ; BM385$CC SFDIR SF.IN, 4.,97.,$SFAPR ;009.-READ ALL APRS ; BM385$KC SFDIR SF.IN, 6., 2.,$SFFTK ;010.-FIND AND GET TASK INFO ; BM385MBC SFDIR 0, 10.,0,$SFPMN ;011.-SET PMON PARMS ; BM385@C SFDIR 0, 4., 1.,$SFCFG ;012.-GET CONFIG. TAB ; BM385@C SFDIR 0, 4., 3.,$SFSSN ;013.-GET SYS. SERIAL ; BM385@C SFDIR 0, 4., 2.,$SFABO ;014.-ABORT ALL TASKS ; BM385FC SFDIR SF.IN, 4., 2.,$SFVEC ;015.-TRANSLATE VECTOR ; BM385KC SFDIR 0, 0., 0., 0,NEVER ;016.-GET MASS STORAGE (P/OS); BM385 AC SFDIR SF.IN, 4., 5.,$SFUPD ;017.-UPDATE UICS ; BM385NFC SFDIR SF.IN, 6., 1.,$SFDEV ;018.-SON OF GET DEVICE ;edp040%C ; INFORMATION ;edp040 &C$SFHI==<.-$SFTBL/4-1> ; BM385C ; BM3850D;++E; **-$DRGIN-GENERAL INFORMATION DIRECTIVE3F;BG; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO PERFORM THE SUBFUNCTIONH; INDICATED IN THE DPB.S?I; THE FUNCTIONS CAN EITHER SET PARAMETERS OR GET INFORMATION. J;0DK;*****************************************************************L;$8M; CAUTION! THIS DIRECTIVE IS INTENDED FOR USE ONLY BY3N; DEC SOFTWARE. THERE IS NO GUARANTEE THAT THIS1O; DIRECTIVE WILL BE IN FUTURE RELEASES OR THATS%P; THE FORMAT WILL REMAIN THE SAME. Q;0DR;*****************************************************************S;IT; DPB FORMAT:SU; +V; WD. 00 -- DIC(169.),DPB SIZE(VARIABLE).T*W; WD. 01 -- SUBFUNCTION CODE (LOW BYTE).+X; WD. 02 -- PARAMETER 1 (BUFFER ADDRESS).*1Y; WD. 03 -- PARAMETER 2 (BUFFER SIZE IN WORDS).*6Z; WD. N -- PARAMETER N (MAX DPB SIZE IS 32. WORDS).[;U \; INPUTS:];C5^; R2=ADDRESS OF SECOND STATUS WORD OF CURRENT TASK.C#_; R3=POINTER TO WD. 1 IN THE DPB.A1`; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK..a; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.b;*7c; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) d;6/e; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.O(f; DIRECTIVE STATUS OF +1 IS RETURNED.!g; C=1 IF DIRECTIVE IS REJECTED.-9h; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF THE TASKE/i; HAS SPECIFIED AN INVALID SUBFUNCTION CODEU!j; OR THE DPB SIZE IS INVALID.D9k; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE USERT"l; BUFFER FAILS ADDRESS CHECKS.4m; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE7n; SUBFUNCTION REQUIRES PRIVILEGE AND THE REQUESTINGAo; TASK IS NOT PRIVILEGED.p;=?q; NOTE: IF A USER BUFFER IS SPECIFIED, THE SERVICE ROUTINE IS ;r; ENTERED WITH R3 POINTING TO THE BUFFER AND R4 POINTINGDs; TO WORD 4 OF THE DPB.t;T;u; IF NO USER BUFFER IS SPECIFIED, THE SERVICE ROUTINE ISN3v; ENTERED WITH R3 POINTING TO WORD 2 OF THE DPB.Cw;Sx;-yz{{ .IF DF D$$PAR ; BM385U{ ; BM385E{$DRGN1:: ; BM385{ ; BM385E!{ .IFF ; DF D$$PAR ; BM385S{ ; BM385Q{$DRGIN:: ; BM385{ ; BM385"{ .ENDC ; DF D$$PAR ; BM385{ ; BM385E0{ MOV (R3)+,R4 ;GET SUBFUNCTION CODE ; BM385-} CMP R4,#$SFHI ;CODE WITHIN RANGE? ;**-1~ BHI 90$ ;IF HI NOF0 ASH #2,R4 ;CONVERT CODE TO DOUBLE WORD INDEX.€ ADD #$SFTBL,R4 ;POINT TO PROPER TABLE ENTRY2� MOV (R4)+,R1 ;GET FLAGS AND MINIMUM BUFFER SIZE&‚ BEQ 90$ ;IF EQ INVALID SUBFUNCTIONƒ„ .IF DF R$$PRO…† .IFF ;R$$PRO ‡+ˆ BPL 10$ ;IF PL NO PRIVILEGE IS REQUIRED2‰ BIT #T3.PRV,T.ST3(R5) ;CURRENT TASK PRIVILEGED?*Š BEQ 80$ ;IF EQ NO, PRIVILEGE VIOLATION‹Œ .IFTF ;R$$PRO� Ž10$: MOV R1,R2 ;COPY DPB SIZE � SWAB 00”èdÚdÝb`TADATADATADATADATADATAR2 ;MOVE IT TO LOW BYTE(� BIC #^C<37>,R2 ;CLEAR IRRELEVANT BITS&‘ CMPB R2,$DICSV+1 ;CORRECT DPB SIZE?’ BNE 90$ ;IF NE NOR.“ MOV (R4),-(SP) ;GET SERVICE ROUTINE ADDRESS#” BIC #177400,R1 ;KEEP BUFFER SIZE&• BEQ 30$ ;IF EQ NO BUFFER SPECIFIED(– MOV (R3)+,R0 ;GET USER BUFFER ADDRESS-— CMP (R3),R1 ;IS USER BUFFER LARGE ENOUGH?˜ BLO 90$ ;IF LO NOR6™ MOV (R3),-(SP) ;SAVE NUMBER OF WORDS IN USER BUFFER:š SUB R1,(SP) ;CALCULATE # OF EXTRA WORDS IN USER BUFFER:› MOV (R3)+,R1 ;GET SIZE OF USER BUFFER FOR ADDRESS CHECK!œ ASL R1 ;CONVERT SIZE TO BYTES� MOV -(R4),R2 ;GET FLAGSž MOV R3,R4 ;COPY DPB ADDRESS3Ÿ MOV R0,R3 ;COPY USER BUFFER ADDR FOR ADDR CHECKC/  BIT #SF.IN,R2 ;IS THIS A READ ONLY FUNCTION?Q¡ BEQ 20$ ;IF EQ YES4¢ CALL $ACHKP ;ADDRESS CHECK BUFFER FOR R/W ACCESS £ BR 25$ ;7¤20$: CALL $ACHRO ;ADDRESS CHECK BUFFER FOR RO ACCESS(+¥ BCS 70$ ;IF CS ADDRESS CHECK HAS FAILEDS(¦ CALL $RELOC ;RELOCATE BUFFER ADDRESS(§ MOV R1,KISAR6 ;MAP TO THE USER BUFFER/¨ MOV R2,R3 ;REDEFINE PARAMETER BLOCK ADDRESSR=©25$: MOV (SP)+,R2 ;GET NUMBER OF EXTRA WORDS IN USER BUFFERP9ª30$: CALLR @(SP)+ ;DISPATCH TO THE APPROPRIATE ROUTINED*«70$: DRSTS D.RS98 ;SET DIRECTIVE STATUS¬­ .IFF ;R$$PROQ®)¯80$: DRSTS D.RS16 ;PRIVILEGE VIOLATIONK°± .IFTF ;R$$PRO²0³90$: ;REF. LABLE FOR ERROR RETURN OF IE.SDP´µ .IFT ;R$$PRO¶3·$SFGAS:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSC3¸$SFUIC:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OST3¹$SFDEF:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSC3º$SFFMK:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSW3»$SFQMC:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OST3¼$SFDEV:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OS 3½$SFSPR:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSS3¾$SFREN:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSO3¿$SFAPR:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSP3À$SFFTK:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OST3Á$SFABO:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSTÂà .IFTF ;R$$PROÄÅ .IF NDF P$$MON.Æ Ç$SFPMN::ÈÉ .ENDC ;P$$MONÊË .IF NDF P$$3XXT5Ì$SFCFG:: ;REF. LABEL TO NOP SUBFUNCTION ON M-PLUS 5Í$SFSSN:: ;REF. LABEL TO NOP SUBFUNCTION ON M-PLUSOÎÏ .ENDC ; DF P$$3XXÐ4Ñ DRSTS D.RS99 ;INVALID SUBFUNCTION CODE OR BUFFERÒÓ .IFF ;R$$PRO ÔÕÖ;+%×; **-SFGAS-GET ASSIGNED DEVICE NAME Ø;UIÙ; THIS SUBFUNCTION SEARCHES THE ASSIGNMENT LIST FOR A SPECIFIED LOGICALMÚ; NAME AND RETURNS THE NAME OF THE PHYSICAL DEVICE TO WHICH IT IS ASSIGNED.Û;NÜ; DPB FORMAT:Ý;N%Þ; WD. 00 -- DIC(169.),DPB SIZE(8.).F/ß; WD. 01 -- SUB FUNCTION CODE (0) (LOW BYTE).T$à; WD. 02 -- OUTPUT BUFFER ADDRESS.,á; WD. 03 -- OUTPUT BUFFER SIZE (IN WORDS)."â; WD. 04 -- LOGICAL DEVICE NAME.$ã; WD. 05 -- LOGICAL DEVICE NUMBER.Fä; WD. 06 -- TI NAME FOR WHICH THIS ASSIGNMENT HOLDS. (0 FOR GLOBAL).å; WD. 07 -- TI DEVICE NUMBER.C<æ; (IF HIGH BIT OF UNIT NUMBER IS SET, GET LOGIN ASSIGN)ç;Rè; BUFFER FORMAT:é;A&ê; WD. 00 -- NAME OF ASSIGNED DEVICE.<ë; WD. 01 -- UNIT NUMBER OF ASSIGNED DEVICE AND FLAGS BYTE.0ì; WD. 02 -- FIRST DEVICE CHARACTERISTICS WORD.1í; WD. 03 -- SECOND DEVICE CHARACTERISTICS WORD.30î; WD. 04 -- THIRD DEVICE CHARACTERISTICS WORD.2ï; WD. 05. -- FOURTH DEVICE CHARACTERISTICS WORD.ð;. ñ; INPUTS:-ò;N,ó; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.1ô; R3=ADDRESS OF THE LOGICAL NAME IN THE BUFFER.F$õ; R4=ADDRESS OF WD. 04 IN THE DPB.1ö; R5=ADDRESS OF THE TCB OF THE REQUESTING TASK.D÷;-7ø; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)Aù;E,ú; C=0 IF DIRECTIVE SUCCESSFULLY COMPLETED.(û; DIRECTIVE STATUS OF +1 IS RETURNED.!ü; C=1 IF DIRECTIVE IS REJECTED.D2ý; DIRECTIVE STATUS OF 'D.RS5' IS RETURNED IF NO7þ; ASSIGNMENT EXISTS FOR THE SPECIFIED LOGICAL NAME..:ÿ; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF SPECIFIED; DEVICE IS NOT A TERMINAL.I;; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF REQUESTING.; TASK IS NOT PRIVILEGED.T;Q;- $SFGAS::0 .IF DF L$$GCL 00”ðdÔd³cÙ´cÚµcÛ¶c�·c›’;EXTENDED LOGICAL NAME SUPPORT @  MOV #GBLMSK,$TONYL ;INITIALIZE SEARCH ONLY TO SYSTEM LOGICALS   .IFTF ;DF L$$GCL. ) MOV R3,-(SP) ;SAVE USER BUFFER ADDRESSC9 CLR R2 ;ASSUME NO TERMINAL SPECIFIED, UCB=0 ;KLN033E" MOV 4(R4),R0 ;GET TERMINAL NAME2 BEQ 10$ ;IF EQ DON'T LOOK FOR TI UCB ;KLN033. MOV 6(R4),R1 ;GET TI DEVICE NUMBER ;**-19 BIC #177400,R1 ;STRIP OFF HIGH BYTE (LOGIN/LOCAL FLAG)5 CALL $CVDVN ;CONVERT DEVICE NAME TO A UCB ADDRESSS# BCS 70$ ;IF CS DEVICE NOT FOUNDO+ BIT #DV.TTY,U.CW1(R2) ;IS IT A TERMINAL?  BEQ 70$ ;IF EQ NO 10$: ;KLN033F3 .IF DF C$$RTK ;REMOTE DEVICE SUPPORT ;KLN033  ;KLN033 : BIT #F5.RTK,$FMSK5 ;REMOTE DEVICE SUPPORT ON? ;KLN033! BEQ 17$ ;IF EQ NO ;KLN033 ; ;KLN033T; FOR REMOTE HOST SYSTEMS, WE DO NOT ALLOW GET ASSIGNED DEVICE FOR A LOCAL ;KLN033R; LOGICAL NAME WHERE THE TI IS NOT OUR OWN. THIS IS BECAUSE THE CPRAME ;KLN033Q; SERVICING THE REQUEST DOES NOT HAVE ACCESS TO ANOTHER AME'S LOGICALS ;KLN033 ; ;KLN0332 TST R2 ;WAS THERE A TI UCB SPECIFIED ;KLN033! BEQ 15$ ;IF EQ NO ;KLN033 / CMP R2,T.UCB(R5) ;IS THIS OUR TI? ;KLN033M! BNE 70$ ;IF NE NO ;KLN033L; ;KLN0335; GIN$ DIRECTIVE MUST BE DONE REMOTELY ;KLN033E; ;KLN033515$: MOV R4,R3 ;PUT ADDRESS OF DPB IN R3 ;KLN033O- SUB #4,R3 ;AND POINT TO WORD 2 ;KLN033S- CLR R2 ;INDICATE NO UCB ADDRESS ;KLN033  ;KLN033 3 JMP $RTINF ;JOIN COMMON CODE IN GLUN ;KLN033  ;KLN033  .ENDC ;C$$RTK ;KLN033; ;KLN033I017$: TST R2 ;WAS TI UCB SPECIFIED? ;KLN033: BEQ 20$ ;IF EQ NO, LOOK FOR GLOBAL ASSIGNMENT ;KLN033 ;KLN033 .IFF ;DF L$$GCL=20$: MOV #$LOGHD,R1 ;GET ADDRESS OF LOGICAL ASSIGNMENT HEADR.30$: MOV (R1),R1 ;GET NEXT ASSIGNMENT BLOCK BEQ 80$ ;IF EQ END OF LIST. TST R0 ;SEARCHING FOR A GLOBAL ASSIGNMENT? BNE 40$ ;IF NE NO & TSTB L.TYPE(R1) ;GLOBAL ASSIGNMENT?  BNE 30$ ;IF NE NO! BR 50$ ;SKIP UCB CHECK."40$: CMP L.UCB(R1),R2 ;TI UCB ADDRESS MATCH?# BNE 30$ ;IF NE NOI.$ TSTB 7(R4) ;LOOKING FOR LOGIN ASSIGNMENT ?% BPL 50$ ;IF PL NOG4& CMPB #-1,L.TYPE(R1) ;IS THIS A LOGIN ASSIGNMENT ?' BNE 30$ ;IF NE NOG-(50$: CMP L.NAM(R1),(R4) ;DEVICE NAME MATCH?) BNE 30$ ;IF NE NOT,* CMPB L.UNIT(R1),2(R4) ;UNIT NUMBER MATCH?+ BNE 30$ ;IF NE NOE(, MOVB 7(R4),R2 ;SAVE LOGIN ASSIGN FLAG/- MOV L.ASG(R1),R4 ;GET ASSIGNMENT UCB ADDRESSM'. TST R0 ;LOOKING FOR GLOBAL ASSIGN ?;&/ BEQ 65$ ;IF EQ YES - USE UCB AS IS.0 TST R2 ;WAS IT A LOGIN ASSIGNMENT LOOKUP ?,1 BPL 65$ ;IF PL NO, USE "RAW" UCB ADDRESS23 .IFT ;DF L$$GCL455 BIT #U2.LOG,U.CW2(R2) ;IS THIS TERMINAL LOGGED ON?B-6 BNE 80$ ;IF NE, NO, THERE ARE NO LOGICALSD&7 MOV R2,R1 ;GET COPY OF UCB ADDRESS38 CALL $GTUSR ;SET UP THE USER HASH TABLE ADDRESSB@9 MOV #USRMSK,$TONYL ;INITIALIZE TO INHIBIT ALL BUT USER TABLES9: MOVB #LB.LOG,R3 ;SET UP THE LOGIN MOD VALUE BY DEFAULTO-; TSTB 7(R4) ;SEE IF THIS IS A LOGIN LOOKUPY6< BMI 25$ ;IF MI, IT IS, KEEP THE INITIALIZED VALUES5=20$: CLR R3 ;ZERO MOD VALUE TO PICK UP ANY LOGICALS(>25$: MOV (R4),R2 ;GET DEVICE MNEMONIC ? MOV 2(R4),R0 ;GET UNIT NUMBER2@ MOV R4,-(SP) ;SAVE THE DPB ADDRESS ACROSS CALLS)A MOV #$LNTSL,-(SP) ;CALL LOOKUP ROUTINES*B CALL $MPDC3 ;IN THIRD DIRECTIVE COMMON.C BCC 30$ ;IF CC, SUCCESSFUL LOOKUP IN TABLE-D TST R3 ;SEE IF THERE REALLY WAS A LOGICAL33E BEQ 80$ ;IF EQ, NO LOGICAL ASSOCIATED WITH NAME4+F MOV (SP)+,R4 ;RESTORE THE BUFFER ADDRESS$6G BR 70$ ;TRANSLATION OCCURRED TO BAD DEVICE OR LOOP+H30$: MOV (SP)+,R4 ;RESTORE ADDRESS TO DPB:I MOV R2,(R4) ;PUT EQUIVALENCE NAME MNEMONIC BACK IN DPB)J MOV R0,2(R4) ;SAME FOR THE UNIT NUMBERP-K MOV $DEVHD,R2 ;GET ADDRESS OF DEVICE TABLEA/L35$: CMP (R4),D.NAM(R2) ;IS THIS THE DEVICE ?EM BEQ 45$ ;YES.N40$: MOV D.LNK(R2),R2 ;NO, POINT TO NEXT DCBO BNE 35$ ;GOT ONE!P BR 7000”ødÚdÝb`TADATADATADATADATADATA$ ;END OF DEVICES, ERRORI$Q45$: MOV 2(R4),R5 ;GET UNIT NUMBER+R CMPB R5,D.UNIT(R2) ;IS UNIT ON THIS DCB?$S BLO 40$ ;NONT CMPB R5,D.UNIT+1(R2) ;MAYBEU BHI 40$ ;NO!!V CLR R3 ;GET FIRST UNIT NUMBERW BISB D.UNIT(R2),R3 ;V*X MOV D.UCB(R2),R1 ;GET FIRST UCB ADDRESS+Y SUB R3,R5 ;COMPUTE RELATIVE UNIT NUMBERHZ BEQ 55$ ;FOUND ITV/[50$: ADD D.UCBL(R2),R1 ;NO, POINT TO NEXT UCBE\ DEC R5 ;FOUND IT YET?S] BNE 50$ ;NO, LOOPR,^55$: MOVB 7(R4),-(SP) ;SAVE THE LOGIN FLAG,_ MOV R1,R4 ;GET A COPY OF THE UCB ADDRESS9` TSTB (SP)+ ;SEE IF THIS WAS A LOGIN ASSIGNMENT LOOKUPT/a BPL 65$ ;IF PL, NO, LEAVE UCB ADDRESS AS ISIbc .ENDC ;DF L$$GCL$d.e60$: CMP U.RED(R4),R4 ;END OF REDIRECT CHAIN f BEQ 65$ ;IF EQ YES, FINISHED&g MOV U.RED(R4),R4 ;POINT TO NEXT UCBh BR 60$ ;AND GO AGAINi65$: ;REFERENCE LABEL0j MOV (SP)+,R3 ;RESTORE THE USER BUFFER ADDRESS6k CALLR $GLINF ;CONTINUE THROUGH GET LUN INFORMATION$l70$: DRSTS D.RS92 ;INVALID DEVICE*m80$: DRSTS D.RS5 ;NO DEVICE IS ASSIGNEDno;+Lp; **-$SFUIC-GET SYSUIC, LIBUIC, CURRENT UIC, PROTECTION UIC, AND LOGIN UICq; Ar; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO RETURN THE SYSTEM UIC,U@s; THE LIBRARY UIC, AND THE TASK'S CURRENT AND PROTECTION UICS,Gt; AND TI LOGIN UIC. IF SPACE IS AVAILABLE, TRANSFER OTHER UIC AND CLI5u; INFORMATION.v;w; DPB FORMAT:Rx;E%y; WD. 00 -- DIC(169.),DPB SIZE(4.).N.z; WD. 01 -- SUBFUNCTION CODE (1) (LOW BYTE).{; WD. 02 -- BUFFER ADDRESS.%|; WD. 03 -- BUFFER SIZE (IN WORDS).N};~; BUFFER FORMAT:; €; WD. 00 -- SYSTEM UIC.,�; WD. 01 -- LIBRARY UIC.-‚; WD. 02 -- H.DUIC FOR THE REQUESTING TASK.E-ƒ; WD. 03 -- H.CUIC FOR THE REQUESTING TASK.I„; WD. 04 -- LOGIN UIC.…;R †; INPUTS:,‡; ,ˆ; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.(‰; R3=ADDRESS OF WD. 00. OF THE BUFFER.*Š; R5=TCB ADDRESS OF THE REQUESTING TASK.‹;6 Œ; OUTPUTS:�;?Ž; THE USER'S BUFFER IS FILLED WITH THE REQUESTED INFORMATION.F�;D�;-‘:’$SFUIC::MOV $SYUIC,(R3)+ ;MOVE SYSTEM UIC TO USER BUFFER%“ MOV $LBUIC,(R3)+ ;MOVE LIBRARY UIC”• .IF DF X$$HDR–%— CLR -(SP) ;RESERVE SPACE ON STACK ˜ CLR -(SP) ;30™ MOV KISAR6,-(SP) ;SAVE MAPPING TO USER BUFFER2š MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER4› MOV $SAHPT,R4 ;GET HEADER ADDRESS OF CURRENT TASK)œ MOV H.DUIC(R4),2(SP) ;SAVE DEFAULT UIC )� MOV H.CUIC(R4),4(SP) ;SAVE CURRENT UIC$ž MOV (SP)+,KISAR6 ;RESTORE MAPPING$Ÿ MOV (SP)+,(R3)+ ;COPY CURRENT UIC5  MOV (SP)+,(R3)+ ;AND PROTECTION UIC TO USER BUFFERO¡¢ .IFF£4¤ MOV $HEADR,R4 ;GET HEADER ADDRESS OF CURRENT TASK9¥ MOV H.DUIC(R4),(R3)+ ;MOVE CURRENT UIC TO USER BUFFER)<¦ MOV H.CUIC(R4),(R3)+ ;MOVE PROTECTION UIC TO USER BUFFER§¨ .ENDC ;X$$HDR©ª« MOV T.UCB(R5),R1 ;GET TI UCB;¬­® .IF DF A$$CNT¯°± .IF DF D$$PAR²-³ MOV KISAR6,-(SP) ;SAVE USER BUFFER MAPPING .´ MOV T.ACN(R5),R0 ;POINT TO ACCOUNTING BLOCK!µ BEQ 5$ ;IF EQ THERE ISN'T ONEC¶3$: MOV R0,KISAR6 ;MAP IT+-· MOV @#B.PNT+140000,R0 ;POINT TO NEXT BLOCKF-¸ CMPB #BT.UAB,@#B.TYP+140000 ;IS THIS A UAB ¹ BNE 3$ ;IF NE NO1º MOV @#B.UUIC+140000,R0 ;GET LOGIN UIC FROM UAB » BR 6$ ;(&¼5$: MOV U.LUIC(R1),R0 ;GET LOGIN UIC3½6$: MOV (SP)+,KISAR6 ;RESTORE USER BUFFER MAPPING)0¾ MOV R0,(R3)+ ;RETURN LOGIN UIC TO USER BUFFER¿À .IFF ;D$$PARÁ2 MOV T.ACN(R5),R0 ;LOCATE FIRST ACCOUNTING BLOCK#à BEQ 10$ ;IF EQ, THERE ISN'T ONEO)Ä7$: MOV R0,KISAR5 ;MAP ACCOUNTING BLOCK$-Å MOV @#B.PNT+120000,R0 ;POINT TO NEXT BLOCK,-Æ CMPB #BT.UAB,@#B.TYP+120000 ;IS THIS A UABYÇ BNE 7$ ;IF NE NO9È MOV @#B.UUIC+120000,(R3)+ ;GET LOGIN UIC FROM THE UABGÉ BR 20$ ;GO MOVE MORE DATA3Ê10$: MOV U.LUIC(R1),(R3)+ ;GET LOGIN UIC FROM UCB)ËÌÍ .ENDC ;D$$PARÎÏÐÑ .IFF ; DF A$$CNTTÒ/Ó MOV U.LUIC(R1),(R3)+ ;GET LOGIN UIC FROM UCBÔÕ .ENDC ; DF A$$CNTÖרÙÚ;BGÛ; IN ORDER TO OBTAIN THE REMAINING DATA, THE USER MUST HAVE ALLOCATEDUÜ; AT LEAST A 32. WORD BUFFER.000”eÔd³cÙ´cÚµcÛ¶c�·c›’Ý;;BÞ20$: SUB #<32.-5.>,R2 ;IS THERE ROOM FOR THE NEXT BLOCK OF DATA?ß BMI 110$ ;IF MI NO0à MOV U.UIC(R1),(R3)+ ;PUT CURRENT TERMINAL UIC1á MOV U.MUP(R1),R1 ;PICK UP INDEX TO COB POINTERV)â BIC #^C,R1 ;AND ONLY THE INDEX(ã MOV $CPTBL(R1),R1 ;GET POINTER TO CPB'ä MOV (R1),R2 ;GET TCB ADDRESS OF CLIR0å MOV @#KISAR6,-(SP) ;SAVE CURRENT APR6 MAPPING1æ BIT #CP.POL,C.PSTS(R1) ;TCB IN SECONDARY POOL?Tç BEQ 40$ ;IF EQ NOUè MOV R2,KISAR6 ;MAP TCB"é MOV #140000,R2 ;AND POINT TO IT)ê40$: MOV T.NAM(R2),R1 ;GET CLI TASKNAMERë MOV T.NAM+2(R2),R2 ;+ì MOV (SP)+,@#KISAR6 ;RESTORE APR6 MAPPING+7í MOV R1,(R3)+ ;AND COPY CLI TASKNAME INTO USER BUFFERIî MOV R2,(R3)+ ;V'ï MOV #$SYSNM,R1 ;POINT TO SYSTEM NAMEE8ð MOV (R1)+,(R3)+ ;SHUFFLE THE 6-CHARACTER NAME TO USERñ MOV (R1)+,(R3)+ ;...Lò MOV (R1)+,(R3)+ ;... +ó MOV $NTUIC,(R3)+ ;SUPPLY THE NETWORK UICP6ô MOV $SYSIZ,(R3)+ ;AND SYSTEM SIZE IN 32 WORD BLOCKSõö .IF DF A$$CNT÷#ø MOV #9.,-(SP) ;MAX LENGTH OF DDST-ù MOV KISAR6,-(SP) ;SAVE USER BUFFER MAPPING.ú MOV T.ACN(R5),R1 ;POINT TO ACCOUNTING BLOCK"û BEQ 70$ ;IF EQ THERE ISN'T ONEü50$: MOV R1,KISAR6 ;MAP IT-ý MOV @#B.PNT+140000,R1 ;POINT TO NEXT BLOCKM-þ CMPB #BT.UAB,@#B.TYP+140000 ;IS THIS A UAB;ÿ BNE 50$ ;IF NE NO 5 MOVB @#B.LDS+140000,R0 ;GET LENGTH OF DDS FROM UAB3 BEQ 70$ ;IF EQ, NO DDS' SUB R0,2(SP) ;SUBTRACT LENGTH OF DDS,. MOV #B.LDS+120000,R2 ;ADDRESS OF DDS IN UAB' MOV R3,R4 ;DISPLACEMENT INTO BUFFER ) MOV (SP),R3 ;USER BUFFER MAPPING BIASS INC R0 ;COPY SIZE BYTE ALSOR" MOV KISAR6,R1 ;RESTORE UAB BIAS9 CALL $BLXIO ;COPY DDS FROM ACCOUNTING BLOCK TO BUFFER $  MOV (SP)+,KISAR6 ;RESTORE MAPPING  BR 80$ ;( 70$: MOV (SP)+,KISAR6 ;RESTORE MAPPING,  CLRB (R3)+ ;RETURN LENGTH TO USER BUFFER(  MOV R3,R4 ;MOVE BUFFER POINTER TO R4,80$: TST (SP) ;IS THERE NEED TO ZERO FILL$ BEQ 100$ ;NO, DDS WAS MAX LENGTH390$: CLRB (R4)+ ;ZERO OUT REMAINING BUFFER SPACEC' DEC (SP) ;LENGTH REMAINING ON STACK  BNE 90$ ;LOOP UNTIL DONE100$: TST (SP)+ ;CLEAN STACKK .ENDC ;A$$CNTI110$: RETURN;+"; **-$SFDEF-SET TASK DEFAULT UIC;(F; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SET THE DEFAULT UIC FOR THEI; REQUESTING TASK. IF THE TASK IS NON-PRIVILEGED, ONLY THE DEFAULT UICMK; IS CHANGED. IF THE TASK IS PRIVILEGED, BOTH THE DEAFULT AND PROTECTIONQ; UICS ARE MODIFIED. ;H!; DPB FORMAT:)";E%#; WD. 00 -- DIC(169.),DPB SIZE(3.).(.$; WD. 01 -- SUBFUNCTION CODE (2) (LOW BYTE).%; WD. 02 -- DEFAULT UIC.&; '; INPUTS:K(;)); R3=ADDRESS OF DEFAULT UIC IN THE DPB.'*; R5=TCB ADDRESS OF THE CURRENT TASK.+; ,; OUTPUTS:-;I3.; THE DEAFULT UIC IS SET FOR THE REQUESTING TASK./;U0;-172$SFDEF::TSTB T.GGF(R5) ;IS THER A GGF CONTEXT ACTIVE?3 BEQ 5$ ;IF EQ, NO %4 DRSTS D.RS17 ;RETURN IE.RSU ERRORD%55$: MOV (R3),R1 ;GET SPECIFIED UIC"6 BEQ 100$ ;IF EQ UIC IS INVALID78 .IF DF X$$HDR9%: MOV $SAHDB,KISAR6 ;MAP TASK HEADER)); MOV $SAHPT,R2 ;GET TASK HEADER ADDRESS<= .IFF ; DF X$$HDR>)? MOV $HEADR,R2 ;GET TASK HEADER ADDRESS5@A .ENDC ; DF X$$HDRBC%D MOV R1,H.DUIC(R2) ;SET DEFAULT UICF*E BIT #T3.PRV,T.ST3(R5) ;TASK PRIVILEGED?F BEQ 10$ ;IF EQ NO:(G MOV R1,H.CUIC(R2) ;SET PROTECTION UICH10$: RETURN ;F"I100$: DRSTS D.RS91 ;INVALID UICJ;+ K; **-$SFSPR-SET TASK PRIVILEGEL;EEM; THIS DIRECTIVE REQUEST THE SET/CLEAR OF THE TASK PRIVILEGE BIT INEN; THE TCB. THE PRIVILEGE BIT MAY BE CLEARED IN ANY STATE BUT MAY BE *O; SET ONLY IF IT WAS PREVIOUSLY CLEARED.P;EQ; DPB FORMAT:HR; $S; WD. 00 -- DIC(169.),DPB SIZE(3.)"T; WD. 01 -- SUBFUNCTION CODE (7)(U; WD. 02 -- NEW PRIVILEGE FLAG (BIT 0)V;E W; INPUT:X; &Y; R3=ADDRESS OF PRIVILGE FLAG IN DPB"Z; R5=TCB ADDRESS OF CURRENT TASK[; \; OUTPUT: ];LE^; THE T3.PRV BIT IS SET OR CLEARED. THE PREVIOUS STATE OF T3.PRV ISE_; SAVED IN T4.PRV.O`;-a1b$SFSPR::MOV T.ST3(R5),R2 ;GET 00”eÚdÝb`TADATADATADATADATADATACURRENT PRIVILEGEM0c BIC #^C,R2 ;AND ISOLATE PRIVILEGE BIT+d BEQ 30$ ;IF EQ NOT CURRENTLY PRIVILEGEDP0e BIS #T4.PRV,T.ST4(R5) ;COPY PRIVILEGED STATE+f BEQ 30$ ;IF EQ NOT CURRENTLY PRIVILEGED %g TST (R3) ;SET OR CLEAR PRIVILEGE?)h BNE 40$ ;IF NE SETTING PRIVILEGED BITV$i BIC R2,T.ST3(R5) ;CLEAR PRIVILEGE j RETURN ;k)l30$: TST (R3) ;SET OR CLEAR PRIVILEGE? +m BEQ 50$ ;IF EQ CLEARING. THIS IS A NOPI1n40$: BIT #T4.PRV,T.ST4(R5) ;WAS IT PRIVILEGED? 1o BEQ 60$ ;IF EQ NO, CAN'T MAKE SELF PRIVILEGED.-p BIS #T3.PRV,T.ST3(R5) ;MAKE IT PRIVILEGED q50$: RETURN ;Y&r60$: DRSTS D.RS16 ; PRIVILEGE ERRORst;+u; **-$SFREN-RENAME TASKIv;NFw; THIS DIRECTIVE RENAMES THE ISSUING TASK TO THE SUPPLIED TASK NAME.x; y; DPB FORMAT:Iz;E${; WD. 00 -- DIC(169.),DPB SIZE(3.)"|; WD. 01 -- SUBFUNCTION CODE (7)}; WD. 02-03 -- NEW TASK NAME~; ; INPUT:€;C&�; R3=ADDRESS OF NEW TASK NAME IN DPB"‚; R5=TCB ADDRESS OF CURRENT TASKƒ;B „; OUTPUT:Q…;C@†; THE NEW NAME IS CHECKED FOR UNIQUENESS AND IF NOT FOUND, THE,‡; ISSUING TASK IS RENAMED TO THE NEW NAME.ˆ;-‰CŠ$SFREN::CMP #^R...,(R3) ;DON'T ALLOW RENAME TO A DOT-DOT-DOT FORMR‹ BEQ 10$ ;IF EQ ILLEGAL NAMEO<Œ CALL $SRPRO ;SEARCH PROTOTYPE TCB AND TCB LISTS FOR NAME$� BCC 10$ ;IF CC NAME FOUND, ERROR8Ž MOV (R3),T.NAM+0(R5);ESTABLISH NEW NAME FOR THIS TASK� MOV 2(R3),T.NAM+2(R5) ;... � RETURNO7‘10$: DRSTS D.RS17 ;NAME ALREADY IN USE(IE.RSU ERROR)K’“”;+J•; **-$SFFMK-GET FEATURE MASK WORDS, BASE LEVEL, VERSION, AND SYSTEM TYPE–;H—; THIS DIRECTIVE RETURNS THE FEATURE MASK WORDS TO THE REUESTING TASK.˜; ™; DPB FORMAT:Mš;A%›; WD. 00 -- DIC(169.),DPB SIZE(4.).I.œ; WD. 01 -- SUBFUNCTION CODE (3) (LOW BYTE).�; WD. 02 -- BUFFER ADDRESS.B#ž; WD. 03 -- BUFFER SIZE IN WORDS.MŸ;3 ; BUFFER FORMAT:¡;E&¢; WD. 00 -- FIRST FEATURE MASK WORD.'£; WD. 01 -- SECOND FEATURE MASK WORD.R&¤; WD. 02 -- THIRD FEATURE MASK WORD.'¥; WD. 03 -- FOURTH FEATURE MASK WORD. )¦; WD. 04 -- HARDWARE FEATURE MASK WORD. %§; WD. 05 - 06 -- SYSTEM BASE LEVEL.T"¨; WD. 07 - 10 -- SYSTEM VERSION.:©; WD. 11 - 16 -- SYSTEM TYPE (RETURNED ONLY IF BUFFER IS#ª; AT LEAST 15. WORDS LONG)F«;O ¬; INPUTS:O­;E,®; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.(¯; R3=ADDRESS OF WD. 00. OF THE BUFFER.'°; R5=TCB ADDRESS OF THE CURRENT TASK.T±;A ²; OUTPUTS:³;1.´; THE INFORMATION IS RETURNED TO THE CALLER.µ;E¶;-·5¸$SFFMK::MOV #$FMASK,R0 ;GET ADDRESS OF FEATURE MASKD0¹ MOV (R0)+,(R3)+ ;MOVE FIRST FEATURE MASK WORD1º MOV (R0)+,(R3)+ ;MOVE SECOND FEATURE MASK WORDE0» MOV (R0)+,(R3)+ ;MOVE THIRD FEATURE MASK WORD1¼ MOV (R0)+,(R3)+ ;MOVE FOURTH FEATURE MASK WORD 4½ MOV $HFMSK,(R3)+ ;MOVE HARDWARE FEATURE MASK WORD3¾ MOV $SYSID,(R3)+ ;MOVE BASE LEVEL TO USER BUFFERF¿ MOV $SYSID+2,(R3)+ ;A7À MOV $VERSN,(R3)+ ;MOVE SYSTEM VERSION TO USER BUFFERÁ MOV $VERSN+2,(R3)+ ;RÂ;ORÃ; SYSTEM TYPE IS RETURNED ONLY IF THERE ARE AT LEAST 6 EXTRA WORDS IN THE BUFFERÄ;M&Å SUB #6,R2 ;AT LEAST 6 EXTRA WORDS?Æ BMI 10$ ;NO, RETURN NOWE)Ç MOV #$SYTYP,R0 ;ADDRESS OF SYSTEM TYPE3È MOV #6,R1 ;WORD COUNT 6É5$: MOV (R0)+,(R3)+ ;MOVE SYSTEM TYPE TO USER BUFFERÊ SOB R1,5$ ;ALL SIX BYTESË10$: RETURN ; ÌÍÎ;+$Ï; **-$SFQMC-QUEUE MCR COMMAND LINEÐ;FFÑ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A COMMAND LINE TO THE$Ò; TASK'S COMMAND LINE INTERPRETER.Ó;OÔ; DPB FORMAT:Õ;T%Ö; WD. 00 -- DIC(169.),DPB SIZE(4.).A(×; WD. 01 -- CODE FOR SFQMC (LOW BYTE).Ø; WD. 02 -- BUFFER ADDRESS.I%Ù; WD. 03 -- BUFFER SIZE (IN WORDS).RÚ;DÛ; BUFFER FORMAT:Ü;M-Ý; WD. 00 THRU N -- COMMAND LINE CHARACTERS.MÞ;Y ß; INPUTS:Uà;U,á; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.%â; R3=ADDRESS OF USER BUFFER WD. 00.U#ã; R5=TCB ADDRESS OF CURRENT TASK.Dä;I å; OUTPUTS:æ;S0ç; C=0 IF THE DIRECTIVE SUCCESSFULLY COMPLETED.(è; DIRECTIVE STATUS OF +1 IS RETURNED.!é; C=1 IF DIRECTIVE IS REJECTED.,500”eÔd³cÙ´cÚµcÛ¶c�·c›’ê; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF THERE..ë; IS INSUFFICIENT DYNAMIC MEMORY AVAILABLE.ì;Rí;-î ï$SFQMC::ðñò .IF DF V$$TRMó ô MOV T.UCB(R5),R1 ;GET TI: UCBõ MOV U.DCB(R1),R0 ;GET DCB0ö CMP D.NAM(R0),#"VT ;IS TI A VIRTUAL TERMINAL?÷ BNE 5$ ;IF NE NO0ø TST U.PTCB(R1) ;IS VT MARKED FOR ELIMINATION?ù BEQ 90$ ;IF EQ YESúû .ENDCüý9þ5$: MOV #M$$CRB,R1 ;GET SIZE OF MCR COMMAND LINE BUFFERA"ÿ CALL $ALOCB ;ALLOCATE A BUFFER& BCS 100$ ;IF CS ALLOCATION FAILURE" MOV R0,R1 ;COPY BUFFER ADDRESS- TST (R0)+ ;POINT TO UCB ADDRESS IN BUFFERL* MOV T.UCB(R5),(R0)+ ;SET TI UCB ADDRESS# MOV #M$$CRB-4,R2 ;SET LOOP COUNT 310$: MOVB (R3)+,(R0) ;MOVE COMMAND TO POOL BUFFERN" CMPB (R0),#15 ;CARRIAGE RETURN? BEQ 50$ ;IF EQ YES CMPB (R0)+,#33 ;ESCAPE?  BEQ 50$ ;IF EQ YES3  SOB R2,10$ ;CONTINUE MOVING COMMAND TO THE POOLO2  MOVB #33,-(R0) ;TERMINATE BUFFER WITH AN ESCAPE7 50$: CALLR $QMCRL ;QUEUE THE COMMAND LINE TO THE CLIL= 90$: DRSTS D.RS92 ;VIRTUAL TERMINAL MARKED FOR ELIMINATION0(100$: DRSTS D.RS1 ;ALLOCATION FAILURE;+$; **-$SFUAB-GET USER ACCOUNT BLOCK;BA; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO MOVE THE CONTENTS OF AL(; USER ACCOUNT BLOCK TO A USER BUFFER.;; DPB FORMAT:Y;$; WD. 00 -- DIC(169.),DPB SIZE(6.).; WD. 01 -- SUBFUNCTION CODE (5) (LOW BYTE).; WD. 02 -- BUFFER ADDRESS.(%; WD. 03 -- BUFFER SIZE (IN WORDS).0; WD. 04 -- TERMINAL NAME (0 FOR CALLER'S TI).; WD. 05 -- TERMINAL NUMBER.;E ; INPUTS:  ;L,!; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.%"; R3=ADDRESS OF USER BUFFER WD. 00.R%#; R4=POINTER TO WORD 04 OF THE DPB.E'$; R5=TCB ADDRESS OF THE CURRENT TASK.S%;L &; OUTPUTS:';B0(; C=0 IF THE DIRECTIVE SUCCESSFULLY COMPLETED.(); DIRECTIVE STATUS OF +1 IS RETURNED.%*; C=1 IF THE DIRECTIVE IS REJECTED. 0+; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF0,; A NON-PRIVILEGED USER SPECIFIES A TERMINAL.0-; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF..; THE SPECIFIED DEVICE IS NOT A TERMINAL OR'/; IF THERE IS NO UAB FOR THE DEVICE.30;E1;-2345 .IF DF A$$CNT697$SFUAB::MOV T.UCB(R5),R2 ;ASSUME TERMINAL NOT SPECIFIEDN*8 MOV T.ST3(R5),R1 ;GET THIRD STATUS WORD'9 MOV R3,R5 ;COPY USER BUFFER ADDRESS/: MOV (R4)+,R0 ;GET TERMINAL NAME FROM THE DPB ; BEQ 10$ ;IF EQ NOT SPECIFIED$< BIT #T3.PRV,R1 ;TASK PRIVILEGED?= BEQ 80$ ;IF EQ NOI$> MOV (R4),R1 ;GET TERMINAL NUMBER ? CALL $CVDVN ;GET UCB ADDRESS#@ BCS 90$ ;IF CS DEVICE NOT FOUNDC/A BIT #DV.TTY,U.CW1(R2) ;IS DEVICE A TERMINAL?OB BEQ 90$ ;IF EQ NO$C CMP $COPT,R2 ;IS UCB EQUAL TO CO?D BNE 10$ ;IF NE NO,EF .IF DF D$$PARG,H MOV $SYUAB,R1 ;PICK UP BIAS TO SYSTEM UAB I BR 15$ ;,J10$: MOV U.UAB(R2),R1 ;PICK UP BIAS TO UAB&K15$: BEQ 90$ ;IF EQ THERE IS NO UAB-L MOV #B.ULEN,R0 ;SET COUNT OF WORDS TO MOVEV-M MOV #120000,R2 ;DISPLACEMENT (APR5) TO UAB)N MOV KISAR6,R3 ;GET USER BUFFER MAPPINGL5O MOV R5,R4 ;GET DISPLACEMENT TO USER BUFFER (APR6)O(P CALL $BLXIO ;MOVE UAB TO USER BUFFERQR .IFF ;D$$PARBS+T MOV $SYUAB,KISAR5 ;MAP TO THE SYSTEM UAB U BR 15$ ;6V10$: MOV U.UAB(R2),KISAR5 ;MAP THE UAB THROUGH APR 6&W15$: BEQ 90$ ;IF EQ THERE IS NO UAB/X MOV #B.ULEN/2,R0 ;SET COUNT OF WORDS TO MOVEU%Y MOV #120000,R1 ;SET SOURCE ADDRESSU/Z20$: MOV (R1)+,(R5)+ ;COPY UAB TO USER BUFFERV[ SOB R0,20$ ;LOOP UNTIL DONE \] .ENDC ;D$$PAR^ _ RETURN ;R)`80$: DRSTS D.RS16 ;PRIVILEGE VIOLATIONC.a90$: DRSTS D.RS92 ;INVALID DEVICE SPECIFIEDbc .ENDC ;A$$CNTdef;+$g; **-$SFDEV-GET DEVICE INFORMATIONh;Ti;S-j; THE GET DEVICE INFORMATION GIN DIRECTIVE:Sk;M?l; THIS GIN SUBFUNCTION RETURNS INFORMATION ABOUT A PARTICULAR;m; DEVICE. THE DEVICE ON WHICH INFORMATION IS RETURNED, IS0Cn; DETERMINED BY FIRST PERFORMING A LOGICAL ASSIGNMENT IF REQUIREDB?o; AND THE FOLLOWING ANY REDIRECTS. DEVICE ASSIGNMENTS WILL BE?p; CHECKED IF THE HIGH BIT IN THE FLAGS BYTE IS C00”eÚdÝb`TADATADATADATADATADATALEAR, ELSE NO0q; CHECK IS MADE.r; ?s; ONLY THE FIRST WORD OF THE BUFFER IS REQUIRED TO BE PRESENTE<t; (IE: A BUFFER SIZE OF 1 WORD). ADDITIONAL INFORMATION IS9u; RETURNED ONLY IF THERE IS ROOM IN THE BUFFER AND THATRv; INFORMATION IS AVAILABLE.Aw; x; INPUTS: y;E-z; R2 = EXTRA WDS. AVAILABLE IN USER BUFFERE7{; R3 = POINTER TO USER BUFFER (MAPPED THROUGH APR 6)E$|; R4 = POINTER TO "G.IDNM" IN DPB$}; R5 = CURRENT TASK'S TCB ADDRESS~; ;E€; �; DPB FORMAT:B‚;SCƒ; +-----------------------------+-------------------------------+F„; | DPBLEN=6. | DIC=169. |C…; +-----------------------------+-------------------------------+#†; | GIN SUBFUNCTION CODE (6) | C‡; +-------------------------------------------------------------+Sˆ; | BUFFER ADDRESS |.C‰; +-----------------------------+-------------------------------+T Š; | BUFFER SIZE (WORDS!!) |C‹; +-----------------------------+-------------------------------+Œ; | ASCII DEVICE NAME |C�; +-----------------------------+-------------------------------+$Ž; | FLAGS | DEVICE UNIT NUMBER |C�; +-----------------------------+-------------------------------+ �;U‘;-’“;(%”; DPB OFFSETS AND FLAG DEFINITIONS:-•;-–5–G.INSF=2 ; LOCATION OF SUBFUNCTION CODE ;edp040.'—G.IDNM=10 ;TWO BYTE ASCII DEVICE NAME-%˜G.IDUN=12 ;LOGICAL UNIT NUMBER BYTEU™G.IDFG=13 ;FLAGS BYTESš›;œGI.NAS=200 ;FLAG INDICATING NOT TO FOLLOW ANY ASSIGNMENTS�ž;IŸ;I ; USER BUFFER FORMAT:-¡;-¢;-E£; +-------------------------------+-------------------------------+IE¤; | U | A | A | C | U | U | W | U | O | U | U | U | U | A | A | W |-E¥; | N | T | L | O | S | S | A | N | F | S | S | S | S | T | L | A |E¦; | L | T | L | N | . | . | S | I | F | . | . | . | . | T | L | S |DE§; | O | C | O | T | U | P | | T | L | M | F | M | L | A | O | |TE¨; | A | H | C | R | M | U | R | | I | N | O | D | A | C | C | A | E©; | D | 2 | 2 | | D | B | E | O | N | T | R | M | B | H | A | S |Eª; | E | U | U | O | | | D | F | E | | | | | E | T | N |-E«; | D | S | S | F | | | C | L | | | | | | D | E | D | E¬; | | | | L | | | T | | | | | | | | D | | E­; +-------------------------------+-------------------------------+ ®; | |¯; | U.CW1 |°; | |E±; +-------------------------------+-------------------------------+ ²; | |³; | U.PRM |´; | |Eµ; +---------------------------------------------------------------+ ¶; | |·; | U.PRM+2 |¸; | |E¹; +---------------------------------------------------------------+ º; | |»; | ASCII DEVICE NAME |-¼; | |E½; +-------------------------------+-------------------------------+ ¾; | | | 4¿; | L.TYPE if "WAS ASND" | DEVICE LOGICAL UNIT |0À; | L.NTBL - EXTENDED LOG | NUMBER |EÁ; +---------------------------------------------------------------+-Â; | |5Ã; |--- ATTACHEE'S RAD50 TASKNAME ---|RÄ; | ( IF ATTACHED ) |EÅ; +---------------------------------------------------------------+3Æ; | ASCII TERMINAL DEVICE NAME OF ALLOCATOR | (Ç; |--- ( IF ALLOCATED ) ---|.È; | LOGICAL UNIT NUMBER OF ALLOCATOR |EÉ; +---------------------------------------------------------------+Ê; | |'Ë; |--- RAD50 ACP NAME ---|-Ì; | ( IF MOUNTED ) |-EÍ; +---------------------------------------------------------------+ Î; | | | #Ï; |--- -+- ---| Ð; | | |-#Ñ; |--- -+- ---|-Ò; | | |#Ó; |--- -+- ---|LÔ; | VOLUME LABEL |L#Õ; |--- -+- ---|CÖ; | | |L#×; |--- -+- ---|-Ø; | | |-EÙ; +---------------------------------------------------------------+ Ú; Û;-ÜÝ; 'Þ; OFFSET AND S00” eÔd³cÙ´cÚµcÛ¶c�·c›’TATUS WORD DEFINITIONS:-ß;-à1áG.IDEV=0 ;GENERAL DEVICE STATUS WORD (REQUIRED) 2â ;NOTE THAT REQUIRED WORDS ARE NOT REFLECTED IN6ã ;THE "EXTRA WORD COUNT" PASSED TO THIS SUBFUNCTIONä ;BY DRGIN.%åG.ICW1=2 ;U.CW1 FROM DEVICE'S UCB-%æG.IPR1=4 ;U.PRM FROM DEVICE'S UCB %çG.IPR2=6 ;U.PRM+2 FROM DEVICE'S UCB 'èG.IDNM=10 ;RESOLVED ASCII DEVICE NAME (éG.IUNM=12 ;RESOLVED DEVICE UNIT NUMBER0êG.ILTP=13 ;TYPE OF LOGICAL ASSIGNMENT FOLLOWED;ëG.IATT=14 ;RAD50 TASK NAME OF ATTACHER IF DEVICE ATTACHEDFAìG.IALL=20 ;ASCII TERMINAL NAME OF ALLOCATOR IF DEVICE ALLOCATEDR*íG.IACP=24 ;NAME OF ACP IF DEVICE MOUNTED4îG.IVOL=30 ;VOLUME NAME IF NOT MOUNTED AS ANSI TAPE+ïG.IVID=G.IVOL ;VOLUME SET ID IF ANSI TAPE.)ðG.ITLB=G.IVID+6 ;VOLUME ID IF ANSI TAPE %ñG.IEND=G.IVOL+14;END OF USER BUFFER+òó;V$ô; 'G.IDEV' STATUS WORD DEFINITION:õ;Iö<÷GI.ASN=000001 ;A LOGICAL ASSIGNMENT WAS FOLLOWED (1=YES)+øGI.ALL=000002 ;DEVICE ALLOCATED (1=YES)1*ùGI.ATT=000004 ;DEVICE ATTACHED (1=YES)0úGI.LAB=000010 ;UNIT HAS LABELED TAPE (1=YES)*ûGI.MDM=000020 ;(US.MDM) UNIT IS MARKED$ü ; FOR DISMOUNT (1=YES)6ýGI.FOR=000040 ;(US.FOR) UNIT IS MOUNTED AS FOREIGNþ ; VOLUME (1=YES)3ÿGI.MNT=000100 ;(US.MNT) UNIT IS MOUNTED (0=YES)G-GI.OFL=000200 ;UNIT OR CONTROLLER OFFLINEI0GI.UOF=000400 ;(US.OFL) UNIT OFFLINE (1=YES)GI.RED=001000L9GI.PUB=002000 ;(US.PUB) UNIT IS PUBLIC DEVICE (1=YES) -GI.UMD=004000 ;(US.UMD) UNIT ATTACHED FORT# ; DIAGNOSTICS (1=YES)I&GI.COF=010000 ;DEVICE'S CONTROLLER ; WAS OFFLINE (1=YES).GI.ALU=020000 ;DEVICE WAS ALLOCATED BY THE  ; ISSUER'S TI: (1=YES)8 GI.ATU=040000 ;DEVICE WAS ATTACHED BY ISSUER (1=YES)5 GI.UNL=100000 ;DEVICE'S DRIVER NOT LOADED (1=YES)0  ; .; DEFINE UCB AND MAGTAPE DEFINITIONS LOCALLY;N .MCALL MTADF$,UCBDF$R+ MTADF$ ;DEFINE MAGTAPE DATA STRUCTURESI& UCBDF$ ;DEFINE UCB DATA STRUCTURE;(:; SINCE MANY OF THE STATUS BITS ARE DIRECTLY COPIED FROM=; U.STS AND U.ST2 OF THE UCB, WE MUST ASSUME THE FOLLOWING:L;1 ASSUME GI.MDM,US.MDM  ASSUME GI.FOR,US.FORT ASSUME GI.MNT,US.MNT: ASSUME GI.UOF, ASSUME GI.PUB, ASSUME GI.UMD,;R=; THE FOLLOWING BITS IN THE STATUS WORD ARE NOT COPIED FROMN@; U.STS AND U.ST2 OF THE DEVICE'S UCB. THEREFORE THE FOLLOWING2 ; BIT MASK IS USED TO CLEAR OUT THE UNUSED BITS.!;S"G#CLRMSK=GI.UNL!GI.ATU!GI.ALU!GI.RED!GI.OFL!GI.ATT!GI.ALL!GI.ASN!GI.LAB$%&;.:'; THE FOLLOWING SECTION OF THIS GIN FUNCTION ATTEMPTS=(; TO LOCATE THE CORRECT UCB ADDRESS OF THE DEVICE SPECIFIEDU;); IN THE DPB. INITIALLY, A SEARCH IS MADE TO DETERMINE IFP;*; A LOGICAL ASSIGNMENT IS IN EFFECT FOR THE ISSUING TASK.WA+; THE LOGICAL ASSIGNMENT MAY BE SYSTEM WIDE (GLOBAL), LOGIN, ORTC,; LOCAL TO THE TI: OF THE TASK AS SPECIFIED BY THE "L.TYPE" FIELDT@-; IN THE LOGICAL ASSIGNMENT BLOCK. IF THE TASK HAS THE "SLAVE"@.; ATTRIBUTE OR IF THE "GI.NAS" FLAG HAS BEEN SET, THEN LOGICAL$/; ASSIGNMENTS WILL NOT BE CHECKED.0;OK0; THIS CODE TO FIND THE UCB OF THE SPECIFIED DEVICE IS SHARED BY ;edp040=0; THE SON OF GET DEVICE INFORMATION SUBFUNCTION. ;edp040 0; ;edp040 1$SFDEV::2&3 MOV R2,-(SP) ;SAVE EXTRA WORD COUNT/4 CLR -(SP) ;INITIALIZE SCRATCH WORD IN WHICH)5 ;THE 'GI.RED' AND 'GI.ASN' IS SAVED 06 CLR $TEMP0 ;INITIALIZE SCRATCH WORD IN WHICH7 ;WE WILL SAVE L.TYPE*8 MOV R3,R1 ;COPY POINTER TO USER BUFFER(910$: CLR (R1)+ ;CLEAR OUT USER BUFFER': DEC R2 ; NOTE THAT USER BUFFER SIZEH$; BPL 10$ ; IS EXTRA WD. COUNT + 13< MOV (R4)+,R1 ;GET DEVICE NAME (TWO ASCII CHARS.)D1= MOV (R4),R0 ;GET UNIT NUMBER (LOW ORDER BYTE) '> ;AND FLAGS BYTE (HIGH ORDER BYTE)(?<@ ASSUME GI.NAS, 200 ;ASSUME THAT THE "INHIBIT ASSIGNMENTS"A ;FLAG IS THE SIGN BITD,B ASSUME G.IDFG, G.IDUN+1 ;IN THE HIGH BYTEC'D BMI 57$ ;IF MI, INHIBIT ASSIGNMENTSS;E BIT #T3.SLV,T.ST3(R5) ;IS THE00”(eÚdÝb`TADATADATADATADATADATA ISSUING TASK A SLAVE TASK?:*F BNE 57$ ;IF NE, YES..AVOID ASSIGNMENTSGH .IF DF L$$GCLI:J MOV R3,-(SP) ;SAVE THE BUFFER ADDRESS ACROSS PROCESSING3K MOV R1,-(SP) ;SAVE THE DEVICE MNEMONIC FOR LATER06L MOV T.UCB(R5),R1 ;GET THE UCB ADDRESS FOR THIS TASK8M CALL $GTUSR ;GET THE USER LOGICAL HASH TABLE ADDRESS,N MOV (SP)+,R2 ;RESTORE THE DEVICE MNEMONIC/O CALL $LNTD1 ;DO RECURSIVE LOOKUP FOR DEVICEE%P BCC 45$ ;IF CC, SUCCESSFUL LOOKUPI&Q TST R3 ;SEE IF NO LOGICAL OR ERROR8R BNE 40$ ;IF NE, BAD LOGICAL OR RECURSION LIMIT ERRORS BR 50$ ;NO LOGICAL EXISTS7T45$: MOV KISAR6,-(SP) ;SAVE APR6 MAPPING FOR A MOMENTEU MOV R3,KISAR6 ;MAP THE LNB,GV MOVB MAP6+L.NTBL,$TEMP0 ;SAVE THE TABLE NUMBER FOR THE OUTPUT BUFFERU)W MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPINGG2X INC 2(SP) ;INDICATE AN ASSIGNMENT WAS FOLLOWED*Y BR 55$ ;GO FIND UCB IN PHYSICAL TABLESZ[ .IFF ;DF L$$GCL\7] MOV #$LOGHD,R2 ;GET LOGICAL ASSIGNMENT LIST LISTHEADT;^20$: MOV (R2),R2 ;POINT TO NEXT LOGICAL ASSIGNMENT BLOCKI_ BEQ 50$ ;IF EQ, END OF LISTB7` MOVB L.TYPE(R2),$TEMP0 ;IS THIS A GLOBAL ASSIGNMENT? )a ;SAVE TYPE TO RETURN TO USER LATER.6$b ;(NOTE, L.TYPE MUST BE USED IN+c ;CONJUNCTION WITH THE "GI.ATT" STATUSF*d ;BIT SINCE L.TYPE IS ZERO FOR GLOBALe ;ASSIGNMENTS.)*f BEQ 30$ ;IF EQ YES, DO NOT CHECK L.UCB<g CMP L.UCB(R2),T.UCB(R5) ;VALID ASSIGNMENT FOR TASK'S TI:?h BNE 20$ ;IF NE NOT+i30$: CMP R1,L.NAM(R2) ;DEVICE NAME MATCH?Vj BNE 20$ ;IF NE NOT)k CMPB R0,L.UNIT(R2) ;UNIT NUMBER MATCH? l BNE 20$ ;IF NE NOV/m MOV L.ASG(R2),R1 ;GET ASSIGNMENT UCB ADDRESS no ASSUME GI.ASN,1p1q INC (SP) ;INDICATE AN ASSIGNMENT WAS FOLLOWED +r BR 70$ ;GO FINISH RESOLVING DEVICE NAMEUst .IFTF ;DF L$$GCLPu1v40$: DRSTS D.RS92 ;RETURN INVALID DEVICE ERROR wx;SAy; AT THIS POINT, WE MUST CHECK THE SYSTEM DEVICE TABLES FOR THEFDz; A DEVICE WITH THE NAME SPECIFIED IN THE DPB SINCE FOR ONE REASONA{; OR ANOTHER THE SCAN OF THE LOGICAL ASSIGNMENTS CAME UP EMPTY. D|; A CALL TO $CVDVN WILL NOT FUNCTION CORRECTLY AT THIS POINT SINCE5}; PSEUDO DEVICES ARE IGNORED BY THE $SCDVT ROUTINE.(~;;8€50$: CLR $TEMP0 ;INIT WORD CONTAINING ASSIGNMENT TYPE+� ;SINCE WE EITHER COULDN'T FIND ONE ORP‚55$:ƒ .IFT ;DF L$$GCL„8… MOV R2,R1 ;RESTORE DEVICE MNEMONIC FOR PHYSICAL SCAN2† MOV (SP)+,R3 ;RESTORE THE OUTPUT BUFFER ADDRESS‡ˆ .ENDC ;DF L$$GCLI‰'Š57$: MOV #$DEVHD,R2 ;GET DCB LISTHEADA%‹ ;(PHYSICAL SYSTEM DEVICE TABLE)N!Œ60$: MOV (R2),R2 ;GET NEXT DCBC+� BEQ 40$ ;IF EQ, DEVICE IS NOT IN SYSTEMT'Ž CMP R1,D.NAM(R2) ;DEVICE NAME MATCH? � BNE 60$ ;IF NE NO>� CMPB R0,D.UNIT(R2) ;IS THIS THE DCB FOR THE SPECIFIED UNIT?‘ BLO 60$ ;IF LO NOR ’ CMPB R0,D.UNIT+1(R2) ;REALLY?“ BHI 60$ ;IF HI NO5” SUB D.UNIT(R2),R0 ;CONVERT TO RELATIVE UNIT NUMBER)• BIC #177400,R0 ;CLEAR MUNGED HIGH BYTEA0– MOV D.UCBL(R2),R1 ;GET LENGTH OF UCB IN BYTES/— CALL $MUL ;CALCULATE OFFSET FOR DESIRED UCBS-˜ ADD D.UCB(R2),R1 ;CALCUALTE ADDRESS OF UCBX™;CGš; AT THIS POINT, WE'VE FOUND A RAW UCB. THAT IS TO SAY, THE REDIRECTSCF›; HAVE NOT BEEN FOLLOWED AND THE VIRTUAL TERMINAL CHECK HAS NOT BEENCœ; PERFORMED. ONLY THE PARENT OR OFFSPRING TASK OF A GIVEN VT UNITUD�; MAY RETRIEVE INFO ON THE UNIT SINCE THEIR EXISTENCE IS ACCOUNTEDž; FOR IN THE VT USE COUNT.Ÿ;C ; CURRENTLY:¡; R1 = RAW UCB ADDRESSV ¢; R3 = POINTER TO USER BUFFER4£; R5 = TCB ADDRESS OF ISSUING TASK (ALSO CURRENT)¤; 2(SP) = EXTRA WORD COUNTU ¥; (SP) = SCRATCH STATUS WORD¦; §70$:¨© .IF DF V$$TRMª«9¬ ASSUME U.DCB,0 ;ASSUME THAT THE FIRST WORD OF THE UCBV ­ ;IS THE POINTER TO THE DCB$® MOV (R1),R2 ;POINT TO UNIT'S DCB8¯ CMP D.NAM(R2),#"VT ;IS THE DEVICE A VIRTUAL TERMINAL?° BNE 80$ ;IF NE NOX1± CMP U.PTCB(R1),R5 ;IS ISSUING TASK THE PARENT?² BEQ 80$ ;IF EQ YES2³ CMP R1,T.UCB(R5) ;IS ISSUING TASK AN OFFSPRING?#´ BNE 40$ ;IF NE NO, RETURN ERRORIµ¶· .ENDC ;V$$TRM¸¹'º00”0eÔd³cÙ´cÚµcÛ¶c�·c›’80$: MOV R1,R0 ;COPY RAW UCB ADDRESSH(» CALL $MPLND ;MAP TO REAL UCB ADDRESS#¼ CMP R1,R0 ;WAS UNIT REDIRECTED?S½ BEQ 90$ ;IF EQ, NO1¾ BIS #GI.RED,(SP) ;REMEMBER UNIT WAS REDIRECTEDM¿¿90$: ;edp040D¿; ;edp040U¿; THE GET DEVICE INFORMATION AND SON OF GET DEVICE INFORMATION SUBFUNCTIONS ;edp040S(¿; DIVERGE AT THIS POINT. ;edp040¿; ;edp040F¿ CMPB G.INSF-G.IUNM(R4),#6 ; IS IT "GET DEVICE INFORMATION"? ;edp040'¿ BEQ 91$ ; YES, CONTINUE. ;edp0406¿ JMP $SFDVJ ; NO, USE THE JUNIOR VERSION. ;edp040¿91$: ;edp040¿; ;edp040F¿; NOW THAT WE HAVE A "REAL" UCB ADDRESS, THE DEVICE STATUS ;edp040K¿; RETURNED IN "G.IDEV" IS DETERMINED. ALONG THE WAY, THE USER'S ;edp040HM¿; VARIABLE LENGTH BUFFER IS FILLED IN WHEN NEEDED AND IF POSSIBLE. ;edp040S¿; ;edp040>¿ MOVB U.STS(R0),(R3)+ ; PLACE U.STS IN USER BUFFER ;edp040!Æ MOVB U.ST2(R0),R1 ; ;**-6A,Ç MOVB R1,(R3)+ ;PLACE U.ST2 IN USER BUFFER-È BIC #CLRMSK,-(R3) ;CLEAR OUT UNNEEDED BITSR(É SWAB R1 ;MOV US.OFL INTO HIGH BIT OFÊ ROR R1 ;LOW ORDER BYTE*Ë BIC #^C<200>,R1 ;CLEAR ALL BUT 'GI.OFL',Ì BIS R1,(R3) ;'OR' IN UNIT OFFLINE STATUS7Í BIS (SP)+,(R3) ;'OR' IN ASSIGNMENT AND REDIRECT INFO*Î MOV (SP)+,R4 ;RETRIEVE EXTRA WORD COUNT.Ï MOV U.CW1(R0),R1 ;GET U.CW1 FOR USER BUFFER.Ð MOV R1,-(SP) ;AND SAVE IT AS WELL FOR LATER*Ñ MOV R5,-(SP) ;SAVE ISSUER'S TCB ADDRESS.Ò MOV R3,R5 ;COPY TOP OF USER BUFFER ADDRESS/Ó TST (R3)+ ;POINT TO START OF OPTIONAL WORDSN(Ô CALL XMIT ;COPY U.CW1 TO USER BUFFER$Õ MOV U.PRM(R0),R1 ;DITTO FOR U.PRMÖ CALL XMIT ;0(× MOV U.PRM+2(R0),R1 ;DITTO FOR U.PRM+2Ø CALL XMIT ; *Ù MOV R0,R1 ;RETURN 'TARGET' DEVICE NAMEÚ100$: CALL DNFILL ;2Û BCS 110$ ;IF CS, NO USER BUFFER ROOM TO RETURNÜ ;L.TYPE INFO-Ý MOVB $TEMP0,-1(R3) ;RETURN ASSIGNMENT INFOS-Þ110$: MOV U.ATT(R0),R1 ;IS DEVICE ATTACHED? ß BEQ 120$ ;IF EQ NO à BIS #GI.ATT,(R5) ;TELL ISSUER2á CMP R1,(SP) ;IS IT THE ISSUER WHO IS ATTACHED?â BEQ 120$ ;IF EQ NO/ã BIS #GI.ATU,(R5) ;RETURN THIS STATUS AS WELLD2ä120$: CALL TNFILL ;RETURN TASK NAME OF ATTACHEE!å MOV (SP)+,R2 ;GET ISSUER'S TCBT)æ MOV U.OWN(R0),R1 ;IS DEVICE ALLOCATED? ç BEQ 130$ ;IF EQ NO"è BIS #GI.ALL,(R5) ;RETURN STATUS3é CMP T.UCB(R2),R1 ;IS ALLOCATOR THE ISSUER'S TI:?Mê BNE 130$ ;IF NE NO/ë BIS #GI.ALU,(R5) ;RETURN THIS STATUS AS WELLT5ì130$: CALL DNFILL ;RETURN DEVICE NAME OF ALLOCATORT"í MOV U.SCB(R0),R1 ;VIA THE SCB..)î MOV S.KRB(R1),R1 ;GET THE DEVICE'S KRBF0ï BEQ 140$ ;IF EQ, CANN'T DETERMINE CONTROLLERð ;STATUS.:ñ BIT #KS.OFL!KS.PDF,K.STS(R1) ;IS THE CONTROLLER OFFLINEò ;OR PDF?ó BEQ 140$ ;IF EQ NO%ô BIS #GI.OFL!GI.COF,(R5) ;TELL USERF1õ140$: MOV U.DCB(R0),R1 ;CHECK IF DRIVER LOADED?Tö TST D.DSP(R1) ;LOADED?H÷ BNE 150$ ;IF NE YES1"ø BIS #GI.UNL,(R5) ;RETURN STATUS)ù BR 190$ ;NOTHING MORE TO RETURN..EXITD)ú150$: COM (SP) ;COMPLEMENT SAVED U.CW1>û BIT #DV.MNT!DV.MSD,(SP) ;MASS STORAGE AND MOUNTABLE DEVICE?ü BNE 190$ ;IF NE NO*ý BITB #US.MNT,U.STS(R0) ;DEVICE MOUNTED?þ BNE 190$ ;IF NE NO#ÿ MOV U.VCB(R0),R2 ;GET DEVICE VCBR2 BEQ 190$ ;BAIL OUT..CAN'T TOUCH U.ACP TILL VCB  ;SET UP.+ MOV U.ACP(R0),R1 ;GET TCB ADDRESS OF ACP14 CALL TNFILL ;SO ACP NAME CAN BE RETURNED TO USER6 BIT #DV.SQD,(SP) ;IS DEVICE AN ANSI LABLED MAGTAPE?5 BNE 155$ ;IF NE NO (COPY OF U.CW1 IS COMPLEMENTED5 ;ON STACK)) BITB #US.LAB,U.STS(R0) ;IS IT "LABLED", BEQ 155$ ;IF EQ NO"  BIS #GI.LAB,(R5) ;RETURN STATUSD 155$: CMP R4,#/2 ;USER BUFFER BIG ENOUGH FOR LABLE?  BLT 190$ ;IF LT NO!  ADD #V.LABL,R2 ;POINT TO LABLEL1  MOV (R2)+,(R3)+ ;COPY FIRST SIX BYTES OF LABLE MOV (R2)+,(R3)+ ; MOV (R2)+,(R3)+ ;. BIT #GI.LAB,(R5) ;IS IT A LABLED ANSI TAPE? BEQ 180$ ;IF EQ NO; MOV V.MVL(R0),R1 ;POINT TO FIRST MOUNTED VOL. LIST ENTRY(5 BEQ 180$ ;IF EQ THERE ISN'T ONE,JUST RETURN LABELT;160$: CMP M.UCB(R1),R0 ;DEVICE UCB MATCH WITH TH00”8eÚdÝb`TADATADATADATADATADATAIS ENTRY? BEQ 170$ ;IF EQ YESR( MOV M.NXT(R1),R1 ;GET NEXT LIST ENTRY BNE 160$ ;CONTINUE SCAN 3 BR 180$ ;ELSE AT END OF LIST..JUST RETURN LABLEI0170$: MOV R1,R2 ;COMPUTE ADDRESS OF VOLUME ID ADD #M.VIDP,R2 ;V6180$: MOV (R2)+,(R3)+ ;FINISH RETURNING VOLUME LABLE  MOV (R2)+,(R3)+ ;OR VOLUME ID MOV (R2)+,(R3)+ ;190$: TST (SP)+ ;CLEAN STACK  RETURN ;ALL DONE..RETURNQ ! .ENABLE LSB"#/$TNFILL: TST R1 ;WAS A TCB ADDRESS SPECIFIED?E)% BEQ 20$ ;IF EQ NO..GO ADJUST POINTERS01& MOV T.NAM+2(R1),-(SP) ;GET SECOND HALF OF NAMEE#' MOV T.NAM(R1),R1 ;AND FIRST HALF ( BR 10$ ; )DNFILL: (* TST R1 ;WAS A UCB ADDRESS SPECIFIED?(+ BEQ 20$ ;IF EQ NO.GO ADJUST POINTERS, MOV U.DCB(R1),R2 ;GET DCB- TST (R2)+ ;SKIP LINK WORDE6. SUB (R2)+,R1 ;CALCULATE OFFSET INTO CONTIGUOUS UCBS#/ MOV (R2)+,-(SP) ;GET DEVICE NAMEC/0 MOV (R2)+,-(SP) ;GET LOW LOGICAL UNIT NUMBERE1 MOV (R2)+,R2 ;GET UCB SIZE /25$: SUB R2,R1 ;DETERMINE LOGICAL UNIT NUMBERQ 3 BMI 6$ ;4 INC (SP) ; 5 BR 5$ ;)#66$: MOV 2(SP),R1 ;GET DEVICE NAMEM!7 MOV (SP)+,(SP) ;CLEAN UP STACK78 BIC #^C<377>,(SP) ;CLEAR OUT HIGH ORDER GARBAGE BYTEC0910$: CALL XMIT ;FILL IN A WORD IN USER BUFFER: MOV (SP)+,R1 ;GET NEXT WORD;XMIT: CLC ;ASSUME SUCCESS'< DEC R4 ;ENOUGH ROOM IN USER BUFFER?I= BMI 40$ ;IF MI NO++> MOV R1,(R3)+ ;RETURN WORD TO USER BUFFER;? BR 30$ ;EXIT GRACEFULLY$@20$: SUB #2,R4 ;ADJUST WORD COUNT-A BMI 40$ ;IF MI WE'RE AT THE END OF BUFFERBB ADD #4,R3 ;ADJUST POINTER !C30$: TST (PC)+ ;RETURN SUCCESSI!D40$: SEC ;RETURN ERROR STATUSU E RETURN ;CF G .DSABL LSBAHH ;edp040BH ;edp040TH ;edp040UH ;edp040PH;+ ;edp0407H; **-$SFDVJ-SON OF GET DEVICE INFORMATION ;edp040UH; ;edp040HH; THIS GIN SUBFUNCTION RETURNS INFORMATION ABOUT A PARTICULAR ;edp040HH; DEVICE. THE DPB AND METHOD OF DETERMINING THE DEVICE TO BE ;edp040BH; EXAMINED ARE IDENTICAL TO THE GET DEVICE INFORMATION ;edp040JH; SUBFUNCTION, EXCEPT THAT THE SUBFUNCTION IS 18 RATHER THAN 6. ;edp040H; ;edp040CH; THE CURRENT MINIMUM AND MAXIMUM BUFFER LENGTH IS ONE. ;edp0404H; ;edp040IH; INPUT AT THIS POINT (AFTER COMMON PROCESSING IN $SFDEV) IS: ;edp040 H; ;edp0401H; R1 -- UCB OF DEVICE TO BE CHECKED ;edp040I/H; R3 -- POINTER TO USER'S BUFFER ;edp040D3H; R5 -- POINTER TO ISSUING TASK'S TCB ;edp0400EH; STACK -- TWO UNNEEDED WORDS ARE ON THE STACK (ALONG WITH ;edp040=H; THE RETURN ADDRESS AND REMAINING INFORMATION). ;edp040 H; ;edp040/H; OUTPUT IN THE USER BUFFER IS: ;edp040FH; ;edp040H; FIRST WORD: ;edp040EH; NEGATIVE -- CODE INDICATING WHY DEVICE CANNOT CURRENTLY ;edp040 0H; BE ACCESSED AS A MOUNTED DEVICE. ;edp040FH; NON-NEGATIVE -- BITS DESCRIBING ACCESS TO MOUNTED DEVICE: ;edp0407H; BITS 0 TO 3: WHICH TYPES OF ACCESS ARE ;edp0405H; PROHIBITED (R, W, E, D, LOW TO HIGH), ;edp040 *H; BIT 4: DEVICE IS PUBLIC, ;edp0406H; BIT 5: DEVICE IS ALLOCATED TO ISSUER, ;edp040/H; BIT 6: DEVICE IS FOREIGN, AND ;edp040F6H; BIT 7: THE FOREIGN DEVICE HAS AN ACP. ;edp040;H; NOTE THAT BITS 4 AND 5 OFF TOGETHER INDICATE ;edp040 ;H; THE DEVICE IS MOUNTED BY THE ISSUER, BUT NOT ;edp040&H; ALLOCATED OR PUBLIC. ;edp040H;- ;edp040dH ;edp040 )H; DEFINE PROTECTION BITS. ;edp040!HR = 000001 ; READ ;edp040 "HW = 000002 ; WRITE ;edp040"HC = 000004 ; CREATE ;edp040"HD = 000010 ; DELETE ;edp040%H; DEFINE OTHER BITS. ;edp040G1HGJ.PUB = 000020 ; DEVICE IS PUBLIC. ;edp040E<HGJ.ALL = 000040 ; DEVICE IS PRIVATE (ALLOCATED). ;edp0402HGJ.FOR = 000100 ; DEVICE IS FOREIGN. ;edp0406HGJ.ACP = 000200 ; FOREIGN DEVICE HAS ACP. ;edp040&H; DEFINE OTHER CODES. ;edp040FHGJ.NMM = -1 ; DEVICE IS NOT BOTH MASS-STORAGE AND MOUNTABLE.;edp040;HGJ.NMO =00”@eÔd³cÙ´cÚµcÛ¶c�·c›’ -2 ; DEVICE IS NOT MOUNTED FOR ISSUER. ;edp040dH ;edp040 H$SFDVJ: ;edp0407H MOV R0,R1 ; PUT UCB IN PREFERRED REGISTER. ;edp046 ?H CMP (SP)+,(SP)+ ; POP UNNEEDED BITS AND WORD COUNT. ;edp040J>H MOV U.CW1(R1),R0 ; GET FIRST CHARACTERISTICS WORD. ;edp040-H COM R0 ; REVERSE SENSE OF BITS. ;edp040AH BIT #DV.MNT!DV.MSD,R0 ; IS IT NOT MASS STORAGE OR NOT ;edp040HH ; MOUNTABLE? ;edp040*H BNE 90$ ; YES, RETURN CODE. ;edp040;H BITB #US.MNT,U.STS(R1) ; IS DEVICE NOT MOUNTED? ;edp040F0H BNE 95$ ; YES, THERE IS NO ACCESS. ;edp040DH MOV #GJ.PUB,(R3) ; ASSUME PUBLIC UNTIL PROVEN OTHERWISE. ;edp0407H BITB #US.PUB,U.ST2(R1) ; IS DEVICE PUBLIC? ;edp040D6H BNE 20$ ; YES, SKIP REST OF MOUNT CHECKS. ;edp040DH MOV #GJ.ALL,(R3) ; ASSUME PRIVATE UNTIL PROVEN OTHERWISE.;edp040=H MOV T.UCB(R5),R0 ; GET ISSUER'S TI: UCB ADDRESS. ;edp040e=H CMP U.OWN(R1),R0 ; DOES ISSUER HAVE IT ALLOCATED? ;edp040U4H BEQ 20$ ; YES, IT IS MOUNTED FOR USER. ;edp0402H TST U.OWN(R1) ; IS DEVICE ALLOCATED? ;edp040;H BNE 95$ ; YES, DEVICE IS NOT MOUNTED FOR USER. ;edp040C1H CLR (R3) ; IT MUST BE SEMI-PRIVATE. ;edp040.:H BIT #T3.PRV,T.ST3(R5) ; IS ISSUER PRIVILEGED? ;edp0404H BNE 20$ ; YES, IT IS MOUNTED FOR USER. ;edp0406H MOV #$MOULS,R2 ; GET START OF MOUNT LIST. ;edp040H10$: ;edp040S,H MOV (R2),R2 ; GET NEXT ENTRY. ;edp0406H BEQ 95$ ; DEVICE IS NOT MOUNTED FOR USER. ;edp040<H CMPB #MT.MLS,M.TYPE(R2) ; CORRECT TYPE OF ENTRY? ;edp040+H BNE 10$ ; NO, GO ON TO NEXT. ;edp040ECH CMP M.DEV(R2),R1 ; IS IT THE DEVICE WE ARE LOOKING FOR? ;edp040 $H BNE 10$ ; NO, GO ON. ;edp040<H CMP M.TI(R2),R0 ; IS THIS ENTRY FOR OUR ISSUER? ;edp040$H BNE 10$ ; NO, GO ON. ;edp0401H; DEVICE IS MOUNTED FOR THIS USER. ;edp040NH20$: ;edp040 ?H BITB #US.FOR,U.STS(R1) ; IS DEVICE MOUNTED FOREIGN? ;edp0404H BEQ 100$ ; NO, HANDLE FILES-11 DEVICE. ;edp0409H BIS #GJ.FOR,(R3) ; YES, REPORT THAT TO USER. ;edp0400.H TST U.ACP(R1) ; IS THERE AN ACP? ;edp040$H BEQ 80$ ; NO, LEAVE. ;edp0402H BIS #GJ.ACP,(R3) ; YES, REPORT THAT. ;edp040H80$: ;edp040M H RETURN ; LEAVE. ;edp040H90$: ;edp040E@H MOV #GJ.NMM,(R3) ; INDICATE DEVICE IS NOT MOUNTABLE. ;edp040H RETURN ;edp040 H95$: ;edp040UAH MOV #GJ.NMO,(R3) ; INDICATE DEVICE IS NOT MOUNTED FOR ;edp040 H ; USER. ;edp040H RETURN ;edp040RH100$: ;edp040:H BIT #T3.PRV,T.ST3(R5) ; IS ISSUER PRIVILEGED? ;edp0409H BNE 190$ ; YES, THEY CAN DO ALMOST ANYTHING. ;edp040P+H MOV KISAR6,-(SP) ; SAVE APR. ;edp040 .H MOV $SAHDB,KISAR6 ; MAP HEADER. ;edp0403H MOV $SAHPT,R2 ; GET ADDRESS OF HEADER. ;edp040I2H MOV H.DUIC(R2),R0 ; GET DEFAULT UIC. ;edp040>H MOV H.CUIC(R2),R2 ; GET CURRENT (PROTECTION) UIC. ;edp040.H MOV (SP)+,KISAR6 ; RESTORE APR. ;edp0402H CLR -(SP) ; ASSUME NO SYSTEM ACCESS. ;edp040>H CMP R2,#10*400+377 ; IS ISSUER IN A SYSTEM GROUP? ;edp040;H BHI 120$ ; NO, DO NOT GIVE THEM SYSTEM ACCESS. ;edp040M-H INC (SP) ; FLAG SYSTEM ACCESS. ;edp040SH120$: ;edp040DH MOV U.VCB(R1),R4 ; GET LOCATION OF VOLUME CONTROL BLOCK. ;edp040@H BIT #FE.MUP,$FMASK ; IS THIS A MULTI-USER PROTECTION ;edp040H ; SYSTEM? ;edp0402/H BEQ 140$ ; NO, SKIP USER CHECKS. ;edp040BH CMP T.UCB(R5),U.OWN(R1) ; DOES ISSUER OWN THIS DEVICE? ;edp0406H BEQ 130$ ; YES, GIVE THEM SYSTEM ACCESS. ;edp040(H TST (SP) ; SYSTEM GROUP? ;edp0406H BNE 140$ ; YES, SKIP VOLUME OWNER CHECK. ;edp040>H CMP T.UCB(R5),V.VOWN(R4) ; DOES ISSUER OWN VOLUME? ;edp0407H BNE 140$ ; NO, DO NOT GRANT SYSTEM ACCESS. ;edp040 H130$: ;edp0406H INC (SP) ; THIS ISSUER HAS SYSTEM ACCESS. ;edp040+H MOV R0,R2 ; USE DEFAULT UIC. ;edp0401H140$: ;edp040'H SWAB R2 ; REFORMAT UIC. ;edp040)3H MOV V.VOWN(R4),R0 ; GET VOLUME OWNER. ;edp040 7H MOV V.VPRO(R4),R4 ; GET VOLUME PROTE00”HeÚdÝb`TADATADATADATADATADATACTION. ;edp040 'H SWAB R0 ; REFORMAT UIC. ;edp040 -H COM R4 ; CHANGE SENSE OF BITS. ;edp040P9H TSTB (SP)+ ; DOES ISSUER HAVE SYSTEM ACCESS? ;edp0409H BNE 150$ ; YES, DO NOT REFUSE SYSTEM ACCESS. ;edp0403:H CMPB R2,#10 ; DOES ISSUER HAVE SYSTEM ACCESS? ;edp040:H BLOS 150$ ; YES, DO NOT REFUSE SYSTEM ACCESS. ;edp040=H BIC #R!W!C!D,R4 ; ELIMINATE SYSTEM ACCESS RIGHTS. ;edp040eH150$: ;edp040+H CMP R2,R0 ; IS ISSUER OWNER? ;edp040V8H BEQ 160$ ; YES, DO NOT REFUSE OWNER ACCESS. ;edp040@H BIC #*20,R4 ; ELIMINATE OWNER ACCESS RIGHTS. ;edp040H160$: ;edp0406H CMPB R0,R2 ; IS ISSUER IN OWNER'S GROUP? ;edp0408H BEQ 170$ ; YES, DO NOT REFUSE GROUP ACCESS. ;edp040AH BIC #*400,R4 ; ELIMINATE GROUP ACCESS RIGHTS. ;edp040 H170$: ;edp0401H MOV R4,-(SP) ; COPY REMAINING BITS. ;edp040 5H SWAB (SP) ; MOVE HIGH BYTE TO LOW BYTE. ;edp04005H BIS R4,(SP) ; MERGE HIGH AND LOW BYTES. ;edp0401*H MOV (SP),R4 ; COPY RESULT. ;edp0405H ASR R4 ; MOVE HIGH NYBBLE TO LOW NYBBLE. ;edp040RH ASR R4 ; ;edp040 H ASR R4 ; ;edp040 H ASR R4 ; ;edp040O7H BIS (SP)+,R4 ; MERGE HIGH AND LOW NYBBLES. ;edp040C.H COM R4 ; RESTORE ORIGINAL SENSE. ;edp040>H BIC #^C,R4 ; GET RID OF EXTRANEOUS BITS. ;edp040H BR 200$ ;edp040NH190$: ;edp040.H CLR R4 ; GIVE ISSUER EVERYTHING. ;edp040H200$: ;edp0409H BIT #DV.SWL,U.CW1(R1) ; DEVICE WRITE-LOCKED? ;edp040U/H BEQ 210$ ; NO, LEAVE BITS ALONE. ;edp040 9H BIS #W!C!D,R4 ; ONLY READ ACCESS IS ALLOWED. ;edp040 H210$: ;edp0409H BIS R4,(R3) ; PASS DENIED ACCESSES TO USER. ;edp040YH RETURN ;edp040 IJKL;+M; **-$SFAPR-GET TASK APRSCN;CEO; THIS SUBFUNCTION FILLS A 97. WORD BUFFER WITH THE CONTENTS OF THE4GP; PARS/PDRS FOR ALL THE SPACES. THE FIRST WORD INDICATES WHICH OF THE0#Q; SUBSEQUENT WORDS ARE FILLED IN.#R;LS; SPACE WORD 0. BIT(T; ----------------------- -----------U;I,V; KERNEL I SPACE PAR'S (UNCONDITIONAL),W; KERNEL I SPACE PDR'S (UNCONDITIONAL)%X; KERNEL D SPACE PAR'S (000001) %Y; KERNEL D SPACE PDR'S (000001)R,Z; USER I SPACE PAR'S (UNCONDITIONAL),[; USER I SPACE PDR'S (UNCONDITIONAL)%\; USER D SPACE PAR'S (000002) %]; USER D SPACE PDR'S (000002) %^; SUPER I SPACE PAR'S (000004)I%_; SUPER I SPACE PDR'S (000004)L%`; SUPER D SPACE PAR'S (000004)T%a; SUPER D SPACE PDR'S (000004)-b;c; DPB FORMAT: d;E$e; WD. 00 -- DIC(169.),DPB SIZE(4.)"f; WD. 01 -- SUBFUNCTION CODE (9)g; WD. 02 -- BUFFER ADDRESS"h; WD. 03 -- BUFFER SIZE IN WORDSi;0 j; INPUTS:Rk; +l; R3=ADDRESS OF FIRST WORD OF USER BUFFER "m; R5=TCB ADDRESS OF CURRENT TASKn; o; OUTPUTS:p;(&q; THE BUFFER IS FILLED WITH THE APRSr;-s t MASK = 0 u .IIF DF K$$DAS, MASK=MASK!1v .IIF DF U$$DAS, MASK=MASK!2w .IIF DF S$$LIB, MASK=MASK!4x:y$SFAPR::MOV #MASK,(R3)+ ;INSERT MASK OF WHAT WILL FOLLOW)z MOV #$APRTB,R0 ;GET TABLE OF ADDRESSES ){10$: MOV (R0)+,R1 ;GET NEXT APR ADDRESS)| BEQ 20$ ;IF EQ END OF LIST#} MOV (R1)+,(R3)+ ;MOVE A REGISTER#~ MOV (R1)+,(R3)+ ;MOVE A REGISTERS# MOV (R1)+,(R3)+ ;MOVE A REGISTER5#€ MOV (R1)+,(R3)+ ;MOVE A REGISTER#� MOV (R1)+,(R3)+ ;MOVE A REGISTERI#‚ MOV (R1)+,(R3)+ ;MOVE A REGISTER #ƒ MOV (R1)+,(R3)+ ;MOVE A REGISTER#„ MOV (R1)+,(R3)+ ;MOVE A REGISTERI… BR 10$ ;GO AGAIN†20$: RETURN ;O‡ˆ;++‰; **-SFFTK-FIND TASK AND RETURN TASK INFO#Š;B9‹; THIS GIN FUNCTION RETURNS INFORMATION ON A TASK WHICH DŒ; MAY HAVE ITS TCB IN SECONDARY OR PRIMARY POOL. GIVEN A TASKNAME,D�; THIS GIN FUNCTION WILL ATTEMPT TO FIND A TASK AS DESCRIBED BELOWŽ; IN THE $SRTTK ROUTINE.�;(F�; THE INFORMATION IS RETURNED TO A USER BUFFER HAVING A MINIMUM SIZED‘; OF TWO WORDS AND A MAXIMUM SIZE OF SIX WORDS. THIS FUNCTION WILLI’; RETURN AS MUCH OF THE FOLLOWING INFORMATION AS THE USER BUFFER'S S00”PeÔd³cÙ´cÚµcÛ¶c�·c›’IZE“; ALLOWS FOR.S”;F•;A–; DPB FORMAT:K—;#˜; +---------------+N™; | 6. | 169. |Tš; +---------------+›; |SUBFUNCTION=10.|Eœ; +---------------+.�; | BUFFER ADDRESS| ž; +---------------+AŸ; | BUFFER WDSIZE |S ; +---------------+N¡; | |¢; +- TASKNAME -+H£; | |¤; +---------------+E¥;F¦; USER BUFFER FORMAT:§;F¨; +---------------+ |S ©; | | |9ª; +- TASKNAME -+ | THE FIRST TWO WORDS ARE REQUIRED.N «; | | |¬; +---------------+ |Z­; | T.STAT |®; +---------------+ ¯; | T.ST2 |°; +---------------+±; | T.ST3 |T²; +---------------+³; | T.ST4 |N´; +---------------+-µ; | |¶; +- P.NAM -+·; | |¸; +---------------+R¹;-º3»$SFFTK::MOV R3,-(SP) ;SAVE ADDRESS OF USER BUFFER &¼ MOV R2,-(SP) ;SAVE EXTRA WORD COUNT'½ MOV R4,R3 ;COPY POINTER TO TASKNAME ¾ CALL $SRTTK ;SEARCH FOR TCB%¿ BCS 30$ ;IF CS TASK NOT INSTALLEDO,À MOV KISAR6,-(SP) ;SAVE OLD KISAR6 MAPPING(Á BIT #1,R0 ;IS TCB IN SECONDARY POOL? BEQ 5$ ;IF EQ NOà DEC R0 ;RESET FLAGÄ MOV (R0),KISAR6 ;MAP TO TCBÅ MOV #140000,R0 ;POINT AT IT6Æ5$: MOV #$TNAME,R1 ;POINT TO TEMP LOCATIONS IN SYSCM$Ç ADD #T.NAM,R0 ;POINT TO TASK NAME:È MOV (R0)+,(R1)+ ;COPY TASKNAME INTO TEMPORARY LOCATIONSÉ MOV (R0)+,(R1)+ ;,Ê ADD #T.STAT-,R0 ;POINT TO T.STATË MOV (R0)+,(R1)+ ;COPY T.STATKÌ MOV (R0)+,(R1)+ ;COPY T.ST2Í MOV (R0),(R1) ;COPY T.ST3%Î MOV T.ST4-T.ST3(R0),R2 ;COPY T.ST4I%Ï MOV T.PCB-T.ST3(R0),R4 ;COPY T.PCBP9Ð MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPING ( USER BUFFER )()Ñ MOV (SP)+,R5 ;RESTORE EXTRA WORD COUNTP/Ò MOV (SP)+,R3 ;RESTORE POINTER TO USER BUFFERO&Ó MOV #$TNAME,R1 ;POINT TO SAVED INFO Ô MOV (R1)+,(R3)+ ;RETURN T.NAMÕ MOV (R1)+,(R3)+Ö DEC R5 ;ROOM FOR MORE?× BMI 20$ ;IF MI NO#!Ø MOV (R1)+,(R3)+ ;RETURN T.STATTÙ DEC R5 ;ROOM FOR MORE?Ú BMI 20$ ;IF MI NO1Û MOV (R1)+,(R3)+ ;COPY T.ST2Ü DEC R5 ;ROOM FOR MORE?Ý BMI 20$ ;IF MI NOIÞ MOV (R1)+,(R3)+ ;COPY T.ST3ß DEC R5 ;ROOM FOR MORE?à BMI 20$ ;IF MI NO á MOV R2,(R3)+ ;COPY T.ST4+-â CMP R5,#2 ;TWO MORE WORDS LEFT FOR P.NAM? ã BLT 20$ ;IF LT NOR"ä MOV P.NAM(R4),(R3)+ ;COPY P.NAMå MOV P.NAM+2(R4),(R3)+ æ20$: RETURNT5ç30$: DRSTS D.RS2 ;RETURN DIRECTIVE ERROR OF IE.INSèé;+Jê; **-$SRTTK-SEARCH FOR PROTOTYPE OR NON-PROTOTYPE OR MULTI-USER TASK TCBë;IIì; THIS ROUTINE SEARCHES FOR A TCB WHICH IS ASSOCIATED WITH THE TASKNAME?í; AS FOLLOWS: î;I@ï; IF THE TASKNAME IS OF THE FORM "...XXX" THEN A CHECK IS MADEBð; FOR THE MULTI-USER TASKNAME "XXXTNN" WHERE NN IS DERIVED FROMBñ; THE UCB ADDRESS PASSED IN R0. IF NOT FOUND THEN THE PROTOTYPEò; IS SEARCHED FOR.Aó; IF THE TASKNAME IS OF THE FORM "XXX$$$" THEN A SEARCH IS MADE =ô; ONLY FOR THE PROTOTYPE AS A DIFFERENT FORM OF MULTI-USERPAõ; TASKNAME EXISTS FOR DECNET PROTOTYPES SINCE THIS NAME IS NOTU"ö; DERIVED FROM THE UCB ADDRESS.A÷; IF THE TASKNAME IS OF NEITHER OF THE ABOVE FORMS, A SEARCH OFN=ø; PRIMARY POOL IS MADE FOR A NON-PROTOTYPE TCB BEARING THEMù; TASKNAME SPECIFIED.Bú; IF THIS TASKNAME COULD NOT BE FOUND AND IT IS LIMITED TO THREEBû; CHARACTERS THEN AN ADDITIONAL SEARCH IS MADE FOR A MULTI-USERü; TASK OR PROTOTYPE.$ý;N þ; INPUTS:Mÿ;*; R3=ADDRESS OF TASK NAME TO SEARCH FOR.;F ; OUTPUTS:;T;; C=1 IF TASK NAME OR THE PERMUTATIONS COULD NOT BE FOUND"; C=0 IF SPECIFIED TASK IS FOUND!; R3=ADDRESS OF TASKNAME FOUNDF(; (COULD BE DIFFERENT FROM INPUT)(; R0=ADDRESS OF TCB IN POOL (IF EVEN). ; R0=ADDRESS OF KISAR5 BIAS OF TCB (IF ODD) ; ASSUMPTIONS: ; B ; A MULTI-USER TASK NAME WILL BE DERIVED FROM THE UCB ADDRESS OFB ; THE TI: OF THE CURRENT TASK. IF THIS IS INAPPROPRIATE, USE THE>; ALTERNATE ENTRY POINT $SRTSK AND SUPPLY THE CORRECT TI UCB; ADDRESS IN R0.;- $SRTTK::$ MOV $TKTCB,R0 ;GET CURRENT TASK'S$ MOV T.UCB(R0),R0 ;TI: UCB ADDRESS $SRTSK::( CMP (R3)+,#^R... ;RSX PROTOTYPE NAME? B00”XeÚdÝb`TADATADATADATADATADATANE 50$ ;IF NE NOU4 TST (R3) ;DOES 2ND HALF NAME HAVE NAME OF PROTO? BEQ 50$ ;IF EQ NOO' MOV (R3),R1 ;PICK UP PROTOTYPE NAME/10$: CALL $SRMUT ;SEARCH FOR MULTI-USER TASK 0 BCC 90$ ;IF CC FOUND IT AS "XXXTnn"..SUCCESS9 MOV (R3)+,(R3) ;TRY FOR PROTYPE..FORM NAME FROM $TNAME " MOV #^R...,-(R3) ;INTO "...XXX"620$: CALL $SRPRO ;SEARCH SECONDARY AND PRIMARY POOL)  BR 90$ ;ALL THAT CAN BE DONE HAS BEENR8!50$: CMP (R3),#^R$$$ ;2ND HALF OF NAME INDICATE DECNET" ;OR SPECIAL PROTOTYPE?# BNE 60$ ;IF NE NO;.$ MOV -(R3),R1 ;DOES DECNET PROTO HAVE A NAME+% ;ALSO POINT TO BEGINNING OF TASK NAMEO1& BEQ 70$ ;IF EQ NO NOT DECNET PROTOTYPE JUST AS' ;"$$$" TASK$( BR 20$ ;GO FIND IT;)60$: MOV -(R3),R1 ;POINT TO BEGINNING OF TASKNAME AND GET -* ;FIRST HALF OF NAME FOR LATER IF NEEDED"0+70$: MOV R0,R2 ;SAVE POSSIBLE TI: UCB POINTER6, CALL $SRSTD ;SEARCH PRIMARY POOL FOR NON-PROTOTYPE-- BCC 90$ ;IF CC FOUND IT .. RETURN SUCCESSE". MOV R2,R0 ;RESTORE UCB ADDRESS / TST 2(R3) ;3 CHAR NAME ONLY?00 BEQ 10$ ;IF EQ YES TREAT IT AS THE NAME OF A1 ;PROTOTYPE-280$: SEC ;COULDN'T FIND IT RETURN FAILURET390$: RETURN ;ALL DONE"456 .IFTF ; DF R$$PRO78 .IF DF P$$3XX9:;+,;; **-$SFCFG-GET SYSTEM CONFIGURATION TABLE<;L9=; THIS DIRECTIVE RETURNS THE SYSTEM CONFIGURATION TABLES<>; TO A USER BUFFER, TURNING IT UPSIDE DOWN IN THE PROCESS!A?; THE TABLE IS VARIABLE LENGTH LOCATED AT THE HIGHEST AVAILABLEME@; ADDRESS OF MEMORY DOWNWARDS. THE BYTE DESCRIBING THE SIZE OF THISQBA; TABLE IS AT THE HIGHEST ADDRESS. THIS DIRECTIVE WILL RETURN AS8B; MUCH OF THE TABLE THAT WILL FIT IN THE USER'S BUFFERC;DD; DPB FORMAT:.E;;#F; WD 00 -- DIC(169.),DPB SIZE(4.)#G; WD 01 -- SUBFUNCTION CODE (12.)UH; WD 02 -- BUFFER ADDRESSD!I; WD 03 -- BUFFER SIZE IN WORDSRJ; K; INPUTS:OL;E(M; R2 =NUMBER OF WORDS IN USER BUFFER-1 N; R3 =APR6 USER BUFFER ADDRESSO;H P; OUPUTS:HQ;H6R; THE USER'S BUFFER IS FILLED WITH THE REUESTED INFO4S; THE DSW CONTAINS THE NUMBER OF WORDS TRANSFERREDT;-U V$SFCFG::W INC R2 ;CORRECT WORD COUNT0X BIT #H2.BRG,$HFMSK+2 ;IS THIS A PROFESSIONAL?Y BNE NOTPRO ;IF NE NO2Z MOV #$PARHD,R0 ;PICK UP MAIN PARTITION LISTHEAD,[10$: MOV (R0),R0 ;GET NEXT MAIN PARTITION*\ BEQ NOTPRO ;IF EQ COULDN'T FIND CNFTBL(] CMP P.NAM(R0),#^RCNF ;IS THIS CNFTBL?^ BNE 10$ ;IF NE NOF _ CMP P.NAM+2(R0),#^RTBL ;MAYBE` BNE 10$ ;IF NE NO TRY NEXT*a MOV P.REL(R0),R1 ;GET BASE OF PARTITION'b MOV P.SIZE(R0),R0 ;GET SIZE OF TABLEE)c ASH #5,R0 ;CONVERT TO NUMBER OF WORDS:4d CMP R0,R2 ;USER EXPECT MORE THAN WE CAN DELIVER?e BHIS 20$ ;IF HIS NOA4f MOV R0,R2 ;SET WORD CNT TO CNFTBL PARTITION SIZE*g20$: ASL R0 ;CONVERT WD COUNT TO OFFSET"h ADD #120000,R0 ;ADD KISAR5 BIAS=i CMP R0,#140000-64. ;COULD WE BLOW AWAY BIAS TO USER BUFFERIj BLOS 30$ ;IF LOS NO$*k DRSTS D.RS99 ;RETURN ERROR OF 'IE.SDP'7l30$: MOV R2,2(SP) ;RETURN NUMBER OF WORDS TRANSFERREDG+m CALLR $FLIPM ;EXIT TO FLIP MOVE ROUTINEE1nNOTPRO: DRSTS D.RS92 ;RETURN ERROR OF 'IE.IDU'OopqIDROM=173600 r$SFSSN::/s BIT #H2.BRG,$HFMSK+2 ;IS THIS A PROFESSIONALNt BNE NOTPRO ;IF NE NO(u MOV #IDROM,R0 ;GET ADDRESS OF ID PROM4v MOV #6,R1 ;SET UP LOOP COUNT TO TRANSFER 6 BYTESw CLR R2 ;CLEAR VALIDITY FLAG-)x10$: MOVB (R0),(R3)+ ;GET A BYTE OF SSNI5y BIS (R0),R2 ;'OR' WITH FLAG TO DETECT A 0 IDVALUER(z ADD #2,R0 ;POINT TO NEXT BYTE OF SSN{ SOB R1,10$ ;LOOP TILL DONE| TST R2 ;SSN ALL ZEROS?6} BEQ NOTPRO ;IF EQ YES, IT COULDN'T HAVE BEEN A PRO~ RETURN ;RETURN SUCCESS=€� .ENDC ; DF P$$3XX‚ƒ .IFF ; DF R$$PROP„…;+H†; **-$SFABO - ABORT ALL TASKS CURRENTLY ACTIVE ON A SPECIFIED TERMINAL‡;#Mˆ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ABORT ALL TASKS THAT ARE CURRENTLY/‰; ACTIVE ON THE TERMINAL SPECIFIED IN THE DPBSŠ;,‹; DPB FORMAT:AŒ;D%�; WD. 00 -- DIC(169.),DPB SIZE(4.).T.Ž; WD. 01 -- SUBFUNCTION CODE (1) (LOW BYTE).�; WD00”`eÔd³cÙ´cÚµcÛ¶c�·c›’. 02 -- BUFFER ADDRESS.?%�; WD. 03 -- BUFFER SIZE (IN WORDS).T‘; ’; BUFFER FORMAT:“;R+”; WD. 00 -- TERMINAL DEVICE NAME IN ASCII&•; WD. 01 -- OCTAL NUMBER OF TERMINAL–;F —; INPUTS:L˜;K,™; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.(š; R3=ADDRESS OF WD. 00. OF THE BUFFER.*›; R5=TCB ADDRESS OF THE REQUESTING TASK.œ;IJ�; THIS ROUTINE WILL TRY TO ABORT ALL TASKS CURRENTLY RUNNING OR ABOUT TOJž; RUN ON A TERMINAL SPECIFIED BY THE ASCII NAME AND OCTAL UNIT NUMBER INJŸ; THE BUFFER POINTED TO BY R3 IF THAT TASK HAS T3.MCR SET (IE. INITIATEDO ; BY MCR AT SOME POINT. ALL OFFSPRING TASKS WILL ALSO BE ABORTED IF THEY CANK¡; BE TRACED BACK TO THE EARLIEST PARENT TASK THAT HAS T3.MCR SET (IE. THEEM¢; OFFSPRING DOES NOT NEED TO HAVE IT SET TO BE ABORTED). A PROMPT PACKET IS K£; ISSUED FOR THE TERMINAL BECAUSE T3.MCR WILL BE CLEARED IN DREIF FOR ALLOI¤; TASKS THAT ARE ABORTED HERE. SLAVED TASKS AND THOSE NOT MATCHING THE L¥; SPECIFIED TI: WILL NOT BE ABORTED EVEN THOUGH THEY MAY HAVE PARENTS THATM¦; WILL BE. PRIVILEGED TASKS WILL BE ABORTED IF THE TERMINAL IS PRIVILEGED.IP§; IF IT IS NOT, A PRIVILEGED TASK WILL BE ABORTED ONLY IF IT HAS AN SREX STYLE>¨; ABORT AST. TKTN WILL NOT BE CALLED FOR THE TASKS ABORTED.©;OKª; AN INITIAL PASS IS MADE TO SET T4.CTC FOR ANY TASK THAT HAS T3.MCR SET, J«; DOES NOT HAVE A PARENT, AND MATCHES THE SPECIFIED TI:. THAT TASK WILLM¬; ALSO TRY TO BE ABORTED. IF ANY TASKS ARE FOUND IN THIS INITIAL PASS THAT I­; HAVE T4.CTC SET, ANOTHER PASS IS MADE THROUGH THE STD. THIS TIME THESM®; PARENTS OFF ALL TASKS ARE CHECKED TO SEE IF THEY HAVE T4.CTC SET. IF SO,GH¯; THE ORIGINAL (OFFSPRING) TASK ALSO HAS T4.CTC SET AND IS TRIED TO BEM°; ABORTED. IF ANY OF THESE TASKS ARE FOUND, ANOTHER PASS THROUGH THE STD ISOI±; DONE. EVENTUALLY NO TASKS WILL BE FOUND AND PROCESSING IS COMPLETED. L²; THIS SCHEME ONLY REQUIRES 1 PASS IF NO TASKS CAN BE ABORTED; IT REQUIRESL³; A MINIMUM OF 2 PASSES IF ANY TASKS MUST BE ABORTED AND MAY REQUIRE UP TOJ´; N PASSES WHERE N IS THE LONGEST LINKAGE OF ANY RELATIONSHIP CHAIN THAT"µ; DOESN'T WRAP AROUND ON ITSELF.¶; B·; (IS A PASS TO CLEAR T4.CTC FOR ANY TASK NOT ABORTED REQUIRED?)¸;-¹º .MCALL ABODF$ » ABODF$T¼ ½$SFABO::¾¿ .IF DF A$$CLI&C$$CTCEÀ;Á BIT #T3.PRV!T3.CLI,T.ST3(R5) ;IS TASK PRIVILEGED OR CLI?S BNE 10$ ;IF NE, YESH%à DRSTS D.RS16 ;PRIVILEGE VIOLATIONS-Ä10$: MOV (R3)+,R0 ;GET ASCII NAME OF DEVICEF&Å MOV (R3),R1 ;GET OCTAL UNIT NUMBER3Æ CALL $CVDVN ;CONVERT DEVICE NAME TO UCB ADDRESSGÇ BCC 20$ ;IF CC, SUCCESSFUL$È15$: DRSTS D.RS92 ;INVALID DEVICE6É20$: BIT #DV.TTY,U.CW1(R2);IS THIS DEVICE A TERMINALÊ BEQ 15$ ;IF EQ, NO4Ë MOV R2,-(SP) ;SAVE UCB ADDRESS ACROSS PROMPT CALL)Ì MOV #CC.EXT,R1 ;ISSUE TASK EXIT PROMPTB0Í25$: CALL $QCNTP ;ISSUE PROMPT REQUEST TO MCR$Î MOV (SP)+,R3 ;RESTORE UCB ADDRESSÏ;DNÐ; FIRST PASS TO LOOK FOR TASKS WITH MATCHING TI:, T3.MCR SET, AND NOT SLAVEDÑ;(2Ò CLR $DICSV ;CLEAR FLAG WORD FOR PROCESSED TASK-Ó MOV $TSKHD,R1 ;GET POINTER TO START OF STDI=Ô30$: MOV T.TCBL(R1),-(SP);STORE POINTER TO NEXT TASK IN STDB%Õ BEQ 40$ ;IF EQ, THIS IS NULL TASKE!Ö TST T.STAT(R1) ;IS TASK ACTIVEM× BMI 40$ ;IF MI, NO, IGNORE7× BIT #T3.CLI,T.ST3(R1);IS THIS A CLI TASK? ;JRK331P0× BNE 40$ ;IF NE, YES, SKIP THIS ONE ;JRK3318Ø CMP R3,T.UCB(R1) ;DOES THE TASK MATCH THE UCB ADDRESSÙ BNE 40$ ;IF NE, NO, IGNORE-Ú BIT #T3.SLV,T.ST3(R1);IS THIS TASK SLAVED?CÛ BNE 40$ ;IF NE, YES, IGNORER9Ü BIT #T3.MCR,T.ST3(R1);IS TASK ACTIVATED FROM TERMINAL?I'Ý BEQ 40$ ;IF EQ, NO, IGNORE THIS ONEE>Þ INC $DICSV ;INDICATE THAT WE'VE FOUND A TASK TO BE ABORTED<ß BIS #T4.CTC,T.ST4(R1);INDICATE THAT ANY OFFSPRING MUST GO*à CALL ABORT ;ABORT THE TASK IF POSSIBLE*á40$: MOV (SP)+,R1 ;RESTORE STD LINK WORD5â BNE 30$ ;IF NE, THERE ARE MORE TASKS IN THIS PASS 1ã TST $DICSV ;CHECK IF ANY TASKS WERE PROCESSED 0ä BEQ 100$ ;IF EQ, NO, SKIP ANY FURTHER PASSESå;Kæ; NEXT SET OF PASSES WILL GET TH00”heÚdÝb`TADATADATADATADATADATAE OFFSPRING OF THE TASKS RECOGNIZED ABOVEFç;E3è50$: CLR $DICSV ;RESTORE THE TASK PROCESSED FLAG-é MOV $TSKHD,R1 ;GET POINTER TO START OF STDT=ê55$: MOV T.TCBL(R1),-(SP);STORE POINTER TO NEXT TASK IN STDI%ë BEQ 80$ ;IF EQ, THIS IS NULL TASKA!ì TST T.STAT(R1) ;IS TASK ACTIVE í BMI 80$ ;IF MI, NO, IGNORE7í BIT #T3.CLI,T.ST3(R1);IS THIS A CLI TASK? ;JRK331I0í BNE 80$ ;IF NE, YES, SKIP THIS ONE ;JRK3312î BIT #T4.CTC,T.ST4(R1);IS TASK ALREADY PROCESSEDï BNE 80$ ;IF NE, YES, IGNOREF8ð MOV T.OCBH(R1),R4 ;GET POINTER TO LISTHEAD OF PARENTS;ñ BEQ 80$ ;IF EQ, ALREADY PROCESSED IN FIRST PASS, IGNOREEAò60$: MOV O.PTCB(R4),R5 ;GET NEXT PARENT TCB ADDRESS IN OCB LISTE-ó BEQ 70$ ;IF EQ, PARENT HAS EXITED, IGNORES5ô BIT #T4.CTC,T.ST4(R5) ;CHECK IF PARENT HAS BIT SETB)õ BEQ 70$ ;IF EQ, NO, GO ON TO NEXT OCBT2ö INC $DICSV ;INDICATE A TASK HAS BEEN PROCESSED=÷ BIS #T4.CTC,T.ST4(R1) ;INDICATE THIS TASK IS PART OF CHAIN)&ø BR 75$ ;GO TRY TO ABORT IT AS WELL)ù70$: MOV (R4),R4 ;GET NEXT OCB ADDRESS;"ú BNE 60$ ;IF NE, THERE ARE MORE7û BR 80$ ;NO PARENT HAS T4.CTC SET, GO ON TO NEXT TCBR?ü75$: CMP R3,T.UCB(R1) ;DOES THIS TASK MATCH THE SPECIFIED TI:L6ý BNE 80$ ;IF NE, NO, DON'T ABORT, BUT MARK AS CHAIN(þ BIT #T3.SLV,T.ST3(R1);CHECK IF SLAVED8ÿ BNE 80$ ;IF NE, IT IS, DON'T ABORT BUT MARK AS CHAIN% CALL ABORT ;TRY TO ABORT THE TASKP880$: MOV (SP)+,R1 ;RESTORE THE POINTER TO THE NEXT TCB+ BNE 55$ ;IF NE, NO MORE TO DO THIS PASST2 TST $DICSV ;CHECK IF ANOTHER PASS IS NECESSARY BNE 50$ ;IF NE, YESR100$:E .IFTF ;A$$CLI&C$$CTC4  RETURN    .IFT ;A$$CLI&C$$CTC  ; 4; SUBROUTINE TO ATTEMPT TO ABORT A PARTICULAR TASK ; INPUTS:O*; R1 - TCB ADDRESS OF TASK TO BE ABORTED; R3 - UCB OF TI:L;3ABORT: MOV R3,-(SP) ;SAVE THE TI: UCB ACROSS CALLA# TSTB T.ST2(R1) ;IS TASK EXITING?T BMI 20$ ;IF MI, NO, IGNOREB MOV #AB.CTC,R2 ;SET UP THE DEFAULT SECONDARY ABORT CODE ;JRK322A BIT #U2.PRV,U.CW2(R3) ;IS ISSUING TERMINAL PRIVILEGED ;JRK322E9 BNE 10$ ;IF NE, YES, ANY TASK MAY BE ABORTED ;JRK322H BIS #AB.NPV,R2 ;INDICATE TERM NONPRIV IN SECONDARY ABORT CODE ;JRK3229 BIT #T3.PRV,T.ST3(R1);IS TASK TO BE ABORTED PRIVILEGEDB0 BEQ 10$ ;IF EQ, NO, CAN BE ABORTED BY ANYONE5 MOV R1,-(SP) ;SAVE THE CURRENT TCB POINTER ;**-2S, MOV R1,R5 ;COPY THE TCB ADDRESS FOR CALL: MOV #AS.REA,R4 ;GET EXIT AST CODE TO SEARCH IN LIST FOR+ CALL $SRAST ;SEARCH FOR AST IN TCB LISTT( MOV (SP)+,R1 ;RESTORE THE TCB ADDRESS4 BCS 20$ ;IF CS, NO AST AND TASK CAN'T BE ABORTED*  TSTB A.NPR(R0) ;SEE IF THIS IS SREX AST.! BNE 10$ ;IF NE, IT IS, TASK MAY BE ABORTED9" BIT #T2.REX,T.ST2(R1);SEE IF ABORT AST BEING PROCESSEDI.# BEQ 20$ ;IF EQ, NO, TASK CANNOT BE ABORTED@$10$: MOV #S.CTKN,R0 ;TELL DREIF THAT TKTN SHOULD NOT BE CALLED+% CALL $ABTSK ;ABORT TASK SPECIFIED BY R14&20$: MOV (SP)+,R3 ;RESTORE THE TI: UCB ACROSS CALL ' RETURNL() .ENDC ;A$$CLI&C$$CTCT*+ .ENDC ;R$$PRO,-.;+0/; **-$SFPMN-SET PERFORMANCE MONITOR PARAMETERS0;'=1; THIS DIRECTIVE PASSES USER PARAMETERS P1 TO P8 IN THE DPBEA2; TO THE PERFORMANCE MONITOR USING THE SPM HOOKPOINT MECHANISM.S@3; SPM HOOKPOINTS ARE TURNED ON AND OFF ON THE FLY BY REPLACINGI4; TWO INSTRUCTION WORDS WITH AN INSTRUCTION TO TRANSFER CONTROL TO SPM.A5;6; DPB FORMAT:A7;T%8; WD. 00 -- DIC(169.),DPB SIZE(10.)R09; WD. 01 -- SUBFUNCTION CODE (11.) (LOW BYTE).:; WD. 02 -- PARAMETER #1;; WD. 03 -- PARAMETER #2<; WD. 04 -- PARAMETER #3=; WD. 05 -- PARAMETER #4>; WD. 06 -- PARAMETER #5?; WD. 07 -- PARAMETER #6@; WD. 08.-- PARAMETER #7A; WD. 09.-- PARAMETER #8B;H C; INPUTS:AD;S#E; R3=ADDRESS OF WD. 02 IN THE DPBD&F; R5=TCB ADDRESS OF THE CURRENT TASKG;T H; OUTPUTS:I;N@J; THE 8. DPB PARAMETERS ARE PASSED TO THE PERFORMANCE MONITOR.K;L;-MNO .IF DF P$$MON.PQ;+R; ** W A R N I N G **(S;(T; SPM HOOKPOINT NUMBER 34.U; +V; DO NOT CHANGE THE INSTRUCT00”pe•ue³cÙ´cÚµcÛ¶c�·c›’ION FOLLOWING W; LABEL WITHOUT CHECKING SPMX;-Y-Z$SPH34==. ;SPM CHANGES THE INSTRUCTION ATE![ ;THE LOCATION OF THIS LABEL\ ]$SFPMN::^ NOP_ NOP ` RETURN ;a .ENDCbc;+/d; **-$SFUPD-UPDATE UICS AND DEFAULT DIRECTORY #e; ALTERNATE ENTRY POINT TO $SFUICNf; Hg; THIS DIRECTIVE TAKES THE DEFAULT UIC AND THE PROTECTION UIC FROM THEMh; UCB OF THE TERMINAL (U.UIC AND U.LUIC) AND COPIES THEM INTO THE HEADER OFOMi; THE TASK (H.DUIC AND H.CUIC RESPECTIVELY). IT SETS THE DEFAULT DIRECTORYEKj; OF THE TASK TO BE THE SAME AS THE DEFAULT DIRECTORY OF THE TERMINAL, IFA(k; DIFFERENT. IT THEN JUMPS TO $SFUIC.l;Sm; DPB FORMAT:n;%o; WD. 00 -- DIC(169.),DPB SIZE(4.). 0p; WD. 01 -- SUBFUNCTION CODE (17.) (LOW BYTE).q; WD. 02 -- BUFFER ADDRESS.N%r; WD. 03 -- BUFFER SIZE (IN WORDS).Fs;Ut; BUFFER FORMAT:u; 'v; DESCRIBED (AND FILLED IN) IN $SFUICAw;L x; INPUTS:Ey;M1z; R2 - NUMBER OF EXTRA WORDS IN THE USER BUFFERI({; R3 - ADDRESS OF WD. 00 IN THE BUFFER/|; R5 - ADDRESS OF THE TCB OF THE CURRENT TASKA};I ~; OUTPUTS:;I>€; THE UICS IN THE HEADER OF THE REQUESTING TASK ARE UPDATED.M�; THE DEFAULT DIRECTORY STRING FOR THE TASK IS SET TO THAT OF THE TERMINAL.T‚;Oƒ;7„;-… .MCALL LNMDF$ † LNMDF$R‡ ˆ$SFUPD::‰ .IF DF X$$HDRŠ(‹ MOV KISAR6,-(SP) ;SAVE BUFFER MAPPING%Œ MOV $SAHDB,KISAR6 ;MAP TASK HEADERF)� MOV $SAHPT,R0 ;GET TASK HEADER ADDRESSMŽ� .IFF ;DF X$$HDR�)‘ MOV $HEADR,R0 ;GET TASK HEADER ADDRESSH’“ .IFTF ; DF X$$HDR”!• MOV T.UCB(R5),R1 ;GET TI: UCB:– MOV U.UIC(R1),H.DUIC(R0) ;MOVE DEFAULT UIC INTO HEADER=— MOV U.LUIC(R1),H.CUIC(R0) ;MOVE PROTECTION UIC INTO HEADERE˜™ .IFT ;DF X$$HDRš,› MOV (SP)+,KISAR6 ;RESTORE BUFFER MAPPINGœ� .ENDC ;DF X$$HDRDž"Ÿ; RESET DEFAULT DIRECTORY STRING =¡ CMP T.CTX(R5),U.CTX(R1) ;IS TERMINAL CONTEXT SAME AS TASK?$¢ BEQ 10$ ;IF EQ, INDICATE SUCCESS)£ MOV T.CTX(R5),R1 ;GET TERMINAL CONTEXTE-¤ CALL $DLCTX ;DELETE TASKS CURRENT CONTEXT;&¥ MOV T.UCB(R5),R1 ;GET TI: UCB AGAIN@¦ MOV U.CTX(R1),T.CTX(R5) ;SET TASK CONTEXT TO TERMINAL CONTEXT§ BEQ 10$ ;IF EQ, DONE!¨ MOV KISAR6,-(SP) ;SAVE MAPPINGH*© MOV U.CTX(R1),KISAR6 ;MAP CONTEXT BLOCK/ª INCB C.REF+140000 ;INCREMENT REFERENCE COUNTC$« MOV (SP)+,KISAR6 ;RESTORE MAPPING¬,­10$: JMP $SFUIC ;FILL IN BUFFER WITH INFO®¯° .END SAME AS TASK?$¢ BEQ 10$ ;IF EQ, INDICATE SUCCESS)£ MOV T.CTX(R5),R1 ;GET TERMINAL CONTEXTE-¤ CALL $DLCTX ;DEL .TITLE DREIFC .IDENT /15.07/C; ; COPYRIGHT (C) 1987$; BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;D>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;T ; D. N. CUTLER 13-SEP-73 ;a ;- ; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:H ;  ; J. W. BERZLE ; J. R. KAUFFMAN ; J. M. LAWLER ; B. S. MCCARTHY ; L. B. MCCULLEY ;. ; MODIFIED BY: ; # ; B. S. MCCARTHY 20-OCT-86 15.00 ;D+ ; BM374 -- ADD LAT APPLICATIONS TERMINAL ; DISCONNECT CALL ;A# ; B. S. MCCARTHY 13-DEC-86 15.01 ;H" ; BM377 -- MOVE DREIF TO DIR11M ;A# ; B. S. MCCARTHY 6-MAR-87 15.02  ;D3 ; BM385 -- ADD $RLMCB TO DREIF SO THAT DRGCL CAN  ; BE MOVED TO VEC11M ;# ; B. S. MCCARTHY 7-MAR-87 15.03. ;H5 ; BM387 -- IF WINDOW I/O MANAGEMENT IS ENABLED AND - ; I/O IS OUTSTANDING ON A LUN WITH A FILE3 ; OPEN AT I/O RUNDOWN, DON'T DEACCESS THE FILE.O ; # ; B. S. MCCARTHY 8-MAY-87 15.04P ;T* ; BM397 -- FIX VARIOUS MAPPING PROBLEMS ; % ; L. M. ZIEGLER 12-JUNE-1987 15.05 ;B= ; LMZ048 -- ADD SUPPORT FOR REMOTE TASK TERM. NOTIFICATION7 ;0" ; K. L. NOEL 24-JUNE-1987 15.06 ;I= ; KLN054 -- ADD SPECIAL CASE CODE FOR REMOTE TASK KILL I/O  ;T$ ; B. S. MCCARTHY 14-AUG-87 15.07 ;F* ; BM397 -- FIX VARIOUS MAPPING PROBLEMS ;  ;T7; EXIT DIRECTIVESH8;L9; MACRO LIBRARY CALLSD:;D;3< .MCALL 00•xeÚdÝb`TADATADATADATADATADATAABODF$,HDRDF$,PCBDF$,PKTDF$,TCBDF$,BGCK$A- < .MCALL CPRDF$ ; LMZ048< ; LMZ048< CPRDF$ ; LMZ048=$> ABODF$ ;DEFINE TASK ABORT CODES'? HDRDF$ ;DEFINE TASK HEADER OFFSETSF3@ PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS&A PKTDF$ ;DEFINE I/O PACKET OFFSETS.B TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETSCDE .IF DF A$$CNTFG .MCALL ACNDF$,H ACNDF$ ;DEFINE ACCOUNTING BLOCK OFFSETSIJ .ENDCKL .IF DF L$$GCLMN .MCALL LNMDF$O P LNMDF$HQR .ENDCSTU;BV; LOCAL SYMBOL DEFINITION W;MX2YCLRMSK=T2.AST!T2.DST!T2.SEF!T2.HLT!T2.ABO!T2.REX?ZCLRMSK=CLRMSK!<*2>!T2.STP!T2.SPN!T2.WFRK$ZMAP6=140000 ;APR 6 ; LMZ048[\;+]; **-$DREIF-EXIT IF^;TI_; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TERMINATE THE EXECUTION OF THEFC`; ISSUING TASK IF, AND ONLY IF, AN INDICATED EVENT FLAG IS CLEAR.Fa;Cb; DPB FORMAT:Fc;$d; WD. 00 -- DIC(53.),DPB SIZE(2.).Ae; WD. 01 -- EVENT FLAG NUMBER OF EVENT FLAG THAT MUST BE CLEAR. f; g; INPUTS:Th;i; R0=EVENT FLAG MASK WORD.j; R1=EVENT FLAG MASK ADDRESS.;k; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.K-l; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.+1m; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.I.n; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.o;F7p; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)Aq;C/r; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.->s; DIRECTIVE STATUS OF 'D.RS22' IS RETURNED IF THE SPECIFIEDt; EVENT FLAG IS SET.!u; C=1 IF DIRECTIVE IS REJECTED.0;v; DIRECTIVE STATUS OF 'D.RS97' IF NO OR AN INVALID EVENT w; FLAG NUMBER IS SPECIFIED.Dx;-y z .ENABL LSBz ; BM377A z .IF NDF D$$PAR ; BM377z ; BM377 ){$DREIF::BIT R0,(R1) ;EVENT FLAG CLEAR?C| BEQ $DREXT ;IF EQ YESF&} DRSTS D.RS22 ;SET DIRECTIVE STATUS~;+€; **-$DREXT-EXIT�;FI‚; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TERMINATE THE EXECUTION OF THESƒ; ISSUING TASK.E„;D…; DPB FORMAT:G†;E$‡; WD. 00 -- DIC(51.),DPB SIZE(1.).ˆ; ‰; INPUTS:AŠ;F;‹; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.E-Œ; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. 1�; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. .Ž; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.�;R?�; NOTE: THIS DIRECTIVE IS ALSO CALLED FROM THE DISPATCHER ANDT9‘; THEREFORE ONLY REQUIRES R5 TO BE LOADED ON ENTRANCE.E’;R?“; PRIVILEGED TASKS WHICH DESIRE TO CALL $DREXT DIRECTLYA>”; SHOULD SWITCH TO SYSTEM STATE AND IMMEDIATELY CALL $DREXT0•; WITHOUT CALLING ANY OTHER EXEC SUBROUTINES.0–; THIS IS BECAUSE OF POSSIBLE SIDE EFFECTS OF*—; OTHER EXEC ROUTINES (SUCH AS $TSKRP).˜; 2™; BECAUSE MANY PRIVILEGED TASKS CALL $DREXT, WE5š; WILL UNCONDITIONALLY MAP THE TASK HEADER SO THATO3›; THIS CODE DOES NOT HAVE TO BE ADDED ELSEWHERE. œ;�;T7ž; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)RŸ; B ; NO STATUS IS RETURNED TO THE ISSUING TASK SINCE THIS DIRECTIVE¡; TERMINATES ITS EXECUTION.D¢;-£¤$DREXT:: ;REFERENCE LABELL¥¦§ .IF DF X$$HDR¨-© MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADERTª« .ENDC ; DF X$$HDR¬­® .IF DF P$$OFF¯)° BIT #T3.ACP,T.ST3(R5) ;IS TASK AN ACP?E± BNE $DREX1 ;IF NE YESO7² MOV #EX$SUC,T.EFLG+2(R5) ;SET SUCCESSFUL EXIT STATUSO@³$DREX2::MOV #S.CEXT,T.EFLG(R5) ;SET SUCCESS CODE IN ABORT CODE´µ .ENDC¶· ¸$DREX1::¹¹ ; BM377R"¹ .IFF ; NDF D$$PAR ; BM377¹ ; BM377M7¹$DREX3:: ;REFERENCE LABEL FOR STUB ROUTINE ; BM377 ¹ ;IN DRSUB ; BM377H¹ .IF DF K$$DAS ; BM397 ¹ ; BM397D¹ MOV KINAR5,KDSAR5 ;REMAP IN D SPACE (IN CASE CALLED FROM ; BM397¹ ;SCHEDULER) ; BM397¹ ; BM397E"¹ .ENDC ; DF K$$DAS ; BM397¹ ; BM377U#¹ .ENDC ; NDF D$$PAR ; BM377;¹ ; BM377BÀ ;**-6NÁ .IF DF, G$$GEF1ÂÃ,Ä BIT #T2.AST,T.ST2(R5) ;TASK IN AST STATE?Å BEQ 500•€eue³cÙ´cÚµcÛ¶c�·c›’6$ ;IF EQ NO 0Æ BIT #T2.WFR*2,T.ST2(R5) ;WAS TASK IN AST WFR?Ç BEQ 56$ ;IF EQ NO 1È MOV H.EFSV(R4),R3 ;GET EVENT FLAG MASK ADDRESSM2É CALL $DEAGF ;DEACCESS GROUP GLOBAL EVENT FLAGSÊ56$:,Ë MOV $SAHPT,R4 ;GET ADDRESS OF TASK HEADER0Ì CALL $UNLCK ;UNLOCK GROUP GLOBAL EVENT FLAGS#Í BCS 57$ ;IF CS ALREADY UNLOCKED +Î CALL $ELIM ;ELIMINATE THEM IF NECESSARY )Ï57$: MOV $TKTCB,R5 ;RESTORE TCB POINTER*ÐÑ .ENDC ; DF G$$GEFÒ*Ó CALL $DRCMT ;CANCEL MARK TIME REQUESTSÔÕÖ .IF DF D$$MND×4Ø CMP $TKTCB,$DITCB ;IS DIAMOND WATCHING THIS TASK?Ù BNE 101$ ;IF NE NO)Ú BIC #1,@$DICSR ;RESET DIAMOND REGISTERS!Û CLR $DITCB ;CLEAR TCB ADDRESS Ü101$: ;REFERENCE SYMBOLÝÞ .ENDCßàá .IF DF C$$INTâ&ã MOV T.PCB(R5),R4 ;POINT TO TASK PCB=ä BIT #PS.CHK,P.STAT(R4) ;DOES TASK POSSIBLY HAVE ANY ITB'S?;å BEQ 2$ ;IF EQ NO1æ1$: MOV P.DPCB(R4),R1 ;PICK UP NEXT ITB POINTERç BEQ 2$ ;IF EQ NONE LEFTè .IF DF D$$PARé5ê MOV #$DISIN,-(SP) ;PUSH ADDRESS OF DISABLE ROUTINEC.ë CALL $MPDC2 ;CALL THROUGH INDIRECT ROUTINEìí .IFF ; DF D$$PARî,ï CALL $DISIN ;DISCONNECT INTERRUPT VECTORðñ .ENDC ; DF D$$PARò ó BR 1$ ;Eô2$: ;REF LABELõö .ENDC÷øù .IF DF M$$PROú)û CLR T.RRM(R5) ;REMOVE ALL CPU AFFINITYSüý .ENDCþÿ .IF DF D$$PAR1 MOV $DRAPR,KINAR5 ;MAP THE DIRECTIVE PARTITIONC .ENDC+  CALL $RLMCB ;RELEASE MCR COMMAND BUFFERP.  CMP R5,$LSTLK ;TASK OWN MCR DATA BASE LOCK?  BNE 3$ ;IF NE NO'  CLR $LSTLK ;CLEAR OWNER TCB ADDRESS- 3$: BIS #T2.HLT,T.ST2(R5) ;SET TO HALT TASKD+ CLRB $CXDBL ;CLEAR CONTEXT DISABLE FLAG 8 MOV T.SAST(R5),R0 ;GET ADDRESS OF SPECIFIED AST BLOCK BEQ 5$ ;IF EQ LIST IS EMPTY< MOV R0,@T.ASTL+2(R5) ;MOVE SPECIFIED AST LIST TO AST LIST54$: MOV R0,R1 ;COPY ADDRESS OF SPECIFIED AST BLOCK;* MOV (R0),R0 ;GET ADDRESS OF NEXT BLOCK, BNE 4$ ;IF NE THERE ARE MORE IN THE LIST% MOV R1,T.ASTL+2(R5) ;SET LIST TAILD+ CLR T.SAST(R5) ;ASTS NO LONGER SPECIFIED$#5$: JSR R5,MTQUE ;EMPTY AST QUEUE$. .WORD T.ASTL ;OFFSET TO AST QUEUE LISTHEAD1 .WORD $DEACB ;ADDRESS OF DEALLOCATION ROUTINES5 BIT #T3.NSD!T3.ACP,T.ST3(R5) ;FLUSH RECEIVE QUEUE?5 BNE 7$ ;IF NE NO .IF DF P$$OOL# CALL MTRCVL ;EMPTY RECEIVE LISTT ! .IFF0"$# JSR R5,MTQUE ;EMPTY RECEIVE QUEUE2$ .WORD T.RCVL ;OFFSET TO RECEIVE QUEUE LISTHEAD1% .WORD $DEPKT ;ADDRESS OF DEALLOCATION ROUTINE.&' .ENDC()*7$: ;REF LABEL5+, .IF DF X$$HDR-1. MOV $SAHPT,R4 ;GET CURRENT TASK HEADER ADDRESST/0 .IFFT112 MOV $HEADR,R4 ;GET CURRENT TASK HEADER ADDRESSA34 .ENDC567 .IF DF P$$LAS8*9 BIT #T3.REM,T.ST3(R5) ;REMOVE ON EXIT ?6: BNE 71$ ;IF NE, YES - $REMOV WILL HANDLE THIS CASE; MOV R5,R0 ;COPY TCB ADDRESS0< CALL $CLSRF ;REMOVE IT FROM ALL RREF PACKETS=71$: ;REFERENCE LABEL1> JSR R5,MTQUE ;EMPTY RECEIVE BY REFERENCE QUEUET3? .WORD T.RRFL ;OFFSET TO RECEIVE BY REF LISTHEADE1@ .WORD $DEPKT ;ADDRESS OF DEALLOCATION ROUTINE AB .ENDCCD>E8$: MOV #SCNLN,-(SP) ;SET ADDRESS OF LUT SCANNING CO-ROUTINE'F TSTB T.IOC(R5) ;ANY I/O OUTSTANDING?FG BNE 9$ ;IF NE YES#5H TSTB T.TIO(R5) ;TASK HAVE OUTSTANDING BUFFERED I/O I BEQ 30$ ;IF EQ NOEI9$: ; KLN054 .I .IF DF C$$RTK ;IF REMOTE TASK ; KLN054I ; KLN054=I BIT #F5.RTK,$FMSK5 ;ARE REMOTE TASKS BEING USED ; KLN054E"I BEQ 99$ ;IF EQ NO ; KLN054I; ; KLN054LNI; ALLOCATE A PACKET FOR THE GENERIC DRIVER TO USE TO KILL I/O WITH ; KLN054I; ; KLN054S,I CLR $CPPKT ;ASSUME NO PACKET ; KLN0548I CLR $CPLUN ;INDICATE ALL I/O TO BE KILLED ; KLN054I ; KLN054<I TSTB T.LBN(R5) ;TASK HAD ANY CONTACT WITH HOST? ; KLN054;I BEQ 99$ ;IF EQ NO, NO NEED TO ALLOCATE CPRBUF ; KLN054 I ; KLN054JI MOV #AL$SWS,R0 ;INDICATE THAT WE ARE CALLING FROM SYSTEM STATE ; KLN054-I MOV #1,R1 ;GET JUST ONE BLOCK ; KLN054 .I CALL 00•ˆeÚdÝb`TADATADATADATADATADATA$CPALO ;ALLOCATE A PACKET ; KLN0544I BCC 92$ ;IF CC - ALLOCATION SUCCEEDED ; KLN054*I CLR R0 ;INDICATE NO PACKET ; KLN054FI92$: MOV R0,$CPPKT ;SAVE PACKET ADDRESS FOR GENERIC DRIVER ; KLN054I ; KLN054 I .ENDC ;C$$RTK ; KLN054I99$: ; KLN054AI BIT #T2.ABO,T.ST2(R5) ;TASK ALREADY MARKED FOR ABORT ; KLN054 K BNE 10$ ;IF NE YES ;**-1'L MOV #S.IOMG,R0 ;SET REASON FOR ABORTS#M CALL $ABCTK ;ABORT CURRENT TASKGCN10$: MOV (SP),-(SP) ;DUPLICATE ADDRESS OF LUT SCANNING CO-ROUTINE *O20$: CALL @(SP)+ ;GET NEXT ASSIGNED LUN,P BCS 30$ ;IF CS END OF LOGICAL UNIT TABLE2Q CALL $IOKIL ;KILL I/O ON UNIT FOR CURRENT TASKR BR 20$ ;GO AGAINR30$: ;KLN054 R .IF DF C$$RTK ;KLN054 R ;KLN054 =R BIT #F5.RTK,$FMSK5 ;ARE REMOTE TASKS BEING USED? ;KLN054O!R BEQ 35$ ;IF EQ NO ;KLN054 R ;KLN054M8R MOV $CPPKT,R0 ;GET ADDRESS OF CPRBUF PACKET ;KLN0549R BEQ 35$ ;IF NONE, IT WAS ALREADY DEALLOCATED ;KLN054O7R CALL $CPDEA ;OTHERWISE, DEALLOCATE IT NOW ;KLN054 R ;KLN0543R .ENDC ;C$$RTK ;KLN054BR35$: ;KLN054 1R CALL @(SP)+ ;GET NEXT ASSIGNED LUN ;KLN0544T BCS 100$ ;IF CS END OF LOGICAL UNIT TABLE ;**-1T ; BM374N%T .IF DF M$$NET&T$$LTH ; BM374 T ; BM374K7T CALL LTPRE ;TELL LAT PROCESS IF NECESSARY ; BM374KT ; BM374,(T .ENDC ; DF M$$NET&T$$LTH ; BM374T ; BM374E7U CMP $TKTCB,U.ATT(R5) ;UNIT ATTACHED TO CURRENT TASK?OV BNE 40$ ;IF NE NO *W MOV #IO.DET,R4 ;SET DETACH I/O FUNCTION X BR 50$ ;'Y40$: MOV (R1),R2 ;FILE OPEN ON UNIT?Z BEQ 30$ ;IF EQ NO '[ ASR R2 ;ACCESS OR DEACCESS PENDING?F\ BCS 30$ ;IF CS YES4\ BIT $WCFLG,U.CW1(R5) ;DEVICE FILES-11? ; BM3870\ BEQ 45$ ;IF EQ NO, ALWAYS DEACCESS ; BM387A\ TSTB W.IOC(R2) ;I/O IN PROGRESS THROUGH WINDOW BLOCK? ; BM387M0\ BNE 30$ ;IF NE YES, DON'T DEACCESS ; BM387;\45$: MOV #IO.CLN,R4 ;SET CLOSE LUN I/O FUNCTION ; BM387 -^50$: CMP (SP)+,(SP)+ ;CLEAN STACK ;**-1#0_ MOV R1,-(SP) ;SAVE ADDRESS OF SECOND LUN WORD-` MOV #I.LGTH,R1 ;SET LENGTH OF BLOCK NEEDEDQ$a CALL $ALOCB ;ALLOCATE I/O PACKET4b MOV (SP)+,R3 ;RETRIEVE ADDRESS OF SECOND LUN WORD&c BCS TKWSE ;IF CS NO CORE AVAILABLE)d MOV R0,R1 ;COPY ADDRESS OF I/O PACKETS#e TST (R0)+ ;POINT TO SECOND WORD 4f MOV $TKTCB,R2 ;GET ADDRESS OF TCB OF CURRENT TASK/g MOVB T.IOC(R2),-(SP) ;SAVE CURRENT I/O COUNT#2h INCB T.IOC(R2) ;INCREMENT OUTSTANDING I/O COUNT-i MOVB T.PRI(R2),(R0)+ ;SET REQUEST PRIORITY'j CLRB (R0)+ ;CLEAR EVENT FLAG NUMBER 0k MOV R2,(R0)+ ;INSERT CURRENT TASK TCB ADDRESS2l MOV R3,(R0)+ ;INSERT ADDRESS OF SECOND LUN WORD#m MOV R5,(R0)+ ;INSERT UCB ADDRESS )n MOV R4,(R0)+ ;INSERT I/O FUNCTION CODEE@o MOV #/2,-(SP) ; WORDS REMAINING IN I/O PACKET1p55$: CLR (R0)+ ; CLEAR REMAINDER OF I/O PACKETTq DEC (SP) ; DONE?r BNE 55$ ; IF NE NO,s MOV #$DRQRQ,(SP) ; ASSUME QUEUE TO DRIVER+t CMP #IO.CLN,R4 ; CLOSE LUN I/O FUNCTION?2u BNE 70$ ; IF NE NO$v MOV (R3),R4 ; GET WINDOW ADDRESSw INC (R3) ; INTERLOCK LUN2x MOV U.VCB(R5),R3 ; GET VCB ADDRESS, REALLY ONE?y BEQ 60$ ; IF EQ NO1z INC (R3) ; INCREMENT VOLUME TRANSACTION COUNTV+{ BIT #DV.F11,U.CW1(R5) ; FILES-11 DEVICE?#| BEQ 60$ ; IF EQ NO.} INCB W.IOC(R4) ; INCREMENT WINDOW I/O COUNT~;+€; ** W A R N I N G **T�;D‚; SPM HOOKPOINT NUMBER 21.ƒ;N+„; DO NOT CHANGE THE INSTRUCTION FOLLOWINGR…; LABEL WITHOUT CHECKING SPM†;-‡-ˆ$SPH21==. ;SPM CHANGES THE INSTRUCTION AT4!‰ ;THE LOCATION OF THIS LABEL Š!‹ MOV U.ACP(R5),R0 ; SET ACP TCB +Œ MOV #$EXRQP,(SP) ; QUEUE DIRECTLY TO ACPF1�60$: BISB #200,I.EFN(R1) ; SET VIRTUAL I/O FLAG 5Ž MOV T.ATT(R2),R3 ; GET FIRST ATTACHMENT DESCRIPTOR+� INCB A.IOC-A.TCBL(R3) ; LOCK DOWN HEADERR5� MOV A.PCB-A.TCBL(R3),R3 ; POINT TO TASK REGION PCB*4‘ INCB P.IOC(R3) ; LOCK REGION BY INC'ING I/O COUNT0’70$: CALL @(SP)+ ; QUEUE THE PACKET SOMEWHERE“00•�eue³cÙ´cÚµcÛ¶c�·c›’” .IF DF X$$HDR•&– MOV $SAHDB,KISAR6 ; RESTORE MAPPING—˜ .ENDC™4š MOV $TKTCB,R5 ;GET ADDRESS OF TCB OF CURRENT TASK2› CMPB T.IOC(R5),(SP)+ ;REQUEST ALREADY FINISHED?!› BHI 80$ ;IF HI NO ; BM387)› JMP 8$ ; ; BM387@�80$: MOV T.ASTL(R5),R0 ;GET ADDRESS OF FIRST AST BLOCK ;**-1 ž BEQ 85$ ;IF EQ THERE IS NONEŸ TSTB A.CBL(R0) ;KERNEL AST ?T4  BMI TKWSE ;IF MI YES, RUNDOWN BIT MIGHT DEADLOCK:¡85$: BIS #TS.RDN,T.STAT(R5) ;SET I/O RUNDOWN IN PROGRESS1¢TKWSE: CALLR $TKWSE ;WAITFOR SIGNIFICANT EVENT,2£100$: TSTB T.IOC(R5) ;ANY I/O STILL OUTSTANDING?¤ BNE 80$ ;IF NE YES5¥ TSTB T.TIO(R5) ;TASK HAVE OUTSTANDING BUFFERED I/OA¦ BNE 80$ ;IF NE YES § .DSABL LSB -¨RNDWN: ;PARENT/OFFSPRING-RELATED RUNDOWN:©ª« .IF DF P$$OFF¬3­ MOV $TSKHD,R0 ;POINT TO FIRST INSTALLED TASK TCBE8®20$: TST T.RDCT(R5) ;ANY RUNDOWN OPERATIONS REMAINING?¯ BEQ 60$ ;IF EQ NO <° MOV T.TCBL(R0),-(SP) ;SAVE POINTER TO NEXT INSTALLED TASK,± BEQ 30$ ;IF EQ CURRENT TASK IS NULL TASK-² ADD #T.OCBH,R0 ;POINT TO OCB QUEUE OF TASK 0³25$: MOV (R0),R0 ;POINT TO NEXT ENTRY IN LIST ´ BEQ 30$ ;IF EQ THERE IS NONE1µ CMP O.PTCB(R0),R5 ;IS EXITING TASK THE PARENT?B¶ BNE 25$ ;IF NE NOR*· DEC T.RDCT(R5) ;DECREMENT RUNDOWN COUNT3¸ CLR O.PTCB(R0) ;INDICATE PARENT TASK HAS EXITTEDS¹º .IF DF G$$GEF»0¼ CMP O.EFN(R0),#64. ;GROUP GLOBAL EVENT FLAG ?½ BLOS 25$ ;IF LOS NO!¾ MOV R0,-(SP) ;SAVE OCB POINTER *¿ MOV O.EFN(R0),R0 ;GET EVENT FLAG NUMBER0À CALL $CEFI ;CONVERT TO MASK AND MASK ADDRESS+Á MOV R1,R3 ;COPY EVENT FLAG MASK ADDRESSP2 CALL $DEAGF ;DEACCESS GROUP GLOBAL EVENT FLAGS$à MOV (SP)+,R0 ;RESTORE OCB POINTERÄÅ .ENDC ; DF G$$GEFÆ"Ç BR 25$ ;TRY TO REMOVE ANY MORE(È30$: MOV (SP)+,R0 ;RESTORE TCB ADDRESSÉ BNE 20$ ;IF NE NO ÊËÌ .IF DF V$$TRMÍ6Î MOV $VTDCB,R1 ;POINT TO SECOND VIRTUAL TERMINAL UCB9Ï40$: TST T.RDCT(R5) ;ANY OUTSTANDING CREATED VT: UNITS?NÐ BEQ 60$ ;IF EQ NOR4Ñ CMP D.NAM(R1),#"VT ;STILL GOING THROUGH VT UNITS?Ò BEQ 45$ ;IF EQ YES1Ó RETURN ;ELSE $ALOCB FAILURE IN $ELMVT - WAIT /Ô45$: MOV (R1),-(SP) ;SAVE ADDRESS OF NEXT DCBV2Õ MOV D.UCB(R1),R0 ;POINT TO VIRTUAL TERMINAL UCB<Ö CMP U.PTCB(R0),R5 ;WAS THIS UNIT CREATED BY EXITING TASK?× BNE 50$ ;IF NE NOS+Ø CALL $ELMVT ;MARK UNIT FOR DEALLOCATION$&Ù50$: MOV (SP)+,R1 ;POINT TO NEXT DCB Ú BR 40$ ;ÛÜ .ENDCÝÞß .ENDCàá6â60$: ADD #T.ST2,R5 ;POINT TO SECOND TASK STATUS WORD+ã BIT #T2.ABO,(R5) ;TASK MARKED FOR ABORT? ä BEQ 110$ ;IF EQ NO:å MOV $TKNPT,R0 ;GET TERMINATION NOTIFICATION TCB ADDRESSæç .IF DF R$$PROèBé .IIF NDF P$$OFF, .ERROR ;P/OS REQUIRES PARENT OFFSPRING SUPPORT*ê BNE 2000$ ;IF NE TKTN IS IN THE SYSTEM+ë TST T.OCBH-T.ST2(R5);TASK HAVE A PARENT?N1ì BNE 110$ ;IF NE YES - OK, GO ON WITH THE EXITCí BGCK$A BF.XIT,BE.NPA,FATAL ;A SYSTEM TASK (ONE WITHOUT A PARENT)&î ;ABORTED WITH NO TKTN - BUGCHECKïð .IFF ;R$$PROAñ-ò BEQ 110$ ;IF EQ TKTN IS NOT IN THE SYSTEMRóô .ENDC ;R$$PROõGö2000$: CMP $TKTCB,R0 ;TERMINATION NOTIFICATION TASK BEING TERMINATED?÷ BEQ 103$ ;IF EQ YESIAø CMPB #S.CTKN,T.EFLG-T.ST2(R5) ;PREVENT TKTN FROM BEING CALLED?Eù BNE 101$ ;IF NE, NO Aú BIC #T3.MCR,T.ST3-T.ST2(R5) ;PREVENT PROMPT FROM BEING ISSUED0 û BR 110$ ;CONTINUE PROCESSINGü101$:3ý BIS #TS.MSG,-(R5) ;SET ABORT MESSAGE IN PROGRESSU6þ CALL $EXRQN ;REQUEST TERMINATION NOTIFICATION TASK+ÿ CALLR $TKWSE ;WAITFOR SIGNIFICANT EVENTK/103$: MOV $ACTHD,R0 ;GET ADDRESS OF FIRST TCB9107$: BIC #TS.MSG,T.STAT(R0) ;CLEAR WAITING FOR MESSAGEN0 BIC #T2.ABO,T.ST2(R0) ;CLEAR MARKED FOR ABORT- MOV T.ACTL(R0),R0 ;GET ADDRESS OF NEXT TCBN TST T.ACTL(R0) ;NULL TASK?, BNE 107$ ;IF NE MORE TO GO*110$: BIS #TS.EXE,-(R5) ;DEACTIVATE TASK= BIC #TS.CKR!TS.CIP!TS.MSG!TS.RUN,(R5)+ ; CLEAR STATUS BITS; BIC #CLRMSK,(R5)+ ;?  MOVB T.DPRI-T.ST3(R5),T.PRI-T.ST3(R5) ;RESTORE TASK PRIORITY   .IF DF L$$GCL )  MOV R5,R0 ;GET POINTER00•˜eÚdÝb`TADATADATADATADATADATA TO CURRENT TCBT SUB #T.ST3,R0 ;IN R0; MOV #LT.TSK,R1 ;INDICATE THAT DELETING ALL TASK LOGICALSB9 MOV #$LDELX,-(SP) ;JMP TO DELETE ROUTINE IN 4TH DIRCOM(2 CALL $MPDC3 ;MAP THE COMMON AND JMP TO ROUTINE .ENDC, MOV T.PCB-T.ST3(R5),R0 ;POINT TO TASK PCB .IF DF M$$PROD CLR T.RRM-T.ST3(R5) ;ASSUME TASK WAS NOT INSTALLLED WITH AFFINITYA BIT #T2.AFF,T.ST2-T.ST3(R5) ;WAS TASK INSTALLED WITH AFFINITY?K BEQ 115$ ;NO IF EQ< MOV P.RRM(R0),T.RRM-T.ST3(R5) ;RESTORE INSTALLED AFFINITY .ENDC !5"115$: BIT #PS.FXD,P.STAT(R0) ;TASK FIXED IN MEMORY?C# BNE 130$ ;IF NE YES)E$120$: BIS #PS.COM,P.STAT(R0) ;CONVERT TASK REGION TO UNNAMED COMMON % CLR P.ST2(R0) ;& CLR P.NAM(R0) ;' CLR P.NAM+2(R0) ;.( MOV P.MAIN(R0),-(SP) ;SAVE MAIN PCB POINTER2) MOV R5,-(SP) ;SAVE ADDRESS OF THIRD STATUS WORD:*125$: MOV (SP),R5 ;PICK UP ADDRESS OF THIRD STATUS WORD>+ MOV T.ATT-T.ST3(R5),R5 ;POINT TO NEXT ATTACHMENT DESCRIPTOR!, BEQ 126$ ;IF EQ THERE IS NONET:- SUB #A.TCBL,R5 ;POINT TO START OF ATTACHMENT DESCRIPTOR*. MOV A.TCB(R5),R0 ;POINT TO ATTACHED TCB!/ MOV A.PCB(R5),R1 ;POINT TO PCB,#0 TSTB A.MPCT(R5) ;IS TASK MAPPED?N1 BEQ 1257$ ;NO IF EQ2-2 CLRB P.PRI(R1) ;INITIALIZE REGION PRIORITY;3 MOV R1,R2 ;COPY PCB ADDRESSA*4 ADD #P.ATT,R2 ;POINT TO ATTACHMENT LIST551251$: MOV (R2),R2 ;GET NEXT ATTACHMENT DESCRIPTORD 6 BEQ 1252$ ;IF EQ END OF LIST*7 TSTB A.MPCT-A.PCBL(R2) ;IS TASK MAPPED?8 BEQ 1251$ ;IF EQ NO +9 MOV A.TCB-A.PCBL(R2),R3 ;GET TCB ADDRESSI8: ADD #T.ST3,R3 ;CALCULATE ADDRESS OF THIRD STATUS WORD&; CMP R3,(SP) ;SAME AS CURRENT TASK?< BEQ 1251$ ;IF EQ YES3= CMPB T.PRI-T.ST3(R3),P.PRI(R1) ;HIGHER PRIORITY?E> BLO 1251$ ;IF LO NOI/? MOVB T.PRI-T.ST3(R3),P.PRI(R1) ;SET PRIORITY 7@ INCB P.PRI(R1) ;PRIO OF COMMON IS ONE MORE THAN TASK2A BR 1251$ ;GO AGAIN9B1252$: CLRB A.MPCT(R5) ;CLEAR MAPPING COUNT INTO REGIONTCDE .IF DF M$$PROF-G CALL $RESBP ;RESET BYPASS AS APPROPRRIATEVHI .ENDCJK L CALL $DEARG ;DEACCESS REGION(M1257$: CALL $DETRG ;DETACH THE REGION N BR 125$ ; :O126$: MOV (SP)+,R5 ;RESTORE ADDRESS OF THIRD STATUS WORD9P TST T.STAT-T.ST3(R5) ;TASK REACTIVATED DURING $DXXRG ?I%Q ;HAPPENS WHEN $NXTSK IS CALLED('R ;FROM $DXXRG WHEN TKTN EXITS ANDI'S ;A CHECKPOINT ALLOCATION FAILURE T ;CAUSES TKTN TO RUN AGAIN+U BPL 127$ ;IF PL YES, DON'T MODIFY T.PCB3V MOV (SP),T.PCB-T.ST3(R5) ;RESET TASK PCB ADDRESSP1W127$: TST (SP)+ ;REMOVE PCB ADDRESS FROM STACK %X BIT #T3.RST,(R5) ;RESTRICTED TASK? 1Y BNE 130$ ;IF NE YES, DO NOT DEALLOCATE HEADER Z[ .IF DF X$$HDR\0] TSTB T.HDLN-T.ST3(R5) ;RESIDENT TASK HEADER ?.^ BNE 130$ ;IF NE, NO. NOTHING TO DEALLOCATE_` .ENDCa)b MOV R4,R0 ;SET ADDRESS OF TASK HEADERT3c MOV H.HDLN(R0),R1 ;GET LENGTH OF HEADER IN BYTES "d CALL $DEACB ;DEALLOCATE HEADERe130$:Ff;+g; ** W A R N I N G **h;(i; SPM HOOKPOINT NUMBER 03.j; +k; DO NOT CHANGE THE INSTRUCTION FOLLOWINGEl; LABEL WITHOUT CHECKING SPMm;-n-o$SPH03==. ;SPM CHANGES THE INSTRUCTION ATE!p ;THE LOCATION OF THIS LABELHq.r MOV @#$TKTCB,R0 ;GET ADDRESS OF CURRENT TCBstuv .IF DF N$$DIRw&x MOV T.CTX(R0),R1 ;GET CONTEXT BLOCK%y BEQ 133$ ;IF EQ, NO CONTEXT BLOCKT)z CALL $DLCTX ;DEALLOCATE CONTEXT BLOCKR#{ CLR T.CTX(R0) ;CLEAR CTX POINTERT|133$: ;REFERENCE POINTER*}~ .ENDC ; DF N$$DIR€ .IF DF A$$CNT�/‚ CLR T.EFLM(R0) ;ASSUME NO TIME LIMIT ON TASKWƒ CLR T.EFLM+2(R0) ; .„ TST T.ACN(R0) ;IS THERE AN ACCOUNTING BLOCK… BEQ 160$ ;IF EQ NO† MOV R0,R4 ;SAVE TCB ADDRESSH3‡ TSTB $BILNG ;IS CPU TIME CURRENTLY BEING BILLEDˆ BNE 135$ ;IF NE NO8‰ CALL $CPUTM ;CALCULATE LAST SEGMENT OF CPU TIME USED9Š135$: MOV T.ACN(R4),R1 ;GET ADDRESS OF ACCOUNTING BLOCK )‹ MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING &Œ MOV R1,KISAR6 ;MAP ACCOUNTING BLOCK-� CMPB #BT.TAB,@#B.TYP+140000 ;IS THIS A TABTŽ BNE 140$ ;IF NE NO0� MOV @#B.PNT+1400000• eue³cÙ´cÚµcÛ¶c�·c›’0,-(SP) ;SAVE POINTER TO UAB=� MOV @#B.CPUL+140000,T.EFLM(R4) ;PUT TIME LIMIT BACK IN TCB0'‘ MOV @#B.CPUL+2+140000,T.EFLM+2(R4) ;R:’ BITB #BS.TML,@#B.STM+140000 ;IS TAB FOR TIME LIMIT ONLY“ BEQ 137$ ;IF EQ NO” MOV R1,R0 ;GET TAB ADDRESS• MOV #B.TBLK,R1 ;SIZE OF TAB– CALL $DESEC ;DEALLOCATE TABF — BR 138$ ;C@˜137$: MOV T.EFLG+2(R4),@#B.EXST+140000 ;PUT EXIT STATUS IN TAB;™ MOVB T.EFLG(R4),R0 ;GET TKTN ABORT CODE WITH SIGN EXTEND 7š MOV R0,@#B.EXST+2+140000 ;PUT TKTN ABORT CODE IN TABP.› BICB #BS.ACT,@#B.STM+140000 ;DEACTIVATE TAB%œ CALL $QACNT ;OUTPUT TAB TO SYSLOG"�138$: MOV (SP)+,R1 ;POINT TO UABž MOV R1,KISAR6 ;MAP UABT7Ÿ140$: DEC @#B.ACT+140000 ;DECREMENT ACTIVE TASK COUNT 2  DECB @#B.USE+140000 ;DECREMENT USE COUNT OF UAB%¡ BGT 150$ ;IF GT, UAB STILL ACTIVEC.¢ BICB #BS.ACT,@#B.STM+140000 ;DEACTIVATE UAB%£ CALL $QACNT ;OUTPUT UAB TO SYSLOGT2¤150$: MOV (SP)+,KISAR6 ;RESTORE ORIGINAL MAPPING"¥ MOV R4,R0 ;RESTORE TCB ADDRESS/¦ CLR T.ACN(R0) ;ZERO ACCOUNTING BLOCK POINTERC§160$:+¨© .ENDCª«A¬ BIC #T4.CTC,T.ST4-T.ST3(R5) ;CLEAR THE ^C ABORT PROCESSING BITN.­ CALL $ACTRM ;REMOVE TCB FROM THE ATL QUEUE0® BIT #T3.MCR,(R5) ;MCR EXTERNAL FUNCTION TASK?¯ BEQ 175$ ;IF EQ NO-° MOV T.UCB-T.ST3(R5),R1 ;GET TI UCB ADDRESSU/±170$: MOV U.RED(R1),R1 ;FOLLOW REDIRECT CHAIN;*² CMP U.RED(R1),R1 ;IS DEVICE REDIRECTED?³ BNE 170$ ;IF NE YESS-´ BIT #DV.TTY,U.CW1(R1) ;IS IT A TTY DEVICE?,µ BEQ 175$ ;IF EQ NO*¶ MOV T.UCB-T.ST3(R5),R2 ;GET UCB ADDRESS)· MOV #CC.EXT,R1 ;ISSUE TASK EXIT PROMPTB2¸ BIT #T3.CMD,(R5) ;IS TASK EXECUTING CLI COMMAND¹ BEQ 173$ ;IF EQ NO2º BIS #CC.TTD,R1 ;FORCE $SNCMD TO BE CALLED LATER1»173$: CALL $QCNTP ;ISSUE PROMPT REQUEST TO MCRE ¼ BR 177$ ;U7½175$: BIT #T3.CMD,(R5) ;IS TASK EXECUTING CLI COMMAND1¾ BEQ 180$ ;IF EQ NO*¿ MOV T.UCB-T.ST3(R5),R0 ;GET UCB ADDRESS:À CALL $SNCMD ;TELL TTDRV TO SEND NEXT COMMAND TO MCR...2Á177$: BIC #T3.MCR!T3.CMD,(R5) ;CLEAR STATUS BITSÂ180$: ;REFERENCE LABELDÃÄÅ .IF DF P$$OFFÆ0Ç MOV R5,R0 ;COPY POINTER TO THIRD STATUS WORD4È ADD #T.OCBH-T.ST3,R0 ;POINT TO OCB QUEUE LISTHEAD É CALL $QRMVF ;REMOVE NEXT OCB!Ê BCS 190$ ;IF CS THERE IS NONEU7Ë MOV T.EFLG+2-T.ST3(R5),R0 ;PICK UP SAVED EXIT STATUS.0Ì MOVB T.EFLG-T.ST3(R5),R2 ;GET TKTN ABORT CODE,Í CALL $QUEXT ;QUEUE EXIT STATUS TO PARENTÎ BR 180$ ;GO AGAINSÏ190$: ;REFERENCE LABELTÐÑÒ .IF DF V$$TRMÓ8Ô CALL $TICLR ;CLEAR OUT POSSIBLE TI:=VTNN: ASSIGNMENTÕÖ .ENDC×ØÙ .ENDCÚÚ ; LMZ048.Ú .IF DF C$$RTK ;IF REMOTE TASK ; LMZ048Ú ; LMZ048=Ú BIT #F5.RTK,$FMSK5 ;ARE REMOTE TASKS BEING USED ; LMZ0480#Ú BEQ 199$ ;IF EQ NO ; LMZ048LÚ; ; LMZ048U>Ú; SEND TASK TERMINATION REQUST TO REMOTE SYSTEM ; LMZ048Ú; ; LMZ048 2Ú MOV $TKTCB,R5 ;GET CURRENT TASK TCB ; LMZ048CÚ TSTB T.LBN(R5) ;HAS THIS TASK BEEN REMOTE STARTED YET? ; LMZ048 ?Ú BEQ 198$ ;IF EQ, NO - DON'T NEED TO SEND TASK TERM ; LMZ0486Ú CMPB #-2,T.LBN(R5) ;IS IT NEGATIVE TWO? ; LMZ048>Ú BEQ 198$ ;YES, WE'VE ALREADY REMOTELY TERMINATED ; LMZ0486Ú CMPB #-1,T.LBN(R5) ;PRV'D TASK W/O AME? ; LMZ048=Ú BEQ 197$ ;YES, DONT SENT PKT BUT SET TASK INDEX ; LMZ048.Ú MOV #AL$SWS,R0 ;SET FLAG AS SWS ; LMZ0481Ú MOV #1,R1 ;ONLY NEED ONE 32W BLOCK ; LMZ048,6Ú MOV R2,-(SP) ;SAVE A COUPLE OF REGISTERS ; LMZ048Ú MOV R3,-(SP) ; LMZ048.Ú CALL $CPALO ;ALLOCATE A BLOCK ; LMZ048.Ú BCC 196$ ;CC = OKAY KEEP GOING ; LMZ0488Ú ADD #4,SP ;CLR OFF STACK - DONT NEED REG'S ; LMZ048(Ú JMP TKWSE ;RETRY LATER. ; LMZ048Ú ; LMZ048:Ú196$: MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING ; LMZ0480Ú MOV R0,KISAR6 ;MAP REQUEST PACKET ; LMZ048@Ú MOVB #HT$TKN,H$TYPE+MAP6 ;TYPE IS TASK TERMINATION ; LMZ0480Ú MOV (SP)+,KISAR6 ;RESTORE MAPPING ; LMZ048Ú MOV R4,-(SP) ; LMZ048Ú MOV R5,-(SP) ; LMZ048CÚ CPSEN$ #SN$PSR,R0,#H$SIZE ;SEND PKT AS PSUEDO REQUEST ; LMZ048C00•¨eÚdÝb`TADATADATADATADATADATA7Ú MOV (SP)+,R5 ;RESTORE ALL SAVED REGISTERS ; LMZ048AÚ MOV (SP)+,R4 ; LMZ048Ú MOV (SP)+,R3 ; LMZ048Ú MOV (SP)+,R2 ; LMZ048CÚ197$: MOVB #-2,T.LBN(R5) ;SIGNAL WE'VE SENT TASK TERM ; LMZ048,@Ú198$: ADD #T.ST3,R5 ;RESTORE R5 BACK TO STATUS WORD ; LMZ048Ú199$: ; LMZ048 Ú .ENDC ;C$$RTK ; LMZ048Ú ; LMZ0489Ü BIT #T3.REM,(R5) ;REMOVE TASK AT EXIT? (T.ST3) ;**-1 Ý BEQ 200$ ;IF EQ NO0Þ MOV R5,R0 ;COPY POINTER TO THIRD STATUS WORD'ß SUB #T.ST3,R0 ;POINT TO START OF TCBR(à CALL $REMOV ;REMOVE TASK FROM SYSTEMá200$: ;REFERENCE LABEL â .IF DF X$$HDRã3ä CLR $SAHPT ;DO NOT SAVE CONTEXT OF CURRENT TASKSåæ .IFFEç3è CLR $HEADR ;DO NOT SAVE CONTEXT OF CURRENT TASKRéê .ENDCë$ì CLR $TKTCB ;SHOW NO CURRENT TASKíîï .IF DF M$$PROð+ñ CLR @$TKPTR ;SAME HERE FOR COMMON TABLEMòó .ENDCôõ+ö CALLR $DRDSE ;DECLARE SIGNIFICANT EVENTO÷ø;Rù; SUBROUTINE TO EMPTY QUEUEAú;Oûüý .IF DF K$$DASþ>ÿMTQUE: BIC #PMODE,PS ;SET PREVIOUS MODE TO KERNEL FOR PARAMS, MFPI (R5)+ ;GET OFFSET TO QUEUE LISTHEAD MOV (SP)+,R4 ;N10$: ;REF LABEL .IFF3MTQUE: MOV (R5)+,R4 ;GET OFFSET TO QUEUE LISTHEADR,10$: TST (R5)+ ;ADVANCE TO RETURN ADDRESS  .IFTF ( 13$: MOV (SP),R0 ;PICK UP TCB ADDRESS&  ADD R4,R0 ;POINT TO QUEUE LISTHEAD+  CALL $QRMVF ;REMOVE AN ENTRY FROM QUEUE " BCS 40$ ;IF CS NO ENTRIES LEFT1 MOV R1,R0 ;SET ADDRESS OF BLOCK TO DEALLOCATE$ CMP R4,#T.ASTL ;AST?M BNE 20$ ;IF NE NOD6 MOVB 2(R0),R1 ;SET LENGTH OF BLOCK (FOR AST'S ONLY)0 BGT 20$ ;IF GT LENGTH SPECIFIED (AST'S ONLY)  BMI 30$ ;F/ TST 2(R0) ;IS IT UNSOLICITED CHARACTER AST?E* BNE 18$ ;IF NE NO IT'S A SPECIFIED AST MOV R4,-(SP) ;SAVE R4 MOV R5,-(SP) ;SAVE R5@ CMP -(R0),-(R0) ;POINT TO KISAR5 VALUE OF DEALL SUBR ; BM3977 MOV (R0)+,-(SP) ;GET MAPPING OF SUBROUTINE ; BM397 > MOV (R0)+,-(SP) ;GET ADDRESS OF DEALLOCATE ROUTINE ; BM3974 CALL $MPPRO ;CALL DEALLOCATION ROUTINE ; BM397&3 MOV (SP)+,R5 ;RESTORE R5 ;**-264 MOV (SP)+,R4 ;RESTORE R4$5 BR 13$ ;GO AGAIN3618$: MOV #C.LGTH,R1 ;SET SIZE OF BLOCK TO RELEASET:7 CMPB 3(R0),#AS.PEA ;IS THIS A PARITY AST CONTROL BLOCK?8 BNE 20$ ;IF NE NO,&9 MOV #A.PLGH,R1 ;GET LENGTH OF BLOCK-:20$: CMP R4,#T.RRFL ;PROCESSING RREF QUEUE?D; BNE 23$ ;IF NE NOM)< MOV 2(R0),R1 ;GET SENDER'S TCB ADDRESS 1= BEQ 23$ ;IF EQ NO EVENT FLAG RUNDOWN POSSIBLEC)> CMP $TKTCB,R1 ;CHECK IF SENDER IS SELF (? BEQ 23$ ;IF EQ YES, DEALLOCATE BLOCK=@ MOV #AK.GGF,A.CBL(R0) ;CONVERT TO KERNAL AST CONTROL BLOCKB.A ADD #T.ASTL,R1 ;POINT TO SENDER'S AST QUEUE6B MOV (R1),(R0) ;ESTABLISH PACKET'S POSITION IN QUEUE&C BNE 21$ ;IF NE QUEUE WAS NOT EMPTY'D MOV R0,2(R1) ;ESTABLISH END OF QUEUE 1E21$: MOV R0,(R1) ;ESTABLISH BEGINNING OF QUEUEE"F BR 13$ ;DEALLOCATE NEXT PACKETG23$:HI .IFT ;K$$DASDJ0K MFPI (R5) ;PUSH DEALLOCATION ROUTINE ADDRESSL CALL @(SP)+ ;CALL ROUTINEFMN .IFF ;K$$DASBO&P CALL @-(R5) ;DEALLOCATE CORE BLOCKQR .IFTF ;K$$DASST BR 10$ ;GO AGAINU30$: ;REFERENCE LABEL>V BGCK$A BF.XIT,BE.SGN,FATAL ;NO KERNEL ASTS SHOULD EXIST NOWW40$: ;REF LABELXY .IFTIZ1[ TST (R5)+ ;ADVANCE R5 TO EQUAL RETURN ADDRESSD/\ BIS #PMODE,PS ;RESTORE PREVIOUS MODE TO USERI]^ .ENDC_`a RTS R5 ;RETURN TO CALLERbc;d; EMPTY THE RECEIVE LIST. ;e; IN A SYSTEM SUPPORTING SECONDARY POOL, THE RECEIVE LISTL<f; CONTAINS DATA PACKETS ALLOCATED FROM THE SECONDARY POOL.g;Ohij .IF DF P$$OOLkDkMTRCVL: MOV KISAR6,-(SP) ;SAVE KERNEL MAPPING REGISTER 5 ; BM397(m MOV R5,R4 ;COPY TCB ADDRESS ;**-1(n ADD #T.RCVL,R4 ;POINT TO RECEIVE LIST(o10$: MOV R4,R0 ;GET LIST HEAD ADDRESS5p CALL $QSPRF ;REMOVE THE NEXT PACKET FROM THE LIST q BCS 100$ ;IF CS DONErs .IF DF V$$TRMt)u MOV R1,-(SP) ;SAVE PACKET ADDRESS BIASI(u MOV R1,KISAR6 ;MAP PACKET ; BM3974u MOV @#1400000•°eue³cÙ´cÚµcÛ¶c�·c›’2,-(SP) ;GET SIZE OF PACKET ; BM3977x BIT #T3.SLV,T.ST3(R5) ;IS THIS A SLAVE TASK? ;**-2 (y BEQ 50$ ;IF EQ NO RUN DOWN NECESSARY0z MOV (SP),R1 ;CALCULATE ADDRESS OF UCB IN PKT#{ ASL R1 ;CONVERT OFFSET TO BYTESD7{ MOV 140004(R1),R0 ;GET UCB ADDRESS IN PKT ; BM397T(} MOV @R0,R1 ;GET DCB ADDRESS ;**-1$~ CMP D.NAM(R1),#"VT ;IS THIS A VT? BNE 50$ ;IF NE NO0€ DECB U.OCNT(R0) ;DECREMENT VT OFFSPRING COUNT)� BNE 50$ ;IF NE THERE'S MORE OFFSPRINGK,‚ TST U.PTCB(R0) ;HAS THE PARENT GONE AWAY?ƒ BNE 50$ ;IF NE NO„… .IF DF D$$PAR† .IF NDF K$$DAS ‡=‡ MOV 4(SP),KISAR6 ;REMAP APR6 TO ORIGINAL MAPPING ; BM397P&‰ ;WHICH MUST SHARE KISAR5 ;**-1Š‹ .ENDCŒ .ENDC�.Ž CALL $DEAVT ;DEALLOCATE VT DATA STRUCTURES(�50$: MOV (SP)+,R1 ;RESTORE PACKET SIZE/� MOV (SP)+,R0 ;RESTORE ADDRESS BIAS OF PACKETS‘’ .IF DF D$$PAR“ .IF NDF K$$DAS.”*” MOV R0,KISAR6 ;REMAP PACKET ; BM397– ;**-1M— .ENDC˜ .ENDC™š .IFF ›6œ MOV R1,R0 ;COPY PACKET ADDRESS FOR DEALLOC ROUTINE:œ MOV R1,KISAR6 ;MAP TO THE PACKET THROUGH APR5 ; BM3974œ MOV @#140002,R1 ;CALCULATE PACKET SIZE ; BM397Ÿ ;**-2   .ENDC ;V$$TRM¡¢ .IF DF N$$DIR£3¤ BIT #T3.SLV,T.ST3(R5) ;IS RECEIVER A SLAVE TASK?P-¥ BEQ 80$ ;IF EQ, NO - NO CONTEXT BLOCK PTRS¦ MOV R1,-(SP) ;SAVE SIZE§ ASL R1 ;CONVERT TO BYTES9§ MOV 140014(R1),R1 ;GET CONTEXT BLOCK POINTER ; BM3977"© BEQ 70$ ;IF EQ, NONE ;**-1%ª CALL $DLCTX ;DELETE CONTEXT BLOCKC!«70$: MOV (SP)+,R1 ;RESTORE SIZEI-¬80$: ADD #<7.+37>,R1 ;INCLUDE CONTROL WORDS ­® .IFF7¯)° ADD #<6.+37>,R1 ;INCLUDE CONTROL WORDS;±² .ENDC ;DF N$$DIR ³)´ ASH #-5,R1 ;CONVERT TO 32. WORD UNITS&µ CALL $DESEC ;DEALLOCATE THE PACKET¶ BR 10$ ;GO AGAIN>¶100$: MOV (SP)+,KISAR6 ;RESTORE MAPPING REGISTER 5 ; BM397¸ RETURN ; ;**-1¹º .ENDC»¼½¾; )¿; CO-ROUTINE TO SCAN LOGICAL UNIT TABLE$À; Á*ÂSCNLN: MOV (SP),R3 ;SAVE RETURN ADDRESSà CLR (SP) ;START AT LUN ZEROR5Ä10$: MOV $TKTCB,R5 ;GET ADDRESS OF CURRENT TASK TCBOÅÆ .IF DF X$$HDRÇ)È MOV $SAHPT,R4 ;GET CURRENT TASK HEADERÉ MOV $SAHDB,KISAR6 ;MAP ITÊË .IFF;Ì)Í MOV $HEADR,R4 ;GET CURRENT TASK HEADERAÎÏ .ENDCÐ(Ñ20$: MOV (SP),R1 ;GET NEXT LUN NUMBER"Ò INC (SP) ;INCREMENT LUN NUMBER#Ó CMP H.NLUN(R4),(SP) ;END OF LUT?Ô BLO 30$ ;IF LO YES.Õ CALL $MPLNE ;MAP LUN NUMBER TO UCB ADDRESS,Ö BCS 20$ ;IF CS NO DEVICE ASSIGNED TO LUN0× BIT #DV.ISP!DV.OSP,U.CW1(R2) ;SPOOLED DEVICE?Ø BEQ 25$ ;IF EQ NOR'Ù CMP U.ATT(R2),R5 ;SPOOLER TASK EXIT?$Ú BEQ 25$ ;IF EQ YES/Û MOV R0,R2 ;ELSE USE INTERMEDIATE DEVICE UCB6%Ü CLC ;INSURE C - CLEAR FOR RETURND-Ý25$: MOV R2,R5 ;SET UCB ADDRESS FOR RETURN#Þ CALL (R3) ;CALL THE CALLER BACKU(ß MOV (SP)+,R3 ;RETRIEVE RETURN ADDRESSà BR 10$ ;GO AGAIN'á30$: MOV R3,(SP) ;SET RETURN ADDRESS â RETURN ;Mãã;+ ; BM374SBã; ** - LTPRE - CALL LAT PROCESS FOR EXIT NOTIFICATION ; BM374ã; ; BM374Qã; THIS ROUTINE NOTIFIES THE LAT PROCESS WHEN AN EXITING TASK HAS A LUN ; BM374$Yã; ASSIGNED TO A LAT APPLICATIONS TERMINAL SO THAT A DISCONNECT MAY BE PERFORMED ; BM374Fã; ; BM374ã; INPUTS: ; BM374R"ã; R5 = UCB ADDRESS ; BM374ã; ; BM374ã; OUTPUTS: ; BM3742ã; LAT PROCESS NOTIFIED IF NECESSARY. ; BM374ã;- ; BM374 ã ; BM374 %ã .IF DF M$$NET&T$$LTH ; BM374Cã ; BM374T5ãLTPRE: MOV U.DCB(R5),R0 ;GET DCB ADDRESS ; BM374N6ã CMP #"TT,D.NAM(R0) ;IS IT A TT TERMINAL? ; BM374!ã BNE 10$ ;IF NE NO ; BM374Lã ; BM374T>ã BIT #S6.LAT,U.TST6(R5) ;LAT APPLICATION TERMINAL? ; BM374ã ; BM374 !ã BEQ 10$ ;IF EQ NO ; BM374 /ã MOV U.SCB(R5),R4 ;R4-SCB ADDRESS ; BM374 ã ; BM374R+ã MOV S.KRB+2(R4),-(SP) ;BIAS ; BM374-ã ; BM3748ã MOV $LTEEP,-(SP) ;VIRT ADDR = LAT PROC EXIT ; BM374ã ;ENTRY POINT00•¸e–¼eÝb`TADATADATADATADATADATA ; BM3745ã CALL $MPPRO ;MAPS AND CALLS LAT PROCESS ; BM374#ã ;RESTORES SP ; BM374ã10$: RETURN ; BM374 ã ; BM374(ã .ENDC ; DF M$$NET&T$$LTH ; BM374ã ; BM374Tã ; BM385ã;+ ; BM385BBã; **-$RLMCB-RELEASE COMMAND BUFFERS QUEUED FOR A TASK ; BM385ã; ; BM385ã; INPUTS: ; BM385Rã; ; BM385Jã; R5=ADDRESS OF TCB OF THE TASK WHOSE BUFFERS SHOULD BE DELETED ; BM385ã; ; BM385ã; OUTPUTS: ; BM385ã; ; BM385:ã; ALL COMMAND LINES FOR THE TASK ARE RELEASED ; BM385ã; ; BM385ã;- ; BM385Mã ; BM385$;ã$RLMCB::MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING ; BM385 ;ã10$: CALL $SCMDQ ;FIND A COMMAND FOR THIS TASK ; BM385 'ã BCS 30$ ;IF CS, NO MORE ; BM385 'ã MOV R0,R1 ;COPY ADDRESS ; BM385M/ã MOV #$CLICQ,R0 ;POINT TO LISTHEAD ; BM385 &ã CALL $GTSPK ;UNLINK IT ; BM385'ã MOV R1,KISAR6 ;MAP BLOCK ; BM385UGã BIT #CC.TTD,@#C.CSTS+140000 ;DID COMMAND ORIGINATE IN TTDRV ; BM385H!ã BEQ 20$ ;IF EQ NO ; BM385 5ã MOV @#C.CUCB+140000,R0 ;GET UCB ADDRESS ; BM385 9ã CALL $SNCMD ;TELL TTDRV TO SEND NEXT COMMAND ; BM385 -ã20$: MOV KISAR6,R0 ;GET ADDRESS ; BM385O0ã MOVB C.CBLK+140000,R1 ;GET LENGTH ; BM385*ã CALL $DESEC ;DEALLOCATE IT ; BM385)ã BR 10$ ;CHECK FOR ANY MORE ; BM385I3ã30$: MOV (SP)+,KISAR6 ;RESTORE MAPPING ; BM385BãDUN: RETURN ; BM385Cã ; BM385Tä .END@#C.CSTS+140000 ;DID COMMAND ORIGINATE IN TTDRV ; BM385H!ã BEQ 20$ ;IF EQ NO ; BM385 5ã MOV @#C.CUCB+140000,R0 ;GET UCB ADDRESS ; BM385 9ã CALL $SNCMD ;TELL TTDRV TO SEND NEXT COMMAND ; BM385 -ã20$: MOV KISAR6,R0 ;GET ADDRESS ; BM385O0ã MOVB C.CBLK+140000,R1 ;GET LENGTH ; BM385*ã CALL $DESEC ;DEALLOCATE IT ; BM385)ã BR 10$ ;CHECK FOR ANY MORE ; BM385I3ã30$: MOV (SP)+,KISAR6 ;RESTORE MAPPING ; BM385BãDUN: RETURN ; BM385Cã  .TITLE DRLOG  .IDENT /03.03/U;)8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;N ; J. R. KAUFFMAN ; J. W. BERZLE ; T. LEKAS ;; MODIFIED BY:;;); J. R. KAUFFMAN 12-FEB-86 03.01 JRK325A&; FIX LON$/LOG$ EQUIVALENCE PROBLEM;C%; K. L. NOEL 24-NOV-86 03.02 KLN027 -; ADD SUPPORT FOR REMOTE DIRECTORY STORAGE ;.'; D. P. RABAHY 11-DEC-86 03.03 DPR0399>; ADD SUPPORT FOR REMOTE LOGICAL TRANSLATE, CREATE & DELETE*;+,;+$-; ++$DRLOG-LOGICAL NAME DIRECTIVES.;Y=/; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CREATE, DELETE, ORCB0; TRANSLATE A LOGICAL NAME, SETUP A DEFAULT DIRECTORY STRING, ORA1; GET A DEFAULT DIRECTORY STRING BY MEANS OF THE FOLLOWING FIVEJ2; SUBFUNCTIONS:N3;$4; CLOG$ ( SUBFUNCTION 0 ) 5; I6; THE CREATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM TO Q7; CREATE A RELATIONSHIP BETWEEN A SPECIFIED LOGICAL NAME STRING AND A SPECIFIEDAO8; EQUIVALENCE NAME STRING. IF THE LOGICAL NAME STRING ALREADY EXISTS, THE NEWS*9; DEFINITION WILL SUPERCEDE THE OLD ONE.:;O+;; CREATE LOGICAL NAME (CLOG$) DPB FORMAT: <; %=; WD. 00 -- DIC(207.),DPB SIZE (7.)'>; WD. 01 -- SUBFUNCTION CODE (0),MODE !?; WD. 02 -- TABLE NUMBER,STATUST,@; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)A; WD. 04 -- SIZE OF LOGICAL NAME BUFFER 0B; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-C; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERSD; E; F; TLOG$ ( SUBFUNCTION 1 )EG;NIH; THE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM HI; TO SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICALJJ; NAME TABLES AND RETURN THE EQUIVALENCE NAME STRING TO A USER SPECIFIED K; BUFFER.L;DNM; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLESLN; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAM00–Àeue³cÙ´cÚµcÛ¶c�·c›’E BUFFER BE TOO SMALL,NO; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNEDPP; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER>Q; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER.R;INS; ******************************** NOTE ************************************GT; THIS VERSION OF THE TLOG$ DPB IS FOR P/OS COMPATIBILITY ONLY.BAU; THE CURRENT DPB FORMAT IS UNDER THE SUBFUNCTION CODE 9. NV; **************************************************************************W;E.X; TRANSLATE LOGICAL NAME (TLOG$) DPB FORMAT:Y;%Z; WD. 00 -- DIC(207.),DPB SIZE (9.)U'[; WD. 01 -- SUBFUNCTION CODE (1),MODE4\; WD. 02 -- TBMASK,RESERVED BYTE (RECURSION COUNT),]; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)^; WD. 04 -- SIZE OF LOGICAL NAME BUFFER*0_; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-`; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERREa; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAME*>b; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODEc;Rd;Te; DLOG$ ( SUBFUNCTION 2 )Af;Og; THE DELETE LOGICAL NAME DIRECTIVE SUBFUNCTION REMOVES THE SPECIFIED LOGICALDJh; NAME FROM THE LOGICAL NAME TABLE SPECIFIED. IF THE LOGICAL NAME IS NOTDi; SPECIFIED, ALL LOGICAL NAMES IN THE SPECIFIED TABLE ARE REMOVED.j; +k; DELETE LOGICAL NAME (DLOG$) DPB FORMAT:l;D%m; WD. 00 -- DIC(207.),DPB SIZE (5.)R'n; WD. 01 -- SUBFUNCTION CODE (2),MODEE"o; WD. 02 -- TABLE NUMBER, STATUS,p; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)q; WD. 04 -- SIZE OF LOGICAL NAME BUFFERFr;Os; SDIR$ ( SUBFUNCTION 3 )Gt;NQu; THE SETUP DEFAULT DIRECTORY STRING DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM Jv; TO CREATE A DEFAULT DIRECTORY STRING ON A USER BASIS. THIS STRING IS APw; SPECIAL CASE SINCE THERE IS NO LOGICAL STRING PER SE AND ONLY AN EQUIVALENCEx; NAME STRING EXISTS.Dy;-(z; SET DEFAULT DIRECTORY STRING (SDIR$){;N%|; WD. 00 -- DIC(207.),DPB SIZE (5.)L'}; WD. 01 -- SUBFUNCTION CODE (3),MODEF.~; WD. 02 -- RESERVED FOR FUTURE EXPANSIONISM0; WD. 03 -- ADDRESS OF EQUIVALENCE NAME BUFFER-€; WD. 04 -- SIZE OF EQUIVALENCE NAME BUFFERI�;R‚; GDIR$ ( SUBFUNCTION 4 )Eƒ;EO„; THE GET DEFAULT DIRECTORY STRING DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEMP…; TO RETRIEVE THE DEFAULT DIRECTORY STRING FOR THE CURRENT USER. THE STRING ISN†; RETURNED TO THE SPECIFIED USER BUFFER ALONG WITH THE LENGTH OF THE STRING.‡; 4ˆ; GET DEFAULT DIRECTORY STRING (GDIR$) DPB FORMAT:‰;O%Š; WD. 00 -- DIC(207.),DPB SIZE (6.)R'‹; WD. 01 -- SUBFUNCTION CODE (4),MODES+Œ; WD. 02 -- RESERVED FOR FUTURE EXPANSIONI%�; WD. 03 -- EQUIVALENCE NAME BUFFER-Ž; WD. 04 -- SIZE OF EQUIVALENCE NAME BUFFER E�; WD. 05 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAME�;R‘;VG’; THE FOLLOWING SUBFUNCTIONS ARE DISPATCHED FROM HERE BUT THE CODE ISE“; IN THE MODULE DRPFN.MAC.”; •; FSS$ ( SUBFUNCTION 5 )–;.1—; FILE SPECIFICATION SCANNER (FSS$) DPB FORMAT:B˜;A%™; WD. 00 -- DIC(207.),DPB SIZE (7.)I,š; WD. 01 -- SUBFUNCTION CODE (5), RESERVED›; WD. 02 -- RESERVED7œ; WD. 03 -- ADDRESS OF DIRECTORY SPECIFICATION BUFFERE4�; WD. 04 -- SIZE OF DIRECTORY SPECIFICATION BUFFER$ž; WD. 05 -- ADDRESS OF PARSE BLOCK,Ÿ; WD. 06 -- SIZE OF PARSE BLOCK (IN BYTES) ;>¡; THE PARSE BLOCK WILL ZEROED AND FILLED IN WITH DESCRIPTORS>¢; FOR EACH FIELD PRESENT OF NODE, ACCESS, DEVICE, DIRECTORY,=£; FILENAME, TYPE, AND VERSION, PLUS THE TRAILING PORTION OFTA¤; THE STRING IF ANY. THE FLAGS WORD WILL BE HAVE A BIT SET FORF<¥; EACH OF THE COMPONENTS PRESENT IN THE FORMAT FOR THE RMS¦; NAM BLOCK.§;O¨; IN MORE DETAIL.E©;>ª; NODE: THE NODE INCLUDES ALL NODES IF POOR MAN'S ROUTING IS:«; IS BEING USED. THE INITIAL NODE NAME IS TERMINATED9¬; BY THE ACCESS CONTROL STRING ADDRESS, EVEN IF THERED:­; IS NONE. (IN THIS CASE THE ACCESS CONTROL LENGTH IS ®; ZERO.)¯;T°; FS$NOD IS SET IF PRESENT.S±;P@²; ACCESS THE ACCESS CONTROL STRI00–Èe¼eÝb`TADATADATADATADATADATANG IS THE ENTIRE QUOTED STRINGE³; CONTROL: TERMINATED BY DOUBLE COLON. AS NOTED ABOVE, THE ADDRESSH1´; OF THE ACCESS CONTROL SERVES A DUAL PURPOSE.Mµ;EB¶; DEVICE: THE DEVICE IS THE STRING TERMINATED BY A SINGLE COLON.·; ¸; FS$DEV IS SET IF PRESENT.I¹;NAº; DIRECTORY:THE DIRECTORY IS THE STRING BOUNDED BY EITHER [] OR 4»; <> AND INCLUDES A RATHER LOOSELY CHECKED SET OF<¼; CHARACTERS VALID IN A DIRECTORY SPECIFICATION INCLUDING>½; WILDCARDS, HIERARCHIES, ETC. THE SYNTAX OF THE DIRECTORY7¾; MUST BE CHECKED FOR VALIDITY IN THE CONTEXT OF THEO,¿; OPERATION, FOR EXAMPLE, NETWORK ACCESS.À;E8Á; FS$DIR IS SET IF PRESENT. IN ADDITION, IF WILDCARDS=Â; ARE FOUND, FS$WDI IS ALSO SET. (WILDCARDS ARE "%", "*", Ã; AND "...".PÄ;TCÅ; FILENAME: THE FILENAME IS THE STRING TERMINATED BY ".", ";", OR 'Æ; THE END OF THE FILE SPECIFICATION.SÇ;H9È; FS$NAM IS SET IF PRESENT. IN ADDITION, IF WILDCARDSA;É; ARE FOUND, FS$WNA IS ALSO SET. (WILDCARDS ARE "%" AND Ê; "*".)Ë;0Ì; IF FS$QUO IS SET, THE FILE SPECIFICATION IS:Í; A QUOTED STRING. THIS IS EITHER A "FOREIGN" FILESPEC7Î; IF BEING PASSED TO ANOTHER SYSTEM (EG. VIA DAP) OR6Ï; AN ANSI FILESPEC. THE THE CASE OF THE ANSI FILE,:Ð; A VERSION IS ALLOWED, BUT NO TYPE FIELD. IN THE CASE:Ñ; OF A NETWORK OPERATION, IT'S AMBIGUOUS, BUT A VERSION7Ò; WILL BE ALLOWED BUT NOT DEFAULTED. (ACTUALLY THISN7Ó; DOESN'T RELATE TO FSS BUT THIS SEEMS TO BE AS GOOD #Ô; A PLACE TO MENTION IT AS ANY.)Õ;">Ö; TYPE: THE TYPE IS THE STRING TERMINATED BY A "." OR ";" OR9×; THE END OF THE FILE SPECIFICATION. A LEADING "." IS #Ø; ALWAYS INCLUDED IN THE STRING.GÙ; 9Ú; FS$TYP IS SET IF PRESENT. IN ADDITION, IF WILDCARDSF;Û; ARE FOUND, FS$WTY IS ALSO SET. (WILDCARDS ARE "%" ANDA Ü; "*".)Ý;W8Þ; IF THE FILENAME IS A QUOTED STRING, THEN THIS FIELDß; MUST BE NULL.à;D@á; VERSION: THE VERSION IS THE FIELD INCLUDING A LEADING "." OR9â; ";" TERMINATED BY THE END OF THE STRING. THE STRING 9ã; IS LIMITED TO AN OPTIONAL LEADING "-" AND THE DIGITS%ä; ZERO TO NINE, OR A "*" WILDCARD. å;A:æ; FS$VER IS SET IF PRESENT. IN ADDITION, IF A WILDCARD"ç; IS FOUND, FS$WVE IS ALSO SET.è;,Eé; TRAILING: THE UNPARSED PORTION OF THE INITIAL STRING IS THAT PART 6ê; OF THE INPUT THAT WAS SUCCESSFULLY AND COMPLETELY6ë; PARSED. IF AN ERROR IS DETECTED IN THE DIRECTORY9ì; SPECIFICATION, FOR EXAMPLE, THE TRAILING STRING WILLR3í; INCLUDE THE ERRONEOUS DIRECTORY SPECIFICATION.Sî; 7ï; THIS SHOULD ALLOW THE USED OF FSS$ IN COMMAND LINET=ð; PARSING. ANY CHARACTER NOT PART OF A FILE SPECIFICATIONS7ñ; TERMINATES THE SCAN AND RESULTS IN ALL INFORMATIONN$ò; OBTAINED SO FAR TO BE RETURNED.ó; 7ô; THE FIELD TRAILING_ADDR SHOULD ALWAYS BE FILLED IN5õ; EVEN WHEN THE LENGTH IS ZERO. THIS IS DIFFERENT4ö; FROM THE NORM, BUT IS AN EXCEPTION FOR MUCH THE$÷; SAME REASON AS FOR ACCESS_ADDR.ø;LBù; THE PARSE BLOCK CAN BE TRUNCATED BY THE USER IF NOT ALL FIELDSEú; ARE DESIRED, ALTHOUGH THE ORGANIZATION ISN'T WELL SETUP FOR THAT. Cû; THE DIRECTIVE CAN ALSO BE ENHANCED BY ADDING FIELDS ON THE END.Iü; ý; ACHN$ ( SUBFUNCTION 6 )Oþ;O&ÿ; ASSIGN CHANNEL (ACHN$) DPB FORMAT:; %; WD. 00 -- DIC(207.),DPB SIZE (5.)L+; WD. 01 -- SUBFUNCTION CODE (6),RESERVED ; WD. 02 -- LUN, TABLE MASK+; WD. 03 -- ADDRESS OF FILE SPECIFICATIONH(; WD. 04 -- SIZE OF FILE SPECIFICATION;L9; ASSIGN CHANNEL DOES ALL OF THE PROCESSING OF THE FILEL<; SPECIFICATION THAT IS REQUIRED TO FIND THE ACTUAL DEVICE1 ; NAME AND THEN ASSIGNS THE LUN TO THAT DEVICE.N ;D ;D ; PRMS$ ( SUBFUNCTION 7 ) ;C%; PARSE FOR RMS (PRMS$) DPB FORMAT:I;A&; WD. 00 -- DIC(207.),DPB SIZE (12.)'; WD. 01 -- SUBFUNCTION CODE (7), LUN1"; WD. 02 -- TABLE MASK, RESERVED'; WD. 03 -- ADDRESS OF PRIMARY STRING3$; WD. 04 -- SIZE OF PRIMARY STRING0; WD. 05 -- ADDRESS OF RESULTANT STRING BUFFER-; WD. 06 -- SIZE OF RESULTANT STRING BUFFERE>; WD. 0700–Ðeue³cÙ´cÚµcÛ¶c�·c›’ -- ADDRESS OF WORD TO RECEIVE RESULTANT STRING SIZE$; WD. 08 -- ADDRESS OF PARSE BLOCK!; WD. 09 -- SIZE OF PARSE BLOCK '; WD. 10 -- ADDRESS OF DEFAULT STRINGS$; WD. 11 -- SIZE OF DEFAULT STRING;D;######## ADD DESCRIPTION;;  ; PFCS$ ( SUBFUNCTION 8 )1!; %"; PARSE FOR FCS (PFCS$) DPB FORMAT: #; &$; WD. 00 -- DIC(207.),DPB SIZE (12.)'%; WD. 01 -- SUBFUNCTION CODE (8), LUND"&; WD. 02 -- TABLE MASK, RESERVED''; WD. 03 -- ADDRESS OF PRIMARY STRINGE$(; WD. 04 -- SIZE OF PRIMARY STRING0); WD. 05 -- ADDRESS OF RESULTANT STRING BUFFER-*; WD. 06 -- SIZE OF RESULTANT STRING BUFFERL>+; WD. 07 -- ADDRESS OF WORD TO RECEIVE RESULTANT STRING SIZE$,; WD. 08 -- ADDRESS OF PARSE BLOCK!-; WD. 09 -- SIZE OF PARSE BLOCK +.; WD. 10 -- ADDRESS OF DEFAULT NAME BLOCKO(/; WD. 11 -- SIZE OF DEFAULT NAME BLOCK0; 1;######## ADD DESCRIPTION2;1 3; INPUTS:O4;E:5; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK,6; R3=ADDRESS OF THE SECOND WORD IN THE DPB07; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK-8; R5=ADDRESS OF THE TCB OF THE CURRENT TASKU9; :;G;; TLOG$ ( SUBFUNCTION 9 ) <;RL=; THE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM TOJ>; SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICAL NAMEM?; TABLES AND RETURN THE EQUIVALENCE NAME STRING TO A USER SPECIFIED BUFFER.N@; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLESLA; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO SMALL,NB; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNEDPC; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER>D; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER.E;G.F; TRANSLATE LOGICAL NAME (TLOG$) DPB FORMAT:G;S&H; WD. 00 -- DIC(207.),DPB SIZE (10.)'I; WD. 01 -- SUBFUNCTION CODE (1),MODEAJ; WD. 02 -- TBMASK, STATUS,K; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)L; WD. 04 -- SIZE OF LOGICAL NAME BUFFERN0M; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-N; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFEREEO; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAMEA>P; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODEBQ; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCKR;S;T; RLOG$ ( SUBFUNCTION 10. )0U;LV; THE RECURSIVE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THEOW; SYSTEM TO SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICALLX; NAME TABLES AND RETRANSLATE THE EQUIVALENCE NAME STRING FURTHER UNTIL NOLY; MORE EQUIVALENCE NAMES MAY BE FOUND. AT THAT TIME THE FINAL EQUIVALENCE0Z; NAME IS RETURNED TO A USER SPECIFIED BUFFER.N[; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLESL\; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO SMALL,N]; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNEDP^; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER>_; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER.`; 8a; RECURSIVE TRANSLATE LOGICAL NAME (RLOG$) DPB FORMAT:b;U&c; WD. 00 -- DIC(207.),DPB SIZE (10.)'d; WD. 01 -- SUBFUNCTION CODE (9),MODEIe; WD. 02 -- TBMASK, STATUS,f; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)g; WD. 04 -- SIZE OF LOGICAL NAME BUFFERR0h; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-i; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFEREj; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAME >k; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODEBl; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCKm;n;o; CLON$ ( SUBFUNCTION 11. )0p;Iq; THE CREATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM TODQr; CREATE A RELATIONSHIP BETWEEN A SPECIFIED LOGICAL NAME STRING AND A SPECIFIEDOs; EQUIVALENCE NAME STRING. IF THE LOGICAL NAME STRING ALREADY EXISTS, THE NEWC*t; DEFINITION WILL SUPERSEDE THE OLD ONE.u;R+v; CREATE LOGIC00–Øe¼eÝb`TADATADATADATADATADATAAL NAME (CLON$) DPB FORMAT: w; %x; WD. 00 -- DIC(207.),DPB SIZE (7.) )y; WD. 01 -- SUBFUNCTION CODE (11.),MODER!z; WD. 02 -- TABLE NUMBER,STATUS,{; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)|; WD. 04 -- SIZE OF LOGICAL NAME BUFFERU0}; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-~; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERR;N€;P�; DLON$ ( SUBFUNCTION 12. )R‚;IOƒ; THE DELETE LOGICAL NAME DIRECTIVE SUBFUNCTION REMOVES THE SPECIFIED LOGICAL J„; NAME FROM THE LOGICAL NAME TABLE SPECIFIED. IF THE LOGICAL NAME IS NOTD…; SPECIFIED, ALL LOGICAL NAMES IN THE SPECIFIED TABLE ARE REMOVED.†;D+‡; DELETE LOGICAL NAME (DLON$) DPB FORMAT:Dˆ;-%‰; WD. 00 -- DIC(207.),DPB SIZE (5.)D)Š; WD. 01 -- SUBFUNCTION CODE (12.),MODED"‹; WD. 02 -- TABLE NUMBER, STATUS,Œ; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)�; WD. 04 -- SIZE OF LOGICAL NAME BUFFERTŽ;2�;�; TLON$ ( SUBFUNCTION 13. ) ‘;TL’; THE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM TOJ“; SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICAL NAMEM”; TABLES AND RETURN THE EQUIVALENCE NAME STRING TO A USER SPECIFIED BUFFER.PN•; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLESL–; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO SMALL,N—; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNEDP˜; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER>™; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER.š;G.›; TRANSLATE LOGICAL NAME (TLON$) DPB FORMAT:œ;S&�; WD. 00 -- DIC(207.),DPB SIZE (10.))ž; WD. 01 -- SUBFUNCTION CODE (13.),MODEKŸ; WD. 02 -- TBMASK, STATUS, ; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)¡; WD. 04 -- SIZE OF LOGICAL NAME BUFFERM0¢; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-£; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERUE¤; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAMEE>¥; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODEB¦; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCK§;S¨; ©; RLON$ ( SUBFUNCTION 14. ))ª; L«; THE RECURSIVE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THEO¬; SYSTEM TO SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICALL­; NAME TABLES AND RETRANSLATE THE EQUIVALENCE NAME STRING FURTHER UNTIL NOL®; MORE EQUIVALENCE NAMES MAY BE FOUND. AT THAT TIME THE FINAL EQUIVALENCE0¯; NAME IS RETURNED TO A USER SPECIFIED BUFFER.N°; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLESL±; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO SMALL,N²; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNEDP³; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER>´; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER.µ; 8¶; RECURSIVE TRANSLATE LOGICAL NAME (RLON$) DPB FORMAT:·;U&¸; WD. 00 -- DIC(207.),DPB SIZE (10.))¹; WD. 01 -- SUBFUNCTION CODE (14.),MODEHº; WD. 02 -- TBMASK, STATUS,»; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)¼; WD. 04 -- SIZE OF LOGICAL NAME BUFFERB0½; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-¾; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFER E¿; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAMEA>À; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODEBÁ; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCKÂ;UÃÄÅ .IF DF L$$GCL!N$$DIREÆÇ .MCALL LNMDF$,LNMOD$TÈ É LNMDF$M3Ê LNMOD$ ;DEFINE ADDITIONAL LOGICAL NAME OFFSETSRËÌ MAP5=120000Í MAP6=140000ÎÏAÐ LN$SIZ = 255. ;MAXIMUM SIZE OF LOGICAL AND EQUIVALENCE BUFFERSM8Ñ H$$HNM = 32. ;NUMBER OF HASH CELLS IN EACH HASH TABLE8Ò T$BLNM == 4 ;HIGHEST VALID LOGICAL NAME TABLE NUMBER=Ó M$XLOG = 10. ;MAXIMUM RECURSION NUMBER FOR LOGICAL LOOKUPSM;Ô P$SSIZ = 9. ;DPB SIZE OF P/OS COMPATIBLE TLOG$ DIRECTIVE ;Õ D$COM4 = 4 ;INDICATOR VALUE FOR THE 4TH DIRECTIVE COMMON3Ö R$LOG = 10. ;SUBFUNCTION CODE F00–àeue³cÙ´cÚµcÛ¶c�·c›’OR RLOG OPERATION 3× R$LON = 14. ;SUBFUNCTION CODE FOR RLON OPERATIONP2Ø R$XBAS = 11. ;SUBFUNCTIONS BELOW THIS ARE XLOG$+Ø GD$SIZ = 14 ;SIZE OF GDIR DPB ;KLN027RAØ GD$BUF = 4 ;SIZE OF EXTRA CPRBUF STORAGE AREA FOR GDIR ;KLN027B+Ø SD$SIZ = 12 ;SIZE OF SDIR DPB ;KLN027U+Ø CL$SIZ = 16 ;SIZE OF CLOG DPB ;DPR039E+Ø DL$SIZ = 10 ;SIZE OF DLOG DPB ;DPR039I+Ø TL$SIZ = 24 ;SIZE OF TLOG DPB ;DPR039CÙ/Ú .SBTTL ENTRY POINT FOR ALL ROUTINES IN DRLOGÛ;RÜ;=QÝ; REVERIFY DPB ADDRESS GIVEN THAT THE POINTER GOING INTO THE ROUTINES NO LONGERO'Þ; POINTS PAST THE FUNCTION CODE WORD.Nß;Oà;S á$DRLG1::0â MOVB (R3),R0 ;GET THE FUNCTION CODE FROM DPB#ã CMPB R0,#$LNFHI ;IS IT TOO HIGH?Gä BHI 10$ ;IF HI, YES5å ASL R0 ;GET OFFSET INTO TABLE BY MULTIPLYING BY 4 æ ASL R0 ;,ç ADD #$LNSFT,R0 ;POINT INTO FUNCTION TABLEAè MOV (R0)+,-(SP) ;GET THE COMPLETION ROUTINE ADDRESS FROM TABLE0é CMPB (R0)+,$DICSV+1 ;DOES THE DPB SIZE MATCH?ê BNE 10$ ;IF NE, NOëì .IF DF L$$GCLí-î MOV $TKTCB,R1 ;GET THE CURRENT TCB ADDRESSO4ï MOV T.UCB(R1),R1 ;GET THE CURRENT TI: OF THE TASK;ð CALL $GTUSR ;SET UP THE USER LOGICAL HASH TABLE ADDRESSBñò .ENDC ;DF L$$GCLIó@ô CMPB #D$COM4,(R0)+ ;DOES THIS FUNCTION LIVE IN ANOTHER DIRCOM%õ BEQ 20$ ;IF EQ, YES, SWITCH TO IT+ö CALLR @(SP)+ ;PROCESS THE FUNCTION TYPEA÷10$: DRSTS D.RS99 ;RETURN DIRECTIVE STATUS -- DPB SIZE INVALIDøCù20$: CALL $MPDC4 ;CALL THE ROUTINE IN THE OTHER DIRECTIVE COMMON2ú RETURN ;RETURN BACK TO DISPATCHER SUCCESFULLYûü .PAGE;ý .SBTTL ACROB - ROUTINE TO VALIDATE USER BUFFER ADDRESSES þ .ENABL LSB ÿ;+;RO; THESE ROUTINES ADDRESS CHECK AND CALCULATE THE BIAS AND DISPLACEMENT (APR6) ; OF A SPECIFIED USER BUFFER.E;C ; INPUTS:$1; R3 = THE ADDRESS OF THE TWO WORDS IN THE DPBC5; CONTAINING THE USER VIRTUAL ADDRESS AND THER(; BYTE COUNT SIZE OF THAT BUFFER ;C ;M ; OUTPUTS: ;T* ; R0 = THE BYTECOUNT OF THE USER BUFFER%; R1 = THE BIAS OF THE USER BUFFERL2; R2 = THE APR6 DISPLACEMENT OF THE USER BUFFER; R3 = R3+4; R4 = UNCHANGED ;J; AN ERROR CONDITION IN THIS ROUTINE CAUSES AN IMMEDIATE DIRECTIVE ERROR6; TRAP PREVENTING ANY RETURN TO THE CALLING ROUTINE.;-3ACROB: MOV #$ACHKB,-(SP) ;ADDRESS CHECK BUFFER RWH# BR 10$ ;GO TO COMMON PROCESSING 3ACRIB: MOV #$ACHRO,-(SP) ;ADDRESS CHECK BUFFER ROF710$: MOV (R3)+,R0 ;GET THE ADDRESS OF THE USER BUFFERH! BEQ 20$ ;IF EQ, THERE IS NONE # MOV (R3)+,R1 ;GET SIZE OF BUFFER% BEQ 30$ ;IF EQ, IT IS NONEXISTENTE" CMP R1,#LN$SIZ ;IS IT TOO LARGE BHI 30$ ;IF HI, YESE*  CALL @(SP)+ ;CALL THE CHECKING ROUTINE%! BCS 20$ ;IF CS, BUFFER IS INVALIDT:" CALL $RELOC ;SET UP THE APR BIAS AND OFFSET FOR BUFFER+# MOV -2(R3),R0 ;SET UP THE SIZE OF BUFFER $ RETURNO%)&20$: DRSTS D.RS98 ;ADDRESS CHECK ERRORS)'30$: DRSTS D.RS89 ;INVALID BUFFER SIZE3( ) .DSABL LSBE*+ .ENDC ; DF L$$GCL!N$$DIR$,- .PAGE2. .SBTTL $LNFCL - LOGICAL NAME CREATION DIRECTIVE/0 .IF DF L$$GCL 1 .ENABL LSB234;+25; $LNFCL - ENTRY POINT FOR LOGICAL NAME CREATION6;(L7; THIS ROUTINE IS ENTERED FROM THE DRLOG DISPATCH AREA WITH R3 POINTING TO8; THE FOLLOWING DPB VALUES:S9;O':; WD. 01 -- SUBFUNCTION CODE (0),MODEP!;; WD. 02 -- TABLE NUMBER,STATUS,<; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)=; WD. 04 -- SIZE OF LOGICAL NAME BUFFER0>; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-?; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERM@;AA B$LNFCL::4B .IF DF C$$RLG ; REMOTE LOGICAL SUPPORT ;DPR039B ;DPR039TB .MCALL CPRDF$ ;DPR039B CPRDF$ ;DPR039 B ;DPR039C=B BIT #F5.RLG,$FMSK5 ;ARE WE USING REMOTE LOGICAL? ;DPR039O B BEQ 9$ ;IF EQ NO ;DPR039B; ;DPR0391B; GET A REQUEST PACKET FROM CPRBUF ;DPR039GB; ;DPR0392B MOV 6(R3),R1 ;GET SIZE OF USER BUFFER ;DPR039'B BEQ 1$ ;NULL NOT ALLOWED ;DPR039 B ;D00–èe¼eÝb`TADATADATADATADATADATAPR039I.B CMP R1,#LN$SIZ ;IS SIZE TOO BIG? ;DPR039"B BLOS 2$ ;IF LOS NO ;DPR039;B1$: DRSTS D.RS89 ;RETURN ILLEGAL BUFFER LENGTH ;DPR039DB2$: ;DPR039?B CMP 12(R3),#LN$SIZ ;IS EQUIVALENCE STRING TOO BIG? ;DPR039S!B BHI 1$ ;IF HI YES ;DPR039BAB ADD 12(R3),R1 ;INCLUDE ENOUGH SPACE FOR EQUIV. STRING ;DPR039SB ;DPR039 >B ADD #,R1 ;ADD SIZE OF HEADER & DPB ;DPR039B ;DPR0399>B MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ ;DPR039;B ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ;DPR039 B ASH #-6,R1 ; ;DPR039R*B MOV R3,R5 ;SAVE DPB POINTER ;DPR039DB MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START ;DPR0392B CALL $CPALO ;GET BUFFER FROM CPRBUF ;DPR039B; ;DPR039(B; FILL IN REQUEST PACKET ;DPR039B; ;DPR0390B MOV R4,-(SP) ;SAVE SIZE OF REQUEST ;DPR039,B MOV R0,-(SP) ;SAVE PACKET BIAS ;DPR039B ;DPR039 (B MOV R0,KISAR6 ;MAP PACKET ;DPR0391B MOV #MAP6,R1 ;GET ADDRESS OF HEADER ;DPR039DB; ;DPR039#B; LOAD HEADER AREA ;DPR039,B; ;DPR0398B MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST ;DPR039(B CLRB H$ICNT(R1) ;NO ITEMS ;DPR039B; ;DPR039&B; LOAD PARAMETER AREA ;DPR039B; ;DPR039.B ADD #P$DPB,R1 ;POINT TO DPB AREA ;DPR0391B MOV -2(R5),(R1)+ ;COPY DIC AND SIZE ;DPR039P>B MOV (R5),(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER ;DPR0394B MOV 2(R5),(R1)+ ;TABLE NUMBER & STATUS ;DPR039B ;DPR039DFB MOV #,(R1)+ ;ADDRESS OF LOGICAL NAME BUFFER ;DPR0393B MOV 6(R5),(R1)+ ;SIZE OF LOGICAL NAME ;DPR039VB ;DPR039NB MOV #,(R1) ;CALCULATE ADDRESS OF EQUIV STRING BUFFER ;DPR039;B ADD 6(R5),(R1)+ ;SKIP OVER LOGICAL NAME BUFFER ;DPR03919B MOV 12(R5),(R1)+ ;SIZE OF EQUIVALENCE STRING ;DPR039IB; ;DPR039/B; COPY LOGICAL NAME INTO PACKET ;DPR039DB; ;DPR0392B MOV 4(R5),R0 ;USER ADDRESS OF BUFFER ;DPR039:B MOV 6(R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK ;DPR039*B CALL $ACHKB ;CHECK ADDRESS ;DPR039#B BCS 8$ ;IS CS ERROR ;DPR039VB ;DPR039:B CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENT ;DPR039B; ;DPR039B; R1 := BIAS ;DPR039)B; R2 -> APR6 DISPLACEMENT ;DPR039,B; ;DPR039KB SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENT ;DPR039E*B MOV (SP),R3 ;GET DEST BIAS ;DPR039@B MOV #,R4 ;GET DEST DISPLACEMENT ;DPR0390B MOV 6(R5),R0 ;GET SIZE OF TRANSFER ;DPR039;B CALL $BLXIO ;TRANSFER LOGICAL NAME INTO BUFFER ;DPR039 B; ;DPR0394B; COPY EQUIVALENCE STRING INTO PACKET ;DPR039B; ;DPR0393B MOV 10(R5),R0 ;USER ADDRESS OF BUFFER ;DPR039 ;B MOV 12(R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK ;DPR039*B CALL $ACHKB ;CHECK ADDRESS ;DPR039#B BCS 8$ ;IS CS ERROR ;DPR039MB ;DPR039 :B CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENT ;DPR039B ;DPR0399KB SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENT ;DPR039 *B MOV (SP),R3 ;GET DEST BIAS ;DPR039EB MOV #,R4 ;CALCULATE DEST DISPLACEMENT ;DPR039 8B ADD 6(R5),R4 ;SKIP OVER LOGICAL NAME BUFFER ;DPR0391B MOV 12(R5),R0 ;GET SIZE OF TRANSFER ;DPR039A@B CALL $BLXIO ;TRANSFER EQUIVALENCE STRING INTO BUFFER ;DPR039B ;DPR039R0B MOV (SP)+,R0 ;GET PACKET BIAS BACK ;DPR0392B MOV (SP)+,R4 ;GET PACKET LENGTH BACK ;DPR039B ;DPR039:B CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAME ;DPR039B ;DPR039V4B CALLR $CPDEA ;RELEASE THE CPRBUF SPACE ;DPR039B; ;DPR039!B; HANDLE ERRORS ;DPR039B; ;DPR039.B8$: MOV (SP)+,R0 ;GET PACKET BIAS ;DPR039)B TST (SP)+ ;CLEAN OFF STACK ;DPR039L-B CALL $CPDEA ;DEALLOCATE BUFFER ;DPR039F+B DRSTS D.RS98 ;ADDRESS ERROR ;DPR039+B9$: ;DPR039B .ENDC ; C$$RLG ;DPR0300–ðeue³cÙ´cÚµcÛ¶c�·c›’9T7C MOV #$LGBUF,R4 ;GET POINTER TO START OF STORAGE AREAC7D MOV (R3)+,-(SP) ;STORE THE SUBFUNCTION CODE AND MODE8E MOVB (R3),(SP) ;MOVE THE TABLE NUMBER TO STORAGE AREA/F CMPB #T$BLNM,(SP) ;IS THE TABLE NUMBER VALIDEG BLO 50$ ;IF LO, NO, EXITH; II; VERIFY THE DPB ARGUMENTS AND SET UP A DESCRIPTOR BLOCK TO PASS TO THEE<J; ACTION ROUTINE THAT ACTUALLY CREATES AND PLACES THE LNB.K;R6L MOV (SP)+,(R4)+ ;MOVE IN THE TABLE AND BLOCK NUMBER*M MOV $TKTCB,R2 ;GET THE CURRENT TASK TCB0N MOV T.UCB(R2),R5 ;GET THE CURRENT TI: ADDRESS7O TSTB (R3) ;SEE IF THIS IS A SYSTEM LOGICAL CREATIONOP BNE 10$ ;IF NE, NO1Q BIT #T3.PRV,T.ST3(R2); IS THE TASK PRIVILEGED?,R BEQ 60$ ;IF EQ, NO, DON'T ALLOW CREATION1S10$: CMPB #LT.TSK,(R3) ;IS THIS A TASK CREATIONT*T BEQ 20$ ;IF EQ, YES, LEAVE TCB ADDRESS-U MOV R5,R2 ;GET UCB ADDRESS INSTEAD OF TCBU9V20$: CMPB #LT.GRP,(R3) ;IS THIS A GROUP TABLE CREATION?;/W BNE 30$ ;IF NE, NO, LEAVE GROUP ENTRY BLANK,?X CALL GTUIC ;GET THE CURRENT TASKS PROTECTION UIC GROUP CODET<Y MOVB R1,(R3) ;FILL IN THE GROUP CODE FROM PROTECTION UIC3Z30$: SWAB (R3) ;SWITCH THE STATUS AND GROUP BYTE3;[ MOV (R3)+,(R4)+ ;MOVE THE STATUS AND GROUP TO DESCRIPTOR 5\ MOV R2,(R4)+ ;MOVE TCB/UCB ADDRESS INTO DESCRIPTORK2] CALL ACRIB ;VALIDATE IT IN THE USER TASK IMAGE2^ CALL PSCNV ;CONVERT TO P/OS STYLE IF NECESSARY5_ MOV R0,(R4)+ ;MOVE IN THE SIZE OF THE LOGICAL NAMEN3` MOV R1,(R4)+ ;MOVE IN THE APR BIAS OF THE BUFFER;a MOV R2,(R4)+ ;MOVE IN THE KISAR6 BIASED OFFSET OF BUFFERD8b CALL ACRIB ;VALIDATE EQUIVALENCE NAME BUFFER ADDRESS9c MOV R0,(R4)+ ;MOVE IN THE SIZE OF THE EQUIVALENCE NAME33d MOV R1,(R4)+ ;MOVE IN THE APR BIAS OF THE BUFFERS;e MOV R2,(R4)+ ;MOVE IN THE KISAR6 BIASED OFFSET OF BUFFERO;f MOV #$LGBUF,R5 ;POINT TO START OF DESCRIPTOR BLOCK AGAINLgh;;Ki; AT THIS POINT A DESCRIPTOR BLOCK WITH ALL VALIDATED PARAMETERS HAS BEENL@j; CREATED AND POINTED TO BY R5. THIS BLOCK HAS THE STRUCTURE:k;M3l; -----------------------------------------------E3m; | BLOCK NUMBER | TABLE NUMBER |A3n; -----------------------------------------------V3o; | GROUP NUMBER | STATUS BYTE |F3p; -----------------------------------------------S3q; | TCB / UCB ADDRESS |R3r; -----------------------------------------------O3s; | SIZE OF LOGICAL NAME IN BUFFER |H3t; -----------------------------------------------C3u; | 32 WD APR ADDRESS OF START OF LOGICAL |-3v; ----------------------------------------------- 3w; | APR6 BIASED OFFSET TO START OF LOGICAL |-3x; ----------------------------------------------- 3y; | SIZE OF EQUIVALENCE NAME IN BUFFER |-3z; -----------------------------------------------C3{; | 32 WD APR ADDRESS OF START OF EQUIVALENCE |-3|; -----------------------------------------------N3}; | APR6 BIASED OFFSET TO START OF EQUIVALENCE|-3~; -----------------------------------------------S;T7€ CALL $CRLOG ;CREATE AND INSERT A LOGICAL NAME BLOCK-9� BCS 70$ ;IF C BIT SET, AN ALLOCATION FAILURE OCCURREDO4‚ TST R1 ;CHECK FOR SUPERCESSION OF PREVIOUS ENTRY3ƒ BEQ 150$ ;IF EQ, NO SUPERCESSION, SIMPLY RETURNR„; ;…40$: DRSTS D.RSP3 ;RETURN A STATUS OF LOGICAL SUPERCEDED*†50$: DRSTS D.RS20 ;INVALID TABLE NUMBER)‡60$: DRSTS D.RS16 ;PRIVILEGE VIOLATION-6ˆ70$: DRSTS D.RS1 ;SECONDARY POOL ALLOCATION FAILURE‰Š .PAGE2‹ .SBTTL $LNDEL - LOGICAL NAME DELETION DIRECTIVEŒ�;+2Ž; $LNDEL - ENTRY POINT FOR LOGICAL NAME DELETION�;O�; THE ROUTINE IS ENTERED FROM THE DRLOG DISPATCH AREA WITH R3 POINTING TO THE ‘; FOLLOWING DPB ENTRIES:’;'“; WD. 01 -- SUBFUNCTION CODE (2),MODEY"”; WD. 02 -- TABLE NUMBER, STATUS,•; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)–; WD. 04 -- SIZE OF LOGICAL NAME BUFFER0—;S˜;-™ š$LNDEL::4š .IF DF C$$RLG ; REMOTE LOGICAL SUPPORT ;DPR039š ;DPR039.=š BIT #F5.RLG,$FMSK5 ;ARE WE USING REMOTE LOGICAL? ;DPR039#š BNE 100$ ;IF00–øe¼eÝb`TADATADATADATADATADATA NE YES ;DPR039C1š JMP 109$ ;PERFORM NORMAL PROCESSING ;DPR039Fš100$: ;DPR039š; ;DPR0391š; GET A REQUEST PACKET FROM CPRBUF ;DPR039-š; ;DPR0392š MOV 6(R3),R1 ;GET SIZE OF USER BUFFER ;DPR039.š CMP R1,#LN$SIZ ;IS IT TOO LARGE? ;DPR039*š BLOS 105$ ;IF LO OR SAME NO ;DPR0390š DRSTS D.RS89 ;INVALID BUFFER SIZE ;DPR039š105$: ;DPR039>š ADD #,R1 ;ADD SIZE OF HEADER & DPB ;DPR039>š MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ ;DPR039;š ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ;DPR039;š ASH #-6,R1 ; ;DPR039Dš MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START ;DPR039*š MOV R3,R5 ;SAVE DPB POINTER ;DPR0392š CALL $CPALO ;GET BUFFER FROM CPRBUF ;DPR039š; ;DPR0399š; FILL IN REQUEST PACKET AND SEND TO CPRAME ;DPR039Rš; ;DPR0390š MOV R4,-(SP) ;SAVE SIZE OF REQUEST ;DPR039,š MOV R0,-(SP) ;SAVE PACKET BIAS ;DPR039š ;DPR039U(š MOV R0,KISAR6 ;MAP PACKET ;DPR0391š MOV #MAP6,R1 ;GET ADDRESS OF HEADER ;DPR039š ;DPR039 8š MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST ;DPR039(š CLRB H$ICNT(R1) ;NO ITEMS ;DPR039š ;DPR0399.š ADD #P$DPB,R1 ;POINT TO DPB AREA ;DPR0391š MOV -2(R5),(R1)+ ;COPY DIC AND SIZE ;DPR039K>š MOV (R5),(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER ;DPR039š ;DPR039O.š TST 4(R5) ;DELETE ALL LOGICALS? ;DPR039š BNE 106$ ;NO ;DPR039 9š CLR (R1)+ ;NO ADDRESS OF LOGICAL NAME BUFFER ;DPR039#š CLR (R1)+ ;DPR039R.š BR 108$ ;DON'T COPY LOGICAL NAME ;DPR039š106$: ;DPR039Fš MOV #,(R1)+ ;ADDRESS OF LOGICAL NAME BUFFER ;DPR0399š MOV 6(R5),(R1)+ ;SIZE OF LOGICAL NAME BUFFER ;DPR039š; ;DPR039/š; COPY LOGICAL NAME INTO PACKET ;DPR039Cš; ;DPR0392š MOV 4(R5),R0 ;USER ADDRESS OF BUFFER ;DPR039:š MOV 6(R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK ;DPR039*š CALL $ACHKB ;CHECK ADDRESS ;DPR039#š BCS 8$ ;IS CS ERROR ;DPR0391š ;DPR039:š CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENT ;DPR039š; ;DPR039š; R1 := BIAS ;DPR039)š; R2 -> APR6 DISPLACEMENT ;DPR039(š; ;DPR039Kš SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENT ;DPR039E*š MOV (SP),R3 ;GET DEST BIAS ;DPR039@š MOV #,R4 ;GET DEST DISPLACEMENT ;DPR0390š MOV 6(R5),R0 ;GET SIZE OF TRANSFER ;DPR039;š CALL $BLXIO ;TRANSFER LOGICAL NAME INTO BUFFER ;DPR039 š108$: ;DPR0390š MOV (SP)+,R0 ;GET PACKET BIAS BACK ;DPR0392š MOV (SP)+,R4 ;GET PACKET LENGTH BACK ;DPR039š ;DPR039:š CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAME ;DPR039š ;DPR039,.š CALLR $CPDEA ;DEALLOCATE BUFFER ;DPR039š109$: ;DPR039š .ENDC ; C$$RLG ;DPR039M›;MNœ; CREATE A DESCRIPTOR BLOCK TO SEARCH THE APPROPRIATE TABLE FOR ALL LOGICALSL�; OR FOR A SPECIFIC ONE. THE DESCRIPTOR IS A FOUR WORD BLOCK BEGINNING ATMž; LOCATION $TEMP0 IN SYSCM AND CONTAINS THE APR BIAS AND OFFSET AND SIZE OFPLŸ; A SPECIFIC LOGICAL (OR ZEROES IF ALL) AND THE UCB ADDRESS TO MATCH (TCB, ; IF TASK LOGICAL DELETE).¡;U?¢ MOV #$TONYL,R5 ;GET ADDRESS OF DESCRIPTOR BLOCK TO BE FILLED;6£ MOV (R3)+,-(SP) ;STORE THE MODE VALUE FOR LATER USE¤;N5¥; GET THE APPROPRIATE UCB (OR TCB, IF TASK LOGICAL)O¦;C§ MOV $TKTCB,R2 ;GET TASK TCB8¨ MOV T.UCB(R2),R4 ;GET THE ASSOCIATED TI: FOR THE TASK/© CMPB #T$BLNM,(R3) ;IS THE TABLE NUMBER VALIDIª BLO 50$ ;IF LO, NO, EXIT,« TSTB (R3) ;IS THIS A SYSTEM TABLE DELETE¬ BNE 110$ ;IF NE, NOEE­ BIT #T3.PRV,T.ST3(R2); IS THE TASK PRIVILEGED TO DELETE SYSTEM LOGE5® BEQ 60$ ;IF EQ, NO, EXIT WITH PRIVILEGE VIOLATIONB6¯110$: CMPB #LT.TSK,(R3) ;IS THIS A TASK TABLE DELETE0° BEQ 120$ ;IF EQ, YES, KEEP TCB IN DESCRIPTOR± MOV R4,R2 ;GET UCB ADDRESS:²120$: MOV R2,-(R5) ;MOVE TCB/UCB ADDRESS INTO DESCRIPTOR³;EJ´; PICK UP THE AP00–fue³cÙ´cÚµcÛ¶c�·c›’PROPRIATE TABLE NUMBER AND BLOCK IDENTIFIER FROM THE DPBµ;@¶ MOVB (R3)+,(SP) ;MOVE THE TABLE NUMBER INTO STORAGE WITH MODE?· MOV (SP)+,-(R5) ;GET THE TABLE AND BLOCK NUMBER FROM STORAGEE2¸ INC R3 ;POINT TO THE BUFFER ADDRESS IN THE DPB¹;QJº; CHECK FOR A SPECIFIC LOGICAL DELETION OR AN ENTIRE TABLE BY LOOKING AT+»; THE BUFFER ADDRESS FOR THE LOGICAL NAMEE¼;B*½ TST (R3) ;CHECK FOR A SPECIFIC LOGICAL!¾ BNE 130$ ;IF NE, THERE IS ONEU¿;DFÀ; ALL LOGICALS ARE TO BE DELETED. LEAVE THE BUFFER DESCRIPTORS ZEROÁ;K% CLR -(R5) ;CLEAR THE LOGICAL SIZE /à CLR -(R5) ;CLEAR THE APR BIAS TO THE BUFFERT-Ä CLR -(R5) ;CLEAR THE OFFSET TO THE STRINGLÅ BR 140$ ;JOIN COMMON CODECÆ;;MÇ; A SPECIFIC LOGICAL IS GIVEN. VALIDATE THE USER BUFFER AND SIZE AND PLACED!È; THEM IN THE DESCRIPTOR BLOCK.NÉ;:Ê130$: CALL ACRIB ;ADDRESS CHECK THE USER LOGICAL BUFFER2Ë CALL PSCNV ;CONVERT TO P/OS STYLE IF NECESSARY8Ì MOV R2,-(R5) ;FILL IN APR6 OFFSET TO START OF LOGICAL+Í MOV R1,-(R5) ;FILL IN APR BIAS OF BUFFER1Î MOV R0,-(R5) ;FILL IN BYTE COUNT IN DESCRIPTOR)Ï;EKÐ; CHECK THE DESCRIPTOR FOR COMPLETE OR SPECIFIC DELETE. IF SPECIFIC, THELHÑ; LOGICAL MUST BE HASHED, SEARCHED FOR IN THE TABLE, AND THEN DELETED.LÒ; IF THIS IS A COMPLETE DELETE, CALL $LNDAL TO ELIMINATE EVERYTHING IN THEÓ; HASH TABLE. Ô;A<Õ140$: MOV R5,R0 ;SET UP DESCRIPTOR ADDRESS FOR PROCESSING8Ö CALL $DELOG ;DELETE THE APPROPRIATE LOGICAL OR TABLE*× BCC 150$ ;IF CC, SUCCESSFUL COMPLETION:Ø TST R3 ;CHECK WHETHER NOT FOUND OR PRIVILEGE VIOLATION4Ù BNE 60$ ;IF NE, PRIVILEGE VIOLATION ON FOUND LNB%Ú BR 160$ ;IF EQ, LOGICAL NOT FOUND Û150$: RETURNÜ-Ý160$: DRSTS D.RS21 ;LOGICAL NAME NOT FOUND Þ ß .DSABL LSBEà .PAGE5á .SBTTL $LNFTL - LOGICAL NAME TRANSLATION DIRECTIVEEâã;+Dä; $LNFTL - ENTRY POINT FOR LOGICAL NAME DIRECTIVE TRANSLATION CODEå;-Mæ; THIS DIRECTIVE SEARCHES EACH OF THE HIERARCHICAL TABLES FOR THE SPECIFIEDBNç; LOGICAL UNLESS AN INHIBIT MASK BIT IS SET TO PREVENT THAT TABLE FROM BEINGè; LOOKED AT.é;Oê; THE ROUTINE IS ENTERED FROM THE DRLOG DISPATCH AREA WITH R3 POINTING TO THEOë; FOLLOWING DPB ENTRIES:ì;6'í; WD. 01 -- SUBFUNCTION CODE (1),MODE î; WD. 02 -- TBMASK, STATUS,ï; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER)ð; WD. 04 -- SIZE OF LOGICAL NAME BUFFERI0ñ; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER-ò; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERREó; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAMEB>ô; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODEõ; Lö; THE FOLLOWING WORD IS NOT PRESENT IF THIS ROUTINE IS ENTERED VIA A TLOG$!÷; DIRECTIVE FROM A P/OS SYSTEM.ø; Bù; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCKú;3û ü$LNFTL::4ü .IF DF C$$RLG ; REMOTE LOGICAL SUPPORT ;DPR039ü ;DPR039-=ü BIT #F5.RLG,$FMSK5 ;ARE WE USING REMOTE LOGICAL? ;DPR039I!ü BNE 1$ ;IF NE YES ;DPR039 0ü JMP 11$ ;PERFORM NORMAL PROCESSING ;DPR039ü1$: ;DPR039ü; ;DPR0391ü; GET A REQUEST PACKET FROM CPRBUF ;DPR039Oü; ;DPR0393ü MOV 6(R3),R1 ;GET SIZE OF LOGICAL NAME ;DPR039M%ü BEQ 2$ ;IF ZERO ERROR ;DPR039Dü ;DPR039I.ü CMP R1,#LN$SIZ ;IS IT TOO LARGE? ;DPR039(ü BLOS 3$ ;IF LO OR SAME NO ;DPR0393ü2$: DRSTS D.RS89 ;INVALID BUFFER SIZE ;DPR039$ü3$: ;DPR039?ü CMP 12(R3),#LN$SIZ ;IS EQUIVALENCE STRING TOO BIG? ;DPR039P!ü BHI 2$ ;IF HI YES ;DPR039;Aü ADD 12(R3),R1 ;INCLUDE ENOUGH SPACE FOR EQUIV. STRING ;DPR039Uü; ;DPR039>ü; INCREASE ALLOCATION TO ALLOW FOR THE FOLLOWING; ;DPR039 ü; H$SIZE HEADER ;DPR039ü; TL$SIZ DPB ;DPR039D.ü; 10 TASK DESTINATION ADDRESSES; ;DPR039%ü; EQUIV STRING BUFFER ;DPR039 ü; RETURNED SIZE ;DPR039!ü; TABLE # & MODE ;DPR039 %ü; LOGICAL STATUS BITS ;DPR039P&ü; 6 RETURNED PARAMETERS ;DPR039 ü; RETURNED SIZE ;DPR039!ü; TABLE # & MODE ;DPR0300–f¼eÝb`TADATADATADATADATADATA9,%ü; LOGICAL STATUS BITS ;DPR039Iü; ;DPR039(üTMP = H$SIZE+TL$SIZ+10+6 ;DPR039ü ADD #TMP,R1 ;DPR0390ü ;DPR039 >ü MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ ;DPR039;ü ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ;DPR039 ü ASH #-6,R1 ; ;DPR039 Dü MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START ;DPR039*ü MOV R3,R5 ;SAVE DPB POINTER ;DPR0392ü CALL $CPALO ;GET BUFFER FROM CPRBUF ;DPR039ü; ;DPR0399ü; FILL IN REQUEST PACKET AND SEND TO CPRAME ;DPR039 ü; ;DPR0390ü MOV R4,-(SP) ;SAVE SIZE OF REQUEST ;DPR039,ü MOV R0,-(SP) ;SAVE PACKET BIAS ;DPR039ü ;DPR039U(ü MOV R0,KISAR6 ;MAP PACKET ;DPR0391ü MOV #MAP6,R1 ;GET ADDRESS OF HEADER ;DPR039ü ;DPR039 8ü MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST ;DPR039(ü CLRB H$ICNT(R1) ;NO ITEMS ;DPR039ü; ;DPR039ü; FILL IN DPB ;DPR039Mü; ;DPR039.ü ADD #P$DPB,R1 ;POINT TO DPB AREA ;DPR0391ü MOV -2(R5),(R1)+ ;COPY DIC AND SIZE ;DPR0399>ü MOV (R5),(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER ;DPR0396ü MOV 2(R5),(R1)+ ;COPY TABLE MASK & STATUS ;DPR039ü ;DPR039 ;ü MOV #TMP,(R1)+ ;ADDRESS OF LOGICAL NAME BUFFER ;DPR039 9ü MOV 6(R5),(R1)+ ;SIZE OF LOGICAL NAME BUFFER ;DPR039;ü ;DPR039;@ü MOV #TMP,(R1) ;CALCULATE ADDRESS OF EQUIV STRING BUF ;DPR039;ü ADD 6(R5),(R1)+ ;SKIP OVER LOGICAL NAME BUFFER ;DPR0399ü MOV 12(R5),(R1)+ ;SIZE OF EQUIVALENCE STRING ;DPR0395ü ;DPR039 =ü MOV #TMP-6,(R1)+ ;ADDRESS OF RETURNED SIZE BUFFER ;DPR039M>ü MOV #TMP-4,(R1)+ ;ADDRESS OF TABLE # & MODE BUFFER ;DPR039Cü MOV #TMP-2,(R1)+ ;ADDRESS OF LOGICAL STATUS BITS BUFFER ;DPR039 ü; ;DPR039Pü; FILL IN TASK ADDRESSES (TO BE USED AFTER CPRAME COMPLETES FUNCTION) ;DPR039ü; ;DPR039Dü MOV 10(R5),(R1)+ ;STORE TASK ADDRESS OF EQUIV STRING BUF ;DPR039Dü MOV 14(R5),(R1)+ ;STORE TASK ADDRESS OF RETURNED SIZE BUF ;DPR039Bü MOV 16(R5),(R1)+ ;STORE TASK ADDRESS OF TABLE # & MODE ;DPR039Eü MOV 20(R5),(R1) ;STORE TASK ADDRESS OF LOGICAL STATUS BITS ;DPR039Eü; ;DPR039/ü; COPY LOGICAL NAME INTO PACKET ;DPR039Oü; ;DPR0392ü MOV 4(R5),R0 ;USER ADDRESS OF BUFFER ;DPR039:ü MOV 6(R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK ;DPR039*ü CALL $ACHKB ;CHECK ADDRESS ;DPR039$ü BCS 10$ ;IS CS ERROR ;DPR039ü ;DPR039V:ü CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENT ;DPR039ü; ;DPR039ü; R1 := BIAS ;DPR039)ü; R2 -> APR6 DISPLACEMENT ;DPR039 ü; ;DPR039Kü SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENT ;DPR039E*ü MOV (SP),R3 ;GET DEST BIAS ;DPR0395ü MOV #MAP6+TMP,R4 ;GET DEST DISPLACEMENT ;DPR03960ü MOV 6(R5),R0 ;GET SIZE OF TRANSFER ;DPR039;ü CALL $BLXIO ;TRANSFER LOGICAL NAME INTO BUFFER ;DPR039 ü ;DPR0390ü MOV (SP)+,R0 ;GET PACKET BIAS BACK ;DPR0392ü MOV (SP)+,R4 ;GET PACKET LENGTH BACK ;DPR039ü ;DPR039 :ü CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAME ;DPR039ü; ;DPR039&ü; GET RESPONSE PACKET ;DPR039ü; ;DPR039,ü MOV R0,-(SP) ;SAVE PACKET BIAS ;DPR039(ü MOV R0,KISAR6 ;MAP PACKET ;DPR039ü ;DPR0396;ü CMP #IS.SUC,MAP6+H$STAT ;WAS SUCCESS RETURNED? ;DPR039B!ü BEQ 4$ ;IF EQ YES ;DPR039U@ü CMP #IE.RBS,MAP6+H$STAT ;WAS IT JUST A SIZE PROBLEM? ;DPR039(ü BNE 5$ ;IF NE FATAL ERROR ;DPR039ü4$: ;DPR039!üDPB = MAP6+P$DPB ;DPR039S"üTASK = DPB+TL$SIZ ;DPR039üTEMP = TASK+10 ;DPR039Pü; ;DPR0390ü; TRANSFER EQUIV STRING INTO TASK ;DPR039ü; ;DPR0397ü MOV TASK,R0 ;TASK ADDRESS OF EQUIV STRING ;DPR03903ü MOV DPB+14,R1 ;SIZE OF BUFFER FROM DPB ;DPR039;,ü CALL $ACHKB ;DO ADDRESS CHECK ;DPR039#ü BCS 9$ ;IF CS ERROR ;DPR039Sü ;DPR039J8ü CALL $RELOC ;GET BIAS AND OFFSET OF BUFFER ;DPR039ü; 00–fue³cÙ´cÚµcÛ¶c�·c›’ ;DPR039ü; R1 := BIAS ;DPR039)ü; R2 -> APR6 DISPLACEMENT ;DPR039 ü; ;DPR0393ü MOV R1,R3 ;SET UP DEST BIAS FOR BLXIO ;DPR039N1ü MOV R2,R4 ;SET UP DEST DISPLACEMENT ;DPR039 6ü MOV (SP),R1 ;SET UP SOURCE BIAS FOR APR5 ;DPR0399ü MOV #MAP5+TMP,R2 ;SET UP SOURCE DISPLACEMENT ;DPR039D6ü ADD DPB+10,R2 ;SKIP OVER LOGICAL NAME BUF ;DPR039-ü MOV TEMP,R0 ;GET RETURNED SIZE ;DPR039 9ü CALL $BLXIO ;RETURN EQUIVALENCE NAME STRING ;DPR039;ü; ;DPR0391ü; TRANSFER OTHER BUFFERS INTO TASK ;DPR039Pü; ;DPR0395ü MOV #TASK+2,R3 ;ADDRESS OF OTHER BUFFERS ;DPR039Eü ;DPR039D0ü MOV TEMP,R4 ;SIZE OF EQUIV STRING ;DPR039%ü CALL 6$ ;MOVE TO TASK ;DPR039Eü ;DPR0390,ü MOV TEMP+2,R4 ;TABLE # & MODE ;DPR039%ü CALL 6$ ;MOVE TO TASK ;DPR039Pü ;DPR039F0ü MOV TEMP+4,R4 ;LOGICAL STATUS BITS ;DPR039%ü CALL 6$ ;MOVE TO TASK ;DPR039Aü ;DPR039D3ü5$: MOV (SP)+,R0 ;GET BUFFER BIAS BACK ;DPR039E.ü CALLR $CPDEA ;DEALLOCATE BUFFER ;DPR039ü; ;DPR039Tü; ROUTINE TO VERIFY THE EXISTENCE OF AN OPTIONAL WORD, ADDRESS CHECK IT IF ;DPR039Sü; IT IS THERE, AND PLACE THE VALUE IN R4 IN THE LOCATION SPECIFIED IN THE ;DPR039,ü; NEXT WORD IN THE DPB (R3). ;DPR039ü; ;DPR039:ü6$: MOV (R3)+,R0 ;SEE IF NEXT ENTRY IS DEFINED ;DPR039&ü BEQ 8$ ;IF EQ, NO, EXIT ;DPR039ü ;DPR039R9ü MOV #7$,-(SP) ;SPECIFY $SGFIN RETURN ADDRESS ;DPR039B*ü CALL $SGFIN ;INHIBIT TRAPS ;DPR0399ü MOV R4,-(SP) ;GET VALUE TO PLACE IN LOCATION ;DPR039 2ü MTPD (R0) ;PLACE VALUE INTO LOCATION ;DPR039*ü RETURN ;RETURN FROM $SGFIN ;DPR039ü7$: ;DPR0390ü ;CARRY-BIT INDICATES STATUS [TBS] ;DPR039ü8$: RETURN ;DPR039ü; ;DPR039!ü; HANDLE ERRORS ;DPR039Xü; ;DPR0393ü9$: MOV (SP)+,R0 ;GET BUFFER BIAS BACK ;DPR039 -ü CALL $CPDEA ;DEALLOCATE BUFFER ;DPR039N0ü DRSTS D.RS98 ;ADDRESS CHECK ERROR ;DPR039ü ;DPR039/ü10$: MOV (SP)+,R0 ;GET PACKET BIAS ;DPR039 )ü TST (SP)+ ;CLEAN OFF STACK ;DPR039O-ü CALL $CPDEA ;DEALLOCATE BUFFER ;DPR039I+ü DRSTS D.RS98 ;ADDRESS ERROR ;DPR039Cü11$: ;DPR039 ü .ENDC ; C$$RLG ;DPR039 ýþ;9Lÿ; A DESCRIPTOR BLOCK IS SET UP TO PASS TO THE TABLE LOOKUP ROUTINES. THISO; BLOCK GETS THE MODIFIER VALUE FROM THE DPB DIRECTLY. THE USER LOGICAL NAMECP; BUFFER IS ADDRESS CHECKED (FOR READ-ONLY ACCESS) AND THE APR BIAS AND OFFSETP; TO THE START OF THE LOGICAL STRING IS PLACED IN THE DESCRIPTOR. THE SIZE OFL; THE INDICATED STRING IS ALSO PLACED IN THE BLOCK. R0 WILL POINT TO THIS-; BLOCK ACROSS ALL CALLS IN THIS DIRECTIVE.:; 2 MOV #$TONYL,R5 ;GET POINTER TO DESCRIPTOR BLOCK9 MOV $TKTCB,-(R5) ;GET THE CURRENT TCB FOR FIRST LOOKUP % MOV (R5),R0 ;SAVE THE TCB ADDRESST;  MOV (R3)+,-(R5) ;MOVE THE MODIFIER INTO DESCRIPTOR BLOCKM?  MOV (R3)+,$TONYL ;STORE THE TABLE INHIBIT MASK FOR LATER USEA0  BIT #1,$TONYL ;SEE IF TASK TABLE IS INHIBITED;  BEQ 12$ ;IF EQ, NO, KEEP TCB ADDRESS IN PACKET ;DPR039NC  MOV T.UCB(R0),2(R5) ;MOVE THE UCB ADDRESS INTO THE PACKET ;**-1;C.; ADDRESS CHECK THE USER LOGICAL NAME BUFFER;#F12$: CALL ACRIB ;ADDRESS CHECK THE USER LOGICAL NAME BUFFER ;DPR0399 CALL PSCNV ;CONVERT TO P/OS STYLE IF NECESSARY ;**-1C8 MOV R3,-(SP) ;STORE THE CURRENT DPB POINTER FOR LATER7 MOV R2,-(R5) ;GET THE APR6 OFFSET TO START OF STRINGB3 MOV R1,-(R5) ;GET THE APR BIAS TO LOGICAL STRING ? MOV R0,-(R5) ;GET THE SIZE OF THE LOGICAL NAME IN DESCRIPTORA+ MOV R5,R0 ;POINT R0 TO DESCRIPTOR STARTT;B?; CALL THE ROUTINE TO DO THE LOOKUP IN THE APPROPRIATE TABLESR;C: CMPB #R$LOG,$DICSV+2 ;IS THIS REALLY AN RLOG$ DIRECTIVE3 BEQ 20$ ;IF EQ, YES, SEARCH RECURSIVELY FOR LNBV: CMPB #R$LON,$DICSV+2 ;IS THIS REALLY AN RLOG$ DIRECTIVE3 BEQ 20$ ;IF EQ, YES, SEARCH RECURSIVELY FOR LNB ;TJ ; FOR A TLOG$ DIRECTIVE,00–f¼eÝb`TADATADATADATADATADATA ONLY LOOK FOR THE SPECIFIED LOGICAL NAME IN THE)!; TOP LEVELS OF THE LOGICAL NAME TABLES ";E;# CALL $TBSRC ;SEARCH ALL HIERARCHICAL TABLES FOR LOGICALR*$ BCS 100$ ;IF CS, NO LOGICAL NAME FOUND"% BR 40$ ;JOIN COMMON CODE BELOW&;L'; FOR AN RLOG$ DIRECTIVE, LOOK THROUGH THE LOGICAL NAME TABLES RECURSIVELYG(; FOR THE FINAL EQUIVALENCE NAME. ANY SPECIFIED INHIBIT MASK WILL BES-); PROPAGATED THROUGH ALL RECURSIVE LOOKUPS. *;S:+20$: CLR R3 ;CALL ITERATIVE ROUTINE IN EXACT MATCH MODE2, CALL $LGRCS ;RECURSIVELY LOOK FOR LOGICAL NAME,- BCS 100$ ;IF CS, RECURSIVE LIMIT WAS HIT$. MOV $LSTLG,R3 ;GET POINTER TO LNB%/ BEQ 100$ ;IF EQ, THERE WASN'T ONE;0;,O1; NOW THAT THE LOGICAL NAME HAS BEEN FOUND, THE APR BIAS TO THE LNB IS STORED$M2; FOR LATER USE AND THE USER EQUIVALENCE NAME BUFFER IS ADDRESSED CHECK FOR M3; READ/WRITE ACCESS. IF IS VALID, THE SOURCE AND DESTINATION REGISTERS AREAN4; SET UP FOR A $BLXIO CALL TO PLACE THE EQUIVALENCE NAME IN THE USER BUFFER.5;O:640$: MOV R3,$TONYL ;STORE THE LNB APR BIAS FOR LATER USE17 MOV (SP)+,R3 ;RESTORE THE POINTER INTO THE DPBS<8 CALL ACROB ;ADDRESS CHECK RW THE USER EQUIVALENCE BUFFER39 MOV R3,-(SP) ;STORE THE POINTER TO THE DPB AGAINU5: MOV R1,R3 ;SET UP DESTINATION APR BIAS FOR $BLXIOS7; MOV R2,R4 ;SET UP APR6 OFFSET VALUE FOR DESTINATION '< MOV $TONYL,KISAR6 ;MAP THE FOUND LNB,=;SO>; THE NUMBER OF BYTES TO PASS THROUGH $BLXIO IS DETERMINED BY THE SIZE OF THEQK?; USER BUFFER. IF IT IS LARGE ENOUGH TO HOLD THE ENTIRE STRING, THE SIZE Q@; GIVEN IN THE LOGICAL BLOCK WILL BE PASSED. IF THE BUFFER ISN'T LARGE ENOUGH, QA; ONLY AS MUCH AS IT CAN HOLD WILL BE PASSED. IN EITHER CASE, THE VALUE PASSEDILB; IN THE USER SIZE WORD (RSIZE) WILL BE THE ACTUAL SIZE OF THE EQUIVALENCE C; STRINGD;SDE CMPB MAP6+L.NENS,R0 ;SEE IF THE EQUIVALENCE SIZE IS > BUFFER SIZE7F BHIS 50$ ;IT IS, ONLY RETURN USER BUFFER SIZE WORTHGG CLR R0 ;REMOVE OLD VALUE>H BISB MAP6+L.NENS,R0 ;IT ISN'T, ONLY RETURN EQUIVALENCE SIZE9I50$: CLR R2 ;INITIALIZE THE POINTER TO THE EQUIVALENCEW)J BISB MAP6+L.NLNS,R2 ;STRING FOR $BLXIONK ADD #MAP5+L.NNAM,R2 ;<L MOV KISAR6,R1 ;GET THE APR BIAS TO START OF SOURCE STRINGM;1N; INITIATE THE DATA MOVEMENT TO THE USER BUFFERSO;F;P CALL $BLXIO ;MOVE THE EQUIVALENCE STRING TO USER BUFFEREQ;TMR; THE REMAINDER OF THE WORK TO DO IS FILLING IN THE USER OPTIONAL WORDS FORFMS; THE SIZE OF THE FOUND EQUIVALENCE STRING, THE TABLE NUMBER AND MOD OF THE CT; FOUND LNB, AND THE STATUS BITS TAKEN FROM IT. IF A WORD IS NOTTKU; DEFINED, THAT PARTICULAR DATA WILL NOT BE PASSED BACK TO THE USER TASK.LV;,(W MOV (SP)+,R3 ;RESTORE THE DPB POINTERX;R.Y; PASS BACK THE EQUIVALENCE NAME STRING SIZEZ;E8[ CLR R4 ;GET VALUE FOR THE EQUIVALENCE NAME SIZE WORD\ BISB MAP6+L.NENS,R4 ;'] CALL 90$ ;PLACE IT IN THE USER WORDR^;D<_; PASS BACK THE TABLE NUMBER AND MOD OF FOUND LOGICAL NAME`;OBa MOV MAP6+L.NTBL,R4 ;GET VALUE FOR USER WORD FOR TABLE # AND MOD'b CALL 90$ ;PLACE IT IN THE USER WORDIc;OKd; PASS BACK THE STATUS BITS FOUND FOR THE LOGICAL NAME. THIS OPERATION ISU>e; ELIMINATED IF THE DIRECTIVE WAS ISSUED FROM A P/OS SYSTEM.f; 6g CMPB #P$SSIZ,$DICSV+1;IS THE DPB FROM A P/OS SYSTEM3h BEQ 95$ ;IF EQ, YES, SKIP THE STATUS WORD CHECKi)j CLR R4 ;GET VALUE FOR THE STATUS WORDIk BISB MAP6+L.NSTS,R4 ;lmn;+Lo; ROUTINE TO VERIFY THE EXISTENCE OF AN OPTIONAL WORD, ADDRESS CHECK IT IFKp; IT IS THERE, AND PLACE THE VALUE IN R4 IN THE LOCATION SPECIFIED IN THEWq; NEXT WORD IN THE DPB (R3).r;-1s90$: MOV (R3)+,R0 ;SEE IF NEXT ENTRY IS DEFINEDt BEQ 95$ ;IF EQ, NO, EXIT.u MOV #2,R1 ;SET UP SIZE OF BUFFER TO VERIFY<v CALL $ACHCK ;ADDRESS CHECK THE BUFFER RW (WORD BOUNDARY)1w BCS 110$ ;IF CS, ADDRESS CHECK ERROR OCCURREDR/x MOV R4,-(SP) ;GET VALUE TO PLACE IN LOCATIONL)y MTPD$ (R0) ;PLACE VALUE INTO LOCATIONR z95$: RETURNC{-|100$: DRSTS D.RS21 ;LOGICAL NAME NOT FOUNDI4}110$: DRSTS D.RS98 ;ADDRESS CHE00– fue³cÙ´cÚµcÛ¶c�·c›’CK ERROR ON BUFFER~ .PAGE€;+N�; $CRLOG - ROUTINE TO TAKE A PREVIOUSLY VERIFIED LOGICAL NAME CREATION BLOCKQ‚; AND CREATE AND INSERT AN LNB INTO THE APPROPRIATE TABLE FOR THAT LOGICAL.Oƒ; ANY PREVIOUS LOGICAL WITH THE SAME NAME WILL BE DELETED AND SUPERCEDED.,M„; SUPERCESSION WILL BE INDICATED BY SETTING THE V BIT COMING OUT OF THEL…; ROUTINE.†; ‡; INPUTS:CKˆ; R5 - POINTER TO THE DESCRIPTOR BLOCK CONTAINING DATA FOR LOGICAL CREATE‰; WITH THE FORMAT:DŠ;C4‹; -----------------------------------------------4Œ; | BLOCK NUMBER | TABLE NUMBER |4�; -----------------------------------------------4Ž; | GROUP NUMBER | STATUS BYTE |4�; -----------------------------------------------4�; | TCB / UCB ADDRESS |4‘; -----------------------------------------------4’; | SIZE OF LOGICAL NAME IN BUFFER |4“; -----------------------------------------------4”; | 32 WD APR ADDRESS OF START OF LOGICAL |4•; -----------------------------------------------4–; | APR6 BIASED OFFSET TO START OF LOGICAL |4—; -----------------------------------------------4˜; | SIZE OF EQUIVALENCE NAME IN BUFFER |4™; -----------------------------------------------4š; | 32 WD APR ADDRESS OF START OF EQUIVALENCE |4›; -----------------------------------------------4œ; | APR6 BIASED OFFSET TO START OF EQUIVALENCE|4�; -----------------------------------------------ž;S Ÿ; OUTPUTS:% ; CC - LNB WAS SUCCESSFULLY CREATED-5¡; R1 = 0 IF NO SUPERCESSION OF PREVIOUS ASSIGNMENTT7¢; R1 <> 0 IF SUPERCESSION OF PREVIOUS ENTRY OCCURRED-5£; CS - A SECONDARY POOL ALLOCATION FAILURE OCCURREDF¤; I¥; R5 IS PRESERVED ACROSS THE CALL; HOWEVER THE DATA IN THE BLOCK IS NOTD'¦; KISAR6 IS DESTROYED BY THIS ROUTINE§;-I¨; CALLER MUST HAVE VALIDATED ALL ENTRIES IN THE DESCRIPTOR BLOCK BEFOREOJ©; CALLING THIS ROUTINE. CALLER MUST ALSO HAVE VERIFIED THAT THE TASK IS8ª; PRIVILEGED IF THIS IS TO BE A SYSTEM TABLE CREATION.«;I¬; A ZERO VALUE IN THE BLOCK NUMBER VARIABLE HAS NO MEANING. THE LOWESTCH­; VALID NUMBER IS 1 (LB.LOC). IT WILL BE PLACED IN THE LNB BY DEFAULTI®; IF A ZERO VALUE IS SEEN. THIS HELPS THE COMPATIBILITY ISSUE WITH POST¯;-° ±$CRLOG::²; I³; CHECK FOR A ZERO VALUE IN THE BLOCK PARAMETER. IF THERE IS ONE, TURNA.´; IT INTO A DEFAULT CREATION VALUE (LB.LOC).µ;N,¶ TSTB 1(R5) ;CHECK FOR A ZERO BLOCK VALUE+· BNE 5$ ;IF NE, SOMETHING ELSE WAS GIVEN =¸ MOVB #LB.LOC,1(R5) ;MOVE IN THE DEFAULT VALUE FOR CREATIONL¹;UFº; CREATE THE LOGICAL NAME BLOCK AND FILL IN THE APPROPRIATE ENTRIES.»;I.¼5$: MOVB (R5),R3 ;GET TABLE NUMBER FROM LNB#½ CALL $TBTRL ;MAP THE HASH TABLEC+¾ BCS 70$ ;IF CS, THERE WAS NO HASH TABLEL5¿ MOV #L.NHSZ+77,R1 ;GET SIZE OF STATIC PIECE OF LNBA:À ADD 6(R5),R1 ;ADD THE SIZE OF THE PROPOSED LOGICAL NAME?Á ADD 14(R5),R1 ;ADD THE SIZE OF THE PROPOSED EQUIVALENCE NAMEV, ASH #-6,R1 ;TURN BYTES INTO 32 WD BLOCKS;à CALL $ALSEC ;ALLOCATE A PIECE OF SECONDARY POOL FOR LNBE%Ä BCS 70$ ;IF CS, ALLOCATION FAILEDM#Å MOV R0,KISAR6 ;MAP THE NEW BLOCKN@Æ MOV #MAP6+L.NTBL,R4 ;SET UP OFFSET VALUE FOR THE TABLE NUMBER8Ç MOV R5,-(SP) ;SAVE THE BUFFER POINTER ACROSS THE CALL8È MOV (R5)+,(R4)+ ;MOVE BLOCK AND TABLE NUMBER INTO LNB9É MOV (R5)+,(R4)+ ;MOVE STATUS AND GROUP NUMBER INTO LNBO4Ê MOV (R5)+,(R4)+ ;MOVE TCB OR UCB ADDRESS INTO LNB)Ë MOV (R5)+,R0 ;GET SIZE OF LOGICAL NAMERÌ;UDÍ; TRANSFER THE LOGICAL NAME STRING FROM THE USER BUFFER TO THE LNBÎ;P%Ï MOV R0,(R4)+ ;MOVE IT INTO THE LNBA4Ð MOV (R5)+,R1 ;GET APR BIAS OF LOGICAL NAME BUFFER4Ñ MOV (R5)+,R2 ;GET OFFSET TO START OF LOGICAL NAME8Ò SUB #MAP6-MAP5,R2 ;TURN IT INTO AN APR5-BIASED OFFSET.Ó MOV KISAR6,R3 ;GET THE DESTINATION APR BIAS5Ô CALL $BLXIO ;TRANSFER THE LOGICAL NAME TO THE LNB Õ; HÖ; TRANSFER THE EQUIVALENCE NAME STRING FROM THE USER BUFFER TO THE LNB×;(7Ø MOV (R5)+,R0 ;GET THE SIZE OF THE EQU00–(f¼eÝb`TADATADATADATADATADATAIVALENCE STRINGE@Ù MOVB R0,MAP6+L.NENS ;MOVE IN THE SIZE OF THE EQUIVALENCE NAME9Ú MOV (R5)+,R1 ;GET APR BIAS FOR EQUIVALENCE NAME BUFFERBÛ MOV (R5)+,R2 ;GET APR OFFSETV8Ü SUB #MAP6-MAP5,R2 ;TURN IT INTO AN APR5 BIASED OFFSET/Ý CALL $BLXIO ;MOVE EQUIVALENCE NAME INTO LNBÞ;KMß; SET UP A MINIATURE DESCRIPTOR BLOCK TO PASS TO THE LOOKUP ROUTINES TO SEEALà; IF THIS LOGICAL IS A SUPERCESSION OF A CURRENTLY EXISTING LOGICAL. THISNá; MINI DESCRIPTOR BLOCK IS POINTED TO BY R0 AND CONTAINS, IN ORDER - EACH TOMâ; A WORD, THE SIZE OF THE LOGICAL, THE MEMORY APR BIAS TO THE STRING BLOCK,+Oã; THE APR6-BIASED OFFSET TO THE START OF THE LOGICAL, THE TABLE/BLOCK NUMBER, ä; AND THE APPROPRIATE TCB/UCB.å;P-æ MOV R5,R0 ;GET POINTER TO MINI DESCRIPTOREç SUB #14,R0 ;7è MOV -6(R0),6(R0) ;MOVE TABLE NUMBER AND BLOCK NUMBERO*é MOV -2(R0),10(R0) ;MOVE TCB/UCB ADDRESSê; @ë; NOW UPPER CASE ALL ALPHABETIC CHARACTERS IN THE LOGICAL NAMEì;R>í MOV #MAP6+L.NNAM,R3 ;GET POINTER TO THE START OF THE STRING3î CLR R2 ;GET THE NUMBER OF CHARACTERS TO PROCESS ï BISB MAP6+L.NLNS,R2 ;:ð10$: CALL $CVBUC ;UPPER CASE THE CHARACTER IF NECESSARY3ñ MOVB R5,-1(R3) ;MOVE THE VALUE BACK INTO THE LNBC*ò SOB R2,10$ ;GO BACK IF MORE TO PROCESSó;RQô; SEARCH THE APPROPRIATE TABLE FOR A CURRENTLY EXISTING LNB WITH THE SAME NAME.Mõ; IF FOUND, DELETE THAT ENTRY, ENTER THE NEW ONE, AND EXIT WITH A STATUS OFEö; LOGICAL SUPERCEDED.I÷;Aø CALL $LNHSH ;HASH THE ENTRY;ù0ú CLR -(SP) ;INITIALIZE SUPERCESSION INDICATOR=û MOV KISAR6,-(SP) ;STORE THE LNB ADDRESS ACROSS THE LOOKUPS;7ü CALL $LNTBS ;SEARCH THE TABLES FOR THE LOGICAL NAMEA2ý BCS 20$ ;IF CS, A PREVIOUS ENTRY WAS NOT FOUNDþ;Iÿ; A LOGICAL WAS FOUND IN THE TABLE. FLAG THE SUPERCESSION BY MAKING R1E$; NONZERO AND REMOVE THE OLD ENTRY;E. MOV R3,2(SP) ;MOVE IN THE OLD ENTRY ADDRESS# CALL $LNELM ;REMOVE THE OLD LNBT;E(; INSERT THE NEW ENTRY INTO THE TABLES;H020$: MOV (SP)+,R0 ;RESTORE THE NEW LNB ADDRESS;C ; AT THIS POINT:> ; R0 - 32 WD ADDRESS OF NEW LNB TO BE INSERTED INTO POSITION ; R1 - HASH TABLE WORD OFFSETFA ; R3 - 32 WD ADDRESS OF LNB TO BE BEHIND THE LNB TO BE INSERTEDFI ; R4 - 32 WD ADDRESS OF LNB TO BE AHEAD OF NEW LNB IN LIST (=0 IF NONE) ;G ; OUTPUTS:D; CC = 0 -> LNB IS INSERTED INTO LIST AND ALL LINKAGES ARE UPDATED>; CC = 1 -> INSERTION FAILED FROM INVALID HASH TABLE ADDRESS;T! MOV R0,KISAR6 ;MAP THE NEW LNBB MOV R3,MAP6+L.NLNK ;SET THE LINKAGES FOR THE LNB BEHIND THE NEW; MOVB MAP6+L.NTBL,R3 ;GET THE TABLE NUMBER FOR THIS ENTRY & MOV R4,KISAR6 ;MAP THE PREVIOUS LNB  BNE 30$ ;IF NE, THERE IS ONE# CALL $TBTRL ;MAP THE HASH TABLE$ BCS 50$ ;IF CS, THERE WASN'T ONE) ADD #MAP6,R1 ;SET POINTER TO HASH CELL# MOV R0,(R1) ;PUT IN FIRST ENTRYS  BR 40$ ;430$: MOV R0,MAP6+L.NLNK ;INSERT POINTER TO NEW LNB40$: CLC ;INDICATE SUCCESS250$: MOV (SP)+,R1 ;RESTORE THE SUPERCESSION FLAG5  MOV (SP)+,R5 ;RESTORE THE DESCRIPTOR BLOCK ADDRESSI !70$: RETURNM"# .PAGE$;+K%; $DELOG - ROUTINE TO DELETE AN EXPLICIT LOGICAL NAME OR A COMPLETE TABLE&;E '; INPUTS: G(; R0 - POINTER TO A DESCRIPTOR BLOCK DESCRIBING LOGICAL TO BE DELETEDH); WITH THE FORMAT:#'*; WD 1 - BYTE COUNT OF LOGICAL NAMEV0+; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME7,; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAMEC.-; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)*.; BLOCK TYPE NUMBER (HIGH BYTE);/; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLE0;EL1; IF AN ENTIRE TABLE IS TO BE DELETED, THE FIRST 3 WORDS OF THE DESCRIPTOR2; BLOCK ARE ZERO.U3; 4; OUTPUTS:5; '6; CC - SUCCESSFUL DELETION OF LOGICALBB7; CS : R3 = 0 -> LOGICAL NOT FOUND IF SPECIFIC LOGICAL REQUESTEDA8; R3 <> 0 -> PRIVILEGE VIOLATION IF SPECIFIC LOGICAL REQUESTEDD9;-: ;$DELOG::-< TSTB 7(R0) ;CHECK FOR ZERO BLOCK MODIFIER##= BNE 10$ ;IF NE, THERE ISN'T ONE A> MOVB #LB.LOC,7(R0) ;A ZERO MODIFIER IMPLIES L00–0fue³cÙ´cÚµcÛ¶c�·c›’OCAL MODE DEFAULTD2?10$: TST (R0) ;SEE IF THIS IS A SPECIFIC DELETE:@ BNE 20$ ;IF EQ, IT ISN'T, DELETE ALL MATCHING LOGICALSA;LB; TOTAL LOGICAL DELETEC;T1D CALLR $LNDAL ;ELIMINATE ALL LOGICALS AND EXITE;SF; SPECIFIC LOGICAL DELETEDG;P.H20$: CALL $LNHSH ;IT IS SPECIFIC, HASH NAME5I CALL $LNTBS ;FIND THE NAME IN THE SPECIFIED TABLE.J BCC 40$ ;IF CC, FOUND LNB, CHECK PRIVILEGE%K CLR R3 ;INDICATE NO LOGICAL FOUNDSL SEC ;INDICATE FAILURE M30$: RETURNI2N40$: MOV R3,KISAR6 ;MAP THE LNB FOUND WITH MATCH1O CALL PRVTST ;CHECK TASK PRIVILEGE AGAINST LNBQ1P BCS 30$ ;IF CS, TASK CANNOT ELIMINATE LOGICAL QR .PAGEST;+5U; $LNELM - ROUTINE TO ELMINATE AN ALREADY FOUND LNBV; W; INPUTS:L1X; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCKEY; BLOCK CONTAINS:'Z; WD 1 - BYTE COUNT OF LOGICAL NAMEE0[; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME7\; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAME;.]; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)*^; BLOCK TYPE NUMBER (HIGH BYTE);_; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLE B`; R1 - WORD OFFSET FROM START OF HASH TABLE TO CORRECT HASH CELL3a; R3 - 32 WD BLOCK ADDRESS OF LNB TO BE ELMINATED?b; R4 - PREVIOUS LNB 32 WD ADDRESS IN LIST (=0 IF NONE BEFORE)c;B d; OUTPUT::e; f; CC = 0 Gg; R3 - 32 WD BLOCK ADDRESS OF LNB AFTER THE ONE ELMINATED (0 IF NONE)?h; R4 - PREVIOUS LNB 32 WD ADDRESS IN LIST (=0 IF NONE BEFORE)Di;T j; CC = 1S#k; R3 AND R4 ARE THE SAME AS INPUTKl;+m n$LNELM::4o MOV R4,-(SP) ;SAVE THE PREVIOUS ENTRY ACROSS CALL1p MOV R1,-(SP) ;SAVE THE HASH OFFSET ACROSS CALL 6q MOV R3,-(SP) ;SAVE THE LNB ADDRESS TO BE ELIMINATEDr MOV R3,KISAR6 ;MAP THE LNB4>s MOV MAP6+L.NLNK,R3 ;GET THE FORWARD LINK IN THE CURRENT LNB&t MOV R4,KISAR6 ;MAP THE PREVIOUS LNB u BNE 20$ ;IF NE, THERE IS ONE#v CALL $MPHSH ;MAP THE HASH TABLEw BCC 10$ ;CC -> SUCCESSx MOV (SP)+,R3 ;RESTORE R3O6y BR 40$ ;RESTORE THE REST OF THE REGISTERS AND EXIT(z10$: ADD #MAP6,R1 ;GET ADDRESS OF CELL+{ MOV R3,(R1) ;RESET THE FORWARD LINKAGESM | BR 30$ ;H}20$: MOV R3,MAP6+L.NLNK ;RESET THE LINKAGES IF THERE IS A PREVIOUS LNB<~30$: MOV (SP)+,R0 ;RESTORE POINTER TO LNB TO BE ELIMINATED( MOV R0,KISAR6 ;MAP IT IN KERNEL APR 6D€ MOV MAP6+L.NLNS,R1 ;GET THE LENGTH OF THE LOGICAL NAME IN THE LNB5� MOVB R1,R2 ;SCREEN OUT THE VARIOUS VALUES AND ADDC(‚ BIC #177400,R2 ;GET LOGICAL NAME SIZE3ƒ SWAB R1 ;PUT EQUIVALENCE NAME IN LOW BYTE OF R1R(„ BIC #177400,R1 ;GET LOGICAL NAME SIZE,… ADD R2,R1 ;GET FULL SIZE OF BOTH BUFFERS3† ADD #L.NHSZ+77,R1 ;GET FULL SIZE OF LNB IN BYTESR&‡ ASH #-6,R1 ;TURN BYTES INTO BLOCKS,ˆ CALL $DESEC ;DEALLOCATE THE PREVIOUS LNB‰ CLC ;INDICATE SUCCESS1Š40$: MOV (SP)+,R1 ;RESTORE THE HASH CELL OFFSETL+‹ MOV (SP)+,R4 ;RESTORE THE PREVIOUS ENTRYT Œ RETURNM�Ž� .PAGE�;+6‘; -- $LNTDR -- TRANSLATE RSX DEVICE FORM RECURSIVELYL’; -- $LNTSL -- TRANSLATE RSX DEVICE FORM RECURSIVELY WITH SPECIFIC INHIBIT“; MASK AND MODIFIER VALUE”;DQ•; THIS ROUTINE WILL RECURSIVELY SEARCH THE LOGICAL NAME TABLES FOR DEVICE NAME.IM–; THE DEVICE MNEMONIC AND UNIT NUMBER ARE MERGED INTO AN INTERNAL STRING TOHL—; USE AS THE BASE LOGICAL FOR THE LOOKUPS. AS A LOGICAL IS FOUND FOR EACHI˜; LEVEL, IT IS CHECKED TO SEE IF IT IS TERMINAL. IF SO, LOOKUPS CEASE,N™; OTHERWISE A NEW SET OF LOOKUPS ARE PERFORMED FOR THE LATEST LOGICAL. ONCENš; THE BOTTOM LEVEL LOGICAL IS FOUND, THE DEVICE MNEMONIC AND UNIT NUMBER (IN3›; BINARY) ARE RESTORED TO R2 AND R0 RESPECTIVELY.Wœ;EK�; $LNTSL IS IDENTICAL TO $LNTDR WITH THE ADDITION OF AN EXPLICIT MODIFIEREKž; VALUE THAT MUST MATCH THE VALUE IN THE LNB AND AN INHIBIT MASKWORD THATBKŸ; INDICATES THE LOGICAL TABLES THAT CANNOT BE SEARCHED. THIS MASKWORD ISS. ; IN EFFECT IN ALL LOOKUP LEVELS AND TABLES.¡;A ¢; INPUTS:E£; 3¤; R0 = THE BINARY UNIT NUMBER OF THE DEVICE SPECI/¥; R2 = THE ASCII MNEMONIC OF THE DEVICE SPEC,#¦; $LNTSL S00–8f¼eÝb`TADATADATADATADATADATAPECIFIC PARAMETERS:(1§; R3 = SPECIFIC MODIFIER VALUE TO MATCH IN LNBE?¨; $TONYL = SPECIFIC INHIBIT MASKWORD USED ACROSS ALL LOOKUPSF©;X ª; OUTPUTS: «; C=0,U¬;T=­; R0 = THE BINARY UNIT NUMBER OF THE RESULTANT DEVICE SPEC?®; R2 = THE ASCII DEVICE MNEMONIC OF THE RESULTANT DEV. SPEC.A7¯; R3 = APR BIAS OF MATCHING LNB SECONDARY POOL BLOCK.°;A1±; C=1 INVALID TRANSLATION ON EXISTING LOGICALB²; 1³; R3 = 0 IF NO MATCH WAS FOUND FOR DEVICE NAMEH@´; = N IF A MATCH WAS FOUND BUT DID NOT TRANSLATE TO DEVICE!µ; OR RECURSION LIMIT WAS HITN¶;N·; IF AN ERROR CONDITION OCCURS (VS, CS) R0 AND R2 ARE PRESERVED ACROSS THEN¸; CALL. R1,R3 ARE DESTROYED BY THIS ROUTINE. R4,R5,KISAR6 ARE PRESERVED.¹;º;-» ¼$LNTDR::)½ CLR R3 ;INITIALIZE THE MODIFIER VALUE0¾ CLR $TONYL ;INITIALIZE THE INHIBIT MASK WORD!¿$LNTSL::SAVNR ;SAVE R4 AND R5N2À MOV KISAR6,-(SP) ;SAVE THE OLD DATA MAPPING APR%Á MOV R0,-(SP) ;SAVE THE UNIT NUMBER ) MOV R2,-(SP) ;SAVE THE DEVICE MNEMONICA3à MOV R3,-(SP) ;SAVE THE MODIFIER VALUE TO BE USEDÄ;PÅ; MOVE THE DEVICE NAME MNEMONIC AND ASCIIZED UNIT NUMBER INTO A SCRATCH BUFFER)Æ; FOR THE INITIAL LOOKUP IN THE TABLES.IÇ;RAÈ MOV #$LTBUF,R3 ;POINT TO SCRATCH BUFFER TO BUILD DEVICE STRING;2É MOV R2,(R3)+ ;MOVE IN THE ASCII DEVICE MNEMONIC>Ê CALL $DCBTA ;TURN THE OCTAL UNIT NUMBER TO ASCII IN BUFFERË;MMÌ; INITIALIZE THE INTERNAL LOGICAL NAME DESCRIPTOR BLOCK TO BE PASSED AROUNDNÍ; DURING THE VARIOUS LOOKUPS. Î;E.Ï SUB #$LTBUF,R3 ;GET THE STRING LENGTH IN R3;Ð MOV #$TONYL,R0 ;CREATE THE LOGICAL NAME DESCRIPTOR BLOCK -Ñ MOV $TKTCB,R2 ;GET THE CURRENT TCB ADDRESS ,Ò BIT #1,(R0) ;IS THE TASK TABLE INHIBITED'Ó BEQ 5$ ;IF EQ, NO, KEEP TCB ADDRESSR0Ô MOV T.UCB(R2),R2 ;GET THE UCB ADDRESS INSTEAD3Õ5$: MOV R2,-(R0) ;MOVE IN THE APPROPRIATE ADDRESS /Ö CLR -(R0) ;CLEAR THE TABLE AND BLOCK NUMBERN=× BISB (SP)+,1(R0) ;GET AN EXPLICIT MODIFIER VALUE IF IS ONED?Ø MOV #$LTBUF+20000,-(R0) ;MOVE APR6 BIASED ADDRESS INTO BLOCKR>Ù MOV KISAR5,-(R0) ;TURN THE ADDRESS INTO APR BIAS AND OFFSET>Ú MOV R3,-(R0) ;MOVE THE LENGTH OF THE STRING INTO DESCRIPTORÛ;DFÜ; ENTER A LOOP OF LOOKUPS FOR EACH NEWLY FOUND LOGICAL IN THE CHAIN.KÝ; A POINTER TO THE LATEST FOUND LNB IS KEPT FOR USE AFTER ALL LOOKUPS ARE$IÞ; COMPLETED. LOOKUPS TERMINATE AS SOON AS A LOGICAL ISN'T FOUND, OR IFTIß; THE LATEST HAS THE TERMINAL ATTRIBUTE OR BEGINS WITH AN _. THIS LOOP Kà; WILL BE EXECUTED A MAXIMUM OF M$XLOG TIMES BEFORE AN ERROR IS RETURNED.Ká; THIS IS TO PREVENT AN INFINITE LOOP IN ASSIGNMENTS AND ALSO TO PUT SOME0=â; KIND OF RESTRICTION ON USAGE OF SYSTEM STATE LOOKUP TIME.Eã;OIä; A NONZERO VALUE IN R3 INDICATES THAT THE LOGICAL LOOKUP IS TO BE DONETIå; IN FILES-11 MODE - THIS MEANS THAT THE SUBSEQUENT EQUIVALENCE NAME IS Gæ; SEARCHED UP TO, BUT NOT INCLUDING, THE COLON. IF ONE IS NOT FOUND,THç; THE ENTIRE STRING IS USED FOR THE NEXT ROUND. OTHERWISE, EVERYTHINGè; BEFORE THE COLON IS USED.Mé;F7ê CALL $LGRCS ;LOOK UP THE DEVICE LOGICAL RECURSIVELYI4ë BCS 10$ ;IF CS, RECURSION LIMIT FAILURE OCCURREDì; Lí; NOW THAT THE CHAIN HAS BEEN WALKED DOWN COMPLETELY, RESTORE THE LAST LNBLî; FOUND AND PARTIALLY VERIFY THAT THE EQUIVALENCE NAME IS A VALID PHYSICALJï; DEVICE NAME. IF IT IS, R0 AND R2 ARE RESTORED WITH THE DEVICE MNEMONICð; AND BINARY UNIT NUMBER.Iñ; :ò CALL DVVFY ;VALIDATE THE RESULTING LOGICAL AS A DEVICE+ó BCS 10$ ;IF CS, THE LOGICAL WAS INVALIDC:ô CMP (SP)+,(SP)+ ;ELIMINATE THE OLD VALUES FOR R0 AND R2õ BR 20$ ;EXIT SUCCESSFULLY 4ö10$: MOV (SP)+,R2 ;RESTORE THE OLD DEVICE MNEMONIC,÷ MOV (SP)+,R0 ;RESTORE THE OLD UNIT NUMBERø SEC1ù20$: MOV (SP)+,KISAR6 ;RESTORE ANY OLD MAPPINGSA<ú MOV $LSTLG,R3 ;SET INDICATION OF WHETHER A MATCH OCCURRED û RETURN üýþÿ;+.; -- $RTRL1 -- TRANSLATE LOGICAL RECURSIVELY;N; THIS ROUTINE WILL RECURSIVELY SEARCH THE LOGICAL NAME TABLES FOR A LOGICALP; AS A LOGICAL IS FOUND AT EACH LEVEL, IT IS00–@fue³cÙ´cÚµcÛ¶c�·c›’ CHECKED TO SEE IF IT IS TERMINAL.N; IF SO, LOOKUPS CEASE, OTHERWISE A NEW SET OF LOOKUPS ARE PERFORMED FOR THEP; LATEST LOGICAL. ONCE THE BOTTOM LEVEL LOGICAL IS FOUND, THE DEVICE MNEMONICG; AND UNIT NUMBER (IN BINARY) ARE RESTORED TO R2 AND R0 RESPECTIVELY.O;T ; INPUTS:C ;D= ; R0 = POINTER TO A USER BUFFER ADDRESS CONTAINING LOGICALL# ; R2 = SIZE OF LOGICAL IN BUFFERU ;W ; OUTPUTS: ; C=0,E;C=; R0 = THE BINARY UNIT NUMBER OF THE RESULTANT DEVICE SPEC ?; R2 = THE ASCII DEVICE MNEMONIC OF THE RESULTANT DEV. SPEC.S7; R3 = APR BIAS OF MATCHING LNB SECONDARY POOL BLOCKT;1; C=1 INVALID TRANSLATION ON EXISTING LOGICAL ;,1; R3 = 0 IF NO MATCH WAS FOUND FOR DEVICE NAMEY@; = N IF A MATCH WAS FOUND BUT DID NOT TRANSLATE TO DEVICE!; OR RECURSION LIMIT WAS HITF;DN; IF AN ERROR CONDITION OCCURS (VS, CS) R0 AND R2 ARE PRESERVED ACROSS THEN; CALL. R1,R3 ARE DESTROYED BY THIS ROUTINE. R4,R5,KISAR6 ARE PRESERVED.;;- $RTRL1::! SAVNR ;SAVE R4 AND R5=" MOV KISAR6,-(SP) ;STORE THE PREVIOUS KERNEL DATA 6 MAPPINGO0# MOV R2,-(SP) ;SAVE LOGICAL SIZE FOR LATER USE$;NJ%; CREATE THE LOGICAL DESCRIPTOR BLOCK FOR USE ACROSS THE RECURSIVE CALLS&; 4' MOV #$TONYL,R3 ;POINT TO BOTTOM OF THE DESCRIPTOR<( MOV $TKTCB,-(R3) ;PUT IN THE TCB ADDRESS FOR CURRENT TASK/) CLR -(R3) ;CLEAR THE TABLE AND MODE NUMBERSC9* CLR $TONYL ;INDICATE ROUTINE SHOULD SEARCH ALL TABLES =+ CALL $RELOC ;TURN USER BUFFER ADDRESS INTO OFFSET AND APRV4, MOV R2,-(R3) ;MOVE THE OFFSET INTO THE DESCRIPTOR9- MOV R1,-(R3) ;MOVE THE APR6 OFFSET INTO THE DESCRIPTORA(. MOV (SP)+,-(R3) ;GET THE LOGICAL SIZE)/ MOV R3,R0 ;POINT R0 AT THE DESCRIPTORE.0 ; AND INDICATES FILES-11 MODE OF $LGRCS1;OF2; ENTER A LOOP OF LOOKUPS FOR EACH NEWLY FOUND LOGICAL IN THE CHAIN.K3; A POINTER TO THE LATEST FOUND LNB IS KEPT FOR USE AFTER ALL LOOKUPS ARE I4; COMPLETED. LOOKUPS TERMINATE AS SOON AS A LOGICAL ISN'T FOUND, OR IFFI5; THE LATEST HAS THE TERMINAL ATTRIBUTE OR BEGINS WITH AN _. THIS LOOP K6; WILL BE EXECUTED A MAXIMUM OF M$XLOG TIMES BEFORE AN ERROR IS RETURNED.VK7; THIS IS TO PREVENT AN INFINITE LOOP IN ASSIGNMENTS AND ALSO TO PUT SOMEE=8; KIND OF RESTRICTION ON USAGE OF SYSTEM STATE LOOKUP TIME.E9;O7: CALL $LGRCS ;LOOK UP THE DEVICE LOGICAL RECURSIVELY4; BCS 10$ ;IF CS, RECURSION LIMIT FAILURE OCCURRED<; L=; NOW THAT THE CHAIN HAS BEEN WALKED DOWN COMPLETELY, RESTORE THE LAST LNBL>; FOUND AND PARTIALLY VERIFY THAT THE EQUIVALENCE NAME IS A VALID PHYSICALJ?; DEVICE NAME. IF IT IS, R0 AND R2 ARE RESTORED WITH THE DEVICE MNEMONIC@; AND BINARY UNIT NUMBER.OA;E:B CALL DVVFY ;VALIDATE THE RESULTING LOGICAL AS A DEVICE@C10$: MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING AND KEEP CARRY D RETURNLEFGHI;+;J; $LGRCS - ROUTINE TO SCAN THE LOGICAL TABLES RECURSIVELY K;R L; INPUTS:>M; R0 - POINTER TO DESCRIPTOR BLOCK OF FIRST LOGICAL IN CHAIN$N; $TONYL - TABLE INHIBIT MASK WORD2O; R3 - FILES-11 MODE PROCESSING FLAG (>0 -> YES)P; Q; OUTPUTS:<R; CC - SEARCH MAY OR MAY NOT HAVE RESULTED IN AN LNB MATCHBS; $LSTLG - SECONDARY POOL ADDRESS OF FINAL LNB (=0 IF NO MATCH)4T; CS - RECURSION LIMIT WAS HIT (DEFINED BY M$XLOG)U;EFV; ENTER A LOOP OF LOOKUPS FOR EACH NEWLY FOUND LOGICAL IN THE CHAIN.W;SX; NOT PRESERVED: KISAR6, R3KY; A POINTER TO THE LATEST FOUND LNB IS KEPT FOR USE AFTER ALL LOOKUPS AREOIZ; COMPLETED. LOOKUPS TERMINATE AS SOON AS A LOGICAL ISN'T FOUND, OR IFLI[; THE LATEST HAS THE TERMINAL ATTRIBUTE OR BEGINS WITH AN _. THIS LOOP K\; WILL BE EXECUTED A MAXIMUM OF M$XLOG TIMES BEFORE AN ERROR IS RETURNED.DK]; THIS IS TO PREVENT AN INFINITE LOOP IN ASSIGNMENTS AND ALSO TO PUT SOME =^; KIND OF RESTRICTION ON USAGE OF SYSTEM STATE LOOKUP TIME.U_;GH`; IN FILES-11 PROCESSING MODE, THIS ROUTINE WILL SEARCH FOR A COLON INHa; THE LOGICAL AND ONLY USE THE BEFORE IT. THIS HAPPENS IN ALL PASSES.Ab; IF NO COLON IS FOUND, THE ENTIRE STRING IS USE00–Hf¼eÝb`TADATADATADATADATADATAD IN EACH CASE. c;-d e$LGRCS::.f MOV R3,-(SP) ;SAVE THE MODE PROCESSING FLAG.g CLR $LSTLG ;CLEAR THE ULTIMATE LNB POINTERBh MOV #M$XLOG,-(SP) ;PUT THE MAXIMUM RECURSION LIMIT ON THE STACK1i10$: DEC (SP) ;SEE IF ANOTHER ROUND IS ALLOWEDO4j BGE 13$ ;IF LT, NO, RECURSION ERROR HAS OCCURRED/k SEC ;INDICATE FAILURE FROM RECURSION LIMITN?l MOV (SP)+,(SP)+ ;MAXIMUM RECURSION LIMIT, MAINTAIN CARRY SETF'm BR 40$ ;RETURN WITH RECURSION ERROR 3n13$: TST 2(SP) ;IS THIS FILES-11 PROCESSING MODEC.o BEQ 15$ ;IF EQ, NO, USE EXACT MATCH ALWAYS:p CALL LGTSET ;YES, DO COLON SEARCH AND RESET DESCRIPTOR?q15$: CALL $TBSRC ;LOOK FOR LOGICAL IN ALL APPROPRIATE TABLESO%r BCS 30$ ;IF CS, LOGICAL NOT FOUND;5s MOV R3,$LSTLG ;SAVE THE CURRENT LINK FOR LATER USEO;t MOV R3,KISAR6 ;MAP THE LNB TO RESET THE DESCRIPTOR BLOCKO1u BIT #LS.TRM,MAP6+L.NSTS ;IS THIS LNB TERMINAL?U%v BNE 30$ ;IF NE, YES, STOP LOOKUPS :w CLR R2 ;INITIALIZE POINTER TO START OF EQUIVALENCE STR:x BISB MAP6+L.NLNS,R2 ;GET THE LENGTH OF THE LOGICAL NAME5y ADD #MAP6+L.NNAM,R2 ;POINT TO THE START OF THE ENS 2z CMPB #'_,(R2) ;IS THIS TERMINAL IN THE OLD WAY?%{ BEQ 30$ ;IF EQ, YES, STOP LOOKUPSB=|20$: CLR (R0) ;INITIALIZE THE NEW LENGTH IN THE DESCRIPTORC+} BISB MAP6+L.NENS,(R0);GET THE NEW LENGTH;4~ MOV R2,4(R0) ;MOVE THE NEW OFFSET INTO DESCRIPTOR1 MOV R3,2(R0) ;MOVE IN THE NEW APR BIAS AS WELL$4€ BIT #1,$TONYL ;SEE IF THE TASK TABLE IS INHIBITED,� BNE 10$ ;IF NE, IT IS, SKIP TCB RECOVERYA‚ MOV $TKTCB,10(R0) ;RESTORE THE TCB POINTER FOR NEXT LOOKUP SETA$ƒ BR 10$ ;GO BACK FOR ANOTHER LOOP@„30$: CLR (SP)+ ;CLEAR THE RECURSION LIMIT VALUE OFF THE STACK!… CLR (SP)+ ; AND CLEAR CARRYR †40$: RETURNI‡ˆ‰ Š .ENABL LSBS‹Œ;+M�; DVVFY - ROUTINE TO VERIFY THAT THE LOGICAL DESCRIBED BY $LSTLG IS A VALIDSFŽ; FORM OF AN RSX PHYSICAL DEVICE. ONLY THE FORMAT OF THE LOGICAL IS;�; VERIFIED - ACTUAL EXISTENCE OF THE DEVICE IS IRRELEVANT1�;I ‘; INPUTS:S=’; $LSTLG - CONTAINS SECONDARY POOL ADDRESS OF LNB TO VERIFY “; OUTPUTS:D”; CC - LOGICAL IN $LSTLG SUCCESSFUL PASSED FORM TEST OF RSX DEVICE9•; CS - NO LOGICAL IN $LSTLG OR LOGICAL FAILED FORM TEST –;L0—; R0,R1,R2,R3,R5 ARE DESTROYED BY THIS ROUTINE˜;P™; THIS CODE WILL IGNORE ANY LEADING TERMINAL CHARACTERS (_) IN THE EQUIVALENCE-š; STRING BEFORE BEGINNING THE VERIFICATION.L›;-œDVVFY:*� MOV $LSTLG,KISAR6 ;MAP THE ULTIMATE LNB7ž BEQ 50$ ;IF EQ, ONE WAS NOT FOUND, INDICATE FAILURE ,Ÿ CLR R5 ;INITIALIZE A STRING LENGTH VALUE0  BISB MAP6+L.NENS,R5 ;GET THE LENGTH TO VERIFY;¡ MOVB MAP6+L.NLNS,R1 ;POINT R1 TO THE START OF THE STRINGO<¢ ADD #MAP6+L.NNAM,R1 ;POINT TO START OF EQUIVALENCE STRING8£5$: CMPB #'_,(R1)+ ;CHECK FOR LEADING FINAL INDICATORS!¤ BNE 10$ ;IF NE, NO MORE THEREC3¥ DEC R5 ;DECREMENT THE REMAINING NUMBER TO CHECKE"¦ BEQ 50$ ;IF EQ, INVALID DEVICE'§ BR 5$ ;GO BACK FOR ANOTHER TO CHECKI,¨10$: DEC R1 ;BACK UP TO INCLUDE DELIMITER© ªDEVCHK:L&« CLR R0 ;INITIALIZE THE UNIT NUMBER1¬ MOVB (R1)+,R2 ;GET FIRST CHARACTER IN MNEMONICT-­ DEC R5 ;SEE IF THIS IS THE LAST CHARACTERH'® BEQ 50$ ;IF EQ, YES, INVALID DEVICEA/¯ CALL CHRCHK ;IS THIS CHARACTER ALPHANUMERIC %° BCS 50$ ;IF CS, ERROR IN THE NAME ,± SWAB R2 ;GET SECOND HALF OF THE TASKNAME ² CLRB R2 ;E³ BISB (R1)+,R2 ;´ CALL CHRCHK ;IS IT VALIDµ BCS 50$ ;IF CS, IT WAS BAD9¶ SWAB R2 ;REVERSE THE LETTERS BACK TO CORRECT POSITION · DEC R5 ;IS IS A ZERO VALUE8¸ BNE 30$ ;IF NE, THERE IS MORE ON THE STRING TO CHECK¹20$: CLC ;INDICATE SUCCESSº BR 60$ ;EXIT»; N¼; VALIDATE THAT THE REST OF THE STRING IS A VALID OCTAL NUMBER OR A TRAILING ½; COLON.¾;S<¿30$: MOVB (R1)+,R3 ;GET THE FIRST CHARACTER OF UNIT NUMBER2À CMPB R3,#'0 ;IS THIS A VALID NUMERIC CHARACTERÁ BLO 40$ ;IF LO, NO4 CMPB R3,#'7 ;IS IT STILL VALID ON THE HIGH SIDE?à BHI 40$ ;IF HI, NO3Ä SUB #60,R3 ;TURN THE NUMBER INTO A BINARY VALUE1Å ASH #3,R0 ;MULTIPLY EVERYTHING UP TO NOW BY 8 $Æ00–Pfue³cÙ´cÚµcÛ¶c�·c›’ ADD R3,R0 ;ADD IN THE NEW NUMBER+Ç DEC R5 ;ANY MORE CHARACTERS TO PROCESS?XÈ BNE 30$ ;IF NE, YESA'É CMP #377,R0 ;IS THIS A VALID NUMBER "Ê BHI 20$ ;IF LO, DEFINITELY NOTË BR 50$ ;INDICATE ERROR+Ì40$: CMPB R3,#': ;SEE IF THIS IS A COLON -Í BEQ 20$ ;IF EQ, IT IS, VALID STRING FOUNDB Î50$: SEC Ï60$: RETURN ÐÑ Ò .DSABL LSBLÓÔ;+GÕ; CHRCHK - ROUTINE TO VALIDATE THE ALPHA STATE OF THE DEVICE MNEMONICAÖ;R ×; INPUTS:A!Ø; R2 - CHARACTER TO BE VERIFIEDOÙ;-6ÚCHRCHK: BICB #40,R2 ;CONVERT CHARACTER TO UPPERCASE&Û CMPB #'A,R2 ;IS THIS BELOW THE SETÜ BHI 10$ ;IF HI, YESP&Ý CMPB #'Z,R2 ;IS THIS ABOVE THE SETÞ BLO 10$ ;IF LO, YESYß CLC ;INDICATE SUCCESSà BR 20$ ;EXITá10$: SEC ;INDICATE FAILUREâ20$: RETURN ;Qãä;+Iå; PSCNV - ROUTINE TO TRANSLATE THE LOGICAL NAME SPECIFIED IN ONE OF THEEæ; P/OS COMPATIBLE DIRECTIVES INTO A FORM RECOGNIZED BY RSX EXTENDEDEç; LOGICAL SUPPORT.è; é; INPUTS:A1ê; R0 - SIZE OF THE LOGICAL NAME TO BE PROCESSED;.ë; R1 - 32 WD APR BIAS TO GET TO LOGICAL NAME8ì; R2 - KISAR6 VIRTUAL ADDRESS OF START OF LOGICAL NAMEí;2 î; OUTPUTS:1ï; R0 - SIZE OF THE LOGICAL NAME TO BE PROCESSEDI.ð; R1 - 32 WD APR BIAS TO GET TO LOGICAL NAMEBñ; R2 - KISAR6 VIRTUAL ADDRESS OF START OF PROCESSED LOGICAL NAMEò;SJó; THIS ROUTINE RECOGNIZES THAT IT WAS CALLED BY A TLOG$, RLOG$, CLOG$ ORGô; DLOG$ DIRECTIVE AND PROCESSES THE LOGICAL NAME IN TWO WAYS. IF THEIõ; LOGICAL ENDS IN ONE OR TWO COLONS, THEY ARE STRIPPED OFF OF THE NAME. Hö; FOLLOWING THAT, THE STRING IS CHECKED TO SEE IF IT IS OF THE FORM OFG÷; AN RSX PHYSICAL DEVICE NAME (IE. DDNNN). IF SO, THE STRING IS ZERO Mø; COMPRESSED. IF IT ISN'T, THE ORIGINAL STRING IS USED, MINUS THE STRIPPEDR ù; COLONS.Rú;-ûPSCNV:Eû CMPB #R$XBAS,$DICSV+2;IS THIS ONE OF THE XLOG$ DIRECTIVES ;JRK325A3û BLOS 50$ ;IF LOS, NO, SKIP PROCESSING ;JRK325 5þ TST R0 ;SEE IF THIS IS A FULL TABLE DELETE ;**-2,ÿ BEQ 50$ ;IF EQ, IT IS, SKIP THIS ROUTINE  SAVNR ;SAVE REGISTERS R4,R51 MOV KISAR6,-(SP) ;SAVE THE DATA REGISTER VALUE ) MOV R3,-(SP) ;SAVE THE OTHER REGISTERSN MOV R2,-(SP) ;F MOV R1,-(SP) ;Z+ ADD R2,R0 ;POINT TO END OF LOGICAL NAMEN& MOV R1,KISAR6 ;MAP THE LOGICAL NAME+ CMPB #':,-(R0) ;IS THIS A DEVICE OR NODE, BNE 10$ ;IF NE, NO!  CMPB #':,-(R0) ;IS THIS A NODEB  BEQ 20$ ;IF EQ, YESP( 10$: INC R0 ;POINT BACK TO TERMINATOR' 20$: SUB R2,R0 ;GET LENGTH OF STRINGB-  MOV R0,-(SP) ;GET THE NEW LENGTH OF STRINGV" BEQ 30$ ;IF EQ, INVALID STRING MOV R0,R5 ;GET SIZE IN R5S- MOV R2,R1 ;GET POINTER TO START OF STRINGI8 CALL DEVCHK ;SEE IF STRING MATCHES RSX PHYSICAL FORM1 BCS 30$ ;IF CS, NO, USE STRING WITHOUT COLONS6* TST R5 ;ANY LEFTOVER JUNK AFTER DEVICE( BNE 30$ ;IF NE,YES, SKIP COMPRESSION/ MOV #$LTBUF,R3 ;POINT TO NEW PHYSICAL STRINGQ( MOV R2,(R3)+ ;MOVE IN DEVICE MNEMONIC- CALL $DCBTA ;TURN OCTAL NUMBER INTO ASCIIT' MOV R3,R0 ;INITIALIZE SIZE REGISTERW2 SUB #$LTBUF,R0 ;GET ACTUAL SIZE OF LOGICAL NAME? MOV #$LTBUF+20000,R2;GET VIRTUAL ADDRESS OF NEW LOGICAL NAME ) MOV KISAR5,R1 ;GET 32WD APR BIAS VALUET( ADD #6,SP ;CLEAR STACK OF OLD VALUES  BR 40$ ;,30$: MOV (SP)+,R0 ;RESTORE SIZE OF LOGICAL1 MOV (SP)+,R1 ;RESTORE 32WD APR BIAS TO LOGICALK3  MOV (SP)+,R2 ;RESTORE VIRTUAL ADDRESS OF LOGICALC!40$: MOV (SP)+,R3 ;RESTORE R3 -" MOV (SP)+,KISAR6 ;RESTORE ORIGINAL MAPPING #50$: RETURNI$%;+E&;LGTSET - ROUTINE TO SCAN A LOGICAL NAME DEFINED BY A DESCRIPTOR TOO@'; DETERMINE IF IT HAS A COLON IN IT. IF SO, THE LENGTH OF THE;(; LOGICAL IS REDUCED TO INCLUDE THE STRING UP TO, BUT NOT); INCLUDING, THE COLON. *;A +; INPUTS:0&,; R0 - POINTER TO LOGICAL DESCRIPTOR -; OUTPUTS:0.; R0 - UPDATED LENGTH OF LOGICAL IN DESCRIPTOR/;- 0LGTSET:R1 SAVNR ;SAVE R4,R552 MOV 2(R0),KISAR6 ;MAP THE LOGICAL NAME WITH KISAR6P=3 MOV 4(R0),R4 ;GET THE VIRTUAL ADDRESS OF THE LOGICAL START64 MOV (R0),R5 ;GET THE CURRENT L00–Xf¼eÝb`TADATADATADATADATADATAENGTH OF THE LOGICAL4510$: CMPB #':,(R4)+ ;IS THE NEXT CHARACTER A COLON6 BEQ 20$ ;IF EQ, YESE37 DEC R5 ;DECREMENT THE COUNT OF CHARS TO PROCESS #8 BNE 10$ ;IF NE, MORE TO PROCESS6920$: SUB R5,(R0) ;RESET LENGTH OF LOGICAL TO LOOKUP : RETURNP;<=>;+K?; $MPHSH - ROUTINE TO MAP THE APPROPRIATE HASH TABLE THROUGH KISAR6 FOR A5"@; SPECIFIED LOGICAL TABLE NUMBERA;M B; INPUTS:P6C; 6(R0) - CONTAINS A BYTE VALUE FOR THE TABLE NUMBER D; OUTPUT:M<E; CC -> SUCCESSFUL MAPPING OF HASH TABLE ADDRESS IN KISAR6<F; CS -> NO HASH TABLE WAS AVAILABLE FOR GIVEN TABLE NUMBERG;- H$MPHSH::(I MOV R3,-(SP) ;SAVE R3 ACROSS THE CALL&J MOVB 6(R0),R3 ;GET THE TABLE NUMBER4K CALL $TBTRL ;TRANSLATE TABNUM AND MAP HASH TABLE2L MOV (SP)+,R3 ;RESTORE R3 AND MAINTAIN CARRY BIT M RETURN NO;+MP; $TBTRL - ROUTINE TO TRANSLATE THE LOGICAL TABLE NUMBER INTO AN HASH TABLE5Q; OFFSET AND THEN MAP THE HASH TABLE THROUGH KISAR6AR;U S; INPUTS:PT; R3 - TABLE NUMBERF U; OUTPUTS:V; CC - SUCCESS:I5W; KISAR6 - CONTAINS MAPPING TO START OF HASH TABLEE&X; CS - NO HASH TABLE VALUE AVAILABLEY;($Z; R3, KISAR6 ARE DESTROYED BY CALL[;,F\; THIS ROUTINE TAKES THE SPECIFIED LOGICAL TABLE NUMBER AND TURNS ITH]; INTO A WORD OFFSET INTO THE HIERARCHY TABLE IN SYSCM. THE HIERARCHYI^; TABLE CONTAINS THE SECONDARY POOL POINTERS TO EACH OF THE HASH TABLESHH_; IN AN ORDERED, PRECEDENCE-DERIVED SEQUENCE. SINCE THE TABLE NUMBERSG`; NO LONGER HAVE ANY PRETENSE OF PRECEDENCE ORDERING, IT IS NECESSARYGa; TO HASH THE VALUES INTO THE CORRECT WORD OFFSET. FROM THIS OFFSET,BDb; THE APR BIAS OF THE HASH TABLE IS PLACED INTO KISAR6 SO THAT ANYDc; 140000-140100 KERNEL DATA REFERENCES WILL ACCESS THE HASH TABLE.d;- e$TBTRL::6f CMP #T$BLNM,R3 ;SEE IF THIS IS A VALID TABLE NUMBER$g BLO 10$ ;IF LO, NO, RETURN ERROR:h MOVB $TRANL(R3),R3 ;HASH TABLE NUMBER TO CORRECT OFFSET-i ASL R3 ;TURN INTO WORD OFFSET AND KEEP CCM;j MOV $LOGTB(R3),KISAR6 ;MAP THE HASH TABLE THROUGH KISAR6 !k BNE 20$ ;IF NE, THERE WAS ONEAl10$: SEC ;FAILURE INDICATOR. m20$: RETURNSno .PAGEp;+Kq; $LDELX - ROUTINE TO DELETE EVERY LOGICAL IN A GIVEN TABLE REGARDLESS OFN:r; THE BLOCK MODIFIER SPECIFIED. THIS ROUTINE IS USED BY;s; DREIF TO ELIMINATE A TASK AND BY BYE TO LOGOFF A USER.t;O u; INPUTS: 5v; R0 - POINTER TO TCB OR UCB TO DELETE LOGICALS FORB4w; R1 - TABLE CODE INDICATING WHICH TABLE TO DELETEx; y;-z {$LDELX::|A} MOV R0,$TEMP0+10 ;PUT THE TCB/UCB ADDRESS INTO A PARTIAL DESC.H;~ MOV #$TEMP0,R0 ;SET UP THE DESCRIPTOR ADDRESS FOR $LNDALS7 MOV R1,6(R0) ;PUT THE TABLE NUMBER IN THE DESCRIPTORY5€ ; THIS STATEMENT ALSO FORCES A ZERO IN 7(R0).K2� ; THIS CAUSES $LNDAL TO SKIP BOTH THE MODE/‚ ; AND THE PRIVILEGE CHECKS. THIS IS TOS,ƒ ; PREVENT LOSS OF BLOCKS IN RUNDOWN.„…;+K†; $LNDAL - ROUTINE TO DELETE ALL LOGICALS IN A GIVEN TABLE THAT MATCH THEE-‡; BLOCK TYPE MODIFIER SPECIFIED IN THE DPBMˆ; ‰; INPUTS:UEŠ; R0 - POINTER TO A LOGICAL NAME DESCRIPTOR BLOCK WITH NO SPECIFIEDT‹; LOGICAL NAMEA Œ; OUTPUTS: �; CC - ALWAYS INDICATE SUCCESSŽ;RJ�; A ZERO VALUE IN THE BLOCK BYTE - 7(R0) - FORCES A SKIP AROUND BOTH THE&�; MODE AND THE LNB PRIVILEGE CHECKS.‘;-’ “$LNDAL::” SAVNR ;SAVE R4 AND R52• CLR -(SP) ;SET UP INITIAL VALUE FOR HASH TABLE#– CALL $MPHSH ;MAP THE HASH TABLEL'— BCS 50$ ;IF CS, NO HASH TABLE ENTRYE/˜ MOV KISAR6,(SP) ;SAVE THE HASH TABLE MAPPING6™ CLR R1 ;INITIALIZE TO THE FIRST HASH CELL IN TABLE7š10$: CLR R4 ;INITIALIZE PREVIOUS LNB ADDRESS IN LIST&› MOV (SP),KISAR6 ;MAP THE HASH TABLE4œ MOV MAP6(R1),R3 ;GET FIRST ENTRY IN THE CELL LIST3� BEQ 40$ ;IF EQ, THERE ARE NONE, GO TO NEXT CELLB&ž20$: MOV R3,KISAR6 ;MAP THE NEXT LNB8Ÿ CALL $LNTST ;CHECK TO SEE IF ENTRY MATCHES CRITERION  BCC 30$ ;IF CC, IT DOESL>¡23$: MOV R3,R4 ;IT DOESN'T, SET POINTERS AND GET NEXT ENTRY1¢25$: MOV MAP6+L.NLNK,R3 ;GET NEXT ENTRY ADDRESSA6£ BEQ 40$ ;IF EQ00–`fue³cÙ´cÚµcÛ¶c�·c›’, THERE ARE NO MORE, GO TO NEXT CELL(¤ BR 20$ ;GO BACK AND CHECK THIS ENTRY4¥30$: TSTB 7(R0) ;SEE IF THIS IS A GENERIC COMPARE:¦ BEQ 35$ ;IF EQ, IT IS, IGNORE BLOCK NUMBER COMPARISONS6§ CMPB MAP6+L.NBLK,7(R0);SEE IF THE BLOCK TYPES MATCH$¨ BNE 23$ ;IF NE, NO, DON'T DELETE3© CALL PRVTST ;CHECK FOR TASK PRIVILEGE TO DELETEI/ª BCS 23$ ;IF CS, TASK DOESN'T, SKIP THIS ONER2«35$: MOV R4,-(SP) ;SAVE THE PREVIOUS LNB POINTER6¬ MOV R0,-(SP) ;SAVE THE STORAGE AREA ACROSS THE CALL$­ CALL $LNELM ;ELMINATE THIS ENTRY1® MOV (SP)+,R0 ;RESTORE THE STORAGE AREA ADDRESST-¯ MOV (SP)+,R4 ;RESTORE THE PREVIOUS POINTERC=° MOV R4,KISAR6 ;MAP THE PREVIOUS TO GET THE FORWARD POINTERI-± BNE 25$ ;GO BACK AND CHECK THE NEXT ENTRYK/² BR 10$ ;START AT THE HASH CELL IF NECESSARYE1³40$: ADD #2,R1 ;BUMP THE HASH CELL OFFSET WORDT-´ CMP R1,#<*2>;SEE IF END OF CELLS !µ BLOS 10$ ;IF LOS, NO, DO MORE 9¶50$: CLR (SP)+ ;POP THE HASH TABLE LOCATION AND SET CCA · RETURN ¸¹ .PAGEº;+J»; $TBSRC - ROUTINE TO DO HIERARCHICAL LOOKUPS IN THE APPROPRIATE LOGICALC¼; NAME TABLES. THIS ROUTINE MUST BE PASSED A LOGICAL DESCRIPTOR C½; BLOCK AND AN INHIBIT MASK WORD IN $TONYL. SEARCH WILL BEGIN ATE@¾; THE TASK TABLE LEVEL, AND PROCEED SEQUENTIALLY TO THE SYSTEMD¿; LEVEL. IT IS UP TO THE CALLER TO MAKE SURE THAT THE INITIAL TCBHÀ; OR UCB IS SET UP CORRECTLY IF ONE OF THE TABLES ARE TO BE INHIBITED.Á;R Â; INPUTS:TÃ;S<Ä; R0 - POINTER TO CURRENT DESCRIPTOR BLOCK WHICH CONTAINS:'Å; WD 1 - BYTE COUNT OF LOGICAL NAMEO0Æ; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME7Ç; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAME .È; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)*É; BLOCK TYPE NUMBER (HIGH BYTE);Ê; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLETJË; $TONYL - CONTAINS THE INHIBIT MASK WORD WHERE A SET BIT INDICATES THAT3Ì; THAT THE TABLE IS TO BE SKIPPED IN THE LOOKUP.Í;U Î; OUTPUTS:Ï;- Ð; CC = 03Ñ; R3 - APR BIAS ADDRESS OF START OF MATCHING LNB-Ò; Ó; CC = 1Ô; R3,R4 INDETERMINATEÕ;-Ö ×$TBSRC::Ø;ALÙ; THE LOGICAL NAME IS NOW HASHED TO GET THE CELL OFFSET THAT WILL BE VALIDMÚ; ACROSS ALL TABLE LOOKUPS. THEN A LOOP IS ENTERED TO CHECK EACH TABLE FORKÛ; LOOKUP VALIDITY. IF IT IS VALID, THE TCB (IF A TASK TABLE LOOKUP) OR ANLÜ; UCB ADDRESS IS PLACED IN THE DESCRIPTOR BLOCK, AND THE APPROPRIATE TABLE%Ý; IS SEARCHED FOR THE LOGICAL NAME.UÞ; 9ß CALL $LNHSH ;HASH THE LOGICAL NAME TO GET CELL OFFSETT+à CLR R2 ;INITIALIZE THE TABLE OFFSET BITRá;IKâ; INITIALLY CHECK FOR A TASK LOGICAL TABLE LOOKUP. IT IS ASSUMED AT THISTLã; POINT THAT THE DESCRIPTOR CONTAINS THE CORRECT TCB. IF THE LOOKUP FAILSKä; FOR THE TASK TABLE, THE TCB IS USED TO GET THE APPROPRIATE UCB ADDRESS.LLå; THE UCB IS THEN PRESUMED TO BE IN THE DESCRIPTOR FOR ALL OTHER SEARCHES.æ;P*ç CALL 50$ ;CHECK THE TASK LOGICAL TABLE)è BCC 40$ ;IF CC, THE LOGICAL WAS FOUNDC4é BVS 30$ ;IF VS, TABLE INHIBITED, DON'T TOUCH TCB9ê MOV 10(R0),R5 ;GET THE TCB ADDRESS FROM THE DESCRIPTORN4ë MOV T.UCB(R5),10(R0);AND PUT THE UCB ADDRESS BACK/ì BR 30$ ;GO ON FOR THE OTHER TYPES OF LOOKUPOí;SKî; THE FOLLOWING LOOKUPS ARE ONLY FOR THE USER, GROUP, AND SYSTEM LOOKUPS.EQï; FOR THE USER AND GROUP LOOKUPS, IT IS ASSUMED THAT THE CORRECT UCB IS ALREADYEð; IN THE DESCRIPTOR BLOCKEñ;Aò20$: CALL 50$ ;VERIFY ONE OF THE USER, GROUP, OR SYSTEM TABLES )ó BCC 40$ ;IF CC, THE LOGICAL WAS FOUND "ô30$: INC R2 ;BUMP TO NEXT TABLE%õ CMP #T$BLNM,R2 ;ALL TABLES CHECKEDM"ö BHIS 20$ ;IF HIS, NO, CONTINUE.÷35$: SEC ;INDICATE FAILURE TO FIND A MATCH ø40$: RETURNTù;YLú; ROUTINE TO DETERMINE IF THIS TABLE IS VALID AND IF THE LOGICAL IS WITHIN û; THE TABLEUü;Gý50$: BITB $MSKBT(R2),$TONYL ;SEE IF SEARCH OF THIS TABLE IS INHIBITED 'þ SEV ;INITIALIZE TO TABLE INHIBITED3ÿ BNE 35$ ;IF EQ, IT IS, CONTINUE WITH NEXT TABLEO= CLRB 6(R0) ;SET TABLE NUMBER TO BE SEARCHED IN DESCRIPTOR BISB $LTMSK(R2),6(R0);T00–hf¼eÝb`TADATADATADATADATADATA .PAGE;+F; $LNTBS - ROUTINE TO FIND A LOGICAL NAME STRING IN A SPECIFIC TABLE;F ; INPUTS:D1 ; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCKR ; BLOCK CONTAINS:' ; WD 1 - BYTE COUNT OF LOGICAL NAMEH0 ; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME7; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAMEI.; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)*; BLOCK TYPE NUMBER (HIGH BYTE);; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLEM1; R1 - WORD OFFSET TO BE USED TO FIND HASH CELLT;R ; OUTPUTS:.; CC = 0 -> SUCCESSFUL MATCH OF LOGICAL NAME,; R3 = MATCHING LNB (32 WD BLOCK ADDRESS)4; R4 = PREVIOUS LNB IN LIST (32 WD BLOCK ADDRESS) ; CC = 1 -> UNSUCCESSFUL MATCH;; R3 = LOGICAL FITS BELOW THIS LNB (32 WD BLOCK ADDRESS)A;; R4 = LOGICAL FITS ABOVE THIS LNB (32 WD BLOCK ADDRESS)E; &; R0,R1 IS PRESERVED ACROSS THE CALL;+ $LNTBS::*  MOV R1,-(SP) ;SAVE THE HASH CELL OFFSET=! MOV KISAR6,-(SP) ;SAVE THE CURRENT VALUE OF KERNEL D APR 6 #" CALL $MPHSH ;MAP THE HASH TABLEC+# BCS 30$ ;IF CS, NO HASH TABLE AVAILABLE '$ CLR R4 ;INITIALIZE PREVIOUS POINTER<% ADD #MAP6,R1 ;ADD A KISAR6 OFFSET TO THE HASH TABLE ENTRY*& SEC ;ASSUME THAT THERE ARE NO ENTRIES4' MOV (R1),R3 ;GET THE APR BIAS OF THE FIRST ENTRY( BEQ 30$ ;IF NO ENTRY EXIT ()10$: MOV R3,KISAR6 ;MAP THE NEXT ENTRYA* CMPB (R0),MAP6+L.NLNS;ARE THE LENGTHS OF THE ENTRIES THE SAME? -+ BLO 30$ ;IF LO, NO - LOGICAL BELONGS HERE *, BEQ 20$ ;IF EQ, MAYBE, CONTINUE CHECKS.-15$: MOV R3,R4 ;UPDATE THE PREVIOUS POINTER . SEC ;ASSUME NO MORE ENTRIES./ MOV MAP6+L.NLNK,R3 ;GET THE NEXT ENTRY BIAS/0 BEQ 30$ ;IF EQ, NO MORE, ENTRY BELONGS HEREY,1 BR 10$ ;GO BACK AND CHECK THE NEXT ENTRY;220$: CALL $LNTST ;CHECK THE TABLE PARAMETERS FOR A MATCH323 BCS 15$ ;IF CS, THEY DIDN'T MATCH, GET ANOTHER94 CALL $CMPST ;CONDITIONS MATCH, SEE IF LOGICAL IS SAMEH:5 BCS 30$ ;IF CS, THEY DON'T - ENTRY BELONGS HERE THOUGH%6 TST R1 ;IF R1 = 0 THIS IS A MATCHN&7 BNE 15$ ;IF NE, TRY THE NEXT ENTRY08 TSTB 7(R0) ;SEE IF THIS IS A GENERIC COMPARE69 BEQ 30$ ;IF EQ, IT IS, DON'T COMPARE BLOCK NUMBERSF: CMPB 7(R0),MAP6+L.NBLK ;LOGICAL IS CORRECT, IS BLOCK TYPE THE SAME?.; BHI 15$ ;IF HI, NO, GO BACK FOR NEXT ENTRY,< ;IF LO, CS IS SET - ENTRY BELONGS HERE%= ;IF EQ, CC IS CLEAR AND SUCCESSR/>30$: MOV (SP)+,KISAR6 ;RESTORE KERNEL MAPPINGA-? MOV (SP)+,R1 ;RESTORE THE HASH CELL OFFSETT @ RETURNHABC .PAGED;+JE; $LNHSH - ROUTINE TO TURN A LOGICAL NAME STRING INTO A WORD OFFSET INTO*F; A TO-BE-DETERMINED LOGICAL HASH TABLEG;3 H; INPUTS:T1I; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCK6J; BLOCK CONTAINS:'K; WD 1 - BYTE COUNT OF LOGICAL NAME$0L; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME7M; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAMEA N; OUTPUTS:O; R0 - SAME AS INPUTBP; R1 - WORD OFFSET FROM START OF HASH TABLE TO CORRECT HASH CELLQ;TKR; ALL CHARACTERS IN THE ASCII RANGE WITHIN THE LOGICAL ARE UPCASED BEFORENS; PROCESSING. T;OJU; *************************** TAKE NOTE ********************************V;0-W; THIS ROUTINE MUST NOT BE CHANGED WITHOUT1X; THE CORRESPONDING CHANGE TO THE SAME ROUTINEC3Y; IN [70,10]ASNOV.MAC FOR VMR. ANY CHANGES MADE 2Z; HERE AND NOT THERE WILL CAUSE AN INABILITY TO-[; FIND AND DELETE LOGICALS CREATED BY VMR.T\; J]; **********************************************************************^;+_ `$LNHSH::'a CLR R1 ;INITIALIZE THE OFFSET VALUEB0b MOV KISAR6,-(SP) ;SAVE CURRENT KISAR6 MAPPING.c MOV R0,-(SP) ;SAVE DESCRIPTOR BLOCK ADDRESS%d MOV R2,-(SP) ;SAVE THE INCOMING R2N%e MOV R3,-(SP) ;SAVE THE INCOMING R3P7f MOV (R0)+,R2 ;GET THE NUMBER OF BYTES IN THE LOGICALM!g BEQ 20$ ;NONE TO BE PROCESSED /h MOV (R0)+,KISAR6 ;MAP THE BLOCK TO BE HASHED6i MOV (R0)+,R3 ;GET THE OFFSET TO THE FIRST CHARACTER9j10$: CALL $CVBUC ;GET THE NEXT CHARACTER IN UPPER CASE*:k ADD R5,R1 ;SUM THE UPCASED CHARACTER00–pfue³cÙ´cÚµcÛ¶c�·c›’ VALUES OF LOGICAL-l SOB R2,10$ ;ALL THE VALUES OF THE LOGICALNm MOV R1,R0 ;SQUARE THE VALUE n CALL $MUL ;B=o ASH #-5.,R1 ;SHIFT VALUE TO GET WORD OFFSET RANGE OF 0-31,7p BIC #177701,R1 ;BY TAKING THE MIDDLE 6 BITS OF VALUEMq20$: MOV (SP)+,R3 ;RESTORE R3Br MOV (SP)+,R2 ;RESTORE R2 5s MOV (SP)+,R0 ;RESTORE THE DESCRIPTOR BLOCK ADDRESSM+t MOV (SP)+,KISAR6 ;RESTORE KERNEL MAPPINGA u RETURN:vwx .PAGEy;+Pz; $LNTST - ROUTINE TO MATCH THE TABLE PARAMETERS OF A DESCRIPTOR BLOCK AGAINST{; AN LNB IN THE LISTL|; }; INPUTS: 1~; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCK ; BLOCK CONTAINS:'€; WD 1 - BYTE COUNT OF LOGICAL NAME 0�; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME7‚; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAMEV.ƒ; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)*„; BLOCK TYPE NUMBER (HIGH BYTE);…; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLEE8†; R3 - APR BIAS TO THE START OF AN LNB IN A TABLE LIST‡; Hˆ; KISAR6 MUST MAP THE LNB CURRENTLY IN R3 WHEN THIS ROUTINE IS INVOKED‰;- Š; OUTPUTS:9‹; CC = 0 -> TABLE TYPES AND UCB/TCB/GROUP NUMBERS MATCHD1Œ; CC = 1 -> ENTRIES DO NOT MATCH IN SOME REGARDD�;KŽ;-� �$LNTST::$‘ MOV R1,-(SP) ;SAVE THE CURRENT R1+’ MOV 6(R0),R1 ;GET THE TABLE NUMBER IN R1TA“ CMPB #LT.TSK,R1 ;IS THE DESCRIPTOR ENTRY IN THE THE TASK TABLE)'” BNE 20$ ;IF NE, NO, CONTINUE CHECKSI9•10$: CMP MAP6+L.NTCB,10(R0);DO THE TCB/UCB VALUES MATCHL*– BEQ 40$ ;IF EQ, YES, EXIT SUCCESSFULLY*— BR 30$ ;IF NE, NO, EXIT UNSUCCESSFULLY5˜20$: CMPB #LT.SES,R1 ;IS THIS A SESSION TABLE CHECKE™ BEQ 10$ ;IF EQ, YESR/š CMPB #LT.GRP,R1 ;IS THIS A GROUP TABLE CHECKO2› BNE 40$ ;IF NE, NO, IT IS A SYSTEM TABLE CHECK=œ CALL GTUIC ;GET THE PROTECTION UIC GROUP CODE FROM $TKTCB B� CMPB MAP6+L.NGRP,R1 ;CHECK THE GROUP AGAINST THE PROTECTION UIC%ž BEQ 40$ ;IF EQ, THEY ARE THE SAMEE Ÿ30$: SEC 40$: MOV (SP)+,R1 ;RESTORE R1E ¡ RETURNL¢£ .PAGE¤¥;+E¦; $DCBTA - ROUTINE TO TURN A BINARY VALUE INTO AN ASCII TEXT STRINGL§; ¨; INPUTS:.+©; R0 - NUMBER TO BE TRANSLATED INTO ASCIIQ5ª; R3 - POINTER TO BUFFER TO STORE TRANSLATED NUMBER «; ¬; OUTPUTS:&­; R3 - POINTS PAST THE NUMBER STRING®;J¯; THIS ROUTINE WILL NOT TRANSLATE A ZERO UNIT NUMBER INTO AN ASCII DIGIT°;R±;-²5³$DCBTA::BIC #177400,R0 ;PREVENT SIGN PROPAG. IN ASH #´ ;(0; THIS SUBFUNCTION GETS A SPECIFIC DEFAULT DIRECTORY STRING.B; IF GD.LOG IS SPECIFIED, THE DDS WILL BE TAKEN FROM THE CONTEXTC; BLOCK POINTED TO BY THE USER TI: UCB. IF THE MODIFIER IS ZERO,;?; THE DDS WILL TAKEN FROM THE CONTEXT BLOCK POINTED TO BY THER; ISSUING TASK'S TCB. ;E;B ; INPUTS:N;; R3 = ADDRESS OF DPB+2E/; R5 = ADDRESS OF THE TCB OF THE CURRENT TASK;; AFTER CALL TO ACROB:'; R0 = SIZE OF USER BUFFER (IN BYTES) ; R1 = BIAS OF USER BUFFER); R2 = APR6 DISPLACEMENT TO USER BUFFERD;T ; OUTPUTS:9 ; THE DEFAULT DIRECTORY STRING (OR AS MUCH AS WILL FIT)M-!; IS RETURNED IN THE SPECIFIED USER BUFFER.T;"; IN ADDITION, IF THE ADDRESS OF A WORD IN WHICH THE SIZEO+#; OF THE STRING IS RETURNED IS SPECIFIED.S$; %;- &$LNFGD::6& .IF DF C$$RDR ; REMOTE DIRECTORY SUPPORT ;KLN027& ;KLN027HF& BIT #F5.RDR,$FMSK5 ;ARE WE USING REMOTE DIRECTORY STORAGE? ;KLN027"& BNE 100$ ;IF EQ NO ;KLN0275& JMP 1$ ;GET DIRECTORY FROM CONTEXT BLOCK ;KLN027S&; ;KLN0271&; GET A REQUEST PACKET FROM CPRBUF ;KLN027U&; ;KLN0277&100$: MOV 6(R3),R1 ;GET SIZE OF USER BUFFER ;KLN027O'& BEQ 103$ ;IF ZERO ERROR ;KLN027S.& CMP R1,#LN$SIZ ;IS IT TOO LARGE? ;KLN027*& BLOS 105$ ;IF LO OR SAME NO ;KLN0275&103$: DRSTS D.RS89 ;INVALID BUFFER SIZE ;KLN027NQ&105$: ADD #,R1 ;ADD SIZE OF HEADER,DPB,BUFFERED ;KLN027E#& ;STORAGE AREA ;KLN0271*& ; AND RETURNED SIZE BUFFER ;KLN027>& MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ ;KLN027;& ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ;KLN027 & ASH #-6,R1 ; ;KLN027D& MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START ;KLN027*& MOV R3,R5 ;SAVE DPB POINTER ;KLN0272& CALL $CPALO ;GET BUFFER FROM CPRBUF ;KLN027&; ;KLN0279&; FILL IN REQUEST PACKET AND SEND TO CPRAME ;KLN027D&; ;KLN027(& MOV R0,KISAR6 ;MAP PACKET ;KLN0271& MOV #MAP6,R1 ;GET ADDRESS OF HEADER ;KLN027R8& MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST ;KLN027(& CLRB H$ICNT(R1) ;NO ITEMS ;KLN027.& ADD #P$DPB,R1 ;POINT TO DPB AREA ;KLN0271& MOV -2(R5),(R1)+ ;COPY DIC AND SIZE ;KLN027I>& MOV (R5),(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER ;KLN027(& CLR (R1)+ ;RESERVED WORD ;KLN027L& MOV #,(R1)+ ;ADDRESS OF DEFAULT DIRECTORY ;KLN027& ;BUFFER ;KLN027=& MOV 6(R5),(R1)+ ;SIZE OF DEFAULT DIRECTORY BUFFER ;KLN027R7& CLR (R1)+ ;ASSUME NO RETURN SIZE REQUESTED ;KLN027Y1& TST 10(R5) ;SIZE BUFFER SPECIFIED? ;KLN027T"& BEQ 110$ ;IF EQ NO ;KLN027I& MOV #,-(R1) ;ADDRESS OF USER SIZE BUFFER ;KLN027I,& TST (R1)+ ;POINT TO NEXT WORD ;KLN027C&110$: MOV 4(R5),(R1)+ ;STORE ADDRESS OF DIRECTORY BUFFER ;KLN027LD& MOV 10(R5),(R1) ;STORE ADDRESS OF USER SIZE BUFFER (OR 0) ;KLN027& ;KLN027 :& CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAME 00–€fue³cÙ´cÚµcÛ¶c�·c›’ ;KLN027&; ;KLN027)&; GET RESPONSE PACKET AND ;KLN027E0&; TRANSFER BUFFERS INTO USER AREA ;KLN027&; ;KLN027/& MOV R0,-(SP) ;SAVE PACKET ADDRESS ;KLN027D(& MOV R0,KISAR6 ;MAP PACKET ;KLN027;& CMP #IS.SUC,MAP6+H$STAT ;WAS SUCCESS RETURNED? ;KLN027#& BEQ 125$ ;IF EQ YES ;KLN027S@& CMP #IE.RBS,MAP6+H$STAT ;WAS IS JUST A SIZE PROBLEM? ;KLN027*& BNE 200$ ;IF NE FATAL ERROR ;KLN027C&125$: MOV MAP6+H$SIZE+GD$SIZ,R0 ;ADDRESS OF USER BUFFER ;KLN0270;& MOV MAP6+H$SIZE+10,R1 ;SIZE OF BUFFER FROM DPB ;KLN027K,& CALL $ACHKB ;DO ADDRESS CHECK ;KLN027%& BCS 240$ ;IF CS ERROR ;KLN027V8& CALL $RELOC ;GET BIAS AND OFFSET OF BUFFER ;KLN0273& MOV R1,R3 ;SET UP DEST BIAS FOR BLXIO ;KLN027T1& MOV R2,R4 ;SET UP DEST DISPLACEMENT ;KLN027F6& MOV (SP),R1 ;SET UP SOURCE BIAS FOR APR5 ;KLN027L& MOV #,R2 ;SET UP SOURCE DISPLACEMENT ;KLN0276& MOV MAP6+H$SIZE+10,R0 ;GET SIZE FROM DPB ;KLN0273& TST MAP6+H$SIZE+12 ;WAS SIZE RETURNED ;KLN027F"& BEQ 130$ ;IF EQ NO ;KLN027,& MOV R0,-(SP) ;SAVE BUFFER SIZE ;KLN027@& MOV MAP6+H$SIZE+GD$SIZ+GD$BUF,R5 ;GET RETURNED SIZE ;KLN0270& SUB R5,(SP)+ ;WILL THE STRING FIT? ;KLN027"& BMI 130$ ;IF MI NO ;KLN027+& MOV R5,R0 ;USE RETURNED SIZE ;KLN027P>&130$: CALL $BLXIO ;RETURN EQUIVALENCE NAME STRING ;KLN0274& TST MAP6+H$SIZE+12 ;WAS SIZE RETURNED? ;KLN027"& BEQ 200$ ;IF EQ NO ;KLN027;& MOV #200$,-(SP) ;SPECIFY $SGFIN RETURN ADDRESS ;KLN027U*& CALL $SGFIN ;INHIBIT TRAPS ;KLN027B& MOV MAP6+H$SIZE+GD$SIZ+GD$BUF,-(SP) ;GET RETURNED SIZE ;KLN027C& MOV MAP6+H$SIZE+GD$SIZ+2,R3 ;GET ADDRESS OF USER BUFFER ;KLN027 +& MTPD (R3) ;RETURN IT TO USER ;KLN027 *& RETURN ;RETURN FROM $SGFIN ;KLN0275&200$: MOV (SP)+,R0 ;GET BUFFER BIAS BACK ;KLN027E.& CALLR $CPDEA ;DEALLOCATE BUFFER ;KLN0275&240$: MOV (SP)+,R0 ;GET BUFFER BIAS BACK ;KLN027F-& CALL $CPDEA ;DEALLOCATE BUFFER ;KLN027 0& DRSTS D.RS98 ;ADDRESS CHECK ERROR ;KLN027&1$: ;KLN027& .ENDC ; C$$RDR ;KLN027B,' CMPB #GD.LOG,1(R3) ;CHECK MODIFIER IN DPB( BNE 5$ ;USE CTX FROM TCB() MOV T.UCB(R5),R5 ;GET TI: UCB ADDRESS(* BIT #DV.PSE,U.CW1(R5) ;PSEUDO DEVICE?+ BNE 3$ ;IF NE, YES2, MOV U.CTX(R5),R5 ;GET USER CONTEXT BLOCK (BIAS)'- BNE 10$ ;IF NE, FOUND CONTEXT BLOCKO,.3$: DRSTS D.RS21 ;RETURN - NAME NOT FOUND!/5$: TSTB 1(R3) ;MODIFIER ZERO?0 BNE 50$ ;IF NE, NO - ERROR41 MOV T.CTX(R5),R5 ;GET CTX ADDRESS FROM TCB (BIAS)'2 BNE 10$ ;IF NE, FOUND CONTEXT BLOCKC;3 DRSTS D.RS21 ;RETURN DIRECTIVE STATUS--'NAME NOT FOUND'E+410$: ADD #4,R3 ;POINT TO WD 3 OF THE DPBV/5 CALL ACROB ;CALCULATE BIAS AND DISPLACEMENTE"6 MOV R3,$TEMP0 ;SAVE DPB POINTER(7 MOV R0,-(SP) ;SAVE SIZE OF DDS BUFFER+8 MOV R1,R3 ;SET UP BUFFER BIAS FOR BLXIO "9 MOV R2,R4 ;SET UP DISPLACEMENT+: MOV R5,R1 ;SET UP BIAS OF CONTEXT BLOCKR; MOV R5,KISAR6 ;MAP CTX BLOCK < CLR R5 ;+= BISB C.DDSL+MAP6,R5 ;GET THE DDS LENGTHO*> SUB R5,(SP) ;WILL THE NAME STRING FIT?.? BMI 20$ ;IF HI NO (USE ENTIRE USER BUFFER)-@ MOVB C.DDSL+MAP6,R0 ;ADJUST AMOUNT TO COPYI4A MOV #C.DDS+MAP5,R2 ;SET UP DISPLACEMENT OF STRING2B20$: CALL $BLXIO ;RETURN EQUIVALENCE NAME STING'C MOV $TEMP0,R3 ;GET SAVED DPB POINTERF0D TST (R3) ;WAS AN ADDRESS SPECIFIED TO RETURN1E ;THE LENGTH (BYTE COUNT) OF THE EQUIVALENCESF ;NAME STRING INTO?G BEQ 30$ ;IF EQ NOA0H MOV #30$,-(SP) ;SPECIFY $SGFIN RETURN ADDRESSI CALL $SGFIN ;INHIBIT TRAPS&J CLR -(SP) ;CLEAR LOCATION ON STACK)K BISB C.DDSL+MAP6,(SP) ;GET SIZE OF ENS!L MTPD @(R3) ;RETURN IT TO USERN M RETURN;N30$: MOV (SP)+,R0 ;GET SIZE DIFERENCE BETWEEN USER BUFFERCO ;AND STRING -P BPL 40$ ;IF PL ENTIRE STRING WAS RETURNEDA=Q DRSTS D.RS15 ;RETURN DIRECTIVE STATUS--'BUFFER TOO SMALL'U R40$: RETURNLS&T50$: DRSTS D.RS99 ;INVALID MODIFIERU .PAGEV;+W;9X; $LNFSD -- SET UP DEFAULT DIRECTORY STRING SUBFUNCTIONE00–ˆf¼eÝb`TADATADATADATADATADATAY;AAZ; THIS SUBFUNCTION SETS UP A SPECIFIC DEFAULT DIRECTORY STRING.OC[; IF SD.LOG IS SPECIFIED, THE DDS IN THE CONTEXT BLOCK POINTED TO C\; BY THE USER TI: UCB WILL BE MODIFIED. IF THE MODIFIER IS ZERO,EE]; THE DDS IN THE CONTEXT BLOCK POINTED TO BY THE ISSUING TASK'S TCB F^; WILL BE MODIFIED. IF SD.BYE IS SPECIFIED, THE USERS CONTEXT BLOCK_; WILL BE DELETED.`;L a; INPUTS:Db; R3 = ADDRESS OF DPB+2I3c; R5 = THE ADDRESS OF THE TCB OF THE CURRENT TASKTd;Ce; AFTER CALL TO ACROB:'f; R0 = SIZE OF USER BUFFER (IN BYTES)Ig; R1 = BIAS OF USER BUFFER)h; R2 = APR6 DISPLACEMENT TO USER BUFFEREi;Ej;O k; OUTPUTS:8l; THE DEFAULT DIRECTORY STRING IS CREATED OR SUPERSEDS7m; THE EXISTING STRING. IF A NULL STRING IS SPECIFIED, 7n; (I.E. NO BUFFER ADDRESS SPECIFIED IN THE DIRECTIVE)B>o; THEN THE DEFAULT DIRECTORY STRING FOR THE ISSUING TERMINALp; IS DELETED.Dq; r;As;- t$LNFSD::6t .IF DF C$$RDR ; REMOTE DIRECTORY SUPPORT ;KLN027t ;KLN027 Ft BIT #F5.RDR,$FMSK5 ;ARE WE USING REMOTE DIRECTORY STORAGE? ;KLN027 t BEQ 1$ ;IF EQ NO ;KLN027t; ;KLN0271t; GET A REQUEST PACKET FROM CPRBUF ;KLN027It; ;KLN027*t CMPB #SD.BYE,1(R3) ;SD.BYE? ;KLN027#t BEQ 205$ ;IF EQ YES ;KLN027Et ;KLN027N)t CMPB #SD.TI,1(R3) ;SD.TI? ;KLN027C#t BEQ 205$ ;IF EQ YES ;KLN027t ;KLN027 2t MOV 6(R3),R1 ;GET SIZE OF USER BUFFER ;KLN0272t BEQ 200$ ;IF EQ ILLEGAL SIZE FOR DDS ;KLN027t ;KLN027 .t CMP R1,#LN$SIZ ;IS SIZE TOO BIG? ;KLN027$t BLOS 210$ ;IF LOS NO ;KLN027=t200$: DRSTS D.RS89 ;RETURN ILLEGAL BUFFER LENGTH ;KLN027Kt ;KLN027;+t205$: CLR R1 ;NO BUFFER SIZE ;KLN027LAt210$: ADD #,R1 ;ADD SIZE OF HEADER,DPB ;KLN027>t MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ ;KLN027;t ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ;KLN027Zt ASH #-6,R1 ; ;KLN027B*t MOV R3,R5 ;SAVE DPB POINTER ;KLN027Dt MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START ;KLN0272t CALL $CPALO ;GET BUFFER FROM CPRBUF ;KLN027t; ;KLN027(t; FILL IN REQUEST PACKET ;KLN027t; ;KLN0270t MOV R4,-(SP) ;SAVE SIZE OF REQUEST ;KLN027,t MOV R0,-(SP) ;SAVE PACKET BIAS ;KLN027(t MOV R0,KISAR6 ;MAP PACKET ;KLN0271t MOV #MAP6,R1 ;GET ADDRESS OF HEADER ;KLN027 8t MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST ;KLN027(t CLRB H$ICNT(R1) ;NO ITEMS ;KLN027.t ADD #P$DPB,R1 ;POINT TO DPB AREA ;KLN0271t MOV -2(R5),(R1)+ ;COPY DIC AND SIZE ;KLN027O?t MOV (R5)+,(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER ;KLN027I-t MOV (R5)+,(R1)+ ;RESERVED WORD ;KLN027 *t CMPB #SD.BYE,1(R3) ;SD.BYE? ;KLN027#t BEQ 220$ ;IF EQ YES ;KLN027 )t CMPB #SD.TI,1(R3) ;SD.TI? ;KLN027A#t BEQ 220$ ;IF EQ YES ;KLN027 Jt MOV #,(R1)+ ;ADDRESS OF DEFAULT DIRECTORY BUFFER ;KLN0272t MOV (R5)+,R0 ;USER ADDRESS OF BUFFER ;KLN027;t MOV (R5),(R1) ;SIZE OF DEFAULT DIRECTORY BUFFER ;KLN027V:t MOV (R1),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK ;KLN027*t CALL $ACHKB ;CHECK ADDRESS ;KLN027%t BCS 300$ ;IS CS ERROR ;KLN027R:t CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENT ;KLN027Kt SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENT ;KLN0272*t MOV (SP),R3 ;GET DEST BIAS ;KLN027@t MOV #,R4 ;GET DEST DISPLACEMENT ;KLN0278t MOV MAP6+P$DPB+10,R0 ;GET SIZE OF TRANSFER ;KLN027=t CALL $BLXIO ;TRANSFER DIRECTORY SPEC INTO BUFFER ;KLN027t220$: ;KLN0270t MOV (SP)+,R0 ;GET PACKET BIAS BACK ;KLN0272t MOV (SP)+,R4 ;GET PACKET LENGTH BACK ;KLN027t ;KLN027L:t CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAME ;KLN027t ;KLN027S7t CALLR $CPDEA ;NO RETURN PROCESSING NEEDED ;KLN027(t ;KLN027S0t300$: MOV (SP)+,R0 ;GET PACKET BIAS ;KLN027)t TST (SP)+ ;CLEAN OFF STACK ;KLN027$-t CALL $CPDEA ;DEALLOCATE BUFFER ;KLN027C+t DRSTS D.RS98 ;00–�fue³cÙ´cÚµcÛ¶c�·c›’ADDRESS ERROR ;KLN027Ft1$: ;KLN027t .ENDC ; C$$RDR ;KLN027G%u TSTB 1(R3) ;CHECK MODIFIER IN DPB(v BEQ 30$ ;USE CTX FROM TCB *w CMPB #SD.TI,1(R3) ;WAS SD.TI SPECIFIED?x BNE 10$ ;IF NE, NO8y MOV T.CTX(R5),-(SP) ;GET TASK'S CONTEXT BLOCK POINTER z MOV T.UCB(R5),R1 ;GET TI: UCB:{ CMP U.CTX(R1),(SP)+ ;IS TERMINAL CONTEXT SAME AS TASK?$| BEQ 90$ ;IF EQ, INDICATE SUCCESS)} MOV T.CTX(R5),R1 ;GET TERMINAL CONTEXTD-~ CALL $DLCTX ;DELETE TASKS CURRENT CONTEXTR& MOV T.UCB(R5),R1 ;GET TI: UCB AGAIN@€ MOV U.CTX(R1),T.CTX(R5) ;SET TASK CONTEXT TO TERMINAL CONTEXT� BEQ 65$ ;IF EQ, DONE!‚ MOV KISAR6,-(SP) ;SAVE MAPPINGC*ƒ MOV U.CTX(R1),KISAR6 ;MAP CONTEXT BLOCK/„ INCB C.REF+140000 ;INCREMENT REFERENCE COUNTA$… MOV (SP)+,KISAR6 ;RESTORE MAPPING$† BR 65$ ;INDICATE NAME SUPERCEDED,‡10$: MOV T.UCB(R5),R5 ;GET TI: UCB ADDRESS(ˆ BIT #DV.PSE,U.CW1(R5) ;PSEUDO DEVICE?‰ BNE 80$ ;IF NE, YESIŠ;O5‹; IF SD.BYE, DELETE CONTEXT BLOCK AND RETURN STATUSŒ;V(� CMPB #SD.BYE,1(R3) ;SD.BYE SPECIFIED?Ž BNE 20$ ;IF NE, NO2� MOV U.CTX(R5),R1 ;GET USER CONTEXT BLOCK (BIAS)%� CALL $DLCTX ;DEALLOCATE CTX BLOCKN,‘ CLR U.CTX(R5) ;ZERO CONTEXT BLOCK POINTER4’ DRSTS D.RSP3 ;RETURN STATUS OF 'NAME SUPERSEDED'“+”20$: CMPB #SD.LOG,1(R3) ;SD.LOG SPECIFIEDN• BNE 100$ ;IF NE, ERROR&–30$: MOV R3,$TEMP0 ;SAVE DPB POINTER'— ADD #4,R3 ;POINT TO WD 3 OF THE DPB?/˜ CALL ACROB ;CALCULATE BIAS AND DISPLACEMENTD0™ CMP #11.,R0 ;MAX LENGTH OF DDS BUFFER IS 11.š BLT 110$ ;IF LE, ERROR5› SUB #MAP6-MAP5,R2 ;MAKE BIAS APR5 RATHER THAN APR6G!œ CALL $CRCTX ;CREATE CTX BLOCKL(� BCS 70$ ;BR IF CTX ALLOCATION FAILED&ž MOV $TEMP0,R2 ;GET DPB ADDRESS BACK,Ÿ CMPB #SD.LOG,1(R2) ;WAS SD.LOG SPECIFIED?  BNE 40$ ;IF NE, NO7¡ MOV U.CTX(R5),R1 ;GET CONTEXT BLOCK POINTER FROM UCBR"¢ BEQ 60$ ;IF EQ, NO CURRENT CTX#£ CALL $DLCTX ;DELETE OLD CONTEXT %¤ BR 60$ ;UPDATE CTX POINTER IN UCBS;¥40$: MOV T.CTX(R5),R1 ;GET CONTEXT BLOCK POINTER FROM TCB "¦ BEQ 50$ ;IF EQ, NO CURRENT CTX#§ CALL $DLCTX ;DELETE OLD CONTEXTR3¨50$: MOV R3,T.CTX(R5) ;PUT NEW CTX POINTER IN TCB.© DRSTS D.RSP3 ;STATUS OF 'NAMED SUPERCEDED'ª3«60$: MOV R3,U.CTX(R5) ;PUT NEW CTX POINTER IN UCBW!¬ MOV KISAR6,-(SP) ;SAVE MAPPINGI#­ MOV R3,KISAR6 ;MAP CONTEXT BLOCKN3® MOV #C.DDS+140001,R0 ;POINT TO FIRST CHAR OF DDSC!¯ MOV R5,-(SP) ;SAVE UCB ADDRESS 7° CALL CNTB ;CONVERT DDS TO BINARY EQUIV, IF POSSIBLE0$± MOV (SP)+,R5 ;RESTORE UCB ADDRESS$² MOV (SP)+,KISAR6 ;RESTORE MAPPING#³ BCC 62$ ;IF CC, CONVERSION DONEL=´ MOV U.LUIC(R5),U.UIC(R5) ;SET DEFAULT UIC = PROTECTION UICI µ BR 65$ ;>¶62$: MOV R1,U.UIC(R5) ;SET DEFAULT UIC = BINARY EQUIV OF DDS1·65$: DRSTS D.RSP3 ;STATUS OF 'NAME SUPERCEDED'(¸%¹70$: DRSTS D.RS1 ;INDICATE NO POOLOº-»80$: DRSTS D.RS21 ;RETURN - NAME NOT FOUNDS¼ ½90$: DRSTS +1 ;RETURN SUCCESS¾'¿100$: DRSTS D.RS99 ;INVALID MODIFIERIÀ,Á110$: DRSTS D.RS89 ;INVALID BUFFER LENGTHÂ;A8Ã; CNTB - CONVERT A NAMED DIRECTORY TO A BINARY WORD IF%Ä; IN THE FORM OF [G,M] OR [GGGMMM](Å;. Æ; INPUTS: R0 = BUFFER POINTERÇ;I%È; OUTPUTS: IF CC, R1 = BINARY WORD55É; IF CS, INDICATES NAMED DIRECTORY NOT CONVERTEDDÊ; ËÌCNTB:N'Í CLR -(SP) ; USE STACK FOR FLAG WORD *Î MOV #3,R4 ; NUMBER OF CHARS TO CONVERT$Ï CLR R1 ; CLEAR ACCUMULATED VALUE!Ð MOVB #',,R2 ; STOP ON A COMMA0Ñ CALL 100$ ; CONVERTDÒ BCS 20$ ; BR IF INVALID Ó MOV R1,R3 ; STORE RESULTÔ BEQ 20$ ; IF EQ, INVALID*Õ MOV #3,R4 ; NUMBER OF CHARS TO CONVERT$Ö CLR R1 ; CLEAR ACCUMULATED VALUE'× CMPB #',,(R0) ; POINTING TO A COMMA?Ø BNE 10$ ; IF NE, NOIÙ TSTB (R0)+ ; SKIP THE COMMAE"Ú INC (SP) ; INDICATE COMMA SEEN'Û10$: MOVB #'],R2 ; STOP ON A BRACKETCÜ CALL 100$ ; CONVERT#Ý BCS 20$ ; BR IF INVALIDN)Þ SWAB R3 ; PUT GROUP CODE IN HIGH BYTEß BIS R3,R1 ; PUT INTO RESULT0à BEQ 20$ ; IF EQ, INVALID#á CMPB #'],(R0)+ ; ENDING BRACKET?,â BNE 20$ ; IF NE, ERROR"ã TST (SP) ; D00–˜f—šfÝb`TADATADATADATADATADATAID WE SEE A COMMA?ä BNE 15$ ; IF NE, YES%å TST R4 ; VERIFY WE PARSED 3 CHARSEæ BNE 20$ ; IF NE, - ERROR1ç15$: TST (SP)+ ; CLEAN STACK, INDICATE SUCCESS)%è BR 30$ ; RETURN TO CALLER WITH CCDé20$: TST (SP)+ ; CLEAN STACK,+ê SEC ; INDICATE DIRECTORY NOT CONVERTEDV&ë30$: RETURN ; AND RETURN TO CALLERìí%î100$: MOVB (R0)+,R5 ; GET NEXT CHARR*ï CMPB R2,R5 ; IS THIS ENDING CHARACTER?ð BEQ 115$ ; BR IF YES(ñ SUB #'0,R5 ; SUBTRACT CHARACTER BIAS"ò BMI 120$ ; IF MI, ILLEGAL CHAR$ó CMPB R5,#8. ; CHECK AGAINST BASE$ô BHIS 120$ ; IF HIS, ILLEGAL CHAR$õ MUL #8.,R1 ; MULT RESULT BY BASE!ö ADD R5,R1 ; ACCUMULATE RESULTU÷ SOB R4,100$ ; GO AGAIN/ø110$: CMP #377,R1 ; NUMBER GREATER THAN 377?Cù RETURN ; RETURN TO ABOVERú115$: TSTB -(R0) ; BACK UP &û CMP #3,R4 ; DID WE PARSE ANYTHING?ü BNE 110$ ; IF NE, YES - OK,ý120$: SEC ; INVALID CHARACTER TO CONVERTþ RETURN ; RETURN TO ABOVEBÿ  .ENDC ;DF N$$DIR   .END120$ ; IF MI, IL .TITLE DCCHE - $CACHE ENTRY .IF DF D$$CHE .IDENT /01.01/e;6; Copyright (c) 1985 by DIGITAL EQUIPMENT CORPORATION.; All rights reserved.;; Original author:; John Gemignani;.; Modified by:;M; D. P. Rabahy 06-Mar-85 01.01%; General clean up and documentatione;eI; This module contains the various entry points into the cache code. TheeO; executive transfers control to the cache via entry point $CACHE, from routineBL; $DRQRQ in module DRSUB. (Note that other entry paths are possible when the;; cache uses the fork list and the internal I/O mechanism.)y;hO; Entry point $XPLOA is called by the LOAD utility to load the cache code as annL; EXP. Likewise, entry point $XPUNL is called by UNLOAD to remove the cacheP; code. This requires special handling, since you must guarantee that the cacheP; is not being used. A recommended way to do this is to check the cache contextP; fields of the UCBX for all disks on the system. If the appropriate cache bitsM; are NOT on, then the code has no partitions in the system which are active.t;aG; Note that the EXP hookpoints ($XPLOA and $XPUNL) are called in APR6. yL; Therefore, position-independent code is required, with absolute referencesN; corrected by subtracting 20000 from the target addresses. The cache code isP; built for APR5 (120000->137777), and the subtraction of the 020000 will change;; the 140000-157777 references to the proper address range.l;s .MCALL PCBDF$* PCBDF$ ;Define partition control block - .SBTTL $CACHE - Main entry point from $DRQRQh; 4; The presence of the packet is guaranteed (driver5; kick-starts will bypass the dispatching routine).t0; The UCB and SCB are accessible via R5 and R46; respectively. The caller's mapping has been saved4; on the stack above the return address to $DRQRQ.;0$CACHE::( CALLR $DCDSP ;Invoke cache dispatcher e- .SBTTL Executive external partition routinesa, .SBTTL + $XPLOA - "LOAD /EXP=" entry point.;e;; This routine (module, and whole EXP for that matter) is <; mapped in APR6 (140000->157777). The stack contains the=; return address to LOAD, and the address above that is thet>; PCB address of the partition which LOAD created and copied>; us into. LUN 1 is assigned to the issuer's console (TI:).;; We are NOT in system state. Status is returned via the$(; C-bit: CC is success, CS is failure.; $XPLOA:: TST @#$DRCHE ;Already loaded?B BNE 10$ ;Yes if NEX( MOV 2(SP),R0 ;Else get our PCB address3 MOV P.REL(R0),@#$DRCHE ;And tell the exec about iti TST (PC)+ ;Return success!10$: SEC ;Else error if loadede RETURN ;Back to LOAD b. .SBTTL + $XPUNL - "UNLOAD /EXP=" entry point.;w;; This routine (module, and whole EXP for that matter) is <; mapped in APR6 (140000->157777). The stack contains the7; return address to UNLOAD. LUN 1 is assigned to the 8; issuer's console (TI:). We are NOT in system state.:; Status is returned via the C-bit: CC is success, CS is ; failure.;PA; NOTE: Th00— f¢¡f£§f´cÚµcÛ¶c�·c›’is existing code does not check for the presence of anyn:; existing active cache partitions. Therefore, removal of7; the cache code during normal operation can (and will)o;; crash the system (as soon as something takes up the spacet&; the cache code previously occupied).;7$XPUNL::+ CLR @#$DRCHE ;Wipe out APR bias to unloadD RETURN ;And return with CC .ENDC ; .IF DF D$$CHE .END NOT in system state.:; Status is returned via the C-bit: CC is success, CS is ; failure.;PA; NOTE: Th .TITLE DCDSP - CACHE DISPATCHER .IF DF D$$CHE .IDENT /01.01/N; 6; Copyright (c) 1985 by DIGITAL EQUIPMENT CORPORATION.; All rights reserved.;D; Original author:; John Gemignani;; Modified by:;P; D. P. Rabahy 06-Mar-85 01.01%; General clean up and documentation ;bI; This module contains the code which dispatches incoming I/O operations.R;R .PSECT DC$DSP, RO, I  n1 .SBTTL + DCDSP - DATA CACHE OPERATION DISPATCHER;;v ; Passed:e; R1 -> I/O packet ; R5 -> UCBL;C ; Returned: ; R0 contents lost;R>;;; N/A - control is passed to the appropriate phase-I routine;I ; Action:N4; This routine is used to dispatch the I/O packet to6; the appropriate action routines. The UCBX is mapped3; before beginning processing, in order to make theo8; context handy, and to verify that the UCBX is present.7; (Disk UCBs without UCBXs are either offline, or don'tO7; have one due to a lack of secondary pool, and as suchE; cannot support data caching.)a;t7; Function codes are checked in the order in which they6; occur most. The low three bits of the function code6; (lowest three bits of the modifier byte) are assumed8; to not be useable, as far as dispatching is concerned.; 9; All I/O functions except IO.STC require the cache to bem:; activated in order for dispatching (since IO.STC is used; to activate the cache).t;B$DCDSP::0 MOV U.UCBX(R5), KISAR6 ; Map the UCBX into APR60 BEQ 10$ ; None present if EQ, no caching here+ MOV I.FCN(R1), R0 ; Get the function coded5 BIC #BYPASS, R0 ; Remove any modifier (bypass) bitsr% CMP #IO.STC, R0 ; Control function?h BEQ 60$ ; Yes if EQ= BITB #XC.ACT, APR6.BASE+X.CSTS ; Cache active for this unit? * BEQ 10$ ; No if EQ, pass to the driver+ CMP #IO.RVB, R0 ; Read virtual operation?o BNE 30$ ; If NE, sanity check BPT30$:) CMP #IO.LOV, R0 ; Load I-space overlay?V BEQ 50$ ; Yes if EQ+ CMP #IO.RLB, R0 ; Read logical operation?  BEQ 20$ ; Yes if EQ, CMP #IO.WVB, R0 ; Write virtual operation? BNE 45$ ; If NE, sanity check BPT45$:, CMP #IO.WLB, R0 ; Write logical operation? BEQ 40$ ; Yes if EQ) CMP #IO.LDO, R0 ; Load D-space overlay?h BEQ 50$ ; Yes if EQ+10$: RETURN ; Pass request to the driver620$: BIT #BYPASS, I.FCN(R1) ; Should read be bypassed? BNE 10$ ; If NE, yesT$ CALLR $DCR1 ; Invoke read phase I)40$: CALLR $DCW1 ; Invoke write phase I#150$: CALLR $DCOV1 ; Invoke load overlay phase IY,60$: CALLR $DCSTC ; Invoke control routine .ENDC ; .IF DF D$$CHE .ENDity check BPT45$:, CMP #IO.WLB, R0 ; Write logical operation? BEQ 40$ ; Yes if EQ) CMP #IO.LDO, R0 ; Load D-space overlay?h BEQ 50$ ; Yes if EQ+10$: RETURN ; Pass request to the driver620$: BIT #BYPASS, I.FCN(R1) ; Should read be bypassed? BNE 10$ ; If NE, yesT$ CALLR $DCR1 ; Invoke read phase I)40$: CALLR $DCW1 ; Invoke write phase I#150$: CALLR $DCOV1 ; Invoke load overlay phase IY,60$: CALLR $DCSTC ; Invoke control routi .TITLE DCSUB - Subroutines  .IF DF D$$CHE .IDENT /01.05/B; 8; Copyright (c) 1986 by DIGITAL EQUIPMENT CORPORATION.;; All rights reserved.; ; Original author: ; John Gemignani ;e ; Modified by: ; ; D. P. Rabahy 06-Mar-85 01.01!; Eliminate the routine .MPPHYb;l;&; Modified for RSX-11M-PLUS V4.0 by:;$; Eric Postpischil 26-Jun-86 01.02-; EDP033 -- Add support for large extents.e;l ; J. Kauffman 26-Aug-86 01.038; JRK330 00£¨fšfÝb`TADATADATADATADATADATA-- Add support for write deferred operations;E#; B. S. McCarthy 19-Mar-87 01.04i6; BM387 -- Convert part of of $BCKUP to call $DCWIO; #; J. R. Kauffman 29-May-87 01.05a1; JRK336 -- Force cache flush if going NODEFER;G; This module contains various routines to support disk data caching.l; .MCALL HDRDF$ ;JRK3304 ;JRK330c1 HDRDF$ ; Define the Header offsets ;JRK330p ;JRK330s .PSECT DC$SUB,RO,Ia -: .SBTTL SEARCH - Search for the first overlapping extent;t ; Passed:; R1 -> User's I/O packet1;; UCBX mappedv;a ; Returned: E; R2 := LSB (Least Significant Part) of the highest requested block %; R3 := MSP (Most Significant Part)*; R4 := Length of the transfer in blocks;o& ; CC: R0 -> First overlapping extent(!; CS: Indicates no overlapping extentsD"; H.TMP1 -> CED prior to request (zero denotes beginning of list);#; H.TMP2 -> CED after request (zero denotes end of list)-$;c%; Cache partition mapped&;t 'SEARCH::2( MOV APR6.BASE+X.CCED, R0 ; Get the first extent)** CALL MAPPAR ; Map the cache partition+3, MOVB I.PRM+P4(R1), R3 ; Get MSP of requested LBN!- MOV I.PRM+P5(R1), R2 ; and LSPt.+/ MOV R2, -(SP) ; Put a copy on the stack0 MOV R3, -(SP)162 MOV I.PRM+P2(R1), R4 ; Get the request size (bytes)3 ADD #777, R4 ; Round upi23 ROR R4 ; Bring carry in as high bit. ;EDP03373 SWAB R4 ; Finish right shift of nine bits. ;EDP03333 BIC #177400,R4 ; Clear unwanted bits. ;EDP0335 ;**-1E*6 DEC R4 ; Backup one block temporarily738 ADD R4, 2(SP) ; Calculate highest LBN requested)"9 ADC (SP) ; Carry if necessary:,; INC R4 ; Restore to full size requested<;= CLR APRD.BASE+H.TMP1 ; Assume prior is beginning of listP>/? TST R0 ; Is the LBN list completely empty?#@ BEQ 51$ ; If EQ, yesRA@B10$: BITB #, E.STAT(R0) ; Is this extent valid?$B BEQ 15$ ; If EQ, yes ;JRK330B; ;JRK330SB; A deferred CED that is marked for delete can not be ignored as a normal ;JRK330aSB; one could. It must be checked to see if the user PC must be backed up. ;JRK330 B; ;JRK3309B BITB #ES.WDF,E.STAT(R0) ; Is CED a deferred? ;JRK330A2B BEQ 20$ ; If EQ, no, ignore this CED ;JRK330D; ;**-17E; Don't forget that the extent high LBN is stored +1.F;F15$: ;JRK330>5G CMPB R3, E.LBNH+2(R0) ; Might this extent overlap? +H BHI 20$ ; If HI, no, check next extent I BLO 30$ ; If LO, yese/J CMP R2, E.LBNH(R0) ; Double word comparison3K BLO 30$ ; If LO, yes L3M20$: MOV R0, APRD.BASE+H.TMP1 ; Set prior pointer3(N MOV E.LNXT(R0), R0 ; Get next extent O BNE 10$ P BR 50$eQ@R30$: CMPB (SP), E.LBNL-1(R0) ; Does this extent truly overlap?S BHI 40$ ; If HI, yesoT BLO 50$ ; If LO, no1U CMP 2(SP), E.LBNL(R0) ; Double word comparisonKV BLO 50$ ; If LO, noW&X40$: CLC ; Indicate overlap found Y BR 60$IZ[50$:4\51$: MOV R0, APRD.BASE+H.TMP2 ; Set after pointer]^ SEC ; Indicate no overlap_`60$: MOV (SP)+, R3a MOV (SP)+, R2b c RETURNTd e .SBTTL Attachment RoutinesX!f .SBTTL + ATTCED - Attach a CEDEg; h; Passed:i; R0 -> CED to attachLj; R1 -> I/O packet to attachk;a l; Returned: m; All registers preserved;n;O7o; This routine will attach a CED to an I/O packet forp; I/O completion. q; rATTCED::s MOV R0, -(SP)t MOV R2, -(SP)u.v MOV R0, R2 ; CREATT returns R0 -> new PADw2x CALL CREATT ; Create an attachment descriptor,y BCS 10$ ;No pool if CS; return an errorz+{ MOV R1,A.IOPA(R0) ; Point to I/O packete4| MOV E.ATTL(R2),(R0) ; Link to start of ATTL list$} MOV R0,E.ATTL(R2) ; Now attached+~ INCB I.PRM+P3(R1) ; Indicate attachment - INCB E.PCNT(R2) ; Lock CED down once morer€10$:� MOV (SP)+,R2t‚ MOV (SP)+,R0oƒ „ RETURNp… n8† .SBTTL + DETCED - Detach extents involved with an00£°f¡f£§f´cÚµcÛ¶c�·c›’ I/O‡; ˆ; Passed: ‰; R1 -> I/O packet Š; P6 -> First extent involved‹; Œ; Returned:e�; All registers preservedoŽ;C �; Action:e?�; A "lock" is simply an increment of an extent pending count.A‘;2B’; This routine removes the lock placed by phase-I on all extentsG“; involved in the I/O request by, naturally, decrementing the pending ”; count.•;nB–; The highest LBN involved is calculated by adding the requestedD—; size to the starting LBN. It is then compared to low LBN of the/˜; next extent to determine if it is involved.F™;eCš; If any extent pending count reaches zero a check is made and if@›; the extent was marked for deletion by DCIOC (I/O completion)@œ; because a driver error was detected then it will be deleted.�;s ž; Note:e1Ÿ; A request size of zero could crash this code.l ;cH¡; If phase-I determines to cache a request through the cache partitionH¢; it must guarantee that if multiple extents are involved they will be£; contiguous to one another.¤;e ¥DETCED::&¦ MOV R0, -(SP) ; Get work registers§ MOV R2, -(SP)¨ MOV R3, -(SP)©;o&ª; Calculate the highest LBN involved«;m7¬ MOV I.PRM+P2(R1),R3 ; Get the request size in bytes "­ BPL 10$ ; If PL, sanity check® BPT¯10$:° ADD #777, R3 ; Round upu0± ASH #-9., R3 ; Convert it into a block count²3³ DEC R3 ; It's easier then decrementing the LBNc´7µ ADD I.PRM+P5(R1), R3 ; Add in LSP of request to sizea1¶ MOV I.PRM+P4(R1), R2 ; Get MSP of user requestt· ADC R2 ; Carry into MSP¸/¹ MOV I.PRM+P6(R1), R0 ; Get first CED addressº1»20$: DECB E.PCNT(R0) ; Decrement pending counto3¼ BGT 30$ ; If GT, more pending - leave it alone "½ BEQ 25$ ; If EQ, sanity check¾ BPT¿25$:5À BITB #ES.DEL, E.STAT(R0) ; Should this be deleted?91Á BEQ 30$ ; If EQ, no - advance to next extentRÂ$à CALL FRECED ; Delete the extent(Ä ; If CS, extent busy - no problemÅ>Æ30$: MOV E.LNXT(R0), R0 ; Get address of next extent by LBN4Ç BEQ 40$ ; If EQ, end of LBN list - must be doneÈ3É CMPB R2, E.LBNL-1(R0) ; Is this extent involved?CÊ BHI 20$ ; If HI, yes /Ë BLO 40$ ; If LO, no - end of attached liste/Ì CMP R3, E.LBNL(R0) ; Double word comparisonÍ BHIS 20$ ; If HIS, yes,Î.Ï40$: MOV (SP)+, R3 ; Restore work registersÐ MOV (SP)+, R2Ñ MOV (SP)+, R0Ò Ó RETURN Ô DÕ .SBTTL Mapping Routines1Ö .SBTTL + MAP - Map I[/D] space unconditionallyV×;XCØ; MAPPAR- Establish cache partition mapping, based upon executive @Ù; features. This will map the non-I/D exec to the partition?Ú; via APR6, and for I/D systems, both APR5 and APR6 will be;;Û; used. Mapping context is not saved, and this routineD@Ü; should only be used for code executing from the FORK list.Ý;P ÞMAPPAR::)ß .IFDF K$$DAS ; Kernel I/D executive?Mà .IFTF ; K$$DASá"â MOV R0,-(SP) ; Save a register9ã MOV U.UCBX(R5),KISAR6 ; Map UCB extension through APR6X5ä MOV APR6.BASE+X.CPCB,R0 ; Get address of cache PCBu/å MOV P.REL(R0),KISAR6 ; Map partition in APR6eæç .IFT ; K$$DASè-é MOV KISAR6,KISAR5 ; I/D systems allow 8KW ,ê ADD #200,KISAR6 ; Always map accordinglyëì .IFTF ; K$$DASdí!î MOV (SP)+,R0 ; Restore statuseï RETURN ; Back to callerOðñ .ENDC ; K$$DASRò 2ó .SBTTL + MAPUCB - Map the UCB extension in APR6ô;A"õ; MAPUCB - Map the UCB extensionö;r ÷; Passed:Bø; R5 -> UCB of requestor ù; Returned:R*ú; CS: If no UCBX is present for this UCB(û; CC: Mapping is established and validü;a:ý; NOTE: If there is no UCBX then APR6 references will be2þ; able to touch the vectors (and any part of the/ÿ; executive living within the same zip code).; MAPUCB::1 MOV U.UCBX(R5),KISAR6 ;Map UCB's UCBX in APR 6O( BEQ 10$ ;None if EQ; must return CS( TST (PC)+ ;Clear C-bit and skip SEC(10$: SEC ;Else BR to 10$ will set C  RETURN ;And back to caller q, .SBTTL Buffer address conversion routines?  .SBTTL + ADJBUF -00£¸fšfÝb`TADATADATADATADATADATA Convert NPR buffer addresses to doubleword ;" ; ADJBUF - Adjust buffer address ;e ; Passed:e; R1 -> I/O packet to adjust ; R5 -> UCBf; ; Returned:i; Nil.; ;; This routine will replace the 22-bit buffer address for;8; UC.NPR devices with an address doubleword for use by$; the $BLXIO (block move) routine.;k ADJBUF::) BITB #UC.NPR,U.CTL(R5) ;Is device NPR?T- BEQ 10$ ;No if EQ; leave address "as is"f( MOV R2,-(SP) ;Get two work registers MOV R3,-(SP) ;4 MOV I.PRM+P1.1(R1),R2 ;Get the MSB of the address4  MOV I.PRM+P1.2(R1),R3 ;Get the LSB of the address!!" .IFNDF M$$EXT ;18-bit system *# ASH #4,R2 ;Shift <21:20> into <17:16>$ .IFF ;M$$EXT(% SWAB R2 ;Shift <31:24> into <23:16>& .ENDC ; M$$EXTd'8( BIC #^C<77>,I.PRM+P1.2(R1) ;Remove all but low 6 bits:) BIS #APR6.BASE,I.PRM+P1.2(R1) ;Create APR6 displacement$* ROL R3 ;Shift out <15> from LSB+ ROL R2 ;And pick up in MSBe$, ROL R3 ;Shift out <14> from LSB- ROL R2 ;And pick up in MSB;*. SWAB R3 ;Shift <13:6> into low 8 bits&/ SWAB R2 ;Shift <21:14> into place)0 BISB R3,R2 ;Set <13:6> into APR biasH)1 MOV R2,I.PRM+P1.1(R1) ;Create APR biasF2)3 MOV (SP)+,R3 ;Restore saved registers<4 MOV (SP)+,R2 ;5610$: RETURN ; All set7 (8 .SBTTL INTERNAL I/O SUPPORT)9 .SBTTL + CHEDUP - Duplicate I/O packetR:;p<;; CHEDUP - Allocate new packet and duplicate passed packet<;c4=; This routine is used to duplicate the I/O packet8>; passed in R1. All fields are copied, and the result:?; is returned in R0. If the packet cannot be allocated,@; CS will be returned.A;A BCHEDUP::C MOV R1,-(SP)1D MOV R2,-(SP)bEAE MOV #I.LGTH,R1 ; Allocate an I/O packet from primary ;JRK330;+E CALL $ALOCB ; pool space ;JRK330B#G BCS 20$ ; Error if CS ;**-1 H0I MOV 2(SP),R1 ; Get original packet's address3J MOV #,R2 ; Packet size in words in R2,K MOV R0,-(SP) ; Save new packet's address2L10$: MOV (R1)+,(R0)+ ; Copy the packet's fields6M SOB R2, 10$ ; into the new packet, until all done$N MOV (SP)+,R0 ; Restore registersO20$:P MOV (SP)+,R2MQ MOV (SP)+,R1M R RETURNbS &T .SBTTL + CHEDEP - Delete I/O packetU;rV; CHEDEP - Delete packetW;O?X; This routine deletes the I/O packet whose address is in R3.*=Y; No status is returned, and if the packet is bogus, BUGCHKM(Z; will give an unfortunate indication.[; \CHEDEP::!] MOV R0,-(SP) ; Save registers^ MOV R1,-(SP)(_ MOV R2,-(SP)p`1a MOV R3,R0 ; Load packet's address for $DEPKT b CALL $DEPKT ; Dispose of itc'd MOV (SP)+,R2 ; And reload registerse MOV (SP)+,R1f MOV (SP)+,R0 g RETURN h Pi .SBTTL BUFFER MANAGEMENT1j .SBTTL + GETBUF - Allocate a buffer from cachelk;t l; Passed: m; R1 -> User's I/O packet 7m; R4 := length required in 512-byte blocks ;EDP033M*o; R5 -> UCB of request device ;**-1p; q; Returned:Mr; CC: R0 -> Available CEDs; CS: No CED availablet;(>u; Attempts to allocate space can be provided through variousv; algorithms.Dw;e.x; The first algorithm attempts to reuse free>y; space as quickly as possible, by searching the extent list<z; for "holes" of unused bufferspace. (Note that all holes>{; will be block increments.) If a search of the extent list=|; fails to find any free space, then the oldest item in the <}; extent age list will be deallocated. Another attempt to?~; allocate space will be tried. A failure at this point will %; cause the request to be bypassed.d€;r �GETBUF::0‚ CALL GETFRE ;Attempt to allocate free space!ƒ BCC 10$ ;Space found, use its„.… MOV APRD.BASE+H.CEDH,R0 ;Get oldest in list!† BEQ 20$ ; If EQ, end-of-listc‡'ˆ CALL FRECED ;Deallocate the extentn.‰ BCS 20$ ; If CS, extent is currently busyŠ; ‹; Update H.TMP1 & H.TMP2Œ;o7� CMP R0, APRD.BASE+H.TMP1 ; Freed CED before by LBN?e&Ž BNE 4$ ; If NE, no; don't up00£Àf¡f£§f´cÚµcÛ¶c�·c›’date#� MOV E.LPRV(R0), APRD.BASE+H.TMP1p%� BR 5$ ; No need to check H.TMP2 ‘4$:d6’ CMP R0, APRD.BASE+H.TMP2 ; Freed CED after by LBN?&“ BNE 5$ ; If NE, no; don't update#” MOV E.LNXT(R0), APRD.BASE+H.TMP2D•5$:e3– CALL GETFRE ;Another attempt to get free space"— BCS 20$ ;Still no space if CS˜10$:0™ TST (PC)+ ;Return CC to indicate free spaceš20$:.› SEC ;Return CS to indicate no free space œ RETURN � e4ž .SBTTL + GETFRE - Allocate free space in CED listŸ;a  ; Passed:L¡; R1 -> User's I/O packet*¢; R4 := Number of 256-word blocks needed£; R5 -> UCB of request deviceF¤;C ¥; Returned:?2¦; CS indicates either no buffer space available,2§; or that a CED to describe that space cannot¨; be allocatedg©; CC:p0ª; R0 -> New CED to be completed, with space«; allocated.¬;C­;R2,R3 insignificant®;R4,R5 preserved¯;r$°; To obtain the address and length:±; of any free space (between allocations), the following²; algorithm is used:³; C´; size = ADDRESSOF(ced[n+1]) - ADDRESSOF(ced[n]) - SIZEOF(ced[n])µ;5-¶; base = ADDRESSOF(ced[n]) + SIZEOF(ced[n])?·; ?¸; Special handling is required for the first and last CEDs inC=¹; the list. The first one is treated as the [n+1] element,p=º; with the base of the data buffer portion of the partitiona=»; being the address of the [n] element (SIZEOF(n) is zero).¼;o<½; The last element is treated as the [n] element, with the<¾; address of the end being the base of the data portion of-¿; the partition plus the size of same area.-À;O7Á; This routine will scan the CED list for free space.e5Â; Free space is the unallocated portion between thef7Ã; allocated extents. The entire list must be checkedrÄ; in order to find it.Å; ÆGETFRE:b-Ç MOV R1,-(SP) ;Save the I/O packet addressaÈ0É MOV APRD.BASE+H.CMDH,R0 ;Address of first CEDÊ10$: Ë; Assume E.BNXT = 0 for source1Ì MOV (R0), R1 ;Address of next physical extentf&Í BEQ 30$ ;End of extent list if EQÎ,Î CLR R2 ; Prepare to get byte. ;EDP033FÎ BISB E.SIZE(R0),R2 ; Get size of extent in 512-byte blocks.;EDP033/Î ASH #3,R2 ; Convert to APR bias. ;EDP033hBÐ ADD E.PHYA(R0),R2 ;Add base for possible free space addr ;**-14Ñ MOV E.PHYA(R1),R3 ;Get the address of the "next"0Ò SUB R2,R3 ;Subtract free address for length-Ó BNE 20$ ;Free space available - check it Ô0Õ15$: MOV R1,R0 ;Else advance in the CED listÖ BR 10$ ;And look for spaceQ××20$: ;EDP033 ?× ASH #-3,R3 ; Convert to 512-byte blocks to compare.;EDP033I7× CMP R3,R4 ; Is this free space big enough? ;EDP03333Ù BLO 15$ ;Too small if LO; keep searching ;**-1Ú;E Û; Context:Ü;bÝ; R0 -> Low CED of free space; Þ; R1 -> High CED of free space(ß; R2 := Physical address of free spaceà; R3 := Length of free space(á; R4 := Length of requested free spaceâ; R5 -> UCB of disk deviceã;eä; The following must be done:0å;A)æ; 1. A CED allocated for the new extentP3ç; 2. The new CED linked into the physical address 5è; list, positioned between the R0-> and R1-> CEDi@é; 3. The new CED placed at the end of the age list (BY CALLER)4ê; 4. The new CED inserted at the appropriate point"ë; in the LBN list (BY CALLER)ì;s"í MOV R0,R3 ;Free up R0 for use"î CALL CRECED ;Create a CED now8î BCS 40$ ; If CS, none are available for use ;JRK330ð ;**-1e,ñ MOV R2,E.PHYA(R0) ;Establish our address*ò MOVB R4,E.SIZE(R0) ;Establish our size%ó; Assume E.BNXT = 0 for destinationy&ô MOV R0, (R3) ;Point previous to us+õ MOV R3,E.BPRV(R0) ;Point us to previousw'ö MOV R0,E.BPRV(R1) ;Point next to usY%÷; Assume E.BNXT = 0 for destinationt"ø MOV R1, (R0) ;Point us to nextùAù MOV R5,E.UCB(R0) ;Plug in owning device's UCB address ;JRK330Lû ;**-1a%ü TST (PC)+ ;Return CC for successeý30$:&þ SEC ;Indicate no space availableþ40$: ;JRK330t"ÿ MOV (SP)+,R1 ;Restore saved R1  RETUR00£ÈfšfÝb`TADATADATADATADATADATANa 9 .SBTTL + FRECED - Unlink and deallocate a cache extent,; ; Alternate entry: ; FREBUF - Deallocate a buffer;e ; Passed:V; R0 -> CED to be deallocatedY,; R5 -> UCB Address of device ;JRK330 ;, ; Returned:s ; CC: CED is deleted( ; CS: CED is marked for deletion later ; ; All registers preserved;T8; Prior to deallocation, the CED must be removed from:;o; 1. The age list; 2. The LBN list; 3. The address list; H; NOTE: If the extent is "busy" or "locked down" it will be marked for#; deletion during I/O completion.;B FRECED::2 BITB #EXBUSY, E.STAT(R0) ;Extent in transition?7 BNE 100$ ; If NE, yes, don't deallocate it ;JRK3303 ;**-1n .IFDF CHEDFR ;JRK330 ;JRK330oA BITB #ES.WDF,E.STAT(R0) ; Is deferred write supported ;JRK330o# BEQ 50$ ; If EQ, no ;JRK330m ;JRK330 D BITB #ES.ERR,E.STAT(R0) ; Is there an error with this CED ;JRK330# BEQ 20$ ; If EQ, no ;JRK330r+ BPT ; Yes, can't allow this ;JRK330e ;JRK330e=20$: CALL $ELDFR ; Write out this deferred extent ;JRK330n; BCS 110$ ; If space failure, don't mark delete ;JRK330 . BR 100$ ; Mark for delete later ;JRK330 ;JRK330  .ENDC ;CHEDFR ;JRK330T ;JRK330w?50$: TSTB E.PCNT(R0) ; Pending requests for extent? ;JRK330% BNE 100$ ; If NE, yes ;JRK330T ;JRK330e: MESAG$ CEDKIL,33.,,<> ;JRK330 ;JRK330, ;**-2 ,  CALL QRMAGE ; Remove from the age queue,! CALL QRMLBN ; Remove from the LBN queue)" BR FREBUF ; Proceed to deallocate it "100$: ;JRK330:" MESAG$ CEDDFR,34.,,<> ;JRK330" ;JRK330R<$ BISB #ES.DEL, E.STAT(R0) ; Mark for deletion later ;**-1$% SEC ; Indicates extent is busy%110$: ;JRK336 & RETURNJ';TQ(; This alternate entry should only be called if the CED was never inserted into); the age and LBN lists.*; +FREBUF::, MOV R1, -(SP)--. MOV E.BPRV(R0), R1 ;Point to previous CEDr5/; Assume E.BNXT = 0 for both source and destinatione50 MOV (R0), (R1) ;Point previous around to our next. 1; Assume E.BNXT = 0 for source#2 MOV (R0), R1 ;Point to next CEDE?3 MOV E.BPRV(R0),E.BPRV(R1) ;Point next around to our previousa!4 CALL DELCED ; Delete the CED 56 MOV (SP)+, R17 CLC ; Indicates successs 8 RETURNb8 .PAGE ;JRK33038 .SBTTL WRITE DEFERRED I/O OPERATIONS ;JRK330@8 .SBTTL + $ELDFR - Write data in deferred CED to disk ;JRK3308; ;JRK330L8; $ELDFR - Routine to write out specified deferred extent to disk ;JRK3308; ;JRK3308; Inputs: ;JRK330o78; R0 - CED with data to be written to disk ;JRK330B+8; R5 - UCB address of device ;JRK330p8; Outputs: ;JRK330E8; CC - I/O packet queued to driver to write data in extent ;JRK330=8; CS - No primary pool for I/O packet allocation ;JRK330O8; ;JRK3308 .IFDF CHEDFR ;JRK3308 ;JRK330o8$ELDFR:: ;JRK33028 MOV R0,-(SP) ; Save R0 across routine ;JRK33028 MOV R1,-(SP) ; Save R1 across routine ;JRK33028 MOV R2,-(SP) ; Save R2 across routine ;JRK33028 MOV R3,-(SP) ; Save R3 across routine ;JRK33028 MOV R4,-(SP) ; Save R4 across routine ;JRK33028 MOV R5,-(SP) ; Save R5 across routine ;JRK3308 ;JRK330t<8 MOV E.UCB(R0),R5 ; Get new UCB address from CED ;JRK3308 ;JRK330 :8 CALL $CRDFR ; Allocate and fill in I/O packet ;JRK33018 BCS 50$ ; If CS, allocation failure ;JRK330 8 ;JRK330tJ8 MOV KINAR5,I.IOSB+2(R1) ; Set up internal I/O completion address;JRK330+8 MOV #DFRIOC!1,I.IOSB+4(R1) ; ;JRK330M8 ;JRK3303B8 BISB #ES.WIP,E.STAT(R0) ; Indicate a write-in-progress ;JRK330C8 INCB E.PCNT(R0) ; Tie down extent to prevent going away ;JRK330 8 ;JRK330EM8 MESAG$ DFRMSG,35.,,<,> ;JRK330C8 ;JRK336t8 .IF DF CHESAN ;JRK3368 ;JRK336 98 CALL .CKSAN ; See if sanity block is correct ;JRK336K8 ;JRK336S8 .ENDC ;CHESAN ;JRK336r8 ;JRK330F98 MOV R5,-(SP) ; Save R5 across call for DUDRV ;JRK330:8 CALL $DRQRQ ; Initiate the I/O for the extent ;JRK330(8 MOV (SP)+,R5 ; Restore R5 ;JRK33038 CALL MAPPAR ; Map the cache partition ;JRK330E&8 CLC ; Indicate success ;JRK3308 ;JRK330G7850$: MOV (SP)+,R5 ; Restore the UCB address ;JRK330N08 MOV (SP)+,R4 ; Restore original R4 ;JRK33008 MOV (SP)+,R3 ; Restore original R3 ;JRK33008 MOV (SP)+,R2 ; Restore original R2 ;JRK33008 MOV (SP)+,R1 ; Restore original R1 ;JRK33008 MOV (SP)+,R0 ; Restore CED address ;JRK3308 RETURN ;JRK330 8 ;JRK3308 ;JRK330oH8 .SBTTL + $CRDFR - Create internal I/O packet for deferred CED ;JRK3308; ;JRK330Q8; $CRKPT - Routine to allocate/fill deferred write internal I/O packet ;JRK330s8; ;JRK3308; Inputs: ;JRK330 58; R0 - CED with data to written to disk ;JRK3303,8; R5 - UCB address of device ;JRK3308; Outputs: ;JRK3308; CC: ;JRK3300?8; R1 - I/O packet allocated and partially filled ;JRK330 8; CS: ;JRK330 48; Allocation failure for I/O packet ;JRK3308; ;JRK3308$CRDFR:: ;JRK33028 MOV R0,-(SP) ; Save the CED address ;JRK3308 ;JRK330i38 MOV #I.LGTH,R1 ; Get size to allocate ;JRK330008 CALL $ALOCB ; Allocate I/O packet ;JRK33018 BCS 50$ ; If CS, allocation failure ;JRK330a8; ;JRK330U8; First clear the packet and then fill in necessary data for call to driver ;JRK330t8; ;JRK33038 MOV R0,-(SP) ; Save I/O packet address ;JRK330 4810$: CLRB (R0)+ ; Clear out the packet ;JRK3308 SOB R1,10$ ; ;JRK330 98 MOV (SP)+,R1 ; Restore packet address into R1 ;JRK33038 ;JRK3303>8 MOV $LDRPT,R0 ; Take priority of ...LDR for packet ;JRK330)8 BISB T.PRI(R0),T.PRI(R1) ; ;JRK3308 ;JRK330 <8 MOV R5,I.UCB(R1) ; Put in UCB address of device ;JRK330F8 MOV #IO.WLB,I.FCN(R1) ; Make this a logical write operation ;JRK3308 ;JRK330R38 MOV (SP),R0 ; Restore the CED address ;JRK330K>8 MOV R0,I.AADA(R1) ; Keep pointer to CED in packet ;JRK3308 ;JRK330KD8 MOV E.LBNL(R0),I.PRM+P5(R1) ; Get LSP of LBN to write to ;JRK330<8 BISB E.LBNL-1(R0),I.PRM+P4(R1) ; Get MSP of LBN ;JRK3308 ;JRK330?8 MOVB E.SIZE(R0),R2 ; Get size of transfer in blocks ;JRK33008 ASH #9.,R2 ; Turn that into bytes ;JRK330@8 MOV R2,I.PRM+P2(R1) ; Put byte value into I/O packet ;JRK3308 ;JRK330 48 MOV R1,R4 ; Save address of I/O packet ;JRK33078 MOV #APR6.BASE,R2 ; Get APR6 displacement ;JRK330E?8 MOV E.PHYA(R0),R1 ; Get APR bias of start of buffer ;JRK330R@8 CALL $MPPHY ; Map to physical address if NPR device ;JRK330:8 MOV R1,I.PRM+P1.1(R4) ; Move MSP to I/O packet ;JRK330:8 MOV R2,I.PRM+P1.2(R4) ; Move LSP to I/O packet ;JRK33078 MOV R4,R1 ; Restore pointer to I/O packet ;JRK33038 ;JRK3302&8 CLC ; Indicate success ;JRK3308 ;JRK330J4850$: MOV (SP)+,R0 ; Restore CED address ;JRK3308 RETURN ;JRK33028 ;JRK330m8 ;JRK330VG8 .SBTTL + DFRIOC - I/O completion routine for deferred extent ;JRK330Y8; ;JRK330U8; DFRIOC - Routine to complete processing after a deferred extent has been ;JRK3300"8; written to disk ;JRK3308; ;JRK3308; Inputs: ;JRK330p)8; R3 - I/O packet address ;JRK330 8; ;JRK3308DFRIOC: ;JRK33098 MOV I.UCB(R3),R5 ; Get UCB address of device ;JRK330d78 MOV I.AADA(R3),R0 ; Point to affected CED ;JRK330JE8 MOVB I.PRM+P3(R3),-(SP) ; Get the error status from driver ;JRK330n48 TSTB (SP)+ ; See if t00£ØfšfÝb`TADATADATADATADATADATAhere was an error ;JRK330(8 BPL 10$ ; If PL, no error ;JRK330A8 BISB #ES.ERR,E.STAT(R0) ; Set the error status in CED ;JRK330 8 ;JRK330 Q810$: MESAG$ DFRCOM,29.,,<,> ;JRK33038 ;JRK330328 CALL CHEDEP ; Delete the I/O packet ;JRK3308 ;JRK330 68 CALL MAPPAR ; Map to the cache partition ;JRK330D8 BICB #ES.WIP,E.STAT(R0) ; Clear the write-in-progress bit ;JRK330G8 BICB #ES.WDF,E.STAT(R0) ; Indicate extent no longer deferred ;JRK3300>8 DECB E.PCNT(R0) ; Untie the extent for elimination ;JRK3308 ;JRK330r@8 CALL FRECED ; Delete the CED if not tied down still ;JRK3308 ;JRK330+8 RETURN ;JRK330R8 ;JRK330 8 ;JRK330L78 .SBTTL + BACKUP I/O PC FOR DEFERRED WRITES ;JRK330 8; ;JRK330S8; $BCKUP - Routine to undo the system operations involved in the creation ;JRK330iL8; of an I/O packet on the way to the driver and backup the user PC ;JRK3308; ;JRK3308; Inputs: ;JRK330 =8; R1 - I/O packet to be backed up and eliminated ;JRK330L8; ;JRK3308; Outputs: ;JRK330+8; R5 - UCB address of device ;JRK330 8; ;JRK3308$BCKUP:: ;JRK330:8 MESAG$ IOBCKP,36.,,<> ;JRK3308 ;JRK3303=8 MOV I.UCB(R1),R5 ; Get the associated UCB address ;JRK330 8 ;JRK33038 .IF DF S$$HDW ;JRK330a8 ;JRK330a38 MOV R1,R3 ; Get pointer to I/O packet ;JRK330n>8 CALL $SHFND ; Find the ML node for packet, if any ;JRK33048 BCS 10$ ; If CS, none to be eliminated ;JRK330<8 CALL $DLNK ; Get rid of ML node for this packet ;JRK3308 ;JRK330R8 .ENDC ;JRK3308 ;JRK330C8810$: MOV R1,R3 ; Restore I/O packet address ;JRK330>8 MOV I.TCB(R1),R0 ; Get TCB address of issuing task ;JRK33058 DECB T.IOC(R0) ; Decrement the I/O count ;JRK330 C8 BIC #T2.WFR,T.ST2(R0) ; Clear WFR state if EFN specified ;JRK330a98 CMP R0,$TKTCB ; Is issuing task still mapped ;JRK330k08 BNE 20$ ; If NE, no, go out to HDR ;JRK330>8 SUB #2,$UMPC ; Back up the user PC on Kernel stack ;JRK330<8 MFPI SP ; Must also back up user SP to get back ;JRK330=8 SUB #2,(SP) ; the pointer to the DPB or first ;JRK330p+8 MTPI SP ; value if $S form ;JRK330;?8 CALL $TKWSE ; Make current task wait for sig event ;JRK330c!8 BR 40$ ; Continue ;JRK330B8 ;JRK330;?820$: MOV T.PCB(R0),R2 ; Get task region pcb address ;JRK330s8 ;JRK330a8 .IF DF X$$HDR ;JRK330 8 ;JRK330 @8 MOV P.HDR(R2),-(SP) ; Get virtual address of header ;JRK330.8 BNE 30$ ; If NE, resident header ;JRK3308 ;JRK330:8 MOV P.REL(R2),KISAR6 ; Map to external header ;JRK330=8 MOV #140000,(SP) ; Set virtual address of header ;JRK330E=830$: MOV (SP)+,R2 ; Get virtual address of header ;JRK330 8 ;JRK330B!8 .IFF ; DF X$$HDR ;JRK330T8 ;JRK330s68 MOV P.HDR(R2),R2 ; Get address of header ;JRK3308 ;JRK330 "8 .ENDC ; DF X$$HDR ;JRK3308 ;JRK330 ;8 SUB #2,(R2) ; Point back to DPB or first value ;JRK330 <8 MOV H.GARD(R2),R2 ; Point to the HDR Guard word ;JRK33028 SUB #2,-16(R2) ; Back up the user PC ;JRK33088 CALL $SETCR ; Reschedule task to try again ;JRK3308 ;JRK330;8840$: TSTB I.EFN(R3) ; Virtual I/O function? ;JRK330"8 BPL 60$ ; If PL no ;JRK33068 BICB #200,I.EFN(R3) ; Clear virtual flag ;JRK330;8 BIT #1,I.LN2(R3) ; Header locked down for acp? ;JRK330D#8 BNE 50$ ; If NE, no ;JRK330JA8 MOV I.TCB(R3),R0 ; I/O packet is connected to the TCB ;JRK330 >8 MOV T.ATT(R0),R0 ; The TCB is connected to the ADB ;JRK330-8 SUB #A.TCBL,R0 ; Find the foot ;JRK3303.8 CALL $DECIO ; Unlock the header ;JRK330&850$: ; Reference label ;JRK33088 CALL $DCWIO ; Decrement window I/O if any, ;JRK330&8 ; unlock block locks. ;JRK330D00£àf¡f£§f´cÚµcÛ¶c�·c›’860$: MOVB I.EFN(R3),R0 ; Get EFN number specified, if any ;JRK330A8 MOV I.TCB(R3),R5 ; Get TCB address for EFN conversion ;JRK330 =8 CALL $CEFI ; Set the bit and clear group globals ;JRK330 A8; CALL $ELGBL ; Unlock the group globals if necessary ;JRK330B8 ;JRK330C58 CALL $DECAL ; Deallocate all I/O counts ;JRK330U58 CALL CHEDEP ; Deallocate the I/O packet ;JRK330l8 RETURN ;JRK330 8 ;JRK330/8 .ENDC ;CHEDFR ;JRK330c9 c+: .SBTTL STRUCTURE ALLOCATION/DEALLOCATION %; .SBTTL + CRECED - Create CED block3<; =; Passed:) >; NothingB?;e @; Returned:eA; R0 -> Newly allocated CED B; CCRECED: MOV R1,-(SP)D)E MOV #E.LGTH,R1 ; Set size to allocatee3F CALL .ALOCB ; Call internal allocation routineKGH MOV (SP)+,R1 I RETURNtJ%K .SBTTL + DELCED - Delete CED block L;a M; Passed:/#N; R0 -> The CED to be deallocated O;3 P; Returned: Q; All registers preserved R;JSDELCED: MOV R1,-(SP)T+U MOV #E.LGTH,R1 ; Set size to deallocateR5V CALL .DEACB ; Call internal deallocation routinenWX MOV (SP)+,R1d Y RETURN-Z l@[ .SBTTL + CREATT - Create a packet attachment descriptor (PAD)\;; ]; Passed:a ^; NothingC_;A `; Returns:a; R0 -> Newly allocated PADb;M$bCREATT::MOV R1,-(SP) ;JRK330d ;**-1 *e MOV #A.LGTH,R1 ;Set length to allocate#f CALL .ALOCB ;Request the spaceegh MOV (SP)+,R1i i RETURNrj5k .SBTTL + .DEPAD - Deallocate attachment descriptor;l;s m; Passed::n; R3 -> PAD to deallocate (must already be disconnected)o;p; Returned:q; All registers preserved r;A s.DEPAD::t MOV R0, -(SP)u MOV R1, -(SP)v w MOV R3, R0a4x MOV #A.LGTH, R1 ;Length of attachment descriptor#y CALL .DEACB ;Release the block-z{ MOV (SP)+, R1| MOV (SP)+, R0 } RETURNG~ $ .SBTTL MEMORY ALLOCATION ROUTINES,€ .SBTTL + .ALOCB - Internal hook to $ALOCB�;R ‚; Passed:ƒ; R1 := Requested size„;t …; Returned:p6†; R1 := Size rounded up according to blocking factor+‡; If CC then successfully allocated blockr ˆ; R0 -> Newly allocated block"‰; If CS then no memory availableŠ;M>‹; This routine will allocate memory from the cache partition?Œ; using the system memory allocation routine $ALOCB in CORAL.B�; Entry point $ALOC1 is called with the internal header address.Ž;L�.ALOCB: MOV R2,-(SP)�=‘ MOV #APRD.BASE+H.PAVL,R0 ; R0 -> Internal pool list header:1’ CALL $ALOC1 ; Attempt to allocate the memoryi“” MOV (SP)+,R2n • RETURNn–,— .SBTTL + .DEACB - Internal hook to $DEACB˜; ™; Passed:w!š; R0 -> Block to be deallocatedn›; R1 := Length of blockœ;s �; Returned:lž; All registers preservedpŸ;i? ; This routine will deallocate memory in the cache partition,LA¡; or into system pool depending upon the address. This enabless>¢; the cacher to allocate space from primary pool in cases of+£; extreme emergency (not currently used). ¤;1¥.DEACB: MOV R0,-(SP)¦ MOV R2,-(SP)§ MOV R3,-(SP)¨2© CMP R0,#APR5.BASE ; System pool or cache pool? ª BLO 10$ ; System pool if LO«=¬ MOV #APRD.BASE+H.PAVL,R3 ; R3 -> Internal pool list headere3­ CALL $DEAC1 ; Attempt to deallocate the memorys® BR 20$ ; Go to common exitn¯10$:/° CALL $DEACB ; Deallocate it to system pool ±20$:² MOV (SP)+,R3n³ MOV (SP)+,R2a´ MOV (SP)+,R0s µ RETURNr¶/¶ .SBTTL EBLXIO -- BLXIO Extension ;EDP033r¶; ;EDP033J¶; This routine performs the same operation as $BLXIO, except it ;EDP033M¶; extends the amount that may be transferred from under 4K bytes to ;EDP033G¶; 65535 bytes. Forks are performed between calls to $BLXIO. ;EDP033A¶; ;EDP033¶; ;EDP033¶; Input: ;EDP033¶; ;EDP0333¶; R0 number of bytes to be transferred ;EDP033V/¶; R1 starting APR bias for source ;EDP033G¶; R2 starting offset for source (must be less than 100 octal) ;EDP033 3¶; R3 startin00£èfšfÝb`TADATADATADATADATADATAg APR bias for destination ;EDP033iL¶; R4 starting offset for destination (must be less than 100 octal) ;EDP033E¶; On a multiprocessor system, we have the executive lock. ;EDP033e¶; ;EDP033¶; ;EDP033¶; Output: ;EDP033;¶; ;EDP033 ¶; R0-R4 altered ;EDP033¶; R5 preserved ;EDP033¶; ;EDP033?¶ .IFDF M$$PRO ; Is multiprocessor support required? ;EDP033n8¶FRKSIZ = 14 ; Yes, fork block is six words. ;EDP033¶ .IFF ;EDP033s8¶FRKSIZ = 12 ; No, fork block is five words. ;EDP033¶ .ENDC ;EDP0335¶ .IFDF K$$DAS ; Are we using data space? ;EDP033 >¶REGSIZ = 4 ; The cache region APRs take two words. ;EDP033¶ .IFF ;EDP033u=¶REGSIZ = 2 ; The cache region APR takes one word. ;EDP033 ¶ .ENDC ;EDP033¶EBLXIO:: ;EDP033?¶ .IFDF M$$PRO ; Is multiprocessor support required? ;EDP033uA¶ ULOCK$ $EXECL,WAIT ; Yes, release the executive lock. ;EDP033D¶ .ENDC ;EDP033+¶ MOV R5,-(SP) ; Save register. ;EDP033e/¶ CLR R5 ; Flag no block allocated. ;EDP033F¶ ;EDP033u8¶ MOV R0,-(SP) ; Save count of bytes to move. ;EDP033@¶ MOV #MAXTR,R0 ; Get maximum size of single transfer. ;EDP033<¶ SUB R0,(SP) ; Subtract bytes to be transferred. ;EDP0336¶ BCC 210$ ; There are enough; do transfer. ;EDP033@¶ ADD (SP),R0 ; The maximum is too much, adjust size. ;EDP0331¶ CLR (SP) ; Zero bytes will be left. ;EDP033 ¶210$: ;EDP033+¶ CALL $BLXIO ; Transfer data. ;EDP033 '¶ TST (SP) ; Are we done? ;EDP033o&¶ BEQ 255$ ; Yes, leave. ;EDP033¶ ;EDP033v:¶ MOV KISAR6,-(SP) ; Save APR for cache region. ;EDP0335¶ .IFDF K$$DAS ; Are we using data space? ;EDP033)@¶ MOV KISAR5,-(SP) ; Save second APR for cache region. ;EDP033¶ .ENDC ;EDP033+¶ MOV R4,-(SP) ; Save register. ;EDP033 +¶ MOV R3,-(SP) ; Save register. ;EDP033 +¶ MOV R2,-(SP) ; Save register. ;EDP033 +¶ MOV R1,-(SP) ; Save register. ;EDP033 F¶ MOV #$STACK-22+FRKSIZ,R1 ; Get location where we want SP to ;EDP033/¶ ; be, plus space for fork block. ;EDP0338¶ SUB SP,R1 ; Figure size of block needed for ;EDP0332¶ ; for fork block plus everything on ;EDP0332¶ ; the stack below the task context. ;EDP033?¶ .IFDF M$$PRO ; Is multiprocessor support required? ;EDP033S?¶ LOCK$ $EXECL,WAIT ; Yes, obtain the executive lock. ;EDP033P¶ .ENDC ;EDP0335¶ CALL $ALOCB ; Get space for fork block. ;EDP033t0¶ BCC 215$ ; There is space; use it. ;EDP033?¶ .IFDF M$$PRO ; Is multiprocessor support required? ;EDP033 A¶ ULOCK$ $EXECL,WAIT ; Yes, release the executive lock. ;EDP033f¶ .ENDC ;EDP033.¶ MOV (SP)+,R1 ; Restore register. ;EDP033.¶ MOV (SP)+,R2 ; Restore register. ;EDP033.¶ MOV (SP)+,R3 ; Restore register. ;EDP033.¶ MOV (SP)+,R4 ; Restore register. ;EDP0335¶ .IFDF K$$DAS ; Are we using data space? ;EDP033<¶ CMP (SP)+,(SP)+ ; We don't need the saved APRs. ;EDP033¶ .IFF ;EDP033 6¶ TST (SP)+ ; We don't need the saved APR. ;EDP033¶ .ENDC ;EDP0330¶ BR 240$ ; Go do the next transfer. ;EDP033¶215$: ;EDP033)¶ MOV R0,R4 ; Copy pointer. ;EDP033o3¶217$: ; Copy stack to fork block and ;EDP033g/¶ ; adjust R4 for input to $QFORK. ;EDP033s<¶ MOV (SP)+,(R4)+ ; Copy stack word to fork block. ;EDP0336¶ CMP SP,#$STACK-22 ; Is stack copied yet? ;EDP033)¶ BNE 217$ ; No, keep going. ;EDP033a?¶ .IFDF M$$PRO ; Is multiprocessor support required? ;EDP033 6¶ CLR (R4)+ ; We can run on any processor. ;EDP033¶ .ENDC ;EDP033A¶ MOV #237$,2(R4) ; Record PC to be restored by system. ;EDP0334>¶ MOV R4,4(R4) ; Record R5 to be restored by system. ;EDP033>¶ MOV R0,6(R4) ; Record R4 to be restored by system. ;EDP033D¶ MOV KINAR5,10(R4) ; Record APR to be restored by system. ;EDP033%¶ BR 230$ ; Go do fork. ;EDP033 ¶ ;EDP033E7¶220$: ; Come back after 00£ðf¡f£§f´cÚµcÛ¶c�·c›’another transfer. ;EDP033 /¶ TST R5 ; Do we have a fork block? ;EDP033C5¶ BEQ 240$ ; No, go do the next transfer. ;EDP033.8¶ MOV 6(R5),R0 ; Point to beginning of block. ;EDP033-¶ MOV R1,(R0)+ ; Record register. ;EDP033 -¶ MOV R2,(R0)+ ; Record register. ;EDP033-¶ MOV R3,(R0)+ ; Record register. ;EDP033s-¶ MOV R4,(R0)+ ; Record register. ;EDP033AB¶ MOV (SP)+,REGSIZ(R0) ; Record remaining length (it goes ;EDP033/¶ ; above the saved APR or APRs). ;EDP033e4¶ MOV R5,R4 ; Pass fork block to $QFORK. ;EDP033?¶ .IFDF M$$PRO ; Is multiprocessor support required? ;EDP033 ?¶ LOCK$ $EXECL,WAIT ; Yes, obtain the executive lock. ;EDP033f¶ .ENDC ;EDP033¶230$: ;EDP0334¶ CLR (R4) ; We'll be last in the queue. ;EDP033#¶ JMP $QFORK ; Fork. ;EDP033i9¶237$: ; This label is where the system will ;EDP033P¶ ; return to. ;EDP033?¶ .IFDF M$$PRO ; Is multiprocessor support required? ;EDP033dA¶ ULOCK$ $EXECL,WAIT ; Yes, release the executive lock. ;EDP033K¶ .ENDC ;EDP0335¶ MOV R4,R0 ; Switch to another register. ;EDP033L.¶ MOV (R0)+,R1 ; Restore register. ;EDP033.¶ MOV (R0)+,R2 ; Restore register. ;EDP033.¶ MOV (R0)+,R3 ; Restore register. ;EDP033.¶ MOV (R0)+,R4 ; Restore register. ;EDP0335¶ .IFDF K$$DAS ; Are we using data space? ;EDP033t9¶ MOV (R0)+,KISAR5 ; Restore cache region APR. ;EDP033M¶ .ENDC ;EDP0339¶ MOV (R0)+,KISAR6 ; Restore cache region APR. ;EDP033 8¶ MOV (R0)+,-(SP) ; Restore length remaining. ;EDP033¶ ;EDP033;,¶240$: ; Do another transfer. ;EDP033@¶ MOV #MAXTR,R0 ; Get maximum size of single transfer. ;EDP033:¶ SUB R0,R4 ; Decrease pointer by maximum size. ;EDP033;¶ ADD #MAXTRB,R3 ; Increase APR by maximum size. ;EDP033:¶ SUB R0,R2 ; Decrease pointer by maximum size. ;EDP033;¶ ADD #MAXTRB,R1 ; Increase APR by maximum size. ;EDP033C<¶ SUB R0,(SP) ; Subtract bytes to be transferred. ;EDP0336¶ BCC 250$ ; There are enough; do transfer. ;EDP033@¶ ADD (SP),R0 ; The maximum is too much, adjust size. ;EDP0331¶ CLR (SP) ; Zero bytes will be left. ;EDP033 ¶250$: ;EDP033+¶ CALL $BLXIO ; Transfer data. ;EDP033m'¶ TST (SP) ; Are we done? ;EDP033;9¶ BNE 220$ ; No, do another fork and transfer. ;EDP033D¶ ;EDP033x¶255$: ;EDP033<¶ TST (SP)+ ; Get count (now zero) off the stack. ;EDP033?¶ .IFDF M$$PRO ; Is multiprocessor support required? ;EDP0330?¶ LOCK$ $EXECL,WAIT ; Yes, obtain the executive lock. ;EDP033T¶ .ENDC ;EDP0334¶ TST R5 ; Did we allocate a fork block? ;EDP033/¶ BEQ 290$ ; No, skip deallocation. ;EDP033L=¶ MOV 6(R5),R0 ; Get beginning of block for $DEACB. ;EDP033d)¶ MOV R5,R4 ; Copy pointer. ;EDP033o4¶ ADD #12,R5 ; Point after end of block. ;EDP033<¶ SUB R0,R5 ; Compute length of block for $DEACB. ;EDP033(¶ MOV R5,R1 ; Copy length. ;EDP033E¶ SUB #12+REGSIZ+FRKSIZ,R5 ; Subtract size of fork block and ;EDP033T-¶ ; values not needed on stack. ;EDP033)¶ ASR R5 ; Convert to words. ;EDP033e?¶ .IFDF M$$PRO ; Is multiprocessor support required? ;EDP033c4¶ TST -(R4) ; Move past Unibus run mask. ;EDP033¶ .ENDC ;EDP033¶260$: ;EDP033=¶ MOV -(R4),-(SP) ; Copy saved value back to stack. ;EDP033 1¶ SOB R5,260$ ; Continue until done. ;EDP033f¶ ;EDP033+¶ CALL $DEACB ; Release space. ;EDP033B¶ ;EDP033 ¶290$: ;EDP033.¶ MOV (SP)+,R5 ; Restore register. ;EDP033¶ ;EDP033A¶ RETURN ;EDP033 ¶ ;EDP033M¶ .PAGE ;JRK330¶ .IFDF CHEDBG ;JRK3307¶ .SBTTL *** DEBUG *** Module contains data ;JRK330N¶ ;JRK330G¶DFRMSG: .ASCIZ <15><12>" - Deferred extent written to disk" ;JRK330aP¶IOBCKP: .ASCIZ <15><12>" - I/O Operation reissued via user PC backup" ;JRK330H¶CEDKIL: .ASCIZ <15><12>" - CED eliminated from Cache Region" ;JRK330@¶CEDDFR: .ASCIZ <15><00£øfÜùfÝúfÞûfßüfàýfáþfDATA12>" - CED marked for deletion" ;JRK330I¶DFRCOM: .ASCIZ <15><12>"Deferred extent I/O write completion" ;JRK3303¶ ;JRK330;!¶ .ENDC ;DF CHEDBG ;JRK3303· .ENDC ; D$$CHEE¸ .ENDodule contains data ;JRK330N¶ ;JRK330G¶DFRMSG: .ASCIZ <15><12>" - Deferred extent written to disk" ;JRK330aP¶IOBCKP: .ASCIZ <15><12>" - I/O Operation reissued via user PC backup" ;JRK330H¶CEDKIL: .ASCIZ <15><12>" - CED eliminated from Cache Region" ;JRK330@¶CEDDFR: .ASCIZ <15><&KADD2,LI:[45,34]KADD2/-SP=[45,10]KADD2&KRATE,LI:[45,34]KRATE/-SP=[45,10]KRATE:[1,54]KCOM/-HD/PI/MM,[1,54]KCOM/-SP,[1,54]KCOM=[45,24]KCOM[1,54]RSX11M.STB/SSC[1,1]EXELIB/LB/MSTACK=0#PAR=KCOM:0:20000/.ENDC .LIST;AD11-K A/D CONVERTER SUPPORTCA$$M11=0 ;AM11-K SUPPORT N$DR11=1 ;DR11-K SUPPORTR N$AA11=1 ;AA11-K D/A CONVERTERS)N$$SWB=5 ;NUMBER OF SWEEP CONTROL BLOCKS ; C; MACRO TO DEFINE JUMP TO SUBROUTINE WITH RETURN TO CALLER'S CALLERS;B .MACRO CALLR ARGK JMP ARG .ENDM;P3; MACROS TO REFERENCE PSW FOR NON-LSI-11 PROCESSORS$;F .IF NDF L$$SI1E .MA .ENABLE QUIET .IF EQ "MCR" SET /DCL=TI: .DISABLE QUIETE2 .IF NE "[USER]" SET DEFAULT [USER]/NAMED .ENABLE QUIET TYPE HELLO.TXT$JOB HIYA [200/1] $MACRO HIYA $LINK HIYA $RUN HIYA$DATA WILLIE NELSON$EOD,$! COMMENT: HIYA ASSEMBLED, LINKED, AND RUN $RUN HIYABASIL WOLVERTON/$! COMMENT: HIYA RUN AGAIN WITH DIFFERENT DATA$EOJ DELETE DOCTOR.FEL;* DELETE NEW.FIL;* DELETE *.OBJ;* DELETE *.TSK;* DELETE NEWHI.MAC;* .ENABLE SUBSTITUTION .IFNDF .GOTO MCRSYS .SETS STCLI .IF EQ "DCL" SET TERM MCR.MCRSYS: .TESTFILE CLOCK.MAC .IF EQ 1 .GOTO OKAY ;F ; You must have the file "CLOCK.MAC" in your directory before you canG ; use this procedure. There should be a copy of the file available in? ; the directory containing this file. See your system manager ; /.OKAY: .OPEN CLKPRE.MAC .DATA .ENABL LC ;D ; This procedure allows you to assemble and build a version of the G ; VT-52/VT100 clock display program "CLOCK" that suits your taste and < ; your system.  ; MG ; Before you continue with this procedure, be sure that your VT100 (if;H ; you have one) is set to VT52 compatability mode. If you have a VT52, ; you''re all set.h ;A ; "CLOCK" displays the time in large block numbers 10 charactersnH ; high. The character normally used to make up the numerals is a solidK ; block (the graphic-mode equivalent of "a"). On some terminals, however,iF ; this char00ág¥gûg´cÚµcÛ¶c�·c›’acter may not display as a solid block; or, you may prefer ; something else. ; .SETS TEMP "FORCHR = ''"B .SETS REGCHR "a"w; .ASK A Do you want to change the default display character  .IFF A .GOTO DEFCHR ;A ; Here is your selection. You can choose any character, but theLB ; lowercase characters translate to their graphic equivalents, as? ; shown below (the default is "a"; enter to preserve it).d ;# ;; abcdefghijklmnopqrstuvwxyz{|}`~f' ;F; abcdefghijklmnopqrstuvwxyz{|}`~Gt ;;GrB .ASKS[0:1] CHAR What symbol do you want as the display character? .IF EQ 0 .GOTO DEFCHRH .DATA 'TEMP''CHAR'H .GOTO POSTON .DEFCHR: .DATA 'TEMP''REGCHR' .POSTON: .DATA .DSABL LCG ;M ; The display is normally centered horizontally on the screen, near (but not. ; at) the top. You can change this position. ;E .ASK A Do you want to change the position of the clock on the screenr .IFF A .GOTO DEFPOS ;D .ASKS VPOS How many lines down from the top (Range 1-8, Default 3)?# .IF EQ 0 .DATA INITY = 3. ( .IF GT 0 .DATA INITY = 'VPOS'. ;E .ASKS HPOS How many lines in from the left (Range 1-35, Default 11)?$ .IF EQ 0 .DATA INITX = 11.( .IF GT 0 .DATA INITX = 'HPOS'. .GOTO SYSTEMo.DEFPOS: .DATA INITX = 11. .DATA INITY = 3.t.SYSTEM: ;M ; The following section includes or excludes some system-dependent functions  ; of the clock. ;@ .ASK OLDM Is your system an RSX-11M V3.2 (or older), or VAX/VMS .IFF OLDM .GOTO NEWSYS3.NOS .TITLE DUDRV - MSCP DRIVERb;r;o;n>; COPYRIGHT (c) 1985, 1987 BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;n>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;a ;eL ; THIS DEFINES THE SYMBOL NEEDED TO DO CONDITIOANL ASSEMBLY OF DISK CLASS D ; DRIVERS. IF THE SYMBOL IS DEFINED, THEN DISK CLASS IS SELECTED. ;t ;  ;0 ; MODIFIED BY: ; G. MARIGOWDA= ; GMG101 ADD SYMBOLS NEEDED FOR FORMATTING SUPPORT V1.1 ; ;'D$$DSK=0 ;ASSEMBLE DISK CLASS ITEMSC;0; FUNCTION LENGTHS FOR DISK SPECIFIC FUNCTIONS;I.RD.L = 20 ;# WORDS TO ALLOCATE FOR RD CMD.WR.L = 20 ;# WORDS TO ALLOCATE FOR WR CMD0RPL.L = 20 ;# WORDS TO ALLOCATE FOR RPL CMD/FMT.L = 20 ;#WORDS TO ALLOCATE FOR FMT CMDR;F'M.SWL = 100 ;SOFTWARE WRITE LOCKEDS SELECTED. ;t ;  ;0 ; MODIFIED BY: ; G. MARIGOWDA= ; GMG101 ADD SYM .TITLE MUDRV - TMSCP DRIVER/ .SBTTL TAPEPRE - TMSCP PREFIX FILE DEFINITIONSE;N;F;P6; COPYRIGHT (c) 1985 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;5<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;I"; LENGTHS OF TMSCP COMMAND PACKETS;E/RD.L = 14. ;# WORDS TO ALLOCATE FOR RD CMDN/WR.L = 14. ;# WORDS TO ALLOCATE FOR WR CMDE.WTM.L = 6. ;# WORDS TO ALLOCATE FOR WTM CMD.ERS.L = 6. ;# WORDS TO ALLOCATE FOR ERS CMD.ERG.L = 6. ;# WORDS TO ALLOCATE FOR ERG CMD/REP.L = 10. ;# WORDS TO ALLOCATE FOR REP CMDQ/SUC.L = 18. ;# WORDS TO ALLOCATE FOR SUC CMD.AVL.L = 6. ;# WORDS TO ALLOCATE FOR AVL CMD/ONL.L = 22. ;# WORDS TO ALLOCATE FOR ONL CMD T$$APE = 1 ;ASSEMBLE FOR TAPE; 4; BIT DEFINITIONS FOR UCB CHARACTERISTICS WORD U.CW2;A'M.PEOV=100000 ;TAPE PAST LOGICAL EOVO$M.AEOV=40000 ;TAPE AT LOGICAL EOVM.BOT=20000 ;TAPE IS AT BOT.M.1600=4000 ;UNIT IS 1600 BPI PHASE ENCODED$M.HWL=2000 ;HARDWARE WRITE-LOCKED M.RWD=1000 ;UNIT IS REWINDING&M.SER=400 ;SELECT ERROR HAS OCCURED#M.IWR=200 ;INHIBIT WRITE RETRIES #M.SWL=100 ;SOFTWARE WRITE-LOCKEDA2M.TMK=40 ;ENCOUNTERED TAPE MARK - FWD DIRECTION1M.EOT=20 ;LAST COMMAND ENCOUNTERED END OF TAPEM.6250=10 ;UNIT IS 6250 BPICM.DEFM = M.PEOV!M.EOT!M.HWL!M.SWL!M.1600!M.6250!M.SER ;DEFAULT MASK6USRBTS = M.IWR!M.SWL ;STATUS BITS CONTROLLED BY USER IS AT BOT.M.1600=4000 ;UNIT I00IgùfÝúfÞûfßüfàýfáþfDATA .TITLE DCRUN - Run the cache) .IF DF D$$CHE .IDENT /01.01/C;R8; Copyright (c) 1985 by DIGITAL EQUIPMENT CORPORATION.; All rights reserved.;V; Original author: ; John Gemignani ;T ; Modified by: ;V ; D. P. Rabahy 06-Mar-85 01.01:; Change CALLRs into straight CALLs followed by RETURNs;Q; This module contains the code which dequeues a cache packet and dispatches itO(; to the appropriate phase II routine.;, .PSECT DC$RUN,RO,IR . .SBTTL DCRUN - Start Phase II Cache Process;D ; Passed:."; Cache partition mapped in APR6;9-; R5 -> UCB of device to run the cache for.i;r ; Returned:;r>; This routine is used to start up a Phase II cache process.'; RETURNing to our caller will do theC< ; proper thing. Our caller is of no concern to us; we are@!; "the system" (or hope that we are) when we reach this point.";t<#; Module DCRUN is responsible for obtaining a unit of work=$; from the packet queue and, depending upon the dispositione:%; bits, either start the I/O, dispatch it to the driver,&; or terminate it in error.v';o=(; If an internal I/O has resulted in an error, then routinei<); DCIOC will have set CD.ERR in P3. These packets must be<*; handled differently for reads and writes. They are also,+; forwarded to the driver upon completion.,;h>-; All function codes must be dispatched, similar to the code .; which can be found in DCDSP./;o*0; This code will execute a fork prior to91; entering the Phase II selection and dispatching code. 92; This is performed to allow any outstanding fork-level53; processes to execute prior to or between Phase IIt94; runs. If the fork list is empty, then control passespH5; immediately to the dispatching code. Also, if there is insufficient66; system pool for a fork block to be allocated, then57; it will execute immediately as well. It is hopedh28; that should system pool be exhausted, that the69; completion of a cache-retained I/O packet (and its6:; subsuquent deallocation) may aid in relieving this;; situtation.w<;o =DCRUN::f8> BITB #CS.RUN, APRD.BASE+H.CSTS ; Is phase II running?? BNE FORK ; If NE, yeso@>A BITB #CS.REQ, APRD.BASE+H.CSTS ; Requested to run phase II?B BNE 3$ ; If NE, yese C RETURNcD3$:@E BISB #CS.RUN, APRD.BASE+H.CSTS ; Indicate phase II is runningF9GFORK: MOV #<6.*2>,R1 ;Attempt to allocate a fork blockt"H CALL $ALOCB ;From system pool0I BCS 10$ ;If CS, MAJOR PROBLEM: resume cacheJ; K; Context:$L; R0 -> Newly allocated pool blockM;i-N CLR (R0) ;URM=0; any processor can do itA*O ADD #14,R0 ;Advance past 6-word block3P MOV KINAR5,-(R0) ;Establish the mapping contextA6Q CLR -(R0) ;R4 is trash as far as we are concerned(R MOV R0,R4 ;Setup for call to $FORK14S CALL $FORK1 ;Queue the fork block and hibernateT; U; Context:V; R3 -> Fork block W; R5 -> UCB X;t,Y MOV R3,R0 ;Obtain base address of block(Z SUB #4,R0 ;(currently at PC offset)[)\ MOV #<6.*2>,R1 ;Setup fork block sizeo(] CALL $DEACB ;Free up the fork block^10$:_; `; Start Phase II Cache Processa;-+bNOFORK: CALL MAPPAR ; Map the partitionhc5d MOV #APRD.BASE+H.PKTQ,R0 ; Address of packet queueee6f10$: MOV (R0),R1 ; Get a packet - Assume I.LNK = 0"g BEQ 70$ ; If EQ, end of queueh-i TSTB I.PRM+P3(R1) ; Is this packet ready?bj BEQ 20$ ; Yes if EQk,l MOV R1,R0 ; Else try to get another onem BR 10$ ; from the queuen2o20$: MOV (R1),(R0) ; Remove this from the queue$p BNE 30$ ; Not last packet if NE9q MOV R0,APRD.BASE+H.PKTQ+2 ; Else update "last" pointerr30$:s;L t; Note: Bu; Packets with a driver error indicated are not terminated here.8v; Instead, they are passed to the appropriate phase II$w; routines for further processing.x;q/y MOV I.FCN(R1),R0 ;Get the I/O function coder*z BIC #BYPASS,R0 ;Remove the bypass bits{'| CMP R0,#IO.RVB ;Read virtual block? -} B00IgJgKg´cÚµcÛ¶c�·c›’EQ 80$ ;Yes if EQ; RVB and RLB are same)~! CMP R0,#IO.LOV ;Load overlay?3!€ BEQ 80$ ;Yes if EQ; dispatchV�(‚ CMP R0,#IO.WVB ;Write virtual block?.ƒ BEQ 100$ ;Yes if EQ; WVB and WLB are same„)… CMP R0,#IO.LDO ;Load d-space overlay?h!† BEQ 80$ ;Yes if EQ; dispatcht‡'ˆ CMP R0,#IO.RLB ;Read logical block?f!‰ BEQ 80$ ;Yes if EQ; dispatchFŠ(‹ CMP R0,#IO.WLB ;Write logical block?"Œ BEQ 100$ ;Yes if EQ; dispatch�� MESAG$ FCNERR,0� BPT ; Sanity check�F‘70$: BICB #CS.RUN, APRD.BASE+H.CSTS ; Indicate that we have quiesced*’ RETURN ; And return for exec to run“*”80$: CALL $DCRII ;Invoke read Phase II • RETURN –,—100$: CALL $DCWII ;Invoke write Phase II ˜ RETURNo™ sš .IF DF CHEDBG,› .SBTTL *** DEBUG *** Module contains data œ .ENABL LCH�FCNERR: .ASCIZ <15><12>"DCM (CRASH) -- Phase II Dispatching Error"<15>ž .EVENŸ .ENDC ; .IF DF CHEDEF ¡ .ENDC ; .IF DF D$$CHE¢ .ENDG$ FCNERR,0� BPT ; Sanity check .TITLE DCSTAT .IF DF D$$CHE .IDENT /01.00/A;Z6; Copyright (c) 1985 by DIGITAL EQUIPMENT CORPORATION.; All rights reserved.;H; Original author:; D. P. Rabahy 06-Mar-85 01.00;C .PSECT CODE, I, ROt . .SBTTL $USTAT - Update cache statistics block;, ; Passed:H"; SP+2 -> Offset to be incremented9; SP+4 -> Operation context (i.e. address in stat. block)D ; R5 -> UCBe;a ; Returned:R; All registers preserved ;I ; Action: ;s$USTAT::' MOV KISAR6, -(SP) ; Save APR6 mappingU/ MOV U.UCBX(R5), KISAR6 ; Map the UCB extension3 BEQ 10$ ; If EQ, there isn't one, skip incrementT9 MOV APR6.BASE+X.CSBA, KISAR6 ; Map the statistics buffer $ BEQ 10$ ; If EQ, there isn't one7 MOV R0, -(SP) ; Save a register while working with ito;L; Calculate the offset to be incremented. Don't forget about the stuff just; pushed onto the stack.;k MOV 6(SP), R0 ; Get the offset% ADD 10(SP), R0 ; Add in the contexti. ADD #1, (R0)+ ; Update the appropriate field ADC (R0) ; Double words MOV (SP)+, R010$: MOV (SP)+, KISAR6 RETURN  .ENDC ; IF DF D$$CHE  .ENDntT9 MOV APR6.BASE+X.CSBA, KISAR6 ; Map the statistics buffer $ BEQ 10$ ; If EQ, there isn't one7 MOV R0, -(SP) ; Save a register while working with ito;L; Calculate the offset to be incremented. Don't forget about the stuff just; pushed onto the stack.;k MOV 6(SP), R0 ; Get the offset% ADD 10(SP), R0 ; Add in the contexti. ADD #1, (R0)+ ; Update the appropriate field ADC (R0 .TITLE MMDRV .IDENT /09.01/  .ENABLE LCD;R7; Copyright (C) 1986 by Digital Equipment CorporationP; All Rights Reserved.;I> ; This Software is Furnished Under a License And May Be Used@ ; or Copied Only in Accordance With the Terms of Such License. ;I ;D ; RSX11M-PLUS RH11/RH70 TM02/TM03 Magnetic Tape Controller Driver;R; Version 09.01;;; Modified By:;@; CS005 -- Handle CALL for Controller Power Fail (C bit set).;N;I;C !.PAGEM"; Macro Library Calls#;N$G%.MCALL ABODF$, HWDDF$, PKTDF$, UCBDF$, UMDIO$, KRBDF$, SCBDF$, QIOSY$&' ABODF$ ;Define Abort Codesh&( HWDDF$ ;Define Hardware Registers&) PKTDF$ ;Define I/O Packet Offsets* UCBDF$ ;Define UCB Offsets 4+ UMDIO$ ;Define User Mode Diagnostic Definitions(, KRBDF$ ;Define KRB and KRB1 Offsets- SCBDF$ ;Define SCB Offsets,. QIOSY$ ;Define QIO Functions and Errors/0;o1; Equated SymbolsC2;s34US.ABO=1 ;Abort Request,%5US.SUP=2 ;Supress Error Recovery,06US.PWF=10 ;Power Fail Indication - in U.STS.07RETRY=12 ;Retry Count - 10. retries/request.48MINREC=14. ;Write Request - Minimum Record Size.+9REV=2 ;Reverse Bit - Space Operations.F5:NOISE=MINREC ;Anything Smaller than this is Noise ;.PAGEc#<; Register Definition and Offsets =;R>.?RHCS1 = +0 ;RH Control and Status Register@GO= 1 ;Go BitiAIE= 100 ;Interrupt Enablea#BRDY= 200 ;RH Controller Ready;00KgùfÝúfÞûfßüfàýfáþfDATACPSL= 2000 ;Port select; DDVA= 4000 ;Device AvailableETRE= 40000 ;Transfer Error+FCPE= 20000 ;RH Control Bus Parity Errorr$GSC= 100000 ;Special ConditionHI;I/O CommandsdJ'KFC.RWU= 103 ;Rewind Unload/Off-LinetLFC.RWD= 107 ;Rewind;MFC.RLS= 113 ;Release DriveNFC.ERS= 125 ;Erase 3" Gapf&OFC.WEF= 127 ;Write EOF (tape mark)PFC.SPF= 131 ;Space ForwardQFC.SPR= 133 ;Space ReverseRFC.WRT= 161 ;WriteSFC.RED= 171 ;Read TFC.REV= 177 ;Read Reverse UFC.CLR= 11 ;Drive ClearV%WRHWC = +2 ;RH Word Count Registerr&XRHBA = +4 ;RH Bus Address Register-YMTFC = +6 ;TM02/TM03 Frame Count RegisterCZ1[RHCS2 = +10 ;RH Control and Status Register 2w%\SCLR= 40 ;RH Controller ClearR*]DPE= 400 ;MASSBUS Data Parity Error ^MXF= 1000 ;Missed Transfer_PGE= 2000 ;Program Error$`NEM= 4000 ;Non-existent Memory#aNED= 10000 ;Non-existent Drive $bUPE= 20000 ;Unibus Parity Error"cWCE= 40000 ;Write Check ErrordDLT= 100000 ;Data Latee@fCS2ERR= DLT! WCE! UPE! NED! NEM! PGE! MXF! DPE ;RH TRE Errorsgh/iMTDS = +12 ;TM02/TM03 Drive Status Register jSLA= 1 ;Slave Attention"kBOT= 2 ;Beginning of Tape"lTM= 4 ;Tape Mark Detected%mPES= 40 ;Phase Encoded Status $nSSC= 100 ;Slave Status ChangeoDRY= 200 ;Drive ReadypEOT= 2000 ;End of TapeqWRL= 4000 ;Write LockrrMOL= 10000 ;Medium On Linei(sPIP= 20000 ;Positioning in Progress"tERR= 40000 ;Error - Compositeu(vMTER = +14 ;TM02/TM03 Error Register!wILF= 1 ;Illegal FunctionT!xILR= 2 ;Illegal RegisterR.yRMR= 4 ;Register Modification Refused)zCPR= 10 ;Control Bus Parity Error4{FMT= 20 ;Format Error "|DPR= 40 ;Data Parity Error-}INC= 100 ;Incorrectable Data - PE Mode /~VPE=INC ;Vertical Parity Error - NRZI ModeR'PEF= 200 ;Format Error - PE Mode $€LRC=PEF ;LRCC Error - NRZI Mode!�NSG= 400 ;Non-standard Gap "‚FCE= 1000 ;Frame Count Error*ƒCS= 2000 ;Correctable Skew - PE Mode*„ITM=CS ;Illegal Tape Mark - NRZI Mode(…NEF= 4000 ;Non-executable Function#†DTE= 10000 ;Drive Timing Error %‡OPI= 20000 ;Operation Incomplete2ˆUNS= 40000 ;Drive Unsafe4.‰COR= 100000 ;Correctable Data - PE Mode#ŠCRC=COR ;CRC Error - NRZI Mode;‹+ŒDAT= CS! PEF! INC ;Data Detection errors �Ž-�RHAS = +16 ;RH Attention Summary RegisterN4�MTCK = +20 ;TM02/TM03 CRC or Dead Track Register%‘MTDB = +22 ;TM02/TM03 Data Buffer0.’MTMR = +24 ;TM02/TM03 Maintenance Register-“MTDT = +26 ;TM02/TM03 Drive Type Registern'”MTSN = +30 ;TM02/TM03 Serial Numberi•/–MTTC = +32 ;TM02/TM03 Tape Control Registert—TC.1600= 2000 ;1600 BPI˜TC.800= 1000 ;800 BPIrA™TC.FMT= 300 ;Formatting Mode - PDP-11 normal assy/dissassyšTC.EVN= 10 ;Even Parityn›.PAGEFœ; The following define bits in the Tape Characteristic Word (U.CW2).�3žM.PEOV= 100000 ;Tape past Logical End of Volume21ŸM.AEOV= 40000 ;Tape at Logical End of Volumee M.BOT= 20000 ;Tape at BOTB¡M.1600= 4000 ;Tape Density Control; '1'=1600 BPI, '0'=800BPI&¢M.HWL= 2000 ;Hardware Write Lock$£M.RWD= 1000 ;Unit is Rewinding;¤M.SER= 400 ;Select Error - Tape Drive not accessible;>¥M.IXG= 200 ;Inhibit Write with Extended Interrecord Gap&¦M.SWL= 100 ;Software Write Lock;§M.EOF= 40 ;Tape Mark detected (FWD direction only).¨M.EOT= 20 ;Tape at EOT©M.EVN= 10 ;Even Parityª/«USRBTS=4310 ; Bits Controlled by the User - $¬ ; M.1600! M.IXG! M.SWL! M.EVN­>®NEWBTS=M.BOT!M.EOF!M.EOT ;Bits to be set before Call $IODON.¯°±; Local Data²;WC³; Controller Impure Data Tables (Indexed by Subcontroller Number)e´;eOµ; Diagnostic Functions use bit 15 of RTTBL as a Flag for Interrupt Servicing.¶)·RTTBL: .BLKW T$$M03 ;Error Retry Count=2¸SPTBL: .BLKW T$$M03 ;Current Space Count 00K ggKg´cÚµcÛ¶c�·c›’- 2's.,¹SPTOTL: .BLKW T$$M03 ;Total Blocks Spaced5ºSPRMNG: .BLKW T$$M03 ;Remaining Space Count - 2's.e-»FMTBL: .BLKW T$$M03 ;Format Code Save Area!/¼FCCDE: .BLKW T$$M03 ;Function Code Save Areae0½CMDCNT: .BLKW T$$M03 ;Command Count Save Area(¾BUFADR: .BLKW T$$M03 ;U.BUF Save Area1¿DONADR: .BLKW T$$M03 ;DONTBL Address Save Areat(ÀIOFCN: .BLKW T$$M03 ; > I/O Function.Á.PAGErÂ;+Ã; VALID I/O FUNCTION TABLEÄ;-Å.Æ .MACRO DFENT FUNC,INDX,RQSTCD,RTRADR,RTRYCDÇ!È .WORD FUNC ;I/O Function Code +É .BYTE INDX ;I/O Handling (Tables) Index )Ê .BYTE RQSTCD ;Device I/O Request CodeM*Ë .WORD RTRADR ;Tape Repositioned Return4Ì .WORD RTRYCD ;Device Error Recovery Request CodeÍ .ENDM ;DFENT3ÎÏ?ÐLGFCN: DFENT IO.RLB,FREAD,FC.RED,RTYCMD,FC.SPR ;Read ForwardO2Ñ DFENT IO.WLB,FWRTE,FC.WRT,RTYCMD,FC.ERS ;Write9Ò DFENT IO.RLV,FRREV,FC.REV,RTYCMD,FC.SPF ;Read ReverseA<Ó DFENT IO.EOF,FWEOF,FC.WEF,RTYCMD,FC.ERS ;Write Tape Mark9Ô DFENT IO.ERS,FERSE,FC.ERS, 0, 0 ;Erase 3" Gap3Õ DFENT IO.RWD,FRWND,FC.RWD, 0, 0 ;RewindECÖ DFENT IO.RWU,FRWDU,FC.RWU, 0, 0 ;Rewind Unload/Off-Linee9× DFENT IO.SPB,FSPCR,FC.SPF,SPCONT,FC.SPR ;Space Blockso8Ø DFENT IO.SPF,FSPCF,FC.SPF,SPCONT,FC.SPR ;Space Files2Ù DFENT IO.STC,FSETC, 0, 0, 0 ;Set Char5Ú DFENT IO.SEC,FSENC, 0, 0, 0 ;Sense CharR=ÛSMOU: DFENT IO.SMO,FSMOU, 0, 0, 0 ;Mount/Set Char, ÜENDFCN=.ÝÞLNGHT=.-SMOUß.PAGEà; Function Code Index Table,á; â!ãFREAD = 0 ;Read Logical BlockN"äFWRTE = 2 ;Write Logical Block)åFRREV = 4 ;Read Logical Block ReverseRæFWEOF = 6 ;Write Tape MarkçFERSE = 10 ;Erase 3" GapCèFRWND = 12 ;Rewind%éFRWDU = 14 ;Rewind Unload/Off-lineRêFSPCR = 16 ;Space BlocksTëFSPCF = 20 ;Space Files'ìFSETC = 22 ;Set Tape Characteristics,)íFSENC = 24 ;Sense Tape CharacteristicsO,îFSMOU = 26 ;Set and Mount Characteristics ïFRTRY = 30 ;Retry in Progress"ðFSPRR = 22 ;Space Block Reverse!ñFSPFR = 24 ;Space File Reverseiòó&ô; Pre-initiation Processing Routinesõ;Eö÷PRETBL: .WORD PRERED ;ReadRø .WORD PREWRT ;Writepù .WORD PREREV ;Read Reverse!ú .WORD PREEOF ;Write Tape MarkDû .WORD PREERS ;Erase 3" Gapü .WORD PRECOM ;Rewind(ý .WORD PRECOM ;Rewind Unload/Off-lineþ .WORD PRESPC ;Space Blocksÿ .WORD PRESPC ;Space Filesr% .WORD PRESTC ;Set Characteristicsu' .WORD PRESEC ;Sense Characteristicsi/ .WORD PRESMO ;Mount and Set Characteristics; Succesful Completion Table; %DONTBL: .WORD REDDON ;Read Forward  .WORD WRTDON ;Write Forward  .WORD REVDON ;Read Reverse!  .WORD EOFDON ;Write Tape MarkP  .WORD EXTNST ;Erase 3" Gap  .WORD RWDDON ;Rewind( .WORD RWDDON ;Rewind Unload/Off-line% .WORD SPFEXT ;Space Block ForwardP$ .WORD SPFEXT ;Space File Forward% .WORD SPFEXT ;Space Block Reversec$ .WORD SPFEXT ;Space File Reverse9 .WORD SMODON ;IO.SMO Rewind Completion (TM03 problem)t* .WORD FATAL ;Error Recovery Completion.PAGE!; Mask Table - Retriable Errorsw; DAT= CS! PEF! INCCERRMSK: .WORD COR! DTE! DAT! FCE! FMT! CPR ;Read Forwarda; .WORD COR! DTE! DAT! FCE! FMT! CPR! NSG! DPR ;WriteeB .WORD COR! DTE! DAT! FCE! FMT! CPR! OPI ;Read Reverse2 .WORD COR! DAT! CPR! NSG ;Write TMK  .WORD 0 ;Erase 3" Gap' .WORD FMT! NEF ;RewindR3 .WORD FMT! NEF ;Rewind Unl/OfflineM;  .WORD FCE! OPI ;Space FWD BlocksP:! .WORD FCE! OPI ;Space FWD Files:" .WORD FCE! OPI ;Space REV Blocks:# .WORD FCE! OPI ;Space REV Files$ .WORD 0 ;No FunctionR% .WORD 0 ;Retry &'4(; Retry Table; > Error Recovery RETRY Entry Points); %*RTYTBL: .WORD REDRTY ;Read Forward"+ .WORD WRTRTY ;Write , .WORD REVRTY ;Read Reverse!- .WORD WRTRTY ;Write Tape Markf&. .WORD FATAL00K(gùfÝúfÞûfßüfàýfáþfDATA ;Erase - Not Retriable/ .WORD RWDRTY ;Rewind(0 .WORD RWDRTY ;Rewind Unload/Off-line"1 .WORD SPRRTY ;Space FWD Blocks!2 .WORD SPFRTY ;Space FWD FilesE"3 .WORD SPRRTY ;Space REV Blocks!4 .WORD SPFRTY ;Space REV Files;5 .WORD FATAL ;IO.SMO Rewind not retriable (TM03 problem)=6 .WORD FATAL ;Error during Error Recovery - Not Retriable. 78D9; Error Check Table; > Specific Function, ERROR CHECK Entry Points:; ;%<CHKTBL: .WORD REDERR ;Read Forwarde= .WORD COMRTY ;WriteE> .WORD REVERR ;Read Reverse!? .WORD COMRTY ;Write Tape Marke%@ .WORD FATAL ;Erase 3" Gap - Fatal;A .WORD RWDRTY ;Rewind(B .WORD RWDRTY ;Rewind Unload/Off-line"C .WORD SPFEXT ;Space FWD Blocks!D .WORD SPFEXT ;Space FWD FilesL"E .WORD SPRERR ;Space REV Blocks!F .WORD SPRERR ;Space REV Filesd5G .WORD FATAL ;IO.SMO Rewind - Fatal (TM03 problem)o*H .WORD RTYCON ;Retry Frame Count ErrorsI.PAGE J; Driver Dispatch Table K; L4M DDT$ MM,T$$M03 ;Create the Driver Dispatch Table.NO;+CP; **-MMINI-RH11/RH70 TM02/TM03 Magnetic Tape Controller InitiatoraQ; DR; This Routine is entered from the Queue I/O directive when an I/OHS; Request is queued and at the end of a previous I/O operation to pro-GT; pagate the execution of the driver. If the specified Controller is FU; not busy, then an attempt is made to dequeue the next I/O request.HV; Else a return to the caller is executed. If the dequeue attempt isJW; successful, then the next I/O operation is initiated. A return to the?X; caller is then executed. If this unit is currently doing aa?Y; rewind any requests for it are rejected by the 'Acceptance'w<Z; routine. These requests will be done when the rewind is [; complete\;r]; ^; Inputs:e_;i<`; R5=Address of the UCB of the Controller to be Initiated.a;h b; Outputs:c;dAd; If the specified controller is not busy and an I/O request isrEe; waiting to be processed, then the request is dequeued and the I/O f; operation is initiated.Ag;-h7iMMINI: GTPKT$ MM,T$$M03 ;Get an I/O packet to processnjkl;(m; The Following Arguments Are Returnedn;to; R1 > I/O request packet.2p; R2 = Physical Unit Number of requested TM02/3.q; R3 = RH Controller Index.ur; R4 > Status Control Block.s; R5 > Tape Drive UCB.t;nFu; RH11/RH70 TM02/TM03 Magnetic Tape Function Independent I/O Requestv; Packet Format:w;t$x; WD. 00 -- I/O queue thread word.2y; WD. 01 -- Request priority, event flag number.7z; WD. 02 -- Address of the TCB of the requestor task.t?{; WD. 03 -- Pointer to second LUN word in requestor task headeE|; WD. 04 -- Contents of the first LUN word in requestor task header D}; WD. 05 -- I/O function code (IO.RLB/IO.RWD/IO.SPB/IO.SPF/IO.EOF)2~; WD. 06 -- Virtual address of I/O status block.2; WD. 07 -- Relocation bias of I/O status block.>€; WD. 10 -- I/O status block address (Displacement + 140000)5�; WD. 11 -- Virtual address of AST service routine.i‚;vƒ0„10$: CALL $RQSUB ;Request the Subcontroller.!… MOV U.KRB1(R5),R2 ;R2 > KRB1. 3† MOVB K1.CON(R2),R3 ;R3 - Formatter Unit Number,%‡ ASL R3 ; Convert to Word Index.o&ˆ MOV S.PKT(R4),R1 ;R1 > I/O Packet.1‰ MOV #LGFCN,R2 ;R2 > Valid I/O Function Table.I-Š MOV I.FCN(R1),R0 ;R0 - QIO Function Code.a2‹ BICB #US.SUP,U.STS(R5) ;Error Recovery allowed.,Œ CLRB RTTBL+1(R3) ;Clear Diagnostic Flag.)� BITB #IQ.UMD,R0 ;Diagnostic Function? Ž BEQ 20$ ;IF EQ, No.0� MOV #100000,RTTBL(R3) ;Indicate Diagnostics,/� BISB #US.SUP,U.STS(R5) ; no Error Recovery.R.‘20$: BITB #IQ.X,R0 ;Error Recovery allowed?’ BEQ 25$ ;IF EQ, No..“ BISB #US.SUP,U.STS(R5) ;No Error Recovery.F”25$: BICB #IQ.X!IQ.UMD!IQ.Q,R0 ;R0 - Function Code for Validation.*•30$: CMP R0,(R2) ;Function Code match?– BEQ 50$ ;IF EQ, Yes.T%— ADD #LNGHT,R2 ;Next I/O Function. !˜ CMP R2,#ENDFCN ;End of table?.*™ BLO 30$ ;IF LO, No. Check next entry.3š40$: MOV #IE.IFC&377,R0 ;Yes - Illegal Function. ,› CALL 00K0ggKg´cÚµcÛ¶c�·c›’$RLSUB ;Release the Subcontroller.&œ CALL $IOALT ;End this Request and3� BR MMINI ; service other outstanding Requests.Ež.Ÿ50$: MOV R2,IOFCN(R3) ;Remember I/O Request  TST (R2)+ ; and$¡ MOV (R2),U.FCDE(R5) ; QIO index./¢ CLR SPTBL(R3) ;Clear out Spacing Indicator. '£ TST RTTBL(R3) ;Diagnostic Function?D+¤ BMI 60$ ;IF MI, Yes - Inhibit Retries.E+¥ MOV #RETRY,RTTBL(R3) ;Set Retry Count.N¦§; Request the Controller¨;I8©60$: CMPB U.FCDE(R5),#FRREV ;Data Transfer Function?ª BLOS 70$ ;IF LOS, Yes.C6« CALL $RQCNC ;Request Controller for Control Fnct.¬ BR 80$ ;Perform request.E­<®70$: CALL $RQCND ;Request Controller for Dt Trnsfr Fnct.%¯80$: MOV U.KRB1(R5),R3 ;R3 > KRB1.I/° CALL SELECT ;Update Device Tape Char Info.d:± MOVB U.FCDE(R5),R0 ;R0 - QIO Index, I/O Function Code.&² MOV S.PKT(R4),R1 ;R1 > I/O Packet.3³ MOVB K1.CON(R3),R3 ;R3 - Formatter Unit Number,e$´ ASL R3 ; Convert to Word Index.3µ MOV #FATAL,DONTBL+FRTRY ;Preset Error Address.O,¶ JMP @PRETBL(R0) ;Preprocess I/O Request.·.PAGEo¸;+1¹; **-PRESPC - Preprocess Space Function Requestº;0.»; This routine Pre-Process's Space Requests.¼;c1½; Spacing Function Dependent I/O Packet Format: ¾;TB¿; WD. 12 -- Spacing Count (positive=forward, Negative=backward).À; WD. 13 -- Not Used..Á; WD. 14 -- Not Used.1Â; WD. 15 -- Not Used.1Ã; WD. 16 -- Not Used.t?Ä; WD. 17 -- Relocation Bias Of Diagnostic Reg. Buffer AddressA9Å; WD. 20 -- Diag. Reg. Buffer Address (Displ. + 140000)RÆ;-Ç7ÈPRESPC: MOV #IS.SUC&377,R0 ;Assume 0 Space Count ando3É CLR SPTOTL(R3) ; indicate No Blocks Spaced yet.P-Ê MOV U.BUF(R5),-(SP) ;Current Space Count. Ë BEQ 40$ ;IF EQ, Done.Ì BMI 10$ ;IF MI, Space REV.pÍ Î;Space FWD%Ï MOV #IE.EOV&377,R0 ;May be at EOVD#Ð BIT #M.AEOV,U.CW2(R5) ;At EOV? 4Ñ BNE 40$ ;IF NE, Yes - can't Space FWD from here0Ò NEG (SP) ;I/O Space Count - 2's complement.Ó BR 20$ ;ContinueÔ Õ;Space REV>Ö10$: BIC #M.AEOV,U.CW2(R5) ;Clear at End of Volume status.5× MOVB #FC.SPR,U.FCDE+1(R5) ;Space REV Function andT1Ø ADD #4,U.FCDE(R5) ; Space REV Function Index.B-Ù20$: CLR U.BUF(R5) ;Init for Function Code$(Ú CMP #IO.SPF,@IOFCN(R3) ;Space Files?Û BNE 30$ ;IF NE, No.7Ü MOV (SP),SPRMNG(R3) ;Remaining Spacing Count - 2's.U5Ý MOV (SP),I.PRM+4(R1) ;Save for later calculations.S*Þ MOV #1,(SP) ;Set for MAX Space Count.4ß30$: MOV (SP),U.CNT(R5) ;Current I/O Space Count.4à MOV (SP)+,SPTBL(R3) ;Save for Timeout situation.1á BR PWFTST ;Start I/O if no PWFLD Indication.)â.ã40$: TST (SP)+ ;Clean up Stack for Return.ä JMP EXTNST ;End Request.0å.PAGEBæ;+Jç; **-PRESMO - IF Tape at BOT, Set Tape Characteristics per User Request.è;-,éPRESMO: BIT #M.BOT,U.CW2(R5) ;Tape at BOT?7ê BNE SMORWD ;IF NE, Yes - Set Tape Characteristics.o)ë MOV #IE.FHE&377,R0 ;No, Fatal Error -eì BR PREXIT ;End Request.íî;+Iï; **-SMORWD - Issue REWIND to clear possibly hung EOT status in TM03's.eGð; Caused by manually rewinding an Online Tape Unit previously at EOT.ñ;-=òSMORWD: BIC #M.AEOV,U.CW2(R5) ;Not at End of Volume Status.q'ó BIC #USRBTS!7,U.CW2(R5) ;Prepare forF4ô BIC #^C,U.BUF(R5) ; User Controlled Bits.@õ BIS U.BUF(R5),U.CW2(R5) ;Set User Controlled Characteristics.!ö MOV #FC.RWD,U.BUF(R5) ;Set andt%÷ JMP PRCOM ; request I/O REWIND. ø5ùSMODON: BICB #US.PWF,U.STS(R5) ;Clear PWFLD Status. 'ú CALL SELECT ;Update Tape Char Wordy(û BR PRESEC ; and end IO.SMO Request.üý;++þ; **-PRESTC - Set Characteristics CommandE<ÿ; Sets User Controlled Bits in Tape Characteristics Word.;-0PRESTC: BIC #USRBTS!7,U.CW2(R5) ;Prepare for4 BIC #^C,U.BUF(R5) ; User Controlled Bits.B BIS U.BUF(R5),U.CW2(R5) ;Set User controlled Characteristics.;+0; **-PRESEC - Return Tape Characteristics Word;-?PRESEC: BIC #M.PEOV,U.CW2(R5) ;No M.PEOV for IO.SMO request. 2  MOV U.CW2(R5),R1 ;Return Tape Charac00K8gùfÝúfÞûfßüfàýfáþfDATAteristic's/  MOV #IS.SUC&377,R0 ; and indicate Success.*" PREXIT: JMP EXIT ;End Request. .PAGES ;+,; **-PREWRT - WRITE Request Preprocessing:>; Verify At least Minimum Record Size .and. Write Enabled.;-8PREWRT: MOV #IE.SPC&377,R0 ;Assume Parameter Problems2 CMP #MINREC,I.PRM+4(R1) ;Minimum Record Size?) BHI PREEXT ;IF HI, Record too small.r;+.; **-PREEOF - Write Tape Mark Preprocessing:-; **-PREERS - 3" Gap Erasure Preprocessing:); Verify Write Enabled.t;- PREEOF:S2PREERS: MOV #IE.WLK&377,R0 ;Assume Write Locked, BIT #M.SWL!M.HWL,U.CW2(R5) ;Write Locked? BNE PREEXT ;IF NE, Yes.* CMPB #FRREV,U.FCDE(R5) ;Data Transfer? BLT PWFTST ;IF LT, No. !;+ "; **-PRERED - Read Forward and+#; PREREV - Read Reverse Preprocessing: $;- %PRERED:S2&PREREV: MOV S.KRB(R4),R1 ;Retrieve KRB Address.2' BIT #FE.EXT,$FMASK ;22-bit Addressing enabled?( BEQ 5$ ;IF EQ, No.p)) BIT #KS.MBC,K.STS(R1) ;MASSBUS Device?e* BNE 5$ ;IF NE, Yes.#+ CALL $STMAP ;Setup Unibus Map.s#, ASL U.BUF(R5) ;Shift bits <4:5>,%- ASL U.BUF(R5) ; into bits <8:9>. . ASL U.BUF(R5) ; ...F/ ASL U.BUF(R5) ; ...a*0 CALL $MPUBM ;Setup UMR's for transfer.1 MOV @S.KRB(R4),R2 ; and restore R2 (=CSR).25$: MOV R5,R1 ;R1 >c3 ADD #U.BUF,R1 ; U.BUF.*4 BIT #FE.EXT,$FMASK ;22-bit Addressing?5 BNE 10$ ;IF NE, Yes. 6 ROL (R1) ; Setupb7 ROL (R1) ; A17, A16p8 ROL (R1) ; into;9 ROL (R1) ; Hi Byte. ):10$: CMPB #4,U.FCDE(R5) ;Read Reverse?p; BNE PWFTST ;IF NE, No.b$< SUB #2,U.CNT(R5) ;Read reverse -/= ADD U.CNT(R5),2(R1) ; Adjust Buffer PointerB> BCC 15$ ; to end ofU ? ADCB 1(R1) ; Buffer Area.1@15$: ADD #2,U.CNT(R5) ;Restore Transfer Count. >APWFTST: MOV #IE.ABO&377,R0 ;Request Aborted IF PWFLD Status-B BITB #US.PWF,U.STS(R5) ;Power Fail occur?N%C BEQ PRECOM ;IF EQ, No - ContinueL+DPREEXT: JMP EXTNST ;Else - End Request.iEF;+*G; **-PRECOM - Common Preprocessing EntryH;D5I; All requests have been preprocessed successfully.%J; Setup Formatter Mode Control andA1K; Subsequently perform I/O Function Execution.CL;-M9NPRECOM: MOVB U.FCDE+1(R5),U.BUF(R5) ;Retrieve Function.,*OPRCOM: MOVB U.SNUM(R5),R0 ;Tape Unit #.%P BIS #TC.1600,R0 ;Assume 1600 BPI.d.Q BIT #M.1600,U.CW2(R5) ;Assumption correct?R BNE 10$ ;IF NE, Yes.ES BIC #TC.1600,R0 ;Setup for T BIS #TC.800,R0 ; 800 BPI.*U BIT #M.EVN,U.CW2(R5) ;Even Parity Mode?V BEQ 10$ ;IF EQ, No.%W BIS #TC.EVN,R0 ;Even Parity Mode. 5X10$: BIS #TC.FMT,R0 ;Normal Assys/Disassy of Data..Y MOV R0,FMTBL(R3) ;Tape Drive Control Mode.Z[\];+!^; **-FNCEX - Function ExecutionR_;vE`; Issue I/O Function. RH Controller, Tape Formatter and Tape Drive0<a; ownership need be synchronized before I/O may proceed.b;r c; Inputs:1d; R2 = CSR Address R4 > SCB."e; R3 = Formatter Index R5 > UCB.f;-,gFNCEX: BIT #M.SER,U.CW2(R5) ;Select Error?+h BNE SELERR ;IF NE, Yes - Select Error.C#i BIT #PIP,MTDS(R2) ;Tape moving?Bj BEQ 10$ ;IF EQ, No.&k JMP WTRWD ;Wait until Tape Stops.l9m10$: MOV DONTBL+FRTRY,DONADR(R3) ; > Retry Completion.F$n MTPS #PR5 ;Inhibit Interrupts.$o CALL SELDRV ;;Select Formatter.@p MOV FMTBL(R3),MTTC(R2) ;;Select Tape Drive/Formatting mode.*q MOV #TRE!FC.CLR,(R2) ;;Clear Formatter.0r MOV U.CNT(R5),MTFC(R2) ;;Setup Command Count.9s BIC #M.AEOV!M.SER!M.RWD,U.CW2(R5) ;;Clear status bits.o5t CMPB U.FCDE(R5),#FRREV ;;Data Transfer Function?Tu BLOS 20$ ;;IF LOS, Yes.6v BISB #S3.SIP,S.ST3(R4) ;;Positioning in Progress.!w BR 25$ ;;Issue I/O Function.Rx;y20$: NEG MTFC(R2) ;;Formatter Frame Count - 2's cmplmnt.I*z MOV MTFC(R2),RHWC(R2) ;;RH Controller { ROR RHWC(R2) ;; Word Count.9| MOV U.BUF+2(R5),RHBA(R2) ;;Low order 16 bit address.2} MOV S.KRB(R4),R1 ;; > KRB.7~ BIS #KS.DIP,K.STS(R1) ;;Data Transfer in Progress.S+ BIT #FE.EXT,$FMASK ;;22-bit Addr00K@ggKg´cÚµcÛ¶c�·c›’essing?C€ BEQ 30$ ;;IF EQ, No.a+� BIT #KS.MBC,K.STS(R1) ;;MASSBUS Device?S‚ BEQ 30$ ;;IF EQ, No.T*ƒ ADD K.OFF(R1),R1 ;; > to UCB table and.„ MOV KE.RHB(R1),R1 ;; obtain RHBAE Offset.'… ADD R2,R1 ;;Form I/O page address.t>† MOVB U.BUF+1(R5),(R1) ;;HI Order address bits to RHBAE reg.(‡25$: MOVB U.BUF(R5),(R2) ;;Start I/O.ˆ BR 40$ ;;.. Cont.'‰30$: MOV U.BUF(R5),(R2) ;;Start I/O..&Š40$: MOV U.KRB1(R5),R2 ;; R2 > KRB1!‹ INC K1.STS(R2) ;; K1.STS .NE.$)Œ BIS #S2.ACT,S.ST2(R4) ;; I/O active.;7� BICB #S3.SPU,S.ST3(R4) ;;Clear Spin-Up indication.S4Ž MOVB S.ITM(R4),S.CTM(R4) ;;Start Timeout Count.+� CLR S.FRK+2(R4) ;;Reset Fork Interlock. "� MTPS #PR0 ;;Allow Interrupts. ‘ RETURN ’“”•–;+(—; **-SELERR-Issue Select Error Message˜;HB™; IF Not Diagnostic or ACP - Issue a Select Error Message to the,š; System Console Terminal every 15 seconds5›; (the unit is subsequently checked once a second)T4œ; until Tape Drive comes ready or Request Aborted.�;-ž7ŸSELERR: MOV #IE.DNR&377,R0 ;Assume Not Ready Status.n;  BITB #US.SUP,U.STS(R5) ;User Mode Diagnostics or IQ.X?C&¡ BNE 5$ ;IF NE, Yes - End Request.1¢ TST U.ACP(R5) ;End Request if associated ACP?£ BEQ 10$ ;IF EQ, No.2¤5$: JMP EXTNST ;End Request - Device Not Ready¥)¦10$: CALL RLSDRV ;Release Tape Drive,g$§ CALL $RLSUB ; TM Subcontroller%¨ CALL $RLCN ; and RH Controller.s6© DECB S.STS(R4) ;Time for a 'Select Error' message?ª BNE TIMER ;IF NE, No.-« MOV #T.NDSE,R0 ;Set up Error Message Codes4¬ MOVB #15.,S.STS(R4) ; and set up 15 sec Timeout.6­ CALL $DVMSG ;Send the Error Message to Sys Consl..®TIMER: MOVB #1,S.CTM(R4) ;Set up a Timeout.1¯TIMER1: CLR S.FRK+2(R4) ;Reset Fork Interlock. ° RETURN ;Wait for Timeout.e±.PAGEy²;+)³; **-MMOUT - Device Timeout Entry Point´;LPµ; I/O Timeouts may be caused by Powerfailure or other Hardware considerations.¶;4·; TIMEOUT CONSIDERATIONS: ¸;gK¹; 1. An RH Controller supports Parallel Operation and requires ConcurrentsHº; Operation synchronization. An RH supports one current Drive DataL»; Transfer Operation overlapped with other Drive(s) Non Data Transfers.P¼; There may be further restrictions on each Drive - i.e. Spacing OperationsK½; on a given Drive may not overlap Data Transfers on the same Drive.¾;/M¿; 2. The RH Controller is operated with Interrupt ENABLED - this may result4JÀ; in an Interrupt occuring simultaneously with Driver being called atKÁ; Timeout Entry point. The Interrupt may be from some external event, ?Â; such as a RWD completing, or a Tape Drive coming Online.rÃ;dNÄ; The Driver must be prepared for such an occurence - this is done by theNÅ; interlock S.FRK+2; IF S.FRK+2 is Zero, Interrupt processing is allowed.Æ; IÇ; 3. Another problem exists when a Driver has QUD a Fork while the ExectNÈ; was sequencing to the same Driver's Timeout Entry Point. Timeout EntryDÉ; code sequences with a Fork Block currently in the Fork Queue.Ê;I Ë; Inputs:bÌ; R4 > SCB. R5 > UCB.tÍ;- Î .ENABL LSBR5ÏMMOUT: TST S.FRK+2(R4) ;;;Interrupt handling I/O ?-Ð BEQ 10$ ;;;IF EQ, No - Device timed out.c)Ñ RETURN ;;;Interrupt will handle it.o2Ò10$: INC S.FRK+2(R4) ;;;Timeout will handle it.#Ó MTPS #PR0 ;;;Allow interrupts.o(Ô CALL $RQSUB ;Request Subcontroller.)Õ CMPB #FRREV,U.FCDE(R5) ;Data Transfer?eÖ BLT 20$ ;IF LT, No.8× CALL $RQCND ;Request Controller for DT XFR FunctionØ BR 30$ ; .. Continuer;Ù20$: CALL $RQCNC ;Request Controller for Cntrl FunctionÚÛ30$: MOV U.KRB1(R5),R3 ;R3 -R&Ü MOVB K1.CON(R3),R3 ; SubcontrollerÝ ASL R3 ; as Word Index.m'Þ CALL SELDRV ;Select Subcontroller.h0ß MOV #IE.DNR&377,R0 ;Assume Not Ready Status.7à BIT #M.RWD,U.CW2(R5) ;Tape Drive in previous Rewind?Lá BEQ 40$ ;IF EQ, No.âã; Tape Drive in previous RWD.D)ä BITB #US.ABO,U.STS(R5) ;Abort Request?/å BNE 53$ ;IF NE, Yes - End current00KHgùfÝúfÞûfßüfàýfáþfDATA Request.c3æ CALL SELECT ;Tape Drive available for Request? :ç35$: BCS SELERR ;IF CS, No - Issue 'Select Error' Msg.5è BIT #M.RWD,U.CW2(R5) ;Tape Drive - still RWD mode?l0é BEQ 60$ ;IF EQ, No - Start current Request.4êWTRWD: CALL RLSDRV ;ELSE Release the Tape Drive,'ë CALL $RLSUB ; Subcontroller andW#ì CALL $RLCN ; RH Controller.L#í BR TIMER ;Wait for one second.aî*ï; Tape Drive had I/O previously started./ð40$: MOV SPTBL(R3),R1 ;Spacing via BLKS/TMK?-ñ BEQ 52$ ;IF EQ, No. ò CMP R1,MTFC(R2) ;Blank tape?4ó BEQ 50$ ;IF EQ, Yes. End Rqst(Can't Stop Tp Sp):ô MOV MTFC(R2),SPTBL(R3) ;Remember Blocks/TMK's spaced."õ MOVB S.ITM(R4),S.CTM(R4) ;Waitö BR TIMER1 ; some more.÷Fø; Device I/O Timeout - Current I/O Not Completed in reasonable time.)ù50$: CALL $DVTMO ;Log Device Timeout. )ú BCS 80$ ;IF CS, Diagnostic Function.n3û JMP FATAL ;End Request - Space Timeouts Fatal.rü/ý52$: BITB #US.ABO,U.STS(R5) ;Abort Request?-þ BEQ 55$ ;IF EQ, No.-ÿ53$: MOV #IE.ABO&377,R0 ;Indicate Aborting  BR 90$ ; and end Request.B; Timeouts are not retried because the tape position is unknown.;.*55$: BIT #M.SER,U.CW2(R5) ;Select Error?  BEQ 50$ ;IF EQ, No - Error. CALL SELECT ;Ready yet? BCS 35$ ;IF CS, No.#60$: JMP PRECOM ;Retry Request.t A ; The following handles a timeout during a diagnostic function.u ; 6 80$: CALL SELDRV ;Select Subcontroller/Tape Drive.(  CALL MMDINT ;Pass Device Registers.G; NOTE: The following may cause all I/O on other Drive(s) attached to I; the same RH Controller to abort. Other I/O requests will be handledn1; by their respective Driver Timeout handling.o.; *** Exception - Tape Spacing operations.; - MOV #SCLR,RHCS2(R2) ;RH Subsystem Clear -J- ; Stop all I/O on that RH Controller.w1 CALL SELECT ;Select Subcontroller/Tape Driveu"90$: JMP EXTNST ; and Request.  .DSABL LSBT.PAGE.;+!; **-MMCAN - Cancel I/O Request.;-@MMCAN: CMP I.TCB(R0),R1 ;Cancel I/O Request for issuing Task? BNE 10$ ;IF NE, No.= BISB #US.ABO,U.STS(R5) ;Indicate I/O Request be Aborted.b 10$: RETURNi!"#;+"$; **-MMPWF - Power Fail Recovery%;eJ&; Powerfail is handled via the Device Timeout Facility - to avoid a race@'; condition that could exist in restarting the I/O Operation.(;-8(MMPWF: BCS 10$ ;IF CS, Controller Power Fail. ;CS0059( BISB #US.PWF,U.STS(R5) ; ELSE, Unit Power Fail ;CS005 1(10$: RETURN ; Disallow normal QIO'S. ;CS005c+ ;**-2,-;+=.; **-MMINT RH11/RH70 TM02/TM03 Interrupt service routine.d/; 70; R3 > KRB R5 > UCB (owner) - data transfer interrupt.1; R5 > UCB (1st slave) - other interrupts2;-34$MMINT::NOP ;;;#5 MOV U.KRB1(R5),R4 ;;;R4 > KRB1."6 MOV K1.OWN(R4),R5 ;;;R5 > UCB.%7 BNE 10$ ;;;IF NE - Owner exists.W78 MOV (R4),R5 ;;;Use Subcontroller's Tape Drive UCB.S%910$: MOV U.SCB(R5),R4 ;;;R4 > SCB.F): TST S.FRK+2(R4) ;;;Fork Block in use?n0; BNE 18$ ;;;IF NE, Yes. Disregard Interrupt.(<; If data transfer - service interrupt.= BIT #KS.DIP,K.STS(R3) ;;;Data trfr in prog?,> BNE 13$ ;;;IF NE, Yes - service intrpt.6?; If interrupt not during non-data I/O - discard it."@ MOV U.KRB1(R5),R2 ;;;R2 > KRB1"A TST K1.STS(R2) ;;;Started I/O?B BEQ 14$ ;;;IF EQ, No. @C; Interrupt from SSC and non-data I/O complete asynchronously.D MOV (R3),R2 ;;;R2 - CSR.U1E; If non-data I/O complete - service interrupt.F/F BIT #PIP,MTDS(R2) ;;;Non-data I/O complete?iG BEQ 13$ ;;;IF EQ, Yes.t!H MOV (R2),-(SP) ;;;Isolate I/OB&I BIC #^C<77>,(SP) ;;; Command Code.'J CMP #6,(SP)+ ;;;Just completed RWD?i+K BEQ 13$ ;;;IF EQ, yes - RWD initiated.I"L; If SSC interrupt - discard it.'M BIT #SSC,MTDS(R2) ;;;SSC condition?tN BNE 14$ ;;;IF NE, Yes.I/O13$: CALL $FORK ;;;Create a system process./!P MOV U.KRB1(R5),R1 ;R1 > KRB1.()Q CLR K1.STS(R1) ;K1.STS .EQ. I/O over. R TST K1.OWN(R100KPggKg´cÚµcÛ¶c�·c›’) ;Owned?/S BNE 20$ ;IF NE, Yes - Solicited Interrupt.e6T; Presently Unsolicited Interrupts are disregarded.0U14$: CALL $RQSUB ;Request the Subcontroller,#V CALL $RQCNC ; Controller andd/W CALL SELDRV ; Formatter/Tape Drive.dEX BIT #M.RWD!M.SER,U.CW2(R5) ;Previously Rewinding or Select Error?nY BEQ 15$ ;IF EQ, No.7Z INCB S.CTM(R4) ;Timeout Count - per original value.e)[15$: CALL RLSDRV ;Release Tape Drive,"\ CALL $RLSUB ; Subcontroller%] CALL $RLCN ; and RH Controller.E-^ CLR S.FRK+2(R4) ;Reset Fork interlock and 0_18$: RETURN ; discard Unsolicited Interupt.`3a20$: BICB #S3.SIP,S.ST3(R4) ;I/O not in progress.L+b BITB #US.ABO,U.STS(R5) ;Abort Request?Vc BEQ 25$ ;IF EQ, No. d MOV #IE.ABO&377,R0 ;Abortinge BR ENDRQS ; Request.f*g25$: MOV #IS.SUC&377,R0 ;Assume Success1h MOVB K1.CON(R1),R3 ;Retrieve Formatter Numbere"i ASL R3 ; and make Word Index.8j MOV DONADR(R3),DONTBL+FRTRY ;Set Retry done Address.0k MOVB U.FCDE(R5),R1 ;Retrieve Function Index.9l BIT #M.EOF!M.BOT,U.CW2(R5) ;Tape Mark seen last time?lm BEQ 40$ ;IF EQ, No..n BIS #M.PEOV,U.CW2(R5) ;Set for EOV check.Bo40$: BIC #NEWBTS,U.CW2(R5) ;Status bits that may have changed.1p CALL SELECT ;Select subcontroller/tape unit.S%q BIT #TRE,(R2) ;RH Transfer Error?3r BNE 50$ ;IF NE, Yes.M,s45$: BIT #ERR,MTDS(R2) ;Tape Drive Error?t BNE 60$ ;IF NE, Yes.r0u JMP @DONTBL(R1) ;No I/O Error - End Request.v"w; RH Controller Transfer Error -5x50$: BIT #CPE,(R2) ;Parr Err, MASSBUS Control Bus?5+y BNE FATAL ;IF NE, Yes - Unrecoverable.;#z MOV RHCS2(R2),R0 ;R0 - Possible -{ BIC #^C,R0 ; RH Error Indication.R| BEQ 60$ ;IF EQ, No.-} BIT #DLT!UPE!DPE,R0 ;Repositioning Error?t~ BNE 67$ ;IF NE, Yes.#! BIT #PGE!NED,R0 ;Retry Error?B€ BNE 57$ ;IF NE, Yes.5"� BIT #MXF,R0 ;Missed Transfer?‚ BEQ 53$ ;IF EQ, No.%ƒ CMPB #4,U.FCDE(R5) ;Read Reverse?o„ BNE 57$ ;IF NE, No.1… BIT #M.BOT,U.CW2(R5) ;BOT during Read Reverse?)† BEQ 57$ ;IF EQ, No.,‡ BR 45$ ; .. Check for Tape Drive Error.ˆ(‰53$: BIT #WCE,R0 ;Write Check Error?+Š BNE FATAL ;IF NE, Yes. (Else, C2.NEM)n*‹55$: MOV U.CNT(R5),R0 ;R0 - Frame CountŒ NEG R0 ; Request..� ADD MTFC(R2),R0 ;Frame Count as Requested?Ž BNE 67$ ;IF NE, Moved.B�57$: CALL LOGERR ;Log ErrorX � JMP FNCEX ;Reissue Request.‘5’; Drive Error Indication - Determine IF Recoverable,“60$: MOV MTER(R2),R0 ;R0 - Error Register*” BIT ERRMSK(R1),R0 ;Recoverable Error?• BEQ FATAL ;IF EQ, No.+– BIT #FMT!CPR!DTE,R0 ;Positioning Known?#— BNE 55$ ;IF NE, No.'˜65$: BIT #MOL,MTDS(R2) ;Drive Ready?2"™ BEQ FATAL ;IF EQ, No - Fatal.-š67$: MOV MTER(R2),R0 ;R0 - Error Register.M6› JMP @CHKTBL(R1) ;Recover per Specific I/O Request.œ'�; Unrecoverable Request - End RequestX"žFATAL: CALL LOGERR ;Log Error.,Ÿ MOV #IE.FHE&377,R0 ;Unrecoverable Error.$ ENDRQS: JMP EXTNST ;End Request.¡.PAGEo¢;+3£; **-REVERR - Read Reverse Special Error CheckingB¤;T$¥; Test for Read Reverse into BOT..¦; IF BOT THEN IS.SUC and Zero Byte Count.§;- ¨ .ENABL LSBT.©REVERR: BIT #OPI,R0 ;Operation Incomplete?0ª BEQ REDERR ;IF EQ, No - Not a BOT Condition#« BIT #BOT,MTDS(R2) ;Tape at BOT?r-¬ BEQ FATAL ;IF EQ, No - Errors are Fatal.l-­ BIS #M.BOT,U.CW2(R5) ;Indicate BOT Status. &® CLR MTFC(R2) ;No Data Transferred.¯ BR 50$ ;End Request.S°±;+#²; **-REDERR - Read Error Checking³;-4´REDERR: BIT #INC!PEF!DTE!FMT!CPR,R0 ;Retry Error?µ BNE 20$ ;IF NE, Yes.t$¶ BIT #FCE,R0 ;Frame Count Error?· BNE 30$ ;IF NE, Yes..#¸10$: BIT #PES,MTDS(R2) ;PE Tape?O*¹ BNE 40$ ;IF NE, Yes - Corrected Data.#º20$: JMP COMRTY ;Retry Request.O»$¼30$: BIT #TM,MTDS(R2) ;Tape Mark?½ BEQ 50$ ;IF EQ, No.*¾ MOV #IE.EOF&377,R0 ;EOF Ending Status.>¿ BIS #M.EOF,U.CW2(R5) ;Indicate EOF in Characteristics Word.À BR 60$ ;End Request.Á Â40$: CALL LOGERR 00KXgùfÝúfÞûfßüfàýfáþfDATA ;Log Error.+Ã50$: MOV #IS.SUC&377,R0 ;Indicate Sucesse*Ä60$: JMP @DONTBL(R1) ; and End Request. Å .DSABL LSBrÆÇ;+=È; **-RWDERR/RWDRTY - Rewind .OR. Unload/Offline Error RetryPÉ;- ÊRWDERR:44ËRWDRTY: BIC #M.1600,U.CW2(R5) ;Setup for 800BPI.4Ì BIT #TC.1600,FMTBL(R3) ;Last Request at 1600BPI?)Í BNE 10$ ;IF NE, Yes - Try 800BPI.E4Î BIS #M.1600,U.CW2(R5) ;Setup to try at 1600BPI.6Ï10$: CMP #RETRY,RTTBL(R3) ;Retried at least once?Ð BNE FATAL ;IF NE, Yes.Ñ DECB RTTBL(R3) ;RetryÒ JMP PRCOM ; only once.Ó.PAGE0Ô;+.Õ; **-SPRERR - Space Reverse - Error HandlingÖ;- × .ENABL LSBD.ØSPRERR: BIT #BOT,MTDS(R2) ;BOT Encountered?Ù BEQ SPFEXT ;IF EQ, No.R-Ú BIS #M.BOT,U.CW2(R5) ;Indicate BOT Status.(Û MOV #IS.SUC&377,R0 ;Indicate SuccessÜ BR 30$ ; and End Request.ÝÞ;+.ß; **-SPFEXT - Space Forward - Error Handling*à; Space Functions - Completion Routinesá;-.âSPFEXT: BIT #OPI,R0 ;Operation Incomplete?)ã BNE FATAL ;IF NE, Yes - Fatal Error.J(ä MOV #IS.SUC&377,R0 ;Indicate Success,å10$: BIT #TM,MTDS(R2) ;Detected Tapemark?æ BEQ 30$ ;IF EQ, No.1ç MOV #IE.EOF&377,R0 ;Indicate Tapemark Status.B*è CALL CHKEOV ;Check for End of Volume.é BCC 15$ ;IF CC, Not EOV./ê MOVB #FRTRY,U.FCDE(R5) ;Set for Backspace. $ë JMP BACK ;Backspace One Record.ì(í15$: JMP @RTYTBL(R1) ;Any more files?î8ïSPCONT: CLR U.CNT(R5) ;Clear Requested Count for Calc*ð MOV #IE.EOV&377,R0 ;Assume EOV ending.0ñ BIS #M.AEOV,U.CW2(R5) ;Indicate EOV status.1ò30$: MOV S.PKT(R4),R1 ;Get I/O Packet Address.e)ó CMPB #IO.SPF,I.FCN(R1) ;Space Files?.ô BEQ SPFDON ;Yes - Endup Files Completion.õGö; This works because we only get to SPRRTY: for successful completionD÷; of the backup (Also MTFC=0), and IO.SPB cannot detect EOV after8ø; spacing over any blocks. (IO.SPF Doesn't Use U.CNT)ù;?ú;Space Blocks - FWD/REV5û;l.üSPRRTY: TST MTFC(R2) ;Enough Blocks Spaced? ý BEQ 35$ ;Yes - End Request.+þ BIT #TM!BOT,MTDS(R2) ;TMK or BOT seen?0 ÿ BNE 35$ ;Yes - End Request./ MOV U.CNT(R5),R0 ;Retrieve Requested Count.F4 SUB MTFC(R2),R0 ;Calculate actual number spaced.. ADD R0,SPTOTL(R3) ;Add it to total spaced.1 MOV MTFC(R2),U.CNT(R5) ;Update Current Count(6 MOV MTFC(R2),SPTBL(R3) ; and save it for timeout.$ BR 70$ ;Try to Space some more.335$: MOV U.CNT(R5),R1 ;Retrieve Requested Count.P4 SUB MTFC(R2),R1 ;Calculate actual number spaced.2  ADD SPTOTL(R3),R1 ;Additional Space Operations  ; done IF after EOT.  BR 60$ ;Exit.  ;+#; **-SPFRTY - Space Files FWD/REV;- SPFRTY: INC SPRMNG(R3) ;Done?# BNE 70$ ;IF NE, No - Continue.i) MOV #IS.SUC&377,R0 ;Indicate Success,5* BR 50$ ; Setup count and End Request.-SPFDON: BIT #BOT!TM,MTDS(R2) ;BOT or TMK?y# BEQ 70$ ;IF EQ, No - Continue.U. BIT #BOT,MTDS(R2) ;Stopped for BOT or EOV?' BNE 50$ ;Don't increment the counta, BIT #M.AEOV,U.CW2(R5) ; because we didn't BNE 50$ ; pass a file.( INC SPRMNG(R3) ;Increment TMK Count.150$: MOV S.PKT(R4),R1 ;Get I/O Packet Address.1  MOV I.PRM+4(R1),R1 ;Retreive Count Requested.N1! SUB SPRMNG(R3),R1 ;Subtract Number remaining.e/"60$: NEG R1 ;Set for positive Return Value.u# JMP EXIT ;End Request.B$%70$: JMP FNCEX & .DSABL LSBQ'()*;+$+; **-COMRTY - Common Retry Routine,;d(-; IF Retries Suppressed - End Request/.; ELSE Call Function Specific Retry Routineu/;-0&1COMRTY: CALL LOGERR ;Log the Error+2 MOVB U.FCDE(R5),R1 ;R1 - Function IndexV-3 BITB #US.SUP,U.STS(R5) ;Retries allowed?V&4 BNE 10$ ;IF NE, No - End Request.*5 DECB RTTBL(R3) ;Any more Retries left?&6 BLE 10$ ;IF LE, No - End Request.27 MOV U.FCDE(R5),FCCDE(R3) ;Save Function Index18 MOV U.CNT(R5),CMDCNT(R3) ;Save Command Count29 MOV U.BUF(R5),BUFADR(R3) ;Save Buffer Address.: MOVB #FRTRY,U.FCDE(R5) ;Set Retry Command9; JMP @RTYTBL(R1) ;G00K`ggKg´cÚµcÛ¶c�·c›’OTO Function Specific Retry routineY<+=10$: BIT #PEF!OPI,R0 ;Tape Format Error?)> BEQ RTYCN1 ;IF EQ, No.$? MOV #IE.BBE&377,R0 ;Other Error.(@RTYCON: JMP @DONTBL(R1) ;End Request.A3BRTYCN1: MOV #IE.VER&377,R0 ;Request Return Code.1C BR RTYCON ;End Request.D.PAGEUE;+F; -- Write/WTMK Retry --G;- H .ENABL LSBT*IWRTRTY: MOV #FRTRY,R1 ;R1- Retry Index.5J MOV #RTNWRT,DONTBL(R1) ;I/O Cont after Reposition. 1K MOV #FC.SPR,U.BUF(R5) ;Setup I/O Request Code.TL BR 15$ ;Reposition Tape. M0NRTNWRT: BIT #M.IXG,U.CW2(R5) ;No Extended IRG?O BNE RTYCMD ;IF NE, Yes.'P BR BACK ;Recover from Write Error. QR;+S; -- Read FWD/REV Retry --T;- UREDRTY:T4VREVRTY: CMP MTFC(R2),#NOISE ;800BPI - Min Record?'W BLO RTYCMD ;IF LO, No - Ignore it.XY)ZBACK: MOV #FRTRY,R1 ;R1 - Retry Index.[ MOV IOFCN(R3),R0 ;R0 >$\ ADD #4,R0 ; Reposition Return.3] MOV (R0)+,DONTBL(R1) ;I/O Cont after Reposition.R/^ MOV (R0),U.BUF(R5) ;Setup I/O Request Code.t3_15$: MOV #-1,U.CNT(R5) ;Reposition by one Block.t ` BR 20$abc;+ d; Reissue Original I/O Requeste;-;fRTYCMD: MOV FCCDE(R3),U.FCDE(R5) ;Restore Function Index,--g MOV CMDCNT(R3),U.CNT(R5) ; Command Count,0/h MOV BUFADR(R3),U.BUF(R5) ; Buffer Address -I.i20$: JMP FNCEX ; and Execute the Function.j k .DSABL LSBMl.PAGERm;+/n; **-REDDON - Read Forward Completion RoutineMo;-pGqREVDON: BIC #M.EOF!M.AEOV,U.CW2(R5) ;Setup Status for REV completion. :rREDDON: MOV MTFC(R2),R1 ;Set Frame Count for Requestor.1s; TM03 Formatter - Auto Density setup on Reads.g7t; IF TM03, Update Density Status for that Tape Unit.)"uTM03DN: BIT #40,MTDT(R2) ;TM03?v BEQ 5$ ;IF EQ, No.m1w BIT #M.BOT!M.RWD,U.CW2(R5) ;BOT or Rewinding? x BNE 5$ ;IF NE, Yes.*y BIC #M.1600,U.CW2(R5) ;Assume 800BPI.z BIT #PES,MTDS(R2) ;800 BPI?R{ BEQ 5$ ;IF EQ, Yes.)| BIS #M.1600,U.CW2(R5) ;Else 1600BPI.E!}5$: TSTB R0 ;Returning Error?o+~ BMI EXIT ;IF MI, Yes - More important. ) BIT #BOT,MTDS(R2) ;Read REV into BOT?F€ BNE EXIT ;IF NE, Yes.2� CMP MTFC(R2),#NOISE ;Record at least Min Size?‚ BHIS 10$ ;IF HIS, Yes. (ƒ BIT #M.1600,U.CW2(R5) ;1600 BPI Tape?5„ BNE EXIT ;IF NE, Yes -LT Min allowed for 1600BPIi/… JMP COMRTY ;LT Min not allowed for 800BPI.C†:‡10$: CMP R1,U.CNT(R5) ;Tape Data - More than Requested?%ˆ BLOS EXIT ;IF LOS, No - Success.C(‰ MOV #IE.DAO&377,R0 ;Inform the User.Š BR EXIT ;End Request.‹;+2Œ; **-EOFDON - Write Tape Mark Completion Routine6�; **-WRTDON - Write Logical Block Completion RoutineŽ;-+�EOFDON: BIS #M.EOF,U.CW2(R5) ;TMK status.B6�WRTDON: MOV U.CNT(R5),R1 ;Retrieve Requested Count.-‘ ADD MTFC(R2),R1 ;Calculate Actual Length.l’ BIT #EOT,MTDS(R2) ;EOT?M“ BEQ EXIT ;IF EQ, No.o1” MOV #IE.EOT&377,R0 ;EOT - Request End Status. :• BIS #M.EOT,U.CW2(R5) ;EOT in Tape Characteristics Word.– BR EXIT ;End Request.—1˜RWDDON: BIT #PIP,MTDS(R2) ;Rewind in progress? ™ BEQ 10$ ;IF EQ, Done.5š BIS #M.RWD,U.CW2(R5) ;Indicate Rewind in Progress. <›10$: BIC #M.AEOV,U.CW2(R5) ;No End of Volume indication./œ BICB #US.PWF,U.STS(R5) ;Clear PWRFLD Status.e�8žEXTNST: CLR R1 ;No additional Status being Returned.%ŸEXIT: MOV @S.KRB(R4),R2 ;R2 = CSR.E2  CALL MMDINT ;Pass Dev Regs IF User Mode Diag.$¡ CALL RLSDRV ;Release the Drive.-¢ MOV U.KRB1(R5),R3 ;Retrieve KRB1 Address. -£ MOVB K1.CON(R3),R3 ;Get Formatter Number.D¤ ASL R3 ;Make a Word Index.B'¥ MOVB RTTBL(R3),R2 ;Set Retry Count.W+¦ BIS #RETRY*256.,R2 ;Set Original Count.B-§ BIC #M.PEOV!7,U.CW2(R5) ;No PEOV Status.t0¨ BICB #US.ABO,U.STS(R5) ;Clear Abort Status..© BICB #S3.SIP,S.ST3(R4) ;Clear Status Bit.,ª CALL $RLSUB ;Release the Subcontroller.$« CALL $RLCN ;Release Controller.>¬ BIC #S2.ACT,S.ST2(R4) ;Clear Intrpts active - If Timeout..­ CLR S.FRK+2(R4) ;Clear the Fork Interlock."® CALL $IODON ;End the Request.1¯ JMP MMINI ;Service outstanding 00KhgùfÝúfÞûfßüfàýfáþfDATAI/O Requests.M°±²;+/³; **-CHKEOV - Check For Logical End Of Volumee´;g µ; Outputs:¶; C=1 If EOV·; C=0 If Not EOV¸;-¹!ºCHKEOV: CLC ;Assume Not EOV.r&» BIT #REV,U.BUF(R5) ;REV Operation?(¼ BNE 20$ ;IF NE, Yes - can't be EOV.-½ MOV MTFC(R2),-(SP) ;Retrieve frame Count.l6¾ SUB U.CNT(R5),(SP) ;Obtain number actually Spaced.¿ CMP (SP)+,#1 ;Exactly One?À CLC ;Assume Not EOV."Á BNE 10$ ;IF NE, No - not EOV.* BITB #US.LAB,U.STS(R5) ;Labelled Tape?"à BNE 10$ ;IF NE, Yes - No EOV.6Ä BIT #M.PEOV,U.CW2(R5) ;TMK or BOT seen last time?Å BEQ 10$ ;IF EQ, No - CC.Æ SEC ;EOV.+Ç10$: BIS #M.EOF,U.CW2(R5) ;Set EOF status È20$: RETURNUÉ.PAGEEÊ;+ Ë; **-SELDRV - Select Tape Unit.Ì; **-SELECT - Select And Set Hardware StatusÍ;e,Î; This routine attempts to select a drive.KÏ; It sets up BOT, EOT, HWL, SER bits in the Tape Characteristics Word..Ð;B Ñ; Outputs:Ò; C=0 If Good SelectÓ; C=1 If Bad SelectaÔ;-Õ'ÖSELDRV: MOV @S.KRB(R4),R2 ;R2 - CSR.5× MOVB U.UNIT(R5),RHCS2(R2) ;Select the formatter.Ø BIT #GO,(R2) ;Go Bit Set?-Ù BNE 10$ ;IF NE, Yes - don't touch MTTC !t3Ú MOV MTTC(R2),-(SP) ;Save Slave Select Register.S Û MOVB U.SNUM(R5),(SP) ;Select$Ü MOV (SP)+,MTTC(R2) ; Slave Unit. Ý10$: RETURNsÞß4àSELECT: CALL SELDRV ;Select Formatter and Slave.@á BIC #M.BOT!M.EOT!M.HWL!M.SER,U.CW2(R5) ;Status to be updated.*â SEC ;Assume can't select Tape Drive.(ã BIT #MOL,MTDS(R2) ;Tape Drive Ready?ä BNE 10$ ;IF NE, Yes.V4å BIS #M.SER,U.CW2(R5) ;Select Error - indicate it. æ RETURN ç3è10$: BIT #PIP,MTDS(R2) ;Positioning in Progress?Té BNE 20$ ;IF NE, Yes. #ê BIT #BOT,MTDS(R2) ;Tape at BOT?Vë BEQ 15$ ;IF EQ, No.$ì BIS #M.BOT,U.CW2(R5) ;BOT status,(í BIC #M.RWD,U.CW2(R5) ; not Rewinding.'î15$: BIT #EOT,MTDS(R2) ;Tape at EOT?Bï BEQ 20$ ;IF EQ, No.$ð BIS #M.EOT,U.CW2(R5) ;EOT status.3ñ20$: BIT #WRL,MTDS(R2) ;Tape Drive Write-Locked?,ò BEQ 30$ ;IF EQ, No.$ó BIS #M.HWL,U.CW2(R5) ;HWL status.$ô30$: CLC ;Tape Drive available.õRTRN: RETURNö÷ø;+0ù; **-LOGERR - Subroutine To Log Device Errorsú;-û-üLOGERR: TST RTTBL(R3) ;User Mode Function?t0ý BMI RTRN ;IF MI, Yes - They will handle it.0þ JMP $DVERR ;Log the Error - They will RTRN.ÿ.PAGEn;+#; **-$RQSUB-Request SubcontrollerB;B$; Obtain Access To Subcontroller -C; IF Allowed to perform an I/O Operation, Set Subcontroller Busy.k; ; Inputs:;4; R5 > UCB, Requestor Unit. 0(SP)= > Driver Return; 2(SP)= > Drivers Caller ; Outputs: ; R4 > SCB, ; R5 > UCB, Requestor Unit.L ;v ; NOTE:; S.FRK+2 is Always Non-Zero. 1; Driver has Exclusive Access to Subcontroller. ;-&$RQSUB: MOV U.SCB(R5),R1 ;R1 > SCB.! MOV U.KRB1(R5),R0 ;R0 > KRB1.+; CMP R5,K1.OWN(R0) ;Requestor already own Subcontroller?s BEQ 10$ ;IF EQ, Yes.F' TST K1.OWN(R0) ;Subcontroller Busy?  BNE 20$ ;IF NE, Yes.7 MOV R5,K1.OWN(R0) ;Requestor - Subcontroller Owner.e"; Requestor Subcontroller Owner.)10$: MOV R1,R4 ;Subcontroller Owner -52 MOV #42,S.FRK+2(R4) ; IF S.FRK+2 .NE. - owned.  RETURNy?; Requestor not Subcontroller Owner .and. Subcontroller Busy.-620$: MOV R1,S.FRK+6(R1) ; Save SCB in R4 Save Area.-  ADD #S.FRK+6,R1 ; R1 > to R5 Save Area+2; ! MOV R5,-(R1) ; Save R5,o." MOV (SP)+,-(R1) ; Save Drivers Return @,(# CLR -(R1) ; and Clear Link Word.'$ ADD #K1.CRQ,R0 ; R0 > to Wait Queueq*% JMP $QINSF ; and Queue this Request.&'(;+#); **-$RLSUB-Release Subcontrollerr*; 1+; IF Requestor not Subcontroller Owner, Return. ,;e@-; ELSE Release Subcontroller, place Fork Block for subsequent;.; Requests (if any) from the Controller Wait Queue to theRA/; Fork Queue and make Requestor the Owner of the Subcontroller.V0;( 1; Inputs: 2; R4 > SCB,P3; R5 > UCB of Requestor.4; 5; Outputs:%6; IF Owned - Subcontroller Released#7; R3 Alter00Kpgáugg´cÚµcÛ¶c�·c›’ed8;-9(:$RLSUB: MOV U.KRB1(R5),R3 ;R3 > KRB1.3; CMP R5,K1.OWN(R3) ;Requestor own Subcontroller?r< BNE 30$ ;IF NE, No.!=; Requestor owns Subcontroller.n4> CLR K1.OWN(R3) ;Release Subcontroller ownership.#?; Handle other Requestors Queued.f5@ ADD #K1.CRQ,R3 ;R3 > Subcontroller Request Queue.Q.A MOV (R3),R4 ;Any other Requestors Queued?0B BEQ 20$ ;IF EQ, No other Requestors Queued.,C MOV (R4),(R3) ;Update Beginning of List."D BNE 10$ ;IF NE, List updated.E MOV R3,2(R3) ;Empty list.RDF10$: MOV 4(R4),K1.OWN-K1.CRQ(R3) ;Prev Reqstr - R5 from Fork List.$G CLR (R4) ;Clear Fork Link Word.+H CALL $QFORK ;Fork Block to Fork Queue.#I20$: MOV U.SCB(R5),R4 ;R4 > SCB.l J30$: RETURNKLM;+!N; **-RLSDRV - Release the DriveCO; NP; IF A Multi Access (Dual Ported) Unit, Issue Drive Release and note in SCB.Q; R; Inputs:; S; R2 > CSR. T; R4 > SCB.eU;-VGWRLSDRV: MOVB #TRE/256.,1(R2) ;Clear RH errors - CS1 14,13; CS2 15-8..%X BIT #PIP,MTDS(R2) ;Tape movement?:3Y BNE 5$ ;IF NE, Yes - Can't init RH, tape subsyo3Z MOV #TRE!10,(R2) ;Clear RH errors, selected TM.L$[5$: BIT #S2.MAD,S.ST2(R4) ;RH01?\ BEQ 10$ ;IF EQ, No.4] MOVB #FC.RLS,(R2) ;Release Drive (Subcontroler).A^ BISB #S3.DRL,S.ST3(R4) ; and Show Dual Access Unit released. ,_10$: MOVB #IE,(R2) ;Re-enable Interrupts. ` RETURNua.PAGE b;+ c; **-MMDINTSd;#e; IF Diagnostic Control Function,R-f; pass Device Registers via $CRPAS routine.g;# h; Inputs: i; R2 > CSR R4 > SCBEj;-k lMMDINT: MOV R1,-(SP) ;Save R1,m MOV S.PKT(R4),R1 ;Get I/O Packet Address5n BITB #IQ.UMD,I.FCN(R1) ;Diagnostic Function Call?Qo BEQ 20$ ;IF EQ, No.=p CMPB #IO.EOF/256.,I.FCN+1(R1) ;Write EOF Control Function?,q BEQ 10$ ;IF EQ, Yes. <r CMPB #IO.RWD/256.,I.FCN+1(R1) ;Control other than IO.EOF?s BEQ 10$ ;IF EQ, Yes. 6t CALL $CRPAS ;Pass Device Registers to Diagnosticsu BR 20$ ; .. Cont.v7w10$: MOV I.PRM+14(R1),I.PRM+16(R1) ;Move WD20 to WD2123x MOV I.PRM+12(R1),I.PRM+14(R1) ;Move WD17 to WD20S)y MOV R1,-(SP) ;Save I/O Packet Addresst6z CALL $CRPAS ;Pass Device Registers to Diagnostics,{ MOV (SP)+,R1 ;Restore I/O Packet Address8| MOV I.PRM+14(R1),I.PRM+12(R1) ;Move WD20 back to WD178} MOV I.PRM+16(R1),I.PRM+14(R1) ;Move WD21 back to WD20 ~20$: MOV (SP)+,R1 ;Restore R1  RETURNE€� .ENDCALL $CRPAS ;Pass Device Registers to Diagnosticsu BR 20$ ; .. Cont.v7w10$: MOV I.PRM+14(R1),I.PRM+16(R1) ;PN:< .DATA POT = 0 .DATA RMDSPT = 0F .DATA DCLSPT = 0A .GOTO FINISH..NEWSYS: ;L ; Since you answered no to last question, I assume you have an RSX-11M V4.0 ; system or RSX-11M-PLUS. ;G .ASK SPAWN Does your system support parent/offspring tasking (most do)= .IFF SPAWN .GOTO NOSPN .DATA POT = 1 ;M ; Many RSX-11M/M-PLUS systems have DIGITAL Command Language (DCL), but no M $ ; 3.2 or earlier M systems have it. ;# .ASK DCL Does your system have DCLS .IFF DCL .DATA DCLSPT = 0 .IFT DCL .DATA DCLSPT = 1 ;H ; Your system may have a user version of the RMDEMO system display taskE ; available. If so, the MCR RMD command or the DCL SHOW MEMORY and s2 ; SHOW TASKS/DYNAMIC commands produce the display ;) .ASK RMD Is this the case on your system= .IFF RMD .DATA RMDSPT = 0 .IFT RMD .DATA RMDSPT = 1.FINISH: .CLOSE CLKPRE.MAC ; ; Now we'll build your clocko ; MAC CLOCK=CLKPRE,CLOCKt TKB CLOCK=CLOCK PIP CLKPRE.MAC;0,CLOCK.OBJ;*/DE ;@ .ASK A Do you want to purge previous versions of the clock task .IFT A PIP CLOCK.TSK/PU .IFNDF .GOTO DONE .IF STCLI EQ "DCL" SET /DCL=TI:.DONE: ; RUN CLOCK ;A ; To use this clock in the future, issue the command "RUN CLOCK"e display ;) .ASK RMD Is this the case on your system= .IFF RMD .DATA RMDSPT = 0 .IFT RMD .DATA RMDSPT = 1.FINISH: .CLOSE CLKPRE.MAC ; ; Now we'll build your clocko ; MAC CLOCK=CLKPRE,CLOCKt TKB CLOCK=CLOCK PIP CLKPRE.MAC;0,CLOCK.OBJ;*/DE ;@ .ASK A Do you want to purge00âxgãygäzgM{güfàýfáþfDATA .ENABLE SUBSTITUTION.BEGIN: .ASKS FILE Which file? TYPE 'FILE' .ASK DEL Delete the file  .IFT DEL DELETE 'FILE';*B .GOTO BEGIN .ENABLE QUIET .IF EQ "MCR" SET /DCL=TI: .DISABLE QUIETE2 .IF NE "[USER]" SET DEFAULT [USER]/NAMED .ENABLE QUIET TYPE HELLO.TXTI.; This Indirect command file prepares a new diskette for use on your RSXaM.; system. This is an example only. You may want to customize this file for.; your own use.  ;? ; Place the new diskette in one of the drives before answeringn ; the question.-.; Comments with only ; in front are printed.-.; Comments with .; in front are not printed.  .ENABLE SUBSTITUTION4K.; When SUBSTITUTION is enabled, Indirect can substitute a variable's value.; into a command. ; .ASKS DISK $ .TITLE DCCTL - Control Operations .IF DF D$$CHE .IDENT /02.02/ ;C7; Copyright (c) 1986 by DIGITAL EQUIPMENT CORPORATIOND; All rights reserved.;; Original author: ; John Gemignani ;" ; Modified by: ;A ; J. Kauffman 10-Jun-86 02.01t: ; JRK328 Add deferred write support for temporary files ;: ; J. Kauffman 29-May-87 02.0230 ; JRK336 Force cache flush when going NODEFER ;f;lN; This module contains the code to perform the cache operations required for$; QIOs with IO.STC function codes.;$ .MCALL PCBDF$  PCBDF$C .PSECT DC$CTL, RO, II! (" .SBTTL $DCSTC - Operations dispatcher#;. $; Passed:r%; UCBX mapped in APR6G=&; X.CSTS := Unit's cache status (i.e. selected operations)8';0(; R1 -> I/O packet); I.PRM+2 := Operation code *; R5 -> UCB%+; SP -> Address of return in $DRQRQJ,; -; Returned:s.; All registers preserved/;10;;; Otherwise N/A - control is passed to $DRQRQe1;a 2; Action:d3; 4; Notes:<5; QIOs which are NOT transfer functions do not have I.PRMs96; adjusted for the address doublewords. Therefore, alla=7; parameters will be in the same cells within I.PRM as theyF8; are issued (hence the Px definitions in DCPRE should not be used).9;- :$DCSTC:: : MESAG$ STCMSG,1 ;JRK330< ;**-1 1= TST I.PRM+2(R1) ; Is this a "size" operation?n> BPL 10$ ; If PL, no?$@ RETURN ; Give it to the driverA10$:9B MOV #$QOPDN, (SP) ; Change return address, see $DRQRQ C9D CMP #VV$CHE, I.PRM+2(R1) ; A cache directed operation?dE BEQ LOCAL ; If EQ, yeswF;G BITB #XC.ACT, APR6.BASE+X.CSTS ; Is this device caching?wH BEQ 20$ ; If EQ, norI;uGJ; Performance might be enhanced at this point by making an additionalC#K; verification. The choices are:L; <M; 1) checking US.VV inline and attempting to track changesIN; 2) duplicating the I/O packet and checking the status during internal0O; I/O completion)=P; 3) creating and calling a new entry point in MDSUB/$VOLVDRQ;1?R; I recommend choice 3 as the easy to implement and maintain.S;B2T CALL CHEPUR ; Purge the cache for this deviceT ;JRK330 T .IFDF CHEDFR ;JRK330T ;JRK330t3T BCC 15$ ; If CC, all extents are gone ;JRK330n9T CALL ELMCED ; Go eliminate the deferred CED ;JRK330d7T BCS BACKUP ; CS -> failure causing backup ;JRK336p;T BVS 15$ ; VS -> no deferreds found. Deactivate ;JRK336m:T RETURN ; L00M€gugg´cÚµcÛ¶c�·c›’et I/O completion deactivate cache ;JRK336T15$: ;JRK336 T .ENDC ;CHEDFR ;JRK336 T ;JRK336n'U CALL CHEDAC ; Deactivate the cachecV20$:;W; BIT #VV$SET, I.PRM+2(R1) ; Is this a "clear" operation?3X; BEQ 30$ ; If EQ, yesY;1KZ; "Set" operations will activate the cache if auto-activation is selected [;e:\; BITB #XC.ENA, APR6.BASE+X.CSTS ; Automatic activation?*]; BEQ 30$ ; If EQ, no, pass to driver^;r(_; CALL CHEDUP ; Duplicate the packet3`; BCS 30$ ; If CS, lacking pool, don't activate5a; b; Context:c; R0 -> Duplicated I/O packet d; He; Prepare packet for queueing to driver, with internal I/O completion.f;$:g; MOV KINAR5, I.IOSB+2(R1) ; Setup internal I/O mappingAh; MOV #, I.IOSB+4(R1) ; Mark the internal I/O addresse-i; MOV R0, I.IOSB(R1) ; Point at duplicateBj;30$: +k CALLR $DRQRQ ; Queue it to the driver k ;JRK330ok .IFDF CHEDFR ;JRK336k ;JRK336 4kCLRUP: TST (SP)+ ; Pop return to IOFIN ;JRK336EkBACKUP: CALLR $BCKUP ; Back up the user PC to reissue I/O ;JRK330k ;JRK330rk .ENDC ;CHEDFR ;JRK330ll c7m .SBTTL + STCIIO - Internal I/O completion for VV$SETnn;l o; Passed:p; R3 -> I/O packet completing *q; I.IOSB -> Corresponding cache packet-r; I.PRM+P3, P4 := Driver completion status s; Returned: 't;;; N/A - control is passed in $IOFIN u;3 v; Action:CGw; If the VV$SET request is used to auto-activate the disk caching fortDx; the device then in order to validate that the medium is present,By; we must know the results of the VV$SET operation. To do this,@z; the above code duplicates the user's packet, and adjusts the?{; return status to cause us to be notified. The field I.IOSB>|; in the internal packet points us back to the original user<}; request. When we obtain the status of the operation, weA~; will attempt to activate the cache if the result was success.s=; The internal packet is deallocated, and the original usere;€; packet is completed ($IOFIN) with the internal packet'se �; status.e‚;l ƒ;STCIIO:;„; MOV I.PRM+P3(R3), R0 ; Get the driver completion statush…; MOV I.PRM+P4(R3), R1†;e>‡; MOV I.IOSB(R3),-(SP) ;Save the original I/O packet address-ˆ; CALL CHEDEP ;Delete the internal packeto5‰; MOV (SP)+,R3 ;Reload the original packet addressaŠ;f)‹; TSTB R0 ;Was the VV$SET successful?i0Œ; BMI 10$ ;No if MI; leave cache deactivated�;e5Ž; CALL CHEACT ;Else activate the cache for device �;10$: 6�; CALLR $IOFIN ;Complete original request and exit‘ %’ .SBTTL + LOCAL - VV$CHE processing “;G ”; Passed: •; R1 -> I/O packet!–; I.TCB -> TCB of issuing taskO/—; T.ST3 := T3.PRV indicates privileged taska˜;s ™; Returned:E'š;;; N/A - control is passed to $IOFIN ›;, œ; Action:h�;g&�LOCAL: MESAG$ CHEMSG,2 ;JRK330Ÿ ;**-1u.  MOV I.TCB(R1), R0 ; Get the TCB of issuer¡ BNE 5$ ; If EQ, got it¢ BPT ; Sanity checkc£5$:r4¤ BIT #T3.PRV, T.ST3(R0) ; Is the task privileged?"¥ BNE 10$ ; If NE, yes, accept¦5§ MOV #, I.PRM(R1) ; Setup return status-¨ BR 20$ ; Return status©10$:.ª CALL SUBFUN ; Go process the subfunction«;d<¬; Common local I/O completion occurs here. Offset I.PRM+0=­; will contain the primary status, and I.PRM+2 will contain )®; the secondary status (or byte count).B¯; 3°20$: MOV R1, R3 ; Establish context for $IOFINo°IOFIN: ;JRK330h+± MOV I.PRM(R3), R0 ; Set primary status /² MOV I.PRM+2(R3), R1 ; Set secondary status ³-´ CALL $IOFIN ; And complete this request µ RETURNu¶ .· .SBTTL SUBFUN - Cache-specific Subfunctions¸; ¹; Passed:tº; R1 -> I/O packet »; I.PRM+4 := Subfunction code¼;h ½; Returned:P¾; ¿; Action:a7À; This routine will process the various subfunctions: Á;d'Â; 1. DC$ENA - Enable cache processing:(Ã; 2. DC$DIS - Disable cache processing)Ä; 3. DC$AC00MˆgygäzgM{güfàýfáþfDATAT - Activate cache processingP+Å; 4. DC$DAC - Deactivate cache processingP%Æ; 5. DC$RCS - Read cache parameters$Ç; 6. DC$SCS - Set cache parameters'È; 7. DC$CSB - Clear statistics buffer &É; 8. DC$RSB - Read statistics bufferÊ; Ë; Notes:;Ì; The first two words of the parameter list are trash for7Í; the VV$CHE subfunction of IO.STC. They are used to ?Î; return the status to the calling routine (which will handlec?Ï; the call to $IOFIN for us). I.PRM+0 is the primary status,.>Ð; and I.PRM+2 is the secondary status. The dispatching codeAÑ; will initialize the words as and zero, respectively.DÒ; CÓSUBFUN: MOV #, I.PRM(R1) ; Set the default I/O status 'Ô CLR I.PRM+2(R1) ; Clear count wordÕ7Ö MOV I.PRM+4(R1), R0 ; Get the subfunction code (P3) ×#Ø CMP R0, #DC$ENA ; Enable cache? Ù BLO FUNBAD ; Bad parm if LOÚ BEQ FUNENA ; Yes if EQgÛ%Ü CMP R0, #DC$ACT ; Activate cache?tÝ BLO FUNDIS ; Disable if LO Þ BEQ FUNACT ; Activate if EQß'à CMP R0, #DC$RCS ; Read cache parms?e"á BLO FUNDAC ; Deactivate if LO"â BEQ FUNRCS ; Read parms if EQã)ä CMP R0, #DC$CSB ; Clear stats buffer?tå BLO FUNSET ; Set if LOCæ; BEQ FUNCSB ; Clear if EQç(è CMP R0, #DC$RSB ; Read stats buffer?é BEQ FUNRSB ; Read if EQê=ëFUNBAD: MOV #, I.PRM(R1) ; Set "bad parameters".ì BR FUNEXT ; Proceed to common exit pointíBîFUNPRI: MOV #, I.PRM(R1) ; Set "privilege violation"ïðFUNEXT: RETURNñ !ò .SBTTL + DC$ENA - Enable Cachesó;:ô; This function is simple, since it does not require any:õ; form of validation. It is merely used to set a statusö; bit.÷; FøFUNENA: BISB #XC.ENA, APR6.BASE+X.CSTS ; Set autoactivation on MOUnt ù BR FUNEXTú&û .SBTTL + DC$DIS - Disable the cacheü;O:ý; This function is simple, since it does not require any<þ; form of validation. It is merely used to clear a statusÿ; bit.;MHFUNDIS: BICB #XC.ENA, APR6.BASE+X.CSTS ; Clear autoactivation on MOUnt  BR FUNEXT h% .SBTTL + DC$DAC - Deactivate caches;i:; This function requires the cache to be flushed and all:; operations to be released to the driver. The "active"<; bit is cleared to indicate that the cache will no longer ; perform I/O for the user.s ;tE FUNDAC: BITB #XC.ACT, APR6.BASE+X.CSTS ; Is cache currently active?a1  BEQ FUNEXT ; If EQ, no, just return ;JRK336l  ;JRK336.  .IFDF CHEDFR ;JRK336  ;JRK336eH  BITB #X2.DEA,APR6.BASE+X.CST2; Is the Cache being deactivated ;JRK336>  BNE BACKUP ; Go back up this I/O until purge done ;JRK336  ;JRK336p  .IFTF ;CHEDFR ;JRK336i  ;JRK3367  CALL CHEPUR ; Purge cache of nodefer CEDs ;JRK336r  ;JRK336   .IFT ;CHEDFR ;JRK336  ;JRK336.6  BCS 20$ ; If CS, a deferred extent exists ;JRK336  ;JRK336   .IFTF ;CHEDFR ;JRK336  ;JRK336;? 10$: CALLR CHEDAC ; Deallocate the cache and return ;JRK336s  ;JRK336t  .IFT ;CHEDFR ;JRK336  ;JRK336 = 20$: CALL ELMCED ; Go eliminate the deferred CED ;JRK336R:  BCS CLRUP ; Pop return to IOFIN and backup PC ;JRK336<  BVS 10$ ; If VS, no deferreds at all, go $IOFIN ;JRK336>  MOV (SP),(SP)+ ; Remove return to IOFIN from stack ;JRK336  RETURN ;JRK336   ;JRK336   .ENDC ;CHEDFR ;JRK336  ;**-6 # .SBTTL + DC$ACT - Activate cache ;e ; Passed:c; UCBX mapped in APR6; ; R5 -> UCB;F ; Action: =; This function will activate cache for a device which doesm;; not have caching currently activated for it. Note that >; this operation can be used to "bypass" the "autoactivation;; on mount" bit (XC.ENA=1). In other words, if the cacheu<; is disabled for a device, DC$ACT can turn caching on for; ; the device regardless of the setting of XC.ENA. DC$ACT =!; will not change the setting of XC.ENA ei00M�gugg´cÚµcÛ¶c�·c›’ther. Therefore,s<"; a disk with autoactivation disabled will remain that way#; independent of DC$ACT.$;lD%; NOTE: This code checks the cache status initially, and no matter@&; how it is set, will set the "cache active" bit. (Therefore,?'; the first 2 lines are nonsense, but are included should one 8(; decide to do something spectacular after I've gone.));TB*FUNACT: BITB #XC.ACT, APR6.BASE+X.CSTS ; Cache already activate?)+ BNE 10$ ; If NE, yes - don't bother ,4- CALL CHEACT ;Activate the cache for this device/. BCS FUNPRI ;Privilege violation if failuren/*010$: BR FUNEXT ;Proceed to common exit1 s*2 .SBTTL + DC$RCS - Read cache parameters3;o>4; This function will return the current setting of the cache65; in the second status word of the I/O status block.6;B7FUNRCS: MOVB APR6.BASE+X.CSTS, I.PRM+2(R1) ; Set the status bits 8 BR FUNEXT9): .SBTTL + DC$SET - Set cache parameters?;;B <; Passed:f=; UCBX mapped in APR6D>; X.CSTS := XC.ACT indicates unit is active (in terms of caching)4?; X.CPCB -> PCB of region unit is caching through@; A; R1 -> I/O packetB; I.PRM+6 := Set parametersa$C; I.PRM+10 -> Cache partition PCBD; I.PRM+12 -> Extent limitsE; F; Returned:G; R1 -> I/O packet#H; I.PRM, +2 := Completion statusI;R J; Action:.JK; This function will set the lower cache status bits of the X.CSTS byte.L;SFM; The high bit of the word indicates that the partition PCB has beenBN; passed in parameter 5 and which should be plugged into X.CPCB.O; P; Note:>EQ; To enable/disable and activate/deactivate cache use corresponding R; subfunction codes.S;'SFUNSET: MESAG$ SETMSG,3 ;JRK336 U ;**-1 -V MOV I.PRM+6(R1), R0 ; Get the status bitskWXWVALID= ;JRK328 YINVALID=^C ;**-1Z,[ BIT #INVALID, R0 ; Invalid bits in here?/\ BNE FUNBAD ; Return "bad parameters" errori]] .IFDF CHEDFR ;JRK336] ;JRK336A] BITB #XC.DFR,R0 ; Is deferred writes on in new values ;JRK336 .] BEQ 15$ ; If EQ, no, don't worry ;JRK336;] BITB #XC.DAT,R0 ; Is virtual turned on as well ;JRK336 /] BEQ FUNBAD ; If EQ, no, disallow ;JRK336]15$: ;JRK336$] .IFTF ;CHEDFR ;JRK336X] ;JRK336FD^ MOV I.PRM+10(R1), R0 ; Get address of requested cache PCB ;DPR015_ ;DPR015rA` BITB #XC.ACT, APR6.BASE+X.CSTS ; Is current PCB address bound?C$a BNE 19$ ; If NE, yes ;DPR015b ;DPR015,0c MOV R0, APR6.BASE+X.CPCB ; Load into the UCBXd BR 20$ ;DPR015e19$: ;DPR0154f BIT #DC$PAR, R0 ; User specify a partition name?,g BEQ 20$ ; If EQ, no, don't look for oneh@i CMP R0, APR6.BASE+X.CPCB ; Do they match each other? ;DPR015&j BNE FUNPRI ; If NE, no ;DPR015k20$:k .IFT ;CHEDFR ;JRK336k ;JRK336 Gk MOVB APR6.BASE+X.CSTS,-(SP) ; Save the old parameter values ;JRK336uk ;JRK336 k .IFTF ;CHEDFR ;JRK336 k ;JRK336A8l MOV R1, -(SP) ; Save the I/O packet address ;DPR020Fm MOV I.PRM+12(R1), R0 ; Get virtual address of extent limits ;DPR0207n MOV #5, R1 ; Length of extent limit table ;DPR020e+o CALL $ACHKB ; Address check ;DPR020a%p BCC 21$ ; If CC, okay ;DPR020 q ;DPR02007r MOV (SP)+, R1 ; Restore I/O packet address ;DPR020J<s BR FUNBAD ; Otherwise part not in virtual space ;DPR020t21$: ;DPR020 :u CALL $RELOC ; Calculate parameters for $BLXIO ;DPR020v; ;DPR020w; Context: ;DPR020>x; R1 := Physical addess of table in 32-word blocks ;DPR0200y; R2 := Offset of table, bias APR6 ;DPR020z; ;DPR0207{ MOV #5, R0 ; Length of extent limit table ;DPR0205| SUB #20000, R2 ; Change into APR5 offset ;DPR020R6} MOV KISAR6, R3 ; Physical address of UCBX ;DPR020I~ MOV #APR6.BASE+X.XDAT, R4 ; Offset of table in UCBX, bais APR6 ;DPR020:00M˜gygäzgM{güfàýfáþfDATA CALL $BLXIO ;DPR020L7€ MOV (SP)+, R1 ; Restore I/O packet address ;DPR020 �;P ‚; Note:o8ƒ; DC$PAR bit is ignored by following byte instruction.„;2=… BICB #VALID, APR6.BASE+X.CSTS ; Clear original status bits ;† BISB I.PRM+6(R1), APR6.BASE+X.CSTS ; Set new status bitsx† ;JRK336R† .IFT ;CHEDFR ;JRK336† ;JRK336DC† BITB #XC.DFR,(SP)+ ; See if defers were on in old setup ;JRK336V1† BEQ FUNEXT ; If EQ, no, continue on ;JRK336aJ† BITB #XC.DFR,APR6.BASE+X.CSTS; Are they turned off in new setup ;JRK3361† BNE FUNEXT ; If NE, no, continue on ;JRK336H† BITB #X2.DEA,APR6.BASE+X.CST2; Are deferred CEDs being purged ;JRK336?† BNE FUNEXT ; If NE, yes, don't need to start again ;JRK336+0† CALL ELMCED ; Purge deferred CEDs ;JRK336*† BCC 30$ ; If CC, successful ;JRK3367† BVC 40$ ; If VS, allocation failure, crash ;JRK336e6† BPT ; Failure here will cause corruption ;JRK336;†30$: BVS 40$ ; If VS, no deferreds at all, exit ;JRK336S=† TST (SP)+ ; Return to $QOPDN. DFRIOC will handle ;JRK336X† ;JRK336i† .ENDC ;CHEDFR ;JRK336,† ;JRK336 †40$: RETURN ;JRK3363ˆ +‰ .SBTTL + DC$RSB - Read statistics bufferrŠ;i ‹; Passed:Œ; UCBX mapped in APR6f�; Ž; R1 -> I/O packet.�; I.PRM+6 -> User buffer (virtual address)$�; I.PRM+10 -> Size of user buffer‘;3 ’; Returned: “;r ”; Action:a7•; This function will return the contents of the cacher:–; statistics buffer for a particular device. The caller5—; must pass the address and length of his buffer in:˜; parameters 5 and 6 (respectively). The user's context9™; is currently loaded, and $ACHCK is called to validatet8š; the buffer. The buffer could be any size smaller or8›; equal to the stats buffer. It should NOT be allowed3œ; to be larger, since this will allow him to read 8�; either the rest of secondary pool, or off the end of8ž; secondary pool (into a task, common, or non-existent:Ÿ; memory). Nonexistent memory (odd addresses) in kernel ; mode spells instant doom. ¡;u9¢; $BLXIO will be used to teleport the stats buffer froms(£; secondary pool to the user's buffer.¤;s@¥; NOTE: $ACHCK is used instead of $CKBFx because the operation9¦; will be completed immediately (while the user remains 8§; loaded). $RELOC is called to create the context for ¨; $BLXIO (address doubleword).©;y<ªFUNRSB: TST APR6.BASE+X.CSBA ;Statistics buffer available?.« BEQ FUNPRI ;No buffer if EQ; return error¬+­ MOV R1,-(SP) ;Save the packet's address ®7¯ MOV I.PRM+6(R1),R0 ;Load the user's virtual address 6° MOV I.PRM+10(R1),R1 ;Load the user's buffer length1± CALL $ACHCK ;Address check loaded user spaceB/² BCC 5$ ;Address check failed, return errorm³&´ MOV (SP)+,R1 ;Get packet's address1´ JMP FUNBAD ;Return "bad parameters" ;JRK330¶5$: ;**-13· CALL $RELOC ;Now create the address doublewords.¸ MOV R1, R3 ;Prepare parameters for $BLXIO ¹ MOV R2, R4nº+» MOV (SP),R1 ;Get back packet's addressd7¼ MOV I.PRM+10(R1),R0 ;Get the count of bytes to movea½2¾ CMP R0,#S.SIZE ;User want more than available?%¿ BLOS 10$ ; If LOS, no, accept ith&À MOV #S.SIZE,R0 ;Else enforce limitÁ10$:- MOV R0,I.PRM+2(R1) ;Return the byte count;:à MOV APR6.BASE+X.CSBA,R1 ;Get statistics buffer APR bias+Ä MOV #APR5.BASE,R2 ;Set the displacementR0Å CALL $BLXIO ;Transfer the statistics bufferÆ(Ç MOV (SP)+,R1 ;Packet's address to R11Ç JMP FUNEXT ;Proceed to common exit ;JRK330 É ;**-1P,Ê .SBTTL + DC$CSB - Clear statistics bufferË;,Ì; This function maps the statistics buffer%Í; (if any) and fills it with nulls.tÎ;8Ï; The statistics buffer is allocated in secondary pool4Ð; and is a single 32-word block of 16 doublewords.Ñ;B5Ò; NOTE: Access to the UCBX is lost by this routine!,6Ó; There is currently no reason to save (reload) this/Ô; address since the UCBX is no longer needed.tÕ;d ÖFU00M gugg´cÚµcÛ¶c�·c›’NCSB:>×; MOV APR6.BASE+X.CSBA,KISAR6 ;Map statistics buffer in APR60Ø; BEQ 20$ ;Ooops, statistics buffer not hereÙ;&Ú; MOV #APR6.BASE,R0 ;Point R0 to it.Û; MOV #S.SIZE/4,R3 ;Count of cells to clear)Ü;10$: CLR (R0)+ ;Clear out first wordt&Ý; CLR (R0)+ ;Clear out second word%Þ; SOB R3, 10$ ;More to clear out?Bß; +à;20$: BR FUNEXT ;Proceed to common exitiá â .SBTTL Partition routines=ã .SBTTL + VALPCB - Validate a partition given a PCB addresseä;d å; Passed:æ; R0 -> PCB to validate+ç;A è; Returned:aé; CC: PCB is validê; CS: PCB is not validë;i2ìVALPCB: MOV R1,-(SP) ; Work register (main PCB)*í MOV R2,-(SP) ; Work register (sub PCB)î%ï MOV #$PARHD,R1 ; Get PCB listheadr+ð10$: MOV (R1),R1 ; Get a main partitions ñ BEQ 40$ ; End of list if EQò4ó MOV R1,R2 ; Use R2 to run through subpartitions/ô20$: MOV P.SUB(R2),R2 ; Get the next sub PCBõ BEQ 10$ ; Isn't one if EQö!÷ CMP R0,R2 ; Does this match? 'ø BNE 20$ ; If NE, no - try next oneAù8ú BIT #PS.COM, P.STAT(R2) ; Is this a common partition?û BEQ 40$ ; If EQ, noü4ý BIT #P2.CHE,P.ST2(R2) ;Is this a cache partition?3þ BEQ 40$ ;No if EQ; don't activate caching thenBÿ0 TST (PC)+ ; Match in PCB address, return CC#40$: SEC ; No match, return CS MOV (SP)+,R2U MOV (SP)+,R1u  RETURNs 0  .SBTTL Cache control routines2  .SBTTL + CHEDAC - Deactivate cache for a device ;, ; Passed:h ; UCBX mapped in APR6; ;E ; Action:x:; This routine will deactivate caching for a device with<; caching activated. Deactivation involves the marking of9; the UCBX accordingly, and the "detaching" of the UCBX'>; from the cache partition (The resident mapped count in the:; PCB [P.RMCT] is used by the cacher as the mechanism to&; lock down cache data partitions.).;R8CHEDAC: BICB #XC.ACT, APR6.BASE+X.CSTS ; Deactivate it ;JRK330h: MESAG$ DEAMSG,25.,20,<<14,#140000+X.DNAM,4>> ;JRK330> MOV APR6.BASE+X.CPCB, R0 ; Get the PCB address of cache par/ DECB P.RMCT(R0) ; Detach from the partitionv0 BNE 5$ ; If NE, other devices still caching: BIC #P2.LMA, P.ST2(R0) ; Otherwise this is the last one5$:e' MOV R1, -(SP) ; Save packet addressC9 MOV APR6.BASE+X.CSBA, R1 ; Get cache statistics buffer   BEQ 10$ ; None if EQ!3" ADD #P.CSBA, R0 ; Calculate address of listhead # CALL $GTSPK!$ BCC 6$ ; If CC, sanity check<% BPT&6$:A)' TST (R0)+ ; Is list empty? ;DPR015C"( BNE 7$ ; If NE, no ;DPR0157) CLR (R0) ; P.DPCB must be null when REMing ;DPR015v*7$: ;DPR015-+ MOV R1, R0 ; Prepare parameter to $DESECT,:-SECSIZE= /100 ; Size of CSB in secpol blocks0. MOV #SECSIZE, R1 ; Set size for deallocation3/ CALL $DESEC ; Deallocate secondary pool buffern041 CLR APR6.BASE+X.CSBA ; Initialize the CSB pointer2.310$: MOV (SP)+, R1 ; Pop I/O packet address 4 RETURN5 06 .SBTTL + CHEACT - Activate cache for a device7;B 8; Passed:N9; UCBX mapped in APR6(:; ;; Returned:e<; R0 := Contents lostv=;$ >; Action:P;?; This routine will attempt to activate the cache for theE>@; device. If the UCBX specifies a PCB, it will be validated%A; if it is valid then the map countn@B; of the partition (P.RMCT) will be incremented, and the cacheC; activated for the device.tD;B;ECHEACT: BITB #XC.ACT,APR6.BASE+X.CSTS ;Already activated?,F BNE 30$ ;Yes if NE; don't do this againG/H MOV APR6.BASE+X.CPCB,R0 ;Get the PCB addressp/I BEQ 30$ ;None present if EQ; can't startuptJ(K CALL VALPCB ;Validate the partition,L BCS 30$ ;Failed if CS; skip the startupM:M MESAG$ ACTMSG,26.,20,<<14,#140000+X.DNAM,4>> ;JRK330M ;JRK330t0N INCB P.RMCT(R0) ;Attach us to this partition:O BIS #P2.LMA, P.ST2(R0) ; Don't let partition be removedP2Q MOV R0, R3 ;Save PCB address in safe registerR%S MOV R1,-(SP) ;Save packet address;#T M00M¨gygäzgM{güfàýfáþfDATAOV #SECSIZE,R1 ;Set size in R1.)U CALL $ALSEC ;Allocate secondary poolQV BCS 25$ ;Couldn't if CSW;t X; Context:Y; R0 -> Newly allocated blockiZ;C[ MOV R0,APR6.BASE+X.CSBA ;Set the cache statistics buffer address.<\ MOV #</2>,R1 ;Size for initialization to zeroes'] MOV KISAR6,-(SP) ;Save UCBX mappingr%^ MOV R0,KISAR6 ;Map the new buffer')_ MOV #APR6.BASE,R0 ;Set up its addressR)`23$: CLR (R0)+ ;Initialize the buffera SOB R1, 23$ ;loopb,c MOV R3, R0 ;Prepare parameter to $QSPIF6d ADD #P.CSBA, R0 ;Calculate the stat block listhead-e MOV KISAR6, R1 ;Point at new block to add0/f CALL $QSPIF ;Add it to the end of the listBg-h MOV R5, APR6.BASE+S.UCB ;Point back to UCB.)i MOV (SP)+,KISAR6 ;Reload UCBX mappingaj25$:/k MOV (SP)+,R1 ;Get back saved packet addressnk .IFDF CHEDFR ;JRK330k ;JRK330PJk BICB #X2.DEA,APR6.BASE+X.CST2; Indicate no cache purge going on ;JRK330k ;JRK330ok .ENDC ;CHEDFR ;JRK330pk ;JRK330Fl BISB #XC.ACT,APR6.BASE+X.CSTS ;Cache is now activated and PCB boundm(n30$: RETURN ;All done in validationo -p .SBTTL + CHEPUR - Purge cache for a device.q;S r; Passed:a s; R5 -> UCBMt;P u; Returned:ov; All registers preservedM6v; CC: All extents successfully eliminated ;JRK330@v; CS: At least one deferred extent was found in list ;JRK330w;.Cx; This routine will delete the cache partition of all extents fory; the specified device.Kz;O{; NOTE: Extents with I/O in progress will be deleted when during internal I/Od|; completion.};RC~; NOTE: This routine is always entered with mapping into the UCBXc9; in APR6. It requires access to both the UCBX and the=€; partition's pool area. The UCBX should be restored priort �; to exit.‚;i>‚CHEPUR: CLR -(SP) ; Clear the deferred extent flag ;JRK330‚ ;JRK330:‚ MESAG$ PURMSG,27.,20,<<14,#140000+X.DNAM,4>> ;JRK330‚ ;JRK330 J‚ MOV APR6.BASE+X.CCED, R0 ; Get the first extent in the LBN list ;JRK3302„ BEQ 60$ ; If EQ, there are none at all ;**-1…*† CALL MAPPAR ; Map the cache partition‡‡30$: ;JRK330 ‡ .IFDF CHEDFR ;JRK330‡ ;JRK3307‡ SEC ; Assume this will be deferred extent ;JRK330 ?‡ BITB #ES.WDF,E.STAT(R0) ; Is this a deferred extent ;JRK330e#‡ BEQ 40$ ; If EQ, no ;JRK330 9‡ ROL (SP) ; Indicate a deferred extent exists ;JRK330 2‡ BR 50$ ; Skip the delete of this one ;JRK330‡ ;JRK330s‡ .ENDC ;CHEDFR ;JRK330‡ ;JRK330 2‡40$: CALL FRECED ; Eliminate the CED ;JRK330‰ ;**-1i@‰50$: MOV E.LNXT(R0),R0 ; Get next extent in LBN list ;JRK3309‹ BNE 30$ ; If NE, got another - keep on looping ;**-1eŒ!� CALL MAPUCB ; Remap the UCBX.Ž>Ž60$: ROR (SP)+ ; Pop the deferred extent indicator ;JRK330Ž RETURN ;JRK330PŽ ;JRK330rŽ .PAGE ;JRK3303Ž .SBTTL WRITE DEFERRED I/O OPERATIONS ;JRK330@Ž .SBTTL + ELMCED - Write data in deferred CED to disk ;JRK330Ž; ;JRK336WŽ; ELMCED - Routine to initiate first deferred extent to disk for deactivation ;JRK336 Ž; ;JRK336Ž; Inputs: ;JRK336;)Ž; R1 - I/O packet address ;JRK336e+Ž; R5 - UCB address of device ;JRK336Ž; Outputs: ;JRK336EŽ; CC - I/O packet queued to driver to write data in extent ;JRK336 DŽ; VC - Deferred extent found and original I/O bound over ;JRK336HŽ; VS - No deferreds found, original I/O can be sent to $IOFIN ;JRK336JŽ; CS - Original I/O should be backed up due to no primary pool ;JRK336AŽ; for duplicate I/O packet allocation, because purge ;JRK3363@Ž; already in effect, or deferred CEDs exist but are ;JRK336<Ž; being written out as part of age list dropoff ;JRK3368Ž; VC - Error due to deferred still existing ;JRK3364Ž; VS - Allocation error for I/O packet ;JRK336Ž; ;JRK336Ž; ;JRK336SŽ; This routi00M°gugg´cÚµcÛ¶c�·c›’ne assumes that it is being called to eliminate all deferred ;JRK336SŽ; CEDs for this device. A single internal I/O packet is created and the ;JRK336 UŽ; first deferred CED is written to disk with an I/O completion routine that ;JRK336eRŽ; finds the next in line and issues a write for that CED. This process ;JRK336TŽ; continues to look for other deferred CEDs that are not in the process of ;JRK336OŽ; being written out until no more are found. During this time, the ;JRK3366YŽ; "defers being purged" bit X2.DEA is set to indicate the process is in effect. ;JRK336 UŽ; During this time, no write operations are allowed if any CED overlaps the ;JRK336iXŽ; region and reads are allowed for virtual operations even if that support was ;JRK336UŽ; turned off. Setting X2.DEA may be from a "SET characteristics" operation ;JRK336eVŽ; or from a total deactivation request. In either case, this routine should ;JRK336TŽ; only be activated once. Any further requests should simply return since ;JRK336TŽ; the first invocation will cause the final desired action and a parallel ;JRK336RŽ; operation with a new I/O packet will set up a race condition to clear ;JRK336UŽ; X2.DEA in the final I/O completion routine. This could leave a deferred ;JRK336uQŽ; CED in the process of being written out with the bit cleared. If a ;JRK336TŽ; read request came through in that case, it could go to the disk instead ;JRK336UŽ; the correct extent. If a deferred extent is found and a duplicate packet ;JRK336VŽ; allocated, the original I/O packet address is bound over to the completion ;JRK336UŽ; routine for the final deallocation of the cache and the completion of the ;JRK336DTŽ; original I/O. If this routine returns with a CS or a CC/VS combination, ;JRK336HŽ; the original I/O should be handled in the appropriate way. ;JRK336Ž; ;JRK336mŽ .IFDF CHEDFR ;JRK336Ž ;JRK336aŽELMCED: ;JRK336=Ž MOV KISAR6,-(SP) ; Save mapping register to UCBX ;JRK336J6Ž MOV R5,-(SP) ; Save original UCB address ;JRK3362Ž MOV R1,-(SP) ; Save R1 across routine ;JRK336Ž ;JRK336aNŽ BITB #X2.DEA,APR6.BASE+X.CST2; See if deferred purge already active ;JRK3368Ž BEQ 30$ ; If EQ, no, go look for a deferred ;JRK336Ž ;JRK336O5Ž10$: SEC ; Assume I/O must be backed up ;JRK3364Ž20$: MOV (SP)+,R1 ; Restore original R1 ;JRK336;Ž MOV (SP)+,R5 ; Restore the original UCB address ;JRK336R7Ž MOV (SP)+,KISAR6 ; Restore mapping to UCBX ;JRK336VŽ RETURN ;JRK336UŽ ;JRK336NŽ30$: MOV APR6.BASE+X.CCED, R0 ; Get the first extent in the LBN list ;JRK3364Ž BEQ 55$ ; If EQ, no extents to process ;JRK3369Ž CLR -(SP) ; Save flag for unusable deferreds ;JRK336 3Ž CALL MAPPAR ; Map the cache partition ;JRK336 EŽ40$: BITB #ES.WDF,E.STAT(R0) ; See if this one is deferred ;JRK336e#Ž BEQ 50$ ; If EQ, no ;JRK336RFŽ BITB #ES.WIP,E.STAT(R0) ; Is the extent already in progress ;JRK336*Ž BEQ 60$ ; If EQ, no, use it ;JRK3367Ž MOV R0,(SP) ; Store CED for flag purposes ;JRK336A;Ž50$: MOV E.LNXT(R0),R0 ; Point to the next one ;JRK3360Ž BNE 40$ ; Go back and check it out ;JRK3369Ž TST (SP)+ ; See if any transition deferreds ;JRK33634Ž BNE 10$ ; If NE, there, cause a backup ;JRK336Ž ;JRK336D4Ž55$: MOV (SP)+,R1 ; Restore original R1 ;JRK336;Ž MOV (SP)+,R5 ; Restore the original UCB address ;JRK336R7Ž MOV (SP)+,KISAR6 ; Restore mapping to UCBX ;JRK336$+Ž CLC ; Indicate no deferreds ;JRK336SŽ SEV ; ;JRK336Ž RETURN ;JRK336MŽ ;JRK336oŽ ;JRK336 <Ž60$: TST (SP)+ ; Get rid of excess stack context ;JRK336AŽ MOV E.UCB(R0),R5 ; Get UCB address from CED for write ;JRK336$:Ž CALL $CRDFR ; Allocate and fill in I/O packet ;JRK3361Ž BCS 70$ ; If CS, allocation failure ;JRK336;JŽ MOV KINAR5,I.IOSB+2(R1) ; Set up internal I/O completion address;JRK336+Ž MOV #DFRIOC!1,I.IOSB+4(R1) ; ;JRK336KBŽ BISB #ES.00M¸gygäzgM{güfàýfáþfDATAWIP,E.STAT(R0) ; Indicate a write-in-progress ;JRK336CŽ INCB E.PCNT(R0) ; Tie down extent to prevent going away ;JRK336 BŽ MOV (SP),I.AADA+2(R1) ; Put original I/O packet in fake ;JRK336Ž ;JRK336)MŽ MESAG$ DFRMSG,28.,,<,> ;JRK336 Ž ;JRK336tŽ .IF DF CHESAN ;JRK336lŽ ;JRK336K7Ž CALL .CKSAN ; See if sanity buffers match ;JRK336mŽ ;JRK3366Ž .ENDC ;JRK336Ž ;JRK336:Ž CALL $DRQRQ ; Initiate the I/O for the extent ;JRK336Ž ;JRK336T0Ž MOV (SP)+,R1 ; Restore original R1 ;JRK336;Ž MOV (SP)+,R5 ; Restore the original UCB address ;JRK336a7Ž MOV (SP)+,KISAR6 ; Restore mapping to UCBX ;JRK336.NŽ BISB #X2.DEA,APR6.BASE+X.CST2; Indicate starting to purge deferreds ;JRK336+Ž CLC ; Indicate no deferreds ;JRK336JŽ RETURN ;JRK336SŽ ;JRK336m4Ž70$: MOV (SP)+,R1 ; Restore original R1 ;JRK336;Ž MOV (SP)+,R5 ; Restore the original UCB address ;JRK336h7Ž MOV (SP)+,KISAR6 ; Restore mapping to UCBX ;JRK336V0Ž SEV ; Indicate allocation failure ;JRK336Ž RETURN ;JRK336iŽ ;JRK330KGŽ .SBTTL + DFRIOC - I/O completion routine for deferred extent ;JRK330XŽ; ;JRK330UŽ; DFRIOC - Routine to complete processing after a deferred extent has been ;JRK330K"Ž; written to disk ;JRK330Ž; ;JRK330Ž; Inputs: ;JRK330o)Ž; R3 - I/O packet address ;JRK330sŽ; ;JRK330ŽDFRIOC: ;JRK3309Ž MOV I.UCB(R3),R5 ; Get UCB address of device ;JRK330 7Ž MOV I.AADA(R3),R0 ; Point to affected CED ;JRK330JŽ ;JRK330J6Ž CALL MAPPAR ; Map to the cache partition ;JRK330Ž ;JRK3303MŽ MESAG$ DFRCOM,29.,,<,> ;JRK330eŽ ;JRK330nDŽ BICB #ES.WIP,E.STAT(R0) ; Clear the write-in-progress bit ;JRK330GŽ BICB #ES.WDF,E.STAT(R0) ; Indicate extent no longer deferred ;JRK330>Ž DECB E.PCNT(R0) ; Untie the extent for elimination ;JRK330;Ž MOV E.LNXT(R0),-(SP) ; Save pointer to next CED ;JRK3303Ž ;JRK330c@Ž CALL FRECED ; Delete the CED if not tied down still ;JRK330Ž ;JRK330 3Ž MOV (SP)+,R0 ; Get address of next CED ;JRK330<,Ž10$: BEQ 30$ ; If EQ, all done ;JRK330HŽ BITB #ES.WDF,E.STAT(R0) ; Is it deferred or waiting for other ;JRK330Ž BNE 20$ ;JRK3300<Ž15$: MOV E.LNXT(R0),R0 ; Get address of next CED ;JRK330.Ž BR 10$ ; Go back to check it out ;JRK330Ž ;JRK330;Ž20$: ;JRK330,CŽ BITB #ES.WIP,E.STAT(R0) ; Is this already being written ;JRK336C,Ž BNE 15$ ; If NE, yes, skip it ;JRK336Ž ;JRK336 MŽ MESAG$ DFRMSG,28.,,<,> ;JRK330QŽ ;JRK330o>Ž MOV R0,I.AADA(R3) ; Keep pointer to CED in packet ;JRK330Ž ;JRK3300<Ž INCB E.PCNT(R0) ; Tie down the CED for writeout ;JRK330DŽ MOV E.LBNL(R0),I.PRM+P5(R3) ; Get LSP of LBN to write to ;JRK330<Ž BISB E.LBNL-1(R0),I.PRM+P4(R3) ; Get MSP of LBN ;JRK330Ž ;JRK330;?Ž MOVB E.SIZE(R0),R2 ; Get size of transfer in blocks ;JRK330e0Ž ASH #9.,R2 ; Turn that into bytes ;JRK330@Ž MOV R2,I.PRM+P2(R3) ; Put byte value into I/O packet ;JRK330Ž ;JRK330J4Ž MOV R3,R4 ; Save address of I/O packet ;JRK3307Ž MOV #APR6.BASE,R2 ; Get APR6 displacement ;JRK330)?Ž MOV E.PHYA(R0),R1 ; Get APR bias of start of buffer ;JRK330R@Ž CALL $MPPHY ; Map to physical address if NPR device ;JRK330:Ž MOV R1,I.PRM+P1.1(R4) ; Move MSP to I/O packet ;JRK330:Ž MOV R2,I.PRM+P1.2(R4) ; Move LSP to I/O packet ;JRK3307Ž MOV R4,R1 ; Restore pointer to I/O packet ;JRK3303Ž ;JRK3302Ž .IF DF CHESAN ;JRK336aŽ ;JRK336 Ž CALL .CKSAN ;JRK336SŽ ;JRK336cŽ .ENDC ;JRK336Ž ;JRK336d;Ž CALLR $DRQRQ ; Initiate the I/O for the extent ;JRK330oŽ ;JRK330KHŽ30$: MOV I.AADA+2(R3),-(SP) ; Sa00MÀgNÃgg´cÚµcÛ¶c�·c›’ve original I/O packet address ;JRK330=Ž CALL CHEDEP ; Deallocate the internal I/O packet ;JRK330V*Ž CALL MAPUCB ; Map the UCBX ;JRK330FŽ BICB #X2.DEA,APR6.BASE+X.CST2; Indicate done purging cache ;JRK336?Ž MOV (SP),R3 ; Get back original I/O packet address ;JRK336JAŽ MOV I.PRM+4(R3),R3 ; Get function code for this purge ;JRK336N:Ž CMP #DC$SET,R3 ; Was it due to a SET function ;JRK336<Ž BEQ 40$ ; If EQ, yes, skip deactivation of cache;JRK3361Ž CALL CHEDAC ; Deallocate the cache ;JRK330/7Ž40$: MOV (SP)+,R3 ; Get original I/O packet ;JRK330h@Ž CALLR IOFIN ; Go get status codes and return packet ;JRK330Ž ;JRK330.Ž .ENDC ;CHEDFR ;JRK330n� g!‘ .IF DF CHEDBG ;Debugging aids 4’ .SBTTL *** DEBUG *** Module contains data strings!“STCMSG: .ASCIZ <15><12>"IO.STC"o”CHEMSG: .ASCIZ " - VV$CHE"•SETMSG: .ASCIZ " - DC$SET"J–ATTMSG: .ASCIZ <15><12>"DCM -- [DCCTL] PURGE FAILURE - CED ATTACHED"<15>– ;JRK330 J–DFRMSG: .ASCIZ <15><12>" - Deferred extent written to disk" ;JRK330I–DFRCOM: .ASCIZ <15><12>"Deferred extent I/O write completion" ;JRK330 =–DEAMSG: .ASCIZ <15><12>"Cache being deactivated" ;JRK330J<–ACTMSG: .ASCIZ <15><12>"Cache being activated" ;JRK3309–PURMSG: .ASCIZ <15><12>"Cache being purged" ;JRK330<— .EVEN˜ .ENDC ; .IF DF CHEDBG™š .ENDC ; .IF DF D$$CHE› .END"J–ATTMSG: .ASCIZ <15><12>"DCM -- [DCCTL] PURGE FAILURE - CED ATTACHED"<15>– ;JRK330 J–DFRMSG: .ASCIZ <15><12>" .TITLE DRMKT> .IDENT /08.00/;N; COPYRIGHT (C) 1987 BY.!; DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;D>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; D. N. CUTLER 5-SEP-73C ; ; PREVIOUSLY MODIFIED BY:U ;H; B. S. MCCARTHY; J. W. BERZLE; C. B. PETROVIC; J. R. KAUFFMAN;C; MODIFIED BY:; ; J. W. BERZLE 6-NOV-86 08.002;!-; JWB186 -- SAVE UIC AROUND CALL TO $CRCTX ;0 ; MARK TIME AND RUN DIRECTIVES ;!; MACRO LIBRARY CALLSR";#$ .MCALL CLKDF$%& .IF DF N$$DIRF'( .MCALL LNMDF$))* LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETSY+, .ENDC ;DF N$$DIRE-5. CLKDF$ ;DEFINE CLOCK QUEUE CONTROL BLOCK OFFSETS/0;+1; **-$DRMKT-MARK TIMEH2; K3; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DECLARE A SIGNIFICANT EVENT AT AC&4; SPECIFIED INTERVAL FROM INSSUANCE.5;N6; DPB FORMAT:!7; $8; WD. 00 -- DIC(23.),DPB SIZE(5.).89; WD. 01 -- EVENT FLAG NUMBER OF EVENT FLAG TO BE SET.&:; WD. 02 -- TIME INTERVAL MAGNITUDE.";; WD. 03 -- TIME INTERVAL UNITS.&<; WD. 04 -- AST ENTRY POINT ADDRESS.=;TE>; IF AN EVENT FLAG IS SPECIFIED, THEN IT IS CLEARED AT ISSUANCE ANDL-?; SET AT THE TIME OF THE SIGNIFICANT EVENT. @;RAA; IF AN AST ENTRY POINT IS SPECIFIED, THEN AN ASYNCHRONOUS TRAPC@B; WILL OCCUR AT THE TIME OF THE SIGNIFICANT EVENT. PS, PC, THE>C; DIRECTIVE STATUS WORD, AND THE SPECIFIED EVENT FLAG NUMBER<D; ARE PUSHED ONTO THE TASK STACK WHEN THE AST IS EFFECTED.E; F; INPUTS: G;IH; R0=EVENT FLAG MASK WORD.I; R1=EVENT FLAG MASK ADDRESS. ;J; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ,K; R3=ADDRESS OF THE THIRD WORD IN THE DPB.1L; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK..M; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.N;S<O; OUTPUTS: (DIRECTIVE STATUS AND PS WORD RETURNED TO TASK)P;N/Q; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.E(R; DIRECTIVE STATUS OF +1 IS RETURNED.!S; C=1 IF DIRECTIVE IS REJECTED. <T; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF INSUFFICIENT6U; CORE IS AVAILABLE TO ALLOCATE CLOCK QUEUE ENTRY.V;-W X .ENABL LSBO2Y$DRMKT::MOV -2(R3),-(SP) ;SAVE EVENT FLAG NUMBER-Z MOV R1,-(SP) ;SAVE EVENT FLAG MASK ADDRESS 4[ BIC #1,R1 ;CLR GRP GLOBAL EFN 2ND WORD INDICATOR!\ BIC R0,(R1) ;CLEAR EVENT FLAGI#] MOV R0,R4 ;SAVE EVENT FLAG MASKO,^ CALL $CVRTM ;CONVERT TIME TO CLOCK TICKS-_ MOV R0,-(SP) ;SAVE HI00NÈgygäzgM{güfàýfáþfDATAGH ORDER PART OF TIMES,` MOV R1,-(SP) ;SAVE LOW ORDER PART OF TIME%a MOV R4,-(SP) ;SAVE EVENT FLAG MASKE)b CLR R4 ;SET TYPE OF CLOCK QUEUE ENTRYAcde .IF DF S$$LIBf,g MOV (R3),R2 ;GET AST ENTRY POINT ADDRESS2h CALL $CALTA ;CALCULATE PROPER ADDRESS TO STORE-i MOV R2,-(SP) ;SAVE AST ENTRY POINT ADDRESS jk .IFFAl/m MOV (R3),-(SP) ;SAVE AST ENTRY POINT ADDRESSTno .ENDCpqrs .IF DF A$$CNTt5u CALL $ALCLK ;ALLOCATE A CLOCK QUEUE CONTROL BLOCK( v BR 25$ ;wx .IFFFy z BR 20$ ;{| .ENDC}~€;+�; **-$DRRUN-RUN TASK‚;NGƒ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO GENERATE A CLOCK QUEUE ENTRYDB„; TO CAUSE A TASK TO BE REQUESTED AT A SPECIFIED DELTA TIME FROM?…; ISSUANCE AND TO OPTIONALLY REPEAT THE REQUEST PERIODICALLY. †;N‡; DPB FORMAT: ˆ;&‰; WD. 00 -- DIC(17.),DPB SIZE (11.).&Š; WD. 01 -- FIRST HALF OF TASK NAME.'‹; WD. 02 -- SECOND HALF OF TASK NAME.A?Œ; WD. 03 -- PARTITION NAME-NOT SUPPORTED BUT MUST BE PRESENT.?�; WD. 04 -- PARTITION NAME-NOT SUPPORTED BUT MUST BE PRESENT.$AŽ; WD. 05 -- REQUEST PRIORITY-NOT SUPPORTED BUT MUST BE PRESENT.N�; WD. 06 -- REQUEST UIC.#�; WD. 07 -- DELTA TIME MAGNITUDE.T‘; WD. 10 -- DELTA TIME UNITS. ,’; WD. 11 -- RESCHEDULE INTERVAL MAGNITUDE.(“; WD. 12 -- RESCHEDULE INTERVAL UNITS.”; •; INPUTS:I–;)7—; R0=ADDRESS OF THE TCB OF THE OF THE TASK TO BE RUN.=˜; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO BE RUN.O;™; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.T0š; R3=ADDRESS OF THE PARTITION NAME IN THE DPB.1›; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. .œ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.�;-7ž; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) Ÿ; / ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. (¡; DIRECTIVE STATUS OF +1 IS RETURNED.!¢; C=1 IF DIRECTIVE IS REJECTED. <£; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF INSUFFICIENT6¤; CORE IS AVAILABLE TO ALLOCATE CLOCK QUEUE ENTRY.=¥; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF AN ATTEMPT ISO4¦; MADE TO ACTIVATE A TASK WHOSE NAME BEGINS WITH-§; "..." (IF EXECUTIVE-LEVEL DISPATCHING).O:¨; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF A NONPRI-3©; VILEGED TASK SPECIFIES ANOTHER UIC (IF MULTI-Dª; USER PROTECTION).C«;T¬;-­® MAP6=140000¯°$DRRUN:: ;±²³ .IF DF R$$DSP´8µ CMP T.NAM(R0),#^R... ;MULTI-USER TASK NAME SPECIFIED?¶ BEQ 40$ ;IF EQ YES, ILLEGALL·¸ .ENDC¹º.» MOV R0,R5 ;SAVE TCB ADDRESS OF TASK TO RUN*¼ ADD #6,R3 ;POINT TO REQUEST UIC IN DPB#½ CLR -(SP) ;SET DUMMY EFN NUMBER¾¿À .IF DF M$$MUPÁ& MOV (R3)+,R1 ;PICK UP SPECIFIED UICà MOV R3,-(SP) ;SAVE R34Ä CALL $UISET ;ESTABLISH DEFAULT AND CURRENT UIC'SÅ MOV (SP)+,R3 ;RESTORE R3T1Æ BCS 30$ ;IF CS NONPRV TASK SPECIFIED DIFF UICN!Ç MOV R1,-(SP) ;SAVE CURRENT UICÈÉ .IFFMÊ&Ë MOV (R3)+,-(SP) ;SAVE SPECIFIED UICÌÍ .ENDCÎÏ2Ð CALL $CVRTM ;CONVERT DELTA TIME TO CLOCK TICKS-Ñ MOV R0,-(SP) ;SAVE HIGH ORDER PART OF TIMEP,Ò MOV R1,-(SP) ;SAVE LOW ORDER PART OF TIME-Ó MOV #C.SSHT,R4 ;ASSUME SINGLE SHOT REQUEST3Ô MOV (R3)+,R0 ;ANY RESCHEDULE INTERNAL SPECIFIED?(Õ BEQ 10$ ;IF EQ NOU5Ö CMP -(R3),-(R4) ;ADJUST DPB ADDRESS AND ENTRY TYPE+;× CALL $CVRTM ;CONVERT RESCHEDULE INTERNAL TO CLOCK TICKSF1Ø10$: MOV R0,-(SP) ;SAVE HIGH ORDER PART OF TIME.,Ù MOV R1,-(SP) ;SAVE LOW ORDER PART OF TIME9Ú20$: CALL $ALCLK ;ALLOCATE A CLOCK QUEUE CONTROL BLOCKMÛÜÝ .IF DF A$$CNTÞ)ß MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGR+à MOV $TKTCB,R1 ;LOCATE CURRENT TASK'S TCB#-á MOV T.ACN(R1),KISAR6 ;MAP ACCOUNTING BLOCK('â BEQ 24$ ;IF EQ, NO ACCOUNTING BLOCKD/ã22$: CMPB #BT.UAB,@#B.TYP+140000 ;IS IT A UABDä BEQ 23$ ;IF EQ YES7å MOV @#B.PNT+140000,KISAR6 ;MAP NEXT ACCOUNTING BLOCK æ BR 22$ ;/ç23$: INCB @#B.USE+140000 ;INCREMENT USE COUNT.9è24$: MOV KISAR6,C.UAB(R0) ;PUT UAB ADDRESS IN CLQ BLOCK -é MOV (SP)+,KISAR6 ;RESTORE ORIGINAL MAPPINGê25$: ;MERGE POI00NÐgOÔgg´cÚµcÛ¶c�·c›’NTëì .ENDCíî:ï MOV (SP)+,C.RSI(R0) ;INSERT AST ADDRESS/LOW PART OF RSI:ð MOV (SP)+,C.RSI+2(R0) ;INSERT EFN MASK/HIGH PART OF RSI0ñ MOV (SP)+,R2 ;RETRIEVE DELTA TIME TICKS COUNTò MOV (SP)+,R1 ;Yóô .IF NDF N$$DIRõ"ö MOV (SP)+,C.UIC(R0) ;INSERT UIC÷ø .IFF ;NDF N$$DIRCù&ú TST R4 ;IS THIS MARKTIME DIRECTIVEû BNE 26$ ;IF NE, NO/ü MOV (SP)+,C.UIC(R0) ;INSERT EFN MASK ADDRESSAý BR 29$ ;BR AROUND&þ26$: MOV (SP)+,R3 ;GET UIC OFF STACKÿ MOV R1,-(SP) ;SAVE R1 MOV $TKTCB,R1 ;GET TI: UCBV& MOV T.CTX(R1),R1 ;GET CONTEXT BLOCK  BNE 28$ ;IF NE, THERE IS ONE, MOV R0,-(SP) ;SAVE POINTER TO CLOCK BLOCK. CLR R0 ;INDICATE NO DDS FOR CREATE CONTEXT% MOV R3,-(SP) ;SAVE UIC ;JWB186* MOV R2,-(SP) ;SAVE LOW ORDER TIME VALUE% CALL $CRCTX ;CREATE CONTEXT BLOCKS& BCS 50$ ;IF CS, ALLOCATION FAILURE- MOV (SP)+,R2 ;RESTORE LOW ORDER TIME VALUES  MOV R3,R1 ;PUT CTX INTO R1(  MOV (SP)+,R3 ;RESTORE UIC ;JWB186,  MOV (SP)+,R0 ;RESTORE CLOCK BLOCK POINTER< 28$: MOV R1,C.CTX(R0) ;PUT CONTEXT BLOCK INTO CLOCK BLOCK)  MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGS#  MOV R1,KISAR6 ;MAP CONTEXT BLOCK - INCB C.REF+MAP6 ;INCREMENT REFERENCE COUNT,1 MOV R3,C.CUIC+MAP6 ;PUT UIC INTO CONTEXT BLOCK $ MOV (SP)+,KISAR6 ;RESTORE MAPPING MOV (SP)+,R1 ;RESTORE R1S5 BIS #100000,R4 ;INDICATE SCHEDULE REQUEST WITH DDSO29$: .ENDC ;DF N$$DIRR- MOVB (SP)+,C.EFN(R0) ;INSERT EFN/ZERO BYTEC' CALLR $CLINS ;INSERT IN CLOCK QUEUEB .IF DF M$$MUP)30$: DRSTS D.RS16 ;PRIVILEGE VIOLATIONK  .ENDC!"# .IF DF R$$DSP$3%40$: DRSTS D.RS7 ;MULTI-USER TASK NAME SPECIFIED+&' .ENDC()* .IF DF N$$DIR+',50$: DRSTS D.RS1 ;ALLOCATION FAILURE-. .ENDC ;DF N$$DIRO/0 1 .DSABL LSB+23 .ENDR1S5 BIS #100000,R4 ;INDICATE SCHEDULE REQUEST WITH DDSO29$: .ENDC ;DF N$$DIRR- MOVB (SP)+,C.EFN(R0) ;INSERT EFN/ZERO BYTEC' CALLR $CLINS ;INSERT IN CLOC .TITLE DRRAS  .IDENT /10.00/ ;E7; COPYRIGHT (C) 1987 BY DIGITAL EQUIPMENT CORPORATIONZ; ALL RIGHTS RESERVEDT1; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.M;,C ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDR; ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.R ;T ;G ; D. N. CUTLER 4-SEP-73F;T; PREVIOUSLY MODIFIED BY:F;B; T. M. MARTIN; B. S. MCCARTHY ; M. S. FOXT; J. M. LAWLER; -; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:A;; J. W. BERZLE; J. R. KAUFFMAN; B. S. MCCARTHY;M; MODIFIED BY:;L!; B. S. MCCARTHY 5-JAN-86 10.00I; 5; BM378 -- CORRECT MAPPING ON NON-I/D SYSTEMS WHENS,; RECEIVE DIRECTIVES RETURN WITH SUCCESS.; (ALSO, MOVE ERROR CONDITIONS UP TO FRONT-; [THE ONLY PLACE THEY'RE REFERENCED] SO40; THEY CAN BE REACHED WITH BRANCHES INSTEAD"; OF BRANCHING AROUND JUMPS.);); RECEIVE AND SEND DIRECTIVES*;+; MACRO LIBRARY CALLSP,;E-. .MCALL HDRDF$,TCBDF$W/0 .IF DF N$$DIR12 .MCALL LNMDF$3)4 LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETSC56 .ENDC ;DF N$$DIR7'8 HDRDF$ ;DEFINE TASK HEADER OFFSETSS.9 TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS:;;+E<; **-$DRREC-(VARIABLE LENGTH) RECEIVE DATA AND RECEIVE DATA OR EXITE4=; **-$DRRCS-(VARIABLE LENGTH) RECEIVE DATA OR STOP>;RI?; THESE DIRECTIVES INSTRUCT THE SYSTEM TO DEQUEUE A DATA BLOCK FROM THEEK@; ISSUING TASK'S RECEIVE QUEUE. IF THE DIRECTIVE IS RECEIVE DATA OR EXIT,BJA; THEN A TASK EXIT WILL BE EFFECTED IF NO DATA IS QUEUED. IF THE DIREC-JB; TIVE IS RECEIVE OR STOP, THEN THE ISSUING TASK WILL BE SUSPENDED IF NOC; DATA IS QUEUED.TD; E; DPB FORMAT:NF;B8G; WD. 00 -- DIC(75., 77., OR 139.),DPB SIZE(4. OR 6.).?H; WD. 01 -- FIRST HALF OF SENDER TASK NAME OR 0 FOR ANY TASK.G.I; WD. 02 -- SECOND HALF OF SENDER TASK NAME.(J; WD. 03 -- ADDRESS OF RECEIVE BUFFER.AK; WD. 04 -- NUMBER OF WORDS TO RECEIVE (VARIABLE RECEIVE ONLY)00OØgygäzgM{güfàýfáþfDATA.EL;E M; INPUTS: N;B;O; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. -P; R3=ADDRESS OF THE SECOND WORD IN THE DPB.E1Q; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.A.R; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.S;07T; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)1U;I/V; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.<W; DIRECTIVE STATUS OF +1 IS RETURNED IF DATA IS RECEIVED.;X; DIRECTIVE STATUS OF 'D.RS22' IS RETURNED IF NO DATA ISR"Y; RECEIVED ON RECEIVE OR STOP.!Z; C=1 IF DIRECTIVE IS REJECTED.E7[; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF NO DATAA2\; IS QUEUED IN TASK'S RECEIVE QUEUE ON RECEIVE ]; DATA.D<^; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE ISSUING4_; TASK IS AT AST STATE AND ISSUED THE RECEIVE OR`; STOP DIRECTIVE.4a; DIRECTIVE STATUS OF 'D.RS17' IS RETURNED IF THE-b; ISSUING TASK IS A SLAVE TASK AND HAS AN ,c; ACTIVE GROUP GLOBAL EVENT FLAG CONTEXT-d; AND THE NEXT RECEIVE PACKET WILL CHANGE e; THE TASK'S GROUP NUMBER.f;E;g; THE FORMAT OF A FIXED LENGTH SEND PACKET IS AS FOLLOWS:Ih;D'i; WD. 00 -- RECEIVE QUEUE LINK WORD.U.j; WD. 01 -- FIRST WORD OF SENDER TASK NAME./k; WD. 02 -- SECOND WORD OF SENDER TASK NAME. 4l; WD. 03 THRU 15. -- CONTENTS OF THE SEND BUFFER..m; WD. 16. -- TI UCB ADDRESS OF SENDER TASK.n; WD. 17. -- CURRENT UIC 2o; WD. 18. -- FIRST WORD OF TARGET MU TASK NAME.3p; WD. 19. -- SECOND WORD OF TARGET MU TASK NAME.TAq; WD. 20. -- CONTEXT BLOCK POINTER (IF NAME DIRECTORY SUPPORT)r;H>s; THE FORMAT OF A VARIABLE LENGTH SEND PACKET IS AS FOLLOWS:t;.4u; WD. 00 -- RECEIVE BY REFERENCE QUEUE LINK WORD.<v; WD. 01 -- NUMBER DATA WORDS + 2 (FOR SENDER TASK NAME)..w; WD. 02 -- FIRST WORD OF SENDER TASK NAME./x; WD. 03 -- SECOND WORD OF SENDER TASK NAME.E,y; WD. 04 THRU N -- DATA WORDS TO BE SENT..z; WD. N+1 -- TI UCB ADDRESS OF SENDER TASK.{; WD. N+2 -- CURRENT UICD2|; WD. N+3 -- FIRST WORD OF TARGET MU TASK NAME.3}; WD. N+4 -- SECOND WORD OF TARGET MU TASK NAME.A~; WD. N+5 -- CONTEXT BLOCK POINTER (IF NAME DIRECTORY SUPPORT).; >€; NOTE: FOR SYSTEMS WITH SECONDARY POOL SUPPORT, ALL PACKETS)�; FOR SENDS AND RECEIVES ARE ALLOCATEDE6‚; FROM THE SECONDARY POOL AND THE FIXED LENGTH SEND1ƒ; BECOMES A VARIABLE LENGTH SEND OF LENGTH 13.W„; …;-…; ; BM3788…; * * * * * N O T E W E L L * * * * * ; BM378…; ; BM378G…; THESE ROUTINES CURRENTLY WORK ONLY BECAUSE THEY ARE IN THE ; BM378EE…; ROOT OF THE EXEC AND APPEAR TO BE IN THE FIRST DIRECTIVE ; BM378EG…; COMMON. IF THEY ARE EVER MOVED, IN ADDITION TO THE CHANGES ; BM378YE…; TO MAPPING NECESSARY, IT WILL BE NECESSARY TO CHANGE THE ; BM378E…; CODE WHICH STUFFS THE NEW DSW ON THE STACK TO ACCOMODATE ; BM378VC…; THE DIFFERING STACK FORMATS ON SYSTEMS WITH DIRECTIVE ; BM378…; COMMONS. ; BM378 …; ; BM378†‡ ˆ .ENABL LSB3ˆ ; BM378S;ˆ60$: DRSTS D.RS89 ;INVALID RECEIVE BUFFER SIZE ; BM378O1ˆ70$: DRSTS D.RS99 ;INVALID DPB SIZE ; BM378Iˆ ; BM378M/‰$DRRCS::TST (R2) ;ISSUING TASK AT AST STATE?AŠ BPL $DRREC ;IF PL NO.‹ DRSTS D.RS80 ;ISSUING TASK IS AT AST STATE%Œ$DRREC::CLR -(SP) ;INIT ERROR CODE 6� MOV #15.,R1 ;ASSUME THIS IS A FIXED LENGTH RECEIVE*Ž MOV R1,-(SP) ;SAVE NUMBER OF DATA WORDS� ASL R1 ;CONVERT TO BYTES�‘ .IF DF X$$HDR’;“ MOVB H.CUIC+1(R4),-(SP) ;SAVE GRP CODE - HEADER UNMAPPED0”• .IFF8–$— MOV R4,-(SP) ;SAVE HEADER ADDRESS˜™ .ENDCš7› MOV (R3)+,-(SP) ;SAVE FIRST HALF OF SENDER TASK NAME8œ MOV (R3)+,-(SP) ;SAVE SECOND HALF OF SENDER TASK NAME+� CMPB $DICSV+1,#4. ;FIXED LENGTH RECEIVE?Až BEQ 102$ ;IF EQ YESR.Ÿ CMPB $DICSV+1,#6. ;VARIABLE LENGTH RECEIVE?!Ÿ BNE 70$ ;IF NE NO ; BM378C/Ÿ MOV 2(R3),R1 ;GET SIZE TO RECEIVE ; BM3781Ÿ BEQ 60$ ;IF EQ ERROR - ILLEGAL SIZE ; BM378)Ÿ CMP R1,#P$$MAX ;VALID SIZE ; BM378D¦ BHI 60$ ;IF HI NO ;**-683§ ADD #2,R1 ;TWO EXTRA WOR00OàgÔgg´cÚµcÛ¶c�·c›’DS FOR SENDER TASK NAMEN-¨ MOV R1,6(SP) ;SAVE THE SIZE TO RECEIVE + 2S!© ASL R1 ;CONVERT SIZE TO BYTES)3ª102$: MOV (R3),R3 ;GET ADDRESS OF RECEIVE BUFFERV-« CALL $ACHKP ;ADDRESS CHECK RECEIVE BUFFERF-¬ MOV R3,R4 ;SAVE ADDRESS OF RECEIVE BUFFER 6­ MOV (SP)+,R3 ;RETRIEVE 2ND HALF OF SENDER TASK NAME8® MOV (SP)+,R2 ;RETRIEVE FIRST HALF OF SENDER TASK NAME¯ MOV R5,R0 ;COPY TCB ADDRESS(° ADD #T.RCVL,R0 ;POINT TO RECEIVE LIST6± CALL $GTRPK ;GET RECEIVE DATA PACKET AND MAP TO IT ² BCS 20$ ;IF CS THERE IS NONE4³ MOV (SP)+,R2 ;GET SAVED GROUP CODE/HEADER ADDRESS5´ BIT #T3.SLV,T.ST3(R5) ;ISSUING TASK A SLAVE TASK ? µ BEQ 105$ ;IF EQ NO:¶ TSTB T.GGF(R5) ;TASK HAVE ACTIVE GROUP GLOBAL CONTEXT ?· BEQ 105$ ;IF EQ NO1¸ MOV @#120002,R3 ;GET LENGTH OF DATA +2 (WORDS)O¹ ASL R3 ;CONVERT TO BYTESº» .IF DF X$$HDR¼.½ CMPB R2,120007(R3) ;WILL UIC GROUP CHANGE ?¾¿ .IFFDÀ8Á CMPB H.CUIC+1(R2),120007(R3) ;WILL UIC GROUP CHANGE ?Âà .ENDCÄÅ BEQ 105$ ;IF EQ NO:Æ DRSTS D.RS17 ;SLAVE TASK HAS GRP GLOBAL CONTEXT ACTIVE.Ç105$: CALL $GTSPK ;DEQUEUE SPECIFIED PACKET4È MOV #120002,R1 ;POINT TO THE NUMBER OF WORDS SENT0É CMP (SP),(R1) ;BUFFER SMALLER THAN DATA SENT?Ê BEQ 2$ ;IF EQ NOË BLO 201$ ;IF LO YES;/Ì MOV (R1),(SP) ;KEEP THE NUMBER OF WORDS SENTR Í BR 2$ ;4Î201$: INC 2(SP) ;INDICATE DATA HAS BEEN TRUNCATEDÏ2$: ;REFERENCE SYMBOL3Ð BIT #T3.SLV,T.ST3(R5) ;IS RECEIVER A SLAVE TASK?UÑ BEQ 5$ ;IF EQ NOÒÓ .IF DF V$$TRMÔ; DÕ; IF TI OF THE RECEIVER IS A VT, DECREMENT THE VT OFFSPRING COUNT,DÖ; DEALLOCATE THE VT IF REQUIRED, AND CLEAR ANY LUNS WHICH MAY HAVE.×; BEEN ASSIGNED TO THE SLAVE TASK'S TI (VT).CØ; NOTE -- COUNT IS DECREMENTED WHEN CHANGING THE TI AWAY FROM THE @Ù; CURRENT VT. FOR THIS REASON, THE VT OFFSPRING COUNT IS NOTCÚ; DECREMENTED IF A RECEIVE DATA IS ISSUED AND THE QUEUE IS EMPTY.EÛ;C$Ü MOV R1,-(SP) ;SAVE PACKET ADDRESS1Ý CALL $TICLR ;DECREMENT VT OFFSPRING COUNT ANDÞ ;CLEAR OUT LUNS'ß MOV (SP)+,R1 ;RESTORE PACKET ADDRESSEàá .ENDCâ"ã MOV R1,R0 ;COPY PACKET ADDRESS1ä MOV (R1),R3 ;GET NUMBER OF DATA WORDS SENT +2Nå ASL R3 ;CONVERT TO BYTES6æ ADD R3,R0 ;POINT TO SENDER'S TI UCB ADDRESS IN PKTç TST (R0)+ ; è2é MOV (R0)+,T.UCB(R5) ;SET TI ADDRESS OF RECEIVERêë .IF DF X$$HDRì-í MOV #KISAR6,R3 ;GET ADDRESS OF KERNEL APR6 5î MOV (R3),-(SP) ;SAVE CURRENT MAPPING (USER BUFFER)*ï MOV $SAHDB,(R3) ;MAP NONRESIDENT HEADER$ð MOV $SAHPT,R2 ;GET HEADER ADDRESS3ñ MOV (R0),H.CUIC(R2) ;SET CURRENT UIC OF RECEIVER1ò MOV (R0),H.DUIC(R2) ;SET DEFAULT UIC OF SENDER 1ó MOV (SP)+,(R3) ;RESTORE MAPPING TO USER BUFFERVôõ .IFFö)÷ MOV $HEADR,R2 ;GET TASK HEADER ADDRESS 3ø MOV (R0),H.CUIC(R2) ;SET CURRENT UIC OF RECEIVER;3ù MOV (R0),H.DUIC(R2) ;SET DEFAULT UIC OF RECEIVERúû .ENDCüýþ .IF DF N$$DIRÿ MOV R1,-(SP) ;SAVE R1. MOV T.CTX(R5),R1 ;GET CURRENT CONTEXT BLOCK BEQ 3$ ;IF EQ, NONED- CALL $DLCTX ;DELETE CURRENT CONTEXT BLOCKV83$: MOV 6(R0),T.CTX(R5) ;GET CONTEXT BLOCK FROM PACKET MOV (SP)+,R1 ;RESTORE R1  .ENDC ;DF N$$DIR( 5$: ;REFERENCE SYMBOL(  TST (R1)+ ;POINT TO SENDER TASK NAME,  MOV (SP)+,R2 ;GET NUMBER OF WORDS TO MOVE-  CMPB $DICSV+1,#6 ;VARIABLE LENGTH RECEIVE?.  BNE 10$ ;IF NE NOI7 MOV R2,4(SP) ;RETURN IN DSW NUMBER OF WORDS RECEIVED610$: MOV (R1)+,(R4)+ ;MOVE DATA BLOCK TO TASK BUFFER# DEC R2 ;ANY MORE WORDS TO MOVE?, BNE 10$ ;IF NE YES' MOV KISAR5,R0 ;GET ADDRESS OF PACKET , MOV @#120002,R1 ;GET NUMBER OF WORDS SENT .IF DF N$$DIR8 ADD #<7.+37>,R1 ;INCLUDE CONTROL WORDS IN PACKET SIZE .IFF(8 ADD #<6.+37>,R1 ;INCLUDE CONTROL WORDS IN PACKET SIZE .ENDC ;DF N$$DIR ) ASH #-5,R1 ;CONVERT TO 32. WORD UNITS16  CALL $DESEC ;DEALLOCATE RECEIVE PACKET TO SEC POOL1! TST (SP)+ ;CLEAN THE STACK AND TEST FOR ERROR *" BNE 45$ ;IF NE DATA HAS BEEN TRUNCATED" ; BM378E" .IF DF D$$PAR 00OègygäzgM{güfàýfáþfDATA ; BM3780" ; BM378E " .IF NDF K$$DAS ; BM378" ; BM378;" MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I SPACE ; BM378 " ; BM378"" .ENDC ;NDF K$$DAS ; BM378" ; BM378P!" .ENDC ;DF D$$PAR ; BM378 " ; BM378; # RETURN ;W$20$: ;REFERENCE LABEL% .IF DF X$$HDR&' TST (SP)+ ;CLEAN STACK'( MOV $SAHPT,R4 ;GET ADDRESS OF HEADER$) MOV $SAHDB,KISAR6 ;AND MAP HEADER*+ .IFF ,(- MOV (SP)+,R4 ;RETRIEVE HEADER ADDRESS. .ENDC/0 CMP (SP)+,(SP)+ ;CLEAN STACK 41 CMPB $DICSV,#77. ;RECEIVE DATA OR EXIT DIRECTIVE?2 BNE 30$ ;IF NE NOP3 JMP $DREXT ;EXIT TASK 4430$: CMPB $DICSV,#139. ;RECEIVE OR STOP DIRECTIVE?5 BNE 40$ ;IF NE NO;"6 CALL $STPCT ;STOP CURRENT TASK7 DRSTS D.RS22 ;RETURN IS.SET:)840$: DRSTS D.RS8 ;NO PACKET TO RECEIVE=945$: DRSTS D.RS15 ;RECEIVE BUFFER TOO SMALL DATA TRUNCATEDA< ;**-2,=>;+?; **-$DRSND-SEND DATA @;KA; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A THIRTEEN WORD DATA BLOCKL(B; IN A SPECIFIED TASK'S RECEIVE QUEUE.C;RD; DPB FORMAT:E;E*F; WD. 00 -- DIC(71.),DPB SIZE(5. OR 8.)./G; WD. 01 -- FIRST HALF OF RECEIVER TASK NAME.T0H; WD. 02 -- SECOND HALF OF RECEIVER TASK NAME.2I; WD. 03 -- ADDRESS OF THIRTEEN WORD DATA BLOCK.+J; WD. 04 -- EVENT FLAG NUMBER (OPTIONAL).5BK; WD. 05 -- NUMBER OF WORDS TO SEND (VARIABLE LENGTH SEND ONLY).L;* M; INPUTS:+N; /O; R0=ADDRESS OF THE TCB OF THE RECEIVER TASK.S<P; R1=ADDRESS OF THE TASK STATUS WORD OF THE RECEIVER TASK.;Q; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.4R; R3=ADDRESS OF THE DATA BLOCK ADDRESS IN THE DPB.1S; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. .T; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.U;-7V; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)NW;G/X; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.D(Y; DIRECTIVE STATUS OF +1 IS RETURNED.!Z; C=1 IF DIRECTIVE IS REJECTED.E<[; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF INSUFFICIENT0\; CORE IS AVAILABLE TO QUEUE THE DATA BLOCK.8]; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF RECEIVER-^; TASK IS AN ANCILLARY CONTROL PROCESSOR._;A@`; NOTE: FOR SYSTEMS WITH SECONDARY POOL SUPPORT, ALL SENDS AND<a; RECEIVES USE PACKETS ALLOCATED FROM THE SECONDARY POOL.b;P4c; ON SYSTEMS SUPPORTING NON RESIDENT TASK HEADERS5d; AND PROTOTYPE TCBS, KISAR6 MAY MAP THE PROTOTYPER6e; TCB IN POOL UPON ENTRY. THEREFORE, DO NOT ASSUME$f; THAT THE TASK HEADER IS MAPPED.g;Fh;-h ; BM378A5h270$: DRSTS D.RS2 ;SET DIRECTIVE STATUS ; BM378'<h360$: DRSTS D.RS89 ;INVALID RECEIVE BUFFER SIZE ; BM3782h370$: DRSTS D.RS99 ;INVALID DPB SIZE ; BM378ij$DRSND:: ;;k BIT #T3.ACP!T3.NSD,T.ST3(R0) ;SENDS ALLOWED TO RECEIVER?E#k BNE 270$ ;IF NE, NO ; BM378M;k MOV R0,-(SP) ;SAVE TCB ADDRESS OF RECEIVER TASK ; BM378B:o MOV #13.,R1 ;ASSUME THIS IS A FIXED LENGTH SEND ;**-3-p MOV R1,-(SP) ;SAVE NUMBER OF WORDS TO SENDKq ASL R1 ;CONVERT TO BYTES+r MOVB 2(R3),-(SP) ;SAVE EVENT FLAG NUMBER;2s CMPB $DICSV+1,#5. ;FIXED LENGTH SEND DIRECTIVE?t BEQ 210$ ;IF EQ YESE/u CMPB $DICSV+1,#7. ;SEND REQUEST AND CONNECT?Dv BEQ 210$ ;IF EQ YES&v BLO 370$ ;IF LO, ERROR ; BM378=x CMPB $DICSV+1,#9. ;IS IT SOME FORM OF VARIABLE SEND ;**-1 (x BHI 370$ ;IF HI NO, ERROR ; BM378-z BNE 205$ ;IF NE, IT MUST BE VALID ;**-1A${ CMPB $DICSV,#71. ;IS THIS A VSDA$3{ BEQ 370$ ;IF EQ YES, ILLEGAL DPB SIZE ; BM378$}205$: ;REFERENCE LABEL ;**-1,~ MOV 4(R3),R1 ;GET NUMBER OF WORDS TO SEND+~ BEQ 360$ ;IF EQ ILLEGAL SIZE ; BM378B(€ CMP R1,#P$$MAX ;VALID SIZE? ;**-1"€ BHI 360$ ;IF HI NO ; BM378;‚ MOV R1,2(SP) ;SAVE THE NUMBER OF WORDS TO BE SENT ;**-1ƒ ASL R1 ;CONVERT TO BYTES0„210$: MOV (R3),R3 ;GET ADDRESS OF DATA BUFFER… BIT #1,R3 ;ODD ADDRESS?E † BNE 275$ ;IF NE, YES - ERROR'‡ MOV R3,R0 ;MOV BUFFER ADDR FOR CALLD*ˆ CALL $ACHRO ;ADDRESS CHECK DATA BUFFER‰ BCS 275$ ;IF00OðgÔgg´cÚµcÛ¶c�·c›’ CS, ERROR%Š CALL $RELOC ;RELOCATE USER BUFFER $‹ MOV R1,KISAR6 ;MAP TO USER BUFFER-Œ MOV R2,R3 ;SUBSTITUTE NEW VITRUAL ADDRESS,5� MOVB (SP)+,R0 ;RETRIEVE OPTIONAL EVENT FLAG NUMBER "Ž CALL $SETF ;SET THE EVENT FLAG,� MOV (SP),R1 ;GET NUMBER OF WORDS TO SEND�‘ .IF DF N$$DIR’8“ ADD #<9.+37>,R1 ;INCLUDE CONTROL WORDS IN PACKET SIZE”• .IFFS–8— ADD #<8.+37>,R1 ;INCLUDE CONTROL WORDS IN PACKET SIZE˜™ .ENDC ;DF N$$DIR š)› ASH #-5,R1 ;CONVERT TO 32. WORD UNITS "œ CALL $ALSEC ;ALLOCATE A PACKET&� BCS 265$ ;IF CS ALLOCATION FAILURE*ž CLR -(SP) ;RESERVE A WORD ON THE STACK"Ÿ MOV 2(SP),(SP) ;COPY WORD COUNT&  MOV KISAR5,2(SP) ;SAVE KERNEL APR 5.¡ MOV R0,KISAR5 ;MAP THE PACKET THROUGH APR 55¢ MOV #120002,R0 ;POINT TO SECOND WORD OF THE PACKETR5£ MOV (SP),(R0) ;SAVE NUMBER OF DATA WORDS IN PACKETE5¤ ADD #2,(R0) ;TWO EXTRA WORDS FOR SENDER TASK NAMEO+¥ TST (R0)+ ;POINT TO TASK NAME IN PACKETN>¦ MOV T.NAM(R5),(R0)+ ;INSERT SENDER TASK NAME IN SEND PACKET§ MOV T.NAM+2(R5),(R0)+ ;¨ MOV (SP)+,R2 ;SET LOOP COUNTI1©240$: MOV (R3)+,(R0)+ ;MOVE DATA TO SEND PACKET#ª DEC R2 ;ANY MORE WORDS TO MOVE?M« BNE 240$ ;IF NE YESN¬­ .IF DF V$$TRM®4¯ MOV T.UCB(R5),R1 ;GET ADDRESS OF TI UCB OF SENDER%° MOV @R1,R2 ;DETERMINE DCB ADDRESSV0± CMP D.NAM(R2),#"VT ;IS IT A VIRTUAL TERMINAL?² BNE 245$ ;IF NE NO1³ MOV 2(SP),R2 ;GET TCB ADDRESS OF RECEIVER TASKT4´ BIT #T3.SLV,T.ST3(R2) ;IS RCVR TASK A SLAVE TASK?µ BEQ 245$ ;IF EQ NO0¶ INCB U.OCNT(R1) ;INCREMENT VT OFFSPRING COUNT/·245$: MOV R1,(R0)+ ;SET UCB ADDRESS IN PACKETM¸¹ .IFFEº1» MOV T.UCB(R5),(R0)+ ;SET UCB ADDRESS IN PACKETE¼½ .ENDC¾¿À .IF DF X$$HDRÁ2 MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER4à MOV $SAHPT,R4 ;GET ADDRESS OF CURRENT TASK HEADERÄÅ .ENDCÆÇÈ5É MOV H.CUIC(R4),(R0)+ ;SET CURRENT (PROTECTION) UICGÊËÌ .IF DF R$$DSPÍ<Î MOV $TNAME,(R0)+ ;STORE FIRST WORD OF TARGET MU TASK NAME(Ï MOV $TNAME+2,(R0)+ ;STORE SECOND WORDÐÑ .ENDCÒÓ .IF DF N$$DIRÔ*Õ MOV 2(SP),R2 ;GET RCVR TASK TCB ADDRESS4Ö BIT #T3.SLV,T.ST3(R2) ;IS RCVR TASK A SLAVE TASK?× BEQ 250$ ;IF EQ, NO4Ø MOV T.CTX(R5),(R0) ;PUT CONTEXT BLOCK INTO PACKETÙ BEQ 250$ ;IF EQ, NONE)Ú MOV KISAR5,-(SP) ;SAVE CURRENT MAPPING %Û MOV (R0),KISAR5 ;MAP CONTEXT BLOCKV/Ü INCB C.REF+120000 ;INCREMENT REFERENCE COUNT$Ý MOV (SP)+,KISAR5 ;RESTORE MAPPINGÞ250$: ;REFERENCE LABEL ßà .ENDC ;DF N$$DIRá3â MOV 2(SP),R0 ;GET ADDRESS OF RECEIVER TASK'S TCB(ã ADD #T.RCVL,R0 ;POINT TO RECEIVE LIST'ä MOV KISAR5,R1 ;GET ADDRESS OF PACKETS4å MOV $PTCPT,KISAR6 ;REMAP TCB IF IN SECONDARY POOL2æ CALL $QSPIF ;INSERT PACKET IN THE RECEIVE LIST)ç MOV (SP)+,KISAR5 ;RESTORE KERNEL APR 5V0è MOV #AS.RCA,R4 ;GET CODE FOR RECEIVE DATA AST3é MOV (SP)+,R5 ;RETRIEVE RECEIVER TASK TCB ADDRESSR$ê CALL $DASTT ;DECLARE RECEIVE AST-ë CALLR $DRDSE ;DECLARE A SIGNIFICANT EVENTA(ì265$: DRSTS D.RS1 ;ALLOCATION FAILURE4î275$: DRSTS D.RS98 ;SET DIRECTIVE STATUS ;**-1î ; BM378 î .DSABL LSB ; BM378ïð;+&ñ; **-$GTRPK-GET RECEIVE DATA PACKET.ò;CFó; THIS ROUTINE IS CALLED TO DEQUEUE A SPECIFIED PACKET FROM A QUEUE.ô; õ; INPUTS:Sö;R÷; R2=FIRST WORD OF TASK NAME.R ø; R3=SECOND WORD OF TASK NAME.ù; R0=LIST HEAD ADDRESS.Vú;E û; OUTPUTS:ü;S3ý; C=0 IF AN ENTRY HAS BEEN REMOVED FROM THE LIST.Rþ; KISAR5 MAPS THE ENTRY.V"ÿ; C=1 IF THE ENTRY IS NOT FOUND.;I;-4$GTRPK::MOV R0,R1 ;COPY LISTHEAD ADDRESS ;**-2%10$: SEC ;ASSUME PACKET NOT FOUND;* MOV (R1),R1 ;GET ADDRESS OF NEXT ENTRY BEQ 100$ ;IF EQ END OF LISTI,  MOV R1,KISAR5 ;MAP THE ENTRY THROUGH APR5  TST R2 ;TASK NAME SPECIFIED?+  BEQ 20$ ;IF EQ NO, DEQUEUE FIRST PACKETS,  MOV #120000,R1 ;POINT TO PACKET LINK WORD5  CMP @#120004,R2 ;MATCH ON FIRST WORD OF TASK NAME?A BNE 10$ ;IF NE NO 6 CMP @#120006,R3 ;MATCH ON SECOND WORD OF TASK NAME? BNE 10$ ;IF NE NO$ MOV00OøgPùgzgM{güfàýfáþfDATA KISAR5,R1 ;GET PACKET ADDRESS20$: ;REFERENCE LABEL100$: RETURN ; .ENDND;* MOV (R1),R1 ;GET ADDRESS OF NEXT ENTRY BEQ 100$ ;IF EQ END OF LISTI,  MOV R1,KISAR5 ;MAP THE ENTRY THROUGH APR5  TST R2 ;TASK NAME SPECIFIED?+  BEQ 20$ ;IF EQ NO, DEQUEUE FIRST PACKETS,  MOV #120000,R1 ;POINT TO PACKET LINK WORD5  CMP @#120004,R2 ;MATCH ON FIRST WORD OF TASK NAME?A BNE 10$ ;IF NE NO 6 CMP @#120006,R3 ;MATCH ON SECOND WORD OF TASK NAME? BNE 10$ ;IF NE NO$ MOV .TITLE DRGCL .IDENT /06.04/C 8; COPYRIGHT (C) 1985 BY DIGITAL EQUIPMENT CORPORATION,'; MAYNARD, MASS. ALL RIGHTS RESERVED.1;N-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:O;S; J. W. BERZLE; J. R. KAUFFMAN;1-; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:N;B"; B. S. MCCARTHY 5-MAR-87 06.04;.; BM385 -- ADD $DRGC1 LABEL FOR MOVEMENT TO%; VECTOR COMMON. ALSO MOVE $RLMCB8; to DREIF;V;+; **-$DRGCL-GET COMMAND LINE;R ; INPUTS:C;.;; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.51; R3=ADDRESS OF THE 80. BYTE BUFFER IN THE DPB.S1; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.X.; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ;!;-"#$ .MCALL PKTDF$,TCBDF$R%& .IF DF N$$DIR'( .MCALL LNMDF$))* LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETS-+, .ENDC ;DF N$$DIRV-*. PKTDF$ ;DEFINE COMMAND BUFFER OFFSETS/ TCBDF$ ;TCB OFFSETS0182 .IIF GE </100>-200 .ERROR ;LENGTH TOO LONG33 ; BM385A3 .IF DF D$$PAR ; BM3853 ; BM38503$DRGC1:: ; BM3853 ; BM385 !3 .IFF ; DF D$$PAR ; BM38553 ; BM385F3$DRGCL:: ; BM3853 ; BM385 "3 .ENDC ; DF D$$PAR ; BM3853 ; BM385$*3 MOVB -(R3),R0 ;GET DPB SIZE ; BM385)5 CMPB (R3)+,#41. ;IS IT GMCR$ ;**-1F6 BEQ GMCR ;IF EQ YESR7 CMPB R0,#3 ;IS IT SNXC$F8 BEQ SNXC ;IF EQ YES<9:; .IF DF A$$CLI<= CMPB R0,#7 ;IS IT GCCI$ > BEQ GCCI ;IF EQ YESP?@ .ENDC ;A$$CLIAB"C DRSTS D.RS99 ;ILLEGAL DPB SIZEDE;+F; **-GMCR$ DIRECTIVEG;D>H; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TRANSFER A 1 TO 80.@I; BYTE COMMAND LINE TO THE LAST MCR FUNCTION TASK REQUESTED BYJ; THE MCR DISPATCHER.MK;(L; DPB FORMAT:IM; &N; WD. 00 -- DIC(127.),DPB SIZE(41.).,O; WD. 01 -- FIRST WORD OF 80. BYTE BUFFER. P; .S Q; . R; . +S; WD. 50 -- LAST WORD OF 80. BYTE BUFFER.T; 7U; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)NV;$/W; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.=X; DIRECTIVE STATUS EQUAL TO THE LENGTH OF THE COMMAND LINERY; IN BYTES IS RETURNED. !Z; C=1 IF DIRECTIVE IS REJECTED.T<[; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE ISSUING2\; TASK IS NOT THE LAST TASK THAT WAS REQUESTED]; BY THE MCR DISPATCHER.^; _;-`a7bGMCR: CALL $SCMDQ ;SEARCH COMMAND QUEUE FOR A PACKET c BCC 30$ ;IF CC, FOUND ONE (d20$: DRSTS D.RS80 ;NO COMMAND PRESENT/e30$: MOV R3,R4 ;SET DESTINATION DISPLACEMENTD*f MOV KISAR6,R3 ;SET DESTINATION APR BIASg MOV R0,KISAR6 ;MAP COMMANDN9h BIT #CC.CLI,C.CSTS+140000 ;IS COMMAND INTENDED FOR CLI i BNE 20$ ;IF NE YES'j MOV R0,-(SP) ;SAVE ADDRESS OF BUFFER "k MOV R0,R1 ;SET SOURCE APR BIAS+l MOVB C.CBLK+140000,R5 ;GET SIZE OF BLOCKm SWAB R5 ;PUT IN HIGH BYTE =n BISB C.CTR+140000,R5 ;GET TERMINATOR CHARACTER IN LOW BYTEA=o MOV C.CSO+140000,-(SP) ;GET OFFSET TO START RETURNING FROM;:p MOV C.CCT+140000,R0 ;GET NUMBER OF CHARACTERS IN BUFFER.q CMP #79.,R0 ;CAN ENTIRE BUFFER BE RETURNEDr BHIS 50$ ;IF HIS YES5s CLR 2(SP) ;DO NOT DEALLOCATE BUFFER AFTER COPYINGT3t MOV #78.,R0 ;SET NUMBER OF CHARACTERS TO RETURNP<u ADD R0,C.CSO+140000 ;SET TO STARTING OFFSET FOR NEXT TIMEBv SUB R0,C.CCT+140000 ;REMOVE THESE FROM CHARACTERS PRESENT COUNTBw50$: MOV #C.CTXT+120000,R2 ;DISPLACEMENT OF START OF SOURCE TEXT3x ADD (SP)+,R2 ;POINT TO FIRST CHARACTER TO RETUR00PhÔgg´cÚµcÛ¶c�·c›’NTx ; BM385M x .IF NDF D$$PAR ; BM385x ; BM3858x ADD R0,4(SP) ;SET CHARACTER COUNT +1 IN DSW ; BM385x ; BM385R#x .IFF ; NDF D$$PAR ; BM385Ex ; BM38589x ADD R0,10(SP) ;SET CHARACTER COUNT +1 IN DSW ; BM385+x ; BM385N#x .IFTF ; NDF D$$PAR ; BM385Cx ; BM385E&z TST R0 ;IS THERE ANY TEXT ;**-1{ BEQ 55$ ;IF EQ NOI.| CALL $BLXIO ;COPY CHARACTERS INTO USER DPB+}55$: MOV R3,KISAR6 ;MAP DESTINATION AGAIN 6~ MOVB #15,R3 ;ASSUME CONTINUATION MUST BE INDICATED2 MOVB #'-,(R4)+ ;HYPHEN FOR ASSUMED CONTINUATION,€ MOV (SP)+,R1 ;GET ADDRESS OF SOURCE BLOCK)� BEQ 60$ ;IF EQ, THERE IS CONTINUATION � ; BM385D"� .IFT ; NDF D$$PAR ; BM385� ; BM385 >� DEC 2(SP) ;ADJUST DSW TO ELIM INITIAL VALUE OF +1 ; BM385� ; BM385R"� .IFF ; NDF D$$PAR ; BM385� ; BM385>� DEC 6(SP) ;ADJUST DSW TO ELIM INITIAL VALUE OF +1 ; BM385� ; BM385G#� .ENDC ; NDF D$$PAR ; BM385A9ƒ DEC R4 ;SET TO OVERWRITE HYPHEN WITH TERMINATOR ;**-1E*„ MOV #$CLICQ,R0 ;POINT TO QUEUE LISTHEAD… CALL $GTSPK ;DEQUEUE PACKET "† MOV R1,R0 ;COPY PACKET ADDRESS#‡ MOVB R5,R3 ;GET REAL TERMINATOR *ˆ SWAB R5 ;GET SIZE OF BLOCK IN LOW BYTE!‰ MOVB R5,R1 ;GET SIZE OF BLOCKUŠ CALL $DESEC ;DEALLOCATE IT.‹60$: MOVB R3,(R4) ;PUT TERMINATOR IN BUFFERŒ RETURN ;ALL DONEC�Ž;+�; **-SNXC$ DIRECTIVE�;UC‘; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CALL THE TERMINAL DRIVER @’; TO HAVE IT SEND THE NEXT COMMAND FROM THE SPECIFIED TERMINALF“; TO THE CLI DISPATCHER FOR EXECUTION. THE NEED FOR THIS ARISES WHENC”; THE TERMINAL IS IN SERIAL COMMAND EXECUTION MODE. NORMALLY, THETL•; NEXT COMMAND WILL BE CALLED FOR BY DREIF FOR WHEN A TASK WITH T3.CMD SETI–; EXITS. IF THE TASK PROCESSING THE COMMAND WILL NOT EXIT HOWEVER, THISMH—; DIRECTIVE PROVIDES A WAY FOR IT TO SIGNAL TO THE SYSTEM THAT COMMANDD˜; EXECUTION IS COMPLETE, AND THE NEXT COMMAND CAN BE SENT FROM THE'™; TYPEAHEAD BUFFER INSIDE THE DRIVER.A>š; IF THE TASK ISSUING THE DIRECTIVE IS SET TO PROMPT ON EXITD›; HOWEVER, A TASK EXIT PROMPT WILL BE QUEUED UP INSTEAD OF CALLINGAœ; THE DRIVER. THE DRIVER WILL GET CALLED BY MCR... AFTER IT HASL>�; PROCESSED THE TASK EXIT PROMPT, OR BY A RE-ISSUANCE OF THE@ž; SNXC$ DIRECTIVE BY THE CLI IF THE CLI IS RECEIVING TASK EXITBŸ; PROMPT REQUESTS. THIS SCHEME CORRECTLY SYNCHRONIZES THE PROMPT6 ; REQUESTS AND COMMAND LINES ON THE USER'S TERMINAL.¡; ¢; DPB FORMAT:E£; $¤; WD. 00 -- DIC(127.),DPB SIZE(3.)<¥; WD. 01 -- ASCII NAME OF TERMINAL TO REQUEST COMMAND FROM+¦; WD. 02 -- OCTAL UNIT NUMBER OF TERMINALT§;F7¨; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)C©;A/ª; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. («; DIRECTIVE STATUS OF +1 IS RETURNED.!¬; C=1 IF DIRECTIVE IS REJECTED.I4­; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF THE®; LENGTH IS ILLEGAL.4¯; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE/°; SPECIFIED TERMINAL IS NOT THE TASK'S TI:, .±; AND THE TASK IS NOT PRIVILEGED OR A CLI.4²; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF THE7³; SPECIFIED DEVICE DOES NOT EXIST, OR IS NOT A TTY.V´;Tµ;-¶5·SNXC: MOV (R3)+,R0 ;GET NAME OF DEVICE IF SPECIFIEDS(¸ BEQ 10$ ;IF EQ, DEVICE NOT SPECIFIED ¹ MOV (R3),R1 ;GET UNIT NUMBER3º CALL $CVDVN ;CONVERT DEVICE NAME TO UCB ADDRESS9)» BCS 40$ ;IF CS, DEVICE DOES NOT EXISTA¼ MOV R2,R0 ;COPY UCB ADDRESSS%½ CALL $MPLND ;FOLLOW ANY REDIRECTS .¾ BIT #DV.TTY,U.CW1(R0) ;IS DEVICE A TERMINAL¿ BEQ 40$ ;IF EQ NOOBÀ BIT #T3.PRV!T3.CLI,T.ST3(R5) ;IS ISSUING TASK PRIVILEGED OR CLIÁ BNE 20$ ;IF NE YES1 CMP T.UCB(R5),R0 ;DID TASK SPECIFY ITS OWN TI:Cà BEQ 20$ ;IF EQ YES%Ä DRSTS D.RS16 ;PRIVILEGE VIOLATIONI2Å10$: MOV T.UCB(R5),R0 ;DEFAULT UCB TO TASK'S TI:$Æ20$: ADD #T.ST3,R5 ;POINT TO T.ST3-Ç BIT #T3.MCR,(R5) ;WILL TASK PROMPT ON EXITEÈ BEQ 50$ ;IF EQ NO'É MOV #CC.EXT,R1 ;SET TASK EXIT PROMP00PhùgzgM{güfàýfáþfDATATM6Ê BIT #T3.CMD,(R5) ;IS TASK PART OF CMD FROM TERMINALË BEQ 30$ ;IF EQ NO5Ì BIS #CC.TTD,R1 ;FORCE CALL OF $SNCMD AT SOME POINTI#Í30$: MOV R0,R2 ;COPY UCB ADDRESSB/Î CALL $QCNTP ;QUEUE TASK EXIT PROMPT REQUEST Ï BR 60$ ;Ð.Ñ40$: DRSTS D.RS92 ;ILLEGAL DEVICE SPECIFIEDÒ9Ó50$: BIT #T3.CMD,(R5) ;IS TASK PART OF CLI CMD FROM TTYKÔ BEQ 70$ ;IF EQ NOT)Õ CALL $SNCMD ;HAVE TTDRV SEND NEXT CMDW3Ö60$: BIC #T3.MCR!T3.CMD,(R5) ;DON'T DO THIS AGAINM×70$: RETURN ;THE ENDØÙ;+Ú; **-GCCI$ DIRECTIVEÛ;KIÜ; THIS DIRECTIVE IS USED BY A CLI TASK TO GET A COMMAND LINE. IT CANNOTEIÝ; BE ISSUED BY A NON-CLI TASK. IT OFFERS SUCH CAPABILITIES AS RETURNINGLHÞ; A SPECIFIC COMMAND, IDENTIFYING THE COMMAND'S PARENT TASK, LEAVING AMß; COMMAND QUEUED AFTER RETREIVAL FOR RETREIVAL AGAIN BY A FUTURE DIRECTIVE,FMà; AND RETURNING INFORMATION ABOUT THE TERMINAL THE COMMAND ORIGINATED FROM.Xá;WEâ; THE FORMAT OF THE COMMAND BUFFER SET UP IN THE CLI TASK SPACE IS: ã;E-ä; +---------------------------------------+ %å; ! ASCII DEV NAME OF ISSUING TTY ! -æ; !---------------------------------------!Y-ç; ! NUM OF CHAR RETURNED ! OCTAL UNIT NUM.! -è; !---------------------------------------! é; ! COMMAND SIZE !-ê; !---------------------------------------!Lë; ! STATUS ! TERMINATOR !-ì; !---------------------------------------!U í; ! !Lî; ! COMMAND TEXT IN ASCII ! ï; ! ! -ð; +---------------------------------------+Tñ;Pò;SBó; THE FORMAT OF THE INFORMATION BUFFER IN THE CLI TASK SPACE IS:ô; -õ; +---------------------------------------+-!ö; ! U.CW2 OF ISSUING TERMINAL !F-÷; !---------------------------------------!-$ø; ! NAME OF PARENT TASK (IF ANY) !ù; ! (2 WORDS) !-ú; !---------------------------------------!"û; ! ADDRESS OF OCB FROM PARENT !-ü; !---------------------------------------! %ý; ! LOGIN UIC OF ISSUING TERMINAL !!-þ; !---------------------------------------!-'ÿ; ! CURRENT UIC OF ISSUING TERMINAL !T-; !---------------------------------------!E$; ! ADDR OF CMD. IF NOT DEQUEUED !-; +---------------------------------------+R; M; EXTRA FIELDS CAN BE ADDED TO THE END OFF THIS BUFFER IF REQUIRED, BECAUSEIG; THE TASK SUPPLIES BOTH THE ADDR AND LENGTH OF ITS TASK BUFFER. ONLY-H; THAT MUCH DATA IS COPIED BACK TO THE TASK. THE TASK BUFFER IS FILLEDD; FROM THE FRONT WITH THE FIELDS IN THE ABOVE ORDER. IF THE BUFFERE; IS NOT LONG ENOUGH TO HOLD ALL OF THE DATA, THE FIELDS THAT WOULD G ; NOT FIT ARE NOT SUPPLIED, BUT NO INDICATION OF THIS DATA TRUNCATION L ; IS GIVEN TO THE TASK. THUS IF MORE FIELDS ARE ADDED IN A FUTURE RELEASE,H ; OLD TASKS WOULD STILL WORK SINCE THEY WILL GET EXACTLY WHAT THEY GOT1 ; BEFORE, THEY JUST WOULD NOT GET THE NEW DATA.  ;B#; DPB FORMAT FOR GCCI$ DIRECITVE:O;B%; WD. 00 -- DIC(127.),DPB SIZE(7.).L<; WD. 01 -- NO COMMAND PRESENT ACTION, HIGH BYTE RESERVED.0; WD. 02 -- ADDRESS OF COMMAND TO BE RETURNED.4; WD. 03 -- ADDRESS OF COMMAND BUFFER INSIDE TASK..; WD. 04 -- LENGTH OF TASK'S COMMAND BUFFER.=; WD. 05 -- ADDRESS OF OPTIONAL INFORMATION BUFFER IN TASK.N2; WD. 06 -- LENGTH OF TASK'S INFORMATION BUFFER.;T7; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; /; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.G8; DIRECTIVE STATUS OF +1 IS RETURNED IF A COMMAND HAS+; BEEN SUCCESSFULLY RETURNED TO THE CLI,;; DIRECTIVE STATUS OF 'D.RS00' IS RETURNED IF NO COMMANDR2; IS QUEUED FOR THE CLI, AND THE CLI INDICATED4; THAT IT WANTED TO BE STOPPED. THE CLI WILL GET( ; THIS STATUS AFTER IT IS UNSTOPPED.!!; C=1 IF DIRECTIVE IS REJECTED. ;"; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF AN ILLEGAL:#; DPB SIZE IS SPECIFIED.7$; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF EITHERY0%; BUFFER OR THE DPB ARE NOT ENTIRELY WITHING&; THE TASK'S ADDRESS SPACE.S0'; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF7(; A GCCI$ WITH STOP ON NO COMMAND OPTION WAS ISSUEDE); FROM AST STATE<*; D00PhÔgg´cÚµcÛ¶c�·c›’IRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE ISSUING+; TASK IS NOT A CLIU9,; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED FROM A GCCI$ 5-; DIRECTIVE IF THERE IS NO COMMAND QUEUED FOR THEL3.; CLI, AND THE TASK WANTED AN ERROR RETURNED INS/; THIS CASE.40; DIRECTIVE STATUS OF 'D.RS17' IS RETURNED IF THE-1; ISSUING CLI TASK ATTEMPTED TO RECEIVE AA.2; COMMAND FROM A TERMINAL WITH A DIFFERENT13; PROTECTION UIC FROM THE CLI'S CURRENT GROUPN44; AND THE CLI HAD AN ACTIVE GROUP GLOBAL CONTEXT5; FOR THE FORMER GROUP.F6;I7;G8;-9: ASSUME CC.EXT,4; ASSUME CC.PRM,2<= .IF DF A$$CLI>,?GCCI: BIT #T3.CLI,T.ST3(R5) ;IS TASK A CLI@ BNE 100$ ;IF NE NO&A DRSTS D.RS16 ;SET DIRECTIVE STATUS+B100$: MOV (R3)+,-(SP) ;SAVE NO CMD ACTIONS%C TST T.ST2(R5) ;TASK AT AST STATE??D BPL 103$ ;IF PL NO7E BIT #2,(SP) ;IS STOP ON NO COMMAND OPTION SPECIFIEDAF BEQ 103$ ;IF EQ NO&G DRSTS D.RS80 ;SET DIRECTIVE STATUS+H103$: MOV (R3)+,R4 ;SAVE DESIRED CMD ADDRC'I MOV (R3)+,R0 ;GET CMD BUFFER ADDRESSI&J BNE 110$ ;IF NE, THERE IS A BUFFER+K105$: DRSTS D.RS98 ;SET DIRECTIVE STATUS L110$: MOV (R3)+,R1 ;GET LENGTH+M CMP #11,R1 ;IS IT ABOVE MINIMUM LENGTHRN BHI 105$ ;IF HI NO0O MOV R1,$TEMP0 ;SAVE LENGTH OF TASK CMD BUFFER0P MOV R0,-(SP) ;SAVE ADDRESS OF TASK CMD BUFFER-Q CALL $ACHKW ;ADDRESS CHECK COMMAND BUFFERM(R MOV (R3)+,R0 ;GET INFO BUFFER ADDRESSS BEQ 120$ ;IF EQ, NO BUFFER'T MOV (R3),R1 ;GET INFO BUFFER LENGTHD#U BMI 105$ ;IF MI, ILLEGAL LENGTHT*V CALL $ACHKW ;ADDRESS CHECK INFO BUFFER;W120$: MOV $CLICQ,R0 ;GET ADDRESS OF FIRST PACKET IT QUEUE#X BEQ 131$ ;IF EQ, QUEUE IS EMPTY1Y130$: CALL $SRCQ1 ;FIND A COMMAND FOR THIS CLI1Z BCC 140$ ;IF CC, FOUND ONE[;E"\; NO COMMAND EXISTS FOR THIS CLI];P^131$: TST (SP)+ ;CLEAN STACKR(_ MOV (SP)+,R0 ;GET DESIRED ACTION CODE!` BEQ 135$ ;IF EQ, RETURN ERRORU a ASR R0 ;FORCE TASK TO EXIT??b BCS 133$ ;IF CS YES1 c ASR R0 ;FORCE TASK TO STOP??$d BCC 135$ ;IF CC NO, RETURN ERRORe CALL $STPCT ;STOP THE TASKf DRSTS D.RS00 ;SET IS.CLR+g133$: JMP $DREXT ;FORCE THE TASK TO EXIT1)h135$: DRSTS D.RS8 ;SET ERROR CONDITION$i; j; CAN THIS PACKET BE USED1k;B!l140$: MOV R0,KISAR6 ;MAP PACKET%m CMP R4,R0 ;IS IT THE DESIRED ONE?n BEQ 150$ ;IF EQ YES o TST R4 ;TAKE ANY ONE?Tp BEQ 150$ ;IF EQ YESB.q145$: MOV @#140000,R0 ;POINT TO NEXT IN LISTr BR 130$ ;RESTART SEARCH >s150$: BIT #CC.CLI,@#C.CSTS+140000 ;IS THIS COMMAND FOR A CLIt BEQ 145$ ;IF EQ NO*u MOV @#C.CUCB+140000,R4 ;GET UCB ADDRESS$v MOV R0,-(SP) ;SAVE PACKET ADDRESS8w BIT #CC.MSG,@#C.CSTS+140000 ;IS THIS A SYSTEM MESSAGEx BNE 190$ ;IF NE YESHyz{ .IF DF X$$HDR| } MOV $SAHDB,KISAR6 ;MAP HEADER'~ MOV $SAHPT,R0 ;GET ADDRESS OF HEADERB€ .IFF ;X$$HDR�'‚ MOV $HEADR,R0 ;GET ADDRESS OF HEADEREƒ„ .ENDC ;X$$XDR…†,‡ ADD #H.CUIC,R0 ;POINT TO PROTECTION GROUP9ˆ TSTB T.GGF(R5) ;TASK HAVE ACTIVE GOUPT GLOBAL CONTEXT?A‰ BEQ 152$ ;IF EQ NO%Š CMPB U.LUIC(R4),1(R0) ;SAME GROUP? ‹ BEQ 152$ ;IF EQ YESR%Œ DRSTS D.RS17 ;RETURN IE.RSU ERRORC�152$:C*Ž .IF DF N$$DIR ;NAMED DIRECTORY SUPPORT�.� MOV T.CTX(R5),R1 ;GET CURRENT CONTEXT BLOCK‘ BEQ 153$ ;NONE%’ CALL $DLCTX ;DELETE CONTEXT BLOCKS“” .ENDC ;DF N$$DIR •,–153$: MOV T.OCBH(R5),R1 ;POINT TO OCB LIST — BR 155$ ;N'˜154$: MOV (R1),R1 ;POINT TO NEXT OCBI)™155$: BEQ 156$ ;IF EQ, END OF OCB LISTT4š CMP O.MCRL(R1),(SP) ;IS THIS OCB FOR THIS COMMAND› BNE 154$ ;IF NE NOœ� .IF DF N$$DIRžCŸ MOV O.STAT+10(R1),T.CTX(R5) ;PUT CONTEXT BLOCK FROM OCB INTO TCB5 ¡ .ENDC ;DF N$$DIRN¢0£ MOV O.STAT+4(R1),(R0) ;SET NEW PROTECTION UIC)¤ MOV (R0)+,-(SP) ;SAVE PROTECTION UIC-¥ MOV O.STAT+6(R1),(R0) ;SET NEW DEFAULT UICN,¦ BIS (R0)+,(SP)+ ;EITHER UIC SPECIFIED ?%§ BNE 158$ ;IF NE YES, LEAVE THEM5)¨ CMP -(R0),-(R0) ;BACK UP UIC POINTER$© BR 157$ ;Qª«156$: .IF DF N$$DIRO¬@­ MOV U.CTX(R4),T00PhùgzgM{güfàýfáþfDATA.CTX(R5) ;PUT CONTEXT BLOCK FROM TERM INTO TCB®¯ .ENDC ;DF N$$DIR°4±157$: MOV U.LUIC(R4),(R0)+ ;SET NEW PROTECTION UIC+² MOV U.UIC(R4),(R0)+ ;SET NEW DEFAULT UICM³´µ158$:R¶ .IF DF N$$DIR·)¸ MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING *¹ MOV T.CTX(R5),KISAR6 ;MAP CONTEXT BLOCKº BEQ 1585$ ;IF EQ, NONE/» INCB C.REF+140000 ;INCREMENT REFERENCE COUNT *¼1585$: MOV (SP)+,KISAR6 ;RESTORE MAPPING½¾ .ENDC ;DF N$$DIR5¿9À159$: MOV -2(R3),R0 ;GET ADDR OF INFO BUFFER IF PRESENTX#Á BEQ 190$ ;IF EQ, NO INFO BUFFERO! CALL $RELOC ;RELOCATE ADDRESS4à MOV R1,KISAR6 ;MAP INFO BUFFER IN USER TASK SPACE%Ä MOV (R3),R3 ;GET LENGTH OF BUFFER Å;*Æ; FILL INFORMATION BUFFER IN TASK SPACE;Ç;S!È ASR R3 ;CONVERT TO WORD COUNT'É BCS 105$ ;IF CS, LENGTH IS NOT EVEN+Ê BEQ 190$ ;IF EQ, BUFFER HAS LENGTH ZERO0!Ë MOV U.CW2(R4),(R2)+ ;GET U.CW254Ì SUB #3,R3 ;ARE THERE 3 WORDS LEFT IN INFO BUFFERÍ BLT 190$ ;IF LT NO'Î MOV T.OCBH(R5),R1 ;POINT TO OCB LIST Ï BR 164$ ;Q'Ð160$: MOV (R1),R1 ;POINT TO NEXT OCBR)Ñ164$: BEQ 170$ ;IF EQ, END OF OCB LIST;4Ò CMP O.MCRL(R1),(SP) ;IS THIS OCB FOR THIS COMMANDÓ BNE 160$ ;IF NE NO7Ô MOV O.STAT(R1),(R2)+ ;COPY FIRST HALF OF PARENT NAMEA:Õ MOV O.STAT+2(R1),(R2)+ ;COPY SECOND HALF OF PARENT NAME"Ö DEC R3 ;ANOTHER WORD IN BUFFER× BLT 190$ ;IF LT NO!Ø MOV R1,(R2)+ ;SAVE OCB ADDRESS Ù DEC R3 ;ROOM LEFT IN BUFFER?Ú BLT 190$ ;IF LT, NOT-Û MOV O.STAT+4(R1),(R2) ;COPY PROTECTION UICO$Ü MOV (R2)+,R0 ;SAVE PROTECTION UIC Ý DEC R3 ;ROOM LEFT IN BUFFER?Þ BLT 190$ ;IF LT, NON*ß MOV O.STAT+6(R1),(R2) ;COPY DEFAULT UIC&à BIS (R2)+,R0 ;EITHER UIC SPECIFIED?#á BNE 185$ ;IF NE YES, LEAVE THEMPâ ADD #2,R3 ;RESTORE LENGTH/ã CMP -(R2),-(R2) ;BACK UP INFO BUFFER POINTERN ä BR 180$ ;R+å170$: CLR (R2)+ ;CLEAR PARENT NAME FIELDLæ CLR (R2)+ ;R"ç DEC R3 ;ANOTHER WORD IN BUFFERè BLT 190$ ;IF LT NO&é CLR (R2)+ ;CLEAR OCB ADDRESS FIELD'ê180$: DEC R3 ;ANOTHER WORD IN BUFFER2ë BLT 190$ ;IF LT NO'ì MOV U.LUIC(R4),(R2)+ ;COPY LOGIN UICBí DEC R3 ;ROOM LEFT IN BUFFERAî BLT 190$ ;IF LT NO-ï MOV U.UIC(R4),(R2)+ ;COPY CURRENT UIC CODE$ð185$: DEC R3 ;ROOM LEFT IN BUFFERñ BLT 190$ ;IF LT NO2ò CLR (R2) ;ASSUME DO NOT SUPPLY COMMAND ADDRESS)ó TSTB 4(SP) ;IS COMMAND TO BE DEQUEUEDLô BPL 190$ ;IF PL YES2õ MOV (SP),(R2) ;SUPPLY ADDRESS OF COMMAND BUFFERö;T1÷; COPY COMMAND FROM POOL INTO THE TASK'S BUFFERFø;Hù190$: BIC #T3.MCR!T3.CMD,T.ST3(R5) ;ASSUME NO PROMPT OR SERIAL CMD EXE/ú MOV (SP)+,R5 ;COPY POINTER TO BUFFER IN POOLM)û MOV R5,KISAR6 ;MAP COMMAND IN SEC POOL.ü MOV (SP),R0 ;GET ADDRESS OF BUFFER IN TASKýþ ASSUME C.CSO,C.CMCDÿ< MOV @#C.CSO+140000,(SP) ;SAVE START OFFSET OR MSG NUMBER5 MOVB @#C.CTR+140000,-(SP) ;SAVE COMMAND TERMINATORE. MOV @#C.CSTS+140000,-(SP) ;SAVE STATUS WORD2 MOV @#C.CCT+140000,-(SP) ;SAVE CHARACTER COUNT( CALL $RELOC ;RELOCATE BUFFER ADDRESS+ MOV R1,KISAR6 ;MAP USER'S COMMAND BUFFERS MOV R1,R3 ;SAVE APR BIAS. BIT #CC.MSG,2(SP) ;IS THIS A MESSAGE PACKET BNE 200$ ;IF NE YESA  MOV R4,R1 ;COPY UCB ADDRESSP  MOV (R4),R0 ;POINT TO DCB ,  TST (R0)+ ;POINT TO ADDRESS OF FIRST UCB-  SUB (R0)+,R1 ;CALC RELATIVE ADDRESS OF UCBU$  MOV (R0)+,(R2)+ ;COPY DEVICE NAME. MOV (R0)+,(R2) ;GET LOW UNIT NUMBER FOR DCB MOV R2,-(SP) ;SAVE R2" MOV (R0),R2 ;GET LENGTH OF UCB CLR R0 ;SET UP R0,R1 PAIRR( DIV R2,R0 ;CALC RELATIVE UNIT NUMBER MOV (SP)+,R2 ;RESTORE R25 ADD R0,(R2)+ ;CALC LOGICAL UNIT NUMBER IN LOW BYTEI/ INC (SP) ;INCREASE CHAR COUNT TO INCLUDE CRM/ MOV #1,-(SP) ;REMEMBER TO DECREMENT IT LATERI  BR 210$ ;T,200$: CLR (R2)+ ;ZERO TO INDICATE MESSAGE. MOV 6(SP),(R2)+ ;PUT MESSAGE CODE IN BUFFER2 CLR 6(SP) ;ZERO FOR LATER CODE THAT USES C.CSO3 CLR 10(SP) ;FORCE MESSAGE BUFFER TO BE DEQUEUED20 CLR -(SP) ;DO NOT HAVE TO CORRECT CHAR COUNT0210$: MOV 2(SP),R1 ;GET NUMBER OF CHARS IN CMD- MOV $TEMP0,R0 ;GET LENGTH OF TA00P h‘%hg´cÚµcÛ¶c�·c›’SK'S BUFFERD0 SUB #10,R0 ;CALC SPACE AVAILABLE FOR COMMAND-  CLR -(SP) ;ASSUME LENGTHS WILL BE CORRECTM4! CMP R0,R1 ;COMPARE SIZE OF TASK AND POOL BUFFERS)" BLO 220$ ;IF LO, USE TASK BUFFER SIZEN## MOV R1,R0 ;USE POOL BUFFER SIZEU'$ BIT #CC.MSG,6(SP) ;IS THIS A MESSAGEZ4% BNE 220$ ;IF NE YES, DO NOT DECREMENT ANY COUNTS7& MOV #400,(SP) ;HAVE TO DECREMENT COUNT IN UPPER BYTE 7'220$: MOVB R0,-1(R2) ;PUT ACTUAL COUNT IN TASK BUFFERB.( SUB (SP)+,-2(R2) ;CORRECT ACTUAL CHAR COUNT/) MOV R1,(R2) ;PUT BUFFER SIZE IN TASK BUFFERA4* SUB (SP)+,(R2)+ ;CORRECT SIZE OF ORIGINAL COMMAND"+ TST (SP)+ ;POP C.CCT OFF STACK , MOV (SP)+,R1 ;GET STATUS BITSE- BIC #^C,R1 ;ISOLATE STATUS BITS TO BE PASSEDR". ASH #7,R1 ;SHIFT INTO POSITION6/ BISB (SP)+,R1 ;PUT TERMINATOR CHARACTER IN POSITION;0 MOV R1,(R2)+ ;PUT TERMINATOR AND STATUS BITS IN USER BUFR"1 TST R0 ;ANY CHARACTERS TO COPY2 BEQ 240$ ;IF EQ NO"3 MOV R5,R1 ;SET SOURCE APR BIAS4 MOV R2,R4 ;DESTINATION DISP 15 MOV #C.CTXT+120000,R2 ;SET SOURCE DISPLACEMENT+-6 ADD (SP),R2 ;POINT TO START OF VALID TEXT+07 CALL $BLXIO ;COPY COMMAND INTO TASK'S BUFFER(8240$: MOV R5,KISAR6 ;MAP COMMAND AGAIN%9 TST (SP)+ ;CLEAN C.CSO FROM STACK8: BIT #CC.MSG,@#C.CSTS+140000 ;IS THIS A SYSTEM MESSAGE; BNE 260$ ;IF NE YESI*< MOV $TKTCB,R3 ;CURRENT TASK TCB ADDRESS'= TST @#C.CCT+140000 ;ANY TEXT PRESENTH> BEQ 250$ ;IF EQ NO1? CMPB #33,@#C.CTR+140000 ;TERMINATED BY ESCAPE?S@ BEQ 250$ ;IF EQ YESI.A BIS #T3.MCR,T.ST3(R3) ;FORCE PROMPT ON EXIT?B250$: BIT #CC.TTD,@#C.CSTS+140000 ;DID CMD ORIGINATE IN TTDRVCC BEQ 260$ ;IF EQ NO@D BIS #T3.CMD,T.ST3(R3) ;PROPOGATE SERIAL CMD EXECUTION ON EXIT0E260$: TSTB (SP)+ ;LEAVE COMMAND PACKET QUEUE?F BMI DUN ;IF MI YES'G MOV R5,R1 ;GET CMD ADDR IN SEC POOL $H MOV #$CLICQ,R0 ;POINT TO LISTHEADI CALL $GTSPK ;DEQUEUE PACKET "J MOV R1,R0 ;COPY PACKET ADDRESS0K MOVB @#C.CBLK+140000,R1 ;GET LENGTH OF PACKET0L CALLR $DESEC ;DEALLOCATE AND RETURN TO DRDSPLDUN: RETURN ; BM385TMN .ENDC ;A$$CLIOp .END ;**-32GINATE IN TTDRVCC BEQ 260$ ;IF EQ NO@D BIS #T3.CMD,T.ST3(R3) ;PROPOGATE SERIAL CMD EXECUTION ON EXIT0E260$: TSTB (SP)+ ;LEAVE COMMAND PACKET QUEUE?F BMI DUN ;IF MI YES'G MOV R5,R1 ;GET CMD ADDR IN SEC POOL $H MOV #$CLICQ,R0 ;POINT TO LISTHEADI CALL $GTSPK ;DEQUEUE PACKET "J MOV R1,R0 ;COPY PACKET ADDRESS0K MOVB @#C.CBLK+140000,R1 ;GET LENGTH OF PACKET0L CALLR $DESEC ;DEALLOCATE# .TITLE DCDBG - Debug SubroutinesI .IF DF D$$CHE!CHEDBGR .IDENT /01.00/ .MCALL HWDDF$& HWDDF$ ;DEFINE HARDWARE REGISTERS;R8; Copyright (c) 1986 by DIGITAL EQUIPMENT CORPORATION. ; All rights reserved. ;$ ; K ; This module contains various routines to support information dumping inS ; disk data caching.;  .PSECT DC$SUB,RO,I;+G; $SAVE - Routine to save the general registers around the debugging C; operations;- $SAVE::  MOV R1,-(SP) MOV 2(SP),R1  MOV R0,2(SP)e MOV R2,-(SP)C MOV R3,-(SP)D MOV R4,-(SP) MOV R5,-(SP) MOV R1,-(SP)N  RETURNR;+K ; $RSTOR - Routine to restore the general registers around the debugging s!; operations";- #$RSTOR::$ MOV (SP)+,R0r% MOV (SP)+,R5s& MOV (SP)+,R4n' MOV (SP)+,R3 ( MOV (SP)+,R2.) MOV (SP)+,R1 * MOV R0,-(SP)++ MOV 2(SP),R0t, MOV (SP)+,(SP)e - RETURNr./;+P0; $PTMSG - Routine to put out a message to the debugging logger. This routineF1; saves all registers. The default size of 20. words of pool will be2; allocated.3; 4; Inputs:PL5; R1 - Size of pool to be allocated, does not include additional 20. words6; R2 - Opcode values7;- 8$PTMSG::=9 ADD #<10.*2>,R1 ; Set up default size of allocation bufferP4: CALL $ALOC ; Allocate and pass the block of data ; RETURNM<=;+K>; $ALOC - Routine to allocate a chunk of primary pool for data dumping toRD?; a processing/display task, insert chunk in t00‘(hQ*hzgM{güfàýfáþfDATAhe listhead, and put(@; an eight word timestamp in the data.A;wEB; The following locations temporarily hold the following data until 0C; locations in the Executive can be allocated:AD; $SHERR - TCB address of processing task to deallocate blocks.!E; and print messages to fileo>F; $SHLIM - Listhead pointer for secondary pool blocks to be6G; processed. If zero, nothing to do. The location7H; just beyond $SHLIM is also used as the listhead.r3I; $SHLOS - Storage value for output line pointeraJ;tGK; If these locations are used as is, Shadow recording cannot be used.iEL; SHE... MUST be removed or the system will lose pool very rapidly.eM;e N; Inputs:aIO; R1 - Size of primary pool block to be allocated. This number must be?P; at least 10. words to accomodate the forward pointer, sizef@Q; word and eight words of time stamp but must be smaller than R; 256. DS; R2 - Byte Operation code to be placed in upper byte of size word T; Outputs: U; CC:o>V; R0SEND REQUEST AND CONNECT / VARIABLE SEND REQUEST AND CONNECT /!P; SEND REQUEST AND PASS OCB Q;R R; SRDC$S;GT; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A SEND DATA PACKET FORGU; THE SPECIFIED TASK, CONNECT TO THE TASK AND REQUEST IT IF IT IS NOTV; ALREADY ACTIVE.W;DX; DPB FORMAT: (FOR SDRC$)LY;K%Z; WD. 00 -- DIC(141.),DPB SIZE(7.).T/[; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50.L0\; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50.%]; WD. 03 -- ADDRESS OF SEND BUFFER.E=^; WD. 04 -- EFN, LENGTH OF ESB (0 = 1 WORD, >0 = 8. WORDS).A_; WD. 05 -- ADDRESS OF AST ROUTINE TO ENTER UPON STATUS RETURN.D+`; WD. 06 -- ADDRESS OF EXIT STATUS BLOCK. a;P b; VSRC$c;HBd; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A VARIABLE LENGTHDe; SEND DATA PACKET FOR THE SPECIFIED TASK, CONNECT TO THE TASK AND+f; REQUEST IT IF IT IS NOT ALREADY ACTIVE.-g;Sh; DPB FORMAT: (FOR VSRC$)Li; &j; WD. 00 -- DIC (141.),DPB SIZE(8.)./k; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50. 0l; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50.%m; WD. 03 -- ADDRESS OF SEND BUFFER.R=n; WD. 04 -- EFN, LENGTH OF ESB (0 = 1 WORD, >0 = 8. WORDS).E$o; WD. 05 -- LENGTH OF SEND BUFFER.Ap; WD. 06 -- ADDRESS OF AST ROUTINE TO ENTER UPON STATUS RETURN.E+q; WD. 07 -- ADDRESS OF EXIT STATUS BLOCK.Tr;C s; SDRP$Ht;KGu; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A SEND DATA PACKET FOR Ev; THE SPECIFIED TASK, UNLINK ALL OR A SELECTED OCB FROM THE CURRENT-Fw; TASK, LINK THE OCB(S) OFF THE SPECIFIED TASK, AND REQUEST IT IF ITx; IS NOT ALREADY ACTIVE.y;Rz; DPB FORMAT: (FOR SDRP$) {; $|; WD. 00 -- DIC(141.),DPB SIZE(9.).}; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50/~; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50P$; WD. 03 -- ADDRESS OF SEND BUFFER€; WD. 04 -- EFN, FLAGS BYTEC3�; WD. 05 -- LENGTH OF SEND BUFFER (DEFAULT = 13.)SE‚; WD. 06 -- FIRST HALF OF NAME OF PARENT WHOSE OCB SHOULD BE PASSEDA/ƒ; WD. 07 -- SECOND HALF OF PARENT'S TASK NAME 5„; WD. 08 -- ADDRESS OF OCB TO PASS (CLI TASKS ONLY)I…;†;S ‡; INPUTS:Aˆ;.-‰; R0=ADDRESS OF THE TCB OF THE TARGET TASK. :Š; R1=ADDRESS OF THE TASK STATUS WORD OF THE TARGET TASK.B‹; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.5Œ; R3=ADDRESS OF THE SEND BUFFER ADDRESS IN THE DPB. 1�; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.E.Ž; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.�;O�;E=‘; NOTE: ON SYSTEMS SUPPORTING NON RESIDENT TASK HEADERS ANDR5’; PROTOTYPE TCBS, KISAR6 MAY MAP THE PROTOTYPE TCB(6“; AT ENTRY AND THEREFORE WE CAN NOT ASSUME THAT THE”; TASK HEADER IS MAPPED.R•;A7–; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)T—;.˜; ™; FOR SDRC$ AND VSRC$Tš;T/›; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. (œ; DIRECTIVE STATUS OF +1 IS RETURNED.!�; C=1 IF DIRECTIVE IS REJECTED.R6ž; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF A SEND,Ÿ; PACKET, OFFSPRING CONTROL BLOCK , TASK4 ; CONTROL BLOCK OR PARTITION CONTROL BLOCK COULD¡; NO00Q0h%hg´cÚµcÛ¶c�·c›’T BE ALLOCATED.T=¢; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF IT IS ILLEGALE!£; TO SEND TO THE TARGET TASK.A;¤; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN INVALID%¥; EVENT FLAG NUMBER IS SPECIFIED.T9¦; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE EXITR4§; STATUS BLOCK IS NOT ENTIRELY WITHIN THE USER'S ¨; SPACE.©; Dª; THE SDRP$ DIRECTIVE CON RETURN ALL OF THE ABOVE ERRORS, PLUS THE«; FOLLOWING THREE:¬;;­; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF A PARAMETERO7®; RESERVED FOR A LCI ONLY IS USED BY A NON-CLI TASKU5¯; OR AN ATTEMPT IS MADE TO PASS ALL OCBS TO A CLIK9°; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF THERE ISA&±; NO OCB FROM THE SPECIFIED PARENT;²; DIRECTIVE STATUS OR 'D.RS84' IS RETURNED IF A CLI TASKI3³; SPECIFIED BOTH A PARENT NAME AND OCB ADDRESS,R/´; AND THE TWO DO NOT IDENTIFY THE SAME OCB,O2µ; OR EITHER FIELD IS SUPPLIED WITH THE FLAG TO¶; PASS ALL OCBS·;-¸.¹$DRSRC::MOV R3,R1 ;COPY DPB ADDRESS TO SAVE7º MOV SP,$TEMP3 ;SAVE SP TO FACILITATE POSSIBLE UNWINDU9» CMPB $DICSV+1,#5 ;IS THIS ILLEGAL DPB LENGTH SPECIFIED5¼ BEQ ILLDPB ;IF EQ YES, NOTE THAT $DRSND VALIDATESA"½ ;DPB LENGTH FOR OTHER VALUES6¾ CALL ERRSV ;PUSH CONTEXT TO REVERSE SEND OPERATION&¿ .WORD NULL ;NO ROUTINE TO CALL NOW*À .WORD 10$ ;ADDRESS OF RECOVERY ROUTINEÁ .IF DF X$$HDRÃ-Ä MOV $SAHPT,R4 ;RESTORE TASK HEADER ADDRESSEÅÆ .IFF Ç-È MOV $HEADR,R4 ;RESTORE TASK HEADER ADDRESSOÉÊ .ENDCË'Ì CALL $DRSND ;PERFORM SEND OPERATIONT$Í MOV 4(SP),R3 ;RESTORE DPB ADDRESS'Î TST (R3)+ ;POINT TO EVENT FLAG WORD.Ï CMPB $DICSV+1,#9. ;IS IT AN SDRP$ DIRECTIVEÐ BEQ 20$ ;IF EQ YES&Ñ BR CNRQT ;CONNECT AND REQUEST TASKÒ;N<Ó; CODE TO REMOVE SEND PACKET FROM RECEIVERS QUEUE ON ERRORÔ;N9Õ10$: ADD #T.RCVL,R0 ;POINT TO TARGET TASK RECEIVE QUEUED2Ö MOV 2(R0),R1 ;GET ADDRESS OF PACKET JUST QUEUED)× CALL $GTSPK ;REMOVE IT FROM THE QUEUE4%Ø MOV R1,R0 ;COPY POINTER TO PACKET.!Ù MOV R0,KISAR6 ;MAP SEND PACKETS,Ú MOV @#140002,R1 ;GET NUMBER OF WORDS SENT1Û ADD #<6.+37>,R1 ;ALLOW FOR EXTRA CONTROL WORDS)Ü ASH #-5,R1 ;CONVERT TO 32 WORD BLOCKSE'Ý CALLR $DESEC ;DEALLOCATE THE PACKETOÞ; .ß; LOCATE EXISTING OCB(S) FOR SDRP$ DIRECTIVEà;T:á20$: MOVB 1(R3),R2 ;GET FLAGS BYTE, DOES IT FORCE EXIT??â BMI 30$ ;IF MI YES6ã MOV #1,$TEMP3 ;DON'T FORCE EXIT, BUT IT IS AN SDRP$3ä30$: CMP (R3)+,(R3)+ ;POINT TO PARENT NAME FIELDS&å CALL LOCOCB ;LOCATE OCB(S) TO PASS!æ MOV $TKTCB,R5 ;SET TCB ADDRESSç JMP STRTSK ;REQUEST TASKèé;+ê; **-$DRCNC-CONNECT TO TASK ë;XFì; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CONNECT THE ISSUING TASK TO'í; THE SPECIFIED (ACTIVE) TARGET TASK.î;Aï; DPB FORMAT:)ð;S%ñ; WD. 00 -- DIC(143.),DPB SIZE(6.).,/ò; WD. 01 -- FIRST WORD OF TASK NAME IN RAD50.30ó; WD. 02 -- SECOND WORD OF TASK NAME IN RAD50.-ô; WD. 03 -- EFN, LENGTH OF ESB (DEFAULT=2).O:õ; WD. 04 -- ADDRESS OF AST ROUTINE TO ENTER UPON STATUS./ö; WD. 05 -- ADDRESS OF THE EXIT STATUS BLOCK.P÷;S ø; INPUTS:Aù;-ú; R0=ADDRESS OF THE TCB OF THE TARGET TASK.:û; R1=ADDRESS OF THE TASK STATUS WORD OF THE TARGET TASK.Bü; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.3ý; R3=ADDRESS OF THE EVENT FLAG NUMBER IN THE DPB.1þ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK..ÿ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;D7; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)D; /; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.-(; DIRECTIVE STATUS OF +1 IS RETURNED.!; C=1 IF DIRECTIVE IS REJECTED.S<; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF AN OFFSPRING+; CONTROL BLOCK COULD NOT BE ALLOCATED.S=; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF AN ATTEMPT ISD* ; BEING MADE TO CONNECT TO A CLI TASK.: ; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF THE TARGET ; TASK IS NOT ACTIVE.R; ; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN INVALIDN% ; EVENT FLAG NUMBER IS SPECIFIED.E9; DIRECTIVE STATUS OF 'D.00Q8h*hzgM{güfàýfáþfDATARS98' IS RETURNED IF THE EXITS0; STATUS BLOCK IS NOT ENTIRELY IN THE USER'S ; SPACE.;->$DRCNC::MOV #ERRSV,-(SP) ;PUSH ADDRESS OF ERROR SAVE ROUTINE$ TST (R1) ;IS TARGET TASK ACTIVE? BMI 10$ ;IF MI NOD, BIT #T3.CLI,T.ST3(R0) ;TARGET TASK A CLI? BEQ CNRQT ;IF EQ NOR' DRSTS D.RS2 ;CONNECTING TO CLI TASKH.10$: DRSTS D.RS7 ;SPECIFIED TASK NOT ACTIVE;+0; **-$DRREQ-REQUEST, SPAWN, OR CHAIN TO A TASK;LH; THIS ROUTINE INSTRUCTS THE SYSTEM TO REQUEST, SPAWN, OR CHAIN TO THEI; SPECIFIED TASK, DEPENDING ON THE DPB SIZE. IF THE DIRECTIVE IS RPOI$,= ; THE TASK IS CHAINED TO BY UNLINKING ALL OR A SELECTED OCBEB!; FROM THE CURRENT TASK, AND LINKING IT TO THE TARGET TASK. THIS5"; DIFFERS FROM SPWN$ IN THAT NO NEW OCB IS CREATED.Q#;T&$; DPB FORMAT: (FOR SPAWN OR REQUEST)%;C1&; WD. 00 -- DIC(11.),DPB SIZE(7., 13., OR 14.).C/'; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50.C0(; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50.;); WD. 03 -- FIRST WORD OF PARTITION NAME - NOT SUPPORTED.A<*; WD. 04 -- SECOND WORD OF PARTITION NAME - NOT SUPPORTED./+; WD. 05 -- REQUEST PRIORITY - NOT SUPPORTED.L,; WD. 06 -- REQUEST UIC.=-; WD. 07 -- EFN, LENGTH OF ESB (0 = 1 WORD, >0 = 8. WORDS). :.; WD. 08 -- ADDRESS OF AST ROUTINE TO ENTER UPON STATUS.(/; WD. 09 -- EXIT STATUS BLOCK ADDRESS.?0; WD. 10 -- ADDRESS OF COMMAND LINE TO QUEUE FOR TARGET TASK. %1; WD. 11 -- LENGTH OF COMMAND LINE.232; WD. 12 -- VIRTUAL TERMINAL UNIT NUMBER FOR TI:. 03; WD. 13 -- ASCII DEVICE NAME (OPTIONAL FIELD)4; 5; DPB FORMAT: (FOR RPOI$)N6; %7; WD. 00 -- DIC (11.),DPB SIZE(16.) /8; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50. 09; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50.;:; WD. 03 -- FIRST WORD OF PARTITION NAME - NOT SUPPORTED.N<;; WD. 04 -- SECOND WORD OF PARTITION NAME - NOT SUPPORTED./<; WD. 05 -- REQUEST PRIORITY - NOT SUPPORTED.T=; WD. 06 -- REQUEST UIC.F>; WD. 07 -- FIRST HALF OF NAME OF PARENT,WHOSE OCB SHOULD BE PASSED.,?; WD. 08 -- SECOND HALF OF NAME OF PARENT.5@; WD. 09 -- ADDRESS OF OCB TO PASS (CLI TASK ONLY).(A; WD. 10 -- ADDRESS OF COMMAND BUFFER.'B; WD. 11 -- LENGTH OF COMMAND BUFFER.02C; WD. 12 -- UNIT NUMBER OF TASK TI:, FLAGS BYTE.(D; WD. 13 -- ASCII DEVICE NAME FOR TI:.BE; WD. 14 -- FIRST HALF OF NAME TO BE USED FOR NEW TASK IN RAD50.CF; WD. 15 -- SECOND HALF OF NAME TO BE USED FOR NEW TASK IN RAD50. G;6 H; INPUTS:II;-J; R0=ADDRESS OF THE TCB OF THE TARGET TASK.O:K; R1=ADDRESS OF THE TASK STATUS WORD OF THE TARGET TASK.BL; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.5M; R3=ADDRESS OF THE PARTITION NAME WORD IN THE DPB.G1N; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.F.O; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.P;M7Q; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)OR; /S; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. (T; DIRECTIVE STATUS OF +1 IS RETURNED.!U; C=1 IF DIRECTIVE IS REJECTED.O=V; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF AN ALLOCATIONU2W; FAILURE OCCURS ON A PARTITION CONTROL BLOCK,3X; OFFSPRING CONTROL BLOCK, COMMAND LINE BUFFER,DY; OR A TASK CONTROL BLOCK.=Z; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF AN ATTEMPT ISF4[; MADE TO ISSUE A SPAWN TO A COMMAND LINE INTER-/\; PRETER WITHOUT SPECIFYING A COMMAND LINE.T=]; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF THE SPECIFIED 1^; TASK IS ALREADY ACTIVE (WITH EXCEPTION OF A +_; SPAWN TO A COMMAND LINE INTERPRETER).A;`; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF AN INVALIDC)a; VIRTUAL TERMINAL UNIT IS SPECIFIED.F;b; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN INVALID %c; EVENT FLAG NUMBER IS SPECIFIED.F9d; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE EXIT 6e; STATUS BLOCK OR THE COMMAND LINE IS NOT ENTIRELY%f; IN THE TASK'S ADDRESSING SPACE.I;g; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF AN ILLEGALK,h; DPB SIZE IS SPECIFIED (NOT 7. OR 13.).i;WKj; THE ABOVE ERRORS ALSO APPLY TO THE RPOI$ DIRECTIVE, EXCEPT FOR 'D.RS97'R00Q@h%hg´cÚµcÛ¶c�·c›’Ck; WHICH IT CANNOT RETURN. THE RPOI$ DIRECTIVE CAN ALSO RETURN THEDl; FOLLOWING ERRORS.Sm;S;n; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF A PARAMETERD7o; RESERVED FOR A CLI ONLY IS USED BY A NON-CLI TASKE6p; OR AN ATTEMPT IS MADE TO PASS ALL OCBS TO A CLI.9q; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF THERE ISE'r; NO OCB FROM THE SPECIFIED PARENT.E;s; DIRECTIVE STATUS OF 'D.RS84' IS RETURNED IF A CLI TASK 3t; SPECIFIED BOTH A PARENT NAME AND OCB ADDRESS,X2u; AND THE TWO DO NOT IDENTIFY THE SAME OCB, OR,v; EITHER FIELD IS SUPPLIED WITH THE FLAG'w; REQUESTING ALL OCBS TO BE PASSED.Ux;-y z .ENABL LSBI:{$DRREQ::MOV SP,$TEMP3 ;SAVE CURRENT STACK TO EASE UNWIND)| CALL ERRSV ;INITIALIZE ERROR RECOVERYO#} .WORD NULL ;NO IMMEDIATE ACTIONI"~ .WORD NULL ;NO RECOVERY ACTION' ADD #6,R3 ;POINT TO UIC WORD IN DPBE2€ MOV (R3)+,R4 ;PICK UP SPECIFIED UIC FOR REQUEST/� CMPB $DICSV+1,#7. ;IS THIS A SIMPLE REQUEST?N‚ BNE 5$ ;IF NE NO(ƒ MOV T.UCB(R5),R5 ;GET TARGET UCB ADDR„ CLR $TEMP3 ;NOT AN RPOI$$… JMP RQST2 ;DO REQUEST PROCESSING6†5$: CMPB $DICSV+1,#13. ;IS IT A VALID SPAWN REQUEST?‡ BEQ CNRQT ;IF EQ YES>ˆ CMPB $DICSV+1,#14. ;IS IT A SPAWN REQUEST WITH TI SPECIFIED‰ BEQ CNRQT ;IF EQ YES%Š CMPB $DICSV+1,#16. ;IS IT AN RPOI$N‹ BNE 10$ ;IF NE NON9Œ MOVB 13(R3),R2 ;GET FLAGS BYTE, SHOULD EXIT BE FORCED? � BMI 7$ ;IF MI YESF<Ž MOV #1,$TEMP3 ;NO FORCED EXIT, BUT REMEMBER THIS IS RPOI$)�7$: CALL LOCOCB ;LOCATE OCB(S) TO PASSG2� ADD #6,R3 ;POINT TO COMMAND BUFFER ADDR IN DPB‘ BR 35$ ;JOIN COMMON CODE’,“10$: MOV (PC)+,R5 ;ASSUME ILLEGAL DPB SIZE”ILLDPB: DRSTS D.RS99 ;I• JMP ERROR ;ILLEGAL DPB SIZEI–—;A0˜; CONNECT PROCESSING (CNCT, SDRC, SPWN, VSRC).™;Hš; COMMON CONNECT AND REQUEST PROCESSING BEGINS HERE FOR REQUEST/SPAWN,N›; CONNECT, AND (VARIABLE) SEND REQUEST AND CONNECT DIRECTIVES. THE FOLLOWINGHœ; SECTION PERFORMS THE CONNECT PROCESSING. AN OFFSPRING CONTROL BLOCKJ�; IS ALLOCATED TO BE QUEUED TO THE OFFSPRING TASK'S OCB QUEUE. THEN THEGž; EVENT FLAG AND EXIT STATUS BLOCK PARAMETERS ARE CHECKED AS THE OFF-PCŸ; SPRING CONTROL BLOCK IS INITIALIZED. IF AN OCB IS SUCCESSFULLYH ; ALLOCATED, ITS ADDRESS IS STORED IN $TEMP1 AS A FLAG THAT IT MUST BE1¡; QUEUED TO THE TARGET TASK ON SUCCESSFUL EXIT.E¢;/£;,>¤; NOTE: ON SYSTEMS SUPPORTING NON RESIDENT TASK HEADERS AND5¥; PROTOTYPE TCBS, KISAR6 MAY MAP THE PROTOTYPE TCBE6¦; AT ENTRY AND THEREFORE WE CAN NOT ASSUME THAT THE§; TASK HEADER IS MAPPED.S¨;C$©; REGISTER CONTENTS AT THIS POINT:ª; /«; R3=PTR TO THE EVENT FLAG NUMBER IN THE DPB.¬;P­5®CNRQT: CLR $TEMP3 ;NOT AN RPOI$ OR SDRP$ DIRECTIVEL#¯ MOV #O.LGTH,R1 ;PICK UP OCB SIZER6° CALL @(SP)+ ;ALLOCATE OCB WITH TRAIL TO DEALLOCATE,± .WORD $ALOCB ;ALLOCATION ROUTINE ADDRESS-² .WORD DEOCB ;DEALLOCATION ROUTINE ADDRESS (³ BCC 20$ ;IF CC ALLOCATION SUCCESSFUL-´ JMP ALLER ;ELSE REPORT ALLOCATION FAILUREN3µ20$: MOV R0,$TEMP1 ;STORE OCB ADDRESS FOR CONNECTD1¶ MOV (PC)+,R5 ;ASSUME INVALID EVENT FLAG NUMBER · DRSTS D.RS97 ;¸ MOV R0,R4 ;COPY OCB POINTERT.¹ MOVB (R3)+,R0 ;PICK UP SPECIFIED EVENT FLAG)º CMP R0,#96. ;VALID EVENT FLAG NUMBER?R» BHI 10$ ;IF HI NO1¼ CMP R0,#64. ;IS IT A GROUP GLOBAL EVENT FLAG?E½¾ .IF DF G$$GEF¿À BLOS 25$ ;IF LOS NO.Á MOV R4,-(SP) ;SAVE R4Âà .IF DF X$$HDRÄ-Å MOV KISAR6,-(SP) ;SAVE KERNEL APR6 MAPPING 2Æ MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER,Ç MOV $SAHPT,R4 ;GET ADDRESS OF TASK HEADERÈÉ .IFF Ê6Ë MOV $HEADR,R4 ;GET ADDRESS OF CURRENT TASK'S HEADERÌÍ .IFTFÎ9Ï MOVB H.CUIC+1(R4),R4 ;GET CUURRENT TASK'S GROUP NUMBERRÐÑ .IFTDÒ+Ó MOV (SP)+,KISAR6 ;RESTORE KERNEL MAPPINGCÔÕ .ENDCÖ× MOV R0,-(SP) ;SAVE R04Ø CALL $SRGEF ;SEARCH FOR GROUP GLOBAL EVENT FLAGSÙ MOV (SP)+,R0 ;RESTORE R0Ú MOV (SP)+,R4 ;RESTORE R4V0Û BCS 10$ ;IF CS, INVALID EVENT FLAG SPECIFIEDÜÝ .IFF ; DF G$$GEFIÞ)ß BHI 10$ ;INVALID EVENT00QHh*hzgM{güfàýfáþfDATA FLAG SPECIFIED àá .ENDC ; DF G$$GEF6â25$: MOV $TKTCB,R5 ;PICK UP CURRENT TASK TCB ADDRESS'ã MOV R0,-(SP) ;SAVE EVENT FLAG NUMBER17ä CALL $CEFIG ;CONVERT EVENT FLAG TO MASK AND ADDRESS0å BIC #1,R1 ;CLR GRP GLOBAL 2ND WORD INDICATOR!æ BIC R0,(R1) ;CLEAR EVENT FLAGS.ç TST (R4)+ ;SKIP OVER OCB LINK WORD (O.LNK)2è CLR (R4)+ ;INITIALLY CLR MCR LINE PTR (O.MCRL)0é MOV R5,(R4)+ ;SET PARENT TCB ADDRESS (O.PTCB).ê MOV #2,R1 ;ASSUME 1 WORD EXIT STATUS BLOCKë CLR R0 ;DITTOV3ì TSTB (R3)+ ;WAS IT A 1 WORD EXIT STATUS BLOCK ?í BEQ 27$ ;IF EQ YES(î MOV #8.*2,R1 ;DEFAULT SIZE TO 8 WORDSï INC R0 ;SET FULL ESB FLAG3ð27$: CMPB $DICSV+1,#8. ;IS THIS A VSRC$ DIRECTIVESñ BNE 28$ ;IF NE NOG,ò TST (R3)+ ;SKIP BUFFER SIZE FIELD IN DPBó28$: ;REFERENCE LABELôõö .IF DF S$$LIB÷.ø MOV (R3)+,R2 ;PICK UP SPECIFIED AST ADDRESS-ù CALL $CALTA ;CALCULATE PROPER AST ADDRESSD/ú MOV R2,(R4)+ ;SET PROPER AST ADDRESS (O.AST) ûü .IFFý+þ MOV (R3)+,(R4)+ ;SET AST ADDRESS (O.AST)Rÿ .ENDC1 MOV (SP)+,(R4)+ ;SET EVENT FLAG NUMBER (O.EFN)S( MOV R0,(R4) ;INDICATE 1/8 WORDS LONG2 MOV (R3)+,R0 ;PICK UP EXIT STATUS BLOCK ADDRESS. BIS R0,(R4)+ ;SET EXIT STATUS BLOCK ADDRESS7 MOV T.NAM(R5),(R4)+ ;STORE PARENT TASK NAME (O.STAT)" MOV T.NAM+2(R5),(R4)+ ;O.STAT+2(  CLR (R4)+ ;INITIALIZE PROTECTION UIC%  CLR (R4)+ ;INITIALIZE DEFAULT UICD.  CLR (R4) ;INITIALIZE CONTEXT BLOCK POINTER(  TST R0 ;EXIT STATUS BLOCK SPECIFIED?+  BEQ 30$ ;IF EQ NO, BYPASS ADDRESS CHECK0 CALL $ACHCK ;ADDRESS CHECK EXIT STATUS BLOCK# BCC 30$ ;IF CS ADDRESS CHECK OK/(29$: JMP ADCER ;ADDRESS CHECK FAILUREG30$: CMPB $DICSV,#141. ;IS DIRECTIVE A (VAR) SEND, REQUEST & CONNECT?1 BEQ STRTSK ;IF EQ YES, BRANCH TO REQUEST TASKT' BLO 35$ ;IF LO IT IS SPAWN OR RPOI$4 JMP SUCCESS ;IF HI IT IS CONNECT, RETURN SUCCESS/STRTSK: CLR R4 ;PROPAGATE ISSUING TASK'S UICE( MOV T.UCB(R5),R5 ;SET TI: UCB ADDRESS( JMP RQST1 ;GO TO COMMON REQUEST CODE35$: ;REFERENCE SYMBOL;H9; TI: DETERMINATION AND COMMAND LINE PROCESSING (SPWN).D;CG; HERE THE TARGET TASK'S TI: IS DETERMINED FOR THE SUBSEQUENT REQUEST4A; AND COMMAND LINE PROCESSING IS INITIATED. IF A TERMINAL UNIT;A; HAS BEEN SPECIFIED, THEN IT IS VERIFIED AND ITS UCB IS FOUND.O3 ; OTHERWISE THE ISSUING TASK'S UCB IS PROPAGATED.N!;E$"; REGISTER CONTENTS AT THIS POINT:#;S5$; R3=PTR TO COMMAND LINE BUFFER ADDRESS IN THE DPB.J"%; R5=TCB ADDRESS OF CURRENT TASK&;5',(40$: MOV T.UCB(R5),R2 ;GET TI: UCB ADDRESS9) CMPB $DICSV+1,#14. ;CAN TI BE SOMETHING OTHER THAN VT?E* BLT 45$ ;IF LT NOI&+ TST 6(R3) ;WAS A DEVICE SPECIFIED?, BEQ 45$ ;IF EQ NOP$- CMP 6(R3),#"VT ;IS "VT" SPECIFIED. BNE 64$ ;IF NE NOE/45$: ;REFERENCE SYMBOLN01 .IF DF V$$TRM283 MOVB 4(R3),R1 ;WAS A VIRTUAL TERMINAL UNIT SPECIFIED?14 BEQ 80$ ;IF EQ NO, DO COMMAND LINE PROCESSINGR05 MOV $VTDCB,R2 ;POINT TO FIRST CREATED VT: DCB6650$: CMPB D.UNIT(R2),R1 ;IS THIS THE UNIT SPECIFIED?7 BEQ 60$ ;IF EQ YES'8 MOV (R2),R2 ;ELSE POINT TO NEXT DCBS49 CMP D.NAM(R2),#"VT ;IS IT A VIRTUAL TERMINAL DCB?: BEQ 50$ ;IF EQ YES!; BR ILUER ;RETURN ERROR STATUS)<60$: MOV D.UCB(R2),R2 ;POINT TO VT: UCBE>< BIT #T3.CLI,T.ST3(R5) ;IS THE ISSUING TASK A CLI? ;PKW111+< BNE 80$ ;YES, LET IT THROUGH ;PKW111MK< CMP R2,T.UCB(R5) ;IS THE ISSUING TASK ALREADY RUNNING ON THE VT? ;PKW111M&< BEQ 80$ ;THAT'S OK TOO ;PKW1112= CMP U.PTCB(R2),R5 ;UNIT CREATED BY THIS PARENT?> BNE ILUER ;IF NE NO ?@ .ENDC ;V$$TRMAB+C BR 80$ ;PERFORM COMMAND LINE PROCESSING D:E64$: MOV R3,R4 ;SAVE POINTER TO COMMAND LINE BUF IN DPB F MOV 6(R3),R0 ;GET DEVICE NAME-G BEQ 45$ ;IF EQ, DEVICE NAME NOT SPECIFIEDI'H MOV 4(R3),R1 ;GET DEVICE UNIT NUMBER;5I CALL $CVDVN ;CONVERT DEVICE NAME TO A UCB ADDRESS%J BCS ILUER ;IF CS DEVICE NOT FOUNDA*K BITB #US.OFL,U.ST2(R2) ;DEVICE OFFLINE?L BNE PRVER ;IF NE YES9M BIT #DV.TTY,U.CW1(R2)00QPh%hg´cÚµcÛ¶c�·c›’ ;IS SPECIFIED DEVICE A TERMINAL?N BEQ ILUER ;IF EQ NO4O CMP R2,T.UCB(R5) ;IS CURRENT TASK'S TI: SPECIFIEDP BEQ 70$ ;IF EQ YES6Q BIT #T3.PRV!T3.CLI,T.ST3(R5) ;IS TASK PRIV OR A CLIR BEQ PRVER ;IF EQ NOD2S70$: MOV R4,R3 ;GET ADDRESS OF COMMAND LINE BUF#T80$: MOV R2,R5 ;COPY UCB ADDRESSN(U BR CMLPR ;DO COMMAND LINE PROCESSING V .DSABL LSB WX; Y; LOCAL ERROR RETURN ROUTINES.Z;G[; THE FOLLOWING ROUTINES INTERFACE TO $DRTHR AND $ERREC FOR DIRECTIVEBE\; ERROR STATUS RETURNS AND ERROR RECOVERY. R5 IS USED TO STORE THEI"]; ERROR STATUS TRAP INSTRUCTION.^; _9`ADCER: MOV (PC)+,R5 ;PICK UP ADDRESS CHECK ERROR STATUS.a DRSTS D.RS98 ;3bERROR: JMP $ERREC ;THREAD THROUGH ERROR RECOVERYV8cILUER: MOV (PC)+,R5 ;PICK UP ILLEGAL DEVICE UNIT ERRORd DRSTS D.RS92 ;!e BR ERROR ;RETURN ERROR STATUSC5fPRVER: MOV (PC)+,R5 ;PICK PRIVILEGE VIOLATION ERRORNg DRSTS D.RS16 ;!h BR ERROR ;RETURN ERROR STATUSTBiILPARM: MOV (PC)+,R5 ;GET PARAMETER ILLEGAL FOR THIS TASK STATUSj DRSTS D.RS8 ; k BR ERROR ;4lNOTINS: MOV (PC)+,R5 ;GET TASK NOT INSTALLED ERRORm DRSTS D.RS2 n BR ERRORDop;K=q; DEOCB - DEALLOCATES THE CONTEXT BLOCK IN THE OCB (IF ANY)D"r; BEFORE DEALLOCATING THE OCBs;CtDEOCB:u .IF DF N$$DIR v!w MOV R1,-(SP) ;SAVE SIZE OF OCBR*x MOV O.STAT+10(R0),R1 ;GET CONTEXT BLOCKy BEQ 10$ ;IF EQ, NONE$z CALL $DLCTX ;DEALL CONTEXT BLOCK!{10$: MOV (SP)+,R1 ;RESTORE SIZEL|} .ENDC ;DF N$$DIRA~  JMP $DEACB €�; /‚; COMMAND LINE PROCESSING FOR SPWN$ AND RPOI$Iƒ;O„; REGISTERS AT THIS POINTA…;E/†; R3=POINTER TO COMMAND BUFFER ADDRESS IN DPB ‡; R5=TARGET TASK UCB ADDRESSˆ-‰CMLPR: MOV (R3),R0 ;COMMAND LINE SPECIFIEDIŠ BEQ 80$ ;IF EQ NOC&‹ MOV 2(R3),R1 ;GET LENGTH OF COMMAND&Œ BEQ 80$ ;IF EQ, EMPTY COMMAND LINE!� CMP #M$$XLN,R1 ;IS IT TOO LONG1Ž BLOS ADCER ;IF LOS YES+� CALL $ACHRO ;ADDRESS CHECK COMMAND LINER+� BCS ADCER ;IF CS, ADDRESS CHECK FAILURE'‘ MOV R3,$TEMP4 ;SAVE POINTER INTO DPBI,’ MOV 2(R3),R1 ;GET LENGTH OF COMMAND AGAIN@“ ADD #C.CTXT+1+77,R1 ;ALLOW FOR HEADER, FINAL CR, AND ROUNDOFF)” ASH #-6,R1 ;CONVERT TO 32 WORD BLOCKSE6• CALL @(SP)+ ;ALLOCATE A BUFFER FROM SECONDARY POOL$– .WORD $ALSEC ;ALLOCATION ROUTINE&— .WORD $DESEC ;DEALLOCATION ROUTINE˜ BCC 10$ ;IF CC OKE!™ JMP ALLER ;ALLOCATION FAILURE1š5›7$: MOV (PC)+,R5 ;PICK UP COMMAND LINE ERROR STATUSKœ DRSTS D.RS2 ;B!� BR ERROR ;RETURN ERROR STATUSLž3Ÿ10$: MOV KISAR6,-(SP) ;SAVE POTENTIAL TCB MAPPINGR#  MOV $TEMP0,R2 ;GET OFFSPRING TCB¡ MOV T.ST3(R2),R2 ;SAVE T.ST3E3¢ MOV R0,KISAR6 ;MAP SEC POOL BLOCK JUST ALLOCATED 4£ MOV #140004,R4 ;SET VIRT. ADDR TO REFERENCE BLOCK)¤ MOV R5,(R4)+ ;PUT UCB ADDRESS IN BLOCKO'¥ MOV 2(R3),(R4)+ ;SET CHARACTER COUNTA¦ CLR -(SP) ;INIT STATUS WORDO*§ BIT #T3.CLI,R2 ;IS OFFSPRING TASK A CLI¨ BEQ 30$ ;IF EQ NOK©ª« .IF DF A$$CLI¬+­ BIS #CC.CLI,(SP) ;SET CLI ONLY RETREIVALR®¯ .IFTF ;A$$CLI°/± MOV $TEMP1,R2 ;POINT TO OCB (IF ANY) TO PASSV² BEQ 20$ ;IF EQ, NO OCB0³ MOV R0,O.MCRL(R2) ;PUT COMMAND ADDRESS IN OCB´20$:*µ TST $TEMP3 ;IS THIS AN RPOI$ DIRECTIVE¶ BEQ 25$ ;IF EQ NO 1· MOV $TKTCB,R2 ;GET TCB ADDRESS OF CURRENT TASKS=¸ BIT #T3.CMD,T.ST3(R2) ;IS CURRENT TASK PART OF CLI COMMANDS¹ BEQ 25$ ;IF EQ NO8º BIS #CC.TTD,(SP) ;HAVE SYSTEM HANDLE AS IF FROM TTDRV»25$: ;REFERENCE LABEL¼½ .IFT ;A$$CLIC¾4¿ CMP $TEMP0,$MCRPT ;IS COMMAND GOING TO DISPATCHERÀ BNE 30$ ;IF NE NOO2Á CMP #^RMCR,-22(R3) ;WAS MCR... TARGET TASK NAME% BNE 30$ ;IF NE NO (IT WAS CLI...) )à BIS #CC.MCR,(SP) ;SET FORCE TO MCR BITTÄÅ .ENDC ;A$$CLIÆÇ'È30$: MOV (SP)+,(R4)+ ;SET STATUS WORDC4É CLR (R4)+ ;INIT STARTING RETURN OFFSET FOR GMCR$$Ê MOVB #33,(R4)+ ;ASSUME TERMINATOR*Ë MOVB R1,(R4)+ ;SET BLOCK ALLOCATE COUNT)Ì MOV (R3),R0 ;GET COMMAND TEXT ADDRESS:&Í CALL $RELOC ;RELOCATE USER ADDRESS*Î SUB #20000,R2 ;CONVERT TO APR 5 MAPPINGÏ MOV 2(R3),R0 ;GET L00QXh*hzgM{güfàýfáþfDATAENGTH Ð MOV R0,-(SP) ;SAVE LENGTH+Ñ MOV KISAR6,R3 ;GET DESTINATION APR6 BIAS "Ò CALL $BLXIO ;COPY COMMAND TEXT%Ó MOVB #15,(R4) ;TERMINATE WITH A CRÔ MOV (SP),R1 ;GET LENGTH00Õ40$: CMPB #33,-(R4) ;IS THIS CHAR A TERMINATORÖ BHIS 50$ ;IF HIS YES×45$: SOB R1,40$ ;LOOPØ TST (SP)+ ;CLEAN STACK#Ù BR 70$ ;NO EMBEDDED TERMINATORSC*Ú50$: BEQ 60$ ;IF EQ, AN ESC IS EMBEDDED#Û CMPB #15,(R4) ;IS A CR EMBEDDED?AÜ BNE 45$ ;IF NE NO2Ý60$: DEC R1 ;ADJUST COUNTER+Þ SUB R1,(SP) ;CALC DIFFERENCE IN LENGTHSV=ß SUB (SP)+,@#C.CCT+140000 ;CALC NUMBER OF CHARS NOW PRESENT 3à BISB #200,(R4) ;FLAG TERMINATOR AS USER SUPPLIEDT/á MOVB (R4),@#C.CTR+140000 ;SET NEW TERMINATOR:+â MOVB #15,(R4) ;FORCE TRAILING CHAR TO CR0ã70$: MOV R3,R1 ;GET ADDRESS OF SEC POOL BLOCK9ä MOV (SP)+,KISAR6 ;RESTORE POTENTIAL TARGET TCB MAPPINGT5å MOV #$CLICQ,R0 ;POINT TO LISTHEAD OF COMMAND QUEUEP7æ CALL @(SP)+ ;PUSH ROUTINE TO REMOVE LINE FROM QUEUE!ç .WORD NULL ;NOTHING TO DO NOWB!è .WORD $GTSPK ;DEQUEUE ROUTINEH5é MOV $TEMP4,R3 ;GET BACK POINTER TO CMD ADDR IN DPBO8ê MOV R1,$TEMP4 ;SAVE ADDRESS OF SEC POOL COMMAND BLOCK.ë80$: TST $TEMP4 ;IS A COMMAND LINE SUPPLIEDì BNE RQST ;IF NE YES) í MOV $TEMP0,R0 ;GET TARGET TCB'î BIT #T3.CLI,T.ST3(R0) ;IS TASK A CLIO-ï BNE 7$ ;IF NE YES, LI MUST HAVE A COMMANDEðñ;Pò; COMMON REQUEST PROCESSING;ó;TDô; HERE IS THE COMMON REQUEST PROCESSING FOR ALL DIRECTIVES IN THISCõ; MODULE. THE DEFAULT AND PROTECTION UICS ARE DETERMINED, AND THEUGö; NAME OF THE TASK CALCULATED IF NECESSARY. FOR ALL DIRECTIVES EXCEPTM>÷; THE RPOI$, THIS IS BASED ON THE TARGET TASK NAME AT OFFSET<ø; 2 IN THE DPB. THE RPOI$ DIRECTIVE ALLOWS A SPECIFIC NAMECù; FOR THE OFFSPRING TO BE SPECIFIED. THIS CAN ONLY BE DONE IF THE Bú; ORIGINAL TARGET HAD A NAME OF THE FORM ...XXX. IF THE NEW NAMEEû; IS NOT OF THE ...XXX FORM, IT IS USED AS IS. IF THE NEW SPECIFIEDE@ü; NAME IS OF THE ...XXX FORM, THE APPROPRIATE FORM OF THE NAME1ý; FOR THE TASK'S TI:UCB IS CALCULATED AND USED.HBþ; THE TASK IS THEN REQUESTED VIA $TSKRP, UNLESS IT IS A CLI WITHCÿ; A NAME NOT IN THE ...XXX FORM. THESE CLI TASKS ARE REQUESTED BYD;; $EXRQN WHICH IS CALLED BY THE COMMAND QUEUEING ROUTINE.F;N; REGISTERS AT THIS POINTN; ); R3=POINTER TO CMD TEXT ADDRESS IN DPBE; R5=TI:UCB ADDRESS ;E'RQST: MOV -10(R3),R4 ;GET REQUEST UICU. RQST1: MOV $TEMP0,R0 ;GET TARGET TCB ADDRESS9 RQST2: TST $TEMP3 ;IS THIS AN RPOI$ OR SDRP$ DIRECTIVE   BEQ 30$ ;IF EQ NOL&  CMPB $DICSV,#141. ;IS THIS AN SDRP$  BEQ 30$ ;IF EQ YES- ADD #10,R3 ;POINT TO SPECIFIED NAME FIELD." TST (R3) ;WAS A NAME SPECIFIED BEQ 30$ ;IF NE NOI; #; HANDLE SPECIFIED NAME FOR RPOI$E; .IF DF A$$CLI) BIT #T3.CLI,T.ST3(R0) ;IS TARGET A CLID+ BNE 10$ ;IF NE YES, CANNOT RENAME A CLI .ENDC ;A$$CLI1 CMP #^R...,T.NAM(R0) ;DOES TARGET HAVE MU NAMEB BEQ 15$ ;IF EQ YES+10$: JMP ILPARM ;ILLEGAL PARAMETER ERROR 15$: ;I'! CMP #^R...,(R3) ;IS NEW NAME MU TYPEN" BNE 20$ ;IF NE NO )# MOV R5,R0 ;SET ADDRESS OF DESIRED UCBN$ MOV 2(R3),R1 ;GET NEW NAME % CALL $SRMUT ;CALC NEW NAME%& BCC 25$ ;IF CC, IT ALREADY EXISTS ' BR 40$ ;CREATE IT.(20$: CALL $SRSTD ;DOES SPECIFIED TASK EXIST) BCS 40$ ;IF CS NO18*25$: CMP $TKTCB,R0 ;DID WE FIND TASK ISSUING DIRECTIVE#+ BNE 60$ ;IF NE NO, USE THIS TCBE<, CMP #1,$TEMP3 ;IS CURRENT TASK GOING TO EXIT IN DIRECTIVE- BNE 40$ ;IF NE YES!. JMP TSKACT ;TASK ACTIVE ERROR,/;;L0; CALCULATE TASK NAME FOR ALL CASES OTHER THAN RPOI$ WITH A SPECIFIED NAME1; :230$: CMP #^R...,T.NAM(R0) ;DOES TARGET HAVE MU TYPE NAME3 BEQ 35$ ;IF EQ, YES #4 CMP #140000,R0 ;TCB IN SEC POOL?R5 BHI 70$ ;IF HIGH, NO 6 JMP NOTINS ;OTHERWISE, ERROR/735$: MOV T.NAM+2(R0),R1 ;GET HALF OF NEW NAMEE"8 MOV R5,R0 ;GET DESIRED TI: UCB9 CALL $SRMUT ;CALC NEW NAME%: BCC 60$ ;IF CC, IT ALREADY EXISTS ;;I9<; THE DESIRED TCB DOES NOT EXIST, SO IT MUST BE CR00Q`h%hg´cÚµcÛ¶c�·c›’EATEDK=;V(>40$: MOV #T.LGTH,R1 ;GET LENGTH OF TCB? CALL $ALOCB ;ALLOCATE ONET@ BCC 45$ ;IF CC, OKA JMP ALER1 ;IF CS, NO POOLD/B45$: MOV $TEMP0,R1 ;GET PROTOTYPE TCB ADDRESS /C CMP #120000,R1 ;IS PROTOTYPE IN PRIMARY POOLID BHI 50$ ;IF HI YES&E MOV #$PTCPT+1,R1 ;POINT TO APR BIAS0F50$: MOV R4,$TEMP0 ;PRESERVE REQUEST UIC AGAIN5G CALL @(SP)+ ;INSTALL NEW TCB WITH TRAIL TO REMOVEE"H .WORD $TCBCP ;COPY AND INSTALL'I .WORD $REMOV ;REMOVE AND DEALLOCATEE&J MOV $TEMP0,R4 ;GET REQUEST UIC BACK-K60$: MOV R0,$TEMP0 ;USE NEW TCB FROM NOW ONALMN .IF DF A$$CLIO3P INC R5 ;REMEMBER THAT ORIGINAL HAD MU TYPE NAME:QR .IFTF ;A$$CLIST;C5U; PUT TCB ADDRESS IN COMMAND BUFFER, AND START TASKPV;9W70$: MOV $TEMP4,KISAR6 ;MAP COMMAND BUFFER IF IT EXISTSIX BEQ 72$ ;IF EQ, NO COMMAND5Y MOV R0,@#C.CTCB+140000 ;PUT TCB ADDRESS IN COMMANDWZ72$: ;REFERENCE LABEL[$\ .IF DF N$$DIR ;NAMED DIRECTORIES]^ MOV R5,R1 ;COPY UCB ADDRESS$!_ BIC #1,R1 ;INSURE UCB IS EVEN0%` CMPB $DICSV+1,#16. ;IS IT AN RPOI$Oa BEQ 80$ ;IF EQ YES*b BIT #T3.CLI,T.ST3(R0) ;OFFSPRING A CLI?c BEQ 80$ ;IF EQ, NO!d MOV $TEMP1,R2 ;GET OCB, IF ANY e BEQ 80$ ;IF EQ, NO OCB!f MOV $TKTCB,R3 ;GET CURRENT TCBV<g CMP R1,T.UCB(R3) ;SPAWNED TASK TI: SAME AS SPAWNING TASK?h BEQ 73$ ;IF EQ, YESV2i BIT #DV.PSE,U.CW1(R1) ;IS THIS A PSEUDO DEVICE?j BNE 73$ ;IF NE, YES0k MOV U.CTX(R1),R1 ;USE CONTEXT FROM TARGET UCB l BR 75$C5m73$: MOV T.CTX(R3),R1 ;USE CONTEXT FROM CURRENT TCB9n75$: MOV R1,O.STAT+10(R2) ;PUT CONTEXT POINTER INTO OCBS$o BEQ 80$ ;IF EQ, NO CONTEXT BLOCK)p MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGP(q MOV R1,KISAR6 ;MAP THE CONTEXT BLOCK/r INCB C.REF+140000 ;INCREMENT REFERENCE COUNTC$s MOV (SP)+,KISAR6 ;RESTORE MAPPINGtuv .IFF ;DF N$$DIRw%x CMPB $DICSV+1,#16. ;IS IT AN RPOI$;y BEQ 80$ ;IF EQ YES!z MOV $TEMP1,R2 ;GET OCB, IF ANYU{ BEQ 80$ ;IF EQ, NO OCB1| CLR O.STAT+10(R2) ;CLEAR CONTEXT BLOCK POINTERU}~ .ENDC ; DF N$$DIR"€80$: MOV R4,R1 ;SET REQUEST UIC!� MOV R4,-(SP) ;SAVE REQUEST UIC "‚ CALL UISET ;CALC PROT/DEF UICS$ƒ MOV (SP)+,R4 ;RESTORE REQUEST UIC)„ BIT #T3.CLI,T.ST3(R0) ;OFFSPRING A CLIC… BEQ 90$ ;IF EQ NON†‡ .IFT ;A$$CLIˆ‰ BIT #1,R5 ;MU NAME TYPE CLIŠ BNE 90$ ;IF NE YES‹Œ .IFTF ;A$$CLI�.Ž TST R4 ;WAS UIC SPECIFIED IN ORIGINAL DPB?� BEQ 85$ ;IF EQ NOI%� MOV $TEMP1,R2 ;GET OCB ADDR IF ANYC‘ BEQ 85$ ;IF EQ, NO OCB*’ MOV R1,O.STAT+4(R2) ;SET PROTECTION UIC'“ MOV R3,O.STAT+6(R2) ;SET DEFAULT UIC&”85$: MOV $TEMP4,R1 ;POINT TO COMMAND3• BEQ 90$ ;IF EQ, NO COMMAND FROM RQST$ DIRECTIVEO–.— CALL $QCPKT ;QUEUE COMMAND AND REQUEST CLI%˜ BCC SUCCES ;IF CC, CLI STARTED OK./™ BEQ SUCCES ;IF CC, CLI ALLOWED TO BE ACTIVE%š BR ALER1 ;POOL ALLOCATION FAILURE;›;Iœ;�90$:ž .IFT ;A$$CLIFŸ&  BIC #1,R5 ;INSURE EVEN UCB ADDRESS¡¢ .ENDC ;A$$CLI£¤*¥ MOV $TKTCB,R2 ;GET ISSUER'S TCB ADDRESS¦*§ .IF DF N$$DIR ;NAMED DIRECTORY SUPPORT¨<© CMP R5,T.UCB(R2) ;SPAWNED TASK TI: SAME AS SPAWNING TASK?ª BEQ 93$ ;IF EQ, YESQ2« BIT #DV.PSE,U.CW1(R5) ;IS THIS A PSEUDO DEVICE?¬ BNE 93$ ;IF NE, YESQ4­ MOV U.CTX(R5),$CTXPT ;USE CONTEXT FROM TARGET UCB ® BR 95$;9¯93$: MOV T.CTX(R2),$CTXPT ;PROPAGATE ISSUING TASK'S DDST°± .ENDC ;DF N$$DIR²7³95$: CMP $TEMP3,#1 ;WILL THE CURRENT TASK BE EXITING?A´ BLOS 97$ ;IF LOS NOC7µ BIS #T2.HLT,T.ST2(R2) ;PREVENT A POSSIBLE CHECKPOINT&¶97$: MOV #100$,-(SP) ;ASSUME SUCCESS"· MOV R5,R2 ;GET TARGET UCB ADDR¸ MOV R0,R5 ;SAVE TCB ADDRESS?!¹ CALL $TSKRP ;REQUEST THE TASK#º BCC 99$ ;IF CC, OK(» BEQ 98$ ;IF EQ, ALLOCATION SUCCEEDED&¼ MOV #ALER1,(SP) ;ELSE PROCESS ERROR½ BR 99$ ;AFTER CLEANUP;,¾98$: BIT #T3.CLI,T.ST3(R5) ;IS TASK A CLI?(¿ BNE 99$ ;IF NE YES, IT CAN BE ACTIVE%À CMPB $DICSV,#141. ;SDRC$ OR SDRP$?E"Á BEQ 99$ ;IF EQ, TASK ACTIVE OK+ MOV #TSKACT,(SP) ;ELSE TASK ACTIVE ERROR .Ã99$: MOV $TKTCB,R1 ;GET IS00Qhh*hzgM{güfàýfáþfDATASUER'S TCB ADDRESS1Ä BIC #T2.HLT,T.ST2(R1) ;RESET EXITING CONDITION Å RETURN5*Æ100$: CMP 6(SP),#$REMOV ;WAS TCB CREATEDÇ BNE 110$ ;IF NE NO0È BIS #T3.REM,T.ST3(R5) ;SET REMOVE ON EXIT BIT.É110$: MOV $TEMP4,R1 ;POINT TO COMMAND BUFFER!Ê BEQ SUCCES ;IF EQ, NO COMMANDT&Ë CALL $QCLNR ;QUEUE COMMAND TO TASK#Ì BR SUCCES ;FINISH UP PROCESSINGÍÎ Ï .ENABL LSBD5ÐALLER: ADD #6,SP ;POP THREAD TO DEALLOCATE ROUTINEM8ÑALER1: MOV (PC)+,R5 ;PICK UP ALLOCATION FAILURE STATUSÒ DRSTS D.RS1 ;T Ó BR 10$8ÔTSKACT: MOV (PC)+,R5 ;PICK UP TASK ACTIVE ERROR STATUSÕ DRSTS D.RS7 ;(&Ö10$: JMP ERROR ;RETURN ERROR STATUS × .DSABL LSBØÙÚ;TFÛ; THE TARGET TASK HAS BEEN SUCCESSFULLY STARTED. FROM THIS POINT ON,BÜ; NOTHING CAN GO WRONG. IRREVERSIBLE ACTIONS SUCH AS PROPOGATINGAÝ; PROMPT REQUEST BITS AND CHANGING OCB LINKAGES CAN NOW BE DONE.HÞ; SINCE THEY CANNOT GENERATE AN ERROR, AND THE DIRECTIVE MUST SUCCEED.ß;V/àSUCCES: MOV $TEMP0,R4 ;GET TARGET TCB ADDRESSD(á ADD #T.OCBH,R4 ;POINT TO ITS OCB LIST%â MOV $TEMP1,R1 ;POINT TO ANY OCB(S)T+ã MOV $TEMP3,R5 ;RPOI$ OR SDRP$ DIRECTIVE?Tä BEQ 30$ ;IF EQ NOS&å MOV $TKTCB,R0 ;GET CURRENT TASK TCB(æ ADD #T.OCBH,R0 ;POINT TO ITS OCB LISTç CMP #1,R1 ;PASS ALL OCBSè BEQ 10$ ;IF EQ YES8é MOV T.ST3-T.OCBH(R0),-(SP) ;GET T.ST3 OF CURRENT TASK>ê BIS T.ST3-T.OCBH(R4),(SP) ;PUT T.ST3 OF TARGET ON TOP OF IT*ë BIT #T3.CLI,(SP)+ ;IS EITHER TASK A CLIì BEQ 20$ ;IF EQ NO -í10$: CALL PSPRMT ;PASS PROMPT CONTROL INFOC1î20$: CMP #1,R1 ;DETERMINE HOW TO HANDLE OCB(S)Nï BHI 70$ ;IF HI, NO OCB#ð BEQ 50$ ;IF EQ, PASS ALL OCB(S)Eð CALL $QRMVA ;REMOVE OCB FROM CURRENT TASK (MUST BE THERE) ;JWB167.ò BR 40$ ; ;**-1 ó30$: TST R1 ;ANY OCB ô BEQ 80$ ;IF EQ NOI1õ MOV O.PTCB(R1),R2 ;GET PARENT TASK TCB ADDRESSO*ö INC T.RDCT(R2) ;INCREMENT RUNDOWN COUNT,÷40$: MOV R4,R0 ;POINT TO TARGET OCB QUEUE$ø CALL $QINSF ;INSERT OCB IN QUEUEù BR 70$ ;ALL DONE>ú50$: MOV (R0),R1 ;GET ADDRESS OF FIRST OCB OFF CURRENT TASK!û BEQ 70$ ;IF EQ, NO OCBS EXIST"ü CLR (R0) ;FORICIBLY EMPTY LIST,ý MOV R0,2(R0) ;SET SECOND HALF OF LISTHEAD:þ MOV R1,@2(R4) ;LINK AFTER PREVIOUS LAST OCB FROM TARGET2ÿ60$: MOV R1,2(R4) ;SET POINTER TO NEW LAST ENTRY+ MOV (R1),R1 ;POINT TO NEXT OCB IN QUEUEA6 BNE 60$ ;IF NE, THERE IS ANOTHER SO UPDATE POINTER770$: MOV $TEMP4,KISAR6 ;MAP COMMAND LINE IF IT EXISTS" BEQ 75$ ;IF EQ NO COMMAND LINE; BICB #200,@#C.CTR+140000 ;ELIM USER TERMINATOR INDICATORI.75$: CMP #1,R5 ;FORCE CURRENT TASK TO EXIT? BHIS 80$ ;IF HIS NO 7 MOV R5,SP ;POINT STACK BACK TO RETURN ADDR TO DRDSPO. MOV $TKTCB,R5 ;GET CURRENT TASK TCB ADDRESS,  CALLR $DREXT ;FORCE CURRENT TASK TO EXIT 80$: DRSTS +1 ;THE ENDY   ;+; **-$DREXS-EXIT WITH STATUS;BD; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO PASS A STATUS WORD TO ALL; PARENT TASKS AND EXIT.;I; DPB FORMAT: ;Q#; WD. 00 -- DIC(29.),DPB SIZE(2.)R; WD. 01 -- STATUS WORD.;I ; INPUTS::;#=; R2=ADDRESS OF THE SECOND STATUS WORD OF THE CURRENT TASK.-; R3=ADDRESS OF THE STATUS WORD IN THE DPB. 1; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.E.; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;07; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)W ;TB!; NO STATUS IS RETURNED TO THE ISSUING TASK SINCE THIS DIRECTIVE"; TERMINATES ITS EXECUTION.A#;-$0%$DREXS::BIT #T3.ACP,T.ST3(R5) ;IS THIS AN ACP?& BNE 5$ ;IF NE YESD0' MOV (R3),T.EFLG+2(R5) ;SET EXIT STATUS IN TCB'(5$: CALLR $DREX2 ;INITIATE TASK EXIT )*;++; **-$DREMS-EMIT STATUS ,;TD-; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EMIT A STATUS WORD TO ALL0.; OR A SPECIFIED PARENT TASK WITHOUT EXITTING./;0; DPB FORMAT:(1;T%2; WD. 00 -- DIC(147.),DPB SIZE(4.).:3; WD. 01 -- FIRST WORD OF PARENT TASK NAME OR 0 FOR ALL..4; WD. 02 -- SECOND WORD OF PARENT TASK NAME.5; WD. 03 -- STATUS WORD.6;( 7; INPUTS:A8;?B9; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF T00Qph%hg´cÚµcÛ¶c�·c›’HE CURRENT TASK.2:; R3=ADDRESS OF THE PARENT TASK NAME IN THE DPB.1;; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.D.<; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.=;O7>; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)?;/@; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. (A; DIRECTIVE STATUS OF +1 IS RETURNED.!B; C=1 IF DIRECTIVE IS REJECTED.D=C; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THE SPECIFIEDW/D; TASK IS NOT A PARENT OF THE ISSUING TASK. E;-F5G$DREMS::MOV 4(R3),-(SP) ;SAVE SPECIFIED STATUS WORDO1H CMP (R3),#^R... ;IS SPECIFIED TASK MULTI-USER?OI BNE 10$ ;IF NE NOR3J MOV T.UCB(R5),R0 ;PICK UP UCB ADDRESS FOR $SRMUTT6K MOV 2(R3),R1 ;PICK UP SECOND WORD OF SPECIFIED NAME5L CALL $SRMUT ;CALCULATE TASK NAME (IGNORING C-BIT)Y)M10$: MOV R3,R4 ;COPY TASK NAME POINTERS0N20$: MOV R5,R0 ;COPY ISSUING TASK TCB POINTER%O ADD #T.OCBH,R0 ;POINT TO OCB QUEUEN$P MOV R0,R1 ;COPY LISTHEAD POINTER+Q30$: MOV (R1),R1 ;POINT TO NEXT IN QUEUE R BEQ 60$ ;IF EQ THERE IS NONE"S TST (R4) ;TASK NAME SPECIFIED?.T BEQ 40$ ;IF EQ YES (PASSING STATUS TO ALL)9U CMP (R4),O.STAT(R1) ;MATCH ON FIRST WORD OF TASK NAME?RV BNE 30$ ;IF NE NOP=W CMP 2(R4),O.STAT+2(R1) ;MATCH ON SECOND WORD OF TASK NAME?EX BNE 30$ ;IF NE NOB0X40$: CALL $QRMVA ;REMOVE THE ENTRY ;JWB1676Z MOV (SP),R0 ;PICK UP SPECIFIED STATUS WORD ;**-18[ MOV #S.CACT,R2 ;SET ABORT CODE OF "TASK STILL ACTIVE"-\ CALL $QUEXT ;QUEUE THE OCB TO PARENT TASKT,] TST (R4) ;PASSING STATUS TO ALL PARENTS?^ BEQ 20$ ;IF EQ YES_50$: TST (SP)+ ;CLEAN STACK ` RETURN ;T,a60$: TST (R4) ;WAS A TASK NAME SPECIFIED?b BEQ 50$ ;IF EQ NOR5c DRSTS D.RS8 ;INCONSISTENT WITH CURRENT TASK STATETde;Of; LOCAL ROUTINES.Eg;Bhi;ICj; ROUTINE TO INITIALIZE ERROR RECOVERY FOR CONNECT, REQUEST, SENDP#k; REQUEST AND CONNECT, AND SPAWN. l;1m/nERRSV: MOV R0,$TEMP0 ;SAVE TARGET TCB ADDRESST&o CLR $TEMP1 ;INITIALIZE OCB POINTER/p CLR $TEMP4 ;INITIALIZE POINTER TO CMD BLOCK 3q JMP $DRTHR ;INITIALIZE ERROR RECOVERY THREADINGCrst;?u; THIS ROUTINE CALCULATES THE DEFAULT AND PROTECTION UICS FORQv; THE CURRENT TASKw;D x; INPUTS:Iy; R1=REQUEST UICz;T {; OUTPUTS:|; R1=PROTECTION UIC}; R3=DEFAULT UIC'~; R4=ADDRESS OF CURRENT TASK'S HEADERC;T€; R0 IS PRESERVED �;S4‚UISET: MOV $TKTCB,R2 ;GET CURRENT TASK TCB ADDRESS+ƒ ADD #T.ST2,R2 ;POINT TO TASK STATUS WORDP„… .IF DF X$$HDR†)‡ MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING 2ˆ MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER,‰ MOV $SAHPT,R4 ;GET ADDRESS OF TASK HEADERŠ‹ .IFFAŒ.� MOV $HEADR,R4 ;POINT TO CURRENT TASK HEADER)Ž CALLR $UISET ;CALCULATE DEF/PROT UICST�� .IFT:‘(’ CALL $UISET ;CALCULATE DEF/PROT UICS-“ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING ” RETURN ;R•– .ENDC—˜™;KGš; THIS ROUTINE PASSES THE PROMPTING CONTROL BIT (T3.MCR) AND THE CLI;TE›; COMMAND EXECUTION INDICATOR BIT (T3.CMD) FROM THE CURRENT TASK TOADœ; THE TARGET. IT IS CALLED ONLY IF THE CURRENT TASK HAS PASSED ALLH�; ITS OCBS TO THE TARGET, OR IF EITHER THE CURRENT OR TARGET IS A CLI.Až; THE TERMINATOR CHARACTER IN THE COMMAND BUFFER (IF IT EXISTS)CEŸ; IS SET TO A CARRIAGE RETURN IF THE T3.MCR BIT IS TURNED ON IN THE( ; TARGET TCB¡;P ¢; INPUTS:N£;C¤; R0=ADDRESS OF OCB QUEUE LISTHEAD (T.OCBH) IN CURRENT TASK'S TCB B¥; R4=ADDRESS OF OCB QUEUE LISTHEAD (T.OCBH) IN TARGET TASK'S TCB¦;A §; OUTPUTS:¨;O9©; THE STATUS BITS ARE PROPOGATED TO THE TARGET TASK TCBFª;C«; ALL REGISTERS PRESERVED¬; ­A®PSPRMT: MOV T.ST3-T.OCBH(R0),-(SP) ;GET T.ST3 FROM CURRENT TASKH>¯ BIC #^C,(SP) ;CLEAR ALL BUT BITS OF INTEREST:° BIC (SP),T.ST3-T.OCBH(R0) ;CLEAR BITS IN CURRENT TASK±²³ .IF DF A$$CLI´5µ BIT #T3.CLI,T.ST3-T.OCBH(R4) ;IS TARGET TASK A CLIE¶ BNE 5$ ;IF NE YEST·¸ .ENDC ;A$$CLI¹º<» BIC #T3.MCR!T3.CMD,T.ST3-T.OCBH(R4) ;CLEAR BITS IN TARGET@¼ BIS (SP),T.ST3-T.OCBH(R4) ;SET 00QxhRhzgM{güfàýfáþfDATATARGET'S BITS LIKE CURRENT WAS:½5$: BIT #T3.MCR,(SP)+ ;WILL CURRENT ISSUE PROMPT ON EXIT¾ BEQ NULL ;IF EQ NO)¿ MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGC5À MOV $TEMP4,KISAR6 ;MAP COMMAND BUFFER IF IT EXISTSTÁ BEQ 10$ ;IF EQ, NO COMMAND4 BITB #200,@#C.CTR+140000 ;WAS TERM USER SUPPLIED?'à BNE 10$ ;IF NE YES, DON'T CHANGE IT 3Ä MOVB #15,@#C.CTR+140000 ;SET TERMINATOR TO BE CRN(Å10$: MOV (SP)+,KISAR6 ;RESTORE MAPPINGÆNULL: RETURNÇÈ;IGÉ; THIS ROUTINE LOCATES THE OCB(S) TO BE PASSED BY THE RPOI$ AND SDRP$TÊ; DIRECTIVES.TË;, Ì; INPUTS:UÍ; Î; R2=FLAGS BYTET3Ï; R3=ADDRESS OF THE PARENT'S TASK NAME IN THE DPBUÐ; Ñ;N Ò; OUTPUTS:Ó;I?Ô; $TEMP1 IS SET WITH THE ADDRESS OF THE OCB TO PASS, CLEAR IFM4Õ; NO OCB IS TO BE PASSED, OR ONE TO PASS ALL OCBSÖ;×AØLOCOCB: MOV (SP)+,R4 ;RETURN ADDR TO ALLOW ERROR THREAD TO WORKEÙ ASR R2 ;PASS ALL OCBS0Ú BCS 5$ ;IF CS YESS#Û ASR R2 ;PASS NEXT OCB IN QUEUE?IÜ BCS 80$ ;IF CS YES-Ý BR 10$ ;CHECK IF SPECIFIC PARENT IS NAMEDP Þ5$: ;&ß MOV $TEMP0,R2 ;POINT TO OBJECT TASK'à BIT #T3.CLI,T.ST3(R2) ;IS TASK A CLIE á BNE 100$ ;IF NE YES, ILLEGAL+â MOV (R3),-(SP) ;WAS PARENT NAME SUPPLIEDI%ã BIS 4(R3),(SP)+ ;OR AN OCB ADDRESSRä BNE 120$ ;IF NE YESE!å INC $TEMP1 ;INDICATE PASS ALLæ BR 70$ ;ALL DONE1ç10$: MOV $TKTCB,R2 ;POINT TO CURRENT TASK'S TCBE#è ADD #T.OCBH,R2 ;ITS OCB LISTHEAD5éêë .IF DF A$$CLIì6í BIT #T3.CLI,T.ST3-T.OCBH(R2) ;IS ISSUING TASK A CLIî BEQ 30$ ;IF EQ NOA-ï TST (R3) ;WAS A SPECIFIC PARENT REQUESTEDOð BNE 40$ ;IF NE YES+ñ TST 4(R3) ;WAS AN OCB ADDRESS SPECIFIED1ò BEQ 70$ ;IF EQ NOL*ó20$: MOV (R2),R2 ;POINT TO THE NEXT OCB&ô BEQ 110$ ;IF EQ, THERE ARE NO MORE*õ CMP 4(R3),R2 ;IS THIS THE SPECIFIED OCBö BNE 20$ ;IF NE NO ÷ BR 60$ ;øù .ENDC ;A$$CLIúû/ü30$: TST 4(R3) ;WAS AN OCB ADDRESS SPECIFIEDSý BNE 100$ ;IF NE YES-þ TST (R3) ;WAS A SPECIFIC PARENT REQUESTED(ÿ BEQ 70$ ;IF EQ NOC.40$: MOV (R2),R2 ;POINT TO NEXT OCB IN LIST& BEQ 110$ ;IF EQ, THERE ARE NO MORE> CMP O.STAT(R2),(R3) ;IS THIS THE OCB FOR THE CORRECT PARENT BNE 40$ ;IF NE NO:" CMP O.STAT+2(R2),2(R3) ;MAYBE?? BNE 40$ ;IF NE NOT* TST 4(R3) ;HAS OCB ADDR BEEN SPECIFIED BEQ 60$ ;IF EQ NOE+ CMP 4(R3),R2 ;DID THEY FIND THE SAME OCB;  BNE 120$ ;IF NE NO. 60$: MOV R2,$TEMP1 ;SAVE ADDR OF OCB TO PASS 70$: JMP (R4) ;RETURN 3 80$: MOV (R3),-(SP) ;GET PARENT NAME IF SPECIFIED - BIS 4(R3),(SP)+ ;WAS OCB ADDRESS SPECIFIEDI/ BNE 120$ ;IF NE YES, CANNOT SPECIFIY EITHER- MOV $TKTCB,R2 ;TCB ADDRESS OF CURRENT TASKO9 MOV T.OCBH(R2),$TEMP1 ;GET ADDRESS OF NEXT OCB, IF ANY( JMP (R4) ;RETURN;I; ERROR HANDLING;H8100$: JMP ILPARM ;THIS TASK CANNOT USE THIS PARAMETER=110$: MOV (PC)+,R5 ;PICK UP SPECIFIED OCB DOESN'T EXIST STA DRSTS D.RS86 ;  BR 150$ ;RETURN ERROR STATUS=120$: MOV (PC)+,R5 ;PICK UP NAME AND OCB ADDR DON'T MATCH SI DRSTS D.RS84 ;150$: JMP ERROR ;ISSUE ERRORC .END0$ ;IF NE YES, CANNOT SPECIFIY EITHER- MOV $TKTCB,R2 ;TCB ADDRESS OF CURRENT TASKO9 MOV T.OCBH(R2),$TEMP1 ;GET ADDRESS OF NEXT OCB, IF ANY( JMP (R4) ;RETURN;I; ERROR HANDLING;H8100$: JMP ILPARM ;THIS TASK CANNOT USE THIS PARAMETER=110$: MOV (PC)+,R5 ;PICK UP SPECIFIED OCB DOESN'T EXIST STA DRSTS D.RS86 ;  BR 150$ ;RETURN ERROR STATUS=120$: MOV (PC)+,R5 ;PICK UP NAME AND OCB ADDR DON'T MATCH SI DRSTS D.RS84 ;150$: JMP  .TITLE REQSBO .IDENT /14.03/0;FK; COPYRIGHT (c) 1982, 1983, 1984, 1985 BY DIGITAL EQUIPMENT CORPORATION.S; ALL RIGHTS RESERVED.;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;R ; D. N. CUTLER 10-AUG-73 ;K# ; MODIFIED FOR RSX-11M-PLUS V2.1: ;S; H. HUANGB; J. R. KAUFFMAN; B. KRISHNAMURTHY); J. M. LAWLER; T. LEKAS'; T. M. MARTIN; B. S. MCCARTHY 00R€h%hg´cÚµcÛ¶c�·c›’;-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY: ;I; J. M. LAWLER; J. R. KAUFFMAN; J. W. BERZLE; B. S. MCCARTHY; L. B. MCCULLEY;; MODIFIED BY:;I ; J. W. BERZLE 17-OCT-85 14.00;*; JWB167 - USE $QRMVA INSTEAD OF $QRMVT;S ; J. W. BERZLE 04-APR-86 14.01;-6; JWB169 - CORRECT CONDITIONALIZATION AROUND $CTXPT; ; K. L. NOEL 04-DEC-86 14.02; 9; KLN029 - CLEAR TASK INDEX TO SHOW THAT TASK HAS NOT ; STARTED YET;.; K. L. NOEL 13-MAY-87 14.03;X<; KLN047 - CLEAR LUN TABLE FOR LUNS THAT POINT TO GENERIC ; DCBs ; =;E$>; TASK REQUEST RELATED SUBROUTINES?;@; MACRO LIBRARY CALLSIA; B,C .MCALL HDRDF$,ITBDF$,PCBDF$,TCBDF$,BGCK$ADEFG .IF DF N$$DIRHI .MCALL LNMDF$J)K LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETSOLM .ENDC ;DF N$$DIRCN'O HDRDF$ ;DEFINE TASK HEADER OFFSETS4P ITBDF$ ;DEFINE INTERRUPT TRANSFER BLOCK OFFSETS3Q PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS-;R TCBDF$ ,,SYSDEF ;DEFINE TASK CONTOL BLOCK OFFSETS & LGTHASTU .IF DF A$$CNTVW .MCALL ACNDF$X ACNDF$ ;ACCOUNTING OFFSETSSYZ .ENDC[\ MAP6=140000]^;+ _; **-$ABCTK-ABORT CURRENT TASK`; **-$ABTSK-ABORT TASKa;DMb; THIS ROUTINE IS CALLED TO MARK A TASK FOR ABORT AND TO FORCE A TASK EXIT.Ic; THE REASON FOR ABORT AND THE CURRENT OUTSTANDING I/O COUNT ARE STOREDI&d; IN THE FIRST TASK EVENT FLAG WORD.e;E f; INPUTS: g;Fh; R0=REASON FOR ABORT.Gi; R2=EXTENDED ABORTER INFORMATION (VALID ONLY IF R0=S.CABO OR S.CPMD)j; k; OUTPUTS:l;Fm; THE TASK IS MARKED FOR ABORT AND A CONDITIONAL SCHEDULE REQUEST ISn; SET.o;-p8q$ABCTK::MOV $TKTCB,R1 ;SET TCB ADDRESS TO CURRENT TASK?r$ABTSK::BIC #TS.STP,T.STAT(R1) ;REMOVE POSSIBLE MCR BLOCK BITR,s CMP R0,#S.CABO ;ABORT BY DIRECTIVE OR MCRtu BEQ 4$ ;IF EQ YEST$v CMP R0,#S.CTKN ;QUIET TASK ABORT?.w BEQ 4$ ;IF EQ YES, ISSUE ABORT ASTS IF ANY"x CMP R0,#S.CPMD ;ABORT WITH PMD?y BNE 7$ ;IF NE NOz4$: SAVNR ;SAVE R4 AND R5R2{ MOV #AS.REA,R4 ;GET CODE FOR REQUESTED EXIT AST!| MOV R1,-(SP) ;SAVE TCB ADDRESSC } MOV R0,-(SP) ;SAVE ABORT CODE)~ MOV R2,-(SP) ;SAVE ABORTER INFORMATIONS MOV R1,R5 ;COPY TCB ADDRESS€ CALL $DASTT ;DECLARE AST,� MOV (SP)+,R2 ;RESTORE ABORTER INFORMATION#‚ MOV (SP)+,R0 ;RESTORE ABORT CODEƒ BCC 5$ ;IF CC AST SET UP$„ MOV (SP)+,R1 ;RESTORE TCB ADDRESS-… BIT #T3.PRV,T.ST3(R1) ;IS TASK PRIVILEGED?P† BEQ 7$ ;IF EQ NO9‡ BIT #T2.REX,T.ST2(R1) ;HAS ABORT AST ALREADY OCCURRED?Rˆ BEQ 7$ ;IF EQ NO‰ MOV R1,R0 ;COPY TCB ADDRESSŠ BR 10$ ;RESCHEDULE TASKS‹Œ5$: TST (SP)+ ;CLEAN STACKE8� MOV #4,A.PRM(R1) ;STORE NUMBER OF AST PARAMETER BYTES0Ž MOV R2,A.PRM+2(R1) ;STORE ABORTER INFORMATION1� RETURN ;$NXTSK ALREADY CALLED, SIMPLY RETURNM�*‘7$: BIT #T3.ACP,T.ST3(R1) ;ACP ABORTING?’ BEQ 8$ ;IF EQ NO+“ BIT #T3.PMD,T.ST3(R1) ;IS PMD REQUESTED?V2” BNE 8$ ;IF NE NO (NOTE: T3.PMD=1 MEANS NO PMD)9• BGCK$A BF.XIT,BE.ACP,FATAL ;CRASH SYSTEM ON ACP ABORTSD0–8$: MOV R0,T.EFLG(R1) ;INSERT REASON FOR ABORT:— MOVB T.IOC(R1),T.EFLG+1(R1) ;SAVE OUTSTANDING I/O COUNT˜™š .IF DF M$$PRO›6œ CLR T.RRM(R1) ;TASK CAN BE ABORTED ON ANY PROCESSOR�ž .ENDCŸ ¡¢£ .IF DF P$$OFF¤)¥ BIT #T3.ACP,T.ST3(R1) ;IS THIS AN ACP?¦ BNE 9$ ;IF NE YES19§ MOV #EX$SEV,T.EFLG+2(R1) ;SET SEVERE ERROR EXIT STATUS3¨9$: ;REFERENCE SYMBOL©ª .ENDC«¬­ MOV R1,R0 ;COPY TCB ADDRESSC2® ADD #T.STAT,R1 ;POINT TO FIRST TASK STATUS WORD'¯ BIC #TS.CKR,(R1)+ ;CLEAR STATUS BITSF5° BIC #T2.SEF!T2.STP!T2.SPN,(R1) ;MAKE TASK RUNNABLEI?± BIS #T2.AST!T2.DST!T2.HLT!T2.ABO,(R1) ;DSBL AST'S & FRC EXITK²³´ .IF DF M$$PROµ:¶ BIT #^C,-(R1) ;OUT FOR INITIAL LOAD OR BLOCKED?·¸ .IFFS¹6º TST -(R1) ;OUT FOR INITIAL LOAD OR OTHERWISE BLKD?»¼ .ENDC½¾¿ BNE 10$ ;IF NE YES3À CALL $SETCR ;SET A CONDITIONAL SCHEDULE REQUEST*Á10$: MOV T.PCB(R0),R0 ;POINT TO 00RˆhhzgM{güfàýfáþfDATATASK PCB8 CALLR $NXTSK ;REALLOCATE TASK PARTITION IF NECESSARYÃÄ;+/Å; **-$BILDS-BUILD STACK AND INITIALIZE HEADER Æ; IÇ; THIS ROUTINE SETS UP THE TASK STACK AND INITIALIZES THE HEADER. IT ISEIÈ; CALLED PRIOR TO PLACING A TASK INTO CONTENTION FOR THE PROCESSOR WHENAFÉ; AN EXECUTION REQUEST IS MADE FOR A TASK THAT IS FIXED IN MEMORY OR3Ê; WHEN A DISK RESIDENT TASK HAS FINISHED LOADING.$Ë; Ì; INPUTS:LÍ;T4Î; R0=ADDRESS OF THE TCB OF THE TASK TO INITIALIZE.Ï;R Ð; OUTPUTS:Ñ;K0Ò; 1-TASK LOCAL EVENT FLAGS 1.-32. ARE CLEARED.)Ó; 2-CURRENT UIC IS SETUP IN THE HEADER. LÔ; 3-TASK CONTEXT IS SETUP TO CAUSE THE TASK TO START EXECUTION AT ITS ENTR@Õ; 4-REDISPATCHING OF THE PROCESSOR IS CONDITIONALLY REQUESTED.Ö;T ×; R3 IS PRESERVED ACROSS CALL.Ø;-Ù3Ú$BILDS::MOV T.PCB(R0),R1 ;GET ADDRESS OF TASK PCBNÛÜ .IF DF X$$HDRÝ7Þ MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING FOR XTRNL HDRL+ß MOV P.HDR(R1),-(SP) ;SAVE HEADER POINTER !à BNE 5$ ;IF NE INTERNAL HEADER/á MOV P.REL(R1),KISAR6 ;MAP TO EXTERNAL HEADERA4â MOV #140000,(SP) ;RESET VIRTUAL ADDRESS OF HEADER1ã5$: MOV (SP)+,R1 ;GET VIRTUAL ADDRESS OF HEADEREäå .IFF ; DF X$$HDR æ/ç MOV P.HDR(R1),R1 ;GET ADDRESS OF TASK HEADERUèé .ENDC ; DF X$$HDRê/ë MOV T.EFLG(R0),H.CUIC(R1) ;SET SPECIFIED UIC0$ì BNE 10$ ;IF NE UIC WAS SPECIFIED-í MOV H.DUIC(R1),H.CUIC(R1) ;SET DEFAULT UICUîïð .IF DF M$$MUPñ ò BR 15$ ;óô .IFTFõö10$: ;REF LABEL÷ø .IFTEù-ú MOV T.ACTL(R0),H.DUIC(R1) ;SET DEFAULT UICNûü .ENDCýþ ÿ15$: ;S .IF DF A$$CNT! MOV KISAR5,-(SP) ;SAVE MAPPING 3 MOV T.ACN(R0),KISAR5 ;MAP FIRST ACCOUNTING BLOCKM) BEQ 16$ ;IF EQ, NO ACCOUNTING ON TASKU- CMPB #BT.TAB,@#B.TYP+120000 ;IS THIS A TAB0 BNE 16$ ;IF NE NOF6 MOV H.CUIC(R1),@#B.PUIC+120000 ;COPY PROTECTION UIC3  MOV H.DUIC(R1),@#B.CUIC+120000 ;COPY CURRENT UICF-  MOV T.ST3(R0),@#B.TST3+120000 ;COPY T.ST3( 16$: MOV (SP)+,KISAR5 ;RESTORE MAPPING   .ENDC ;A$$CNT/ BIT #T2.ABO,T.ST2(R0) ;TASK MARKED FOR ABORTS BNE 20$ ;IF NE YES .IF DF M$$PRO0 MOV T.PCB(R0),R2 ;GET TASK REGION PCB ADDRESS> MOV T.RRM(R0),P.RRM(R2) ;SAVE THE TASK'S INSTALLED AFFINITY3 CALL $SETAT ;SET UP THE TASK'S RUNNING AFFINITY  .ENDC/ CLR T.EFLG(R0) ;CLEAR TASK LOCAL EVENT FLAGSM# BIT #T3.ACP,T.ST3(R0) ;TASK ACP?U BNE 17$ ;IF NE YES  CLR T.EFLG+2(R0) ;C!17$: ;REFERENCE SYMBOLK"#$ .IF DF M$$PRO%3& CALL $TSTAT ;ARE THE REQUIRED BUS RUNS PRESENT?K' BCC 20$ ;IF CC YES( MOV R0,-(SP) ;SAVE REGISTERSF) MOV R1,-(SP) ;M* MOV R3,-(SP) ;T+ MOV R0,R1 ;COPY TCB ADDRESST&, MOV #S.CAFF,R0 ;GET TKTN ABORT CODE- CALL $ABTSK ;ABORT THE TASKS". MOV (SP)+,R3 ;RESTORE REGISTERS/ MOV (SP)+,R1 ;0 MOV (SP)+,R0 ; 12 .ENDC344520$: MOV H.ISP(R1),(R1) ;SET INITIAL STACK POINTER06 MOV H.GARD(R1),R2 ;POINT TO CONTEXT SAVE AREA!7 SUB #16,R2 ;POINT TO SAVED PCF*8 MOV H.IPC(R1),(R2) ;SET INITIAL PC WORD+9 MOV H.IPS(R1),-(R2) ;SET INITIAL PS WORDY:+: .IF DF C$$RTK ;REMOTE TASK ;KLN029(: ;KLN029P<: BIT #F5.RTK,$FMSK5 ;ARE REMOTE TASKS BEING USED ;KLN029!: BEQ 30$ ;IF EQ NO ;KLN029A: ;KLN029VB: TSTB T.LBN(R0) ;HAS THIS TASK HAD CONTACT WITH CPRAME? ;KLN029>: BEQ 30$ ;IF EQ, NO - DON'T NEED TO CLEAR LUN TABLE ;KLN029: ;KLN029HH: CLRB T.LBN(R0) ;INDICATE THAT NO TASK START REQUEST HAS BEEN ;KLN029(: ; MADE FOR THIS TASK YET ;KLN029: ;KLN029).: .IF DF C$$RTB ;RUN TIME BINDING ;KLN047: ;KLN047 <: BIT #F5.RTB,$FMSK5 ;RUN TIME BINDING TURNED ON? ;KLN047!: BEQ 30$ ;IF EQ NO ;KLN047B: ;KLN047 /: MOV T.PCB(R0),R3 ;GET PCB ADDRESS ;KLN047 5: BIT #PS.FXD,P.STAT(R3) ;IS TASK FIXED? ;KLN047Q;: BEQ 30$ ;IF EQ NO, NO NEED TO CLEAR LUN TABLE ;KLN047 : ;KLN047C$: MOV R0,-(SP) ;SAVE R0 ;KLN047$: MOV R5,-(SP) ; AND R5 ;KLN047$:00R�h%hg´cÚµcÛ¶c�·c›’ MOV R3,-(SP) ; AND R3 ;KLN047: ;KLN047=: MOV R0,R5 ;PUT TCB ADDRESS WHERE $MPLND WANTS IT ;KLN04740: ADD #H.NLUN,R1 ;POINT TO LUN TABLE ;KLN047.: MOV (R1)+,R3 ;GET NUMBER OF LUNS ;KLN047: ;KLN04742:25$: MOV (R1),R0 ;GET LUN ASSIGNMENT ;KLN047+: BEQ 27$ ;IF EQ, NOT ASSIGNED ;KLN047 : ;KLN0470,: CALL $MPLND ;FOLLOW REDIRECTS ;KLN047: ;KLN047N;: CMP (R0),$XXLOW ;MIGHT IT BE A GENERIC DEVICE? ;KLN047 ": BLO 27$ ;IF LO, NO ;KLN0475: CMP (R0),$XXHGH ;IS IT A GENERIC DEVICE? ;KLN0475": BHI 27$ ;IF HI, NO ;KLN047: ;KLN047D-:26$: CLR (R1)+ ;CLEAR LUN ENTRY ;KLN047M: CLR (R1)+ ; ;KLN047*: SOB R3,25$ ;LOOP UNTIL DONE ;KLN047: ;KLN047A: BR 28$ ;DONE ;KLN047$: ;KLN047D5:27$: CMP (R1)+,(R1)+ ;SKIP OVER THIS ONE ;KLN047L*: SOB R3,25$ ;LOOP UNTIL DONE ;KLN047: ;KLN047W+:28$: MOV (SP)+,R3 ;RESTORE R3 ;KLN047$: MOV (SP)+,R5 ; AND R5 ;KLN047$: MOV (SP)+,R0 ; AND R0 ;KLN047: ;KLN0472: .ENDC ;C$$RTB ;KLN047 :30$: ;KLN047R: .ENDC ;C$$RTK ;KLN0474: ;KLN047 ; .IF DF X$$HDR<-= MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGK>? .ENDC ; DF X$$HDR@AB;+*C; **-$ACTTK-PUT TASK IN ACTIVE TASK LISTD;PIE; THIS ROUTINE IS CALLED TO PUT AN ACTIVE TASK IN THE ACTIVE TASK LIST. F; G; INPUTS:H;M@I; R0=ADDRESS OF THE TCB OF THE TASK TO PUT IN THE ACTIVE LIST.J;0 K; OUTPUTS:L=M; THE SPECIFIED TASK IS MERGED INTO THE ACTIVE TASK LIST BY N; PRIORITY.O;: P; R3 IS PRESERVED ACROSS CALL.Q;-R<S$ACTTK::MOV #$ACTHD-T.ACTL,R1 ;SET ADDRESS OF PREVIOUS TCB/T10$: MOV R1,R2 ;SAVE ADDRESS OF PREVIOUS TCBN-U MOV T.ACTL(R2),R1 ;GET ADDRESS OF NEXT TCB :V CMPB T.PRI(R1),T.PRI(R0) ;TASK HIGHER OR SAME PRIORITY?W BHIS 10$ ;IF HIS YES/X MOV R0,T.ACTL(R2) ;LINK NEW TASK TO PREVIOUS2Y MOV R1,T.ACTL(R0) ;SET LINK TO NEXT IN NEW TASKZ[;+.\; **-$SETCR-SET CONDITIONAL SCHEDULE REQUEST"]; **-$SETRQ-SET SCHEDULE REQUEST3^; **-$SETRT-SET SCHEDULE REQUEST FOR CURRENT TASKS_;.B`; THIS ROUTINE IS CALLED TO FORCE REDISPATCHING OF THE PROCESSOREa; FROM A SPECIFIED POSITION IN THE TASK LIST. IF A PREVIOUS REQUEST2Ab; HAS BEEN SET, THEN REDISPATCHING STARTS AT WHICH EVER REQUESTIc; HAS THE HIGHEST PRIORITY. d;; e; INPUTS:f;Rg; IF ENTRY AT $SETRT, THEN/h; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.T&i; IF ENTRY AT $SETRQ OR $SETCR, THEN3j; R0=ADDRESS OF THE TCB TO START DISPATCHING AT.Ek;R l; OUTPUTS:m;R<n; A SCHEDULE REQUEST IS SET WHICH WILL FORCE A REDISPATCH-8o; ING OF THE PROCESSOR WHEN A SYSTEM EXIT IS EXECUTED.p;A(q; R2 AND R3 ARE PRESERVED ACROSS CALL.:r; R0 IS PRESERVED ACROSS CALL IF ENTRY IS NOT AT $SETRT.s;-tuvw .IF NDF M$$PROHx y .ENABL LSB 8z$SETCR::CMP R0,$TKTCB ;REQUESTED TASK SAME AS CURRENT?{ BEQ $SETRQ ;IF EQ YESO:| CMPB @$CURPR,T.PRI(R0) ;CURRENT TASK OF HIGHER PRIORITY} BHI 30$ ;IF HI YES~ BLO $SETRQ ;IF LO NO=10$: CALLR $DRDSE ;SAME PRIORITY-DECLARE SIGNIFICANT EVENTH1€$SETRT::MOV R5,R0 ;SET ADDRESS OF DISPATCH TCBS7�$SETRQ::MOV @$RQSCH,R1 ;GET PREVIOUS SCHEDULE REQUESTR&‚ BEQ 20$ ;IF EQ NO PREVIOUS REQUEST(ƒ CMP R0,R1 ;TASK ALREADY RESCHEDULED?„ BEQ 30$ ;IF EQ YES/… CMPB T.PRI(R1),T.PRI(R0) ;COMPARE PRIORITIESM.† BHI 30$ ;IF HI PREVIOUS IS HIGHER PRIORITY ‡ BEQ 10$ ;IF EQ SAME PRIORITY+ˆ20$: MOV R0,@$RQSCH ;SET SCHEDULE REQUESTO‰30$: RETURN ;I Š .DSABL LSBO‹Œ .IFFL� Ž .ENABL LSB$�; G�; SEARCH FOR LOWEST PRIORITY RESCHEDULED OR CURRENTLY EXECUTING TASK.RC‘; IF IT IS LOWER THAN RESCHEDULE REQUEST, THEN FORCE A RESCHEDULE ’; REQUEST FOR THAT PROCESSOR.R“;S”•$SETCR::MOV R2,-(SP) ;SAVE R2 7– BIT #TS.RUN,T.STAT(R0) ;IS TASK RUNNING ON OTHER CPU.— BNE 40$ ;IF NE YES,˜ MOV #$RQTAB,R2 ;POINT TO RESCHEDULE TABLE7™ MOV #377,-(SP) ;INITIALIZE LOWEST PRIORITY CELL WITH$&00R˜hhzgM{güfàýfáþfDATAš ;MAXIMUM POSSIBLE PRIORITY VALUE4›10$: MOV (R2)+,-(SP) ;PUSH NEXT RESCHEDULE POINTER0œ BNE 15$ ;IF NE THERE IS A RESCHEDULE POINTER.� MOV R2,(SP) ;COPY POINTER INTO RQSCH TABLE=ž ADD #$PRTAB-$RQTAB-T.PRI-2,(SP) ;CONVERT INTO POINTER INTOEŸ ;PRIORITY TABLER5 15$: BIT $BTMSK-$RQTAB-2(R2),$URMST ;IS CPU ONLINE?#¡ BNE 20$ ;IF NE YES¢ TST (SP)+ ;CLEAN STACK£ BR 30$ ;TRY FOR NEXT CPU1¤20$: CMP R0,-2(R2) ;TASK ALREADY RESCHEDULED???(¥ BNE 25$ ;IF NE NOP(¦ CMP (SP)+,(SP)+ ;CLEAN STACK PRIOR TO§ BR 80$ ;EXIT.¨25$: ADD #T.PRI,(SP) ;POINT TO TASK PRIORITY+© MOVB @(SP)+,1(SP) ;PICK UP TASK PRIORITYE0ª CMPB (SP),1(SP) ;CURRENT PRIORITY LOW OR SAME« BLO 30$ ;IF LO YES-¬ BHI 27$ ;IF HI NO -- DON'T CHANGE LOW PRI­®;I?¯; PRIORITY IS THE SAME AS THE CURRENT LOWEST. IF THIS IS OUREF°; CPU, THEN WE WILL BE NEW LOWEST PRI PROCESSOR. IF NOT, NO CHANGE.±;E²"³ CMP $RQSCH,R2 ;IS THIS OUR CPU?"´ BNE 30$ ;IF NE NO -- NO CHANGE/µ27$: SWAB (SP) ;ELSE SET NEW LOWEST PRIORITY,¶ MOV R2,R1 ;SAVE RESCHEDULE TABLE POINTER1·30$: CMP R2,#$RQTAB+ ;AT END OF TABLEA¸ BLO 10$ ;IF LO NOS¹3º CMPB (SP)+,T.PRI(R0) ;SCHEDULE REQUEST REQUIRED?O» BHI 80$ ;IF HI NOI¼ BLO 60$ ;IF LO YES6½35$: MOV (SP)+,R2 ;ELSE EFFECT SIG. EVENT BECAUSE WE'¾ ;DON'T KNOW WHICH TCB COMES FIRSTE ¿ ;IN ATLW"À CALLR $DRDSE ;EXIT THRU $DRDSEÁÂ;<Ã; TASK IS IN EXECUTION -- FIND THE PROCESSOR AND PERFORM A:Ä; $SETRQ FOR THAT PROCESSOR. THIS GENERALIZES THE SINGLEÅ; PROCESSOR $SETCR. Æ;EÇ)È40$: MOV #$TKTAB,R1 ;GET START OF TABLER0É45$: CMP (R1)+,R0 ;IS TASK ACTIVE ON THIS CPU?%Ê BNE 45$ ;IF NE NO -- TRY NEXT CPUU7Ë ADD #$RQTAB-$TKTAB-2,R1 ;POINT INTO $RQTAB FOR SETRQO-Ì BR 50$ ;ENTER $SETRQ, ALREADY IN PROGRESSNÍ3Î$SETRT::MOV R5,R0 ;SET ADDRESS OF DISPATCH TABLE9Ï$SETRQ::MOV $RQSCH,R1 ;PICK UP RESCHEDULE TABLE POINTERÐ MOV R2,-(SP) ;SAVE R27Ñ50$: MOV (R1)+,R2 ;PICK UP CURRENT RESCHEDULE POINTERR Ò BEQ 60$ ;IF EQ THERE IS NONE(Ó CMP R0,R2 ;TASK ALREADY RESCHEDULED?Ô BEQ 80$ ;IF EQ YES/Õ CMPB T.PRI(R2),T.PRI(R0) ;IS PREVIOUS HIGHERV$Ö BHI 80$ ;IF HI YES -- DO NOTHING0× BNE 60$ ;IF NE YES -- SET RESCHEDULE REQUEST0Ø MOV $ACTHD,-(R1) ;SET SIG. EVENT FOR THIS CPU'Ù BR 70$ ;EXIT THRU NOTIFICATION CODE +Ú60$: MOV R0,-(R1) ;SET RESCHEDULE REQUESTTÛÜ;RBÝ; AT THIS POINT IN A MULTIPROCESSOR SYSTEM, WE HAVE JUST CHANGEDDÞ; THE RESCHEDULE POINTER FOR SOME PROCESSOR. WE WANT TO INTERRUPT#ß; HIM TO INFORM HIM OF THAT FACT. à; áâ70$: CMP $RQSCH,R1 ;IS IT US? ã BEQ 80$ ;IF EQ YESä MTPS #PR7 ;INHIBIT DEADLOCKå LOCK$ $FORKL,SPIN;æ BIS $BTMSK-$RQTAB(R1),$IIPND ;SHOW SOMEONE NEEDS SERVICEEç ULOCK$ $FORKL,SPIN è MTPS #0é80$: MOV (SP)+,R2 ;RESTORE R2T ê RETURNI ë .DSABL LSBìí .ENDCîïð;+>ñ; **-$SETMG/$SETFG-SET EVENT FLAG AND UNLOCK IF GROUP GLOBALò;MBó; THESE ROUTINES SET AN EVENT FLAG AND TAKE CARE OF THE REQUIREDAô; SCHEDULING. IF THE EVENT FLAG WAS GROUP GLOBAL, THE USE COUNT Aõ; FOR THAT FLAG'S GROUP GLOBAL CONTROL BLOCK IS DECREMENTED. IFM@ö; THE CONTROL BLOCK IS MARKED FOR DELETE AND THE COUNT GOES TO!÷; ZERO, IT WILL BE DEALLOCATED.Dø;V ù; INPUTS:Kú;R>û; R0=EVENT FLAG NUMBER ($SETFG) OR EVENT FLAG MASK ($SETMG).-ü; R1=EVENT FLAG WORD ADDRESS ($SETMG ONLY)./ý; R5=TCB ADDRESS FOR WHICH FLAG IS BEING SET. þ; ÿ; OUTPUTS:;H-; R0=TCB ADDRESS OF TASK WHOSE FLAG WAS SET ; R3 IS PRESERVED.;G;-  .ENABL LSBR)$SETMG::CALL $SETM ;SET THE EVENT FLAG   BR 5$ ;JOIN COMMON CODE ) $SETFG::CALL $SETF ;SET THE EVENT FLAGM 5$: ;REFERENCE LABELU   .IF DF G$$GEF, BNE 15$ ;IF NE FLAG WAS COMMON OR GLOBAL5 DECB T.GGF(R5) ;DECR GRP GLOBAL USE COUNT FOR TASKT: ADD #,R1 ;POINT TO GROUP GLOBAL USE COUNT2 ASR R1 ;SHIFT OFF POSSIBLE SECOND GRP GBL FLAG4 SBC R1 ;IF IT WAS SET SUBTRACT ONE WHICH BECOMES. ASL R1 ;THREE WHEN JOINED WITH THE ASR/ASL00R h%hg´cÚµcÛ¶c�·c›’. DEC (R1) ;DECREMENT GROUP GLOBAL USE COUNT1 BNE 15$ ;IF NE THESE EVENT FLAGS STILL IN USES8 BITB #GS.DEL,-(R1) ;FLAGS MARKED FOR DELETE? (G.STAT) BEQ 15$ ;IF EQ NO ! MOV R0,-(SP) ;SAVE TCB ADDRESS  MOV R3,-(SP) ;SAVE R3 MOV R4,-(SP) ;SAVE R4* MOVB -(R1),R4 ;GET GROUP NUMBER (G.GRP)6 CALL $SRGEF ;FIND THESE FLAGS IN GROUP GLOBAL LIST8 CALL $ELGEF ;ELIMINATE THIS GROUP GLOBAL CONTROL BLK  MOV (SP)+,R4 ;RESTORE R4B! MOV (SP)+,R3 ;RESTORE R3N$" MOV (SP)+,R0 ;RESTORE TCB ADDRESS#$ .ENDC ; DF G$$GEF% &15$: RETURN$' ( .DSABL LSBT)*+;+!,; **-$SETF/$SETM-SET EVENT FLAGS-;EB.; THESE ROUTINES SET AN EVENT FLAG AND TAKE CARE OF THE REQUIRED/; RESCHEDULING.M0;, 1; INPUTS:32;M<3; R0=EVENT FLAG NUMBER ($SETF) OR EVENT FLAG MASK ($SETM).,4; R1=EVENT FLAG WORD ADDRESS ($SETM ONLY)./5; R5=TCB ADDRESS FOR WHICH FLAG IS BEING SET.U6;B 7; OUTPUTS:8;M-9; R0=TCB ADDRESS OF TASK WHOSE FLAG WAS SETO:; R1=EVENT FLAG WORD ADDRESS;; R3 IS PRESERVED.<;;.=; IF GROUP GLOBAL EVENT FLAGS ARE SUPPORTED:*>; Z=0 IF LOCAL OR COMMON EVENT FLAG SET'?; Z=1 IF GROUP GLOBAL EVENT FLAG SET @; A;-B=C$SETF:: CALL $CEFI ;CONVERT EVENT FLAG TO MASK AND ADDRESS30D$SETM:: CLR -(SP) ;CLR GROUP GLOBAL INDICATOR-E MOV R1,-(SP) ;SAVE EVENT FLAG WORD ADDRESSE2F BIC #1,R1 ;CLEAR GROUP GLOBAL SECOND WORD FLAGCG BIT #T2.ABO!T2.HLT,T.ST2(R5) ;TASK EXITING OR MARKED FOR ABORT ?W4H BNE 10$ ;IF NE YES, DO NOT TOUCH EVENT FLAG WORD#I BIS R0,(R1) ;SET THE EVENT FLAGP.J10$: MOV R5,R0 ;COPY TCB ADDRESS FOR $SETCR'K TST R1 ;WAS AN EVENT FLAG SPECIFIEDI%L BEQ 19$ ;IF EQ NO, DON'T SCHEDULE.M CMP R1,#$COMEF+2 ;IS IT A COMMON EVENT FLAGN BLOS 20$ ;IF LOS YES"O SUB R5,R1 ;IS IT GROUP GLOBAL?P BLO 15$ ;IF LO YES!Q SUB #T.EFLG+2,R1 ;IS IT LOCAL?R BLE 18$ ;IF LE YES5S15$: DEC 2(SP) ;INDICATE SETTING GROUP GLOBAL FLAG(T BR 20$ ;JOIN COMMON CODEU18$: ;REF LABEL0V BIT #T2.SEF,T.ST2(R0) ;TASK IN STOPFOR STATE?W BNE 185$ ;IF NE YESF,X TSTB T.TIO(R0) ;OUTSTANDING BUFFERED I/O?&Y BEQ 30$ ;IF EQ NO, DON'T UNSTOP IT1Z BIT #T2.WFR!,T.ST2(R0) ;TASK IN WFR?&[ BEQ 30$ ;IF EQ NO, DON'T UNSTOP ITB\185$: BIT T.EFLM(R0),@T.EFLM+2(R0) ;STOPFOR CONDITION SATISFIED?&] BEQ 30$ ;IF EQ NO, DON'T UNSTOP IT^ MOV R3,-(SP) ;SAVE R3_ MOV R0,-(SP) ;SAVE TCBC/` CALL $EXRQN ;UNSTOP AND REQUEST TASK TO RUNBa MOV (SP)+,R0 ;RESTORE TCBb MOV (SP)+,R3 ;RESTORE R3S7c19$: TST $SIGFL ;TASK WAITING FOR SIGNIFICANT EVENT? d BEQ 30$ ;IF EQ NO .e20$: CALL $DRDSE ;DECLARE SIGNIFICANT EVENTf BR 40$ ;JOIN COMMON CODE1g30$: CALL $SETCR ;FORCE CONDITIONAL REDISPATCH$4h40$: MOV (SP)+,R1 ;RESTORE EVENT FLAG WORD ADDRESS3i INC (SP)+ ;CLEAN STACK AND SET Z-BIT FOR RETURN$ j RETURN ;Nkl;+7m; **-$DCAST-DECLARE COMMAND ARRIVAL AST TRAP FOR CLISn;LAo; THIS ROUTINE IS CALLED BY THE COMMAND QUEUEING ROUTINE $QCPKTE;p; WHEN IT IS QUEUEING A COMMAND TO A CLI TASK. IF THE CLIW@q; HAS SPECIFIED THE COMMAND ARRIVAL AST, AN ATTEMPT IS MADE TOAr; ALLOCATE A NEW AST BLOCK FROM THE POOL. THIS IS DONE IN ORDER@s; TO ELIMINATE THE WINDOW THAT OCCURS WHEN THE AST BLOCK WOULD<t; NORMALLY BE UNLINKED FROM T.SAST AND LINKED INTO T.ASTL.Du; IT WOULD BE UNACCEPTABLE FOR A CLI TO LOSE A COMMAND DURING THISAv; WINDOW. IF THE ALLOCATION FAILS HOWEVER, THE CURRENT EXISTINGECw; AST BLOCK IS USED. THE WORD AT A.PRM+2 IN THE AST BLOCK IS USEDEDx; AS A FLAG TO THE SYSXT CODE TO INFORM IT IF IT SHOULD DEALLOCATEy; OR RELINK THE AST BLOCK.z; {; INPUTS:A|;N}; R0=TCB ADDRESS OF CLI ~; R1=ADDRESS OF COMMAND BUFFER;E €; OUTPUTS:�;C6‚; C=1 IF THE TASK IS NOT SETUP FOR THE SPECIFIED AST8ƒ; C=0 IF THE TASK IS SETUP FOR THE AST AND THE AST HAS„; BEEN DECLARED(…; R1=ADDRESS OF THE AST CONTROL BLOCK†;A‡;-ˆ‰Š .IF DF A$$CLI‹!Œ$DCAST::SAVNR ;SAVE R4 AND R5T� MOV #AS.CAA,R4 ;SET AST TYPEC%Ž MOV R0,R5 ;COPY CLI'S TCB ADDRESSC#� M00R¨hhzgM{güfàýfáþfDATAOV R1,R3 ;COPY COMMAND ADDRESSA�‘ .IFF ;A$$CLI ’ “$DCAST==-1”• .ENDC ;A$$CLI–—˜;+™; **-$DASTT-DECLARE AST TRAPš; E›; THIS ROUTINE IS CALLED TO DECLARE A NON-I/O RELATED AST TRAP. THETGœ; TCB OF THE SPECIFIED TASK IS EXAMINED TO DETERMINE IF THE SPECIFIEDS>�; AST IS ENABLED (SETUP). IF IT IS THEN THE AST IS DECLARED.ž; Ÿ; INPUTS: ;F+¡; R3=COMMAND ADDRESS IF AST TYPE = AS.CAAD4¢; R4=CODE INDICATING WHICH AST SHOULD BE DECLARED.=£; R5=ADDRESS OF THE TCB OF THE TASK TO DECLARE THE AST FOR.¤; ¥; OUTPUTS:¦;7§; C=1 IF THE TASK IS NOT SETUP FOR THE SPECIFIED AST.$G¨; C=0 IF THE TASK IS SETUP FOR THE AST AND THE AST HAS BEEN DECLARED.-)©; R1=ADDRESS OF THE AST CONTROL BLOCK.Sª;I)«; NOTE: R4 IS DESTROYED BY THIS ROUTINEC¬;-­ ® .ENABL LSBD6¯$DASTT::CALL $SRAST ;SEARCH FOR SPECIFIED AST BLOCK!° BCS 10$ ;IF CS, THERE IS NONEE±²³ .IF DF A$$CLI´:µ CMP A.CBL(R0),# ;DECLARING CMD ARRIVAL AST¶ BNE 1$ ;IF NE NO2· MOV R1,-(SP) ;SAVE POINTER TO AST BLOCK ADDRESS-¸ MOV #C.LGTH,R1 ;GET LENGTH OF AN AST BLOCKS+¹ CALL $ALOCB ;ALLOCATE ONE FROM THE POOLF5º MOV (SP)+,R4 ;RESTORE POINTER TO AST BLOCK ADDRESSR2» MOV (R4),R1 ;GET ADDRESS OF EXISTING AST BLOCK*¼ BCC 105$ ;IF CC, SUCCESSFUL ALLOCATION8½ MOV SP,A.PRM+2(R1) ;NON-ZERO TO FORCE SYSXT TO RELINK,¾ MOV (R1),(R4) ;REMOVE AST BLOCK FROM LIST ¿ BR 107$ ;D-À105$: MOV R1,R4 ;COPY POINTER TO OLD BLOCKD&Á MOV R0,R1 ;COPY NEW AST BLOCK ADDR# CMP (R4)+,(R0)+ ;SKIP LINK WORDS à MOV (R4)+,(R0)+ ;COPY A.CBLÄ MOV (R4)+,(R0)+ ;COPY A.BYTÅ MOV (R4)+,(R0)+ ;COPY A.ASTÆ MOV (R4)+,(R0)+ ;COPY A.NPR5Ç CLR A.PRM+2(R1) ;ZERO TO FORCE SYSXT TO DEALLOCATE,:È107$: MOV R3,A.PRM(R1) ;SET COMMAND ADDRESS IN AST BLOCK%É MOV R5,R0 ;SET TCB ADDRESS OF CLI+Ê BR $QASTT ;QUEUE ASTË1$: ÌÍ .ENDC ;A$$CLIÎÏ:Ð CMPB A.CBL+1(R0),#AS.REA ;IS THIS A REQUESTED EXIT AST?Ñ BNE 2$ ;IF NE NO8Ò BIS #T2.REX,T.ST2(R5) ;INDICATE AST HAS BEEN DECLARED;Ó2$: MOV (R0),(R1) ;REMOVE THE CONTROL BLOCK FROM THE LISTM4Ô MOV R0,R1 ;SAVE ADDRESS OF THE AST CONTROL BLOCKÕ MOV R5,R0 ;COPY TCB ADDRESSNÖר .IF DF C$$INTÙÚ BR $QASTT ;GO QUEUE THE AST0ÛÜ;+0Ý; **-$DQAC-DEQUEUE AST BLOCK QUEUED BY $QASTC.#Þ; (TO BE CALLED FROM SYSXT ONLY).ß;Q à; INPUT:á; R0 POINTER TO AST BLOCK$â; ã; OUTPUT:P-ä; A.CBL SET TO 1 TO INDICATE AST BLOCK FREE å; (NOT IN AST QUEUE).Oæ;Bç; REGISTERS ALTERED: NONEEè;-éê,ë$DQAC:: INC A.CBL(R0) ; SET AST BLOCK FREE ì RETURNRíîï;+ ð; **-$QASTC-QUEUE AST TO TASK.ñ;CAò; THIS IS A VARIANT OF $QASTT TO BE USED BY A TASK ISR, ENTERED$6ó; VIA A VECTOR CONNECTED TO VIA THE CINT$ DIRECTIVE.ô;$ õ; INPUT:#ö; R5 POINTER TO FORK BLOCK IN ITB ÷;L ø; OUTPUT:T?ù; CC-C 0 IF OK, 1 IF AST ADDRESS NOT SPECIFIED IN CINT$ CALL.ú;P;û; NOTE - IF THE AST BLOCK IS ALREADY QUEUED FOR THE TASK,T(ü; NO ACTION IS TAKEN. RETURN CC-C = 0.ý;N"þ; REGISTERS ALTERED: R0,R1,R2,R3ÿ;-$QASTC::MOV R5,R1T& ADD #X.AST-X.FORK,R1 ;GET AST BLOCK1 TST A.CBL(R1) ;AST BLOCK ALREADY IN AST QUEUE? # BEQ 10$ ;Y - EXIT WITH CC-C = 0( TST A.AST(R1) ;AST ADDRESS SPECIFIED? SEC ;ASSUME NO # BEQ 10$ ;N - EXIT WITH CC-C = 1I+  CLR A.CBL(R1) ;INDICATE AST BLOCK IN USE +  MOV X.TCB-X.FORK(R5),R0 ;GET TCB ADDRESS  ;FALL THRU TO $QASTT   .ENDC;+; **-$QASTT-QUEUE AST TO TASKK;EF; THIS ROUTINE IS USED TO QUEUE AN AST TO A TASK AND INSURE THE TASKH; WILL BE SCHEDULED AND RECONSIDERED FOR ELIGIBILITY IN THE PARTITION.;; ; INPUTS:E;N); R0=TCB ADDRESS OF TASK TO RECEIVE AST-.; R1=ADDRESS OF AST CONTROL BLOCK TO BE USED;S ; OUTPUTS:;; C=0 ; R1 IS PRESERVED ;- 4!$QASTT::ADD #T.ASTL,R0 ;POINT TO TASK AST LISTHEAD2" MOV R1,-(SP) ;SAVE ADDRESS OF AST CONTROL BLOCK2# CALL $QINSF ;INSERT CONTROL BLOCK IN AST QUEUE,$ SUB #T.ASTL,R0 ;POINT BACK TO TCB ADDRESS%;+&00R°h%hg´cÚµcÛ¶c�·c›’; ** W A R N I N G **D';R(; SPM HOOKPOINT NUMBER 08.);N+*; DO NOT CHANGE THE INSTRUCTION FOLLOWINGO+; LABEL WITHOUT CHECKING SPM,;---.$SPH08==. ;SPM CHANGES THE INSTRUCTION ATO!/ ;THE LOCATION OF THIS LABELS20 CALL @#$SETCR ;SET CONDITIONAL SCHEDULE REQUEST*1 BIT #T2.STP,T.ST2(R0) ;IS TASK STOPPED?2 BEQ 5$ ;IF EQ NO3&4 MOV T.PCB(R0),R0 ;POINT TO TASK PCB*5 CALL $NXTSK ;REALLOCATE TASK PARTITION565$: MOV (SP)+,R1 ;RESTORE AST CONTROL BLOCK ADDRESSD7 CLC ;RETURN CARRY CLEAR810$: RETURN ;P 9 .DSABL LSBB:;;+.<; **-$SRAST-SEARCH FOR A SPECIFIED AST BLOCK=; J>; THIS ROUTINE IS CALLED TO SEARCH FOR A SPCIFIC TYPE OF AST CONTROL BLK?;A @; INPUTS:EA;T7B; R4=CODE INDICATING TYPE OF BLOCK TO BE SEARCHED FORE<C; R5=TCB ADDRESS OF TASK WHOSE SAST LIST IS TO BE SEARCHEDD; E; OUTPUTS:F;M/G; C=1 IF SPECIFED TYPE OF AST BLOCK NOT FOUNDK/H; C=0 IF SPECIFIED TYPE OF AST BLOCK IS FOUND;I; R0=ADDRESS OF THE BLOCK-J; R1=ADDRESS OF WORD POINTING TO THE BLOCKRK;-%L$SRAST::MOV R5,R0 ;GET TCB ADDRESSS7M ADD #T.SAST,R0 ;POINT TO SPECIFIED AST BLOCK ADDRESSEN10$: SEC ;ASSUME FAILURE(O MOV R0,R1 ;GET POINTER TO NEXT BLOCKP MOV (R0),R0 ;GET LINK WORDQ BEQ 20$ ;IF EQ, END OF LIST ?R CMPB R4,A.CBL+1(R0) ;IS THIS THE BLOCK OF THE SPECIFIED TYPEDS BNE 10$ ;NO IF NE T20$: RETURNSUV;+'W; **-$SRPRO-SEARCH PROTOTYPE TCB LISTEX;DDY; THIS ROUTINE IS CALLED TO SCAN THE SECONDARY POOL TCB LIST FOR AEZ; SPECIFIC TASK NAME. IF THE SEARCH SUCCEEDS, THEN THE ADDRESS OF ACE[; KISAR5 BIAS, WITH THE LOW BIT OF THE ADDRESS SET TO DIFFERENTIATEF\; IT FROM A POOL TCB ADDRESS, IS RETURNED. IF THE SEARCH FAILS, THENA]; THE ROUTINE DROPS INTO $SRSTD TO SEARCH THE PRIMARY TCB LIST.C^;4 _; INPUTS:;`;I-a; R3=ADDRESS OF THE TASK NAME TO SEARCH FOR b;F c; OUTPUTS:d;S.e; C=1 IF THE TASK IS NOT IN EITHER TASK LISTf; C=0 IF TASK WAS FOUNDE(g; R0=ADDRESS OF TCB IN POOL (IF EVEN)2h; R0=ADDRESS OF KISAR5 BIAS OF TCB ! 1 (IF ODD)i;-jk$SRPRO:: ;REFERENCE LABEL5lm .IF DF P$$OOLn.o CALL CLIDSP ;CHECK IF TASK NAME WAS CLI...(p MOV KISAR6,-(SP) ;SAVE APR 6 FOR SCAN.q MOV $PTCBL,KISAR6 ;MAP TO FIRST TCB IN LIST r BEQ 30$ ;IF EQ THERE IS NONE@s10$: CMP (R3),140000+T.NAM ;MATCH ON FIRST HALF OF TASK NAME ?t BNE 20$ ;IF NE NOU6u CMP 2(R3),140002+T.NAM ;LUCKY SO FAR, SECOND HALF ?"v BEQ 40$ ;IF EQ YES, THIS IS IT8w20$: MOV 140000+T.TCBL,KISAR6 ;MAP TO NEXT TCB IN LIST"x BNE 10$ ;IF NE NOT END OF LIST6y30$: MOV (SP)+,KISAR6 ;PUT APR 6 BACK AS WE FOUND ITz BR SCNSTD ;AND TRY THE STD5{40$: MOV #$PTCPT,R0 ;POINT TO THE PROTO TCB POINTER %| MOV KISAR6,(R0) ;STORE KISAR6 BIASO4} INC R0 ;INDICATE KISAR5 POINTER, NOT TCB ADDRESS-~ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGL& RETURN ;C IS CLR DUE TO CMP ABOVE€� .ENDC ;DF P$$OOLA‚ƒ;+*„; **-$SRSTD-SEARCH SYSTEM TASK DIRECTORY…;SI†; THIS ROUTINE IS CALLED TO SEARCH THE TASK DIRECTORY FOR A TASK OF THE$‡; SPECIFIED NAME.Iˆ; ‰; INPUTS:+Š;R.‹; R3=ADDRESS OF THE TASK NAME TO SEARCH FOR.Œ;T �; OUTPUTS:Ž;M'�; C=1 IF SPECIFIED TASK IS NOT FOUND.N#�; C=0 IF SPECIFIED TASK IS FOUND.6‘; R0=ADDRESS OF THE TCB.K’; ,“; R1,R2, AND R3 ARE PRESERVED ACROSS CALL.”;-• – .ENABL LSBL(—$SRSTD::CALL CLIDSP ;CHECK FOR CLI...3˜SCNSTD: MOV $TSKHD,R0 ;POINT TO FIRST TCB IN LISTR4™10$: CMP T.NAM(R0),(R3) ;FIRST HALF OF NAME MATCH?š BNE 20$ ;IF NE NO 4› CMP T.NAM+2(R0),2(R3) ;SECOND HALF OF NAME MATCH?œ BEQ 30$ ;IF EQ YES.�20$: MOV T.TCBL(R0),R0 ;GET LINK TO NEXT TCBž TST T.TCBL(R0) ;NULL TASK?=Ÿ BNE 10$ ;IF NE NON 25$: SEC ;INDICATE FAILURE¡30$: RETURN ;¢£;RF¤; **-CLIDSP-LOCAL ROUTINE TO CHECK IF SUPPLIED TASK NAME IS "CLI..."¥;E¦; THIS ROUTINE IS CALLED BY EITHER $SRPRO OR $SRSTD TO CHECK IF THEO@§; TASK THEY ARE TRYING TO FIND IS THE CLI DISPATCHER "CLI...".A¨; IF IT IS, THE ADDRESS OF MCR... IS PUT IN R0, AND A RETURN00R¸hhzgM{güfàýfáþfDATA TO2?©; THE CALLER'S CALLER IS EXECUTED. OTHERWISE, A RETURN TO THE@ª; APPROPRIATE SCAN ROUTINE IS EXECUTED TO SEARCH THE LIST. ALLJ«; THIS IS BEING DONE SINCE THERE IS NO ACTUAL CLI... TASK IN THE SYSTEM.G¬; CLI... IS INTENDED TO BE USED FROM SPWN$ OR RPOI$ TO PASS A COMMANDSE­; LINE TO THE TERMINAL'S CLI, WHEREAS MCR... WILL FORCE THE COMMANDR)®; TO MCR, REGARDLESS OF CLI ASSIGNMENT. ¯;G °; INPUTS:H±; ²; R3=ADDRESS OF TASK NAMEI³; ´; OUTPUTS:µ;.=¶; IF THE NAME WAS CLI..., THE TCB ADDRESS IS RETURNED IN R0E%·; WITH C=0 TO THE CALLER'S CALLER. C¸; IF THE NAME WAS NOT CLI..., A RETURN TO THE CALLER IS EXECUTED.S¹;Eº;-»/¼CLIDSP: CMP #^RCLI,(R3) ;SEARCHING FOR CLI....½ BNE 35$ ;IF NE NOD ¾ CMP #^R...,2(R3) ;MAY HAVE IT¿ BNE 35$ ;IF NE NOI#À MOV $MCRPT,R0 ;USE TCB OF MCR....3Á TST (SP)+ ;POP FIRST RETURN ADDRESS AND SET C=0 Â35$: RETURN ÃÄ;+3Å; **-$ACTRM-REMOVE TASK FROM THE ACTIVE TASK LISTÆ;UEÇ; THIS ROUTINE IS CALLED TO REMOVE A TCB FROM THE ACTIVE TASK LIST.NÈ; É; INPUTS: Ê;E$Ë; R0=ADDRESS OF THE TCB TO REMOVE.Ì; Í; OUTPUTS:Î; DÏ; C=1 IF THERE IS NO ENTRY IN THE LIST THAT MATCHES THE TCB ADDRES5Ð; C=0 IF A MATCHING ENTRY IS REMOVED FROM THE LIST.RÑ;($Ò; R0 IS PRESERVED ACROSS THE CALL.Ó;Ô;-Õ5Ö$ACTRM::MOV #$ACTHD-T.ACTL,R1 ;GET ADDR OF LISTHEADR)×40$: MOV R1,R2 ;SAVE PREVIOUS TCB ADDR'Ø MOV T.ACTL(R2),R1 ;GET NEXT TCB ADDRA$Ù BEQ 25$ ;IF EQ END OF LIST FOUND*Ú CMP R0,R1 ;DOES NEXT TCB ADDR EQ OURS?%Û BNE 40$ ;IF NE NO -- KEEP LOOKING*Ü MOV T.ACTL(R0),T.ACTL(R2) ;REMOVE ENTRYÝ RETURN ;EXIT Þ .DSABL LSBEßà;+(á; **-$SRMUT-SEARCH FOR MULTI-USER TASKâ; Fã; THIS ROUTINE CALCULATES THE NAME OF A MULTI-USER TASK ACCORDING TOCä; THE NAME OF THE PROTOTYPE TCB AND THE TI: OF THE COPY. IT THENRBå; SEARCHES FOR THE COPY OF THE MULTI-USER TASK IN THE TASK LIST.æ;M ç; INPUTS:,è;E@é; R0=ADDRESS OF THE TI: UCB OF THE COPY OF THE MULTI-USER TASK:ê; R1=FIRST WORD OF THE TASK NAME OF THE COPY OF THE TASKë;O ì; OUTPUTS:í;T<î; R3=PTR TO CALCULATED TASK NAME (IN $TNAME AND $TNAME+2).ï;.ð; C=0 IF THE COPY WAS FOUND IN THE TASK LISTñ; R0=ITS TCB ADDRESSEò;U2ó; C=1 IF THE COPY WAS NOT FOUND IN THE TASK LISTô;-õö÷ .IF DF R$$DSPø4ù$SRMUT::MOV R1,$TNAME ;SET FIRST WORD OF TASK NAME%ú CLR -(SP) ;ALLOCATE SCRATCH SPACEL!û MOV (R0),R2 ;POINT TO TI: DCB *ü TST (R2)+ ;SKIP OVER LINK WORD (D.LNK)5ý SUB (R2)+,R0 ;CALC RELATIVE ADDRESS OF UCB (D.UCB) 3þ MOV (R2)+,-(SP) ;PUSH DEVICE NAME OF TI: (D.NAM)39ÿ MOV (R2)+,-(SP) ;SAVE LOW UNIT NUMBER FOR DCB (D.UNIT)- MOV (R2),R1 ;PICK UP SIZE OF UCB (D.UCBL)T4 CALL $DIV ;CALCULATE RELATIVE UNIT NUMBER OF UCB6 ADD (SP)+,R0 ;CALCULATE LOGICAL UNIT NUMBER OF UNIT" BIC #177400,R0 ;CLEAR HIGH BYTE( CMP R0,#77 ;IS UNIT GREATER THAN 77? BLOS 9$ ;IF LOS NO MOV R0,R1 ;COPY UNIT NUMBER . ASH #-3,R1 ;CALCULATE HIGH ORDER CHARACTER" ADD #'A-10,R1 ;CONVERT TO ASCII0  BIC #177770,R0 ;CALCULATE LOW ORDER CHARACTER  ADD #'0,R0 ;CONVERT TO ASCII  BR 15$ ;" 9$: MOV R0,R1 ;COPY UNIT NUMBER)  BIC #70,R0 ;MASK OFF HIGH-ORDER DIGITC& ADD #'0,R0 ;CONVERT TO ASCII DIGIT' ASRB R1 ;CALCULATE HIGH-ORDER DIGITU  ASRB R1 ;I  ASRB R1 ;T. BNE 10$ ;IF NE THERE IS A HIGH-ORDER DIGIT, MOV R0,R1 ;ELSE SUPPRESS HIGH-ORDER ZERO  BR 20$ ;*10$: ADD #'0,R1 ;CONVERT TO ASCII DIGIT%15$: MOVB R0,2(SP) ;STORE LOW DIGITD,20$: MOVB R1,1(SP) ;STORE IN SCRATCH SPACE' MOV SP,R0 ;POINT TO ASCII TASK NAME#% CALL $CAT5 ;CONVERT TO RAD50 WORD CMP (SP)+,(SP)+ ;CLEAN STACKR3 MOV #$TNAME,R3 ;POINT TO TASK NAME AREA IN SYSCM#- MOV R1,2(R3) ;SET SECOND WORD OF TASK NAMEL1 CALLR $SRSTD ;SEARCH FOR TASK NAME AND RETURN1;+ ; **-$TCBCP-TCB COPY ROUTINE!;DE"; THIS ROUTINE IS CALLED TO COPY AN INSTALLED TCB INTO AN ALLOCATED:E#; TCB AND LINK IT INTO TO THE SYSTEM TASK DIRECTORY. SPECIFICALLY,I$$; THIS ROUTINE DOES 00RÀh%hg´cÚµcÛ¶c�·c›’THE FOLLOWING:%;HH&; 1. COPY THE CONTENTS OF THE INSTALLED TCB INTO THE ALLOCATED TCB.8'; 2. INITIALIZE ALL LISTHEADS IN THE ALLOCATED TCB.C(; 3. TRANSFER ANY SEND PACKETS DESTINED FOR THE ALLOCATED TCB.C.); 4. SET UP THE TASK NAME IN THE NEW TCB.E*; 5. LINK THE NEW TCB INTO THE SYSTEM TASK DIRECTORY IMMEDIATELY7+; AFTER THE TCB INPUT AS THE PROTOTYPE INSTALLED TCB.N,; -; INPUTS:.; #/; R0=ADDRESS OF THE ALLOCATED TCBI#0; R1=ADDRESS OF THE INSTALLED TCBU@1; IF R1 IS ODD, THEN R1-1 IS THE ADDRESS OF THE KISAR6 BIAS,2; OF A PROTOTYPE TCB IN SECONDARY POOL.A3; R3=ADDRESS OF THE TASK NAME DOUBLE-WORD FOR THE ALLOCATED TCBF4;Y 5; OUTPUTS:6;N7; R0 AND R1 ARE PRESERVED.8;-9!:$TCBCP::SAVNR ;SAVE R4 AND R5;< .IF DF P$$OOL=0> MOV KISAR6,-(SP) ;SAVE CURRENT KERNEL MAPPING)? BIT #1,R1 ;IS TCB IN SECONDARY POOL ?L@ BEQ 3$ ;IF EQ NOA DEC R1 ;POINT BACK TO BIAS*B MOV (R1),KISAR6 ;REMAP TO SEC. POOL TCB1C MOV (R1),(R0)+ ;STORE KISAR6 BIAS IN T.LNK FOR (D ;POSSIBLE ERROR RECOVERY BY $REMOV/E MOV #140000,R1 ;POINT TO TCB VIRTUAL ADDRESS F BR 4$ ;ENTER COMMON CODEGH .ENDC ;DF P$$OOLI2J3$: CLR (R0)+ ;CLEAR AND SKIP LINK WORD (T.LNK):K4$: MOVB T.DPRI(R1),(R0)+ ;INIT RUNNING PRIORITY (T.PRI)L&M CLRB (R0)+ ;INIT I/O COUNT (T.IOC)<N MOV T.PCBV(R1),(R0)+ ;COPY POINTER TO PCB VECTOR (T.PCBV)O BEQ 5$ ;IF EQ THERE IS NONE 9P ADD #400,@T.PCBV(R1) ;INCREMENT ACCESS COUNT IN VECTOR.Q5$: MOV (R3)+,(R0)+ ;STORE TASK NAME (T.NAM)R MOV (R3),(R0)+ ;O3S ADD #T.RCVL,R1 ;POINT TO INSTALLED TCB RCVD LIST !T CALL 40$ ;SETUP RECEIVE QUEUECU10$: ;MARK T.RCVL CALLP V CALL @(SP)+ ;SETUP AST QUEUE'W CLR (R0)+ ;CLEAR EFN WORDS (T.EFLG)TX CLR (R0)+ ;I9Y CMP (R0)+,(R0)+ ;POINT TO STATUS WORDS (T.UCB)(T.TCBL)C5Z MOV #TS.EXE,(R0)+ ;INIT FIRST STATUS WORD (T.STAT)P=[ ADD #T.ST2-T.EFLG,R1 ;POINT TO INSTALLED TCB 2ND STAT WORD02\ MOV (R1)+,(R0) ;COPY SECOND STATUS WORD (T.ST2)?] BIC #^CT2.CHK,(R0)+ ;CLEAR ALL BUT CHECKPOINTABILITY (T.ST2)O1^ MOV (R1)+,(R0) ;COPY THIRD STATUS WORD (T.ST3)S>_ BIC #T3.REM!T3.MCR!T3.CAL,(R0)+ ;CLR NECESSARY BITS (T.ST3)$` MOV (R1)+,(R0)+ ;(T.DPRI & T.LBN)a MOV (R1)+,(R0)+ ;(T.LBN+1)Sb MOV (R1)+,(R0)+ ;(T.LDV),c MOV (R1)+,R2 ;PICK UP PCB ADDRESS (T.PCB)0d MOV P.MAIN(R2),(R0)+ ;SET PCB POINTER (T.PCB)e MOV (R1)+,(R0)+ ;(T.MXSZ)f CMP (R1)+,(R0)+ ;(T.ACTL)+g CALL @(SP)+ ;SET UP ATTACHMENT LISTHEADP-h MOV (R1)+,(R0) ;FOURTH STATUS WORD (T.ST4)(/i BIC #T4.PRO,(R0)+ ;CLEAR NON-PROPAGATED BITS3j MOV (R1)+,(R0)+ ;HDR LENGTH/UNUSED BYTE (T.HDLN)B5k CLR (R0)+ ;GRP GBL USE/BUFFERED I/O (T.GGF,T.TIO)Tl TST (R1)+ ;POINT TO T.EFLM:m MOV (R1)+,(R0)+ ;COPY POSSIBLE CPU TIME LIMIT IN T.EFLMn MOV (R1)+,(R0)+ ;SECOND HALF op .IF DF A$$CNTq9r BIT #TS.EXE,T.STAT-T.TKSZ(R1) ;IS SOURCE TASK ACTIVE ?+s BNE 15$ ;IF NE, NO0t CLR -2(R0) ;YES, THEN DON'T COPY (T.EFLM+2).u CLR -4(R0) ;EVENT FLAG MASKS (T.EFLM)v15$: ;REFERENCE LABELwx .ENDC ; DF A$$CNTy3z MOV (R1)+,(R0)+ ;TASK INITIAL LOAD SIZE (T.TKSZ)E{$$$=T.TKSZ+2|}~ .IF DF P$$LAS,€ MOV (R1)+,(R0)+ ;COPY OFFSET WORD (T.OFF)1� CLR (R0)+ ;CLR SREF WITH EFN COUNT (T.SRCT-1)L,‚ TST (R1)+ ;ADVANCE INSTALLED TCB POINTER5ƒ CALL @(SP)+ ;SET UP RECEIVE BY REFERENCE LISTHEADK„20$: ;MARK T.RRFL CALL .…$$$=T.RRFL+4 ;MARK CURRENT POSITION IN TCB†‡ .ENDCˆ‰Š .IF DF N$$DIR‹4Œ CLR (R0) ;POINTER TO CONTEXT BLOCK (DDS) (T.CTX)*� CMP (R0)+,(R1)+ ;INCREMENT TCB POINTERS Ž$$$=T.CTX+2A�� .ENDC ; DF N$$DIR‘’“ .IF DF P$$OFF”#• CALL @(SP)+ ;SETUP OCB LISTHEAD0!– CLR (R0) ;CLEAR RUNDOWN COUNTR(— CMP (R0)+,(R1)+ ;ADVANCE TCB POINTERS˜ .ENDC™š› CLR (R0) ;CLEAR T.SAST,œ$$$=T.SAST ;MARK CURRENT POSITION IN TCB�žŸ .IF DF M$$PRO 1¡ CMP (R0)+,(R1)+ ;ADVANCE TCB POINTERS TO T.RRMO*¢ MOV (R1)+,(R0)+ ;COPY REQUIRED RUN MASK1£ MOV (R1)+,(R0)+ ;COPY INITIAL AFFINITY (T.IRM)D00RÈhhzgM{güfàýfáþfDATA*¤ CLR (R0) ;CLEAR CPU ID AND UNUSED BYTE ¥$$$=T.CPU¦§ .ENDC¨©ª .IF DF A$$CNT«1¬ CMP (R0)+,(R1)+ ;ADVANCE TCB POINTERS TO T.ACNB/­ CLR (R0) ;CLEAR POINTER TO ACCOUNTING BLOCK+®$$$=T.ACN ;MARK CURRENT POSITION IN TCBN¯° .ENDC±²³ .IF DF U$$DAS´1µ CMP (R0)+,(R1)+ ;ADJUST TCB POINTERS TO T.ISIZ#¶ MOV (R1),(R0) ;COPY I SPACE SIZE+ ·$$$=T.ISIZ¸¹ .ENDC ; DF U$$DASº»$¼ SUB #$$$,R0 ;POINT BACK TO START½ SUB #$$$,R1 ;I¾¿ .IF DF P$$OOLÀ)Á CMP #140000,R1 ;TCB IN PRIMARY POOL ? BHI 30$ ;IF HI YES6à MOV #$TSKHD-T.TCBL,R2 ;POINT TO FIRST TCB IN SYSTEM+Ä25$: MOV R2,R1 ;SAVE POINTER TO OLD TCB 0Å MOV T.TCBL(R2),R2 ;POINT TO NEXT TCB IN LIST!Æ BEQ 30$ ;IF EQ THERE IS NONEN<Ç CMPB T.DPRI(R2),T.DPRI(R0) ;TASK BELONG BEFORE THIS TCB ?#È BHIS 25$ ;IF HIS NO,KEEP GOINGRÉ30$: ;REFERENCE LABEL=ÊË .ENDC ; DF P$$OOLÌ9Í MOV T.TCBL(R1),T.TCBL(R0) ;LINK ALLOCATED TCB INTO STD$Î MOV R0,T.TCBL(R1) ;$Ï TST (SP)+ ;POP COROUTINE ADDRESSÐÑ .IF DF P$$OOLÒ4Ó MOV (SP)+,KISAR6 ;RESTORE PREVIOUS KERNEL MAPPINGÔÕ .ENDC ; DF P$$OOLÖ × RETURN ;P0Ø40$: CLR (R0) ;INIT LISTHEAD IN ALLOCATED TCBÙ MOV R0,2(R0) ;ÚÛÜ .IF DF P$$LASÝ&Þ CMP (SP),#20$ ;IS IT THE RRFL LIST?ß BEQ 50$ ;IF EQ YESàá .ENDCâã)ä CMP (SP),#10$ ;IS IT THE RECEIVE LIST?Aå BNE 80$ ;IF NE NO 6æ BIT #T3.NSD!T3.ACP,T.ST3-T.RCVL(R1) ;DOES TASK HAVEç ;STANDARD RECEIVE QUEUE ?R*è BNE 80$ ;IF NE, NO - DON'T TRY TO COPYéêë .IF DF P$$OOLì4í MOV R0,-(SP) ;SAVE LISTHEAD ADDRESS FOR ALLOC TCB2î MOV R1,-(SP) ;SAVE LISTHEAD ADDRESS FOR INS TCB ï MOV KISAR5,-(SP) ;SAVE KISAR5)ð MOV R1,R0 ;COPY INSTALLED TCB POINTER ñ MOV R0,R4 ;COPY POINTER;$ò46$: MOV (R4),R4 ;GET NEXT PACKETó BEQ 47$ ;IF EQ END OF LIST.ô MOV R4,KISAR5 ;MAP THE PACKET THROUGH APR 50õ MOV @#120002,R1 ;GET NUMBER OF DATA WORDS + 2ö ASL R1 ;CONVERT TO BYTES/÷ ADD #120010,R1 ;POINT TO TASK NAME IN PACKETO,ø MOV #120000,R4 ;POINT TO PACKET LINK WORD5ù CMP (R1),-2(R3) ;MATCH ON FIRST WORD OF TASK NAME?Tú BNE 46$ ;IF NE NOV5û CMP 2(R1),(R3) ;MATCH ON SECOND WORD OF TASK NAME?Vü BNE 46$ ;IF NE NO $ý MOV KISAR5,R1 ;GET PACKET ADDRESS/þ MOV 2(SP),R0 ;GET LISTHEAD FOR ALLOCATED TCBX5ÿ CALL $GTSPK ;UNLINK THE PACKET FROM INSTALLED TCBA% MOV R0,R4 ;SET UP TO RESTART SCANV3 MOV 4(SP),R0 ;GET INSTALLED TCB LISTHEAD ADDRESS - CALL $QSPIF ;AND LINK IT TO ALLOCATED TCB  BR 46$ ;CONTINUE SCANV'47$: MOV (SP)+,KISAR5 ;RESTORE KISAR54 MOV (SP)+,R1 ;RESTORE LISTHEAD ADDRESS OF INS TCB6 MOV (SP)+,R0 ;RESTORE LISTHEAD ADDRESS OF ALLOC TCB  BR 80$ ;  .ENDC  0 50$: MOV R1,R5 ;INIT POINTER TO START OF LIST+ 60$: MOV R5,R4 ;SAVE POINTER TO PREVIOUSC& MOV (R5),R5 ;POINT TO NEXT IN LIST  BEQ 80$ ;IF EQ THERE IS NONE7 CMP 44(R5),-2(R3) ;MATCH ON FIRST WORD OF TASK NAME?T BNE 60$ ;IF NE NO6 CMP 46(R5),(R3) ;MATCH ON SECOND WORD OF TASK NAME? BNE 60$ ;IF NE NO:) MOV (R5),(R4) ;UNLINK PACKET FROM LIST(2 BNE 70$ ;IF NE IT WAS NOT THE LAST IN THE LIST, MOV R4,2(R1) ;UPDATE LAST IN LIST POINTER!70$: CLR (R5) ;CLEAR LINK WORD3 MOV R5,@2(R0) ;LINK TO END OF ALLOCATED TCB LIST, MOV R5,2(R0) ;UPDATE LAST IN LIST POINTER0 MOV R1,-(SP) ;SAVE T.RRFL PTR FOR PROTO TCB0 MOV R0,-(SP) ;SAVE T.RRFL PTR FOR CREATED TCB- MOV 10(R5),R0 ;GET REGION ID TO SEARCH FOR + ADD #A.TCBL,R0 ;ADJUST TO LINK WORD ADDRO7 ADD #T.ATT-T.RRFL,R1 ;POINT TO PROTO ATT DESC LIST). MOV R1,R2 ;MAKE A COPY OF LISTHEAD ADDRESS' 72$: MOV R2,R4 ;SAVE POINTER TO LAST,! MOV (R2),R2 ;GET NEXT ADBT " BEQ 74$ ;IF EQ THERE IS NONE# CMP R2,R0 ;THIS THE ONE ? $ BNE 72$ ;IF NE NOS"% MOV (R2),(R4) ;UNLINK FROM LIST#& BNE 73$ ;IF NE NOT LAST IN LIST.,' MOV R4,2(R1) ;UPDATE LAST IN LIST POINTER6(73$: MOV (SP),R0 ;RESTORE POINTER TO CREATED T.RRFL7) ADD #T.ATT-T.RRFL,R0 ;POINT TO CREATED ATT DESC LISTO,* MOV R2,@2(R0)00RÐh%hg´cÚµcÛ¶c�·c›’ ;INSERT IN SPAWNED ATT LIST$+ MOV R2,2(R0) ;UPDATE LAST IN LIST3, MOV R0,A.TCB-A.TCBL(R2) ;CREATE POINTER IN A.TCBV.- SUB #T.ATT,A.TCB-A.TCBL(R2) ;TO CORRECT TCB9. BICB #AS.PRO,A.STAT-A.TCBL(R2) ;INDICATE PRI. POOL TCBH&/74$: MOV (SP)+,R0 ;RESTORE REGISTERS0 MOV (SP)+,R1 ;F1 BR 50$ ;RESTART SCAN*280$: CMP (R0)+,(R0)+ ;BUMP BOTH POINTERS3 CMP (R1)+,(R1)+ ;%4 CALL @(SP)+ ;CALL THE CALLER BACKT 5 BR 40$ ;6"6 .ENDC ; DF R$$DSP ;JWB2138 ;**-1O9:;+;; **-$REMOV-REMOVE TASK .<; **-$REMO1-REMOVE TASK DURING ERROR CLEANUP=;VF>; THIS ROUTINE IS STRICTLY DESIGNED TO REMOVE A TASK, WHICH HAS BEENE?; DYNAMICALLY INSTALLED BY THE EXECUTIVE-LEVEL DISPATCHING CODE, AS.B@; PART OF ERROR RECOVERY BEFORE THE TASK IS EVER ACTIVATED, OR AGA; TASK BEING REMOVED ON TASK EXIT. IT WILL NOT, IN GENERAL, PROPERLY B; REMOVE ANY OTHER GIVEN TASK.C;CDD; $REMO1 IS AN ALTERNATE ENTRY TO BE USED WHEN CLEANING UP AFTER ACE; FALSE START, SUCH AS WHEN THE SPAWN DIRECTIVE PASSES $TCBCP BUT*DF; FAILS TO START THE TASK. $REMO1 CHECKS THE UTILTITY LINK WORD TOGG; SEE IF IT CONATINS THE KISAR6 BIAS OF THE PROTOTYPE TCB, AND SHOULDE@H; NOT BE CALLED IF THE TCB HAS BEEN CHANGED (E.G. FROM $DREIF)I;E J; INPUTS: K;I)L; R0=TCB ADDRESS OF TASK TO BE REMOVED.VM; N; OUTPUTS:O; P; NONE.EQ;-RS T .ENABL LSBYUV$REMO1:: ;REFERENCE LABEL1WX .IF DF P$$OOLY#Z SAVNR ;SAVE NON-VOL. REGISTERS ([ MOV KISAR6,-(SP) ;SAVE KERNEL MAPPING0\ MOV (R0),KISAR6 ;MAP TO POSSIBLE SEC POOL TCB%] BEQ 5$ ;IF EQ TCB IN PRIMARY POOL )^ MOV #140000,R1 ;POINT TO PROTOTYPE TCBO_ CALL 15$ ;JOIN $REMOV BELOW-` MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGE a RETURN ;)b0c5$: MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGde .ENDC ; DF P$$OOLf!g$REMOV::SAVNR ;SAVE R4 AND R5-h CALL $DRCSR ;CANCEL ANY SCHEDULE REQUESTS "i MOV R5,R0 ;RESTORE TCB ADDRESSjkl .IF DF P$$LASm6n CALL $CLSRF ;CLEAR ANY REC BY REF PKT PTRS TO TASKop .ENDCqr>s MOV #$TSKHD-T.TCBL,R1 ;POINT TO START OF TASK LIST - T.TCBL)t CMP $TSKHD,R0 ;REMOVING FIRST IN LIST?Cu BEQ 40$ ;IF EQ YES/v10$: MOV T.TCBL(R1),R1 ;POINT TO NEXT IN LISTN,w CMP T.TCBL(R1),R0 ;REMOVING NEXT IN LIST?x BNE 10$ ;IF NE NOIyz15$: ;REFERENCE LABEL{| .IF DF P$$OOL}6~ MOV T.RCVL(R0),R2 ;ANY ENTRIES IN THE RECEIVE LIST? BEQ 30$ ;IF EQ NOO&€ MOV KISAR5,-(SP) ;SAVE KERNEL APR 50� MOV #120000,R4 ;POINT TO FIRST WORD OF PACKET=‚ MOV T.RCVL+2(R1),KISAR5 ;MAP THE LAST PACKET THROUGH APR 5N0ƒ TST T.RCVL(R1) ;PROTO TCB RECEIVE LIST EMPTY?„ BNE 20$ ;IF NE NOT%… MOV R1,R4 ;COPY PROTO TCB ADDRESST(† ADD #T.RCVL,R4 ;POINT TO RECEIVE LIST7‡20$: MOV R2,(R4) ;LINK RECEIVE ENTRIES TO PROTO LIST 9ˆ MOV T.RCVL+2(R0),T.RCVL+2(R1) ;FIX UP LAST IN LIST PTRL)‰ MOV (SP)+,KISAR5 ;RESTORE KERNEL APR 5TŠ‹ .IFFSŒ�:Ž MOV T.RCVL(R0),@T.RCVL+2(R1) ;LINK ENTRIES TO PROTO TCB!� BEQ 30$ ;IF EQ THERE ARE NONEO9� MOV T.RCVL+2(R0),T.RCVL+2(R1) ;FIX UP LAST IN LIST PTRE‘’ .ENDC“”•30$: ;REF LABEL–—˜ .IF DF P$$LAS™:š MOV T.RRFL(R0),@T.RRFL+2(R1) ;LINK ENTRIES TO PROTO TCB!› BEQ 40$ ;IF EQ THERE ARE NONEI9œ MOV T.RRFL+2(R0),T.RRFL+2(R1) ;FIX UP LAST IN LIST PTR �ž .ENDCŸ9 40$: MOV T.ATT(R0),@T.ATT+2(R1) ;MOVE ADBS (FROM SREFS)S"¡ BEQ 41$ ;IF EQ THERE WERE NONE9¢ MOV T.ATT(R0),T.ATT+2(R1) ;UPDATE LAST IN LIST POINTER 5£ MOV T.ATT(R0),R4 ;GET ADDRESS OF FIRST ADB IN LISTV5¤412$: CMP #120000,R1 ;PROTOTYPE IN SECONDARY POOL ?¥ BLOS 413$ ;IF LOS YES +¦ MOV R1,A.TCB-A.TCBL(R4) ;SET TCB ADDRESS"§ BR 414$ ;FINISH LOOP IN COMMON=¨413$: BISB #AS.PRO,A.STAT-A.TCBL(R4) ;INDICATE SEC POOL TCBV0© MOV KISAR6,A.TCB-A.TCBL(R4) ;AND FILL IN BIAS'ª414$: MOV (R4),R4 ;POINT TO NEXT ADB) « BNE 412$ ;IF NE THERE IS ONE<¬41$: MOV T.TCBL(R0),T.TCBL(R1) ;UNLINK TASK FROM TASK LIST­ MOV R0,R4 ;SAVE PCB ADDRESSN)® MOV T.PCBV(R0),R0 ;POINT TO PCB VECTORI ¯ BEQ 50$ 00RØhhzgM{güfàýfáþfDATA;IF EQ THERE IS NONE-° MOV 2(R0),R1 ;POINT TO FIRST PCB IN VECTOR ± TST P.NAM(R1) ;NAMED PCB?² BNE 45$ ;IF NE YES/³ CMP P.OWN(R1),R4 ;IS THIS TCB USED FOR NAME?´ BNE 45$ ;IF NE NOA/µ MOV $TSKHD,R2 ;POINT TO FIRST INSTALLED TASKR=¶43$: CMP T.PCBV(R2),R0 ;DOES THIS TASK USE THE PCBV VECTOR?N· BEQ 44$ ;IF EQ YES2¸ MOV T.TCBL(R2),R2 ;POINT TO NEXT INSTALLED TASK)¹ TST T.TCBL(R2) ;POINTING TO NULL TASK?Rº BNE 43$ ;IF NE NON$» CLR R2 ;POINT P.OWN TO 0 FOR NOW$¼44$: MOV R2,P.OWN(R1) ;RESET P.OWN1½45$: DECB 1(R0) ;REDUCE ACCESS COUNT IN VECTOR3¾ BNE 50$ ;IF NE THERE ARE STILL OTHERS INSTALLED1¿ MOV (R0),R1 ;ELSE PICK UP NUMBER OF PCB WORDS*À MOV 2(R0),R5 ;SAVE ADDRESS OF FIRST PCB$Á INC R1 ;INCREMENT FOR FIRST WORD* ASL R1 ;CONVERT TO BYTES TO DEALLOCATE&à CALL $DEACB ;DEALLOCATE PCB VECTOR+Ä MOV R5,R0 ;RESTORE ADDRESS OF FIRST PCB(Å TST P.NAM(R0) ;RO SECTION OF MU TASK?Æ BNE 50$ ;IF NE NON(Ç CALL $DELRG ;DELETE READ ONLY REGION&È50$: MOV R4,R0 ;RESTORE TCB ADDRESS)É MOV #T.LGTH,R1 ;SET SIZE TO DEALLOCATEO Ê CALLR $DEACB ;DEALLOCATE TCBËÌ Í .DSABL LSBÎÏ;+CÐ; **-$CLSRF-CLEAR TASK TCB ADDRESS IN ALL RECEIVE BY REF PACKETS.SÑ;F?Ò; THIS ROUTINE WILL SEARCH THE ACTIVE TASK LIST FOR TCBS WITHRDÓ; RECEIVE BY REFERENCE PACKETS WHICH CONTAIN A POINTER TO THE TASK=Ô; BEING REMOVED. IF SUCH A POINTER IS FOUND IT IS CLEARED.SÕ;N Ö; INPUTS:×;E)Ø; R0=TCB ADDRESS OF TASK TO BE REMOVED.EÙ;L Ú; OUTPUTS:Û;V Ü; NONE.SÝ;TÞ;-ßà$CLSRF:: ;REFERENCE SYMBOLáâã .IF DF P$$LASä&å MOV $TSKHD,R1 ;GET FIRST TCB IN ATL.æ10$: TSTB T.SRCT(R0) ;ANY OUTSTANDING SREFS?ç BEQ 40$ ;IF EQ NOP%è MOV T.TCBL(R1),-(SP) ;END OF LIST?Eé BEQ 30$ ;IF EQ YES5ê ADD #T.RRFL,R1 ;POINT TO RECEIVE BY REFERENCE LISTH/ë20$: MOV (R1),R1 ;GET NEXT REC BY REF PACKET.ì BEQ 30$ ;IF EQ END OF LIST5í CMP 2(R1),R0 ;DOES IT POINT TO TASK BEING REMOVED?Eî BNE 20$ ;IF NE NOD4ï DECB T.SRCT(R0) ;DECREMENT OUTSTANDING SREF COUNT-ð CLR 2(R1) ;CLEAR POINTER TO EXITTING TASK.ñò .IF DF G$$GEFó)ô MOV R0,-(SP) ;SAVE TCB OF EXITING TASK $õ MOV R1,-(SP) ;SAVE PACKET ADDRESS,ö MOV 6(R1),R3 ;GET EVENT FLAG MASK ADDRESS)÷ CALL $DEAGF ;DEACCESS IF GROUP GLOBALA'ø MOV (SP)+,R1 ;RESTORE PACKET ADDRESSN,ù MOV (SP)+,R0 ;RESTORE TCB OF EXITING TASKúû .ENDC ; DF G$$GEFü5ý MOV T.NAM(R0),4(R1) ;STORE FIRST HALF OF TASK NAMEB)þ MOV T.NAM+2(R0),6(R1) ;AND SECOND HALFDÿ BR 20$ ;GO AGAIN430$: MOV (SP)+,R1 ;GET ADDRESS OF NEXT TCB IN LIST BNE 10$ ;IF NE GO AGAIN. .IFTF40$: RETURN ;V .ENDC   ;+I ; **-$DRTHR/$ERTHR-DIRECTIVE ERROR AND GENERAL ERROR THREADING ROUTINES ;LC; THESE ROUTINES ARE USED IN CONJUNCTION WITH THE FOLLOWING ERROR E; RECOVERY ROUTINE TO DYNAMICALLY THREAD ERROR RECOVERY INFORMATIONDA; ONTO THE STACK. AFTER INITIALIZATION, THE INTERFACE IS VIA ABC; COROUTINE CALL (CALL @(SP)+) FOLLOWED BY TWO ROUTINE ADDRESSES.F; THE FIRST ROUTINE IS CALLED AND THEN THE SECOND ROUTINE ADDRESS ISF; PUSHED ONTO THE STACK ALONG WITH THE CONTENTS OF R0 AND R1. IT ISF; INTENDED THAT THE SECOND ROUTINE, ALONG WITH THE SAVED CONTENTS OFC; R0 AND R1, CAN UNDO THE ACTION OF THE FIRST ROUTINE IF AN ERROR J; CONDITION IS ENCOUNTERED LATER. ANOTHER POSSIBILITY IS THAT THE FIRSTJ; ROUTINE IS NULL, AND THE SECOND ROUTINE CAN UNDO SOME PREVIOUS ACTION.G; $DRTHR MAY BE CALLED WHEN THE FINAL DESIRED ACTION ON ERROR WILL BEJ; TO RETURN A DIRECTIVE STATUS PASSED IN R5 (IN THE FORM 'DRSTS D.RSX').J; $ERTHR IS A GENERAL ERROR RECOVERY THREADING ROUTINE. EXAMPLE USES OF4; THESE ROUTINES MAY BE FOUND IN THE MODULE DRSPW.;T ; INPUTS:A;,*; AS REQUIRED FOR CALL TO FIRST ROUTINE. ;R !; OUTPUTS:"; ?#; C-BIT AND R0-R3 ARE PRESERVED FROM RETURN OF FIRST ROUTINE. $; R4 IS DESTROYED.%;-&'( .IF DF P$$OFF) * .ENABL LSB)+$DRTHR::MOV (SP),R4 ;PICK UP RETURN PCE9, MOV #10$,(SP) ;SET AD00Ràh%hg´cÚµcÛ¶c�·c›’DRESS OF ROUTINE TO RETURN STATUSS0- CMP -(SP),-(SP) ;ALLOCATE WORDS FOR R0 AND R1*. MOV R4,-(SP) ;RESTORE RETURN PC ADDRESS/01 .IF DF K$$DAS2*3$ERTHR::MOV PS,R2 ;SAVE CURRENT PS WORD-4 BIC #PMODE,PS ;SET PREVIOUS MODE TO KERNEL 5 MOV (SP)+,R4 ;POP CALLING PC*6 MFPI (R4)+ ;PUSH FIRST ROUTINE ADDRESS-7 MFPI (R4)+ ;PUSH RECOVERY ROUTINE ADDRESS48 MOV R2,PS ;RESTORE PS WORD#9 CALL @2(SP) ;CALL FIRST ROUTINE;: MOV (SP)+,(SP) ;MOVE RECOVERY ROUTINE ADDRESS INTO PLACEE;< .IFFR=)>$ERTHR::MOV (SP),R4 ;PICK UP RETURN PCL/? CALL @(R4)+ ;CALL THE FIRST ROUTINE ADDRESSO4@ MOV (R4)+,(SP) ;SAVE THE RECOVERY ROUTINE ADDRESSAB .ENDCCD,E MOV R1,-(SP) ;SAVE CURRENT CONTENTS OF R1,F MOV R0,-(SP) ;SAVE CURRENT CONTENTS OF R0#G CALL (R4) ;CALL THE CALLER BACKRH BR $ERTHR ;DO IT AGAIN;I10$: MOV R5,-(SP) ;PUSH DIRECTIVE STATUS TRAP INSTRUCTION J JMP (SP) ;EXECUTE TRAP K .DSABL LSBLM;+$N; **-$ERREC-ERROR RECOVERY ROUTINEO; BP; THIS ROUTINE IS USED IN CONJUNCTION WITH THE ABOVE ROUTINES TOEQ; EFFECT A SERIES OF SUBROUTINE CALLS STORED ON THE STACK FOR ERRORSER; RECOVERY. THE NORMAL CALLING SEQUENCE IS VIA A JUMP. SUCCESSIVE BS; R0 AND R1 CONTENTS ARE POPPED FROM THE STACK WITH CALLS TO THEFT; SAVED ROUTINE ADDRESSES. THE LAST ROUTINE ON THE STACK MUST FORCEU; THE PROCESS TO STOP.V;E W; INPUTS:TX;N3Y; R5=DIRECTIVE STATUS (IF INITIALIZED BY $DRTHR).Z; [; OUTPUTS:\;- ]; NONE.E^;-_+`$ERREC::TST (SP)+ ;POP COROUTINE ADDRESSO%a10$: MOV (SP)+,R0 ;PICK UP SAVED R0T!b MOV (SP)+,R1 ;PICK UP SAVED R1D*c CALL @(SP)+ ;CALL THE RECOVERY ROUTINE d BR 10$ ;ef;+$g; **-$QUEXT-QUEUE EXIT "AST" BLOCKh; Ci; THIS ROUTINE FILLS IN THE STATUS IN AN OFFSPRING CONTROL BLOCK,N@j; AND QUEUES IT AS A SPECIAL AST BLOCK TO THE PARENT TASK TCB.k; l; INPUTS:Em; n; R0=EXIT STATUS WORD.o; R1=OCB ADDRESS.Tp; R2=TKTN ABORT CODE (BYTE) q;T r; OUTPUTS:s;Et; R3 IS PRESERVED.u;-vw .IFTFx,y$QUEXT:: ;UNCONDITIONALLY DEFINE FOR MCRz{ .IFT(| } MOV R2,-(SP) ;SAVE ABORT CODE~. .IF DF N$$DIR ;IF NAMED DIRECTORY SUPPORT€!� MOV R1,-(SP) ;SAVE OCB ADDRESSO2‚ MOV O.STAT+10(R1),R1 ;GET CONTEXT BLOCK POINTERƒ BEQ 5$ ;IF EQ, NONEN%„ CALL $DLCTX ;DELETE CONTEXT BLOCKO'…5$: MOV (SP)+,R1 ;RESTORE OCB POINTERU†‡ .ENDC ;DF N$$DIRTˆ0‰ MOV O.PTCB(R1),R2 ;PICK UP PARENT TCB ADDRESS%Š BEQ 30$ ;IF EQ PARENT HAS EXITTED*‹ DEC T.RDCT(R2) ;DECREMENT RUNDOWN COUNT5Œ MOV T.ASTL(R2),(R1) ;LINK OCB TO FRONT OF AST LISTF � BNE 10$ ;RŽ MOV R1,T.ASTL+2(R2) ;�10$: MOV R1,T.ASTL(R2) ;3� MOV #AK.OCB,A.CBL(R1) ;SET EXIT "AST" BLOCK FLAG %‘ MOV R0,O.STAT(R1) ;SET EXIT STATUSC0’ MOV (SP)+,O.STAT+2(R1) ;PUT ABORT CODE IN OCB&“ MOV R2,R0 ;COPY PARENT TCB POINTER”•;+–; ** W A R N I N G **E—;˜; SPM HOOKPOINT NUMBER 09.™;O+š; DO NOT CHANGE THE INSTRUCTION FOLLOWINGB›; LABEL WITHOUT CHECKING SPMœ;-�-ž$SPH09==. ;SPM CHANGES THE INSTRUCTION ATA!Ÿ ;THE LOCATION OF THIS LABELA ¡¢2£ CALL @#$SETCR ;SET CONDITIONAL SCHEDULE REQUEST(¤ MOV T.PCB(R0),R0 ;POINT TO PARENT PCB3¥ CALLR $NXTSK ;REALLOCATE (AST ENTRY CAN UNSTOP) 1¦30$: MOV R1,R0 ;COPY OCB POINTER TO DEALLOCATEC'§ TST (SP)+ ;CLEAN STACK (ABORT CODE)B+¨ MOV #O.LGTH,R1 ;SET LENGTH TO DEALLOCATE © CALLR $DEACB ;DEALLOCATE OCBª« .ENDC¬­®;+¯; **-$STPCT-STOP CURRENT TASKE°; **-$STPTK-STOP TASK±;F²; THESE ROUTINES ARE CALLED TO STOP A TASK AND REALLOCATE THE TASK'S³; PARTITION.´; µ; INPUTS:#¶;R7·; R0=TCB ADDRESS OF TASK TO STOP (IF ENTRY AT $STPTK)P¸;T ¹; OUTPUTS:º;L»; NONE¼;-½<¾$STPCT::MOV $TKTCB,R0 ;PICK UP ADDRESS OF CURRENT TASK TCB;¿$STPTK::BIS #T2.STP,T.ST2(R0) ;SET STOP BIT IN TASK'S TCBÀÁ .IF DF M$$PROÃ:Ä BIT #TS.RUN,T.STAT(R0) ;TASK RUNNING ON SOME PROCESSOR?Å BEQ 10$ ;IF EQ NO$ÆÇ .IFFRÈÉ CMP R0,$TKTCB ;TASK RUNNING?Ê BNE 10$ ;IF 00RèhhzgM{güfàýfáþfDATANE NOSËÌ .ENDCÍÎ+Ï CALL $SETCR ;INSURE THAT TASK WILL STOP.*Ð10$: MOV T.PCB(R0),R0 ;POINT TO TASK PCB(Ñ BR $NXTSK ;REALLOCATE TASK PARTITIONÒÓ;+&Ô; **-$RLCPS-RELEASE CHECKPOINT SPACEÕ;:GÖ; THIS ROUTINE RELEASES SPACE IN A CHECKPOINT FILE. IF THE SPECIFIED,A×; REGION IS TO BE DELETED, IT ALSO DELETES ANY DISK PCB AND THEØ; REGION PCB ITSELF.Ù;T Ú; INPUTS:NÛ; 3Ü; R0=REGION PCB FOR WHICH SPACE IS TO BE DELETED.Ý;P Þ; OUTPUTS:ß;N à; NONE.Bá;-â!ã$RLCPS::SAVNR ;SAVE R4 AND R5Cä MOV R0,R4 ;COPY PCB POINTERL.å MOV P.DPCB(R4),R1 ;POINT TO REGION DISK PCB æ BEQ 25$ ;IF EQ THERE IS NONE/ç CMP R1,P.MAIN(R1) ;IS THIS A CHECKPOINT PCB?Pè BEQ 25$ ;IF EQ NOH-é CALL $RLPR1 ;RELEASE THE CHECKPOINT SPACE !ê MOV R4,-(SP) ;SAVE PCB ADDRESSO8ë MOV P.DPCB(R4),R4 ;POINT TO CHECKPOINT ALLOCATION PCB2ì MOV P.MAIN(R4),R4 ;POINT TO CHECKPOINT FILE PCB/í TST P.REL(R4) ;CHECKPOINT FILE STILL IN USE?Pî BEQ 10$ ;IF EQ YES(ï TST P.SUB(R4) ;CHECKPOINT FILE EMPTY?ð BNE 10$ ;IF NE NO,ñ MOV #20,R0 ;SET TKTN CODEP%ò MOV P.UCB(R4),R5 ;PASS UCB ADDRESS&ó CALL $DVMSG ;QUEUE MESSAGE TO TKTN/ô10$: MOV (SP)+,R4 ;RESTORE REGION PCB ADDRESSQ'õ MOV P.DPCB(R4),R0 ;POINT TO DISK PCBE1ö20$: CLR P.DPCB(R4) ;CLEAR OUT DISK PCB POINTERD+÷ MOV #P.DLGH,R1 ;SET LENGTH TO DEALLOCATEO$ø CALL $DEACB ;DEALLOCATE DISK PCB;ù25$: BIT #PS.DEL,P.STAT(R4) ;IS REGION MARKED FOR DELETE?Tú BEQ 30$ ;IF EQ NO(û TST P.ATT(R4) ;ANYONE STILL ATTACHED?ü BNE 30$ ;IF NE YES'ý MOV P.DPCB(R4),R0 ;POINT TO DISK PCB þ BNE 20$ ;IF NE THERE IS ONEP2ÿ MOV R4,R0 ;COPY MAIN PCB POINTER TO DEALLOCATE+ MOV #P.LGTH,R1 ;SET LENGTH TO DEALLOCATE  CALL $DEACB ;DEALLOCATE PCBO30$: RETURN ;;+$; **-$RLPAR-RELEASE TASK PARTITION; **-$RLPR1-RELEASE PARTITIONO;LJ; THIS ROUTINE IS CALLED TO RELEASE SPACE IN A PARTITION OWNED BY A TASKD ; AND TO ATTEMPT TO REALLOCATE THE PARTITION IF THE WAIT QUEUE FOR ; THE PARTITION IS NONEMPTY. ;$ ; INPUTS: ;V@; R0=ADDRESS OF THE TCB OF THE OWNER TASK (IF ENTRY AT $RLPAR)?; R1=ADDR OF SUBPARTITION PCB TO RELEASE (IF ENTRY AT $RLPR1).;R ; OUTPUTS:;AB; THE SPACE IS RELEASED AND AN ATTEMPT IS MADE TO REASSIGN SPACE?; IN THE PARTITION TO THE NEXT HIGHEST PRIORITY CONTENDER(S). ;-8$RLPAR::MOV T.PCB(R0),R1 ;GET ADDRESS OF PARTITION PCB1$RLPR1::MOV P.MAIN(R1),R0 ;GET MAIN PCB ADDRESSL' MOV R0,R3 ;SAVE POINTER TO MAIN PCBR/10$: MOV R0,R2 ;SAVE ADDRESS OF PREVIOUS PCBS, MOV P.SUB(R2),R0 ;GET ADDRESS OF NEXT PCB CMP R0,R1 ;TASK PCB? BNE 10$ ;IF NE NOA0 MOV P.SUB(R0),P.SUB(R2) ;REMOVE PCB FROM LIST. TST P.MAIN(R3) ;RELEASING CHECKPOINT SPACE? ! BNE 20$ ;IF NE NOE " RETURNE#20$:$;+%; ** W A R N I N G **E&;I'; SPM HOOKPOINT NUMBER 15.(;R+); DO NOT CHANGE THE INSTRUCTION FOLLOWINGI*; LABEL WITHOUT CHECKING SPM+;-,--$SPH15==. ;SPM CHANGES THE INSTRUCTION ATO!. ;THE LOCATION OF THIS LABEL /0"1 NOP ;DROP THROUGH TO $NXTSK TO'2 NOP ; REALLOCATE RELEASED PARTITION 3456;++7; **-$NXTSK-ASSIGN NEXT TASK TO PARTITION;8;EH9; THIS ROUTINE IS CALLED TO ASSIGN SPACE IN A PARTITION TO THE HIGHEST8:; PRIORITY CONTENDERS WAITING TO OCCUPY THE PARTITION.;;G <; INPUTS:=; B>; R0=ADDRESS OF THE PCB OF THE MAIN PARTITION, OR A SUBPARTITION<?; PCB WITHIN THE MAIN PARTITION IN WHICH TO ASSIGN SPACE.@;C A; OUTPUTS:B;IBC; THIS ROUTINE ATTEMPTS TO ASSIGN SPACE IN THE MAIN PARTITION IN%D; AS MANY AS FOUR STEPS AS FOLLOWS:EE;ACF; 1. IT FIRST DETERMINES IF THERE ARE ANY ELIGIBLE CONTENDERSA<G; IN THE PARTITION WAIT QUEUE. THE ONLY CONTENDERS WHICH=H; CAN BE IN THE WAIT QUEUE WHICH ARE NOT ELIGIBLE ARE TASKO<I; PARTITIONS WHICH ARE NOT MAPPED BY OTHER RESIDENT TASKS<J; AND FOR WHICH THE CORRESPONDING TASK IS STOPPED WITH NOK; PENDING AST QUEUE ENTRIES.CL;A<M; 2. IF THERE IS AN ELIGIBLE CONTENDER FOR MEMORY, THE;N; ROUTINE A00Rðh%hg´cÚµcÛ¶c�·c›’TTEMPTS TO ASSIGN SPACE TO THE CONTENDER FROMF#O; SPACE WHICH IS CURRENTLY FREE. P; AQ; 3. IF THERE IS CURRENTLY INSUFFICIENT FREE SPACE TO BRING 5R; IN THE CONTENDER, AN ATTEMPT IS MADE TO CREATE AC8S; CONTIGUOUS FREE SPACE LARGE ENOUGH BY CHECKPOINTING;T; ONE OR MORE OF THE CURRENT RESIDENTS OF THE PARTITION.<U; (NOTE THAT DURING THIS STEP THE DECISION MAY BE MADE TO<V; CHECKPOINT A REGION FOR WHICH CHECKPOINTING HAS ALREADY<W; BEEN INITIATED. THIS IS ACCEPTABLE SINCE AN ATTEMPT TO:X; INITIATE CHECKPOINTING A SECOND TIME IS EFFECTIVELY A Y; NOP.)Z;B[; 4. IF SUFFICIENT SPACE CANNOT BE CREATED BY CHECKPOINTING,\; THE SHUFFLER IS ACTIVATED.T];-^ _$NXTSK::`a .IF DF R$$PROb;c TST $NXTLK ;NXTSK LOCK SET? (NEEDED TO MAINTAIN CONTEXT d ;DURING CHECKPOINTS)!e BEQ 5$ ;IF EQ NO, OK TO ENTERIf RETURN ;LEAVE NOWg5$: hi .ENDC ;R$$PROjk SAVNR ;SAVE R4 AND R54l MOV P.MAIN(R0),R5 ;GET MAIN PARTITION PCB ADDRESS4m10$: MOV P.WAIT(R5),R4 ;GET FIRST PCB IN WAIT LIST#n20$: BEQ 100$ ;IF EQ END OF LIST8o TSTB P.RMCT(R4) ;ARE THERE ANY RESIDENT MAPPED TASKS?+p BNE 40$ ;IF NE YES, ATTEMPT TO BRING IND:q MOV P.TCB(R4),R0 ;GET TCB ADDR (TASK PART. IF P.RMCT=0)8r BIT #TS.STP,T.STAT(R0) ;TASK BLOCKED BY BLOCK COMMANDs BNE 30$ ;IF NE YES, SKIP IT 't BIT #T2.STP,T.ST2(R0) ;TASK STOPPED?Au BEQ 40$ ;IF EQ NO..v TST T.ASTL(R0) ;BUT ARE THERE PENDING ASTS?w BNE 40$ ;IF NE YES3x30$: MOV (R4),R4 ;POINT TO NEXT PCB IN WAIT LIST;y BR 20$ ;GO AGAIN:z40$: BIT #PS.CSA,P.STAT(R4) ;CHECKPOINT SPACE ALLOCATED?&{ BNE 100$ ;IF NE, YES - JUST RETURN8| CALL $FNDSP ;ATTEMPT TO ALLOCATE SPACE IN MAIN PART./} BCS 50$ ;IF CS NO SPACE CURRENTLY AVAILABLE$~ MOV R5,R0 ;COPY MAIN PCB ADDRESS/ ADD #P.WAIT,R0 ;POINT TO WAIT QUEUE LISTHEADI,€ MOV R4,R1 ;COPY ADDRESS OF PCB TO REMOVE�‚ .IF DF R$$PROƒ*„ MOV P.REL(R4),$NXTBA ;SET BASE TO BIAS>… ADD P.SIZE(R4),$NXTBA ;FOLLOWING LAST SUCCESSFUL ALLOCATION†‡ .ENDCˆ5ˆ CALL $QRMVA ;REMOVE PCB FROM WAIT QUEUE ;JWB167K1Š CALL $LOADT ;PLACE IT IN LOADER QUEUE ;**-1J‹,Œ TALLY$ B.RLOD,XA$$TL ;COUNT A REGION LOAD�Ž BR 10$ ;TRY TO LOAD ANOTHERS�;PK�; ATTEMPT TO CREATE A CONTIGUOUS FREE SPACE LARGE ENOUGH BY CHECKPOINTINGTI‘; ONE OR MORE TASKS/COMMONS. ON P/OS, START LOOKING FOR THIS CONTIGUOUSEL’; FREE SPACE FOLLOWING THE LAST SUCCESSFUL LOAD. THIS AVOIDS THE THRASHINGH“; STATE WHEREBY A TASK IS MAPPING AND UNMAPPING FROM VARIOUS CLUSTEREDL”; LIBRARIES WHICH CHECKPOINT EACH OTHER AS A CONSEQUENCE OF HAVING NO FREE=•; SPACE DUE TO A RESIDENT UNMAPPED COMMON(S) HIGHER IN GEN. –;T—˜50$:™š .IF DF R$$PRO›&œ TST $NXTLK ;JUST STARTING TO LOOK?7� BNE 53$ ;IF NE NO, WRAP BACK TO BOTTOM OF PARTITIONT6ž INC $NXTLK ;LOCK $NXTSK TO PREVENT LOSS OF CONTEXT'Ÿ ;VIA RECURSIVE CALL OUT OF $ICHKPO+  MOV P.SUB(R5),R1 ;GET FIRST SUBPARTITIONE¡ MOV R1,R5 ;SET UP PREVIOUS8¢52$: CMP P.REL(R1),$NXTBA ;ABOVE LAST SUCCESSFUL LOAD?£ BHIS 65$ ;IF HIS YES¤ MOV R1,R5 ;UPDATE PREVIOUS/¥ MOV P.SUB(R1),R1 ;POINT TO NEXT SUBPARTITIONP¦ BNE 52$ ;TRY AGIAN4§53$: INC $NXTLK ;INDICATE FULL BOTTOM TO TOP PASS0¨ MOV P.MAIN(R4),R5 ;SET UP POINTER TO MAIN PCB©ª .ENDC ;R$$PRO«&¬ CLR R3 ;INIT BASE OF HOLE REGISTER4­ MOV R5,R1 ;COPY MAIN PCB PTR LEAVING PTR TO PREV/®55$: ADD P.REL(R5),R3 ;CALCULATE BASE OF HOLER7¯60$: MOV P.SUB(R1),R1 ;POINT TO NEXT SUBPARTITION PCBC.° BEQ 110$ ;IF EQ NONE, FAILED TO CHECKPOINT0±65$: CALL $TSTCP ;CAN WAITING PCB CHECKPOINT?² BCC 70$ ;IF CC YES-³ MOV R1,R5 ;UPDATE POINTER TO PREVIOUS PCB 0´ MOV P.SIZE(R5),R3 ;INIT BASE OF HOLE REGISTERµ BR 55$ ;TRY AGAINP'¶70$: CLR R0 ;INITIALIZE SIZE OF HOLE1· MOV P.SUB(R1),R2 ;POINT TO NEXT PCB AFTER HOLEH¸ BNE 80$ ;IF NE THERE IS ONE ,¹ MOV P.MAIN(R1),R2 ;ELSE POINT TO MAIN PCB0º ADD P.SIZE(R2),R0 ;CALCULATE END OF PARTITION9»80$: ADD P.REL(R2),R0 ;CALCULATE ADDRESS OF TOP OF HOLE;%¼ SUB00RøhhzgM{güfàýfáþfDATA R3,R0 ;CALCULATE SIZE OF HOLE:-½ CMP R0,P.SIZE(R4) ;IS THE HOLE BIG ENOUGH?B¾ BLO 60$ ;IF LO NOM>¿ BIS #PS.CSA,P.STAT(R4) ;INDICATE CHECKPOINT SPACE ALLOCATED'À MOV R4,-(SP) ;SAVE PCB IN WAIT QUEUE;*Á MOV R1,R4 ;MARK LAST PCB TO CHECKPOINT8Â90$: MOV P.SUB(R5),R5 ;POINT TO NEXT PCB TO CHECKPOINTà MOV R5,R1 ;COPY ITS ADDRESSN$Ä CALL $ICHKP ;INITIATE CHECKPOINT"Å CMP R5,R4 ;MORE TO CHECKPOINT?Æ BNE 90$ ;IF NE YES,Ç MOV (SP)+,R4 ;RESTORE PCB OF WAITING TASK6È BIC #PS.CSA,P.STAT(R4) ;INDICATE CHECKPOINT IS DONEÉ100$:,ÊË .IF DF R$$PROÌ!Í CLR $NXTLK ;CLEAR $NXTSK LOCKÎÏ .ENDC ;R$$PROÐ Ñ RETURN ;PÒÓ110$:LÔÕ .IF DF R$$PROÖ6× CMP $NXTLK,#1 ;WRAP BACK TO BEGINNING OF PARTITION?Ø BNE 100$ ;IF NE NO Ù BR 53$ ;ÚÛ .ENDCÜ1Ý MOV $SHFPT,R0 ;PICK UP ADDRESS OF SHUFFLER TCBC*Þ BEQ 100$ ;IF EQ SHUFFLER NOT INSTALLED,ß TST $SHFTM ;CAN WE REQUEST THE SHUFFER ?-à BNE 100$ ;NO, WAIT FOR NEXT TIME INTERVALK9á BIT #TS.EXE,T.STAT(R0) ;YES, SHUFFLER ALREADY ACTIVE ?â BEQ 100$ ;IF EQ, YES, EXITãäå .IF DF A$$CNTæ)ç MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING è MOV $SABPT,KISAR6 ;MAP SABD*é BEQ 130$ ;IF EQ, ACCOUNTING NOT ACTIVE4ê BIT #BF.LSS,$ACNFE ;SYSTEM ACCOUNTING TURNED ON ?ë BEQ 130$ ;NO, IF EQ.0ì ADD #1,@#B.SHF+140002 ;COUNT SHUFFLER STARTUPí ADC @#B.SHF+140000 ;H)î130$: MOV (SP)+,KISAR6 ;RESTORE MAPPINGEïð .ENDCñò1ó CALLR $EXRQN ;REQUEST THE SHUFFLER AND RETURNôõö;+:÷;**-$TSPAR-TEST IF PARTITION IS IN MEMORY FOR KERNEL ASTø;YBù; THIS ROUTINE IS CALLED TO CHECK A REGION FOR MEMEORY RESIDENCEAú; TO DETERMINE IF IT IS SAFE TO SERVICE A KERNEL AST (E.G. COPY,?û; A BUFFER) INTO THE REGION. IF THE REGION IS CHECKPOINTED ORTBü; CURRENTLY BEING CHECKPOINTED, THEN A REGION LOAD AST IS QUEUED3ý; AND THE REGION IS ACCESSED ON THE TASKS BEHALF. þ;S ÿ; INPUTS:E(; R0=ADDRESS OF PACKET PEING PROCESSED; R1=PCB ADDRESS OF REGION%; R5=TCB ADDRESS OF ASSOCIATED TASKT;T ; OUTPUTS:$; C=0 IF REGION IS MEMORY RESIDENT>; C=1 IF REGION IS NON-RESIDENT. IN THIS CASE THE REGION AST; HAS BEEN QUEUED, ETC.A;- + $TSPAR::CLC ;ASSUME REGION IS IN MEMORYN4  BIT #PS.CKP!PS.OUT,P.STAT(R1) ;REGION IN MEMORY ?  BNE 10$ ;IF NE NOI  RETURN ;G310$: BIT #PS.AST,P.STAT(R1) ;ALREADY A LOAD AST ?D BNE 20$ ;IF NE YES3 BIS #PS.AST,P.STAT(R1) ;INDICATE LOAD AST QUEUEDO, CLR P.SWSZ(R1) ;USE P.SWSZ FOR A LISTHEAD720$: MOV P.SWSZ(R1),(R0) ;LINK NEXT BLOCK TO THIS ONE=4 MOV R0,P.SWSZ(R1) ;AND SET THIS ONE FIRST IN LIST! MOV R0,-(SP) ;SAVE TCB ADDRESSN MOV R5,R0 ;COPY TCB ADDRESSC" CALL $ACCRG ;ACCESS THE REGION' MOV (SP)+,R0 ;RESTORE PACKET ADDRESS. SEC ;INDICATE AST QUEUEDY  RETURN ; ;+; **-$ACCRG-ACCESS REGION##; **-$ALTRG-ALTER REGION PRIORITY ;C; EFFECT THE ACCESS OF A NEW RESIDENT MAPPED TASK TO A REGION ANDE0 ; OPTIONALLY ALTER THE PRIORITY OF THE REGION.!;0 "; INPUTS:(#;R+$; R0=TCB ADDRESS OF RESIDENT MAPPED TASK..%; R1=PCB ADDRESS OF REGION.T&;I '; OUTPUTS:(; ); NONE.D*;-+ , .ENABL LSBP7-$ACCRG::MOV T.PCB(R0),R2 ;PICK UP TASK REGION PCB PTRV%. CMP R1,R2 ;ACCESSING TASK REGION?S-/ BEQ 4$ ;IF EQ YES, DON'T INCREMENT P.RMCT012 .IF DF M$$PRO3?4 BIS P.RRM(R1),T.RRM(R0) ;INCLUDE REGION AFFINITY IN TASK AFFA56 .ENDC78/9 BIT #PS.OUT,P.STAT(R2) ;TASK OUT OF MEMORY ?T': BNE 3$ ;IF NE YES, OK TO INC P.RMCT /; BIT #PS.CKP,P.STAT(R2) ;BEING CHECKPOINTED ?P*< BNE 43$ ;IF NE YES, DON'T TOUCH P.RMCT5=3$: INCB P.RMCT(R1) ;INC RESIDENT MAPPED TASK COUNTB?>4$: BIT #PS.CKP,P.STAT(R2) ;IS THIS A CHECKPOINT READ ACCESS?/? BNE $ALTRG ;IF NE YES, SKIP BLOCKING CHECKS @43$: ;REFERENCE LABEL6A BIT #PS.OUT!PS.CKP,P.STAT(R1) ;IS REGION IN MEMORY?B BEQ 5$ ;IF EQ YESI%C INC T.STAT(R0) ;BLOCK MAPPING TASK D BR 6$ ;T<E5$: BIT #PS.CKR,P.STAT(R1) ;IS THERE A CHECKPOINT REQUEST?F BEQ 6$ ;IF EQ NO-G BIS #TS00Ri%hg´cÚµcÛ¶c�·c›’.CIP,T.STAT(R0) ;BLOCK MAPPING TASK "H6$: MOV R1,R2 ;SAVE PCB ADDRESSIJK .IF DF M$$PROL<M BIT #TS.RUN,T.STAT(R0) ;IS THE TASK RUNNING ON SOME PROC?N BEQ 7$ ;NO IF EQOP .IFFEQ+R CMP R0,$TKTCB ;IS THIS THE CURRENT TASK?ES BNE 7$ ;NO IF NETU .ENDCVW2X CALL $SETCR ;SET SCHEDULE REQUEST TO STOP TASK%Y7$: MOV R2,R1 ;RESTORE PCB ADDRESSO2Z$ALTRG::MOVB T.PRI(R0),R2 ;PICK UP TASK PRIORITY/[ CMP R1,T.PCB(R0) ;ALTERING TASKS OWN REGION?6\ BNE 10$ ;IF NE NOS6] TSTB P.RMCT(R1) ;OTHER TASKS MAPPED TO TASK REGION?^ BEQ 15$ ;IF EQ NO_;.<`; THIS SECTION INSURES THAT THE PRIORITY OF A NON-RESIDENT9a; NON-MAPPED REGION STAYS AT ZERO WHEN ALTERED. THIS IS=b; NECESSARY TO INSURE THAT ZERO MAP COUNT COMMONS DON'T GETE=c; PUT IN THE PAR. WAIT QUEUE, AND TO INSURE THAT THE REGIONO>d; WILL GET LOADED WHEN IT IS MAPPED BY SOME TASKS. NOTE THAT<e; IF THE PRIORITY IS NOT ALTERED UPWARD, THE REGION IS NOT>f; LOADED. ALSO NOTE THAT THE NEXT TEST WILL NEVER BRANCH FOR5g; TASK REGIONS, SINCE WE JUST CHECKED P.RMCT ABOVE. h;Q8i10$: TSTB P.RMCT(R1) ;ANY TASK MAPPED TO THIS REGION ?,j BEQ 30$ ;IF EQ NO - DON'T TOUCH PRIORITY*k INCB R2 ;INCREMENT FOR COMMON PRIORITY-l CMPB R2,P.PRI(R1) ;IS NEW PRIORITY HIGHER?Em BLOS 30$ ;IF LOS NOT3n15$: MOVB R2,P.PRI(R1) ;STORE NEW REGION PRIORITYL:o$LDREG::BIT #PS.OUT,P.STAT(R1) ;IS THE REGION IN MEMORY?p BEQ 30$ ;IF EQ YES1q CMP R1,$LDPCB ;IS LOADER CURRENTLY LOADING IT?Hr BEQ 30$ ;IF EQ YES%s MOV $LDRPT,R0 ;POINT TO LOADER TCB 2t ADD #T.RCVL,R0 ;POINT TO LOADER'S RECEIVE QUEUE8t CALL $QRMVA ;SEE IF PCB IS IN LOADER QUEUE ;JWB167v BCS 20$ ;IF CS NO ;**-1!w CALL $QINSP ;ELSE PUT IT BACKO x BR 30$ ;y20$:z;+{; ** W A R N I N G **|;O}; SPM HOOKPOINT NUMBER 06.~;P+; DO NOT CHANGE THE INSTRUCTION FOLLOWINGG€; LABEL WITHOUT CHECKING SPM�;-‚-ƒ$SPH06==. ;SPM CHANGES THE INSTRUCTION ATP!„ ;THE LOCATION OF THIS LABELH…†'‡ MOV P.MAIN(R1),R0 ;POINT TO MAIN PCB /ˆ ADD #P.WAIT,R0 ;POINT TO WAIT QUEUE LISTHEADR‰@‰ CALL $QRMVA ;REMOVE FROM CURRENT POSITION (IF THERE) ;JWB1677‹ CALL $QINSP ;INSERT IN PARTITION WAIT QUEUE ;**-1E-Œ25$: MOV R1,R0 ;SET PCB ADDRESS FOR $NXTSK*� CALL $NXTSK ;REALLOCATE MAIN PARTITIONŽ30$: RETURN ;P��;+‘; **-$DEARG-DEACCESS REGIONW’;G“; THIS ROUTINE DEACCESSES A MAPPED TASK FROM A REGION AND REALLOCATESI>”; ITS MAIN PARTITION IF THE REGION HAS NO MORE MAPPED TASKS.•;M –; INPUTS:O—;O&˜; R0=TCB ADDRESS OF DEACCESSING TASK™; R1=PCB OF REGION TO DEACESS š;A ›; OUTPUTS:œ;E �; NONE. ž;-Ÿ9 $DEARG::TSTB T.IOC(R0) ;DOES TASK HAVE OUTSTANDING I/O? ¡ BEQ 35$ ;IF EQ NO00¢ BIS #T3.MPC,T.ST3(R0) ;SET MAPPING CHANGE BIT>£35$: BIT #PS.CKR,P.STAT(R1) ;CHECKPOINT REQUEST THIS REGION?¤ BEQ 40$ ;IF EQ NO7¥ BIC #PS.CKR,P.STAT(R1) ;CLEAR CHECKPOINT REQUEST BITG¦ MOV R1,-(SP) ;SAVE REGISTERSN§ MOV R0,-(SP) ;E/¨ CALL $ICHKP ;ATTEMPT TO INITIATE CHECKPOINTO"© MOV (SP)+,R0 ;RESTORE REGISTERSª MOV (SP)+,R1 ;P%«40$: CMP R1,T.PCB(R0) ;TASK REGION?P¬ BNE 45$ ;NO IF NE3­ TST @P.ATT(R1) ;OTHER ATTACHES TO TASK'S REGION?T%® BEQ 30$ ;IF EQ NO, SAVE SOME TIME4¯ INCB P.RMCT(R1) ;INSURE NO MODIFICATION OF P.RMCT:°45$: DECB P.RMCT(R1) ;DEC COUNT OF RESIDENT MAPPED TASKS)± BNE 30$ ;IF NE THERE ARE STILL OTHERSA(² CLRB P.PRI(R1) ;ASSUME IT IS A COMMON*³ BIT #PS.COM,P.STAT(R1) ;IS IT A COMMON?´ BEQ 47$ ;IF EQ NOA2µ BIT #PS.OUT,P.STAT(R1) ;REGION OUT OF MEMEORY ?-¶ BEQ 50$ ; IF EQ NO - REALLOCATE PARTITIONR)· MOV R0,-(SP) ;SAVE TCB ADDRESS OF TASK +¸ MOV R1,-(SP) ;SAVE PCB ADDRESS OF REGIONT4¹ MOV P.MAIN(R1),R0 ;POINT TO REGION MAIN PARTITION/º ADD #P.WAIT,R0 ;POINT TO WAIT QUEUE LISTHEAD.5º CALL $QRMVA ;REMOVE FROM QUEUE IF THERE ;JWB167P-¼ MOV (SP)+,R1 ;RESTORE PCB ADDRESS ;**-1H ½ MOV (SP)+,R0 ;AND TCB ADDRESS'¾ BCS 46$ ;IF CS WASN'T IN WAIT QUEUEI3¿ BIC #PS.CKR,P.STAT(R1) ;CLEAR CHECKPOINT REQUESTTÀ00RiRqmzgM{güfàýfáþfDATA46$: RETURN ; *Á47$: MOV P.TCB(R1),R0 ;POINT TO TASK TCB7 MOVB T.PRI(R0),P.PRI(R1) ;THEN SET TO TASK PRIORITYF#Ã50$: MOV R1,R0 ;COPY PCB ADDRESSR6Ä CALLR $NXTSK ;REALLOCATE MAIN PARTITION AND RETURN Å .DSABL LSBÆÇ;+$È; **-$FNDSP-FIND SPACE IN PCB LISTÉ;LGÊ; THIS ROUTINE IS CALLED TO FIND SPACE WITHIN A DYNAMICALLY ALLOCATEDEEË; PCB LIST REPRESENTING THE ALLOCATION STATE OF A SYSTEM CONTROLLEDI)Ì; PARTITION OR DYNAMIC CHECKPOINT FILE.PÍ;( Î; INPUTS:EÏ;N'Ð; R4=ADDRESS OF PCB TO FIND SPACE FORV9Ñ; R5=ADDRESS OF MAIN PCB FOR SPACE IN WHICH TO ALLOCATE1Ò;E Ó; OUTPUTS:Ô;R$Õ; C=0 IF ALLOCATION WAS SUCCESSFUL+Ö; SUB PCB IS LINKED INTO ALLOCATION LISTT×; C=1 IF ALLOCATION FAILUREØ;Ù; R0,R1,R2 ARE MODIFIED.Ú;-Û.Ü$FNDSP::MOV R5,R0 ;COPY ADDRESS OF MAIN PCB:Ý MOV P.REL(R5),R2 ;SET HIGHEST ADDRESS IN LAST PARTITION0Þ10$: MOV P.SUB(R0),R1 ;GET ADDRESS OF NEXT PCBß BEQ 20$ ;IF EQ END OF LIST.à MOV P.REL(R1),-(SP) ;CALCULATE SIZE OF HOLEá SUB R2,(SP) ;P)â CMP (SP)+,P.SIZE(R4) ;HOLE BIG ENOUGH?Aã BHIS 30$ ;IF HIS YES+ä MOV R1,R0 ;SAVE ADDRESS OF PREVIOUS PCBO8å MOV P.REL(R1),R2 ;CALCULATE BASE ADDRESS OF NEXT HOLEæ ADD P.SIZE(R1),R2 ; ç BR 10$ ;7è20$: MOV P.REL(R5),-(SP) ;CALCULATE SIZE OF LAST HOLE é ADD P.SIZE(R5),(SP) ;ê SUB R2,(SP) ;L)ë CMP (SP)+,P.SIZE(R4) ;HOLE BIG ENOUGH?Iì BLO 40$ ;IF LO NO)6í30$: MOV R2,P.REL(R4) ;SET ADDRESS OF TASK PARTITION9î MOV R4,P.SUB(R0) ;LINK ALLOCATED PARTITION TO PREVIOUSB*ï MOV R1,P.SUB(R4) ;LINK NEXT TO TASK PCBð40$: RETURN ;Iñò;+4ó; **-$TSTCP-TEST IF CHECKPOINT SHOULD BE INITIATEDô;M õ; INPUTS:Rö;L÷; R1=ADDRESS OF RESIDENT PCB ø; R4=ADDRESS OF CONTENDING PCBù; ú; OUTPUTS:û;)*ü; C=0 IF CHECKPOINT SHOULD BE INITIATED..ý; C=1 IF CHECKPOINT SHOULD NOT BE INITIATED.þ;P"ÿ; R1,R3,R4 AND R5 ARE PRESERVED. ;- ? $TSTCP::BIT #PS.CHK!PS.FXD,P.STAT(R1) ;IS PCB CHECKPOINTABLE? BNE 30$ ;IF NE NO 8 TSTB P.RMCT(R1) ;BUT ARE THERE RESIDENT MAPPED TASKS?) BNE 30$ ;IF NE YES, CANNOT CHECKPOINT; BIT #PS.COM,P.STAT(R1) ;IS IT AN UNMAPPED COMMON REGION?! BNE 40$ ;IF NE YES, IT CAN GOE: MOV P.TCB(R1),R2 ;AT THIS POINT MUST BE A TASK, GET TCB* BIT #T2.HLT,T.ST2(R2) ;IS TASK EXITING?) BNE 30$ ;IF NE YES, CANNOT CHECKPOINTH. BIT #T2.STP,T.ST2(R2) ;IS THE TASK STOPPED? BEQ 10$ ;IF EQ NO0 TST T.ASTL(R2) ;BUT DOES IT HAVE PENDING AST?  BEQ 40$ ;IF EQ NO, IT CAN GO9 10$: BIT #TS.STP,T.STAT(R2) ;BLOCKED BY MCR BLOCK CMD ? ! BNE 40$ ;IF NE YES, IT CAN GON   .IF DF S$$WPC * MOV $SWPR,R0 ;ASSUME TASK NOT IN MEMORY8 BIT #PS.CKP!PS.CKR!PS.OUT,P.STAT(R1) ;TASK IN MEMORY? BNE 15$ ;IF NE NOE  .IF DF X$$HDR 7 MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING FOR XTRNL HDRS( MOV P.HDR(R1),R0 ;SAVE HEADER POINTER" BNE 12$ ;IF NE INTERNAL HEADER/ MOV P.REL(R1),KISAR6 ;MAP TO EXTERNAL HEADERV2 MOV #140000,R0 ;RESET VIRTUAL ADDRESS OF HEADER 12$: ;REFERENCE LABEL! " .IFF ; DF X$$HDR # /$ MOV P.HDR(R1),R0 ;GET ADDRESS OF TASK HEADERF% & .ENDC ; DF X$$HDR' 8( MOVB H.SPRI(R0),R0 ;PICK UP CURRENT SWAPPING PRIORITY) * .IF DF X$$HDR+ 2, MOV (SP)+,KISAR6 ;RESTORE PREVIOUS EXEC MAPPING- . .ENDC ; DF X$$HDR/ 00 15$: CLR -(SP) ;EXTRACT TASK PRIORITY AS WORD1 BISB T.PRI(R2),(SP) ;72 ADD (SP)+,R0 ;ADD TASK PRIORITY TO SWAPPING PRIORITYM03 BMI 40$ ;IF MI WAITING TASK IS ALWAYS HIGHER+4 ;EFFECTIVE PRIORITY AND CAN THEREFOREE5 ;CHECKPOINT 76 BIT #PS.COM,P.STAT(R4) ;IS WAITING PCB FOR A COMMON?K7 BEQ 20$ ;IF EQ NO;-8 INC R0 ;PRIORITY OF WAITING COMMON IS + 1C19 20$: CLR R2 ;INIT REGISTER TO EXTRACT PRIORITY8: BISB P.PRI(R4),R2 ;EXTRACT PRIORITY OF CONTENDING PCB*; CMP R2,R0 ;CAN WAITING PCB CHECKPOINT?< CLC ;ASSUME YES= BGT 40$ ;IF GT YES> ? .IFFA@ 4A MOVB T.PRI(R2),R0 ;PICK UP RESIDENT TASK PRIORITY7B BIT #PS.COM,P.STAT(R4) ;IS WAITING PCB FOR A COMMON?CC BEQ 20$ ;IF EQ NOH-D INC R0 ;00Rrm%hg´cÚµcÛ¶c�·c›’PRIORITY OF WAITING COMMON IS + 1S5E 20$: CMPB P.PRI(R4),R0 ;CAN WAITING PCB CHECKPOINT? F BHI 40$ ;IF HI YESG H .ENDCI J "K 30$: SEC ;SET CARRY FOR RETURNL 40$: RETURN ;RM N ;+!O ; **-$ICHKP-INITIATE CHECKPOINTOP ;TJQ ; THIS ROUTINE INITIATES THE CHECKPOINT OF THE SPECIFIED REGION. IT MAYER ; BE CALLED ANY TIME REGARDLESS OF THE STATE OF ANY MAPPED TASKS ORUS ; OUTSTANDING I/O.T ; U ; INPUTS:PV ;(BW ; R1=ADDR OF PCB OF REGION FOR WHICH TO INITIATE THE CHECKPOINT.X ;R Y ; OUTPUTS:Z ;OC[ ; THIS ROUTINE TAKES ONE OF THE FOLLOWING THREE ACTIONS DEPENDING'\ ; ON THE CURRENT STATE OF THE REGION.] ; ?^ ; 1. IF THE REGION IS ALREADY BEING CHECKPOINTED, THEN NO _ ; ACTION IS TAKEN.E` ;NCa ; 2. IF THE REGION IS CURRENTLY BEING LOADED, OR THERE IS I/OR;b ; GOING INTO THE REGION, OR A TASK MAPPING THE REGION ISE<c ; RUNNING ON ANOTHER PROCESSOR, THEN A CHECKPOINT REQUEST;d ; IS POSTED FOR THE REGION TO BE HONORED WHEN THE CONDI-Ee ; TION IS REMOVED.f ;UCg ; 3. IF NONE OF THE ABOVE CONDITIONS ARE TRUE THEN AN ATTEMPTN2h ; IS MADE TO CHECKPOINT THE REGION IMMEDIATELY.i ; >j ; IF AN ATTEMPT IS TO BE MADE TO CHECKPOINT THE REGION, THISk ; OCCURS AS FOLLOWS:l ;Bm ; 1. IF THE REGION IS A READ-ONLY INSTALLED REGION, THEN ITS<n ; SPACE IS SIMPLY DEALLOCATED BY THE LOADER. (HAVING THE=o ; LOADER DO THE DEALLOCATION SOLVES A PROBLEM OF UNLIMITEDQp ; RECURSION BACK TO $NXTSK.)Oq ;BBr ; 2. IF THE REGION IS A READ-WRITE INSTALLED REGION, THEN IT+s ; IS CHECKPOINTED BACK TO ITS OWN IMAGE.Nt ;T@u ; 3. FOR ALL OTHER REGIONS, AN ATTEMPT IS MADE TO ALLOCATE7v ; SPACE IN A CHECKPOINT FILE. IF THIS FAILS AND THE ;w ; REGION CONTAINS A TASK WITH CHECKPOINT SPACE ALLOCATEDI<x ; IN ITS CHECKPOINT FILE, THEN THIS SPACE IS USED. OTHER-0y ; WISE TKTN IS REQUESTED TO REPORT THE ERROR.z ;OC{ ; IN ANY CASE, IF THE CHECKPOINT CAN OCCUR, THE FIRST STATUS WORD B| ; OF ALL TASKS MAPPED TO THE REGION IS INCREMENTED TO BLOCK THEM>} ; FROM FURTHER EXECUTION UNTIL THE REGION RETURNS TO MEMORY.~ ;- @€ $ICHKP::BIT #PS.OUT,P.STAT(R1) ;REGION CURRENTLY BEING LOADED?� BEQ 5$ ;IF EQ NO4‚ BIS #PS.CKR,P.STAT(R1) ;POST A CHECKPOINT REQUESTƒ BR 70$ ;RETURNB„ 5$: BIT #PS.CKP,P.STAT(R1) ;IS THE REGION ALREADY CHECKPOINTING?*… BNE 70$ ;IF NE YES, NO ACTION REQUIRED† MOV R1,R3 ;COPY PCB ADDRESSN2‡ TSTB P.IOC(R3) ;ANY I/O IN PROGRESS TO REGION ?ˆ BEQ 7$ ;IF EQ NO9‰ BIS #PS.CKR,P.STAT(R3) ;YES, CAN ONLY POST REQUEST NOW <Š 7$: MOV P.ATT(R3),R2 ;POINT TO FIRST ATTACHMENT DESCRIPTOR ‹ BEQ 36$ ;IF EQ THERE IS NONE5Œ 20$: TSTB A.MPCT(R2) ;IS THIS ATTACHED TASK MAPPED?F� BEQ 35$ ;IF EQ NOP/Ž MOV A.TCB(R2),R0 ;PICK UP TCB OF MAPPED TASK;+� CMP R0,$TKTCB ;IS THIS THE CURRENT TASK?R� ‘ ’ .IF DF M$$PRO“ ” BEQ 25$ ;IF EQ YES<• BIT #TS.RUN,T.STAT(R0) ;IS THE TASK RUNNING ON SOME PROC?– BEQ 30$ ;IF EQ NOR6— BIS #TS.CKR,T.STAT(R0) ;NOTE THE CHECKPOINT REQUEST4˜ BIS #PS.CKR,P.STAT(R3) ;POST A CHECKPOINT REQUEST™ š .IFF2› œ BNE 30$ ;IF NE NO � ž .ENDCŸ   '¡ 25$: CALL $SETCR ;FORCE RESCHEDULINGT@¢ 30$: BIS #TS.CIP,T.STAT(R0) ;BLOCK TASK FOR CHECKPOINT IN PROG8£ 35$: MOV (R2),R2 ;POINT TO NEXT ATTACHMENT DESCRIPTOR¤ BNE 20$ ;IF NE THERE IS ONE;¥ BIT #PS.CKR,P.STAT(R3) ;WAS THERE ONLY A REQUEST POSTED?#%¦ BNE 70$ ;IF NE YES, JUST EXIT NOWO<§ 36$: TST P.DPCB(R3) ;IS THIS AN INSTALLED RW OR RO REGION?¨ BNE 90$ ;IF NE YES© SAVNR ;SAVE R4 AND R5>ª BIC #PS.CAF,P.STAT(R3) ;CLEAR CHECKPOINT ALLOCATION FAILURE/« MOV #P.DLGH,R1 ;SET LENGTH OF CHECKPOINT PCBT*¬ CALL $ALOCB ;ALLOCATE A CHECKPOINT PCB%­ BCS 50$ ;IF CS ALLOCATION FAILUREI-® MOV R0,R4 ;SAVE POINTER TO CHECKPOINT PCBC-¯ ADD R1,R0 ;POINT TO END OF CHECKPOINT PCBN5° MOV P.SIZE(R3),-(R0) ;STORE SIZE OF CHECKPOINT PCB )± ADD #7,(R0) ;ROUND TO NEXT DISK BLOCK $² ROR (R0) ;CONVERT TO DISK BLOCKS³ ASR (R0) ;´ ASR (R0) ;8µ MOV #$CFLPT,R5 ;POINT TO CHECKPOINT FILE PCB LISTHEAD6¶ 00RzmqmzgM{güfàýfáþfDATA40$: MOV (R5),R5 ;POINT TO NEXT CHECKPOINT FILE PCB· BNE 80$ ;IF NE THERE IS ONEC.¸ MOV R4,R0 ;RETRIEVE CHECKPOINT PCB POINTER+¹ MOV #P.DLGH,R1 ;SET LENGTH TO DEALLOCATELº MOV R3,R5 ;SAVE PCB ADDRESS *» CALL $DEACB ;DEALLOCATE CHECKPOINT PCB#¼ MOV R5,R3 ;RETRIEVE PCB ADDRESS('½ 50$: MOV R3,R1 ;RETRIEVE PCB ADDRESS1¾ BIT #PS.COM,P.STAT(R1) ;IS THIS A TASK REGION?(¿ BNE 60$ ;IF NE NOL(À MOV P.TCB(R1),R0 ;PICK UP TCB ADDRESS=Á BIT #T3.CAL,T.ST3(R0) ;SPACE ALLOCATED IN TASK IMAGE FILE?V BNE 90$ ;IF NE YES, USE IT'à BIC #TS.CIP,T.STAT(R0) ;UNBLOCK TASK @Ä 60$: BIS #PS.CAF,P.STAT(R1) ;SET CHECKPOINT FILE ALLOC FAILURE*Å MOV $TKNPT,R0 ;PICK UP TKTN TCB ADDRESSÆ Ç .IF DF R$$PROÈ $É BNE 65$ ;IF NE TKTN IS INSTALLED,Ê MOV #5,R0 ;GET THE CHECKPOINT ALLOCATION+Ë ;FAILURE CODE FOR THE P/OS DISPATCHER#1Ì CALLR $CTMSG ;GO SEND THE MESSAGE IF POSSIBLE6Í Î .IFF ;R$$PROVÏ (Ð BEQ 70$ ;IF EQ TKTN IS NOT INSTALLEDÑ Ò .ENDC ;R$$PROÓ +Ô 65$: TST T.STAT(R0) ;TKTN ALREADY ACTIVE?E#Õ BPL 70$ ;IF PL YES, JUST RETURN0 Ö JMP $EXRQN ;NO, REQUEST TKTN× 70$: RETURN ;C9Ø 80$: TST P.REL(R5) ;IS THIS CHECKPOINT FILE TURNED OFF?NÙ BNE 40$ ;IF NE YES5Ú CALL $FNDSP ;ATTEMPT TO ALLOCATE CHECKPOINT SPACE %Û BCS 40$ ;IF CS ALLOCATION FAILUREI.Ü CLR P.UCB(R4) ;P.UCB=0 FOR CHECKPOINT PCB'S8Ý MOV R5,P.MAIN(R4) ;STORE ADDRESS OF MAIN CKP FILE PCB7Þ MOV R4,P.DPCB(R3) ;STORE CHECKPOINT FILE PCB ADDRESSA'ß 90$: MOV R3,R1 ;RETRIEVE PCB ADDRESST9à MOV P.ATT(R1),R3 ;POINT TO FIRST ATTACHMENT DESCRIPTOR !á BEQ 120$ ;IF EQ THERE IS NONEEAâ 100$: MOVB A.MPCT(R3),R0 ;PICK UP MAPPING COUNT THRU DESCRIPTORPã BEQ 110$ ;IF EQ NO1ä MOV A.TCB(R3),R2 ;PICK UP MAPPED TCB'S ADDRESS .å INC T.STAT(R2) ;ADVANCE TASK BLOCKING COUNT;æ BIC #TS.CIP,T.STAT(R2) ;CLEAR CHECKPOINT IN PROGRESS BITP9ç 110$: MOV (R3),R3 ;POINT TO NEXT ATTACHMENT DESCRIPTORP è BNE 100$ ;IF NE THERE IS ONE2é 120$: BIS #PS.CKP,P.STAT(R1) ;SET CHECKPOINT BIT;ê BIT #PS.COM,P.STAT(R1) ;IS TARGET REGION A TASK REGION ?Eë BNE 125$ ;IF NE, NO0+ì MOV P.TCB(R1),R3 ;GET OWNING TCB ADDRESS(2í TSTB T.IOC(R3) ;TASK HAVE ANY OUTSTANDING I/O ?0î BEQ 125$ ;IF EQ, NO NEED TO WORRY ABOUT IOSB9ï BIS #T3.MPC,T.ST3(R3) ;SET MAPPING CHANGE TO FORCE ANYI%ð ;OUTSTANDING I/O TO RE-MAP IOSBEñ 125$: ;REFERENCE LABELPò ó ô .IF DF A$$CNTõ 6ö BIT #BF.XTK,$ACNFE ;DOES CHECKPOINT BECAUE OF EXTK$÷ BNE 140$ ;IF NE YES.)ø MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING#ù MOV $SABPT,KISAR6 ;MAP SABG*ú BEQ 130$ ;IF EQ, ACCOUNTING NOT ACTIVE4û BIT #BF.LSS,$ACNFE ;SYSTEM ACCOUNTING TURNED ON ?ü BEQ 130$ ;NO, IF EQ.*ý ADD #1,@#B.CKP+140002 ;COUNT CHECKPOINTþ ADC @#B.CKP+140000 ;B)ÿ 130$: MOV (SP)+,KISAR6 ;RESTORE MAPPINGN& 140$: BIC #BF.XTK,$ACNFE ;CLEAR FLAG  .ENDC    ;+( ; **-$LOADT-PUT REGION IN LOADER QUEUE ; F ; THIS ROUTINE PUTS A REGION IN THE LOADER QUEUE FOR AN INITIAL LOADA ; OR CHECKPOINT OPERATION. IF THE REGION IS A TASK REGION, ALLIG ; OTHER REGIONS MAPPED BY THE TASK ARE EITHER ACCESSED OR DEACCESSED,S? ; DEPENDING ON WHETHER THE TASK IS COMING IN OR OUT OF MEMORYE ; RESPECTIVELY. NOTE THAT IF THE TASK'S ATTACHMENT QUEUE IS EMPTY, D ; THEN THIS MUST BE THE INITIAL LOAD AND ALL REGIONS LINKED TO THE ; TASK ARE MAPPED. ;  ; INPUTS:+ ;  ; R1=ADDRESS OF PCB OF REGIONE ;  ; OUTPUTS: ;E ; NONE ;- 5 $LOADT::BIT #PS.COM,P.STAT(R1) ;IS IT A COMMON PCB?P BNE 50$ ;IF NE YES. TST P.ATT(R1) ;ATTACHED TO TASK REGION YET? BNE 5$ ;IF NE YES  3 TALLY$ B.TLOD,XA$$TL ;COUNT AN INITIAL TASK LOADS &! BR 50$ ;LOADER DOES FIRST ACCESSES" 5$: ;REFERENCE LABELA!# MOV R1,-(SP) ;SAVE PCB ADDRESS $ MOV R4,-(SP) ;SAVE R4(% MOV P.TCB(R1),R4 ;PICK UP TCB ADDRESS<& MOV #$ACCRG,-(SP) ;ASSUME ATTACHED REGIONS TO BE ACCESSED7' BIT #PS.OUT,P.STAT(R1) ;IS TASK REGION BEING LOADED? ( BNE 10$ ;IF NE YES5) MOV #$DEARG,(SP) ;SET TO DEACCESS ATTACHED REGIONS >* 10$: MOV @T.ATT(R400R‚m%hg´cÚµcÛ¶c�·c›’),R4 ;PICK UP SECOND ATTACHMENT DESCRIPTOR%+ 20$: BEQ 30$ ;IF EQ AT END OF LIST$0, TSTB A.MPCT-A.TCBL(R4) ;IS THE REGION MAPPED?- BEQ 25$ ;IF EQ NOS/. MOV A.TCB-A.TCBL(R4),R0 ;PICK UP TCB ADDRESSS// MOV A.PCB-A.TCBL(R4),R1 ;PICK UP PCB ADDRESSV00 CMP T.PCB(R0),R1 ;ATTACHMENT TO TASK REGION ?1 BNE 23$ ;IF NE NO ,2 CMP (SP),#$ACCRG ;ACCESSING TASK REGION ?,3 BEQ 25$ ;IF EQ YES, SKIP THIS ATTACHMENT04 23$: CALL @(SP) ;CALL ACCESS/DEACCESS ROUTINE75 25$: MOV (R4),R4 ;PICK UP NEXT ATTACHMENT DESCRIPTORO6 BNE 20$ ;IF NE THERE IS ONEB7 30$: TST (SP)+ ;CLEAN STACK8 MOV (SP)+,R4 ;RESTORE R4 %9 MOV (SP)+,R1 ;RETRIEVE PCB POINTERN3: 50$: MOV $LDRPT,R0 ;PICK UP TCB ADDRESS OF LOADER; ;+< ; ** W A R N I N G **K= ;C> ; SPM HOOKPOINT NUMBER 12.? ;T+@ ; DO NOT CHANGE THE INSTRUCTION FOLLOWINGNA ; LABEL WITHOUT CHECKING SPMB ;-C -D $SPH12==. ;SPM CHANGES THE INSTRUCTION ATH!E ;THE LOCATION OF THIS LABELSF G 3H TSTB P.PRI(R1) ;CHECKPOINTING UNMAPPED COMMON OREI ;MULTI-USER SECTION ?IJ BNE 60$ ;IF NE, NO5K MOVB #251.,P.PRI(R1) ;INSERT PCB AT FRONT OF QUEUE L 60$: ;REFERENCE LABELM N ;+=O ; **-$EXRQP-EXECUTIVE REQUEST WITH QUEUE INSERT BY PRIORITY6P ; **-$EXRQF-EXECUTIVE REQUEST WITH QUEUE INSERT FIFO7Q ; **-$EXRQN-EXECUTIVE REQUEST WITH NO QUEUE INSERTIONBR ; **-$EXRQU-EXECUTIVE UNSTOP AND REQUEST WITH NO QUEUE INSERTION8S ; **-$EXRQS-EXECUTIVE REQUEST WITH NO SCHEDULE REQUESTT ; IU ; THESE ROUTINES PROVIDE A STANDARD INTERFACE TO ALL TASKS REQUESTED BYEV ; THE EXECUTIVE.W ; X ; INPUTS:VY ;1%Z ; R0=TCB ADDRESS OF TASK TO REQUESTUB[ ; R1=ADDR OF PACKET TO QUEUE TO TASK (IF ENTRY AT $EXRQP/$EXRQF)\ ; ] ; OUTPUTS:^ ;Y2_ ; C=0 IF THE REQUEST WAS SUCCESSFULLY COMPLETED.3` ; C=1 IF THE TASK WAS NOT SUCCESSFULLY REQUESTED.N#a ; Z=0 IF PCB ALLOCATION FAILURE.C7b ; Z=1 IF TASK ACTIVE, BEING REMOVED, OR BEING FIXED.$c ;-d e .ENABL LSBIBf $EXRQP::MOV #$QINSP,-(SP) ;PUSH ADDR OF QUEUE INSERT BY PRIORITYg BR 1$ ;JOIN COMMON CODET;h $EXRQF::MOV #$QINSF,-(SP) ;PUSH ADDR OF QUEUE INSERT FIFOT0i 1$: ADD #T.RCVL,R0 ;POINT TO TASK RECEIVE LIST/j CALL @(SP)+ ;INSERT PACKET IN RECEIVE QUEUE-k SUB #T.RCVL,R0 ;POINT BACK TO START OF TCBT7l $EXRQN::BIT #T2.STP*2!T2.STP,T.ST2(R0) ;TASK STOPPED? m BEQ 2$ ;IF EQ NO=n $EXRQU::BIC #T2.STP*2!T2.STP,T.ST2(R0) ;CLEAR TASK STOP BITVo p ;+q ; ** W A R N I N G **r ;s ; SPM HOOKPOINT NUMBER 07.t ;$+u ; DO NOT CHANGE THE INSTRUCTION FOLLOWINGOv ; LABEL WITHOUT CHECKING SPMw ;-x -y $SPH07==. ;SPM CHANGES THE INSTRUCTION ATT!z ;THE LOCATION OF THIS LABEL { | 3} CALL @#$SETCR ; SET CONDITIONAL SCHEDULE REQUESTV~ $EXRQS:: ;REF LABELR 2$: CLR R1 ;USE DEFAULT UIC € .DSABL LSBT� ‚ ;+(ƒ ; **-$TSKRT-TASK REQUEST (DEFAULT UCB)(„ ; **-$TSKRQ-TASK REQUEST (SPECIFY UCB)0… ; **-$TSKRP-TASK REQUEST (SPECIFY DEFAULT UIC)† ;R>‡ ; THIS ROUTINE IS CALLED TO REQUEST THE EXECUTION OF A TASK.ˆ ;A ‰ ; INPUTS:UŠ ; 6‹ ; R0=ADDRESS OF THE TCB OF THE TASK TO BE REQUESTED.Œ ; R1=REQUEST UIC.G&� ; R2=UCB ADDRESS IF ENTRY AT $TSKRQ.&Ž ; R3=DEFAULT UIC IF ENTRY AT $TSKRP.� ;; � ; OUTPUTS:‘ ;H>’ ; C=1 IF TASK IS ALREADY ACTIVE OR IS BEING FIXED IN MEMORY.'“ ; Z=1 IF TASK ACTIVE OR BEING FIXED.*#” ; Z=0 IF PCB ALLOCATION FAILURE. 1• ; C=0 IF THE REQUEST IS SUCCESSFULLY COMPLETED.R– ;-— 9˜ $TSKRT::MOV $COPT,R2 ;GET ADDRESS OF COMMAND OUTPUT UCBD2™ $TSKRQ::MOV R1,R3 ;MAKE CURRENT UIC DEFAULT UICAš $TSKRP::MOV #TS.EXE,-(SP) ;ASSUME TASK IS ACTIVE OR BEING FIXED,› BIT (SP),T.STAT(R0) ;TASK ALREADY ACTIVE?œ BEQ 10$ ;IF EQ YES&� MOV R1,T.EFLG(R0) ;SAVE REQUEST UIC<ž MOV T.PCB(R0),R1 ;PICK UP PCB POINTER (COULD BE MAIN PCB)/Ÿ BIT #PS.FXD,P.STAT(R1) ;IS TASK BEING FIXED?I  BEQ 1$ ;IF EQ NO7¡ BIT #PS.OUT!PS.CKP,P.STAT(R1) ;TASK OUT OF MEMORY ORC¢ ;BEING SHUFFLED ?£ BNE 10$ ;IF NE YES,¤ 1$: BIT #T3.REM,T.ST3(R0) ;REMOVE ON EXIT?¥ BNE 10$ ;IF NE YES%¦ MOV R3,T.ACTL(R0) ;SET DEFAULT UIC.'§ BIC (SP),00RŠmqmzgM{güfàýfáþfDATAT.STAT(R0) ;SET TASK ACTIVE %¨ CLR (SP) ;CLEAR FAILURE INDICATORR© ;+ª ; ** W A R N I N G **Q« ;¬ ; SPM HOOKPOINT NUMBER 02.­ ;U+® ; DO NOT CHANGE THE INSTRUCTION FOLLOWING(¯ ; LABEL WITHOUT CHECKING SPM° ;-± -² $SPH02==. ;SPM CHANGES THE INSTRUCTION ATO!³ ;THE LOCATION OF THIS LABEL;´ ,µ MOV R2,T.UCB(R0) ;SET ADDRESS OF 'TI' UCB¶ 0· BIT #PS.FXD,P.STAT(R1) ;TASK FIXED IN MEMORY?¸ BNE 20$ ;IF NE YES&¹ MOV R0,-(SP) ;SAVE TASK TCB ADDRESS-º MOV #P.LGTH,R1 ;SET LENGTH OF BLOCK NEEDEDA» CALL $ALOCB ;ALLOCATE PCB ¼ MOV R0,R3 ;SAVE PCB ADDRESSW*½ MOV (SP)+,R0 ;RETRIEVE TASK TCB ADDRESS¾ ROR (SP) ;CAPTURE CARRY BIT +¿ BEQ 3$ ;IF EQ ALLOCATION WAS SUCCESSFUL )À BIS (SP),T.STAT(R0) ;SET TASK INACTIVEC$Á INC (SP) ;SET ALLOCATION FAILURE) CMP R0,$TKNPT ;TRYING TO REQUEST TKTN?Cà BEQ 40$ ;IF EQ YES Ä BR 10$ ;Å 3$:SÆ Ç È .IF DF N$$DIRÉ &Ê CALL SETDDS ;SET UP POINTER TO DDSË Ì .ENDC ; DF N$$DIRÍ Î .IF DF A$$CNTÏ 2Ð CALL ACNTSK ;SET UP ACCOUNTING DATA STRUCTURESÑ Ò .ENDCÓ Ô 3Õ MOV T.PCB(R0),R1 ;GET MAIN PARTITION PCB ADDRESST)Ö MOV R3,R2 ;COPY ALLOCATED PCB ADDRESS 1× MOV R2,T.PCB(R0) ;SET ADDRESS OF ALLOCATED PCBB"Ø TST (R2)+ ;SKIP OVER LINK WORD2Ù CLR (R2)+ ;INIT PRIORITY AND RES. MAPPED COUNT-Ú MOV P.NAM(R1),(R2)+ ;INSERT PARTITION NAMEIÛ MOV P.NAM+2(R1),(R2)+ ;1Ü CLR (R2)+ ;CLEAR POINTER TO NEXT SUBPARTITIONS7Ý MOV R1,(R2)+ ;SET BACK POINTER TO MAIN PARTITION PCBF$Þ CLR (R2)+ ;CLEAR RELOCATION BASE9ß MOV T.MXSZ(R0),(R2)+ ;SET PARTITION SIZE IN 32W BLOCKST'à CLR (R2)+ ;CLEAR WAIT QUEUE POINTERS;á MOV P.SIZE-P.SWSZ(R2),(R2)+ ;SET SWAP SIZE FROM PAR SIZEC$â CLR (R2)+ ;ZERO DISK PCB ADDRESS&ã MOV R0,(R2)+ ;SET OWNER TCB ADDRESS=ä MOV #PS.DEL!PS.OUT,(R2)+ ;MARKED FOR DELETE, OUT OF MEMORY)1å BIT #T2.CHK,T.ST2(R0) ;IS TASK CHECKPOINTABLE?(æ BEQ 4$ ;IF EQ YESC1ç BIS #PS.CHK,-2(R2) ;MAKE PCB NONCHECKPOINTABLE 0è 4$: CLR (R2)+ ;INITIALLY CLEAR HEADER POINTER$é CLR (R2)+ ;CLEAR PROTECTION WORD2ê MOV R2,R1 ;SAVE POINTER TO ATTACHMENT LISTHEAD)ë CLR (R2)+ ;SET UP ATTACHMENT LISTHEAD ì MOV R1,(R2)+ ;Rí î .IF DF X$$HDRï 9ð MOVB T.HDLN(R0),(R2)+ ;INIT XTRNL HEADER SIZE (P.HDLN)Rñ ò .IFF ; DF X$$HDRDó (ô TSTB (R2)+ ;SKIP XTRNL HEADER LENGTHõ ö .ENDC ; DF X$$HDR÷ !ø MOV R0,-(SP) ;SAVE TCB ADDRESSIù ;+ú ; ** W A R N I N G **Cû ;Bü ; SPM HOOKPOINT NUMBER 11.ý ;K+þ ; DO NOT CHANGE THE INSTRUCTION FOLLOWING ÿ ; LABEL WITHOUT CHECKING SPM ;- - $SPH11==. ;SPM CHANGES THE INSTRUCTION ATC! ;THE LOCATION OF THIS LABELU1 CLRB (R2)+ ;ZERO PARTITION I/O COUNT (P.IOC).# MOV R3,R1 ;RETRIEVE PCB ADDRESS( # CALL $ACCRG ;ACCESS TASK REGION  BR 30$ ;% 10$: MOV R0,-(SP) ;SAVE TCB ADDRESSL6 MOV T.PCB(R0),R0 ;GET ADDRESS OF TASK PARTITION PCB! CALL $NXTSK ;SELECT NEXT TASK BR 30$ ;% 20$: MOV R0,-(SP) ;SAVE TCB ADDRESS1   .IF DF N$$DIR & CALL SETDDS ;SET UP POINTER TO DDS  .ENDC ; DF N$$DIR   .IF DF A$$CNT 2 CALL ACNTSK ;SET UP ACCOUNTING DATA STRUCTURES  .ENDC  + CALL $BILDS ;BUILD A STACK FOR THE TASK1( 30$: MOV (SP)+,R0 ;RESTORE TCB ADDRESS ! " .IF DF V$$TRM# $$ TST (SP) ;SUCCESSFUL ACTIVATION?% BMI 40$ ;IF MI NOB,& MOV T.UCB(R0),R1 ;PICK UP TI: UCB ADDRESS' MOV (R1),R2 ;POINT TO DCB :( CMP D.NAM(R2),#"VT ;IS THE TI: A VIRTUAL TERMINAL UNIT?) BNE 40$ ;IF NE NO 4* INCB U.OCNT(R1) ;INCREMENT ACTIVE OFFSPRING COUNT+ , .ENDC- . . 40$: ;JWB169C. .IF DF N$$DIR ;JWB169T. ;JWB169.7. CLR $CTXPT ;CLEAR OUT FOR FUTURE REQUESTS ;JWB1691. ;JWB169 !. .ENDC ;DF N$$DIR ;JWB169F. ;JWB169T50 ASL (SP)+ ;SET SUCCESS/FAILURE INDICATION ;**-11 2 RETURN ; 3 4 ;TG5 ; LOCAL ROUTINE TO PROPAGATE THE DEFAULT DIRECTORY STRING TO THE TASK 6 ; WHICH IS STARTING UP7 ;?8 9 .IF DF N$$DIR: 2; SETDDS: MOV $CTXPT,R1 ;GET SPECIAL DDS SPECIFI00R’m%hg´cÚµcÛ¶c�·c›’ED< BEQ 20$ ;IF EQ, NONE!= MOV R1,T.CTX(R0) ;PUT INTO TCB$$> CLR $CTXPT ;RESET $CTXPT TO ZERO? BR 40$ ;BRANCH AROUND $@ 20$: MOV T.UCB(R0),R1 ;GET TI: UCB'A BIT #DV.PSE,U.CW1(R1);PSEUDO DEVICE? (B BNE 60$ ;IF NE, YES - NO CONTEXT PTR.C MOV U.CTX(R1),R1 ;GET CONTEXT BLOCK POINTER$D BEQ 60$ ;IF EQ, NO CONTEXT BLOCK1E MOV R1,T.CTX(R0) ;PUT POINTER TO DDS INTO TCBNF -G 40$: MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING#H MOV R1,KISAR6 ;MAP CONTEXT BLOCKC.I INCB C.REF+MAP6 ;INCREMENT REFERNCE COUNTER$J MOV (SP)+,KISAR6 ;RESTORE MAPPING K 60$: RETURNCL M .ENDC ;DF N$$DIRTN O P ; IQ ; LOCAL ROUTINE TO SET UP ACCOUNTING DATA STRUCTURES FOR THE TASK BEINGU R ; ACTIVATED S ;ET U V .IF DF A$$CNTW X ACNTSK:PY MOV R4,-(SP) ;SAVE R4Z MOV R0,R4 ;SAVE TCB ADDRESS6)[ MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGT"\ MOV T.UCB(R0),R0 ;LOCATE TI UCB] CMP $COPT,R0 ;IS TI: = CO:S^ BEQ 10$ ;IF EQ YES-_ MOV U.UAB(R0),R0 ;TRY TO LOCATE TASK'S UABE"` BNE 30$ ;IF NE, THERE IS A UABa b c .IF DF V$$TRMd *e MOV T.UCB(R4),R1 ;LOCATE TASK'S TI: UCBf MOV (R1),R0 ;POINT TO DCBO0g CMP D.NAM(R0),#"VT ;IS IT A VIRTUAL TERMINAL?h BNE 20$ ;IF NE NOA,i MOV U.PTCB(R1),R1 ;LOCATE PARENT TASK TCB6j BEQ 20$ ;IF EQ, USE $SYUAB SINCE CAN'T FIND PARENT'k MOV T.ACN(R1),R0 ;TRY TO USE ITS UABR)l BEQ 20$ ;IF EQ, USE $SYUAB AS DEFAULTI)m 5$: MOV R0,KISAR6 ;MAP ACCOUNTING BLOCKQ+n CMPB #BT.UAB,@#B.TYP+140000 ;IS IT A UAB o BEQ 30$ ;IF EQ YES3p MOV @#B.PNT+140000,R0 ;GET ADDRESS OF NEXT BLOCKTq BR 5$ ;CHECK ITRr s .IFF ;V$$TRMTt %u BR 20$ ;USE $SYUAB AS DEFAULT UABCv w .ENDC ;V$$TRMx y 4z 10$: MOV $CKUAB,R0 ;GET UAB ADDRESS FROM CLQ BLOCK { BNE 30$ ;IF NE, THERE IS ONE3| 20$: MOV $SYUAB,R0 ;USE SYSTEM UAB AS LAST RESORT)} BEQ 90$ ;IF EQ, ACCOUNTING NOT ACTIVE ~ 30$: MOV R0,KISAR6 ;MAP UAB + INCB @#B.USE+140000 ;INCREMENT USE COUNT 4€ INC @#B.ACT+140000 ;INCREMENT ACTIVE TASK COUNTER0� MOV #B.TAS,R1 ;GET OFFSET TO TASK COUNT FIELD'‚ CALL $ADAT1 ;INCREMENT TASK COUNTEREƒ MOV #BS.ACT,R1 ;ACTIVATE TAB1„ BIT #BF.TSK,$ACNFE ;TASK ACCOUNTING TURNED ON?C… BNE 50$ ;IF NE YES9† MOV T.EFLM(R4),-(SP) ;CHECK FOR ANY TIME LIMIT ON TASK ‡ BIS T.EFLM+2(R4),(SP)+ ;M!ˆ BEQ 80$ ;IF EQ, NO TIME LIMITT2‰ BIS #BS.TML,R1 ;SET TIME LIMIT ONLY BIT FOR TABŠ ;0‹ ; CREATE TAB FOR TASK Œ ;I5� ; TKTN CANNOT HAVE A TAB, BECAUSE IT GETS REQUESTEDT2Ž ; IN THE PROCESSING OF A TAB ALLOCATION FAILURE.� ;;-� 50$: CMP $TKNPT,R4 ;IS TKTN BEING REQUESTED ‘ BEQ 80$ ;IF EQ YES ’ MOV KISAR5,-(SP) ;SAVE KISAR5!“ MOV R0,-(SP) ;SAVE UAB ADDRESSN%” MOV R1,-(SP) ;SAVE VALUE FOR B.STMS • MOV #B.TBLK,R1 ;LENGTH OF TAB– MOV R3,-(SP) ;SAVE R3— CALL $ALTAB ;ALLOCATE A TAB ˜ MOV (SP)+,R3 ;RESTORE&™ BCS 75$ ;IF CS, ALLOCATION FAILURE3š MOV R0,2(SP) ;REPLACE UAB ADDR WITH THE TAB ADDR %› MOV R0,KISAR5 ;MAP TAB WITH KISAR5 =œ MOV #!BT.TAB,@#B.TYP+120000 ;TAB IDENTIFACTIONA5� MOV #B.HID+120000,R1 ;POINT TO USER ID AREA OF TABSž 55$: MOV R1,R2 ;COPY ADDRESSM1Ÿ MOV 20000(R2),(R1)+ ;COPY WORD FROM UAB TO TAB -  CMP #B.HEND+120000,R1 ;ENTIRE AREA COPIED?.¡ BHI 55$ ;IF HI NO :¢ MOV #/2,R2 ;GET NUMBER OF WORDS TO CLEAR2£ 60$: CLR (R1)+ ;CLEAR ACCUMULATION FIELD IN TAB¤ SOB R2,60$ ;LOOP4¥ MOV #B.CPUL+2+120000,R1 ;POINT TO CPU LIMIT FIELD.¦ MOV T.EFLM+2(R4),(R1) ;COPY LIMIT INTO TAB§ MOV T.EFLM(R4),-(R1)A-¨ MOV (R1)+,-(SP) ;CHECK IF THERE IS A LIMIT.© BIS (R1),(SP)+ ;Tª BEQ 70$ ;IF EQ, NO LIMIT9« MOV -2(R1),@#B.CPU+120000 ;COPY LIMIT INTO B.CPU FIELDR¬ MOV (R1),@#B.CPU+2+120000 ;2­ COM @#B.CPU+120000 ;CONVERT TO 1'S COMPLIMEMENT5® COM @#B.CPU+2+120000 ;TO ENABLE DETECTION WITH BCSD!¯ 70$: TST (R1)+ ;POINT TO B.PNTR*° MOV KISAR6,(R1)+ ;INSERT POINTER TO UAB)± CMP T.UCB(R4),$COPT ;IS CO: TASK'S TI:C² BNE 73$ ;IF NE NOT%³ BIS #BS.CO,(SP) ;SET INDICATOR BIT$´ 73$: MOVB (SP),(R1)+ ;INSERT B.STM5µ MOVB T.PRI(R4),(R1)+ ;INSERT INITIAL TASK P00RšmqmzgM{güfàýfáþfDATARIORITYT(¶ MOV T.NAM(R4),(R1)+ ;INSERT TASK NAME· MOV T.NAM+2(R4),(R1)+ ;#¸ MOV R4,(R1)+ ;INSERT TCB ADDRESS."¹ MOV R0,R1 ;COPY ADDRESS OF TAB,º MOV #B.BEG,R0 ;TASK ACTIVATION TIME FIELD» CALL $TMSTP ;TIME STAMP TABT(¼ 75$: TST (SP)+ ;CLEAN B.STM OFF STACK-½ MOV (SP)+,R0 ;GET ADDR OF ACCOUNTING BLOCK #¾ MOV (SP)+,KISAR5 ;RESTORE KISAR5I6¿ 80$: MOV R0,T.ACN(R4) ;LINK ACCOUNTING BLOCK OFF TCB'À 90$: MOV (SP)+,KISAR6 ;RESTORE KISAR6T"Á MOV R4,R0 ;RESTORE TCB ADDRESS MOV (SP)+,R4 ;RESTORE R4 à RETURNRÄ Å .ENDCÆ Ç È É ;+3Ê ; **-$UISET-ESTABLISH DEFAULT UIC AND CURRENT UICDË ;.DÌ ; THIS ROUTINE ESTABLISHES DEFAULT AND CURRENT FOR REQUESTED TASKSÍ ; IN MULTI-USER SYSTEMS.Î ;M Ï ; INPUTS:Ð ;:Ñ ; R1=REQUEST UIC4Ò ; R2=ADDRESS OF SECOND STATUS WORD OF CURRENT TASK(Ó ; R4=ADDRESS OF HEADER OF CURRENT TASKÔ ; Õ ; OUTPUTS:Ö ;(× ; R1=CURRENT UICØ ; R3=DEFAULT UIC6Ù ; C=1 IF NONPRIVILEGED TASK IS TRYING TO CHANGE UICÚ ; C=0 OTHERWISEÛ ;-Ü Ý .IF DF M$$MUPÞ 2ß $UISET::MOV H.DUIC(R4),R3 ;PROPAGATE DEFAULT UICà TST R1 ;UIC SPECIFIED?á BEQ 10$ ;IF EQ NO â MOV R1,R3 ;USE SPECIFIED UIC.ã BIT #T3.PRV,2(R2) ;CURRENT TASK PRIVILEGED?ä BNE 20$ ;IF NE YES6å CMP R1,H.CUIC(R4) ;NONPRIVILEGED TASK CHANGING UIC?æ BEQ 10$ ;IF EQ NONç SEC ;ELSE RETURN C-BIT SETO:è 10$: MOV H.CUIC(R4),R1 ;FORCE PROPAGATION OF CURRENT UICé 20$: RETURN ;Cê ë .ENDCì í î ;+%ï ; **-$MAPTK-MAP TASK ADDRESS WINDOWOð ;IDñ ; THIS ROUTINE IS CALLED TO MAP THE FIRST WINDOW BLOCK IN A TASK'S3ò ; HEADER IN A MAPPED SYSTEM FROM ITS PCB AND TCB.1ó ;I ô ; INPUTS:Mõ ;,=ö ; R1=POINTER TO NUMBER OF WINDOW BLOCKS IN THE TASK HEADER.I6÷ ; R5=ADDRESS OF THE TASK CONTROL BLOCK FOR THE TASK.ø ;I ù ; OUTPUTS:ú ; 0û ; R1=ADDRESS OF LAST PDR IMAGE IN TASK HEADER.ü ; R2 IS MODIFIED.Mý ;-þ 0ÿ $MAPTK::TST (R1)+ ;POINT TO TASK WINDOW BLOCK- MOV T.PCB(R5),R2 ;PICK UP TASK PCB ADDRESS$. MOV R2,(R1)+ ;SET TASK PCB ADDRESS (W.BPCB)   .IF DF U$$DAS > BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH SEPARATE I/D SPACE ? BEQ 2$ ;IF EQ NO0 ADD #W.BLGH-2,R1 ;POINT TO WINDOW 1 (D-SPACE)) MOV R2,(R1)+ ;SET UP TASK PCB (W.BPCB)5 2$: ;REFERENCE LABELL  .ENDC ; DF U$$DAS   .IF DF P$$LAS 6 BIT #T3.ROV,T.ST3(R5) ;TASK HAVE RESIDENT OVERLAYS?1 BNE 20$ ;IF NE AS, DON'T CHANGE WINDOW BLOCKS  .IFTF 7 MOV (R1)+,(R1) ;INIT HIGH VIRT ADDR (W.BLVR)(W.BHVR)R, MOV P.SIZE(R2),R2 ;PICK UP PARTITION SIZE  .IFTS 7 SUB T.OFF(R5),R2 ;REDUCE BY TASK OFFSET IN PARTITIONS  .IFTF * MOV R2,-(SP) ;PUSH REQUIRED WINDOW SIZE SWAB (SP) ;CONVERT TO BYTES ! RORB (SP) ;(" ROR (SP) ;# ROR (SP) ;9$ ADD (SP)+,(R1) ;COMPLETE HIGH VIRTUAL ADDRESS (W.BHVR) % DEC (R1)+ ;T& ' .IFTK( ,) TST (R1)+ ;POINT TO WINDOW SIZE (W.BATT))* MOV R2,(R1)+ ;SET WINDOW SIZE (W.BSIZ) 8+ MOV T.OFF(R5),(R1)+ ;SET OFFSET IN PARTITION (W.BOFF)$, INC R1 ;POINT TO NUMBER OF PDR'S- . .IFF/ 70 ADD #W.BNPD-W.BATT,R1 ;POINT TO NUMBER OF PDR'S BYTEA1 2 .IFTF3 &4 ASL R2 ;SHIFT # PDR'S TO HIGH BYTE45 SWAB R2 ;# PDR'S TO LO BYTE, LAST PDR SIZE TO HI06 SUB #377,R2 ;INC # PDR'S & DEC LAST PDR SIZE07 SBC R2 ;IF CS, EVEN BOUNDARY, REDUCE # PDR'S.8 MOVB R2,(R1)+ ;SET NUMBER OF PDR'S (W.BNPD)9 ROR R2 ;ADJUST CORRECT SIZET/: MOV R2,(R1) ;SET SIZE FOR LAST PDR (W.BLPD) 4; MOVB #6,(R1) ;SET FOR READ/WRITE ACCESS (W.BLPD)< 10$: RETURN ; = > .IFTP? @@ 20$: ADD #W.BLPD-W.BLVR,R1 ;POINT TO LAST WORD OF WINDOW BLOCK A RETURN ;B C .ENDCD E F ;+$G ; **-$CALTA-CALCULATE TRAP ADDRESSH ;RHI ; THIS ROUTINE IS CALLED TO CALCULATE WHETHER A TRAP ADDRESS SHOULD BEDJ ; STORED ODD (SERVICE IN SUPERVISOR MODE) OR EVEN (SERVICE IN USEREK ; MODE), ACCORDING TO THE PREVIOUS MODE FROM THE DIRECTIVE CALL ANDTHL ; THE VALUE OF THE LOW ORDER BIT OF THE ADDRESS SPECIFIED (1 = SERVICEM ; IN "OTHER" MODE).WN ;) O ; INPUTS:RP ; Q ; R2=SPECIFIED00R¢mS¤mg´cÚµcÛ¶c�·c›’ ADDRESS.AR ;. S ; OUTPUTS:T ;N!U ; R2=TRAP ADDRESS TO BE STORED.R"V ; ALL OTHER REGISTERS PRESERVED.W ;-X Y Z .IF DF S$$LIB[ *\ $CALTA::TST R2 ;TRAP ADDRESS SPECIFIED?%] BEQ 20$ ;IF EQ NO, RETURN AS ZEROE4^ BIT #^CPSMODE&PMODE,PS ;PREVIOUS MODE SUPERVISOR?(_ BNE 20$ ;IF NE NO, USE ADDRESS AS IS%` BIT #1,R2 ;ODD ADDRESS SPECIFIED?La BEQ 10$ ;IF EQ NOF+b DEC R2 ;MAKE ADDRESS EVEN FOR USER MODE1 c BR 20$ ;4d 10$: INC R2 ;MAKE ADDRESS ODD FOR SUPERVISOR MODEe 20$: RETURN ;Af g .ENDCh i j .END R2=TRAP ADDRESS TO BE STORED.R"V ; ALL OTHER REGISTERS PRESERVED.W ;-X Y Z .IF DF S$$LIB[ *\ $CALTA::TST R2 ;TRAP ADDRESS SPECIFIED?%] BEQ 20$ ;IF EQ NO, RETURN AS ZEROE4^ BIT #^CPSMODE&PMODE,PS ;PREVIOUS MODE SUPERVISOR?(_ BNE 20$ ;IF NE NO, USE ADDRESS AS IS%` BIT #1,R2 ;ODD ADDRESS SPECIFIED?La BEQ 10$ ;IF EQ NOF+b DEC R2 ;MAKE ADDRESS EVEN FOR USER MODE1 c BR 20$ ;4d 10$: INC R2 ;MAKE ADDRESS ODD FOR SUPERVISOR MODEe 20$: R .TITLE TDSCHR .IDENT /13.03/A;RK; COPYRIGHT (c) 1982, 1983, 1984, 1985 BY DIGITAL EQUIPMENT CORPORATION. ; ALL RIGHTS RESERVED.;;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;E ; D. N. CUTLER 11-AUG-73 ;- ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY: ;; J. R. KAUFFMAN; T. M. MARTIN; B. S. MCCARTHY;R-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:I;R; B. S. MCCARTHY; J. W. BERZLE; L. B. MCCULLEY; C. A. SILVER; J. R. KAUFFMAN;5; MODIFIED BY:;C ; J. W. BERZLE 04-APR-86 13.00;>; JWB170 -- CORRECT UIC FOR TASK RUNNING OUT OF CLOCK QUEUE;"; B. S. MCCARTHY 15-DEC-86 13.01; 9; BM379 -- DON'T DECLARE S.E. IN ROUND ROBIN SCHEDULER$; UNLESS THE CURRENT TASK MOVES.;.; K. L. NOEL 15-DEC-86 13.02; 9; KLN030 -- SET INTERRUPT ENABLE BIT ON WATCHDOG TIMERX;P; K. L. NOEL 08-JUN-87 13.03; -; KLN053 -- ADD SUPPORT FOR TICK INCREMENT;.11; TIME DEPENDENT SCHEDULING AND DEVICE TIME OUTB2;3; MACRO LIBRARY CALLSP4;15,6 .MCALL CLKDF$,HDRDF$,HWDDF$,TCBDF$,PCBDF$47 CLKDF$ ;DEFINE CLOCK QUEUE CONTROL BLOCK OFFSET'8 HDRDF$ ;DEFINE TASK HEADER OFFSETSE&9 HWDDF$ ;DEFINE HARDWARE REGISTERS:; .IF DF R$$PRO< = .MCALL UPTUP$ ;UPTIME UPDATE>? .ENDC ; DF R$$PRO@A .IF DF N$$DIREBC .MCALL LNMDF$D)E LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETSFG .ENDC ;DF N$$DIRPHI.J TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS3K PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSALM;+N; **-$CKINT-CLOCK INTERRUPTWO;TFP; THIS ROUTINE IS ENTERED AS THE RESULT OF A CLOCK INTERRUPT. $INTSVEQ; IS CALLED TO SAVE REGISTERS R4 AND R5 AND $INTCT IS INCREMENT. IFSBR; THE RESULT IS NONZERO, THEN A JUMP TO $INTXT IS EXECUTED. ELSECS; A FORK IS EXECUTED SO THAT PENDING CLOCK INTERRUPTS CAN BE PRO- T; CESSED. U;-VW$CKINT:: ;;;REFERENCE LABELNXY .IF NDF K$$DASZ/[ JSR R5,$INTSE ;;;CALL INTERRUPT SAVE ROUTINEB+\ .WORD ^C&PR7 ;;;NEW PRIORITY IS PR5A]^ .IFF ; NDF K$$DAS_3` MOV R5,-(SP) ;MIMIC ACTIONS OF $DIRSV TO PREVENTE*a MOV R4,-(SP) ;WASTE TIME ON I/D SYSTEMS!b DEC $STKDP ;;;SWITCH STACKS ? 6c5$: BIC #^C&PR7,@#PS ;;;DROP TO DEVICE PRIORITY-d CACHE$ SAVE ;;;SAVE BYPASS STATE OF CACHE 9e MOV #$INTSF,-(SP) ;;;PUSH ADDRESS OF EXEC EXIT ROUTINEOfg .ENDC ; DF K$$DAShijkl .IF DF K$$W11m6m MOV #103,K$$W11 ;;;ENABLE AND START TIMER ;KLN030o ;**-1p .ENDCqrs .IF DF P$$3XXt-u TST @$CKCSA ;;;ENSURE CLOCK ISN'T LONESOM( v ;;;(IF WE'RE ON A PRO-3XX)wx .ENDC ; DF P$$3XXyz{ .IF DF M$$PRO|$} CALL $STTIC ;UPDATE SANITY TIMER,~ BIT $CKURM,@$CPURM ;DO WE MAINTAIN CLOCK? BEQ 7$ ;IF EQ NO -- EXIT€� .IFTF‚-ƒ MOV #$INTCT,R4 ;;;POINT TO INTERRUPT COUNTC)„ INC (R4) ;;;INCREMENT INTERRUPT COUNT… BEQ 10$ ;;;IF EQ F00SªmqmzgM{güfàýfáþfDATAORKW†‡ .IFTVˆ‰7$: ;;;REFERENCE LABELTŠ‹ .ENDCŒ�"Ž RETURN ;;;EXIT FROM INTERRUPT#�10$: CALL $FORK0 ;;;EXECUTE FORKE�‘;C1’; UPDATE ABSOLUTE AND REAL TIME OF DAY AND DATE“;”•;+–; ** W A R N I N G **D—;P˜; SPM HOOKPOINT NUMBER 67.™;I+š; DO NOT CHANGE THE INSTRUCTION FOLLOWINGI›; LABEL WITHOUT CHECKING SPMœ;-�-ž$SPH67==. ;SPM CHANGES THE INSTRUCTION ATN!Ÿ ;THE LOCATION OF THIS LABELR 6¡UPTIM: MOV #$TKPS+2,R4 ;POINT PAST CONVERSION VECTOR2¢ MOV #$TTNS+2,R5 ;POINT PAST CURRENT TIME VECTOR%£10$: MOV #$TTNS-10,R2 ;POINT TO DAYR¤ INC -(R5) ;UPDATE A COUNTERU"¥ CMP -(R4),(R5) ;EXCEEDED LIMIT?¦ BHI 20$ ;IF HI NOY§ CLR (R5) ;RESET COUNTER*¨ CMP R5,R2 ;CHECK FOR LAST DAY OR MONTH© BHI 10$ ;IF HI NO(ª INC (R5) ;DAY AND MONTH ARE 1 ORIGIN« BCS 10$ ;IF CS NOT DAY"¬ MOV -(R2),R1 ;GET CURRENT MONTH7­ MOVB $DYPMN-1(R1),R0 ;GET DAYS FOR NEXT MONTH PLUS 1A-® MOV R0,(R4) ;MOVE TO DAYS PER MONTH LIMITC,¯ DEC R1 ;IS CURRENT MONTH ENDING JANUARY?° BNE 10$ ;IF NE NO%± BIT #3,-(R2) ;IS THIS A LEAP YEAR?² BNE 10$ ;IF NE NO )³ INC (R4) ;INCREMENT DAYS FOR FEBRUARY? ´ BR 10$ ;µ20$: ;REFERENCE LABEL¶· .IF DF R$$PRO¸+¹ DEC $NVRTM ;TIME TO UPDATE O/S UPTIME ?Iº BNE 25$ ;IF NE NO;» UPTUP$ ;UPDATE UPTIME¼25$: ;REFERENCE LABEL½¾ .ENDC ; DF R$$PRO¿+À TST $SHFTM ;SHF TIMER ALREADY EXPIRED ?EÁ BEQ 30$ ;IF EQ, YESR5 DEC $SHFTM ;DECREMENT TIMER BLOCKING SHF REQUESTSC0Ã30$: INC $ABTIM ;UPDATE ABSOLUTE TIME COUNTERÄ BNE TDS ;IF NE NO OVERFLOW8Å INC $ABTIM-2 ;COUNT OVERFLOW IN SECOND WORD OF $ABTIM0Æ MOV #$CLKHD,R0 ;POINT TO CLOCK QUEUE LISTHEAD.Ç40$: MOV (R0),R0 ;GET ADDRESS OF NEXT ENTRY"È BEQ TDS ;IF EQ NO MORE IN LIST*É DEC C.TIM+2(R0) ;ADJUST HIGH ORDER TIME Ê BR 40$ ;ËÌ;FÍ; TIME DEPENDENT SCHEDULING Î;OÏÐTDS: ;REFERENCE LABELÑÒÓ .IF DF M$$PROÔ)Õ MOV KISAR6,-(SP) ;SAVE MAPPING POINTERI"Ö CLR KISAR6 ;POINT TO REAL ZERO+× INC @#140110 ;BUMP ABSOLUTE LOCATION 110B,Ø MOV (SP)+,KISAR6 ;RESTORE MAPPING POINTERÙÚ .IFF Û(Û INC @$CKINC ;BUMP TICKER ;KLN053=Û ;ABSOLUTE LOCATION 110 OR TPR5 IF CPR ON KXJ-11 ;KLN053OÞ .ENDC ;**-2ßà.á MOV $CLKHD,R4 ;GET ADDRESS OF NEXT IN QUEUE â BEQ 11$ ;IF EQ, NONE IN LIST,ã TST C.TIM+2(R4) ;HIGH ORDER PART NONZERO?ä BNE 11$ ;IF NE, YESL$å CMP $ABTIM,C.TIM(R4) ;TIME TO GO?æ BLO 11$ ;IF LO, NO1ç MOV (R4),$CLKHD ;REMOVE ENTRY FROM CLOCK QUEUE,è MOVB C.RQT(R4),R5 ;GET ENTRY REQUEST TYPE-é ADD R5,PC ;DISPATCH TO PROCESSING ROUTINE!ê10$: BR 20$ ;MARK TIME REQUEST 1ë BR 30$ ;TASK REQUEST WITH PERIODIC RESCHEDULE $ì BR 30$ ;SINGLE SHOT TASK REQUEST4í BR 12$ ;SINGLE SHOT INTERNAL SUBROUTINE (C.SYST)+î BR 15$ ;SINGLE SHOT INTERNAL SUBROUTINEIïð;+ñ; CLEAR STOP BIT AND REALLOCATE PARTITIONò;1ó(ô MOV C.TCB(R4),R0 ;PICK UP TCB ADDRESS8õ CALL $EXRQN ;CLEAR STOP BIT AND REALLOCATE PARTITION ö BR TDS ;÷(ø11$: JMP DVOUT ;JUMP TO DEVICE TIMOUTùú;Y,û; SINGLE SHOT INTERNAL SUBROUTINE (TYPE 6)ü;ý2þ; THIS SECTION HANDLES URM SPECIFIC CLOCK BLOCKSÿ12$: ;REFERENCE LABEL .IF DF M$$PRO9 MOV #TDS,-(SP) ;PUSH RETURN ADDRESS FROM EITHER DRIVERS. ;(IF WE'RE NOW ON CORRECT CPU) OR $FORK0 ;(IF WE'RE NOT) = BIT C.URM(R4),@$CPURM ;ARE WE ALREADY ON CORRECT PROCESSORR. BNE 17$ ;IF NE YES, GO CALL THE DRIVER AND  ;CONTINUE CLQ SCAN#  TST (R4)+ ;POINT PAST LINK WORDD6  MOV C.URM-C.RQT(R4),(R4)+ ;PUT URM IN CORRECT PLACE8  CMP (R4)+,(R4)+ ;POINT PAST LINK AND PC IN FORK BLOCK'  CALL $FORK0 ;GET TO RIGHT PROCESSOR2& MOV R3,R4 ;COPY FORK BLOCK POINTER8 SUB #C.TIM,R4 ;POINT BACK TO BEGINNING OF CLOCK BLOCK" BR 17$ ;GO MAP DRIVER AND CALL;PI; SINGLE SHOT INTERNAL SUBROUTINE (TYPE 8, ALSO TYPE 6 ON UNIPROCESSOR)A;  .IFTF ;DF M$$PROE15$: ;REFERENCE LABEL .IFT ;DF M$$PRO8 MOV00S²m¤mg´cÚµcÛ¶c�·c›’ #TDS,-(SP) ;PUSH RETURN ADDRESS TO SCAN CLQ AGAIN .IFTF ;DF M$$PRO 5 17$: MOV KINAR5,-(SP) ;SAVE KERNEL INSTR ADDR REG 5C!"#$ .IF DF K$$DAS%0& MOV KDSAR5,-(SP) ;SAVE KERNEL DATA ADDR REG 51' MOV C.AR5(R4),KDSAR5 ;MAP DRIVER IN DATA SPACEN() .IFTF*2+ MOV C.AR5(R4),KINAR5 ;MAP DRIVER IN INSTR SPACE,;+-; ** W A R N I N G ** .; /; SPM HOOKPOINT NUMBER 66.0;+1; DO NOT CHANGE THE INSTRUCTION FOLLOWINGR2; LABEL WITHOUT CHECKING SPM3;-4-5$SPH66==. ;SPM CHANGES THE INSTRUCTION ATN!6 ;THE LOCATION OF THIS LABEL 78*9 CALL @C.SUB(R4) ;CALL SYSTEM SUBROUTINE:; .IFT<3= MOV (SP)+,KDSAR5 ;RESTORE KERNEL DATA ADDR REG 5E>? .ENDC@A4B MOV (SP)+,KINAR5 ;RESTORE KERNEL INSTR ADDR REG 5CD .IFT ;DF M$$PROE F RETURN ;PGH .IFF ;DF M$$PROI J BR TDS ;KL .ENDC ;DF M$$PROPMNO;UP; MARK TIME REQUESTNQ;AR5S20$: MOV C.SRC(R4),R0 ;PICK UP EVENT FLAG MASK WORDS4T MOV C.DST(R4),R1 ;PICK UP EVENT FLAG MASK ADDRESS(U MOV C.TCB(R4),R5 ;PICK UP TCB ADDRESS3V CALL $SETMG ;SET EFN AND UNLOCK IF GROUP GLOBAL"W CLR R5 ;RESET CLOCK BLOCK TYPE)X MOV C.AST(R4),R3 ;GET AST TRAP ADDRESS.#Y BEQ 40$ ;IF EQ NO AST SPECIFIEDS$Z MOVB C.EFN(R4),R2 ;GET EFN NUMBER0[ MOV R4,R1 ;COPY ADDRESS OF CLOCK QUEUE ENTRY,\ TST (R4)+ ;POINT TO CONTROL BLOCK LENGTH5] MOV #C.LGTH,(R4)+ ;SET LENGTH OF AST CONTROL BLOCK7^ MOV #8.*2,(R4)+ ;SET BYTES TO ALLOCATE ON TASK STACK(_ MOV R3,(R4)+ ;INSERT AST TRAP ADDRESS-` MOV #1,(R4)+ ;SET NUMBER OF AST PARAMETERSE,a MOV R2,(R4) ;INSERT EFN AS AST PARAMETER"b CALL $QASTT ;QUEUE AST TO TASK c BR TDS ;de;Tf; SCHEDULE REQUESTg;Sh-i30$: MOV C.TCB(R4),R0 ;GET TASK TCB ADDRESS.jk .IF NDF N$$DIRBk ;JWB170P$l MOV C.UIC(R4),R1 ;GET REQUEST UICmn .IFFTo(p TSTB C.NAM(R4) ;IS THERE A UIC OR CTX.q BNE 35$ ;IF NE, GET UIC FROM CONTEXT BLOCK$r MOV C.UIC(R4),R1 ;GET REQUEST UIC s BR 37$ ;2t35$: MOV C.CTX(R4),R1 ;GET CONTEXT BLOCK POINTER)u MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGR#v MOV R1,KISAR6 ;MAP CONTEXT BLOCKC&w TSTB C.DDSL+140000 ;IS THERE A DDS?#x BEQ 36$ ;IF EQ, DON'T PROPAGATE*y MOV R1,$CTXPT ;PROPAGATE CONTEXT BLOCK+z36$: MOV C.CUIC+140000,R1;GET REQUEST UIC ${ MOV (SP)+,KISAR6 ;RESTORE MAPPING|37$: ;REFERENCE LABEL}~ .ENDC ;NDF N$$DIR€� .IF DF A$$CNT‚0ƒ MOV C.UAB(R4),$CKUAB ;GET UAB TO BILL TASK TO„… .IFTF†'‡ CALL $TSKRT ;REQUEST TASK EXECUTION)ˆ‰ .IFTEŠ/‹ CLR $CKUAB ;DO NOT NEED UAB ADDRESS ANYMOREAŒ� .ENDCŽ�2�40$: MOV R4,R0 ;SET ADDRESS OF BLOCK TO RELEASE%‘ CMPB #C.SCHD,R5 ;PERIODIC REQUEST?R’ BEQ 50$ ;IF EQ YES5“ CALL $DCLKA ;DEALLOCATE CLQ BLOCK WITH ACCOUNTINGR ” JMP TDS ;I6•50$: MOV C.RSI+2(R0),R1 ;SET HIGH ORDER PART OF TIME/– MOV C.RSI(R0),R2 ;SET LOW ORDER PART OF TIME— MOV R5,R4 ;SET REQUEST TYPER— ;JWB170 — .IF DF N$$DIR ;JWB170— ;JWB170T3— TSTB C.NAM(R0) ;IS THERE A UIC OR CTX ;JWB170O5— BEQ 55$ ;IF EQ, NO CONTEXT BLOCK POINTER ;JWB170<— BIS #100000,R4 ;SET HIGH BIT TO INDICATE CTX PTR ;JWB170%—55$: ;REFERENCE LABEL ;JWB170 !— .ENDC ;DF N$$DIR ;JWB170C— ;JWB170C4˜ MOV C.TCB(R0),R5 ;SET ADDRESS OF REQUEST TASK TCB.™ CALL $CLINS ;REINSERT ENTRY IN CLOCK QUEUE š JMP TDS ;P›œ;M�; DEVICE TIME OUTTž;EŸ( DVOUT: TST $TTNS ;ONE SECOND ELAPSED?¡ BNE ROBIN ;IF NE NO E¢ MOV #$SCDVT,-(SP) ;SET ADDRESS OF DEVICE TABLE SCANNING CO-ROUTINE)£10$: CALL @(SP)+ ;GET NEXT UCB ADDRESS !¤ BCS ROBIN ;IF CS END OF TABLEG$¥ MOV S.KRB(R4),R2 ;GET KRB ADDRESS¦ BEQ 11$ ;IF EQ NO KRB ,§ MTPS K.PRI(R2) ;;;SET THE DEVICE PRIORITY#¨11$: TSTB U.STS(R5) ;;;UNIT BUSY?)© BPL 20$ ;;;IF PL NOS$ª TSTB S.CTM(R4) ;;;TIMEOUT ACTIVE?« BEQ 20$ ;IF EQ NO¬­ .IF DF M$$PRO®9¯ CMPB #377,S.CTM(R4) ;WAITING FOR INTERPROCESSOR FORK ?N-° BEQ 20$ ;IF EQ YES, DON'T TOUCH INTERLOCKS±00SºmqmzgM{güfàýfáþfDATA² .ENDC ; DF M$$PRO³,´ DECB S.CTM(R4) ;;;DECREMENT TIMEOUT COUNT'µ BNE 20$ ;;;IF NE -- MORE TIME TO GON¶·;E8¸; DRIVER HAS TIMED OUT. CALL HIM AT HIS TIMEOUT ENTRY.¹; º»¼ .IF DF M$$PRO½1¾ DECB S.CTM(R4) ;;;SET TIMED OUT FLAG FOR LATER5$¿ MOV #12$,R3 ;;;SET UP FOR $EXDOP.À CALL $EXDOP ;;;CALL ROUTINE TO CALL DRIVERÁÂ;ICÃ; AT THIS POINT, IF DOESNT HAVE A KRB ADDRESS, THEN HE WAS CALLEDO$Ä; BECAUSE OF THE WAY $EXDOP WORKS.Å;QÆ!Ç20$: MTPS #0 ;;;LOWER PRIORITYNÈ BR 10$ ;GO BACK FOR MOREÉÊË;C<Ì; INTERNAL SUBROUTINE TO CALL DRIVER AT HIS TIMEOUT ENTRY.>Í; THIS SUBROUTINE IS EXECUTED ON THE CPU TO WHICH THE DRIVERÎ; IS ATTACHED.Ï;.Ð(Ñ12$: MOV (R5),R3 ;RESTORE DCB ADDRESS$Ò MOV S.KRB(R4),R2 ;GET KRB ADDRESSÓ BEQ 13$ ;IF EQ NO KRBC&Ô MTPS K.PRI(R2) ;SET DEVICE PRIORITY)Õ13$: TSTB U.STS(R5) ;;;UNIT STILL BUSY?H)Ö BPL 30$ ;;;IF PL NO -- DON'T CALL HIM 4× TSTB S.CTM(R4) ;;;DO WE STILL SHOW HIM TIMED OUT?)Ø BPL 30$ ;;;IF PL NO -- DON'T CALL HIMC'Ù CLRB S.CTM(R4) ;;;SHOW HIM TIMED OUTBÚÛ .ENDCÜÝ=Þ MOV #IE.DNR&377,R0 ;;;SET DEVICE NOT READY STATUS FOR DRVRC;ß MOV D.DSP(R3),R1 ;;;GET ADDRESS OF DRIVER DISPATCH TABLEV3à MOV KINAR5,-(SP) ;;;SAVE KERNEL INSTR ADDR REG 5Gáâã .IF DF K$$DASä2å MOV KDSAR5,-(SP) ;;;SAVE KERNEL DATA ADDR REG 5æç .IFTFè-é MOV D.PCB(R3),R3 ;;;GET DRIVER PCB ADDRESSL+ê BEQ 15$ ;;;IF EQ DRIVER IS PART OF EXECD8ë MOV P.REL(R3),KINAR5 ;;;MAP THE DRIVER IN INSTR SPACEìí .IFTIî7ï MOV P.REL(R3),KDSAR5 ;;;MAP THE DRIVER IN DATA SPACEðñ .IFTFò(ó15$: TST R2 ;;;IS THERE A KRB ADDRESSô BEQ 17$ ;;;IF EQ NO),õ MOVB K.CON(R2),R3 ;;;GET CONTROLLER INDEX"ö MOV (R2),R2 ;;;GET CSR ADDRESS÷ø; :ù; CALL DRIVER AT TIMEOUT ENTRY POINT WITH THE ARGUMENTS:ú; &û; R0=DEVICE TIMEOUT STATUS 'IE.DNR'.ü; R2=ADDRESS OF DEVICE CSR.Iý; R3=CONTROLLER INDEX.+þ; R4=ADDRESS OF THE STATUS CONTROL BLOCK.P)ÿ; R5=ADDRESS OF THE UNIT CONTROL BLOCK.S;(; IF S.KRB=0 THEN R2, R3 ARE UNDEFINED;P;+; ** W A R N I N G **.;; SPM HOOKPOINT NUMBER 64.;B+ ; DO NOT CHANGE THE INSTRUCTION FOLLOWING. ; LABEL WITHOUT CHECKING SPM ;- - $SPH64==. ;SPM CHANGES THE INSTRUCTION ATL! ;THE LOCATION OF THIS LABEL '17$: CALL @D.VOUT(R1) ;;;ENTER DRIVERS .IFT5 MOV (SP)+,KDSAR5 ;;;RESTORE KERNEL DATA ADDR REG 5  .ENDC6 MOV (SP)+,KINAR5 ;;;RESTORE KERNEL INSTR ADDR REG 5 .IF DF M$$PRO#30$: MTPS #0 ;;;ALLOW INTERRUPTS  RETURNW!" .IFF*##$20$: MTPS #0 ;;;ALLOW INTERRUPTS% BR 10$ ;GO FOR SOME MORE&' .ENDC()*;E*+; EXECUTIVE LEVEL ROUND ROBIN SCHEDULING,;S-.ROBIN: ;REF LABEL/01 .IF DF R$$NDC2!3 DEC $RNDCT ;TIME TO SCHEDULE?U4 BNE SWAP ;IF NE NO75 MOV $RNDC,$RNDCT ;RESET CLOCK TICKS TO NEXT INTERVALA<5 MOV #SWAP,-(SP) ;ASSUME DIRECT EXIT TO DISK SWAP ; BM3795 ; BM379D5 .IF DF M$$PRO ; BM379O5 ; BM379 <5 MOV #60$,-(SP) ;THIS WILL PREVENT MULTIPLE CALLS ; BM37935 ;TO $DRDSE IF MULTIPLE RUNNING TASKS ; BM379O5 ;ARE MOVED. ; BM3795 ; BM379O"5 .ENDC ; DF M$$PRO ; BM3795 ; BM379>7 MOV #$ACTHD-T.ACTL,R1 ;SET ADDRESS OF PREVIOUS ENTRY ;**-11810$: MOV R1,R0 ;SAVE ADDRESS OF PREVIOUS ENTRYC/9 MOV T.ACTL(R0),R1 ;GET ADDRESS OF NEXT ENTRY;)9 BEQ 60$ ;IF EQ END OF LIST ; BM3794; CMPB $RNDH,T.PRI(R1) ;PRIORITY IN RANGE? ;**-1< BLO 10$ ;IF LO NO/=20$: CMPB $RNDL,T.PRI(R1) ;PRIORITY IN RANGE? != BHI 60$ ;IF HI NO ; BM379P? ;**-1 @A .IF NDF M$$PRODB C TST T.STAT(R1) ;TASK BLOCKED?DE .IFF F*G BIT #^CTS.RUN,T.STAT(R1) ;TASK BLOCKED?HI .ENDCJKL BNE 30$ ;IF NE YES(M BIT #T2.SPN!T2.STP!T2.WFR,T.ST2(R1) ;N BEQ 40$ ;IF EQ NO-O30$: MOV R1,R0 ;SAVE ADDRESS OF LAST ENTRY;/P MOV T.ACTL(R0),R1 ;GET ADDRESS OF NEXT ENTRYC Q BR 20$ ;!R00SÂmTÉmg´cÚµcÛ¶c�·c›’40$: TST T.ACTL(R1) ;NULL TASK?"R BEQ 60$ ;IF EQ YES ; BM379R ; BM379R R .IF NDF M$$PRO ; BM379R ; BM379 7R CMP R1,$TKTCB ;ABOUT TO MOVE CURRENT TASK? ; BM379(!R BNE 45$ ;IF NE NO ; BM379>R MOV #$DRDSE,-(SP) ;FORCE SIGNIFICANT EVENT AT END ; BM379R ; BM379E"R .IFF ; NDF M$$PRO ; BM379R ; BM379$BR BIT #TS.RUN,T.STAT(R1) ;TASK RUNNING ON SOME PROCESSOR ; BM379!R BEQ 45$ ;IF EQ NO ; BM379 =R MOV #$DRDSE,(SP) ;FORCE SIGNIFICANT EVENT AT END ; BM379QR ; BM379;"R .ENDC ; DF M$$PRO ; BM379R ; BM379BDR45$: MOV T.ACTL(R1),T.ACTL(R0) ;REMOVE TCB FROM TASK LIST ; BM379+U MOV R1,R2 ;SAVE ADDRESS OF TCB ;**-2M(V MOV R0,R1 ;SET ADDRESS OF LAST ENTRY-W50$: MOV R1,R0 ;SAVE ADDRESS OF LAST ENTRYE/X MOV T.ACTL(R0),R1 ;GET ADDRESS OF NEXT ENTRY 4Y CMPB T.PRI(R1),T.PRI(R2) ;IN SAME PRIORITY CLASS?Z BEQ 50$ ;IF EQ YES1[ MOV R2,T.ACTL(R0) ;SET ADDRESS OF NEXT IN LAST(:\ MOV R1,T.ACTL(R2) ;SET ADDRESS OF NEXT IN REMOVED ENTRY(] MOV R2,R0 ;SET ADDRESS OF LAST ENTRY ^ BR 20$ ;_=_60$: RETURN ;TO SWAP, WITH POSSIBLE INTERMEDIATE ; BM379L!_ ;STOP AT $DRDSE ; BM379D` .ENDCabc;Hd; DISK SWAPPING ALGORITHM - REDUCE SWAPPING PRIORITY OF RESIDENT TASKSe;SfgSWAP: ;REF LABEL,hij .IF DF S$$WPCk3l DEC $SWPCT ;TIME TO MODIFY SWAPPING PRIORITIES??m BNE 70$ ;IF NE NOS<n MOV $SWPC,$SWPCT ;RESET CLOCK TICKS TO NEXT SWAP INTERVAL2o MOV $PARHD,R5 ;POINT TO PARTITION LIST LISTHEAD-p10$: TST P.SUB(R5) ;ANY MORE SUBPARTITIONS? q BEQ 20$ ;IF EQ NOR3r MOV P.SUB(R5),R5 ;POINT TO NEXT SUBPARTITION PCB>s BIT #PS.FXD!PS.CHK!PS.CKP!PS.CKR!PS.OUT!PS.COM,P.STAT(R5) ;3t BNE 10$ ;IF NE NOT CHECKPOINTABLE RESIDENT TASKE)u MOV P.HDR(R5),R4 ;POINT TO TASK HEADEREvw .IF DF X$$HDRx"y BNE 15$ ;IF NE RESIDENT HEADER/z MOV P.REL(R5),KISAR6 ;MAP TO EXTERNAL HEADER"{ MOV #140000,R4 ;AND POINT TO IT|} .IFTF ; DF X$$HDR~715$: CLR R0 ;CALCULATE THE MINIMUM SWAPPING PRIORITYT€ SUB $SWPR,R0 ;E�‚ƒ .ENDC ; DF X$$HDR„…4† CMPB H.SPRI(R4),R0 ;SWAPPING PRIORITY AT MINIMUM?‡ BLE 10$ ;IF LE YES,ˆ DECB H.SPRI(R4) ;REDUCE SWAPPING PRIORITY ‰ BR 10$ ;0Š20$: MOV P.MAIN(R5),R5 ;POINT BACK TO MAIN PCB$‹ MOV R5,R0 ;COPY MAIN PCB POINTER0Œ CALL $NXTSK ;ATTEMPT TO REALLOCATE PARTITION'� MOV (R5),R5 ;POINT TO NEXT MAIN PCBEŽ BNE 10$ ;IF NE THERE IS ONEA�70$: ;REF LABEL�‘ .ENDC’“”;5R•; EXIT TIME DEPENDENT SCHEDULE IF THERE ARE NOT REMAINING UNPROCESSED CLOCK TICK–;C—0˜TIMXT: DEC $INTCT ;ANY MORE TICKS TO PROCESS?™ BGE 10$ ;IF GE YES š RETURN ;E›10$: JMP UPTIM ;Rœ�;+"ž; **-$NLTMO-NULL TIMEOUT ROUTINEŸ;MF ; THIS ROUTINE MAY BE SPECIFIED AS THE TIMEOUT ROUTINE IN A DRIVER'SI¡; DISPATCH TABLE. IT SIMPLY BYPASSES ALL UNITS ON THE CURRENT DCB WHENP ¢; CALLED.M£;C ¤; INPUTS:$¥; )¦; AS FOR NORMAL DRIVER TIMEOUT ROUTINE.§;N ¨; OUTPUTS:©;Aª; CURRENT DCB IS NO LONGER CONSIDERED FOR CURRENT TIMEOUT SCAN.E«;-¬­$NLTMO:: ;REFERENCE LABELC®¯ .IF DF K$$DAS°0± CLR S$$SPC+4(SP) ;FORCE $SCDVT ON TO NEXT DCB²³ .IFF ; DF K$$DAS+´0µ CLR S$$SPC+2(SP) ;FORCE $SCDVT ON TO NEXT DCB¶· .ENDC ; DF K$$DAS¸4¹ INCB S.CTM(R4) ;RESET TIMEOUT COUNT FOR NEXT TIME º RETURN ;E»¼½¾ .ENDRRENT DCB WHENP ¢; CALLED.M£;C ¤; INPUTS:$¥; )¦; AS FOR NORMAL DRIVER TIMEOUT ROUTINE.§;N .TITLE SYSDF .IDENT /10.02/;C; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; D. N. CUTLER 23-AUG-73;/; PREVIOUSLY MODIFIED FOR RSX-11M-PLUS V2.1 BY:;; D. R. DONCHIN ; T. LEKAS; T. M. MARTIN; B. S. MCCARTHY;$; MODIFIED FOR RSX-11M-PLUS V2.2 BY:;; H. HUANG 10-MAY-83 10.00;2; HH174 -- C00TÊmqmzgM{güfàýfáþfDATALEAN UP ERROR CODES FOR LOGICAL NAME; DIRECTIVES;9; J.R. KAUFFMAN 23-FEB-84 10.01E;C9; JRK298 -- CHANGE CONDITIONALS FOR LOGICAL NAME SUPPORTS;R ; J. C. FRANZINI 22-AUG-84 10.02;DA; JCF173 -- EXPLAIN SYSDEF AND RESOLUTION OF CONDITIONAL OFFSETS; 4; SYSTEM GLOBAL AND CONTROL BLOCK OFFSET DEFINITIONS;-,; GLOBALLY DEFINE THE HIGHEST VECTOR ADDRESS;  .GLOBL R$$MPL,V$$CTR ; D; DEFINE SYSTEM DEPENDENT CONTROL BLOCK OFFSETS AND LENGTHS GLOBALLY;-;1N; The static data structure offsets are defined by invoking the macros without$; the SYSDEF argument. For example:;; .MCALL UCBDF$G; UCBDF$;S0; The static offsets are also defined in EXELIB.;UN; The variable offsets depend on RSXMC conditionals. They are defined here byM; invoking the macros with the SYSDEF argument, and the definitions end up inFI; RSX11M.STB. References in privileged tasks to the variable offsets areE/; resolved when the task is linked to the Exec.H;LO; Tasks should never invoke the data structure macros with the SYSDEF argument,aH; but rather should let the variable offset definitions be resolved from ; RSX11M.STB. ; * .MCALL HWDDF$,PCBDF$,PKTDF$,SCBDF$,TCBDF$ .MCALL UCBDF$,F11DF$s .MCALL ITBDF$ i .MCALL DCBDF$ d .MCALL WDBDF$ .IF DF L$$GCL .MCALL LNBDF$ .ENDC ;DF L$$GCLi5 HWDDF$ ,<=>,SYSDEF ;DEFINE CONDITIONAL MAPPING REGS.a% ;AND FEATURE MASK BITS (VMR LOOKSo& ;FOR F4.CXD TO DISTINGUISH BL9 AND ;BEYOND SYSTEMS.)n7 PCBDF$ <:>,<=>,SYSDEF ;DEFINE PCB OFFSETS AND LENGTH u/ PKTDF$ ,<=>,SYSDEF ;DEFINE I/O PACKET LENGTH e7 ITBDF$ <:>,<=>,SYSDEF ;DEFINE ITB OFFSETS AND LENGTH C* DCBDF$ ,<=>,SYSDEF ;DEFINE DDT OFFSETS ( SCBDF$ <:>,,SYSDEF ;DEFINE SCB OFFSETS, TCBDF$ <:>,<=>,SYSDEF ;DEFINE TCB LENGTH 7 UCBDF$ <:>,<=>,,SYSDEF ;DEFINE CONDITIONAL UCB OFFSETSH5 F11DF$ <:>,<=>,SYSDEF ;DEFINE FILES-11 BLOCK OFFSETS & WDBDF$ ;DEFINE WDB OFFSETS AND BITS .IF DF L$$GCL7 LNBDF$ <:>,<=>,SYSDEF ;DEFINE LNB OFFSETS AND LENGTHS, .ENDC ;DF L$$GCLF1 WS.UDS==WS.UDS ;MAKE USER D SPACE OFFSET GLOBALP e;I9; CAUSE OFFSET DEFINITIONS FROM PREFIX FILES TO BE LISTEDB; S$$YDF=0;I"; SYSTEM GLOBAL SYMBOL DEFINITIONS;;; DIRECTIVE STATUS CODES;:;,8; INSUFFICIENT DYNAMIC CORE AVAILABLE TO SATISFY REQUEST; D.RS1==-1. ;;H,; SPECIFIED TASK NOT INSTALLED IN THE SYSTEM;FD.RS2==-2. ;;N; UNASSIGNED LUN;SD.RS5==-5. ;;L; DRIVER NOT LOADED ;FD.RS6==-6. ;;E; TASK NOT ACTIVEF;$D.RS7==-7. ;; F; TASK NOT SUSPENDED/NO DATA QUEUED/TASK CHECKPOINTING ALREADY ENABLEDK; OR DISABLED/AST RECOGNITION ALREADY ENABLED OR DISABLED/AST ENTRY ALREADYA ; UNSPECIFIEDT;SD.RS8==-8. ;;S!; ISSUING TASK NOT CHECKPOINTABLEN;CD.RS10==-10. ;;Y; RECEIVE BUFFER IS TOO SMALL;H D.RS15==-15. T;S; PRIVILEGE VIOLATIONF;D.RS16==-16. ; ; %; VECTOR ALREADY IN USE (CINT$) V ; D.RS17==-17. ;; NO SWAP SPACE AVAILABLE;A N D.RS18==-18. A ; ; ILLEGAL VECTOR (CINT$) ; D.RS19==-19. ;S; ILLEGAL TABLE NUMBER C;ED.RS20==-20. ;;; LOGICAL NAME NOT FOUND;KD.RS21==-21. ; S;1.; DIRECTIVE ISSUED/NOT ISSUED FROM AST ROUTINE; D.RS80==-80. ; ; 8; CANNOT MAP ISR OR DISABLE-INTERRUPT ROUTINE (CINT$) ; D.RS81==-81. ;S; WINDOW HAS IO IN PROGRESS; O D.RS83==-83. A;; ALIGNMENT ERROR1;D.RS84==-84. ;; ; ADDRESS WINDOW OVERFLOW ; D.RS85==-85. ;;.; INVALID REGION ID;D.RS86==-86. ;;; INVALID WINDOW ID;;D.RS87==-87. ;;U.; INVALID SEND BUFFER SIZE (GREATER THAN 255.);U N D.RS89==-89. T;U!; SPECIFIED LUN IS LOCKED IN USE. ; D.RS90==-90. ;;I ; INVALID UIC ;T D.RS91==-91. ; '; INVALID DEVICE AND/OR UNIT SPECIFIED. ; D.RS92==-92. ;00TÒmUÖmg´cÚµcÛ¶c�·c›’; ; INVALID TIME PARAMETER;.D.RS93==-93. ;;O ; PARTITION/REGION NOT IN SYSTEM;DD.RS94==-94. ;; ; INVALID PRIORITY;D.RS95==-95. ;; ; INVALID LUN8; D.RS96==-96. ;;W+; INVALID EFN OR REQUIRED EFN NOT SPECIFIED ;DD.RS97==-97. ;;N8; PART OF DPB IS OUTSIDE OF ISSUING TASK'S ADDRESS SPACE;ED.RS98==-98. ;;=; INVALID DIC OR DPB SIZEI;D.RS99==-99. ;;; LOGICAL NAME SUPERSEDED ;TD.RSP3==3. ;;S ; EFN WAS SET;D.RS22==2. ;;R; EFN WAS CLEAR9; D.RS00==0. ;;E9; IF DYNAMIC ALLOCATION IS PRESENT DEFINE D$$YNM GLOBALLY ;OD$$YNM==0 ;ALWAYS PRESENT U;<; IF 11/70 EXTENDED MEMORY IS PRESENT DEFINE M$$EXT GLOBALLY;P .IIF DF M$$EXT , M$$EXT==0 ; N; 1; IF MULTIPROCESSOR SYSTEM DEFINE M$$PRO GLOBALLYA; .IIF DF M$$PRO , M$$PRO==M$$PRO; 8; IF MEMORY MANAGEMENT IS PRESENT DEFINE M$$MGE GLOBALLY;PM$$MGE==0 ;ALWAYS PRESENT S ;@; IF SEND / RECEIVE BY REFERENCE PRESENT, DEFINE P$$SRF GLOBALLY; E .IIF DF P$$SRF , P$$SRF==P$$SRF D;N+; IF DSPACE PRESENT, DEFINE K$$DAS GLOBALLY ;S .IIF DF K$$DAS , K$$DAS==K$$DAS N; '; IF P$$D70 DEFINED, DEFINE IT GLOBALLY; . .IIF DF P$$D70 , P$$D70==P$$D70 .IF DF B$$LIN% $BASLN==1 ;INDICATE BASELINE SYSTEM .IFF ; DF B$$LIN % $BASLN==0 ;INDICATE BASELINE SYSTEME .ENDC ; DF B$$LIN; ?; DEFINE MASK OF FEATURES SELECTED AT SYSGEN TIME FOR INCLUSION; IN RSX11M.STB FILE.R;R SFMSK=0 ; .IF DF S$$EXC' SFMSK=SFMSK!SF.STD ;STANDARD EXECUTIVEF .ENDC .IF DF P$$GEN< SFMSK=SFMSK!SF.PGN ;PREGENERATED SYSTEM (EX. RL02/RC25 KIT) .ENDC; DEFINE GLOBAL SYMBOL$ $SGNMK==SFMSK ;SYSGEN FEATURE MASK  .END0==P$$D70 .IF DF B$$LIN% $BASLN==1 ;INDICATE BASELINE SYSTEM .IFF ; DF B$$LIN % $BASLN==0 ;INDICATE BASELINE SYSTEME .ENDC ; DF B$$LIN; ?; DEFINE MASK OF FEATURES SELECTED AT SYSGEN TIME FOR INCLUS .TITLE DLTBLV .IDENT /01.05/;N7; COPYRIGHT (c) 1984 BY DIGITAL EQUIPMENT CORPORATION.R; ALL RIGHTS RESERVED.;R<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; B. S. MCCARTHY 5-MAY-84 ; ;P; MODIFIED BY:; ; J. R. KAUFFMAN 1-MAY-84 01.01;N5; JRK298 -- ADD ENHANCED DEFINITIONS TO DRLOG TABLES;.; T. LEKAS 11-JULY-84 01.02; %; TL301 -- ADD PARSE/MERGE FUNCTIONS ;K ; J. R. KAUFFMAN 1-MAY-85 01.04;B<; JRK303 -- ADD TABLE NUMBER HASHING FOR P/OS COMPATIBILITY;P!; J. R. KAUFFMAN 24-MAY-85 01.05S;E7; JRK307 -- ADD ADDITIONAL LOGICAL DIRECTIVES FOR P/OSM;B); LOGICAL NAME DIRECTIVES DISPATCH TABLES ; A; THIS MODULE WAS SEPARATED FORM QITBL TO FACILITATE PLACEMENT INO); THE FOURTH DIRECTIVE COMMON WITH DRLOG.0;1 .PAGE A .IF DF L$$GCL: .MCALL LNMDF$ ;DEFINE LOGICAL NAME SUBFUNCTION FLAG BITS LNMDF$  .ENDC ;DF L$$GCLI% .MACRO LNSFN ADDR,DPBSIZ,DIRCOM,COND .IF NB COND .IF DF COND .WORD ADDR .BYTE DPBSIZI .BYTE DIRCOM  .IFFN .BLKW 2 .ENDC ;DF CONDJ .IFFA .BLKW 2 .ENDC ;NB CONDS .ENDM .PAGE;+<; SUBFUNCTION DISPATCH TABLE FOR THE LOGICAL NAME DIRECTIVES;- .IF DF L$$GCL;$LSTLG::.WORD 0 ;STORAGE WORD FOR LAST LNB IN LOOKUP CHAINL@$LTBUF::.BLKB 8. ;STORAGE BUFFER FOR DEVICE MNEMONIC AND BINARY) ; UNIT CONVERSION TO AND FROM ASCII<$LGBUF::.BLKW 12. ;STORAGE AREA FOR CREATE DESCRIPTOR BLOCK;+4; LOGICAL NAME OFFSET TABLE FOR TRANSLATION ATTEMPTS;-!$LTMSK::.BYTE LT.TSK ;TASK TABLE.3 .BYTE LT.USR ;USER TABLE (FOR P/OS COMPATIBILITY)N .BYTE LT.SES ;SESSION TABLE .BYTE LT.GRP ;GROUP TABLEB .BYTE LT.SYS ;SYSTEM TABLE$MSKBT::.BYTE 1  .BYTE 2 .BYTE 20R .BYTE 4 .BYTE 10R .BYTE 40N .BYTE 100 .BYTE 200$TRANL::.BYTE LT.SYS .BYTE LT.GRPE+ .BYTE 4 ;LT.USR (FOR P/OS) COMPATIBILITYA .BYTE LT.TSK* .BYTE 2 ;LT.SES - RSX LOCAL/LOGIN TABLE .EVEN .ENDC00UÚmäÜmåßmæàmçámýfáþfDATA ;DF L$$GCLO;+E; SUBFUNCTION TABLE FOR ALL DIRECTIVE ROUTINES ACCESSED THROUGH DRLOG ;- .IF DF L$$GCL!N$$DIR;$LNSFT::1 LNSFN $LNFCL,7,3,L$$GCL ;CLOG$ - P/OS COMPATIBLEA6 LNSFN $LNFTL,9.,3,L$$GCL ;TLOG$ - OLD P/OS COMPATIBLE1 LNSFN $LNDEL,5,3,L$$GCL ;DLOG$ - P/OS COMPATIBLE LNSFN $LNFSD,5,3,N$$DIR ;SDIR$ LNSFN $LNFGD,6.,3,N$$DIR ;GDIR$ LNSFN $LNFSS,7.,4,L$$GCL ;FSS$Y LNSFN $LNCHN,5.,4,L$$GCL ;ACHN$! LNSFN $LNRMS,13.,4,L$$GCL ;PRMS$;! LNSFN $LNFCS,13.,4,L$$GCL ;PFCS$V7 LNSFN $LNFTL,10.,3,L$$GCL ;TLOG$ - NEW P/OS COMPATIBLEL3 LNSFN $LNFTL,10.,3,L$$GCL ;RLOG$ - P/OS COMPATIBLE. LNSFN $LNFCL,7,3,L$$GCL ;CLON$ LNSFN $LNDEL,5,3,L$$GCL ;DLON$ ! LNSFN $LNFTL,10.,3,L$$GCL ;TLON$3! LNSFN $LNFTL,10.,3,L$$GCL ;RLON$EC$LNFHI==<<.-$LNSFT>/4.>-1. ;DEFINE HIGHEST LOGICAL NAME SUBFUNCTION, .ENDC ;DF N$$DIR!L$$GCL I .END$ LNSFN $LNFSS,7.,4,L$$GCL ;FSS$Y LNSFN $LNCHN,5.,4,L$$GCL ;ACHN$! LNSFN $LNRMS,13.,4,L$$GCL ;PRMS$;! LNSFN $LNFCS,13.,4,L$$GCL ;PFCS$V7 LNSFN $LNWhich diskette driveL.; .ASKS is one of the ways Indirect prompts you. In this case you name theM.; drive with the new disk in it. Once you've answered, the name of the driveN.; is substituted wherever 'DISK' appears in a command. Although Indirect hasL.; features that allow you to check for correct syntax, this example commandB.; file does not check to make sure you entered a valid disk name. ;0 ; Labels can have up to 12 letters and numbers. ;# .ASKS LABEL What label do you wantSM.; The volume label is a combination identifier and password to the diskette. ;.; No one can mount the diskette without knowing the label.  ;! MOUNT/FOREIGN/NOSHAREABLE 'DISK'v$.; All disk volumes must be mounted. ANALYZE/MEDIA 'DISK'o.; Looking for bad blocks. INITIALIZE 'DISK' 'LABEL'(.; Putting the RSX format on the volume. DISMOUNT 'DISK' e'.; Dismounting from the /FOREIGN mount.! MOUNT/NOSHAREABLE 'DISK' 'LABEL'n#.; Mounting again as an RSX volume.  CREATE/DIRECTORY 'DISK'K.; Creating a new directory on the volume. It will have the same directorya .; name as your login directory. ;' ; Diskette in 'DISK' is ready for use.E ;'v$.; All disk volumes must be mounted. ANALYZE/MEDIA 'DISK'o.; Looking for bad blocks. INITIALIZE 'DISK' 'LABEL'(.; Putting the RSX format on the volume. DISMOUNT 'DISK' e'.; Dismounting from the /FOREIGN mount.! MOUNT/NOSHAREABLE 'DISK' 'LABEL'n#.; Mounting again as an RSX volume.  CREATE/DIRECTORTI:DON'T LOSE YOUR HEADTI:TO GAIN A MINUTETI:YOU NEED YOUR HEADTI:YOUR BRAINS ARE IN IT SHOW DEVICES SHOW USERS SHOW TIMECNC THIS TASK (TMCLI) ILLUSTRATES THE USE OF THE CLI CONTROL DIRECTIVES PRESENT )C IN RSX-11M V4.0 AND RSX-11M-PLUS V2.0. CFC WHEN SET UP AS A TERMINAL'S CLI, IT PROVIDES THE FOLLOWING COMMANDS:CC T -> TYPE FILEC M -> SET TERMINAL TO MCRC>C IF THE FIRST TWO LETTERS OF THE COMMAND ARE NOT "T" FOLLOWED3C BY A SPACE, OR "M" FOLLOWED BY A CARRIAGE RETURN,8C THE COMMAND IS PASSED TO MCR FOR EXECUTION. THEREFORE,HC USERS AT TERMINALS SET TO THIS CLI WILL SEE THE ENTIRE MCR COMMAND SETFC 00çâmÖmg´cÚµcÛ¶c�·c›’AS BEING PRESENT, PLUS THE "T" AND "M" COMMANDS. IF THE "DPR" SWITCHFC IS INCLUDED ON THE CLI /INIT COMMAND, USERS WILL KNOW IMMEDIATELY IFGC THEIR TERMINAL IS SET TO THIS CLI BY THE PRESENCE OF THE DOUBLE RIGHT C ANGLE BRACKET AS THE PROMPT.COFC IF IT IS INITIALIZED WITH THE SYSTEM MESSAGE OPTION ENABLED, IT WILLDC GREET USERS WHEN THEIR TERMINAL IS SET TO THE CLI, AND SAY GOODBYE C TO THEM WHEN THEY SWITCH AWAY.CFBC IN ORDER TO BRING THIS CLI UP ON THE SYSTEM, ISSUE THE FOLLOWINGC COMMAND SEQUENCE:GCEC >FOR TMCLI,TMCLI/-SP=TMCLI.C >TKB TMCLI/FP,TMCLI/-SP=TMCLI,[1,1]FOROTS/LB C >INS TMCLI/CLI=YES/TASK=...TMC9C >CLI /INIT=TMCLI/MESSAGE/DPR="<15><12>/>>/"/TASK=...TMCECE?C IF USING FORTRAN IV-PLUS INSTEAD OF FORTRAN IV, THE FIRST TWO C COMMANDS ABOVE WOULD BE:CY C >F4P TMCLI,TMCLI/-SP=TMCLI.FTN.C >TKB TMCLI/FP,TMCLI/-SP=TMCLI,[1,1]F4POTS/LBC ;C TO SET TERMINALS TO THIS CLI, ISSUE THE FOLLOWING COMMAND 6C WHERE TTN: IS REPLACED BY THE TERMINAL NUMBER OR TI:COC >SET /CLI=TTN:TMCLIECHC NOTE THAT THE PROMPT ISSUED IN RESPONSE TO A CONTROL/C DEFAULTS TO THE%C NAME OF THE CLI WHICH IS "TMCLI>". CC JC IT CAN BE ELIMINATED FROM THE SYSTEM BY THE FOLLOWING COMMANDS, ASSUMINGC NO TERMINALS ARE SET TO IT: C C >CLI /ELIM=TMCLI C >REM ...TMCUCBHC EXPERIMENT WITH THE OTHER OPTIONS ON THE CLI /INIT COMMAND, THE ENABLELC AND DISABLE CLI COMMANDS, AND LEAVING OFF THE /MESSAGE SWITCH ON THE /INITGC COMMAND TO OBSERVE THE EFFECT THEY HAVE. ALSO TRY CHANGING THE /TASK=LEC SWITCH ON THE INS AND CLI /INIT COMMAND TO "/TASK=TMCLI" AND NOTICELJC THAT ONLY ONE COPY OF THE TASK WILL EXIST FOR ALL TERMINALS, RATHER THANEC ONE PER COMMAND. IF THIS IS DONE, YOU SHOULD ALSO CHANGE THE OPTIONRLC ON THE GTCMCI DIRECTIVE FROM GC.CEX TO GC.CST SO THE TASK WILL STAY ACTIVE6C BUT STOPPED WHEN NO COMMANDS ARE OUTSTANDING FOR IT.CBCC BUFFER AREASCOKC COMMAND BUFFER - THIS BUFFER IS USED IN THE GTCMCI DIRECTIVE. IT CON-ECC TAINS INFORMATION ON THE COMMAND RECEIVED (8 BYTES) %C AND THE COMMAND TEXT.L BYTE CMDBUF(264)H7 INTEGER*2 CBLEN ! NOTE THAT ON M+ THE MAXIMUM COMMAND," DATA CBLEN/263/ ! LENGTH IS 255.< INTEGER*2 GCCDV, GCCCL ! ASCII DEV NAM, # CHARS IN CMD LINEA BYTE GCCCT, GCCUN, GCCBF(255) ! # OF CHARS, TERMINAL UNIT #, CMD B EQUIVALENCE (GCCDV,CMDBUF), (GCCCL,CMDBUF(5)), (GCCCT,CMDBUF(4)),+ 1 (GCCBF,CMDBUF(9)), (GCCUN,CMDBUF(3))ECS@C INFORMATION BUFFER - ALSO RETURNED IN THE GTCMCI DIRECTIVE.CM BYTE IBUF(14) INTEGER*2 GCCPU; DATA IBLEN/14/,GCCPU/9/ ! LENGTH OF IBUF, LOGIN UIC OFFSET2? INTEGER*4 GCCOA ! ADDR OF OFFSPRING CONTROL BLOCK FROM PARENTD EQUIVALENCE (GCCOA,IBUF(7))C)C BUFFER IN WHICH TO GENERATE COMMANDSCCS5 BYTE BUF(72) ! BUFFER IN WHICH TO GENERATE COMMANDSR; REAL*8 TCMD(2) ! FOR CONVENIENCE IN ASSIGNMENT STATEMENTS, EQUIVALENCE (BUF,TCMD)(C,C MCR TASK NAME IN RAD50GCN) INTEGER*4 IMCR ! MCR TASK NAME IN RAD50  DATA IMCR/6RMCR.../CC&C DIRECTIVE SYMBOLIC VALUE DEFINITIONSC2% INTEGER*2 GCCCS, GCCEX, GCCST, GCCNDTH DATA GCCCS, GCCEX, GCCST, GCCND /0, 1, 2, 128/ ! INCP VALUES IN GTCMCI% DATA ISCLR /0/ ! IS.CLR RETURN CODEOG INTEGER*2 CMELM, CMEXT, CMLKT, CMRMT ! TERMINAL CODES FOR SYSTEM MSGS(- DATA CMELM, CMEXT, CMLKT, CMRMT /5, 6, 7, 8/RC* C CLI CODECRLC TO FORCE THE CLI TO EXIT INSTEAD OF RETURNING, THE GC.CEX OPTION IS SPECI-KC FIED IN THE GTCMCI DIRECTIVE BELOW. IF THE CLI IS INSTALLED SO THAT ONLYMHC ONE COPY OF THE TASK WILL EXIST FOR ALL TERMINALS, CHANGE THE VARIABLEJC GCCEX BELOW TO GCCST. THIS SPECIFIES THE GC.CST OPTION SO THAT THE TASKGC WILL STAY ACTIVE BUT STOPPED WHEN NO COMMANDS ARE OUTSTANDING FOR IT.RCCG 1 CALL GTCMCI(CMDBUF,CBLEN,IBUF,IBLEN,0,GCCEX,IDS) ! GET CMD FOR CLI, IF (IDS .LT. 0) GO TO 100C8FC IF THE GTCMCI DIRECTIVE HAD THE GC.CST OPTION SPECIFIED, WE MAY HAVE5C JUST BEEN UNSTOPPED, SO WE HAVE TO GET THE COMMAND.CCE6 IF (IDS .EQ. ISCLR) GO TO 1 ! WERE WE JUST UNSTOPPED? O8 IF (GCCDV .EQ. 0) GO TO 200 ! IS THIS A SYS00çêmÜmåßmæàmçámýfáþfDATATEM MESSAGE? 4 IGCCUN = GCCUN ! CONVERT BYTE TO INTEGER (UNIT #); CALL ASNLUN(5,GCCDV,IGCCUN,IDS) ! ASSIGN TERMINAL TO LUN 5C) IGCCCT=GCCCT ! CONVERT BYTE TO INTEGERC IF (IGCCCT .GE. 0) GO TO 5I6 IGCCCT = 256 + IGCCCT ! CONVERT NEGATIVE TO UNSIGNEDH 5 IF (IGCCCT .LT. GCCCL) GOTO 150 ! DID ENTIRE COMMAND FIT IN BUFFER?CAEC AT THIS POINT, THE CLI HAS A COMMAND TO BE PROCESSED. THE CODE FROM =C THE LABEL 1 TO HERE SHOULD BE FAIRLY COMMON AMONG ALL CLIS.CJC FROM THIS POINT ON, THE CODE WILL BE SPECIFIC TO THE PARTICULAR LANGUAGEDC THIS CLI IS IMPLEMENTING. COMMANDS CAN BE ADDED OR DELETED AT WILLDC BY MODIFYING CODE IN THIS SECTION. AS STATED ABOVE, THIS EXTREMELYEC SIMPLE CLI PROVIDES TWO COMMANDS, AND GIVES EVERYTHING ELSE TO MCR.TIC THIS CREATES AN OPEN ENDED ENVIRONMENT. REJECTING UNRECOGNIZED COMMANDSNGC INSTEAD OF PASSING THEM TO MCR WOULD LIMIT THE TERMINAL USER'S USE OF AC THE SYSTEM TO ONLY THOSE OPERATIONS ALLOWED BY THE CLI. THIS IS HC A SECURE WAY OF CONTROLLING SYSTEM USE, IN CASES WHEN IT IS NECESSARY.AC IN THIS EXAMPLE, CHANGING THE "GO TO 50" BELOW, TO A "GO TO 60"TCC WOULD CREATE AN ENVIRONMENT WHERE THE ONLY OPERATION A USER COULDSHC PERFORM WOULD BE TO TYPE FILES ON THE TERMINAL, OR SWITCH BACK TO MCR.JC ALL OF THE REST OF RSX IS TOTALLY INACCESSABLE. IF NO MEANS OF SWITCHINGDC BACK TO MCR IS PROVIDED, IT WOULD BE IMPOSSIBLE FOR THE USER TO DO2C ANYTHING THE CLI DOES NOT EXPLICITLY LET HIM DO.COC IS IT A "T" COMMAND?C < IF ((GCCBF(1) .EQ. 'T') .AND. (GCCBF(2) .EQ. ' ')) GO TO 10CSIC CHANGE THE NEXT IF STATEMENT TO "GO TO 60" TO ELIMINATE PASSING UNKNOWN C COMMANDS TO MCR.CM C IS IT ALSO NOT AN "M" COMMAND?COB IF ((GCCBF(1) .NE. 'M') .OR. (GCCBF(2) .NE. 13)) GO TO 50 ! MCTBC THE USER HAS ENTERED AN "M" COMMAND, SO SET THE TERMINAL TO MCR.CF TCMD(1) = 'SET /MCR'C$ TCMD(2) = '=TI: ' ! SET /MCR=TI:7 IGRP = IBUF(GCCPU+1) ! (CONVERT BYTE TO INTEGER) GROUPY( IMEM = IBUF(GCCPU) ! MEMBER PART OF UICC*C ISSUE RPOI$ DIRECTIVE TO EXECUTE COMMANDC < CALL RPOI(IMCR,IGRP,IMEM,,TCMD,12,,GCCDV,IGCCUN,,GCCOA,IDS)# IF (IDS .LE. 0) GO TO 110 ! ERROR?M GO TO 1 ! BACK TO STARTCNCC THE USER HAS ENTERED A "T" COMMAND SO CONSTRUCT THE NECESSARY PIP1C COMMAND AND SEND IT TO MCRCS> 10 TCMD(1) = 'PIP TI:=' ! PUT BEGINNING OF PIP CMD IN BUFFER& I2 = 8 ! POINTER INTO TARGET BUFFER= DO 20, I1 = 10, CBLEN ! BEGIN AT SPACE AFTER THE T IN CMDBUFI< IF (CMDBUF(I1) .EQ. 13) GO TO 30 ! END OF COMMAND? ()6 IF (CMDBUF(I1) .EQ. ' ') GO TO 20 ! SKIP ANY SPACES! I2 = I2 + 1 ! COUNT CHARACTERG1 BUF(I2) = CMDBUF(I1) ! COPY INTO OUTPUT BUFFERR 20 CONTINUE!; 30 IGRP = IBUF(GCCPU+1) ! (CONVERT BYTE TO INTEGER) GROUPO( IMEM = IBUF(GCCPU) ! MEMBER PART OF UICCD*C ISSUE RPOI$ DIRECTIVE TO EXECUTE COMMANDC < CALL RPOI(IMCR,IGRP,IMEM,,TCMD,I2,,GCCDV,IGCCUN,,GCCOA,IDS)# IF (IDS .LE. 0) GO TO 110 ! ERROR?G GO TO 1 ! BACK TO STARTCUCC IN THE ABOVE SECTION OF CODE, THE RPOI DIRECTIVE WAS USED TO PASSI9C THE PIP COMMAND TO THE MAIN COMMAND DISPATCHER (MCR...) BC WHICH WILL START A COPY OF PIP AND GIVE IT THE COMMAND. THE RPOIDC DIRECTIVE COULD BE USED TO GIVE THE COMMAND DIRECTLY TO ...PIP AND<C GIVE THE RESULTING TASK A DIFFERENT NAME. IN THIS EXAMPLE,>C WE COULD CALL THE RESULTING PIP TASK "TYPTNN" WHERE THE LASTDC THREE CHARACTERS (TNN) ARE REPLACED BY A DEVICE NAME CHARACTER ANDAC UNIT NUMBER. FOR EXAMPLE, IF THE "T" COMMAND WAS TYPED ON TT10:CDC THE RESULTING TASK NAME COULD BE MADE TO BE "TYPT10". THIS HAS THEGC ADVANTAGE OF ALLOWING THE TASK TO BE ABORTED BY AN "ABO TYP" COMMAND,PEC INSTEAD OF "ABO PIP", THUS THE USER WOULD NOT HAVE TO KNOW THAT THEHEC "T" COMMAND HE ISSUED IS ACTUALLY BE SERVICED BY THE PIP TASK. THIS @C IS EXACTLY WHAT THE DCL CLI DOES. IT IS NOT DONE HERE IN ORDER@C TO SIMPLIFY THE EXAMPLE. PICKING UP THE TERMINAL NAME AND UNITHC NUMBER, CONVERTING IT TO RAD50, AND SUPPLYING IT IN THE RPOI DIRECTIVEHC ALONG WITH A DIRECT REQUEST OF PIP IS LEFT AS AN EXERCISE TO THE USER.>C (BE CAREFUL ON M-P00çòmè÷mg´cÚµcÛ¶c�·c›’LUS SYSTEMS WITH MORE THAN 64. TERMINALS).IC NOTE THAT REQUESTING PIP DIRECTLY AVOIDS A SUBSTANTIAL AMOUNT OF SYSTEMA C OVERHEAD.ACHCCT5C COMMAND IS NOT "T" OR "M", SO GIVE IT TO MCR AS IS.TC.; 50 IGRP = IBUF(GCCPU+1) ! (CONVERT BYTE TO INTEGER) GROUPR( IMEM = IBUF(GCCPU) ! MEMBER PART OF UIC( IGCCCT = GCCCT ! # OF CHARS IN COMMANDC *C ISSUE RPOI$ DIRECTIVE TO EXECUTE COMMANDC A CALL RPOI(IMCR,IGRP,IMEM,,GCCBF,IGCCCT,,GCCDV,IGCCUN,,GCCOA,IDS)E# IF (IDS .LE. 0) GO TO 110 ! ERROR?N GO TO 1 ! BACK TO STARTC6CC CONTROL IS TRANSFERED HERE IF UNKNOWN COMMANDS ARE TO BE REJECTEDI!C INSTEAD OF BEING PASSED TO MCR.C 60 WRITE (5,62)S 62 FORMAT('0ILLEGAL COMMAND')R GO TO 1 ! BACK TO STARTCGC ERROR HANDLING CODE CI( 100 WRITE (5,102) IDS ! ERROR IN GTCMCI9 102 FORMAT('0FATAL ERROR IN GTCMCI DIRECTIVE. DSW=',I6)  GO TO 250 ! EXITCV& 110 WRITE (5,112) IDS ! ERROR IN RPOI7 112 FORMAT('0FATAL ERROR IN RPOI DIRECTIVE. DSW=',I6)  GO TO 250 ! EXITC!: 150 WRITE (5,152) ! ENTIRE COMMAND DID NOT FIT IN BUFFER4 152 FORMAT('0SORRY, PART OF YOUR COMMAND WAS LOST') GO TO 1 ! BACK TO STARTC4C A SYSTEM MESSAGE WAS RECEIVED INSTEAD OF A COMMANDCR 200 CONTINUEBE IF (GCCUN .EQ. CMLKT) GO TO 210 ! IS IT A NEW TERMINAL LINKED TO US?EB IF (GCCUN .EQ. CMRMT) GO TO 220 ! IS IT A TERMINAL BEING REMOVED?A IF (GCCUN .EQ. CMEXT) GO TO 250 ! IS IT AN ELIMINATE ALL PACKET?PC IF (GCCUN .EQ. CMELM) GO TO 250 ! IS IT A CLI ELIMINATION MESSAGE?2& GO TO 1 ! IGNORE ALL OTHER MESSAGESCEC ISSUE WELCOME MESSAGEUCRB 210 IGCCUN = CMDBUF(11) ! CONVERT BYTE TERMINAL UNIT # TO INTEGERC CALL ASNLUN(5,GCCBF,IGCCUN,IDS) ! ASSIGN LUN 5 TO SPECIFIED DEVICEA WRITE (5,212)* 212 FORMAT('0WELCOME TO THE EXAMPLE CLI') GO TO 1 ! BACK TO STARTCSC ISSUE GOOD BYE MESSAGEC B 220 IGCCUN = CMDBUF(11) ! CONVERT BYTE TERMINAL UNIT # TO INTEGERC CALL ASNLUN(5,GCCBF,IGCCUN,IDS) ! ASSIGN LUN 5 TO SPECIFIED DEVICEO WRITE (5,222)- 222 FORMAT('0GOOD BYE FROM THE EXAMPLE CLI')L GO TO 1 ! BACK TO STARTCE=C WHEN AN ELIMINATE ALL MESSAGE IS RECEIVED, EXIT IMMEDIATELYMCL 250 CONTINUEG CALL EXIT END F,IGCCUN,IDS) ! ASSIGN LUN 5 TO SPECIFIED DEVICEA WRITE (5,212)* 212 FORMAT('0WELCOME TO THE EXAMPLE CLI') GO TO 1 ! BACK TO STARTCSC ISSUE GOOD BYE MESSAGEC B 220 IGCCUN = CMDBUF(11) ! CONVERT BYTE TERMINAL UNIT # TO INTEGERC CALL ASNLUN(5,GCCBF,IGCCUN,IDS) ! ASSIGN LUN 5 TO SPECIFIED DEVICEO WRITE (5,222)- 222 FORMAT('0GOOD BYE FROM THE EXAMPLE CLI')L! .TITLE BMDRV - BLOCK MOVE DRIVER .IDENT /01/;+;; COPYRIGHT (c) 1981,1982 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; VERSION: 01.00; DATE: 1-APR-82; AUTHOR: MARIO DENOBILI;<; THIS IS A SAMPLE DRIVER WHICH DEMONSTRATES HOW TO USE SOME;; OF THE MORE SOPHISTICATED EXECUTIVE SERVICES AVAILABLE TO(; I/O DRIVERS. THIS DRIVER DEMONSTRATES:;L>; 1) THE CHECKING OF ADDITIONAL USER BUFFERS PRIOR TO QUEUEING; AN I/O PACKET.L;U*; 2) USE OF THE CLOCK QUEUE FROM A DRIVER.;&; 3) USE OF THE BUFFERED I/O MECHANISM;N9; 4) USE OF THE GENERAL BUFFERED I/O KERNEL AST MECHANISM ;M#; 5) USE OF REGION LOAD KERNEL ASTS1;; 6) USE OF BLXIO8;;A6; THIS DRIVER UNDERSTANDS PRECISELY ONE QIO, WHICH IS:; 7; ... IO.WLB,....., ; OR ; IO.WVBA;B;; THE DRIVER QUEUES A CLOCK BLOCK FOR TIME TICKS AND AT THEE;; END OF THAT TIME INTERVAL COPIES THE SOURCE BUFFER TO THEA:; DESTINATION BUFFER. IF POSSIBLE, THE REQUEST IS BUFFERED/; INTERNALLY WHILE THE CLOCK REQUEST IS POSTED.N;- .MCALL CLKDF$, PKTDF$% CLKDF$ ;DEFINE CLOCK BLOCK OFFSETSU$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;E7; DEFINE MAXIMUM TRANSFER LENGTH WHICH WILL BE BUFFEREDN;I BUFLIM = 100. DDT$ BM,,NONE,,,NEW .PAGE;+); ** - BMINI - I/O INITIATION ENTRY POINTB; ; ; INPUTS:E; <; DRQIO (BECAUSE 00èúm[ümßmæàmçámýfáþfDATATHE UC.QUE BIT IS SET IN THE UCB) SETS THE; REGISTERS TO THE FOLLOWING:T;H; R1 = ADDRESS OF I/O PACKET; R4 = ADDRESS OF SCB ; R5 = ADDRESS OF UCBW;E ; OUTPUTS:;EE; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT- E; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-X; ATION IS INITIATED.I;W; I/O REQUEST PACKET FORMAT: ;0'; I.LNK -- I/O QUEUE THREAD WORD.5; I.PRI/I.EFN -- REQUEST PRIORITY, EVENT FLAG NUMBER.N:; I.TCB -- ADDRESS OF THE TCB OF THE REQUESTER TASK.E; I.LN2 -- POINTER TO SECOND LUN WORD IN REQUESTER TASK HEADER. &; I.UCB -- UCB ADDRESS OF DEVICE,; I.FCN -- I/O FUNCTION CODE (IO.WLB).5; I.IOSB -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.A5; I.IOSB+2 -- RELOCATION BIAS OF I/O STATUS BLOCK.EB; I.IOSB+4 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000).8; I.IOSB+6 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.2; I.PRM -- RELOCATION BIAS OF SOURCE BUFFER.0; I.PRM+2 -- BUFFER ADDRESS ;0; >; COPYRIGHT (c) 1985, 1987 BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;.>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;T; VERSION 2.06;; MODIFIED BY:; ; P. K. M. WEISS 8-OCT-85 2.00/; PKW107 - ADD DEFINABLE CONTROLLER TIMEOUTSO;.; G. MARIGOWDA 17-JUN-86 2.010; 1; GM103 - DEFINE C.VCID AS A BYTE AND DEFINE; ; C.FLAG AND CONTROL BITS;; G. MARIGOWDA 3-NOV-86 2.02 ; ,; GM105 - INCREASE THE RETRY COUNT TO 3 ;S; J. MELVIN 10-NOV-86 2.03!; JJM304 - DELETE EXCESS LINESM; ; J. MELVIN 10-NOV-86 2.04,; JJM308 - RESTRUCTURE QST TO REDUCE SIZE; ; J. MELVIN 29-NOV-86 2.05=; JJM321 - CREATE $IDENT MACRO FOR RUN TIME IDENTIFICATIOND;I; J. MELVIN 25-JAN-87 2.06; JJM325 - VECTOR PUCOM;0 ;1 .IIF NDF,R$$UDA R$$UDA=0 ;INSURE IT IS DEFINEDF1 .IIF NDF,R$$MYA R$$MYA=0 ;INSURE IT IS DEFINED. S ;======================================================================== ;PKW107 R ; THE FOLLOWING DEFINITIONS MAY BE CHANGED TO CUSTOMIZE THE MSCP DRIVERS ;PKW107S ;======================================================================== ;PKW107V ;PKW107 > MAXWBT = 8. ;MAXIMUM UMR WAIT BLOCK TABLE ENTRIES ;PKW107< ;THIS IS THE MAXIMUM NUMBER OF I/O'S THAT EACH ;PKW107: ;CONTROLLER CAN HAVE OUTSTANDING AT ONE TIME ;PKW107' ; (ON A UNIBUS SYSTEM) ;PKW107EB DUUMR = 4 ;PREALLOCATED UMR WAIT BLOCKS FOR DU DEVICES ;PKW107B MUUMR = 2 ;PREALLOCATED UMR WAIT BLOCKS FOR MU DEVICES ;PKW107 ;PKW107SK ;DUTMO = ;DSA CONTROLLERS SEND THE HOST A TIMEOUT VALUE WHEN THEY;PKW107=C ;ARE BROUGHT ONLINE. FOR DISK CONTROLLERS, THIS VALUE ;PKW107I= ;IS TYPICALLY BETWEEN 30 SEC AND 2 MIN. IF THE ;PKW107AC ;CONTROLLER BECOMES UNAVAILABLE, IT WILL TAKE THE HOST ;PKW107UB ;2*(TIMEOUT VALUE)+3 SEC TO RESYNCHRONIZE. THIS TIME ;PKW107D ;PERIOD IS LONGER THAN NECESSARY BECAUSE THE RSX DRIVER ;PKW107B ;DOES NOT IMPLEMENT SOME OF THE LONGER MSCP COMMANDS, ;PKW107D ;SUCH AS 'ERASE'. FOR SOME APPLICATIONS THE TIME DELAY ;PKW107> ;SPECIFIED BY THE CONTROLLER MAY BE UNACCEPTABLE. ;PKW107D ;DEFINING DUTMO WILL CAUSE THIS VALUE TO BE USED FOR THE;PKW107! ;TIMEOUT PERIOD. ;PKW107= ; *****DO NOT***** USE THIS OPTION UNLESS YOUR ;PKW1070B ;APPLICATION ABSOLUTELY REQUIRES IT. IF YOU USE THIS ;PKW107= ;OPTION, AND YOU EXPERIENCE INEXPLICABLY FAILED ;PKW107RA ;COMMANDS OR EXCESSIVE RESYNCHRONIZATION, RAISE THIS ;PKW107,C ;VALUE **BEFORE** SUBMITTING A PROBLEM REPORT. DO NOT ;PKW107YD ;UNDER ANY CIRCUMSTANCES ATTEMPT TO USE A TIMEOUT VALUE ;PKW107' ;OF LESS THAN 5 SEC. ;PKW107V ;PKW107HA ;A COMPARABLE VALUE IS NOT INCLUDED FOR TAPE DRIVERS ;PKW107*A ;BECAUSE THE REWIND COMMAND, WHICH WE USE, IS ONE OF ;PKW107E, ;THE LONGEST TMSCP COMMANDS. 00[n÷mg´cÚµcÛ¶c�·c›’ ;PKW107 ;PKW107E ;PKW107AQ ;===================================================================== ;PKW107. ; END OF ALTERABLE DEFINITIONS ;PKW107Q ;===================================================================== ;PKW107;O;===================================================================== ;**-1O; DEFINE CST OFFSETS FOR DSAH;=====================================================================& .ASECT ;DEFINE CST OFFSETS FOR DSA.=0M3C.STAT: .BLKW 1 ;STATUS BITS FOR CONNECTION STATEP ;POSSIBLE STATES ARE:" C1.RDY = 1 ;CONNECTION IS READY0 C1.ONL = 2 ;CONNECTION IS IN TRANSITION FOR A ;CON ONL REQUEST.=, C1.SCC = 4 ;CONNECTION IS WAITING FOR ITS/ ;'SET CONTROLLER CHARACTERISTICS' COMMAND= ;TO COMPLETE.=: C1.GUS = 10 ;A 'GET UNIT STATUS' COMMAND MUST BE ISSUED> C1.AVN = 20 ;AN ADDITIONAL AVAILABLE COMMAND MUST BE ISSUED6 C1.SYN = 40 ;CONTROLLER SYNCHRONIZATION IN PROGRESS7 C1.REC = 100 ;PHASE ONE OF SYNCHRONIZATION RECOVERYE6 C1.CON = 200 ;PHASE TWO OF SYNCHRONIZATION RECOVERY1! C1.UMR = 400 ;ALLOCATE UMRS IF A UNIBUS SYSTEM 5" C1.DQU = 1000 ;CALL $DQUMR WHEN EXITING THE DRIVER.&# C1.FAT = 2000 ;FATAL ERROR OCCURRED/$ C1.ABO = 4000 ;ABORT COMMANDS MUST BE ISSUED@% C1.GCS = 10000 ;A 'GET COMMAND STATUS' COMMAND MUST BE ISSUED)& C1.TMO = 20000 ;A TIMEOUT HAS OCCURREDA8' C1.R1 = 40000 ;RECOVERY - ON-LINES NEED TO BE STARTED7( C1.R2 = 100000 ;RECOVERY - UNITS STILL SPINNING UP ):*C.EXTN: .BLKW 1 ;RESERVED. DO NOT MOVE/REMOVE THIS CELL+7,C.CMST: .BLKW 2 ;STATUS OF OLDEST OUTSTANDING COMMAND -7.C.OLHD: .BLKW 2 ;LIST HEAD OF OUTSTANDING I/O PACKETSE/0C.CMDS: .BLKW 1 ;CREDIT COUNTO101C.VCID: .BLKB 1 ;VIRTUAL CIRCUIT ID ;GM10381C.FLAG: .BLKB 1 ;CLASS DRIVER CONTROL FLAG ;GM103=1 C2.SHD = 1 ;TO TEST RECURSION DURING DISK SHADOWING ;GM103C61 ;THIS BIT IS MEANING LESS FOR NON I/D AND ;GM1031 ;MICRO/RSX ;GM103 3 ;**-1G;4C.REDO: .BLKW 1 ;OLDEST COMMAND TO BE REISSUED AT RESYNCHI5;6C.REQU: .BLKW 2 ;QUEUE OF CMDS TO RESTART AFTER A RESYNCHN78 .IF DF E$$LOG99:C.MLNG: .BLKW 1 ;LENGTH OF CONTROLLER ERROR LOG PACKET ';C.CRED: .BLKB 1 ;CREDIT/DEBIT COUNTSV&<C.VCIX: .BLKB 1 ;VIRTUAL CIRCUIT ID#=C.IP: .BLKW 1 ;SAVED IP REGISTER #>C.SA: .BLKW 1 ;SAVED SA REGISTERR? .ENDC@A .IF DF M$$EXT%BC.UMCT: .BLKW 1 ;UMR COUNTER FIELD -CC.UMRW: .BLKW MAXWBT ;UMR WAIT BLOCK TABLE D .ENDCE-FCSTLEN = <.-C.STAT>/2 ;CST LENGTH IN WORDS IG;====================================================================== H; DEFINE QST OFFSETS FOR DSAII;====================================================================== J .ASECTRK.=0B LQ.CST: .BLKW 1 ;POINTER TO CST1M ;IN ORDER TO SUPPORT MULTI-CLASS CONTROLLERSE3N ;THERE WOULD BE A TABLE OF CST ADDRESSES HERE.$O ;ONE ENTRY FOR EACH CLASS TYPE.FQQ.STAT: .BLKW 1 ;STATUS BITS FOR HOST PORT TO CONTROLLER LINK ;**-1&R Q1.RDY= 1 ;CONTROLLER STATE = READY3S Q1.OFF= 2 ;CONTROLLER STATE = OFF-LINE, UNUSABLE=3T Q1.SYN= 100000 ;CONTROLLER STATE = SYNCHRONIZINGQ%U ;... TO ACCOMMODATE THE ENVELOPE=VQ.SAD: .BLKW 10VQ.ID: .BLKB 1 ;CONTROLLER MODEL ID ;JJM3084VQ.INF: .BLKB 1 ;CONTROLLER INFORMATION ;JJM308AaQ.RSPN: .BLKB 1 ;NUMBER OF RESPONSE RING DESCRIPTORS ;**-10E=cQ.CMDN: .BLKB 1 ;NUMBER OF COMMAND RING DESCRIPTORS ;**-12mQ.CTM: .BLKB 1 ;CURRENT TIME-OUT COUNT ;**-90oQ.RTY: .BLKB 1 ;CURRENT RE-TRY COUNT ;**-1JoQ.RING: ;POINTER TO RESPONSE RING AREA. MUST BE SAME AS Q.FRSP ;JJM308<oQ.FRSP: .BLKW 1 ;POINTER TO FIRST RESPONSE RING ;JJM308<oQ.LRSP: .BLKW 1 ;POINTER TO LAST RESPONSE RING ;JJM308<oQ.FCMD: .BLKW 1 ;POINTER TO FIRST COMMAND RING ;JJM308<oQ.LCMD: .BLKW 1 ;POINTER TO LAST COMMAND RING ;JJM308K~Q.RPAT: .BLKW 1 ;POINTER TO ORDERED TABLE OF ADDRESSES OF RSP PKTS ;**-14 J€Q.CPAT: .BLKW 1 ;POINTER TO ORDERED TABLE OF ADDRESSES OF CMD PKTS ;**-1G€Q.STEP: ;SYN00[ nümßmæàmçámýfáþfDATACHRONIZATION STEP BIT. THIS OVERLAPS THE USE OF ;JJM308 /€ ;Q.CRSP AND >MUST< REMAIN HERE. ;JJM308B?€Q.CRSP: .BLKW 1 ;POINTER TO CURRENT RESPONSE PACKET ;JJM308 I€Q.INDX: ;SYNCHRONIZATION STEP INDEX. THIS OVERLAPS THE USE OF ;JJM308 /€ ;Q.CCMD AND >MUST< REMAIN HERE. ;JJM308 <€Q.CCMD: .BLKW 1 ;POINTER TO FIRST COMMAND PACKET ;JJM308Q€Q.WRIT: .BLKW 4 ;VALUES TO WRITE TO SA REGISTER DURING SYNCHRONIZATION ;JJM308TB€Q.TEMP: .BLKW 1 ;CONTROLLER SPECIFIC SCRATCH/WORK AREA ;JJM3085‚QSTLEN = <.-Q.CST>/2 ;QST LENGTH IN WORDS ;**-1 ƒ .PSECTR„…P†;=============================================================================!‡; DRIVER WIDE MACRO DEFINITIONSOPˆ;=============================================================================‰Š‹ .MACRO CALLV TYPE, RTNBŒ .IF IDN ,� JSR PC,@120000+RTN.Ž .ENDC ;IDN CLASS�� .IF IDN , ‘ JSR PC,@140000+RTN’ .ENDC ;IDN PORTN“” .ENDM ;CALLVT•–N—;===========================================================================˜™ .MACRO JMPV TYPE, RTNš .IF IDN ,› JMP @120000+RTNœ .ENDC ;IDN CLASS�ž .IF IDN ,=Ÿ JMP @140000+RTN  .ENDC ;IDN PORT=¡¢ .ENDM ;JMPV£M¤;==========================================================================J¥!¦ .MACRO PUSH LIST ;MACRO PUSHS§ .IRP XX,T¨ .IF IDN <#0> © CLR -(SP)ª .IFFE« MOV XX,-(SP)¬ .ENDC­ .ENDM ® .ENDM PUSH=¯M°;==========================================================================R±² .MACRO POP LIST ;MACRO POP<³ .IRP XX,2´ MOV (SP)+,XXDµ .ENDM ¶ .ENDM POP·M¸;==========================================================================V¹!º .MACRO COPY LIST ;MACRO COPY=» .IRP XX,=¼ MOV (SP),XX½ .ENDM ¾ .ENDM COPYU¿Y¿;============================================================================== ;JJM321V¿ ;JJM321R¿; $IDENT MACRO TO CREATE TITLE AND RUN TIME IDENT OF PUCOM, MUDRV, DUDRV ;JJM321¿; ;JJM321¿ ;JJM321 2¿ .MACRO $IDENT NAME,IDMAJ,IDMIN,TEXT ;JJM321¿ ;JJM321N1¿ .TITLE NAME V'IDMAJ'.'IDMIN 'TEXT ;JJM321=¿ .RADIX 10. ;JJM321 ¿MAJOR = 'IDMAJ ;JJM321 ¿MINOR = 'IDMIN ;JJM321¿ .RADIX 8. ;JJM321¿ ;JJM321=¿ .ENDM ;$IDENT ;JJM321=MÀ;========================================================================== ÁÂ;C.Ã; MACRO THAT DEFINES TABLE FOR I/O TRANSFERSÄ;,Å'Æ .MACRO FUNCT FCN, OPCOD, PKTSIZ, PRO ÇÈ .WORD IO.'FCN ;QIO REQUESTÉ .BYTE OP.'OPCOD ;OPCODE3Ê .BYTE PKTSIZ ;SIZE OF MSCP/TMSCP PACKET (BYTES)I(Ë .WORD PRO ;OPCODE PROCESSING ROUTINEÌ .ENDM FUNCTÍLÎ;=========================================================================Ï;2EÐ; MACRO TO DEFINE TABLE OFFSETS IN THE OTHER (PORT OR CLASS) DRIVER=Ñ;=Ò .MACRO JMPTBL TYPE=Ó .IF IDN ,6Ó CLASID = 0 ; CLASS DRIVER VERSION NUMBER ;JJM321Õ CLADAT = 2 ;**-1Ö CLAEND = 4C× CLAERR = 6Ø CLACMD = 10Ù SCUCB = 12Ù CLASYN = 14 ;JJM321.Ú .ENDC ;IDN CLASSÛÜ .IF IDN ,.5Ü PORTID = 0 ; PORT DRIVER VERSION NUMBER ;JJM321Þ PORSUP = 2 ;**-1ß PORINT = 4=à PORSEN = 6=á PORUMR = 10â PKTAC = 12Dã PKTDR = 14Tä PKTCHK = 16å STOMP = 20Eæ CONCNT = 22ç PKTCH1 = 24ç PORSYN = 26 ;JJM321A;ç MPPROX = 30 ;PLACE HOLDER. MPPRO DEFINED BELOW ;JJM325 è .ENDC ;IDN PORTCéê .ENDM ;JMPTBLLë;=========================================================================Mì; NULL MACROS THAT ARE REPLACED BY LOGPU.MAC IF TERMINAL LOGGING IS DESIREDRLí;=========================================================================î .MACRO LOGDATï .ENDMðñ .MACRO LOGCMDò .ENDMóô .MACRO LOGRSPõ .ENDMö÷ .MACRO LOGSYNø .ENDMùú .MACRO LOGRTNû .ENDMüLý;===========================00[n\n]n´cÚµcÛ¶c�·c›’=============================================="þ; DRIVER WIDE SYMBOL DEFINITIONSLÿ;=========================================================================.RPLEN = 60. ;RESPONSE PACKET LENGTH (BYTES).CPLEN = 60. ;COMMAND PACKET LENGTH (BYTES))IOPLEN= 18. ;I/O PACKET LENGTH (WORDS)=.ENVLEN = 4. ;ENVELOPE LENGTH (BYTES)8MPPRO = 30 ;OFFSET FOR $MPPRO VECTORED ADDR ;JJM325;9; SYMBOLS NEEDED FOR A ZERO ENTRY IN THE DISPATCH TABLE;=7 IO.0 = 0 ;FOR A ZERO ENTRY FOR THE I/O FUNCTION CODE=; OP.0 = 0 ;FOR A ZERO ENTRY FOR THE (T)MSCP FUNCTION CODE= ;= ; OFFSETS FOR DISPATCH MACRO ;='FO.OP = 2 ;OFFSET FOR (T)MSCP OPCODE 'FO.SZ = 3 ;OFFSET FOR SIZE OF PACKET 3FO.CMD = 4 ;OFFSET FOR OPCODE PROCESSING ROUTINE -FOSIZ = 6 ;SIZE OF ENTRY IN DISPATCH TABLEN;E/; LENGTHS OF ALL COMMON TMSCP COMMAND PACKETSR;R/GUS.L = 6 ;# WORDS TO ALLOCATE FOR GUS CMDE0ONL.L = 22 ;# WORDS TO ALLOCATE FOR ONL CMD0ABO.L = 10 ;# WORDS TO ALLOCATE FOR ABO CMD/AVL.L = 6 ;# WORDS TO ALLOCATE FOR AVL CMDT0GCS.L = 10 ;# WORDS TO ALLOCATE FOR GCS CMD0SCC.L = 20 ;# WORDS TO ALLOCATE FOR SCC CMD<CMDINT = -4 ;COMMAND INTERRUPT OFFSET (FROM BASE OF RING)=RSPINT = -2 ;RESPONSE INTERRUPT OFFSET (FROM BASE OF RING)N !OWN = 100000 ;OWN"FLAG = 40000 ;FLAGC#$; %; MESSAGE ENVELOPE&; '3(MSGLNG = -4 ;OFFSET TO MESSAGE LENGTH (IN BYTES)W5)VCID = -1 ;OFFSET TO VIRTUAL CIRCUIT ID (IN BYTES)T9*CREDIT = -2 ;OFFSET TO MESSAGE/CREDIT FIELD (IN BYTES) "+MSGTYP = 360 ;MESSAGE TYPE MASK!,CRDDBT = 17 ;CREDIT/DEBIT MASK -.;#/; VIRTUAL CIRCUIT IDENTIFIERS0;1%2VCDSK = 0 ;DISK VIRTUAL CIRCUIT IDR%3VCTAP = 1 ;TAPE VIRTUAL CIRCUIT IDN.4VCDIA = 255. ;DIAGNOSTIC VIRTUAL CIRCUIT ID56; 7; MESSAGE TYPE IDENTIFIERS8;C9(:MSGMUL = 20 ;MESSAGE FIELD MULTIPLIER!;MSGSEQ = 0 ;SEQUENTIAL MESSAGEG<MSGDAT = 1 ;DATAGRAM MESSAGES=MSGCRD = 2 ;CREDIT MESSAGET$>MSGMNT = 15. ;MAINTENANCE MESSAGE?@;F%A; ERROR RETRY COUNT, TIME-OUT COUNTAB;PC4CRETRY = 3. ;CONTROLLER ERROR RETRY COUNT ;GM1053ESTMOC = 10. ;USE A TIME-OUT COUNT OF 10. ;**-1;FG3HRNGSIZ = 4 ;LENGTH OF RING DESCRIPTOR (IN BYTES)I7ICMDSIZ = 4 ;LENGTH OF CMD RNG DESCRIPTOR (IN BYTES)EJRSPLNG = RPLEN + ENVLEN ;TOTAL LENGTH OF RESPONSE PACKET (IN BYTES)LDKCMDLNG = CPLEN + ENVLEN ;TOTAL LENGTH OF COMMAND PACKET (IN BYTES)L7MMSW = 2 ;MOST SIGNIFICANT WORD (OWNER BIT IN RING) M ;PKW107%M; UMR WAIT BLOCK SIZE ;PKW107U2MUMRWTB = 20. ; SIZE OF UMR WAIT BLOCK ;PKW107DM.IIF DF M$$PRO UMRWTB=UMRWTB+2 ;ADD WORD FOR UNIBUS MASK ;PKW107*-1;FG3HRNGSIZ = 4 ;LENGTH OF RING DESCRIPTOR (IN BYTES)I7ICMDSIZ = 4 ;LENGTH OF CMD RNG DESCRIPTOR (IN BYTES)EJRSPLNG = RPLEN + ENVLEN ;TOTAL LENGTH OF RESPONSE PACKET (IN BYTES)LDKCMDLNG = CPLEN + ENVLEN ;TOTAL LENGTH OF COMMAND PACKET (IN BYTES)L7MMSW = 2 ;MOST SIGNIFICANT WORD (OWN;?; DUPRE.MAC - PREFIX FILE FOR BUILDING DU LOADABLE CRASH DRIVERO;p; Created 13-MAY-83O;3L$$CDA=0 ; LOADABLE CRASH DRIVERS TO BE ASSEMBLEDBDU$$CD=0 ; CRASH DRIVER IS DU3-MAY-83;3L$$CDA=0 ; LOADABLE CRASH DRIVERS TO BE ASSEMBLEDDL$$CD=0 ; CRASH DRIVER IS DU;O?; MUPRE.MAC - PREFIX FILE FOR BUILDING MU LOADABLE CRASH DRIVER;O; Created 13-MAY-83A;3L$$CDA=0 ; LOADABLE CRASH DRIVERS TO BE ASSEMBLEDSMU$$CD=0 ; CRASH DRIVER IS MUER IS MSS.LIST00^nümßmæàmçámýfáþfDATA& $IDENT PUCOM,02,13, .PSECT ;USE BLANK PSECT  .LIST MEBP;S;,"; COPYRIGHT (c) 1985, 1987 BY+; DIGITAL EQUIPMENT CORPORATION, MAYNARDD* ; MASSACHUSSETTS. ALL RIGHTS RESERVED. ;C7 ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY7 ; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE7 ; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THER7; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHERS7; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISED7; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TOP7; AND OWNERSHIP OF THE SOFTWARE IS HEREBY 5; TRANSFERRED.;L7; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TOL7; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED 7; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.N;O8; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR 7; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IST; NOT SUPPLIED BY DIGITAL.;R;A;TG; JASON GALLANT, JOE MELVIN, BOB SCHMEICHEL, SUSAN THOMAS, PAUL WEISS  ;T ; MODIFIED BY: ;S" ; P. K. M. WEISS 8-OCT-85 2.00* ; PKW106 - ADD MULTIPROCESSOR SUPPORT ;N% ; P. K. M. WEISS 14-MAR-1986 2.017 ; PKW109 - ADD QUEUE OPTIMIZATION SUPPORT, CLEAN UP ; % ; J. J. MELVIN 28-MAR-86 2.01AO, ; JJM303 - CLEAN UP UNNEEDED CODE/CELLS ;L$ ; J. J. MELVIN 28-MAR-86 2.02& ; JJM304 - CLEAN UP COMMENT LINES ; $ ; J. J. MELVIN 28-MAR-86 2.03* ; JJM305 - MOVE IPWAIT ROUTINE INLINE ;E$ ; J. J. MELVIN 28-MAR-86 2.04- ; JJM306 - USE ASSUME MACRO WHERE USEFULT ;.$ ; J. J. MELVIN 14-JUN-86 2.056 ; JJM309 - WARN ABOUT VIRTUAL CIRCUIT LIMITATIONS ; & ; G. MARIGOWDA 17-JUN-86 2.069 ; GM103 - DEFINE C.VCID AS A BYTE AND DEFINE C.FLAG ;J! ; J. J. MELVIN 05-NOV-86 2.07S4 ; JJM307 - PERFORM SIMPLE/OBVIOUS OPTIMIZATIONS ; ! ; J. J. MELVIN 05-NOV-86 2.08 1 ; JJM308 - REDUCE QST DATA STRUCTURES IN SIZEO ;W! ; J. J. MELVIN 05-NOV-86 2.09.8 ; JJM310 - KEEP CONTROLLER CONTEXT AVAILABLE FOR USE ;E! ; J. J. MELVIN 29-NOV-86 2.10V2 ; JJM321 - USE $IDENT MACRO TO IDENTIFY MODULE ;R! ; J. J. MELVIN 29-NOV-86 2.11 ' ; JJM322 - DEFINE DEBUG CODE/CELLS  ;I# ; J. J. MELVIN 26-JAN-87 2.12 ; JJM325 - VECTOR PUCOM- ;6% ; G. MARIGOWDA 23-FEB-87 2.13O ; GMG112 - VECTOR $MPUB1 E!; THIS MODULE CONTAINS THE ROUTINES AND DATA STRUCTURES REQUIRED TOEB"; SUPPORT THE UQSSP PORT PROTOCAL FOR TMSCP/MSCP DEVICES. THESED#; ROUTINES AND DATA STRUCTURES ARE USED WITH VARIOUS CLASS DRIVERS6$; IN THE SYSTEM TO PROVIDE SUPPORT FOR SUCH DEVICES.%;OW%;============================================================================ ;JJM309N%; PLEASE NOTE THE FOLLOWING RESTRICTIONS WHEN MODIFYING THIS MODULE ;JJM309%; ;JJM309K%; 1) THE JUMP TABLE DEFINED AT LABEL UQBEGN --MUST-- APPEAR AT ;JJM309EO%; RELATIVE OFFSET 0 IN THIS MODULE. CLASS DRIVERS REQUIRE THIS. ;JJM309O%; ;JJM309S%; 2) PUCOM IS CURRENTLY SET UP TO HANDLE A VIRTUAL CIRCUIT ID OF 0 OR 1. ;JJM309TR%; IF AN ID GREATER THAN 1 IS USED, CHANGES MAY BE REQUIRED TO PUCOM. ;JJM309%; ;JJM309W%;============================================================================ ;JJM309I&; 7& .MCALL HWDDF$,UCBDF$,SCBDF$,UDADF$,KRBDF$ ;PKW109U() HWDDF$ ;HARDWARE REGISTERS ;**-2'* UCBDF$ ;UNIT CONTROL BLOCK OFFSETSF4+ UDADF$ ;DISK CLASS MSCP SYMBOLS AND DEFINITIONS, SCBDF$ ,,1 ;SCB OFFSETS*, KRBDF$ ;DEFINE KRB OFFSETS ;PKW1098- JMPTBL CLASS ;DEFINE CLASS DRIVER JUMP TABLE OFFSETS/; ;**-10; LOCAL MACROS1;U)2 .MACRO GENLAB PRE,VAL ;GENERATE LABEL9 3PRE'VAL::=4 .ENDM ;GENLABO5;============================================================================$=6 .MACRO GENADD PRE,VAL ;GENERATE LABEL, THEN ADDRESS OF IT 7 .WORD PRE'VAL8 .ENDM ;GENADDN9;=====================================================00^"nn]n´cÚµcÛ¶c�·c›’======================@: .MACRO GETINF TYP,CON ;GENERATE SYMBOL, SAVE NUMBER OF RINGS;RNUM=TYP'$R'CONL<CNUM=TYP'$C'COND= .ENDM ;GETINFN>;==========================================================================='? .MACRO GENTAB BASE,CON,LEN,NUM,PTYPEE@ADDR=BASE'CON= A .REPT NUM-B .WORD ADDR + ENVLEN ;ADDRESS OF PTYPE PKT=CADDR=ADDR + LEN + ENVLEND .ENDRE .ENDM ;GENTABOF;=============================================================================G .MACRO RECORD DDD,CONH .WORD DDD'QST'CONI .ENDM ;RECORDOJ;============================================================================$@K .MACRO INDEX PRE,VAL ;GENERATE SUBTITLE ASSEMBLER DIRECTIVECK .SBTTL . PRE: DATA STRUCTURES FOR CONTROLLER VAL ;JJM304,M .ENDM ;INDEX ;**-1ON;============================================================================ O;NP; EQUATED SYMBOLS;Q;B%RIOPLEN = 18.*2 ;IOP SIZE IN BYTES=S;='T; DEVICE REGISTER AND BIT DEFINITIONS.U; .VIP = 0 ;INITIALIZATION AND POLLING REGISTER&WSA = 2 ;STATUS AND ADDRESS REGISTERX;=Y; STEP BIT DEFINITIONSZ;=[ERROR = 100000 ;ERROR\STEP4 = 40000 ;STEP 4 BIT]STEP3 = 20000 ;STEP 3 BIT^STEP2 = 10000 ;STEP 2 BIT_STEP1 = 4000 ;STEP 1 BIT,`;.a; STEP ONE READ BITSb;=5cNOVEC = 2000 ;INABILITY TO ACCEPT INTERRUPT VECTOR=1d ;(I.E. CONTROLLER IS USING A HARD-WIRED ...!e ;... INTERRUPT VECTOR PLUG) "fQB = 1000 ;22 BIT BUS SUPPORTEDg; h; STEP ONE WRITE BITS=i;IjINTE = 200 ;INTERRUPT ENABLERk;Al; STEP FOUR WRITE BITSm;TnLF = 2 ;LAST FAILURE FLAGoGO = 1 ;GO BIT p .PAGE6q .SBTTL JMPTAB - JUMP TABLE OF VARIOUS PORT ROUTINESNr;===========================================================================Gs; THE FOLLOWING JUMP TABLE --- MUST --- BE DEFINED AS THE FIRST THINGTGt; WITHIN THIS MODULE. VARIOUS CLASS DRIVERS EXPECT TO SEE THIS TABLEIGu; AT 140000, WHERE THIS COMMON AREA IS MAPPED INTO THE CLASS DRIVERS.Pv;WHw; THIS TABLE ALSO MAKES USE OF SYMBOLS DEFINED IN THE PREFIX FILE. BE%x; CAREFUL WHEN ADDING NEW ROUTINES. Ny;===========================================================================OyUQBEGN::.WORD MAJOR*256.+MINOR;COMPONENT ID (SET UP IN $IDENT MACRO) ;JJM321=/{ .WORD PORSUP ;PORT SETUP FUNCTIONS ;**-1-.| .WORD PORINT ;CONTROLLER INTERRUPT HANDLER3} .WORD PORSEN ;SEND COMMAND PACKET TO CONTROLLERA*~ .WORD PORUMR ;ALLOCATE/DEALLOCATE UMRS( .WORD PKTAC ;ALLOCATE COMMAND PACKET+€ .WORD PKTDR ;DEALLOCATE RESPONSE PACKETN.� .WORD PKTCHK ;CHECK FOR REQUIRED RESOURCES'‚ .WORD STOMP ;CLOBBER THE CONTROLLER=6ƒCONCNT: .WORD 0 ;# OF CONTROLLERS CONNECTED TO PORT4„ .WORD PKTCH1 ;CHECK FOR RESOURCES-IMMEDIATE CMDS1„ .WORD PORSYN ;PORT SYNCHRONIZATION ;JJM321T;„ .WORD 0 ;EXEC VECTORING FROM APR6 CODE ROUTINE ;JJM325R*„ ;FILLED IN BY CLASS DRIVER ;JJM325.… .WORD -1 ;NO MORE INDICATOR - MUST BE LAST3“TABTAB:: ;TABLE OF QST TABLE ADDRESSES ;**-13 ” .IRP CON,R• .WORD CON'QTBL – .ENDM ;CON.'— .WORD -1 ;ANOTHER TABLE TERMINATORS˜;.™; LOCAL DATAš;TAšTEMP: .BLKW 1 ;NUMBER OF RESPONSE DESCRIPTORS CHECKED ;JJM304OAšCOUNT: .BLKW 1 ;NUMBER OF COMMAND DESCRIPTORS CHECKED ;JJM304P>ŸUQRELC: .BLKW 2 ;RELOCATION CONSTANT USED TO CONVERT ;**-4$  ;VIRTUAL TO PHYSICAL ADDRESSES3¡UMRMAP: .BLKW 1 ;ADDRESS OF MAPPING BLOCK OF UMRD<¡EXEVEC: .WORD 0 ;FLAG FOR VECTOR NOT YET FILLED ;JJM325¡; ;JJM325$¡ALOCB: .WORD $ALOCB ;JJM325$¡ASUMR: .WORD $ASUMR ;JJM325$¡DEACB: .WORD $DEACB ;JJM325$¡DEUMR: .WORD $DEUMR ;JJM325$¡HFMSK: .WORD $HFMSK ;JJM325$¡KISR6: .WORD KISAR6 ;JJM325$¡MPUB1: .WORD $MPUB1 ;JJM325A¡EXEVCL=<<<.-EXEVEC>/2>-1> ;TABLE LENGTH FOR VECTORING ;JJM325*¡ ;JJM322 ¡ .IF DF,DSADEB ;JJM322C¡UNKPKT: .BLKW 1 ;COUNT OF UNKNOWN RESPONSE PACKET TYPES ;JJM322R,¡ ; ACROSS ALL DSA CONTROLLERS ;JJM322I¡UNKRNG: .BLKW 1 ;COUNT OF TIMES00^*nümßmæàmçámýfáþfDATA CREDIT OK, RING NOT HOST OWNED ;JJM322 ,¡ ; ACROSS ALL DSA CONTROLLERS ;JJM322¡ .ENDC ;DSADEB ;JJM322J¡ ;JJM322$¢ .PAGE;£ .SBTTL TABLES - DATA STRUCTURES FOR DISK/TAPE CLASS MSCPOR¤;===============================================================================.¥; SET UP DATA STRUCTURES FOR ALL THE CLASSESR¦;===============================================================================5§.IRP DEV, ;ASSUME TABLE STRUCTURE THE SAMEG&¨CONT=0 ;INITIAL CONTROLLER NUMBER© .IF IDN 2ª .IIF NDF R$$UDA R$$UDA=0L0« LOOP=R$$UDA ;USE NUMBER OF MSCP CONTROLLERS¬ .ENDC­® .IF IDN B¯ .IIF NDF R$$MYA R$$MYA=0D1° LOOP=R$$MYA ;USE NUMBER OF TMSCP CONTROLLERS=± .ENDC²)³ .REPT LOOP ;FOR EACH MSCP CONTROLLER &´ INDEX DEV,\CONT ;GENERATE SUBTITLE;µ GETINF DEV,\CONT ;GET NUMBER OF CMD/RSP RINGS FOR CONT.=¶ .PAGE$·; -------------------------------$¸; SET UP THE CST FOR A CONTROLLER$¹; -------------------------------º0» GENLAB DEV'CST,\CONT ;REFERENCE LABEL TO CST-¼ .WORD 0 ;C.STAT - CONNECTION STATE STATUE4½ .WORD 0 ;C.EXTN - RESERVED. DO NOT MOVE/DELETE/¾ .WORD 0,0 ;C.CMST - OLDEST OUTSTANDING CMDR1¿ .WORD 0,.-2 ;C.OLHD - OUTSTANDING I/O LIST H -À .WORD 0 ;C.CMDS - CREDIT COUNT FOR CONTRT1À .BYTE 0 ;C.VCID - VIRTUAL CIRCUIT ID ;GM103B7À .BYTE 0 ;C.FLAG - CLASS DRIVER CONTROL FLAG ;GM103-3 .WORD 0 ;C.REDO - COMMAND TO BE REISSUED ;**-1O/à .WORD 0 ;C.REQU - QUEUE OF CMDS TO RESTARTÄ .WORD .-2 ;AFTER A RESYNCH Å .IF DF E$$LOG-Æ .WORD 0 ;C.MLNG - LENGTH OF CONTROLLER E.*Ç .BYTE 0 ;C.CRED - CREDIT/DEBIT COUNTS)È .BYTE 0 ;C.VCIX - VIRTUAL CIRCUIT IDA&É .WORD 0 ;C.IP - SAVED IP REGISTER&Ê .WORD 0 ;C.SA - SAVED SA REGISTERË .ENDCÌ&Í .IF DF M$$EXT ;IF EXTENDED MEMORYÎ:Ï .WORD MAXWBT ;C.UMCT - # OF UMR WAIT BLOCKS AVAILABLE2Ð .REPT MAXWBT ;C.UMRW - TABLE OF UMR WAIT BLOCÑ .WORD 0 ; ADDRESSESÒ .ENDRÓÔ .ENDC ;M$$EXTTÕ&Ö; ---------------------------------&×; SET UP THE QST FOR THE CONTROLLER&Ø; ---------------------------------Ù0Ú GENLAB DEV'QST,\CONT ;REFERENCE LABEL TO QST8Û GENADD DEV'CST,\CONT ;Q.CST - PNTR TO ASSOCIATE CST4Ü .WORD 0 ;Q.STAT - STATUS BITS (PORT-CONTROLLER)Ý .WORD 0 ;Q.SAD -3Ý .BYTE 0 ;Q.ID - CONTROLLER MODEL ID ;JJM308 5Ý .BYTE 0 ;Q.INF - CONTROLLER INFORMATION ;JJM308 8ß .BYTE RNUM ;Q.RSPN - NUMBER OF RESPONSE RINGS ;**-11à .BYTE CNUM ;Q.CMDN - NUMBER OF COMMAND RINGS-á3æ .BYTE 0 ;Q.CTM - CURRENT TIME OUT COUNT ;**-4O*ç .BYTE 0 ;Q.RTY - CURRENT RETRY COUNT2ç ;Q.RING - START OF RING AREA. MUST ;JJM308+ç ;BE SAME ADDRESS AS Q.FRSP! ;JJM308ODì GENADD DEV'FRR,\CONT ;Q.FRSP - PNTR TO FIRST RESPONSE RING ;**-4=í GENADD DEV'LRR,\CONT ;Q.LRSP - PNTR TO LAST RESPONSE RING >í GENADD DEV'FCR,\CONT ;Q.FCMD - FIRST COMMAND RING ;JJM308>í GENADD DEV'LCR,\CONT ;Q.LCMD - LAST COMMAND RING ;JJM308?î GENADD DEV'RPT,\CONT ;Q.RPAT - PNTR TO RSP PACKET ADDRESSES0?ï GENADD DEV'CPT,\CONT ;Q.CPAT - PNTR TO CMD PACKET ADDRESSES-9ï .WORD 0 ;Q.CRSP - CURRENT RESPONSE RING WHEN ;JJM308 2ï ; CONTROLLER ONLINE (MSCP). ;JJM3086ï ;Q.STEP - SYNC STEP BIT WHEN CONTROLLER ;JJM3085ï ; IS SYNCRONIZING. THIS FIELD ;JJM308-6ï ; DELIBERATELY OVERLAPS Q.CRSP. ;JJM3088ï .WORD 0 ;Q.CCMD - CURRENT COMMAND RING WHEN ;JJM3085ï ; CONTROLLER IS ONLINE (MSCP). ;JJM308D/ï ;Q.INDX - SYNC STEP INDEX WHEN ;JJM308E4ï ; CONTROLLER IS SYNCRONIZING. ;JJM3080ï ; THIS FIELD DELIBERATELY ;JJM308*ï ; OVERLAPS Q.CCMD. ;JJM308Aï .WORD 0,0,0,0 ;Q.WRIT - WORDS TO WRITE TO SA IN SYNC ;JJM308E7ï .WORD 0 ;Q.TEMP - CONTR SPECIFIC WORK AREA ;JJM308T2ð; ---------------------------------------------2ñ; ALLOCATE SPACE FOR CMD/RSP TABLE OF ADDRESSES2ò; ---------------------------------------------7ó GENLAB DEV'RPT,\CONT ;TA00^2nn]n´cÚµcÛ¶c�·c›’BLE OF RSP PACKET ADDRESSEST?ô GENTAB DEV'DRP,\CONT,RPLEN,RNUM,RSP ;GEN TABLE OF ADDRESSESZ7õ GENLAB DEV'CPT,\CONT ;TABLE OF CMD PACKET ADDRESSESJ?ö GENTAB DEV'DCP,\CONT,CPLEN,CNUM,CMD ;GEN TABLE OF ADDRESSES06÷; -------------------------------------------------6ø; ALLOCATE THE SPACE FOR THE RESPONSE/COMMAND RINGS6ù; -------------------------------------------------/ú .WORD 0 ;CONTROLLER COMMAND INTERRUPT ADDR 0û .WORD 0 ;CONTROLLER RESPONSE INTERRUPT ADDR9ü GENLAB DEV'FRR,\CONT ;FIRST RESPONSE RING BEGINS HERE -ý .REPT *2 ;2 WORDS EACH; N-1 RINGSO þ .WORD 0ÿ .ENDR8 GENLAB DEV'LRR,\CONT ;LAST RESPONSE RING BEGINS HERE" .WORD 0,0 ;LAST RESPONSE RING8 GENLAB DEV'FCR,\CONT ;FIRST COMMAND RING BEGINS HERE .REPT *2  .WORD 0 .ENDR7 GENLAB DEV'LCR,\CONT ;LAST COMMAND RING BEGINS HERE-! .WORD 0,0 ;LAST COMMAND RINGW&; ---------------------------------& ; ALLOCATE COMMAND/RESPONSE PACKETS& ; ---------------------------------A  GENLAB DEV'DRP,\CONT ;REFERENCE LABEL TO RESPONSE PACKET AREAH  .REPT RNUM8  .WORD RPLEN ;INSURE MAX PACKET SIZE ON INITIAL CALL" .WORD 0 ;SECOND ENVELOPE WORD1 .BLKB RPLEN ;ALLOCATE ACTUAL RESPONSE PACKET . .ENDR ;DO FOR EACH RESPONSE RING DESIRED@ GENLAB DEV'DCP,\CONT ;REFERENCE LABEL TO COMMAND PACKET AREA  .REPT CNUM8 .WORD CPLEN ;INSURE MAX PACKET SIZE ON INITIAL CALL" .WORD 0 ;SECOND ENVELOPE WORD0 .BLKB CPLEN ;ALLOCATE ACTUAL COMMAND PACKET- .ENDR ;DO FOR EACH COMMAND RING DESIREDA#CONT=CONT + 1 ;NEXT CONTROLLERT) .ENDR ;LOOP ;ALL THE MSCP CONTROLLERS ;OB; GENERATE A TABLE WITH THE ADDRESSES OF THE QSTS FOR THIS CLASS6 .WORD LOOP ;RECORD NUMBER OF CONTROLLERS ;JJM310DEV'QTBL:: ;**-1  CONT=0D  .REPT LOOPE RECORD DEV,\CONTA  CONT=CONT + 1! .ENDR ;LOOP ".ENDM ;IRP$ ;**-1 %CODBEG = .r .PAGE ;**-76ODs .SBTTL PKTAC - ALLOCATE COMMAND PACKET GIVEN CMD RING DESCRIPTORt;+>u; **-PKTAC-ALLOCATE COMMAND PACKET GIVEN CMD RING DESCRIPTORv;RHw; THIS ROUTINE CALCULATES THE ADDRESS OF THE AVAILABLE COMMAND PACKET,Ix; GIVEN THE COMMAND DESCRIPTOR ADDRESS. SINCE THE ONLY WAY TO GET HERE Gy; IS IF THE PKTCHK ROUTINE HAS ALREADY BEEN CALLED, THIS ROUTINE WILL<z; ALWAYS RETURN WITH CARRY CLEAR, I.E. INDICATING SUCCESS.{;P |; INPUTS:P}; A~; R0=NUMBER OF WORDS TO ALLOCATE FOR THE TEXT PORTION OF PACKETK5; NOTE: THIS VALUE MUST NOT INCLUDE THE ENVELOPER€; R2=QST ADDRESS�; R3=I/O PACKET ADDRESSV‚; R4=SCB ADDRESSƒ; R5=UCB ADDRESS3„; Q.CCMD=ADDRESS OF AVAILABLE CMD RING DESCRIPTORD…;E †; OUTPUTS:‡;Oˆ; R0=DESTROYED.D=‰; R1=VIRTUAL ADDRESS OF COMMAND PACKET TO USE. THIS POINTSU?Š; TO THE PACKET ITSELF AND > NOT < TO THE PACKET ENVELOPE.R‹; R2,R3,R4,R5 PRESERVEDDGŒ; CARRY CLEAR=COMMAND PACKET ALLOCATED. CARRY ALWAYS RETURNED CLEAR.O�;-�PKTAC:: ;JJM307A� MOV Q.CCMD(R2),R1 ;ADDR OF CMD RING DESCR TO ALLOCATE ;JJM307QB� SUB Q.FCMD(R2),R1 ;THE BEGINNING OF THE CMD RING DESCR ;JJM307%� ASR R1 ;DIVIDE BY TWO ;JJM307A7� ADD Q.CPAT(R2),R1 ;BASE ADDR TO THE OFFSET ;JJM30701� MOV (R1),R1 ;ACTUAL PACKET ADDRESS ;JJM307K2� MOV R0,MSGLNG(R1) ;STORE IN ENVELOPE ;JJM3072� ASL MSGLNG(R1) ;MAKE IT A BYTE VALUE ;JJM3070� PUSH ;SAVE THE PACKET ADDRESS ;JJM3076�10$: CLR (R1)+ ;ZERO OUT A WORD OF PACKET ;JJM3074� SOB R0,10$ ;CLEAR OUT THE WHOLE PACKET ;JJM307+� POP ;GET PACKET ADDRESS ;JJM307(,� RETURN ;AND RETURN TO CALLER ;JJM307¨ .PAGE ;**-26DC© .SBTTL PKTCHK - CHECK FOR REQUIRED RESOURCES: NON-IMMEDIATE CMDS ?ª .SBTTL PKTCH1 - CHECK FOR REQUIRED RESOURCES: IMMEDIATE CMDSM«;+I¬; **-PKTCHK-CHECK FOR RESOURCES BEFORE ISSUING I/O - NON-IMMEDIATE CMDSEE­; **-PKTCH1-CHECK FOR RESOURCES BEFORE ISSUING I/O - IMMEDIATE CMDS0®;RU®; THIS ROUTINE CHECKS FOR SUFFICIENT RESOURCES TO ISSUE A COMMAND. SUCCESS ;JJM307E+®; IS RETURN IF AND ONLY IF: 00^:nümßmæàmçámýfáþfDATA ;JJM307 ®; ;JJM307>®; 1. THERE IS AT LEAST 1 HOST OWNED COMMAND RING. ;JJM307=®; 2. THERE ARE SUFFICIENT CREDITS TO ISSUE IT. ;JJM307D®; ;JJM307®; INPUTS: ;JJM307:®; ;JJM307!®; R2=QST ADDRESS ;JJM307 $®; VARIOUS QST FIELDS ;JJM307®; ;JJM307®; OUTPUTS: ;JJM307®; ;JJM307®; R0=PRESERVED ;JJM307O®; R1=DESTROYED ;JJM307 "®; R2-R5=PRESERVED ;JJM307D®; CARRY SET= NO RESOURCES AVAILABLE. Q.CCMD NOT MODIFIED ;JJM307F®; CARRY CLR= RESOURCES AVAILABLE. Q.CCMD(R2) HAS ADDRESS OF ;JJM3071®; AVAILABLE COMMAND RING TO USE. ;JJM307 ®; ;JJM307®; ;JJM307® .ENABL LSB ;JJM307®PKTCHK:: ;JJM307 ® ASSUME Q.CST,0 ;JJM307+® MOV (R2),R1 ;GET CST ADDRESS ;JJM307 4® CMP C.CMDS(R1),#1 ;AT LEAST 2 CREDITS? ;JJM3074® BLE 100$ ;NO. RETURN FAILURE TO CALLER ;JJM307<® MOV Q.CCMD(R2),R1 ;CHECK CURRENT CMD DESCRIPTOR ;JJM307(® TST MSW(R1) ;HOST OWNED? ;JJM3073® BLT 90$ ;NO. RETURN FAILURE TO CALLER ;JJM307S%® CLC ;INDICATE SUCCESS ;JJM307 0® RETURN ;AND GO BACK TO THE CALLER ;JJM307®PKTCH1:: ;JJM307 ® ASSUME Q.CST,0 ;JJM307+® MOV (R2),R1 ;GET CST ADDRESS ;JJM30732® TST C.CMDS(R1) ;AT LEAST ONE CREDIT? ;JJM3075® BLE 100$ ;NO. RETURN FAILURE TO CALLER ;JJM307B<® MOV Q.CCMD(R2),R1 ;CHECK CURRENT CMD DESCRIPTOR ;JJM307(® TST MSW(R1) ;HOST OWNED? ;JJM3073® BLT 90$ ;NO. RETURN FAILURE TO CALLER ;JJM307B%® CLC ;INDICATE SUCCESS ;JJM307 0® RETURN ;AND GO BACK TO THE CALLER ;JJM307®90$: ;JJM307 ® .IF DF,DSADEB ;JJM3079® INC UNKRNG ;COUNT IT (CREDIT OK, RING ISN'T) ;JJM307V® .ENDC ;DSADEB ;JJM307M® ;JJM3071*®100$: SEC ;INDICATE FAILURE ;JJM307® RETURN ;JJM307T® .DSABL LSB ;JJM307=á40$: RETURN ;RETURN TO CALLER USING CARRY AS FLAG ;**-50R â .DSABL LSBDã .PAGE,ä .SBTTL PKTDR - DEALLOCATE RECEIVE PACKETå;+&æ; **-PKTDR-DEALLOCATE RECEIVE PACKETç;Gè; THIS ROUTINE DEALLOCATES THE RECEIVE PACKET POINTED TO BY R1. THIS Cé; ENTAILS LOCATING THE CORRESPONDING RESPONSE RING DESCRIPTOR ANDK#ê; MARKING IT AS CONTROLLER OWNED.Dë; ì; INPUTS:í; 3î; R1=ADDRESS OF RESPONSE PACKET TO BE DEALLOCATEDJï; R2=QST ADDRESSð; R4=SCB ADDRESSñ; R5=UCB ADDRESS=ò; Q.CRSP(R2)=ADDRESS OF ASSOCIATED RESPONSE RING DESCRIPTOR5ó; ô; OUTPUTS:õ;Aö; R1,R2,R3,R4,R5 PRESERVEDE÷; ASSOCIATED RESPONSE RING DESCRIPTOR IS MARKED AS CONTROLLER OWNEDø;Hù;-ú ûPKTDR::S=ü MOV #RPLEN,MSGLNG(R1) ;RESTORE MAXIMUM REPONSE PACKET SIZEI6ý MOV Q.CRSP(R2),R0 ;GET CURRENT RSP RING DESCR ADDR1þ BIS #OWN,MSW(R0) ;MARK IT AS CONTROLLER OWNED&ÿ RETURN ;AND RETURN TO THE CALLER .PAGE/ .SBTTL PORINT - CONTROLLER INTERRUPT HANDLERS;++; **-PORINT- CONTROLLER INTERRUPT HANDLERO;DF; INTERRUPTS ARE RECEIVED FROM A CONTROLLER UNDER FOUR CIRCUMSTANCES; THEY ARE AS FOLLOWS:;OF; 1. DURING THE INITIALIZATION PROCESS (OPEN THE "VIRTUAL CIRCUIT")> ; 2. WHEN THE "COMMAND RING BUFFER" TRANSITIONS FROM "FULL" ; TO "NOT FULL"2A ; 3. WHEN THE "RESPONSE RING BUFFER" TRANSITIONS FROM "EMPTY"I ; TO "NOT EMPTY"F ; 4. WHEN A FATAL CONTROLLER ERROR IS DETECTED AND AN INTERRUPT CAN3; BE GENERATED. FATAL CONTROLLER ERRORS ARE:R; 9; A. FAILURE TO BECOME UNIBUS MASTER FOR DATA TRANSFERA5; B. FAILURE TO BECOME UNIBUS MASTER FOR INTERRUPTO/; C. FAILURE TO ACCESS I/O PAGE REGISTERS ORR6; COMMUNICATIONS AREA (I.E. NON-EXISTENT MEMORY)$; D. UNIBUS PARITY ERROR DETECTED; ; INPUT"; R5 POINTS TO A UCB;-PORINT:: ;JJM3074 MOV S.QST(R4),R2 ;R2 POINTS TO THE QST ;JJM307  ASSUME Q.CST,0 ;JJM3079 MOV (R2),R3 ;/*Q.CST*/ ;R3 POINTS TO THE CST ;JJM307C4 MOV S.CSR(R4),R1 ;R1 POINTS TO THE CSR ;JJM307  ASSUME C.STAT,0 ;JJM307D BIT #C1.F00^Bnn]n´cÚµcÛ¶c�·c›’AT,(R3) ;WAITING FOR TIMEOUT TO START RECOVERY? ;JJM3076 ;CAN SOMETIMES GET INTERRUPT IN MIDDLE ;JJM3074 ;OF POWERFAIL BEFORE CONTROLLER GETS ;JJM307" ;RE-INITIALIZED. ;JJM307* BNE 55$ ;IF NE, YES, RETURN ;JJM3076 TST Q.STAT(R2) ;IN SYNCHRONIZATION STATE? ;JJM3078 BMI 70$ ;GO HANDLE SYNCH RELATED INTERRUPTS ;JJM307; ;JJM307=; THIS SECTION DEALS WITH RESPONSES AND COMMANDS ;JJM307O; ;JJM307A10$: TST SA(R1) ;DID CONTROLLER SUFFER A FATAL ERROR? ;JJM307I9 BMI 60$ ;HANDLE IT AS CONTROLLER FATAL ERROR ;JJM307 ;15$: MOV Q.RING(R2),R1 ;R1 POINTS TO THE RINGS ;JJM307T= CLR CMDINT(R1) ;CLEAR COMMAND INTERRUPT INDICATOR ;JJM307E/ CLR RSPINT(R1) ;AND RESPONSE TOO. ;JJM307A; ;JJM307(; PROCESS ALL RESPONSES ;JJM307; ;JJM307;20$: MOV Q.CRSP(R2),R1 ;STARTING RESPONSE RING ;JJM307W723$: TST MSW(R1) ;DOES HOST OWN THIS RING? ;JJM30737 BMI 50$ ;NO. WE MUST BE DONE WITH THE SCAN ;JJM307R< SUB Q.FRSP(R2),R1 ;GET OFFSET TO RING FROM BASE ;JJM307% ASR R1 ;DIVIDE BY TWO ;JJM307R< ADD Q.RPAT(R2),R1 ;GET TABLE ADDRESS OF ADDRESS ;JJM3072 MOV (R1),R1 ;GET REAL PACKET ADDRESS ;JJM307; MOVB CREDIT(R1),R0 ;ELSE, PROCESS THE RESPONSE ;JJM307R? BIC #^C,R0 ;R0 CONTAINS CREDIT/DEBIT FIELD ;JJM307M9 ADD R0,C.CMDS(R3) ;ADD TO CLASS CREDIT COUNT ;JJM307:" MOV CREDIT(R1),R0 ;JJM307? BIC #^C,R0 ;R0 CONTAINS MESSAGE TYPE FIELD ;JJM307J5 BNE 27$ ;MUST NOT BE A SEQUENTIAL PACKET ;JJM307B: ASSUME MSGSEQ,0 ;MAKE THAT ASSUMPTION, THOUGH ;JJM307: CALLV CLASS,CLAEND ;PROCESS SEQUENTIAL PACKET ;JJM3076 ASSUME Q.CST,0 ;ASSUME AT START OF TABLE ;JJM307( MOV (R2),R3 ;RESTORE CST ;JJM307' BR 45$ ;JOIN COMMON CODE ;JJM307NG27$: CMPB #,R0 ;IS THIS A REAL LIVE DATAGRAM? ;JJM307R5 BNE 40$ ;NO. JUST DEALLOCATE THE PACKET ;JJM30776 CALLV CLASS,CLADAT ;PROCESS THE DATAGRAM ;JJM307' BR 45$ ;JOIN COMMON CODE ;JJM307E40$: ;JJM307 .IF DF,DSADEB ;JJM307 INC UNKPKT ;JJM307L .ENDC ;DSADEB ;JJM307I ;JJM3070 CALL PKTDR ;THROW THE PACKET AWAY ;JJM307C45$: MOV Q.CRSP(R2),R1 ;GET CURRENT RING DESCRIPTOR ADDR ;JJM307N5 ADD #CMDSIZ,R1 ;POINT TO NEXT DESCRIPTOR ;JJM307H: CMP R1,Q.LRSP(R2) ;DO WE NEED TO WRAP AROUND? ;JJM307 BLOS 47$ ;NO. ;JJM3079 MOV Q.FRSP(R2),R1 ;YES. SO WRAP TO BEGINNING ;JJM307B@47$: MOV R1,Q.CRSP(R2) ;REMEMBER THE NEXT ONE TO USE ;JJM307- BR 23$ ;AND GO LOOK FOR ANOTHER ;JJM307 ; ;JJM307G; ALL RESPONSES HAVE BEEN PROCESSED. TRY TO START MORE I/O ;JJM307T; ;JJM307F50$: JMPV CLASS,CLACMD ;CALL CLASS DRIVER TO START MORE I/O ;JJM30755$: RETURN ;JJM307N; ;JJM307N; HANDLE CONTROLLER ERROR. ALL ASSOCIATED CLASS DRIVERS WOULD HAVE ;JJM307+; TO BE TOLD AT THIS POINT. ;JJM307O; ;JJM307660$: SEC ;INDICATE ERROR SHOULD BE LOGGED ;JJM307: JMPV CLASS,CLAERR ;INFORM THE CLASS DRIVER(S) ;JJM307; ;JJM3079; HANDLE SYNCHRONIZATION RELATED INTERRUPTS ;JJM307M; ;JJM307670$: TST SA(R1) ;WAS THERE A FATAL ERROR? ;JJM307' BPL 75$ ;NO. SO CONTINUE ;JJM307:) JMP OPN ;YES. TRY TO RETRY ;JJM3073475$: TST Q.SAD(R2) ;SPURIOUS INTERRUPT? ;JJM307, BEQ 55$ ;YES. IGNORE IT THEN ;JJM307; JMP @Q.SAD(R2) ;NO. SO PROCESS NECESSARY STEP ;JJM307Cw .PAGE ;**-94D4x .SBTTL PORSEN - SEND COMMAND PACKET TO CONTROLLERy;+/z; **-PORSEN-SEND COMMAND PACKET TO CONTROLLERD{;NG|; THIS ROUTINE SENDS THE CURRENT COMMAND PACKET TO THE CONTROLLER FOR:G}; PROCESSING. ONCE THE PACKET HAS BEEN SENT, THIS ROUTINE DETERMINESNB~; THE NEXT AVAILABLE COMMAND RING THAT CAN BE USED. WRAP AROUND4; PROCESSING FOR THIS TAKES PLACE IN THIS ROUTINE.�; ;**-1 ‚; INPUTS:Jƒ;(„; R1=ADDRESS OF COMMAND PACKET TO SEND…; R2=Q00^JnümßmæàmçámýfáþfDATAST ADDRESS†; R3=I/O PACKET ADDRESS‡; R4=SCB ADDRESSˆ; R5=UCR ADDRESS+ˆ; VARIOUS QST AND CST FIELDS ;JJM304P�; ;**-4 Ž; OUTPUTS:�;U�; R1,R2,R3,R4,R5 PRESERVED<‘; Q.CCMD(R2)=ADDRESS OF NEXT AVAILABLE CMD RING DESCRIPTOR’; COMMAND PACKET DISPATCHEDD8“; C.CMDS(R3)=NEW CREDIT COUNT (ONE LESS THAN ON ENTRY)”;D•;-•PORSEN:: ;JJM307 • ASSUME Q.CST,0 ;JJM3079• MOV (R2),R0 ;/*Q.CST*/ ;GET THE CST ADDRESS ;JJM307 =• MOVB C.VCID(R0),VCID(R1) ;SET VIRTUAL CIRCUIT ID ;JJM307D4• DEC C.CMDS(R0) ;DECREMENT CREDIT COUNT ;JJM3078• MOV Q.CCMD(R2),R0 ;GET CURRENT COMMAND RING ;JJM307E• BIS #OWN!FLAG,MSW(R0) ;MARK AS CONTR OWNED/REQUEST INTRPTS ;JJM307E/• MOV S.KRB(R4),R0 ;GET KRB ADDRESS ;JJM307M/• MOV K.CSR(R0),R0 ;GET CSR ADDRESS ;JJM307 • ASSUME IP,0 ;JJM3070• TST (R0) ;START CONTROLLER LOOKING ;JJM307:•5$: ADD #CMDSIZ,Q.CCMD(R2) ;POINT TO NEXT RING ;JJM3076• CMP Q.CCMD(R2),Q.LCMD(R2) ;OUT OF RINGS? ;JJM307• BLOS 10$ ;NO. ;JJM307@• MOV Q.FCMD(R2),Q.CCMD(R2) ;YES. PERFORM WRAP AROUND ;JJM307(•10$: RETURN ;AND GO BACK ;JJM307² .PAGE ;**-28R9³ .SBTTL PORSUP - SETUP DATA STRUCTURES ETC FOR THE PORTK´;+ µ; **-PORSUP-PORT SETUP ROUTINE¶;V9·; THE FOLLOWING THREE ROUTINES WILL BE CALLED BY PORSUP ¸; TO DO THE FOLLOWING:¹;SGº; SETUP - PERFORM DRIVER SPECIFIC SET UP FUNCTIONS SUCH AS SETTING UPN1»; THE CST, QST, AND RINGS FOR THE CONTROLLER.U¼;RC½; VACSET - SET UP INFORMATION NEEDED TO CONVERT VIRTUAL ADDRESSES.>¾; TO PHYSICAL ADDRESSES. IF A UMR IS NEEDED TO MAP UQCOM,.¿; THEN IT SHOULD BE ALLOCATED AND MAPPED.À;. Á; INPUTS:-Â;PÃ; R1=VIRTUAL CIRCUIT IDEÄ; R4=SCB ADDRESSÅ; R5=UCB ADDRESSÆ;E Ç; OUTPUTS:È;L É; R2=QST Ê; R4=SCB Ë; R5=UCBÌ; STORE QST IN SCB"Í; CALCAULATE UQRELC AND UQRELC+2)Î; SEE VACSET ROUTINE FOR DESCRIPTION OF Ï; UQRELC AND UQRELC+2.Ð;- ÑPORSUP::*Ñ TST EXEVEC ;IF DONE ALREADY ;JJM325"Ñ BNE 10$ ;SKIP THIS ;JJM325;Ñ MOV @#112,R0 ;GET POINTER TO VECTOR OF POINTERS ;JJM325 >Ñ MOV @(R0),-(SP) ;MAP ROUTINE WITH CORRECT APR BIAS ;JJM325>Ñ MOV #120000,-(SP) ;GET ADDR. OF TRANSLATE ROUTINE ;JJM3255Ñ MOV #EXEVCL,R2 ;SPECIFY LENGTH OF VECTOR ;JJM325-Ñ MOV #EXEVEC,R3 ;POINT TO VECTOR ;JJM325TEÑ CALL @<140000+MPPRO> ;CALL ROUTINE IN EXEC WHICH MAPS AND ;JJM325I(Ñ ;CALLS TRANSLATE ROUTINE ;JJM325Ñ10$: ;JJM325)Ò MOV S.CON(R4),R0 ;GET CONTROLLER INDEX*Ó ASL R1 ;CONVERT VC ID INTO BYTE OFFSET2Ô ADD TABTAB(R1),R0 ;R0 POINTS TO THE QST ADDRESS,Õ MOV (R0),R2 ;R2 CONTAINS THE QST ADDRESS*Ö ASR R1 ;RESTORE THE VIRTUAL CIRCUIT ID-× MOV R2,S.QST(R4) ;STORE QST ADDRESS IN SCB# × ASSUME Q.CST,0 ;JJM3063Ø MOV (R2),R3 ;/*Q.CST*/ ;R3 CONTAINS CST ADDRESSJ1Ù MOVB R1,C.VCID(R3) ;STORE THE VC ID IN THE CSTE Ú RETURNSÛ .PAGEIÜ .SBTTL PORUMR - ALLOCATE/DEALLOCATE STATIC UMR AND DYNAMIC WAIT BLOCKSÝ;+DÞ; **-PORUMR-ALLOCATE/DEALLOCATE STATIC UMR AND DYNAMIC WAIT BLOCKSß;SQà; CALLED WHENEVER A CONTROLLER IS BROUGHT ONLINE OR OFFLINE. THE STATIC UMR ISSOá; ALLOCATED ONLY ONCE, AND A COUNT IS KEPT OF HOW MANY CONTROLLERS ARE ONLINE Lâ; TO THE PORT. WHEN THE COUNT GOES TO ZERO, THE UMR IS DEALLOCATED. WAITOã; BLOCKS ARE ALLOCATED ON A PER-CONTROLLER BASIS TO AVOID HAVING TO DEAL WITHHä; FAIRNESS PROBLEMS.å; æ; INPUTS:Uç;AAè; C = 1 TRANSITION TO OFFLINE - DEALLOCATE UMR AND WAIT BLOCKS*é; R2 = KRB ADDRESSê; >ë; C = 0 TRANSITION TO ONLINE - ALLOCATE UMR AND WAIT BLOCKS4ì; R0 = HIGH 6 BITS OF RELOCATION BIAS FOR PORT UMR4í; R1 = LOW 16 BITS OF RELOCATION BIAS FOR PORT UMRî; R2 = KRB ADDRESSï; R3 = CST ADDRESSð;R ñ; OUTPUTS:ò;G0ó; UMR AND WAIT BLOCKS ALLOCATED OR DEALLOCATEDKô; FOR THE ONLINE TRANSITION, R0 AND R1 CONTAIN THE RELOCATION BIAS OF THEõ; ALLOCATED UMR.ö;-÷ øPORUMR:*þ BCC 30$ ;IF CC ONLINE REQUEST ;**-5ÿ= TST CONCNT ;IS THIS THE LAST CONTROLLER 00^Rnn]n´cÚµcÛ¶c�·c›’MAPPING THE PORT?0* BNE 10$ ;NO, JUST DUMP THE WAIT BLOCKS: MOV UMRMAP,R2 ;GET THE ADDRESS OF THE UMR MAPPING BLOCK7 CLR UMRMAP ;MAKE SURE UMRMAP IS ZERO SO WE ALLOCATE% ;..A STATIC UMR AGAIN NEXT TIMEE PUSH ;SAVE THE CST1 CALL @DEUMR ;DEALLOCATE STATIC UMR ;JJM325= MOV R2,R0 ;MOVE THE ADDRESS OF THE CORE BLOCK TO R0 ;**-1I$ MOV #M.LGTH,R1 ;CORE BLOCK LENGTH4 CALL @DEACB ;DEALLOCATE THE CORE BLOCK ;JJM325&  POP ;RESTORE THE CST ;**-1> 10$: ADD #C.UMRW,R3 ;POINT TO THE START OF THE UMR WAIT BLOC? 15$: MOV #UMRWTB,R1 ;SET THE LENGTH OF A WAIT BLOCK ;PKW106G(  MOV (R3),R0 ;GET A BLOCK ;PKW106(  BEQ 20$ ;IF EQ WE'RE DONE ;PKW106B  .IIF DF M$$PRO TST -(R0) ;BACK UP OVER UNIBUS RUN MASK ;PKW106- CLR (R3)+ ;CLEAR OUT THE ADDRESS ;**-30 PUSH ;SAVE IT4 CALL @DEACB ;DEALLOCATE THE CORE BLOCK ;JJM325& POP ;AND RESTORE IT ;**-1 BR 15$ ;GO DO ANOTHER20$: RETURN ;ALL DONE 30$: ;**-3.8 TST UMRMAP ;IS THIS THE FIRST CONTROLLER TO CONNECT?% BNE 40$ ;NO, JUST GET WAIT BLOCKS < PUSH ;SAVE RELOCATION BIAS HIGH AND LOW ;PKW106< MOV #M.LGTH,R1 ;LENGTH OF CORE BLOCK TO ALLOCATE ;PKW1061 CALL @ALOCB ;ALLOCATE A CORE BLOCK ;PKW106R$ BCS 80$ ;ERROR, EXIT ;PKW106; MOV R0,UMRMAP ;SAVE THE ADDRESS OF THE CORE BLOCK ;**-3O/ POP M.BFVL(R0) ;SET UP LO 16-BITS OF ADDRESS J  MOVB (SP),M.BFVH(R0) ;SET UP HI 6-BITS OF ADDRESS (WE ONLY NEED A BYTE)5! TST (SP)+ ;POP OFF THE WORD TO MAINTAIN THE STACKL," MOV #4,M.UMRN(R0) ;SET UP COUNT FOR 1 UMR*" CALL @ASUMR ;GO ASSIGN UMR ;PKW106)" BCS 90$ ;IF CS, ERROR EXIT ;PKW106R%; ;**-2F&; WE'LL DO THE ACTUAL MAPPING LATER SO THAT A RESYNCH CAN REMAP ALSO';?(; NOW WE ALLOCATE A SET OF UMR WAIT BLOCKS FOR THE CONTROLLERA);S*40$:,+ TST C.UMRW(R3) ;ARE WAIT BLOCKS ASSIGNED?, BNE 70$ ;IF NE, YES, DONE 4, MOV #DUUMR,R2 ;ASSUME THAT IT IS A DISK ;PKW106 , ASSUME U.DCB,0 ;JJM306(, MOV (R5),R1 ;GET THE DCB ;JJM306:, CMP #"DU,D.NAM(R1) ;SEE IF IT IS DISK OR TAPE ;PKW106(, BEQ 50$ ;IF EQ IT IS DISK ;PKW106), MOV #MUUMR,R2 ;IT'S A TAPE ;PKW10627,50$: PUSH ;SAVE WORKING REGISTERS ;PKW106 4, ADD #C.UMRW,R3 ;POINT TO UMR WAIT QUEUE ;PKW1066,60$: MOV #UMRWTB,R1 ;LENGTH OF WORK BLOCK ;PKW106,, PUSH R2 ;SAVE THE BLOCK INDEX ;PKW106A, CALL @ALOCB ;ALLOCATE A CORE BLOCK FOR UMR ASSIGNMENT ;PKW106 -, POP R2 ;RESTORE THE BLOCK INDEX ;PKW106M;, BCS 65$ ;WE WILL ALLOCATE THE REST DYNAMICALLY ;PKW106S, ;PKW106A3, .IF DF M$$PRO ;MULTIPROCESSOR SYSTEM ;PKW1066,, MOV U.SCB(R5),R4 ;SCB ADDRESS ;PKW1062, MOV S.URM(R4),(R0)+ ;UNIBUS RUN MASK ;PKW106, .ENDC ;M$$PRO ;PKW106 , ;PKW10617, MOV R0,(R3)+ ;PUT THE ADDRESS IN THE TABLE ;PKW10661, SOB R2,60$ ;LOOP THROUGH ALLOCATION ;PKW106C1,65$: POP ;RESTORE REGISTERS ;PKW106N<C70$: MOV UMRMAP,R0 ;GET THE STATIC UMR WAIT BLOCK ;**-22*C CALL @MPUB1 ;MAP THE UNIBUS ;GM1121E MOV UMRMAP,R2 ;GET BACK THE STATIC UMR ;**-1P5F MOVB M.UMVH(R2),R0 ;HIGH 2 BITS OF RELOCATION BIAS)%G ASH #-4,R0 ;SHIFT BITS 4:5 TO 0:1U4H MOV M.UMVL(R2),R1 ;LOW 16 BITS OF RELOCATION BIAS!H CLC ;GOOD RETURN ;PKW106PH RETURN ;PKW106T1H80$: POP ;RESTORE REGISTERS ;PKW106 &H90$: SEC ;ERROR RETURN ;PKW106L RETURN ;**-3EM .PAGE/N .SBTTL PORSYN - PORT SYNCHRONIZATION ROUTINECO;++P; **-PORSYN-STANDARD PORT SYNCHRONIZATIONUQ; ER; TRANSFERED TO BY CLASS DRIVER TO START CONTROLLER SYNCHRONIZATION S;H T; INPUTS: U;SV; R5=UCB ADDRESSW; R4=SCB ADDRESSX; R3=CST ADDRESSY; R2=QST ADDRESSZ; S.CSR=CSR ADDRESSC&[; S.VCT=(INTERRUPT VECTOR ADDRESS)/4\;P ]; OUTPUTS:^; <_; IF INITIAL PART OF HARDWARE SYNCHRONIZATION BEGINS THEN:`;:6a; THE CONTROLLER HAS BEGUN STEP 1 OF SYNCHRONIZATIONb; R2-R5 PRESERVEDTc; R0,R1 DESTROYEDRHd; Q.RTY=RETRY-1 00^ZnümßmæàmçámýfáþfDATA(A TOTAL OF (RETRY) RE-TRIES WILL BE MADE BY THE PORT)Be; Q.SAD=OPN2 (AN INTERRUPT IS EXPECTED AND WILL CAUSE A TRANSFERf; TO THE ADDRESS IN Q.SAD)S2g; Q.STAT=Q1.SYN (CONTROLLER STATE=SYNCHRONIZING)Gg; Q.INDX=2 (ROUTINE WSW WILL USE THE SECOND ENTRY IN Q.WRIT) ;JJM308T<i; Q.CTM=STMOC (STOMC SECOND TIME OUT ON EACH STEP) ;**-1Aj; Q.STEP=STEP2 (WE ARE WAITING FOR COMPLETION OF STEP 1 AND THELk; BEGINNING OF STEP 2.H7l; Q.WRIT=4 STEP VALUES HOST MUST WRITE TO SA REGISTERn; ;**-1o; IF ALL RE-TRIES FAIL:Lp;Mq; CONTROL TRANSFERS TO CLASYN(r; C=1 TO INDICATE FAILUREWs; R5=UCB ADDRESSt; R4=SCB ADDRESSu; R3=CST ADDRESSv; R2=QST ADDRESS7w; Q.STAT=Q1.OFF (CONTROLLER STATE=OFF-LINE, UNUSABLE)Ux;-y zPORSYN::2{ MOVB #RETRY,Q.RTY(R2) ;SET UP FOR RETRY RE-TRYS4| CLR Q.SAD(R2) ;PROTECT AGAINST SPURIOUS INTERRUPT} ;UQINT WILL JUST DROP IT(~ ;IF Q.SAD(R2)=0 AND Q1.SYN IS SET.9 MOV #Q1.SYN,Q.STAT(R2) ;CONTROLLER STATE=SYNCHRONIZING '€ ;CONTROL NOW FALLS THROUGH TO THEL� ;OPN MODULE.‚!ƒ BIS #C1.SYN,(R3) ;SET SYNC BITT6„ MOV #1,C.CMDS(R3) ;SET INTITIAL CREDIT COUNT TO ONE*… ;MUST BE 1 BECAUSE IT IS DECREMENTED† ;WHEN THE OP.SCC IS SENT‡ .PAGE$‡ .SBTTL . OPN ;JJM304‰; ;**-1<Š; CONTROL TRANSFERS HERE IF AN ERROR IN SYNCHRONIZATION IS:‹; DETECTED. CONTROL ALSO FALLS THROUGH TO HERE FROM THEŒ; PORSYN ENTRY POINT.E�; Ž; INPUTS:Q�;(�; R0,R1 MAY BE DESTROYED‘; R5=UCB ADDRESS’; R4=SCB ADDRESS“; R3=CST ADDRESS”; R2=QST ADDRESS!•; Q.RTY=NUMBER OF RE-TRIES LEFTM–;, — .ENABL LSB ˜OPN::C+› DECB Q.RTY(R2) ;TRY OR RE-TRY? ;**-2Iœ BGE 5$ ;IF GE, YES4� MOV #Q1.OFF,Q.STAT(R2) ;CONTROLLER STATE=OFF-LINEž; EŸ; LET CLASS DRIVER HANDLE FAILURE OF SYNCHRONIZATION BY TRANSFERINGR  ; TO CLASYN WITH THE CARRY SET¡;C9¡BADSYN: SEC ;INDICATE FAILURE TO SYNCHRONIZE ;PKW106Y>£ JMPV CLASS,CLASYN ;TRANSFER TO CLASS DRIVER (CLASYN) ;**-1¤;5%¥; COMMENCE HARDWARE SYNCHRONIZATION3¦;A¦5$: ;JJM308¯; ;**-8-°; SET UP 4 STEP VALUES THAT HOST MUST WRITE:±;$² PUSH ;SAVE R3 MON THE STACK³ MOV R2,R3 ;R3=QST ADDRESS;´ ADD #Q.WRIT,R3 ;R3 POINTS TO THE Q.WRIT TABLE IN THE QST ;´; SET UP FIRST WORD TO PASS TO THE CONTROLLER ;JJM304R=¿ MOVB S.VCT(R4),(R3) ;(INTERRUPT VECTOR ADDR) / 4 ;**-10I&À BISB #INTE,(R3)+ ;ENABLE INTERRUPTSÁ;J1Â; CALCULATE COMMAND RING LENGTH AS A POWER OF 2 Ã;13Ä MOVB Q.CMDN(R2),R0 ;R0=NUMBER OF CMD DESCRIPTORS.Å MOV #-1,R1 ;R1 IS FOR COUNTING POWERS OF 2%Æ15$: INC R1 ;COUNT THIS POWER OF 2TÇ ASR R0 ;SHIFT RIGHTS,È BNE 15$ ;IF NE, COUNT ANOTHER POWER OF 2/É ASL R1 ;ELSE, SHIFT C RNG LNG INTO POSITIONT Ê ASL R1H Ë ASL R1 (Ì MOVB R1,(R3) ;AND ADD IT TO THE WORD3Í MOVB Q.RSPN(R2),R0 ;R0=NUMBER OF RSP DESCRIPTORSE.Î MOV #-1,R1 ;R1 IS FOR COUNTING POWERS OF 2%Ï25$: INC R1 ;COUNT THIS POWER OF 2OÐ ASR R0 ;SHIFT RIGHTW,Ñ BNE 25$ ;IF NE, COUNT ANOTHER POWER OF 2'Ò BISB R1,(R3) ;ADD R RNG LNG TO WORD1Ó BISB #200,(R3) ;SET BIT 15-Ô POP ;RESTORE R3 TO ORIGINAL CONTENTS Õ;F:Ö; CONTINUE WITH INITIALIZATION AND START SYNCHRONIZATION×; :Ø MOV #STEP1,Q.STEP(R2) ;Q.STEP=FIRST STEP VALUE EXPECTED8Ù CLR Q.INDX(R2) ;INITIALIZE OFFSET INTO TABLES TO ZERO)Ú MOV S.CSR(R4),R0 ;R0 POINTS TO THE CSRÚ ASSUME IP,0 ;JJM305G0Ú CLR (R0) ;HARD INIT THE CONTROLLER ;JJM305-Ú PUSH <#50.> ;COUNTER FOR DELAY ;JJM305E(Ú30$: DEC (SP) ;COUNT DOWN ;JJM305+Ú BGT 30$ ; FOR ENTIRE DELAY ;JJM305 )Ú TST (SP)+ ;CLEAN OFF STACK ;JJM305R;ß CALL WSW ;PROCESS START OF STEP 1 (TABLE DRIVEN) ;**-4S.à BCS OPN ;IN CASE OF ERROR GO TRY TO RE-TRYá;;9â; IN CASE AN ERROR IS DETECTED CONTROL TRANSFERS TO OPNLä; ;**-1Kå; SET UP KS.EXT BIT IN K.STS FOR THE CONTROLLER, BASED ON QB BIT IN VALUE 'æ; READ FROM SA AT THE START OF STEP 1Tç;R1î MOV S.KRB(R4),R4 ;GET THE KRB ADDRESS ;**-6J>ï BIC #KS.EXT00^bnn]n´cÚµcÛ¶c�·c›’,K.STS(R4) ;ASSUME EXTENDED MEMORY NOT SUPPORTEDCï BIT #QB,Q.TEMP(R2) ;CONTROLLER SUPPORT 22 BIT HOST BUS? ;JJM308M ñ BEQ 35$ ;IF EQ, NO ;**-1ò;Eó; * * * N O T E * * *Bô;N?õ; THE FOLLOWING BRANCH MAY BE NOP'D IN ORDER TO ALLOW THE USEI<ö; OF 22-BIT MSCP CONTROLLERS ON BUS ADAPTERS WHICH REQUIRE$÷; THE USE OF UNIBUS MAP REGISTERS.ø;E1ù$$$BR1::BR 34$ ;NORMALLY SKIP THE SYSTEM CHECKH>ù BIT #HF.UBM,@HFMSK ;ARE THERE UMR'S ON THE SYSTEM ;JJM3253û BNE 35$ ;YES, THEN USE CONVERTER OPTION ;**-1Eü34$:>ý BIS #KS.EXT,K.STS(R4) ;INDICATE CONTROLLER IS ON 22 BIT BUS0þ35$: MOV U.SCB(R5),R4 ;RESTORE THE SCB ADDRESSE PUSH <120000+SCUCB> ;GET THE ADDRESS OF THE SCAN UCB ROUTINE ;**-3N'37$: CALL @(SP)+ ;CALL THE COROUTINEI BCS 45$ ;IF CS, ALL DONE> BIC #DV.EXT,U.CW1(R5) ;ASSUME EXTENDED MEMORY NOT SUPPORTEDC BIT #QB,Q.TEMP(R2) ;CONTROLLER SUPPORT 22 BIT HOST BUS? ;JJM308B BEQ 37$ ;IF EQ NO ;**-1S ;Y ; * * * N O T E * * *S ;N? ; THE FOLLOWING BRANCH MAY BE NOP'D IN ORDER TO ALLOW THE USE;< ; OF 22-BIT MSCP CONTROLLERS ON BUS ADAPTERS WHICH REQUIRE$; THE USE OF UNIBUS MAP REGISTERS.;C)$$$BR2::BR 38$ ;SKIP THE SYSTEM CHECKSN> BIT #HF.UBM,@HFMSK ;ARE THERE UMR'S ON THE SYSTEM ;JJM3253 BNE 37$ ;YES, THEN USE CONVERTER OPTION ;**-1T38$:: BIS #DV.EXT,U.CW1(R5) ;INDICATE DEVICE IS ON 22 BIT BUS BR 37$ ;GO DO ANOTHERB45$: ;CONTINUEN; ;**-2-; SET UP THE RELOCATION REGISTERS AT UQRELQH;L CALL VACSET& BCS BADSYN ;ERROR EXIT ;PKW106;2D; SET UP THE NEXT THREE WORDS TO SEND TO THE CONTROLLER ;JJM3042; ;**-203 PUSH ;SAVE R3"4 MOV R2,R3 ;GET THE QST ADDRESS>5 ADD #Q.WRIT+2,R3 ;GET TO THE ADDRESS OF THE NEXT START WORD:6 MOV Q.RING(R2),R0 ;R0 POINTS TO THE RING BASE (LOW ADDR.7 CALL VACPA ;CONVERT R0 TO PHYSICAL ADDRESS4: MOV R0,(R3)+ ;Q.WRIT+2=RING BASE LOW BITS ;**-2-; MOV R1,(R3)+ ;Q.WRIT+4=RING BASE HIGH BITSE,< MOV #LF!GO,(R3)+ ;Q.WRIT+6=LAST FAIL ! GO= POP ;RESTORE R3>;1C?; SET TIME-OUT, AND RETURN, AN INTERRUPT WILL TRANSFER TO OPN2 TO :@; PROCESS THE COMPLETION OF STEP 1 (BEGINNING OF STEP 2)3A MOVB #STMOC,S.ITM(R4) ;SET INITIAL TIMEOUT COUNTG3B MOVB #STMOC,S.CTM(R4) ;AND CURRENT TIMEOUT COUNTN&C MOV R5,S.BSYU(R4) ;SET THE BUSY UCB0D BISB #US.BSY,U.STS(R5) ;MARK THE UNIT AS BUSY?E MOV #OPN2,Q.SAD(R2) ;THE NEXT INTERRUPT WILL TAKE US TO OPN2VF RETURN ;RETURNI G .DSABL LSBTH .PAGE%H .SBTTL . OPN2 ;JJM304J;+ ;**-1 K; AT THE START OF STEP 2;L; OPN2 IS JUMPED TO FROM UQINT (THE INTERRUPT PROCESSOR);SN; ;**-1 O; INPUTS:NP;FQ; R5=UCB ADDRESSR; R4=SCB ADDRESSS; R3=CST ADDRESST; R2=QST ADDRESSU;R V; OUTPUTS:W;EX; R2-R5 PRESERVED,Y; R0,R1 DESTROYEDUZ; S.ITM(R4)=STMOCS[; Q.SAD=OPN3\;-]^OPN2::+_ CALL WSW ;PROCESS STEP 2 (TABLE DRIVEN)L` BCC 5$ ;ALL IS OKRa JMP OPN ;WE FAILED, RESTART;b5$: MOVB S.ITM(R4),S.CTM(R4) ;RESET CURRENT TIMEOUT COUNT ?c MOV #OPN3,Q.SAD(R2) ;THE NEXT INTERRUPT WILL TAKE US TO OPN3Ud RETURN ;RETURNRe .PAGE%e .SBTTL . OPN3 ;JJM304Fg;+ ;**-1h; AT THE START OF STEP 3 i; OPN3 IS JUMPED TO FROM UQINTk; ;**-1 l; INPUTS: m;Rn; R5=UCB ADDRESSo; R4=SCB ADDRESSp; R3=CST ADDRESSq; R2=QST ADDRESSr; s; OUTPUTS:t;Su; R2-R5 PRESERVEDNv; R0,R1 DESTROYEDSw; Q.CTM=STMOC x; Q.SAD=OPN4y;-z{OPN3::+| CALL WSW ;PROCESS STEP 3 (TABLE DRIVEN) $} BCC 5$ ;IF CC, SUCCESS, CONTINUE.~ JMP OPN ;ELSE JUMP TO OPN AND MAYBE RE-TRY;5$: MOVB S.ITM(R4),S.CTM(R4) ;RESET CURRENT TIMEOUT COUNT ?€ MOV #OPN4,Q.SAD(R2) ;THE NEXT INTERRUPT WILL TAKE US TO OPN4R� RETURN ;RETURN ‚ .PAGE%‚ .SBTTL . OPN4 ;JJM304„;+ ;**-1 …; AT THE START OF STEP 4 †; OPN4 IS JUMPED TO FROM UQINTˆ; ;**-1 ‰; INPUTS:EŠ;E‹; R5=UCB ADDRESSŒ; R4=SCB ADDRESS�; R3=CST A00^jnümßmæàmçámýfáþfDATADDRESSŽ; R2=QST ADDRESS�;3 �; OUTPUTS:‘;#’; CONTROL IS TRANSFERED TO CLASYN.“; C=0 (INDICATES SUCCESSFUL SYNCHRONIZATION)”; R2-R5 PRESERVEDC•; R0,R1 DESTROYED –; Q.CTM=? —; Q.SAD=?4*˜; Q.STAT=Q1.RDY (CONTROLLER STATE=READY)™; RING DESCRIPTORS ARE SET UPš;E›;-œ�OPN4::+ž CALL WSW ;PROCESS STEP 4 (TABLE DRIVEN)$Ÿ BCC 5$ ;IF CC, SUCCESS, CONTINUE.  JMP OPN ;ELSE JUMP TO OPN AND MAYBE RE-TRY+¡5$: CALL RNGSET ;SET UP RING DESCRIPTORSA1¢ MOV #Q1.RDY,Q.STAT(R2) ;CONTROLLER STATE=READY3J¢ MOV Q.FRSP(R2),Q.CRSP(R2) ;SET UP INITIAL RESPONSE RING POINTER ;JJM308J¢ MOV Q.FCMD(R2),Q.CCMD(R2) ;SET UP INITIAL COMMAND RING POINTER ;JJM308#¤ CLC ;INDICATE SUCCESS ;**-1T8¥ JMPV CLASS,CLASYN ;TRANSFER TO CLASS DRIVER TO HANDLE¦ .PAGE4§ .SBTTL RNGSET - INITIAL SETUP OF RING DESCRIPTORS¨;+0©; **-RNGSET-INITIAL SET UP OF RING DESCRIPTORSª;PF«; THIS ROUTINE IMPLEMENTS THE DESIGN DECISION TO STATICALLY ALLOCATEG¬; A PACKET TO EACH RING DESCRIPTOR. IT FILLS IN EACH DESCRIPTOR WITHVF­; THE PHYSICAL ADDRESS OF THE PACKET ASSOCIATED WITH THE DESCRIPTOR.®;Q ¯; INPUTS:C°;)±; R2=QST ADDRESS²; R4=SCB ADDRESS$²; VARIOUS QST FIELDS ;JJM304»; ;**-8 ¼; OUTPUTS:½;T¾; IT DESTROYS R0, R1>¿; A PACKET IS ASSOCIATED PERMANENTLY WITH EACH DESCRIPTOR BY=À; FILLING THE DESCRIPTOR WITH THE PACKETS PHYSICAL ADDRESS.,Á; ALL CMD DESCRIPTORS ARE MADE HOST OWNED.DÂ; ALL RSP DESCRIPTORS ARE MADE CONTROLLER OWNED WITH (FLAG BIT)=1.Ã;NÄ;-Å ÆRNGSET::3Ç PUSH ;SAVE R4,R3,R2, R2 MUST BE LAST!I0È MOV Q.RING(R2),R3 ;R3 POINTS TO THE RING BASE.É MOVB Q.RSPN(R2),R4 ;R4=NUMBER OF RSP DESCR.DÊ MOV Q.RPAT(R2),R2 ;R2 POINTS TO THE TABLE OF RSP PACKET ADDRESSES0Ë5$: MOV (R2)+,R0 ;R0=VA OF RSP PACKET (TEXT+0),Ì MOV #RPLEN,MSGLNG(R0) ;SET MESSAGE LENGTH(Í CLR CREDIT(R0) ;CLEAR CREDIT AND VCID1Î CALL VACPA ;CONVERT VIRTUAL ADDR. TO PHYSICALEÏ ;R0=LOW BITSÐ ;R1=HIGH BITSR7Ñ MOV R0,(R3)+ ;FILL IN DESCR. WITH PHYSICAL PKT ADDR.:Ò MOV R1,(R3)@Ó BIS #OWN!FLAG,(R3)+ ;MAKE DESCR. CONTROLLER OWNED AND REQUEST$Ô ;INTERRUPT ON RING TRANSITIONS7Õ SOB R4,5$ ;LOOP AND SET UP ALL RSP RING DESCRIPTORS2%Ö MOV (SP),R2 ;R2 POINTS TO THE QSTE7× MOVB Q.CMDN(R2),R4 ;R4=NUMBER OF COMMAND DESCRIPTORSDØ MOV Q.CPAT(R2),R2 ;R2 POINTS TO THE TABLE OF CMD PACKET ADDRESSES-Ù ;R3 POINTS TO FIRST COMMAND DESCR SINCE #Ú ;CMD DESCR. FOLLOW RSP DESCR.S1Û10$: MOV (R2)+,R0 ;R0=VA OF CMD PACKET (TEXT+0)S,Ü MOV #CPLEN,MSGLNG(R0) ;SET MESSAGE LENGTH(Ý CLR CREDIT(R0) ;CLEAR CREDIT AND VCID1Þ CALL VACPA ;CONVERT VIRTUAL ADDR. TO PHYSICALAß ;R0=LOW BITSà ;R1=HIGH BITSA7á MOV R0,(R3)+ ;FILL IN DESCR. WITH PHYSICAL PKT ADDR.H(â MOV R1,(R3)+ ;CMD PKTS ARE HOST OWNED8ã SOB R4,10$ ;LOOP AND SET UP ALL CMD RING DESCRIPTORSä#å POP ;RESTORE R2,R3,R4 æ RETURN ;RETURNOç .PAGECç .SBTTL STOMP - BRING A CONTROLLER TO THE OFFLINE STATE ;JJM304Ré;+ ;**-1E#ê; **-STOMP-CLOBBER THE CONTROLLER ë;GNì; CALLED TO ENSURE THAT THE CONTROLLER IS IN AN OFFLINE STATE WHEN THE CLASS2í; DRIVER DETERMINES THAT A RESYNCH IS NECESSARY.î;H ï; INPUTS:Vð;Rñ; R2 QST ADDRESSò; R4 SCB ADDRESSó; ô; OUTPUTS:õ;Dö; R2,R4 PRESERVED÷; R0 DESTROYEDø;-ùSTOMP: ú MOV S.CSR(R4),R0 ;GET THE CSRú ASSUME IP,0 ;JJM306-ú CLR (R0) ;STOMP THE CONTROLLER ;JJM306 Eü MOV #Q1.OFF,Q.STAT(R2) ;SET THE CONTROLLER STATE TO OFFLINE ;**-1- ý RETURNSþ .PAGECþ .SBTTL VACPA - VIRTUAL TO PHYSICAL ADDRESS CONVERSION ;JJM304 ;+ ;**-1H;; **-VACPA-VIRTUAL ADDRESS TO PHYSICAL ADDRESS CONVERSIONR;D; CALLED TO CONVERT A VIRTUAL PACKET ADDRESS TO A PHYSICAL ADDRESS;; (OR UMR ADDRESS FOR AN EXTENDED MEMORY UNIBUS MACHINE).?; BECAUSE ALL PACKETS AND RINGS ARE IN A SHARED COMMON MAPPED 9; THROUGH APR 6 THE VIRTUAL ADDRESS MAY BE COMPUTED AS: ;M>; (PHYSICAL ADDRESS)=(VIRTUAL ADDRESS)+(RELOCATION CONSTAN00^rnn]n´cÚµcÛ¶c�·c›’T) ;G ; SEE ROUTINE VACSET FOR A DESCRIPTION OF HOW THE RELOCATION CONSTANTS ; IS COMPUTED. ; ; INPUTS:;*; R0=VIRTUAL ADDRESS*; UQRELC=LOW BITS OF RELOCATION CONSTANT-; UQRELC+2=HIGH BITS OF RELOCATION CONSTANTH;L ; OUTPUTS:;M#; R0=LOW BITS OF PHYSICAL ADDRESSU$; R1=HIGH BITS OF PHYSICAL ADDRESS;I;- VACPA::O  CLR R1 1 ADD UQRELC,R0 ;R0=LOW BITS OF PHYSICAL ADDRESSU  ADC R14 ADD UQRELC+2,R1 ;R1=HIGH BITS OF PHYSICAL ADDRESS  RETURN)  .PAGE0! .SBTTL VACSET - CALCULATE RELOCATION CONSTANT";+#; **-VACSET -$;CA%; THIS ROUTINE WILL CALCULATE THE RELOCATION CONSTANT NEEDED TOE<&; PERFORM VIRTUAL ADDRESS TO PHYSICAL ADDRESS CONVERSIONS.'; PA=VA+UQRELC>(; IF A UMR IS NEEDED TO MAP UQCOM THIS ROUTINE WILL ALLOCATE); AND MAP IT.I*; +; INPUTS:E,; -; R2=QST .; R3=CST /; R4=SCB0; R0,R1 DESTROYED0 1; KISAR6 2; $FMASK 3; $HFMSK4; 5; OUTPUTS:6;17; R2,R3,R4,R5 PRESERVEDA"8; UQRELC AND UQRELC+2 ARE SET UP'9; UQRELC HAS THE TWO HIGH BITS SET UPT':; UQRELC+2 HAS THE 16 LOW BITS SET UPR ;; UMRS ARE MAPPED IF NECESSARY<;- =VACSET::4= MOV @KISR6,R1 ;GET START OF PORT COMMON ;JJM325? CLR R0 ;ZERO R0 ;**-1+@ ASHC #6.,R0 ;CALCULATE PHYSICAL ADDRESSI1F MOV S.KRB(R4),R2 ;GET THE KRB ADDRESS ;**-5S4G BIT #KS.EXT,K.STS(R2) ;EXTENDED MEMORY SUPPORTED?*O BNE 50$ ;YES, DON'T GET UMR'S ;**-79P CLC ;CARRY CLEAR TELLS PORUMR IT'S ONLINE TRANSITION@Q CALL PORUMR ;GO ALLOCATE AND MAP A UMR (GET WAIT BLOCKS TOO).Q BCS 60$ ;BAD, NO SPACE ALLOCATED ;PKW106S50$: ;**-1E$T MOV S.QST(R4),R2 ;RESTORE THE QST T ASSUME Q.CST,0 ;JJM306+U MOV (R2),R3 ;/*Q.CST*/ ;RESTORE THE CST>Y SUB #140000,R1 ;SUBTRACT PORT COMMON VIRTUAL ADDRESS ;**-3Z ;MAPPED THRU APR6 "[ SBC R0 ;SUBTRACT CARRY FROM R0\ MOV R1,UQRELC ;LO ADDRESS] MOV R0,UQRELC+2 ;HI!] CLC ;GOOD RETURN ;PKW106L]60$: RETURN ;PKW106A_ .PAGE ;**-1C_ .SBTTL WSW - WAIT/RESPOND TO A SYNCHRONIZATION STEP ;JJM304 a;+ ;**-1;Qb; **-WSW-WAIT FOR AND RESPOND TO A STEP IN THE HARDWARE SYNCHRONIZATION PROCESSSc; Nd; WAIT UP TO 100 MICRO-SECONDS FOR A STEP VALUE, READ AND SAVE SA, WRITE SA.e;C f; INPUTS: g;Ah; R2=QST ADDRESSi; R4=SCB ADDRESSj; S.CSR=CSR ADDRESST$j; VARIOUS QST FIELDS ;JJM304r; ;**-7 s; OUTPUTS:t; u; C=1 IF AN ERROR IS DETECTED:v; R0,R1 DESTROYED0w;x; C=0 ON SUCCESSy; R0,R1 DESTROYEDW<{; Q.STEP=NEXT STEP BIT PATTERN EXPECTED IN THE SA ;**-1={; Q.INDX=Q.INDX+2 (INDEXES NEXT ENTRY IN Q.WRIT) ;JJM308W}; ;**-1~;-€WSW:: ;**-1)� MOV S.CSR(R4),R1 ;R1 POINTS TO THE CSRN‚ CLR R0 ;R0=LOOP CONTROL!ƒ5$: TST SA(R1) ;ERROR OCCURED?S0„ BMI 15$ ;IF MI, YES, GO SET CARRY AND RETURN'… BIT Q.STEP(R2),SA(R1) ;STEP BIT SET? † BNE 10$ ;IF NE, YES, SUCCESS5‡ SOB R0,5$ ;WAIT UP TO 100 MICRO-SEC. FOR STEP BIT/ˆ BR 15$ ;TIME IS UP, GO SET CARRY AND RETURN ‰;P4Š; A STEP HAS COMPLETED AND THE NEXT STEP HAS BEGUN‹;N;‹10$: MOV Q.INDX(R2),R0 ;INDEX INTO Q.WRIT TABLE ;JJM308 '� ADD R2,R0 ;R0=QST + INDEX ;**-11C� MOV SA(R1),Q.TEMP(R2);READ/SAVE SA REGISTER TEMPORARILY ;JJM308T>� MOV Q.WRIT(R0),SA(R1) ;WRITE TO SA FROM Q.WRIT TABLE ;**-1$� ASL Q.STEP(R2) ;UPDATE Q.STEP AND‘ ADD #2,Q.INDX(R2) ;Q.INDX’ CLC ;INDICATE SUCCESS“ BR 20$ ;GO TO RETURN%”15$: SEC ;INDICATE ERROR DETECTED•20$: RETURN ;RETURNSA®CODLEN = <.-CODBEG>/2 ;LENGTH OF CODE SECTION IN WORDS ;**-24T ¯ LOGRTNN°± .END: MOV Q.INDX(R2),R0 ;INDEX INTO Q.WRIT TABLE ;JJM308 '� ADD R2,R0 ;R0=QST + INDEX ;**-11C� MOV SA(R1),Q.TEMP(R2);READ/SAVE SA REGISTER TEMPORARILY ;JJM308T>� MOV Q.WRIT(R0),SA(R1) ;WRITE TO SA FROM Q.WRIT TABLE ;**-1$� ASL Q.STEP(R2) ;UPDATE Q.STEP AND‘ ADD #2,Q.INDX(R2) ;Q.INDX’ CLC ;INDICATE SUCCESS“ BR 20$ ;GO TO RETURN%”15$: SEC ;INDICATE ERROR DETECTED•20$: RETURN 00_znümßmæàmçámýfáþfDATA" .TITLE DCWOP - Write operations .IF DF D$$CHE .IDENT /01.07/;S>; Copyright (c) 1985, 1986 by Digital Equipment Corporation.; All rights reserved.; ; Original author: ; John Gemignani- ; Modified for RSX-11M-Plus Version 4.0 by:: ;# ; D. P. Rabahy 08-NOV-85 01.043 ; DPR030 Flush partial blocks to support RTEM-114 ; SPR #177XR ; " ; E. Postpischil 20-Jun-86 01.05* ; EDP033 Add support for large extents. ;? ; D. P. Rabahy 17-Oct-86 01.06@ ; DPR038 Save/restore R5 around $DRQRQ, response to SPR #228P ;N" ; J. R. Kauffman 29-May-87 01.07. ; JRK336 Force cache flush if going NODEFER ; ;sL; This module contains the code to process cache write operations. An I/O); proceeds through the following steps:P;a; 1) Phase-ID; A) The cache partition is searched for all overlapping extents.@; B) These involved extents are "locked down" (i.e. E.PCNT is= ; incremented) so that they will not be deleted until the6!; operation is completed.rA"; C) The I/O packet is duplicated with one being queued to the-(#; driver and the other to the cache.C$; D) If either primary pool and cache private secondary pool aree;%; lacking then all involved extents are deleted and thef&; I/O queued to the driver.aE'; 2) Depending on a number of factors either phase-II or driver I/Ot(; completion will run next.); 2.1) Phase-II"B*; A) DCRUN dequeues the cache packet passing it to this module.D+; B) If an error is already indicated for the driver I/O then the,; cache update is skipped.6-; C) The cache partition is updated from user task..; 2.2) Driver I/O completion)/; A) Output debugging info to console.a0; 3) Finish I/Ol>1; A) If an error is indicated then all involved extents are2; deleted.(3; B) The extra packet is deallocated.14; C) $IOFIN is called using the driver packet.5;-5 .MCALL F11DF$ ;JRK330s5 ;JRK330s35 F11DF$ ; Define window block offsets ;JRK330y5 ;JRK330i5 ;JRK330 6 .PSECT DC$WOP, RO, I.7 8 .SBTTL WRITE PHASE-Is$9 .SBTTL + $DCW1 - Write operations:;/ ;; Passed:<; UCBX mappedb=;g>; R1 -> I/O packet7>; I.EFN := Indicates if I/O is virtual ;DPR030l2>; I.TCB -> TCB of requesting task ;DPR030;>; T.ST3 := T3.ACP indicates I/O is from an ACP ;DPR030t4>; I.PRM+P2 := Size of request in bytes ;DPR030 ?; R5 -> UCB @;K A; Returned: 4B;;; N/A - Control passed to either DCRUN or $DRQRQC;K D; Action: ;E; If a search of the cache results in failure to identify 6F; the first matching extent, then the request can goG; directly to the driver.H;DI; Otherwise all extents involved will be acted upon no matter what;J; behaviour attributes have been selected for the device.K; IL; If exactly one extent maps the request then it will be "locked down",zFM; the driver invoked and phase-II requested. Otherwise all involved3N; extents will be deleted and the driver invoked.O;P; Possible enhancements:EQ; Serialize asynchronous I/O by checking if the extent is currentlyeJR; being loaded (i.e. ES.RIP set in E.STAT) and attaching it to cause the7S; write request to stall pending the load completion.hT;9U; It may be possible to improve performance by handling2V; the case where multiple extents map a request.W;wDX; Eventually a write-deferred ability for temporary files could beY; considered.nZ;dD[; Allocate duplicate I/O packet from cache private secondary pool.\;e ]; Notes:;^; I/O operations which specify the bypass bits must still 9_; update the cache, for the benefit of other non-bypassd=`; readers. Keep in mind that IQ.UMD (user-mode diagnostic)t=a; requests use parameter 6 to specify the diagnostic buffere;b; address. Therefore, the cache can only use parameter 3ac; if it really has to.d;l e$DCW1::df;eNg; Determine the operation and initialize the statistics context accordingly.h;e,i00_‚nn]n´cÚµcÛ¶c�·c›’ TSTB I.EFN(R1) ; Is this really virtual?j BMI 20$ ; If MI, yes k/l MOV I.TCB(R1), R2 ; Get the requestor's TCBm; BNE 5$ ; If NE, got itn; BPT ; Sanity checkdo;5$:(p BIT #T3.ACP, T.ST3(R2) ; From an ACP?q BEQ 10$ ; If EQ, nor=s MOV #APR6.BASE+S.DIR, -(SP) ; Count as directory operation t BR COMMONu?v10$: MOV #APR6.BASE+S.LOG, -(SP) ; Count as logical operationD w BR COMMONx20$:;y MOV #APR6.BASE+S.DAT, -(SP) ; Count as virtual operationo z; BR COMMON {COMMON:F{ MESAG$ WMSG,5 ;DPR0302} USTAT$ S.WTOT ; Increment write total ;**-1~;eP; The return address is now adjusted so as to prevent an in-line "return" fromM€; continuing to the driver. See the routine $DRQRQ in the executive module�; [11,10]DRSUB..‚;-<ƒ MOV #$QOPDN, 2(SP) ; Don't forget about context on stack„2… CALL SEARCH ; Locate first overlapping extent† BCC 10$ ; If CC, found one#‡‡ MESAG$ MMSG,6 ;JRK330t‰; ;**-1HŠ; Could cache it with a little work if desirable, but for now just ...‹;I5Œ TST (SP)+ ; Remove statistics context from stackeŒ ;JRK336 Œ .IF DF CHESAN ;JRK336 Œ ;JRK336tŒ CALL .CKUCB ;JRK336$Œ ;JRK336eŒ .ENDC ;CHESAN ;JRK336-Œ ;JRK336P5� CALLR $DRQRQ ; Give the I/O packet to the driverEŽŽ10$: ;JRK330pŽ .IFDF CHEDFR ;JRK330Ž ;JRK330M@Ž CALL MAPUCB ; See if the cache is being deactivated ;JRK330.Ž BITB #X2.DEA,APR6.BASE+X.CST2; ;JRK330.Ž BEQ 12$ ; If EQ, no, continue on ;JRK330Ž ;JRK330e<Ž MESAG$ DEAMSG,37. ; Indicate deactivation error ;JRK330:Ž JMP CLRUP ; Force I/O to come back when clear ;JRK330Ž ;JRK330;<Ž12$: CALL MAPPAR ; Map the cache partition back ;JRK330Ž ;JRK330eŽ .ENDC ;CHEDFR ;JRK330 Ž ;JRK330FJŽ MESAG$ HMSG,7,,<,> ;JRK330�; ;**-1 ‘; Context:’; Cache partition mapped“;2"”; R0 -> First overlapping extentE•; R2 := Least Significant Part (LSP) of the highest requested block %–; R3 := Most Significant Part (MSP)%—; R4 := Length of request in blocks ˜;cB˜ BIT #777, I.PRM+P2(R1) ; Is a partial block indicated? ;DPR030#˜ BEQ 15$ ; If EQ, no ;DPR030 ˜ ;JRK330C9˜ TST (SP)+ ; Remove excess context from stack ;JRK330M7˜ CALL DELETE ; Delete all involved extents ;JRK330R˜ ;JRK330*˜ .IFDF CHEDFR ;JRK330˜ ;JRK330:˜ BCS BACKUP ; If CS, at least one CED deferred ;JRK330˜ ;JRK330i˜ .ENDC ;CHEDFR ;JRK330 ˜ ;JRK330 =˜ CALLR $DRQRQ ; Give the I/O packet to the driver ;JRK3307˜ ;JRK330a�15$: ;**-4dž;P Ÿ; Notes:7 ; Don't forget that the extent high LBN is stored +1.T¡;P?¢ CMPB R3, E.LBNH+2(R0) ; Might this extent fully map request? £ BLO 20$ ; If LO, yesn¤ BHI REJECT ; If HI, noK/¥ CMP R2, E.LBNH(R0) ; Double word comparison ¦ BHIS REJECT ; If HIS, noC§20$:=¨ CMPB I.PRM+P4(R1), E.LBNL-1(R0) ; Does this truely map it?H© BHI 30$ ; If HI, yesª BLO REJECT ; If LO, no8« CMP I.PRM+P5(R1), E.LBNL(R0) ; Double word comparison¬ BLO REJECT ; If LO, no­30$:­ .IFDF CHEDFR ;JRK330­ ;JRK330gE­ BITB #ES.WIP,E.STAT(R0) ; Is this extent being written out ;JRK330t5­ BNE CLRUP ; If NE, yes, back up user PC ;JRK330I­ ;JRK330K­ .ENDC ;CHEDFR ;JRK330 ­ ;JRK330B4® MOV R0, R4 ; Put CED address in a save register0¯ CALL CHEDUP ; Create a duplicate I/O packet'° BCS POOL2 ; If CS, not enough pool;±;O ²; Context:³; R0 -> Duplicated I/O packetw´;o,µ; Prepare I/O packet for queueing to cache¶;.E· MOV #CD.WIP, I.PRM+P3(R0) ; Initialize attachment count and statusT¸;;=¹; Serialize I/O to protect against asynchronous cache loads º;e;»; BITB #ES.RIP, E.STAT(R4) ; Is this extent being loaded?;00_ŠnümßmæàmçámýfáþfDATA¼; BEQ 35$ ; If EQ, no ½; O¾; If an extent is being loaded then DCIOC will request phase-II. It would be ¿; a waste to request it now.À;B;Á; BICB #CS.REQ, APRD.BASE+H.CSTS ; Don't request phase-II Â; Ã; MOV R0, -(SP)eÄ; MOV R1, -(SP)r)Å; MOV R0, R1 ; Load ATTCED parametersÆ; MOV R4, R0:Ç; CALL ATTCED ; Attach to the extent - outstanding I/OÈ; MOV (SP)+, R1oÉ; MOV (SP)+, R0y(Ê; BCS POOL1 ; If CS, not enough pool Ë; BR 40$Ì;;Í;35$:e2Î INCB E.PCNT(R4) ; Otherwise just lock it down4Ï BISB #CS.REQ, APRD.BASE+H.CSTS ; Request phase-IIÐ;40$:aÑ;.OÒ; Save the address of the first CED so phase-II doesn't have to search again.+Ó;SÔ MOV R4, I.PRM+P6.1(R0)2Õ MOV R1, I.PRM+P6.2(R0) ; Point to driver packetÖ; K×; All adjustments to the driver I/O packet must be restore before calling Ø; $IOFIN.oÙ;n=Ú MOV R0, I.AADA(R1) ; Point driver packet to corresponding Û ; cache packetoCÜ MOV KINAR5, I.IOSB+2(R1) ; Load APR bias and address of internal @Ý MOV #IOC!1, I.IOSB+4(R1) ; I/O completion routine, note bit-0Þ4ß MOV R0, -(SP) ; Preserve address of cache packet=à MOV KISAR6, -(SP) ; Save mapping to cache region ;DPR026Mà; ;JRK330Wà; If this request is recognized as coming from a temporary file, the write to ;JRK330kWà; the disk is deferred and the cache packet is set up to indicate to phase II ;JRK330iKà; to ignore the setup from the supposedly completed disk I/O. ;JRK330(à; ;JRK330à .IFDF CHEDFR ;JRK330à ;JRK330 ?à TSTB I.EFN(R1) ; See if this is a virtual operation ;JRK330r3à BPL 45$ ; If PL, no, skip defer check ;JRK330aà ;JRK330e7à CALL MAPUCB ; Map the UCBX for the device ;JRK330 Kà BITB #XC.DFR,APR6.BASE+X.CSTS; Is deferred write support allowed ;JRK330 .à BEQ 45$ ; If EQ, no, skip checks ;JRK330à ;JRK330ICà BIT #WS.MDL,$DCSTS ; Is this request from a "temp" file ;JRK330k0à BEQ 45$ ; If EQ, no, write to disk ;JRK330à ;JRK3300Gà MOV #APR6.BASE,-(SP) ; Get base context for statistics block ;JRK330r5à USTAT$ S.WDFR ; Update statistics block ;JRK330e7à TST (SP)+ ; Release excess statistics info ;JRK330pà ;JRK330iLà MESAG$ IODFR,38.,,<,> ;JRK330à ;JRK3304Ià BIC #CD.WIP,I.PRM+P3(R0) ; Force DONE to not wait for disk I/O ;JRK330LIà BIS #CD.DFR,I.PRM+P3(R0) ; Indicate to Phase II to ignore disk ;JRK330Qà ;JRK330;8à MOV (SP),KISAR6 ; Remap the Cache partition ;JRK330Cà BISB #ES.WDF,E.STAT(R4) ; Indicate this CED now deferred ;JRK330dà ;JRK330 à .IF DF CHESAN ;JRK330eà ;JRK330f=à CALL .CRSAN ; Create a sanity block if necessary ;JRK330.à ;JRK3301à .ENDC ;CHESAN ;JRK330 à ;JRK336#*à BR 50$ ; Skip write to disk ;JRK336à45$: ;JRK336à .IF DF CHESAN ;JRK336aà ;JRK336oà CALL .CKIOP ;JRK336Jà ;JRK336Ià .ENDC ;CHESAN ;JRK336 à .ENDC ;CHEDFR ;JRK336Rà ;JRK336D@à MOV R5, -(SP) ; Save address of UCB, driver clobbers ;DPR038+à CALL $DRQRQ ; Issue disk I/O ;JRK330C*à MOV (SP)+, R5 ; Restore UCB ;DPR038à50$: ;JRK330K!à MOV (SP)+,KISAR6 ;JRK3303<ã MOV (SP)+, R1 ; Note restore to different register ;**-2ä(å USTAT$ S.WHIT ; Increment write hit5æ TST (SP)+ ; Remove statistics context from stackIç8è MOV #APRD.BASE+H.PKTQ, R0 ; Get cache packet listhead%é CALL $QINSP ; Insert by priorityJê CALLR DCRUNê; ;JRK330Vê; Backup the User PC to handle conditions where the I/O cannot be issued due ;JRK330Dê; to deferred extents being written to disk ahead of it ;JRK330ê; ;JRK330ê .IFDF CHEDFR ;JRK330êCLRUP: ;JRK330o5ê TST (SP)+ ; Pop extra context off stack ;JRK330;êBACKUP: ;JRK330:ê CALLR $BCKUP ; Back up the user PC and return ;JRK330ê 00_’nn]n´cÚµcÛ¶c�·c›’ ;JRK3300ê .ENDC ;CHEDFR ;JRK330Cë;Q-ì; Handle low pool and rejection conditions.í; î .ENABL LSB'îREJECT: MESAG$ RMSG,10. ;JRK330 :ð USTAT$ S.WLAP ; Increment partial overlap count ;**-1 ñ BR 20$nòó;POOL1: MESAG$ PMSG1Dô; MOV #APR6.BASE, (SP) ; Errors are not counted in context ;DPR0248õ; USTAT$ S.PSP ; Increment lacking private sec. poolö;f÷; MOV R3, -(SP) ; Save MSP (ø; MOV R0, R3 ; Load CHEDEP parameterù; CALL CHEDEPe ú; MOV (SP)+, R3 ; Restore MSPû;. ü; BR 10$ý&ýPOOL2: MESAG$ PMSG2,9. ;JRK330Aÿ MOV #APR6.BASE, (SP) ; Errors are not counted in context ;**-1R: USTAT$ S.POL ; Increment lacking primary pool ;DPR024)10$: MOV R4, R0 ; Restore CED address120$: ;JRK330.9 TST (SP)+ ; Remove excess context from stack ;JRK330 7 CALL DELETE ; Delete all involved extents ;JRK330f ;JRK330; .IFDF CHEDFR ;JRK330 ;JRK330: BCS BACKUP ; If CS, at least one CED deferred ;JRK330 ;JRK330: .ENDC ;CHEDFR ;JRK330 ;JRK330  .IF DF CHESAN ;JRK330x ;JRK330. CALL .CKUCB ;JRK330r ;JRK330 .ENDC ;CHESAN ;JRK330d ;JRK330 = CALLR $DRQRQ ; Give the I/O packet to the driver ;JRK330c ;JRK330E .DSABL LSB ;**-4  n1  .SBTTL + DELETE - Deletes all involved extents  ; ; Passed:  ; Cache partition mapped; (; R0 -> CED of first overlaping extent/; R2 := High LBN Least significant part (LSP)J.; R3 := High LBN Most significant part (MSP)#; R5 := UCB address ;JRK330;L ; Returned: ; All registers preserved:; CC - All extents were able to be eliminated ;JRK330E; CS - At least one of the extents could not be eliminated ;JRK330 ;KDELETE: ;JRK3302 CLR -(SP) ; Initialize status return ;JRK330310$: CALL FRECED ; Delete this extent ;JRK330a ;JRK330  .IFDF CHEDFR ;JRK330 ;JRK330a4 BCC 20$ ; IF CC, extent was eliminated ;JRK330 ;JRK330E BITB #ES.WDF,E.STAT(R0) ; See if failure due to deferrment ;JRK330i< BEQ 20$ ; If EQ, no, don't worry about this case;JRK3304 ROL (SP) ; Roll CS into (SP) for later ;JRK33020$: ;JRK330J .ENDC ;CHEDFR ;JRK330; ;JRK330 < MOV E.LNXT(R0), R0 ; Get the next extent by LBN ;JRK330+ BEQ 30$ ; If EQ, end of list ;JRK330K ;JRK330 H CMPB R3, E.LBNL-1(R0) ; Does this extent overlap the request? ;JRK330$ BHI 10$ ; If HI, yes ;JRK330# BLO 30$ ; If LO, no ;JRK330 8 CMP R2, E.LBNL(R0) ; Double word comparison ;JRK330& BHIS 10$ ; If HIS, yes ;JRK330 ;JRK330C530$: ROR (SP)+ ; Get stored carry status ;JRK330J RETURN ;JRK330J# ;$ .SBTTL WRITE PHASE-II.% .SBTTL + $DCWII - Phase-II Write Processing&;R '; Passed:3(; Cache partition mapped);3*; R1 -> Cache packet(+; I.PRM+P1 := Source buffer address,; I.PRM+P2 := Byte count0:-; I.PRM+P3 -> Internal cache status and pending count=.; I.PRM+P5 := Requested LBN least significant part (LSP)o//; I.PRM+P6.1 -> CED of first extent involved0 0; I.PRM+P6.2 -> Driver packet 1; R5 -> UCBs2; 3; Returned:J%4;;; N/A - control is passed to DONE;5;. 6; Action:HC7; If a driver error is indicated then call DONE to finish the I/Os)8; otherwise update the cache partition. 9; :; Future enhancement:P;; Handle multiple extents<;I =$DCWII::!= MESAG$ W2MSG,11. ;JRK330t? ;**-1a9@ BIT #CD.ERR, I.PRM+P3(R1) ; Is driver error indicated?gA BEQ 5$ ; If EQ, no A MESAG$ EMSG,13. ;JRK330C BR 10$ ;**-1D5$:DE; 'F; Prepare input parameters to $BLXIO:dG; R0 := Byte count (I.PRM+P2) H; R1 := Source APR5 bias"I; R2 := Source APR5 displacementJ; R3 := Destination APR6 biass0K; R4 := Destination APR6 displacement (140000)L00_šnümßmæàmçámýfáþfDATA; -M MOV R1, -(SP) ; Save cache packet addresstNO MOV I.PRM+P2(R1), R0GP7Q CALL ADJBUF ; Converts to doubleword if device NPRR;R MOV I.PRM+P1.2(R1), R2 ; Load R1 later to avoid conflictfS SUB #20000, R2 T@U MOV I.PRM+P6.1(R1), R4 ; Get address of first extent involvedV;nNW; The destination APR bias is the extent bias offset by the number of blocks<X; between the requested LBN and the low LBN of the extent.Y; 2Z MOV I.PRM+P5(R1), R3 ; Get LSP of requested LBN7[ SUB E.LBNL(R4), R3 ; Safe to assume carry availabler+\ ASH #3, R3 ; Convert to 32-word blocksL] ADD E.PHYA(R4), R3o^_ MOV I.PRM+P1.1(R1), R1M`a MOV #APR6.BASE, R4d/a CALL EBLXIO ; Transfer the data. ;edp033a ;edp033(8p MOV (SP)+, R1 ; Restore cache packet address ;**-14q10$:@r MOV I.PRM+P6.1(R1), R0 ; Get address of first involved extent%s DECB E.PCNT(R0) ; "Unlock" extent t#u MOV R1, R3 ; Parameter to DONEM v CALL DONE w RETURNrx ty .SBTTL WRITE I/O COMPLETION1z .SBTTL + IOC - Internal I/O completion routine {;r |; Passed:b}; R3 -> Driver packet,#~; I.UCB -> UCB ;DPR026"; I.PRM+P3, P4 := Driver status €; I.AADA -> Cache packet�; ‚; Returned:e%ƒ;;; N/A - control is passed to DONEh„;k …; Action:*8†; Output console messages for debugging purposes only.‡;i‡IOC: ;JRK330.‰ ;**-1".Š TSTB I.PRM+P3(R3) ; Is an error indicated?‹ BPL 10$ ; If PL, noŒ Œ MESAG$ EMSG,13. ;JRK330Ž10$: ;**-1n5� MOV I.UCB(R3), R5 ; Get the UCB address ;DPR026 4� MOV I.AADA(R3), R3 ; Get address of cache packet� ;JRK330P8� MESAG$ IMSG,12.,,<> ;JRK330� ;JRK330; ‘ CALL DONE ’ RETURN “ N)” .SBTTL + DONE - Common completion codem•;e –; Passed:n—; R3 -> Cache packet˜; I.PRM+P2 := Byte count (™; I.PRM+P3 := Internal cache status<š; I.PRM+P4 := Requested LBN most significant part (MSP)=›; I.PRM+P5 := Requested LBN least significant part (LSP) /œ; I.PRM+P6.1 -> CED of first involved extentD �; I.PRM+P6.2 -> Driver packet.ž; I.PRM+P3, P4 := Driver completion status Ÿ; R5 -> UCB. ;R ¡; Return:38¢;;; N/A - If both are done control is passed to $IOFIN-£;;; otherwise completed fork level routinee¤; ¥; Action: F¦; If both the driver and the cache are completed then deallocate the6§; cache packet from primary pool and finish the I/O.¨;iC©; If an error is indicated then all involved extents are deleted.aª;r«; Future enhancement: ¬; Handle multiple extentsn­;>®DONE: BIT #CD.WIP, I.PRM+P3(R3) ; Are both updates complete?¯ BNE 10$ ; If NE, no°8± MOV I.PRM+P6.2(R3), R4 ; Get address of driver packet²² .IFDF CHEDFR ;JRK330² ;JRK330e?² BIT #CD.DFR,I.PRM+P3(R3) ; Is this a deferred write ;JRK330c"² BEQ 3$ ; If EQ, no ;JRK330²; ;JRK330U²; This is a deferred write which has just completed. Since no disk I/O has ;JRK330dU²; occurred, no status has been returned and must be faked back to the user. ;JRK330²; ;JRK330E² MOV #IS.SUC&377,R0 ; Fake success status back to user I/O ;JRK330D² MOV I.PRM+P2(R3),R1 ; Put in number of transferred bytes ;JRK330.² BR 7$ ; Skip disk I/O processing ;JRK330²3$: ;JRK330² .ENDC ;CHEDFR ;JRK330 ² ;JRK330 4³ TSTB I.PRM+P3(R4) ; Is a driver error indicated?´ BPL 5$ ; If PL, nohµ;j(¶; Prepare input parameters for DELETE:·; Map cache partitiona¸;a&¹; R0 -> CED of first extent involved3º; R2 := Highest LBN, least significant part (LSP)S3»; R3 := " " , most " " (MSP)J¼;½ CALL MAPPAR¾@¿ MOV I.PRM+P6.1(R3), R0 ; Get address of first involved extentÀ;iÁ; Calculate highest LBNÂ; 7à MOV R3, R1 ; Put cache packet address in save reg. Ä6Å MOV I.PRM+P2(R3), R2 ; Get the request size (bytes)Æ ADD #777, R2 ; Round up,.Ç ASH #-9., R2 ; Convert to numb00_¢n`¥nn´cÚµcÛ¶c�·c›’er of blocks È DEC R2aÉ9Ê ADD I.PRM+P5(R3), R2 ; Calculate highest LBN requestedd3Ë MOVB I.PRM+P4(R3), R3 ; Get MSP of requested LBNS Ì ADC R3 ; Carry if necessaryÍÎ CALL DELETE.Ï MOV R1, R3 ; Restore cache packet addressÐ5$: 6Ñ MOV I.PRM+P3(R4), R0 ; Get driver completion statusÒ MOV I.PRM+P4(R4), R1MÓ;,Ô; Restore driver packetdÕ;iÕ7$: ;JRK330!Ö MOV I.IOSB+2(R3), I.IOSB+2(R4) !× MOV I.IOSB+4(R3), I.IOSB+4(R4)uØÙ MOV I.AADA(R3), I.AADA(R4)tÚ6Û CALL CHEDEP ; Deallocate packet from primary poolÜ1Ý MOV R4, R3 ; Use driver packet to finish I/O)Þ CALL $IOFIN ß RETURN à10$:7á BIC #CD.WIP, I.PRM+P3(R3) ; Indicate one is completeVâ ã RETURNtä a!å .IFDF CHEDBG ; Debugging aidI,æ .SBTTL *** DEBUG *** Module contains data!çWMSG: .ASCIZ <15><12>"WRITE - "èMMSG: .ASCIZ "MISS"déHMSG: .ASCIZ "HIT"@êPMSG1: .ASCIZ " - REJECTED: NOT ENOUGH PRIVATE SECONDARY POOL"6ëPMSG2: .ASCIZ " - REJECTED: NOT ENOUGH PRIMARY POOL"7ìRMSG: .ASCIZ " - REJECTED: OVERLAPS MULTIPLE EXTENTS"JìDEAMSG: .ASCIZ <15><12>" - Rejected: cache being deactivated" ;JRK330QìIODFR: .ASCIZ <15><12>" - I/O disk operation deferred; cache updated" ;JRK330Rí*îW2MSG: .ASCIZ <15><12>"PHASE II - WRITE"ï$ðIMSG: .ASCIZ <15><12>"WRITE - IOC"ñòEMSG: .ASCIZ " - ERROR" ó .EVENô .ENDC ; .IFDF CHEDBGGõö .ENDC ; .IFDF D$$CHEI÷ .ENDECTED: NOT ENOUGH PRIVATE SECONDARY POOL"6ëPMSG2: .ASCIZ " - REJECTED: NOT ENOUGH PRIMARY POOL"! .TITLE DCROP - Read operationsI .IF DF D$$CHE .IDENT /01.12/K;D>; Copyright (c) 1986, 1987 by DIGITAL EQUIPMENT CORPORATION.; All rights reserved.;V; Original author: ; John Gemignani ;S& ; Modified for RSX-11M-Plus V2.1 by: ;  ; D. P. Rabahy ;O ; Modified by:& ; Modified for RSX-11M-PLUS V4.0 by: ;V! ; D. P. Rabahy 08-NOV-85 01.07.) ; DPR032 Save/restore R5 around $DRQRQ ;S$ ; Eric Postpischil 20-Jun-86 01.08* ; EDP033 Add support for large extents. ; ; J. Kauffman 26-Aug-86 01.098 ; JRK330 Add support for multi-block extent transfers ;I! ; D. P. Rabahy 17-Oct-86 01.10 @ ; DPR038 Save/restore R5 around $DRQRQ, response to SPR #228P ;$ ; Eric Postpischil 12-Jan-87 01.11, ; EDP047 Set up R5 before calling $DRQRQ. ; ; J. Kauffman 29-May-87 01.12. ; JRK336 Force cache flush if going NODEFER ;R!;aO"; This module contains the code which preforms cache read operations. An I/OP)#; proceeds through the following steps:$;KD%; 1) Phase I - if the cache partition can fulfill the request then+&; proceed to step 1.1 otherwise step 1.28!'; 1.1) Reserve involved extentsR&(; A) Increment the pending count(s)$); B) Attach to those being loaded<*; B.1) If NONE are being loaded call DCRUN which invokes+; phase II (i.e. step 3)<,; B.2) Otherwise IOC (i.e. step 2) will call DCRUN after-; the driver completes K.; 1.2) If a cache load is NOT appropriate, pass the request to the driveroD/; A) If it IS, allocate the necessary data structures (i.e. cache60; extent, duplicate I/O packet and attachment), if71; lacking any pool resource pass the request to ther 2; driverD3; B) Prepare the driver packet (everything must be ready for IOC,+4; it may run before phase I completes!)&5; C) Pass the request to the driver 6; D) Prepare the cache packet7; E) Queue it to the cachei8; 2) Driver I/O completionB9; A) If a driver error is indicated then mark all cache packets:; pending with CD.ERRn7;; B) Call DCRUN to request the cache (i.e. phase II)c<; 3) Phase IId*=; A) If a driver error is NOT indicated,>; A.1) Then transfer the data via $BLXIO4?; A.2) Otherwise delete all the extents involved8@; B) Passing the driver completion status call $IOFINA;-B .PSECT DC$ROP, RO, I C rD .SBTTL READ PHASE I#E .SBTTL + $DCR1 - Read operationsh!F .SBTTL + $DCOV1 - Load overlayiG; H; Passed:iI; UCBX mapped in APR6e=J; 00`ªnümßmæàmçámýfáþfDATA X.CSTS := Unit's cache status (i.e. selected operations)aK;R9L; $CXDBL := Zero indicates context switching is enabledM;AN; R1 -> I/O packet7O; I.EFN := Sign bit indicates virtual operationX&P; I.TCB -> TCB of issuing task/Q; T.ST3 := T3.ACP indicates task is an ACPl+R; I.PRM+P4, P5 := Requested starting LBNR S; R5 -> UCBrT;. U; Returned:EV; R0 := contents losteW;eGX;;; Otherwise N/A - control is passed to either DCRUN, LOAD or $DRQRQXY;e Z; Action:K[; Determine if the cache partition can fulfill the request. If so, queueLJ\; the packet to the cache and call phase II otherwise proceed with LOAD.]; ^; Future enhancements:F_; Handle the case where multiple extents contain the requested data.`;SEa; Overlay I/O can be detected by function code. The code IO.LDO ors:b; IO.LOV (Load I or D-space overlay) is passed in I.FCN.c;tCd; Handle the case where an extent partially overlaps the request.Ce;LHf; There are a number of strategies for handling partial overlaps. The,g; following one comes from John Gemignani.h;kJi; If one extent does not fully map the request, then three possibilitiesIj; must be considered. The extent overlaps the user's request in one ofrk; three ways:?l; 1) The extent fulfills the high end of the user's request.O5m; Therefore, if possible, load the low end of thesn; user's request. Ao; 2) The extent fulfills the middle of the user's request, and7p; two I/O operations would be necessary to load thet6q; cache. In this situation, the request should be7r; rejected, since this operation is self defeating.r>s; 3) The extent fulfills the low end of the user's request.=t; Therefore, if possible, load the high end of the user'su; request.v;l w; Notes:Dx; ACP requests which are issued in order to handle the file systemJy; (F11) are issued with context switching enabled (i.e. $CXDBL is zero).Hz; Requests on behalf of a task for disk extent crossings (i.e. mappingH{; failures) are issued with context switching disabled (i.e. $CXDBL is|; non-zero).}; ;~QUICK: RETURN ; See exec routine $DRQRQ in module DRSUBl €$DCR1::f�;uO‚; Determine the operation, check if caching allowed and initialize statisticsƒ; context accordingly.„;,… TSTB I.EFN(R1) ; Is this a virtual read?† BMI 20$ ; If MI, yes ‡/ˆ MOV I.TCB(R1), R0 ; Get the requestor's TCB ‰ BNE 5$ ; If NE, got itsŠ BPT ; Sanity check‹5$:e(Œ BIT #T3.ACP, T.ST3(R0) ; From an ACP?� BEQ 10$ ; If EQ, noŽ;nQ�; The following code determines if context switching is disabled since I/O fromiK�; the F11 ACP when it is is I/O issued on behalf of a user task due to an,+‘; extent crossing (i.e. mapping failure).i’;.“ TSTB $CXDBL ; Context switching disabled?/” BNE 20$ ; If NE, yes, treat as virtual I/O •<– BITB #XC.DIR, APR6.BASE+X.CSTS ; Cache ACP/RLB this unit?— BEQ QUICK ; If EQ, no>˜ MOV #APR6.BASE+S.DIR, -(SP) ; Otherwise init stats context ™ BR COMMONš?›10$: BITB #XC.LOG, APR6.BASE+X.CSTS ; Cache IO.RLB this unit?eœ BEQ QUICK ; If EQ, noe>� MOV #APR6.BASE+S.LOG, -(SP) ; Otherwise init stats context ž BR COMMONŸŸ20$: ;JRK336nŸ .IFDF CHEDFR ;JRK336Ÿ ;JRK336CHŸ BITB #X2.DEA,APR6.BASE+X.CST2 ; Are defers in process of flush;JRK3361Ÿ BNE 30$ ; If NE, yes, must continue ;JRK336CŸ ;JRK336BŸ .ENDC ;CHEDFR ;JRK336#Ÿ ;JRK336)BŸ BITB #XC.DAT,APR6.BASE+X.CSTS ; Cache IO.RVB this unit? ;JRK336#¡ BEQ QUICK ; If EQ, no ;**-1t¡30$: ;JRK336 >¢ MOV #APR6.BASE+S.DAT, -(SP) ; Otherwise init stats context £ BR COMMON ¤$DCOV1::?¥ BITB #XC.OVR, APR6.BASE+X.CSTS ; Cache IO.LOV/LDO this unit?¦ BEQ QUICK ; If EQ, no >§ MOV #APR6.BASE+S.OVR, -(SP) ; Otherwise init stats context ¨; BR COMMON ©COMMON:s © MESAG$ RMSG,14. ;JRK3301« USTAT$ S.RTOT ; Increment read total ;**-1 ¬:­ MOV #$QOPDN, 2(SP) ; Chang00`²n¥nn´cÚµcÛ¶c�·c›’e return address, see $DRQRQ®4¯ CALL SEARCH ; Find the first overlapping extent(¯ BCC 5$ ; If CC, found one ;JRK3308¯ JMP LOAD ; CS, None found - attempt to load ;JRK330¯5$: ;JRK330±; ;**-1 ²; Context:"³; Cache partition mapped in APR6´; )µ; R0 -> CED of first overlapping extent)<¶; R2 := Highest LBN requested Least significant part (LSP)<·; R3 := " " " Most " " (MSP)"¸; R4 := Number of LBNs requested¹;N2º; Check if overlapping extent fully maps request»; ¼; Note:F:½; Don't forget that the extent highest LBN is stored +1.¾; @¾ CALL $TSEND ; See if possible request is all in CED ;JRK3303¾ BCS OVRLAP ; If CS, it is overlapping ;JRK330t¾ ;JRK330t?Å CMPB I.PRM+P4(R1), E.LBNL-1(R0) ; Does it completely? ;**-6nÆ BHI 30$ ; If HI, yesÇ BLO OVRLAP ; If LO, no8È CMP I.PRM+P5(R1), E.LBNL(R0) ; Double word comparisonÉ BLO OVRLAP ; If LO, noÊ30$:KÊ MESAG$ HMSG,16.,,<,> ;JRK330 Ì ;**-1o4Í CLR I.PRM+P3(R1) ; Init status and pending countÎ:Ï BITB #ES.RIP, E.STAT(R0) ; Is this extent being loaded?2Ð BEQ 40$ ; If EQ, no, packet can be used as isÑ4Ò CALL ATTCED ; Attach, IOC will request phase II6Ó BCS POOL ; If CS, lacking cache private sec. poolÔ:Õ BICB #CS.REQ, APRD.BASE+H.CSTS ; Don't request phase II Ö BR 50$e×/Ø40$: INCB E.PCNT(R0) ; Lock the extent down:BÙ BISB #CS.REQ, APRD.BASE+H.CSTS ; Packet ready, request phase IIÚ;Û50$: USTAT$ S.RHIT ; Now we're sure, increment read hits5Ü TST (SP)+ ; Remove statistics context from stacksÝ;Þ MOV R0, I.PRM+P6(R1) ; Plug target CED address in packetbAß MOV #APRD.BASE+H.PKTQ, R0 ; Packet wait queue listhead address 0à CALL $QINSP ; Insert packet into wait queueá5â CALLR DCRUN ; Invoke phase II if packet is readyuã;h*ä; Handle rejections and error conditionså;;ê ;**-4w&êPOOL: MESAG$ KMSG1,18. ;JRK330Aì MOV #APR6.BASE, (SP) ; Errors are not counted in context ;**-1'@í USTAT$ S.PSP ; Lacking cache private secondary pool ;DPR024;ð TST (SP)+ ; Remove statistics context from stack ;**-2 .ñ CALLR $DRQRQ ; Pass request to the driverñ ;JRK330eñOVRLAP: ;JRK330ñ .IFDF CHEDFR ;JRK330ñ ;JRK330L0ñ CALL MAPUCB ; Map the device UCBX ;JRK330ñ; ;JRK330Wñ; See if this device supports write defers. If not, immediately send request ;JRK3303Gñ; to the device driver since there are no deferred extents. ;JRK330ñ; ;JRK330Wñ; If defers were just turned off, the cache may be in the process of flushing ;JRK336 Vñ; them. Since the XC.DFR bit will have been turned off, but there may still ;JRK336Rñ; be deferred extents in the cache, we can't just turn off the deferred ;JRK336Uñ; lookup code. So, as long as X2.DEA is turned on, the XC.DFR bit does not ;JRK336eRñ; indicate the state of deferred lookup support. No more defers will be ;JRK336Tñ; allowed, but until the CEDs are eliminated, they will be used for reads. ;JRK336ñ; ;JRK336Fñ BITB #X2.DEA,X.CST2+140000 ; Are defers in process of flush ;JRK3363ñ BNE 3$ ; If NE, yes, must continue on ;JRK336tñ ;JRK3366Gñ BITB #XC.DFR,X.CSTS+140000 ; Does this device support defers ;JRK330e9ñ BEQ 100$ ; If EQ, no, send request to driver ;JRK330eñ3$: ;JRK3303ñ CALL MAPPAR ; Map the cache partition ;JRK330o=ñ CLR -(SP) ; Set up default duplicate I/O address ;JRK330uBñ MOV I.PRM+P5(R1),-(SP) ; Set up LBN of range to search ;JRK330ñ; ;JRK330Yñ; Start by seeing if the first overlapping extent is deferred. If it is, create;JRK330,Wñ; a duplicate I/O packet and create the first of a possible set of attachment ;JRK330oUñ; blocks that will point to any of the CEDs in the range of the current I/O ;JRK330eWñ; that will need to be copied to the user buffer after the completion of the ;JRK330(ñ; I/O from dis00`ºnümßmæàmçámýfáþfDATAk to user. ;JRK330ñ; ;JRK330Bñ5$: BITB #ES.WDF,E.STAT(R0) ; Is this a deferred extent ;JRK3306ñ BNE 20$ ; If NE, yes, process this extent ;JRK330ñ ;JRK330d;ñ10$: CALL $TSEND ; See if this CED is the last ;JRK330t&ñ BCC 15$ ; If CC, it is ;JRK330ñ; ;JRK330Sñ; The last CED processed did not completedly fill the I/O request range. ;JRK3303Tñ; Starting with the top of that CED, the search for another CED will begin ;JRK330.ñ; using a modified size value. ;JRK330ñ; ;JRK330?ñ MOV (SP),R2 ; Restore start LBN of range to search ;JRK3303Bñ MOV E.LBNL(R0),R3 ; Get offset from range to CED start ;JRK330ñ SUB R2,R3 ; ;JRK330D>ñ SUB R3,R4 ; Decrement that count from total blocks;JRK330<ñ MOVB E.SIZE(R0),R3 ; Set up new size for search ;JRK330ñ SUB R3,R4 ; ;JRK330Añ MOV E.LBNH(R0),R2 ; Reset the start LBN for next CED ;JRK330a9ñ MOV R2,(SP) ; Save start LBN for next round ;JRK330sñ CLR R3 ; ;JRK330 'ñ BISB E.LBNH+2(R0),R3 ; ;JRK330V;ñ CALL $FDCED ; Search for the next deferred CED ;JRK3303ñ BCC 5$ ; Go back and process this one ;JRK330añ; ;JRK330Rñ; No more CEDs are to be processed. The only way we know if one of them ;JRK330Rñ; was deferred is by the duplicate I/O packet address on the stack. If ;JRK330Wñ; is zero, bump the partial overlap count and let the driver fill the request ;JRK330SRñ; back to the user. If there is a duplicate, the MBXIOC will handle the ;JRK330Uñ; transfer of the deferred extents to the user buffer before completing the ;JRK330Jñ; user I/O. ;JRK330nñ; ;JRK330;ñ15$: TST (SP)+ ; Eliminate the LBN range value ;JRK330e;ñ TST (SP)+ ; Check duplicate I/O packet address ;JRK330e8ñ BEQ 100$ ; If EQ, partial overlap condition ;JRK3306ñ BR 110$ ; Multi-Block transfer will occur ;JRK330ñ; ;JRK330Xñ; At this point, it is known that there is at least one deferred CED that must ;JRK330Wñ; be transferred at the completion of the I/O from the disk. A duplicate I/O ;JRK330lWñ; packet is created to hold the information from the original I/O packet that ;JRK330+Yñ; gets changed when it is changed into an internal I/O with a completion return ;JRK330dUñ; within the data caching code. This extra packet is also used to hold the ;JRK330;Uñ; listhead for all CEDs that are tied down waiting for the I/O to complete. ;JRK330sñ; ;JRK330ñ20$: ;JRK330t@ñ MOV R4,-(SP) ; Save the range size across processing ;JRK3301ñ MOV R0,R4 ; Save the extent address ;JRK330tñ ;JRK330h9ñ TST 4(SP) ; Skip duplication if already done ;JRK330ñ BNE 40$ ; ;JRK330ñ ;JRK330l4ñ CALL CHEDUP ; Duplicate the I/O packet ;JRK3301ñ BCC 30$ ; If CS, unable to allocate ;JRK330 ñ; ;JRK330Yñ; It isn't possible to allocate the space for the extra I/O packet. The current;JRK330 Xñ; scheme is to get out of the situation by backing up the user's PC to reissue ;JRK3303ñ; the I/O after a significant event. ;JRK330añ; ;JRK3304ñ SUB #10,SP ; Back up the stack pointer ;JRK330>ñ CALLR $BCKUP ; Back up the user PC to reissue the ;JRK3301ñ ; I/O after a significant event ;JRK330eñ; ;JRK330Uñ; The duplicate I/O packet has been successfully allocated. The address if ;JRK330oXñ; it will be stored in (SP) to indicate on successive passes that the previous ;JRK330Wñ; code path won't have to be duplicated. The original I/O packet address wil ;JRK330iBñ; also be stored in the duplicate for easy reference. ;JRK330ñ; ;JRK330;ñ30$: MOV R0,4(SP) ; Store the duplicate address ;JRK330rGñ MOV R1,I.PRM+P6.2(R0) ; Store address of original I/O in dup ;JRK330Cñ CLR I.PRM+P6.1(R0) ; Initialize listhead to attachments ;JRK330y@ñ MOV R0,I.AADA(R1) ; Point to dup. packet in original ;JRK330Jñ MOV KINAR5,I.IOSB+2(R1) ; Turn original packet into internal I/O;JRK330Mñ MOV #MBXIOC00`Ân¥nn´cÚµcÛ¶c�·c›’!1,I.IOSB+4(R1) ; and return to MBXIOC for completion;JRK330 5ñ ; The OR'd 1 indicates internal I/O ;JRK330;ñ; ;JRK330Xñ; Now create an attachment block for the discovered CED. This attachment will ;JRK330Wñ; contain a forward pointer to the next attachment, a pointer to the CED that ;JRK330 Yñ; is tied down to prevent its elimination before the contents can be transferred;JRK330;6ñ; to the user buffer, and a status word. ;JRK330ñ; ;JRK330@ñ40$: CALL CREATT ; Allocate a block of data for this ;JRK330*ñ BCC 50$ ; If CC, successful ;JRK3307ñ BPT ; For the moment, failure to allocate ;JRK330 ñ ;JRK330eñ; ;JRK330Rñ; A deferred extent has been found within the range of the current read ;JRK330Tñ; request. It will be tied down to prevent its elimination while the read ;JRK330Vñ; is posted to the device for the old data. The CED will also be pointed to ;JRK330Kñ; by the allocated attachment block which will be filled in here ;JRK330 ñ; ;JRK330ñ50$: ;JRK330IMñ MESAG$ DFRATT,30.,,<,> ;JRK330Kñ ;JRK330KCñ INCB E.PCNT(R4) ; Tie down extent to prevent elimination;JRK330iCñ MOV R4,A.IOPA(R0) ; Put CED address in attachment block ;JRK330e1ñ MOV R4,-(SP) ; Save the CED address ;JRK330R@ñ MOV 6(SP),R4 ; Restore the duplicate I/O packet addr ;JRK330Fñ MOV I.PRM+P6.1(R4),(R0) ; Place the current packet in front ;JRK330Dñ MOV R0,I.PRM+P6.1(R4) ; of listhead in duplicate packet ;JRK330ñ; ;JRK330Vñ; Processing for this CED is complete. Now check to see if this is the last ;JRK330Wñ; deferred extent in the range of the I/O request. If so, queue the original ;JRK330AYñ; I/O packet to the driver to copy the old data to the user buffer and wait for ;JRK330sAñ; its completion before transferring the extent data ;JRK330dñ; ;JRK3303ñ MOV (SP)+,R0 ; Restore the CED address ;JRK330;2ñ MOV (SP)+,R4 ; Restore the range size ;JRK3304ñ BR 10$ ; Go back and look for more CEDs ;JRK330ñ ;JRK330 ñ; ;JRK330Vñ; At this point the I/O packet is either the untouched original that will be ;JRK330Rñ; completed by the driver back to the user or will be a packet with the ;JRK330Sñ; forward pointers to the duplicate I/O packet and the attachments to the ;JRK330gXñ; deferred extents. If the driver is completing the I/O for good, the partial ;JRK3305ñ; overlap system value is incremented. ;JRK330zñ; ;JRK330ñ .ENDC ;CHEDFR ;JRK330sñ ;JRK330 %ñ100$: MESAG$ MMSG,15. ;JRK330tAñ USTAT$ S.RLAP ; Cache missed because partial overlap ;JRK330 Bñ110$: TST (SP)+ ; Eliminate the excess statistics data ;JRK3307ñ CALLR $DRQRQ ; Pass request to the driver ;JRK330uñ ;JRK330dñ ;JRK330hñ ;JRK330rñ;+ ;JRK330vVñ; $TSEND - routine to determine if the end of the selected CED is beyond the ;JRK3301ñ; range of a requested I/O packet. ;JRK330Nñ; ;JRK330ñ; Inputs: ;JRK3306ñ; R0 - CED known to overlap range of I/O ;JRK330Fñ; R2,R3 - MSP,LSP of the highest block of I/O request range ;JRK330ñ; Outputs: ;JRK330>ñ; CC - CED extends beyond the end of the I/O range ;JRK330<ñ; CS - CED end is enclosed within the I/O range ;JRK330ñ;- ;JRK330 ñ$TSEND:: ;JRK330Dñ CMPB R3,E.LBNH+2(R0) ; Might the extent map the request? ;JRK330$ñ BLO 10$ ; If LO, yes ;JRK336#ñ BHI 20$ ; If HI, no ;JRK33607ñ CMP R2,E.LBNH(R0) ; Double word comparison ;JRK330r%ñ BHIS 20$ ; If HIS, no ;JRK336 @ñ10$: TST (PC)+ ; Indicate extent is beyond I/O range ;JRK336=ñ20$: SEC ; Indicate end of extent is within range;JRK336fñ RETURN ;JRK336ñ ;JRK336lñ ;JRK336añ;+ ;JRK336 Rñ; $FDCED - routine to determine if any other existing extents after the ;JRK336Lñ; currently selected one are00`ÊnümßmæàmçámýfáþfDATA within the range of the requested I/O ;JRK336ñ; ;JRK336ñ; Inputs: ;JRK336 8ñ; R0 - CED address of last processed extent ;JRK336=ñ; R2,R3 - LBN starting address of range to check ;JRK336IAñ; R4 - size of region left to check (in 32 wd blocks) ;JRK336rñ; ;JRK336ñ; Outputs: ;JRK336Dñ; CC: R0 - CED address of extent in range of I/O request ;JRK336Hñ; R2,R3 - LBN address of top of CED discovered to overlap ;JRK3360ñ; CS - No further involved extents ;JRK336ñ;- ;JRK3366ñ .IFDF CHEDFR ;JRK336ñ$FDCED:: ;JRK3362ñ SEC ; Assume no more CEDs to process ;JRK336Bñ MOV E.LNXT(R0),R0 ; Get address of next extent in line ;JRK3362ñ BEQ 100$ ; If EQ, no more to process ;JRK336@ñ MOV R2,-(SP) ; Save starting address of LBN to check ;JRK336ñ MOV R3,-(SP) ; ;JRK3361ñ DEC R4 ; Temporarily normalize size ;JRK336 >ñ ADD R4,2(SP) ; Get address of top block of request ;JRK3362ñ ADC (SP) ; Double word computation ;JRK336-ñ INC R4 ; Restore size variable ;JRK336ñ ;JRK336RDñ CMPB R3,E.LBNH+2(R0) ; Might the extent map the request? ;JRK336&ñ BHI $FDCED ; If HI, no ;JRK336$ñ BLO 20$ ; If LO, yes ;JRK3367ñ CMP R2,E.LBNH(R0) ; Double word comparison ;JRK336r(ñ BHIS $FDCED ; If HIS, no ;JRK336Gñ20$: CMPB (SP),E.LBNL-1(R0) ; Does this extent truly overlap? ;JRK336K$ñ BHI 30$ ; If HI, yes ;JRK336#ñ BLO 50$ ; If LO, no ;JRK336C:ñ CMP 2(SP), E.LBNL(R0) ; Double word comparison ;JRK336#ñ BLO 50$ ; If LO, no ;JRK336 ñ ;JRK336C@ñ30$: TST (PC)+ ; Indicate another CED found in range ;JRK3364ñ50$: SEC ; Indicate no more CEDs found ;JRK330=ñ60$: MOV (SP)+,R3 ; Restore high LBN of found CED ;JRK330pñ MOV (SP)+,R2 ; ;JRK330ñ100$: RETURN ;JRK330ñ ;JRK330(ñ .ENDC ;CHEDFR ;JRK330ló J1ô .SBTTL + LOAD - Prepare to load a cache extentOõ; ö; Passed: "÷; Cache partition mapped in APR6ø; H.TMP2 -> Next CED by LBN/ù; E.LBNL, -1 := Starting LBN of this extent ú;Jû; (SP) := Statistics contextü; ý; R1 -> I/O packet3þ; I.EFN := Sign bit indicates virtual operationoÿ; I.FNC := Function(+; I.PRM+P4, P5 := Requested starting LBNK; I.TCB -> Requestor's TCB.; T.ST3 := T3.ACP indicates task is an ACP$; R4 := Number of blocks requested; R5 -> UCB address -; U.UCBX -> Secondary pool address of UCBX8; X.CSTS := Unit's cache status, selected operations$; X.XDAT := Virtual extent limit'; X.XRDA := Read ahead extent limit$ ; X.XOVR := Overlay extent limit$ ; X.XLOG := Logical extent limit& ; X.XDIR := Directory extent limit ;F5 ; $CXDBL := Indicates context switching disabledn:; $DCCEL := Length of extent used to map this request3; $DCCEB, +2 := LBN of first block of this extents;e ; Returned: 7;;; N/A - control is passed to either CLOAD or $DRQRQB; ; Action: G; The appropriate extent limit is checked. If the request is too bigl; it is passed to the driver.e; @; Virtual requests are then increased to the read ahead limit.;x; Future enhancements:K; If a virtual request is made to a block which is the last one within andH; extent, we have the option of loading data from the next extent with:; the hope that the user will happen to request it soon.;n4; $DCNEL - Length of extent following current one/ ; $DCNEB - LBN of first block of this extent !;t=!LOAD: MESAG$ LMSG,17.,,<> ;JRK330d# ;**-18$ MOV KISAR6, -(SP) ; Save the cache partition mapping7% MOV U.UCBX(R5), KISAR6 ; Map to the UCBX temporarilyu&& .IFDF CHEDFR ;JRK330& ;JRK330nH& BITB #X2.DEA,APR6.BASE+X.CST2; Is the cache being deactivated ;JRK330<& BNE DEACT ; If NE, yes, don't allow cache loads ;JRK330& ;JRK330 & .ENDC ;CHEDFR ;JRK330e& ;JRK330 &' TSTB I.EFN(R1) ; Virtu00`Òn¥nn´cÚµcÛ¶c�·c›’al function?.( BPL 40$ ; If PL, no, logical of some form)H* CMPB R4, APR6.BASE+X.XDAT ; Is the requested size acceptable? ;DPR0268+ BLOS 10$ ; If LOS, yes, attempt to increase ;DPR0261, JMP TOOBIG ; Else fail the request ;DPR0260-10$: ;DPR026.; O/; If the requested size is within the virtual I/O limit an attempt is made to;M0; increase it through to the end of the disk extent described by $DCCEB andH 1; $DCCEL.J2;eC3 BITB #XC.RDA, APR6.BASE+X.CSTS ; Is read ahead selected? ;DPR026L%4 BEQ CLOAD ; If EQ, no ;DPR026m5;P6; Calculate the number of disk blocks, starting from the requested one, to theC7; end of the extent. An implied carry is allowable in this case.l8;i.9 MOV I.PRM+P5(R1), R2 ; Get user's LBN (LSP)6: SUB $DCCEB+2, R2 ; Subtract base mapping of extent.; SUB R2, $DCCEL ; Subtract from extent size<:= CMP $DCCEL, R4 ; Is the end of the disk extent higher?7> BEQ CLOAD ; If EQ, no, can't increase size ;DPR026 $? BHI 15$ ; If HI, yes ;DPR026#@ BPT ; Sanity check ;DPR026A15$: ;DPR026u*B MOV $DCCEL, R4 ; Use the extent's sizeC-C CLR R3 ; Prepare to load byte. ;EDP033d3C BISB APR6.BASE+X.XRDA,R3 ; Load byte. ;EDP033M4E CMP R4, R3 ; Is the new size acceptable? ;**-1F BLOS 20$ ; If LOS, yes ;F MOV R3,R4 ; Otherwise impose read-ahead limit. ;EDP033H20$: ;**-1hI; OJ; If necessary the increased request size is reduced to avoid overlapping the2K; next cache extent.L; :M MOV (SP), KISAR6 ; Restore the cache partition mapping;N MOV APRD.BASE+H.TMP2, R0 ; Get CED of next extent by LBN6O BEQ CLOAD ; If EQ, isn't one, don't check overlapP4Q MOVB I.PRM+P4(R1), R3 ; Get fresh copy of LBN MSP3R MOV I.PRM+P5(R1), R2 ; Get fresh copy of LBN LSP08S ADD R4, R2 ; Recalculate high LBN based on new size T ADC R3tU-V CMPB R3, E.LBNL-1(R0) ; Overlap on buffer?cW BLO CLOAD ; If LO, noX BHI 30$ ; If HI, yesv/Y CMP R2, E.LBNL(R0) ; Double word comparisonMZ BLO CLOAD ; If LO, no[;cM\; There is overlap here. We must shrink the size of the request down. TheBQ]; best thing to do here is to subtract the extent's base LBN from the request's)N^; high LBN. The resulting number indicates how much the buffer size must beG_; adjusted to prevent overlap. Again, an implied carry is allowable.R`;.a30$: SUB E.LBNL(R0), R2 ; Subtract from LSP-b SUB R2, R4 ; Backup the necessary blocks c BR CLOAD ; Load the cached;uOe; Determine exactly what type of logical I/O and enforce corresponding limit..f;m9g40$: MOVB APR6.BASE+X.XOVR, R3 ; Assume it's an overlayi2h CMP I.FCN(R1), #IO.RLB ; Is assumption correct?i BNE 50$ ; If NE, yeshj8k MOVB APR6.BASE+X.XLOG, R3 ; Assume it's a logical I/O/l MOV I.TCB(R1), R2 ; Get the requestor's TCB,m; BNE 45$ ; If NE, got itRn; BPT ; Sanity check0o;45$:S(p BIT #T3.ACP, T.ST3(R2) ; From an ACP?q BEQ 50$ ; If EQ, nor3s MOVB APR6.BASE+X.XDIR, R3 ; Assume it's Files-11 )t TSTB $CXDBL ; Is assumption correct?pu BEQ 50$ ; If EQ, yes:v9w MOVB APR6.BASE+X.XDAT, R3 ; Turns out it's ACP virtualFxx50$: ;EDP033o8x CMPB R4,R3 ; Is requested size acceptable? ;EDP033&z BLOS CLOAD ; If LOS, yes ;**-1z ;JRK330 z .IFDF CHEDFR ;JRK330z ;JRK330,5z BR TOOBIG ; Increment the failure tally ;JRK330#z ;JRK330rz .ENABL LSB ;JRK330z ;JRK330P(zDEACT: MESAG$ DEAMSG,31. ;JRK330Bz MOV (SP)+,KISAR6 ; Restore the cache partition mapping ;JRK330z BR 10$ ;JRK330z ;JRK330oz .ENDC ;CHEDFR ;JRK330 z ;JRK330C(zTOOBIG: MESAG$ KMSG2,19. ;JRK330A} MOV (SP)+, KISAR6 ; Restore the cache partition mapping ;**-2K'~ USTAT$ S.RBIG ; Request is too big ; BR 10$€10$:5� TST (SP)+ ; Remove statistics context from stack.‚ CALLR $DRQRQ ; Pass request to the driver‚ .DSABL LSB ;JRK330ƒ S„00`ÚnümßmæàmçámýfáþfDATA .SBTTL + CLOAD - Cache load…;( †; Passed:;,‡; (SP) := Cache partition physical addressˆ; 2(SP) := Statistics context ‰;JŠ; R1 -> I/O packet+‹; I.PRM+P4, P5 := Requested starting LBNO"Œ; R4 := Number of blocks to load�;M Ž; Returned:6'�;;; N/A - control is passed to $DRQRQ*�; ‘; Action:BG’; Allocate the necessary data structures. If any resource is lackingt#“; pass the request to the driver.R”;RI•; Prepare the packet going to the driver being sure everything is readyB6–; for IOC since it may run before phase I completes.—;hA˜CLOAD: MOV (SP)+, KISAR6 ; Restore the cache partition mappingJ™-› CALL GETBUF ; Get a cache buffer ;**-1t1œ BCS FAIL ; If CS, lacking cache private poold�;M ž; Context:'Ÿ; R0 -> CED of newly allocated extentR ; R1 -> I/O packet¡; 8¢ MOV R0, R3 ; Put the CED address in a safe register+£ CALL CHEDUP ; Duplicate the I/O packetr2¤ BCS POOL1 ; If CS, lacking primary pool space¥;g ¦; Context:6§; R0 -> Duplicated I/O packet to be queued to driver3¨; R1 -> Original I/O packet to be queued to cachet©; R3 -> New CEDtª;a « XOR R0, R3 ; Swap R0 and R3+¬ XOR R3, R0 ; Ready parameter to ATTCEDC­ XOR R0, R3 ; Complete swap3® CLR E.ATTL(R0) ; Initialize the attachment listt2¯ CLRB E.PCNT(R0) ; Initialize the pending count°° .IF DF CHESAN ;JRK336r° ;JRK336D9° CLR E.MBXC(R0) ; Initialize the sanity block ;JRK336r° ;JRK336g° .ENDC ;CHESAN ;JRK336t° ;JRK336u=± CLR I.PRM+P3(R1) ; Initialize attachment count and statusa-² CALL ATTCED ; Attach the I/O and the CED #² BCC 10$ ; If CC, OK ;JRK330e8² JMP POOL2 ; Lacking Cache private Sec. Pool ;JRK330²10$: ;JRK330i´ ;**-1e8µ USTAT$ S.RLOD ; Now we're sure, increment read load5¶ TST (SP)+ ; Remove statistics context from stackJ·;D¸; Prepare the driver packet.¹; (º MOV R0, -(SP) ; Save the CED address(» MOV R1, -(SP) ; cache packet address&¼ MOV R4, -(SP) ; and requested size½;¾ MOV KINAR5, I.IOSB+2(R3) ; Setup internal I/O completioncD¿ MOV #, I.IOSB+4(R3) ; Address must be in APR5!, note bit-0À2Á MOV E.PHYA(R0), R1 ; Buffer address doubleword MOV #140000, R2 ; In APR6 8à CALL $MPPHY ; Map to physical address if NPR device?Ä MOV R1, I.PRM+P1.1(R3) ; Set the most significant part (MSP)?Å MOV R2, I.PRM+P1.2(R3) ; Set the least " " (LSP)eÆ+Ç MOV R3, R1 ; Ready parameter to $DRQRQtÇ; ;EDP033KÇ; R4 currently contains the length expressed in 512-byte blocks. ;EDP033IÇ; ;EDP0331Ç ASH #11,R4 ; Convert to byte count. ;EDP033 :Ì MOV R4, I.PRM+P2(R1) ; Setup the buffer's length ;**-4Í2Î MOV R0, I.AADA(R1) ; Point to CED being loaded0Ï CLRB I.EFN(R1) ; Make into a logical I/O ???Ð;P Ñ; Note: %Ò; Everything must be ready for IOC!Ó;V6Ô MOVB #ES.RIP, E.STAT(R0) ; Flag as read-in-progressÕ?Ö MOV KISAR6, -(SP) ; Save APR6 because DUDRV uses it ;DPR022D@Ö MOV R5, -(SP) ; Save address of UCB, driver clobbers ;DPR032!× CALL $DRQRQ ; Send to driver0*× MOV (SP)+, R5 ; Restore UCB ;DPR032?Ø MOV (SP)+, KISAR6 ; Restore mapping to cache region ;DPR022;.Ù MOV (SP)+, R4 ; Restore the requested size(Ú MOV (SP)+, R1 ; cache packet address#Û MOV (SP)+, R0 ; and CED address Ü; Ý; Context:$Þ; R0 -> CED of extent being loadedß; R1 -> Cache packet7ß; R4 := size of request in 512-byte blocks ;EDP033Rá; ;**-1%â; Complete the setup of the new CEDaã;s7ä MOVB I.PRM+P4(R1), R3 ; Get MSP of the requested LBN å6æ MOVB R3, E.LBNL-1(R0) ; Setup the extent LBN (MSP)'ç MOV I.PRM+P5(R1), E.LBNL(R0) ; (LSP)cè<é MOV I.PRM+P5(R1), E.LBNH(R0) ; Setup the high LBN as wellêBì ADD R4, E.LBNH(R0) ; Add the length to obtain high block ;**-1 í ADC R33î MOVB R3, E.LBNH+2(R0) ; Setup the high LBN (MSP)dï3ð CALL QADAGE ; Insert the CED into the age list2-ñ CALL QINLBN ; and int00`ân¥nn´cÚµcÛ¶c�·c›’o the unit LBN listò;p5ó; Prepare the cache packet for queueing to phase IIRô;33õ MOV R0, I.PRM+P6(R1) ; Point cache packet to CEDBö6÷ MOV #APRD.BASE+H.PKTQ, R0 ; Get address of listhead/ø CALL $QINSP ; Queue the packet by priorityLù(ú RETURN ; IOC will request phase IIû;, ü; Handle rejections and errorsý; þ .ENABL LSB1&þFAIL: MESAG$ KMSG3,20. ;JRK330A MOV #APR6.BASE, (SP) ; Errors are not counted in context ;**-1n7 USTAT$ S.PSP ; Lacking cache extent space ;DPR024N  BR 10$pPOOL1:;hQ; Should the situation occur where buffer space exists within the cache, BUT nohK; pool exists for an I/O packet, the allocated space within the partitionB; should be deallocated and the request forwarded to the driver.;w! MESAG$ KMSG4,21. ;JRK330dA  MOV #APR6.BASE, (SP) ; Errors are not counted in context ;**-132  USTAT$ S.POL ; Lacking primary pool ;DPR024 -  MOV R3, R0 ; Prepare parameter to FREBUF " CALL FREBUF ; Free up the CED  BR 10$ POOL2:;J; There is not enough pool available for an attachment. Back out of the>; current predicament and forward the request to the driver.;w! MESAG$ KMSG1,18. ;JRK330 A MOV #APR6.BASE, (SP) ; Errors are not counted in context ;**-1G7 USTAT$ S.PSP ; Lacking cache private pool ;DPR024o" CALL FREBUF ; Free up the CED  XOR R1, R3 ; Swap R1 and R3- XOR R3, R1 ; Prepare parameter to $DRQRQe- XOR R1, R3 ; Prepare parameter to CHEDEPC6 CALL CHEDEP ; Deallocate the duplicate I/O packet ; BR 10$ 10$:5! TST (SP)+ ; Remove statistics context from stack ." CALLR $DRQRQ ; Pass request to the driver # .DSABL LSB8# .PAGE ;JRK3309# .SBTTL MULTI-EXTENT TRANSFER I/O COMPLETION ;JRK330=# .SBTTL + MBXIOC - Internal I/O completion routine ;JRK330#; ;JRK330#; Passed: ;JRK330 %#; R3 -> Driver packet ;JRK330r##; I.UCB -> UCB ;JRK330,.#; I.PRM+P3, P4 := Driver status ;JRK330,#; I.AADA -> Cache packet ;JRK330#; ;JRK330# .IFDF CHEDFR ;JRK330# ;JRK330#MBXIOC: ;JRK330:# MESAG$ MBXMSG,39.,,<> ;JRK330# ;JRK330E4# MOV I.UCB(R3),R5 ; Get the UCB address ;JRK3304# MOV R3,R1 ; Copy address of I/O packet ;JRK330># CALL ADJBUF ; Adjust user buffer to $BLXIO format ;JRK330<# MOV I.AADA(R3),R3 ; Get address of cache packet ;JRK330#; ;JRK330#; Passed: ;JRK330 $#; R3 -> Cache packet ;JRK330E#; I.PRM+P4 := Requested LBN most significant part (MSP) ;JRK330JE#; I.PRM+P5 := Requested LBN least significant part (LSP) ;JRK330.9#; I.PRM+P6.1 -> CED of first involved extent ;JRK330R7#; I.PRM+P3, P4 := Driver completion status ;JRK330C#; ;JRK330U#; Get back the pointer to the duplicate I/O packet with the saved arguments ;JRK330AT#; from the original. Copy these values back to the original packet to be ;JRK330R#; sent to the user and deallocate the pool for the duplicated I/O packet ;JRK330#; ;JRK330# ;JRK330A# MOV I.IOSB+2(R3),I.IOSB+2(R1) ; Restore original IOSB ;JRK3303,# MOV I.IOSB+4(R3),I.IOSB+4(R1) ;JRK330B# MOV I.AADA(R3), I.AADA(R1) ; Restore original I.AADA ;JRK330I# MOV I.PRM+P4(R3),I.PRM+P4(R1) ; Restore the MSP and LSP of the ;JRK330 C# MOV I.PRM+P5(R3),I.PRM+P5(R1) ; starting LBN address ;JRK330pI# MOV I.PRM+P6.1(R3), R0 ; Get address of first involved extent;JRK330s# ;JRK330 @# CALL CHEDEP ; Deallocate packet from primary pool ;JRK330#; ;JRK330U#; Go into a loop getting the addresses of the involved extents to be copied ;JRK330,X#; into the user buffer now that the disk copy of the data is completed. These ;JRK330T#; addresses are taken from the attachment blocks hanging off the duplicate ;JRK330Y#; I/O packet. The CEDs are individual processed to restore the blocking counts ;JRK330 Y#; and copy t00`ênümßmæàmçámýfáþfDATAhe data to the user task. Then the attachment block is deallocated.;JRK330D#; ;JRK330<# MOV R0,R3 ; Copy the first CED address involved ;JRK3305# BNE 5$ ; If NEQ, there is one to process ;JRK330p4# BPT ; There had better be at least one ;JRK330# ;JRK330s6#5$: CALL MAPPAR ; Map the Cache partition ;JRK3309# MOV R1,R5 ; Duplicate the I/O packet address ;JRK330# ;JRK330DG#10$: MOV A.IOPA(R3),R0 ; Get the CED address for this attach ;JRK330n:# MOV (R3),-(SP) ; Save the next packet address ;JRK330:# CALL .DEPAD ; Deallocate the attachment block ;JRK330C# BISB #ES.XIP,E.STAT(R0) ; Indicate transfer in progress ;JRK330Q#; ;JRK330Y#; First determine the address of the LBN immediately following the I/O request. ;JRK330R#; This will be used in the determination of the size and buffer offsets ;JRK330#; ;JRK330'# MOV I.PRM+P5(R5),-(SP) ; ;JRK330AH# MOVB I.PRM+P4(R5),R4 ; Get address of first LBN after request;JRK330# MOV R4,-(SP) ; ;JRK330?# MOV I.PRM+P2(R5),R4 ; Get the request size (bytes) ;JRK330k&# ADD #777,R4 ; Round up ;JRK3302# ROR R4 ; Bring carry in as high bit. ;JRK3307# SWAB R4 ; Finish right shift of nine bits. ;JRK330d3# BIC #177400,R4 ; Clear unwanted bits. ;JRK330w:# ADD R4,2(SP) ; Calculate highest LBN requested ;JRK330,# ADC (SP) ; Carry if necessary ;JRK330#; ;JRK330S#; Now the range of the I/O packet is determined by the I.PRM+P4/P5 start ;JRK330T#; address and the (SP)/2(SP) pair while the CED range is determined by the ;JRK330/#; E.LBNL/-1 and E.LBNH/+1 pair. ;JRK330#; ;JRK3305# CLR R1 ; Initialize the CED offset value ;JRK330h# ;JRK330 C# MOV I.PRM+P2(R5),R2 ; Get the total size of the request ;JRK330D# ;JRK330e.# CLR R3 ; Initialize front offset ;JRK330N# CMPB E.LBNL-1(R0),I.PRM+P4(R5) ; See if there is an offset in front ;JRK3305# BHI 20$ ; If HI, there is, determine it ;JRK330+# BLO 30$ ; If LO, there isn't ;JRK330hA# CMP E.LBNL(R0),I.PRM+P5(R5) ; Double precision check ;JRK330+;# BHI 20$ ; If HI, there is an offset to compute ;JRK330n*# BEQ 30$ ; If EQ, no offset ;JRK330# ;JRK330MG# MOV I.PRM+P5(R5),R1 ; Compute the offset into the CED buffer;JRK330 ## SUB E.LBNL(R0),R1 ; ;JRK330e0# BR 30$ ; Go on to compute the size ;JRK330# ;JRK330eA#20$: MOV E.LBNL(R0),R3 ; Determine front sided offset ;JRK330e%# SUB I.PRM+P5(R5),R3 ; ;JRK330O7# ASH #9.,R3 ; Turn block number into bytes ;JRK330;# ;JRK330cB#30$: SUB R3,R2 ; R2 now contains modified size request ;JRK330# ;JRK330;2# CLR R3 ; Initialize back side offset ;JRK330# ;JRK3301A# CMPB (SP),E.LBNH+2(R0) ; Is there a back sided offset ;JRK3300## BLO 50$ ; If LO, no ;JRK330o$# BHI 40$ ; If HI, yes ;JRK330># CMP 2(SP),E.LBNH(R0) ; Check with double precision ;JRK3305# BLOS 50$ ; If LOS, no offset to compute ;JRK330K# ;JRK330 >#40$: MOV 2(SP),R3 ; Get high address of I/O request ;JRK330B# SUB E.LBNH(R0),R3 ; Turn it into the back sided offset ;JRK3307# ASH #9.,R3 ; Turn block number into bytes ;JRK330o# ;JRK330 @#50$: SUB R3,R2 ; R2 contains transfer size in blocks ;JRK330# ;JRK330B4# CLR R3 ; Get default user buffer offset ;JRK330# ;JRK330CI# CMPB E.LBNL-1(R0),I.PRM+P4(R5) ; Is there a user buffer offset ;JRK330 ## BLO 70$ ; If LO, no ;JRK330K$# BHI 60$ ; If HI, yes ;JRK330E# CMP E.LBNL(R0),I.PRM+P5(R5) ; Check with double precision ;JRK330 6# BLOS 70$ ; If LOS, no user buffer offset ;JRK330# ;JRK330m@#60$: MOV E.LBNL(R0),R3 ; Get high LBN address of CED ;JRK330A# SUB I.PRM+P5(R5),R3 ; Turn R3 into user buffer offset ;JRK330B#; ;JRK330X#; The result of the previous code was to determine the relative offsets of the ;JRK330X#; starting addresses of the APR biases of the 00`òn¥nn´cÚµcÛ¶c�·c›’user buffer determined by ADJBUF ;JRK330X#; and the CED LBN (E.LBNL). These values will be passed to EBLXIO to copy the ;JRK330:#; data into the user buffer from the extent. ;JRK330#; ;JRK330@#70$: MOV (SP)+,(SP)+ ; Pop the excess data off stack ;JRK3309# ASH #3,R1 ; Turn user offset into 32 wd bias ;JRK330f8# ASH #3,R3 ; Turn CED offset into 32 wd bias ;JRK330B# ADD I.PRM(R5),R3 ; Get bias into user buffer for start ;JRK330<# ADD E.PHYA(R0),R1 ; Get bias into CED for start ;JRK3301# MOV R0,-(SP) ; Save the CED address ;JRK330L7# MOV R2,R0 ; Get size to transfer in bytes ;JRK330;D# MOV #APR5.BASE,R2 ; Get source displacement in APR5 form ;JRK330F# MOV I.PRM+2(R5),R4 ; Get destination displacement from I/O ;JRK330#; ;JRK3308#; Transfer data from extent to user buffer ;JRK330#; ;JRK3308# CALL EBLXIO ; Transfer data to user buffer ;JRK330# ;JRK330f0# MOV (SP)+,R0 ; Restore CED address ;JRK3307# CALL QUPAGE ; Move CED to end of age list ;JRK330 E# BICB #ES.XIP,E.STAT(R0) ; Indicate no transfer in progress ;JRK330 ># DECB E.PCNT(R0) ; Unlock extent for this operation ;JRK3309# BNE 80$ ; If NE, that's all that can be done ;JRK330s#; ;JRK330@#; See if this extent has been waiting to be deleted ;JRK330#; ;JRK330H# BITB #ES.DEL,E.STAT(R0) ; Been declared available for delete? ;JRK330,# BEQ 80$ ; If EQ, no, finished ;JRK330# ;JRK330;8# MESAG$ MBX1,32.,,<> ;JRK330# ;JRK330I:# MOV R5,-(SP) ; FRECED requires that R5 contain ;JRK330D# MOV I.UCB(R5),R5 ; the address of the UCB for request ;JRK330;# CALL FRECED ; Try to write the CED out to disk ;JRK330 9# MOV (SP)+,R5 ; Restore the I/O packet address ;JRK330e#; ;JRK330H#; See if there are any more CEDs to be processed in the list ;JRK330#; ;JRK330A#80$: MOV (SP)+,R3 ; See if any more packets to process ;JRK330M-# BEQ 100$ ; If EQ, there aren't ;JRK330R)# JMP 10$ ; If NE, there are ;JRK330 #; ;JRK330V#; All transfers are complete. Finish up the I/O passing the packet back to ;JRK330#; the user. ;JRK330r#; ;JRK330M#100$: BICB #CS.REQ,APRD.BASE+H.CSTS; Indicate no need for Phase II ;JRK330 8# MOV R5,R3 ; Use driver packet to finish I/O ;JRK330=# MOV I.UCB(R3),R5 ; Set up UCB address for device ;JRK330(?# MOV I.PRM+P3(R3),R0 ; Get driver completion status ;JRK3300@# MOV I.PRM+P2(R3),R1 ; along with the size of read ;JRK3304# CALL $IOFIN ; Complete the I/O process ;JRK330# CALLR DCRUN ;JRK330I# ;JRK330 # .ENDC ;CHEDFR ;JRK330 $ &% .SBTTL READ INTERNAL I/O COMPLETION4& .SBTTL + IOC - Cache load internal I/O completion';I (; Passed:); R3 -> I/O packet completingt*; I.UCB -> UCB ;DPR026B"+; I.PRM+P3, P4 := Driver status0,; I.AADA -> CED of extent loaded by this I/O(-; E.STAT := Extent status (ES.RIP).; See also routine DECIO/; 0; Returned:0&1;;; N/A - control is passed to DCRUN2; 3; Actions:=4; This routine saves the I/O status, signals I/O completionD=5; to all I/O packets waiting via the attachments list, setsN>6; error disposition (and passes error code) if the operation77; did not complete successfully, and propagates cache 78; execution if necessary (any I/O packets are ready).9;I9IOC: ;JRK330o; ;**-15< MOV I.UCB(R3), R5 ; Get the UCB address ;DPR026o&= CALL MAPPAR ; Map cache partition>,? MOV I.AADA(R3), R2 ; Get the CED addressA@ BITB #ES.RIP, E.STAT(R2) ; Is extent mark as read-in-progress?o!A BNE 5$ ; If NE, sanity checkvB BPTC5$:nMC MESAG$ IOCMSG,22.,,<,> ;JRK330C ;JRK330s8D BICB #ES.RIP, E.STAT(R2) ; No longer read-in-progressE;F MOVB I.PRM+P3(R3), R0 ; Get the driver completion statuso%G TSTB R0 ; Is an error indicated? H BPL00`únümßmæàmçámýfáþfDATA 10$ ; If PL, noI I MESAG$ EMSG,23. ;JRK330BK MOV #APR6.BASE, -(SP) ; Errors are not counted in context ;**-1@L USTAT$ S.RLE ; Read error attempting to load region ;DPR024=M TST (SP)+ ; Remove statistics context from stack ;DPR024MNDO BISB #ES.DEL, E.STAT(R2) ; Mark extent for delete during phase IIP9Q10$: CALL DECIO ; Decrement I/O counts and set CS.REQrR,S CALL CHEDEP ; Deallocate the I/O packetT CALLR DCRUNU o3V .SBTTL + DECIO - Cache completion and scheduling W; X; Passed:"Y; Cache partition mapped in APR6Z;P[; R0 := I/O status"\; R2 -> CED of the extent loaded]; E.ATTL -> First attachmentt ^; A.ANXT -> Next attachment6_; A.IOPA -> Cache I/O packet stalled for this CED"`; I.PRM+P3 := Pending counta;a b; Returned:ec; All registers preserved0d;L e; Actions:9f; Decrement pending I/O counts in attached packets, andD5g; modify disposition if an error has been returned.Th;E/i; All attachment descriptors are deallocated. j;dBk; If any pending I/O count reaches zero, then CS.REQ will be setl; in the cache status.m;dnDECIO: MOV R1, -(SP)o MOV R3, -(SP)p>q BICB #CS.REQ, APRD.BASE+H.CSTS ; Assume NO request phase IIr.s10$: MOV E.ATTL(R2), R3 ; Get an attachment t BEQ 40$ ; End of list if EQu4v MOV A.IOPA(R3), R1 ; Get the I/O packet address4w DECB I.PRM+P3(R1) ; Decrement the pending count$x BNE 20$ ; If NE, still stalled8y BISB #CS.REQ, APRD.BASE+H.CSTS ; Assumption was wrongz20$:%{ TSTB R0 ; Is an error indicated?z2| BPL 30$ ; If PL, no, don't change dispositionA} BIS #CD.ERR, I.PRM+P3(R1) ; Else signal that it goes to $IOFIN.~30$:9 MOV (R3), E.ATTL(R2) ; Unlink the entry before it goesE/€ CALL .DEPAD ; And deallocate the PAD block;/� BR 10$ ; Then try to signal another packet ‚ƒ40$: MOV (SP)+, R3„ MOV (SP)+, R1 … RETURNc† t‡ .SBTTL READ PHASE IIE/ˆ .SBTTL + $DCRII - Data caching read phase IIA‰;A Š; Passed:s"‹; Cache partition mapped in APR6Œ;;�; R1 -> Cache packet$Ž; I.PRM+P3 := Status (set by IOC)-�; I.PRM+P6 -> CED of first extent involvedE �; R5 -> UCB ‘;e ’; Returned:G“;;; N/A - control is passed to either XFER or DCRUN (for next packet) ”;D •; Action:l9–; Should an internal I/O result in an error, the extenth9—; will be marked as in error. All I/O packets attachedR8˜; to that extent at the time of I/O completion will be7™; marked with a disposition of CD.ERR. These packetsa8š; are passed to the phase II routines by DCRUN without8›; further processing. Therefore, they must be handled œ; here. �;t9ž; Basically, this involves detaching this I/O operation 7Ÿ; from any extents it owns, and allowing them to passk: ; to FRECED for deallocation, if possible. In addition,7¡; the failed request is passed directly to the driver ¢; for final processing.£;o ¤$DCRII::6¥ BIT #CD.ERR, I.PRM+P3(R1) ; Driver error indicated?3¦ BEQ XFER ; If EQ, no, proceed to transfer datas§-¨ CALL DETCED ; Detach any outstanding I/Ou6¨ MOV I.UCB(R1),R5 ; Get UCB for this I/O. ;edp047?© MOV KISAR6, -(SP) ; Save APR6 because DUDRV uses it ;DPR022r@© MOV R5, -(SP) ; Save address of UCB, driver clobbers ;DPR0380ª CALL $DRQRQ ; Pass the packet to the driver*ª MOV (SP)+, R5 ; Restore UCB ;DPR038?« MOV (SP)+, KISAR6 ; Restore mapping to cache region ;DPR022I¬0­ CALLR DCRUN ; Then check for another packet® ¯ .SBTTL + XFER - Transfer data°;r ±; Passed:"²; Cache partition mapped in APR6³;d´; R1 -> Cache packet-µ; I.PRM+P6 -> CED of first extent involvedV¶;R ·; Returned:e8¸;;; N/A - control is passed to DCRUN (for next packet)¹;a º; Action:,:»; Phase II is used to perform the actual read transfers.¼;h½; Future enhancements:<¾; Handle the case of multiple extents mapping the request.K¿; If this transfer routine is found to place too much of a load on kernel @À; mode, then code to $FORK can be insert00`o¥nn´cÚµcÛ¶c�·c›’ed between data moves.Á; Â; Note:t@Ã; Disk devices enforce word alignment, and since cache extents8Ä; are also word aligned, data transfers are fast using7Å; the executive's $BLXIO routine. (A single 256 worda9Æ; disk block takes approximately 600us on a PDP-11/70.)rÇ;r;È; Parameter 3 of the user's I/O packet is used as the sum É; of bytes moved.aÊ; !Ë; The stack is used as follows:r;Ì; 2(SP) - "Current" - Size of the "blocks" * 512 (bytes)o:Í; 0(SP) - "blocks" - Size in LBNs of blocks to be movedÎ; Ï; The algorithm is as follows:Ð;r7Ñ; 1. Adjust the user's buffer. NPR devices will havel4Ò; real 22-bit addresses in I.PRM+0 and I.PRM+2.3Ó; $BLXIO expects to see an address doubleword.oÔ;k3Õ; 2. Initialize the count of bytes moved to zero.aÖ; ("moved")×; 4Ø; 3. Determine the amount of data available in the6Ù; initial extent by subtracting the high LBN from8Ú; the user's request LBN. This gives the number of4Û; blocks to move ("blocks"). In bytes, this is5Ü; multipled by 512 ("current"). If "current" is 2Ý; larger than the request (I.PRM+P2), then P2Þ; will replace "current".ß;.6à; 4. The buffer's starting APR address is the user's1á; block number less the LBNL (starting LBN).v5â; This number multiplied by 8 is used as the APRt6ã; bias of the starting address (since all buffers7ä; in cache are APR aligned, the virtual address isuå; only 120000 or 140000).æ;2ç; 5. Setup and call $BLXIO to transfer the data.è; 8é; 6. Add the blocks transferred "blocks" to the user's6ê; starting LBN (P4/P5). Add the number of blocks5ë; "blocks" times 8 to the user's buffer APR biasA3ì; to advance it to the next receiving address.e8í; Add the bytes moved "transfer" to the total bytesî; moved "moved".ï;b9ð; 7. Replace the original CED pointer in the I/O packeta8ñ; to reflect the next CED that may possibly need to;ò; be processed. Unlock the current CED by decrementingn)ó; the pending packet count (E.PCNT). ô;f8õ; 8. Subtract the amount moved "moved" from the user's8ö; byte count (P2). If this number reaches zero (or7÷; less), then the cache operation is complete. Ift&ø; not, then we go back to step 3.ù;vúXFER:f(û MOV I.PRM+P6(R1),R0 ;Get CED address<ü BISB #ES.XIP,E.STAT(R0) ;Indicate transfer is in progress.ý CALL ADJBUF ;Adjust user's buffer addressþ/ÿ MOV R1,R5 ;Reference I/O packet through R5u5 CLR I.PRM+P3(R5) ;Initialize count of bytes movedo3 MOV E.LBNH(R0),R2 ;Get LSP of extent high LBN+1o5 SUB I.PRM+P5(R5),R2 ;Subtract LSP of user requestn; ; Note:o6; We ignore the highest bits here, since this CED is6; definitely connected with this request, and we are5; allowed to borrow from the most significant bits.S4 ; Our result is a single precision count of blocks) ; which are transferrable. ;EDP033d; ;**-5+ MOV R2, R3 ; Duplicate the block countR* ASH #9., R3 ; Convert to a byte bount3 CMP I.PRM+P2(R5),R3 ;User ask to transfer less?B BHIS 20$ ;No if HIS@ MOV I.PRM+P2(R5),R3 ;Else replace extent by user buffer size20$:( MOV I.PRM+P6(R5),R0 ;Get CED address0 MOV R3,-(SP) ;Save the size of bytes to move6 MOV R2,-(SP) ;Save the count of blocks being moved. MOV I.PRM+P5(R5),R1 ;Get user's base block6 SUB E.LBNL(R0),R1 ;Subtract extent base for offset+ ASH #3, R1 ;Make it an APR bias offsetR9  ADD E.PHYA(R0),R1 ;Now R1 is APR bias of cache bufferP!&" MOV R0,-(SP) ;Save the CED address#$$ MOV 4(SP),R0 ;Get the byte count0% MOV #APR5.BASE,R2 ;Setup source displacement.& MOV I.PRM(R5),R3 ;Get destination APR bias4' MOV I.PRM+2(R5),R4 ;Get destination displacement/' CALL EBLXIO ; Transfer the data. ;EDP033gL ;**-36*M MOV (SP)+,R0 ;Get back the CED address'N MOV (SP)+,R1 ;Get the blocks copiedoO0P ADD R1,I.PRM+P5(R5) ;Adjust the starting LBN(Q00` oaoßmæàmçámýfáþfDATA ADC I.PRM+P4(R5) ;(double precision)R.S ASH #3, R1 ;Blocks becomes 32-word blocks,T ADD R1,I.PRM(R5) ;Relocate user's buffer8U MOV E.LNXT(R0),I.PRM+P6(R5) ;Point packet to next CED-V CALL QUPAGE ;Move CED to end of age listiW:X BICB #ES.XIP,E.STAT(R0) ;Transfer operation is complete4Y DECB E.PCNT(R0) ;Unlock this CED for this packet1Z BNE 25$ ; If NE, more pending - don't deletes[A\ BITB #ES.DEL, E.STAT(R0) ; Is this extent marked for deletion? *] BEQ 25$ ; If EQ, no - don't delete it^_ CALL FRECEDb25$: ;**-2 7c ADD (SP),I.PRM+P3(R5) ;Add bytes teleported to totalo;d SUB (SP)+,I.PRM+P2(R5) ;Subtract moved from request sizek*e BHI 20$ ;Go do another extent if moref; Fg; Request is now complete. P3 is the total of the bytes transferredIh; for this request. It must be placed in R1 (R0 will indicate success)I*i; and the packet is forwarded to $IOFIN.j;E$k MOV R5,R3 ;Setup $IOFIN context3l MOV I.UCB(R3),R5 ;R5 -> Disk UCB for completiond5m MOV I.PRM+P3(R3),R1 ;Set the count of bytes moved)n MOV #,R0 ;Indicate successd"o CALL $IOFIN ;Complete the I/Op-q CALLR DCRUN ; R5 already pointing to UCB;r "s .IF DF CHEDBG ;Debugging text,t .SBTTL *** DEBUG *** Module contains data uRMSG: .ASCIZ <15><12>"READ - "(vMMSG: .ASCIZ "MISSED: PARTIAL OVERLAP"wHMSG: .ASCIZ "HIT"xLMSG: .ASCIZ "LOAD"w.yKMSG1: .ASCIZ " - REJECTED: NO POOL FOR PAD"&zKMSG2: .ASCIZ " - REJECTED: TOO BIG"/{KMSG3: .ASCIZ " - REJECTED: NOT ENOUGH CACHE"1?|KMSG4: .ASCIZ " - REJECTED: NO POOL FOR DUPLICATE I/O PACKET"t}%~IOCMSG: .ASCIZ <15><12>"IOC - READ"IEMSG: .ASCIZ " - ERROR"R<MBXMSG: .ASCIZ <15><12>"Multi-extent transfer" ;JRK330KMBX1: .ASCIZ <15><12>" - Deferred extent moved to user buffer" ;JRK330"CDEAMSG: .ASCIZ " - Rejected: Cache being deactivated" ;JRK330ITDFRATT: .ASCIZ <15><12>"Deferred extent attached for Multi-block transfer" ;JRK330€ .EVEN� .ENDC ; .IF DF CHEDBG‚ƒ .ENDC ; .IF DF D$$CHE„ .ENDE"1?|KMSG4: .ASCIZ " - REJECTED: NO POOL FOR DUPLICATE I/O PACKET"t}%~IOCMSG: .ASCIZ <15><12>"IOC - READ"IEMSG: .ASCIZ " - ERROR"R<MBXMSG: .ASCIZ <15><12>"Multi-extent transfer" ;JRK330KMBX1: .ASCIZ <15><12>" - Deferred extent moved to user buffer" ;JRK330"CDEAMSG: .ASCIZ " - Rejected: Cache being deactivated" ;JRK330ITDFRATT: .ASCIZ <15><12>"Deferred extent attached for Multi-block transfer" ;JRK330€ .EVEN� .ENDC ; .IF DF CHEDBG‚ƒ . .IF DF L$$GCL .NLIST .ENABL LC .NLIST BIN,LOC .LIST X; Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 1C; 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (1),; 0001 0 %TITLE 'Logical Name Directives'); 0002 0 MODULE DRPFN (IDENT = 'X1.10'; 0003 0 ) =; 0004 1 BEGIN,; 0005 1 ! COPYRIGHT (c) 1985,1986 BYA; 0006 1 ! DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; 0007 1 !T; 0008 1 ! THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIEDT; 0009 1 ! ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THET; 0010 1 ! INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHERT; 0011 1 ! COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANYT; 0012 1 ! OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY; 0013 1 ! TRANSFERRED. ; 0014 1 !RT; 0015 1 ! THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICET; 0016 1 ! AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT; 0017 1 ! CORPORATION. ; 0018 1 ! T; 0019 1 ! DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITSE; 0020 1 ! SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.L ; 0021 1 ; 0022 1 !++E; 0023 1 ! FACILITY:N&; 0024 1 ! RSX-11M-PLUS executive ; 0025 1 !N; 0026 1 ! ABSTRACT:M; 0027 1 ! Provide the directives that support 00ao¥nn´cÚµcÛ¶c�·c›’the use of logical names,O<; 0028 1 ! particularly in relation to file operations. ; 0029 1 !T; 0030 1 ! ENVIRONMENT:Q; 0031 1 ! Kernel Mode, priority 0, called by directive dispatcher, residentH>; 0032 1 ! in directive common, overmapped I and D spaces ; 0033 1 !T; 0034 1 ! AUTHORs:; 0035 1 ! Tony Lekas"; 0036 1 ! Michael Pettengill ; 0037 1 !1); 0038 1 ! CREATION DATE: 16-JUN-1984 ; 0039 1 !+; 0040 1 ! MODIFIED FOR M-PLUS V 3.0 BY:u ; 0041 1 !f ; 0042 1 ! Paul K. M. Weiss ; 0043 1 ! ; 0044 1 ! Modified by: ; 0045 1 !T.; 0046 1 ! Paul K. M. Weiss 8-Apr-1986 1.09 ; 0047 1 !r3; 0048 1 ! PKW111 - Don't crash on a parse of _ L; 0049 1 ! PKW112 - Don't remove all zeros from version # in FCS defaultG; 0050 1 ! Don't return version # of -1 in FCS default as 177777  t];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 2 H;X1.10 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (1) ; 0051 1 !3.; 0052 1 ! Paul K. M. Weiss 8-Aug-1986 1.10 ; 0053 1 ! H; 0054 1 ! PKW117 - Don't clear FS$QUO when a node is separated for #; 0055 1 ! logical expansion0; 0056 1 !-- ; 0057 1 ; 0058 1 !e; 0059 1 ! INCLUDE FILES: ; 0060 1 !'!; 0061 1 LIBRARY 'BLI:RSX11M';a ; 0062 1 LIBRARY 'BLI:FCS11'; a];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 3AH;X1.10 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (2) ; 0063 1 !l; 0064 1 ! MACROS: ; 0065 1 ! ; 0066 1 MACRO ; 0067 1 !a/; 0068 1 ! Set directive status and exit ; 0069 1 !a); M 0070 1 ERROR_EXIT (error_code) = ; M 0071 1 BEGIN; M 0072 1 LINKAGE#; M 0073 1 error_trap = TRAP;B0; M 0074 1 error_trap (error_code AND %o'377'); 0075 1 END %;e ; 0076 1 ; 0077 1 MACRO1; 0078 1 !4A; 0079 1 ! Move a character string. Advance the pointers.E; 0080 1 !0'; M 0081 1 ch$move (len, ip, op) =A; M 0082 1 BEGIN ; M 0083 1 ; M 0084 1 MAP&; M 0085 1 ip : REF VECTOR [,BYTE],&; M 0086 1 op : REF VECTOR [,BYTE]; ; M 0087 1 ; M 0088 1 IF len NEQU 0; M 0089 1 THEN (; M 0090 1 DECR i FROM len TO 1 DO; M 0091 1 BEGIN4; M 0092 1 op [0] = .ip [0];o; M 0093 1 op = op [1];; M 0094 1 ip = ip [1];; M 0095 1 END; ; M 0096 1 ; 0097 1 END; %; ; 0098 1 ; 0099 1 LITERAL 4; 0100 1 debug_version = 1; ! Variant type ; 0101 1 ; 0102 1 MACRO ; 0103 1 ! E; 0104 1 ! No /VARIANT switch produces the production version.RH; 0105 1 ! /VARIANT produces the debug version with global stuff.; 0106 1 ! "; M 0107 1 global_for_debug =@; 0108 1 %IF %VARIANT EQLU debug_version %THEN GLOBAL %FI %,0; M 0109 1 global_for_debug_own_otherwise =I; 0110 1 %IF %VARIANT EQLU debug_version %THEN GLOBAL %ELSE OWN %FI%, -; M 0111 1 external_debug_forward_else = O; 0112 1 %IF %VARIANT EQLU debug_version %THEN EXTERNAL %ELSE FORWARD %FI%, ; M 0113 1 find_something =,; M 0114 1 %IF %VARIANT EQLU debug_version; M 0115 1 %THEN; M 0116 1 find_test f];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 4gH;X1.10 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (2); M 0117 1 %ELSE!; M 0118 1 find_equivalenceG; 0119 1 %FI%; ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 5HH;X1.10 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (3) ; 0120 1 !N; 0121 1 ! LINKAGES ; 0122 1 !N; 0123 1 LINKAGEnj; 0124 1 $LNxxx_l = JSR (REGISTER = 3, REGISTER = 4, REGISTER = 5) : NOPRESERVE (0, 1, 2, 3, 4, 5),^; 0125 1 common_parse_l = JSR (REGISTER = 3, REGISTER = 4, REGISTER = 5, REGISTER = 0),T; 0126 1 sec_spec_conve00aooßmæàmçámýfáþfDATArt_l = JSR (REGISTER = 3, REGISTER = 4; REGISTER = 3),D; 0127 1 return_ie_xxx_l = JSR : PRESERVE (0, 1, 2, 3, 4, 5),i; 0128 1 lun_assign_l = JSR (REGISTER = 3, REGISTER = 4, REGISTER = 5, REGISTER = 0, REGISTER = 1,II; 0129 1 REGISTER = 2; REGISTER = 1) : NOPRESERVE (0, 1, 2, 3, 4, 5),Rb; 0130 1 find_equivalence_l = JSR (REGISTER = 1, REGISTER = 2; REGISTER = 1, REGISTER = 2),U; 0131 1 fss_l = JSR (REGISTER = 4, REGISTER = 5; REGISTER = 4, REGISTER = 5), 7; 0132 1 expand_filespec_l = JSR (REGISTER = 3),EF; 0133 1 separate_logical_l = JSR (REGISTER = 3, REGISTER = 4),3; 0134 1 ch$classify_l = JSR (REGISTER = 1),To; 0135 1 ch$copy_l = JSR (REGISTER = 1, REGISTER = 2, REGISTER = 3; REGISTER = 3) : NOPRESERVE (0, 1, 2)E; 0136 1 PRESERVE (4, 5), I; 0137 1 save_parse_l = JSR (REGISTER = 1) : NOPRESERVE (0, 1, 2),=`; 0138 1 RAD50_to_ASCII_l = JSR (REGISTER = 1, REGISTER = 2, REGISTER = 3; REGISTER = 2); ; 0139 1 ; 0140 1 !a ; 0141 1 ! TABLE OF CONTENTS: ; 0142 1 ! ; 0143 1 FORWARD ROUTINE(Y; 0144 1 $LNFSS : $LNxxx_l NOVALUE, ! File Specification Scan, called from DRLOG5P; 0145 1 $LNCHN : $LNxxx_l NOVALUE, ! Assign channel, called from DRLOGR; 0146 1 $LNRMS : $LNxxx_l NOVALUE, ! RMS format parse, called from DRLOGR; 0147 1 $LNFCS : $LNxxx_l NOVALUE, ! FCS format parse, called from DRLOG_; 0148 1 common_parse : common_parse_l NOVALUE, ! Parse code common to RMS and FCS parse1V; 0149 1 fss : fss_l NOVALUE, ! Utility routine to parse a file specification`; 0150 1 expand_filespec : expand_filespec_l, ! Expand a file specification with logicalsF; 0151 1 ch$classify : ch$classify_l, ! Classify the characterS; 0152 1 ch$copy : ch$copy_l NOVALUE, ! Copy, upcase, and compress a string ]; 0153 1 convert_parse : NOVALUE, ! Convert addresses in parse block to user virtualpL; 0154 1 merge, ! Merge primary and secondary file specificationsO; 0155 1 save_parse : save_parse_l NOVALUE, ! Save and zero parse blocknS; 0156 1 RAD50_to_ASCII : RAD50_to_ASCII_l NOVALUE; ! Convert RAD50 to ASCIIw ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 6 H;X1.10 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (4)/; 0157 1 EXTERNAL_DEBUG_FORWARD_ELSE ROUTINEaZ; 0158 1 find_equivalence : find_equivalence_l; ! Find equivalence for logical name ; 0159 1 ; 0160 1 ! ; 0161 1 ! EQUATED SYMBOLS: ; 0162 1 !,; 0163 1 LITERALs; 0164 1 true = 1,A; 0165 1 false = 0,; 0166 1 valid = 1,; 0167 1 success = 1,; 0168 1 terminal = 3,6; 0169 1 error = 0,-; 0170 1 bad_node = -1176, ! ER$NOD .; 0171 1 bad_device = -448, ! ER$DEVD; 0172 1 bad_directory = -464, ! ER$DIRD; 0173 1 bad_filename = -752, ! ER$FNMD; 0174 1 bad_char = -1824, ! ER$XTRD; 0175 1 bad_logical = -184, ! ER$BEQD; 0176 1 bad_recursive = -1688, ! ER$TRND; 0177 1 bad_size = -780; ! ER$FTB ; 0178 1 ; 0179 1 LITERAL!>; 0180 1 apr5_v = %o'120000', ! APR 5 virtual address>; 0181 1 apr6_v = %o'140000'; ! APR 6 virtual address ; 0182 1 *; 0183 1 LITERAL ! Character types7; 0184 1 ch_other = 0, ! All other characters ,; 0185 1 ch_lower = 1, ! Lowercase); 0186 1 ch_space = 2, ! SpacesB.; 0187 1 ch_oct = 3, ! Octal Number.; 0188 1 ch_alpha = 4, ! Alphabetic (; 0189 1 ch_comma = 5, ! Comma(; 0190 1 ch_colon = 6, ! Colon1; 0191 1 ch_quote = 7, ! "Double" quoteu<; 0192 1 ch_dir = 8, ! Matching directory bracket=; 0193 1 ch_wild = 9, ! Wildcards, star and percentr'; 0194 1 ch_das00a"o¥nn´cÚµcÛ¶c�·c›’h = 10, ! Dash!%; 0195 1 ch_dot = 11, ! Dot 0; 0196 1 ch_dollar = 12, ! Dollar sign.; 0197 1 ch_under = 13, ! Underscore4; 0198 1 ch_8and9 = 14, ! Non octal digitsA; 0199 1 ch_misc = 15, ! Miscellaneous valid characters0?; 0200 1 ch_valid = 2, ! Minimum valid character type 8; 0201 1 ch_max = 15; ! Maximum character type ; 0202 1 ; 0203 1 !1D; 0204 1 ! These are from FSS$BT in RMSMAC.MLB. They are defined!; 0205 1 ! here for convience.1 ; 0206 1 !t; 0207 1 LITERAL ; 0208 1 FS$VER = %o'1',D; 0209 1 FS$TYP = %o'2',d; 0210 1 FS$NAM = %o'4',8 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 7dH;X1.10 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (4) ; 0211 1 FS$WVE = %o'10', ; 0212 1 FS$WTY = %o'20', ; 0213 1 FS$WNA = %o'40',!; 0214 1 FS$DIR = %o'100',.!; 0215 1 FS$DEV = %o'200', !; 0216 1 FS$NOD = %o'400', "; 0217 1 FS$WDI = %o'1000',"; 0218 1 FS$QUO = %o'2000',"; 0219 1 FS$WCH = %o'4000',#; 0220 1 FS$NDF = %o'10000';a ; 0221 1 ; 0222 1 LITERAL:C; 0223 1 logical_type_none = 0, ! Values for parse_block_f8A; 0224 1 logical_type_filename = 1, ! field logical_type (; 0225 1 logical_type_device = 2,&; 0226 1 logical_type_node = 3; ; 0227 1 ; 0228 1 FIELD0; 0229 1 parse_block_f ='; 0230 1 SET?; 0231 1 fss_status = [0, 0, 16, 0], ! Status of operation 1; 0232 1 flags = [1, 0, 16, 0], ! Flag wordWF; 0233 1 node_len = [2, 0, 16, 0], ! Length of node specificationH; 0234 1 node_addr = [3, 0, 16, 0], ! Address of node specificationJ; 0235 1 device_len = [4, 0, 16, 0], ! Length of device specificationL; 0236 1 device_addr = [5, 0, 16, 0], ! Address of device specificationO; 0237 1 directory_len = [6, 0, 16, 0], ! Length of filename specification Q; 0238 1 directory_addr = [7, 0, 16, 0], ! Address of filename specification N; 0239 1 filename_len = [8, 0, 16, 0], ! Length of filename specificationP; 0240 1 filename_addr = [9, 0, 16, 0], ! Address of filename specificationG; 0241 1 type_len = [10, 0, 16, 0], ! Length of type specification I; 0242 1 type_addr = [11, 0, 16, 0], ! Address of type specification M; 0243 1 version_len = [12, 0, 16, 0], ! Length of version specification O; 0244 1 version_addr = [13, 0, 16, 0], ! Address of version specification,H; 0245 1 trailing_len = [14, 0, 16, 0], ! Length of trailing stringJ; 0246 1 trailing_addr = [15, 0, 16, 0], ! Address of trailing stringK; 0247 1 access_len = [16, 0, 16, 0], ! Length of access specification1M; 0248 1 access_addr = [17, 0, 16, 0], ! Address of access specification,J; 0249 1 logical_type = [18, 0, 8, 0], ! First element which could be; 0250 1 ! a logical ; 0251 1 ! 0 - None ; 0252 1 ! 1 - Filename; 0253 1 ! 2 - Device; 0254 1 ! 3 - Node7; 0255 1 reserved_field = [18, 8, 8, 0] ! Reserved ; 0256 1 ; 0257 1 TES; ; 0258 1 ; 0259 1 FIELD &; 0260 1 logical_descriptor_f =; 0261 1 SETE; 0262 1 length = [0, 0, 16, 0], ! Logical name length in bytesfJ; 0263 1 address_base = [1, 0, 16, 0], ! 32 word block offset of baseV; 0264 1 address_disp_apr6 = [2, 0, 16, 0], ! APR6 displacment of the logical name 2];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 82H;X1.10 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (4)H; 0265 1 table_number = [3, 0, 8, 0], ! Table number to be searched<; 0266 1 block_type = [3, 8, 8, 0], ! Block type number[; 0267 1 matching_tcb_ucb = [4, 0, 16, 0] ! Matching UCB or TCB depending on table typel; 0268 1 TES; ; 0269 1 ; 0270 1 LITERAL,J; 0271 1 file_spec_size = 255, ! Maximum file speci00a*ooßmæàmçámýfáþfDATAfication size E; 0272 1 logical_size = 255, ! Maximum size of one logical H; 0273 1 parse_block_size = 19, ! Parse work area size in words[; 0274 1 logical_descriptor_size = 5, ! Logical name descriptor block size in wordsb<; 0275 1 iteration_max = 10; ! Max iteration count ; 0276 1 ; 0277 1 !0-; 0278 1 ! OWN STORAGE (GLOBAL for DEBUG):l ; 0279 1 !T*; 0280 1 GLOBAL_FOR_DEBUG_OWN_OTHERWISE5; 0281 1 must_have_device, ! Flag for ACHN$eE; 0282 1 cannot_have_node, ! Node is illegal except for RMS <; 0283 1 terminal_logical_flag, ! Flag for terminalF; 0284 1 do_directory_defaulting, ! Directory defaulting flag#; 0285 1 saved_inhibit_mask,iI; 0286 1 init_logical_descriptor : BLOCK [logical_descriptor_size]L; 0287 1 FIELD (logical_descriptor_f), ! Logical name descriptor blockJ; 0288 1 scr_pb : BLOCK[parse_block_size] ! Scratch buffer for fss(; 0289 1 FIELD (parse_block_f), !O; 0290 1 pri_pb : BLOCK [parse_block_size] ! Primary file specification 5; 0291 1 FIELD (parse_block_f), ! parse block2M; 0292 1 merged : REF VECTOR [, BYTE], ! Merged specification buffer O; 0293 1 primary : REF VECTOR [, BYTE], ! Primary specification bufferdd; 0294 1 secondary : VECTOR [file_spec_size, BYTE], ! Work area for secondary input to mergeD; 0295 1 work_1 : VECTOR [file_spec_size, BYTE], ! Work areaC; 0296 1 work_2 : VECTOR [file_spec_size, BYTE]; ! Work areaO ; 0297 1 ; 0298 1 !a"; 0299 1 ! EXTERNAL REFERENCES: ; 0300 1 !l; 0301 1 EXTERNAL2; 0302 1 $SAHDB, ! Saved header mappingM; 0303 1 KISAR5, ! Kernel APR 5 actual data space mapping register,M; 0304 1 KISAR6, ! Kernel APR 6 actual data space mapping registere>; 0305 1 $TONYL, ! Temporary storage for directives:; 0306 1 H_DUIC, ! Default UIC offset in header:; 0307 1 T_UCB, ! TI: UCB address offset in TCB;; 0308 1 T_CTX, ! Task dds context block addressEB; 0309 1 D_UCB, ! Address of the first UCB for this DCB9; 0310 1 D_UCBL, ! Length of UCBs for this DCBA5; 0311 1 D_UNIT, ! Lowest unit on this DCBe5; 0312 1 D_NAM, ! Device name for this DCBa?; 0313 1 U_CTX, ! Terminal dds context block addressr<; 0314 1 U_DCB, ! Address of the DCB for this UCB;; 0315 1 U_CW1, ! UCB first characteristics worda<; 0316 1 DV_REC, ! Record oriented device (U.CW1)=; 0317 1 DV_SDI, ! Single directory device (U.CW1)h7; 0318 1 DV_SQD, ! Sequential device (U.CW1)e h];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 9 H;X1.10 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (4)3; 0319 1 DV_PSE, ! Pseudo device (U.CW1) ;; 0320 1 $FMSK4, ! 4th feature mask word address 9; 0321 1 F4_DVN; ! Decimal version number flagC ; 0322 1 ; 0323 1 LINKAGEWv; 0324 1 $ACHxx_l = JSR (REGISTER = 0, REGISTER = 1; REGISTER = 2) : CLEARSTACK VALUECBIT PRESERVE (0, 3, 4, 5); 0325 1 NOPRESERVE (1, 2),rt; 0326 1 $BLXIO_l = JSR (REGISTER = 0, REGISTER = 1, REGISTER = 2, REGISTER = 3, REGISTER = 4) : PRESERVE (5)(; 0327 1 NOPRESERVE (0, 1, 2, 3, 4),Y; 0328 1 $MPLUN_l = JSR (REGISTER = 3, REGISTER = 4, REGISTER = 5; REGISTER = 2) :rJ; 0329 1 CLEARSTACK VALUECBIT NOPRESERVE (0, 1, 2, 3) PRESERVE (4, 5),Y; 0330 1 $MPLND_l = JSR (REGISTER = 0, REGISTER = 5; REGISTER = 0, REGISTER = 2) : J; 0331 1 CLEARSTACK VALUECBIT NOPRESERVE (0, 2) PRESERVE (1, 3, 4, 5),a; 0332 1 $RELOC_l = JSR (REGISTER = 0; REGISTER = 1, REGISTER = 2) : PRESERVE (0, 3, 4, 5)R; 0333 1 NOPRESERVE (1, 2),)X; 0334 1 $RELOM_l = JSR (REGISTER = 0) : PRESERVE (3, 4, 5) NOPRESERVE (0, 1, 2),S; 0335 1 $TBSRC_l = JSR (REGISTER = 0; REGISTER = 3) : CLEARSTACK VALUECBIT,St; 00a2o¥nn´cÚµcÛ¶c�·c›’ 0336 1 $DCBTA_l = JSR (REGISTER = 0, REGISTER = 3; REGISTER = 3) : PRESERVE (2, 4, 5) NOPRESERVE (0, 1, 3)"; 0337 1 CLEARSTACK VALUECBIT; ; 0338 1 ; 0339 1 EXTERNAL ROUTINEM; 0340 1 $ACHKB : $ACHxx_l, ! Address check byte aligned read/write L; 0341 1 $ACHRO : $ACHxx_l, ! Address check byte aligned read only6; 0342 1 $BLXIO : $BLXIO_l, ! Block transferI; 0343 1 $MPLUN : $MPLUN_l, ! Map logical unit number to device ?; 0344 1 $MPLND : $MPLND_l, ! Follow unit redirectionRD; 0345 1 $RELOC : $RELOC_l, ! Relocate user buffer addressD; 0346 1 $RELOM : $RELOM_l, ! Relocate and map user bufferE; 0347 1 TBSRC_BLI : $TBSRC_l, ! Search logical name tables Q; 0348 1 DCBTA_BLI : $DCBTA_l, ! Binary to octal ASCII routine in DRLOGeH; 0349 1 lun_assign : lun_assign_l; ! Routine to assign the LUN ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 10De;X1.10 File Specification Scan Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (5)r6; 0350 1 %SBTTL 'File Specification Scan Directive' ; 0351 1 W; 0352 1 GLOBAL ROUTINE $LNFSS (dpb_ptr, header_addr, tcb_addr) : $LNxxx_l NOVALUE = ; 0353 1 ; 0354 1 !++! ; 0355 1 !l%; 0356 1 ! FUNCTIONAL DESCRIPTION: ; 0357 1 !lH; 0358 1 ! This routine is called by DRLOG if the FSS subfunction was; 0359 1 ! specified. ; 0360 1 !s ; 0361 1 ! FORMAL PARAMETERS: ; 0362 1 !a; 0363 1 ! dpb_ptr-4; 0364 1 ! Address of the second word of the dpb ; 0365 1 ! ; 0366 1 ! IMPLICIT INPUTS: ; 0367 1 ! ; 0368 1 ! the dpb B; 0369 1 ! The Directive Parameter Block provides all the user*; 0370 1 ! supplied calling parameters ; 0371 1 ! ; 0372 1 ! IMPLICIT OUTPUTS:N ; 0373 1 ! J; 0374 1 ! The directive is performed or an error indicating the reason; 0375 1 ! is returned. ; 0376 1 !; 0377 1 !--M ; 0378 1 ; 0379 2 BEGIN3; 0380 2 ! N; 0381 2 ! The File Specification Scanner DPB has the following format:; 0382 2 ! word contents ; 0383 2 ! ---- --------9/; 0384 2 ! 0 Directive code, DPB length *; 0385 2 ! 1 Subfunction, reserved; 0386 2 ! 2 Reserved39; 0387 2 ! 3 Address of file specification bufferh6; 0388 2 ! 4 Size of file specification buffer+; 0389 2 ! 5 Address of parse block3; 0390 2 ! 6 Size of parse block (in bytes)I; 0391 2 ! L; 0392 2 ! The parse block will zeroed and filled in with descriptorsL; 0393 2 ! for each field present of node, access, device, directory,K; 0394 2 ! filename, type, and version, plus the trailing portion ofnO; 0395 2 ! the string if any. The flags word will be have a bit set forsJ; 0396 2 ! each of the components present in the format for the RMS; 0397 2 ! NAM block.; 0398 2 ! !; 0399 2 ! In more detail.o; 0400 2 ! L; 0401 2 ! NODE: The node includes all nodes if poor man's routing isH; 0402 2 ! is being used. The initial node name is terminatedF; 0403 2 ! by the access control string address, even if there ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 11ee;X1.10 File Specification Scan Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (5)AG; 0404 2 ! is none. (In this case the access control length is ; 0405 2 ! zero.) ; 0406 2 !u,; 0407 2 ! FS$NOD is set if present.; 0408 2 !iN; 0409 2 ! ACCESS The access control string is the entire quoted stringS; 0410 2 ! CONTROL: terminated by double colon. As noted above, the address-?; 0411 2 ! of the access control serves a dual purpose.e; 0412 2 ! P; 0413 2 ! DEVICE: The device is the string terminated by a single colon.; 0414 2 ! ,; 0415 2 ! 00a:ooßmæàmçámýfáþfDATA FS$DEV is set if present.; 0416 2 !zO; 0417 2 ! DIRECTORY:The directory is the string bounded by either [] or8B; 0418 2 ! <> and includes a rather loosely checked set ofJ; 0419 2 ! characters valid in a directory specification includingL; 0420 2 ! wildcards, hierarchies, etc. The syntax of the directoryE; 0421 2 ! must be checked for validity in the context of the :; 0422 2 ! operation, for example, network access.; 0423 2 !5F; 0424 2 ! FS$DIR is set if present. In addition, if wildcardsK; 0425 2 ! are found, FS$WDI is also set. (Wildcards are "%", "*", ; 0426 2 ! and "...".e; 0427 2 !eQ; 0428 2 ! FILENAME: The filename is the string terminated by ".", ";", or 5; 0429 2 ! the end of the file specification.a; 0430 2 !G; 0431 2 ! FS$NAM is set if present. In addition, if wildcards I; 0432 2 ! are found, FS$WNA is also set. (Wildcards are "%" and5; 0433 2 ! "*".); 0434 2 !.>; 0435 2 ! If FS$QUO is set, the file specification isH; 0436 2 ! a quoted string. This is either a "foreign" filespecE; 0437 2 ! if being passed to another system (eg. via DAP) oriD; 0438 2 ! an ANSI filespec. The the case of the ANSI file,H; 0439 2 ! a version is allowed, but no type field. In the caseH; 0440 2 ! of a network operation, it's ambiguous, but a versionE; 0441 2 ! will be allowed but not defaulted. (Actually this4E; 0442 2 ! doesn't relate to FSS but this seems to be as goodo1; 0443 2 ! a place to mention it as any.)e; 0444 2 !iL; 0445 2 ! TYPE: The type is the string terminated by a "." or ";" orG; 0446 2 ! the end of the file specification. A leading "." is 1; 0447 2 ! always included in the string.f; 0448 2 !G; 0449 2 ! FS$TYP is set if present. In addition, if wildcardsI; 0450 2 ! are found, FS$WTY is also set. (Wildcards are "%" and ; 0451 2 ! "*".); 0452 2 ! F; 0453 2 ! If the filename is a quoted string, then this field ; 0454 2 ! must be null.; 0455 2 !eN; 0456 2 ! VERSION: The version is the field including a leading "." orG; 0457 2 ! ";" terminated by the end of the string. The stringd ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 12 e;X1.10 File Specification Scan Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (5) G; 0458 2 ! is limited to an optional leading "-" and the digitsd3; 0459 2 ! zero to nine, or a "*" wildcard.n; 0460 2 ! H; 0461 2 ! FS$VER is set if present. In addition, if a wildcard0; 0462 2 ! is found, FS$WVE is also set.; 0463 2 !gS; 0464 2 ! TRAILING: The unparsed portion of the initial string is that partiD; 0465 2 ! of the input that was successfully and completelyD; 0466 2 ! parsed. If an error is detected in the directoryG; 0467 2 ! specification, for example, the trailing string will A; 0468 2 ! include the erroneous directory specification. ; 0469 2 ! E; 0470 2 ! This should allow the used of FSS$ in command line K; 0471 2 ! parsing. Any character not part of a file specificationIE; 0472 2 ! terminates the scan and results in all information 2; 0473 2 ! obtained so far to be returned.; 0474 2 ! E; 0475 2 ! The field trailing_addr should always be filled in C; 0476 2 ! even when the length is zero. This is different B; 0477 2 ! from the norm, but is an exception for much the2; 0478 2 ! same reason as for access_addr.; 0479 2 !aP; 0480 2 ! The parse block can be truncated by the user if not all fieldsS; 0481 2 ! are desired, although the organization isn't well setup for that.3Q; 0482 2 ! The directive can also be enhanced by addi00aBo¥nn´cÚµcÛ¶c�·c›’ng fields on the end.T@; 0483 2 ! Does this code return an error...it shouldn't.; 0484 2 !lQ; 0485 2 ! As coded, the parse block is zeroed and then filled in with theeO; 0486 2 ! data from the specified string. This block is then relocated B; 0487 2 ! to the user string virtual address and returned.; 0488 2 !l ; 0489 2 ; 0490 2 MAPa@; 0491 2 dpb_ptr : REF VECTOR; ! Treat the DPB as a vector ; 0492 2 ; 0493 2 LOCALc; 0494 2 status,'; 0495 2 b_len, ! Buffer lengtho); 0496 2 b_addr, ! Buffer address4+; 0497 2 b_mapping, ! Buffer mappinga3; 0498 2 p : REF VECTOR; ! Temporary pointer ; 0499 2 =; 0500 2 b_addr = .dpb_ptr [2]; ! Get buffer address;; 0501 2 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP);r;; 0502 2 b_len = .dpb_ptr [3]; ! Get buffer lengthU; 0503 2 IF .b_len EQLU 0 OR .b_len GTRU 1024*8 - 64 THEN ERROR_EXIT (IE_IBS);3 ; 0504 2 ; 0505 2 !uQ; 0506 2 ! Address check, relocate, and map the user buffer. No operationrO; 0507 2 ! will unmap the user buffer for the duration. The user string H; 0508 2 ! is then parsed and the output parse block is returned.; 0509 2 !d]; 0510 2 IF $ACHRO (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read accessd ; 0511 2  e];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 13Ie;X1.10 File Specification Scan Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (5) 9; 0512 2 p = $RELOM (.b_addr); ! Map user buffer ?; 0513 2 fss (.p, .b_len); ! Parse file specificationtb; 0514 2 convert_parse (scr_pb, .p, .b_addr); ! Convert parse block addresses to user mode ; 0515 2 =; 0516 2 b_addr = .dpb_ptr [4]; ! Get buffer address ;; 0517 2 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP);1;; 0518 2 b_len = .dpb_ptr [5]; ! Get buffer lengthi:; 0519 2 IF .b_len EQLU 0 THEN ERROR_EXIT (IE_IBS); ; 0520 2 ; 0521 2 !2L; 0522 2 ! Address check and relocate the user buffer. Then copy the$; 0523 2 ! parse block to it.; 0524 2 !oc; 0525 2 IF $ACHKB (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read/write access5 ; 0526 2 J; 0527 2 $RELOC (.b_addr; b_mapping, b_addr); ! Relocte user bufferk; 0528 2 $BLXIO (MINU (parse_block_size*2, .b_len), .kisar5, scr_pb, .b_mapping, .b_addr); ! Move itF; 0529 2 RETURN; 0530 1 END; .NLIST .LIST BIN,LOC .LIST .IFTF ;L$$GCL% .TITLE DRPFN Logical Name Directivese .IDENT /X1.10/5 .IFT ;L$$GCL  .PSECT $OWN$, D MUST.HAVE.DEVICE:  .BLKW 1CANNOT.HAVE.NODE:  .BLKW 1TERMINAL.LOGICAL.FLAG: .BLKW 1DO.DIRECTORY.DEFAULTING: .BLKW 1SAVED.INHIBIT.MASK:d .BLKW 1INIT.LOGICAL.DESCRIPTOR: .BLKW 5SCR.PB: .BLKW 23PRI.PB: .BLKW 23MERGED: .BLKW 1lPRIMARY:.BLKW 1_ SECONDARY: .BLKB 377 .EVENWORK.1: .BLKB 377  .EVENWORK.2: .BLKB 377N& .GLOBL $SAHDB, KISAR5, KISAR6, $TONYL+ .GLOBL H.DUIC, T.UCB, T.CTX, D.UCB, D.UCBLr i];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 14We;X1.10 File Specification Scan Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (5)* .GLOBL D.UNIT, D.NAM, U.CTX, U.DCB, U.CW1& .GLOBL DV.REC, DV.SDI, DV.SQD, DV.PSE& .GLOBL $FMSK4, F4.DVN, $ACHKB, $ACHRO& .GLOBL $BLXIO, $MPLUN, $MPLND, $RELOC0 .GLOBL $RELOM, TBSRC.BLI, DCBTA.BLI, LUN.ASSIGN0 .SBTTL $LNFSS File Specification Scan Directive .PSECT $CODE$, RO  .NLISTU .ENABL LSBP .LIST$LNFSS::TST -(SP) ; 03526- MOV 4(R3),-(SP) ; *(DPB.PTR),B.ADDR 0500W BNE 1$ ; 0501a TRAP 236i/1$: MOV 6(R3),2(SP) ; *(DPB.PTR),B.LEN 0502D BEQ 2$ ; 0503. CMP 2(SP),#17700 ; B.LEN,*C BLOS 3$ 2$: TRAP 247%3$: MOV (SP),R0 ; B.ADDR,* 05104 MOV 2(SP),R1 ; B.LEN,*. JSR PC,$ACHRO BHIS 4$ TRAP 00aJooßmæàmçámýfáþfDATA236%4$: MOV (SP),R0 ; B.ADDR,* 0512U JSR PC,$RELOM MOV R0,R1 ; *,Pc MOV R1,R4 ; P,* 0513 MOV 2(SP),R5 ; B.LEN,*U JSR PC,FSSP MOV #SCR.PB,-(SP) ; 0514  MOV R1,-(SP) ; P,*S MOV 4(SP),-(SP) ; B.ADDR,*W JSR PC,CONVERT.PARSEa. MOV 10(R3),6(SP) ; *(DPB.PTR),B.ADDR 0516 BNE 5$ ; 0517 TRAP 236015$: MOV 12(R3),10(SP) ; *(DPB.PTR),B.LEN 0518R BNE 6$ ; 0519 TRAP 247,%6$: MOV 6(SP),R0 ; B.ADDR,* 0525 MOV 10(SP),R1 ; B.LEN,* JSR PC,$ACHKB BHIS 7$ TRAP 236,%7$: MOV 6(SP),R0 ; B.ADDR,* 0527  JSR PC,$RELOC MOV R1,R3 MOV R2,6(SP)V" MOV 10(SP),R0 ; B.LEN,* 0528 CMP R0,#46B S];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 15ae;X1.10 File Specification Scan Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (5)( BLOS 8$ MOV #46,R0 8$: MOV KISAR5,R1; MOV #SCR.PB,R2  MOV 6(SP),R4 ; B.ADDR,* JSR PC,$BLXIO ADD #12,SP ; 0352* RTS PC,7; Routine Size: 80 words, Routine Base: $CODE$ + 0000 .; Maximum stack depth per invocation: 7 words .NLISTV .DSABL LSB; .NLIST BIN,LOC .LIST S];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 16a];X1.10 Assign Channel Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (6)5-; 0531 1 %SBTTL 'Assign Channel Directive'5 ; 0532 1 W; 0533 1 GLOBAL ROUTINE $LNCHN (dpb_ptr, header_addr, tcb_addr) : $LNxxx_l NOVALUE =, ; 0534 1 ; 0535 1 !++R ; 0536 1 !C%; 0537 1 ! FUNCTIONAL DESCRIPTION: ; 0538 1 !wH; 0539 1 ! This routine is called by DRLOG if the CHN subfunction was; 0540 1 ! specified. ; 0541 1 !8C; 0542 1 ! Assign channel does all of the processing of the filerF; 0543 1 ! specification that is required to find the actual device;; 0544 1 ! name and then assigns the LUN to that device. ; 0545 1 !B ; 0546 1 ! FORMAL PARAMETERS: ; 0547 1 !); 0548 1 ! dpb_ptr4; 0549 1 ! Address of the second word of the dpb ; 0550 1 !N; 0551 1 ! IMPLICIT INPUTS: ; 0552 1 ! ; 0553 1 ! the dpbbB; 0554 1 ! The Directive Parameter Block provides all the user*; 0555 1 ! supplied calling parameters ; 0556 1 !e0; 0557 1 ! Assign Channel (ACHN$) DPB Format: ; 0558 1 !t/; 0559 1 ! WD. 00 -- DIC(207.),DPB Size (5.)t5; 0560 1 ! WD. 01 -- Subfunction code (6),Reserved '; 0561 1 ! WD. 02 -- LUN, Table mask 5; 0562 1 ! WD. 03 -- Address of file specification 2; 0563 1 ! WD. 04 -- Size of file specification ; 0564 1 !I; 0565 1 ! IMPLICIT OUTPUTS: ; 0566 1 ! J; 0567 1 ! The directive is performed or an error indicating the reason; 0568 1 ! is returned. ; 0569 1 ! ; 0570 1 !-- ; 0571 1 ; 0572 2 BEGIN; 0573 2 ! B; 0574 2 ! This directive uses the same code as the RMS and@; 0575 2 ! FCS format parse routines. It only passes the!; 0576 2 ! primary string.d; 0577 2 !f ; 0578 2 ; 0579 2 MAPi@; 0580 2 dpb_ptr : REF VECTOR; ! Treat the DPB as a vector ; 0581 2 ; 0582 2 OWN B; 0583 2 temp_dpb : VECTOR [12]; ! Temp dpb for common parse ; 0584 2  t];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 17 ];X1.10 Assign Channel Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (6)o; 0585 2 LOCALo'; 0586 2 temp_dpb_ptr : REF VECTOR; ; 0587 2 ; 0588 2 ! P; 0589 2 ! Define the routine to convert the users default string and putT; 0590 2 ! it into the secondary string. For ACHN there isn't one so we just!; 0591 2 ! put a blank in. ; 0592 2 !PN; 0593 2 ROUTINE achn_convert (b_addr, b_len; p) : sec_spec_convert_l =; 0594 3 BEGINi3; 0595 3 secondary [0] = %C' '; ! No filespecC); 0596 3 RETURN valid; ! Return ok ; 0597 2 END; .NLISTp .LIST BIN,LOC .00aRo¥nn´cÚµcÛ¶c�·c›’LIST .PSECT $OWN$, D  .EVEN TEMP.DPB: .BLKW 14t- .SBTTL ACHN.CONVERT Assign Channel Directivep .PSECT $CODE$, RO  .NLIST .ENABL LSBi .LIST ACHN.CONVERT:' MOVB #40,SECONDARY ; 0595 MOV #1,R0 ; 0594 RTS PC ; 0593 6; Routine Size: 6 words, Routine Base: $CODE$ + 0240.; Maximum stack depth per invocation: 0 words .NLISTy .DSABL LSB  .NLIST BIN,LOC .LIST ; 0598 2 ; 0599 2 ! ); 0600 2 ! Initialize the fake dpbC; 0601 2 !C@; 0602 2 temp_dpb_ptr = temp_dpb [0]; ! Init the pointer ; 0603 2 M; 0604 2 temp_dpb_ptr [0] = .dpb_ptr [0]; ! Modifier for common parseNH; 0605 2 temp_dpb_ptr = temp_dpb_ptr [1]; ! Advance the pointers.; 0606 2 dpb_ptr = dpb_ptr [1]; ! ... ; 0607 2 Q; 0608 2 temp_dpb_ptr [0] = .dpb_ptr [0]; ! LUN and mask for common parse  ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 18t];X1.10 Assign Channel Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (6)tH; 0609 2 temp_dpb_ptr = temp_dpb_ptr [1]; ! Advance the pointers.; 0610 2 dpb_ptr = dpb_ptr [1]; ! ... ; 0611 2 V; 0612 2 temp_dpb_ptr [0] = .dpb_ptr [0]; ! File spec address for common parseH; 0613 2 temp_dpb_ptr = temp_dpb_ptr [1]; ! Advance the pointers.; 0614 2 dpb_ptr = dpb_ptr [1]; ! ... ; 0615 2 U; 0616 2 temp_dpb_ptr [0] = .dpb_ptr [0]; ! File spec length for common parseeH; 0617 2 temp_dpb_ptr = temp_dpb_ptr [1]; ! Advance the pointers.; 0618 2 dpb_ptr = dpb_ptr [1]; ! ... ; 0619 2 ; 0620 2 ! ); 0621 2 ! Zero the unused fields. ; 0622 2 !e%; 0623 2 DECR i FROM 8 TO 1 DOs; 0624 3 BEGIN5; 0625 3 temp_dpb_ptr [0] = 0; ! Zero the field1C; 0626 3 temp_dpb_ptr = temp_dpb_ptr [1]; ! Advance the pointer!; 0627 2 END; ; 0628 2 ; 0629 2 !=; 0630 2 ! Do the parse; 0631 2 !eS; 0632 2 do_directory_defaulting = false; ! No directory defaulting for ACHN H; 0633 2 must_have_device = true; ! Must have a device for ACHN$I; 0634 2 cannot_have_node = true; ! Node specification is illegal O; 0635 2 common_parse (temp_dpb, .header_addr, .tcb_addr, achn_convert); ; 0636 2 RETURN;6; 0637 1 END; .NLISTp .LIST BIN,LOC .LIST' .SBTTL $LNCHN Assign Channel Directive  .NLIST .ENABL LSB6 .LIST2$LNCHN::MOV #TEMP.DPB,R0 ; *,TEMP.DPB.PTR 06020 MOV (R3)+,(R0)+ ; DPB.PTR,TEMP.DPB.PTR 06040 MOV (R3)+,(R0)+ ; DPB.PTR,TEMP.DPB.PTR 06080 MOV (R3)+,(R0)+ ; DPB.PTR,TEMP.DPB.PTR 06120 MOV (R3)+,(R0)+ ; DPB.PTR,TEMP.DPB.PTR 0616 MOV #10,R1 ; *,I 0623 '1$: CLR (R0)+ ; TEMP.DPB.PTR 0625r SOB R1,1$ ; I,* 0623( CLR DO.DIRECTORY.DEFAULTING ; 0632$ MOV #1,MUST.HAVE.DEVICE ; 0633$ MOV #1,CANNOT.HAVE.NODE ; 0634 MOV #TEMP.DPB,R3 ; 0635 MOV #ACHN.CONVERT,R0M JSR PC,COMMON.PARSE RTS PC ; 0533+7; Routine Size: 25 words, Routine Base: $CODE$ + 0254; B];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 19;];X1.10 Assign Channel Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (6) -; Maximum stack depth per invocation: 1 wordE .NLISTA .DSABL LSB  .NLIST BIN,LOCT .LIST ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 20E_;X1.10 RMS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (7) /; 0638 1 %SBTTL 'RMS Format Parse Directive' ; 0639 1 W; 0640 1 GLOBAL ROUTINE $LNRMS (dpb_ptr, header_addr, tcb_addr) : $LNxxx_l NOVALUE =u ; 0641 1 ; 0642 1 !++P ; 0643 1 !2%; 0644 1 ! FUNCTIONAL DESCRIPTION:o ; 0645 1 !EH; 0646 1 ! This routine is called by DRLOG if the RMS subfunction was; 0647 1 ! specified. ; 0648 1 ! ; 0649 1 ! FORMAL PARAMETERS: ; 065000aZooßmæàmçámýfáþfDATA 1 !M; 0651 1 ! dpb_ptre4; 0652 1 ! Address of the second word of the dpb ; 0653 1 ! ; 0654 1 ! IMPLICIT INPUTS: ; 0655 1 ! ; 0656 1 ! the dpb B; 0657 1 ! The Directive Parameter Block provides all the user*; 0658 1 ! supplied calling parameters ; 0659 1 ! ; 0660 1 ! IMPLICIT OUTPUTS:N ; 0661 1 ! J; 0662 1 ! The directive is performed or an error indicating the reason; 0663 1 ! is returned. ; 0664 1 !; 0665 1 !--M ; 0666 1 ; 0667 2 BEGIN6; 0668 2 ! D; 0669 2 ! The RMS format parse DPB has the following format:; 0670 2 ! word contents ; 0671 2 ! ---- -------- /; 0672 2 ! 0 Directive code, DPB lengtho*; 0673 2 ! 1 Subfunction, Modifier$; 0674 2 ! 2 LUN, Table maskE; 0675 2 ! 3 Address of the primary file specification buffertK; 0676 2 ! 4 Size of the primary file specification buffer in bytes.G; 0677 2 ! 5 Address of the resultant file specification bufferM; 0678 2 ! 6 Size of the resultant file specification buffer in bytesgK; 0679 2 ! 7 Address of a word to receive the resultant string size/; 0680 2 ! 8 Address of the parse block5; 0681 2 ! 9 Size of the parse block in bytes E; 0682 2 ! 10 Address of the default file specification bufferiK; 0683 2 ! 11 Size of the default file specification buffer in bytesf; 0684 2 !yS; 0685 2 ! The basic operation of the FCS and RMS format parse6S; 0686 2 ! subfunctions is the same. The only difference consists of S; 0687 2 ! differences in the formats of the input and output parameters.8S; 0688 2 ! Both formats exists in order to minimize the amount of code thatG; 0689 2 ! must be added to the RMS and FCS access methods code. ; 0690 2 !S3; 0691 2 ! The follow operations occur:f ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 21 _;X1.10 RMS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (7) ; 0692 2 !n6; 0693 2 ! 1. First process the input strings:; 0694 2 ! S; 0695 2 ! 1. The primary string is copied, compressed, and upcased A; 0696 2 ! from the users buffer to a work buffer. ; 0697 2 ! @; 0698 2 ! 2. The resulting string is parsed. (FSS); 0699 2 !-;; 0700 2 ! 3. The resulting string is Expanded..; 0701 2 !eS; 0702 2 ! 4. The resulting value for logical type, (none, filename, 2; 0703 2 ! device, node), is saved.; 0704 2 !6S; 0705 2 ! 5. The secondary string is copied, compressed, and upcasedaS; 0706 2 ! from the users buffer to a work buffer. This is somewhat L; 0707 2 ! more involved for the FCS format of the directive.; 0708 2 ! @; 0709 2 ! 6. The resulting string is parsed. (FSS); 0710 2 !Q; 0711 2 ! 7. The processed primary and secondary strings are merged. ; 0712 2 ! V; 0713 2 ! 8. If the resulting value for logical type is greater than theS; 0714 2 ! saved value for the processed primary string then expande,; 0715 2 ! the merged string.; 0716 2 ! S; 0717 2 ! 9. If a node specification is present then we are all done. 3; 0718 2 ! Return the output values.d; 0719 2 ! ; 0720 2 ! 3; 0721 2 ! 2. Now do the device defaulting:t; 0722 2 !K; 0723 2 ! 3. The previous merged string is now the primary string.c; 0724 2 !tS; 0725 2 ! 4. Save the flags word from the parse block. The flags returnednS; 0726 2 ! indicate what was supplied from the input strings, not what 9; 0727 2 ! is supplied by the system defaults.a; 0728 2 ! -; 0729 2 ! 5. If the00abo¥nn´cÚµcÛ¶c�·c›’ LUN is assigned:d; 0730 2 ! S; 0731 2 ! 1. Build a secondary string containing the device 5; 0732 2 ! specification from the LUN.i; 0733 2 !rS; 0734 2 ! 2. Also indicate that the LUN must not be assigned at therS; 0735 2 ! end of the directive. Reassigning the LUN will result ino1; 0736 2 ! an IO.KIL being issued. ; 0737 2 !eS; 0738 2 ! 3. Merge the primary and the secondary strings. Do notdS; 0739 2 ! expand the merged string. We know that we have a reali&; 0740 2 ! device name.; 0741 2 !o; 0742 2 ! 1; 0743 2 ! 6. If the LUN is not assigned:d; 0744 2 !m;; 0745 2 ! 1. Put SY: in the secondary string.  t];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 22s_;X1.10 RMS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (7)n; 0746 2 !7B; 0747 2 ! 2. Merge the primary and secondary strings.; 0748 2 !03; 0749 2 ! 3. Expand the merged string. ; 0750 2 ! ; 0751 2 ! S; 0752 2 ! 7. If a node specification is present then we are all done.i/; 0753 2 ! Return the output values.e; 0754 2 !uK; 0755 2 ! 8. The previous merged string is now the primary string.r; 0756 2 !uS; 0757 2 ! 9. If there is a non null, ([], <>), directory specification in7S; 0758 2 ! the primary string then go on to assign the LUN if7"; 0759 2 ! appropriate.; 0760 2 !0,; 0761 2 ! 10. Directory defaulting:; 0762 2 !pT; 0763 2 ! 1. If there is a non null default directory string then putP; 0764 2 ! the default directory string in the secondary string.; 0765 2 !rT; 0766 2 ! 2. Otherwise build a directory specification in theA; 0767 2 ! secondary string from the default UIC. ; 0768 2 !oT; 0769 2 ! 3. Merge the primary and secondary strings and make the5; 0770 2 ! result the primary string. ; 0771 2 ! ; 0772 2 ! T; 0773 2 ! 11. If there is a LUN assigment and if that LUN assigment wasT; 0774 2 ! used as the default device then do not assign the LUN.T; 0775 2 ! Otherwise use the device portion of the primary string to&; 0776 2 ! assign the LUN.; 0777 2 !7T; 0778 2 ! 12. Return the primary string to the expanded string buffer.T; 0779 2 ! Return the parse block for the primary string with the saved9; 0780 2 ! flags to the users parse block.a; 0781 2 !i ; 0782 2 ! 13. All done.; 0783 2 !u ; 0784 2 ; 0785 2 !eP; 0786 2 ! Define the routine to convert the users default string and putS; 0787 2 ! it into the secondary string. For RMS we just copy, compress and ; 0788 2 ! upcase it.; 0789 2 !tT; 0790 2 ROUTINE rms_convert (b_addr, b_len; p) : sec_spec_convert_l NOVALUE=; 0791 3 BEGINnD; 0792 3 IF .b_len GTRU file_spec_size THEN ERROR_EXIT (IE_IBS);9; 0793 3 ch$copy (.b_len, .b_addr, secondary [0]; p);.; 0794 2 END; .NLIST  .LIST BIN,LOC .LIST. .SBTTL RMS.CONVERT RMS Format Parse Directive s];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 23p_;X1.10 RMS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (7)o .NLISTd .ENABL LSB: .LIST RMS.CONVERT: JSR R1,$SAVE2 ; 0790n MOV R3,R2 ; *,B.ADDR! CMP R4,#377 ; B.LEN,* 0792( BLOS 1$ TRAP 247 "1$: MOV R4,R1 ; B.LEN,* 0793 MOV #SECONDARY,R3 JSR PC,CH$COPYL RTS PC ; 0790.7; Routine Size: 13 words, Routine Base: $CODE$ + 0336.; Maximum stack depth per invo00ajooßmæàmçámýfáþfDATAcation: 5 words .NLISTA .DSABL LSB  .NLIST BIN,LOC  .LIST ; 0795 2 ; 0796 2 !-; 0797 2 ! Do the parse; 0798 2 ! Q; 0799 2 do_directory_defaulting = true; ! Do directory defaulting for RMSQ; 0800 2 must_have_device = false; ! Don't need explicit device for $PRMSF; 0801 2 cannot_have_node = false; ! RMS likes nodes just fineN; 0802 2 common_parse (.dpb_ptr, .header_addr, .tcb_addr, rms_convert);; 0803 1 END; .NLIST  .LIST BIN,LOC .LIST) .SBTTL $LNRMS RMS Format Parse Directive. .NLIST .ENABL LSB .LIST1$LNRMS::MOV #1,DO.DIRECTORY.DEFAULTING ; 07998! CLR MUST.HAVE.DEVICE ; 0800c! CLR CANNOT.HAVE.NODE ; 0801o! MOV #RMS.CONVERT,R0 ; 0802  JSR PC,COMMON.PARSE RTS PC ; 0640x7; Routine Size: 12 words, Routine Base: $CODE$ + 0370=-; Maximum stack depth per invocation: 1 word  .NLISTm .DSABL LSBb .NLIST BIN,LOCr .LIST s];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 24s_;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (8)/; 0804 1 %SBTTL 'FCS Format Parse Directive'E ; 0805 1 W; 0806 1 GLOBAL ROUTINE $LNFCS (dpb_ptr, header_addr, tcb_addr) : $LNxxx_l NOVALUE = ; 0807 1 ; 0808 1 !++i ; 0809 1 !$%; 0810 1 ! FUNCTIONAL DESCRIPTION:o ; 0811 1 ! H; 0812 1 ! This routine is called by DRLOG if the FCS subfunction was; 0813 1 ! specified. ; 0814 1 ! ; 0815 1 ! FORMAL PARAMETERS: ; 0816 1 !C; 0817 1 ! dpb_ptre4; 0818 1 ! Address of the second word of the dpb ; 0819 1 ! ; 0820 1 ! IMPLICIT INPUTS: ; 0821 1 ! ; 0822 1 ! the dpb B; 0823 1 ! The Directive Parameter Block provides all the user*; 0824 1 ! supplied calling parameters ; 0825 1 ! ; 0826 1 ! IMPLICIT OUTPUTS:N ; 0827 1 ! J; 0828 1 ! The directive is performed or an error indicating the reason; 0829 1 ! is returned. ; 0830 1 !; 0831 1 !--M ; 0832 1 ; 0833 2 BEGIN8; 0834 2 ! D; 0835 2 ! The FCS format parse DPB has the following format:; 0836 2 ! word contents ; 0837 2 ! ---- -------- /; 0838 2 ! 0 Directive code, DPB lengtho*; 0839 2 ! 1 Subfunction, Modifier$; 0840 2 ! 2 LUN, Table maskE; 0841 2 ! 3 Address of the primary file specification buffertK; 0842 2 ! 4 Size of the primary file specification buffer in bytes.G; 0843 2 ! 5 Address of the resultant file specification bufferM; 0844 2 ! 6 Size of the resultant file specification buffer in bytesgK; 0845 2 ! 7 Address of a word to receive the resultant string size/; 0846 2 ! 8 Address of the parse block5; 0847 2 ! 9 Size of the parse block in bytes 6; 0848 2 ! 10 Address of the default name block3; 0849 2 ! 11 Size of the default name block ; 0850 2 !eS; 0851 2 ! The basic operation of the FCS and RMS format parseuS; 0852 2 ! subfunctions is the same. The only difference consists ofcS; 0853 2 ! differences in the formats of the input and output parameters.uS; 0854 2 ! Both formats exists in order to minimize the amount of code that G; 0855 2 ! must be added to the RMS and FCS access methods code.h; 0856 2 !k/; 0857 2 ! See $LNRMS for a discription.l ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 25m_;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (8); 0858 2 !f n];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 26s_;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (9)F; 0859 2 !eP; 0860 2 ! Define the routine to convert the users default string and put/; 0861 2 ! it into the secondary string.1; 086200aro¥nn´cÚµcÛ¶c�·c›’ 2 !4U; 0863 2 ROUTINE fcs_convert (b_addr, b_len; p) : sec_spec_convert_l NOVALUE =U; 0864 3 BEGIN2; 0865 3 MACRO ; 0866 3 ; 0867 3 !L; 0868 3 ! Insert a character into a string. Increment the pointer.; 0869 3 !$; M 0870 3 ch$insert (value) =; M 0871 3 BEGINN; M 0872 3 p [0] = value;; M 0873 3 p = p [1];; M 0874 3 ENDt; 0875 3 %; ; 0876 3 ; 0877 3 MAP); 0878 3 p : REF VECTOR [ ,BYTE]; ; 0879 3 ; 0880 3 BIND-; 0881 3 name_block = .b_addr : NAM$;e ; 0882 3 ; 0883 3 !/; 0884 3 ! It should be the full name block ; 0885 3 !@; 0886 3 IF .b_len NEQU nam$size*2 THEN ERROR_EXIT (IE_IBS);3; 0887 3 p = secondary [0]; ! Init the pointer ; 0888 3 ; 0889 3 !D; 0890 3 ! Move the device name and unit number into the string.; 0891 3 !+; 0892 3 IF .name_block [N_DVNM] NEQU 0 ; 0893 3 THEN ; 0894 4 BEGIN ; 0895 4 ; 0896 4 !; 0897 4 ! Do the name; 0898 4 !N; 0899 4 ch$insert (.(name_block [N_DVNM])<0,8>); ! Get the first charO; 0900 4 ch$insert (.(name_block [N_DVNM])<8,8>); ! Get the second charI ; 0901 4 ; 0902 4 !6; 0903 4 ! Do the unit number zero suppressed.; 0904 4 !O; 0905 4 DCBTA_BLI (.name_block [N_UNIT], .p; p); ! Get the unit number ; 0906 4 ; 0907 4 !(; 0908 4 ! Insert the trailing :; 0909 4 !#; 0910 4 ch$insert (%C':'); ; 0911 3 END; ; 0912 3  ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 27(_;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (9) ; 0913 3 !.; 0914 3 ! Fill in the file name and type.; 0915 3 !); 0916 3 ! Check for ANSII format FNB ; 0917 3 !%; 0918 3 IF .name_block [NB__ANS]; 0919 3 THENI; 0920 4 BEGIN; 0921 4 LOCALG; 0922 4 file_p : REF VECTOR [,BYTE]; ! Pointer to ANSII file specP ; 0923 4 ; 0924 4 !+; 0925 4 ! Process ANSII format FNB ; 0926 4 !); 0927 4 ! Move the file name in.:; 0928 4 !9; 0929 4 ch$insert (%C'"'); ! The opening quoteF ; 0930 4 ; 0931 4 !/; 0932 4 ! Get the first 12 characters.a; 0933 4 !B; 0934 4 file_p = .name_block [N_ANM1]; ! Init the pointer'; 0935 4 DECR i FROM 0 TO 11 DOL$; 0936 4 IF .file_p [.i] NEQU 0; 0937 4 THEN?; 0938 5 ch$insert (.file_p [.i]) ! Move the character ; 0939 4 ELSE; 0940 4 EXITLOOP;!; 0941 4 !-; 0942 4 ! Get the next 6 characters. ; 0943 4 !B; 0944 4 file_p = .name_block [N_ANM2]; ! Init the pointer&; 0945 4 DECR i FROM 0 TO 5 DO$; 0946 4 IF .file_p [.i] NEQU 0; 0947 4 THEN?; 0948 5 ch$insert (.file_p [.i]) ! Move the character ; 0949 4 ELSE; 0950 4 EXITLOOP; :; 0951 4 ch$insert (%C'"'); ! The trailing quote; 0952 4 END; 0953 3 ELSE9; 0954 4 BEGIN; 0955 4 !/; 0956 4 ! Process non ANSII format FNB ; 0957 4 !O; 0958 4 ! Convert the filename from RAD50 and move it into the string.r; 0959 4 !Y; 0960 5 IF (.name_block [N_FNAM] NEQU 0) AND (.(name_block [N_FNAM] + 2) NEQU 0) ; 0961 4 THENp=; 0962 4 RAD50_to_ASCII (9, .p, name_block [N_FNAM]; p); ; 0963 4 /; 0964 4 IF .name_block [N_FTYP] NEQU 0i; 0965 4 THEN ; 0966 5 BEGIN  S];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 28 _;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (9)iE; 0967 5 ch$insert (%C'.'); ! Insert the . between name and type0; 0968 5 !cL; 0969 5 ! Convert the filename from RAD50 and move it into the strin00azooßmæàmçámýfáþfDATAg.; 0970 5 !c=; 0971 5 RAD50_to_ASCII (3, .p, name_block [N_FTYP]; p); ; 0972 4 END;; 0973 3 END; ; 0974 3 ; 0975 3 !*; 0976 3 ! Fill in the version number.; 0977 3 !+; 0978 3 IF .name_block [N_FVER] NEQU 0m; 0979 3 THEN ; 0980 4 BEGIN; 0981 4 LOCAL5; 0982 4 t : VECTOR [2], ! Temporary for divider-; 0983 4 temp_digits : VECTOR [6, BYTE],c1; 0984 4 temp_string_p : REF VECTOR [,BYTE],n; 0985 4 base,r; 0986 4 char;c ; 0987 4 <; 0988 4 ch$insert (%C';'); ! Insert the ; to start; 0989 4 !J; 0990 4 ! Convert the number. Put it backwards into temp_string.; 0991 4 !; 0992 4 t [1] = 0;_.; 0993 4 t [0] = .name_block [N_FVER];1; 0994 4 temp_string_p = temp_digits [0];2H; 0995 4 base = (IF (.$FMSK4 AND F4_DVN) NEQU 0 THEN 10 ELSE 8); ; 0996 4 8; 0997 4 IF (.t [0] GTRU 32767) THEN !PKW112!; 0998 5 BEGIN !PKW112 >; 0999 5 ch$insert (%C'-'); !Put in a - sign !PKW112/; 1000 5 t [0] = 0 -.t [0] !PKW1120 ; 1001 4 END; !PKW112; 1002 4 &; 1003 4 DECR i FROM 6 TO 1 DO; 1004 5 BEGIN=; 1005 5 BUILTINt; 1006 5 EDIV;R ; 1007 5 1; 1008 5 EDIV (base, t, t [0], char); !-2 0; 1009 5 temp_string_p [0] = .char + %C'0';0; 1010 5 temp_string_p = temp_string_p [1];; 1011 4 END; !-1 ; 1012 4 T; 1013 4 temp_string_p = temp_string_p [0] - 1; !Back up to last char PKW112!; 1014 4 ! !PKW112.M; 1015 4 ! Remove any leading zeros. (They're trailing zeros !PKW112 /; 1016 4 ! in temp_string) !PKW112=!; 1017 4 ! !PKW112 ; 1018 4 !PKW112A; 1019 4 WHILE .temp_string_p [0] EQLU %C'0' DO !PKW112e>; 1020 4 temp_string_p = temp_string_p [0] - 1; !PKW112 p];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 29m_;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (9) ; 1021 4 ; 1022 4 !I; 1023 4 ! Move the string from temp_string where it is backwardsW@; 1024 4 ! to the secondary string in the correct order.; 1025 4 !D; 1026 4 DECR i FROM temp_string_p [0] TO temp_digits [0] DO; 1027 5 BEGINr$; 1028 5 ch$insert(.(.i)<0,8>);; 1029 4 END;; 1030 3 END;8; 1031 2 END; .NLIST  .LIST BIN,LOC .LIST. .SBTTL FCS.CONVERT FCS Format Parse Directive .NLISTD .ENABL LSBI .LIST FCS.CONVERT: MOV R1,-(SP) ; 0863 MOV R2,-(SP)! MOV R4,-(SP)g MOV R5,-(SP)n SUB #14,SP  MOV R3,R5 ; *,B.ADDR CMP R4,#36 ; B.LEN,* 0886 BEQ 1$ TRAP 247 &1$: MOV #SECONDARY,R4 ; *,P 0887 MOV #32,R0 ; 0892e ADD R5,R0 ; B.ADDR,* TST (R0)r BEQ 2$8! MOVB (R0),(R4)+ ; *,P 08990" MOVB 1(R0),(R4)+ ; *,P 0900& MOV 34(R5),R0 ; *(B.ADDR),* 0905 MOV R4,R3 ; P,*. JSR PC,DCBTA.BLIC MOV R3,R4 MOVB #72,(R4)+ ; *,P 0910,2$: BIT #2000,20(R5) ; *,*(B.ADDR) 0918 BEQ 3$M MOVB #42,(R4)+ ; *,P 0929* MOV 24(R5),R0 ; *(B.ADDR),FILE.P 0944 MOVB #42,(R4)+ ; *,P 0951 BR 5$ ; 09183$: MOV #6,R3 ; 0960  ADD R5,R3 ; B.ADDR,* TST (R3)  BEQ 4$A TST 10(R5) ; *(B.ADDR) BEQ 4$B MOV #11,R1 ; 0962; P];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 30,_;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (9)R MOV R4,R2 ; P,*9 JSR PC,RAD50.TO.ASCII MOV R2,R44$: MOV #14,R3 ; 0964 ADD R5,R3 ; B.ADDR,* TST (R3)R BEQ 5$, MOVB #56,(R4)+ ; *,P 0967 MOV #3,R1 ; 0971 MOV R4,R2 ; P,*. JSR PC,RAD50.TO.ASCII MOV R2,R4)5$: MOV 16(R5),R0 ; *(B.ADDR),* 0978  BEQ 13$ MOVB #73,(R4)+ ; *,P 0988 CLR 12(SP) ; T+2 0992  MOV00a‚o¥nn´cÚµcÛ¶c�·c›’ R0,10(SP) ; *,T 0993 & MOV #2,R2 ; *,TEMP.STRING.P 0994) ADD SP,R2 ; TEMP.DIGITS,TEMP.STRING.PD BIT $FMSK4,#F4.DVN ; 0995 BEQ 6$ MOV #12,(SP) ; *,BASE BR 7$6$: MOV #10,(SP) ; *,BASE4&7$: CMP 10(SP),#77777 ; T,* 0997 BLOS 8$ MOVB #55,(R4)+ ; *,P 0999 NEG 10(SP) ; T 1000V8$: MOV #6,R3 ; *,I 1003O"9$: MOV 10(SP),R1 ; T,* 1008 MOV 12(SP),R0 ; T,* DIV (SP),R0 ; BASE,* MOV R0,10(SP) ; *,T MOV R1,R5 ; *,CHAR MOV R5,R0 ; CHAR,* 1009 ADD #60,R0#" MOVB R0,(R2)+ ; *,TEMP.STRING.P SOB R3,9$ ; I,* 1003.10$: CMPB -(R2),#60 ; TEMP.STRING.P,* 1019 BEQ 10$ ; 1020 MOV #2,R0 ; 1026 ADD SP,R0 ; TEMP.DIGITS,*0 BR 12$7%11$: MOVB (R2),(R4)+ ; I,P 1028, DEC R2 ; I 1026N12$: CMP R2,R0 ; I,*V BGE 11$ 13$: MOV R4,R3 ; P,* 0863 ADD #14,SP MOV (SP)+,R5M MOV (SP)+,R4; MOV (SP)+,R2, MOV (SP)+,R1 RTS PC0 )];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 31 _;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (9)8; Routine Size: 130 words, Routine Base: $CODE$ + 0420/; Maximum stack depth per invocation: 14 words+ .NLIST .DSABL LSBC .NLIST BIN,LOC2 .LIST ,];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 32P_;X1.10 FCS Format Parse Directive 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (10)9; 1032 2 !i; 1033 2 ! Do the parse; 1034 2 !rO; 1035 2 ! FCS handles directory defaulting. This directive should not. ; 1036 2 !w0; 1037 2 do_directory_defaulting = false;Q; 1038 2 must_have_device = false; ! Don't need explicit device for $PFCSTE; 1039 2 cannot_have_node = true; ! FCS don't like them nodes1N; 1040 2 common_parse (.dpb_ptr, .header_addr, .tcb_addr, fcs_convert);; 1041 1 END; .NLISTD .LIST BIN,LOC .LIST) .SBTTL $LNFCS FCS Format Parse Directiver .NLIST0 .ENABL LSB .LIST/$LNFCS::CLR DO.DIRECTORY.DEFAULTING ; 1037 ! CLR MUST.HAVE.DEVICE ; 1038 $ MOV #1,CANNOT.HAVE.NODE ; 1039! MOV #FCS.CONVERT,R0 ; 1040  JSR PC,COMMON.PARSE RTS PC ; 0806c7; Routine Size: 12 words, Routine Base: $CODE$ + 1024u-; Maximum stack depth per invocation: 1 word  .NLISTp .DSABL LSBr .NLIST BIN,LOCt .LIST n];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 33sW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (11)1&; 1042 1 %SBTTL 'Common Parse Code' ; 1043 1 U; 1044 1 ROUTINE common_parse (dpb_ptr, header_addr, tcb_addr, sec_spec_convert) :P(; 1045 1 common_parse_l NOVALUE = ; 1046 1 ; 1047 1 !++2 ; 1048 1 !t%; 1049 1 ! FUNCTIONAL DESCRIPTION:L ; 1050 1 !SL; 1051 1 ! This routine is called by $LNRMS, $LNFCS, and $LNCHN to do theO; 1052 1 ! parse operation. See those routines for information on the parse ; 1053 1 ! operation. ; 1054 1 !N; 1055 1 !--1; 1056 2 BEGINS; 1057 2 MAPd@; 1058 2 dpb_ptr : REF VECTOR; ! Treat the DPB as a vector ; 1059 2 ; 1060 2 BIND\; 1061 2 dpb_ptr_b = dpb_ptr : REF VECTOR [, BYTE]; ! Treat the DPB as a vector of bytes ; 1062 2 ; 1063 2 LOCALL; 1064 2 status,'; 1065 2 b_len, ! Buffer lengthS); 1066 2 b_addr, ! Buffer address +; 1067 2 b_mapping, ! Buffer mappingf=; 1068 2 pri_logical_type, ! Saved primary logical typeN;; 1069 2 flags_for_user, ! Flags word to be returned,; 1070 2 do_assign_lun, ! Assign flag5; 1071 2 res_length, ! Resultant string lengthE; 1072 2 assign_lun_error, ! Deferred error from LUN assignment 2; 1073 2 ucb, ! Address of the UCB for LUND; 1074 2 merge_directory_flag, ! Merge hierarchial directories3; 1075 2 p : REF VECTOR; ! Temp00aŠooßmæàmçámýfáþfDATAorary pointer7 ; 1076 2 ; 1077 2 LABEL ; 1078 2 process_file_specs,; 1079 2 assign_lun,; 1080 2 merge_directories; ; 1081 2 ; 1082 2 process_file_specs :; 1083 3 BEGIN ; 1084 3 !rP; 1085 3 ! Initialize the logical descriptor block for later logical nameW; 1086 3 ! translations. The length and offset address will be filled in later.0; 1087 3 !o9; 1088 3 init_logical_descriptor [block_type] = 0;:R; 1089 3 init_logical_descriptor [table_number] = .dpb_ptr_b [1]; ! aka modq; 1090 3 init_logical_descriptor [address_base] = .KISAR5; ! Logical names will be in the directive commonca; 1091 3 init_logical_descriptor [matching_tcb_ucb] = .tcb_addr; ! For user table searchescN; 1092 3 saved_inhibit_mask = .dpb_ptr_b [3]; ! Settup the inhibit mask ; 1093 3 G; 1094 3 do_assign_lun = true; ! Init to enable LUN assignment ;; 1095 3 assign_lun_error = 0; ! LUN assignment ok  t];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 34sW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (11)0:; 1096 3 merged = work_1 [0]; ! Initialize merged>; 1097 3 primary = work_2 [0]; ! Initialize secondaryE; 1098 3 save_parse (scr_pb); ! Init the scratch parse block E; 1099 3 save_parse (pri_pb); ! Init the primary parse block5 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 35-W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (12)-; 1100 3 !U2; 1101 3 ! Settup the users primary string.; 1102 3 ! E; 1103 3 b_addr = .dpb_ptr [2]; ! Get primary string addressi;; 1104 3 b_len = .dpb_ptr [3]; ! Get string lengthh ; 1105 3 ; 1106 3 IF .b_len NEQU 0; 1107 3 THEN; 1108 4 BEGIN ; 1109 4 ; 1110 4 LOCAL>; 1111 4 trailing_length; ! Returned length from fss ; 1112 4 8; 1113 4 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP); ; 1114 4 D; 1115 4 IF .b_len GTRU file_spec_size THEN ERROR_EXIT (IE_IBS); ; 1116 4 ; 1117 4 !J; 1118 4 ! Address check, relocate, map, copy, compress, upcase, parse-; 1119 4 ! and expand the primary string. ; 1120 4 !Z; 1121 4 IF $ACHRO (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read access ; 1122 4 :; 1123 4 b_addr = $RELOM (.b_addr); ! Map user buffer ; 1124 4 D; 1125 4 primary [0] = %C' '; ! Init it in case string is null<; 1126 4 ch$copy (.b_len, .b_addr, primary [0]; b_addr);H; 1127 4 fss (primary [0], .b_addr - primary [0];, trailing_length);'; 1128 4 IF .trailing_length NEQU 0m; 1129 4 THENe; 1130 5 BEGINM; 1131 5 save_parse (pri_pb); ! Move scr_pb to primaryeL; 1132 5 pri_pb [fss_status] = bad_char; ! Settup the error codeD; 1133 5 LEAVE process_file_specs; ! And return it; 1134 4 END;' ; 1135 4 ; 1136 4 END; 1137 3 ELSE; 1138 4 BEGIN1; 1139 4 primary [0] = %C' '; ! No filespecr?; 1140 4 fss (primary [0], 1); ! Parse file specification ; 1141 3 END;Q ; 1142 3 ?; 1143 3 save_parse (pri_pb); ! Move scr_pb to primaryp ; 1144 3 \; 1145 3 pri_logical_type = .pri_pb [logical_type]; ! Save the logical type for merge ; 1146 3 o; 1147 3 IF expand_filespec (.dpb_ptr) NEQU success THEN LEAVE process_file_specs; ! Expand any logicals ; 1148 3 A; 1149 3 IF .pri_pb [logical_type] GTRU .pri_logical_type [a; 1150 3 THEN pri_logical_type = .pri_pb [logical_type]; ! Save the logical type for merge ; 1151 3  ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 36 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (13); 1152 3 !74; 1153 3 ! Sett00a’o¥nn´cÚµcÛ¶c�·c›’up the users secondary string.; 1154 3 !eU; 1155 3 ! First validate the users buffer. Then call the appropriate routine ,; 1156 3 ! to perform the conversion.; 1157 3 ! G; 1158 3 b_addr = .dpb_ptr [9]; ! Get secondary string address<; 1159 3 b_len = .dpb_ptr [10]; ! Get string length ; 1160 3 ; 1161 3 IF .b_len NEQU 0; 1162 3 THEN; 1163 4 BEGIN ; 1164 4 ; 1165 4 LOCAL>; 1166 4 trailing_length; ! Returned length from fss ; 1167 4 8; 1168 4 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP); ; 1169 4 ; 1170 4 !N; 1171 4 ! Address check, relocate, map, copy, compress, upcase, and parse$; 1172 4 ! the secondary string.; 1173 4 ! ; 1174 4 Z; 1175 4 IF $ACHRO (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read access ; 1176 4 ;; 1177 4 b_addr = $RELOM (.b_addr); ! Map user buffer ; 1178 4 M; 1179 4 sec_spec_convert_l (.sec_spec_convert, .b_addr, .b_len; b_addr);sL; 1180 4 fss (secondary [0], .b_addr - secondary [0];, trailing_length);'; 1181 4 IF .trailing_length NEQU 0A; 1182 4 THENa; 1183 5 BEGIN ; 1184 5 ; 1185 5 !4; 1186 5 ! Settup the bad string for return.; 1187 5 !U; 1188 5 primary = secondary [0]; ! The primary string is returned M; 1189 5 save_parse (pri_pb); ! Move scr_pb to primary1L; 1190 5 pri_pb [fss_status] = bad_char; ! Settup the error codeD; 1191 5 LEAVE process_file_specs; ! And return it; 1192 4 END;a ; 1193 4 ; 1194 4 END; 1195 3 ELSE; 1196 4 BEGIN3; 1197 4 secondary [0] = %C' '; ! No filespechA; 1198 4 fss (secondary [0], 1); ! Parse file specificationa; 1199 3 END;  ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 37!W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (14)h; 1200 3 !1R; 1201 3 ! If the primary string either before or after expansion containedQ; 1202 3 ! a node or device then don't merge in a node or device from the 7#; 1203 3 ! secondary string.l; 1204 3 ! ?; 1205 3 IF .pri_logical_type GTRU logical_type_filename ; 1206 3 THEN; 1207 4 BEGIN#; 1208 4 scr_pb [node_len] = 0;i$; 1209 4 scr_pb [node_addr] = 0;%; 1210 4 scr_pb [device_len] = 0;0&; 1211 4 scr_pb [device_addr] = 0;; 1212 3 END; ; 1213 3 ; 1214 3 !aS; 1215 3 ! Merge the users primary and secondary strings. Expand the resultiN; 1216 3 ! if a new logical could be present from the secondary string.; 1217 3 ! G; 1218 3 IF merge () NEQU success THEN LEAVE process_file_specs; ; 1219 3 @; 1220 3 IF .pri_pb [logical_type] GTRU .pri_logical_type; 1221 3 THEN ; 1222 3 V; 1223 3 IF expand_filespec (.dpb_ptr) NEQU success THEN LEAVE process_file_specs; ; 1224 3 N; 1225 3 flags_for_user = .pri_pb [flags]; ! Save flags to be returned ; 1226 3 ; 1227 3 !rQ; 1228 3 ! If there is a node spec we are all done here. Return the parsen/; 1229 3 ! block and string to the user.(; 1230 3 ! L; 1231 3 IF .pri_pb [node_addr] NEQU 0 THEN LEAVE process_file_specs; e];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 38.W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (15)_; 1232 3 !lL; 1233 3 ! If the user did not provide a device apply the appropriate; 1234 3 ! defaults.s; 1235 3 ! /; 1236 3 IF .pri_pb [device_addr] EQLU 0 ; 1237 3 THEN; 1238 4 BEGIN; 1239 4 !.D; 1240 4 ! The assign channel directive will not allow deviceE; 1241 4 ! defaulting. The device must be explicitly present.2; 1242 4 !.>; 1243 4 IF .must_hav00ašooßmæàmçámýfáþfDATAe_device THEN ERROR_EXIT (IE_IDU);\; 1244 4 IF (.dpb_ptr [11] AND (FS$NDF OR FS$DEV)) EQLU 0 !Do we want to do defaults?; 1245 4 THEN; 1246 5 BEGIN ; 1247 5 A; 1248 5 KISAR6 = .$SAHDB; ! Make sure task header is mapped H; 1249 5 IF NOT $MPLUN (dpb_ptr_b [2], .header_addr, .tcb_addr; ucb); 1250 5 THENs; 1251 6 BEGIN; 1252 6 !;; 1253 6 ! The device name will be merged in later.y; 1254 6 !A; 1255 6 do_assign_lun = false; ! Don't reassign the LUNE; 1256 6 END; 1257 5 ELSE ; 1258 6 BEGIN; 1259 6 !O; 1260 6 ! The LUN is not assigned, use the string SY: for the default. N; 1261 6 ! Put the default string in the secondary string and parse itN; 1262 6 ! in order to settup the scratch parse block. Next merge theK; 1263 6 ! default string with the primary string. Next expand anye?; 1264 6 ! logical names that may have been introduced.n; 1265 6 !; 1266 6 MACRO ; 1267 6 ; 1268 6 ! I; 1269 6 ! Insert a character into a string. Increment the pointer.L; 1270 6 !d!; M 1271 6 ch$insert (value) =t; M 1272 6 BEGINt&; M 1273 6 dev_ptr [0] = value;(; M 1274 6 dev_ptr = dev_ptr [1];; M 1275 6 ENDc; 1276 6 %; ; 1277 6 ; 1278 6 REGISTERnJ; 1279 6 dev_ptr : REF VECTOR [, BYTE]; ! Pointer into the dev string ; 1280 6 =; 1281 6 dev_ptr = secondary [0]; ! Init the pointerO#; 1282 6 ch$insert (%C'S'); #; 1283 6 ch$insert (%C'Y'); #; 1284 6 ch$insert (%C':'); (; 1285 6 fss (secondary [0], 3); ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 39 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (15) H; 1286 6 IF merge () NEQU success THEN LEAVE process_file_specs;Z; 1287 6 IF expand_filespec (.dpb_ptr) NEQU success THEN LEAVE process_file_specs;; 1288 6 !R; 1289 6 ! If there is a node spec we are all done here. Return the parse0; 1290 6 ! block and string to the user.; 1291 6 !M; 1292 6 IF .pri_pb [node_addr] NEQU 0 THEN LEAVE process_file_specs; ; 1293 5 END;C; 1294 4 END;1; 1295 3 END;S P];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 40cW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (16)p; 1296 3 ! Q; 1297 3 ! Assign the LUN if appropriate. The LUN will not be assigned ifrQ; 1298 3 ! the current LUN assignment is being used as the device default. ; 1299 3 !n; 1300 3 assign_lun :; 1301 4 BEGIN ; 1302 4 U; 1303 5 IF .do_assign_lun AND ((.dpb_ptr [11] AND (FS$NDF OR FS$DEV)) EQLU 0)-; 1304 4 THEN; 1305 5 BEGIN; 1306 5 MACRO ; 1307 5 ; 1308 5 !P; 1309 5 ! NEXT_CHAR sets the next character and returns true if success; 1310 5 !; M 1311 5 next_char =; M 1312 5 BEGINi(; M 1313 5 char = .(.unit_ptr)<0, 8>;'; M 1314 5 unit_ptr = .unit_ptr + 1;t; M 1315 5 .char NEQU %C':'; 1316 5 END %; ; 1317 5 ; 1318 5 ROUTINEf; 1319 5 ie_idu_return : return_ie_xxx_l = ERROR_EXIT (IE_IDU), ! Routine for assign_lun_error .NLIST  .LIST BIN,LOC .LIST' .SBTTL IE.IDU.RETURN Common Parse Code  .NLIST3 .ENABL LSBN .LISTIE.IDU.RETURN: MOV R0,-(SP) ; 1319 TRAP 244 MOV (SP)+,R0! RTS PC16; Routine Size: 4 words, Routine Base: $CODE$ + 1054.; Maximum stack depth per invocation: 3 words .NLISTt .DSABL LSB  .NLIST BIN,LOC  .LISTf; 1320 5 ie_ilu_return : return_ie_xxx_l = ERROR_EXIT (IE_ILU); ! Routine for assign_lun_error .NLISTR .LIST BIN,LOC .LIST' .SBTTL IE.ILU.RETURN Common Parse CodeN .NLISTI .ENABL LSB  I];DRPFN Logical Name Directives 8-Aug-1986 100a¢o¥nn´cÚµcÛ¶c�·c›’4:08:19 VAX-11 Bliss-16 V4.1-582 Page 41 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (16)  .LISTIE.ILU.RETURN: MOV R0,-(SP) ; 1320 TRAP 240. MOV (SP)+,R0  RTS PCL6; Routine Size: 4 words, Routine Base: $CODE$ + 1064.; Maximum stack depth per invocation: 3 words .NLISTi .DSABL LSB .NLIST BIN,LOCB .LIST ; 1321 5 ; 1322 5 LOCALI; 1323 5 unit_number, ! Unit number for device to be assigned to B; 1324 5 unit_ptr, ! Pointer into the unit number string;; 1325 5 char; ! Current character in unit numberN ; 1326 5 ; 1327 5 !8; 1328 5 ! Check the length. It must be at least 3.; 1329 5 !/; 1330 5 IF .pri_pb [device_len] LSSU 3e; 1331 5 THENi; 1332 6 BEGINnL; 1333 6 assign_lun_error = ie_idu_return; ! The error will be reported.; 1334 6 LEAVE assign_lun; ! at the end; 1335 5 END;; 1336 5 !(; 1337 5 ! Calculate the unit number; 1338 5 !5; 1339 5 unit_number = 0; ! Init the unit number E; 1340 5 unit_ptr = .pri_pb [device_addr] + 2; ! Init the pointer ; 1341 5 ; 1342 5 !$; 1343 5 ! Loop thru the digits.; 1344 5 !; 1345 5 WHILE next_char DOe; 1346 6 BEGIN ; 1347 6 ; 1348 6 !C; 1349 6 ! Check the character. It must be an octal digit. ; 1350 6 !<; 1351 7 IF (.char LSSU %C'0') OR (.char GTRU %C'7'); 1352 6 THENe; 1353 7 BEGIN L; 1354 7 assign_lun_error = ie_idu_return; ! The error will be reported.; 1355 7 LEAVE assign_lun; ! at the end; 1356 6 END; ; 1357 6 Q; 1358 6 unit_number = .unit_number * 8 + (.char - %C'0'); ! Add this onen; 1359 5 END;  ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 42 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (16)R ; 1360 5 ; 1361 5 !R; 1362 5 ! Give the LUN assignment routine the LUN number, the header address,C; 1363 5 ! the TCB address, the two letters of the device name, >; 1364 5 ! the unit number, and the terminal logical flag.; 1365 5 !S; 1366 5 ! The routine will assign the LUN if possible and return the directiverR; 1367 5 ! error code if any. Any error will be signaled later, after as muchE; 1368 5 ! information as possible has been returned to the user.(; 1369 5 !K; 1370 5 ! If the terminal logical flag was set by the last expand thennM; 1371 5 ! lun_assign will just look for the device in the system tables.tO; 1372 5 ! If the logical was not terminal then the device translation thatJ; 1373 5 ! is normally done for the assign LUN directive will be done.; 1374 5 !A; 1375 5 KISAR6 = .$SAHDB; ! Make sure task header is mappeda; 1376 5 assign_lun_error =8D; 1377 6 (IF .dpb_ptr_b [2] NEQU 0 ! Defer error for LUN of zero; 1378 6 THEN ,; 1379 6 lun_assign ( dpb_ptr_b [2],; 1380 6 .header_addr, ; 1381 6 .tcb_addr,'; 1382 6 ..pri_pb [device_addr],; 1383 6 .unit_number,a'; 1384 6 .terminal_logical_flag;n; 1385 6 ucb); 1386 6 ELSEo ; 1387 5 ie_ilu_return);; 1388 4 END; "; 1389 3 END; ! assign_lun a];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 432W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (17) ; 1390 3 !3U; 1391 3 ! At this point the LUN is assigned. Either we are using the currentaQ; 1392 3 ! assignment as the device default or the LUN was assigned above. ; 1393 3 !A; 1394 3 ! The only exception is if the assign LUN failed.E; 1395 3 ! O; 1396 3 ! Here we will generate a device name and unit number and merge Q; 1397 3 ! it into the primary string. First we will call $MPLND to track:W; 1398 3 ! down an 00aªooßmæàmçámýfáþfDATAredirections. No point in doing any of this for ACHN becauset,; 1399 3 ! we do not return a string.; 1400 3 !C; 1401 3 IF .must_have_device THEN LEAVE process_file_specs;iZ; 1402 5 IF (.assign_lun_error EQLU 0) AND ((.dpb_ptr [11] AND (FS$NDF OR FS$DEV)) ; 1403 3 EQLU 0) THEN; 1404 4 BEGIN; 1405 4 LOCAL4; 1406 4 dcb, ! Address of the DCB for LUNC; 1407 4 unit_number, ! Unit number for device on this LUN:K; 1408 4 redirected_ucb; ! We need the real UCB and the redirectedA*; 1409 4 ! UCB for spooled devices ; 1410 4 ; 1411 4 REGISTER M; 1412 4 dev_ptr : REF VECTOR [, BYTE]; ! Pointer into the dev string ; 1413 4 ; 1414 4 MACRO ; 1415 4 ; 1416 4 !L; 1417 4 ! Insert a character into a string. Increment the pointer.; 1418 4 !$; M 1419 4 ch$insert (value) =; M 1420 4 BEGIN_"; M 1421 4 dev_ptr [0] = value;$; M 1422 4 dev_ptr = dev_ptr [1];; M 1423 4 ENDh; 1424 4 %; ; 1425 4 9; 1426 4 dev_ptr = secondary [0]; ! Init the pointer ; 1427 4 ; 1428 4 !I; 1429 4 ! Now get the correct UCB address. Follow any redirections, 5; 1430 4 ! and get both UCBs for spooled devices. ; 1431 4 !;; 1432 4 $MPLND (.ucb, .tcb_addr; redirected_ucb, ucb);o ; 1433 4 ; 1434 4 !J; 1435 4 ! While we have the ucb address a check will be made. If theI; 1436 4 ! device is unit record, sequential or single directory thenH; 1437 4 ! directory defaulting will not be done because a directory; 1438 4 ! is not required. ; 1439 4 !T; 1440 4 IF (.(.redirected_ucb + U_CW1) AND (DV_REC OR DV_SDI OR DV_SQD)) NEQU 0; 1441 4 THENs1; 1442 4 do_directory_defaulting = false; ; 1443 4  c];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 44uW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (17)l:; 1444 4 dcb = .(.ucb + U_DCB); ! Get the DCB address ; 1445 4 ; 1446 4 !0; 1447 4 ! Calculate the logical unit number; 1448 4 !i; 1449 5 unit_number = ((.ucb - .(.dcb + D_UCB)) / .(.dcb + D_UCBL)) ! Relative UCB addr / UCB length2I; 1450 4 + .(.dcb + D_UNIT) <0,8>; ! Plus lowest unit on this DCBa ; 1451 4 @; 1452 4 ch$insert (%C'_'); ! Terminal logical from the LUNC; 1453 4 ch$insert (.(.dcb + D_NAM)); ! Fill in the device nameN-; 1454 4 ch$insert (.(.dcb + D_NAM + 1));c ; 1455 4 ; 1456 4 !D; 1457 4 ! Generate the ASCII device number from the unit number; 1458 4 ! zero suppressed. ; 1459 4 !9; 1460 4 DCBTA_BLI (.unit_number, .dev_ptr; dev_ptr);l ; 1461 4 ; 1462 4 !$; 1463 4 ! Insert the trailing :; 1464 4 !; 1465 4 ch$insert (%C':'); ; 1466 4 ; 1467 4 !:; 1468 4 ! Parse the device spec and merge it into the; 1469 4 ! primary string.; 1470 4 !;; 1471 4 fss (secondary [0], .dev_ptr - secondary [0]); ; 1472 4 ; 1473 4 !I; 1474 4 ! Kill the primary device info so that the new device string !; 1475 4 ! will be merged in.4; 1476 4 !%; 1477 4 pri_pb [device_len] = 0; &; 1478 4 pri_pb [device_addr] = 0;D; 1479 4 IF merge () NEQU success THEN LEAVE process_file_specs;; 1480 3 END; ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 45sW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (18) ; 1481 3 ! M; 1482 3 ! If the user did not provide a directory or if the directoryN; 1483 3 ! was null apply the appropriate defaults unless the directoryN; 1484 3 ! defaulting flag is set off for the FCS format parse. If theK; 1485 3 ! user provided a directory with a leading . or - then thisi?; 1486 3 ! directory will be merged in with the default.5; 1487 3 !XL; 1488 4 merge_directory_flag =00a²o¥nn´cÚµcÛ¶c�·c›’ ((.pri_pb [directory_len] GEQU 3) ANDD; 1489 5 ((.(.pri_pb [directory_addr] + 1)<0,8> EQLU %C'.') ORC; 1490 3 (.(.pri_pb [directory_addr] + 1)<0,8> EQLU %C'-')));a ; 1491 3 0; 1492 3 IF .do_directory_defaulting AND A; 1493 3 ((.dpb_ptr [11] AND (FS$NDF OR FS$DIR)) EQLU 0) AND:; 1494 4 ((.pri_pb [directory_addr] EQLU 0) OR4; 1495 4 (.pri_pb [directory_len] EQLU 2) OR'; 1496 4 .merge_directory_flag) ; 1497 3 THEN; 1498 4 BEGIN ; 1499 4 ; 1500 4 !H; 1501 4 ! Try to get the default directory string. Put it intoH; 1502 4 ! the secondary string. It will be returned terminated.; 1503 4 ! by a blank. Then parse it.; 1504 4 !; 1505 4 FIELD ; 1506 4 dds_context_f =; 1507 4 SET4>; 1508 4 reference_count= [0, 0, 8, 0], ! Reference countG; 1509 4 dds_length = [0, 8, 8, 0], ! Length of the default stringrH; 1510 4 dds_uic = [1, 0, 16, 0], ! UIC for clock block propagationF; 1511 4 default_string = [2, 0, 16, 0] ! Start of default string; 1512 4 TES; ; 1513 4 ; 1514 4 LITERALG; 1515 4 dds_context_size = 2; ! Size of the fixed part of thee.; 1516 4 ! DDS context block in words ; 1517 4 ; 1518 4 BIND =; 1519 4 dds_context = apr6_v : BLOCK [dds_context_size]!R; 1520 4 FIELD (dds_context_f); ! Default directory context block address ; 1521 4 ; 1522 4 LOCAL>; 1523 4 trailing_length, ! Returned length from fss ; 1524 4 default_length,I; 1525 4 p : REF VECTOR [,BYTE]; ! Pointer into secondary stringL ; 1526 4 ; 1527 4 !R; 1528 4 ! Map the default directory string context block. If there is a taskO; 1529 4 ! context block use that one. If not, use the one hung off of theBP; 1530 4 ! terminal if it is present. If there is neither then return a DDS; 1531 4 ! of blank.; 1532 4 !<; 1533 7 IF (KISAR6 = ( IF (.(.tcb_addr + T_CTX) NEQU 0); 1534 6 THEN ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 46yW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (18)o'; 1535 7 .(.tcb_addr + T_CTX) ; 1536 6 ELSEeJ; 1537 7 (IF (.(.(.tcb_addr + T_UCB) + U_CW1) AND DV_PSE) EQLU 0; 1538 7 THEN /; 1539 8 .(.(.tcb_addr + T_UCB) + U_CTX)l; 1540 7 ELSE ; 1541 7 0); 1542 6 ); 1543 4 ) NEQU 0 ; 1544 4 ; 1545 4 THENa; 1546 5 BEGIN ; 1547 5 ; 1548 5 !a; 1549 5 ! Here we have the context block mapped. Copy, compress, and upcase the default5L; 1550 5 ! directory string. Checking of the string is done by fss.; 1551 5 !<; 1552 5 default_length = .dds_context [dds_length];[; 1553 5 ch$copy (.default_length, dds_context [default_string], secondary [0]; p);; 1554 5 END; 1555 4 ELSE$; 1556 4 default_length = 0; ; 1557 4 ; 1558 4 !(; 1559 4 ! Parse the default string.; 1560 4 !D; 1561 4 fss (secondary [0], .default_length;, trailing_length);'; 1562 4 IF .trailing_length NEQU 0d; 1563 4 THENh; 1564 5 BEGIN ; 1565 5 ; 1566 5 !4; 1567 5 ! Settup the bad string for return.; 1568 5 !J; 1569 5 primary = secondary [0]; ! The primary string is returned>; 1570 5 save_parse (pri_pb); ! Move scr_pb to primaryI; 1571 5 pri_pb [fss_status] = bad_char; ! Settup the error codee:; 1572 5 LEAVE process_file_specs; ! And return it; 1573 4 END;, a];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 47BW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (19)r; 1574 4 !8; 1575 4 ! Is there a valid non null default string?; 1576 4 !4; 1577 4 IF (.scr_pb [directory_addr] EQ00aºooßmæàmçámýfáþfDATALU 0) OR1; 1578 4 (.scr_pb [directory_len] EQLU 2) ORuI; 1579 5 ((.scr_pb [flags] AND (FS$NAM OR FS$TYP OR FS$VER)) NEQU 0)l; 1580 4 THENr; 1581 5 BEGIN ; 1582 5 ; 1583 5 !1; 1584 5 ! Generate the UIC format string1; 1585 5 !; 1586 5 MACRO ; 1587 5 ; 1588 5 !SI; 1589 5 ! Insert a character into a string. Increment the pointer. ; 1590 5 !d!; M 1591 5 ch$insert (value) = ; M 1592 5 BEGINe&; M 1593 5 dir_ptr [0] = value;(; M 1594 5 dir_ptr = dir_ptr [1];; M 1595 5 ENDs; 1596 5 %; ; 1597 5 ; 1598 5 LOCALJ; 1599 5 dir_ptr : REF VECTOR [, BYTE]; ! Pointer into the dir string ; 1600 5 ; 1601 5 BIND1I; 1602 5 uic_group = .header_addr + H_DUIC + 1 : BYTE, ! Default UICS7; 1603 5 uic_owner = .header_addr + H_DUIC : BYTE;e ; 1604 5 F; 1605 5 KISAR6 = .$SAHDB; ! Make sure task header is mapped4; 1606 5 dir_ptr = secondary [0]; ! Init it<; 1607 5 ch$insert (%C'['); ! Put in the opening [ ; 1608 5 ; 1609 5 !M; 1610 5 ! Fill in the group zero suppressed. Include the zero if iti); 1611 5 ! is the only character. ; 1612 5 !+; 1613 5 IF .uic_group <6,2> NEQU 0I; 1614 5 THEN ; 1615 6 BEGINi3; 1616 6 ch$insert (.uic_group <6,2> + %C'0'); 3; 1617 6 ch$insert (.uic_group <3,3> + %C'0');s; 1618 6 END; 1619 5 ELSErS; 1620 5 IF .uic_group <3,3> NEQU 0 THEN ch$insert (.uic_group <3,3> + %C'0');i6; 1621 5 ch$insert (.uic_group <0,3> + %C'0'); ; 1622 5 8; 1623 5 ch$insert (%C','); ! Insert the comma. ; 1624 5 ; 1625 5 !?; 1626 5 ! Fill in the group and owner zero suppressed.I; 1627 5 ! ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 48iW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (19) +; 1628 5 IF .uic_owner <6,2> NEQU 0.; 1629 5 THEN); 1630 6 BEGINc3; 1631 6 ch$insert (.uic_owner <6,2> + %C'0'); 3; 1632 6 ch$insert (.uic_owner <3,3> + %C'0');.; 1633 6 END ; 1634 5 ELSE6S; 1635 5 IF .uic_owner <3,3> NEQU 0 THEN ch$insert (.uic_owner <3,3> + %C'0');P6; 1636 5 ch$insert (.uic_owner <0,3> + %C'0'); ; 1637 5 ; 1638 5 !?; 1639 5 ! Finish up the directory string and parse it.D; 1640 5 !;; 1641 5 ch$insert (%C']'); ! Put in the trailing ]9 ; 1642 5 ; 1643 5 !A; 1644 5 ! Parse the default UIC format directory string. ; 1645 5 !?; 1646 5 fss (secondary [0], .dir_ptr - secondary [0]);6<; 1647 4 END; ! Create UIC format directory string w];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 49 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (20)0; 1648 4 !K; 1649 4 ! If the user supplied directory string contains a leading E; 1650 4 ! . or - merge it with the default directory string.g; 1651 4 !); 1652 4 IF .merge_directory_flagi; 1653 4 THEN6; 1654 5 BEGIND3; 1655 5 status = ! Set the status from merge !; 1656 5 merge_directories :9; 1657 6 BEGINi ; 1658 6 ; 1659 6 LOCAL0*; 1660 6 bracket : UNSIGNED BYTE,4; 1661 6 default_dir : REF VECTOR [, BYTE],1; 1662 6 user_dir : REF VECTOR [, BYTE];e ; 1663 6 ; 1664 6 ! B; 1665 6 ! The user directory pointer is initialized to pointA; 1666 6 ! to the beginning of the directory string providedi>; 1667 6 ! by the user. The default directory pointer is>; 1668 6 ! initialized to point to the end of the default!; 1669 6 ! directory string. ; 1670 6 !96; 1671 6 user_dir = .pri_pb [directory_addr] + 1;8; 1672 6 default_dir = .scr_pb [t00aÂo¥nn´cÚµcÛ¶c�·c›’railing_addr] - 2; ; 1673 6 ; 1674 6 !VB; 1675 6 ! Save the trailing bracket from the default string.?; 1676 6 ! This will be used to close the merged directory ; 1677 6 ! string.i; 1678 6 !o<; 1679 6 bracket = .(.scr_pb [trailing_addr] - 1)<0,8>; ; 1680 6 ; 1681 6 !a<; 1682 6 ! Loop thru any '-' requests and backup in the"; 1683 6 ! default directory.; 1684 6 !d/; 1685 6 WHILE .user_dir [0] EQLU %C'-' DO ; 1686 7 BEGINa*; 1687 7 user_dir = user_dir [1]; ; 1688 7 ; 1689 7 !l#; 1690 7 ! '.' is bad here; 1691 7 !w0; 1692 7 IF .default_dir [0] EQLU %C'.'; 1693 7 THENV; 1694 7 LEAVE merge_directories WITH pri_pb [fss_status] = bad_directory;; 1695 7 ! =; 1696 7 ! Backup one level in the default string if !; 1697 7 ! there is one. ; 1698 7 !5; 1699 7 WHILE 1 DO; 1700 8 BEGIN ; 1701 8  ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 50 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (20)'; 1702 8 !5; 1703 8 ! Check for no more default directory. ; 1704 8 !?; 1705 8 IF default_dir [0] EQLA .scr_pb [directory_addr]k; 1706 8 THENe; 1707 8 EXITLOOP; ; 1708 8 -; 1709 8 IF .default_dir [0] EQLU %C'.' ; 1710 8 THEN0; 1711 9 BEGINF; 1712 9 default_dir = default_dir [-1]; ! Back over the '.'*; 1713 9 EXITLOOP; ! And exit; 1714 9 END; 1715 8 ELSECG; 1716 8 default_dir = default_dir [-1]; ! Backup a characterf ; 1717 8 ; 1718 7 END; ,; 1719 6 END; ! End of hyphen loop ; 1720 6 ; 1721 6 !k#; 1722 6 ! '.' is bad here too ; 1723 6 ! ,; 1724 6 IF .default_dir [0] EQLU %C'.'; 1725 6 THENR; 1726 6 LEAVE merge_directories WITH pri_pb [fss_status] = bad_directory; ; 1727 6 ; 1728 6 ! =; 1729 6 ! Check for remaining default directory string.D; 1730 6 !E>; 1731 6 IF default_dir [0] EQLA .scr_pb [directory_addr]; 1732 6 THEN; 1733 7 BEGINE ; 1734 7 ; 1735 7 ! @; 1736 7 ! Here we are out of default directory string.@; 1737 7 ! Eat a leading '.' in the users string unlessE; 1738 7 ! it is part of '...'. '..' will also be accepted.cC; 1739 7 ! That case will be caught in the access methods.7; 1740 7 ! -; 1741 7 IF .user_dir [0] EQLU %C'.'i; 1742 7 THEN; 1743 8 BEGIN ; 1744 8 ; 1745 8 !%; 1746 8 ! Skip the leading '.' ; 1747 8 !'; 1748 8 user_dir = user_dir [1];6 ; 1749 8 ; 1750 8 !@; 1751 8 ! If the next character is a '.' also then backup2; 1752 8 ! to include the previous dot also.; 1753 8 !*; 1754 8 IF .user_dir [0] EQLU %C'.'; 1755 8 THEN  g];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 51iW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (20) ,; 1756 8 user_dir = user_dir [-1]; ; 1757 8 ;; 1758 7 END; ! End of leading '.' in user directory ; 1759 7 ; 1760 7 !rJ; 1761 7 ! If the users directory spec is gone too, we must setup2; 1762 7 ! the MFD as the directory spec.; 1763 7 !5_; 1764 8 IF user_dir [0] EQLA (.pri_pb [directory_addr] + .pri_pb [directory_len] - 1)2; 1765 7 THEN; 1766 8 BEGIN:; 1767 8 DECR i FROM 5 TO 0 DO ! Move the MFD name; 1768 9 BEGING; 1769 9 default_dir = default_dir [1]; ! Advance the pointer C; 1770 9 default_dir [0] = %C'0'; ! Insert the character ; 1771 8 END;r; 1772 7 END;o9; 1773 7 END ! End of out of default directoryo; 00aÊooßmæàmçámýfáþfDATA 1774 6 ELSE; 1775 7 BEGIN ; 1776 7 ; 1777 7 !dD; 1778 7 ! Here we have some default directory string left.A; 1779 7 ! Make sure that the users directory spec has avB; 1780 7 ! leading '.' unless it is null. If it does notG; 1781 7 ! then append a '.' at the end of the default string.t; 1782 7 !I_; 1783 8 IF user_dir [0] NEQA (.pri_pb [directory_addr] + .pri_pb [directory_len] - 1)n; 1784 7 THEN*; 1785 7 IF .user_dir [0] NEQU %C'.'; 1786 7 THEN ; 1787 8 BEGINC; 1788 8 default_dir = default_dir [1]; ! Advance pointer ;; 1789 8 default_dir [0] = %C'.'; ! Append the . ; 1790 7 END;e ; 1791 7 =; 1792 6 END; ! End of default directory remaining ; 1793 6 ; 1794 6 ! F; 1795 6 ! Now merge the remaining user string with the remaining); 1796 6 ! default directory string.r; 1797 6 ! a; 1798 6 WHILE user_dir [0] NEQA (.pri_pb [directory_addr] + .pri_pb [directory_len] - 1) DO ; 1799 7 BEGIN 0; 1800 7 default_dir = default_dir [1];2; 1801 7 default_dir [0] = .user_dir [0];*; 1802 7 user_dir = user_dir [1];; 1803 6 END; ; 1804 6 ; 1805 6 !i1; 1806 6 ! Include the closing character and-; 1807 6 ! parse the new default string.r; 1808 6 !i,; 1809 6 default_dir = default_dir [1]; ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 52rW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (20)i); 1810 6 default_dir [0] = .bracket;ud; 1811 6 fss (secondary [0], default_dir [0] - .scr_pb [directory_addr] + 1; ,trailing_length); ; 1812 6 ; 1813 6 !lA; 1814 6 ! Check the merged directory and return the status.l; 1815 6 !8+; 1816 6 LEAVE merge_directories WITH l,; 1817 6 IF .trailing_length NEQU 0; 1818 6 THEN@; 1819 6 pri_pb [fss_status] = bad_directory ! Error code; 1820 6 ELSE4; 1821 6 success; ! Return the status ; 1822 6 (; 1823 5 END; ! merge_directories ; 1824 5 ; 1825 5 !sC; 1826 5 ! Check the status and return any errors to the user.3; 1827 5 !4%; 1828 5 IF .status NEQU successr; 1829 5 THEN; 1830 6 BEGIN6 ; 1831 6 ; 1832 6 !l5; 1833 6 ! Settup the bad string for return.8; 1834 6 !8L; 1835 6 primary = secondary [0]; ! The primary string is returned@; 1836 6 save_parse (pri_pb); ! Move scr_pb to primaryH; 1837 6 pri_pb [fss_status] = .status; ! Settup the error code<; 1838 6 LEAVE process_file_specs; ! And return it; 1839 5 END;/; 1840 4 END; ! IF .merge_directory_flag ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 53 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (21)e; 1841 4 !G; 1842 4 ! Merge the default directory into the primary string.sI; 1843 4 ! First zero the length and address for the directory in :; 1844 4 ! the primary string in case it was null.; 1845 4 !,; 1846 4 pri_pb [directory_len] = 0;-; 1847 4 pri_pb [directory_addr] = 0;a; 1848 4 merge();6,; 1849 3 END; ! Add default directory ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 54 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (22); 1850 3 !rK; 1851 3 ! Remove any portions of the resultant string that the userpM; 1852 3 ! doesn't want. This functionality is used by RMS-11 if some H; 1853 3 ! portion of the file spec is provided in the NAM Block.; 1854 3 !); 1855 4 BEGIN ; 1856 4 ; 1857 4 LOCAL ; 1858 4 do_merge; 00aÒo¥nn´cÚµcÛ¶c�·c›’; 1859 4 G; 1860 4 secondary [0] = %C' '; ! Set up secondary with a blankd!; 1861 4 do_merge = false;C4; 1862 4 IF (.dpb_ptr [11] AND FS$NOD) NEQU 0; 1863 4 THEN; 1864 5 BEGIN$; 1865 5 pri_pb [node_addr] = 0;#; 1866 5 pri_pb [node_len] = 0;c; 1867 5 do_merge = true;s; 1868 4 END; 4; 1869 4 IF (.dpb_ptr [11] AND FS$DEV) NEQU 0; 1870 4 THEN; 1871 5 BEGIN&; 1872 5 pri_pb [device_addr] = 0;%; 1873 5 pri_pb [device_len] = 0; ; 1874 5 do_merge = true;0; 1875 4 END;p ; 1876 4 R; 1877 4 ! Neither FCS nor RMS likes the underscore returned on the device..; 1878 4 ! If it's there, strip it off.; 1879 4 !5;; 1880 4 IF .(.pri_pb [device_addr])<0,8> EQLU %C'_'=; 1881 4 THEN; 1882 5 BEGIN>; 1883 5 pri_pb [device_addr] = .pri_pb [device_addr] + 1;<; 1884 5 pri_pb [device_len] = .pri_pb [device_len] - 1;; 1885 5 do_merge = true;8; 1886 4 END;c ; 1887 4 4; 1888 4 IF (.dpb_ptr [11] AND FS$DIR) NEQU 0; 1889 4 THEN; 1890 5 BEGIN); 1891 5 pri_pb [directory_addr] = 0;e(; 1892 5 pri_pb [directory_len] = 0;; 1893 5 do_merge = true; ; 1894 4 END; 4; 1895 4 IF (.dpb_ptr [11] AND FS$NAM) NEQU 0; 1896 4 THEN; 1897 5 BEGIN(; 1898 5 pri_pb [filename_addr] = 0;'; 1899 5 pri_pb [filename_len] = 0;_; 1900 5 do_merge = true;;; 1901 4 END;e; 1902 4 !8J; 1903 4 ! Include a . in the primary string if the primary string  0];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 552W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (22) H; 1904 4 ! does not have a type in it, we are doing defaults, and2; 1905 4 ! directory defaulting is enabled.; 1906 4 !p4; 1907 4 IF (.dpb_ptr [11] AND FS$TYP) NEQU 0; 1908 4 THEN; 1909 5 BEGIN$; 1910 5 pri_pb [type_addr] = 0;#; 1911 5 pri_pb [type_len] = 0;n; 1912 5 do_merge = true;r; 1913 5 END; 1914 4 ELSEN; 1915 4 IF .do_directory_defaulting AND (.dpb_ptr [11] AND FS$NDF) EQLU 0; 1916 4 THEN ; 1917 5 BEGINB; 1918 5 secondary [0] = %C'.'; ! Include the "." for RMS!; 1919 5 do_merge = true;e; 1920 4 END; ; 1921 4 4; 1922 4 IF (.dpb_ptr [11] AND FS$VER) NEQU 0; 1923 4 THEN; 1924 5 BEGIN'; 1925 5 pri_pb [version_addr] = 0;&; 1926 5 pri_pb [version_len] = 0;; 1927 5 do_merge = true; ; 1928 4 END; !; 1929 4 IF .do_merge THENd; 1930 5 BEGIN@; 1931 5 fss (secondary [0], 1); ! Parse file specification,; 1932 5 merge (); ! And do the merge; 1933 4 END;c; 1934 3 END;,; 1935 2 END; ! process_file_specs ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 56HW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (23)r; 1936 2 !9H; 1937 2 ! Return the expanded string and the primary parse block3; 1938 2 ! with the saved flags to the user.r; 1939 2 ! ; 1940 2 !L; 1941 2 ! First return the strings length if the buffer is provided.R; 1942 2 ! Don't do any of this for ACHN, because we don't return a string. ; 1943 2 (; 1944 2 IF NOT .must_have_device; 1945 2 THEN; 1946 3 BEGIND; 1947 3 b_addr = .dpb_ptr [6]; ! Get resultant length address@; 1948 3 IF .pri_pb [trailing_addr] NEQU 0 ! Get the length; 1949 3 THENo\; 1950 3 res_length = .pri_pb [trailing_addr] - primary [0] + .pri_pb [trailing_len]; 1951 3 ELSE ; 1952 3 res_length = 0; ; 1953 3 ; 1954 3 IF .b_addr NEQU 0; 1955 3 THENs; 1956 4 BEGIN_; 1957 4 IF $ACHKB (.b_addr, 2) THEN ERROR_EXIT (IE_ADP); ! Check for read/write accessN:; 1958 4 p = $RELOM (.00aÚooßmæàmçámýfáþfDATAb_addr); ! Map user buffer9; 1959 4 .p = .res_length; ! Fill in the lengtha; 1960 3 END; ; 1961 3 ; 1962 3 !N; 1963 3 ! RMS requires that the version number delimiter be a ; and not aO; 1964 3 ! . in the resultant string. It uses this for some later parsing.9; 1965 3 !X; 1966 3 IF .pri_pb [version_len] NEQU 0 THEN (.pri_pb [version_addr])<0,8> = %C';'; ; 1967 3 ; 1968 3 !=; 1969 3 ! Then return as much of the string as possible,p; 1970 3 !=; 1971 3 b_addr = .dpb_ptr [4]; ! Get resultant address!;; 1972 3 b_len = .dpb_ptr [5]; ! Get resultant length9C; 1973 3 $RELOC (.b_addr; b_mapping, p); ! Relocte user buffereh; 1974 3 convert_parse (pri_pb, primary [0], .b_addr); ! Convert parse block addresses to user mode ; 1975 3 ; 1976 3 IF .b_len NEQU 0l; 1977 3 THENr; 1978 4 BEGIN ; 1979 4 <; 1980 4 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP); ; 1981 4 ; 1982 4 !<; 1983 4 ! Address check the user buffer. Then copy the(; 1984 4 ! resultant string into it.; 1985 4 !d; 1986 4 IF $ACHKB (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read/write access ; 1987 4 v; 1988 4 IF .res_length NEQU 0 THEN $BLXIO (MINU (.res_length, .b_len), .kisar5, primary [0], .b_mapping, .p); ; 1989 4  ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 57XW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (23) ; 1990 4 ! Move itr; 1991 3 END;o .];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 58kW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)(; 1992 3 !_D; 1993 3 ! Now return as much of the parse block as possible,; 1994 3 !cK; 1995 3 pri_pb [flags] = .flags_for_user; ! Save flags to be returned t; 1996 4 IF .cannot_have_node AND (.pri_pb [node_addr] NEQU 0) ! If a node is illegal, put status in parse block8; 1997 3 THEN pri_pb [fss_status] = bad_logical;?; 1998 3 b_addr = .dpb_ptr [7]; ! Get parse block address =; 1999 3 b_len = .dpb_ptr [8]; ! Get parse block lengthP ; 2000 3 ; 2001 3 IF .b_len NEQU 09; 2002 3 THENu; 2003 4 BEGIN ; 2004 4 <; 2005 4 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP); ; 2006 4 ; 2007 4 !I; 2008 4 ! Address check and relocate the user buffer. Then copy the #; 2009 4 ! parse block into it. ; 2010 4 !d; 2011 4 IF $ACHKB (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read/write access ; 2012 4 K; 2013 4 $RELOC (.b_addr; b_mapping, b_addr); ! Relocte user buffer0l; 2014 4 $BLXIO (MINU (parse_block_size*2, .b_len), .kisar5, pri_pb, .b_mapping, .b_addr); ! Move it; 2015 3 END;T; 2016 2 END;A; 2017 2 !Y; 2018 2 ! The LUN assignment may have returned an error. If it did the signalingU; 2019 2 ! of that error was deferred so that more information about the errord0; 2020 2 ! could be returned to the user.; 2021 2 ! 6; 2022 2 ! If there was an error signal it now.; 2023 2 ! U; 2024 2 IF .assign_lun_error NEQU 0 THEN return_ie_xxx_l (.assign_lun_error);pN; 2025 2 IF .pri_pb [fss_status] NEQU success THEN ERROR_EXIT (IE_LNF); ; 2026 2 ; 2027 2 RETURN;h; 2028 1 END; .NLISTn .LIST BIN,LOC .LISTDDS.CONTEXT= -40000 & .SBTTL COMMON.PARSE Common Parse Code .NLISTt .ENABL LSB  .LIST COMMON.PARSE:  JSR R1,$SAVE5 ; 1044e SUB #24,SP  MOV R0,20(SP) MOV R5,12(SP) MOV R4,10(SP) i];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 59xW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)_ MOV R3,14(SP)* CLRB INIT.LOGICAL.DESCRIPTOR+7 ; 1088 MOV R3,R0 ; 1089% MOVB 1(00aâo¥nn´cÚµcÛ¶c�·c›’R0),INIT.LOGICAL.DESCRIPTOR+6 / MOV KISAR5,INIT.LOGICAL.DESCRIPTOR+2; 1090 - MOV R5,INIT.LOGICAL.DESCRIPTOR+10 ; 1091R) MOVB 3(R0),SAVED.INHIBIT.MASK ; 10924 CLRB SAVED.INHIBIT.MASK+1) MOV #1,16(SP) ; *,DO.ASSIGN.LUN 1094a& CLR 6(SP) ; ASSIGN.LUN.ERRO 1095 MOV #WORK.1,MERGED ; 1096! MOV #WORK.2,PRIMARY ; 1097  MOV #SCR.PB,R1 ; 1098 JSR PC,SAVE.PARSE MOV #PRI.PB,R1 ; 1099 JSR PC,SAVE.PARSE MOV 14(SP),R0 ; 1103R MOV 4(R0),4(SP) ; *,B.ADDR,$ MOV 6(R0),2(SP) ; *,B.LEN 1104 BEQ 4$ ; 1106O TST 4(SP) ; B.ADDR 1113 BNE 1$R TRAP 236 &1$: CMP 2(SP),#377 ; B.LEN,* 1115 BLOS 2$ TRAP 247A%2$: MOV 4(SP),R0 ; B.ADDR,* 1121* MOV 2(SP),R1 ; B.LEN,*R JSR PC,$ACHRO BHIS 3$ TRAP 236M%3$: MOV 4(SP),R0 ; B.ADDR,* 1123O JSR PC,$RELOM MOV R0,4(SP) ; *,B.ADDR MOVB #40,@PRIMARY ; 1125! MOV 2(SP),R1 ; B.LEN,* 1126P MOV R0,R2 ; B.ADDR,* MOV PRIMARY,R3 JSR PC,CH$COPY MOV R3,4(SP)M MOV R3,R0 ; B.ADDR,* 1127 SUB PRIMARY,R0  MOV PRIMARY,R4) MOV R0,R5 JSR PC,FSSE# TST R5 ; TRAILING.LENGTH 1128  BEQ 5$* JMP 38$ ; 1131"4$: MOVB #40,@PRIMARY ; 1139 MOV PRIMARY,R4 ; 1140 MOV #1,R5 JSR PC,FSS5$: MOV #PRI.PB,R1 ; 1143P JSR PC,SAVE.PARSE 2];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 60 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)R' CLR 22(SP) ; PRI.LOGICAL.TYP 1145+ MOVB PRI.PB+44,22(SP) ; *,PRI.LOGICAL.TYP5 MOV 14(SP),R3 ; 1147T JSR PC,EXPAND.FILESPECB CMP R0,#1 BNE 13$ CLR R0 ; 1149@ BISB PRI.PB+44,R0$ CMP R0,22(SP) ; *,PRI.LOGICAL.TYP BLOS 6$' CLR 22(SP) ; PRI.LOGICAL.TYP 1150P+ MOVB PRI.PB+44,22(SP) ; *,PRI.LOGICAL.TYPe6$: MOV 14(SP),R0 ; 1158 MOV 22(R0),4(SP) ; *,B.ADDR% MOV 24(R0),2(SP) ; *,B.LEN 1159  BEQ 9$ ; 1161R TST 4(SP) ; B.ADDR 1168 BNE 7$C TRAP 236 %7$: MOV 4(SP),R0 ; B.ADDR,* 1175B MOV 2(SP),R1 ; B.LEN,*. JSR PC,$ACHRO BHIS 8$ TRAP 236J%8$: MOV 4(SP),R0 ; B.ADDR,* 1177E JSR PC,$RELOM MOV R0,4(SP) ; *,B.ADDR MOV R0,R3 ; B.ADDR,* 1179 MOV 2(SP),R4 ; B.LEN,*( JSR PC,@20(SP)C MOV R3,4(SP) MOV R3,R0 ; B.ADDR,* 1180 SUB #SECONDARY,R0 MOV #SECONDARY,R4 MOV R0,R5 JSR PC,FSS # TST R5 ; TRAILING.LENGTH 1181E BEQ 10$ JMP 37$ ; 1188#9$: MOVB #40,SECONDARY ; 1197E MOV #SECONDARY,R4 ; 11980 MOV #1,R5 JSR PC,FSSM/10$: CMP 22(SP),#1 ; PRI.LOGICAL.TYP,* 1205$ BLOS 11$J CLR SCR.PB+4 ; 1208 CLR SCR.PB+6 ; 1209 CLR SCR.PB+10 ; 1210 CLR SCR.PB+12 ; 1211111$: JSR PC,MERGE ; 1218 CMP R0,#1 BNE 16$ CLR R0 ; 1220  BISB PRI.PB+44,R0 S];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 611W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)D$ CMP R0,22(SP) ; *,PRI.LOGICAL.TYP BLOS 12$: MOV 14(SP),R3 ; 1223L JSR PC,EXPAND.FILESPECJ CMP R0,#1 BNE 16$412$: MOV PRI.PB+2,22(SP) ; *,FLAGS.FOR.USER 1225 TST PRI.PB+6 ; 1231 13$: BNE 16$ TST PRI.PB+12 ; 12368 BNE 17$$ BIT #1,MUST.HAVE.DEVICE ; 1243 BEQ 14$ TRAP 244S14$: MOV 14(SP),R0 ; 1244  BIT #10200,26(R0) BNE 17$ MOV $SAHDB,KISAR6 ; 1248 MOV R0,R3 ; 1249 ADD #2,R3 MOV 10(SP),R4 MOV 12(SP),R5 JSR PC,$MPLUN ROL (SP)R MOV R2,20(SP) ROR (SP)T BCS 15$& CLR 16(SP) ; DO.ASSIGN.LUN 1255 BR 17$ ; 1249C,15$: MOV #SECONDARY,R0 ; *,DEV.PTR 1281& MOVB #123,(R0)+ ; *,DEV.PTR 1282& MOVB #131,(R0)+ ; *,DEV.PTR 1283% MOVB #72,(R0)+ ; *,DEV.PTR 1284U MOV #SECONDARY,R4 ; 12851 MOV #3,R5 JSR PC,FSS1 JSR PC,MERGE ; 1286 CMP R0,#1 BNE 16$ MOV 14(SP),R3 ; 1287  JSR PC,EXPAND.FILESPEC CMP R0,#1 BNE 16$ TST PRI.PB+6 ; 1292 00aêooßmæàmçámýfáþfDATA16$: BEQ 17$ JMP 73$-17$: BIT #1,16(SP) ; *,DO.ASSIGN.LUN 1303R BEQ 23$ MOV 14(SP),R0 BIT #10200,26(R0) BNE 23$ CMP PRI.PB+10,#3 ; 1330 BLO 19$ ; 1333 CLR R1 ; UNIT.NUMBER 1339 V];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 62 W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)( MOV PRI.PB+12,R2 ; *,UNIT.PTR 1340 ADD #2,R2 ; *,UNIT.PTR18$: CLR R3 ; CHAR 1345 BISB (R2)+,R3 ; UNIT.PTR,CHAR CMP R3,#72 ; CHAR,*N BEQ 21$ CMP R3,#60 ; CHAR,* 1351T BLO 19$ CMP R3,#67 ; CHAR,*P BLOS 20$ 919$: MOV #IE.IDU.RETURN,6(SP) ; *,ASSIGN.LUN.ERRO 1354  BR 23$ ; 1353i)20$: MOV R1,R0 ; UNIT.NUMBER,* 1358 ASH #3,R0 ADD R3,R0 ; CHAR,* MOV R0,R1 ; *,UNIT.NUMBER  SUB #60,R1 ; *,UNIT.NUMBER BR 18$ ; 1345(#21$: MOV $SAHDB,KISAR6 ; 1375P MOV #2,R0 ; 1377 ADD 14(SP),R0 MOV R0,R3 TSTB (R3) BEQ 22$ MOV 10(SP),R4 ; 1379 MOV 12(SP),R5 MOV @PRI.PB+12,R0 MOV TERMINAL.LOGICAL.FLAG,R2T JSR PC,LUN.ASSIGN# MOV R0,6(SP) ; *,ASSIGN.LUN.ERROV MOV R1,20(SP) BR 23$ ; 1377R222$: MOV #IE.ILU.RETURN,6(SP) ; *,ASSIGN.LUN.ERRO(23$: BIT #1,MUST.HAVE.DEVICE ; 1401 BEQ 24$ JMP 89$*24$: TST 6(SP) ; ASSIGN.LUN.ERRO 1402 BNE 26$ MOV 14(SP),R0 BIT #10200,26(R0) BNE 26$( MOV #SECONDARY,R3 ; *,DEV.PTR 1426! MOV 20(SP),R0 ; UCB,* 1432, MOV 12(SP),R5 JSR PC,$MPLND MOV R2,20(SP) MOV #DV.REC,R1 ; 1440 BIS #DV.SDI,R1V BIS #DV.SQD,R1.) BIT U.CW1(R0),R1 ; *(REDIRECTED.UCB),*  BEQ 25$( CLR DO.DIRECTORY.DEFAULTING ; 1442%25$: MOV 20(SP),R0 ; UCB,* 1444P MOV U.DCB(R0),R2 ; *(UCB),DCB U];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 63EW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)4& SUB D.UCB(R2),R0 ; *(DCB),* 1449 MOV R0,R1 SXT R0, DIV D.UCBL(R2),R0 ; *(DCB),*R CLR R1 ; 1450S BISB D.UNIT(R2),R1 ; *(DCB),* ADD R1,R0& MOVB #137,(R3)+ ; *,DEV.PTR 1452/ MOVB D.NAM(R2),(R3)+ ; *(DCB),DEV.PTR 1453V0 MOVB D.NAM+1(R2),(R3)+ ; *(DCB),DEV.PTR 1454 JSR PC,DCBTA.BLI ; 1460% MOVB #72,(R3)+ ; *,DEV.PTR 14658 SUB #SECONDARY,R3 ; 1471P MOV #SECONDARY,R4 MOV R3,R5 JSR PC,FSS- CLR PRI.PB+10 ; 1477P CLR PRI.PB+12 ; 1478B JSR PC,MERGE ; 1479 CMP R0,#1 BNE 39$26$: CLR R3 ; 1488  CMP PRI.PB+14,#3R BLO 27$ INC R3B"27$: MOV PRI.PB+16,R0 ; 1489 CLR R2M CMPB 1(R0),#56; BNE 28$ INC R228$: CLR R1 ; 1490( CMPB 1(R0),#555 BNE 29$ INC R1229$: BIS R2,R1 ; 1489+ MOV R1,16(SP) ; *,MERGE.DIRECTORY 1488, MOV R3,R0 COM R0 $ BIC R0,16(SP) ; *,MERGE.DIRECTORY* BIT #1,DO.DIRECTORY.DEFAULTING ; 1492 BEQ 30$ MOV 14(SP),R0 ; 1493R BIT #10100,26(R0) BEQ 31$ 30$: JMP 63$31$: TST PRI.PB+16 ; 14946 BEQ 32$ CMP PRI.PB+14,#2 ; 1495 BEQ 32$+ BIT #1,16(SP) ; *,MERGE.DIRECTORY 14964 BEQ 30$32$: MOV 12(SP),R1 ; 1533I MOV T.CTX(R1),R0  BNE 34$ (];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 64EW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)O MOV T.UCB(R1),R0 ; 1537 BIT U.CW1(R0),#DV.PSE BNE 33$ MOV U.CTX(R0),R06 BR 34$Q 33$: CLR R0P34$: MOV R0,KISAR6 ; 15331 BEQ 35$ ; 1543" CLR R5 ; DEFAULT.LENGTH 1552& BISB @#140001,R5 ; *,DEFAULT.LENGTH' MOV R5,R1 ; DEFAULT.LENGTH,* 15531 MOV #-37774,R2R MOV #SECONDARY,R3 JSR PC,CH$COPY  BR 36$ ; 1533u&35$: CLR R5 ; DEFAULT.LENGTH 1556#36$: MOV #SECONDARY,R4 ; 1561C JSR PC,FSS- MOV R5,20(SP) BEQ 40$ ; 1562'37$: MOV #SECONDARY,PRIMARY ; 1569 38$: MOV #PRI.PB,R1 ; 1570 JSR PC,SAVE.PARSE MOV #-3440,PRI.PB ; 1571:39$: JMP 73$ ; 156400aòo¥nn´cÚµcÛ¶c�·c›’40$: TST SCR.PB+16 ; 1577  BEQ 41$ CMP SCR.PB+14,#2 ; 1578 BEQ 41$ BIT #7,SCR.PB+2 ; 1579  BEQ 48$"41$: MOV #H.DUIC+1,R1 ; 1602 ADD 10(SP),R1 MOV R1,R0 MOV #H.DUIC,R2 ; 1603 ADD 10(SP),R2 MOV R2,R1 MOV $SAHDB,KISAR6 ; 1605,( MOV #SECONDARY,R5 ; *,DIR.PTR 1606& MOVB #133,(R5)+ ; *,DIR.PTR 1607 BITB #300,(R0) ; 1613 BEQ 42$ MOVB (R0),R2 ; 1616R ASH #-6,R2E BIC #177774,R2. ADD #60,R27 MOVB R2,(R5)+ ; *,DIR.PTR BR 43$ ; 1617;42$: BITB #70,(R0) ; 1620+ BEQ 44$43$: MOVB (R0),R2 ASH #-3,R2B BIC #177770,R2 ADD #60,R2: V];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 65PW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)6 MOVB R2,(R5)+ ; *,DIR.PTR44$: MOVB (R0),R2 ; 1621  BIC #177770,R2 ADD #60,R2  MOVB R2,(R5)+ ; *,DIR.PTR% MOVB #54,(R5)+ ; *,DIR.PTR 16232 BITB #300,(R1) ; 1628 BEQ 45$ MOVB (R1),R0 ; 1631 ASH #-6,R0Q BIC #177774,R0R ADD #60,R0# MOVB R0,(R5)+ ; *,DIR.PTR BR 46$ ; 1632o45$: BITB #70,(R1) ; 16359 BEQ 47$46$: MOVB (R1),R04 ASH #-3,R0g BIC #177770,R0o ADD #60,R0d MOVB R0,(R5)+ ; *,DIR.PTR47$: MOVB (R1),R0 ; 16366 BIC #177770,R0+ ADD #60,R0R MOVB R0,(R5)+ ; *,DIR.PTR& MOVB #135,(R5)+ ; *,DIR.PTR 1641 SUB #SECONDARY,R5 ; 1646  MOV #SECONDARY,R4 JSR PC,FSS/48$: BIT #1,16(SP) ; *,MERGE.DIRECTORY 1652) BEQ 62$( MOV PRI.PB+16,R2 ; *,USER.DIR 1671 INC R2 ; USER.DIR(+ MOV SCR.PB+36,R5 ; *,DEFAULT.DIR 16725 SUB #2,R5 ; *,DEFAULT.DIR MOV SCR.PB+36,R1 ; 1679 MOVB -1(R1),R0 ; *,BRACKETA MOV SCR.PB+16,R4 ; 1705)49$: CMPB (R2),#55 ; USER.DIR,* 1685 BNE 52$ INC R2 ; USER.DIR 1687(( CMPB (R5),#56 ; DEFAULT.DIR,* 1692 BEQ 59$ ; 1694)50$: CMP R5,R4 ; DEFAULT.DIR,* 1705, BEQ 49$ ; 1707( CMPB (R5),#56 ; DEFAULT.DIR,* 1709 BNE 51$ DEC R5 ; DEFAULT.DIR 1712 BR 49$ ; 1711U$51$: DEC R5 ; DEFAULT.DIR 1716 BR 50$ ; 1699#,52$: CMPB (R5),#56 ; DEFAULT.DIR,* 1724 BEQ 59$ ; 1726 MOV PRI.PB+16,R1 ; 1764 R];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 661W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)  ADD PRI.PB+14,R10 DEC R14% CMP R5,R4 ; DEFAULT.DIR,* 1731F BNE 55$% CMPB (R2),#56 ; USER.DIR,* 1741T BNE 53$ INC R2 ; USER.DIR 1748:% CMPB (R2),#56 ; USER.DIR,* 17540 BNE 53$ DEC R2 ; USER.DIR 1756D&53$: CMP R2,R1 ; USER.DIR,* 1764 BNE 57$ MOV #6,R3 ; *,I 1767$54$: INC R5 ; DEFAULT.DIR 1769( MOVB #60,(R5) ; *,DEFAULT.DIR 1770 SOB R3,54$ ; I,* 1767n BR 56$ ; 17319&55$: CMP R2,R1 ; USER.DIR,* 1783 BEQ 58$% CMPB (R2),#56 ; USER.DIR,* 1785R BEQ 56$ INC R5 ; DEFAULT.DIR 1788( MOVB #56,(R5) ; *,DEFAULT.DIR 1789&56$: CMP R2,R1 ; USER.DIR,* 1798 BEQ 58$$57$: INC R5 ; DEFAULT.DIR 18000 MOVB (R2)+,(R5) ; USER.DIR,DEFAULT.DIR 1801 BR 56$ ; 1798$58$: INC R5 ; DEFAULT.DIR 1809- MOVB R0,(R5) ; BRACKET,DEFAULT.DIR 18106 SUB R4,R5 ; 1811 INC R5S MOV #SECONDARY,R4 JSR PC,FSS  MOV R5,20(SP) BEQ 60$ ; 181759$: MOV #-720,R3 ; 1819 MOV R3,PRI.PB BR 61$ ; 1817B60$: MOV #1,R3$61$: CMP R3,#1 ; STATUS,* 1828 BEQ 62$# MOV #SECONDARY,PRIMARY ; 1835  MOV #PRI.PB,R1 ; 1836 JSR PC,SAVE.PARSE# MOV R3,PRI.PB ; STATUS,* 1837  BR 73$ ; 1830 62$: CLR PRI.PB+14 ; 18468 CLR PRI.PB+16 ; 1847  JSR PC,MERGE ; 1848$63$: MOVB #40,SECONDARY ; 1860 CLR R0 ; DO.MERGE 1861E MOV 14(SP),R2 ; 1862V MOV 26(R2),R1 $];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 67VW;X00aúooßmæàmçámýfáþfDATA1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)3 BIT #400,R1 BEQ 64$ CLR PRI.PB+6 ; 1865 CLR PRI.PB+4 ; 1866" MOV #1,R0 ; *,DO.MERGE 186764$: TSTB R1 ; 1869 BPL 65$ CLR PRI.PB+12 ; 1872P CLR PRI.PB+10 ; 1873V" MOV #1,R0 ; *,DO.MERGE 1874&65$: CMPB @PRI.PB+12,#137 ; 1880 BNE 66$ INC PRI.PB+12 ; 1883P DEC PRI.PB+10 ; 1884 " MOV #1,R0 ; *,DO.MERGE 188566$: BIT #100,R1 ; 1888 BEQ 67$ CLR PRI.PB+16 ; 18918 CLR PRI.PB+14 ; 1892B" MOV #1,R0 ; *,DO.MERGE 189367$: BIT #4,R1 ; 1895 BEQ 68$ CLR PRI.PB+22 ; 18980 CLR PRI.PB+20 ; 1899:" MOV #1,R0 ; *,DO.MERGE 190068$: BIT #2,R1 ; 1907 BEQ 69$ CLR PRI.PB+26 ; 1910  CLR PRI.PB+24 ; 1911C BR 70$ ; 1912 .69$: BIT #1,DO.DIRECTORY.DEFAULTING ; 1915 BEQ 71$ BIT #10000,R1 BNE 71$ MOVB #56,SECONDARY ; 1918&70$: MOV #1,R0 ; *,DO.MERGE 191971$: ROR R1 ; 19228 BCC 72$ CLR PRI.PB+32 ; 1925, CLR PRI.PB+30 ; 19267" MOV #1,R0 ; *,DO.MERGE 1927!72$: ROR R0 ; DO.MERGE 1929R BCC 73$ MOV #SECONDARY,R4 ; 1931, MOV #1,R5 JSR PC,FSST JSR PC,MERGE ; 1932(73$: BIT #1,MUST.HAVE.DEVICE ; 1944 BEQ 74$ JMP 89$74$: MOV 14(SP),R0 ; 1947T MOV 14(R0),4(SP) ; *,B.ADDR MOV PRI.PB+36,R0 ; 1948 BEQ 75$ M];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 682W;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)  SUB PRIMARY,R0 ; 1950 ADD PRI.PB+34,R02 MOV R0,R3 ; *,RES.LENGTH BR 76$ ; 1948##75$: CLR R3 ; RES.LENGTH 1952 "76$: TST 4(SP) ; B.ADDR 1954 BEQ 78$" MOV 4(SP),R0 ; B.ADDR,* 1957 MOV #2,R1 JSR PC,$ACHKB BHIS 77$P TRAP 236D&77$: MOV 4(SP),R0 ; B.ADDR,* 1958 JSR PC,$RELOM MOV R0,R4 ; *,Pi& MOV R3,(R4) ; RES.LENGTH,P 195978$: TST PRI.PB+30 ; 19660 BEQ 79$ MOVB #73,@PRI.PB+3279$: MOV 14(SP),R0 ; 1971P MOV 10(R0),4(SP) ; *,B.ADDR% MOV 12(R0),2(SP) ; *,B.LEN 1972M" MOV 4(SP),R0 ; B.ADDR,* 1973 JSR PC,$RELOC MOV R1,R5 MOV R2,R4 MOV #PRI.PB,-(SP) ; 1974  MOV PRIMARY,-(SP) MOV 10(SP),-(SP) ; B.ADDR,* JSR PC,CONVERT.PARSEJ TST 10(SP) ; B.LEN 19763 BEQ 83$ TST 12(SP) ; B.ADDR 1980 BNE 80$ TRAP 236R'80$: MOV 12(SP),R0 ; B.ADDR,* 1986G MOV 10(SP),R1 ; B.LEN,* JSR PC,$ACHKB BHIS 81$$ TRAP 236,#81$: TST R3 ; RES.LENGTH 1988  BEQ 83$ MOV R3,R0 ; RES.LENGTH,* CMP R0,10(SP) ; *,B.LEN BLOS 82$ MOV 10(SP),R0 ; B.LEN,*82$: MOV KISAR5,R1 MOV PRIMARY,R2M MOV R5,R3 ; B.MAPPING,*  JSR PC,$BLXIO483$: MOV 30(SP),PRI.PB+2 ; FLAGS.FOR.USER,* 1995$ BIT #1,CANNOT.HAVE.NODE ; 1996 BEQ 84$ TST PRI.PB+6 T];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 69MW;X1.10 Common Parse Code 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (24)N BEQ 84$ MOV #-270,PRI.PB ; 199784$: MOV 22(SP),R0 ; 1998L MOV 16(R0),12(SP) ; *,B.ADDR;& MOV 20(R0),10(SP) ; *,B.LEN 1999 BEQ 88$ ; 2001 TST 12(SP) ; B.ADDR 2005: BNE 85$ TRAP 236 '85$: MOV 12(SP),R0 ; B.ADDR,* 2011T MOV 10(SP),R1 ; B.LEN,* JSR PC,$ACHKB BHIS 86$D TRAP 236a'86$: MOV 12(SP),R0 ; B.ADDR,* 2013  JSR PC,$RELOC MOV R1,R5 MOV R2,12(SP)" MOV 10(SP),R0 ; B.LEN,* 2014 CMP R0,#46X BLOS 87$P MOV #46,R0587$: MOV KISAR5,R1 MOV #PRI.PB,R2P MOV R5,R3 ; B.MAPPING,*P MOV 12(SP),R4 ; B.ADDR,*0 JSR PC,$BLXIO88$: ADD #6,SP ; 1946*89$: TST 6(SP) ; ASSIGN.LUN.ERRO 2024 BEQ 90$$ JSR PC,@6(SP) ; *,ASSIGN.LUN.ERRO90$: CMP PRI.PB,#1 ; 2025D BEQ 91$ TRAP 353(91$: ADD #24,SP ; 1044H RTS PC 9; Routine Size: 1005 words, Routine Base: $CODE$ + 1074J/; Maximum stack depth pe00ap¥nn´cÚµcÛ¶c�·c›’r invocation: 21 words( .NLIST; .DSABL LSB0 .NLIST BIN,LOC .LIST V];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 70;^;X1.10 Expand file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (25).; 2029 1 %SBTTL 'Expand file specification'; 2030 1 GLOBAL_FOR_DEBUGC; 2031 1 ROUTINE expand_filespec (dpb_ptr) : expand_filespec_l = ; 2032 1 ; 2033 1 !++, ; 2034 1 ! %; 2035 1 ! FUNCTIONAL DESCRIPTION:e ; 2036 1 !2I; 2037 1 ! This routine expands a file specification by merging in the H; 2038 1 ! translations of any logicals present in the initial input.J; 2039 1 ! The string must be in the primary buffer. It must be parsedN; 2040 1 ! already. The output is in the primary buffer and in the primary; 2041 1 ! parse block. ; 2042 1 ! .; 2043 1 ! The following algorithm is used:; 2044 1 ! O; 2045 1 ! 1) Separate a potential logical from the string, and put it in a eK; 2046 1 ! buffer. If there is no potential logical, return success.mU; 2047 1 ! The primary buffer and parse block will always contain file elements.5; 2048 1 ! that we know are not to be expanded.r ; 2049 1 !a7; 2050 1 ! 2) Repeat until we run out of iterations:y ; 2051 1 !t'; 2052 1 ! 2.1) Expand the logical U; 2053 1 ! 2.2) If a logical was found, copy the expand buffer to the secondary M; 2054 1 ! buffer. If not, copy the unexpanded logical to the secondary.6D; 2055 1 ! Set the terminal logical flag if status was terminal.); 2056 1 ! 2.3) Parse the secondary.sS; 2057 1 ! 2.4) If the status of the expand was success, separate the logicalb<; 2058 1 ! from the rest of the string in the secondary.T; 2059 1 ! 2.5) If there is anything in the secondary buffer, merge it with the; 2060 1 ! primary.oS; 2061 1 ! 2.6) If the status of both the expand and the separate was success,f2; 2062 1 ! go again; otherwise return success. ; 2063 1 ! M; 2064 1 ! 3.0) If we got here, too many iterations, return bad recursive.r; 2065 1 ! ; 2066 1 ! ; 2067 1 ! IMPLICIT INPUTS: ; 2068 1 !,R; 2069 1 ! The file specification parsed in the primary buffer and parse block. ; 2070 1 ! +; 2071 1 ! The translation inhibit mask.b ; 2072 1 ! ; 2073 1 !--0 ; 2074 1 ; 2075 2 BEGIN ; 2076 2 ; 2077 2 MAPeB; 2078 2 dpb_ptr : REF VECTOR; ! Treat the DPB as a vector ; 2079 2 ; 2080 2 LOCAL .; 2081 2 eqv_ptr : REF VECTOR [, BYTE],; 2082 2 eqv_len, i];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 719^;X1.10 Expand file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (25); 2083 2 status,n; 2084 2 mstatus; ; 2085 2 ; 2086 2 OWN 8; 2087 2 log_hold : VECTOR [ logical_size, BYTE],; 2088 2 log_len; ; 2089 2 T; 2090 2 ROUTINE separate_logical ( dpb_ptr, parse_block ) : separate_logical_l = ; 2091 2 ; 2092 2 !++ ; 2093 2 !%; 2094 2 ! FUNCTIONAL DESCRIPTION: ; 2095 2 !8P; 2096 2 ! This routine strips off the element of the string that could be a M; 2097 2 ! logical and puts it in a special buffer to be used for logical tS; 2098 2 ! expansion. It takes the parse block of the string to be processed asoQ; 2099 2 ! input. It returns success if an element has been removed from the 0F; 2100 2 ! string, and failure if the string has not been modified. ; 2101 2 ! ; 2102 2 !--+ ; 2103 2 ; 2104 3 BEGINC ; 2105 3 ; 2106 3 MAP8;; 2107 3 parse_block : REF BLOCK FIELD (parse_block_f),rC; 2108 3 dpb_ptr : REF VECTOR; ! Treat the DPB as a vectorb ; 2109 3 W; 2110 3 ! Strip off the logical and put it in log_hold, with the length in log_len.p ; 2111 3 _; 2112 3 CASE .parse_block [logical_type] from logical_type_none TO logical_type_node OF ; 2100a papßmæàmçámýfáþfDATA13 3 SET ; 2114 3 "; 2115 3 [logical_type_node] :5; 2116 3 IF (.dpb_ptr [11] AND FS$NOD) EQLU 0E; 2117 3 THEN ; 2118 4 BEGIN ; 2119 4 !oE; 2120 4 ! A node specification is present - it may be a logicalV; 2121 4 !ha; 2122 4 ch$copy (.parse_block [node_len], .parse_block [node_addr], log_hold [0]; log_len);t*; 2123 4 parse_block [node_addr] = 0;); 2124 4 parse_block [node_len] = 0;f,; 2125 4 parse_block [access_addr] = 0;+; 2126 4 parse_block [access_len] = 0; P; 2127 4 parse_block [flags] = .parse_block [flags] AND NOT FS$NOD; !PKW117; 2128 4 END ; 2129 3 ELSE; 2130 3 RETURN error; ; 2131 3 $; 2132 3 [logical_type_device] :5; 2133 3 IF (.dpb_ptr [11] AND FS$DEV) EQLU 0_; 2134 3 THENe; 2135 4 BEGINo; 2136 4 !e t];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 721^;X1.10 Expand file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (25)G; 2137 4 ! A device specification is present - it may be a logical ; 2138 4 ! e; 2139 4 ch$copy (.parse_block [device_len], .parse_block [device_addr], log_hold [0]; log_len);,; 2140 4 parse_block [device_addr] = 0;+; 2141 4 parse_block [device_len] = 0; H; 2142 4 parse_block [flags] = .parse_block [flags] AND NOT FS$DEV;; 2143 4 END1; 2144 3 ELSEP; 2145 3 RETURN error; ; 2146 3 &; 2147 3 [logical_type_filename] :5; 2148 3 IF (.dpb_ptr [11] AND FS$NAM) EQLU 0i; 2149 3 THENm; 2150 4 BEGIN ; 2151 4 ! T; 2152 4 ! A standalone filename specification is present - it may be a logical; 2153 4 ! i; 2154 4 ch$copy (.parse_block [filename_len], .parse_block [filename_addr], log_hold [0]; log_len);_.; 2155 4 parse_block [filename_addr] = 0;-; 2156 4 parse_block [filename_len] = 0;PT; 2157 4 parse_block [flags] = .parse_block [flags] AND NOT (FS$NAM OR FS$WNA);; 2158 4 END ; 2159 3 ELSEA; 2160 3 RETURN error;T ; 2161 3 "; 2162 3 [logical_type_none] :; 2163 3 RETURN error;; 2164 3 TES;p ; 2165 3 /; 2166 3 log_len = .log_len - log_hold [0];h; 2167 3 RETURN success; ; 2168 3 0; 2169 2 END; ! Routine separate_logical .NLIST  .LIST BIN,LOC .LIST .PSECT $OWN$, D LOG.HOLD: .BLKB 377 .EVENLOG.LEN:.BLKW 1a2 .SBTTL SEPARATE.LOGICAL Expand file specification .PSECT $CODE$, RO  .NLIST .ENABL LSB  .LISTSEPARATE.LOGICAL:U JSR R1,$SAVE3 ; 2090  CLR R0 ; 2112n ]];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 73o^;X1.10 Expand file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (25)$ BISB 44(R4),R0 ; *(PARSE.BLOCK),* ASL R0.# ADD P.AAA(R0),PC ; Case dispatchO,2$: BIT #400,26(R3) ; *,*(DPB.PTR) 2116 BNE 6$ ) MOV 4(R4),R1 ; *(PARSE.BLOCK),* 2122" MOV 6(R4),R2 ; *(PARSE.BLOCK),* MOV #LOG.HOLD,R3 JSR PC,CH$COPYU MOV R3,LOG.LEN % CLR 6(R4) ; *(PARSE.BLOCK) 2123]% CLR 4(R4) ; *(PARSE.BLOCK) 2124-& CLR 42(R4) ; *(PARSE.BLOCK) 2125& CLR 40(R4) ; *(PARSE.BLOCK) 2126+ BIC #400,2(R4) ; *,*(PARSE.BLOCK) 2127E BR 5$ ; 2116'3$: TSTB 26(R3) ; *(DPB.PTR) 2133) BMI 6$R* MOV 10(R4),R1 ; *(PARSE.BLOCK),* 2139# MOV 12(R4),R2 ; *(PARSE.BLOCK),*  MOV #LOG.HOLD,R3V JSR PC,CH$COPYA MOV R3,LOG.LEN2& CLR 12(R4) ; *(PARSE.BLOCK) 2140& CLR 10(R4) ; *(PARSE.BLOCK) 2141+ BIC #200,2(R4) ; *,*(PARSE.BLOCK) 2142) BR 5$ ; 2133*4$: BIT #4,26(R3) ; *,*(DPB.PTR) 2148 BNE 6$B* MOV 20(R4),R1 ; *(PARSE.BLOCK),* 2154# MOV 22(R4),R2 ; *(PARSE.BLOCK),*S MOV #LOG.HOLD,R3B JSR PC,CH$COPY6 MOV R3,LOG.LEN & CLR 22(R4) ; *(PARSE.BLOCK) 2155& CLR 20(R4) ; *(PARSE.BLOCK) 2156* BIC #44,2(R4) ; *,*(PARSE.BLOCK) 2157%5$: SUB #LOG.HOLD,LOG.LEN 00ap¥nn´cÚµcÛ¶c�·c›’ ; 2166, MOV #1,R0 ; 2104 RTS PCB6$: CLR R0 ; 2090 RTS PCR7; Routine Size: 84 words, Routine Base: $CODE$ + 50264.; Maximum stack depth per invocation: 5 words .PSECT $PLIT$, RO , D 6P.AAA: ; CASE Table for SEPARATE.LOGICA+0014 21121$: .WORD 224 ; [6$]M .WORD 136 ; [4$] .WORD 64 ; [3$], .WORD 0 ; [2$] ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 74B^;X1.10 Expand file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (25) .NLIST .DSABL LSBR .NLIST BIN,LOCe .LIST ; 2170 2 K; 2171 2 terminal_logical_flag = false; ! Init the flag to not terminal h; 2172 2 status = separate_logical ( .dpb_ptr, pri_pb ); ! Strip off the logical in the initial input(; 2173 2 IF .status EQLU success THEN ; 2174 2 !2Q; 2175 2 ! For no more than the maximum interation count, translate and merge,1; 2176 2 ! if possible ; 2177 2 !c; 2178 3 BEGIN11; 2179 3 DECR i FROM iteration_max TO 1 DO; 2180 4 BEGINSI; 2181 4 ! I assume that the status returned will be success, error,l4; 2182 4 ! or the successful status of terminal; 2183 4 !sS; 2184 4 status = find_equivalence (log_hold [0], .log_len; eqv_ptr, eqv_len); (; 2185 4 IF .status EQLU error THENJ; 2186 4 ch$copy (.log_len, log_hold [0], secondary [0]; eqv_ptr); 2187 4 ELSE; 2188 5 BEGINlG; 2189 5 ch$copy (.eqv_len, .eqv_ptr, secondary [0]; eqv_ptr);t/; 2190 5 IF .status EQLU terminal THEN1,; 2191 5 terminal_logical_flag = true;; 2192 4 END;N; 2193 4 fss (secondary [0], .eqv_ptr - secondary [0]; eqv_ptr, eqv_len); ; 2194 4 IF .eqv_len NEQU 0; 2195 4 THEN; 2196 5 BEGIN ; 2197 5 ; 2198 5 !N5; 2199 5 ! Settup the bad string for return.c; 2200 5 !; 2201 5 merge();Q; 2202 5 RETURN pri_pb [fss_status] = bad_char; ! Settup the error code_; 2203 5 ; 2204 4 END;*; 2205 4 IF .status EQLU success THENA; 2206 4 status = separate_logical ( .dpb_ptr, scr_pb );yu; 2207 4 IF (.scr_pb [node_len] NEQU 0) OR (.scr_pb [device_len] NEQU 0) OR (.scr_pb [directory_len] NEQU 0) OR u; 2208 4 (.scr_pb [filename_len] NEQU 0) OR (.scr_pb [type_len] NEQU 0) OR (.scr_pb [version_len] NEQU 0) OR V; 2209 4 (.scr_pb [trailing_len] NEQU 0) OR (.scr_pb [access_len] NEQU 0) THEN; 2210 5 BEGINd!; 2211 5 mstatus = merge(); S; 2212 5 IF .mstatus NEQU success THEN RETURN pri_pb [fss_status] = .mstatus;p; 2213 4 END;:; 2214 4 IF .status NEQU success THEN RETURN success;; 2215 3 END; ; 2216 3 !  r];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 75n^;X1.10 Expand file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (25)V; 2217 3 ! If we got here, then the number of iterations exceeded iteration_max; 2218 3 !2O; 2219 3 RETURN pri_pb [fss_status] = bad_recursive; ! Return error code ; 2220 3 END; 2221 2 ELSE; 2222 2 RETURN success;u; 2223 1 END; .NLISTD .LIST BIN,LOC .LIST1 .SBTTL EXPAND.FILESPEC Expand file specification: .PSECT $CODE$, RO  .NLIST .ENABL LSBX .LISTEXPAND.FILESPEC: JSR R1,$SAVE5 ; 2031[ SUB #14,SPR MOV R3,12(SP)& CLR TERMINAL.LOGICAL.FLAG ; 2171 MOV #PRI.PB,R4 ; 2172 JSR PC,SEPARATE.LOGICAL MOV R0,10(SP) ; *,STATUS9 CMP R0,#1 ; STATUS,* 2173 BNE 9$c MOV #12,6(SP) ; *,I 2179 !1$: MOV #LOG.HOLD,R1 ; 2184 MOV LOG.LEN,R2E JSR PC,FIND.EQUIVALENCE MOV R0,10(SP) ; *,STATUSL MOV R1,2(SP). MOV R2,(SP) TST R0 ; STATUS 2185t BNE 2$S MOV LOG.LEN,R1 ; 2186 MOV #LOG.HOLD,R2T MOV #SECONDARY,R3 JSR PC,CH$COPY; MOV R3,2(SP)B BR 3$ ; 2185&2$: MOV (SP),R1 ; EQV.LEN,* 218900appßmæàmçámýfáþfDATA MOV 2(SP),R2 ; EQV.PTR,*1 MOV #SECONDARY,R3 JSR PC,CH$COPY, MOV R3,2(SP)A# CMP 10(SP),#3 ; STATUS,* 21903 BNE 3$c( MOV #1,TERMINAL.LOGICAL.FLAG ; 2191&3$: MOV 2(SP),R1 ; EQV.PTR,* 2193 SUB #SECONDARY,R1 MOV #SECONDARY,R4 MOV R1,R5 S];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 76 ^;X1.10 Expand file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (25) JSR PC,FSS MOV R4,2(SP); MOV R5,(SP) BEQ 4$ ; 2194  JSR PC,MERGE ; 2201 MOV #-3440,R0 ; 2202, BR 8$&4$: CMP 10(SP),#1 ; STATUS,* 2205 BNE 5$M MOV 12(SP),R3 ; 2206  MOV #SCR.PB,R4  JSR PC,SEPARATE.LOGICAL MOV R0,10(SP) ; *,STATUSV5$: TST SCR.PB+4 ; 2207 BNE 6$o TST SCR.PB+10 BNE 6$  TST SCR.PB+14 BNE 6$1 TST SCR.PB+20 ; 22087 BNE 6$0 TST SCR.PB+24 BNE 6$o TST SCR.PB+30 BNE 6$[ TST SCR.PB+34 ; 22090 BNE 6$ TST SCR.PB+40 BEQ 7$P6$: JSR PC,MERGE ; 2211  MOV R0,4(SP) ; *,MSTATUS ! CMP R0,#1 ; MSTATUS,* 2212, BNE 8$&7$: CMP 10(SP),#1 ; STATUS,* 2214 BNE 9$ DEC 6(SP) ; I 2179 BNE 1$C MOV #-3230,R0 ; 2219G8$: MOV R0,PRI.PB) BR 10$ ; 2222 9$: MOV #1,R0 10$: ADD #14,SP ; 20310 RTS PC 8; Routine Size: 138 words, Routine Base: $CODE$ + 5276/; Maximum stack depth per invocation: 13 words .NLIST .DSABL LSB4 .NLIST BIN,LOCB .LIST ; 2224 1 Q P];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 771^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26).; 2225 1 %SBTTL 'Merge file specifications'; 2226 1 GLOBAL_FOR_DEBUG; 2227 1 ROUTINE merge =S ; 2228 1 ; 2229 1 !++ ; 2230 1 !1%; 2231 1 ! FUNCTIONAL DESCRIPTION: ; 2232 1 ! L; 2233 1 ! Merge the primary and secondary file specifications. For eachN; 2234 1 ! component of the file specification, copy the piece found in theL; 2235 1 ! primary if present, or copy the piece from the secondary. TheL; 2236 1 ! result is put in merged. At the end the primary string is theE; 2237 1 ! merged result and the primary parse block is filled in.2 ; 2238 1 !eM; 2239 1 ! The handling of a file specification containing a quoted stringLP; 2240 1 ! is slightly different. A quoted string name in the primary stringS; 2241 1 ! inhibits the inclusion of both the filename and type, and the versionh(; 2242 1 ! if a node name is present. ; 2243 1 !r; 2244 1 ! IMPLICIT INPUTS: ; 2245 1 !2'; 2246 1 ! Buffers and parse blocks.e ; 2247 1 !s; 2248 1 ! IMPLICIT OUTPUTS:d ; 2249 1 ! 1; 2250 1 ! The primary parse block is updated. ; 2251 1 !h; 2252 1 !--i ; 2253 1 ; 2254 2 BEGINt ; 2255 2 ; 2256 2 !sR; 2257 2 ! A node spec followed by a quoted string with nothing else should notT; 2258 2 ! have anything merged into it other than a node name on the local node. ; 2259 2 !so; 2260 3 IF ((.pri_pb [flags] AND (FS$VER OR FS$TYP OR FS$NAM OR FS$DIR OR FS$DEV OR FS$NOD OR FS$QUO)) EQLU 7; 2261 3 (FS$NOD OR FS$QUO OR FS$NAM OR FS$TYP)) ; 2262 3 ; 2263 2 OR ; 2264 2 ; 2265 2 !2N; 2266 2 ! If the primary string has has anything other than a node and theN; 2267 2 ! secondary string is a node name followed by a quoted string thenN; 2268 2 ! everything in the secondary string except for the node should be; 2269 2 ! gotten rid of. ; 2270 2 !0 ; 2271 2 c; 2272 2 ((.pri_pb [flags] AND (FS$DIR OR FS$NAM OR FS$TYP OR FS$VER OR FS$QUO)) NEQU 0) AND m; 2273 3 ((.scr_pb [flags] AND (FS$VER OR FS$TYP OR FS$NAM OR FS$DIR OR FS$DEV OR FS$NOD OR FS$QUO)) EQLU8; 2274 3 (FS$NOD OR FS$QUO OR FS$NAM OR FS$TYP)); 2275 2 THEN; 2276 3 BEGINd); 2277 3 scr_pb [device_addr] = 0;t(; 2278 3 scr_pb [device_len] = 0; h];DRPFN Logical Name Directives 00a"p¥nn´cÚµcÛ¶c�·c›’ 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 78^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26),; 2279 3 scr_pb [directory_addr] = 0;+; 2280 3 scr_pb [directory_len] = 0;O+; 2281 3 scr_pb [filename_addr] = 0;4*; 2282 3 scr_pb [filename_len] = 0;'; 2283 3 scr_pb [type_addr] = 0;E&; 2284 3 scr_pb [type_len] = 0;*; 2285 3 scr_pb [version_addr] = 0;); 2286 3 scr_pb [version_len] = 0; @; 2287 3 IF .scr_pb [logical_type] NEQU logical_type_node; 2288 3 THEN7; 2289 3 scr_pb [logical_type] = logical_type_none;.; 2290 2 END; ; 2291 2 ; 2292 2 !dP; 2293 2 ! Copy the lengths and pointers into the primary parse block for allS; 2294 2 ! parts of the file specification to be used. In the process, form thebP; 2295 2 ! updated status mask. We are only going to set bits in the status. ; 2296 2 ! (; 2297 2 IF .pri_pb [node_len] EQLU 0; 2298 2 THEN ; 2299 2 B; 2300 2 IF (pri_pb [node_len] = .scr_pb [node_len]) NEQU 0; 2301 2 THEN; 2302 3 BEGIN8; 2303 3 pri_pb [flags] = .pri_pb [flags] OR FS$NOD;6; 2304 3 pri_pb [node_addr] = .scr_pb [node_addr];8; 2305 3 pri_pb [access_len] = .scr_pb [access_len];:; 2306 3 pri_pb [access_addr] = .scr_pb [access_addr];; 2307 2 END;e ; 2308 2 *; 2309 2 IF .pri_pb [device_len] EQLU 0; 2310 2 THEN ; 2311 2 F; 2312 2 IF (pri_pb [device_len] = .scr_pb [device_len]) NEQU 0; 2313 2 THEN; 2314 3 BEGIN8; 2315 3 pri_pb [flags] = .pri_pb [flags] OR FS$DEV;:; 2316 3 pri_pb [device_addr] = .scr_pb [device_addr];; 2317 2 END;n ; 2318 2 -; 2319 2 IF .pri_pb [directory_len] EQLU 0_; 2320 2 THEN ; 2321 2 L; 2322 2 IF (pri_pb [directory_len] = .scr_pb [directory_len]) NEQU 0; 2323 2 THEN; 2324 3 BEGINZ; 2325 3 pri_pb [flags] = .pri_pb [flags] OR (.scr_pb [flags] AND (FS$DIR OR FS$WDI));@; 2326 3 pri_pb [directory_addr] = .scr_pb [directory_addr];; 2327 2 END;i ; 2328 2 G; 2329 2 IF ((.pri_pb [flags] OR .scr_pb [flags]) AND FS$QUO) EQLU 0d; 2330 2 THEN; 2331 3 BEGIN8 ; 2332 3  ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 79[^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26); 2333 3 !s?; 2334 3 ! Here because neither string contains a quotedC; 2335 3 ! filespec. Handle the filename, type, and version #; 2336 3 ! in the usual way.9; 2337 3 !l0; 2338 3 IF .pri_pb [filename_len] EQLU 0; 2339 3 THEN ; 2340 3 G; 2341 3 IF (pri_pb [filename_len] = .scr_pb [filename_len]) NEQU 01; 2342 3 THEN4; 2343 4 BEGIN^; 2344 4 pri_pb [flags] = .pri_pb [flags] OR (.scr_pb [flags] AND (FS$NAM OR FS$WNA));B; 2345 4 pri_pb [filename_addr] = .scr_pb [filename_addr];; 2346 3 END;3 ; 2347 3 ,; 2348 3 IF .pri_pb [type_len] EQLU 0; 2349 3 THEN ; 2350 3 ?; 2351 3 IF (pri_pb [type_len] = .scr_pb [type_len]) NEQU 0n; 2352 3 THEN ; 2353 4 BEGIN^; 2354 4 pri_pb [flags] = .pri_pb [flags] OR (.scr_pb [flags] AND (FS$TYP OR FS$WTY));:; 2355 4 pri_pb [type_addr] = .scr_pb [type_addr];; 2356 3 END;p ; 2357 3 /; 2358 3 IF .pri_pb [version_len] EQLU 0l; 2359 3 THEN ; 2360 3 E; 2361 3 IF (pri_pb [version_len] = .scr_pb [version_len]) NEQU 0y; 2362 3 THEN ; 2363 4 BEGIN^; 2364 4 pri_pb [flags] = .pri_pb [flags] OR (.scr_pb [flags] AND (FS$VER OR FS$WVE));@; 2365 4 pri_pb [version_addr] = .scr_pb [version_addr];; 2366 3 END;s ; 2367 3 ; 2368 3 END5; 2369 2 ELSE; 2370 3 BEGINp ; 2371 3 ; 2372 3 !S; 2373 3 ! We are here because one or the other (or both) of the primary andP; 2374 3 00a*ppßmæàmçámýfáþfDATA ! secondary strings contain a quoted file specification. If theS; 2375 3 ! primary string contains either a filename or type then don't copyiA; 2376 3 ! either the filename or type from the secondary. R; 2377 3 ! If addition, if the primary includes a node name and the primaryX; 2378 3 ! has a filename, then don't copy the version number from the secondary.; 2379 3 ! N; 2380 3 IF .pri_pb [filename_len] EQLU 0 AND .pri_pb [type_len] EQLU 0; 2381 3 THEN; 2382 4 BEGIN ; 2383 4 ; 2384 4 !E; 2385 4 ! We are here because the primary string has no filenamemF; 2386 4 ! or type and the secondary string has a quoted filename. r];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 80p^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26)E; 2387 4 ! In this case the merged string will contain the quotedD+; 2388 4 ! filespec from the secondary.H; 2389 4 !L; 2390 4 pri_pb [flags] = .pri_pb [flags] OR FS$NAM OR FS$QUO OR FS$TYP;<; 2391 4 pri_pb [filename_len] = .scr_pb [filename_len];>; 2392 4 pri_pb [filename_addr] = .scr_pb [filename_addr];; 2393 3 END;- ; 2394 3 ; 2395 3 ! K; 2396 3 ! If the primary string has no version the version from the:E; 2397 3 ! secondary string will be merged in if there is one. ; 2398 3 !iM; 2399 3 IF .pri_pb [node_len] EQLU 0 AND .pri_pb [version_len] EQLU 0 ; 2400 3 THENE; 2401 3 IF (pri_pb [version_len] = .scr_pb [version_len]) NEQU 0 ; 2402 3 THEN_; 2403 4 BEGIN^; 2404 4 pri_pb [flags] = .pri_pb [flags] OR (.scr_pb [flags] AND (FS$VER OR FS$WVE));@; 2405 4 pri_pb [version_addr] = .scr_pb [version_addr];; 2406 3 END;v ; 2407 3 ; 2408 2 END; ; 2409 2 ; 2410 3 BEGINn ; 2411 3 ; 2412 3 ! @; 2413 3 ! Copy each of the substrings into the output bufferA; 2414 3 ! and update the pointers to point to the new buffer.p ; 2415 3 ! ; 2416 3 LOCALlI; 2417 3 pri_pb_p : REF VECTOR, ! Pointer to primary parse blockp*; 2418 3 status, ! Merge status; 2419 3 current_len,; 2420 3 total_len,; 2421 3 temp;b ; 2422 3 ; 2423 3 REGISTER; 2424 3 o_ptr; ; 2425 3 ; 2426 3 total_len = 0;; 2427 3 status = 1; &; 2428 3 pri_pb [trailing_len] = 0;'; 2429 3 pri_pb [trailing_addr] = 0; +; 2430 3 pri_pb_p = pri_pb [fss_status];t; 2431 3 o_ptr = merged [0]; ; 2432 3 ); 2433 3 INCRU i FROM 0 TO 5*2 BY 2 DOO; 2434 4 BEGINrB; 2435 4 current_len = .pri_pb_p [.i + 2]; ! Get the length6; 2436 4 total_len = .total_len + .current_len; ; 2437 4 1; 2438 4 IF .total_len GTRU file_spec_size ; 2439 4 THEN; 2440 5 BEGIN e];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 81r^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26) ; 2441 5 ; 2442 5 !G; 2443 5 ! Copy as much as will fit, then update the parse block torH; 2444 5 ! reflect the actual amount returned. I'm not sure if thisB; 2445 5 ! exactly the best way of dealing with the problem...;; 2446 5 ! How do you determine the real length needed? C; 2447 5 ! Here's how.... We will initialize the length of theAG; 2448 5 ! trailing string to 0 and on completion store the address B; 2449 5 ! of the next character following. This will make itC; 2450 5 ! easy to determine the length of the expanded string; G; 2451 5 ! just subtract the buffer beginning from [trailing_addr].rE; 2452 5 ! For the cases where the buffer overflows, we'll updateiB; 2453 5 ! the length to include the amount that wouldn't fit.; 2454 5 !c; 2455 5 pri_pb [trailing_addr] = merged [0] + file_spec_size; ! Get address of one past bufferg_; 2456 5 pri_pb [tra00a2p¥nn´cÚµcÛ¶c�·c›’iling_len] = .total_len - file_spec_size; ! Set to the amount attempted ; 2457 5 a; 2458 5 IF (current_len = .current_len - .pri_pb [trailing_len]) LSS 0 THEN current_len = 0;t ; 2459 5 (; 2460 5 ! Can't be less than 07; 2461 5 status = bad_size; ! Set eventual statusi; 2462 4 END;e ; 2463 4 ; 2464 5 BEGINu ; 2465 5 ; 2466 5 LOCAL ; 2467 5 i_ptr;d ; 2468 5 B; 2469 5 i_ptr = .pri_pb_p [.i + 2 + 1]; ! Get the addressZ; 2470 5 IF .i_ptr NEQA 0 THEN pri_pb_p [.i + 2 + 1] = .o_ptr; ! Update the addressG; 2471 5 ch$move (.current_len, i_ptr, o_ptr); ! Move the stringe; 2472 4 END; ; 2473 4 ; 2474 3 END; ! INCR ; 2475 3 ; 2476 3 !1Q; 2477 3 ! If the trailing length is non zero leave the trailing address aloneT; 2478 3 ! because it has been settup by an overflow condition. Otherwise settup#; 2479 3 ! the trailing address.p ; 2480 3 ! c; 2481 3 IF .pri_pb [trailing_len] EQLU 0 THEN pri_pb [trailing_addr] = merged [0] + .total_len;a ; 2482 3 ; 2483 3 ! ;; 2484 3 ! Settup the access control string information. ; 2485 3 !N*; 2486 3 IF .pri_pb [access_len] NEQU 0; 2487 3 THENk; 2488 3 pri_pb [access_addr] = .pri_pb [node_addr] + .pri_pb [node_len] - .pri_pb [access_len] - 2;8 ; 2489 3 ; 2490 3 !tC; 2491 3 ! Update the logical type. Make it the max of the two.i ; 2492 3 !Z; 2493 3 pri_pb [logical_type] = maxu (.pri_pb [logical_type], .scr_pb [logical_type]);*; 2494 3 pri_pb [fss_status] = .status; 3];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 82 ^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26)E; 2495 3 temp = merged [0]; ! Switch primary and merged buffers9!; 2496 3 merged = primary [0]; ; 2497 3 primary = .temp;; 2498 3 RETURN .status; ; 2499 2 END;; 2500 1 END; .NLIST  .LIST BIN,LOC .LIST' .SBTTL MERGE Merge file specifications  .NLIST[ .ENABL LSB  .LIST!MERGE: JSR R1,$SAVE5 ; 2227e CMP -(SP),-(SP) MOV PRI.PB+2,R0 ; 22602 BIC #175070,R0X CMP R0,#2406e BEQ 1$a BIT #2107,PRI.PB+2 ; 2272 BEQ 2$R MOV SCR.PB+2,R0 ; 22734 BIC #175070,R0e CMP R0,#2406t BNE 2$y1$: CLR SCR.PB+12 ; 2277 CLR SCR.PB+10 ; 2278  CLR SCR.PB+16 ; 2279  CLR SCR.PB+14 ; 2280  CLR SCR.PB+22 ; 2281; CLR SCR.PB+20 ; 2282. CLR SCR.PB+26 ; 2283i CLR SCR.PB+24 ; 2284 CLR SCR.PB+32 ; 2285J CLR SCR.PB+30 ; 2286C CMPB SCR.PB+44,#3 ; 2287  BEQ 2$6 CLRB SCR.PB+44 ; 22892$: TST PRI.PB+4 ; 2297I BNE 3$ " MOV SCR.PB+4,PRI.PB+4 ; 2300 BEQ 3$2 BIS #400,PRI.PB+2 ; 23032" MOV SCR.PB+6,PRI.PB+6 ; 2304$ MOV SCR.PB+40,PRI.PB+40 ; 2305$ MOV SCR.PB+42,PRI.PB+42 ; 23063$: TST PRI.PB+10 ; 2309 BNE 4$ $ MOV SCR.PB+10,PRI.PB+10 ; 2312 BEQ 4$R BIS #200,PRI.PB+2 ; 2315R$ MOV SCR.PB+12,PRI.PB+12 ; 23164$: TST PRI.PB+14 ; 2319 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 83B^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26) BNE 5$$ MOV SCR.PB+14,PRI.PB+14 ; 2322 BEQ 5$+ MOV SCR.PB+2,R0 ; 2325S BIC #176677,R02 BIS R0,PRI.PB+2$ MOV SCR.PB+16,PRI.PB+16 ; 2326!5$: MOV PRI.PB+20,R0 ; 23382 MOV PRI.PB+2,R1 ; 2329  BIS SCR.PB+2,R1 BIT #2000,R1P BNE 7$  TST R0 ; 23381 BNE 6$ $ MOV SCR.PB+20,PRI.PB+20 ; 2341 BEQ 6$- MOV SCR.PB+2,R0 ; 23441 BIC #177733,R0g BIS R0,PRI.PB+2$ MOV SCR.PB+22,PRI.PB+22 ; 23456$: TST PRI.PB+24 ; 2348 BNE 9$ $ MOV SCR.PB+24,PRI.PB+24 ; 2351 BEQ 9$  MOV SCR.PB+2,R0 ; 2354, BIC #177755,R0 BIS R0,PRI.PB+2$ MOV SCR.PB+26,PRI.PB+26 ; 2355 BR 9$ ; 23587$: TST R0 ; 238000a:ppßmæàmçámýfáþfDATA BNE 8$V TST PRI.PB+24 BNE 8$ BIS #2006,PRI.PB+2 ; 2390$ MOV SCR.PB+20,PRI.PB+20 ; 2391$ MOV SCR.PB+22,PRI.PB+22 ; 23928$: TST PRI.PB+4 ; 2399, BNE 10$9$: TST PRI.PB+303 BNE 10$$ MOV SCR.PB+30,PRI.PB+30 ; 2401 BEQ 10$ MOV SCR.PB+2,R0 ; 24043 BIC #177766,R0V BIS R0,PRI.PB+2$ MOV SCR.PB+32,PRI.PB+32 ; 2405"10$: CLR R4 ; TOTAL.LEN 2426" MOV #1,(SP) ; *,STATUS 2427 CLR PRI.PB+34 ; 2428  CLR PRI.PB+36 ; 2429 ) MOV #PRI.PB,2(SP) ; *,PRI.PB.P 2430 " MOV MERGED,R0 ; *,O.PTR 2431 CLR R5 ; I 2433 11$: MOV R5,R1 ; I,* 2435 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 84+^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26) ASL R1V ADD 2(SP),R1 ; PRI.PB.P,* MOV 4(R1),R3 ; *,CURRENT.LEN , ADD R3,R4 ; CURRENT.LEN,TOTAL.LEN 2436% CMP R4,#377 ; TOTAL.LEN,* 24386 BLOS 13$2! MOV MERGED,PRI.PB+36 ; 2455. ADD #377,PRI.PB+36E) MOV R4,PRI.PB+34 ; TOTAL.LEN,* 2456  SUB #377,PRI.PB+341+ SUB PRI.PB+34,R3 ; *,CURRENT.LEN 2458D BPL 12$ CLR R3 ; CURRENT.LEN)12$: MOV #-1414,(SP) ; *,STATUS 24610 13$: MOV R5,R1 ; I,* 2469 ASL R14 ADD 2(SP),R1 ; PRI.PB.P,* MOV 6(R1),R2 ; *,I.PTR BEQ 14$ ; 2470 MOV R0,6(R1) ; O.PTR,*U$14$: TST R3 ; CURRENT.LEN 2471 BEQ 16$ MOV R3,R1 ; CURRENT.LEN,IA BLE 16$%15$: MOVB (R2)+,(R0)+ ; I.PTR,O.PTR3 SOB R1,15$ ; I,* 16$: ADD #2,R5 ; *,I 2433 CMP R5,#12 ; I,* BLOS 11$7 TST PRI.PB+34 ; 2481R BNE 17$! MOV R4,PRI.PB+36 ; TOTAL.LEN,*R ADD MERGED,PRI.PB+36:"17$: MOV PRI.PB+40,R1 ; 2486 BEQ 18$ MOV PRI.PB+6,R2 ; 2488L ADD PRI.PB+4,R2 SUB R1,R2 MOV R2,PRI.PB+42  SUB #2,PRI.PB+42118$: CLR R1 ; 2493( BISB PRI.PB+44,R1 CLR R0  BISB SCR.PB+44,R0 CMP R1,R0 BHIS 19$, CLR R1U BISB SCR.PB+44,R119$: MOVB R1,PRI.PB+44% MOV (SP),PRI.PB ; STATUS,* 2494*! MOV MERGED,R1 ; *,TEMP 2495 MOV PRIMARY,MERGED ; 2496" MOV R1,PRIMARY ; TEMP,* 2497" MOV (SP)+,R0 ; STATUS,* 2254 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 852^;X1.10 Merge file specifications 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (26) TST (SP)+ ; 2227 RTS PC8; Routine Size: 275 words, Routine Base: $CODE$ + 5722.; Maximum stack depth per invocation: 9 words .NLIST; .DSABL LSB2 .NLIST BIN,LOC, .LIST ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 86 ];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (27)4-; 2501 1 %SBTTL 'Parse file specification'a; 2502 1 GLOBAL_FOR_DEBUGA; 2503 1 ROUTINE fss (ptr_p, len_p; ptr, len) : fss_l NOVALUE=R ; 2504 1 ; 2505 1 !++w ; 2506 1 !a%; 2507 1 ! FUNCTIONAL DESCRIPTION:t ; 2508 1 !nM; 2509 1 ! Scan the input string for a valid file specification. On exit,oN; 2510 1 ! either it has scanned the entire string, the scan was terminatedJ; 2511 1 ! by something that may or may not be a valid terminator, or a*; 2512 1 ! syntax error was discovered. ; 2513 1 !sO; 2514 1 ! Spaces are not allowed in the file specification for two reasons;_P; 2515 1 ! any reasonable external use for this routine will be in a DCL likeO; 2516 1 ! command language or similar where spaces are parameter delimiterstO; 2517 1 ! or it is being used to perform a parse merge. In this case, somecO; 2518 1 ! preprocessing has almost certainly been done; in the case of this 5; 2519 1 ! module, the string has been compressed. ; 2520 1 !w ; 2521 1 ! FORMAL PARAMETERS: ; 2522 1 !c; 2523 1 ! ptr_p *; 2524 1 ! address of the input string ; 2525 1 ! ; 2526 1 ! len_ps#; 2527 1 ! length of the stringi ; 2528 1 ! ; 2529 1 ! IMPLICIT OUTPUTS:r ; 253000aBp¥nn´cÚµcÛ¶c�·c›’ 1 !r3; 2531 1 ! The scratch parse block is filled in. ; 2532 1 !r; 2533 1 !--s ; 2534 1 ; 2535 2 BEGINo ; 2536 2 ; 2537 2 MACRO ; 2538 2 ; 2539 2 !5O; 2540 2 ! NEXT_CHAR sets the next character and returns true if successO; 2541 2 ! ; M 2542 2 next_char =t; M 2543 2 BEGIN); M 2544 2 char = .(.ptr)<0, 8, 1>; ; M 2545 2 ptr = .ptr + 1;#; M 2546 2 .ptr LEQA .end_ptr ; 2547 2 END %;O ; 2548 2 ; 2549 2 REGISTER4; 2550 2 char; ! Character being examined ; 2551 2 ; 2552 2 LOCAL ,; 2553 2 status, ! Routine statusQ; 2554 2 backup_ptr, ! Restart point if current state fails to transitn ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 875];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (27)3; 2555 2 end_ptr; ! End of input pointerE ; 2556 2 ; 2557 2 LABEL ; 2558 2 main_scan,; 2559 2 filename_scan,; 2560 2 node_scan; ; 2561 2 B; 2562 2 save_parse (scr_pb); ! Init the scratch parse block; 2563 2 ptr = .ptr_p;r$; 2564 2 end_ptr = .ptr + .len_p; ; 2565 2 ; 2566 2 main_scan :9; 2567 3 BEGINB s];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 88S];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (28) ; 2568 3 node_scan :55; 2569 4 BEGIN ! Process a node specification ; 2570 4 ; 2571 4 ! -; 2572 4 ! Process all node specifications ; 2573 4 !hR; 2574 4 ! No errors are returned by this section. We don't really have enoughM; 2575 4 ! information, with the possible exception of unterminated accesseJ; 2576 4 ! control string. We'll pick that up later as a bad filename. ; 2577 4 !iP; 2578 4 ! While the node specification will include all node specifications,Q; 2579 4 ! the access control string will only include the first quoted string O; 2580 4 ! plus colons, or if no access control, just the colons. This will5Q; 2581 4 ! be used to merge any node logical name translation, which of coursev;; 2582 4 ! is only performed on the first specification.i ; 2583 4 !t; 2584 4 LOCAL6; 2585 4 node_count;p ; 2586 4 ; 2587 4 node_count = 0;5; 2588 4 backup_ptr = .ptr; ; 2589 4 ; 2590 4 WHILE 1 DO; 2591 5 BEGIN ; 2592 5 ; 2593 5 LOCAL ; 2594 5 access_ptr; ; 2595 5 ; 2596 5 !lM; 2597 5 ! If there are no more characters backup to the start of this M; 2598 5 ! substring and exit this loop; its not a node specification. ; 2599 5 !e"; 2600 5 access_ptr = .ptr; ; 2601 5 ; 2602 6 IF NOT next_char; 2603 5 THEN; 2604 6 BEGIN; 2605 6 ptr = .backup_ptr;p; 2606 6 EXITLOOP;; 2607 5 END;L ; 2608 5 <; 2609 5 CASE ch$classify (.char) FROM 0 TO ch_max OF; 2610 5 SET ; 2611 5 J; 2612 5 [ch_alpha, ch_dollar, ch_under, ch_lower, ch_oct, ch_8and9] : ; 2613 5 ; 2614 5 !O; 2615 5 ! The character is valid in a node name, do the next character ; 2616 5 !; 2617 5 ; ; 2618 5 ; 2619 5 [ch_colon] :F ; 2620 5 ; 2621 5 ! ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 89L];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (28)G; 2622 5 ! A node specification is terminated by double colons;,7; 2623 5 ! is the next character also a colon ? ; 2624 5 !; 2625 6 BEGIN ; 2626 6 !; 2627 7 IF NOT next_char ; 2628 6 THEN ; 2629 7 BEGINc ; 2630 7 ptr = .backup_ptr;; 2631 7 EXITLOOP;i; 2632 6 END; ; 2633 6 $; 2634 6 IF .char NEQU %C':'; 2635 6 THENs; 2636 7 BE00aJppßmæàmçámýfáþfDATAGIN ; 2637 7 ptr = .backup_ptr;; 2638 7 EXITLOOP;; 2639 6 END; ; 2640 6 ; 2641 6 !K; 2642 6 ! We have parsed a node specification; save this knowledge P; 2643 6 ! but let's not get carried away and lose the knowledge we haveT; 2644 6 ! about the first one we found if poor man's routing is being used.; 2645 6 !&; 2646 6 IF .node_count EQLU 0; 2647 6 THEN ; 2648 7 BEGIN'/; 2649 7 scr_pb [node_addr] = .backup_ptr; 5; 2650 7 scr_pb [node_len] = .ptr - .backup_ptr;1; 2651 7 scr_pb [access_addr] = .access_ptr; ;; 2652 7 scr_pb [access_len] = .ptr - .access_ptr - 2;a9; 2653 7 scr_pb [flags] = .scr_pb [flags] OR FS$NOD;r8; 2654 7 scr_pb [logical_type] = logical_type_node;; 2655 7 ENDo; 2656 6 ELSE'=; 2657 6 scr_pb [node_len] = .ptr - .scr_pb [node_addr];I ; 2658 6 #; 2659 6 backup_ptr = .ptr;6.; 2660 6 node_count = .node_count + 1;; 2661 5 END;6 ; 2662 5 ; 2663 5 [ch_quote] :p ; 2664 5 ; 2665 5 !A; 2666 5 ! Must be the start of an access control string.-; 2667 5 !; 2668 6 BEGIN ; 2669 6 ; 2670 6 LOCAL; 2671 6 state; ; 2672 6 <; 2673 6 ptr = .ptr - 1; ! backup pointer to quoteM; 2674 6 access_ptr = .ptr; ! Save address of access control string ; 2675 6  b];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 90 ];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (28) ; 2676 6 !?; 2677 6 ! Can't be a node specification if null string; 2678 6 !8; 2679 6 IF .ptr EQLU .backup_ptr THEN EXITLOOP; ; 2680 6 :; 2681 6 state = 0; ! Initial state is unquoted ; 2682 6 ; 2683 6 WHILE 1 DOe; 2684 7 BEGIN ; 2685 7 ; 2686 7 ! C; 2687 7 ! Get the next character. If none then exit this loopP*; 2688 7 ! and determine quote level.; 2689 7 !8; 2690 8 IF NOT next_char; 2691 7 THEN; 2692 8 BEGIN ; 2693 8 ; 2694 8 !nM; 2695 8 ! If we ran out of input, then its not a node specification ; 2696 8 !6$; 2697 8 ptr = .backup_ptr;"; 2698 8 LEAVE node_scan;; 2699 7 END; ; 2700 7 !; 2701 7 IF .char EQLU %C'"'; 2702 7 THEN$; 2703 7 state = NOT .state; 2704 7 ELSE ; 2705 7 1; 2706 7 IF .state EQLU 0 THEN EXITLOOP; ; 2707 7 ; 2708 6 END; ; 2709 6 ; 2710 6 !P; 2711 6 ! The access control string must be terminated by double colons; 2712 6 !$; 2713 6 IF .char NEQU %C':'; 2714 6 THEN ; 2715 7 BEGIN_ ; 2716 7 ptr = .backup_ptr;; 2717 7 EXITLOOP; ; 2718 6 END; ; 2719 6 !; 2720 7 IF NOT next_char ; 2721 6 THEN ; 2722 7 BEGIN ; 2723 7 ptr = .backup_ptr;; 2724 7 EXITLOOP; ; 2725 6 END; ; 2726 6 $; 2727 6 IF .char NEQU %C':'; 2728 6 THEN ; 2729 7 BEGINc ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 91a];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (28) ; 2730 7 ptr = .backup_ptr;; 2731 7 EXITLOOP; ; 2732 6 END; ; 2733 6 ; 2734 6 !K; 2735 6 ! We have parsed a node specification; save this knowledgeOP; 2736 6 ! but let's not get carried away and lose the knowledge we haveT; 2737 6 ! about the first one we found if poor man's routing is being used.; 2738 6 !&; 2739 6 IF .node_count EQLU 0; 2740 6 THENa; 2741 7 BEGIN:/; 2742 7 scr_pb [node_addr] = .backup_ptr; 5; 2743 7 scr_pb [node_len] = .ptr - .backup_ptr; 1; 2744 7 scr_pb [access_addr] = .access_ptr; ;; 2745 7 scr_pb [access_len00aRp¥nn´cÚµcÛ¶c�·c›’] = .ptr - .access_ptr - 2;a9; 2746 7 scr_pb [flags] = .scr_pb [flags] OR FS$NOD;r8; 2747 7 scr_pb [logical_type] = logical_type_node;; 2748 7 ENDo; 2749 6 ELSE'=; 2750 6 scr_pb [node_len] = .ptr - .scr_pb [node_addr];I ; 2751 6 #; 2752 6 backup_ptr = .ptr;7.; 2753 6 node_count = .node_count + 1;8; 2754 5 END; ! Process access control string ; 2755 5 ; 2756 5 [INRANGE] : ; 2757 5 ; 2758 5 !I; 2759 5 ! Either an invalid character has been encountered or webI; 2760 5 ! aren't processing a node specification. Backup to the >; 2761 5 ! beginning of the string and exit this loop.; 2762 5 !; 2763 6 BEGIN#; 2764 6 ptr = .backup_ptr; ; 2765 6 EXITLOOP;; 2766 5 END; ; 2767 5 TES;_ ; 2768 5 ; 2769 4 END; ; 2770 4 4; 2771 3 END; ! Process a node specification7; 2772 4 BEGIN ! Process a device specification! t];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 92d];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (29). ; 2773 4 ! Y; 2774 4 ! Attempt to process a device specification. The next character has not been;<; 2775 4 ! fetched at the beginning nor end of the block. ; 2776 4 !NW; 2777 4 ! No errors are detected in this scan. If we don't find what we're looking W; 2778 4 ! for, its most likely because we're not looking at a device specification.6T; 2779 4 ! If we don't like what we see, we just backup to the start and go on to; 2780 4 ! the next section.D ; 2781 4 !5; 2782 4 backup_ptr = .ptr; ; 2783 4 ; 2784 4 WHILE 1 DO; 2785 5 BEGINt ; 2786 5 ; 2787 5 !5M; 2788 5 ! If there are no more characters backup to the start of this /; 2789 5 ! substring and exit this loop.o; 2790 5 ! ; 2791 6 IF NOT next_char; 2792 5 THEN; 2793 6 BEGIN; 2794 6 ptr = .backup_ptr; ; 2795 6 EXITLOOP;; 2796 5 END;a ; 2797 5 <; 2798 5 CASE ch$classify (.char) FROM 0 TO ch_max OF; 2799 5 SET ; 2800 5 J; 2801 5 [ch_alpha, ch_dollar, ch_under, ch_lower, ch_oct, ch_8and9] : ; 2802 5 ; 2803 5 !Q; 2804 5 ! The character is valid in a device name, do the next character ; 2805 5 !; 2806 5 ; ; 2807 5 ; 2808 5 [ch_colon] :N ; 2809 5 ; 2810 5 !E; 2811 5 ! This is the terminating character of a device nameI; 2812 5 !; 2813 6 BEGIN ; 2814 6 -; 2815 6 IF .ptr - .backup_ptr GTRU 1 ; 2816 6 THEN0; 2817 7 BEGINh ; 2818 7 ; 2819 7 !_K; 2820 7 ! We've got a valid device specification, save this knowledge ; 2821 7 !i1; 2822 7 scr_pb [device_addr] = .backup_ptr; 7; 2823 7 scr_pb [device_len] = .ptr - .backup_ptr; 9; 2824 7 scr_pb [flags] = .scr_pb [flags] OR FS$DEV;1 ; 2825 7 >; 2826 7 IF .scr_pb [logical_type] eqlu logical_type_none !];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 936];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (29) ; 2827 7 then>; 2828 7 scr_pb [logical_type] = logical_type_device; ; 2829 7 ; 2830 7 END ; 2831 6 ELSE[ ; 2832 6 ; 2833 6 !r=; 2834 6 ! Not long enough, backup and let it fail later; 2835 6 ! ; 2836 6 ptr = .backup_ptr; ; 2837 6 ; 2838 6 EXITLOOP;; 2839 5 END; ; 2840 5 ; 2841 5 [INRANGE] : ; 2842 5 ; 2843 5 !I; 2844 5 ! Either an invalid character has been encountered or we(K; 2845 5 ! aren't processing a device specification. Backup to the_>; 2846 5 ! beginning of the string and exit this loop.; 2847 5 !; 2848 6 BEGIN#; 2849 6 ptr = .backup_ptr;n; 00aZppßmæàmçámýfáþfDATA 2850 6 EXITLOOP;; 2851 5 END; ; 2852 5 TES;; ; 2853 5 ; 2854 4 END; ; 2855 4 6; 2856 3 END; ! Process a device specification5; 2857 4 BEGIN ! Process a file specificationE e];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 94c];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (30). ; 2858 4 ! 0; 2859 4 ! Process a directory specification. ; 2860 4 !W; 2861 4 ! We are immediately able to determine if we have a directory specification O; 2862 4 ! at this point; the current character must be either a '<' or '['.aM; 2863 4 ! If we don't find the matching bracket, we will report an error.aG; 2864 4 ! Likewise if we don't like some of the characters scanned.g ; 2865 4 ! :; 2866 5 BEGIN ! Process a directory specification ; 2867 5 ; 2868 5 !:; 2869 5 ! Attempt to process a directory specification ; 2870 5 ! ; 2871 5 ; 2872 5 LOCALa; 2873 5 bracket; ; 2874 5 V; 2875 5 backup_ptr = .ptr; ! Save start of this part of string for error return ; 2876 5 2; 2877 5 IF NOT next_char THEN LEAVE main_scan; ; 2878 5 ; 2879 5 bracket = 0; ; 2880 5 ; 2881 5 SELECT .char OFh; 2882 5 SET ; 2883 5 ; 2884 5 [%C'['] :o ; 2885 5 ; 2886 5 !D; 2887 5 ! Standard directory brackets, set terminating bracket.; 2888 5 !; 2889 5 bracket = %C']'; ; 2890 5 ; 2891 5 [%C'<'] :r ; 2892 5 ; 2893 5 !;; 2894 5 ! Alternate brackets, set terminating bracket. ; 2895 5 !; 2896 5 bracket = %C'>';N; 2897 5 TES; ; 2898 5 ; 2899 5 IF .bracket NEQU 0; 2900 5 THEN;; 2901 6 BEGIN ! Process directory specification8 ; 2902 6 ; 2903 6 LOCAL ; 2904 6 state; ; 2905 6 ; 2906 6 state = 0; ; 2907 6 "; 2908 7 IF NOT (WHILE 1 DO8; 2909 8 BEGIN ! Scan directory specification ; 2910 8 ; 2911 8 ! 3];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 95 ];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (30)9E; 2912 8 ! Get the next character, if none then right bracketD; 2913 8 ! missing, terminate scan with an error indication.; 2914 8 !7; 2915 8 IF NOT next_char THEN LEAVE main_scan; ; 2916 8 =; 2917 8 CASE ch$classify (.char) FROM 0 TO ch_max OF ; 2918 8 SET3 ; 2919 8 T; 2920 8 [ch_alpha, ch_dollar, ch_under, ch_lower, ch_oct, ch_8and9, ch_dash] : ; 2921 8 ; 2922 8 !-A; 2923 8 ! These characters are valid in the new format.2; 2924 8 !x; 2925 8 ;o ; 2926 8 ; 2927 8 [ch_dot] : ; 2928 8 ; 2929 8 !e0; 2930 8 ! Check for ... which is wild.; 2931 8 ! ; 2932 8 =; 2933 9 IF next_char ! Is there another character?r; 2934 8 THEN/; 2935 8 IF .char EQLU %C'.' ! Is it a .?c; 2936 8 THENh3; 2937 9 IF next_char ! Is there a third?9; 2938 8 THEN 1; 2939 8 IF .char EQLU %C'.' ! Is it a .?i; 2940 8 THEN>; 2941 8 scr_pb [flags] = .scr_pb [flags] OR FS$WDI; 2942 8 ELSE?; 2943 8 LEAVE main_scan ! .. invalid, no directoryc; 2944 8 ELSE 9; 2945 8 LEAVE main_scan ! We are looking at junkt; 2946 8 ELSEr@; 2947 8 ptr = .ptr - 1 ! . followed by something else; 2948 8 ELSE9; 2949 8 LEAVE main_scan; ! We are looking at junkd ; 2950 8 ; 2951 8 [ch_wild] : ; 2952 8 ; 2953 8 !.+; 2954 8 ! Indicate wild directory ; 2955 8 !_=; 2956 8 scr_pb [flags] = .scr_pb [flags] OR FS$WDI; ; 2957 8 ; 2958 8 [ch_dir] : ; 2959 8 ; 2960 8 ! Q; 2961 8 ! End of directory specifica00abp¥nn´cÚµcÛ¶c�·c›’tion, exit loop if matching bracket9; 2962 8 !tQ; 2963 8 IF .char EQLU .bracket THEN EXITLOOP valid ELSE EXITLOOP error;m ; 2964 8 ; 2965 8 [INRANGE] :  0];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 96a];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (30) ; 2966 8 ; 2967 8 ! F; 2968 8 ! Invalid character encountered, terminate scan withE; 2969 8 ! an error indication. We will rescan to determine <; 2970 8 ! if the specification is in the UIC form.; 2971 8 !P!; 2972 8 EXITLOOP error; ; 2973 8 TES; ; 2974 8 7; 2975 8 END ! Scan directory specification ; 2976 7 ); 2977 6 THEN; 2978 7 BEGIN#; 2979 7 ptr = .backup_ptr + 1;P ; 2980 7 C; 2981 7 WHILE 1 DO ! Process group,member format directoryn; 2982 8 BEGIN ; 2983 8 7; 2984 8 IF NOT next_char THEN LEAVE main_scan;w ; 2985 8 =; 2986 8 CASE ch$classify (.char) FROM 0 TO ch_max OFU; 2987 8 SET ; 2988 8 "; 2989 8 [ch_oct, ch_8and9] : ; 2990 8 ; 2991 8 ! $; 2992 8 ! Digits are valid; 2993 8 !9; 2994 8 ;7 ; 2995 8 ; 2996 8 [ch_wild] :9 ; 2997 8 ; 2998 8 !9+; 2999 8 ! Indicate wild directory ; 3000 8 !i=; 3001 8 scr_pb [flags] = .scr_pb [flags] OR FS$WDI; ; 3002 8 ; 3003 8 [ch_comma] : ; 3004 8 ; 3005 8 ! K; 3006 8 ! Group-member separator encountered. Only one is legal. E; 3007 8 ! Set flag indicating that a comma was encountered. ; 3008 8 !iF; 3009 8 IF (state = NOT .state) EQLU 0 THEN LEAVE main_scan; ; 3010 8 ; 3011 8 [ch_dir] : ; 3012 8 ; 3013 8 ! >; 3014 8 ! End of directory specification, exit loop.; 3015 8 !=; 3016 9 BEGINI ; 3017 9 O; 3018 9 IF .char NEQU .bracket OR .state EQLU 0 THEN LEAVE main_scan; ; 3019 9  r];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 97m];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (30)E; 3020 9 EXITLOOP; ; 3021 8 END; ; 3022 8 ; 3023 8 [INRANGE] : ; 3024 8 ; 3025 8 !sN; 3026 8 ! Invalid character encountered, exit the loop with an error; 3027 8 ! "; 3028 8 LEAVE main_scan;; 3029 8 TES; ; 3030 8 G; 3031 8 END ! Process group,member directory specificationA; 3032 6 END;5 ; 3033 6 ; 3034 6 !iP; 3035 6 ! We have located a directory specification, save this knowledge; 3036 6 !X6; 3037 6 scr_pb [directory_addr] = .backup_ptr;<; 3038 6 scr_pb [directory_len] = .ptr - .backup_ptr;;; 3039 6 scr_pb [flags] = .scr_pb [flags] OR FS$DIR;tW; 3040 6 backup_ptr = .ptr; ! Save start of remaining string for error return:; 3041 5 END; ! Process directory specification ; 3042 5 0; 3043 4 END; ! Process a directory spec 0];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 98];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (31)_; 3044 4 filename_scan :c); 3045 5 BEGIN ! Process filename. ; 3046 5 !O:; 3047 5 ! Attempt to process a filename specification. ; 3048 5 ! ?; 3049 5 ! We will first attempt to process a quoted string.c ; 3050 5 !iO; 3051 5 ! If we don't find a quoted string, then we will attempt to processo*; 3052 5 ! a normal file specification. ; 3053 5 !1; 3054 5 LOCAL ; 3055 5 state; ; 3056 5 ; 3057 5 state = 0; ; 3058 5 ; 3059 5 !59; 3060 5 ! Attempt to process a funny filename (ANSI). ; 3061 5 !fG; 3062 5 ptr = .backup_ptr; ! Backup to star00ajppßmæàmçámýfáþfDATAt of remaining stringc ; 3063 5 ; 3064 5 WHILE 1 DO; 3065 6 BEGINp ; 3066 6 ; 3067 6 ! L; 3068 6 ! Get the next character. If none then the command is valid.; 3069 6 ! /; 3070 6 IF NOT next_char THEN EXITLOOP;3 ; 3071 6 #; 3072 6 IF .char EQLU %C'"'; 3073 6 THEN; 3074 6 state = NOT .state ; 3075 6 ELSE,; 3076 6 IF .state EQLU 0 THEN EXITLOOP;; 3077 5 END; ; 3078 5 4; 3079 5 state = -1; ! Initialize state again:; 3080 5 ptr = .ptr - 1; ! Backup to next character ; 3081 5 $; 3082 5 IF .ptr NEQU .backup_ptr; 3083 5 THEN; 3084 6 BEGINn ; 3085 6 ; 3086 6 ! S; 3087 6 ! We actually have a quoted file specification, save this knowledge ; 3088 6 !C5; 3089 6 scr_pb [filename_addr] = .backup_ptr;t;; 3090 6 scr_pb [filename_len] = .ptr - .backup_ptr;NO; 3091 6 scr_pb [flags] = .scr_pb [flags] OR FS$QUO OR FS$NAM OR FS$TYP;t; 3092 6 END ; 3093 5 ELSE5; 3094 6 BEGIN ! Process a normal filename ; 3095 6 ; 3096 6 WHILE 1 DO4; 3097 7 BEGIN ! Scan filename specification 6];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 99 ];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (31)c ; 3098 7 ,; 3099 7 IF NOT next_char THEN EXITLOOP; ; 3100 7 9; 3101 7 CASE ch$classify (.char) FROM 0 TO ch_max OF ; 3102 7 SET ; 3103 7 N; 3104 7 [ch_alpha, ch_dollar, ch_under, ch_lower, ch_oct, ch_8and9] : ; 3105 7 ; 3106 7 ! C; 3107 7 ! Valid character encountered, process next character ; 3108 7 !:; 3109 7 ; ; 3110 7 ; 3111 7 !09; 3112 7 ! Note that a wildcard has been encounteredC; 3113 7 !I; 3114 7 [ch_wild] : ; 3115 7 ; 3116 7 !N9; 3117 7 ! Note that a wildcard has been encounteredh; 3118 7 !m1; 3119 7 scr_pb [flags] = .scr_pb [flags] OR4; 3120 8 BEGINh5; 3121 8 IF .state LSS 0 THEN FS$WNA ELSE FS$WTY1; 3122 7 END; ; 3123 7 ; 3124 7 [ch_dot] :n ; 3125 7 ; 3126 7 !:; 3127 7 ! The first dot is the type field delimiter,8; 3128 7 ! the second is the new version delimiter..; 3129 7 ! Exit if the version delimiter.; 3130 7 !1,; 3131 7 IF (state = .state + 1) EQLU 0; 3132 7 THEN; 3133 8 BEGIN1L; 3134 8 IF (scr_pb [filename_len] = .ptr - 1 - .backup_ptr) NEQU 0; 3135 8 THEN; 3136 9 BEGIN4; 3137 9 scr_pb [filename_addr] = .backup_ptr;:; 3138 9 scr_pb [flags] = .scr_pb [flags] OR FS$NAM;; 3139 8 END;i(; 3140 8 backup_ptr = .ptr - 1;; 3141 8 ENDi; 3142 7 ELSE; 3143 7 EXITLOOP;t ; 3144 7 ; 3145 7 [INRANGE] : ; 3146 7 ; 3147 7 !a<; 3148 7 ! Any other character is not valid in the file>; 3149 7 ! name or type fields. Exit loop to the version ; 3150 7 ! processing scan.; 3151 7 !  G];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 100p];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (31) ; 3152 7 EXITLOOP; ; 3153 7 TES; ; 3154 7 3; 3155 6 END; ! Scan filename specification ; 3156 6 =; 3157 6 ptr = .ptr - 1; ! Backup to next characteri ; 3158 6 ; 3159 6 IF .state LSS 0l; 3160 6 THEN; 3161 7 BEGIN ; 3162 7 C; 3163 7 IF (scr_pb [filename_len] = .ptr - .backup_ptr) NEQU 0:; 3164 7 THEN1; 3165 8 BEGIN6; 3166 8 scr_pb [filename_addr] = .backup_ptr;<; 3167 8 scr_pb [flags] = .scr_pb [flags] OR FS$NAM;; 3168 7 END; ; 3169 7 ; 3170 7 END; 3171 6 ELSE; 3172 7 BEGIN.; 3173 7 scr_pb [type_addr] = .backup_ptr;4; 3174 7 scr_pb [type_len]00arp¥nn´cÚµcÛ¶c�·c›’ = .ptr - .backup_ptr;8; 3175 7 scr_pb [flags] = .scr_pb [flags] OR FS$TYP;; 3176 6 END; ; 3177 6 4; 3178 5 END; ! Process a normal filename ; 3179 5 %; 3180 4 END; ! filename_scan ; 3181 4 backup_ptr = .ptr; ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 101E];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (32)r2; 3182 4 IF NOT next_char THEN LEAVE main_scan; ; 3183 4 ; 3184 4 SELECTONEU .char OFr; 3185 4 SET ; 3186 4 ; 3187 4 [%C'.', %C';'] : ; 3188 4 ; 3189 4 !%; 3190 4 ! Process version number ; 3191 4 !; 3192 5 BEGIN ; 3193 5 ; 3194 5 LOCAL; 3195 5 state; ; 3196 5 P; 3197 5 state = 0; ! State is the character count or wildcard flag if -1 ; 3198 5 ; 3199 5 WHILE 1 DO ; 3200 6 BEGIN ; 3201 6 ; 3202 6 !C; 3203 6 ! Get next character. If none command line valid.N; 3204 6 !0; 3205 6 IF NOT next_char THEN EXITLOOP; ; 3206 6 $; 3207 6 SELECTONEU .char OF; 3208 6 SETi ; 3209 6 ; 3210 6 [%C'0' TO %C'9'] : ; 3211 6 ; 3212 6 ! H; 3213 6 ! If number then continue skipping over version number; 3214 6 ! F; 3215 6 IF (state = .state + 1) EQLU 0 THEN LEAVE main_scan; ; 3216 6 ; 3217 6 [%C'-'] : ; 3218 6 ; 3219 6 !xO; 3220 6 ! Minus sign only valid if first character of version number.I; 3221 6 !E; 3222 7 BEGIN ; 3223 7 8; 3224 7 IF .state NEQU 0 THEN LEAVE main_scan; ; 3225 7 %; 3226 7 state = .state + 1;2; 3227 6 END; ; 3228 6 ; 3229 6 [%C'*'] :i ; 3230 6 ; 3231 6 ! W; 3232 6 ! Wildcard version number. Must be only character in version number.6; 3233 6 !%; 3234 7 BEGIN ; 3235 7  x];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 102 ];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (32) 8; 3236 7 IF .state NEQU 0 THEN LEAVE main_scan; ; 3237 7 %; 3238 7 state = NOT .state; ; 3239 6 END; ; 3240 6 ; 3241 6 [OTHERWISE] : ; 3242 6 ; 3243 6 !b=; 3244 6 ! Non-digit encountered, exit version scan. ; 3245 6 !; 3246 6 EXITLOOP;i; 3247 6 TES; ; 3248 6 ; 3249 5 END;1 ; 3250 5 :; 3251 5 ptr = .ptr - 1; ! Backup to next character ; 3252 5 ; 3253 5 !F; 3254 5 ! We just processed a version number, save this knowledge; 3255 5 ! ; 3256 5 M; 3257 5 IF .state LSS 0 THEN scr_pb [flags] = .scr_pb [flags] OR FS$WVE; ; 3258 5 8; 3259 5 scr_pb [flags] = .scr_pb [flags] OR FS$VER;1; 3260 5 scr_pb [version_addr] = .backup_ptr;27; 3261 5 scr_pb [version_len] = .ptr - .backup_ptr; >; 3262 5 backup_ptr = .ptr; ! Include the version number; 3263 4 END; ; 3264 4 ; 3265 4 [OTHERWISE] : ; 3266 4 ; 3267 4 !(; 3268 4 ! Return the last character; 3269 4 !; 3270 5 BEGIN:; 3271 5 ptr = .ptr - 1; ! Backup to next character; 3272 4 END;]; 3273 4 TES8 ; 3274 4 6; 3275 3 END; ! Process filename specification!; 3276 2 END; ! main_scank p];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 103 ];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (33) T; 3277 2 scr_pb [trailing_addr] = ptr = .backup_ptr; ! Always fill in the address_; 3278 2 scr_pb [trailing_len] = len = .end_ptr - .ptr; ! of the traling string even if nullD ; 3279 2 q; 3280 2 IF (.scr_pb [flags] NEQU 0) AND (.scr_pb [flags] AND NOT FS$NAM) EQLU 0 ! If a standalone filename isk6; 3281 2 THEN ! present it could be a log00azppßmæàmçámýfáþfDATAical>; 3282 2 scr_pb [logical_type] = logical_type_filename; ; 3283 2 (; 3284 2 scr_pb [fss_status] = valid;; 3285 1 END; .NLIST  .LIST BIN,LOC .LIST$ .SBTTL FSS Parse file specification .NLISTa .ENABL LSB2 .LISTFSS: JSR R1,$SAVE3 ; 2503p TST -(SP) MOV #SCR.PB,R1 ; 2562 JSR PC,SAVE.PARSE% MOV R5,R3 ; LEN.P,END.PTR 25640 ADD R4,R3 ; PTR,END.PTRT! CLR (SP) ; NODE.COUNT 2587i% MOV R4,R2 ; PTR,BACKUP.PTR 2588e(1$: MOV R4,R5 ; PTR,ACCESS.PTR 2600# MOVB (R4)+,R1 ; PTR,CHAR 2602e CMP R4,R3 ; PTR,END.PTR  BHI 9$ ; 2605t JSR PC,CH$CLASSIFY ; 2609 ASL R0.# ADD P.AAB(R0),PC ; Case dispatcha3$: DEC R4 ; PTR 2673% MOV R4,R5 ; PTR,ACCESS.PTR 2674S% CMP R4,R2 ; PTR,BACKUP.PTR 2679C BEQ 10$ CLR R0 ; STATE 2681E&4$: MOVB (R4)+,R1 ; PTR,CHAR 2690 CMP R4,R3 ; PTR,END.PTRT BHI 9$ ; 2697O CMP R1,#42 ; CHAR,* 2701, BNE 5$R COM R0 ; STATE 2703P BR 4$ ; 27015$: TST R0 ; STATE 2706 BNE 4$P CMP R1,#72 ; CHAR,* 2713  BNE 9$ ; 2716,&6$: MOVB (R4)+,R1 ; PTR,CHAR 2720 CMP R4,R3 ; PTR,END.PTRc BHI 9$ ; 2723  CMP R1,#72 ; CHAR,* 2727E BNE 9$ ; 2730,! TST (SP) ; NODE.COUNT 2739Q $];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 104.];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (33)  BNE 7$ ) MOV R2,SCR.PB+6 ; BACKUP.PTR,* 2742 # MOV R4,SCR.PB+4 ; PTR,* 2743,! SUB R2,SCR.PB+4 ; BACKUP.PTR,** MOV R5,SCR.PB+42 ; ACCESS.PTR,* 2744 MOV R4,R0 ; PTR,* 2745 SUB R5,R0 ; ACCESS.PTR,* MOV R0,SCR.PB+40E SUB #2,SCR.PB+402 BIS #400,SCR.PB+2 ; 2746  MOVB #3,SCR.PB+44 ; 2747D BR 8$ ; 2739&7$: MOV R4,SCR.PB+4 ; PTR,* 2750 SUB SCR.PB+6,SCR.PB+4(8$: MOV R4,R2 ; PTR,BACKUP.PTR 2752! INC (SP) ; NODE.COUNT 2753( BR 1$ ; 2609(9$: MOV R2,R4 ; BACKUP.PTR,PTR 2764)10$: MOV R4,R2 ; PTR,BACKUP.PTR 2782,'11$: MOVB (R4)+,R1 ; PTR,CHAR 2791B CMP R4,R3 ; PTR,END.PTR BHI 14$ ; 2794 JSR PC,CH$CLASSIFY ; 2798 ASL R0R# ADD P.AAC(R0),PC ; Case dispatchS"13$: MOV R4,R0 ; PTR,* 2815 SUB R2,R0 ; BACKUP.PTR,* CMP R0,#1 BLOS 14$ * MOV R2,SCR.PB+12 ; BACKUP.PTR,* 2822 MOV R0,SCR.PB+10 ; 2823 BIS #200,SCR.PB+2 ; 2824P TSTB SCR.PB+44 ; 2826 BNE 15$ MOVB #2,SCR.PB+44 ; 2828U BR 15$ ; 2815M)14$: MOV R2,R4 ; BACKUP.PTR,PTR 2849M)15$: MOV R4,R2 ; PTR,BACKUP.PTR 2875,# MOVB (R4)+,R1 ; PTR,CHAR 2877  CMP R4,R3 ; PTR,END.PTR  BHI 30$ CLR R5 ; BRACKET 2879 CMP R1,#133 ; CHAR,* 2884 BNE 16$# MOV #135,R5 ; *,BRACKET 2889R#16$: CMP R1,#74 ; CHAR,* 2891C BNE 17$" MOV #76,R5 ; *,BRACKET 2896 17$: TST R5 ; BRACKET 2899 BEQ 32$ CLR (SP) ; STATE 2906 '18$: MOVB (R4)+,R1 ; PTR,CHAR 2915  CMP R4,R3 ; PTR,END.PTR1 BHI 30$ R];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 105;];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (33)R JSR PC,CH$CLASSIFY ; 2917 ASL R03# ADD P.AAD(R0),PC ; Case dispatchP'20$: MOVB (R4)+,R1 ; PTR,CHAR 2933M CMP R4,R3 ; PTR,END.PTR8 BHI 30$ CMP R1,#56 ; CHAR,* 29353 BNE 21$# MOVB (R4)+,R1 ; PTR,CHAR 2937R CMP R4,R3 ; PTR,END.PTR BHI 30$ CMP R1,#56 ; CHAR,* 2939 BNE 30$ BR 22$ ; 2941 21$: DEC R4 ; PTR 2947i BR 18$ ; 2933 $22$: BIS #1000,SCR.PB+2 ; 2956 BR 18$ ; 2917 (23$: CMP R1,R5 ; CHAR,BRACKET 2963 BEQ 31$)24$: MOV R2,R4 ; BACKUP.PTR,PTR 2979D INC R4 ; PTR'25$: MOVB (R4)+,R1 ; PTR,CHAR 2984  CMP R4,R3 ; PTR,END.PTR, BHI 46$ JSR PC,CH$CLASSIFY ; 2986 ASL R0# ADD P.AAE(R0),PC ; Case dispatch $27$:00a‚p¥nn´cÚµcÛ¶c�·c›’ BIS #1000,SCR.PB+2 ; 3001 BR 25$ ; 2986 !28$: COM (SP) ; STATE 3009  BNE 25$ BR 49$(29$: CMP R1,R5 ; CHAR,BRACKET 3018 30$: BNE 51$ TST (SP) ; STATE BEQ 49$.31$: MOV R2,SCR.PB+16 ; BACKUP.PTR,* 3037$ MOV R4,SCR.PB+14 ; PTR,* 3038" SUB R2,SCR.PB+14 ; BACKUP.PTR,* BIS #100,SCR.PB+2 ; 3039R% MOV R4,R2 ; PTR,BACKUP.PTR 3040332$: CLR R5 ; STATE 3057R% MOV R2,R4 ; BACKUP.PTR,PTR 3062'33$: MOVB (R4)+,R1 ; PTR,CHAR 3070: CMP R4,R3 ; PTR,END.PTR0 BHI 35$ CMP R1,#42 ; CHAR,* 3072  BNE 34$ COM R5 ; STATE 3074 BR 33$ ; 3072R34$: TST R5 ; STATE 3076T BNE 33$$35$: MOV #-1,R5 ; *,STATE 3079 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 106R];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (33)S DEC R4 ; PTR 3080 % CMP R4,R2 ; PTR,BACKUP.PTR 3082) BEQ 36$* MOV R2,SCR.PB+22 ; BACKUP.PTR,* 3089$ MOV R4,SCR.PB+20 ; PTR,* 3090" SUB R2,SCR.PB+20 ; BACKUP.PTR,* BIS #2006,SCR.PB+2 ; 3091 BR 45$ ; 3082A'36$: MOVB (R4)+,R1 ; PTR,CHAR 3099  CMP R4,R3 ; PTR,END.PTRN BHI 43$ JSR PC,CH$CLASSIFY ; 3101 ASL R0-# ADD P.AAF(R0),PC ; Case dispatchX38$: TST R5 ; STATE 3121  BGE 39$ MOV #40,R0 ; 3120N BR 40$I39$: MOV #20,R0C!40$: BIS R0,SCR.PB+2 ; 3119  BR 36$ ; 3101841$: INC R5 ; STATE 3131  BNE 43$ MOV R4,R0 ; PTR,* 3134 SUB R2,R0 ; BACKUP.PTR,* MOV R0,SCR.PB+20P DEC SCR.PB+20 BEQ 42$* MOV R2,SCR.PB+22 ; BACKUP.PTR,* 3137 BIS #4,SCR.PB+2 ; 31389)42$: MOV R4,R2 ; PTR,BACKUP.PTR 3140 DEC R2 ; BACKUP.PTR  BR 36$ ; 3131P43$: DEC R4 ; PTR 3157 MOV R4,R0 ; PTR,* 3163 SUB R2,R0 ; BACKUP.PTR,* TST R5 ; STATE 3159# BGE 44$ MOV R0,SCR.PB+20 ; 3163 BEQ 45$* MOV R2,SCR.PB+22 ; BACKUP.PTR,* 3166 BIS #4,SCR.PB+2 ; 3167  BR 45$ ; 3159,.44$: MOV R2,SCR.PB+26 ; BACKUP.PTR,* 3173 MOV R0,SCR.PB+24 ; 3174 BIS #2,SCR.PB+2 ; 3175)45$: MOV R4,R2 ; PTR,BACKUP.PTR 3181,# MOVB (R4)+,R1 ; PTR,CHAR 3182R CMP R4,R3 ; PTR,END.PTR  BHI 55$ CMP R1,#56 ; CHAR,* 3187 BEQ 47$ CMP R1,#73 ; CHAR,*S 46$: BNE 55$ K];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 107V];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (33)47$: CLR R0 ; STATE 3197R'48$: MOVB (R4)+,R1 ; PTR,CHAR 32054 CMP R4,R3 ; PTR,END.PTR7 BHI 53$ CMP R1,#60 ; CHAR,* 32108 BLO 50$ CMP R1,#71 ; CHAR,*3 BHI 50$ INC R0 ; STATE 3215I BNE 48$ 49$: BR 55$C#50$: CMP R1,#55 ; CHAR,* 3217  BNE 52$ TST R0 ; STATE 3224 51$: BNE 55$ INC R0 ; STATE 32268 BR 48$ ; 32071#52$: CMP R1,#52 ; CHAR,* 3229e BNE 53$ TST R0 ; STATE 3236R BNE 55$ COM R0 ; STATE 3238 BR 48$ ; 3207 53$: DEC R4 ; PTR 3251; TST R0 ; STATE 32573 BGE 54$ BIS #10,SCR.PB+2!54$: BIS #1,SCR.PB+2 ; 3259B* MOV R2,SCR.PB+32 ; BACKUP.PTR,* 3260$ MOV R4,SCR.PB+30 ; PTR,* 3261" SUB R2,SCR.PB+30 ; BACKUP.PTR,*% MOV R4,R2 ; PTR,BACKUP.PTR 3262;)55$: MOV R2,R4 ; BACKUP.PTR,PTR 3277;" MOV R2,SCR.PB+36 ; BACKUP.PTR,*# MOV R3,R5 ; END.PTR,LEN 32783 SUB R4,R5 ; PTR,LEN  MOV R5,SCR.PB+34 ; LEN,* MOV SCR.PB+2,R0 ; 3280B BEQ 56$ BIT #-5,R03 BNE 56$ MOVB #1,SCR.PB+44 ; 3282S56$: MOV #1,SCR.PB ; 32840 TST (SP)+ ; 2503 RTS PC;8; Routine Size: 341 words, Routine Base: $CODE$ + 6770.; Maximum stack depth per invocation: 6 words .PSECT $PLIT$, RO , D +P.AAB: ; CASE Table for FSS+0044 2609 2$: .WORD 160 ; [9$] V];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 P00aŠppßmæàmçámýfáþfDATAage 108];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (33) .WORD -22 ; [1$] .WORD 160 ; [9$] .WORD -22 ; [1$] .WORD -22 ; [1$] .WORD 160 ; [9$] .WORD 44 ; [6$]  .WORD 0 ; [3$] .WORD 160 ; [9$] .WORD 160 ; [9$] .WORD 160 ; [9$] .WORD 160 ; [9$] .WORD -22 ; [1$] .WORD -22 ; [1$] .WORD -22 ; [1$] .WORD 160 ; [9$]+P.AAC: ; CASE Table for FSS+0250 2798 12$: .WORD 46 ; [14$] .WORD -20 ; [11$]a .WORD 46 ; [14$] .WORD -20 ; [11$]  .WORD -20 ; [11$]N .WORD 46 ; [14$] .WORD 0 ; [13$]O .WORD 46 ; [14$] .WORD 46 ; [14$] .WORD 46 ; [14$] .WORD 46 ; [14$] .WORD 46 ; [14$] .WORD -20 ; [11$]1 .WORD -20 ; [11$]0 .WORD -20 ; [11$]  .WORD 46 ; [14$]+P.AAD: ; CASE Table for FSS+0404 2917 19$: .WORD 52 ; [24$] .WORD -20 ; [18$] .WORD 52 ; [24$] .WORD -20 ; [18$]  .WORD -20 ; [18$]4 .WORD 52 ; [24$] .WORD 52 ; [24$] .WORD 52 ; [24$] .WORD 46 ; [23$] .WORD 36 ; [22$] .WORD -20 ; [18$]  .WORD 0 ; [20$]; .WORD -20 ; [18$][ .WORD -20 ; [18$]4 .WORD -20 ; [18$]] .WORD 52 ; [24$]+P.AAE: ; CASE Table for FSS+0502 2986026$: .WORD 472 ; [55$]. D];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 109D];X1.10 Parse file specification 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (33)5 .WORD 472 ; [55$]  .WORD 472 ; [55$]; .WORD -20 ; [25$][ .WORD 472 ; [55$]2 .WORD 10 ; [28$] .WORD 472 ; [55$]$ .WORD 472 ; [55$]$ .WORD 16 ; [29$] .WORD 0 ; [27$]  .WORD 472 ; [55$][ .WORD 472 ; [55$]A .WORD 472 ; [55$]2 .WORD 472 ; [55$]  .WORD -20 ; [25$]o .WORD 472 ; [55$] +P.AAF: ; CASE Table for FSS+0662 3101 37$: .WORD 66 ; [43$] .WORD -20 ; [36$]  .WORD 66 ; [43$] .WORD -20 ; [36$]B .WORD -20 ; [36$]4 .WORD 66 ; [43$] .WORD 66 ; [43$] .WORD 66 ; [43$] .WORD 66 ; [43$] .WORD 0 ; [38$] .WORD 66 ; [43$] .WORD 24 ; [41$] .WORD -20 ; [36$]] .WORD -20 ; [36$] .WORD -20 ; [36$] .WORD 66 ; [43$] .NLIST2 .DSABL LSB .NLIST BIN,LOC5 .LIST 0];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 110DX;X1.10 Classify character 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (34)'; 3286 1 %SBTTL 'Classify character'.; 3287 1 GLOBAL_FOR_DEBUG8; 3288 1 ROUTINE ch$classify (char) : ch$classify_l = ; 3289 1 ; 3290 1 !++ ; 3291 1 !D%; 3292 1 ! FUNCTIONAL DESCRIPTION: ; 3293 1 ! I; 3294 1 ! Classify the character into one of the types of interest to$; 3295 1 ! the parseing routines. ; 3296 1 !- ; 3297 1 ! FORMAL PARAMETERS: ; 3298 1 !g0; 3299 1 ! char - Character to be classified. ; 3300 1 !O; 3301 1 ! ROUTINE VALUE:; 3302 1 ! COMPLETION CODES:c ; 3303 1 ! 7; 3304 1 ! The character classification is returned. ; 3305 1 !s; 3306 1 !--9 ; 3307 1 ; 3308 2 BEGIN ; 3309 2 ; 3310 2 LITERALR; 3311 2 ctb = %C'"', ; 3312 2 cte = %C'z' + 1; ; 3313 2 ; 3314 2 OWNtF; 3315 2 char_types : VECTOR [cte - ctb, BYTE, SIGNED] PRESET (; 3316 2 ! "alpha"s $; 3317 2 [%C'A'-ctb] = ch_alpha,$; 3318 2 [%C'B'-ctb] = ch_alpha,$; 3319 2 [%C'C'-ctb] = ch_alpha,$; 3320 2 [%C'D'-ctb] = ch_alpha,$; 3321 2 [%C'E'-ctb] = ch_alpha,$; 3322 2 [%C'F'-ctb] = ch_alpha,$; 3323 2 [%C'G'-ctb] = ch_alpha,$; 3324 2 [%C'H'-ctb] = ch_alpha,$; 3325 2 [%C'I'-ctb] = ch_alpha,$; 3326 2 [%C'J'-ctb] = ch_alpha,$; 3327 2 [%C'K'-ctb] = ch_alpha,$; 3328 2 [%C'L'-ctb] = ch_alpha,$; 3329 2 [%C'M'-ctb] = ch_alpha,$; 3330 2 [%C'N'-ctb] = ch_alpha,$; 3331 2 [%C'O'-ctb] = ch_alpha,$; 3332 2 [%C'P'-ctb] = ch_alpha,$; 3333 00a’p¥nn´cÚµcÛ¶c�·c›’2 [%C'Q'-ctb] = ch_alpha,$; 3334 2 [%C'R'-ctb] = ch_alpha,$; 3335 2 [%C'S'-ctb] = ch_alpha,$; 3336 2 [%C'T'-ctb] = ch_alpha,$; 3337 2 [%C'U'-ctb] = ch_alpha,$; 3338 2 [%C'V'-ctb] = ch_alpha,$; 3339 2 [%C'W'-ctb] = ch_alpha, t];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 111 X;X1.10 Classify character 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (34)$; 3340 2 [%C'X'-ctb] = ch_alpha,$; 3341 2 [%C'Y'-ctb] = ch_alpha,$; 3342 2 [%C'Z'-ctb] = ch_alpha, ; 3343 2 $; 3344 2 [%C'a'-ctb] = ch_lower,$; 3345 2 [%C'b'-ctb] = ch_lower,$; 3346 2 [%C'c'-ctb] = ch_lower,$; 3347 2 [%C'd'-ctb] = ch_lower,$; 3348 2 [%C'e'-ctb] = ch_lower,$; 3349 2 [%C'f'-ctb] = ch_lower,$; 3350 2 [%C'g'-ctb] = ch_lower,$; 3351 2 [%C'h'-ctb] = ch_lower,$; 3352 2 [%C'i'-ctb] = ch_lower,$; 3353 2 [%C'j'-ctb] = ch_lower,$; 3354 2 [%C'k'-ctb] = ch_lower,$; 3355 2 [%C'l'-ctb] = ch_lower,$; 3356 2 [%C'm'-ctb] = ch_lower,$; 3357 2 [%C'n'-ctb] = ch_lower,$; 3358 2 [%C'o'-ctb] = ch_lower,$; 3359 2 [%C'p'-ctb] = ch_lower,$; 3360 2 [%C'q'-ctb] = ch_lower,$; 3361 2 [%C'r'-ctb] = ch_lower,$; 3362 2 [%C's'-ctb] = ch_lower,$; 3363 2 [%C't'-ctb] = ch_lower,$; 3364 2 [%C'u'-ctb] = ch_lower,$; 3365 2 [%C'v'-ctb] = ch_lower,$; 3366 2 [%C'w'-ctb] = ch_lower,$; 3367 2 [%C'x'-ctb] = ch_lower,$; 3368 2 [%C'y'-ctb] = ch_lower,$; 3369 2 [%C'z'-ctb] = ch_lower,; 3370 2 ! numbers"; 3371 2 [%C'0'-ctb] = ch_oct,"; 3372 2 [%C'1'-ctb] = ch_oct,"; 3373 2 [%C'2'-ctb] = ch_oct,"; 3374 2 [%C'3'-ctb] = ch_oct,"; 3375 2 [%C'4'-ctb] = ch_oct,"; 3376 2 [%C'5'-ctb] = ch_oct,"; 3377 2 [%C'6'-ctb] = ch_oct,"; 3378 2 [%C'7'-ctb] = ch_oct,$; 3379 2 [%C'8'-ctb] = ch_8and9,$; 3380 2 [%C'9'-ctb] = ch_8and9,!; 3381 2 ! special characters]%; 3382 2 [%C'$'-ctb] = ch_dollar,=$; 3383 2 [%C'_'-ctb] = ch_under,"; 3384 2 [%C'.'-ctb] = ch_dot,$; 3385 2 [%C','-ctb] = ch_comma,$; 3386 2 [%C':'-ctb] = ch_colon,#; 3387 2 [%C'-'-ctb] = ch_dash,3$; 3388 2 [%C'"'-ctb] = ch_quote,#; 3389 2 [%C'*'-ctb] = ch_wild, #; 3390 2 [%C'%'-ctb] = ch_wild, #; 3391 2 [%C';'-ctb] = ch_misc,[#; 3392 2 [%C'['-ctb] = ch_misc,C"; 3393 2 [%C']'-ctb] = ch_dir, 9];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 112X;X1.10 Classify character 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (34)#; 3394 2 [%C'<'-ctb] = ch_misc,:$; 3395 2 [%C'>'-ctb] = ch_dir ); ; 3396 2 ; 3397 2 BUILTINC; 3398 2 R0; ; 3399 2 ; 3400 2 R0 = .char - ctb;0 ; 3401 2 !; 3402 2 IF .R0 GEQU cte - ctb-; 3403 2 THEN; 3404 3 BEGIN] ; 3405 3 "; 3406 3 SELECTONE .char OF; 3407 3 SET ; 3408 3 ; 3409 3 [0, 9, %C' '] :!; 3410 3 RETURN ch_space; ; 3411 3 ; 3412 3 [OTHERWISE] :!; 3413 3 RETURN ch_other;.; 3414 3 TES; ; 3415 3 ; 3416 2 END; ; 3417 2 %; 3418 2 RETURN .char_types [.R0]; ; 3419 1 END; .NLIST  .LIST BIN,LOC .LIST .PSECT $OWN$, D - CHAR.TYPES:4 .BYTE 7 .BYTE 0 .BYTE 14 .BYTE 11 .BYTE 0 .BYTE 0 .BYTE 0 .BYTE 0 .BYTE 11  .BYTE 0 .BYTE 5 .BYTE 12c .BYTE 13  .BYTE 0 .BYTE 3 .BYTE 3 .BYTE 3 .BYTE 3 .BYTE 3 .BYTE 3 .BYTE 3 h];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 1134X;X1.10 Classify character 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (34) .BYTE 3 .BYTE 16 .BYTE 16S .BYTE 6 .BYTE 17. .BYTE 17. .BYTE 0 .BYTE 10H .BYTE 0 .BYTE 0 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 4 .BYTE 400ašppßmæàmçámýfáþfDATA .BYTE 4 .BYTE 4 .BYTE 17  .BYTE 0 .BYTE 105 .BYTE 0 .BYTE 15. .BYTE 0 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 114.X;X1.10 Classify character 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (34) .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1 .BYTE 1& .SBTTL CH$CLASSIFY Classify character .PSECT $CODE$, RO  .NLISTE .ENABL LSB .LIST CH$CLASSIFY: MOV R1,-(SP) ; 3288 MOV R1,R0 ; CHAR,R0 3400Y SUB #42,R0 ; *,R0a CMP R0,#131 ; R0,* 34021 BLO 4$A TST R1 ; CHAR 3409 BEQ 1$ CMP R1,#11 ; CHAR,*r BEQ 1$g CMP R1,#40 ; CHAR,*E BNE 2$R1$: MOV #2,R1 ; 3406 BR 3$ 2$: CLR R13$: MOV R1,R0 ; 3404 BR 5$-4$: MOVB CHAR.TYPES(R0),R0 ; *(R0),* 3418E5$: MOV (SP)+,R1 ; 3288B RTS PCA8; Routine Size: 25 words, Routine Base: $CODE$ + 10242.; Maximum stack depth per invocation: 2 words .NLIST .DSABL LSB, .NLIST BIN,LOC  .LIST 2];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 115r;X1.10 Copy, upcase, and compress a string and return 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (35)L; 3420 1 %SBTTL 'Copy, upcase, and compress a string and return a status'; 3421 1 GLOBAL_FOR_DEBUGR; 3422 1 ROUTINE ch$copy (len, in_ptr, out_ptr_p; out_ptr) : ch$copy_l NOVALUE= ; 3423 1 ; 3424 1 !++o ; 3425 1 !s%; 3426 1 ! FUNCTIONAL DESCRIPTION:O ; 3427 1 !J; 3428 1 ! The input string is copyed to the output string. During the:; 3429 1 ! copy operation it is upcased and compressed. ; 3430 1 !u ; 3431 1 ! FORMAL PARAMETERS: ; 3432 1 !./; 3433 1 ! len - Length of the input string ,; 3434 1 ! in_ptr - Input buffer pointer/; 3435 1 ! out_ptr_p - Output buffer pointerh ; 3436 1 !pE; 3437 1 ! out_ptr - Points to end of string in the output buffer ; 3438 1 ! ; 3439 1 !-- ; 3440 1 ; 3441 2 BEGIN4 ; 3442 2 ; 3443 2 MAPu5; 3444 2 in_ptr : REF VECTOR [, BYTE, SIGNED], 6; 3445 2 out_ptr : REF VECTOR [, BYTE, SIGNED]; ; 3446 2 ; 3447 2 LOCALO:; 3448 2 state, ! Quote state, zero is unquoted; 3449 2 char; ; 3450 2 F; 3451 2 out_ptr = .out_ptr_p; ! Discard the input parameter now4; 3452 2 state = 0; ! Quote state to unquoted ; 3453 2 ); 3454 2 INCRU i FROM 0 TO .len - 1 DO ; 3455 3 BEGIN $; 3456 3 char = .in_ptr [.i]; ; 3457 3 ; 3458 3 IF .state EQLU 0; 3459 3 THEN; 3460 4 BEGIN ; 3461 4 9; 3462 4 CASE ch$classify (.char) FROM 0 TO ch_max OFO; 3463 4 SET ; 3464 4 ; 3465 4 [ch_other] : ; 3466 4 ; 3467 4 ! ?; 3468 4 ! Characters other than the valid set that aren'tm(; 3469 4 ! quoted won't be upcased.; 3470 4 !t; 3471 5 BEGIN "; 3472 5 out_ptr [0] = .char;$; 3473 5 out_ptr = out_ptr [1]; ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 116 r;X1.10 Copy, upcase, and compress a string and return 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (35); 3474 4 END; ; 3475 4 ; 3476 4 [ch_quote] : ; 3477 5 BEGIN ; 3478 5 ; 3479 5 !i?; 3480 5 ! If quote, change the state and output character ; 3481 5 ! !; 3482 5 state = NOT .state;_"; 3483 5 out_ptr [0] = .char;$; 3484 5 out_ptr = out_ptr [1];; 3485 4 END; ; 3486 4 ; 3487 4 [ch_lower] :2 ; 3488 4 ; 3489 4 !p(; 3490 4 ! Upcase lowercase letters; 3491 4 !2; 3492 5 BEGINR*; 3493 5 char = .char AND NOT %O'40';"; 3494 5 out_ptr [0] = .char;$; 3495 5 out_ptr = out_ptr [1];; 349600a¢p¥nn´cÚµcÛ¶c�·c›’ 4 END; ; 3497 4 ; 3498 4 [ch_space] :a ; 3499 4 ; 3500 4 ! ; 3501 4 ! Remove spacesO; 3502 4 !4; 3503 4 ; ; 3504 4 ; 3505 4 [INRANGE] : ; 3506 4 ; 3507 4 !6'; 3508 4 ! Output valid characters ; 3509 4 !9; 3510 5 BEGIN "; 3511 5 out_ptr [0] = .char;$; 3512 5 out_ptr = out_ptr [1];; 3513 4 END;; 3514 4 TES; ; 3515 4 ; 3516 4 END; 3517 3 ELSE; 3518 4 BEGIN ; 3519 4 ; 3520 4 !2; 3521 4 ! If quoted, output it no matter what; 3522 4 !9; 3523 4 IF .char EQLU %C'"' THEN state = NOT .state; ; 3524 4 !; 3525 4 out_ptr [0] = .char;#; 3526 4 out_ptr = out_ptr [1];5; 3527 3 END;l c];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 1172r;X1.10 Copy, upcase, and compress a string and return 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (35) ; 3528 3 ; 3529 2 END; ; 3530 2 ; 3531 2 !5?; 3532 2 ! Allow unbalanced quoted strings if there is room. ; 3533 2 !a; 3534 2 IF .state NEQU 0; 3535 2 THEN1; 3536 2 IF (.len + 1) LEQU file_spec_size ; 3537 2 THEN; 3538 3 BEGIN!; 3539 3 out_ptr [0] = %C'"';c#; 3540 3 out_ptr = out_ptr [1];B; 3541 2 END; ; 3542 1 END; .NLISTp .LIST BIN,LOC .LIST? .SBTTL CH$COPY Copy, upcase, and compress a string and return 0 .NLIST .ENABL LSB .LIST!CH$COPY:MOV R4,-(SP) ; 34221 MOV R5,-(SP)2 TST -(SP) MOV R2,-(SP)e MOV R1,2(SP)e CLR R5 ; STATE 3452 MOV R1,-(SP) ; 3454 DEC (SP)  CLR R4 ; I BR 8$1$: MOV R4,R2 ; I,* 3456 ADD 2(SP),R2  MOVB (R2),R1 ; *,CHAR TST R5 ; STATE 3458' BNE 4$ JSR PC,CH$CLASSIFY ; 3462 ASL R0 # ADD P.AAG(R0),PC ; Case dispatch"3$: BIC #40,R1 ; *,CHAR 3493 BR 6$ ; 3494"4$: CMP R1,#42 ; CHAR,* 3523 BNE 6$.5$: COM R5 ; STATEC*6$: MOVB R1,(R3)+ ; CHAR,OUT.PTR 35257$: INC R4 ; I 34548$: CMP R4,(SP) ; I,* BLOS 1$ TST R5 ; STATE 3534  BEQ 9$4 MOV 4(SP),R1 ; 3536 INC R1 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 118 r;X1.10 Copy, upcase, and compress a string and return 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (35) CMP R1,#377 BHI 9$$% MOVB #42,(R3)+ ; *,OUT.PTR 3539R9$: ADD #6,SP ; 3422 MOV (SP)+,R5 MOV (SP)+,R4) RTS PCR8; Routine Size: 48 words, Routine Base: $CODE$ + 10324.; Maximum stack depth per invocation: 7 words .PSECT $PLIT$, RO , D /P.AAG: ; CASE Table for CH$COPY+0050 3462i2$: .WORD 16 ; [6$] .WORD 0 ; [3$] .WORD 20 ; [7$]  .WORD 16 ; [6$]e .WORD 16 ; [6$]n .WORD 16 ; [6$]1 .WORD 16 ; [6$]R .WORD 14 ; [5$]0 .WORD 16 ; [6$]7 .WORD 16 ; [6$], .WORD 16 ; [6$]  .WORD 16 ; [6$]  .WORD 16 ; [6$]( .WORD 16 ; [6$]R .WORD 16 ; [6$]t .WORD 16 ; [6$]R .NLIST: .DSABL LSB3 .NLIST BIN,LOCc .LIST o];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 1193r;X1.10 Convert parse block from kernel virtual to user 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (36)L; 3543 1 %SBTTL 'Convert parse block from kernel virtual to user virtual'; 3544 1 GLOBAL_FOR_DEBUGQ; 3545 1 ROUTINE convert_parse (parse_block, k_virtual, u_virtual) : NOVALUE =$ ; 3546 1 ; 3547 1 !++D ; 3548 1 !%; 3549 1 ! FUNCTIONAL DESCRIPTION:O ; 3550 1 !D; 3551 1 ! Convert parse block address fields from kernel virtual; 3552 1 ! to user virtual. ; 3553 1 !a ; 3554 1 ! FORMAL PARAMETERS: ; 3555 1 ! 6; 3556 1 ! parse_block - Address of the parse block?; 3557 1 ! k_virtual - Address of string in executive buffertH; 3558 1 ! u_virtual - Address of corresponding string in user buffer ; 3559 1 !t; 3560 1 !-00aªppßmæàmçámýfáþfDATA- ; 3561 1 ; 3562 2 BEGIN7 ; 3563 2 ; 3564 2 MAP5>; 3565 2 parse_block : REF BLOCK FIELD (parse_block_f); ; 3566 2 ; 3567 2 LOCALs; 3568 2 p : REF VECTOR; ; 3569 2 (; 3570 2 p = parse_block [node_addr]; ; 3571 2 6; 3572 2 WHILE .p LEQA parse_block [access_addr] DO; 3573 3 BEGIN7 ; 3574 3 O; 3575 3 IF .p [0] NEQU 0 THEN p [0] = .p [0] - .k_virtual + .u_virtual;c ; 3576 3 ; 3577 3 p = p [2];; 3578 2 END; ; 3579 2 ; 3580 1 END; .NLIST  .LIST BIN,LOC .LISTE .SBTTL CONVERT.PARSE Convert parse block from kernel virtual to user  .PSECT $CODE$, RO  .NLIST .ENABL LSB  .LISTCONVERT.PARSE: JSR R1,$SAVE2 ; 3545l( MOV 14(SP),R1 ; PARSE.BLOCK,P 3570 ADD #6,R1 ; *,P_( MOV 14(SP),R2 ; PARSE.BLOCK,* 3572 ADD #42,R24 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 120 r;X1.10 Convert parse block from kernel virtual to user 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (36)1$: CMP R1,R2 ; P,* BHI 3$a TST (R1) ; P 3575a BEQ 2$  MOV (R1),R0 ; P,* SUB 12(SP),R0 ; K.VIRTUAL,* ADD 10(SP),R0 ; U.VIRTUAL,* MOV R0,(R1) ; *,P(2$: ADD #4,R1 ; *,P 3577 BR 1$ ; 35723$: RTS PC ; 35458; Routine Size: 24 words, Routine Base: $CODE$ + 10464.; Maximum stack depth per invocation: 4 words .NLIST .DSABL LSBX .NLIST BIN,LOCs .LIST r];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 121 a;X1.10 Save parse block and zero it 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (37);1; 3581 1 %SBTTL 'Save parse block and zero it',; 3582 1 GLOBAL_FOR_DEBUGA; 3583 1 ROUTINE save_parse (out_ptr) : save_parse_l NOVALUE = ; 3584 1 ; 3585 1 !++u ; 3586 1 !D%; 3587 1 ! FUNCTIONAL DESCRIPTION:n ; 3588 1 !rM; 3589 1 ! Copy the parse block to a specified save area and then zero it.aM; 3590 1 ! The operation is done in such a manner that it can be zeroed byX2; 3591 1 ! specifying the output as the scr_pb. ; 3592 1 !C ; 3593 1 ! FORMAL PARAMETERS: ; 3594 1 !L:; 3595 1 ! out_ptr - Address of the output parse block ; 3596 1 ! ; 3597 1 ! IMPLICIT OUTPUTS:v ; 3598 1 !U"; 3599 1 ! Scratch parse block. ; 3600 1 !D; 3601 1 !--U ; 3602 1 ; 3603 2 BEGIN ; 3604 2 ; 3605 2 LOCALe$; 3606 2 in_ptr : REF VECTOR; ; 3607 2 ; 3608 2 MAP %; 3609 2 out_ptr : REF VECTOR; ; 3610 2 ; 3611 2 in_ptr = scr_pb; ; 3612 2 0; 3613 2 DECR i FROM parse_block_size TO 1 DO; 3614 3 BEGIN4*; 3615 3 out_ptr [0] = .in_ptr [0];&; 3616 3 out_ptr = out_ptr [1];; 3617 3 in_ptr [0] = 0;$; 3618 3 in_ptr = in_ptr [1];; 3619 2 END; ; 3620 2 ; 3621 1 END; .NLIST  .LIST BIN,LOC .LIST/ .SBTTL SAVE.PARSE Save parse block and zero it: .NLISTO .ENABL LSB  .LIST SAVE.PARSE:$ MOV #SCR.PB,R2 ; *,IN.PTR 3611 MOV #23,R0 ; *,I 3613p,1$: MOV (R2),(R1)+ ; IN.PTR,OUT.PTR 3615 CLR (R2)+ ; IN.PTR 3617 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 122ta;X1.10 Save parse block and zero it 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (37); SOB R0,1$ ; I,* 3613 RTS PC ; 3583L7; Routine Size: 8 words, Routine Base: $CODE$ + 10544i.; Maximum stack depth per invocation: 0 words .NLISTC .DSABL LSB, .NLIST BIN,LOCM .LIST *];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 123];X1.10 Find Equivalence String 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (38),; 3622 1 %SBTTL 'Find Equivalence String'q; 3623 1 ROUTINE find_something (logical_addr, logical_len ; equiv_addr, equiv_len) : find_equivalence_l =t ; 3624 1 ; 3625 1 !++e ; 3626 1 !4%; 3627 1 ! FUNCTI00a²p¥nn´cÚµcÛ¶c�·c›’ONAL DESCRIPTION:n ; 3628 1 !LM; 3629 1 ! Find the equivalence string for the input logical name. ReturncS; 3630 1 ! status. If the input logical name starts with an '_' then return theu=; 3631 1 ! string less the '_' and the status of terminal.N ; 3632 1 ! ; 3633 1 ! FORMAL PARAMETERS: ; 3634 1 ! 9; 3635 1 ! logical_addr - Address of the logical name_?; 3636 1 ! logical_len - Length of the logical name in bytes ; 3637 1 !+<; 3638 1 ! equiv_addr - Address of the equivalence string:; 3639 1 ! equiv_len - Length of the equivalence string ; 3640 1 !a; 3641 1 ! ROUTINE VALUE: ; 3642 1 !h); 3643 1 ! success, terminal, or errorn ; 3644 1 ! ; 3645 1 !--g ; 3646 1 ; 3647 2 BEGIN ; 3648 2 ; 3649 2 !:; 3650 2 ! Define the LNB fields used in this routine.; 3651 2 !; 3652 2 FIELD; 3653 2 lnb_f =; 3654 2 SEToB; 3655 2 logical_link = [0, 0, 16, 0], ! Link to the next lnbB; 3656 2 logical_table = [1, 0, 8, 0], ! Logical table numberD; 3657 2 logical_type = [1, 8, 8, 0], ! Logical name block typeB; 3658 2 logical_status = [2, 0, 8, 0], ! Logical name statusH; 3659 2 terminal_logical = [2, 0, 1, 0],! Set for terminal logicalI; 3660 2 creator_group_number = [2, 8, 8, 0], ! Creator group numbero?; 3661 2 creator_ucb = [3, 0, 16, 0], ! Creator UCB (user)f?; 3662 2 creator_tcb = [3, 0, 16, 0], ! Creator TCB (task)]K; 3663 2 logical_length = [4, 0, 8, 0], ! Logical name length in bytesaO; 3664 2 equivalence_length = [4, 8, 8, 0], ! 32 word block offset of baseyH; 3665 2 logical_name_start = [5, 0, 16, 0] ! Start of logical name; 3666 2 TES; ; 3667 2 ; 3668 2 LITERAL@; 3669 2 lnb_size = 5; ! Size of the fixed part of the ; 3670 2 ! LNB in words ; 3671 2 ; 3672 2 LOCALE; 3673 2 logical_descriptor : BLOCK [logical_descriptor_size]eL; 3674 2 FIELD (logical_descriptor_f), ! Logical name descriptor block<; 3675 2 lnb_base, ! Base physical address of LNB ,];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 124o];X1.10 Find Equivalence String 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (38) F; 3676 2 lookup_len; ! The length that we actually look up ; 3677 2 ; 3678 2 OWN8; 3679 2 log_buf : VECTOR [ logical_size, BYTE]; ; 3680 2 ; 3681 2 BIND g; 3682 2 lnb = apr6_v : BLOCK [lnb_size] FIELD (lnb_f); ! Logical name descriptor block addressd ; 3683 2 ; 3684 2 LABEL; 3685 2 zero_compress;:; 3686 2 !K; 3687 2 ! Check for an underscore. If there is one return the logical1L; 3688 2 ! name less the underscore as the equivalence string along with&; 3689 2 ! the status of terminal.; 3690 2 !#; 3691 2 IF .logical_len GEQU 1l; 3692 2 THENo; 3693 3 BEGIN4; 3694 3 IF .(.logical_addr)<0,8> EQLU %C'_'8; 3695 3 THEN IF .logical_len EQLU 1 !PKW111+; 3696 3 THEN RETURN error !PKW1114 ; 3697 3 ELSE !PKW111; 3698 4 BEGIN0; 3699 4 equiv_addr = .logical_addr + 1;.; 3700 4 equiv_len = .logical_len - 1;!; 3701 4 RETURN terminal;v; 3702 3 END;h ; 3703 3 D; 3704 3 ! Unfortunately it is possible to call this routineE; 3705 3 ! specifying that a lun is not to be assigned. That F; 3706 3 ! means that the zero compression method of assigningC; 3707 3 ! the lun and then doing a GLUN won't always work.H; 3708 3 ! So we have to do the zero compression by hand. GACK.H; 3709 3 ! We also need to strip off any colons before we do theL; 3710 3 ! lookup. Note that zero compression is only done if thereB; 3711 3 ! is exactly one colon on the end of the logical. ; 3712 3 P; 3713 3 ch$copy (.logical_len, .logical_addr, log_buf [0]; lookup_len);8; 3714 3 looku00aºppßmæàmçámýfáþfDATAp_len = .lookup_len - log_buf [0];9; 3715 3 IF .log_buf [.lookup_len - 1] EQLU %C':'o; 3716 3 THEN!; 3717 4 BEGIN +; 3718 4 lookup_len = .lookup_len - 1; T; 3719 4 IF .log_buf [.lookup_len - 1] EQLU %C':' ! If two colons it's a node/; 3720 4 THEN lookup_len = .lookup_len - 1e; 3721 4 ELSE ; 3722 4 zero_compress:; 3723 5 BEGIN2; 3724 5 MACRO$; 3725 5 !N; 3726 5 ! NEXT_CHAR gets the next character and returns true if success; 3727 5 !; M 3728 5 next_char =; M 3729 5 BEGIN L];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 125-];X1.10 Find Equivalence String 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (38) '; M 3730 5 char = .(.ptr)<0, 8, 1>;e; M 3731 5 ptr = .ptr + 1;!; M 3732 5 .ptr LEQA .end_ptr ; 3733 5 END %; ; 3734 5 ; 3735 5 REGISTER; 3736 5 char; ; 3737 5 ; 3738 5 LOCALf; 3739 5 ptr, ; 3740 5 end_ptr,_; 3741 5 zero_count,; 3742 5 status,; 3743 5 i;- ; 3744 5 7; 3745 5 ptr = log_buf [0]; ! Start of scanE/; 3746 5 end_ptr = .ptr + .lookup_len;U ; 3747 5 g; 3748 5 IF NOT next_char THEN LEAVE zero_compress; ! The first two characters must be letters /; 3749 5 status = ch$classify (.char); H; 3750 6 IF (.status NEQU ch_alpha) AND (.status NEQU ch_lower)+; 3751 5 THEN LEAVE zero_compress;rg; 3752 5 IF NOT next_char THEN LEAVE zero_compress; ! The first two characters must be letters /; 3753 5 status = ch$classify (.char); H; 3754 6 IF (.status NEQU ch_alpha) AND (.status NEQU ch_lower)+; 3755 5 THEN LEAVE zero_compress;E!; 3756 5 zero_count = 0;t<; 3757 5 WHILE next_char DO ! Now look for zeros#; 3758 5 IF .char EQLU %C'0' .; 3759 5 THEN zero_count = .zero_count+1; 3760 5 ELSE EXITLOOP;LX; 3761 5 IF .zero_count EQLU 0 THEN LEAVE zero_compress; ! If none, then leave.P; 3762 5 IF .ptr GTRU .end_ptr THEN ! If no following characters,:; 3763 6 BEGIN ! Then just lop off the zeros6; 3764 6 lookup_len = .lookup_len - .zero_count;#; 3765 6 LEAVE zero_compress;t; 3766 5 END; 5; 3767 5 DO ! Now look for octal digits82; 3768 5 IF ch$classify (.char) NEQU ch_oct ?; 3769 5 THEN LEAVE zero_compress ! Anything else, exit1"; 3770 5 WHILE next_char;A; 3771 5 ptr = log_buf [2]; ! Now chop out the zeros.6; 3772 5 end_ptr = log_buf [2] + .zero_count;9; 3773 5 lookup_len = .lookup_len - .zero_count;r7; 3774 5 DECR i FROM (.lookup_len - 2) TO 0 DO;; 3775 6 BEGIN6; 3776 6 (.ptr)<0, 8, 1> = .(.end_ptr)<0, 8, 1>;; 3777 6 ptr = .ptr + 1;&; 3778 6 end_ptr = .end_ptr + 1;; 3779 5 END; ; 3780 4 END;; 3781 3 END; ; 3782 3 ; 3783 3 ! ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 126 ];X1.10 Find Equivalence String 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (38)oC; 3784 3 ! Settup the input logical name length and address D; 3785 3 ! in the logical descriptor block. Then attempt toE; 3786 3 ! do the translation. The block_type, table_number, H; 3787 3 ! address_base, matching_tcb_ucb fields and $TONYL were0; 3788 3 ! settup during initialization.; 3789 3 ! ; 3790 3 ;; 3791 3 logical_descriptor [length] = .lookup_len;uZ; 3792 3 logical_descriptor [address_disp_apr6] = log_buf [0] + (apr6_v - apr5_v);I; 3793 3 $TONYL = .saved_inhibit_mask; ! Settup the inhibit mask Y; 3794 3 logical_descriptor [block_type] = .init_logical_descriptor [block_type];.]; 3795 3 logical_descriptor [table_number] = .init_logical_descriptor [table_number];$]; 00aÂp¥nn´cÚµcÛ¶c�·c›’3796 3 logical_descriptor [address_base] = .init_logical_descriptor [address_base];e; 3797 3 logical_descriptor [matching_tcb_ucb] = .init_logical_descriptor [matching_tcb_ucb];e ; 3798 3 O; 3799 3 IF TBSRC_BLI (logical_descriptor; lnb_base) THEN RETURN error;; ; 3800 3 C; 3801 3 KISAR6 = .lnb_base; ! Map the logical name blocknK; 3802 3 equiv_len = .lnb [equivalence_length]; ! Return the lengthb ; 3803 3 ; 3804 3 !T; 3805 3 ! The equivalence string follows the logical name string in the lnb; 3806 3 !O; 3807 3 equiv_addr = lnb [logical_name_start] + .lnb [logical_length];l ; 3808 3 ; 3809 3 !,; 3810 3 ! Return terminal if it is.; 3811 3 !N; 3812 3 RETURN IF .lnb [terminal_logical] THEN terminal ELSE success; ; 3813 3 ; 3814 3 END; 3815 2 ELSEv8; 3816 2 RETURN error; ! No logical comming in7; 3817 1 END; ! End of routine find_equivalenceu .NLISTs .LIST BIN,LOC .LIST .PSECT $OWN$, D  .EVENLOG.BUF:.BLKB 3777LNB= -400000 .SBTTL FIND.EQUIVALENCE Find Equivalence String .PSECT $CODE$, RO  .NLIST .ENABL LSB  .LISTFIND.EQUIVALENCE:. ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 127;];X1.10 Find Equivalence String 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (38)  MOV R3,-(SP) ; 3623 MOV R4,-(SP)n MOV R5,-(SP)n SUB #16,SPu MOV R2,R4 ; *,LOGICAL.LENI MOV R1,R0 ; *,LOGICAL.ADDR TST R4 ; LOGICAL.LEN 3691 BNE 1$0 JMP 15$,1$: CMPB (R0),#137 ; LOGICAL.ADDR,* 3694 BNE 4$ % CMP R4,#1 ; LOGICAL.LEN,* 3695 BNE 2$I CLR R1 ; 3698D BR 3$)2$: MOV #1,(SP) ; *,EQUIV.ADDR 36991) ADD R0,(SP) ; LOGICAL.ADDR,EQUIV.ADDRX. MOV R4,2(SP) ; LOGICAL.LEN,EQUIV.LEN 3700 DEC 2(SP) ; EQUIV.LENP MOV #3,R1 ; 36983$: MOV R1,R0 ; 3695, BR 14$M(4$: MOV R4,R1 ; LOGICAL.LEN,* 3713 MOV R0,R2 ; LOGICAL.ADDR,* MOV #LOG.BUF,R3 JSR PC,CH$COPYC) SUB #LOG.BUF,R3 ; *,LOOKUP.LEN 3714B1 CMPB LOG.BUF-1(R3),#72 ; *(LOOKUP.LEN),* 3715P BNE 12$ DEC R3 ; LOOKUP.LEN 3718I1 CMPB LOG.BUF-1(R3),#72 ; *(LOOKUP.LEN),* 3719  BNE 5$V DEC R3 ; LOOKUP.LEN 3720  BR 12$ ; 3719X&5$: MOV #LOG.BUF,R2 ; *,PTR 3745) MOV R3,R5 ; LOOKUP.LEN,END.PTR 3746# ADD R2,R5 ; PTR,END.PTR1# MOVB (R2)+,R1 ; PTR,CHAR 3748  CMP R2,R5 ; PTR,END.PTR7 BHI 12$ JSR PC,CH$CLASSIFY ; 3749 CMP R0,#4 ; STATUS,* 3750 BEQ 6$3 CMP R0,#1 ; STATUS,* BNE 12$ ; 3751&6$: MOVB (R2)+,R1 ; PTR,CHAR 3752 CMP R2,R5 ; PTR,END.PTR1 BHI 12$ JSR PC,CH$CLASSIFY ; 3753 CMP R0,#4 ; STATUS,* 3754 BEQ 7$E CMP R0,#1 ; STATUS,* BNE 12$ ; 3755"7$: CLR R4 ; ZERO.COUNT 3756 ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 128 ];X1.10 Find Equivalence String 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (38)T&8$: MOVB (R2)+,R1 ; PTR,CHAR 3757 CMP R2,R5 ; PTR,END.PTR1 BHI 9$B CMP R1,#60 ; CHAR,* 3758C BNE 9$  INC R4 ; ZERO.COUNT 3759P BR 8$ ; 3758"9$: TST R4 ; ZERO.COUNT 3761 BEQ 12$# CMP R2,R5 ; PTR,END.PTR 3762$ BLOS 10$7, SUB R4,R3 ; ZERO.COUNT,LOOKUP.LEN 3764 BR 12$ ; 3763c$10$: JSR PC,CH$CLASSIFY ; 3768 CMP R0,#3 BNE 12$ ; 3769# MOVB (R2)+,R1 ; PTR,CHAR 3770- CMP R2,R5 ; PTR,END.PTRP BLOS 10$I% MOV #LOG.BUF+2,R2 ; *,PTR 3771,) MOV R4,R5 ; ZERO.COUNT,END.PTR 3772! ADD R2,R5 ; LOG.BUF+2,END.PTR , SUB R4,R3 ; ZERO.COUNT,LOOKUP.LEN 3773$ MOV R3,R0 ; LOOKUP.LEN,I 3774 SUB #2,R0 ; *,I7 BLT 12$-11$: MOVB (R5)+,(R2)+ ; END.PTR,PTR 3776  DEC R0 ; I 3774O BGE 11$612$: MOV R3,4(SP) ; LOOKUP.LEN,LOGICAL.DESCRIP 37918 MOV #LOG.BUF+20000,10(SP) ; *,LOGICAL.DESCRIP+4 3792) MOV00aÊppßmæàmçámýfáþfDATA SAVED.INHIBIT.MASK,$TONYL ; 3793RB MOVB INIT.LOGICAL.DESCRIPTOR+7,13(SP); *,LOGICAL.DESCRIP+6 3794B MOVB INIT.LOGICAL.DESCRIPTOR+6,12(SP); *,LOGICAL.DESCRIP+6 3795A MOV INIT.LOGICAL.DESCRIPTOR+2,6(SP) ; *,LOGICAL.DESCRIP+2 3796M) MOV INIT.LOGICAL.DESCRIPTOR+10,14(SP) ; ,# ; *,LOGICAL.DESCRIP+10 3797) MOV #4,R0 ; 3799! ADD SP,R0 ; LOGICAL.DESCRIP,*B JSR PC,TBSRC.BLI, BLO 15$% MOV R3,KISAR6 ; LNB.BASE,* 3801#! CLR 2(SP) ; EQUIV.LEN 3802E$ MOVB @#140011,2(SP) ; *,EQUIV.LEN! CLR (SP) ; EQUIV.ADDR 3807G$ MOVB @#140010,(SP) ; *,EQUIV.ADDR! SUB #37766,(SP) ; *,EQUIV.ADDRD BIT #1,@#140004 ; 3812E BEQ 13$ MOV #3,R0 BR 16$A13$: MOV #1,R014$: BR 16$ ; 3816 15$: CLR R0 ; 3623E I];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 129 ];X1.10 Find Equivalence String 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (38)C!16$: MOV 2(SP),R2 ; EQUIV.LEN,*V MOV (SP)+,R1 ; EQUIV.ADDR,* ADD #14,SP MOV (SP)+,R5 MOV (SP)+,R4# MOV (SP)+,R3  RTS PCD9; Routine Size: 168 words, Routine Base: $CODE$ + 10564 /; Maximum stack depth per invocation: 13 wordsV .NLIST4 .DSABL LSB; .NLIST BIN,LOCC .LIST 3];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 130P\;X1.10 Convert RAD50 to ASCII 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (39)+; 3818 1 %SBTTL 'Convert RAD50 to ASCII'Vz; 3819 1 ROUTINE RAD50_to_ASCII (ascii_len, ascii_addr, rad50_addr; return_ascii_addr) : RAD50_to_ASCII_l NOVALUE = ; 3820 1 ; 3821 1 !++E ; 3822 1 !a%; 3823 1 ! FUNCTIONAL DESCRIPTION:o ; 3824 1 !K; 3825 1 ! Convert a RAD50 string to ASCII. Trailing blanks suppressed.e ; 3826 1 !6; 3827 1 !--B; 3828 2 BEGINg; 3829 2 MAPr-; 3830 2 ascii_addr : REF VECTOR [,BYTE],O4; 3831 2 return_ascii_addr : REF VECTOR [,BYTE],%; 3832 2 rad50_addr : REF VECTOR; ; 3833 2 ; 3834 2 LOCALa4; 3835 2 t : VECTOR [2], ! Temporary for divide; 3836 2 char,; 3837 2 control; ; 3838 2 3; 3839 2 return_ascii_addr = ascii_addr [0];8 ; 3840 2 ; 3841 2 ! 3; 3842 2 ! Move the string to output buffer.; 3843 2 ! 2; 3844 2 control = 0; ! Initialize control ; 3845 2 .; 3846 2 DECR i FROM .ascii_len TO 1 DO; 3847 3 BEGIN; 3848 3 BUILTIN; 3849 3 EDIV; ; 3850 3 ; 3851 3 IF .control EQL 0; 3852 3 THEN8; 3853 4 BEGIN; 3854 4 t [1] = 0;8); 3855 4 t [0] = .rad50_addr [0];8-; 3856 4 rad50_addr = rad50_addr [1];i!; 3857 4 control = 40*40;1; 3858 3 END; ; 3859 3 0; 3860 3 IF .t [0] GTRU (39*40 + 39)*40 + 39; 3861 3 THENo; 3862 3 char = '?'; 3863 3 ELSE8; 3864 4 BEGIN0; 3865 4 EDIV (control, t, char, t [0]); ; 3866 4 $; 3867 4 SELECTONEU .char OF; 3868 4 SETl ; 3869 4 ; 3870 4 [0] :3; 3871 4 EXITLOOP;  t];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 131r\;X1.10 Convert RAD50 to ASCII 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (39) ; 3872 4 ; 3873 4 [1 TO 26] :8+; 3874 4 char = .char + %C'A' - 1; ; 3875 4 ; 3876 4 [27] :,; 3877 4 char = .char + %C'$' - 27; ; 3878 4 ; 3879 4 [28] :,; 3880 4 char = .char + %C'.' - 28; ; 3881 4 ; 3882 4 [29] :,; 3883 4 char = .char + %C'?' - 29; ; 3884 4 ; 3885 4 [OTHERWISE] : ,; 3886 4 char = .char + %C'0' - 30;; 3887 4 TES;; 3888 3 END;0 ; 3889 3 +; 3890 3 return_ascii_addr [0] = .char;7; 3891 3 return_ascii_addr = return_ascii_addr [1];r#; 3892 3 control = .control/40;6; 3893 2 END; ! DECR ; 3894 2 ); 3895 1 END; ! RAD50_to_ASCII  .NLIST  .LIST BIN,LOC00aÒp¥nn´cÚµcÛ¶c�·c›’ .LIST- .SBTTL RAD50.TO.ASCII Convert RAD50 to ASCII2 .NLIST .ENABL LSB  .LISTRAD50.TO.ASCII:; MOV R1,-(SP) ; 3819 MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP)r CMP -(SP),-(SP) CLR R5 ; CONTROL 3844% MOV R1,-(SP) ; ASCII.LEN,I 3846r BLE 8$i1$: TST R5 ; CONTROL 3851  BNE 2$s CLR 4(SP) ; T+2 3854) MOV (R3)+,2(SP) ; RAD50.ADDR,T 3855# MOV #3100,R5 ; *,CONTROL 38574&2$: CMP 2(SP),#174777 ; T,* 3860 BLOS 3$ MOV #77,R4 ; *,CHAR 3862 BR 7$ ; 3860!3$: MOV 2(SP),R1 ; T,* 3865  MOV 4(SP),R0 ; T,* DIV R5,R0 ; CONTROL,*( MOV R0,R4 ; *,CHAR (];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 132(\;X1.10 Convert RAD50 to ASCII 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (39) MOV R1,2(SP) ; *,T( TST R4 ; CHAR 3870 BEQ 8$ ; 3871  CMP R4,#32 ; CHAR,* 3873( BHI 4$7 ADD #100,R4 ; *,CHAR 3874 BR 7$ ; 3867"4$: CMP R4,#33 ; CHAR,* 3876 BNE 5$1 ADD #11,R4 ; *,CHAR 3877  BR 7$ ; 3867"5$: CMP R4,#34 ; CHAR,* 3879 BEQ 6$ ; 3880  CMP R4,#35 ; CHAR,* 3882: BNE 6$- ADD #42,R4 ; *,CHAR 3883( BR 7$ ; 3867"6$: ADD #22,R4 ; *,CHAR 388617$: MOVB R4,(R2)+ ; CHAR,RETURN.ASCII.AD 3890P! MOV R5,R1 ; CONTROL,* 38928 SXT R08 DIV #50,R07 MOV R0,R5 ; *,CONTROL  DEC (SP) ; I 38460 BNE 1$ 8$: ADD #6,SP ; 3819 MOV (SP)+,R5 MOV (SP)+,R4R MOV (SP)+,R3E MOV (SP)+,R1R RTS PCC8; Routine Size: 71 words, Routine Base: $CODE$ + 11304/; Maximum stack depth per invocation: 11 words  .NLIST .DSABL LSBE .NLIST BIN,LOC  .LIST ; 3896 1 (; 3897 1 END ! End of module ; 3898 1 ; 3899 0 ELUDOM .NLISTR .LIST BIN,LOC .LIST; OTS external references .GLOBL $SAVE5, $SAVE3, $SAVE2 .PSECT $OWN$, D ( ];DRPFN Logical Name Directives 8-Aug-1986 14:08:19 VAX-11 Bliss-16 V4.1-582 Page 133(\;X1.10 Convert RAD50 to ASCII 8-Aug-1986 14:08:02 [RSX_SOURCES.DRPFN]DRPFN.BLI;502 (39) .EVEN; PSECT SUMMARYo;i!; Psect Name Words ; AttributesS1; $OWN$ 747 ; RW , D , LCL, REL, CON 2; $CODE$ 2473 ; RO , I , LCL, REL, CON2; $PLIT$ 100 ; RO , D , LCL, REL, CON; Library Statistics;L9; -------- Symbols -------- Pages ProcessingD9; File Total Loaded Percent Mapped Time1;i\; SYS$COMMON:[SYSLIB]RSX11M.L16;1 1500 5 0 96 00:00.2[; SYS$COMMON:[SYSLIB]FCS11.L16;1 396 32 8 42 00:00.2i; COMMAND QUALIFIERS7; BLISS/PDP/MACH=(ASS,NOBIN)/NOOBJ/LIST=DRPFN.MAC DRPFN #; Size: 2473 code + 848 data words ; Run Time: 01:39.8; Elapsed Time: 02:38.6; Lines/CPU Min: 2345; Lexemes/CPU-Min: 19712; Memory Used: 567 pages; Compilation Complete e .SBTTL Assign the LUN; B; This routine is called to assign the LUN. This is a duplication;; of the code in DRASG. DRASG should be moved into the 4th 3; directive common so that this code may be common.i;;#; R3=ADDRESS OF THE LUN IN THE DPB. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.R,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; R0=Device name; R1=Unit number; R2=Terminal logical flag;:?; Outputs: The address of a routine to call to return status iso; returned in R0;e&; Directive status of +1 is returned.;e5; Directive status of 'D.RS90' is returned if a file 2; is open or unit attached on the specified LUN.5; Directive status of 'D.RS92' is returned if devicem; and/or unit is invalid. ;- .PSECTEDNAME: .BLKW 1UNITN: .BLKW 1TFLAG: .BLKW 1 TUCB: .BLKW 1D LUN.ASSIGN:  MOV R0,DNAME ; Save inputsc MOV R1,UNITNi MOV R2,TFLAGT% CALL $MPLUN ; Map LUN to device UCBa" TST (R1) ; File accessed on LUN? BNE 40$ ; If ne yese# MOV R0,-(SP) ; Save addre00aÚppßmæàmçámýfáþfDATAss of UCB+- MOV R1,R4 ; Save address of second LUN wordS" MOV DNAME,R2 ; Get name of device MOVB UNITN,R0 ; Get unit number .IF DF M$$MUP$ BIT #T3.SLV,T.ST3(R5) ; Slave task?2 BNE 17$ ; If ne yes, bypass logical device table .ENDC TST TFLAG ;L1 BNE 17$ ; Terminal logical name. don't do more  ; translations. MOV T.UCB(R5),R1 ; Get the current task's ti: CALL $GTUSR: MOV #$LNTDR,-(SP) ; Resolve any logical name translations5 CALL $MPDC3 ; Use routine in third directive common / BCC 17$ ; If CC, successfully matched logicalr3 TST R3 ; See if error occurred or no match at all0) BNE 50$ ; If ne, invalid match occurredT2 MOV #$LOGHD,R3 ; Point to logical assignment list-13$: MOV (R3),R3 ; Get address of next entryT BEQ 17$ ; If eq end of listl* TSTB L.TYPE(R3) ; System wide assignment? BEQ 15$ ; If eq yes)1 CMP L.UCB(R3),T.UCB(R5) ; TI: UCB address match?V BNE 13$ ; If ne no*15$: CMP R2,L.NAM(R3) ; Device name match? BNE 13$ ; If ne no( CMPB R0,L.UNIT(R3) ; Unit number match? BNE 13$ ; If ne no. MOV L.ASG(R3),R1 ; Get assignment UCB address BR 25$ ; Finish in common code517$: MOV #$DEVHD,R3 ; Point to physical device tablesg+20$: MOV (R3),R3 ; Get address of next DCB  BEQ 50$ ; If eq end of tables & CMP R2,D.NAM(R3) ; Device name match? BNE 20$ ; If ne noA CMPB R0,D.UNIT(R3) ; Unit greater than or equal to low boundary?e BLO 20$ ; If lo noA CMPB R0,D.UNIT+1(R3) ; Unit less than or equal to high boundary?  BHI 20$ ; If hi no3 SUB D.UNIT(R3),R0 ; Calculate relative unit numberM# BIC #177400,R0 ; Clear excess bitsa/ MOV D.UCBL(R3),R1 ; Get length of UCB in bytesM' CALL $MUL ; Calculate number of bytest, ADD D.UCB(R3),R1 ; Calculate address of UCB25$: ; Ref labelf .IF DF V$$TRM# MOV (R1),R3 ; Point to device DCB7 CMP D.NAM(R3),#"VT ; Is the device a virtual terminal?t BNE 26$ ; If ne no0 CMP U.PTCB(R1),R5 ; Is issuing task the parent? BEQ 26$ ; If eq no1 CMP R1,T.UCB(R5) ; Is issuing task an offspring?S BNE 50$ ; If ne no .ENDC026$: MOV (SP)+,R3 ; Was LUN previously assigned? BEQ 30$ ; If EQ no2 CMP R5,U.ATT(R3) ; Unit attached to current task? BNE 27$ ; If NE no/ MOV R1,-(SP) ; Save new assignment UCB address: MOV R1,R0 ; Copy UCB address' CALL $MPLND ; Map to real UCB addressC3 MOV (SP)+,R1 ; Retrieve new assignment UCB addressm/ CMP R0,R3 ; New assignment to same final UCB?; BNE 35$ ; If NE no127$: MOV R3,R5 ; Copy old assignment UCB addresss& MOV R1,-(R4) ; Assign LUN to new unit. MOV R1,TUCB ; Save the UCB address to return CALL $IOKIL" CLR R0 ; No bad status to return& MOV TUCB,R1 ; Return the UCB address31$: RETURN ;f*30$: MOV R1,-(R4) ; Assign LUN to new unit BR 31$s(35$: MOV R1,-(SP) ; Save new UCB pointer .IF DF X$$HDR( MOV $SAHPT,R1 ; Get task header address .IFFn( MOV $HEADR,R1 ; Get task header address .ENDC- ADD #H.NLUN,R1 ; Point to the number of LUNs  MOV (R1),-(SP) ; Pick up counts637$: CMP (R1)+,(R1)+ ; Advance to next UCB pointer + 2+ CMP R1,R4 ; Same LUN as being reassigned?I BEQ 39$ ; If eq yesa( MOV -2(R1),R0 ; Get this LUN assignment# BEQ 39$ ; If eq, LUN not assigned/ CALL $MPLND ; Follow any redirect; handle ti:s4 CMP R0,R3 ; LUN assigned to same dev as reass LUN? BNE 39$ ; No, branch TST (SP)+ ; Remove count& MOV (SP)+,R1 ; Get new LUN assignment+ BR 27$ ; If eq yes, attach can be ignored "39$: DEC (SP) ; Point to next LUN BGT 37$ ; Try againn CMP (SP)+,(SP)+ ; Clean stack)40$: MOV #RS90,R0 ; Status return routinee RETURNe50$: TST (SP)+ ; Clean stacke% MOV #RS92,R0 ; Status return routines RETURN*RS90: DRSTS D.RS90 ; Set directive status*RS92: DRSTS D.RS92 ; Set directive status P8 .SBTTL Registers save and restore routines for BLISS-16; B; Register save and restore routines used by BLISS generated code.;i .PSECT BL$COD,RO,I,LCL,CON  $SAVE2:g MOV R2,-(SP)C MOV R1,-(SP)t MOV 4(SP),R1T JSR PC,@(SP)+ BR RE2($SAVE3:; MOV R00aâpbæpn´cÚµcÛ¶c�·c›’2,-(SP) MOV R3,-(SP)R MOV R1,-(SP)r MOV 6(SP),R1T JSR PC,@(SP)+ BR RE3 $SAVE4:e MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP)R MOV R1,-(SP)T MOV 8.(SP),R1 JSR PC,@(SP)+ BR RE4R$SAVE5: MOV R2,-(SP) MOV R3,-(SP)B MOV R4,-(SP)a MOV R5,-(SP)r MOV R1,-(SP)S MOV 10.(SP),R1t JSR PC,@(SP)+ MOV (SP)+,R5eRE4: MOV (SP)+,R4dRE3: MOV (SP)+,R3 RE2: MOV (SP)+,R2 MOV (SP)+,R1g RTS PC, A .SBTTL Stub routines to call routines in other directive commons; .PSECT(;+C; $DCBTA - Routine to turn a binary value into an ASCII text stringE; ; Inputs:); R0 - Number to be translated into ASCIIP3; R3 - Pointer to buffer to store translated numberB;E ; Outputs:$; R3 - Points past the number string;RH; This routine will not translate a zero unit number into an ASCII digit;M;- DCBTA.BLI:, BIC #177400,R0 ;PREVENT SIGN PROPAG. IN ASH! ;(0 ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; B. S. MCCARTHY 28-NOV-83 ; & ; MODIFIED FOR RSX-11M-PLUS V4.0 BY: ;T ; R. D. HANEY 25-APR-86.0 ; RDH047 ADD SYMBOLS FOR BYE AND HELLO 01.01 ;% ; B. S. MCCARTHY 10-MAY-86 01.02L0 ; BM370 -- ADD SYMBOLS NEEDED BY SPM-11M-PLUS ;" ; G. N. LARSEN 5-JUN-86 01.03 ; GNL040 ADD SYMBOL FOR PMT  ;R$ ; T. SCHOELLER 18-JULY-86 01.04' ; TMS038 ADD SYMBOLS FOR DMO AND MOUL ;E# ; G. N. LARSEN 28-JUL-86 01.05I, ; GNL048-- ADD VECTORED SYMBOLS FOR MSDRV ;$ ; T. SCHOELLER 30-JULY-86 01.06" ; TMS038 ADD SYMBOLS FOR F11ACP ;T" ; R. KRISHNA 31-JULY-86 01.07 ; RK050 ADD SYMBOLS FOR MCR ;0# ; G. N. LARSEN 15-AUG-86 01.08-7 ; GNL048-- ADD VECTORED SYMBOLS FOR DLDRV, ERROR LOG- ;# ; G. N. LARSEN 20-SEP-86 01.09.. ; GNL048-- ADD VECTORED SYMBOLS FOR INSTALL ;H# ; G. N. LARSEN 17-OCT-86 01.103, ; GNL061 -- ADD ADDITIONAL DECNET SYMBOLS ;S% ; B. S. MCCARTHY 20-OCT-86 01.11D+ ; BM374 -- ADD ADDITIONAL DECNET SYMBOLSH ;R# ; J. W. BERZLE 29-OCT-86 01.12 / ; JWB185 -- CONDITIONALIZE $RTF01/2 ON MPNET8 ;0# ; J. W. BERZLE 28-JAN-87 01.13( ; JWB190 -- ADD SYMBOL $TNAME FOR MCR ; " ; G. N. LARSEN 4-FEB-87 01.145 ; GNL065 -- ADD ADDITIONAL TASK AND DRIVER SYMBOLS1 ;$ ; B. S. MCCARTHY 9-FEB-87 01.153 ; BM383 -- ADD THE SYMBOLS THAT ARE MISSING FROM ; THE ABOVED ;T# ; J. W. BERZLE 20-FEB-87 01.16 . ; JWB193 -- CONDITIONALIZE $TRINT ON C$$CDA ;I$ ; B. S. MCCARTHY 5-MAR-87 01.170 ; BM385 -- ADD SFVEC ENTRY POINT FOR BEING IN ; VEC11M ; $ ; B. S. MCCARTHY 7-MAR-87 01.18" ; BM386 -- ADD $TTPRM TO VECTOR ;T$ 00bêppßmæàmçámýfáþfDATA; B. S. MCCARTHY 7-MAR-87 01.19" ; BM387 -- ADD $WCFLG TO VECTOR ;T% ; B. S. MCCARTHY 20-APR-87 01.20& ; BM396 -- ADD $CPSEN,$CPALO,$CPDEA ;3$ ; B. S. MCCARTHY 7-JUL-87 01.21% ; BM403 -- ADD XDT AND CPR SYMBOLS  ;E; EXEC VECTORING ROUTINE; C; AS YOU MAY HAVE NOTICED IN THE .TITLE DIRECTIVE, THIS MODULE IS G; ASSEMBLED CONDITIONALLY UPON R$$MPL. THE MODULE IS ASSEMBLED TWICE.I; THE FIRS TIME (ASSEMBLED WITH RSXMC), PRODUCES THE VECTOR CODE ITSELFTL; FOR THE EXEC (MODULE SFVC2). THE SECOND ASSEMBLY, WITHOUT RSXMC, CREATESJ; AN OBJECT MODULE (MODULE EXESTB) WHICH CAN BE TASKBUILT INTO THE DUMMY; STB FILE FOR THE EXECUTIVE.C;+0; **-$SFVCD-TRANSLATE EXEC VECTOR (FOR DRIVER)6; **-$SFVCP-TRANSLATE EXEC VECTOR (FOR COMM PROCESS);HH; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TRANSLATE A VECTOR OF OFFSETSH; INTO THE SYSTEM VECTOR (DEFINED BELOW) INTO OFFSETS. SEE COMMENTS ON; BUFFER FORMAT BELOW.;T&; * * * N O T E W E L L * * * ;UK!; THESE ROUTINES ARE AT VIRTUAL ZERO IN THE DIRECTIVE COMMON. THE ROUTINE(J"; COULD BE MOVED, BUT LABEL $SFVCP HAD BETTER STAY AT ZERO FOR ALL TIME,#; AND $SFVCD AT VIRTUAL 4$$;- %; INPUTS:C&;O='; R2=NUMBER OF ENTRIES IN VECTOR (NUMBER OF WORDS, LESS ONER(; FOR FLAGS WORD)(); R3=ADDRESS OF WD. 00. OF THE BUFFER.*;F9+; CALLING SEQUENCE ($SFVCD): (REGISTER USAGE ARBITRARY)F,;.3-; MOV @#112,R0 ;GET POINTER TO VECTOR OF POINTERS 7.; MOV @(R0),KINAR6 ;MAP ROUTINE WITH CORRECT APR BIASN)/; CALL @#140004 ;CALL TRANSLATE ROUTINEM0;H91; CALLING SEQUENCE ($SFVCP): (REGISTER USAGE ARBITRARY) 2;A33; MOV @#112,R0 ;GET POINTER TO VECTOR OF POINTERS64; MOV @(R0),-(SP) ;MAP ROUTINE WITH CORRECT APR BIAS55; MOV #120000,-(SP) ;GET ADDR. OF TRANSLATE ROUTINEW56; CALL $MPPRO ;CALL ROUTINE IN EXEC WHICH MAPS AND7; ;CALLS TRANSLATE ROUTINEI8;U 9; OUTPUTS::;8;; THE VECTOR IS FILLED WITH THE REQUESTED INFORMATION.<;O=;-> .PAGE?@ .IF DF R$$MPLA=B$SFVCP::JMP SFVCC ;ENTRY POINT TO TRANSLATE PROCESS VECTOR C4D$SFVCD:: ;ENTRY POINT TO TRANSLATE DRIVER VECTOREF .IF DF K$$DASG1H MOV @#KDSAR6,-(SP) ;SAVE MAPPING OF DATA SPACE 7I MOV @#KINAR6,@#KDSAR6;OVERMAP I/D (CALLER CAN'T TELL %J ;THIS MUST BE DONE, BECAUSE THEA)K ;FEATURE MASK ISN'T AVAILABLE YET). LM .ENDC ; DF K$$DASN#O TST (R3) ;FIRST WORD NON-ZERO ?*P ;(IMPLIES VECTOR ALREADY TRANSLATED)"Q BNE 40$ ;IF NE YES, RETURN NOWR5S INC (R3)+ ;SET FLAG FOR VECTOR ALREADY TRANSLATEDO$T10$: MOV (R3),R0 ;GET NEXT OFFSET'U CMP R0,#MAXOFF ;PAST END OF VECTOR ?EV BHIS 20$ ;IF HIS YESW BIT #1,R0 ;ODD ?X BNE 20$ ;IF NE YES2Y MOV EXEVEC+20000(R0),(R3)+ ;INSERT REAL ADDRESSZ BR 30$ ;FINISH LOOPT[C\20$: MOV #160001,(R3)+ ;THIS ADDRESS SHOULD ALWAYS RESULT IN TRAP -] ;(IT'S ODD AND GUARANTEED NON-EXISTENT)I^_30$: SOB R2,10$ ;FINISH LOOP `40$:a .IF DF K$$DASb+c MOV (SP)+,@#KDSAR6 ;RESTORE APR6 MAPPING(de .ENDC ; DF K$$DASf g RETURN ;Oh'i .BLKW 50. ; ***** PATCH SPACE *****Pjk .ENDC ; DF R$$MPLl .PAGEm;+#n; **-$SFVC2-TRANSLATE EXEC VECTORDo;Hp; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TRANSLATE A VECTOR OF OFFSETSHq; INTO THE SYSTEM VECTOR (DEFINED BELOW) INTO OFFSETS. SEE COMMENTS ONr; BUFFER FORMAT BELOW.s; t; DPB FORMAT:Au;E%v; WD. 00 -- DIC(169.),DPB SIZE(4.). 0w; WD. 01 -- SUBFUNCTION CODE (15.) (LOW BYTE).x; WD. 02 -- BUFFER ADDRESS. %y; WD. 03 -- BUFFER SIZE (IN WORDS).z;T{; BUFFER FORMAT:|;.9}; WD. 00 -- RETURNED AS ADDRESS OF ROUTINE/DATA CELL.*~; WD. 01 -- OFFSET INTO SYSTEM VECTOR; WD. 02/03 -- SECOND PAIR€; .�; .‚; .ƒ;A „; INPUTS:F…;,†; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.(‡; R3=ADDRESS OF WD. 00. OF THE BUFFER.*ˆ; R5=TCB ADDRESS OF THE REQUESTING TASK.‰; Š; OUTPUTS:‹; ?Œ; THE USER'S BUFFER IS FILLED WITH THE REQUESTED INFORMATION. �;2Ž;-� .PA00bòpæpn´cÚµcÛ¶c�·c›’GE�‘ .IF DF R$$MPL’ “ .ENABL LSB)”B”$SFVEC::INC R2 ;ALLOW FOR MANDATORY PARAMETER IN COUNT ; BM385,– MOV R2,R0 ;COPY NUMBER OF WORDS ;**-1 — INC R0 ;ALLOW FOR FLAGS WORD&˜ ASL R0 ;CONVERT TO NUMBER OF BYTES'™ ADD R3,R0 ;POINT PAST END OF BUFFERNš BCS 50$ ;IF CS WRAPS AROUNDE5› CMP R0,#160000 ;IS IT PAST MAPPING RANGE OF APR6 ?B%œ BHI 50$ ;IF HI YES - RETURN ERROR�)žSFVCC: TST (R3) ;FIRST WORD NON-ZERO ?L*Ÿ ;(IMPLIES VECTOR ALREADY TRANSLATED)"  BNE 40$ ;IF NE YES, RETURN NOW¡5¢ INC (R3)+ ;SET FLAG FOR VECTOR ALREADY TRANSLATEDA$£10$: MOV (R3),R0 ;GET NEXT OFFSET'¤ CMP R0,#MAXOFF ;PAST END OF VECTOR ?¥ BHIS 20$ ;IF HIS YES¦ BIT #1,R0 ;ODD ?§ BNE 20$ ;IF NE YES,¨ MOV EXEVEC(R0),(R3)+ ;INSERT REAL ADDRESS© BR 30$ ;FINISH LOOPOªC«20$: MOV #160001,(R3)+ ;THIS ADDRESS SHOULD ALWAYS RESULT IN TRAP -¬ ;(IT'S ODD AND GUARANTEED NON-EXISTENT)3­®30$: SOB R2,10$ ;FINISH LOOPM¯40$: RETURN ;Y°5±50$: DRSTS D.RS98 ;INVALID VECTOR BUFFER SPECIFIEDC² ³ .DSABL LSBO´'µ .BLKW 50. ; ***** PATCH SPACE *****,¶· .ENDC ; DF R$$MPL¸ .PAGE¹"º; MACRO TO DEFINE VECTOR ENTRIES»¼ .MACRO VECTOR ENTRY,COND?½¾ .IF NDF R$$MPLS¿À'ENTRY'==OFFSET)ÁOFFSET=OFFSET+2EÂà .IFF ; NDF R$$MPLÄÅ .IF NB COND0ÆÇ .IF DF CONDÈÉ .WORD ENTRYÊË .IFF ; DF COND ÌÍ .WORD 160001ÎÏ .ENDC ; DF CONDÐÑ .IFF ;NB CONDDÒÓ .WORD ENTRYÔÕ .ENDC ; NB CONDÖ× .ENDC ; NDF R$$MPL5ØÙ .ENDM VECTORCÚ;Û; MACRO FOR ENTRIES WHOSE NAMES DON'T APPEAR IN DUMMY STBFÜÝ .MACRO NOSTB ENTRY,CONDÞß .IF NDF R$$MPLàáOFFSET=OFFSET+2âã .IFF ; NDF R$$MPLäå .IF NB COND.æç .IF DF CONDèé .WORD ENTRY.êë .IFF ; DF CONDWìí .WORD 160001îï .ENDC ; DF CONDðñ .IFF ;NB COND.òó .WORD ENTRYôõ .ENDC ; NB COND ö÷ .ENDC ; NDF R$$MPLDøù .ENDM NOSTBú-û; MACRO TO DEFINE SYNONYMS FOR ENTRY POINTS üý .MACRO SYNONM ENTRYþÿ .IF NDF R$$MPL 'ENTRY'==OFFSET-2  .ENDC ; NDF R$$MPLR .ENDM SYNONMO2; DEFINE LOCAL SYMBOLS FOR MULTIPLE CONDITIONALS  .IF DF M$$EXT&U$$UMR   EXTUMR = 0R   .ENDC ;DF M$$EXT&U$$UMR .IF DF S$$WPC&D$$ISK0  SWAP=0  .ENDC ;DF S$$WPC&D$$ISK .IF DF C$$CDA .IIF EQ C$$CDA-12 CDA$MS=0 .IIF EQ C$$CDA CDA$MS=0 .ENDC ;DF C$$CDA .IF DF M$$NET&M$$PROR  MPNET=0!" .ENDC ; DF M$$NET&M$$PRO#$ .IF DF L$$XDT&M$$PROY% & MPLXDT=0'( .ENDC ; DF L$$XDT&M$$PRON)* .PAGE+,; THE VECTOR TABLE ITSELFL-?.; AS OF FIELD TEST, THE VECTOR FOR THE VERSION 3.0 RELEASE IS5/; FROZEN. ADD NEW SYMBOLS AT THE END OF THE VECTOR.C0;S12 .IF NDF R$$MPL3 4 OFFSET = 0&56 .IFF7 8EXEVEC:C9: .ENDC ; NDF R$$MPL2;< VECTOR D.VINT= VECTOR KISAR0> VECTOR KISAR5? VECTOR KISAR6@ VECTOR KISAR7A VECTOR P.LGTHB VECTOR S.CTM;C VECTOR S.FRKD VECTOR S.EMB$E VECTOR S.ITMF VECTOR S.KRBG VECTOR S.KS5,L$$DRVH VECTOR S.KTBEI VECTOR S.LHDTJ VECTOR S.PKTK VECTOR S.RCNTL VECTOR S.ROFFM VECTOR S.STS3N VECTOR S.ST2O VECTOR S.ST3 P VECTOR S.URMDQ VECTOR T.ACNR VECTOR T.CPUNS VECTOR T.EXTT VECTOR T.IRMU VECTOR T.ISIZV VECTOR T.LGTHW VECTOR T.OCBHX VECTOR T.RDCTY VECTOR T.RRMAZ VECTOR UISAR0[ VECTOR UISAR1\ VECTOR UISAR6] VECTOR UISAR7^ VECTOR UISDR6_ VECTOR UISDR7` VECTOR U.UABMa VECTOR V$$CTRb VECTOR W.MAPRc VECTOR W.RTRVd VECTOR W.USE,P$$WNDe VECTOR W.VBNHf VECTOR W.WISZg VECTOR .LB0h VECTOR .CO0i VECTOR .TT0j VECTOR $ABTIMk VECTOR $ABTM2l VECTOR $ABTSKm VECTOR $ACCRGn VECTOR $ACHCKo VECTOR $ACHKBp VECTOR $ACHROq VECTOR $ACNFEr VECTOR $ACTHDs VECTOR $ACTPSt VECTOR $A00búppßmæàmçámýfáþfDATALACCu VECTOR $ALOCBv VECTOR $ALOC1w VECTOR $ALSECx VECTOR $ALTABy VECTOR $ALVBKz VECTOR $APLIM{ VECTOR $ASUMR,EXTUMR7| VECTOR $BCBUF,C$$CDAC} VECTOR $BILNG~ VECTOR $BLXIO VECTOR $BTTIM€ VECTOR $BTTM2� VECTOR $CBDHD‚ VECTOR $CEFIƒ VECTOR $CEFN„ VECTOR $CEX… VECTOR $CFLPT† VECTOR $CKBFB‡ VECTOR $CKBFRˆ VECTOR $CKCSR‰ VECTOR $CKMAPŠ VECTOR $CKURM‹ VECTOR $CLICQŒ VECTOR $CLINS� VECTOR $CLKHDŽ VECTOR $CLRMV� VECTOR $CLSRF� VECTOR $CNTLN‘ VECTOR $COMEF’ VECTOR $COPTV“ VECTOR $CPBIT” VECTOR $CPCRM• VECTOR $CPMSK– VECTOR $CPTBL— VECTOR $CPUSC˜ VECTOR $CPURM™ VECTOR $CPUTMš VECTOR $CPUT1› VECTOR $CRALT,C$$CDATœ VECTOR $CRATT� VECTOR $CRAVLž VECTOR $CRBAE,C$$CDAVŸ VECTOR $CRCSR,C$$CDAC  VECTOR $CRDEV,C$$CDAV¡ VECTOR $CRKRB,C$$CDAC¢ VECTOR $CRMS0,C$$CDA£ VECTOR $CRMS3,C$$CDA ¤ VECTOR $CRMS6,C$$CDA¥ VECTOR $CRMTB¦ VECTOR $CRPAR,C$$CDAO§ VECTOR $CRPKT¨ VECTOR $CRSBN,C$$CDAN© VECTOR $CRSCS,C$$CDACª VECTOR $CRSUN,C$$CDAB« VECTOR $CRUNT,C$$CDAV¬ VECTOR $CTLST­ VECTOR $CTXPT® VECTOR $CVDVN¯ VECTOR $CXDBL° VECTOR $DEACB± VECTOR $DEAC1² VECTOR $DEARG³ VECTOR $DEATR´ VECTOR $DECLKµ VECTOR $DELRG¶ VECTOR $DEPKT· VECTOR $DESEC¸ VECTOR $DESPK¹ VECTOR $DETRGº VECTOR $DEUMR,EXTUMRO» VECTOR $DEVHD¼ VECTOR $DICSV ½ NOSTB $DIVO¾ SYNONM $$DIV¿ VECTOR $DRATPÀ VECTOR $DRDSEÁ VECTOR $DREXT VECTOR $DRQRQà VECTOR $DTOERÄ VECTOR $DVCERÅ VECTOR $DVERRÆ VECTOR $DVMSGÇ VECTOR $DYPMNÈ VECTOR $ENTSQÉ VECTOR $ERFLAÊ VECTOR $ERRPTË VECTOR $ERRSQÌ VECTOR $ERRX,E$$LOGÍ VECTOR $EXRQFÎ VECTOR $EXRQNÏ VECTOR $EXRQPÐ VECTOR $EXSIZÑ VECTOR $FINDIÒ VECTOR $FMASKÓ VECTOR $FMSK2Ô VECTOR $FMSK3Õ VECTOR $FMSK4Ö VECTOR $FNCLI× VECTOR $FORKDØ VECTOR $FXRPTÙ VECTOR $GGEF,G$$GEFÚ VECTOR $GSPKTÛ VECTOR $GTBYTÜ VECTOR $GTPKTÝ VECTOR $GTSPKÞ VECTOR $GTWRDß VECTOR $HEADRà VECTOR $HFMSKá VECTOR $HRCPTâ VECTOR $IBXMTã VECTOR $ICAVLä VECTOR $ICHKPå VECTOR $IIMSKæ VECTOR $IISTMç VECTOR $IIXMTè VECTOR $INIBFé VECTOR $INTCTê VECTOR $INTSEë VECTOR $INTSIì VECTOR $INTSVí VECTOR $INTXTî VECTOR $IOALTï VECTOR $IODONð VECTOR $IOFINñ VECTOR $KRBSCò VECTOR $K6TABó VECTOR $LBUICô VECTOR $LDPWFõ VECTOR $LDREGö VECTOR $LDRPT÷ VECTOR $LOGHDø VECTOR $LOGPTù VECTOR $LSTLKú VECTOR $MCRPTû VECTOR $MKCSRü VECTOR $MKCS2ý VECTOR $MOULSþ VECTOR $MPDC1ÿ VECTOR $MPLND VECTOR $MPLNE VECTOR $MPLUN VECTOR $MPPKT VECTOR $MPPRO VECTOR $MPVBN  NOSTB $MULC SYNONM $$MULC VECTOR $MSCR1,CDA$MST VECTOR $MSCR2,CDA$MSV  VECTOR $MSCR3,CDA$MSI  VECTOR $MXEXT  VECTOR $M100Q,M$$NET  VECTOR $NCPU  VECTOR $NCTPT,T$$TSA  VECTOR $NMCLI VECTOR $NONSI VECTOR $NS0 VECTOR $NS1 VECTOR $NS2 VECTOR $NS3 VECTOR $NS4 VECTOR $NS5 VECTOR $NS6 VECTOR $NS7 VECTOR $NTEND VECTOR $NTUIC VECTOR $NXTSK VECTOR $PARHD VECTOR $PARTB VECTOR $PFRSZ VECTOR $PKMAX VECTOR $PKNUM  VECTOR $PLPAR! VECTOR $POLBP" VECTOR $POLFL# VECTOR $POLST$ VECTOR $POOLV% VECTOR $PRIHL& VECTOR $PRILL' VECTOR $PROC2( VECTOR $PRTAB) VECTOR $PTBYT* VECTOR $PTCBL+ VECTOR $PTCPT, VECTOR $PTTCB- VECTOR $PTWRD. VECTOR $QACNT/ VECTOR $QASTT0 VECTOR $QCLNR1 VECTOR $QCNTP2 VECTOR $QCPKT3 VECTOR $QERMV4 VECTOR $QFORK5 VECTOR $QINSF6 VECTOR $QINSP7 VECTOR $QMCRO8 VECTOR $QMCRL9 VECTOR $QRMVF: VECTOR $QRMVT; VECTOR $QSPIB< VECTOR $QSPIF= VECTOR $QSPIP> VECTOR $QSPRF? VECTOR $QTRAN@ VECTOR $QTRN1A VECTOR $QTRN2B VECTOR $QUEBFC VECTOR $QUEXTD VECTOR $QUPKTE VECTOR $RCTPTF VECTOR $RELOCG VECTOR $REMOVH VECTOR $REMO1I VECTOR $REQU1J VECTOR $RNDC,R$$NDCK VECTOR $RNDH,R$$NDCL VECTOR $RNDL,R$$NDCM VECTOR $RQSCHN VECTO00bqæpn´cÚµcÛ¶c�·c›’R $RQTABO VECTOR $SABPTP VECTOR $SAHDBQ VECTOR $SAHPTR VECTOR $SAVNRS VECTOR $SCCTBT VECTOR $SCDEVU VECTOR $SCDVTV VECTOR $SCDV1W VECTOR $SCERRX VECTOR $SCMDQY VECTOR $SCMOFZ VECTOR $SCOFL[ VECTOR $SCRET\ VECTOR $SECFR] VECTOR $SETCR^ VECTOR $SETFO_ VECTOR $SGFIN` VECTOR $SGNMKa VECTOR $SHERRb VECTOR $SHFCTc VECTOR $SHFTMd VECTOR $SHFPTe VECTOR $SHLOSf VECTOR $SHPCTg VECTOR $SHUMBh VECTOR $SIGFLi VECTOR $SNCMDj VECTOR $SRASTk VECTOR $SRCCQl VECTOR $SRGEF,G$$GEFBm VECTOR $SRPROn VECTOR $SRSTDo VECTOR $SRUCBp VECTOR $SRUC1q VECTOR $STACKr VECTOR $STALRs VECTOR $STCLIt VECTOR $STENBu VECTOR $STFLGv VECTOR $STKDPw VECTOR $STPCTx VECTOR $STPTKy VECTOR $STRTMz VECTOR $SWPC,SWAP{ VECTOR $SWPR,SWAP| VECTOR $SWR} VECTOR $SYLHD~ VECTOR $SYSID VECTOR $SYSIZ€ VECTOR $SYSNM� VECTOR $SYTYP‚ VECTOR $SYUABƒ VECTOR $SYUIC„ VECTOR $TCBCP… VECTOR $TICLR† VECTOR $TKNPT‡ VECTOR $TKPSVˆ VECTOR $TKTAB‰ VECTOR $TKTCBŠ VECTOR $TKWSE‹ VECTOR $TMSTPŒ VECTOR $TRACE� VECTOR $TSKHDŽ VECTOR $TSKRP� VECTOR $TSKRT� VECTOR $TSPAR‘ VECTOR $TSTBF’ VECTOR $TSTCP“ VECTOR $TTNSP” VECTOR $UCBSC• VECTOR $UMPCR– VECTOR $UMPSP— VECTOR $UMRHD,EXTUMRW˜ VECTOR $UMRPT,M$$NETC™ VECTOR $URMSTš VECTOR $URMTB› VECTOR $VECTRœ VECTOR $VERSN� VECTOR $VERTKž VECTOR $VTDCBŸ ; COMM EXEC VECTORSP¡¢ VECTOR $1SCTB,MPNET£ VECTOR $ACTLN,MPNET¤ VECTOR $ASCMP,M$$NETV¥ VECTOR $CALLX,M$$NETT¦ VECTOR $CCBAF,M$$NET§ VECTOR $CCBAL,M$$NET ¨ VECTOR $CCBCT,M$$NET© VECTOR $CCBGT,M$$NETOª VECTOR $CCBRT,M$$NETF« VECTOR $CCBLH,M$$NETC¬ VECTOR $CCBNM,M$$NETB­ VECTOR $CCBSZ,M$$NETV® VECTOR $CEACC,M$$NETU¯ VECTOR $CECAC,M$$NETU° VECTOR $CEDIV,M$$NETU± VECTOR $CELFN,M$$NET² VECTOR $CELOG,M$$NET ³ VECTOR $CEMUL,M$$NET´ VECTOR $CEPWR,M$$NET µ VECTOR $CMFRK,M$$NET¶ VECTOR $CMPDV,M$$NETV· VECTOR $CMQIN,M$$NETC¸ VECTOR $CMQRM,M$$NETC¹ VECTOR $CNV22,M$$NETCº VECTOR $CNV18,M$$NETC» VECTOR $CSBGT,M$$NETC¼ VECTOR $CSBRT,M$$NETC½ VECTOR $CTCMP,M$$NETC¾ VECTOR $CXOPT,M$$NETC¿ VECTOR $DDAST,M$$NETCÀ VECTOR $DDCCP,M$$NETCÁ VECTOR $DDCRA,M$$NETC VECTOR $DDDIS,M$$NETCà VECTOR $DDENB,M$$NETCÄ VECTOR $DDFNC,M$$NETCÅ VECTOR $DDGET,M$$NETCÆ VECTOR $DDKCP,M$$NETCÇ VECTOR $DDKIL,M$$NETCÈ VECTOR $DDMAN,M$$NETCÉ VECTOR $DDMSN,M$$NETCÊ VECTOR $DDRCE,M$$NETCË VECTOR $DDRCP,M$$NETCÌ VECTOR $DDRNG,M$$NETCÍ VECTOR $DDSET,M$$NETCÎ VECTOR $DDSPC,M$$NETCÏ VECTOR $DDSTP,M$$NETCÐ VECTOR $DDSTR,M$$NETCÑ VECTOR $DDXKL,M$$NETCÒ VECTOR $DDXME,M$$NETCÓ VECTOR $DDXMP,M$$NETCÔ VECTOR $DDXOF,M$$NETCÕ VECTOR $DDXON,M$$NETCÖ VECTOR $DECPT,M$$NETC× VECTOR $DLCRS,M$$NETCØ VECTOR $DSPTM,M$$NETCÙ VECTOR $EVDSC,M$$NETCÚ VECTOR $FILHD,M$$NETCÛ VECTOR $INTSX,M$$NETCÜ VECTOR $INTX7,M$$NETCÝ VECTOR $KLCMP,M$$NETCÞ VECTOR $LDBAF,M$$NETCß VECTOR $LDBGT,M$$NETCà VECTOR $LDBRT,M$$NETCá VECTOR $LGCON,M$$NETCâ VECTOR $LGDDB,M$$NETCã VECTOR $LGFNB,M$$NETCä VECTOR $LGMON,M$$NETCå VECTOR $LGPDV,M$$NETCæ VECTOR $LGSTT,M$$NETCç VECTOR $LGUIC,M$$NETCè VECTOR $LLCAL,M$$NETCé VECTOR $LLCLC,M$$NETCê VECTOR $LLCRQ,M$$NETCë VECTOR $LLCRS,M$$NETCì VECTOR $LLCSP,M$$NETCí VECTOR $LLCTA,M$$NETCî VECTOR $LTMFC,M$$NETCï VECTOR $MAXOV,M$$NETCð VECTOR $MPLCK,MPNETñ VECTOR $MPSAV,MPNETò VECTOR $MVFBF,M$$NETó VECTOR $MVTBF,M$$NETô VECTOR $NBIAS,M$$NETõ VECTOR $NETPF,M$$NETö VECTOR $NMCLH,M$$NET÷ VECTOR $NMCL2,M$$NETø VECTOR $NMCRS,M$$NETù VECTOR $NMLST,M$$NETú VECTOR $NTLPT,M$$NETû VECTOR $OBJHD,M$$NETü VECTOR $PADB,M$$NETý VECTOR $PDDSP,M$$NETþ VECTOR $PDQUE,M$$NETÿ VECTOR $PDQU1,M$$NET VECTOR $PDSPL,M$$NET VECTOR $PDVID,M$$NET VECTOR $PDVNM,M$$NET VECTOR $PDVTA,M$$NET VECTOR $PSIPT,M$$NET VECTOR $PUMR,M$$N00b qpßmæàmçámýfáþfDATAET VECTOR $PWRF1,M$$NET VECTOR $QBIAS,M$$NET VECTOR $QSTRT,M$$NET  VECTOR $RCCMP,M$$NET  VECTOR $RDBAF,M$$NET  VECTOR $RDBCT,M$$NET  VECTOR $RDBGT,M$$NET  VECTOR $RDBLH,M$$NET VECTOR $RDBNM,M$$NET VECTOR $RDBRT,M$$NET VECTOR $RDBSZ,M$$NETV VECTOR $RDBTH,M$$NETV VECTOR $RDBWT,M$$NETV VECTOR $RDBQP,M$$NETV VECTOR $RDQCT,M$$NETV VECTOR $RDQSL,M$$NETV VECTOR $SDBAF,M$$NETV VECTOR $SDBCT,M$$NETV VECTOR $SDBLH,M$$NETV VECTOR $SDBNM,M$$NETC VECTOR $SDBSZ,M$$NETC VECTOR $SLTMA,M$$NETC VECTOR $SLTNM,M$$NETC VECTOR $SNAPT,M$$NETC VECTOR $SPMTB,DUMMY VECTOR $SQRCM,M$$NETV  VECTOR $STDDM,M$$NETV! VECTOR $STDD1,M$$NETV" VECTOR $STDLC,M$$NETV# VECTOR $STDL1,M$$NETV$ VECTOR $STMFC,M$$NETV% VECTOR $SYNB,M$$NET& VECTOR $SYNC,M$$NET' VECTOR $TK100,M$$NET( VECTOR $TSTIM,M$$NET) VECTOR $T1SCL,M$$NET* VECTOR $T100C,M$$NET+ VECTOR $T100Q,M$$NET, VECTOR $XAVL,M$$NET- VECTOR $XBIAS,M$$NETC. VECTOR $XMCMP,M$$NETC/ VECTOR $ZTIME,M$$NETC0 VECTOR $ZTIM2,M$$NETC12 VECTOR $STMTB,MPNET384; THE FOLLOWING SYMBOLS ARE FOR SPM-11M-PLUS HOOKPOINT56 VECTOR $SPH017 VECTOR $SPH028 VECTOR $SPH039 VECTOR $SPH04: VECTOR $SPH05; VECTOR $SPH06< VECTOR $SPH07= VECTOR $SPH08> VECTOR $SPH09? VECTOR $SPH10,E$$XPR@ VECTOR $SPH11A VECTOR $SPH12B VECTOR $SPH13,DUMMYC VECTOR $SPH14,DUMMYD VECTOR $SPH15E VECTOR $SPH16F VECTOR $SPH17G VECTOR $SPH18H VECTOR $SPH19,P$$MONI VECTOR $SPH20J VECTOR $SPH21K VECTOR $SPH22L VECTOR $SPH23,V$$TRMM VECTOR $SPH24,V$$TRMLN VECTOR $SPH25O VECTOR $SPH26P VECTOR $SPH27Q VECTOR $SPH28,C$$INTCR VECTOR $SPH29S VECTOR $SPH30T VECTOR $SPH31U VECTOR $SPH32V VECTOR $SPH33W VECTOR $SPH34,P$$MONHX VECTOR $SPH35,P$$MONPY VECTOR $SPH36,M$$NETVZ VECTOR $SPH37,DUMMY[ VECTOR $SPH38,DUMMY\ VECTOR $SPH39,DUMMY] VECTOR $SPH40,DUMMY^=_; SYMBOLS ADDED AFTER START OF RSX-11M-PLUS V3.0 FIELD TESTV`a VECTOR $BCERRb VECTOR $BCFACc VECTOR $BCPCOd VECTOR $CRUPC,C$$CDAOe VECTOR $CRUST,C$$CDAOf VECTOR $DQLM1g VECTOR $DQLM2h VECTOR $DRAP2i VECTOR $DRLM1j VECTOR $DRLM2k VECTOR $EMTRPl VECTOR $ILINSm VECTOR $IOTRPn VECTOR $SGFLTo VECTOR $SRNAMp VECTOR $TRP04q VECTOR $TRTRPr VECTOR $XDTND,MPLXDTs&t; ADDITIONAL SPM-11M-PLUS HOOKPOINTSuv VECTOR $SPH64w VECTOR $SPH66x VECTOR $SPH67y VECTOR $SPH70z VECTOR $SPH71{ VECTOR $SPH72| VECTOR $SPH74,P$$CTLR} VECTOR $SPH75,Q$$OPTC~ VECTOR $SPH76,P$$CTLU VECTOR $SPH77,Q$$OPTU€-�; ADDITIONS LATE IN VERSION 3.0 DEVELOPMENTV‚ƒ VECTOR $FMSK5„„; ; BM370E„; ADDED FOR RSX-11M-PLUS V3.0 UPDATE C AND MICRO/RSX V3.1 ; BM370T„; ; BM370„ VECTOR $DRAPR ; BM370„ VECTOR $HKSTS ; BM370 „ VECTOR $IDLFL ; BM370S„ VECTOR $POLHD ; BM370 „ VECTOR $SETM ; BM370O„ VECTOR $SPMVC ; BM370C„ VECTOR $SPV01 ; BM370T„ VECTOR $SPV02 ; BM370V„ VECTOR $SPV03 ; BM370S„ VECTOR $SRATT ; BM370A„ ; BM370E„ ;RDH047O*„; ADDITIONS FOR VERSION 4.0 ;RDH047„ ;RDH047.„ VECTOR U.CTX ;RDH047„ VECTOR U.FPRO ;RDH047„ VECTOR U.LOG ;RDH047„ VECTOR $LDEL1 ;RDH047„ VECTOR $USRLG ;RDH047 „ VECTOR $PRISZ ; GNL040„ VECTOR $FNDSP ;TMS038„ VECTOR $GTUSR ;TMS038„ VECTOR $LNTD1 ;TMS038„ VECTOR $RLRLN ;TMS038 „ VECTOR $CRPAS ; GNL048 „ VECTOR $DVTMO ; GNL048 „ VECTOR $MPUBM ; GNL0487„ NOSTB $STMAP,DUMMY ; THIS WAS A DUPLICATE ; BM403 „ VECTOR $CRCTX ;RK050„ VECTOR $CRLO1 ;RK050„ VECTOR $DELO1 ;RK050„ VECTOR $DLCTX ;RK050„ VECTOR $LOGTB ;RK050„ VECTOR $QRMVA ;RK050„ VECTOR $TBTRN ;RK050 „ VECTOR $BLKC2 00bqæpn´cÚµcÛ¶c�·c›’; GNL048 „ VECTOR $BMSET ; GNL048 „ VECTOR $CVLBN ; GNL048„ VECTOR $RLCN ; GNL048C „ VECTOR $RQCND ; GNL048 „ VECTOR $STMAP ; GNL048 „ VECTOR $VOLVD ; GNL048 „ VECTOR $BLKCK ; GNL048 „ VECTOR $MPPHY ; GNL048 „ VECTOR $FRKHD ; GNL048&„ VECTOR $EFMSK,E$$LOG ; GNL048 „ VECTOR $ULDPT ; GNL048$„ VECTOR $RTF01,MPNET ;JWB185$„ VECTOR $RTF02,MPNET ;JWB185&„ VECTOR $RTF03,M$$NET ; GNL061&„ VECTOR $RTF04,M$$NET ; GNL061%„ VECTOR $LTEEP,M$$NET ; BM374N%„ VECTOR $WPLST,R$$WPT ; BM374%„ VECTOR $WPADR,R$$WPT ; BM374C%„ VECTOR $WPIN0,R$$WPT ; BM374V%„ VECTOR $WPIN1,R$$WPT ; BM374 %„ VECTOR $WPIN2,R$$WPT ; BM374 %„ VECTOR $WPIN3,R$$WPT ; BM3740$„ VECTOR $WPBR,R$$WPT ; BM374„ VECTOR $TNAME ;JWB190N „ VECTOR $MPUB1 ; GNL065 „ VECTOR $PRMOD ; GNL065 „ VECTOR $ULDRQ ; GNL065 „ VECTOR $FNERL ; GNL065 „ VECTOR $IODSA ; GNL065 „ VECTOR $QINSB ; GNL065 „ VECTOR KISDR0 ; GNL065 „ VECTOR KISDR6 ; GNL065 „ VECTOR $CKCNT ; GNL065 „ VECTOR $CKLDC ; GNL065 „ VECTOR $DRVPF ; GNL065%„ VECTOR $TRINT,C$$CDA ;JWB193W„ VECTOR $UMRWT ; BM383C%„ VECTOR $ACDHD,T$$ACD ; BM383O„ VECTOR $DQUMR ; BM383O„ VECTOR $LOGER ; BM383O„ VECTOR $STMP1 ; BM383O„ VECTOR $TTPRM ; BM386O„ VECTOR $WCFLG ; BM387O%„ VECTOR $CPSEN,C$$RMT ; BM396N%„ VECTOR $CPALO,C$$RMT ; BM396 %„ VECTOR $CPDEA,C$$RMT ; BM396 „ ; BM403C„; ; BM403B„; SYMBOLS ADDED AT THE END OF VERSION 4.0 FOR XDT, CPR ; BM403%„; AND GENERAL CLEANUP ; BM403„; ; BM403„ VECTOR T.CTX ; BM403„ VECTOR T.SAST ; BM403R„ VECTOR $ABCTK ; BM403R„ VECTOR $ACCLK ; BM4031„ VECTOR $ACHKP ; BM403M„ VECTOR $ACHKW ; BM403G%„ VECTOR $ACHUI,U$$DAS ; BM403M„ VECTOR $ACTRM ; BM403O„ VECTOR $ACTTK ; BM403 „ VECTOR $ALCLK ; BM403 „ VECTOR $ALPKT ; BM403B%„ VECTOR $ALSC1,P$$OOL ; BM403E%„ VECTOR $ALSPK,P$$OOL ; BM403N„ VECTOR $ALTRG ; BM403„ VECTOR $ATTPT ; BM403.„ VECTOR $BILDS ; BM403A„ VECTOR $BLKC1 ; BM403C%„ VECTOR $CALTA,S$$LIB ; BM403 „ VECTOR $CEFIG ; BM403 „ VECTOR $CEFNG ; BM403 %„ VECTOR $CFORK,M$$PRO ; BM403 %„ VECTOR $CKACC,P$$LAS ; BM403 %„ VECTOR $CKBFI,U$$DAS ; BM403 „ VECTOR $CKBFW ; BM403 %„ VECTOR $CKLBN,S$$HDW ; BM403V%„ VECTOR $CKUAB,A$$CNT ; BM403V„ VECTOR $CLRSM ; BM403N%„ VECTOR $CPCON,C$$RTB ; BM403V%„ VECTOR $CSFSV,C$$KXJ ; BM403 %„ VECTOR $CSHSV,C$$KXJ ; BM4031„ VECTOR $CURPR ; BM403A„ VECTOR $DASTT ; BM403 „ VECTOR $DBTRP ; BM403 „ VECTOR $DCAST ; BM403 %„ VECTOR $DCCEB,D$$CHE ; BM403 %„ VECTOR $DCCEL,D$$CHE ; BM403 „ VECTOR $DCLKA ; BM403V%„ VECTOR $DCNEB,D$$CHE ; BM403 %„ VECTOR $DCNEL,D$$CHE ; BM403 %„ VECTOR $DCPCB,D$$CHE ; BM403 %„ VECTOR $DCSTS,D$$CHE ; BM403N„ VECTOR $DCWIO ; BM403 „ VECTOR $DECAL ; BM403V„ VECTOR $DECBF ; BM4031„ VECTOR $DECIO ; BM403A„ VECTOR $DECIP ; BM403 „ VECTOR $DESC1 ; BM403 „ VECTOR $DIRSV ; BM403 „ VECTOR $DIRXT ; BM403 $„ VECTOR $DLNK,S$$HDW ; BM403$„ VECTOR $DQAC,C$$INT ; BM403!„ VECTOR $DRAP3 ; BM403 „ VECTOR $DRAP4 ; BM403 „ VECTOR $DRAPV ; BM403D„ VECTOR $DRCHE ; BM403D„ VECTOR $DRCL2 ; BM403C„ VECTOR $DRCL3 ; BM403C%„ VECTOR $DRTHR,P$$OFF ; BM403D„ VECTOR $DRWSE ; BM403D„ VECTOR $DSPKA ; BM403D„ VECTOR $DVMG1 ; BM403D%„ VECTOR $ECCOR,S$$ECC ; BM403 „ VECTOR 00bqpßmæàmçámýfáþfDATA$EMSST ; BM403 %„ VECTOR $ERREC,P$$OFF ; BM403 %„ VECTOR $ERTHR,P$$OFF ; BM403 %„ VECTOR $ERHEA,E$$LOG ; BM403 %„ VECTOR $EXDOP,M$$PRO ; BM403 %„ VECTOR $EXROP,M$$PRO ; BM403V%„ VECTOR $EXRP1,M$$PRO ; BM403 „ VECTOR $EXRQS ; BM403 „ VECTOR $EXRQU ; BM403 „ VECTOR $FINBF ; BM403V„ VECTOR $FINDR ; BM403V„ VECTOR $FINXT ; BM403V%„ VECTOR $FMAPP,F$$MAP ; BM403 %„ VECTOR $FMSKR,C$$RMT ; BM403 „ VECTOR $FORK0 ; BM403 „ VECTOR $FORK1 ; BM403V%„ VECTOR $FORK2,C$$INT ; BM403V%„ VECTOR $FPPRQ,F$$LPP ; BM403V%„ VECTOR $FPPR7,F$$LPP ; BM403V%„ VECTOR $FPPR8,F$$LPP ; BM403V%„ VECTOR $FORKL,M$$PRO ; BM403V„ VECTOR $GENBF ; BM403V%„ VECTOR $GGFRN,G$$GEF ; BM403 „ VECTOR $GNLST ; BM403 %„ VECTOR $IFORK,M$$PRO ; BM403T%„ VECTOR $IMASG,C$$RTB ; BM403A%„ VECTOR $INTSC,C$$INT ; BM403M„ VECTOR $INTSF ; BM4030„ VECTOR $INTX1 ; BM4031„ VECTOR $IOKIL ; BM4032„ VECTOR $IOKL1 ; BM403 „ VECTOR $IOKL2 ; BM403V„ VECTOR $KATBL ; BM403V%„ VECTOR $KXBAS,C$$KXJ ; BM403V%„ VECTOR $KXPTR,C$$KXJ ; BM403V%„ VECTOR $KXVC1,C$$KXJ ; BM403V%„ VECTOR $LCKPR,R$$LKL ; BM403V„ VECTOR $LDPCB ; BM403V„ VECTOR $LOADT ; BM403T%„ VECTOR $LSUPD,S$$LIB ; BM403A%„ VECTOR $LSUP1,S$$LIB ; BM403M„ VECTOR $MAPTK ; BM4030„ VECTOR $MPDC2 ; BM4031„ VECTOR $MPDC3 ; BM4032„ VECTOR $MPDC4 ; BM403 „ VECTOR $MPDCV ; BM403V„ VECTOR $PASTH ; BM403V%„ VECTOR $PKAVL,Q$$OPT ; BM403V%„ VECTOR $PLTRQ,P$$CTL ; BM403V„ VECTOR $PRIFR ; BM403 %„ VECTOR $PROCN,M$$PRO ; BM403 „ VECTOR $PWRFL ; BM403 %„ VECTOR $QASTC,C$$INT ; BM403T„ VECTOR $QCLIL ; BM403 „ VECTOR $QPKRQ ; BM403 „ VECTOR $QPKR1 ; BM403 „ VECTOR $RELCD ; BM403 „ VECTOR $RELOM ; BM403 „ VECTOR $RELOP ; BM403 %„ VECTOR $RELUI,U$$DAS ; BM403 „ VECTOR $REQUE ; BM403 „ VECTOR $RLCPS ; BM403 „ VECTOR $RLPAR ; BM403$„ VECTOR $RLPR1 ; BM403I%„ VECTOR $RNDCT,R$$NDC ; BM403$%„ VECTOR $RQCNC,O$$LAP ; BM403 „ VECTOR $SETFG ; BM403$„ VECTOR $SETMG ; BM403L„ VECTOR $SETRT ; BM403K„ VECTOR $SETRQ ; BM403K%„ VECTOR $SHFND,S$$HDW ; BM403 %„ VECTOR $SHFN1,S$$HDW ; BM403 %„ VECTOR $SHLIM,S$$HDW ; BM403 %„ VECTOR $SHSAV,S$$HDW ; BM403 „ VECTOR $SGFFR ; BM403 %„ VECTOR $SIRWF,S$$LIB ; BM403V„ VECTOR $SPMAX ; BM403V„ VECTOR $SRCQ1 ; BM403V%„ VECTOR $SRMUT,P$$OFF ; BM403V%„ VECTOR $SRWND,P$$LAS ; BM403V%„ VECTOR $SUPFL,S$$LIB ; BM403 %„ VECTOR $SWACD,T$$ACD ; BM403T%„ VECTOR $SWAC1,T$$ACD ; BM403 #„ VECTOR $SWPCT,SWAP ; BM403 „ VECTOR $SWSTK ; BM403$„ VECTOR $TSKRQ ; BM403L%„ VECTOR $UISET,M$$MUP ; BM403S„ VECTOR $UMR4 ; BM403„ VECTOR $UMR5 ; BM403%„ VECTOR $UNMAP,P$$LAS ; BM403V%„ VECTOR $WPVAL,R$$WPT ; BM403 „ VECTOR $WTUMR ; BM403 %„ VECTOR $XXLOW,C$$KXJ ; BM403 %„ VECTOR $XXHGH,C$$KXJ ; BM403 „ ; BM403 %…; FOR PEACE OF MIND, PAD THE VECTOR †‡ .IF DF R$$MPLˆ ‰ .REPT 25.Š‹ .WORD 160001PŒ� .ENDRŽ�MAXOFF=.-EXEVECS�‘ .ENDC ; DF R$$MPL’“ .PAGE”,•; DEFINE GLOBALS OFFSETS GIVEN IN STB FILE–;=—; ********************************************************* ˜; * *P-™; * > > > W A R N I N G < < < * š; * *;›; * THE FOLLOWING ARE OFFSET DEFINITIONS WHICH ARE * ;œ; * SUPPLIED EITHER BY DEFINITION IN THE EXEC (IOSUB) * ;�; * OR THE DUMMY STB FILE (FROM SFVC2). ANY CHANGE TO *D;ž; * THESE DEFINITIONS MUST BE MADE IN BOTH MOD00b"qc#qn´cÚµcÛ¶c�·c›’ULES. *R Ÿ; * *.= ; *********************************************************E¡¢ .IF NDF R$$MPLI£¤ G$$SPA == 34*¥ S$$SPA == 10*¦ S$$SPC == 6*§¨ .ENDC ; NDF R$$MPL©ª .END> > > W A R N I N G < < < * š; * *;›; * THE FOLLOWING ARE OFFSET DEFINITIONS WHICH ARE * ;œ; * SUPPLIED EITHER BY DEFINITION IN THE EXEC (IOSUB) * ;�; * OR THE DUMMY STB FILE (FROM SFVC2). ANY CHANGE TO *D;ž; * THESE DEFINITIONS MUST BE MADE IN BOTH MOD .TITLE CEXBF - COMM EXECe .IDENT /01.16/s x;o; COPYRIGHT (C) 1985 BYl/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.";WA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;s; J. PROVINO 3-AUG-78y;l; MODIFIED BY:; ; JF005 - J. FORECAST 28-MAR-79]:; ALLOCATE BUFFER SPACE DEPENDING ON CONDITIONAL ASSEMBLY; PARAMETERS.;u; JF006 - J. FORECAST 14-MAY-79a.; CHANGE ALLOCATIONS FOR NEW MAPPED COMM/EXEC;; JF007 - J. FORECAST 8-AUG-80; CHANGE ALLOCATIONS AGAINI; ; JF008 - J. FORECAST 9-JAN-817; CHANGE ALLOCATIONS FOR NEW BUFFER MANAGEMENT SUPPORTR;H"; BM244 - B. S. MCCARTHY 11-MAR-821; FINAL BUFFER SIZE ADJUSTMENTS FOR RSX-11M-PLUSU8; VERSION 2.0 (BASE LEVEL 10) AND ADD DESCRIPTIVE TEXT.;; JJ001 - J. Jackson 4-Jan-82R'; Adjust sizing for DECnet 3.0 releaseO;O; JJ002 - J. Jackson 28-Feb-83(; Increase size for multiprocessor case(; to include DLC support (for Ethernet);C; WD001 - W. Daley 2-Jul-84-9; Combine Comm/Exec modules (CESCH, CELLC, CEDLC, CEDDM,C; CEBUF, CELOG, CETIM).3; Remove L$$SI1 and remaining M$$MGE conditionals.M8; Change conditionals for N$$EVL, N$$OPT, and X$$MDC to&; generate code if R$$MPL is defined.;; Remove INHIB$, ENABL$, SAVMAP, RESMAP, and MAP - replaceJ; with in-line code.j*; Change SAVRG and RESRG to local macros..; Change all I/O page references to absolute.4; Append CESUB module with similar changes to 4.02..; Remove SCBDF$ and CLKDF$ macros (not used).(; Add DLC$OV and CRC$OV global symbols.B; Add $CEX global entry and M$$NET (network support) conditional.;M'; LA001 - Remove saving of SP in $INTSXa;f=; WD002 - Add performance monitor hooks (CHANGED BY LBM004) ;i(; LAA002 - Remove conditionals in .TITLE;P#; LAA003 - Add $CXFLG global symbol ;e4; WD002 - Modify $CNV22 for Q-bus I/D space support; D; LBM004 - CHANGE SPM HOOKPOINT IMPLEMENTATION FOR RSX-11M-PLUS V3.0; ; GS001 - G Strevell 4-Mar-85?; Change $CNV22 to use APR bias only when entered with R3 = 0 ;b"; 1.14 WMD001 - W. Duane 30-Apr-85%; Add $CEXND symbol to end of CEXBF.M; '; 1.15 BM369 - B. S. McCarthy 27-Aug-85f; Reformat SPM hookpoint ;i$; 1.16 WJD001 - W. Daley 06-Oct-869; Add Global labels and space for NTINIT run time fix ofd<; SLT offsets and buffer wait code for DECnet-11M-PLUS V4.0;D2$CEX:: ; THIS SYMBOL MUST ALWAYS BE DEFINED FOR( ; MCRS "SET /NOCEX" COMMAND TO BUILD ; CORRECTLYl .IF DF M$$NET n $ .SBTTL Macro Definitionsw; ; Macro Library Callsb; # .MCALL CCBDF$,OPTDF$,PDVDF$,SLTDF$A" CCBDF$ ; Define the CCB offsets+ OPTDF$ <=>,<:> ; Define COMM/EXEC options" PDVDF$ ; Define the PDV offsets" SLTDF$ ; Define the SLT offsets;o; Local Macro DefinitionsI;  .IF DF K$$DAS .MACRO DDFDF,FNC,ARG1 MOV R3,-(SP) ; Save R3M! MOV #FNC,R3 ; Get function codeS .IF B Y; BR DDCM1 ; Common processing for non-CCB control function  .IFF ; B  .IF IDN ,.: BR DDCM2 ; Common processing for modem control functions .IFF ; IDN , .IF IDN ,e BR DDCM4B .IFF ; IDN ,= BR DDCM3 ; Common processing for control functions with CCBs .ENDC ; IDN ,T .ENDC ; IDN ,a .ENDC ; B .ENDM DDFDF .IFF ; DF K$$DAS, .MACRO DDFDF,FNC,ARG1 .IF B V> JSR R3,DDCM1 ; Common processing for non-CCB control function .IFF ; B  .IF IDN ,o= JSR R3,DDCM2 ; Common00c*qpßmæàmçámýfáþfDATA processing for modem control functionso .IFF ; IDN , .IF IDN , JSR R3,DDCM4> .IFF ; IDN ,@ JSR R3,DDCM3 ; Common processing for control functions with CCB .ENDC ; IDN ,t .ENDC ; IDN ,, .ENDC ; B N10$: .WORD FNC .ENDM < .ENDC ; DF K$$DAS . .MACRO SAVRG LIST .IRP R, MOV R,-(SP) .ENDM .ENDM .MACRO RESRG LIST .IRP R, MOV (SP)+,R .ENDM .ENDM > .SBTTL Symbol Definitions;,7; These symbols are global for use by DECnet processes..; 1DLC$OV == 8. ; Data link layer overhead (bytes),%CRC$OV == 4. ; CRC overhead (bytes)RA$CXFLG == CF.MDM!CF.DDM!CF.DYN!CF.EIS!CF.LOG ; Comm exec options;;;K.CSR == 0 ; ???;CF; Define offsets to saved PSW from $INHIB. This offset is used by theK; FAIL entry (refer to BUFGT) to set the C-Bit so that failures to allocateM7; an RDB, LDB, or SDB will set the C-Bit on the ENABL$.+; .IF NDF M$$PRO>%PRIOFF=0 ; Offset to Saved Priorityh .IFF ; NDF M$$PRO5PRIOFF=2 ; Extra word on Stack for Multi-ProcessorsD .ENDC ; NDF M$$PROa t8 .SBTTL $INTSX - Comm Exec Device Interrupt Save Routine;+3; **-$INTSX-COMM EXEC DEVICE INTERRUPT SAVE ROUTINE;;S; Called by: JSR R4,$INTSX;f ; Inputs:e=; R5 = Pointer to priority specification in device line tablee; ; Outputs:=; The System Stack Depth is decremented, and if zero a switch "; to the System Stack is effected.;0; R5 = Pointer to word following device priority;-$INTSX::;+; ** W a r n i n g **E;a; SPM hookpoint number 36.;s); Do not change the instruction followingI; label without checking SPM;-+$SPH36==. ;SPM changes the instruction atI ;the location of this labell1 DEC @#$STKDP ;;; Decrement Stack Depth Indicatort0 BIC (R5)+,PS ;; Lower priority to device level .IF DF M$$PRO+ CACHE$ SAVE ;; Save bypass state of cacheo .ENDC ; DF M$$PRO CALL @R4 ;; Call caller back .IF DF M$$PRO0 CACHE$ UNSAVE ;; Restore bypass state of cache .ENDC ; DF M$$PRO! MTPS #PR7 ;; Inhibit Interrupts 1 .IF DF K$$DAS ;; Slightly different for RSX-11M+ ( ;; with Kernel Data Space enabled< MOV 4(SP),@#KINAR5 ;; Restore previous I-Space APR Contents< MOV 6(SP),@#KISAR5 ;; Restore previous D-Space APR Contents" ;; Current contents of stack:* ;; R4 (Saved by JSR R4,$INTSX in DDM)0 ;; R5 (Saved by JSR R5,'ISR' in Line Table)$ ;; KINAR5 (Saved in Line Table)$ ;; KISAR5 (Saved in Line Table) ;; PS (Saved by Interrupt)C ;; PC (Saved by Interrupt)h/ MOV (SP)+,2(SP) ;; Move saved R4 down on stackd/ MOV (SP)+,2(SP) ;; Move saved R5 down on stacka0 ;; Contents of stack (necessary for $INTXX)* ;; R4 (Saved by JSR R4,$INTSX in DDM)0 ;; R5 (Saved by JSR R5,'ISR' in Line Table) ;; PS (Saved by Interrupt)  ;; PC (Saved by Interrupt)i .IFF ;; DF K$$DAS4 MOV 4(SP),@#KISAR5 ;; Restore previous APR contents" ;; Current contents of stack:* ;; R4 (Saved by JSR R4,$INTSX in DDM)0 ;; R5 (Saved by JSR R5,'ISR' in Line Table)$ ;; KISAR5 (Saved in Line Table) ;; PS (Saved by Interrupt)s ;; PC (Saved by Interrupt)o/ MOV 2(SP),4(SP) ;; Move saved R5 down on stack4. MOV (SP)+,(SP) ;; Move saved R4 down on stack0 ;; Contents of stack (necessary for $INTXX)* ;; R4 (Saved by JSR R4,$INTSX in DDM)0 ;; R5 (Saved by JSR R5,'ISR' in Line Table) ;; PS (Saved by Interrupt)s ;; PC (Saved by Interrupt)c .ENDC ;; DF K$$DAS : JMP $INTX1 ;; Return through RSX Interrupt exit ;sjp0005 n' .SBTTL $INTX7 - Level 7 Interrupt Exita;+%; **- $INTX7 - LEVEL 7 INTERRUPT EXIT ; @; This routine is used by Driver ISRs that run at priority level?; 7 during some portion of Interrupt Service. Drivers ISRs may :; only push one item on the stack during level 7 interrupt?; service, and must call $INTSX (to drop priority and switch ton,; the system stack) to post any completions.;;0; Inputs: (stack must be formatted as follows:); R5 (Saved in lin00c2q#qn´cÚµcÛ¶c�·c›’e table)2; * KINAR5 (Saved in line table for RSX-11M+ only); KISAR5 (Saved in line table); PS (Saved by interrupt)R; PC (Saved by interrupt)i;-$INTX7:: MOV (SP)+,R5 ;;; Restore R5) .IF DF K$$DAS ;;; Different for RSX-11M+S( ;;; with Kernel Data Space enabled3 MOV (SP)+,@#KINAR5 ;;; Restore Kernel I-Space APR5c .ENDC ; DF K$$DAS9 MOV (SP)+,@#KISAR5 ;;; Restore Kernel mapping register 5p RTI ;;; Return from Interrupt (: .SBTTL $PDSPL - Set Up a Process Level and Dispatch to it;+5; **-$PDSPL-SET UP A PROCESS LEVEL AND DISPATCH TO IT ;A<; This subroutine is called to set up the level of a processG; and dispatch to it. This routine assumes that the stack is formattedDG; properly for a pass through the scheduler when the dispatched processa; exits.;P ; Inputs: ; R2 = PDV Index (word index)c; R3 = Address of function code+"; R4 = Address of a CCB (optional)); R5 = Address of a Line Table (optional)u; ; Outputs:@; The new process execution priority is established and dispatch'; is performed by the routine '$PDDSP'.I;;-)$PDSPL::MTPS #PR7 ;;; Disable Interruptse MOV R2,R1 ;;; Copy PDV Index- ADD $PDVTA,R1 ;;; Point into PDV Index Tableo- MOV (R1),R1 ;;; Get address of process' PDVe. BICB Z.SCH(R1),PS ;; Set priority of process & .SBTTL $PDDSP - Dispatch to a Process;+!; **-$PDDSP-DISPATCH TO A PROCESS4;A ; Inputs: ; R2 = PDV Index (word index)o; R3 = Address of function code "; R4 = Address of a CCB (optional)1; R5 = Address of a process line table (optional)m;b; Outputs to the Process:=; Based on the PDV Index in R2, the process is entered at the =; entry point specified by the function code pointed to by R3l; with:($; R3 = Subfunction code (word index)"; R4 = Address of a CCB (optional)/; R5 = Address of process line table (optional)a;o;; R2 through R5 need not be preserved by the called process;-$PDDSP:: ; ref label2 MOV $CMPDV,-(SP) ; Save Current Process PDV Index+ MOV R2,$CMPDV ; Load new Process PDV Indexs+ ADD $PDVTA,R2 ; Point into PDV Index Tablee MOV (R2),R2 ; Get PDV Addressd/ MOV @#KISAR6,-(SP) ; Save current Kernel APR 6 2 MOV @#KISAR5,-(SP) ; Save current process mapping  .IF DF K$$DASS, MOV @#KINAR6,-(SP) ; Save instruction APR'S MOV @#KINAR5,-(SP) 6 MOV (R2),@#KINAR5 ; Map process in both I and D space .ENDC ; DF K$$DAS$ MOV (R2)+,@#KISAR5 ; Map to process0 MOV (R2),-(SP) ; Save address of dispatch table3 MOVB (R3)+,R2 ; Get function code (no sign extend)e7 ADD (SP)+,R2 ; Form address of entry in dispatch tablee5 BIT #1,(R2) ; Is this a dispatch to an odd address?R' BNE 10$ ; If NE, yes! - bad dispatch.V( MOVB (R3)+,R3 ; Set up subfunction code CALL @(R2)+ ; Call process .IF DF K$$DAS. MOV (SP)+,@#KINAR5 ; Restore instruction APRs MOV (SP)+,@#KINAR6M .ENDC ; DF K$$DAS6 MOV (SP)+,@#KISAR5 ; Restore previous process mapping5 MOV (SP)+,@#KISAR6 ; Restore previous APR 6 contentst6 MOV (SP)+,$CMPDV ; Restore previous process PDV index RETURN ; And return to caller;o ; at crash:s1; R2 -> computed address of dispatch table entry. ; R3-1 -> byte of function code.!; R3 -> byte of subfunction code.); R4 = optional CCB address.#; R5 = optional line table address.F; 10$: IOT ; Crash on odd dispatch.n uC .SBTTL $PDQUE - Queue a CCB (Chain) to a List and Schedule ProcessK;+<; **-$PDQUE-QUEUE A CCB CHAIN TO A LIST AND SCHEDULE PROCESS;r ; Inputs:AH; R3 = PDV Index (high byte) and channel number (low byte) ($PDQUE ONLY)A; R4 = Address of first CCB in a chain. The last CCB of the chaina#; has a zero next CCB pointer.3;- ; Outputs:C; The PDV Index and channel number parameters are stored in the CCB A; and the CCB (or chain) is linked to the operation queue for theCB; process defined by the PDV index and a schedule request for that; process is set. ;c; Registers modified:U ; R3 and R4I;-=$PDQUE::MOV R3,C.LIN(R4) ; Store PDV index and channel numberi&$PDQU1::MOV R5,-(SP) ; Save callers R5' MOV R4,R5 ; Copy a00c:qpßmæàmçámýfáþfDATAddress of first CCBn10$:. BIC #CS.LST,C.STS(R4) ; Clear last CCB marker& MOV R4,R3 ; Copy current CCB address$ MOV (R3),R4 ; Get next CCB address BNE 10$ ; If NE keep going/ BIS #CS.LST,C.STS(R3) ; Mark last CCB of chaino1 MOV #$CMFRK+4,R4 ; Set address of queue listheadx( MOV @#PS,-(SP) ; Save current priority& MOVB #PR7,@#PS ;;; Disable interrupts .IF DF M$$PRO/ CALL $MPLCK ;;; Lock access to process queuec .ENDC ; DF M$$PRO 1% MOV R5,@2(R4) ;;; Link first to lastR& MOV R3,2(R4) ;;; Set new last pointer0 CMP -(R4),-(R4) ;;; Fork block already in use ?$ BNE 20$ ;;; If NE, yes - just exit+ TST $CXOPT ;;; Are we in fork processing?1$ BMI 20$ ;;; If MI, yes - just exit& CLR (R4) ;;; Clear next link pointer C .IF DF R$$MPL .IF DF M$$PROl5 MOV -(R5),-2(R4) ;;; Set up required Unibus Run MaskV .ENDC ; DF M$$PRO & CALL $QFORK ;;; Queue the fork block  .IFF ; DF R$$MPL . MOV R4,@$FRKHD+2 ;;; Link to end of fork list) MOV R4,$FRKHD+2 ;;; Set new last pointer4 .ENDC ; DF R$$MPL t20$: .IF DF M$$PRO; CALL @(SP)+ ;;; Co-routine return to unlock process queues .ENDC ; DF M$$PRO ;% MOV (SP)+,@#PS ;;; Enable interrupts  MOV (SP)+,R5 ; Recover R5 RETURN ; Return to caller i+ .SBTTL $CEPWR - Powerfail Recovery RoutineM;+&; **-$CEPWR-POWERFAIL RECOVERY ROUTINE;MB; This routine is dispatched from the executive powerfail recovery<; code. It will dispatch to the AUX process with a powerfail; recovery function code.2;-$CEPWR:: .IF DF R$$MPL. MOV $DDFNC,-(SP) ; Save current function code4 MOV #FC.PWR,$DDFNC ; Set up powerfail function code .ENDC ; DF R$$MPL; MOV #$DDFNC,R3 ; Point to powerfail recovery function codee0 CLR R2 ; Set up PDV index (AUX is always zero)- CALL $PDSPL ; and dispatch to the process* .IF DF R$$MPL1 MOV (SP)+,$DDFNC ; Restore current function codef .ENDC ; DF R$$MPL RETURNo y6 .SBTTL $LLCRQ - LLC to DLC Request Queuing Subroutine;+4; **- $LLCRQ - LLC TO DLC REQUEST QUEUING SUBROUTINE;$>; This routine is called by a LLC process to queue requests to>; a DLC process. Note that the callers context is saved as if; an interrupt had occurred.;r ; Inputs:r(; R4= Address of CCB (or first in chain); The CCB must contain a valid:P(; C.FNC & C.MOD - Request function code3; C.LIN - LLC channel number (logical line number)u;i ; Outputs:5; The request is dispatched to the proper DLC processt;L; Registers modified:u; None;-$LLCRQ:: .IF DF M$$PRO# SAVRG ; Save registersu* MOV $CMPDV,R1 ; Get current LLC PDV index+ ADD $PDVTA,R1 ; Point into PDV index tablel+ MOVB C.LIN(R4),R3 ; Get LLC channel numberd ASL R3 ; Make it a word index 8 ADD (R1),R3 ; Point to LLC channel mapping table entryA MOV Z.MAP(R3),C.LIN(R4) ; Store SLN and station address into CCBC* ; Note - bit15 will always be clear to) ; flag destination process as a DLCt+ MOVB C.LIN(R4),R1 ; Get system line numberi ASL R1 ; Form word offset3 ADD $SLTMA,R1 ; Point into system line index table6 MOV (R1),R1 ; Get address of system line table entry;+; ** W a r n i n g **a;l2; DECnet-11M-PLUS V4.0 NTINIT hookpoint number 01.; G; Do not change the instruction following label without checking NTINITb;-.$RTF01:: ; NTINIT changes the instruction at ; the location of this label' MOV L.KRBA(R1),R1 ; Get pointer to KRB 1 MOV K.URM(R1),C.URM(R4) ; Set up unibus run mask16 CALL $PDQU1 ; Queue request CCB and schedule process8 MTPS #0 ; Drop priority to 0 and clear condition codes% RESRG ; Restore registerse RETURNt  .IFF ; DF M$$PROn0 SAVRG ; Save all registers* MOV $CMPDV,R1 ; Get current LLC PDV index+ ADD $PDVTA,R1 ; Point into PDV index tablebB MOVB C.LIN(R4),R3 ; Get LLC channel number without sign extension ASL R3 ; Make it a word index18 ADD (R1),R3 ; Point to LLC channel mapping table entryA MOV Z.MAP(R3),C.LIN(R4) ; Store SLN and station address into CCBu* ; Note - bit15 will always be clear to( 00cBq#qn´cÚµcÛ¶c�·c›’ ; flag destination process as a DLC; CALL $STDLC ; Set up DLC PDV index and line table addressA CALL $PDSPL ; Dispatch to DLCl8 MTPS #0 ; Drop priority to 0 and clear condition codes. RESRG ; Restore registers! RETURN ; Return to calling LLCn e .ENDC ; DF M$$PRO n6 .SBTTL $LLCRS - LLC to LLC Request Queuing Subroutine;+4; **- $LLCRS - LLC TO LLC REQUEST QUEUING SUBROUTINE<; **- $DLCRS - DLC TO LLC REQUEST QUEUING SUBROUTINE FOR X25K; **- $NMCRS - LLC TO DLC REQUEST QUEUING SUBROUTINE FOR NETWORK MANAGEMENT ;D?; This routine is called by a LLC process to queue requests to A; another LLC process. Note that the callers context is saved asi; if an interrupt had occurred.R;;J; The $DLCRS entry point is supplied for use by the X25 data link mapping.;J; The $NMCRS entry point is supplied for use by Network Management so thatG; it can fill in the Unibus Run Mask Before issueing a request to a DLCS ; for line/circuit counters etc.;N ; Inputs:T(; R4= Address of CCB (or first in chain); The CCB must contain a valid:e(; C.FNC & C.MOD - Request function code'; C.STA - Destination LLC's PDV indexa$; C.LIN - Option calling parameter;a ; Outputs:>; The request is queued and the appropriate level is scheduled; ; Note:aA; A LLC process can determine if a completion has come from a DLCb@; process or another LLC by examining the MSB of the C.LIN/C.STA; cell in the CCB.;e6; MSB=0 The request came from a DLC and the byte C.LIN4; contains the LLC's channel number for the logical ; line that had the completion.6; MSB=1 The request came from a LLC and the byte C.LIN2; contains an optional calling parameter from the; requesting LLC.;:; Registers modified:e; None;- p$DLCRS::$LLCRS:: .IF DF M$$PRO6 CLR C.URM(R4) ; Allow process to run on any processor .ENDC ; DF M$$PRO s'$NMCRS::SAVRG ; Save R3 and R4t8 BIS #100000,C.LIN(R4) ; Flag destination process is LLC: BISB #200,C.BID(R4) ; Mark CCB as coming from another LLC n6 CALL $PDQU1 ; Queue request CCB and schedule process# RESRG ; Restore registers % RETURN ; And return to calling LLCo o? .SBTTL $LLCLC - Process to Process Direct Call Interface (CCB)rB .SBTTL $LLCAL - Process to Process Direct Call Interface (No CCB);+?; **-$LLCLC-PROCESS TO PROCESS DIRECT CALL INTERFACE (WITH CCB)P4; **-$LLCAL-PROCESS TO PROCESS DIRECT CALL INTERFACE;0G; This routine is called by a process (typically an LLC) to dispatch toMB; another process (typically another LLC) via it's dispatch table.;C ; Inputs:u8; R0 = Optional calling parameter to destination process5; R1 = " " " " " "o&; R2 = Process PDV index ($LLCAL only)-; R3 = Address of function code ($LLCAL only)t#; R4 = Address of CCB ($LLCLC only)L; C.FNC - Function code; C.MOD - Function modifier ; C.STA - Destination PDV index;C'; Outputs: (to the destination process)a; R3 = Subfunction codel ; R4 = Address of CCB (optional); C.STA - Source PDV indexr-; R5 = Address of process database descriptor;0; Registers modified:a; R0, R1, R2, R3, R4;e; Note:=A; If the $LLCAL call is being performed from a task in an I and DV@; space system, the word pointed to by R3 will not be accessableB; by $PDDSP because it will be mapped via Kernel Instruction APR5.@; To work around this mapping problem, the word pointed to by R3*; should be in DSR or on the Kernel Stack.;-5$LLCLC::MOV R4,R3 ; Compute address of function code  ADD #C.FNC,R3 ; .... MOVB C.STA(R4),R2 ; Get destination PDV index- MOVB $CMPDV,C.STA(R4); Save source PDV index36$LLCAL::SAVRG ; Save current database descriptor MOV R2,R5 ; Copy PDV index+ ADD $PDVTA,R5 ; Point into PDV index tablel MOV (R5),R5 ; Get PDV addresse6 MOV Z.DAT(R5),R5 ; Get address of database descriptor' CALL $PDDSP ; Dispatch to the processr* RESRG ; Recover database descriptor RETURN  c6 .SBTTL $STDLC - Set up DLC Parameters for a Given SLN;+<; **-$STDLC-COMP00cJqpßmæàmçámýfáþfDATAUTE DLC PARAMETERS FROM A SYSTEM LINE NUMBER; **-$STDL1-(ALTERNATE ENTRY;A ; Inputs:s0; R2 = System line number (alternate entry only)1; R4 = Address of a CCB with a valid SLN in C.LINd; (Main entry only);t ; Outputs:; R2 = PDV index (word offset)+; R3 = Address of function code cell in CCBd ; R5 = Address of DLC line table; ; Registers modified:r; None;- $STDLC:: .IF NDF N$$1LNt+ MOVB C.LIN(R4),R2 ; Get system line number  .ENDC ; NDF N$$1LNn N$STDL1:: .IF DF N$$1LN8 MOV @$SLTMA,R2 ; Get address of system line table entry .IFF ; DF N$$1LNn ASL R2 ; Form word index3 ADD $SLTMA,R2 ; Point into system line index table 6 MOV (R2),R2 ; Get address of system line table entry .ENDC ; DF N$$1LN* MOV L.DLS(R2),R5 ; Get line table address/ MOVB L.DLC(R2),R2 ; Get PDV index (word index)i4 MOV R4,R3 ; Compute a pointer to the function code ADD #C.FNC,R3 ; ... RETURN ; Return to caller s 5 .SBTTL $ASCMP - Asynchronous Completion to LLC LevelD;+E; **- $ASCMP -ASYNCHRONOUS COMPLETION TO LOGICAL LINK CONTROL MODULES ;F?; This routine is called by Data Link Control processes to pass A; asyncronous status/error information to higher level processes.e;b ; Inputs:.,; R2 = Station number and system line number ; R3 = Asynchronous status/error;; ; Outputs:=; A CCB is allocated on behalf of the caller and based on theo:; system line number, is queued to the appropriate Logical; Link Control process.A;c; Registers modified:L ; R3 and R4;- .ENABL LSBN%$ASCMP::CALL $CCBGT ; Allocate a CCBO BCS 30$ ; If CS erroru@ MOV #FC.CCP+FS.AST,C.FNC(R4) ; Set error complete function code= MOV R2,C.LIN(R4) ; Set up station address/system line number BR 10$ ; Finish in common code y m/ .SBTTL $XMCMP - Transmit Complete to LLC Level;. .SBTTL $CTCMP - Control Complete to LLC Level. .SBTTL $RCCMP - Receive Complete to LLC Level+ .SBTTL $KLCMP - Kill Complete to LLC Leveli;+?; **-$XMCMP-TRANSMIT COMPLETE TO LOGICAL LINK CONTROL PROCESSES.; **-$CTCMP-CONTROL COMPLETE; **-$RCCMP-RECEIVE COMPLETE; **-$KLCMP-KILL COMPLETEC;P ; Inputs:N"; R3 = Operation completion status/; R4 = Address of CCB (or first ccb in a chain)s+; the CCB contains a valid line numbero;o ; Outputs:9; The appropriate function code is inserted into the CCB,C<; the line number is used to find the PDV specification, and(; the CCB is added to the process queue.; ; Registers modified:; R3;- MD$XMCMP::MOVB #FC.XCP,C.FNC(R4) ; Set transmit complete function code BR 10$ ; Join common codeE VC$CTCMP::MOVB #FC.CCP,C.FNC(R4) ; Set control complete function codei BR 10$ ; Join common codeA e@$KLCMP::MOVB #FC.KCP,C.FNC(R4) ; Set kill complete function code BR 10$ ; Join common codet C$RCCMP::MOVB #FC.RCP,C.FNC(R4) ; Set receive complete function codee#10$: MOV R2,-(SP) ; Save callers R2c+ MOVB C.LIN(R4),R2 ; Get system line number 520$: MOV R3,C.STS(R4) ; Store operation status in CCBP6 BICB #200,C.BID(R4) ; Mark message from a DLC process ASL R2 ; Multiply SLN by 2/ ADD $LLCTA,R2 ; Point to reverse mapping tablec< MOV (R2),R3 ; Get SLN & station to PDV & channel map entry5 BPL 25$ ; If PL, got PDV & channel (point to point)f( ; Else, pointer to station table map< MOVB C.STA(R4),R2 ; Get station number (never sign extends)6 ADD R3,R2 ; Compute half mapping table entry address& ASL R2 ; Make a word aligned address2 MOV (R2),R3 ; Get PDV & channel for this stationA25$: BIS #100000,R3 ; Indicate that cell contains a PDV & channelL  .IF DF M$$PRO6 CLR C.URM(R4) ; Allow process to run on any processor .ENDC ; DF M$$PRO . CALL $PDQUE ; Queue CCB and schedule process MOV (SP)+,R2 ; Restore R2 CLC ; Clear C-bit 30$: RETURN ; Return to caller .DSABL LSB4 2 .IF NDF X$$NDMm$ .SBTTL $DD??? - DLC to DDM Requests;+; General Requests with CCBy;d; Format of call:k ; CALL $DD???d;d ; Inputs:($; R4 = Address of first CCB in chain&; (All CCBs must contain a valid SLN); ; 00cRq#qn´cÚµcÛ¶c�·c›’Outputs to DDM: $; R4 = Address of first CCB in chain ; R5 = Address of DDM line table,; R2 & R3 - Available for use without saving;Q; Registers across call:*; R0,R1 - Must be preserved by DDM if used#; R2,R3,R5 - Preserved by Comm Execu; R4 - May be modified;S; On return to DLC:D3; C-bit clear - Request has completed synchronouslya; R4 = Address of CCB; 2; C-bit set - Request will complete asynchronously ; R4 = 0s;-;+; Special requests without CCB;t; ; Format of call: ; CALL $DD??? ; ; Inputs:s; R3 = System line number5(; R4 = Optional calling parameter to DDM;i; Outputs to DDM:u*; R4 = Optional calling parameter from DLC ; R5 = Address of DDM line table,; R2 & R3 - Available for use without saving;-; Registers across call:+; R0,R1 - Must be preserved by DDM if used #; R2,R3,R5 - Preserved by Comm Execr; R4 - May be modified; ; On return to DLC:t; C-bit always clear-; R4 = Optional returning parameter from DDMB;- +$DDXME::DDFDF FC.XME,SUB ; Transmit enablen*$DDRCE::DDFDF FC.RCE,SUB ; Receive enable.$DDMAN::DDFDF FC.MAN,SUB ; Network management/$DDXKL::DDFDF FC.KIL+FS.XKL,CCB ; Transmit kill.$DDCRA::DDFDF FC.KIL+FS.CRA,CCB ; Receive kill;$DDKIL::DDFDF FC.KIL+FS.KIL,CCB ; Receive and transmit kill'$DDSTR::DDFDF FC.CTL+FS.STR,CCB ; Starte&$DDSTP::DDFDF FC.CTL+FS.STP,CCB ; Stop5$DDGET::DDFDF FC.CTL+FS.GET,CCB ; Get characteristics-5$DDSET::DDFDF FC.CTL+FS.SET,CCB ; Set characteristicsf/$DDRNG::DDFDF FC.CTL+FS.RNG,MDC ; Look for ringm-$DDENB::DDFDF FC.CTL+FS.ENB,MDC ; Enable line .$DDDIS::DDFDF FC.CTL+FS.DIS,MDC ; Disable line"$DDXON::DDFDF FC.CTL+FS.XON ; Xon#$DDXOF::DDFDF FC.CTL+FS.XOF ; Xoff 1$DDMSN::DDFDF FC.CTL+FS.MSN ; Sense modem statusK .< .SBTTL DDCM1 - Common Process for Special Non-CCB Functions;+9; **-DDCM1 - COMMON PROCESS FOR SPECIAL NON-CCB FUNCTIONST;D ; Inputs:F; R3 = Address of function code+; R4 = Unspecified calling parameter to DDMe; Stack contains::*; 00(SP) = Line number (originally in R3)); 02(SP) = Return address to calling DLC ;D; Outputs to DDM:F$; R3 = Subfunction code (word index); R4 = Same as on entry; R5 = Line table address ;X; Outputs on return to caller:; Function has been performed3; R4 = Unspecified return parameter to DLC from DDMn;o; Registers across call:; R2,R3,R5 preserved; R4 may be modified by DDM;- .ENABL LSBeDDCM1: .IF DF K$$DAS1 MOV R3,$DDFNC ; Store function code in data areao+ MOV #$DDFNC,R3 ; Point R3 at function code  .ENDC ; DF K$$DAS u MOV R2,-(SP) ; Save R2  MOV 2(SP),R2 ; Get line numberS. BR 22$ ; Join common code to dispatch to DDM : .SBTTL DDCM2 - Common Process for Modem Control Functions;+7; **-DDCM2 - COMMON PROCESS FOR MODEM CONTROL FUNCTIONS ;a5; If the specified line has modem control enabled the 7; function request is derailed to the modem controller.N4; On return from the modem controller the request is4; routed to the proper DDM as usual. If the line is6; hardwired the request is routed directly to the DDM.;( ; Inputs:R; R3 = Address of function codee; R4 = Address of CCBm; Stack contains: ; 00(SP) = Caller's R3D); 02(SP) = Return address to calling DLCt;s; Outputs to modem controller:; R3 = Subfunction codeI; R5 = Line table addressd;n; Outputs to DDM: ; R3 = Subfunction coder; R4 = Same as on entry ; R5 = Line table addresst; ; Outputs on return to caller:0; C-bit clear - Function performed synchronouslyA; C-bit set - Wait for asynchronous report of function completion.;(; Registers across call:; R2,R3,R5 - Preserved; R4 - Modified ;-DDCM2: .IF DF X$$MDC!R$$MPLs D .IF DF K$$DAS5 MOV R3,$DDFNC ; Store the function code in data arean+ MOV #$DDFNC,R3 ; Point R3 at function coden .ENDC ; DF K$$DAS . MOV (R3),C.FNC(R4) ; Put function code in CCB MOV R2,-(SP) ; Save R2 .IF DF N$$1LN3 MOV $SLTMA,R2 ; Point into system line index tablea .IFF ; DF N$$1LNd+ MOVB C.LIN(R4),R2 ; Get system li00cZqpßmæàmçámýfáþfDATAne numberr ASL R2 ; Form word index3 ADD $SLTMA,R2 ; Point into system line index tableP .ENDC ; DF N$$1LN3 BIT #LF.MDC,@(R2)+ ; Does line need modem control?4 BEQ 20$ ; No - join common code to dispatch to ddm MOV R5,-(SP) ; Save registerR- MOV R3,-(SP) ; Save address of function codeD4 CLR R2 ; Get auxilary process PDX index (always 0)6 MOV @$PDVTA,R5 ; Get address of auxilary process' PDV) ; that works since it's PDV index = 0= MOV Z.DAT(R5),R5 ; Get address of data base descriptor blocke, CALL $PDDSP ; Dispatch to modem controller MOV (SP)+,R3 ; Restore R3; MOVB C.LIN(R4),R2 ; Obtain line number (no sign extension)n7 BIS #100000,C.LIN(R4) ; Indicate modem control request 3 CALL DDMDSP ; Dispatch to the device driver (DDM)M0 BCS 25$ ; Request will complete asynchronously, CALL $CCBRT ; Otherwise return CCB to pool? CLR R4 ; Modem controller will return asynchronous completion , SEC ; Set C-bit, line is modem controlled BR 25$ ; Join common codet .ENDC ; DF X$$MDC!R$$MPLC 5 .SBTTL DDCM3 - Common Process for Functions with CCB 6 .SBTTL DDCM4 - Common Process for Functions with CCB;+2; **-DDCM3 - COMMON PROCESS FOR FUNCTIONS WITH CCB2; **-DDCM4 - COMMON PROCESS FOR FUNCTIONS WITH CCB;e ; Inputs: 7; R3 = Address of function and subfunction code (DDCM3),; R3 = Address of function code only (DDCM4); R4 = Address of CCBl; Stack contains:n; 00(SP) = Callers R3); 02(SP) = Return address to calling DLC; ; Outputs to DDM:c$; R3 = Subfunction code (word index); R4 = Address of CCBP; R5 = Address of line table;.; Registers across call:; R2,R3,R5 - Preserved; R4 - May be modified;-DDCM3: .IF DF K$$DAS1 MOV R3,$DDFNC ; Store function code in data areaH+ MOV #$DDFNC,R3 ; Point R3 at function codei a .IFTF ; DF K$$DAS9 MOV (R3),C.FNC(R4) ; Put function and subfunction in CCB4 BR 10$ ; Join common codeoDDCM4: .IFT ; DF K$$DASr2 MOV R3,$DDFNC ; Store function code in data area+ MOV #$DDFNC,R3 ; Point R3 at function code  .ENDC ; DF K$$DASA e/ MOVB (R3),C.FNC(R4) ; Put function code in CCBe10$: MOV R2,-(SP) ; Save R25 20$: MOVB C.LIN(R4),R2 ; Get SLN22$: MOV R5,-(SP) ; Save R53 CALL DDMDSP ; Dispatch to the device driver (DDM)M25$: MOV (SP)+,R5 ; Restore R5 MOV (SP)+,R2 ; Restore R2 MOV (SP)+,R3 ; Restore R3! RETURN ; Return to calling DLCC .DSABL LSB & .SBTTL DDMDSP - Dispatch to DDM Level;+!; **-DDMDSP-DISPATCH TO DDM LEVEL ;dF; This subroutine is called to dispatch down to the ddm level. ProcessH; dispatch will occur at the current priority or at the process priority; dependent on a PDV flag.;. ; Inputs:;; R2 = System line numberS;;; Registers modified: ; R5;-@DDMDSP: CALL $STDD1 ; Set up DDM PDV index & line table address CLC ; Save current priority! MFPS -(SP) ; with C-bit clearn" SAVRG ; Get a free register MOV R2,R0 ; Copy DDM PDV index+ ADD $PDVTA,R0 ; Point into PDV index table " MOV (R0),R0 ; Get pointer to PDV BIT #ZF.DVP,Z.FLG(R0). BEQ 10$ ; If EQ, run DDM at current priority& MTPS #PR7 ; Raise processor priority/ BICB Z.SCH(R0),PS ;;; Drop to process priority210$: RESRG ; Restore register # CALL $PDDSP ; Dispatch to the DDM$% ADC (SP) ; Update C-bit in saved PSe) MTPS (SP)+ ; Restore processor priorityM RETURN  5 .SBTTL $DDAST - Asynchronous Completion to DLC Level;+8; **-$DDAST-ASYNCHRONOUS COMPLETION TO DATA LINK CONTROL; B; This subroutine is called by device drivers when an asynchronousE; condition must be returned to a data link control module and no CCBa$; is available at the device driver.;S ; Inputs:o8; R3 = Asynchronous completion status (moved into C.STS); R4 = System line numbert;h ; Outputs:3; A CCB is allocated on behalf of the device driverR.; and the asynchronous status is queued to the ; Data Link Control module with:; C.FNC= FC.CCP; C.MOD= FS.AST;O; Registers modified: ; XXXN;- .ENABL LSBs'$DDAST::MOV R4,-(SP) ; Save line numbera CALL $C00cbq#qn´cÚµcÛ¶c�·c›’CBGT ; Allocate a CCB BCS 5$ ; If CS error- MOV (SP)+,C.LIN(R4) ; Set line number in CCBa@ MOV #FC.CCP+FS.AST,C.FNC(R4) ; Set error complete function code BR 20$ ; Finish in common code"5$: MOV (SP)+,R4 ; Clean the stack RETURN ; Return to caller / .SBTTL $DDXMP - Transmit Complete to DLC Level . .SBTTL $DDRCP - Receive Complete to DLC Level. .SBTTL $DDCCP - Control Complete to DLC Level+ .SBTTL $DDKCP - Kill Complete to DLC Level;+2; **-$DDXMP-TRANSMIT COMPLETE TO DATA LINK CONTROL; **-$DDRCP-RECEIVE COMPLETE; **-$DDCCP-CONTROL COMPLETE; **-$DDKCP-KILL COMPLETEC'; **-$LLCSP-SPECIAL ENTRY POINT FOR X25r; 6; This subroutine is called by Device Drivers to queue8; completion notifications to Data Link Control modules.; J; The $LLCSP entry point is provided for use by the X25 Data Link Mapping.;- ; Inputs:m"; R3 = Operation completion status; R4 = Address of CCB to queue+; The CCB contains a valid line number;;* ; Outputs:'; The CCB is queued to a DLC list based$7; on the system line number parameter in the CCB with a*-; transmit or receive complete function code.R;O; Registers modified:s; XXXt;-D$DDXMP::MOVB #FC.XCP,C.FNC(R4) ; Set transmit complete function code BR 20$ ; Join common code C$DDRCP::MOVB #FC.RCP,C.FNC(R4) ; Set receive complete function code. BR 20$ ; Join common codea@$DDKCP::MOVB #FC.KCP,C.FNC(R4) ; Set kill complete function code BR 20$ ; Join common codee9$DDCCP::TST C.LIN(R4) ; Special modem control completion?e BPL 10$ ; If PL no) CALLR $CCBRT ; Yes - return CCB to poolr+ ; Modem controller will post completionO@10$: MOVB #FC.CCP,C.FNC(R4) ; Set control complete function code$LLCSP::$DDSPC::-20$: MOV R3,C.STS(R4) ; Set completion statusd .IF DF M$$PRO& MOVB C.LIN(R4),R3 ; Get system line # ASL R3 ; Form word offsetJ3 ADD $SLTMA,R3 ; Point into system line index tableS0 MOV (R3),R3 ; Get address of system line table;+; ** W a r n i n g **.;(2; DECnet-11M-PLUS V4.0 NTINIT hookpoint number 02.;fG; Do not change the instruction following label without checking NTINITr;-.$RTF02:: ; NTINIT changes the instruction at ; the location of this label' MOV L.KRBA(R3),R3 ; Get pointer to KRB( MOV K.URM(R3),C.URM(R4) .ENDC ; DF M$$PRO/ CALLR $PDQU1 ; Queue CCB and schedule processF .DSABL LSBJ .ENDC ; NDF X$$DDMt t9 .SBTTL $STDDM - Set DDM PDV Index and Line Table Addresss;+4; **-$STDDM-SET DDM PDV INDEX AND LINE TABLE ADDRESS; **-$STDD1-(ALTERNATE ENTRY) ;bC; This subroutine is called to set up a Device Driver PDV index andh3; line table address based on a system line number. ;t ; Inputs:0; R2 = System line number (alternate entry only)5; R4 = CCB address with a valid system line number in.; C.LIN (Main entry only);; ; Outputs:; R2 = PDV index#; R5 = Address of device line table$;t; Registers modified:S; R5;-$STDDM:: .IF NDF N$$1LNs/ MOVB C.LIN(R4),R2 ; Extract system line numberE .ENDC ; NDF N$$1LN-$STDD1:: .IF DF N$$1LN2 MOV @$SLTMA,R2 ; Get address of system line entry .IFF ; DF N$$1LNt ASL R2 ; Form word index3 ADD $SLTMA,R2 ; Point into system line index tablen0 MOV (R2),R2 ; Get address of system line entry .ENDC ; DF N$$1LN 1 MOV L.DDS(R2),R5 ; Get device line table addressu= MOVB L.DDM(R2),R2 ; Get device driver PDV index (word index) RETURN ; Return d( .SBTTL $CCBGT - Allocate a Standard CCB;+$; **-$CCBGT- Allocate a Standard CCB;mG; This subroutine is called to allocate a CCB from the CCB pool. If the A; assembly option is chosen, the CCB may be allocated from SystemF*; Dynamic Memory if the CCB pool is empty.;t ; Inputs:e; None.;V ; Outputs:.; R4 contains the address of the allocated CCB6; C-Bit is CLEAR if the CCB was successfully allocated0; C-Bit is SET and R4=0 if the allocation failed;-$CCBGT::CLC ; Assume Success' MOV @#PS,-(SP) ; Save current priorityd& MOVB #PR7,@#PS ;;; Disable interrupts .IF DF M$$PRO3 CALL $MPLCK ;;; Lock00cjqpßmæàmçámýfáþfDATA Access to CommExec Resourcesp .ENDC ; DF M$$PRO CALL CCBGT ;;; Allocate a CCBb .IF DF M$$PRO7 CALL @(SP)+ ;;; Co-Routine return to unlock resources  .ENDC ; DF M$$PRO< MOV (SP)+,@#PS ;;; Enable interrupts (and load final C-bit) RETURNs E( .SBTTL $LDBGT - Get a Large Data Buffer;+$; **-$LDBGT- Get a Large Data Buffer;lA; This subroutine is called to allocate a fixed length Large DatarA; Buffer. Large Data Buffers come out of the same pool as Receive$B; Data Buffers. The difference is that Large Data Buffers are for@; use by non-DDM processes and there must be a minimum number ofA; buffers remaining in the pool or the allocation will fail. TheDA; minimum number reserved for DDM processes is the RDB threshold.-;) ; Inputs:; None.T;L ; Outputs:2; R4 contains the address of buffers allocated CCB:; C-Bit is CLEAR if the CCB/LDB was successfully allocated0; C-Bit is SET and R4=0 if the allocation failed;m; Note:t2; The caller's APR6 is preserved across this call.;-?$LDBGT::CMP $RDBCT,$RDBTH ; Is pool minimum threshold exceeded?d1 BHIS $RDBGT ; If HIS, No ... go allocate buffern5 INC $LDBAF ; Increment count of allocation failuresi! RETURN ; Return with C-Bit SETs * .SBTTL $RDBGT - Get a Receive Data Buffer;+&; **-$RDBGT- Get a Receive Data Buffer; >; This subroutine is called to allocate a fixed length Receive; Data Buffer.;d ; Inputs:s; None.R; ; Outputs:3; R4 contains the address of allocated buffer's CCBe:; C-Bit is CLEAR if the CCB/RDB was successfully allocated0; C-Bit is SET and R4=0 if the allocation failed; ; Note:o2; The caller's APR6 is preserved across this call.;-6$RDBGT::MOV @#KISAR6,-(SP) ; Save current APR6 mapping' SAVRG ; Save some registerst CLC ; Assume successful' MOV @#PS,-(SP) ; Save current priorityo& MOVB #PR7,@#PS ;;; Disable interrupts .IF DF M$$PRO3 CALL $MPLCK ;;; Lock access to CommExec resources  .ENDC ; DF M$$PRO CALL CCBGT ;;; Allocate a CCB-# BCS 10$ ;;; If CS, None availables7 MOV #CF.LB,C.FLG(R4) ;;; Set-up last buffer indicator 8 MOVB #CB.RDB,C.BID(R4) ;;; and buffer ID fields in CCB/ MOV $RDBSZ,C.CNT(R4) ;;; Load size of RDB/LDB; MOV $RDBSZ,C.CNT2(R4)> MOV #$RDBLH,R5 ;;; Point to listhead in allocation crtl block- CALL BUFGT ;;; Allocate a Large Data Buffert BCC 10$ ;;; If CC, Successfuln& CALL CCBRT ;;; Else, release the CCB CLR R4 ;;; No CCB availableo10$: .IF DF M$$PRO8 CALL @(SP)+ ;;; Co-Routine return to unlock resources  .ENDC ; DF M$$PRO< MOV (SP)+,@#PS ;;; Enable interrupts (and load final C-bit)% RESRG ; Restore registersD3 MOV (SP)+,@#KISAR6 ; Restore previous APR6 mappingo RETURN ; Return to caller )- .SBTTL $RDBRT - Return a Receive Data Bufferc+ .SBTTL $LDBRT - Return a Large Data Buffer ;+); **-$RDBRT- Return a Receive Data Buffers'; **-$LDBRT- Return a Large Data Buffere;BD; This routine is called to return a data buffer to the large bufferE; pool. If the waiters count is zero or a buffer is already queued to(F; the system process to satisfy a wait request, the buffer is returnedA; to the pool. Otherwise, the system return process is scheduled. ;p ; Inputs:R); R4 contains the address of buffer's CCB-7; Note that C.BUF2+2 must contain the original Virtual <; Address of the buffer, and C.BUF must contain the original; Bias of the buffer.r; ; Outputs:; None.B;-$LDBRT::.$RDBRT::SAVRG ; Save some registers' MOV @#PS,-(SP) ; Save current prioritye& MOVB #PR7,@#PS ;;; Disable interrupts MOV C.BUF2+2(R4),C.BUF+2(R4) ) ;;; Copy the buffer's Virtual Addresst> MOV #$RDBCT,R5 ;;; Point to count in allocation control block6 TST $RDQCT ;;; Are any processes waiting for an RDB?; BLE RELBUF ;;; If LE, no waiters or buffer already queued > MOV #100000,R3 ;;; Else, send to buffer return system process3 BIS R3,$RDQCT ;;; Mark a buffer return in progressL MOV #FC.RCE!FS.RTN,C.FNC(R4)> .IF DF M$$PRO8 CLR C.URM(R4) ;;; Allow process to run on any pro00crq#qn´cÚµcÛ¶c�·c›’cessor .ENDC ; DF M$$PRO5 CLR (R4) ;;; Clear link word (only return 1 buffer)e0 CALL $PDQUE ;;; Queue buffer to system process! BR CMNRTN ;;; Enter common codeb k .SBTTL $CCBRT - Return a CCBe;+; **-$CCBRT- Return a CCBR;U6; This routine is called to deallocate a standard CCB.;0 ; Inputs: $; R4 contains the address of the CCB;s ; Outputs:; None.M;-.$CCBRT::MOV @#PS,-(SP) ; Save current priority& MOVB #PR7,@#PS ;;; Disable interrupts .IF DF M$$PRO3 CALL $MPLCK ;;; Lock access to CommExec resourcesC .ENDC ; DF M$$PRO CALL CCBRT ;;; Return the CCBC .IF DF M$$PRO7 CALL @(SP)+ ;;; Co-Routine return to unlock resourcesn .ENDC ; DF M$$PRO% MOV (SP)+,@#PS ;;; Enable interruptsR RETURNC 2 .SBTTL $CSBGT - Get a CCB and a Small Data Buffer;+.; **-$CSBGT- Get a CCB and a Small Data Buffer;eC; This routine is called to allocate a CCB and a Small Data Buffer.uD; The routine also sets up the buffer descriptor in the CCB to point1; to the buffer as well as the proper byte count.r;C ; Inputs:D; None.;C ; Outputs:-; R4 contains the address of the buffer's CCBP:; C-Bit is CLEAR if the CCB/SDB was successfully allocated'; C-Bit is SET if the allocation failedr;t; Note:R1; APR6 is mapped to the allocated buffer on exit. ;- .ENABL LSB$.$CSBGT::SAVRG ; Save some registers CLC ; Assume successl' MOV @#PS,-(SP) ; Save current priority & MOVB #PR7,@#PS ;;; Disable interrupts .IF DF M$$PRO3 CALL $MPLCK ;;; Lock access to CommExec resourcesc .ENDC ; DF M$$PRO CALL CCBGT ;;; Allocate a CCBc* BCS 20$ ;;; If CS, CCB allocation failed# MOV #CF.LB!CF.SOM!CF.EOM,C.FLG(R4)s- ;;; Set last buffer and single message ini= MOVB #CB.SDB,C.BID(R4) ;;; in flags and load ID of CCB/SDBf+ MOV $SDBSZ,C.CNT(R4) ;;; Load buffer sizeR MOV $SDBSZ,C.CNT2(R4)> MOV #$SDBLH,R5 ;;; Point to listhead in allocation ctrl block$ CALL BUFGT ;;; Allocate the buffer6 BCS 10$ ;;; If CS, SDB allocation failed, return CCB$ BR 20$ ;;; Else, enter common code ;5 .SBTTL $CSBRT - Return a CCB and a Small Data Buffer$;+1; **-$CSBRT- Return a CCB and a Small Data BufferM;.D; This routine is called to deallocate a CCB and a Small Data Buffer@; which is pointed to by the first buffer descriptor in the CCB.;, ; Inputs:;$; R4 contains the address of the CCB6; Note that C.BUF+2 must contain the original Virtual<; Address of the buffer, and C.BUF must contain the original; Bias of the buffer.t; a ; Outputs:; None. ;-.$CSBRT::SAVRG ; Save some registers' MOV @#PS,-(SP) ; Save current priority+& MOVB #PR7,@#PS ;;; Disable interrupts> MOV #$SDBCT,R5 ;;; Point to count in allocation control blockRELBUF:D .IF DF M$$PRO3 CALL $MPLCK ;;; Lock access to CommExec resourcesh .ENDC ; DF M$$PRO2 MOV C.BUF(R4),R3 ;;; Set up address of the buffer3 MOV C.BUF+2(R4),R2 ;;; as an address double word # CALL BUFRT ;;; Release the buffer 10$: CALL CCBRT ;;; Release the CCB20$: .IF DF M$$PRO7 CALL @(SP)+ ;;; Co-Routine return to unlock resources .ENDC ; DF M$$PROCCMNRTN: MOV (SP)+,@#PS ;;; Enable interrupts (and load final C-bit)B% RESRG ; Restore registersc RETURNo .DSABL LSB F: .SBTTL $RDBWT - Queue a Request for a Receive Data Buffer;+6; **-$RDBWT- Queue a request for a Receive Data Buffer;s@; This routine is called by DDM processes after a failure of the>; DDM to allocate an Receive Data Buffer ($RDBGT) has occured.@; The system line table flags word is updated to mark the buffer5; wait request and the global request is incremented.M;N ; Inputs:,$; R4 contains the System Line Number;l ; Outputs:; None.R;-%$RDBWT::SAVRG ; Save a registerB .IF DF M$$PRO CALL $MPSAV ; Bypass the cache .ENDC ; DF M$$PRO% ASL R4 ; Convert SLN to word offsetc3 ADD $SLTMA,R4 ; Point into System Line Index Table ;+; ** W a r n i n g **f;e2; DECnet-11M-PLUS V4.0 NTINIT hookpoint number 03.; *; Do not change the instructions following; labe00czqpßmæàmçámýfáþfDATAl without checking NTINIT ;-/$RTF03:: ; NTINIT changes the instructions atN ; the location of this label: INCB @(R4)+ ; Increment wait request count for this line& NOP ; Space for NTINIT runtime code NOP:; MOV (R4),R4 ; Code replacement for DECnet-11M-PLUS V4.0; INCB L.BFWT(R4) ; ...o% INC $RDQCT ; Increment global county .IF DF M$$PRO* CALL @(SP)+ ; Restore state of the cache .ENDC ; DF M$$PRO# RESRG ; Restore the registert RETURNh n( .SBTTL $RDBQP - Purge Buffer Wait Queue;+$; **-$RDBQP- Purge Buffer Wait Queue;eC; This routine is called to cancel all requests in the Receive Data+8; Buffer Wait Queue for a particular system line number.;e ; Inputs: $; R4 contains the system line number; ; Outputs:; None.t;-,$RDBQP::SAVRG ; Save some registers .IF DF M$$PRO CALL $MPSAV ; Bypass the cache .ENDC ; DF M$$PRO' ASL R4 ; Convert SLN into word offsetR3 ADD $SLTMA,R4 ; Point into System Line Index TableB;+; ** W a r n i n g **a;Q2; DECnet-11M-PLUS V4.0 NTINIT hookpoint number 04.;h*; Do not change the instructions following; label without checking NTINITi;-/$RTF04:: ; NTINIT changes the instructions atu ; the location of this label1 MOV @(R4)+,R3 ; Get System Line Table flags wordA0 BIC #^C,R3 ; Isolate wait request count0 BIC R3,@-(R4) ; Clear wait request count in SLT NOP NOP:; MOV (R4),R4 ; Code replacement for DECnet-11M-PLUS V4.0; CLR R3 ; ...n; BISB L.BFWT(R4),R3 ; ...; CLRB L.BFWT(R4) ; ...n7 SUB R3,$RDQCT ; Reduce global wait count by same valuec .IF DF M$$PRO* CALL @(SP)+ ; Restore state of the cache .ENDC ; DF M$$PRO# RESRG ; Restore registersu RETURNh o& .SBTTL CCBGT - CCB Allocation Routine;+"; **-CCBGT- CCB allocation routine;L@; This subroutine is called within this module to allocate a CCBB; from the CCB pool or from System Dynamic Memory. This routine isA; always executed with interrupts inhibited (and multi-processors; ; locks set).B;( ; Inputs:; None.,;Q ; Outputs:*; R4 contains the address of allocated CCB6; C-Bit is CLEAR if the CCB was successfully allocated'; C-Bit is SET if the allocation failedr;e; Notes:E; Before this routine is called, the calling routine must have issuedCD; a CLC instruction followed by an INHIB$. No other values must be E; stored on the stack because if the allocation fails, the FAIL: code.D; will reach back on the stack and set the C-Bit in the saved PSW soD; that when the calling routine executes an ENABL$ the C-Bit will be); set to indicate the allocation failure.C;-CCBGT: .IF DF N$$OPT!R$$MPL 9 TSTB PRIOFF+2(SP) ;;; Can we dynamically allocate a CCB?i BMI 10$ ;;; If MI, Noo; CMP $CCBCT,$RDBTH ;;; Else, are we below the RDB thresholdC. BHI 10$ ;;; If HI, No ... allocate from pool= CMP $CCBAL,$RDBNM ;;; Have we allocated enough dynamic CCBs?c BHIS 30$ ;;; If HIS, Yes) SAVRG ;;; Save some registersC0 MOV $CCBSZ,R1 ;;; Get size of block to allocate .IF DF M$$PRO1 ADD #2,R1 ;;; 2 more bytes on a Multi-Processorl .ENDC ; DF M$$PRO/ CALL $ALOCB ;;; Try to allocate a dynamic CCBS. MOV R0,R4 ;;; Copy adress of allocated block' RESRG ;;; Restore registersH* BCS 10$ ;;; If CS, DSR allocation failed .IF DF M$$PRO) TST (R4)+ ;;; Skip over Unibus Run Mask, .ENDC ; DF M$$PRO0 INC $CCBAL ;;; Count dynamically allocated CCB BR 20$ ;;; Enter common code .ENDC ; DF N$$OPT!R$$MPLC10$:3 MOV $CCBLH,R4 ;;; Get address of first CCB in listA" BEQ 30$ ;;; If EQ, list is empty) MOV (R4),$CCBLH ;;; Unlink CCB from listA/ DEC $CCBCT ;;; Reduce count of available CCBs,20$:1 MOVB #CB.CCB,C.BID(R4) ;;; Set up buffer ID byte  .IF DF M$$PRO8 CLR C.URM(R4) ;;; Allow process to run on any processor .ENDC ; M$$PRO4. CLR (R4) ;;; Zero next pointer (clear C-Bit) RETURN ;;; Return to caller30$:* INC $CCBAF ;;; Count allocation failures2 BR FAIL ;;; Enter common failure processing code L( .SBTTL CCBRT - CC00c‚q#qn´cÚµcÛ¶c�·c›’B Deallocation Routine;+$; **-CCBRT- CCB Deallocation Routine;4B; This subroutine is called within this module to deallocate a CCBE; to the CCB pool or to System Dynamic Memory. This routine is alwaystE; executed with interrupts inhibited (and Multi-Processor locks set).o;s ; Inputs:;/; R4 contains the address of the CCB to releasea;- ; Outputs:; None.e;-CCBRT: .IF DF N$$OPT!R$$MPL; .IF NDF R$$MPLa2 CMP R4,#$CEAVL ;;; Is CCB from the internal pool? BHIS 10$ ;;; If HIS, Yes .ENDC ; NDF R$$MPLiA TSTB PRIOFF+2(SP) ;;; Were we called from Device Priority Level?s3 BMI 10$ ;;; If MI, Yes ... can't interlock $DEACBt3 CMP $CCBCT,$RDBTH ;;; Can we satisfy RDB requests?s, BLOS 10$ ;;; If LOS, No ... return to list, TST $CCBAL ;;; Any dynamic CCBS allocated?* BEQ 10$ ;;; If EQ, No ... return to list, SAVRG ;;; Save some registers# MOV R4,R0 ;;; Copy address of CCBF2 MOV $CCBSZ,R1 ;;; Get size of block to deallocate .IF DF M$$PRO0 ADD #2,R1 ;;; 2 more bytes on Multi-Processors+ TST -(R0) ;;; Backup over Unibus Run Maskr .ENDC ; DF M$$PRO$ CALL $DEACB ;;; Deallocate the CCB. RESRG ;;; Restore the registers1 DEC $CCBAL ;;; Decrement count of dynamic CCB'su RETURNt .ENDC ; DF N$$OPT!R$$MPLc10$:6 MOV $CCBLH,(R4) ;;; Set first pointer in returned CCB( MOV R4,$CCBLH ;;; Set new first pointer1 INC $CCBCT ;;; Increment count of CCB's in poolS RETURNG s. .SBTTL Allocation Control Block Documentation;+>; Allocation Control Blocks are used to control the allocation8; of fixed length blocks from double link lists (address=; doublewords). The control blocks have the following format:e;g!; .WORD <# of buffers available>c$; .WORD 0,0 ; Allocation listhead#; .WORD <# of allocation failures>V;- ,1 .SBTTL BUFGT - General Buffer Allocation Routine,;+-; **-BUFGT- General Buffer Allocation RoutineI;e<; This subroutine is called within this module to allocate aD; buffer from a doubley linked list. This routine is always executed<; with interrupts inhibited (and Multi-Processor locks set).;l ; Inputs:aA; R5 contains the pointer to listhead in Allocation Control Blockt; ; Outputs:+; R2 contains the Virtual Address of bufferA$; R3 contains the APR Bias of buffer9; C-Bit is CLEAR if the buffer was successfully allocatedA'; C-Bit is SET if the allocation faileda;u; Registers Modified:I; R5$; APR6 will be mapped to the buffer.;o; Notes:E; Before this routine is called, the calling routine must have issuedxD; a CLC instruction followed by an INHIB$. No other values must be E; stored on the stack because if the allocation fails, the FAIL: codetD; will reach back on the stack and set the C-Bit in the saved PSW soD; that when the calling routine executes an ENABL$ the C-Bit will be); set to indicate the allocation failure.S;- BUFGT: CLC ;;; Assume success, MOV (R5)+,R3 ;;; Get next buffer's APR Bias3 MOV (R5)+,R2 ;;; Get next buffer's Virtual Addresss. BEQ 10$ ;;; If EQ, No more buffers available/ MOV R3,@#KISAR6 ;;; Map APR6 to the new bufferh' MOV 2(R2),-(R5) ;;; Unlink buffer from # MOV (R2),-(R5) ;;; the free listF* MOV R3,C.BUF(R4) ;;; Load the Buffer Bias MOV R3,C.BUF2(R4)7 MOV R2,C.BUF+2(R4) ;;; Load the Buffer Virtual Addressa MOV R2,C.BUF2+2(R4)4 DEC -(R5) ;;; Decrement count of available buffers RETURNL10$:6 INC (R5)+ ;;; Increment count of allocation failures=FAIL: INC PRIOFF+2(SP) ;;; Set C-Bit in saved PSW for ENABL$.Q- SEC ;;; Indicate buffer allocation failureV RETURNA ;3 .SBTTL BUFRT - General Buffer Deallocation RoutineU;+/; **-BUFRT- General Buffer Deallocation Routines;B; This routine is called within this module to deallocate a buffer>; to a doubley linked list. This routine is always called with7; interrupts inhibited (and Multi-Processor locks set).b;b ; Inputs:T+; R2 contains the Virtual Address of bufferf$; R3 contains the APR Bias of buffer;; R5 points to the buffer count in allocation control blockI;c 00cŠqpßmæàmçámýfáþfDATA; Outputs:; None. ;-:BUFRT: INC (R5)+ ;;; Increment count of available buffers1 MOV @#KISAR6,-(SP) ;;; Save current APR6 mappingt: MOV R3,@#KISAR6 ;;; Map APR6 to the buffer being returned( MOV (R5)+,(R2) ;;; Link buffer to start' MOV (R5)+,2(R2) ;;; of the free list 5 MOV (SP)+,@#KISAR6 ;;; Restore previous APR6 mapping & MOV R2,-(R5) ;;; Set new first buffer MOV R3,-(R5) ;;; pointer RETURNa " .SBTTL $CELOG - Log Network Event;+; **-$CELOG-LOG NETWORK EVENTo;o ; Inputs:c; R0 - Event class and type; R1 - Event control word: ; Low byte:(; Bit 0 1 => R4 is address of a CCB$; 0 => R4 is a data area pointer;A*; 1 1 => Line-ID is SLN & Station#; 0 => Line-ID is PDV & Channels;t1; 2 1 => Event is associated with a lineP.; 0 => Event is not associated with a line;V8; 3 1 => Event is associated with a remote node5; 0 => Event is not associated with a remote nodet;+4; 4 1 => Event is associated with a circuit1; 0 => Event is not associated with a circuit:; 3; 5 1 => Event is associated with a module0; 0 => Event is not associated with a module; &; 6 1 => Use line-id from CCB2; 0 => Use line-id from event descriptor block;n ; High byte: ; # of bytes of data to copy;o); R3 - Pointer to event descriptor block:1; 3; Word 1 Line-ID (SLN & station or PDV & channel)e ; 2-4 Event dependent data; 5 Node address1"; 6 Module ID (Coded value); 7 Port #t; 8 Logical channel #;:*; R4 - Pointer to CCB or data area pointer;h; Registers modified:E; R0, R1, R2, R3, R5;-; $CELOG:: .IF DF N$$EVL!R$$MPL 1 MOV $LGPDV,R2 ; Get PDV index of logging process  BEQ 10$ ; If EQ, no loggingy2 MOV $CMPDV,-(SP) ; Save calling process PDV index6 MOV R3,-(SP) ; Save address of event descriptor block( MOV R1,-(SP) ; and event control word- MOV SP,R1 ; Set up pointer to control blocks# SAVRG ; Preserve CCB address)0 MOV $LGDDB,R5 ; Set address of logging database* MOV #$CELFN,R3 ; Set up dispatch function1 CALL $PDDSP ; and dispatch to logging process " RESRG ; Restore CCB address% CMP (SP)+,(SP)+ ; Clean up the stackx TST (SP)+ ; ... .ENDC ; DF N$$EVL!R$$MPLn10$: RETURN ; And return i" .SBTTL $TSTIM - Timeout Processor;+; **-$TSTIM-TIMEOUT PROCESSORb;kD; This subroutine is called to test and decrement a timeout count inE; the first byte of a process line table. If the count is decremented,@; to zero, the process is dispatched at it's timeout entry point#; with a 'FS.LTM' subfunction code. ;p ; Inputs:g; R2 - PDV index of processR$; R5 - Pointer to process line table;e ; Outputs:; Only R4 will be peserved;-#$TSTIM::MOV R2,R3 ; Copy PDV index + ADD $PDVTA,R3 ; Point into PDV index tableP* MOV @#KISAR5,-(SP) ; Save current mapping> MOV @(R3)+,@#KISAR5 ; Map to process (for mapped line tables)# MTPS #PR7 ;;; Disable interruptsc$ TSTB (R5) ;;; Is the timer active? BEQ 10$ ;;; No ... just exit, DECB (R5) ;;; Yes ... decrement time to go( BNE 10$ ;;; If NE, timer still running% CALL $DSPTM ;;; Dispatch to process 10$: MTPS #0 ;;; Restore priority' MOV (SP)+,@#KISAR5 ;;; Restore mapping RETURNT;: + .SBTTL $DSPTM - Dispatch a Process Timeouti;+&; **-$DSPTM-DISPATCH A PROCESS TIMEOUT; ?; Dispatch a process timeout at it's timeout entry point with am; subfunction code of 'FS.LTM';; ; Inputs:t; R2 - PDV index of processt$; R5 - Pointer to process line table;s ; Outputs:; Only R4 will be preserved ;-)$DSPTM::MOV R4,-(SP) ;;; Save caller's R4i0 MOV #$LTMFC,R3 ;;; Get address of function code% CALL $PDSPL ;;; Dispatch to processP% MOV (SP)+,R4 ;;; Restore caller's R4R MTPS #0 ;;; Enable interruptsa RETURNc 0 .SBTTL $CMQIN - Queue a Chain of CCBs to a List;+-; **-$CMQIN - QUEUE A CHAIN OF CCBS TO A LISTt;t?; This subroutine is called to add a CCB or a chain of CCBs to "; the end of a single linked lis00c’q#qn´cÚµcÛ¶c�·c›’t.;i ; Inputs:c#; R3 = Address of two word listheady$; R4 = Address of first CCB in chain; ; Outputs:*; The CCB is queued to the end of the list;r; Registers modified:C; None;- '$CMQIN::SAVRG ; Save registerse"10$: MOV R4,R5 ; Copy CCB address4 BIC #CS.LST,C.STS(R5) ; Clear last CCB in chain bit0 MOV (R5),R4 ; Get address of next CCB in chain" BNE 10$ ; Loop till end of chain3 BIS #CS.LST,C.STS(R5) ; Set last CCB in chain bitC- MOV (SP),@2(R3) ; Link chain to end of queuei< MOV R5,2(R3) ; Update listhead pointer to last CCB in queue# RESRG ; Restore registersp RETURN ; Return e3 .SBTTL $CMQRM - Remove a Chain of CCBs from a List;+0; **-$CMQRM - REMOVE A CHAIN OF CCBS FROM A LIST;5; This subroutine is called to remove the first entryR; from a singly linked list.; ; Inputs:4#; R3 = Address of two word listhead;E ; Outputs:; C-bit clear:6; R4 = Address of first in chain or only CCB dequeued ; C-bit set:; Queue is emptyo;d; Registers modified:3; R4;- s5$CMQRM::SEC ; Set C-bit just in case queue is emptye1 MOV (R3),R4 ; Get address of first CCB in queueC$ BEQ 40$ ; Return if queue is empty! SAVRG ; Save a registerA110$: MOV R4,R5 ; Copy first CCB in chain addressl; BIT #CS.LST,C.STS(R5) ; Is this the last CCB in the chain?% BNE 20$ ; Yes - update the listheado5 MOV (R5),R4 ; No - get next CCB - is this the last?d' BNE 10$ ; No - loop till end of chainu:20$: MOV (R5),(R3) ; Set address of new first CCB in queue( BNE 30$ ; Branch if queue is not empty' MOV R3,2(R3) ; Otherwise close up list,=30$: CLR (R5) ; Clear link pointer in the last CCB of chain " RESRG ; Restore register40$: RETURN ; Return ,1 .SBTTL $CNV18 - Convert to 18-Bit Unibus AddressT0 .SBTTL $CNV22 - Convert to 22-Bit Q-bus Address;+,; **-$CNV18-CONVERT TO 18-BIT UNIBUS ADDRESS-; **-$CNV22-CONVERT TO 22-BIT QBUS-22 ADDRESSB;1<; This subroutine is called to convert an address doubleword=; to an 18-bit Unibus virtual addres or a 22-bit Qbus virtual ; addressy;M ; Inputs: ; R2 - Virtual address-; R3 - Relocation bias (physical address/100)l; ; Outputs:*; R2 - Low order 16 bits of Unibus address3; R3 - Bits 16 & 17 of Unibus address in bits 0 & 18;t;- .ENABL LSB.$CNV22:: ; Reference label .IF DF,K$$DAS$ MOV R2,-(SP) ; Save virtual address, TST R3 ; Buffer from exec, or common pool?6 BNE 5$ ; If NE, from common pool - use bias supplied. MOV R2,R3 ; Get virtual in required register CLR R2 ; Set up for left shift3 ASHC #3,R2 ; Shift active page field from virtuald ASL R2 ; Make it a word indexs/ ADD #KDSAR0,R2 ; Calculate D-space APR addressd# MOV (R2),R3 ; Get contents of APRB BR 5$ ; Join common code .ENDC ; DF,K$$DAS$CNV18:: ; Reference label* TST R3 ; Buffer from exec, or comm pool?! BEQ 10$ ; If EQ, it's from execT ; (in the low 16 or 20 K)m2 ; Exec phys addr = virtual addr = unibus addr)6 ADD $PUMR,R3 ; Add starting UMR bias to block address MOV R2,-(SP) ; Save virtual5$:i; BIC #160000,(SP) ; Clear APR selector from virtual addressL" CLR R2 ; Initialize 18 bit value .IF DF R$$EIS* ASHC #6,R2 ; Align as an 18 bit quantity .IFF ; DF R$$EIS .REPT 6 ASL R3 ; Shift low order bitsD4 ROL R2 ; into high order 2 bits for 18-bit value .ENDR .ENDC ; DF R$$EIS8 ADD R3,(SP) ; Add low 16 bits to saved offset in block' ADC R2 ; Add overflow to bits 16 & 17 ) MOV R2,R3 ; Get high order bits into R3U+ MOV (SP)+,R2 ; and low order bits into R2e10$: RETURN ; Return .DSABL LSBl ; .SBTTL $MVTBF - Move from Mapped Buffer to Unmapped Bufferb;+9; **- $MVTBF - MOVE FROM MAPPED BUFFER TO UNMAPPED BUFFERn;y=; This routine is called to move a block of memory (less thant;; 4k words) from a buffer that is currently mapped( (eitherN;; in system dynamic space or in the Comm Buffer Pool) to ansE; unmapped buffer. Note the mapped buffer can not be in the process's,A; space mapped via APR5 since it uses APR5 to map to00cšqpßmæàmçámýfáþfDATA the unmappedb ; buffer.e;0; Calling format:n; JSR R1,$MVTBF ;. ; Inputs:F.; R2 = Virtual address of mapped "from" buffer,; R3 = Number of bytes to move on the stack: ; ----------n1; ! R1 ! Original contents of R1 before calle ; !--------!t<; ! VA ! 16-bit virtual address of unmapped "to" buffer ; !--------!y5; ! BIAS ! Relocation bias of unmapped "to" bufferp ; ---------- ; ; Outputs:D; R2 = Updated address of "from" buffer points to last byte moved +1 ; R3 = Zeroo;e*; Still mapped to "from" buffer via KISAR6;; Registers modified: ; R2 & R3 ;- .ENABL LSBs7$MVTBF::MOV KISAR5,-(SP) ; Save current process mappingo& MOV 6(SP),KISAR5 ; Map to "to" buffer# MOV R1,6(SP) ; Save return addressl/ MOV 4(SP),R1 ; Get "to" buffer virtual addressa6 CMP #140000,R1 ; Is the "to" buffer in the exec pool?< BHI 10$ ; If HI, yes then don't alter the virtual adddress+ SUB #20000,R1 ; Set VA for bias via KISAR5f10$:0 MOVB (R2)+,(R1)+ ; Move buffer a byte at a time SOB R3,10$ ; Loop till donef BR 20$ ; Join common exit code i= .SBTTL $MVFBF - Move from Unmapped Buffer to a Mapped Buffer;;+;; **- $MVFBF - MOVE FROM UNMAPPED BUFFER TO A MAPPED BUFFERu;r=; This routine is called to move a block of memory (less than"A; 4K words) from an unmapped buffer to a buffer that is currentlyhE; mapped (either in system dynamic space or in the Comm Buffer Pool).e@; The routine unmaps the requesting process and uses ARP5 to map ; to the unmapped "from" buffer.;e; Calling format:o; JSR R1,$MVFBF ; ; Inputs:m,; R2 = Virtual address of mapped "to" buffer(; R3 = Number of bytes to move on stack: ; ----------V1; ! R1 ! Original contents of R1 before callh ; !--------!a>; ! VA ! 16-bit virtual address of unmapped "from" buffer ; !--------! 7; ! BIAS ! Relocation bias of unmapped "from" bufferm ; ----------o;n ; Outputs:B; R2 = Updated address of "to" buffer points to last byte moved +1 ; R3 = Zero ;t(; Still mapped to "to" buffer via KISAR6;m; Registers modified: ; R2 & R3s;-7$MVFBF::MOV KISAR5,-(SP) ; Save current process mapping ( MOV 6(SP),KISAR5 ; Map to "from" buffer# MOV R1,6(SP) ; Save return addressR1 MOV 4(SP),R1 ; Get "from" buffer virtual addresst8 CMP #140000,R1 ; Is the "from" buffer in the exec pool?; BHI 15$ ; If hi, yes then don't alter the virtual address + SUB #20000,R1 ; Set VA for bias via KISAR5a15$:0 MOVB (R1)+,(R2)+ ; Move buffer a byte at a time SOB R3,15$ ; Loop till done 20$:+ MOV (SP)+,KISAR5 ; Restore process mapping MOV (SP)+,R1 ; Restore register TST (SP)+ ; Clean up stack RETURN ; Return .DSABL LSB  "' .SBTTL $CALLX - Mapped Subroutine Call ;+5; **-$CALLX-MAPPED SUBROUTINE CALL TO ANOTHER PROCESSt;C; Calling sequence:e; JSR R5,$CALLX (; .WORD
; .RAD50 ;rH; Note that this subroutine assumes that the named process exists in the5; system and does not check if the process is loaded.i;-, .IIF NDF K$$DAS OFS=6 ; Stack offset for R5- .IIF DF K$$DAS OFS=10 ; Stack offset for R5T1$CALLX::MOV $CMPDV,-(SP) ; Save current PDV indexB0 MOV KISAR5,-(SP) ; and current process mapping .IF DF K$$DAS, MOV KINAR5,-(SP) ; Save instruction mapping .ENDC ; DF K$$DAS6 MOV (R5)+,-(SP) ; Save destination subroutine address& SAVRG ; Get 2 free registers) MOV $PDVTA,R1 ; Point to PDV index tablen10$:' MOV (R1)+,R2 ; Get pointer to next PDVo BEQ 10$ ; Ignore zero entriesi) CMP Z.NAM(R2),(R5) ; Do we have a match?e BNE 10$ ; If NE, noD$ TST (R5)+ ; Skip over process name- MOV (R2),KISAR5 ; Map to destination processB .IF DF K$$DAS- MOV (R2),KINAR5 ; Also map instruction spaceD .ENDC ; DF K$$DAS- TST -(R1) ; Back up PDV index table pointer" SUB $PDVTA,R1 ; Compute PDV index MOV R1,$CMPDV ; and save it12 MOV OFS+4(SP),R2 ; Swap old R5 and return address MOV R5,OFS+4(SP) ; ... MOV R2,R5 ; ...o# RESRG ; Restore registerse# CALL @(SP)+ ; Call the s00c¢q#qn´cÚµcÛ¶c�·c›’ubroutineo .IF DF K$$DAS/ MOV (SP)+,KINAR5 ; Restore instruction mapping  .ENDC ; DF K$$DAS+ MOV (SP)+,KISAR5 ; Restore process mappingF- MOV (SP)+,$CMPDV ; Restore current PDV indext RETURND .. .SBTTL $CEACC - Access Block in Extended Pool8 .SBTTL $CECAC - Access Block in Alternate Extended Pool;+); **-$CEACC-ACCESS BLOCK IN EXTENDED POOL 3; **-$CECAC-ACCESS BLOCK IN ALTERNATE EXTENDED POOL ;.?; This subroutine maps to a block in extended single word pool,<; and returns a virtual address to access the block. If theB; $CECAC entry is called, the Extended Pool must already be mapped ; via APR6.R; ; Inputs:c); 2(SP) = Address of block to be accessedu8; KISAR6 mapped to alternate Extended Pool Base ($CECAC); ; OUTPUTS:); 2(SP) = VIRTUAL ADDRESS OF MAPPED BLOCKr;e; Note: ?; KISAR6 always mapped into Extended Pool on exit even if block- ; is in DSR.;-7$CEACC::MOV $XBIAS,KISAR6 ; Map to base address of poolc6$CECAC::BIT #1,2(SP) ; Is the block in Extended Pool ?- BEQ 100$ ; If EQ, no - already mapped to itC SAVRG ; Else, save R0" MOV 4(SP),R0 ; Copy block address+ BIC #177701,4(SP) ; Return virtual addressb. BIS #140000,4(SP) ; ... mapped through KISAR6 .IF DF R$$EIS ASH #-6,R0 .IFF ; DF R$$EISP .REPT 6( ROR R0 ; Convert address to block bias .ENDR .ENDC ; DF R$$EIS' BIC #176000,R0 ; Clear extraneous bitsi+ ADD R0,KISAR6 ; ... update to proper block  RESRG ; Restore R0C100$:I RETURN ; Return to the caller * .SBTTL $PDVID - Process Name to PDV Index;+(; **- $PDVID - PROCESS NAME TO PDV INDEX;SG; This subroutine maps a process name (up to three characters in RAD50); into a PDV index..;m ; Inputs:g; R2 = Process name (RAD50)A;# ; Outputs:; R2 = PDV Index;-'$PDVID::SAVRG ; Save registersi1 MOV $PDVTA,R0 ; Get address of PDV address table 6 MOV $PDVNM,-(SP) ; Get total number of PDVs in system10$:" MOV (R0)+,R1 ; Get address of PDV/ BEQ 15$ ; Process not loaded - go to next oneB, CMP Z.NAM(R1),R2 ; Does process name match?$ BEQ 20$ ; Yes - go calculate index15$:, DEC (SP) ; Decrement count - done looping? BNE 10$ ; If NE, no0 SEC ; Yes - no match BR 25$ ; Return with C-bit set20$:7 MOV R0,R2 ; Get current position in PDV address tableR3 SUB $PDVTA,R2 ; Subtract starting address of tabled# TST -(R2) ; Get PROCESS pdv indexN25$:3 INC (SP)+ ; Clean up stack and don't change C-bit0# RESRG ; Restore registers  RETURN ; Return g" .SBTTL $CEMUL - Unsigned Multiply;+ ; **- $CEMUL - UNSIGNED MULTIPLY; K; This subroutine performs unsigned multiplication where the result is lessEJ; than 16 bits. It is included here so that we can conditionalise the code; for extended instruction set.n;oF; Note that it is the callers responsibility to ensure that the result; will fit in 16 bits.;e ; Inputs:d; R0 = MultiplierC; R1 = Multiplicanda;a ; Outputs:; R0 = Corrupted; R1 = Low 16 bits of result;-$CEMUL:: .IF DF R$$EIS$ MUL R0,R1 ; Perform multiplication RETURN- .IFF ; DF R$$EIS ) CALLR $MUL ; Call exec multiply routinep .ENDC ; DF R$$EIS l" .SBTTL $CEDIV - Unsigned Division;+ ; **- $CEDIV - UNSIGNED DIVISION; L; This subroutine performs unsigned division where the results are less thanI; 16 bits. it is included here so that we can conditionalise the code foru; extended instruction set.1;ML; Note that it is the callers responsibility to ensure that the results will; fit in 16 bits.F; ; Inputs:L; R0 = Dividend ; R1 = Divisor;T ; Outputs:; R0 = QuotientC; R1 = Remainder;-$CEDIV:: .IF DF R$$EIS MOV R1,-(SP) ; Save divisor MOV R0,R1 ; Set up dividend CLR R0 ; Clear high order word$ DIV (SP)+,R0 ; Perform the division RETURNe .IFF ; DF R$$EIS ' CALLR $DIV ; Call exec divide routineh .ENDC ; DF R$$EIS e .IF DF M$$PRO- .SBTTL $MPLCK - Multi-Processor Lock Routinet;+(; **-$MPLCK-MULTI-PROCESSOR LOCK ROUTINE; F; This routine will perform a spin lock on the C00cªqd¬qßmæàmçámýfáþfDATAomm Exec Lock ($CRESL)E; and then co-call the caller. On return it will unlock the Comm ExecCD; lock and return. Note that we perform the lock operation ourselves0; so that we can correctly manipulate the cache.;-'$MPLCK::ASRB $CRESL ; Spin on the lock$ BCC $MPLCK ; until we have access. CACHE$ FLUSH ; Flush the cache of stale data' CALL @(SP)+ ; Co-call the caller backo MOVB #1,$CRESL ; Reset the lock RETURNR S3 .SBTTL $MPSAV - Bypass Cache with Save and Restorep;+.; **-$MPSAV-BYPASS CACHE WITH SAVE AND RESTORE;aB; This routine will save the current state of the cache and bypass@; it before co-calling the caller. On return it will restore the; initial state of the cache.h;-2$MPSAV::CACHE$ SAVE ; Save current state of cache" CALL @2(SP) ; Co-call the caller( MOV (SP)+,2(SP) ; Overwrite return link# CACHE$ UNSAVE ; Restore the cachel RETURN .ENDC ; DF M$$PRO-$CEXND:: ; For release of CEX space to DSR.p .ENDC ; DF M$$NET .ENDrep;+.; **-$MPSA .TITLE DRATX$ .IDENT /09.03/F ;$,; COPYRIGHT (C) 1974, 1978, 1979, 1980, 1981/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.A;-A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDO9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.M;C; VERSION 08.04.;D; D. N. CUTLER 31-AUG-73;,+; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:N;;; J. M. LAWLER; T. M. MARTIN; B. S. MCCARTHY; ; MODIFIED BY:;P ; B. S. MCCARTHY 30-MAY-84 09.01;0*; BM309 -- REMOVE REFERENCES TO $HEADR TO; STREAMLINE CODE$; ; B. S. MCCARTHY 15-JUN-84 09.02; !; BM309 -- CORRECT TYPO IN ABOVEO;M ; B. S. MCCARTHY 16-OCT-84 09.03;S'; BM321 -- ANOTHER CORRECTION TO ABOVEE;E; MACRO LIBRARY CALLSR;C# .MCALL ABODF$,HDRDF$,HWDDF$,TCBDF$" ABODF$ ;DEFINE TASK ABORT CODES% HDRDF$ ;DEFINE TASK HEADER OFFSETSP$ HWDDF$ ;DEFINE HARDWARE REGISTERS, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;+; **-$DRATX-AST SERVICE EXIT;-F; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TERMINATE THE EXECUTION OF ANH; ASYNCHRONOUS SYSTEM TRAP SERVICE ROUTINE. IF ANOTHER AST IS QUEUED ANDD; AST'S ARE NOT DISABLED, THEN THE NEXT AST IS EFFECTED IMMEDIATELY.; ; DPB FORMAT:B;E#; WD. 00 -- DIC(115.),DPB SIZE(1.)..;L&; AT ISSUANCE THE TASK STACK CONTAINS:;D.; 14(SP)=EVENT FLAG MASK WORD FOR FLAGS 1.-16./; 12(SP)=EVENT FLAG MASK WORD FOR FLAGS 17.-32.E/; 10(SP)=EVENT FLAG MASK WORD FOR FLAGS 33.-48./; 06(SP)=EVENT FLAG MASK WORD FOR FLAGS 49.-64.R; 04(SP)=PRE AST TASK PS. ; 02(SP)=PRE AST TASK PC.O,; 00(SP)=PRE AST TASK DIRECTIVE STATUS WORD.; ; INPUTS:A;I9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.S+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.E/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.I,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;E:; OUTPUTS: (DIRECTIVE STATUS AND PS WORD RETURNED TO TASK);R-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.W1; DIRECTIVE STATUS OF PRE AST STATE IS RETURNED.R; C=1 IF DIRECTIVE IS REJECTED.E<; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE DIRECTIVE1; WAS NOT EXECUTED FROM AN AST SERVICE ROUTINE.2;D?; NOTE: IF AN ADDRESS CHECK FAILURE OCCURS WHILE REMOVING ARGU-O6; MENTS FROM THE TASK STACK, THEN THE ISSUING TASK IS ; ABORTED.R;- 54$DRATX::MOV (R2),-(SP) ;DIRECTIVE EXECUTED FROM AST? BPL 10$ ;IF PL NOA> BIC #^C*2>>,(SP) ;ISOLATE BITS* BIC (SP),(R2) ;CLEAR AST IN PROGRESS FLAG- ASR (SP) ;SET UP TASK'S CURRENT STATUS BITS ' BISB (SP)+,(R2) ;RESTORE PRE AST STATE0' BIT #T2.STP,(R2) ;WAS TASK STOPPED? O BEQ 5$ ;IF EQ NO$ MOV T.PCB(R5),R0 ;POINT TO TASK PCB( CALL $NXTSK ;REALLOCATE TASK PARTITION$5$: MFPI SP ;GET USER STACK POINTER% MOV (SP)+,R0 ;RETRIEVE STACK POINTERD ADD #2,R0 ;STEP OVER DPB WORDR- MOV #7*2,R1 ;SET NUMBER OF BYTES TO CHECK $- CALL $ACHCK ;ADDRESS CHECK TASK STACK WORDS2& BCS 20$ ;IF CS ADDRESS CHECK FAILURE .IF DF X$$HDR4 MOV H.EFSV(R4),-(SP) ;SAVE WAITFOR MASK FROM HEADER .IFTF* CALL $RELOM00d²qeµqn´cÚµcÛ¶c�·c›’ ;RELOCATE AND MAP TASK STACK .IFT 0 MOV (R0)+,4(SP) ;SET DIRECTIVE STATUS TO RETURN R .IFFP0 MOV (R0)+,2(SP) ;SET DIRECTIVE STATUS TO RETURN .ENDC& MOV #$UMPC,R3 ;POINT TO SAVED USER PC$ MOV (R0)+,(R3)+ ;RESTORE PRE AST PC# MOV (R0)+,(R3) ;RESTORE PRE AST PS,0 MOV (R0)+,T.EFLM(R5) ;RESTORE WAITFOR MASK WORD) MFPI SP ;RETRIEVE CURRENT STACK POINTER$ I S .IF DF S$$LIB U- BIS #PMODE,PS ;ASSUME RETURNING TO USER MODES; BIS #CSMODE!PSMODE,(R3) ;FORCE RETURN PS TO AT LEAST SUPERC! BMI 9$ ;IF MI RETURN PS IS USER) TSTB $SUPFL ;TASK USE SUPERVISOR MODE ?  BNE 9$ ;IF NE YES, OKV .ENDC ; DF S$$LIB V5 BIS #CMODE!PMODE,(R3) ;MAKE SURE BOTH MODES ARE USER &9$: ADD #16,(SP) ;ADJUST STACK POINTER MTPI SP ;WRITE IT BACK* BIC #PR7,(R3) ;MAKE SURE PRIORITY IS ZERO 5 .IF DF X$$HDR5 MOV (SP)+,T.EFLM+2(R5) ;RESTORE WAITFOR MASK ADDRESS* MOV $SAHDB,KISAR6 ;RESTORE HEADER MAPPING .IFFT: MOV H.EFSV(R4),T.EFLM+2(R5) ;RESTORE WAITFOR MASK ADDRESS O .ENDC3 CALLR $SETRT ;FORCE A REDISPATCHING OF PROCESSOR P(10$: DRSTS D.RS80 ;SET DIRECTIVE STATUS&20$: MOV #S.CAST,R0 ;SET AST ABORT " CALLR $ABCTK ;ABORT CURRENT TASK S .ENDER &9$: ADD #16,(SP) ;ADJUST STACK POINTER MTPI SP ;WRITE IT BACK* BIC #PR7,(R3) ;MAKE SURE PRIORITY IS ZERO 5 .IF DF X$$HDR5 MOV (SP)+,T.EFLM+2(R5) ;RESTORE WAITFOR MASK ADDRESS* MOV $SAHDB,KISAR6 ;RESTORE HEADER MAPPING .IFFT: MOV H.EFSV(R4),T.EFLM+2(R5) ;RESTORE WAITFOR MASK ADDRESS O .ENDC .TITLE INITL) .IDENT /16.02/N;; COPYRIGHT (C) 1987$; BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;$>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;P ; D. N. CUTLER 23-AUG-73 ;S- ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY: ;.; B. S. MCCARTHY; P. J. BEZEREDI; -; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:; ; J. W. BERZLE; J. M. LAWLER; B. S. MCCARTHY; M. PETTENGILL; J. G. WEHNER; P. K. M. WEISS;; MODIFIED BY:;C"; B. S. MCCARTHY 21-OCT-86 16.00;$&; BM376 -- FIX PRO ASSEMBLY PROBLEM;N"; B. S. MCCARTHY 27-OCT-86 16.01; +; BM374 -- ADD LAT APPLICATIONS TERMINAL; DISCONNECT CALL;3; J. W. BERZLE 8-NOV-86 16.02P;E,; JWB187 -- ADD CONDITIONALS FOR LAT CALL; "; L. B. MCCULLEY 29-DEC-87 15.11;P,; LBM050 -- SET HF.SWR PROPERLY FOR DRGSS;.!; L. B. MCCULLEY 3-FEB-87 15.12 ; 8; LBM057 -- FIX LBM050 PROBLEM WITH HARDWARE SUBTLETY;IC; MACRO LIBRARY CALLS D;TEF .MCALL HWDDF$&G HWDDF$ ;DEFINE HARDWARE REGISTERSHI;J; MACRO DEFINITIONSCK;1LM .MACRO BREAK TYPENOP .IF DF X$$DBTQ R .WORD 3ST .IFFUV HALTWWX .ENDCYZ[ .IF IDN ,D\ ] BR .-2O^_ .ENDC`ab .ENDMcde;7)f; INITIALIZE PROPER BIT SETTING FOR SR3Pg;Fh"iS3$BTS==0 ;INIT TO NO BITS SETjkl .IF DF M$$EXTm7nS3$BTS==S3$BTS!60 ;ENABLE 22 BIT MODE AND UNIBUS MAPAop .ENDCqrs .IF DF K$$DASt*uS3$BTS==S3$BTS!4 ;ENABLE KERNEL D SPACEvw .ENDCxyz .IF DF S$$LIB{.|S3$BTS==S3$BTS!2 ;ENABLE SUPERVISOR D SPACE}~ .ENDC€� .IF DF U$$DAS‚(ƒ S3$BTS==S3$BTS!1 ;ENABLE USER D SPACE„… .ENDC ; DF U$$DAS†‡ˆ;‰; LOCAL DATAŠ;"‹; SYSTEM IDENTIFICATION MESSAGESŒ; �Ž � .NLIST BEX32�SYSMG: .ASCII <15><177><177><12>/ V/‘SYSVR: .ASCII / BL/"’SYSID: .ASCIZ / /<15><12><12>9“MESS0: .ASCIZ /Directive partition not fixed in memory/32”$MESS1::.ASCIZ /Executive data space not loaded/7•MESS2: .ASCIZ /No CPU partition created in MP system/V9–MESS3: .ASCII /Boot device not found in system tables:/— .BYTE 15,177,177,124˜ .ASCII /R0=device type (ASCII)/<15><177><177><12>5™ .ASCII /R1=Physical unit number/<15><177><177><12>Gš .ASCII /R2=CSR address/›œ� .IF DF M$$PROž,00eºq¬qßmæàmçámýfáþfDATAŸ .ASCIZ <15><177><177><12>/R3=CPU ordinal/ ¡ .IFFY¢ £ .BYTE 0¤¥ .ENDC¦§¨ .EVEN©MESS4: .ASCII /Device /ªXX: .ASCIZ /XX -- /1#«MESS5: .ASCIZ /Driver not loaded/a9¬MESS6: .ASCIZ /Driver does not support controller type/m-­MESS7: .ASCIZ /Vector address above V$$CTR/y ®MESS10: .ASCIZ /Vector in use/,¯MESS11: .ASCIZ /Unibus run not accessible/6°MESS12: .ASCIZ /Driver didn't return control after /)±MESS13: .ASCIZ /controller online call/#²MESS14: .ASCIZ /unit online call/ G³MESS15: .ASCIZ /Driver error -- If DEC driver, please submit an SPR!/.´ .EVENµMESS16: .ASCII / controller /v¶UU: .ASCIZ /UUAANN:/#·MESS17: .ASCIZ /error code in R1/o¸MESS20: .ASCIZ /Unit /&¹MESS21: .ASCIZ / didn't come online/!ºFILL: .ASCIZ <15><177><177><12>b"»MESS22: .ASCIZ /Fatal error -- /6¼MESS23: .ASCIZ /Secondary pool not created with VMR/½MESS24: .ASCIZ /Warning -- /D¾MESS25: .ASCII /Crash device not found in system tables:/<15><177>=¿ .ASCII <177><12>/R0=device type (ASCII)/<15><177><177><12>e;À .ASCII /R1=logical unit number/<15><177><177><12>/Enter/E:Á .ASCII / CSR address in R2, physical unit number in R1/" .ASCII <15><177><177><12>/and /ÃÄÅ .IF DF X$$DBTÆÇ .ASCII /type P/ÈÉ .IFFÊË .ASCII /hit continue/ÌÍ .ENDCÎÏ7ÐNULL: .BYTE 0 ;NOTE -- THIS MUST FOLLOW PREVIOUS TEXTe(ÑCTLET: .ASCII /ABCDEFHJKLMNPRSTUVWXYZ/Ò .EVENÓÔ;C:Õ; TABLE OF ERROR MESSAGES INDEXED BY GETVEC INITIAL CODEÖ; רGETERR: .WORD MESS5SÙ .WORD MESS6Ú .WORD MESS7Û .WORD MESS10nÜ .WORD MESS117ÝPROMT: .ASCIZ <15><12>/>/ ; Þ .EVENßà;p1á; DATA AREA FOR DATA-SPACE INITIALIZATION TABLE>â;aã; FORMAT OF THE TABLE IS:Tä;0å; DTBL: .WORD ADDRESS ;ADDRESS FOR NEXT VALUE.æ; .WORD DATA ;DATA TO PLUG AT ABOVE ADDRESSç;Nè; .é; .ê; .ë;X7ì; .WORD 0 ;ZERO IN ADDRESS POSITION TERMINATES TABLEí;Cîïð .IF DF K$$DASñòDTBL: ;REFERENCE LABELEóôõ .IF DF M$$PROö9÷ .WORD $IITBX ;INTERPROCESSOR INTERRUPT COMMON INT TBL.(ø .WORD $IIINT ;IIST INTERRUPT ADDRESS;ù .WORD $IITBX+CI.PWF ;IIST COMMON INT TBL POWERFAIL ENTRYZ,ú .WORD $IIPWF ;ENTRY POINT IN IIST MODULEûü .ENDCýþÿ .IF DF R$$HDV3 .WORD $RHTBX ;RH COMMON INTERRUPT TABLE ADDRESSE, .WORD $RHALT ;RH COMMON INTERRUT ADDRESS9 .WORD $RHTBX+CI.KRB ;RH COMMON CONTROLLER ONLINE ENTRYL7 .WORD $RHKRB ;ADDRESS OF RH CONTROLLER ONLINE ENTRYE1 .WORD $RHTBX+CI.PWF ;RH COMMON POWERFAIL ENTRY$/ .WORD $RHPWF ;ADDRESS OF RH POWERFAIL ENTRY1 .WORD $RHTBX+CI.CSR ;ADDRESS OF CSR TEST ENTRY$# .WORD $RHCSR ;RH CSR TEST ENTRYE   .ENDC    .IF DF R$$6113 .WORD $DMTBX ;DM COMMON INTERRUPT TABLE ADDRESSV- .WORD $DMALT ;DM COMMON INTERRUPT ADDRESSL: .WORD $DMTBX+CI.KRB ;DM CONTROLLER ONLINE/OFFLINE ENTRY- .WORD $DMKRB ;DM CONTROLLER ENTRY ADDRESSN5 .WORD $DMTBX+CI.PWF ;DM CONTROLLER POWERFAIL ENTRYL1 .WORD $DMPWF ;DM CONTROLLER POWERFAIL ADDRESSF6 .WORD $DMTBX+CI.CSR ;DM CONTROLLER CSR TEST ADDRESS" .WORD $DMCSR ;CSR TEST ADDRESS .ENDC; KERNEL AST TABLE ENTRIES1; KEEP THIS TABLE IN SYNCH WITH $KATBL IN SYSCM.0 .WORD $KATBL+00,$FINBF ;AK.BUF - BUFFERED I/O2  .WORD $KATBL+02,$FINXT ;AK.OCB - OFFSPRING EXIT8! .WORD $KATBL+04,$GENBF ;AK.GBI - GENERAL BUFFERED I/O5" .WORD $KATBL+06,$DBTRP ;AK.TBT - FORCED T-BIT TRAPB5# .WORD $KATBL+10,$FINDI ;AK.DIO - DELAYED I/O COMP.W5$ .WORD $KATBL+12,$GGFRN ;AK.GGF - GRP. GBL. RUNDWN.I%&&; SPM VECTOR FOR ACP HOOKPOINT ENTRY'( .WORD $SPV01A) .WORD $SPVEXN* +; AND LOADER HOOKPOINT ENTRIES,- .WORD $SPV02 . .WORD $SPVEXT/ .WORD $SPV03.0 .WORD $SPVEXA0; ; BM37400; LAT DISCONNECT CALL ENTRY POINT ; BM3740; ; BM374%0 .IF DF M$$NET&T$$LTH ; BM374 0 ; BM374D0 .WORD $LTEEP ; BM3740 .WORD $SPVEX ; BM3740 ; BM374E(0 .ENDC ; DF M$$NET&T$$LTH ; BM300eÂqµqn´cÚµcÛ¶c�·c›’740 ; BM374 12 .WORD 0 ;END OF TABLER34 .ENDC567;28; TEMPORARY STORAGE AREA FOR $SYSIZ INFORMATION.9; (K$$DAS SYSTEMS ONLY).:;$;<= .IF DF K$$DAS>-?$SYALT::.WORD 0,0,0,0,0 ;STORAGE FOR $SYSIZB@A .ENDCBC D .LIST BEXEFG .IF DF R$$PROH; 7I; THIS ROUTINE IS TAKEN FROM THE MODULE POWER. IT IS <J; HERE BECAUSE THE EXEC HAS NO POWER FAIL CODE OF ITS OWN.K; L?M$POWER: CALL $DRDSE ;ALWAYS DECLARE SIG. EVENT AT CPU PWRUP.3N MOV #$SCDVT,-(SP))O30$: CALL @(SP)+ ;GET NEXT UCB ADDRESS.P BCC 40$ ;IF CC GOT ONE'Q CLRB $PWRFL ;CPU POWERFAIL COMPLETE. R35$: RETURNYS)T40$: MOV #30$,-(SP) ;SET RETURN ADDRESS2U BITB #US.OFL,U.ST2(R5) ;DEVICE IN CONFIGURATION*V BNE 35$ ;IF NE DEVICE IS NOT IN CONFIG$W MOV S.KRB(R4),R2 ;GET KRB ADDRESS!X BEQ 45$ ;IF EQ NO KRB ADDRESST4Y44$: BIT #KS.OFL,K.STS(R2) ;IS CONTROLLER OFFLINE?Z BNE 35$ ;IF NE YESB[45$: BITB #UC.PWF,U.CTL(R5) ;CALL DRIVER REGARDLESS OF ACTIVITY?\ BNE 50$ ;IF NE YES"] TSTB U.STS(R5) ;IS UNIT ACTIVE?^ BPL 35$ ;IF PL NOG=_50$: MOV D.DSP(R3),R2 ;GET ADDRESS OF DRIVER DISPATCH TABLEY$` BEQ 35$ ;IF EQ DRIVER NOT LOADED0a CALLR $LDPWF ;CALL DRIVER AT POWERFAIL ENTRYbc .ENDC ; DF R$$PROde;+%f; **-$INITL-SYSTEM TRANSFER ADDRESSRg;TLh; THIS ROUTINE CONTAINS THE TRANSFER POINT OF THE RESIDENT EXECUTIVE. WHENLi; THE SYSTEM IS BOOTED, CONTROL IS TRANSFERED HERE TO INITIALIZE AND STARTj; UP THE SYSTEMRk;-l"m$INITL::RESET ;RESET PROCESSOR-n MOV R0,@#46 ;SAVE BOOT DEVICE CSR ADDRESSI9o MOV #$SYALT+2,R0 ;POINT TO SYSTEM CONFIGURATION VECTORS"p MOVB R3,(R0)+ ;SAVE UNIT NUMBER(q MOVB R1,(R0)+ ;SAVE LBN OF LOAD IMAGEr MOV R2,(R0)+ ;T!s MOV R4,(R0)+ ;SAVE DEVICE NAME)t MOV R5,(R0)+ ;SAVE LENGTH OF LOAD FILEuvw .IF DF M$$PROx+y JMP $PENT ;USE COMMON CODE IF AVAILABLEEz{ .IFFH|};~ MOV #PMODE+PR7,PS ;SET MODE BITS AND LOCK OUT INTERRUPTST. MOV #$STACK-20,SP ;SETUP EXEC STACK POINTER4€ MOV #KINAR0,R5 ;INIT POINTER TO MAPPING REGISTERS&� CLR R1 ;INIT I SPACE MEMORY OFFSET‚ƒ„ .IF DF K$$DAS…,† MOV $SCMOF,R2 ;INIT D SPACE MEMORY OFFSET‡ BNE 3$ ;IF NE FOUND IT4ˆ MOV #$MESS1,R4 ;SPECIFY MESSAGE TO TYPE ON CONSOL/‰ CALL $FATAL ;PREFACE WITH FATAL DESIGNATIONL1Š BREAK FATAL ;IF D SPACE NOT LOADED HANG IT UPE0‹3$: SUB #200,R2 ;ADJUST TO BE RIGHT FOR APR 1Œ� .IFTFŽ�5$: ;REFERENCE LABELO�‘ .IFTT’2“ MOV #77406,KDSDR0-KINAR0(R5) ;SET D SPACE 4K RW3” MOV R2,KDSAR0-KINAR0(R5) ;SET D SPACE APR OFFSETR1• ADD #200,R2 ;ADVANCE D SPACE APR OFFSET BY 4K 2– MOV #77402,KINDR0-KINAR0(R5) ;SET I SPACE 4K RO—˜ .IFF3™2š MOV #77406,KINDR0-KINAR0(R5) ;SET I SPACE 4K RW›œ .IFTF�'ž MOV R1,(R5)+ ;SET I SPACE APR OFFSETN'Ÿ ADD #200,R1 ;ADVANCE I SPACE OFFSETO  CMP R5,#KINAR7 ;DONE YET?¡ BLOS 5$ ;IF LOS NO.¢ MOV #177600,KISAR7 ;SET UP I/O PAGE MAPPING£¤ .IFT¥'¦ CLR (R5) ;CLEAR D SPACE APR0 OFFSET5§¨ .ENDC©ª« .IF DF K$$DAS!M$$EXT!S$$LIB¬­ MOV #S3$BTS,SR3 ;SET UP SR3®¯ .ENDC°±² INC SR0 ;ENABLE MAPPING,³´ .ENDCµ¶·;AE¸; IN A D-SPACE SYSTEM SET UP SPECIAL WORDS IN D-SPACE THAT CAN'T BEE¹; LINKED AT TASK BUILD TIME.º;R»¼$INITM:: ;REFERENCE LABELD½¾¿ .IF DF P$$OOLÀ8Á MOV $PLPAR,R0 ;LOCATE PCB OF SECONDARY POOL PARTITION! BNE 502$ ;IF NE, THERE IS ONE 5à MOV #MESS23,R4 ;SPECIFIY MESSAGE TO TYPE ON CONSOLP/Ä CALL $FATAL ;PREFACE WITH FATAL DESIGNATION 6Å BREAK FATAL ;VMR HAS NOT SET UP SECONDARY POOL PARÆ502$: ;REF LABELÇÈ .ENDCÉÊË .IF DF D$$PARÌ1Í TST $DRAPR ;IS THE DIRECTIVE PARTITION FIXED?LÎ BNE 505$ ;IF NE YESN4Ï MOV #MESS0,R4 ;SPECIFY MESSAGE TO TYPE ON CONSOLE/Ð CALL $FATAL ;PREFACE WITH FATAL DESIGNATIONO5Ñ BREAK FATAL ;DIRECTIVE PARTITION NOT FIXED IN MEMPÒ505$: ;REFERENCE SYMBOLÓÔ .ENDCÕÖ×;S2Ø; INITIALIZE THE POOL MONITOR CONTROL STRUCTURE.Ù00eÊq¬qßmæàmçámýfáþfDATA;LÚÛ .IF DF P$$CTLÜ7Ý MOV $CRAVL,R0 ;GET POINTER TO SECOND FREE POOL BLOCKO#Þ CLR R1 ;INITIALIZE SIZE COUNTER3ß507$: ADD 2(R0),R1 ;ADD LENGTH OF FREE POOL BLOCK;6à MOV (R0),R0 ;POINT TO NEXT FREE POOL BLOCK IN LIST á BNE 507$ ;IF NE THERE IS ONE4â MOV R1,$PRISZ ;STORE IT AWAY FOR THE POOL MONITOR/ã CLR $POLST ;INITIALIZE EXEC/POOL TASK FLAGSPäå .ENDCæç .IF DF K$$DASè+é MOV #DTBL,R0 ;SET UP TABLE START ADDRESS.ê6$: MOV (R0)+,R1 ;GET ADDRESS FOR NEXT ENTRYë BEQ 7$ ;IF EQ END OF TABLE)ì MOV (R0)+,(R1) ;STUFF VALUE AT ADDRESS í BR 6$ ;GO BACK FOR MORE;îï .ENDCðñò;*ó; HAS VMR SET UP THE PER CPU PARTITIONS?ô;;õ=ö7$: MOV @#46,$TEMP0 ;PUT CSR ADDR WHERE WE CAN GET IT LATER7÷øù .IF DF M$$PROúûü .IF GT M$$PRO-1ý,þ TST $CPPAR ;HAS VMR SET UP CPU PARTITIONÿ BNE 8$ ;IF NE YES3 MOV #MESS2,R4 ;SPECIFY MESSAGE TO TYPE ON CONSOLR/ CALL $FATAL ;PREFACE WITH FATAL DESIGNATION1* BREAK FATAL ;CPU PARTITIONS NOT SET UP8$: ;REFERENCE LABEL0 .ENDC;RJ ; IF THIS IS A I+D SPACE SYSTEM, WE MUST TRANSFER THE $SYSIZ INFORMATIONG ; FROM THE AREA IN LOW MEMORY WHERE WE HAVE SAVED IT TO SYSCM, MAPPEDA ; IN DATA SPACE. ;A  .IFTF .IF DF K$$DAS% MOV #$SYALT+2,R0 ;SET FROM ADDRESS # MOV #$SYSIZ+2,R1 ;SET TO ADDRESS;" MOV (R0)+,(R1)+ ;MOVE ALL WORDS MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ MOV (R0)+,(R1)+ .ENDC .IFTT% MOV #TYPMSG,R5 ;SET RETURN ADDRESSE3  JMP $MAPCP ;SET UP MAPPING FOR KDSAR0 AND UBMAPI!" .IFFA#$%& .IF DF M$$EXT',( MOV #$DIRXT,-(SP) ;SETUP EXIT FROM $SGFIN6) CALL $SGFIN ;CATCH MEMORY FAULTS AND SET CARRY BIT6* CLR @#CPUERR ;CLEAR CPU ERROR REGISTER IF IT EXISTS3+ MOV #UBMPR,R0 ;POINT TO FIRST UNIBUS MAPPING REGS%, BIC #HF.UBM,$HFMSK ;ASSUME NO UMRS+- TST (R0) ;UMRS PRESENT?V. BCS INTRO ;IF CS NO UMRS5/ BIS #HF.UBM,$HFMSK ;INDICATE THAT UMRS ARE PRESENT012 .IF DF K$$DAS3,4 CLR (R0)+ ;CLEAR FIRST UMR REGISTER PAIR5 CLR (R0)+ ;A-6 MOV $SCMOF,R3 ;PICKUP OFFSET TO DATA SPACE7 CLR R2 ;SET FOR CONVERSION28 ASHC #6,R2 ;CONVERT TO DOUBLE WORD BYTE OFFSET(9 MOV #4,R1 ;SET COUNT OF UMRS TO LOAD0:11$: MOV R3,(R0)+ ;LOAD LOW 16 BITS OF ADDRESS,; MOV R2,(R0)+ ;LOAD HIGH 6 BITS OF ADDRESS*< ADD #20000,R3 ;BUMP ADDRESS BY 4K WORDS= ADC R2 ;...V> SOB R1,11$ ;LOOP? BR INTRO ;@A .IFFSBC'D CLR R1 ;SET INITIAL ADDRESS TO ZEROF4E MOV #5.,R2 ;SET NUMBER OF REGISTER PAIRS TO LOAD0F11$: MOV R1,(R0)+ ;LOAD LOW 16 BITS OF ADDRESS+G CLR (R0)+ ;CLEAR HIGH 6 BITS OF ADDRESSO"H ADD #20000,R1 ;ADVANCE 8K BYTESI SOB R2,11$ ;LOOPJ BR INTRO ;KL .ENDCMNO .ENDCPQR .ENDCST4UTYPMSG: MOV #$DIRXT,-(SP) ;SET UP EXIT FROM $SGFIN6V CALL $SGFIN ;CATCH MEMORY FAULTS AND SET CARRY BIT6W CLR @#CPUERR ;CLEAR CPU ERROR REGISTER IF IT EXISTS-XINTRO: MOV #$SYTYP,R0 ;POINT TO SYSTEM TYPE 5Y MOV #SYSMG+4,R1 ;POINT INTO IDENTIFICATION MESSAGER%Z MOV (R0)+,(R1)+ ;MOVE INTO MESSAGEA[ MOV (R0)+,(R1)+ ;...\ MOV (R0)+,(R1)+ ;... ] MOV (R0)+,(R1)+ ;...D^ MOV (R0)+,(R1)+ ;...T_ MOV (R0)+,(R1)+ ;...1` MOV #$VERSN,R0 ;POINT TO SYSTEM VERSION NUMBER3a MOV #SYSVR,R1 ;POINT INTO IDENTIFICATION MESSAGET%b MOV (R0)+,(R1)+ ;MOVE INTO MESSAGECc MOV (R0)+,(R1)+ ;...T1d MOV #$SYSID,R0 ;POINT TO SYSTEM IDENTIFICATIONE1e MOV #SYSID,R1 ;POINT TO IDENTIFICATION MESSAGEY;f MOV (R0)+,(R1)+ ;MOVE SYSTEM IDENTIFICATION INTO MESSAGESg MOV (R0)+,(R1)+ ;0h JSR R5,OPMSG ;TELL EVERYBODY WE'RE ON THE AIRi .WORD SYSMG ;;-j MOV #140000,R0 ;SET INITIAL MEMORY ADDRESS1/k CLR R1 ;ZERO NUMBER OF 32W BLOCKS IN SYSTEMN l MOV #KISAR6,R2 ;POINT TO APR6-m MOV #10000,R3 ;ASSUME UPPER LIMIT OF 128KW n MOV R3,(R2) ;POINT TO 128KWE.o MOV (R1),-(SP) ;SAVE CONTENTS OF LOCATION 0/p MOV (R0),R5 ;SAVE CONTENTS OF LOCATION 128KM4q MOV SP,(R1) ;MOVE NON-ZERO VALUE INTO LOCATION 0,r CLR (R0) ;ATTE00eÒqµqn´cÚµcÛ¶c�·c›’MPT TO ACCESS WORD AT 128K0s TST (R1) ;ADDRESS WRAP-AROUND AT LOCATION 0?-t BEQ 1$ ;IF EQ YES, THIS IS A 128KW SYSTEM 3u MOV #170000,R3 ;NO, UPPER LIMIT CAN BE UP TO 2MW)v1$: MOV R5,(R0) ;RESTORE LOCATION 128KE%w MOV (SP)+,(R1) ;RESTORE LOCATION 0&x CLR (R2) ;SET ZERO RELOCATION BIAS*y2$: TST (R0) ;DOES THIS 1K BLOCK EXIST?%z BCS 14$ ;IF CS NO, NO MEMORY LEFTN1{ ADD #40,R1 ;UPDATE NUMBER OF 32W BLOCKS BY 1KM1| MOV R1,(R2) ;POINT TO NEXT 1K BLOCK OF MEMORYN%} CMP (R2),R3 ;UPPER LIMIT REACHED?D~ BLO 2$ ;IF LO NO614$: MOV R1,$SYSIZ ;SET SIZE OF MEMORY IN 32W BLOCKS€�; $‚; INITIALIZE THE FEATURE MASK BITSƒ;U$„; HF.EIS - SYSTEM HAS EIS HARDWARE/…; HF.FPP - SYSTEM HAS FLOATING POINT HARDWARE(6†; HF.CIS - SYSTEM HAS CIS HARDWARE (DONE BY SAV.TSK)B†; HF.SWR - SYSTEM HAS HARDWARE SWITCH REGISTER PRESENT ;LBM050‡;Nˆ?ˆ BIS #HF.SWR,$HFMSK ; ASSUME SWITCH REGISTER PRESENT ;LBM050M1ˆ MOV @#4,-(SP) ; SAVE TRAP VECTOR 04 ;LBM050NHˆ MOV #TRP10,@#4 ; POINT TRAP VECTOR 04 AT ROUTINE TO SET CARRY ;LBM050=ˆ TST SWR ; TEST SWR - BUS TIMES OUT IF NOT PRESENT ;LBM057THˆ MOV (SP)+,@#4 ; RESTORE TRAP VECTOR 04, LEAVE CARRY UNAFFECTED;LBM050/ˆ BCC 150$ ; READ OK, IT WAS THERE ;LBM050@ˆ BIC #HF.SWR,$HFMSK ; NOT THERE, $SGFIN SET CARRY BIT ;LBM050:ˆ CLR $SWR ; BE NICE, INIT CLEAR SW (SYSCM) SWR ;LBM050ˆ150$: ;LBM0507‰ BIC #HF.CIS,$HFMSK ;SAV.TSK WILL FIGURE THIS ONE OUT42Š BIS #HF.EIS,$HFMSK ;EVERY M-PLUS SYSTEM HAS EIS2‹ MOV @#10,-(SP) ;SAVE ILLEGAL INSTRUCTION VECTORŒ MOV #TRP10,@#10 ;SET VECTOR/� BIS #HF.FPP,$HFMSK ;ASSUME NO FLOATING POINTVŽ CLC ;CLEAR CARRYA-� SETI ;ISSUE A FLOATING POINT INSTRUCTIONB"� BCS 15$ ;IF CS FPP NOT PRESENT'‘ BIC #HF.FPP,$HFMSK ;SHOW FPP PRESENTR’15$: ;REFERENCE LABEL“” .IF DF P$$3XX•/– CLR $HFMSK+2 ;ASSUME NOT BRIDGE, NOT PRO-3XX — MFPT ;GET CPU TYPEF)˜ BCS 152$ ;IF CS NOT A BRIDGE OR A PROU+™ CMPB #3,R0 ;IS THIS A F11 BASED SYSTEM?M'š BEQ 151$ ;IF EQ YES, MAY BE PRO-3XX +› CMPB #5,R0 ;IS THIS A J11 BASED SYSTEM?E%œ BNE 152$ ;IF NE NO, NOT A PRO-3XXF?œ151$: TST @#177750 ;LOOK AT THE MAINTENANCE REGISTER ; BM376N6ž BCS 152$ ;IF CS NOT THERE, CAN'T BE PRO-3XX ;**-1(Ÿ BNE 152$ ;IF NE ISN'T PRO-3XX EITHER=  BIS #H2.PRO,$HFMSK+2 ;SET PRO BIT IN HARDWARE FEATURE MASK$ ¡ BR 153$ ;BACK TO COMMON CODE'¢152$: TST @#176010 ;IS THIS A BRIDGE?1£ BCS 153$ ;IF CS NO/¤ BIS #H2.BRG,$HFMSK+2 ;INDICATE BRIDGE SYSTEMY¥¦ .ENDC ; DF P$$3XX§:¨153$: MOV (SP)+,@#10 ;RESTORE ILLEGAL INSTRUCTION VECTOR©ª« .IF DF M$$PRO¬&­ BIC #MP.STP,@$MPSWT ;CLEAR STOP BIT/® MOV $CPBIT,$URMST ;SET ONLINE PROCESSOR MASK1.¯ MOV $CPBIT,$IIMSK ;SET IIST CONNECTION MASK.° MOV $CPBIT,$CKURM ;WE WILL HANDLE THE CLOCK)± LOCK$ $EXECL,WAIT ;GRAB EXECUTIVE LOCKF²³ .ENDC´µ¶;BG·; SEARCH FOR SYSTEM DEVICE USING CSR ADDRESS AND PHYSICAL UNIT NUMBER G¸; AS KEYS. WHEN IT IS FOUND, SET UNIT AND CONTROLLER ONLINE, AND SETC:¹; UP $SYSIZ VECTOR WITH THE CORRECT LOGICAL UNIT NUMBER.º;T»4¼ CLR .SY0+2 ;CLEAR FLAG THAT WE FOUND SYSTEM DISK3½ MOV #$DEVHD,R5 ;GET ADDRESS OF FIRST DCB ADDRESSI,¾20$: MOV (R5),R5 ;GET ADDRESS OF NEXT DCB%¿ BNE 25$ ;IF NE YES -- KEEP TRYINGU,À MOV .SY0+2,R4 ;HAVE WE FOUND SYSTEM DISK?Á BNE 52$ ;IF NE YES7 MOV #MESS3,R4 ;SPECIFY MESSAGE TO BE TYPED ON CONSOLI/à CALL $FATAL ;PREFACE WITH "FATAL ERROR -- "+Ä MOV $SYSIZ+6,R0 ;PLACE DEVICE NAME IN R0N5Å MOVB $SYSIZ+2,R1 ;PLACE PHYSICAL UNIT NUMBER IN R1 !Æ MOV $TEMP0,R2 ;PLACE CSR IN R2ÇÈÉ .IF DF M$$PROÊ/Ë MOVB $PROCN,R3 ;PLACE PROCESSOR NUMBER IN R3TÌÍ .ENDCÎÏ8Ð BREAK FATAL ;COULD NOT FIND LOAD DEVICE IN THIS SYS.+Ñ25$: MOV D.UCB(R5),R4 ;POINT TO FIRST UCB.(Ò BIT #DV.PSE,U.CW1(R4) ;PSEUDO DEVICE?Ó BNE 20$ ;IF NE YES:Ô MOVB D.UNIT(R5),-(SP) ;SET STARTING LOGICAL UNIT NUMBER=Õ MOVB D.UNIT+1(R5),-(SP) ;CALCULATE NUMBER OF UCB'S TO SCAN;Ö SUB D.UNIT(R5),(SP) ;× INCB (SP) ;R(Ø40$: MOV U00eÚq¬qßmæàmçámýfáþfDATA.SCB(R4),R3 ;GET SCB ADDRESS$Ù MOV S.KRB(R3),R0 ;GET KRB ADDRESS4Ú BEQ 50$ ;IF EQ NO KRB ADDRESS -- NOT SYSTEM DEV.1Û CMP $SYSIZ+6,D.NAM(R5) ;DO DEVICE NAMES MATCH?FÜ BNE 50$ ;IF NE NOO<Ý CMPB $SYSIZ+2,U.UNIT(R4) ;DO PHYSICAL UNIT NUMBERS MATCH?Þ BNE 50$ ;IF NE NOU+ß CMP $TEMP0,(R0) ;DO CSR ADDRESSES MATCH?Yàáâ .IF DF M$$ACDãäå .IF DF M$$PROæ(ç BNE 43$ ;IF NE ADDRESSES DON'T MATCH1è BIT @$CPURM,K.URM(R0) ;IS IT ON THIS PROCESSOR)&é BNE 45$ ;IF NE YES -- USE THIS ONEêë .IFFBì&í BEQ 45$ ;IF EQ YES -- USE THIS ONEîï .ENDCðñò;RHó; THE S.KRB KRB IS NOT THE ONE WE WANT. IF THE DEVICE IS DUAL-ACCESS,Hô; THEN WE WILL SEE IF THE OTHER PORT IS THE ONE TO WHICH WE ARE REALLYõ; CONNECTED.ö;÷-ø43$: MOV #S2.MAD!S2.LDS,R1 ;GET STATUS BITSD<ù BIC S.ST2(R3),R1 ;ARE THEY ALL SET? (IS THIS DUAL-ACCESS)-ú BNE 50$ ;IF NE NO -- NOT DUAL-ACCESS UNITTûü;THý; UNIT IS MULTI-ACCESS, AND WE CAN CONTROL THE VALUE OF S.KRB. CAN WE.þ; FIND THE PORT THRU WHICH WE ARE CONNECTED.ÿ;-+ MOV S.KTB(R3),R0 ;ASSUME THIS IS THE KRBH8 CMP R0,S.KRB(R3) ;IS THIS THE ONE WE ALREADY CHECKED?% BNE 44$ ;IF NE NO -- USE THIS ONET( MOV S.KTB+2(R3),R0 ;USE THE OTHER ONE,44$: CMP $TEMP0,(R0) ;IS THE CSR THE SAME? .IFTF-  BNE 50$ ;IF NE NO -- NO WAY OUT THIS TIMEE    .IF DF M$$PRO 4 BIT @$CPURM,K.URM(R0) ;IS IT ATTACHED TO THIS CPU BEQ 50$ ;IF EQ NOS .ENDC .IFTO( MOV R0,S.KRB(R3) ;SET NEW KRB POINTER .ENDCA45$: BISB #US.VV,U.STS(R4) ;SET VOLUME VALID BIT IN SYS DEV UCB,( MOV R4,.SY0+2 ;REDIRECT SYSTEM DEVICE, MOV R4,.LB0+2 ;REDIRECT SYSTEM DEVICE TOO .IF NDF R$$PROU'  MOV R4,.SP0+2 ;REDIRECT SPOOL DEVICET!" .ENDC ; NDF R$$PROF#<$ MOVB 2(SP),$SYSIZ+2 ;SET LOGICAL UNIT NUMBER OF LOAD DEV.% BR 51$ ;BR OUT OF LOOP.&50$: INCB 2(SP) ;UPDATE LOGICAL UNIT NUMBER3' ADD D.UCBL(R5),R4 ;CALCULATE ADDRESS OF NEXT UCB&( DECB (SP) ;ANY MORE UCB'S TO SCAN?) BNE 40$ ;IF NE YES#*51$: MOV (SP)+,(SP)+ ;CLEAN STACKU+ JMP 20$ ;GO TO NEXT DCB,-;,=.; SCAN CTB LIST TO FIND THE CORRECT CTB FOR THE LOAD DEVICEE/;I>0; A CTB MUST BE FOUND THAT POINTS TO THE CORRECT KRB OR THIS#1; CODE WILL NOT EXECUTE PROPERLY.R2;3,452$: MOV #$CTLST,R5 ;GET START OF CTB LIST!554$: MOV (R5),R5 ;GET NEXT CTB 16 ;THE CTB CONTAINING OUR KRB M U S T EXISTR-7 MOV L.DCB(R5),R2 ;GET DCB POINTER FROM CTBX>8 BITB #LS.CIN,L.STS(R5) ;IS IT A COMMON INTERRUPT CONTROLLER29 BNE 55$ ;IF NE YES -- SEARCH THE TABLE FOR DCB,: CMP R2,U.DCB(R4) ;IS THIS THE CORRECT CTB; BNE 54$ ;IF NE NOC1< BR 65$ ;YES -- CREATE VECTOR FOR THIS KRB/CTB =>;T/?; CONTROLLER IS A COMMON INTERRUPT CONTROLLER @;XA0B55$: TST (R2)+ ;SKIP COMMON INTERRUPT ADDRESS.C60$: TST (R2) ;IS THIS THE END OF THE TABLED BEQ 54$ ;IF EQ YES3E CMP (R2)+,U.DCB(R4) ;DOES THE DCB MATCH OUR DCB?RF BNE 60$ ;IF NE NO GH;B,I; CREATE VECTOR FOR THE SYSTEM LOAD DEVICEJ;TK4L65$: MOV .SY0+2,R3 ;GET UCB ADDRESS OF SYSTEM DISK$M MOV U.SCB(R3),R4 ;GET SCB ADDRESS,N MOV S.KRB(R4),R4 ;GET KRB ADDRESS INTO R45O BIT #KS.SLO,K.STS(R4) ;IS THIS A SLOW CONTROLLER?OP BEQ 70$ ;IF EQ NOT,Q MOV #PMODE,PS ;YES, ALLOW DISK INTERRUPTS7R70$: CALL ONLIN ;CREATE VECTOR AND PUT DEVICE ONLINEI(S MOV #PMODE+PR7,PS ;LOCKOUT INTERRUPTSTU;CV; SET TERMINAL ONLINETW;BXYZ .IF DF M$$PRO[1\ MOVB $PROC2,R0 ;GET PROCESSOR ID AS WORD INDEXT8] MOV $YLCTB(R0),R4 ;GET KRB ADDRESS OF CONSOL TERMINAL7^ MOV K.OWN(R4),R5 ;GET UCB ADDRESS OF CONSOL TERMINALS_ MOV R5,.CO0+2 ;REDIRECT CO:` MOV R5,.CL0+2 ;REDIRECT CL:ab .IFF c$d MOV #.TT0,R5 ;GET TT0 UCB ADDRESS+e MOV #$YLA,R4 ;GET FIRST DL11 KRB ADDRESSEfg .ENDChi,j BIC #U2.LOG,U.CW2(R5) ;SHOW CO: LOGGED IN-k BIS #U2.PRV,U.CW2(R5) ;MAKE CO: PRIVILEGEDC0l MOV #$YLCTB-L.KRB,R5 ;GENERATE YL CTB ADDRESSmn;+o; CREATE VECTOR AND PLACE TERMINAL O00eâqµqn´cÚµcÛ¶c�·c›’NLINERp;Eq$r MOV K.OWN(R4),R3 ;GET UCB ADDRESS s CALL ONLINNtu;V,v; SET UP DUMP DEVICE KRB ADDRESS FOR CRASHw;xyz .IF DF C$$CDA{8| BIT #F4.LCD,$FMASK+6 ;LOADABLE CRASH DRIVER SUPPORT ?+} BEQ 71$ ;IF EQ, NO - DRIVER IS RESIDENTR%~ TST $CRPAR ;CRASH DRIVER LOADED ?.0 BEQ 77$ ;IF EQ, NO - DON'T TEST CRASH DEVICE€71$: ;REFERENCE LABEL�3‚ MOV #$DEVHD,R2 ;GET ADDRESS OF DEVICE TABLE HEADN,ƒ72$: MOV (R2),R2 ;GET ADDRESS OF NEXT DCB„ BNE 73$ ;IF NO, GOT ONER… MOV #MESS25,R4K%† CALL WARN ;SEND MESSAGE TO CONSOLN1‡ CLR -(SP) ;PICK UP TWO BYTE, NON-WORD ALIGNEDF&ˆ MOVB $CRDEV,(SP) ;CRASH DEVICE TYPE*‰ MOVB $CRDEV+1,1(SP) ;AND PLACE ON STACK4Š MOV (SP)+,R0 ;AND THEN INTO R0 FOR PUBLIC VIEWING)‹ MOV $CRSUN,R1 ;GET LOGICAL UNIT NUMBERA'Œ CLR R2 ;CLEAR POTENTIAL CSR ADDRESSS� BREAK1Ž MOV R1,$CRSUN ;GET WHAT IS NOW CONSIDERED AS AD� ;PHYSICAL UNIT NUMBERB6� MOV R2,$CRCSR ;GET THE CSR ADDRESS WHICH USER TYPED ‘ ADD #60,R1 ;CONVERT TO ASCII3’ MOVB R1,$CRUNT ;FILL IN $CRUNT FOR CRASH MESSAGEN!“ BR 77$ ;EXIT CRASH PROCESSINGNH”73$: CMPB D.NAM(R2),$CRDEV ;IS THIS THE DCB FOR THE CRASH DUMP DEVICE?'• BNE 72$ ;NO IF NE, LOOK AT NEXT DCBR9– CMPB D.NAM+1(R2),$CRDEV+1 ;MAYBE, CHECK NEXT CHARACTERE'— BNE 72$ ;NO IF NE, LOOK AT NEXT DCB 6˜ MOV $CRSUN,R1 ;GET CRASH DEVICE LOGICAL UNIT NUMBER3™ MOVB D.UNIT(R2),R0 ;GET LOWEST UNIT FOR THIS DCBM3š CMP R1,R0 ;IS CRASH DEVICE HANDLED BY THIS DCB?R› BLO 72$ ;NO IF LO;?œ CMPB R1,D.UNIT+1(R2) ;MAYBE, CHECK HIGHEST UNIT FOR THIS DCBS� BHI 72$ ;NO IF HIC-ž SUB R0,R1 ;CALCULATE NUMBER OF PROPER UCB;$Ÿ MOV D.UCBL(R2),R0 ;GET UCB LENGTH*  MOV D.UCB(R2),R2 ;GET FIRST UCB ADDRESS+¡74$: DEC R1 ;POINTING TO PROPER UCB YET?K¢ BLT 76$ ;YES IF LT £ ADD R0,R2 ;POINT TO NEXT UCB¤ BR 74$ ;GO AGAIN8¥76$: MOVB U.UNIT(R2),$CRSUN ;SAVE PHYSICAL UNIT NUMBER$¦ MOV U.SCB(R2),R2 ;GET SCB ADDRESS)§ MOV S.KRB(R2),$CRKRB ;SAVE KRB ADDRESSB¨77$:©ª .ENDC ; DF C$$CDA«¬;I­; CREATE VECTOR FOR IIST KRB®;R¯°± .IF DF M$$PRO²³ MOVB $PROC2,R0 ´ MOV $IICTB(R0),R42µ BIT #KS.OFL,K.STS(R4) ;DO WE HAVE ONE OF THESE?¶ BNE 80$ ;IF NE NOF2· MOV #$IICTB-L.KRB,R5 ;GENERATE IIST KRB ADDRESS¸ CLR R3 ;SHOW NO UCB ADDRESST ¹ CALL ONLIN º» .ENDC¼½¾;45¿; SCAN PARITY MEMORY CSR REGISTERS AND CREATE TABLECÀ;IÁ"Â80$: ;UNCONDITIONAL REFERENCEà .IF DF P$$RTYÄ2Å MOV #$PARTB,R0 ;GET ADDRESS OF PARITY CSR TABLE$Æ MOV R0,R1 ;COPY ADDRESS OF TABLE2Ç MOV #1,(R1)+ ;INSERT A ONE IN FIRST TABLE ENTRY+È MOV #$CSRTB,R4 ;GET ADDRESS OF CSR TABLEB3É85$: MOVB (R4)+,R3 ;GET NUMBER OF CSR'S TO SET UPEÊ BEQ 105$ ;IF EQ DONE"Ë CLR R2 ;INITIALIZE CSR ADDRESS'Ì BISB (R4)+,R2 ;CALCULATE CSR ADDRESS)Í SWAB R2 ;GET HIGH BYTE OF CSR ADDRESS-Î BISB (R4)+,R2 ;GET LOW BYTE OF CSR ADDRESS Ï90$: TST (R2) ;CSR PRESENT?Ð BCS 95$ ;IF CS NO!Ñ MOV R2,(R1)+ ;SAVE CSR ADDRESSR Ò BR 100$ ;O1Ó95$: MOV R0,(R1)+ ;POINT TO FIRST WORD OF TABLET%Ô100$: ADD #2,R2 ;POINT TO NEXT CSRF(Õ SOB R3,90$ ;LOOP UNTIL NONE ARE LEFT2Ö BR 85$ ;CONTINUE THROUGH THE REST OF THE TABLE×105$: ;REF LABELØÙÚ .ENDC ; DF P$$RTYÛÜÝ .IF DF F$$LPPÞ'ß TST PIRQ ;IS THERE A PIRQ REGISTER?à BCS 106$ ;IF CS NO(á MOV #$FPPRQ,@#240 ;SET UP PIRQ VECTOR<â MOV #$FPPR8,@#244 ;SET UP FLOATING POINT EXCEPTION VECTORã106$: ;REF LABELäå .ENDCæç.è JSR R5,OPMSG ;OUTPUT INITIAL PROMPT MESSAGEé .WORD PROMT ;Dêë .IF DF P$$3XXì2í BIT #H2.PRO,$HFMSK+2 ;IS THIS A PRO-3XX SYSTEM?(î BEQ 107$ ;IF EQ NO, SKIP CLOCK CODE4ï BIS #H2.CLK,$HFMSK+2 ;INDICIATE PRO CLOCK PRESENT,ð MOV #173030,R0 ;GET XT CLOCK CSR3 ADDRESS"ñ MOV R0,$CKCSR ;SET CSR OF CLOCK,ò MOV R0,$CKCSA ;SET CSR OF CLOCK TO TICKLE1ó BICB #177,-4(R0) ;CLEAR ANY SELECTED FUNCTIONS@/ô BISB #52,-4(R0) ;SET DEFAULT DIVIDER CONTROL0-õ MOV #64.,$TKPS ;SET TICK RATE FOR THE EXECRö CLR $CKLDC ;NO LOAD COUNTT!÷ CLR $00eêq¬qßmæàmçámýfáþfDATACKCNT ;NO PLACE TO COUNT-ø MOV #$CKINT,@#230 ;INITIALIZE CLOCK VECTOR ù MOV #340,@#232 ; ...8ú MOV #106,-2(R0) ;ENABLE INTERRUPTS, BINARY DATA, 24HR0û MOV #57,@#173202 ;ENABLE INTERRUPT CONTROLLERAü BIS #H2.ITF,$HFMSK+2 ;SET THE TIME BAD DUE TO BATTERY FAILURE?'ý BR 130$ ;SKIP NORMAL Q/U CLOCK CODEKþ107$: ;REFERENCE LABELRÿ .ENDC ; DF P$$3XX* MOV $CKCSR,R0 ;GET ADDRESS OF CLOCK CSR/ TST (R0) ;IS THE GENERATED CLOCK AVAILABLE? BCC 110$ ;IF CC YESO, MOV #172540,R0 ;GET ADDRESS OF KW11-P CSR" MOV R0,$CKCSR ;SETUP FOR KW11-P MOV #172542,$CKCNT ; 4 MOV #K$$LDC,$CKLDC ;SET COUNT REGISTER LOAD COUNT*  MOV #K$$TPS,$TKPS ;SET TICKS PER SECOND  TST (R0) ;KW11-P?S  BCC 110$ ;IF CC YESE,  MOV #177546,R0 ;GET ADDRESS OF KW11-L CSR"  MOV R0,$CKCSR ;SETUP FOR KW11-L MOV R0,$CKCNT ; CLR $CKLDC ;< MOV #H$$RTZ,$TKPS ;SET TICKS PER SECOND TO LINE FREQUENCY8110$: MOV #$NONSI,@#100 ;RESET KW11-L INTERRUPT VECTOR' MOV #$CKINT,104 ;SETUP KW11-P VECTORA CMP #172540,R0 ;KW11-P? BEQ 120$ ;IF EQ YES1' MOV #$CKINT,100 ;SETUP KW11-L VECTORL' MOV #$NONSI,104 ;RESET KW11-P VECTOR- TST (R0) ;FREE RUNNING CLOCK WITH NO CSR?T BCC 120$ ;IF CC NO! CLR $CKCSR ;CLEAR CSR ADDRESS6$ CLR $CKCNT ;CLEAR COUNT REGISTER  BR 130$ ;U4120$: MOV $CKCNT,R1 ;GET ADDRESS OF COUNT REGISTER. MOV $CKLDC,(R1) ;SETUP CLOCK COUNT REGISTER  MOV #K$$IEN,(R0) ;START CLOCK9130$: MOV #PMODE+PR7,PS ;MAKE SURE PS IS SETUP PROPERLYU ! .IF NDF R$$PROP"%# CALL $CPNIT ;INITIALIZE PROCESSORE$% .IFFC&' CALL $POWER() .ENDC ; NDF R$$PRO1*+, .IF DF M$$PRO-.. MOVB $NCPU,R4 ;GET NUMBER OF CPUS IN SYSTEM/ ASL R4 ;FORM WORD INDEXK00 ADD #$K6TAB,R4 ;AND POINT PAST LAST PROCESSOR21 MTPS #PR7 ;DISABLE INTERRUPTS SINCE LOWCR WILL2 ;BE UNMAPPED-3 MOV KISAR0,$TEMP0 ;;;SAVE REAL CPU MAPPINGN-410$: MOV -(R4),KISAR0 ;;;MAP TO A PROCESSOR56 .IFTF ; DF M$$PRO718 MOV #SYSMG,R0 ;SET ADDRESS OF BLOCK TO RELEASE/9 MOV #$ICAVL-2,R3 ;POINT TO ICB POOL LISTHEAD': ADD (R3),R0 ;ROUND TO NEXT BOUNDARY;; BIC (R3),R0 ;<< MOV #&^C3,R1 ;SET LENGTH OF BLOCK TO RELEASE=> .IFF ; DF M$$PROM?0@ CALLR $DEAC1 ;DEALLOCATE INITIALIZATION CODEAB .IFT ; DF M$$PRODC$D CALL $DEAC1 ;;;DEALLOCATE A COPY#E CMP #$K6TAB,R4 ;;;FINISHED YET ?;'F BLO 10$ ;;;IF LO NO, GO TO NEXT CPUK/G MOV $TEMP0,KISAR0 ;;;REMAP TO REAL PROCESSOR$H MTPS #0 ;;;ALLOW INTERRUPTSD I RETURN ;TJK .ENDC ; DF M$$PROLMN;T?O; ROUTINE TO SET CARRY ON TRAPS THRU 10 FOR FPP DETERMINATIONP;(Q'RTRP10: BIS #1,2(SP) ;SET CARRY IN PSW S RTI ;TU;LAV; SUBROUTINE TO OUTPUT A MESSAGE TO THE SYSTEM CONSOLE TERMINALIW;ZX4YOPMSG: MOV (R5)+,R1 ;GET ADDRESS OF OUTPUT MESSAGEZOPMSG1: ;REFERENCE LABELK-[10$: MOVB (R1)+,R0 ;GET NEXT BYTE TO OUTPUTO\ BEQ 30$ ;IF EQ DONEM,] MOVB R0,TPS+2 ;LOAD BYTE IN OUTPUT BUFFER^20$: TSTB TPS ;PRINTER BUSY?&_ BCS 30$ ;IF CS NO CONSOLE TERMINAL` BPL 20$ ;IF PL YESa BR 10$ ;GO AGAINb30$: RTS R5 ;cd;NAe; **-WARN-WRITE "WARNING -- " ON CONSOL AND THEN PRINT MESSAGE. f; g; INPUTS:Uh;Ii; R4=MESSAGE ADDRESS. j;Y k; OUTPUTS:l;A m; NONE.n;P o; ALL REGISTERS ARE PRESERVED.p;Tq r .ENABL LSB st .IF NDF R$$PROu6vWARN: MOV R4,-(SP) ;SAVE MESSAGE SPECIFIED FOR LATER%w MOV #MESS24,R4 ;PRINT "WARNING --" x BR 5$ ;ENTER FATAL ROUTINEyz{ .ENDC ; NDF R$$PRO |}; G~; **-$FATAL-WRITE "FATAL ERROR -- " ON CONSOL AND THEN PRINT MESSAGE.S;;D€; THIS ROUTINE WILL WRITE "FATAL ERROR -- " ON THE CONSOL AND THENB�; PRINT THE MESSAGE ON THE CONSOL. PRIOR TO THIS, IT WILL PRINT'‚; OUT A CR, TWO FILLS, AND THEN A LF. ƒ;E „; INPUTS:R…;E†; R4=MESSAGE ADDRESS‡; ˆ; OUTPUTS:‰;R Š; NONE.A‹;OŒ; ALL REGISTERS PRESERVED.�;FŽ)�$FATAL::MOV R4,-(SP) ;SAVE R4 FOR LATER (� MOV #MESS22,R4 ;SET THE FATAL MESSAGE*‘5$: CA00eòqµqn´cÚµcÛ¶c�·c›’LL WRITLN ;WRITE WITH CR/LF FIRST0’ MOV (SP)+,R4 ;RESTORE R4 WITH MESSAGE ADDRESS“”;E8•; **-WRITE-WRITE A LINE TO CONSOL WITH NO CR/LF FIRST.–;C —; INPUTS:N˜; ™; R4=MESSAGE ADDRESSš;O ›; OUTPUTS:œ;I �; NONE.Tž; Ÿ; ALL REGISTERS PRESERVED. ; ¡¢£ .IF NDF R$$PRO¤<¥WRITE: CALL $SGFIN ;IF NO TERMINAL, DON'T GO OFF DEEP END"¦ MOV R0,-(SP) ;SAVE R0 FOR LATER"§ MOV R1,-(SP) ;SAVE R1 FOR LATER¨© .ENDC ; NDF R$$PRO2ª#«10$: MOV R4,R1 ;SET UP FOR OPMSGI ¬ JSR R5,OPMSG1 ;DO LINE OUTPUT­ MOV (SP)+,R1 ;RESTORE R1M® MOV (SP)+,R0 ;RESTORE R0 ¯ RETURNI°±; A²; **-WRITLN-WRITE A LINE WITH CR, FILLS, AND A LINE FEED FIRST.S³;A ´; INPUTS:µ;U¶; R4=ADDRESS OF MESSAGE.·; ¸; OUTPUTS:¹;S º; NONE. »; ¼; ALL REGISTERS ARE PRESERVED.½;L¾=¿WRITLN: CALL $SGFIN ;IF NO TERMINAL, DON'T GO OFF DEEP ENDS"À MOV R0,-(SP) ;SAVE R0 FOR LATER"Á MOV R1,-(SP) ;SAVE R1 FOR LATER JSR R5,OPMSG ;SEND MESSAGE à .WORD FILL ;FILLSJ$Ä BR 10$ ;ENTER WRITE, IN PROGRESS Å .DSABL LSBEÆÇ;M0È; **-ONLIN-PUT DEVICE ONLINE AND CREATE VECTORÉ;W>Ê; THIS ROUTINE WILL CREATE THE VECTORS FOR A DEVICE AND THEN=Ë; PLACE THE DEVICE ONLINE. IT WILL CALL THE DRIVER AT BOTHP@Ì; THE KRB STATUS CHANGE ENTRY AND THE UCB STATUS CHANGE ENTRY.Í; Î; INPUTS:AÏ;GÐ; R3=UCB ADDRESS. 1Ñ; R4=KRB ADDRESS OF CONTROLLER NEEDING VECTORS.R%Ò; R5=CTB ADDRESS FOR THE KRB IN R4.TÓ; Ô; OUTPUTS:Õ; =Ö; VECTORS HAVE BEEN CREATED WHEN CONTROL RETURNS TO CALLER.R&×; THE DEVICE HAS BEEN PLACED ONLINE.Ø;NÙÚONLIN: ;REFERENCE LABELÛÜ .IF DF R$$CONÝ!Þ MOV R3,-(SP) ;SAVE UCB ADDRESSC!ß MOV R4,-(SP) ;SAVE KRB ADDRESSL!à MOV R5,-(SP) ;SAVE CTB ADDRESSTáâ .IFTF ; DF R$$CONã1ä MOV #GETVC,-(SP) ;PREPARE FOR COORTOUTINE CALLN,å10$: CALL @(SP)+ ;GET NEXT VECTOR ADDRESS#æ BCS 30$ ;IF CS RETURN TO CALLERSç BEQ 20$ ;IF EQ NO ERRORSèé .IFT ; DF R$$CONUê.ë MOV R0,-(SP) ;SAVE IMPORTANT VALUES IN CASEì MOV R2,-(SP) ;USER WANTS TOí MOV R4,-(SP) ;CONTINUE FROM"î MOV R5,-(SP) ;A WARNING MESSAGE6ï MOV #NULL,R4 ;DUMMY LINE IF COMMON INTERRUPT DEVICE>ð BITB #LS.MDC,L.STS(R5) ;IS IT MULTIDRIVER CONTROLLER DEVICE.ñ BNE 12$ ;IF NE YES -- CAN'T TELL WHICH ONE8ò MOV L.DCB(R5),R5 ;GET DCB ADDRESS OR COMMON INT TABLE<ó BITB #LS.CIN,L.STS(R5) ;IS IT COMMON INTERRUPT CONTROLLER ô BEQ 11$õ MOV CI.DCB(R5),R5.ö11$: MOV D.NAM(R5),XX ;PLACE NAME IN MESSAGE)÷ MOV #MESS4,R4 ;SPECIFY CORRECT MESSAGEø12$: SUB #2,R1 ù MOV R1,R2ú SUB #4,R1 ;IS IT FATAL?Mû BPL 15$ ;IF PL NORü CALL $FATALý BR 17$ ;RENTER FLOW "þ15$: CALL WARN ;WARNING MESSAGEÿ17$: MOV #GETERR,R4 ;M% ADD R2,R4 ;POINT TO ERROR ADDRESS$# MOV (R4),R4 ;GET ACTUAL MESSAGE  CALL WRITE)* MOV (SP)+,R5 ;RESTORE SAVED VALUES FROM. MOV (SP)+,R4 ;BEFORE ERROR MESSAGE PRINTOUT MOV (SP)+,R2Q MOV (SP)+,R0C# BREAK ;AN ERROR CODE IS IN R1.A  .IFF ; DF R$$CONV   HALT ;HALT ON ERROR   .IFTF ; DF R$$CON;,F; CHECK THE ERROR CODE IN R1 AND SEE WHAT IT MEANS BY CONSULTING THEG; TABLE OF $GETVC ERROR CODES BELOW. IF THE ERROR IS A WARNING, THENVF; YOU MAY PROCEED OR CONTINUE IF DESIRED. IF THE ERROR IS FATAL, DOG; NOT ATTEMPT TO PROCEED FURTHER. TAKE REMEDIAL ACTION AND TRY AGAIN.E;M-20$: MOV R2,(R0)+ ;PLUG PC WORD INTO MEMORY  CLR (R0) ;SET UP FOR PS WORD8 BISB K.CON(R4),(R0) ;PUT CONTROLLER NUMBER IN PS WORD! ASR (R0) ;MAKE IT REAL NUMBER4 BIS #PR7,(R0) ;AND PRIORITY 7 INTERRUPT INITIALLY( TST -(R0) ;BACK UP POINTER FOR GTVEC BR 10$ ;GET NEXT VECTORV30$: ;REFERENCE LABEL .IFT ; DF R$$CONV .! MOV (SP)+,$SCCTB ;SET CTB FOR STATUS CHANGE:" MOV (SP),$SCDEV ;SET UP KRB ARGUMENT FOR KRB STATUS CHG3# MOVB #100,$SCOFL ;SHOW SPECIAL ONLINE TRANSITIONM3$ CALL $KRBSC ;CALL DRIVER AT STATUS CHANGE ENTRY;%&;RK'; ALL DEVICES THAT THIS ROUTINE DEALS WITH (I.E. DISKS, CONSOL TERMINALS,0H(; 00eúq¬qßmæàmçámýfáþfDATAAND IIST) MUST NOT MAKE USE OF THE DELAYED RETURN FEATURE OF $KRBSC.I); IF, HOWEVER, THE KS.SLO BIT IS SET IN K.STS WE WILL WAIT (UP TO ABOUTVJ*; 45 SECONDS) FOR THE DRIVER TO HANDLE THE SLOW CONTROLLER ONLINE TRANS-I+; ITION. IT IS THE DRIVERS RESPONSIBILITY TO HANDLE INTERUPTS FROM THE G,; CONTROLLER ($FORK MAY NOT BE CALLED) AND TO RESTORE $SCERR WHEN THECI-; ONLINE IS COMPLETE. IF THE FOLLOWING "BREAK" IS ENCOUNTERED, THEN IT J.; IS A SOFTWARE DESIGN PROBLEM, OR A BROKEN CONTROLLER IF KS.SLO IS SET,#/; AND AN SPR SHOULD BE SUBMITTED.R0;T1 2 MOV (SP)+,R3 ;GET KRB ADDRESS53 BIT #KS.SLO,K.STS(R3) ;IS THIS A SLOW CONTROLLER?4 BNE 31$ ;IF NE YES)5 TST $SCDEV ;DID THE DRIVER FINISH UP?R6 BEQ 40$ ;IF EQ YES7 BR 35$ ;NO, FATALI7831$: MOV #2000,R4 ;GET VALUE FOR 45 SECOND OUTER LOOPA2932$: MOV #-1,R2 ;GET COUNT FOR INNER DELAY LOOP;:33$: TSTB $SCERR ;IS THE CONTROLLER STILL COMING ONLINE?D$; BNE 40$ ;IF NE NO, IT'S FINISHED < SOB R2,33$ ;INNER LOOP DELAY = SOB R4,32$ ;OUTER LOOP DELAY2>35$: MOV #MESS12,R4 ;SPECIFY MESSAGE FOR CONSOLE%? CALL $FATAL ;FATAL ERROR PRINTOUTI*@ MOV #MESS13,R4 ;SPECIFY ANOTHER MESSAGE)A CALL WRITE ;WRITE WITHOUT CR/LF FIRSTSB MOV #MESS15,R4 'C CALL WRITLN ;WRITE WITH CR/LF FIRST:D BREAK FATALE8F40$: MOV $SCCTB,R4 ;GET CTB ADDRESS FROM PREVIOUS CALL,G MOV R4,$TEMP1 ;SAVE CTB ADDRESS FOR LATER*H MOV L.NAM(R4),UU ;PLACE NAME IN MESSAGE1I MOV #UU+2,R2 ;SET INITIAL VALUE FOR CHARACTERS;'J MOVB K.CON(R3),R5 ;GET CONTROLLER IDOK ASR R5 ;MAKE IT REAL IDRL CLR R4 ;SET UP FOR DIVIDE(M DIV #22.,R4 ;TWO POSSIBLE CHARACTERS%N BEQ 45$ ;IF EQ NO FIRST CHARACTERE6O MOVB CTLET(R4),(R2)+ ;PLACE FIRST LETTER IN MESSAGE;P45$: MOVB CTLET(R5),(R2)+ ;PLACE SECOND LETTER IN MESSAGEF6Q MOV R2,$TEMP0 ;SAVE POINTER INTO CONTROLLER MESSAGE"R CLRB (R2)+ ;SHOW END OF STRING<S BIT #KS.OFL,K.STS(R3) ;DID ONLINE FUNCTION WORK PROPERLY?T BEQ 50$ ;IF EQ YESUV;VDW; IF THE FOLLOWING BREAK IS ENCOUNTERED, THEN A DEVICE DIDN'T COMEHX; ONLINE PROPERLY. POSSIBLE CAUSES INCLUDE: THE CSR ADDRESS SPECIFIEDKY; IN THE KRB IS INCORRECT; THE DRIVER FOUND SOME CONDITION THAT PROHIBITS($Z; THE DEVICE FROM BEING USED; ETC.[;\'] MOVB $SCERR,R1 ;PUT ERROR CODE IN R1R"^ MOV #MESS16,R4 ;SPECIFY MESSAGE._ CALL $FATAL ;PRINT FATAL MESSAGE ON CONSOL"` MOV #MESS21,R4 ;ANOTHER MESSAGE+a CALL WRITE ;WRITE WITHOUT A CR/LF FIRST?"b MOV #MESS17,R4 ;ANOTHER MESSAGE7c CALL WRITLN ;WRITE WITH A CR/LF AT FRONT OF MESSAGEDd BREAK FATALe4f50$: MOV (SP),$SCDEV ;SET UP FOR UCB STATUS CHANGE3g BNE 55$ ;IF UCB ADDRESS EXISTS -- PUT IT ONLINEOh TST (SP)+ ;CLEAN STACK,i RETURN ;GO HOME EARLY -- NO UCB ADDRESS%j55$: MOV R3,-(SP) ;SAVE KRB ADDRESSC3k MOVB #100,$SCOFL ;SHOW SPECIAL ONLINE TRANSITIONL.l CALL $UCBSC ;CALL DRIVER FOR STATUS CHANGEmn;RBo; AS ABOVE, IF THE DRIVER DOESN'T RETURN IMMEDIATELY, THEN IT ISEp; A SOFTWARE DESIGN ERROR. SUBMIT AN SPR IF YOU ENCOUNTER THE NEXTTq; BREAK INSTRUCTION BELOW.r;s t MOV (SP)+,R3 ;GET KRB ADDRESS5u BIT #KS.SLO,K.STS(R3) ;IS THIS A SLOW CONTROLLER?-v BNE 56$ ;IF NE YES)w TST $SCDEV ;DID THE DRIVER FINISH UP?Ex BEQ 60$ ;IF EQ YESy BR 59$ ;NO, FATALV7z56$: MOV #2000,R4 ;GET VALUE FOR 45 SECOND OUTER LOOPT2{57$: MOV #-1,R2 ;GET COUNT FOR INNER DELAY LOOP;|58$: TSTB $SCERR ;IS THE CONTROLLER STILL COMING ONLINE?I$} BNE 60$ ;IF NE NO, IT'S FINISHED ~ SOB R2,58$ ;INNER LOOP DELAY  SOB R4,57$ ;OUTER LOOP DELAY:€59$: MOV #MESS12,R4 ;SPECIFY MESSAGE TO PRINT ON CONSOLE.� CALL $FATAL ;PRINT FATAL MESSAGE ON CONSOL4‚ MOV #MESS14,R4 ;SPECIFY ANOTHER MESSAGE ON CONSOL'ƒ CALL WRITE ;WRITE MESSAGE TO CONSOL "„ MOV #MESS15,R4 ;ANOTHER MESSAGE!… CALL WRITLN ;WITH CR/LF FIRSTE† BREAK FATAL‡$ˆ60$: MOV (SP)+,R5 ;GET UCB ADDRESS0‰ BITB #US.OFL,U.ST2(R5) ;WHAT IS ONLINE STATUS Š BEQ 70$ ;IF EQ DEVICE ONLINE‹Œ;NA�; THE DEVICE COULD NOT BE PUT ONLINE. THE ONLY REASON FOR THIS;>00erµqn´cÚµcÛ¶c�·c›’Ž; IS THAT THE DRIVER REJECTED THE ONLINE REQUEST. THE ERROR>�; CODE FROM $SCERR IS IN R1. CORRECT THE CONDITION, AND TRY �; AGAIN.‘;S’6“ MOVB $SCERR,R1 ;PUT ERROR CODE WHERE XDT CAN SEE IT%” MOV $TEMP1,R3 ;RECOVER CTB ADDRESSH8• BITB #LS.MDC,L.STS(R3) ;IS IT MULTIDRIVER CONTROLLER?4– BEQ 63$ ;IF EQ NO -- LEAVE CONTROLLER NAME AS IS$— MOV U.DCB(R5),R3 ;GET DCB ADDRESS0˜ MOV D.NAM(R3),UU ;PLACE DCB NAME INTO MESSAGE5™63$: MOV $TEMP0,R3 ;SET POINTER TO CHARACTER STRINGN/š MOVB U.UNIT(R5),R4 ;GET PHYSICAL UNIT NUMBERN› BIC #177707,R4E!œ BEQ 65$ ;IF EQ NO DIGIT THERE.+� ASR R4 ;PLACE DIGIT IN LOW PART OF BYTE ž ASR R4 Ÿ ASR R4R)  ADD #'0,R4 ;MAKE INTO ASCII CHARACTER+¡ MOVB R4,(R3)+ ;PLACE CHARACTER IN SIMPLE 3¢65$: MOVB U.UNIT(R5),R4 ;GET PHYSICAL UNIT NUMBERB£ BIC #177770,R4 ;GET MASKN ¤ ADD #'0,R4 ;MAKE INTO NUMBER#¥ MOVB R4,(R3)+ ;PLACE INTO STRINGR¦ MOVB #':,(R3)+ ;ADD COLON § CLRB (R3)+ ;TERMINATE STRING6¨ MOV #MESS20,R4 ;SPECIFY MESSAGE FOR CONSOL PRINTOUT"© CALL $FATAL ;PRINT FATAL ERROR8ª MOV #UU,R4 ;SPECIFY PHYSICAL UNIT NUMBER OF LOAD DEV« CALL WRITE ;PRINT LINE"¬ MOV #MESS21,R4 ;ANOTHER MESSAGE#­ CALL WRITE ;WRITE WITH NO CR/LFM"® MOV #MESS17,R4 ;ANOTHER MESSAGE!¯ CALL WRITLN ;WRITE WITH CR/LFT° BREAK FATAL±²³ .ENDC ; DF R$$CON´ µ70$: RETURNR¶·;I¸; N O T E W E L L :¹;L@º; THE FOLLOWING CODE HAS BEEN LIFTED DIRECTLY FROM THE MODULE?»; SAVVEC.MAC. THE ONLY MODIFICATION MADE TO IT IS TO REMOVENB¼; THE GLOBAL SYMBOLS. IT SHOULD NOT BE FURTHER MODIFIED, SINCEA½; IT IS IMPORTANT TO KEEP THIS CODE "EXACTLY" LIKE THE CODE IN#A¾; SAVVEC.MAC. FURTHERMORE, ANY MODIFICATIONS TO SAVVEC SHOULD2¿; BE REFLECTED IN MODIFICATIONS TO THIS MODULE.À;W0Á; ORIGINALLY LIFTED FROM SAVVEC.MAC 1-MAR-78.Â;N<Ã; MOST RECENTLY UPDATED TO REFLECT CHANGES TO SAVVEC.MAC:Ä; Å; K. E. KINNEAR 23-MAR-78Æ; ÇÈ;FÉ; SPECIAL EQUATED SYMBOLSAÊ;H(Ë; $GETVC ERROR CODES (MUST BE NONZERO)Ì;Í)ÎGT$E1==1*2 ;DRIVER NOT LOADED (FATAL)R:ÏGT$E2==2*2 ;DRIVER DOES NOT SUPPORT CONTROLLER (FATAL))ÐGT$E3==3*2 ;VECTOR TOO HIGH (WARNING) 'ÑGT$E4==4*2 ;VECTOR IN USE (WARNING)S3ÒGT$E5==5*2 ;UNIBUS RUN NOT ACCESSIBLE (WARNING)DÓÔ;WÕ; LOCAL DATAÖ;T×AØNONSI: .WORD $NONSI ;ADDRESSES OF EXECUTIVE NONSENSE INTERRUPTC!ÙNS0: .WORD $NS0 ; ENTRY POINTS Ú .WORD $NS1 ;Û .WORD $NS2 ;Ü .WORD $NS3 ;Ý .WORD $NS4 ;Þ .WORD $NS5 ;ß .WORD $NS6 ;àNS7: .WORD $NS7 ;áâ;+(ã; **-GETVC-GET THE NEXT VECTOR ADDRESSä; Då; THE INSTRUCTIONS IN THIS ROUTINE CANNOT BE MAPPED BY KISAR6 (THEEæ; VIRTUAL ADDRESSES MUST NOT BE BETWEEN 140000 AND 160000), BECAUSE54ç; THIS ROUTINE REMAPS (AND LATER RESTORES) KISAR6.è;OJé;***********************************************************************Iê; CODE IN THIS MODULE IS DUPLICATED IN THE EXECUTIVE MODULE INITL. ANY$/ë; BUG FIXES HERE MUST BE REPLICATED THERE!!!!OKì;************************************************************************Tí;N î; INPUTS:Dï;Eð; THIS ROUTINE IS CALLED AT SYSTEM STATE TO PROVIDE AN INTERLOCKT"ñ; ON THE VECTOR MANIPULATION.ò;Wó; WHEN CALLED INITIALLY,5ô; R4 = ADDRESS OF KRB õ; R5 = ADDRESS OF CTBRö; (SP) = RETURN ADDRESS*÷;*'ø; WHEN CALLED BACK AS A COROUTINE,*5ù; IF R0<>0, VECTOR ADDRESS PRESERVED FROM LAST CALLE;ú; IF R0=0, AFTER CLEANING UP THE STACK, $GETVC EXITS WITHI û; C=1 ü; R1=0*6ý; R0, R2, R3, R4, R5 PRESERVED AND NOT EXAMINED0þ; R4 = ADDRESS OF KRB PRESERVED FROM LAST CALL0ÿ; R5 = ADDRESS OF CTB PRESERVED FROM LAST CALL; (SP) = RETURN ADDRESSR;P ; OUTPUTS:; C; IF C=0, $GETVC MAY BE CALLED AGAIN AS A COROUTINE (THERE MAYS2; BE ANOTHER VECTOR ADDRESS TO BE RETURNED)6; R0 = VECTOR ADDRESS (BIASED TO MAP THROUGH KISAR6)&; IF R1=0, R0 AND R2 CAN BE USED AND ; Z=12 ; IF R1<>0, ERROR CODE (GT$E3, GT$E4, GT$E5) AND ; Z=0 ; R2 = PC WO00e r¬qßmæàmçámýfáþfDATARD FOR VECTOR, ; R3 = DESTROYED ; R4 = PRESERVED; R5 = PRESERVED; (SP) = TEMPORARY STORAGE; 2(SP) = TEMPORARY STORAGEL.; 4(SP) = CONTENTS OF KISAR6 AT INITIAL CALL; 6(SP) = TEMPORARY STORAGE$*; KISAR6 = MAPS R0 TO THE VECTOR ADDRESS;A;; IF C=1, $GETVC CANNOT BE CALLED AGAIN AS A COROUTINE0?; R0 = MAY BE A VECTOR ADDRESS (BIASED TO MAP THROUGH KISAR6) ; IF R1=0, NO MORE VECTORS AND ; Z=1+; IF R1<>0, ERROR CODE (GT$E1, GT$E2) AND ; Z=0; R2 = DESTROYED; R3 = DESTROYED; R4 = PRESERVED; R5 = PRESERVEDD; KISAR6 = RESTORED TO THE MAPPING AT THE TIME OF THE INITIAL CALL ;-!"GETVC: ;;ENTRY POINTA%# MOV (SP),R3 ;;SAVE RETURN ADDRESS8$ MOV L.ICB(R5),(SP) ;;SAVE ADDRESS OF FIRST ICB (OR 0)5% MOV @#KISAR6,-(SP) ;;RESERVE OTHER STACK LOCATIONS& CLR -(SP) ;;)' CLR -(SP) ;; (ASSUME RESIDENT DRIVER) (( CLR R0 ;;FORM FIRST VECTOR ADDRESS/4) BISB K.VCT(R4),R0 ;;O(* BEQ 42$ ;;IF EQ THERE ARE NO VECTORS&+ ASL R0 ;;FORM FIRST VECTOR ADDRESS , ASL R0 ;;V7- MOV L.DCB(R5),R1 ;;GET POINTER TO A COMMON INTERRUPTI,. ;; ROUTINE ADDRESS OR ADDRESS OF A DCB6/ MOV (R1),R2 ;;GET COMMON INTERRUPT ROUTINE ADDRESS>0 BITB #LS.CIN,L.STS(R5) ;;IS THIS A COMMON INTERRUPT DEVICE?1 BNE 60$ ;;IF NE YESP:2 MOV D.DSP(R1),R2 ;;GET ADDRESS OF DRIVER DISPATCH TABLE(3 BEQ 98$ ;;IF EQ DRIVER IS NOT LOADED4; A5; THE FOLLOWING CODE ASSUMES THAT THIS SYSTEM SUPPORTS LOADABLE$>6; DRIVERS (I.E., THAT D.PCB EXISTS). ALL M+ SYSTEMS SUPPORT7; LOADABLE DRIVERS.8;V29 MOV D.PCB(R1),R1 ;;DRIVER RESIDENT OR LOADABLE?: BEQ 10$ ;;IF EQ RESIDENT+; MOV P.REL(R1),(SP) ;;SAVE MAPPING TO DDTI!< MOV (SP),@#KISAR6 ;;MAP TO DDTL-= ADD #20000,R2 ;;BIAS POINTER TO USE KISAR6V6>10$: ADD #D.VINT,R2 ;;POINT AT FIRST CONTROLLER NAME?@; GA; SEARCH THE DDT FOR THE VECTOR AND INTERRUPT ENTRY POINT INFORMATION9B; THAT APPLIES TO THIS CONTROLLER. THE DDT LOOKS LIKE:AC;$CD; $XXTBL+D.VINT: CONTROLLER INFORMATION (NONZERO WORDS TERMINATED E; BY A ZERO WORD)F; .WORD $XYCTBG;RH; CONTROLLER INFORMATIONI; .WORD $XZCTB J; .P K; .; L; . M;N; $XXTBE:: .WORD 0O;TP-Q CLR R1 ;;INITIALIZE OFFSET TO NEXT VECTORR&R20$: TST (R2) ;;REACHED END OF DDT?S BEQ 150$ ;;IF EQ YES7T CMP L.NAM(R5),(R2) ;;FOUND INFO FOR THIS CONTROLLER? U BEQ 40$ ;;IF EQ YESH8V30$: TST (R2)+ ;;PASSED OVER ALL INFO FOR CONTROLLER?W BNE 30$ ;;IF NE NO X TST (R2)+ ;;SKIP CTB POINTER Y BR 20$ ;;Z[; 3\; THE INFORMATION FOR EACH CONTROLLER LOOKS LIKE:R];R+^; .ASCII /XY/ ;CONTROLLER (CTB) MNEMONIC:_; .WORD INTERRUPT ENTRY POINT ADDRESS (NONZERO AND EVEN)*`; .WORD INTERRUPT ENTRY POINT ADDRESS ORa; VECTOR OFFSET (ODD) b; .E c; . d; .I e; .WORD 0Cf;N?g; THERE MAY BE ZERO OR MORE WORDS OF INFORMATION BETWEEN THEE5h; CONTROLLER MNEMONIC AND THE TERMINATING ZERO WORDNi;Ej6k40$: TST (R2)+ ;;POINT TO NEXT CONTROLLER INFO WORD.l TST (R2) ;;REACHED END OF CONTROLLER INFO?m42$: BEQ 120$ ;;IF EQ YES8n BIT #1,(R2) ;;IS ENTRY AN INTERRUPT ENTRY POINT ADDRo BEQ 50$ ;;IF EQ YESO.p MOV (R2),-(SP) ;;FORM VECTOR ADDRESS OFFSETq DEC (SP) ;;D0r CLR R1 ;;CLEAR DEFAULT VECTOR ADDRESS OFFSET)s ADD (SP)+,R0 ;;FORM NEW VECTOR ADDRESS t BR 40$ ;;A&u50$: MOV R2,2(SP) ;;SAVE DDT POINTER(v ADD R1,R0 ;;FORM NEXT VECTOR ADDRESS7w MOV (R2),R2 ;;GET DRIVER INTERRUPT ENTRY POINT ADDR;)x TST (SP) ;;IS THIS A RESIDENT DRIVER?(y BEQ 60$ ;;IF EQ YEST!z MOV 6(SP),R2 ;;GET ICB POINTER {52$: MOV R2,R1 ;;COPY ITE!| ASL R2 ;;FORM VIRTUAL ADDRESS/} MOV (R2)+,6(SP) ;;ASSUME NOT A MP/I&D SYSTEMM)~ ;; (ASSUME CURRENT MAPPING IS OKAY)1 TSTB $NCPU ;;IS THIS A MULTIPROCESSOR SYSTEM?A€ BEQ 60$ ;;IF EQ NO6� BIT #F2.DAS,$FMASK+2 ;;IS THIS AN I&D SPACE SYSTEM?‚ BEQ 60$ ;;IF EQ NO,ƒ BIC #7777,R1 ;;CLEAR VIRTUAL ADDRESS BITS+„ SWAB R1 ;;FORM CPU NUMBER*2 OF ICB LINK … ASR R1 00erµqn´cÚµcÛ¶c�·c›’ ;;I † ASR R1 ;;N ‡ ASR R1 ;;B3ˆ MOV $K6TAB(R1),@#KISAR6 ;;MAP TO ICB'S CPU POOLE.‰ BIC #160000,R2 ;;CLEAR CPU NUMBER BITS5Š BIS #140000,R2 ;;BIAS ICB POINTER TO USE APR6 =‹ BIT $URMTB(R1),K.URM(R4) ;;THIS ICB POINTER FOR THE CPU TOT+Œ ;; WHICH THE DEVICE IS CURRENTLYA� ;; CONNECTED?Ž BNE 54$ ;;IF NE YES;&� MOV -(R2),R2 ;;GET NEXT ICB POINTER � BR 52$ ;;1‘54$: MOV -(R2),6(SP) ;;SAVE POINTER TO NEXT ICB ,’ ADD #40002,R2 ;;REMOVE BIAS BITS AND FORM“ ;; ADDRESS OF ICB'S JSRR”•;,–; VECTOR ADDRESS TOO HIGH FOR THIS SYSTEM?—;˜/™60$: CMP $VECTR,R0 ;;VECTOR ADDRESS TOO HIGH?Sš BLO 160$ ;;IF LO YES›œ; B�; MAP TO THE CORRECT CPU VECTOR AREA IF THIS IS A MULTIPROCESSORž; CONFIGURATION Ÿ;H 0¡ MOVB $NCPU,R1 ;;GET NUMBER OF CPU'S IN SYSTEM0¢ BEQ 80$ ;;IF EQ THIS IS NOT A MULTIPROCESSOR$£ ASL R1 ;;CONVERT TO A WORD INDEX.¤70$: SUB #2,R1 ;;CHECKED ALL OF PROCESSORS?¥ BLT 170$ ;;IF LT YES8¦ BIT K.URM(R4),$URMTB(R1) ;;IS CONTROLLER ON THIS CPU?§ BEQ 70$ ;;IF EQ NO:¨ MOV $K6TAB(R1),@#KISAR6 ;;MAP TO VECTOR CONTEXT FOR CPU5© BIS #140000,R0 ;;BIAS VECTOR ADDRESS TO USE KISAR6ª«; C¬; SEE IF VECTOR IS IN USE (DOES NOT POINT TO A NONSENSE INTERRUPTO­; ENTRY POINT)®;¯1°80$: MOV #NONSI,R1 ;;POINT TO TABLE OF NONSENSEQ± ;; INTERRUPT ENTRY POINTSP)²90$: CMP (R1)+,(R0) ;;IS VECTOR IN USE?D³ BEQ 100$ ;;IF EQ NOH&´ CMP #NS7,R1 ;;REACHED END OF TABLEµ BHIS 90$ ;;IF HIS NO¶·;(¸; VECTOR IN USE (WARNING)P¹;º!» MOV #GT$E4,R1 ;;GET ERROR CODE,¼ BR 167$ ;;WARNINGR½¾;F¿; DRIVER NOT LOADED (FATAL)SÀ;OÁ%Â98$: MOV #GT$E1,R1 ;;GET ERROR CODE à BR 130$ ;;ÄÅ; DÆ; R2 CONTAINS WHAT SHOULD BE PUT INTO THE FIRST WORD OF THE VECTORFÇ; (PROGRAM COUNTER) IF THE CALLER IS INITIALIZING THE VECTOR. R2 IS#È; ONE OF THE FOLLOWING ADDRESSES:CÉ;N7Ê; 1) DRIVER INTERRUPT ENTRY POINT (RESIDENT DRIVER)EBË; 2) SECOND WORD OF AN INTERRUPT CONTROL BLOCK (LOADED DRIVER)3Ì; 3) ENTRY POINT OF A COMMON INTERRUPT ROUTINECÍ;Î.Ï100$: MOV R3,-(SP) ;;POSITION RETURN ADDRESS+Ð CLR R1 ;;SHOW GOOD VECTOR ADDRESS (C=0);"Ñ110$: CALL @(SP)+ ;;CALL CALLERÒÓ;Ô; AT THIS POINT:Õ; Ö; (SP) = RETURN ADDRESSO×; IF 2(SP)=0, RESIDENT DRIVERR3Ø; IF 2(SP)<>0, MAPPING TO DDT FOR LOADABLE DRIVER0Ù; 4(SP) = ADDRESS OF LAST WORD EXAMINED IN DDT&Ú; 6(SP) = INITIAL CONTENTS OF KISAR6'Û; 10(SP) = ADDRESS OF NEXT ICB (OR 0)RÜ;CÝ%Þ MOV (SP)+,R3 ;;SAVE RETURN ADDRESSR+ß TST R0 ;;CALLER WANT AN IMMEDIATE EXIT?à BEQ 120$ ;;IF EQ YES:á BITB #LS.CIN,L.STS(R5) ;;A COMMON INTERRUPT CONTROLLER?+â BNE 120$ ;;IF NE YES -- ONLY ONE VECTORR)ã MOV #4,R1 ;;GET DEFAULT VECTOR OFFSETS(ä MOV 2(SP),R2 ;;RESTORE POINTER TO DDT1å MOV (SP),@#KISAR6 ;;IF NECESSARY, REMAP TO DDTO&æ BIC #160000,R0 ;;CLEAR MAPPING BITS ç BR 40$ ;;E-è120$: CLR R1 ;;SHOW ALL VECTORS WERE FOUND6-é130$: CMP (SP)+,(SP)+ ;;CLEAR OFF STACK ANDC/ê MOV (SP)+,@#KISAR6 ;;RESTORE INITIAL MAPPINGT%ë MOV R1,(SP)+ ;; SET OR CLEAR Z-BIT*ì SEC ;;SHOW CANNOT CALL AS A COROUTINEí JMP (R3) ;;RETURNTîï;N.ð; DRIVER DOES NOT SUPPORT CONTROLLER (FATAL)ñ;Rò&ó150$: MOV #GT$E2,R1 ;;GET ERROR CODEô BR 130$ ;;õö;R÷; VECTOR TOO HIGH (WARNING)#ø;6ù&ú160$: MOV #GT$E3,R1 ;;GET ERROR CODE.û167$: MOV R3,-(SP) ;;POSITION RETURN ADDRESS'ü CLC ;;SHOW CAN CALL AS A COROUTINE6ý BR 110$ ;;þÿ; '; UNIBUS RUN NOT ACCESSIBLE (WARNING)S;;&170$: MOV #GT$E5,R1 ;;GET ERROR CODE BR 167$ ;;;!; END OF DYNAMIC STORAGE REGIONR;E2 INEND: ;REFERENCE LABEL FOR END TO DEALLOCATE0  .BLKB 2 ;EXTRA FOR POSSIBLE ALIGNMENT CHANGE ;2' ; BEGINNING OF DYNAMIC STORAGE REGION ; .IF DF K$$DAS3$ICBEG::.WORD 0 ;LINK TO NEXT BLOCK IN FREE LIST6 .WORD <<+3>&177774> ;LENGTH OF FREE BLOCK> .BLKB <<+3>&177774>-4 ;ALLOCATE REMAINING STORAGE&$ICTOP:: ;LA00erfrßmæàmçámýfáþfDATAST ADDRESS IN ICB POOL .IFF 3$SYBEG::.WORD 0 ;LINK TO NEXT BLOCK IN FREE LIST 6 .WORD <<+3>&177774> ;LENGTH OF FREE BLOCK> .BLKB <<+3>&177774>-4 ;ALLOCATE REMAINING STORAGE'$SYTOP:: ;LAST ADDRESS IN EXECUTIVEN .ENDC ! .END $INITL .IF DF K$$DAS3$ICBEG::.WORD 0 ;LINK TO NEXT BLOCK IN FREE LIST6 .WORD <<+3>&177774> ;LENGTH OF FREE BLOCK> .BLKB <<+3>&177774>-4 ;ALLOCATE REMAINING STORAGE&$ICTOP:: ;LA .TITLE DRTBLL .IDENT /05.12/ ;SE; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.O7; COPYRIGHT (C) 1987 BY DIGITAL EQUIPMENT CORPORATIONI; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;0 ; B. S. MCCARTHY 17-MAR-81 ;# ; MODIFIED FOR RSX-11M-PLUS V2.1:R ;T; J. R. KAUFFMAN; T. M. MARTIN; B. S. MCCARTHY$;.-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:O;; J. W. BERZLE; J. R. KAUFFMAN; J. M. LAWLER; B. S. MCCARTHY;D-; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:C;7$; B. S. MCCARTHY 12-DEC-86 05.08;"; BM377 -- MOVE DRSPW TO DR211M;N ; K. L. NOEL 29-JAN-87 05.09; !; KLN031 -- ADD GDVI DIRECTIVE ;S#; B. S. MCCARTHY 5-MAR-87 05.101;+; BM385 -- INDICATE THAT DREXP AND DRGCL#; ARE IN SECOND COMMON (THEY'RE"; REALLY IN THE VECTOR COMMON);F$; B. S. MCCARTHY 12-JUN-87 05.12; !; BM402 -- ADD DFCTSK TO RSUM$;M6; DIRECTIVE DISPATCHER TABLE7;D8; THIS MODULE WAS SPLIT OUT OF DRTBL AND RESTRUCTURED TO ALLOW FORG9; MORE DIRECTIVE FLAGS, STREAMLINE DIRECTIVE PROCESSING, AND TO ALLOW.4:; THIS MODULE TO BE PLACED IN THE DIRECTIVE COMMON;;I<;V= .PAGE>?;+0@; DEFINE BITS FOR THE DIRECTIVE DISPATCH TABLEA;-BC;XKD; THE DIRECTIVE DISPATCHER BITS OCCUPY A WORD FLAG TABLE. THERE ARE THREER0E; GROUPS OF BITS, SHOWN WITH SUBOPTIONS BELOW:F;GHH; ACHKDB - ADDRESS CHECK AND MAP PLAS DEFINITION BLOCK. THE DPB IS TWO>I; WORDS, THE SECOND OF WHICH IS THE ADDRESS OF A REGION OR=J; WINDOW DEFINITION BLOCK, 8 WORDS LONG. THE STURCTURE ISEBK; ADDRESS CHECKE AND MAPPED, AND IF VALID IS PASSED IN LIEU OF'L; THE DPB TO THE DIRECTIVE ROUTINE.M;IGN; CEFNCL - CALL $CEFN. THE DPB CONTAINS AN EVENT FLAG NUMBER WHICH ISV+O; CONVERTED TO A MASK WORD AND ADDRESS.HP;RGQ; CEFNMT - AN ERROR OF D.RS97 IS RETURNED IF THE EFN IN THE DPB IS (R; NULL (NO EVENT FLAG SPECIFIED).S;BCT; GEFUSE - IF THE SPECIFIED EVENT FLAG IS GROUP GLOBAL, DO NOT !U; INCREMENT THE USE COUNT.TV;LFW; SRSTCL - DIRECTIVE DEALS WITH A TCB, DPB CONTAINS NAME. DISPATCHER?X; CALLS $SRSTD (OR SIMILAR) AND RETURNS ERROR D.RS2 IF TASKR,Y; SPECIFIED IN THE DPB IS NOT INSTALLED.Z;NF[; DFCTSK - IF THE TASK NAME IN THE DPB IS NULL (BINARY ZERO), THE\; CURRENT TASK IS USED.G]; MUPCHK - MULTI-USER PROTECTION CHECKS. THE TARGET TASK MUST HAVE >^; THE SAME TI: AS THE ISSUING TASK, OR THE ISSUING TASK_; MUST BE PRIVILEGED,H`; CRETCB - IPLIES THAT THE DIRECTIVE MAY CREATE A TCB FROM A PROTO-?a; TYPE, AND THEREFORE SUPPRESSES THE SEARCH FOR A MULTI-S;b; USER COPY OF THE TASK FROM THIS TERMINAL. (IMPLIESFc; SECTCB)Cd; SECTCB - THIS DIRECTIVE MAY DEAL WITH TCBS IN SECONDARY POOLNe;BBf; ANY SUB-FUNCTION BIT IMPLIES THE MAJOR FUNCTION BIT. THE THREE+g; MAJOR FUNCTIONS ARE MUTUALLY EXCLUSIVE.Uh;V@i; THE POSITION OF THE BITS WITHIN THE FLAGS WORD IS AS FOLLOWSj; Ck; 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0AFl; +---+---+----+---+---+---+---+---+---+---+---+---+---+---+---+---+Fm; | | | | | | | | | | | | | | | | |Fn; | A | S | DC | M | | | C | G | S | C | | | | | | |Fo; | C | E | FR | U | | | E | E | R | E | | | | | | |Fp; | H | C | CE | P | | | F | F | S | F | 00f"rµqn´cÚµcÛ¶c�·c›’ | | | | | |Fq; | K | T | TT | C | | | N | U | T | N | | | | | | |Fr; | D | C | SC | H | | | M | S | C | C | | | | | | |Fs; | B | B | KB | K | | | T | E | L | L | | | | | | |Ft; | | | | | | | | | | | | | | | | |Fu; +---+---+----+---+---+---+---+---+---+---+---+---+---+---+---+---+ v; |w; +x; SPECIAL NOTE REGARDING PLAS DIRECTIVES:|y; @z; ALL DIRECTIVES SPECIFYING "ACHKDB" MUST BE BUILT IN THE PLASF{; DIRECTIVE COMMON (OR RESIDENT IN THE EXEC) SINCE THAT BIT TRIGGERSM{; THE REMAPPING OF THE DIRECTIVE COMMON. THESE DIRECTIVES MUST USE ; BM377|I{; THE DIRP MACRO SO THAT THE ADDRESSES ARE STORED UNADJUSTED. ; BM377|{ ; BM377 � .PAGE ;**-5‚ƒ ACHKDB = 100000„ CEFNCL = 100… CEFNMT = 1000!CEFNCL-† GEFUSE = 400!CEFNCL-‡ SRSTCL = 200ˆ SECTCB = 40000!SRSTCLG‰ DFCTSK = 20000!SRSTCL Š CRETCB = 20000!SRSTCL!SECTCB‹ MUPCHK = 10000!SRSTCLSŒ�;+Ž; LOCAL MACROS�;-�‘;E)’; DEFINE DIRECTIVE DISPATCH TABLE ENTRYP“;F!”; DIR ADDR,SIZE,MASK,COND,SCONDI•;U –; WHERE:—;A˜; ADDR=ADDRESS OF THE DIRECTIVE EXECUTION ROUTINE OR '.FALSE.'. ;™; SIZE=SIZE OF THE DPB REQUIRED BY THE DIRECTIVE ROUTINE.A=š; MASK=CONTROL BITS TO BE USED BY THE DIRECTIVE DISPATCHER.<›; COND=EXPRESSION ON WHICH DIRECTIVE IS CONDITIONALIZED. A4œ; DEFAULT OF $DSTAB IS USED FOR CONVENIENCE (I.E.�; UNCONDITIONAL).<ž; SCOND=CONDITIONAL EXPRESSION ON WHICH SIZE BYTE IS TO BE5Ÿ; ZERO (VARIABLE-LENGTH DPB). A DEFAULT OF XXXXXX4 ; IS USED FOR CONVENIENCE (I.E. SIZE IS NONZERO).¡;¢£ .PAGE¤'¥ .MACRO DIR ADDR,SIZE,MASK,COND,SCOND'¦§¨ .IF IDN ,<.FALSE.>R©ª DIRC .FALSE.I«¬ .IFF­%® DIRC ADDR,0,SIZE,,COND,SCONDE¯° .ENDC± ² .ENDM DIR³(´ .MACRO DIR2 ADDR SIZE,MASK,COND,SCONDµ*¶ DIRC ADDR,100000,SIZE,,COND,SCOND· ¸ .ENDM DIR2N¸ ; BM377=4¸ .MACRO DIRP ADDR SIZE,MASK,COND,SCOND ; BM377¸ ; BM377G4¸ DIRC ADDR,REAL,SIZE,,COND,SCOND ; BM377¸ ; BM377N¸ .ENDM DIRP ; BM377¸ ; BM377R¹º .PAGE:» .MACRO DIRC ADDR,COM,SIZE,MASK,COND=$DSTAB,SCOND=XXXXXX¼½ .IF EQ PASS-1 ¾ .BLKW 3¿ .IF DIF ,<.FALSE.>NÀ .IF DF CONDÁ HI$DIC==<<.-$DSTAB>/6>-1A .GLOBL ADDRà .ENDC ; DF CONDÄ .ENDC ; DIF ,<.FALSE.>KÅÆ .IFF ; EQ PASS-1MÇ .IF GT TB$SIZ-<.-$DSTAB> È .WORD 0É$$$=.IÊ .=.+TB$SIZ-2D Ë .WORD 0Ì .=.+TB$SIZ-2M Í .WORD 0Î .=$$$ÏÐ .IF DIF ,<.FALSE.>3Ñ .IF DF COND ÒDSPMK=0Ó .IF NB Ô .IRP X,ÕDSPMK=DSPMK!XÖ .ENDM× .ENDC ;NB OØ .IF DF SCOND$ ÙDSPSZ=0=Ú .IFFÛDSPSZ=SIZE*2Ü .ENDC ; DF SCONDFÝÞHI$DIC==<<.-$DSTAB>/2>-1ß.=.-2à .IF GT 28.-DSPSZ6á .BYTE DSPSZ,-<2*DSPSZ>Nâ .IFFOã .BYTE DSPSZ,0ä .ENDC ; GT 28.-DSPSZåæ .=.+TB$SIZ-2æ ; BM377T%æ .IF DIF , ; BM377Iæ ; BM377.ç .WORD <&77777>!COM$ç ; BM377D(ç .IFF ; DIF , ; BM377ç ; BM377ç .WORD ADDR ; BM377ç ; BM377C(ç .ENDC ; DIF , ; BM377ç ; BM377Iè .=.+TB$SIZ-2Dé .WORD DSPMKê .=$$$ëì .ENDC ; DF CONDí .ENDC ; DIF ADDR,<.FALSE.>Eî .ENDC ; GT TB$SIZ-<.-$DSTAB>.ï .ENDC ; EQ PASS-1ð .ENDMñò .PAGEóô;+/õ; DEFINE SYMBOL INDICATING WHICH PASS THIS ISLö;-÷ø .IF NDF PASS ù PASS = 1ú .IFFA û PASS = 2!ü .ENDCýþ;+ÿ; DIRECTIVE DISPATCH TABLE;--$DSTAB::DIR2 $DRQIO,12. ;001.-QUEUE I/O / DIR2 $DRQIO,12. ;003.-QUEUE I/O AND WAITF@ DIR2 $DRGLI, G$$DVI ;005.-GET LUN ASSIGNMENT AND ;KLN031+ ; GET DEVICE INFORMATION ;KLN031 . DIR $DRASG, 4. ;007.-ASSIGN LUN ;**-10 DIR $DRATP, 4.,DFCTSK ;009.-ALTER PRIORITY@ DIR2 $DRREQ, 7.,CRETCB,,P$$OFF ;011.-REQUEST/SPAWN ; BM300f*rrßmæàmçámýfáþfDATA77- DIR .FALSE. ;013.-INVALID DIC ;**-1S%  DIR .FALSE. ;015.-INVALID DICC+  DIR $DRRUN,11.,SRSTCL ;017.-RUN TASK-%  DIR .FALSE. ;019.-INVALID DIC13  DIR2 $DRRRA, 2., ,P$$LAS ;021.-REC BY REF ASTA,  DIR $DRMKT, 5.,CEFNCL ;023.-MARK TIME: DIR $DRCSR, 3.,MUPCHK ;025.-CANCEL SCHEDULE REQUESTS7 DIR $DRCMS, 0. ;027.-CANCEL SELECTIVE MARK TIMES;> DIR2 $DREXS, 2., ,P$$OFF ;029.-EXIT WITH STATUS ; BM377? DIR $DRCEF, 2., ;031.-CLEAR EVENT FLAG ;**-1.6 DIR $DRSEF, 2., ;033.-SET EVENT FLAG5 DIR $DRDSE, 1. ;035.-DECLARE SIGNIFICANT EVENT17 DIR $DRREF, 2., ;037.-READ EVENT FLAGD: DIR $DRRAF, 0. ;039.-READ ALL(EXTENDED) EVENT FLAGS8 DIR $DRWFS, 2.,CEFNMT ;041.-WFR SINGLE EVENT FLAG1 DIR $DRWFL, 3. ;043.-WAITFOR LOGICAL OR OF, ; EVENT FLAGSE- DIR $DRSPN, 1. ;045.-SUSPEND EXECUTION2A DIR $DRRES, 3.,DFCTSK ;047.-RESUME TASK EXECUTION ; BM4021; DIR $DRWSE, 1. ;049.-WAITFOR SIGNIFICANT EVENT ;**-1 % DIR $DREXT, 1. ;051.-TASK EXIT / DIR $DREIF, 2., ;053.-EXIT IFE@ DIRP $DRCRR, 2.,ACHKDB,P$$LAS ;055.-CREATE REGION ; BM377@ DIRP $DRATR, 2.,ACHKDB,P$$LAS ;057.-ATTACH REGION ; BM377@ DIRP $DRDTR, 2.,ACHKDB,P$$LAS ;059.-DETACH REGION ; BM3776! DIR $DRGTP, 0. ;061.-GET TIME PARAMETERS ;**-3/" DIR $DRGTK, 2. ;063.-GET TASK PARAMETERSR4# DIR $DRGPP, 4. ;065.-GET PARTITION PARAMETERS%$ DIR .FALSE. ;067.-INVALID DIC 9% DIR $DRSRF, 5.,SECTCB,P$$LAS ;069.-SEND BY REFERENCEE&'( .IF DF P$$OOL)@* DIR $DRSND, 0.,SECTCB ;071.-SEND (AND VARIABLE SEND) DATA+, .IFFN-4. DIR $DRSND, 5.,SRSTCL ;071.-SEND DATA TO TASK/0 .ENDC12%3 DIR .FALSE. ;073.-INVALID DICD456 .IF DF P$$OOL718 DIR $DRREC, 0. ;075.-RECEIVE (AND VARIABLE9 ; REC) DATAE:: DIR $DRREC, 0. ;077.-REC (AND VAR REC) DATA OR EXIT;< .IFF=2> DIR $DRREC, 4. ;075.-RECEIVE DATA FROM TASK:? DIR $DRREC, 4. ;077.-RECEIVE DATA FROM TASK OR EXIT@A .ENDCBC%D DIR .FALSE. ;079.-INVALID DICRBD DIRP $DRRRF, 2.,ACHKDB,P$$LAS ;081.-RCV BY REFERENCE ; BM3775F DIR $DRABO, 3.,MUPCHK ;083.-ABORT TASK ;**-1S%G DIR .FALSE. ;085.-INVALID DIC.%H DIR .FALSE. ;087.-INVALID DIC >H DIR2 $DREXP, 3., ,E$$XPR ;089.-EXTEND PARTITION ; BM384-J DIR .FALSE. ;091.-INVALID DIC ;**-1 %K DIR .FALSE. ;093.-INVALID DIC41L DIR $DRDCP, 1. ;095.-DISABLE CHECKPOINTING40M DIR $DRECP, 1. ;097.-ENABLE CHECKPOINTING3N DIR $DRDAR, 1. ;099.-DISABLE AST RECOGNITIONR2O DIR $DREAR, 1. ;101.-ENABLE AST RECOGNITION2P DIR $DRSDV, 3. ;103.-SPECIFY ODT SST VECTOR3Q DIR $DRSTV, 3. ;105.-SPECIFY TASK SST VECTORI2R DIR2 $DRRCV, 2. ;107.-SETUP FOR RECEIVE AST;S DIR2 $DRPUT, 2., ,P$$RFL ;109.-SETUP FOR POWER UP AST6T DIR2 $DRFEX, 2., ,F$$LPP ;111.-SETUP FOR FLP AST7U DIR $DRGMX, 2., ,P$$LAS ;113.-GET MAPPING CONTEXT-)V DIR $DRATX, 1. ;115.-AST TRAP EXIT GV DIRP $DRCRW, 2.,ACHKDB,P$$LAS ;117.-CREATE ADDRESS WINDOW ; BM377OIV DIRP $DRELW, 2.,ACHKDB,P$$LAS ;119.-ELIMINATE ADDRESS WINDOW ; BM377,DV DIRP $DRMAP, 2.,ACHKDB,P$$LAS ;121.-MAP ADDRESS WINDOW ; BM377FV DIRP $DRUNM, 2.,ACHKDB,P$$LAS ;123.-UNMAP ADDRESS WINDOW ; BM377=[ DIR $DRGSS, 1., ,G$$TSS ;125.-GET SENSE SWITCHES ;**-4:[ DIR2 $DRGCL, 0. ;127.-GET MCR COMMAND LINE ; BM384D] DIR2 $DRCIN, 7., ,C$$INT ;129.-CONNECT TO INTERRUPT ;**-1%^ DIR $DRSTP, 1. ;131.-STOP TASKC-_ DIR $DRUNS, 3.,DFCTSK ;133.-UNSTOP TASKD3` DIR $DRSTS, 2.,CEFNMT ;135.-STOP FOR SNGL EFN.8a DIR $DRSTL, 3. ;137.-STOP FOR LOGICAL OR OF EFN'Sbcd .IF DF P$$OOLe1f DIR $DRRCS, 0. ;139.-RECEIVE (AND VAR REC) g ; DATA OR STOPhi .IFFRj0k DIR $DRRCS, 4. ;139.-RECEIVE DATA OR STOPlm .ENDCno8o DIR2 $DRSRC, 0.,SECTCB,P$$OFF ;141.-SDRC ; B00f2rg7rn´cÚµcÛ¶c�·c›’M377Ao DIR2 $DRCNC, 6.,SRSTCL,P$$OFF ;143.-CONNECT TO TASK ; BM377,-r DIR .FALSE. ;145.-INVALID DIC ;**-2T:r DIR2 $DREMS, 4., ,P$$OFF ;147.-EMIT STATUS ; BM377At DIR $DRCRV, 5., ,V$$TRM ;149.-CREATE VIRTUAL TERMINAL ;**-1 >u DIR $DRELV, 2., ,V$$TRM ;151.-ELIMINATE VIRTUAL TERMINAL%v DIR .FALSE. ;153.-INVALID DIC 8w DIR $DRSCA, 3., ,S$$LIB ;155.-SUPERVISOR MODE CALL7x DIR $DRCRE, 2., ,G$$GEF ;157.-CREATE GROUP GLOBAL y ; EVENT FLAGS4:z DIR $DRELE, 0., ,G$$GEF ;159.-ELIMINATE GROUP GLOBAL{ ; EVENT FLAGS4| DIR $DRSAF, 2., ,M$$PRO ;161.-SPECIFY AFFINITY3} DIR $DRRMA, 1., ,M$$PRO ;163.-REMOVE AFFINITY@~ DIR2 $DRPER, 2., ,P$$RTY ;165.-SET UP FOR PARITY ERROR AST: DIR2 $DRREX, 0. ;167.-SET UP FOR REQUESTED EXIT ASTA€ DIR2 $DRGIN, 0., ,R$$GIN ;169.-GET / PUT SYSTEM INFORMATION$B� DIR2 $DRSMG, 0., ,E$$LOG ;171.-SEND MESSAGE TO ERROR LOGGING2‚ DIR2 $DRCLI, 0., ,A$$CLI ;173.-CLI DIRECTIVE0ƒ DIR $DRSWS, 3., ,S$$WST ;175.-SWITCH STATE;„ DIR $DRFEA, 2., ,R$$FEA ;177.-FEAT$ TEST FEATURE MASK 5… DIR .FALSE. ;179.-RESERVED RSX-11M FUTURE USEM5† DIR .FALSE. ;181.-RESERVED RSX-11M FUTURE USE$5‡ DIR .FALSE. ;183.-RESERVED RSX-11M FUTURE USEX5ˆ DIR .FALSE. ;185.-RESERVED RSX-11M FUTURE USED5‰ DIR .FALSE. ;187.-RESERVED RSX-11M FUTURE USE$5Š DIR .FALSE. ;189.-RESERVED RSX-11M FUTURE USEE/‹ DIR .FALSE. ;191.-RESERVED FOR USER USE./Œ DIR .FALSE. ;193.-RESERVED FOR USER USE5/� DIR .FALSE. ;195.-RESERVED FOR USER USE7/Ž DIR .FALSE. ;197.-RESERVED FOR USER USE1/� DIR .FALSE. ;199.-RESERVED FOR USER USE =� DIR $DRSMP, 2., ,S$$MAP ;201.-MODIFY SUPERVISOR MAPPING38‘ DIR $DRMVS, 4., ,S$$MAP ;203.-MOVE TO/FROM VARIOUS’ ; TASK SPACES)“ DIR2 $DRCPC, 3., ,C$$PCR ;205.-CPCRFC” DIR2 $DRLOG, 0., , ;207.-LOGICAL NAME DIRECTIVES?• DIR $DRTFE, 2., ,R$$FEA ;209.-TFEA$ TEST TASK FEATURE =– DIR $DRBOM, 3. ;211.-BREAKPOINT OR MESSAGEVF– DIRP $DRRRF, 2.,ACHKDB,P$$LAS ;213.-RECEIVE DATA OR STOP ; BM377<˜ DIR .FALSE. ;209.-RESERVED RSX-11M+ FUTURE USE ;**-1™Cš.=$DSTAB+<*6> ;TRUNCATE UNUSED PORTION OF TABLE AT ENDA›œ TB$SIZ == <.-$DSTAB>/3�ž .END TASK SPACES)“ DIR2 $DRCPC, 3., ,C$$PCR ;205.-CPCRFC” DIR2 $DRLOG, 0., , ;207.-LOGICAL NAME DIRECTIVES?• DIR $DRTFE, 2., ,R$$FEA ;209.-TFEA$ TEST TASK FEATURE =– DIR .TITLE PARTYA .IDENT /09.03/; A;L,; COPYRIGHT (c) 1974, 1978, 1979, 1980, 1983/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.L; A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDN9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.R;C;@; D. N. CUTLER 14-FEB-74 ;B$; MODIFIED FOR RSX-11M-PLUS V2.1 BY:;C; C. B. PUTNAM; J. R. KAUFFMAN; B. S. MCCARTHY;;; MODIFIED BY:;:; C. B. PUTNAM 27-MAY-83 09.00;0; CBP188 -- USE E$CMEM FOR MEMORY PARITY ERRORS;I; J. W. BERZLE 08-SEP-83 09.01;L2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES;A; J. R. KAUFFMAN 9-NOV-83 09.02 ;S?; JRK286 -- GET CACHE CSR VALUES FROM $MSTAT FOR ERROR LOG PKT ;U; J. M. LAWLER 21-NOV-83 09.03;H"; JL173 -- CORRECT TYPO IN JRK286; "; MEMORY PARITY INTERRUPT HANDLING;D; MACRO LIBRARY CALLSB; .IF DF P$$RTY1 .MCALL ABODF$,EPKDF$,HWDDF$,PCBDF$,TCBDF$,BGCK$A:" ABODF$ ;DEFINE TASK ABORT CODES& EPKDF$ ;DEFINE ERROR PACKET OFFSETS$ HWDDF$ ;DEFINE HARDWARE REGISTERS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSY, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;0; PARITY VECTOR ;G .ASECTR.=114 .WORD $PARER .WORD PR7 ; .PSECTM;+(; **-PARER-MEMORY PARITY ERROR INTERRUPT;YN; THIS ROUTINE IS ENTERED AS THE RESULT OF A MEMORY PARITY ERROR INTERRUPT. IFI; THE ERROR OCCURED IN THE EXECUTIVE OR WHILE ON THE SYSTEM STACK, THEN A$F; MESSAGE IS PRINTED ON THE CONSOLE TERMINAL AND THE SYSTEM IS HALTED.E; ELSE A SWITCH 00g:rrßmæàmçámýfáþfDATATO THE SYSTEM STACK IS EXECUTED AND THE TASK IN WHICHO/; THE PARITY ERROR OCCURED IS LOCKED IN MEMORY.C;- .ENABL LSBS*RECURS: JMP 60$ ;;;JUMP TO HALT PROCESSOR+$PARER::INC $PARLV ;;;INTERRUPT RECURSION?M BNE RECURS ;;;IF NE YESA .IF DF P$$D70 MOV R0,-(SP) ;;;SAVE R0 MOV R1,-(SP) ;;;SAVE R1* MOV #$MPCSR,R0 ;POINT TO PARITY CSR TABLE. MOV #$MSTAT,R1 ;POINT TO PARITY CSR SAVE AREA, MOV @(R0)+,(R1)+ ;SAVE LOW ADDRESS REGISTER- MOV @(R0)+,(R1)+ ;SAVE HIGH ADDRESS REGISTERE4 MOV #-1,(R1) ;ASSUME MEM PARITY ON NONCACHE MACHINE. CMP (R0)+,#MPCSR-2 ;RUNNING ON CACHE MACHINE? BNE 2$ ;IF NE NO/ MOV @-(R0),(R1)+ ;;;SAVE MEMORY ERROR REGISTERO/ TST (R0)+ ;;;POINT TO ADDRESS OF MEM CTRL REGN/ MOV @(R0)+,(R1)+ ;SAVE MEMORY CONTROL REGISTER0% MOV #3,@-2(R0) ;TURN CACHE TRAPS OFF(, MOV @(R0)+,(R1)+ ;SAVE MAINTENANCE REGISTER* MOV @(R0)+,(R1)+ ;SAVE CACHE HIT REGISTER2$: MOV (SP)+,R1 ;;;RESTORE R1 MOV (SP)+,R0 ;;;RESTORE R0R .IFTF( BIT #CMODE,2(SP) ;;;PREVIOUS MODE USER? BNE 4$ ;;;IF NE YESA .IFTO%3$: TST $STAT ;;;FATAL MEMORY ERROR?I BGT 301$ ;;;IF GT NO JMP 20$ ;;;O$301$: MOV R0,-(SP) ;;;SAVE REGISTERS MOV R1,-(SP) ;;;(0 MOV #$ERTRK,R1 ;;;POINT TO ERROR TRACKING TABLE% CALL 14$ ;;;EXECUTE CACHE ALGORITHME" MOV (SP)+,R1 ;;;RESTORE REGISTERS MOV (SP)+,R0 ;;;, RTI ;;;RETURN FROM TRAP .IFFV(3$: BR 20$ ;;;FATAL MEMORY PARITY ERROR .IFTF/4$: DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITY. F  .IFTM ,;P=; FIND THE REGION WITH THE PARITY ERROR AND LOCK IT IN MEMORY$;S S BIT #360,$STAT ;CACHE ERROR?B BEQ 401$ ;IF EQ NO CALL LOG ;LOG CACHE ERROR- BR 11$ ;GO ONS>401$: MOV @$MPCSR+2,R0 ;GET CONTENTS OF HIGH ERROR ADDRESS REG6 MOV @$MPCSR,R1 ;GET CONTENTS OF LOW ERROR ADDRESS REG4 ASHC #-6,R0 ;DOUBLE SHIFT R0 AND R1 RIGHT SIX BITS3 MOV #$PARHD,R0 ;GET ADDRESS OF PARTITION LIST HEADF+5$: MOV (R0),R0 ;GET NEXT MAIN PCB ADDRESSS BEQ 11$ ;IF EQ END OF LIST2 CMP P.REL(R0),R1 ;DID ERROR OCCUR IN THIS REGION?, BHI 11$ ;IF HI THERE IS NO PCB FOR REGION 0 MOV P.REL(R0),R2 ;GET BASE ADDRESS OF PARTITION. ADD P.SIZE(R0),R2 ;CALCULATE END OF PARTITION, CMP R2,R1 ;DID ERROR OCCUR IN THIS REGION? BLOS 5$ ;IF LO NOD,6$: MOV P.SUB(R0),R0 ;GET NEXT SUB PARTITION BEQ 11$ ;IF EQ END OF LIST2 CMP P.REL(R0),R1 ;DID ERROR OCCUR IN THIS REGION?, BHI 11$ ;IF HI THERE IS NO PCB FOR REGION 0 MOV P.REL(R0),R2 ;GET BASE ADDRESS OF PARTITION. ADD P.SIZE(R0),R2 ;CALCULATE END OF PARTITION, CMP R2,R1 ;DID ERROR OCCUR IN THIS REGION? BLOS 6$ ;IF LO NOR2 BIS #PS.PER!PS.NSF!PS.CHK,P.STAT(R0) ;LOCK REGION BIC #PS.FXD,P.STAT(R0) ;A L  .IFFP I;N2; LOCK ALL OF THE CURRENT TASK'S REGIONS IN MEMORY2; PS.FXD IS CLEARED IN THE TASK REGION PCB TO THAT5; THE TASK IS NO LONGER FIXED. THIS WILL ASSURE THAT)=; WHEN THE TASK EXITS, IT WILL BE DETACHED FROM IT'S REGIONS. ;P F0 MOV $TKTCB,R0 ;COPY TCB ADDRESS OF CURRENT TASK& MOV T.PCB(R0),R1 ;GET TASK REGION PCB' BIC #PS.FXD,P.STAT(R1) ;UNFIX THE TASKR! ADD #T.ATT,R0 ;POINT TO ATT LISTI;7$: MOV (R0),R0 ;GET ADDRESS OF NEXT ATTACHMENT DESCRIPTOR BEQ 10$ ;IF EQ END OF LIST% TSTB A.MPCT-A.TCBL(R0) ;TASK MAPPED?  BEQ 7$ ;IF EQ NO) MOV A.PCB-A.TCBL(R0),R1 ;GET PCB ADDRESSS3 BIS #PS.PER!PS.NSF!PS.CHK,P.STAT(R1) ;LOCK REGION  BIC #PS.FXD,P.STAT(R1) ;H BR 7$ ;GO AGAINI I .IFTE H;F;; IF THIS IS A UNIBUS PARITY ERROR, NOTIFY ALL MAPPED TASKSO8; IF THIS IS A CPU PARITY ERROR, NOTIFY THE CURRENT TASK7; IN EITHER CASE, TASKS WHICH ARE FIXED BECOME UNFIXED.O;  A-701$: BIT #30000,$STAT ;UNIBUS PARITY ERROR?  BEQ 10$ ;IF EQ NO MOV R0,-(SP) ;SAVE R0 CALL LOG ;LOG THE PARITY ERROR MOV (SP)+,R0 ;RESTORE R0E3 ADD #P.ATT,R0 ;POINT TO PARTITION'S ATT DESCR LISTS58$: MOV (R0),R0 ;POINT TO NEXT ATTACHMENT DESCRIPTOR# BEQ 101$ ;IF EQ END OF LISTG% TSTB A.MPCT-A.PCBL(R0) ;TASK MAPPED?  BEQ 8$ ;IF EQ NO2 MOV A.TCB-A.PCBL(R0),R5 ;GET TCB OF ATTACHED TASK1 MOV T.PCB(R5),R4 ;GET ADDRESS OF TASK REGION PCBA' BIC #PS.FXD,P.STAT(R4) ;UNFIX THE00gBr7rn´cÚµcÛ¶c�·c›’ TASKO. MOV #AS.PEA,R4 ;GET CODE FOR PARITY ERROR AST$ TST T.ASTL(R5) ;AST ALREADY QUEUED? BEQ 9$ ;IF EQ NO MOV T.ASTL+2(R5),R1 ;. CMPB R4,A.CBL+1(R1) ;PARITY ERROR AST QUEUED? BEQ 8$ ;IF EQ YESN9$: MOV R0,-(SP) ;SAVE R0 2 CALL DASTT ;DECLARE AN AST FOR THE ATTACHED TASK MOV (SP)+,R0 ;RESTORE R0) BCC 8$ ;IF CC AST SUCCESSFULLY DECLAREDQ BIT #360,$STAT ;CACHE ERROR?B BNE 8$ ;IF NE YESA1 BIT #T2.ABO,T.ST2(R5) ;ALREADY MARKED FOR ABORT?K BNE 8$ ;IF NE YESS MOV R0,-(SP) ;SAVE R0 MOV R5,R1 ;COPY TCB ADDRESSC0 MOV #S.PRTY,R0 ;GET CODE FOR PARITY ERROR ABORT CALL $ABTSK ;ABORT THE TASKO901$: MOV (SP)+,R0 ;RESTORE R0 BR 8$ ;GO AGAINI E .IFTF E;?B; DECLARE AN AST FOR THE CURRENT TASK. IF PARITY ERROR AST IS NOT; SPECIFIED, ABORT THE TASK.;K M$10$: CALL LOG ;LOG THE PARITY ERROR, MOV $TKTCB,R5 ;GET CURRENT TASK TCB ADDRESS. MOV #AS.PEA,R4 ;GET CODE FOR PARITY ERROR AST CALL DASTT ;DECLARE ASTK& BCC 11$ ;IF CC AST HAS BEEN DECLARED R ( .IFTV 0 BIT #360,$STAT ;CACHE ERROR?C BNE 11$ ;IF NE YES D O .IFTF R MOV R5,R1 ;COPY TCB ADDRESST0 MOV #S.PRTY,R0 ;GET CODE FOR PARITY ERROR ABORT! CALL $ABTSK ;ABORT CURRENT TASKE,101$: MOV $FXRPT,R0 ;IS THE FIXER INSTALLED? BEQ 11$ ;IF EQ NOP CALL $EXRQN ;REQUEST THE FIXER :;L7; CLEAR ALL PARITY REGISTERS AND REENABLE PARITY ERRORS ;K B)11$: CALL $CLPAR ;RESET ALL PARITY CSR'SI .IFTA. MOV #$ERTRK,R1 ;POINT TO ERROR TRACKING TABLE' TST $STAT ;WAS IT ONLY A CACHE ERROR? BGT 14$ ;IF GT YES BR 16$ ;;$; PDP-11/70 CACHE TRAP;F112$: MOV $TTNS-4,-(R1) ;;;SAVE TIME OF LAST ERROR &13$: TST (R1)+ ;;;POINT TO NEXT GROUP,14$: MOVB (R1)+,R0 ;;;GET CACHE DISABLE BITS BEQ 16$ ;;;IF EQ END OF TABLEQ) BITB (R1)+,$STAT ;;;ERROR IN THIS GROUP?E BEQ 13$ ;;;IF EQ NO + CMP (R1)+,$TTNS-4 ;;;OCCUR IN SAME MINUTE?R BNE 12$ ;;;IF NE NOC, BIS R0,$MPCTL ;;;DISABLE THAT PART OF CACHE BR 14$ ;;;PROCESS NEXT GROUP916$: MOVB $MPCTL,@$MPCSR+6 ;;;LOAD CACHE CONTROL REGISTERT .ENDC;?; AT THIS POINT EVERYTHING HAS BEEN CLEANED UP AND THE USER MAY-*; INSERT CODE SPECIFIC TO HIS APPLICATION.;+;***************.; INSERT CODE HERE-ALL REGISTERS ARE AVAILABLE;***************; ; EXIT SYSTEMQ;B# DEC $PARLV ;RESET RECURSION LEVELE RETURN ;EXIT FROM TRAPC;1D; PARITY ERROR OCCURED WHILE IN EXEC CODE. THIS IS A FATAL SITUATION@; AND THE SYSTEM IS SHUT DOWN. THE USER MAY INSERT CODE SPECIFIC#; TO HIS APPLICATION AT THIS POINT.D;C20$: ;;;REF LABEL .IF DF M$$PRO+ CALL $DISAN ;DISABLE SANITY TIMERS/ALARMSD .ENDC;;;***************6;;; INSERT CODE HERE-ALL REGISTERS HAVE NOT BEEN SAVED;;;***************) MOV #60$,@#4 ;;;PLUG NONEX MEMORY VECTORX MOV R0,-(SP) ;;;SAVE R05 MOV #$EXMSG,R0 ;;;GET ADDRESS OF PARITY STOP MESSAGEC)30$: MOVB (R0)+,TPS+2 ;;;OUTPUT NEXT BYTEC BEQ 50$ ;;;IF EQ DONET40$: TSTB TPS ;;;OUTPUT DONE? BPL 40$ ;;;IF PL NOE BR 30$ ;;;GO AGAIN50$: MOV (SP)+,R0 ;;;RESTORE R0?60$: BGCK$A BF.PAR,BE.FHW,HALT ;PARITY ERROR WHILE IN EXEC CODES# BR 60$ ;;;IF CONTINUED HALT AGAIN .DSABL LSB* .PAGE;+"; **-$CLPAR-CLEAR PARITY REGISTERS; F; THIS ROUTINE CLEARS OUT ALL PARITY ERRORS IN THE MEMORY PARITY ERROR2; REGISTERS AND ENABLES PARITY ERROR NOTIFICATION.;A ; INPUTS:A;Y; NONE.S;C ; OUTPUTS:;); NONE.;;T@; NOTE: IF THE SYMBOL M$$K11 IS DEFINED (11/70 TYPE ECC MEMORY),:; THIS ROUTINE WILL NOT PROPERLY HANDLE UNIBUS ECC MEMORY7; (SUCH AS MF11S-K) SINCE THE ROUTINE ASSUMES THAT ANYT7; OTHER MEMORY ON THE SYSTEM MUST BE PARITY MEMORY ANDU9; THAT AN ATTEMPT TO SET THE SINGLE-BIT ECC ERROR BIT ONA7; SUCH A MEMORY WILL FAIL. THIS ASSUMPTION IS USED TOI2; DISTINGUISH MK11 ECC MEMORY FROM PARITY MEMORY.;- E4$CLPAR::MOV #$PARTB+2,R0 ;POINT TO PARITY CSR VECTOR10$: ;REF LABEL .IF DF M$$K11 O" TST (R0) ;EVEN WORD CSR PRESENT? BPL 20$ ;IF PL NOY4 MOV #21,@(R0)+ ;SET ENABLE AND SINGLE-BIT ECC ERROR5 BIT #20,@-(R0) ;SINGLE-BIT ECC ERROR BIT SET (M00gJrrßmæàmçámýfáþfDATAK11)?S BEQ 20$ ;IF EQ NOM7 MOV #1,@(R0)+ ;SET ENABLE BIT AND CLR REST IN 1ST WORDN3 BIC #100000,@(R0)+ ;CLEAR ERROR BIT IN SECOND WORDS BR 30$ ;420$: MOV #1,@(R0)+ ;ENABLE PARITY ERROR NOTIFICATION M .ENDC7 MOV #1,@(R0)+ ;ENABLE PARITY (OR UNIBUS MEM ECC) NOTIF;(30$: CMP R0,#$PARTB+2+<16.*2> ;DONE YET? BLO 10$ ;IF LO NOK   .IF DF P$$D70 R8 MOV @$MPCSR+4,-(SP) ;CLEAR MEMORY SYSTEM ERROR REGISTER MOV (SP)+,@$MPCSR+4 ; E .ENDC # @ RETURN ;- ;+4; THE FORMAT OF ERROR LOGGING PACKETS IS AS FOLLOWS:;03; +-----------------------------------------------+0 ; | |&; \ FIXED ERROR LOGGING INFORMATION \ ; | |3; +-----------------------------------------------+.2; | CACHE REGISTER EXISTENCE MASK (SEE BELOW) | 03; +-----------------------------------------------+E/; | PARITY CSR EXISTENCE MASK (SEE BELOW) | 23; +-----------------------------------------------+E;T; PARITY CSRS:;C"; ADDRESS BIT VALUE IN MASK AT 23; +-----------------------------------------------+S; | 172100 000001 | 4-3; +-----------------------------------------------+|; | 172102 000002 | 6N3; +-----------------------------------------------+-; | 172104 000004 | 10 3; +-----------------------------------------------+- ; \ \3; +-----------------------------------------------+E; | 172134 040000 | 40|3; +-----------------------------------------------+-; | 172136 100000 | 42C3; +-----------------------------------------------+-;- ; CACHE CSRS:-; -3; +-----------------------------------------------+-3; | 177740 LOW ERROR ADDRESS 000001 | 4403; +-----------------------------------------------+-3; | 177742 HIGH ERROR ADDRESS 000002 | 46-3; +-----------------------------------------------+3; | 177744 CACHE ERROR REGISTER 000004 | 503; +-----------------------------------------------+-3; | 177746 CACHE CONTROL REGISTER 000010 | 52C3; +-----------------------------------------------+-3; | 177750 CACHE MAINTENANCE REGISTER 000020 | 54-3; +-----------------------------------------------+R3; | 177752 CACHE HIT/MISS REGISTER 000040 | 56-3; +-----------------------------------------------+D .PAGE;+; LOG PARITY ERROR IN A TASK;-; THE FOLLOWING MAY BE LOGGED:;!; 16 WORDS OF MEMORY PARITY CSR'S ; 6 WORDS OF CACHE PARITY CSR'S;-/LOG: BIT #ES.LOG,$ERFLA ;ARE WE LOGGING ERRORS?  BEQ 30$ ;IF EQ NO  INC $ERRSQ ;COUNT THE ERROR-7 MOV #E$CMEM+,R0 ;GET CODE FOR PARITY ERRORN, MOV #<24.*2>,R1 ;GET SIZE OF DATA SUBPACKET5 MOV #SM.HDR!SM.TSK!SM.DAT,R2 ;GET CONTROL MASK BITSH' CLR R3 ;NO BEGINNING ADDRESS FOR DATA-, MOV $TKTCB,R4 ;SET CURRENT TASK TCB ADDRESS! CLR R5 ;INDICATE NO UCB ADDRESSI* CALL $CRPKT ;CREATE THE ERROR LOG PACKET BCS 30$ ;IF CS NO PACKET4 CMP (R1)+,(R1)+ ;SKIP OVER CACHE CSR AND PARITY CSR ;EXISTENCE MASKS;A; FILL IN PARITY CSRS AND MASK;I1 MOV #$MEMR1,R2 ;POINT TO MEMORY PARITY CSR TABLEM CLR -(SP) ;SET PROTOTYPE MASKP210$: MOV #-1,(R1)+ ;ASSUME REGISTER DOES NOT EXIST& CMP #160000,(R2)+ ;REAL CSR ADDRESS ?# BHI 15$ ;IF HI NO, LEAVE -1 THEREB/ MOV @-2(R2),-2(R1) ;REPLACE -1 WITH REAL THINGU2 BIS $BTMSK-$MEMR1-2(R2),(SP) ;INDICATE CSR EXISTS&15$: CMP R2,#$MEMR1+<16.*2> ;DONE YET? BLO 10$ ;IF LO NO 7 MOV (SP)+,-44+2(R1) ;FILL IN PARITY CSR EXISTENCE WORDN .IF DF P$$D70, MOV #$MPCSR,R2 ;POINT TO CACHE PARITY CSR'S1 MOV #$MSTAT,R0 ;POINT TO SAVED CACHE PARITY CSRSS CLR -(SP) ;SET PROTOTYPE MASKY220$: MOV #-1,(R1)+ ;ASSUME REGISTER DOES NOT EXIST& CMP #160000,(R2)+ ;REAL CSR ADDRESS ?# BHI 25$ ;IF HI NO, LEAVE -1 THERE-, MOV (R0),-2(R1) ;REPLACE -1 WITH REAL THING2 BIS $BTMSK-$MPCSR-2(R2),(SP) ;INDICATE CSR EXISTS(25$: TST (R0)+ ;POINT TO NEXT CSR VALUE CMP R2,#$MPCSR+<6*2>;DONE YET? BLO 20$ ;IF LO NO;4 MOV (SP)+,-60(R1) ;FILL IN CACHE CSR EXISTENCE WORD .IFF ; DF P$$D70I+ CLR -44(R1) ;INDICATE NO CACHE CSRS EXISTT .ENDC ; DF P$$D70) CALL $QUPKT ;QUEUE THE ERROR LOG PACKET:00gRrhUrn´cÚµcÛ¶c�·c›’30$: RETURN ;S E .PAGE O;+; DASTT;P:; DECLARE A PARITY ERROR AST AND SET UP THE AST PARAMETERS;- ; INPUTS:M;(2; R4=CODE INDICATING WHICH AST SHOULD BE DECLARED.;; R5=ADDRESS OF THE TCB OF THE TASK TO DECLARE THE AST FOR.T; ; OUTPUTS:;6; C=1 IF THE TASK IS NOT SETUP FOR A PARITY ERROR AST.3; C=0 IF THE TASK IS SET UP FOR A PARITY ERROR AST.<; THE AST PARAMETERS ARE MOVED TO THE AST CONTROL BLOCK.*; R1=ADDRESS OF THE AST CONTROL BLOCK.;- E#DASTT: CALL $DASTT ;DECLARE AN AST , BCS 100$ ;IF CS AST HAS NOT BEEN SPECIFIED4 ADD #A.PRM,R1 ;POINT TO PARAMETER LIST IN AST BLOCK0 MOV -2(R1),(R1) ;MOVE NUMBER OF AST PARAMETERS / ASL (R1)+ ;CALCULATE NUMBER OF BYTES ON STACKE S O .IF DF M$$PRO R$ MOVB $PROCN,(R1)+ ;GET PROCESSOR ID TSTB (R1)+ ;SKIP TO NEXT WORDO S .IFF= F CLR (R1)+ ;CLEAR PROCESSOR IDE R .ENDC  H1 MOV #$MPCSR,R0 ;POINT TO MEMORY STATUS REGISTERS.>10$: MOV @(R0)+,(R1)+ ;LOW / HIGH ERR, MEM SYS ERR, CACHE CTRL! CMP R0,#$MPCSR+<4.*2> ;DONE YET?0 BLO 10$ ;IF LO NO 3 MOV #$PARTB+2,R0 ;POINT TO MEMORY PARITY CSR TABLES520$: MOV @(R0)+,(R1)+ ;GET MEMORY PARITY CSR CONTENTSR" CMP R0,#$PARTB+<16.*2> ;DONE YET? BLO 20$ ;IF LO NOE CLC ;INDICATE SUCCESS100$: RETURN ; + .ENDC ; DF P$$RTY .END ;SKIP TO NEXT WORDO S .IFF= F CLR (R1)+ ;CLEAR PROCESSOR IDE R .ENDC  H1 MOV #$MPCSR,R0 ;POINT TO MEMORY STATUS REGISTERS.>10$: MOV @(R0)+,(R1)+ ;LOW / HIGH ERR, MEM SYS ERR, CACHE CTRL! CMP R0, .TITLE QITBLB .IDENT /03.01/;;E8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;C ; B. S. MCCARTHY 20-JUL-81 ;; ; POLISH INTERPRETER DATA BASE; J; THIS MODULE WAS SPLIT OUT OF DRTBL TO ALLOW THE QIO DIRECTIVE AND THIS6; TABLE TO BE PLACED IN THE SECOND DIRECTIVE COMMON.;L;E; PREVIOUSLY MODIFIED BY: ;B; J. KAUFMAN; B. S. MCCARTHY; J. W. BERZLE;I; -; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:.;$; ERIC POSTPISCHIL 12-DEC-86 03.00;C<; edp040 -- ADD SON OF GET DEVICE INFORMATION SUBFUNCTION; TO GIN DIRECTIVE."; B. S. MCCARTHY 5-MAR-87 03.01;6; BM384 -- MOVE DRGIN DISPATCH TABLE INTO DRGIN FOR#; INSERTION INTO VECTOR COMMON. ;T';N( .PAGES ;**-42TU;+3V; POLISH INTERPRETER DATA BASE FOR QIO PROCESSINGDW; !X; FUNCTION CODE DISPATCH VECTORSY;-Z+[$FCDSP::.WORD FCIFC ;10-ILLEGAL FUNCTIONF0\ .WORD $FCPKT ;11-FIND FILE NAME IN DIRECTORY]^ .IF DF R$$LKL_ ` .WORD UNLCK ;12-UNLOCK BLOCKab .IFFFc$d .WORD FCIFC ;12-ILLEGAL FUNCTIONef .ENDCg4h .WORD $FCPKT ;13-REMOVE FILE NAME FROM DIRECTORY1i .WORD $FCPKT ;14-ENTER FILE NAME IN DIRECTORYN(j .WORD FCACC ;15-ACCESS FILE FOR READ2k .WORD FCACC ;16-ACCESS FILE FOR READ AND WRITE8l .WORD FCACC ;17-ACCESS FILE FOR READ, WRITE, AND EXT!m .WORD FCDAC ;20-DEACCESS FILE:&n .WORD FCRVB ;21-READ VIRTUAL BLOCK'o .WORD FCWVB ;22-WRITE VIRTUAL BLOCKOp .WORD FCEXT ;23-EXTEND FILE.q .WORD FCCRE ;24-CREATE FILE6r .WORD FCDEL ;25-MARK FILE FOR DELETE/TRUNCATE FILE)s .WORD $FCPKT ;26-READ FILE ATTRIBUTESI*t .WORD $FCPKT ;27-WRITE FILE ATTRIBUTES2u .WORD $FCPKT ;30-USER MAGTAPE CONTROL FUNCTION,v .WORD FCWVB ;31-TRANSMIT PROCESS MESSAGE+w .WORD FCRVB ;32-RECEIVE PROCESS MESSAGE1&x .WORD FCCON ;33-CONNECT TO PROCESS+y .WORD FCDIS ;34-DISCONNECT FROM PROCESSF,z .WORD FCNCT ;35-NETWORK CONTROL FUNCTION${ .WORD FCIFC ;36-ILLEGAL FUNCTION$| .WORD FCIFC ;37-ILLEGAL FUNCTION}~ .PAGE€� .IF NDF M$$NETK‚,ƒFCCON: ;REF LABEL IF NO NETWORK SUPPORT,„FCDIS: ;REF LABEL IF NO NETWORK SUPPORT,…FCNCT: ;REF LABEL IF NO NETWORK SUPPORT†‡ .IFTFˆ‰;CŠ; ILLEGAL FUNCTION‹;RŒ3�FCIFC: .WORD $IEIFC ;SET ILLEGAL FUNCTION STATUSSŽ�;1:�; AC00hZriarßmæàmçámýfáþfDATACESS FILE FOR READ, READ/WRITE, OR READ/WRITE/EXTEND‘;C’;“FCACC: .WORD $CKDMO ;CHECK IF VOLUME MARKED FOR DISMOUNTN7” .WORD $CKALN ;CHECK IF FILE ALREADY ACCESSED ON LUN3•– .IF DF M$$MUP—7˜ .WORD $CKMOU ;CHECK IF VOLUME MOUNTED FOR THIS USERL™š .ENDC›%œ .WORD $BDPKT ;BUILD AN I/O PACKETN"� .WORD $CKLHD ;LOCK DOWN HEADER,ž .WORD $CKIWN ;INCREMENT WINDOW I/O COUNT-Ÿ .WORD $CKRLK ;SYNCHRONIZE ACCESS AND EXITO ¡; ¢; DEACCESS FILEI£;A¤5¥FCDAC: .WORD $CKNLN ;CHECK IF FILE ACCESSED ON LUNA%¦ .WORD $BDPKT ;BUILD AN I/O PACKETD"§ .WORD $CKLHD ;LOCK DOWN HEADER,¨ .WORD $CKIWN ;INCREMENT WINDOW I/O COUNT© .WORD $CKRLK ;EXITª«;F¬; READ VIRTUAL BLOCK­;O®5¯FCRVB: .WORD $CKNLN ;CHECK IF FILE ACCESSED ON LUN,° .WORD $CKRAC ;CHECK READ ACCESS AND EXIT±²;H³; WRITE VIRTUAL BLOCK.´;$µ5¶FCWVB: .WORD $CKNLN ;CHECK IF FILE ACCESSED ON LUNR-· .WORD $CKWAC ;CHECK WRITE ACCESS AND EXITF¸¹;Aº; CREATE FILEO)»; CREATE & ACCESS NOT LEGAL COMBINATION/¼; CREATE & EXTEND DOES NOT INCR PENDING COUNT$½; SINCE NO WINDOW¾;¿;ÀFCCRE: .WORD $CKDMO ;CHECK IF VOLUME MARKED FOR DISMOUNTT7Á .WORD $CKALN ;CHECK IF FILE ALREADY ACCESSED ON LUNOÂFCDEL:ÃÄFCEXT:ÅÆ;DEÇ; BUILD AN I/O PACKET FOR FIND, ENTER, REMOVE, EXTEND, DELETE, READR$È; ATTRIBUTES, AND WRITE ATTRIBUTESÉ;DÊ Ë$FCPKT::ÌÍ .IF DF M$$MUPÎ7Ï .WORD $CKMOU ;CHECK IF VOLUME MOUNTED FOR THIS USERÐÑ .ENDCÒ%Ó .WORD $BDPKT ;BUILD AN I/O PACKETO"Ô .WORD $CKLHD ;LOCK DOWN HEADER,Õ .WORD $CKIWN ;INCREMENT WINDOW I/O COUNTÖ .WORD $CKXIT ;EXITר; "Ù; EXPLICIT UNLOCK BLOCK FUNCTIONÚ;$ÛÜ .IF DF R$$LKLÝ5ÞUNLCK: .WORD $CKNLN ;CHECK IF FILE ACCESSED ON LUN(ß .WORD $UNLXT ;SET REGISTERS AND EXITàá .ENDCâã .IFFRäå;Ræ; CONNECT TO PROCESSç;è;éFCCON: .WORD $CKDMO ;CHECK IF VOLUME MARKED FOR DISMOUNT;9ê .WORD $CKALN ;CHECK IF PROCESS ALREADY CONNECTED ON Lëì .IF DF X$$HDRí0î .WORD $CKHDR ;CHECK IF EXTERNAL HEADER VALIDïð .ENDC ;X$$HDRñ7ò .WORD $CKCON ;ADDRESS CHECK CONNECT BUFFER AND EXITX"ó .WORD $CKLHD ;LOCK DOWN HEADER.ô .WORD $CKRLK ;INTERLOCK LUN USAGE AND EXITõö;F÷; DISCONNECT FROM PROCESSOø;Nù9úFCDIS: .WORD $CKNLN ;CHECK IF PROCESS CONNECTED ON LUN2û .WORD $CKDIS ;CHECK BUFFER AND COPY PARAMETERS"ü .WORD $CKLHD ;LOCK DOWN HEADER.ý .WORD $CKRLK ;INTERLOCK LUN USAGE AND EXITþÿ;N; NETWORK CONTROL FUNCTION;;FCNCT: .WORD $CKDMO ;CHECK IF VOLUME MARKED FOR DISMOUNTC .IF DF X$$HDR0 .WORD $CKHDR ;CHECK IF EXTERNAL HEADER VALID  .ENDC ; DF X$$HDR +  .WORD $CKPRM ;COPY PARAMETERS TO PACKETX"  .WORD $CKLHD ;LOCK DOWN HEADER  .WORD $CKXIT ;EXIT .ENDC; H; TABLE OF SPECIAL FUNCTION CODES TO BE CHECKED BY SOFTWARE WRITE LOCK;S $WLKTB:: ;DEVICE DEPENDENT CODES$# .WORD IO.SMD ;SET MEDIA DENSITY# .WORD IO.EOF ;WRITE END OF FILEN .WORD IO.ERS ;ERASE TAPE% .WORD IO.DSE ;DATA SECURITY ERASEN ;DIAGNOSTIC CODES' .WORD IO.WDH ;WRITE DATA AND HEADERR( .WORD IO.WTD ;WRITE TRACK DESCRIPTOR2 .WORD IO.TDD ;WRITE TRACK DESCRIPTOR DISPLACED)  .WORD IO.CEW ;WRITE BLOCK ON CE TRACK;!," .WORD 0 ;TERMINATOR FOR WRITE LOCK TABLE#F .END ;**-34D BY SOFTWARE WRITE LOCK;S $WLKTB:: ;DEVICE DEPENDENT CODES$# .WORD IO.SMD ;SET MEDIA DENSITY# .WORD IO.EOF  .TITLE DYDRVT .IDENT /04.09/?;B;07; COPYRIGHT (C) 1984 BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;" ; M. BAGGETT/R. PERRON 05-JUN-79 ; PREVIOUSLY MODIFIED BY:B ; ; R. T. PERRON; P. J. CARR; P. J. BEZEREDI; J. GALLANT ; T. LEKAS ; L. KOGAN;; ); MODIFIED BY: 15-AUG-86 4.09;U=00ibrUrn´cÚµcÛ¶c�·c›’; G. MARIGOWDA GM001 -- CONVERT TO USE EXEC VECTORINGY;; !<; RX211- NPR FLOPPY DISK DRIVERR=;>; FUNCTIONS RECOGNIZED:>?; IO.RPB - READ PHYSICAL BLOCK (MAY READ ANY SECTOR ON DISK)@@; IO.WPB - WRITE PHYSICAL BLOCK (MAY WRITE ANY SECTOR ON DISK):A; IO.WDD - WRITE DELETED DATA - WRITE ANY SECTOR ON DISK5B; SETTING THE DELETED DATA MARK IN SECTOR HEADERRC; DD; THE FOLLOWING FUNCTION CODES OPERATE ON 256. WORD BLOCKS OF DATACE; (4 SECTORS FOR SINGLE DENSITY OR 2 SECTORS FOR DOUBLE DENSITY). FF; THE DRIVER AUTOMATICALLY INTERLEAVES AND SKEWS SECTORS TO OPTIMIZEDG; THE TRANSFER OF DATA SO THAT A LONG TRANSFER MAY BE DONE WITHOUTEH; LOOSING A REVOLUTION OF THE DISK. THE INTERLEAVE FACTOR IS 2 AND I; THE SKEW FACTOR IS 6. .J; IO.RLB - READ LOGICAL BLOCKS OF 256. WORDS0K; IO.WLB - WRITE LOGICAL BLOCKS OF 256. WORDS.L;ABM; THE FOLLOWING FUNCTION CODES ARE USED TO INITIALIZE THE FLOPPYGN; TO SINGLE OR DOUBLE DENSITY AND TO REPORT WHICH DENSITY THE CURRENTOO; FLOPPY IS.P; IO.SMD - SET MEDIA DENSITY(Q; IO.SEC - SENSE MEDIA CHARACTERISTICSR;EES; IF DELETED DATA IS READ, THE STATUS CODE RETURNED WILL BE IS.RDD, T; OTHERWISE IT WILL BE IS.SUC.U;TV7V .MCALL HWDDF$,PKTDF$,PCBDF$,QIOSY$,SCBDF$ ; GM001V QIOSY$ ; GM001C!V SCBDF$ ,,SYSDEF ; GM001E/X HWDDF$ ; DEFINE HARDWARE REGISTERS ;**-1L'Y PKTDF$ ; DEFINE I/O PACKET OFFSETSZ Z PCBDF$ ; DEFINE PCB OFFSETS[\;T]; EQUATED SYMBOLS ^;T_!`RETRY = 10 ; ERROR RETRY COUNTS0aCEW = 4 ; RETRY COUNT FOR IO.SMD AND IO.SEC'S/bDYNUM = 6 ; NUMBER OF REGISTERS TO ERROR LOG,3cMEMSIZ = 7600 ; 124K OF MEMORY IN 32 WORD BLOCKSW&dAPR5DS = 120000 ; APR5 DISPLACEMENT&eAPR6DS = 140000 ; APR6 DISPLACEMENT,fLOOP = 1000 ; COUNTER TO CHECK FOR TR BITgh;Di; U.CW2 BITS USAGEj;Fk#lDELDAT = 100 ; DELETED DATA READ"mERR1 = 2000 ; TIMEOUT ERROR BITnDEN = 4000 ; DENSITY BITB)oRSAE = 10000 ; READ STATUS AFTER ERROR.pSCHAR = 40000 ; SENSE MEDIA CHARACTERISTICS6qSILO = 100000 ; FUNCTION ISSUED WAS A SILO FUNCTIONrs;Et; U.CW3 WORD USAGEu;,v!wSINGLE = 494. ; SINGLE DENSITY3!xDOUBLE = 988. ; DOUBLE DENSITY;yz;P/{; DEVICE REGISTER OFFSETS AND BIT DEFINITIONS|;P}%~RXCS= 0 ; CONTROL STATUS REGISTER€GO = 1 ; GO BIT�UNIT = 20 ; UNIT SELECT BIT‚DONE = 40 ; DONE BIT1"ƒINTEBL = 100 ; INTERRUPT ENABLE+„TR = 200 ; TRANSFER READY BIT (CPU-SILO)D…SDEN = 400 ; DENSITY BIT %†RX211 = 4000 ; RX211 INDICATOR BIT$‡INIT = 40000 ; INITIALIZATION BITˆERR = 100000 ; ERROR BIT‰"ŠRXDB = 2 ; DATA BUFFER REGISTER‹)ŒRXES = 2 ; RX211 ERROR STATUS REGISTERU�ŽCRCERR = 1 ; CRC ERROR BITR#�INITDN = 4 ; INITIALIZE DONE BIT!�RXACLO = 10 ; RX221 AC LOW BITT"‘DENERR = 20 ; DENSITY ERROR BIT-’DRVDEN = 40 ; SELECTED DRIVE'S DENSITY BIT;7“DELDAT = 100 ; DELETED DATA BIT (USED IN U.CW2 ALSO)0*”DRVRDY = 200 ; SELECTED DRIVE READY BIT#•UNTSEL = 400 ; UNIT SELECTED BIT *–WCOVFL = 2000 ; WORD COUNT OVERFLOW BIT'—NXM = 4000 ; NON-EXISTENT MEMORY BIT ˜™;š; FUNCTION CODES›; œ �FILL = INTEBL!0!GO ; FILL SILO"žEMPTY = INTEBL!2!GO ; EMPTY SILO&ŸWRITE = INTEBL!4!GO ; WRITE A SECTOR$ READ = INTEBL!6!GO ; READ A SECTOR+¡SETDEN = INTEBL!10!GO ; SET MEDIA DENSITYR/¢MRDS = INTEBL!12!GO ; MAINTENANCE READ STATUSI+£WRTDD = INTEBL!14!GO ; WRITE DELETED DATAI(¤RDERC = INTEBL!16!GO ; READ ERROR CODE¥¦;A§; LOCAL DATA¨;04©; RETRY COUNT TABLE (INDEXED BY CONTROLLER NUMBER)ª;L'«DYPCB: .WORD 0 ; ADD OF PCB OF DYCOMR1¬DYCOM: .RAD50 /DYCOM/ ; NAME OF DY DATA COMMONI,­BFLAG: .BLKW R$$X21 ; BUFFERING DATA FLAG® ; = 0 DO NOT BUFFER DATA¯ ; = 1 BUFFER DATAR°;±RTTBL: .BLKW R$$X21 ; ERROR RETRY COUNT FOR CURRENT UNIT 7²CSRSV: .BLKW R$$X21 ; WORD TO SAVE CSR FUNCTION CODEE8³COUNT: .BLKW R$$X21 ; COUNT OF BYTES TRANSFERED IN IB=´WCOUNT: .BLKW R$$X21 ; COUNT OF DATA LEFT TO BE MOVED (FORAµ ; WRITE OPERATION 00ijrarßmæàmçámýfáþfDATAONLY) <¶BUFLEN: .BLKW R$$X21 ; LENGTH OF INTERMEDIATE BUFFER (IB):·PHYADD: .BLKW R$$X21 ; PHYSICAL ADD OF USER BUFFER (LO):¸HIADD:: .BLKW R$$X21 ; PHYSICAL ADD OF USER BUFFER (HI):¹LOPHYA: .BLKW R$$X21 ; LO ORDER 16 BITS OF PHY ADD (IB)9ºHIPHYA: .BLKW R$$X21 ; HI ORDER 2 BITS OF PHY ADD (IB)2»DYPTR: .BLKW R$$X21 ; POINTER IN DY DATA COMMON;¼TEMP: .BLKW R$$X21 ; TEMPORY COUNTER WHEN DOING MULTIPLEB ½ ; FORKSK<¾RETPTR: .BLKW R$$X21 ; TEMPORY STORAGE FOR RET ADDRESS OF%¿ ; SUBROUTINE WHEN CALLING $FORKX$À ; NOTHING CAN BE ON STACK WHENÁ ; CALLING $FORKX7ÂCONCNT: .WORD 0 ;# OF CONTROLLERS CONNECTED TO DYCOM$Â; ; GM001+Â; MAKE GTPKT$ A LOCAL MACRO ; GM001 Â; ; GM0015 .MACRO GTPKT$ DEV,NCTRLR,ADDR,UCBSV,SUC ; GM001F CALL @GTPKT ; GM001R .IF B ; GM001 BCC 65535$ ; GM001 RETURN ; GM001LÂ65535$: ; GM001 .IFF ; GM001P BCS ADDR ; GM001 .ENDC ; GM001 .IF B ; GM001  $$$=0 ; GM001 .IF B ; GM001W .IF EQ $$$ ; GM001! MOV R5,S.OWN(R4) ; GM0011 .ENDC ; GM001 .ENDC ; GM001 .IFF ; GM001R  .IF GT NCTRLR-1 ; GM001! MOV R5,UCBSV(R3) ; GM001  .IFF ; GM001  MOV R5,UCBSV ; GM001  .ENDC ; GM001 .ENDC ; GM001 .ENDM ; GM001Â; ; GM0012Â; EXECUTIVE ENTRY POINT VECTOR TABLE ; GM001Â; ; GM001 ; GM001 <ÂEXEVEC: .WORD 0 ; FLAG FOR VECTOR NOT YET FILLED ; GM001 ; GM001R$ ALOCB: .WORD $ALOCB ; GM001# BLXI: .WORD $BLXIO ; GM0010$ DEACB: .WORD $DEACB ; GM001$ DTOER: .WORD $DTOER ; GM001$ DVERR: .WORD $DVERR ; GM001$ ERRSQ: .WORD $ERRSQ ; GM001" FORK: .WORD $FORK ; GM001$ FRKHD: .WORD $FRKHD ; GM001$ GTPKT: .WORD $GTPKT ; GM001$ HFMSK: .WORD $HFMSK ; GM001$ IODON: .WORD $IODON ; GM001$ LDREG: .WORD $LDREG ; GM001$ MPPHY: .WORD $MPPHY ; GM001$ MPUBM: .WORD $MPUBM ; GM001$ SCERR: .WORD $SCERR ; GM001$ SRNAM: .WORD $SRNAM ; GM001$ STMAP: .WORD $STMAP ; GM001$ VOLVD: .WORD $VOLVD ; GM001 ; ; GM001) EXEVCL=<<<.-EXEVEC>/2>-1> ; GM001R ; ; GM001Ä; ;**-1Å; DRIVER DISPATCH TABLEÆ;TÇ2È DDT$ DY,R$$X21,,,,NEW ; GENERATE DISPATCH TABLEÉÊ;+1Ë; *** - DYINI FLOPPY DISK CONTROLLER INITIATORWÌ;LFÍ; THIS ROUTINE IS ENTERED FROM THE QIO DIRECTIVE WHEN AN I/O REQUESTIÎ; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPOGATE THERFÏ; EXECUTION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY,GÐ; THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST. OTHERWISE2MÑ; A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFULCHÒ; THE NEXT I/O OPERATION IS INITIATED. A RETURN TO THE CALLER IS THEN Ó; EXECUTED. Ô;N Õ; INPUTS:K5Ö; R5 - ADDRESS OF UCB OF CONTROLLER TO BE INITIATEDE×;M Ø; OUTPUTS:>Ù; IF THE CONTROLLER ASSOCIATED WITH THE SPECIFIED UCB IS NOTCÚ; BUSY AND AN I/O REQUEST IS WAITING TO BE PROCESSED, THE REQUESTF@Û; IS DEQUEUED AND THE DRIVER INITIATES THE REQUESTED FUNCTION.Ü;DÝ;- Þ .ENABL LSBE/ßDYINI: GTPKT$ DY,R$$X21 ; GET NEXT I/O PACKET à;T2á; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKTâ;I"ã; R1 - ADDRESS OF THE I/O PACKET7ä; R2 - PHYSICAL UNIT NUMBER OF DEVICE TO BE INITIATEDKå; R3 - CONTROLLER INDEXFæ; R4 - ADDRESS OF SCBEç; R5 - ADDRESS OF THE UCBFè;C)é; FLOPPY DISK I/O REQUEST PACKET FORMAT ê;T#ë; WD. 00 -- I/O QUEUE THREAD WORDI1ì; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBERN3í; WD. 02 -- ADDRESS OF TCB OF THE REQUESTING TASKCî; WD. 03 -- POINTER TO SECOND LUN WORD OF REQUESTING TASKS HEADER 7ï; WD. 04 -- CONTENTS OF FIRST LUN WORD ( UCB ADDRESS)T@ð; WD. 05 -- I/O FUNCTION CODE (IO.RLB, IO.RPB, IO.WLB, I00irrUrn´cÚµcÛ¶c�·c›’O.WPB, ñ; IO.WDD, IO.SMD OR IO.SEC)1ò; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCKC1ó; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCKD<ô; WD. 10 -- I/O STATUS BLOCK ADDRESS DISPLACEMENT + 1400004õ; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE,ö; WD. 12 -- RELOCATION BIAS OF DATA BUFFER,÷; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER)ø; WD. 14 -- NUMBER OF BYTES TO TRANSFER ù; WD. 15 -- NOT USED (IGNORED)7ú; WD. 16 -- LOW BYTE MUST BE ZERO, HIGH BYTE NOT USEDI.û; WD. 17 -- LOGICAL OR PHYSICAL BLOCK NUMBERü; WD. 20 -- NOT USEDý;-'þ; DRIVER USAGE OF WORDS IN I/O PACKET7ÿ; I.PRM+6 (WD. 15) - STATUS REGISTER AFTER INTERRUPT 8; I.PRM+10 (WD. 16) - LOGICAL OR PHYSICAL BLOCK NUMBER/; I.PRM+12 (WD. 17) - SIZE OF "THIS" TRANSFER6; I.PRM+14 (WD. 20) - PHYSICAL SECTOR NUMBER (1-26.)5; I.PRM+15 (WD. 20) - PHYSICAL TRACK NUMBER (0-76.)R;Y;OA; WHEN BRINGING RX02 CONTROLLER ONLINE, HRC ISSUES AN IO.SMD TOEC; DYDRV. OFFSETS I.PRM+12 AND I.PRM+14 GET RELOCATED TO I.PRM+14 ?; AND I.PRM+16 BY $VOLVD ROUTINE. $VOLVD THINKS THAT IT IS ANOA ; IO.STC FUNCTION AND DOES THE RELOCATE. IN $IOFIN, IF I.PRM+16NC ; IS NOT A VALID BUFFER ADDESS (> 140000) OR ZERO, THE SYSTEM CANC ; CRASH OR DESTROY A LOCATION IN MEMORY.SINCE IO.SMD IS ONLY USED F ; FOR RX02 DEVICE, A SPECIAL CHECK IS MADE IN THE DRIVER FOR IO.STC.7 ; IF THE FUNCTION IS IO.STC THEN I.PRM+16 IS CLEARED.R.; THE DRIVER DOES NOT USE LOCATION I.PRM+16.;F; ;+; INITIALIZE DRIVERO; ( MOV #RETRY,RTTBL(R3); SET RETRY COUNT6 BIC #^C,U.CW2(R5); CLEAR DYNAMIC UCB FLAG BITS1 CALL @VOLVD ;VALIDATE VOLUME VALID ; GM001& BCS 20$ ; IF CS WE FAILED ;**-1* MOV I.FCN(R1),-(SP) ; GET FUNCTION CODE' BIC #7,(SP) ; REMOVE QUALIFIER BITS < CMP #IO.STC,(SP) ; IS IT A SET CHARACTERISTICS FUNCTION ? BNE 5$ ; NOT8 CLR I.PRM+16(R1) ; CLEAR THIS FOR THE BLOCK LOCK CODE ; IN $IOFIND&5$: TST (SP)+ ; RESTORE STACK LEVEL TST R0 ; TRANSFER FUNCTION?  BPL 20$ ; IF PL NO,! TSTB I.PRM+10(R1) ; HIGH BLOCK SPECIFIED?" BEQ 30$ ; IF EQ NO#10$: JMP 380$ ; YES, ERRORD$20$: JMP 440$ ; ERROR%;&; CHECK FOR A VALID FUNCTION';.(30$: MOV S.CSR(R4),R2 ; RETRIEVE CSR ADDRESS3) CMPB #IO.SEC/256.,I.FCN+1(R1) ; VALID FUNCTION?(-* BNE 60$ ; IF NE, IT MUST BE READ OR WRITE9+ MOVB #CEW,RTTBL(R3) ; IO.SEC AND IO.SMD ONLY 4 RETRIESO', MOV I.FCN(R1),R0 ; GET FUNCTION CODES%- BIC #7,R0 ; REMOVE QUALIFIER BITSR*. CMP #IO.SEC,R0 ; SENSE CHARACTERISTICS?/ BNE 40$ ; IF NE NO,0 JMP DYSEC ; GET DISKETTE CHARACTERISTICS*140$: CMP #IO.SMD,R0 ; SET MEDIA DENSITY?2 BNE 50$ ; IF NE NO23 BITB #US.MNT!US.FOR,U.STS(R5) ; DEVICE MOUNTED?4 BEQ 50$ ; IF EQ YESR95 MOV R0,I.FCN(R1) ; SET FUNCTION CODE WITHOUT MODIFIERSN$6 JMP DYSMD ; SET DISKETTE DENSITY-750$: MOV #IE.IFC&377,R0 ; RETURN ERROR CODEN8 JMP 420$ ; EXITE960$: ; REF LABEL :; );; SET UP MAPPING AND FIRST DISK ADDRESSI<;B=>7> BIT #HF.UBM,@HFMSK ; UNIBUS MAP PRESENT ? ; GM001F@ BEQ 61$ ; NO ;**-1I&A CLR BFLAG(R3) ; NO BUFFERING NEEDEDB=B CALL @STMAP ; SET UP 11/70 UNIBUS MAPPING ADDRS ; GM001!D ;**-1D1E SWAB U.BUF(R5) ; POSITION EXTENDED MEMORY BITS, F BR 69$ G61$: MOV R2,-(SP) ; SAVE R2I0H MOV U.BUF(R5),R0 ; GET ADDRESS EXTENSION BITS2I MOVB U.BUF+1(R5),-(SP); SAVE THE EXTENSION BITS/J MOV U.BUF+2(R5),R2 ; GET USER BUFFER ADDRESS *K ADD I.PRM+4(R1),R2 ; FIND END OF BUFFER'L ADCB (SP) ; GET ANY LEFT OVER CARRYP'M BITB #^C303,(SP)+ ; 22 BIT ADDRESS ? N BNE 62$ ; YES - DO BUFFERING.O ASH #4,R0 ; GET BITS 17 & 18 INTO POSITION P BR 63$ ;&Q62$: MOV #1,BFLAG(R3) ; DO BUFFERINGR MOV (SP)+,R2 ; RESTORE R2 S BR 65$ ;*T63$: CLR BFLAG(R3) ; NO BUFFERING NEEDED+U BIC #^C<30000>,R0 ; ISOLATE BITS 12 & 13X-V MOV R0,U.BUF(R5) ; SAVE HI BITS OF ADDRESSHW MOV (SP)+,R2 ; RESTORE R2 X BR 69$ ;BY65$: MOV I.PRM+2(R1),PHYADD(R3); PHYSICAL ADD OF USER BUFFER(LO)%Z CLR HIADD(R3) ; CLEAR00izrarßmæàmçámýfáþfDATA HIGH ADDRESSP?[ MOVB I.PRM+1(R1),HIADD(R3); PHYSICAL ADD OF USER BUFFER (HI)O\ MOV R1,-(SP) ; SAVE R1 ] MOV R2,-(SP) ; SAVE R2I&^ MOV DYPCB,R0 ; GET PCB ADD OF DYCOM%_ MOV P.REL(R0),R1 ; RELOCATION BIAST3` MOV R1,DYPTR(R3) ; INITIALIZE POINTER INTO DYCOMR+a TST R3 ; IS THIS THE FIRST CONTROLLER ?Tb BEQ 67$ ; YESR(c MOV P.SIZE(R0),R2 ; GET SIZE OF DYCOMd ASR R2 ; DIVIDE IN HALF*e ADD R2,R1 ; POINT TO SECOND HALF OF IB6f ADD R2,DYPTR(R3) ; POINT INTO SECOND HALF OF COMMON)g67$: MOV #APR6DS,R2 ; APR6 DISPLACEMENTD3g CALL @MPPHY ; GET 18BIT PYS ADD OF IB ; GM001(/i ASH #4,R1 ; PUT BITS 17 & 18 OF ADD ;**-1Vj ; INTO BITS 12 & 13D-k BIC #^C<30000>,R1 ; ISOLATE BITS 12 AND 130l MOV R1,HIPHYA(R3) ; SAVE HI BITS OF ADD OF IB*m MOV R1,U.BUF(R5) ; SET UP EXTENDED BITS0n MOV R2,LOPHYA(R3) ; SAVE LO BITS OF ADD OF IB1o MOV R2,U.BUF+2(R5) ; SET UP LO BITS OF ADD FORDp ; DATA TRANSFERN+q MOV P.SIZE(R0),R1 ; COMPUTE LENGTH OF IBO#r ASH #6,R1 ; GET LENGTH IN BYTESP+s TST R3 ; IS THIS THE FIRST CONTROLLER ? t BEQ 68$ ; YES 6u ASH #-1,R1 ; DIVIDE BY 2 - TWO CONTROLLERS SHARINGv ; ONE BUFFER,w68$: MOV R1,BUFLEN(R3) ; SAVE LENGTH OF IBx MOV R1,COUNT(R3) ;<y MOV U.CNT(R5),WCOUNT(R3); COUNT OF DATA TO BE MOVED FOR Az ; WRITE FUNCTION{ MOV (SP)+,R2 ; RESTORE REGV| MOV (SP)+,R1 ; 2} CMPB #IO.WLB/256.,I.FCN+1(R1); WRITE FUNCTION ?~ BNE 69$ ; NO* CLR COUNT(R3) ; NO BYTES TRANSFERED YET€ ; INITIATE CALL TO BLXIO�69$:=‚ MOV I.PRM+12(R1),R0 ; GET PHYSICAL OR LOGICAL BLOCK NUMBER6;ƒ BITB #IO.RPB&377,I.FCN(R1) ; IS IT READ/WRITE PHYSICAL?A„ BNE 70$ ; IF NE YES2… ASL R0 ; CONVERT TO LOGICAL SECTOR NO. (LBN*2)'† BIT #DEN,U.CW2(R5) ; DOUBLE DENSITY?(‡ BNE 70$ ; IF NE YESMˆ ASL R0 ; SINGLE DEN - LBN*4N%‰70$: MOV R0,I.PRM+10(R1) ; STORE ITV0Š80$: MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS1‹ CALL TRKSEC ; CONVERT BLOCK # TO TRACK/SECTOR;Œ BCC 82$ ; IF CC -> OK$� JMP 10$ ; CS -> BAD BLOCK NUMBERŽ82$:(� MOV S.CSR(R4),R2 ; GET ADDRESS OF CSR3� CMPB #IO.WLB/256.,I.FCN+1(R3) ; WRITE FUNCTION?R‘ BEQ 822$ ; IF EQ YES$’ JMP 190$ ; MUST BE READ FUNCTION“;T”; FILL SILO BEFORE WRITE•;B0–822$: MOVB S.CON(R4),R1 ; GET CONTROLLER INDEX — TST BFLAG(R1) ; BUFFER DATA ?˜ BEQ 88$ ; NO-™ TST COUNT(R1) ; IS THE IB FULL WITH DATA ?Sš BGT 88$ ; YES/1› CMP BUFLEN(R1),WCOUNT(R1); IS THE I/O TRANSFER œ ; GREATER THAN THE IB �ž BGT 83$ ; BGT - NO@Ÿ SUB BUFLEN(R1),WCOUNT(R1); UPDATE BYTES LEFT TO COMPLETE TRAN7  MOV BUFLEN(R1),TEMP(R1); NUMBER OF BYTES TO BE MOVEDI ¡ BR 84$ ;;¢83$: MOV WCOUNT(R1),TEMP(R1); NUMBER OF BYTES TO BE MOVED:£ CLR WCOUNT(R1) ; AFTER THIS MOVE, I/O TRANS IS COMPLETE3¤84$: MOV TEMP(R1),COUNT(R1); LENGTH OF DATA IN IBA+¥86$: CALL BLXIO ; FILL IB WITH MORE DATAHG¦ ADD #<256./100>,DYPTR(R1) ; BUMP POINTER INTO DYCOM (32 WORD BLOCKS) /§ SUB #256.,TEMP(R1) ; DECREMENT TEMPORY COUNT ¨ BLE 87$ ; IB IS FULL)© TST $FRKHD ; ANYONE WAITING TO FORK ?T&ª BEQ 86$ ; IF EQ NO -> DO SOME MORE8ª CALL @FORK ; LET SOMEONE ELSE DO SOME WORK ; GM0014¬ MOVB S.CON(R4),R1 ; GET CONTROLLER INDEX ;**-1%­ MOV S.CSR(R4),R2 ; GET CSR ADDRESSM,® MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS¯ BR 86$ ; DO SOME MORE BLXIOA;°87$: BIC #30000,U.BUF(R5); RESET EXTENDED ADDRESSING BITS/2± BIS HIPHYA(R1),U.BUF(R5); TO POINT TO BEG OF IB2² MOV LOPHYA(R1),U.BUF+2(R5); RESET LO BITS OF IB³ MOV R2,-(SP) ; SAVE REG"´ MOV DYPCB,R2 ; GET PCB OF DYCOM9µ MOV P.REL(R2),DYPTR(R1); INITIALIZE POINTER INTO DYCOM ¶ TST R1 ; ONE CONTROLLERS· BEQ 877$ ; YES+¸ MOV P.SIZE(R2),-(SP); GET SIZE OF REGION ¹ ASR (SP) ; CUT IN HALF9º ADD (SP)+,DYPTR(R1) ; POINT INTO SECOND HALF OF REGIOND"»877$: MOV (SP)+,R2 ; RESTORE REG¼88$:0½ MOVB #FILL,U.BUF(R5) ; SET FILL SILO FUNCTION+¾90$: BIT #DEN,U.CW2(R5) ; DOUBLE DENSITY? ¿ BEQ 100$ ; IF EQ NOY3À BIS #SDEN,U.BUF(R5) ; YES-SET DOUBLE DENSITY BITP4Á100$: BIS #SILO,U.CW2(R5) ; IN00i‚rUrn´cÚµcÛ¶c�·c›’DICATE SILO FUNCTION0 MOVB S.CON(R4),R1 ; RETRIEVE CONTROLLER INDEX/à MOV U.BUF(R5),CSRSV(R1) ; SAVE FUNCTION CODE;)Ä MOV U.BUF(R5),(R2) ; INITIATE FUNCTIONRÅÆ7Æ BIT #HF.UBM,@HFMSK ; UNIBUS MAP PRESENT ? ; GM001TÈ BEQ 105$ ; N0 ;**-1ÉÊ MOV R2,-(SP) ; SAVE REGISTER8Ê CALL @MPUBM ; MAP 11/70 UNIBUS TO TRANSFER ; GM001+Ì MOV (SP)+,R2 ; RESTORE REGISTER ;**-1ÍÎ105$:I*Ï MOV U.BUF+2(R5),R0 ; GET BUFFER ADDRESS1Ð MOV #128.,R1 ; DEFAULT TO A 128. BYTE TRANSFERN0Ñ BIT #DEN,U.CW2(R5) ; DOUBLE DENSITY DISKETTE?Ò BEQ 110$ ; IF EQ NOM)Ó ASL R1 ; CHANGE DEFAULT TO 256. BYTES;.Ô110$: CMP U.CNT(R5),R1 ; FULL TRANSFER LEFT?Õ BHIS 120$ ; IF HIS YES,Ö MOV U.CNT(R5),R1 ; NO, GET RESIDUAL COUNT;×120$: MOV R1,I.PRM+12(R3) ; STORE BYTES BEING TRANSFERREDC)Ø130$: BITB #TR!DONE,(R2) ; TRANSFERRED? Ù BMI 140$ ; IF MI YESÚ BEQ 130$ ; IF EQ NO-Û BR 160$ ; ERRORMÜ140$: ASR R1 ; WORD COUNT$Ý MOV R1,RXDB(R2) ; LOAD WORD COUNT)Þ150$: BITB #TR!DONE,(R2) ; TRANSFERRED?50ß BMI 270$ ; IF MI YES - R0 HAS BUFFER ADDRESSà BEQ 150$ ; IF EQ NO .á160$: MOV RXES(R2),I.PRM+6(R3) ; SAVE STATUS&â JMP DYRTY ; ERROR, RETRY OPERATIONã;Sä; EMPTY SILO AFTER READ å;E7æ170$: MOVB #EMPTY,U.BUF(R5) ; SET EMPTY SILO FUNCTIONE(ç BR 90$ ; SAME AS FILL SILO PROCEDUREè;)+é; INITIATE TRANSFER BETWEEN SILO AND DISKê;11ë180$: MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS "ì MOV S.CSR(R4),R2 ; GET CSR ADDR.í MOVB #WRITE,U.BUF(R5);ASSUME WRITE FUNCTION'î MOV I.FCN(R3),R1 ; GET FUNCTION CODE-%ï BIC #7,R1 ; REMOVE QUALIFIER BITSI,ð CMP #IO.WDD,R1 ; WRITE WITH DELETED DATA?ñ BNE 200$ ; IF NE NO <ò MOVB #WRTDD,U.BUF(R5) ; SET "WRITE DELETED DATA" FUNCTION ó BR 200$ ;B0ô190$: MOVB #READ,U.BUF(R5) ; SET READ FUNCTION,õ200$: BIT #DEN,U.CW2(R5) ; DOUBLE DENSITY?ö BEQ 210$ ; IF EQ NOE,÷ BIS #SDEN,U.BUF(R5) ; YES-SET DENSITY BIT!ø210$: TSTB U.UNIT(R5) ; UNIT 1?Vù BEQ 220$ ; IF EQ NOD2ú BIS #UNIT,U.BUF(R5) ; YES, SET TO SELECT UNIT 15û220$: MOVB S.CON(R4),R1 ; RETRIEVE CONTROLLER INDEX /ü MOV U.BUF(R5),CSRSV(R1) ; SAVE FUNCTION CODET ý MOV #LOOP,R0 ; SET UP COUNTER)þ MOV U.BUF(R5),(R2) ; INITIATE FUNCTIONT)ÿ230$: BITB #TR!DONE,(R2) ; TRANSFERRED?  BMI 240$ ; IF MI YES- BEQ 235$ ; TR NOT SET - DECREMENT COUNTERC BR 160$ ; ERRORT#235$: DEC R0 ; DECREMENT COUNTER## BNE 230$ ; KEEP ON CHECKING BIT+ MOVB S.CON(R4),R3 ; GET CONTROLLER INDEX0, MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS' MOV #1,RTTBL(R3) ; JUST DO ONE RETRYR/ JMP 620$ ; INITIALIZE DRIVE TO RECOVER FROMR  ; POWER OFF PROBLEMN7 240$: MOVB I.PRM+14(R3),RXDB(R2) ; LOAD SECTOR NUMBER)4 250$: BITB #TR!DONE,(R2) ; TRANSFER READY OR DONE?#  BMI 260$ ; IF MI TRANSFER READYI  BEQ 250$ ; IF EQ LOOP ( BR 160$ ; ERROR, NO TRANSFER REQUEST6260$: MOVB I.PRM+15(R3),R0 ; LOAD TRACK NUMBER IN R04270$: MOVB S.ITM(R4),S.CTM(R4) ; SET TIMEOUT COUNT2280$: BIS #S2.ACT,S.ST2(R4) ; SHOW I/O IS ACTIVE; MOV R0,RXDB(R2) ; LOAD TRACK, BUFFER ADDRESS, OR ASCII I6;;"; DYPWF - POWER FAIL ENTRY POINT=; POWER FAIL IS HANDLED BY THE DEVICE TIMING OUT, THEREFORE;=; NO WORK IS DONE HERE. IT WILL BE HANDLED WHEN THE DEVICED; TIME OUT ENTRY IS EXECUTED.T;E;D"; DYCAN - CANCEL I/O ENTRY POINT6; CANCEL I/O IS A NOP OP FOR FILE STRUCTURED DEVICES;3DYPWF: ;;; DYCAN: RETURN ;;;O;+7 ; ** -- DYKRB -- DY CONTROLLER STATUS CHANGE ROUTINE,!;(?"; THIS ROUTINE WILL HANDLE SETTING CONTROLLER ONLINE/OFFLINE #;S@$; THIS ROUTINE HAS BEEN ADDED FOR 22 BIT QBUS PROCESSORS. THE?%; FOLLOWING REQUIREMENTS MUST BE MET TO HAVE THIS CONTROLLERR&; BROUGHT ONLINE:'; F(; 1.DYCOM REGION MUST EXIST. DYCOM IS THE INTERMEDIATE BUFFER (IB).=); 2.DYCOM MUST RESIDE IN THE FIRST 124K OF PHYSICAL MEMORYF*;L;+; THIS ROUTINE WILL ALSO INSURE THAT THE DYCOM REGION IS >,; NOT CHECKPOINTABLE, NOT SHUFFLEABLE, AND FIXED IN MEMORY.-;, .; INPUTST/;O0; R2 = KRB ADDRESS1; R300iŠrarßmæàmçámýfáþfDATA = CTB ADDRESS02; C = 0 REQUEST OFFLINE TO ONLINE TRANSITION/3; C = 1 REQUEST ONLINE TO OFFLINE TRANSTIONQ 4; $SCERR = 1 PRESET TO SUCESS5;R 6; OUTPUTS7;T$8; $SCERR < 0 OPERATION IS FAILURE%9; $CSERR CONTAINS FAILURE CODEF#:; $SCERR = 1 OPERATION IS SUCESS ;;I<;-=DYKRB:2> BCC 279$ ; IF CC -> GO TO TRANSITION TO ONLINE7> BIT #HF.UBM,@HFMSK ; UNIBUS MAP PRESENT ? ; GM001T@ BNE 290$ ; YES ;**-1R7A DEC CONCNT ; DECREMENT # OF CONTROLLERS USING DYCOM3+B BNE 290$ ; IF NE , THERE ARE STILL MOREOC MOV R0,-(SP) ; SAVE R0=&D MOV DYPCB,R0 ; GET ADDRESS OF DYCOM:E BEQ 278$ ; IF EQ -> DON'T CLEAR BIT - DYPCB NOT SET UP7F BIC #P2.LMA,P.ST2(R0);CLEAR THE 'LEAVE ME ALONE' BITO!G278$: MOV (SP)+,R0 ; RESTORE R01H BR 290$ ; AND RETURN0H279$: TST EXEVEC ; IF DONE ALREADY ; GM001"H BNE 2$ ; SKIP THIS ; GM001%H MOV R2,-(SP) ; SAVE R2 ; GM0010%H MOV R3,-(SP) ; SAVE R3 ; GM001D-H MOV KINAR6,-(SP) ; SAVE KINAR6 ; GM001Y:H MOV @#112,R0 ; GET ADDRESS OF TABLE OF ENTRIES ; GM001EH MOV (R0),R0 ; GET ADDRESS OF APR BIAS (1ST WORD IN TABLE) ; GM001 =H MOV (R0),KINAR6 ; MAP COMMON THROUGH I-SPACE APR6 ; GM001P.H MOV #EXEVEC,R3 ; POINT TO VECTOR ; GM0016H MOV #EXEVCL,R2 ; SPECIFY LENGTH OF VECTOR ; GM0012H CALL @#140004 ; TRANSLATE THE VECTOR ; GM001/H MOV (SP)+,KINAR6 ; RESTORE KINAR6 ; GM001 (H MOV (SP)+,R3 ; RESTORE R3 ; GM001(H MOV (SP)+,R2 ; RESTORE R2 ; GM0019H2$: BIT #HF.UBM,@HFMSK ; UNIBUS MAP PRESET ? ; GM001F+J BNE 290$ ; YES - NOTHING TO DO ;**-1 K MOV R0,-(SP) ; SAVE R0TL MOV R1,-(SP) ; SAVE R1M MOV R2,-(SP) ; SAVE R2ON MOV R3,-(SP) ; SAVE R3M(O MOV #DYCOM,R3 ; GET ADD OF DYCOM NAME3O CALL @SRNAM ; SEARCH FOR NAMED REGION ; GM001T4Q BCS 282$ ; DOES NOT EXIST - CANNOT BRING ;**-1R ; CONTROLLER ONLINEN-S MOV R2,DYPCB ; SAVE ADDRESS OF DYCOM'S PCBR8T MOV P.REL(R2),R3 ; GET STARTING PHYSICAL ADD OF DYCOM2U ADD P.SIZE(R2),R3 ; GET ENDING ADDRESS OF DYCOM3V CMP R3,#MEMSIZ ; IS DYCOM IN FIRST 124K MEMORY ?O2W BGT 282$ ; NO - DO NOT BRING CONTROLLER ONLINE#X MOV R2,R1 ; DYCOM'S PCB ADDRESSE0Y BIT #PS.OUT,P.STAT(R1); IS REGION IN MEMORY ?Z BEQ 281$ ; YES4[ INCB P.RMCT(R1) ; BUMP RESIDENT MAPPED TASK COUNT0\ MOVB #160.,P.PRI(R1) ; SET UP REGION PRIORITY)] ; MAKE THE PRIORITY HIGH SO IT GETSV^ ; QUEUED UP QUICKLY 4^ CALL @LDREG ; BRING REGION INTO MEMORY ; GM001.` MOV DYPCB,R1 ; RESTORE PCB ADDRESS ;**-1@a281$: BIS #PS.CHK!PS.FXD!PS.NSF,P.STAT(R1); MAKE SURE DYCOM IS-b ; NOT CHK,NOT SHUFF,AND FIXED IN MEMORYR/c BIS #P2.LMA,P.ST2(R1); DON'T TOUCH PARTITIONE7d INC CONCNT ; INCREMENT # OF CONTROLLERS USING DYCOMQ'e BR 285$ ; OK TO BRING DEVICE ONLINEEEe282$: MOV #IE.SPC,@SCERR ; ERROR - ILLEGAL BUFFER ADDRESS ; GM001I+g285$: MOV (SP)+,R3 ; RESTORE R3 ;**-1Vh MOV (SP)+,R2 ; RESTORE R2i MOV (SP)+,R1 ; RESTORE R1j MOV (SP)+,R0 ; RESTORE R0 k290$: RETURN ; DONE - RETURNl;+0m; ** --DYUCB -- DY UNIT STATUS CHANGE ROUUTINEn;R=o; THIS ROUTINE WILL HANDLE SETTING EACH UNIT ONLINE/OFFLINEBp;2!q; THIS ROUTINE WILL JUST RETURNOr;sDYUCB: t RETURNEuv;+;w; *** - $DYINT - RX211 FLOPPY DISK INTERRUPT ENTRY POINTNx;y;-8z INTSE$ DY,PR5,R$$X21 ;;; GENERATE INTERRUPT SAVE CODE%{ MOV U.SCB(R5),R4 ; GET SCB ADDRESS '| TSTB S.STS(R4) ; IS THE DRIVE BUSY ?} BNE 295$ ; IF NE YES(~ RETURN ; IGNORE SPURIOUS INTERRUPTS$295$: MOV R3,-(SP) ; SAVE REGISTER'€ MOV U.SCB(R5),R4 ;;; GET SCB ADDRESSE.� MOV S.PKT(R4),R3 ;;; GET I/O PACKET ADDRESS'‚ MOV S.CSR(R4),R4 ;;; GET CSR ADDRESSU7ƒ MOV RXDB(R4),I.PRM+6(R3) ;;; SAVE CONTROLLER STATUS$„ MOV (SP)+,R3 ;;; RESTORE REGISTER#… BIT #RXACLO,RXES(R4);POWER OFF ?-† BEQ 297$ ;NO)‡ RETURN ;POWER OFF - IGNORE INTERRUPTˆ297$:B#‰ CLR (R4) ;;; DISABLE INTERRUPTS.4‰ CALL @FORK ;;; CREATE A SYSTEM PROCESS ; GM001)‹ MOV R4,R2 ; COPY CSR ADDRESS ;**-1S%Œ MOV U.SCB(R5),R4 ; GET SCB ADDRES00i’rUrn´cÚµcÛ¶c�·c›’S+� MOVB S.CON(R4),R3 ; GET CONTROLLER INDEXM0Ž BIT #SCHAR,U.CW2(R5); SENSE CHARACTERISTICS ?� BNE DYSEN ; IF NE YESD� TST (R2) ; ANY ERRORS?‘ BPL 300$ ; IF PL NO ERRORS"’ JMP DYRTY ; YES-RETRY FUNCTION2“300$: ASRB RTTBL+1(R3) ; INITIALIZE IN PROGRESS?” BCS 360$ ; IF CS YES,• MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS.– CMP #IO.SMD,I.FCN(R3) ; SET MEDIA DENSITY?— BNE 310$ ; IF NE NOS˜ JMP 410$ ; YES, FINISH I/O6™310$: CMPB #IO.RLB/256.,I.FCN+1(R3) ; READ FUNCTION?š BNE 340$ ; IF NE NO,!› TST U.CW2(R5) ; SILO FUNCTION?#œ BMI 330$ ; IF MI YES0� BITB #DELDAT,I.PRM+6(R3) ; DELETED DATA READ?ž BEQ 320$ ; IF EQ NOBŸ BISB #DELDAT,U.CW2(R5) ; YESP! 320$: JMP 170$ ; GO EMPTY SILO$-¡330$: BIC #SILO,U.CW2(R5) ; CLEAR SILO FLAG'¢ CALL NXTSEC ; UPDATE TO NEXT SECTORR"£ BEQ 400$ ; IF EQ, ALL FINISHED ¤ BR 360$ ; INITIATE NEXT READ+¥340$: TST U.CW2(R5) ; FILL SILO FUNCTION?;¦ BPL 350$ ; IF PL NO -§ BIC #SILO,U.CW2(R5) ; YES - CLEAR SILO BIT¨ JMP 180$ ; GO WRITE SECTOR,©350$: CALL NXTSEC ; UPDATE TO NEXT SECTOR"ª BEQ 410$ ; IF EQ, ALL FINISHED5«360$: BIC #ERR1,U.CW2(R5) ; CLEAR TIMEOUT ERROR BITS1¬ MOV S.PKT(R4),R1 ; RETRIEVE I/O PACKET ADDRESSE6­ CMP #IO.SMD,I.FCN(R1) ; SET MEDIA DENSITY FUNCTION?® BNE 370$ ; IF NE NOA¯ JMP DYSMD ; RETRY IO.SMD.°370$: JMP 80$ ; RETRY CURRENT OPERATION NOW0±380$: MOV #IE.BLK&377,R0 ; SET BAD BLOCK ERROR ² BR 440$ ;34³390$: MOV #IE.VER&377,R0 ; SET UNRECOVERABLE ERROR ´ BR 420$ ;J,µ400$: MOV I.FCN(R3),R1 ; GET FUNCTION CODE%¶ BIC #7,R1 ; REMOVE QUAILFIER BITS (· CMP #IO.RPB,R1 ; READ PHYSICAL BLOCK?¸ BNE 410$ ; IF NE NO <¹ MOV #IS.RDD&377,R0 ; YES, DEFAULT ON READ TO DELETED DATA.º BITB #DELDAT,U.CW2(R5) ; DELETED DATA READ?» BNE 420$ ; IF NE YES;¼410$: MOV #IS.SUC&377,R0 ; SET SUCCESSFUL COMPLETION CODET1½420$: MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS0,¾ MOV I.PRM+4(R1),R1 ; SET BYTES TRANSFERED9¿ SUB U.CNT(R5),R1 ; CALCULATE BYTES ACTUALLY TRANSFERED 5À430$: MOVB S.CON(R4),R3 ; RETRIEVE CONTROLLER INDEXC,Á MOVB RTTBL(R3),R2 ; SET FINAL RETRY COUNT, MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS/à CMPB #IO.SEC,I.FCN+1(R3) ; IO.SEC OR IO.SMD? Ä BNE 435$ ; IF NE NOB-Å BIS #CEW*256.,R2 ; SET INITIAL RETRY COUNTB Æ BR 440$ ;E4Ç435$: BIS #RETRY*256.,R2 ; SET INITIAL RETRY COUNT:È440$: BIC #SILO!SCHAR!ERR1!DELDAT,U.CW2(R5) ; CLEAR BITS&È CALL @IODON ; SET DONE ; GM001/Ê JMP DYINI ; TRY FOR ANOTHER REQUEST ;**-1 ËÌ;T2Í; INTERRUPT PROCESSING POINT FOR DETERMINING THEÎ; DISKETTE UNIT STATUS.BÏ;,Ð7ÑDYSEN: MOV S.PKT(R4),R1 ; RETRIEVE I/O PACKET ADDRESSK1Ò BIT #RSAE,U.CW2(R5) ; READ STATUS AFTER ERROR? Ó BEQ 450$ ; IF EQ NOI#Ô BIC #RSAE,U.CW2(R5) ; CLEAR FLAGNÕ JMP 390$ ; EXIT WITH ERROR,Ö450$: ASRB RTTBL+1(R3) ; INIT IN PROGRESS?× BCC 460$ ; IF CC NOS$Ø BIT #RXACLO,I.PRM+6(R1) ; AC LOW?Ù BNE 460$ ; IF CC NO &Ú DECB RTTBL(R3) ; ANY RETRIES LEFT ?Û BNE 455$ ; IF NE YES+Ü JMP 630$ ; IF EQ NO, DON'T RETRY IO.SECTÝ455$: JMP DYSEC ; RETRY ITT.Þ460$: BIT #DRVRDY,I.PRM+6(R1) ; DRIVE READY?ß BEQ DYRTY ; IF EQ NOà TST (R2) ; ANY ERRORS?á BPL 470$ ; IF PL NOR4â BIT #DENERR,I.PRM+6(R1) ; IS IT A DENSITY ERROR?ã BEQ DYRTY ; IF EQ NO.ä470$: BIC #SCHAR!DEN,U.CW2(R5) ; CLEAR FLAGS0å MOV #SINGLE,U.CW3(R5) ; ASSUME SINGLE DENSITY3æ BIT #DRVDEN,I.PRM+6(R1) ; IS IT DOUBLE DENSITY?Iç BEQ 480$ ; IF EQ NO3+è ASL U.CW3(R5) ; DOUBLE THE MAXIMUM LBN'SY+é BIS #DEN,U.CW2(R5) ; SET THE DENSITY BITE(ê480$: MOV #IS.SUC&377,R0 ; SET SUCCESS3ë MOV U.CW2(R5),R1 ; RETURN DEVICE CHARACTERISTICSY ì BR 430$ ;í;(#î; SENSE CHARACTERISTIC PROCESSING ï;R=ðDYSEC: BIS #SCHAR,U.CW2(R5) ; INDICATE SENSE CHARACTERISTICD-ñ MOV #MRDS,R0 ; SET MAINTENANCE READ STATUSRò TSTB U.UNIT(R5) ; UNIT 1 ?Eó BEQ 490$ ; IF EQ NOE#ô BIS #UNIT,R0 ; YES SELECT UNIT 1 5õ490$: MOVB S.CON(R4),R1 ; RETRIEVE CONTROLLER INDEXA(ö MOV R0,CSRSV(R1) ; SAVE FUNCTION CODE#÷ MOV R0,(R2) ; IN00išrarßmæàmçámýfáþfDATAITIATE FUNCTIONT0ø MOVB S.ITM(R4),S.CTM(R4) ; SET TIMEOUT COUNT.ù BIS #S2.ACT,S.ST2(R4) ; SHOW I/O IS ACTIVE ú RETURN ;$ûü;(ý; SET MEDIA DENSITYTþ;O+ÿDYSMD: MOV #SETDEN,R0 ; SET FUNCTION CODE " BIC #DEN,U.CW2(R5) ; CLEAR FLAG0 MOV #SINGLE,U.CW3(R5) ; ASSUME SINGLE DENSITY" TST I.PRM(R1) ; SINGLE DENSITY? BEQ 500$ ; IF EQ YES% CMP #2,I.PRM(R1) ; DOUBLE DENSITY?O0 BNE 500$ ; IF NE NO, TREAT AS SINGLE DENSITY  BIS #SDEN,R0 ; DOUBLE DENSITY% BIS #DEN,U.CW2(R5) ; UPDATE STATUST' ASL U.CW3(R5) ; DOUBLE MAXIMUM LBN'SO! 500$: TSTB U.UNIT(R5) ; UNIT 1?   BEQ 510$ ; IF EQ NOR#  BIS #UNIT,R0 ; YES SELECT UNIT 1E5 510$: MOVB S.CON(R4),R1 ; RETRIEVE CONTROLLER INDEXD(  MOV R0,CSRSV(R1) ; SAVE FUNCTION CODE# MOV R0,(R2) ; INITIATE FUNCTIONE)520$: BITB #TR!DONE,(R2) ; TRANSFERRED?? BMI 530$ ; IF MI YES BEQ 520$ ; IF EQ NOO, MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS) MOV RXES(R2),I.PRM+6(R3) ; SAVE STATUSE BR DYRTY ; ERROR530$: MOV #'I,R0 ; ASCII "I"L& MOVB #30.,S.CTM(R4) ; TIMEOUT COUNT JMP 280$ ;;+,; **-DYOUT-FLOPPY DISK TIMEOUT ENTRY POINT;-,DYOUT: CALL LOGTMO ;;; LOG DEVICE TIMEOUT* BIS #ERR1,U.CW2(R5) ; SET TIMEOUT ERROR BR DYRTY1 ;O !;V"; RETRY LAST FUNCTIONT#;($DYRTY: CALL LOGERR ; LOG DEVICE ERROR6%DYRTY1: MOVB S.CON(R4),R3 ; RESTORE CONTROLLER INDEX,& MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS1' BIT #RSAE,U.CW2(R5) ; READ STATUS AFTER ERROR?T( BNE 640$ ; IF NE YES+) BITB #IQ.X,I.FCN(R1) ; INHIBIT RETRIES ?T* BEQ 540$ ; IF EQ NO:+ CMP #IO.SEC,I.FCN(R1) ; SENSE CHARACTERISTICS FUNCTION?, BEQ 630$ ; IF EQ YES9- BIS #RSAE,U.CW2(R5) ; SET READ STATUS AFTER ERROR FLAGT!. JMP DYSEC ; GO DO READ STATUS*/540$: DECB RTTBL(R3) ; ANY RETRIES LEFT?0 BNE 550$ ; IF NE YES71 CMP #IO.SEC,I.FCN(R1) ; DON'T REPEAT IO.SEC FUNCTIONR2 BEQ 630$ ; IF EQ EXIT 93 BIS #RSAE,U.CW2(R5) ; SET READ STATUS AFTER ERROR FLAGT!4 JMP DYSEC ; GO DO READ STATUS ,5550$: BIT #ERR1,U.CW2(R5) ; TIMEOUT ERROR?6 BNE 620$ ; IF NE YES(7560$: BIT #RXACLO,I.PRM+6(R1); AC LO ?8 BEQ 565$ ; NOT9 BR 630$ ; ERROR - POWER OFF?:565$: BIT #SCHAR,U.CW2(R5) ; SENSE CHARACTERISTICS FUNCTION ?D; BNE 620$ ; IF NE YES5< CMP IO.SMD,I.FCN(R1) ; SET MEDIA DENSTIY FUNCTION?0= BEQ 620$ ; IF EQ YES*> BIT #CRCERR,I.PRM+6(R1) ; CRC ERRORS ?? BNE 610$ ; IF NE YES2@570$: CMP #IO.SMD,I.FCN(R1) ; SET MEDIA DENSITY?A BNE 580$ ; IF NE NOC'B JMP DYSMD ; RETRY SET MEDIA DENSITY,7C580$: MOV I.PRM+10(R1),R0 ; GET LOGICAL SECTOR NUMBER6;D BIT #WCOVFL!DENERR,I.PRM+6(R1) ; WORD COUNT OVERFLOW ORBE ; DENSITY ERROR ?FF BEQ 610$ ; IF EQ NOC4G BIT #DRVDEN,I.PRM+6(R1) ; IS IT DOUBLE DENSITY ?H BNE 590$ ; IF NE YES4I BIC #DEN,U.CW2(R5) ; CORRECT IT TO SINGLE DENSITY!J BIC #SDEN,U.BUF(R5) ; HERE TOOPK ASL R0 ; MULTIPLY LSN BY 2=L MOV #SINGLE,U.CW3(R5) ; CHANGE MAX LBN'S TO SINGLE DENSITYE M BR 600$ ;55N590$: BIS #DEN,U.CW2(R5) ; CHANGE TO DOUBLE DENSITYTO ASR R0 ; DIVIDE LSN BY 2=P MOV #DOUBLE,U.CW3(R5) ; CHANGE MAX LBN'S TO DOUBLE DENSITY19Q600$: MOV R0,I.PRM+10(R1) ; STORE LOGICAL SECTOR NUMBERB5R610$: BIC #ERR1,U.CW2(R5) ; CLEAR TIMEOUT ERROR BITIS JMP 80$ ; RETRY FUNCTION8T620$: MOVB #1,RTTBL+1(R3) ; SET INITIALIZE IN PROGRESS2U MOV #INIT!INTEBL,CSRSV(R3) ; SAVE FUNCTION CODE2V MOV #INIT!INTEBL,(R2) ; INITIALIZE RX211 DRIVES1W MOVB S.ITM(R4),S.CTM(R4) ; SET TIMEOUT COUNTER X RETURN ; .Y630$: BIT #DRVRDY,I.PRM+6(R1) ; DRIVE READY?Z BEQ 640$ ; IF EQ NO[ JMP 390$ ; EXIT WITH IE.VER 7\640$: MOV #IE.DNR&377,R0 ; SET DEVICE NOT READY ERROR ] JMP 420$ ; EXIT WITH IE.DNR ^ .DSABL LSB,_`;+@a; *** - TRKSEC - CONVERT LOGICAL OR PHYSICAL BLOCK NUMBER TOb; TRACK-SECTOR PAIREc;T d; INPUT:e; R3 - I/O PACKET ADDRESSS-f; I.PRM+10(R3) - LOGICAL OR PHYSICAL SECTORBg;) h; OUTPUT: !i; I.PRM+14(R3) - SECTOR (1-26.)T j; I.PRM+15(R3) - TRACK (0-76.)k; R3 - UNCHANGEDl; C CLEAR 00i¢rUrn´cÚµcÛ¶c�·c›’- VALID BLOCKR2m; C SET - BAD BLOCK NUMBER (PHYSICAL OR LOGICAL)n; o;-p=qTRKSEC: MOV I.PRM+10(R3),R1 ; GET LOGICAL OR PHYSICAL BLOCKr MOV #8.,R0 ; SET LOOP COUNTs MOV #6400,R2 ; SET DIVISOR -t10$: CMP R2,R1 ; DOES 26 GO INTO DIVIDEND?Nu BHI 20$ ; IF HI NO (C=0))v SUB R2,R1 ; SUBTRACT 26 FROM DIVIDENDDw SEC ; SET CARRY,x20$: ROL R1 ; SHIFT DIVIDEND AND QUOTIENTy DEC R0 ; DONE?z BGT 10$ ; IF GT NO!{ BISB R1,R0 ; GET TRACK NUMBER1| CMP R0,#77. ; IS IT A LEGITMATE TRACK NUMBER? } BHI 60$ ; IF HI NO~ BLO 30$ ; IF LO YES 8 BITB #IO.RPB&377,I.FCN(R3) ; PHYSICAL BLOCK FUNCTION?'€ BEQ 60$ ; IF EQ NO, BAD BLOCK ERRORO$�30$: CLRB R1 ; CLEAR TRACK NUMBER&‚ SWAB R1 ; SHIFT DONE SECTOR NUMBER>ƒ BITB #IO.RPB&377,I.FCN(R3) ; IS IT A PHYSICAL BLOCK NUMBER?„ BNE 50$ ; IF NE YESS'… CMP #12.,R1 ; NO, C=1 IF 13<=R1<=25D)† ROL R1 ; DOUBLE FOR INTERLEAVE FACTOR"‡ ASL R0 ; ADD TRACK -TRACK SKEWˆ ADD R0,R1 ; SKEW BY 2*TRACK7‰ ADD R0,R1 ; SKEW BY 4*TRACKBŠ ADD R0,R1 ; SKEW BY 6*TRACKB!‹ ASR R0 ; RESTORE TRACK NUMBERPŒ MOV #26.,R2 ; SET MODULUSK8�40$: SUB R2,R1 ; MODULO SECTOR INTO RANGE -26. TO -1.(Ž BGE 40$ ; IF GE, LOOP UNTIL NEGATIVE&� ADD R2,R1 ; CONVERT TO RANGE 0-25.#� INC R0 ; LBN0 STARTS ON TRACK 1C'‘50$: INC R1 ; CONVERT TO RANGE 1-26.S+’ MOV R1,I.PRM+14(R3) ; SAVE SECTOR NUMBER“ BR 70$ ; - BRANCHN%”60$: SEC ; SIGNAL BAD BLOCK ERRORK+• MOVB R0,I.PRM+15(R3) ; SAVE TRACK NUMBER7– BR 80$ ; RETURNW/—70$: MOVB R0,I.PRM+15(R3) ; SAVE TRACK NUMBER;˜ CMP #77.*256.,I.PRM+14(R3) ; IS IT A VALID TRACK/SECTOR?U™80$: RETURN ;1š›;+9œ; *** - NXTSEC - UPDATE BLOCK NUMBER , BUFFER ADDRESSN�; AND BUFFER POINTERž;O Ÿ; INPUT: ; R3 - I/O PACKET ADDRESST¡; R5 - UCB ADDRESS'¢; I.PRM+10(R3) - CURRENT BLOCK NUMBERM8£; I.PRM+12(R3) - BYTES TRANSFERED DURING LAST FUNCTION&¤; U.CNT(R5) - BYTES LEFT TO TRANSFER¥; U.BUF(R5) - BUFFER ADDRESS¦;E §; OUTPUT:7'¨; I.PRM+10(R3) - UPDATED BLOCK NUMBERP*©; U.BUF(R5) - UPDATED BY 128./256. BYTES5ª; U.CNT(R5) - UPDATED BY NUMBER OF WORDS TRANSFERED: «; Z SET - ALL BYTES TRANSFERED$¬; Z CLEAR - MORE BYTES TO TRANSFER ­; C CLEAR - VALID TRACK/SECTOR®; C SET - BAD BLOCK NUMBER¯;P°;+±0²NXTSEC: INC I.PRM+10(R3) ; UPDATE BLOCK NUMBER+³ MOVB S.CON(R4),R0 ; GET CONTROLLER INDEXT'´ BIT #DEN,U.CW2(R5) ; SINGLE DENSITY?(µ BEQ 5$ ; IF EQ YESD¶ ADD #256.,U.BUF+2(R5) ; UPDATE BUFFER ADDRESS FOR DOUBLE DENSITY· BR 10$ ; AND CONTINUEPG¸5$: ADD #128.,U.BUF+2(R5) ; UPDATE BUFFER ADDRESS FOR SINGLE DENSITYN$¹10$: BCC 15$ ; IF CC, NO OVERFLOW9º ADD #10000,U.BUF(R5) ; CARRY INTO EXTENDED MEMORY BITSRB»15$: SUB I.PRM+12(R3),U.CNT(R5) ; UPDATE BYTES LEFT TO TRANSFER2¼ SUB I.PRM+12(R3),COUNT(R0); UPDATE COUNT FOR IB!½ TST BFLAG(R0) ; BUFFER DATA ?G¾ BEQ 100$ ; NOT3¿ CMPB #IO.WLB/256.,I.FCN+1(R3); WRITE OPERATION ? À BEQ 100$ ; YES)Á TST U.CNT(R5) ; ANY MORE DATA TO GET ?  BLE 30$ ; NO - MOVE IT(à BIT #DEN,U.CW2(R5) ; SINGLE DENSITY ?Ä BEQ 26$ ; YESF*Å CMP #256.,COUNT(R0) ; MORE ROOM IN IB ?Æ BLE 100$ ; YESÇ BR 30$ ; NO - MOVE THE DATAA.È26$: CMP #128.,COUNT(R0) ; MORE ROOM IN IB ?É BLE 100$ ; YES/Ê30$: MOV BUFLEN(R0),TEMP(R0); NUMBER OF BYTES3'Ë SUB COUNT(R0),TEMP(R0); TO TRANSFERBÌ32$: CALL BLXIO ; MOVE DATA8Í ADD #<256./100>,DYPTR(R0) ; UPDATE POINTER INTO DYCOMÎ ; (32 WORD BLOCKS)9Ï SUB #256.,TEMP(R0) ; UPDATE TEMPORY COUNT FOR MULTIPLEO Ð ; FORKSB Ñ BLE 35$ ;52Ñ TST @FRKHD ; ANYONE WAITING TO FORK? ; GM001.Ó BEQ 32$ ; IF EQ NO -> DO SOME MORE ;**-1,Ô MOV (SP)+,RETPTR(R0); SAVE RETURN ADDRESS8Ô CALL @FORK ; LET SOMEONE ELSE DO SOME WORK ; GM0014Ö MOVB S.CON(R4),R0 ; GET CONTROLLER INDEX ;**-1%× MOV S.CSR(R4),R2 ; GET CSR ADDRESSB,Ø MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS4Ù MOV RETPTR(R0),-(SP); PUT RETURN ADDRESS ON STACK"Ú BR 32$ ; NOW DO SOME MORE WORK3Û35$: MOV BUFLEN(R0),COUNT(R0); RESET LENGTH 00iªrarßmæàmçámýfáþfDATAOF IB 8Ü BIC #30000,U.BUF(R5) ; RESET EXTENDED ADDRESSING BITS2Ý BIS HIPHYA(R0),U.BUF(R5); TO POINT TO BEG OF IB2Þ MOV LOPHYA(R0),U.BUF+2(R5); RESET LO BITS OF IB(ß MOV DYPCB,R1 ; GET PCB OF DATA COMMON9à MOV P.REL(R1),DYPTR(R0); INITIALIZE POINTER INTO DYCOMLá TST R0 ; ONE CONTROLLER ?Râ BEQ 100$ ; YES+ã MOV P.SIZE(R1),-(SP); GET SIZE OF REGIONAä ASR (SP) ; CUT IN HALF9å ADD (SP)+,DYPTR(R0) ; POINT INTO SECOND HALF OF REGIONM4æ100$: TST U.CNT(R5) ; IF EQ TO ZERO THEN ALL DONE ç RETURN ;Cèé;.ê;+.ë; ** -- BLXIO -- MOVE BLOCK OF DATA ROUTINEì;,Ií; THE MOVE BLOCK OF DATA ROUTINE WILL MOVE THE SPECIFIED DATA IN MEMORYIî; ï;-ðBLXIO:ñ MOV R0,-(SP) ; SAVE REGò MOV R1,-(SP) ;Dó MOV R2,-(SP) ;Eô MOV R3,-(SP) ;Lõ MOV R4,-(SP) ;Cö MOV R5,-(SP) ;Q#÷ MOV R3,R5 ; SAVE I/O PACKET ADD;+ø MOVB S.CON(R4),R2 ; GET CONTROLLER INDEXA-ù MOV PHYADD(R2),R1 ; GET LO BITS OF ADDRESSH,ú MOV HIADD(R2),R0 ; GET HI BITS OF ADDRESS*û ASHC #10.,R0 ; CALCULATE DISP AND BIASü ASHC #-10.,R1 ;2ý CMPB #IO.WLB/256.,I.FCN+1(R5); WRITE FUNCTION ?þ BEQ 10$ ; YESA(ÿ ADD #APR6DS,R1 ; SET TO MAP THRU APR6$ MOV R0,R3 ; DESTINATION APR BIAS! MOV R1,R4 ; APR6 DISPLACEMENT . CMP #256.,TEMP(R2) ; MORE THAN 256 BYTES TO BLE 5$ ; BE TRANSFERRED ?  MOV TEMP(R2),R0 ; NOI  BR 7$ ;;95$: MOV #256.,R0 ; YES - AT LEAST 256 BYTES TO TRANSFERD77$: ADD R0,PHYADD(R2) ; UPDATE FOR NEXT CALL TO BLXIO ' ADC HIADD(R2) ; NOT FOR CURRENT CALL;&  MOV DYPTR(R2),R1 ; SOURCE APR5 BIAS'  MOV #APR5DS,R2 ; SOURCE DISPLACEMENTR  BR 20$ ;/ 10$: ADD #APR5DS,R1 ; SET UP TO MAP THRU APR5M.  CMP #256.,TEMP(R2) ; MORE THAN 256 BYTES TO BLE 17$ ; BE TRANSFERRED ? MOV TEMP(R2),R3 ; NO(  BR 18$ ;:17$: MOV #256.,R3 ; YES - AT LEAST 256 BYTES TO TRANSFER818$: ADD R3,PHYADD(R2) ; UPDATE FOR NEXT CALL TO BLXIO+ ADC HIADD(R2) ; NOT FOR THE CURRENT CALLY MOV R3,-(SP) ; SAVE REG* MOV DYPTR(R2),R3 ; DESTINATION APR BIAS  MOV R1,R2 ; APR DISPLACEMENT MOV R0,R1 ; SOURCE APR BIASR MOV (SP)+,R0 ; RESTORE REG , MOV #APR6DS,R4 ; DESTINATION DISPLACEMENT.20$: CALL @BLXI ; MOVE THE DATA ; GM001' MOV (SP)+,R5 ; RESTORE REG ;**-1? MOV (SP)+,R4 ;3 MOV (SP)+,R3 ;; MOV (SP)+,R2 ;R MOV (SP)+,R1 ;2  MOV (SP)+,R0 ;R ! RETURND";+ #; **-LOGTMO-LOG DEVICE TIMEOUT$; **-LOGERR-LOG DEVICE ERROR%;E?&; THESE ROUTINES WILL ALLOCATE A CORE BLOCK, FILL IT WITH THE >'; REGISTER INFORMATION, CALL THE APPROPRIATE EXECUTIVE ERROR?(; LOGGING ROUTINE, DEALLOCATE THE CORE BLOCK, AND RETURN BACK#); TO THE CALLER.*;I +; INPUTS:,; R2=CSR ADDRESS-; R4=SCB ADDRESS.; R5=UCB ADDRESS/;E 0; OUTPUTS:1; SAME AS INPUTS.R&2; ALL OTHER REGISTERS ARE DESTROYED.3;-4 5 .ENABL LSBD5LOGERR: MOV DVERR,-(SP) ; ADDRESS OF DEVICE ERROR ROUTINE ; GM0017 BR 10$ ; ;**-1EH7LOGTMO: MOV DTOER,-(SP) ;;; ADDRESS OF DEVICE TIMEOUT ROUTINE ; GM001>910$: MOV #DYNUM*2,R1 ; GET NUMBER OF REGISTERS TO LOG ;**-179 CALL @ALOCB ; ALLOCATE THE REGISTER BLOCK ; GM001 ; BCC 20$ ; IF CC OK ;**-12; INC @ERRSQ ; INDICATE A MISSED ERROR ; GM001.; CMP (SP)+,DTOER ; TIMEOUT ERROR? ; GM001 > BNE 30$ ; IF NE NO ;**-2,? CLR @S.CSR(R4) ;;; CLEAR INTERRUPT ENABLE @ MTPS #0 ;;; ALLOW INTERRUPTS A BR 30$ ;+B20$: MOV R0,R1 ; COPY CORE BLOCK ADDRESS *C MOV S.CSR(R4),R2 ; RETRIEVE CSR ADDRESS$D MOV (R2),(R1) ; SAVE CSR CONTENTS0E MOVB S.CON(R4),R3 ; RETRIEVE CONTROLLER INDEX+F BIC #^C<17>,CSRSV(R3) ; ISOLATE BITS 0-4E.G BIS CSRSV(R3),(R1)+ ; INCLUDE FUNCTION CODE!H MOV RXDB(R2),(R1)+ ; SAVE RXDBCI J .REPT 4KL CLR (R1)+ ; ZERO 4 WORDSMN .ENDRO&P MOV R0,R2 ; GET CORE BLOCK ADDRESSQ CALL @(SP)+ ; LOG THE ERRORN+R MOV R2,R0 ; GET BACK CORE BLOCK ADDRESSP6S MOV #DYNUM*2,R1 ; GET NUMBER OF BYTES TO DEALLOCATE5S CALL @DEACB ; DEALLOCATE THE CORE BLOCK ; GM001M7U30$: MOV S.CSR(R4),R2 ; RETRIEVE CSR ADDRESS ;**-1R V RETURN 00i²rj³rn´cÚµcÛ¶c�·c›’ ;L W .DSABL LSBCXYZ .END) ; ISOLATE BITS 0-4E.G BIS CSRSV(R3),(R1)+ ; INCLUDE FUNCTION CODE!H MOV RXDB(R2),(R1)+ ; SAVE RXDBCI J .REPT 4KL CLR (R1)+ ; ZERO 4 WORDSMN .ENDRO&P MOV R0,R2 ; GET CORE BLOCK ADDRESSQ CALL @(SP)+ ; LOG THE ERRORN+R MOV R2,R0 ; GET BACK CORE BLOCK ADDRESSP6S MOV #DYNUM*2,R1 ; GET NUMBER OF BYTES TO DEALLOCATE5S CALL @DEACB ; DEALLOCATE THE CORE BLOCK ; GM001M7U30$: MOV S.CSR(R4),R2 ; RETRIEVE CSR ADDRESS ;**-1R V RETURN  .TITLE CORALR .IDENT /10.06/T;7Q; COPYRIGHT (c) 1982, 1983, 1984, 1985, 1987 BY DIGITAL EQUIPMENT CORPORATION.); ALL RIGHTS RESERVED.;G>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;O ; D. N. CUTLER 3-AUG-73  ;  ; MODIFIED BY: ;P; H. HUANG 28-JUN-83 10.00;O3; HH175 -- ADD EXTENDIBLE SECONDARY POOL SUPPORTD;S ; J. W. BERZLE 07-SEP-83 10.01;T4; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES;T ; J. W. BERZLE 11-JUN-84 10.02;92; JWB085 -- DEALLOCATE CONTEXT BLOCK IF PRESENT%; WHEN DEALLOCATING CLOCK BLOCKS;W ; C. A. SILVER 12-MAR-85 10.03;Y*; CAS019 -- ADD AUXILARY SPM HOOKPOINTS;H ; C. B. PUTNAM 09-MAY-85 10.04 ;N/!; CBP204 -- ADD POOL FRAGMENT VALIDITY CHECK";."#; B. S. MCCARTHY 24-JUN-85 10.05$;-)%; CAS019 -- REFORMAT SPM HOOK COMMENTS&;"&; P. K. M. WEISS 13-OCT-86 10.06&; 1&; PKW118 -- ADD $ALSC1 AND $DESC1 ENTRY POINTS';#(; CORE BUFFER ALLOCATION ROUTINES);J*; MACRO LIBRARY CALLSX+;C,- .MCALL CLKDF$,PKTDF$,BGCK$A5. CLKDF$ ;DEFINE CLOCK QUEUE CONTROL BLOCK OFFSETS3&/ PKTDF$ ;DEFINE I/O PACKET OFFSETS01;+"2; **-$ALOCB-ALLOCATE CORE BUFFER43; **-$ALOC1-ALLOCATE CORE BUFFER (ALTERNATE ENTRY)4;J5; THIS ROUTINE IS CALLED TO ALLOCATE AN EXEC CORE BUFFER. THE ALLOCATIONH6; ALGORITHM IS FIRST FIT AND BLOCKS ARE ALLOCATED IN MULTIPLES OF FOUR 7; BYTES.8; 9; INPUTS:T:;I@;; R0=ADDRESS OF CORE ALLOCATION LISTHEAD-2 IF ENTRY AT $ALOC1.4<; R1=SIZE OF THE CORE BUFFER TO ALLOCATE IN BYTES.=; >; OUTPUTS:?;L@@; C=1 IF INSUFFICIENT CORE IS AVAILABLE TO ALLOCATE THE BLOCK."A; C=0 IF THE BLOCK IS ALLOCATED.'B; R0=ADDRESS OF THE ALLOCATED BLOCK.C!C; R1=LENGTH OF BLOCK ALLOCATEDD;-E F .ENABL LSBD9G$ALOCB::MOV #$CRAVL-2,R0 ;POINT TO ALLOCATION MASK WORDIHIJ .IF DF Q$$OPTK'L ADD (R0),R1 ;ROUND TO NEXT BOUNDARYEM BIC (R0)+,R1 ;S%N BEQ 5$ ;IF EQ ZERO LENGTH REQUESTT*O CMP R1,#I.LGTH ;REQUEST SIZE OF PACKET?P BNE 5$ ;IF NE NO4Q MOV #$PKAVL,R2 ;POINT TO PACKET AVAILABLE POINTER'R MOV (R2),R0 ;PICK UP PACKET POINTERAS BEQ 4$ ;IF EQ THERE IS NONEE/T MOV (R0),(R2)+ ;UNLINK PACKET FROM LIFO LISTCU;+V; ** W A R N I N G ** W; X; SPM HOOKPOINT NUMBER 77.Y;D+Z; DO NOT CHANGE THE INSTRUCTION FOLLOWINGT[; LABEL WITHOUT CHECKING SPM\;-]-^$SPH77==. ;SPM CHANGES THE INSTRUCTION AT!_ ;THE LOCATION OF THIS LABEL `.a DEC (R2) ;INDICATE ONE PACKET LESS IN LIST b RETURN ;:c4$: MOV #$CRAVL-2,R0 ;POINT BACK TO ALLOCATION MASK WORDde .ENDCfg.h$ALOC1::ADD (R0),R1 ;ROUND TO NEXT BOUNDARYi BIC (R0)+,R1 ;CLEAR EXCESS,%j5$: SEC ;ASSUME ZERO LENGTH BLOCK&k BEQ 35$ ;IF EQ ZERO LENGTH REQUESTlm .IF DF P$$CTLn)o MOV R0,-(SP) ;SAVE ADDRESS OF LISTHEADLpq .ENDCr0s10$: MOV R0,R2 ;SAVE ADDRESS OF CURRENT BLOCK*t MOV (R2),R0 ;GET ADDRESS OF NEXT BLOCKuvw .IF DF R$$DERxy BEQ 40$ ;IF EQ END OF CHAINSz ;3{ ;THE FOLLOWING CODE CHECKS TO SEE IF THE POOL .| ;...FRAGMENT IS OF VALID SIZE. IT CAN BE4} ;...NEITHER ODD NOR AN ODD MULTIPLE OF 2 BYTES~ ;E% BIT #3,2(R0) ;FRAGMENT SIZE VALID?N€ BNE 50$ ;IF NE, NO�‚ .IFFEƒ„ BEQ 30$ ;IF EQ END OF CHAIN…† .ENDC‡ˆ"‰ CMP 2(R0),R1 ;BLOCK BIG ENOUGH?Š BLO 10$ ;IF LO NO &‹ BEQ 20$ ;IF EQ BLOCK IS EXACT SIZE*Œ TST (00jºrarßmæàmçámýfáþfDATAR0)+ ;POINT TO SIZE OF FREE BLOCK)� SUB R1,(R0) ;CALCULATE SIZE REMAININGD&Ž ADD R0,R1 ;POINT TO NEW FREE BLOCK� MOV (R0),(R1) ;COPY SIZEP� MOV -(R0),-(R1) ;COPY LINKV-‘ MOV R1,(R0) ;STORE LINK TO NEW FREE BLOCK $’ SUB R0,R1 ;RESTORE SIZE OF BLOCK3“20$: MOV (R0),(R2) ;UPDATE LINK TO NEW FREE BLOCKI ”30$: ;• .IF DF P$$CTL–6— BIT #^C<$CRAVL>,(SP)+ ;ALLOCATION FROM EXEC'S POOL?.˜ BNE 35$ ;IF NE NO, SKIP POOL SIZE TRACKING.™ ROR (R0) ;ALLOCATION FAILURE? (SAVE C-BIT)š BPL 32$ ;IF PL NOE1› MOV #PC.ALF!,R2 ;SET LOW POOL MASKA)œ BR 33$ ;REPORT THE ALLOCATION FAILUREO8�32$: SUB R1,$PRISZ ;SUBTRACT FROM TOTAL FREE POOL SIZEž;+Ÿ; ** W A R N I N G **L ;O¡; SPM HOOKPOINT NUMBER 76.¢;S+£; DO NOT CHANGE THE INSTRUCTION FOLLOWINGA¤; LABEL WITHOUT CHECKING SPM¥;-¦-§$SPH76==. ;SPM CHANGES THE INSTRUCTION AT;!¨ ;THE LOCATION OF THIS LABELE©8ª CMP @#$PRISZ,@#$PRILL ;DID WE CROSS LOWER POOL LIMIT?&« BHIS 34$ ;IF HIS NO, ALLOCATION OK9¬ MOV #PC.LOW!,R2 ;SET UP LOW POOL CONDITIONS.­33$: CALL $PLTRQ ;REQUEST POOL MONITOR TASK'®34$: ASL (R0) ;RECOVER THE CARRY BIT ¯° .ENDC±²35$: RETURN ;DONEG³´µ .IF DF R$$DER¶ ·40$: ;¸¹ .IF DF P$$CTLº» INC (SP)+ ;CLEAN STACK¼½ .ENDC¾'¿ DEC R0 ;RETURN A VALUE OF MINUS ONEA À RETURN ;CÁEÂ50$: BGCK$A BF.POL,BE.FSI,FATAL ;ALLOCATION - FRAGMENT SIZE INVALID;ÃÄ .ENDCÅÆ Ç .DSABL LSBIÈÉ;+-Ê; **-$ALCLK-ALLOCATE CLOCK QUEUE CORE BLOCK4Ë;2LÌ; THIS ROUTINE IS CALLED TO ALLOCATE A CORE BLOCK FOR A CLOCK QUEUE ENTRY.Í;: Î; INPUTS:EÏ; Ð; NONE.IÑ; Ò; OUTPUTS:Ó;5CÔ; IF INSUFFICIENT CORE IS AVAILABLE TO ALLOCATE THE BLOCK, THEN A@Õ; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED. ELSE THE ADDRESS OF8Ö; THE ALLOCATED BLOCK IS RETURNED TO THE CALLER IN R0.×;-Ø Ù .ENABL LSBB7Ú$ALCLK::MOV #C.LGTH,R1 ;PICK UP LENGTH OF CLOCK BLOCK. Û BR 10$ ;ÜÝ;+/Þ; **-$DECLK-DEALLOCATE CLOCK QUEUE CORE BLOCKEPß; **-$DCLKA-DEALLOCATE CLOCK QUEUE BLOCK THAT MAY HAVE ACCOUNTING REQUIREMENTSà;UIá; THIS ROUTINE IS CALLED TO DEALLOCATE A CORE BLOCK THAT WAS BEING USEDâ; FOR A CLOCK QUEUE ENTRY.ã; ä; INPUTS:Hå;C3æ; R0=ADDRESS OF THE CORE BLOCK TO BE DEALLOCATED.Eç;S è; OUTPUTS:é;4ê; THE CLOCK QUEUE ENTRY CORE BLOCK IS DEALLOCATED.ë;-ì í$DCLKA::îïð .IF DF A$$CNTñ0ò CMPB #C.SCHD,C.RQT(R0) ;PERIODIC TASK REQUESTó BEQ 2$ ;IF EQ YESE3ô CMPB #C.SSHT,C.RQT(R0) ;SINGLE SHOT TASK REQUESTOõ BNE $DECLK ;IF NE NO"ö2$: MOV C.UAB(R0),R1 ;LOCATE UAB÷ BEQ $DECLK ;IF EQ, NO UABD)ø MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGUù MOV R1,KISAR6 ;MAP UAB +ú DECB @#B.USE+140000 ;DECREMENT USE COUNTE&û BNE 4$ ;IF NE, UAB IS STILL ACTIVEü MOV R0,-(SP) ;SAVE R0.ý BICB #BS.ACT,@#B.STM+140000 ;DEACTIVATE UAB$þ CALL $QACNT ;QUEUE UAB TO SYSLOG*ÿ MOV (SP)+,R0 ;RESTORE CLQ BLOCK ADDRESS04$: MOV (SP)+,KISAR6 ;RESTORE ORIGINAL MAPPING .ENDC $DECLK::* .IF DF N$$DIR ;NAMED DIRECTORY SUPPORT1  CMPB #C.SCHD,C.RQT(R0) ;PERIODIC TASK REQUEST?E  BEQ 5$ ;IF EQ, YES4  CMPB #C.SSHT,C.RQT(R0) ;SINGLE SHOT TASK REQUEST?  BNE 7$ ;IF NE, NO4/ 5$: TSTB C.NAM(R0) ;IS THERE A CONTEXT BLOCK?B BEQ 7$ ;IF EQ, NOV. MOV C.CTX(R0),R1 ;GET CONTEXT BLOCK POINTER! BEQ 7$ ;BR IF EQ, NONE EXISTS ) CALL $DLCTX ;DEALLOCATE CONTEXT BLOCKO7$: ;REFERENCE LABEL  .ENDC ; DF N$$DIR0 MOV #C.LGTH,R1 ;PICK UP LENGTH OF CLOCK BLOCK BR $DEACB ;$;+5; **-$ALPKT-ALLOCATE SEND OR I/O REQUEST CORE BLOCKR; E; THIS ROUTINE IS CALLED TO ALLOCATE A CORE BLOCK FOR A SEND OR I/OL; REQUEST QUEUE ENTRY.; ; INPUTS:; ; NONE.R!;S "; OUTPUTS:#;OC$; IF INSUFFICIENT CORE IS AVAILABLE TO ALLOCATE THE BLOCK, THEN AP@%; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED. ELSE THE ADDRESS OF8&; THE ALLOCATED BLOCK IS RETURNED TO THE CALLER IN R0.';-(2)$ALPKT::MOV #I.LGTH,R1 ;SE00jÂr³rn´cÚµcÛ¶c�·c›’T LENGTH OF I/O PACKET.*10$: CALL $ALOCB ;ATTEMPT TO ALLOCATE BLOCK+ BCC 80$ ;IF CC SUCCESSFULR#, DRSTS D.RS1 ;ALLOCATION FAILUREA-.;+7/; **-$DEPKT-DEALLOCATE SEND OR I/O REQUEST CORE BLOCK 0;.I1; THIS ROUTINE IS CALLED TO DEALLOCATE A CORE BLOCK THAT WAS BEING USEDS*2; FOR A SEND OR I/O REQUEST QUEUE ENTRY.3;, 4; INPUTS: 5;T36; R0=ADDRESS OF THE CORE BLOCK TO BE DEALLOCATED.F7; 8; OUTPUTS:9; B:; THE SEND OR I/O REQUEST QUEUE ENTRY CORE BLOCK IS DEALLOCATED.;;-<2=$DEPKT::MOV #I.LGTH,R1 ;SET LENGTH OF I/O PACKET>?;+$@; **-$DEACB-DEALLOCATE CORE BUFFER6A; **-$DEAC1-DEALLOCATE CORE BUFFER (ALTERNATE ENTRY)B;EJC; THIS ROUTINE IS CALLED TO DEALLOCATE AN EXEC CORE BUFFER. THE BLOCK ISFD; INSERTED INTO THE FREE BLOCK CHAIN BY CORE ADDRESS. IF AN ADJACENTHE; BLOCK IS CURRENTLY FREE, THEN THE TWO BLOCKS ARE MERGED AND INSERTEDF; IN THE FREE BLOCK CHAIN.G; H; INPUTS: I; 4J; R0=ADDRESS OF THE CORE BUFFER TO BE DEALLOCATED.6K; R1=SIZE OF THE CORE BUFFER TO DEALLOCATE IN BYTES.@L; R3=ADDRESS OF CORE ALLOCATION LISTHEAD-2 IF ENTRY AT $DEAC1.M;$ N; OUTPUTS:O;R=P; THE CORE BLOCK IS MERGED INTO THE FREE CORE CHAIN BY CORE AQ; ADDRESS AND IS AGCOMERATED IF NECESSARY WITH ADJACENT BLOCKS. R;-S9T$DEACB::MOV #$CRAVL-2,R3 ;POINT TO ALLOCATION MASK WORDTUVW .IF DF Q$$OPTX'Y ADD (R3),R1 ;ROUND TO NEXT BOUNDARYLZ BIC (R3)+,R1 ;&[ BEQ 80$ ;IF EQ NO BLOCK TO RELEASE.\ CMP R1,#I.LGTH ;LENGTH EQUAL TO I/O PACKET?] BNE 30$ ;IF NE NOO9^ MOV #$PKMAX,R2 ;PNT TO MAX # OF PACKETS TO PREALLOCATE2,_ CMPB (R2),-(R2) ;MAX NUMBER PREALLOCATED?` BLOS 30$ ;IF LOS YESa;+b; ** W A R N I N G **Yc; d; SPM HOOKPOINT NUMBER 75.e; +f; DO NOT CHANGE THE INSTRUCTION FOLLOWINGg; LABEL WITHOUT CHECKING SPMh;-i-j$SPH75==. ;SPM CHANGES THE INSTRUCTION AT!k ;THE LOCATION OF THIS LABELRl)m INC (R2) ;INDICATE ONE MORE AVAILABLEL-n MOV -(R2),(R0) ;LINK PACKET INTO LIFO LIST o MOV R0,(R2) ;B p RETURN ;Nqr .ENDCst.u$DEAC1::ADD (R3),R1 ;ROUND TO NEXT BOUNDARYv BIC (R3)+,R1 ;CLEAR EXCESSO&w BEQ 80$ ;IF EQ NO BLOCK TO RELEASEx30$: ;REF LABELyz{ .IF DF R$$DER!P$$CTLR|)} MOV R3,-(SP) ;SAVE ADDRESS OF LISTHEADO~ .ENDC€0�40$: MOV R3,R2 ;SAVE ADDRESS OF CURRENT BLOCK*‚ MOV (R2),R3 ;GET ADDRESS OF NEXT BLOCKƒ BEQ 50$ ;IF EQ END OF CHAINC„ CMP R0,R3 ;BLOCK GO HERE?A… BHIS 40$ ;IF HIS NOL+†50$: MOV R3,(R0) ;ASSUME NO AGLOMERATIONB‡ˆ .IF DF P$$CTL‰1Š CMP #$CRAVL,(SP) ;DEALLOCATION OF EXEC'S POOL? )‹ BNE 53$ ;IF NE NO, SKIP POOL TRACKINGŒ;+�; ** W A R N I N G **LŽ;�; SPM HOOKPOINT NUMBER 74.�;F+‘; DO NOT CHANGE THE INSTRUCTION FOLLOWING ’; LABEL WITHOUT CHECKING SPM“;-”-•$SPH74==. ;SPM CHANGES THE INSTRUCTION AT!– ;THE LOCATION OF THIS LABELT—,˜ ADD R1,@#$PRISZ ;COUNT SIZE IN POOL TOTAL ™53$: ;Gš› .ENDC ; DF P$$CTLœ/� MOV R0,-(SP) ;CALCULATE ADDRESS OF NEW BLOCKBž ADD R1,(SP) ;CŸ  .IF DF R$$DER¡)¢ BCS 110$ ;IF CS, ILLEGAL DEALLOCATION$5£ CMP 2(SP),#$CRAVL ;DEALLOCATION IN EXECUTIVE POOL?I¤ BNE 55$ ;IF NE NO 4¥ CMP R0,#$POOL ;DEALLOCATION BEFORE FRONT OF LIST?¦ BLO 120$ ;IF LOW, YESE2§ CMP (SP),$EXSIZ ;DEALLOCATION PAST END OF POOL?¨ BHI 130$ ;IF HIGH, YES©55$: ;REFERENCE LABELª« .IFTF¬(­ CMP R3,(SP)+ ;EQUAL TO NEXT IN CHAIN?®¯ .IFT°)± BLO 90$ ;IF LO, DEALLOCATION OVERLAPSC²³ .IFTF´µ BNE 60$ ;IF NE NO,3¶ MOV (R3)+,(R0) ;MOVE LINK WORD TO BLOCK RELEASEDC!· ADD (R3),R1 ;MERGE TWO BLOCKSS3¸60$: MOV R2,-(SP) ;SAVE ADDRESS OF PREVIOUS BLOCK5'¹ MOV R0,(R2)+ ;ASSUME NO AGLOMERATIONA1º ADD (R2),(SP) ;CALCULATE ADDRESS OF NEXT BLOCKE/» CMP R0,(SP)+ ;EQUAL TO BLOCK BEING RELEASED?P¼½ .IFT1¾ ¿ BHIS 65$ ;IF HIS, NO OVERLAP9À CMP (SP),#$CRAVL ;DEALLOCATION IN EXECUTIVE CORE POOL?I2Á BEQ 100$ ;IF EQ YES (ELSE NOT SURE OF OVERLAP)Â65$: ;REF LABELÃÄ .ENDC00jÊrarßmæàmçámýfáþfDATAÅÆ BNE 70$ ;IF NE NO!Ç ADD (R2),R1 ;MERGE TWO BLOCKSB3È MOV (R0),-(R2) ;MOVE LINK WORD TO PREVIOUS BLOCK'É MOV R2,R0 ;SET NEW ADDRESS OF BLOCKU/Ê70$: MOV R1,2(R0) ;SET SIZE OF BLOCK RELEASEDAËÌ .IF DF P$$CTLÍ3Î CMP #$CRAVL,(SP)+ ;ALLOCATION IN EXEC CORE POOL? /Ï BNE 80$ ;IF NE NO, SKIP DEALLOCATION CHECKS 4Ð CMP $PRISZ,$PRIHL ;DID WE CROSS UPPER POOL LIMIT?Ñ BLOS 80$ ;IF LOS NOO:Ò MOV #PC.HIH!,R2 ;SET UP HIGH POOL CONDITION)Ó BR $PLTRQ ;REQUEST POOL RECOVERY TASKEÔÕ .IFFNÖ× .IF DF R$$DERØ&Ù TST (SP)+ ;POP ADDRESS OF LISTHEADÚÛ .ENDCÜ0Ý$PLTRQ:: ;MAKE SURE $PLTRQ IS ALWAYS DEFINEDÞß .ENDCàá80$: RETURN ;Oâã .IF DF R$$DERä&å90$: TST R3 ;INSERT AT END OF LIST?æ BEQ 60$ ;IF EQ YES, OK7ç100$: BGCK$A BF.POL,BE.DDA,FATAL ;DOUBLE DEALLOCATION$9è110$: BGCK$A BF.POL,BE.SIZ,FATAL ;SIZE OF BLOCK INVALID;@é120$: BGCK$A BF.POL,BE.BAK,FATAL ;DEALLOCATED BLOCK BELOW POOL8ê130$: BGCK$A BF.POL,BE.POV,FATAL ;OVERLAPS END OF POOLëì .ENDCíî ï .DSABL LSBTðñ;+'ò; **-$PLTRQ-REQUEST POOL MONITOR TASKó;T=ô; THIS ROUTINE IS USED TO REQUEST THE EXECUTION OF THE POOLEõ; MONITOR TASK, IF INSTALLED. THE FORMAT OF THE POOL TASK/EXECUTIVEN&ö; COMMUNICATIONS WORD IS AS FOLLOWS:÷;$<ø; $POLST CONTAINS CONDITION BITS INDICATING THE CUMULATIVE8ù; HISTORY OF THE POOL'S CONDITION SINCE THE LAST TIME8ú; THAT THE POOL MONITOR TASK CLEARED THEM. THESE BITS6û; ARE SET BY THIS ROUTINE AND MAY BE CLEARED BY THE7ü; POOL MONITOR TASK. NOTE THAT MORE THAN ONE BIT MAY$)ý; BE SET IN THIS BYTE AT ANY ONE TIME. Bþ; $POLST+1 CONTAINS INHIBIT BITS INDICATING WHAT POOL CONDITIONS;ÿ; THE POOL MONITOR TASK IS CURRENTLY AWARE OF. A BIT SETN<; IN THIS BYTE INDICATES TO THIS ROUTINE A POOL CONDITION8; THAT DOES NOT REQUIRE EXECUTION OF THE POOL MONITOR9; TASK. THESE BITS ARE ONLY MODIFIED BY THE POOL TASK.H7; GENERALLY, THERE IS NEVER MORE THAN ONE BIT SET INT!; THIS BYTE AT ANY GIVEN TIME. ;E?; THE CALLER OF THIS ROUTINE PROVIDES A BIT MASK INDICATING ABC; POOL CONDITION THAT IT WISHES TO MAKE KNOWN TO THE POOL MONITORIF; TASK. THE GENERAL FORM OF THIS BIT MASK IS #>,C ; WHERE 'XXX' DENOTES WHICH OF THE EIGHT POTENTIAL CONDITIONS THE B ; USER WISHES TO MAKE KNOWN TO THE POOL MONITOR TASK (BY STORINGD ; THE PC.XXX BIT IN THE LOW BYTE OF $POLST). THE FOLLOWING ACTIONS ; CAN OCCUR: ;S?; 1) IF THE SPECIFIED LOW BYTE MASK BIT IS ALREADY SET IN THEEA; LOW BYTE OF $POLST, THEN THIS INDICATES THAT THIS ROUTINE HASTA; BEEN CALLED MULTIPLE TIMES FOR THE SAME POOL CONDITION BEFORE @; THE POOL TASK COULD EXECUTE AND CLEAR THE BIT. IN THIS CASE,; THE ROUTINE RETURNS.; ?; 2) IF THE BIT IS NOT ALREADY SET IN THE LOW BYTE OF $POLST,S@; THEN THIS INDICATES THAT THE POOL PROGRAM MIGHT NOT BE AWARE@; OF THIS POOL CONDITION AND A SECOND CHECK MUST BE MADE USING@; THE HIGH BYTE OF $POLST. IF THE SPECIFIED HIGH BYTE MASK BIT:; IS ALREADY SET IN THE HIGH BYTE, THEN THE POOL TASK ISB; CURRENTLY AWARE OF THE CONDITION AND DOES NOT WISH TO EXECUTE.C; IF THE BIT IS NOT SET IN THE HIGH BYTE, THEN THE POOL CONDITION ?; IS A NEW ONE AND THE POOL MONITOR TASK IS REQUESTED TO RUN. ;SI; THIS INTERFACE IS FLEXIBLE ENOUGH TO ALLOW OTHER INTERFACE PROTOCOLS:T;OA; - ONE INHIBIT BIT ($POLST+1) COULD BE DEFINED TO 'COVER' MOREN? ; THAN ONE CONDITION BIT ($POLST+0). FOR INSTANCE, $PLTRQ CANPB!; BE CALLED WITH R2=403, WHERE THERE ARE TWO CONDITION BITS SET,0"; BUT ONLY ONE INHIBIT BIT SPECIFIED FOR BOTH.#;N?$; - THERE NEED NOT BE A MIRROR-IMAGE RELATIONSHIP BETWEEN THEH?%; INHIBIT BITS AND THE CONDITION BITS. FOR VARYING CONDITIONS B&; AND STATES, VARIOUS COMBINATIONS OF THESE BITS CAN BE ENCODED.';EA(; - NO INHIBIT BIT NEED BE SPECIFIED AT ALL. IN THIS CASE, EVEN B); IF THE POOL MONITOR TASK HAD SET THE CORRESPONDING INHIBIT BIT?*; IN $POLST+1 FOR THE CONDITION ABOUT TO BE REPORTED, LEAVINGHA+; 00jÒr³rn´cÚµcÛ¶c�·c›’THE HIGH BYTE OF R2 CLEAR WILL FORCE THE POOL MONITOR TASK TOI:,; EXECUTE FOR THAT CONDITION REPORTED IN THE LOW BYTE OF?-; R2 (UNLESS, OF COURSE, THAT BIT IS ALREADY SET IN $POLST+0,T>.; INDICATING A MULTIPLE REQUEST). FOR INSTANCE, IF $PLTRQ IS>/; CALLED WITH R2=1, THE POOL TASK MAY EXECUTE AND SET $POLST=0; TO 400, THE INHIBIT BIT FOR POOL CONDITION '1'. IF $PLTRQF?1; WERE THEN CALLED AGAIN WITH R2=1, THE POOL TASK WOULD AGAIN @2; BE CALLED BECAUSE R2 DID NOT HAVE THE INHIBIT BIT SPECIFIED.:3; THIS OPERATION FORCES THE POOL TASK TO RESPOND ANYWAY.4;E5; THE REASON FOR SUCH FLEXIBILITY IS TO GENERALIZE THE INTERFACE TOSH6; BE USEFUL FOR A VARIETY OF CHORES. THE INTERFACE NEED NOT BE LIMITED7; TO POOL STATUS REPORTING.$8; 9; INPUTS:D:; >;; R2=POOL CONDITION BIT MASK (PC.XXX OR'ED WITH PC.XXX*400).<;I =; OUTPUTS:>;I=?; IF NO BITS IN THE LOW BYTE OF R2 ARE SET IN $POLST AND NO =@; BITS IN THE HIGH BYTE OF R2 ARE SET IN $POLST+1, THEN THEH:A; POOL TASK IS REQUESTED WITH THE REASON FOR THE REQUESTAB; (PC.XXX) STORED IN THE LOW BYTE OF $POLST. OTHERWISE, RETURN. C; D; R0,R1 AND R3 ARE PRESERVED. E;-FG .IF DF P$$CTLH I .ENABL LSBE?J$PLTRQ::BITB R2,$POLST ;ALREADY REQUESTED FOR THIS CONDITION?N/K BNE 20$ ;IF NE YES, AVOID MULTIPLE REQUESTSX2L BISB R2,$POLST ;INDICATE CURRENT POOL CONDITION)M CLRB R2 ;CHECK POOL TASK INHIBIT BITSS7N BIT R2,$POLST ;REQUEST POOL TASK FOR THIS CONDITION? 3O BNE 20$ ;IF NE NO, TASK AWARE OF POOL CONDITIONDP MOV R0,-(SP) ;SAVE R0.Q MOV $PTTCB,R0 ;POOL MONITOR TASK INSTALLED?'R BEQ 10$ ;IF EQ NO, CAN'T REQUEST ITRS MOV R1,-(SP) ;SAVE R1T MOV R3,-(SP) ;SAVE R3.U CALL $EXRQN ;REQUEST THE POOL MONITOR TASKV MOV (SP)+,R3 ;RESTORE R3NW MOV (SP)+,R1 ;RESTORE R1YX10$: MOV (SP)+,R0 ;RESTORE R0BY20$: RETURN ;C Z .DSABL LSBL[\ .ENDC ; DF P$$CTL]^;+6_; **-$ALSEC-ALLOCATE CORE BUFFER FROM SECONDARY POOLI_; **-$ALSC1-ALLOCATE 32 WORD BLOCKS OF POOL - ALTERNATE ENTRY ;PKW118_; ;PKW118`;La; THIS ROUTINE IS CALLED TO ALLOCATE A BLOCK FROM THE SECONDARY POOL. THECb; ALLOCATION ALGORITHM IS FIRST FIT (SAME AS $ALOCB). BLOCKS ARE Lc; ALLOCATED IN UNITS OF 32 WORDS, AND A BLOCK WILL ALWAYS START ON A 32 WD,d; BOUNDRY TO FACILITATE MAPPING THE BLOCK.e;R f; INPUTS:Tg; 7h; R1=SIZE OF THE BUFFER TO ALLOCATE IN 32 WORD BLOCKS=h; R2=ADDRESS OF POOL LISTHEAD IF ENTRY AT $ALSC1 ;PKW118Li;L j; OUTPUTS:k;K?l; C=1 IF INSUFFICIENT CORE IS AVAILABLE TO ALLOCATE THE BLOCK m; R0=-1Un;I(o; C=0 IF THE ALLOCATION WAS SUCCESSFUL0p; R0=ADDRESS OF BLOCK (TO BE USED IN AN APR)4q; R1=SIZE OF BLOCK JUST ALLOCATED IN 32 WD UNITSr;S$s; R3, R4, R5 PRESERVED ACROSS CALLt; u;-v w$ALSEC::xyz .IF DF P$$OOL{O{ .IIF DF C$$SC1 MOV #$POLHD,R2 ;PUT $POLHD WHERE ROUTINE LOOKS FOR IT ;PKW118B{$ALSC1:: ;PKW118{ ;PKW118A | .ENABL LSBW}~ SAVNR ;SAVE R4, R5K~ ;PKW118I8~ .IF DF C$$SC1 ;IF ALTERNATE SECONDARY POOL ;PKW118~ ;PKW118E$~ MOV R3,-(SP) ;AND R3 ;PKW118+~ MOV R2,R3 ;MOVE THE LISTHEAD ;PKW118 ~ ;PKW118 ~ .ENDC ;C$$SC1 ;PKW118~ ;PKW118D, MOV #-1,R0 ;ASSUME REQUESTED LENGTH IS 05€ MOV #KISAR6,R4 ;POINT TO APR USED FOR POOL MAPPING,'� MOV (R4),-(SP) ;SAVE CURRENT MAPPING 7‚ MOV #140000,R2 ;VIRTUAL ADDRESS OF MAPPED POOL BLOCKA2ƒ CLR R5 ;PREVIOUS BLOCK IN LIST IS THE LISTHEAD„ TST R1 ;IS LENGTH ZERO?$… SEC ;ASSUME IT IS† BEQ 50$ ;IF EQ YES† ;PKW118G† .IIF DF C$$SC1 MOV (R3),(R4) ;MAP FIRST FREE BLOCK IN POOL ;PKW118PI† .IIF NDF C$$SC1 MOV $POLHD,(R4) ;MAP FIRST FREE BLOCK IN POOL ;PKW118 † ;PKW118Rˆ BR 20$ ;**-13‰10$: MOV (R4),R5 ;SAVE CURRENT BLOCK AS PREVIOUSO#Š MOV (R2),(R4) ;MAP TO NEXT BLOCKU#‹20$: BEQ 50$ ;IF EQ, END OF LISTR%Œ CMP 2(R2),R1 ;IS BLOCK BIG ENOUGH?C� BLO 10$ ;IF LO NOI!Ž BEQ 30$ ;IF EQ YES, EXACT FIT;0� MOV (R200jÚrarßmæàmçámýfáþfDATA)+,-(SP) ;SAVE LINK TO NEXT POOL BLOCK� MOV (R2),-(SP) ;SAVE SIZE)‘ SUB R1,(SP) ;CALCULATE REMAINING SIZEA2’ ADD R1,(R4) ;MAP TO REMAINING PORTION OF BLOCK:“ MOV (SP)+,(R2) ;GET REMAINING SIZE OF UNALLOCATED BLOCK,” MOV (SP),-(R2) ;INSERT LINK TO NEXT BLOCK'• MOV (R4),(SP) ;SAVE ADDRESS OF BLOCK 2– SUB R1,(R4) ;MAP BACK TO BLOCK TO BE ALLOCATED,— MOV (SP)+,(R2) ;SAVE POINTER TO NEW BLOCK/˜30$: MOV (R4),R0 ;ADDRESS OF ALLOCATED BLOCKO˜ ;PKW118 ˜ .IFDF C$$SC1 ;PKW118˜ ;PKW118N4˜ CMP R3,#$POLHD ;IS THIS SECONDARY POOL? ;PKW1186˜ BNE 35$ ;NO, LEAVE TOTAL FREE SPACE ALONE ;PKW118˜ ;PKW118 ˜ .ENDC ;C$$SC1 ;PKW118R˜ ;PKW118L;™ SUB R1,$SECFR ;SUBTRACT AMOUNT ALLOCATED FROM TOTAL FREE?™35$: MOV (R2),-(SP) ;GET ADDRESS OF NEXT FREE BLOCK ;PKW118 /› MOV R5,(R4) ;MAP TO PREVIOUS BLOCK ;**-1 2œ BEQ 40$ ;IF EQ, PREVIOUS BLOCK IS THE LISTHEAD+� MOV (SP)+,(R2) ;UNLINK ALLOCATED SECTION. ž BR 50$ ž40$: ;PKW118 Ež .IIF DF C$$SC1 MOV (SP)+,(R3) ;UNLINK ALLOCATED SECTION ;PKW118EFž .IIF NDF C$$SC1 MOV (SP)+,$POLHD ;UNLINK ALLOCATED SECTION ;PKW118ž ;PKW118 = 50$: MOV (SP)+,(R4) ;RESTORE ORIGINAL KISAR6 MAPPING ;**-1OG  .IIF DF C$$SC1 MOV (SP)+,R3 ;RESTORE ORIGINAL CONTENTS OF R3 ;PKW118T ¡60$: RETURNP¢£;+H¤; **-$ALSPK-ALLOCATE A RECEIVE BY REFERENCE PACKET FROM SECONDARY POOL7¥; **-$ALVPK-ALLOCATE A PACKET FROM THE SECONDARY POOLA¦;E>§; THIS ROUTINE IS CALLED TO ALLOCATE A SECONDARY POOL BLOCK.'¨; THE PACKET IS MAPPED THROUGH APR 5.N©;W ª; INPUTS: «;$4¬; R1=SIZE OF BLOCK IN UNITS OF 32. WORDS ($ALVPK).­; ®; OUTPUTS:¯;&°; C=0 IF A BLOCK HAS BEEN ALLOCATED.3±; R0=120000 (THE PACKET IS MAPPED THROUGH APR5).3(²; KISAR5 IS SET UP TO MAP THE PACKET.@³; C=1 IF INSUFFICIENT CORE IS AVAILABLE TO ALLOCATE THE BLOCK.+´; DIRECTIVE STATUS OF D.RS1 IS RETURNED.Lµ;L¶;-·7¸$ALSPK::MOV #/100,R1 ;GET SIZE TO ALLOCATE (¹$ALVBK::CALL $ALSEC ;ALLOCATE A BLOCK%º BCS 65$ ;IF CS ALLOCATION FAILURE5-» MOV R0,KISAR5 ;MAP THE PACKET THROUGH APR5O4¼ MOV #120000,R0 ;POINT TO FIRST WORD OF THE PACKET½ RETURN ;RETURN WITH C=0'¾65$: DRSTS D.RS1 ;ALLOCATION FAILUREK¿À;+FÁ; **-$DESPK-DEALLOCATE RECEIVE BY REFERENCE PACKET TO SECONDARY POOLÂ;FFÃ; THIS ROUTINE IS CALLED TO DEALLOCATE A RECEIVE BY REFERENCE PACKETÄ; TO THE SECONDARY POOL.Å;- Æ; INPUTS:KÇ; =È; R0=ADDRESS OF PACKET TO BE DEALLOCATED. THIS MUST BE THEE>É; APR VALUE TO MAP THE FIRST 32. WORD SEGMENT OF THE BLOCK.Ê;R Ë; OUTPUTS:Ì;A Í; NONE.HÎ;OÏ;-ÐÑ .IFTFÒ Ó$DESPK::ÔÕ .IFTAÖ2× MOV #/100,R1 ;GET SIZE TO DEALLOCATEØÙ;+5Ú; **-$DESEC-DEALLOCATE CORE BLOCK IN SECONDARY POOLBGÚ; **-$DESC1-DEALLOCATE 32-WORD CORE BLOCK INTO PRIVATE POOL ;PKW118 Û;OJÜ; THIS ROUTINE IS CALLED TO DEALLOCATE A SECONDARY POOL BLOCK. THE BLOCKJÝ; IS INSERTED INTO THE FREE BLOCK CHAIN BY CORE ADDRESS. IF AN ADJACENT<Þ; BLOCK IS CURRENTLY FREE, THEN THE TWO BLOCKS ARE MERGED.ß; à; INPUTS:Tá;Aâ; R0=ADDRESS OF CORE BLOCK TO BE DEALLOCATED. THIS MUST BE THEF<ã; APR VALUE TO MAP THE FIRST 32 WORD SEGMENT OF THE BLOCK.ä; R1=SIZE OF THE BLOCK IN UNITS OF 32 WORDS.=ä; R2=ADDRESS OF POOL LISTHEAD IF ENTRY AT $DESC1 ;PKW118Oå;A æ; OUTPUTS:ç;@è; THE CORE BLOCK IS MERGED INTO THE FREE CORE CHAIN BY ADDRESS4é; AND MERGED WITH ANY BORDERING BLOCKS IF POSSIBLEê;Yë; R3, R4, R5 PRESERVEDì;í;-îï .IFTFð ñ$DESEC::Iñ .IIF DF C$$SC1 MOV #$POLHD,R2 ;PUT $POLHD ADDRESS WHERE NEEDED ;PKW118Bñ$DESC1:: ;PKW118òó .IFTFôõ TST R1 ;IS LENGTH ZEROö BEQ 140$ ;IF EQ YESB÷ SAVNR ;SAVE R4, R5Bø MOV R3,-(SP) ;SAVE R3Fø .IIF DF C$$SC1 MOV R2,-(SP) ;PUT THE LISTHEAD ON THE STACK ;PKW118ùú .IF NDF X$$SEC û8û .IF DF C$$SC1 ;IF ALTERNATE SECONDARY POOL ;PKW118û ;PKW118N;û CMP (SP),#$POLHD ;IS THIS REAL SECONDARY POOL? 00jâr³rn´cÚµcÛ¶c�·c›’ ;PKW118D>û BNE 69$ ;NO, DON'T CHECK FOR IT BEING IN PARTITION ;PKW118û ;PKW118Lû .ENDC ;C$$SC1 ;PKW118û ;PKW118K"ü MOV $PLPAR,R3 ;LOCATE PARTITION-ý MOV P.REL(R3),R4 ;GET ITS STARTING ADDRESSV,þ CMP R4,R0 ;DOES BLOCK START IN PARTITIONÿ BHI 160$ ;IF HIGH, NOS2 ADD P.SIZE(R3),R4 ;GET TOP ADDRESS IN PARTITION .IFTF' ADD R1,R0 ;GET TOP ADDRESS OF BLOCKR- BCS 150$ ;CS- OVERFLOW....BAD DEALLOC LEN( .IFTI*  CMP R4,R0 ;DOES BLOCK END IN PARTITION  BLO 170$ ;IF LOW, NO   .ENDC , SUB R1,R0 ;RESTORE BASE ADDRESS OF BLOCK ;PKW118R69$: .IIF DF C$$SC1 MOV @(SP),R3 ;GET THE ADDRESS OF THE FIRST FREE BLOCK;PKW118P .IIF NDF C$$SC1 MOV $POLHD,R3 ;GET THE ADDRESS OF THE FIRST FREE BLOCK;PKW118 ;PKW118P/ MOV #140000,R4 ;GET VIRTUAL ADDRESS OF BLOCK, MOV #KISAR6,R5 ;POINT TO MAPPING REGISTER' MOV (R5),-(SP) ;SAVE CURRENT MAPPING 5 CLR -(SP) ;WORD FOR STORING TOP OF PREVIOUS BLOCKC3 CLR R2 ;INITIAL PREV. BLOCK IN LIST IS LISTHEAD.170$: MOV R3,(R5) ;MAP NEXT FREE BLOCK ;**-1O BEQ 95$ ;IF EQ, END OF LIST.1 CMP R0,R3 ;DOES BLOCK GO BEFORE CURRENT BLOCKF BLO 80$ ;IF LO YES  BEQ 180$$- MOV R3,(SP) ;GET ADDRESS OF CURRENT BLOCKT, ADD 2(R4),(SP) ;CALCULATE ITS TOP ADDRESS2 MOV R3,R2 ;STORE ADDRESS AS THE PREVIOUS BLOCK1 MOV (R4),R3 ;POINT TO NEXT BLOCK IN FREE LIST,  BR 70$ ;780$: ADD R1,R0 ;GET TOP ADDRESS IN DEALLOCATED BLOCKE5  CMP R0,R3 ;CAN IT BE COMBINED WITH THE NEXT BLOCKS! BNE 90$ ;IF NE NOR0" MOV (R4)+,-(SP) ;SAVE LINK TO NEXT FREE BLOCK# MOV (R4),-(SP) ;SAVE LENGTH4$ SUB R1,R0 ;FIND START OF BLOCK BEING DEALLOCATED% MOV R0,(R5) ;MAP IT$.& MOV R1,(R4) ;INSERT TO LENGTH OF THE BLOCK+' ADD (SP)+,(R4) ;ADD LENGTH OF NEXT BLOCKS+( MOV (SP)+,-(R4) ;LINK TO NEXT FREE BLOCKS ) BR 100$:*90$: BHI 180$ ;IF HIGH, DEALLOCATED BLOCK OVERLAPS NEXT4+ SUB R1,R0 ;GET BASE ADDRESS OF DEALLOCATED BLOCK0,95$: MOV R0,(R5) ;MAP BLOCK BEING DEALLOCATED7- MOV R3,(R4) ;INSERT LINK TO NEXT BLOCK IN FREE LISTA. MOV R1,2(R4) ;INSERT LENGTH=/100$: CMP (SP)+,R0 ;CAN BLOCK BE MERGED WITH PREVIOUS BLOCKB0 BNE 110$ ;IF NE NO01 MOV (R4)+,-(SP) ;SAVE LINK TO NEXT FREE BLOCK2 MOV (R4),-(SP) ;AND LENGTH(03 MOV R2,(R5) ;MAP PREVIOUS BLOCK IN FREE LIST64 ADD (SP)+,(R4) ;ADD LENGTH TO WHAT IS ALREADY THERE&5 MOV (SP)+,-(R4) ;LINK TO NEXT BLOCK 6 BR 130$77110$: BHI 180$ ;IF HI, BLOCK OVERLAPS PREVIOUS BLOCKR#8 MOV R2,(R5) ;MAP PREVIOUS BLOCK.9 BNE 120$ ;IF NE, THERE IS A PREVIOUS BLOCK9 ;PKW118(O9 .IIF DF C$$SC1 MOV 2(SP),R4 ;USE THE LIST HEAD AS THE PREVIOUS BLOCK;PKW118BQ9 .IIF NDF C$$SC1 MOV #$POLHD,R4 ;USE THE LIST HEAD AS THE PREVIOUS BLOCK;PKW118(9 ;PKW118(C;120$: MOV R0,(R4) ;LINK BLOCK BEING DEALLOCATED INTO CHAIN ;**-1 ;130$: ;PKW118; .IF DF C$$SC1 ;PKW118I; ;PKW118BE; CMP 2(SP),#$POLHD ;WAS THIS A SECONDARY POOL DEALLOCATION? ;PKW118V*; BNE 135$ ;NO, JUST CONTINUE ;PKW118; ;PKW118R; .ENDC ;C$$SC1 ;PKW118(; ;PKW118M?; ADD R1,$SECFR ;ADD AMOUNT DEALLOCATED TO TOTAL FREE ;PKW118.:;135$: MOV (SP)+,(R5) ;RESTORE ORIGINAL MAPPING ;PKW118:; .IIF DF C$$SC1 TST (SP)+ ;POP $POLHD ADDRESS ;PKW118%= MOV (SP)+,R3 ;RESTORE R3 ;**-1H?140$: RETURN ;**-19@150$: BGCK$A BF.POL,BE.SIZ,FATAL ;SIZE OF BLOCK INVALID1@A160$: BGCK$A BF.POL,BE.BAK,FATAL ;DEALLOCATED BLOCK BELOW POOL8B170$: BGCK$A BF.POL,BE.POV,FATAL ;OVERLAPS END OF POOL7C180$: BGCK$A BF.POL,BE.DDA,FATAL ;DOUBLE DEALLOCATION D E .DSABL LSBAFG .ENDCHIJK .ENDD TO TOTAL FREE ;PKW118.:;135$: MOV (SP)+,(R5) ;RESTORE ORIGINAL MAPPING ;PKW118:; .IIF DF C$$SC1 TST (SP)+ ;POP $POLHD ADDRESS ;PKW118%= MOV (SP)+,R3 ;RESTORE R3 ;**-1H?140$: RETURN ;**-19@150$: BGCK$A BF.POL,BE.SIZ,FATAL ;SIZE OF BLOCK INVALID1@A160$: BGCK$A BF.POL,BE.BAK,FATAL ;DEALLOCATED BLOCK BELOW POOL00kêrarßmæàmçámýfáþfDATA .TITLE DRSCAS .IDENT /02.10/N ;,; COPYRIGHT (C) 1974, 1978, 1979, 1980, 1981/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.I;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDO9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.E;4; T. J. MILLER 23-OCT-77;O); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:$;G; B. S. MCCARTHY F;L;E; MODIFIED BY:;O; J. M. LAWLER 29-JUN-83 02.09;F0; JL162 -- CONDITIONALIZE DRSMP,DRMVS ON S$$MAP;A ; B. S. MCCARTHY 20-MAR-83 02.10;S5; BM295 -- REMOVE REFERENCES TO $HEADR TO STREAMLINE ; PROCESSING; ; SUPERVISOR MODE.;R; LOCAL MACRO DEFINITIONS;H S W .IF DF S$$LIB D .MCALL ABODF$,HWDDF$L" ABODF$ ;DEFINE TASK ABORT CODES& HWDDF$ ;DEFINE HARDWARE DEFINITIONS .;+; **-$DRSCA-SUPERVISOR CALLI;FG; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CALL TO CALL A SUPERVISOR MODEDE; SUBROUTINE AT THE SPECIFIED SUPERVISOR I SPACE VIRTUAL ADDRESS WITHE+; THE SPECIFIED COMPLETION ROUTINE ADDRESS.2;A ; DPB FORMAT:;B#; WD. 00 -- DIC(155.),DPB SIZE(3.).O2; WD. 01 -- ADDRESS OF SUPERVISOR ROUTINE TO CALL.5; WD. 02 -- ADDRESS OF SUPERVISOR COMPLETION ROUTINE.$;B ; INPUTS:L;B9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. 2; R3=ADDRESS OF SUPERVISOR ROUTINE TO CALL IN DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.E,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;R ; OUTPUTS:;P=; THE SPECIFIED ROUTINE IS CALLED IN SUPERVISOR MODE WITH THEE5; COMPLETION ROUTINE SET UP. CONDITION CODE AND DSW:; RETURNS ARE RESERVED FOR THE SUPERVISOR ROUTINE ITSELF.;P;; (IF THERE IS INSUFFICIENT SPACE ON THE TASK STACK FOR THEO9; SUPERVISOR RETURN SETUP, THE ISSUING TASK IS ABORTED.) ;-0$DRSCA::MFPI SP ;RETRIEVE CURRENT STACK POINTER2 ADD $BTRMV,(SP) ;REMOVE BYTES FROM DIRECTIVE CALL) MOV (SP),R2 ;SAVE COPY OF STACK POINTERD) MTPI SP ;RESTORE MODIFIED STACK POINTER . CLR $BTRMV ;PREVENT DIRECTIVE DISPATCHER MOD2 TSTB $SUPFL ;ISSUING TASK LINKED TO SUPER MODE ?* BEQ 30$ ;IF EQ NO, DON'T ALLOW DIRECTIVE( CALL $SGFIN ;SET TO SET CARRY ON TRAPS4 MOV 2(R3),-(SP) ;PUSH SUPERVISOR COMPLETION ADDRESS MOV #$UMPC,R1 ;POINT TO TRAP PC MOV (R1)+,-(SP) ;SAVE TRAP PC MOV (R1),-(SP) ;SAVE TRAP PSS@ MOV #CSMODE!PMODE,(R1) ;SET FOR SUPERVISOR RETURN PS (PREV=USR)3 BIC #17,(SP) ;CLEAR ALL CONDITION CODES IN PS WORDC' BMI 10$ ;IF MI PREVIOUS MODE WAS USERT? BIC #^CPSMODE&PMODE,(R1) ;ELSE SET PREVIOUS MODE TO SUPERVISORT10$: CLC ;INIT C-BIT TO 0D7 MOV (R3)+,-(R1) ;SET SUPERVISOR RETURN PC FROM THE DPBI, MFPI #0 ;ATTEMPT TO FETCH LOCATION ZERO IN ;SUPERVISOR LIBRARYP, BCS 13$ ;IF CS NO LOCATION ZERO, CERTAINLY ;ISN'T NEW INTERFACE4 CMP (SP)+,(PC)+ ;IS LOCATION ZERO A CMP (SP)+,(SP)+7 CMP (SP)+,(SP)+ ;(IF IT IS THIS IS A VERSION 2 LIBRARYE) ;SINCE IT HAS THE ODT TRANSFER VECTORC- BEQ 15$ ;IF EQ HANDLE LINKAGE TO V2 LIBRARYE,13$: CLC ;CLEAR CARRY AND START V1 LINKAGE4 MTPD -(R2) ;PUSH TRAP PS ON SUPER STACK (MAY TRAP)4 MTPD -(R2) ;PUSH TRAP PC ON SUPER STACK (MAY TRAP)4 MTPD -(R2) ;PUSH COMPLETION ADDRESS ON SUPER STACK- BCS 20$ ;IF CS TRAP ON SUPERVISOR STACK REFN BR 17$ ;FINISH IN COMMON CODEI!15$: CLC ;CLEAR CARRY INITIALLY+3 MOV 4(SP),-(SP) ;COPY PREVIOUS MODE RETURN ADDRESS+( MTPD -(R2) ;PUT IT ON SUPERVISOR STACK4 MOV (SP),-(SP) ;WE NEED A PLACEHOLDER, MUST BE MOVE ;TO NOT AFFECT C BIT# MTPD -(R2) ;ONTO SUPERVISOR STACKN) MTPD -(R2) ;COPY PS TO SUPERVISOR STACK 1 MOV (SP),(SP)+ ;DISCARD RETURN PC, LEAVE C ALONEA- MTPD -(R2) ;PUSH COMPLETION ROUTINE ADDRESSU. BCS 20$ ;IF CS TRAP ON SUPER STACK REFERENCE417$: MOV R2,-(SP) ;PUSH NEW SUPERVISOR STACK POINTER* MTPI SP ;UPDATE SUPERVISOR STACK POINTER RETURN ;V,20$: MOV #S.CAST,R0 ;SET FOR BAD STACK ABORT" CALLR $ABCTK ;ABORT ISSUING TASK730$: DRSTS D.RS8 ;ERROR - INCONSISTENT WITH TASK STATE  E .ENDC;+%; **-$DRSMP-MODIFY SUPERVISOR MAPPINGR;O<; THIS DIRECTIVE ALLOWS A USER TASK TO MODIFY THE MAPPING OF; SUPERVISOR DATA SPACE.;E ; DPB FORMAT:M00kòr³rn´cÚµcÛ¶c�·c›’; "; WD. 00 -- DIC(201.),DPB SIZE(2.);; WD. 01 -- NEW SUPERVISOR MAPPING PARAMETER MASK. THE MASKV5; IS CODED IN BITS 8.-14. OF THE WORD, WITH BIT 8. 6; CORRESPONDING TO APR1, ETC. IF A BIT IS SET TO 0,3; THEN THE CORRESPONDING APR IS MAPPED TO USER D;3; SPACE. IF ONE, THEN THE APR IS MAPPED TO SUPERI5; I SPACE. APR 0 IS ALWAYS MAPPED TO USER D SPACE.I.; IF BIT 15 IS SET, THE MAPPING MASK IS NOT); CHANGED, BUT THE STATUS IS RETURNED. ;E ; INPUTS: ;C*; R4=ADDRESS OF HEADER OF THE CURRENT TASK;. ; OUTPUTS:;>; THE SUPERVISOR MAPPING MASK (H.SMAP) IS SET AND THE APRS ARE;; UPDATED. THE DSW IS RETURNED WITH BITS 0-7 BEING THE HIGHR;; BYTE OF THE PSW (AT TIME OF DIRECTIVE ISSUANCE), AND BITS <; 8.-14. BEING THE OLD MAPPING MASK. BIT 15. IS ALWAYS ZERO.<; IN SYSTEMS WHICH DO NOT SUPPORT SUPERVISOR MODE LIBRARIES,+; THE HIGH BYTE IS ALWAYS RETURNED AS ZERO.E;- .IF DF, S$$MAP=$DRSMP::MOVB $STACK-1,2(SP) ;SET LOW BYTE OF DIRECTIVE STATUSC .IF DF S$$LIB9 MOVB H.SMAP(R4),3(SP) ;SET HIGH BYTE OF DIRECTIVE STATUSS( MOV (R3),R0 ;GET NEW MAPPING PARAMETER+ BMI 10$ ;IF MI INFORMATION ONLY DIRECTIVEI/ SWAB R0 ;PUT SUPER MAP WHERE WE CAN GET AT ITE2 MOVB R0,H.SMAP(R4) ;RESET SUPERVISOR MAPPING MASK. TSTB $SUPFL ;TASK USING SUPERVISOR WINDOWS ? BEQ 10$ ;IF EQ NOO% CALLR $LSUP1 ;RESET SUPER MODE APRS 10$: ;REFERENCE LABEL .ENDC ; DF S$$LIB) RETURN ;RETURN TO DIRECTIVE DISPATCHER(;+,; **-$DRMVS-MOVE TO/FROM VARIOUS TASK SPACES;@; THIS DIRECTIVE ALLOWS A USER TASK TO READ/WRITE DATA (ONE WORD>; AT A TIME), INTO ITS SUPER/USER I/D SPACES. THE DIRECTIVE ISE; INTENDED FOR USE BY COMPONENTS SUCH AS DEBUGGERS, WHERE EASE OF USEM8; OF THE DIRECTIVE OVERRIDES PERFORMANCE CONSIDERATIONS.;L ; DPB FORMAT:U;V"; WD 00. -- DIC(203.),DPB SIZE(4.)*; WD 01. -- CONTROL FLAGS WORD. FLAGS ARE:*; BIT 0 - IF ZERO, TARGET SPACE IS USER$; IF ONE, TARGET SPACE IS SUPER*; BIT 1 - IF ZERO, TARGET SPACE IS INST#; IF ONE, TARGET SPACE IS DATAI,; BIT 2 - IF ZERO, DIRECTION IS MOVE FROM#; IF ONE, DIRECTION IS MOVE TOE.; WD 02. -- ADDRESS OF SOURCE/DESTINATION WORD*; WD 03. -- ADDRESS OF BUFFER IF MOVE FROM; VALUE IF MOVE TOR;I ; INPUTS:S;R); R3=ADDRESS OF CONTROL FLAGS WORD IN DPBU;V ; OUTPUTS:;I&; THE DESTINATION OR BUFFER IS UPDATED;L9; A STATUS OF D.RS16 IS RETURNED IF A MOVE TO IS EXECUTED <; FOR A DESTINATION TO WHICH THE ISSUEING TASK DOES NOT HAVE; WRITE ACCESS.I;N<; A STATUS OF D.RS98 IS RETURNED IF THE ADDRESS OR BUFFER IS*; NOT IN THE TASK'S CURRENT ADDRESS SPACE.;-($DRMVS::MOV (R3)+,R5 ;PICK UP FLAGS WORD$ MOV #UINDR0,R0 ;ASSUME USER I-SPACE ASR R5 ;IS IT USER SPACE ? .IF DF S$$LIB BCC 10$ ;IF CC YES1 TSTB $SUPFL ;CURRENT TASK USE SUPERVISOR MODE ?P$ BEQ 30$ ;IF EQ NO, ILLEGAL ADDRESS+ MOV #SISDR0,R0 ;ADJUST TO SUPERVISOR SPACEN10$: ;REFERENCE LABEL .ENDC ; DF S$$LIB ASR R5 ;IS IT I OR D SPACE ? .IF DF U$$DAS!S$$LIBI BCC 20$ ;IF CC I SPACE) ADD #UDSDR0-UINDR0,R0 ;ADJUST TO D SPACEO20$: ;REFERENCE LABEL .ENDC ; DF U$$DAS!S$$LIBO% MOV (R3)+,R4 ;GET ADDRESS OF OPERANDD BIT #1,R4 ;ODD ADDRESS ? BNE 30$ ;IF NE YES MOV R4,R1 ;MAKE A COPY& BIC #17777,R1 ;CLEAR ALL BUT APR BITS SWAB R1 ;MOVE TO LOW HALFD# ASH #-4,R1 ;AND CREATE WORD INDEXD! ADD R1,R0 ;POINT TO CORRECT PDRP( MOV (R0),R2 ;GET PDR CONTENTS FOR TEST% BNE 40$ ;IF NE THERE IS SOME ACCESS *30$: DRSTS D.RS98 ;EXIT WITH ERROR STATUS+40$: MOV R4,R1 ;COPY VIRTUAL ADDRESS AGAIN0# BIC #160000,R1 ;CLEAR OUT APR BITSN BIC #77,R1 ;32 WORD BOUNDARY ASL R1 ;SHIFT TO SAME PLACED ASL R1 ;AS IN PDRT+ BIC #100377,R2 ;CLEAR ALL BUT PLF FROM PDR- CMP R1,R2 ;DESIRED ADDRESS WITHIN MAPPING ? $ BHI 30$ ;IF HI NO, ILLEGAL ADDRESS& MOV (R3),R3 ;SAVE ADDRESS (OR VALUE)5 MOV UINAR0-UINDR0(R0),KISAR6 ;MAP TO DESIRED ADDRESS2+ BIC #160000,R4 ;CLEAR ALL BUT DISPLACEMENTE( BIS #140000,R4 ;COMMUTE ADDRESS TO APR6 ASR R5 ;MOVE FROM OR TO ?0 BCS 50$ ;IF CS IT'00kúrlürßmæàmçámýfáþfDATAS MOVE TOR MOV (R4),-(SP) ;GET VALUE MOV #2,R1 ;SET SIZE OF BUFFER * CALL $ACHKP ;ADDRESS CHECK AND MAP BLOCK! MOV (SP)+,(R3) ;RETURN PARAMETER# RETURN ;AND EXITB+50$: BIT #4,(R0) ;WRITE ACCESS TO REGION ?S BNE 55$ ;IF NE YES,ALLOW/ MOV $TKTCB,R5 ;GET TCB ADDRESS OF ISSUING TASK / BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED  BEQ 60$ ;IF EQ NO, DISALLOW#&55$: MOV R3,(R4) ;FILL IN DESTINATION RETURN ;AND EXIT SUCCESSFULLY'60$: DRSTS D.RS16 ;PRIVILEGE VIOLATIONS  .ENDC ; DF S$$MAP M .END,-(SP) ;GET VALUE MOV #2,R1 ;SET SIZE OF BUFFER * CALL $ACHKP ;ADDRESS CHECK AND MAP BLOCK! MOV (SP)+,(R3) ;RETURN PARAMETER# RETURN ;AND EXITB+50$: BIT #4,(R0) ;WRITE ACCESS TO REGION ?S BNE 55$ ;IF NE YES,ALLOW/ MOV $TKTCB,R5 ;GET TCB ADDRESS OF ISSUING TASK / BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED  BEQ 60$ ;IF EQ NO, DISALLOW#&55$: MOV R3,(R4) ;FILL IN DESTINATION RETURN ;AND EXIT SUCCESSFULLY'60$: DRSTS D.RS16 ;PRIVILEGE VIOLATIONS  .ENDC ; .TITLE DRGEF .IDENT /04.01/V E;M,; COPYRIGHT (C) 1974, 1978, 1979, 1980, 1983/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.T; A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDO9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; J. E. PROVINO 21-SEP-78B;#+; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:B;6; B. S. MCCARTHY L; T. M. MARTIN ,;); MODIFIED BY:;I; J. M. LAWLER 29-JUN-83 04.00;Y:; JL162 -- FINISH CONDITIONALIZATION OF GROUP GLOBAL EFNS;I; J. W. BERZLE 07-SEP-83 04.01;M2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES;A;Q; MACRO LIBRARY CALLSY;D .MCALL BGCK$A;++; **-$DRCRE-CREATE GROUP GLOBAL EVENT FLAGSL;EB; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CREATE GROUP GLOBAL EVENTB; FLAGS FOR A SPECIFIED GROUP. IF THE SPECIFIED GROUP MATCHES THEF; TASK'S OWN GROUP, THE EVENT FLAG USE COUNT IS INCREMENTED, EFFECTINGB; A "LOCK" OPERATION FOR THE FLAGS SUCH THAT PREMATURE ELIMINATION8; OF THE FLAGS BY A TASK WHICH SHARES THEM IS PREVENTED.;-D; IF THE EVENT FLAG GROUP ALREADY EXISTS, THE SPECIFIED GROUP IS THEF; SAME AS THE TASK'S OWN GROUP, AND THE EVENT FLAGS ARE UNLOCKED, THIS;; DIRECTIVE WILL LOCK THE EVENT FLAGS FOR THE ISSUING TASK.T;S;E ; DPB FORMAT:U;L#; WD. 00 -- DIC(157.),DPB SIZE(2.).R; WD. 01 -- GROUP NUMBER;M ; INPUTS:;A2; R2=ADDRESS OF SECOND STATUS WORD OF CURRENT TASK ; R3=POINTER TO WD. 1 IN THE DPB/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;V5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)H;P-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.G&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.V5; DIRECTIVE STATUS OF 'D.RS1' IF ALLOCATION FAILURE.U6; DIRECTIVE STATUS OF 'D.RS16' IF NON-PRIVILEGED TASK5; ATTEMPTS TO CREATE EVENT FLAGS FOR ANOTHER GROUP.D;; DIRECTIVE STATUS OF 'D.RS17' IS RETURNED IF GROUP GLOBALB; EVENT FLAGS ALREADY EXIST.7; DIRECTIVE STATUS OF 'D.RS91' IS RETURNED IF GROUP IST ; INVALID.;- .IF DF, G$$GEFT .ENABL LSBN+$DRCRE::CALL 300$ ;DO FLAGS ALREADY EXIST?S BCC 40$ ;IF CC FOUND MOV R0,-(SP) ;SAVE R05 MOV #G.LGTH,R1 ;GET LENGTH OF GROUP GLOBAL CNTRL BLKI$ MOV R2,R3 ;COPY TASKS GROUP NUMBER6 CALL $ALOCB ;ALLOCATE A BLOCK FOR GROUP GLOBAL FLAGS# BCS 70$ ;IF CS ALLOCATION FAILUREF5 MOV @(SP),(R0) ;POINT NEW BLOCK TO REMAINDER OF LIST7( MOV R0,@(SP)+ ;LINK NEW BLOCK INTO LIST- TST (R0)+ ;POINT PAST LINK WORD (G.LNK).. MOVB R4,(R0)+ ;STORE GROUP NUMBER (G.GRP), CLRB (R0)+ ;CLEAR STATUS BYTE (G.STAT)/ CLR (R0)+ ;INITIALIZE ACCESS COUNT (G.CNT)I6 CMP R3,R4 ;ARE THESE FLAGS FOR THE TASK'S OWN GROUP?% BNE 20$ ;IF NE NO, DO NOT LOCK THEMV2 INC -2(R0) ;LOCK FLAGS BY INCREMENTING USE COUNT8 BIS #T3.GFL,(R5) ;AND MAKE A NOTE OF THIS IN TASK'S TCB8 INCB T.GGF-T.ST3(R5) ;AND INCREMENT TASK'S ACCESS COUNT420$: CLR (R0)+ ;CLR FIRST EVENT FLAG WORD (G.EFLG)1 CLR (R0) ;CLR SECOND EVENT FLAG WORD (G.EGLG+2)30$: RETURN ;T00ls³rn´cÚµcÛ¶c�·c›’-40$: CLRB G.STAT(R1) ;CLEAR MARKED FOR DELETEA CMP R2,R4 ;TASK'S OWN GROUP?$ BNE 110$ ;IF NE NO DON'T LOCK THEM" BIT #T3.GFL,(R5) ;ALREADY LOCKED? BNE 110$ ;IF NE YESU8 BIS #T3.GFL,(R5) ;MARK TCB AS HAVING LOCKED EVENT FLAGS2 INC G.CNT(R1) ;LOCK THE EVENT FLACK CONTROL BLOCK6 INCB T.GGF-T.ST3(R5) ;RECORD ACCESS FOR SLAVE TASKING' BR 110$ ;INDICATE FLAGS ALREADY EXISTU ;+-; **-DRELE-ELIMINATE GROUP GLOBAL EVENT FLAGS);CA; THE ELIMINATE GROUP GLOBAL EVENT FLAGS DIRECTIVE ELIMINATES THEC; GROUP GLOBAL EVENT FLAGS FOR THE SPECIFIED GROUP. IF THE ISSUINGW@; TASK HAD LOCKED THE EVENT FLAGS VIA A PREVIOUSLY ISSUED CREATEA; GROUP GLOBAL EVENT FLAGS DIRECTIVE, THEY WILL ALSO BE UNLOCKED.C;SA; THE UNLOCK GROUP GLOBAL EVENT FLAGS DIRECTIVE UNLOCKS THE EVENTN%; FLAGS FOR THE ISSUING TASK'S GROUP.R;C;SA; DPB FORMAT FOR THE ELIMINATE GROUP GLOBAL EVENT FLAG DIRECTIVE:+; #; WD. 0 -- DIC. (159.),DBP SIZE(2.) ; WD. 1 -- GROUP NUMBERT;R>; DPB FORMAT FOR THE UNLOCK GROUP GLOBAL EVENT FLAG DIRECTIVE:;E#; WD. 0 -- DIC. (159.),DPB SIZE(1.) ; ; INPUTS: ;K8; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK; R3=ADDRESS OF THE DBP + 2D.; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK+; R5=ADDRESS OF THE TCB OF THE CURRENT TASKN;K5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)C;S-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.V&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED=; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF NON-PRIVILEGEDE7; TASK ATTEMPTS TO ELIMINATE FLAGS FOR ANOTHER GROUP.(9; DIRECTIVE STATUS OF 'D.RS17' IS RETURNED IF EVENT FLAGO'; BLOCK IS ALREADY MARKED FOR DELETE.H=; DIRECTIVE STATUS OF 'D.RS91' IS RETURNED IF THE SPECIFIED 5); EVENT FLAG GROUP IS GREATER THAN 377.K<; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF THE SPECIFIED$; EVENT FLAG GROUP DOES NOT EXIST.;- V#$DRELE::MOVB -(R3),R0 ;GET DPB SIZEE0 CMPB (R3)+,#2 ;IS THIS THE ELIMINATE DIRECTIVE? BEQ 50$ ;IF EQ YES' ASR R0 ;IS THIS THE UNLOCK DIRECTIVE?M& BNE 120$ ;IF NE NO, ILLEGAL DPB SIZE0 CALL $UNLCK ;ATTEMPT TO UNLOCK THE EVENT FLAGS" BCS 110$ ;IF CS ALREADY UNLOCKED7$ELIM:: BNE 45$ ;IF NE G.CNT<>0, DON'T ELIMINATE FLAGST) TSTB G.STAT(R1) ;MARKED FOR ELIMINATION?O) BNE 65$ ;IF NE YES, ELIMINATE THE FLAGSU45$: RETURN ;R250$: CALL 300$ ;LOOK FOR THE SPECIFIED EVENT FLAG! BCS 100$ ;IF CS FLAGS NOT FOUNDR* CMP R2,R4 ;ELIMINATING TASK'S OWN GROUP?& BNE 60$ ;IF NE NO, DON'T UNLOCK THEM. BIT #T3.GFL,(R5) ;ARE THE EVENT FLAGS LOCKED? BEQ 60$ ;IF EQ NO 8 BISB #GS.DEL,G.STAT(R1) ;MARK THE FLAGS FOR ELIMINATION# CALL 200$ ;UNLOCK THE EVENT FLAGSD. BEQ 65$ ;IF EQ, G.CNT=0, ELIMINATE THE FLAGS RETURNN060$: TSTB G.STAT(R1) ;ALREADY MARKED FOR DELETE? BNE 110$ ;IF NE YESS$ INCB G.STAT(R1) ;MARK IT FOR DELETE! TST G.CNT(R1) ;STILL BEING USED?P/ BNE 210$ ;IF NE YES, DON'T ELIMINATE THEM YETO&65$: CALLR $ELGEF ;ELIMINATE THEM NOW%70$: DRSTS D.RS1 ;ALLOCATION FAILUREL!80$: DRSTS D.RS91 ;INVALID GROUPE'90$: DRSTS D.RS16 ;PRIVILEGE VIOLATION $100$: DRSTS D.RS97 ;GROUP NOT FOUNDE110$: DRSTS D.RS17 ;FLAGS ALREADY EXIST OR ALREADY MARKED FOR DELETEI%120$: DRSTS D.RS99 ;ILLEGAL DPB SIZET:200$: BIC #T3.GFL,(R5) ;MARK TCB AS NOT HAVING EFNS LOCKED4 DECB T.GGF-T.ST3(R5) ;DECREMENT TASK'S ACCESS COUNT- DEC G.CNT(R1) ;DECREMENT THE FLAGS USE COUNT0 210$: RETURN6300$: ADD #T.ST3,R5 ;POINT TO THIRD STATUS WORD OF TCB. MOVB H.CUIC+1(R4),R2 ;GET TASK'S GROUP NUMBER) MOV (R3),R4 ;GET SPECIFIED GROUP NUMBERD# BNE 310$ ;IF NE ONE WAS SPECIFIED0$ MOV R2,R4 ;ASSUME TASK'S OWN GROUP BR 325$ ;JOIN COMMON CODEA:310$: BIT #T3.PRV,(R5) ;TASK ALLOWED TO SPECIFY ANY GROUP? BNE 320$ ;IF NE YES02 CMPB R4,R2 ;ATTEMPTING TO SPECIFY ANOTHER GROUP? BNE 90$ ;IF NE YES'320$: CMP R4,#377 ;LEGAL GROUP NUMBER?C BHI 80$ ;IF HI NO 6325$: CALLR $SRGEF ;TRY TO FIND THE GROUP'S CNTRL BLK;+;T?; THIS ROUTINE WILL UNLOCK THE GROUP GLOBAL EVENT FLAGS FOR THEU<; TASK'S GROUP IF THE TASK HAS THEM LOCKED FROM A 00l sm sßmæàmçámýfáþfDATAPREVIOUSLY2; ISSUED CREATE GROUP GLOBAL EVENT FLAG DIRECTIVE.;S ; INPUTS:; ); R4=ADDRESS OF THE CURRENT TASK'S HEADER,&; R5=ADDRESS OF THE CURRENT TASK'S TCB;B ; OUTPUTS:; 6; C=1 IF THE EVENT FLAGS FOR THE TASK'S GROUP WERE NOT; LOCKED BY THE TASK4; C=0 IF THE EVENT FLAGS WERE SUCCESSFULLY UNLOCKED.;I!; R4 IS DESTROYED BY THIS ROUTINEI; R5 = R5+T.ST3T;B;-:$UNLCK::ADD #T.ST3,R5 ;POINT TO THE THIRD TASK STATUS WORD6 BIT #T3.GFL,(R5) ;ARE THE TASKS GROUP GLOBALS LOCKED? BEQ 400$ ;IF EQ NO, MOVB H.CUIC+1(R4),R4 ;GET TASK'S GROUP CODE, CALL $SRGEF ;FIND THE EVENT FLAG CNTRL BLK/ BCC 200$ ;JOIN COMMON CODE WITH THE DIRECTIVE = BGCK$A BF.DIR,BE.GGF,FATAL ;TASK LOCKED TO NONEXISTANT FLAGSE*400$: SEC ;TASK NOT LOCKED TO EVENT FLAG RETURN ;E .DSABL LSBW .ENDC ; DF G$$GEF . .END R4 IS DESTROYED BY THIS ROUTINEI; R5 = R5+T.ST3T;B;-:$UNLCK::ADD #T.ST3,R5 ;POINT TO THE THIRD TASK STATUS WORD6 BIT #T3.GFL,(R5) ;ARE THE TASKS GROUP GLOBALS LOCKED? BEQ 4 .TITLE DRREG .IDENT /02.09/) ;T1; COPYRIGHT (C) 1974, 1978, 1979, 1980, 1981,1983L/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.H;IA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDL9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;E; T. J. MILLER 12-MAR-76; ); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:O;N; J. M. LAWLER; B. S. MCCARTHY; T. M. MARTIN R;P; MODIFIED BY:;A; J. M. LAWLER 29-JUN-83 02.07;A7; JL162 -- FINISH CONDITIONALIZATION OF CPCR DIRECTIVE;. ; B. S. MCCARTHY 28-NOV-83 02.08;C6; BM292 -- MOVE DRCPC TO SEPARATE MODULE SO THAT THIS2; MODULE MAY BE PLACED IN THIRD DIRECTIVE COMMON6; (SUPERSEDES JL162, WHICH IS INCLUDED IN DRCPC.MAC);P ; B. S. MCCARTHY 24-APR-85 02.09;U6; BM347 -- DON'T ALLOW CREATION OF REGIONS IN SPECIAL; PARTITIONS; ;S .PAGE;L; THE FOLLOWING DIRECTIVES RECEIVE AS INPUT A POINTER TO A REGION DEFINITIONI; BLOCK WHICH SERVES AS A COMMUNICATION AREA BETWEEN THE ISSUING TASK AND G; THE EXECUTIVE. THE REGION DEFINITION BLOCK HAS THE FOLLOWING FORMAT: ;E4; ------------------------------------------------- ; ! ! ; R.GID ! REGION ID ! ; ! ! 4; !-----------------------------------------------! ; ! !-); R.GSIZ ! SIZE OF REGION (32W BLOCKS) !I ; ! ! 4; !-----------------------------------------------! ; ! !E ; ! !E ; ! !O%; R.GNAM ! NAME OF REGION (RAD50) !H ; ! ! ; ! !O ; ! !N4; !-----------------------------------------------! ; ! !C ; ! !L ; ! ! 1; R.GPAR ! REGION'S MAIN PARTITION NAME (RAD50) !- ; ! ! ; ! !I ; ! ! 4; !-----------------------------------------------! ; ! !-!; R.GSTS ! REGION STATUS WORD ! ; ! !W4; !-----------------------------------------------! ; ! !-(; R.GPRO ! PROTECTION CODE OF REGION ! ; ! !4; -------------------------------------------------;!  .IF DF P$$LAS ;-; MACRO LIBRARY CALLS-;-# .MCALL HDRDF$,PCBDF$,RDBDF$,TCBDF$ 1 HDRDF$ ;DEFINE HEADER AND WINDOW BLOCK OFFSETSI7 PCBDF$ ;DEFINE PCB AND ATTACHMENT DESCRIPTOR OFFSETS 1 RDBDF$ ;DEFINE REGION DEFINITION BLOCK OFFSETS- TCBDF$ ;DEFINE TCB OFFSETS!;+; **-$DRCRR-CREATE REGION ;WG; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CREATE A REGION AND OPTIONALLY.; ATTACH TO IT. ;E ; DPB FORMAT:;!!; WD. 00 -- DIC(55.),DPB SIZE(2.)-.; WD. 01 -- ADDRESS OF REGION DEFINITION BLOCK;S ; INPUTS: ;R9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ,; R3=ADDRESS OF THE REGION DEFINITION BLOCK./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.R,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;O2; INPUT FIELDS IN THE REGION DEFINITION BLOCK ARE:#; R.GSIZ=SIZE OF REGION TO CREATE. 4; R.GNAM=NAME OF REGION TO CREATE OR 0 FOR NO NAME.>; R.GPAR=NAME OF SYSTEM PARTITION IN WHICH TO ALLOCATE REGION+; OR 0 FOR MAIN SYSTEM PARTITION OF TASK.D; R.GSTS=CONTROL INFORMATION.4; RS.NDL=1 IF REGION SHO00ms³rn´cÚµcÛ¶c�·c›’ULD NOT BE DELETED ON LAST ; DETACH.2; RS.ATT=1 IF CREATED REGION SHOULD BE ATTACHED.1; RS.RED=1 IF READ ACCESS IS DESIRED ON ATTACH.A2; RS.WRT=1 IF WRITE ACCESS IS DESIRED ON ATTACH.3; RS.EXT=1 IF EXTEND ACCESS IS DESIRED ON ATTACH.:3; RS.DEL=1 IF DELETE ACCESS IS DESIRED ON ATTACH.E;; R.GPRO=PROTECTION CODE FOR REGION [DEWR,DEWR,DEWR,DEWR].T;P5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ;T-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.M&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED..>; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF A PCB OR ATTACH-+; MENT DESCRIPTOR COULD NOT BE ALLOCATED. ;; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE DIRECTIVEI4; FAILS IN THE ATTACHMENT STAGE BECAUSE THE REGION ; HAS INCURRED A PARITY ERROR.:; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE DESIRED-; ACCESS IS DENIED IN THE ATTACHMENT STAGE. <; DIRECTIVE STATUS OF 'D.RS84' IS RETURNED IF THE SPECIFIED4; PARTITION IN WHICH THE REGION IS TO BE ALLOCATED4; DOES NOT EXIST, OR IF NO PARTITION NAME HAS BEEN; SPECIFIED AND RS.ATT=0.R;T3; OUTPUT FIELDS IN THE REGION DEFINITION BLOCK ARE: '; R.GID=ASSIGNED REGION ID (RS.ATT=1).I+; R.GSTS=DIRECTIVE COMPLETION INFORMATION. #; RS.CRR=1 IF REGION WAS CREATED.U;D7; NOTE: ON SYSTEMS SUPPORTING EXTERNAL HEADERS, THE RDBR0; IS COPIED TO AN EXECUTIVE BUFFER SO THAT APR62; CAN BE USED TO MAP THE TASK HEADER EXCLUSIVELY.1; THIS MEANS THAT ANY OUTPUT FIELDS ARE RETURNEDT2; TO THE USER TASK FROM THE DIRECTIVE DISPATCHER.; 2; ALSO, WHEN RETURNING REGION SIZE FROM AN ATTACH4; EXCLUDE THE SIZE OF THE NON RESIDENT TASK HEADER.;A;- .ENABL LSBG?$DRCRR::ADD #R.GPAR,R3 ;PNT TO NAME OF PAR IN WHICH TO ALLOCATEA9 MOV T.PCB(R5),R2 ;ASSUME ALLOCATING IN TASK'S PARTITION N/ MOV P.MAIN(R2),R2 ;POINT TO MAIN PARTITION PCB % TST (R3) ;PARTITION NAME SPECIFIED?A BEQ 5$ ;IF EQ NO/ CALL $SRNAM ;SEARCH FOR NAMED PARTITION'S PCBE) BCS 90$ ;IF CS, PARTITION NOT IN SYSTEM + CMP R2,P.MAIN(R2) ;IS IT A MAIN PARTITION?E BNE 90$ ;IF NE NO  U N .IF DF M$$EXT A) CMP P.REL(R2),#177600 ;DEVICE PARTITION?S N .IFFH E' CMP P.REL(R2),#7600 ;DEVICE PARTITION?R A .ENDC O M BHIS 90$ ;YES, IF HISC8 BIT #P2.LMA!P2.SEC!P2.CPU,P.ST2(R2) ;SPECIAL PARTITION?( BNE 90$ ;IF NE YES, DON'T ALLOW CREATE#5$: MOV R2,R0 ;COPY POINTER TO PCB , TST -(R3) ;POINT TO REGION NAME (R.GNAM+2), TST -(R3) ;REGION NAME SPECIFIED? (R.GNAM) BEQ 10$ ;IF EQ NOO, CALL $SRNAM ;DETERMINE IF NAME IS UNIQUE & BCC 35$ ;IF CC, NAME IS NOT UNIQUE 10$: ;REF SYMBOLT A C .IF DF M$$PRO 0) CLR -(SP) ;CLEAR REQUIRED RUN MASK WORDP L .ENDC ;4 CLR -(SP) ;CLR HDR SIZE AND I/O CNT (P.HDLN/P.IOC) I+ MOV R3,-(SP) ;PUSH NON-ZERO WORD (P.ATT+2)C CLR -(SP) ;(P.ATT)9 MOV R.GPRO-R.GNAM(R3),-(SP) ;SET PROTECTION MASK (P.PRO)I= BIC #210,(SP) ;INSURE OWNER AND SYSTEM DELETE ACCESS (P.PRO)T, MOV #P2.PIC,-(SP) ;INIT SECOND WORD (P.ST2)4 MOV #PS.COM!PS.OUT,-(SP) ;INIT STATUS WORD (P.STAT), MOV H.CUIC(R4),-(SP) ;SET OWNER UIC (P.OWN), CLR -(SP) ;CLEAR DISK PCB POINTER (P.DPCB); MOV R.GSIZ-R.GNAM(R3),-(SP) ;STORE SIZE OF REGION (P.SWSZ)C7 CMP (SP),P.SIZE(R0) ;CREATING REGION LARGER THAN MAIN?O BHI 120$ ;IF HI YES 3 CLR -(SP) ;CLR COMMON BLK DIRECTORY LINK (P.CBDL); MOV R.GSIZ-R.GNAM(R3),-(SP) ;STORE SIZE OF REGION (P.SIZE)B* CLR -(SP) ;CLEAR RELOCATION BIAS (P.REL), MOV R0,-(SP) ;SET MAIN PCB POINTER (P.MAIN), CLR -(SP) ;CLEAR SUBPARTITION LINK (P.SUB)A MOV 2(R3),-(SP) ;SET SECOND WORD OF PAR NAME (R.GNAM+2)(P.NAM+2)W; MOV (R3),-(SP) ;SET FIRST WORD OF PAR NAME (R.GNAM)(P.NAM)-# BNE 30$ ;IF NE NAME WAS SPECIFIEDN8 BIT #RS.ATT,R.GSTS-R.GNAM(R3) ;IS REGION TO BE ATTACHED) BEQ 90$ ;IF EQ NO, PARTITION NAME ERRORS5 CLR 2(SP) ;ELSE CLEAR SECOND WORD OF NAME (P.NAM+2)I430$: CLR -(SP) ;ZERO PRIORITY AND MAP COUNT (P.PRI)$ CLR -(SP) ;CLEAR LINK WORD (P.LNK)) MOV SP,R2 ;COPY POINTER TO PCB ON STACKM535$: BIT #RS.ATT,R.GSTS-R.GNAM(R3) ;ATTACH DESIRED? V BEQ 300ms sßmæàmçámýfáþfDATA6$ ;IF EQ NOO CALL ATT ;ATTACH REGION+)36$: TST (SP) ;WAS THE REGION CREATED? R BNE 80$ ;IF NE NO, DONE 2 MOV R1,R5 ;COPY POINTER TO ATTACHMENT DESCRIPTOR! MOV #P.LGTH,R1 ;PICK UP PCB SIZET CALL $ALOCB ;ALLOCATE A PCBR$ BCS 110$ ;IF CS ALLOCATION FAILURE, MOV #P.LGTH/2,R1 ;PICK UP PCB SIZE IN WORDS MOV R0,R4 ;COPY POINTER TO PCB!40$: MOV (SP)+,(R0)+ ;FILL IN PCB  DEC R1 ;DONE YET?, BGT 40$ ;IF GT NOP O T .IF DF M$$PRO A( TST -(R0) ;SKIP REQUIRED RUN MASK WORD Q .ENDC Q O. TST -(R0) ;SKIP XTRNL HDR SIZE AND I/O COUNT H E' CMP -(R0),-(R0) ;WAS THE PCB ATTACHED?N BEQ 50$ ;IF EQ YES MOV R0,2(R0) ;SET UP LISTHEAD4 CMP -(R3),-(R3) ;POINT TO REGION ID (R.GSIZ)(R.GID) BR 60$ ;;50$: MOV (R0),R5 ;PICK UP ADDRESS OF ATTACHMENT DESCRIPTORR+ MOV R4,A.PCB(R5) ;POINT IT TO THE REAL PCBP!60$: TST P.NAM(R4) ;NAMED COMMON?0 BEQ 75$ ;IF EQ NOC4 MOV #$CBDHD-P.CBDL,R0 ;POINT TO CBD LISTHEAD AS PCB)65$: MOV R0,R1 ;SAVE POINTER TO PREVIOUSN. MOV P.CBDL(R0),R0 ;POINT TO NEXT ENTRY IN CBD BEQ 71$ ;IF EQ THERE IS NONE5 CMP P.NAM(R4),P.NAM(R0) ;TEST TO SEE IF IT GOES HERE5 BNE 70$ ;S CMP P.NAM+2(R4),P.NAM+2(R0) ;'70$: BHI 65$ ;IF HI IT DOESN'T GO HERE.571$: MOV R0,P.CBDL(R4) ;POINT NEW ONE TO NEXT IN LISTD) MOV R4,P.CBDL(R1) ;POINT PREV TO NEW ONEC875$: BIS #RS.CRR,R.GSTS(R3) ;INDICATE REGION WAS CREATED0 BIT #RS.NDL,R.GSTS(R3) ;IS NO DELETION DESIRED? BNE 80$ ;IF NE NOL6 BIS #PS.DEL,P.STAT(R4) ;SET DELETE ON LAST DETACH BIT80$: RETURN ; (90$: DRSTS D.RS94 ;PARTITION NAME ERROR)110$: TST P.ATT(SP) ;WAS REGION ATTACHED?) BEQ 120$ ;IF EQ NO3 MOV (R3),R5 ;POINT TO ATT DESCR TO DETACH (R.GID);- MOV SP,P.NAM(SP) ;SET NAME TO AVOID DELETION: CALL $DETRG ;DETACH THE REGION&120$: DRSTS D.RS1 ;ALLOCATION FAILURE ;+; **-$DRATR-ATTACH REGIONT;3D; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ATTACH THE SPECIFIED REGION; TO THE CURRENT TASK.;E ; DPB FORMAT:D;P!; WD. 00 -- DIC(57.),DPB SIZE(2.)H.; WD. 01 -- ADDRESS OF REGION DEFINITION BLOCK;T ; INPUTS:E;R9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.F,; R3=ADDRESS OF THE REGION DEFINITION BLOCK./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.O,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;22; INPUT FIELDS IN THE REGION DEFINITION BLOCK ARE:&; R.GNAM=NAME OF REGION TO ATTACH TO.#; R.GSTS=DESIRED ACCESS TO REGION.T'; RS.RED=1 IF READ ACCESS IS DESIRED.T(; RS.WRT=1 IF WRITE ACCESS IS DESIRED.); RS.EXT=1 IF EXTEND ACCESS IS DESIRED.S); RS.DEL=1 IF DELETE ACCESS IS DESIRED.E;R5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)A;F-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.; DIRECTIVE OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED.H;; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF AN ATTACHMENTD#; DESCRIPTOR CANNOT BE ALLOCATED.O;; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE SPECIFIED'; REGION HAS INCURRED A PARITY ERROR.:; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE DESIRED; ACCESS IS DENIED.S2; DIRECTIVE STATUS OF 'D.RS94' IS RETURNED IF THE$; SPECIFIED REGION DOES NOT EXIST.;D3; OUTPUT FIELDS IN THE REGION DEFINITION BLOCK ARE:M; R.GID=ASSIGNED REGION ID."; R.GSIZ=SIZE OF ATTACHED REGION.;-6$DRATR::ADD #R.GNAM,R3 ;POINT TO SPECIFIED REGION NAME" TST (R3) ;REGION NAME SPECIFIED? BEQ 90$ ;IF EQ NO, ILLEGAL& CALL $SRNAM ;SEARCH FOR NAMED REGION, BCS 90$ ;IF CS NAMED REGION DOES NOT EXIST*ATT: BIT #PS.PER,P.STAT(R2) ;PARITY ERROR? BNE 170$ ;IF NE YESC+ CMP R2,P.MAIN(R2) ;IS IT A MAIN PARTITION?S BEQ 90$ ;IF EQ YES, ERRORP. MOV R.GSTS-R.GNAM(R3),R0 ;PICK UP STATUS WORD BIT #17,R0 ;ATTACH DESIRED?O BNE 147$ ;IF NE YESG7 MOV T.ATT(R5),R1 ;POINT TO FIRST ATTACHMENT DESCRIPTOR2146$: SUB #A.TCBL,R1 ;POINT TO START OF DESCRIPTOR( CMP A.PCB(R1),R2 ;ATTACHED TO THIS PCB? BEQ 155$ ;IF EQ YESG7 MOV A.TCBL(R1),R1 ;POINT TO NEXT ATTACHMENT DESCRIPTOR  BNE 146$ ;IF NE THERE IS ONE! DRSTS D.RS86 ;NO SUCH REGION ID 1147$: MOV H.CUIC(R4),R1 ;PICK UP CURRENT TASK 00m"sn)sn´cÚµcÛ¶c�·c›’UIC; MOV R0,R4 ;COPY STATUS WORD9* CMP R2,#$STACK ;IS REGION BEING CREATED ?, BLO 150$ ;IF LO YES, SKIP PROTECTION CHECK2 BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED? ( BNE 150$ ;IF NE YES, SKIP ACCESS CHECK5 CALL $CKACC ;DETERMINE IF DESIRED ACCESS IS ALLOWEDC8150$: CALL $CRATT ;CREATE ATT DESCRIPTOR AND LINK IT IN$ BCS 160$ ;IF CS ALLOCATION FAILURE:155$: MOV P.SIZE(R2),-(R3) ;RETURN SIZE OF REGION (R.GSIZ) .IF DF X$$HDR9 MOVB P.HDLN(R2),R5 ;GET SIZE OF EXTERNAL HEADER (IF ANY) . SUB R5,(R3) ;EXCLUDE HEADER FROM REGION SIZE .ENDC ;DF X$$HDRG6 MOV R1,-(R3) ;STORE DESCRIPTOR ADDR AS REG ID (R.GID) RETURN ;T&160$: DRSTS D.RS1 ;ALLOCATION FAILURE 170$: DRSTS D.RS6 ;PARITY ERROR .DSABL LSBC;+; **-$DRDTR-DETACH REGIONS; E; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DETACH THE SPECIFIED REGION,S; UNMAPPING IF NECESSARY.I;E ; DPB FORMAT:I;R!; WD. 00 -- DIC(59.),DPB SIZE(2.)G.; WD. 01 -- ADDRESS OF REGION DEFINITION BLOCK;S ; INPUTS:R; 9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ,; R3=ADDRESS OF THE REGION DEFINITION BLOCK./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; 2; INPUT FIELDS IN THE REGION DEFINITION BLOCK ARE:'; R.GID=REGION ID OF REGION TO DETACH.I; R.GSTS=CONTROL INFORMATION.5; RS.MDL=1 IF REGION SHOULD BE MARKED FOR DELETE ONE; THE LAST DETACH. ; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)G; -; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.E&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.IA; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF AN ATTEMPT IS MADEK8; TO MARK THE REGION FOR DELETE WITHOUT DELETE ACCESS.@; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF AN INVALID REGION6; ID IS SPECIFIED OR IF AN ATTEMPT IS MADE TO DETACH ; REGION 0. ;I3; OUTPUT FIELDS IN THE REGION DEFINITION BLOCK ARE:A7; R.GSTS=INDICATION OF ANY CHANGES IN MAPPING CONTEXT. *; RS.UNM=1 IF ANY WINDOWS WERE UNMAPPED.;- .ENABL LSBD5$DRDTR::CALL $SRATT ;SEARCH FOR AND VERIFY REGION IDI% TSTB A.IOC(R5) ;ANY I/O INTO REGION?." BNE 70$ ;IF NE YES, CAN'T DETACH MOV A.TCB(R5),R1 ;POINT TO TCBD MOV R5,R0 ;POINT TO TCB THREAD ADD #A.TCBL,R0 ;') CMP R0,T.ATT(R1) ;DETACHING TASK REGION?  BEQ 60$ ;IF EQ YES, ILLEGALM MOV A.PCB(R5),R0 ;POINT TO PCB03 MOV H.WND(R4),R4 ;POINT TO NUMBER OF WINDOW BLOCKSK( TST (R4)+ ;POINT TO FIRST WINDOW BLOCK1 BIT #RS.MDL,R.GSTS(R3) ;MARK FOR DELETE DESIRED?  BEQ 10$ ;IF EQ NO7 BITB #AS.DEL,A.STAT(R5) ;DOES TASK HAVE DELETE ACCESS?  BEQ 70$ ;IF EQ NOO/ BIS #PS.DEL,P.STAT(R0) ;MARK REGION FOR DELETES?10$: CMP W.BATT(R4),R5 ;THIS WINDOW MAPPED TO REGION TO DETACH I BNE 20$ ;IF NE NOD CALL $UNMAP ;UNMAP WINDOW(5 BIS #RS.UNM,R.GSTS(R3) ;INDICATE WINDOW WAS UNMAPPEDE/20$: ADD #W.BLGH,R4 ;POINT TO NEXT WINDOW BLOCKD9 TSTB A.MPCT(R5) ;ANY MORE WINDOWS MAPPED TO THIS REGION?I BNE 10$ ;IF NE YES6 CALLR $DETRG ;DETACH REGION BY ATTACHMENT DESCRIPTOR%60$: DRSTS D.RS86 ;INVALID REGION IDT=70$: DRSTS D.RS16 ;ATTEMPT TO MARK FOR DELETE WITHOUT ACCESSB .DSABL LSBS .ENDC .ENDN FOR DELETES?10$: CMP W.BATT(R4),R5 ;THIS WINDOW MAPPED TO REGION TO DETACH I BNE 20$ ;IF NE NOD CALL $UNMAP ;UNMAP WINDOW(5 BIS #RS.UNM,R.GSTS(R3) ;INDICATE WINDOW WAS UNMAPPEDE/20$: ADD #W.BLGH,R4 ;POINT TO NEXT WINDOW BLOCKD9 TSTB A.MPCT(R5) ;ANY MORE WINDOWS MAPPED TO THIS REGION?I BNE 10$ ;IF NE YES6 CALLR $DETRG ;DETACH REGION BY ATTACHMENT DESCRIPTOR%60$: DRSTS D.RS86 ;INVALID .TITLE DRSMG: .IDENT /01.03/T P;O5; COPYRIGHT (C) 1981 BY DIGITAL EQUIPMENT CORPORATIONC; ALL RIGHTS RESERVED.;:<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;G; P. J. BEZEREDI 30-MAR-81;M; SEND MESSAGE DIRECTIVE;P; PREVIOUSLY MODIFIED BY:;T; T. M. MARTIN;O; MODIFIED BY:;O; J. M. LAWLER 29-JUN-83 1.02E;S%; JL162 -- FINISH CONDITIONALIZATIONC;N; S.C. ADAMS 29-JULY-83 1.03;;:; SA500n*s sßmæàmçámýfáþfDATA10 -- REPLACE CALLS TO $CRPKT AND $QUPKT WITH $CREQU; ; ; MACRO LIBRARY CALLSN;O .MCALL EPKDF$* EPKDF$ ;DEFINE ERROR LOG PACKET OFFSETS;+; **-$DRSMG-SEND MESSAGE;S<; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SEND A MESSAGE TO A; SYSTEM PROCESS.E;E ; DPB FORMAT:M; ); WD. 00 -- DIC(171.),DPB SIZE (VARIABLE)D; WD. 01 -- TARGET IDENTIFIER%; WD. 02 -- ADDRESS OF MESSAGE BUFFER2$; WD. 03 -- LENGTH OF MESSAGE BUFFER3; WD. 04 -- START OF TARGET SPECIFIC PARAMETER LIST3;;7; PARAMETER LIST FOR TARGET SPECIFIC IDENTIFIER SM.SER:E;&; WD. 04 -- ERROR LOG PACKET TYPE CODE); WD. 05 -- ERROR LOG PACKET SUBTYPE CODEA*; WD. 06 -- LOGICAL UNIT NUMBER (OPTIONAL)(; WD. 07 -- CONTROL MASK WORD (OPTIONAL);O ; INPUTS:S; @; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.6; R3=ADDRESS OF THE TARGET IDENTIFIER WORD IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; ; OUTPUTS:;F-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.R&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.O1; DIRECTIVE STATUS OF 'D.RS5' IS RETURNED IF THED+; SPECIFIED LUN IS ASSIGNED TO A NON-MASS /; STORAGE DEVICE, OR THE LUN IS NOT ASSIGNED.S5; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF INVALIDE#; TARGET PROCESS OR CONTROL MASK.A6; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF INVALID ; DPB SIZE.R8; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF PRIVILEGE; VIOLATION.;; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF ERROR LOGGINGI.; IS NOT ACTIVE AND PACKET CANNOT BE QUEUED.6; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF THERE IS; NOT ENOUGH POOL.;- .IF DF, E$$LOGA($DRSMG::MOVB -1(R3),R0 ;GET THE DPB SIZE8 CMP (R3)+,#SM.SER ;IS THE TARGET PROCESS ERROR LOGGING? BNE ER8 ;IF NE NOA% CMPB R0,#6. ;IS THE DPB BIG ENOUGH?C BLO ER99 ;IF LO NO7 MOV #SM.HDR!SM.TSK,-(SP) ;INITIALIZE THE FLAGS TO USEA) CMPB R0,#8. ;DOES A CONTROL MASK EXIST?  BLO 10$ ;IF LO NOC. BIS 12(R3),(SP) ;OBTAIN THE CONTROL MASK WORD7 BIT #SM.DID!SM.DOP!SM.DAC!SM.DAT,(SP) ;INVALID FLAGS?D BNE ER8 ;IF NE YES# BIT #SM.ZER,(SP) ;ZERO I/O COUNTS?  BEQ 10$ ;IF EQ NO.0 BIT #T3.PRV,T.ST3(R5) ;IS THE TASK PRIVILEGED? BEQ ER16 ;IF EQ NO010$: TST $ERRPT ;IS THE ERROR LOGGER INSTALLED? BEQ ER7 ;IF EQ NOP- BIT #ES.DAT,$ERFLA ;CAN WE LOG DATA PACKETS?; BNE 20$ ;IF NE YES) BIT #SM.CMD,(SP) ;NO, IS THIS A COMMAND?A BEQ ER7 ;IF EQ NO, ERROR120$: CMP (R3)+,(R3)+ ;POINT TO THE TYPE CODE WORD,( MOV (R3)+,-(SP) ;GET THE TYPE CODE WORD$ MOVB (R3)+,1(SP) ;STUFF THE SUBCODE( TSTB (R3)+ ;POINT TO POSSIBLE LUN WORD% CMPB R0,#7. ;DOES A LUN WORD EXIST?$ BLO 30$ ;IF LO NO3$ TST (R3) ;IS A LUN NUMBER PRESENT? BEQ 30$ ;IF EQ NO  CALL $MPLUN ;MAP THE LUN- BCC 26$ ;IF CC LUN IS ASSIGNED TO SOMETHING724$: DRSTS D.RS5 ;NOT ASSIGNED TO ERROR LOGGING DEVICE 026$: BIT #DV.MSD,U.CW1(R0) ;MASS STORAGE DEVICE?- BEQ 24$ ;IF EQ NO, NOT ERROR LOGGING DEVICE+" TST -(R3) ;POINT BACK TO THE LUN5 BIS #SM.DID,2(SP) ;YES, LOG A DEVICE IDENT SUBPACKET,,30$: MOV R0,-(SP) ;SAVE POSSIBLE UCB ADDRESS1 CMP -(R3),-(R3) ;POINT BACK TO THE BUFFER LENGTHD) MOV -(R3),R1 ;GET BUFFER LENGTH IN BYTES; BEQ 40$ ;IF EQ NO BUFFER8 BIS #SM.DAT,4(SP) ;INDICATE A DATA SUBPACKET IS PRESENT% MOV -(R3),R3 ;GET THE BUFFER ADDRESS4! MOV R1,-(SP) ;COPY BUFFER LENGTHR+ CALL $ACHKP ;ADDRESS CHECK AND MAP BUFFER)$ MOV (SP)+,R1 ;RESTORE BUFFER LENGTH'40$: MOV (SP)+,R5 ;RETRIEVE UCB ADDRESSR# MOV (SP)+,R0 ;RETRIEVE ERROR CODESD) MOV (SP)+,R2 ;RETRIEVE CONTROL MASK WORD,- MOV $TKTCB,R4 ;RETRIEVE THE TASK TCB ADDRESS1 CALL $CREQU ; CREATE AND QUEUE ERROR LOG PACKET BCS ER1 ; IF CS NO PACKETG RETURNE ER1: DRSTS D.RS1 ;NO POOL SPACE+ER7: DRSTS D.RS7 ;ERROR LOGGING NOT ACTIVEP1ER8: DRSTS D.RS8 ;INVALID TARGET OR CONTROL MASKV(ER16: DRSTS D.RS16 ;PRIVILEGE VIOLATION%ER99: DRSTS D.RS99 ;INVALID DPB SIZEV .ENDC ; DF E$$LOG .ENDH'40$: MOV (SP)+,R5 ;RETRIEVE UCB ADDRESSR# MOV (SP)+,R0 ;RETRIEVE ERROR CO00o2s)sn´cÚµcÛ¶c�·c›’ .TITLE QUEUEE .IDENT /10.00/;#; COPYRIGHT (C) 1985$; BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;B>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;S ; D. N. CUTLER 3-AUG-73Z ;D# ; MODIFIED FOR RSX-11M-PLUS V2.1:A ;T; B. S. MCCARTHY; &; MODIFIED FOR RSX-11M-PLUS V3.0 BY:;E; J. M. LAWLER; B. S. MCCARTHY; J. W. BERZLE;H; MODIFIED BY:;V ; J. W. BERZLE 23-OCT-85 10.00;!; JWB167 -- ADD $QRMVA ROUTINEY;T!;U";T'#; GENERAL QUEUE MANIPULATION ROUTINES$;%; MACRO LIBRARY CALLSH&;D'1' .MCALL PKTDF$,PCBDF$,CLKDF$,TCBDF$ ;JWB167O4) PKTDF$ ;DEFINE CLI COMMAND BLOCK OFFSETS ;**-15* CLKDF$ ;DEFINE CLOCK QUEUE CONTROL BLOCK OFFSETS .+ TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS<+ PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS ;JWB167,-;+#.; **-$CLINS-CLOCK QUEUE INSERTIONI/;BI0; THIS ROUTINE IS CALLED TO MAKE AN ENTRY IN THE CLOCK QUEUE. THE ENTRY G1; IS INSERTED SUCH THAT THE CLOCK QUEUE IS ORDERED IN ASCENDING TIME.@2; THUS THE FRONT ENTRIES ARE MOST IMMINENT AND THE BACK LEAST.3;B 4; INPUTS:65;36; R0=ADDRESS OF THE CLOCK QUEUE ENTRY CORE BLOCK.%7; R1=HIGH ORDER HALF OF DELTA TIME.L$8; R2=LOW ORDER HALF OF DELTA TIME.9; R4=REQUEST TYPE.7:; R5=ADDRESS OF REQUESTING TCB OR REQUEST IDENTIFIER.W;; <; OUTPUTS:=;LB>; THE CLOCK QUEUE ENTRY IS INSERTED IN THE CLOCK QUEUE ACCORDING&?; TO THE TIME THAT IT WILL COME DUE.@; A; NOTE: @B; ON MULTIPROCESSOR SYSTEMS, A REQUEST WITH TYPE C.SYST!1000009C; WILL BE EXECUTED ON A PRATICULAR UNIBUS RUN, WITH URM>D; SPECIFIED IN C.URM. TYPE C.CYST REQUESTS ON MP SYSTEMS ARE>E; DEFAULTED TO RUN ON ANY UNIBUS RUN, WHICH IN PRACTICE WILL=F; RESULT IN THE REQUEST EXECUTING ON THE CPU WHICH OWNS THESG; CLOCK. ($CKURM) G;S@G; A REQUEST WITH TYPE C.SCHD!100000 OR C.SSHT!100000 INDICATESAG; THAT IT IS A SCHEDULE REQUEST WITH A DEFAULT NAMED DIRECTORY. =G; THIS BIT IS SET IN THE DIRECTIVE CODE (E.G. DRMKT) AND IN,?G; TDSCH ON RESCHEDULE REQUESTS. C.NAM IS SET UP ACCORDINGLY.TH;-I J .ENABL LSBR8K$CLINS::CLR (R0)+ ;POINT TO TYPE FIELD AND CLEAR LINK"L MOVB R4,(R0)+ ;SET REQUEST TYPE"M INC R0 ;ADVANCE TO TCB ADDRESS.N MOV R5,(R0)+ ;SET TCB OR REQUEST IDENTIFIER.O ADD $ABTIM,R2 ;CALCULATE ABSOLUTE TIME WHEN!P ADC R1 ;REQUEST WILL COME DUE +Q MOV R2,(R0)+ ;SET LOW ORDER PART OF TIMES,R MOV R1,(R0) ;SET HIGH ORDER PART OF TIME1S MOV #$CLKHD,R2 ;POINT TO CLOCK QUEUE LIST HEAD 1T10$: MOV R2,R1 ;SAVE ADDRESS OF PREVIOUS ENTRYC*U MOV (R1),R2 ;GET ADDRESS OF NEXT ENTRYV BEQ 20$ ;IF EQ END OF LIST1W CMP (R0),C.TIM+2(R2) ;COMPARE HIGH ORDER TIMES0!X BHI 10$ ;IF HI NOT THIS ENTRYD"Y BLO 20$ ;IF LO ENTRY GOES HERE0Z CMP -2(R0),C.TIM(R2) ;COMPARE LOW ORDER TIMES#[ BHIS 10$ ;IF HIS NOT THIS ENTRYC-\20$: SUB #8.,R0 ;BACK UP TO FRONT OF BLOCKS/] MOV R0,(R1) ;SET NEW NEXT IN PREVIOUS ENTRYH&^ MOV R2,(R0) ;SET NEXT IN NEW ENTRY_` .IF DF N$$DIRa.b CMPB #C.SCHD,R4 ;PERIODIC SCHEDULE REQUEST?c BEQ 25$ ;IF EQ, YES,,d CMPB #C.SSHT,R4 ;SINGLE SHOT TASK REQUESTe BNE 27$ ;IF NE, NO2f25$: CLRB C.NAM(R0) ;INDICATE UIC IN CLOCK BLOCK4g TST R4 ;IS THERE A CONTEXT BLOCK INSTEAD OF UIC?h BPL 27$ ;IF PL, NO8i INCB C.NAM(R0) ;INDICATE CONTEXT BLOCK IN CLOCK BLOCKj27$: ;REFERENCE LABELkl .ENDC ;DF N$$DIRTm6n CMPB #C.SYST,R4 ;A SYSTEM ROUTINE REQUEST (DRIVER)?o BNE 30$ ;IF NE NON7p MOV KINAR5,C.AR5(R0) ;SAVE KERNEL INSTR APR5 MAPPINGHqr .IF DF M$$PROs,t TST R4 ;IS THIS A URM SPECIFIC REQUEST ?)u BMI 30$ ;IF EQ YES, LEAVE C.URM ALONE$3v MOV #177777,C.URM(R0) ;DEFAULT TO ANY UNIBUS RUNCwx .ENDC ; DF M$$PROyz30$: RETURN ;I{|;+!}; **-$CLRMV-CLOCK QUEUE REMOVALC7~; **-$CLRSM-CLOCK QUEUE REMOVAL - SELECTIVE MARK TIME:;RL€; THIS ROUTINE IS CALLED TO REMOVE ALL ENTRIES FOR A SPECIFIED TCB00o:s sßmæàmçámýfáþfDATA ADDRESSG�; AND REQUEST TYPE FROM THE CLOCK QUEUE, OR SELECTIVELY BY EFN OR ASTS‚; ADDRESS IF ENTRY AT $CLRSM.ƒ;. „; INPUTS:…;,†; R1=EFN NUMBER OR 0 (IF ENTRY AT $CLRSM).-‡; R2=AST ADDRESS OR 0 (IF ENTRY AT $CLRSM).Vˆ; R4=REQUEST TYPE.6‰; R5=ADDRESS OF REQUESTING TCB OR SYSTEM SUBROUTINE.Š;: ‹; OUTPUTS:Œ;A�; ALL OF THE MATCHING ENTRIES FOR THE SPECIFIED TCB ADDRESS AREEDŽ; REMOVED FROM THE CLOCK QUEUE. IF THE REQUEST TYPE IS NOT 'C.SYST6�; THEN THE CLOCK QUEUE ENTRY CORE BLOCK IS RELEASED.�;-‘6’$CLRMV::CLR R1 ;MATCH ON ANY EVENT FLAG (MKTM ONLY)0“ CLR R2 ;MATCH ON ANY AST ADDRESS (MKTM ONLY)8”$CLRSM::MOV #$CLKHD,R0 ;POINT TO CLOCK QUEUE LIST HEAD1•40$: MOV R0,R3 ;SAVE ADDRESS OF PREVIOUS ENTRYQ*– MOV (R3),R0 ;GET ADDRESS OF NEXT ENTRY— BEQ 30$ ;IF EQ END OF LIST)˜ CMPB R4,C.RQT(R0) ;REQUEST TYPE MATCH?N™ BNE 40$ ;IF NE NO <š CMP R5,C.TCB(R0) ;TCB OR SYSTEM SUBROUTINE ADDRESS MATCH?› BNE 40$ ;IF NE NOTœ TST R4 ;MARK TIME ENTRY?� BNE 60$ ;IF NE NOEž TSTB R1 ;EFN SPECIFIED?1Ÿ BEQ 50$ ;IF EQ NOL#  CMPB R1,C.EFN(R0) ;MATCH ON EFN?A$¡ BEQ 55$ ;IF EQ YES, REMOVE ENTRY"¢ TST R2 ;AST ADDRESS SPECIFIED?£ BEQ 40$ ;IGNORE PACKET¤50$: TST R2 ;AST SPECIFIED?¥ BEQ 55$ ;IF EQ NOT"¦ CMP R2,C.AST(R0) ;MATCH ON AST?§ BNE 40$ ;IF NE NOC%¨55$: MOV R2,-(SP) ;SAVE AST ADDRESS © MOV R1,-(SP) ;SAVE EVENT FLAG/ª MOV R3,-(SP) ;SAVE ADDRESS OF PREVIOUS ENTRY?0« MOV C.DST(R0),R3 ;GET EVENT FLAG MASK ADDRESS!¬ MOV T.PCB(R5),R4 ;GET TASK PCBT­® .IF DF X$$HDR¯8° MOV KISAR6,-(SP) ;SAVE MAPPING FOR POSSIBLE XTRNL HDR+± MOV P.HDR(R4),-(SP) ;SAVE HEADER ADDRESST-² BNE 57$ ;IF EQ HEADER IS RESIDENT IN POOLR/³ MOV P.REL(R4),KISAR6 ;MAP TO EXTERNAL HEADER56´ MOV #140000,(SP) ;REPLACE VIRTUAL ADDRESS OF HEADER2µ57$: MOV (SP)+,R4 ;GET VIRTUAL ADDRESS OF HEADER¶· .IFF ; DF X$$HDRS¸¹ MOV P.HDR(R4),R4 ;GET HEADER º» .IFTF ; DF X$$HDR¼½¾ .IF DF G$$GEF¿)À CALL $DEAGF ;DEACCESS IF GROUP GLOBALGÁ .ENDC ; DF G$$GEFÃÄÅ .IFT ; DF X$$HDR(Æ-Ç MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGHÈÉ .ENDC ; DF X$$HDRÊ2Ë MOV (SP)+,R3 ;RESTORE ADDRESS OF PREVIOUS ENTRY#Ì MOV (SP)+,R1 ;RESTORE EVENT FLAGE$Í MOV (SP)+,R2 ;RESTORE AST ADDRESS5Î MOV (R3),R0 ;RESTORE ADDRESS OF CURRENT CLOCK BLKT(Ï CLR R4 ;RESTORE CURRENT REQUEST TYPE,Ð60$: MOV (R0),(R3) ;REMOVE ENTRY FROM LIST5Ñ CMPB #C.SYST,C.RQT(R0) ;SYSTEM SUBROUTINE REQUEST?Ò BEQ 40$ ;IF EQ YES CONTINUEG)Ó MOV R2,-(SP) ;SAVE NECESSARY REGISTERSÔ MOV R1,-(SP) ;$7Õ CALL $DCLKA ;DEALLOCATE CORE (MAY HAVE ACNTING UAB)(Ö MOV (SP)+,R1 ;RESTORE SAVED REGISTERS× MOV (SP)+,R2 ;SØ BR $CLRSM ;GO AGAINV Ù .DSABL LSBOÚÛ;+3Ü; **-$QINSF-QUEUE INSERTION AT END OF LIST (FIFO)3Ý; CÞ; THIS ROUTINE IS CALLED TO MAKE AN ENTRY IN A FIRST IN FIRST OUTE5ß; LIST. THE ENTRY IS LINKED TO THE END OF THE LIST.Tà;C á; INPUTS:.â;0(ã; R0=ADDRESS OF THE TWO WORD LISTHEAD.+ä; R1=ADDRESS OF THE ENTRY TO BE INSERTED. å;S æ; OUTPUTS:ç;M0è; THE ENTRY IS LINKED TO THE END OF THE QUEUE.é;A(ê; R0 AND R1 ARE PRESERVED ACROSS CALL.ë;-ì í .ENABL LSB(9î$QINSF::MOV 2(R0),R2 ;GET ADDRESS OF LAST ENTRY IN LIST!ï BR 20$ ;FINISH IN COMMON CODETðñ;+)ò; **-$QINSP-QUEUE INSERTION BY PRIORITYDó;ACô; THIS ROUTINE IS CALLED TO INSERT AN ENTRY IN A PRIORITY ORDEREDOAõ; LIST. THE LIST IS SEARCHED UNTIL AN ENTRY IS FOUND THAT HAS A =ö; LOWER PRIORITY OR THE END OF THE LIST IS REACHED. THE NEWT@÷; ENTRY IS THEN LINKED INTO THE LIST AT THE APPROPRIATE POINT.ø;H ù; INPUTS:Aú; (û; R0=ADDRESS OF THE TWO WORD LISTHEAD.+ü; R1=ADDRESS OF THE ENTRY TO BE INSERTED.;ý;Dþ; ÿ; OUTPUTS:;S2; THE ENTRY IS LINKED INTO THE LIST BY PRIORITY.;$(; R0 AND R1 ARE PRESERVED ACROSS CALL.;-.$QINSP::MOV R0,R3 ;COPY ADDRESS OF LISTHEAD010$: MOV R3,R2 ;SAVE ADDRESS OF CURRENT ENTRY* MOV (R2),R3 ;GET ADDRESS OF NEXT ENTRY  BEQ 20$ ;IF EQ END00oBs)sn´cÚµcÛ¶c�·c›’ OF LIST>  CMPB T.PRI(R1),T.PRI(R3) ;NEW ENTRY LOWER OR SAME PRIORITY?  BLOS 10$ ;IF LOS YES*  MOV R3,(R1) ;LINK CURRENT TO NEW ENTRY  BR 30$ ;,20$: MOV R1,2(R0) ;SET ADDRESS OF NEW LAST& CLR (R1) ;CLEAR LINK TO NEXT ENTRY/30$: MOV R1,(R2) ;LINK NEW TO PREVIOUS ENTRY  RETURN ;R  .DSABL LSB ;+*; **-$QINSB-QUEUE INSERTION AT BEGINNING;OB; THIS ROUTINE IS CALLED TO INSERT A QUEUE ENTRY INTO A QUEUE AT; THE BEGINNING.; ; INPUTS:;2(; R0=ADDRESS OF THE TWO WORD LISTHEAD.+; R1=ADDRESS OF THE ENTRY TO BE INSERTED.;O ; OUTPUTS: ;4!; THE ENTRY IS LINKED INTO THE QUEUE AT THE FRONT."; #; ALL REGISTERS ARE PRESERVED.$;-%.&$QINSB::MOV (R0),(R1) ;LINK OLD FIRST TO NEW&' BNE 5$ ;IF NE THIS IS NOT NEW LAST%( MOV R1,2(R0) ;SET NEW LAST POINTER))5$: MOV R1,(R0) ;SET NEW FIRST POINTERI * RETURN+,;+4-; **-$QCNTP-QUEUE CONTROL PACKET TO CLI DISPATCHER.; D/; THIS ROUTINE QUEUES SPECIAL PACKETS TO THE CLI DISPATCHER. THESEB0; PACKETS CAN BE "BYE" COMMANDS BEING FORCED ON A TERMINAL LINE,F1; OR A CONTROL PACKET WITH NO COMMAND TEXT SUCH AS A PROMPT REQUEST.2; 3; INPUTS:T4;R@5; R1=STATUS MASK FOR PACKET, OR ZERO TO GENERATE A BYE COMMAND=6; R2=UCB ADDRESS OF TERMINAL COMMAND IS BEING GENERATED FORS7;W 8; OUTPUTS:9;$4:; C=0 PACKET WAS SUCCESSFULLY QUEUED TO DISPATCHER4;; C=1 PACKET MAY NOT HAVE BEEN SUCCESSFULLY QUEUED;<; Z=0 IF THERE WAS A POOL OR SEC POOL ALLOCATION FAILUREC;=; Z=1 IF THE DISPATCHER WAS ALREADY ACTIVE (THIS WILL BE 6>; THE NORMAL RETURN SINCE MCR... IS ALWAYS ACTIVE)?;O@;-A,B$QCNTP::MOV KISAR6,-(SP) ;SAVE OLD MAPPING!C MOV R1,-(SP) ;SAVE STATUS WORDE!D MOV R2,-(SP) ;SAVE UCB ADDRESSD/E MOV #1,R1 ;NEED ONE BLOCK OF SECONDARY POOL F CALL $ALSEC ;ALLOCATE ITG BCS 40$ ;IF CS, NO SEC POOLCH MOV R0,KISAR6 ;MAP NEW BLOCK>I MOV #C.CTCB+140000,R2 ;POINT TO TCB FIELD IN SEC POOL BLOCK J MOV $MCRPT,(R2)+ ;TCB ADDRESSK MOV (SP)+,(R2)+ ;UCB ADDRESSIL CLR (R2)+ ;NO TEXT%M MOV (SP),(R2)+ ;INSERT STATUS WORDT*N CLR (R2)+ ;INIT STARTING RETURN OFFSET1O MOV #433,(R2)+ ;SET TERMINATOR AND BLOCK COUNTG$P TST (SP)+ ;IS THIS A BYE COMMANDQ BNE 20$ ;IF NE NOC7R MOV #3,@#C.CCT+140000 ;SET CHARACTER COUNT FOR "BYE"O8S BIS #CC.MCR,@#C.CSTS+140000 ;FORCE BYE COMMAND TO MCR T MOV #"BY,(R2)+ ;MOVE IN "BYE"U MOVB #'E,(R2)+ ;T$V20$: MOVB #15,(R2)+ ;END WITH A CR W BR QUEPKT ;GO TO COMMON CODE#X40$: CMP (SP)+,(SP)+ ;CLEAN STACK ,Y COM (SP)+ ;SET C, CLEAR Z, AND POP STACK Z RETURN ;T[\;+']; **-$QCPKT-QUEUE COMMAND LINE PACKETS>^; **-$QCLNR-QUEUE COMMAND LINE PACKET WITH NO REQUEST OF CLI_; A`; THESE ROUTINES QUEUE THE SECONDARY POOL COMMAND PACKET TO THE4Ca; APPROPRIATE CLI, AND OPTIONALLY REQUEST IT TO RUN. THEY COMMAND;:b; PACKET IN SECONDARY POOL MUST BE COMPLETELY FILLED IN.c;Vd;, e; INPUTS:0f;VDg; R1=COMMAND PACKET ADDRESS IN SECONDARY POOL (APR BIAS TO MAP IT)h;P i; OUTPUTS:j;CFk; C=0 IF THE CLI WAS SUCCESSFULLY STARTED AFTER QUEUEING THE COMMAND9l; C=1 IF THE CLI MAY NOT HAVE BEEN SUCCESSFULLY STARTED--m; Z=0 IF A POOL ALLOCATION FAILURE OCCUREDI&n; Z=1 IF THE CLI WAS ALREADY ACTIVEo;Y@p; NO STATUS IS RETURNED IF ENTRY WAS AT THE $QCLNR ENTRY POINT3q; SINCE THE QUEUEING OPERATION ITSELF CANNOT FAILDr;Os;-t u .ENABL LSBL.v$QCLNR::CLR R2 ;FLAG TO INDICATE NO REQUEST w BR 10$ ;x$QCPKT::MOV SP,R2 ;NON ZERO-y10$: MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING=#z MOV R1,KISAR6 ;MAP COMMAND BLOCK 3{QUEPKT: MOV (SP)+,R3 ;GET ORIGINAL KISAR6 MAPPINGT>| MOV @#C.CTCB+140000,-(SP) ;GET TCB ADDRESS TO REQUEST LATER#} MOV (SP),-(SP) ;COPY TCB ADDRESS !~ TST R2 ;WILL CLI BE REQUESTEDA BNE 15$ ;IF NE YES!€ CLR 2(SP) ;DO NOT REQUEST CLI .�15$: MOV @#C.CUCB+140000,R0 ;GET UCB ADDRESS ‚ CALL $MPLND ;FOLLOW REDIRECT*ƒ BIT #DV.TTY,U.CW1(R0) ;IS IT A TERMINAL„ BNE 20$ ;IF NE YES/… MOVB @#C.CBLK+140000,R1 ;GET LENGTH OF BLOCK "† MOV00oJs sßmæàmçámýfáþfDATA KISAR6,R0 ;ADDRESS OF BLOCK!‡ MOV R3,KISAR6 ;RESTORE MAPPING ˆ CMP (SP)+,(SP)+ ;CLEAN STACK 7‰ CALLR $DESEC ;DEALLOCATE PACKET AND FORGET ABOUT ITO+Š20$: MOV KISAR6,R1 ;GET ADDRESS OF PACKETD!‹ MOV R3,KISAR6 ;RESTORE MAPPINGUŒ�Ž .IF DF V$$TRM� � MOV (R0),R2 ;GET DCB ADDRESS/‘ CMP D.NAM(R2),#"VT ;IS IT A VIRTUAL TERMINALS’ BNE 30$ ;IF NE NOO2“ CMP $MCRPT,(SP) ;IS COMMAND GOING TO DISPATCHER” BNE 30$ ;IF NE NOY;• INCB U.OCNT(R0) ;INCREMENT USE COUNT OF VIRTUAL TERMINALK–30$:—˜ .ENDC™š2› MOV #$CLICQ,R0 ;POINT TO COMMAND QUEUE LISTHEAD œ CALL $QSPIF ;INSERT IN QUEUE'� MOV (SP)+,R0 ;GET TCB ADDRESS OF CLIžŸ  .IF DF A$$CLI¡-¢ CMP $MCRPT,R0 ;COMMAND GOING TO DISPATCHERU8£ BEQ 40$ ;IF EQ YES, OPTIMIZE BY NOT CHECKING FOR AST9¤ CALL $DCAST ;DECLARE COMMAND ARRIVAL AST IF SPECIFIED#¥ BCS 40$ ;IF CS, NO AST DECLAREDS1¦ CLR (SP) ;DO NOT REQUEST CLI SINCE IT GOT AST §¨ .ENDC ;A$$CLI©ª3«40$: MOV (SP)+,R0 ;GET TCB ADDR OF CLI TO REQUEST¬ BEQ 50$ ;IF EQ, NO REQUEST­ CALLR $EXRQN ;REQUEST CLIE®50$: RETURN ; ¯ .DSABL LSBE°±;+C²; **-$QMCRL-QUEUE COMMAND LINE TO THE CLI OF A SPECIFIED TERMINALPD³; **-$QMCR -QUEUE COMMAND LINE TO MCR REQARDLESS OF TERMINAL'S CLI1´; **-$QCLIL-QUEUE COMMAND LINE TO SPECIFIED CLIAµ;MF¶; THESE ROUTINES QUEUE COMMAND BUFFERS TO A CLI TASK FOR PROCESSING.>·; THEY ONLY EXIST TO PROVIDE A COMPATABLE INTERFACE FOR CODEH¸; THAT HAS NOT BEEN CHANGED TO DEAL WITH THE NEW COMMAND PACKET FORMATG¹; AND THE USE OF SECONDARY POOL INSTEAD OF SYSTEM POOL. THEY PRESERVE Mº; THE OLD INTERFACE BY ACCEPTING A STANDARD 84. BYTE PACKET IN SYSTEM POOL,A5»; ALLOCATING SECONDARY POOL AND COPYING THE COMMANDTH¼; TEXT INTO IT. THE SYSTEM POOL IS DEALLOCATED, AND THE SECONDARY POOL<½; PACKET USED INSTEAD. THIS ADDS CONSIDERABLE OVERHEAD, SO6¾; THESE ROUTINES SHOULD NOT BE USED BY ANY NEW CODE.¿;A À; INPUTS:NÁ;C$Â; R0=CLI TCB ADDRESS ($QCLIL ONLY)/Ã; R1=ADDRESS OF COMMAND PACKET IN SYSTEM POOLÄ; Å; OUTPUTS:Æ;Y?Ç; C=0 IF CLI WAS SUCCESSFULLY REQUESTED WITH THE COMMAND LINEC3È; C=1 IF THE REQUEST MAY NOT HAVE BEEN SUCCESSFULOAÉ; Z=0 IF A SYSTEM OR SECONDARY POOL ALLOCATION FAILURE OCCUREDE"Ê; Z=1 IF THE CLI ALREADY ACTIVEË;DÌ;-Í Î .ENABL LSB*Ï$QMCRL::CLR -(SP) ;GO TO TERMINAL'S CLI Ð BR 10$ ;)Ñ$QMCR:: MOV #CC.MCR,-(SP) ;FORCE TO MCRY;Ò10$: MOV $MCRPT,-(SP) ;GIVE COMMAND TO COMMAND DISPATCHERE Ó BR 20$ ;4Ô$QCLIL::CMP $MCRPT,R0 ;IS COMMAND INTENDED FOR MCRÕ BEQ $QMCR ;IF EQ YES#Ö CLR -(SP) ;GO TO TERMINAL'S CLIS#× MOV R0,-(SP) ;TCB ADDRESS OF CLIF7Ø20$: MOV 2(R1),-(SP) ;GET UCB ADDR OF SOURCE TERMINAL !Ù BIT #1,(SP) ;PROMPT REQUEST?? Ú BEQ 40$ ;IF EQ NOZ"Û MOV R1,R0 ;COPY PACKET ADDRESS#Ü MOV #4,R1 ;GET LENGTH OF PACKETL"Ý30$: CALL $DEACB ;DEALLOCATE IT Þ MOV (SP)+,R2 ;GET UCB ADDRESSß BIC #1,R2 ;REMOVE ODD BIT$à CMP (SP)+,(SP)+ ;CLEAN STACKA%á MOV #CC.PRM,R1 ;SET PROMPT REQUEST:3â JMP $QCNTP ;CONVERT IT TO PROMPT REQUEST PACKETM+ã40$: MOV R1,-(SP) ;SAVE ADDRESS OF PACKET'Eä MOV #/100,R1 ;GET NUMBER OF BLOCKS OF SEC POOLE(å CALL $ALSEC ;ALLOCATE SECONDARY POOLæ BCC 50$ ;IF CC, SUCCESSB2ç MOV (SP)+,R0 ;GET ADDRESS OF SYSTEM POOL PACKET/è MOV #M$$CRB,R1 ;LENGTH OF SYSTEM POOL PACKETC4é BR 30$ ;ISSUE A PROMPT FOR LACK OF ANYTHING ELSE*ê50$: MOV KISAR6,R3 ;SAVE CURRENT MAPPING*ë MOV R0,KISAR6 ;MAP SECONDARY POOL BLOCK0ì MOV (SP)+,R0 ;GET VALUE OFF STACK TEMPORARILY>í MOV #C.CUCB+140000,R2 ;POINT TO UCB FIELD IN SECONDARY POOL&î MOV (SP)+,(R2)+ ;INSERT UCB ADDRESS'ï MOV (SP)+,-4(R2) ;INSERT TCB ADDRESSE#ð CLR (R2)+ ;INIT CHARACTER COUNT ñ MOV (SP)+,(R2)+ ;STATUS BITSB+ò CLR (R2)+ ;INIT STARTING OFFSET OF TEXT !ó INC R2 ;SKIP TERMINATOR FIELDF2ô MOVB R1,(R2)+ ;INSERT NUMBER OF SEC POOL BLOCKS6õ MOV R0,-(SP) ;PUT SYSTEM POOL ADDRESS BACK ON STACK1ö CMP (R0)+,(R0)+ ;POINT TO COMMAND TEXT IN POOLO6÷60$: MOVB (R0)+,(R2) ;COPY A CHARA00oRs)sn´cÚµcÛ¶c�·c›’CTER INTO SEC POOL)ø CMPB #15,(R2) ;IS IT A CARRIAGE RETURNIù BEQ 70$ ;IF EQ YES!ú CMPB #33,(R2) ;IS IT AN ESCAPEû BEQ 70$ ;IF EQ YESü INC R2 ;ADVANCE POINTER *ý INC @#C.CCT+140000 ;COUNT THE CHARACTERþ BR 60$ ;NEXT CHARACTER/ÿ70$: MOVB (R2),@#C.CTR+140000 ;SET TERMINATORT( MOVB #15,(R2) ;FORCE A CR TO END TEXT+ MOV (SP)+,R0 ;GET ADDRESS OF POOL PACKETP MOV #M$$CRB,R1 ;LENGTH + MOV R3,-(SP) ;SAVE ORIGINAL KISAR6 VALUED CALL $DEACB ;DEALLOCATE IT3 MOV SP,R2 ;INSURE NON-ZERO TO FORCE CLI REQUESTR! JMP QUEPKT ;GO TO COMMON CODEQ  .DSABL LSBS ;+@ ; **-$SCMDQ-SEARCH COMMAND QUEUE FOR BUFFER FOR SPECIFIED TASK8 ; **-$SRCCQ-SEARCH QUEUE FOR BUFFER FOR SPECIFIED TASK? ; **-$SRUCB-SEARCH QUEUE FOR BUFFER FROM A SPECIFIED TERMINALTI ; **-$SRCQ1-SEARCH QUEUE FROM MIDDLE FOR PACKET WITH SPECIFIED TCB ADDRTI; **-$SRUC1-SEARCH QUEUE FROM MIDDLE FOR PACKET WITH SPECIFIED UCB ADDR ;NI; THESE ROUTINES SEARCH A QUEUE IN SECONDARY POOL FOR SPECIFIC PACKETS.-D; THEY ARE MAINLY INTENDED FOR USE ON THE QUEUE CONTAINING COMMANDD; PACKETS, THAT HAVE A TCB ADDRESS AT OFFSET 2, AND A TERMINAL UCBI; ADDRESS AT OFFSET 4. THE LISTHEAD MUST BE IN EXEC SPACE IF THE SEARCHA; STARTS THERE. THE $SRCQ1 AND $SRUC1 ROUTINES START THE SEARCH F; AT ANY PACKET IN THE QUEUE. THIS PACKET DOES NOT HAVE TO BE MAPPEDE; WHEN THE ROUTINE IS CALLED. NOTE THAT FOR ANY ROUTINE, THE PACKETD"; WILL NOT BE DEQUEUED IF FOUND.;U ; INPUTS:Y1; R0=LISTHEAD ADDRESS (FOR $SRCCQ, $SRUCB ONLY)NG; R0=APR VALUE TO MAP PACKET TO START SEARCH AT ($SRCQ1, $SRUC1 ONLY)T%; R5=TCB OR UCB ADDRESS TO LOOK FORU; ; OUTPUTS:; 5 ; C=1 IF THERE IS NO ENTRY IN THE LIST THAT MATCHES!; C=0 IF THE ENTRY IS FOUND$&"; R0=ADDRESS OF BUFFER THAT MATCHES#;P$;-%& ASSUME C.CTCB,2' ASSUME C.CUCB,4( ) .ENABL LSBT6*$SRUCB::MOV (R0),R0 ;POINT TO FIRST ELEMENT IN LIST9+$SRUC1::MOV #4,R1 ;GET OFFSET TO UCB ADDRESS IN PACKETY, BR 10$ ;GO TO COMMON CODE$9-$SCMDQ::MOV #$CLICQ,R0 ;POINT TO COMMAND QUEUE LISTHEADR6.$SRCCQ::MOV (R0),R0 ;POINT TO FIRST ELEMENT IN LIST9/$SRCQ1::MOV #2,R1 ;GET OFFSET TO TCB ADDRESS IN PACKETE-010$: MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING=!1 MOV R0,KISAR6 ;MAP FIRST ENTRYD!2 BEQ 40$ ;IF EQ, LIST IS EMPTY+320$: CMP R5,140000(R1) ;IS THIS THE ENTRYB4 BEQ 50$ ;IF EQ YES&5 MOV @#140000,KISAR6 ;MAP NEXT BLOCK 6 BNE 20$ ;IF NE, MORE IN LIST740$: SEC ;NOT FOUNDR*850$: MOV KISAR6,R0 ;GET ADDRESS OF ENTRY$9 MOV (SP)+,KISAR6 ;RESTORE MAPPING : RETURNE ; .DSABL LSB<=>?;+.@; **-$QRMVF-QUEUE REMOVAL FROM FRONT OF LISTA;RBB; THIS ROUTINE IS CALLED TO REMOVE THE NEXT (FRONT) ENTRY FROM ABC; LIST. THE LIST ORGANIZATION MAY BE EITHER FIFO OR BY PRIORITY.D; E; INPUTS:MF;(G; R0=ADDRESS OF THE TWO WORD LISTHEAD.H; I; OUTPUTS:J;S,K; C=1 IF THERE ARE NO ENTRIES IN THE LIST.3L; C=0 IF THE NEXT ENTRY IS REMOVED FROM THE LIST.R%M; R1=ADDRESS OF THE ENTRY REMOVED.EN; O; R0 IS PRESERVED ACROSS CALL.P;-Q R .ENABL LSB .S$QRMVF::MOV R0,R2 ;COPY ADDRESS OF LISTHEAD*T MOV (R2),R3 ;GET ADDRESS OF NEXT ENTRY$U BNE 30$ ;IF NE LIST HAS AN ENTRY V10$: SEC ;NO ENTRIES IN LIST W RETURN ;AXY;+,Z; **-$QRMVA-QUEUE REMOVAL BY BLOCK ADDRESS[;D\; THIS ROUTINE IS CALLED TO REMOVE A PARTICULAR BLOCK FROM A LIST..]; LIST ORGANIZATION MAY BE FIFO OR PRIORITY.^;T _; INPUTS: `;M$a; R0=ADDRESS OF TWO WORD LISTHEAD.(b; R1=ADDRESS OF THE TCB TO SEARCH FOR.c;E d; OUTPUTS:e;-Bf; C=1 IF THERE IS NO ENTRY IN THE LIST THAT MATCHES THE ADDRESS.5g; C=0 IF A MATCHING ENTRY IS REMOVED FROM THE LIST.$%h; R1=ADDRESS OF THE ENTRY REMOVED. i;E$j; R0 IS PRESERVED ACROSS THE CALL.k;-l.m$QRMVA::MOV R0,R3 ;COPY ADDRESS OF LISTHEAD0n15$: MOV R3,R2 ;SAVE ADDRESS OF CURRENT ENTRY+o MOV (R2),R3 ;GET ADDRESS OF NEXT ENNTRYEp BEQ 10$ ;IF EQ END OF LISTq CMP R1,R3 ;ADDRESS MATCH ?r BEQ 30$ ;IF EQ YESs BR 1500oZs sßmæàmçámýfáþfDATA$ ;GO AGAINtu;+*v; **-$QRMVT-QUEUE REMOVAL BY TCB ADDRESSw;IDx; THIS ROUTINE IS CALLED TO REMOVE THE NEXT ENTRY FROM A LIST THATAy; MATCHES A SPECIFIED TCB ADDRESS. THE LIST ORGANIZATION MAY BEMz; EITHER FIFO OR BY PRIORITY. {;SR{; NOTE: IN ADDITION TO MATCHING R1 WITH THE ELEMENTS ON THE LIST, R1 IS ;JWB165J{; ALSO CHECKED AGAINST OFFSET 4 IN EACH ELEMENT ON THE LIST. ;JWB165{; ;JWB165T{; FOR EXAMPLE, R1 COULD BE SET TO A TCB AND THE LISTHEAD COULD POINT TO A ;JWB165U{; LIST OF I/O PACKETS. THE PACKET THAT GETS DEQUEUED IS THE ONE WHERE THE ;JWB165 O{; TCB IN R1 MATCHES THE TCB IN THE I/O PACKET (I.TCB AT OFFSET 4). ;JWB165R{; ;JWB165O{; THE $DETRG ROUTINE ALSO USES THIS FEATURE WHEN REMOVING ATTACHMENT ;JWB165AO{; DESCRIPTORS. SEE $DETRG ROUTINE IN MODULE PLSUB FOR MORE DETAILS. ;JWB165O{; ;JWB165 |; INPUTS:.};;'~; R0=ADDRESS OF THE TWO WORD LISTEAD.M(; R1=ADDRESS OF THE TCB TO SEARCH FOR.€;C �; OUTPUTS:‚;WFƒ; C=1 IF THERE IS NO ENTRY IN THE LIST THAT MATCHES THE TCB ADDRESS.5„; C=0 IF A MATCHING ENTRY IS REMOVED FROM THE LIST.T%…; R1=ADDRESS OF THE ENTRY REMOVED.J†;R ‡; R0 IS PRESERVED ACROSS CALL.ˆ;-‰‰ ;JWB165T+‰ ASSUME ,C.TCB ;JWB165E+‰ ASSUME ,C.TCB ;JWB165B$‰ ASSUME I.TCB,C.TCB ;JWB165‰ ;JWB165U.Š$QRMVT::MOV R0,R3 ;COPY ADDRESS OF LISTHEAD0‹20$: MOV R3,R2 ;SAVE ADDRESS OF CURRENT ENTRY*Œ MOV (R2),R3 ;GET ADDRESS OF NEXT ENTRY� BEQ 10$ ;IF EQ END OF LIST$Ž CMP R1,R3 ;MATCH ON TCB ADDRESS?� BEQ 30$ ;IF EQ YES*� CMP R1,C.TCB(R3) ;MATCHING TCB ADDRESS?‘ BNE 20$ ;IF NE NOI#’30$: MOV (R3),(R2) ;CLOSE UP LIST“ BNE 40$ ;IF NE NO NEW LAST(” MOV R2,2(R0) ;SET ADDRESS OF NEW LAST/•40$: MOV R3,R1 ;SET ADDRESS OF ENTRY REMOVEDI– CLC ;SUCCESSW — RETURN ; ˜ .DSABL LSBQ™š;+<›; **-$QSPIB-QUEUE INSERTION AT BEGINNING IN SECONDARY POOLœ;FA�; THIS ROUTINE IS CALLED TO INSERT AN ENTRY INTO A QUEUE AT THE1Kž; BEGINNING. THE QUEUE MUST BE IN SECONDARY POOL, WITH A STANDARD 2 WORD (Ÿ; LISTHEAD IN THE SYSTEM POOL OR SYSCM ;S ¡; INPUTS:$¢; /£; R0=ADDRESS OF 2 WORD LISTHEAD IN EXEC SPACEBH¤; R1=ADDRESS OF ENTRY TO BE INSERTED. ENTRY MUST BE IN SECONDARY POOL<¥; THIS VALUE WILL BE LOADED INTO AN APR TO MAP THE ENTRY.¦;§;R ¨; OUTPUTS:©;S2ª; THE ENTRY IS INSERTED IN THE LIST AT THE FRONT«;I¬; ALL REGISTERS ARE PRESERVEDR­;E®;-¯ °$QSPIB::±²³ .IF DF P$$OOL´8µ MOV (R0),-(SP) ;SAVE ADDRESS OF CURRENT FIRST IN LIST'¶ MOV KISAR6,-(SP) ;SAVE APR 6 MAPPINGY*· MOV R1,KISAR6 ;MAP ENTRY TO BE INSERTED=¸ MOV 2(SP),@#140000 ;LINK NEW ENTRY TO PREVIOUS FIRST ENTRYE-¹ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGE(º TST (SP)+ ;WAS IT NEW LAST IN LIST ?(» BNE 10$ ;IF NE, THIS IS NOT NEW LAST%¼ MOV R1,2(R0) ;SET NEW LAST POINTERS*½10$: MOV R1,(R0) ;SET NEW FIRST POINTER ¾ RETURNT¿À;+3Á; **-$QSPIF-QUEUE INSERTION AT END OF LIST (FIFO)DÂ;OCÃ; THIS ROUTINE IS CALLED TO MAKE AN ENTRY IN A FIRST IN FIRST OUTM6Ä; LIST. THE ENTRY IS LINKED TO THE END OF THE LIST.GÅ; THE LIST MUST BE IN SECONDARY POOL, WITH A STANDARD 2 WORD LISTHEADU Æ; IN THE SYSTEM POOL OR SYSCM.Ç;S È; INPUTS: É;N!Ê; R0=ADDRESS OF 2 WORD LISTHEADIGË; R1=ADDRESS OF ENTRY TO BE INSERTED. THIS VALUE WILL BE PUT INTO ANNÌ; APR TO MAP THE ENTRY.Í;R Î; OUTPUTS:Ï;P/Ð; THE ENTRY IS LINKED TO THE END OF THE QUEUE Ñ;TÒ; ALL REGISTERS ARE PRESERVEDÓ;HÔ;-ÕÖ .IFTF× Ø$QSPIF::ÙÚ .IFTIÛÜ TST (R0) ;IS LIST EMPTYYÝ BEQ $QSPIB ;IF EQ YESE!Þ MOV KISAR6,-(SP) ;SAVE MAPPINGO.ß MOV 2(R0),KISAR6 ;MAP TO LAST BLOCK IN LIST+à MOV R1,@#140000 ;LINK NEW BLOCK AFTER ITU"á MOV R1,KISAR6 ;MAP TO NEW BLOCK,â CLR @#140000 ;CLEAR LINK WORD TO END LIST-ã MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGR+ä MOV R1,2(R0) ;UPDATE END OF LIST POINTER å RETURNRæç;+.è; **-$QSPRF-QUEUE REMOVAL FROM00obs)sn´cÚµcÛ¶c�·c›’ FRONT OF LISTé;RBê; THIS ROUTINE IS CALLED TO REMOVE THE NEXT (FRONT) ENTRY FROM ADë; LIST. THE LIST MUST BE IN SECONDARY POOL WITH A STANDARD 2 WORD$ì; LISTHEAD IN SYSTEM POOL OR SYSCMí;K î; INPUT:ï;T(ð; R0=ADDRESS OF LISTHEAD IN EXEC SPACEñ;O ò; OUTPUTS:ó;V+ô; C=1 IF THERE ARE NO ENTRIES IN THE LIST õ; R1=0 3ö; C=0 IF THE NEXT ENTRY IS REMOVED FROM THE LIST.U=÷; R1=ADDRESS OF ENTRY REMOVED. THIS ADDRESS SHOULD BE PUTT!ø; IN AN APR TO MAP THE ENTRY. ù;A"ú; ALL OTHER REGISTERS PRESERVEDû;Iü;-ýþ .IFTFÿ $QSPRF:: .IFTM SEC ;ASSUME EMPTY LISTN3 MOV (R0),R1 ;GET ADDRESS OF FIRST BLOCK IN LISTI BEQ 20$ ;IF EQ, EMPTY LIST& MOV KISAR6,-(SP) ;SAVE APR6 MAPPING, MOV R1,KISAR6 ;MAP TO FIRST BLOCK IN LIST/  MOV @#140000,R1 ;GET POINTER TO NEXT IN LISTR,  MOV (SP),KISAR6 ;RESTORE PREVIOUS MAPPING/  MOV (R0),(SP) ;SAVE ADDRESS OF FIRST IN LISTT%  MOV R1,(R0) ;UNLINK FIRST ELEMENT )  BNE 10$ ;IF NE, THERE IS MORE IN LISTR+ MOV R0,2(R0) ;UPDATE END OF LIST POINTERF410$: MOV (SP)+,R1 ;SET ADDRESS OF FIRST FOR RETURN  CLC ;AN ELEMENT WAS REMOVED 20$: RETURN ;+6; **-$QSPIP-QUEUE INSERTION IN SEC. POOL BY PRIORITY;P;; THIS ROUTINE IS CALLED TO INSERT A SECONDARY POOL BLOCKM&; INTO A LIST BY ITS PRIORITY FIELD.; ; INPUTS:I;;%; R0=LISTHEAD ADDRESS IN EXEC SPACES-; R4=OFFSET INTO BLOCK OF LINKWORD + 140000R&; KISAR6 MAPS THE BLOCK TO BE QUEUED;E ; OUTPUTS:!;L "; NONE.V#;($; R0-R3 ARE DESTROYED.N%;-&2'$QSPIP::MOV KISAR6,-(SP) ;SAVE BIAS OF NEW ENTRY6( MOVB 140000+T.PRI,-(SP) ;SAVE PRIORITY OF NEW ENTRY')10$: MOV R0,R2 ;SAVE ADDRESS OF LASTC * MOV R1,R3 ;SAVE BIAS OF LAST*+ MOV R4,R0 ;GET VIRTUAL ADDRESS OF NEXT!, MOV (R2),R1 ;GET BIAS OF NEXTI- BEQ 20$ ;IF EQ END OF LIST#. MOV R1,KISAR6 ;MAP TO NEXT BLOCKE(/ CMPB 140000+T.PRI,(SP) ;BELONG HERE ?0 BHIS 10$ ;IF HIS NO6+120$: TST (SP)+ ;DUMP PRIORITY FROM STACKT%2 MOV R3,KISAR6 ;REMAP TO LAST ENTRYA#3 MOV (SP),(R2) ;LINK TO NEW ENTRYO(4 MOV (SP)+,KISAR6 ;RE-MAP TO NEW ENTRY#5 MOV R1,(R4) ;STUFF LINK POINTERT 6 RETURN ;789;+(:; **-$GTSPK-GET SECONDARY POOL PACKET.;; E<; THIS ROUTINE IS CALLED TO DEQUEUE A SPECIFIC PACKET FROM A QUEUE.1=;T >; INPUTS:I?;B)@; R0=ADDRESS OF LISTHEAD IN EXEC SPACE.6$A; R1=APR VALUE FOR DESIRED PACKET.B;( C; OUTPUTS:D;%E; C=1 IF NO PACKET CAN BE DEQUEUED.P.F; C=0 IF A PACKET WAS SUCCESSFULLY DEQUEUED.=G; R1=ADDRESS OF THE ENTRY REMOVED. THIS ADDRESS SHOULD BE4H; PUT IN AN APR TO MAP THE ENTRY.I;UJ;-K-L$GTSPK::MOV R0,-(SP) ;SAVE LISTHEAD ADDRESSTM MOV R2,-(SP) ;SAVE R2&N MOV KISAR5,-(SP) ;SAVE KERNEL APR 5&O MOV KISAR6,-(SP) ;SAVE KERNEL APR 6%P10$: SEC ;ASSUME PACKET NOT FOUNDD3Q MOV (R0),R2 ;GET ADDRESS OF NEXT PACKET IN LISTRR BEQ 100$ ;IF EQ END OF LISTT.S MOV KISAR5,KISAR6 ;SAVE POINTER TO PREVIOUS3T MOV R2,KISAR5 ;MAP THE NEXT PACKET THROUGH APR 5 *U CMP R1,R2 ;IS THIS THE DESIRED PACKET?V BEQ 50$ ;IF EQ YES/W MOV #120000,R0 ;POINT TO LINK WORD IN PACKETUX BR 10$ ;GET NEXT PACKET-3Y50$: CMP R0,6(SP) ;IS THIS THE FIRST IN THE LIST?2Z BNE 60$ ;IF NE NOS"[ MOV (SP)+,KISAR6 ;RESTORE APR 6#\ CALL $QSPRF ;DEQUEUE THE PACKETS ] BR 110$ ; +^60$: MOV (R0),@#140000 ;UNLINK THE PACKETP#_ BNE 90$ ;IF NE NOT LAST IN LISTN%` MOV 6(SP),R0 ;GET LISTHEAD ADDRESSP+a MOV KISAR6,R2 ;COPY LAST IN LIST ADDRESS ,b MOV (SP),KISAR6 ;RESTORE PREVIOUS MAPPING,c MOV R2,2(R0) ;UPDATE LAST IN LIST POINTERd90$: CLC ;INDICATE SUCCESS'e100$: MOV (SP)+,KISAR6 ;RESTORE APR 6T'f110$: MOV (SP)+,KISAR5 ;RESTORE APR 5Eg MOV (SP)+,R2 ;RESTORE R26)h MOV (SP)+,R0 ;RESTORE LISTHEAD ADDRESSE i RETURN ; jk .ENDClmn .END BR 110$ ; +^60$: MOV (R0),@#140000 ;UNLINK THE PACKETP#_ BNE 90$ ;IF NE NOT LAST IN LISTN%` MOV 6(SP),R0 ;GET LISTHEAD ADDRESSP+a MOV KISAR6,R2 ;COPY LAST IN LIST ADDRESS ,b00èjs sßmæàmçámýfáþfDATAOF I/O TRANSFER.2; I.PRM+4 -- NUMBER OF BYTES TO BE TRANSFERED.+; I.PRM+6 -- TIME DISPLACEMENT IN TICKS >; I.PRM+10 -- VIRTUAL ADDRES (TO BECOME RELOCATION BIAS) OF; DESTINATION BUFFERC; I.PRM+12 -- FILLED IN WITH DISPLACEMENT ADDRESS OF DESTINATIONS; BUFFER9; I.PRM+14 -- USED TO STORE BUFFER/CLOCK BLOCK ADDRESSN<; I.PRM+16 -- FILLED IN WITH PCB ADDRESS OF OUTPUT BUFFER;- .ENABL LSB  .PAGEC; *****************************************************************O ; * *2; * I N I T I A T I O N E N T R Y P O I N T * ; * *C; *****************************************************************O.BMINI: ; PRE-QUEUING INITIALIZE ENTRY POINTC; ***************************************************************** ; * *6; * ADDRESS CHECK THE SOURCE BUFFER WHILE THE TASKS *3; * CONTEXT IS LOADED, AND FILL IN THE NECESSARY *F%; * PARAMETERS IN THE I/O PACKET *A ; * *C; ***************************************************************** ( MOV R1,R3 ; COPY ADDRESS OF I/O PACKET; MOV I.PRM+10(R1),R0 ; GET VIRTUAL ADDRESS OF SOURCE BUFFER*1 MOV I.PRM+4(R3),R1 ; AND LENGTH OF SOURCE BUFFERRC; +---------------------------------------------------------------+* ; | |,; | THE INPUT PARAMETERS FOR $CKBFR ARE: | ; | |3; | R0 = STARTING ADDRESS OF BLOCK TO BE CHECKED |,.; | R1 = LENGTH OF THE BLOCK TO BE CHECKED |/; | $ATTPT = ADDRESS OF I.AADA IN I/O PACKET |*!; | (ESTABLISHED IN DRQIO) |*6; | CURRENT TASK HEADER MUST BE MAPPED THROUGH APR 6 |.; | (ESTABLISHED BY DIRECTIVE DISPATCHER) | ; | |#; | THE OUTPUT PARAMETERS ARE: |E ; | |2; | C = 0 IF CHECK AND PACKET UPDATE SUCCESSFUL |1; | I.AADA OR I.AADA IN PACKET POINTS TO | 2; | RELATED ADB, P.IOC, A.IOC INCREMENTED |3; | C = 1 IF CHECK UNSUCCESFUL OR I.AADA, I.AADA |!; | ALREADY FILLED IN |C ; | |C; +---------------------------------------------------------------+ 1 CALL $CKBFR ; CHECK BUFFER, INCREMENT A.IOC ANDT# ; P.IOC FOR APPROPRIATE REGIONS  BCC 10$ ; IF CC ALL WAS OKC; ***************************************************************** ; * *1; * SOURCE BUFFER WAS ILLEGAL, FINISH I/O HERE *A ; * *C; ***************************************************************** + MOV #IE.SPC&377,R0 ; SET COMPLETION STATUS* CLR R1 ; AND NUMBER OF BYTES TRANSFERRED .PAGEC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $IOFIN ARE: | ; | |/; | R0 = FIRST WORD OF I/O STATUS TO RETURN |/; | R1 = SECOND WORD OF I/O STATUS TO RETURN |*#; | R3 = ADDRESS OF I/O PACKET | ; | |#; | THE OUTPUT PARAMETERS ARE: | ; | |; | R4 IS DESTROYED | ; | |C; +---------------------------------------------------------------+- CALLR $IOFIN ; COMPLETE I/O AND EXIT DRIVERAC; ***************************************************************** ; * *3; * BUFFER WAS LEGAL, CONVERT VIRTUAL ADDRESS TO * /; * ADDRESS DOUBLEWORD AND STORE PARAMETERS *U ; * *C; *****************************************************************AC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $RELOC ARE: | ; | |-; | R0 = USER VIRTUAL ADDRESS TO RELOCATE |L ; | |#; | THE OUTPUT PARAMETERS ARE: |* ; | |/; | R1 = APR6 RELOCATION BIAS OF USER BUFFER |+; | R2 = DISPLACEMENT IN BLOCK + 140000 |I ; | |C; +---------------------------------------------------------------+*+10$: CALL $RELOC ; RELOCATE BUFFER ADDRESS*5 MOV R1,I.PRM+10(R3) ; SAVE APR BIAS OF SOURCE BUFFER-/ MOV R2,I.PRM+12(R3) ; AND DISPLACEMENT ADDRESS - CLR I.PRM+16(R3) ; INDICATE NOT BUFFERED I/O  .PAGEC; *****************************************************************| ; * */; * NOW QUEUE THE PACKET IN THE DEVICE QUEUE *A ; * *C; ********************************00èrs)sn´cÚµcÛ¶c�·c›’*********************************I0 MOV R4,R0 ; COPY POINTER TO I/O QUEUE LISTHEAD' MOV R3,R1 ; AND ADDRESS OF I/O PACKETCC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $QINSP ARE: | ; | |-; | R0 = ADDRESS OF THE TWO WORD LISTHEAD |0; | R1 = ADDRESS OF THE PACKET TO BE INSERTED | ; | |; | NO OUTPUT PARAMETERS | ; | |C; +---------------------------------------------------------------+*& CALL $QINSP ; INSERT PACKET IN QUEUE .PAGEC; *****************************************************************S ; * *.; * BEGIN SERIAL PROCESSING OF I/O PACKETS * ; * *C; ***************************************************************** C; +---------------------------------------------------------------+= ; | |,; | THE INPUT PARAMETERS FOR $GTPKT ARE: | ; | |1; | R5 = ADDRESS OF THE UCB OF REQUESTING UNIT |- ; | |#; | THE OUTPUT PARAMETERS ARE: |L ; | |3; | C = 0 IF A REQUEST WAS SUCCESSFULLY DEQUEUED |*'; | R1 = ADDRESS OF THE I/O PACKET |*"; | R2 = PHYSICAL UNIT NUMBER |; | R3 = CONTROLLER INDEX | '; | R4 = SCB ADDRESS OF CONTROLLER |*!; | R5 = UCB ADDRESS OF UNIT |*/; | C = 1 IF UNIT BUSY OR NO PACKETS QUEUED |- ; | |C; +---------------------------------------------------------------+ .BMIN1: CALL $GTPKT ; ATTEMPT TO GET A REQUEST BCC 20$ ; IF CC WE GOT ONE& RETURN ; DEVICE BUSY OR QUEUE EMPTY20$: ; REFERENCE LABELF .PAGEC; ***************************************************************** ; * *(; * ATTEMPT TO ALLOCATE CLOCK BLOCK * ; * *C; ***************************************************************** % MOV R1,R3 ; COPY I/O PACKET ADDRESSO+ MOV #C.LGTH,R1 ; SET LENGTH OF CLOCK BLOCK-C; +---------------------------------------------------------------+L ; | |,; | THE INPUT PARAMETERS FOR $ALOCB ARE: | ; | |4; | R1 = SIZE OF THE BLOCK TO ALLOCATE (IN BYTES) | ; | |#; | THE OUTPUT PARAMETERS ARE: |* ; | |3; | C = 0 IF A BLOCK WAS SUCCESSFULLY ALLOCATED | C+; | R0 = ADDRESS OF THE ALLOCATED BLOCK |**; | R1 = LENGTH OF THE ALLOCATED BLOCK |/; | C = 1 IF NO BLOCK ISCURRENTLY AVAILABLE |D ; | |C; +---------------------------------------------------------------+-# CALL $ALOCB ; ATTEMPT TO ALLOCATEL BCC 30$ ; IF CC SUCCESSFUL$ MOV #IE.NOD&377,R0 ; SET I/O STATUSC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $IOALT ARE: | ; | |,; | R0 = FIRST WORD OF I/O STATUS BLOCK |,; | R1 = SECOND WORD OF I/O STATUS BLOCK |,; | R2 = STARTING AND FINAL RETRY COUNTS |); | (IF AN ERROR LOGGING DEVICE) | ,; | R5 = UCB ADDRESS OF UNIT TO COMPLETE | ; | |#; | THE OUTPUT PARAMETERS ARE: |T ; | |; | R4 IS DESTROYED | ; | |C; +---------------------------------------------------------------+-$ CALL $IOALT ; AND COMPLETE THE I/O" BR BMIN1 ; GO LOOK FOR MORE WORK630$: MOV R0,I.PRM+14(R3) ; SAVE ADDRESS OF CLOCK BLOCK .PAGEC; *****************************************************************S ; * *.; * DETERMINE IF I/O REQUEST IS BUFFERABLE * ; * *C; *****************************************************************HC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $TSTBF ARE: | ; | |*; | R3 = ADDRESS OF I/O PACKET TO TEST | ; | |#; | THE OUTPUT PARAMETERS ARE: |R ; | |(; | C = 0 IF REQUEST MAY BE BUFFERED |,; | C = 1 IF REQUEST MAY NOT BE BUFFERED | ; | |C; +---------------------------------------------------------------+/ CALL $TSTBF ; TEST FOR BUFFERABLE I/O REQUEST*) BCS 40$ ; IF CS CAN'T ALLOCATE A BUFFER-C; ***************************************************************** ; * *%; * ATTEMPT TO ALLOCATE A BUFFER * ; * *C00èzs sßmæàmçámýfáþfDATA; *****************************************************************P* MOV I.PRM+4(R3),R1 ; GET LENGTH OF BUFFER, CMP R1,#BUFLIM ; BIGGER THAN BUFFER LIMIT ?# BHI 40$ ; IF HI YES, DON'T BUFFER C; +---------------------------------------------------------------+- ; | |,; | THE INPUT PARAMETERS FOR $ALOCB ARE: | ; | |4; | R1 = SIZE OF THE BLOCK TO ALLOCATE (IN BYTES) | ; | |#; | THE OUTPUT PARAMETERS ARE: | ; | |3; | C = 0 IF A BLOCK WAS SUCCESSFULLY ALLOCATED | *+; | R0 = ADDRESS OF THE ALLOCATED BLOCK |**; | R1 = LENGTH OF THE ALLOCATED BLOCK |/; | C = 1 IF NO BLOCK ISCURRENTLY AVAILABLE | ; | |C; +---------------------------------------------------------------+-& CALL $ALOCB ; TRY TO ALLOCATE BUFFER" BCS 40$ ; IF CS COULDN'T GET ONE .PAGEC; *****************************************************************( ; * *+; * COPY USER BUFFER TO INTERNAL BUFFER * ; * *C; ***************************************************************** / MOV R0,R4 ; SET ADDRESS OF DESTINATION BUFFERH( MOV R3,R5 ; SAVE ADDRESS OF I/O PACKET, MOV I.PRM+4(R5),R0 ; SET LENGTH OF TRANSFER0 MOV I.PRM+10(R5),R1 ; SET BIAS OF SOURCE BUFFER' MOV I.PRM+12(R5),R2 ; AND DISPLACEMENT - BIC #140000,R2 ; STRIP OFF APR6 ADDRESS BITSN% BIS #120000,R2 ; AND SUBSTITUTE APR5*> MOV R4,I.PRM+10(R5) ; SET INTERNAL BUFFER ADDRESS INTO PACKETC; +---------------------------------------------------------------+* ; | |,; | THE INPUT PARAMETERS FOR $BLXIO ARE: | ; | |%; | R0 = NUMBER OF BYTES TO MOVE |V ; | R1 = SOURCE APR 5 BIAS |!; | R2 = SOURCE DISPLACEMENT |H#; | R3 = DESTINATION APR6 BIAS |S&; | R4 = DESTINATION DISPLACEMENT | ; | |"; | THE OUTPUT PARAMETERS ARE | ; | |; | R0 ALTERED |0; | R1,R3 PRESERVED |7; | R2,R4 POINT TO LAST BYTE OF SOURCE/DESTINATION +1 |A ; | |C; +---------------------------------------------------------------+ ' CALL $BLXIO ; COPY TO INTERNAL BUFFER  .PAGEC; *****************************************************************C ; * *(; * CONVERT TO BUFFERED I/O REQUEST * ; * *C; ***************************************************************** * MOV R5,R3 ; COPY I/O PACKET ADDRESS BACKC; +---------------------------------------------------------------+R ; | |,; | THE INPUT PARAMETERS FOR $INIBF ARE: | ; | |/; | R3 = ADDRESS OF THE I/O PACKET TO BUFFER |- ; | |; | NO OUTPUT PARAMETERS. |F ; | |C; +---------------------------------------------------------------+' CALL $INIBF ; INITIALIZE BUFFERED I/OEC; ****************************************************************** ; * *; * QUEUE THE CLOCK BLOCK *O ; * *C; *****************************************************************-540$: MOV I.PRM+14(R3),R0 ; GET ADDRESS OF CLOCK BLOCKB2 MOV #CLKSRV,C.SUB(R0) ; SET ADDRESS OF SUBROUTINE CLR R1 ; HIGH ORDER DELTA TIME$ MOV I.PRM+6(R3),R2 ; LOW ORDER PART" MOV #C.SYST,R4 ; SET REQUEST TYPE. MOV R3,R5 ; USE PACKET ADDRESS AS IDENTIFIERC; +---------------------------------------------------------------+* ; | |,; | THE INPUT PARAMETERS FOR $CLINS ARE: | ; | |/; | R0 = ADDRESS OF THE CLOCK BLOCK TO QUEUE |**; | R1 = HIGH ORDER HALF OF DELTA TIME |); | R2 = LOW ORDER HALF OF DELTA TIME |D; | R4 = REQUEST TYPE |L4; | R5 = ADDRESS OF REQUESTING TASK OR IDENTIFIER | ; | |; | NO OUTPUT PARAMETERS. |O ; | |C; +---------------------------------------------------------------+A2 CALLR $CLINS ; QUEUE CLOCK BLOCK AND TEMPORARILY ; EXIT THE DRIVER- .PAGEC; *****************************************************************| ; * *); * C L O C K E N T R Y P O I N T *1 ; * *C; ***************************************************************** C; *****************************************************************T ; * *,; * CHECK TO SEE IF THE I/O WAS BUFFERED00è‚s)sn´cÚµcÛ¶c�·c›’ * ; * *C; *****************************************************************4CLKSRV: MOV C.TCB(R4),R5 ; GET ADDRESS OF I/O PACKET' TST I.PRM+16(R5) ; WAS IT BUFFERED I/O** BNE 50$ ; IF NE YES, GO QUEUE KERNEL ASTC; ***************************************************************** ; * *1; * COULDN'T BUFFER, PERFORM COPY HERE AND NOW ** ; * *C; ******************************************************************, MOV I.PRM+4(R5),R0 ; SET LENGTH TO TRANSFER, MOV I.PRM+10(R5),R1 ; BIAS OF SOURCE BUFFER. MOV I.PRM+12(R5),R2 ; DISPLEACEMENT OF SOURCE- BIC #140000,R2 ; STRIP OFF APR6 ADDRESS BITSS% BIS #120000,R2 ; AND CONVERT TO APR5 + MOV I.PRM(R5),R3 ; SET BIAS OF DESTINATIONU& MOV I.PRM+2(R5),R4 ; SET DISPLACEMENTC; +---------------------------------------------------------------+N ; | |,; | THE INPUT PARAMETERS FOR $BLXIO ARE: | ; | |%; | R0 = NUMBER OF BYTES TO MOVE |* ; | R1 = SOURCE APR 5 BIAS |!; | R2 = SOURCE DISPLACEMENT |M#; | R3 = DESTINATION APR6 BIAS |M&; | R4 = DESTINATION DISPLACEMENT | ; | |"; | THE OUTPUT PARAMETERS ARE | ; | |; | R0 ALTERED |A; | R1,R3 PRESERVED |7; | R2,R4 POINT TO LAST BYTE OF SOURCE/DESTINATION +1 |E ; | |C; +---------------------------------------------------------------+  CALL $BLXIO ; COPY BUFFERF1 MOV I.PRM+14(R5),R0 ; GET ADDRESS OF CLOCK BLOCKF+ MOV #C.LGTH,R1 ; GET LENGTH OF CLOCK BLOCKI .PAGEC; +---------------------------------------------------------------+ ; | |,; | THE INPUT PARAMETERS FOR $DEACB ARE: | ; | |+; | R0 = ADDRESS OF BLOCK TO DEALLOCATE |T*; | R1 = LENGTH OF BLOCK TO DEALLOCATE | ; | |; | NO OUTPUT PARAMETERS. |N ; | |C; +---------------------------------------------------------------+- CALL $DEACB ; DEALLOCATE ITB, MOV R5,R3 ; COPY PACKET ADDRESS FOR $IODON0BMSUC: MOV #IS.SUC&377,R0 ; SET FINAL I/O STATUS8 MOV I.PRM+4(R3),R1 ; AND LENGTH OF TRANSFER = REQUESTED3BMDON: MOV I.UCB(R3),R5 ; GET UCB ADDRESS OF DEVICENC; +---------------------------------------------------------------+L ; | |,; | THE INPUT PARAMETERS FOR $IODON ARE: | ; | |,; | R0 = FIRST WORD OF I/O STATUS BLOCK |,; | R1 = SECOND WORD OF I/O STATUS BLOCK |,; | R2 = STARTING AND FINAL RETRY COUNTS |); | (IF AN ERROR LOGGING DEVICE) |C,; | R5 = UCB ADDRESS OF UNIT TO COMPLETE | ; | |#; | THE OUTPUT PARAMETERS ARE: |N ; | |; | R4 IS DESTROYED | ; | |C; +---------------------------------------------------------------+- CALL $IODON ; COMPLETE THE I/O" BR BMIN1 ; GO LOOK FOR MORE WORK .PAGEC; ***************************************************************** ; * *1; * BUFFERED I/O, CONVERT I/O PACKET TO KERNEL *N!; * AST AND EXIT FROM DRIVER * ; * *C; *****************************************************************550$: MOV R4,R3 ; COPY CLOCK BLOCK ADDRESS FOR $REQUE ( MOV I.TCB(R5),R0 ; POINT TO TCB OF TASK TST (R4)+ ; SKIP LINK WORD% MOV #AK.GBI,(R4)+ ; SET A.CBL=AK.GBI-3 MOV KISAR5,(R4)+ ; SET APR BIAS OF SERVICE ROUTINE 6 MOV #KATSRV,(R4)+ ; SET ADDRESS OF PROCESSING ROUTINE6 MOV R5,(R4)+ ; SAVE I/O PACKET ADDRESS IN CLOCK BLOCKC; +---------------------------------------------------------------+X ; | |,; | THE INPUT PARAMETERS FOR $REQUE ARE: | ; | |.; | R0 = TCB ADDRESS TO QUEUE AST BLOCK TO |+; | R3 = ADDRESS OF THE PACKET TO QUEUE |V ; | |; | NO OUTPUT PARAMETERS. |+ ; | |C; +---------------------------------------------------------------+ " CALLR $REQUE ; QUEUE AST TO TASK .PAGEC; ***************************************************************** ; * *2; * K E R N E L A S T E N T R Y P O I N T * ; * *C; *****************************************************************:C; ***************************************************************** ; * *6; * GET PCB ADDRESS AND SEE IF PARTI00èŠs sßmæàmçámýfáþfDATATION IS RESIDENT * ; * *C; *****************************************************************-.KATSRV: MOV 10(R3),R5 ; GET I/O PACKET ADDRESS7 MOV I.PRM+16(R5),R1 ; GET PCB ADDRESS OF BUFFER REGION*- BEQ 70$ ; IF EQ THERE IS NO COPY TO PERFORM C; +---------------------------------------------------------------+* ; | |,; | THE INPUT PARAMETERS FOR $TSPAR ARE: | ; | |7; | R0 = ADDRESS OF THE PACKET (THE KERNEL AST BLOCK) |7; | R1 = PCB ADDRESS OF THE PCB CONTAINING THE BUFFER | +; | R5 = TCB ADDRESS OF ASSOCIATED TASK |* ; | |"; | THE OUTPUT PARAMETERS ARE | ; | |6; | C = 0 IF REGION IS RESIDENT AND CAN BE ACCESSED |2; | C = 1 IF REGION IS NOT RESIDENT AND AST HAS |; | BEEN QUEUED |R ; | |C; +---------------------------------------------------------------+ " CALL $TSPAR ; REGION IN MEMORY ?" BCC 60$ ; IF CC REGION IN MEMORYC; *****************************************************************O ; * *6; * A REGION AST WAS QUEUED. BUMP BUFFERED I/O COUNT *7; * BACK UP TO FORCE I/O RUNDOWN IN CASE OF ABORT AND * "; * EXIT AST SERVICE ROUTINE. * ; * *C; *****************************************************************A# MOV I.TCB(R5),R0 ; GET TCB ADDRESS ) INCB T.TIO(R0) ; BUMP BUFFERED I/O COUNT-$ RETURN ; EXIT AST SERVICE ROUTINE .PAGEC; ****************************************************************** ; * *&; * PERFORM BUFFER COPY OPERATION * ; * *C; ***************************************************************** /60$: MOV I.TCB(R5),R0 ; GET TCB ADDRESS OF TASK / INCB T.IOC(R0) ; ADJUST REAL I/O COUNT UPWARDS ( MOV I.PRM+4(R5),R0 ; GET COUNT OF BYTES0 MOV I.PRM+10(R5),R2 ; SET SOURCE BUFFER ADDRESS2 MOV P.REL(R1),R3 ; GET STARTING BIAS OF PARTITION% ADD I.PRM(R5),R3 ; AND ADD IN OFFSETI& MOV I.PRM+2(R5),R4 ; SET DISPLACEMENTC; +---------------------------------------------------------------+F ; | |,; | THE INPUT PARAMETERS FOR $BLXIO ARE: | ; | |%; | R0 = NUMBER OF BYTES TO MOVE | ; | R1 = SOURCE APR 5 BIAS |!; | R2 = SOURCE DISPLACEMENT | #; | R3 = DESTINATION APR6 BIAS |V&; | R4 = DESTINATION DISPLACEMENT | ; | |"; | THE OUTPUT PARAMETERS ARE | ; | |; | R0 ALTERED |F; | R1,R3 PRESERVED |7; | R2,R4 POINT TO LAST BYTE OF SOURCE/DESTINATION +1 |E ; | |C; +---------------------------------------------------------------+  CALL $BLXIO ; COPY THE BUFFERR/ MOV I.PRM+10(R5),R0 ; GET BUFFER ADDRESS AGAINF* MOV I.PRM+4(R5),R1 ; GET LENGTH OF BUFFERC; +---------------------------------------------------------------+R ; | |,; | THE INPUT PARAMETERS FOR $DEACB ARE: | ; | |+; | R0 = ADDRESS OF BLOCK TO DEALLOCATE | *; | R1 = LENGTH OF BLOCK TO DEALLOCATE | ; | |; | NO OUTPUT PARAMETERS. |S ; | |C; +---------------------------------------------------------------+- CALL $DEACB ; DEALLOCATE IT  .PAGEC; *****************************************************************M ; * *6; * IF THIS WASN'T A REGION LOAD AST, FINISH THE I/O * ; * *C; *****************************************************************C570$: MOV I.PRM+14(R5),R0 ; RETRIEVE AST BLOCK ADDRESSA) TST (R0) ; WAS THIS A REGION LOAD AST ?E BNE 80$ ; IF NE YES + MOV #C.LGTH,R1 ; SET LENGTH OF CLOCK BLOCK C; +---------------------------------------------------------------+- ; | |,; | THE INPUT PARAMETERS FOR $DEACB ARE: | ; | |+; | R0 = ADDRESS OF BLOCK TO DEALLOCATE | *; | R1 = LENGTH OF BLOCK TO DEALLOCATE | ; | |; | NO OUTPUT PARAMETERS. |* ; | |C; +---------------------------------------------------------------+;' CALL $DEACB ; DEALLOCATE CLOCK BLOCK W< MOV I.IOSB(R5),R3 ; GET VIRTUAL ADDRESS OF I/O STATUS BLOCK2 MOV #IS.SUC&377,-(SP) ; SET FIRST I/O STATUS WORD5 MTPD$ (R3)+ ; WRITE FIRST WORD OF STATUS (MAY TRAP)-6 MOV I.PRM+4(R5),-(SP) ; SET SECOND WORD OF I/O STATUS+ MTPD$ (R3) ; W00è’sé—sn´cÚµcÛ¶c�·c›’RITE SECOND WORD (MAY TRAP)C8 CLR I.IOSB(R5) ; PREVENT $IODON ATTEMPT TO WRITE STATUS% MOV R5,R3 ; COPY I/O PACKET ADDRESSA# JMP BMSUC ; FINISH IN COMMON CODE-C; *****************************************************************D ; * */; * RECONVERT REGION LOAD AST TO A TASK AST *U ; * *C; *****************************************************************$80$: MOV R0,R3 ; COPY BLOCK ADDRESS+ CLR 10(R0) ; INDICATE NO BUFFER NEXT TIMES# MOV I.TCB(R5),R0 ; GET TCB ADDRESS C; +---------------------------------------------------------------+M ; | |,; | THE INPUT PARAMETERS FOR $REQUE ARE: | ; | |.; | R0 = TCB ADDRESS TO QUEUE AST BLOCK TO |+; | R3 = ADDRESS OF THE PACKET TO QUEUE |D ; | |; | NO OUTPUT PARAMETERS. |O ; | |C; +---------------------------------------------------------------+*7 CALLR $REQUE ; RE-QUEUE TASK AST AND EXIT AST SERVICEC .PAGEC; ***************************************************************** ; * *#; * MISCELLANEOUS ENTRY POINTS *- ; * *C; ***************************************************************** C; *****************************************************************D ; * *+; * C A N C E L E N T R Y P O I N T *U ; * *7; * WE COULD DEQUEUE PENDING CLOCK REQUEST, ETC HERE, *-4; * BUT WE DON'T, WE JUST LET THEM COMPLETE LATER * ; * *C; ******************************************************************BMCAN:C; ***************************************************************** ; * *-; * T I M E O U T E N T R Y P O I N T ** ; * *9; * SINCE THERE'S NO PHYSICAL DEVICE TO TIME OUT, NO-OP ** ; * *C; *****************************************************************UBMOUT:C; ***************************************************************** ; * *0; * P O W E R F A I L E N T R Y P O I N T * ; * *4; * POWERFAIL DOESN'T AFFECT NON-EXISTENT DEVICES * ; * *C; ***************************************************************** BMPWF:C; ***************************************************************** ; * *9; * S T A T U S C H A N G E E N T R Y P O I N T S ** ; * *7; * DON'T NEED TO TOUCH NON-EXISTENT DEVICE, JUST LET *$; * EXEC PUT DEVICE ON/OFF LINE * ; * *C; ***************************************************************** BMKRB:BMUCB:' RETURN ; ALL THESE ARE NO-OP FOR NOWE .ENDECES * ; * *C; ****************/ .TITLE BMTAB - DATA BASE FOR BLOCK MOVE DRIVER .IDENT /01/;O"; COPYRIGHT (c) 1981, 1982 BY(; DIGITAL EQUIPMENT CORPORATION, MAYNARD'; MASSACHUSETTS. ALL RIGHTS RESERVED.*; A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED*A; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE*A; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISCA; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OREA; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO ANDA2; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; A; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTAA; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;SA; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFM<; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.;R; VERSION: 01.00; DATE: 1-APR-82Y; AUTHOR: MARIO DENOBILIY;T4; LOADABLE DATA BASE FOR EXAMPLE BUFFERED I/O DRIVER;R; MACRO LIBRARY CALLSN; .MCALL CLKDF$ .MCALL HWDDF$ .MCALL SCBDF$ . .MCALL UCBDF$ T% CLKDF$ ;DEFINE CLOCK BLOCK OFFSETSA$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ SCBDF$ ,,SYSDEF ;DEFINE SCB OFFSETS UCBDF$ ;DEFINE UCB OFFSETS $BMDAT:: .PAGE;R; BM DCB;H $BMTBL=0 ;LOADABLE BMDRV $BMDCB:: .WORD 0 ; D.LNK  .WORD .BM0 ; D.UCB .ASCII /BM/ ; D.NAM  .BYTE 0,1-1 ; D.UNIT,D.UNIT+1R .WORD BMND-BMST ; D.UCBLE .WORD $BMTBL ; D.DSP ; D.MSK - FUNCTION MAS00éšsêœsßmæàmçámýfáþfDATAKS/ .WORD 33 ; LEGAL 0-17 IO.KIL,IO.WLB,IO.ATTD ; IO.DET/ .WORD 31 ; CONTROL 0-17 IO.KIL,IO.ATT,IO.DETT .WORD 0 ; NOOP 0-17A .WORD 0 ; ACP 0-17D .WORD 4 ; LEGAL 20-37 IO.WVB .WORD 0 ; CONTROL 20-37B .WORD 0 ; NOOP 20-37  .WORD 0 ; ACP 20-37L .WORD 0 ; D.PCBB .PAGE;.; BM UCB'S;O PR0=0BMST=. .IF DF M$$MUP .WORD 0 .ENDC.BM0:: .WORD $BMDCB ; U.DCB .WORD .-2 ; U.RED$ .BYTE UC.QUE,0 ; U.CTL,U.STSU .BYTE 0,US.OFL ; U.UNIT,U.ST2 .WORD DV.REC ; U.CW1 .WORD 0 ; U.CW2  .WORD 0 ; U.CW3O .WORD 72. ; U.CW47 .WORD $BM0 ; U.SCB  .WORD 0 ; U.ATT  .WORD 0,0 ; U.BUF,U.BUF+20 .WORD 0 ; U.CNTEBMND=.;W; BM SCB'S;O$BM0:: .WORD 0,.-2 ; S.LHD0 .WORD 0,0,0,0 ; S.FRK  .WORD 0 ; S.KS5  .WORD 0 ; S.PKT .BYTE 0,0 ; S.CTM,S.ITM0 .BYTE 0,0 ; S.STS,S.ST3M .WORD 0 ; S.ST2C. .WORD 0 ; S.KRB - NO KRB SINCE NO CONTROLLER$BMEND:: E .END,0 ; U.CTL,U.STSU .BYTE 0 .TITLE CLOCK .NLIST BEX; CONDITIONAL ASSEMBLY CONTROLS8 .IF NDF POT ; ONLY ACCEPT THE FOLLOWING DEFINITIONS IF- ; THE SYMBOL POT IS UNDEFINED. IF POT IS- ; ALREADY DEFINED, THE FILE CLOCK.MAC HAS) ; BEEN ASSEMBLED WITH THE PREFIX FILE+ ; CLKPRE.MAC, THE OUTPUT OF THE CLKGEN  ; PROCEDURE.G; THE FOLLOWING SYMBOLS ALLOW YOU TO TAILOR THE PROGRAM TO YOUR SYSTEM.6POT = 1 ; PARENT-OFFSPRING TASKING (SPWN$ DIRECTIVE)( ; 1 IF SUPPORTED, 0 IF NOT SUPPORTED. ; PARENT-OFFSRPING TASKING IS SUPPORTED IN+ ; MOST M-PLUS AND M 3.2 SYSTEMS, BUT ISN) ; NOT AVAILABLE IN EARLIER M SYSTEMS. 5 .IF GT POT ; IF SPWN$ NOT SUPPORTED, YOU CAN'T HAVE  ; RMD OR DCL7RMDSPT = 1 ; RMD (SYSTEM DISPLAY) - 1 IF SUPPORTED, 03 ; IF NOT SUPPORTED. FOR THIS FUNCTION TO WORK,R* ; THE TASK MUST BE INSTALLED AS ...RMD6DCLSPT = 1 ; DCL SUPPORT - 1 IF SUPPORTED, 0 IF NOT.. ; DCL IS SUPPORTED IN MOST M-PLUS SYSTEMS,! ; NOT AVAILABLE ON M SYSTEMS./ .IFF ; IF NO PARENT-OFFSPRING TASKING, FORCE  ; RMDSPT AND DCLSPT TO 0 RMDSPT = 0 DCLSPT = 0 .ENDC*INITX = 11. ;INITIAL HORIZONTAL POSITION'INITY = 3. ;INITIAL VERTICAL POSITIONM .ENABL LC FORCHR = 'aR .DSABL LC2 .ENDC ; END OF COND. BLOCK THAT DEFINES DEFAULT% ; VALUES IF PREFIX FILE NOT USED. - .MCALL EXIT$S,DIR$,QIOW$,GTIM$S,QIOW$C,QIO$C;6 .MCALL WTSE$S,MRKT$S,ASTX$S,QIO$,SETF$S,CMKT$S,CLEF$S .MCALL QIOW$S,DRERR$ .IF GT POT  .MCALL SPWN$S .ENDC ; DEFINITIONS 9 .MACRO PRINT A,B ;MACRO TO PRINT LENGTH B FROM ADDRESS AL MOV A,OUTDPB+Q.IOPL ;ADDRESS0 MOV B,OUTDPB+Q.IOPL+2 ;LENGTH DIR$ #OUTDPB ;EXECUTE THE QIO  .ENDM@ .MACRO PRINCR A,B ;MACRO TO PRINT AS ABOVE, EXCEPT NO CAR. RET.= MOV #053,OUTDPB+Q.IOPL+4 ;VERTICAL FORMAT CODE FOR OVERPRINTS PRINT A,B8 MOV #040,OUTDPB+Q.IOPL+4 ;RESTORE NORMAL FORMAT CONTROL .ENDM; .MACRO IOFNCT FUNC ;MACRO TO DO A PARTICULAR I/O FUNCTION ? MOV OUTDPB+Q.IOFN,-(SP) ;PUSH CURRENT I/O FUNCTION CODE TO STKI> MOV #FUNC,OUTDPB+Q.IOFN ;PLACE FUNCTION CODE IN FUNCTION WORD DIR$ #OUTDPB ;DO THE FUNCTION/ MOV (SP)+,OUTDPB+Q.IOFN ;RESTORE PREVIOUS CODE; .ENDM+NUMCOM = 7. ;NUMBER OF AVAILABLE COMMANDSO/ .IF GT POT ;TEST FOR PARENT-OFFSPRING TASKINGU3NUMCOM = NUMCOM+1 ;IF AVAILABLE, YOU GET M COMMANDP% .IF GT RMDSPT ;TEST FOR RMD SUPPORTS3NUMCOM = NUMCOM+1 ;IF AVAILABLE, YOU GET S COMMANDF .ENDC% .IF GT DCLSPT ;TEST FOR DCL SUPPORTM3NUMCOM = NUMCOM+1 ;IF AVAILABLE, YOU GET D COMMANDE .ENDC .ENDC.HOURS = TIMEIN+G.TIHR ;POINTER TO HOURS FIELD/MINS = TIMEIN+G.TIMI ;POINTER TO MINUTES FIELDP/SECS = TIMEIN+G.TISC ;POINTER TO SECONDS FIELD7XPOS = OUTDPB+Q.IOPL+4 ;POINTER TO VERT. CURSOR CONTROL 8YPOS = OUTDPB+Q.IOPL+5 ;POINTER TO HORIZ. CURSOR CONTROL .PAGE1; CONTROL AREA. EVERYTHING ELSE COMES FROM HERE.M6CLOCK: QIOW$C SF.GMC,5,2,,,, ;GET TERM. TYPE$ CMPB TYPBUF+1,#T.VT52 ;IS IT A VT52+ BEQ 10$ ;YES, GIVE IT AN ESCAPE SEQUENCEB% CMPB TYPBUF+1,#T.V10000ê¢s—sn´cÚµcÛ¶c�·c›’ ;IS IT A VT100+ BEQ 10$ ;YES, GIVE IT AN ESCAPE SEQUENCEE$ BR UNDTRM ;NO, NEITHER ONE - EXIT010$: DIR$ #SMCDPB ;DECLARE TERMINAL CAPABLE OF! ;GENERATING ESCAPE SEQUENCESO+ IOFNCT IO.ATT!TF.ESQ ;ATTACH THE TERMINAL=0 PRINT #WHORU,#2 ;ASK TERMINAL TO IDENTIFY TYPE; QIOW$C IO.RLB,5,2,,,, ;READ THE ESCAPE SEQUENCEM% IOFNCT IO.DET ;DETACH THE TERMINALU4 CLRB TCBUF+1 ;PREPARE TO DISABLE ESCAPE SEQUENCES6 DIR$ #SMCDPB ;DISABLE RECOGNITION OF ESC. SEQUENCES/ MOVB #TC.TTP,TCBUF ;PREPARE TO SET TERM. TYPEE6 CMPB IOBUF+1,#'[ ;CHECK SECOND CHARACTER OF SEQUENCE( BEQ VT100 ;IF A BRACKET, IT'S A VT100 CMPB IOBUF+1,#'/ ;CHECK AGAINA BEQ VT52 ;IF A SLASH, A VT5XO@UNDTRM: PRINT #TERROR,#TERRL ;OTHERWISE, NOT A DEFINED TERMINAL( EXIT$S ;PRINT ERROR MESSAGE AND EXIT6VT100: INCB TTTYP ;POSITIVE VALUE IN TTTYP FOR VT100: MOVB #T.V100,TCBUF+1 ;PREPARE TO SET TERM TO VT100 IN SW" BR DSPINI ;PROCEED WITH DISPLAY:VT52: CMPB IOBUF+2,#'K ;CHECK THIRD CHARACTER OF SEQUENCE3 BLT UNDTRM ;IF K OR HIGHER, A VT52; OTHERWISE NO : MOVB #T.VT52,TCBUF+1 ;PREPARE TO SET TERM. TO VT52 IN SW6DSPINI: DIR$ #SMCDPB ;SET TERM. PROPERLY IN SOFTWARE4 CALL CHRALT ; MOVE DISPLAY CHARACTER INTO STORAGE8 CALL REFRSH ;JUMP DIRECTLY TO REFRESH ROUTINE (DEFAULT ;INITIAL ACTION)JINCMND: QIOW$C IO.RVB,5,2,,IOSB,, ;WAIT FOR A COMMAND CHARACTER $TSTFLG: CLEF$S #2 ;CLEAR FLAG NO. 2 TST $DSW ;WAS FLAG SET?S7 BEQ INCMND ;IF NOT, GO BACK AND WAIT FOR IT TO BE SETE/ ; (THREE LINES ABOVE FIX BUG THAT OCCURS IFH0 ; MARK TIME ELAPSES AND SETS FLAG WHILE PRO-0 ; CESSING IS GOING ON, AND THE QIO TURNS OFF ; THE FLAG AGAIN.). MOV COMBUF,R1 ;GET COMMAND CHARACTER INTO R1 * BNE 1$ ;IF CHARACTER PRESENT, PROCESS IT= CMPB IOSB,#IE.EOF ;IF NO CHARACTER PRESENT, CHECK FOR CTRL/ZI2 BNE INCMND ;IF NOT CTRL/Z, WAIT FOR NEXT COMMAND JMP EXIT ;IF CTRL/Z, EXITL:1$: CLR COMBUF ;ERASE CHARACTER FROM BUFFER FOR NEXT TIME- CMP R1,#140 ;CHECK FOR LOWER-CASE CHARACTER ! BLE 2$ ;NOT LOWER-CASE; PROCEEDU6 SUB #40,R1 ;POTENTIALLY LOWER-CASE; CONVERT TO UPPERC2$: MOV #NUMCOM-1,R0 ;SCAN COMMANDS. NUMBER OF AVAIL. COMS. INTO R0A(5$: CMPB R1,COMNAM(R0) ;BE THIS THE ONE? BEQ 7$ ;YES, GO MAKE YOUR JUMP DEC R0 ;NO, TRY THE NEXT ONE! BGE 5$ ; IF THERE IS A NEXT ONEC CALL ILLCOM ;IF NOT, TELL USER& BR TSTFLG ; AND WAIT FOR NEXT ACTION!7$: ASL R0 ;MAKE R0 A WORD INDEXO: JSR PC,@COMADR(R0) ;GO OFF AND DO WHAT YOU'RE SUPPOSED TO% BR TSTFLG ;NOW WAIT FOR NEXT ACTIONB .PAGE); COMMAND PROCESSOR SUBROUTINES, ACCESSEDE;; WITH AN INDEXED JUMP TO SUBROUTINE FROM THE CONTROL AREA.C@; TIME DISPLAY ROUTINE. ENTER WITH DIFPOS=-1 FOR NORMAL UPDATE,/; DIFPOS=0 TO FORCE COMPLETE REFRESH OF DISPLAYUA; THE FOLLOWING CODE GETS THE CURRENT TIME IN BUFFER TIMEIN, THENC=; CALCULATES THE TIME TO THE NEXT REGUALR UPDATE AND ISSUES AN0; MARK TIME REQUEST, SPECIFYING A MART-TIME AST.9UPDATE: IOFNCT IO.KIL ;KILL ANY OUTSTANDING I/O REQUESTS 3 GTIM$S #TIMEIN ;GET CURRENT TIME IN BUFFER TIMEIN * NEG SECS ;NEGATE SECONDS FIELD OF TIMEIN= ADD #60.,SECS ; AND ADD 60 TO YIELD TIME TO NEXT MIN. CHANGES4 CMKT$S ;CANCEL ANY OUTSTANDING MARK-TIME REQUESTS5 MRKT$S ,SECS,#2,#TIMAST ;DO AN AST WHEN TIME CHANGES ?; FOLLOWING CODE CONVERTS BINARY TIME IN TIMEIN TO DECIMAL TIME A; IN TIME. IT ALSO CHECKS EACH DIGIT AND SETS DIFPOS TO THE FIRSTKF; DIGIT THAT IS DIFFERENT. NOTE THAT DIFPOS MUST BE NEGATIVE ENTERINGD; THIS ROUTINE FOR SCAN TO WORK. IF DIFPOS IS 0, ALL DIGITS OF TIME2; ARE UNCONDITIONALLY UPDATED (HANDY FOR REFRESH).0 MOV #HOURS,R2 ;ADDRESS OF HOURS FIELD OF TIMEIN! TST MODE ;12- OR 24-HOUR CLOCK?N3 BGT 10$ ;IF POS., 24-HOUR CLOCK; SKIP SUBTRACTION,! CMP (R2),#12. ;CHECK IF AM OR PMN BLE 10$ ;IF AM, PRINT AS IST/ SUB #12.,(R2) ;IF PM, CONVERT TO 12-HOUR CLOCKM010$: CLR R1 ;R1 KEEPS TRACK OF POSITION IN TIME+20$: CLR R0 ;R0 IS COUNTER FOR DECIMALIZERA 30$: INC R0 1 SUB #10.,(R2) ;TAKE AWAY TEN FROM TIME PARAMETERR) BGE 30$ ;IF NOT NE00êªsœsßmæàmçámýfáþfDATAGATIVE, TAKE TEN MORER4 DEC R0 ;TOOK TEN TOO MANY, DEC R0 FOR CORRECT TENS7 CALL DIFF ;SEE IF THIS DIGIT DIFFERENT FROM LAST TIME;. MOV (R2),R0 ;GET REMAINDER AFTER SUBTRACTION* ADD #10.,R0 ;ADD TEN TO GET CORRECT ONES# INC R1 ;BUMP THE POSITION COUNTERM7 CALL DIFF ;SEE IF THIS DIGIT DIFFERENT FROM LAST TIME & CMP R1,#4 ;DONE WITH CONVERSION YET?- BGE 40$ ;YES, GO DO SETUP FOR PRINT ROUTINEO) INC R1 ;NO. BUMP R1 PAST COLON TO HOURS) INC R1A/ TST (R2)+ ;BUMP R2 TO MINUTES FIELD OF TIMEINA BR 20$ ;NOW GO DO MINUTES 040$: TST DIFPOS ;WERE THERE ANY NEW CHARACTERS?! BLT DONE ;NO; SUPPRESS PRINTINGF) IOFNCT IO.ATT ;YES. ATTACH THE TERMINALR# CALL GRAFIC ;INVOKE GRAPHICS MODEDD; THE FOLLOWING CODE SCANS THE BUFFER TIME FROM DIFPOS, THE POSITIONB; OF THE FIRST DIGIT THAT IS DIFFERENT FROM BEFORE. IT CONSTRUCTSD; AN OUTPUT BUFFER WITH THE ELEMENTS OF EACH CHARACTER THAT IS TO BEC; OUTPUT TO THE TERMINAL, THEN PRINTS THE BUFFER. IF DOES THIS TENM+; TIMES, ONCE FOR EACH LINE OF THE DISPLAY.O?; THIS ROUTINE USES REGISTERS R0-R4 THROUGHOUT, AND R5 BRIEFLY.?$SCAN: MOV #9.,R4 ;SET UP LINE COUNT? MOVB #INITY,YPOS ;INITIALIZE CURSOR POSITIONER VERT. COMPONENTR810$: MOV DIFPOS,R3 ;GET POSITION OF FIRST DIGIT TO PRINTD MOVB CHRPOS(R3),XPOS ;GET HORIZONTAL CURSOR POSITION OF FIRST DIGIT% MOV #IOBUF,R2 ;ADDRESS OF I/O BUFFERUC20$: MOVB LINOFF(R4),R1 ;GET OFFSET INTO DATA BASE CORRESPONDING TOH ; THE CURRENT LINE NUMBERF1 MOV #10.,R0 ;SET UP COUNT OF CHARACTERS TO MOVE ) CMP R3,#2 ;ARE WE ABOUT TO DO THE COLONI BNE 30$ ;NO, ITS A NUMERAL. ASR R1 ;YES, COLON. CUT OFFSET VALUE IN HALF1 ADD #COLON,R1 ;ADD IN ADDRESS OF COLON DATA BASE % ASR R0 ;CUT CHARACTER COUNT IN HALFE! BR 40$ ;GO MOVE COLON TO BUFFER130$: MOVB TIME(R3),R5 ;GET VALUE OF CURRENT DIGITO: BNE 35$ ;IF DIGIT NONZERO, DO NOT CHECK FOR LEADING ZERO- TST R3 ;IF DIGIT ZERO, IS IT IN POSITION 0?E BNE 35$ ;NO, PRINT IT = MOV #COLON,R1 ;YES, SUPPRESS IT. HANDY STRING OF 10 SPACES.T BR 40$ ;GO MOVE IN THE SPACES (35$: ASL R5 ;MAKE DIGIT INTO WORD INDEXB ADD NUMADD(R5),R1 ;ADD ADDRESS OF DIGIT'S DATA BASE TO LINE OFST.D40$: MOVB (R1)+,(R2)+ ;MOVE CHARACTER FROM DATA BASE TO PRINT BUFFER DEC R0 ;DONE YET? # BGT 40$ ;NO, DO ANOTHER CHARACTER % INC R3 ;BUMP DIGIT POSITION COUNTERO! CMP R3,#5 ;DONE WITH THIS LINE?O# BLT 20$ ;NO, DO ANOTHER CHARACTERF= SUB #IOBUF,R2 ;YES. CALCULATE THE LENGTH OF THE PRINT BUFFERM% PRINT #IOBUF,R2 ; AND PRINT THE LINES& INCB YPOS ;MOVE CURSOR DOWN ONE LINE" DEC R4 ;DECREMENT THE LINE COUNT& BGE 10$ ;IF MORE LINES, PROCESS THEM1 MOVB #1,XPOS ;DONE. RESET CURSOR TO LEFT MARGIN0& PRINT #NULL,#1 ;REPOSITION THE CURSOR" CALL ALPHA ;RETURN TO ALPHA MODE5DONE: MOV #-1,DIFPOS ;INITIALIZE DIFPOS FOR NEXT TIMEC$ IOFNCT IO.DET ;DETACH THE TERMINAL3 RETURN ;GO BACK AND WAIT FOR SOMETHING TO HAPPENN"; EXIT ROUTINE (THIS IS A TOUGHIE)"EXIT: CALL WIPE ;CLEAR THE SCREEN EXIT$SI"; ILLEGAL COMMAND NOTIFIER ROUTINE+ILLCOM: IOFNCT IO.ATT ;ATTACH THE TERMINAL;3 MOVB #INITY+10.,YPOS ;SET UP VERT. CURSOR POSITIONR- MOVB #1,XPOS ;SET UP HORIZ. CURSOR POSITIONT TSTB TTTYP ;CHECK FOR VT100 + BEQ 10$ ;NOT A VT100 - JUST PRINT MESSAGET0 PRINT #BB100,#BB100L ;TURN ON BOLD AND BLINKING)10$: PRINT #ILLMES,#ILLMEL ;PRINT MESSAGE # MOVB #INITY+10.,YPOS ;RESET CURSORW TSTB TTTYP ;A VT100P# BEQ 20$ ;NO, JUST POSITION CURSORG. PRINT #BBOFF,#BBOFFL ;TURN OFF BOLD AND BLINK* BR 30$ ;NOT NECESSARY TO POSITION CURSOR/20$: PRINT #NULL,#1 ;REPOSITION CURSOR TO STARTM.30$: IOFNCT IO.DET ;DONE. DETACH THE TERMINAL% RETURN ;RETURN FOR ANOTHER COMMANDR; REFRESH ROUTINEY5REFRSH: CLR DIFPOS ;FORCE COMPLETE UPDATE OF DISPLAY  CALL WIPE ;CLEAR SCREEN1& CALL UPDATE ;AND GO FILL IN THE TIME RETURNS ; CLEAR BOTTOM OF SCREEN ROUTINE0CLEAR: ;SUBROUTINE TO CLEAR BOTTOM OF SCREEN4 MOVB #INITY+10.,YPOS ;SET UP VERT. CURSOR POSITION. MOVB #1,XPOS ;SET UP HORIZ. CURSOR POSITION! PRINT #NULL,#1 ;POSITION CURSORI% CALL ERASE 00ê²s—sn´cÚµcÛ¶c�·c›’;ERASE TO END-OF-SCREENM RETURN ; SET 24-HOUR CLOCK MODE ROUTINE1MODE24: INC MODE ;MAKE CLOCK MODE WORD POSITIVES' CALL CLEAR ;DELETE THE COMMAND CHAR.C* CALL UPDATE ;REFRESH CLOCK IF NECESSARY RETURN1 ; SET 12-HOUR CLOCK MODE ROUTINE)MODE12: CLR MODE ;CLEAR CLOCK MODE WORDU' CALL CLEAR ;DELETE THE COMMAND CHAR.O* CALL UPDATE ;REFRESH CLOCK IF NECESSARY RETURNC@; SPAWN A TASK, WAIT FOR COMPLETION OF TASK, AND RETURN TO CLOCK8 .IF GT POT ;CANT HAVE ANY OF THIS IF PARENT-OFFSPRING ;TASKING ISNT AVAILABLE& .IF GT RMDSPT ;TEST FOR RMD SUPPORT6SPNRMD: MOV #MCRNAM,R0 ;PUT ADDRESS OF MCR NAME IN R02 MOV #RMDNAM,R1 ;PUT ADDRESS OF RMD COMMAND IN R1- MOV #3,R2 ;PUT LENGTH OF RMD COMMAND IN R2  BR SPAWN ;GO SPAWN RMDEMO .ENDC6SPNMCR: MOV #MCRNAM,R0 ;PUT ADDRESS OF MCR NAME IN R01 MOV #MCRPRM,R3 ;PUT ADDRESS OF MCR PROMPT IN R3T' BR PRMPTR ;SKIP TO PROMPTING SECTIONO& .IF GT DCLSPT ;TEST FOR DCL SUPPORT6SPNDCL: MOV #DCLNAM,R0 ;PUT ADDRESS OF DCL NAME IN R01 MOV #DCLPRM,R3 ;PUT ADDRESS OF DCL PROMPT IN R3R .ENDC;PRMPTR: MOV #IOBUF,R1 ;PUT ADDRESS OF CLI INPUT BUF. IN R1M CALL WIPE ;CLEAN THE SCREEN:GETCOM: QIOW$S #IO.RPR,#5,#1,,#IOSB,,) ;OUTPUT A PROMPT AND WAIT FOR A LINEC1 MOV IOSB+2,R2 ;GET NUMBER OF CHARACTERS READ INE0 BEQ SPNDON ;IF NO CHARACTERS, RETURN TO CLOCK?SPAWN: SPWN$S R0,,,,,#4,,,R1,R2, ;SPAWN TASK; SET EFN 4 ON EXITS* BCC 10$ ;IF DIRECTIVE OK, WAIT FOR EXIT* CMP $DSW,#IE.INS ;IS TASK NOT INSTALLED?, BNE SPNDON ;NO, FUNKIER THAN THAT - QUIT.; PRINT #NOTASK,#NOTASL ;PRINT "TASK NOT INSTALLED" MESSAGET, BR NOFRSH ;LEAVE SPAWN WITHOUT REFRESHING'10$: WTSE$S #4 ;WAIT FOR TASK TO EXIT#0 CMP R1,#IOBUF ;IF R1=#IOBUF, CALL WAS TO A CLI' BEQ GETCOM ;GO OUTPUT ANOTHER PROMPTF0SPNDON: CALL REFRSH ;REFRESH THE CLOCK DISPLAYNOFRSH: RETURN) .ENDC ;END OF COND. BLOCK GOVERNED BY + ;PARENT-OFFSPRING TASKING AVAILABILITYC*ALTER: ;ALTERS DISPLAY CHARACTERISTICS CALL WIPE ;CLEAR SCREEN3 MOV #40,XPOS ;SET UP NORMAL CURSOR CURSOR CONTROLK9 PRINT #ALTMES,#ALTMSL ;TELL ABOUT ALTERATIONS AVAILABLE < PRINT #ATOZ,#ATOZL ;PRINT ALPHABET AND INVOKE GRAPHIC MODE% CALL GRAFIC ;SHIFT TO GRAPHIC MODEO, PRINT #ATOZ,#ATOZL ;PRINT GRAPHIC ALPHABET# CALL ALPHA ;RETURN TO ALPHA MODESD10$: QIOW$S #IO.RPR,#5,#1,,#IOSB,,<#IOBUF,#79.,,#YRCHS,#YRCHSL,#044>* ;ASK FOR CHARACTER AND WAIT FOR REPLY, DEC IOSB+2 ;HOW MANY CHARACTERS SUPPLIED?& BLT 20$ ;IF NONE, NO CHANGE; RETURN- BEQ 15$ ;IF ONE, USE IT TO CHANGE DATABASES8 PRINT #TUMANY,#TUMANL ;IF MORE THAN ONE, ERROR MESSAGE BR 10$ ;TRY AGAIN615$: MOVB IOBUF,DSPCHR ;MOVE NEW CHARACTER TO STORAGE& CALL CHRALT ;AND THENCE TO DATABASE-20$: CALL REFRSH ;REFRESH THE CLOCK DISPLAYB RETURN  .PAGE; SUBROUTINE SECTION7DIFF: ;SUBROUTINE TO CHECK IF NEW DIGIT IS DIFFERENTH1 ;FROM PREVIOUS DIGIT AND DO GOOD THINGS IF SOY7 TST DIFPOS ;HAS THE FIRST DIFFERENT DIGIT BEEN FOUND? 5 BGE 10$ ;YES. MOVE IN THE NEW DIGIT UNCONDITIONALLYT4 CMPB R0,TIME(R1) ;NO. COMPARE NEW DIGIT TO PREVIOUS$ BEQ 20$ ;THEY'RE THE SAME. RETURN.9 MOV R1,DIFPOS ;THEY'RE DIFFERENT. SAVE POSITION OF DIGITO010$: MOVB R0,TIME(R1) ;MOVE NEW DIGIT INTO TIME. 20$: RETURN #TIMAST: ;UPDATE-TIME AST ROUTINE7 MOV #'U,COMBUF ;PLACE UPDATE COMMAND IN COMMAND BUFFER 0 TST (SP)+ ;BUMP SP TO PROPER LOCATION FOR EXIT5 SETF$S #2 ;SET EVENT FLAG 2 TO CLEAR THE WAIT STATEH ASTX$S ;RETURN TO PROGRAM@CHRALT: MOV #LSTCHR,R0 ;SUBROUTINE TO ALTER CHAR. GEN. DATA BASE MOVB DSPCHR,R1. MOV #CHAR0,R3#5$: CMPB -(R0),#40 ;CHECK FOR SPACEE BEQ 20$ MOVB R1,(R0)I20$: CMP R0,R3 BNE 5$S RETURNI4WIPE: ;SUBROUTINE TO CLEAR SCREEN AND HOME CURSOR7 MOV #100401,XPOS ;BIT PATTERN FOR POS. 1,1 AND ERASUREN9 PRINT #NULL,#1 ;POSITION CURSOR AT HOME AND ERASE SCREEN  RETURNPF; THE FOLLOWING SUBROUTINE (3 ENTRY POINTS) PERFORMS TERMINAL-SPECIFICD; OUTPUT IN ORDER TO ERASE TO THE END OF THE DISPLAY, ENTER 00êºsœsßmæàmçámýfáþfDATAGRAPHICS; MODE, AND ENTER ALHPA MODE(ERASE: MOV R0,-(SP) ;SAVE CONTENTS OF R0! TSTB TTTYP ;CHECK TERMINAL TYPEC BEQ 10$ ;IF ZERO, A VT52/ MOV #ERS100,R0 ;GET ERASURE SEQUENCE FOR VT100 BR TTFUN ;PRINT SEQUENCE110$: MOV #ERS52,R0 ;GET ERASURE SEQUENCE FOR VT52T BR TTFUN ;PRINT SEQUENCE)GRAFIC: MOV R0,-(SP) ;SAVE CONTENTS OF R0A! TSTB TTTYP ;CHECK TERMINAL TYPE  BEQ 10$ ;IF ZERO, A VT524 MOV #GRA100,R0 ;GET GRAPHIC MODE SEQUENCE FOR VT100 BR TTFUN ;AND PRINT IT610$: MOV #GRA52,R0 ;GET GRAPHIC MODE SEQUENCE FOR VT52 BR TTFUN ;AND PRINT IT(ALPHA: MOV R0,-(SP) ;SAVE CONTENTS OF R0! TSTB TTTYP ;CHECK TERMINAL TYPET BEQ 10$ ;IF ZERO, A VT522 MOV #ALP100,R0 ;GET ALPHA MODE SEQUENCE FOR VT100 BR TTFUN ;AND PRINT IT410$: MOV #ALP52,R0 ;GET ALPHA MODE SEQUENCE FOR VT521TTFUN: MOV XPOS,-(SP) ;SAVE CONTENTS OF VFC FIELD . CLR XPOS ;SET VFC FIELD TO ZERO (NO CONTROL)! PRINT R0,#3 ;PRINT THE SEQUENCEH" MOV (SP)+,XPOS ;RESTORE VFC FIELD MOV (SP)+,R0 ;RESTORE R0# RETURN; .PAGE; OFFSET AND ADDRESS TABLES 6CHRPOS: ;PRINT POSITION FOR EACH CHARACTER IN PRINT0 ; LINE - USE THESE VALUES AS ARG. TO CURSOR ; POSITIONER. .BYTE INITX ;TENS OF HOURS .BYTE INITX+10. ;ONES OF HOURS  .BYTE INITX+20. ;COLON#! .BYTE INITX+25. ;TENS OF MINUTESO! .BYTE INITX+35. ;ONES OF MINUTESV7LINOFF: ;OFFSET TO THE NTH LINE OF A GIVEN CHARACTER , .BYTE 90.,80.,70.,60.,50.,40.,30.,20.,10.,02COMNAM: ;LETTERS IDENTIFYING AVAILABLE COMMANDS= .ASCII /REC21/ ;REFRESH, EXIT, CLEAR BOTTOM, 24-HR., 12-HR. .ASCII /UA/ ;UPDATE, ALTER/ .IF GT POT ;TEST FOR PARENT-OFFSPRING TASKINGS% .IF GT RMDSPT ;TEST FOR RMD SUPPORTT .ASCII /S/ ;SPAWN RMDEMO F .ENDC; .ASCII /M/ ;SPAWN MCR (FREE WITH PARENT-OFFSPRING TSKNG.).% .IF GT DCLSPT ;TEST FOR DCL SUPPORTE .ASCII /D/ ;SPAWN DCLE .ENDC .ENDC .EVEN5NUMADD: ;ADDRESS OF THE DATA BASE FOR EACH NUMERAL.$ .WORD CHAR0,CHAR1,CHAR2,CHAR3,CHAR4$ .WORD CHAR5,CHAR6,CHAR7,CHAR8,CHAR9)COMADR: ;ADDRESSES OF COMMAND ROUTINESB4 .WORD REFRSH ;JUMP ADDRESS FOR REFRESH ROUTINE (R)/ .WORD EXIT ;JUMP ADDRESS FOR EXIT ROUTINE (E): .WORD CLEAR ;JUMP ADDRESS FOR CLEAR BOTTOM OF SCREEN (C)9 .WORD MODE24 ;JUMP ADDRESS FOR 24-HOUR MODE ROUTINE (2)-9 .WORD MODE12 ;JUMP ADDRESS FOR 12-HOUR MODE ROUTINE (1)/ .WORD UPDATE ;JUMP ADDRESS FOR UPDATE ROUTINE5 .WORD ALTER ;JUMP ADDRESS FOR DISPLAY ALTER ROUTINE./ .IF GT POT ;TEST FOR PARENT-OFFSPRING TASKINGA% .IF GT RMDSPT ;TEST FOR RMD SUPPORT 3 .WORD SPNRMD ;ADDRESS FOR ROUTINE TO SPAWN RMDEMOP .ENDC0 .WORD SPNMCR ;ADDRESS FOR ROUTINE TO SPAWN MCR% .IF GT DCLSPT ;TEST FOR DCL SUPPORT 0 .WORD SPNDCL ;ADDRESS FOR ROUTINE TO SPAWN DCL .ENDC .ENDC .IF GT POT- .IF GT RMDSPT.RMDNAM: .ASCII /RMD/ ;COMMAND NAME FOR RMDEMO .EVEN .ENDC)MCRNAM: .RAD50 /MCR.../ ;TASK NAME OF MCR  .IF GT DCLSPT)DCLNAM: .RAD50 /DCL.../ ;TASK NAME OF DCLT .ENDC .ENDC; USEFUL PRINT STRINGS6ERS100: .BYTE 33,133,112 ;VT100 ERASE-TO-END-OF-SCREEN2ERS52: .BYTE 33,112,0 ;VT52 ERASE-TO-END-OF-SCREEN+GRA100: .BYTE 33,50,60 ;VT100 GRAPHICS MODES)GRA52: .BYTE 33,106,0 ;VT52 GRAPHICS MODEP)ALP100: .BYTE 33,50,102 ;VT100 ALPHA MODEOAALP52: .BYTE 33,107 ;VT52 ALPHA MODE (DON'T SEPARATE FROM NULL:) 5NULL: .BYTE 0 ;NULL CHARACTER FOR CURSOR POSITIONINGC5WHORU: .BYTE 33,132 ;ESC Z QUERIES TERMINAL IDENTITY .ENABL LCABB100: .ASCII <33>/[1;5m/ ;ESC. SEQ. FOR VT100 BOLD/BLINKING TEXTSBB100L =.-BB100 ?BBOFF: .ASCII <33>/[m/ ;ESC. SEQ. TO TURN OFF VT00 DISP. CHARS.VBBOFFL =.-BBOFFO.; FOLLOWING IS TEXT OF ILLEGAL COMMAND MESSAGE&ILLMES: .ASCII /Legal commands are --/- .ASCII <15><12><12>/R - Refresh the display/D .IF GT RMDSPT% .ASCII <11><11>/S - System display /T .ASCII /(RMDEMO)/ .ENDCE .ASCII <15><12>/C - Clear bottom of screen/<11>/E - Exit to monitor/S0 .ASCII <15><12>/1 - Set as a 12-hour clock/<11>$ .ASCII /2 - Set as a 24-hour clock/ .IF GT POTL .ASCII <15><12>&M&= .IF GT DCLSPT .ASCII &/D& .ENDC .ASCII & 00êÂs—sn´cÚµcÛ¶c�·c›’- Call MCR&D .IF GT DCLSPT .ASCII &/DCL& .ENDC* .ASCII & (Press to return to clock)& .ENDC- .ASCII <15><12>/A - Alter display character/>ILLMEL = .-ILLMESe .DSABL LC; PSEUDO-CLI PROMPTS .IF GT POTsMCRPRM: .ASCII /MCR>/  .IF GT DCLSPTDCLPRM: .ASCII /DCL>/- .ENDC .ENDC; "TASK NOT INSTALLED" MESSAGE7NOTASK: .ASCII /NO CAN DO - THAT TASK IS NOT INSTALLED/ NOTASL = .-NOTASKuEALTMES: .ASCII /SELECT A NEW DISPLAY CHARACTER ( FOR NO CHANGE)./&" .ASCII /YOUR SELECTION IS --/<12>ALTMSL = .-ALTMESIATOZ: .ENABL LC.) .ASCII /abcdefghijklmnopqrstuvwxyz{|}`~/. .DSABL LCATOZL = .-ATOZ YRCHS: .ASCII <12>/YOUR CHOICE?/YRCHSL =.-YRCHS 4TUMANY: .ASCII /YOU CAN ONLY SPECIFY ONE CHARACTER./TUMANL =.-TUMANYHTERROR: .ASCII /YOU CAN ONLY RUN THE CLOCK ON A VT100 OR VT52. SORRY.../TERRL =.-TERROR #; DATA BASE FOR CHARACTER GENERATORS .ENABL LCCHAR0: .ASCII / aaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .ASCII / aaaaaa /CHAR1: .ASCII / aa / .ASCII / aaa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aaaa / .ASCII / aaaa /CHAR2: .ASCII / aaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aaaaaaa / .ASCII / aaaaaaaa /CHAR3: .ASCII / aaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .ASCII / aaaaaa /CHAR4: .ASCII / aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .ASCII / aaaaaaaa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa /CHAR5: .ASCII / aaaaaaa / .ASCII / aaaaaaa / .ASCII / aa / .ASCII / aa / .ASCII / aaaaaaa / .ASCII / aa aaa / .ASCII / aa / .ASCII / aa / .ASCII / aa aa / .ASCII / aaaaa /CHAR6: .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aaaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .ASCII / aaaaaa /CHAR7: .ASCII / aaaaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aaa /CHAR8: .ASCII / aaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaa / .ASCII / aaaaaa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .ASCII / aaaaaa /CHAR9: .ASCII / aaaaaa / .ASCII / aaaaaaaa / .ASCII / aa aa / .ASCII / aa aa / .ASCII / aaaaaaaa / .ASCII / aaaaaaa / .ASCII / aa / .ASCII / aa / .ASCII / aa / .ASCII / aa /COLON: .ASCII / /I .ASCII / /. .ASCII / // .ASCII / /  .ASCII / /I .ASCII / aaa /. .ASCII / aaa // .ASCII / /  .ASCII / aaa /a .ASCII / aaa / LSTCHR: .DSABL LC .EVEN .PAGE'; IMPURE AREA (NOT TOO IMPURE, I HOPE!)I>OUTDPB: QIOW$ IO.WLB,5,1,,,,<0,0,40> ;DPB FOR OUTPUT OPERATION<SMCDPB: QIOW$ SF.SMC,5,2,,IOSB,, ;DPB FOR SET MULT. ;CHARACTERISTICS OPERATION 9TIMEIN: .BLKW 8. ;BUFFER FOR TIME PARAMETERS FROM GTIM$SS7DIFPOS: .WORD 0 ;WORD TO CONTAIN FIRST DIFFERENT DIGIT.&COMBUF: .WORD 0 ;COMMAND INPUT BUFFER1MODE: .WORD 0 ;CLOCK MODE (0=12-HOUR, +=24-HOUR)!IOSB: .BLKW 2 ;I/O STATUS BUFFER;TCBUF: .BYTE TC.ESQ,1 ;BUFFER TO SET/CLEAR ESCAPE SEQ. REC.;TYPBUF: .BYTE TC.TTP,0 ;BUFFER TO GET TERM. CHARACTERISTICSW.TIME: .BLKB 5 ;5-BYTE BUFFER FOR DECIMAL TIME/TTTYP: .BYTE 0 ;TERMINAL TYPE: 0=VT52, 1=VT100R?DSPCHR: .BYT00êÊsëËsßmæàmçámýfáþfDATAE FORCHR ;DISPLAY CHARACTER; INITIALIZE TO DEFAULTB0IOBUF: .BLKB 79. ;PRINT BUFFER (AND CLI COMMAND ; LINE INPUT BUFFER) .END CLOCKIGIT.&COMBUF: .WORD 0 ;COMMAND INPUT BUFFER1MODE: .WORD 0 ;CLOCK MODE (0=12-HOUR, +=24-HOUR)!IOSB: .BLKW 2 ;I/O STATUS BUFFER;TCBUF: .BYTE TC.ESQ,1 ;BUFFER TO SET/CLEAR ESCAPE SEQ. REC.;TYPBUF: .BYTE TC.TTP,0 ;BUFFER TO GET TERM. CHARACTERISTICSW.TIME: .BLKB 5 ;5-BYTE BUFFER FOR DECIMAL TIME/TTTYP: .BYTE 0 ;TERMINAL TYPE: 0=VT52, 1=VT100R?DSPCHR: .BYT .TITLE HIYA .LIST TTM .NLIST BEX .ENABL LC; MACRO LIBRARY CALLS .MCALL EXIT$S,QIOW$,DIR$,GTSK$INDPB: QIOW$ IO.RLB,5,1,,IOST &OUTDPB: QIOW$ IO.WLB,5,1,,IOST,,<,,40>SYSDPB: GTSK$ SYSBUF; LOCAL EQUATES/BSIZE=80. ; ACCEPTS NAMES UP TO 80 CHARACTERS; LOCAL DATA BUFFERS-MSG1: .ASCII /Could I have your name please?/"MSG1L=.-MSG1 ; THE LENGTH OF MSG1&MSGMP: .ASCII /RSX-11M-PLUS calling / %MSGMPL=.-MSGMP ; THE LENGTH OF MSGMPMSGM: .ASCII /RSX-11M calling /"MSGML=.-MSGM ; THE LENGTH OF MSGM1BUFF: .BLKB BSIZE ; SET UP BUFFER LENGTH = BSIZE ,OBUFF: .ASCII /IO ERROR WITH STATUS/<12><15>I1: .ASCII /DSW = /I2: .ASCII /IOST = / OSIZ=.-OBUFF .EVEN IOST: .BLKW 2SSYSBUF: .BLKW 16.; MAIN PROGRAM*HIYA: DIR$ #SYSDPB ; GET TASK ENVIRONMENT MOV #MSG1,R0 ; SET UP CALLs& MOV #MSG1L,R1 ; TO WRITE SUBROUTINE" MOV #40,R2 ; SINGLE SPACE OUTPUT CALL WRITE ; OUTPUT MSG1 MOV #BUFF,R0 ; SET UP CALL $ MOV #BSIZE,R1 ; TO READ SUBROUTINE# CALL READ ; READ NAME INTO BUFFER , MOV R2,-(SP) ; SAVE LENGTH OF READ TO STACK% CMP #1,SYSBUF+G.TSSY; IS IT RSX-11M?> BNE 10$' MOV #MSGM,R0 ; SET UP CALL FOR RSX-11M % MOV #MSGML,R1 ; TO WRITE SUBROUTINEB MOV R1,R4 ; SAVE LENGTH. BR 20$A110$: MOV #MSGMP,R0 ; SET UP CALL FOR RSX-11M-PLUSE& MOV #MSGMPL,R1 ; TO WRITE SUBROUTINE MOV R1,R4 ; SAVE LENGTH %20$: MOV #'$,R2 ; NO CARRIAGE RETURN CALL WRITE ; OUTPUT MESSAGE  MOV #BUFF,R0' MOV (SP)+,R1 ; RECOVER LENGTH OF NAMEU- MOVB #15,BUFF(R1) ; APPEND A CARRIAGE RETURNV INC R1 CLR R2 ;  CALL WRITE ; OUTPUT NAMEB ADD R4,R1 DEC R1 EXIT$S ; LEAVEV;+7; WRITE - SUBROUTINE TO WRITE A MESSAGE TO THE TERMINALI;S ; INPUTS:0; R0 - ADDRESS OF STRING TO BE PRINTED ON SCREEN ; R1 - LENGTH OF STRING TO PRINT.; R2 - LOW-ORDER CHARACTER IS CARRIAGE CONTROL;V ; OUTPUTS:; NONE;; NOTE:V@; WRITE OUTPUTS A PREFORMATTED ASCII STRING. ALL DATA CONVERSION?; (OCTAL NUMBERS TO ASCII, FOR EXAMPLE) MUST BE DONE BEFOREHAND,;-.WRITE:: MOV R0,OUTDPB+Q.IOPL ; FILL IN QIO DPB MOV R1,OUTDPB+Q.IOPL+2U MOV R2,OUTDPB+Q.IOPL+4D DIR$ #OUTDPB  BCS ERR1 ; DIRECTIVE ERROR TSTB IOST ; IO ERROR?  BLT ERR1 ; YES RETURNU;+2; READ - SUBROUTINE TO READ A LINE FROM A TERMINAL;- ; INPUTS:S; R0 - ADDRESS OF INPUT BUFFER+; R1 - MAXIMUM NUMBER OF CHARACTERS TO READ:; ; OUTPUTS:6; R2 - ACTUAL NUMBER OF CHARACTERS READ (NOT INCLUDING; TERMINATING CARRIAGE RETURN;T; NOTE:F=; THIS ROUTINE ONLY READS IN ASCII STRINGS. NO INTERPRETATIONP=; OR DATA CONVERSION IS DONE. NUMBERS READ IN WILL HAVE TO BEU=; CONVERTED TO THEIR BINARY EQUIVALENTS USING THE SYSTEM DATAT; CONVERSION SUBROUTINES.T;-,READ:: MOV R0,INDPB+Q.IOPL ; FILL IN QIO DPB MOV R1,INDPB+Q.IOPL+2 DIR$ #INDPB BCS ERR1 ; DIRECTIVE ERROR TSTB IOST ; IO ERROR?N BLT ERR1 ; YES+ MOV IOST+2,R2 ; RETURN COUNT OF CHARACTERSB RETURNR;+;; ERR1 - ERROR HANDLING ROUTINE FOR DIRECTIVE AND IO ERRORSO;F9; NOTE THAT ONLY ONE OF THE TWO NUMBERS DISPLAYED WILL BET ; SIGNIFICANT ;-0ERR1: MOV #I1+6,R0 ; ADDRESS TO CONVERT DSW INTO$ MOV $DSW,R1 ; DSW VALUE TO CONVERT# CLR R2 ; LEADING ZERO SUPPRESSIONB- CALL $CBDSG ; CONVERT BINARY TO SIGNED DEC.F2 MOV #I2+7,R0 ; ADDRESS TO CONVERT IO STATUS INTO2 MOVB IOST,R1 ; IO STATUS RETURN VALUE TO CONVERT# CLR R2 ; LEADING ZERO SUPPRESSION2( CALL $CBDSG ; CONVERT IO STATUS RETURN+ MOV #OBUFF,OUTDPB+Q.IOPL ; FILL IN QIO DPBE MOV #OSIZ,OUTDPB+Q.IOPL+2' DIR$ 00ëÒsìÓsíÕs´cÚµcÛ¶c�·c›’#OUTDPB ; EXECUTE OUTPUT REQUESTP EXIT$SL .END HIYAFICANT ;-0ERR1: MOV #I1+6,R0 ; ADDRESS TO CONVERT DSW INTO$ MOV $DSW,R1 ; DSW VALUE TO CONVERT# CLR R2 ; LEADING ZERO SUPPRESSIONB- CALL $CBDSG ; CONVERT BINARY TO SIGNED DEC.F2 MOV #I2+7,R0 ; ADDRESS TO CONVERT IO STATUS INTO2 MOVB IOST,R1 ; IO STATUS RETURN VALUE TO CONVERT# CLR R2 ; LEADING ZERO SUPPRESSION2( CALL $CBDSG ; CONVERT IO STATUS RETURN+ MOV #OBUFF,OUTDPB+Q.IOPL ; FILL IN QIO DPBE MOV #OSIZ,OUTDPB+Q.IOPL+2' DIR$ .TITLE STARS .NLIST BEX .LIST TTME; DEMONSTRATION SUBROUTINE FOR USE WITH "INTRODUCTION TO RSX-11M AND O; RSX-11M-PLUS" "HIYA" PROGRAM. PRINTS A LINE OF STARS UNDER GREETING MESSAGE.C; INPUTS: R0 CONTAINS ADDRESS OF MESSAGE BUFFER, R1 CONTAINS NUMBER9; OF STARS TO BE PRINTED. R0 AND R1 COME BACK UNCHANGED.5STARS:: MOV R1,R2 ; SET UP TALLY FOR NUMBER OF STARS410$: MOVB #'*,(R0)+ ; FILL MESSAGE BUFFER WITH STARS" DEC R2 ; TO THE CORRECT NUMBER.1 BGT 10$ ; IF NOT FINISHED, STASH ANOTHER STAR0 SUB R1,R0 ; RESTORE ADDRESS OF MESSAGE BUFFER MOV #40,R2 ; CARRIAGE CONTROLO CALL WRITE ; OUTPUT THE STARSH$ RTS PC ; RETURN TO CALLING PROGRAM .ENDREETING MESSAGE.C; INPUTS: R0 CONTAINS ADDRESS OF MESSAGE BUFFER, R1 CONTAINS NUMBER9; OF STARS TO BE PRINTED. R0 AND R1 COME BACK UNCHANGED.5STARS:: MOV R1,R2 ; SET UP TALLY FOR NUMBER OF STARS410$: MOVB #'*,(R0)+ ; FILL MESSAGE BUFFER WITH STARS" DEC R2 ; TO THE CORRECT NUMBER.1 BGT 10$ ; IF NOT FINISHED, S? .TITLE TMCLI - EXAMPLE CLI THAT IMPLEMENTS "T" AND "M" COMMAND .IDENT /1.00/;N; THIS TASK (TMCLI) ILLUSTRATES THE USE OF THE CLI CONTROL DIRECTIVES PRESENT ); IN RSX-11M V4.0 AND RSX-11M-PLUS V2.0. ;F; WHEN SET UP AS A TERMINAL'S CLI, IT PROVIDES THE FOLLOWING COMMANDS:;; T -> TYPE FILE; M -> SET TERMINAL TO MCR;>; IF THE FIRST TWO LETTERS OF THE COMMAND ARE NOT "T" FOLLOWED3; BY A SPACE, OR "M" FOLLOWED BY A CARRIAGE RETURN,8; THE COMMAND IS PASSED TO MCR FOR EXECUTION. THEREFORE,H; USERS AT TERMINALS SET TO THIS CLI WILL SEE THE ENTIRE MCR COMMAND SETF; AS BEING PRESENT, PLUS THE "T" AND "M" COMMANDS. IF THE "DPR" SWITCHF; IS INCLUDED ON THE CLI /INIT COMMAND, USERS WILL KNOW IMMEDIATELY IFG; THEIR TERMINAL IS SET TO THIS CLI BY THE PRESENCE OF THE DOUBLE RIGHT ; ANGLE BRACKET AS THE PROMPT.;OF; IF IT IS INITIALIZED WITH THE SYSTEM MESSAGE OPTION ENABLED, IT WILLD; GREET USERS WHEN THEIR TERMINAL IS SET TO THE CLI, AND SAY GOODBYE ; TO THEM WHEN THEY SWITCH AWAY.;FB; IN ORDER TO BRING THIS CLI UP ON THE SYSTEM, ISSUE THE FOLLOWING; COMMAND SEQUENCE:G;E; >MAC TMCLI,TMCLI/-SP=TMCLI+; >TKB TMCLI,TMCLI/-SP=TMCLI,[1,1]EXELIB/LBT ; >INS TMCLI/CLI=YES/TASK=...TMC9; >CLI /INIT=TMCLI/MESSAGE/DPR="<15><12>/>>/"/TASK=...TMCT;P;; TO SET TERMINALS TO THIS CLI, ISSUE THE FOLLOWING COMMAND6; WHERE TTN: IS REPLACED BY THE TERMINAL NUMBER OR TI:;N; >SET /CLI=TTN:TMCLI ;RH; NOTE THAT THE PROMPT ISSUED IN RESPONSE TO A CONTROL/C DEFAULTS TO THE%; NAME OF THE CLI WHICH IS "TMCLI>". N;HJ; IT CAN BE ELIMINATED FROM THE SYSTEM BY THE FOLLOWING COMMANDS, ASSUMING; NO TERMINALS ARE SET TO IT:B;C; >CLI /ELIM=TMCLI ; >REM ...TMC;IH; EXPERIMENT WITH THE OTHER OPTIONS ON THE CLI /INIT COMMAND, THE ENABLEL; AND DISABLE CLI COMMANDS, AND LEAVING OFF THE /MESSAGE SWITCH ON THE /INITG; COMMAND TO OBSERVE THE EFFECT THEY HAVE. ALSO TRY CHANGING THE /TASK=LE; SWITCH ON THE INS AND CLI /INIT COMMAND TO "/TASK=TMCLI" AND NOTICELJ; THAT ONLY ONE COPY OF THE TASK WILL EXIST FOR ALL TERMINALS, RATHER THANE; ONE PER COMMAND. IF THIS IS DONE, YOU SHOULD ALSO CHANGE THE OPTIONRK; ON THE GCCI$ DIRECTIVE FROM GC.CEX TO GC.CST SO THE TASK WILL STAY ACTIVEE6; BUT STOPPED WHEN NO COMMANDS ARE OUTSTANDING FOR IT.;B + .MCALL GCCI$,RPOI$,EXIT$S,QIOW$,ALUN$,DIR$H;M; DIRECTIVE DPBS;/,GCCI: GCCI$ CMDBUF,CBLEN,IBUF,IBLEN,0,GC.CEXRPOI: RPOI$ MCR... QIOW: QIOW$ IO.WVB,5,1,,,,<,,40> ALUN: ALUN$ 5O N;O; BUFFER AREAS;N?CMDBUF: .BLKB 80.+G.CCBF ;LENGTH = HEADER 00íÚsËsßmæàmçámýfáþfDATAPLUS COMMAND IN BYTESN, ;NOTE THAT ON M-PLUS THE MAXIMUM COMMAND/ ;LENGTH IS 255. BYTES, SO THE LENGTH SHOULDT0 ;BE <255.+G.CCBF> OR CHARACTERS MAY BE LOST. W"CBLEN=.-CMDBUF ;CALCULATE LENGTH .EVEN S<IBUF: .BLKB G.CCCA+2 ;LONG ENOUGH TO CONTAIN ALL INFORMATION IBLEN=.-IBUF ;CALCULATE LENGTH .EVEN CCTCMD: .ASCII /PIP TI:=/ ;BASIC PIP COMMAND TO IMPLEMENT "T" COMMAND !TCLEN=.-TCMD ;LENGTH OF COMMANDL4BUF: .BLKB 80.-TCLEN ;BUFFER TO GENERATE COMMANDS IN .EVEN GAMCR: .ASCII /M/<15> ;STRING TO RECOGNIZE AS A SET TO MCR REQUESTX8MCMD: .ASCII %SET /MCR=TI:% ;SET TERMINAL TO MCR COMMAND!MCLEN=.-MCMD ;LENGTH OF COMMANDA .EVEN E;S=; TEXT TO BE DISPLAYED UPON RECEIPT OF NEW TERMINAL LINKED ORB(; TERMINAL REMOVED MESSAGES FROM SYSTEM.;R8LKT: .ASCII <15><12>/WELCOME TO THE EXAMPLE CLI/<15><12> LKTLEN=.-LKT .EVEN C;RMT: .ASCII <15><12>/GOOD BYE FROM THE EXAMPLE CLI/<15><12>H RMTLEN=.-RMT .EVEN 8;T6; CHARACTERS LOST DUE TO BUFFER BEING TO SMALL MESSAGE;IECHLOST: .ASCII <15><12>/SORRY, PART OF YOUR COMMAND WAS LOST/<15><12>%CLLEN=.-CHLOST T;I; ILLEGAL COMMAND MESSAGE-;D-ILL: .ASCII <15><12>/ILLEGAL COMMAND/<15><12>T ILLLEN=.-ILL .EVEN P;F ; CLI CODE;I D .ENABL LSBN-START: DIR$ #GCCI ;GET A COMMAND FROM SYSTEMI" BCS 100$ ;IF CS, DIRECTIVE ERROR;1E; IF THE GCCI$ DIRECTIVE HAD THE GC.CST OPTION SPECIFIED, WE MAY HAVEE5; JUST BEEN UNSTOPPED, SO WE HAVE TO GET THE COMMAND. ;R* CMP #IS.CLR,$DSW ;WERE WE JUST UNSTOPPED? BEQ START ;IF EQ YES( MOV #CMDBUF,R0 ;POINT TO COMMAND BUFFER% TST (R0) ;IS THIS A SYSTEM MESSAGE? BEQ MSG ;IF EQ YES= CMPB G.CCCT(R0),G.CCCL(R0) ;DID ENTIRE COMMAND FIT IN BUFFERN BLO 150$ ;IF LO NO. MOV #RPOI,R5 ;POINT TO DPB OF RPOI$ DIRECTIVE;CE; AT THIS POINT, THE CLI HAS A COMMAND TO BE PROCESSED. THE CODE FROMD; THE "START:" LABEL TO HERE SHOULD BE FAIRLY COMMON AMONG ALL CLIS.J; FROM THIS POINT ON, THE CODE WILL BE SPECIFIC TO THE PARTICULAR LANGUAGED; THIS CLI IS IMPLEMENTING. COMMANDS CAN BE ADDED OR DELETED AT WILLD; BY MODIFYING CODE IN THIS SECTION. AS STATED ABOVE, THIS EXTREMELYE; SIMPLE CLI PROVIDES TWO COMMANDS, AND GIVES EVERYTHING ELSE TO MCR.NI; THIS CREATES AN OPEN ENDED ENVIRONMENT. REJECTING UNRECOGNIZED COMMANDSIG; INSTEAD OF PASSING THEM TO MCR WOULD LIMIT THE TERMINAL USER'S USE OFFA; THE SYSTEM TO ONLY THOSE OPERATIONS ALLOWED BY THE CLI. THIS ISLH; A SECURE WAY OF CONTROLLING SYSTEM USE, IN CASES WHEN IT IS NECESSARY.?; IN THIS EXAMPLE, CHANGING THE "BNE 50$" BELOW, TO A "BNE 60$"LC; WOULD CREATE AN ENVIRONMENT WHERE THE ONLY OPERATION A USER COULDHH; PERFORM WOULD BE TO TYPE FILES ON THE TERMINAL, OR SWITCH BACK TO MCR.J; ALL OF THE REST OF RSX IS TOTALLY INACCESSABLE. IF NO MEANS OF SWITCHINGD; BACK TO MCR IS PROVIDED, IT WOULD BE IMPOSSIBLE FOR THE USER TO DO2; ANYTHING THE CLI DOES NOT EXPLICITLY LET HIM DO.;L E* CMP #"T ,G.CCBF(R0) ;IS IT A "T" COMMAND? BEQ 10$ ;IF EQ YES) CMP MCR,G.CCBF(R0) ;IS IT A "M" COMMAND?X L;CG; CHANGE THE NEXT INSTRUCTION TO "BNE 60$" TO ELIMINATE PASSING UNKNOWNN; COMMANDS TO MCR.;I BNE 50$ ;IF NE NOE;RB; THE USER HAS ENTERED AN "M" COMMAND, SO SET THE TERMINAL TO MCR.; : MOV #MCMD,R.POBF(R5) ;PUT ADDRESS OF CMD TO ISSUE IN DPB0 MOV #MCLEN,R.POBL(R5) ;PUT LENGTH OF CMD IN DPB BR ISSCMD ;ISSUE COMMAND ;TC; THE USER HAS ENTERED A "T" COMMAND SO CONSTRUCT THE NECESSARY PIPF; COMMAND AND SEND IT TO MCR;1 410$: MOV R0,R1 ;COPY ADDRESS OF BUFFER WITH COMMAND- ADD #G.CCBF+1,R1 ;POINT TO SPACE AFTER THE T 4 MOV #BUF,R2 ;POINT TO BUFFER THAT WILL CONTAIN CMD5 MOV #TCLEN,R4 ;GET LENGTH OF INITIAL PART OF COMMANDA&20$: MOVB (R1)+,R3 ;GET NEXT CHARACTER+ CMPB #15,R3 ;IS IT THE END OF THE COMMANDF BEQ 30$ ;IF EQ YES CMPB #40,R3 ;IS IT A SPACE BEQ 20$ ;IF EQ YES, SKIP IT . MOVB R3,(R2)+ ;PUT CHARACTER IN OUTPUT BUFFER INC R4 ;COUNT CHARACTERH BR 20$ ;GET NEXT CHARACTER<30$: MOV #TCMD,R.POBF(R5);PUT ADDRESS OF CMD TO ISSUE IN DPB, MOV R4,R.POBL(R5) ;INSERT LENGTH OF COMMAND00íâsÓsíÕs´cÚµcÛ¶c�·c›’;CE; THIS COMMAND WILL BE PASSED TO THE MAIN COMMAND DISPATCHER (MCR...)MB; WHICH WILL START A COPY OF PIP AND GIVE IT THE COMMAND. THE RPOID; DIRECTIVE COULD BE USED TO GIVE THE COMMAND DIRECTLY TO ...PIP AND<; GIVE THE RESULTING TASK A DIFFERENT NAME. IN THIS EXAMPLE,>; WE COULD CALL THE RESULTING PIP TASK "TYPTNN" WHERE THE LASTD; THREE CHARACTERS (TNN) ARE REPLACED BY A DEVICE NAME CHARACTER ANDA; UNIT NUMBER. FOR EXAMPLE, IF THE "T" COMMAND WAS TYPED ON TT10:.D; THE RESULTING TASK NAME COULD BE MADE TO BE "TYPT10". THIS HAS THEG; ADVANTAGE OF ALLOWING THE TASK TO BE ABORTED BY AN "ABO TYP" COMMAND,PE; INSTEAD OF "ABO PIP", THUS THE USER WOULD NOT HAVE TO KNOW THAT THEHE; "T" COMMAND HE ISSUED IS ACTUALLY BE SERVICED BY THE PIP TASK. THIS @; IS EXACTLY WHAT THE DCL CLI DOES. IT IS NOT DONE HERE IN ORDER@; TO SIMPLIFY THE EXAMPLE. PICKING UP THE TERMINAL NAME AND UNITH; NUMBER, CONVERTING IT TO RAD50, AND SUPPLYING IT IN THE RPOI DIRECTIVEH; ALONG WITH A DIRECT REQUEST OF PIP IS LEFT AS AN EXERCISE TO THE USER.>; (BE CAREFUL ON M-PLUS SYSTEMS WITH MORE THAN 64. TERMINALS).I; NOTE THAT REQUESTING PIP DIRECTLY AVOIDS A SUBSTANTIAL AMOUNT OF SYSTEMA ; OVERHEAD.A;H BR ISSCMD ;EXECUTE COMMAND T;L5; COMMAND IS NOT "T" OR "M", SO GIVE IT TO MCR AS IS. ; @50$: MOV #CMDBUF+G.CCBF,R.POBF(R5) ;PUT ADDRESS OF STRING IN DPB3 MOVB G.CCCT(R0),R.POBL(R5) ;PUT LENGTH IN RPOI DPB  V;I*; ISSUE RPOI$ DIRECTIVE TO EXECUTE COMMAND;R?ISSCMD: MOV (R0),R.PODV(R5) ;PUT NAME OF ISSUING DEVICE IN RPOIS- MOVB G.CCUN(R0),R.POUN(R5) ;COPY UNIT NUMBER 7 MOVB IBUF+G.CCPU,R.POUM(R5) ;PROPOGATE UIC OF TERMINALP MOVB IBUF+G.CCPU+1,R.POUG(R5)C MOV IBUF+G.CCOA,R.POOA(R5) ;COPY ID PARENT IN CASE WE WERE SPAWNED+ DIR$ #RPOI ;PASS COMMAND TO EXECUTOR TASKO BCC START ;IF CC, SUCCESSM BR 110$ ;ERROR );UC; CONTROL IS TRANSFERED HERE IF UNKNOWN COMMANDS ARE TO BE REJECTEDN!; INSTEAD OF BEING PASSED TO MCR.I;T160$: MOV #ILL,R1 ;POINT TO MESSAGE TO BE PRINTED(& MOV #ILLLEN,R2 ;GET LENGTH OF MESSAGE CALL ISSMSG ;ISSUE MESSAGE BR START ;TRY FOR NEXT COMMAND ,;O; ERROR HANDLING CODEF;R A#100$: CLR R0 ;FATAL ERROR ON GCCI$M BR 150$&110$: MOV #1,R0 ;FATAL ERROR ON RPOI$120$: IOT ;FATAL 4150$: MOV #CHLOST,R1 ;POINT TO MESSAGE TO BE PRINTED% MOV #CLLEN,R2 ;GET LENGTH OF MESSAGEU CALL ISSMSG ;ISSUE MESSAGE BR START .DSABL LSBT E;J4; A SYSTEM MESSAGE WAS RECEIVED INSTEAD OF A COMMAND;# ,@MSG: CMPB #CM.LKT,G.CCUN(R0) ;IS IT A NEW TERMINAL LINKED TO US? BEQ 10$ ;IF EQ YES8 CMPB #CM.RMT,G.CCUN(R0) ;IS IT A TERMINAL BEING REMOVED BEQ 20$ ;IF EQ YES6 CMPB #CM.EXT,G.CCUN(R0) ;IS IT A ELIMINATE ALL PACKET BEQ 50$ ;IF EQ YES9 CMPB #CM.ELM,G.CCUN(R0) ;IS IT A CLI ELIMINATION MESSAGEC BEQ 50$ ;IF EQ YES% BR START ;IGNORE ALL OTHER MESSAGES ;G; ISSUE WELCOME MESSAGEM; (10$: MOV #LKT,R1 ;POINT TO MESSAGE TEXT MOV #LKTLEN,R2 ;GET LENGTHS/ ADD #G.CCBF,R0 ;POINT TO TERMINAL THAT WAS SET BR 30$ ; R;;; ISSUE GOOD BYE MESSAGE;O(20$: MOV #RMT,R1 ;POINT TO MESSAGE TEXT MOV #RMTLEN,R2 ;GET LENGTHB' ADD #G.CCBF,R0 ;POINT TO TERMINAL NAME 30$: CALL ISSMSG ;ISSUE MESSAGE JMP START ;GET NEXT COMMANDQ;S=; WHEN AN ELIMINATE ALL MESSAGE IS RECEIVED, EXIT IMMEDIATELYB;5 50$: EXIT$SS B;T; ROUTINE TO PRINT TO TERMINAL;G; ; INPUTS:M;E,; R0=ADDRESS OF NAME OF TERMINAL TO PRINT TO ; R1=ADDRESS OF MESSAGE TO PRINT; R2=LENGTH OF MESSAGE;T ; OUTPUTS:; ; NONE;BF; THIS ROUTINE PRINTS THE SPECIFIED MESSAGE ON THE SPECIFIED TERMINAL.C; ALL ERRORS THAT MIGHT RESULT ARE IGNORED. IN GENERAL, CLIS SHOULDTB; DO ASYNCHRONOUS I/O WITH COMPLETION AST'S, AND PROVIDE A TIMEOUT>; FACILITY TO KILL THE I/O IF IT HASN'T COMPLETED IN A CERTAINA; AMOUNT OF TIME IN ORDER TO PREVENT TERMINAL I/O FROM HOLDING UPT;; COMMAND PROCESSING. THIS IS NOT DONE HERE FOR SIMPLICITY.E;N T1ISSMSG: MOV (R0),ALUN+A.LUNA ;SET UP DEVICE NAMEL( MOVB 2(R0),ALUN+A.LUNU ;AND UNIT NUMBER$ CLRB ALUN+A.LUNU+1 ;CLEAR HIGH BYTE2 DIR$ #ALUN ;ASSI00íêsîësßmæàmçámýfáþfDATAGN LUN 5 TO THE SPECIFIED DEVICE BCS 10$ ;IF CS, SKIP I/O+ MOV R1,QIOW+Q.IOPL ;SET ADDRESS OF MESSAGEN/ MOV R2,QIOW+Q.IOPL+2 ;INSERT LENGTH OF MESSAGEO$ DIR$ #QIOW ;DO I/O AND WAIT FOR IT 10$: RETURNE N .END START  T OF TIME IN ORDER TO PREVENT TERMINAL I/O FROM HOLDING UPT;; COMMAND PROCESSING. THIS IS NOT DONE HERE FOR SIMPLICITY.E;N T1ISSMSG: MOV (R0),ALUN+A.LUNA ;SET UP DEVICE NAMEL( MOVB 2(R0),ALUN+A.LUNU ;AND UNIT NUMBER$ CLRB ALUN+A.LUNU+1 ;CLEAR HIGH BYTE2 DIR$ #ALUN ;ASSI .TITLE XXDRV XX DEVICE DRIVER .IDENT /09/ F;S;J; XX11 CARTRIDGE DISK DRIVER;R; MACRO LIBRARY CALLSI;P .MCALL HWDDF$,PKTDF$ $ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;E; EQUATED SYMBOLSS;M#LD$XX=0 ; DEFINE LOADABLE DRIVER RETRY=8. ;ERROR RETRY COUNTR'X$$X11=1. ; DEFINE NO. OF CONTROLLERSO;R ; LOCAL DATA;,>; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER);N<RTTBL: .BLKW X$$X11 ;ERROR RETRY COUNT AND DRIVE RESET FLAG; ; DIAGNOSTIC FUNCTION TABLE/;F!FUNTBL: .WORD IO.HMS!IQ.UMD, 0515V .WORD IO.BLS!IQ.UMD, 0511!FUNTB0: .WORD IO.RDH!IQ.UMD, 2505H .WORD IO.WDH!IQ.UMD, 2503 .WORD IO.WCK!IQ.UMD, 0507FUNTBE:O;S; DRIVER DISPATCH TABLES;M1 DDT$ XX,X$$X11,,,,NEW ;GENERATE DISPATCH TABLE ;;+3; **-XXINI-XX11 CARTRIDGE DISK CONTROLLER INITIATORO;J; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUESTN; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THE EXECU-N; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN ATTEMPTI; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER ISUI; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER-L>; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.; ; INPUTS:X; :; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;E ; OUTPUTS:;EE; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT-RE; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-T; ATION IS INITIATED. ;- .ENABL LSBN9XXINI: GTPKT$ XX,X$$X11 ;GET NEXT I/O PACKET TO PROCESS ;N1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:M;I'; R1=ADDRESS OF THE I/O REQUEST PACKET. -; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.H; R3=CONTROLLER INDEX.(; R4=ADDRESS OF THE STATUS CONTROL BLOCK:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;I0; XX11 CARTRIDGE DISK I/O REQUEST PACKET FORMAT:;R"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK. @; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.J; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTOR TASK HEADER (UCB).1; WD. 05 -- I/O FUNCTION CODE (IO.RLB OR IO.WLB).C0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.=; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000).T3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.DA; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER.F+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER. -; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.A; WD. 15 -- NOT USED.N9; WD. 16 -- LOW BYTE MUST BE ZERO AND HIGH BYTE NOT USED. 0; WD. 17 -- LOGICAL BLOCK NUMBER OF I/O REQUEST.A; WD. 20 -- RELOCATION BIAS OF DIAGNOSTIC REG. ADRS ELSE NOT USEDA4; WD. 21 -- DIAGNOSTIC REG. BLK ADRS (DISPL.+140000);O (= MOV #RETRY&377,RTTBL(R3) ;CLEAR POSITIONING AND SET RETRIESR' CALL $VOLVD ;VALIDATE VOLUME VALID I BCS 8$ ;IF CS WE FAILED  TST R0 ;TRANSFER FUNCTION? D BMI 1$ ;IF MI YES $ TST I.PRM+2(R1) ;SIZE THE DISK?  BPL 8$ ;IF PL NO & ASH #13.,R2 ;POSITION UNIT NUMBER * MOV S.CSR(R4),R0 ;RETRIEVE CSR ADDRESS " MOV R2,6(R0) ;SELECT THE DRIVE MOV R0,R2 ;COPY CSR ADDRESS % JMP 130$ ;PASS REGISTERS AND EXIT D1$: ;REF LABEL  .IF DF M$$EXT O, CALL $STMAP ;SET UP UNIBUS MAPPING ADDRESS .ENDC9 CMPB #IO.HMS/00îòsÓsíÕs´cÚµcÛ¶c�·c›’^D<256>,I.FCN+1(R1) ;DIAGNOSTIC FUNCTION? B BNE 5$ ;IF NE NO. MOV #FUNTBL,R0 ;GET ADDRESS OF FUNCTION TABLE-2$: CMP (R0)+,I.FCN(R1) ;FUNCTION CODE MATCH?? BEQ 3$ ;IF EQ YES # TST (R0)+ ;BYPASS CONTROLLER CODEN' CMP #FUNTBE,R0 ;END OF FUNCTION TABLE?  BEQ 5$ ;IF EQ YES( BR 2$ ;TRY AGAIN)3$: CMP R0,#FUNTB0 ;POSITIONING FUNCTION?P BHI 4$ ;IF HI NO6 INCB RTTBL+1(R3) ;YES, INDICATE POSITIONING OPERATION44$: BIS (R0),U.BUF(R5) ;SET CONTROLLER FUNCTION BITS BR 10$ ;GO CHECK BLOCK NUMBER/15$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION 51 BIS #505,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTIONI6 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?' BHIS 9$ ;IF HIS FUNCTION IS ILLEGAL S8$: JMP 120$ ;EXIT .9$: BEQ 10$ ;IF EQ FUNCTION IS READ LOGICAL 5 SUB #2,U.BUF(R5) ;CONVERT TO WRITE LOGICAL FUNCTION I-10$: CALL $BLKCK ;CHECK LOGICAL BLOCK NUMBERB- CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBER $ TST R1 ;WHICH SURFACE?  BEQ 15$ ;IF EQ SURFACE 0 ;" BIS #20,R0 ;SET SURFACE 1 BIT 015$: MOVB U.UNIT(R5),R1 ;RETRIEVE UNIT NUMBER * ASH #13.,R1 ;POSITION UNIT SELECT BITS ' ASH #5,R2 ;POSITION CYLINDER NUMBER L2 BIS R1,R2 ;MERGE UNIT BITS WITH CYLINDER NUMBER ( BIS R0,R2 ;MERGE TRK/SEC WITH CYLINDER2 MOV R2,I.PRM+10(R3) ;SAVE STARTING DISK ADDRESS ;E; INITIATE I/O OPERATION;I30$: ;REF LABEL .IF DF M$$EXT % CALL $MPUBM ;MAP UNIBUS TO TRANSFERE .ENDC% MOV S.CSR(R4),R2 ;GET ADDRESS OF CSRS9 MOV S.PKT(R4),R1 ;RETRIEVE ADDRESS OF I/O REQUEST PACKET ; MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNTO+ ADD #6,R2 ;POINT TO DISK ADDRESS REGISTERY, MOV I.PRM+10(R1),(R2) ;INSERT DISK ADDRESS. MOV U.BUF+2(R5),-(R2) ;INSERT BUFFER ADDRESS8 MOV U.CNT(R5),-(R2) ;INSERT NUMBER OF BYTES TO TRANSFER! ROR (R2) ;CONVERT TO WORD COUNTE$ NEG (R2) ;MAKE NEGATIVE WORD COUNT TST -(R2) ;POINT BACK TO CSR+ MOV #IE.DNR&377,R0 ;ASSUME DRIVE NOT READY TSTB -4(R2) ;IS DRIVE READY? BMI 31$ ;IF MI YES/ BITB #US.SPU,U.STS(R5) ;IS DRIVE SPINNING UP?M BNE 35$ ;IF NE YES/ BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC OPERATION?  BNE 51$ ;IF NE YES JMP 110$ ;FINISH UP1531$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UP)) MOV U.BUF(R5),(R2) ;LOAD FUNCTION AND GOR RETURNT;+$; CONTROLLER STATUS CHANGE OPERATION;R ; INPUTS:O;E; R2 = KRB ADDRESSG; R3 = CTB ADDRESST;R ; OUTPUTS:; -; CONTROLLER CLEARED ON ON LINE AND OFF LINEE;- T(XXKRB: MOV #1,@(R2) ;;;CLEAR CONTROLLER I;+<; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.;-#XXCAN: RETURN ;;;NOP FOR THE XX11O N;+:; UNIT STATUS CHANGE OPERATION - CALLED ONCE FOR EACH UNIT;, ; INPUTS:;;E; R3 = CONTROLLER INDEX; R4 = SCB ADDRESS ; R5 = UCB ADDRESST ; C = 0 UNIT OFFLINE TO ONLINE ; C = 1 UNIT ONLINE TO OFFLINE ; $SCERR = 1D;S ; OUTPUTS:; 0; UNIT OFFLINE - RETURN ($SCERR = 1 IS SUCCESS); UNIT ONLINE - RETURNE;- T+XXUCB: BCS XXCAN ;;;IF CS OFFLINE - RETURNI +; >; CODE SPECIFIC TO BRINGING A UNIT ONLINE (FOR EXAMPLE, SEEING@; WHETHER THE UNIT IS A NONEXISTENT DRIVE) COULD BE PLACED HERE.;U H RETURNA N;+0; POWER FAILURE OPERATION - A TRUE POWER FAILURE; @; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT ?; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVE A; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANY =B; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESS "; THE UNIT IS ALREADY READY. ;- I O7XXPWF: TSTB S.STS(R4) ;;;IS THE DRIVE CURRENTLY BUSY? H BEQ 36$ ;;;IF EQ NO V4 MOVB #3,S.STS(R4) ;;;WAIT A MAXIMUM OF 45 SECONDS 335$: MOVB #15.,S.CTM(R4) ;;;15 SECONDS AT A TIME 636$: BISB #US.SPU,U.STS(R5) ;;;SET UNIT SPINNING UP  RETURN S;++; **-$XXINT-XX11 DISK CONTROLLER INTERRUPTS ;-($XXINT:: ;DEFINE INTERRUPT ENTRY POINT8 INTSV$ XX,PR5,X$$X11 ;;;SAVE REGISTERS AND SET PRIORITY- TSTB RTTBL+1(R4) ;;;DRIVE RESET IN PROGRESS?  BEQ 50$ ;;;IF EQ NO-& MOV R4,00îúsïtßmæàmçámýfáþfDATA-(SP) ;;;SAVE CONTROLLER INDEX' MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCB$) MOV @S.CSR(R4),R4 ;;;GET CONTENTS OF CSRA$ BMI 40$ ;;;IF MI DRIVE RESET ERROR' BIT #20000,R4 ;;;DRIVE RESET COMPLETE?  BNE 40$ ;;;IF NE YES TST (SP)+ ;;;CLEAN STACK RETURN ;;; -40$: MOV (SP)+,R4 ;;;RESTORE CONTROLLER INDEXR+50$: CALL $FORK ;;;CREATE A SYSTEM PROCESSU" MOV R4,R3 ;COPY CONTROLLER INDEX% MOV U.SCB(R5),R4 ;GET ADDRESS OF SCBT% MOV S.CSR(R4),R2 ;GET ADDRESS OF CSRE/ MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFERV, MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS 8 BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION EXECUTED? 51$: BNE 130$ ;IF NE YES T TST (R2) ;ANY ERRORS? V BPL 65$ ;IF PL NO 4* MOV -2(R2),R1 ;SAVE ERROR STATUS REGISTER053$: MOV S.PKT(R4),R0 ;GET I/O PACKET ADDRESS & BITB #IQ.X,I.FCN(R0) ;INHIBIT RETRIES BNE 80$ ;IF NE YES" DECB RTTBL(R3) ;ANY MORE RETRIES? BLE 80$ ;IF LE NOT" MOV #1,(R2) ;CLEAR CONTROLLER 9 CLRB RTTBL+1(R3) ;CLEAR POSSIBLE DRIVE RESET IN PROGRESSL*55$: BIT #110000,R1 ;DRIVE RESET REQUIRED? BEQ 70$ ;IF EQ NO M560$: MOVB #1,RTTBL+1(R3) ;SET DRIVE RESET IN PROGRESS1. MOVB S.ITM(R4),S.CTM(R4) ;RESET TIMEOUT COUNT, MOV S.PKT(R4),R1 ;GET ADDRESS OF I/O PACKET0 MOV I.PRM+10(R1),6(R2) ;SET PROPER DRIVE NUMBER MOV #515,(R2) ;RESET DRIVEB RETURN ;C165$: ASRB RTTBL+1(R3) ;DRIVE RESET IN PROGRESS?  BCC 75$ ;IF CC NO E!70$: JMP 30$ ;RETRY FUNCTION R;75$: BITB #IO.WLC&377,I.FCN(R1) ;WRITE WITH WRITE CHECK? V BNE 76$ ;IF NE YES - BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED?$ BEQ 110$ ;IF EQ NO276$: MOV U.BUF(R5),R1 ;GET CURRENT FUNCTION CODE - BIT #1*2,R1 ;WRITE OR WRITE CHECK FUNCTION? BEQ 110$ ;IF EQ NO- BIS #2*2,U.BUF(R5) ;SET WRITE CHECK FUNCTION * BIT #2*2,R1 ;WAS FUNCTION A WRITE CHECK? BNE 110$ ;IF NE YES 56 MOV #RETRY&377,RTTBL(R3) ;REINITIALIZE RETRY COUNT ' BR 70$ ;START WRITE CHECK OPERATION F R080$: MOV #IE.WLK&377,R0 ;ASSUME WRITE LOCK ERROR! BIT #20000,R1 ;WRITE LOCK ERROR?S BNE 110$ ;IF NE YES 5/ MOV #IE.WCK&377,R0 ;ASSUME WRITE CHECK ERROR 6 ASR R1 ;GOOD ASSUMPTION? T% BCS 110$ ;IF CS WRITE CHECK ERROR O, MOV #IE.VER&377,R0 ;SET UNRECOVERABLE ERROR0110$: MOV 2(R2),R1 ;GET WORDS LEFT TO TRANSFER , ASL R1 ;CONVERT TO BYTES LEFT TO TRANSFER 7 ADD U.CNT(R5),R1 ;CALCULATE BYTES ACTUALLY TRANSFERED N" MOV #1,(R2) ;CLEAR CONTROLLER (120$: CALL $IODON ;FINISH I/O OPERATION! JMP XXINI ;PROCESS NEXT REQUESTT;KE; DEVICE TIMEOUT RESULTS IN A CONTROL AND DRIVE RESET FOLLOWED BY THEC; I/O OPERATION BEING REPEATED UNLESS THE OPERATION WAS DIAGNOSTIC.MA; TIMEOUTS ARE USUALLY CAUSED BY POWERFAILURE BUT MAY ALSO BE THE7; RESULT OF A HARDWARE FAILURE.$;O9XXOUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP? O BEQ 125$ ;;;IF EQ NO / DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET? R BEQ 125$ ;;;IF EQ YES N MTPS #0 ;;;ALLOW INTERRUPTS  JMP 30$ ; /125$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY I5 BICB #US.SPU,U.STS(R5) ;;;RESET DRIVE SPINNING UP D( BIC #100,(R2) ;;;CLEAR INTERRUPT ENABLE MTPS #0 ;;;ALLOW INTERRUPTST. MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS- BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTIONE BEQ 140$ ;IF EQ TIMEOUT DURING ;NORMAL FUNCTION5130$: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASK ) BR 110$ ;DIAGNOSTIC PROCESSING COMPLETE,140$: MOV #110000,R1 ;SET FOR DRIVE RESET  BR 53$ ; .DSABL LSB  .END INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY I5 BICB #US.SPU,U.STS(R5) ;;;% .TITLE XXTAB DATA BASE FOR DEVICE XX .IDENT /02/ ; ; AUTHOR: Z; ; ; CHANGES:; ;; MODULE FUNCTION:; ! .PAGE ; BREAK PAGE FOR PREFACE' .SBTTL SYMBOL, MACRO, DATA DEFINITIONS# .LIST TTM ; TERMINAL LISTING MODE% .NLIST BEX ; SUPPRESS BIN EXTENSION ;; LOCAL SYMBOL DEFINITIONS:;' XXUCBL = XXND-XXST ; DEFINE UCB LENGTH ;; LOCAL MACROS:; ;; LOCAL DATA BLOCKS:; ; .PAGE" .SBTTL XXDCB DEVICE CONTROL BLOCK &$XXDAT:: 00ïtÓsíÕs´cÚµcÛ¶c�·c›’ ; GLOBAL LABEL FOR START OF% ; DATA BASE AND DCB; USED BY LOADU'$USRTB:: ; GLOBAL LABEL FOR FIRST DCB ; REQUIRED FOR RESIDENT ; DATA BASES OF USER DRIVERS $XXDCB:: ; START OF DCB FOR XX ; REQUIRED BY LOAD .WORD 0 ; LINK TO NEXT DCB! .WORD XXUCB ; LINK TO FIRST UCB .ASCII /XX/ ; DEVICE NAMET$ .BYTE 0,1 ; LOWEST, HIGHEST UNIT # .WORD XXUCBL ; LENGTH OF UCB .WORD 0 ; ADDR OF DDTO$ .WORD 177477 ; LEGAL F M BITS 0-15" .WORD 70 ; CONTROL F M BITS 0-15 .WORD 0 ; NO-OP F M BITS 0-15 " .WORD 177200 ; ACP F M BITS 0-15" .WORD 377 ; LEGAL F M BITS 16-31" .WORD 0 ; CONTROL F M BITS 16-31 .WORD 0 ; NO-OP F M BITS 16-31 .WORD 377 ; ACP F M BITS 16-31 .WORD 0 ; ADDR OF PCBR! ; END OF DEVICE CONTROL BLOCKT B .PAGE+ .SBTTL XXUCB UNIT CONTROL BLOCK DEFINITION  IXXST: ; START OF UCB ENTRIESI ; FOR LENGTH CALCULATION) .IF DF M$$MUP ; FOR MULTIUSER PROTECTIONO! .WORD 0 ; OWNING TT UCB ADDRESS. .ENDC#XXUCB: ; START (OFFSET 0) OF UCBO .WORD $XXDCB ; BACK PTR TO DCB .WORD .-2 ; REDIRECT UCB PTR ; POINTS TO SELF INITIALLY .BYTE UC.ALG!UC.NPR!UC.PWF!1. ; DEFINE CONTROL FLAGS# .BYTE US.MNT ; DEFINE UNIT STATUS .BYTE 0 ; PHYSICAL UNIT # ( .BYTE US.OFL ; DEFINE MORE UNIT STATUS) .WORD DV.DIR!DV.MNT!DV.F11!DV.UMD!DV.MSDO ; DEFINE CHARACTERISTICS .WORD 0 ;  .WORD 4800. ; # OF BLOCKS .WORD 512. ; U.CW4 .WORD XXSCB ; PTR TO SCB .WORD 0 ; TCB ADDR OF TASK .WORD 0 ; DEVICE .WORD 0 ; DEPENDENDENT .WORD 0 ; DATA .WORD 0 ; .WORD 0 ; .WORD 0 ;P .WORD 0 ;N ; DISK PARAMETER WORDS$ .BYTE 12. ; # OF SECTORS PER TRACK% .BYTE 2. ; # OF TRACKS PER CYLINDER ( .WORD 200. ; # OF CYLINDERS PER VOLUMEXXND = . ; END OF UCB  E ; UCB FOR UNIT # 2) .IF DF M$$MUP ; FOR MULTIUSER PROTECTIONI! .WORD 0 ; OWNING TT UCB ADDRESS. .ENDCXX1: .WORD $XXDCB ; BACK PTR TO DCB .WORD .-2 ; REDIRECT UCB PTR ; POINTS TO SELF INITIALLY .BYTE UC.ALG!UC.NPR!UC.PWF!1N ; DEFINE CONTROL FLAGS# .BYTE US.MNT ; DEFINE UNIT STATUS0 .BYTE 1 ; PHYSICAL UNIT #K( .BYTE US.OFL ; DEFINE MORE UNIT STATUS) .WORD DV.DIR!DV.MNT!DV.F11!DV.UMD!DV.MSDC ; DEFINE CHARACTERISTICS .WORD 0 ;  .WORD 4800. ; # OF BLOCKSC .WORD 512. ; U.CW4 .WORD XXSCB ; POINTER TO SCB .WORD 0 ; TCB ADDR OF TASK .WORD 0 ; DEVICE .WORD 0 ; DEPENDENT .WORD 0 ; DATA .WORD 0 ; .WORD 0 ; .WORD 0 ;P .WORD 0 ;N ; DISK PARAMETER WORDS$ .BYTE 12. ; # OF SECTORS PER TRACK% .BYTE 2. ; # OF TRACKS PER CYLINDER ( .WORD 200. ; # OF CYLINDERS PER VOLUME ; END OF UCB FOR UNIT 1E I .PAGE& .SBTTL XXKRB CONTROLLER REQUEST BLOCK C# .BYTE PR5 ; XX RUNS AT PRIORITY 5D .BYTE 220/4 ; VECTOR / 4 .BYTE 0*2 ; CONTROLLER INDEX .BYTE 0 ; CONTROLLER I/O COUNT# .WORD 0!KS.OFL ; CONTROLLER STATUS  EXXKRB: ; START OF KRB .WORD 177404 ; CSR ADDRESS3 .WORD XXA-XXKRB ; OFFSET TO START OF UMR WORK AREA  .BYTE 1 ; HIGHEST PHY UNIT # .BYTE 0 ; UNUSED .WORD 0 ; PTR TO OWNER UCB;S'; CONTIGUOUS S C B HERE FOR DEVICE XXD; XXSCB: ; START OF SCB HERER( .WORD 0,.-2 ; HEAD OF I/O QUEUE, FIRST ; WORD 0, SECOND POINTS TO ; FIRST  P .IF DF M$$PRO ; MULTIPROCESSORR .WORD 0 ; FORK UNIBUS RUN MASK .ENDC 0 .WORD 0 ; FORK LINK WORD .WORD 0 ; FORK PCO .WORD 0 ; FORK R5R .WORD 0 ; FORK R4 ; END OF FORK BLOCKE  .WORD 0 ; KISAR5 .WORD 0 ; I/O PACKET ADDRESS" .BYTE 0 ; CURRENT TIME-OUT COUNT" .BYTE 4 ; INITIAL TIME-OUT COUNT .BYTE 0 ; CONTROLLER STATUS  .BYTE 0 ; STATUS EXTENSION 3# .WORD S2.CON ; STATUS EXTENSION 20 ; CONTIGUOUS ALLOCATIONR ; OF SCB/KRB IS USED .WORD XXKRB ; KRB ADDRESS.# .BYTE 8. ; # OF REGISTERS TO PASSD/ .BYTE 374 ; OFFSET FROM CSR TO FIRST REGISTER  .WORD 0 ; NOT USED- .IF DF M$$EXT ; FOR EXTENDED MEMORY SUPPORT $ .BLKW 6 ; MAPPING ASSIGNMENT BLOCK .WORD 0 ; KE.RHB .ENDC)XXA: ; END OF MAPPING ASSIGNMENT BLOCKR  E .PAGE) .SBTTL XXCTB 00ï tð tñtàmçámýfáþfDATACONTROLLER TABLE DEFINITIONY 0 .WORD 0 ; LINK TO FIRST ICB0" CTB ; MACRO FOR SYSTEM CTB LINK ; REQUIRED FOR RESIDENT ; DATA BASES OF USER DRIVERS% .WORD 0 ; ZERO FOR LAST CTB IN LISTD( .ASCII /XX/ ; DEFINE UNIQUE CONTROLLER& .WORD $XXDCB ; ADDRESS OF DCB FOR XX .BYTE 1 ; 1 CONTROLLER (1 KRB) .BYTE 0 ; STATUS IS ZERO&$XXCTB:: ; GLOBAL LABEL FOR LOAD AND ; INTSV$ MACRO .WORD XXKRB ; LINK TO KRB : ; END OF CTB DEFINITIONN($XXEND:: ; GLOBAL LABEL TO MARK END OF ; DATA BASE FOR LOAD .END.WORD 0 ; LINK TO FIRST ICB0" CTB ; MACRO FOR SYSTEM CTB LINK ; REQUIRED FOR RESIDENT ; DATA BASES OF USER DRIVERS% .WORD 0 ; ZERO FOR LAST CTB IN LISTD( .ASCII /XX/ ; DEFINE UNIQUE CONTROLLER& .WORD $XXDCB ; ADDRESS OF DCB FOR XX .BYTE 1 ; 1 CONTROLLER (1 KRB) .BYTE 0 ; STATUS IS ZERO&$XXCTB:: ; GLOBAL LABEL FOR LOAD AND ; INTSV$ MACRO .WORD XXKRB ; LINK TO KRB : ; END OF CTB DEFINITIONN($XXEND:: ; GLOBAL LABEL TO MARK END –,¿¿  @N zSYSYSYSYTICLz  ðzzVxè–è–è–è–x9Œ9ˆ¿ € *ÀŒææÿˆ–,¿¿  @N zSYSYSYSYTICL00ñtòtót´cÚµcÛ¶c�·c›’z  ðzzVxè–è–è–è–x9Œ9ˆ¿ € * ÀŒææÿˆ–,¿¿  @N zSYSYSYSYTICLz  ðzzVxè–è–è–è–x9Œ9ˆ¿ € *ÀŒææÿˆ–,¿¿  @N zSYSYSYSYTICL00ótôtõtöt÷tø tþfDATAz  ðzzVxè–è–è–è–x9Œ9ˆ¿ € *ÀŒææÿˆ A flea and a fly in a flue,) Were trapped and didn't know what to do. Said the fly, "Let us flee!" Said the flea, "Let us fly!") So they flew through a flaw in the flue.Time flies like an arrow.Space flies like a bow.Fruit flies like a banana. What romm ? - Shickard conference room.st typed a memo and e inneting.P�r� �@ T�hvx€L“• •è“(”D”~”’”œ”Ĕؔì”ö”„“ “:•V•n•†•˜•æ•ö• !!@ ¶•¨•°•bdh€vx^`¬†°´STOP PAUSE â˜__Only I did what you told me.I only did what you told me.I did only what you told me.I did what only you told me.I did what you only told me.I did what you told only me.I did what you told me only.!I did what you told me. Only ...51(The physics police always get their man.'Mysteries are not necessarily miracles.R!Little acorns from big oaks drop.)Nothing is so useless as a general maxim.2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2 | |2 | Hello. |2 | |2 | You are now logged in on the |2 | RSX-11M-PLUS Operating System. |2 | |2 | This is the USER account. Nothing |2 | that you do in this account can do |2 | any harm either to the system, or to |2 | this account. |2 | |2 | Use this account with the terminal |2 | warm-up session described in the book |2 | Introduction to RSX-11M-PLUS. |2 | |2 | Take it easy. |2 | |2 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>any harm either to the system, or 00ù"ttót´cÚµcÛ¶c�·c›’) ^^* ^^^+ ^^^^^^, ^^^^^^^- ^^^^^^^^^ . ^^^^^^^^^^^/ ^^^^^^^^^^^^^^0 ^^^^^^^^^^^^^^^1 ^^^^^^^^^^^^^^^^^^2 ^^^^^^^^^^^^^^^^^^^3 ^^^^^^^^^^^^^^^^^^^^^ 4 ^^^^^^^^^^^^^^^^^^^^^^^5 ^^^^^^^^^^^^^^^^^^^^^^^^^^6 ^^^^^^^^^^^^^^^^^^^^^^^^^^^7 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 8 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^9 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ < ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^= ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^A ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^B ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ D ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^E ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^F ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^G ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^H ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^I ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^J ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^K ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ L ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^M ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^N ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^O ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^O ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^M ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^K ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^H ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^F ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^D ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^B ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^< ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^8 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^6 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^4 ^^^^^^^^^^^^^^^^^^^^^^^^2 ^^^^^^^^^^^^^^^^^^^^0 ^^^^^^^^^^^^^^^^. ^^00ù*ttõtöt÷tø tþfDATA^^^^^^^^^^, ^^^^^^^^* ^^^^) ^^^) ^^^) ^^^) ^^ ) ^^) ^^^ ^^^^^^^^^^^^^^^^7 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^J ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^P^^^^^^^^ ^ ^^^ ^^^ ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^P^^^^^^^ ^^ ^^^ ^^^^ ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^P^^^^^^^ ^^ ^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^P^^^^^^^ ^^^ ^ ^ ^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^P^^^^^^^ ^^^^ ^^^^^ ^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^P^^^^^^^ ^^^^^ ^^^ ^^ ^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^ ^^^ ^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^P^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^ digital ^^^^^^^^^^^^^^^^^^^^^^^^^00ù2ttót´cÚµcÛ¶c�·c›’^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^O^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^N^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^M^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^L^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^K^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^J^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^I^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^H^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^G^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^F^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^E^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^D^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^A^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^A^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^?^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^>^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^:^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^9^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^8^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^7^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^6^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^5^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^4^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^3^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^2^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^0^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^.^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^(^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^$^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^F^ yow!^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^(^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^2^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^F^^^^^^^^^^^^^^^^00ù:tú;ttöt÷tø tþfDATA^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^P^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^F^ yow!^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^(^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^2^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^F^^^^^^^^^^^^^^^^0 FILES IN THE USER DIRECTORYFSome of the files in the RSX-11M-PLUS USER directory are used with theIntroduction to RSX-11M-PLUS.FAll files in the USER directory are protected so they cannot be:accidentally deleted. Here is a description of the files.FBATCH.BAT;1 A sample batch file used in the Introduction to illustrate batch command files.ECLEAN.CMD;1 An indirect command file for eliminating files created in > the terminal warm-up session. Do not invoke this file while5 a new user is in the course of the warm-up session. JCLKGEN.CMD;1 This indirect command file allows you to customize CLOCK.MAC.DDELETE.CMD;1 This indirect command file prints the latest version of= selected files on your terminal and deletes all versions ifi you wish.CHLOGIN.CMD;1 This indirect command file is executed each time you log in.2 It sets the terminal to DCL and types HELLO.TXT.IMYDISK.CMD;1 This indirect command file can be used to get a new disk ? ready to use. It shows how to do it and also illustrates how- Indirect works.GJSHAVE.CMD;1 An indirect command file to be passed to the BROADCAST command0 as described in the terminal warm-up session.ESHOW.CMD;1 This indirect command file is used in the terminal warm-ups8 session. It issues three SHOW commands in succession.>BMDRV.MAC;1 Source file for advanced I/O driver. Use with the. RSX-11M-PLUS Guide to Writing an I/O Driver.<BMTAB.MAC;1 Data base for advanced I/O driver. Use with the. RSX-11M-PLUS Guide to Writing an I/O Driver.HCLOCK.MAC;1 This source file was prepared as a programming exercise by a? member of the RSX-11M/M-PLUS documentation group. It runs onm? a video terminal printing the time in large characters on thet screen. BHIYA.MAC;1 A source file written in MACRO-11 Assembly Language for( use with the terminal warm-up session.CSTARS.MAC;1 A source file written in MACRO-11 Assembly Language for( use with the terminal warm-up session.GTMCLI.MAC;1 Simple sample CLI as described in the RSX-11M/M-PLUS System.& Management Guide. MACRO-11 version.GTMCLI.FTN;1 Simple sample CLI as described in the RSX-11M/M-PLUS Systemo; Management Guide. FORTRAN version. Compatible with allg DIGITAL FORTRAN compilers.HXXDRV.MAC;1 Source file for sample XX I/O driver. Use with RSX-11M-PLUS! Guide to Writing an I/O Driver.oFXXTAB.MAC;1 Data base for sample XX I/O driver. Use with RSX-11M-PLUS! Guide to Writing an I/O Driver.eJERROR.TSK;1 Demonstration of exit-with-status. This task does nothing but> exit with a status of ERROR. Use with the three other tasks, to test tasks that respond to exit status.KSEVERE.TSK;1 Demonstration of exit-with-status. This task does nothing butI% exit with a status of SEVERE ERROR.oLSUCCESS.TSK;1 Demonstration of exit-with-status. This task does nothing but exit with a status of SUCCESS.LWARNING.TSK;1 Demonstration of exit-with-status. This task does nothing but exit with a status of WARNING.DFLU.TXT;1 This file is used in the Introduction to illustrate the" DIRECTORY command and wildcards.CFLY.TXT;* These three files are used in the Introduction to11 illustrate the DIRECTORY command and wildcards. DHELLO.TXT;1 This file contains the text you see each time you log in to the USER account.DLONG.TXT This file is used in the Introduction to illustrate CTRL/O and CTRL/C. NWHATSHERE.TXT;1 The file you are now reading. It identifies all files in this00úBtûEtt´cÚµcÛ¶c�·c›’ directory.BERASE.MAC;1 Demonstrates and tests the RMS-11 $ERASE function, oneBERASE.TSK;1 of the new directory and wildcard functions of RMS-11.2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.a>GSA.MAC;1 Demonstrates how to extend an RMS-11 task in case of7 pool exhaustion. See Chapter 7 of the RSX-11M/M-PLUST" RMS-11 Macro Programmer's Guide.BPARSE.MAC;1 Demonstrates and tests the RMS-11 $PARSE function, oneBPARSE.TSK;1 of the new directory and wildcard functions of RMS-11.2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.SDRENAME.MAC;1 Demonstrates and tests the RMS-11 $RENAME function, oneCRENAME.TSK;1 of the new directory and wildcard functions of RMS-11.2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.uDSEARCH.MAC;1 Demonstrates and tests the RMS-11 $SEARCH function, oneCSEARCH.TSK;1 of the new directory and wildcard functions of RMS-11.t2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.. See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.SDRENAME.MAC;1 Demonstrates and tests the RMS-11 $RENAME function, oneCRENAME.TSK;1 of the new directory and wildcard functions of RMS-11.2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Programmer's Guide.uDSEARCH.MAC;1 Demonstrates and tests the RMS-11 $SEARCH function, oneCSEARCH.TSK;1 of the new directory and wildcard functions of RMS-11.t2 See Chapter 7 of the RSX-11M/M-PLUS RMS-11 Macro Progra" .Title GSA - Core space allocator .Ident /V02.00/;; COPYRIGHT (c) 1983 BY); DIGITAL EQUIPMENT CORPORATION, MAYNARD(; MASSACHUSETTS. ALL RIGHTS RESERVED.; 6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE6; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE6; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER6; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE6; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; 6; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO6; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED6; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.; 6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR6; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS; NOT SUPPLIED BY DIGITAL.; T;O3; Copyright (C) 1982, Digital Equipment CorporationE ; Maynard, Massachusetts 01754;N4; **-GSA - Dynamic memory allocation for RMS-11 pool;S; John Gemignani, Jr.!; RSX/RMS-11 Development ; March 11, 1982 ;N;W); Called by RMS-11 to manage pool space.D,; In the event of pool exhaustion, the task/; image will be extended to obtain more space.L; /; May be called by user written code providingA(; the interface standard is adhered to.;I ; Interface:; Request space:9<; R0 -> RMS/user Pool list head (maintained by RL/CQB)/; R1 := Amount of space requested (bytes)f<; R2 := 0 (differentiates between request and release);X; Release space:7; R0 -> RMS Pool list head (maintained by RL/CQB)o4; R1 := Amount of space to be released (bytes)(; R2 -> Base address (for release);t; ; Returns:5; C-Bit "set" if an error has occurred (failure) 5; C-Bit "clear" if no error has occurred (success)e; .Enabl LC .Enabl GBL  .Mcall Extk$S .Page! .Sbttl Control block definitionsR .Psect GSA$$D,RW,De;e; GSA internal data:; 9; GSABAS - Base address for the next memory allocation.l7; Initially set to zero, it will be assignedd4; the first address outside of the task's$; current address limits.6; GSAMIN - Decimal value reflecting the minimum size6; (in bytes) to extend the task in order to'; provide space to the pool.7; GSAREQ - Requested pool block number. If a request6; for the 'GSAMIN' fails, then the original8; 00ûJt;ttöt÷tø tþfDATA allocation size will be attempted. If that6; fails, then there is no more memory left.;yGSABAS:: ; GSA base addressd& .Word 000000 ; (for next allocation)GSAMIN:: ; Minimum allocatione% .Word 512./64. ; (in 32-word blocks)l!GSAREQ:: ; Size of this request+ .Word 000000 ; (if 'GSAMIN' extends fail)  .Page .Sbttl GSA Initialization codeo .Psect GSA$$I,RO,Ie;p; GSA Initialization;e7; This code is entered when GSA is entered with GSABASg8; set to zero. In order to be able to build valid pool9; header tables, GSABAS must be properly initialized and.; maintained.;;:; Initialization consists of finding the size of the task:; in 32-word units, and converting that value to a usable:; 16-bit address (which corresponds to the address of the;; next task extension (Extk$S) call. Once GSABAS has beenn*; initialized, GSAINI will not be reused.;pGSAINI:t$ Mov R0,-(SP) ; R0-2 will be used to' Mov R1,-(SP) ; communicate with $INIDMt( Mov R2,-(SP) ; NOTE: $INIDM uses EXTSK.;o6; The following code will use $INIDM to initialize the;; dynamic memory. Contrary to documentation, R1 will returnd9; the first address following the task image, and R2 willn9; return the size of the "free" memory from that address.n;t8; NOTE: $INIDM and EXTSK reside in LB:[1,1]VMLIB for RSX:; systems, and in LB:[1,1]SYSLIB for RSTS/E systems.;u; $INIDM interface: ; Calls:; R0 -> Pool list headv;, ; Returns:"; R0 -> First address in task%; R1 -> First address AFTER tasko7; R2 := Size of free core after task (based at R1) ;o) Call $INIDM ; Initialize dynamic memoryd) Mov R1,GSABAS ; Setup the "free" addressa% Mov (SP)+,R2 ; Restore the registerst Mov (SP)+,R1 ;f Mov (SP)+,R0 ;n Return ; And return to GSAr .Page .Sbttl GSA Mainline code  .Psect GSA$$M,RO,I];B; GSA Mainline;.6; Entry point is "GSA", with registers 0-2 loaded as; described above.;uGSA:: ;-:; First, determine if dynamic memory has been initialized.;; GSABAS (initially set to zero) will be non-zero if $INIDM :; has been called and the memory list initialized. On RSX7; based systems it is possible to install tasks with anr<; extension (/INCREMENT). $INIDM will detect this and setup*; the first memory entry in the pool list.; :; A point to note: If the RSX task has been installed with9; the non-checkpointable (/-CP) flag, then EXTKs will nots9; return success. If it is necessary to install the taski<; non-checkpointable, then the task should be installed with; and increment value.;z* Tst GSABAS ; Dynamic memory initialized? Bne 10$ ; Yes if NE, proceed* Call GSAINI ; Otherwise, initialize pool10$:; .; Determine if this call involves real memory.3; R1 should contain the size (in bytes) of the core.2; block requested or to be released. If zero then8; return to the caller without an error (TST leaves CC).;s Tst R1 ; Real memory?s& Bne 20$ ; Yes if NE, then process it) Return ; Otherwise return with successu20$:;e3; If this call is a request for space, pass controlD6; to the allocation routines. Otherwise, pass control4; to the system deallocation module $RLCB. There is2; no need to return, so control is passed via JMP.;' Tst R2 ; Address specified? (release)t) Beq 30$ ; No if EQ, then it's a requeste- Jmp $RLCB ; Otherwise it's a release; do itt30$:;T; Save our current context: ; R0 = Pool list head$ ; R1 = Size of memory required; R2 = 0 (signifies request);c Mov R0,-(SP)e Mov R1,-(SP)l Mov R2,-(SP)o;c-; Attempt an allocation from the current pool ,; If this is successful, pass control to the; common exit.;C! Call $RQCB ; Try the allocation Bcc 70$ ; CC signifies success;R8; Now that the initial allocation failed, we must extend7; the task and give the new area (extended into) to thea7; caller. To do this, the following procedure is used: ;=; 1. The task is extended*; 2. The 00ûRtüXtt´cÚµcÛ¶c�·c›’area extended is returned to the2; pool specified as if a release was attempted,; 3. We retry the allocation operation, but0; this time it should succeed, since we have); increased the size of the pool areal;R8; NOTE: $RQCB has a bad habit of nuking registers, so it3; becomes necessary to save and restore them arounde; unsuccessful calls.k;d' Mov 2(SP),R1 ; Obtain the request size;l6; Determine what the requirement is in 32-word blocks.2; Retain this value to allow GSA to decide whether/; to issue further task extension directives inr$; order to satisfy the requirements.;a! Add #63.,R1 ; Round the requestt Asr R1 ; to a 32-word boundary! Asr R1 ; Then convert the value  Asr R1 ; to the number of  Asr R1 ; 32-word blocks. Asr R1s Asr R1e# Mov R1,GSAREQ ; Save the real sizeh;o3; We will allocate core to the pool in "reasonable"b5; increments to cut down on system overhead, and pooli6; fragmentation. This is accomplished by using either7; the requested size, or "GSAMIN", whichever is LARGER.o3; If the request is unsuccessful, and the amount is.9; smaller than GSAMIN, then request that particular size. ;w& Cmp R1,GSAMIN ; Smaller than minimum?" Bhi 40$ ; No if HI, use it as is% Mov GSAMIN,R1 ; Otherwise use GSAMIN40$:;M1; Now we attempt to extend the task by that size. 0; If the request fails, then use the size of the0; original request. If that also fails, then we; simply ran out of memory.o;i Extk$S R1 ; Extend the tasks Bcc 60$ ; CC if successful! Cmp R1,GSAREQ ; Is this request? Blos 50$ ; Yes if LOS, the end% Mov GSAREQ,R1 ; Otherwise try to uset Br 40$ ; the actual requestR50$: Sec ; Mark failureu Br 70$ ; And exit ; 5; The task has been extended, now this memory must be-; released to the pool for future allocation.a3; To do this, we setup the registers as if RMS weref3; going to release the core, and call ourself to doe3; the work. When the area has been released to thex4; pool, we will return inline and proceed to reenter8; our code again from start to reattempt the allocation.;60$: Mov 4(SP),R0 ; Setup the PLH Asl R1 ; Convert the realR Asl R1 ; size to the actual Asl R1 ; 16-bit size that Asl R1 ; was allocated.d Asl R1 ; The virtual address Asl R1 ; should be after the# Mov GSABAS,R2 ; task (which is nowe" Add R1,GSABAS ; part of the task)$ Call GSA ; Call ourself to release;e5; At this point, the new memory has been added to the3; pool, and is available for use. We now reattempt"; to allocate the memory required.;t% Mov (SP)+,R2 ; Restore our registersR$ Mov (SP)+,R1 ; to the initial state' Mov (SP)+,R0 ; upon entry, and reenter# Br GSA ; as if it's a new requestR;w;; Common exit. Leave the registers in their current state,o#; and return control to the caller.s;w70$:# Inc (SP)+ ; These won't alter thes+ Bit (SP)+,(SP)+ ; C-bit, so status remainse! Return ; unchanged upon returna .Endd to the3; pool .TITLE SEARCH - $SEARCH TEST  .IDENT /X01.00/;U; COPYRIGHT (c) 1983 BYN); DIGITAL EQUIPMENT CORPORATION, MAYNARD (; MASSACHUSETTS. ALL RIGHTS RESERVED.; .6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE6; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE6; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER6; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE6; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; 6; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO6; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED6; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.; 6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR6; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS; NOT SUPPLIED BY DIGITAL.; T .ENABL LC .MCALL FAB$B,NAM$B,GSA$- .MCALL $PARSE,$SEARCH,$STORE,$FETCH,$COMPAREL .MCALL ALUN$S,QIOW$,DIR$,EXIT$S; ,; 00üZt;ttöt÷tø tþfDATAThis program tests/demonstrates the use of; the RMS-11 $SEARCH function.;I;N; RMS-11 Data Structures; GSA$ GSAWFAB:: FAB$B ; Argument FAB# F$DNA SYDSKA ; If no device, SY: F$DNS SYDSKL ; should be used F$NAM NAM ; Link to NAM F$LCH 2. ; Channel #2 FAB$ENAM:: NAM$B ; NAM definition! N$ESA EXPSTR ; EXP STR addressB N$ESS 128. ; EXP STR length! N$RSA RESSTR ; RES STR addressP N$RSS 128. ; RES STR length NAM$E .PSECT $CODE$,RO,IXSEARCH::( ALUN$S #1,#"TI,#0 ; Assign the terminal" MOV #FAB,R0 ; Map the target FAB# MOV #EDBLK,R2 ; Map the exit block " MOV #NAM,R3 ; Map the target NAM! MOV #READ,R4 ; Map the input DPB # MOV #WRITE,R5 ; Map the output DPBd) CLR Q.IOPL+4(R5) ; Turn off carriage ctlC MOV #QUES,Q.IOPL(R5)B MOV #QUESL,Q.IOPL+2(R5) DIR$ R5 ; Prompt for the DNA TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error, $STORE IOLEN,FNS,R0 ; Set the string length- $STORE #BUFF,FNA,R0 ; Set the string address / MOV #40,Q.IOPL+4(R5); Restore carriage controlu$ CLR FILCNT ; Init count of matches $PARSE R0 ; Parse the stringso $COMPARE #0,STS,R0 ; An error?P# BLT ERROR ; Yes if MI; display itRGETFIL:r* MOV #EDBLK,R2 ; Reset the edit block addr" $SEARCH R0 ; Get a matching file $COMPARE #0,STS,R0 ; Error? BLT ERROR ; Yes if LT  CLR (R2) ; Init the length+ $FETCH (R2),RSL,R3 ; Get the string lengthr TST (R2)+ ; Advance0- $FETCH (R2)+,RSA,R3 ; Get the string address;* MOV #RSSSTR,R1 ; Select the format string' TST FILCNT ; First file needs a blankN BNE NOTFST ; line before itA$ MOV #RSSST1,R1 ; Insert CR/LF firstNOTFST:R CALL PRINT ; Display the file $ MOV #FAB,R0 ; Rest the FAB address INC FILCNT ; Count this file# BR GETFIL ; And let's try anothereEXIT:R EXIT$S ; Task exitBERROR:+ $COMPARE #ER$NMF,STS,R0 ; No more matches?$$ BNE ERROR0 ; No - some other error, MOV FILCNT,(R2)+ ; Set the cound of matches BEQ ERROR2 ; No files... CLR (R2) ; Give the ESAt$ $FETCH (R2),ESL,R3 ; Set the length TST (R2)+ ; Advance word% $FETCH (R2),ESA,R3 ; Set the address1' MOV #TTLSTR,R1 ; Set the format string ! BR ERROR1 ; Go show it and exitAERROR2:e% CLR -(R2) ; Setup for string lengtht$ $FETCH (R2),ESL,R3 ; Set the length" TST (R2)+ ; Advance to next word% $FETCH (R2),ESA,R3 ; Set the addressT' MOV #NOFILE,R1 ; Set the format stringN BR ERROR1 ; Print the errorNERROR0: + $FETCH (R2)+,STS,R0 ; Set the STS returnedi! $FETCH (R2),STV,R0 ; And the STV- MOV #ERRSTR,R1 ; Set the error format string+ERROR1:c, CALL PRINT ; Go edit and print the message# JMP SEARCH ; Let's try this againrPRINT: MOV #EDBLK,R2 ; Setup editA MOV #BUFFER,R0 ; Output buffero CALL $EDMSG ; Exit the stringL MOV #BUFFER,Q.IOPL(R5)T MOV R1,Q.IOPL+2(R5) DIR$ R5 ; Send to the terminal RETURN ; Return to caller .PSECT $DATA$,RW,DNSYDSKA: .Ascii "SY:" SYDSKL = . - SYDSKA2QUES: .Ascii <15><12>"Enter a wildcard filespec: " QUESL = . - QUESh0ERRSTR: .Asciz "$SEARCH error -- STS=%P, STV=%P"RSSST1: .Ascii "%N" RSSSTR: .Asciz " %VA"*NOFILE: .Asciz "%NNo files matching %VA%N"3TTLSTR: .Asciz "%NTotal of %D files matching %VA%N"V .EVENFILCNT: .WORD 0eEDBLK: .BLKW 6BUFFER:tBUFF: .Blkb 128.EXPSTR: .BLKB 128.RESSTR: .BLKB 128.IOSTAT: .WORD 0dIOLEN: .WORD 0READ: QIOW$ IO.RLB,1,1,,IOSTAT'WRITE: QIOW$ IO.WLB,1,1,,IOSTAT,,<,,40>i .END SEARCH= . - SYDSKA2QUES: .Ascii <15><12>"Enter a wildcard filespec: " QUESL = . - QUESh0ERRSTR: .Asciz "$SEARCH error -- STS=%P, STV=%P"RSSST1: .Ascii "%N" RSSSTR: .Asciz " %VA"*NOFILE: .Asciz "%NNo files matching %VA%N"3TTLSTR: .Asciz "%NTotal of %D files matching %VA%N"V .EVENFILCNT: .WORD 0eEDBLK: .BLKW 6BUFFER:tBUFF: .Blkb 128.EXPSTR: .BLKB 128.RESSTR: .BLKB 128.IOSTAT: .WORD 0dIOLEN: .WORD 0READ: QIOW$ IO.RLB,1,1,,IOSTAT'WRITE: QIOW$00ýbtXtt´cÚµcÛ¶c�·c›’ .TITLE RENAME - $RENAME TEST .IDENT /X01.00/;; COPYRIGHT (c) 1983 BY); DIGITAL EQUIPMENT CORPORATION, MAYNARD(; MASSACHUSETTS. ALL RIGHTS RESERVED.; 6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE6; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE6; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER6; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE6; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; 6; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO6; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED6; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.; 6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR6; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS; NOT SUPPLIED BY DIGITAL.; T .ENABL LC .MCALL FAB$B,NAM$B,GSA$: .MCALL $PARSE,$SEARCH,$RENAME,$STORE,$FETCH,$COMPARE,$SET .MCALL ALUN$S,QIOW$,DIR$,EXIT$S;W,; This program tests/demonstrates the use of; the RMS-11 $RENAME function.;S;T; RMS-11 Data Structures;E GSA$ GSACFAB1:: FAB$B ; Old file name F$DNA SYDSKA ; Default to SY: F$DNS SYDSKL F$NAM NAM1 ; Link to NAM1 F$LCH 2. ; Channel #2 FAB$ENAM1:: NAM$B ; NAM definitionE! N$ESA ESSTR1 ; EXP STR addressI N$ESS 128. ; EXP STR length! N$RSA RSSTR1 ; RES STR addressL N$RSS 128. ; RES STR length NAM$EFAB2:: FAB$B ; New file name F$NAM NAM2 ; Link to NAM2 F$LCH 2. ; Same channel FAB$ENAM2:: NAM$B ; NAM definition! N$ESA ESSTR2 ; EXP STR address N$ESS 128. ; EXP STR length NAM$E .PSECT $CODE$,RO,IeRENAME::( ALUN$S #1,#"TI,#0 ; Assign the terminal" MOV #FAB1,R0 ; Map the target FAB# MOV #EDBLK,R2 ; Map the exit blockE! MOV #READ,R4 ; Map the input DPBI# MOV #WRITE,R5 ; Map the output DPB$) CLR Q.IOPL+4(R5) ; Turn off carriage ctl. MOV #QUES1,Q.IOPL(R5) MOV #QUES1L,Q.IOPL+2(R5)w DIR$ R5 ; Prompt for the DNA TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF1,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error- $STORE IOLEN,DNS,R0 ; Set the default lengthA/ $STORE #BUFF1,DNA,R0 ; Set the default addresst" $PARSE R0 ; Parse the input spec $COMPARE #0,STS,R0 ; An error?M BLT ERROR ; Yes if LTQ MOV #FAB2,R0 ; Map the 2d FAB MOV #QUES2,Q.IOPL(R5) MOV #QUES2L,Q.IOPL+2(R5)(# DIR$ R5 ; Prompt for the new name TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF2,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error- $STORE IOLEN,FNS,R0 ; Set the default length/ $STORE #BUFF2,FNA,R0 ; Set the default address/ MOV #40,Q.IOPL+4(R5); Restore carriage controlS$ CLR FILCNT ; Initialize file count! BR LOOP ; Enter the RENAME loopFEXIT:# EXIT$S ; Task exit#LOOP:I! MOV #FAB1,R0 ; Get the input FABt" MOV #FAB2,R1 ; And the output FAB$ MOV #NAM1,R2 ; Setup NAM references MOV #NAM2,R3 ;L0 $SET #FB$FID,FOP,R0 ; Turn on explicit searches% $SEARCH R0 ; Attempt to find a fileB $COMPARE #0,STS,R0 ; Error? BLT SEAERR ; Yes if LT- $FETCH R4,RSA,R2 ; Get the resultant addresse' $STORE R4,DNA,R1 ; Set this as default(, $FETCH R4,RSL,R2 ; Get the resultant length* $STORE R4,DNS,R1 ; Set the default length* $RENAME R0,,,R1 ; Rename input as output $COMPARE #0,STS,R0 ; Error?$ BLT ERROR ; Yes if LT- investigate) MOV #EDBLK,R0 ; Setup to show the renameA CLR (R0) ;$ $FETCH (R0),RSL,R2 ; Set the length" TST (R0)+ ; Advance to next word& $FETCH (R0)+,RSA,R2 ; Set the address CLR (R0) ; $ $FETCH (R0),ESL,R3 ; Set the length" TST (R0)+ ; Advance to next word$ $FETCH (R0),ESA,R3 ; Set te address MOV #RENMSG,R1 ; Format stringe CALL PRINT ; Display itT INC FILCNT ; Count the file BR LOOP ; And try another fileERROR:# MOV #EDBLK,R2 ; Map the edit block+ $FETCH (R2)00ýjtþnttöt÷tø tþfDATA+,STS,R0 ; Set the STS returnedD! $FETCH (R2),STV,R0 ; And the STV- MOV #ERRSTR,R1 ; Set the error format stringg, CALL PRINT ; Go edit and print the message# JMP RENAME ; Let's try this againRSEAERR:3 $COMPARE #ER$NMF,STS,R0 ; End of wild card search?d BNE ERROR ; No if NE- show why# MOV #EDBLK,R0 ; Map the edit blockR TST FILCNT ; Any files?R# BNE TOTAL ; Yes if NE, show totalu MOV #NOFILE,R1 ; Show the totalSETES: CLR (R0) ;$ $FETCH (R0),ESL,R2 ; Set the length TST (R0)+ ; Advance;* $FETCH (R0)+,ESA,R2 ; Get the ESA address CALL PRINT ; JMP RENAME ; RepeathTOTAL:( MOV FILCNT,(R0)+ ; Set the rename count' MOV #TTLMSG,R1 ; Set the format stringt BR SETES ; Add ESA and print RPRINT: MOV #EDBLK,R2 ; Setup edite MOV #BUFFER,R0 ; Output bufferh CALL $EDMSG ; Exit the stringe MOV #BUFFER,WRITE+Q.IOPLA MOV R1,WRITE+Q.IOPL+2$ DIR$ #WRITE ; Send to the terminal RETURN ; Return to caller .PSECT $DATA$,RW,D)SYDSKA: .Ascii "SY:" SYDSKL = . - SYDSKAQUES1: .Ascii <15><12>"From: "e QUES1L = . - QUES1RQUES2: .Ascii <15><12>"To: "O QUES2L = . - QUES2)0ERRSTR: .Asciz "$RENAME error -- STS=%P, STV=%P"*RENMSG: .Asciz " File %VA renamed to %VA";TTLMSG: .Asciz "%NTotal of %D files matching %VA renamed%N"R*NOFILE: .Asciz "%NNo files matching %VA%N" .EVENFILCNT: .WORD 0EEDBLK: .BLKW 6BUFFER:.BUFF1: .BLKB 64.BUFF2: .BLKB 64 ESSTR1: .BLKB 128.ESSTR2: .BLKB 128.RSSTR1: .BLKB 128.IOSTAT: .WORD 0AIOLEN: .WORD 0READ: QIOW$ IO.RLB,1,1,,IOSTAT'WRITE: QIOW$ IO.WLB,1,1,,IOSTAT,,<,,40> .END RENAME5><12>"To: "O QUES2L = . - QUES2)0ERRSTR: .Asciz "$RENAME error -- STS=%P, STV=%P"*RENMSG: .Asciz " File %VA renamed to %VA";TTLMSG: .Asciz "%NTotal of %D files matching %VA renamed%N"R*NOFILE: .Asciz "%NNo files matching %VA%N" .EVENFILCNT: .WORD 0EEDBLK: .BLKW 6BUFFER:.BUFF1: .BLKB 64.BUFF2: .BLKB 64 ESSTR1: .BLKB 128.ESSTR2: .BLKB 128.RSSTR1: .BLKB 128.IOSTAT: .WORD 0AIOLEN: .WORD 0READ:  .TITLE ERASE - $ERASE TESTN .IDENT /X01.00/; ; COPYRIGHT (c) 1983 BYT); DIGITAL EQUIPMENT CORPORATION, MAYNARDS(; MASSACHUSETTS. ALL RIGHTS RESERVED.; O6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE6; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE6; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER6; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE6; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; 6; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO6; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED6; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.; 6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR6; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS; NOT SUPPLIED BY DIGITAL.; T .ENABL LC .MCALL FAB$B,NAM$B,GSA$, .MCALL $PARSE,$ERASE,$STORE,$FETCH,$COMPARE .MCALL ALUN$S,QIOW$,DIR$,EXIT$S;E,; This program tests/demonstrates the use of4; the RMS-11 $ERASE function, with implicit $SEARCH.;A;S; RMS-11 Data Structures;T GSA$ GSAHFAB:: FAB$B ; Argument FAB# F$DNA SYDSKA ; If no device, SY:O F$DNS SYDSKL ; should be used F$NAM NAM ; Link to NAM F$LCH 2. ; Channel #2 FAB$ENAM:: NAM$B ; NAM definition! N$ESA EXPSTR ; EXP STR address. N$ESS 128. ; EXP STR length! N$RSA RESSTR ; RES STR address$ N$RSS 128. ; RES STR length NAM$E .PSECT $CODE$,RO,IoERASE::d( ALUN$S #1,#"TI,#0 ; Assign the terminal" MOV #FAB,R0 ; Map the target FAB# MOV #EDBLK,R2 ; Map the exit blockT" MOV #NAM,R3 ; Map the target NAM! MOV #READ,R4 ; Map the input DPB # MOV #WRITE,R5 ; Map the output DPBd) CLR Q.IOPL+4(R5) ; Turn off carriage ctlC MOV #QUES,Q.IOPL(R5)B MOV #QUESL,Q.IOPL+2(R5) DIR$ R5 ; Prompt for the DNA TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TST00þrtÿxtt´cÚµcÛ¶c�·c›’B IOSTAT ; Check the IOSB BMI EXIT ; Exit if error, $STORE IOLEN,FNS,R0 ; Set the string length- $STORE #BUFF,FNA,R0 ; Set the string address / MOV #40,Q.IOPL+4(R5); Restore carriage controlu$ CLR FILCNT ; Init count of matches $PARSE R0 ; Parse the stringso $COMPARE #0,STS,R0 ; An error?P# BLT ERROR ; Yes if MI; display itRGETFIL:r* MOV #EDBLK,R2 ; Reset the edit block addr# $ERASE R0 ; Issue implicit $ERASEV $COMPARE #0,STS,R0 ; Error? BLT ERROR ; Yes if LT  CLR (R2) ; Init the length+ $FETCH (R2),RSL,R3 ; Get the string lengthr TST (R2)+ ; Advance;- $FETCH (R2)+,RSA,R3 ; Get the string addressS* MOV #RSSSTR,R1 ; Select the format string' TST FILCNT ; First file needs a blank  BNE NOTFST ; line before itS$ MOV #RSSST1,R1 ; Insert CR/LF firstNOTFST:  CALL PRINT ; Display the filef$ MOV #FAB,R0 ; Rest the FAB address INC FILCNT ; Count this file# BR GETFIL ; And let's try anotherVEXIT:R EXIT$S ; Task exitBERROR:+ $COMPARE #ER$NMF,STS,R0 ; No more matches?$$ BNE ERROR0 ; No - some other error, MOV FILCNT,(R2)+ ; Set the cound of matches BEQ ERROR2 ; No files... CLR (R2) ; Give the ESAt$ $FETCH (R2),ESL,R3 ; Set the length TST (R2)+ ; Advance word% $FETCH (R2),ESA,R3 ; Set the address1' MOV #TTLSTR,R1 ; Set the format string ! BR ERROR1 ; Go show it and exitAERROR2:e% CLR -(R2) ; Setup for string lengtht$ $FETCH (R2),ESL,R3 ; Set the length" TST (R2)+ ; Advance to next word% $FETCH (R2),ESA,R3 ; Set the addressT' MOV #NOFILE,R1 ; Set the format stringN BR ERROR1 ; Print the errorNERROR0: + $FETCH (R2)+,STS,R0 ; Set the STS returnedi! $FETCH (R2),STV,R0 ; And the STV- MOV #ERRSTR,R1 ; Set the error format string+ERROR1:c, CALL PRINT ; Go edit and print the message" JMP ERASE ; Let's try this againPRINT: MOV #EDBLK,R2 ; Setup editi MOV #BUFFER,R0 ; Output buffer  CALL $EDMSG ; Exit the stringE MOV #BUFFER,Q.IOPL(R5)T MOV R1,Q.IOPL+2(R5) DIR$ R5 ; Send to the terminal RETURN ; Return to caller .PSECT $DATA$,RW,DnSYDSKA: .Ascii "SY:" SYDSKL = . - SYDSKA)QUES: .Ascii <15><12>"File(s) to erase: "i QUESL = . - QUESR/ERRSTR: .Asciz "$ERASE error -- STS=%P, STV=%P" RSSST1: .Ascii "%N"1#RSSSTR: .Asciz " File %VA deleted"t*NOFILE: .Asciz "%NNo files matching %VA%N";TTLSTR: .Asciz "%NTotal of %D files matching %VA deleted%N"  .EVENFILCNT: .WORD 0MEDBLK: .BLKW 6BUFFER:MBUFF: .Blkb 128.EXPSTR: .BLKB 128.RESSTR: .BLKB 128.IOSTAT: .WORD 0nIOLEN: .WORD 0READ: QIOW$ IO.RLB,1,1,,IOSTAT'WRITE: QIOW$ IO.WLB,1,1,,IOSTAT,,<,,40>K .END ERASEQUES: .Ascii <15><12>"File(s) to erase: "i QUESL = . - QUESR/ERRSTR: .Asciz "$ERASE error -- STS=%P, STV=%P" RSSST1: .Ascii "%N"1#RSSSTR: .Asciz " File %VA deleted"t*NOFILE: .Asciz "%NNo files matching %VA%N";TTLSTR: .Asciz "%NTotal of %D files matching %VA deleted%N"  .EVENFILCNT: .WORD 0MEDBLK: .BLKW 6BUFFER:MBUFF: .Blkb 128.EXPSTR: .BLKB 128.RESSTR: .BLKB 128.IOSTAT: .WORD 0nIOLEN: .WORD 0READ: QIOW$  .TITLE PARSE - $PARSE TESTN .IDENT /X01.00/; COPYRIGHT (c) 1983 BYT); DIGITAL EQUIPMENT CORPORATION, MAYNARD(; MASSACHUSETTS. ALL RIGHTS RESERVED.; R6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE6; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE6; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER6; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE6; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; 6; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO6; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED6; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.; 6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR6; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS; NOT SUPPLIED BY DIGITAL.; T .ENABL LC .MCALL FAB$B,NAM$B,GSA$% .MCALL $PARSE,$STORE,$FETCH,$COMPAREA .MCALL ALUN$S,QIOW$,DIR$,EXIT$S; ,; This program t00ÿztnttöt÷tø tþfDATAests/demonstrates the use of; the RMS-11 $PARSE function.H;I;A; RMS-11 Data Structures; GSA$ GSA FAB:: FAB$B ; Argument FAB F$NAM NAM ; Link to NAM F$LCH 2. ; Channel #2 FAB$ENAM:: NAM$B ; NAM definition! N$ESA EXPSTR ; EXP STR addressU N$ESS 128. ; EXP STR length NAM$E .PSECT $CODE$,RO,I PARSE::D( ALUN$S #1,#"TI,#0 ; Assign the terminal" MOV #FAB,R0 ; Map the target FAB# MOV #EDBLK,R2 ; Map the exit blockQ" MOV #NAM,R3 ; Map the target NAM! MOV #READ,R4 ; Map the input DPB # MOV #WRITE,R5 ; Map the output DPBA) CLR Q.IOPL+4(R5) ; Turn off carriage ctl  MOV #QUES1,Q.IOPL(R5) MOV #QUES1L,Q.IOPL+2(R5)n DIR$ R5 ; Prompt for the DNA TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF1,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error- $STORE IOLEN,DNS,R0 ; Set the default lengthD/ $STORE #BUFF1,DNA,R0 ; Set the default address  MOV #QUES2,Q.IOPL(R5) MOV #QUES2L,Q.IOPL+2(R5) DIR$ R5 ; Prompt for the DNA TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error MOV #BUFF2,Q.IOPL(R4) MOV #64.,Q.IOPL+2(R4) DIR$ R4 ; Get the response TSTB IOSTAT ; Check the IOSB BMI EXIT ; Exit if error- $STORE IOLEN,FNS,R0 ; Set the default lengthR/ $STORE #BUFF2,FNA,R0 ; Set the default addressh/ MOV #40,Q.IOPL+4(R5); Restore carriage control, $PARSE R0 ; Parse the strings $COMPARE #0,STS,R0 ; An error?e# BLT ERROR ; Yes if MI; display it) CLR (R2) ; Init the length+ $FETCH (R2),ESL,R3 ; Get the string length  TST (R2)+ ; AdvanceE- $FETCH (R2)+,ESA,R3 ; Get the string addressM, $FETCH (R2),FNB,R3 ; Get the file name bits* MOV #ESSSTR,R1 ; Select the format string CALL PRINT ; Display the fileE# CALL BITS ; Do the FNB bit disply$" BR PARSE ; And let's try anotherEXIT:h EXIT$S ; Task exit;ERROR:+ $FETCH (R2)+,STS,R0 ; Set the STS returnedi! $FETCH (R2),STV,R0 ; And the STVr- MOV #ERRSTR,R1 ; Set the error format string(, CALL PRINT ; Go edit and print the message! BR PARSE ; Let's try this again BITS:E# MOV #EDBLK,R2 ; Init EDBLK addressn$ $FETCH R0,FNB,R3 ; Get the FNB bits BIT #2000,R0 ; Quoted string? BEQ 2$ ; No if EQa# MOV #QUO,(R2)+ ; Set Quoted stringf"2$: BIT #1000,R0 ; Wild directory? BEQ 4$ ; No if EQA$ MOV #WDI,(R2)+ ; Set wild directory4$: BIT #400,R0 ; Node spec?E BEQ 6$ ; No if EQt MOV #NOD,(R2)+ ; Set nodespec"6$: BIT #100,R0 ; Directory spec? BEQ 8$ ; No if EQo MOV #DIR,(R2)+ ; Set directoryd8$: BIT #40,R0 ; Wild name? BEQ 10$ ; No if eq MOV #WNA,(R2)+ ; Set wild name210$: BIT #20,R0 ; Wild type?  BEQ 12$ ; No if EQ MOV #WTY,(R2)+ ; Set wild typer 12$: BIT #10,R0 ; Wild version? BEQ 14$ ; No if EQ" MOV #WVE,(R2)+ ; Set wild version14$: BIT #4,R0 ; Name?f BEQ 16$ ; No if EQ MOV #NME,(R2)+ ; Set name16$: BIT #2,R0 ; Type? BEQ 18$ ; No if EQ MOV #TYP,(R2)+ ; Set type18$: BIT #1,R0 ; Version? BEQ 20$ ; No if EQ MOV #VER,(R2)+ ; Set versione'20$: MOV #END,(R2) ; End with a null...?% MOV #DEV,R1 ; Set the default (dev)  CALL PRINT ; Edit and printR RETURN ; And exitPRINT: MOV #EDBLK,R2 ; Setup edit  MOV #BUFFER,R0 ; Output bufferl CALL $EDMSG ; Exit the string MOV #BUFFER,Q.IOPL(R5)d MOV R1,Q.IOPL+2(R5) DIR$ R5 ; Send to the terminal RETURN ; Return to caller .PSECT $DATA$,RW,D7QUES1: .Ascii <15><12>"Enter the default name string: "# QUES1L = . - QUES1Q7QUES2: .Ascii <15><12>"Enter the primary name string: "V QUES2L = . - QUES2 /ERRSTR: .Asciz "$PARSE error -- STS=%P, STV=%P" 0ESSSTR: .Ascii "$PARSE expanded string is %VA%N", .Asciz " File name bits (FNB) are %P"DEV: .Asciz " (DEV%I"eNOD: .Asciz ", NOD%I"tDIR: .Asciz ", DIR%I"FNME: .Asciz ", NAM%I",QUO: .Asciz ", QUO%I" TYP: .Asciz ", TYP%I"VER: .Asciz ", VER%I"aWDI: .Asciz ", WDI%I"$WNA: .Asciz ", WNA%I" WTY: .Asciz ", WTY%I"uWVE: .Asciz ", WVE%I"EEND: .Asciz ")" .EVENEDBLK: .BL00ÿ‚tq‹tt´cÚµcÛ¶c�·c›’KW 16.BUFFER:aBUFF1: .Blkb 64.BUFF2: .Blkb 64UEXPSTR: .BLKB 128.IOSTAT: .WORD 0 IOLEN: .WORD 0READ: QIOW$ IO.RLB,1,1,,IOSTAT'WRITE: QIOW$ IO.WLB,1,1,,IOSTAT,,<,,40>n .END PARSEare %P"DEV: .Asciz " (DEV%I"eNOD: .Asciz ", NOD%I"tDIR: .Asciz ", DIR%I"FNME: .Asciz ", NAM%I",QUO: .Asciz ", QUO%I" TYP: .Asciz ", TYP%I"VER: .Asciz ", VER%I"aWDI: .Asciz ", WDI%I"$WNA: .Asciz ", WNA%I" WTY: .Asciz ", WTY%I"uWVE: .Asciz ", WVE%I"EEND: .Asciz ")" .EVENEDBLK: .BL .TITLE IOSUB  .IDENT /17.05/D;PL; COPYRIGHT (c) 1982, 1983, 1984, 1985 BY DIGITAL EQUIPMENT CORPORATION.$; BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.;V>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;C ; D. N. CUTLER 4-AUG-73  ;7- ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:K; ; J. R. KAUFFMAN; J. M. LAWLER; T. LEKAS;; B. S. MCCARTHY;M-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:.;; M. PETTENGILL ; H. HUANG; J. W. BERZLE; S. C. ADAMS ; P. K. M. WEISS ; T. LEKAS; B. S. MCCARTHY; L. M. MCCULLEY;; MODIFIED BY:;S!; J. W. BERZLE 13-NOV-85 17.00B;D); JWB168 -- CORRECT CONDITIONALIZATION ; "; B. S. MCCARTHY 7-MAR-87 17.01;4); BM387 -- IF WINDOW I/O MANAGEMENT ISU%; ENABLED, MANAGE W.IOC IN $IOFINF;#; B. S. MCCARTHY 15-MAR-87 17.02;S"; BM387 -- CORRECTIONS TO ABOVE;M#; B. S. MCCARTHY 15-MAR-87 17.03P;G*; BM387 -- CREATE $DCWIO ENTRY POINT SO'; DCSUB BACK OUT CODE CAN CALL HEREK;; K. L. NOEL 11-MAR-87 17.04L;7; KLN037 -- ALLOW REMOTE ATTACH AND DETATCH FOR CPR 7;; K. L. NOEL 30-JUN-87 17.05I;L7; KLN054 -- CHECK FOR GENERIC DEVICE DURING KILL I/O];B^;-_; I/O RELATED ROUTINES`;3a; PRIMITIVE LEVEL ROUTINES CALLED BY MOST DRIVERSSb;Ac; MACRO LIBRARY CALLSd;e:f .MCALL F11DF$,HDRDF$,HWDDF$,PCBDF$,PKTDF$,SHDDF$,TCBDF$g .MCALL UCBDF$,SCBDF$,BGCK$Ahi;$1j F11DF$ ;DEFINE WINDOW AND LOCK BLOCK OFFSETS 'k HDRDF$ ;DEFINE TASK HEADER OFFSETS7&l HWDDF$ ;DEFINE HARDWARE REGISTERS3m PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSL&n PKTDF$ ;DEFINE I/O PACKET OFFSETS,o SHDDF$ ;DEFINE SHADOW RECORDING OFFSETS.p TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS0q SCBDF$ ;DEFINE STATUS CONTROL BLOCK OFFSETS.r UCBDF$ ;DEFINE UNIT CONTROL BLOCK OFFSETSst;+Du; **-$DECIO-DECREMENT I/O COUNT (THROUGH AN ATTACHMENT DESCRIPTOR)2v; **-$DECIP-DECREMENT I/O COUNT (PARTITION ONLY)w;F@x; THESE ROUTINES DECREMENT THE I/O COUNT THROUGH AN ATTACHMENT>y; DESCRIPTOR AND/OR ASSOCIATED PCB AND CHECK FOR ANY PENDINGz; CHECKPOINT REQUESTS.{;N |; INPUTS:O};S,~; R0=ADDRESS OF THE ATTACHMENT DESCRIPTOR.;T3€; IF THE LOW BIT OF THE ADB ADDRESS IS SET, THEN 1�; THIS IS THE COMPLETION OF A BUFFERED I/O FOR 3‚; WHICH THE PCB I/O COUNT HAS ALREADY BEEN DEC'D$5ƒ; (VIA $DECBF). ONLY THE ADB I/O COUNT IS CHANGED.P„; …; OUTPUTS:†;M ‡; NONE.Nˆ;R2‰; R3 IS PRESERVED, ALL OTHER REGISTERS CLOBBEREDŠ;C‹;-Œ � .ENABL LSBTŽ2�$DECIO::BIT #1,R0 ;COMPLETION OF BUFFERED I/O ?/� BNE 60$ ;IF NE YES, GO DEC A.IOC AND RETURNU6‘ DECB A.IOC(R0) ;REDUCE I/O COUNT THROUGH DESCRIPTOR3’$DECIP::MOV A.PCB(R0),R1 ;POINT TO THE REGION PCB,6“ DECB P.IOC(R1) ;REDDUCE COUNT OF I/O INTO PARTITION%” BNE 50$ ;IF NE THERE IS STILL I/OR>• BIT #PS.CKR!PS.LIO,P.STAT(R1) ;CKP REQ OR SHF DETECTED I/O?– BEQ 50$ ;IF EQ NOP(— MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS5˜ MOV #$ICHKP,-(SP) ;ASSUME ITS A CHECKPOINT REQUEST!™ BIT #PS.CKR,P.STAT(R1) ;IS IT?1š BNE 10$ ;IF NE YES9› MOV #$NXTSK,(SP) ;MUST BE A SHUFFLER DETECTED LONG I/OUœ MOV R1,R0 ;COPY PCB ADDRESSO4�10$: BIC #PS.CKR!PS.LIO,P.STAT(R1) ;CLEAR THE BITS-ž CALL @(SP)+ ;CALL ROUTINE AND CLEAN STACKU+Ÿ MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSI 50$: RETURN ; 9¡60$: DEC00q’tnttöt÷tø tþfDATAB A.IOC-1(R0) ;DECREMENT I/O COUNT THROUGH ATT.C ¢ RETURN ;Q£¤ ¥ .DSABL LSBV¦§;+&¨; **-$ULDRQ-REQUEST MICROCODE LOADER©;)Iª; THIS ROUTINE IS CALLED FROM A DRIVER TO REQUEST THE MICRO CODE LOADERBJ«; TASK. A PACKET IS ALLOCATED AND THE LOAD INFO. IS INSERTED, THE PACKETN¬; IS QUEUED TO THE MICRO CODE LOADER AND THE MICRO CODE LOADER IS REQUESTED.­; ®; INPUTS: ¯;+ °; R3=MICRO CODE FILENAME INDEX3±; R4=KRB ADDRESS OF CONTROLLER FOR MICROCODE LOADR²; ³; OUTPUTS:´;.;µ; C=0 IF THE PACKET WAS ALLOCATED AND THE TASK INSTALLED.1¶; C=1 IF THE PACKET WAS NOT SUCCESSFULLY QUEUEDU-·; Z=1 IF THE PACKET COULD NOT BE ALLOCATED &¸; Z=0 IF THE TASK WAS NOT INSTALLED¹;-º » .ENABL LSB ¼;½$ULDRQ::MOV #$ULDPT,-(SP) ;PUSH ADDRESS OF ADDRESS OF TCB+¾ BR 10$ ;AND ENTER COMMON PACKET ROUTINEE¿À;+#Á; **-$DVMSG-DEVICE MESSAGE OUTPUTUÂ;FÃ; THIS ROUTINE IS CALLED TO SUBMIT A MESSAGE TO THE TASK TERMINATIONIÄ; NOTIFICATION TASK. MESSAGES ARE EITHER DEVICE RELATED OR A CHECKPOINTL"Å; WRITE FAILURE FROM THE LOADER.Æ; Ç; INPUTS: È;OÉ; R0=MESSAGE NUMBER.=Ê; R5=ADDRESS OF THE UCB OR TCB THAT THE MESSAGE APPLIES TO. Ë;W Ì; OUTPUTS:Í;@Î; A FOUR WORD PACKET IS ALLOCATED, R0 AND R5 ARE STORED IN THECÏ; SECOND AND THIRD WORDS RESPECTIVELY, AND THE PACKET IS THREADED>Ð; INTO THE TASK TERMINATION NOTIFICATION TASK MESSAGE QUEUE.Ñ;EDÒ; NOTE: IF THE TASK TERMINATION NOTIFICATION TASK IS NOT INSTALLED<Ó; OR NO STORAGE CAN BE OBTAINED, THEN THE MESSAGE REQUESTÔ; IS IGNORED.Õ;-Ö)×$DVMSG::MOV R0,R3 ;SAVE MESSAGE NUMBERSØÙ .IF DF R$$PROÚ"Û TST $TKNPT ;IS TKTN INSTALLED?8Ü BEQ $CTMSG ;IF EQ NO - TRY SENDING TO THE DISPATCHERÝÞ .ENDC ;R$$PROß9à MOV #$TKNPT,-(SP) ;PUSH ADDRESS OF ADDRESS OF TKTN TCBV0á BR 10$ ;DROP THROUGH TO COMMON QUEUE ROUTINEâã;++ä; **-$QPKRQ-QUEUE PACKET AND REQUEST TASKå;EFæ; THIS ROUTINE ATTEMPTS TO ALLOCATE A FOUR WORD BLOCK, SAVE R3-R5 INCç; THE BLOCK, AND QUEUE IT TO A SPECIFIED TASK. THE CONTENT OF THE è; BLOCK IS:M'é; WD 0 - LINK WORD FOR RECEIVE QUEUEê; WD 1 - SAVED R3ë; WD 2 - SAVED R5ì; WD 3 - SAVED R4í; î; INPUTS:Tï;N3ð; R0=ADDRESS OF ADDRESS OF TCB OF TASK TO REQUESTM ñ; R3-R5=REGISTERS TO BE STOREDò;S ó; OUTPUTS:ô;B3õ; C=0 IF ALLOCATION SUCCESSFUL AND TASK INSTALLED+ö; C=1 IF EITHER FAILED ÷; Z=1 IF PACKET NOT ALLOCATEDø; Z=0 IF TASK NOT INSTALLEDù;-ú?û$QPKRQ::MOV R0,-(SP) ;SAVE ADDRESS OF ADDRESS FOR COMMON CODEDü+ý10$: TST @(SP) ;SPECIFIED TASK INSTALLEDWþ BEQ 60$ ;IF EQ NO - ERRORU*ÿ MOV #8.,R1 ;SET LENGTH OF BLOCK NEEDED! CALL $ALOCB ;GET A CORE BLOCK % BCC 20$ ;FINISH IN COMMON ROUTINES# BR 50$ ;IF CS DIDN'T GET PACKETR;+5; **-$DVMG1-DEVICE MESSAGE OUTPUT (ALTERNATE ENTRY)L8; **-$QPKR1-GENERAL QUEUEING ROUTINE (ALTERNATE ENTRY);DB; THESE ROUTINES ARE CALLED IF A PACKET IS TO BE QUEUED WHICH IS? ; ALREADY ALLOCATED (E.G. CONVERTING A KERNEL AST TO A DEVICEM@ ; MESSAGE. THE PACKET MUST BE EXACTLY 8. BYTES LONG, AND IT IS@ ; THE DRIVERS RESPONSIBILITY TO INSURE THAT THE REQUESTED TASK ; IS INSTALLED.  ;A ; INPUTS:2; R0=ADDRESS OF THE PRE-ALLOCATED MESSAGE PACKET%; R3=MESSAGE NUMBER (OR EQUIVALENT) =; R2=ADDRESS OF ADDRESS OF TCB OF TASK (IF ENTRY AT $QPKR1)R;E ; OUTPUTS:<; THE PACKET IS FILLED IN AND QUEUED TO THE SPECIFIED TASK;-:$DVMG1::MOV #$TKNPT,R2 ;PUSH ADDRESS OF TKTN TCB ADDRESS6$QPKR1::MOV R2,-(SP) ;SAVE ADDRESS OF ADDRESS OF TCB/20$: MOV R0,R1 ;SET ADDRESS OF MESSAGE BLOCKH, TST (R0)+ ;POINT TO SECOND WORD IN BLOCK& MOV R3,(R0)+ ;INSERT MESSAGE NUMBER* MOV R5,(R0)+ ;INSERT UCB OR TCB ADDRESS, MOV R4,(R0) ;INSERT ADDITIONAL PARAMETER4 MOV @(SP)+,R0 ;GET TCB ADDRESS OF TASK TO REQUEST0 CALL $EXRQF ;INSERT IN RECEIVE LIST, REQUEST  CLC ;INDICATE SUCCESS! RETURN ;BACK TO CALLER-"50$: CLR (SP) ;SET TO SET Z BIT FOR RETURNS6#60$: COM (SP)+ ;CLEAN STA00qšt‹tt´cÚµcÛ¶c�·c›’CK, SET C AND Z IF APPROP.$ RETURN ;BACK TO CALLERM%& .IF DF R$$PRO'(;+3); **-$CTMSG-DO A SEND DATA TO THE P/OS DISPATCHERK*;MF+; THIS ROUTINE IS CALLED TO SEND A MESSAGE TO THE P/OS DISPATCHER BYG,; DOING A SEND DATA. FOR NOW MESSAGES ARE FOR CHECKPOINT WRITE ERRORE%-; OR CHECKPOINT ALLOCATION FAILURE.L.;R /; INPUTS:N0;I1; R0=MESSAGE NUMBERC2;N 3; OUPUTS:S4;R;5; A FIXED LENGTH SEND DATA IS DONE TO C$CTEX IF POSSIBLE.F6;-718$CTMSG::MOV KISAR6,-(SP) ;SAVE THE APR6 MAPPINGP(9 MOV R0,-(SP) ;SAVE THE MESSAGE NUMBER>: MOV #$CTBNM,R3 ;GET THE ADDRESS OF THE CTAB'S NAME (C$CTEX)%; CALL $SRSTD ;GET IT'S TCB ADDRESSI3< BCS 95$ ;IF CS NOT INSTALLED - DROP THE MESSAGE%= MOV R0,-(SP) ;SAVE THE TCB ADDRESSSE> MOV #<13.+8.+37>/32.,R1 ;GET A PACKET FOR A FIXED LENGTH SEND DATAL$? CALL $ALSEC ;ALLOCATE THE PACKET.@ BCS 90$ ;IF CS NO SPACE - DROP THE MESSAGE A MOV R0,KISAR6 ;MAP THE PACKET:B MOV #140002,R0 ;POINT AFTER THE LINK WORD IN THE PACKET4C MOV #13.+2,(R0)+ ;INSERT THE NUMBER OF DATA WORDS;D MOV #^R$$E,(R0)+ ;INSERT THE SENDER "TASK" NAME - $$EXECME MOV #^RXEC,(R0)+ ;...7F MOV #4,(R0)+ ;INSERT THE MESSAGE TYPE (EXEC MESSAGE)D-G MOV 2(SP),(R0)+ ;GET THE SUBMESSAGE NUMBER .H ADD #<13.-2>*2,R0 ;POINT PAST THE DATA AREA/I MOV $COPT,(R0)+ ;TI: FOR THIS "TASK" IS CO0:SFJ MOV #<200*400>+200,(R0)+ ;THE UIC FOR P/OS SHOULD ALWAYS BE 200,2000K MOV $CTBNM,(R0)+ ;INSERT THE TARGET TASK NAMEL MOV $CTBNM+2,(R0) ;...O7M MOV (SP),R0 ;GET THE ADDRESS OF RECIEVER TASK'S TCBO,N ADD #T.RCVL,R0 ;POINT TO THE RECIEVE LIST+O MOV KISAR6,R1 ;GET ADDRESS OF THE PACKETR2P CALL $QSPIF ;INSERT PACKET IN THE RECIEVE LIST0Q MOV #AS.RCA,R4 ;GET CODE FOR RECIEVE DATA AST5R MOV (SP)+,R5 ;RETRIEVE RECIEVER TASK'S TCB ADDRESS 4S TST (SP)+ ;DON'T NEED THE MESSAGE NUMBER ANYMORE-T MOV (SP)+,KISAR6 ;RESTORE THE APR6 MAPPING $U CALL $DASTT ;DECLARE RECIEVE AST-V CALLR $DRDSE ;DECLARE A SIGNIFICANT EVENTT"W90$: TST (SP)+ ;CLEAN THE STACK"X95$: TST (SP)+ ;CLEAN THE STACK2Y100$: MOV (SP)+,KISAR6 ;RESTORE THE APR6 MAPPINGZ RETURN ;ALL DONER[\ .ENDC ;R$$PRO]^ _ .DSABL LSBA`a;+/b; **-$GTPKT-GET I/O PACKET FROM REQUEST QUEUEE9c; **-$GSPKT-GET SELECTIVE I/O PACKET FROM REQUEST QUEUECd;ROe; THIS ROUTINE IS CALLED BY DEVICE DRIVERS TO DEQUEUE THE NEXT I/O REQUEST TORMf; PROCESS. IF THE DEVICE CONTROLLER IS BUSY, THEN A CARRY SET INDICATION IS Og; RETURNED TO THE CALLER. ELSE AN ATTEMPT IS MADE TO DEQUEUE THE NEXT REQUESTPJh; FROM THE CONTROLLER QUEUE. IF NO REQUEST CAN BE DEQUEUED, THEN A CARRYQi; SET INDICATION IS RETURNED TO THE CALLER. ELSE THE CONTROLLER IS SET BUSY AND*7j; A CARRY CLEAR INDICATION IS RETURNED TO THE CALLER.-k;EAl; IF QUEUE OPTIMIZATION IS SUPPORTED AND ENABLED FOR THE DEVICEA@m; THE APROPRIATE PACKET FOR THE CURRENT OPTIMIZATION ALGORITHMCn; IS RETURNED. THREE ALGORITHMS ARE SUPPORTED: NEAREST CYLINDER,I=o; ELEVATOR, AND C-SCAN. ALL THREE ALGORITHMS INCORPORATE AECp; FAIRNESS COUNT. IF THE FIRST PACKET ON THE LIST IS PASSED OVERN5q; MORE THAN "FCOUNT" TIMES, IT IS DONE IMMEDIATELY.Nr; s;AIt; THE ALTERNATE ENTRY POINT $GSPKT IS INTENDED FOR USE BY DRIVERS WHICH Hu; SUPPORT PARALLEL OPERATIONS ON A SINGLE UNIT, A COMMON EXAMPLE BEINGGv; FULL DUPLEX. SUCH DRIVERS ARE EXPECTED TO LOOK TO THE SYSTEM AS IFIFw; THEY ARE ALWAYS FREE, WHILE MAINTAINING THE STATUS OF ALL PARALLELBx; OPERATIONS INTERNALLY WITHIN THEIR OWN DEVICE DATA STRUCTURES.Iy; PARALLELISM IS ACCOMPLISHED BY HANDLING DRIVER-DEFINED CLASSES OF I/OOJz; FUNCTION CODES IN PARALLEL WITH EACH OTHER. FOR EXAMPLE A FULL-DUPLEXH{; DRIVER WOULD HANDLE INPUT REQUESTS IN PARALLEL WITH OUTPUT REQUESTS.E|; A DRIVER CALLS $GSPKT WHEN IT WANTS TO DEQUEUE A PACKET WHOSE I/OGI}; FUNCTION CODE BELONGS TO A CERTAIN CLASS. WHICH FUNCTIONS QUALIFY ISF~; DETERMINED BY AN ACCEPTANCE ROUTINE IN THE DRIVER WHOSE ADDRESS ISG; PASSED TO $GSPKT IN R2. THE ACCEPTANCE ROUTINE IS CALLED BY $GSPKTA00q¢tnttöt÷tø tþfDATAD€; EACH TIME A PACKET IS FOUND IN THE QUEUE WHICH IS ELIGIBLE TO BEI�; DEQUEUED. THE ACCEPTANCE ROUTINE IS THEN EXPECTED TO TAKE ONE OF THE‚; FOLLOWING THREE ACTIONS:ƒ;S:„; 1. RETURN WITH CARRY CLEAR IF THE PACKET SHOULD BE6…; DEQUEUED. IN THIS CASE $GSPKT PROCEEDS AS $GTPKT-†; NORMALLY WOULD ON DEQUEUEING THE PACKET.F‡;O<ˆ; 2. RETURN WITH CARRY SET IF THE PACKET SHOULD NOT BE:‰; DEQUEUED. IN THIS CASE $GSPKT WILL CONTINUE THE SCANŠ; OF THE I/O QUEUE.‹;YAŒ; 3. ADD THE CONSTANT G$$SPSA TO THE STACK POINTER TO ABORTG%�; THE SCAN WITH NO FURTHER ACTION.CŽ;TG�; THE ACCEPTANCE ROUTINE MUST SAVE AND RESTORE ANY REGISTERS WHICH ITA�; INTENDS TO MODIFY. WHEN A PACKET IS DEQUEUED VIA $GSPKT, THE 1‘; FOLLOWING NORMAL $GTPKT ACTIONS DO NOT OCCUR:’;N@“; 1. FILLING IN OF U.BUF, U.BUF+2 AND U.CNT. THESE FIELDS+”; ARE AVAILABLE FOR DRIVER-SPECIFIC USE.•;Q"–; 2. BUSYING OF UCB AND SCB.—; A˜; 3. EXECUTION OF $CFORK TO GET TO PROPER PROCESSOR (MULTI- ™; PROCESSOR SYSTEMS).š; <›; NOTE: $GSPKT MAY NOT BE USED BY A DRIVER WHICH SUPPORTSœ; QUEUE OPTIMIZATION.�;Dž;O Ÿ; INPUTS:E ;IB¡; R2=ADDRESS OF DRIVER'S ACCEPTANCE ROUTINE (IF CALL AT $GSPKT).@¢; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO GET A PACKET FOR.£; ¤; OUTPUTS:¥;U<¦; C=1 IF CONTROLLER IS BUSY OR NO REQUEST CAN BE DEQUEUED./§; C=0 IF A REQUEST WAS SUCCESSFULLY DEQUEUED.O"¨; R1=ADDRESS OF THE I/O PACKET.©; R2=PHYSICAL UNIT NUMBER.Eª; R3=CONTROLLER INDEX.P,«; R4=ADDRESS OF THE STATUS CONTROL BLOCK.*¬; R5=ADDRESS OF THE UNIT CONTROL BLOCK.­;E2®; NOTE: R4 AND R5 ARE DESTROYED BY THIS ROUTINE.¯;-°±; ;²; DEFINE ADDRESS IN THE UCB EXTENSION AS MAPPED THRU APR6E³; ´µIOC=X.IOC+140000 ;I/O COUNT-¶WCNT=X.WCNT+140000 ;WORDS TRANSFERED COUNTF.·CYLC=X.CYLC+140000 ;CYLINDERS CROSSED COUNT'¸CCYL=X.CCYL+140000 ;CURRENT CYLINDER -¹FCUR=X.FCUR+140000 ;CURRENT FAIRNESS COUNT+ºFLIM=X.FLIM+140000 ;FAIRNESS COUNT LIMITO-»DSKD=X.DSKD+140000 ;DISK DIRECTION (1=OUT)T¼=½; *********************************************************O ¾; * *R-¿; * > > > W A R N I N G < < < * À; * *S;Á; * THE FOLLOWING ARE OFFSET DEFINITIONS WHICH ARE *.;Â; * SUPPLIED EITHER BY DEFINITION IN THE EXEC (IOSUB) *E;Ã; * OR THE DUMMY STB FILE (FROM SFVC2). ANY CHANGE TO *C;Ä; * THESE DEFINITIONS MUST BE MADE IN BOTH MODULES. *C Å; * * =Æ; *********************************************************DÇ;42ÈTEMP=26 ;AMOUNT OF TEMPORARY STORAGE REQUIREDÉ7ÊG$$SPA==TEMP+6 ;CONSTANT TO ADD TO SP TO ABORT SCANRË Ì .ENABL LSB>*Í$GTPKT::MOV #128$,R2 ;ACCEPT ALL PACKETS;Î$GSPKT::MOV R2,$TEMP2 ;SAVE ADDRESS OF ACCEPTANCE ROUTINE.2Ï5$: SUB #TEMP,SP ;GET TEMPORARY STORAGE ON STACK<Ð10$: MOV U.SCB(R5),R4 ;GET ADDRESS OF STATUS CONTROL BLOCK#Ñ TSTB S.STS(R4) ;CONTROLLER BUSY?S%Ò BNE 20$ ;IF NE CONTROLLER IS BUSY 1Ó BIC #S2.EIP,S.ST2(R4) ;CLEAR ERROR IN PROGRESS*.Ô MOV R4,R1 ;GET THE ADDRESS OF THE LISTHEAD+Õ15$: CALL SCAN ;SCAN FOR A USABLE PACKETAÖ BCS 20$ ;NO MORE PACKETS× CALL ACPCHK ;ACP FUNCTION?Ø BCC 25$ ;IF CC NO1!Ù CALL DEQUE ;REMOVE THE PACKETTÚ;+Û; ** W A R N I N G **FÜ;PÝ; SPM HOOKPOINT NUMBER 22.Þ;;+ß; DO NOT CHANGE THE INSTRUCTION FOLLOWINGSà; LABEL WITHOUT CHECKING SPMá;-â-ã$SPH22==. ;SPM CHANGES THE INSTRUCTION ATB!ä ;THE LOCATION OF THIS LABEL+å MOV U.ACP(R5),R0 ;GET ADDRESS OF ACP TCBRæ-ç CALL $EXRQP ;INSURE FILE SYSTEM IS ACTIVEDè BR 10$ ;GO AGAINéê20$: JMP 95$ ;EXITê25$: ;KLN037Sê; ;KLN037Tê; IN REMOTE SYSTEMS, THE GENERIC DRIVER WILL HANDLE THE ATTACH AND DETATCH ;KLN0370ê; REQUESTS FOR THE REMOTE DEVICES ;KLN037ê; ;KLN0371ê .IF DF C$$RMT ;REMOTE HOST SUPPORT ;KLN037 ê ;KLN037=ê BIT #HF.RMT,$HFMSK ;REOMTE HOST SUPPROT ENABLED? ;KLN037C!ê BEQ 27$ ;IF EQ NO ;KLN037Rê ;KLN037 /ê00qªt‹tt´cÚµcÛ¶c�·c›’ MOV I.UCB(R1),R2 ;GET UCB ADDRESS ;KLN037 ê ;KLN037 Dê CMP (R2),$XXLOW ;IS THE DCB ADDRESS IN THE GENERIC RANGE? ;KLN037!ê BLO 27$ ;IF LO NO ;KLN037T'ê CMP (R2),$XXHGH ;IS IT? ;KLN037T,ê BLOS 60$ ;IF LO OR SAME, YES ;KLN037ê ;KLN037;ê 27$: ;KLN037ê .ENDC ; C$$RMT ;KLN037Tê ;KLN037ë; ì; PROCESS ATTACH/DETACHRí;F8í MOVB I.FCN+1(R1),R2 ;GET I/O FUNCTION CODE ;KLN0372ï CMPB #IO.ATT/256.,R2 ;ATTACH FUNCTION? ;**-1ð BNE 45$ ;IF NE NOA!ñ CALL DEQUE ;REMOVE THE PACKETN1ò MOV #IE.PRI&377,R0 ;ASSUME PRIVILEGE VIOLATION #ó TST U.CW1(R5) ;MOUNTABLE DEVICE?Iô BPL 30$ ;IF PL NO9õ BITB #US.MNT!US.FOR,U.STS(R5) ;NOT MOUNTED OR FOREIGN? ö BEQ 55$ ;IF EQ NO71÷30$: MOV I.TCB(R1),R0 ;ASSUME SUCCESSFUL ATTACH(ø TST U.ATT(R5) ;UNIT ALREADY ATTACHED?ù BEQ 35$ ;IF EQ NOR<ú MOV #IE.DAA&377,R0 ;SET STATUS OF DEVICE ALREADY ATTACHED û BR 55$ ;;ü35$: BITB #IQ.UMD,I.FCN(R1) ;IS THIS A DIAGNOSTIC ATTACH?ý BEQ 50$ ;IF EQ NO:þ BIT #DV.UMD,U.CW1(R5) ;USER MODE DIAGNOSTICS SUPPORTED?ÿ BEQ 40$ ;IF EQ NOO5 BISB #US.UMD,U.ST2(R5) ;INDICATE DIAGNOSTIC ATTACHI  BR 50$ ;940$: MOV #IE.IFC&377,R0 ;SET STATUS OF ILLEGAL FUNCTIONB  BR 55$ ;,45$: CMPB #IO.DET/256.,R2 ;DETACH FUNCTION BNE 60$ ;IF NE NOT! CALL DEQUE ;REMOVE THE PACKETQ0 MOV #IE.DNA&377,R0 ;ASSUME DEVICE NOT ATTCHED TST R3 ;UNIT ATTACHED?  BEQ 55$ ;IF EQ NOB  CLR R0 ;SET TO DETACH UNIT/  BICB #US.UMD,U.ST2(R5) ;RESET DIAGNOSTIC BITB+ 50$: MOV R0,U.ATT(R5) ;ATTACH/DETACH UNITU?  BITB #UC.ATT,U.CTL(R5) ;DOES DRIVER WANT CONTROL ON ATT/DET?C BNE 56$ ;IF NE YES7 MOV #IS.SUC&377,R0 ;SET SUCCESSFUL COMPLETION STATUSL155$: ADD #TEMP,SP ;CLEANUP THE STACK FOR $IOALT5% CALL $IOALT ;FINISH I/O OPERATION  BR 5$ ;GO AGAIN $56$: JMP 120$ ;PASS THE BRANCH ON=60$: BIT #DV.MSD,U.CW1(R5) ;IS THIS A MASS STORAGE DEVICE?$. BEQ 111$ ;IF EQ, NO, CAN'T DO OPT OR STATS+ .IF DF R$$AMD ;AUTOMATIC MOUNT/DISMOUNT ASSUME US.SIO,200. TSTB U.ST2(R5) ;STALLED I/O FOR THIS UNIT ?) BMI 111$ ;IF MI, YES. NO OPT OR STATS5 .ENDC ; DF R$$AMD *! MOV KISAR6,$TONYL ;SAVE DATA SPACE APR6," MOV U.UCBX(R5),KISAR6 ;MAP UCB EXTENSION6# BEQ 110$ ;IF EQ, NO UCB EXT, CAN'T DO OPT OR STATS6$ BITB #S3.OPT,S.ST3(R4) ;SEEK OPTIMIZATION ENABLED?%% BEQ 105$ ;IF EQ NO, DO STATS ONLYS&;S7'; INITIALIZATION FOR THE QUEUE OPTIMIZATION SCAN LOOP (;A&) TST (R1) ;IS THIS THE ONLY PACKET?#* BEQ 104$ ;IF EQ YES - DO IT NOW0++ INCB FCUR ;INCREMENT THE FAIRNESS COUNTT#, MOVB FLIM,R2 ;GET THE MAX COUNTO)- BICB #200,R2 ;CLEAR THE DIRECTION BITM). CMPB R2,FCUR ;FAIRNESS COUNT EXPIRED?M#/ BLO 104$ ;IF LO YES - DO IT NOWI01;Q>2; TWO IS SUBTRACTED FROM THE OFFSETS BELOW BECAUSE THE STACK:3; DOES NOT HAVE THE QUEUE SCAN LOOP RETURN ADDRESS ON IT4; &5 ASSUME OUTEX-2 ;ASSUME OUTEX-2 = 00675$: CLR (SP) ;CLEAR THE EXISTANCE INDICATORS47 MOV R1,LOWPK-2(SP) ;INIT ADDRESS OF LOWEST PACKET48 MOV R0,LOWPR-2(SP) ;INIT ADDRESS OF LOWEST PACKET69 MOV I.PRM+10(R1),LOW-2(SP) ;INIT LOWEST CYLINDER #+: MOVB I.PRI(R1),PRI-2(SP) ;INIT PRIORITY ;<;; =; QUEUE OPTIMIZATION SCAN LOOP>;;.?80$: CALL QOPUPD ;UPDATE THE QUEUE OPT INFO'@ BCS 105$ ;IF CS DO THIS PACKET NOW!E2A85$: CALL SCAN ;SCAN FOR THE NEXT USABLE PACKET%B BCS 100$ ;IF CS THERE ARE NO MORE ,C CMPB I.PRI(R1),PRI-2(SP) ;SAME PRIORITY?)D BNE 100$ ;IF NE NO - GO PICK A PACKET(.E90$: CMPB #IO.ATT/256.,I.FCN+1(R1) ;ATTACH?F BEQ 85$ ;IF EQ YES - GO ON*G CMPB #IO.DET/256.,I.FCN+1(R1) ;DETACH?H BEQ 85$ ;IF EQ YES - GO ON:I BITB #IQ.UMD,I.FCN(R1) ;IS THIS A DIAGNOSTIC FUNCTION?J BNE 85$ ;IF NE YES - GO ONK BR 80$ ;CONSIDER THIS ONE L1M95$: ADD #TEMP,SP ;RETURN THE TEMPORARY STORAGE5!N SEC ;SET CARRY FOR NO PACKETAO JMP 130$ ;AND EXIT-P100$: CALL FNDOPT ;FIND THE OPTIMAL PACKETR*Q CMP R1,(R4) ;IS THIS THE FIRST PACKET?R BNE 100q²tnttöt÷tø tþfDATA05$ ;IF NE NO - GO ON,S104$: CLRB FCUR ;CLEAR THE FAIRNESS COUNT*T105$: ADD #1,IOC ;UPDATE UNIT I/O COUNT&U ADC IOC+2 ;AND THE HIGH ORDER WORD=V CMPB #IO.RLB/256.,I.FCN+1(R1) ;LOGICAL TRANSFER FUNCTION?OW BLO 110$ ;IF LO NO)X MOV I.PRM+4(R1),R3 ;GET THE BYTE COUNTRY ASR R3 ;MAKE IT WORDS#0Z ADD R3,WCNT ;UPDATE TOTAL WORDS XFERED COUNT'[ ADC WCNT+2 ;AND THE HIGH ORDER WORDN/\ BIT #S2.OPT,S.ST2(R4) ;QUEUE OPT SUPPORTED?C] BEQ 110$ ;IF EQ NO,^ MOV CCYL,R3 ;GET THE OLD CYLINDER NUMBER2_ MOV I.PRM+10(R1),CCYL ;SET THE NEW CURRENT CYL1` SUB CCYL,R3 ;SUBTRACT CURRENT CYLINDER NUMBERa BPL 108$ ;GET THE ABSOLUTE#b NEG R3 ;VALUE OF THE DIFFERENCE)*c108$: ADD R3,CYLC ;UPDATE THE CYLINDERSd ADC CYLC+2 ;THE SECOND WORD 4e110$: MOV $TONYL,KISAR6 ;RESTORE DATA APR6 MAPPING5f111$: CALL DEQUE ;REMOVE THE PACKET FOR PROCESSINGNg2h120$: ADD #TEMP,SP ;RETURN THE TEMPORARY STORAGEijk .IF DF S$$HDWl9m BIT #DV.MSD,U.CW1(R5) ;IS THIS A MASS STORAGE DEVICE?Un BEQ 125$ ;IF EQ NO1o MOV R1,R3 ;COPY I/O PACKET ADDRESS FOR $SHFNDS1p CALL $SHFN1 ;SEE IF THIS UNIT IS SHADOWED NOW q BCS 124$ ;IF CS NO1r CMP ML.PRI(R4),R1 ;IS THIS THE PRIMARY PACKET?P$s BNE 124$ ;IF NE NO -- DON'T COPY-t MOV R1,-(SP) ;SAVE R1 (I/O PACKET ADDRESS)O/u CMPB #IO.WLB/400,I.FCN+1(R2) ;IS IT A WRITE? ,v BNE 123$ ;IF NE NO -- DON'T QUEUE IT NOW!w MOV R5,-(SP) ;SAVE UCB ADDRESSE/x MOV U.SCB(R5),R4 ;GET SCB ADDRESS OF PRIMARYCy MOV R2,R1 ;COPY PKT ADDRESSE6z MOV I.UCB(R1),R5 ;GET UCB ADDRESS OF SECONDARY DISK+{ CLR -(SP) ;ASSUME PRIMARY AND SECONDARYS| ;HAVE SEPARATE SCBS 9} CMP U.SCB(R5),R4 ;PRIMARY AND SECONDARY HAVE SAME SCB? ~ BNE 121$ ;IF NE NO, OK! CMP $TEMP2,#128$ ;$GSPKT CALL?M)€ BNE 121$ ;IF NE YES, OK WITH SAME SCB-� MOV R4,(SP) ;REMEMBER WE HAD TO INC S.STS %‚ INCB S.STS(R4) ;SHOW THIS SCB BUSY 4ƒ121$: CALL $DRQRQ ;QUEUE I/O PACKET TO OTHER UNIT(„ MOV (SP)+,R4 ;DID WE INCREMENT S.STS?… BEQ 122$ ;IF EQ NO† DECB S.STS(R4) ;PUT IT BACK4‡122$: MOV (SP)+,R5 ;RESTORE UCB ADDRESS OF PRIMARY5ˆ123$: MOV (SP)+,R1 ;RESTORE R1 (I/O PACKET ADDRESS)C-‰124$: MOV U.SCB(R5),R4 ;RESTORE SCB ADDRESSE7Š MOV R1,S.PKT(R4) ;RE-SET I/O PACKET ADDRESS INTO SCB$‹125$: ;REF LABEL1Œ� .ENDCŽ�!� CMP $TEMP2,#128$ ;$GSPKT CALL?E,‘ BNE 127$ ;IF NE YES, SKIP TO DRIVER CALL9’ MOV I.PRM(R1),U.BUF(R5) ;INSERT RELOCATION BIAS IN UCB <“ MOV I.PRM+2(R1),U.BUF+2(R5) ;INSERT BUFFER ADDRESS IN UCB6” MOV I.PRM+4(R1),U.CNT(R5) ;INSERT BYTE COUNT IN UCB'• INCB S.STS(R4) ;SHOW CONTROLLER BUSYA)– BISB #US.BSY,U.STS(R5) ;SHOW UNIT BUSYA$— MOV S.KRB(R4),R3 ;GET KRB ADDRESS˜ BEQ 126$ ;IF EQ NO KRB>™ BIT #KS.UOP,K.STS(R3) ;IS CONTROLLER PARALLEL OPERATION ENBš BEQ 126$ ;IF EQ NO›œ;I�; CONTROLLER SUPPORTS PARALLEL OPERATION, AND REQUIRES SYNCHRONIZATION.IEž; THIS TYPE OF CONTROLLER USUALLY HAS THE INTERRUPT ENABLED, AND ISGŸ; CAPABLE OF SUSTAINING AN INTERRUPT WHILE INITIATING A NEW FUNCTION.4A ; THE INTERRUPT MAY BE FROM SOME EXTERNAL EVENT, SUCH AS A DISKOH¡; BECOMMING READY. IF LEFT ALONE, THE DRIVER WOULD AUTOMATICALLY FORKH¢; FOR EVERY INTERRUPT, WHICH WOULD NOT DO SINCE THE FORK BLOCK IS USEDD£; TO HOLD THE DRIVER CONTEXT FOR A NUMBER OF CONDITIONS DURING I/OF¤; INITIATION. THE PC WORD OF THE FORK BLOCK IS USED AS AN INTERLOCKG¥; TO SHOW IF A FORK IS ALLOWED, WHERE S.FRK+2 IS ZERO IF AN INTERRUPTAC¦; IS ALLOWED. IT IS THE DRIVERS RESPONSIBILITY TO CLR S.FRK+2 TO D§; ALLOW INTERRUPTS ONCE THEY ARE EXPECTED. THE ONLY OTHER PROBLEMG¨; OCCURS WHEN A DRIVER HAS QUEUED A FORK WHILE THE EXEC AND/OR DRIVERAC©; WERE ON THEIR WAY TO THIS POINT, AND WHEN $GTPKT ARRIVES HERE ABEª; FORK BLOCK IS CURRENTLY IN THE FORK QUEUE. THE SOLUTION FOR THIS I«; IS TO SIMPLY DEQUEUE THE FORK BLOCK AND THEREBY DROP THE INTERRUPT ONT+¬; THE FLOOR. WE WILL PROCEED TO DO THIS.R­;R®¯ MTPS #PR7 ;INHIBIT DEADLOCKA° LOCK$ $FORKL,SPIN,± INC S.FRK+2(R4) ;;;SHOW FORK BLOCK IN USE4²00qºt‹tt´cÚµcÛ¶c�·c›’ MOV #$FRKHD,R0 ;;;PREPARE TO REMOVE IT FROM QUEUE&³ TST (R0) ;;;IS IT POSSIBLY THERE ?´ BEQ 1251$ ;;;IF EQ NO !µ MOV R4,R1 ;;;COPY SCB ADDRESSA'¶ ADD #S.FRK,R1 ;;;POINT TO FORK BLOCKH+· CALL $QRMVA ;;;REMOVE IT FROM THE QUEUER¸1251$: ;REFERENCE LABEL¹ ULOCK$ $FORKL,SPINQ º MTPS #0»¼½ .IF DF M$$PRO¾¿ BR 127$ ;REENTER FLOW.ÀÁ .ENDCÂÃÄ126$: ;REFERENCE LABELPÅÆÇ .IF DF M$$PROÈ$É MOV (SP)+,R4 ;SAVE RETURN ADDRESS-Ê CALL $CFORK ;EXECUTE ON CORRECT PROCESSORE'Ë MOV R4,-(SP) ;REPLACE RETURN ADDRESS )Ì MOV U.SCB(R5),R4 ;RETRIEVE SCB ADDRESS;ÍÎ .ENDCÏÐÑ127$: ;REFERENCE LABELA0Ò MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS/Ó MOVB U.UNIT(R5),R2 ;SET PHYSICAL UNIT NUMBERFÔÕ;+Ö; ** W A R N I N G **Q×;MØ; SPM HOOKPOINT NUMBER 17.Ù;+Ú; DO NOT CHANGE THE INSTRUCTION FOLLOWINGÛ; LABEL WITHOUT CHECKING SPMÜ;-Ý-Þ$SPH17==. ;SPM CHANGES THE INSTRUCTION ATE!ß ;THE LOCATION OF THIS LABELUàá$â MOV S.KRB(R4),R3 ;GET KRB ADDRESSã BEQ 128$ ;IF EQ NO KRB*ä MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX/å128$: CLC ;SHOW VALID I/O PACKET FOR RETURNMæ130$: ;REFERENCE LABEL çè;+é; ** W A R N I N G **Rê;T6ë; SPM HOOKPOINT NUMBER - THE FOLLOWING RETURN IS THE1ì; NULL CALL FOR HOOKING SEVERAL EXTERNAL TASKS.Oí;C+î; DO NOT CHANGE THE INSTRUCTION FOLLOWINGIï; LABEL WITHOUT CHECKING SPMð;-ñ+ò$SPVEX==. ;SPM EXPECTS THIS INSTRUCTIONEó ;TO BE RETURNEô õ RETURNM ö .DSABL LSB ÷ø;A7ù; QOPUPD -- UPDATE THE QUEUE OPTIMIZATION INFORMATION;ú;O@û; THIS ROUTINE UPDATES THE QUEUE OPTIMIZATION SCAN INFORMATIONFü; FOR THE CURRENT PACKET. THIS INFORMATION IS USED LATER BY FNDOPT.ý;P þ; INPUT:ÿ;R(; R1=ADDRESS OF THE CURRENT I/O PACKET; R5=ADDRESS OF THE UCBE;T ; OUTPUTS:;O%; C=0 IF THE SCAN SHOULD CONTINUE.&; THE OPTIMIZATION DATA IS UPDATED.5; THIS DATA IS ON THE STACK IN THE FOLLOWING FORM.T;R3 ; +--------------------------------------------+ , ; 30(SP) ! DRIVER RETURN ADDRESS !3 ; !--------------------------------------------!M( ; 26(SP) ! CURRENT PRIORITY !3 ; !--------------------------------------------!.'; 24(SP) ! LOWEST CYLINDER !O3; !--------------------------------------------!2; 22(SP) ! ADDRESS OF THE ABOVE PACKET !3; !--------------------------------------------!:; 20(SP) ! ADDRESS OF THE PREVIOUS PACKET FOR ABOVE !3; !--------------------------------------------! :; 16(SP) ! NEAREST CYLINDER IN THE INWARD DIRECTION !3; !--------------------------------------------! 2; 14(SP) ! ADDRESS OF THE ABOVE PACKET !3; !--------------------------------------------! :; 12(SP) ! ADDRESS OF THE PREVIOUS PACKET FOR ABOVE !3; !--------------------------------------------!K:; 10(SP) ! NEAREST CYLINDER IN THE OUTWARD DIRECTION !3; !--------------------------------------------!O1; 6(SP) ! ADDRESS OF THE ABOVE PACKET !-3; !--------------------------------------------!I9; 4(SP) ! ADDRESS OF THE PREVIOUS PACKET FOR ABOVE !-3; !--------------------+-----------------------!K9 ; 3(SP) ! INWARD EXISTANCE ! OUTWARD EXISTANCE !-9!; 2(SP) ! FLAG (HIGH BIT=1) ! FLAG (HIGH BIT=1) !V:"; !--------------------+-----------------------!5#; 0(SP) ! OPTIMIZATION LOOP RETURN ADDRESS !N3$; +--------------------------------------------+-%;!&; ALL REGISTERS ARE PRESERVED.C'; (;--); C=1 IF THE CURRENT PACKET SHOULD BE USED-&*; R1=ADDRESS OF THE CURRENT PACKET'+; R0-ADDRESS OF THE PREVIOUS PACKET-,;--.;-//; NOTE: THESE OFFSETS ARE ALSO USED BY FNDOPTT0; 81PKT=I.PRM+10 ;OFFSET (R1) FOR CYLINDER FOR THIS PACKET/2PRI=26 ;OFFSET (SP) FOR THE CURRENT PRIORITY-13LOW=24 ;OFFSET (SP) FOR LOWEST CYLINDER NUMBER!14LOWPK=22 ;OFFSET (SP) FOR PACKET ADDRESS OF LOW-;5LOWPR=20 ;OFFSET (SP) FOR PREVIOUS PACKET ADDRESS FOR LOWR9600qÂtnttöt÷tø tþfDATAOUT=10 ;OFFSET (SP) FOR NEAREST CYL IN THE OUTWARD DIRN17OUTPK=6 ;OFFSET (SP) FOR PACKET ADDRESS OF OUTU;8OUTPR=4 ;OFFSET (SP) FOR PREVIOUS PACKET ADDRESS FOR OUT79IN=16 ;OFFSET (SP) FOR NEAREST CYL IN THE INWARD DIRT0:INPK=14 ;OFFSET (SP) FOR PACKET ADDRESS OF IN:;INPR=12 ;OFFSET (SP) FOR PREVIOUS PACKET ADDRESS FOR IN7<OUTEX=2 ;OFFSET (SP) FOR OUTWARD EXISTANCE INDICATOR5=INEX=3 ;OFFSET (SP) FOR INWARD EXISTANCE INDICATORO>0?QOPUPD: CMP PKT(R1),CCYL ;ON CURRENT CYLINDER?@ BNE 10$ ;IF NE NOS)A SEC ;EXIT WITH CARRY SET (DO IT NOW)U B BR 70$ ;C7D10$: CMP PKT(R1),LOW(SP) ;IS THIS THE CURRENT LOWEST? E BHIS 20$ ;IF GE NO;F MOV PKT(R1),LOW(SP) ;SET THE NEW LOWEST CYLINDER NUMBER, (G MOV R1,LOWPK(SP) ;ITS PACKET ADDRESS,4H MOV R0,LOWPR(SP) ;AND THE PREVIOUS PACKET ADDRESSI@J20$: CMP PKT(R1),CCYL ;THIS PACKET LESS THAN CURRENT LOCATION?K BLOS 40$ ;IF LE YES L-M TSTB OUTEX(SP) ;HAVE WE SETUP OUTWARD YET? N BPL 30$ ;IF PL NOR8O CMP PKT(R1),OUT(SP) ;THIS PACKET NEAREST OUTWARD ONE?P BHIS 60$ ;IF GE NO<Q30$: MOV PKT(R1),OUT(SP) ;SET THE NEW NEAREST OUTWARD CYL,(R MOV R1,OUTPK(SP) ;ITS PACKET ADDRESS,4S MOV R0,OUTPR(SP) ;AND THE PREVIOUS PACKET ADDRESS#T BISB #200,OUTEX(SP) ;AND NOTE IT U BR 60$ ;EXITV/W40$: TSTB INEX(SP) ;HAVE WE SETUP INWARD YET?0X BPL 50$ ;IF PL NOI6Y CMP PKT(R1),IN(SP) ;THIS PACKET NEAREST INWARD ONE?Z BLOS 60$ ;IF LE NO:[50$: MOV PKT(R1),IN(SP) ;SET THE NEW NEAREST INWARD CYL,'\ MOV R1,INPK(SP) ;ITS PACKET ADDRESS,S3] MOV R0,INPR(SP) ;AND THE PREVIOUS PACKET ADDRESST"^ BISB #200,INEX(SP) ;AND NOTE IT_)`60$: CLC ;SET FLAG FOR CONTINUED SCANRa70$: RETURN ;Pbc;D?d; FNDOPT -- FIND THE OPTIMAL PACKET FOR THE CURRENT ALGORITHM e;BAf; THIS ROUTINE PICKS THE OPTIMAL PACKET USING THE DATA PRODUCEDCg; BY QOPUPD. IT SUPPORTS NEAREST CYLINDER, ELEVATOR, AND C-SCAN.Wh;NCi; NOTE: THE OFFSETS AND THE STACK STRUCTURE ARE DEFINED IN QOPUPDAj;I k; INPUTS:l;R m; THE DATA PRODUCED BY QOPUPD.n; R4=SCB ADDRESSo; R5=UCB ADDRESS p; CCYL=CURRENT CYLINDER NUMBER/q; DSKD=HIGH BIT OF BYTE SET IF MOVING OUTWARDNr;D2s; THE OPTIMIZATION ALGORITHM ENCODED AS FOLLOWS:t;T&u; S2.OP2,S2.OP1=0,0 NEAREST CYLINDERv; =0,1 ELEVATORIw; =1,0 C-SCANCx; =1,1 RESERVEDEy;z;Q {; OUTPUT:P|; $}; R1=ADDRESS OF THE OPTIMAL PACKET*~; THE CURRENT CYLINDER NUMBER IS UPDATED); THE DIRECTION IS UPDATED IF NECESSARY€;U�;‚5ƒFNDOPT: BIT #S2.OP2,S.ST2(R4) ;C-SCAN OR RESERVED?„ BEQ 20$ ;IF EQ NO $… BIT #S2.OP1,S.ST2(R4) ;RESERVED?† BEQ 10$ ;IF EQ NOF;‡ BGCK$A BF.OPT,BE.IDC,FATAL ;OPTIMIZATION - RESERVED CODEDˆ;O ‰; C-SCANŠ; ,‹10$: TSTB OUTEX(SP) ;OUTWARD PACKET EXIST?"Œ BMI 50$ ;IF MI YES - RETURN IT2� MOV LOWPK(SP),R1 ;ELSE RETURN THE LOWEST PACKET5Ž MOV LOWPR(SP),R0 ;AND THE PREVIOUS PACKETS ADDRESS � BR 70$ ;EXIT�(‘20$: BIT #S2.OP1,S.ST2(R4) ;ELEVATOR?’ BEQ 40$ ;IF EQ NO“; ”; ELEVATOR•;. – TSTB DSKD ;ARE WE GOING OUT?— BMI 30$ ;IF MI YES&˜ TSTB INEX(SP) ;INWARD PACKET EXIST?"™ BMI 60$ ;IF MI YES - RETURN IT š BISB #200,DSKD ;SET GOING OUT›,œ30$: TSTB OUTEX(SP) ;OUTWARD PACKET EXIST?"� BMI 50$ ;IF MI YES - RETURN ITž BICB #200,DSKD ;SET GOING IN (Ÿ BR 60$ ;AND RETURN THE INWARD PACKET ; ¡; NEAREST CYLINDER¢; *£40$: TSTB INEX(SP) ;INWARD PACKET EXIST?&¤ BPL 50$ ;IF PL NO - RETURN OUTWARD(¥ TSTB OUTEX(SP) ;OUTWARD PACKET EXIST?%¦ BPL 60$ ;IF PL NO - RETURN INWARDA§(¨ MOV CCYL,R1 ;GET THE CURRENT CYLINDER0© SUB R1,OUT(SP) ;CALCULATE DISTANCE TO OUTWARD.ª SUB IN(SP),R1 ;CALCULATE DISTANCE TO INWARD!« CMP R1,OUT(SP) ;INWARD CLOSER?O¬ BLO 60$ ;IF LT YES2­50$: MOV OUTPK(SP),R1 ;RETURN THE OUTWARD PACKET5® MOV OUTPR(SP),R0 ;AND THE PREVIOUS PACKETS ADDRESST¯ BR 70$ ;EXIT0°60$: MOV INPK(SP),R1 ;RETURN THE INWARD PACKET4± MOV INPR(SP),R0 ;AND THE PREVIOUS PACKETS ADDRESS²70$: ;REF LABEL³ ´ RETURN ;µ00qÊt‹tt´cÚµcÛ¶c�·c›’¶; 4·; SCAN -- SCAN THE DRIVER QUEUE FOR USABLE PACKETS¸;R2¹; THIS ROUTINE IS CALLED TO SCAN A DRIVER QUEUE./º; EACH USABLE ENTRY IN THE QUEUE IS RETURNED.T»;A ¼; INPUTS:,½;P.¾; R4=SCB ADDRESS FOR THE QUEUE TO BE SCANNED¿;V À; OUTPUTS:Á;R8Â; C=1 IF THERE ARE NO MORE USABLE ENTRIES IN THE QUEUE2Ã; C=0 IF THE NEXT USABLE ENTRY IS BEING RETURNED&Ä; R0=ADDRESS OF THE PREVIOUS PACKET%Å; R1=ADDRESS OF THE CURRENT PACKETS*Æ; R5=UCB ADDRESS FOR THE CURRENT PACKETÇ;3È; NOTE: R0 AND R1 MUST BE PRESERVED BETWEEN CALLSBÉ; TO THIS ROUTINE.Ê;RËÌSCAN:LÍ2Î10$: MOV R1,R0 ;SAVE ADDRESS OF PREVIOUS PACKET+Ï MOV (R0),R1 ;GET ADDRESS OF NEXT PACKETP*Ð BEQ 50$ ;IF EQ NO MORE PACKETS TO SCAN6Ñ MOV I.UCB(R1),R5 ;GET ADDRESS OF UNIT CONTROL BLOCKÒ TSTB U.STS(R5) ;UNIT BUSY?EÓ BMI 10$ ;IF MI YESÔÕ .IF DF R$$AMDÖ× ASSUME US.SIO,200(Ø TSTB U.ST2(R5) ;I/O STALLED TO UNIT ?Ù BPL 15$ ;IF PL, NO8Ú CMP $VERTK,I.TCB(R1) ;PACKET FROM VERIFICATION TASK ?'Û BEQ 40$ ;IF EQ, YES. DEQUEUE PACKET&Ü BR 10$ ;NO, SEARCH FOR NEXT PACKETÝÞ .ENDC ; DF R$$AMD ß15$: ;F#à MOV U.ATT(R5),R3 ;UNIT ATTACHED?Tá BEQ 40$ ;IF EQ NOP1â CMP #IO.LOV,I.FCN(R1) ;LOAD OVERLAY FUNCTION ?Vã BEQ 17$ ;IF EQ YES9ä CMP #IO.LDO,I.FCN(R1) ;HOW ABOUT LOAD D-SPACE OVERLAY?å BNE 20$ ;IF NE NO(æ17$: TST U.CW1(R5) ;MOUNTABLE DEVICE ?1ç BMI 40$ ;IF MI YES, ALWAYS BREAK THROUGH ATT.Lè20$: ;REFERENCE LABEL6é MOV I.TCB(R1),R2 ;GET ADDRESS OF REQUESTOR TASK TCB&ê CMP $RCTPT,R2 ;IS THE I/O FROM RCT?-ë BEQ 40$ ;IF EQ YES, ALWAYS LET IT THROUGH;9ì BIT #T3.PRV!T3.CLI,T.ST3(R2) ;TASK PRIVILEGED OR CLI ?Dí BEQ 30$ ;IF EQ NON-î CMP R2,$LDRPT ;REQUESTING TASK THE LOADER?T/ï BEQ 40$ ;IF EQ YES-ALWAYS BREAK THRU ATTACHF,ð BIT #DV.TTY,U.CW1(R5) ;DEVICE A TERMINAL?ñ BEQ 30$ ;IF EQ NO7:ò CMPB #IO.WLB/256.,I.FCN+1(R1) ;WRITE LOGICAL FUNCTION ?)ó BNE 30$ ;IF NE NO, DON'T BREAKTHROUGHF/ô BITB #TF.WBT,I.FCN(R1) ;BREAKTHROUGH WRITE ? $õ BNE 40$ ;IF NE YES, BREAKTHROUGH0ö30$: CMP R2,R3 ;IS THIS THE APPROPRIATE TASK?÷ BNE 10$ ;IF NE NOB4ø40$: CALL @$TEMP2 ;CALL DRIVER ACCEPTANCE ROUTINE&ù BCS 10$ ;IF CS PACKET NOT ACCEPTEDú BR 60$ ;RETURN THE PACKETT-û50$: SEC ;INDICATE NO MORE USABLE PACKETSCü60$: RETURN ;EXIT1ýþÿ;AD; ACPCHK -- THIS ROUTINE DETERMINES IF A PACKET IS AN ACP FUNCTION; ; INPUT:;?; R1=ADDRESS OF THE PACKET; R5=ADDRESS OF THE UCB.;. ; OUTPUT:K;G( ; C=1 IF THE PACKET IS AN ACP FUNCTION ; C=0 IF NOT ;, * ACPCHK: TST U.CW1(R5) ;DEVICE MOUNTABLE? BPL 40$ ;IF PL NO : BITB #IQ.UMD,I.FCN(R1) ;IS THIS A DIAGNOSTIC FUNCTION?3 BNE 40$ ;IF NE YES, IT CAN'T BE AN ACP FUNCTION;:); DETERMINE IF FUNCTION IS ACP FUNCTION:; APPLICABLE TO ALL MOUNTED DEVICES - NATIVE AND FOREIGN8; FILES 11 - MAPPING OF VIRTUAL TO LOGICAL NOW DONE BY.; DRQIO. ONLY VIRTUAL & ACP FUNCTIONS THAT4; NEED CORRECT SEQUENCING ARE ROUTED THRU DRIVER.;T% TST U.ACP(R5) ;TEST ADDRESS OF ACPF* BEQ 40$ ;NO ACP - PASS IT ON TO DRIVER- MOVB I.FCN+1(R1),R2 ;GET THE FUNCTION CODE ; BITB #US.FOR,U.STS(R5) ;MOUNTED FOREIGN (ASSUMED MOUNTED$  ;WITH AN ACP FROM ABOVE)5 BNE 10$ ;IF NE YES, CHECK DCB MASKS FOR ACP FUNC.O, CMP #IO.CLN/400,R2 ;IS IT AN ACP FUNCTION& BHI 40$ ;IF HI NO, QUEUE TO DRIVER#  BR 30$ ;ELSE IS AN ACP FUNCTION!$"10$: MOV (R5),R3 ;GET DCB ADDRESS$# CMP R2,#15. ;NORMALIZE FCTN CODE$ BLOS 20$ ;% SUB #16.,R2 ;A*& ADD #10,R3 ;ADJUST PTR TO 2ND MASK SET%'20$: ASL R2 ;CONVERT TO WORD INDEX.3( BIT $BTMSK(R2),D.MSK+6(R3) ;IS IT ACP FUNCTION??,) BNE 30$ ;IF NE ACP FUNCTIONE6*40$: TST (PC)+ ;CLEAR CARRY FOR DRIVER FUNCTION AND&+ ;SKIP FOLLOWING INSTRUCTION (MOM', ;WARNED ME NOT TO CODE LIKE THIS) #-30$: SEC ;INDICATE ACP FUNCTIONE . RETURN/; "0; DEQUE -- DEQUEUE AN I/O PACKET1;:-2; THIS ROUTINE DEQUEUES THE CURRENT PACKET. 3;A 4; INPUT:5;%6; R0=ADDRESS00qÒtnttöt÷tø tþfDATA OF THE PREVIOUS PACKETD'7; R1=ADDRESS OF THE PACKET TO DEQUEUE08; R4=SCB ADDRESS9;R :; OUTPUT:B;;T<; THE PACKET IS DEQUEUED=; R1 IS UNCHANGEDE>; ?4@DEQUE: MOV (R1),(R0) ;CLOSE UP LIST REMOVING ENTRY-A BNE 10$ ;IF NE LAST ENTRY WAS NOT REMOVEDU0B MOV R0,2(R4) ;SET ADDRESS OF NEW LAST IN LIST:C10$: MOV R1,S.PKT(R4) ;SET ADDRESS OF CURRENT I/O PACKETD RETURN ;AND EXIT EFG;+4H; **-$TSTBF-TEST IF I/O BUFFERING CAN BE INITIATEDI;FJ; THIS ROUTINE DETERMINES IF A GIVEN I/O REQUEST IS ELIGIBLE FOR I/OEK; BUFFERING, AND IF SO IT STORES THE PCB ADDRESS OF THE REGION INTOAL; WHICH THE TRANSFER IS TO OCCUR IN I.PRM+16 OF THE I/O PACKET.:M;( N; INPUTS:SO;L,P; R3=ADDRESS OF I/O PACKET FOR I/O REQUESTQ;A R; OUTPUTS:S;MT; R3 IS PRESERVED.U; *V; C=0 IF I/O BUFFERING CAN BE INITIATED.W;D.X; C=1 IF I/O BUFFERING CAN NOT BE INITIATED.Y;-Z.[$TSTBF::SEC ;ASSUME TASK CANNOT BE STOPPED\ .IF DF R$$IIC:] BIT #1,I.IOSB+4(R3) ;INTERNAL I/O COMPLETION SPECIFIED?,^ BNE 20$ ;IF NE YES, DON'T BUFFER ANY I/O_ .ENDC ;R$$IIC1` MOV I.TCB(R3),R0 ;GET ADDRESS OF REQUESTOR TCBO$a BIT #T2.STP,T.ST2(R0) ;STOP TASK?b BNE 20$ ;IF NE NOL8c MOV I.AADA(R3),R0 ;COPY ATTACHMENT DESCRIPTOR ADDRESS-d MOV A.PCB(R0),R1 ;POINT TO PCB OF TRANSFER 8e BIT #PS.CHK!PS.FXD,P.STAT(R1) ;IS PCB CHECKPOINTABLE?f BNE 20$ ;IF NE NO 3g MOV R1,I.PRM+16(R3) ;SET PCB ADDRESS OF TRANSFERN&h CLC ;INDICATE TASK MAY BE STOPPEDi20$: RETURN ;Njk;+$l; **-$INIBF-INITIATE I/O BUFFERINGm;Y@n; THIS ROUTINE INITIATES I/O BUFFERING BY DOING THE FOLLOWING:o;D*p; 1. DECREMENT THE TASK'S I/O COUNT.q;;/r; 2. INCREMENT THE TASK'S BUFFERED I/O COUNT(s;06t; 3. INITIATE CHECKPOINTING IF A REQUEST IS PENDINGu;I v; INPUTS:Tw;E-x; R3=ADDRESS OF I/O PACKET FOR I/O REQUEST.Ey;N z; OUTPUTS:{; |; R3 IS PRESERVED.};-~+$INIBF::MOV R3,-(SP) ;SAVE PACKET ADDRESSN2€ CALL $DECBF ;DEC PCB I/O COUNTS & UNBLOCK TASK0� MOV I.TCB(R3),R0 ;POINT TO ISSUING TASK'S TCB/‚ INCB T.TIO(R0) ;TALLY A BUFFERED I/O REQUEST 7ƒ DECB T.IOC(R0) ;ADJUST OUTSTANDING I/O REQUEST COUNT „ MOV I.PRM+16(R3),R1 ;GET PCBH?… SUB P.REL(R1),I.PRM(R3) ;CONVERT TO RELATIVE RELOCATION BIASG+† ADD #T.ST2,R0 ;POINT TO TASK STATUS BITS:‡ BIT #T2.AST!T2.WFR,(R0) ;TASK IN AST OR WAITFOR STATE ?ˆ BMI 10$ ;IF MI AT AST STATES'‰ BEQ 10$ ;IF EQ NOT IN WAITFOR STATE;5Š BIS #T2.SEF,(R0) ;STOP THE TASK FOR THE EVENT FLAGT‹10$: ;REFERENCE LABEL-Œ MOV (SP)+,R3 ;RESTORE PACKET ADDRESS IN R3 � RETURN ;YŽ�;+/�; **-$QUEBF-QUEUE BUFFERED I/O FOR COMPLETIOND‘;/I’; THIS ROUTINE QUEUES A SPECIAL ENTRY TO A TASK'S AST QUEUE TO COMPLETERH“; A BUFFERED I/O REQUEST THE NEXT TIME THE TASK IS SCHEDULED. IT ALSO,”; DECREMENTS THE TASK'S BUFFERED I/O COUNT•;SF–; NOTE: THIS ROUTINE IS EQUIVALENT TO CALLING $IOFIN AND IT DOES NOT—; UNBUSY THE DEVICE.˜;B ™; INPUTS:0š;O›; R0=FIRST WORD OF I/O STATUS œ; R1=SECOND WORD OF I/O STATUS�; R3=ADDRESS OF I/O PACKETž;R Ÿ; OUTPUTS: ;¡; NONE¢;-£?¤$QUEBF::MOV R0,I.PRM+6(R3) ;STORE OFFSPRING I/O RETURN STATUSE¥ MOV R1,I.PRM+10(R3) ;2¦ MOV I.TCB(R3),R0 ;PICK UP OFFSPRING TCB ADDRESS0§ MOVB #AK.BUF,A.CBL(R3) ;SET BUFFERED I/O FLAG¨©;+4ª;**-$REQUE-REQUEUE A REGION LOAD AST TO A TASK ASTF«;**-$REQU1-REQUEUE A REGION LOAD AST TO A TASK AST (ALTERNATE ENTRY)¬;DE­; THESE ROUTINES ARE USED TO QUEUE A TASK KERNEL AST WHICH HAS BEEN B®; USED AS A REGION LOAD AST BACK AS A TASK AST. THE BUFFERED I/O8¯; COUNT OF THE TASK IS DECREMENTED IF ENTRY AT $REQUE.°;R ±; INPUTS:S%²; R0=TCB ADDRESS OF ASSOCIATED TASKR%³; R3=ADDRESS OF PACKET TO BE QUEUEDP´;P µ; OUTPUTS: ¶; NONE. ·;-¸ ¹$REQUE::3º$REQU1::BIC #TS.CIP!TS.RDN,T.STAT(R0) ;UNBLK TASKR» MOV R0,R2 ;COPY TCB ADDRESS*(¼ ADD #T.ASTL,R2 ;POINT TO AST LISTHEAD.½ MOV (R2),(R3) ;LINK PACKET TO FRONT OF LIST ¾ BNE 10$ ;Q¿ MOV R3,2(R2) ;AÀ10$: MOV R3,(R2)00qÚt‹tt´cÚµcÛ¶c�·c›’ ; /Á BIT #T2.SEF,T.ST2(R0) ;TASK IN STOPFOR STATE  BNE 12$ ;IF NE YES2à CALLR $SETCR ;SET CONDITIONAL SCHEDULE REQUESTÄ,Å12$: CALLR $EXRQU ;UNSTOP TASK AND RETURNÆÇ;+(È; **-$IODSA-I/O DONE (FOR DSA DRIVERS)(É; **-$IOALT-I/O DONE (ALTERNATE ENTRY)Ê; **-$IODON-I/O DONEË;SPÌ; THIS ROUTINE IS CALLED BY DEVICE DRIVERS AT THE COMPLETION OF AN I/O REQUESTNÍ; TO DO FINAL PROCESSING. THE UNIT AND CONTROLLER ARE SET IDLE AND $IOFIN IS%Î; ENTERED TO FINISH THE PROCESSING.RÏ;) Ð; INPUTS:#Ñ;FÒ; R0=FIRST I/O STATUS WORD.TÓ; R1=SECOND I/O STATUS WORD.=Ô; R2=STARTING AND FINAL ERROR RETRY COUNTS IF ERROR LOGGINGR Õ; DEVICE.EÖ; R5=ADDRESS OF THE UNIT CONTROL BLOCK OF THE UNIT BEING COMPLETED.+×; (SP)=RETURN ADDRESS TO DRIVER'S CALLER. Ø;OEÙ; NOTE: IF ENTRY IS AT $IOALT, THEN R1 IS CLEAR TO SIGNIFY THAT THE Ú; SECOND STATUS WORD IS ZERO.Û; JÜ; IF ENTRY IS AT $IODSA, UMR DEALLOCATION, DEVICE BUSY STATUS, AND)Ý; ERROR LOGGING FINISH CODE IS SKIPPED Þ; OUTPUTS:ß; )à; THE UNIT AND CONTROLLER ARE SET IDLE./á;T)â; R3=ADDRESS OF THE CURRENT I/O PACKET.Eã;- ä .ENABL LSBOå.æ$IOALT::CLR R1 ;ZERO SECOND I/O STATUS WORD ç$IODON::è;+é; ** W A R N I N G **ê;)ë; SPM HOOKPOINT NUMBER 18.ì; +í; DO NOT CHANGE THE INSTRUCTION FOLLOWING î; LABEL WITHOUT CHECKING SPMï;-ð-ñ$SPH18==. ;SPM CHANGES THE INSTRUCTION ATT!ò ;THE LOCATION OF THIS LABELDó8ô MOV U.SCB(R5),R4 ;GET ADDRESS OF STATUS CONTROL BLOCKõ*ö BICB #US.BSY,U.STS(R5) ;CLEAR UNIT BUSY(÷ CLRB S.STS(R4) ;CLEAR CONTROLLER BUSYøù .IF DF E$$LOG&E$$DVCú3û BIT #S2.EIP,S.ST2(R4) ;IS AN ERROR IN PROGRESS?Iü BEQ 15$ ;IF EQ NON,ý MOV R1,-(SP) ;SAVE SECOND I/O STATUS WORD-þ CALL $FNERL ;FINISH ERROR LOGGING PROCESSG(ÿ MOV (SP)+,R1 ;RESTORE I/O STATUS WORD .ENDC ; DF E$$LOG&E$$DVCS15$: ;REFERENCE LABEL .IF DF U$$UMR. BIT #FE.EXT,$FMASK ;IS THIS A 22-BIT SYSTEM  BEQ 20$ ;IF EQ NOL/  BITB #UC.NPR,U.CTL(R5) ;IS IT AN NPR DEVICE? )  BEQ 20$ ;IF EQ NO, DOES NOT USE UMR'SU!  MOV S.KRB(R4),R2 ;POINT TO KRB/  BEQ 20$ ;BLOW OFF ALLOCATING UMRS IF NO KRBEB BIT #KS.MBC!KS.EXT,K.STS(R2) ;DIRECT ACCESS TO 22-BIT ADDRESS?& BNE 20$ ;IF NE YES -- USES NO UMRS) ADD K.OFF(R2),R2 ;POINT PAST UMR BLOCKO. SUB #M.LGTH,R2 ;POINT TO START OF UMR BLOCK# CALL $DEUMR ;DEASSIGN ANY UMR'S8 MOV #$DQUMR,-(SP) ;PUSH ADDRESS TO CHECK FOR UMR WAIT .ENDC ; DF U$$UMR720$: MOV S.PKT(R4),R3 ;RETRIEVE ADDRESS OF I/O PACKET .IF DF,P$$MON+ BR 200$ ; SKIP PERFORMANCE MONITOR NOPST .IFTF ; P$$MONO $IODSA:: ! .IFT ; P$$MON";+#; ** W A R N I N G **I$;A%; SPM HOOKPOINT NUMBER 19.&;$+'; DO NOT CHANGE THE INSTRUCTION FOLLOWING)(; LABEL WITHOUT CHECKING SPM);-*-+$SPH19==. ;SPM CHANGES THE INSTRUCTION ATR!, ;THE LOCATION OF THIS LABELU-). NOP ;UGLY, BUT WE HAVE TO DO THIS AS/ ;THERE'S NO OTHER WAY*0 NOP ;TO BE ASSURED OF EXACTLY 2 WORDS1 ;TO REPLACE..2200$: ;REFERENCE LABEL TO BYPASS THE NOPS3 ;EXCEPT FOR $IODSA45 .ENDC67 .IF DF E$$LOG&E$$DVC 869 BIT #S2.LOG,S.ST2(R4) ;ERROR LOGGING (MASS STORE) ?: BEQ 23$ ;IF EQ NO>; TALLY$ B.MIOC,XA$$IO,CPU ;COUNT A MASS STORE I/O COMPLETION<23$:= .ENDC ; DF E$$LOG&E$$DVCS>? .IF DF Q$$OPT@1A TST (R4) ;ANY OTHER I/O REQUESTS TO INITIATE?PB BEQ 25$ ;IF EQ GO TO $IOFINA&C MOV R3,R4 ;COPY I/O PACKET POINTER6D ADD #I.PRM+14,R4 ;POINT TO LAST WORD FOR FORK BLOCK0E MOV R0,(R4) ;STORE I/O STATUS BLOCK CONTENTSF MOV R1,-(R4) ;IGHI .IF DF M$$PROJ.K MOV $CPBIT,-6(R4) ;SET UP OUR URM FOR FORK0LM .ENDCNO7P CALL $FORK0 ;FORK HERE TO ALLOW NEXT I/O INITIATION,0Q MOV R4,R0 ;RESTORE I/O STATUS BLOCK CONTENTSR MOV R5,R1 ;G5S SUB #I.PRM+10,R3 ;POINT TO BEGINNING OF I/O PACKETTTU .ENDCVAV25$: MOV I.UCB(R3),R5 ;GET UCB ADDRESS OF I/O REQUEST ;JWB168 WX .IF DF 00qâtnttöt÷tø tþfDATAS$$HDWY6[ CALL $SHFND ;IS THIS UNIT SHADOW RECORDED? ;**-1\ BCC 251$ ;IF CC YESU] JMP IOFIN2 ;GO TO $IOFIN:^251$: TSTB ML.DNC(R4) ;IS THIS FIRST PACKET THRU SYSTEM?6_ BNE 40$ ;IF NE NO -- MUST DECIDE WHAT TO TELL USER`a;F?b; THIS I/O PACKET IS THE FIRST ONE TO GO THRU THE SYSTEM. IFOAc; IT IS A WRITE PACKET, THEN WE MUST WAIT TO SEE THE OUTCOME OFTd; THE SECOND PACKET.e;f/g CMPB #IO.WLB/400,I.FCN+1(R3) ;IS IT A WRITE?D2h BNE 26$ ;IF NE NO -- CHECK FOR OTHER FUNCTIONS>i CALLR $SHSAV ;IF EQ YES -- SAVE STS AND WAIT FOR OTHER PKT=j26$: CMP #IO.SCF,I.FCN(R3) ;IS THIS A SHADOW COPY FUNCTION?Sk BEQ 28$ ;IF EQ YES9l CMPB #IO.RLB/400,I.FCN+1(R3) ;IS THIS A READ FUNCTION?I/m BNE 271$ ;IF NE NO -- DON'T KNOW WHAT IT ISEn ;BETTER EXIT NOWop; Bq; THIS FUNCTION IS AN IO.RLB FUNCTION (READ) AND NO SPECIAL COPY?r; SUBFUNCTION WAS SPECIFIED. WE NOW MUST CHECK TO SEE IF THE0 s; READ COMPLETED SUCCESSFULLY.t;2u%v CMP R0,#IS.SUC ;WAS IT SUCCESSFUL?w BEQ 271$ ;IF EQ YES -- EXITVxy; Az; THE FUNCTION IS A READ, AND THE FIRST I/O PACKET FAILED. NOWC?{; WE MUST DETERMINE WHETHER WE NEED TO CHECK THE FENCE (WHICH+C|; MEANS THAT CATCHUP IS ACTIVE) PRIOR TO TRYING THE OTHER PACKET.W}; ~! MOV R5,-(SP) ;SAVE UCB ADDRESS $€ MOV U.UMB(R5),R5 ;GET UMB ADDRESS*� CALL $CKLBN ;IS LBN RANGE BELOW FENCE?$‚ MOV (SP)+,R5 ;RESTORE UCB ADDRESSƒ BCC 30$ ;IF CC YES „27$: CALL $SHSAV ;SAVE STATUS%… MOV R3,-(SP) ;PREPARE TO LOG ERROR"† MOV R3,-(SP) ;PREPARE SOME MORE)‡ BR 45$ ;GO LOG SHADOW RECORDING ERRORHˆ271$: JMP IOFIN1 ;EXIT ‰>Š28$: MOV #IO.WLB,I.FCN(R2) ;SET WRITE LOGICAL BLOCK FUNCTION=‹ MOVB #251.,I.PRI(R2) ;SET PRIORITY TO THE HIGHEST POSSIBLE Œ�;FŽ; I/O PACKET IS A FAILED READ OR A READ/WRITE COMBINED. WE NOW WILLA�; ATTEMPT TO QUEUE THE PACKET TO THE ALTERNATE DRIVE AND SEE IF+6�; WE CAN'T GET SOME BETTER RESULTS TO TELL THE USER.‘; ’.“30$: CALL $SHSAV ;SAVE STATUS IN I/O PACKET$” MOV I.UCB(R2),R5 ;GET UCB ADDRESS&• MOV R2,R1 ;COPY I/O PACKET ADDRESS5– CALLR $DRQRQ ;TRY OTHER I/O PACKET TO OTHER DRIVE#—˜;F,™; AT THIS POINT, WE HAVE DONE TWO PACKETS.8š; WE MUST CONSOLIDATE THE RESULTS TO PASS TO THE USER.›;œ �40$: CALL $SHSAV ;SAVE STATUS*ž TSTB I.R0(R2) ;ERROR FROM FIRST PACKET?Ÿ BMI 42$ ;IF MI YES  TSTB R0 ;ERROR FROM SECOND?E¡ BMI 42$ ;IF MI YES)¢ JMP IOFIN1 ;SUCCESS FROM BOTH PACKETS£¤;:6¥; WE HAVE DETERMINED THAT AT LEAST ONE OF THE STATUS+¦; RETURN CODES SHOWED AN ERROR CONDITION./§;K¨8©42$: MOV ML.PRI(R4),R3 ;GET PRIMARY I/O PACKET ADDRESS#ª MOV R4,R2 ;COPY ML NODE ADDRESS 0« ADD #ML.PKT,R2 ;R2 = SECONDARY PACKET ADDRESS;¬ MOV I.R0(R3),ML.PR0(R4) ;SAVE STATUS FROM PRIMARY PACKET ;­ MOV I.R1(R3),ML.PR1(R4) ;SAVE STATUS FROM PRIMARY PACKETB-® MOV R3,-(SP) ;SAVE PRIMARY PACKET ON STACKO-¯ MOV R3,-(SP) ;SAVE PRIMARY PACKET ON STACKU9° CMP #IO.SCF,I.FCN(R3) ;IS THIS A SHADOW COPY FUNCTION?T± BNE 43$ ;IF NE NO +² TSTB I.R0(R3) ;IS THE PRIMARY STATUS OK?I³ BMI 45$ ;IF MI NO:#´ BR 44$ ;RETURN SECONDARY STATUSA3µ43$: TSTB I.R0(R3) ;HOW DOES PRIMARY STATUS LOOK?¶ BPL 45$ ;IF PL OKE8·44$: MOV R2,(SP) ;RETURN STATUS FROM SECONDARY PACKET¸¹;M7º; WE HAVE DECIDED WHICH STATUS TO RETURN TO THE USER. »;P¼'½45$: MOV R4,R1 ;COPY ML NODE ADDRESS 3¾ MOV $SHERR,R0 ;GET TCB ADDRESS OF THE ERROR TASKT ¿ BEQ 46$ ;IF EQ NO ERROR TASK9À CMP $SHPCT,$SHLIM ;DO WE ALREADY HAVE ENOUGH PACKETS ? .Á BLT 451$ ;IF LT NO, GO AHEAD WITH THIS ONE8 TST $SHLOS ;HAVE WE LOST TOO MANY TO KEEP TRACK OF ?,à BMI 46$ ;IF MI YES, DON'T COUNT THIS ONE#Ä INC $SHLOS ;COUNT ONE MORE LOSTÅ BR 46$ ;AND THROW IT AWAYS,Æ451$: INC $SHPCT ;COUNT ONE MORE IN QUEUE4Ç CLR ML.FID(R4) ;INITIALIZE FILE ID FOR ERROR TASK3È CLR ML.FSEQ(R4) ;INITIALIZE FILE SEQUENCE NUMBERH2É CALL GETWIN ;GET WINDOW ADDRESS, IS THERE ONE?,Ê BEQ 454$ ;IF EQ THERE IS NO WINDOW BLOCK$Ë MOV W.FCB(R2),R2 ;GET F00qêt‹tt´cÚµcÛ¶c�·c›’CB ADDRESS*Ì BEQ 454$ ;IF EQ, NO FILE CONTROL BLOCKÍ MOV KISAR5,-(SP) ;SAVE PAR 5TÎ MOV R3,-(SP) ;SAVE R3-Ï CMP R2,#120000 ;IS THE FCB WITHIN THE ACP?EÐ BLO 452$ ;IF LO NO$Ñ MOV I.UCB(R3),R3 ;GET UCB ADDRESS$Ò MOV U.ACP(R3),R3 ;GET ACP ADDRESS?Ó MOV T.OFF(R3),KISAR5 ;PICK UP OFFSET INTO TASK REGION OF ACP 0Ô MOV T.PCB(R3),R3 ;GET PCB ADDRESS FOR THE ACP=Õ BIT #PS.CKP!PS.CKR!PS.OUT,P.STAT(R3) ;IS ACP CHECKPOINTED?Ö BNE 453$ ;IF NE YESS>× ADD P.REL(R3),KISAR5 ;MAP THE ACP TASK REGION THROUGH APR 5.Ø CMP R2,#140000 ;IS THE FCB MAPPED BY APR 6?Ù BLO 452$ ;IF LO NO3Ú SUB #20000,R2 ;CONVERT FCB ADDRESS TO APR 5 BIAS 4Û ADD #200,KISAR5 ;ADJUST MAPPING TO NEXT 4K OF FCP:Ü452$: MOV F.FNUM(R2),ML.FID(R4) ;MOVE FILE ID TO ML NODE8Ý MOV F.FSEQ(R2),ML.FSEQ(R4) ;MOVE FILE SEQUENCE NUMBER Þ453$: MOV (SP)+,R3 ;RESTORE R3)ß MOV (SP)+,KISAR5 ;RESTORE KERNEL PAR 5P5à454$: CALL $DLNK ;REMOVE THE ML NODE FROM THE LIST4(á MOV ML.TCB(R4),R3 ;GET ADDRESS OF TCB4â MOV T.NAM(R3),ML.TCB(R4) ;PUT TASK NAME IN PACKET!ã MOV T.NAM+2(R3),ML.TCB+2(R4) ;,ä CALL $EXRQF ;QUEUE ML NODE TO ERROR TASK6å46$: MOV (SP)+,R3 ;GET I/O PACKET ADDRESS FROM STACK'æ MOV I.R0(R3),R0 ;GET PROPER STATUSES.'ç MOV I.R1(R3),R1 ;GET PROPER STATUSESO,è MOV (SP)+,R3 ;GET REAL I/O PACKET ADDRESSí ;**-45"í .ENDC ; DF S$$HDW ;JWB213ï ;**-1Oð .IF DF P$$MONñ!ò BR P1 ;BYPASS IOFIN HOOKPOINT óô .ENDCõ ö .DSABL LSB,÷ø;+ù; **-$IOFIN-I/O FINISHú;MOû; THIS ROUTINE IS CALLED TO FINISH I/O PROCESSING IN CASES WHERE THE UNIT ANDEIü; CONTROLLER ARE NOT TO BE DECLARED IDLE. IF THE TASK WHICH ISSUED THERGý; I/O HAS HAD A RECENT MAPPING CHANGE WHICH MAY HAVE UNMAPPED ITS I/O,Hþ; STATUS BLOCK, THE I/O PACKET IS QUEUED TO THE FRONT OF ITS AST QUEUE<ÿ; TO BE COMPLETED LATER IN $FINBF BY CALLING $IOFIN AGAIN.;* ; INPUTS:D;M; R0=FIRST I/O STATUS WORD. ; R1=SECOND I/O STATUS WORD.); R3=ADDRESS OF THE I/O REQUEST PACKET.I; ; OUTPUTS:;I' ; THE FOLLOWING ACTIONS ARE PERFORMEDC ;WG ; 1-THE FINAL I/O STATUS VALUES ARE STORED IN THE I/O STATUS BLOCK IFA ; ONE WAS SPECIFIED.  ;A=; 2-ALL ASSOCIATED I/O COUNTS ARE DECREMENTED AND TS.RDN IS:; CLEARED IN CASE THE TASK WAS BLOCKED FOR I/O RUNDOWN.<; T3.MPC IS CLEARED IF THE TASK I/O COUNT GOES TO ZERO TO=; INDICATE THAT THE I/O COUNT WENT TO ZERO AFTER A MAPPING ; CHANGE.;NA; 3-IF 'TS.CKR' IS SET, THEN IT IS CLEARED AND CHECKPOINTING OF; THE TASK IS INITIATED. ;WD; 4-IF AN AST SERVICE ROUTINE WAS SPECIFIED, THEN AN AST IS QUEUED6; FOR THE TASK. ELSE THE I/O PACKET IS DEALLOCATED.; 4; 5-A SIGNIFICANT EVENT OR EQUIVALENT IS DECLARED.; *; NOTE: R4 IS DESTROYED BY THIS ROUTINE.;-$IOFIN:: ;REFERENCE LABELS ! .IF DF P$$MON"#;+$; ** W A R N I N G **C%;H&; SPM HOOKPOINT NUMBER 35.'; +(; DO NOT CHANGE THE INSTRUCTION FOLLOWINGC); LABEL WITHOUT CHECKING SPM*;-+-,$SPH35==. ;SPM CHANGES THE INSTRUCTION AT!- ;THE LOCATION OF THIS LABEL .(/ NOP ;UGLY, BUT IT'S THE ONLY WAY WE"0 ;CAN ASSURE TWO INSTRUCTIONS)1 NOP ;TO PICK UP AND REPLACE WITH THEE2 ;SPM HOOKS3P1:45 .ENDC66 .ENABL LSB ; BM3877%8 .IF DF R$$AMD ;AUTOMOUNT/DISMOUNT9@:; NOTE THAT THIS CODE WILL NOT WORK IF EITHER ERROR LOGGING OR!;; SHADOW RECORDING IS TURNED ONN<.= TSTB R0 ;ERROR IN PROCESSING I/O REQUEST ?> BPL 100$ ;IF PL, NO)? MOV I.UCB(R3),R4 ;YES, GET UCB ADDRESSN@ ASSUME US.SIO,200(A TSTB U.ST2(R4) ;I/O STALLED TO UNIT ?-B BPL 100$ ;IF PL, NO - PASS ERRORS TO TASKN=C CMP $VERTK,I.TCB(R3) ;I/O REQUEST FROM VERIFICATION TASK ?S.D BEQ 100$ ;IF EQ, YES - PASS ERRORS TO TASK5E MOV U.SCB(R4),R0 ;GET SCB LISTHEAD FOR I/O PACKETSO%F MOV R3,R1 ;GET CURRENT I/O PACKETN6G ADD #U.SPRM,R4 ;POINT TO PARAMETER SAVE AREA IN UCB;H ADD #I.PRM+6,R3 ;POINT TO READ/WRITE CELLS IN I/O PACKETEI MOV (R4)+,(R3)+ ;RESTOREJ MOV (R400qòtnttöt÷tø tþfDATA)+,(R3)+ ; I/O K MOV (R4)+,(R3)+ ; PACKETL MOV (R4),(R3) ;3M CALL $QINSB ;RE-INSERT PACKET AT FRONT OF QUEUE N RETURN ;TOP100$: ;REFERENCE LABELOQR .ENDC ; DF R$$AMDST .IF DF S$$HDWUV MOV R5,-(SP) ;SAVE R59W MOV I.UCB(R3),R5 ;SET UCB ADDRESS FOR SHADOW RECORDINGO/X CALL $SHFND ;SEE IF WE HAVE PACKET PROBLEMS#Y MOV (SP)+,R5 ;RESTORE R5 )Z BCS IOFIN2 ;IF CS NO SHADOW RECORDING [\;RD]; THIS IS THE POINT WHERE WE WILL DEALLOCATE AN ML NODE AND RETURNF^; THE STATUS IN THE REGISTERS TO THE USER. ALL PROCESSING CONCERNED>_; WITH STATUS RETURNS MUST HAVE BEEN RESOLVED AT THIS POINT.`;a6bIOFIN1: CALL $DLNK ;REMOVE ML NODE FROM LIST ON UMB4c MOV ML.PRI(R4),R3 ;GET PRIMARY I/O PACKET ADDRESS(d MOV R3,-(SP) ;SAVE I/O PACKET ADDRESSe MOV R1,-(SP) ;SAVE STATUSf MOV R0,-(SP) ;SAVE STATUS,g MOVB ML.LEN(R4),R1 ;GET LENGTH OF ML NODE#h MOV R4,R0 ;COPY ML NODE ADDRESSR*i CALL $DEACB ;RELEASE STORE FOR ML NODEj MOV (SP)+,R0 ;RESTORE STATUSHk MOV (SP)+,R1 ;RESTORE STATUSU+l MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSUmIOFIN2: ;REFERENCE LABELEno .ENDCp4q TALLY$ B.AIOC,XA$$IO,CPU ;COUNT AN I/O COMPLETIONrs5t MOV R0,I.PRM+6(R3) ;STORE FIRST WORD OF I/O STATUSS7u MOV R1,I.PRM+10(R3) ;STORE SECOND WORD OF I/O STATUSP(v TSTB I.EFN(R3) ;VIRTUAL I/O FUNCTION?"v BPL 205$ ;IF PL NO ; BM3873x BICB #200,I.EFN(R3) ;CLEAR VIRTUAL FLAG ;**-10y BIT #1,I.LN2(R3) ;HEADER LOCKED DOWN FOR ACP?z BNE 1$ ;IF NE NO;{ MOV I.TCB(R3),R0 ;THE I/O PACKET IS CONNECTED TO THE TCBE4| MOV T.ATT(R0),R0 ;THE TCB IS CONNECTED TO THE ADB } SUB #A.TCBL,R0 ;FIND THE FOOT"~ CALL $DECIO ;UNLOCK THE HEADER1$: ;REFERENCE LABEL(2 MOV #205$,-(SP) ;FAKE RETURN ADDRESS ; BM3879$DCWIO::MOV $WCFLG,R0 ;GET UCB FLAG FOR TEST ; BM3873, BEQ 11$ ;IF EQ W.IOC DISABLED ; BM3876 MOV I.UCB(R3),R2 ;GET DEVICE UCB ADDRESS ; BM3871 BIT R0,U.CW1(R2) ;FILES-11 DEVICE ? ; BM387W! BEQ 2$ ;IF EQ, NO ; BM387< CALL GETWIN ;GET WINDOW ADDRESS, IS THERE ONE ? ; BM387! BEQ 2$ ;IF EQ, NO ; BM387C7 DECB W.IOC(R2) ;DECREMENT WINDOW I/O COUNT ; BM387 11$: ; ; BM387† .IF DF R$$LKL ;**-6‡2ˆ MOV I.PRM+16(R3),R0 ;PICK UP LOCK BLOCK ADDRESS‰ BEQ 2$ ;IF EQ THERE IS NONEO3Š CMP R0,#140000 ;IS IT A RELOCATED USER ADDRESS ? ‹ BHIS 2$ ;IF HIS, YES%Œ DEC (R0) ;FREE LOCK FOR UNLOCKING7�Ž .ENDC ; DF R$$LKL��2$:E� RETURN ; BM387;&�205$: ;REFERENCE LABEL ; BM3877‘ MOV I.IOSB+4(R3),R2 ;GET ADDRESS OF I/O STATUS BLOCK;0’ BEQ 10$ ;IF EQ NO I/O STATUS BLOCK SPECIFIED“” .IF DF R$$IIC1• BIT #1,R2 ;INTERNAL I/O COMPLETION REQUESTED?L"– BEQ 21$ ;IF LO BIT NOT SET, NO— DEC R2 ;CLEAR LO BIT0˜ MOV KISAR5,-(SP) ;SAVE CURRENT KISAR5 MAPPING0™ MOV KISAR6,-(SP) ;SAVE CURRENT KISAR6 MAPPING6š MOV I.IOSB+2(R3),KISAR5 ;MAP I/O COMPLETION ROUTINE:› MOV KISAR5,KISAR6 ;ROUTINE MAY BE MAPPED THROUGH KISAR6œ� .IF DF K$$DASž#Ÿ MOV KINAR5,-(SP) ;SAVE I-SPACE 5I#  MOV KINAR6,-(SP) ;SAVE I-SPACE 6U$¡ MOV KISAR5, KINAR5 ;MAP I-SPACE 5$¢ MOV KISAR6, KINAR6 ;MAP I-SPACE 6£¤ .IFTF ; K$$DAST¥3¦ CALL (R2) ;CALL INTERNAL I/O COMPLETION ROUTINEN§¨ .IFT ; K$$DAS©2ª MOV (SP)+,KINAR6 ;RESTORE SAVED MAPPING CONTEXT« MOV (SP)+,KINAR5 ;...¬ .ENDC ; K$$DASI­2® MOV (SP)+,KISAR6 ;RESTORE SAVED MAPPING CONTEXT¯ MOV (SP)+,KISAR5 ;S° RETURN ;DONE ±21$: ;REF LABEL² .ENDC ;R$$IIC³.´ MOV I.TCB(R3),R0 ;POINT TO ISSUING TASK TCB8µ BIT #TS.BLC,T.STAT(R0) ;TASK BLOCKED (CHECKPOINTED) ?.¶ BNE 3$ ;IF NE YES, DEFER I/O STATUS UPDATE0· BIT #T3.MPC,T.ST3(R0) ;RECENT MAPPING CHANGE?¸ BEQ 5$ ;IF EQ NO8¹3$: CALL $SETCR ;RESCHEDULE TASK TO LOOK AT AST QUEUE&º MOV R3,R1 ;COPY I/O PACKET POINTER:» MOVB #AK.DIO,A.CBL(R1) ;INDICATE DELAYED I/O COMPLETION3¼ ADD #T.ASTL,R0 ;POINT TO TASK AST QUEUE LISTHEAD+3½ CALL $QINSB ;INSERT BLOCK AT BEGINNING OF QUEUE2¾ BR $DECAL ;DEC I/O00qút‹tt´cÚµcÛ¶c�·c›’ COUNTS, UNBLK TASK & RETURN,¿5$: MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING3À MOV I.IOSB+2(R3),KISAR6 ;MAP TO I/O STATUS BLOCKD6Á MOV I.PRM+6(R3),(R2)+ ;SET FINAL I/O STATUS VALUES MOV I.PRM+10(R3),(R2) ;,à MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING2Ä10$: CALL $DECAL ;DEC I/O COUNTS & UNBLOCK TASK6Å MOV I.TCB(R3),R1 ;GET ADDRESS OF TASK CONTROL BLOCK.Æ DECB T.IOC(R1) ;DECREMENT I/O REQUEST COUNT1Ç BNE 15$ ;IF NE TASK STILL HAS OUTSTANDING I/O 2È BIC #T3.MPC,T.ST3(R1) ;CLEAR MAPPING CHANGE BITÉ15$: ;REF LABELÊ7Ë MOV I.TCB(R3),R1 ;PICK UP ISSUING TASK'S TCB ADDRESS+!Ì MOV R5,-(SP) ;SAVE UCB ADDRESSC$Í MOV I.TCB(R3),R5 ;SET TCB ADDRESS+Î MOVB I.EFN(R3),R0 ;GET EVENT FLAG NUMBER)3Ï CALL $SETFG ;SET EFN AND UNLOCK IF GROUP GLOBAL0Ð&Ñ MOV R3,R0 ;COPY I/O PACKET ADDRESS#Ò TST (R3)+ ;POINT TO SECOND WORDO5Ó MOV #I.LGTH,(R3)+ ;INSERT LENGTH OF BLOCK IN BYTESRAÔ MOV #8.*2,(R3)+ ;SET NUMBER OF BYTES TO ALLOCATE ON USER STACK*Õ MOV I.AST(R0),(R3)+ ;INSERT AST ADDRESS!Ö BEQ 70$ ;IF EQ NONE SPECIFIEDM0× MOV #1,(R3)+ ;INSERT NUMBER OF AST PARAMETERSBØ MOV I.IOSB(R0),(R3) ;INSERT VIRTUAL ADDRESS OF I/O STATUS BLOCK)Ù MOV R0,R1 ;COPY ADDRESS OF I/O PACKETL0Ú MOV R5,R0 ;CALCULATE ADDRESS OF AST LISTHEADÛ ADD #T.ASTL,R0 ;$Ü CALL $QINSF ;INSERT AST IN QUEUEÝ MOV R5,R0 ;COPY TCB ADDRESSR*Þ CALL $SETCR ;SET TASK SCHEDULE REQUEST ß BR 80$ ;*à70$: CALL $DEPKT ;DEALLOCATE I/O PACKET(á80$: MOV (SP)+,R5 ;RESTORE UCB ADDRESS â RETURN ;Aãã .DSABL LSB ; BM387ã ; BM387#ä;+$å; *-GETWIN-GET FILE WINDOW ADDRESSæ;I ç; INPUT:è; R3=I/O PACKET ADDRESSOé; ê; OUTPUT:ë; R2=WINDOW ADDRESSRì; Z-BIT SET IF NO WINDOWí;-î@ïGETWIN: MOV I.LN2(R3),R2 ;GET IMAGE OF LUT2 OR ADDRESS OF LUT2ð BIT #1,R2 ;ADDRESS?ñ BNE 10$ ;IF NE NO òó .IF DF X$$HDRô)õ MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING$ö MOV I.TCB(R3),R2 ;GET TCB ADDRESS3÷ MOV T.PCB(R2),R2 ;GET PCB ADDRESS OF TASK REGIONR5ø MOV P.REL(R2),KISAR6 ;ASSUME WE NEED TO MAP HEADER ùú .IFTFû*ü MOV @I.LN2(R3),R2 ;GET CONTENTS OF LUT2ýþ .IFT3ÿ$ MOV (SP)+,KISAR6 ;RESTORE MAPPING .ENDC410$: BIC #1,R2 ;CLEAR POSSIBLE INTERLOCK, WINDOW?  RETURN ;2;+7 ; **-$DECAL-DECREMENT ALL I/O COUNTS AND UNBLOCK TASKE ; A ; THIS ROUTINE IS CALLED ON I/O COMPLETION TO DECREMENT ALL I/OR@ ; COUNTS IN ATTACHMENT DESCRIPTORS AND TO UNBLOCK THE TASK FOR* ; CHECKPOINT IN PROGRESS OR I/O RUNDOWN.;R ; INPUTS: ;M; R3=ADDRESS OF I/O PACKET.;F ; OUTPUTS:;( ; NONE. ;-;$DECAL::MOV I.AADA(R3),R0 ;DEC I/O COUNT IN 1ST ATT DESC?G BEQ 10$ ;IF EQ NO0& CLR I.AADA(R3) ;CLEAR ATT DESCR PTR$ CALL $DECIO ;DECREMENT THE COUNT;10$: MOV I.AADA+2(R3),R0 ;DEC I/O COUNT IN 2ND ATT DESCR? BEQ 20$ ;IF EQ NO ( CLR I.AADA+2(R3) ;CLEAR ATT DESCR PTR$ CALL $DECIO ;DECREMENT THE COUNT2 20$: MOV I.TCB(R3),R0 ;POINT TO ISSUING TASK TCB.! BIC #TS.CIP!TS.RDN,T.STAT(R0) ;UNBLOCK TASK " RETURN ;E#$;+A%; **-$DECBF-DECREMENT ALL PARTITION I/O COUNTS AND UNBLOCK TASK:&;.@'; THIS ROUTINE IS CALLED ON BUFFERINT I/O TO DECREMENT ALL I/O<(; COUNTS IN PCBS AND TO UNBLOCK THE TASK FOR CHECKPOINT IN); PROGRESS OR I/O RUNDOWN.*;D +; INPUTS:E,; -; R3=ADDRESS OF I/O PACKET.Q.; /; OUTPUTS:0;I 1; NONE. 2;-3/4$DECBF::MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS55 MOV I.AADA(R3),R0 ;DEC I/O COUNT IN 1ST ATT DESCR?B6 BEQ 10$ ;IF EQ NOT+7 BIS #1,I.AADA(R3) ;INDICATE BUFFERED I/O$8 CALL $DECIP ;DECREMENT THE COUNT'9 MOV (SP),R3 ;RESTORE PACKET ADDRESSH;:10$: MOV I.AADA+2(R3),R0 ;DEC I/O COUNT IN 2ND ATT DESCR?; BEQ 20$ ;IF EQ NO -< BIS #1,I.AADA+2(R3) ;INDICATE BUFFERED I/OS$= CALL $DECIP ;DECREMENT THE COUNT+>20$: MOV (SP)+,R3 ;RESTORE PACKET ADDRESS.? MOV I.TCB(R3),R0 ;POINT TO ISSUING TASK TCB.@ BIC #TS.CIP!TS.RDN,T.STAT(R0) ;UNBLOCK TASK A RETURN ;;BCD;+E; **-$IOKIL-I/O KILLF;$NG; THIS ROU00qunttöt÷tø tþfDATATINE IS CALLED TO FLUSH ALL I/O REQUESTS FOR THE CURRENT TASK FROMLH; A DEVICE QUEUE AND TO CANCEL THE CURRENT I/O OPERATION IN PROGRESS IF IT!I; IS ALSO FOR THE CURRENT TASK.DJ; K; INPUTS: L;Q>M; R5=ADDRESS OF THE UCB OF THE DEVICE TO FLUSH REQUESTS FOR.N; O; OUTPUTS:P;TDQ; IF THE SPECIFIED DEVICE IS NOT FILE STRUCTURED, THEN THE I/O RE-FR; REQUEST QUEUE IS FLUSHED AND THE CURRENT I/O OPERATION IN PROGRESSS; IS CANCELLED.T;*U; NOTE: R4 IS DESTROYED BY THIS ROUTINE.V;-W X$IOKIL::YZ .IF DF M$$PRO[2\ CLR $TEMP0 ;INDICATE THIS IS NOT DRQIO CALLING]^ .ENDC ; DF M$$PRO_2`$IOKL1::CLR $TEMP2 ;SET INDICATOR TO FLUSH ASTS.a$IOKL2::MOV U.SCB(R5),R4 ;GET ADDRESS OF SCB1b MOV $TKTCB,R1 ;GET TCB ADDRESS OF CURRENT TASK(c TST U.CW1(R5) ;DEVICE-UNIT MOUNTABLE?d BPL 10$ ;IF PL NOT/e BITB #US.MNT,U.STS(R5) ;DEVICE-UNIT MOUNTED?H#f BNE 10$ ;IF EQ NO - FLUSH QUEUER<g TST U.ACP(R5) ;DEVICE HAVE ACP (ALSO CATCHES NOT FOREIGN)(h BNE 40$ ;IF NE ES, CAN'T FLUSH QUEUEh10$: ;KLN054C1h .IF DF C$$RTK ;REMOTE TASK SUPPORT ;KLN054h ;KLN054Ah BIT #F5.RTK,$FMSK5 ;IS REMOTE TASK SUPPORT TURNED ON? ;KLN054O!h BEQ 15$ ;IF EQ NO ;KLN054h ;KLN054 Dh CMP (R5),$XXLOW ;IS THE DCB ADDRESS IN THE GENERIC RANGE? ;KLN054!h BLO 15$ ;IF LO NO ;KLN054U'h CMP (R5),$XXHGH ;IS IT? ;KLN054>h BLOS 40$ ;IF LO OR SAME, YES DON'T FLUSH QUEUE YET ;KLN054h ;KLN054Oh .ENDC ;C$$RTK ;KLN054,h15$: ;KLN054::h MOV R4,R3 ;COPY ADDRESS OF I/O QUEUE LISTHEAD ;KLN0548j20$: MOV R3,R2 ;SAVE ADDRESS OF CURRENT ENTRY ;**-1*k MOV (R2),R3 ;GET ADDRESS OF NEXT ENTRYl BEQ 40$ ;IF EQ END OF LIST/m CMP R1,I.TCB(R3) ;REQUEST FOR CURRENT TASK?Tn BNE 20$ ;IF NE NOE/o CMP R5,I.UCB(R3) ;REQUEST FOR SPECIFIED UCB?Kp BNE 20$ ;IF NE NOHq MOV (R3),(R2) ;CLOSE UP LIST r BNE 30$ ;IF NE NO NEW LAST(s MOV R2,2(R4) ;SET ADDRESS OF NEW LAST4t30$: MOV #IE.ABO&377,R0 ;SET FINAL STATUS TO ABORT1u TSTB $TEMP2 ;SUBFUNCTION BIT SET FOR IO.KIL ?Lv BMI 35$ ;IF MI YES4w CLR I.AST(R3) ;MAKE SURE THERE IS NO AST DECLARED.x35$: CLR R1 ;CLEAR R1 BEFORE CALLING $IOFIN#y CALL $IOFIN ;FINISH I/O REQUEST.z BR $IOKL2 ;GO AGAINR!{40$: TSTB U.STS(R5) ;UNIT BUSY?,| BMI 45$ ;IF MI YES -- ALWAYS CALL DRIVER}~ .IF DF M$$PRO€$� MOV U.SCB(R5),R4 ;GET SCB ADDRESS-‚ MOV S.KRB(R4),R4 ;GET KRB ADDRESS (IF ANY)A)ƒ BEQ 44$ ;IF EQ NO KRB -- CALL DRIVER?R1„ BIT K.URM(R4),$URMST ;IS THE KRB'S URM ONLINE?U*… BEQ 50$ ;IF EQ NO -- DON'T CALL DRIVER†‡ .ENDCˆ‰AŠ44$: BITB #UC.KIL,U.CTL(R5) ;CALL DRIVER REGARDLESS OF ACTIVITYB‹ BEQ 50$ ;IF EQ NO -- EXITI*Œ BITB #US.OFL,U.ST2(R5) ;DEVICE ONLINE ?� BNE 50$ ;IF NE NO -- EXIT Ž45$: ;REFERENCE LABEL��‘ .IF DF M$$PRO’+“ MOV $TEMP0,R0 ;WERE WE CALLED FROM DRQIOR” BEQ 46$ ;IF EQ NO"• MOV R0,SP ;RESET STACK POINTER0– TST (SP)+ ;ADVANCE PAST SECONDARY PACKET PTR0— MOV (SP)+,R4 ;SET ADDRESS OF I/O PACKET IN R42˜ INC R4 ;MAKE IT ODD TO INDICATE PACKET ADDRESS™ TST (SP)+ ;CLEAN STACK*š BR 461$ ;AND FORK TO CORRECT PROCESSOR›2œ46$: MOV $TKTCB,R4 ;GET CURRENT TASK TCB ADDRESS)�461$: MOV U.SCB(R5),R2 ;GET SCB ADDRESSE(ž MOV #465$,R3 ;GET THE ROUTINE ADDRESS7Ÿ JMP $EXRP1 ;TRANSFER EXECUTION TO CORRECT PROCESSOR0 /¡465$: BIT #1,R4 ;WERE WE CALLED FROM DRQIO ?(¢ BEQ 462$ ;IF EQ NO, JUST CALL DRIVER"£ MOV R4,R3 ;COPY PACKET ADDRESS¤ DEC R3 ;CLEAR LOW ORDER BITE¥ CLR R1 ;SET LENGTH AND(¦ MOV #IS.SUC&377,R0 ;STATUS FOR $IOFIN8§ MOV I.TCB(R3),-(SP) ;SAVE TCB ADDRESS FOR DRIVER CALL'¨ CALL $IOFIN ;FINISH THE I/O REQUEST,%© MOV (SP)+,R4 ;RETRIEVE TCB ADDRESS$ª,«462$: MOV R4,R1 ;RESTORE CURRENT TASK TCB(¬ MOV U.SCB(R5),R4 ;RESTORE SCB ADDRESS­® .ENDC¯°6± MOV S.PKT(R4),R0 ;GET ADDRESS OF CURRENT I/O PACKET9² MOV (R5),R2 ;RETRIEVE ADDRESS OF DEVICE CONTROL BLOCKV1³ MOV KINAR5,-(SP) ;SAVE KERNEL INSTR ADDR REG 5;00q u‹tt´cÚµcÛ¶c�·c›’´µ¶ .IF DF K$$DAS·0¸ MOV KDSAR5,-(SP) ;SAVE KERNEL DATA ADDR REG 5¹º .IFTF»¼½ .IF DF X$$HDR¾&¿ MOV KISAR6,-(SP) ;SAVE KERNEL APR 6ÀÁ .ENDCÂ+à MOV D.PCB(R2),R3 ;GET DRIVER PCB ADDRESSS)Ä BEQ 47$ ;IF EQ DRIVER IS PART OF EXEC 6Å MOV P.REL(R3),KINAR5 ;MAP THE DRIVER IN INSTR SPACEÆÇ .IFTÈ5É MOV P.REL(R3),KDSAR5 ;MAP THE DRIVER IN DATA SPACEÊË .IFTFÌ=Í47$: MOV D.DSP(R2),R2 ;GET ADDRESS OF DRIVER DISPATCH TABLES%Î BEQ 49$ ;IF EQ DRIVER IS UNLOADED$Ï MOV S.KRB(R4),R3 ;GET KRB ADDRESS!Ð BEQ 48$ ;IF EQ NO KRB ADDRESS&Ñ MTPS K.PRI(R3) ;SET DEVICE PRIORITY3Ò MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX FROM KRBÓÔ;VGÕ; CALL DRIVER AT CANCEL I/O OPERATION ENTRY POINT WITH THE ARGUMENTS: Ö;E)×; R0=ADDRESS OF THE CURRENT I/O PACKET. .Ø; R1=ADDRESS OF THE TCB OF THE CURRENT TASK.Ù; R3=CONTROLLER INDEX.+Ú; R4=ADDRESS OF THE STATUS CONTROL BLOCK.D)Û; R5=ADDRESS OF THE UNIT CONTROL BLOCK. Ü;S4Ý; IF S.KRB=0 THEN R3 IS UNDEFINED AND PRIORITY =0.Þ;Rß-à48$: MOV R5,-(SP) ;;;PROTECT R5 FROM DRIVERS.á CALL @D.VCAN(R2) ;;;CANCEL CURRENT REQUESTSâ MOV (SP)+,R5 ;;;RETRIEVE R5&ã MTPS #0 ;;;ALLOW DEVICE INTERRUPTSä49$: ;REF LABELåæç .IF DF X$$HDRè)é MOV (SP)+,KISAR6 ;RESTORE KERNEL APR 6Nêë .ENDCìíî .IFTOï3ð MOV (SP)+,KDSAR5 ;RESTORE KERNEL DATA ADDR REG 5ñò .ENDCóô4õ MOV (SP)+,KINAR5 ;RESTORE KERNEL INSTR ADDR REG 5ö50$: RETURN ;÷ø;+ ù; **-$SCDVT-SCAN DEVICE TABLES2ú; **-$SCDV1-SCAN DEVICE TABLES (ALTERNATE ENTRY)û;MRü; THIS ROUTINE IS A CO-ROUTINE THAT IS CALLED TO SCAN THE DEVICE TABLES. FOR EAC.ý; UNIT CONTROL BLOCK THE CALLER IS RECALLED.þ; ÿ; INPUTS:;(; R3=LIST POINTER (IF ENTRY AT $SCDV1);S ; OUTPUTS:;6; C=1 IF NO MORE ENTRIES EXIST IN THE DEVICE TABLES.9; C=0 IF THE NEXT DEVICE TABLE ENTRY IS BEING RETURNED.M,; R3=ADDRESS OF THE DEVICE CONTROL BLOCK.,; R4=ADDRESS OF THE STATUS CONTROL BLOCK.* ; R5=ADDRESS OF THE UNIT CONTROL BLOCK. ;- = ; ********************************************************* ; * *A-; * > > > W A R N I N G < < < *B ; * * ;; * THE FOLLOWING ARE OFFSET DEFINITIONS WHICH ARE *I;; * SUPPLIED EITHER BY DEFINITION IN THE EXEC (IOSUB) *O;; * OR THE DUMMY STB FILE (FROM SFVC2). ANY CHANGE TO *E;; * THESE DEFINITIONS MUST BE MADE IN BOTH MODULES. *D ; * *L=; *********************************************************R;F1S$$SPA==10 ;SYMBOL TO ADD TO SP TO ABORT SCAN*6S$$SPC==6 ;OFFSET ON SP TO CLR TO SKIP CURRENT DCB:$SCDVT::MOV #$DEVHD,R3 ;GET ADDRESS OF FIRST DCB ADDRESS8$SCDV1::MOV (SP)+,R4 ;REMOVE RETURN ADDRESS FROM STACK,10$: MOV (R3),R3 ;GET ADDRESS OF NEXT DCB BEQ 30$ ;IF EQ NO MORE' MOV D.UCB(R3),R5 ;POINT TO FIRST UCB)( BIT #DV.PSE,U.CW1(R5) ;PSEUDO DEVICE?  BNE 10$ ;IF NE YES=! MOVB D.UNIT+1(R3),-(SP) ;CALCULATE NUMBER OF UCB'S TO SCAN*" SUB D.UNIT(R3),(SP) ;%#20$: MOV R3,-(SP) ;SAVE DCB ADDRESSD!$ MOV R5,-(SP) ;SAVE UCB ADDRESS #% MOV R4,-(SP) ;SET RETURN ADDRESST8& MOV U.SCB(R5),R4 ;GET ADDRESS OF STATUS CONTROL BLOCK' CLC ;INDICATE ENTRY ( CALL @(SP)+ ;CALL THE CALLER&) MOV (SP)+,R4 ;REMOVE RETURN ADDRESS$* MOV (SP)+,R5 ;RESTORE UCB ADDRESS$+ MOV (SP)+,R3 ;RESTORE DCB ADDRESS', ADD D.UCBL(R3),R5 ;POINT TO NEXT UCBO&- DECB (SP) ;ANY MORE UCB'S TO SCAN?. CMPB (SP),#-1 ;/ BNE 20$ ;IF NE YES0 TST (SP)+ ;CLEAN STACK1 BR 10$ ;GO AGAIN230$: SEC ;INDICATE NO ENTRYM3 JMP (R4) ;RETURN TO CALLER45 .ENDP) ;SET RETURN ADDRESST8& MOV U.SCB(R5),R4 ;GET ADDRESS OF STATUS CONTROL BLOCK' CLC ;INDICATE ENTRY ( CALL @(SP)+ ;CALL THE CALLER&) MOV (SP)+,R4 ;REMOVE RETURN ADDRESS$* MOV (SP)+,R5 ;RESTORE UCB ADDRESS$+ MOV (SP)+,R3 ;RESTORE DCB ADDRESS', ADD D.UCBL(R3),R5 ;POINT TO NEXT UCBO&- DECB (SP) ;ANY MORE UCB'S TO SCAN?. CMPB (SP),#-1 ;/ BNE 20$ ;IF NE YES0 TST (SP)+ ;CLEAN STACK00runttöt÷tø tþfDATA .TITLE MLOCKA .IDENT /04.02/ R;R&; COPYRIGHT (C) 1975, 1977, 1979, 1984/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.Y;CA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.D;A;E$; RICHARD H. ECKHOUSE, JR. 5-MAR-75;T; MODIFIED BY:;M; J. M. LAWLER 07-JUL-83 04.01;;*; JL167 -- MAKE PATCH SPACE UNCONDITIONAL;K; J. W. BERZLE 08-SEP-83 04.02;N2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES; $; MULTIPROCESSOR LOCKING SUBROUTINES;; MACRO LIBRARY CALLS5;9  9 .IF DF M$$PRO Q .MCALL HWDDF$,BGCK$AY$ HWDDF$ ;DEFINE HARDWARE REGISTERS I;D; LOCK WORDS ARE OF THE FORM:E;E/; BYTE 0 = LOCK VALUE (0 IF LOCKED, 1 IF FREE)U; BYTE 1 = IF BYTE 0 EQUAL:"; 0, THEN BYTE 1 = OWNER OF LOCK"; 1, THEN BYTE 1 = COMPLEMENT OF; PREVIOUS OWNER1>; BYTE 2,3 = SECONDARY LOCK WORD (FORMAT ABOVE) FOR WAIT MASK.(; BYTE 4,5 = MASK OF WAITING PROCESSORS.;I+; NOTE: BYTES 4+5 ARE REFERENCED AS A WORD.I;S O;+2; **-$MLOCK-MULTIPROCESSOR WAIT-LOCK LOCK ROUTINE.;PE; THIS ROUTINE WILL USE THE ASRB INSTRUCTION TO LOCK A DATA STRUCTUREI?; OR CODE SEGMENT. IT OPERATES ON LOCK BLOCKS DESCRIBED ABOVE.(G; IT IS CALLED FROM AN INVOCATION OF THE LOCK$ MACRO WHEN THE LOCK TYPE1E; IS "WAIT". IT WILL ATTEMPT THE LOCK, AND IF IT FAILS WILL POST THEWI; FACT THAT THIS PROCESSOR IS WAITING, THEN PLACE ITSELF IN A WAIT STATE.EB; THIS ROUTINE SHOULD ONLY BE CALLED AT PRIORITY ZERO, UNBYPASSED.I; WHEN IT EXITS, THE PRIORITY IS AGAIN ZERO, AND THE CACHE IS UNBYPASSED.T;. ; INPUTS:S;U!; 0(SP)=RETURN ADDRESS TO CALLER.T; 2(SP)=ADDRESS OF LOCK BLOCK.; ; OUTPUTS:;E>; LOCK BLOCK IS LOCKED, AND THIS PROCESSOR IS OWNER. PRIORITY;; EQUALS ZERO, CACHE UNBYPASSED. CACHE HAS BEEN FLUSHED IF.$; MORE THAN ONE PROCESSOR IS ACTIVE.;L; ALL REGISTERS ARE PRESERVED.;- E'$MLOCK::MOV R4,-(SP) ;SAVE R4 FOR LATERA MFPS -(SP) ;SAVE PRIORITYO. MTPS #PR7 ;DON'T WANT TO BE INTERRUPTED HERE  N .IF DF P$$D70 R% MOV $URMST,R4 ;;;GET ONLINE BUS RUNSY# BIC $CPMSK,R4 ;;;MAKE IT CPUS ONLY=" BIC $CPBIT,R4 ;;;IGNORE OURSELVES1 BEQ 5$ ;;;IF EQ DON'T BOTHER TO FLUSH OR BYPASSB4 BIS #BYPASS,@$MPCSR+6 ;;;FLUSH AND BYPASS THE CACHE5$: ;;;REFERENCE LABELP E .ENDC A E;F; CURRENT STACK CONTENTS: ;C; 0(SP) = SAVED PRIORITY. ; 2(SP) = SAVED R4 FROM ENTRY.#; 4(SP) = RETURN ADDRESS TO CALLER.A&; 6(SP) = ADDRESS OF LOCK BLOCK.;P ! MOV 6(SP),R4 ;;;GET LOCK ADDRESS   .IF DF L$$DBG $ CMPB 1(R4),$PROCN ;;;DO WE OWN LOCK. BEQ ERR5 ;;;IF EQ YES -- CRASH, NO WALK THRU , .ENDC E R#10$: ASRB (R4) ;;;ATTEMPT THE LOCKR BCS 20$ ;;;IF CS WE NOW OWN IT M;RE; WE HAVE ATTEMPTED TO LOCK THE LOCK BYTE, AND FAILED TO GAIN ACCESS.C0; WE WILL NOW POST THE FACT THAT WE ARE WAITING.;  A, LOCK$ 2(R4),SPIN ;;;LOCK THE SECONDARY LOCK6 BIS $CPBIT,4(R4) ;;;POST THE FACT THAT WE ARE WAITING/ ULOCK$ 2(R4),SPIN ;;;UNLOCK THE SECONDARY LOCKG- ASRB (R4) ;;;ATTEMPT THE PRIMARY LOCK AGAINC& BCS 30$ ;;;IF CS WE GOT IT THIS TIME/ MTPS (SP) ;;;LOWER PRIORITY TO ENTRANCE VALUE., TST $PWRFL ;;;SEE IF POWERFAIL FLAG IS SET* BNE 15$ ;;;IF SET, SKIP WAIT INSTRUCTION) BIT @$CPURM,$URMST ;;;ARE WE ONLINE YET?T$ BEQ 15$ ;;;IF EQ NO -- NO IIST YET! WAIT ;;;WAIT FOR ANY INTERRUPTA215$: MTPS #PR7 ;;;WE DON'T WANT TO BE INTERRUPTED" BR 10$ ;;;TRY PRIMARY LOCK AGAIN ;T#; WE HAVE GAINED ACCESS TO THE LOCKP;; N20$: ;;;REFERENCE LABEL  ) .IF DF L$$DBG I930$: CACHE$ BYPASS ;;;NEED TO CHECK OUT SOME REAL VALUESM- TSTB 1(R4) ;;;DOES LOCK ALREADY SHOW OWNED?0 BPL ERR4 ;;;IF PL YES -- SOMEHOW WE BROKE LOCK& MOVB $PROCN,1(R4) ;;;SHOW US AS OWNER T .IFTF R- CACHE$ RESTOR ;;;THRU WITH CHANGABLE VALUESN - .IFFT T30$: ;;;REFERENCE LABEL R .ENDC M MTPS (SP)+ ;;;RESTORE PRIORITY MOV (SP)+,R4 ;RESTORE R4M$ MOV (SP)+,(SP) ;MOVE RETURN ADDRESS CACHE$ FLUSH ;FLUSH CACHEN RETURN  R:ERR5: BGCK$A BF.00rus!ut´cÚµcÛ¶c�·c›’MP,BE.WTL,FATAL ;ATTEMPT TO WALK THRU LOCK ;+7; **-$MULCK-MULTIPROCESSOR WAIT LOCK UNLOCK SUBROUTINE.L; B; THIS ROUTINE WILL UNLOCK THE SOFTWARE MULTIPROCESSOR LOCK, USING@; THE ASRB INSTRUCTION TO INTERLOCK MEMORY. IT WILL CHECK TO SEEF; IF ANY PROCESSOR IS WAITING, AND IF ANY ARE, IT WILL INTERRUPT THEM.;N ; INPUTS:R;.!; 0(SP)=RETURN ADDRESS OF CALLER.R; 2(SP)=ADDRESS OF LOCK BLOCK.;R ; OUTPUTS:;(4; LOCK IS UNLOCKED. ANY WAITING PROCESSORS HAVE BEEN; INTERRUPTED.;5:; PRIORITY IS PRESERVED AT EXIT, BUT MAY GO TO ZERO DURING; THIS ROUTINES EXECUTION.;W; CACHE IS UNBYPASSED.;L; ALL REGISTERS ARE PRESERVED.;- F$MULCK::MOV R5,-(SP) ;SAVE R5G MOV R4,-(SP) ;SAVE R4" MOV 6(SP),R4 ;GET ADDRESS OF LOCK$ MFPS -(SP) ;SAVE PRIORITY FOR EXIT4 MTPS #PR7 ;RAISE PRIORITY SINCE WE WILL LOCK LATER   .IF DF L$$DBG E! CMPB 1(R4),$PROCN ;DO WE OWN IT?L BNE ERR1 ;IF NE NO -- CRASH ASRB (R4) ;IS LOCK LOCKED?% BCS ERR3 ;NO - WE JUST GOT IT, OOPS COMB 1(R4) ;CLEAR WHO DONE ITI B .ENDC O;R!; SEE IF ANY PROCESSOR IS WAITING.;W 6 LOCK$ 2(R4),SPIN ;;;LOCK SECONDARY LOCK IN LOCK BLOCK/ MOV 4(R4),R5 ;;;GET MASK OF WAITING PROCESSORS,/ CLR 4(R4) ;;;CLEAR MASK OF WAITING PROCESSORSK M; D; AT THIS POINT, WE WILL SET THE BITS IN $IICPU FOR THOSE CPUS WHICH6; ARE CURRENTLY WAITING, AND HAVE WORK TO DO ($IIPND).7; UNFORTUNATELY, WE MUST LOCK THE FORK LOCK TO DO THIS.A;  )F;******************************* IIST DEBUGGING CODE ***************** BR 4$ ;ENTER NEW CODE. BR 6$ ;DON'T ENTER NEW CODEEF;******************************* END IIST DEBUGGING CODE *************+4$: MOV R5,-(SP) ;GET SOME SPACE TO WORK INO' MOV $IIPND,-(SP) ;CALC $IIPND .AND. R5I/ COM (SP) ;CREATE MASK OF CPUS NOT HAVING WORKL8 BIC (SP)+,R5 ;R5=CPUS WHICH HAVE WORK AND WILL BE INTED# BEQ 5$ ;IF EQ DON'T BOTHER $IICPUP* LOCK$ $FORKL,SPIN ;LOCK ONCE MORE (YEECH)% BIS R5,$IICPU ;SHOW OURS INTERRUPTED** ULOCK$ $FORKL,SPIN ;UNLOCK FORK LIST LOCK%5$: MOV (SP)+,R5 ;RESTORE ORIGINAL R5D(6$: MOVB #1,(R4) ;;;UNLOCK PRIMARY LOCK+ ULOCK$ 2(R4),SPIN ;;;UNLOCK SECONDARY LOCKN7 BIC $CPBIT,R5 ;;;WE ALREADY HAD LOCK, SO CLEAR OUR BITT! BEQ 10$ ;;;IF EQ NO CPU WAITING  P;.&; WE HAVE A MASK OF WAITING PROCESSORS;O A MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP)H MOV R2,-(SP)W MOV R3,-(SP)B) MOV R5,R1 ;SET UP PARAMETERS FOR $IIXMT$ CALL $IIXMT MOV (SP)+,R3 ;RESTORE R3R MOV (SP)+,R2O MOV (SP)+,R1* MOV (SP)+,R0L610$: MTPS (SP)+ ;RESTORE PRIORITY TO SAME AS INCOMING MOV (SP)+,R4 ;RESTORE R4R MOV (SP)+,R5R0 MOV (SP)+,(SP) ;SLIDE RETURN ADDRESS DOWN STACK RETURNB $>ERR1: BGCK$A BF.MP,BE.UNO,FATAL ;PROCESSOR WHO DIDN'T OWN LOCK ;TRIED TO UNLOCK9ERR2: BGCK$A BF.MP,BE.ILC,FATAL ;ILLEGAL LOCK COUNT VALUEM-ERR3: BGCK$A BF.MP,BE.LNS,FATAL ;LOCK NOT SET(;ERR4: BGCK$A BF.MP,BE.OCP,FATAL ;OTHER CPU SHOWED OWNERSHIPMCERR6: BGCK$A BF.MP,BE.MLK,FATAL ;ATTEMPT MADE TO EXIT MULTIPLE LOCKP R .IFTF ; DF M$$PRO"$PATCH::.BLKW 40. ;PATCHING SPACE E .ENDC G M .END+,R4 ;RESTORE R4R MOV (SP)+,R5R0 MOV (SP)+,(SP) ;SLIDE RETURN ADDRESS DOWN STACK RETURNB $>ERR1: BGCK$A BF.MP,BE.UNO,FATAL ;PROCESSOR WHO DIDN'T OWN LOCK ;TRIED TO UNLOCK9ERR2: BGCK$A BF.MP,BE.ILC,FATAL ;ILLEGAL LOCK COUNT VALUEM-ERR3: BGCK$A BF.MP,BE.LNS,FATAL ;LOCK NOT SET(;ERR4: BGCK$A BF.MP,BE.OCP,FATAL ;OTHER CPU SHOWED OWNERSHIPMCERR6: BGCK$A BF.MP,BE.MLK,FATAL ;ATTEMPT MADE TO EXIT MULTIPLE LOCKP R .IFTF ; DF M$$PRO"$PATCH::.BLKW 40. ;PATCHING SPACE .TITLE POWER  .IDENT /10.00/*;*8; COPYRIGHT (C) 1986 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;  ; D. N. CUTLER 1-OCT-73A ;F& ; MODIFIED FOR RSX-11M-PLUS V2.1 BY: ;I; H. HUANG; H. BERNSTEIN; B. S. MCCARTHY;E-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:; ; S. C. ADAMSO; J. W. BERZLE; M. 00s"unttöt÷tø tþfDATA PETTENGILL; B. S. MCCARTHY; J. C. FRANZINI;H; MODIFIED BY:;Q ; J. W. BERZLE 20-MAY-86 10.00;S.; JWB174 -- MODIFY POWER DOWN CALL TO IPDRV;L(;E); POWERFAIL RECOVERY*;E+; MACRO LIBRARY CALLS ,;E-3. .MCALL EPKDF$,HDRDF$,HWDDF$,PCBDF$,TCBDF$,BGCK$A(/ EPKDF$ ;DEFINE ERROR PACKET OFFSETS'0 HDRDF$ ;DEFINE TASK HEADER OFFSETSN&1 HWDDF$ ;DEFINE HARDWARE REGISTERS32 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSD.3 TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS45;C6; POWERFAIL VECTOR7;8 9 .ASECTI:.=24;PWVCT: .WORD PDOWN ;-< .WORD PR7 ;S = .PSECT7>?;+'@; **-PDOWN-POWERFAIL INTERRUPT (DOWN)A;EFB; THIS ROUTINE IS ENTERED AS A RESULT OF A POWER DOWN INTERRUPT. ALLJC; VOLATILE MACHINE REGISTERS ARE SAVED, THE POWERFAIL VECTOR IS SWITCHEDED; TO THE POWER UP ROUTINE, AND THE PROCESSOR IS HALTED TO AWAIT THEDE; POWER UP INTERRUPT. F;-GHPDOWN: ;REF LABELIJKL .IF DF M$$PROMN;RBO; IN THE MULTIPROCESSING CASE, THIS IS THE ONLY PLACE THE VECTORAP; AT 24 EVER POINTS. THIS IS BECAUSE ON POWER-UP, THE HARDWAREFQ; MUST USE THE VECTOR AT PHYSICAL 24, NOT KERNEL VIRTUAL 24 (BECAUSE1R; THERE ISN'T ANY KERNEL MAPPING AT THAT TIME)..S;AT; DUE TO THIS, WE HAVE THREE CONDITIONS WHICH CAN BRING US THRUWU; THIS VECTOR.V;REW; 1. POWERFAIL (POWER GOING DOWN) -- WE CAN DETERMINE THIS FROM THETBX; FACT THAT MAPPING IS ENABLED (WHICH IT NEVER IS OTHERWISE).Y;FZ; 2. POWER RETURNS (AFTER A POWERFAIL) -- WE CAN DETERMINE THIS FROMG[; THE FACT THAT MAPPING IS NOT ENABLED, AND THE LOW MEMORY MAPPING@\; FOR US IS SET UP IN THE $PWKA0 VECTOR (ONE WORD PER CPU).];F^; 3. POWER RETURNS (BUT WE NEVER POWERFAILED). THIS IS BECAUSE SOMEC_; UNCLEVER PERSON TURNED THE KEY ON (OR OTHERWISE BROUGHT BACK.F`; THE POWER) AND DIDN'T HAVE THE HALT KEY DOWN. IF THEY HAVE THEJa; NEAT 11/70 REMOTE DIAGNOSTIC CONSOL, THEY CAN BE PARTIALLY EXCUSED,Hb; SINCE THEY HAVE NO ACTUAL HALT KEY (ALTHO THEY CAN USE THE LITTLEIc; SLIDE SWITCH, WHICH MIGHT SURVIVE 100 OPERATIONS WITHOUT FAILURE).Fd; IN THIS CASE WE WILL HALT THE MACHINE, AND THEY WILL NEVER KNOW#e; WHAT WE DID FOR THEM. SIGH.Pf;A7g CACHE$ BYPASS ;;;MAKE SURE WE HAVE THE "REAL THING"E1h BIT #1,SR0 ;;;ARE WE COMING UP OR GOING DOWN?E-i BNE PDOWN1 ;;;IF NE WE'RE ON THE WAY DOWNTjk;T&l; NOW -- EITHER POWER UP OR SPURIOUSm;Ln(o MOV $PWCSR,R0 ;;;GET IIST CSR ADDRESS*p MOV (R0),R2 ;;;GET IIST REGISTER VALUE%q SWAB R2 ;;;PUT CPU ID IN LOW BYTEW.r BIC #177774,R2 ;;;MAKE IT ONLY TWO BITS BIGs ASL R2 ;;;AND WORD INDEXtu;Tv; DID WE GO DOWN???Lw;Ex4y MOV $PWKA0(R2),R1 ;;;GET KINAR0 VALUE FROM BEFORE1z BNE 10$ ;;;IF NE THERE IS ONE, WE DID PWRFAIL{|;,E}; SOME CLEVER FELLOW POWERED UP THE CPU WITH THE HALT KEY UNHALTED. D~; WE WILL HALT AND HE WILL PROBABLY NEVER KNOW WE DIDN'T CRASH THEE; POSSIBLE MP SYSTEM UNDERNEATH HIM. TOO BAD IT'S A WASTE OF SPACET&€; TO GIVE HIM A SNAPPY ERRORMESSAGE.�;I‚ƒ5$: HALT ;;;HERE WE ARE „ BR 5$ ;;;OH NO YOU DON'T…8†10$: CLR $PWKA0(R2) ;;;SHOW WE ARE MORE OR LESS UP NOW ‡ DEC R1 ;;;REMOVE BIAS OF ONEˆ‰;AŠ; R0 = IIST CSR ADDRESSE"‹; R1 = KINAR0 VALUE FOR THIS CPU%Œ; R2 = CPU ID * 2 FOR TABLE INDEXESL�;WŽ�;H<�; WE WILL NOW SET UP THE KERNEL MAPPING AND TURN ON 18 BIT;‘; MODE SO THIS CPU CAN ACCESS THE LOW MEMORY CONTEXT WITHY<’; WHICH IT IS SO WELL FAMILIAR. AS FAR AS THE REST OF THEB“; POWERFAIL CODE IS CONCERNED, IT ALWAYS HAS ITS OWN LOW MEMORY.”;D•; THIS MEANS THAT THE CODE THAT LOADS THE KERNEL I SPACE REGISTERSC–; CANNOT LOAD JUNK AND THEN CORRECT IT -- IT MUST LOAD (OVERLOAD)03—; VALID INFORMATION SO THIS CODE DOESN'T GO AWRY.C˜;™š CLR R3 ;;;START WITH KINAR0› MOV #KINAR0,R4 ;;;DITTO7œ20$: MOV #77406,KINDR0-KINAR0(R4) ;;;SET UP FOR 4K RWE� MOV R3,(R4)+ ;;;LOAD ADDRESSE"ž ADD #200,R3 ;;;MOVE ANOTHER 4K#Ÿ CMP00s*u!ut´cÚµcÛ¶c�·c›’ #KINAR0+16,R4 ;;;ARE WE DONE   BHIS 20$ ;;;IF HIS NOI¡¢;E7£; NOW CORRECT KINAR0 AND KINAR7 WITH THE REAL VALUES.S¤; ¥/¦ MOV R1,@#KINAR0 ;;;PUT REAL OFFSET IN PAGE 0 <§ MOV #177600,@#KINAR0+16 ;;;PUT I/O PAGE ADDRESS IN PAGE 7-¨ BIS #PMODE,PS ;;;PUT USER INTO PREVIOUS PSG-© INC SR0 ;;;TURN ON MAPPING AND AWAY WE GON+ª JMP PUP ;;;GO TO "NORMAL" POWERUP CODE#«¬ .ENDC­®5¯PDOWN1: MOV SP,$PWSTK ;;;SAVE CURRENT STACK POINTERE6° MOV #$PWSTK,SP ;;;SET ADDRESS OF REGISTER SAVE AREA,± MOV R5,-(SP) ;;;SAVE REGISTERS R5 THRU R0² MOV R4,-(SP) ;;;O³ MOV R3,-(SP) ;;;R´ MOV R2,-(SP) ;;;Sµ MOV R1,-(SP) ;;;R¶ MOV R0,-(SP) ;;;L·¸;N%¹; MULTIPROCESSOR POWERFAIL SUPPORT:;º;/9»; EACH PROCESSOR THAT POWERFAILS SETS ITS BIT IN A WORD ?¼; WHICH CONTAINS THE MASK OF PROCESSORS IN THEIR SAVE-RESTOREJ=½; CODE. THEY ALSO INTERRUPT ALL OTHER ONLINE PROCESSORS TO<¾; TELL THEM TO STOP WHAT THEY ARE DOING AND WAIT UNTIL THE-¿; POWERFAILED PROCESSORS ARE BACK UP AGAIN.AÀ;MÁÂ;P0Ã; SET OUR BIT IN THE POWERFAILED CPU FLAG WORDÄ;ÅÆÇ .IF DF M$$PROÈÉ LOCK$ $PWRLK,SPIN9Ê BIS $CPBIT,$PWRMK ;;;SET OUR BIT IN THE POWERFAIL MASKSË ULOCK$ $PWRLK,SPIN+Ì MOV $URMST,R1 ;;;GET MASK OF ONLINE URMS +Í BIC $CPMSK,R1 ;;;MAKE IT PROCESSORS ONLYS(Î BIC $CPBIT,R1 ;;;NOT OURSELVES EITHER$Ï BEQ 5$ ;;;IF EQ NOBODY UP BUT US,Ð MOV #MP.PWF,R2 ;;;SET FUNCTION CODE IN R2 Ñ CALL $IIFNX ;;;XMIT FUNCTIONÒ5$: ;;;REFERENCE LABELOÓÔ .ENDCÕÖ1× BIT #FE.EXT,$FMASK ;;;IS THIS A 22-BIT SYSTEM?DØ BEQ 21$ ;;;IF EQ NO/Ù BIT #HF.UBM,$HFMSK ;;;IS THERE A UNIBUS MAP?Ú BEQ 21$ ;;;IF EQ NO 8Û MOV #UBMPR+<31.*4>,R0 ;;;POINT PAST LAST MAP REGISTER1Ü MOV #31.,R1 ;;;SET COUNT OF REGISTERS TO SAVE$5Ý20$: MOV -(R0),-(SP) ;;;SAVE HIGH 6 BITS OF ADDRESS;1Þ MOV -(R0),-(SP) ;;;SAVE LOW 16 BITS OF ADDRESSU#ß SOB R1,20$ ;;;LOOP FOR ALL UMRSN7à21$: BIS #PMODE,PS ;;;MAKE SURE PREVIOUS MODE IS USER &á MFPI SP ;;;SAVE USER STACK POINTERâãä .IF DF S$$LIBå<æ BIC #^CPSMODE&PMODE,PS ;;;SET PREVIOUS MODE TO SUPERVISOR,ç MFPI SP ;;;SAVE SUPERVISOR STACK POINTERèé .ENDCêë>ì MOV #KINAR0+16.,R0 ;;;POINT TO KERNEL INSTR ADDRESS REG 7+21í MOV #UINAR0+16.,R1 ;;;POINT TO USER I PAR 7 +2:1î MOV #UINDR0+16.,R2 ;;;POINT TO USER I PDR 7 +2ïðñ .IF DF U$$DASò;ó MOV #UDSAR0+16.,R3 ;;;POINT TO USER DATA ADDRESS REG 7+21;ô MOV #UDSDR0+16.,R4 ;;;POINT TO USER DATA DESC. REG 7+2 õö .ENDC ; DF U$$DAS÷øù .IF DF K$$DASú=û MOV #KDSAR0+16.,R5 ;;;POINT TO KERNEL DATA ADDRESS REG 7+2Süý .ENDCþÿ210$: MOV -(R1),-(SP) ;;;SAVE USER INSTR ADDR REG3 MOV -(R2),-(SP) ;;;SAVE USER DESCRIPTOR REGISTERR .IF DF U$$DAS5 MOV -(R3),-(SP) ;;;SAVE USER DATA ADDRESS REGISTERP5 MOV -(R4),-(SP) ;;;SAVE USER DATA DESC. REGISTER  .ENDC ; DF U$$DAS  0  MOV -(R0),-(SP) ;;;SAVE KERNEL INSTR ADDR REG  .IF DF K$$DAS7 MOV -(R5),-(SP) ;;;SAVE KERNEL DATA ADDRESS REGISTERD .ENDC& CMP R0,#KINAR0 ;;;ANY MORE TO SAVE? BHI 10$ ;;;IF HI YES .IF DF S$$LIB< MOV #SDSAR0+16.,R0 ;;;POINT TO SUPER DATA ADDRESS REG 7+2< MOV #SDSDR0+16.,R1 ;;;POINT TO SUPER DATA DESC. REG 7+2< MOV #SISAR0+16.,R2 ;;;POINT TO SUPER INST ADDRESS REG 7+2<  MOV #SISDR0+16.,R3 ;;;POINT TO SUPER INST DESC. REG 7+2;!200$: MOV -(R0),-(SP) ;;;SAVE SUPER DATA ADDRESS REGISTER6" MOV -(R1),-(SP) ;;;SAVE SUPER DATA DESC. REGISTER6# MOV -(R2),-(SP) ;;;SAVE SUPER INST ADDRESS REGISTER6$ MOV -(R3),-(SP) ;;;SAVE SUPER INST DESC. REGISTER% CMP R0,#SDSAR0 ;;;DONE YET?& BHI 200$ ;;;IF HI NO'( .ENDC ; DF S$$LIB)*+ .IF DF F$$LPP,-'. TST $HFMSK ;;;FPP HARDWARE PRESENT?/ BMI 210$ ;;;IF MI NO.0 STFPS -(SP) ;;;STORE FLOATING POINT STATUS%1 SETD ;;;SET FLOATING DOUBLE MODE 02 STD R0,-(SP) ;;;SAVE FLOATING POINT REGISTERS3 STD R1,-(SP) ;;;4 STD R2,-(SP) ;;;;5 STD R3,-(SP) ;;; 6 L00s2unttöt÷tø tþfDATADD R4,R0 ;;;-7 STD R0,-(SP) ;;;P8 LDD R5,R0 ;;;I9 STD R0,-(SP) ;;;S-:210$: CLR -(SP) ;;;PUSH AN ADDRESS OF ZEROR9; CMP @#244,#$FPPR7 ;;;IS THERE A PIRQ REGISTER TO SAVE?N4< BEQ 30$ ;;;IF EQ NO, DO DUMMY SAVE OF LOCATION 0)= MOV #PIRQ,(SP) ;;;SET FOR SAVE OF PIRQI=>30$: MOV @(SP),-(SP) ;;;SAVE PIRQ REGISTER OR CONTENTS OF 0T?@ .ENDCABC .IF NDF M$$PRO D/E MOV #PUP,PWVCT ;;;SWITCH TO POWER UP ROUTINEFG .ENDCHI(J MOV SP,$POWSP ;;;SAVE SP FOR POWER UPKL .IF DF I$$P11&I$$PFS,MN MOV $IPUCB,R0 ;;;GET IP UCB.O BEQ 40$ ;;;IF EQ, DRIVER POWERFAIL NOT SETP MOV (R0),R0 ;;;GET IP DCB#3Q MOV D.DSP(R0),R1 ;;;GET IP DRIVER DISPATCH TABLE3'R BEQ 40$ ;;;IF EQ, DRIVER NOT LOADEDN%S MOV D.PCB(R0),R0 ;;;GET DRIVER PCBF T BEQ 40$ ;;;IF EQ, FORGET IT!0U MOV P.REL(R0),KINAR5 ;;;MAP DRIVER IN I-SPACEVW .IF DF K$$DASX0Y MOV P.REL(R0),KDSAR5 ;;;MAP DRIVER IN D-SPACEZ[ .ENDC ; DF K$$DAS\@\ MOV D.VINI-2(R1),-(SP) ;;;GET POWER-DOWN ENTRY POINT ;JWB174*\ CALL @(SP)+ ;;;CALL DRIVER ;JWB174%_40$: ;;;REFERENCE LABEL ;**-2T`a .ENDC ; DF I$$P11&I$$PFSCbcd;DHe; AT THIS POINT, WE HAVE ALL BUT HALTED. WE WILL PLACE OUR KINAR0 LOWFf; MEMORY MAPPING IN THE CELL IN CPA'S LOW MEMORY. THIS IS A FLAG TOFg; THE POWERUP ROUTINE THAT WE HAVE ACTUALLY POWERFAILED. IF WE FAILGh; TO DO THIS, THE POWERUP ROUTINE WILL JUST HALT (SINCE IT CAN'T TELLEi; THAT FACT FROM THE CASE WHERE SOMEONE POWERED UP THE MACHINE WITHRj; THE HALT KEY UP.)Lk;Plmn .IF DF M$$PROo'p MOVB $PROC2,R1 ;;;GET OUR CPU OFFSET/q MOV @#KINAR0,R0 ;;;GET OUR LOW MEMORY OFFSET/r CLR @#KINAR0 ;;;START USING CPA'S LOW MEMORY stu .IF DF K$$DASv&w CLR @#KDSAR0 ;;;D-SPACE TOO, IF ANYxy .ENDCz{1| INC R0 ;;;BIAS BY ONE, SO NEVER ACTUALLY ZEROE4} MOV R0,$PWKA0(R1) ;;;STORE OUR LOW MEMORY POINTER~ .ENDC€�‚!ƒ HALT ;;;WAIT FOR SOME JUICE!T„…;+#†; **-PUP-POWERFAIL INTERRUPT (UP)T‡;Mˆ; THIS ROUTINE IS ENTERED AS A RESULT OF A POWER UP INTERRUPT. ALL VOLATILEGH‰; MACHINE REGISTERS ARE RESTORED, A SCHEDULE REQUEST IS FORCED FOR THEDŠ; NULL TASK, THE POWERFAIL INDICATOR IS INCREMENTED, AND AN RTI ISH‹; EXECUTED. AT THE APPROPRIATE TIME THE DISPATCHER WILL CALL THE POWER;Œ; RECOVERY ROUTINE TO ACTUALLY PROCESS THE POWER FAILURE.0�;-Ž1�PUP: MOV $POWSP,SP ;;;RE-LOAD SP FROM POWERFAIL�‘’ .IF DF F$$LPP“;” MOV (SP)+,@(SP)+ ;;;CONDITIONALLY RESTORE PIRQ OR LOC. 0'• TST $HFMSK ;;;FPP HARDWARE PRESENT?F– BMI 1$ ;;;IF MI NO4— LDFPS #200 ;;;SET FLOATING DOUBLE MODE, NO TRAPS3˜ LDD (SP)+,R0 ;;;RESTORE FLOATING POINT REGISTERSP™ STD R0,R5 ;;;Iš LDD (SP)+,R0 ;;; › STD R0,R4 ;;;Dœ LDD (SP)+,R3 ;;;T� LDD (SP)+,R2 ;;;Lž LDD (SP)+,R1 ;;; Ÿ LDD (SP)+,R0 ;;;C0  LDFPS (SP)+ ;;;RESTORE FLOATING POINT STATUS¡¢ .ENDC£¤0¥1$: BIS #PMODE,PS ;;;SET PREVIOUS MODE TO USER¦§¨ .IF DF S$$LIB©6ª MOV #SDSAR0,R3 ;;;POINT TO SUPER DATA ADDRESS REG 06« MOV #SDSDR0,R2 ;;;POINT TO SUPER DATA DESC. REG 06¬ MOV #SISAR0,R1 ;;;POINT TO SUPER INST ADDRESS REG 06­ MOV #SISDR0,R0 ;;;POINT TO SUPER INST DESC. REG 0<®5$: MOV (SP)+,(R0)+ ;;;RESTORE SUPER INST DESC. REGISTER9¯ MOV (SP)+,(R1)+ ;;;RESTORE SUPER INST ADDRESS REGISTERD9° MOV (SP)+,(R2)+ ;;;RESTORE SUPER DATA DESC. REGISTERT9± MOV (SP)+,(R3)+ ;;;RESTORE SUPER DATA ADDRESS REGISTERI"² CMP R0,#SISDR0+16. ;;;DONE YET?³ BLO 5$ ;;;IF LO NO0´µ .ENDC ; DF S$$LIB¶·5¸ MOV #KINAR0,R0 ;;;POINT TO KERNEL INSTR ADDR REG 0 0¹ MOV #UINAR0,R1 ;;;POINT TO USER I SPACE PAR 00º MOV #UINDR0,R2 ;;;POINT TO USER D SPACE PDR 0»¼½ .IF DF U$$DAS¾:¿ MOV #UDSDR0,R3 ;;;POINT TO USER DATA DESC. REGISTER 0:À MOV #UDSAR0,R4 ;;;POINT TO USER DATA ADDRESS REGISTER 0Á .ENDCÃÄÅ .IF DF K$$DASÆ4Ç MOV #KDSAR0,R5 ;;;POINT TO KERNEL DATA ADDR REG 0ÈÉ .ENDCÊËÌ10$: ;;;REF LABELÍÎÏ .IF DF K$$DASÐ3Ñ M00s:u!ut´cÚµcÛ¶c�·c›’OV #77406,KDSDR0-KDSAR0(R5) ;;;SET 4K RW ACCESS;8Ò MOV (SP)+,(R5)+ ;;;RESTORE KERNEL DATA INSTR ADDR REGÓÔ;SDÕ; IN THE MULTIPROCESSING, I+D SPACE CASE, WE WOULD NORMALLY TRY TOBÖ; LOAD 1600 INTO KINAR7 AND SET IT FOR 4K RO. THIS WIPES US OUT,B×; SINCE WE ARE EXECUTING OUT OF THESE REGISTERS. WE WILL DETECT.Ø; THIS FACT, AND WILL DO ANYTHING TO KISAR7.Ù;ÚÛÜ .IF DF M$$PROÝ?Þ CMP R0,#KINAR0+16 ;;;ARE WE JUST ABOUT TO WIPE THE I/O PAGE?Lß BNE 15$ ;;;IF NE NO$,à CMP (SP)+,(R0)+ ;;;BUMP STACK AND ADDRESS+á BR 20$ ;;;SKIP ACTUAL LOAD INSTRUCTIONSRâ15$: ;;;REFERENCE LABELãä .ENDCåæ3ç MOV #77402,KINDR0-KINAR0(R0) ;;;SET 4K RO ACCESS èé .IFF1ê3ë MOV #77406,KINDR0-KINAR0(R0) ;;;SET 4K RW ACCESSìí .ENDCîï3ð MOV (SP)+,(R0)+ ;;;RESTORE KERNEL INSTR ADDR REGSñ20$: ;;;REFERENCE LABELòóô .IF DF U$$DASõ8ö MOV (SP)+,(R3)+ ;;;RESTORE USER DATA DESC. REGISTER8÷ MOV (SP)+,(R4)+ ;;;RESTORE USER DATA ADDRESS REGISTERøù .ENDC ; DF U$$DASú8û MOV (SP)+,(R2)+ ;;;RESTORE USER INST DESC. REGISTER8ü MOV (SP)+,(R1)+ ;;;RESTORE USER INST ADDRESS REGISTER"ý CMP R0,#KINAR0+16. ;;;DONE YET?þ BLO 10$ ;;;IF LO NOÿ .IF DF K$$DAS!M$$EXT!S$$LIB  MOV #S3$BTS,SR3 ;;;SET UP SR3 .ENDC .IF DF M$$PRO    .IF DF K$$DAS   MOV #77402,@#KINAR0+16D .ENDC .IFF+( INC SR0 ;;;TURN ON MEMORY MANAGEMENT .ENDC .IF DF S$$LIB7 BIC #^CPSMODE&PMODE,PS ;;;SET PREVIOUS MODE TO SUPER;/ MTPI SP ;;;RESTORE SUPERVISOR STACK POINTER+- BIS #PMODE,PS ;;;SET PREVIOUS MODE TO USER0 TSTB $SUPFL ;;;CURRENT TASK USE SUPER MODE ? BEQ 25$ ;;;IF EQ NOD*  BIS #10,SR3 ;;;TURN ON CSM INSTRUCTION!25$: ;;;REFERENCE LABEL"# .ENDC$%)& MTPI SP ;;;RESTORE USER STACK POINTER#1' BIT #FE.EXT,$FMASK ;;;IS THIS A 22-BIT SYSTEM?( BEQ 35$ ;;;IF EQ NON<) BIT #HF.UBM,$HFMSK ;;;DOES THIS SYSTEM HAVE A UNIBUS MAP?* BEQ 35$ ;;;IF EQ NOP/+ MOV #UBMPR,R0 ;;;POINT TO FIRST MAP REGISTERR4, MOV #31.,R1 ;;;SET COUNT OF REGISTERS TO RESTORE8-30$: MOV (SP)+,(R0)+ ;;;RESTORE LOW 16 BITS OF ADDRESS4. MOV (SP)+,(R0)+ ;;;RESTORE HIGH 6 BITS OF ADDRESS#/ SOB R1,30$ ;;;LOOP FOR ALL UMRS035$: ;;;REF LABEL12;53; SHOW OTHER PROCESSORS THAT WE ARE BACK ON THE AIRE4;567 .IF DF M$$PRO89 LOCK$ $PWRLK,SPIN7: BIC $CPBIT,$PWRMK ;;;CLEAR OUT OUR BIT FROM THE MASKS;< .IFTF=)> INC $PWRFL ;;;SHOW POWERFAIL HAPPENED#?@ .IFTOA%B INCB $PWRFL+1 ;;;URM POWERFAIL TOO *C BIS @$CPURM,$PFURM ;;;FOR ALL OUR URM'SDE;+KF; AT THIS POINT, WE WANT TO ASSURE OURSELVES THAT THIS CPU WILL, IN FACT,6FG; GO THROUGH DIRXT AT SOME POINT IN THE FUTURE. THIS REQUIRES A TWOKH; PRONGED ATTACK -- FIRST WE SET $IIPND SO THAT IF WE RETURN FROM A CLOCKHI; INTERRUPT TO A USER PROGRAM, THEN WE WILL GO THRU THE EXEC. SECOND,BJ; WE FIX UP THE IDLE LOOP TO LOOK AT $IIPND ON EACH LOOP AROUND.K;;L7M BIS $CPBIT,$IIPND ;;;TELL US LATER THAT WE HAVE WORK;N ULOCK$ $PWRLK,SPINOP .ENDCQRSET; IF THE SYSTEM HAS ANY MK11 BOXES ON IT, WE WILL RESTORE THEM NOW,SBU; SINCE THE RTI MAY GO BACK TO A LOADED DRIVER (OR TASK) IN ONE.VW .IF DF M$$K11X*Y CALL $MKSET ;;;RESET MK11 MEMORY BOXESZ[ .ENDC ; DF M$$K11\%] MOV (SP)+,R0 ;;;RESTORE R0 THRU R5R^ MOV (SP)+,R1 ;;;O_ MOV (SP)+,R2 ;;;N` MOV (SP)+,R3 ;;; a MOV (SP)+,R4 ;;;$b MOV (SP)+,R5 ;;;O(c MOV (SP),SP ;;;RESTORE STACK POINTER-d MOV #$ACTHD,@$RQSCH ;;;FORCE REDISPATCHINGKefg .IF NDF M$$PROh3i MOV #PDOWN,PWVCT ;;;SWITCH TO POWER DOWN ROUTINE jHk; AT THIS POINT WE WILL BYPASS THE CACHE. THIS PREVENTS GETTING STUCKIl; IN $PWRMP, AND ALSO ASSURES THAT IF THE CODE INTERRUPTED BY POWERFAILXHm; RUNS WITH CACHE BYPASSED, IT WILL BE AFTER THE POWERFAIL. (NOTE THATGn; THE SYSTEM WILL ALWAYS BE CACHE BYPASSED BETWEEN POWER RECOVERY AND( o; THE FIRST ENTRY TO THE EXEC)pq00sBunttöt÷tø tþfDATA .IFF,r(s CACHE$ BYPASS ;;;GET THE REAL THINGStu .ENDCvw4x MOV $CKLDC,@$CKCNT ;;;RELOAD CLOCK COUNT REGISTER,y MOV #K$$IEN,@$CKCSR ;;;TURN CLOCK BACK ON z RTI ;;;{|;+!}; **-$POWER-POWER FAIL RECOVERYG~;GE; THIS ROUTINE WILL PERFORM POWERFAIL AND INITIALIZATION FOR ACTIVE €; TASKS AND DEVICES.�;H ‚; INPUTS:Tƒ; "„; $PWRFL=GENERAL POWERFAIL FLAG:;…; 0 - DON'T INVOKE ACTIVE TASK POWERFAIL AST'S AND DON'TC5†; CALL DRIVERS WITHOUT KRBS. $PWRFL+1 MUST BEF)‡; NON-ZERO OR WE WOULDN'T BE HERE.H8ˆ; 1 - CALL ALL ACTIVE TASKS WITH POWERFAIL AST'S, AND‰; ALL DRIVERS TOO.MŠ;$#‹; $PWRFL+1=DEVICE POWERFAIL FLAG::Œ; 0 - $PWRFL MUST HAVE BEEN SET OR WE WOULDN'T BE HERE.;�; 1 - DO ONLY DEVICE POWERFAIL, AND CHECK $PFURM FOR THEN;Ž; UNIBUS RUN MASKS WHICH DEFINE THE RUNS TO PWRFAIL. �; ?�; $PFURM=MASK DEFINING THE RUNS FOR POWERFAIL IF $PWRFL+1<>0. #‘; OTHERWISE THIS SHOULD BE ZERO.C’;R“;-” • .ENABL LSBF6–$POWER::TSTB $PWRFL ;IS IT GENERAL (FIRST) PWRFAIL?(— BEQ 16$ ;IF EQ NOT GENERAL POWERFAIL˜™š .IF DF K$$W11›(œ CLR K$$W11+2 ;CLEAR CLOCK ERROR FLAGS)� MOV #1,K$$W11+6 ;ENERGIZE OUTPUT RELAY žŸ .ENDC ¡¢;H@£; EFFECT POWERFAIL AST'S FOR TASKS THAT ARE ACTIVE AND IN CORE¤; ¥*¦ MOV $ACTHD,R5 ;GET ADDRESS OF FIRST TCB2§10$: MOV #AS.PFA,R4 ;GET CODE FOR POWER FAIL AST9¨ MOV T.ACTL(R5),-(SP) ;SAVE POINTER TO NEXT ACTIVE TASK © BEQ 15$ ;IF EQ THERE IS NONE&ª CALL $DASTT ;DECLARE POWERFAIL AST4«15$: MOV (SP)+,R5 ;GET ADDRESS OF NEXT ACTIVE TASK¬ BNE 10$ ;IF NE NOF­®;10¯; DO POWERFAIL RECOVERY FOR ALL ACTIVE DEVICES°;#D±; IF THE POWERFAIL IS FOR A CPU URM, THEN INITIALIZE THE CACHE AND/²; MEMORY PARITY REGISTERS FOR THAT PROCESSOR.D³;O´µ16$: ;REFERENCE LABEL¶·¸ .IF DF M$$PRO¹5º BIT $CPBIT,$PFURM ;IS IT A POWERFAIL FOR THIS CPU?T(» BEQ 22$ ;IF EQ NO -- JUST DO DEVICES¼½ .IFTF¾)¿ MOV #21$,-(SP) ;INLINE SUBROUTINE CALLDÀÁ .IFTAÂ-à BR 18$ ;SKIP IIST INITIALIZATION ON PWRFLTÄÅ .ENDCÆÇÈ;+;É; **-$CPNIT-INITIALIZE CPU AT POWERFAIL, STARTUP, ONLINE.CÊ;BË; THIS ROUTINE WILL PERFORM COMMON CPU INITIALIZATION FOR INITL, Ì; SAVE, AND LOWCR CPU STARTUP.Í;H Î; INPUTS:DÏ;O Ð; NONE.:Ñ;R Ò; OUTPUTS:Ó;Ô; INITIALIZATION PERFORMED.TÕ;IÖ; NO REGISTERS ARE PRESERVED.H×;-ØÙ$CPNIT:: ;REFERENCE LABELOÚÛ .IF DF M$$PROÜÝ2Þ; SET UP MK11 MEMORY BOXES, IN CASE WE NEED THEMßà .IF DF M$$K11á&â CALL $MKSET ;SET MK11 MEMORY BOXES'ã BCS 17$ ;IF CS DIDN'T FIND THEM ALLEäå .ENDC ; DF M$$K11æç$è CALL $IINIT ;INITIALIZE THE IIST,é BIS $CPBIT,$URMST ;WE ARE ONLINE FOR SURE1ê CALL $IINOT ;SEE IF WE CAN TALK TO OTHER CPUSO'ë17$: MOV R2,$SCRET ;SET STATUS RETURN$ì CALL $OLRNT ;SEND STATUS TO OLRíî .ENDCïð<ñ18$: CALL $DRDSE ;ALWAYS DECLARE SIG. EVENT AT CPU PWRUP.òó .IF DF P$$RTYô*õ CALL $CLPAR ;CLEAR MEMORY PARITY CSR'S;ö MOV $MPCSR+6,R0 ;GET ADDRESS OF 11/70 CACHE CSR REGISTERB÷øù .IF DF P$$D70ú&û MOV $MPCTL,(R0) ;SET UP 11/70 CACHEüý .IFFþÿ MOV #3,(R0) ;DISABLE TRAPS .ENDC .ENDC ; DF P$$RTY  RETURNT21$: ;REF LABEL   .IF DF P$$RTY 1  MOV #177777,-(R0) ;CLEAR MEMORY ERROR REGISTERS  .ENDC ; DF P$$RTY .IF DF E$$LOG3 BIT #ES.DAT,$ERFLA ;ARE WE LOGGING DATA PACKETS?. BEQ 22$ ;IF EQ NOL: MOV #E$CSYS+,R0 ;GET POWER FAIL ERROR CODE& CLR R1 ;INDICATE NO DATA SUBPACKET. MOV #SM.HDR,R2 ;ONLY LOG A HEADER SUBPACKET CALL $CREQU .ENDC ; DF E$$LOG;+2;**-DRVPF-LOCAL ENTRY FOR DRIVER ONLY POWER FAIL;-% DRVPF: ;CALLED FROM $DRVPF BELOW!";FD#; SCAN DEVICES FROM THE CTB SIDE (I.E. PHYSICAL) AND CHECK TO MAKE$; SURE THEY ARE ALL THERE.%;D&'22$: ;REFERENCE LABEL() .IF DF M$$NET*2+ MOV $NETPF,R5 ;GET ADDRESS OF NETWORK POWER00sJu!ut´cÚµcÛ¶c�·c›’FAIL, ;RECOVERY ROUTINEF!- BEQ 225$ ;IF EQ THERE IS NONEE*. CALL (R5) ;CALL POWER RECOVERY ROUTINE/0 .ENDC ; DF M$$NET132225$: MOV #27$,-(SP) ;RETURN TO HERE AFTER $SGFIN*(3 CALL $SGFIN ;WE EXPECT TRAPS TO FOUR74 MOV #$CTLST,R3 ;GET ADDRESS OF FIRST ADDRESS OF CTBS,523$: MOV (R3),R3 ;GET ADDRESS OF NEXT CTB)6 BEQ 35$ ;IF EQ NO MORE -- EXIT $SGFINE(7 MOVB L.NUM(R3),R4 ;GET NUMBER OF KRBS8 MOV R4,R5 ;COPY NUMBER9 ASL R5 ; *2V: ADD R3,R5 ;D6; ADD #L.KRB,R5 ;POINTER TO JUST BEYOND LAST KRB ADDR<24$: DEC R4 ;ONE LESS TO GO= BLT 23$ ;IF LT NO MORE > MOV -(R5),R2 ;GET KRB ADDRESS,? BEQ 24$ ;THERE IS NO KRB ADDRESS IN LIST(@ BIT #KS.OFL,K.STS(R2) ;IS IT OFFLINE?'A BNE 24$ ;IF NE YES -- DONT CHECK ITGBCD .IF DF M$$PROE/F BIT K.URM(R2),$PFURM ;SHOULD WE DO THIS ONE?CG BEQ 24$ ;IF EQ NON2H BIT K.URM(R2),@$CPURM ;IS IT ON THIS PROCESSOR?I BEQ 24$ ;IF EQ NO,JK .ENDCLMNO;*0P; CALL DRIVER AT THE POWERFAIL-KRB ENTRY POINTQ; R5S MOV L.DCB(R3),R1 ;GET DCB ASSOCIATED WITH THIS CTBT=T MOV CI.PWF(R1),R0 ;ASSUME IT WASN'T DCB BUT COMMON INT TBL29U BITB #LS.CIN,L.STS(R3) ;WAS IT COMMON INTERRUPT TABLE?R3V BNE 25$ ;IF NE YES -- GO AND CALL DRIVER IMMED.EWX;8Y; R4 CONTAINS DCB ADDRESS. MAP AND CALL NORMAL DRIVERZ;D[-\ MOV D.PCB(R1),R0 ;GET PCB OF LOADED DRIVERR.] MOV P.REL(R0),KINAR5 ;MAP DRIVER IN I-SPACE^_` .IF DF K$$DASa.b MOV P.REL(R0),KDSAR5 ;MAP DRIVER IN D-SPACEcd .ENDCef$g MOV D.DSP(R1),R1 ;GET DDT ADDRESS<h MOV D.VPWF(R1),R0 ;GET ADDRESS OF DRIVER POWERFAIL ENTRYij;CDk; IF POWERFAIL ADDRESS EXISTS, CALL DRIVER AFTER SAVING REGISTERS.l;m+n25$: TST R0 ;IS THERE A POWERFAIL ENTRY?D%o BEQ 24$ ;IF EQ NO -- TRY NEXT KRBS8p MOV R5,-(SP) ;SAVE POINTER TO NEXT KRB ADDRESS IN CTB6q MOV R4,-(SP) ;SAVE NUMBER OF KRB'S LEFT IN THIS CTB!r MOV R3,-(SP) ;SAVE CTB POINTER.s<t; CALL DRIVER AT POWERFAIL ENTRY POINT WITH THE ARGUMENTS:u;:v; C=1 TO SHOW CONTROLLER POWERFAIL (NOT UNIT POWERFAIL).w; R2=KRB ADDRESS.Ax; R3=CTB ADDRESS.Ry;Ez; ALL REGISTERS MAY BE USED.{;E|/} SEC ;SHOW KRB POWERFAIL, NOT UCB POWERFAIL~ CALL (R0) ;CALL DRIVER$ MOV (SP)+,R3 ;RESTORE CTB ADDRESS9€ MOV (SP)+,R4 ;RESTORE NUMBER OF KRB'S LEFT IN THIS CTBX$� MOV (SP)+,R5 ;RESTORE KRB ADDRESS*‚ BR 24$ ;GO TO NEXT KRB AND KEEP TRYINGƒ„;PE…; NOW SCAN DEVICES FROM THE DCB (I.E. LOGICAL) ORIENTATION AND CALL (†; THE DRIVER FOR THE APPROPRIATE ONES.‡;Rˆ‰27$: MOV #$SCDVT,-(SP))Š30$: CALL @(SP)+ ;GET NEXT UCB ADDRESSS‹ BCC 40$ ;IF CC GOT ONEŒ�Ž .IF DF M$$PRO�8� BIC @$CPURM,$PFURM ;WE JUST DID POWERFAIL FOR OUR CPU‘’ .ENDC“”'• CLRB $PWRFL ;CPU POWERFAIL COMPLETE+–—˜ .IF DF M$$PRO™7š TST $PFURM ;ANY URM'S LEFT TO PWRFAIL ON OTHER CPU?"› BNE 35$ ;IF NE YES -- EXIT NOW4œ CLRB $PWRFL+1 ;CLEAR OUT URM POWERFAIL INDICATION�ž .ENDCŸ  ¡35$: RETURN ¢)£40$: MOV #30$,-(SP) ;SET RETURN ADDRESS2¤ BITB #US.OFL,U.ST2(R5) ;DEVICE IN CONFIGURATION*¥ BNE 35$ ;IF NE DEVICE IS NOT IN CONFIG$¦ MOV S.KRB(R4),R2 ;GET KRB ADDRESS§¨©ª .IF DF M$$PRO«)¬ BNE 43$ ;IF NE THERE IS A KRB ADDRESSC6­ TSTB $PWRFL ;IS THIS TOTAL PWRFAIL OR JUST DEVICES)® BEQ 35$ ;IF EQ NOT TOTAL -- TRY AGAINT¯ BR 45$ ;GO DO THIS ONE°± .IFF ²!³ BEQ 45$ ;IF EQ NO KRB ADDRESSL´µ .IFTO¶=·43$: BIT K.URM(R2),$PFURM ;SHOULD WE CHECK OUT THIS DEVICE?:¸ BEQ 431$ ;IF EQ NO2¹ BIT K.URM(R2),@$CPURM ;IS IT ON THIS PROCESSOR?º BNE 44$ ;IF NE YES» BR 35$ ;EQ - NOT¼G½; CHECK FOR A DUAL PORT, LOAD SHARE DEVICE WHERE ONLY ONE PORT'S URM,OD¾; NAMELY THE ONE THAT IS NOT THE CURRENT OWNER (S.KRB) POWERFAILED¿.À431$: MOV #S2.MAD!S2.LDS,R0 ;GET STATUS BITS-Á BIC S.ST2(R4),R0 ;ARE ALL OF THE ABOVE SETH( BNE 35$ ;IF NE NO - NOT LOAD SHARING*à MOV S.KTB(R4),R0 ;ASSUME THIS IS PORT A#Ä BIT #KP.OFL,R0 ;IS PORT A ONLINEK+Å BEQ 35$ ;IF EQ00sRunttöt÷tø tþfDATA NO, NO ONLINE PORT PWFLDÆ CMP R0,R2 ;PORT A ?S&Ç BNE 432$ ;IF NE NO - TAKE THIS ONE*È MOV S.KTB+2(R4),R0 ;POINT TO OTHER PORT!É BIT #KP.OFL,R0 ;IS IT ONLINE ?W+Ê BEQ 35$ ;IF EQ NO, NO ONLINE PORT PWFLDE&Ë432$: MOV R0,R2 ;POINT TO OTHER KRB.Ì BIT K.URM(R2),$PFURM ;THAT PORT POWERFAIL ?-Í BEQ 35$ ;IF EQ NO (THAT WAS A LOT OF WORK Î ; FOR NOTHING)$6Ï BIT K.URM(R2),@$CPURM ;OTHER PORT ON THIS PROCESSOR)Ð BEQ 35$ ;IF EQ NO (DON'T WORRY, WE'LLO%Ñ ;CATCH IT LATER ON ANOTHER CPU) ÒÓÔ .ENDCÕÖ4×44$: BIT #KS.OFL,K.STS(R2) ;IS CONTROLLER OFFLINE?Ø BEQ 45$ ;IF EQ NO)"Ù TSTB U.STS(R5) ;IS UNIT ACTIVE?Ú BPL 35$ ;IF PL NOWÛÜ;3AÝ; THE CONTROLLER IS OFFLINE, AND THE UNIT IS ACTIVE. WE HAVE AOAÞ; PROBLEM. WE CANNOT CALL THE DRIVER AT THE CANCEL ENTRY SINCE$&ß; THE DEVICE REGISTERS DO NOT EXIST.à; áEâ BGCK$A BF.ERR,BE.CSR,FATAL ;ACTIVE CONTROLLER DISAPPEARED AT PWRFLBã45$: BITB #UC.PWF,U.CTL(R5) ;CALL DRIVER REGARDLESS OF ACTIVITY?ä BNE 50$ ;IF NE YES"å TSTB U.STS(R5) ;IS UNIT ACTIVE?æ BPL 35$ ;IF PL NO =ç50$: MOV D.DSP(R3),R2 ;GET ADDRESS OF DRIVER DISPATCH TABLET$è BEQ 35$ ;IF EQ DRIVER NOT LOADEDéê;+-ë; **-$LDPWF-CALL DRIVER AT POWERFAIL ENTRY. ì;VFí; THIS ROUTINE WILL UNCONDITIONALLY CALL THE DRIVER AT ITS POWERFAILî; ENTRY FOR A SINGLE UNIT.ï;X ð; INPUTS:ñ;Bò; R2=DDT ADDRESS.Aó; R3=DCB ADDRESS.Rô; R4=SCB ADDRESS.õ; R5=UCB ADDRESS.,ö;( ÷; OUTPUTS:ø;Gù; NONEú;V û; NO REGISTERS ARE PRESERVED!ü;-ý8þ$LDPWF::MOV KINAR5,-(SP) ;SAVE KERNEL INSTR ADDR REG 5ÿ .IF DF K$$DAS0 MOV KDSAR5,-(SP) ;SAVE KERNEL DATA ADDR REG 5 .IFTF+ MOV D.PCB(R3),R3 ;GET DRIVER PCB ADDRESSY' MOV P.REL(R3),KINAR5 ;MAP THE DRIVERO   .IFTE 1  MOV P.REL(R3),KDSAR5 ;MAP DRIVER IN DATA SPACE  .IFTF(55$: MOV S.KRB(R4),R3 ;GET KRB ADDRESS! BEQ 60$ ;IF EQ NO KRB ADDRESS * MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX;<; CALL DRIVER AT POWERFAIL ENTRY POINT WITH THE ARGUMENTS:;A; R3=CONTROLLER INDEX.+; R4=ADDRESS OF THE STATUS CONTROL BLOCK.); R5=ADDRESS OF THE UNIT CONTROL BLOCK.G;$; IF S.KRB=0 THEN R3 IS UNDEFINED.;I*60$: TST D.VPWF(R2) ;IS THERE AN ENTRY ? BEQ 70$ ;IF EQ NOE  CLC8! CALL @D.VPWF(R2) ;CALL DRIVER AT POWERFAIL ENTRYPOINT"70$: ;REFERENCE LABEL#$ .IFTB%3& MOV (SP)+,KDSAR5 ;RESTORE KERNEL DATA ADDR REG 5O'( .ENDC)*4+ MOV (SP)+,KINAR5 ;RESTORE KERNEL INSTR ADDR REG 5 , RETURN ; - .DSABL LSBA./0 .IF DF M$$PRO152$PWRMP::CACHE$ BYPASS ;;;GET ACTUAL WORD IN MEMORYE34; 5; REMOVE OUR BIT FROM $STENB6;K7&8 MOV $STENB,R0 ;;;GET CURRENT STATUS?95$: CACHE$ BYPASS ;;;KEEP FORCING BYPASS IN CASE OF PWR FAILC): BIC $CPBIT,$STENB ;;;CLEAR OUT OUR BITE"; BIT $CPBIT,$STENB ;;;BREAK TIES1< BNE 5$ ;;;FIX ONE IN A MILLION RACE CONDITIONS#= MOV $CPBIT,R1 ;;;GET OUR CPU BIT.$> COM R1 ;;;MAKE IT BIT CLEAR MASK)? BIC R1,R0 ;;;LEAVE ONLY OUR BIT IN R0 4@ CALL $STTIC ;;;MAKE SURE THE SANITY TIMER IS OFF@A10$: CACHE$ BYPASS ;;;KEEP FORCING BYPASS IN CASE OF PWR FAIL.B TST $PWRMK ;;;ANYONE IN THE POWERFAIL AREA!C BNE 10$ ;;;IF YES KEEP TRYINGA%D BIS R0,$STENB ;;;SET OUR BIT AGAINC'E CACHE$ RESTOR ;;;UNBYPASS THE CACHE; F RETURNUGH .ENDCIJ;++K;**-$MKSET-RESET MK11 CSR'S ON CPU ONLINEAL;IFM; THIS ROUTINE IS CALLED TO RESTORE THE SETTING OF MK11 CSR'S (USINGFN; $MKCSR,$MKCS1,$MKCS2) AFTER POWER FAILURE AND RECOVERY, AND AT CPUHO; ONLINE TIME TO BRING PARITY (NO PUN INTENDED) TO THE NEW PROCESSOR'SP; OUTLOOK ON MEMORY.Q;O R; INPUTS:S;$ T; NONE.NU;I V; OUTPUTS:W;AX; MK11 MEMORY BOXES REMAPPEDY;Z; R0,R1 ARE DESTROYEDU&[; R2 = STATUS (VALID ONLY IF $MKSET):\; C = 1 IF ANY ONLINE BOX (IN $MKCSR) IS NOT IN I/O PAGE];-^_ .IF DF M$$K11`>a; NOTE: THE FOLLOWING CODE ASSUMES THAT WE ARE CALLED ON CPU8b; ONLINE IN A SECTION PROTECTED BY $SGFI00sZut^ut´cÚµcÛ¶c�·c›’N (I.E. MPENT)9c; AND THAT POWERFAIL DOES NOT CALL $SGFIN. THIS WAY, IFP:d; A CSR "DISAPPEARS" WHILE POWERED DOWN, THE SYSTEM WILL:e; CRASH. IF IT DISSAPEARS BEFORE PROCESSOR ON-LINE (E.G.;f; SWITCHES NOT SET CORRECTLY) THE ON-LINE TRANSITITION ISR g; REJECTED.Uh4i$MKSET::MOV #$MKCSR,R0 ;POINT TO FIRST CSR ADDRESS+j MOV #IE.ONP,R2 ;ASSUME CSR'S NOT PRESENT/k10$: MOV (R0)+,R1 ;GET FIRST/NEXT CSR ADDRESSW(l CMP #160000,R1 ;IS IT A CSR ADDRESS ?#m BHI 20$ ;IF HI NO, IT'S A DUMMYY$n CLC ;ASSUME THAT THE CSR EXISTS1o MOV $MKCS1,(R1) ;STUFF CSR1 WITH CONTROL VALUESp BCS 30$ ;IF CS DIDN'T EXIST,;q MOV $MKCS2-$MKCSR-2(R0),2(R1) ;CRAM CSR2 WITH START ADDRR,r20$: CMP R0,#$MKCS2 ;REACHED THE END YET ?s BLO 10$ ;IF LO NO, CONTINUE4t MOV #1,R2 ;SET SUCCESS (NOTE C-BIT MUST BE CLEAR'u ;FOR BLO TO HAVE DROPPED THROUGH)Mv30$: RETURN ;BACK TO CALLER(wx .ENDC ; DF M$$K11yz{;+0|;**-$DRVPF-CALL DRIVERS FOR POWERFAIL RECOVERY}; F~; THIS ENTRY POINT IS PROVIDED SPECIFICALLY FOR USE BY AUTOCONFIGUREG; TO RECOVER THE SYSTEM. THE DEVICE DRIVERS ARE CALLED AT THEIR POWER?€; FAIL ENTRY POINTS IN ORDER TO RE-ESTABLISH INTERRUPTS, ETC.0�;-‚-ƒ$DRVPF:: ;DRIVER POWERFAIL RECOVERY ENTRY „8… MOV KISAR5,-(SP) ;SAVE APR 5 MAPPING (D OR I/D SPACE)†‡ .IF DF K$$DASˆ1‰ MOV KINAR5,-(SP) ;SAVE APR 5 MAPPING (I SPACE)CŠ‹ .IFTF ; DF K$$DASŒ� .IF DF M$$PROŽ6� BIS @$CPURM,$PFURM ;INDICATE THIS CPU'S URMS FAILED�‘ .ENDC ; DF M$$PRO’)“ CALL DRVPF ;CALL DRIVERS AT POWERFAILO”• .IFT ; DF K$$DASD–4— MOV (SP)+,KINAR5 ;RESTORE APR 5 MAPPING (I SPACE)˜™ .ENDC ; DF K$$DASš;› MOV (SP)+,KISAR5 ;RESTORE APR 5 MAPPING (D OR I/D SPACE)R œ RETURN ;�žŸ .END,-(SP) ;SAVE APR 5 MAPPING (D OR I/D SPACE)†‡ .IF DF K$$DASˆ1‰ MOV KINAR5,-(SP) ;SAVE APR 5 MAPPING (I SPACE)CŠ‹ .IFTF ; DF K$$DASŒ� .IF DF M$$PROŽ6� BIS @$CPURM,$PFURM ;INDICATE THIS CPU'S URMS FAILED�‘ .ENDC ; DF  .TITLE DRQIO  .IDENT /15.05/4;8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;K>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;  ; D. N. CUTLER 8-OCT-73K ;(- ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:  ;4; J. R. KAUFFMAN; J. M. LAWLER; T. LEKAS-; B. S. MCCARTHY;N-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:K;M ; H. HUANG; S. C. ADAMSR; S. M. THOMAS; J. W. BERZLE; B. S. MCCARTHY; L. B. MCCULLEY;R; MODIFIED BY:;R ; K. L. NOEL 06-JAN-87 V15.00;R+; KLN032 -- ADD IMPLICIT LUN ASSIGNMENTSR;E; K. L. NOEL 05-MAR-87 V15.01M;S.; KLN036 -- ADD SUPPORT FOR REMOTE OVERLAYS; ; K. L. NOEL 11-MAR-87 V15.02S;.>; KLN038 -- BYPASS CHECKS FOR NON-MOUNTED MOUNTABLE DEVICES; ON REMOTE SYSTEMS;; K. L. NOEL 6-APR-87 V15.03;./; KLN040 -- FIX IMPLICIT ALUN CALL TO A JUMP ; ; K. L. NOEL 16-JUN-87 V15.04S;A<; KLN054 -- ALLOCATE CPRBUF PACKET FOR KILL I/O FUNCTIONS;O$; ERIC POSTPISCHIL 20-JUL-87 15.05?; edp057 -- REMOVE CORRECT NUMBER OF ITEMS FROM KERNEL STACK7"; WHEN BACKING UP TASK'S PC.-;T.; MACRO LIBRARY CALLS /; 0:1 .MCALL F11DF$,HWDDF$,PKTDF$,SHDDF$,TCBDF$,PCBDF$,UCBDF$2 .MCALL BGCK$A2 .MCALL CPRDF$ ;KLN032T324 F11DF$ ;DEFINE FILES-11 CONTROL BLOCK OFFSETS&5 HWDDF$ ;DEFINE HARDWARE REGISTERS&6 PKTDF$ ;DEFINE I/O PACKET OFFSETS,7 SHDDF$ ;DEFINE SHADOW RECORDING OFFSETS.8 TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS39 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSR.: UCBDF$ ;DEFINE UNIT CONTROL BLOCK OFFSETS5: CPRDF$ ;DEFINE COPROCESSOR DEFINITIONS ;KLN032L:; ;KLN032!:; LOCAL SYMBOLS ;KLN032$:; ;KLN032: MAP6 = 140000 ;KLN032: ;KLN032F;<;+=; **-$DRQIO-QUEUE I/O REQUESTE)>; **-$DRQIW-QUEUE I/O REQU00tbunttöt÷tø tþfDATAEST AND WAIT.?;TE@; THESE DIRECTIVES INSTRUCT THE SYSTEM TO PLACE AN I/O REQUEST IN AOEA; QUEUE OF PRIORITY ORDERED REQUESTS FOR A DEVICE-UNIT SPECIFIED BYFDB; A LOGICAL UNIT NUMBER. IN ADDITION, IF THE DIRECTIVE IS QIO ANDJC; WAIT AND AN EVENT FLAG IS SPECIFIED, THE TASK IS PUT INTO A WAIT STATE!D; FOR THE SPECIFIED EVENT FLAG. E; F; DPB FORMAT: G; 'H; WD. 00 -- DIC(1./3.),DPB SIZE(12.). I; WD. 01 -- I/O FUNCTION CODE."J; WD. 02 -- LUN AND UNUSED BYTE.CK; WD. 03 -- EVENT FLAG NUMBER AND PRIORITY (PRIORITY IS IGNORED).S*L; WD. 04 -- ADDRESS OF I/O STATUS BLOCK.-M; WD. 05 -- ADDRESS OF AST SERVICE ROUTINE.AN; WD. 06 -- PARAMETER 1.O; WD. 07 -- PARAMETER 2.P; WD. 10 -- PARAMETER 3.Q; WD. 11 -- PARAMETER 4.R; WD. 12 -- PARAMETER 5.S; WD. 13 -- PARAMETER 6.T; U; INPUTS:PV;E;W; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.I3X; R3=ADDRESS OF THE I/O FUNCTION CODE IN THE DPB.C1Y; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.3.Z; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.[;E7\; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ]; /^; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.A(_; DIRECTIVE STATUS OF +1 IS RETURNED.!`; C=1 IF DIRECTIVE IS REJECTED.19a; DIRECTIVE STATUS OF 'D.RS5' IS RETURNED IF SPECIFIED b; LUN IS NOT ASSIGNED.c;-d e .ENABL LSBS1f$DRQIO::MOV (R3)+,-(SP) ;SAVE I/O FUNCTION CODE 'g CALL $MPLUN ;MAP LUN TO UCB ADDRESSEh BCC 10$ ;IF CC LUN ASSIGNEDDh ;KLN032K;h .IF DF C$$DFB&C$$RTB ;RUN TIME BINDING OF LUNS ;KLN032 h ;KLN032T?h BIT #T4.DFB,T.ST4(R5) ;TASK HAVE DEFERRED BINDING? ;KLN032C h BEQ 5$ ;IF EQ NO ;KLN032h ;KLN032T@h BIT #F5.RTB,$FMSK5 ;SYSTEM SUPPORT RUN TIME BINDING? ;KLN032 h BEQ 5$ ;IF EQ NO ;KLN032h ;KLN032A;h TST (SP)+ ;REMOVE I/O FUNCTION CODE FROM STACK ;KLN032 h ;KLN032D,h JMP $IMASG ;DO IMPLICIT ALUN ; KLN040h ; KLN040&h .ENDC ;C$$DFB&C$$RTB ; KLN032h ; KLN0324h5$: DRSTS D.RS5 ;SET DIRECTIVE STATUS ; KLN032h ; KLN032h ; KLN032j10$: ;**-1%k .IF DF R$$AMD ;AUTOMOUNT/DISMOUNT l.m CMP $VERTK,R5 ;QIO FROM VERIFICATION TASK ?0n BEQ 14$ ;IF EQ, YES - BREAKTHROUGH STALL I/Oo ASSUME US.SIO,200+p TSTB U.ST2(R2) ;STALL I/O IN PROGRESS ?I)q BMI 13$ ;IF MI, YES - DON'T QUEUE I/OKrs .ENDC ; DF R$$AMDt$u BIT #1,(R1) ;OPERATION PENDING ?v BEQ 14$ ;IF EQ NODw13$:Cw ADD #12,SP ; REMOVE FUNCTION, RETURN AND +1 FROM STACK. ;edp057V<w135$: SUB #2,$UMPC ;BACKUP TASK PC TO RE-EXECUTE ;KLN0543z CALLR $TKWSE ;WAITFOR SIGNIFICANT EVENT ;**-2Uz14$: ;KLN054$1z .IF DF C$$RTK ;REMOTE TASK SUPPORT ;KLN054 z ;KLN054R8z BIT #F5.RTK,$FMSK5 ;REMOTE TASKS TURNED ON? ;KLN054"z BEQ 145$ ;IF EQ NO ;KLN054z ;KLN054 8z CMPB 1(SP),#IO.KIL/256. ;IS THIS I/O KILL? ;KLN054"z BNE 145$ ;IF NE NO ;KLN054z ;KLN054A;z CMP (R2),$XXLOW ;IS I/O KILL FOR A GENERIC UCB ;KLN0545#z BLO 145$ ;IF LO, NO ;KLN054 ;z CMP (R2),$XXHGH ;IS I/O KILL FOR A GENERIC UCB ;KLN054C#z BHI 145$ ;IF HI, NO ;KLN054Kz ;KLN054R$z MOV R3,-(SP) ;SAVE R3 ;KLN054$z MOV R0,-(SP) ; AND R0 ;KLN054$z MOV R1,-(SP) ; AND R1 ;KLN0546z MOV #AL$SWS,R0 ;CALL IS FROM SYSTEM STATE ;KLN054/z MOV #1,R1 ;ONE BLOCK TO ALLOCATE ;KLN054L'z CALL $CPALO ;GET PACKET ;KLN054;/z BCC 143$ ;IF CC, ALLOCATION OKAY ;KLN054;z ;KLN054E6z ADD #14,SP ;GET RID OF JUNK ON THE STACK ;KLN054.z BR 135$ ;GO TO BACK UP USER'S PC ;KLN054z ;KLN054I8z143$: MOV R0,$CPPKT ;SAVE ADDRESS OF PACKET ;KLN054'z MOV (SP)+,R1 ;RESTORE R1 ;KLN054R$z MOV (SP)+,R0 ; AND R0 ;KLN054$z MOV (SP)+,R3 ; AND R3 ;KLN054z ;KLN054Oz CLR $CPLUN ; ;KLN054VAz MOVB -2(R3),$CPLUN ;STORE LUN NUMBER TO KILL I/O ON ;KLN054Cz ;KLN054Bz .ENDC ;C$$RTK ;KLN054 00tju^ut´cÚµcÛ¶c�·c›’z145$: ;KLN054:z BIT #DV.ISP!DV.OSP,U.CW1(R2) ;SPOOLED DEVICE? ;KLN054| BEQ 16$ ;IF EQ NO ;**-1E3} CMP U.ATT(R2),R5 ;IS ISSUING TASK THE DESPOOLER?0+~ BEQ 155$ ;IF EQ YES, I/O TO REAL DEVICE3 BITB #US.MNT,U.STS(R2) ;SPOOLED DEVICE MOUNTED ?R4€ BNE 15$ ;IF NE NO (US.MNT IS DEVICE NOT MOUNTED)4� CMP U.ACP(R2),R5 ;ISSUING TASK THE DEVICE'S ACP ?+‚ BEQ 155$ ;IF EQ YES, I/O TO REAL DEVICEMDƒ15$: CMPB 1(SP),#IO.WLB/256. ;WRITE LOGICAL FUNCTION NOT BY DSPLR?„ BNE 16$ ;IF NE NO %… DRSTS D.RS16 ;PRIVILEGE VIOLATION,4†155$: MOV R2,R0 ;DIRECT I/O TO ACTUAL SPOOLED DEV$‡16$: MOV (R0),R2 ;GET DCB ADDRESS)ˆ TST D.DSP(R2) ;IS THE DRIVER RESIDENT?5‰ BNE 17$ ;IF NE YES%Š DRSTS D.RS6 ;SET DIRECTIVE STATUSS(‹17$: MOV R0,-(SP) ;SAVE POINTER TO UCB0Œ MOV R1,-(SP) ;SAVE POINTER TO SECOND LUN WORD*� MOVB (R3),-(SP) ;SAVE EVENT FLAG NUMBER*Ž CALL $CEFNG ;CONVERT EVENT FLAG NUMBER0� BIC #1,R1 ;CLR GRP GLOBAL 2ND WORD INDICATOR+� BIC R0,(R1) ;CLEAR SPECIFIED EVENT FLAG8‘ MOV R3,-(SP) ;SAVE ADDRESS OF I/O STATUS BLOCK ADDRES8’ MOV (R3),R0 ;GET ADDRESS OF I/O STATUS BLOCK ADDRESS3“ BEQ $DQLM2 ;IF EQ NO I/O STATUS BLOCK SPECIFIEDT+”$DQLM1::CLR -(SP) ;ZERO I/O STATUS BLOCKS• MTPD$ (R0)+ ;S– CLR -(SP) ;(— MTPD$ (R0) ;.˜$DQLM2::CALL $ALPKT ;ALLOCATE AN I/O PACKET™š› .IF DF A$$CNTœ$� MOV R0,-(SP) ;SAVE PACKET ADDRESS5ž MOV T.ACN(R5),R0 ;LOCATE ACCOUNTING BLOCKS OF TASKO)Ÿ BEQ 20$ ;IF EQ, NO ACCOUNTING ON TASKE +¡ MOV #B.QIO,R1 ;OFFSET TO QIO COUNT FIELDD$¢ CALL $ADAT1 ;INCREMENT QIO COUNT1£20$: MOV (SP)+,R0 ;RESTORE PACKET ADDRESS TO R0S¤¥ .ENDC¦A§ TALLY$ B.QIOC,XA$$IO,CPU ;COUNT AN I/O INITIATION FOR THIS CPUO¨© .IF DF S$$HDWª:« MOV #DV.DIR!DV.F11,R3 ;SEE IF DEVICE SUPPORTS SHADOWING¬­;;@®; THE FOLLOWING INSTRUCTION DEPENDS ON THE UCB ADDRESS FOR THE&¯; CURRENT UCB BEING AT OFFSET 6(SP).°; ± ² MOV 6(SP),R1 ;GET UCB ADDRESS&³ BIC U.CW1(R1),R3 ;ARE ALL BITS SET?´ BNE 23$ ;IF NE NO -- EXITT.µ BIT #DV.SQD,U.CW1(R1) ;COULD IT BE MAGTAPE?¶ BNE 23$ ;IF NE YES -- EXIT$· MOV U.UMB(R1),R1 ;GET UMB ADDRESS¸ BEQ 23$ ;IF EQ NO UMBX¹º; E»; THE REPLACEMENT CONTROL TASK MUST BE SPECIAL CASED FOR SHADOWING.VD¼; IT IS THE ONLY TASK THAT MAY READ OR WRITE EITHER THE PRIMARY OR=½; THE SECONDARY DEVICE WITHOUT ITS FUNCTION BEING SHADOWED. ¾;N¿*À CMP $RCTPT,R5 ;IS THIS I/O FROM RCT...?Á BEQ 23$ ;IF EQ YES% CMP 6(SP),M.UCBS(R1) ;PRIMARY UCB??à BEQ 21$ ;IF EQ YES&Ä CALL $DEPKT ;DEALLOCATE I/O PACKET%Å DRSTS D.RS16 ;PRIVILEGE VIOLATIONSÆÇ;CÈ; DEVICE SUPPORTS SHADOW RECORDING AT THIS TIME. ALLOCATE THE ML*É; NODE AND LINK IT IN THE LIST AT M.LHD.Ê;EË7Ì21$: BIT #MS.MDA,M.STS(R1) ;CAN WE ALLOCATE NEW ONES?RÍ BNE 23$ ;IF NE NO (Î MOV R0,-(SP) ;SAVE CURRENT I/O PACKET!Ï MOV R1,-(SP) ;SAVE UMB ADDRESS(Ð MOV #ML.LGH,R1 ;SET LENGTH OF ML NODEÑ CALL $ALOCB ;GET PACKETYÒ BCC 22$ ;IF CC GOT SPACEÓÔ;B?Õ; NOT ENOUGH SPACE FOR THE ML NODE IN THE SYSTEM POOL. SEEMST?Ö; A SHAME TO KILL THE I/O AFTER GETTING THE FIRST PACKET, ANDP?×; NOT THE SECOND. MAYBE THE FINAL ANSWER IS TO LET THE FIRSTA?Ø; GO THRU AND ONLY CONSIDER IT A PROBLEM IF IT WAS A WRITE ORS@Ù; A READ THAT FAILED. FROM THE STATISTICS, IT WOULD SEEM THAT>Ú; THIS WOULD COVER THE VAST MAJORITY OF THE CASES (I.E. MOSTÛ; QIO FUNCTIONS ARE READS).LÜ; EÝ; FOR THE TIME BEING, IF WE CAN'T GET THE RESOURCES NOW, FORGET IT.Þ;ß!à TST (SP)+ ;REMOVE UMB ADDRESSE'á MOV (SP)+,R0 ;GET I/O PACKET ADDRESS &â CALL $DEPKT ;DEALLOCATE I/O PACKET#ã DRSTS D.RS1 ;ALLOCATION FAILUREYä'å22$: MOV R0,R1 ;COPY ML NODE ADDRESS æ CLR (R0)+ ;CLEAR LINK WORD)ç MOVB #ML.LGH,(R0)+ ;ML.LEN SET LENGTHA'è MOVB #MT.PKT,(R0)+ ;ML.TYP SET TYPES+é CLR (R0)+ ;ML.DNC/UNUSED SET DONE COUNTI:ê MOV 2(SP),(R0)+ ;ML.PRI SET PRIMARY I/O PACKET ADDRESS ë MOV (SP)+,R0 ;GET UMB ADDRESS6ì MOV M.LHD(R0),(R1) ;LINK NEW NODE TO PREVIOUS FIRST/í MOV00trunttöt÷tø tþfDATA R1,M.LHD(R0) ;POINT LISTHEAD TO NEW NODE (î MOV (SP)+,R0 ;GET OLD I/O PACKET BACKï23$: ;REFERENCE LABELðñ .ENDCòóôõ .IF DF R$$LKLö7÷ CLR I.PRM+16(R0) ;INITIALLY CLEAR LOCK ENTRY POINTER øù .ENDCúû;ü ADD #I.AADA,R0 ;POINT TO ATTACHEMENT DESCRIPTOR POINTERST2ý MOV R0,$ATTPT ;SAVE POINTER FOR $CKBFX ROUTINES'þ CLR (R0)+ ;CLEAR FIRST ATT DESC PTR ÿ CLR (R0) ;SECOND6 SUB #I.AADA+2,R0 ;POINT BACK TO START OF I/O PACKET. INCB T.IOC(R5) ;INCREMENT I/O REQUEST COUNT8 MOV (SP)+,R3 ;RETRIEVE ADDRESS OF I/O STATUS BLOCK AD- CMPB -10(R3),#3 ;IS FUNCTION QIO AND WAIT? BNE 25$ ;IF NE NO$ MOV R0,-(SP) ;SAVE PACKET ADDRESS+ MOVB 2(SP),R0 ;PICK UP EVENT FLAG NUMBER! BEQ 24$ ;IF EQ NONE SPECIFIED 0 CALL $CEFI ;CONVERT FLAG TO MASK AND ADDRESS'  CALL $DRWFS ;PUT TASK IN WAIT STATEN   .IF DF G$$GEF 9  INC @$GEFPT ;KEEP GRP GLOBALS AROUND FOR WAITFOR TESTR0 INCB @$GFTCB ;INC GRP GBL USE COUNT FOR TASK .ENDC ; DF G$$GEF+24$: MOV (SP)+,R0 ;RESTORE PACKET ADDRESSO&25$: MOV R0,R4 ;COPY PACKET ADDRESS- TST (R4)+ ;POINT TO SECOND WORD IN PACKET9 MOVB T.PRI(R5),(R4)+ ;PRIORITY IS THAT OF ISSUING TASKI- MOVB (SP)+,(R4)+ ;INSERT EVENT FLAG NUMBERN# MOV R5,(R4)+ ;INSERT TCB ADDRESS 5 MOV (SP)+,(R4)+ ;INSERT POINTER TO SECOND LUN WORDW% MOV (SP)+,R5 ;RETRIEVE UCB ADDRESS# MOV R5,(R4)+ ;INSERT UCB ADDRESSD+ MOV (SP)+,(R4) ;INSERT I/O FUNCTION CODE 5 CLR -(SP) ;SET FLAG TO QUEUE TO DRIVER (NE 0=ACP)+ MOV R0,-(SP) ;SAVE ADDRESS OF I/O PACKET6 CLR -(SP) ;CLEAR ADDRESS OF SECONDARY CONTROL BLOC$ MOV SP,$TEMP0 ;MARK STACK ADDRESS*  MOV (R4)+,-(SP) ;SAVE I/O FUNCTION CODE0! CLR R1 ;ASSUME NO I/O STATUS BLOCK SPECIFIED0" CLR R2 ;ASSUME NO I/O STATUS BLOCK SPECIFIED0# MOV (R3)+,R0 ;GET ADDRESS OF I/O STATUS BLOCK!$ BEQ 30$ ;IF EQ NONE SPECIFIEDS2% CALL $RELOC ;RELOCATE I/O STATUS BLOCK ADDRESS<&30$: MOV R0,(R4)+ ;INSERT VIRTUAL ADDRESS OF I/O STATUS BL'' MOV R1,(R4)+ ;INSERT RELOCATION BIAS(,( MOV R2,(R4)+ ;INSERT DISPLACEMENT ADDRESS)*+ .IF DF S$$LIB,0- MOV (R3)+,R2 ;GET AST SERVICE ROUTINE ADDRESS+. CALL $CALTA ;CALCULATE ADDRESS TO STORE)/ MOV R2,(R4)+ ;STORE PROPER AST ADDRESSI01 .IFFR263 MOV (R3)+,(R4)+ ;INSERT AST SERVICE ROUTINE ADDRESS45 .ENDC67+8 MOV (SP),R2 ;RETRIEVE I/O FUNCTION CODE!9 CLRB R2 ;CLEAR MODIFIER FLAGSS/: SWAB R2 ;SWAP FUNCTION CODE INTO RIGHT BYTEA; BNE 33$ ;IF NOT ZERO - OKM < JMP FCKIL ;KILL I/O FUNCTION=33$: ;REFERENCE LABEL>?@ .IF DF M$$MUPA+B TST U.CW1(R5) ;IS THIS MOUNTABLE DEVICE?T4C BMI 35$ ;BRANCH IF YES -- ACCESS VALIDATED LATER)D MOV U.OWN(R5),R0 ;IS THE DEVICE OWNED?OE BEQ 35$ ;IF EQ NO1F BITB #US.PUB,U.ST2(R5) ;PUBLIC ACCESS ALLOWED?RG BNE 35$ ;IF NE YES-H MOV $TKTCB,R1 ;POINT TO CURRENT TASK'S TCBC2I CMP T.UCB(R1),R0 ;DEVICE OWNED BY CURRENT TASK?J BEQ 35$ ;IF EQ YES2K BIT #T3.PRV,T.ST3(R1) ;CURRENT TASK PRIVILEGED?L BNE 35$ ;IF NE YES'M JMP IEPRI ;ELSE PRIVILEGE VIOLATIONN35$: ;ACCESS ALLOWEDOP .ENDCQR(S CMP R2,#31. ;FUNCTION CODE IN RANGE?T BHI $IEIFC ;IF HI NO*U MOV (R5),R1 ;GET ADDRESS OF DEVICE DCB5V ADD #D.MSK,R1 ;ASSUME FUNCTION CODE IN 0-15. RANGE(%W CMP R2,#15. ;0-15. FUNCTION CODE?$X BLOS 40$ ;IF LOS YES(Y ADD #10,R1 ;POINT TO SECOND MASK SET%Z SUB #16.,R2 ;REDUCE FUNCTION CODET%[40$: ASL R2 ;CONVERT TO WORD INDEX3,\ MOV $BTMSK(R2),R2 ;GET FUNCTION MASK WORD*] BIT R2,(R1)+ ;IS THIS A LEGAL FUNCTION?^ BEQ $IEIFC ;IF EQ NO>_ BITB #US.OFL!US.PDF,U.ST2(R5) ;DEV. OFFLINE OR PRIV. DIAG.?,` BEQ 45$ ;IF EQ NO -- GO AHEAD AND USE IT1a BITB #US.OFL,U.ST2(R5) ;IS UNIT REALLY OFFLINE#b BEQ 42$ ;IF EQ NOOc JMP IEOFL ;UNIT IS OFFLINE6d42$: MOV $TKTCB,-(SP) ;CHECK TO SEE IF TASK IS PRIV./e ADD #T.ST3,(SP) ;POINT TO STATUS WORD IN TCBB2f BIT #T3.PRV,@(SP)+ ;IS CURRENT TASK PRIVILEGED?#f BNE 452$ ;IF NE YES ;KLN0382(f JMP IEOFL ;OFFLINE ERROR 00tzu^ut´cÚµcÛ¶c�·c›’ ;KLN038f452$: ;KLN0388h BIT #IQ.UMD,(SP) ;IS THI DIAGNOSTIC FUNCTION? ;**-1#h BNE 453$ ;IF NE YES ;KLN038(h JMP IEOFL ;OFFLINE ERROR ;KLN038h453$: ;KLN038?j45$: BIT R2,(R1)+ ;IS THIS FUNCTION A CONTROL FUNCTION ;**-1L"j BEQ 454$ ;IF EQ NO ;KLN038*j JMP FCCTL ;CONTROL FUNCTION ;KLN038j454$: ;KLN038-l BIT R2,(R1)+ ;IS FUNCTION NOP'ED? ;**-1Um BNE ISSUC ;IF NE YES#n TST U.CW1(R5) ;MOUNTABLE DEVICE?o BPL 80$ ;IF PL NOR5p MOVB U.STS(R5),R0 ;GET STATUS BYTE FOR TESTS BELOWDqr .IF DF R$$AMDst BIT R2,(R1) ;ACP FUNCTION ?Fu BEQ 46$ ;IF EQ NO,v CMP #IO.APV,(SP) ;MOUNT OR DISMOUNT QIO ?'w BEQ 48$ ;IF EQ YES, DOESN'T HAVE TOIx ;BE MOUNTEDOyz .ENDC ; R$$AMD{?|46$: BITB #US.MNT!US.FOR,R0 ;VOLUME MOUNTED AND NOT FOREIGN ? )} BNE 60$ ;IF NE NOT MOUNTED OR FOREIGNR~ BIT R2,(R1) ;ACP FUNCTION? BEQ 70$ ;IF EQ NOI0€48$: MOVB 1(SP),R2 ;RETRIEVE I/O FUNCTION CODE-� SUB #10,R2 ;NORMALIZE FOR POLISH DISPATCH &‚ BLT 50$ ;IF LT TABLE INCONSISTANCY!ƒ ASL R2 ;CONVERT TO WORD INDEXP5„ MOV R5,-(SP) ;SAVE UCB ADDRESS FOR POLISH ROUTINESP… MOV R5,R0 ;U:† MOV I.LN2-I.PRM(R4),R1 ;SAVE ADDRESS OF SECOND LUN WORD$‡ MOV R1,-(SP) ;FOR POLISH ROUTINES2ˆ MOV $FCDSP(R2),R5 ;GET ADDRESS OF POLISH VECTOR&‰ JMP @(R5)+ ;EXECUTE POLISH ROUTINEŠ;D ‹; REGISTERS AT POLISH DISPATCHŒ;T �; R0 - UCBŽ; R1 - ADDRESS 2ND LUN WORDP�; R2 - NORMALIZED FCTN CODEE8�; R3 - POINTER TO PARAMETERS, INITIALLY -> PARAMETER 14‘; R4 - POINTER INTO I/O PACKET, INITIALLY -> I.PRM’; “; SP-> 2ND LUN WORD ADDRESSC”; UCB ADDRESS•; FUNCTION CODE2–; $TEMP0->SECONDARY CONTROL BLOCK ADDRESS (OR 0)—; I/O PACKET ADDRESSV"˜; QUEUE FLAG (0=DRIVER; NE=ACP)™;CMš; TASK HEADER IS ASSUMED TO BE MAPPED FOR ALL OF THE THREADED CODE ROUTINESE›;Dœ�;I(ž; DEVICE TABLE MASK WORD INCONSISTANCYŸ; G¡50$: BGCK$A BF.QIO,BE.IDC,FATAL ;DEVICE TABLE MASK WORD INCONSISTANCYR¢£;E,¤; DEVICE NOT MOUNTED OR MOUNTED AS FOREIGN¥;T¦>§60$: BITB #US.MNT,R0 ;DEVICE NOT MOUNTED OR MOUNTED FOREIGN?&¨ BEQ 65$ ;BRANCH IF MOUNTED FOREIGN©©; ;KLN038U©; ON REMOTE SYSTEMS, IF DEVICE IS ONE OF OUR GENERIC TYPES, THEY WILL NEVER ;KLN038)©; BE MOUNTED ;KLN038(©; BYPASS ALL CHECKS HERE ;KLN038©; ;KLN0382© .IF DF C$$RMT ;REMOTE HOST SUPPORT ;KLN038© ;KLN038F-© BIT #HF.RMT,$HFMSK ;TURNED ON? ;KLN038S!© BEQ 63$ ;IF EQ NO ;KLN038M© ;KLN038F6© CMP (R5),$XXLOW ;DCB LOWER THAN GENERICS? ;KLN038"© BLO 63$ ;IF LO YES ;KLN0384© CMP (R5),$XXHGH ;HIGHER THAN GENERICS? ;KLN038/© BLOS FCTRN ;IF LOS NO, ALLOW I/O ;KLN038G© ;KLN038L©63$: ;KLN038M© .ENDC ;C$$RMT ;KLN038S© ;KLN038 ª; DEVICE NOT MOUNTED«; ALLOW TRANSFER FUNCTION IF*¬; THE LOADR TASK IS DOING LOGICAL I/O IN-­; VIRGIN SYSTEMS WITH THE DISK NOT MOUNTED.K®;S¯; ACP FUNCTIONS ARE ILLEGALN°;$± BITB #US.VV,R0 ;VOLUME VALID SET?² BEQ 75$ ;IF EQ NOR³ BIT R2,(R1) ;ACP FUNCTION?´ BNE 75$ ;IF NE YESµ BR FCTRN ;ALLOW TRANSFER¶·; ¸; MOUNTED FOREIGNR%¹; CHECK VOLUME MOUNTED TO THIS USERº; IF ACP FUNCTION:»; ERROR IF NO ACP'¼; INCREMENT VOLUME TRANSACTION COUNT 0½; COPY PARAMETERS 1-6 (NO POLISH IF FOREIGN)0¾; QUEUE TO ACP UNLESS UC.QUE ALSO SET (U.CTL)¿; IF TRANSFER FUNCTION:S8À; ADDRESS CHECK AND RELOCATE BUFFER ADDRESS IN PARM 1.Á; MAP ADDRESS TO 18/22 BIT PHYSICAL ADDRESSÂ; COPY PARAMETERS 2-6Ã; QUEUE TO DRIVERÄ;A Å65$: ;ÆÇ .IF DF M$$MUPÈ1É CALL CXMOU ;CHECK VOLUME MOUNTED BY THIS USEROÊ BCS 75$ ;ERRORËÌ .ENDCÍÎ BIT R2,(R1) ;ACP FUNCTION?Ï BEQ FCTRN ;NOT ACP-TRANSFERE&Ð TST U.ACP(R5) ;MOUNTED WITH AN ACP?Ñ BEQ 75$ ;IF EQ NOI'Ò INC 6(SP) ;SET FLAG TO QUEUE TO ACPU!Ó MOV U.VCB(R5),R1 ;GET VCB ADDRSÔ BEQ FCXOP ;BR IF NO VCBC"Õ INC (R1) ;INCR VOL TRANS COUNT#Ö00t‚unttöt÷tø tþfDATA BR FCXOP ;INSERT PARAMETERS 1-6 רÙ;EHÚ; FUNCTION IS AN ILLEGAL FUNCTION-DECLARE ILLEGAL FUNCTION CODE STATUSÛ;.Ü2Ý$IEIFC::MOV #IE.IFC&377,R4 ;SET ILLEGAL FUNCTION Þ JMP IECMNßà;$7á; DEVICE MOUNTED AND NOT FOREIGN BUT NOT ACP FUNCTION?â;Bã/ä70$: CMP #IO.LOV,(SP) ;LOAD OVERLAY FUNCTION?Eå BEQ FCLOV ;IF EQ YES3æ CMP #IO.LDO,(SP) ;LOAD D-SPACE OVERLAY FUNCTION?Uç BEQ FCLOV ;IF EQ YES4è MOV $TKTCB,R0 ;GET ADDRESS OF TCB OF CURRENT TASK*é BIT #T3.PRV,T.ST3(R0) ;TASK PRIVILEGED?*ê BEQ 75$ ;IF EQ NO, PRIVILEGE VIOLATIONëì .IF NDF R$$PRO-íAî CMPB #IO.WLB/400,1(SP) ;IS IT A WRITE LOGICAL BLOCK FUNCTION ?7$ï BNE FCTRN ;IF NE NO, OK TO ISSUE1ð BITB #US.LAB,U.STS(R5) ;ANSI MAGTAPE MOUNTED ?T%ñ BNE FCTRN ;IF NE YES, OK TO ISSUEP3ò MOV 6(R3),-(SP) ;SAVE FIRST HALF OF BLOCK NUMBER 'ó BIS 10(R3),(SP)+ ;BOTH HALVES ZERO ?Pôõ .ENDC ; DF R$$PROö+÷ BNE FCTRN ;IF NE NOT LBN 0, OK TO ISSUER*ø CMP $RCTPT,R0 ;IS THE CURRENT TASK RCT?/ù BEQ FCTRN ;IF EQ, YES, ALLOW WRITE TO LBN 0,&ú75$: JMP IEPRI ;PRIVILEGE VIOLATIONûü;ý; INTERMEDIATE TO FCKILIþ;Aÿ+76$: BR FCKIL ;BRANCH TO HANDLE KILL I/OI;O; DEVICE IS NOT MOUNTABLE.;5"80$: BIT R2,(R1) ;ACP FUNCTION? BEQ FCTRN ;IF EQ NOP ;6J ; FUNCTION IS A FILE STRUCTURE FUNCTION FOR A NONFILE STRUCTURED DEVICE.J ; INITION THIS MUST BE A READ OR WRITE VIRUTAL SINCE ALL OTHER FUNCTIONSJ ; HAVE BEEN EITHER ILLEGAL OR NOP'ED. MAP FUNCTION TO IT LOGICAL COUNTER ;,@ MOV #IO.WLB,I.FCN-I.PRM(R4) ;ASSUME FUNCTION IS WRITE VIRTUAL2 CMPB #IO.WVB/400,1(SP) ;WRITE VIRTUAL FUNCTION? BEQ FCTRN ;IF EQ YESB MOV #IO.RLB,I.FCN-I.PRM(R4) ;SET FUNCTION TO READ LOGICAL BLOCK) BR FCTRN ;GO TRANSLATE BUFFER ADDRESSI  .DSABL LSB;UB; FUNCTION IS A TRANSFER FUNCTION-ADDRESS CHECK AND MAP TRANSFER; FCLOV: ;REFERENCE LABEL .IF DF U$$DAS!A$$CNTO4 CALL FACHL ;ADDRESS CHECK LOAD OVERLAY IN USER I  BR FCTR1 ;ENTER COMMON CODE!" .ENDC ; DF U$$DAS!A$$CNTU#+$FCTRN: CALL FACHK ;PERFORM ADDRESS CHECK,4%FCTR1: CALL $MPPHY ;MAP TO 18/22 BIT PHYS ADDRESS4& CALL FCXR1 ;INSERT RELOC DISP & BIAS; & PARM 2-6' BR FCXTR ;();CD*; FUNCTION IS A KILL I/O FUNCTION-FLUSH I/O QUEUE OF TASK REQUESTS+;I,0-FCKIL: MOV (SP),$TEMP2 ;SAVE I/O FUNCTION CODE . CALL $IOKL2 ;FLUSH I/O QUEUE/0;F1; FUNCTION IS A NOP'ED FUNCTION-DECLARE SUCCESSFUL COMPLETION STATUS2;I3;4ISSUC: MOV #IS.SUC&377,R4 ;SET SUCCESSFUL COMPLETION CODED5IECM1: JMP IECOM ;:67;H8; SPECIFIED DEVICE IS OFFLINER9;L:6;IEOFL: MOV #IE.OFL&377,R4 ;SET DEVICE OFFLINE STATUS< BR IECM1 ;=;S>?;28@; FUNCTION IS A CONTROL FUNCTION-COPY REMAINDER OF DPBA;OB)CFCCTL: TST U.CW1(R5) ;MOUNTABLE DEVICE?D BPL 10$ ;IF PL NO;+E MOV $TKTCB,R0 ;POINT TO CURRENT TASK TCBHBF BITB #US.MNT!US.FOR,U.STS(R5) ;DEVICE MOUNTED AND NOT FOREIGN ?G BNE 5$ ;IF NE NO(H BITB #US.LAB,U.STS(R5);ANSI MAGTAPE ?I BEQ 6$ ;IF EQ NO6J4$: BIT #T3.PRV,T.ST3(R0) ;ISSUING TASK PRIVILEGED ?'K BNE 10$ ;IF NE YES - ISSUE FUNCTION:+L45$: JMP IEPRI ;NO - PRIVILEGE VIOLATIONSM5$: ;REFERENCE LABELN;9O; IF THE EXEC HANDLES VV VS CTL FUNCTIONS, IT GOES HEREP;'Q6$: TST U.OWN(R5) ;DEVICE ALLOCATED ?ER BEQ 10$ ;IF EQ NON;S CMP U.OWN(R5),T.UCB(R0) ;DEVICE ALLOCATED TO THIS USER ?.'T BNE 4$ ;IF NE NO, CHECK PRIVILEGED.NU10$: ;REFERENCE SYMBOLN+VFCXOP: CALL FCXP1 ;INSERT PARAMETERS 1-6?WFCXTR: ;REFERENCE SYMBOLI4X BITB #IQ.UMD,(SP) ;IS THIS A DIAGNOSTIC FUNCTION?Y BEQ 10$ ;IF EQ NOE:Z BIT #DV.UMD,U.CW1(R5) ;DOES DEVICE SUPPORT DIAGNOSTICS?[ BEQ 10$ ;IF EQ NO7\ CMPB 1(SP),#IO.ATT/256. ;IS THIS AN ATTACH FUNCTION?O'] BEQ 10$ ;IF EQ YES, SKIP RELOCATIONC6^ CMPB 1(SP),#IO.DET/256. ;IS THIS A DETACH FUNCTION?_ BEQ 10$ ;IF EQ YES>` BITB #US.UMD,U.ST2(R5) ;IS DEVICE ATTACHED FOR DIAGNOSTICS?,a BEQ IEPRI ;IF EQ NO, PRIVILEGE VIOLATION0b MOV00tŠu^ut´cÚµcÛ¶c�·c›’ (R4),R0 ;PICK UP REGISTER BUFFER ADDRESS$c MOV #40.*2,R1 ;PICK UP MAX LENGTH1d CALL $CKBFW ;CHECK AND LOCK DIAGNOSTIC BUFFER)e BCS IESPC ;IF CS ADDRESS CHECK FAILEDR)f CALL $RELOC ;RELOCATE REGISTER BUFFERC"g MOV R1,(R4)+ ;STORE KISAR6 BIAS#h MOV R2,(R4) ;STORE DISPLACEMENTY*i10$: MOV (SP)+,R1 ;RESTORE FUNCTION CODE2j CMP #IO.LOV,R1 ;IS THIS AN I-SPACE LOAD OVERLAYk BEQ 15$ ;IF EQ YES1l CMP #IO.LDO,R1 ;IS THIS A D-SPACE LOAD OVERLAYQm BNE FCXIT ;IN NE NOEn15$:$o TST U.CW1(R5) ;MOUNTABLE DEVICE?p BPL FCXIT ;IF PL NO#4q MOV $TKTCB,R3 ;GET ADDRESS OF TCB OF CURRENT TASKq ;KLN036F4q .IF DF C$$RTK ;IF REMOTE TASK SUPPORT ;KLN036q ;KLN036 @q BIT #F5.RTK,$FMSK5 ;REMOTE TASK SUPPORT TURNED ON? ;KLN036!q BEQ 20$ ;IF EQ NO ;KLN036Vq ;KLN036N/q MOV T.LDV(R3),R0 ;GET UCB ADDRESS ;KLN036 4q CALL @#$MPLND ;FOLLOW REDIRECT POINTERS ;KLN036<q CMP (R0),$XXLOW ;IS THIS ONE OF OUR GENERIC DCBS ;KLN036!q BLO 20$ ;IF LO NO ;KLN036E1q CMP (R0),$XXHGH ;CHECK FOR TOO HIGH ;KLN0363.q BHI 20$ ;IF HIGHER, NOT GENERIC ;KLN036q ;KLN036 =q BR FCXIT ;BYPASS MOUNTED CHECK AND LBN CONVERSION ;KLN036 q ;KLN036Kq20$: ;KLN036Uq ;KLN036q .ENDC ; C$$RTK ;KLN0366r BIT #T4.LDD,T.ST4(R3) ;WAS LOAD DEVICE DISMOUNTED ?$s BNE IEPRI ;IF NE YES, REJECT I/Ot;DHu; IF THIS IS A FIXED TASK WITHOUT A TASK IMAGE SAVE SET T.LBN TO ZERO.Iv; NO LEGIT TASK SHOULD HAVE A ZERO T.LBN BECAUSE BLOCK ZERO IS RESERVED Dw; FOR THE BOOT BLOCK. SUCH A TASK (FIXED WITH NO IMAGE) SHOULD NOT'x; PERFORM DISK OVERLAY LOAD REQUESTS.Yy;Mz{ .IF DF F$$NIM|*} MOVB T.LBN(R3),R0 ;GET HIGH BYTE OF LBN;~ BIS T.LBN+1(R3),R0 ;MERGE IN LOW BYTE, TEST FOR ALL ZERO $ BEQ IEPRI ;IF EQ YES, REJECT I/O€� .ENDC ; DF F$$NIM‚3ƒ MOV T.LDV(R3),R0 ;GET UCB ADDRESS OF LOAD DEVICET„;+…; ** W A R N I N G **A†;A‡; SPM HOOKPOINT NUMBER 25.ˆ;L+‰; DO NOT CHANGE THE INSTRUCTION FOLLOWINGOŠ; LABEL WITHOUT CHECKING SPM‹;-Œ-�$SPH25==. ;SPM CHANGES THE INSTRUCTION ATT!Ž ;THE LOCATION OF THIS LABELU�+� CALL @#$MPLND ;MAP TO ACTUAL UCB ADDRESS.3‘ CMP R0,R5 ;LOAD DEVICE UCB MATCH SPECIFIED UCB?R’ BNE IEOVR ;IF NE NOT“9” ADD T.LBN+1(R3),-(R4) ;ADD IN LOW PART OF TASK LOGICALN• ADC -(R4) ;BLOCK NUMBERL=– MOVB T.LBN(R3),R0 ;GET HIGH BYTE OF TASK LOGICAL BLOCK NUMN—˜ .IF NDF U$$DASP™!š ADD R0,(R4) ;ADD IN HIGH PARTT›œ .IFF ; NDF U$$DAS�!ž ADD R0,(R4)+ ;ADD IN HIGH PARTM*Ÿ SUB T.ISIZ(R3),(R4) ;ADJUST TO START OF  SBC -(R4) ;REAL D-SPACEC¡¢ .ENDC ; NDF U$$DAS£ ¤FCXIT: TST (SP)+ ;CLEAN STACK/¥ MOV (SP)+,R1 ;RETRIEVE ADDRESS OF I/O PACKETI¦ TST (SP)+ ;QUEUE TO DRIVER%§ BEQ DRQRQ ;IF EQ YES, IF NE Q ACPN1¨ BITB #UC.QUE,U.CTL(R5) ;IF SET QUEUE TO DRIVERM#© BNE DRQRQ ;EVEN IF ACP FUNCTIONBª;+«; ** W A R N I N G **¬;­; SPM HOOKPOINT NUMBER 20.®;)+¯; DO NOT CHANGE THE INSTRUCTION FOLLOWINGS°; LABEL WITHOUT CHECKING SPM±;-²-³$SPH20==. ;SPM CHANGES THE INSTRUCTION ATS!´ ;THE LOCATION OF THIS LABELNµ¶ MOV U.ACP(R5),R0 ;I·¸¹ .IF DF R$$AMDº»;(G¼; IF THE VOLUME IS NOT MOUNTED OR MOUNTED FOREIGN, THEN U.ACP POINTERC½; IS STILL ZERO. FOR THESE CASES, QUEUE IO.APV TO THE DEFAULT ACP ¾;U,¿ BNE 10$ ;IF NE DEVICE ALREADY HAS AN ACP2À MOV $ACPTK,R0 ;GET DEFAULT FILES-11 ACP POINTERÁ10$:Âà .ENDC ; DF R$$AMDÄ+Å CALLR $EXRQP ;INSURE FILE SYSTEM ACTIVEEÆÇ; 6È; DESCRIPTION OF QUEUING AND INTERLOCKING INTERFACESÉ; FOR MOUNTABLE DEVICESLÊ;O<Ë; I. NOT MOUNTED - ALLOW XFER FCTNS IF 'VOLUME VALID' SET1Ì; (NEEDED FOR STARTUP). ACP FCTNS ARE ILLEGAL.D*Í; ADDRESS CHECK & MAP BUFFER ADDRESS INÎ; PARAMETER 1.Ï; QUEUE TO DRIVER.AÐ; Ñ; II. MOUNTED9Ò; A. ALL CASES - IF 'UC.QUE' SET IN 'U.CTL' THEN QUEUE$/Ó; TO DRIVER. (NECESSARY TO SUPPORT EXISTING:*Ô; DRIVERS THAT ARE REALLY LIKE ACP'S).Õ00t’unttöt÷tø tþfDATA;;Ö; B. MOUNTED FOREIGNE*×; 1. XFER FCTN - ADDRESS CHECK AND MAP*Ø; BUFFER ADDRESS IN PARAMETER 1. COPY'Ù; PARAMETERS 2-6. QUEUE TO DRIVER. 4Ú; 2. ACP FCTN - ERROR IF NO ACP. COPY PARAMETERS)Û; 1-6. NO POLISH ROUTINE PROCESSING.S*Ü; INCREMENT VOLUME TRANSACTION COUNT.Ý; QUEUE TO ACP.Þ;Rß; C. MOUNTED NOT FOREIGN1à; 1. XFER FCTN - EITHER OVERLAY OR PRIVILEGEDU&á; TASK I/O. ADDRESS CHECK AND MAP*â; BUFFER ADDRESS IN PARAMETER 1. COPY'ã; PARAMETERS 2-6. QUEUE TO DRIVER.E5ä; 2. DECNET ACP - I/O FUNCTION CODES ARE DISJOINT .å; FROM FILES ACPS' FUNCTION CODES. POLISH,æ; ROUTINE PROCESSING. QUEUED TO DRIVERç; BECAUSE 'UC.QUE' SET..è; 3. ANSI MAGTAPE (MTAACP) - SAME FUNCTION*é; CODES AS DISK FILE ACP (F11ACP) BUT*ê; NOT ALL ARE ALLOWED. POLISH ROUTINE+ë; PROCESSING. ALL OPERATIONS QUEUED TOE/ì; MTAACP. NO BLOCK LOCKING. ACCESS/DEACCESS+í; INTERLOCK BUT NO WINDOW TURN PENDINGM.î; COUNT BECAUSE EVERYTHING QUEUED TO ACP.+ï; INCREMENT VOLUME TRANSCACTION COUNT.D4ð; 4. FILES-11 DISK ACP (F11ACP) - POLISH ROUTINE/ñ; PROCESSING. TABLE BELOW DESCRIBES QUEUIN /ò; AND INTERLOCKING. LEGEND: A=QUEUE TO ACPS*ó; D=QUEUE TO DRIVER; I=INTERLOCK LUN;-ô; P=INCREMENT WINDOW TURN PENDING COUNT.A,õ; VOLUME TRANSACTION COUNT INCREMENTED./ö; SEE COMMENT LOCATED NEAR CKRAC AND CKWAC -÷; FOR DESCRIPTION OF WINDOW TURN PENDINGKø; COUNT ALGORITHM.Nù;úûDRQRQ: ;REFERENCE LABELü; 4ý; CHECK SOFTWARE WRITE LOCK BEFORE GOING TO $DRQRQþ;./ÿ BIT #DV.MSD,U.CW1(R5) ;MASS STORAGE DEVICE?  BEQ 20$ ;IF EQ NOL1 BIT #DV.SWL,U.CW1(R5) ;SOFTWARE WRITE LOCKED?N BEQ 20$ ;IF EQ NO 9 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?W BEQ 20$ ;IF EQ YES: CMPB #IO.WLB/256.,I.FCN+1(R1) ;WRITE LOGICAL FUNCTION? BEQ IEWLK ;IF EQ YES, MOV #$WLKTB,R4 ;POINT TO TABLE (IN QITBL)' MOV I.FCN(R1),R0 ;GET FUNCTION CODES#  BIC #7,R0 ;GET RID OF MODIFIERSL/ 10$: CMP (R4)+,R0 ;IS THIS THE FUNCTION CODE?G  BEQ IEWLK ;IF EQ YES  TST (R4) ;END OF TABLE?G  BNE 10$ ;IF NE NO 20$:! JMP $DRQRQ ;QUEUE I/O REQUESTW;R(; WRITE ATTEMPTED TO WRITE LOCKED UNIT;I1IEWLK: MOV #IE.WLK&377,R4 ;SET WRITE LOCK ERROR BR IECMN ;;B; ILLEGAL BUFFER ADDRESS SPECIFIED-DECLARE ILLEGAL BUFFER STATUS; 0I2SPC: CLR -(R4) ;ERASE LAST ATTRIBUTE NUMBER4IESPC: MOV #IE.SPC&377,R4 ;SET ILLEGAL BUFFER CODEIECOM: BR IECMN ;;I; ILLEGAL LOAD OVERLAY UCB-DECLARE ILLEGAL LOAD OVERLAY FUNCTION STATUS;( :!IEOVR: MOV #IE.OVR&377,R4 ;SET ILLEGAL LOAD OVERLAY CODE" BR IECMN ;#$;;%; ILLEGAL BYTE COUNT OR ALIGNMENT-DECLARE ODD BYTE STATUS:&;#'0(IEBYT: MOV #IE.BYT&377,R4 ;SET ODD BYTE STATUS) BR IECMN ;*+;A<,; NO BUFFER SPACE AVAILABLE-SET NO BUFFER AVAILABLE STATUS-;C.9/IENOD: MOV #IE.NOD&377,R4 ;SET NO BUFFER AVAILABLE CODE70 BR IECMN ;12;O*3; BAD PARAMETER-SET BAD PARAMETER STATUS4;O536IEBAD: MOV #IE.BAD&377,R4 ;SET BAD PARAMETER CODEU7 BR IECMN ;89;V6:; PRIVILEGE VIOLATION-SET PRIVILEGE VIOLATION STATUS;;;<9=IEPRI: MOV #IE.PRI&377,R4 ;SET PRIVILEGE VIOLATION CODEE> BR IECMN ;?@;YAA; FILE ALREADY ACCESSED ON LUN-SET FILE ALREADY ACCESSED STATSUAB; C;DIEALN: MOV #IE.ALN&377,R4 ;SET FILE ALREADY ACCESSED CODEE BR IECMN ;FG;77H; NO FILE ACCESSED ON LUN-SET NO FILE ACCESSED STATUSI;J8KIENLN: MOV #IE.NLN&377,R4 ;SET NO FILE ACCESSED STATUSLM .IF DF,R$$LKLNO BR IECOM ;PQ;E4R; EXPLICIT UNLOCK PERFORMED OR BLOCK LOCKING ERRORS; STATUS IN R0T;;U!VIELCK: MOV R0,R4 ;STATUS IN R0PWX .ENDCYZ;E[; COMMON ERROR EXIT\;]+^IECMN: MOV $TEMP0,SP ;RESET STACK POINTERC8_ MOV (SP)+,R0 ;RETRIEVE ADDRESS OF SECONDARY CONTROL B` BEQ 10$ ;IF EQ NONED3a CALL $DEATR ;DEALLOCATE SECONDARY CONTROL BLOCK a10$: ;KLN054S+a .IF DF C$$RTK ;REMOTE TA00tšu^ut´cÚµcÛ¶c�·c›’SKS ;KLN054 a ;KLN054 8a BIT #F5.RTK,$FMSK5 ;REMOTE TASKS TURNED ON? ;KLN054!a BEQ 20$ ;IF EQ NO ;KLN054Ba ;KLN0544a MOV (SP),R3 ;GET ADDRESS OF I/O PACKET ;KLN054=a CMPB I.FCN+1(R3),#IO.KIL/256. ;IS THIS I/O KILL? ;KLN054!a BNE 20$ ;IF NE NO ;KLN054C2a MOV $CPPKT,R0 ;GET ADDRESS OF PACKET ;KLN054$a BEQ 20$ ;IF EQ, NONE ;KLN054*a CALL $CPDEA ;DEALLOCATE IT ;KLN054a ;KLN054:a .ENDC ;C$$RTK ;KLN054Ra20$: ;KLN054N.a MOV R4,R0 ;SET FINAL I/O STATUS ;KLN0540c CLR R1 ;CLEAR SECOND I/O STATUS WORD ;**-1/d MOV (SP)+,R3 ;RETRIEVE ADDRESS OF I/O PACKETMe TST (SP)+ ;CLEAN STACK)f MOV I.UCB(R3),R5 ;RETRIEVE UCB ADDRESSI*g CALLR $IOFIN ;FINISH OFF I/O OPERATIONhi; j; BUILD AN I/O PACKETk;$l5m$BDPKT::INC 12(SP) ;QUEUE PACKET TO ACP NOT DRIVER ,n MOV #2*2,R1 ;SET LENGTH OF FILE ID BLOCK-o CALL OPPRM ;INSERT OPTIONAL FILE ID BLOCKN1p BEQ ATRBK ;IF EQ NO PARAMETER BLOCK SPECIFIEDNqr;R!s; BUILD ATTRIBUTE POINTER BLOCK0t;u?vATRBK: MOV (R3)+,(R4)+ ;ATTRIBUTE DESCRIPTOR BLOCK SPECIFIED?Iw BEQ MOVE3 ;IF EQ NOM.x MOV R3,-(SP) ;SAVE ADDRESS OF NEXT DPB WORD8y MOV #I.ATRL,R1 ;SET LENGTH OF SECONDARY CONTROL BLOCK1z CALL $ALOCB ;ALLOCATE SECONDARY CONTROL BLOCK$){ BCS IENOD ;IF CS NO STORAGE AVAILABLEO:| MOV R0,@$TEMP0 ;SAVE ADDRESS OF SECONDARY CONTROL BLOCK-} CLR (R0) ;INITIALIZE NUMBER OF ATTRIBUTESC)~ MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING 8 MOV -(R4),R3 ;RETRIEVE ADDRESS OF ATTRIBUTE DESCRIPTO7€ MOV R0,(R4)+ ;SET POINTER TO SECONDARY CONTROL BLOCKB8� MOV R4,-(SP) ;SAVE ADDRESS OF NEXT WORD IN I/O PACKET5‚ MOV R0,R4 ;SET ADDRESS OF FIRST ATTRIBUTE POINTERT8ƒ MOV #6,-(SP) ;SET MAXIMUM NUMBER OF ATTRIBUTE POINTER:„10$: MOV R3,R0 ;SET ADDRESS OF NEXT ATTRIBUTE DESCRIPTO/… MOV #4,R1 ;SET SIZE OF ATTRIBUTE DESCRIPTORS3† CALL $ACHCK ;ADDRESS CHECK ATTRIBUTE DESCRIPTORE*‡ BCS IESPC ;IF CS ADDRESS CHECK FAILURE6ˆ CALL $RELOM ;RELOCATE AND MAP ATTRIBUTE DESCRIPTOR1‰ ADD #4,R3 ;POINT TO NEXT ATTRIBUTE DESCRIPTOR ,Š MOVB (R0)+,(R4)+ ;INSERT ATTRIBUTE NUMBER4‹ BEQ 20$ ;IF EQ END OF ATTRIBUTE DESCRIPTOR BLOCK*Œ CLR R1 ;PICKUP SIZE OF ATTRIBUTE BLOCK� BISB (R0)+,R1 ;2Ž MOVB R1,(R4)+ ;INSERT LENGTH OF ATTRIBUTE BLOCK� BNE 15$ ;IF NE LENGTH OKAY+� MOV #256.*2,R1 ;SET LENGTH FOR ZERO CASEE3‘15$: MOV (R0),R0 ;GET ADDRESS OF ATTRIBUTE BLOCKE’“ .IF DF X$$HDR”)• MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGL$– MOV 6(SP),KISAR6 ;MAP TASK HEADER—˜ .ENDC™,š CALL IOBUF ;ADDR CHECK AND INC I/O COUNT›œ .IF DF X$$HDR�7ž MOV (SP)+,KISAR6 ;RESTORE MAPPING TO ATTRIBUTE BLOCKTŸ  .ENDC¡*¢ BCS I2SPC ;IF CS ADDRESS CHECK FAILURE6£ MOV R1,(R4)+ ;SAVE ADDRESS OF ATTACHMENT DESCRIPTOR1¤ CALL $RELOC ;RELOCATE ATTRIBUTE BLOCK ADDRESS.'¥ MOV R1,(R4)+ ;INSERT RELOCATION BIASM/¦ MOV R2,(R4)+ ;INSERT ATTRIBUTE BLOCK ADDRESS.§ DEC (SP) ;ANY MORE SPACE IN POINTER BLOCK?¨ BGT 10$ ;IF GT YES©20$: TST (SP)+ ;CLEAN STACK8ª MOV (SP)+,R4 ;RETRIEVE ADDRESS OF NEXT WORD IN I/O PA,« MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING5¬ MOV (SP)+,R3 ;RETRIEVE ADDRESS OF NEXT WORD IN DPBC­®;B8¯; MOVE EXTEND AND ACCESS CONTROL WORDS INTO I/O PACKET°;D±5²MOVE3: MOV (R3)+,(R4)+ ;INSERT EXTEND CONTROL WORDST³ MOV (R3)+,(R4)+ ;.´ MOV (R3)+,(R4)+ ;INSERT ACCESS CONTROL WORDµ¶;)"·; INSERT OPTIONAL FILENAME BLOCK¸;C¹4ºFILNM: MOV #13.*2,R1 ;SET LENGTH OF FILENAME BLOCK.» CALL OPPRM ;INSERT OPTIONAL FILENAME BLOCK.¼ BEQ 10$ ;IF EQ NO FILENAME BLOCK SPECIFIED½10$: JMP @(R5)+ ;¾¿;C$À; INTERPRET REQUIRED BLOCK ADDRESSÁ;D à .ENABL LSBI0ÄRQPRM: MOV SP,R2 ;SET REQUIRED PARAMETER FLAG Å BR 10$ ;ÆÇ;T$È; INTERPRET OPTIONAL BLOCK ADDRESSÉ;TÊ/ËOPPRM: CLR R2 ;CLEAR REQUIRED PARAMETER FLAG(1Ì10$: MOV (R3)+,R0 ;GET ADDRESS OF CONTROL BLOCK!Í BEQ 20$ ;IF EQ NONE SPECIFIED+Î CALL $CKBFW ;CHECK AND LOCK USER BUFFER 0Î BCC 15$00t¢unttöt÷tø tþfDATA ;IF CC, ADDRESS CHECK OKAY ;KLN0544Î JMP IESPC ;OTHERWISE FINISH WITH ERROR ;KLN0543Î15$: MOV R1,-(SP) ;SAVE ATT DESCR ADDR ;KLN054 0Ñ CALL $RELOC ;RELOCATE BUFFER ADDRESS ;**-2'Ò MOV R1,(R4)+ ;INSERT RELOCATION BIASE%Ó MOV R2,(R4)+ ;INSERT BLOCK ADDRESSE'Ô MOV (SP)+,R1 ;RESTORE ATT DESCR ADDR Õ BR 30$ ;(Ö20$: MOV R2,(R4)+ ;PARAMETER REQUIRED?!Ö BEQ 25$ ;IF EQ NO ;KLN054 4Ö JMP IEBAD ;OTHERWISE FINISH WITH ERROR ;KLN054/Ö25$: CLR (R4)+ ;CLEAR SECOND WORD ;KLN054IÙ30$: RETURN ; ;**-2 Ú .DSABL LSBSÛÜ;R<Ý; FILL DISCONNECT PARAMETER BUFFER AND INTERLOCK LUN USAGEÞ;Cßàá .IF DF M$$NETâ ã .ENABL LSB =ä$CKDIS::MOV (R3)+,(R4)+ ;COPY FIRST PARAMETER TO I/O PACKETE!å BR 10$ ;FINISH IN COMMON CODERæç;M"è; CHECK CONNECT PARAMETER BUFFERé;Bêë2ì$CKPRM::CALL FCXP1 ;COPY PARAMETERS (UNTOUCHED)í JMP @(R5)+ ;îï$CKHDR:: ;ðñ .IF DF X$$HDRò$ó MOV U.SCB(R0),R2 ;GET SCB ADDRESS@ô BIT #S2.XHR,S.ST2(R2) ;COMM PRODUCT SUPPORT EXTERNAL HEADERS?õ BNE 20$ ;IF NE YES+ö CMP #120000,R1 ;HEADER RESIDENT IN POOL?K÷ BHIS 20$ ;IF HIS YES)ø JMP IEBAD ;RETURN BAD PARAMETER ERRORDùú .ENDCûü$CKCON:: ;ý1þ2$: MOV 2(R3),R1 ;GET LENGTH OF BUFFER IN BYTESD!ÿ BNE 5$ ;IF NE NON ZERO LENGTHA JMP IESPC ;ZERO LENGTH,5$: CALL RQPRM ;INSERT REQUIRED PARAMETER%10$: CALL FCXP2 ;INSERT PARAMETERS 20$: JMP @(R5)+ ;  .DSABL LSBU .ENDC ;S( ; CHECK FOR VOLUME MARKED FOR DISMOUNT ;T   .ENABL LSB=$CKDMO::BITB #US.MDM,U.STS(R0) ;VOLUME MARKED FOR DISMOUNT?O BNE 15$ ;IF NE YES JMP @(R5)+ ;;R%; CHECK VOLUME MOUNTED BY THIS USER;C .IF DF M$$MUP$CKMOU:: ;REFERENCE LABEL .IF DF R$$AMD2 CMP #IO.APV,4(SP) ;MOUNT/DISMOUNT I/O REQUEST ?*  BEQ 2$ ;IF EQ YES - BYPASS MOUNT CHECK!" .ENDC ; DF R$$AMD#$ MOV R5,-(SP) ;SAVE R5 % MOV 4(SP),R5 ;GET UCB ADDRESS/& CALL CXMOU ;IS DEVICE MOUNTED BY THIS USER?' BCS 15$ ;IF CS NOC!( MOV (SP)+,R5 ;RESTORE REGISTERE)2$: JMP @(R5)+ ;O*+;14,; SUBROUTINE TO SEARCH MOUNT LIST TO SEE IF VOLUME-; REALLY MOUNTED BY THIS USERC.;/%0CXMOU: MOV R1,-(SP) ;SAVE REGISTERS:1 MOV R2,-(SP) ;)2 BITB #US.PUB,U.ST2(R5) ;PUBLIC DEVICE?43 BNE 8$ ;PUBLIC DEVICE OK%4 MOV $TKTCB,R1 ;IS TASK PRIVILEGED?U5 BIT #T3.PRV,T.ST3(R1)6 BNE 8$ ;PRIVILEGED TASK OK07 MOV T.UCB(R1),R1 ;GET USER TI: UCB ADDR AS ID!8 MOV #$MOULS,R2 ;GET MOUNT LISTS9:5$: SEC ;ASSUME FAIL%; MOV (R2),R2 ;GET MOUNT LIST ENTRY$< BEQ 9$ ;NONE=DONE=FAIL0= CMPB #MT.MLS,M.TYPE(R2) ;RIGHT TYPE OF ENTRY?> BNE 5$ ;BR NOT MOUNT ENTRY%? CMP M.DEV(R2),R5 ;SAME DEVICE UCB?S@ BNE 5$ ;BR DIFFERENT DEVICE$A CMP M.TI(R2),R1 ;SAME USER AS TI?B BNE 5$ ;BR DIFFERENT USERCCD8$: CLC ;SUCCESS%E9$: MOV (SP)+,R2 ;RESTORE REGISTERS3F MOV (SP)+,R1 ;R G RETURNSHI .ENDCJKLMN; BO; CHECK FOR READ ACCESS PRIVILEGES AND EXIT TO TRANSFER FUNCTIONP;AQ3R$CKRAC::MOV #WI.RDV,R2 ;SET READ ACCESS MASK WORDQ S BR 10$ ;TU;CV; CHECK FOR WRITE ACCESS PRIVILEGES AND EXIT TO TRANSFER FUNCTIONUW;TX4Y$CKWAC::MOV #WI.WRV,R2 ;SET WRITE ACCESS MASK WORD/Z10$: BIT R2,@(R1)+ ;DESIRED ACCESS PERMITTED? [ BNE 20$ ;IF NE YES&\15$: JMP IEPRI ;PRIVILEGE VIOLATION];$6^; ADDRESS CHECK & INSERT RELOC BIAS, DISP & PARM 2-6_;T"`20$: MOV R0,R5 ;GET UCB ADDRESS%a CALL FACHK ;PERFORM ADDRESS CHECKG!b CALL FCXR1 ;INSERT PARAMETERScd .IF DF,M$$NETe+f CMPB #IO.WVB/400,5(SP) ;DECNET FUNCTION? g BGE CKLCK ;IF GE NOO$h MOV U.SCB(R5),R0 ;GET SCB ADDRESS7i BIT #S2.XHR,S.ST2(R0) ;NEW I.LN2 HANDLING SUPPORTED?Ej BNE 50$ ;IF NE YES&k MOV $TKTCB,R0 ;GET TASK TCB ADDRESS=l MOV T.ATT(R0),R0 ;GET TASK PARTITION ATTACHMENT DESCRIPTORE:m INCB A.IOC-A.TCBL(R0) ;LOCK DOWN THE HEADER FOR THE I/O6n MOV A.PCB-A.TCBL(R0),R0 ;GET ADDRESS OF TASK REGION*o INCB P.IOC(R0) ;BUMP REGION'S00tªu^ut´cÚµcÛ¶c�·c›’ I/O COUNT,p MOV 10(SP),R0 ;GET THE I/O PACKET ADDRESSq BR 55$ ;JOIN COMMON CODErs .ENDCtu;N$v; DO RMS BUCKET LOCKING PROCESSINGw;R-xCKLCK: BITB #US.LAB,U.STS(R5) ;ANSI MAGTAPE)y BNE 30$ ;IF NE YES(z MOV 10(SP),R1 ;GET ADDRESS I/O PACKET{| .IF DF,R$$LKL}(~ CALL $LCKPR ;PERFORM LOCK PROCESSING' BCC 22$ ;CS IF ERROR OR UNLOCK DONE-€ JMP IELCK ;D�22$: ;REFERENCE LABEL‚ƒ .ENDC„… CALL $MPPKT ;MAP VBN TO LBNI† BCS 30$ ;MAP FAILURE‡ TST R0 ;ALL BLOCKS MAPPED??Pˆ BEQ 40$ ;IF EQ YES ‰30$: INC 12(SP) ;QUEUE TO ACP*Š40$: MOV @(SP),R0 ;GET ADDRESS OF WINDOW*‹ INCB W.IOC(R0) ;ADJUST WINDOW I/O COUNT,Œ50$: MOV 10(SP),R0 ;GET I/O PACKET ADDRESS:� MOV @I.LN2(R0),I.LN2(R0) ;CHANGE I.LN2 TO IMAGE OF LUT2!Ž INC I.LN2(R0) ;FLAG IT AS SUCH ?�55$: BISB #200,I.EFN(R0) ;FLAG PACKET AS VIRTUAL I/O FUNCTION-� TST (SP)+ ;CLEAN STACK'‘ MOV (SP)+,R5 ;RESTORE TO UCB ADDRESSC’ TST (SP)+ ;CLEAN STACK“CKJXT: JMP FCXIT ;U ” .DSABL LSB;•–;S*—; CHECK FOR FILE ALREADY ACCESSED ON LUN˜;(™*š$CKALN::TST (R1) ;FILE ACCESSED ON LUN?› BEQ CKJR5 ;IF EQ NO.œ JMP IEALN ;ERROR�ž;T"Ÿ; CHECK FOR FILE ACCESSED ON LUN ;D¡*¢$CKNLN::TST (R1) ;FILE ACCESSED ON LUN?£ BNE CKJR5 ;IF NE YES¤ JMP IENLN ;ERROR¥¦;5<§; SET UP REGISTERS FOR UNLOCK AND EXIT TO CONTROL FUNCTION¨;T©ª« .IF DF R$$LKL¬=­$UNLXT::TST (R4)+ ;SKIP FIRST WORD OF "ADDRESS DOUBLEWORD" ® MOV R0,R5 ;SETUP UCB POINTER¯ CALL FCXP1 ;COPY PARAMETERSA° BR CKLCK ;±² .ENDC³´µ;:!¶; SET ACCESS/DEACCESS INTERLOCK·;C¸;¹$CKRLK::INC @(SP) ;SET ACCESS/DEACCESS PENDING INTERLOCKIº»;E ¼; EXIT POLISH TO FUNCTION EXIT½; ¾7¿$CKXIT::TST (SP)+ ;REMOVE ADDRESS OF SECOND LUN WORDN%À MOV (SP)+,R5 ;RETRIEVE UCB ADDRESSSÁ TST (SP)+ ;ADJUST STACK PTRU! MOV U.VCB(R5),R1 ;GET VCB ADDRLà BEQ CKJXT ;BR IF NO VCB;%Ä INC (R1) ;INCR VOLUME TRANS COUNTÅ BR CKJXT ;EXIT POLISHPÆ2Ç$CKPKT::MOV #$FCPKT,R5 ;JOIN COMMON ACP REQUESTSÈCKJR5: JMP @(R5)+ ;ÉÊ; ;Ë; INCREMENT WINDOW I/O COUNT FOR MOUNTED FILES-11 DEVICES Ì; Í,Î$CKIWN::MOV @(SP),R0 ;GET CONTENTS OF LUT2+Ï BIC #1,R0 ;CLEAR LUN INTERLOCK, WINDOW?XÐ BEQ 10$ ;IF EQ NOA(Ñ INCB W.IOC(R0) ;BUMP WINDOW I/O COUNTÒ10$: JMP @(R5)+ ;ÓÔ;T-Õ; LOCK HEADER IN MEMORY DURING ACP FUNCTION Ö;V×5Ø$CKLHD::MOV $TKTCB,R0 ;GET CURRENT TASK TCB ADDRESSV.Ù MOV T.ATT(R0),R0 ;GET ATTACHMENT DESCRIPTOR8Ú INCB A.IOC-A.TCBL(R0) ;BUMP I/O COUNT FOR TASK REGION6Û MOV A.PCB-A.TCBL(R0),R0 ;GET ADDRESS OF TASK REGION*Ü INCB P.IOC(R0) ;BUMP REGION'S I/O COUNT+Ý MOV 10(SP),R0 ;GET ADDRESS OF I/O PACKETU=Þ BISB #200,I.EFN(R0) ;FLAG REQUEST AS A VIRTUAL I/O REQUESTIß JMP @(R5)+ ;àáâ;M2ã; SUBROUTINES TO COPY PARAMETERS INTO I/O PACKETä;O å; INPUTS:Mæ; FCXR1 - R1 RELOCATION BIASç; R2 DISPLACEMENT BIASè; R3 PARAMETER PTRé; R4 I/O PACKET PTRR'ê; COPIES R1, R2, AND PARAMETERS 2-6Oë;Cì; FCXP2 - R3, R4Tí; COPIES PARAMETERS 2-6Bî;Bï; FCXP1 - R3, R4 ð; COPIES PARAMETERS 2-6(ñ;B!ò; OUTPUTS: R3, R4 UPDATED PTR'SPó;;ô-õFCXR1: MOV R1,(R4)+ ;INSERT RELOCATION BIAS;)ö MOV R2,(R4)+ ;INSERT DISPLACEMENT BIASJ ÷ BR FCXP2 ;COPY PARAMETRS 2-6,øFCXP1: MOV (R3)+,(R4)+ ;INSERT PARAMETER 1,ùFCXP2: MOV (R3)+,(R4)+ ;INSERT PARAMETER 2&ú MOV (R3)+,(R4)+ ;INSERT PARAMETER 3&û MOV (R3)+,(R4)+ ;INSERT PARAMETER 4&ü MOV (R3)+,(R4)+ ;INSERT PARAMETER 5%ý MOV (R3)+,(R4) ;INSERT PARAMETER 6 þ RETURNRÿ;-8; SUBROUTINE TO PERFORM ADDRESS CHECK AND MAP TRANSFER;FACHL: .IF DF A$$CNT. MOV KISAR6,-(SP) ;SAVE CURRENT EXEC MAPPING1  MOV $TKTCB,R0 ;GET TCB ADDRESS OF CURRENT TASKJ4  MOV T.ACN(R0),KISAR6 ;MAP TO TAB (OR OTHER BLOCK)  BEQ 10$ ;IF EQ NO BLOCK/  CMPB #BT.TAB,@#B.TYP+140000 ;IS THIS A TAB ?V  BNE 10$ ;IF NE NOR, ADD #1,@#B.OVLY+2+140000 ;INCREMENT COUNT# ADC @#B.OVLY+140000 ;SECOND HAL00t²uu·utöt÷tø tþfDATAFT110$: MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGT .ENDC ; DF A$$CNT .IF DF U$$DAS> CMP I.FCN-I.PRM(R4),#IO.LDO ;IS THIS A D-SPACE LOAD OVERLAY BEQ FACHK ;IF EQ YES8 MOV #$RELUI,-(SP) ;PUSH ADDRESS OF RELOCATION ROUTINE8 MOV #$CKBFI,-(SP) ;AND ADDRESS OF ADDR. CHECK ROUTINE BR FACH1 ;ENTER COMMON CODE .IFTF ; DF U$$DAS !FACHK: ;REFERENCE LABEL"# .IFT ; DF U$$DAS#$8% MOV #$RELOC,-(SP) ;PUSH ADDRESS OF RELOCATION ROUTINE&' .ENDC ; DF U$$DAS(8) MOV #$CKBFR,-(SP) ;AND ADDRESS OF ADDR. CHECK ROUTINE6* CMPB I.FCN+1-I.PRM(R4),#IO.WLB/400 ;WRITE LOGICAL ?+ BEQ FACH1 ;IF EQ YES6, CMPB I.FCN+1-I.PRM(R4),#IO.WVB/400 ;WRITE VIRTUAL ?- BEQ FACH1 ;IF EQ YES0. MOV #$CKBFB,(SP) ;SET READ/WRITE BUFFER CHECK/10FACH1: MOV (R3)+,R0 ;GET ADDRESS OF USER BUFFERN1&2 MOVB U.CTL(R5),R1 ;GET CONTROL BYTE)3 BPL 10$ ;IF PL BYTE ALIGNMENT ALLOWED$&4 BIT #1,R0 ;IS BUFFER BYTE ALIGNED?&5 BNE 30$ ;IF NE YES-ALIGNMENT ERROR;610$: BIC #^C,R1 ;CLEAR ALL BUT LENGTH MODULO BITSC27 BIT R1,(R3) ;DOES LENGTH HAVE CORRECT MODULUS?&8 BNE 30$ ;IF NE NO-ALIGNMENT EERROR.9 MOV (R3),R1 ;GET LENGTH OF BUFFER IN BYTES!: BEQ 40$ ;IF EQ ILLEGAL BUFFERS;.<15$: CALL @(SP)+ ;ADDRESS CHECK USER BUFFER'= BCS 40$ ;IF CS ADDRESS CHECK FAILED >? .IF DF U$$DAS@!A CALLR @(SP)+ ;RELOCATE BUFFERBBC .IFF ; DF U$$DASMD.E CALLR $RELOC ;RELOCATE USER BUFFER ADDRESSFG .ENDC ; DF U$$DASHIJ30$: JMP IEBYT ;C)K40$: JMP IESPC ;ILLEGAL BUFFER ADDRESSTLMN;,IO; ADDRESS CHECK I/O BUFFER AND INCREMENT COUNT IN ATTACHMENT DESCRIPTOREP;Q R .ENABL LSBT+SIOBUF: CALL $ACHCK ;ADDRESS CHECK BUFFERQ%T BCS 10$ ;IF CS ADDR CHECK FAILURE+5UIOBF2: MOV (R2),R1 ;POINT TO PCB OF BUFER (W.BPCB)S1V INCB P.IOC(R1) ;INDICATE I/O THROUGH PARTITION@8W MOV W.BATT(R2),R1 ;POINT TO ATTACHMENT DESC OF BUFFER&X INCB A.IOC(R1) ;INCREMENT I/O COUNTY10$: RETURN ;; Z .DSABL LSB[\ .ENDP IEBYT ;C)K40$: JMP IESPC ;ILLEGAL BUFFER ADDRESSTLMN;,IO; ADDRESS CHECK I/O BUFFER AND INCREMENT COUNT IN ATTACHMENT DESCRIPTOREP;Q R .ENABL LSBT+SIOBUF: CALL $ACHCK ;ADDRESS CHECK BUFFERQ%T BCS 10$ ;IF CS ADDR CHECK FAILURE+5UIOBF2: MOV (R2),R1 ;POINT TO PCB OF BUFER (W.BPCB)S1V INCB P.IOC(R1) ;INDICATE I/O THROUGH PARTITION@8W MOV W.BATT(R2),R1 ;POINT TO ATTACHMENT DESC OF BUFFER&X INCB A.IOC(R1) ;INCREMENT I/O COUNTY10$: RETURN ;; Z .DSABL LSB .TITLE MDSUBI .IDENT /14.01/O;P7; COPYRIGHT (c) 1986 BY DIGITAL EQUIPMENT CORPORATIONL; ALL RIGHTS RESERVED.;A>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;. ; D. N. CUTLER 4-AUG-73N ;O; MODIFIED BY:; "; J. R. KAUFFMAN 3-SEP-86 14.015; JRK332 - ADD SUPPORT FOR DATA CACHE WRITE DEFERSB;RC;RD; I/O RELATED ROUTINESE;:6F; ROUTINES USED BY FILES-11 AND MASS STORAGE DRIVERSG;DH; MACRO LIBRARY CALLSI;J:K .MCALL F11DF$,HDRDF$,HWDDF$,PCBDF$,PKTDF$,SHDDF$,TCBDF$2L F11DF$ ;DEFINE WINDOW AND LOCK BLOCK OFFSETS )M HDRDF$ ;DEFINE TASK HEADER OFFSETS R&N HWDDF$ ;DEFINE HARDWARE REGISTERS3O PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS&P PKTDF$ ;DEFINE I/O PACKET OFFSETS,Q SHDDF$ ;DEFINE SHADOW RECORDING OFFSETS.R TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETSST;+(U; **-$DEATR-DEALLOCATE ATTRIBUTE BLOCKV;SEW; THIS ROUTINE IS CALLED TO DEALLOCATE AN ATTRIBUTE BLOCK ALLOCATED4X; BY QIO PROCESSING OF A USER FILE ATTRIBUTE LIST.Y; Z; INPUTS:D[; "\; R0=ADDRESS OF ATTRIBUTE BLOCK.]; ^; OUTPUTS:_;E=`; ALL I/O COUNTS ASSOCIATED WITH THE BLOCK ARE DECREMENTED. a;-b A-c$DEATR::MOV R0,-(SP) ;SAVE ADDRESS OF BLOCKF,d MOV #6,-(SP) ;SET MAX COUNT OF ATTRIBUTES.e60$: TSTB (R0) ;IS THERE ANOTHER ATTRIBUTE?f BEQ 70$ ;IF EQ NO(g MOV R0,-(SP) ;SAVE POINTER INTO BLOCK/h MOV 2(R0),R0 ;POINT TO ATTACH00uºu^ut´cÚµcÛ¶c�·c›’MENT DESCRIPTORL$i CALL $DECIO ;DECREMENT I/O COUNT6j MOV (SP)+,R0 ;RESTORE POINTER INTO ATTRIBUTE BLOCK,k ADD #8.,R0 ;POINT TO NEXT ENTRY IN BLOCKl DEC (SP) ;ANY MORE TO GO?:m BNE 60$ ;IF NE YESn70$: TST (SP)+ ;POP COUNT&o MOV (SP)+,R0 ;RESTORE BLOCK POINTER'p MOV #I.ATRL,R1 ;SET COUNT TO RELEASEM-q CALLR $DEACB ;DEALLOCATE BLOCK AND RETURN: r I s;+ ?t; **-$CVLBN-CONVERT LOGICAL BLOCK NUMBER TO DISK PARAMETERS u; Dv; THIS SUBROUTINE WILL CONVERT THE SPECIFIED LOGICAL BLOCK NUMBER ,w; TO A SECTOR/TRACK/CYLINDER ADDRESS. x; y; INPUTS: . z; !{; (SAME AS $BLKCK OUTPUTS) ;|; R0=LOW PART OF LBN }; R2=HIGH PART OF LBN P~; R3=I/O PACKET ADDRESS E; R5=UCB ADDRESS T €; �; OUTPUTS: ‚; ƒ; R0=SECTOR NUMBER „; R1=TRACK NUMBER …; R2=CYLINDER NUMBER †;- T ‡ T%ˆ$CVLBN::MOV R0,R1 ;SHUFFLE LOW LBNN‰ MOV R2,R0 ;SHUFFLE HIGH LBNC6Š MOVB U.PRM(R5),R2 ;SET DIVISOR TO SECTORS PER TRACK&‹ DIV R2,R0 ;CALCULATE SECTOR NUMBER#Œ MOV R1,-(SP) ;SAVE SECTOR NUMBER � MOV R0,R1 ;SET NEW DIVIDENDFŽ CLR R0 ;CLEAR HIGH BITSO:� MOVB U.PRM+1(R5),R2 ;SET DIVISOR TO TRACKS PER CYLINDER+� DIV R2,R0 ;CALCULATE TRACK AND CYLINDER &‘ MOV R0,R2 ;COPY CYLINDER NUMBER *’ MOV (SP)+,R0 ;RETREIVE SECTOR NUMBER “ RETURN ; ” •;+)–; **-$BLKCK-LOGICAL BLOCK CHECK ROUTINEO;—; **-$BLKC1-LOGICAL BLOCK CHECK ROUTINE (ALTERNATE ENTRY)2I˜; **-$BLKC2-LOGICAL BLOCK CHECK ROUTINE (ALTERNATE ENTRY FOR QUEUE OPT)™;VFš; THIS ROUTINE IS CALLED BY I/O DEVICE DRIVERS TO CHECK THE STARTINGA›; AND ENDING LOGICAL BLOCK NUMBERS OF AN I/O TRANSFER TO A FILEKGœ; STRUCTURED DEVICE. IF THE RANGE OF BLOCKS IS NOT LEGAL, THEN $IODON2B�; IS ENTERED WITH A FINAL STATUS OF "IE.BLK" AND A RETURN TO THEDž; DRIVER'S INITIATOR ENTRY POINT IS EXECUTED. ELSE A RETURN TO THEŸ; DRIVER IS EXECUTED.$ ;-F¡; $BLKC2 RETURNS TO $QOPDN IN $DRQRQ IF THERE IS AN ERROR INSTEAD OF>¢; THE DRIVER'S INITIATOR ENTRY POINT. THIS ALLOWS THE QUEUE"£; OPTIMIZATION CODE TO USE BLKCK¤;S ¥; INPUTS: ¦;I§; R1=ADDRESS OF I/O PACKET.K¨; R5=ADDRESS OF THE UCB.©;F ª; OUTPUTS:«;DB¬; IF THE CHECK FAILS, THEN $IODON IS ENTERED WITH A FINAL STATUSB­; OF "IE.BLK" AND A RETURN TO THE DRIVER'S INITIATOR ENTRY POINT®; IS EXECUTED.¯;ID°; IF THE CHECK SUCCEEDS, THEN THE FOLLOWING REGISTERS ARE RETURNED)±; R0=LOW PART OF LOGICAL BLOCK NUMBER.H1²; R1=POINTS TO I.PRM+12 (LOW PART OF USER LBN)T*³; R2=HIGH PART OF LOGICAL BLOCK NUMBER.´; R3=ADDRESS OF I/O PACKET.µ;- ¶ · .ENABL LSBD¸4¹$BLKC2::MOV #1,-(SP) ;FLAG THIS AS THE BLKC2 ENTRYº BR 4$ ;CONTINUE 1»$BLKCK::CLR -(SP) ;FLAG THIS AS A NORMAL ENTRYI,¼4$: MOV R1,R3 ;SAVE ADDRESS OF I/O PACKET0½ ADD #I.PRM+11,R1 ;POINT PAST HIGH PART OF LBN!¾ CLRB (R1)+ ;CLEAR EXCESS BYTET&¿ BR BLKC3 ;SKIP THE ALTERNATE ENTRY1À$BLKC1::CLR -(SP) ;FLAG THIS AS A NORMAL ENTRYR*ÁBLKC3: MOV (R1),R0 ;GET LOW PART OF LBN% MOV -(R1),R2 ;GET HIGH PART OF LBNM9à MOV I.PRM+4(R3),-(SP) ;GET NUMBER OF BYTES TO TRANSFER%Ä ADD #777,(SP) ;ROUND TO NEXT BLOCK)5Å ROR (SP) ;CALCULATE NUMBER OF BLOCKS IN HIGH BYTE Æ CLRB (SP) ;CLEAR EXCESS BYTE4Ç SWAB (SP) ;CALCULATE NUMBER OF BLOCK IN TRANSFER3È ADD (SP)+,R0 ;CALCULATE HIGHEST BLOCK NUMBER + 1L É ADCB R2 ;)'Ê BCS 20$ ;IF CS ILLEGAL BLOCK NUMBERP-Ë CMPB R2,U.CW2(R5) ;HIGH PART OF LBN LEGAL?GÌ BHI 20$ ;IF HI NORÍ BLO 10$ ;IF LO YES+Î CMP R0,U.CW3(R5) ;LOW PART OF LBN LEGAL?GÏ BHI 20$ ;IF HI NOI.Ð10$: MOV (R1)+,R2 ;RETRIEVE HIGH PART OF LBN)Ñ MOV (R1),R0 ;RETRIEVE LOW PART OF LBNÒ TST (SP)+ ;CLEAN THE STACK Ó RETURN ;H&Ô20$: TST (SP)+ ;TEST THE ENTRY FLAG-Õ BEQ 30$ ;RETURN TO THE DRIVER'S INITIATORR/Ö TST (SP)+ ;REMOVE DRIVERS EXTRA STACK ENTRYN8× MOV #$QOPDN,(SP) ;SETUP FOR QUEUE OPTIMIZATION RETURN+Ø MOV #IE.BLK&377,R0 ;SET00uÂu·utöt÷tø tþfDATA FINAL I/O STATUSF'Ù CALLR $IOFIN ;AND FINISH UP THE I/OB.Ú30$: MOV (R5),R0 ;GET ADDRESS OF DEVICE DCB;Û MOV @D.DSP(R0),(SP) ;REPLACE RETURN ADDRESS TO INITIATOR +Ü MOV #IE.BLK&377,R0 ;SET FINAL I/O STATUSR$Ý JMP $IOALT ;AND COMPLETE THE I/OÞ ß .DSABL LSBàá;+?â; **-$SHFND-FIND SHADOW RECORDING PACKET ON UMB ML NODE LIST. Jã; **-$SHFN1-FIND SHADOW RECORDING PACKET ON UMB ML NODE LIST (ALT ENTRY)ä;M@å; THIS ROUTINE WILL SEARCH THE LIST WHOSE ROOT IS AT M.LHD FOR?æ; AN ML NODE THAT EITHER POINTS TO OR CONTAINS THE I/O PACKET ç; SPECIFIED AS INPUT.,è;G é; INPUTS: ê;E.ë; R3=I/O PACKET ADDRESS FOR WHICH TO SEARCH.ì; R5=UCB ADDRESS.í;# î; OUTPUTS:ï;F%ð; C=0 (SUCCESS -- FOUND I/O PACKET)Oñ;Eò; R2=OTHER I/O PACKET.ó; R4=ML NODE ADDRESS.ô;S3õ; C=1 (FAILURE -- NO PACKET OR DISK NOT SHADOWED)$ö;-÷; R2,R4 DESTROYED.Aø;O"ù; ALL OTHER REGISTERS PRESERVED.ú;-ûü Iý .IF DF S$$HDWþ ÿ .ENABL LSBT@$SHFND::BIT #DV.MSD,U.CW1(R5) ;IS THIS A MASS STORAGE DEVICE?1 BEQ 30$ ;IF EQ NO -- CAN'T SHADOW THIS DEVICEU8$SHFN1::BIT #DV.SQD,U.CW1(R5) ;COULD IT BE A MAGTAPE?& BNE 30$ ;IF NE YES -- CAN'T SHADOW ;A; THE ABOVE STATEMENTS DEFINE THOSE DEVICES WHICH HAVE THE CELLT>; U.UMB IN THEIR UCB'S. NOW SEE IF U.UMB IS NON-ZERO, WHICH2; MEANS THE DEVICE IS CURRENTLY SHADOW RECORDED. ;  $  MOV U.UMB(R5),R4 ;GET UMB ADDRESS1  BEQ 30$ ;IF EQ NO UMB, THEREFORE NOT SHADOWED ;:E; SHADOW RECORDING IS ENABLED ON THIS DISK. NOW SEE IF THE PACKET F; SPECIFIED IS FROM THE REPLACEMENT CONTROL TASK AND IF IT IS, SKIP ; OVER IT.;?5 CMP $RCTPT,I.TCB(R3) ;IS THIS I/O PACKET FOR RCT?H BEQ 30$ ;IF EQ YES, EXIT; K; THE SPECIFIED PACKET IS NOT FROM THE REPLACEMENT CONTROL TASK. NOW SEE ,7; IF THE PACKET SPECIFIED IS IN THE LIST OFF THE UMB..;3 ADD #M.LHD+ML.PKT,R4 ;START SCAN AT PROPER PLACE  Q110$: MOV ML.LNK-ML.PKT(R4),R4 ;GET NEXT ML NODED BEQ 30$ ;IF EQ NONE LEFT0  MOV ML.PRI(R4),R2 ;GET PRIMARY PACKET ADDRESS(! CMP R2,R3 ;IS THIS THE INPUT PACKET?" BEQ 20$ ;IF EQ YES4# ADD #ML.PKT,R4 ;POINT TO SECONDARY PACKET IN NODE,$ CMP R4,R3 ;IS OURS THE SECONDARY PACKET?,% BNE 10$ ;IF NE NO -- GO OFF TO TRY AGAIN7& SUB #ML.PKT,R4 ;MOVE BACK TO MAKE R4=ADDRESS ML NODEE ' BR 25$ *(20$: MOV R4,R2 ;COPY I/O PACKET ADDRESS,) ADD #ML.PKT,R2 ;POINT TO SECONDARY PACKET*25$: CLC ;SHOW SUCCESS + RETURNR,30$: SEC ;SHOW FAILURE - RETURNQ . .DSABL LSBM/ .0;+81; **-$DLNK-DELINK AN ML NODE FROM THE LIST IN THE UMB.2;P@3; THIS ROUTINE WILL DELINK THE SPECIFIED ML NODE FROM THE LIST%4; OF ML NODES IN THE SPECIFIED UMB.I5;S 6; INPUTS:Y7;E8; R3=I/O PACKET ADDRESS.9; R4=ML NODE.A:; ;; OUTPUTS:<;V$=; NODE SPECIFED IN R4 IS DELINKED.>;5?; REGISTERS R2,R3 DESTROYED.@;-A3B$DLNK:: MOV I.UCB(R3),R3 ;GET UCB ADDRESS FOR UMB*C MOV R3,-(SP) ;SAVE UCB ADDRESS ON STACK-D MOV U.UMB(R3),R3 ;GET UMB ADDRESS FROM UCBM#E ADD #M.LHD,R3 ;POINT TO LISTHEADM!F10$: MOV R3,R2 ;SAVE LAST NODEG MOV (R3),R3 ;GET NEXT NODEH BNE 20$ ;IF NE THERE IS ONEI(I BPT ;DEBUGGING BPT -- CAN'T DELINK J ;NODE NOT FOUND#K20$: CMP R3,R4 ;IS THIS THE ONE?4"L BNE 10$ ;IF NE NO -- TRY AGAIN!M MOV (R3),(R2) ;DELINK THE NODEE%N BNE 30$ ;IF EQ LIST NOT YET EMPTY.O -P;DQ; THE LIST IS EMPTY. SEE IF WE ARE SUPPOSED TO DEALLOCATE THE UMB.R; S D%T MOV (SP),R3 ;GET UCB ADDRESS BACKT$U MOV U.UMB(R3),R2 ;GET UMB ADDRESS9V BIT #MS.MDA,M.STS(R2) ;IS UMB MARKED FOR DEALLOCATION?!W BEQ 30$ ;IF EQ NO -- EXIT NOWBX $Y; EZ; UMB IS MARKED FOR DEALLOCATION. WE WILL NOW RELEASE THE STORAGE, .[; AND REMOVE THE TWO POINTERS FROM THE UCBS.\;B] $%^ MOV M.UCBS(R2),R3 ;GET PRIMARY UCBR#_ CLR U.UMB(R3) ;CLEAR PRIMARY UCB )` MOV M.UCBS+2(R2),R3 ;GET SECONDARY UCB %a CLR U.UMB(R3) ;CLEAR SECONDARY UCBOb MOV R0,-(SP) ;SAVE STATUSc MOV R1,-(SP) ;SAVE R1d00uÊu^ut´cÚµcÛ¶c�·c›’ De;B8f; WE MUST DELINK THE UMB FROM THE SYSTEM LIST OF UMB'Sg;Sh ;$i MOV #$SHUMB,R0 ;GET START OF LIST/j25$: MOV R0,R1 ;MAKE CURRENT THE NEW OLD PTRM$k MOV (R1),R0 ;GET NEW CURRENT PTRl Rm En .IF DF R$$DERo "p BNE 27$ ;IF NE NOT END OF LIST%q BPT ;OOPPS -- CNT'T FIND IN LISTEr27$: ;REFERENCE LABELs ;t .ENDCu Cv  w CMP R0,R2 ;IS THIS THE NODE?x BNE 25$ ;IF NE NO)+y MOV (R2),(R1) ;DELINK NODE FROM UMB LIST *z MOV #M.LGH,R1 ;SET LENGTH TO DEALLOCATE!{ MOV R2,R0 ;SET ADDRESS OF UMBH| CALL $DEACB ;DEALLOCATE UMB;} MOV (SP)+,R1 ;RESTORE R1T~ MOV (SP)+,R0 ;RESTORE R0M/30$: TST (SP)+ ;CLEAN UCB ADDRESS FROM STACKT € RETURNT� ‚;+1ƒ; **-$SHSAV-SAVE CURRENT STATUS IN THE ML NODE.T„;O@…; THIS ROUTINE WILL SAVE R0 AND R1 IN THE CORRECT PLACE IN THE?†; CURRENT I/O PACKET. IT WILL ALSO INCREMENT THE COUNT OF I/ON&‡; PACKETS FINISHED FOR THIS ML NODE.ˆ;) ‰; INPUTS: Š;U‹; R0=FIRST STATUS WORD.;Œ; R1=SECOND STATUS WORD.�; R3=I/O PACKET ADDRESS.Ž; R4=ML NODE ADDRESS.A�;T �; OUTPUTS:‘;+:’; COUNT OF FINISHED I/O PACKETS FOR THIS ML NODE IS ONE )“; GREATER. STATUS SAVED IN I/O PACKET.T”;•; ALL REGISTERS PRESERVED.–;-— A3˜$SHSAV::INCB ML.DNC(R4) ;SHOW ONE PACKET FINISHEDE™ MOV R0,I.R0(R3) ;SAVE STATUSNš MOV R1,I.R1(R3) ;SAVE STATUSW › RETURNCœ T�;+Fž; **-$CKLBN-DETERMINE IF LBN RANGE IN AN ML NODE IS BELOW THE FENCE.Ÿ;U< ; THIS ROUTINE WILL DETERMINE IF A RANGE OF LOGICAL BLOCKS:¡; SPECIFIED IN AN ML NODE IS BELOW THE FENCE IN THE UMB.¢;T £; INPUTS: ¤; ¥; R4=ML NODE ADDRESS.O¦; R5=UMB ADDRESS. §; ¨; OUTPUTS:©;V;ª; C=0 IF THE LBN RANGE IN THE ML NODE IF BELOW THE FENCE.«;-¬ S­$CKLBN::MOV R0,-(SP) ;SAVE R0K® MOV R1,-(SP) ;SAVE R1+¯ MOVB ML.LBN(R4),R0 ;GET HIGH BYTE OF LBNE,° MOV ML.PKT+I.PRM+4(R4),R1 ;GET BYTE COUNT'± ADD #777,R1 ;ROUND UP TO NEXT BLOCK ² ROR R1 ;CONVERT TO WORDS ³ CLRB R1 ;CLEAR RESIDUAL BITS.´ SWAB R1 ;SWAP NUMBER OF BLOCKS TO LOW BYTE6µ ADD ML.LBN+2(R4),R1 ;CALCALATE LAST LBN IN TRANSFER ¶ ADC R0 ;· CMPB M.LBN(R5),R0 ;OVERLAP?4¸ BNE 100$ ;IF LO CARRY IS SET, IF HI CARRY IS CLR.¹ CMP M.LBN+2(R5),R1 ;SET UP CONDITION CODES º100$: MOV (SP)+,R1 ;RESTORE R1» MOV (SP)+,R0 ;RESTORE R0 ¼ RETURN ;R½ ½ .ENDC ; DF S$$HDW ¿ KÀ;+%Á; **-$MPPKT-MAP I/O PACKET FUNCTION,Â;RPÃ; THIS ROUTINE IS CALLED TO MAP A READ/WRITE VIRTUAL FUNCTION IN AN I/O PACKETRÄ; TO A READ/WRITE LOGICAL FUNCTION. IF THE CURRENT WINDOW DOES NOT MAP THE VIRTURÅ; FUNCTION, THEN A FAILURE INDICATION IS RETURNED. ELSE IF THE WINDOW COMPLETELYQÆ; MAPS THE VIRTUAL FUNCTION, THEN THE LOGICAL BLOCK NUMBER IS STORED IN THE I/OORÇ; PACKET AND THE READ/WRITE VIRTUAL FUNCTION IS CONVERTED TO ITS LOGICAL COUNTERFÈ; PART. ELSE THE PARTIAL MAPPING RESULTS ARE RETURNED TO THE CALLER.É;T Ê; INPUTS:Ë;!Ì; R1=ADDRESS OF THE I/O PACKET.EÍ; R5=UCB ADDRESS OF DEVICE. Î;A Ï; OUTPUTS:Ð;/Ñ; C=1 IF MAPPING FAILURE.E"Ò; C=0 IF MAPPING WAS SUCCESSFUL.Ó; IF R0 EQ 0, THENA Ô; I.FCN+1(R1)=IO.WLB/IO.RLB.+Õ; I.PRM+10(R1)=HIGH PART OF MAPPED LBN.R+Ö; I.PRM+12(R1)=LOW PART OF MAPPED LBN..I ×; ELSE %Ø; R0=NUMBER OF BLOCKS NOT MAPPED. !Ù; R2=HIGH PART OF MAPPED LBN.S Ú; R3=LOW PART OF MAPPED LBN.Û;R Ü; R1 IS PRESERVED ACROSS CALL.Ý;- Þ TAß$MPPKT::MOV I.LN2(R1),R0 ; GET IMAGE OF LUT2 OR ADDRESS OF LUT2Bà BIT #1,R0 ; ADDRESS?á BNE 5$ ; IF NE NOâã .IF DF X$$HDRä*å MOV KISAR6,-(SP) ; SAVE CURRENT MAPPING%æ MOV I.TCB(R1),R2 ; GET TCB ADDRESSW4ç MOV T.PCB(R2),R2 ; GET PCB ADDRESS OF TASK REGION6è MOV P.REL(R2),KISAR6 ; ASSUME WE NEED TO MAP HEADERéê .IFTFë&ì MOV (R0),R0 ; GET CONTENTS OF LUT2íî .IFTPï%ð MOV (SP)+,KISAR6 ; RESTORE MAPPINGñò .ENDCó+ô5$: BIC #1,R0 ; CLEAR POSSIBLE INTERLOCKM!õ MOV R0,$IOTMP ; SAVE FOR LATERO)ö MOV R1,-(SP) ; SAVE I/O PACKET ADDRESS /÷ MOV I.PRM+12(00uÒu·utöt÷tø tþfDATAR1),R3 ; PICKUP LOW PART OF VBN$0ø MOV I.PRM+10(R1),R2 ; PICKUP HIGH PART OF VBN:ù MOV I.PRM+4(R1),R0 ; PICKUP LENGTH OF TRANSFER IN BYTES+ú MOV $IOTMP,R1 ; SET WINDOW BLOCK ADDRESSP)û CALL $MPVBN ;MAP VIRTUAL BLOCK NUMBERD,ü MOV (SP)+,R1 ;RETRIEVE I/O PACKET ADDRESS"ý BCS 20$ ;IF CS MAPPING FAILURE&þ TST R0 ;REQUEST COMPLETELY MAPPED?ÿ BNE 20$ ;IF NE NOI- MOVB R2,I.PRM+10(R1) ;SET HIGH PART OF LBN,+ MOV R3,I.PRM+12(R1) ;SET LOW PART OF LBNA) MOV #IO.RLB,-(SP) ;ASSUME READ REQUEST,9 CMPB #IO.WVB/256.,I.FCN+1(R1) ;WRITE VIRTUAL FUNCTION?U BNE 10$ ;IF NE NOM' MOV #IO.WLC,(SP) ;ASSUME WRITE CHECKS; ASSUME WI.WCK,100000) TST @$IOTMP ;DATA CHECKING REQUESTED?M BMI 10$ ;IF MI YES/  CLRB (SP) ;DEMOTE TO WRITE LOGICAL (IO.WLB)D1 10$: MOV (SP)+,I.FCN(R1) ;SET NEW FUNCTION CODE (  MOV R1,R3 ;SAVE I/O PACKET ADDRESS (  MOV I.PRM(R3),R1 ;GET RELOCATION BIAS/  MOV I.PRM+2(R3),R2 ;GET DISPLACEMENT ADDRESS / CALL $MPPHY ;MAP TO 18 BIT PHYSICAL ADDRESSE8 MOV R1,I.PRM(R3) ;INSERT 18 BIT PHYSICAL ADDRESS BACK& MOV R2,I.PRM+2(R3) ;INTO I/O PACKET) MOV R3,R1 ;RESTORE I/O PACKET ADDRESSU" CLC ;MAKE SURE CARRY IS CLEAR20$: RETURN ; ;+&; **-$MPVBN-MAP VIRTUAL BLOCK NUMBER;EQ; THIS ROUTINE IS CALLED TO MAP A VIRTUAL BLOCK NUMBER (VBN) TO A LOGICAL BLOCK3L; NUMBER (LBN) VIA A WINDOW BLOCK THAT CONTAINS A SET OF MAPPING POINTERS.;M ; INPUTS:T;L7; R0=NUMBER OF CONSECUTIVE BYTES THAT MUST BE MAPPED. #; R1=ADDRESS OF THE WINDOW BLOCK. ; R2=HIGH PART OF VBN. ; R3=LOW PART OF VBN. !; "; OUTPUTS:#;R1$; C=1 IF VBN CANNOT BE MAPPED VIA WINDOW BLOCK.S*%; C=0 IF VBN SUCCESSFULLY MAPPED TO LBN."&; PARTIAL MAPPING IS A SUCCESS."'; R0=NUMBER OF UNMAPPED BLOCKS.(; R2=HIGH PART OF LBN. ); R3=LOW PART OF LBN.*; R4 & R5 PRESERVED.+;)9,; IF DATA CACHING IS SUPPORTED, THE FOLLOWING RETRIEVAL./-; INFORMATION IS PROVIDED VIA CELLS IN SYSCM:E.;E7/; $DCCEL - CURRENT EXTENT LENGTH (IF SUCCESSFUL MAP)W.0; (0 INDICATES INFORMATION NOT AVAILABLE)-1; $DCCEB - CURRENT EXTENT BASE LBN (DITTO) /2; $DCNEL - NEXT EXTENT LENGTH (IF AVAILABLE)=-3; (0 INDICATES INFORMATION NOT AVAILABLE)I*4; $DCNEB - NEXT EXTENT BASE LBN (DITTO)24; $DCSTS - STATUS INFORMATION FROM WINDOW BLOCK5; 6;-7-8$MPVBN::SAVNR ;SAVE NONVOLATILE REGISTERSA9: : .IF DF D$$CHE ;JRK332: ;JRK332SD: MOVB W.STS(R1),$DCSTS ;GET INFORMATION FROM WINDOW BLOCK ;JRK332: ;JRK332P": .ENDC ; DF D$$CHE ;JRK332: ;JRK332$; .IF DF P$$WND<(= MOV KISAR5,R5 ;SAVE SYSTEM APR5 IN R5<> MOV W.MAP(R1),KISAR5 ;POINT APR5 TO SECONDARY POOL WINDOW? BEQ 20$ ;BRANCH ON NO MAPT*@ MOV #120000,R1 ;SET R1 TO MAP THRU APR5A*B .ENDC ;END SECONDARY POOL CONDITIONALC,D .IF DF D$$CHE ;DISK DATA CACHING SUPPORTE.F CLR $DCCEL ;ASSUME THAT THIS MAP WILL FAILGH .IFTF ;D$$CHEI4J ADD #777,R0 ;ROUND BYTES TO NEXT 256. WORD BLOCKK ROR R0 ;CONVERT TO WORDS L CLRB R0 ;CLEAR RESIDUAL BITS.M SWAB R0 ;SWAP NUMBER OF BLOCKS TO LOW BYTE2N MOVB W.VBN(R1),R4 ;GET HIGH ORDER 7 BITS OF VBN)O SUB R4,R2 ;NORMALIZE HIGH PART OF VBN-P SUB W.VBN+2(R1),R3 ;NORMALIZE LOW PART TOO Q SBC R2M&R BLO 20$ ;BRANCH ON MAPPING FAILURE/S MOVB (R1),R4 ;GET NUMBER OF ACTIVE POINTERS )T BEQ 20$ ;BRANCH IF NONE - MAP FAILURES/U ADD #W.RTRV,R1 ;POINT R1 TO MAPPING POINTERSC2V10$: SUB (R1)+,R3 ;SUBTRACT EXTENT SIZE FROM VBNW SBC R2 ;ALSO HIGH VBNR)X BLO 30$ ;BRANCH IF VBN IN THIS EXTENTS&Y CMP (R1)+,(R1)+ ;INCREMENT PAST LBN.Z SOB R4,10$ ;DECRIMENT POINTER COUNT & LOOP&[20$: SEC ;INDICATE MAPPING FAILURE)\ BR 70$ ;RETURN WITH CARRY SET - ERRORR5]30$: ADD R3,R0 ;TEST FOR ALL BLOCKS IN THIS EXTENTN1^ BGT 40$ ;BRANCH IF NOT - ONLY PARTIAL MAPPINGC%_ CLR R0 ;INDICATE COMPLETE MAPPINGN/`40$: ADD -2(R1),R3 ;R3 = OFFSET WITHIN EXTENTO*a ADC R2 ;R2 = HIGH OFFSET (SHOULD BE 0))b ADD (R1)+,R2 ;ADD THE BIGINNING00uÚu^ut´cÚµcÛ¶c�·c›’ LBN OFO,c ADD (R1)+,R3 ;THE EXTENT TO THE OFFSET TOd ADC R2 ;GET THE DESIRED LBNR;e;NOTE: AT THIS POINT CARRY IS CLEAR FOR SUCCESSFUL RETURNPfg .IFT ;D$$CHEEh0i SUB #6,R1 ;BACKTRACK TO THE BEGINNING OF RTV=j MOV (R1)+,$DCCEL ;ASSUMPTION INCORRECT, SET CURRENT LENGTH0k MOV (R1)+,$DCCEB ;SET CURRENT EXTENT BASE LBN#l MOV (R1)+,$DCCEB+2 ;(DOUBLEWORD)N/m CLR $DCNEL ;ASSUME NONEXISTENCE OF NEXT RTVN#n DEC R4 ;OUR ASSUMPTION CORRECT?U.o BEQ 50$ ;YES IF EQ; DON'T FILL IN NEXT RTV0p MOV (R1)+,$DCNEL ;ELSE SET NEXT EXTENT LENGTH-q MOV (R1)+,$DCNEB ;SET NEXT EXTENT BASE LBN #r MOV (R1)+,$DCNEB+2 ;(DOUBLEWORD)F=s;NOTE: CC BY 'CLR'S ABOVE, PRESERVED THROUGH HERE AS NEEDEDKt50$:uv .ENDC ;D$$CHEwx70$:yz{ .IF DF P$$WND|%} MOV R5,KISAR5 ;RESTORE SYSTEM APR5T~* .ENDC ;END SECONDARY POOL CONDITIONAL€�‚ RETURN ;RETURN ƒ„;+%…; **-$LCKPR-LOCK PROCESSING ROUTINEU†;UF‡; THIS ROUTINE FIRST DETERMINES IF A FILE I/O REQUEST IS TO A SHAREDDˆ; FILE. IF SO, IT DETERMINES IF THE REQUEST IS AN UNLOCK QIO OR AF‰; VIRTUAL BLOCK I/O REQUEST. IT THEN EITHER PERFORMS THE UNLOCK QIO(Š; OR THE LOCK PROCESSING RESPECTIVELY.‹;E Œ; INPUTS:�;.(Ž; R1=I/O PACKET ADDRESS OF THE REQUEST�;$ �; OUTPUTS:‘;,+’; C=0 IF NO LOCK PROCESSING WAS REQUIRED.;“;E@”; C=1 IF AN UNLOCK WAS PERFORMED OR AN ERROR CONDITION OCCURED •; DURING THE LOCK PROCESSING.–; R0=I/O STATUS—;I˜; R1 IS PRESERVED.™;-š›œ .IF DF R$$LKL�2ž$LCKPR::MOV @I.LN2(R1),R3 ;POINT TO WINDOW BLOCK"Ÿ BIC #1,R3 ;CLEAR INTERLOCK BIT2  MOV #IE.ULK&377,R0 ;SET FOR UNLOCK ERROR STATUS6¡ MOV W.LKL(R3),R2 ;POINT TO FIRST ENTRY IN LOCK LIST ¢ BEQ 50$ ;IF EQ THERE IS NONE£¤;TE¥; AT THIS POINT WE KNOW THAT BLOCK LOCKING IS ENABLED FOR THE FILE. ¦;RF§; THE TYPE OF LOCK REQUESTED IS EITHER SHARED OR EXCLUSIVE DEPENDING1¨; ON THE TYPE OF ACCESSOR AND THE I/O FUNCTION. ©;S1ª; IF REQUEST IS FROM A READER THEN I.FCN(R1) ISD#«; IO.RVB TO READ WITH SHARED LOCK).¬; IO.ULK TO UNLOCK ANY OR ALL EXISTING LOCKS:­; IO.ULK!IQ.LCK TO REQUEST A SHARED LOCK WITHOUT ANY I/O®;S5¯; IF THE REQUEST IS FROM A WRITER THEN I.FCN(R1) IST)°; IO.RVB TO READ WITH AN EXCLUSIVE LOCKT,±; IO.RVB!IQ.LCK TO READ WITH A SHARED LOCK'²; IO.WVB TO WRITE WITH EXCLUSIVE LOCK .³; IO.ULK TO UNLOCK ANY OR ALL EXISTING LOCKS9´; IO.ULK!IQ.LCK TO REQUEST A EXCLUSIVE LOCK WITHOUT I/OCµ; ¶· SAVNR ;SAVE R4 AND R55¸ MOV I.PRM+4(R1),R4 ;PICK UP BYTE COUNT FOR REQUESTR)¹ ADD #777,R4 ;ROUND TO NEXT DISK BLOCKX%º ROR R4 ;CONVERT TO SIZE IN BLOCKSE » CLRB R4 ;K ¼ SWAB R4 ;O<½ CMPB I.FCN+1(R1),#IO.ULK/256. ;IS THIS AN UNLOCK REQUEST?¾ BNE 100$ ;IF NE NO¿; ASSUME IQ.LCK,200,À TSTB I.FCN(R1) ;LOCK WITHOUT I/O REQUEST?Á BPL 5$ ;IF PL NO! CALL 100$ ;DO LOCK PROCESSINGO4à DEC @I.PRM+16(R1) ;UNBUSY LOCK BLOCK SINCE NO I/OÄ BR 50$ ;JOIN COMMON CODEÅ5$: ;REFERENCE LABEL;ÆÇ;NÈ; UNLOCK PROCESSING)É;PIÊ; THIS SECTION OF THE ROUTINE PERFORMS THE UNLOCK PROCESSING. RELEVANT(Ë; REGISTER CONTENTS AT THIS POINT ARE:Ì; Í; R0=UNLOCK ERROR STATUSÎ; R1=I/O PACKET ADDRESS.7Ï; R2=ADDRESS OF THE FIRST LOCK BLOCK IN THE LOCK LIST Ð; R3=POINTER TO CURRENT WINDOW+Ñ; R4=BYTE COUNT OF CURRENT UNLOCK REQUESTFÒ;OÓ:Ô MOV I.PRM+12(R1),R5 ;CREATE BLOCK NUMBER SPECIFIED FLAGÕ BISB I.PRM+10(R1),R5 ;.Ö10$: TSTB L.CNT(R2) ;THIS LOCK BLOCK IN USE?× BEQ 40$ ;IF EQ NO #Ø TST R5 ;BLOCK NUMBER SPECIFIED?CÙ BEQ 20$ ;IF EQ NOF)Ú CALL 180$ ;EXACT VBN AND COUNT MATCH? Û BNE 40$ ;IF NE NOI$Ü20$: CMP L.WI1(R2),R3 ;SAME OWNER?Ý BNE 40$ ;IF NE NOC"Þ CLRB L.CNT(R2) ;UNLOCK THE LOCK0ß MOV #IS.SUC&377,R0 ;SET FOR SUCCESSFUL RETURN2à TST R5 ;WAS THIS FOR AN EXPLICIT BLOCK NUMBER?á BNE 50$ ;IF NE YES-â40$: MOV (R2),R2 ;POINT TO NEXT LOCK BLOCKCã BNE 10$ ;IF NE THERE IS ONERäå;0æ; NO LOCK LIST EXISTSOç;OEè; IF THE FUNCTION IS NOT AN UNLOCK FUNCTION, A SIMPL00uâu·utöt÷tø tþfDATAE RETURN OCCURSCFé; WITH CARRY CLEAR. AN UNLOCK IN THIS CASE IS AN ERROR. (NOTE THAT3ê; ALL UNLOCK REQUESTS FALL THROUGH HERE AS WELL.)Wë;ì=í50$: CMPB I.FCN+1(R1),#+1 ;SET CARRY IF UNLOCK# î RETURN ;Sïð;Cñ; LOCK PROCESSINGTò;;Hó; THIS ROUTINE CHECKS FOR ATTEMPTED LOCK OVERLAPS, ATTEMPTS TO SET THEEô; NEW LOCK, AND PERFORMS THE IMPLIED UNLOCK. IF A NEW LOCK REQUESTJõ; FOR AN EXPLICIT UNLOCKER IS DETECTED WHICH EXACTLY MATCHES AN EXISTINGIö; LOCK FOR THAT WINDOW IN BOTH STARTING VBN AND SIZE, THE LOCK BLOCK ISHA÷; SIMPLY REUSED. RELEVANT REGISTER CONTENTS AT THIS POINT ARE:Uø;Rù; R1=I/O PACKET ADDRESS0/ú; R2=ADDRESS OF FIRST LOCK BLOCK IN LOCK LISTFû; R3=ADDRESS OF FILE WINDOW&ü; R4=BLOCK COUNT FOR CURRENT REQUESTý;Iþ;E'ÿ; THE FOLLOWING CASES ARE CONSIDERED: ;TB; 1. IF THE REQUEST IS FOR A WINDOW WITH IMPLICIT (NOT EXPLICIT,A; WI.EXL) UNLOCKING AND THERE EXISTS A CURRENT LOCK FOR THATTA; WINDOW WITH I/O STILL IN PROGRESS THEN RETURN A LOCK ERROR ; (IE.LCK).;H>; 2. IF THE REQUEST IS AN EXACT MATCH FOR A LOCK WHICH IS AN=; EXACT MATCH OF WINDOW (OWNER), LBN, AND SIZE AND WHICH C; HAS I/O STILL IN PROGRESS THEN RETURN A LOCK ERROR (IE.LCK).K ;TA ; 3. IF THE REQUEST IS FROM A WINDOW WITH ONLY READ ACCESS OR AD? ; READ REQUEST REQUESTING ONLY SHARED ACCESS FROM A WRITER ? ; ATTEMPT TO GRANT A SHARED LOCK. IF THERE IS NO EXISTINGNA ; LOCK WITH OVERLAP THEN GRANT THE SHARED LOCK. IN THE CASEU%; OF A CONFLICT SEE TABLE BELOW.H; A; 4. IF THE REQUEST IS FROM A WINDOW WITH WRITE ACCESS AND IS AE?; WRITE OR A READ WITHOUT A SHARED LOCK REQUEST ATTEMPT TOSB; GRANT AN EXCLUSIVE LOCK. IF THERE IS NO EXISTING LOCK WITHE; OVERLAP THEN GRANT AN EXCLUSIVE LOCK. IN THE CASE OF CONFLICT ; SEE TABLE BELOW.O;H.; 5. DECISION TABLE FOR RESOLVING CONFLICTS:; ; I/O REQUEST ; LOCK SHARED EXCLUSIVE;L0; EXACT MATCH GRANT SHARED GRANTED EXCLUSIVE; IF NO OTHER CONFLICTW+; (REUSE LOCK BLOCK) (REUSE LOCK BLOCK)D;T/; CONFLICT SHARED GRANT SHARED REJECT IE.LCKW ;T3!; CONFLICT EXCLUSIVE REJECT IE.LCK REJECT IE.LCKX";V#'$100$: CLR R5 ;INIT FREE NODE POINTER0% MOV #IE.LCK&377,-(SP) ;PUSH LOCK ERROR STATUS!& CLR -(SP) ;ASSUME SHARED LOCKE2' BIT #WI.WRV,(R3) ;IS THIS REQUEST FOR A WRITER?*( BEQ 110$ ;IF EQ NO, ALWAYS SHARED LOCK9) CMPB I.FCN+1(R1),#IO.RVB/400 ; IS THIS A READ REQUEST?S-* BNE 105$ ;IF NE NO, ALWAYS EXCLUSIVE LOCKC+; ASSUME IQ.LCK,200L), TSTB I.FCN(R1) ;SHARED LOCK REQUESTED?O- BMI 110$ ;IF MI YESD/.105$: INC (SP) ;SET EXCLUSIVE LOCK REQUESTEDJ-/110$: TSTB L.CNT(R2) ;IS LOCK BLOCK IN USE?L0 BNE 120$ ;IF NE YESN$1 TST R5 ;ALREADY HAVE FREE BLOCK?02 BNE 150$ ;IF NE YES, LOOK AT NEXT LOCK BLOCK"3 BR 130$ ;ELSE CLAIM THIS BLOCK,4120$: MOV L.WI1(R2),R0 ;PICK UP OWNER WORD+5 BIC #1,R0 ;CLEAR BIT FOR NO UNLOCK FLAG/*6 CMP R0,R3 ;LOCK BELONG TO THIS WINDOW?*7 BNE 140$ ;IF NE NO, CHECK FOR OVERLAPS'8 BIT #WI.EXL,(R3) ;EXPLICIT UNLOCKER? 59 BEQ 125$ ;IF EQ NO, SAVE BLOCK FOR IMPLIED UNLOCK #: CALL 180$ ;EXACT VBN AND COUNT?; BNE 140$ ;IF NE NO-<125$: MOV L.WI1(R2),R0 ;RETRIEVE OWNER WORDN%= ROR R0 ;CAN LOCK BLOCK BE REUSED?> BCS 153$ ;IF CS NO0?130$: MOV R2,R5 ;SET TO REUSE THIS LOCK BLOCK$@ BR 150$ ;LOOK AT NEXT LOCK BLOCK>A140$: MOVB L.CNT(R2),R0 ;PICKUP LOCK BLOCK COUNT, EXCLUSIVE?B BMI 141$ ;IF MI YESO%C TST (SP) ;REQUEST EXCLUSIVE LOCK? D BEQ 150$ ;IF NE NOE BR 142$ ;DO CONFLICT CHECK%F141$: NEG R0 ;CONVERT TO MAGNITUDEBAG142$: ADD L.VB1+2(R2),R0 ;CALCULATE NUMBER OF HIGHEST BLOCK + 1B-H MOVB L.VB1(R2),-(SP) ;PUSH HIGH ORDER BYTEEI ADCB (SP) ;PROPAGATE CARRY$J CMPB I.PRM+10(R1),(SP)+ ;OVERLAP?$K BNE 145$ ;IF NE USE BRANCH BELOW L CMP I.PRM+12(R1),R0 ;OVERLAP?M145$: BHIS 150$ ;IF HIS NO+N MOV R4,R0 ;COPY SIZE OF CURRENT REQUESTU<O ADD I.PRM+12(R1),R0 ;CALCULATE NUMBER OF 00uêu^ut´cÚµcÛ¶c�·c›’HIGHEST BLOCK +10P MOVB I.PRM+10(R1),-(SP) ;PUSH HIGH ORDER BYTEQ ADCB (SP) ;PROPAGATE CARRY!R CMPB L.VB1(R2),(SP)+ ;OVERLAP?$S BNE 146$ ;IF NE USE BRANCH BELOWT CMP L.VB1+2(R2),R0 ;OVERLAP?V)U146$: BLO 153$ ;IF LO YES, (CARRY SET).V150$: MOV (R2),R2 ;POINT TO NEXT LOCK BLOCK W BNE 110$ ;IF NE THERE IS ONEXY; HZ; HACK: IN ORDER TO PHASE IN REAL READER LOCKS WHICH ARE NOT SUPPORTEDG[; BY RMS-11 V1.8, THE FOLLOWING CODE IS INCLUDED TO PREVENT THEM FROM0B\; BEING CREATED. AT SOME FUTURE TIME THIS CODE WILL BE REMOVED.];H^ _ .IF NE 1`a BIT #WI.WRV,(R3) ;READER?b BEQ 170$ ;IF EQ YESLcd .ENDCe/f MOV R5,R0 ;COPY POINTER TO SAVED LOCK BLOCKO)g BNE 160$ ;IF NE ONE WAS IN FACT SAVEDR:h MOV #IE.NOD&377,2(SP) ;ASSUME ALLOCATION FAILURE STATUS(i MOV R1,-(SP) ;SAVE I/O PACKET ADDRESS,j MOV #L.LKSZ,R1 ;PICKUP SIZE OF LOCK BLOCK$k CALL $ALOCB ;ALLOCATE LOCK BLOCK+l MOV (SP)+,R1 ;RESTORE I/O PACKET ADDRESSRm BCC 155$ ;IF CC SUCCESSRn153$: ROL (SP) ;SAVE CARRYS"o BR 170$ ;JOIN COMMON EXIT CODE>p155$: MOV @W.LKL(R3),(R0) ;POINT NEW BLOCK TO SECOND IN LIST:q MOV R0,@W.LKL(R3) ;POINT FIRST BLOCK IN LIST TO NEW ONE)r160$: TST (R0)+ ;ADVANCE TO OWNER WORD 2s MOV R0,I.PRM+16(R1) ;SAVE POINTER TO OWNER WORDt MOV R3,(R0) ;SET OWNER WORD,!u INC (R0)+ ;SET NO UNLOCK FLAGM0v MOVB I.PRM+10(R1),(R0)+ ;SET HIGH PART OF VBNw ROR (SP) ;EXCLUSIVE LOCK?x BCC 165$ ;IF CC NO!y NEG R4 ;SET FOR EXCLUSVE LOCKF&z165$: MOVB R4,(R0)+ ;SET BLOCK COUNT-{ MOV I.PRM+12(R1),(R0) ;SET LOW PART OF VBN$?| MOV #IS.SUC&377,2(SP) ;SET SUCCESS FOR LOCK WITHOUT I/O CASER*}170$: ROR (SP)+ ;SET CARRY, CLEAN STACK$~ MOV (SP)+,R0 ;PICKUP ERROR STATUS  RETURN ;€�;.8‚; ROUTINE TO CHECK FOR EXACT VBN AND BLOCK COUNT MATCHƒ;N „; INPUTS:I…;0†; R1=I/O PACKET ADDRESS‡; R2=LOCK BLOCK ADDRESSEˆ; R4=BYTE COUNT‰;R Š; OUTPUTS:‹;OŒ; ALL REGISTERS PRESERVED.�;GŽ; Z=1 IF EXACT MATCH.C�;�; Z=0 IT NO MATCH.‘;O’9“180$: CMP L.VB1+2(R2),I.PRM+12(R1) ;MATCH ON LOW ORDER?V” BNE 190$ ;IF NE NO4• CMPB L.VB1(R2),I.PRM+10(R1) ;MATCH ON HIGH ORDER?– BNE 190$ ;IF NE NO— TST R4 ;COUNT SPECIFIED?˜ BEQ 190$ ;IF EQ NO8™ MOVB L.CNT(R2),-(SP) ;GET LOCK BLOCK COUNT, NEGATIVE?š BPL 185$ ;IF PL NO › NEGB (SP) ;COMPUTE MAGNITUDE3œ185$: CMPB (SP)+,R4 ;CLEAN STACK, MATCH ON COUNT?�190$: RETURN ;žŸ .ENDC ¡¢;+7£; **-$RQCNC-REQUEST CONTROLLER FOR CONTROL OPERATIONST¤;AB¥; THIS ROUTINE IS CALLED TO REQUEST CONTROL FUNCTION ACCESS TO AF¦; CONTROLLER THAT SUPPORTS OVERLAPPED CONTROL OPERATIONS. ACCESS ISH§; GRANTED TO A SPECIFIC UNIT. IF THE UNIT IS MULTI-ACCESS, CONTROLLERI¨; ASSIGNMENT IS PERFORMED FOR IT. IF THE CONTROLLER IS BUSY, THE DRIVERH©; PROCESS CONTEXT IS STORED IN THE FORK BLOCK, AND IT IS QUEUED ON THEGª; CONTROLLER REQUEST QUEUE FOR THAT CONTROLLER. IF THE DRIVER IS NOTG«; BUSY, A $CFORK IS PERFORMED TO ENSURE EXECUTION ON THE CORRECT CPU,A+¬; AND A RETURN TO THE CALLER IS EXECUTED.O­;C ®; INPUTS:O¯;°; R4=SCB ADDRESS.P&±; R5=UCB ADDRESS OF REQUESTING UNIT.!²; 0(SP)=DRIVERS RETURN ADDRESS.N+³; 2(SP)=RETURN ADDRESS OF DRIVERS CALLER.´;S µ; OUTPUTS:¶;E·; R4=SCB ADDRESS.R&¸; R5=UCB ADDRESS OF REQUESTING UNIT.¹;Xº; S.FRK+2 IS ALWAYS NON-ZERO.D»;SC¼; ACCESS IS GRANTED TO THE CONTROLLER FOR CONTROL FUNCTIONS ONLY. ½;R(¾; R4 AND R5 ARE PRESERVED ACROSS CALL.¿;-À Á .ENABL LSBNÂà .IF DF O$$LAPÄ=Å$RQCNC::MOV R4,R1 ;GET SCB ADDRESS IN PROPER REG FOR QUEUE$Æ MOV S.KRB(R4),R0 ;GET KRB ADDRESS/Ç INC S.FRK+2(R4) ;MAKE SURE THAT S.FRK+2 <> 0N"È CMP R5,K.OWN(R0) ;ARE WE OWNER?!É BEQ 180$ ;IF EQ YES -- RETURNPÊËÌ .IF DF M$$ACDÍ Î CALL ASKRBAÏÐ .ENDCÑÒ<Ó BIT #KS.SDX,K.STS(R0) ;SEEKS DURING DATA XFERS SUPPORTED?Ô BEQ 100$ ;IF EQ NOÕÖ× .IF DF M$$PROØ7Ù CALLR $CFORK ;ASSURE EXECUTION ON CORRECT PROCESSOR-ÚÛ .IFFBÜ1Ý RETURN ;RET00uòu·utöt÷tø tþfDATAURN TO DRIVER WITH ACCESS GRANTED;Þß .ENDCàá0â100$: MOV (SP)+,R4 ;SAVE DRIVER RETURN ADDRESS$ã TST K.OWN(R0) ;IS CONTROLLER BUSYäåæ .IF DF M$$PROçè BNE 150$ ;IF NE YES3é CALL $CFORK ;NOT BUSY - TRANSFER TO CORRECT CPU )ê MOV U.SCB(R5),R1 ;GET BACK SCB ADDRESS)ë MOV S.KRB(R1),R0 ;GET BACK KRB ADDRESSG!ì TST K.OWN(R0) ;IS IT BUSY NOW? íî .ENDCïð/ñ BEQ 300$ ;IF EQ NO -- GRAB IT FOR OURSELVESU8ò150$: MOV #$QINSB,-(SP) ;SAVE QUEUEING ROUTINE ADDRESS)ó BR 350$ ;SAVE DRIVER CONTEXT AND EXITôõö .ENDC ; DF O$$LAP÷ø;+2ù; **-$RQCND-REQUEXT CONTROLLER FOR DATA TRANSFERú;EFû; THIS ROUTINE IS CALLED FOR ACCESS TO A CONTROLLER FOR AN OPERATIONGü; THAT WILL BUSY OUT THE CONTROLLER, USUALLY A DATA TRANSFER. IF THECHý; UNIT IS MULTI-ACCESS, CONTROLLER ASSIGNMENT IS PERFORMED. $CFORK ISCþ; USED IF NECESSARY TO ENSURE EXECUTION ON THE CORRECT PROCESSOR. ÿ;IA; NOTE: IF THE SCB IS ALREADY IN A CONTROLLER REQUEST QUEUE, WEA<; SKIP THE CALL AND RETURN TO THE CALLER'S CALLER. THIS IS>; BELIEVED TO HAPPEN ONLY ON NON-DEC SUPPLIED DM: TYPE DISKS7; DURING POWERFAIL RECOVERY. NOTE THAT THIS BASICALLYC?; DISMISSES THE DRIVERS POWER RECOVERY CALL. WE HOPE THAT THEC:; DRIVER KNOWS HOW TO RECOVER WHEN ITS OTHER $RQCND CALL; COMPLETES.;R ; INPUTS:S ;O& ; R5=ADDRESS OF REQUESTING UNITS UCB ; 0(SP)=DRIVER RETURN ADDRESST* ; 2(SP)=RETURN ADDRESS OF DRIVERS CALLER ;D ; OUTPUTS:;E; R4=SCB ADDRESS. &; R5=UCB ADDRESS OF REQUESTING UNIT.;E; S.FRK+2 IS ALWAYS NON-ZERO.N; ;N.; DRIVER HAS EXCLUSIVE ACCESS TO CONTROLLER.;C;-+$RQCND::MOV U.SCB(R5),R1 ;GET SCB ADDRESSV .IF DF S2.NRD7 BIT #S2.KRQ,S.ST2(R1) ;KRB ALREADY IN REQUEST QUEUE?S) BNE 370$ ;IF NE YES, IGNORE THIS CALL ! .ENDC ; DF S2.NRD"$# MOV S.KRB(R1),R0 ;GET KRB ADDRESS:$ CMP R5,K.OWN(R0) ;IS REQUESTING UNIT ALREADY THE OWNER?+% BNE 190$ ;IF NE NO, MAKE HIM THE OWNERA'& MOV R1,R4 ;PUT SCB IN CORRECT PLACEG6'180$: INC S.FRK+2(R4) ;ALWAYS EXIT WITH S.FRK+2 <> 0 ( RETURNV)*190$: ;REFERENCE LABELL+,- .IF DF M$$ACD. / CALL ASKRB,01 .ENDC2334 INCB K.IOC(R0) ;COUNT AN I/O REQUEST ON THIS KRBR05 MOV (SP)+,R4 ;PUT DRIVER RETURN ADDRESS IN R4%6 TST K.OWN(R0) ;IS CONTROLLER BUSY?D789 .IF DF M$$PRO:; BNE 340$ ;IF NE YESC.< CALL $CFORK ;TRANSFER TO CORRECT PROCESSOR)= MOV U.SCB(R5),R1 ;GET SCB ADDRESS BACKH)> MOV S.KRB(R1),R0 ;GET KRB ADDRESS BACK ? TST K.OWN(R0) ;IS IT BUSY@A .ENDCBCD BNE 340$ ;IF NE YESEF; G; SET OWNER AND RETURNH;I#J300$: MOV R5,K.OWN(R0) ;SET OWNER"K MOV R4,R0 ;SAVE RETURN ADDRESS/L MOV R1,R4 ;PUT SCB ADDRESS IN CORRECT PLACE 1M INC S.FRK+2(R4) ;ALWAYS EXIT WITH S.FRK+2 <> 0;&N JMP (R0) ;RETURN TO CALLING DRIVERO/P340$: MOV #$QINSF,-(SP) ;SET QUEUEING ADDRESS 6Q BIS #S2.KRQ,S.ST2(R1) ;INDICATE REQUEST IS IN QUEUERS;ECT; STORE DRIVER CONTEXT IN FORK BLOCK AND RETURN TO DRIVERS CALLER)U;IV4W350$: MOV R1,S.FRK+6(R1) ;SAVE SCB IN R4 SAVE AREA-X ADD #S.FRK+6,R1 ;POINT TO R5 SAVE AREA + 20Y MOV R5,-(R1) ;SAVE R5,Z MOV R4,-(R1) ;SAVE DRIVERS RETURN ADDRESS[ CLR -(R1) ;CLEAR LINK WORD,\ ADD #K.CRQ,R0 ;POINT TO QUEUE FOR DRIVERS1]360$: RETURN ;EXIT TO PROPER QUEUEING ROUTINEN^+_370$: TST (SP)+ ;REMOVE CALLER'S ADDRESSE&` RETURN ;RETURN TO CALLER'S CALLERab;+c; **-$RLCN-RELEASE CONTROLLER d; Ge; THIS ROUTINE WILL RELEASE THE CONTROLLER IF THE CALLER IS THE OWNER5Ff; OF THE CONTROLLER. IT WILL ALSO PLACE THE FORK BLOCK FOR THE NEXTDg; DRIVER (IF ANY) IN THE CONTROLLER WAIT QUEUE INTO THE FORK QUEUEHh; AFTER MAKING THAT DRIVER THE OWNER OF THE CONTROLLER. IF THE DRIVER+i; IS NOT THE OWNER, A RETURN IS EXECUTED.Nj;X k; INPUTS:Ql;Nm; R4=SCB ADDRESS.$8n; R5=UCB ADDRESS OF UNIT THAT IS RELEASING CONTROLLER.o;C p; OUTPUTS:q;r; CONTROLLER IS RELEASED.Ns;E+t; ALL REGISTERS EXEC00uúu^ut´cÚµcÛ¶c�·c›’EPT R3 ARE PRESERVED.Ou;-v+w$RLCN:: MOV S.KRB(R4),R3 ;GET KRB ADDRESSL,x CMP R5,K.OWN(R3) ;IS RELEASING UNIT OWNERy BNE 460$ ;IF NE NO, RETURN/z CLR K.OWN(R3) ;CLEAR OUT OWNER OF CONTROLLER 0{ ADD #K.CRQ,R3 ;POINT TO CONTROLLER RQST QUEUE7| DECB K.IOC-K.CRQ(R3) ;COUNT ONE LESS I/O ON THIS KRBC} MOV (R3),R4 ;GET NEXT EXTRY2~ BEQ 450$ ;IF EQ NO DRIVER IS WAITING -- RETURN' MOV (R4),(R3) ;SET NEW FIRST IN LISTP*€ BNE 400$ ;IF NE OLD LAST IS STILL LAST+� MOV R3,2(R3) ;SET NEW LAST -- EMPTY LISTDB‚400$: MOV 4(R4),K.OWN-K.CRQ(R3) ;SET NEW OWNER WITH R5 FROM FORK"ƒ CLR (R4) ;CLEAR FORK LINK WORD2„ CALL $QFORK ;INSERT FORK BLOCK INTO FORK QUEUE+…450$: MOV U.SCB(R5),R4 ;REPLACE SCB IN R4,-† BIC #S2.KRQ,S.ST2(R4) ;SCB IS NOT IN QUEUEO‡460$: RETURN ;ˆ ‰ .DSABL LSB Š‹;M.Œ; **-ASKRB-ASSIGN KRB FOR DUAL-ACCESS DEVICE�;DFŽ; THIS ROUTINE WILL PROPERLY ASSIGN THE KRB FOR A DUAL-ACCESS DEVICE$�; THAT USES KS.UOP SYNCRONIZATION.�; ‘; INPUTS: ’;N&“; R0=CURRENTLY ASSIGNED KRB ADDRESS.*”; R1=SCB ADDRESS FOR DUAL-ACCESS DEVICE.•;K –; OUTPUTS:—;A%˜; R0=KRB ADDRESS FOR KRB OF CHOICE.R*™; R1=SCB ADDRESS FOR DUAL-ACCESS DEVICE.š;5%›; REGISTERS R2 AND R3 ARE DESTROYEDQœ;2�žŸ .IF DF M$$ACD /¡ASKRB: MOV #S2.MAD!S2.LDS,R2 ;GET STATUS BITS2¢ BIC S.ST2(R1),R2 ;ARE ALL OF THE ABOVE BITS SET!£ BNE 30$ ;IF NE NO -- EXIT NOWG1¤ BITB #S3.DRL,S.ST3(R1) ;IS THE DRIVE RELEASED?S!¥ BEQ 30$ ;IF NE NO -- EXIT NOWU¦§;N"¨; GET PORT A KRB -- CHECK IT OUT©;ª+« MOV S.KTB(R1),R2 ;GET PORT A KRB ADDRESS*¬ BIC #KP.OFL,R2 ;CLEAR OUT LOW ORDER BIT-­ MOV S.KTB+2(R1),R3 ;GET PORT B KRB ADDRESSE*® BIC #KP.OFL,R3 ;CLEAR OUT LOW ORDER BIT¯°;E&±; GET PORT A -- CHECK IT FOR OFFLINE²;R³,´ BIT #KS.OFL,K.STS(R2) ;IS THE KRB OFFLINE%µ BNE 10$ ;IF NE YES, SELECT PORT BS¶·;B"¸; GET PORT B KRB -- CHECK IT OUT¹;Sº(» BIT #KS.OFL,K.STS(R3) ;IS KRB ONLINE?$¼ BNE 20$ ;IF NE NO, SELECT PORT A½¾;E<¿; BOTH KRB'S ARE ONLINE -- NOW CHECK FOR PORT RELATIVE I/OÀ;RÁ+ MOV S.PKT(R1),R0 ;GET I/O PACKET ADDRESSW4à MOV I.FCN(R0),-(SP) ;GET I/O FUNCTION FROM PACKET3Ä BIC #7,(SP) ;REMOVE QUALIFIER BITS (SEE $VOLVD),Å CMP #IO.STC,(SP)+ ;IS IT IO.STC FUNCTION?Æ BEQ 40$ ;IF EQ YESÇÈ;)@É; BOTH KRB'S ARE ONLINE, IT IS NOT PORT RELATIVE I/O FUNCTION.9Ê; NOW CHECK FOR THE PDF AND PORT SPECIFIC OFFLINE BITS.#Ë;LÌ9Í5$: BIT #KP.OFL,S.KTB(R1) ;IS PORT A OFL FROM THIS UNITA'Î BNE 10$ ;IF NE YES -- SELECT PORT AN8Ï BIT #KP.OFL,S.KTB+2(R1) ;IS PORT B OFL FROM THIS UNIT'Ð BNE 20$ ;IF NE YES -- SELECT PORT BNÑÒ;)HÓ; NOW THE PDF BITS (WHICH, FOR NON PORT-SPECIFIC I/O, ARE EQU TO OFL).Ô;LÕ,Ö BIT #KS.PDF,K.STS(R2) ;IS PORT A PDF SET?'× BNE 10$ ;IF NE YES -- SELECT PORT BO,Ø BIT #KS.PDF,K.STS(R3) ;IS PORT B PDF SET?'Ù BNE 20$ ;IF NE YES -- SELECT PORT ANÚÛ;E@Ü; AT THIS POINT, BOTH KRB'S ARE EQUIVALENT FROM THE STANDPOINT?Ý; OF BEING EQUALLY ONLINE, AND THIS WASN'T PORT SPECIFIC I/O.NÞ;BBß; NOW WE WILL COMPARE THE KRB'S TO SEE WHICH IS BUSIER. IF THEYBà; ARE THE SAME, THEN WE WILL SEE IF ONE IS ATTACHED TO THIS CPU."á; IF IT IS, THEN WE WILL USE IT.â;.ãä CMPB K.IOC(R2),K.IOC(R3)R"å BLO 20$ ;IF LO PORT A IS FREER"æ BHI 10$ ;IF HI PORT B IS FREERçèé .IF DF M$$PROêBë BIT @$CPURM,K.URM(R2) ;CAN WE GET TO ONE EASIER THAN THE OTHER? ì BNE 20$ ;IF NE YES -- PORT Aíî .ENDCïð ñ10$: MOV R3,R2 ;SELECT PORT B(ò20$: MOV R2,S.KRB(R1) ;SET KRB ADDRESS!ó MOV R2,R0 ;SHOW KRB OF CHOICEOôõö .IF DF M$$PRO÷8ø MOV K.URM(R0),S.URM(R1) ;SET URM IN FORK BLOCK OF SCBùú .ENDCûü7ý30$: BICB #S3.DRL,S.ST3(R1) ;SHOW CONTROLLER ASSIGNEDO þ RETURNBÿ;I@; FUNCTION IS IO.STC, SEE IF PORT SPECIFICATION EXISTS. IF IT(; DOES, THEN SWITCH TO SPECIFIED PORT.;;240$: MOVB I.PRM+4(R0),R0 ;GET PORT SPECIFICATION BEQ 5$ ;IF EQ NONE EXISTSC SUB #1,R0 ;IS IT PORT AS BNE00uv·utöt÷tø tþfDATA 10$ ;IF NE NOV  BR 20$ ;IF EQ YESA   .ENDC  ;+$; **-$ECCOR-ECC CORRECTION ROUTINE;OB; THIS ROUTINE WILL TAKE THE 22 BIT REAL STARTING ADDRESS OF THEG; TRANSFER, CALCULATE WHERE THE ECC CORRECTION SHOULD TAKE PLACE, ANDOC; PERFORM THE ACTUAL XOR OPERATION TO CORRECT THE DATA IN MEMORY.T;X ; INPUTS:;O ; R0=BYTES ACTUALLY TRANSFERED2; R1=ECC ERROR POSITION (FROM HARDWARE REGISTER)<; R3=ECC ERROR CORRECTION PATTERN (FROM HARDWARE REGISTER); R4=SCB ADDRESS; R5=UCB ADDRESS; ; OUTPUTS:;; R2=CSR ADDRESS; R3=CONTROLLER INDEXN ;I!; R0, R4, R5 ARE PRESERVED";-#$% .IF DF S$$ECC&('$ECCOR::MOV R4,-(SP) ;SAVE SCB ADDRESS0( MOV R0,-(SP) ;SAVE NUMBER OF BYTES TRANSFERED+) CLR R0 ;CLEAR HIGH ORDER ERROR POSITION +* DEC R1 ;MAKE POSITION INTO 0-7777 RANGE+ DIV #20,R0 ;DIVIDE FOR:D!, ; R0=WORD POSITION (0-377)A- ; R1=BIT POSITION (0-17)R#. MOV R0,-(SP) ;SAVE WORD POSITIONG*/ CLR R2 ;CLEAR HIGH ORDER ERROR PATTERN30 ASHC R1,R2 ;SHIFT PATTERN INTO CORRECT POSITION 11 MOV U.BUF+2(R5),R1 ;GET LOW 16 BITS OF ADDRESSE52 MOVB U.BUF+1(R5),R0 ;GET HIGH BITS OF REAL ADDRESS )3 MOV S.KRB(R4),R4 ;RETREIVE KRB ADDRESS ;4 BIT #KS.MBC,K.STS(R4) ;IS THIS A 22-BIT MASSBUS DEVICE?R5 BNE 10$ ;IF NE YES(6 ADD K.OFF(R4),R4 ;POINT TO UMR AREA+207 MOV -(R4),R1 ;GET LOW 16 BITS OF REAL ADDRESS18 MOVB -(R4),R0 ;GET HIGH 6 BITS OF REAL ADDRESSM2910$: MOV 2(SP),R4 ;GET BYTES ACTUALLY TRANSFERED5: BIC #777,R4 ;GET NUMBER OF FULL BLOCKS TRANSFERED "; BEQ 15$ ;IF EQ THERE WERE NONE)< SUB #512.,R4 ;BACKUP TO BLOCK IN ERRORM:=15$: ADD R4,R1 ;CALCULATE STARTING ADDRESS OF BAD BLOCK> ADC R0 ;...E1? ASHC #10.,R0 ;CALCULATE DISPLACEMENT AND BIASS@ ASHC #-10.,R1 ;...E%A MOV R0,KISAR6 ;SET RELOCATION BIASF9B ADD #140000+2,R1 ;POINT TO HIGH ORDER CORRECTABLE WORDI"C MOV (SP)+,R4 ;GET WORD POSITION4D ADD R4,R1 ;ADD IN ERROR WORD POSITION OFFSET ...&E ADD R4,R1 ;... FOR BYTE ADDRESSING.F MOV (SP),R0 ;GET BYTES ACTUALLY TRANSFEREDG ASR R0 ;CONVERT TO WORDS/H BIC #^C<377>,R0 ;GET HIGHEST WORD TO CORRECTM0I BNE 17$ ;IF NE, IT'S A PARTIAL WORD TRANSFER8J MOV #377,R0 ;SET R0 EQUAL TO VERY LAST WORD IN BLOCK2K17$: CMP R4,R0 ;IS THE OFFSET WITHIN THE LIMIT?L BHI 40$ ;IF HI NOT AT ALLA(M BEQ 30$ ;IF EQ THEN ONLY ONE WORD IS0N20$: XOR R2,(R1) ;CORRECT THE HIGH ORDER WORD/O30$: XOR R3,-(R1) ;CORRECT THE LOW ORDER WORD -P40$: MOV (SP)+,R0 ;RESTORE BYTES TRANSFEREDI$Q MOV (SP)+,R4 ;RESTORE SCB ADDRESS)R MOV S.KRB(R4),R3 ;RETREIVE KRB ADDRESS%S MOV (R3),R2 ;RETREIVE CSR ADDRESS /T MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEX U RETURN ;VVWX .ENDC ; DF S$$ECCYZ[;+,\; **-$CRPAS - COMMON REGISTER PASS ROUTINE]; H^; THIS SUBROUTINE IS USED TO PASS THE CONTENTS OF THE DEVICE REGISTERSG_; BACK TO THE DIAGNOSTIC TASK. ALL REGISTERS ARE PASSED IN THE ORDER('`; IN WHICH THEY APPEAR ON THE UNIBUS.Ma;PHb; NOTE: THIS ROUTINE MAKES USE OF THE ERROR LOGGING ENTRIES S.ROFF ANDc; S.RCNT IN THE SCB.d;R e; INPUTS:f;(g; R1=I/O PACKET ADDRESSSh; R2=CSR ADDRESSi; R4=SCB ADDRESSj; k; OUTPUTS:l; m; R1=DESTROYED.Cn; R0,R2 ARE PRESERVED+o;-pqr .IF DF U$$UMDst$CRPAS::MOV R0,-(SP) ;SAVE R0T/u MOV I.PRM+14(R1),KISAR6 ;SET RELOCATION BIASG3v MOV I.PRM+16(R1),R0 ;GET REGISTER BUFFER ADDRESSR-w MOV R2,-(SP) ;PRESERVE INITIAL CSR ADDRESSP3x MOVB S.ROFF(R4),R2 ;GET OFFSET TO FIRST REGISTERK y ADD (SP),R2 ;ADD CSR ADDRESS6z MOVB S.RCNT(R4),R1 ;GET NUMBER OF REGISTERS TO XFER+{10$: MOV (R2)+,(R0)+ ;TRANSFER A REGISTERR&| SOB R1,10$ ;LOOP FOR ALL REGISTERS}~ .IF DF M$$EXT€)� MOV S.KRB(R4),R1 ;RETREIVE KRB ADDRESS4‚ BIT #KS.MBC,K.STS(R1) ;IS THIS A MASSBUS DEVICE?ƒ BEQ 20$ ;IF EQ NO,'„ ADD K.OFF(R1),R1 ;POINT TO UCB TABLEM&… MOV -(R1),R1 ;RETREIVE RHBAE OFFSET)† ADD (SP),R1 ;FORM AN I/O PAGE ADDRESSR"‡ MOV (R1)+,(R0)+ ;TRANSFER RHBAE ˆ MOV (R1),(R0) ;TRAN00u vvvt´cÚµcÛ¶c�·c›’SFER RHCS3‰Š .ENDC‹Œ(�20$: MOV (SP)+,R2 ;RESTORE CSR ADDRESSŽ MOV (SP)+,R0 ;RESTORE R02 � RETURNR�‘’ .ENDC ; DF U$$UMD“”•;+.–; **-$VOLVD-PREPROCESS VOLUME VALID FUNCTION—;S>˜; THIS ROUTINE WILL DETERMINE IF THE VOLUME VALID BIT SHOULDA™; BE SET OR CLEARED. IF THE FUNCTION IS NOT IO.STC (SET VOLUMER:š; VALID) THE VOLUME VALID BIT WILL BE TESTED TO SEE IF A$›; TRANSFER FUNCTION CAN BE ISSUED.œ;SA�; NOTE: THE IO.STC SUBFUNCTION CODE VV$CHE SHOULD BE CONSIDEREDR9ž; AN INVALID FUNCTION (AND CURRENTLY IS) IF RECEIVED BYR=Ÿ; $VOLVD. THIS SUBFUNCTION CODE IS INTERCEPTED, PROCESSED,.= ; AND TERMINATED BY THE CACHER. THESE OPERATIONS WILL ONLY =¡; REACH THE DRIVER IF DISK DATA CACHING IS NOT SUPPORTED INL=¢; THE CURRENTLY RUNNING EXECUTIVE, AND THOSE PACKETS SHOULDS%£; BE TERMINATED WITH STATUS IE.BAD.E¤;M ¥; INPUTS:I¦; §; R1=I/O PACKET ADDRESSN¨; I.PRM=ALWAYS ZERO(©; I.PRM+2=0 TO RESET VOLUME VALID BITª; 1 TO SET VOLUME VALID BITE1«; 2 TO RESET VOLUME VALID AND SPIN DRIVE DOWNE-¬; 3 TO SET VOLUME VALID AND SPIN DRIVE UPI)­; 4 FOR "DATA CACHE LOCAL" OPERATIONST:®; -1 TO SIZE THE DISK (VOLUME VALID NOT CHANGED),¯; I.PRM+4=RESERVED FOR PORT SPECIFICATION°; R5=UCB ADDRESS±;U ²; OUTPUTS:³;D1´; C=0 THEN VOLUME VALID BIT WAS SET OR CLEARED.U5µ; R0=IS.SUC&377 IF VOLUME VALID FUNCTION (IO.STC). ¶; R0=-1 IF TRANSFER FUNCTION.)·; N=1 IF TRANSFER FUNCTION (R0 TESTED)¸; ;¹; C=1 THEN THE FUNCTION (EITHER TRANSFER OR VOLUME VALID)Pº; WAS REJECTED.»; R0=I/O ERROR CODE.N¼;-½%¾ VV$SET==1 ;SET/CLEAR VOLUME VALIDO$¿ VV$UNL==2 ;LOAD/UNLOAD THE DRIVEÀ VV$SIZ==-1 ;SIZE THE DRIVE(Á VV$CHE==4 ;CAC SUBFUNCTION OF IO.STCÂ:Ã$VOLVD::MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION CODE-Ä MOV I.FCN(R1),-(SP) ;GET THE FUNCTION CODE=*Å BIC #7,(SP) ;REMOVE ANY QUALIFIER BITS,Æ CMP #IO.STC,(SP)+ ;VOLUME VALID FUNCTION?Ç BNE 30$ ;IF NE NOR*È MOV I.TCB(R1),R0 ;GET TASKS TCB ADDRESS=É BIT #T3.PRV,T.ST3(R0) ;IS THE REQUESTING TASK PRIVILEGED?=Ê BNE 99$ ;IF NE YES2Ë BITB #US.FOR,U.STS(R5) ;VOLUME MOUNTED FOREIGN?"Ì BEQ 50$ ;IF EQ NO, CAN'T RESET9Í99$: BITB #US.VV,U.STS(R5) ;IS VOLUME VALID ALREADY SET Î(Ï BNE 1$ ;IF NE YES, SKIP MOUNTED TESTÐÑ9Ò CMP $VERTK,R0 ;REQUESTING TASK THE VERIFICATION TASK ?C-Ó BEQ 1$ ;IF EQ, YES - ALLOW VV TO BE RESETSÔÕ:Ö BITB #US.MNT,U.STS(R5) ;IS THE DEVICE ALREADY MOUNTED?× BEQ 50$ ;IF EQ YES, ERRORS5Ø1$: MOV I.PRM+2(R1),R0 ;GET PARAMETER SPECIFICATIONS*Ù BPL 2$ ;IF PL SET/CLEAR OR LOAD/UNLOAD?Ú MOV I.PRM+14(R1),I.PRM+16(R1) ;MOVE REGISTER BUFFER ADDRESS$=Û MOV I.PRM+12(R1),I.PRM+14(R1) ;TO PROPER PLACE FOR $CRPASMÜ BR 15$ ;SHOW SUCCESS'Ý2$: BIT #VV$SET,R0 ;SET VOLUME VALID?Þ BNE 10$ ;IF NE YES.ß BIT #^C,R0 ;BAD PARAMETERS?à BNE 5$ ;IF NE YESL+á BICB #US.VV,U.STS(R5);CLEAR VOLUME VALID. â BR 15$ ;/ã5$: MOV #IE.BAD&377,R0 ;ASSUME BAD PARAMETERSSä BR 40$ ;EXIT-å10$: BISB #US.VV,U.STS(R5);SET VOLUME VALID3æ15$: MOV #IS.SUC&377,R0 ;SHOW SUCCESSFUL FUNCTIONP ç20$: CLC ;SHOW GOOD FUNCTION è RETURN ;R1é30$: MOV #-1,R0 ;ASSUME GOOD TRANSFER FUNCTIONP3ê BITB #US.VV,U.STS(R5);HAS VOLUME VALID BEEN SET? ë BNE 20$ ;IF NE YES1ì MOV #IE.DNR&377,R0 ;ELSE FORCE DRIVE NOT READYVí40$: SEC ;SHOW FAILURE î RETURN ;N.ï50$: MOV #IE.PRI&377,R0 ;PRIVILEGE VIOLATION ð BR 40$ ;ñò .ENDOV #IE.BAD&377,R0 ;ASSUME BAD PARAMETERSSä BR 40$ ; .TITLE ERROR  .IDENT /11.05/A;T7; COPYRIGHT (C) 1987 BY DIGITAL EQUIPMENT CORPORATIONC; ALL RIGHTS RESERVED.;D>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ;$ ; P. J. BEZEREDI 08-JAN-82 ; ;S-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:C;; S. C. ADAMS ; J. R. KAUFFMAN; J. M. LAWLER;I-; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:F;E"; B. S. MCCARTHY 12-00vv·utöt÷tø tþfDATADEC-86 11.04; *; BM377 -- MOVE ERROR LOGGING TO DR311M;7"; B. S. MCCARTHY 12-DEC-86 11.05;L.; BM385 -- NOW MOVE ERROR LOGGING TO VEC11M;H;D ; ERROR LOGGINGY!;S"#;R$; MACRO LIBRARY CALLSE%; :& .MCALL CLKDF$,EPKDF$,F11DF$,HDRDF$,HWDDF$,PKTDF$,UCBDF$(' EPKDF$ ;DEFINE ERROR PACKET OFFSETS()*;+<+; **-$BMSET-SET THE UNIT'S ACTIVE INTERRUPT BIT IN THE SCB,; =-; THIS COROUTINE RAISES THE PROCESSOR PRIORITY TO SEVEN AND9.; SETS THE INTERRUPT ACTIVE BIT IN THE SCB, RECALLS THE </; CALLER TO START THE FUNCTION AND THEN ALLOWS INTERRUPTS.0;. 1; INPUTS: 2;53; R4=ADDRESS OF THE SCBT4;1 5; OUTPUTS:6; ,7; THE INTERRUPT ACTIVE BIT (S2.ACT) IS SET8;-9):$BMSET::MTPS #PR7 ;LOCK OUT INTERRUPTSF5; BIS #S2.ACT,S.ST2(R4) ;;;SHOW INTERRUPT IS ACTIVET$< CALL @(SP)+ ;;;RECALL THE CALLER= MTPS #0 ;;;ALLOW INTERRUPTSI>BMXIT: RETURN ;EXITH?@;+!A; **-$DTOER-LOG DEVICE TIMEOUTS 8B; **-$DVTMO-LOG DEVICE TIMEOUTS FOR OVERLAPPED DEVICESC;LCD; THIS ROUTINE IS CALLED TO LOG A DEVICE TIMEOUT ERROR CONDITION.BE; IF ENTRY IS AT $DTOER THE CONTROLLER'S INTERRUPT ENABLE BIT IS>F; RESET AND THE PROCESSOR PRIORITY IS DROPPED TO ZERO. IF A<G; DIAGNOSTIC FUNCTION WAS IN PROGRESS, NO ERROR IS LOGGED.H;2 I; INPUTS: J;R:K; R2=ADDRESS OF A BLOCK OF REGISTERS TO LOG (MUST BE THE$L; CSR ADDRESS IF KS.MBC IS SET)M; R4=SCB ADDRESSN; R5=UCB ADDRESSO;E P; OUTPUTS:Q; $R; R0=IE.DNR&377 (DEVICE NOT READY)S; R1=ADDRESS OF I/O PACKET;T; C=0 IF FUNCTION WAS NOT A USER MODE DIAGNOSTIC FUNTION.8U; THE ERROR LOG PACKET IS FILLED AND THE SCB CONTAINS8V; A POINTER TO IT. THE ERROR IN PROGRESS FLAG IS SETW; IN THE SCB.AX; C=1 IF FUNCTION WAS A USER MODE DIAGNOSTIC FUNCTION. IN THIS:Y; CASE ONLY THE INTERRUPT ENABLE BIT IS CLEARED AND THE!Z; PRIORITY IS LOWERED TO ZERO.S[;-\ ] .ENABL LSB41^$DTOER::MOV (R2),$DVSAV ;;;SAVE CONTENTS OF CSR:0_ BIC #100,(R2) ;;;DISABLE THE DEVICE INTERRUPT` MTPS #0 ;;;ALLOW INTERRUPTS a BR 5$ ;A/b$DVTMO::MOV (R2),$DVSAV ;SAVE CONTENTS OF CSRE9c5$: MOV #IE.DNR&377,R0 ;SET DEVICE NOT READY ERROR CODET1d BIC #S2.ACT,S.ST2(R4) ;SET INTERRUPT INACTIVEI:e MOV S.PKT(R4),R1 ;PICK UP THE ADDRESS OF THE I/O PACKET,f SEC ;ASSUME IT IS A DIAGNOSTIC FUNCTION8g BITB #IQ.UMD,I.FCN(R1) ;IS IT A DIAGNOSTIC FUNCTION?h BNE BMXIT ;IF NE YESijk .IF DF E$$LOGlm .IFTF ; DF E$$LOGn@o MOV #$DVTM2,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON5o CALL $MPDCV ;MAP AND CALL CODE IN THIRD ; BM377R"o ;DIRECTIVE COMMON ; BM377q RETURN ;**-1Ers;+ t; **-$DVERR-LOG A DEVICE ERROR1u; **-$DVCER-LOG A DEVICE ERROR (ALTERNATE NAME)Tv;RFw; THIS ROUTINE IS CALLED TO LOG A DEVICE ERROR. AN ERROR LOG PACKETEx; WILL BE ALLOCATED AND THE CONTEXT OF THE CURRENT TRANSFER WILL BE?Iy; SAVED. IF AN ERROR IS ALREADY IN PROGRESS FOR THIS DEVICE, THE ERRORLIz; WILL BE IGNORED. INFORMATION CONCERNING ALL ACTIVE DEVICES WILL ALSO {; BE SAVED.M|;DH}; THE ERROR CODE IS SETUP TO MARK THIS AS A HARD DEVICE ERROR. IF THEF~; OPERATION IS SUCCESSFUL, THE CODE WILL BE CHANGED TO A SOFT DEVICE/; ERROR WHEN THE I/O OPERATION IS TERMINATED.€;H �; INPUTS: ‚;D<ƒ; R2=ADDRESS OF THE BLOCK OF REGISTERS TO LOG (MUST BE THE$„; CSR ADDRESS IF KS.MBC IS SET)…; R4=SCB ADDRESS†; R5=UCB ADDRESS‡;A ˆ; OUTPUTS:‰;F>Š; IF THIS IS THE FIRST OCCURENCE OF THE ERROR, THE ERROR LOG=‹; PACKET IS FILED AND THE SCB IS SET TO POINT TO THE PACKET1Œ; ADDRESS AND THE ERROR IN PROGRESS BIT IS SET.V�;R&Ž; NOTE: ALL REGISTERS ARE PRESERVED.�;-�‘ .IFTF’“$DVERR:: ;LOG DEVICE ERROR”$DVCER:: ;LOG DEVICE ERROR•– .IFT—@˜ MOV #$DVER1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON'™ BR 10$ ;BRANCH TO COMMON PROCESSINGIš›;+@œ; **-$LOGER-LOG AN ERROR LOG PACKET (NO ERROR NEED BE PRESENT)�;TFž; THIS ROUTINE IS CALLED BY DRIVERS THAT WISH TO CREATE AN E00vvvt´cÚµcÛ¶c�·c›’RROR LOGGŸ; PACKET WHEN NO ERROR IS PRESENT, I.E. FOR AN UNSOLICITED INTERRUPT. H ; THE PACKET WILL BE CREATED AND THE DRIVER IS RESPONSIBLE FOR FILLING&¡; IN THE NECESSARY DATA INFORMATION.¢;E £; INPUTS:C¤; +¥; R1=LENGTH OF DATA TO BE LOGGED IN BYTES#:¦; R4=SCB ADDRESS (IF ZERO THEN NO I/O PACKET IS PRESENT)§; R5=UCB ADDRESS¨;N ©; OUTPUTS:ª;0«; C=1 IF ERROR CANNOT BE LOGGED FOR ANY REASON¬; C=0 IF ERROR CAN BE LOGGED0­; R1=ADDRESS OF DATA AREA IN ERROR LOG PACKET#®; R3=ADDRESS OF ERROR LOG PACKETR¯; °; R4 AND R5 ARE PRESERVEDT±; R0, R2 AND R3 ARE DESTROYEDL/²; APR6 MAPPING DESTROYED: KISAR6 MAPS PACKETL³;-´µ¶ .IFTF· ¸$LOGER::¹º .IFT»@¼ MOV #$LGER1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON'½ BR 10$ ;BRANCH TO COMMON PROCESSINGI¾¿;+*À; **-$FNERL-FINISH ERROR LOGGING PROCESSÁ;CÂ; THIS ROUTINE IS CALLED AT I/O DONE TIME OR WHEN IT IS NECESSARYBAÃ; TO QUEUE AN ERROR LOG PACKET AFTER A SUCCESSFUL RECOVERY OF A=Ä; MID-TRANSFER ERROR.EÅ; Æ; INPUTS:DÇ; R0=FIRST I/O STATUS WORD,È; R2=STARTING AND FINAL ERROR RETRY COUNTS'É; R3=ERROR LOG PACKET ADDRESS IF R4=0Ê; R4=SCB ADDRESS OR ZEROË; R5=UCB ADDRESSÌ;L Í; OUTPUTS:3Î; THE ERROR PACKET IS QUEUED TO THE ERROR LOGGER.;)Ï; THE ERROR IN PROGRESS BIT IS CLEARED. Ð;NÑ; R1 AND R2 ARE DESTROYED.Ò;-ÓÔ .IFTFÕ*Ö$FNERL:: ;FINISH ERROR LOGGING PROCESSר .IFTÙ@Ú MOV #$FERL1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON'Û BR 10$ ;BRANCH TO COMMON PROCESSINGÜÝÞ;+%ß; **-$CRPKT-CREATE ERROR LOG PACKETAà;OIá; THIS ROUTINE IS CALLED TO CREATE AN ERROR LOG PACKET, EITHER FROM THESIâ; SEND MESSAGE DIRECTIVE PROCESSING, OR WITHIN THE EXECUTIVE AS PART OFUFã; THE PROCESSING OF A MEMORY ERROR, NONSENSE INTERRUPT, TIME CHANGE,)ä; POWER FAIL RECOVERY, OR DEVICE ERROR.å;. æ; INPUTS:Fç;:è; R0=PACKET CODEé; R1=LENGTH OF DATA SUBPACKETê; R2=CONTROL MASK WORD3ë; R3=BEGINNING ADDRESS OF DATA FOR DATA SUBPACKETN'ì; R4=TCB ADDRESS (FOR TASK SUBPACKET)8í; R5=UCB ADDRESS (FOR DEVICE IDENTIFICATION SUBPACKET)î; ï; OUTPUTS:ð; ñ; R0=UNCHANGED/ò; R1=BEGINNING ADDRESS OF DATA SUBPACKET DATAEó; R2=UNCHANGED"ô; R3=BEGINNING ADDRESS OF PACKETõ; R4=UNCHANGEDö; R5=UNCHANGED÷;Rø; C=0 IF A PACKET WAS CREATEDL#ù; C=1 IF A PACKET WAS NOT CREATED/ú; APR6 MAPPING DESTROYED: KISAR6 MAPS PACKETTû;Dü; OUTPUT PACKET FORMAT:Rý;S5þ; +-----------------------------------------------+C'ÿ; | RESERVED FOR PACKET LINK WORD |K5; +-----------------------------------------------+P5; | PACKET LENGTH (LENGTH OF REMAINDER OF PACKET) | 5; +-----------------------------------------------+C; | HEADER SUBPACKET |E ; . .;4 ; | |5; +-----------------------------------------------+; | OTHER SUBPACKETS |R ; . . ;P ; | |5 ; +-----------------------------------------------+R ;- .IFTF $CRPKT:: .IFT-@ MOV #$CRPK1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON' BR 10$ ;BRANCH TO COMMON PROCESSING ;+/; **-$CREQU-CREATE AND QUEUE ERROR LOG PACKET-;-E; THIS ROUTINE CREATES AND QUEUES ERROR LOG PACKET. IT USES $CRPKT G; AND $QUPKT. IT'S INPUT IS THE SAME AS THE INPUT TO $CRPKT AND IT'S-D; OUTPUT IS THE SAME AS THAT FROM $QUPKT. IF THE PACKET CANNOT BEF ; CREATED, $QUPKT IS NOT CALLED AND A RETURN IS MADE WITH CARRY SET.!;"; KISAR6 MAPPING IS PRESERVEDF#;-$% .IFTF& '$CREQU::() .IFTO*@+ MOV #$CREQ1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON', BR 10$ ;BRANCH TO COMMON PROCESSINGE-./;+$0; **-$QUPKT-QUEUE ERROR LOG PACKET1;EH2; THIS ROUTINE IS CALLED TO QUEUE AN ERROR LOG PACKET. IF THERE IS NOJ3; OTHER PACKET IN THE QUEUE, THE ERROR LOGGER IS REQUESTED WITH A DELAY.H4; IF THERE IS ANOTHER PACKET ALREADY IN THE QUEUE, THE ERROR LOGGER IS5; REQUESTED IMMEDIATLY..6; 7; INPUTS:M8;G00v"vw)vtöt÷tø tþfDATA/9; R3=POINTER TO PACKET FOR INSERTION IN QUEUE::; ;; OUTPUTS:<;V=; R4 AND R5 ARE PRESERVEDS%>; ALL OTHER REGISTERS ARE DESTROYED ?;-@A .IFTFB C$QUPKT::DE .IFT F@G MOV #$QUPK1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON'H BR 10$ ;BRANCH TO COMMON PROCESSINGOIJKL;+/M; **-$QERMV-REMOVE ENTRY FROM ERROR LOG QUEUE N;AHO; THIS ROUTINE REMOVES AN ENTRY FROM THE ERROR LOG QUEUE AND TRANSFERSP; IT INTO A USER BUFFER.Q; R; INPUTS:SS;T; R4=LENGTH OF USER BUFFERU; R5=ADDRESS OF USER BUFFERV;P W; OUTPUTS:X;AY; R1=LENGTH OF PACKET Z; R4=UNCHANGED[; R5=UNCHANGED\;']; C=0 PACKET WAS REMOVED SUCCESSFULLY =^; C=1 NO PACKET TO REMOVE OR PACKET TOO LONG. IF R1<>0 THE ?_; PACKET WAS TOO LONG, AND R1 CONTAINS THE PACKET LENGTH.+`;-ab .IFTFc d$QERMV::ef .IFT g@h MOV #$QRMV1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMONi10$:5i CALL $MPDCV ;MAP AND CALL CODE IN THIRD ; BM377"i ;DIRECTIVE COMMON ; BM377k ;**-1Bl .IFFmn SECop .IFTFq r RETURNPst .ENDC ;E$$LOGu v .DSABL LSBwxy;+4z; **-$NSIER-UNEXPECTED (NONSENSE) INTERRUPT ERRORS{;V<|; THIS ROUTINE IDENTIFIES THE INTERRUPTING VECTOR AND LOGS}; THE ERROR.~;T ; INPUTS:G€;0�; @(SP)=BITS 06:04 OF THE UNUSED VECTOR NUMBER0‚; PS=VECTOR ID (MOD 20) IN CONDITION CODE BITSƒ;E „; OUTPUTS:…;:6†; AN ERROR LOG PACKET IS ALLOCATED AND QUEUED TO THE‡; ERROR LOGGER.Cˆ;-‰Š‹ .IF DF E$$NSIŒ7�$NSIER::MFPS -(SP) ;;;SAVE THE VECTOR ID (MODULO 20)Ž�� .IF DF M$$PRO‘’;S@“; THIS INTERRUPT COULD BE THE ONE FROM THE IIST AS PART OF CPU ”; STARTUP.•;SH–; THE CRITERION FOR DETERMINING IS THIS IS A NORMAL NONSENSE INTERRUPTH—; AS DISTINCT FROM A CPU STARTUP IS THE STATE OF THE MEMORY MANAGEMENTH˜; UNIT. IF MAPPING IS ENABLED, THEN THIS IS ASSUMED A NORMAL NONSENSEH™; INTERRUPT. IF MAPPING IS NOT ENABLED, THEN A JUMP TO CPU STARTUP ISš; PERFORMED.›;Fœ%� BIT #1,SR0 ;;;IS MAPPING ENABLED?Vž BNE 5$ ;;;IF NE YES0)Ÿ CALLR $CPBGN ;;;NO, START UP THIS CPU  ¡ .ENDC¢£$¤5$: INCB $NSI ;;;NSI IN PROGRESS?)¥ BMI 7$ ;;;DON'T ALLOW COUNTER TO WRAP ¦ BNE 10$ ;;;IF NE YES(§ BIT #ES.LOG,$ERFLA ;;;LOGGING ERRORS?¨ BNE 20$ ;;;IF NE YES#©7$: DECB $NSI ;;;RESTORE COUNTERN)ª10$: CMP (SP)+,(SP)+ ;;;CLEAR THE STACKS« RTI ;;;RETURN¬­;NI®; THE NONSENSE INTERRUPT HAS NOT INTERRUPTED THE HANDLING OF A PREVIOUSF3¯; NONSENSE INTERRUPT, SO GO AHEAD AND PROCESS IT.D°;±:²20$: BIC #177760,(SP) ;;;ISOLATE THE VECTOR ID IN THE PS(³ MOV (SP)+,$VID ;;;SAVE THE VECTOR ID.+´ BIS @(SP)+,$VID ;;;ADD IN THE GROUP BIASO(µ MOV (SP),$OPC ;;;SAVE PREINTERRUPT PC)¶ MOV 2(SP),$OPS ;;;SAVE PREINTERRUPT PS?#· CALL $INTSV,PR7 ;;;SWITCH STACKSB*¸ MOV $ERLFK,R4 ;;;GET FORK BLOCK ADDRESS¹ CALL $FORK0 ;;;AND FORKº INC $ERRSQ ;COUNT THE ERRORH3» MOV #E$CCPU+<400*E$SINT>,R0 ;GET THE ERROR CODE 0¼ MOV #3*2,R1 ;THE BUFFER IS 3 WORDS (6 BYTES)5½ MOV #SM.HDR!SM.DAT!SM.DAC,R2 ;SET SUBPACKET FLAGS;(¾ MOV #$VID,R3 ;GET ADDRESS OF THE DATA)¿ CALL $CREQU ; CREATE AND QUEUE PACKETS-À30$: MOVB #-1,$NSI ;RESET RECURSION COUNTER, Á RETURN ;EÂà .ENDC ;E$$NSIÄÅÆÇ .ENDTERRUPT PS?#· CALL $INTSV,PR7 ;;;SWITCH STACKSB*¸ MOV $ERLFK,R4 ;;;GET FORK BLOCK ADDRESS¹ CALL $FORK0 ;;;AND FORKº INC $ERRSQ ;COUNT THE ERRORH3» MOV #E$CCPU+<400*E$SINT>,R0 ;GET T .TITLE MPENTC .IDENT /03.00/D R;; COPYRIGHT (C) 1979,1980,1984/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.T;MA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDM9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.O;H; K. E. KINNEAR 26-JAN-79A;A'; MULTIPROCESSOR CPU STARTUP PROCESSINGE;E; MODIFIED BY:;R; J. W. BERZLE 08-SEP-83 03.00;2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES;C ; D; THE FOLLOWING CODE IS DUPLICATED I00w*vvt´cÚµcÛ¶c�·c›’N INITL.MAC, AND IS USED TO SET D; THE MAPPING FOR STARTUP OF A CPU. ANY MODIFICATIONS HERE MUST BE -; REFLECTED IN THE SIMILAR CODE IN INITL. F ;  A;C; MACRO LIBRARY CALLSE; .MCALL BGCK$A A .IF DF M$$PRO B$PENT:: MOV #PMODE!PR7,PS ;;;INIT MODE BITS & LOCK OUT INTERRUPTS 3 MOV #$STACK-20,SP ;;;SET UP KERNEL STACK POINTER E5 MOV #KINAR0,R5 ;;;INIT POINTER TO MAPPING REGISTERS I( CLR R1 ;;;INIT I SPACE MEMORY OFFSET  .IF DF K$$DAS N . MOV $SCMOF,R2 ;;;INIT D SPACE MEMORY OFFSET % BNE 5$ ;;;IF NE DATA SPACE LOADED & TST $URMST ;;;IS THIS FROM INITL? * BNE 5$ ;;;IF NE NO -- REGULAR CPU ENTRY 8 MOV #$MESS1,R4 ;;;SPECIFY DATA SPACE NOT LOADED MESSAGE/ CALL $FATAL ;;;PRINT OUT FATAL ERROR MESSAGE 2 BGCK$A BF.MP,BE.NDS,HALT ;;;DATA SPACE NOT LOADED5$: SUB #200,R2 ;;; V  .IFTF 6$: ;;;REFERENCE LABEL .IFT 4 MOV #77406,KDSDR0-KINAR0(R5) ;;;SET D SPACE 4K RW 5 MOV R2,KDSAR0-KINAR0(R5) ;;;SET D SPACE APR OFFSET - ADD #200,R2 ;;;ADVANCE D SPACE APR OFFSET R4 MOV #77402,KINDR0-KINAR0(R5) ;;;SET I SPACE 4K RO .IFF I 4 MOV #77406,KINDR0-KINAR0(R5) ;;;SET I SPACE 4K RW  .IFTF ) MOV R1,(R5)+ ;;;SET I SPACE APR OFFSET R) ADD #200,R1 ;;;ADVANCE I SPACE OFFSET CMP R5,#KINAR7 ;;;DONE YET?  BLOS 6$ ;;;IF LOS NO . MOV #177600,KINAR7 ;;;SET UP I/O PAGE MAPPING .IFT V 3 MOV #177600,KDSAR6+2 ;;;SET UP D-SPACE MAPPING TOO ( CLR (R5) ;;;CLEAR DSPACE APR0 OFFSET  .ENDC ! .IF DF K$$DAS!M$$EXT!S$$LIB M " MOV #S3$BTS,SR3 ;;;SET UP SR3  .ENDC $ INC SR0 ;;;START MEMORY MAPPING ; ?; WE HAVE, WITH THE LAST INSTRUCTION, JUST CHANGE THE MAPPING I>; THROUGH WHICH THE CPU IS FETCHING INSTRUCTIONS. IF WE ARE ?; ON CPA THEN NO ACTUAL CHANGE WAS MADE, BUT IF ON SOME OTHER TC; CPU, THEN WE ARE NOW FETCHING INSTRUCTIONS FROM THE NEW MAPPING. ; , TST $URMST ;;;WERE WE CALLED FROM INITL? + BNE 7$ ;;;IF NE NO -- DON'T RETURN THERE ;' JMP $INITM ;;;RETURN BACK TO INITL *7$: MOV #PARTB,R5 ;;;SET RETURN ADDRESS / MOV #$NS0,SP ;;;SET UP STACK FOR CPU STARTUP E4$MAPCP::MOV $IICTB,R1 ;;;GET AN IIST KRB (ANY ONE) - MOV #9$,-(SP) ;;;SET UP RETURN FROM $SGFIN T& TST $URMST ;;;IS THIS THE FIRST CPU?* BNE 5$ ;;;IF NE NO -- IIST MUST BE THERE& ;;;SO DONT $SGFIN ON CPA'S VECTORS4 CALL $SGFIN ;;;ON CPA, TRAP NON-EXISTANT IIST REGS.5$: MOV @(R1),R0 ;;;GET IIST REGISTER (IF ANY), BCS 8$ ;;;IF CS NO REGISTER -- CPA FORCED ) SWAB R0 ;;;PUT CPU NUMBER IN LOW BYTE * BIC #177770,R0 ;;;CLEAR EXTRANEOUS BITS ) CMPB R0,$NCPU ;;;TOO HIGH A PROCESSOR? R) BGE 8$ ;;;IF GT YES -- MAKE CPA AGAIN T& ASL R0 ;;;MAKE CPU INTO WORD INDEX 3 MOV $IICTB(R0),R1 ;;;GET PROPER IIST KRB ADDRESS : BIC #KS.OFL,K.STS(R1) ;;;CLEAR OFFLINE BIT FOR THIS IIST 6 MOV (R1),$PWCSR ;;;SAVE IIST CSR FOR POWER UP ROUTINE! ;;;IN CPA'S CPU SPECIFIC AREA$ RETURN ;8$: CLR R0 ;;;FORCE TO CPA 8 RETURN G39$: MOV $K6TAB(R0),KINAR0 ;;;SET UP LOCAL MAPPING L  .IF DF K$$DAS 4 MOV $K6TAB(R0),KDSAR0 ;;;SET UP FIRST D SPACE PAR  .ENDC 0 MOV #$STACK-20,SP ;;;SET UP PROPER STACK AREA , MOV R5,-(SP) ;;;MAKE INTO SUBROUTINE CALL  .IF DF X$$DBT P ; BIT $CPBIT,$XDTFL ;;;HAS XDT BEEN INITIALIZED ON THIS CPU?A BNE 12$ ;;;IF NE YES " CALL $XDTIN ;;;INITIALIZE XDT ?12$: MOV #PMODE!PR7,PS ;;;SET UP MODE BITS AFTER XDT SCREWS IT  .ENDC ; F; INITIALIZE THE UNIBUS MAPPING REGISTERS ON THIS PROCESSOR IF IT IS #; A PDP-11/7X TYPE PROCESSOR. S ; 2 CAL00w2v)vtöt÷tø tþfDATAL $SGFIN ;;;CATCH MEMORY FAULTS AND SET CARRY4 MOV #UBMPR,R0 ;;;POINT TO FIRST UNIBUS MAP REGISTER% BIC #HF.UBM,$HFMSK ;;;ASSUME NO UMRSN TST (R0) ;;;ARE UMRS PRESENT?1 BCS 20$ ;;;IF CS NO 5 BIS #HF.UBM,$HFMSK ;;;INDICATE THAT UMRS ARE PRESENTS- MOV KINAR0,R3 ;;;GET MAPPING OF VIRTUAL ZERO ( CLR R2 ;;;CLEAR HIGH PART OF UMR VALUE2 ASHC #6,R2 ;;;CONVERT TO DOUBLE WORD BYTE OFFSET' MOV R3,(R0)+ ;;;SET UP LOW HALF OF UMR % MOV R2,(R0)+ ;;;AND HIGH HALF OF UMR  .IF DF K$$DAS C . MOV $SCMOF,R3 ;;;PICK UP OFFSET TO DATA SPACE! CLR R2 ;;;SET FOR CONVERSION F2 ASHC #6,R2 ;;;CONVERT TO DOUBLE WORD BYTE OFFSET) MOV #4,R1 ;;;SET COUNT OF UMR'S TO LOAD#015$: MOV R3,(R0)+ ;;;LOAD LOW 16 BITS OF ADDRESS, MOV R2,(R0)+ ;;;LOAD HIGH 6 BITS OF ADDRESS* ADD #20000,R3 ;;;BUMP ADDRESS BY 4K WORDS ADC R2 ;;;...O! SOB R1,15$ ;;;LOOP FOR ALL UMRSM .IFF A  CLR R1 ;;;INIT UMR OFFSET 4 MOV #4,R2 ;;;SET NUMBER OF REGISTER PAIRS TO LOAD +15$: ADD #20000,R1 ;;;ADVANCE UMR OFFSET T. MOV R1,(R0)+ ;;;LOAD LOW 16 BITS OF ADDRESS - CLR (R0)+ ;;;CLEAR HIGH 6 BITS OF ADDRESS ! SOB R2,15$ ;;;LOOP FOR ALL UMRS  .ENDC 20$: RETURN ;;;R ; A; SCAN PARITY MEMORY CSR REGISTERS AND CREATE TABLE FOR THIS CPU ; 5PARTB: MOV #$DIRXT,-(SP) ;;;EXIT FINALLY TO $DIRXT 1 CALL $SGFIN ;;;CATCH TRAPS TO 4 AND SET CARRY ;3 MOV #$PARTB,R0 ;;;GET ADDRESS OF PARITY CSR TABLE 0' MOV R0,R1 ;;;COPY ADDRESS OF TABLE R3 MOV #1,(R1)+ ;;;INSERT A ONE IN FIRST TABLE ENTRY C- MOV #$CSRTB,R4 ;;;GET ADDRESS OF CSR TABLE ;516$: MOVB (R4)+,R3 ;;;GET NUMBER OF CSR'S TO SET UP  BEQ 22$ ;;;IF EQ DONE % CLR R2 ;;;INITIALIZE CSR ADDRESS R* BISB (R4)+,R2 ;;;CALCULATE CSR ADDRESS + SWAB R2 ;;;GET HIGH BYTE OF CSR ADDRESS M/ BISB (R4)+,R2 ;;;GET LOW BYTE OF CSR ADDRESS C"17$: TST (R2) ;;;CSR PRESENT?  BCS 19$ ;;;IF CS NO R$ MOV R2,(R1)+ ;;;SAVE CSR ADDRESS  BR 20$ ;;; P319$: MOV R0,(R1)+ ;;;POINT TO FIRST WORD OF TABLE '20$: ADD #2,R2 ;;;POINT TO NEXT CSR ; SOB R3,17$ ;;;LOOP UNTIL DONE:3 BR 16$ ;;;CONTINUE THROUGH THE REST OF THE TABLE B ; B; CLOCK INITIALIZATION -- CLOCKS ON ALL SECONDARY PROCESSORS MUST D; BE THE SAME TYPE AS THE PRIMARY PROCESSOR (I.E. EITHER ALL KW11-L "; OR KW11-P) OR WE WILL HALT ; -22$: TST @$CKCSR ;;;IS THE CLOCK AVAILABLE R BCC 25$ ;;;IF CC YES 4 BGCK$A BF.MP,BE.NCK,HALT ;;;NO -- CLOCK UNAVAILABLE+25$: CMP #172540,$CKCSR ;;;IS IT KW11-P 2 BNE 30$ ;;;IF NE NO / MOV #$CKINT,@#104 ;;;SET UP KW11-P INTERRUPT T0 MOV #$NONSI,@#100 ;;;DISABLE KW11-L INTERRUPT  BR 40$ 930$: MOV #$NONSI,@#104 ;;;ASSUME KW11-L - DISABLE KW11-P S/ MOV #$CKINT,@#100 ;;;SET UP KW11-L INTERRUPT I* TST $CKCSR ;;;DOES THE CLOCK HAVE A CSR? BEQ 45$ ;;;IF EQ NO 740$: MOV $CKLDC,@$CKCNT ;;;SETUP CLOCK COUNT REGISTER L' MOV #K$$IEN,@$CKCSR ;;;START CLOCK 45$: ;;;REFERENCE SYMBOLO  .IF DF F$$LPP T ( TST PIRQ ;;;IS THERE A PIRQ REGISTER  BCS 50$ ;;;IF CS NO E+ MOV #$FPPRQ,@#240 ;;;SET UP PIRQ VECTOR L: MOV #$FPPR8,@#244 ;;;SET UP FLOATING POINT EXCEPTION VEC 50$: ;;;REFERENCE LABEL M  .ENDC G; MOVE $HFMSK FROM CPA'S LOWCR INTO THAT OF THE PROCESSOR COMING ONLINE0 MOV KISAR6,-(SP) ;;;SAVE CURRENT KERNEL MAPPING* CLR KISAR6 ;;;MAP TO CPA'S LOW CORE AREA7 MOV $HFMSK+140000,$HFMSK ;;;PROPAGATE TO NEW PROCESSOR+ MOV (SP)+,KISAR6 ;;;RESTORE KERNEL MAPPING  LOCK$ $EXECL,WAIT ; LOCK$ $IIFNL,SPIN ;;;LOCK THE MULTIPROCESSOR FUNCTION TBL 0 BIC #MP.STP,@$MPSWT ;;;CLEAR OUT OUR STOP BIT - ULOCK$ $IIFNL,SPIN ;;;UNLOCK THE FN TABLE & CALL $CPNIT ;;;START UP PROCESSOR  .IF NDF X$$DBT 1$XDTIN:: ;;;REFERENCE LABEL -- NULL SUBROUTINE E  .IFTF 00w:vx;vt´cÚµcÛ¶c�·c›’  RETURN  .ENDC  .ENDC  .END  LOCK$ $EXECL,WAIT ; LOCK$ $IIFNL,SPIN ;;;LOCK THE MULTIPROCESSOR FUNCTION TBL 0 BIC #MP.STP,@$MPSWT ;;;CLEAR OUT OUR STOP BIT - ULOCK$ $IIFNL,SPIN ;;;UNLOCK THE FN TABLE & CALL $CPNIT ;;;START UP PROCESSOR  .IF NDF X$$DBT 1$XDTIN:: ;;;REFERENCE LABEL -- NULL SUBROUTINE E  .IFTF  .TITLE SYSXT@ .IDENT /14.02/ ;NK; COPYRIGHT (c) 1982, 1983, 1984, 1985 BY DIGITAL EQUIPMENT CORPORATION.C; ALL RIGHTS RESERVED.;S>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;K ; D. N. CUTLER 10-AUG-73 ;5- ; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY: ;0; B. S. MCCARTHY; J. R. KAUFFMAN; T. LEKASR; J. M. LAWLER; -; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY: ; ; J. W. BERZLE; D. R. DONCHIN; J. R. KAUFFMAN; T. LEKAS9; B. S. MCCARTHY; L. B. MCCULLEY; C. A. SILVER;S-; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:D;L"; B. S. MCCARTHY 21-OCT-86 14.00;Y(; BM375 -- CORRECT WATCHPOINT SUPPORT;"; B. S. MCCARTHY 22-DEC-86 14.01;5; BM378 -- RECONDITIONALIZE CACHE BYPASS IN CRAW$, ; AND MAP$ ON C$$CBP;M; K. L. NOEL 06-FEB-87 14.02;R*; KLN025 -- CORRECT AST QUEUING PROBLEM; 4G; SYSTEM ENTRANCE, EXIT, AND PROCESSOR DISPATCHINGH; I; MACRO LIBRARY CALLS9J; K,L .MCALL ABODF$,HDRDF$,HWDDF$,PCBDF$,TCBDF$M .MCALL PKTDF$,ITBDF$,BGCK$ANO$P ABODF$ ;DEFINE TASK ABORT CODES'Q HDRDF$ ;DEFINE TASK HEADER OFFSETS &R HWDDF$ ;DEFINE HARDWARE REGISTERS3S PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSO.T TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS4U ITBDF$ ;DEFINE INTERRUPT TRANSFER BLOCK OFFSETS)V PKTDF$ ;DEFINE AST OFFSETS AND CODESOWX;+Y; **-$DIRSV-DIRECTIVE SAVEZ;OJ[; THIS ROUTINE IS CALLED FROM DIRECTIVE LEVEL TRAP SERVICE ROUTINES. THEG\; STACK DEPTH IS +1, THUS A SWITCH TO THE SYSTEM STACK IS ALWAYS NEC-F]; ESSARY. AT THE END OF TRAP PROCESSING A RETURN IS EXECUTED TO EXIT^; FROM THE SYSTEM._;A `; INPUTS:Ea;!b; 4(SP)=PS WORD PUSHED BY TRAP. !c; 2(SP)=PC WORD PUSHED BY TRAP. -d; 0(SP)=SAVED R5 PUSHED BY 'JSR R5,$DIRSV'. e;R f; OUTPUTS:g;OBh; REGISTER R4 IS PUSHED ONTO THE CURRENT STACK AND THEN A SWITCH=i; TO THE SYSTEM STACK IS EXECUTED. REGISTERS R3 THRU R0 AREI=j; PUSHED ON THE SYSTEM STACK, THE NEW PROCESSOR PRIORITY IS,.k; SET, AND A CALL TO THE CALLER IS EXECUTED.l;-m*n$DIRSV::MOV R4,-(SP) ;;;SAVE REGISTER R4o;+p; ** W A R N I N G **Tq;Sr; SPM HOOKPOINT NUMBER 26.s; +t; DO NOT CHANGE THE INSTRUCTION FOLLOWINGWu; LABEL WITHOUT CHECKING SPMv;-w-x$SPH26==. ;SPM CHANGES THE INSTRUCTION AT!y ;THE LOCATION OF THIS LABELOz){ DEC @#$STKDP ;;;SET PROPER STACK DEPTHE|} .IF DF M$$PRO~( BNE 10$ ;;;IF NE DON'T SWITCH STACKS€� .ENDC ; DF M$$PRO‚ƒ„… .IF NDF M$$PRO,†‡10$: ;;; REFERENCE LABELEˆ‰ .IFTF ; NDF M$$PRO Š‹ MTPS #0 ;;;ALLOW INTERRUPTSŒ LOCK$ $EXECL,WAIT�Ž .IFF ; NDF M$$PRO�#�10$: MTPS #0 ;;;ALLOW INTERRUPTSN‘’ .ENDC ; NDF M$$PROA“*” MOV R3,-(SP) ;SAVE REGISTERS R3 THRU R0• MOV R2,-(SP) ;I– MOV R1,-(SP) ; — MOV R0,-(SP) ;T˜™š .IF DF M$$PRO›)œ MOV $TKTCB,R0 ;GET CURRENT TCB ADDRESS �6ž ASSUME T2.HLT,200 ;NEXT INSTRUCTION DEPENDS ON THISŸ$  TSTB T.ST2(R0) ;IS TASK EXITING?.¡ BPL 15$ ;IF PL NO -- ALLOW ENTRY TO SYSTEM¢-£ TST $STKDP ;DID WE COME FROM USER STATE ?I*¤ BEQ 20$ ;IF EQ YES - NO ACTION ALLOWED¥*¦15$: MOV (SP),R0 ;RESTORE R0 FOR $SWSTK§¨ .ENDC©ª«¬ .IF DF R$$WPT­>­ MOV R5,$WPLST ;SAVE ADDRESS OF LAST SYSTEM ROUTINE ; BM375¯ ;**-1V° .ENDC ; DF R$$WPT±,² CALL (R5) ;CALL SYNCHRONOU00xBv)vtöt÷tø tþfDATAS TRAP ROUTINE³20$: JMP $DIRXT´µ;+ ¶; **-$IFORK-INDEPENDANT $CFORK·; F¸; THIS ROUTINE IS SIMILAR TO $CFORK (SEE BELOW) BUT DOES NOT USE THEF¹; FORK BLOCK IN THE SCB. INSTEAD IT ALLOCATES A FORK BLOCK FROM THEHº; POOL, TRANSFERS EXECUTION TO ANOTHER PROCESSOR, AND THEN DEALLOCATES»; THE FORK BLOCK.¼; ½; INPUTS:¾; ¿; R4=ANYTHING (THIS IS SAVED).À; R5=UCB ADDRESS. "Á; 0(SP)=CALLER'S RETURN ADDRESS.,Â; 2(SP)=RETURN ADDRESS OF CALLER'S CALLER.Ã;) Ä; OUTPUTS:Å; Æ; R4=SAVED R4.Ç; R5=UCB ADDRESS.È;BÉ; EXECUTION IS ON CORRECT PROCESSOR. DRIVERS WITHOUT KRB'S HAVEFÊ; NO CORRECT PROCESSOR, AND ALWAYS EXECUTE ON THE CURRENT PROCESSOR.Ë;-ÌÍÎ .IF DF M$$PROÏ>Ð$IFORK::MOV (SP)+,R3 ;PUT RETURN ADDRESS IN PROPER PLACE FOR Ñ ;$EXDOPÒÓ;+1Ô; **-$EXDOP-EXECUTE DRIVER ROUTINE ON PROCESSORN*Õ; **-$EXROP-EXECUTE ROUTINE ON PROCESSORÖ;PD×; THIS ROUTINE IS USED TO EXECUTE A PARTICULAR ROUTINE (USUALLY INHØ; A DRIVER) UNDER CONTROL OF A SPECIFIC PROCESSOR (POSSIBLY THIS ONE.)CÙ; THE CODE SEGMENT TO BE EXECUTED MUST BE TERMINATED BY A RETURN.Ú;OBÛ; IF THE ROUTINE CAN BE EXECUTED ON THE CURRENT PROCESSOR, IT IS>Ü; CALLED BY A CALL. SHOULD IT BE NECESSARY TO EXECUTE IT ON@Ý; ANOTHER PROCESSOR, A FORK BLOCK IS ALLOCATED AND LINKED INTO>Þ; THE FORK QUEUE. THEN A RETURN TO THE CALLER IS PERFORMED.@ß; WHEN THE TARGET PROCESSOR EXECUTES THE "FORKED" ROUTINE, THEBà; FORK BLOCK WILL BE DEALLOCATED PRIOR TO CALLING THE ROUTINE TOAá; BE EXECUTED. THIS ENTIRE OPERATION IS INDEPENDANT OF WHAT ISE?â; ON THE STACK, I.E. CONTROL WILL ALWAYS RETURN TO THE CALLERIAã; WHETHER OR NOT THE ROUTINE CAN BE EXECUTED ON THIS PROCESSOR. ä; "å; THE FORM OF THE FORK BLOCK IS:æ;&ç; *-------------------------------*è; 0 ! UNIBUS RUN MASK !&é; *-------------------------------*ê; 2 ! FORK LINK !&ë; *-------------------------------*ì; 4 ! FORK PC !T&í; *-------------------------------*î; 6 ! FORK R5 !O&ï; *-------------------------------*ð; 10 ! FORK R4 !&ñ; *-------------------------------*ò; 12 ! DRIVER KISAR5 !O&ó; *-------------------------------*ô; 14 ! ROUTINE ADDRESS !P&õ; *-------------------------------*ö;O ÷; INPUTS:ø;*%ù; R2=UNIBUS RUN MASK ($EXROP ONLY). )ú; R3=ADDRESS OF ROUTINE TO BE EXECUTED.- û; R4=ANYTHING (THIS IS SAVED).!ü; R5=UCB ADDRESS ($EXDOP ONLY).-"ý; 0(SP)=CALLER'S RETURN ADDRESS.,þ; 2(SP)=RETURN ADDRESS OF CALLER'S CALLER.ÿ; ; OUTPUTS:;-.; THE ROUTINE TO BE EXECUTED IS CALLED WITH:;*; R4=SAVED R4.1; R5=SAVED R5 (UCB ADDRESS IF ENTRY AT $EXDOP).-; 0(SP)=RETURN ADDRESS.-;,; THE CALLING ROUTINE IS RETURNED TO WITH: ;-3 ; C=0 IF THE ROUTINE TO BE EXECUTED HAS EXECUTED.U$ ; C=1 IF A FORK HAD TO BE CREATED. ;O2 ; NOTE: ONLY R5 IS PRESERVED TO CALLING ROUTINE!;D7; THE CONTENTS OF KERNEL INSTR AND DATA APR 5 AT THES$; TIME OF THE CALL ARE DESTROYED.;O;-  .ENABL LSB+$EXDOP::MOV U.SCB(R5),R2 ;GET SCB ADDRESSC. MOV S.KS5(R2),KINAR5 ;MAP DRIVER IN I SPACE .IF DF K$$DAS. MOV S.KS5(R2),KDSAR5 ;MAP DRIVER IN D SPACE .ENDC, $EXRP1::MOV S.URM(R2),R2 ;GET URM FROM SCB! BEQ 10$ ;IF EQ NO URM :"$EXROP::BIT R2,@$CPURM ;CAN WE EXECUTE ON THIS PROCESSOR # BEQ 20$ ;IF EQ NO, MUST FORK$%;O$&; EXECUTE THE ROUTINE HERE AND NOW';N(-)10$: MOV R5,-(SP) ;SAVE R5 FROM THE ROUTINER* CALL (R3) ;CALL ROUTINE!+ MOV (SP)+,R5 ;RESTORE SAVED R5($, CLC ;TELL CALLER THAT WE DID IT - RETURN .2/20$: MOV #7.*2,R1 ;SET BLOCK SIZE FOR FORK BLOCK$0 MOV R2,-(SP) ;SAVE R2 FROM $ALOCB,1 CALL $ALOCB ;WE ASSUME IT SAVES R3,R4,R5 2 BCC 30$ ;IF CC ALLOCATION OK34;I05; ***** THIS IS A RATHER NASTY SITUATION *****6;O:7; WE CANNOT GET TO THE CORRECT PROCESSOR, SINCE WE CAN'T:8; ALLOCATE A FORK BLOCK. NEITHER CAN WE EXIT THE EXEC TO:9; LET ANYONE ELSE IN WHO MIGHT POTENTIALLY FREE UP POOL,=:; SINCE WE HAVE NO00xJv;vt´cÚµcÛ¶c�·c›’ IDEA WHAT THE CALLER WAS DOING. IT WOULDE9;; BE NICE IF IN THE FUTURE SOME WAY OUT OF THIS PROBLEMB<; COULD BE DEVISED.K=;M>'? BGCK$A BF.MP,BE.NPL,FATAL ;POOL FULLO@/A30$: MOV (SP)+,(R0) ;INSERT URM IN FORK BLOCKA&B ADD #14.,R0 ;POINT AT END OF BLOCK'C MOV R3,-(R0) ;INSERT ROUTINE ADDRESS.D MOV KINAR5,-(R0) ;PUT MAPPING IN FORK BLOCKE MOV R4,-(R0) ;INSERT R4 F MOV R0,R4 ;SET UP FOR $FORK14G CALL $FORK1 ;WE ASSUME $FORK ALWAYS RETURNS C=1.HI;O2J; AT THIS POINT THE CALLER HAS BEEN RETURNED TO.K;IAL; WHEN WE EXECUTE THE CODE BELOW WE ARE ON THE TARGET PROCESSORB M; AND THE REGISTERS LOOK LIKE:N;B(O; R3=ADDRESS OF PC WORD IN FORK BLOCK.P; R4=SAVED R4.:Q; R5=SAVED R5 (POSSIBLY UCB ADDRESS IF ENTRY AT $EXDOP).R;BS-T MOV R3,R0 ;POINT AT PC WORD IN FORK BLOCKM$U SUB #4,R0 ;POINT AT TOP OF BLOCK!V MOV #7.*2,R1 ;SET BLOCK LENGTH,W MOV 14(R0),-(SP) ;SAVE ADDRESS OF ROUTINE7X CALLR $DEACB ;DEALLOCATE BLOCK (ASSUME R4,R5 SAVED)T0Y .DSABL LSB ;AND EXIT TO OUR ROUTINE WHO WILL&Z ;EXIT BACK TO THE FORK PROCESSOR[\;+]; **-$CFORK-CONDITIONAL FORK^;R>_; THIS ROUTINE WILL TRANSFER THE EXECUTION STREAM TO ANOTHER?`; PROCESSOR BY USING THE FORK LIST. IT SHOULD ONLY BE CALLED Aa; AT EXECUTIVE LEVEL, SINCE IT USES REGISTERS OTHER THAN R4 ANDb; R5.,c;P d; INPUTS:Fe;Kf; R4=ANYTHING.g; R5=UCB ADDRESS.h;1 i; OUTPUTS:j;Dk; R4=SAVED R4.l; R5=UCB ADDRESS.Lm;EBn; EXECUTION IS ON CORRECT PROCESSOR. NOTE: DRIVERS WITHOUT KRBS=o; HAVE NO "CORRECT PROCESSOR" SO $CFORK WILL ALWAYS RETURN.p;-q+r$CFORK::MOV U.SCB(R5),R2 ;GET SCB ADDRESSLs,t TALLY$ B.CFCL,XA$$CF ;COUNT A $CFORK CALLu,v TST S.URM(R2) ;IS THERE A UNIBUS RUN MASK"w BEQ $INTXT ;IF EQ NO -- RETURN)x BIT S.URM(R2),@$CPURM ;OK ON THIS CPU?#y BNE $INTXT ;IF NE YES -- RETURN z{;N,|; TRANSFER EXECUTION TO CORRECT PROCESSOR.};~,€ TALLY$ B.CFRK,XA$$CF ;COUNT A $CFORK FORK�‚ MOV R4,-(SP) ;SAVE R4ƒ MOV R2,R4 ;GET SCB ADDRESS.„ ADD #S.FRK+6,R4 ;POINT TO END OF FORK BLOCK-… MOV (SP)+,(R4) ;PUT SAVED R4 IN FORK BLOCK,*† BR $FORK1 ;TRANSFER INTO FORK ROUTINES‡"‡ .ENDC ; DF M$$PRO ;JWB213‰ ;**-1AŠ‹;++Œ; **-$FORK-FORK AND CREATE SYSTEM PROCESS�;SMŽ; THIS ROUTINE IS CALLED FROM AN I/O DRIVER TO CREATE A SYSTEM PROCESS THATG�; WILL RETURN TO THE DRIVER AT STACK DEPTH ZERO TO FINISH PROCESSING. �;K ‘; INPUTS:T’;F7“; R5=ADDRESS OF THE UCB FOR THE UNIT BEING PROCESSED.T#”; 0(SP)=RETURN ADDRESS TO CALLER.N+•; 2(SP)=RETURN ADDRESS TO CALLERS CALLER.T–;D —; OUTPUTS:˜;B™; REGISTERS R5 AND R4 ARE SAVED IN THE CONTROLLER FORK BLOCK ANDBš; A SYSTEM PROCESS IS CREATED. THE PROCESS IS LINKED TO THE FORK+›; QUEUE AND A JUMP TO $INTXT IS EXECUTED.Eœ;-� ž .ENABL LSBI(Ÿ$FORK:: MOV R4,-(SP) ;SAVE REGISTER R45  MOV U.SCB(R5),R4 ;POINT TO CONTROLLER STATUS BLOCK "¡ CLRB S.CTM(R4) ;DISABLE TIMEOUT.¢ ADD #S.FRK+6,R4 ;POINT TO END OF FORK BLOCK-£ MOV (SP)+,(R4) ;PUT SAVED R4 IN FORK BLOCKR¤¥;+,¦; **-$FORK1-FORK AND CREATE SYSTEM PROCESS§;UE¨; THIS ROUTINE IS AN ALTERNATE ENTRY TO CREATE A SYSTEM PROCESS ANDB©; SAVE REGISTER R5.Pª;S «; INPUTS:T¬;O>­; R4=ADDRESS OF THE LAST WORD OF A 3 WORD FORK BLOCK PLUS 2..®; R5=REGISTER TO BE SAVED IN THE FORK BLOCK.¯;- °; OUTPUTS:±; A²; REGISTER R5 IS SAVED IN THE SPECIFIED FORK BLOCK AND A SYSTEM ?³; PROCESS IS CREATED. THE PROCESS IS LINKED TO THE FORK QUEUEO%´; AND A JUMP TO $INTXT IS EXECUTED.R'µ; R5 IS PRESERVED FOR CALLERS CALLER.-¶;-·(¸$FORK1::MOV R5,-(R4) ;SAVE REGISTER R5¹º;+,»; **-$FORK0-FORK AND CREATE SYSTEM PROCESS¼; B½; THIS ROUTINE IS AN ALTERNATE ENTRY TO CREATE A SYSTEM PROCESS.¾;W ¿; INPUTS:RÀ;K>Á; R4=ADDRESS OF THE LAST WORD OF A 2 WORD FORK BLOCK PLUS 2.Â; Ã; OUTPUTS:Ä;?Å; A SYSTEM PROCESS IS CREATED, LINKED TO THE FORK QUEUE AND A Æ; JUMP TO $INTXT IS EXECUTED.CÇ;-È&É$FORK0::MOV (SP)+,-(00xRv)vtöt÷tø tþfDATAR4) ;SET FORK PC,Ê CLR -(R4) ;CLEAR LINK TO NEXT FORK BLOCKËÌ;+4Í; **-$QFORK-INSERT FORK BLOCK AT END OF FORK QUEUEÎ;5<Ï; THIS ROUTINE IS AN ALTERNATE ENTRY TO QUEUE A FORK BLOCK@Ð; AND RETURN TO THE CALLER. IT DOES NOT RETURN TO THE CALLER'S)Ñ; CALLER AS DO THE OTHER FORK ROUTINES.SÒ;H Ó; INPUTS:FÔ;WÕ; R4=ADDRESS OF A FORK BLOCK. Ö;T ×; OUTPUTS:Ø;T;Ù; THE FORK BLOCK SUPPLIED IN R4 IS LINKED INTO THE SYSTEMU7Ú; FORK QUEUE, AND A RETURN TO THE CALLER IS EXECUTED.,Û;-Ü;Ý$QFORK::MFPS -(SP) ;SAVE PRIORITY AROUND QUEUE INSERTION.Þ MTPS #PR7 ;CAN'T INTERRUPT QUEUE INSERTION1ß LOCK$ $FORKL,SPIN ;;;SERIALIZE ACCESS TO QUEUETàá .IF DF R$$FRKâ"ã MOV R4,-(SP) ;;;FREE A REGISTER*ä MOV #$FRKHD,R4 ;;;GET THE FORK LISTHEAD7å10$: MOV (R4),R4 ;;;GET THE NEXT ELEMENT IN THE LIST$æ BEQ 15$ ;;;IF EQ NO MORE - GO ON0ç CMP R4,(SP) ;;;THIS ONE IN THE LIST ALREADY?(è BNE 10$ ;;;IF NE NO - LOOK SOME MOREé,ê BGCK$A BF.INT,BE.2FR,FATAL ;;;DOUBLE FORKë!ì15$: MOV (SP)+,R4 ;;;RESTORE R4Oíî .ENDC ;R$$FRKï1ð MOV R4,@$FRKHD+2 ;;;LINK NEW ENTRY TO OLD LAST-ñ MOV R4,$FRKHD+2 ;;;SET ADDRESS OF NEW LASTUòóô .IF DF M$$PROõö;V$÷; ADD ITEM TO FORK LIST WAIT MASK.ø;Dù(ú TST -(R4) ;;;IS IT LEGAL FORK BLOCK?û BEQ 40$ ;;;IF EQ YES$ü BIT (R4),$URMST ;;;IS URM ONLINE?ý BNE 40$ ;;;IF NE YES:þ BGCK$A BF.MP,BE.URM,FATAL ;;;FORK BLOCK FOR OFFLINE URM0ÿ40$: BIS (R4)+,$IIPND ;;;ADD TO FORK WAIT MASK .ENDC+ TSTB $IDLFL ;;;ARE WE IN IDLE LOOP NOW? BLE 50$ ;;;IF LE NOV;+; ** W A R N I N G **O ;S ; SPM HOOKPOINT NUMBER 32. ;S+ ; DO NOT CHANGE THE INSTRUCTION FOLLOWING ; LABEL WITHOUT CHECKING SPM;--$SPH32==. ;SPM CHANGES THE INSTRUCTION ATL! ;THE LOCATION OF THIS LABELB .IF DF M$$PRO* COMB @#$IDLFL ;;;SHOW WE HAVE BEEN HERE? MOV #DIRXT2,$STACK-24 ;;;FORCE SYSTEM BACK THRU $IIPND CHECKI .IFF , CLRB @#$IDLFL ;;;NOT IN IDLE LOOP ANYMORE@ MOV #$DIRXT,$STACK-24 ;;;FORCE SYSTEM BACK THRU LOCK AND INTO  ;;;EXECG ! .ENDC"#$50$: ULOCK$ $FORKL,SPIN&% MTPS (SP)+ ;;;RESTORE OLD PRIORITY1& SEC ;RETURN WITH CARRY SET TO CALLERS CALLERH ' RETURN ;A ( .DSABL LSBC)*;+6+; **-$FORK2-FORK ROUTINE FOR USE IN CONJUNCTION WITH,; THE CINT$ DIRECTIVE.-;H .; INPUTS:E/;E#0; R5=ADDRESS OF FORK BLOCK IN ITBY1;B 2; OUTPUTS:3;C;4; IF THE FORK BLOCK IS ALREADY IN USE (FORK PC NON-ZERO),Y?5; A SYSTEM PROCESS IS CREATED, LINKED TO THE FORK QUEUE AND AL6; JUMP TO $INTXT IS EXECUTED.:7; ELSE THE INTERRUPT IS DISMISSED (NO RETURN TO CALLER).8;E:9; IMMEDIATELY ON RETURN FROM THIS ROUTINE, THE FOLLOWING#:; INSTRUCTION SHOULD BE EXECUTED: ;; <; CLR @R3=;O'>; WHICH DECLARES THE FORK BLOCK FREE.I?;-@A .IF DF C$$INTB2C$FORK2::TST 2(R5) ;;;FORK BLOCK ALREADY IN USE?D BNE 10$ ;;;Y - JUMPT(E MOV R4,6(R5) ;;;SAVE R4 IN FORK BLOCKF MOV R5,R4 ;;;N3G ADD #6,R4 ;;;POINT JUST AFTER 3-WORD FORK BLOCKTH BR $FORK1 ;;;L I10$: TST (SP)+ ;;;CLEAR STACKJ ;;;FALL THRU TO $INTXTKL .ENDCMNO;+P; **-$INTXT-INTERRUPT EXITQ; CR; THIS ROUTINE MAY BE CALLED VIA A JMP TO EXIT FROM AN INTERRUPT. S; T; INPUTS:3U;O(V; 0(SP)=INTERRUPT SAVE RETURN ADDRESS.W;- X; OUTPUTS:Y;I+Z; A RETURN TO INTERRUPT SAVE IS EXECUTED.R[;-\]$INTXT::RETURN ;^_;+C`; **-$INTSI-INTERRUPT SAVE (CALLED FROM INTERRUPT CONTROL BLOCKS),a;;Db; THIS ROUTINE IS CALLED FROM AN INTERRUPT CONTROL BLOCK. IT PUTSFc; THE WORLD IN ORDER FOR ENTRY TO A DRIVER INTERRUPT ENTRY POINT ANDd; MAPS TO THE DRIVER.Ee; f; INPUTS:g;S%h; 4(SP)=PS WORD PUSHED BY INTERRUPTT%i; 2(SP)=PC WORD PUSHED BY INTERRUPT3,j; 0(SP)=SAVED R5 PUSHED BY 'JSR R5,$INTSI'k; 0(R5)=SCRATCH WORD OF ICB*l; 2(R5)=WORD FOR APR5 (TO MAP TO DRIVER)'m; 4(R5)=BYTE FOR PS (DEVICE PRIORITY)9n; 6(R5)=DRIVER INTERRUPT ENTRY POINT (BIASED B00xZv;vt´cÚµcÛ¶c�·c›’Y 120000) o;S p; OUTPUTS:q;R#r; R4 IS PUSHED ONTO CURRENT STACKN&s; R4 IS SET TO CONTROLLER NUMBER * 2?t; STACK DEPTH IS DECREMENTED AND, IF RESULT IS ZERO, A SWITCH $u; TO THE SYSTEM STACK IS EXECUTED v; KERNEL APR5 MAPPING IS SAVED,w; CPU PRIORITY IS SET TO PRIORITY FROM ICBCx; DRIVER INTERRUPT ENTRY POINT IS CALLED AS A COROUTINE (SO AFTERD$y; A RETURN, APR5 CAN BE RESTORED)z;-{7|$INTSI::JSR R4,(PC) ;;;SAVE R4 WHILE PRESERVING CC'S=(} MFPS R4 ;;;RETRIEVE CONTROLLER INDEX4~ BIC #177760,R4 ;;;CLEAR ALL BUT CONTROLLER NUMBER# ASL R4 ;;;CONVERT TO WORD INDEXN€;+�; ** W A R N I N G **E‚;Sƒ; SPM HOOKPOINT NUMBER 27.„;,+…; DO NOT CHANGE THE INSTRUCTION FOLLOWINGT†; LABEL WITHOUT CHECKING SPM‡;-ˆ-‰$SPH27==. ;SPM CHANGES THE INSTRUCTION ATR!Š ;THE LOCATION OF THIS LABELD‹!Œ DEC @#$STKDP ;;;SWITCH STACKS?R�Ž7�10$: MOV KINAR5,-(SP) ;;;SAVE KERNEL INSTRUCTION APR5E�‘’ .IF DF K$$DAS“,” MOV KDSAR5,-(SP) ;;;SAVE KERNEL DATA APR5#• MOV (R5),KDSAR5 ;;;MAP TO DRIVERE–— .ENDC˜™š MOV (R5)+,KINAR5 ;;;›œ� .IF DF C$$INTž(Ÿ BR $INTS2 ;;;CONTINUE IN COMMON CODE ¡ .IFFC¢>£ .IIF NE <.-$INTS2>, .ERROR ;$INTS2 NOT THE NEXT INSTRUCTION¤¥ .ENDC¦§¨©;+=ª; **-$INTSC-INTERRUPT SAVE (INTERRUPT FROM VECTOR CONNECTED«; TO VIA CINT$ DIRECTIVE).¬;'­; CALLS ISR WITH R4 AND R5 SAVED AND:E®;I#¯; R5 POINTER TO FORK BLOCK IN ITB$°; PRI TAKEN FROM ITB±; ²;-³´µ .IF DF C$$INT¶!·$INTSC::MOV R4,-(SP) ;;;SAVE R4.¸;+¹; ** W A R N I N G **Rº;»; SPM HOOKPOINT NUMBER 28.¼;B+½; DO NOT CHANGE THE INSTRUCTION FOLLOWING.¾; LABEL WITHOUT CHECKING SPM¿;-À-Á$SPH28==. ;SPM CHANGES THE INSTRUCTION AT! ;THE LOCATION OF THIS LABELRÃ!Ä DEC @#$STKDP ;;;SWITCH STACKS?EÅÆ7Ç10$: MOV KINAR5,-(SP) ;;;SAVE KERNEL INSTRUCTION APR5 ÈÉÊ .IF DF K$$DASË,Ì MOV KDSAR5,-(SP) ;;;SAVE KERNEL DATA APR5+Í MOV X.REL-X.PSW(R5),KDSAR5 ;;;MAP TO ISRÎÏ .ENDCÐÑ!Ò MOV X.REL-X.PSW(R5),KINAR5 ;;;RÓÔ .ENDCÕÖ*×$INTS2: MTPS (R5)+ ;;;LOAD ISR PRIORITY5Ø BISB (R5)+,R4 ;;;ADD CONSTANT TO CONTROLLER NUMBERH-Ù CACHE$ SAVE ;;;SAVE BYPASS STATE OF CACHESÚÛÜ .IF DF R$$RSVÝ!Þ MOV R3,-(SP) ;;;SAVE REGISTERSDß MOV R2,-(SP) ;;; à MOV R1,-(SP) ;;;0á MOV R0,-(SP) ;;;;âã .IFTFä.ä$WPIN0::CALL @(R5)+ ;;;CALL ISR ; BM375ä ; BM375Vä .IF DF R$$WPT ; BM375Xä ; BM375P2ä NOP ;;;SPACE TO PLUG WATCHPOINT JSR ; BM375ä ; BM375ä .ENDC ; R$$WPT ; BM3755ä ; BM375Iæ ;**-14ç .IFTOè7é CMP (SP)+,R0 ;;;MAKE SURE DRIVER DIDN'T DESTROY REGSS%ê BEQ 30$ ;;;IF EQ R0 IS UNMODIFIEDVAë20$: BGCK$A BF.INT,BE.ISR,FATAL ;;;DRIVER DESTROYED REGS IN ISRM,ì30$: CMP (SP)+,R1 ;;;HAS R1 BEEN MODIFIED?í BNE 20$ ;;;IF NE YES(î CMP (SP)+,R2 ;;;HAS R2 BEEN MODIFIED?ï BNE 20$ ;;;IF NE YES(ð CMP (SP)+,R3 ;;;HAS R3 BEEN MODIFIED?ñ BNE 20$ ;;;IF NE YESòó .ENDCôõ2ö CACHE$ UNSAVE ;;;RESTORE BYPASS STATE OF CACHE÷øù .IF DF K$$DASú/û MOV (SP)+,KDSAR5 ;;;RESTORE KERNEL DATA APR5Rüý .ENDCþÿ6 MOV (SP)+,KINAR5 ;;;RESTORE KERNEL INSTRUCTION APR5$ BR $INTX1 ;;;EXIT FROM INTERRUPT ; BM375S .IF DF R$$WPT ; BM375H ; BM375E$WPIN3::MOV R5,$WPLST ;SAVE ADDRESS OF LAST SYSTEM ROUTINE ; BM375B. CALL (R5) ;CALL THE CALLER BACK ; BM375. BR WPIN4 ;FINISH IN COMMON CODE ; BM375G$WPIN2::MOV (R5),$WPLST ;SAVE ADDRESS OF LAST SYSTEM ROUTINE ; BM375% CALL @(R5)+ ;CALL ISR ; BM375SEWPIN4:: CMP $WPVAL,@$WPADR ;DID WATCHED LOCATION CHANGE ? ; BM375N7 BEQ 1$ ;IF EQ NO (ONE OF THESE IS NOP'D BY ; BM375E5 BNE 1$ ;IF NE NO THE SET WATCH COMMAND) ; BM375 * BPT ;LET XDT KNOW ABOUT IT ; BM375=1$: RETURN ;RETURN TO PROPER REAL INTS.. ROUTINE ; BM375  ; BM375)" .ENDC ; DF R$$WPT ; BM300xbv)vtöt÷tø tþfDATA75 ; BM375I;+; **-$INTSV-INTERRUPT SAVE5; **-$INTSE-INTERRUPT SAVE FOR ERRORLOGGING DEVICES ;D; THIS ROUTINE IS CALLED FROM AN INTERRUPT SERVICE ROUTINE WHEN ANC; INTERRUPT IS NOT GOING TO BE IMMEDIATELY DISMISSED. A SWITCH TO G ; THE SYSTEM STACK IS EXECUTED IF THE CURRENT STACK DEPTH IS +1. WHENNJ ; THE INTERRUPT SERVICE ROUTINE FINISHES ITS PROCESSING, IT EITHER FORKS, ; , JUMPS TO $INTXT, OR EXECUTES A RETURN. ; ; INPUTS:);.&; 4(SP)=PS WORD PUSHED BY INTERRUPT.&; 2(SP)=PC WORD PUSHED BY INTERRUPT.-; 0(SP)=SAVED R5 PUSHED BY 'JSR R5,$INTSV'.R!; 0(R5)=NEW PROCESSOR PRIORITY.U;I ; OUTPUTS:;T@; REGISTER R4 IS PUSHED ONTO THE CURRENT STACK AND THE CURRENT;; STACK DEPTH IS DECREMENTED. IF THE RESULT IS ZERO, THENX?; A SWITCH TO THE SYSTEM STACK IS EXECUTED. THE NEW PROCESSOR A; STATUS IS SET AND A CO-ROUTINE CALL TO THE CALLER IS EXECUTEDP>; R4 IS SET WITH THE CONTROLLER INDEX*2, WHICH IS DETERMINED; FROM THE PSW AT ENTRY.;-$INTSE:: ;;;REFERENCE LABELR7$INTSV::JSR R4,(PC) ;;;SAVE R4 WHILE PRESERVING CC'S (  MFPS R4 ;;;RETRIEVE CONTROLLER INDEX/! BIC #177760,R4 ;;;MASK OFF CONTROLLER NUMBERE#" ASL R4 ;;;CONVERT TO WORD INDEXT#2$:T$;+%; ** W A R N I N G ** &;R'; SPM HOOKPOINT NUMBER 29.(;M+); DO NOT CHANGE THE INSTRUCTION FOLLOWINGT*; LABEL WITHOUT CHECKING SPM+;-,--$SPH29==. ;SPM CHANGES THE INSTRUCTION ATR!. ;THE LOCATION OF THIS LABEL/!0 DEC @#$STKDP ;;;SWITCH STACKS?123 .IF DF K$$DAS4*53$: MOV PS,-(SP) ;;;SAVE CURRENT PS WORD/6 BIC #PMODE,PS ;;;SET PREVIOUS MODE TO KERNELR67 MFPI (R5)+ ;;;RETRIEVE CLEAR MASK FOR NEW PRIORITY+8 BIC (SP)+,(SP) ;;;CLEAR FOR NEW PRIORITYT#9 MOV (SP)+,PS ;;;SET NEW PRIORITYR:; .IFFK<'=3$: BIC (R5)+,PS ;;;LOAD NEW PRIORITY >? .ENDC@A-B CACHE$ SAVE ;;;SAVE BYPASS STATE OF CACHES7B$WPIN1::CALL (R5) ;;;CALL THE CALLER BACK ; BM375CB ; BM375B .IF DF R$$WPT ; BM375CB ; BM375D2B NOP ;;;SPACE TO PLUG WATCHPOINT JSR ; BM375B ; BM375SB .ENDC ; R$$WPT ; BM375B ; BM375R@D$INTSF::CACHE$ UNSAVE ;;;RESTORE BYPASS STATE OF CACHE ;**-1EF;+G; **-$INTXT-INTERRUPT EXITH;RJI; THIS ROUTINE IS ENTERED VIA A RETURN TO EXIT FROM AN INTERRUPT. IF THEBJ; STACK DEPTH IS NOT EQUAL TO ZERO, THEN REGISTERS R4 AND R5 ARE@K; RESTORED AND AN RTI IS EXECUTED. ELSE A CHECK IS MADE TO SEEDL; IF THERE ARE ANY ENTRIES IN THE FORK QUEUE. IF NONE, THEN R4 ANDBM; R5 ARE RESTORED AND AN RTI IS EXECUTED. ELSE REGISTERS R3 THRUGN; R0 ARE SAVED ON THE CURRENT STACK AND A DIRECTIVE EXIT IS EXECUTED.SO;;P; INPUTS: (MAPPED SYSTEM)HQ;*'R; 06(SP)=PS WORD PUSHED BY INTERRUPT.T'S; 04(SP)=PC WORD PUSHED BY INTERRUPT. T; 02(SP)=SAVED R5.U; 00(SP)=SAVED R4.V;-W X .ENABL LSBL+Y$INTX1::MTPS #PR7 ;;;LOCK OUT INTERRUPTSE#Z TST $STKDP ;;;STACK DEPTH ZERO? [ BEQ 2$ ;;;IF EQ YES \ JMP 10$ ;;;IF NE NOI]2$: ;;;REFERENCE LABELE^_` .IF NDF M$$PROEa)b TST $FRKHD ;;;ANYTHING IN FORK QUEUE?Uc BEQ 10$ ;;;IF EQ NO de .IFF fg-h CACHE$ BYPASS ;;;SEE IF THERE IS ANY WORKM(i MOV $IIPND,R4 ;;;GET URM NEEDING WORK/j MOV $IICPU,R5 ;;;GET THOSE WITH INTS PENDINGYk CACHE$ RESTOR9l BIC @$CPURM,R5 ;;;DON'T CONSIDER OURSELVES INTERRUPTED 5m BIC R5,R4 ;;;CLEAR THOSE PEOPLE WITH INTS PENDINGT1n BEQ 10$ ;;;IF EQ NO WORK FOR US OR ANYONE NOTEo ;;;ALREADY INTERRUPTEDpq .ENDCrst;AFu; ENTER THE EXECUTIVE. THERE IS EITHER WORK SPECIFICALLY FOR US, OR/v; WORK FOR SOMEONE NOT CURRENTLY INTERRUPTED.w;x"y3$: MTPS #0 ;;;ALLOW INTERRUPTS*z MOV R3,-(SP) ;SAVE REGISTERS R3 THRU R0{ MOV R2,-(SP) ;P| MOV R1,-(SP) ;I} MOV R0,-(SP) ;~4$: LOCK$ $EXECL,WAITC€;+�; **-$DIRXT-DIRECTIVE EXIT‚;EFƒ; THIS ROUTINE IS CALLED VIA A JUMP TO EXIT FROM A DIRECTIVE OR TRAPE„; SERVICE ROUTINE. IF THERE ARE ANY ENTRIES IN THE FORK QU00xjv;vt´cÚµcÛ¶c�·c›’EUE, THENE…; THE FIRST ENTRY IS REMOVED AND THE FORK ROUTINE IS EXECUTED. ELSEKF†; A CHECK IS MADE TO SEE IF REDISPATCHING OF THE PROCESSOR IS NECES-C‡; SARY. IF NOT, THEN REGISTERS R0 THRU R5 ARE RESTORED AND AN RTIV@ˆ; IS EXECUTED. ELSE THE PROCESSOR IS REDISPATCHED AND THE EXIT‰; SEQUENCE IS EXECUTED AGAIN.EŠ;I‹; INPUTS: (MAPPED SYSTEM)IŒ;V/�; 16(SP)=PS WORD PUSHED BY INTERRUPT OR TRAP.M/Ž; 14(SP)=PC WORD PUSHED BY INTERRUPT OR TRAP.O�; 12(SP)=SAVED R5.�; 10(SP)=SAVED R4.‘; 06(SP)=SAVED R3.’; 04(SP)=SAVED R2.“; 02(SP)=SAVED R1.”; 00(SP)=SAVED R0.•;-–—˜™ .IF DF M$$PROš)›$DIRXT::CLR R5 ;INITIALIZE TCB POINTERN+œDIRXT1: MTPS #PR7 ;;;LOCK OUT INTERRUPTSD�ž .IF DF R$$WPTŸ.  CMP $WPVAL,@$WPADR ;;;WATCHPOINT STILL OK ?&¡ ;;;ONE OF THE FOLLOWING BRANCHES'¢ ;;;SHOULD BE NO-OPED TO START THE £ ;;;WATCHPOINTS#¤$WPBR:: BEQ 1$ ;;;IF EQ STILL OK ¥ BNE 1$ ;;;IF NE STILL OK¦ BPT ;;;OOOOOOPPPPPSSS!!! §1$: ;;;REFERENCE LABELS¨© .ENDC ; DF R$$WPTª« CACHE$ BYPASS+¬ MOV $IIPND,R3 ;;;ANY WORK IN FORK QUEUE?­ CACHE$ RESTOR® BIT @$CPURM,R3 ;;;ANY WORK?¯ BNE 20$ ;;;IF NE YES°± .IFF;²+³$DIRXT::MTPS #PR7 ;;;LOCK OUT INTERRUPTS´µ .IF DF R$$WPT¶.· CMP $WPVAL,@$WPADR ;;;WATCHPOINT STILL OK ?&¸ ;;;ONE OF THE FOLLOWING BRANCHES'¹ ;;;SHOULD BE NO-OPED TO START THEBº ;;;WATCHPOINTS#»$WPBR:: BEQ 1$ ;;;IF EQ STILL OKK¼ BNE 1$ ;;;IF NE STILL OK½ BPT ;;;OOOOOOPPPPPSSS!!!S¾1$: ;;;REFERENCE LABEL¿À .ENDC ; DF R$$WPTÁ* MOV $FRKHD,R3 ;;;ANYTHING IN FORK QUEUEà BNE 20$ ;;;IF NE YESÄÅ .ENDCÆÇ1È TSTB $CXDBL ;;;IS CONTEXT SWITCHING DISABLED?SÉ BEQ 5$ ;;;IF EQ NO4Ê MOV $TKTCB,R5 ;;;PICK UP CURRENT TASK TCB ADDRESS8Ê TST T.ASTL(R5) ;;;AST QUEUED FOR THIS TASK? ;KLN025#Ê BNE 5$ ;;;IF NE YES ;KLN025T9Ï TSTB T.ST2(R5) ;;;TASK EXITING (DUE TO ABORT)? ;**-4 Ð BPL 6$ ;;;IF PL NO#Ñ JMP TEXIT ;;;INITIATE TASK EXITO-Ò5$: MOV @$RQSCH,R5 ;;;SCHEDULING REQUESTED?Ó BEQ 6$ ;;;IF EQ NOÔ JMP 40$ ;;;IF NE YES-Õ6$: ULOCK$ $EXECL,WAIT ;;;RELEASE EXECUTIVEÖ×;C>Ø; CHECK TO SEE IF THERE IS ANY WORK FOR THE EXECUTIVE TO DO.Ù;5?Ú; THIS SECTION OF CODE MAY BE ENTERED FROM A NUMBER OF AREAS:EÛ;4Ü; 1. FROM THE ENTRANCE TO THE IDLE LOOP AFTER PR7Ý; UNLOCKING THE EXECUTIVE.Þ;23ß; 2. AFTER UNLOCKING THE EXECUTIVE IN $DIRXT PR7 *à; JUST PRIOR TO RESTORING THE REGISTERS.á;;3â; 3. FROM ANY NON-PR7 SECTION OF CODE IN THE PR0I+ã; IDLE LOOP. IN THIS CASE, WE CAN NOT BEP+ä; JERKED OUT OF THIS CODE SINCE $IDLFL IS;*å; NEGATIVE, INFORMING $QFORK NOT TO CRAM)æ; THE STACK WITH THE ADDRESS OF DIRXT2. ç;. è; ---------Sé;I,ê; THIS SECTION OF CODE HAS THREE OUTCOMES:ë;ì;@í; 7$: THERE IS NO CURRENT WORK FOR US, BUT WORK IS PENDING FOR@î; ANOTHER CPU. INTERRUPT THEM AND CHECK OUR WORK PENDING ONCEï; MORE BEFORE EXITING AT 8$.ð;NAñ; 8$: THERE IS NO WORK FOR US AND NO WORK PENDING FOR ANY OTHERT<ò; CPU. WE WILL EXIT BACK TO WHENCE WE CAME; THE IDLE LOOPó; OR AN ACTIVE USER TASK.Iô;ICõ; 15$: THERE DEFINATELY WORK FOR US, SO WE REENTER THE EXECUTIVE,E<ö; CLEARING THE IDLE FLAG ($IDLFL) IN CASE WE CAME FROM THE÷; IDLE LOOP.ø;Eùúû .IF DF M$$PROüýDIRXT2: CACHE$ BYPASSK#þ MOV $IIPND,R4 ;;;GET PENDING URM ÿ BEQ 8$ ;;;IF EQ NO WORKA$ BIT @$CPURM,R4 ;;;ANY WORK FOR US BNE 15$ ;;;IF NE YES3 BIC $IICPU,R4 ;;;CLEAR THOSE ALREADY INTERRUPTEDD BEQ 8$ ;;;IF EQ NO NEW WORKW5 MOVB $EXECL+1,R5 ;;;GET PROCESSOR IN EXEC (IF ANY)A" BMI 7$ ;;;IF MI NO ONE IN EXEC) ASL R5 ;;;MAKE CPU ID INTO WORD INDEXR0 BIC $URMTB(R5),R4 ;;;ANY WORK HE CAN'T HANDLE BEQ 8$ ;;;IF EQ NO  ;  ; INTERRUPT OTHER CPU ;F 7$: CACHE$ RESTOR $ CALL $IISVC ;INTERRUPT OTHER CPU% CACHE$ BYPASS ;;;AVOID STALE DATAW2 BIT @$CPURM,$IIPND ;;;ANY LAST NSEC WORK FOR US& BNE 15$ ;;;IF NE YES -- ENTER EXEC; ,; EXIT E00xrv)vtöt÷tø tþfDATAXECUTIVE TO USER TASK OR IDLE LOOP;R8$: CACHE$ RESTOR;& TSTB $IDLFL ;;;ARE WE IN IDLE LOOP BEQ 9$ ;;;IF EQ NO% MOVB #1,$IDLFL ;;;SET IN IDLE LOOPR3 MOV #$IDLPT,R1 ;;;RESTORE REGISTER FOR IDLE LOOPA MTPS #0 ;;;ALLOW INTERRUPTS$ JMP IDLE ;EXIT BACK TO IDLE LOOP  .IFTF!2"9$: MOV (SP)+,R0 ;;;RESTORE REGISTERS R0 THRU R3# MOV (SP)+,R1 ;;;S$ MOV (SP)+,R2 ;;;C% MOV (SP)+,R3 ;;;S&'10$:(;+); ** W A R N I N G **S*;N+; SPM HOOKPOINT NUMBER 30.,;I+-; DO NOT CHANGE THE INSTRUCTION FOLLOWING .; LABEL WITHOUT CHECKING SPM/;-0-1$SPH30==. ;SPM CHANGES THE INSTRUCTION AT1!2 ;THE LOCATION OF THIS LABELV3(4 INC @#$STKDP ;;;INCREMENT STACK DEPTH.5 MOV (SP)+,R4 ;;;RESTORE REGISTERS R4 AND R56 MOV (SP)+,R5 ;;;O78;+!9; NONSENSE INTERRUPT ENTRY/EXITE:;-;<$NONSI::RTI ;;;M=> .IFT;?@A;P:B; ENTER EXECUTIVE FROM EXIT OF $DIRXT OR FROM IDLE LOOP.C;NFD; THE ONLY DIFFERENCE BETWEEN THE TWO ENTRY CONDITIONS IS THAT IF WEFE; ARE ENTERING FROM THE IDLE LOOP, THEN WE MUST CLEAR OUT THE $IDLFLKF; SINCE WE ARE NOT GOING TO BE IDLE ANYMORE. OTHERWISE $IDLFL IS ALREADYE G; ZERO.IH;$I,J15$: CACHE$ RESTOR ;;;RESTORE CACHE STATE8K CLRB $IDLFL ;;;SHOW NOT IN IDLE LOOP WHETHER WE WEREL MTPS #0 ;;;OR NOTUM BR 4$ ;;;ENTER EXECUTIVEN"N .ENDC ; DF M$$PRO ;JWB213P ;**-1CQR;MS; EXECUTE FORK ROUTINET;O<U; FORK ROUTINES ARE ENTERED VIA A CALL WITH THE ARGUMENTS:V;I4W; R3=ADDRESS OF THE BEGINNING OF THE FORK BLOCK+2. X; R4=RESTORED FROM FORK BLOCK. Y; R5=RESTORED FROM FORK BLOCK.Z;M[\20$: MTPS #PR7] LOCK$ $FORKL,SPIN^_` .IF DF M$$PROa(b MOV #$FRKHD,R3 ;;;GET "CURRENT" ENTRY5c22$: MOV R3,R2 ;;;MAKE CURRENT INTO PREVIOUS ENTRY05d MOV (R2),R3 ;;;GET NEW CURRENT -- AT END OF LIST?Ce BNE 24$ ;;;IF NE NO3fg; Fh; END OF FORK LIST. IF WE GET TO HERE THEN WE HAVENT FOUND ANYTHING?i; TO DO IN THIS PASS. WE CAN NOW CLEAR OUT OUR URM BITS FROMO!j; THE PENDING URM MASK, $IIPND..k; l+m BIC @$CPURM,$IIPND ;;;CLEAR OUT OUR BITSM+n BIC @$CPURM,$IICPU ;;;CLEAR OUT OUR BITSL'o BR 30$ ;;;EXIT FROM FORK PROCESSINGOp7q24$: BIT -2(R3),@$CPURM ;;;IS THIS FORK BLOCK FOR US?,r BNE 26$ ;;;IF NE YES)s TST -2(R3) ;;;CAN ANY CPU PROCESS IT?C*t BNE 22$ ;;;IF NE NO -- GO GET NEXT ONE.u26$: INC $FRKCT ;;;BUMP FORK DEQUEUED COUNT)v MOV (R3),(R2) ;;;LINK NEXT TO PREVIOUS!w BNE 30$ ;;;IF NE NOT NEW LAST "x MOV R2,$FRKHD+2 ;;;SET NEW LASTyz .IFF {#| MOV $FRKHD,R3 ;;;GET FIRST ENTRY$2} MOV (R3),$FRKHD ;;;REMOVE ENTRY FROM FORK QUEUE~ BNE 30$ ;;;IF NE NOT LAST04 MOV #$FRKHD,$FRKHD+2 ;;;RESET FORK QUEUE LISTHEAD€� .ENDC‚ƒ„30$: ULOCK$ $FORKL,SPIN2 … MTPS #0†‡ˆ .IF DF M$$PRO‰$Š TST R3 ;DO WE HAVE A FORK BLOCK?$‹ BNE 35$ ;IF NE YES -- PROCESS IT+Œ JMP $DIRXT ;GO BACK TO CYCLE THRU AGAIN3�35$: ;REFERENCE LABELŽ� .ENDC�‘’ MTPS #0 ;;;ALLOW INTERRUPTSK#“ ADD #10,R3 ;POINT PAST SAVED R4”•– .IF DF K$$DAS—˜ MOV (R3),KDSAR5 ;MAP DRIVER™š .ENDC›œ�;+ž; ** W A R N I N G **TŸ;0 ; SPM HOOKPOINT NUMBER 72.¡;F+¢; DO NOT CHANGE THE INSTRUCTION FOLLOWING0£; LABEL WITHOUT CHECKING SPM¤;-¥-¦$SPH72==. ;SPM CHANGES THE INSTRUCTION ATA!§ ;THE LOCATION OF THIS LABELS¨© MOV (R3),@#KINAR5 ;,ª MOV -(R3),R4 ;RESTORE REGISTERS R4 AND R5« MOV -(R3),R5 ;« ; BM375M« .IF DF R$$WPT ; BM375A« ; BM375TB« MOV -2(R3),$WPLST ;SAVE ADDRESS OF LAST SYSTEM ROUTINE ; BM375« ; BM375"« .ENDC ; DF R$$WPT ; BM375« ; BM375O"¬ CALL @-(R3) ;CALL FORK ROUTINE­ JMP $DIRXT ;TRY EXIT AGAIN®¯; °; RESCHEDULING OR POWERFAIL±;H²#³40$: MTPS #0 ;;;ALLOW INTERRUPTS´µ .IF DF P$$RFL¶· TST $PWRFL ;POWER FAILURE?¸ BEQ RESCH ;IF EQ NOS0¹ CALL $POWER ;EXECUTE POWER RECOVERY ROUTINESº»¼ .IF DF M$$P00xzv;vt´cÚµcÛ¶c�·c›’RO½4¾ MOV @$RQSCH,R5 ;RENEW VALUE OF RESCHEDULE POINTER¿À .IFFAÁ& JMP $DIRXT ;CYCLE BACK THRU $DIRXTÃÄ .ENDCÅÆ .ENDC ; DF P$$RFLÇ È .DSABL LSBÉÊ; Ë; RESCHEDULING REQUESTEDÌ;OÍ Î .ENABL LSB$.ÏRESCH: CLR @$RQSCH ;CLEAR SCHEDULE REQUESTSÐÑÒ .IF DF M$$PROÓÔ;+Õ; ** W A R N I N G **TÖ;×; SPM HOOKPOINT NUMBER 71.Ø;F+Ù; DO NOT CHANGE THE INSTRUCTION FOLLOWINGÚ; LABEL WITHOUT CHECKING SPMÛ;-Ü-Ý$SPH71==. ;SPM CHANGES THE INSTRUCTION ATR!Þ ;THE LOCATION OF THIS LABELPß*à MOV @#$TKTCB,R4 ;FETCH CURRENT TASK TCB á BEQ 4$ ;IF EQ NO CURRENT TCB-â BIC #TS.RUN,T.STAT(R4) ;REMOVE RUNNING BIT:ã BIT #TS.CKR,T.STAT(R4) ;CHECKPOINT REQUESTED THIS TASK?ä BEQ 4$ ;IF EQ NO,å BIC #TS.CKR,T.STAT(R4) ;CLEAR THE REQUEST4æ ADD #T.ATT,R4 ;POINT TO ATTACHMENT DESCR LISTHEAD-ç3$: MOV (R4),R4 ;GET NEXT ATTACHMENT DESCR è BEQ 4$ ;IF EQ THERE IS NONEA1é MOV A.PCB-A.TCBL(R4),R1 ;POINT TO ATTACHED PCBS7ê BIT #PS.CKR,P.STAT(R1) ;CHECKPOINT REQUEST THIS PCB?Ië BEQ 3$ ;IF EQ NO3ì BIC #PS.CKR,P.STAT(R1) ;CLEAR CHECKPOINT REQUEST &í CALL $ICHKP ;TRY TO CHECKPOINT NOW î BR 3$ ;Nïð;Gñ; IF CPU IS GOING OFFLINE, THEN GO STRAIGHT TO IDLE LOOP. DON'T ENTERF7ò; SCHEDULING LOOP. DON'T PASS GO. DON'T COLLECT 200$.Aó;.ô.õ4$: BIT $CPBIT,$URMST ;IS CPU GOING OFFLINE?ö BNE 5$ ;IF NE NO(÷ CLR R5 ;SIMULATE SCHED. LOOP FAILURE"ø BR 33$ ;MOVE TOWARD IDLE STATEùú .IFF ;M$$PROCû;+ü; ** W A R N I N G **Cý;Oþ; SPM HOOKPOINT NUMBER 71.ÿ;;+; DO NOT CHANGE THE INSTRUCTION FOLLOWINGE; LABEL WITHOUT CHECKING SPM;--$SPH71==. ;SPM CHANGES THE INSTRUCTION ATC! ;THE LOCATION OF THIS LABELH .ENDC=5$: MOV #T2.STP!T2.SPN!T2.WFR,R1 ;SET STP,SPN, AND WFR MASKO# MOV #T2.WFR,R4 ;SET WAITFOR MASKB#  MOV #T2.SEF,R0 ;SET STOPFOR MASKB? 10$: MOV T.ST2(R5),R3 ;PICK UP CONTENTS OF SECOND STATUS WORD $  MOV T.STAT(R5),R2 ;TASK BLOCKED ?  BNE 25$ ;IF NE YES  .IF DF M$$PRO9 BIT @$CPCRM,T.RRM(R5) ;CAN TASK RUN ON THIS PROCESSOR?T BNE 30$ ;NO IF NE ? BIT #T4.SNC,T.ST4(R5) ;TASK USE COMMONS FOR SYNCHRONIZATION?T BEQ 15$ ;IF EQ NO : BIT #T2.ABO!T2.HLT,T.ST2(R5) ;TASK EXITTING OR ABORTED?! BNE 15$ ;IF NE YES IT CAN RUNW0 MOV T.PCB(R5),R2 ;GET TASK REGION PCB ADDRESS .IF DF X$$HDR5 MOV P.HDR(R2),-(SP) ;GET VIRTUAL ADDRESS OF HEADERS# BNE 12$ ;IF NE, RESIDENT HEADER,/ MOV P.REL(R2),KISAR6 ;MAP TO EXTERNAL HEADER2 MOV #140000,(SP) ;SET VIRTUAL ADDRESS OF HEADER212$: MOV (SP)+,R2 ;GET VIRTUAL ADDRESS OF HEADER ! .IFF ; DF X$$HDRR"*# MOV P.HDR(R2),R2 ;GET ADDRESS OF HEADER$% .IFTF ; DF X$$HDR&5' CALL $CKMAP ;ANOTHER TASK MAPPED TO SAME REGION ?E() .ENDC ; DF X$$HDR*&+ BCS 30$ ;IF CS YES, SKIP THIS TASK;, MOV T.ST2(R5),R3 ;RESTORE CONTENTS OF SECOND STATUS WORDE-15$: ;REFERENCE SYMBOL./ .ENDC01!2 MOV T.ASTL(R5),R2 ;AST QUEUED?S3 BEQ 20$ ;IF EQ NOA64 BIT #T2.AST!T2.DST,R3 ;AST IN PROGRESS OR DISABLED?5 BEQ 70$ ;IF EQ NOG(6 TSTB A.CBL(R2) ;BUFFERED I/O REQUEST?7 BMI 70$ ;IF MI YES8820$: BIT R1,R3 ;IS TASK STOPPED,SUSPENDED, OR IN WFR?"9 BEQ 60$ ;NO, RESTART THIS TASK: BIT R4,R3 ;WAITFOR STATE?%; BEQ 30$ ;IF EQ NO, SKIP THIS TASK <-= ASSUME T2.HLT,200 ;T2.HLT MUST BE SIGN BITS>2? TSTB T.ST2(R5) ;TASK MARKED FOR EXIT OR ABORT ?@ BMI 50$ ;IF MI YES4A BIT T.EFLM(R5),@T.EFLM+2(R5) ;WAITFOR SATISFIED ?B BNE 50$ ;IF NE YES&C BIT R0,R3 ;TASK IN STOPFOR STATE ?D BEQ 30$ ;IF EQ NO 7E BIT #T2.AST!T2.STP,R3 ;TASK STOPPED OR AT AST STATE?7F BNE 30$ ;IF NE YES0G BIT #T2.SEF,R3 ;TASK STOPPED FOR EVENT FLAG ?H BNE 24$ ;IF NE YES2I TSTB T.TIO(R5) ;TASK HAVE ACTIVE BUFFERED I/O ?&J BEQ 30$ ;IF EQ NO, GO TO NEXT TASK#K24$: MOV R5,R0 ;COPY TCB ADDRESS L CALL $STPTK ;STOP THE TASK+M BR 5$ ;BRANCH TO SET UP REGISTERS AGAIN 9N25$: BIC #TS.BLC,R2 ;TASK BLOCKED FOR CHECKPOINT ONLY ??/O BNE 29$00x‚v)vtöt÷tø tþfDATA ;IF NE NO, CANNOT REQUEST THIS TASKSP BIT #T2.STP,R3 ;TASK STOPPEDQ#Q BEQ 30$ ;IF EQ NO, DON'T UNSTOPS&R BIT R0,R3 ;TASK IN STOPFOR STATE ?,S BEQ 30$ ;IF EQ NO, DON'T TRY TO SCHEDULE4T BIT T.EFLM(R5),@T.EFLM+2(R5) ;STOPFOR SATISFIED ?#U BEQ 30$ ;IF EQ NO, DON'T UNSTOP3V MOV T.ACTL(R5),-(SP) ;REMEMEBER TCB OF NEXT TASK0W MOV R5,R0 ;COPY TCB ADDRESSP.X BIC #T2.STP*2!T2.STP,T.ST2(R0) ;UNSTOP TASK$Y CALL $EXRQS ;REQUEST TASK TO RUN)Z MOV (SP)+,R5 ;RESTORE NEXT TCB ADDRESSB+[ CLR @$RQSCH ;CLEAR POSSIBLE RESCHEDULES0\ BR 5$ ;RESET REGISTERS AND CONTINUE ATL SCAND]29$: CMP #TS.CIP,T.STAT(R5) ;ONLY WAITING FOR CHECKPOINT TO OCCUR?0^ BNE 30$ ;IF NE NO, CAN'T ATTEMPT TO SCHEDULE)_ TSTB T.ST2(R5) ;TASK WAITING TO EXIT ?` BPL 30$ ;IF PL, NOT EXITING'a MOV T.ASTL(R5),R4 ;ANY ASTS QUEUED ?Ob BEQ 70$ ;IF EQ, NO"c MOVB A.CBL(R4),R4 ;KERNEL AST ?.d BMI 70$ ;IF MI, YES DON'T DISTURB AST FLAG'e BR 60$ ;NO, DON'T SERVICE USER ASTS 1f30$: MOV T.ACTL(R5),R5 ;GET ADDRESS OF NEXT TCBPg BNE 10$ ;IF NE OKAYBh33$: ;REFERENCE LABELij5k TALLY$ B.IDCT,XA$$ID,CPU ;COUNT AN IDLE LOOP ENTRYOlmn .IF DF A$$CNTo,p TSTB $BILNG ;ARE WE BILLING CPU TIME NOWq BNE 35$ ;IF NE NOA-r CALL $CPUTM ;TERMINATE BILLING HERE SINCEN$s ;WE PROBABLY WILL GO IDLE, AND.t35$: ;DEFINITELY WILL DO A CONTEXT SWITCHuv .ENDCwx=y; GO VISIT THE IDLE LOOP IN ITS NEW HOME AT THE END OF THISO7z; MODULE. THIS KEEPS THE BRANCHES ABOVE FROM BREAKINGR{"| JMP IDOL ;SORRY ABOUT THE NAME} ;I COULDN'T RESIST~€�;T&‚; WAITFOR SATISFIED-CLEAR WAIT STATEƒ;N„…†‡ .IF DF D$$PARˆ6‰50$: MOV KINAR5,-(SP) ;SAVE KERNEL INSTRUCTION APR 54Š MOV $DRAPR,KINAR5 ;MAP TO THE DIRECTIVE PARTITION‹Œ .IFF �Ž50$: ;REFERENCE SYMBOL�� .IFTF‘3’ MOV T.PCB(R5),R4 ;GET ADDRESS OF TASK REGION PCB“” .IF DF X$$HDR•5– MOV P.HDR(R4),-(SP) ;GET VIRTUAL ADDRESS OF HEADERE.— BNE 55$ ;IF NE NOT AN EXTERNAL TASK HEADER/˜ MOV P.REL(R4),KISAR6 ;MAP TO EXTERNAL HEADERE2™ MOV #140000,(SP) ;SET VIRTUAL ADDRESS OF HEADER2š55$: MOV (SP)+,R4 ;GET VIRTUAL ADDRESS OF HEADER›œ .IFF ; DF X$$HDRS�,ž MOV P.HDR(R4),R4 ;GET TASK HEADER ADDRESSŸ  .IFTF¡6¢ MOV T.EFLM+2(R5),R3 ;GET ADDRESS OF EVENT FLAG WORD£¤ .ENDC ;DF X$$HDR¥¦§ .IF DF G$$GEF¨2© CALL $DEAGF ;DEACCESS GROUP GLOBAL EVENT FLAGSª« .ENDC ; DF G$$GEF¬­® .IFTF¯$° MOV (SP)+,KINAR5 ;RESTORE MAPPING±² .ENDC³´%µ DEC T.ST2(R5) ;CLEAR WAITFOR STATEE'¶ BMI 60$ ;IF MI TASK IS AT AST STATEE4· BIC #T2.SEF!T2.STP,T.ST2(R5) ;CLEAR STOPFOR STATE¸¹;Rº; RESTART OR CONTINUE A TASK»;V¼3½60$: CLR R4 ;SET FLAG TO SIGNIFY RESTART OF TASK8¾70$: MOVB T.PRI(R5),@$CURPR ;SET CURRENT TASK PRIORITY¿ÀÁ .IF DF M$$PROÂ2à BIS #TS.RUN,T.STAT(R5) ;SHOW TASK ACTIVE ON CPUÄÅ .IFTFÆ4ÇSTCTX: ;REFERENCE LABEL FOR ENTRY FROM THE IDLE È ;LOOPK4É72$: MOV #H.DSW,R0 ;POINT TO DIRECTIVE STATUS WORD4Ê MOV $SAHPT,R3 ;GET ADDRESS OF CURRENT TASK HEADER"Ë BEQ 80$ ;IF EQ NO CURRENT TASKÌÍ .IF DF X$$HDRÎ#Ï MOV $SAHDB,KISAR6 ;MAP TO HEADERCÐÑ .ENDC ; DF X$$HDRÒ+Ó CMP R5,$TKTCB ;NEW TASK SAME AS CURRENT?SÔ BNE 73$ ;IF NE NO5ÕÖ .IFTT×!Ø MOV $TKTCB,R2 ;GET TCB ADDRESSD)Ù BIT #T2.HLT,T.ST2(R2) ;IS TASK HALTED?O2Ú BNE 73$ ;IF NE YES -- SAVE AND RESTORE CONTEXTÛÜ .ENDCÝÞ)ß JMP 130$ ;NO CONTEXT SWITCH NECESSARYVàá;0 â; SAVE CONTEXT OF CURRENT TASKã;Väå73$:æ;+ç; ** W A R N I N G **Dè;é; SPM HOOKPOINT NUMBER 04.ê;+ë; DO NOT CHANGE THE INSTRUCTION FOLLOWING;ì; LABEL WITHOUT CHECKING SPMí;-î-ï$SPH04==. ;SPM CHANGES THE INSTRUCTION ATS!ð ;THE LOCATION OF THIS LABELFñ0ò MOV H.GARD(R3),R2 ;POINT TO HEADER GUARD WORDó ô MOV SP,R1 ;POINT TO SAVED R0õ MOV (R1)+,-(R2) ;SAVE R0Dö MOV (R1)+,-(R2) ;SAVE R1C÷ MOV (R1)+,-(R2) ;SAVE R2Nø MOV (R1)+,-(R2) ;SAVE R300xŠv;vt´cÚµcÛ¶c�·c›’ù MOV (R1)+,-(R2) ;SAVE R4Nú MOV (R1)+,-(R2) ;SAVE R5+û MOV (R1)+,-(R2) ;SAVE PCü MOV (R1),-(R2) ;SAVE PS#ý MFPI SP ;GET USER STACK POINTERT4þ MOV (SP)+,(R3) ;SAVE USER STACK POINTER IN HEADER5ÿ75$: MOV (R0),H.DSW(R3) ;SAVE DIRECTIVE STATUS WORD .IF DF F$$LPP7 MOV H.FPSA(R3),R2 ;POINT TO FLOATING POINT SAVE AREAD3 BEQ 77$ ;IF EQ TASK DOES NOT USE FLOATING POINT-& TST $HFMSK ;PROCESSOR HAVE A FPP ?' BMI 77$ ;IF MI NO, SKIP CTX STORAGEV1 MOV $TKTCB,R3 ;GET TCB ADDRESS OF CURRENT TASKN6  MOV T.PCB(R3),R1 ;GET ADDRESS OF TASK PARTITION PCB   .IF DF X$$HDR -  TST P.HDR(R1) ;TASK HAVE EXTERNAL HEADER ?) BEQ 76$ ;IF EQ YES, NO NEED TO RE-MAP  .ENDC ; DF X$$HDR. MOV P.REL(R1),KISAR6 ;MAP TO TASK PARTITION .IF DF P$$LAS4 ADD T.OFF(R3),KISAR6 ;ADD IN OFFSET TO TASK IMAGE .ENDC76$: ;REF LABEL+ STFPS (R2)+ ;SAVE FLOATING POINT STATUSI# SETD ;SET FLOATING DOUBLE MODE. STD R0,(R2)+ ;SAVE FLOATING POINT REGISTERS  LDD R4,R0 ;)! STD R0,(R2)+ ; " LDD R5,R0 ;B# STD R0,(R2)+ ;H$ STD R1,(R2)+ ;R% STD R2,(R2)+ ;E& STD R3,(R2)+ ;B'( .ENDC)* +77$: ;A,-. .IF DF A$$CNT/,0 TSTB $BILNG ;ARE WE BILLING CPU TIME NOW1 BNE 80$ ;IF NE NO 12 CALL $CPUTM ;ADD TIME USED TO USER ACCOUNTINGT53 MOV #H.DSW,R0 ;RESTORE DIRECTIVE STATUS WORD TO R045 .ENDC678;A9; LOAD CONTEXT OF NEW TASK:;F;,<80$: MOV R5,$TKTCB ;SET ADDRESS OF NEW TCB=>? .IF DF M$$PRO@AB .IF DF X$$HDRC3D CLR $SAHPT ;CLEAR HEADER PTR IN CASE $TKTCB = 0)EF .IFFRGH CLR $HEADR ;CLEAR HEADERIJ .ENDCK/L MOV R5,@$TKPTR ;SET NEW TCB ADDRESS IN TABLET&M BNE 81$ ;IF NE CURRENT TASK EXISTS!N JMP IDLE1 ;RE-ENTER IDLE LOOPC;O81$: BIT #T2.ABO!T2.HLT,T.ST2(R5) ;TASK MARKED FOR ABORT?EP BNE 82$ ;IF NE YES6Q MOVB $PROCN,T.CPU(R5) ;SAVE PROCESSOR NUMBER IN TCBR82$: ;REF SYMBOLST .ENDCUV3W TALLY$ B.CTXP,XA$$CX,CPU ;COUNT A CONTEXT SWITCHXYZ .IF DF A$$CNT[!\ MOV KISAR6,-(SP) ;SAVE MAPPINGE-] MOV T.ACN(R5),KISAR6 ;MAP ACCOUNTING BLOCK;"^ BEQ 825$ ;IF EQ, NO ACCOUNTING-_ CMPB #BT.TAB,@#B.TYP+140000 ;IS THIS A TAB` BNE 825$ ;IF NE NO%a ADD #1,@#B.CTXT+2+140000 ;COUNT ITDb ADC @#B.CTXT+140000 ;!c825$: MOV (SP)+,KISAR6 ;RESTORERde .ENDC ;A$$CNTfgh .IF DF D$$MNDi+j TST $DITCB ;IS DIAMOND WATCHING A TASK? k BEQ 83$ ;IF EQ NO.3l BIC #1,@$DICSR ;ASSUME NOT WATCHING CURRENT TASKN7m CMP $TKTCB,$DITCB ;IS DIAMOND WATCHING CURRENT TASK?,n BNE 83$ ;IF NE NO'o BIS #1,@$DICSR ;SET DIAMOND REGISTERCp83$: ;REFERENCE SYMBOLCqr .ENDCstu .IF DF S$$LIBv.w MOV #PMODE,PS ;INSURE PREVIOUS MODE IS USERxy .ENDCz{6| MOV T.PCB(R5),R3 ;GET ADDRESS OF TASK PARTITION PCB/} MOV P.HDR(R3),R2 ;GET ADDRESS OF TASK HEADERF~ .IF DF X$$HDR€%� BNE 84$ ;IF NE HEADER IS RESIDENTB7‚ MOV #$SAVSP,$HEADR ;POINT TO STACK POINTER SAVE AREAG8ƒ MOV #140000,R2 ;POINT TO START OF NON-RESIDENT HEADER3„ MOV P.REL(R3),KISAR6 ;MAP TO NON-RESIDENT HEADERI:… MOV P.REL(R3),$SAHDB ;REMEMBER TASK HEADER MAPPING BIAS!† BR 841$ ;AND JOIN COMMON CODEB9‡84$: MOV R2,$HEADR ;POINT TO HEADER SAVED STACK POINTERˆ‰ .ENDC ; DF X$$HDRŠ2‹841$: MOV R2,$SAHPT ;SAVE ADDRESS OF TASK HEADERŒ� .IF DF F$$MAP&X$$HDR&P$$LASŽ7� MOV H.FMAP(R2),$FMAPP ;LOAD FAST MAP CONTEXT POINTERS�"‘ .ENDC ; DF F$$MAP&X$$HDR&P$$LAS’%“ MOV R4,-(SP) ;SAVE EFFECT AST FLAG 5” MOV H.WND(R2),R4 ;POINT TO NUMBER OF WINDOW BLOCKS)0• TST W.BLVR+2(R4) ;IS TASK MAPPED TO THE EXEC?– BEQ 85$ ;IF EQ NOA*— MOV R2,R1 ;COPY ADDRESS OF TASK HEADER-˜ ADD R0,R1 ;POINT TO DIRECTIVE STATUS WORDH1™ MOV (R1)+,(R0)+ ;RESTORE DIRECTIVE STATUS WORDR6š MOV (R1)+,(R0)+ ;RESTORE POINTER TO FCS IMPURE AREA:› MOV (R1)+,(R0)+ ;RESTORE POINTER TO FORTRAN IMPURE AREA:œ MOV (R1)+,(R0)+ ;RESTORE POINTER TO OVERLAY IMPURE AREA8� MOV (R1)+,(R0)+ ;RE00x’v)vtöt÷tø tþfDATASTORE PTR TO VECTOR OF IMPURE PTRS3ž MOV #UINDR0,R0 ;POINT TO USER I DESCRIPTOR REG 0BŸ ¡ .IF DF K$$DAS!M$$PROA¢>£ MOV #<<<<$UTEND+77>*4>-400>&77400>!6,(R0)+ ;MIN SIZE NEEDED¤¥ .IFTF¦§¨ .IF DF M$$PRO©8ª MOV #177406,(R0) ;SETUP PRIV TASK PDR FOR 4K BYPASSED«¬ .IFFS­>® MOV #77406,(R0) ;SETUP PRIVILEGED TASK DESCRIPTOR REGISTERS¯° .ENDC±²³ .IFF ´µ MOV (R0)+,(R0) ;¶· .ENDC¸¹º MOV (R0)+,(R0) ;Y» MOV (R0)+,(R0) ;(¼ MOV (R0)+,(R0) ;T5½ MOV (R0),UINDR0+14. ;ALLOW FULL ACCESS TO I/O PAGE 0¾ MOV #UINAR0,R1 ;POINT TO USER I ADDRESS REG 05¿ MOV #KISAR0,R0 ;POINT TO KERNAL ADDRESS REGISTER 0R;À MOV (R0)+,(R1)+ ;SETUP PRIVILEGED TASK ADDRESS REGISTERSÁ MOV (R0)+,(R1)+ ; MOV (R0)+,(R1)+ ;à MOV (R0)+,(R1)+ ;Ä MOV (R0),(R1) ;9Å MOV #177600,UINAR0+14. ;SET ADDRESS REG 7 FOR I/O PAGE Æ BR 90$ ;7Ç85$: MOV #UINDR0,R0 ;POINT TO USER I DESCRIPTOR REG 01È86$: CLR (R0)+ ;CLEAR ALL DESCRIPTOR REGISTERSÉ CLR (R0)+ ;TÊ CLR (R0)+ ;DË CLR (R0)+ ;LÌ CLR (R0)+ ;GÍ CLR (R0)+ ;0Î CLR (R0)+ ;RÏ CLR (R0) ;Ð90$: ;REFERENCE LABELÑÒÓ .IF DF S$$LIBÔ3Õ BIC #10,SR3 ;ASSUME NEXT TASK DOESN'T USE SUPERI%Ö ;MODE (DISABLE CSM INSTRUCTION)0+× TSTB $SIRWF ;SUPERVISOR MODE R/W PDR'S?,Ø BEQ 95$ ;IF EQ NOUÙ CLRB $SIRWF ;CLEAR FLAGF3Ú MOV #SISDR0,R0 ;POINT TO FIRST SUPER I SPACE PDRI%Û BR 86$ ;CLEAR SUPER I SPACE PDR'SC6Ü95$: MOVB #-1,$SUPFL ;INDICATE NO SUPERVISOR WINDOWSÝÞ .ENDCßà0á MOV (R4)+,-(SP) ;PUSH NUMBER OF WINDOW BLOCKS7â100$: ADD #W.BLGH,R4 ;POINT PAST CURRENT WINDOW BLOCKN/ã MOV -W.BLGH(R4),R3 ;PICK UP NEXT PCB ADDRESS0(ä BEQ 115$ ;IF EQ WINDOW IS NOT MAPPED.å CMP -(R4),-(R4) ;POINT TO FIRST PDR ADDRESS6æ MOV P.REL(R3),R0 ;PICK UP PARTITION RELOCATION BIASçèé .IF DF P$$LASê&ë ADD -2(R4),R0 ;ADD IN WINDOW OFFSETìí .ENDCîï$ð MOVB (R4)+,R1 ;POINT TO FIRST PDRñòó .IF DF S$$LIBô$õ BMI 105$ ;IF MI USER MODE WINDOW/ö INCB $SUPFL ;COUNT A SUPERVISOR MODE WINDOWN(÷ BNE 102$ ;IF NE THIS ISN'T THE FIRST9ø MOV $DRAP3,SISAR0 ;FORCE MAPPING TO DISPATCHER IN EXECN.ù ;IN CASE TASK HAS NO SUPER MODE 0 WINDOW'ú MOV #402,SISDR0 ;MAP 1 32WD BLOCK ROF<û102$: ADD #SISDR0,R1 ;POINT TO FIRST SUPER INSTRUCTION PDR9ü BIT #4,W.BLPD-W.BNPD(R4) ;R/W ACCESS TO SUPER I SPACE?;ý BEQ 105$ ;IF EQ NO8þ INCB $SIRWF ;SET FLAG FOR SUPER I SPACE WRITE ACCESSÿ .ENDC6105$: MOVB (R4)+,R3 ;PICK UP NUMBER OF PDR'S TO LOAD8110$: MOVB (R4),(R1)+ ;SET USER DESCRIPTOR ACCESS CODE$ MOVB #177,(R1)+ ;SET BLOCK LENGTH% .IF DF M$$PRO!C$$CBP ; BM378  ;**-1A#  BIT #WB.BPS,(R4) ;ALWAYS BYPASS?,  BEQ 111$ ;NO IF EQ2  BISB #200,-1(R1) ;SET UP TO ALWAYS BYPASS CACHE  BR 112$ ;C111$: BIT #WB.NBP,(R4) ;CACHE BYPASS NOT DESIRED FOR THIS WINDOW?5, BNE 112$ ;YES IF NE, DO NOT BYPASS CACHE: BISB 1(R4),-1(R1) ;SET BYPASS BIT IN PDR AS APPROPRIATE( .ENDC ; DF M$$PRO!C$$CBP ; BM378 ;**-1)>112$: MOV R0,UISAR0-UISDR0-2(R1) ;LOAD USER ADDRESS REGISTER, ADD #200,R0 ;ADVANCE TO NEXT 4K BOUNDARY DEC R3 ;ANY MORE TO LOAD?B BGT 110$ ;IF GT NO6 MOV (R4)+,-(R1) ;LOAD LAST USER DESCRIPTOR REGISTER% .IF DF M$$PRO!C$$CBP ; BM378 ;**-1R% BIT #WB.BPS,-2(R4) ;ALWAYS BYPASS?I BEQ 113$ ;IF EQ NO2  BIS #100000,(R1) ;SET UP TO ALWAYS BYPASS CACHE ! BR 115$ ;IE"113$: BIT #WB.NBP,-2(R4) ;CACHE BYPASS NOT DESIRED FOR THIS WINDOW? 3# BEQ 115$ ;NO IF EQ, BYPASS CACHE AS APPROPRIATE)($ BIC #100000,(R1) ;DO NOT BYPASS CACHE%(% .ENDC ; DF M$$PRO!C$$CBP ; BM378' ;**-1(*)115$: DEC (SP) ;ANY MORE WINDOW BLOCKS?* BGT 100$ ;IF GT YESI+, .IF DF S$$LIB-/. INCB $SUPFL ;ADJUST SUPER MODE WINDOW COUNT/0 .ENDC ; DF S$$LIB1)2 MOV (R2),(SP) ;LOAD USER STACK POINTER0 3 MTPI SP ; 44 MOV #$UMR4,(R2) ;POINT SAVED SP VALUE AT SAVED R45@6; IF A USE00xšv;vt´cÚµcÛ¶c�·c›’R D SYSTEM, UPDATE THE USER D PAR'S/PDR'S TO OVERMAP#7; USER I SPACE WHERE APPROPRIATE.T89 .IF DF U$$DAS:3; MOV R2,-(SP) ;SAVE TASK HEADER ADDRESS FOR LATER ,< MOV #UINAR7+2,R0 ;POINT PAST USER I PAR 7,= MOV #UINDR7+2,R1 ;POINT PAST USER I PDR 7,> MOV #UDSAR7+2,R3 ;POINT PAST USER D PAR 7,? MOV #UDSDR7+2,R4 ;POINT PAST USER D PDR 74@ MOVB H.DMAP(R2),R2 ;GET USER D SPACE MAPPING MASK$A BNE 118$ ;IF NE MAPPING IS MIXEDB;C; NONE OF USER D HAS DISCRETE MAPPING. COPY ALL REGISTERSED; FROM USER IEEF MOV -(R0),-(R3) ;PAR 7MG MOV -(R1),-(R4) ;PDR 7AH MOV -(R0),-(R3) ;6FI MOV -(R1),-(R4) ;J MOV -(R0),-(R3) ;5AK MOV -(R1),-(R4) ;L MOV -(R0),-(R3) ;4PM MOV -(R1),-(R4) ;N MOV -(R0),-(R3) ;3PO MOV -(R1),-(R4) ;P MOV -(R0),-(R3) ;2PQ MOV -(R1),-(R4) ;R MOV -(R0),-(R3) ;1PS MOV -(R1),-(R4) ;T MOV -(R0),-(R3) ;0 U MOV -(R1),-(R4) ;#V BR 119$ ;SKIP MIXED UPDATE CODE W@X; USER D SPACE MAPPING IS A MIXTURE (OR ALL D SPACE). TEST FOR,Y; LATTER CASE, THEN UPDATE AS APPROPRIATE.Z+[118$: COMB R2 ;REVERSE SENSE OF BIT MASK)-\ ;(1 NOW MEANS APR IS MAPPED TO I SPACE)-0] BEQ 119$ ;IF EQ, ALL APRS MAPPED BY DISCRETE)^ ;D SPACE WINDOWS, NO UPDATE NEEDED.R/_ BMI 1182$ ;IF MI, APR 7 IS MAPPED TO USER I;`3a; THIS SECTION HANDLES APRS WITH DISCRETE MAPPING-b/c1181$: CMP -(R0),-(R3) ;ADVANCE PAR ADDRESSESR)d CMP -(R1),-(R4) ;ADVANCE PDR ADDRESSESe ASLB R2 ;TEST FOR NEXT APR0f BEQ 119$ ;IF EQ END OF LOOP OR ALL REMAINING!g ;APRS HAVE DISCRETE MAPPING3h BPL 1181$ ;IF PL NEXT APR HAS DISCRETE MAPPING, &i ;BUT AT LEAST ONE MORE DOES NOT.j4k; THIS SECTION HANDLES APRS MAPPED TO USER I SPACEl7m1182$: MOV -(R0),-(R3) ;COPY USER I PAR TO USER D PARP1n MOV -(R1),-(R4) ;COPY USER I PDR TO USER D PDRLo ASLB R2 ;TEST FOR NEXT APR)p BMI 1182$ ;NEXT APR MAPS USER I SPACED1q BNE 1181$ ;IF NE, NEXT APR IS NOT OVERMAPPED,r ;BUT AT LEAST ONE MORE ISs1t119$: MOV (SP)+,R2 ;RESTORE TASK HEADER ADDRESS uv .ENDC ; DF U$$DASw-x MOV (SP)+,R4 ;RESTORE EFFECT AST INDICATORIyz{ .IF DF F$$LPP|7} MOV H.FPSA(R2),R0 ;POINT TO FLOATING POINT SAVE AREAT4~ BEQ 120$ ;IF EQ TASK DOES NOT USE FLOATING POINT3 TST $HFMSK ;PROCESSOR HAVE A FLOATING PT UNIT ? -€ BMI 120$ ;IF MI NO, DON'T TRY TO LOAD CTXT4� MOV T.PCB(R5),R1 ;GET ADDRESS OF TCB OF NEXT TASK.‚ MOV P.REL(R1),KISAR6 ;MAP TO TASK PARTITIONƒ„ .IF DF X$$HDR…-† TST P.HDR(R1) ;TASK HAVE EXTERNAL HEADER ?H‡ BEQ 121$ ;IF EQ, YESˆ‰ .IFTF ;DF X$$HDRVŠ‹Œ� .IF DF P$$LASŽ4� ADD T.OFF(R5),KISAR6 ;ADD IN OFFSET TO TASK IMAGE�‘ .ENDC’“” .IFT ;DF X$$HDR•–121$: ;REFERENCE LABEL —˜ .ENDC ;DF X$$HDRT™š›6œ TST (R0)+ ;POINT TO SAVED FLOATING POINT REGISTERS2� LDFPS #200 ;SET FLOATING DOUBLE MODE, NO TRAPS1ž LDD (R0)+,R0 ;RESTORE FLOATING POINT REGISTERSRŸ LDD (R0)+,R1 ;I  STD R1,R4 ;D¡ LDD (R0)+,R1 ;T¢ STD R1,R5 ;H£ LDD (R0)+,R1 ; ¤ LDD (R0)+,R2 ;F¥ LDD (R0)+,R3 ;F3¦ LDFPS @H.FPSA(R2) ;RESTORE FLOATING POINT STATUSA§¨ .ENDC©ª«120$:S¬;+­; ** W A R N I N G **®;¯; SPM HOOKPOINT NUMBER 05.°; +±; DO NOT CHANGE THE INSTRUCTION FOLLOWING²; LABEL WITHOUT CHECKING SPM³;-´-µ$SPH05==. ;SPM CHANGES THE INSTRUCTION ATL!¶ ;THE LOCATION OF THIS LABELD·0¸ MOV H.GARD(R2),R0 ;POINT TO HEADER GUARD WORD¹'º MOV SP,R1 ;POINT TO CURRENT CONTEXT » MOV -(R0),(R1)+ ;RESTORE R0¼ MOV -(R0),(R1)+ ;RESTORE R1½ MOV -(R0),(R1)+ ;RESTORE R2¾ MOV -(R0),(R1)+ ;RESTORE R3¿ MOV -(R0),(R1)+ ;RESTORE R4À MOV -(R0),(R1)+ ;RESTORE R5Á MOV -(R0),(R1)+ ;RESTORE PC MOV -(R0),(R1) ;RESTORE PSAÃ130$:NÄÅÆ .IF DF A$$CNTÇ4È TST T.ACN(R5) ;DOES TASK HAVE AN ACCOUNTING BLOCKÉ BEQ 132$ ;IF EQ NO,Ê TSTB $BILNG ;IS BILLING CURRENTLY ACTIVEË BEQ 132$ ;IF EQ YES 4Ì MOV $ACCLK+2,$STRTM+2 ;SAVE CURRENT ABSOLUTE TIMEÍ MOV $ACCLK,$STRTM ;*Î CLRB $BILNG ;INDICAT00x¢v)vtöt÷tø tþfDATAE START OF BILLINGÏÐ .ENDCÑÒ4Ó; A FEW DESCRIPTIVE WORDS ABOUT AST CONTROL BLOCKSÔ;-BÕ; AST CONTROL BLOCKS FALL INTO SEVERAL DISTINCT CATEGORIES BASED1Ö; UPON THE VALUES IN A.CBL AND A.BYT. THESE ARE×;$Ø; A.CBL A.BYT DESCRIPTIONÙ; ----- ----- -----------Ú;E7Û; <0 X KERNEL AST. BIT 6 OF A.CBL IS SET IF $SGFINL1Ü; SHOULD NOT BE CALLED PRIOR TO EXECUTING THEE0Ý; KERNEL AST CODE. BITS 0 THROUGH 5 OF A.CBL.Þ; REPRESENT AN INDEX (DIVIDED BY 2) INTO A3ß; TABLE OF AST ADDRESSES ($KATBL). DEALLOCATION6à; IS THE RESPONSIBILITY OF THE PROCESSING ROUTINE.5á; THESE ARE EXEC LEVEL FUNCTIONS SUCH AS BUFFEREDA3â; I/O COMPLETION WHICH MUST TAKE PLACE WHEN THETã; TASK CONTEXT IS LOADED..ä;D<å; 0 0 AST DEQUEUED BY A SYSTEM SUBROUTINE. THE ROUTINE4æ; IS MAPPED BY THE CONTENTS OF A.KSR5 AND CALLED4ç; VIA THE ADDRESS IN A.DQSR. DEALLOCATION IS THE/è; RESPONSIBILITY OF THE DEQUEUE ROUTINE. ANS4é; EXAMPLE IS THE PROCESSING OF UNSOLICITED INPUT$ê; ASTS BY THE FULL DUPLEX TTDRV.ë;S:ì; 0 N THIS IS A SPECIFIED AST BLOCK OF LENGTH C.LGTH7í; (A.PLGH FOR PARITY ERROR ASTS) N IS THE SPECIFIEDP1î; AST TYPE. THESE BLOCKS ARE RE-LINKED IN THEC8ï; T.SAST LIST AFTER THE AST IS DECLARED (EXCEPT FOR)5ð; PARITY ERROR ASTS, WHICH ARE ALWAYS DEALLOCATEDN3ñ; AFTER USE, AND REQUESTED EXIT ASTS, WHICH AREA5ò; DEALLOCATED AFTER USE BY A NON-PRIVILEGED TASK. ó;U<ô; >0 0 THIS IS A DYNAMIC AST (I/O COMPLETION, MARK TIME5õ; OF LENGTH A.CBL. AFTER THE PARAMETERS ARE MOVED 6ö; TO THE TASK STACK AND THE AST EFFECTED THE BLOCK÷; IS DEALLOCATED.Yø;Rùú132$: TST R4 ;EFFECT AST?û BNE 133$ ;IF NE YESEü JMP 190$ ;NO5ý133$: MOV R5,R0 ;CALCULATE ADDRESS OF AST LISTHEADOþ ADD #T.ASTL,R0 ;R,ÿ CALL $QRMVF ;REMOVE AST ENTRY FROM QUEUE" MOVB A.CBL(R1),R4 ;KERNEL AST ? BPL 135$ ;IF PL NO JMP 210$ ;4135$: MOV R5,R4 ;CALCULATE ADDRESS OF STATUS WORD ADD #T.ST2,R4 ;/ MOVB (R4),-(SP) ;COPY CURRENT EXTENSION BYTET? BIC #^C,(SP) ;CLEAR ALL BUT WAIT STATEE+ ASL (SP) ;SHIFT INTO POSITITON FOR SAVE< BIC #*2!T2.STP!T2.SPN!T2.WFR,(R4) ;"  BIS (SP)+,(R4) ;SAVE WAIT STATE(  BIS #T2.AST,(R4) ;SET AST IN PROGRESS-  MOV R1,R3 ;COPY AST CONTROL BLOCK ADDRESSR/  MOV R3,-(SP) ;SAVE AST CONTROL BLOCK ADDRESS8  CMP (R3)+,(R3)+ ;POINT TO NUMBER OF BYTES TO ALLOCATE .IF DF X$$HDR. MOV $SAHPT,R4 ;POINT TO CURRENT TASK HEADER .IFFT. MOV $HEADR,R4 ;POINT TO CURRENT TASK HEADER .ENDC ;X$$HDR& MFPI SP ;GET CURRENT STACK POINTER MOV (SP)+,R0 ;#8 MOV (R3)+,R1 ;GET NUMBER OF BYTES TO ALLOCATE ON TASK) SUB R1,R0 ;CALCULATE NEW TOP OF STACKA* CALL $ACHCK ;ADDRESS CHECK STACK SPACE) BCS 160$ ;IS CS ADDRESS CHECK FAILURE, ! .IF DF S$$LIB"+# MOV #PMODE,PS ;SET PREVIOUS MODE TO USER $% .IFTF&'( .IF DF X$$HDR)=* MOV KISAR6,-(SP) ;SAVE TASK HEADER MAPPING IF XTRNL HEADERT+, .IFTF ; DF X$$HDR-+. MOV R0,-(SP) ;SET NEW TASK STACK POINTER / MTPI SP ; /0 CALL $RELOM ;RELOCATE AND MAP STACK ADDRESS+1 MOV SP,R1 ;CALCULATE ADDRESS OF TRAP PCE23 .IFF ; DF X$$HDRC45 ADD #7*2,R1 ;C67 .IFT ; DF X$$HDRE89 ADD #8.*2,R1 ;:; .ENDC ; DF X$$HDR<#= MOV (R1)+,-(SP) ;SAVE PC AT TRAP > MOV (R1),R2 ;SAVE PS AT TRAP)? MOV #CMODE!PMODE,(R1) ;SET AST TRAP PSF#@ MOV (R3)+,-(R1) ;SET AST TRAP PCS4A MOV (R3)+,-(SP) ;GET NUMBER OF PARAMETERS TO MOVEBC .IFTD%E BIT #1,(R1) ;SUPERVISOR MODE AST?NF BEQ 140$ ;IF EQ NO$G DEC (R1)+ ;CLEAR SUPERVISOR FLAG/H TSTB $SUPFL ;TASK HAVE SUPER MODE LINKAGE ?P-I BEQ 140$ ;IF EQ NO, DON'T ALLOW SUPER AST,<J BIC #^CCSMODE&CMODE,(R1) ;SET SUPERVISOR MODE IN STACK PSKL .ENDCMN/O140$: DEC (SP) ;ANY MORE PARAMETERS TO MOVE?(P BLT 150$ ;IF LT NO0Q MOV (R3)+,(R0)+ ;MOVE PARAMETER TO USER STACK R BR 140$ ;;S150$: TST (SP)+ ;CLEAN STACKST00xªv;vt´cÚµcÛ¶c�·c›’ MFPD$ @#H.DSW ;GET USER DSWO*U MOV (SP)+,(R0)+ ;MOVE DSW TO TASK STACK1V MOV (SP)+,(R0)+ ;MOVE PC AT TRAP TO TASK STACK1.W MOV R2,(R0)+ ;MOVE PS AT TRAP TO TASK STACK.X MOV T.EFLM(R5),(R0) ;SAVE WAITFOR MASK WORDYZ .IF DF X$$HDR[9\ MOV (SP)+,KISAR6 ;RESTORE MAPPING TO XTRNL TASK HEADERC]^ .ENDC_9` MOV T.EFLM+2(R5),H.EFSV(R4) ;SAVE WAITFOR MASK ADDRESSab BR 170$ ;TAKE COMMON EXIT+%c160$: MOV #S.CAST,R0 ;SET AST ABORT#d CALL $ABCTK ;ABORT CURRENT TASKA8e170$: MOV (SP)+,R0 ;RETRIEVE AST CONTROL BLOCK ADDRESS3f MOV A.CBL(R0),R1 ;GET LENGTH OF BLOCK TO RELEASEEg BNE 175$ ;JUMP IF NON-ZERO*h CMP -(R0),-(R0) ;ZERO - POINT TO A.KSR5ijk .IF DF K$$DASl5m MOV (R0),KDSAR5 ;MAP DEQUEUE ROUTINE IN DATA SPACE+no .ENDCpq7r MOV (R0)+,KINAR5 ;MAP DEQUEUE ROUTINE IN INSTR SPACE+(s CALL @(R0)+ ;CALL DEQUEUE SUBROUTINEt BR 200$ ;EXIT "u175$: TSTB R1 ;LENGTH NON-ZERO?v BNE 180$ ;Y - JUMPw SWAB R1 ;GET AST CODEE+x CMPB R1,#AS.PEA ;PARITY ERROR AST BLOCK?C'y BEQ 1781$ ;IF EQ YES, DEALLOCATE IT z{| .IF DF A$$CLI}-~ CMPB R1,#AS.CAA ;COMMAND ARRIVAL AST BLOCK) BNE 176$ ;IF NE NO4€ TST A.PRM+2(R0) ;SHOULD AST BLOCK BE DEALLOCATED?� BEQ 177$ ;IF EQ YESN‚ BR 178$ ;RELINK BLOCK ƒ176$: ;„… .ENDC ;A$$CLI†‡ˆ-‰ CMPB R1,#AS.REA ;REQUESTED EXIT AST BLOCK? Š BNE 179$ ;IF NE NO*‹ BIT #T3.PRV,T.ST3(R5) ;TASK PRIVILEGED?Œ BNE 178$ ;IF NE YES2�177$: CALL $DECLK ;DEALLOCATE AST CONTROL BLOCK Ž BR 200$ ;K8�178$: BIC #T2.REX,T.ST2(R5) ;ALLOW AST RESPECIFICATION=�179$: MOV T.SAST(R5),(R0) ;LINK AST CONTROL BLOCK BACK INTO)*‘ MOV R0,T.SAST(R5) ;THE HEAD OF THE LIST’ BR 200$ ;TRY EXIT AGAINA-“1781$: MOV #A.PLGH,R1 ;GET LENGTH OF PACKETL.”180$: CALL $DEACB ;DEALLOCATE CONTROL BLOCK• BR 200$ ;TRY EXIT AGAINA*–190$: TSTB T.ST2(R5) ;TASK BEING HALTED?— BPL 200$ ;IF PL NO˜™TEXIT: ;REFERENCE LABELš .IF DF X$$HDR›-œ MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADERO�ž .ENDC ; DF X$$HDRŸ+  CALL $DREX1 ;CONTINUE TASK EXIT PROCESSN¡200$: ;REF LABEL)¢£¤ .IF DF S$$LIB¥3¦ TSTB $SUPFL ;DOES TASK HAVE SUPERVISOR WINDOWS?T§ BEQ 205$ ;IF EQ NO/¨ CALL LSUPD1 ;LOAD SUPERVISOR DATA REGISTERSC*© TST $STACK-2 ;GOING TO SUPERVISOR MODE?ª BMI 205$ ;IF MI NO&« MFPI SP ;GET CURRENT STACK POINTER+¬ MOV (SP),-(SP) ;MAKE A COPY ON THE STACK2­ ADD #4,(SP) ;MAKE USER SP 4 MORE THAN SUPER SP+® MOV #PMODE,PS ;SET PREVIOUS MODE TO USERE$¯ MTPI SP ;LOAD USER STACK POINTER:° BIC #^CPSMODE&PMODE,PS ;SET PREVIOUS MODE TO SUPERVISOR*± MTPI SP ;LOAD SUPERVISOR STACK POINTER²³ .ENDC´µ¶·¸ .IF NDF M$$PROB¹º205$: JMP $DIRXT ; »¼ .IFF ½¾205$: JMP DIRXT1 ;¿À .ENDCÁÂ-Ã210$: MOV #$DIRXT,-(SP) ;SET RETURN ADDRESS/Ä MOV R1,R0 ;SET ADDRESS OF AST CONTROL BLOCK,/Å CLR (R0) ;INDICATE THIS IS A SCHEDULER CALL 7Æ211$: ASLB R4 ;CONVERT AST INDEX TO WORD, TST $SGFIN &Ç BMI 215$ ;IF MI NO $SGFIN REQUIRED/È CALL $SGFIN ;SETUP TO IGNORE SEGMENT FAULTSSÈ .IF DF R$$WPT ; BM375È ; BM375VFÈ MOV $KATBL+256.(R4),$WPLST ;SAVE LAST SYSTEM STATE ADDRESS ; BM375È ; BM375 "È .ENDC ; DF R$$WPT ; BM3753É JMP @$KATBL+256.(R4) ;DISPATCH TO PROPER ROUTINE(É215$: ; BM375É .IF DF R$$WPT ; BM375 É ; BM375RFÉ MOV $KATBL+128.(R4),$WPLST ;SAVE LAST SYSTEM STATE ADDRESS ; BM375É ; BM375$"É .ENDC ; DF R$$WPT ; BM375É ; BM375S=É JMP @$KATBL+128.(R4) ;DISPATCH TO PROPER ROUTINE ; BM375 Ë ;**-1 ÌÍ;+ Î;**-$DSPKA-DISPATCH KERNEL ASTÏ;A@Ð; THIS ROUTINE IS CALLED WHEN A KERNEL AST IS TO BE DISPATCHED=Ñ; BY A COMPONENT OTHER THAN THE SCHEDULER (SPECIFICALLY THEP(Ò; LOADER TO DISPATCH REGION LOAD ASTS.Ó;F Ô; INPUTS: "Õ; R0=ADDRESS OF KERNEL AST BLOCKÖ;V ×; OUTPUTS:Ø; THE AST IS SERVICEDEÙ;T?Ú; NOTE: THE TASK CONTEXT IS NOT GUARANTEED LOADED, SO THE AS00x²v)vtöt÷tø tþfDATAT BÛ; MAY ONLY BE USED TO PERFORM SERVICES DEPENDENT UPON CONDITIONS-Ü; GUARANTEED BY THE CALLER OF THIS ROUTINE. Ý;-Þ7ß$DSPKA::MOV KINAR5,-(SP) ;SAVE CURRRENT APR 5 MAPPINGEàá .IF DF K$$DASâ)ã MOV KDSAR5,-(SP) ;SAVE D SPACE MAPPINGOäå .ENDC ; DF K$$DASæ&ç MOVB A.CBL(R0),R4 ;GET CAUSE OF AST.è MOV #1,(R0) ;SET LINK NON-ZERO TO INDICATEé ;NOT A SCHEDULER REQUESTêë CALL 211$ ;GO EXECUTE ASTEìí .IF DF K$$DASî/ï MOV (SP)+,KDSAR5 ;RESTORE PREVIOUS D MAPPINGðñ .ENDC ; DF K$$DASò-ó MOV (SP)+,KINAR5 ;RESTORE PREVIOUS MAPPINGEô õ RETURN ; ö ÷ .DSABL LSB-øùúû;+7ü; **-$GGFRN-GROUP GLOBAL EVENT FLAG USE COUNT RUNDOWNDý;DCþ; DEACCESS THIS TASK'S GROUP GLOBAL EVENT FLAGS IF THE EVENT FLAG Eÿ; MASK IN THE AST CONTROL BLOCK IS GROUP GLOBAL, AND DEALLOCATE THET ; THE AST CONTROL BLOCK. ;  ; INPUTS:L ;Q. ; R0=ADDRESS OF THE KERNEL AST CONTROL BLOCK ;D; ; TASK HEADER IS EITHER RESIDENT OR MAPPED THROUGH KISAR65 ; AND $SAHPT IS ASSUMED TO BE VALID AT THIS POINT.S ;P ; OUTPUTS: ;3 ; THE GROUP GLOBAL EVENT FLAGS ARE DEACCESSED AND+% ; THE CONTROL BLOCK IS DEALLOCATED.  ;O$ ; FORMAT OF THE AST CONTROL BLOCK: ;S ; WD. 00 -- UNKNOWNG% ; WD. 01 -- KERNEL AST TYP = AK.GGFS ; WD. 02 -- UNKNOWNP% ; WD. 03 -- EVENT FLAG MASK ADDRESSS ;T ;-   .IF DF G$$GEF : $GGFRN::MOV $SAHPT,R4 ;GET CURRENT TASK'S HEADER ADDRESS+ MOV R0,-(SP) ;SAVE CONTROL BLOCK ADDRESSU, MOV 6(R0),R3 ;GET EVENT FLAG MASK ADDRESS) CALL $DEAGF ;DEACCESS IF GROUP GLOBAL . MOV (SP)+,R0 ;RESTORE CONTROL BLOCK ADDRESS- CALL $DEPKT ;DEALLOCATE THE CONTROL BLOCK ' CALLR $SETRT ;INSURE RESCAN OF TASKC! " .ENDC ; DF G$$GEF# $ .IF DF P$$OFF% & ;+3' ; **-$FINXT-FINISH OFFSPRING TASK EXIT PROCESSING ( ; F) ; THIS ROUTINE IS CALLED TO OPTIONALLY SET AN EVENT FLAG, DECLARE ANG* ; AST AND RETURN EXIT STATUS TO A PARENT TASK ONCE THAT TASK HAS BEENO+ ; SCHEDULED., ; - ; INPUTS:R. ;T*/ ; R0=ADDRESS OF OFFSPRING CONTROL BLOCK.0 ;S 1 ; OUTPUTS:2 ;D3 ; ALL EXIT CONDITIONS ARE EFFECTED AND THE OFFSPRING CONTROL BLOCK=4 ; IS DEALLOCATED IF IT IS NOT USED AS AN AST CONTROL BLOCK.S5 ;-6 &7 $FINXT::MOV R0,R3 ;COPY OCB POINTER8 MOV R0,R4 ;COPY OCB POINTERO*9 TST (R3)+ ;SKIP OVER LINK WORD (O.LNK)<: MOV #O.LGTH,(R3)+ ;SET LENGTH TO DEALLOCATE (O.LNK=A.CBL)7; MOV (R3),R5 ;PICK UP PARENT TCB ADDR (O.PTCB=A.BYT)T6< MOV #8.*2,(R3)+ ;BYTES ON USER STACK (O.PTCB=A.BYT)/= TST (R3)+ ;SKIP OVER AST WORD (O.AST=A.AST)1> MOV (R3),R0 ;PICK UP EFN NUMBER (O.EFN=A.NPR)R1? CALL $SETFG ;SET EFN AND UNLOCK IF GRP GLOBALD6@ MOV #1,(R3)+ ;SET NUMBER OF AST PARMS (O.EFN=A.NPR)7A MOV (R3)+,R0 ;PICK UP VIRTUAL ESB ADDR (O.ESB=A.PRM)R+B MOV #1,R2 ;ASSUME ONE WORD STATUS BLOCK #C ASR R0 ;ONE WORD STATUS BLOCK ?H,D BEQ 40$ ;IF EQ NO STATUS BLOCK SPECIFIED'E BCC 5$ ;IF CC ONE WORD STATUS BLOCKR'F MOV #8.,R2 ;SET SIZE TO EIGHT WORDSE+G 5$: ASL R0 ;SET ADDRESS BACK TO ORIGINAL 8H MOV R0,-2(R3) ;CORRECT ADDRESS IN AST BLOCK FOR STACK-I 10$: MOV (R3)+,-(SP) ;GET A WORD OF THE ESBS0J MTPD$ (R0)+ ;STORE IN USER BUFFER (CAN TRAP)/K BCS 40$ ;IF CS TRAPPED, NO POINT CONTINUING3"L SOB R2,10$ ;CONTINUE WITH COPY!M 40$: TST O.AST(R4) ;EFFECT AST?NN BEQ 50$ ;IF EQ NO %O MOV R5,R0 ;SET PARENT TCB ADDRESSB$P MOV R4,R1 ;SET AST BLOCK ADDRESS1Q CALLR $QASTT ;QUEUE AST FOR PARENT AND RETURNV,R 50$: MOV R4,R0 ;POINT TO BLOCK TO RELEASE*S MOV #O.LGTH,R1 ;PICK UP SIZE TO RELEASET CALL $DEACB ;DEALLOCATE OCBB'U CALLR $SETRT ;INSURE RESCAN OF TASKEV W .IFF ;DF P$$OFFX PY $FINXT::BGCK$A BF.KAS,BE.SGN,FATAL ;SHOULDN'T HAVE AK.OCB IN NON P$$OFF SYSTEMZ [ .ENDC\ ] ;+G^ ; **-$DBTRP-SET T BIT IN SAVED PS TO CAUSE TASK TO TRAP INTO DEBUGGERI_ ;N@` ; THIS LOCAL ROUTINE IS CALLED AS A KERNEL AST TO FORCE A TASK?a ; TO TRAP INTO A DEBUGER. IT IS CALLED AS A RESULT OF THE MCRV1b ; "DEBUG" COMMAND QUEUEING THE KERNEL AST BLOC00xºv;vt´cÚµcÛ¶c�·c›’KMc ;. d ; INPUTS: e ;Z"f ; R0=ADDRESS OF KERNEL AST BLOCK%g ; R5=ADDRESS OF TCB OF CURRENT TASKSh ;F i ; OUTPUTS:j ; Dk ; THE "T" BIT IS SET IN THE SAVED PS IN THE TASK'S HEADER TO CAUSEFl ; ITTO TRAP. THE AST BLOCK IS DEALLOCATED. IF THE TASK DOES NOT HAVEDm ; A DEBUGGER SST VECTOR SPECIFIED, OR IS EXITING, THE T BIT IS NOT@n ; SET, AND THE AST BLOCK IS USED TO QUEUE A MESSAGE REQUEST TOo ; TKTN FOR OUTPUT.p ;Lq ;-r Cs $DBTRP::BIT #T2.ABO!T2.HLT,T.ST2(R5) ;IS TASK EXITING OR ABORTINGt BNE 20$ ;IF NE YES$u MOV T.PCB(R5),R4 ;FIND TASK'S PCBv w .IF DF X$$HDRx ;y MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING IN CASE XTRNL HDRT,z MOV P.HDR(R4),-(SP) ;POINT TO TASK HEADER!{ BNE 5$ ;IF NE RESIDENT HEADERE/| MOV P.REL(R4),KISAR6 ;MAP TO EXTERNAL HEADERG7} MOV #140000,(SP) ;POINT TO VIRTUAL ADDRESS OF HEADER1~ 5$: MOV (SP)+,R4 ;GET VIRTUAL ADDRESS OF HEADERG( MOV H.ODVA(R4),R4 ;GET VECTOR ADDRESS,€ MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING'� TST R4 ;IS A DEBUGGER SST SPECIFIED2‚ ƒ .IFF ; DF X$$HDRP„ $… MOV P.HDR(R4),R4 ;POINT TO HEADER.† TST H.ODVA(R4) ;IS A DEBUGGER SST SPECIFIED‡ ˆ .ENDC ; DF X$$HDR‰ Š BEQ 20$ ;IF EQ NONA‹ BIC #T2.SEF!T2.STP!T2.SPN!T2.WFR,T.ST2(R5) ;MAKE TASK RUNNABLER,Œ BIS #20,@#$STACK-2 ;SET T BIT IN SAVED PS*� 10$: MOV #A.DLGH,R1 ;LENGTH OF AST BLOCKŽ CALL $DEACB ;DEALLOCATE IT'� CALLR $SETRT ;INSURE RESCAN OF TASK,$� 20$: TST $TKNPT ;TKTN INSTALLED ?)‘ BEQ 10$ ;IF EQ NO, DEACLLOCATE PACKET;(’ MOV #T.NDEB,R3 ;NO DEBUGGER SPECIFIED3“ MOV T.NAM+2(R5),R4 ;GET SECOND HALF OF TASK NAMER#” MOV T.NAM(R5),R5 ;AND FIRST HALFT.• CALLR $DVMG1 ;REQUEST TKTN USING AST BLOCK– — ˜ ;+-™ ; **-$GENBF-GENERAL BUFFERED I/O COMPLETION5š ;KE› ; THIS ROUTINE IS CALLED TO TRANSFER KERNEL AST CONTROL TO A DRIVERMDœ ; FOR PROCESSING OF FUNCTIONS WHICH MUST BE DONE WITH TASK CONTEXT0� ; LOADED. THE AST CONTROL BLOCK IS AS FOLLOWS:ž ;P#Ÿ ; +-----------------------------+ #  ; ! LINK WORD !.#¡ ; +-----------------------------+V#¢ ; ! A.BYT=0 ! A.CBL=AK.GBI !A#£ ; +-----------------------------+R#¤ ; ! SUBROUTINE KISAR5 BIAS !K#¥ ; +-----------------------------+ #¦ ; ! SUBROUTINE ADDRESS !T#§ ; +-----------------------------+D¨ ;R © ; INPUTS: ª ;O#« ; R0=ADDRESS OF AST CONTROL BLOCKG¬ ;U ­ ; OUTPUTS:® ;B¯ ;+° .± $GENBF::SAVNR ;SAVE NON-VOLATILE REGISTERS-² MOV R0,R3 ;COPY AST CONTROL BLOCK ADDRESS-.³ MOV $TKTCB,R0 ;GET CURRENT TASK TCB POINTER2´ CALL $SETCR ;FORCE RE-DISPATCHING OF PROCESSOR*µ MOV 4(R3),KISAR5 ;MAP TO DRIVER ROUTINE¶ · .IF DF K$$DAS¸ 4¹ MOV 4(R3),KINAR5 ;MAP TO DRIVER ROUTINE (I SPACE)º » .ENDC ; DF K$$DAS¼ 0½ CALLR @6(R3) ;CALL DRIVER ACCEPTANCE ROUTINE¾ ¿ ;+0À ; **-$FINBF-FINISH TERMINAL INPUT BUFFERED I/OÁ ;T@ ; THIS ROUTINE IS CALLED TO COMPLETE A BUFFERED TERMINAL INPUTHà ; REQUEST THAT HAS BEEN PLACED IN THE AST QUEUE, OR TO COMPLETE AN I/ODÄ ; REQUEST FOR A TASK WHICH MAY HAVE UNMAPPED ITS I/O STATUS BLOCK.Å ;R Æ ; INPUTS: Ç ;OÈ ; R0=ADDRESS OF I/O PACKET.P<É ; R4=0 FOR BUFFERED I/O OR 100 FOR POSSIBLE UNMAP OF IOSB.Ê ;MË ; REQUIRED I/O PACKET FIELDS: Ì ;.(Í ; I.FCN+1=I/O FUNCTION CODE OF REQUEST-Î ; I.PRM=RELATIVE KISAR6 BIAS OF USER BUFFER$.Ï ; I.PRM+2=KISAR6 DISPLACEMENT OF USER BUFFER!Ð ; I.PRM+6=FIRST I/O STATUS WORDE@Ñ ; I.PRM+10=2ND I/O STATUS WORD (AND COUNT FOR $BLXIO TRANSFER)7Ò ; I.PRM+12=PTR TO LINKED LIST OF BUFFERS OR 0 IF NONEA)Ó ; I.PRM+14=KISAR5 BIAS OF DRIVER BUFFERL2Ô ; I.PRM+16=PCB ADDRESS FOR PARTITION OF TRANSFERÕ ;KAÖ ; NOTE: ONLY THE I/O STATUS IN I.PRM+6 AND I.PRM+10 IS REQUIRED× ; IF R4=100.D Ø ; OUTPUTS:Ù ; DÚ ; THE BUFFERED I/O REQUEST IS COMPLETED AND $IOFIN IS CALLED. THEFÛ ; DRIVER IS CALLED TO DEALLOCATE ANY BUFFERS. IF THE BUFFER ADDRESSEÜ ; IS ODD, THE BUFFER IS NOT COPIED AND INSTEAD THE DRIVER IS CALLEDDEÝ ; DIRECTLY. THIS CASE ALLOWS FOR NON-STANDARD BUFFER FORMATS. THEFGÞ ; DRIVER IS RESPONSIBLE FOR TRANSFERRING THE D00xÂv)vtöt÷tø tþfDATAATA TO THE USER BUFFER.+?ß ; IF THE PCB ADDRESS IS ODD, THE BUFFER IS IN SECONDARY POOL.Eà ;-á â .ENABL LSBDã ä -å $FINBF::SAVNR ;SAVE NONVOLITILE REGISTERSæ 4ç MOV I.PRM+16(R0),R1 ;GET ADDRESS OF BUFFER REGION-è BIC #1,R1 ;CLEAR SECONDARY POOL INDICATORO"é CALL $TSPAR ;BUFFER RESIDENT ?ê BCC 5$ ;IF CC YESU%ë BR 50$ ;IF CS NO, LOAD AST QUEUEDE.ì $FINDI::SAVNR ;SAVE NON-VOLATILE REGISTERS)í 5$: MOV R0,R3 ;COPY I/O PACKET ADDRESSR2î MOV I.IOSB(R3),R0 ;PICK UP VIRTUAL IOSB ADDRESS!ï BEQ 10$ ;IF EQ NONE SPECIFIEDE7ð MOV I.PRM+6(R3),-(SP) ;PUSH FIRST WORD OF I/O STATUS 6ñ MTPD$ (R0)+ ;WRITE IN USER IOSB (ANY TRAP IGNORED)9ò MOV I.PRM+10(R3),-(SP) ;PUSH SECOND WORD OF I/O STATUSF8ó MTPD$ (R0)+ ;WRITE IN USER IOSB+2 (ANY TRAP IGNORED)3ô CLR I.IOSB+4(R3) ;NO I/O STATUS BLOCK FOR $IOFINCõ 10$:8ö ASSUME AK.BUF,200 ;BUFFERED I/O LOW BITS MUST BE ZERO÷ ø TSTB R4 ;BUFFERED I/O?ù BNE 30$ ;IF NE NOO.ú MOV I.TCB(R3),R5 ;RETRIEVE TASK TCB ADDRESS/û DECB T.TIO(R5) ;DECREMENT BUFFERED I/O COUNTC2ü INCB T.IOC(R5) ;INCREMENT OUTSTANDING I/O COUNT(ý MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS)þ ADD #I.PRM+16,R3 ;POINT TO PCB ADDRESS(,ÿ MOV (R3),R5 ;SAVE PCB ADDRESS (I.PRM+16) MOV R5,R2 ;COPY PCB ADDRESS+2 BIC #1,R2 ;CLEAR POSSIBLE SEC POOL BUFFER FLAG8 ADD P.REL(R2),-16(R3) ;MAKE TASK BUFFER BIAS ABSOLUTE/ CLR (R3) ;CLEAR PCB ADDRESS WORD (I.PRM+16)B( TST -(R3) ;BACKUP POINTER (I.PRM+14)8 MOV -(R3),R2 ;PICK UP INPUT BUFFER ADDRESS (I.PRM+12)  BEQ 20$ ;IF EQ THERE IS NONE0 MOV -10(R3),R4 ;GET START ADDR OF USER BUFFER  .IF DF T$$ACD!T$$TSA  ( BIT #1,R5 ;BUFFER IN SECONDARY POOL? BNE 12$ ;IF NE YES* BIT #1,R2 ;NON-STANDARD BUFFER FORMAT?/ BNE 17$ ;IF NE YES, BYPASS BUFFER COPY CODES  .ENDC ;T$$ACD!T$$TSA  , 11$: BIT #1,R5 ;BUFFER IN SECONDARY POOL? BEQ 13$ ;IF EQ NOA1 12$: MOV R2,R1 ;BUFFER ADDRESS IS MAPPING BIASU( MOV #120000,R2 ;SET APR5 DISPLACEMENT* BR 14$ ;TRANSFER USING SEC POOL BUFFER. 13$: CMP R2,#120000 ;BUFFER IN DRIVER SPACE? BLO 15$ ;IF LO NOU" MOV R2,R1 ;COPY BUFFER ADDRESS1 BIC #77,R1 ;REMOVE DISPLACEMENT IN BLOCK BITSE5 SUB #120000,R1 ;CALC OFFSET IN DRIVER PAR IN BYTESR0 SUB R1,R2 ;REDUCE ADDRESS TO FIT IN KERNEL 5- ASL R1 ;CONVERT BYTE OFFSET TO 32W BLOCKSB  ASL R1 ;  SWAB R1 ;Y1 ADD 2(R3),R1 ;CALCULATE PHYSICAL MEMORY OFFSETB ! 14$: MOV R1,KISAR5 ;MAP BUFFER3" 15$: MOV (R2)+,-(SP) ;SAVE POINTER TO NEXT BUFFERR&# MOV (R2)+,R0 ;PICK UP SIZE OF BLOCK+$ SUB #4,R0 ;REDUCE COUNT BY HEADER BYTES1)% SUB R0,-(R3) ;IS THERE THAT MUCH LEFT?A& BCC 16$ ;IF CC YES'' ADD (R3),R0 ;ELSE SET CORRECT COUNTB(( CLR (R3) ;CLEAR REMAINING BYTE COUNT2) 16$: MOV -10(R3),R3 ;PICK UP KISAR6 BIAS (I.PRM)(* CALL $BLXIO ;TRANSFER TO USER BUFFER0+ MOV (SP)+,R2 ;RETRIEVE POINTER TO NEXT BUFFER,, MOV (SP),R3 ;RETRIEVE I/O PACKET POINTER(- ADD #I.PRM+10,R3 ;POINT TO BYTE COUNT%. TST (R3)+ ;MORE TO GO? (I.PRM+10)E/ BNE 11$ ;IF NE YES50 17$: MOV (R3),R0 ;POINT TO FIRST BUFFER (I.PRM+12)E41 MOV @I.UCB-(R3),R2 ;POINT TO DRIVER DCB(2 MOV D.PCB(R2),R3 ;POINT TO DRIVER PCB3 4 5 .IF DF K$$DAS6 17 MOV P.REL(R3),KDSAR5 ;MAP DRIVER IN DATA SPACER8 9 .ENDC: ; 2< MOV P.REL(R3),KINAR5 ;MAP DRIVER IN INSTR SPACE3= MOV D.DSP(R2),R2 ;POINT TO DRIVER DISPATCH TABLE5> CALL @D.VDEB(R2) ;CALL DRIVER DEALLOCATION ROUTINE.+? 20$: MOV (SP)+,R3 ;RESTORE PACKET ADDRESS @ TST (R3) ;REGION LOAD AST ?1)A BNE 40$ ;IF NE YES, RE-QUEUE TASK ASTT+B 30$: CALLR $IOFIN ;COMPLETE I/O REQUESTPC (D 40$: MOV I.TCB(R3),R0 ;SET TCB ADDRESS6E MOVB #AK.DIO,A.CBL(R3) ;CHANGE AST TYPE TO "DELAYEDF ;I/O COMPLETION")G CALLR $REQUE ;RE-QUEUE TASK LEVEL ASTCH ,I 50$: INCB T.TIO(R5) ;RE-COUNT BUFFERED I/O J ;FORCE I/O RUNDOWN IF TASKK ;EXITS DURING LOAD AST L RETURN ;EM N .DSABL LSBDO P Q R ;NS ; EXECUTIVE IDLE LOOPRT ;EHU ; THE EXECUTIVE IDLE LOOP IS ENTERED WHEN THERE ARE 00xÊv;vt´cÚµcÛ¶c�·c›’NO RUNNABLE TASKS.GV ; THE NULL TCB AT THE END OF THE TASK LIST IS ALWAYS GUARANTEED TO BE HW ; BLOCKED. TWO FLAGS ARE SET FOR OTHER EXECUTIVE ROUTINES IN THE IDLE X ; LOOP. Y ;YJZ ; 1. THE ADDRESS OF THE NULL TCB (#$ACTHD) IS SET INTO THE RESCHEDULED[ ; POINTER ($RQSCH) TO PREVENT $DIRXT FROM EVER RETURNING TO SYSTEMD\ ; STATE WHILE THE EXEC IS IDLE. THIS FORCES EXECUTION BACK TO THE1] ; IDLE LOOP IN LIEU OF A REAL SCHEDULE REQUEST.^ ;I_ ; 2. AN IDLE FLAG IS SET ($IDLFL) FOR THE FORK ROUTINES TO CAUSE THEM ?` ; TO FORCE CONTROL BACK TO $DIRXT WHEN NECESSARY TO DEQUEUE AOBa ; FORK. (IT IS IMPOSSIBLE FOR THE IDLE LOOP TO ALWAYS RETURN TOBb ; $DIRXT WHEN NECESSARY BECAUSE OF A WINDOW BETWEEN THE CHECK OF,c ; THE FORK LIST AND THE WAIT INSTRUCTION.)d ;$Ge ; THE STACK CANNOT BE USED IF $IDLFL IS SET TO A ONE AND THE PRIORITYHFf ; IS OTHER THAN PR7, BECAUSE WE COULD SUSTAIN AN INTERRUPT RESULTINGFg ; IN A FORK WHICH WOULD FORCE $QFORK TO JAM AN ADDRESS DIRECTLY INTOFh ; THE STACK. IF WE ARE USING THE STACK, THEN IT WOULDN'T KNOW WHEREi ; TO PUT THE ADDRESS.Ej ; k .ENABL LSB(l @m IDOL: MOV #$ACTHD,@$RQSCH ;PREVENT $DIRXT RETURN TO USER STATE-n CLRB @$CURPR ;CLEAR CURRENT TASK PRIORITYCo p ;+q ; ** W A R N I N G **Tr ;Rs ; SPM HOOKPOINT NUMBER 31.t ;T+u ; DO NOT CHANGE THE INSTRUCTION FOLLOWINGIv ; LABEL WITHOUT CHECKING SPMw ;-x -y $SPH31==. ;SPM CHANGES THE INSTRUCTION ATF!z ;THE LOCATION OF THIS LABEL { | } .IF DF M$$PRO~ 0 MOV @#$TKTCB,R0 ;;;GET CURRENT TASK ; BM079$€ BEQ 40$ ;;;IF EQ NO CURRENT TASK8� BIT @$CPCRM,T.RRM(R0) ;CAN THIS TASK RUN ON THIS CPU?+‚ BNE 72$ ;IF NE NO -- REMOVE HIS CONTEXTR<ƒ BIT #TS.BLC,T.STAT(R0) ;;;POSSIBLE FUTURE MAPPING CHANGE?,„ BNE 72$ ;;;IF NE YES -- SAVE THE CONTEXT+… BIT $CPBIT,$URMST ;ARE WE GOING OFFLINE? († BEQ 72$ ;IF EQ YES -- REMOVE CONTEXT<‡ BIS #TS.RUN,T.STAT(R0) ;;;SHOW CURRENT TASK BELONGS TO USˆ -‰ ; RE-ENTRY POINT AFTER STORING TASK CONTEXT Š ,‹ IDLE1: ;;;REF. LABEL FOR CONTEXT SWITCHŒ $� 40$: MTPS #PR7 ;;;UP OUR PRIORITY-Ž BIT $CPBIT,$URMST ;;;ARE WE GOING OFFLINE? � BNE 42$ ;;;IF NE NO72� CALL $OLRNT ;;;TELL HRC... WE MADE IT THIS FAR7‘ ULOCK$ $EXECL,WAIT ;;;CLEAR OUT AND LET THE WORLD IN$!’ HALT ;;;COME TO A DEAD STOP!:“ 42$: DECB $IDLFL ;;;SHOW IN IDLE LOOP - UNINTERRUPTABLE” ;+• ; ** W A R N I N G **B– ;S— ; SPM HOOKPOINT NUMBER 33.˜ ;K+™ ; DO NOT CHANGE THE INSTRUCTION FOLLOWINGSš ; LABEL WITHOUT CHECKING SPM› ;-œ -� $SPH33==. ;SPM CHANGES THE INSTRUCTION ATP!ž ;THE LOCATION OF THIS LABELIŸ -  MOV #$IDLPT,R1 ;;;SET UP FOR LIGHT PATTERNI)¡ ULOCK$ $EXECL,WAIT ;;;UNLOCK EXECUTIVE )¢ JMP DIRXT2 ;;;CHECK FOR WAITING FORKSC£ ¤ .IFFL¥ 4¦ MOV #$IDLPT,R1 ;;;SET FOR IDLE LOOP LIGHT PATTERN$§ INCB $IDLFL ;;;SHOW IN IDLE LOOP'¨ TST $FRKHD ;;;ANYTHING IN FORK LISTN+© BEQ IDLE ;;;IF EQ NO -- ENTER IDLE LOOP ª ;+« ; ** W A R N I N G **U¬ ; ­ ; SPM HOOKPOINT NUMBER 33.® ;I+¯ ; DO NOT CHANGE THE INSTRUCTION FOLLOWINGT° ; LABEL WITHOUT CHECKING SPM± ;-² -³ $SPH33==. ;SPM CHANGES THE INSTRUCTION ATO!´ ;THE LOCATION OF THIS LABELWµ 2¶ CLRB @#$IDLFL ;;;NOT IN IDLE LOOP NOW ; BM079#· JMP $DIRXT ;;;EXECUTE THE FORKSV¸ ;;;ENTER EXECUTIVE¹ º .ENDC» 0¼ ; INTERMEDIATE TARGET TO JUMP TO STORE CONTEXT½ +¾ 72$: JMP STCTX ;GO STORE CONTEXT OF TASK;¿ 3À IDLE: CACHE$ RESTOR ;RESTORE CACHE TO NON-BYPASS*'Á MOV (R1)+,(R1) ;RESTORE IDLE PATTERN & DECB $IDLCT ;TIME TO MOVE PATTERN?à BGE 45$ ;IF GE NOHÄ MOVB #2,$IDLCT ;RESET COUNT%Å ASLB (R1)+ ;MOVE PATTERN ($IDLPT)AÆ RORB (R1) ;($IDLPT+1)TÇ ADCB -(R1) ;($IDLPT)9È 45$: MOV (R1),R0 ;PUT IT WHERE IT CAN BE SEEN ($IDLPT);&É MOV R0,-(R1) ;SAVE IT FOR NEXT TIMEÊ WAITË Ì ;HÍ ; IF $IIPND HAS ANY OF OUR URMS SET, WE SHOULDN'T BE IN THE IDLE LOOP.FÎ ; IF WE HAVE JUST POWERFAILED, THEN THIS CODE PATH MAY BE TAKEN. IFIÏ ; NOT, WE SHOULD NEVER EXECUTE IT. STILL, ITS NICE BELT AND SUSPENDER00xÒv)vtöt÷tø tþfDATAST5Ð ; TECHNIQUE. NOT MUCH ELSE TO DO IN THE IDLE LOOP.2Ñ ;CÒ Ó Ô .IF DF M$$PROÕ 2Ö CACHE$ BYPASS ;MAKE SURE WE GET THE REAL THING'× BIT @$CPURM,$IIPND ;ANY WORK FOR US?1-Ø BEQ IDLE ;IF EQ NO, IDLE AROUND SOME MORE $Ù JMP DIRXT2 ;GO FIND OUT FOR SUREÚ Û .IFFÜ "Ý BR IDLE ;IF NO MULTIPROCESSINGÞ ß .ENDCà á .DSABL LSBLâ ã ;+8ä ; **-$SGFIN-SEGMENT FAULT AND TRAP 4 INTERCEPT ROUTINEå ; Gæ ; THIS ROUTINE IS A CO-ROUTINE WHICH SETS UP TO IGNORE SEGMENT FAULTSDç ; AND TRAPS THROUGH 4.è ;E é ; INPUTS:Tê ;L ë ; NONE. ì ; í ; OUTPUTS:î ;P ï ; NONE.Cð ;-ñ 7ò $SGFIN::MOV @#4,-(SP) ;SAVE CONTENTS OF TRAP 4 VECTORNó ô õ .IF DF P$$D70ö 3÷ MOV $SGFFR,-(SP) ;SAVE LAST $SGFIN FRAME POINTER 7ø MOV @#114,-(SP) ;SAVE MAIN MEMORY TIMEOUT AND PARITY 'ù MOV 6(SP),-(SP) ;COPY RETURN ADDRESS..ú MOV @#250,10(SP) ;SAVE SEGMENT TRAP ADDRESS$û MOV #20$,@#114 ;TRAP THESE FAULTSü ý .IFFIþ 'ÿ MOV 2(SP),-(SP) ;COPY RETURN ADDRESSG9 MOV @#250,4(SP) ;SAVE CONTENTS OF SEGMENT FAULT VECTOR  .IFTF . MOV #10$,@#4 ;POINT TO ROUTINE TO SET CARRY MOV #10$,@#250 ;P  ;O$ ; CONTENTS OF STACK AT THIS POINT: ; - ; 0(SP)=COROUTINE RETURN ADDRESS TO CALLER.I* ; 2(SP)=CONTENTS OF @#114 (IF DF P$$D70)) ; 4(SP)=SAVE $SGFFR CELL (IF DF P$$D70)) ; 6(SP)=CONTENTS OF @#4. ; 10(SP)=CONTENTS OF @#250 ;    .IFTM $ MOV SP,$SGFFR ;SAVE FRAME POINTER1 ADD #6,$SGFFR ;ADJUST TO POINT TO SAVED TRAP 4  .IFTF ! CALL @(SP)+ ;RETURN TO CALLERC  .IFT. 4 MOV (SP)+,@#114 ;RESTORE MAIN MEMORY TIMEOUT TRAP0 MOV (SP)+,$SGFFR ;RESTORE SAVED FRAME POINTER  .IFTF! '" MOV (SP)+,@#4 ;RESTORE TRAP 4 VECTORS5# BIC #160000,@#SR0 ;UNFREEZE MEMORY MANAGEMENT UNIT)0$ MOV (SP)+,@#250 ;RESTORE SEGMENT FAULT VECTOR&% RETURN ;RETURN TO CALLER'S CALLER& ' 10$: ;REFERENCE LABEL( ) .IFTM* + ;F,, ; TRAP 4 SERVICE FOR 11/70 CLASS MACHINES.- ; E. ; THIS TRAP SERVICE RESETS THE VECTOR AT FOUR, AND THEN ATTEMPTS TOLG/ ; CLEAR THE CPU ERROR REGISTER. IF THE REGISTER ISN'T THERE, WE WILLRE0 ; TRAP THRU FOUR, AND GO TO 15$, WHERE WE WILL CLEAR THE EQUAL BIT,I1 ; SET THE CARRY BIT, AND RTI. AFTER THE ATTEMPT TO CLEAR THE CPU ERRORMF2 ; REGISTER, WE CHECK THE CARRY TO SEE IF IT WAS REALLY THERE, AND IFE3 ; IT WAS, THEN WE CHECK IT TO SEE IF THIS WAS ONE OF THE CONDITIONSE4 ; THAT WE EXPECT IN $SGFIN. IF IT ISN'T, THEN WE ACT LIKE THIS WAS 5 ; A NORMAL TRAP TO FOUR.6 ;T7 +8 MOV #15$,@#4 ;RESET TRAP TO FOUR ADDRESSA#9 CLC ;SET UP CARRY PROPERLY NOWI1: BIC #60,@#177766 ;CLEAR OUT CPU ERROR REGISTER '; BCS 12$ ;IF CS REGISTER ISN'T THEREB(< BEQ 12$ ;IF EQ WE CLEARED IT ALL OUT= > ;TE? ; HERE WE HAVE FOUND A PROBLEM: WE HAVE TAKEN A TRAP THROUGH VECTORFC@ ; LOCATION 4, BUT THE REASON WAS NOT FOR NON-EXISTANT MEMORY. INTHA ; THIS CASE, WE WISH TO SIMULATE A TRAP THROUGH THE CONTENTS OF VECTORHB ; FOUR PRIOR TO THE TIME THAT $SGFIN PLACED ITS OWN VALUE IN IT. THISJC ; IS POINTED TO ON THE STACK BY THE $SGFFR POINTER. IT SEEMS REASONABLEHD ; TO SIMPLY DISPATCH THROUGH THAT LOCATION, WHICH WE WILL DO. IF THISFE ; IS NOT A GOOD IDEA, THIS IMPLEMENTATION WILL ALLOW UNTHREADING THEEF ; STACK UNTIL THE ULTIMATE RESOLUTION OF THE NESTED CALLS TO $SGFINFG ; IS EFFECTED.H ;HI ,J MOV @$SGFFR,-(SP) ;GET ADDRESS TO JUMP TOK JMP @(SP)+ ;JUMP THERECL 11$: MOV #104001,@#177744 ;CLEAR OUT MEMORY SYSTEM ERROR REGISTERE>M 12$: MOV #10$,@#4 ;RESET TRAP 4 (WHETHER IT NEEDS IT OR NOT)N O .IFTFP $Q 15$: BIC #4,2(SP) ;CLEAR EQUAL BITR BIS #1,2(SP) ;SET CARRY BITS RTIT U .IFTCV W ; X ; TRAP 114 SERVICEY ;GFZ ; THIS TRAP SERVICE ACCEPTS TRAPS TO 114 ON PDP-11/70 CLASS MACHINESF[ ; SO THAT ATTEMPTS TO REFERENCE NON-EXISTANT MEMORY BELOW THE SYSTEMF\ ; SIZE REGISTER DOESN'T LOOK LIKE A PARITY ERROR. THIS SERVICE ALSOC] ; ATTEMPTS TO VERIFY IF THE CAUSE OF THE TRAP TO 114 IS IN FACT AEC^ ; NON-EXISTANT MEMORY CONDITION, OR IF IT WAS 00xÚv;vt´cÚµcÛ¶c�·c›’SOME OTHER PROBLEM.TF_ ; IF IT WAS SOME OTHER PROBLEM, TRANSFER IS MADE TO THE PARITY ERRORF` ; SERVICE ROUTINE. IF IT WAS NON-EXISTANT MEMORY, THEN THE REGISTER2a ; IS CLEARED AND THE NORMAL CODE FLOW REENTERED.b ;OGc ; A SPECIAL CASE EXISTS IN THE CASE WHERE A TRAP 114 OCCURRED, AND WETEd ; ARE NOT ON A SYSTEM WITH A MEMORY SYSTEM ERROR REGISTER. IN THISEIe ; CASE, THE CMP ACCESS WILL FAIL, TRAPPING THRU 4, WHICH WILL ENCOUNTEROIf ; THE CODE IN $SGFIN MENTIONED ABOVE. THIS CODE WILL CLEAR THE EQ BIT,HFg ; SO THAT THE COMPARISON WILL FAIL, CAUSING A TRANSFER TO THE PARITYJh ; ERROR SERVICE ROUTINE. THIS IS THE DESIRED RESULT, SINCE THE ONLY WAYLi ; WE COULD TRAP TO 114 ON A MACHINE WITHOUT A MEMORY SYSTEM ERROR REGISTERCj ; (OR SYSTEM SIZE REGISTER) WAS TO ENCOUNTER A REAL PARITY ERROR.Rk ; l 9m 20$: CMP #104001,@#177744 ;IS THIS MAIN MEMORY TIMEOUT? .n BEQ 11$ ;IF EQ YES -- SET CARRY AND RETURNo p .IF DF P$$RTYq *r JMP $PARER ;NO -- THIS IS PARITY ERRORs t .IFF ; DF P$$RTYTu >v BGCK$A BF.PAR,BE.SGN,HALT ;PARITY ERROR, P$$RTY NOT DEFINEDw x .ENDC ; DF P$$RTYy z { .ENDC| } ~ ;+ ; **$SWSTK-SWITCH STACKS€ ;CB� ; THIS ROUTINE IS CALLED FROM TASK LEVEL TO SWITCH TO THE SYSTEMB‚ ; STACK THUS INHIBITING TASK SWITCHING. THE CALLING TASK MUST BEDƒ ; PRIVILEGED IF RUNNING IN A MAPPED SYSTEM AND MAPPED TO THE EXEC.D„ ; CONTROL IS PASSED HERE FROM DRDSP AFTER THE TRAP HAS OCCURED AND… ; $DIRSV HAS BEEN CALLED. † ;I‡ ; CALLING SEQUENCE:.ˆ ; %‰ ; EMT 376 ;TRAP TO $EMSST IN DRDSP,1Š ; .WORD ADDR ;ADDRESS FOR RETURN TO USER STATEC‹ ; Œ ; INPUTS AT THIS POINT: � ;.Ž ; R3=ADDRESS OF PC WORD OF TRAP ON STACK + 2� ;I� ; MAPPED SYSTEM:‘ ;L’ ; 22(SP)=PS PUSHED BY TRAP“ ; 20(SP)=PC PUSHED BY TRAP” ; 16(SP)=SAVED R5A• ; 14(SP)=SAVED R4L– ; 12(SP)=SAVED R3M— ; 10(SP)=SAVED R2E˜ ; 06(SP)=SAVED R1O™ ; 04(SP)=SAVED R0F)š ; 02(SP)=RETURN ADDRESS FOR SYSTEM EXIT › ; 00(SP)=104376Aœ ; � ; OUTPUTS:ž ; BŸ ; THE USER IS CALLED BACK ON THE SYSTEM STACK WITH ALL REGISTERSB  ; PRESERVED. TO RETURN TO TASK LEVEL THE CALLER MERELY EXECUTES ¡ ; A RETURN. ¢ ;A?£ ; NOTE: PRIVILEGED TASKS MAY ONLY CALL $SWSTK FROM SUPERVISOR:;¤ ; MODE IF BOTH SUPERVISOR MODE AND KERNEL DATA SPACE ARE ;¥ ; SUPPORTED IN THE EXEC. FURTHERMORE, THEY MUST ONLY DOS+¦ ; SO WITH CODE RUNNING IN APRS 5, 6 & 7.V§ ;-¨ -© $SWSTK::BICB #357,(R3) ;SET INITIAL PS WORDOª « .IF DF K$$DAS&S$$LIB4¬ +­ TST $STACK-2 ;CALL FROM SUPERVISOR MODE?A® BMI 5$ ;IF MI NO%¯ MOV SDSAR5,KDSAR5 ;COPY SUPERVISORE"° MOV SDSAR6,KDSAR6 ;DATA MAPPING.± MOV SISAR5,KINAR5 ;COPY SUPER INSTR MAPPING² MOV SISAR6,KINAR6 ;³ MOV SISAR7,KINAR7 ;!´ BR 10$ ;FINISH IN COMMON CODEVµ ¶ .ENDC· ¸ +¹ 5$: MOV #UINAR5,R5 ;POINT TO USER I APR 5Fº » .IF DF K$$DAS¼ ½ .IF DF U$$DAS¾ 5¿ MOV UDSAR0-UINAR0(R5),KDSAR5 ;SET UP KERNEL DATA 5#À Á .IFF ; DF U$$DASW (à MOV (R5),KDSAR5 ;SET UP KERNEL DATA 5Ä Å .ENDC ; DF U$$DASÆ Ç .IFTF ; DF K$$DASÈ )É MOV (R5)+,KINAR5 ;SET UP KERNEL INST 5EÊ Ë .IFT ; DF K$$DASAÌ Í .IF DF U$$DASÎ 5Ï MOV UDSAR0-UINAR0(R5),KDSAR6 ;SET UP KERNEL DATA 6;Ð Ñ .IFF ;DF U$$DASÒ (Ó MOV (R5),KDSAR6 ;SET UP KERNEL DATA 6Ô Õ .ENDC ;DF U$$DASUÖ × .ENDC ;DF K$$DAS Ø Ù .IF DF K$$DAS&U$$DASÚ )Û MOV (R5)+,KINAR6 ;SET UP KERNEL INST 6R)Ü MOV (R5)+,KINAR7 ;SET UP KERNEL INST 7FÝ Þ .IFFWß (à MOV (R5),KINAR6 ;SET UP KERNEL INST 6á â .ENDC ;DF K$$DAS&U$$DASã ä )å 10$: MOV -(R3),R5 ;PICK UP TRAP PC WORDUæ ç .IF DF U$$DAS!K$$DAS&S$$LIBè 4é MFPI (R5)+ ;GET ADDRESS FOR RETURN TO USER STATE0ê MOV (SP)+,(R3) ;FROM CORRECT SPACE AND SET ITë !ì .IFF ; DF U$$DAS!K$$DAS&S$$LIBRí 7î MOV (R5)+,(R3) ;SET ADDRESS FOR RETURN TO USER STATE ï "ð .ENDC ; DF U$$DAS!K$$DAS&S$$LIBñ %ò MOV R5,(SP) ;SET CALLER'S ADDRESSMó MOV -(R3),R5 ;RESTORE R5Lô MOV 12(SP),R3 ;RESTORE R3õ ;+ö ; ** W A R N I N G ** ÷ ;6ø ; SPM HOOKPOINT NUMBER 70.ù ; +00xâv)vtöt÷tø tþfDATAú ; DO NOT CHANGE THE INSTRUCTION FOLLOWINGRû ; LABEL WITHOUT CHECKING SPMü ;-ý -þ $SPH70==. ;SPM CHANGES THE INSTRUCTION ATR!ÿ ;THE LOCATION OF THIS LABELR ! CALLR @(SP)+ ;CALL THE CALLERU  ;+( ; **-$LSUPD-LOAD SUPERVISOR DATA SPACE ;FC ; THIS ROUTINE IS CALLED BEFORE TRANSFERRING CONTROL TO A TASK INA ; SUPERVISOR MODE TO LOAD SUPERVISOR D SPACE FROM USER I SPACE.L ;M ; INPUTS:; ;R ; NONE. ;* ; OUTPUTS: ; ; R2 AND R3 ARE PRESERVED. ;-   .IF DF S$$LIB D $LSUPD::BIC #^CPSMODE&PMODE,PS ;SWITCH PREVIOUS MODE TO SUPERVISOR/ $LSUP1:: ;GLOBAL ENTRY WHICH DOESN'T AFFECTT ;MODE BITS IN THE PSW . LSUPD1: BIS #10,SR3 ;ENABLE CSM INSTRUCTION' MOV #UISDR0,R0 ;POINT TO USER D PDR0( MOV #SDSDR0,R1 ;POINT TO SUPER D PDR0% MOV R3,-(SP) ;SAVE A WORK REGISTERU  .IF DF X$$HDR . MOV KISAR6,-(SP) ;SAVE CURRENT EXEC MAPPING/ MOV $SAHDB,KISAR6 ;MAP TO HEADER IF EXTERNAL! " .IFTF ; DF X$$HDR# ,$ MOV $SAHPT,R3 ;GET ADDRESS OF TASK HEADER'% MOVB H.SMAP(R3),R3 ;GET MAPPING MASK #& BNE 30$ ;IF NE MAPPING IS MIXEDB' H( ; THIS SECTION HANDLES THE UNMIXED CASE (ALL SUPER D MAPPED TO USER D)/) ; IN STRAIGHT LINE CODE FOR PERFORMANCE SAKE. * 4+ 10$: MOV (R0)+,(R1)+ ;COPY USER I TO SUPER D SPACE, MOV (R0)+,(R1)+ ;- MOV (R0)+,(R1)+ ;. MOV (R0)+,(R1)+ ;/ MOV (R0)+,(R1)+ ;0 MOV (R0)+,(R1)+ ;1 MOV (R0)+,(R1)+ ;2 MOV (R0),(R1) ;3 CMP R1,#SDSAR7 ;DONE YET?4 BEQ 20$ ;IF EQ YES'5 MOV #UISAR0,R0 ;POINT TO USER I APR0(6 MOV #SDSAR0,R1 ;POINT TO SUPER D APR07 BR 10$ ;PERFORM COPY8 20$:9 .IFT ; DF X$$HDRI: 2; MOV (SP)+,KISAR6 ;RESTORE PREVIOUS EXEC MAPPING< = .IFTF ; DF X$$HDR> &? MOV (SP)+,R3 ;RESTORE WORK REGISTER @ RETURN ;YA GB ; THIS SECTION HANDLES THE MIXED CASE WHERE SOME OF SUPER D IS MAPPED(BC ; TO USER D AND SOME IS MAPPED TO SUPER I BY INTERPRETING H.SMAPD *E 30$: MOV R2,-(SP) ;SAVE ANOTHER REGISTER-F MOV #SISDR0,R2 ;POINT TO SUPER I REGISTERSI2G BIS #100000,R3 ;SET DONE FLAG BIT INTO REGISTER*H ASLB R3 ;ADJUST REGISTER FOR FACT THAT*I ;BIT ZERO OF MAP CORRESPONDS TO APR1)J 40$: ASR R3 ;CHECK NEXT BIT (NEXT APR)G-K BCC 50$ ;IF CC NEXT APR MAPS USER D SPACE 7L MOV SISAR0-SISDR0(R2),SDSAR0-SDSDR0(R1) ;SET ADDRESSI)M MOV (R2)+,(R1)+ ;SET ACCESS AND LENGTHE$N TST (R0)+ ;ADJUST USER D POINTERO BR 60$ ;ON TO NEXT ONE;P 50$: MOV UISAR0-UISDR0(R0),SDSAR0-SDSDR0(R1) ;SET ADDRESST)Q MOV (R0)+,(R1)+ ;SET ACCESS AND LENGTHI%R TST (R2)+ ;ADJUST SUPER I POINTERGS 60$: TSTB R3 ;MORE TO GO ? T BPL 40$ ;IF PL YES"U MOV (SP)+,R2 ;RESTORE REGISTERSV W .IFT ; DF X$$HDRRX 2Y MOV (SP)+,KISAR6 ;RESTORE PREVIOUS EXEC MAPPINGZ [ .ENDC ; DF X$$HDR\ ] MOV (SP)+,R3 ;FOR RETURND ^ RETURN ;D_ ` a .ENDCb c d ;+?e ; **-CKMAP-CHECK TASK MAPPING TO DETERMINE IF IT CAN RUN NOW.0f ;NFg ; THIS ROUTINE DETERMINES IF THERE ARE MULTIPLE RUNNING TASKS MAPPEDh ; TO THE SAME REGION.Ei ;E j ; INPUTS:Ik ;TCl ; R2=HEADER ADDRESS FOR TASK BEING TESTED FOR ELIGIBILITY TO RUN. @m ; R5=TCB ADDRESS FOR TASK BEING TESTED FOR ELIGIBILITY TO RUN.n ; o ; OUTPUTS:p ;Mq ; C=0 IF TASK CAN RUN NOW.>r ; C=1 IF TASK CANNOT RUN NOW BECAUSE THERE ARE OTHER RUNNING;s ; TASKS MAPPED TO A REGION WHICH THIS TASK IS MAPPED TO.t ;*u ;-v w $CKMAP::x y z .IF DF M$$PRO{ &| CLR -(SP) ;ASSUME TASK CAN RUN NOW} MOV R0,-(SP) ;SAVE REGISTERSA~ MOV R1,-(SP) ;T MOV R2,-(SP) ; € MOV R3,-(SP) ; � MOV R4,-(SP) ;D‚ ƒ .IF DF X$$HDR„ )… MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGE† ‡ .IFTF ; DF X$$HDRˆ <‰ MOV H.WND(R2),R0 ;POINT TO # OF WINDOWS IN TASK TO BE RUN-Š MOV (R0)+,-(SP) ;GET THE NUMBER OF WINDOWSC‹ Œ 10$: ;REFERENCE LABEL� .IFT ; DF X$$HDRRŽ 2� MOV #$DICSV,R3 ;POINT TO INTERMEDIATE SAVE AREA$� MOV R0,(R3)+ ;SAVE WINDOW ADDRESS‘ ’ “ .REPT C” /• MOV (R0)+,(R3)+ ;COPY ADDR WNDW TO SAVE AREAR– — .ENDR˜ 6™ SUB #W.BLGH,R3 ;POINTER00xêvyðvt´cÚµcÛ¶c�·c›’ TO BEGINNING OF WINDOW AREA+š MOV R3,R0 ;POINT TO WINDOW IN SAVE AREAS› œ � .IFTF ; DF X$$HDRž Ÿ TST (R0) ;IS WINDOW MAPPED?)  BEQ 90$ ;IF EQ NOO¡ ¢ £ .IFTF ; DF X$$HDR¤ /¥ MOV #M$$PRO,R1 ;GET THE NUMBER OF PROCESSORS %¦ MOV #$TKTAB,R2 ;POINT TO TCB TABLE)§ 20$: MOV (R2)+,R3 ;GET NEXT TCB ADDRESSE3¨ BEQ 80$ ;IF EQ THERE IS NO CURRENT TASK ON PROC© CMP R5,R3 ;IS THIS OUR TCB?Mª BEQ 80$ ;IF EQ YES SKIP IT=« BIT #T4.SNC,T.ST4(R3) ;DOES TASK SYNCHRONIZE THRU COMMONS?E¬ BEQ 80$ ;IF EQ NO/­ BIT #^C,T.STAT(R3) ;IS TASK BLOCKED?® BNE 80$ ;IF NE YES?¯ BIT #T2.STP!T2.WFR,T.ST2(R3) ;IS TASK STOPPED OR IN WAITFOR? ° BNE 80$ ;IF NE YES3± MOV T.PCB(R3),R3 ;GET ADDRESS OF TASK REGION PCBR² ³ .IFT ; DF X$$HDRI´ ,µ MOV P.REL(R3),KISAR6 ;MAP EXTERNAL HEADER,¶ MOV P.HDR(R3),R3 ;GET TASK HEADER ADDRESS(· BNE 25$ ;IF NE, TASK HAS POOL HEADER4¸ MOV #140000,R3 ;OTHERWISE, TASK HAS EXTRNL HEADER¹ 25$: ;REFERENCE LABELº » .IFF ; DF X$$HDR¼ /½ MOV P.HDR(R3),R3 ;GET ADDRESS OF TASK HEADER ¾ ¿ .IFTF ; DF X$$HDRÀ /Á MOV H.WND(R3),R3 ;POINT TO NUMBER OF WINDOWS - MOV (R3)+,-(SP) ;GET THE NUMBER OF WINDOWSE0à 30$: CMP (R0),(R3) ;MAPPED TO THE SAME REGION?Ä BNE 70$ ;IF NE NO ?Å CMP W.BOFF(R0),W.BOFF(R3) ;DOES TASK TO BE RUN HAVE A REGIONM*Æ ;WHICH OVERLAPS THE REGION OF A TASK$Ç ;RUNNING ON ANOTHER PROCESSOR?È BEQ 60$ ;IF EQ YESÉ BHI 50$ ;IF HI MAYBE<Ê MOV W.BOFF(R0),R4 ;SAVE REGION OFFSET FOR TASK TO BE RUN2Ë ADD W.BSIZ(R0),R4 ;CALCULATE END OF MAPPED AREA'Ì CMP R4,W.BOFF(R3) ;REGIONS OVERLAP?DÍ BHI 60$ ;IF HI YES"Î BR 70$ ;REGIONS DO NOT OVERLAP=Ï 50$: MOV W.BOFF(R3),R4 ;GET REGION OFFSET FOR RUNNING TASKA2Ð ADD W.BSIZ(R3),R4 ;CALCULATE END OF MAPPED AREA*Ñ CMP R4,W.BOFF(R0) ;DO REGIONS OVERLAP?Ò BLOS 70$ ;IF LOS NOP9Ó 60$: INC 16(SP) ;INDICATE OVERLAP, TASK CANNOT RUN NOW?Ô TST (SP)+ ;CLEAN THE STACK Õ BR 100$ ;Y;Ö 70$: ADD #W.BLGH,R3 ;POINT TO NEXT WINDOW IN RUNNING TASKR× DEC (SP) ;ANY MORE WINDOWS?TØ BNE 30$ ;IF NE YESÙ TST (SP)+ ;CLEAN THE STACK8Ú 80$: SOB R1,20$ ;CONTINUE SCAN WITH NEXT RUNNING TASKÛ Ü .IFF ; DF X$$HDRFÝ =Þ 90$: ADD #W.BLGH,R0 ;POINT TO NEXT WINDOW OF TASK TO BE RUN4ß à .IFT ; DF X$$HDR á Aâ 90$: MOV 2(SP),KISAR6 ;RESTORE POSSIBLE MAPPING TO XTRNL HEADERN3ã ADD #W.BLGH,-(R0) ;SET UP POINTER TO NEXT WINDOW ä MOV (R0),R0 ;På æ .IFTF ; DF X$$HDRç è DEC (SP) ;ANY MORE WINDOWS?Ié BNE 10$ ;IF NE YES#ê 100$: TST (SP)+ ;CLEAN THE STACKNë ì .IFT ; DF X$$HDREí -î MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING,ï ð .ENDC ; DF X$$HDRñ "ò MOV (SP)+,R4 ;RESTORE REGISTERSó MOV (SP)+,R3 ;#ô MOV (SP)+,R2 ; õ MOV (SP)+,R1 ; ö MOV (SP)+,R0 ;.5÷ ROR (SP)+ ;CLEAN STACK AND RETURN STATUS IN CARRYP ø RETURN ; ù ú .ENDCû ü ý .ENDH,-(R0) ;SET UP POINTER TO NEXT WINDOW ä MOV (R0),R0 ;På æ .IFTF ; DF X$$HDRç è DEC (SP) ;ANY MORE WINDOWS?Ié BNE 10$ ;IF NE YES .TITLE DVINTT .IDENT /03.01/R ;TC; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;P<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; P. J. BEZEREDI 04-OCT-77;F; +; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:I; ; P. J. BEZEREDI; ; T. LEKASM; ;+; MODIFIED BY:;E; J. W. BERZLE 07-SEP-83 03.00; 2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES;E ; B. S. MCCARTHY 30-MAy-84 03.01;/; BM309 -- STREAMLINE PORCESSING OF INTERRUPTSL;U;E;C;OB; OVERLAPPED SEEK/MIXED MASSBUS/LOADABLE DRIVER INTERRUPT ROUTINES1; FOR RH11/RH70(DB,DR,DS,MM,MF,EM) AND RK611(DM). ;O; MACRO LIBRARY CALLSF;C1 .MCALL DCBDF$,HWDDF$,KRBDF$,PCBDF$,SCBDF$,BGCK$A DCBDF$ ;DEFINE DCB OFFSETSS$ HWDDF$ ;DEFINE HARDWARE REGISTERS KRBDF$ ;DEFINE KRB OFFSETSI# PCBDF$ ;DEFINE PARTITION OFFSETS0 SCBDF$ ;DEFINE SCB OFFSETSH;A; EQUATED SYMBOLSD;00yòv)vtöt÷tø tþfDATA ;RH11/70 REGISTER OFFSETS./RHCS2= 10 ;OFFSET TO CONTROL STATUS RGISTER 2R0RHAS= 16 ;OFFSET TO ATTENTION SUMMARY REGISTER)RHDT= 26 ;OFFSET TO DRIVE TYPE REGISTER  ;RK611 REGISTER OFFSETS)0RKCS2= 10 ;OFFSET TO CONTROL STATUS REGISTER 2/RKAS= 16 ;OFFSET TO ATTENTION/OFFSET REGISTER&IE= 100 ;INTERRUPT ENABLE BIT IN CSR CERR= 100000 ;ERROR BIT IN CSRRDY= 200 ;READY BIT IN CSR;+@; THIS MACRO DEFINES THE CODE USED TO SET THE INTERRUPT PRIORITYB; AND CALCULATE THE CONTROLLER INDEX. ON NON D-SPACE SYSTEMS, THEA; ROUTINE $INTSE IS CALLED. FOR D-SPACE SYSTEMS, CODE TO EMULATETB; THE ROUTINE $INTSE IS USED TO LOAD THE NEW PRIORITY DIRECTLY AND4; THEN RETURN BACK INTO THE MAINLINE CODE IN $INTSE.;CA; NOTE: CHANGES TO THIS MACRO MUST FOLLOW ANY CHANGES IN THE CODEG9; IN $INTSE (SYSXT) AND THE CLOCK INTERRUPT CODE (TDSCH).0;- .MACRO INTSAV .IF NDF K$$DAS - JSR R5,$INTSE ;;;CALL INTERRUPT SAVE ROUTINES) .WORD ^C&PR7 ;;;NEW PRIORITY IS PR5C .IFF 0 JSR R5,(PC) ;;;SAVE R5 WITHOUT DISTURBING CC'S0 JSR R4,(PC) ;;;SAVE R4 WITHOUT DISTURBING CC'S/ MFPS R4 ;;;GET PSW INCLUDING CONTROLLER INDEXD/ BIC #^C<17>,R4 ;;;ISOLATE THE CONTROLLER INDEXK ASL R4 ;;;MAKE IT A WORD INDEX DEC $STKDP ;;;SWITCH STACKS?51$: BIC #^C&PR7,@#PS ;;;SET NEW PRIORITY TO PR5S+ CACHE$ SAVE ;;;SAVE BYPASS STATE OF CACHE4 MOV #$INTSF,-(SP) ;;;SET TO RETURN BACK INTO $INTSE .ENDC .ENDM INTSAV ;+'; **-$RHALT-RH11/RH70 INTERRUPT HANDLERC;C; THIS ROUTINE IS ENTERED DIRECTLY VIA AN RH11/70 INTERRUPT VECTOR.PD; USING THE CONTROLLER INDEX, THE KRB OF THE INTERRUPTING RH11/70 ISB; FOUND. IF THE INTERRUPT WAS FROM A DATA TRANSFER OPERATION, THEF; INITIAL ATTENTION BIT SCAN IS BYPASSED AND A FORK BLOCK IS QUEUED TOF; THE DRIVER. IF THE INTERRUPT WAS CAUSED BY A POSITIONING OPERATION,E; THE CURRENT ACTIVE ATTENTION BITS ARE USED TO INDEX INTO A TABLE OF D; UCB ADDRESSES AND A CALL IS MADE TO THE PROPER UNIT'S DRIVER WHICHE; THEN IMMEDIATELY $FORK AND RETURN HERE WHERE THE NEXT ATTENTION BITNC; WILL BE TESTED. WHEN ALL EIGHT ATTENTION BITS HAVE BEEN TESTED AUF; CHECK IS MADE TO SEE IF ANY ATTENTIONS MAY HAVE COME UP. IF SO, THEA; ALGORITHM IS REPEATED UNTIL NO ATTENTIONS BITS REMAIN SET. ALLLC; ATTENTIONS FROM UNITS WHICH ARE NOT CONFIGURED INTO THE DATA BASEI; WILL BE EXPLICITLY CLEARED.N;CE; IF THE RH CONTROLLER HAS A UNIT WHICH HAS SLAVE UNITS (TM02/03) THE G; ATTENTION WILL BE CLEARED BASED ON THE MASTER'S UNIT NUMBER (U.UNIT).$E; IF OVERLAPPED OPERATIONS ARE ENABLED AND NO DATA TRANSFER CURRENTLYWE; IS ACTIVE, THE MASTER'S DRIVER WILL BE CALLED WITH THE UCB FOUND INE; THE UCB LIST.S;Y ; INPUTS:U; NONE.,;E ; OUTPUTS:@; ATTENTION REGISTER CLEARED (ALL PENDING ATTENTIONS PROCESSED).;S5; ALL REGISTERS ARE PRESERVED (R4 AND R5 VIA $INTSE).I;- .IF DF R$$HDV0$RHALT::INTSAV ;;;CALL $INTSE AND SET PRIORITY MOV R3,-(SP) ;;;SAVE REGISTERS MOV R2,-(SP) ;;;... MOV R1,-(SP) ;;;... MOV R0,-(SP) ;;;...8 MOV $RHCTB(R4),R3 ;;;GET KRB OF INTERRUPTING CONTROLLER(5$: MOV (R3),R4 ;;;GET IT'S CSR ADDRESS4 ADD #RHAS,R4 ;;;POINT TO ATTENTION SUMMARY REGISTER5 BIT #KS.DIP,K.STS(R3) ;;;DATA TRANSFER IN PROGRESS?: BNE 80$ ;;;IF NE YES#10$: MOV R3,R5 ;;;COPY KRB ADDRESSS' ADD K.OFF(R3),R5 ;;;POINT TO UCB TABLER% TSTB (R4) ;;;ANY ATTENTIONS ACTIVE? % BNE 20$ ;;;IF NE ATTENTIONS WERE UPS&15$: MOV (SP)+,R0 ;;;RESTORE REGISTERS MOV (SP)+,R1 ;;;... MOV (SP)+,R2 ;;;... MOV (SP)+,R3 ;;;...* RETURN ;;;RETURN TO INTERRUPTED PROCESS;I%; ATTENTIONS WERE FOUND TO BE ACTIVE. ;;420$: MOV #177001,R1 ;;;PRESET ATTENTION SUMMARY MASK+25$: BITB R1,(R4) ;;;IS THIS ATTENTION UP?  BNE 40$ ;;;IF NE YES,30$: TST (R5)+ ;;;POINT TO NEXT UCB ADDRESS" CMP #-1,(R5) ;;;END OF UCB TABLE? BEQ 35$ ;;;IF EQ YES$ ASL R1 ;;;NO, SHIFT ATTENTION MASK- BCC 10$ ;;;IF CC ALL ATTENTION BITS SCANNED, TSTB (R4) ;;;ANY ATTENTIONS STILL PENDING? BEQ 15$ ;;;IF EQ NOP BR 25$ ;;;TRY THE NEXT ONE035$: SWAB R1 ;;;PUT REMAINI00yúvðvt´cÚµcÛ¶c�·c›’NG MASKS IN LOW BYTE1 BITB R1,(R4) ;;;UNCONFIGURED ATTENTIONS ACTIVE?: BEQ 10$ ;;;IF EQ NOE, MOVB (R4),R2 ;;;COPY ACTIVE ATTENTION BITS COMB R1 ;;;TOGGLE MASK BITS43 BICB R1,R2 ;;;ISOLATE UNCONFIGURED ATTENTION BITSB2 MOVB R2,(R4) ;;;DROP ALL UNCONFIGURED ATTENTIONS' BR 10$ ;;;TRY FOR MORE ATTENTION BITST;T8; AT THIS POINT WE ARE POINTING TO THE UCB ADDRESS OF AN; ACTIVE ATTENTION.T;I%40$: MOV (R5),R2 ;;;COPY UCB ADDRESSN$ BNE 45$ ;;;IF NE UCB REALLY EXISTS, MOVB R1,(R4) ;;;DROP THIS UNIT'S ATTENTION$ BR 30$ ;;;LOOP FOR MORE ATTENTIONS(45$: MOV U.SCB(R2),R2 ;;;GET SCB ADDRESS< BITB #S3.ATN,S.ST3(R2) ;;;WILL DRIVER CLEAR THE ATTENTION? BNE 50$ ;;;IF NE YES, MOVB R1,(R4) ;;;DROP THIS UNIT'S ATTENTION)50$: MOV (R5),R5 ;;;RETREIVE UCB ADDRESSO(55$: CALL MAPDRV ;;;MAP AND CALL DRIVER3 BIT #KS.DIP,K.STS(R3) ;;;DATA TRANSFER INTERRUPT?D BEQ 10$ ;;;IF EQ NOT>70$: BIC #KS.DIP,K.STS(R3) ;;;RESET DATA TRANSFER IN PROGRESS" BR 5$ ;;;TRY FOR MORE ATTENTIONS;4 ; DATA TRANSFER WAS IN PROGRESS.; 080$: MOV K.OWN(R3),R5 ;;;GET OWNER'S UCB ADDRESS$ MOV U.SCB(R5),R0 ;;;GET SCB ADDRESS< BITB #S3.ATN,S.ST3(R0) ;;;WILL DRIVER CLEAR THE ATTENTION? BNE 55$ ;;;IF NE YES. MOVB U.UNIT(R5),R2 ;;;GET OWNER'S UNIT NUMBER# ASL R2 ;;;CONVERT TO A WORD INDEXL5 MOV $BTMSK(R2),(R4) ;;;ALWAYS DROP OWNER'S ATTENTION)1 BITB #S3.SLV,S.ST3(R0) ;;;SLAVE UNIT SUPPORTED?N BNE 55$ ;;;IF NE YES3 MOV #70$,-(SP) ;;;ADDRESS TO RETRUN TO AFTER $FORK;) CALLR FRKDRV ;;;FAKE THE DRIVER'S $FORKE .ENDC;+-; **-$DMALT-RK611 RK06/RK07 INTERRUPT HANDLERA;EC; THIS ROUTINE IS ENTERED DIRECTLY FROM THE RK611 INTERRUPT VECTOR.;B; USING THE CONTROLLER INDEX, THE KRB OF THE INTERRUPTING RK611 ISH; FOUND. IF THE INTERRUPT WAS CAUSED BY THE CONTROLLER, THE POSITIONINGH; FLAG IN THE UNIT'S UCB IS TESTED TO SEE IF A DRIVE INTERRUPT IS FORTH-G; COMING. IT ONE IS, THE INTERRUPT IS DISMISSED. IF NOT, A FORK BLOCKPE; IS QUEUED TO THE DRIVER. AN INTERRUPT FROM THE DRIVE (USUALLY FROMED; A POSITIONING OPERATION) WILL CAUSE THE ATTENTION BITS ARE USED TOF; INDEX INTO A TABLE OF UCB ADDRESSES AND A CALL IS MADE TO THE PROPER ; DRIVER. S; C; IF AN UNCONFIGURED (IN THE DATA BASE) UNIT RAISES IT'S ATTENTION, C; WE WILL CRASH THE SYSTEM WITH R0 CONTAINING THE CURRENT ATTENTIONGE; BITS IN THE HIGH BYTE. THIS IS BECAUSE THE ONLY METHOD OF CLEARINGOD; AN ATTENTION IS TO SELECT AND CLEAR THE DRIVE AT THE DRIVER LEVEL.=; THIS CANNOT BE DONE BECAUSE THE UNIT HAS NO DATA STRUCTURE.Y;O ; INPUTS:I; NONE.P;T ; OUTPUTS:; NONE.T;T5; ALL REGISTERS ARE PRESERVED (R4 AND R5 VIA $INTSE).S;- .IF DF R$$6110$DMALT::INTSAV ;;;CALL $INTSE AND SET PRIORITY' MOV R3,-(SP) ;;;SAVE WORKING REGISTERSN MOV R2,-(SP) ;;;... MOV R1,-(SP) ;;;... MOV R0,-(SP) ;;;...8 MOV $DMCTB(R4),R3 ;;;GET KRB OF INTERRUPTING CONTROLLER(5$: MOV (R3),R4 ;;;GET IT'S CSR ADDRESS5 BIT #KS.DIP,K.STS(R3) ;;;DATA TRANSFER IN PROGRESS?  BNE 60$ ;;;IF NE YES) CLR R1 ;;;PRESET INITIAL ATTENTION MASK )10$: MOV (R3),R4 ;;;RETREIVE CSR ADDRESST MOV R3,R5 ;;;COPY KRB ADDRESSE' ADD K.OFF(R3),R5 ;;;POINT TO UCB TABLED1 MOV RKAS(R4),R0 ;;;GET ATTENTION/OFFSET REGISTER ' BIC #377,R0 ;;;ISOLATE ATTENTION BITSE% SWAB R0 ;;;PUT THEM IN THE LOW BYTE,% CMP R0,R1 ;;;ANY NEW ATTENTIONS UP?V BNE 20$ ;;;IF NE YES&15$: MOV (SP)+,R0 ;;;RESTORE REGISTERS MOV (SP)+,R1 ;;;... MOV (SP)+,R2 ;;;...$ MOV (R4),R3 ;;;GET CONTENTS OF CSR3 BIC #RDY!CERR,R3 ;;;CLEAR THE READY AND ERROR BITSI, BIS #IE,R3 ;;;SET THE INTERRUPT ENABLE BIT$ MOV R3,(R4) ;;;REENABLE INTERRUPTS! MOV (SP)+,R3 ;;;RESTORE REGISTERP* RETURN ;;;RETURN TO INTERRUPTED PROCESS;E%; ATTENTIONS WERE FOUND TO BE ACTIVE.;;O020$: BIC R1,R0 ;;;ISOLATE LATEST ATTENTION BITS& BIS R0,R1 ;;;SET LATEST BITS IN MASK,25$: ASR R0 ;;;IS THIS UNIT'S ATTENTION UP? BCS 40$ ;;;IF CS YES,30$: TST (R5)+ ;;;POINT TO NEXT UCB ADDRESS" CMP #-1,(R5) ;;;END OF UCB TABLE?$ BNE 25$ ;;;IF NE NO, TRY NEXT UNIT% TST R0 ;;;ANY ATTENTIONS REMAINING?E00yw)vtöt÷tø tþfDATA BEQ 10$ ;;;IF EQ NOB,35$: MOV R1,R0 ;;;GET LATEST ATTENTION BITSH BGCK$A BF.DVI,BE.FHW,FATAL ;;;UNCONFIGURED DEVICE RAISED ATTENTION BITS% BR .-2 ;;;DON'T TEMPT THE SYSTEM!!!I;;; WE FOUND AN ACTIVE ATTENTION.L;S)40$: MOV R5,R4 ;;;COPY UCB TABLE POINTER MOV (R5),R5 ;;;GET UCB ADDRESS, BEQ 35$ ;;;IF EQ UNIT NOT IN CONFIGURATION$ CALL MAPDRV ;;;MAP AND CALL DRIVER TST R0 ;;;ANY MORE ATTENTIONS? BEQ 10$ ;;;IF EQ NO ) MOV R4,R5 ;;;RETREIVE UCB TABLE POINTER  BR 30$ ;;;TRY FOR MORE;1 ; DATA TRANSFER WAS IN PROGRESS.;G060$: MOV K.OWN(R3),R5 ;;;GET OWNER'S UCB ADDRESS. BITB #3,U.CW2+1(R5) ;;;POSITIONING OPERATION? BEQ 65$ ;;;IF EQ NOP+ MOVB U.UNIT(R5),R2 ;;;RETREIVE UNIT NUMBERT! ASL R2 ;;;CONVERT TO WORD INDEXP0 MOV $BTMSK(R2),R2 ;;;GET CORRESPONDING BIT MASK$ SWAB R2 ;;;PUT IT IN THE HIGH BYTE1 BIT R2,RKAS(R4) ;;;IS OWNER'S ATTENTION BIT SET?2 BEQ 80$ ;;;IF EQ NO, CONTROLLER CAUSED INTERRUPT765$: MOV #80$,-(SP) ;;;ADDRESS TO RETURN TO AFTER $FORK ) CALLR FRKDRV ;;;FAKE THE DRIVER'S $FORKN>80$: BIC #KS.DIP,K.STS(R3) ;;;RESET DATA TRANSFER IN PROGRESS# BR 5$ ;;;TRY FOR OTHER ATTENTIONS  .ENDC;+; **-MAPDRV-MAP AND CALL DRIVER); 9; THIS SUBROUTINE WILL SAVE THE CURRENT INTERRUPT CONTEXTP=; (R4 & R5), MAP THE DRIVER, SET THE ERROR LOGGING BITMAP AND;A; CALL THE DRIVER. THE DRIVER IS THEN UNMAPPED AND THE INTERRUPTB; CONTEXT IS RESTORED.;Q ; INPUTS:L-; R3 = KRB ADDRESS OF INTERRUPTING CONTROLLERD'; R5 = UCB ADDRESS OF INTERRUPTING UNITK; ; OUTPUTS:; R2 IS DESTROYED0;B; DRIVERS ARE CALLED WITH:; R3 = CURRENT KRB ADDRESS'; R4 = SCB ADDRESS OF INTERRUPTING UNIT'; R5 = UCB ADDRESS OF INTERRUPTING UNITD;- .IF DF R$$HDV!R$$611I(MAPDRV: MOV R4,-(SP) ;;;SAVE CSR ADDRESS' MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCBG( CMP R3,S.KRB(R4) ;;;DO THE KRB'S MATCH?- BNE 40$ ;;;IF NE NO, UNIT IS ON ANOTHER KRBO' MOV U.DCB(R5),R2 ;;;GET ADDRESS OF DCB=, MOV KINAR5,-(SP) ;;;SAVE KERNEL INSTR APR 5 U A .IF DF K$$DAS I+ MOV KDSAR5,-(SP) ;;;SAVE KERNEL DATA APR 5  .IFTF R, MOV D.PCB(R2),R4 ;;;GET DRIVERS PCB ADDRESS) BEQ 10$ ;;;IF EQ DRIVER IS PART OF EXEC59 MOV P.REL(R4),KINAR5 ;;;MAP DRIVER IN INSTRUCTION SPACEV $ .IFT D2 MOV P.REL(R4),KDSAR5 ;;;MAP DRIVER IN DATA SPACE  .IFTF E=10$: MOV D.DSP(R2),R4 ;;;GET ADDRESS OF DRIVER DISPATCH TABLE % BEQ 30$ ;;;IF EQ DRIVER IS UNLOADEDM: MOV D.VINT+2(R4),-(SP) ;;;GET DRIVER'S INTERRUPT ADDRESS, ADD #2,(SP) ;;;POINT TO SECOND ENTRY POINT) MOV U.SCB(R5),R4 ;;;RETREIVE SCB ADDRESST2 BIC #S2.ACT,S.ST2(R4) ;;;SHOW INTERRUPT INACTIVE# CALL @(SP)+ ;;;CALL PROPER DRIVERQ30$: ;;;REF LABEL  .IFTR R. MOV (SP)+,KDSAR5 ;;;RESTORE KERNEL DATA APR 5  .ENDC  V/ MOV (SP)+,KINAR5 ;;;RESTORE KERNEL INSTR APR 5 (40$: MOV (SP)+,R4 ;;;RESTORE CSR ADDRESSXIT: RETURN ;;;D;+,; **-FRKDRV-EMULATE A DRIVER'S CALL TO $FORK;;; THIS ROUTINE WILL SETUP THE STACK IN ORDER TO EMULATE THEA; DRIVER'S CALL TO $FORK.O;ED; NOTE: THIS ROUTINE ASSUMES THAT THE DRIVER IS LOADABLE AND LOADED.;; THIS IS DONE BECAUSE THIS ROUTINE IS ONLY CALLED FOR DATAR; TRANSFER INTERRUPTS.;F ; INPUTS:; R5 = UCB ADDRESS); (SP) = ADDRESS TO RETURN TO AFTER $FORK;N ; OUTPUTS:; FORK BLOCK QUEUEDR; R0, R1, AND R2 ARE DESTROYED;-+FRKDRV: MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS + TST S.FRK+2(R4) ;;;IS THE FORK BLOCK BUSY?L* BNE XIT ;;;IF NE YES, DROP THE INTERRUPT$ MOV U.DCB(R5),R2 ;;;GET DCB ADDRESS- MOV D.PCB(R2),R1 ;;;GET DRIVER'S PCB ADDRESSE9 MOV D.DSP(R2),R2 ;;;GET ADDRESS OF DRIVER DISPATCH TABLE " MOV KISAR5,R0 ;;;SAVE KERNAL APR5% MOV P.REL(R1),KISAR5;;;MAP TO DRIVER: MOV D.VINT+2(R2),-(SP) ;;;GET DRIVER'S INTERRUPT ADDRESS& MOV R0,KISAR5 ;;;RESTORE APR5 MAPPING2 BIC #S2.ACT,S.ST2(R4) ;;;SHOW INTERRUPT INACTIVE& CALLR $FORK ;;;CREATE A FORK PROCESS .ENDC;+7; **-$RHKRB-RH11/RH70 CONTROLLER ONLINE/OFFLINE HANDLERY; ?; THIS ENTRY POINT WILL HANDLE RECONFIGURATION CALLS FOR ONLINEP@; CONTROLLER AND OFFLINE CONTROLLER FO00y wðvt´cÚµcÛ¶c�·c›’R THE RH-TYPE CONTROLLERS.;E<; FOR ONLINE, IT WILL DETERMINE WHETHER THE CONTROLLER IS AN@; RH11 (I.E. IT HAS NO RHBAE/RHCS3 REGISTERS) AND THEREFORE MUST>; USE UNIBUS MAPPING REGISTERS, OR WHETHER IT IS AN RH70 (I.E.A; IT HAS RHBAE/RHCS3 REGISTERS) AND WILL SUPPORT DIRECT ACCESS TOC; A 22-BIT ADDRESS SPACE.K;O5; FOR OFFLINE, IT WILL SIMPLY CLEAR THE RH SUBSYSTEM.R;L ; INPUTS: ; R2=KRB ADDRESS.S; R3=CTB ADDRESS.A; C=1 IF OFFLINE REQUEST.F; C=0 IF ONLINE REQUEST.;O ; OUTPUTS:;; FOR ONLINE, KS.MBC WILL BE SET IF RH70 CONTROLLER AND THE :; OFFSET FROM THE CSR TO THE RHBAE REGISTER WILL BE PLACED ; IN THE KRB.R0; FOR OFFLINE, THE RH SUBSYSTEM WILL BE CLEARED.;- .IF DF R$$HDV1$RHKRB::BCS CONCLR ;IF CS OFFLINE, JUST CLEAR RHN+ CALL CONCLR ;GET CSR ADDRESS AND CLEAR RHA- CALL $SGFIN ;TURN NXM'S INTO SET CARRY BITSL MOV R1,R4 ;COPY CSR ADDRESS- ADD #RHDT,R1 ;START WITH DRIVE TYPE REGISTERS710$: TST (R1)+ ;IS THE NEXT CONTROLLER REGISTER THERE? BCC 10$ ;IF CC YES' MOV #40,RHCS2(R4) ;CLEAR RH CONTROLLERL( SUB R4,R1 ;CALCULATE # OF REGISTERS *2 MOV R1,R0 ;SAVE REGISTER COUNT# ASR R1 ;CONVERT TO # OF REGISTERSU DEC R1 ;ADJUST REGISTER COUNT. BIS #KS.MBC,K.STS(R2) ;ASSUME WE ARE AN RH70/ MOV #$SCDVT,-(SP) ;SETUP TO SCAN DEVICE TABLESE,20$: CALL @(SP)+ ;GET NEXT DEVICE IN SYSTEM BCC 25$ ;IF CC WE GOT ONE4;C'; SET THE OFFSET TO THE RHBAE REGISTER.T;R2 BIT #FE.EXT,$FMASK ;IS 22-BIT ADDRESSING ENABLED? BEQ 21$ ;IF EQ NOE) ADD K.OFF(R2),R2 ;POINT TO KRB UCB TABLE) SUB #6,R0 ;POINT BACK TO RHBAE) MOV R0,KE.RHB(R2) ;STUFF OFFSET TO RHBAE 21$: RETURN ;ALL FINISHED ;O<; NOW THAT WE HAVE AN SCB, SEE IF IT IS CONNECTED TO THE KRB; THAT WE ARE BRINGING ONLINE.;E825$: BIT #S2.MAD,S.ST2(R4) ;IS THIS SCB MULTI-ACCESSED? BEQ 40$ ;IF EQ NOG" MOV R4,R5 ;YES, COPY SCB ADDRESS+ ADD #S.KTB,R5 ;POINT TO START OF KRB TABLEH'30$: MOV (R5)+,R3 ;GET NEXT KRB ADDRESSS BEQ 20$ ;IF EQ NONE LEFT& CMP R3,R2 ;DOES IT POINT TO OUR KRB? BNE 30$ ;IF NE NOC# BR 50$ ;YES, CHECK # OF REGISTERSR040$: CMP S.KRB(R4),R2 ;DOES IT POINT TO OUR KRB? BNE 20$ ;IF NE NON;E:; NOW WE HAVE THE CORRECT KRB. TEST FOR RH11/70 AND CLEAR; THE BIT IF WE ARE AN RH11.;O150$: CMPB R1,S.RCNT(R4) ;REGISTER COUNT FOR RH11?B BGT 20$ ;IF GT NOQ/ BIC #KS.MBC,K.STS(R2) ;YES, CLEAR MASSBUS BITE BR 20$ ;TRY FOR MORE .ENDC;+2; **-$DMKRB-RK611 CONTROLLER ONLINE/OFLINE HANDLER;2?; THIS ENTRY POINT WILL HANDLE RECONFIGURATION CALLS FOR ONLINEE=; CONTROLLER AND OFFLINE CONTROLLER FOR THE RK611 CONTROLLER.P;K@; FOR BOTH ONLINE AND OFFLINE THE CONTROLLER SUBSYSTEM IS SIMPLY>; CLEARED. THIS TURNS OFF ALL ERROR AND ATTENTION CONDITIONS.; ; INPUTS:N; R2=KRB ADDRESS.P; ALL OTHER REGISTERS IGNORED.; ; OUTPUTS:; CONTROLLER SUBSYSTEM CLEARED.S;- .IF DF R$$6112$DMKRB::BR CONCLR ;GO TO SUBSYSTEM CLEAR AND EXIT$ ;NOTE: THIS MAKES THE ASSUMPTION ; THAT RKCS2=RHCS2. .ENDC;+3; **-$RHPWF-RH11/RH70 CONTROLLER POWER FAIL HANDLERF/; **-$DMPWF-RK611 CONTROLLER POWER FAIL HANDLER ; >; THIS ROUTINE WILL HANDLE POWER FAILS FOR THE CONTROLLER. IT?; WILL SET THE SPIN UP BIT FOR THE PORT IF THE DEVICE IS MULTI- @; ACCESSED AND THE SOFTWARE VOLUME VALID BIT WAS PREVIOUSLY SET..; IT WILL THEN CLEAR THE CONTROLLER SUBSYSTEM.;>; POWER FAIL FOR EACH UNIT ON THE CONTROLLER IS HANDLED IN THE; RESPECTIVE DRIVERS. ;E;; NOTE: THIS ROUTINE MAKES THE ASSUMPTION THAT RKCS2=RHCS2.; ; INPUTS:-; R2=KRB ADDRESS.R;W ; OUTPUTS:; R1=CSR ADDRESS"; CONTROLLER SUBSYSTEM IS CLEARED.;- .IF DF R$$HDV!R$$611E$DMPWF:: ;RK611 POWER FAIL$RHPWF:: ;RH11/70 POWER FAIL/ MOV #$SCDVT,-(SP) ;SETUP TO SCAN DEVICE TABLESD,10$: CALL @(SP)+ ;GET NEXT DEVICE IN SYSTEM BCS CONCLR ;IF CS ALL DONE;NB; NOW THAT WE HAVE A DEVICE, SEE IF IT IS CONNECTED TO OUR KRB AND ; SEE IF IT NEEDS TO BE SPUN UP.;E820$: BIT #S2.MAD,S.ST2(R4) ;IS THIS SCB MULTI-ACCESSED? BEQ 10$ ;IF EQ NON, BITB #US.VV,U.STS(R5);WAS00ywzwtöt÷tø tþfDATA VOLUME VALID SET?$ BEQ 10$ ;IF EQ NO, FORGET THIS ONE+ BIT #KP.OFL,S.KTB(R4) ;IS PORT 'A' ONLINE? BNE 30$ ;IF NE NOO,; CMP R2,S.KTB(R4) ;IS THIS THE CORRECT KRB?; BNE 30$ ;IF NE NO7 BISB #S3.SPA,S.ST3(R4) ;YES, SET PORT 'A' SPINNING UPE230$: BIT #KP.OFL,S.KTB+2(R4) ;IS PORT 'B' ONLINE? BNE 10$ ;IF NE NOV.; CMP R2,S.KTB+2(R4) ;IS THIS THE CORRECT KRB?; BNE 10$ ;IF NE NO7 BISB #S3.SPB,S.ST3(R4) ;YES, SET PORT 'B' SPINNING UPI BR 10$ ;TRY FOR MORE;N6; RETREIVE CONTROLLER CSR ADDRESS AND CLEAR SUBSYSTEM.; *CONCLR: MOV (R2),R1 ;RETREIVE CSR ADDRESS2 MOV #40,RHCS2(R1) ;CLEAR THE CONTROLLER SUBSYSTEM RETURN ;R .ENDC;+); **-$DMCSR-CHECK IF RK611 CSR IS PRESENT.-; **-$RHCSR-CHECK IF RH11/RH70 CSR IS PRESENT;:>; THIS ROUTINE WILL TEST THE CONTROLLER WORD COUNT REGISTER TO+; DETERMINE IF IT EXISTS ON THIS PROCESSOR.C;R ; INPUTS:0; R2=KRB ADDRESS; R3=CTB ADDRESS-; $SGFIN MUST HAVE BEEN CALLED BY OUR CALLER.R;O ; OUTPUTS:; C=0 IF CONTROLLER EXISTS"; C=1 IF CONTROLLER DOES NOT EXIST;- .IF DF R$$HDV!R$$611C!$DMCSR:: ;RK611 CONTROLLER TEST %$RHCSR:: ;RH11/RH70 CONTROLLER TEST MOV R4,-(SP) ;SAVE A REGISTER# MOV (R2),R4 ;RETREIVE CSR ADDRESS-. TST 2(R4) ;DO WE EXIST? (CHECKS WC REGISTER) MOV (SP)+,R4 ;RESTORE REGISTERO& RETURN ;RETURN WITH CARRY SET/CLEAR .ENDC .ENDSOR.C;R ; INPUTS:0; R2=KRB ADDRESS; R3=CTB ADDRESS-; $SGFIN MUST HAVE BEEN CALLED BY OUR CALLER.R;O ; OUTPUTS:; C=0 IF CONTROLLER EXISTS" .TITLE IISRVL .IDENT /03.00/T -;,; COPYRIGHT (c) 1974, 1978, 1979, 1980, 1984/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.L;TA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED 9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.M;(;+; K. E. KINNEAR 11-NOV-77; ; MODIFIED BY:;Y; J. W. BERZLE 08-SEP-83 03.00;C2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES; ;F.; INTERPROCESSOR INTERRUPT SERVICE SUBROUTINES;P; MACRO LIBRARY CALLSE;X S  .IF DF M$$PRO D .MCALL HWDDF$,BGCK$A $ HWDDF$ ;DEFINE HARDWARE REGISTERS 4; &; IIST CSR DEFINITIONS AND STATUS BITS;S -PGTE=0 ;PROGRAM GENERATED TRANSMIT ENABLESE D PGCS=1 ;PROGRAM GENERATED CSRGO=1 ;PGCS GO BITIE=4 ;PGCS INTERRUPT ENABLE IP=10 ;PGCS INTERRUPT PENDING(RDY=4000 ;PGCS READY TO ACCEPT COMMAND$ERR=100000 ;PGCS ERROR SUMMARY BIT I'STTE=2 ;SANITY TIMER TRANSMIT ENABLEE RSTCS=3 ;SANITY TIMER CSRSENB=1 ;STCS ENABLE COUNT STP=2 ;STCS STOP COUNT*LKE=4 ;STCS LOCKUP PROCESSOR IF TIMEOUT A.IMSK=4 ;INTERRUPT MASK REGISTER - 1=DISABLE D+PGF=5 ;PROGRAM GENERATED INTERRUPT FLAGSR D/STF=6 ;SANITY TIMER INTERRUPT FLAGS REGISTERT C$DCF=7 ;DCLO / DISCONNECT REGISTER NEXC=10 ;EXCEPTION REGISTERI R'MTC=15 ;MAINTENANCE CONTROL REGISTERC T;+D; **-$IISTM-SET ALL INTERPROCESSOR INTERRUPT ENABLE INTERRUPT MASKS.;RK; THIS ROUTINE WILL RESET THE INTERRUPT MASK IN THE IIST FOR THIS PROCESSOR H; AND NOTIFY ALL OTHERS THAT THEIR INTERRUPT MASKS MUST ALSO BE CHANGED.B; WHEN THE ROUTINE RETURNS, ALL PROCESSORS HAVE RESET THEIR MASKS.;A ; INPUTS: ;E3; $IIMSK=DESIRED INTERRUPT MASK FOR ALL PROCESSORS.A;R ; OUTPUTS:;C>; R2=MASK OF PROCESSORS WHO DIDN'T RESET THEIR MASKS (IF ANY).;E; NO REGISTERS ARE PRESERVED.C;- R)$IISTM::CALL $IISLM ;SET THE LOCAL MASKSP) MOV #MP.RSM,R2 ;SET RESET MASKS FUNCTION0 CALLR $IISFA ;SEND FUNCTION TO ALL ONLINE CPUS! ;AND WAIT FOR ACKNOWLEDGEMENTN O;+3; **-$IINIT-INTERPROCESSOR INTERRUPT INITIALIZATIONH7; **-$IIPWF-INTERPROCESSOR INTERRUPT POWERFAIL SERVICE.E; ?; THIS ROUTINE WILL VALIDATE THE EXISTANCE OF AN IIST, AND THEN 9; SET THE LOCAL INTERRUPT MASKS AND THE INTERRUPT ENABLE.E;R ; INPUTS:T;S; NONE.M;S ; OUTPUTS:;; NONE.S;S; NO REGISTERS ARE PRESERVED.M;- $$IINIT:: ;REFERENCE LABEL/$IIPWF::CALL $IISLM ;SET LOCAL INTERRUPT MASKSR$ CALLR $IISIE ;SET INTERRUPT ENABLE S;+5; **-$IISLM-SET LOCAL INTERPROCE00zwðvt´cÚµcÛ¶c�·c›’SSOR INTERRUPT MASKS.N;P@; THIS ROUTINE WILL SET THE LOCAL INTERPROCESSOR INTERRUPT MASKS; TO THE VALUE IN $IIMSK.; ; INPUTS:I;W/; $IIMSK=DESIRED VALUE OF LOCAL INTERRUPT MASK.;E ; OUTPUTS:;E; NONE.K;N#; R0, R1, R2, AND R3 ARE PRESERVED.S;- 9$IISLM::CALL $IIKRB ;GET IIST KRB IF ONLINE, ELSE RETURNA MFPS -(SP) ;SAVE PRIORITYT+ CACHE$ BYPASS ;MAKE SURE WE GET RIGHT ONE;+ MOV $IIMSK,-(SP) ;GET DESIRED MASK SETTINGE CACHE$ RESTOR ;UNBYPASS" MOV (SP),-(SP) ;COPY TOP OF STACK! COM (SP) ;CHANGE STATE FOR IISTI* BIC #177760,(SP) ;MAKE IT PROCESSORS ONLY" BIS #7400,(SP) ;DON'T ALLOW BOOTS MOV (R4),R5 ;GET CSR ADDRESS7 BISB K.PRI(R4),@#PS ;INCREASE PRIORITY, DON'T DECREASEE* MOV #DCF,(R5) ;GET DISCONNECTED CPU FLAGS# MOV 2(R5),-(SP) ;INTO TOP OF STACK / SWAB (SP) ;PUT DISCONNECT FLAGS IN LOWER BYTEP4 BIC $CPMSK,(SP) ;ONLY PROCESSORS THAT WE CARE ABOUT4 BIS (SP),2(SP) ;DISALLOW INTERRUPTS FROM THESE CPUS5 MOV (SP)+,K.CRQ(R4) ;SAVE MASK OF BROKEN CONNECTIONSO1 MOV #IMSK,(R5) ;;;SELECT INTERRUPT MASK REGISTERC( MOV (SP)+,2(R5) ;;;LOAD INTERRUPT MASKS& BIC #177760,(SP) ;;;MAKE IT JUST CPUS+ MOV (SP),-(SP) ;;;DUPLICATE STACK CONTENTSS$ MOV #1,R4 ;;;INITIALIZE ODD PARITY" CLC ;;;SET UP INITIAL CARRY BIT! ROR (SP) ;;;CHECK LOW ORDER BITO& BEQ 20$ ;;;IF EQ THAT ALL THERE WERE" ADC R4 ;;;ACCUMULATE PARITY BITS&10$: ASR (SP) ;;;GET NEXT BIT IN WORD BEQ 20$ ;;;END OF ALL BITS" ADC R4 ;;;ACCUMULATE PARITY BITS BR 10$ ;;;GO BACK FOR MORE20$: ADC R4 ;;;ADD IN LAST BITL$ BIC #177776,R4 ;;;GET ONLY LAST BIT# ASL R4 ;;;PUT IT IN CORRECT PLACEC( MOV #STCS,(R5) ;;;SELECT REGISTER AGAIN MOV R4,2(R5) ;;;SET PARITY BITE# TST (SP)+ ;;;GET RID OF ZERO WORDA/ MOV #STTE,(R5) ;;;GET TRANSMIT ENABLE REGISTERP% MOV (SP)+,2(R5) ;;;LOAD THE REGISTER; MTPS (SP)+ ;;;RESET PRIORITY RETURNC U;+0; **-$IISIE-SET INTERPROCESSOR INTERRUPT ENABLE.;H; THIS ROUTINE WILL CLEAR OUT THE STATUS REGISTERS OF THE INTERPROCESSOR5; INTERRUPT DEVICE AND THEN SET THE INTERRUPT ENABLE.;C ; INPUTS: ;G; NONE.A;B ; OUTPUTS:;;; NONE. ;R-; REGISTERS R0, R1, R2, AND R3 ARE PRESERVED.A;- M;$IISIE::CALL $IIKRB ;GET IIST KRB ADDR IF ONL, ELSE RETURNO MFPS -(SP) ;SAVE PRIORITYT2 BISB K.PRI(R4),@#PS ;RAISE, DON'T LOWER, PRIORITY% MOV (R4),R4 ;;;GET IIST CSR ADDRESSR% MOV #PGCS,(R4) ;;;SELECT PROGRAM CSRE CLR 2(R4) ;;;CLEAR IT OUTA4 MOV #177777,R5 ;;;SET WORD TO CLEAR OUT STATUS BITS+ MOV #EXC,(R4) ;;;SELECT EXCEPTION REGISTERI MOV R5,2(R4) ;;;CLEAR IT OUTN' MOV #DCF,(R4) ;;;SELECT DC/LO REGISTER MOV R5,2(R4) ;;;CLEAR IT OUT . MOV #PGF,(R4) ;;;SELECT PROGRAM FLAG REGISTER MOV R5,2(R4) ;;;CLEAR IT OUT  MOV #PGCS,(R4) ;;;SELECT CSRR& MOV #IE,2(R4) ;;;SET INTERRUPT ENABLE MTPS (SP)+ ;;;RESTORE PRIORITY RETURNY;+$;**-$DISAN-DISABLE ALL SANITY TIMERS;#B; THIS ROUTINE CLEARS $STENB AND THEN $STTIC, DISABLING THE SANITYC; TIMER FOR THE CPU ON WHICH IT IS CALLED. IT SHOULD BE CALLED FROMED; EACH PROCESSOR BEFORE DOING A LONG NON-INTERRUPTIBLE SEQUENCE SUCH ; AS CRASH OR PARITY ERROR STOP.;, ; INPUTS:E; NONE; ; OUTPUTS:; NONE;T; ALL REGISTERS ARE PRESERVED,;-7$DISAN::CALL $SAVNR ;SAVE REGISTERS THAT GET CLOBBEREDE' CLR $STENB ;SET TO DISABLE ALL TIMERS) ;;+.; **-$STTIC-SANITY TIMER INTERRUPT PROCESSING.;AC; THIS ROUTINE IS DESIGNED TO BE CALLED AT EVERY TICK ON EVERY CPU.IC; IT WILL UPDATE THE SANITY TIMER ON THE PARTICULAR PROCESSOR, AND U#; WILL STOP THE TIMER IF NECESSARY.B;R ; INPUTS:O;N;; THIS ROUTINE IS DESIGNED TO BE CALLED FROM CODE EXECUTINGO;; AT A PRIORITY AS HIGH AS OR HIGHER THAN THAT OF THE IIST. ;I ; OUTPUTS:;R; NONE.;D); REGISTERS R0, R1, R2, AND R3 PRESERVED. ;- E$STTIC:: ;REFERENCE LABELB7 CACHE$ SAVE,BYPASS ;BYPASS CACHE TO LOOK AT REAL FLAGST3 TST $STFLG ;ANY REASON TO PROCESS SANITY TIMERS ?L BEQ 30$ ;IF EQ NOE810$: CALL $IIKRB ;GET IIST KRB ADDR IF ONL, ELSE RETURNF;******************************* IIST DEBUGGING CODE ***************** .IF00z"wwtöt÷tø tþfDATA DF L$$DBG E; C; FIND OUT IF THE IIST IS LOCKED UP. TO DO THIS WE WILL SEE IF THESA; IP!IE BITS ARE SET FOR 10 TIMES IN A ROW. IF THEY ARE, WE WILLD; TOGGLE THE IE BIT.;  "15$: MOV (R4),R5 ;GET CSR ADDRESS MOV #PGCS,(R5) ;SELECT CSRE' MOV #IE!IP,-(SP) ;SEE IF BOTH BITS SETG$ BIC 2(R5),(SP)+ ;ARE THEY BOTH SET?' BNE 16$ ;IF NE NO -- START COUNT ANEW1 INC K.CRQ(R4) ;SHOW ONE MORE TIME THAT IE!IP SETE CMP K.CRQ(R4),#10 ;TOO MANY?*) BLE 18$ ;IF LE NO, DO NOTHING THIS TIME* ;.<; IIST IS LOCKED UP. CLEAR AND REENABLE THE IE BIT IN PGCS.;  S$ MOV #PGCS,(R5) ;SELECT THE REGISTER CLR 2(R5) ;CLEAR THE IE * MOV #PGCS,(R5) ;SELECT THE REGISTER AGAIN BIS #IE,2(R5) ;SET THE IE AGAIN.16$: CLR K.CRQ(R4) ;START THE COUNT OVER AGAIN18$: ;REFERENCE LABEL .ENDC ; DF L$$DBGF;******************************* END OF IIST DEBUGGING CODE ********** MOV (R4),R4 ;GET CSR ADDRESS$ MOV #STCS,(R4) ;SELECT SANITY TIMER< BIT $CPBIT,$STENB ;SHOULD WE UPDATE AND ENABLE SANITY TIMER ;ON THIS CPU?A) BEQ 20$ ;IF EQ NO -- STOP SANITY TIMER!3 BIC #4,2(R4) ;TURN OFF SANITY TIMER LOCKOUT ALWAYSE0 MOV #STCS,(R4) ;RE-SELECT SANITY TIMER REGISTER7 MOV #177401,-(SP) ;SET MASK FOR LONGEST TIMER INTERVAL)6 BIT $CPBIT,$STALR ;SHOULD WE ENABLE ALARM AND LOCKOUT BEQ 19$ ;IF EQ NO) BIS #4,(SP) ;SET ALARM ENABLE INTO MASK >19$: BIS (SP)+,2(R4) ;ENABLE SANITY TIMER FOR LONGEST INTERVAL+ CACHE$ UNSAVE ;RESET PRIOR STATE OF CACHE$ RETURNE-20$: BIC #5,2(R4) ;CLEAR SANITY TIMER COUNTER / BIC $CPBIT,$STFLG ;CLEAR TIMER PROCESSING FLAGI/30$: CACHE$ UNSAVE ;RESET PRIOR STATE OF CACHEL RETURNW E;+5; **-$IIOPN-ENABLE THE IIST TO THE REST OF THE WORLD.7;1@; THIS ROUTINE WILL PERFORM A MASTER CLEAR OF THE IIST WHEN THIS@; PROCESSOR GOES OFFLINE. THIS WILL ALLOW ANOTHER PROCESSOR TO B; BOOT AND INTERRUPT THIS ONE AT A LATER TIME. IT WILL ALSO PLACE-; THE IIST KRB OFFLINE IN THE RUNNING SYSTEM. ;S ; INPUTS:A;O; NONE.;T ; OUTPUTS:;#; NONE.C;R-; REGISTERS R0, R1, R2, AND R3 ARE PRESERVED.A;- ;$IIOPN::CALL $IIKRB ;GET IIST KRB ADDR IF ONL, ELSE RETURNA# MFPS -(SP) ;SAVE CURRENT PRIORITYN, BIS #KS.OFL,K.STS(R4) ;PUT IIST KRB OFFLINE5 BISB K.PRI(R4),@#PS ;RAISE PRIORITY TO HIGHEST POINTW. BIS #100000,@(R4) ;CLEAR OUT IIST COMPLETELY! MTPS (SP)+ ;RESTORE PRIORITY RETURNT U;++; **-$IIKRB-GET IIST KRB ADDRESS IF ONLINE.;HF; THIS ROUTINE WILL GET THE KRB ADDRESS OF THE IIST FOR THIS PROCESSORD; AND WILL DETERMINE IF THE KRB SHOWS ONLINE STATUS. IF IT DOES, THEF; ROUTINE WILL RETURN TO THE CALLER. IF IT DOES NOT, THE ROUTINE WILL ; RETURN TO THE CALLER'S CALLER.;T ; INPUTS:;S!; 0(SP)=RETURN ADDRESS TO CALLER.F*; 2(SP)=RETURN ADDRESS TO CALLER'S CALLER.;I ; OUTPUTS:;B!; IF IIST FOR THIS CPU IS ONLINE:M;T; R4=KRB ADDRESS.; RETURN TO CALLER.;T; ELSE; ; R4=UNDEFINED.; RETURN TO CALLER'S CALLER. ;S; REGISTER R4 IS DESTROYED.R;- T<$IIKRB::MOVB $PROC2,R4 ;GET THIS PROCESSORS PROCESSOR NUMBER1 MOV $IICTB(R4),R4 ;GET KRB ADDRESS FOR THIS IISTR% BIT #KS.OFL,K.STS(R4) ;IS IT ONLINE?H( BEQ 10$ ;IF EQ YES -- RETURN TO CALLER" TST (SP)+ ;REMOVE CALLERS RETURN 10$: RETURNS  L F;+C; **-$IINOT-INTERRUPT ALL ONLINE CPUS AND WAIT FOR ACKNOWLEDGEMENT.SG; **-$IISFA-SEND SPECIFIC FUNCTION TO ALL ONLINE CPUS AND WAIT FOR ACK.;@; THIS ROUTINE WILL INTERRUPT ALL ONLINE CPUS AND WAIT FOR THEIRG; ACKNOWLEDGEMENT OF THE FUNCTION DESIRED. $IISFA WILL SEND A FUNCTIONOC; PASSED AS AN ARGUMENT, WHILE $IINOT WILL SEND A NOP FUNCTION JUSTS;; TO MAKE SURE THAT THE OTHER PROCESSORS CAN HEAR THIS ONE. ;Y ; INPUTS:N; !; R2=FUNCTION CODE ($IISFA ONLY). ;U ; OUTPUTS:;S9; R2=PROCESSORS WHO DIDN'T ACKNOWLEDGE FUNCTION (IF ANY). ;T; R4 AND R5 ARE PRESERVED.;- -($IINOT::MOV #MP.NOP,R2 ;SET NOP FUNCTION,$IISFA::MOV $URMST,R1 ;GET ONLINE PROCESSORS" BIC $CPMSK,R1 ;MAKE IT CPU'S ONLY BIC $CPBIT,R1 ;NOT OURSELVESE" BNE $IIWAK ;IF NE GO DO FUNCTION CLR R2 ;SHOW EVERYTHING IS OKM RETURNE00z*wðvt´cÚµcÛ¶c�·c›’ I;+7; **-$IIWAK-SEND FUNCTION AND WAIT FOR ACKNOWLEDGEMENT.T; 8; THIS ROUTINE WILL USE $IIFNX TO TRANSMIT A FUNCTION TO?; A NUMBER OF PROCESSORS, AND IT WILL WAIT A SPECIFIED INTERVAL <; OF TIME FOR THOSE PROCESSORS TO CLEAR OUT THE FUNCTION BIT:; FROM THEIR FUNCTION TABLE. IF THEY DO NOT CLEAR OUT THE5; FUNCTION WITHIN THAT TIME, THIS ROUTINE WILL RETURN$=; A ERROR STATUS, AND THE PROCESSOR MASK(S) FOR THE CPUS THATB; HAVEN'T DONE THEIR JOBS.;N ; INPUTS:;;W$; R1=MASK OF PROCESSORS TO FUNCTION.; R2=FUNCTION MASK.T; ; OUTPUTS:;K(; PROCESSORS HAVE RECEIVED THE FUNCTION.;I/; R2=CPUS WHO DIDN'T ACK THE FUNCTION (IF ANY).C;O); REGISTERS R1, R4, AND R5 ARE PRESERVED.;- M,$IIWAK::MOV R2,-(SP) ;SAVE THE FUNCTION MASK6 CALL $IIFNX ;TRANSMIT THE FUNCTION TO THE OTHER CPUS. MOV (SP)+,R3 ;RESTORE THE FUNCTION MASK TO R3! MOV R4,-(SP) ;SAVE R4 FOR CALLERS- CLR -(SP) ;CREATE TIMEOUT COUNTERS ON STACK( CLR -(SP) ;TIMEOUT IS DOUBLE PRECISION& MOV R1,R2 ;COPY INTERRUPTED CPU MASK ;29; OUTER LOOP -- SET UP TO SCAN THRU THE WHOLE TABLE AGAINE;D E710$: MOV #$MPTAB,R0 ;INITIALIZE POINTER TO TOP OF TABLE " MOV #1,R4 ;SET UP CLEAR BIT MASK A;PG; INNER LOOP -- LOOP THROUGH $MPTAB TO SEE IF PROCESSOR HAS CLEARED BITI;X T.20$: CACHE$ BYPASS ;LOOK AT VALUE OF REAL BIT8 MOV (R0)+,-(SP) ;GET VALUE OF SWITCH TABLE FOR NEXT CPU* CACHE$ RESTOR ;GO BACK TO FAST EXECUTION' BIT R3,(SP)+ ;HAS CPU CLEARED BIT YET?T' BNE 30$ ;IF NE NO -- MUST WAIT LONGERN BIC R4,R2 ;CLEAR OUT CPU BIT BEQ 40$%30$: ASL R4 ;MOVE BIT CLEAR BIT LEFTG# BIC $CPMSK,R4 ;ONLY DEAL WITH CPUSI( BNE 20$ ;IF NE MUST BE MORE PROCESSORS/ ADD #1,2(SP) ;COUNT OF FAILURES TO COMMUNICATE-, ADC (SP) ;HIGH ORDER WORD OF DBL PRECISION% CMP #1,(SP) ;SHOULD WE GIVE UP NOW?S BGT 10$ ;IF GT NOE540$: CMP (SP)+,(SP)+ ;CLEAN TIMEOUT COUNTER OFF STACK $ MOV (SP)+,R4 ;RESTORE R4 FOR CALLER 50$: RETURNN .DSABL LSB) H C;+9; **-$IISVC-INTERPROCESSOR INTERRUPT PENDING URM SERVICE.;CA; THIS ROUTINE IS USED TO TAKE THE PENDING URM INTERRUPT MASK IN B>; $IIPND AND CONVERT THEM TO PENDING CPU INTERRUPTS IN $IICPU.>; IT WILL THEN INTERRUPT THE NEXT PROCESSOR ROUND ROBIN, USING ; $IINXT.;C ; INPUTS:H;D@; $IIPND CONTAINS MASK BITS FOR ALL UNIBUS RUNS NEEDING SERVICE.;T ; OUTPUTS.;E=; THE URM BITS IN $IIPND HAVE BEEN CONVERTED INTO CPU BITS IN(=; $IICPU, AND USING $IINXT A PARTICULAR CPU HAS BEEN SELECTED=; TO BE INTERRUPTED. $IIXMT HAS BEEN CALLED TO INTERRUPT THEE; SELECTED CPU.U;E; NO REGISTERS ARE PRESERVED.M;- U .ENABL LSB-$IISVC::CACHE$ BYPASS ;FIGURE OUT WORK TO DOU$ MOV $IIPND,R1 ;GET PENDING URM MASK3 BIC $IICPU,R1 ;CLEAR OUT THOSE ALREADY INTERRUPTED CACHE$ RESTOR+ TST R1 ;ANY WORK NOT ALREADY INTERRUPTED?S BEQ 80$ ;IF EQ NO -- EXIT 7 MOV #$URMTB,R0 ;START SCAN THRU CPU URM CONNECTION TBLD, CLR R3 ;CLEAR OUT ACCUMULATOR FOR CPU BITS P410$: BIT R1,(R0)+ ;ARE ANY PENDING RUNS ON THIS CPU? BEQ 20$ ;IF EQ NOL6 BIS $BTMSK-$URMTB-2(R0),R3 ;YES -- SET THIS CPU'S BIT320$: CMP #$URMTB+,R0 ;IS IT END OF TABLE?H BHI 10$ ;IF GT NOT TST R3 ;ANY CPU'S TO INTERRUPT BNE 25$ ;IF NE YES I;,-; NO CPUS TO INTERRUPT. WE SHOULDN'T BE HEREE;E R9 BGCK$A BF.MP,BE.UNP,FATAL ;SOME URM NOT CONNECTED TO CPUI Q; ; INTERRUPT NEXT CPU IN ORDER.;A@; SPECIAL NOTE: $IINXT CONTAINS A POINTER INTO $BTMSK. IT IS A;; COMMON POINTER, YET IS BOTH READ WITHOUT BYPASS (POSSBILYI<; ENCOUNTERING STALE DATA), AND SET WITHOUT LOCKING ANYTHINGD; (POSSIBLY CAUSING MULTIPLE UPDATES). IN BOTH CASES, ONLY A SLIGHT<; PERTURBATION TO THE ROUND ROBIN FAIRNESS DOCTRINE RESULTS.;B@; IT IS ALSO POSSIBLE THAT TWO PROCESSORS MAY INTERRUPT THE SAME?; PROCESSOR, BUT THIS IS UNLIKELY SO NO EXPLICIT CHECK IS MADE.T;T P;25$: MOV $IINXT,R2 ;GET POINTER INTO $BTMSK FOR ROUND ROBINE230$: BIT (R2)+,R3 ;DOES THIS CPU NEED AN INTERRUPT BNE 40$ ;IF NE YES) CMP #$BTMSK+,R2 ;END OF TABLE?N BHI 30$ ;IF HI NO), MOV #$BTMSK,R2 ;START AT TOP 00z2wwtöt÷tø tþfDATAOF TABLE AGAIN BR 30$ ;GO BACKU/40$: MOV -(R2),R1 ;GET THE CPU'S BIT FOR $IIXMTA6 MOV R2,$IINXT ;SAVE POINTER INTO $BTMSK FOR RND ROBIN MFPS -(SP) ;SAVE PRIORITYO# MTPS #PR7 ;RAISE PRIORITY TO LOCK  LOCK$ $FORKL,SPIN< BIS $URMTB-$BTMSK(R2),$IICPU ;;;SHOW THESE URMS INTERRUPTED ULOCK$ $FORKL,SPIN  MTPS (SP)+ ;RESTORE PRIORITY B (;+.; **-$IIXMT-INTERPROCESSOR INTERRUPT TRANSMIT.; >; THIS ROUTINE WILL INTERRUPT THE CPU SPECIFIED BY BIT MASK IN); R1, USING THE INTERPROCESSOR INTERRUPT.T;E ; INPUTS: ; 6; R1=PROCESSOR BIT MASK FOR PROCESSOR(S) TO INTERRUPT.;A ; OUTPUTS:;T; NONE.I;R+; R1, R4, AND R5 ARE PRESERVED ACROSS CALL.E;- T0$IIXMT::MOVB $PROC2,R0 ;GET PROCESSOR NUMBER * 2) MOV $IICTB(R0),R3 ;GET KRB ADDRESS OF II;5 BIT #KS.OFL,K.STS(R3) ;IS IIST FOR THIS CPU OFFLINE?P" BNE 80$ ;IF NE YES -- RETURN NOW ;**; CALCULATE PARITY FOR THE PROCESSOR MASK.; H% MOV R1,R2 ;DUPLICATE PROCESSOR MASKF( MOV #1,R0 ;INITIALIZE ODD PARITY IN R0 CLC ;CLEAN OUT CARRY0 ROR R2 ;PUT FIRST BIT IN CARRY -- DONT SIGN EX BEQ 60$ ;NO BITS LEFT! ADC R0 ;BUMP PARITY COUNT 1#50$: ASR R2 ;PUT NEXT BIT IN CARRYL BEQ 60$ ;IF EQ - NO MORE BITS0 ADC R0 ;ACCUMULATE PARITYM BR 50$ ;GO BACK FOR MORE BITS 60$: ADC R0 ;ADD IN LAST BIT;# BIC #177776,R0 ;WE WANT PARITY BIT8$ ASL R0 ;JUSTIFY IN PARITY POSITION* BIS #,R0 ;ADD OTHER IMPORTANT BITS MOV (R3),R2 ;GET CSR OF II MFPS -(SP) ;SAVE PRIORITY 1 BISB K.PRI(R3),@#PS ;RAISE, DON'T LOWER PRIORITYR* CLR R3 ;INITIALIZE INFINITE LOOP COUNTER) MOV #PGTE,(R2) ;;;SELECT DEVICE REGISTER  MOV R1,2(R2) ;;;SET IT UP$70$: MOV #PGCS,(R2) ;;;SELECT II CSR1 ADD #1,R3 ;COUNT NUMBER OF TIMES WE HAVE LOOPEDE' BCS 75$ ;IF OVERFLOW, FORGET THE IIST  BIT #RDY,2(R2) ;;;IS IT READY BEQ 70$ ;;;IF EQ NO -- WAITT. MOV #PGCS,(R2) ;;;YES -- FIND REGISTER AND GO, MOV R0,2(R2) ;;;YES -- LOAD FUNCTION AND GO0 TALLY$ B.IPSN,XA$$IP,CPU ;COUNT AN IP INTR SENT"75$: MTPS (SP)+ ;RESTORE PRIORITY 80$: RETURNT ;+); **-$IBXMT-INTERPROCESSOR BOOT TRANSMIT.V;GA; THIS ROUTINE WILL BOOT THE PROCESSORS SPECIFIED BY THE BIT MASK:; IN R1.;2 ; INPUTS: ;C.; R1=PROCESSOR BIT MASK TO PROCESSORS TO BOOT.;E ; OUTPUTS:;I; NONE.W;O+; R1, R4, AND R5 ARE PRESERVED ACROSS CALL.Y;- 7-$IBXMT::SWAB R1 ;PLACE BITS IN CORRECT PLACES% CALL $IIXMT ;TRANSMIT BOOT REQUESTS ( SWAB R1 ;RESTORE R1 TO ORIGINAL PURITY RETURN$ ,; ,; MISC. INTERRUPT SERVICE SPECIAL PROCESSING;R R;I; JUMP OFF TO PROCESSOR ENTRY.;M N0$CPBGN::NOP ;LET OPERATOR CONTINUE (DEBUGGING)" JMP $PENT ;GO TO PROCESSOR ENTRY E;T&; ERROR SENSED IN IIST FLAG REGISTERS.;P E7ERROR: BGCK$A BF.MP,BE.FHW,FATAL ;CAN'T HANDLE THIS YET O;W,; NO ERRORS OR INTERRUPTS -- WHY ARE WE HERE;Y -7NOINT: BGCK$A BF.MP,BE.NIN,FATAL ;NO IMPLEMENTATION YETL .DSABL LSBA I O;+8; **-$IIINT-INTERRPROCESSOR INTERRUPT INTERRPUT SERVICE.;<; THIS ROUTINE ACCEPTS INCOMMING INTERRUPTS FROM THE II. IT>; WILL, IF THE PROPER BIT IS CLEAR IN $IIWAT, REPORT RECEPTION9; OF THE INTERRUPT TO ALL WAITING PROCESSORS AND LOAD ITSE:; INTERRUPT MASKS. OTHERWISE, IT WILL SIMPLY EXIT THROUGHC; $FORK THROUGH $DIRXT. NOTE: THE INTERRUPT VECTOR FOR THE II MUST >; UNIQUELY DETERMINE THE CSR ADDRESS (I.E. CSR=F(VEC)) FOR THE'; INITIALIZATION CODE TO WORK PROPERLY!E; ; INPUTS:A;I#; PS=CONTROLLER ID IN LOWER 4 BITS. ;E ; OUTPUTS:; ; NONE.;B; EXECUTES AT INTERRUPT LEVEL, AND AT EXEC LEVEL. OBSERVES PROPER(; REGISTER CONVENTIONS FOR THOSE LEVELS.;- C .ENABL LSBT/$IIINT::MFPS -(SP) ;;;SAVE CONDITION CODE BITST ;N>; THIS IS A POSSIBLE ENTRY FOR CPU STARTUP, WHEN THE PROCESSOR@; STARTING UP IS INTERRUPTED OUT OF THE BOOTSTRAP AND THRU CPA'SA; LOCAL MEMORY (AND VECTORS). IF CPA IS ONLINE AT THE TIME, THENA>; ITS IIST VECTOR POINTS TO THIS ROUTINE. SINCE THE BOOTSTRAP@; TURNS OFF MAPPING PRIOR TO ENABLING INTERRUPTS, THE FACT THAT A; THE MAPPING IS TURNED OFF IS A SIGNAL TO THIS ROUTINE THAT THI00z:wðvt´cÚµcÛ¶c�·c›’SE?; IS A CPU STARTUP, AND WE SHOULD JUMP TO $CPBGN (AND THENCE TOT ; $PENT).);; V# BIT #1,SR0 ;;;IS MAPPING ENABLED?S- BEQ $CPBGN ;;;IF EQ NO -- PROCESSOR STARTUPP. MTPS (SP)+ ;;;RESTORE PS CONDITION CODE BITS1 INTSV$ II,PR6,M$$PRO ;;;DO NORMAL INTERRUPT SAVET0 TALLY$ B.IPRC,XA$$IP,CPU ;COUNT AN IP INTR RCVDF;********************************* IIST DEBUGGING CODE ***************. CLR K.CRQ(R5) ;;;CLEAR OUT COUNTER FOR $STTICF;********************************* END IIST DEBUGGING CODE ***********& MOV (R5),R4 ;;;GET CSR ADDRESS OF II, MOV R5,-(SP) ;;;SAVE KRB ON STACK FOR LATER+ MOV #EXC,(R4) ;;;SELECT EXCEPTION REGISTERE MOV 2(R4),R5 ;;;GET ALL BITSP+ MOV #EXC,(R4) ;;;SELECT EXCEPTION REGISTERI# MOV R5,2(R4) ;;;CLEAR ALL RECEIVEDR3 BIC #177400,R5 ;;;CLEAR OUT ALL BUT THE RTE ERRORSI BEQ 5$ ;;;IF EQ NO ERRORS*- MOV (SP),R5 ;;;GET KRB ADDRESS FOR IIST KRB*/ INC K.CRQ+2(R5) ;;;INCREMENT RTE ERROR COUNTER 25$: MOV #DCF,(R4) ;;;SELECT DC / LO FLAGS REGISTER MOV 2(R4),R5 ;;;GET ALL BITS/ MOV #DCF,(R4) ;;;SELECT DC / LO FLAGS REGISTER( MOV R5,2(R4) ;;;CLEAR ALL BITSR2 BIC #177400,R5 ;;;USE ONLY THE DCF BITS (NOT BRK) BEQ 10$ ;;;IF NO DCF CHANGES" MOV R4,-(SP) ;;;SAVE CSR ON STACK. CALL $IISLM ;;;SET THE LOCAL INTERRUPT MASKS MOV (SP)+,R4 ;;;RESTORE R4B710$: MOV #STF,(R4) ;;;SELECT SANITY TIMER FLAG REGISTERP MOV 2(R4),R5 ;;;GET FLAGS' MOV #STF,(R4) ;;;SELECT REGISTER AGAIN  MOV R5,2(R4) ;;;CLEAR THEM OUT( BEQ 30$ ;;;IF EQ OKL% BIC #177760,R5 ;;;MAKE IT CPU'S ONLYBA BGCK$A BF.SAN,BE.FHW,DIRECT2 ;;;CRASH WITH SANITY TIMER MESSAGE4830$: MOV #PGF,(R4) ;;;SELECT INTERRUPT RECEIVED MASK REG2 MOV 2(R4),R5 ;;;GET MASK OF THOSE WHO INTERRUPTED" MOV #PGF,(R4) ;;;SELECT PGF AGAIN3 MOV R5,2(R4) ;;;CLEAR THOSE BITS TO SHOW RECEPTION+); BEQ NOINT ;;;IF EQ NO INTERRUPTS FOUNDE+ MOV R5,-(SP) ;;;SAVE THOSE WHO INTERRUPTEDR) MOV #PGCS,(R4) ;;;SELECT II CSR REGISTERG CLR 2(R4) ;;;CLEAR IT OUT;) MOV #PGCS,(R4) ;;;SELECT II CSR REGISTERB& MOV #IE,2(R4) ;;;SET INTERRUPT ENABLE CACHE$ BYPASS# MOV @$MPSWT,R5 ;GET FUNCTION TABLEE CACHE$ RESTOR; BIC #MP.INT,R5 ;ONLY PROCESSOR THOSE TO BE DONE AT INT LVLR BEQ 35$ ;IF EQ NONE TO PROCESS( MOV (SP),R4 ;GET THOSE WHO INTERRUPTED CALL $IIFNC ;EXECUTE FUNCTIONS%35$: MOV (SP)+,R5 ;GET INTERRUPT MASK;% MOV (SP)+,R4 ;;;GET KRB ADDRESS BACKP* TST K.FRK+2(R4) ;;;HAVE WE A FORK QUEUED? BEQ 40$ ;;;IF EQ NO -- GO FORK3 BIS R5,K.FRK+4(R4) ;;;ADD OUR CPUS TO CURRENT FORKC RETURNR S;B; QUEUE FORK BLOCK;  E.40$: ADD #K.FRK+6,R4 ;;;POINT TO LAST WORD + 2' CALL $FORK1 ;;;EXIT THRU FORK ROUTINE# I;R; EXECUTIVE LEVEL SERVICE.;O A& SUB #,R3 ;CREATE KRB ADDRESS7 MTPS K.PRI(R3) ;RAISE PRIORITY TO BLOCK II INT SERVICEF. CLR K.FRK+2(R3) ;;;SHOW FORK BLOCK NOT IN USE: BIS K.FRK+4(R3),R5 ;;;GET ANY ADDITIONAL BITS FROM WINDOW MTPS #0 ;;;LOWER PRIORITYK/ MOV R5,R4 ;PUT INTERRUPT MASK IN PROPER PLACER CACHE$ BYPASS" MOV @$MPSWT,R5 ;GET FUNCTION MASK CACHE$ RESTOR TST R5 ;PROCESS FUNCTIONS: BEQ 50$ ;IF EQ NOTHING TO DO CALL $IIFNC 50$: RETURN; .DSABL LSBR O;+,; **-$IIFNC-EXECUTE INTERPROCESSOR FUNCITON.;S>; THIS ROUTINE WILL TAKE A FUNCTION MASK IN R5 AND EXECUTE ALL?; FUNCTIONS CORRESPONDING TO THE BITS SET IN THE MASK. IT WILLC; USE THE JUMP TABLE AT $MPDSP. ;G ; INPUTS:T;A/; R4=PROCESSORS THAT HAVE INTERRUPTED THIS ONE.&; R5=FUNCTION MASK FOR THIS PROCESSOR.;L ; OUTPUTS:;Y:; ALL OF THE FUNCTIONS SPECIFIED IN THE FUNCTION MASK HAVE; BEEN EXECUTED.;I; R0, R1, R2, R3 ARE PRESERVED. ;- L$IIFNC::MOV R3,-(SP) ;SAVE R3 ( MOV R4,-(SP) ;SAVE R4 FOR OUR USE LATER" MOV #100000,R4 ;SET UP CLEAR MASK( MOV #$MPDSP,R3 ;SET START OF JUMP TABLE A-10$: ASL R5 ;PICK UP NEXT BIT FROM LEFT SIDEN% BCC 20$ ;IF CC NO FUNCTION THIS BITB A;M"; WE FOUND A FUNCTION FOR THIS BIT;S  MOV R5,-(SP) ;SAVE R5 MOV R4,-(SP) ;SAVE R4 MOV R3,-(SP) ;SAVE R3 L; /; CALL FUNCTION SUBROUTINE FROM DISPATCH TABLE. ; <; THE FUNCTION SUBROUTINES CAL00zBw{Iwtöt÷tø tþfDATALED FROM INTERRUPT LEVEL HAVE ;; R3, R4, AND R5 AVAILABLE FOR USE. THOSE CALLED FROM EXEC,%; LEVEL HAVE ALL REGISTERS AVAILABLE.#;0 ; INPUTS:U;L); R4=MASK OF PROCESSORS THAT INTERRUPTED.P;B 1 MOV 6(SP),R4 ;PUT PROCESSOR INTERRUPT MASK IN R41 CALL @(R3) ;CALL SUBROUTINE FROM DISPATCH TABLEE MOV (SP)+,R3 ;RESTORE R3B MOV (SP)+,R4 ;RESTORE R4S MFPS -(SP) ;SAVE PRIORITY4. MTPS #PR7 ;DON'T GET INTERRUPTED DURING LOCK- LOCK$ $IIFNL,SPIN ;;;LOCK THE FUNCTION TABLEU) BIC R4,@$MPSWT ;;;CLEAR OUT OUR FUNCTIONV0 ULOCK$ $IIFNL,SPIN ;;;UNLOCK THE FUNCTION TABLE$ MTPS (SP)+ ;;;RESTORE THE PRIORITY MOV (SP)+,R5 ;RESTORE R5&20$: BEQ 30$ ;IF EQ NO MORE FUNCTIONS$ TST (R3)+ ;BUMP JUMP TABLE POINTER$ ROR R4 ;POINT AT NEXT BIT TO CLEAR BNE 10$ ;IF NE MORE TO TRY/ ;(THIS WILL NEVER FALL THRU - R5 = 0 FIRST)R630$: MOV (SP)+,R4 ;RESTORE R4 (NOT REALLY NECESSARY -- ;COULD BE TST (SP)+G MOV (SP)+,R3 ;RESTORE R3 RETURNI ,;+-; **-$IIFNX-INTERPROCESSOR FUNCTION TRANSMIT.;;E=; THIS ROUTINE WILL LOAD THE BIT IN THE FUNCTION MASK FOR THEN;; APPROPRIATE PROCESSOR AND WILL INTERRUPT THE PROCESSOR(S)R?; DIRECTLY IF THE FUNCTION CAN BE PROCESSED AT INTERRUPT LEVEL,BA; OTHERWISE THE PROCESSOR WILL BE INTERRUPTED TO GO TO EXEC LEVEL1; AND PROCESS THE FUNCTION.(;S ; INPUTS: ;L$; R1=MASK OF PROCESSORS TO FUNCTION.; R2=FUNCTION MASK.R;L ; OUTPUTS:;(; PROCESSORS HAVE RECIEVED THE FUNCTION.;O); REGISTERS R1, R4, AND R5 ARE PRESERVED.P;- R*$IIFNX::MOV R1,R0 ;DUPLICATE PROCESS WORD MOV #$MPTAB,R3 ;POINT TO TABLES)10$: CLC ;MAKE FOLLOWING ROR WORK WRITEL# ROR R0 ;PUT NEXT CPU BIT IN CARRYT* BCC 20$ ;IF CC DON'T WORRY WITH THIS CPU T;VH; WE HAVE FOUND A CPU BIT ON. PLACE THE FUNCTION MASK INTO HIS FUNCTION; WORD.C;   MFPS -(SP) ;SAVE PRIORITYL- MTPS #PR7 ;DONT GET INTERRUPTED DURING LOCKN- LOCK$ $IIFNL,SPIN ;;;LOCK THE FUNCTION TABLEH! BIS R2,(R3) ;;;SET THE FUNCTIONE0 ULOCK$ $IIFNL,SPIN ;;;UNLOCK THE FUNCTION TABLE MTPS (SP)+ ;;;RESTORE PRIORITY% TST R0 ;SET THE CONDITION CODE BITSS'20$: BEQ 30$ ;IF EQ NO PROCESSORS LEFTT1 TST (R3)+ ;POINT TO NEXT WORD IN FUNCTION TABLE  BR 10$ ;GO BACK FOR MORE U630$: BIC #MP.INT,R2 ;SPECIAL INTERRUPT LEVEL FUNCTION? BEQ 40$ ;IF EQ NOC N; C; THIS FUNCTION IS ONE OF THOSE WHICH IS PROCESSED IN THE INTERRUPTNB; SERVICE ROUTINE OF THE INTERPROCESSOR INTERRUPT. SINCE THE CPUSC; INVOLVED (IF MORE THAN ONE) DON'T HAVE TO BE LOCKED INTO THE EXEC F; TO PROCESS THE FUNCTION, THEN WE WILL INTERRUPT THEM ALL IMMEDIATELY5; AND ALLOW THEM TO PROCESS THE FUNCTION IN PARALLEL.S;F # CALL $IIXMT ;INTERRUPT PROCESSORSN RETURNL ; C; IN THE FOLLOWING CASE, THE PROCESSORS MUST BE IN THE EXECUTIVE TOVE; PROCESS THE FUNCTION. WE CONSIDER THIS ANOTHER REASON TO INTERRUPTH<; THE PROCESSOR IN THE NORMAL, ROUND ROBIN SCHEME OF THINGS.;E T40$: MFPS -(SP) ;SAVE PRIORITY / MTPS #PR7 ;NO INTERRUPTS DURING LOCKED PERIOD ( LOCK$ $FORKL,SPIN ;;;LOCK THE FORK LIST4 BIS R1,$IIPND ;;;SET THE CPU'S WE WANT TO INTERRUPT+ ULOCK$ $FORKL,SPIN ;;;UNLOCK THE FORK LIST MTPS (SP)+ ;;;RESTORE PRIORITY RETURNT O .ENDC R R .END; C; IN THE FOLLOWING CASE, THE PROCESSORS MUST BE IN THE EXECUTIVE TOVE; PROCESS THE FUNCTION. WE CONSIDER THIS ANOTHER REASON TO INTERRUPTH<; THE PROCESSOR IN THE NORMAL, ROUND ROBIN SCHEME OF THINGS.;E T40$: MFPS -(SP) ;SAVE PRIORITY / MTPS #PR7 ;NO INTERRUPTS DURING LOCKED PERIOD ( LOCK$ $FORKL,SPIN ;;;LOCK THE FORK LIST4 BIS R1,$IIPND ; .TITLE ACSUB  .IDENT /03.00/U ;OC; COPYRIGHT (c) 1982, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.O; ALL RIGHTS RESERVED.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; M. S. FOX 18-OCT-78R;H+; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:S;M; B. KRISHNAMURTHY; ; MODIFIED BY:;E; J. W. BERZLE 07-SEP-83 03.00;P2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES;E#; CPU ACCOUNTING COMMON SU00{Jwðvt´cÚµcÛ¶c�·c›’BROUTINES ;U; MACRO LIBRARY CALLS;O  .MCALL ACNDF$,ABODF$,BGCK$A* ACNDF$ ;DEFINE ACCOUNTING BLOCK OFFSETS ABODF$ ;TASK ABORT CODESS W;+D; **-$QTRAN-QUEUE ACCOUNTING TRANSACTION TO SYSLOG (USE DEFAULT UAB)F; **-$QTRN1-QUEUE ACCOUNTING TRANSACTION TO SYSLOG (USE SPECIFIED UAB)O; **-$QTRN2-QUEUE ACCOUNTNIG TRANSACTION TO SYSLOG (NO UAB, PACKET IS COMPLETE)IM; **-$QACNT-QUEUE ACCOUNT BLOCK TO SYSLOG (THE BLOCK IS ALREADY IN SEC. POOL)I;AI; THESE ROUTINES QUEUE ALL THE ACCOUNTING DATA PACKETS TO THE SYSLOG TASKR; FOR PROCESSING;C ; INPUTS:A;F?; R0=VIRTUAL ADDRESS OF PACKET IN CALLING TASK'S SPACE ($QTRAN,T; $QTRN1, $QTRN2)A; R1=RELOCATION BIAS TO MAP UAB OR ACCOUNT BLOCK ($QTRN1, $QACNT) ;) ; OUTPUTS:;UA; BF.ERR SET IN $ACNFE IF ALLOCATION FAILURE OR SYSLOG NOT ACTIVEN;U ; REGISTERS R3, R4, R5 PRESERVED;(;-  K I .IF DF A$$CNT $ .ENABL LSBC*$QTRAN::MOV $TKTCB,R1 ;LOCATE CURRENT TASK2 MOV T.ACN(R1),R1 ;LOCATE TASK'S ACCOUNTING BLOCKS0 BNE $QTRN1 ;IF NE, THERE ARE ACCOUNTING BLOCKS RETURN ;NOTHING TO DO $QTRN2::CLR R1 ;THERE IS NO UAB)$QTRN1::TST $SABPT ;IS ACCOUNTING ACTIVEQ BEQ 45$ ;IF EQ NOR SAVNR ;SAVE R4, R5A MOV R3,-(SP) ;SAVE R3 CLR R4 ;% BISB B.LEN(R0),R4 ;GET PACKET LENGTHA MOV R1,-(SP) ;SAVE UAB ADDRESSL MOV R4,R1 ;LENGTH , ADD #77,R1 ;ROUND UP TO NEXT 32 WORD BLOCK1 ASH #-6,R1 ;CONVERT TO NUMBER OF 32 WORD BLOCKS 6 MOV R0,R5 ;SAVE VIRTUAL PACKET ADDRESS IN TASK SPACE& CALL $ALACC ;ALLOCATE SECONDARY POOL BCC 10$ ;IF CC SUCCESS TST (SP)+ ;POP UAB ADDRESS BR 40$ ;RETURN110$: MOV R0,-(SP) ;SAVE ALLOCATED BLOCK'S ADDRESSO' MOV R5,R0 ;GET VIRTUAL PACKET ADDRESSV& CALL $RELOC ;RELOCATE PACKET TO APR6& SUB #20000,R2 ;CONVERT TO APR5 OFFSET' MOV R4,R0 ;GET PACKET LENGTH IN BYTESD7 MOV (SP),R3 ;APR MAPPING BIAS TO SECONDARY POOL BLOCKE5 MOV #140000,R4 ;VIRTUAL ADDRESS OF DESTINATION BLOCK . CALL $BLXIO ;COPY PACKET INTO SECONDARY POOL2 MOV (SP)+,R1 ;ADDRESS OF PACKET IN SECONDARY POOL MOV #KISAR5,R3 ;POINT TO APR5( MOV (R3)+,R5 ;SAVE CURRENT APR5 MAPPING( MOV (R3),R4 ;SAVE CURRENT APR6 MAPPING. MOV R1,(R3) ;MAP SECONDARY POOL NODE IN APR6! MOV (SP)+,-(R3) ;MAP UAB IN APR5T BEQ 20$ ;IF EQ, NO UAB5 MOV #B.HID+140000,R2 ;GET START OF ID INFO IN HEADER 215$: MOV -20000(R2),(R2)+ ;COPY WORD INTO SEC POOL2 CMP #B.HEND+140000,R2 ;ALL HEADER ID DATA COPIED? BHI 15$ ;IF HI NOL'20$: MOV R5,(R3)+ ;RESTORE APR5 MAPPINGO# MOV R4,(R3) ;RESTORE APR6 MAPPING BR 25$ ; $QACNT:: ; MOV R3,-(SP) ;SAVE R3625$: MOV #B.TIM,R0 ;GET OFFSET TO TIME FIELD IN PACKET CALL $TMSTP ;TIME STAMP PACKET" MOV #$SYLHD,R0 ;POINT TO LISTHEAD3 CALL $QSPIF ;INSERT PACKET AT END OF SYSLOG QUEUEQ6 BIT #BF.ERR!BF.STR,$ACNFE ;SHOULD SYSLOG BE UNSTOPPED BNE 30$ ;IF NE NO& MOV $LOGPT,R0 ;GET SYSLOG TCB ADDRESS BEQ 50$ ;IF EQ, NOT INSTALLED2) BIT #TS.EXE,T.STAT(R0) ;IS SYSLOG ACTIVE  BNE 50$ ;IF NE NOR/ BIT #BF.SLR,$ACNFE ;IS SYSLOG ACTIVELY RUNNINGE BNE 30$ ;IF NE YES CALL $EXRQN ;UNSTOP SYSLOG30$:40$: MOV (SP)+,R3 ;RESTORE R3 45$: RETURN ;EE50$: BIS #BF.ERR,$ACNFE ;INDICATE ACCOUNTING HAS STOPPED DUE TO ERRORT BR 30$ ;RETURN .DSABL LSBR A T;+6; **-$ALACC-ALLOCATE SECONDARY POOL FOR ACCOUNTING USE/; **-$ALTAB-ALLOCATE A TASK ACCOUNT BLOCK (TAB)$;PB; THIS ROUTINE DOES ALL SECONDARY POOL ALLOCATIONS FOR ACCOUNTING.C; A CHECK IS MADE TO INSURE THAT ACCOUNTING ALWAYS LEAVES A CERTAINFI; AMOUNT OF SEC POOL AVAILABLE. THE ALLOCATION WILL FAIL IF THIS MINIMUMNM; AMOUNT OF CANNOT BE LEFT AFTER THE ACCOUNTING ALLOCATION. IF AN ACCOUNTINGBH; ALLOCATION FAILS FOR ANY REASON, A TKTN MESSAGE WILL BE PRINTED ON CO:1; DESCRIBING WHAT TASK LOST ITS ACCOUNTING BLOCK.O;E;C ; INPUTS: ; 1; R1=SIZE OF BUFFER TO ALLOCATE IN 32 WORD BLOCKS 5; R4=TCB ADDRESS OF TASK TO RECEIVE TAB ($ALTAB ONLY)L;L ; OUTPUTS:;C; C=0 ALLOCATION SUCCESSFULO%; R0=APR BIAS TO MAP ALLOCATED BLOCK ; R1=NUMBER OF BLOCKS ALLOCATED; C=1 CANNOT DO ALLOCATION;I; REGISTERS R4, R5 PRESE00{RwIwtöt÷tø tþfDATARVED;A;- .ENABL LSBE@$ALTAB::MOV #T.NTAF,-(SP) ;ERROR CODE FOR TAB ALLOCATION FAILURE BR 5$ ;JOIN COMMON CODE @$ALACC::MOV #T.NAAF,-(SP) ;GENERAL ACCOUNTING ALLOCATION FAILURE?5$: BIT #BF.ERR,$ACNFE ;HAS THERE BEEN A FATAL ACCOUNTING ERROR  BNE 10$ ;IF NE YES1 MOV $SECFR,R2 ;GET AMOUNT OF FREE SECONDARY POOLL& SUB R1,R2 ;ALLOW FOR THIS ALLOCATION2 CMP $APLIM,R2 ;WILL THERE BE ENOUGH LEFT AFTER IT BHI 10$ ;IF HI NOS& CALL $ALSEC ;ALLOCATE SECONDARY POOL$ BCS 10$ ;IF CS, ALLOCATION FAILURE" TST (SP)+ ;THROW AWAY ERROR CODE RETURN ;E!10$: MOV (SP)+,R0 ;GET ERROR CODEE SAVNR ;SAVE R4, R5C/ CMP #T.NTAF,R0 ;IS IT A TAB ALLOCATION FAILUREN BEQ 20$ ;IF EQ YES' MOV $TKTCB,R4 ;LOCATE CURRENT TASK TCBF220$: MOV T.NAM(R4),R5 ;GET FIRST HALF OF TASK NAME$ MOV T.NAM+2(R4),R4 ;GET SECOND HALF CALL $DVMSG ;REQUEST TKTNR SEC ;INDICATE ERROR RETURN; .DSABL LSB  U;+*; **-$TMSTP-TIME STAMP AN ACCOUNTING BLOCK;CD; THIS ROUTINE COPIES THE CURRENT TIME FROM $TTNS INTO THE SPECIFIED2; OFFSET IN THE ACCOUNTING BLOCK IN SECONDARY POOL;( ; INPUTS:T;R2; R0=OFFSET TO START OF 3 WORD TIME FIELD IN BLOCK%; R1=APR BIAS TO MAP ACCOUNTING BLOCK$;I ; OUTPUTS:;$; TIME FIELD OF BLOCK UPDATEDC;$; REGISTERS R1, R3, R4, R5 PRESERVED;T;- E+$TMSTP::MOV KISAR6,-(SP) ;SAVE APR6 MAPPING $ MOV R1,KISAR6 ;MAP ACCOUNTING BLOCK2 ADD #140000,R0 ;GET VIRTUAL ADDRESS OF TIME FIELD( MOV #$TTNS-14,R2 ;POINT TO CURRENT TIME!10$: MOVB (R2)+,(R0)+ ;COPY FIELDF/ INC R2 ;SKIP HIGH BYTE OF WORD FIELD IN SYSCMO! CMP #$TTNS,R2 ;COPYING COMPLETE? BHI 10$ ;IF HI NOO" MOV (SP)+,KISAR6 ;RESTORE MAPPING20$: RETURN ;R A;+-; **-$CPUTM-CALCULATE CPU TIME USED BY A TASKI5; **-$CPUT1-CALCULATE CPU TIME USED BY SPECIFIED TASK ;PF; THIS ROUTINE CALCULATES THE AMOUNT OF CPU TIME A TASK HAS USED SINCED; IT GOT CONTROL OF THE PROCESSOR. A VALUE OF ZERO IS ROUNDED UP TOF; 1/2 TICK BY COUNTING EVERY OTHER ZERO AS ONE TICK. THEREFORE A TASKB; WILL BE BILLED FOR AT LEAST 1/2 TICK EVERY TIME IT GETS CONTROL.;; INPUT:;2:; R0=TCB ADDRESS OF TASK TO BILL CPU TIME TO ($CPUT1 ONLY); NO INPUTS IF ENTRY AT $CPUTM;R ; OUTPUT: ;$; NONE;L#; REGISTERS R0, R1, R2, R3 MODIFIEDP;-;- T .ENABL LSBE;YD10$: BGCK$A BF.ACC,BE.NCT,FATAL ;MUST BE ACTIVE TASK WITH ACCOUNTING;T*$CPUTM::MOV $TKTCB,R0 ;LOCATE CURRENT TASK! BEQ 10$ ;IF EQ, NO CURRENT TASKD8$CPUT1::MOV T.ACN(R0),R0 ;LOCATE TASK'S ACCOUNTING BLOCK$ BEQ 10$ ;IF EQ NO ACCOUNTING BLOCK% INCB $BILNG ;END CPU BILLING PERIODG4 MOV $ACCLK+2,R2 ;GET LOW ORDER PART OF CURRENT TIME# MOV $ACCLK,R3 ;GET HIGH ORDER PART4 SUB $STRTM+2,R2 ;CALCULATE TIME ELAPSED SINCE START SBC R3 ; SUB $STRTM,R3 ;4 MOV #B.CPU,R1 ;GET OFFSET TO CPU ACCUMULATION FIELD* MOV R2,-(SP) ;CHECK IF DIFFERENCE IS ZERO) BIS R3,(SP)+ ;CHECK BOTH HALFS OF NUMBERR BNE 30$ ;IF NE, NON-ZERO' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGO1 BIT #BF.LSS,$ACNFE ;SYSTEM ACCONTING TURNED ON ?Q BEQ 15$ ;NO, IF EQ.I MOV $SABPT,KISAR6 ;MAP SABC/ ADD #1,@#B.RND+140002 ;COUNT ZERO CPU INTERVALE& ADC @#B.RND+140000 ;DOUBLE WORD COUNT15$:$ MOV R0,KISAR6 ;MAP ACCOUNTING BLOCK5 BITB #BS.ZER,@#B.STM+140000 ;PREVIOUS ZERO INTERVAL?, BNE 20$ ;IF NE YES4 BISB #BS.ZER,@#B.STM+140000 ;REMEMBER ZERO INTERVAL BR 50$ ;620$: BICB #BS.ZER,@#B.STM+140000 ;RESET ZERO INDICATOR, INC R2 ;COUNT A TICK, FOR 2 ZERO INTERVALS .IF DF X$$ACC&XA$$CTB' MOV (SP)+,KISAR6 ;RESTORE EXEC MAPPINGO(30$: MOV KISAR6,-(SP) ;SAVE EXEC MAPPING MOV $SABPT,KISAR6 ;MAP SAB. MOV R4,-(SP) ;SAVE R4 .IF DF M$$PRO) MOVB $PROC2,R4 ;GET PROCESSOR WORD INDEXV ASL R4 ;MAKE IT A DBLWRD INDEX6 ADD #B.CPUT+140002,R4 ;POINT PAST ACCUMULATION BUCKET .IFF 5 MOV #B.CPUT+140002,R4 ;POINT PAS ACCUMULATION BUCKETN .ENDC ; DF M$$PRO8 ADD R2,(R4) ;ADD LOW ORDER CPU TIME FOR THIS PROCESSOR ADC -(R4) ;K ADD R3,(R4) ;HIGH ORDER MOV (SP)+,R4 ;RESTORE R4' MOV (SP)+,KISAR6 ;RESTORE EXEC MAPPING .IFFK BR 40$ ;,30$: ;ADD CPU TIME 00{Zwðvt´cÚµcÛ¶c�·c›’INTO ACCOUNTING BLOCKS .ENDC ;+B; **-$ADATA-ADD DATA TO THE APPROPRIATE FIELD OF ACCOUNTING BLOCKSI; **-$ADATS-ADD DATA TO APPROPRIATE FIELD ASSUMING SINGLE PRECISION VALUEOC; **-$ADAT1-INCREMENT THE APPROPRIATE ACCOUNTING ACCUMULATION FIELDB;EI; THESE ROUTINES ADD THE SUPPLIED DATA TO THE ACCUMULATION FIELD OF EVERYPH; ACCOUNTING BLOCK LINKED OFF THE INITIAL BLOCK UNTIL END OF THE LIST IS>; REACHED. A STANDARD TWO WORD ACCUMULATION FIELD IS REQUIRED.;0 ; INPUTS::; (; R0=APR BIAS TO MAP FIRST BLOCK IN LIST.; R1=OFFSET TO ACCUMULATION FIELD WITHIN BLOCK3; R2=LOW ORDER PART OF TO ADD ($ADATA, $ADATS ONLY)D+; R3=HIGH ORDER PART OF VALUE ($ADATA ONLY)R;S ; OUTPUTS:;*; NONE;R4; ALL REGISTERS ARE PRESERVED ($ADAT1 DESTROYES R2);;- .$ADATA::MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING* MOV R0,KISAR6 ;MAP SUPPLIED INITIAL BLOCK!40$: ADD R2,140002(R1) ;ADD VALUEF+ MOV R3,-(SP) ;GET HIGH ORDER PART OF VALUEA/ ADC (SP) ;INCLUDE CARRY BIT FROM PREVIOUS ADD 3 ADD (SP)+,140000(R1) ;ADD HIGH ORDER PART OF VALUEE BCC 45$ ;IF CC, OK CALL OVFLW ;HANDLE OVERFLOWP645$: MOV @#B.PNT+140000,KISAR6 ;MAP NEXT BLOCK IN LIST BNE 40$ ;IF NE, THERE IS ONE50$:" MOV (SP)+,KISAR6 ;RESTORE MAPPING RETURNS E $ADAT1::MOV #1,R2 ;VALUE TO ADD$ADATS::MOV R3,-(SP) ;SAVE R3A, CLR R3 ;MAKE HIGH ORDER PART OF VALUE ZERO$ CALL $ADATA ;CALL ADDITION ROUTINE MOV (SP)+,R3 ;RESTORE R3P RETURNG R .DSABL LSBA A;+3; **-OVFLW-HANDLE FIELD OVERFLOW FOR $ADATA ROUTINE(;+@; THIS LOCAL ROUTINE GETS CALLED WHEN THE ADD, ADC, ADD SEQUENCE=; IN THE $ADATA ROUTINE RESULTS IN C=1 OUT OF THE SECOND ADD.;>; IF THE ACCOUNTING BLOCK IS A TAB AND THE FIELD IS B.CPU, THEC; TASK HAS EXCEEDED ITS TIME LIMIT. IT IS THEREFORE ABORTED, UNLESSA>; IT HAS ALREADY BEEN DEACTIVATED. THIS CAN HAPPEN BY THE CALL; TO $CPUTM OUT OF DREIF.C; ; INPUTS:L;D(; R1=OFFSET TO FIELD IN ACCOUNTING BLOCK;R5; THE ACCOUNTING BLOCK MUST BE MAPPED THROUGH KISAR6L;V ; OUTPUTS:;T; NONE;;-@OVFLW: CMPB #BT.TAB,@#B.TYP+140000 ;IS THIS A TASK ACCOUNT BLOCK BNE 20$ ;IF NE NO - CMP #B.CPU,R1 ;IS CPU TIME BEING ACCUMULATEDE BNE 20$ ;IF NE NOA/ MOV @#B.TCB+140000,R1 ;GET TCB ADDRESS OF TASKE TST T.STAT(R1) ;IS TASK ACTIVER BMI 10$ ;IF MI NO 5 MOV R0,-(SP) ;SAVE ORIGINAL ACCOUNTING BLOCK ADDRESS 2 MOV #S.COTL,R0 ;SET ABORT CODE OF OVER TIME LIMIT( MOV R2,-(SP) ;SAVE CPU TIME TO BE ADDED MOV R3,-(SP) ;U CALL $ABTSK ;ABORT TASKT MOV (SP)+,R3 ;RESTORE R3T MOV (SP)+,R2 ; MOV (SP)+,R0 ;P+10$: MOV #B.CPU,R1 ;RESTORE OFFSET TO FIELDU20$: RETURN ;$;+8;**-$ACINP-INCREMENT PROCESSOR SPECIFIC FIELD IN THE SAB!;**-$ACINC-INCREMENT FIELD IN SAB0;,@; THESE TWO ROUTINES WILL INCREMENT A FIELD IN THE SAB. IF ENTRYB; IS AT $ACINP, THEN THE FIELD IS INDEXED BY THE PROCESSOR NUMBER.;S ; INPUTS:.;L+; R0 = SAB OFFSET TO INCREMENT + 140002R#; (SP) = RETURN ADDRESS OF CALLERM+; 2(SP) = SAVED R0 PRIOR TO LOADING OFFSETM;( ; OUTPUTS:;E4; R0 IS RESTORED FROM PREVIOUS VALUE, STACK CLEANED;- .IF DF X$$ACC$ACINP:: ;REFERENCE LABEL .IF DF M$$PRO# MOV R0,-(SP) ;SAVE OFFSET INTO SABS) MOVB $PROC2,R0 ;GET PROCESSOR WORD INDEX ASL R0 ;MAKE IT DOUBLEWORD ADD (SP)+,R0 ;ADJUST OFFSET .ENDC ; DF M$$PRO$$ACINC::MOV KISAR6,-(SP) ;SAVE APR 61 MOV $SABPT,KISAR6 ;POINT TO SYSTEM ACCOUNT BLOCKE2 BEQ 10$ ;IF EQ THERE IS NONE, RESTORE AND RETURN* ADD #1,(R0) ;INCREMENT LOW HALF OF COUNT) ADC -(R0) ;AND HIGH HALF IF APPROPRIATER+10$: MOV (SP)+,KISAR6 ;RESTORE EXEC MAPPING-% MOV (SP)+,R0 ;RESTORE RETURN ADDRESSE' RTS R0 ;RESTORE R0 AND RETURN TO USER( .IFF ;X$$ACCI$ACINP::$ACINC:: .ENDC ;X$$ACC .IFF A$QTRAN::$QTRN1::$QTRN2::$QACNT::$ALACC::$TMSTP::$CPUTM::$CPUT1::$ALTAB::$ACINP:: $ACINC:: E .ENDC V A .ENDAR6 ;POINT TO SYSTEM ACCOUNT BLOCKE2 BEQ 10$ ;IF EQ THERE IS NONE, RESTORE AND RETURN* ADD #1,(R0) ;INCREMENT LOW HALF OF COUNT) ADC -(R0) ;AND HIGH HALF IF APPROPRIATER+10$: MOV (SP00|bwIwtöt÷tø tþfDATA .TITLE MSDRV .IDENT /12.00/ ;G7; COPYRIGHT (C) 1986 BY DIGITAL EQUIPMENT CORPORATIONT; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;$ ; VERSION 12.00C ;N ; PREVIOUSLY MODIFIED BY: ;D ; B. S. MCCARTHY ; C. SESTOKASO ;U ; MODIFIED BY: ;R ; C. SESTOKAS 7-APR-86 ;T. ; CS017 -- RETURN IS.SUC FOR IO.SPF AT BOT. ;5 ; CS018 -- CORRECT TRPHYS ROUTINE AND CALLS TO IT.L ;R; ; CS019 -- CHANGE SPB/SPF TIMEOUT VALUES TO HANDLE TK25.I ; + ; CS020 -- CONVERT TO USE EXEC VECTORINGR ;F@ ; CS021 -- HANDLE CALL FOR CONTROLLER POWER FAIL (C BIT SET). ;N< .PAGE=;M>; MACRO LIBRARY CALLS?;E3@ .MCALL ABODF$,CLKDF$,HWDDF$,PKTDF$,UCBDF$,UMDIO$DA ABODF$ ;TASK ABORT CODESS.B CLKDF$ ;CLOCK QUEUE CONTROL BLOCK OFFSETSC HWDDF$ ;HARDWARE REGISTERS7D PKTDF$ ;I/O PACKET OFFSETSO(E UCBDF$ ;UNIT CONTROL BLOCK OFFSETS..F UMDIO$ ;USER MODE DIAGNOSITIC DEFINITIONSGHIJ;T<K; BIT DEFINITIONS FOR UCB CHARACTERISTICS WORD # 2 (U.CW2)L;EM3NM.PEOV= 100000 ;TAPE PAST LOGICAL END OF VOLUMEP0OM.AEOV= 40000 ;TAPE AT LOGICAL END OF VOLUME PM.BOT= 20000 ;TAPE IS AT BOT0QM.1600= 4000 ;UNIT IS 1600 BPI PHASE ENCODED$RM.HWL= 2000 ;HARDWARE WRITE LOCK"SM.RWD= 1000 ;UNIT IS REWINDING)TM.SER= 400 ;SELECT ERROR HAS OCCURREDT%UM.IWR= 200 ;INHIBIT WRITE RETRIES %VM.SWL= 100 ;SOFTWARE WRITE LOCKED 5WM.TMK= 40 ;ENCOUNTERED TAPE MARK - FWD DIRECTION.3XM.EOT= 20 ;LAST COMMAND ENCOUNTERED END OF TAPE(0YM.SWAP= 2 ;SWAP BYTES FOR COMPATIBILITY MODEZ@[USRBTS= M.IWR!M.SWL!M.SWAP ;STATUS BITS CONTROLLED BY THE USER@\NEWBTS= M.BOT!M.EOT!M.SER!M.HWL!M.1600 ;STATUS TO BE UPDATED.0]MOVBTS= M.TMK!M.AEOV ;BITS SET BY TAPE MOTION^_;;`; FLAG BIT DEFINITIONS FOR CONTROLLER STATUS WORD (CSTAT)Ra;Ob2cCS.SER = 40000 ;'SEL ERR' - UNIT OFFLINE STATE./dCS.WSS = 20000 ;WAITING FOR SUB-SYSTEM READYE/eCS.TMO = 10000 ;THIS OPERATION HAS TIMED OUT2#fCS.NER = 2000 ;NO ERROR RECOVERYT#gCS.ABO = 1000 ;ABORT IN PROGRESSO%hCS.UMD = 200 ;USER MODE DIAGNOSTIC.,iCS.SFB = 100 ;SPACE FILES VIA SPACE BLKS.)jCS.RSP = 40 ;REWIND/SPACE IN PROGRESS. 1kCS.LBA = 20 ;LOADING DEVICE MSG BUFFER ADDRESST)lCS.GST = 10 ;DOING GET CHARACTERISTICST'mCS.CIP = 1 ;COMMAND IN PROGRESS FLAGCno .PAGEp; **-DEVICE REGISTER OFFSETSq$rTSBA= -2 ;BUS ADDRESS REGISTER$sTSDB= -2 ;DATA BUFFER REGISTERtTSSR= 0 ;STATUS REGISTER uvw; **-COMMAND PACKETOx,yCMDHDR= 0 ;#1 COMMAND/CONTROL FUNCTION.-zCMDB2= 2 ;#2 DT TRFR - LO ORD BUF @ .OR."{ ; NDT TRFR - TMK/RCRD CNT.)|CMDB3= 4 ;#3 DT TRFR - HI ORD BUF @.G'}CMDB4= 6 ;#4 DT TRFR - BYTE COUNT.G~€; **-STATUS REGISTER�2‚TSSRSV= 10 ;SAVED TSSR DEVICE STATUS REGISTER.ƒ„…; **-MESSAGE PACKET† ‡MSGHDR= 12 ;#1 HEADER WORD -ˆ MG.ACK=100000 ; ACK BIT,R‰ ; 70000 ; RESERVED,E Š ; 1400 ; CLASS CODE BITS,)‹ MG.FMT= 340 ; MESSAGE FORMAT BITS,'Œ MG.COD= 37 ; MESSAGE CODE BITS;T� MC.END=20 ; END,Ž MC.FAL=21 ; FAIL,� MC.ERR=22 ; ERROR,� MC.ATN=23 ; ATTENTION.#‘ MC.LOG=24 ; LOG (NOT USED). ’+“MSGLGH= 14 ;#2 MESSAGE LENGHT: #3 - #7.I-”RBPCR= 16 ;#3 RESIDUAL BYTE/FRAME COUNT.T'•XST0= 20 ;#4 EXTENDED STATUS REG 0,E–XST1= 22 ;#5 1,—XST2= 24 ;#6 2,.˜XST3= 26 ;#7 3.R™š›; **-CHARACTERISTIC PACKETœ.�CHRWD1= 30 ;#1 > MESSAGE PCKT - LO ORD @,.žCHRWD2= 32 ;#2 > MESSAGE PCKT - HI ORD @.*ŸCHRWD3= 34 ;#3 MESSAGE PACKET LENGHT,( CHRWD4= 36 ;#4 I/O CHARACTERISTICS:.¡ CH.ESS=200 ; STOP - TMK/TMK, (UNLABELLED.¢ CH.ENB=100 ; STOP - BOT/TMK. TAPE)-£ CH.EAI= 40 ; ENABLE ATTENTION INTERRUPT.;1¤ CH.ERI= 20 ; ENABLE MSG BUFFER RLS INTRUPTS.T¥ .PAGE¦;G§; XST0 BIT DEFENITIONS¨;©&ªX0.TMK= 100000 ;TAPE MARK DETECTED&«X0.RLS= 00|jwðvt´cÚµcÛ¶c�·c›’40000 ;RECORD LENGTH SHORT&¬X0.LET= 20000 ;LOGICAL END OF TAPE%­X0.RLL= 10000 ;RECORD LENGTH LONGG"®X0.WLE= 4000 ;WRITE LOCK ERROR)¯X0.NEF= 2000 ;NON-EXECUTABLE FUNCTION;!°X0.ILC= 1000 ;ILLEGAL COMMAND= ±X0.ILA= 400 ;ILLEGAL ADDRESS-²X0.MOT= 200 ;TAPE MOTION ON LAST COMMAND.P³X0.ONL= 100 ;ON LINE´X0.IE= 40 ;INTERRUPT ENABLERµX0.VCK= 20 ;VOLUME CHECK%¶X0.PED= 10 ;* PHASE ENCODED DRIVEB· ;* NOT USED - TK25.¸X0.WLK= 4 ;WRITE LOCK ¹X0.BOT= 2 ;BEGINNING OF TAPE#ºX0.EOT= 1 ;END OF TAPE DETECTEDG»¼;O½; XST1 BIT DEFENITIONS¾;R¿ÀX1.DLT= 100000 ;DATA LATERÁ; 40000 ;NOT USED.%ÂX1.COR= 20000 ;* CORRECTABLE DATA0à ;** NOT USED - TK25.$ÄX1.CRS= 10000 ;* CREASE DETECTED!Å ;** NOT USED - TSV05, TU80.T ÆX1.TIG= 4000 ;* TRASH IN GAP.ÇX1.NER= 4000 ;* TK25 - NOISE DURING ERASE.&ÈX1.DBF= 2000 ;* DESKEW BUFFER FAILÉX1.SCK= 1000 ;* SPEED CHECKU'Ê ;** NOT USED - TK25, TSV05, TU80.#ËX1.RBE= 400 ;! READ BUS PAR ERR0 Ì ;!! NOT USED - TK25, TS11.#ÍX1.IPR= 200 ;* INVALID PREAMBLEÎX1.SYN= 100 ;* SYNCH ERROR'Ï ;** NOT USED - TK25, TSV05, TU80. #ÐX1.TN3= 200 ;$ TAPE TRACK #3. \*0ÑX1.TN2= 100 ;$ | | #2. \ TK25 ONLY.#ÒX1.TN1= 40 ;$ | | #1. /U"ÓX1.TN0= 20 ;$ TAPE TRACK #0. /#ÔX1.IPO= 40 ;% INVALID POSTAMBLED!Õ ;%% NOT USED - TK25, TSV05.E"ÖX1.IED= 20 ;* INVALID END DATA!×X1.POS= 10 ;* POSTAMBLE SHORT-&ØX1.EW= 10 ;* TK25 - EARLY WARNING.ÙX1.POL= 4 ;* POSTAMBLE LONG 'Ú ;** NOT USED - TK25, TSV05, TU80.V!ÛX1.UNC= 2 ;UNCORRECTABLE DATAS"ÜX1.MTE= 1 ;% MULTI-TRACK ERROR!Ý ;%% NOT USED - TSV05, TK25.$Þß;Cà; XST2 BIT DEFENITIONSá;|â)ãX2.OPM= 100000 ;OPERATION IN PROGRESS 'äX2.SIP= 40000 ;* TS11-SILO PAR ERR,T.åX2.RCE= 40000 ;* TSV05 - RAM CHECKSUM ERR,0æX2.DCF= 40000 ;* TK25 - COMMUNICATION FAULT.ç ;**NOT USED - TU80.10èX2.BPE= 20000 ;* SERIAL BUS PAR ERR AT DRIVE+éX2.DHF= 20000 ;* TK25 - HARDWARE FAULT.B!ê ;** NOT USED - TSV05, TU80.,0ëX2.SPD= 10000 ;* TK25 - CAPSTAN SPEED ERROR.!ì ;** NOT USED - TSV05, TU80.R*íX2.TU8= 4000 ;"1"-TU80 IDENTIFICATION.(îX2.TK2= 1000 ;"TK25" IDENTIFICATION.ï ; UNIT BIT 9, 11Tð ; TS11 0 0 UNIBUSñ ; TSV05 0 0 Q BUS2ò ; TU80 0 1 UNIBUS"ó ; TK25 1 0 Q22/UNIBUS(ô ; TSU05 1 1 TSV05 FOR UNIBUS&õX2.WCF= 2000 ;* WRITE CARD FAILUREö ;* NOT USED - TK25.D÷8øX2.DTK= 777 ;* TS11/TU80 DATA TRFR: DEAD TRKS P,7-0.+ù ;* TS11/TU80 WRT CHAR: MICROCODE REV.S,ú ;* TS11 STATUS: RES CAPSTAN TIC COUNT.û ;* TU80 STATUS: 0'S.ü4ýX2.REV= 377 ;* TSV05 WRT CHAR: 200 - XND FTR SW,-þ ;* 100 - BUFF SW, 77 - MICROCODE REV. $ÿ ;* TSV05 DATA TRF/STATUS: 0'S.2X2.EAD= 377 ;* TK25 - ERROR ADDRESS (LO BYTE).4X2.XFS= 200 ;* TK25 - WRT CHAR: XTND FEATURE SW,%X2.MCD= 177 ; MICROCODE REV.D;; XST3 BIT DEFENITIONS;: X3.MEC= 177400 ;TS11/TSV05/TU80 MICRO-DIAG ERROR CODE.3 X3.EAD= 177400 ;TK25 - ERROR ADDRESS (HI BYTE). ' X3.LMX= 200 ;* TAPE LIMIT EXCEEDED.T%  ;** NOT USED - TK25/TSV05/TU80.*% X3.OPI= 100 ;OPERATION INCOMPLETE %X3.REV= 40 ;TAPE MOVED BACKWARDS.V+X3.CRF= 20 ;* CAPSTAN RESPONSE FAILURE.2X3.TCH= 20 ;* TK25 - NO TACHOMETER INDICATION.! ;** NOT USED - TSV05, TU80. 0X3.DCK= 10 ;TS11/TSV05/TU80 - DENSITY CHECK.,X3.STP= 10 ;TK25 - SERVO STRIPE FAILURE.)X3.NOI= 4 ;* NOISE - COULD NOT ERASE. %X3.LXS= 2 ;* REACHED TAPE LIMITS.0' ;** NOT USED - TK25, TSV05, TU80.3X3.RIB= 1 ;REVERSE INTO BOTD .PAGE;O; TSSR BIT DEFINITIONS;3$SR.SC= 100000 ;SPECIAL CONDITION(SR.UPE= 40000 ;* UNIBUS PARITY ERROR,SR.SPE= 20000 ;* SERIAL BUS PARITY ERROR$  ;* NOT USED - TK25/TSV05/TU80.0!SR.RMR= 10000 ;REGISTER MODIFICATION REFUSED%"SR.NXM= 4000 ;NON-EXISTENT MEMORY.%#SR.NBA= 2000 ;NEED BUFFER ADDRESSA$SR.A17= 00|rwIwtöt÷tø tþfDATA1000 ;BA 17N%SR.A16= 400 ;BA 16!&SR.SSR= 200 ;SUB-SYSTEM READYI#'SR.OFL= 100 ;DEVICE IS OFF LINE5)(SR.FC1= 40 ;* FATAL ERROR CLASS BIT 1))SR.FC0= 20 ;* FATAL ERROR CLASS BIT 0* ;* NOT USED - TK25.S'+SR.TC2= 10 ;TERMINATION CLASS BIT 2I&,SR.TC1= 4 ;TERMINATION CLASS BIT 1&-SR.TC0= 2 ;TERMINATION CLASS BIT 09.SR.TCN= SR.TC2!SR.TC1!SR.TC0 ;TERMINATION CLASS NUMBER.I/012;NH3; TSDBX REGISTER - BYTE REGISTER AT THE TSSR HIGH BYTE; Q22 BUS ONLY.4;A5<6DBX.BT= 20 ;BOOT TAPE - TSDBX DBX.BT '1' AND TSSR SSR '1':47 ; REWINDS THE TAPE TO BOT, SKIPS THE FIRST TAPE38 ; RECORD AND READS THE FIRST 512. BYTES OF THE0;9 ; SECOND TAPE RECORD TO MEMORY STARTING AT LOCATION 0.:-; ; TSSR SSR REMAINS CLEARED UNTIL THE BOOT 6< ; SEQUENCE HAS COMPLETED OR A DEVICE ERROR OCCURS.= .PAGE>;R/?; COMMAND PACKET HEADER WORD - BIT DEFENITIONB@;A#BCM.ACK= 100000 ;ACKNOWLEDGE BITY%CCM.CVC= 40000 ;CLEAR VOLUME CHECKBDCM.OPP= 20000 ;OPPOSITE BIT;ECM.SWB= 10000 ;SWAP BYTESD#FCM.MOD= 7400 ;COMMAND MODE BITSP!GCM.RTY= 1000 ;RETRY MODE BIT. ,HCM.RVS= 400 ;REVERSE DIRECTION MODE BIT. ICM.IE= 200 ;INTERRUPT ENABLE!JCM.COD= 37 ;COMMAND CODE BITS%KCM.LOW= 3 ;LOW HALF OF CODE BITS.E0LCM.NML= CM.IE!CM.ACK ;NORMAL COMBO. OF FLAGS.MN;RO; COMMAND PACKET HEADER WORDP;TQ+RCC.RDN= 0001!CM.NML ;READ NEXT (FORWARD)K/SCC.RDP= 0401!CM.NML ;READ PREVIOUS (REVERSE)C<TCC.RRP= 1001!CM.NML ;REREAD PREVIOUS (SPACE REV,READ FWD)9UCC.RRN= 1401!CM.NML ;REREAD NEXT (SPACE FWD, READ REV)P-VCC.WRC= 0004!CM.NML ;WRITE CHARACTERISTICS "WCC.WRD= 0005!CM.NML ;WRITE DATA?XCC.WDR= 1005!CM.NML ;* WRITE RETRY (BCKSPC, ERASE, RE-WRITE)T.YCC.WSM= 0006!CM.NML ;WRITE SUBSYSTEM MEMORY-ZCC.SRF= 0010!CM.NML ;SPACE RECORDS FORWARD-[CC.SRR= 0410!CM.NML ;SPACE RECORDS REVERSE/\CC.STF= 1010!CM.NML ;SKIP TAPE MARKS FORWARD/]CC.STR= 1410!CM.NML ;SKIP TAPE MARKS REVERSE$^CC.RWD= 2010!CM.NML!CM.CVC ;REWIND'_CC.WTM= 0011!CM.NML ;WRITE TAPE MARKM`CC.ERS= 0411!CM.NML ;ERASED=aCC.WTR= 1011!CM.NML ;- WTMK RETRY (BCKSPC, ERASE, RE-WTMK)D/bCC.UNL= 0412!CM.NML!CM.CVC ;REWIND AND UNLOAD (cCC.DRI= 0013!CM.NML ;DRIVE INITIALIZE,dCC.GST= 0017!CM.NML ;GET STATUS IMMEDIATE4eCC.MST=CC.GST!CM.CVC ;MOUNT & SET CHARACTERISTICSf .PAGEg;.@h; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER)i;Oj.kCSTAT: .BLKW T$$S11 ;CONTROLLER STATUS WORD+lCMDPTR: .BLKW T$$S11 ; > COMMAND PACKET.4mINTADD: .BLKW T$$S11 ; > I/O INTERRUPT SERVICING.=nSSRRTY: .BLKW T$$S11 ; > I/O RESUMPTION - SUBSYSTEM READY. o:pTMOCNT: .BLKW T$$S11 ;SAVED I/O TIMEOUT, (UNIT OFFLINE)*qRTYINT: .BLKW T$$S11 ;SAVED INTADD(R3),ArCMDSAV: .BLKW T$$S11 ;SAVED COMMAND - WHILE REQUESTING STATUS.Cs?tRTTBL: .BLKW T$$S11 ;RTRY CNT: +0-RTRYS LEFT, +1-TOTAL RTRYSR?uRCVCNT: .BLKW T$$S11 ;RECOVERY COUNT - RECOVERY RTRYS (LEFT).v$w;CLEAN TAPE - PARAMETER SAVE AREA:(xCMDPK1: .BLKW T$$S11 ;CMD PKT WRD #1,(yCMDPK2: .BLKW T$$S11 ;CMD PKT WRD #2,(zCLNRTN: .BLKW T$$S11 ;RCVRY INTRPT @.7{CLNCNT= SPCNT ;TAPE CLN CNT - INIT REV/FWD SPC CNT.S5|CLNED= SPACED ;CURRENT (CLEAN) BLOCK SPACE COUNT. }&~SPCNT: .BLKW T$$S11 ;SPACING COUNT.0SPACED: .BLKW T$$S11 ;SPACED (VIA TMK) COUNT.@€PRVDIR: .BLKW T$$S11 ;LO BYTE - PREV TAPE DIR:EQ/FWD,NEQ/REV.5� ;HI BYTE - TAPE DIR (WRT,WTMK,RD):EQ/FWD,NEQ/REVY‚.ƒDEVTYP: .BLKW T$$S11 ;LO BYTE - NE IF TK25,#„ ;HI BYTE - NE IF TSV05/TSU05.T…3†WRTOVR= 32. ; REWRITE WRITE/WTMK UP TO 64 TIMESR*‡ ; FOR MAX EXTENDED IBG UP TO 20 FT.(ˆRDOVR= 40. ; REREAD UP TO 40 TIMES --‰REREAD= 8. ; CLEAN TAPE AFTER 8 REREADS.KŠ(‹RDTMO= 12. ; READ TIMEOUT - 12. SEC.Œ2�CLNTMO= 2 ; CLEAN TAPE SUBCYCLE TIME - 2 SEC.3ŽCLNCYC= 15. ; CLEAN TAPE - UP TO 15 SUBCYCLES.D�,�VC$MS = 0 ; Vectored MS driver. ;CS020� .PAGE ;CS020� ;CS020K%�; EXECUTIVE VECTOR AREA ;CS020 � ;CS020V>�EX00|zwðvt´cÚµcÛ¶c�·c›’EVEC: .WORD 0 ; IF NE - vectors already filled in. ;CS020� ;CS020M,�DVERR: .WORD $DVERR ; Vectored ;CS020)�DVMSG: .WORD $DVMSG ; Exec ;CS020 -�FORK: .WORD $FORK ; references ;CS020 #�GTPKT: .WORD $GTPKT ; ;CS020T$�HFMSK: .WORD $HFMSK ; ;CS020+�IOALT: .WORD $IOALT ; (filled ;CS020 ,�EIODON: .WORD $IODON ; in by ;CS020,�SCMOF: .WORD $SCMOF ; MSDRV ;CS020,�CRPAS: .WORD $CRPAS ; code ;CS0200�DVTMO: .WORD $DVTMO ; at MSKRB) ;CS020&�MPUBM: .WORD $MPUBM ; ;CS020#�STMAP: .WORD $STMAP ; ;CS020O� ;CS020d!�SFRK: .WORD S.FRK ; ;CS020 !�SPKT: .WORD S.PKT ; ;CS020 !�SCTM: .WORD S.CTM ; ;CS020!�SITM: .WORD S.ITM ; ;CS020!�SSTS: .WORD S.STS ; ;CS0200!�SST2: .WORD S.ST2 ; ;CS020 !�SKRB: .WORD S.KRB ; ;CS020;� ;CS0200'�EXEVCL=<<<.-EXEVEC>/2>-1> ;CS020C� ;CS020D� ;CS020 1�; Driver SCB reference patch table. ;CS020 �; ;CS020M�; The driver uses this patch table when it is called for the first ;CS020;K�; controller on-line request. The driver initially contains SCB ;CS020 E�; offset references of the form S.Vzzz located at Rzzzx. ;CS020M�; The contents of these references are replaced at driver assembly ;CS020BP�; time with the value -1 (promote crashes if the vectoring isn't comple;CS020� ;CS020 �S.VCSR = 177777 ;CS020 �S.VOWN = 177777 ;CS020 �S.VFRK = 177777 ;CS020�S.VPKT = 177777 ;CS020a�S.VCTM = 177777 ;CS020s�S.VITM = 177777 ;CS020n�S.VSTS = 177777 ;CS020c�S.VST2 = 177777 ;CS020 �S.VKRB = 177777 ;CS020a�K.VOWN = 177777 ;CS020e�K.VCON = 177777 ;CS020 � ;CS020aK�; After the driver is LOAded and called for the first controller ;CS020nK�; on-line request, the driver replaces these SCB references with ;CS020N�; the vectored equivalents from the driver's Executive vector area. ;CS020�; ;CS020�; Example: ;CS0202�; ;CS0204�; Previous code: MOV S.ITM(R4),S.CTM(R4) ;CS020�; ;CS0207�; Vectored code: MOV S.VITM(R4),S.VCTM(R4) ;CS02015�; RITMx=.-4 ; xth occurence of S.VITM and ;CS020=�; RCTMy=.-2 ; yth occurence of S.VCTM in this drive;CS020f�; ;CS020;�; For this vectored code, this table contains: ;CS020e!�; .WORD RITMx,S.ITM ;CS020 !�; .WORD RCTMy,S.CTM ;CS020r�; ;CS020� ;CS020&�SCBPAT: .WORD RPTK1,SPKT ;CS020� .WORD RPKT2,SPKT ;CS020P� .WORD RPKT3,SPKT ;CS020(� .WORD RCTM1,SCTM ;CS020� .WORD RCTM2,SCTM ;CS0204� .WORD RCTM3,SCTM ;CS020x� .WORD RCTM4,SCTM ;CS020d� .WORD RCTM5,SCTM ;CS020 � .WORD RITM1,SITM ;CS020;� .WORD RITM2,SITM ;CS020F� .WORD RITM3,SITM ;CS020 � .WORD RITM4,SITM ;CS020 � .WORD RITM5,SITM ;CS020R� .WORD RITM6,SITM ;CS020 � .WORD RITM7,SITM ;CS020� .WORD RITM8,SITM ;CS0200� .WORD RITM9,SITM ;CS0202 � .WORD RITM10,SITM ;CS020 � .WORD RITM11,SITM ;CS020 � .WORD RITM12,SITM ;CS020� .WORD RSTS1,SSTS ;CS0202� .WORD RSTS2,SSTS ;CS0202� .WORD RSTS3,SSTS ;CS0202� .WORD RSTS4,SSTS ;CS0202� .WORD RSTS5,SSTS ;CS0202� .WORD RSTS6,SSTS ;CS0202� .WORD RSTS7,SSTS ;CS0202� .WORD RSTS8,SSTS ;CS0202� .WORD RSTS9,SSTS ;CS0202 � .WORD RSTS10,SSTS ;CS020 � .WORD RSTS11,SSTS ;CS020 � .WORD RSTS12,SSTS ;CS020� .WORD RST21,SST2 ;CS0200� .WORD RKRB1,SKRB ;CS0200-� .WORD 0 ; Patch table terminator. ;CS020R� ;CS0202� .PAGE‘;T’; DRIVER DISPATCH TABLEO“;T”B” DDT$ MS,T$$S11,,,,NEW ;Generate driver dispatch table. ;CS020– ;**-1—;O#˜; TERMINATION CODE DISPATCH TABLER™;Sš›ERJTBL: .IRPC X,<01234567>œ .WORD TCL'X'ER� .ENDMž00|‚wIwtöt÷tø tþfDATAŸ;  ; VALID FUNCTION TABLE¡;S¢,£ .MACRO FUNCT FCN, HCC, EXT, TMO, INT, ADR¤¥ .WORD IO.'FCN ;QIO REQUEST.O$¦ .WORD CC.'HCC ;HARDWARE COMMAND.&§ .BYTE EXT ;I/O TIMEOUT ITERATIONS.%¨ .BYTE TMO ;I/O TIMEOUT - SECONDS. 1© .WORD I'INT ;REQUEST INTERRUPT ENDUP ROUTINE.L0ª .WORD P'ADR ;REQUEST PRE-PROCESSING ROUTINE.« .ENDM FUNCT¬7­VFTBL: FUNCT RLB,RDN,1,RDTMO,OCOM,READ ;READ FORWARDD6® FUNCT WLB,WRD,1,12.,OCOM,WRITE ;WRITE LOGICAL BLOCK7¯ FUNCT RLV,RDP,1,RDTMO,OCOM,READ ;READ REVERSEN:° FUNCT EOF,WTM, 1,4,ODON,WRTMK ;WRITE TAPE MARK,± FUNCT RWD,RWD,255.,2,RWDU,REWND ; REWIND<² FUNCT RWU,UNL, 1,2,RWDU,UNLOD ;REWIND AND UNLOAD:² FUNCT SPB,SRF,250.,6,SPCB,SPACE ; SPACE BLOCKS ;CS0199² FUNCT SPF,STF,250.,6,SPCF,SPACE ; SPACE FILES ;CS019 ;µ FUNCT STC,MST,2.,2.,STAT,SET ;SET CHARACTERISTICS ;**-2:8¶ FUNCT SEC,GST,2.,2.,STAT,GSTAT ;SENSE CHARACTERISTICS<· FUNCT SMO,MST,2.,2.,MOUNT,SET ;MOUNT/SET CHARACTERISTICS-¸ FUNCT ERS,ERS,1,12.,ODON,WRTMK ;ERASE TAPEF ¹EVFTBL:Mº»;O¼; MESSAGE HEADER TABLE½;K¾2¿MESSAG: .IRP X,À .WORD MC.'XÁ .ENDM .PAGEÃÄ;+-Å; **-MSINI- INITIATE MAG TAPE I/O OPERATIONPÆ;LDÇ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/OCÈ; REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TOFGÉ; PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED CONTROLLER,@Ê; IS NOT BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O>Ë; REQUEST. ELSE A RETURN TO THE CALLER IS EXECUTED. IF THEAÌ; DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPERATION IS>8Í; INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.Î;N Ï; INPUTS:PÐ; >Ñ; R5 = ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.Ò;C Ó; OUTPUTS:Ô;>Õ; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST<Ö; IS WAITING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED'×; AND THE I/O OPERATION IS INITIATED.AØ;-Ù;+=Ú; THE FOLLOWING REGISTERS ARE RETURNED BY THE GTPKT$ MACRO:CÛ; (Ü; R1=ADDRESS OF THE I/O REQUEST PACKET.Ý; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCBÞ; R3=CONTROLLER INDEXT*ß; R4=ADDRESS OF THE STATUS CONTROL BLOCK;à; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATEDOá;Nâ; I/O REQUEST PACKET FORMAT:ã;(ä;I.LNK WD. 00 = I/O QUEUE THREAD WORD..å;I.PRI WD. 01 = REQUEST PRIORITY (LOW BYTE).0æ;I.EFN WD. 01 = EVENT FLAG NUMBER (HIGH BYTE).;ç;I.TCB WD. 02 = ADDRESS OF THE TCB OF THE REQUESTOR TASK.TCè;I.LN2 WD. 03 = POINTER TO 2ND LUN WORD IN REQUESTOR TASK HEADER./Ié;I.UCB WD. 04 = CONTENTS OF 1ST LUN WORD IN REQUESTOR TASK HEADER (UCB)N@ê;I.FCN WD. 05 = I/O FUNCTION CODE (IO.RLB/IO.RWD/IO.SPB/ETC.).7ë;I.IOSB WD. 06 = VIRTUAL ADDRESS OF I/O STATUS BLOCK.7ì;IOSB+2 WD. 07 = RELOCATION BIAS OF I/O STATUS BLOCK. Bí;IOSB+4 WD. 10 = I/O STATUS BLOCK ADDRESS (DISPLACEMENT+140000).9î;I.AST WD. 11 = VIRTUAL ADDRESS OF AST SERVICE ROUTINE.Iï;Wð; <ñ; READ/WRITE LOGICAL FUNCTION DEPENDENT I/O PACKET FORMAT:ò;NIó;I.PRM WD. 12 = HIGH 2 BITS (BITS 4 & 5) OF 18 BIT DATA BUFFER ADDRESS.O<ô;PRM+2 WD. 13 = LOW 16 BITS OF 18 BIT DATA BUFFER ADDRESS.4õ;PRM+4 WD. 14 = NUMBER OF BYTES TO BE TRANSFERRED.ö;PRM+6 WD. 15 = NOT USED.E÷;PRM+10 WD. 16 = NOT USED.ø;PRM+12 WD. 17 = NOT USED.Hù;PRM+14 WD. 20 = RELOCATION BIAS OF DIAGNOSTIC REGISTER BLOCK ADDRESS.Cú;PRM+16 WD. 21 = DIAG. REG. BUFFER ADDRESS (DISPLACEMENT+140000).Uû;Iü;WAý; BLOCK AND FILE SPACING FUNCTIONS DEPENDENT I/O PACKET FORMAT::þ;NFÿ;I.PRM WD. 12 = SPACING COUNT (POSITIVE=FORWARD, NEGATIVE=BACKWARD).;PRM+2 WD. 13 = NOT USED.6;PRM+4 WD. 14 = NOT USED.D;PRM+6 WD. 15 = NOT USED.B;PRM+10 WD. 16 = NOT USED.H;PRM+12 WD. 17 = RELOCATION BIAS OF DIAGNOSTIC REGISTER BLOCK ADDRESS.C;PRM+14 WD. 20 = DIAG. REG. BUFFER ADDRESS (DISPLACEMENT+140000).G;PRM+16 WD. 21 = NOT USED.; I; (MOUNT AND) SET CHARACTERISTICS FUNCTION DEPENDENT I/O PACKET FORMAT.C: ; FOR SENSE CHARACTERISTIC00|Šwðvt´cÚµcÛ¶c�·c›’S, I.PRM (WD. 12) IS NOT USED: ;+ ;I.PRM WD. 12 = NEW CHARACTERISTICS WORD.W ;PRM+2 WD. 13 = NOT USED.P ;PRM+4 WD. 14 = NOT USED.P;PRM+6 WD. 15 = NOT USED.P;PRM+10 WD. 16 = NOT USED.;PRM+12 WD. 17 = NOT USED.;PRM+14 WD. 20 = NOT USED.;PRM+16 WD. 21 = NOT USED.;SD; WREOF, REWIND, AND UNLOAD FUNCTIONS DEPENDENT I/O PACKET FORMAT:;;I.PRM WD. 12 = NOT USED.;PRM+2 WD. 13 = NOT USED.C;PRM+4 WD. 14 = NOT USED.I;PRM+6 WD. 15 = NOT USED.E;PRM+10 WD. 16 = NOT USED.H;PRM+12 WD. 17 = RELOCATION BIAS OF DIAGNOSTIC REGISTER BLOCK ADDRESS.C;PRM+14 WD. 20 = DIAG. REG. BUFFER ADDRESS (DISPLACEMENT+140000)..;PRM+16 WD. 21 = NOT USED.;-9 MSINI: GTPKT$ MS,T$$S11 ;GET NEXT I/O PACKET TO PROCESST(! CLR CSTAT(R3) ;CLEAR CONTROLLER FLAGS)" CLR RCVCNT(R3) ;NOT IN ERROR RECOVERY.E+# CLRB PRVDIR+1(R3) ;ASSUME FWD DIRECTION..$ CLR R0 ;LABELLED!% BITB #US.LAB,U.STS(R5) ; TAPE?W& BNE 20$ ;IF NE, YES.4' BIS #CH.ESS!CH.ENB,R0 ;STOP TMK/TMK .OR. BOT/TMK.'(20$: MOV CMDPTR(R3),R2 ;CMDPTR SETUP?G) BEQ GCR ;IF EQ, NO.R,* CMP R0,CHRWD4(R2) ;CHAR PCKT PER REQUEST?++ BNE GCR ;IF NE, CHANGE CHARACTERISTICS.1>,30$: BIT #SR.NBA,@S.CSR(R4) ;COMMUNICATING WITH TAPE SYSTEM?- BNE GCR ;IF NE, NO.R;-ILDBA: MOV S.VPKT(R4),R1 ;RELOAD PACKET POINTER. ;CS020 - RPTK1=.-2 ;CS020D7/ MOV #VFTBL,R2 ;POINT AT VALID FUNCTIONS TABLE ;**-120 MOV I.FCN(R1),R0 ;GET FUNCTION CODE FROM PACKET+1 BIT #IQ.X,R0 ;ERROR RECOVERY PROHIBITED?K2 BEQ 50$ ;IF EQ NOM-3 BIS #CS.NER,CSTAT(R3) ;CORRESPONDING FLAGI+4 BIC #IQ.X,R0 ;AND CLEAR BIT FOR COMPARE.E1550$: BITB #IQ.UMD,R0 ;DIAGNOSTIC FUNCTION CALL?I6 BEQ 60$ ;IF EQ NOA/7 BIS #CS.UMD,CSTAT(R3) ;COPY DIAGNOSTIC FLAGB/8 BIC #IQ.UMD,R0 ;CLEAR BIT FOR FUNCTION CHECK;*960$: CMP R0,(R2)+ ;FUNCTION CODES MATCH?: BEQ 70$ ;IF EQ YES); ADD #10,R2 ;POINT TO NEXT TABLE ENTRYE < CMP #EVFTBL,R2 ;END OF TABLE?= BNE 60$ ;IF NE NOK3> MOV #IE.IFC&377,R0 ;SET UP ILLEGAL FUNCTION CODEB? BR ALT ;GO TO EXIT@+A70$: MOV (R2)+,R1 ;R1 - I/O COMMAND CODE.C=A MOVB (R2)+,S.VSTS(R4) ;SET EXTENDED TIMEOUT VALUE ;CS020;A RSTS1=.-2 ;CS020<A MOVB (R2)+,S.VITM(R4) ;SET INITIAL TIMEOUT VALUE ;CS020A RITM1=.-2 ;CS020C6D MOV (R2)+,INTADD(R3);STORE INTERRUPT ADDRESS ;**-27E CALLR @(R2) ;GO TO PRE-PROCESSING FOR THIS FUNCTION;FG;++H; **-GCR-GENERATE CHARACTERISTICS ROUTINEAI;/J; SETUP HARDWARE/SOFTWARE COMMUNICATIONS .OR.T2K; MODIFY DEVICE LEOV DETECTION CHARACTERISTICS.L;-M0MGCR: MOVB #2,S.VITM(R4) ;SET TIMEOUT ;CS020M RITM2=.-2 ;CS020 5O BIS #CS.LBA,CSTAT(R3) ;SET WRITE CHAR FLAG ;**-1P MOV R5,R1 ;R1 >)$Q ADD #U.VCB+4,R1 ; DEVICE PKT AREA"R BIC #3,R1 ; ON MOD4 BOUNDARY.S CMP R1,R2 ;PKT AREA SETUP?T BEQ 10$ ;IF EQ, YES.U MOV R1,R2 ;R2 >O V MOV R1,CMDPTR(R3) ; PKT AREA.$W10$: ADD #MSGHDR,R1 ;R1 > MSG PKT.X; SETUP CHARACTERISTIC PACKETA1X CLR -(SP) ;CLEAR HI-ORD ADDRESS AREA. ;CS018E*Y MOV R1,-(SP) ;PUSH ADDRESS TO TRANSLATE2Z CALL TRPHYS ;TRANSLATE TO PHYSICAL (IF NEEDED)=[ MOV (SP)+,CHRWD1(R2) ;STORE CHARACTERISTICS PACKET ADDRESS 6[ MOV (SP)+,CHRWD2(R2) ; AND HI-ORD ADDRESS. ;CS0183] MOV #14.,CHRWD3(R2) ;MSG BUF - 14. WRDS, ;**-1D"^ MOV R0,CHRWD4(R2) ;DEVICE CHAR.(_ ADD #CHRWD1-MSGHDR,R1 ;R1 > CHAR PKT.`; SETUP COMMAND PACKET&a MOV #CC.WRC,CMDHDR(R2) ;WRITE CHAR,1a CLR -(SP) ;CLEAR HI-ORD ADDRESS AREA. ;CS018C*b MOV R1,-(SP) ;PUSH ADDRESS TO TRANSLATE2c CALL TRPHYS ;TRANSLATE TO PHYSICAL (IF NEEDED)<d MOV (SP)+,CMDB2(R2) ;STORE CHARACTERISTICS PACKET ADDRESS5d MOV (SP)+,CMDB3(R2) ; AND HI-ORD ADDRESS. ;CS018V+f MOV #10,CMDB4(R2) ;4 WORD TRFR. ;**-10g JMP INITIO ;START I/O;h .PAGEi;+/j; PRE-PROCESSING ROUTINES FOR I/O OPERATIONSk;D l; INPUTS:Dm; R1 = HARDWARE FUNCTION CODEOn; R3 = CONTROLLER INDEXCo; R4 = SCB ADDRESSp; R5 = UCB ADDRESSq;- r .ENABL LSBAs;St; WRITE DATAu; v5wPWRITE: CMP U.CNT(R500|’wIwtöt÷tø tþfDATA),#14. ;ENOUGH BYTES FOR WRITE?Hx BHIS 75$ ;IF HIS YES"y TST U.CNT(R5) ;IS IT MAX COUNT?z BEQ 75$ ;IF EQ YES2{ MOV #IE.SPC&377,R0 ;SET UP PARAMETER ERROR CODE| BR ALT ;GO TO EXIT}~;.; WRITE TAPE MARKI€;;�*‚PWRTMK: CLR U.CNT(R5) ;INSURE COUNT IS 04ƒ75$: MOV #WRTOVR*2,RTTBL(R3) ;SETUP ERROR RECOVERY,„ MOVB RTTBL(R3),RTTBL+1(R3) ; RETRY COUNT.4… BIT #M.SWL,U.CW2(R5) ;(USER) DISABLED WRITING?† BEQ PIOCOM ;IF EQ NO3‡ MOV #IE.WLK&377,R0 ;SET UP WRITE LOCK ERROR CODE,ˆ BR ALT ;GO TO EXIT‰Š;‹; READ FWD/REVŒ;�/ŽPRDREV: INCB PRVDIR+1(R3) ;REVERSE DIRECTION.Q3�PREAD: MOV #RDOVR,RTTBL(R3) ;SETUP ERROR RECOVERYO,� MOVB RTTBL(R3),RTTBL+1(R3) ; RETRY COUNT.‘ BR PIOCOM ; . . CONT.W’“; ”; SPACE BLOCKS AND SPACE FILES•;V–4—PSPACE: MOV #IS.SUC&377,R0 ;ASSUME 0 SPACING COUNT6˜ MOV U.BUF(R5),U.CNT(R5) ;PUT SPACING COUNT IN PLACE4™ MOV U.BUF(R5),SPCNT(R3) ;REMEMBER SPACING COUNT.*š BEQ ALT ;IF EQ NO I/O NEEDED (U.BUF=0)1› BMI 90$ ;IF MI SPACE REVERSE (U.BUF=NEGATIVE)E!œ BIT #M.AEOV,U.CW2(R5) ;AT EOV?B� BEQ 80$ ;IF EQ, NO.R0ž MOV #IE.EOV&377,R0 ;SET UP END OF VOLUME CODE4žALT: CALL @IOALT ;TERMINATE THIS REQUEST ;CS0202  JMP MSINI ; AND SERVICE OTHER REQUESTS. ;**-1¡6¢80$: BITB #US.LAB,U.STS(R5) ;SPACING LABELLED TAPE?£ BNE 100$ ;IF NE, YES.,¤ BIT #M.BOT,U.CW2(R5) ;SPACING FROM BOT?¥ BNE 100$ ;IF NE, YES.(¦ CMP #CC.SRF,R1 ;SPACING RECORDS FWD?§ BEQ 100$ ;IF EQ, YES.7¨ MOV #^C<0>,U.CNT(R5) ;SETUP MAX BLK SPACING COUNT,E-© CLR SPACED(R3) ; NO TMKS SPACED YET AND$0ª BIC #CC.STF-CC.SRF,R1 ; SPACING VIA BLOCKS.:« BIS #CS.SFB,CSTAT(R3) ;SPACING FILES VIA SPACE BLOCKS. ¬ BR 100$­;®90$: BIS #CC.SRR-CC.SRF,R1 ;MAKE CMND SPACE/SKIP REVERSE %¯ NEG U.CNT(R5) ;MAKE COUNT POSITIVEPC°100$: BIS #CS.RSP,CSTAT(R3) ;SET "REWIND/SPACE IN PROGRESS" FLAGF ± BR PIOCOM² ³ .DSABL LSB ´;/µ; (MOUNT AND) SET CHARACTERISTICS, GET STATUS1¶; ·8¸PSET: BIC #USRBTS,U.CW2(R5) ;CLEAR USER SETTABLE BITS6¹ BIC #^C,U.BUF(R5) ;REMOVE NON-SETABLE BITS.5º BIS U.BUF(R5),U.CW2(R5) ;UPDATE USER SETABLE BITS.B»¼;B6½; GET STATUS (SENSE (MOUNT AND) SET CHARACTERISTICS)¾;¿5ÀPGSTAT: BIS #CS.GST,CSTAT(R3) ;SET GET STATUS FLAG. Á BR PUNLOD ; . . CONT.UÂÃ;VÄ; REWIND TAPECÅ;,Æ7ÇPREWND: BIS #M.RWD,U.CW2(R5);SET TAPE REWINDING FLAG.M>È BIS #CS.RSP,CSTAT(R3) ;SET "REWIND/SPACE IN PROGRESS" FLAGÉÊ;UË; UNLOAD TAPESÌ;IÍ*ÎPUNLOD: CLR U.CNT(R5) ;INSURE COUNT IS 0"Ï BR PIOCM1 ;PREPROCESS REQUEST.Ð .PAGEÑ;T(Ò; I/O OPERATION COMMON PRE-PROCESSINGÓ;AÔ.ÕPIOCOM: MOV #IE.ABO&377,R0 ;ABORT REQUEST?/Ö BITB #US.PWF,U.STS(R5) ;PWFLD INDICATOR SET? × BNE ALT ;IF NE, YES.1ØPIOCM1: MOV CMDPTR(R3),R2 ;R2 > COMMAND BUFFER..Ù MOV R1,(R2)+ ;LOAD COMMAND HEADER IN BUFFER0Ú BIC #^C,R1 ;ISOLATE COMMAND CODE BITS(Û CMP R1,#CC.GST&CM.COD ;SENSE REQUEST?Ü BEQ 110$ ;IF EQ, YES.D>Ý BIC #M.PEOV!M.AEOV,U.CW2(R5) ;M.PEOV/M.AEOV PER END STATUS.7Þ110$: CMP R1,#CC.SRF&CM.COD ;FILL IN COMPLETE PACKET?Oß BHIS 130$ ;IF HIS NOà; DATA TRANSFER REQUEST .á BIT #M.SWAP,U.CW2(R5) ;SWAP BYTES ON DATA?â BEQ 120$ ;IF EQ NO8ã BIS #CM.SWB,-2(R2) ;SET SWAP BITS BYTE IN HEADER WORD,ä120$: BIT #DV.EXT,U.CW1(R5) ;22 BIT Q BUS?å BNE 125$ ;IF NE, YES.I/å CALL @STMAP ;SET UP UNIBUS MAPPING ;CS020C!ç MOV R2,-(SP) ;SAVE R2 ;**-1;0ç CALL @MPUBM ;MAP UNIBUS TO TRANSFER ;CS020$é MOV (SP)+,R2 ;RESTORE R2 ;**-16ê125$: MOV U.BUF+2(R5),(R2)+ ;SET UP LO 16 ADDR BITS.'ë BIT #DV.EXT,U.CW1(R5) ;22 BIT Q BUS? ì BEQ 127$ ;IF EQ, UNIBUS.$í MOVB U.BUF+1(R5),(R2)+ ;SET UP HIî CLRB (R2)+ ; 6 ADDR BITS. ï BR 130$ ; . . CONT.Sð3ñ127$: MOV U.BUF(R5),(R2) ;SET UP HI 2 ADDR BITSWò ASR (R2) ;AND MOVE FROM1ó ASR (R2) ;BITS 4 AND 5ô ASR (R2) ;TOõ ASR (R2)+ ;BITS 0 AND 1M7ö130$: MOV U.CNT(R5),(R2) ;LOAD BYTE/RECORD/FILE COUNTU÷ .PAGEø;+ù; INITIATE I/O OPE00|šwðvt´cÚµcÛ¶c�·c›’RATIONú;R û; INPUTS:ü; ý; COMMAND PACKET SETUP.Uþ;1ÿ; R3 = CONTROLLER INDEXT; R4 = SCB ADDRESS; R5 = UCB ADDRESS;->INITIO: MOVB S.VITM(R4),S.VCTM(R4) ;START THE TIMER ;CS020 RITM3=.-4 ;CS020  RCTM1=.-2 ;CS020.) MTPS #PR5 ;INHIBIT INTERRUPTS ;**-1A+ MOV S.CSR(R4),R2 ;;;RETREIVE CSR ADDRESS4! TSTB (R2) ;;;SUBSYSTEM READY?2 BPL 140$ ;;;IF PL NO1 CLR -(SP) ;CLEAR HI-ORD ADDRESS AREA. ;CS0184  MOV CMDPTR(R3),-(SP) ;;;PUSH ADDRESS TO TRANSLATE4  CALL TRPHYS ;;;TRANSLATE TO PHYSICAL (IF NEEDED)9  MOV (SP)+,R1 ;;; SETUP CMD PKT PHYS @ BITS 15-2 ;CS018A2  BIS (SP)+,R1 ;;; AND BITS 17,16 IN R1. ;CS018+  MOV R1,TSDB(R2) ;;; START I/O. ;CS018 ;  BIS #CS.CIP,CSTAT(R3) ;;;SET COMMAND IN PROGRESS ;**-1H  BR 150$ ;;;EXIT-1140$: MOVB #4,S.VCTM(R4) ;;;SET TIMER ;CS020T RCTM2=.-2 ;CS0205 BIS #CS.WSS,CSTAT(R3) ;;;SET WAITING FLAG ;**-1D0 MOV #INITIO,SSRRTY(R3) ;;;SET RETURN ADDRESS(150$: MTPS #0 ;;;ALLOW INTERRUPTS AND( RETURN ;EXIT WHILE I/O IN PROGRESS. .PAGE;+$; **-MSCAN- CANCEL I/O ENTRY POINT;B.; ACTIVE I/O REQUESTS ARE MARKED FOR ABORT -D; THE I/O REQUEST WILL THEN END NORMALLY AS A RESULT OF INTERRUPTD; SERVICING .OR. END ABNORMALLY VIA THE TIMEOUT (MSOUT:) ROUTINE.;B ; INPUTS:)"; R0 = ACTIVE I/O PACKET ADDRESS; R1 = CURRENT TCB ADDRESS; R3 = CONTROLLER INDEXI ; R4 = SCB ADDRESS!; R5 = UCB ADDRESS";-#6$MSCAN: CMP I.TCB(R0),R1 ;;;IS THIS THE CORRECT TASK?% BNE 10$ ;;;IF NE NO/>& BIS #CS.ABO!CS.NER,CSTAT(R3) ;ABORT REQUEST - NO ERR RCVRY.'10$: RETURN ;;;RETURNR()*;+#+; **-MSPWF- POWERFAIL ENTRY POINTT,; ;-; US.PWF SET TO DISALLOW NORMAL QIO REQUESTS EXCEPT FOR -R/.; IO.RWD, IO.RWU, IO.SMO, IO.SEC AND IO.STC../;BJ0; SUCCESSFUL IO.RWD, IO.RWU, IO.SMO RESET US.PWF AND ALLOW QIO REQUESTS.1; 2; INPUTS:R3; R3 = CONTROLLER INDEXA4; R4 = SCB ADDRESS5; R5 = UCB ADDRESS6;-787MSPWF: BCS 10$ ;IF CS, CONTROLLER POWER FAIL. ;CS02197 BISB #US.PWF,U.STS(R5) ; ELSE, UNIT POWER FAIL ;CS021N'7 ; DISALLOW NORMAL QIO'S. ;CS021'7 BIT #HF.UBM,@HFMSK ;UMRS? ;CS020R&: BNE 10$ ;IF NE - MAPPED @. ;**-2,; BIS #DV.EXT,U.CW1(R5) ;ELSE - PHYSICAL @. <10$: RETURN.= .PAGE>;+!?; **-MSOUT- TIMEOUT ENTRY POINTW@;.EA; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING TERMINATED.CB; IF THE OPERATION WAS DIAGNOSTIC, THE QIO REQUEST IS TERMINATED.DC; TIMEOUTS ARE USUALLY CAUSED BY POWER FAILURE BUT MAY ALSO BE THE@D; RESULT OF HARDWARE CONSIDERATIONS. IN PARTICULAR, A LENGTHY>E; SPACING OPERATION OR A REWIND ON THIS MODEL TAPE DRIVE MAY.F; RESULT IN A TIMEOUT WHICH WILL BE IGNORED.G; H; INPUTS:U I; R0 = LITERAL CONSTANT IE.DNRJ; R2 = CSR ADDRESSK; R3 = CONTROLLER INDEX L; R4 = SCB ADDRESSM; R5 = UCB ADDRESSN;-O P .ENABL LSBO6QMSOUT: BIT #CS.ABO,CSTAT(R3) ;;;BEEN TOLD TO ABORT? R BNE 10$ ;;;IF NE YES - ABORT6S BIT #CS.SER,CSTAT(R3) ;;;'SEL ERR' - UNIT OFFLINE?T BNE 10$ ;;;IF NE, YES.:U BIT #CS.WSS,CSTAT(R3) ;;;WAITING FOR SUB-SYSTEM READY?V BNE 30$ ;;;IF NE YES2W BIT #CS.RSP,CSTAT(R3) ;;;REWIND/SPACE TIMEOUT?X BNE 40$ ;;;IF NE YES6Y BIS #CS.TMO,CSTAT(R3) ;;;FLAG TIMEOUT BEING LOGGED%Z CALL MSDTER ;;;LOG DEVICE TIMEOUTE[10$: MTPS #0 ;LOWER PRIORITY1\ BIT #M.SER,U.CW2(R5);SELECT ERROR IN PROGRESS?U] BNE NORDY ;IF NE YES^MSOUT1: CLR R1 ;CLEAR R1E_ CALLR IODON ;AND EXIT`,a30$: TSTB (R2) ;;;IS THE SUBSYSTEM READY?b BPL 40$ ;;;IF PL NOE7b INCB S.VSTS(R4) ;;;INSURE CONTROLLER IS BUSY ;CS020Eb RSTS2=.-2 ;CS020E6d BIC #CS.WSS,CSTAT(R3) ;;;CLEAR WAITING FLAG ;**-1e MTPS #0 ;;;LOWER PRIORITYB%f CALLR @SSRRTY(R3) ;RETRY OPERATIONE>f40$: DECB S.VSTS(R4) ;;;SUBSYSTEM RECOVERY TIMED OUT? ;CS020f RSTS3=.-2 ;CS020#9h BEQ 10$ ;;;IF EQ YES, RETURN WITH DRIVE NOT READ;**-1I6h MOVB S.VITM(R4),S.VCTM(R4) ;;;START TIMER ;CS020h RITM4=.-4 00|¢wIwtöt÷tø tþfDATA ;CS020Rh RCTM3=.-2 ;CS020?j RETURN ;**-1k l .DSABL LSBRm .PAGEn;+ o; **-NORDY-TAPE UNIT NOT READYp; Bq; ISSUE 'SEL ERR' MESSAGES AT 15 SEC INTERVALS FOR OFFLINE UNITS=r; .OR. END THE REQUEST FOR USER CONTROL PARAMETERS OR ACP. s;T3t; INPUTS: R3 - CNTRL INDX, R4 > SCB, R5 > UCB.Mu;-vDwNORDY: BIT #CS.NER!CS.UMD!CS.ABO,CSTAT(R3) ;USER CNTRL PARAMETERS?x BNE 10$ ;IF NE, YES.y TST U.ACP(R5) ;ACP REQUEST?Tz BEQ 20$ ;IF EQ, NO.6{10$: MOV RTYINT(R3),INTADD(R3) ;INTADD PER REQUEST,(| MOV #IE.DNR&377,R0 ; DRIVE NOT READY"} JMP IODON ; AND END REQUEST.~/20$: CMP #NORD1,INTADD(R3) ;M.SER FIRST TIME?5€ BEQ NORDY0 ;IF EQ, NO.I2�;SAVE CMD HDR WRD .AND. SETUP FOR SENSE REQUEST.$‚ MOV CMDPTR(R3),R2 ;R2 > CMD PKT.1ƒ MOV (R2),CMDSAV(R3) ;SAVE CMD PKT HDR WRD ANDO4„ MOV #CC.GST,(R2) ; SETUP CMD PKT FOR SENSE RQST.;„ MOVB S.VITM(R4),TMOCNT(R3) ;SAVE REQUEST TIMEOUT ;CS020P„ RITM5=.-4 ;CS020EE„ MOVB S.VSTS(R4),TMOCNT+1(R3) ; AND TIMEOUT ITERATION COUNT. ;CS020#„ RSTS4=.-4 ;CS020A7„ MOVB #2,S.VITM(R4) ;SETUP SENSE I/O TIMEOUT. ;CS020O„ RITM6=.-2 ;CS020I8„ MOVB #1,S.VSTS(R4) ;FAKE END OF 15 SEC CYCLE. ;CS020„ RSTS5=.-2 ;CS020?‰ MOV INTADD(R3),RTYINT(R3) ;SAVE REQUEST ENDUP ADDR AND ;**-4V:Š MOV #NORD1,INTADD(R3) ; AND RETURN HERE AFTER SNS RQST.3‹ BIS #CS.SER,CSTAT(R3) ;'SEL ERR' - UNIT OFFLINE. 1‹TIME: DECB S.VSTS(R4) ;END OF 15 SEC? ;CS0202‹ RSTS6=.-2 ;CS020+"� BNE TIMER ;IF NE, NO. ;**-1)Ž MOV #T.NDSE,R0 ;R0='SEL ERR' MSG CODEM7Ž CALL @DVMSG ; AND ISSUE 'SEL ERR' MESSAGE. ;CS020 9Ž MOVB #15.,S.VSTS(R4) ;15 SEC 'SEL ERR' TIMEOUT ;CS020OŽ RSTS7=.-2 ;CS020SBŽTIMER: MOVB #1,S.VCTM(R4) ; CHECKED AT 1 SEC INTERVALS.V ;CS020Ž RCTM4=.-2 ;CS020#’ RETURN ;**-3“9”; RETURN FROM **-NORDY SENSE REQUEST INTRPT SERVICING •;TC–; INPUTS: R2 > CMD PKT, R3 - CNTRL INDX, R4 > SCB, R5 > UCB.S—'˜NORD1: BIT #M.SER,U.CW2(R5) ;OFFLINE?,™ BNE TIME ;IF NE, YES.1š; ONLINE - SETUP CMD PKT AND ISSUE I/O REQUEST.N,› BIC #CS.SER,CSTAT(R3) ;NOT OFFLINE STATE.1œ MOV CMDSAV(R3),(R2) ;RESTORE CMD PKT HDR WRD,6� MOV RTYINT(R3),INTADD(R3) ; INTERRUPT SERVICE ADDR,:� MOVB TMOCNT(R3),S.VITM(R4) ; TIMEOUT COUNT AND ;CS020� RITM7=.-2 ;CS020*C� MOVB TMOCNT+1(R3),S.VSTS(R4) ; TIMEOUT ITERATION COUNT. ;CS020� RSTS8=.-2 ;CS020T< NORDY0: JMP INITIO ;GET STS .OR. RE-ISSUE I/O RQST.;**-2¡ .PAGE¢;+)£; **-$MSINT- SERVICE DEVICE INTERRUPTS. ¤;-¥8¦ INTSE$ MS,PR5,T$$S11 ;;;SAVE REGISTERS & SET PRIORITY1§ BIT #CS.CIP,CSTAT(R4) ;;;COMMAND IN PROGRESS?R¨ BNE 5$ ;;;IF NE YES#© RETURN ;;;NO, IGNORE INTERRUPTU4©5$: CALL @FORK ;;;CREATE A SYSTEM PROCESS ;CS020,« MOV R4,R3 ;COPY CONTROLLER INDEX ;**-1(¬ MOV U.SCB(R5),R4 ;PICK UP SCB ADDRESS%­ MOV CMDPTR(R3),R2 ;R2 > CMD PCKT. 2® MOV @S.CSR(R4),TSSRSV(R2) ;SAVE DEVICE STATUS.*¯ MOV TSSRSV(R2),R1 ;R1 - DEVICE STATUS.° MOV (R2),-(SP) ;(SP) -)± BIC #^C,(SP) ; COMMAND CODE. @²;STATUS/WRITE CHAR DON'T RETAIN PREVIOUS TAPE MARK INDICATION.+³ CMP (SP),#CC.GST&CM.COD ;SENSE REQUEST?;´ BEQ 15$ ;IF EQ, YES.N0µ CMP (SP),#CC.WRC&CM.COD ;WRITE CHAR REQUEST?¶ BEQ 15$ ;IF EQ, YES.M8· BITB #US.LAB,U.STS(R5) ;(NO LEOV FOR) LABELLED TAPE?¸ BNE 8$ ;IF NE, YES.6¹ BIT #X3.REV,XST3(R2) ;(NO LEOV FOR) TAPE MOVED REV?º BNE 8$ ;IF NE, YES..» BIT #X0.LET,XST0(R2) ;HARDWARE DETECT LEOT?¼ BNE 7$ ;IF NE, YES.5½ BIT #M.BOT!M.TMK,U.CW2(R5) ;BOT .OR. TMK PREV I/O?/¾ BEQ 8$ ;IF EQ, NO.V>¿;PEOV IF PREV BOT/TMK .OR. TMK/TMK WITHOUT INTERVENING BLKS.&À BIT #X0.TMK,XST0(R2) ;TMK THIS I/O?Á BEQ 8$ ;IF EQ, NO. & CMP (SP),#CC.RDN&CM.COD ;READ FWD?à BNE 6$ ;IF NE, NO.,)Ä CMP RBPCR(R2),CMDB4(R2) ;DATA ON READ?%Å BEQ 117$ ;IF EQ, NO - TMK/TMK.V,Æ6$: CMP (SP),#CC.SRF&CM.COD ;SPACING FWD?Ç BNE 8$ ;IF NE, NO.BÈ MOV CMDB2(R2),R0 00|ªwðvt´cÚµcÛ¶c�·c›’ ;R0 -"É DEC R0 ; I/O SPACE COUNT-1.1Ê CMP RBPCR(R2),R0 ;SPACED OVER TMK, NO DATA?RË BNE 8$ ;IF NE, NO. 2Ì117$: TSTB PRVDIR(R3) ;TAPE PREVIOUS DIRECTION?Í BNE 8$ ;IF NE, REVERSE.,Î7$: BIS #M.PEOV,U.CW2(R5) ;TAPE PAST LEOV Ï BR 9$ ; AND TMK INDICATION.Ð+Ñ8$: BIT #M.PEOV,U.CW2(R5) ;PREVIOUS PEOV?Ò BNE 10$ ;IF NE, YES.A(Ó BIC #M.TMK,U.CW2(R5) ;ASSUME NOT TMK.*Ô MOV (R2),R0 ;R0 - BIT8:CMND MODE REV,:Õ BIC #CM.NML!^C<777>,R0 ;BIT7-5:PKT FMT, BIT4-0:CMD CODE(Ö CMP #410,R0 ;SPACE REVERSE REQUEST?-× BEQ 10$ ;IF EQ, YES - NO TMK INDICATION.NØ BIT #X0.TMK,XST0(R2) ;TMK?Ù BEQ 10$ ;IF EQ, NO.'Ú9$: BIS #M.TMK,U.CW2(R5) ; ELSE, TMK. 7Û10$: CLRB PRVDIR(R3) ;ASSUME TAPE FORWARD DIRECTION.S+Ü BIT #X3.REV,XST3(R2) ;FORWARD DIRECTION?Ý BEQ 15$ ;IF EQ, YES. /Þ INCB PRVDIR(R3) ; ELSE - REVERSE DIRECTION.B#ß15$: TST (SP)+ ;MAINTAIN STACK.0à BIC #NEWBTS,U.CW2(R5) ;STATUS TO BE UPDATED.'á BIT #X0.PED,XST0(R2) ;1600 BPI MODE?-â BEQ 20$ ;IF EQ, NO.3ã BIS #M.1600,U.CW2(R5) ; ELSE 1600 BPI (PE) MODE.-!ä20$: BIT #X0.BOT,XST0(R2) ;BOT?Må BEQ 30$ ;IF EQ, NO.#æ BIS #M.BOT,U.CW2(R5) ; ELSE BOT.C!ç30$: BIT #X0.EOT,XST0(R2) ;EOT?Rè BEQ 50$ ;IF EQ, NO.#é BIS #M.EOT,U.CW2(R5) ; ELSE EOT.(*ê50$: BIT #X0.WLK,XST0(R2) ;WRITE LOCKED?ë BEQ 60$ ;IF EQ, NO.,ì BIS #M.HWL,U.CW2(R5) ; ELSE WRITE LOCKED.í60$: BIT #SR.OFL,R1 ;ONLINE?#î BEQ 70$ ;IF EQ, YES.O1ï BIS #M.SER,U.CW2(R5) ; ELSE SEL ERR - OFFLINE.E+ð70$: MOV #IS.SUC&377,R0 ;ASSUME SUCCESS.U.ñ BIC #^C,R1 ;R1 - TERMINATION CODE.8ò CMPB MSGHDR(R2),MESSAG(R1) ;MESSAGE MATCH TERM CODE?ó BEQ 80$ ;IF EQ, YES.T.ô MOV #SR.TC2!SR.TC1,R1 ; ELSE TERM CODE = 6.6õ80$: JMP @ERJTBL(R1) ;SERVICE INTRPT PER TERM CODE.ö .PAGE÷;+*ø; SERVICE INTERRUPT PER TERMINATION CODEù;NCú; R0 - IS.SUC&377 R1 - TERM CODE R2 - > COMMAND PACKETR4û; R3 - CNTRLR INDX R4 - > SCB R5 - > UCBü;-ý+þ; TERMINATION CODE 0 - NORMAL TERMINATIONSÿ9TCL0ER: BIT #CS.LBA,CSTAT(R3) ;WRITTEN CHARACTERISTICSI BEQ TCEXIT ;IF EQ NO, EXIT,; TERMINATION CODE 1 - ATTENTION CONDITION;TCL1ER: BIC #CS.LBA,CSTAT(R3) ;CLEAR BUFFER ADDRESS FLAG) CLR DEVTYP(R3) ;DETERMINE DEVICE TYPE.  MOV XST2(R2),R1 ;R1 - XSTAT2.6 BIC #^C,R1 ;R1 - DEVICE IDENTIFIER.  CMP #X2.TK2,R1 ;TK25?  BNE 10$ ;IF NE, NO.C%  INC DEVTYP(R3) ;DEVICE TYPE - TK25S8  MOVB #UD.8K,U.CW3+1(R5) ; AND UPDATE DENSITY SUPPORT.  BR 30$T+10$: TST R1 ;TS11/TSV05 .OR. TU80/TSU05?E BNE 20$ ;IF NE, TU80/TSU05. ' BIT #HF.UBM,@HFMSK ;UMRS? ;CS020E& BNE 30$ ;IF NE, THEN TS11. ;**-1 BR 25$ ; .. CONT.;20$: CMP #X2.TU8,R1 ;TU80? BEQ 30$ ;IF EQ, YES.425$: INCB DEVTYP+1(R3) ;DEVICE TYPE - TSV05/TSU05.'30$: JMP ILDBA ;PROCESS QIO REQUEST.F*; TERMINATION CODE 2 - TAPE STATUS ALERT$TCL2ER: BIT #M.EOT,U.CW2(R5) ;EOT? BEQ 10$ ;IF EQ NOU! CMPB #CC.WRD,(R2) ;WRITE DATA?P BEQ 5$ ;IF EQ YES  CMPB #CC.WTM,(R2) ;WTMK? ! BEQ 5$ ;IF EQ YES$" CMPB #CC.ERS,(R2) ;ERASE?# BNE 10$ ;IF NE NO ,$5$: MOV #IE.EOT&377,R0 ;SET EOT FOR RETURN% BR TCEXIT ;END REQUEST.&''10$: BIT #X0.TMK,XST0(R2) ;TAPE MARK? ( BEQ 20$ ;IF EQ NOC*) MOV #IE.EOF&377,R0 ;ENDING STATUS - EOF * BR TCEXIT ; AND END REQUEST.+0,20$: BIT #X0.RLL,XST0(R2) ;RECORD LENGHT LONG?- BEQ TCEXIT ;IF EQ NO&. MOV #IE.DAO&377,R0 ;SET RECORD LONG!/ BR TCEXIT ;PROCESS COMPLETIONP0(1; TERMINATION CODE 3 - FUNCTION REJECT283TCL3ER: BIT #CS.GST,CSTAT(R3) ;GET STATUS IN PROGRESS?4 BNE TCEXIT ;IF NE YES!5 BIT #M.SER,U.CW2(R5) ;OFFLINE? 6 BEQ 10$ ;IF EQ NOE7 CALLR NORDY ;YES, HANDLE ITT86910$: BIT #X0.VCK!X0.ILC!X0.ILA,XST0(R2) ;HARD ERROR?: BNE FATAL ;IF NE YES FATAL-; BIT #M.HWL,U.CW2(R5) ;DEVICE WRITE LOCKED?B< BEQ TCEXIT ;IF EQ NO%= MOV #IE.WLK&377,R0 ;SET WRITE LOCKO.>TCEXIT: JMP @INTADD(R3) ;GOTO REQUEST ENDUP.?"@FATAL: JMP TCL6ER ;FATAL ERROR.A00|²wIwtöt÷tø tþfDATA .PAGE>B; TERMINATION CODE 4 - RECOVERABLE ERROR: TAPE MOVED 1 BLOCKC DTCL4ER: TSTB DEVTYP(R3) ;TK25?E BEQ 2$ ;IF EQ, NO.F MOV (R2),R1 ;R1 - I/O!G BIC #^C<17>,R1 ; COMMAND CODE.YH CMP #5,R1 ;WRITE TO TAPE?BI BEQ 1$ ;IF EQ, YES.X#J CMP #11,R1 ;WTMK OR ERASE TAPE?IK BNE 2$ ;IF NE, NO./L1$: BIT #X1.EW,XST1(R2) ;TK25 EW WRITE ERROR?E&M BNE 3$ ;IF NE, YES - DON'T LOG IT.)N2$: CALL MSDVER ;LOG THE DEVICE ERROR.G<O3$: BIT #CS.NER!CS.UMD,CSTAT(R3) ;ERR RECOVERY INHIBITED?&P BNE 30$ ;IF NE, YES - END REQUEST.-Q MOV (R2),R0 ;RETRIEVE COMMAND HEADER WORDS/R BIC #^C<6437>,R0 ;R0 - CMND MODE, CMND CODE.M,S TST RCVCNT(R3) ;SETUP FOR ERROR RECOVERY?T BNE 20$ ;IF NE, YES.U CMPB #1,R0 ;READ?BV BEQ 10$ ;IF EQ, YES.W CMPB #5,R0 ;WRITE?X BEQ 5$ ;IF EQ, YES.NY CMPB #11,R0 ;WTMK?(Z BNE FATAL ;IF NE, I/O NOT RETRIABLE.4[5$: BIT #M.IWR,U.CW2(R5) ;(USER) INHIBIT XND GAPS?\ BNE 30$ ;IF NE, YES.5]10$: BIS #CM.RTY,(R2) ;I/O REQUEST - RETRY COMMAND.?-^ MOV #REREAD,RCVCNT(R3) ;ASSUME READ RETRY.V_ CMPB #1,R0 ;I/O= READ?` BEQ 20$ ;IF EQ, YES..a MOV #WRTOVR*2,RCVCNT(R3) ;ELSE, WRITE/WTMK.b20$: CMPB #1,R0 ;READ?Cc BEQ 22$ ;IF EQ, YES.d BIT #M.EOT,U.CW2(R5) ;EOT?e BEQ 22$ ;IF EQ, NO.0f CMPB #WRTOVR,RTTBL(R3) ;RECOVERY - NGT 10 FT?g BHIS 22$ ;IF HIS, NO.B;h MOVB #WRTOVR,RTTBL(R3) ;ERR RCVRY - NGT 10 FT AFTER EOT.Ri;SETUP FOR ERROR RECOVERY.%j22$: DECB RTTBL(R3) ;RETRY FURTHER?Mk BEQ PARERR ;IF EQ, NO.#l25$: DEC RCVCNT(R3) ;REISSUE I/O?3m BNE AGAIN ;IF NEQ, YES.Pn CMPB #1,R0 ;READ?,o30$: BNE PARERR ;IF NE, NO - END REQUEST.pq;CLEAN TAPE ON READ.r TSTB DEVTYP(R3) ;TK25?.s BNE AGAIN ;IF NE, NO TAPE CLEAN FOR TK25S.5tCLEAN: MOV INTADD(R3),CLNRTN(R3) ;RCVRY ISR RETURN,(,u MOV #CLNISR,INTADD(R3) ;CLEAN ISR RETURN.)v MOV (R2),CMDPK1(R3) ;CMD PKT HDR WRD,V-w MOV 2(R2),CMDPK2(R3) ; DATA TRFR LO BUF @.R3x MOV #5,CLNCNT(R3) ;IF READ FWD, BCKSPC 5 BLOCKS.B'y TSTB PRVDIR+1(R3) ;READ FWD REQUEST?(z BEQ 27$ ;IF EQ, YES.,{ DEC CLNCNT(R3) ;READ REV - BCKSPC 4 BLKS,6|27$: MOV #CC.SRR,(R2) ;TAPE CLEAN (BCKSPC OVER CLNR)7}CLNSET: MOV CLNCNT(R3),CMDB2(R2) ; AND SPACING COUNT.A0~ BEQ FWDPOS ; IF EQ, Repositioned for RD FWD." CLR CLNED(R3) ;NONE SPACED YET.?CLNAGN: MOVB #CLNTMO,S.VITM(R4) ;CHECK SUBCYCLES AND ;CS020, RITM8=.-2 ;CS020V7 MOVB #CLNCYC,S.VSTS(R4) ; SUBCYCLE TIMEOUT. ;CS020# RSTS9=.-2 ;CS020K%‚ BR AGAIN ; .. CLEAN TAPE. ;**-2Eƒ%„CLNISR: MOV CMDB2(R2),-(SP) ;UPDATE%… SUB RBPCR(R2),(SP) ; BLOCKS SPACEDB † ADD (SP)+,CLNED(R3) ; COUNT.‡ TSTB PRVDIR(R3) ;SPACE REV?&ˆ BEQ FWDCLN ;IF EQ, NO - SPACE FWD?‰;TAPE CLEAN - SPACING REV.$Š TST RBPCR(R2) ;COMPLETED REQUEST?‹ BEQ REVDON ;IF EQ, YES..Œ BIT #X0.BOT,XST0(R2) ;BOT?(� BNE REVDON ;IF NE, DONE.%ŽPOSAGN: MOV CLNCNT(R3),-(SP) ;SETUPM"� SUB CLNED(R3),(SP) ; REMAINING � MOV (SP)+,CMDB2(R2) ; SPACE‘ BR CLNAGN ; COUNT.;’-“REVDON: MOV CLNED(R3),CLNCNT(R3) ;SETUP FOR2'” TSTB PRVDIR+1(R3) ;READ FWD REQUEST? • BNE 100$ ;IF NE, READ REV.– DEC CLNCNT(R3) ;SPACE N-1.R— BR 110$ ; .. CONT.˜"™100$: INC CLNCNT(R3) ;SPACE N+1.8š110$: MOV #CC.SRF,(R2) ;TAPE CLEAN (FWDSPC OVER CLNR).› BR CLNSET ; . . CONT.Yœ*�FWDCLN: TST RBPCR(R2) ;REPOSITIONED FWD?ž BNE POSAGN ;IF NE, NO.,ŸFWDPOS: MOV CMDPK1(R3),(R2) ;SETUP CMD PKT%  BIC #CM.RTY,(R2) ;COMMAND WORD AND2+¡ MOV CMDPK2(R3),CMDB2(R2) ; LO ORD BUF @.*¡ MOVB #1,S.VSTS(R4) ;ONE READ ;CS020¡ RSTS10=.-2 ;CS0201¡ MOVB #RDTMO,S.VITM(R4) ; TIMEOUT AND ;CS020¡ RITM9=.-2 ;CS020:¤ MOV CLNRTN(R3),INTADD(R3) ; > INTRPT PROCESSING. ;**-2(¥AGAIN: JMP INITIO ;RE-INITITIATE I/O.¦ .PAGE:§; TERMINATION CODE 5 - RECOVERABLE ERROR: TAPE NOT MOVED¨'©TCL5ER:CALL MSDVER ;LOG DEVICE ERRORN(ª DECB RTTBL(R3) ;DECREMENT RETRY COUNT!« BNE AGAIN ;IF NE RETRIES LEFTM2¬PARERR: MOV #IE.VER&377,R0 ;UNRECOVERABLE ERROR.­ BR TCEND ;END REQUEST.®,¯00|ºwðvt´cÚµcÛ¶c�·c›’; TERMINATION CODE 6 - UNRECOVERABLE ERROR°*±TCL6ER: MOV #IE.FHE&377,R0 ;FATAL ERROR.² CALL MSDVER ;LOG ERROR AND"³TCEND: JMP IODON ; END REQUEST.´/µ; TERMINATION CODE 7 - FATAL CONTROLLER ERROR;¶<·TCL7ER: CLR @S.CSR(R4) ;INITIALIZE DEVICE - ELSE UNUSABLE.9¸ MOV #TCL6ER,SSRRTY(R3) ;END REQUEST WHEN DEVICE READY.C0¹ BIS #CS.WSS,CSTAT(R3) ;WAIT FOR DEVICE READY:@¹ MOVB #5.,S.VITM(R4) ;TEST FOR DEV RDY AT 5 SEC INTRVL, ;CS020¹ RITM10=.-2 ;CS020?¹ MOVB #240.,S.VSTS(R4) ; UP TO 240 TIMES - 20 MINS.V ;CS020E¹ RSTS11=.-2 ;CS0203¹ MOVB S.VITM(R4),S.VCTM(R4) ;START TIMER ;CS020D¹ RITM11=.-4 ;CS020¹ RCTM5=.-2 ;CS020O½ RETURN ;**-3¾ .PAGE¿;CÀ; MOUNT COMPLETIONÁ;AÂ(ÃIMOUNT: BIT #M.SER,U.CW2(R5) ;OFFLINE?'Ä BNE 10$ ;IF NE YES, IT'S FATAL HERECÅ BIT #M.BOT,U.CW2(R5) ;BOT?TÆ BEQ 10$ ;IF EQ, NO.V/Ç BICB #US.PWF,U.STS(R5) ;ELSE RESET PWFLD INDLÈ BR ISTAT ; AND END REQUEST.CÉ.Ê10$: MOV #IE.FHE&377,R0 ;NO, SET FATAL ERRORËÌ;V-Í; STATUS EXIT FOR SET, SENSE, MOUNT AND SET Î;MÏ0ÐISTAT: MOV U.CW2(R5),R1 ;SET STATUS WORD IN R1Ñ BR IODON ;ÒÓ;+AÔ; **- IRWDU - SUCCESSFUL IO.RWD/IO.RWU RESETS US.PWF INDICATIONNÕ;-Ö%×IRWDU: TST R0 ;SUCCESSFUL RWD/RWU?2Ø BMI 10$ ;IF MI, NO.$0Ù BICB #US.PWF,U.STS(R5) ;ELSE RESET PWFLD IND,#Ú INCB PRVDIR(R3) ; Pre dir - REV.V0Û10$: BIC #M.RWD,U.CW2(R5) ;RWND, IF ANY, OVER.Ü BR IODON ;END REQUEST.ÝÞß .PAGEà;#á; SPACE BLOCKS COMPLETIONEâ;ã%äISPCB: BIT #M.PEOV,U.CW2(R5) ;PEOV?Oå BEQ IOCOM ;IF EQ, NO.4æ MOV #SBRPOS,INTADD(R3) ;RETURN @ AFTER BACKSPACE.ç BR BCKSPC ;SETUP REQUEST.èé;+3ê; **-SBRPOS - POSITIONED AEOV SPACING VIA BLOCKS.ë;-%ìSBRPOS: CLR R1 ;NO BLOCKS SPACED,Ií BR NDAEOV ; AEOV ENDUP.îï;+&ð; **- ISPCF - SPACE FILES COMPLETIONñ;-ò3óISPCF: BIT #CC.STR-CC.STF,(R2) ;SPACING REVERSE?I$ó BNE SFREV ;IF NE, YES. ;CS0179õ BIT #CS.SFB,CSTAT(R3) ;SPACING FILES VIA BLOCKS? ;**-1ö BNE SPCFB ;IF NE, YES.U÷ BIT #M.PEOV,U.CW2(R5) ;PEOV?;ø BEQ IOCOM ;IF NE, NO./ù SUB RBPCR(R2),SPCNT(R3) ;SPACED FILE COUNT.C;úNDSPFB: MOV #SFRPOS,INTADD(R3) ;RETURN @ AFTER BACKSPACE. &ûBCKSPC: MOV #CC.SRR,(R2) ;BACKSPACEü MOV #1,CMDB2(R2) ; 1 BLOCK. 8ü MOVB #15.,S.VSTS(R4) ;WAIT UP TO 15 SUBCYCLES ;CS020ü RSTS12=.-2 ;CS0207ü MOVB #4,S.VITM(R4) ; 4 SECONDS PER SUBCYCLE. ;CS020Sü RITM12=.-2 ;CS020!ÿ BR AGAIN ;ISSUE I/O. ;**-2I;+B; **-SFRPOS - RETURN AFTER REPOSITIONING TO AEOV FOR SPACE FILES;-+SFRPOS: DEC SPCNT(R3) ;SPACED FILE COUNTR$ MOV SPCNT(R3),R1 ; TO REQUESTOR.*NDAEOV: BIC #M.PEOV,U.CW2(R5) ;NOT PEOV,$ BIS #M.AEOV,U.CW2(R5) ; BUT AEOV.& MOV #IE.EOV&377,R0 ;INDICATE AEOV,  BR IODON ; END REQUEST. ? SPCFB: MOV #ISPCFB,INTADD(R3) ;SPC FILES VIA BLOCK SERVICING.0 ISPCFB: INC SPACED(R3) ;SPACED ONE MORE FILE.  BIT #M.PEOV,U.CW2(R5) ;PEOV?0 BNE 10$ ;IF NE, YES.O" CMP SPACED(R3),SPCNT(R3) ;DONE? BNE AGAIN ;IF NE, NO.) MOV #IS.SUC&377,R0 ;R0 - RETURN CODE,E( MOV SPCNT(R3),R1 ;R1 - SPACED COUNT, BR IODON ; END REQUEST.310$: MOV SPACED(R3),SPCNT(R3) ;SPACED FILE COUNT.V# BR NDSPFB ;REPOSITION TO AEOV.V ;CS017A ;CS017 8SFREV: BIT #M.BOT,U.CW2(R5) ;BACKED INTO BOT? ;CS017# BEQ IOCOM ;IF EQ, NO. ;CS017 6 MOV #IS.SUC&377,R0 ; ELSE - IS.SUC IF BOT. ;CS017 ;CS017 ;CS017Y ;CS017(; ;**-1?9; COMMON EXIT ROUTINE FOR ALL ROUTINES REQUIRING STATUSR; 3IOCOM: MOV U.CNT(R5),R1 ;RETRIEVE REQUESTED COUNTO* SUB RBPCR(R2),R1 ; LESS RESIDUAL COUNT.;(! ; COMMON EXIT FOR ALL FUNCTIONSP!;;"1#IODON: CALL MSDINT ;CALL DIAGNOSTIC COMPLETIONS3$ MOV RTTBL(R3),R2 ; R2 - TOTAL RTRYS, RTRYS LEFT.?4% BIC #CS.CIP,CSTAT(R3) ;CLEAR COMMAND IN PROGRESS*% CALL @EIODON ;CALL COMPLETION ;CS0202' JMP MSINI ;GO CHECK FOR ANOTHER REQUEST ;**-1( .PA00|ÂwIwtöt÷tø tþfDATAGE);+(*; **-MSDVER/MSDTER- LOG DEVICE ERRORS.+;LB,; THE DRIVER LOGS THE COMMAND PACKET, DEVICE STATUS REGISTER ANDA-; MESSAGE PACKET (INCLUDING EXTENDED STATUS REGISTERS) LOCATED..; IN THE DRIVER DATA BASE. /;U 0; INPUT:1; R3 = CONTROLLER INDEXT2; R4 = SCB ADDRESS3; R5 = UCB ADDRESS4;R5;26;-7 8 .ENABL LSBT 9MSDVER: MOV R2,-(SP) ;SAVE R2.:9 MOV DVERR,-(SP) ;(SP) - @ TO LOG DEVICE ERRORS. ;CS020; BR 10$ ; ;**-1 <MSDTER: MOV R2,-(SP) ;SAVE R2.;< MOV DVTMO,-(SP) ;(SP) - @ TO LOG DEVICE TIMEOUTS. ;CS020E>10$: BIT #CS.UMD,CSTAT(R3) ;USER MODE DIAGNOSTIC IN PROGRESS ;**-1? BEQ 20$ ;IF EQ NOC@ TST (SP)+ ;MAINTAINGA TST (SP)+ ; STACK.!B RETURN ;RETURN TO THE CALLERN*C20$: MOV CMDPTR(R3),R2 ; > ERR LOG DATA.0D CALL @(SP)+ ;CALL EXEC ERROR LOGGING ROUTINEE MOV (SP)+,R2 ;RESTORE R2. F RETURN ;; G .DSABL LSBVHI .PAGEJ;+/K; **-MSDINT- DIAGNOSTIC REGISTER PASS ROUTINE L;1BM; IF ENTRY WAS FROM A DIAGNOSTIC CONTROL FUNCTION, THEN MOVE THEEN; I/O PACKET WORDS 17 & 20 TO WORDS 20 & 21 FOR THE $CRPAS ROUTINE.DO;S@P; THE DRIVER PASSES THE COMMAND PACKET, DEVICE STATUS REGISTERHQ; AND MESSAGE PACKET (INCLUDING XTND STS REGS) VIA THE $CRPAS ROUTINE.R;V S; INPUTS:2T;EU; R3 = CONTROLLER INDEX+V; R4 = SCB ADDRESSW; R5 = UCB ADDRESSX;-Y7ZMSDINT: BIT #CS.UMD,CSTAT(R3) ;DIAGNOSTIC OPERATION?[ BEQ 30$ ;IF EQ NOA\ MOV R1,-(SP) ;SAVE R1] MOV R2,-(SP) ;SAVE R25] MOV S.VPKT(R4),R1 ;GET I/O PACKET ADDRESS ;CS020] RPKT2=.-2 ;CS020 0_ MOV CMDPTR(R3),R2 ; > DEVICE PACKETS. ;**-15` CMPB #IO.EOF/256.,I.FCN+1(R1) ;WRITE EOF FUNCTION?Ia BEQ 10$ ;IF EQ YES2b CMPB #IO.RWD/256.,I.FCN+1(R1) ;REWIND FUNCTION?c BEQ 10$ ;IF EQ YES<c CALL @CRPAS ;PASS DEVICE REGISTERS TO DIAGNOSTICS ;CS020e BR 20$ ;GO TO EXIT ;**-1T>f10$: MOV I.PRM+14(R1),I.PRM+16(R1) ;MOVE PACKET WD20 TO WD21:g MOV I.PRM+12(R1),I.PRM+14(R1) ;MOVE PACKET WD17 TO WD20<g CALL @CRPAS ;PASS DEVICE REGISTERS TO DIAGNOSTICS ;CS0209g MOV S.VPKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS ;CS020Ag RPKT3=.-2 ;CS020O?j MOV I.PRM+14(R1),I.PRM+12(R1) ;MOVE WD20 BACK TO WD 17 ;**-28k MOV I.PRM+16(R1),I.PRM+14(R1) ;MOVE WD21 BACK TO WD20 l20$: MOV (SP)+,R2 ;RESTORE R2.m MOV (SP)+,R1 ;RESTORE R1.n30$: RETURN ;EXIT TO CALLER oo .PAGE ;CS018p;+:q;**-TRPHYS-TRANSLATE D-SPACE ADDRESS TO PHYSICAL ADDRESSr;,Fs; THIS ROUTINE IS CALLED TO TRANSLATE A KERNEL DATA SPACE ADDRESS TOEt; EQUIVALENT PHYSICAL ADDRESS. IN UNIBUS SYSTEMS, THE UMRS MAP DATA Du; SPACE, SO THE VIRTUAL ADDRESS IS OK. IN ALL NON-I/D SYSTEMS, THEEv; VIRTUAL -> PHYSICAL MAPPING OF EXEC ADDRESSES IS DIRECT. THE ONLY4Fw; SITUATION REQUIRING TRANSLATION IS THEREFORE AN I/D SYSTEM RUNNINGx; ON A Q-BUS.Ry;z; CALLING SEQUENCE:C{; 4{; CLR -(SP) ; CLEAR HI-ORD ADDRESS AREA. ;CS018-|; MOV ...,-(SP) ;PUSH ADDRESS TO TRANSLATE}; CALL TRPHYS ;TRANSLATE2}; MOV (SP)+,... ; GET TRANSLATED LO-ORD ;CS0181}; MOV (SP)+,... ; AND HI-ORD ADDRESS. ;CS018M}; ;CS018;- ;**-1€�TRPHYS: ; REFERENCE LABEL‚ƒ .IF DF K$$DAS„,… BIT #DV.EXT,U.CW1(R5) ;22-BIT CONTROLLER?,† BEQ 10$ ;IF EQ NO, NO TRANSLATION NEEDED#† MOV R0,-(SP) ; Save R0 ;CS018A%† MOV R1,-(SP) ; and R1. ;CS018;† MOV @SCMOF,R1 ; Get 32-wd block addr of D-space. ;CS0201† CLR R0 ; and R0=0 for @ translation. ;CS018C>† SUB #200,R1 ; R1 - @ D space starting at virtual 200;CS018/† ASHC #6,R0 ; Translate the D pool @ ;CS018E"† ADD R1,6(SP) ; and ;CS018$† ADC R0 ; return it ;CS0181† BIC #^C<3>,R0 ; (18 bit phys @) ;CS018V,† MOV R0,10(SP) ; to user. ;CS018&† MOV (SP)+,R1 ; Restore R1 ;CS018%† MOV (SP)+,R0 ; and R0. ;CS018VŽ10$: ;**-7�� .ENDC ; DF K$$DAS‘’ RETURN ;RETURN TO CALLERc’ .PAGE ;CS020’;+ ;CS020s9’; **-MSKRB - CONTROLLER STATUS CHANGE ROUTINE ;CS020 9’; **-M00|Êw}Íwt´cÚµcÛ¶c�·c›’SUCB - UNIT STATUS CHANGE ROUTINE ;CS020 ’; ;CS020I’; The status change routines are NOPS and are provided only as a ;CS020CK’; mechanism to gain control at MSKRB to translate the exec vector. ;CS020 ’;- ;CS020+’ ;CS020 8’MSKRB: BCS MSUCB ; IF CS - offline call, nop. ;CS0201’ TST EXEVEC ; Exec vector translated ? ;CS020 2’ BNE MSUCB ; IF NE, Yes - don't repeat. ;CS0200’ MOV @#112,R0 ; R0 > table of entries ;CS020;’ MOV (R0),R0 ; and apr bias (1st word of table). ;CS020A4’ MOV KINAR6,-(SP) ; Save I-space mapping. ;CS020<’ MOV (R0),KINAR6 ; Map common through I-space APR6. ;CS0201’ MOV #EXEVEC,R3 ; R3 > Exec vector and ;CS020l8’ MOV #EXEVCL,R2 ; R2 = length of vector area. ;CS0201’ CALL @#140004 ; Translate the vectors. ;CS020 6’ MOV (SP)+,KINAR6 ; Restore I-space mapping. ;CS020,’; Patch driver SCB references ;CS020.’ MOV #SCBPAT,R0 ; R0 > patch table. ;CS0205’10$: MOV (R0)+,R2 ; R2 > driver @ to patch ;CS020 9’ BEQ MSUCB ; IF EQ (R0> table terminator), end. ;CS020s:’ MOV @(R0)+,(R2) ; Else - patch driver location ;CS0206’ BR 10$ ; and continue till driver patched. ;CS020’ ;CS020l)’MSUCB: JMP MSPWF ; Continue. ;CS020r“ .ENDCS0201’ CALL @#140004 ; Translate the vectors. ;CS020 6’ MOV (SP)+,KINAR6 ; Restore I-space mapping. ;CS020,’; Patch driver SCB references ;CS020.’ MOV #SCBPAT,R0 ; R0 > patch table. ;CS0205’10$: MOV (R0)+,R2 ; R2 > driver @ to patch ;CS020  .TITLE DRDSPE .IDENT /15.00/O; 7; COPYRIGHT (C) 1987 BY DIGITAL EQUIPMENT CORPORATIONR; ALL RIGHTS RESERVED.;U>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;E ; D. N. CUTLER 12-AUG-73 ;)+ ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:K ;T-; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:.;;; J. R. KAUFFMAN; J. M. LAWLER; T. LEKASI; B. S. MCCARTHY;M-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:N;.; B. S. MCCARTHY; L. B. MCCULLEY; ; MODIFIED BY:;$; B. S. MCCARTHY 13-DEC-86 15.00;F#; BM377 -- MOVE DRDSP TO DIR11M D;B(; DIRECTIVE DISPATCHER);C*; MACRO LIBRARY CALLSF+; ,%- .MCALL HDRDF$,HWDDF$,TCBDF$,WDBDF$./'0 HDRDF$ ;DEFINE TASK HEADER OFFSETSK&1 HWDDF$ ;DEFINE HARDWARE REGISTERS.2 TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS13 WDBDF$ ;DEFINE USER WINDOW DEF BLOCK OFFSETS4;J5; DEFINE SIZE OF LARGEST DPB TO BE COPIED INTO EXEC. ANY CHANGES TO THISA6; ASSIGNMENT MUST BE REFLECTED IN THE DPB BUFFER SIZE IN SYSCM.-7;68'9 DPBMAX = 16. ;RPOI IS 16 WORDS LONGI:;+;; **-$TRTRP-TRAP TRAPP<;RJ=; THIS ROUTINE IS TRAPPED TO WHEN A TRAP INSTRUCTION IS EXECUTED. IF THEH>; STACK DEPTH IS ZERO, THEN A DIRECTIVE STATUS IS TO BE RETURNED. ELSE??; CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE.F@; A; INPUTS:DB; -C; 2(SP)=PS WORD PUSHED BY TRAP INSTRUCTION.E-D; 0(SP)=PC WORD PUSHED BY TRAP INSTRUCTION.YE;G F; OUTPUTS:G;IDH; IF THE STACK DEPTH IS ZERO, THEN A DIRECTIVE STATUS IS RETURNED.DI; ELSE CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE.J;-K L .ENABL LSBEL ; BM377 L .IF NDF D$$PAR ; BM377L ; BM377S*M$TRTRP::TST $STKDP ;;;STACK DEPTH ZERO?N BNE $EMTRP ;;;IF NE NO6O MOV (SP)+,R0 ;;;GET ADDRESS + 2 OF TRAP INSTRUCTION*P MFPI -(R0) ;;;PICK UP TRAP INSTRUCTIONP ; BM377E"P .IFF ; NDF D$$PAR ; BM377P ; BM377=P$TRTR1:: ;REFERENCE LABEL FOR DRSUB TRAP HANDLER ; BM377IP ; BM377.#P .ENDC ; NDF D$$PAR ; BM377HP ; BM377NP ; BM377-Q MOVB (SP)+,R0 ;;;RETRIEVE DIRECTIVE STATUSF8R MOV (SP),PS ;;;RESTORE TRAP PS FOR CORRECT PREV MODE/S MOV #$STACK-22,SP ;RELOAD EXEC STACK POINTER;&T MOV R0,-(SP) ;SAVE DIRECTIVE STATUSU BPL 1$ ;IF PL OKAY AS IS*V INC @$USRPS ;SET CARRY IN USER PS WORDWX .IF DF G$$G00}ÒwIwtöt÷tø tþfDATAEFY,Z JMP 60$ ;IF ERROR SKIP GGEF COUNT UPDATE[\ .ENDC ; DF G$$GEF](^1$: JMP 59$ ;GO UPDATE GGEF USE COUNT_`;+a; **-$EMTRP-EMT TRAPb; Jc; THIS ROUTINE IS TRAPPED TO WHEN AN EMT INSTRUCTION IS EXECUTED. IF THEEd; STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED. ELSE A TEST ISCFe; MADE TO SEE IF THE EMT INSTRUCTION HAD A CODE OF 377. IF NOT, THENHf; CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE. ELSE THE&g; APPROPRIATE DIRECTIVE IS EXECUTED.h;F i; INPUTS:j;J,k; 2(SP)=PS WORD PUSHED BY EMT INSTRUCTION.,l; 0(SP)=PC WORD PUSHED BY EMT INSTRUCTION.m; n; OUTPUTS:o;Bp; IF THE STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED. ELSEGq; CONTROL IS GIVEN TO THE EMT/TRAP SST ROUTINE OR A DIRECTIVE ROUTINEE3r; DEPENDENT ON WHETHER THE EMT HAD A CODE OF 377. s;-tu;I@v; DETERMINE IF LEGITIMATE ENTRY FROM USER STATE. IF NOT, CRASHw;Ow ; BM377D w .IF NDF D$$PAR ; BM377w ; BM377E2x$EMTRP::TST $STKDP ;;;ARE WE AT STACK DEPTH +1?y BGT 2$ ;;;IF GT YES.#z JMP $CREMT ;;;ELSE CRASH SYSTEMT{;OB|; DETERMINE IF ENTRY WAS VIA EMT 377. IF NOT PROCESS NON-RSX EMT};S1~2$: DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITY ~ ; BM377O"~ .IFF ; NDF D$$PAR ; BM377~ ; BM377H=~$EMTR1:: ;REFERENCE LABEL FOR DRSUB TRAP HANDLER ; BM377 ~ ; BM377.~ .IF DF K$$DAS ; BM377 ~ ; BM377D=~ MOV $DRAPR,KDSAR5 ;MAP COMMON IN I-SPACE AS WELL ; BM377P~ ; BM377D"~ .ENDC ; DF K$$DAS ; BM377~ ; BM377E#~ .ENDC ; NDF D$$PAR ; BM377F~ ; BM3777" MOV #$UMPC,R3 ;POINT TO USER PC*€ MOV (R3)+,R5 ;GET ADDRESS OF EMT PLUS 2"� MFPI -(R5) ;GET DIRECTIVE WORD#‚ CMP #104377,(SP) ;DIRECTIVE EMT? ƒ BEQ 3$ ;IF EQ YES:$„ JMP 80$ ;HANDLE NON-RSX EMT TRAP…; <†; PUSH ASSUMED SUCCESFUL STATUS. DIRECTIVE PROCESSORS MAY:‡;8ˆ; RETURN, IN WHICH CASE THE +1 IS THE DIRECTIVE STATUS?‰; OVERWRITE THE +1 AND RETURN, IN WHICH CASE THE NEW VALUE ISDŠ; THE STATUS?‹; ISSUE A TRAP INSTRUCTION, IN WHICH CASE THE LOW BYTE OF THE Œ; TRAP IS THE RETURNED STATUS�; 3Ž3$: MOV #1,(SP) ;SET SUCCESSFUL DIRECTIVE STATUS2��; ;‘; IN ACCOUNTING SYSTEMS, CHARGE THE TASK WITH A DIRECTIVET’;“” .IF DF A$$CNT•.– MOV $TKTCB,R0 ;POINT TO TCB OF CURRENT TASK1— MOV T.ACN(R0),R0 ;LOCATE ITS ACCOUNTING BLOCKS: ˜ BEQ 5$ ;IF EQ, NO ACCOUNTING5™ MOV #B.DIR,R1 ;GET OFFSET TO DIRECTIVE COUNT FIELDD*š CALL $ADAT1 ;INCREMENT DIRECTIVE COUNT ›5$: ;œ� .ENDCžŸ ;C7¡; POINT TO AND INITIALIZE DRDSP SCRATCH AREA IN DRTBLE¢;R7£ MOV #$USRPS,R5 ;POINT TO DISPATCH TABLE SCRATCH AREAC(¤ MOV R3,(R5)+ ;SAVE ADDRESS OF USER PS.¥ BIC (SP),(R3)+ ;CLEAR CARRY IN USER PS WORD¦ CLR (R5) ;INDICATE NO BYTESV§;CG¨; BEGIN VALIDATION OF DPB. GET TOP WORD OF STACK, CHECK TO SEE IF THEN<©; DPB IS ON THE STACK (ODD) OR POINTED TO BY STACK (EVEN).ª;EJ«; BETWEEN THE LABELS $DRLM1 AND $DRLM2, AN SST IN THE EXEC IS TREATED ASK¬; NON-FATAL AND IS CONVERTED TO A DIRECTIVE STATUS RETURN OF IE.ADP. THIS K­; WAY WE CAN JUST ACCESS THE DPB WITHOUT THE EXPENSE OF ADDRESS CHECKING.T®;E#¯ MFPI SP ;GET USER STACK POINTERU° MOV (SP)+,R3 ;,5±$DRLM1:: ;START OF AREA OF ALLOWED TRAPS IN SSTSRA/² ;(BREAKPOINTS IN THIS AREA WILL NOT WORK)G1³ MFPD$ (R3)+ ;GET FIRST WORD ON USER STACK AND #´ ;ADVANCE PAST IF DPB ON STACKYµ BIT #1,(SP) ;DPB ON STACK?¶ BNE 10$ ;IF NE YESD·; H¸; DPB IS POINTED TO BY TOP OF STACK. SET $BTRMV TO 2 INDICATING REMOVEK¹; ONLY ADDRESS FROM STACK. REPLACE TOP WORD ON KERNEL STACK (DPB ADDRESS)Oº; WITH FIRST WORD OF DPB.C»;T1¼ MOV #2,(R5) ;INDICATE DPB POINTED TO BY STACKV#½ MOV (SP)+,R3 ;SET ADDRESS OF DPBA3¾ MFPD$ (R3)+ ;GET FIRST WORD OF DPB AND POINT TON ¿ ;SECOND À;O<Á; PICK UP FIRST DPB WORD FROM STACK, EXTRACT DIC, DPB SIZEÂ;V+Ã10$: MOV (SP)+,R1 ;PICK UP FIRST DPB WORDD"Ä MOV R1,R4 ;COPY FIRST DP00}ÚwÍwt´cÚµcÛ¶c�·c›’B WORD Å CLR R0 ; Æ BISB R1,R0 ;EXTRACT DIC BYTE#Ç CLRB R4 ;CLEAR LOW BYTE OF COPY&È SWAB R4 ;SWAP DPB SIZE TO LOW BYTE$É BMI 346$ ;IF MI ILLEGAL DPB SIZE.Ê ASL R4 ;CONVERT TO BYTES TO REMOVE AT EXITË TST (R5)+ ;DPB ON STACK ?TÌ BNE 15$ ;IF NE NOS-Í MOV R4,-2(R5) ;SET BYTES TO REMOVE ON EXITW.Î15$: MOV R1,(R5)+ ;SAVE FIRST WORD IN $DICSVÏ;IÐ; WE NOW HAVE:Ñ;ODÒ; R0 = DIRECTIVE IDENTIFICATION CODE (DIC) ZERO PADDED TO 16 BITS.AÓ; R1 = DPB SIZE IN BYTES (NUMBER OF BYTES TO REMOVE FROM STACK)B-Ô; R3 = VIRTUAL ADDRESS OF FIRST WORD IN DPBRÕ;BBÖ; $DICSV = FIRST WORD OF DPB (SAVED COPY SO THAT COMMON ROUTINES1×; CAN DETERMINE WHICH DIRECTIVE WAS EXECUTED)SØ;EÙ;A/Ú; INITIALIZE GROUP GLOBAL EVENT FLAG POINTERS$Û; ÜÝ .IF DF G$$GEFÞ:ß MOV #$GEFPT+2,$GEFPT ;INIT GRP GLOBAL USE COUNT POINTER9à MOV #$GEFPT+2,$GFTCB ;INIT GRP GLOBAL USER TCB POINTERRáâ .ENDC ; DF G$$GEFãä;RIå; INITIALIZE FLAG WHICH INDICATES DPB VALID/INVALID. IF THIS IS A VALID Jæ; DIRECTIVE, WE WILL REPLACE THIS FLAG WITH THE ADDRESS OF THE DIRECTIVEç; PROCESSING ROUTINE LATER.Oè; -é CLR -(SP) ;ASSUME ILLEGAL DIC OR DPB SIZE ê;TFë; VALIDATE DIC AND CONVERT TO POINTER INTO TABLE OF TWO WORD ENTRIESì; FOR DIRECTIVES.í;Dî ASR R0 ;DIVIDE CODE BY 2ï BCC 357$ ;IF CC ILLEGAL DICT'ð CMP R0,#HI$DIC ;IS DIC OUT OF RANGE?Rñ BHI 357$ ;IF HI YESR(ò ASL R0 ;CONVERT TO DOUBLE WORD INDEX4ó ADD #$DSTAB+1,R0 ;POINT TO COMPLEMENT OF DPB SIZE; ;**-19 G; GET NEGATIVE OFFSET INTO MOVE TABLE FROM DIRECTIVE TABLE. THIS USES3 ; THE LEFTOVER BYTE AND SAVES A FEW INSTRUCTIONS.S ;L,  MOVB (R0),R2 ;GET COMPLEMENT OF LENGTH*4 ;CI ; VALIDATE THAT EITHER DPB SIZE MATCHES THAT SHOWN IN THE TABLE OR THATDA; THE DIRECTIVE CODE WILL VERIFY THE SIZE (SIZE IN TABLE = 0 ).;R" CMPB R4,-(R0) ;DPB SIZE MATCH ? BEQ 34$ ;IF EQ YES( CMP (PC)+,R1 ;IS IT GMCR$ DIRECTIVE ?" .BYTE 127.,41. ;DIC, DPB SIZE ? BEQ 34$ ;IF EQ YES6 TSTB (R0) ;DEFER CHECKING FOR VARIABLE LENGTH DPB?-346$: BNE 357$ ;IF NE NO, ILLEGAL DPB SIZEV! MOV R4,R2 ;COPY SIZE IN BYTESS" ASL R2 ;CONVERT TO DOUBLEWORDS; CMP #DPBMAX*4,R2 ;DPB SIZE BIGGER THAN TRANSFER VECTOR ?A) BLO 357$ ;IF LO YES, ILLEGAL DPB SIZE  NEG R2 ;CREATE JUMP INDEXT;ZG; REPLACE ZERO FLAG ON STACK WITH ADDRESS OF PROCESSING ROUTINE. THISQ7; INDICATES TO THE CODE BELOW THAT THE DPB WAS VALID.?;.< 34$: MOV TB$SIZ(R0),(SP) ;GET ADDRESS OF DIRECTIVE ROUTINE! BEQ 357$ ;IF EQ ILLEGAL DICB6" MOV 2*TB$SIZ(R0),R4 ;GET PROCESSING MASK FLAGS BYTE#;V?$; PROCESS " A C H K D B " FLAG - ADDRESS CHECK AND MAP 8 WORDL%; PLAS DEFINITION BLOCK.&; G'; FOR PLAS DIRECTIVES, WE TAKE THE ONE PARAMETER OUT OF THE DPB. THIS D(; PARAMETER IS THE ADDRESS OF AN 8 WORD STRUCTURE (RDB OR WDB). WEG); VALIDATE READ/WRITE ACCESS TO THE BLOCK AND PASS THIS BLOCK, RATHERO6*; THAN THE DPB, TO THE DIRECTIVE PROCESSING ROUTINE.+;;<,; ON SYSTEMS SUPPORTING EXTERNAL TASK HEADERS, THE WDB/RDB9-; IS COPIED INTO THE EXECUTIVE INTERMEDIATE BUFFER AREAE=.; (STARTING ADDRESS $DICSV) SO THAT KERNEL APR6 CAN BE USEDPD/; EXCLUSIVELY TO MAP THE ISSUING TASK HEADER. SINCE THE DIRECTIVE?0; PROCESSING ROUTINES WILL NOT BE MANIPULATING THE USERS COPY D1; OF THE WDB/RDB, IT WILL BE NECESSARY TO RETURN ANY OUTPUT FIELDSB2; OF THE WDB/RDB AT THE COMPLETION OF DIRECTIVE PROCESSING ALONGD3; WITH THE NORMAL DSW RETURN CODE. THE WORD CONTAINING THE NUMBERB4; OF BYTES TO ADD TO THE USERS SP AT THE COMPLETION OF DIRECTIVEB5; PROCESSING ($BTRMV) IS NEGATED TO INDICATE THAT THE ADDITIONALB6; OUTPUT FIELDS OF THE WDB/RDB MUST BE WRITTEN TO THE USER TASK.7; 8 .IF DF P$$LAS9(: BPL 345$ ;IF PL NOT A PLAS DIRECTIVE: ; BM377EQ:; PUSH ADDRESS OF INTERMEDIATE LINKAGE FOR DISPATCHER FOR INTERMEDIATE ; BM377 P:; CALL TO THIRD DIRECTIVE COMMON (NOTE THAT FOR THIS CASE, DRTBL DOES ; BM3774:; NOT HAVE THE ADDRESS SHIFTED RIGHT. ; B00}âwIwtöt÷tø tþfDATAM377: ; BM377T>: MOV #$DRCL3,-(SP) ;PUSH ADDRESS OF LINKAGE ROUTINE ; BM377: ; BM377I;M MFPD$ (R3) ;PICK UP POINTER TO DEFINITION BLOCK ;**-18SN MOV (SP)+,R3 ; 0O MFPD$ (R3) ;READ/WRITE ACCESS TO FIRST WORD?P MTPD$ (R3) ;1Q MFPD$ 16(R3) ;READ/WRITE ACCESS TO LAST WORD?SR MTPD$ 16(R3) ;ST .IF DF X$$HDRU;V NEG $BTRMV ;INDICATE ADDITIONAL OUTPUT FIELDS TO RETURNEWX .ENDC ; DF X$$HDRY$Z MOV #16.,R2 ;SET SIZE FOR $RELCD-[ CALL $RELCD ;RELOCATE/MAP PLAS DEF. BLOCKT\] .IF DF X$$HDR^/_ MOV R3,(R5)+ ;SAVE KERNEL VA OF USER WDB/RDB 3` MOV KISAR6,(R5)+ ;SAVE KERNEL MAPPING TO WDB/RDBTab .REPT Vc4d MOV (R3)+,(R5)+ ;COPY USER WDB/RDB TO EXEC BUFFERef .ENDRg.h MOV #$DICSV+6,R3 ;POINT TO INTERNAL RDB/WDB0i MOV $SAHDB,KISAR6 ;MAP TO CURRENT TASK HEADERjk .ENDC ; DF X$$HDRlm.n BIC #WS.CRW!WS.UNM!WS.ELW!WS.RRF,W.NSTS(R3)0o MOV $TKTCB,R5 ;POINT TO TASK TCB FOR ROUTINES0o JMP 51$ ;JOIN COMMON DISPATCH CODE ; BM377o ; BM377Ro ; BM377 q ;**-1Ur .ENDC ; DF P$$LASst345$: ;REFERENCE LABELTu;/Fv; HERE WE SPECIAL CASE THE GMCR$ DIRECTIVE AND ADDRESS CHECK THE DPBGw; SINCE THE MFPD$ CHECKS WON'T WORK FOR DPB'S GREATER THAN 32. WORDS.Lx;W-y CMP (PC)+,R1 ;MCR COMMAND LINE DIRECTIVE ?E z .BYTE 127.,41. ;DIC, DPB SIZE{ BNE 35$ ;IF NE NO.-| SUB #2,R3 ;POINT BACK TO BEGINNING OF DPB;-} ;(CAN'T USE TST, R3 NOT KERNEL ADDRESS)I+~ MOV #41.*2,R1 ;SET SIZE TO ADDRESS CHECK 7 CALL $ACHKP ;ADDRESS CHECK AND MAP BLOCK READ/WRITEN2€ TST (R3)+ ;ADVANCE PASTFIRST WORD (TST OK NOW) � BR 355$ ; ‚;AHƒ; HERE WE "ADDRESS CHECK" THE DPB BY COPYING IT TO AN INTERNAL BUFFER.C„; THIS IS FASTER THAN A REAL ADDRESS CHECK AND ELIMINATES SEVERALC…; MAPPING PROBLEMS. †;T/‡35$: JMP $DRLM2(R2) ;JUMP INTO TABLE OF MOVES3ˆ‰ .REPT DPBMAXBŠ+‹ MFPD$ (R3)+ ;GET ONE WORD FROM USER DPB(*Œ MOV (SP)+,(R5)+ ;AND PUT IT IN OUR COPY�Ž .ENDR��;TF‘; THERE MUST BE EXACTLY TWO WORDS BETWEEN THE END OF THE MOVE VECTOR’; AND THE LABEL $DRLM2.P“;R*” MOV #$DICSV+2,R3 ;POINT TO INTERNAL DPB•;E>–; THIS IS THE END OF THE CODE WHICH IS PROTECTED FROM TRAPS.—;0˜$DRLM2:: ;END OF AREA OF A ALLOWED TRAPS AND™ ;NO BREAKPOINTS.š; J›; MAP THE CURRENT TASK HEADER IF EXTERNAL HEADER SUPPORT. IT WILL ETIHERIœ; STAY MAPPED THROUGH THE DIRECTIVE, OR BE REMAPPED TO SEC. POOL TCB IF+�; THE DIRECTIVE CAN USE THEM.ž;.Ÿ  .IF DF X$$HDR¡0¢ MOV $SAHDB,KISAR6 ;MAP TO CURRENT TASK HEADER£¤ .ENDC ; DF X$$HDR¥¦;2C§; SET UP R5 TO POINT TO CURRENT TASK'S TCB FOR DIRECTIVE ROUTINESI¨; ©355$: ;REFERENCE LABELE0ª357$: MOV $TKTCB,R5 ;POINT TO CURRENT TASK TCB«;AG¬; SEE IF DIRECTIVE WAS LEGAL. IF NOT, SKIP FLAGS INTERPRETATION CODE.H­; %® TST (SP) ;LEGAL DIC AND DPB SIZE?H¯ BNE 37$ ;IF NE, YESG° JMP 90$ ;IF EQ, ILLEGALE±37$: ;REFERENCE LABEL²;I9³; BEGIN TO SET UP PARAMETERS FOR DISPATCHING TO ROUTINEM´;A.µ; R5 = TCB ADDRESS OF TASK ISSUING DIRECTIVE¶;;· SWAB R4 ;REARRANGE FLAGS¸ TST R4 ;TEST FLAGS!¹ BEQ 50$ ;IF EQ NO OPTION CODEI&º BMI 40$ ;IF MI TASK ORIENTED FLAGS»; ?¼; PROCESS " C E F N C L " FLAG - CONVERT EVENT FLAG NUMBER TOI½; ADDRESS/BIT MASK PAIRS¾;RE¿; IF THE DIRECTIVE REQUIRES EVENT FLAG LOOKUP OR PROCESSING, DO SO.3À;IÁ/ ROR R4 ;INCREMENT USE COUNT IF GRP GLOBAL ?R4à BCS 38$ ;IF CS DON'T INCREMENT GRP GBL USE COUNT5Ä CALL $CEFNG ;CONVERT EFN AND LOCK IF GROUP GLOBALOÅ BR 39$ ;JOIN COMMON CODEÆ38$: ;REF LABEL)Ç CALL $CEFN ;CONVERT EVENT FLAG NUMBER$2È BIC #1,R1 ;CLR GROUP GLOBAL 2ND MASK INDICATOR+É39$: BCC 50$ ;IF CC EVENT FLAG SPECIFIED Ê;G?Ë; PROCESS " C E F N M T " FLAG - EVENT FLAG MUST BE SPECIFIEDÌ;!Í ROR R4 ;EVENT FLAG REQUIRED ? Î BCC 50$ ;IF CC NO, OKDÏ;3%Ð; REQUIRED EVENT FLAG NOT SPECIFIEDOÑ;F&Ò DRSTS D.RS97 ;SET DIRECTIVE STATUSÓ;E=Ô; 00}êwÍwt´cÚµcÛ¶c�·c›’PROCESS " S R S T C L " FLAG - CALL $SRSTD TO LOOK UP TCBFÕ;PÖ;AI×; NOW PROCESS TASK LOOKUP OPTIONS. THE BEQ BELOW TAKES CARE OF BOTH THEVFØ; CASE WHERE NO $SRSTD CALL IS SPECIFIED, AND THE CASE WHERE WE JUST$Ù; FINISHED PROCESSING EVENT FLAGS.Ú;F@Û; NOTE: ******************************************************Ü;FDÝ; THIS SECTION SHOULD EVENTUALLY CALL $SRMUT EVEN IF $SRXXX FAILS.Þ;ß;Jà; PROCESS " S E C T C B " FLAG - CALL $SRPRO TO LOOK UP TCB IN SECONDARY"á; OR PRIMARY POOL TASK LISTSâ; 1ã40$: ASLB R4 ;TASK ALLOW SECONDARY POOL TCBS ?ä BPL 405$ ;IF PL NO"å CALL $SRPRO ;LOOK UP TASK NAME"æ BCS 402$ ;IF CS TASK NOT FOUND&ç BIT #1,R0 ;TCB IN SECONDARY POOL ?è BEQ 401$ ;IF EQ NO"é DEC R0 ;POINT BACK TO APR BIAS(ê MOV (R0),KISAR6 ;MAP TCB THROUGH APR6ë MOV #140000,R0 ;POINT TO TCBS-ì401$: CMP (R3)+,(R3)+ ;POINT PAST TASK NAMERí;A@î; PROCESS " C R E T C B " FLAG - DIRECTIVE MAY CREATE TCB FROMï; MULTI-USER TASK TCB.ð; )ñ ASLB R4 ;CAN DIRECTIVE CREATE A TCB ?L+ò BPL 43$ ;IF PL NO, DO MULTI-USER CHECKSB$ó BR 46$ ;ELSE YES, SKIP MU CHECKSô;PAõ; $SRPRO OR $SRSTD COULD NOT FIND THE PROTOTYPE. SEE IF WE NEEDI3ö; TO SUBSTITUTE XXXTNN AND DO SO OR RETURN STATUS ÷;Nø.ù402$: ASLB R4 ;CAN DIRECTIVE CREATE A TCB ?)ú BMI 110$ ;IF MI YES, PROTO MUST EXIST4û403$: CMP (R3),#^R... ;TASK NAME FOLLOW MULTI-USERü ;CONVENTION ? (...XXX)(ý BNE 110$ ;IF NE NO, PROTO MUST EXIST/þ MOV 2(R3),R1 ;SET FIRST HALF OF MU TASK NAMER)ÿ MOV T.UCB(R5),R0 ;SET TERM UCB ADDRESSN* CMP (R3)+,(R3)+ ;ADVANCE PAST TASK NAME% MOV R3,-(SP) ;AND SAVE DPB POINTER % CALL $SRMUT ;LOOK FOR MU TASK TCBE$ MOV (SP)+,R3 ;RESTORE DPB POINTER  BCC 46$ ;IF CC MU TASK FOUND BR 110$ ;ELSE ERRORA;VE; PROCESS " D F C T S K " FLAG - TASK NAME DEFAULTS TO CURRENT TASKM ;)5 405$: ASLB R4 ;TASK NAME DEFAULT TO CURRENT TASK ?   BPL 41$ ;IF PL NO '  MOV R5,R0 ;PICK UP CURRENT TASK TCB)"  TST (R3) ;TASK NAME SPECIFIED? BEQ 42$ ;IF EQ NOS-41$: CALL $SRSTD ;SEARCH STD FOR TASK NAMEC& BCS 403$ ;IF CS TASK NOT IN SYSTEM.42$: CMP (R3)+,(R3)+ ;ADVANCE PAST TASK NAME;CH; IF SPECIFIED TASK IS A MULTI-USER (...XXX) TASK, LOOK FOR LOCAL COPY;BE43$: CMP T.NAM(R0),#^R... ;DOES NAME FOLLOW MULTI-USER CONVENTION ?  BNE 46$ ;IF NE NOT! MOV R0,-(SP) ;SAVE TCB POINTERK! MOV R3,-(SP) ;SAVE DPB POINTER= MOV T.NAM+2(R0),R1 ;PICK UP FIRST WORD OF COPY'S TASK NAME9 MOV T.UCB(R5),R0 ;PICK UP TI: UCB FOR NAME CALCULATION3 CALL $SRMUT ;SEARCH STD FOR MULTIUSER TASK COPYS$ MOV (SP)+,R3 ;RESTORE DPB POINTER BCC 45$ ;IF CC COPY FOUNDT- MOV (SP),R0 ;RESTORE ORIGINAL TCB ADDRESSL45$: TST (SP)+ ;CLEAN STACK 46$: ;REF LABEL!;PH"; PROCESS " M U P C H K " FLAG - PERFORM MULTI-USER PROTECTION CHECKS.#;E2$ ASLB R4 ;PERFORM MULTI-USER PROTECTION CHECK ?% BPL 49$ ;IF PL NO2& BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED?' BNE 49$ ;IF NE YES3( BIT #T3.SLV,T.ST3(R0) ;TARGET TASK A SLAVE TASK?C$) BNE 120$ ;IF NE YES, DON'T ALLOW?* CMP T.UCB(R5),T.UCB(R0) ;CURRENT AND TARGET TASK UCBS MATCH? + BNE 120$ ;IF NE NO,;06-; SET UP PARAMETERS FOR DIRECTIVE PROCESSING ROUTINE.;A#/49$: MOV R0,R1 ;COPY TCB ADDRESSR,0 ADD #T.STAT,R1 ;POINT TO TASK STATUS WORD%050$: ;REFERENCE LABEL ; BM377 0 ; BM377R0 .IF DF D$$PAR ; BM377 0 ; BM377V<0 ASL (SP) ;DIRECTIVE IN FIRST OR SECOND COMMON ? ; BM377*0 BCC 51$ ;IF CC ITS IN FIRST ; BM377>0 MOV #$DRCL2,-(SP) ;PUSH ADDRESS OF LINKAGE ROUTINE ; BM3770 ; BM377N"0 .ENDC ; DF D$$PAR ; BM3770 ; BM377B051$: MOV R5,R2 ;SET POINTER TO SECOND TASK STATUS WORD ; BM3772 ADD #T.ST2,R2 ; ;**-13;+4; ** W A R N I N G **K5;U6; SPM HOOKPOINT NUMBER 01.7; +8; DO NOT CHANGE THE INSTRUCTION FOLLOWING$9; LABEL WITHOUT CHECKING SPM:;-;-<$SPH01==. ;SPM CHANGES THE INSTRUCTION ATM!= ;THE LOCATION 00}òwIwtöt÷tø tþfDATAOF THIS LABELI>0? MOV @#$SAHPT,R4 ;POINT TO CURRENT TASK HEADER@AB;G8C; CALL DIRECTIVE ROUTINE WITH THE FOLLOWING ARGUMENTS:D; .E; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.1F; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.35G; R3=ADDRESS OF THE NEXT WORD IN THE DIRECTIVE DPB.NBH; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.I; R1=DEPENDENT ON DIRECTIVE.J; R0=DEPENDENT ON DIRECTIVE.K;5\55$: CALL @(SP)+ ;CALL DIRECTIVE ROUTINE ;**-16 \ ; BM377I\ .IF DF D$$PAR ; BM377;\ ; BM377 >\$DRFIN:: ;REFERENCE LABEL FOR COMMON LINK ROUTINES ; BM377\ ; BM377"\ .ENDC ; DF D$$PAR ; BM377\ ; BM377D];OC^; INCREMENT GROUP GLOBAL USE COUNTS (OR SCRATCH WORD IF DIRECIVESN_; DON'T USE GROUP GLOBALS)`;Sa59$: ;REFERENCE LABELbc .IF DF G$$GEFd1e INC @$GEFPT ;INCREMENT GROUP GLOBAL USE COUNT f3g INCB @$GFTCB ;INC GRP GLOBAL USE COUNT FOR TASKThi .ENDC ; DF G$$GEFjk;I)l; WRITE DIRECTIVE STATUS BACK INTO TASK m; 0n60$: MTPD$ @#H.DSW ;SET DIRECTIVE STATUS WORDo;OFp; IF THE NUMBER OF BYTES TO REMOVE FROM USER STACK IS NEGATIVE, THENGq; WE HAVE JUST PROCESSED A PLAS DIRECTIVE. WE MUST RETURN THE OUTPUTCGr; FIELDS TO THE USER TASK (RDB/WDB) FROM THE INTERMEDIATE BUFFER AREARs;Nt; OUTPUT FIELDS IN WDB/RDBu;8v; W.NID W.NBAS W.NRID W.NLEN W.NOFF W.NSTS8w; R.GID R.GSIZ R.GSTSx;Cyz .IF DF X$$HDR{0| TST $BTRMV ;JUST FINISHED A PLAS DIRECTIVE ?} BPL 65$ ;IF PLUS, NO"~ NEG $BTRMV ;YES, TURN OFF FLAG6 MOV #$DICSV+2,R0 ;POINT TO INTERMEDIATE EXEC BUFFER-€ MOV (R0)+,R1 ;RESTORE KERNEL VA OF WDB/RDBT&� MOV (R0)+,KISAR6 ;MAP USERS WDB/RDB‚ƒ MOV (R0)+,(R1)+ ;W.NID R.GIDT!„ MOV (R0)+,(R1)+ ;W.NBAS R.GSIZ(… CMP (R0)+,(R1)+ ;W.NSIZ R.GNAM (SKIP)!† MOV (R0)+,(R1)+ ;W.NRID R.GNAMW!‡ MOV (R0)+,(R1)+ ;W.NOFF R.GPAR !ˆ MOV (R0)+,(R1)+ ;W.NLEN R.GPARS!‰ MOV (R0)+,(R1)+ ;W.NSTS R.GSTSŠ65$: ;REFERENCE LABEL‹Œ .ENDC ; DF X$$HDR�Ž; J�; GET USER STACK POINTER AND UPDATE TO REMOVE DPB OR ADDRESS OF DPB FROM�; THE STACK.‘;F#’ MFPI SP ;GET USER STACK POINTERA0“ ADD $BTRMV,(SP) ;REMOVE BYTES FROM USER STACK'” MTPI SP ;RESTORE USER STACK POINTER•;VJ–; END OF DIRECTIVE PROCESSING, GO BACK TO SYSTEM ENTRANCE/EXIT ROUTINES.—;0˜ RETURN ;EXIT FROM TRAPM™š;(!›; EMT/TRAP SST ROUTINE TRANSFER(œ;;�ž80$: ;REFERENCE LABELŸ  .IF DF X$$HDR¡1¢ MOV $SAHPT,R5 ;GET ADDR OF CURRENT TASK HEADER2£ MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER¤¥ .IFFE¦1§ MOV $HEADR,R5 ;GET ADDR OF CURRENT TASK HEADERU¨© .ENDC ;X$$HDRª5« MOV H.WND(R5),R5 ;POINT TO NUMBER OF WINDOW BLOCKS 1¬ TST W.BLVR+2(R5) ;CURRENT TASK MAPPED TO EXEC?C­ BEQ 85$ ;IF EQ NOK.® CMP (SP),#104376 ;IS THIS A CALL TO $SWSTK?¯ BNE 85$ ;IF NE NO&° JMP $SWSTK ;PROCESS CALL TO $SWSTK%±85$: JMP $EMSST ;PROCESS SST FAULTB²³;´; ILLEGAL DIRECTIVEMµ;A¶*·90$: DRSTS D.RS99 ;SET DIRECTIVE STATUS¸¹;I,º; REQUIRED EVENT FLAG NUMBER NOT SPECIFIED»;¼+½100$: DRSTS D.RS97 ;SET DIRECTIVE STATUSE¾¿;3À; SPECIFIED TASK NAME NOT FOUND IN TASK DIRECTORYBÁ; Â*Ã110$: DRSTS D.RS2 ;SET DIRECTIVE STATUSÄÅ;TÆ; PRIVILEGE VIOLATION Ç;KÈÉÊ .IF DF M$$MUPË+Ì120$: DRSTS D.RS16 ;SET DIRECTIVE STATUSÍÎ .ENDCÏÐÑ;TÒ; ALLOCATION FAILUREÓ;;ÔÕÖ .IF DF R$$DSP×*Ø130$: DRSTS D.RS1 ;SET DIRECTIVE STATUSÙÚ .ENDCÛÜ Ý .DSABL LSBÞß .ENDUIRED EVENT FLAG NUMBER NOT SPECIFIED»;¼+½100$: DRSTS D.RS97 ;SET DIRECTIVE STATUSE¾¿;3À; SPECIFIED TASK NAME NOT FOUND IN TASK DIRECTORYBÁ; Â*Ã110$: DRSTS D.RS2 ;SET DIRECTIVE STATUSÄÅ;TÆ; PRIVILEGE VIOLATION Ç;KÈÉÊ .IF DF M$$MUPË+Ì120$: DRSTS D.RS16 ;SET DIRECTIVE STATUSÍÎ .ENDCÏÐÑ;TÒ; ALLOCATION FAILUREÓ;;ÔÕÖ .IF DF R$$D00~úwÍwt´cÚµcÛ¶c�·c›’ .TITLE DRDRV  .IDENT /14.03/T; 6; COPYRIGHT (C) 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;D<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;.; P. J. BEZEREDI 19-SEP-79;O$; MODIFIED FOR RSX-11M-PLUS V2.1 BY:; ; P.J. BEZEREDIR ; P.J. CARRS ; J. GALLANT;U; MODIFIED BY:; ; C. SESTOKAS 22-FEB-84 14.01 ; 0; CS001 -- HCRC ERROR RECOVERY - R1 NOT SETUP (; IN DROFF ROUTINE MODIFIES LOWCORE.;; L. KOGAN 17-APR-84 14.02;I9; LK001 -- CORRECT THE PROBLEM WITH ENTERING MEANINGLESSS ; ENTRIES INTO ERROR LOG FILE;R; B. S. MCCARTHY 6-AUG-85 14.03 ;D/; BM368 -- ADD CONDITIONAL SKIP OF FIRST DRIVEF!; NOT READY ERROR FOR POWERFAILI;-;-;;; RH11/RH70-RM02/RM03/RM05/RM80/RP07 OVERLAPPED SEEK DRIVERR;  .MCALL HWDDF$,PKTDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;O,; DEVICE REGISTER AND STATUS BIT DEFINITIONS;E%RMCS1=0 ;CONTROL STATUS REGISTER 1-IE=100 ;INTERRUPT ENABLECTRE=40000 ;TRANSFER ERRORE*MCPE=20000 ;MASSBUS CONTROL PARITY ERROR#DVA=4000 ;DRIVE AVAILABLE TO PORT RMWC=2 ;WORD COUNT REGISTER"RMBA=4 ;BUFFER ADDRESS REGISTER(RMDA=6 ;DESIRED TRACK/SECTOR REGISTER%RMCS2=10 ;CONTROL STATUS REGISTER 2KDLT=100000 ;DATA LATE ERRORTWCE=40000 ;WRITE CHECK ERROR UPE=20000 ;UNIBUS PARITY ERROR#NED=10000 ;NONEXISTENT DISK ERRORE$NEM=4000 ;NONEXISTENT MEMORY ERRORPGE=2000 ;PROGRAMMING ERRORE!MXF=1000 ;MISSED TRANSFER ERRORC%MDPE=400 ;MASSBUS DATA PARITY ERROR0!RMDS=12 ;DRIVE STATUS REGISTERVERR=40000 ;ERROR SUMMARY BIT$PIP=20000 ;POSITIONING IN PROGRESSMOL=10000 ;MEDIUM ONLINEWRL=4000 ;WRITE LOCKED DRIVE$PGM=1000 ;PROGRAMMABLE PORT SELECT!DPR=400 ;DRIVE PRESENT ON PORT DRY=200 ;DRIVE READY0VV=100 ;VOLUME VALIDOM=1 ;OFFSET MODE ACTIVER"RMER1=14 ;ERROR SUMMARY REGISTERDCK=100000 ;DATA CHECK ERRORUNS=40000 ;DRIVE UNSAFEN!OPI=20000 ;OPERATION INCOMPLETEEDTE=10000 ;DRIVE TIMING ERRORAWLE=4000 ;WRITE LOCK ERROR IAE=2000 ;INVALID DISK ADDRESSAOE=1000 ;ADDRESS OVERFLOWHCRC=400 ;HEADER CRC ERROR HCE=200 ;HEADER COMPARE ERRORECH=100 ;ECC HARD ERRORWCF=40 ;WRITE CLOCK FAILUREFER=20 ;FORMAT ERRORR#PAR=10 ;CONTROL BUS PARITY ERRORD!RMR=4 ;REGISTER MODIFY REFUSED ILR=2 ;ILLEGAL REGISTERILF=1 ;ILLEGAL FUNCTION&RMAS=16 ;ATTENTION SUMMARY REGISTER RMDBR=22 ;DATA BUFFER REGISTER RMMR=24 ;MAINTENANCE REGISTERRMDT=26 ;DRIVE TYPE REGISTER0!RMOF=32 ;DRIVE OFFSET REGISTERNCMOD=100000 ;COMMAND MODIFIERR"MTD=40000 ;MOVE TRACK DESCRIPTOR FMT16=10000 ;FORMAT (1=16 BIT)ECI=4000 ;ECC INHIBITA"HCI=2000 ;HEADER COMPARE INHIBIT&SSEI=1000 ;SKIP SECTOR ERROR INHIBIT%RMDC=34 ;DESIREDED CYLINDER NUMBERI#RMCC=36 ;CURRENT CYLINDER NUMBERARMER2=42 ;ERROR REGISTER 2BSE=100000 ;BAD SECTOR ERROR"SKI=40000 ;SEEK INCOMPLERE ERROR"IVC=10000 ;INVALID COMMAND ERROR&LSC=4000 ;LOSS OF SECTOR CLOCK ERROR#LBC=2000 ;LOSS OF BIT CLOCK ERRORGDVC=200 ;DEVICE CHECK ERRORSSE=40 ;SKIP SECTOR ERROR$DPE=10 ;MASSBUS DATA PARITY ERROR!RMEC1=44 ;ECC POSITION REGISTERA RMEC2=46 ;ECC PATTERN REGISTER;S; LOCAL EQUATED SYMBOLSR;I,XCT=1 ;FUNCTION HAS BEEN EXECUTED (1=YES)'ERL=2 ;ERROR HAS BEEN LOGGED (1=YES)%ADR=10 ;ADDRESS BITS SETUP (1=YES)0'SEL=20 ;PORT SELECT WAIT (1=WAITING)EOFA=100 ;OFFSET ACTIVE FLAG(RETRY=8. ;CONTROLLER ERROR RETRY COUNT;T ; LOCAL DATA;B.DELTA: .WORD 3 ;ROTATIONAL OPTIMIZATION DELTA;C=; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLER NUMBER)T;A7RTTBL: .BLKW R$$M11 ;RETRY COUNT FOR CURRENT OPERATION 5OFFAD: .BLKW R$$M11 ;ADDRESS OF CURRENT OFFSET VALUE0DGTBL: .BLKW R$$M11 ;DIAGNOSTIC PARAMETER TABLE=PRMSV: .BLKW R$$M11*5 ;PARAMETER SAVE AREA FOR ERROR RECOVERYB ;AND WRITE CHECK&SAVWC: .BLKW R$$M11 ;SAVED WORD00~xIwtöt÷tø tþfDATA COUNT=DLTWC: .BLKW R$$M11 ;SAVED WORD COUNT FOR DATA LATE RECOVERYT.$DROPT::.REPT R$$M11 ;SEEK OPTIMIZATION TABLE/ .WORD 1 ;0=IMPLIED SEEK; 1=ALWAYS SEEK FIRSTO .ENDR;A ; OFFSET POSITIONING VALUE TABLE;R"OFFTB: .WORD FMT16!0 ;PLUS OFFSET .WORD FMT16!200 ;MINUS OFFSET .WORD 0 ;$;;; DIAGNOSTIC FUNCTION TABLEU;$FUNTBL: .BYTE 107, IO.HMS!IQ.UMD&377 .BYTE 105, IO.BLS!IQ.UMD&377  .BYTE 115, IO.OFF!IQ.UMD&377R$FUNTB: .BYTE 135, IO.DGN!IQ.UMD&377 .BYTE 151, IO.WCK!IQ.UMD&377T$FUNTB1: .BYTE 171, IO.RPD!IQ.UMD&377 .BYTE 161, IO.WPD!IQ.UMD&377O .BYTE 171, IO.CER!IQ.UMD&377A .BYTE 161, IO.CEW!IQ.UMD&377D$FUNTB2: .BYTE 173, IO.RDH!IQ.UMD&377 .BYTE 163, IO.WDH!IQ.UMD&377E .BYTE 175, IO.RTD!IQ.UMD&3776 .BYTE 165, IO.WTD!IQ.UMD&3772$FUNTB3: .BYTE 165, IO.TDD!IQ.UMD&377FUNTBE:T;N; DRIVER DISPATCH TABLEL;B2 DDT$ DR,R$$M11,,,,,,OPT ;GENERATE DISPATCH TABLE;+7; **-DRINI-RH11/RH70-RM02/RM03/RM05/RM80/RP07 DISK PACK!; CONTROLLER INITIATOR;WE; THIS IS THE DRIVER ENTRY POINT FROM THE QUEUE I/O DIRECTIVE WHEH ANDE; I/O REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO&F; PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED UNIT IS NOTF; BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSEG; A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPT SUCCEEDS,LE; THEN THE NEXT I/O OPERATION IS INITIATED AND A RETURN TO THE CALLERD; IS EXECUTED.;/ ; INPUTS:M;R6; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIALIZED.;R ; OUTPUTS:;TA; IF THE SPECIFIED UNIT IS NOT BUSY AND AN I/O REQUEST IS WAITING A; TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-O; ATION IS INITIATED.E;-7DRINI: GTPKT$ DR,R$$M11 ;GET NEXT I/O PACKET TO PROCESSE;E1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:I;X'; R1=ADDRESS OF THE I/O REQUEST PACKET.L-; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.D; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.A6; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIALIZED.;P=; RH11/RH70-RM02/03/RP07 DISK PACK I/O REQUEST PACKET FORMAT:T; "; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK. @; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.5; WD. 04 -- FIRST LUN WORD IN REQUESTORS TASK HEADER.K; WD. 05 -- I/O FUNCTION CODE.0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.=; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000).M3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.A; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER.V+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.T-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED. <; WD. 15 -- DIAGNOSTIC SUPPLIMENTAL PARAMETER ELSE NOT USED.8; WD. 16 -- BITS <0:7> = HIGH LBN, BITS <8:15> NOT USED.#; WD. 17 -- LOW LBN OF I/O REQUEST.R.; WD. 20 -- RELOCATION BIAS OF REGISTER BLOCK.;; WD. 21 -- REGISTER BLOCK ADDRESS (DISPLACEMENT + 140000).E;(# CLRB U.CW2+1(R5) ;RESET UNIT FLAGSI$ CALL $VOLVD ;VALIDATE VOLUME VALID BCS 10$ ;IF CS WE FAILED TST R0 ;TRANSFER FUNCTION? BMI DRRQC ;IF MI YES) JMP DRVV ;PROCESS VOLUME VALID FUNCTION-10$: CALL $IODON ;FINISH I/OR" BR DRINI ;TRY FOR ANOTHER PACKET;A*; REQUEST CONTROLLER FOR PROPER OPERATION.;:0DRRQC: MOV S.KRB(R4),R1 ;GET CURRENT KRB ADDRESS5 BIT #KS.POE,K.STS(R1) ;PARALLEL OPERATIONS ENABLED?F BEQ DRRQC1 ;IF EQ NO. MOV S.PKT(R4),R3 ;RETRIEVE I/O PACKET ADDRESS* BITB #IQ.Q,I.FCN(R3) ; EXPRESS FUNCTION ? BNE DRRQC1 ; IF NE YES. BITB #IQ.UMD,I.FCN(R3) ; DIAGNOSTIC REQUEST ? BNE 20$ ; IF NE YEST- MOVB K.CON(R1),R3 ;RETREIVE CONTROLLER INDEXS# TST $DROPT(R3) ;WHICH SEEK METHOD?I" BNE 10$ ;IF NE ALWAYS SEEK FIRST3 BIT #KS.DIP,K.STS(R1) ;DATA TRANSFER IN PROGRESS?E+ BEQ DRRQC1 ;IF EQ NO, START DATA TRANSFERT210$: BISB #S3.SIP,S.ST3(R4) ;SET SEEK IN PROGRESS6 CALL $RQCNC ;REQUEST CONTROLLER FOR CONTROL FUNCTION JMP DRINIO ; INITIATE I/OK320$: MOV00~ xÍwt´cÚµcÛ¶c�·c›’ #FUNTBL,R0 ; GET ADDRESS OF FUNCTION TABLE?)25$: TSTB (R0)+ ; BYPASS CONTROLLER CODE.+ CMPB (R0)+,I.FCN(R3) ; FUNCTION CODE MATCHF BEQ 30$ ; IF EQ YES1" CMP #FUNTB,R0 ; AT END OF TABLE ? BNE 25$ ; IF NE NO, BR DRRQC1 ; YES - NORMAL TRANSFER FUNCTION.30$: TSTB -(R0) ; POINT BACK TO FUNCTION CODE, MOVB -(R0),U.BUF(R5) ; LOAD CONTROLLER CODE BR 10$ ; TREAT AS A SEEK ;DRRQC1: BICB #S3.SIP,S.ST3(R4) ;SET SEEK ALREADY COMPLETEDL3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFERK;: ; **-DRUBMP-SETUP UNIBUS ADDRESS;T>; THIS SECTION OF CODE WILL DETERMINE IF THE UNIBUS ADDRESS IS@; ALREADY IN THE FORMAT FOR THE MASSBUS CONTROLLER OR THE UNIBUS<; MAP FOR 22-BIT PROCESSORS WITHOUT RH CONTROLLERS. IT WILLA; ALSO CONVERT THE I/O FUNCTION CODE TO IT'S HARDWARE EQUIVALENT. ;F>; NOTE: AT THIS POINT THE REQUESTING UNIT MUST BE THE OWNER OF%; THE CONTROLLER FOR A DATA TRANSFER.#;S.DRUBMP: MOV S.KRB(R4),R1 ;RETREIVE KRB ADDRESS2 BITB #ADR,U.CW2+1(R5);ADDRESS BITS ALREADY SETUP? BNE DRINIO ;IF NE YESS/ BIT #FE.EXT,$FMASK ;22-BIT ADDRESSING ENABLED?N BEQ 10$ ;IF EQ NOS: BIT #KS.MBC,K.STS(R1) ;YES, IS THIS A 22-BIT CONTROLLER? BNE 20$ ;IF NE YES' CALL $STMAP ;SETUP UNIBUS MAP ADDRESS 210$: ASL U.BUF(R5) ;SHIFT BITS <4:5> TO BITS <8:9> ASL U.BUF(R5) ;...T ASL U.BUF(R5) ;...I ASL U.BUF(R5) ;...G/ BIT #FE.EXT,$FMASK ;22-BIT ADDRESSING ENABLED?A BEQ 20$ ;IF EQ NO% CALL $MPUBM ;MAP UNIBUS TO TRANSFERB:20$: BISB #ADR,U.CW2+1(R5);INDICATE ADDRESS SETUP COMPLETE* MOV S.KRB(R4),R0 ;GET CURRENT KRB ADDRESS- MOVB K.CON(R0),R0 ;RETRIEVE CONTROLLER INDEX . MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS7 MOV I.PRM+6(R1),DGTBL(R0) ;SAVE DIAGNOSTIC PARAMETERSS. MOV #OM,I.PRM+6(R1) ;SET OFFSET MODE INACTIVE; 3; CONVERT I/O FUNCTION CODE TO HARDWARE EQUIVALENT.U;F4 CMPB #IO.HMS/256.,I.FCN+1(R1) ;DIGNOSTIC FUNCTION? BNE 40$ ;IF NE NOA* CALL DRFUN ;TEST FOR DIAGNOSTIC FUNCTION BCC 25$ ;IF CC NOE6 BIS #SSEI,I.PRM+6(R1) ;SET SKIP SECTOR ERROR INHIBIT225$: MOV #FUNTBL,R0 ;GET ADDRESS OF FUNCTION TABLE830$: MOVB (R0)+,U.BUF(R5) ;LOAD CONTROLLER FUNCTION CODE. CMPB (R0)+,I.FCN(R1) ;IS IT THE CORRECT CODE? BEQ 35$ ;IF EQ YES' CMP #FUNTBE,R0 ;END OF FUNCTION TABLE?6 BNE 30$ ;IF NE NO % MOV #IE.IFC&377,R0 ;ILLEGAL FUNCTIOND BR 45$ ;FINISH I/O435$: CMPB #10,U.CW2(R5) ;TEST HI LBN, IS IT AN RP07? BNE 60$ ;IF NE NOI) CMP #FUNTB2,R0 ;IS IT A HEADER FUNCTION?  BLO 60$ ;IF LO NOI/ CMP #FUNTB3,R0 ;IS TRACK DESCRIPTOR DISPLACED?R BNE 60$ ;IF FM NOM3 BIS #MTD,I.PRM+6(R1);SET MOVE TRACK DESCRIPTOR BITV BR 60$ ;040$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION2 MOVB #171,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTION7 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION? $ BHIS 50$ ;IF HIS FUNCTION IS LEGAL,45$: MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS, MOVB U.UNIT(R5),RMCS2(R2) ;SELECT THE UNIT JMP DRFIN1 ;FINISH I/O'50$: BEQ 60$ ;IF EQ FUNCTION IS A READO0 MOVB #161,U.BUF(R5) ;SET WRITE LOGICAL FUNCTION+60$: MOV S.KRB(R4),R3 ;RETRIEVE KRB ADDRESS#- MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX$ MUL #5,R3 ;SETUP AN INDEX INTO ...' ADD #PRMSV,R3 ;... PARAMETER SAVE AREAR& MOV U.BUF(R5),(R3)+ ;SAVE PARAMETERS MOV U.BUF+2(R5),(R3)+ ;... MOV U.CNT(R5),(R3)+ ;... MOV I.PRM+10(R1),(R3)+ ;... MOV I.PRM+12(R1),(R3)+ ;...E;A%; **-DRINIO-INITIATE AN I/O OPERATIONL; E; THIS ROUTINE WILL INITIATE EITHER A SEEK OR THE DATA TRANSFER OPER-R6; ATION DEPENDING ON HOW THE CONTROLLER WAS REQUESTED.;: ; INPUTS:R;R; R4=ADDRESS OF THE SCB.; R5=ADDRESS OF THE UCB.;C*DRINIO: MOV @S.KRB(R4),R2 ;GET CSR ADDRESS) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSE( MOVB U.UNIT(R5),RMCS2(R2) ;SELECT UNIT;S9; DETERMINE IF DRIVE'S PORT IS SEIZED BY THIS CONTROLLER.;V' MTPS #PR5 ;EXECUTE AT DEVICE PRIORITY(+ CLR RMDS(R2) ;;;ATTEMPT TO SEIZE THE DRIVEA* BIT #DPR,RMDS(R2) ;;;DID THE DRIVE SEIZE? BNE 5$ ;;;IF NE YES 2 BISB #SEL,U.CW2+1(R5);;;SET PORT SELECT WAIT FLAG/ MOVB S.ITM(R4),S.CTM(R4) ;;;SET TIMEOUT COUNT$ CLR S.FRK+2(R00~xIwtöt÷tø tþfDATA4) ;;;ALLOW INTERRUPTS& MOVB #IE,(R2) ;;;RE-ENABLE INTERRUPTS MTPS #0 ;;;ALLOW INTERRUPTSP* CALLR $RLCN ;RELEASE CONTROLLER AND EXIT;T1; CHECK IF THE HEADS ARE ON THE CORRECT CYLINDER.I;S*5$: MOVB #111,(R2) ;;;CLEAR SELECTED DRIVE0 BITB #S3.SIP,S.ST3(R4) ;;;ARE WE DOING A SEEK? BEQ 10$ ;;;IF EQ NO 1 BITB #IQ.UMD,I.FCN(R1) ;;; DIAGNOSTIC FUNCTION ?Z BNE 20$ ;;; IF NE YES . BIT #40,RMDT(R2) ;;;IS THIS AN RM02/03/05/80?& BEQ 20$ ;;;IF EQ YES, IT HAS NO RMCC2 CMP RMCC(R2),I.PRM+10(R1) ;;;DO WE NEED TO SEEK? BNE 20$ ;;;IF NE YES MTPS #0 ;ALLOW INTERRUPTS;# JMP DRRQC1 ;GO REQUEST CONTROLLERL;E.; LOAD CONTROLLER REGISTERS FOR DATA TRANSFER.;O210$: ADD #RMCS2,R2 ;;;POINT TO SECOND CSR REGISTER7 MOV I.PRM+12(R1),-(R2) ;;;INSERT TRACK/SECTOR ADDRESSD0 MOV U.BUF+2(R5),-(R2) ;;;INSERT BUFFER ADDRESS: MOV U.CNT(R5),-(R2) ;;;INSERT NUMBER OF BYTES TO TRANSFER# ROR (R2) ;;;CONVERT TO WORD COUNT & NEG (R2) ;;;MAKE NEGATIVE WORD COUNT" TST -(R2) ;;;POINT BACK TO RMCS15 CMP #IO.DGN!IQ.UMD,I.FCN(R1) ;;;DIAGNOSE MICROCODE? BNE 20$ ;;;IF NE NOU, MOV S.KRB(R4),R0 ;;;GET CURRENT KRB ADDRESS0 MOVB K.CON(R0),R0 ;;;RETRIEVE CONTROLLER NUMBER3 MOV DGTBL(R0),RMMR(R2) ;;;SET DIAGNOSE PARAMETERSR;M'; CHECK FOR DRIVE NOT READY CONDITIONS.C; 120$: MOV #IE.DNR&377,R0 ;;;ASSUME DRIVE NOT READYA; MOV I.PRM+10(R1),RMDC(R2) ;;;SET DESIRED CYLINDER ADDRESSN, MOV RMDS(R2),R3 ;;;GET CURRENT DRIVE STATUS COM R3 ;;;COMPLEMENT STATUSC, BIT #MOL!DRY,R3 ;;;DRIVE READY AND ON LINE? BNE 30$ ;;;IF NE NO1$ BIT #UNS,RMER1(R2) ;;;DRIVE UNSAFE? BEQ 70$ ;;;IF EQ NOB!30$: MTPS #0 ;;;ALLOW INTERRUPTS/ BITB #US.SPU,U.STS(R5) ;IS DRIVE SPINNING UP? BEQ 50$ ;IF EQ NO25 BITB #US.VV,U.STS(R5);WAS VOLUME PREVIOUSLY MOUNTED?O BEQ 35$ ;IF EQ NO) JMP DRPWF0 ;YES, WAIT FOR IT TO SPIN UP &35$: JMP DRPWF1 ;WAIT JUST 15 SECONDS350$: BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC OPERATION?; BEQ 60$ ;IF EQ NOT+ JMP DRDIAG ;PASS REGISTERS AND FINISH I/O!60$: ;REFERENCE LABEL .IF DF S2.NRD6 BIT #S2.NRD,S.ST2(R4) ;IS THIS FIRST DRIVE NOT READY?! BNE 61$ ;IF NE NO, GO LOG ERROR;6 BIS #S2.NRD,S.ST2(R4) ;INDICATE FIRST DRIVE NOT READY JMP DRPWF1 ;GO DO A RETRYQ761$: BIC #S2.NRD,S.ST2(R4) ;CLEAR FIRST DRIVE NOT READYD .ENDC ; DF S2.NRD( CALL $DVERR ;LOG DRIVE NOT READY ERROR JMP DRFIN1 ;FINISH I/O370$: BIT #VV,R3 ;;;DID VOLUME VALID STATUS CHANGE?O1 BEQ 75$ ;;;IF EQ NO (NOTE REVERSE STATUS OF VV) 0 BITB #US.SPU,U.STS(R5) ;;;DID WE JUST SPIN UP? BEQ 30$ ;;;IF EQ NON* MOVB #123,(R2) ;;;YES, RESET VOLUME VALID2 BISB #US.VV,U.STS(R5);;;SET SOFTWARE VOLUME VALID375$: BIT #S2.MAD,S.ST2(R4) ;;;MULTI-ACCESS DEVICE?A BEQ 90$ ;;;IF EQ NO . CMP S.KRB(R4),S.KTB(R4) ;;;IS THIS PORT 'A'? BNE 80$ ;;;IF NE NO.0 BICB #S3.SPA,S.ST3(R4) ;;;YES, SHOW IT SPUN UP BR 85$ ;;;380$: BICB #S3.SPB,S.ST3(R4) ;;;IT MUST BE PORT 'B'E385$: BITB #S3.SPU,S.ST3(R4) ;;;BOTH PORTS SPUN UP?E BNE 95$ ;;;IF NE NOB; $; PREPARE TO START AN I/O OPERATION.;?790$: BICB #US.SPU,U.STS(R5) ;;;RESET DRIVE SPINNING UPO+95$: CLR S.FRK+2(R4) ;;;INIT FORK INTERLOCKW/ MOVB S.ITM(R4),S.CTM(R4) ;;;SET TIMEOUT COUNTM- BIS #S2.ACT,S.ST2(R4) ;;;SHOW I/O IS ACTIVEC5 BISB #XCT,U.CW2+1(R5);;;SHOW FUNCTION BEING EXECUTED 0 BITB #S3.SIP,S.ST3(R4) ;;;SHOULD WE DO A SEEK? BEQ 105$ ;;;IF EQ NO;; START EXPLICIT SEEK.; 1 BITB #IQ.UMD,I.FCN(R1) ;;; DIAGNOSTIC FUNCTION ?4 BEQ 99$ ;;; IF EQ NO2 MOVB U.BUF(R5),(R2) ;;; LOAD POSITIONING FUNCTION BR 101$ ;;;.,99$: MOVB U.PRM(R5),R3 ;;; GET SECTORS/TRACK CLR -(SP) ;;;CLEAR A WORDF6 MOVB I.PRM+12(R1),(SP) ;;;GET DESIRED SECTOR ADDRESS, SUB DELTA,(SP) ;;;SUBTRACT ROTATIONAL DELTA% BPL 100$ ;;;IF PL ADJUSTMENT WAS OKT/ ADD R3,(SP) ;;;CORRECT ADJUSTMENT IF NEGATIVET;100$: MOVB I.PRM+13(R1),1(SP) ;;;SET DESIRED TRACK ADDRESSF9 MOV (SP)+,RMDA(R2) ;;;LOAD ADJUSTED TRACK/SECTOR ADDRESS(+ MOVB #131,(R2) ;;;LOAD THE SEARCH FUNCTION #101$: MTPS #0 ;;; ALLOW INTERRUPTSA( BR DRPWF3 ;RELEASE CONTROLLER AND EXIT;M; START DATA00~xÍwt´cÚµcÛ¶c�·c›’ TRANSFER.;C(105$: MOV #FMT16,-(SP) ;;;GET FORMAT BIT# BIT #40,RMDT(R5) ;;;IS IT AN RP07?E BNE 106$ ;;;IF NE YESL* BIT #OM,I.PRM+6(R1) ;;;WAS OFFSET ACTIVE? BNE 106$ ;;;IF NE NO, MOVB #115,(R2) ;;;YES, LOAD OFFSET FUNCTION0106$: BIS I.PRM+6(R1),(SP);;;SET OTHER RMOF BITS/ MOV (SP)+,RMOF(R2) ;;;LOAD THE OFFSET REGISTERL, MOV S.KRB(R4),R3 ;;;GET CURRENT KRB ADDRESS7 BIT #IQ.UMD,I.FCN(R1) ;;;IS IT A DIAGNOSTIC FUNCTION?L BEQ 107$ ;;;IF EQ NO2 CMPB U.BUF(R5),#140 ;;;IS IT A UMD SEEK FUNCTION? BLO 108$ ;;;IF LO YESF=107$: BIS #KS.DIP,K.STS(R3) ;;;SET DATA TRANSFER IN PROGRESS71 BIT #FE.EXT,$FMASK ;;;22-BIT ADDRESSING ENABLED?; BEQ 110$ ;;;IF EQ NO7 BIT #KS.MBC,K.STS(R3) ;;;IS THIS A 22-BIT CONTROLLER?  BEQ 110$ ;;;IF EQ NO MOV R3,R1 ;;;COPY KRB ADDRESSS' ADD K.OFF(R3),R1 ;;;POINT TO UCB TABLER+ MOV KE.RHB(R1),R1 ;;;RETREIVE RHBAE OFFSETB' ADD R2,R1 ;;;FORM AN I/O PAGE ADDRESST2 MOVB U.BUF+1(R5),(R1);;;SET MEMORY EXTENSION BITS+108$: MOVB U.BUF(R5),(R2) ;;;START FUNCTIONO BR 120$ ;;;;*110$: MOV U.BUF(R5),(R2) ;;;START FUNCTION 120$: MTPS #0 ;ALLOW INTERRUPTS;#<; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.; 1DRCAN: RETURN ;NOP FOR RM02/RM03/RM05/RM80/RP07O;+:; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND>; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT=; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVET?; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANYUA; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESS5; THE UNIT IS ALREADY READY.;-3DRPWF: TSTB S.STS(R4) ;IS THIS UNIT CURRENTLY BUSY?I BEQ DRPWF2 ;IF EQ NO9DRPWF0: MOVB #15.,S.STS(R4) ;WAIT A MAXIMUM OF ONE MINUTE/6DRPWF1: MOVB S.ITM(R4),S.CTM(R4) ;4 SECONDS AT A TIME5DRPWF2: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UPH1DRPWF3: CALLR $RLCN ;RELEASE CONTROLLER AND EXITO;+C; **-$DRINT-RH11/RH70-RM02/RM03/RM05/RM80/RP07 DISK PACK CONTROLLER.; INTERRUPT HANDLERT;- .ENABL LSBL3$DRINT::BR DRFRK ;;;ENTRY POINT FOR DATA TRANSFERSS+ TST S.FRK+2(R4) ;;;ARE INTERRUPTS ALLOWED?: BNE DRCAN ;;;IF NE NOU' CALL $FORK ;;;CREATE A SYSTEM PROCESS 6DRFRK: BITB #SEL,U.CW2+1(R5) ;WAITING FOR PORT SELECT BEQ 5$ ;IF EQ NO2 BICB #SEL,U.CW2+1(R5);CLEAR PORT SELECT WAIT FLAG, MOV U.SCB(R5),R4 ;YES, RETREIVE SCB ADDRESS. MOV S.PKT(R4),R3 ;RETREIVE I/O PACKET ADDRESS JMP DRRQC ;GO TRY AGAIN165$: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS- MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEXS# MOV @S.KRB(R4),R2 ;GET CSR ADDRESSA( MOVB U.UNIT(R5),RMCS2(R2) ;SELECT UNIT# TSTB S.STS(R4) ;IS THIS UNIT BUSY?R BNE 10$ ;IF NE YES MTPS #PR5 ;DISABLE INTERRUPTSB/ MOV #TRE!11,(R2) ;;;CLEAR CONTROLLER AND DRIVER: BISB #S3.DRL,S.ST3(R4) ;;;SHOW DUAL ACCESS UNIT RELEASED$ MOVB #113,(R2) ;;;RELEASE THE DRIVE( CLR S.FRK+2(R4) ;;;RESET FORK INTERLOCK MTPS #0 ;;;ALLOW INTERRUPTST BR DRPWF3 ;RELEASE CONTROLLERK;R@; INTERRUPT WAS FROM A BUSY UNIT. IF WE JUST DID A SEEK WE WILLA; GO AND START THE DATA TRANSFER OPERATION. IF THE DATA TRANSFER)>; TERMINATED, DETERMINE WHY. IF WE ARE SPINNING UP, RETRY THE ; OPERATION.;Y110$: BITB #US.SPU,U.STS(R5) ;ARE WE SPINNING UP?( BEQ 15$ ;IF EQ NOE- BIT #S2.MAD,S.ST2(R4) ;MULTI-ACCESS DEVICE?D BEQ 12$ ;IF EQ NOS, CMP S.KRB(R4),S.KTB(R4) ;IS THIS PORT 'A'? BNE 14$ ;IF NE NO 2 BITB #S3.SPA,S.ST3(R4) ;IS PORT 'A' SPINNING UP? BEQ 15$ ;IF EQ NOR%12$: CALLR 100$ ;RETRY THE OPERATION 614$: BITB #S3.SPB,S.ST3(R4) ;IS PORT 'B' SPINNING UP? BNE 12$ ;IF NE YES715$: BIT #S2.EIP,S.ST2(R4) ;ERROR ALREADY IN PROGRESS?  BNE 20$ ;IF NE YES& CALL DRPRM ;SET INITIAL RETRY VALUES.20$: MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS/ MOV #IS.SUC&377,R0 ; ASSUME SUCESSFUL TRANSFERC/ BITB #S3.SIP,S.ST3(R4) ; DID WE JUST DO A SEEK) BEQ 30$ ; IF EQ NO0 BICB #S3.SIP,S.ST3(R4) ; CLEAR SEEK IN PROGRESS/ BITB #IQ.UMD,I.FCN(R1) ; DIAGNOSTIC FUNCTION ?Q BEQ 22$ ; IF EQ NO JMP DRDIAG ; IF NE YES122$: BIT00~"xIwtöt÷tø tþfDATA #ERR,RMDS(R2) ; ANY ERRORS DURING SEEK ?? BEQ 12$ ;IF EQ NOS! CALL $DVERR ;LOG THE SEEK ERRORR! DECB RTTBL(R3) ;COUNT THIS RETRYI" CALL DRERL ;FINISH ERROR LOGGING#25$: MTPS #PR5 ;DISABLE INTERRUPTS / MOV #TRE!11,(R2) ;;;CLEAR CONTROLLER AND DRIVEU/ MOVB S.ITM(R4),S.CTM(R4) ;;;SET TIMEOUT COUNT ( CLR S.FRK+2(R4) ;;;RESET FORK INTERLOCK- BIS #S2.ACT,S.ST2(R4) ;;;SHOW I/O IS ACTIVEG( MOVB #107,(R2) ;;;START THE RECALIBRATE MTPS #0 ;ALLOW INTERRUPTSE RETURN ;D; 5; INTERRUPT WAS DUE TO A DATA TRANSFER OPERATION OR AG; DIAGNOSTIC FUNCTION ;NC30$: BIT #HCRC!HCE,RMER1(R2) ; HEADER CRC OR HEADER COMPARE ERROR ?E BNE 36$ ;IF NE YES' BIT #SSE,RMER2(R2) ;SKIP SECTOR ERROR?B BEQ 36$ ;IF EQ NO#6 BIS #SSEI,I.PRM+6(R1) ;SET SKIP SECTOR ERROR INHIBIT) CALL DRCLR ;CLEAR SELECTED DRIVE ERRORSS( MOV RMOF(R2),-(SP) ;GET OFFSET REGISTER6 BIS I.PRM+6(R1),(SP) ;SET REMAINING BITS IN REGISTER0 MOV (SP)+,RMOF(R2) ;RE-LOAD THE OFFSET REGISTER. MOV RMWC(R2),R0 ;GET NEGATIVE WORDS REMAINING* BNE 32$ ;IF NE WE HAD A PARTIAL TRANSFER% MOV #-1,R0 ;FAKE A PARTIAL TRANSFERE*32$: ASL R0 ;CONVERT IT TO NEGATIVE BYTES6 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED- BIC #777,R0 ;GET BLOCKS ACTUALLY TRANSFEREDP* CALL DRFUN ;TEST FOR DIAGNOSTIC FUNCTION BCC 33$ ;IF CC NOE' CMPB #14.,U.PRM+1(R5) ;IS IT AN RM80?G BNE 33$ ;IF NE NOB! INC U.PRM(R5) ;INC SECTORS/TRACK 433$: CALL DRCALC ;BACKUP TO START OF BLOCK IN ERROR& TST U.CNT(R5) ;LAST BLOCK TRANSFERED? BNE 34$ ;IF NE NO, ADD R0,U.CNT(R5) ;YES, NORMALIZE BYTE COUNT.34$: CALL DRFUN ;TEST FOR DIAGNOSTIC FUNCTION BCC 35$ ;IF CC NOA' CMPB #14.,U.PRM+1(R5) ;IS IT AN RM80?B BNE 35$ ;IF NE NOR" DECB U.PRM(R5) ;DEC SECTORS/TRACK BR 12$ ;RESTART FUNCTION535$: INCB I.PRM+12(R1) ;INC TO NEXT SEQUENTIAL SECTORC BR 12$ ;RESTART FUNCTION736$: BIT #SSEI,RMOF(R2) ;SKIP SECTOR ERROR INHIBIT SET?T BNE 37$ ;IF NE YES8 BIC #SSEI,I.PRM+6(R1) ;RESET SKIP SECTOR ERROR INHIBIT.37$: CALL DRFUN ;IS IT DIAGNOSTIC FUNCTION? BCS DRDIAG ;IF CS YESO(38$: BIT #70,(R2) ;RECALIBRATE FUNCTION? BEQ 80$ ;IF EQ YES BIT #TRE!MCPE,(R2) ;ANY ERRORS? BEQ 70$ ;IF EQ NOT. MOV RMWC(R2),R0 ;GET NEGATIVE WORDS REMAINING( MOV R0,SAVWC(R3) ;SAVE IT FOR LATER USE& CLR DLTWC(R3) ;ZERO SAVED DLT WC FLAG TST RMCS2(R2) ;DATA LATE ERROR? BPL 39$ ;IF PL NO:: MOV R0,DLTWC(R3) ;YES, SAVE REAL NEGATIVE WORDS REMAINING* BNE 39$ ;IF NE WE HAD A PARTIAL TRANSFER8 MOV #-1,DLTWC(R3) ;DLT ON LAST WORD, FAKE A PARTIAL XFR'39$: ASL R0 ;CONVERT TO NEGATIVE BYTESE6 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED* SUB #512.,R0 ;SUBTRACT OUT BLOCK IN ERROR) BLE 40$ ;IF LE NO GOOD BYTES TRANSFEREDE1 BITB #ERL,U.CW2+1(R5);ERROR ALREADY IN PROGRESS?  BEQ 40$ ;IF EQ NOR;T:; WE GOT AN ERROR BUT SOME GOOD DATA WAS TRANSFERED. THIS6; INDICATES THAT WE RECOVERED FROM THE PREVIOUS ERROR.;A;E<; NOW LOG THE CURRENT ERROR AND DETERMINE WHAT TYPE OF ERROR1; WE HAD. ERRORS ARE BASICLY HARD, SOFT OR DATA.P;I" CALL DRERL ;FINISH ERROR LOGGING#40$: CALL $DVERR ;LOG DEVICE ERRORU, BISB #ERL,U.CW2+1(R5);SET ERROR LOGGED FLAG, MOV #IE.WLK&377,R0 ;ASSUME WRITE LOCK ERROR& BIT #WLE,RMER1(R2) ;WRITE LOCK ERROR? BNE 60$ ;IF NE YES/ MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERRORG' BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?E BNE 60$ ;IF NE YES% TST DLTWC(R3) ;REAL DATA LATE ERROR?R BNE 110$ ;IF NE YES 1 BIT #IVC!LSC!LBC!DVC!DPE,RMER2(R2) ;HARD ERROR? BNE 60$ ;IF NE YES1 MOV RMER1(R2),R1 ;GET CONTENTS OF ERROR REGISTERI. BIT #UNS!IAE!AOE!RMR!ILR!ILF,R1 ;HARD ERROR? BNE 60$ ;IF NE YES$ BIT #NED!NEM,RMCS2(R2) ;HARD ERROR? BNE 60$ ;IF NE YES% BIT #SKI,RMER2(R2) ;SEEK INCOMPLETE?W BNE 55$ ;IF NE YES BIT #HCRC,R1 ;HEADER CRC ERROR? BNE 50$ ;IF NE YES$ BIT #HCE,R1 ;HEADER COMPARE ERROR? BNE 55$ ;IF NE NO6 BIT #FER,R1 ;FORMAT ERROR? BNE 60$ ;IF NE YES8 BIT #WCE!UPE!PGE!MXF!MDPE,RMCS2(R2) ;CONTROLLER ERROR? BNE DRRTRY ;IF NE YESE+ MOV #IE.BBE&377,R0 ;ASSUME BAD BLOCK ERRORE% BIT #BSE,RMER2(R200~*xÍwt´cÚµcÛ¶c�·c›’) ;BAD BLOCK ERROR?O BNE 60$ ;IF NE YES0 MOV #IE.VER&377,R0 ; ASSUME UNRECOVERABLE ERROR%50$: JMP DRECC ;CHECK FOR ECC ERRORSS'55$: JMP 25$ ;TRY RECALIBRATE FUNCTION7DRDIAG: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASKB" CALL DRCLR ;CLEAR SELECTED DRIVE60$: JMP DRFIN ;FINISH I/O$*70$: BR DRWCHK ;GO TEST FOR A WRITE CHECK;E ; PROCESS POSITIONING OPERATION.;X380$: MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERRORF. BIT #ERR,RMDS(R2) ;ERRORS DURING POSITIONING? BEQ DRRTRY ;IF EQ NO CALL $DVERR ;LOG IT" CLR R1 ;SHOW NO BYTES TRANSFERED JMP DRFIN1 ;FINISH I/O'100$: CALL DRCLR ;CLEAR SELECTED DRIVEE' CALLR DRUBMP ;RETRY ORIGINAL FUNCTIONN;>; THE TRANSFER WAS STOPPED DUE TO A DATA LATE ERROR CONDITION.>; WE WILL NOW BACKUP THE WORD COUNT, BUS ADDRESS AND CYLINDER/?; TRACK/SECTOR ADDRESS BY ONE BLOCK AND RETRY THE TRANSFER FROMN>; THIS POINT. THIS IS DONE TO PREVENT THE DATA LATE CONDITION(; FROM RECURRING DUE TO A LONG TRANSFER.;I0110$: DECB RTTBL(R3) ;RETRY DATA LATE CONDITION? BLE 60$ ;IF LE NON4 MOV DLTWC(R3),R0 ;GET REAL NEGATIVE WORDS REMAINING# ASL R0 ;CONVERT TO NEGATIVE BYTESL6 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED- BIC #777,R0 ;GET BLOCKS ACTUALLY TRANSFEREDO0 CALL DRCALC ;BACKUP TO START OF BLOCK IN ERROR3 TST U.CNT(R5) ;DLT ERROR ON LAST BLOCK TRANSFERED?  BNE 100$ ;IF NE NO, ADD R0,U.CNT(R5) ;YES, NORMALIZE BYTE COUNT BR 100$ ;RESTART THE TRANSFERR .DSABL LSBT;+@; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING REPEATEDC; UNLESS THE OPERATION WAS DIAGNOSTIC. TIMEOUTS ARE USUALLY CAUSEDRC; BY POWERFAILURE BUT MAY ALSO BE THE RESULT OF A HARDWARE FAILURE.L;- .ENABL LSBL7DROUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP?E BEQ 15$ ;;;IF EQ NOU/ BIT #S2.MAD,S.ST2(R4) ;;;MULTI-ACCESS DEVICE?  BEQ 10$ ;;;IF EQ NON. CMP S.KRB(R4),S.KTB(R4) ;;;IS THIS PORT 'A'?) BNE 5$ ;;;IF NE NO, IT MUST BE PORT 'B'S4 BITB #S3.SPA,S.ST3(R4) ;;;IS PORT 'A' SPINNING UP? BNE 10$ ;;;IF NE YES' BR 15$ ;;;TIMEOUT FOR NORMAL FUNCTIONO75$: BITB #S3.SPB,S.ST3(R4) ;;;IS PORT 'B' SPINNING UP? & BEQ 15$ ;;;IF EQ NO, NORMAL FUNCTION110$: DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET?U BEQ 15$ ;;;IF EQ YES MTPS #0 ;;;ALLOW INTERRUPTSB. MOV S.PKT(R4),R3 ;RETREIVE I/O PACKET ADDRESS JMP DRRQC ;RETRY OPERATION,15$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY MTPS #0 ;;;ALLOW INTERRUPTSF3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER ) MOV S.KRB(R4),R2 ;GET CURRENT KRB ADDRSSI- MOVB K.CON(R2),R3 ;RETREIVE CONTROLLER INDEXO MOV (R2),R2 ;GET CSR ADDRESS: MOVB U.UNIT(R5),RMCS2(R2) ;SELECT UNIT FOR ERROR LOGGING! CALL $DVTMO ;LOG DEVICE TIMEOUTV;E>; NOTE: THE FOLLOWING SIX INSTRUCTIONS (AND THE SUBROUTINE) DO4; NOT CHANGE THE C-BIT SETTING RETURNED FROM $DVTMO.;E2 BITB #SEL,U.CW2+1(R5);WAITING FOR PORT TO SELECT?) BNE DRFIN1 ;IF NE YES, WE DIDN'T GET ITA0 BITB #S3.SIP,S.ST3(R4) ;TIMEOUT DURING A SEEK? BEQ 20$ ;IF EQ NO$ CALL DRPRM ;RESET RETRY PARAMETERS;20$: BICB #S3.SIP,S.ST3(R4) ;ASSUME DATA TRANSFER FUNCTION2- BCS DRDIAG ;IF CS TIMEOUT DURING DIAGNOSTICR4 BITB #US.SPU,U.STS(R5) ;WAS THE DRIVE SPINNING UP? BEQ DRRTRY ;IF EQ NO- MOV #IE.DNR&377,R0 ;YES, SET DRIVE NOT READYU BR DRFIN ;FINISH I/O0DRRTRY: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS< BICB #ERL,U.CW2+1(R5) ;CAN'T CLOSE ERRORS RETRIED FROM BEG' BIT #WCE,RMCS2(R2) ;WRITE CHECK ERROR?. BEQ 25$ ;IF EQ NOU/ MOV #IE.WCK&377,R0 ;YES, SET WRITE CHECK ERRORR+25$: BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?, BNE DRFIN ;IF NE YES DECB RTTBL(R3) ;RETRY FUNCTION? BGT 40$ ;IF GT YES BR DRFIN ;FINISH I/O;.!; TEST FOR WRITE CHECK OPERATION.?;BCDRWCHK: BITB #IO.WLC&377,I.FCN(R1) ;WRITE FOLLOWED BY WRITE CHECK? BNE 30$ ;IF NE YES5 BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED BY MCR?C BEQ DRFIN ;IF EQ NON330$: CMPB #171,U.BUF(R5) ;WAS LAST FUNCTION A READ?  BEQ DRFIN ;IF EQ YES0 CMPB #161,U.BUF(R5) ;WAS LAST FUNCTION A WRITE? BNE DRFIN ;IF NE NO:0 MOV #RETRY,RTTBL(R3) ;REINITIALIZE RET00~2xIwtöt÷tø tþfDATARY COUNT" MUL #5,R3 ;SET UP INDEX INTO ...' ADD #PRMSV,R3 ;... PARAMETER SAVE AREAR) MOV (R3)+,U.BUF(R5) ;RESTORE PARAMETERSK MOV (R3)+,U.BUF+2(R5) ;... MOV (R3)+,U.CNT(R5) ;... MOV (R3)+,I.PRM+10(R1) ;...B MOV (R3)+,I.PRM+12(R1) ;...C. MOVB #151,U.BUF(R5) ;SET WRITE CHECK FUNCTION&40$: CALL DRCLR ;CLEAR SELECTED DRIVE/ CALLR DRUBMP ;START THE WRITE CHECK OPERATION .DSABL LSB ;U; **-DRFIN-FINISH I/O OPERATIONT;B; THIS ROUTINE WILL SET THE ACTUAL BYTES TRANSFERED PARAMETER, THEA; ERROR LOGGING RETRY COUNTS AND CALL $IODON. THE SELECTED DRIVEE<; IS RELEASED, IF REQUESTED, AND THE CONTROLLER IS RELEASED.;( ; INPUTS:2;); R0=SUCCESS/ERROR CODER; R2=ADDRESS OF CONTROLER CSR1; R4=ADDRESS OF THE SCBM; R5=ADDRESS OF THE UCB1;B/DRFIN: MOV S.PKT(R4),R3 ;GET I/O PACKET ADDRESS;1 MOV RMWC(R2),R1 ;GET WORDS REMAINING TO TRANSFERT+ ASL R1 ;CONVERT TO BYTES LEFT TO TRANSFERD8 ADD I.PRM+4(R3),R1 ;CALCULATE BYTES ACTUALLY TRANSFERED*DRFIN1: CALL DRCLR1 ;CLEAR SELECTED DRIVE( MOV #TRE,(R2) ;NOW CLEAR THE CONTROLLER2 BICB #SEL,U.CW2+1(R5);CLEAR PORT SELECT WAIT FLAG* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS;2); CHECK FOR ATTENTIONS AND RELEASE DRIVE.S; +10$: TSTB RMAS(R2) ;ANY ATTENTIONS PENDING?5 BEQ 20$ ;IF EQ NO0 BISB #IE,(R2) ;RE-DISPATCH TO INTERRUPT HANDLER BR 10$ ;TRY AGAIN1:20$: BITB #S3.NRL,S.ST3(R4) ;SHOULD WE RELEASE THE DRIVE? BEQ 30$ ;IF EQ YES$ MOVB #IE,(R2) ;RE-ENABLE INTERRUPTS BR 40$ ;<30$: BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED7 MOVB #113,(R2) ;RE-ENABLE INTERRUPTS AND RELEASE DRIVEE140$: MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEXR/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTR4 BITB #XCT,U.CW2+1(R5);HAS A FUNCTION BEEN EXECUTED? BNE 50$ ;IF NE YES' MOV #RETRY,R2 ;SET MAXIMUM RETRY COUNTO350$: BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNTS5 BICB #S3.SIP,S.ST3(R4) ;RESET SEEK IN PROGRESS FLAG$'DRFIN2: CALL $RLCN ;RELEASE CONTROLLERN# CALL $IODON ;FINISH I/O OPERATIONR! JMP DRINI ;PROCESS NEXT REQUEST ;D!; **-DRECC-ATTEMPT ECC CORRECTIONU; D; THIS ROUTINE IS ENTERED IF A DATA ERROR IS DETECTED. IF THE ERRORG; IS CORRECTABLE, THE EXECUTIVE ECC ROUTINE IS CALLED AND THE OPERATION)E; IS RESTARTED FROM WHERE THE CONTROLLER STOPPED. IF OFFSET RECOVERYE; IS REQUIRED, WE WILL DO IT.S;E ; INPUTS: ;R; R1=CONTENTS OF RMER1; R2=ADDRESS OF CONTROLLER CSR; .DRECC: BIT #DCK!DTE!HCRC,R1;CORRECTABLE ERROR? BEQ DRRTRY ;IF EQ NO/ CMPB #171,U.BUF(R5) ;IS THIS A READ OPERATION?N BNE DRRTRY ;IF NE NO4 MOV SAVWC(R3),R0 ;GET NEGATIVE # OF WORDS REMAINING ASL R0 ;CONVERT TO BYTES6 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED# BEQ DROFF ;IF EQ NONE, TRY OFFSETT( BIS RMER2(R2),R1 ;.OR. ERROR REGISTER 2% CMP #DCK,R1 ;ONLY DATA CHECK ERROR?S! BNE DROFF ;IF NE NO, TRY OFFSETN7 MOV SAVWC(R3),-(SP) ;PUT REMAINING WORD COUNT ON STACKO, MOV RMEC1(R2),R1 ;GET ECC POSITION REGISTER- MOV RMEC2(R2),R3 ;GET ECC CORRECTION PATTERN ' MOV (SP)+,R2 ;GET REMAINING WORD COUNTN CALL $ECCOR ;DO ECC CORRECTION) CALL DRCLR ;CLEAR SELECTED DRIVE ERRORSG/ CALL DRPRM0 ;RESET OFFSET RECOVERY PARAMETERSC( CALL DRCALC ;RE-CALCULATE DISK ADDRESS5 MOV #IS.SUC&377,R0 ;ASSUME NO MORE WORDS TO TRANSFER + TST U.CNT(R5) ;ANY MORE WORDS TO TRANSFER?E BEQ DRFIN ;IF EQ NO +DRREST: CALLR DRINIO ;RESTART THE TRANSFER;;A"; **-DROFF-ATTEMPT OFFSET RECOVERY;R=; THIS ROUTINE IS CALLED WHENEVER WE NEED TO OFFSET THE HEADSR@; SOME DISTANCE FROM TRACK CENTERLINE TO PROPERLY READ THE DATA.;C ; INPUTS: ;R6; R0=NUMBER OF BYTES ACTUALLY TRANSFERED TO THIS POINT;R5DROFF: BITB #OFA,U.CW2+1(R5) ;OFFSET ALREADY ACTIVE?R BNE 5$ ;IF NE YESE" DECB RTTBL(R3) ;ANY RETRIES LEFT? BGT 5$ ;IF GT YES , MOV #IE.VER&377,R0 ;SET UNRECOVERABLE ERROR JMP DRFIN ;FINISH I/O15$: MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESSA TST R0 ;ANYTHING TRANSFERRED?E BEQ 20$ ; NO0 BIT #ECH!DTE,RMER1(R2); HARD ECC OR DTE ERROR ? BEQ 15$ ; NO* DEC R0 ;BACK UP TO THE PREVIOUS BLOCK...00~:xÍwt´cÚµcÛ¶c�·c›’ ; IF ON A BLOCK BOUNDARY) BIC #777,R0 ; FORCE TO A BLOCK BOUNDARY ! ; Z-BIT SET BY BIC IF R0 IS 0U BEQ 20$ ;IF EQ NOL;D@; THE TRANSFER ENDED IN AN ECC HARD ERROR BUT THERE WERE SECTORSE; TRANSFERED THAT CONTAINED GOOD DATA. SINCE THE ECC HARD ERROR COULDA; HAVE BEEN CAUSED BY A CYLINDER CROSSING, THE GOOD DATA IS SAVED 6; AND THE TRANSFER IS RETRIED FROM THE POINT OF ERROR.;O15$:/ CALL DRPRM0 ;RESET OFFSET RECOVERY PARAMETERSQ' CALL DRCALC ;CALCULATE NEW PARAMETERSI& TST U.CNT(R5) ;LAST BLOCK TRANSFERED? BNE 20$ ;IF NE NOO, ADD R0,U.CNT(R5) ;YES, NORMALIZE BYTE COUNT320$: BITB #OFA,U.CW2+1(R5) ;OFFSET ALREADY ACTIVE?F BNE 30$ ;IF NE YES0 CALL DRPRM10 ;RESET OFFSET RECOVERY PARAMETERS. BIS #OM,I.PRM+6(R1) ;SET OFFSET MODE INACTIVE& MOVB #117,(R2) ;RETURN TO CENTER LINE! BR DRREST ;RESTART THE TRANSFER ; A; NO GOOD DATA WAS TRANSFERED - CHECK IF OFFSET SHOULD BE CHANGEDR;0=30$: BIT #DTE!ECH,RMER1(R2) ;DRIVE TIMING OR HARD ECC ERROR?N BNE 40$ ;IF NE YES( CMP OFFAD(R3),#OFFTB;AT OFFSET ALREADY? BLO 40$ ;IF LO NO,5 BIS #HCI,I.PRM+6(R1);YES, SET HEADER COMPARE INHIBITC%40$: DECB RTTBL+1(R3) ;CHANGE OFFSET?E BGT DRREST ;IF GT NO- DECB RTTBL(R3) ;COUNT EACH OFFSET AS A RETRYS! BIT #40,RMDT(R5) ;IS IT AN RP07?N BNE DRREST ;IF NE YESR( ADD #2,OFFAD(R3) ;UPDATE OFFSET POINTER. CMP #OFFTB+4,OFFAD(R3) ;END OF OFFSET TABLE? BEQ DRREST ;IF EQ YESD3 MOV @OFFAD(R3),I.PRM+6(R1) ;GET NEXT OFFSET VALUE , MOVB #2,RTTBL+1(R3) ;SET OFFSET RETRY COUNT! BR DRREST ;RESTART THE TRANSFER ;D6; **-DRERL-FINISH ERROR LOGGING FOR MID-TRANSFER ERROR;A@; THIS ROUTINE IS CALLED TO FINISH OFF THE ERROR LOGGING PROCESS8; DURING MID-TRANSFER IF WE HAVE SUCCESSFULLY RECOVERED.;E ; INPUTS:#;R; R3=CONTROLLER INDEXN;B#DRERL: MOV R2,-(SP) ;SAVE REGISTERS3 MOV R1,-(SP) ;P/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTA/ BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNT., MOV #IS.SUC&377,R0 ;RECOVERY WAS SUCCESSFUL+ CALL $FNERL ;FINISH ERROR LOGGING PROCESST MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R2 ;R( ;FALL THRU AND RESET RECOVERY PARMS.;R#; SET RECOVERY AND RETRY PARAMETERSR;L3DRPRM: MOV #RETRY,RTTBL(R3);SET INITIAL RETRY COUNTS7DRPRM0: MOVB #16,RTTBL+1(R3) ;SET OFFSET RECOVERY COUNTE9DRPRM1: MOV #OFFTB-2,OFFAD(R3) ;SET OFFSET TABLE POINTERP1 BICB #OFA,U.CW2+1(R5) ;CLEAR OFFSET ACTIVE FLAGN RETURN ;R;.*; **-DRCALC-CALCULATE UPDATED DISK ADDRESS;3?; THIS ROUTINE WILL CALCULATE THE NEW DISK AND BUFFER ADDRESSESN3; BASED ON THE NUMBER OF BYTES ACTUALLY TRANSFERED.P;R ; INPUTS:F; ; R0=BLOCKS ACTUALLY TRANSFERED.; ; OUTPUTS:;A; R0=UNCHANGED IF U.CNT(R5)=0R#; I.PRM+10(R1)=NEW CYLINDER ADDRESSE'; I.PRM+12(R1)=NEW TRACK SECTOR ADDRESS;; <DRCALC: SUB R0,U.CNT(R5) ;REDUCE BYTES REMAINING TO TRANSFER BEQ 30$ ;IF EQ NONE LEFT3 ADD R0,U.BUF+2(R5) ;UPDATE STARTING BUFFER ADDRESS 0 ADCB U.BUF+1(R5) ;AND THE MEMORY EXTENSION BITS2 BIT #FE.EXT,$FMASK ;IS 22-BIT ADDRESSING ENABLED? BEQ 5$ ;IF EQ NO' MOV S.KRB(R4),R1 ;RETREIVE KRB ADDRESS 9 BIT #KS.MBC,K.STS(R1) ;IS THIS A 22-BIT MASSBUS DEVICE?S BNE 5$ ;IF NE YES:& ADD K.OFF(R1),R1 ;POINT TO UMR AREA+2) ADD R0,-(R1) ;CALCULATE NEW REAL ADDRESS+ ADCB -(R1) ;...C15$: MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESSE1 SWAB R0 ;CALCULATE NUMBER OF SECTORS TRANSFERED ASR R0 ;1 ADD I.PRM+12(R1),R0 ;UPDATE TRACK/SECTOR ADDRESSC# TST -(SP) ;GET A WORKING REGISTERO510$: CLR (SP) ;CLR THE WORKING REGISTER FOR THE LOOPE$ CMPB U.PRM(R5),R0 ;SECTOR OVERFLOW? BHI 20$ ;IF HI NOR( MOVB U.PRM(R5),(SP) ;COPY SECTORS/TRACK1 SUB (SP),R0 ;SUBTRACT A TRACKS WORTH OF SECTORSK ADD #1*256.,R0 ;ADD IN A TRACK+ MOV U.PRM(R5),(SP) ;GET TRACKS AND SECTORSA) CLRB (SP) ;ISOLATE ONLY TRACKS/CYLINDERR CMP (SP),R0 ;TRACK OVERFLOW? BHI 10$ ;IF HI NO & SUB (SP),R0 ;NORMALIZE TRACK ADDRESS* INC I.PRM+10(R1) ;UPDATE CYLINDER ADDRESS BR 10$ ;:20$: MOV R0,I.PRM+12(R1) ;SET UPDATED TRACK/SECTOR ADDRESS TST (SP)+ ;PRUNE STACK30$: RETURN ;0;T00~BxIwtöt÷tø tþfDATA(; **-DRVV-PROCESS VOLUME VALID FUNCTIONS;RB; HERE WE WILL PROCESS VOLUME VALID FUNCTIONS. IF THE FUNCTION ISD; SET VOLUME VALID WE WILL SET THE HARDWARE VOLUME "VV" BIT. IF THEC; FUNCTION IS CLEAR VOLUME VALID WE WILL DO NOTHING AS THE HARDWAREE; CANNOT SPIN THE DRIVE DOWN. IF THE FUNCTION IS A VOLUME VALID NOP,RC; WE WILL SIZE THE DISK BY PASSING THE CONTROLLER REGISTERS BACK TO ; THE CALLER.V;, ; INPUTS:);E; R4=ADDRESS OF THE SCB.; R5=ADDRESS OF THE UCBS;K8DRVV: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER- MOV #IS.SUC&377,R0 ;SET SUCCESSFUL OPERATION ( MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS, MOVB U.UNIT(R5),RMCS2(R2) ;SELECT THE UNIT. MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS" CALL DRCLR ;CLEAR SELECTED DRIVE* BIT #NED,RMCS2(R2) ;DOES THE DRIVE EXIST? BEQ 5$ ;IF EQ YESN" TST I.PRM+2(R1) ; SIZE THE DISK ? BMI 4$ ; IF MINUS THEN YES CALL $DVERR ;LOG THE ERROR4$: ; REFFERENCE LABELS2 MOVB #TRE/256.,RMCS1+1(R2) ;CLEAR THE CONTROLLER( MOV #IE.SZE&377,R0 ;UNABLE TO SIZE UNIT) BICB #US.VV,U.STS(R5);RESET VOLUME VALIDU JMP DRFIN2 ;EXIT#5$: TST I.PRM+2(R1) ;SIZE THE DISK?M BPL 10$ ;IF PL NOR2 CALL $CRPAS ;PASS CONTROLLER REGISTERS TO CALLER BR 15$ ;010$: BIT #VV$SET,I.PRM+2(R1) ;SET VOLUME VALID? BEQ 15$ ;IF EQ NO + MOV RMDS(R2),R1 ;GET DRIVE STATUS REGISTERM COM R1 ;TOGGLE THE BITSB0 BIT #MOL!DRY,R1 ;IS THE DRIVE READY AND ONLINE? BNE 20$ ;IF NE NOE( MOVB #23,(R2) ;ISSUE PACK ACK TO SET VV15$: JMP DRFIN1 ;EXIT320$: MOV #IE.DNR&377,R0 ;DRIVE NOT READY ERROR CODEV) BICB #US.VV,U.STS(R5);RESET VOLUME VALID  BR 15$ ;EXIT;+$; **-DRCLR-CLEAR DRIVE OR SUB-SYSTEM?; **-DRCLR1-ALTERNATE ENTRY TO CLEAR DRIVE W/O INTERRUPT ENABLE5;;C; ISSUE A DRIVE CLEAR FUNCTION UNLESS THE SELECTED DRIVE/CONTROLLERN'; IS HUNG, THEN ISSUE SUB-SYSTEM CLEAR.G;E ; INPUTS: ;O; R2=CSR ADDRESS; R5=UCB ADDRESS;E ; OUTPUTS:;D; SELECTED DRIVE IS CLEAREDE;M .ENABL LSBS+DRCLR: TSTB (R2) ;IS THE CONTROLLER READY?T BPL 10$ ;IF PL NO7 BIT #1,(R2) ;IS GO BIT SET?V BNE 10$ ;IF NE YES& MOVB #111,(R2) ;NO, ISSUE DRIVE CLEAR RETURN ;AND EXITR,DRCLR1: TSTB (R2) ;IS THE CONTROLLER READY? BPL 10$ ;IF PL NOO BIT #1,(R2) ;IS GO BIT SET?  BNE 10$ ;IF NE YES% MOVB #11,(R2) ;NO, ISSUE DRIVE CLEAR RETURN ;AND EXIT ;Y; NOTE:R;@; THE FOLLOWING INSTRUCTION WILL CAUSE ALL I/O ON OTHER UNITS TOD; ABORT. THIS IS OK BECAUSE THE TIMEOUT FACILITY SHOULD CATCH THEM.;R.10$: BIS #40,RMCS2(R2) ;ISSUE SUB-SYSTEM CLEAR0 MOVB U.UNIT(R5),RMCS2(R2) ;RE-SELECT THE DRIVE RETURN ;AND EXIT2 .DSABL LSBD;C.; **-DRFUN-PROCESS DIAGNOSTIC FUNCTION TESTING;T=; DETERMINE IF THE SPECIFIED FUNCTION IS A DIAGNOSTIC OR NOT.O#; TWO EXCEPTIONS: IO.CER AND IO.CEWV;1 ; INPUTS: ; R1=ADDRESS OF I/O PACKET;A ; OUTPUTS:+; C/S=DIAGNOSTIC FUNCTION (EXCEPT AS NOTED) ; C/C=NORMAL FUNCTIONT; BDRFUN: CMPB #IO.CER!IQ.UMD&377,I.FCN(R1) ;IS IT READ CE CYLINDER? BEQ 10$ ;IF EQ YES= CMPB #IO.CEW!IQ.UMD&377,I.FCN(R1) ;IS IT WRITE CE CYLINDER?2 BEQ 10$ ;IF EQ YES5 BIT #IQ.UMD,I.FCN(R1) ;IS IT A DIAGNOSTIC FUNCTION?F BEQ 10$ ;IF EQ NO  SEC ;YES, SET CARRY RETURN ;EXITS10$: CLC ;NO, CLEAR CARRYS RETURN ;EXITW;+'; **-DRCHK-VALIDATE AND CONVERT THE LBN;19; THIS ROUTINE IS CALLED FROM $DRQRQ TO DO LBN PROCESSINGN9; FOR DEVICES WHICH SUPPORT QUEUE OPTIMIZATION. IF BLKC2U9; DETECTS AN ERROR IT WILL RETURN TO THE CORRECT PLACE INE; $DRQRQ AFTER CALLING $IOALT.;. ; INPUTS:3;I; R1=I/O PACKET ADDRESS ; R5=UCB ADDRESS; ; OUTPUTS:;T4; IF THE CHECKS SUCCEEDS, THEN THE LBN IN THE PACKET=; IS REPLACED BY THE CYLINDER/TRACK/SECTOR. R1 IS PRESERVED.0;C:; IF THE CHECKS FAILS, THEN $IOALT IS ENTERED WITH A FINAL8; STATUS OF IE.BLK AND A RETURN TO THE CORRECT PLACE IN ; $DRQRQ IS EXECUTED.N;O;S<; NOTE: ALL FUNCTIONS PUT INTO THE DRIVER QUEUE ARRIVE HERE.3; THESE INCLUDE IO.ATT, IO.DET, AND ACP FUNCTIONS.P;-;DRCHK: MOV I.FCN(R1),-(SP) ;PUT THE FUNCTION ONTO THE ST00~JxNxt´cÚµcÛ¶c�·c›’ACKI) BIC #7,(SP) ;CLEAR THE SUBFUNCTION BITS & CMPB #IO.ATT/256.,1(SP) ;IS IT ATTACH% BEQ 55$ ;IF EQ YES - LEAVE IT ALONEE' CMPB #IO.DET/256.,1(SP) ;IS IT DETACHE% BEQ 55$ ;IF EQ YES - LEAVE IT ALONEE- CMP #IO.STC,(SP) ;IS IT SET CHARACTERISTICS?E% BEQ 55$ ;IF EQ YES - LEAVE IT ALONEI TST (SP)+ ;CLEAN THE STACK5 BIT #IQ.UMD,I.FCN(R1) ;IS IT A DIAGNOSTIC FUNCTION?R BNE 30$ ;IF NE YES) CALL $BLKC2 ;CHECK LOGICAL BLOCK NUMBER-0 CMPB #IO.WLB/256.,I.FCN+1(R3) ;WRITE FUNCTION? BNE 40$ ;IF NE NO#8 BITB #IO.WLT&377,I.FCN(R3) ;WRITE LAST TRACK FUNCTION? BNE 40$ ;IF NE YES CLR R0 ;GET READY FOR THE BISB% BISB U.PRM(R5),R0 ;GET SECTORS/TRACKT4 ADD R0,I.PRM+12(R3) ;INCREMENT BLOCK # BY ONE TRACK! ADCB I.PRM+10(R3) ;AND THE CARRYS. MOV R3,R1 ;RESTORE PACKET ADDRESS FOR $BLKC21 CALL $BLKC2 ;SEE IF WRITE IS TO BAD SECTOR FILEI CLR R1 ;GET READY FOR THE BISB% BISB U.PRM(R5),R1 ;GET SECTORS/TRACKK% SUB R1,R0 ;CORRECT THE BLOCK NUMBER5$ SBCB R2 ;AND THE HIGH BLOCK NUMBER BR 40$ ;CONTINUE+30$: MOV R1,R3 ;COPY POINTER TO I/O PACKETN. ADD #I.PRM+11,R1 ;POINT PAST HIGH PART OF LBN CLRB (R1)+ ;CLEAR EXCESS BYTE0" MOV (R1),R0 ;GET LOW PART OF LBN# MOV -(R1),R2 ;GET HIGH PART OF LBNK+ MOV R3,R1 ;RESTORE THE I/O PACKET POINTER,* CALL DRFUN ;TEST FOR DIAGNOSTIC FUNCTION BCC 40$ ;IF CC NOT' CMPB #14.,U.PRM+1(R5) ;IS IT AN RM80?E BNE 40$ ;IF NE NOS" INCB U.PRM(R5) ;INC SECTORS/TRACK/40$: CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBER 3 MOV R2,I.PRM+10(R3) ;SAVE DESIRED CYLINDER ADDRESS:" SWAB R1 ;SWAP TRACK TO HIGH BYTE$ BIS R1,R0 ;MERGE TRACK WITH SECTOR; MOV R0,I.PRM+12(R3) ;SAVE DESIRED TRACK AND SECTOR ADDRESS0( MOV R3,R1 ;RETRIEVE I/O PACKET ADDRESS* CALL DRFUN ;TEST FOR DIAGNOSTIC FUNCTION BCC 50$ ;IF CC NO' CMPB #14.,U.PRM+1(R5) ;IS IT AN RM80?N BNE 50$ ;IF NE NOT" DECB U.PRM(R5) ;DEC SECTORS/TRACK50$: RETURN ;EXIT 55$: TST (SP)+ ;CLEAN THE STACK BR 50$ ;AND EXIT .ENDCONVERT LOGICAL BLOCK NUMBER 3 MOV R2,I.PRM+10(R3) ;SAVE D .TITLE DMDRV  .IDENT /14.03/; P; COPYRIGHT (C) 1982, 1983, 1984, 1985, 1986 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;. ; P. J. BEZEREDI ; B. S. MCCARTHY ;K ;  ; MODIFIED BY:( ; G. MARIGOWDA 20-FEB-87 14.03: ; GM107 RESTORE I/O PKT ADDRESS BEFORE CALLING DMDINT  ;  ;  ;0;/; RK611-RK06/RK07 OVERLAPPED SEEK DISK DRIVER; .MCALL HWDDF$,PKTDF$ &! HWDDF$ ;DEFINE HARDWARE REGISTERS&" PKTDF$ ;DEFINE I/O PACKET OFFSETS#$;H%; EQUATED SYMBOLSH&;D'+(RETRY= 8. ;CONTROLLER ERROR RETRY COUNTI*)OFFTRY= 2 ;OFFSET POSITION RETRY COUNT3*RMCNT= 22. ;NUMBER OF REGISTERS TO LOG ON ERROR++RCL= 1 ;RECALIBRATE IN PROGRESS (1=YES)R&,OFS= 2 ;OFFSET IN PROGRESS (1=YES)2-XCT= 4 ;FUNCTION EXECUTION IN PROGRESS (1=YES)#.OFM= 10 ;IN OFFSET MODE (1=YES)6'/ADR= 40 ;ADDRESS BITS SETUP (1=YES)01;C!2; RK611 DEVICE REGISTER OFFSETSF3;A4'5RKCS1= 0 ;CONTROL STATUS REGISTER 1K6RKWC= 2 ;WORD COUNT 7RKBA= 4 ;BUS ADDRESS8RKDA= 6 ;DISK ADDRESS (9RKCS2= 10 ;CONTROL STATUS REGISTER 2:RKDS= 12 ;DRIVE STATUS;RKER= 14 ;ERROR REGISTER'<RKOF= 16 ;OFFSET/ATTENTION REGISTER =RKDC= 20 ;DESIRED CYLINDER>RKDB= 24 ;DATA BUFFER)%?RKMR1= 26 ;MAINTENANCE REGISTER 1G@RKECPS= 30 ;ECC POSITIONARKECPT= 32 ;ECC PATTERN4%BRKMR2= 34 ;MAINTENANCE REGISTER 2%CRKMR3= 36 ;MAINTENANCE REGISTER 3DE;F; RKCS1 BIT ASSIGNMENTSSG;SH$ISD= 1 ;SELECT DRIVE & GET STATUSJWRT= 2 ;WRITE OFFSETKACK= 3 ;PACK ACKNOWLEDGELDC= 5 ;DRIVE CLEARMUNL= 7 ;UNLOAD HEADSNIE= 100 ;INTERRUPT ENABLEEORDY= 200 ;CONTROLLER READY#PHMS= 113 ;IE + RECALIBRATE + GOEQOFF= 115 ;IE + OFFSET + GORBLS= 117 ;IE + SEEK + GOSREAD= 121 ;IE + READ + GO #TRDH= 125 ;IE + REA00RxIwtöt÷tø tþfDATAD HEADER + GOA$UWDH= 127 ;IE + WRITE HEADER + GO#VWCK= 131 ;IE + WRITE CHECK + GOR3WCERR= 100000 ;CONTROLLER ERROR/CONTROLLER CLEARSXDI= 040000 ;DRIVE INTERRUPTE3YDCPAR= 020000 ;DRIVE TO CONTROLLER PARITY ERRORA#ZCTO= 004000 ;CONTROLLER TIMEOUT&[CDT= 002000 ;CONTROLLER DRIVE TYPE\];A^; RKCS2 BIT ASSIGNMENTSL_;A`aDLT= 100000 ;DATA LATE"bWCE= 040000 ;WRITE CHECK ERRORcUPE= 020000 ;UNIBUS PARITY"dNED= 010000 ;NON EXISTANT DISK$eNEM= 004000 ;NON EXISTANT MEMORY"fPGE= 002000 ;PROGRAMMING ERROR&gMDS= 001000 ;MULTIPLE DRIVE SELECT!hUFE= 000400 ;UNIT FIELD ERRORC1iSCLR= 000040 ;RESET CONTROLLER AND ALL DRIVESjRLS= 000010 ;RELEASE PORTTkl;Rm; RKDS BIT ASSIGNMENTSn;NopSVAL= 100000 ;STATUS VALID(qPIP= 020000 ;POSITIONING IN PROGRESS rDDT= 000400 ;DISK DRIVE TYPEsDRDY= 000200 ;DRIVE READY0tVV= 000100 ;VOLUME VALID uDRA= 000001 ;DRIVE AVAILABLEvw; x; RKER BIT ASSIGNMENTSy;0z!{DCK= 100000 ;DATA CHECK ERROR |UNS= 040000 ;DRIVE UNSAFE1%}OPI= 020000 ;OPERATION INCOMPLETE0#~DTE= 010000 ;DRIVE TIMING ERROR0!WLE= 004000 ;WRITE LOCK ERRORE&€IDAE= 002000 ;INVALID DISK ADDRESS"�COE= 001000 ;CYLINDER OVERFLOW"‚HVRC= 000400 ;HEADER VRC ERROR!ƒBSE= 000200 ;BAD SECTOR ERRORR&„ECH= 000100 ;ERROR CORRECTION HARD!…DTYE= 000040 ;DISK TYPE ERROR†FMTE= 000020 ;FORMAT ERROR3‡CDPAR= 000010 ;CONTROLLER TO DRIVE PARITY ERRORA(ˆNXF= 000004 ;NON-EXECUTABLE FUNCTION ‰SKI= 000002 ;SEEK INCOMPLETE!ŠILF= 000001 ;ILLEGAL FUNCTIONA‹Œ;M�; LOCAL DATAŽ; !�; CONTROLLER IMPURE DATA TABLES0.�; THESE ARE INDEXED BY THE CONTROLLER NUMBER‘;K’9“RTTBL: .BLKW R$$611 ;RETRY COUNT FOR CURRENT OPERATION;5”OFFRTY: .BLKW R$$611 ;OFFSET RECOVERY RETRY COUNTS=•RGBLK: .BLKW R$$611*RMCNT ;CONTROLLER REGISTER STORAGE AREAP7–OFFAD: .BLKW R$$611 ;ADDRESS OF CURRENT OFFSET VALUE >—PRMSV: .BLKW R$$611*5 ;PARAMETER SAVE ARE FOR ERROR RECOVERY˜ ;AND WRITE CHECK FUNCTIONS0™$DMOPT::.REPT R$$611 ;SEEK OPTIMIZATION TABLE1š .WORD 1 ;0=IMPLIED SEEK; 1=ALWAYS SEEK FIRSTP› .ENDRœ�;ž; DIAGNOSTIC FUNCTION TABLERŸ;  &¡FUNTBL: .BYTE HMS, IO.HMS!IQ.UMD&377¢ .BYTE BLS, IO.BLS!IQ.UMD&377£ .BYTE OFF, IO.OFF!IQ.UMD&377E¤ .BYTE RDH, IO.RDH!IQ.UMD&377L¥ .BYTE WDH, IO.WDH!IQ.UMD&377T¦ .BYTE WCK, IO.WCK!IQ.UMD&377R §FUNTBE:R¨©;Rª; OFFSET POSITIONING DATA.«;R¬$­OFFTB: ;POSITIONING VALUE TABLE#® .BYTE 000 ;RETURN TO CENTERLINES¯ .BYTE 020 ; +400° .BYTE 220 ; -400± .BYTE 040 ; +800² .BYTE 240 ; -800³ .BYTE 060 ; +1200R´ .BYTE 260 ; -1200T*µOFFTBE: .BYTE 000 ;RETURN TO CENTERLINE¶·;.¸;DRIVER DISPATCH TABLE¹;Oº4» DDT$ DM,R$$611,,,,,,OPT ;GENERATE DISPATCH TABLE¼½;+@¾; **-DMINI-RK611-RK06/RK07 DISK CARTRIDGE CONTROLLER INITIATOR¿;KGÀ; THIS IS THE DRIVER ENTRY POINT FROM THE QUEUE I/O DIRECTIVE WHEN ANGÁ; I/O REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TONHÂ; PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED UNIT IS NOTHÃ; BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSEIÄ; A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPT SUCCEEDS,OGÅ; THEN THE NEXT I/O OPERATION IS INITIATED AND A RETURN TO THE CALLER Æ; IS EXECUTED.Ç;7 È; INPUTS:GÉ;T8Ê; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIALIZED.Ë; Ì; OUTPUTS:Í;TCÎ; IF THE SPECIFIED UNIT IS NOT BUSY AND AN I/O REQUEST IS WAITINGICÏ; TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-SÐ; ATION IS INITIATED. Ñ;-Ò9ÓDMINI: GTPKT$ DM,R$$611 ;GET NEXT I/O PACKET TO PROCESSÔ; 3Õ; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:EÖ;U)×; R1=ADDRESS OF THE I/O REQUEST PACKET.S/Ø; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.EÙ; R3=CONTROLLER INDEX.+Ú; R4=ADDRESS OF THE STATUS CONTROL BLOCK. 8Û; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIALIZED.Ü;I=Ý; RK611-RK06/RK07 DISK CAR00ZxNxt´cÚµcÛ¶c�·c›’TRIDGE I/O REQUEST PACKET FORMAT:RÞ;E#ß; WD. 00 -- I/O QUEUE THREAD WORDH1à; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER6á; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK>â; WD. 03 -- POINTER TO 2ND LUN WORD IN REQUESTOR TASK HEADER6ã; WD. 04 -- CONTENTS OF FIRST LUN WORD (UCB ADDRESS)ä; WD. 05 -- I/O FUNCTION CODET1å; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK 1æ; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCKC>ç; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000)4è; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE3é; WD. 12 -- MEMORY EXTENSION BITS OF I/O TRANSFERR,ê; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.ë; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED=ì; WD. 15 -- DIAGNOSTIC SUPPLIMENTAL PARAMETER ELSE NOT USED49í; WD. 16 -- BITS <0:7> = HIGH LBN, BITS <8:15> NOT USED $î; WD. 17 -- LOW LBN OF I/O REQUEST:ï; WD. 20 -- RELOCATION BIAS OF DIAGNOSTIC REGISTER BLOCK<ð; WD. 21 -- DIAGNOSTIC REGISTER BLOCK ADDRESS DISPLACEMENTñ;Iò%ó CLRB U.CW2+1(R5) ;RESET UNIT FLAGS &ô CALL $VOLVD ;VALIDATE VOLUME VALIDõ BCS 10$ ;IF CS WE FAILEDö TST R0 ;TRANSFER FUNCTION?÷ BMI DMRQC ;IF MI YES+ø JMP DMVV ;PROCESS VOLUME VALID FUNCTIONFù10$: JMP DMDONE ;EXITú;S+û; REQUEST CONTROLLER FOR PROPER OPERATION ü; 2ýDMRQC: MOV S.KRB(R4),R1 ;GET CURRENT KRB ADDRESS7þ BIT #KS.POE,K.STS(R1) ;PARALLEL OPERATIONS ENABLED?Bÿ BEQ DMRQC1 ;IF EQ NO0 MOV S.PKT(R4),R3 ;RETRIEVE I/O PACKET ADDRESS? BITB #IQ.UMD!IQ.Q,I.FCN(R3) ;DIAGNOSTIC OR EXPRESS REQUEST?G BNE DMRQC1 ;IF NE YEST/ MOVB K.CON(R1),R3 ;RETREIVE CONTROLLER INDEXT% TST $DMOPT(R3) ;WHICH SEEK METHOD?C$ BNE 10$ ;IF NE ALWAYS SEEK FIRST5 BIT #KS.DIP,K.STS(R1) ;DATA TRANSFER IN PROGRESS?- BEQ DMRQC1 ;IF EQ NO, START DATA TRANSFER 410$: BISB #S3.SIP,S.ST3(R4) ;SET SEEK IN PROGRESS8  CALL $RQCNC ;REQUEST CONTROLLER FOR CONTROL FUNCTION  BR DMINIO ;INITIATE THE SEEK= DMRQC1: BICB #S3.SIP,S.ST3(R4) ;SET SEEK ALREADY COMPLETEDI5  CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFERC ; "; **-DMUBMP-SETUP UNIBUS ADDRESS;R@; THIS SECTION OF CODE WILL DETERMINE IF THE UNIBUS ADDRESS ISB; ALREADY IN THE FORMAT FOR THE UNIBUS MAP ON 22-BIT PROCESSORS.?; IT WILL ALSO CONVERT THE I/O FUNCTION CODE TO IT'S HARDWARE0; EQUIVALENT..;4@; NOTE: AT THIS POINT THE REQUESTING UNIT MUST BE THE OWNER OF'; THE CONTROLLER FOR A DATA TRANSFER. ;E;DMUBMP: BITB #ADR,U.CW2+1(R5);ADDRESS BITS ALREADY SETUP?I BNE DMINIO ;IF NE YESC0 MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS7 CMP #IO.RDH!IQ.UMD,I.FCN(R1) ;READ HEADER FUNCTION?W) BEQ 10$ ;IF EQ YES, NO NEED FOR UMR'S ) CALL $STMAP ;SETUP UNIBUS MAP ADDRESS 4 10$: ASL U.BUF(R5) ;POSITION MEMORY EXTENSION BITS! ASL U.BUF(R5) ;...R" ASL U.BUF(R5) ;....# ASL U.BUF(R5) ;...I7$ CMP #IO.RDH!IQ.UMD,I.FCN(R1) ;READ HEADER FUNCTION? )% BEQ 20$ ;IF EQ YES, NO NEED FOR UMR'S'& CALL $MPUBM ;MAP UNIBUS TO TRANSFERI<'20$: BISB #ADR,U.CW2+1(R5);INDICATE ADDRESS SETUP COMPLETE(; 5); CONVERT I/O FUNCTION CODE TO HARDWARE EQUIVALENT.C*; 0+ MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS7, CMPB #IO.HMS/256.,I.FCN+1(R1) ;DIAGNOSTIC FUNCTION?R- BNE 40$ ;IF NE NOR0. MOV #FUNTBL,R0 ;GET ADDRESS OF FUNCTION TABLE:/30$: MOVB (R0)+,U.BUF(R5) ;LOAD CONTROLLER FUNCTION CODE00 CMPB (R0)+,I.FCN(R1) ;IS IT THE CORRECT CODE?1 BEQ 60$ ;IF EQ YES)2 CMP #FUNTBE,R0 ;END OF FUNCTION TABLE?M3 BNE 30$ ;IF NE NO2440$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION-5 MOVB #READ,U.BUF(R5) ;ASSUME READ FUNCTIONO96 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION? (7 BHIS 50$ ;IF HIS FUNCTION IS ILLEGAL*8 MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS 9 CALL DMSDC ;SELECT THE DRIVE: JMP DMFIN1 ;FINISH I/O;50$: BEQ 60$ ;IF EQ YES0< ADD #WRT,U.BUF(R5) ;CONVERT TO WRITE FUNCTION-=60$: MOV S.KRB(R4),R3 ;RETRIEVE KRB ADDRESS /> MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEXB&? MUL #5,R3 ;SETUP AN INDEX INTO ...)@ ADD #PRMSV,R3 ;... PARA00bxIwtöt÷tø tþfDATAMETER SAVE AREA(A MOV U.BUF(R5),(R3)+ ;SAVE PARAMETERSB MOV U.BUF+2(R5),(R3)+ ;...C MOV U.CNT(R5),(R3)+ ;...D MOV I.PRM+10(R1),(R3)+ ;...SE MOV I.PRM+12(R1),(R3)+ ;...EFG;R'H; **-DMINIO-INITIATE AN I/O OPERATIONEI;JAJ; THIS ROUTINE WILL INITIATE EITHER A SEEK OR THE DATA TRANSFERU<K; OPERATION DEPENDING ON HOW THE CONTROLLER WAS REQUESTED.L; M; INPUTS:N;VO; R4=ADDRESS OF THE SCB.P; R5=ADDRESS OF THE UCB.Q;TR=SDMINIO: BICB #RCL!OFS,U.CW2+1(R5) ;RESET POSITIONING FLAGS%T MOV @S.KRB(R4),R2 ;GET CSR ADDRESS0U MOV S.PKT(R4),R3 ;RETREIVE I/O PACKET ADDRESS'V MOV #CERR,(R2) ;CLEAR THE CONTROLLER.(W MOVB U.UNIT(R5),R0 ;FETCH UNIT NUMBER%X MOV R0,RKCS2(R2) ;SELECT THE DRIVERY;E;Z; DETERMINE IF DRIVE'S PORT IS SEIZED BY THIS CONTROLLER.A[;A)\ CALL DMSD ;ATTEMPT TO SEIZE THE DRIVEC-] BIT #DRA,RKDS(R2) ;DID WE SEIZE THE DRIVE?^ BNE 10$ ;IF NE YES*_ CALL DMCLR ;CLEAR THE CONTROLLER ERROR5` MOV #IE.DNR&377,R0 ;SET DRIVE NOT READY ERROR CODENa BR 40$ ;AND GO AWAY4b;;3c; CHECK IF THE HEADS ARE ON THE CORRECT CYLINDER.Ad;A/e10$: CALL DMCLER ;CLEAR CONTROLLER AND DRIVE0f BITB #S3.SIP,S.ST3(R4) ;ARE WE DOING A SEEK?g BEQ 20$ ;IF EQ NO ,h CALL DMCYL ;GET CURRENT CYLINDER ADDRESS+i CMP I.PRM+10(R3),R0 ;DO WE NEED TO SEEK?M/j BNE 30$ ;IF NE YES, BYPASS CONTROLLER SETUPS%k MOV #IE,(R2) ;RE-ENABLE INTERRUPTS1%l JMP DMRQC1 ;GO REQUEST CONTROLLERHm;T0n; LOAD CONTROLLER REGISTERS FOR DATA TRANSFER.o;Y$p20$: ADD #RKCS2,R2 ;POINT TO RKCS28q MOV I.PRM+12(R3),-(R2) ;SET TRACK AND SECTOR ADDRESS3r MOV U.BUF+2(R5),-(R2) ;SET USER BUFFER ADDRESSR-s MOV U.CNT(R5),-(R2) ;SET BYTES TO TRANSFERA)t ROR (R2) ;MAKE THAT WORDS TO TRANSFERY+u NEG (R2) ;MAKE IT A NEGATIVE WORD COUNTMv TST -(R2) ;POINT TO CSRKw;)x; CHECK FOR DRIVE NOT READY CONDITIONS.Uy;z30$: CALL DMDC ;CLEAR DRIVE5{ MOV #IE.DNR&377,R0 ;ASSUME SELECTED UNIT NOT READY 3| MOV I.PRM+10(R3),RKDC(R2) ;SET CYLINDER ADDRESS,} MOV RKDS(R2),R1 ;GET CURRENT DRIVE STATUS~ COM R1 ;COMPLEMENT STATUS ' BIT #SVAL!DRDY!DRA,R1 ;DRIVE READY? € BNE 40$ ;IF NE NOS#� BIT #UNS,RKER(R2) ;DRIVE UNSAFE? ‚ BEQ 60$ ;IF EQ NO25ƒ40$: BITB #US.SPU,U.STS(R5) ;IS DRIVE SPINNING UP? „ BEQ 45$ ;IF EQ NO;… BITB #US.VV,U.STS(R5);WAS THE VOLUME PREVIOUSLY MOUNTED?E† BEQ DMPWF1 ;IF EQ NO*‡ BR DMPWF0 ;YES, WAIT FOR IT TO SPIN UP*ˆ45$: MOV R3,R1 ;COPY I/O PACKET ADDRESS3‰ CALL DMDINT ;TRY FOR DIAGNOSTIC DRIVE NOT READYŠ BCS 50$ ;IF CS IT WASN‹Œ .IF DF S2.NRD�8Ž BIT #S2.NRD,S.ST2(R4) ;IS THIS FIRST DRIVE NOT READY?#� BNE 47$ ;IF NE NO, GO LOG ERROR#8� BIS #S2.NRD,S.ST2(R4) ;INDICATE FIRST DRIVE NOT READY‘ JMP DMPWF1 ;GO DO A RETRYD9’47$: BIC #S2.NRD,S.ST2(R4) ;CLEAR FIRST DRIVE NOT READYU“” .ENDC ; DF S2.NRD•*– CALL DMLERR ;LOG DRIVE NOT READY ERROR—50$: JMP DMFIN ;FINISH I/OO,˜60$: BIT #VV,R1 ;DID VOLUME VALID CHANGE?1™ BEQ 65$ ;IF EQ NO (NOTE REVERSE STATUS OF VV)O0š BITB #US.SPU,U.STS(R5) ;DID WE JUST SPIN UP?› BEQ 40$ ;IF EQ NO2.œ MOV #ACK,R0 ;GET PACK ACKNOWLEDGE FUNCTION� CALL DMGO ;SET VVG2ž BISB #US.VV,U.STS(R5);SET SOFTWARE VOLUME VALID3Ÿ65$: BIT #S2.MAD,S.ST2(R4) ;MULTI ACCESS DEVICE?  BEQ 80$ ;IF EQ NOR.¡ CMP S.KRB(R4),S.KTB(R4) ;IS THIS PORT 'A'?¢ BNE 70$ ;IF NE NO 0£ BICB #S3.SPA,S.ST3(R4) ;YES, SHOW IT SPUN UP ¤ BR 75$ ;3¥70$: BICB #S3.SPB,S.ST3(R4) ;IT MUST BE PORT 'B'B3¦75$: BITB #S3.SPU,S.ST3(R4) ;BOTH PORTS SPUN UP?T§ BNE 85$ ;IF NE NOI7¨80$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UP04©85$: BITB #S3.SIP,S.ST3(R4) ;SHOULD WE DO A SEEK?ª BEQ 90$ ;IF EQ NOS«;S¬; START EXPLICIT SEEK.­;:'® MOV #BLS,R0 ;GET SEEK FUNCTION CODEI¯ CALL DMXFR ;START THE SEEK*° BR DMPWF3 ;RELEASE CONTROLLER AND EXIT±;B²; START DATA TRANSFER.³;.;´90$: CMPB U.BUF(R5),#BLS ;IS THIS A POSITIONING FUNCTION?Cµ BHI DMDIP ;IF HI NOM4¶ BISB #RCL!OFS,U.CW2+1(R5) ;SET POSITIONING FLAGS2· CMP00jxNxt´cÚµcÛ¶c�·c›’ #IO.OFF!IQ.UMD,I.FCN(R3) ;OFFSET FUNCTION?¸ BNE DMDIP ;IF NE NOE3¹ MOV I.PRM+6(R3),RKOF(R2) ;YES, SET OFFSET VALUE;<ºDMDIP: MOV U.BUF(R5),R0 ;GET FUNCTION CODE AND MEMORY BITS2»DMDIP1: MTPS #PR5 ;;;EXECUTE AT DEVICE PRIORITY&¼ MOV S.KRB(R4),R3 ;;;GET KRB ADDRESS9½ BIT #IQ.UMD,I.FCN(R1) ;;;IS IT A DIAGNOSTIC FUNCTION?T¾ BEQ DMDIP2 ;;;IF EQ NO4¿ CMPB U.BUF(R5),#BLS ;;;IS IT A UMD SEEK FUNCTION?À BLOS DMXFR ;;;IF LOS YESAÁDMDIP2: BIS #KS.DIP,K.STS(R3) ;;;SET DATA TRANSFER IN PROGRESSO)ÂDMXFR: MTPS #PR5 ;;;DISABLE INTERRUPTSB)à CLR S.FRK+2(R4) ;;;INIT FORK INTERLOCKO/Ä BIS #S2.ACT,S.ST2(R4) ;;;SHOW I/O IS ACTIVEF7Å BISB #XCT,U.CW2+1(R5) ;;;SHOW FUNCTION HAS EXECUTEDS1Æ MOVB S.ITM(R4),S.CTM(R4) ;;;SET TIMEOUT COUNTR.Ç CALL DMXCT ;;;SET CDT,LOAD FUNCTION AND GOÈ MTPS #0 ;ALLOW INTERRUPTSIÉÊ;+>Ë; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.Ì;-Í&ÎDMCAN: RETURN ;;;NOP FOR THE RK611ÏÐ;+<Ñ; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND@Ò; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT?Ó; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVEBAÔ; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANY(CÕ; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESSFÖ; THE UNIT IS ALREADY READY.×;-Ø+ÙDMPWF: MOV @S.KRB(R4),R2 ;GET CSR ADDRESS $Ú CALL DMCLR ;CLEAR THE CONTROLLER+Û TSTB S.STS(R4) ;IS DRIVE CURRENTLY BUSY?Ü BEQ DMPWF2 ;IF EQ NO;ÝDMPWF0: MOVB #15.,S.STS(R4) ;WAIT A MAXIMUM OF ONE MINUTEM8ÞDMPWF1: MOVB S.ITM(R4),S.CTM(R4) ;4 SECONDS AT A TIME7ßDMPWF2: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UP7àDMPWF3: CALLR $RLCN ;RELEASE CONTROLLER IF NECESSARYTáâã;+7ä; **-$DMINT-RK611-RK06/RK07 DISK CARTRIDGE CONTROLLERU(å; INTERRUPT AND ERROR SERVICE ROUTINESæ;ç; HARD ERRORS ---> $IODON;(è; SOFT ERRORS ---> RETRY LAST FUNCTION;é; DATA ERRORS ---> RETRY FUNCTION AND CORRECT IF POSSIBLEê;-ë ì .ENABL LSB5í$DMINT::BR DMFRK ;;;ENTRY POINT FOR DATA TRANSFERST,î TST S.FRK+2(R4) ;;;UNSOLICITED INTERRUPT?ï BEQ 5$ ;;;IF EQ NO.ð MOV @S.KRB(R4),-(SP);;;RETREIVE CSR ADDRESS+ñ BIC #IE!CERR,(SP)+ ;;;DISABLE INTERRUPTSIò RETURN ;;;,ó5$: CALL $FORK ;;;CREATE A SYSTEM PROCESS;ôDMFRK: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFERS,õ MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS/ö MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEX %÷ MOV @S.KRB(R4),R2 ;GET CSR ADDRESSI)ø MOVB U.UNIT(R5),R0 ;GET UNIT TO SELECTR$ù MOV R0,RKCS2(R2) ;SELECT THE UNIT%ú TSTB S.STS(R4) ;IS THIS UNIT BUSY? û BNE 10$ ;IF NE YES ü CALL DMSDC ;SELECT THE DRIVE&ý CALL DMDC ;CLEAR DRIVE (DROPS ATA).þ BIS #RLS,RKCS2(R2) ;SET TO RELEASE THE PORTÿ CALL DMSD ;RELEASE THE PORTY: BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED( CLR S.FRK+2(R4) ;RESET FORK INTERLOCK% MOV #IE,(R2) ;RE-ENABLE INTERRUPTS3* BR DMPWF3 ;RELEASE CONTROLLER AND EXIT;2B; INTERRUPT WAS FROM A BUSY UNIT. IF WE JUST DID A SEEK WE WILLC; GO AND START THE DATA TRANSFER OPERATION. IF THE DATA TRANSFERY@; TERMINATED, DETERMINE WHY. IF WE ARE SPINNING UP, RETRY THE; OPERATION. ;E3 10$: BITB #US.SPU,U.STS(R5) ;ARE WE SPINNING UP?H  BEQ 15$ ;IF EQ NOR/  BIT #S2.MAD,S.ST2(R4) ;MULTI-ACCESS DEVICE?W  BEQ DMREST ;IF EQ NO. CMP S.KRB(R4),S.KTB(R4) ;IS THIS PORT 'A'? BNE 14$ ;IF NE NOI4 BITB #S3.SPA,S.ST3(R4) ;IS PORT 'A' SPINNING UP? BNE DMREST ;IF NE YESR  BR 15$ ;814$: BITB #S3.SPB,S.ST3(R4) ;IS PORT 'B' SPINNING UP? BNE DMREST ;IF NE YESH415$: MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS5 BIT #S2.EIP,S.ST2(R4) ;ERROR ALREADY IN PROGRESS?0 BNE 20$ ;IF NE YES6 CALL DMPRM ;RESET RETRY AND OFFSET RECOVERY VALUES620$: BITB #S3.SIP,S.ST3(R4) ;DID WE JUST DO A SEEK? BEQ 30$ ;IF EQ NOK2 BICB #S3.SIP,S.ST3(R4) ;CLEAR SEEK IN PROGRESS) TST (R2) ;ANY ERRORS DURING THE SEEK?R BPL 70$ ;IF PL NOB+ CALL DMSDC ;ISSUE SELECT DRIVE FUNCTIONB# CALL DMLERR ;LOG T00rxIwtöt÷tø tþfDATAHE SEEK ERRORP*  MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS#! DECB RTTBL(R3) ;COUNT THIS RETRYK$" CALL DMERL ;FINISH ERROR LOGGING,# CALLR DMRCAL ;ISSUE RECALIBRATE FUNCTION$;S%; VALID INTERRUPT.&;R5'30$: MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFER(-( CALL DMDINT ;PROCESS DIAGNOSTIC INTERRUPTQ1) BCS 100$ ;IF CS INTERRUPT PROCESSING COMPLETEG4* BITB #RCL!OFS,U.CW2+1(R5) ;POSITIONING FUNCTION?+ BNE 40$ ;IF NE YES,;M3-; INTERRUPT WAS DUE TO A DATA TRANSFER OPERATION.L.;E/ TST (R2) ;ANY ERRORS?(,0 BMI 35$ ;IF MI YES, FORGET STATUS UPDATE-1 TST RKDS(R2) ;IS THE CURRENT STATUS VALID?R2 BMI 35$ ;IF MI YES+3 CALL DMSDC ;ISSUE SELECT DRIVE FUNCTIONA435$: TST (R2) ;ANY ERRORS?V5 BPL DMWCHK ;IF PL NO*6 CALL DMLERR ;YES, LOG THE DEVICE ERROR37 MOV RKER(R2),R1 ;COPY CONTENTS OF ERROR REGISTER .8 MOV #IE.WLK&377,R0 ;ASSUME WRITE LOCK ERROR"9 BIT #WLE,R1 ;WRITE LOCK ERROR?: BNE 50$ ;IF NE YES-; MOV #IE.BBE&377,R0 ;ASSUME BAD BLOCK ERRORN!< BIT #BSE,R1 ;BAD BLOCK ERROR?(= BNE 50$ ;IF NE YES1> MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERRORR;? BIT #UNS!DTE!IDAE!COE!DTYE!FMTE!NXF!ILF,R1 ;HARD ERROR?S@ BNE 50$ ;IF NE YES7A BIT #UPE!NED!NEM!PGE!MDS!UFE,RKCS2(R2) ;HARD ERROR? !B BNE 50$ ;IF NE YES, FINISH UPE(C JMP DMSOFT ;TRY FOR SOFT/DATA ERRORSD;FE;R!F; PROCESS POSITIONING OPERATIONAG; *H40$: MOVB U.CW2+1(R5),R0 ;GET UNIT FLAGSI COM R0 ;TOGGLE THEM 5J BIT #OFM!RCL,R0 ;IN OFFSET MODE AND DOING A RECAL?K BNE 45$ ;IF NE NOO"L CLR R0 ;GET READY FOR THE BISB3M BISB RTTBL+1(R3),R0 ;RETREIVE ERROR/SUCCESS CODE*N BICB #OFM!RCL,U.CW2+1(R5) ;CLEAR FLAGS"O CALLR DMFIN1 ;NOW SAY GOOD-BYE5P45$: MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERRORR(Q TST (R2) ;ERRORS DURING POSITIONING?R BPL 60$ ;IF PL NO *S CLR RKWC(R2) ;SHOW ALL BYTES TRANSFEREDT50$: JMP DMFIN ;FINISH I/O02U60$: BITB #RCL,U.CW2+1(R5);RECALIBRATE FUNCTION?V BEQ 65$ ;IF EQ NOF,W JMP DMRTRY ;YES, RETRY PREVIOUS FUNCTION0X65$: BICB #OFS,U.CW2+1(R5) ;RESET OFFSET FLAG.Y CMP #OFFTBE,OFFAD(R3) ;FINAL OFFSET TRIED?Z BEQ 50$ ;IF EQ YES[;R\; RESTART THE I/O OPERATION];R1^DMREST: MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESSR7_70$: JMP DMUBMP ;SETUP UNIBUS MAP AND RETRY FUNCTIONN`;I"a; TEST FOR WRITE CHECK OPERATIONb;R2cDMWCHK: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS=d BITB #IO.WLC&377,I.FCN(R1) ;WRITE FOLLOWED BY WRITE CHECK?Oe BNE 80$ ;IF NE YES7f BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED BY MCR?Bg BEQ 100$ ;IF EQ NO6h80$: CMPB #READ,U.BUF(R5) ;WAS LAST FUNCTION A READ?i BEQ 100$ ;IF EQ YES 8j CMPB #READ+WRT,U.BUF(R5) ;WAS LAST FUNCTION A WRITE?k BNE 100$ ;IF NE NO!l CALL DMPRM ;RESET RETRY COUNTU%m MUL #5,R3 ;FORM AN INDEX INTO ...O)n ADD #PRMSV,R3 ;... PARAMETER SAVE AREAN+o MOV (R3)+,U.BUF(R5) ;RESTORE PARAMETERSAp MOV (R3)+,U.BUF+2(R5) ;...q MOV (R3)+,U.CNT(R5) ;...r MOV (R3)+,I.PRM+10(R1) ;...Es MOV (R3)+,I.PRM+12(R1) ;...;0t MOVB #WCK,U.BUF(R5) ;SET WRITE CHECK FUNCTION*u BR DMREST ;START WRITE CHECK OPERATIONv:w100$: CLR U.CNT(R5) ;NO ERRORS, SET ALL BYTES TRANSFEREDx BR DMFIN1 ;FINISH I/O y .DSABL LSB1z{;+B|; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING REPEATEDE}; UNLESS THE OPERATION WAS DIAGNOSTIC. TIMEOUTS ARE USUALLY CAUSEDU>~; BY POWER FAILURE BUT MAY ALSO BE THE RESULT OF NO RESPONSE; FROM THE HARDWARE.€;-�9‚DMOUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP?.ƒ BEQ 15$ ;;;IF EQ NO)1„ BIT #S2.MAD,S.ST2(R4) ;;;MULTI-ACCESS DEVICE?I… BEQ 10$ ;;;IF EQ NO0† CMP S.KRB(R4),S.KTB(R4) ;;;IS THIS PORT 'A'?+‡ BNE 5$ ;;;IF NE NO, IT MUST BE PORT 'B' 6ˆ BITB #S3.SPA,S.ST3(R4) ;;;IS PORT 'A' SPINNING UP?‰ BNE 10$ ;;;IF NE YES)Š BR 15$ ;;;TIMEOUT FOR NORMAL FUNCTION 9‹5$: BITB #S3.SPB,S.ST3(R4) ;;;IS PORT 'B' SPINNING UP?A(Œ BEQ 15$ ;;;IF EQ NO, NORMAL FUNCTION3�10$: DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET?(Ž BEQ 15$ ;;;IF EQ YES� MTPS #0 ;;;ALLOW INT00zxNxt´cÚµcÛ¶c�·c›’ERRUPTS1� JMP DMRQC ;REQUEST CONTROLLER AND RESTART I/O‘.’15$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY-“ MOV S.PKT(R4),R1 ;;;GET I/O PACKET ADDRESST+” MOV (R2),I.PRM+6(R1);;;SAVE CSR CONTENTS • MTPS #0 ;;;ALLOW INTERRUPTSB5– CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFERF6— MOV #IE.DNR&377,R0 ;GET DEVICE NOT READY ERROR CODE+˜ MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS 3™ MOV I.PRM+6(R1),$DVSAV ;SAVE SAVED CSR CONTENTSU,š MOV S.KRB(R4),R2 ;GET CURRENT KRB ADDRESS/› MOVB K.CON(R2),R3 ;RETREIVE CONTROLLER INDEXN œ MOV (R2),R2 ;GET CSR ADDRESS)� MOVB U.UNIT(R5),R1 ;GET UNIT TO SELECT$ž MOV R1,RKCS2(R2) ;SELECT THE UNIT+Ÿ CALL DMSDC ;ISSUE SELECT DRIVE FUNCTIONC:Ÿ MOV S.PKT(R4),R1 ;PUT BACK THE I/O PKT ADDRESS ;GM107,  CALL DMDINT ;TEST FOR DIAGNOSTIC TIMEOUT¡ BCS DMFIN ;IF CS IT WASO#¢ CALL DMLTMO ;LOG DEVICE TIMEOUTR2£ BITB #S3.SIP,S.ST3(R4) ;TIMEOUT DURING A SEEK?¤ BEQ 20$ ;IF EQ NOE6¥ CALL DMPRM ;RESET RETRY AND OFFSET RECOVERY VALUES=¦20$: BICB #S3.SIP,S.ST3(R4) ;ASSUME DATA TRANSFER FUNCTIONG/§ BICB #OFM,U.CW2+1(R5);CLEAR OFFSET MODE FLAGO:¨ BITB #RCL!OFS,U.CW2+1(R5) ;TIMEOUT DURING POSITIONING?© BNE DMFIN ;IF NE YES6ª BITB #US.SPU,U.STS(R5) ;WAS THE DRIVE SPINNING UP?« BEQ DMRTRY ;IF EQ NO/¬ MOV #IE.DNR&377,R0 ;YES, SET DRIVE NOT READY ­ BR DMFIN ;AND EXIT®;L'¯; CHECK FOR RETRY OF CURRENT FUNCTION(°;;2±DMRTRY: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS)² BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES? ³ BNE DMFIN ;IF NE YES"´ DECB RTTBL(R3) ;RETRY FUNCTION?µ BLE DMFIN ;IF LE NOC#¶ JMP DMREST ;YES, RETRY FUNCTIONB·¸;O!¹; **-DMFIN-FINISH I/O OPERATIONIº;ND»; THIS ROUTINE WILL SET THE ACTUAL BYTES TRANSFERED PARAMETER, THEC¼; ERROR LOGGING RETRY COUNTS AND CALL $IODON. THE SELECTED DRIVE >½; IS RELEASED, IF REQUESTED, AND THE CONTROLLER IS RELEASED.¾;R ¿; INPUTS:FÀ;OÁ; R0=SUCCESS/ERROR CODEK2Â; R2=ADDRESS OF CONTROLLER CSR OR REGISTER BLOCKÃ; R4=ADDRESS OF THE SCBÄ; R5=ADDRESS OF THE UCBDÅ;TÆ1ÇDMFIN: MOV RKWC(R2),R1 ;GET RESIDUAL WORD COUNTJ!È ASL R1 ;CONVERT TO BYTE COUNT/É NEG R1 ;CONVERT TO POSITIVE BYTES REMAINING<ÊDMFIN0: MOV R1,U.CNT(R5) ;SAVE BYTES REMAINING TO TRANSFER1ËDMFIN1: MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESSDÌ CALL DMDC ;CLEAR DRIVE0ÍDMFIN3: MOV S.KRB(R4),R3 ;RETREIVE KRB ADDRESS/Î MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEXE(Ï BITB #OFM,U.CW2+1(R5);IN OFFSET MODE?Ð BEQ 5$ ;IF EQ NO/Ñ MOVB R0,RTTBL+1(R3) ;SAVE ERROR/SUCCESS CODE #Ò BR DMRCAL ;NOW DO A RECALIBRATE(;Ó5$: BITB #S3.NRL,S.ST3(R4) ;SHOULD WE RELEASE THE DRIVE? Ô BNE 15$ ; IF NE NO/Õ BIT #DRA,RKDS(R2) ;HAVE WE SEIZED THE DRIVE?1Ö BEQ 10$ ;IF EQ NOR'× BIS #RLS,RKCS2(R2) ;RELEASE THE PORTB4Ø CALL DMSD ;ISSUE SELECT FUNCTION TO RELEASE PORT>Ù10$: BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED7Ú15$: MOV #IE,(R2) ;RE-DISPATCH IF DRIVE INTERRUPT SETC1Û MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTM8Ü BITB #XCT,U.CW2+1(R5) ;HAS A FUNCTION BEEN EXECUTED?Ý BNE 20$ ;IF NE YES)Þ MOV #RETRY,R2 ;SET MAXIMUM RETRY COUNTR5ß20$: BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNT,7à BICB #S3.SIP,S.ST3(R4) ;RESET SEEK IN PROGRESS FLAGN"á CALL $RLCN ;RELEASE CONTROLLER2âDMDONE: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS3ã MOV I.PRM+4(R1),R1 ;GET ACTUAL BYTES TO TRANSFER 8ä SUB U.CNT(R5),R1 ;CALCULATE BYTES ACTUALLY TRANSFERED1å CLR S.FRK+2(R4) ;CLEAR THE FORK INTERLOCK FLAGA-æ MOV @S.KRB(R4),-(SP) ;GET THE CSR ADDRESS #ç MOV #IE,(SP)+ ;ENABLE INTERRUPTSE%è CALL $IODON ;FINISH I/O OPERATION #é JMP DMINI ;PROCESS NEXT REQUESTRêë; 8ì; **-DMSOFT-TEST FOR SOFT RECOVERABLE ERROR CONDITIONSí; î; INPUTS:Eï;Að; R0=IE.VER&377;ñ; R1=CONTENTS OF RKEROò; R2=ADDRESS OF CSREó; ô0õDMSOFT: BIT #WCE,RKCS2(R2) ;WRITE CHECK ERROR?ö BEQ 10$ ;IF EQ NOU1÷ MOV #IE.WCK&377,R0 ;SET WRITE CHECK ERROR CODE-ø BR DMRTRY ;AND ATTEMPT TO RETRY OPERATIONA&ù10$: TST RKCS2(R2) ;DATA LATE ERROR?ú BMI DMDLT00‚xIwtöt÷tø tþfDATA ;IF MI YES;û BIT #DCPAR!CTO,(R2) ;CONTROLLER TIMEOUT OR PARITY ERROR?ü BNE DMRTRY ;IF NE YES 3ý BIT #CDPAR,R1 ;CONTROLLER TO DRIVE PARITY ERROR?Eþ BNE DMRTRY ;IF NE YES ,ÿ BIT #OPI!SKI,R1 ;DRIVE POSITIONING ERROR? BEQ DMECC ;IF EQ NO * MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS+ CALL DMCLER ;CLEAR CONTROLLER AND DRIVE$; ; DO A RECALIBRATE OPERATION;I0DMRCAL: MOV #HMS,R0 ;SET RECALIBRATE FUNCTION6 BISB #RCL,U.CW2+1(R5);INDICATE RECALIBRATE FUNCTION' CALLR DMDIP1 ;ISSUE THE RECALIBRATEA  ;)# ; **-DMECC-ATTEMPT ECC CORRECTION ;BF ; THIS ROUTINE IS ENTERED IF A DATA ERROR IS DETECTED. IF THE ERRORI; IS CORRECTABLE, THE EXECUTIVE ECC ROUTINE IS CALLED AND THE OPERATIONOG; IS RESTARTED FROM WHERE THE CONTROLLER STOPPED. IF OFFSET RECOVERY; IS REQUIRED, WE WILL DO IT. ;R ; INPUTS:;A; R1=CONTENTS OF RKER ; R2=ADDRESS OF CONTROLLER CSR;R8DMECC: CMPB #READ,U.BUF(R5) ;IS THIS A READ OPERATION? BNE DMRTRY ;IF NE NO0 MOV S.PKT(R4),R3 ;RETREIVE I/O PACKET ADDRESS) BITB #IQ.X,I.FCN(R3) ;INHIBIT RETRIES?E BNE DMFIN ;IF NE YES) MOV S.KRB(R4),R3 ;RETREIVE KRB ADDRESST/ MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEX $ DECB RTTBL(R3) ;RE-READ THE DATA?,  BLE 10$ ;IF LE NO, DO THE ECC CORRECTION+! CALLR DMREST ;YES, RESTART THE TRANSFER ."10$: MOVB #RETRY,RTTBL(R3);RESET RETRY COUNT5# MOV RKWC(R2),R0 ;GET NEGATIVE # OF WORDS REMAININGA$ ASL R0 ;CONVERT TO BYTES8% ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED0& BEQ DMOFF ;IF EQ NONE TRANSFERED, TRY OFFSET4' BIC #^C,R1 ;ISOLATE IMPORTANT BITS'( CMP #DCK,R1 ;ONLY DATA CHECK ERROR?M#) BNE DMOFF ;IF NE NO, TRY OFFSET ,* MOV RKECPS(R2),R1 ;GET ECC ERROR POSITION0+ MOV RKECPT(R2),R3 ;GET ECC CORRECTION PATTERN,, MOV RKWC(R2),R2 ;GET REMAINING WORD COUNT&- CALL $ECCOR ;DO THE ECC CORRECTION1. CALL DMPRM0 ;RESET OFFSET RECOVERY PARAMETERSA*/ CALL DMCALC ;RE-CALCULATE DISK ADDRESS70 MOV #IS.SUC&377,R0 ;ASSUME NO MORE WORDS TO TRANSFERQ-1 TST U.CNT(R5) ;ANY MORE WORDS TO TRANSFER?B2 BNE 20$ ;IF NE YES3 CALLR DMFIN ;NO, FINISH I/O#.420$: MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS+5 CALL DMCLER ;CLEAR CONTROLLER AND DRIVE;$6 CALL DMERL ;FINISH ERROR LOGGING97 MOV U.BUF+2(R5),RKBA(R2) ;SET PREVIOUS BUFFER ADDRESS <8 MOV I.PRM+10(R1),RKDC(R2) ;SET PREVIOUS CYLINDER ADDRESS89 MOV I.PRM+12(R1),RKDA(R2) ;SET PREVIOUS DISK ADDRESS*: CALLR DMDIP ;RESTART THE DATA TRANSFER;<;3=; **-DMDLT-DATA LATE RECOVERYA>;QJ?; THIS ROUTINE IS ENTERED IF A DATA LATE ERROR IS DETECTED. WE WILL NOWI@; BACKUP THE WORD COUNT, BUS ADDRESS AND CYLINDER/TRACK/SECTOR ADDDRESSEIA; BY ONE BLOCK AND RETRY THE TRANSFER FROM THIS POINT. THIS IS DONE TORJB; PREVENT THE DATA LATE CONDITION FROM RECURRING DUE TO A LONG TRANSFER.C;P D; INPUTS:CE; F; R0=IE.VER&377DG; R1=CONTENTS OF RKER1H; R2=ADDRESS OF CSREI; J6KDMDLT: MOV S.PKT(R4),R3 ;RETRIEVE I/O PACKET ADDRESS(L BITB #IQ.X,I.FCN(R3) ;INHIBIT RETRIESM BEQ 20$ ;IF EQ NOI%N10$: JMP DMFIN ;YES, FINISH UP I/OT-O20$: MOV S.KRB(R4),R3 ;RETRIEVE KRB ADDRESSS/P MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX $Q DECB RTTBL(R3) ;ANY RETRIES LEFT?R BLE 10$ ;IF LE NO 0S MOV RKWC(R2),R0 ;GET NEGATIVE WORDS REMAINING,T BNE 30$ ;IF NE WE HAD A PARTIAL TRANSFER2U MOV #-1,R0 ;DLT ON LAST WORD, FAKE PARTIAL XFR)V30$: ASL R0 ;CONVERT TO NEGATIVE BYTES8W ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED/X BIC #777,R0 ;GET BLOCKS ACTUALLY TRANSFERED$2Y CALL DMCALC ;BACKUP TO START OF BLOCK IN ERROR(Z TST U.CNT(R5) ;LAST BLOCK TRANSFERED?[ BNE 40$ ;IF NE NO3.\ ADD R0,U.CNT(R5) ;YES, NORMALIZE BYTE COUNT4]40$: MOV #IE.VER&377,R0 ;ASSUME NO FURTHER RETRIES)^ JMP DMREST ;RESTART THE I/O OPERATION_`;$$a; **-DMOFF-ATTEMPT OFFSET RECOVERYb;#?c; THIS ROUTINE IS CALLED WHENEVER WE NEED TO OFFSET THE HEADSRBd; SOME DISTANCE FROM TRACK CENTERLINE TO PROPERLY READ THE DATA.e;F f; INPU00ŠxNxt´cÚµcÛ¶c�·c›’TS:#g;08h; R0=NUMBER OF BYTES ACTUALLY TRANSFERED TO THIS POINTi; R3=CONTROLLER INDEXRj;k+lDMOFF: DECB OFFRTY(R3) ;ANY RETRIES LEFT?$m BGT 10$ ;IF GT YES1n5$: MOV #IE.VER&377,R0 ;SET UNRECOVERABLE ERROREo CALLR DMFIN ;FINISH I/OR.p10$: MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS(q TST R0 ;ANY GOOD SECTORS TRANSFERED?r BEQ 40$ ;IF EQ NOHs;UBt; THE TRANSFER ENDED IN AN ECC HARD ERROR BUT THERE WERE SECTORSBu; TRANSFERED THAT CONTAINED GOOD DATA. SINCE THE ECC HARD ERRORCv; COULD HAVE BEEN CAUSED BY A CYLINDER CROSSING, THE GOOD DATA IS>w; SAVED AND THE TRANSFER IS RETRIED FROM THE POINT OF ERROR.x;R.y BIT #ECH,RKER(R2) ;WAS IT A HARD ECC ERROR?z BEQ 15$ ;IF EQ NOO3{ SUB #512.,R0 ;BACK UP TO START OF BLOCK IN ERRORM.|15$: CALL DMCALC ;RE-CALCULATE DISK ADDRESS4} TST U.CNT(R5) ;ANY BYTES REMAIN TO BE TRANSFERED?~ BNE 20$ ;IF NE YES2 ADD R0,U.CNT(R5) ;NO, NORMALIZE BYTES REMAINING7€20$: CALL DMPRM1 ;RESET OFFSET TABLE ADDRESS POINTER � BR 50$‚;O=ƒ; NO GOOD DATA WAS TRANSFERED SO CHECK TO SEE IF THE OFFSET,„; FROM TRACK CENTERLINE SHOULD BE CHANGED.…;T(†40$: DECB OFFRTY+1(R3) ;CHANGE OFFSET?‡ BLE 45$ ;IF LE YES%ˆ JMP DMINIO ;RESTART THE OPERATION ;‰45$: MOVB #OFFTRY,OFFRTY+1(R3) ;SET RECOVERY RETRY COUNT-+Š50$: INC OFFAD(R3) ;UPDATE OFFSET POINTER *‹ MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS-Œ CMP #OFFTBE,OFFAD(R3) ;ALL OFFSETS TRIED?B� BLT 5$ ;IF YES RETURN ERROR1,Ž MOVB @OFFAD(R3),R0 ;GET NEXT OFFSET VALUE.� BNE 60$ ;IF NE NOT RETURNING TO CENTERLINE:� MOVB #RETRY*2,OFFRTY+1(R3) ;TRY 16 TIMES AT CENTERLINE/‘60$: CALL DMCLER ;CLEAR CONTROLLER AND DRIVEN'’ BIC #^C<377>,R0 ;ISOLATE OFFSET BITSP*“ MOV R0,RKOF(R2) ;LOAD NEXT OFFSET VALUE$” MOV #OFF,R0 ;SET OFFSET FUNCTION7• BISB #OFS!OFM,U.CW2+1(R5) ;INDICATE OFFSET FUNCTION )– CALLR DMDIP1 ;EXECUTE OFFSET FUNCTIONS—˜;#(™; RESET THE OFFSET RECOVERY PARAMETERSš;5›5œDMPRM: MOV #RETRY,RTTBL(R3);SET INITIAL RETRY COUNTFA�DMPRM0: MOVB #1,OFFRTY+1(R3) ;SET INITIAL RECOVERY COUNT TO ONE @ž MOVB #RETRY*2+OFFTRY*7+16.,OFFRTY(R3) ;SET TOTAL RETRY COUNTŸ ;FOR OFFSET RECOVERY; DMPRM1: MOV #OFFTB-1,OFFAD(R3) ;SET OFFSET TABLE POINTERR ¡ RETURN ;F¢£¤;8¥; **-DMERL-FINISH ERROR LOGGING FOR MID TRANSFER ERROR¦;)B§; THIS ROUTINE IS CALLED TO FINISH OFF THE ERROR LOGGING PROCESS:¨; DURING MID-TRANSFER IF WE HAVE SUCCESSFULLY RECOVERED.©; ª; INPUTS:V«;R¬; R3=CONTROLLER INDEXE­;O®%¯DMERL: MOV R2,-(SP) ;SAVE REGISTERSN° MOV R1,-(SP) ;...1± MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTS1² BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNTY.³ MOV #IS.SUC&377,R0 ;RECOVERY WAS SUCCESSFUL-´ CALL $FNERL ;FINISH ERROR LOGGING PROCESS"µ MOV (SP)+,R1 ;RESTORE REGISTERS¶ MOV (SP)+,R2 ;...0· BR DMPRM ;RESET RECOVERY PARAMETERS AND EXIT¸¹º;P7»; **-DMCALC-CALCULATE UPDATED DISK AND BUFFER ADDRESSE¼;EA½; THIS ROUTINE WILL CALCULATE THE NEW DISK AND BUFFER ADDRESSES5¾; BASED ON THE NUMBER OF BYTES ACTUALLY TRANSFERED..¿; À; INPUTS:3Á;; Â; R0=BYTES ACTUALLY TRANSFEREDÃ;E Ä; OUTPUTS:Å;SÆ; R0=UNCHANGED IF U.CNT(R5)=0S%Ç; I.PRM+10(R1)=NEW CYLINDER ADDRESSC)È; I.PRM+12(R1)=NEW TRACK/SECTOR ADDRESS*É; U.BUF+1(R5)=NEW ADDRESS EXTENSION BITSÊ; U.BUF+2(R5)=NEW BUS ADDRESS Ë;EÌ>ÍDMCALC: SUB R0,U.CNT(R5) ;REDUCE BYTES REMAINING TO TRANSFERÎ BEQ 30$ ;IF EQ NONE LEFT5Ï ADD R0,U.BUF+2(R5) ;UPDATE STARTING BUFFER ADDRESSF8Ð ADCB U.BUF+1(R5) ;PROPAGATE CARRY INTO EXTENSION BITS)Ñ MOV S.KRB(R4),R1 ;RETREIVE KRB ADDRESS (Ò ADD K.OFF(R1),R1 ;POINT TO UMR AREA+2+Ó ADD R0,-(R1) ;CALCULATE NEW REAL ADDRESSSÔ ADCB -(R1) ;...W+Õ5$: SWAB R0 ;CALCULATE THE NUMBER OF ...K"Ö ASR R0 ;... SECTORS TRANSFERED+× MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS 3Ø ADD I.PRM+12(R1),R0 ;UPDATE TRACK/SECTOR ADDRESSE&Ù10$: CMPB #22.,R0 ;SECTOR OVERFLOW?Ú BHI 20$ ;IF HI NO)Û SUB #22.,R0 ;NORMALIZE SECTOR ADDRESSEÜ ADD #400,R0 ;ADD IN A TRAC00’xIwtöt÷tø tþfDATAKP!Ý CMP #3*400,R0 ;TRACK OVERFLOW?Þ BHI 10$ ;IF HI NOT)ß SUB #3*400,R0 ;NORMALIZE TRACK ADDRESSI,à INC I.PRM+10(R1) ;UPDATE CYLINDER ADDRESS á BR 10$ ;=â20$: MOV R0,I.PRM+12(R1) ;SAVE UPDATED TRACK/SECTOR ADDRESSOã30$: RETURN ;;äåæ;R*ç; **-DMVV-PROCESS VOLUME VALID FUNCTIONSè;RDé; HERE WE WILL PROCESS VOLUME VALID FUNCTIONS. IF THE FUNCTION ISDê; RESET VOLUME VALID WE WILL FORCE AN UNLOAD OF THE DRIVE. IF THEDë; FUNCTION IS SET VOLUME VALID, WE WILL SET THE HARDWARE "VV" BIT.Cì; IF THE FUNCTION IS A VOLUME VALID NOP, WE WILL SIZE THE DISK BY;8í; PASSING THE CONTROLLER REGISTERS BACK TO THE CALLER.î;Aï:ðDMVV: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER*ñ MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS0ò CALL DMCLR ;CLEAR CONTROLLER AND SELECT UNIT ó CALL DMSDC ;SELECT THE DRIVEô CALL DMDC ;CLEAR THE DRIVE0õ MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS"ö TST I.PRM+2(R1) ;SIZE THE DISK?÷ BPL 10$ ;IF PL NOU,ø BIT #NED,RKCS2(R2) ;DOES THE DRIVE EXIST?ù BEQ 5$ ;IF EQ YESA$ú CALL DMCLR ;CLEAR THE CONTROLLER,û MOV #IE.SZE&377,R0 ;UNABLE TO SIZE DEVICE+ü BICB #US.VV,U.STS(R5);RESET VOLUME VALIDQý CALLR DMFIN3 ;EXIT7þ5$: CALL DMRPAS ;PASS CONTROLLER REGISTERS TO CALLERD ÿ BR 30$ ;210$: BIT #VV$SET,I.PRM+2(R1) ;SET VOLUME VALID? BEQ 40$ ;IF EQ NO9 MOV RKDS(R2),R1 ;GET CONTENTS OF DRIVE STATUS REGISTERV COM R1 ;TOGGLE THEMT2 BIT #SVAL!DRDY!DRA,R1 ;DRIVE READY AND ONLINE? BEQ 15$ ;IF EQ YES* MOV #IE.DNR&377,R0 ;SET DRIVE NOT READY+ BICB #US.VV,U.STS(R5);RESET VOLUME VALID  BR 35$ ;/ 15$: MOV #ACK,R0 ;GET PACK ACK FUNCTION CODES% 20$: CALL DMGO ;ISSUE THE FUNCTIONN2 30$: MOV #IS.SUC&377,R0 ;SET SUCCESSFUL FUNCTION 35$: CALLR DMFIN1 ;AND EXIT2 40$: BIT #VV$UNL,I.PRM+2(R1) ;UNLOAD THE HEADS? BEQ 30$ ;IF EQ NO. BIT #PIP,RKDS(R2) ;POSITIONING IN PROGRESS?/ BNE 30$ ;IF NE YES, IT'S PROBABLY UNLOADINGD/ MOV #UNL,R0 ;GET UNLOAD HEADS FUNCTION CODE  BR 20$ ;;+>; INITIATE A CONTROLLER/DRIVE CLEAR OR SELECT DRIVE FUNCTION$; AND WAIT FOR THE SERIAL MESSAGE.; 9; NOTE: THE TIMING LOOP AT 20$ IS TO ALLOW TIME FOR THEF9; SERIAL MESSAGE TO BE SENT TO THE DRIVE AND THE STATUSN6; TO BE RECEIVED BY THE RK611. AVERAGE TIME = 15US.;-  .ENABL LSB 'DMCLER: CALL DMCLR ;CLEAR CONTROLLERI#DMDC: MOV R0,-(SP) ;SAVE REGISTER(  MOV #DC,R0 ;GET CODE FOR DRIVE CLEAR ! BR 10$ ;5"DMSDC: CLR RKDC(R2) ;CLEAR DESIRED CYLINDER ADDRESS;#DMSD: MOV R0,-(SP) ;)$ MOV #SD,R0 ;GET CODE FOR SELECT DRIVEV%%10$: CALL DMGO ;ISSUE THE FUNCTION & MOV (SP)+,R0 ; ' RETURNI(DMGO: CALL DMXCT ;LOAD RKCS1 2)20$: TSTB (R2) ;WAIT FOR THE SERIAL MESSAGE ... * BPL 20$ ;... TO DO ITS THING + RETURN ;.),DMCLR: MOV #CERR,(R2) ;CLEAR CONTROLLER 2- MOVB U.UNIT(R5),-(SP) ;GET CURRENT UNIT NUMBER*. MOV (SP)+,RKCS2(R2) ;RE-SELECT THE UNIT / RETURNF10DMXCT: CMP #815.,U.PRM+2(R5) ;IS THIS AN RK07? 1 BNE 30$ ;IF NE NO 32 BIS #CDT,R0 ;YES, SET CONTROLLER DRIVE TYPE BIT )330$: MOV R0,(R2) ;EXECUTE THE FUNCTIONI 4 RETURN ;O25DMCYL: MOV #2,RKMR1(R2) ;SET MESSAGE SELECT CODE*6 CALL DMSD ;SELECT DRIVE TO GET MESSAGE)7 MOV RKMR3(R2),R0 ;GET MESSAGE CONTENTST.8 ASH #-4,R0 ;RIGHT JUSTIFY CYLINDER ADDRESS59 BIC #^C<1777>,R0 ;ISOLATE CURRENT CYLINDER ADDRESSG : RETURN ; ; .DSABL LSB(<=;+7>; **-DMLXXX-RK611-RK06/RK07 DISK CARTRIDGE CONTROLLERU?; ERROR LOGGING ROUTINES@;DA; THIS ROUTINE IS CALLED WHENEVER A DEVICE ERROR OR DEVICE TIMEOUT<B; OCCURS. A CORE BLOCK THE SIZE OF THE REGISTER BUFFER ISDC; ALLOCATED AND THE REGISTERS (INCLUDING THE SIX EXTRA MAINTENANCE>D; REGISTERS) ARE TRANSFERED INTO THE CORE BLOCK AND THEN THEDE; APPROPRIATE EXECUTIVE ERROR LOGGING ROUTINE IS CALLED. THE CORECF; BLOCK ADDRESS IS THEN USED AS A PSEUDO REGISTER BASE ADDRESS BY EG; THE ERROR HANDLING ROUTINES. BEFORE THE NEXT FUNCTION IS ISSUED,U*H; THE REAL CSR ADDRESS MUST BE RESTORED.I;I>J; NOTE: IF ENT00šxNxt´cÚµcÛ¶c�·c›’RY IS THE RESULT OF A DEVICE TIMEOUT THEN THIS@K; ROUTINE IS EXECUTED AT THE RK611 DEVICE PRIORITY LEVEL (PR5)3L; UNTIL THE EXEC ERROR LOGGING ROUTINE IS CALLED.NM; N; INPUTS:AO; R2 = CSR ADDRESSCP; R4 = SCB ADDRESSQ;P R; OUTPUTS:&S; R2 = ADDRESS OF REGISTER SAVE AREAT; R4 = SCB ADDRESSRU;S$V; R0,R3 ARE PRESERVED ACROSS CALLW;-X Y .ENABL LSB =ZDMLTMO: MOV #$DVTMO,R1 ;;;GET ADDRESS OF OVERLAPPED TIMEOUTH[ BR 10$ ;;;=\DMLERR: MOV #$DVERR,R1 ;GET ADDRESS OF DEVICE ERROR ROUTINE #]10$: MOV R3,-(SP) ;SAVE REGISTERSN^ MOV R0,-(SP) ;...(_ MOV R1,-(SP) ;SAVE CO-ROUTINE ADDRESS,` MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS/a MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEXR(b MUL #RMCNT,R3 ;FORM AN INDEX INTO ...)c ADD #RGBLK,R3 ;... REGISTER BLOCK AREA $d MOV R3,R0 ;COPY REGISTER ADDRESS$e MOV R0,-(SP) ;SAVE THIS FOR LATER)f CALL REGPAS ;FILL AREA WITH REGISTERSD/g MOV (SP)+,R2 ;RETRIEVE REGISTER AREA ADDRESSM0h CALL @(SP)+ ;CALL EXEC ERROR LOGGING ROUTINE"i MOV (SP)+,R0 ;RESTORE REGISTERSj MOV (SP)+,R3 ;... k RETURN ;M l .DSABL LSBVmn;+7o; **-DMRPAS-RK611-RK06/RK07 DISK CARTRIDGE CONTROLLER$p; CONTROLLER REGISTER PASS ROUTINEq;N=r; THIS ROUTINE WILL TRANSFER THE CONTENTS OF THE CONTROLLER3=s; REGISTERS (INCLUDING THE SIX EXTRA MAINTENANCE REGISTERS)S't; INTO A PREVIOUSLY ALLOCATED BUFFER.u; v; INPUTS: w; R0 = BUFFER ADDRESSx; R1 = I/O PACKET ADDRESSRy; R2 = CSR ADDRESS z; R5 = UCB ADDRESSR {; OUTPUTS:|; R2 = CSR ADDRESSS}; R3 = DESTROYEDV~;->DMRPAS: MOV I.PRM+14(R1),KISAR6 ;SET BUFFER RELOCATION BIAS3€ MOV I.PRM+16(R1),R0 ;GET REGISTER BUFFER ADDRESST<�REGPAS: MOV #RKMR2/2,R3 ;NUMBER OF MAJOR REGISTERS TO PASS!‚ MOV R2,-(SP) ;SAVE CSR ADDRESS3-ƒ10$: MOV (R2)+,(R0)+ ;TRANSFER THE REGISTERN-„ SOB R3,10$ ;LOOP UNTIL ALL ARE TRANSFEREDE$… MOV (SP)+,R2 ;RESTORE CSR ADDRESS#† MOV R0,R3 ;SAVE BUFFER POSITIONE'‡ CALL DMCLR ;CLEAR CONTROLLER ERRORSR,ˆ CALL DMCYL ;GET CURRENT CYLINDER ADDRESS9‰ MOV R0,RKDC-RKMR2(R3) ;STORE CURRENT CYLINDER ADDRESS4%Š MOV R3,R0 ;RESTORE BUFFER POINTERS‹ CLR R3 ;CLEAR COUNT;$Œ20$: CALL DMCLR ;CLEAR CONTROLLER0� MOV R3,RKMR1(R2) ;SELECT DRIVE SERIAL MESSAGE1Ž CALL DMSD ;SELECT DRIVE TO GET PROPER MESSAGE(,� MOV RKMR2(R2),(R0)+ ;SAVE CONTENTS OF MR2,� MOV RKMR3(R2),(R0)+ ;SAVE CONTENTS OF MR30‘ INC R3 ;INCREMENT DRIVE SERIAL MESSAGE COUNT&’ CMP R3,#4 ;DONE FOUR MESSAGES YET?“ BNE 20$ ;NO, LOOPC5” CALLR DMCLER ;CLEAR CONTROLLER AND DRIVE AND EXITC•–—;+7˜; **-DMDINT-RK611-RK06/RK07 DISK CARTRIDGE CONTROLLERF ™; DIAGNOSTIC INTERRUPT HANDLERš;A›; THIS SUBROUTINE HANDLES INTERUPTS FROM DIAGNOSTIC OPERATIONS.R<œ; IF THE FUNCTION WAS DIAGNOSTIC THEN THE DEVICE REGISTERSG�; ARE PASSED BACK TO THE DIAGNOSTIC TASK, THE CONTROLLER (VIA DMRPAS)(=ž; AND THE DRIVE ARE CLEARED AND THE I/O STATUS IS RETURNED.MŸ;E  ; INPUTS:P¡; R0 = I/O STATUS CODE¢; R1 = ADDRESS OF I/O PACKET£; R2 = ADDRESS OF CSRO¤; R4 = ADDRESS OF SCBI¥; R5 = ADDRESS OF UCBD¦;- §; OUTPUTS:4¨; R1 = I/O PACKET ADDRESS (IF DIAGNOSTIC FUNCTION)©; R2 = ADDRESS OF CSRSª; R4 = ADDRESS OF SCBT3«; C = 1 IF INTERRUPT WAS FROM DIAGNOSTIC FUNCTIONA¬;G#­; R0,R3 ARE PRESERVED ACROSS CALL ®;-¯0°DMDINT: CLC ;ASSUME NOT DIAGNOSTIC INTERRUPT0± BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION?² BEQ 30$ ;IF EQ NO, EXIT³ MOV R3,-(SP) ;SAVE REGISTER&´ MOV R1,R3 ;COPY I/O PACKET ADDRESS-µ MOV R0,-(SP) ;SAVE CURRENT I/O STATUS CODEC-¶ TSTB R0 ;WAS THIS A SUCCESSFUL INTERRUPT?:*· BMI 20$ ;IF MI JUST PASS THE REGISTERS/¸ CMP #IO.RDH!IQ.UMD,I.FCN(R3) ;READ HEADERS?D¹ BNE 20$ ;NO, PROCESS NORMALU)º CLR R0 ;CLEAR BYTE OFFSET INTO BUFFER *» CALL $RELOP ;RELOCATE PHYSICAL ADDRESS1¼ MOV RKDB(R2),(R1)+ ;TRANSFER FIRST HEADER WORD2½ MOV RKDB(R2),(R1)+ ;TRANSFER SECOND HEADER WORD1¾ MOV RKDB(R2),(R1)+ ;TRANSFER THIRD HEADER WORDI$¿20$: CALL DMSDC ;SELECT THE DRIVE&À MOV R3,R1 00¢x€§xtöt÷tø tþfDATA;SAVE I/O PACKET ADDRESS.Á CALL DMRPAS ;PASS THE CONTROLLER REGISTERS) SEC ;SET DIAGNOSTIC INTERRUPT RETURNS(à MOV (SP)+,R0 ;RESTORE I/O STATUS CODE)Ä MOV (SP)+,R3 ;RESTORE CONTROLLER INDEXO Å30$: RETURNÆÇ;+)È; **-DMCKB-VALIDATE AND CONVERT THE LBNLÉ;R;Ê; THIS ROUTINE IS CALLED FROM $DRQRQ TO DO LBN PROCESSINGS;Ë; FOR DEVICES WHICH SUPPORT QUEUE OPTIMIZATION. IF BLKC2 ;Ì; DETECTS AN ERROR IT WILL RETURN TO THE CORRECT PLACE IN0 Í; $DRQRQ AFTER CALLING $IOALT.Î;V Ï; INPUTS: Ð;AÑ; R1=I/O PACKET ADDRESSSÒ; R5=UCB ADDRESSÓ;G Ô; OUTPUTS:Õ;E6Ö; IF THE CHECKS SUCCEEDS, THEN THE LBN IN THE PACKET?×; IS REPLACED BY THE CYLINDER/TRACK/SECTOR. R1 IS PRESERVED.0Ø;T<Ù; IF THE CHECKS FAILS, THEN $IOALT IS ENTERED WITH A FINAL9Ú; STATUS OF IE.BLK AND A RETURN TO THE CORRECT PLACE INSÛ; $DRQRQ IS EXECUTED.CÜ;PÝ;U>Þ; NOTE: ALL FUNCTIONS PUT INTO THE DRIVER QUEUE ARRIVE HERE.5ß; THESE INCLUDE IO.ATT, IO.DET, AND ACP FUNCTIONS.Oà;-á=âDMCHK: MOV I.FCN(R1),-(SP) ;PUT THE FUNCTION ONTO THE STACKD(ã CMPB #IO.ATT/256.,1(SP) ;IS IT ATTACH'ä BEQ 35$ ;IF EQ YES - LEAVE IT ALONEK)å CMPB #IO.DET/256.,1(SP) ;IS IT DETACHE'æ BEQ 35$ ;IF EQ YES - LEAVE IT ALONEE+ç BIC #7,(SP) ;CLEAR THE SUBFUNCTION BITSF/è CMP #IO.STC,(SP) ;IS IT SET CHARACTERISTICS?R'é BEQ 35$ ;IF EQ YES - LEAVE IT ALONEê TST (SP)+ ;CLEAN THE STACK+ë CALL $BLKC2 ;CHECK LOGICAL BLOCK NUMBER2ì CMPB #IO.WLB/256.,I.FCN+1(R3) ;WRITE FUNCTION?í BNE 20$ ;IF NE NOV:î BITB #IO.WLT&377,I.FCN(R3) ;OK TO WRITE ON LAST TRACK?ï BNE 20$ ;IF NE YES1ð MOV R0,I.PRM+6(R3) ;SAVE STARTING BLOCK NUMBER7ñ ADD #22.,I.PRM+12(R3) ;ADD 1 TRACK'S WORTH OF BLOCKSI2ò MOV R3,R1 ;RESTORE PACKET ADDRESS FOR THE CALL5ó CALL $BLKC2 ;CHECK IF WRITE ON LAST TRACK OF DISKA=ô MOV I.PRM+6(R3),R0 ;RESTORE ORIGINAL STARTING BLOCK NUMBERT1õ20$: CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBERG5ö MOV R2,I.PRM+10(R3) ;SAVE DESIRED CYLINDER ADDRESSW$÷ SWAB R1 ;SWAP TRACK TO HIGH BYTE&ø BIS R1,R0 ;MERGE TRACK WITH SECTOR=ù MOV R0,I.PRM+12(R3) ;SAVE DESIRED TRACK AND SECTOR ADDRESS()ú MOV R3,R1 ;RESTORE THE PACKET ADDRESS2û30$: RETURN ;EXITR"ü35$: TST (SP)+ ;CLEAN THE STACKý BR 30$ ;AND EXITþÿ .ENDAó CALL $BLKC2 ;CHECK IF WRITE ON LAST TRACK OF DISKA=ô MOV I.PRM+6(R3),R0 ;RESTORE ORIGINAL STARTING BLOCK NUMBERT1õ20$: CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBERG5ö MOV R2,I.PRM+10(R3) ;SAVE DESIRED CYLINDER ADDRESSW$÷ SWAB R1 ;SWAP TRACK TO HIG .TITLE SSTSR .IDENT /12.01/B; 7; COPYRIGHT (C) 1987 BY DIGITAL EQUIPMENT CORPORATIONE; ALL RIGHTS RESERVED.;D-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY: ;E; B. S. MCCARTHY;:-; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:T; $; B. S. MCCARTHY 22-DEC-86 12.00;."; BM377 -- MOVE DRDSP TO DIR11M;T!; J. W. BERZLE 7-MAY-87 12.01 ;B*; JWB212 -- CORRECT TEST OF STACK DEPTH;C ; MACRO LIBRARY CALLSH!;M":# .MCALL ABODF$,HDRDF$,HWDDF$,PKTDF$,BGCK$A,BGCK$R,BCKDF$&$ BCKDF$ ;DEFINE THE BUGCHECK CODES$% ABODF$ ;DEFINE TASK ABORT CODES'& HDRDF$ ;DEFINE TASK HEADER OFFSETSF&' HWDDF$ ;DEFINE HARDWARE REGISTERS&( PKTDF$ ;DEFINE I/O PACKET OFFSETS)*;M+; LOCAL DATA,;TG-; FLOATING POINT EXCEPTION VECTOR (FINAL SETUP OF THIS VECTOR AND, IFDE.; NECESSARY, THE PIRQ VECTOR IS PERFORMED IN INITL AND THE MCR SAVE1 /; COMMAND.)S0;S123 .IF DF F$$LPP!F$$LTPR4 5 .ASECT6.=244C7 .WORD $FLTRP ;8 .WORD PR7 ;A9 : .PSECT;< .ENDC=>?;C@; SEGMENT FAULT VECTORA; B C .ASECTSD.=250FE .WORD $SGFLT ;F .WORD PR7 ;H G .CSECTFHI;+J;G*K; **-$EMSST-NON RSX EMT/TRAP INSTRUCTIONL;LM; THIS ROUTINE IS TRANSFERED TO BY THE DIRECTIVE DISPATCHER WHEN A NON RSXMN; EMT OR A TRAP INSTRUCTION IS EXECUTED. THE MACHINE STATE HAS ALREADY BEENAEO; SAVED. THE EMT/TRAP CODE (LOW BYTE OF INSTRUCTION) IS SETUP TO BERIP; PASSED TO THE USER AND CONTROL IS TRANSFER00€ªxNxt´cÚµcÛ¶c�·c›’ED TO THE SST EXIT ROUTINE.SQ; R; INPUTS:S;+T; R5=ADDRESS OF THE EMT/TRAP INSTRUCTION.U;C V; OUTPUTS:W;O)X; 04(SP)=EMT/TRAP CODE MULTIPLIED BY 2.,Y; 02(SP)=SST CODE (SCEMT=EMT, SCTRP=TRAP).>Z; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO USER STACK (6).[;-\ ] .ENABL LSBN0^$EMSST::MOV (SP),R5 ;GET EMT/TRAP INSTRUCTION+_ BIC #177400,(SP) ;CLEAR INSTRUCTION CODEE ` ASL (SP) ;MULTIPLY CODE BY 24a MOV #S.CEMT,-(SP) ;ASSUME NON-RSX EMT INSTRUCTION!b BIT #400,R5 ;EMT INSTRUCTION? *c BEQ 10$ ;IF EQ YES-SET NUMBER OF BYTES-d MOV #S.CTRP,(SP) ;SET FOR TRAP INSTRUCTIONC*e10$: MOV #3*2,-(SP) ;SET NUMBER OF BYTES+f JMP SSTXT ;TAKE COMMON SST EXIT ROUTINEEgh;+.i; **-$FLTRP-FLOATING POINT EXCEPTION (11/40)j;EKk; THIS ROUTINE IS TRAPPED TO WHEN AN 11/40 FLOATING POINT EXCEPTION FAULTMKl; OCCURS. THE CURRENT MACHINE STATE IS SAVED AND CONTROL IS TRANSFERED TO m; THE SST EXIT ROUTINE.Vn;E o; INPUTS:Up;N q; NONE.Sr;I s; OUTPUTS:t; u; 02(SP)=SST CODE (SCFLT).>v; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO USER STACK (4).w;-x5y$FLTRP:: ;DEFINE UNCONDITIONALLY FOR VECTOR SETUPJz{| .IF DF F$$LTP}0~ DIRSV$ ;;;SAVE REGISTERS AND CLEAR PRIORITY< MOV #S.CFLT,-(SP) ;SET FOR FLOATING POINT EXCEPTION FAULT9€ MOV #BE.FLT,R3 ;FLOATING POINT EXCEPTION BUGCHECK CODEU� BR 20$ ;SET NUMBER OF BYTESC‚ƒ .ENDC„…†;+G‡; **-$FPPR7-$FPPR8-$FPPRQ-FLOATING POINT PROCESSOR EXCEPTION HANDLING ˆ;TB‰; THESE ROUTINES HANDLE EXCEPTION FAULTS FROM THE FLOATING POINTFŠ; PROCESSOR. THE FLOATING POINT EXCEPTION AND ADDRESS REGISTERS ANDJ‹; THE CURRENT TASK TCB ARE SAVED AND THEN AN ATTEMPT IS MADE TO QUEUE ANGŒ; AST TO THE TASK AT FORK LEVEL. THESE ROUTINES SUPPORT TWO MODES OFPG�; OPERATION DEPENDING ON WHETHER THE FPP'S EXCEPTION FAULTS CAN OCCURKHŽ; WHILE THE PROCESSOR IS AT PRIORITY 7 OR NOT. IF THE FPP'S EXCEPTIONB�; FAULT CAN OCCUR WHILE THE PROCESSOR IS AT PRIORITY 7, THEN THE@�; PROCESSOR MUST HAVE A PIRQ REGISTER. INITL AND THE MCR SAVEB‘; COMMAND DETERMINE WHICH MODE OF OPERATION IS TO BE USED OR NOTF’; DEPENDING ON WHETHER THE PROCESSOR HAS A PROGRAM INTERRUPT REQUEST?“; REGISTER (PIRQ) OR NOT, AND SET UP THE FPP AND PIRQ VECTORSN2”; ACCORDINGLY. THE ROUTINES OPERATE AS FOLLOWS.•;HJ–; 1. IF THE PROCESSOR DOES NOT HAVE A PIRQ REGISTER THEN THE FPP MUSTA—; NEVER FAULT WHEN THE PROCESSOR IS AT PRIORITY 7 OR IT MUST BEHB˜; SYNCHRONOUS. IN THIS CASE THE FLOATING POINT EXCEPTION VECTORC™; POINTS TO $FPPR7, AND THE PROCESSOR SIMPLY CALLS INTERRUPT SAVEE$š; AND FORK TO GET TO SYSTEM STATE.›;EIœ; 2. IF THE PROCESSOR HAS A PIRQ REGISTER, THE FLOATING POINT EXCEP-RC�; TION TRAP VECTOR POINTS TO $FPPR8 AND THE PIRQ VECTOR POINTS TO.Bž; $FPPRQ. FLOATING POINT TRAPS ARE CONVERTED TO PIRQ PRIORITY 1CŸ; INTERRUPTS AFTER SAVING THE FLOATING POINT STATUS. ON THE PIRQNC ; TRAP AN INT SAVE AND FORK IS USED TO GET TO SYSTEM STATE. NOTETD¡; THAT THIS STRATEGY WOULD ALSO WORK FOR PROCESSORS DESCRIBED IN 1 ¢; ABOVE.£;I ¤; INPUTS:T¥;TE¦; THE FLOATING POINT EXCEPTION REGISTER CONTAINS THE REASON FOR THEOF§; FAULT AND THE FLOATING POINT ADDRESS REGISTER CONTAINS THE ADDRESS ¨; OF THE FAULTING INSTRUCTION.©;O ª; OUTPUTS:«;FD¬; AN ATTEMPT IS MADE TO QUEUE AN AST TO THE TASK CAUSING THE FAULTB­; WITH THE CONTENTS OF THE FLOATING POINT EXCEPTION REGISTER AND®; AND ADDRESS REGISTER.U¯;-°±² .IF DF F$$LPP³=´$FPPR7::STST $FLSTS ;;;STORE FLOATING POINT EXCEP AND ADDR µ BR 14$ ;;;¶=·$FPPR8::STST $FLSTS ;;;STORE FLOATING POINT EXCEP AND ADDRE:¸ BIS #<2*256.>,PIRQ ;;;POST PROGRAMMED INTERRUPT REQUEST#¹ RTI ;;;WAIT FOR PIRQ INTERRUPTDº8»$FPPRQ::CLR PIRQ ;;;DISABLE PROGRAM INTERRUPT REQUEST6¼14$: MOV $TKTCB,$FLTCB ;;;MUST SAVE FAULTING TCB NOW&½ CALL $INTSV,PR1 ;;;GO TO PRIORITY 1-¾ MOV $FLFRK,R4 ;;;SET ADDRESS OF FORK BLOCK*¿ CALL $FORK0 ;;;CREATE A SYSTEM PROCESS2À MOV #AS.FPA,R4 ;GET CODE FOR FLOATING POI00€²x§xtöt÷tø tþfDATANT AST2Á MOV $FLTCB,R5 ;GET TCB ADDRESS OF FAULTING TASK+ CALL $DASTT ;DECLARE FLOATING POINT ASTE"à BCS 15$ ;IF CS NO AST DECLARED0Ä MOV $FLSTS,A.PRM+2(R1) ;INSERT AST PARAMETERSÅ MOV $FLSTS+2,A.PRM(R1) ;Æ15$: RETURN ;QÇÈ .IFFPÉ&Ê$FPPR7:: ;REFERENCE LABEL FOR SAVEË$FPPR8:: ;REFERENCE LABELBÌ$FPPRQ:: ;REFERENCE LABELTÍÎ .ENDCÏÐÑ;+-Ò; **-$ILINS-ILLEGAL OR RESERVED INSTRUCTION0Ó;CFÔ; THIS ROUTINE IS TRAPPED TO WHEN AN ILLEGAL OR RESERVED INSTRUCTIONIÕ; IS EXECUTED. THE CURRENT MACHINE STATE IS SAVED AND CONTROL IS TRANS-C#Ö; FERRED TO THE SST EXIT ROUTINE. ×;S Ø; INPUTS:RÙ; Ú; NONE.,Û;+ Ü; OUTPUTS:Ý;AÞ; 02(SP)=SST CODE (SCILI).Bß; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO THE USER STACK (4).à;AEá; THIS ROUTINE IS ALSO ENTERED WHEN THE CSM INSTRUCTION IS EXECUTEDAGâ; ON A PROCESSOR THAT DOES NOT SUPPORT CSM. IT WILL FIELD THE ILLEGALU5ã; INSTRUCTION TRAP AND EMULATE THE CSM INSTRUCTION.Lä;O<å; NOTE: ONLY ONE FORM OF THE CSM INSTRUCTION IS SUPPORTED.æ;I)ç; MOV #
,-(SP)T è; CSM (SP)+Ré;Eê; KERNEL STACK ON ENTRY.ë; ì; 0(SP) = TRAP PC + 2:í; 2(SP) = PS PRIOR TO TRAPî;.4ï; KERNEL STACK IMMEDIATELY BEFORE RTI INSTRUCTION.ð;T5ñ; 0(SP) = (10) (VIRTUAL ADDRESS IN SUPERVISOR MODE)H:ò; 2(SP) = PS WITH PROPER PREVIOUS AND CURRENT MODE SUPERó;S3ô; SUPER STACK IMMEDIATELY BEFORE RTI INSTRUCTION.Oõ;P.ö; 0(SP) = ADDRESS OF SUPERVISOR MODE ROUTINE÷; 2(SP) = RETURN ADDRESSø; 4(SP) = PS PRIOR TO TRAPù;ú;-ûüý$ILINS:: ;;;REF LABELþÿ .IF DF S$$LIB .IF NDF X$$DBT & TST $STKDP ;;;PREVIOUS MODE USER ? BLE 17$ ;;;IF LE NOE .ENDC ;NDF X$$DBT  %  MOV (SP),-(SP) ;;;COPY TRAP PC + 2I$  SUB #2,(SP) ;;;CALCULATE TRAP PC+  MFPI @(SP)+ ;;;PICK UP TRAP INSTRUCTION # CMP (SP),#7027 ;;;IS IT CSM #N ?E BEQ 155$ ;;;IF EQ YESI$ CMP (SP),#7026 ;;;IS IT CSM (SP)+3 BNE 165$ ;;;IF NE NO - ILLEGAL INSTRUCTION TRAP 6155$: TSTB $SUPFL ;;;TASK MAPPED TO SUPER WINDOWS ?3 BEQ 165$ ;;;IF EQ NO - ILLEGAL INSTRUCTION TRAP< BIT #10,SR3 ;;;IS THE INSTRUCTION LEGAL ON THIS MACHINE?3 BNE 165$ ;;;IF NE NO - ILLEGAL INSTRUCTION TRAP< ADD #170751,(SP) ;;;IS IT CSM #N ? (THIS INSTRUCTION WILL. ;;;SET C FOR #N, BUT NOT (SP)+, AND WILL. ;;;LEAVE A ZERO CONSTANT (USED LATER FOR' ;;;STACK ADJUSTMENT) ON THE STACKC MOV R0,-(SP) ;;;SAVE R03 BCS 156$ ;;;IF CS WE DETERMINED 2 INST AGO THIST ;;;WAS CSM (SP)+5 MOV #2,2(SP) ;;;IT WAS CSM (SP)+ - SET CONSTANT TOF. ;;;ADD TO USER STACK FOR ADJUSTING BELOW. MFPI SP ;;;GET PREVIOUS MODE STACK POINTER9 $DSLM1::MFPD$ @(SP)+ ;;;GET ADDR OF SUPER MODE ROUTINEA$! BR 157$ ;;;FINISH IN COMMON CODED"156$: MOV 4(SP),-(SP) ;;;GET ADDRESS OF SECOND HALF OF INSTRUCTION(# MFPI @(SP)+ ;;;GET IMMEDIATE OPERAND/$157$: MOV SP,R0 ;;;COPY KERNEL STACK POINTERM!% ADD #6,R0 ;;;POINT TO TRAP PC '& MOV (R0)+,-(SP) ;;;PUSH PC OF CALLER&' MOV (R0),-(SP) ;;;PUSH PS OF CALLER:( MOV #CSMODE!PMODE,(R0) ;;; CURRENT=SUPER, PREVIOUS=USER0) BIC #17,(SP) ;;;CLEAR STACKED CONDITION CODES+* BMI 16$ ;;;IF MI PREVIOUS MODE WAS USERP9+ BIC #^CPSMODE&PMODE,(R0) ;;;SET PREVIOUS MODE TO SUPERS',16$: MFPI SP ;;;GET PREVIOUS MODE SP 9- ADD 12(SP),(SP) ;;;ADJUST FOR STACK DIFFERENCE BETWEEN+. ;;;(SP)+ AND #N VARIATION$/ MOV (SP),R0 ;;;COPY IT;0 SUB #6,(SP) ;;;ADJUST SP FOR PUSHED PS,PC,SUPER ROUTINE071 BIC #^CPSMODE&PMODE,PS ;;;SET PREVIOUS MODE TO SUPER 2 MTPI SP ;;;SET SUPER SPP'3 MTPD -(R0) ;;;PUSH PS ON USER STACKR(4 MTPD -(R0) ;;;PUSH PC ON SUPER STACK/5 MTPD -(R0) ;;;PUSH ADDRESS OF SUPER ROUTINEU6 MOV (SP)+,R0 ;;;RESTORE R00&7 CMP (SP)+,(SP)+ ;;;POINT TO TRAP PS?8$DSLM2::MFPI 10 ;;;SET RETURN PC IN SUPER MODE FROM SUPER 10F(9 RTI ;;;RETURN TO (SUPER VIRTUAL 10):4;165$: TST (SP)+ ;;;POP CSM INSTRUCTION FROM STACK<= .ENDC ;DF S$$LIBP>?!@17$: DIRSV$ ;;;SAVE 00€ºxNxt´cÚµcÛ¶c�·c›’REGISTERSEA=B MOV #S.CILI,-(SP) ;SET FOR ILLEGAL OR RESERVED INSTRUCTIONS4C MOV #BE.ILI,R3 ;ILLEGAL INSTRUCTION BUGCHECK CODED BR 20$ ;SET NUMBER OF BYTESE .PAGEF;+G; **-$IOTRP-IOT INSTRUCTIONUH;MJI; THIS ROUTINE IS TRAPPED TO WHEN AN IOT INSTRUCTION IS EXECUTED. IF THECJ; STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED VIA A JUMP TO;IK; $CRASH. ELSE THE CURRENT MACHINE STATE IS SAVED AND CONTROL IS TRANS- "L; FERED TO THE SST EXIT ROUTINE.M;DN; IF THE CURRENT TASK HAS FAST MAPPING ENABLED ($FMAPP>0) THEN THEHO; FAST MAP DESCRIPTOR IN THE REGISTERS IS USED TO REMAP A PLAS WINDOW.9P; (SEE DRMAP, WHERE THE REMAPPING ACTUALLY TAKES PLACE)EQ;+ R; INPUTS:RS; T; NONE.UU;M V; OUTPUTS:W;IEX; IF THE CURRENT STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED.T@Y; ELSE THE FOLLOWING ARGUMENTS ARE SETUP ON THE CURRENT STACK:Z;E[; 02(SP)=SST CODE (SCIOT).C\; 00(SP)=NUMBER OF BYTES TO BE TRANSFERRED TO THE USER STACK (4).];-^;E _; NOTES:`; Ea; REGISTER CONTENTS ON ENTRY/EXIT TO FAST MAP ARE DEFINED IN DRMAP.Eb .PAGEAc18$: BGCK$A BF.EXE,BE.IOT,INTERNAL ;;;SETUP ERROR CODES FOR IOTNd ;;;IN SYSTEM STATE%e JMP $CREMT ;;;GO CRASH THE SYSTEM f1g$IOTRP::TST $STKDP ;;;RUNNING ON SYSTEM STACK?1/g BLE 18$ ;;;IF LE NO, SYSTEM FAULT ;JWB212Oi ;**-1Sj .IF DF F$$MAP&X$$HDR&P$$LASk0l TST $FMAPP ;;;FAST MAP IN USE FOR THIS TASK?m BEQ 189$ ;;;IF EQ NOno .IF DF D$$PARp4q MOV $DRAP3,KINAR5 ;;;MAP TO PLAS DIRECTIVE COMMONrs .ENDC ; DF D$$PARt/u JMP $DRFMP ;;;GO EXECUTE FAST MAP DIRECTIVEOvw189$: ;;;REFERENCE LABEL x"y .ENDC ; DF F$$MAP&X$$HDR&P$$LASz.{ DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITY-| MOV #S.CIOT,-(SP) ;SET FOR IOT INSTRUCTIONB} BR 20$ ;SET NUMBER OF BYTES ~;+€; **-$SGFLT-SEGMENT FAULTD�;MG‚; THIS ROUTINE IS TRAPPED TO WHEN A SEGMENT FAULT OCCURS. THE CURRENTLƒ; MACHINE STATE IS SAVED, SR0 THRU SR2 ARE SETUP TO BE PASSED TO THE USER,6„; AND CONTROL IS TRANSFERED TO THE SST EXIT ROUTINE.…;P †; INPUTS:O‡;U ˆ; NONE. ‰;T Š; OUTPUTS:‹; Œ; 10(SP)=CONTENTS OF SR0..�; 06(SP)=CONTENTS OF SR2.SŽ; 04(SP)=CONTENTS OF SR1.I�; 02(SP)=SST CODE (SCSGF).C�; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO THE USER STACK (10).Y‘;-’5“$SGFLT::DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITYI” MOV #SR0+4,R5 ;POINT SR2N• MOV (R5),-(SP) ;SAVE SR2!– MOV (SP),-(SP) ;COPY SAVED SR2U— MOV -(R5),-(SP) ;SAVE SR1˜ MOV -(R5),4(SP) ;SAVE SR04™ BIC #160000,(R5) ;UNFREEZE MEMORY MANAGEMENT UNIT+š MOV #S.CSGF,-(SP) ;SET FOR SEGMENT FAULT &› MOV #5*2,-(SP) ;SET NUMBER OF BYTES.œ MOV #BE.SGF,R3 ;SEGMENT FAULT BUGCHECK CODE*� BR SSTXT ;TAKE COMMON SST EXIT ROUTINEžŸ;+A ; **-$TRACE-TRACE (T-BIT) OR BREAK POINT INSTRUCTION (BPT) TRAPT¡;SK¢; THIS ROUTINE IS TRAPPED TO WHEN A TRACE TRAP (T-BIT) OCCURS OR A BREAK-VJ£; POINT TRAP INSTRUCTION IS EXECUTED. THE CURRENT MACHINE STATE IS SAVED6¤; AND CONTROL IS TRANSFERED TO THE SST EXIT ROUTINE.¥;5 ¦; INPUTS:E§;M ¨; NONE.N©; ª; OUTPUTS:«;;¬; 02(SP)=SST CODE (SCBPT).B­; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO THE USER STACK (4).®;-¯5°$TRACE::DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITY+6± MOV #S.CBPT,-(SP) ;SET FOR TRACE OR BREAKPOINT TRAP4² MOV #BE.BPT,R3 ;TRACE OR BREAKPOINT BUGCHECK CODE³ BR 20$ ;SET NUMBER OF BYTESA´µ;+7¶; **-$TRP04-TRAPS AT 4 (ODD ADDRESS, NONEX MEM, ETC.)N·;TL¸; THIS ROUTINE IS TRAPPED TO WHEN A TRAP AT 4 OCCURS. IF A STACK VIOLATIONH¹; HAS CAUSED THE TRAP (I.E. A STACKPOINTER OF LESS THAN 400), THEN THEFº; THE SYSTEM IS CRASHED. ELSE THE CURRENT MACHINE STATE IS SAVED AND2»; CONTROL IS TRANSFERED TO THE SST EXIT ROUTINE.¼;S ½; INPUTS:¾;V ¿; NONE.SÀ;E Á; OUTPUTS:Â;KÃ; 02(SP)=SST CODE (SCOAD).BÄ; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO THE USER STACK (4).Å;-Æ*Ç$TRP04::CMP SP,#400 ;;;STACK VIOLATION?È BLO 30$ ;;;IF LO YES.É DIRSV$ ;;;S00€Âx§xtöt÷tø tþfDATAAVE REGISTERS AND SET PRIORITY'Ê CLR -(SP) ;SET FOR ODD ADDRESS TRAPT<Ë MOV #BE.ODD,R3 ;ODD ADDRESS OR OTHER TRAP 4 BUGCHECK CODE*Ì20$: MOV #2*2,-(SP) ;SET NUMBER OF BYTES*Í BR SSTXT ;TAKE COMMON SST EXIT ROUTINEBÎ30$: BGCK$A BF.EXE,BE.STK,DIRECT ;;;SETTUP THE ERROR CODES FOR AÏ ;;;STACK OVERFLOWK Ð .DSABL LSBTÑÒ;+$Ó; **-SSTXT-COMMON SST EXIT ROUTINEÔ;SJÕ; CONTROL IS TRANSFERED TO THIS ROUTINE TO EFFECT AN SST. IF THE CURRENTKÖ; STACK DEPTH IS NOT ZERO, THEN THE SYSTEM IS CRASHED. ELSE AN ATTEMPT ISII×; MADE TO EFFECT AN SST FOR THE CURRENT TASK. IF THE TASK DOES NOT HAVESLØ; AN APPROPRIATE SST VECTOR ENTRY OR A PUSH OF THE SST PARAMETERS ONTO THEIÙ; TASK STACK CANNOT BE EFFECTED, THEN THE TASK IS ABORTED. ELSE THE SSTT.Ú; IS SETUP AND A DIRECTIVE EXIT IS EXECUTED.Û;FÜ; INPUTS: (MAPPED SYSTEM)Ý; %Þ; 24(SP)=PS WORD SAVED BY SST TRAP.%ß; 22(SP)=PC WORD SAVED BY SST TRAP.Nà; 20(SP)=SAVED R5.á; 16(SP)=SAVED R4.â; 14(SP)=SAVED R3.ã; 12(SP)=SAVED R2.ä; 10(SP)=SAVED R1.å; 06(SP)=SAVED R0.Dæ; 04(SP)=SST PARAMETER (ZERO OR MORE PARAMETERS MAY BE SPECIFIED).ç; 02(SP)=SST CODE.:è; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO USER STACK.é; ê; R3 - BUGCHECK ERROR CODEë;E ì; OUTPUTS:í;Hî; AN ATTEMPT IS MADE TO EFFECT THE SPECIFIED SST FOR THE CURRENT TASK.ï;-ð ñ .ENABL LSBPò2óSSTXT: MOV $SAHPT,R5 ;GET ADDRESS OF TASK HEADER3ô CMP #-1,$STKDP ;FAULT OCCUR AT STACK DEPTH ZERO?.õ BNE 7$ ;IF NE NO)ö MOV SP,R1 ;COPY CURRENT STACK POINTER.6÷ ADD (SP),R1 ;ADD NUMBER OF BYTES TO BE TRANSFERRED&ø MOV 16(R1),R0 ;GET FAULT PC ADDRESS7ù CMP R0,#$DRLM1 ;FAULT OCCUR IN DIRECTIVE DISPATCHER?Sú BLO 3$ ;IF LO NO7û CMP R0,#$DRLM2 ;FAULT OCCUR IN DIRECTIVE DISPATCHER?ü BHI 3$ ;IF HI NOü ; BM377Eü .IF DF D$$PAR ; BM377ü ; BM377S>ü CMP KINAR5,$DRAPR ;YES, BUT DID THE FAULT OCCUR IN ; BM3771ü ;THE DIRECTIVE DISPATCHER? (IS THE ; BM377/ü ;FIRST DIRECTIVE COMMON MAPPED?) ; BM377T ü BNE 3$ ;IF NE NO ; BM377ü ; BM377E"ü .ENDC ; DF D$$PAR ; BM377ü ; BM377Cý JMP 90$ ;YESþ3$:Rÿ .IF DF D$$PAR3 CMP KINAR5,$DRAP2 ;2ND DIRECTIVE COMMON MAPPED ?O. BNE 7$ ;IF NE NO, CAN'T HAVE BEEN IN DRQIO .ENDC ; DF D$$PAR0 CMP R0,#$DQLM1 ;TRAP OCCUR IN QIO DIRECTIVE ? BLO 7$ ;IF LO NO0 CMP R0,#$DQLM2 ;FAULT OCCUR IN QIO DIRECTIVE?  BLOS 90$ ;IF LOS YES$ 7$: TST $STKDP ;STACK DEPTH ZERO?*  BNE 60$ ;IF NE NO - FATAL SYSTEM ERROR   .IF DF S$$LIB) MOV SP,R1 ;COPY CURRENT STACK POINTER;5 ADD (SP),R1 ;ADD NUMBER OF BYTES TO BE TRANSFERED& MOV 16(R1),R0 ;GET FAULT PC ADDRESS: CMP R0,#$DSLM1 ;FAULT OCCUR IN CSM INSTRUCTION EMULATE? BLO 8$ ;IF LO NO: CMP R0,#$DSLM2 ;FAULT OCCUR IN CSM INSTRUCTION EMULATE? BHI 8$ ;IF HI NO( BIT #PMODE,PS ;PREVIOUS MODE KERNEL ?4 BEQ 100$ ;IF EQ YES, - EXCEPTION IN CSM EMULATOR8$: ;REFERENCE LABELD .ENDC ;DF S$$LIBI ! .IF DF P$$D70")# CLR @$CPUER ;CLEAR CPU ERROR REGISTERN$% .IF NDF M$$EXTD& ' NOP ;THIS NOP MUST BE HERE.'( ;UNLESS THE MICRO CODE BUG IN THEC() ;11/60 IS FIXED (ECO M7872-00007),&* ;CLEARING THE CPU ERROR REGISTER*+ ;WILL CAUSE THIS WORD TO BE SKIPPED.,- .ENDC./0 .ENDC12.3 CLR $TEMP0 ;INDICATE USE NORMAL ABORT CODE4-5$CNBPT:: ;ENTRY POINT FROM BOM$ DIRECTIVET67%8 MOV R5,R4 ;COPY ADDRESS OF HEADERF59 ADD #H.ODVA,R4 ;POINT TO ODT SST VECTOR DESCRIPTORC+: MFPI SP ;GET CURRENT TASK STACK POINTER(; CALL 10$ ;SST ADDRESS IN ODT VECTOR?.< MOV #80$,-(SP) ;SST ADDRESS IN TASK VECTOR?1=10$: MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADER*> MOV (R4)+,R3 ;GET ADDRESS OF SST VECTOR,? BEQ 20$ ;IF EQ NO VECTOR THIS DESCRIPTOR@AB .IF DF S$$LIBC2D BIS #PMODE,PS ;ASSUME SST HANDLED IN USER STATE/E BIT #1,R3 ;AST HANDLED IN SUPERVISOR STATE?F BEQ 15$ ;IF EQ NOC:G BIC #^CPSMODE&PMODE,PS ;SET00€ÊxNxt´cÚµcÛ¶c�·c›’ PREVIOUS MODE TO SUPERVISOR'H DEC R3 ;REMOVE SUPERVISOR MODE FLAGEIJ .ENDCKL6M15$: CMP 6(SP),(R4) ;VECTOR LONG ENOUGH TO COVER SSTN BHIS 20$ ;IF HIS NOK"O MOV R3,R0 ;COPY VECTOR ADDRESS.P MOV #2,R1 ;TWO BYTE SIZE FOR ADDRESS CHECK2Q ADD 6(SP),R3 ;POINT TO APPROPRIATE VECTOR ENTRY+R CALL $ACHRO ;CHECK FOR READ ONLY ACCESS,S BCS 20$ ;IF CS VECTOR ELEMENT IS INVALID*T MFPD$ (R3) ;GET ADDRESS OF SST ROUTINEU MOV (SP)+,R3 ;1$V BNE 30$ ;IF NE SST ROUTINE FOUND2W20$: TST (R4)+ ;POINT TO NEXT VECTOR DESCRIPTOR X RETURN ; (Y30$: TST (SP)+ ;REMOVE RETURN ADDRESS5Z MOV 2(SP),R1 ;GET NUMBER OF BYTES TO BE TRANSFERED +[ SUB R1,(SP) ;CALCULATE NEW TOP OF STACKA.\ MOV (SP),R0 ;COPY NEW TOP OF STACK ADDRESS+] MTPI SP ;RESTORE NEW TASK STACK POINTER 3^ CALL $ACHCK ;ADDRESS CHECK PUSH ONTO TASK STACKC(_ BCS 70$ ;IF CS ADDRESS CHECK FAILURE`a .IF DF X$$HDRb6c MOV -(R4),$TEMP0 ;SAVE SST ADDRESS FROM TASK HEADERde .ENDC ; DF X$$HDRf/g CALL $RELOM ;RELOCATE AND MAP STACK ADDRESSR0h MOV (SP)+,R1 ;GET NUMBER OF BYTES TO TRANSFER7i CMP -(R1),-(R1) ;ADJUST BY 4 BYTES (PS AND PC WORDS)S!j ASR R1 ;CONVERT TO WORD COUNTN)k TST (SP)+ ;REMOVE SST CODE FROM STACK 0l40$: DEC R1 ;ANY MORE PARAMETERS TO TRANSFER?m BLT 50$ ;IF LT NOL4n MOV (SP)+,(R0)+ ;TRANSFER PARAMETER TO TASK STACK o BR 40$ ;,p50$: MOV #$UMPC,R1 ;POINT TO SAVED PC WORD0q MOV (R1),(R0)+ ;SAVE PC AT TRAP ON USER STACK r MOV R3,(R1)+ ;SET SST PC WORD/s MOV (R1),(R0) ;SAVE PS AT TRAP ON USER STACKS)t MOV #CMODE!PMODE,(R1) ;SET SST PS WORD uvw .IF DF S$$LIBxyz .IF DF X$$HDR{/| BIT #1,$TEMP0 ;SUPERVISOR MODE SST ROUTINE ?}~ .IFF ; DF X$$HDRO.€ BIT #1,-(R4) ;SUPERVISOR MODE SST ROUTINE ?�‚ .ENDC ; DF X$$HDRƒ„ BEQ 55$ ;IF EQ NO0-… TSTB $SUPFL ;LINKED TO SUPER MODE LIBRARY &† BEQ 55$ ;IF EQ NO, FORCE USER MODE=‡ BIC #^CCSMODE&CMODE,(R1) ;SET RETURN PS WORD TO SUPER MODEM+ˆ TST (R0) ;WAS PREVIOUS MODE SUPERVISOR?)‰ BMI 54$ ;IF MI NOE<Š BIC #^CPSMODE&PMODE,(R1) ;SET PREVIOUS MODE TO SUPERVISOR‹54$: ;REFERENCE LABELŒ� .ENDCŽ��55$: RETURN ;EXIT FROM TRAPS‘’; 8“; SST FAULT AT NON ZERO STACK DEPTH-FATAL SYSTEM ERROR”;O•2–60$: BGCK$R #BF.EXE,R3,FATAL;BUGCHECK THE SYSTEM&— ;FACILITY IS GENERAL EXEC ERROR. ˜ ;THE ERROR CODE IS FOR THE™ ;SST CAUSING THE PROBLEM.Bš›;O4œ; SST CANNOT BE EFFECTED BECAUSE OF BAD TASK STACK�;0ž3Ÿ70$: MOV #S.CSST,R0 ;SET BAD STACK SST ABORT CODEE  BR 81$ ;ABORT TASK¡¢;T9£; SST CANNOT BE EFFECTED BECAUSE OF NO SST VECTOR ENTRY¤;.¥'¦80$: MOV 4(SP),R0 ;SET SST ABORT CODES+§ TST $TEMP0 ;IS THERE A BOM$ ABORT CODE?E¨ BEQ 81$ ;IF EQ NO, OK AS IS-© MOV $TEMP0,R0 ;USE BOM$ ERROR CODE INSTEADT3ª81$: MOV #$STACK-22,SP ;RELOAD EXEC STACK POINTERE(«85$: CALLR $ABCTK ;ABORT CURRENT TASK¬­;L1®; FAULT FROM PROTECTED LIMITS IN DRDSP OR DRQIOO¯; °±90$:²³´ .IF DF P$$D70µ)¶ CLR @$CPUER ;CLEAR CPU ERROR REGISTER ·¸ .IF NDF M$$EXT¹ º NOP ;THIS NOP MUST BE HERE.'» ;UNLESS THE MICRO CODE BUG IN THEV(¼ ;11/60 IS FIXED (ECO M7872-00007),&½ ;CLEARING THE CPU ERROR REGISTER*¾ ;WILL CAUSE THIS WORD TO BE SKIPPED.¿À .ENDCÁ .ENDCÃÄ-Å INC $STKDP ;CORRECT STACK DEPTH INDICATORE/Æ MOV 20(R1),PS ;RESTORE CORRECT PREVIOUS MODE&Ç DRSTS D.RS98 ;SET DIRECTIVE STATUSÈÉÊ;I<Ë; FAULT FROM PROTECTED LIMITS IN CSM INSTRUCTION EMULATIONÌ; )Í; AT THIS POINT THE STACK IS AS FOLLOWSMÎ;.Ï; 0(SP) - NUMBER OF BYTES TO BE TRANSFERREDÐ; . Ñ; SST PARAMETERSÒ; .1'Ó; 0(R1) - RETURN POINTER TO $DIRXTC!Ô; 2(R1) - SAVED R0 FROM TRAP Õ; 4(R1) - SAVED R1OÖ; 6(R1) - SAVED R2C×; 10(R1) - SAVED R3Ø; 12(R1) - SAVED R4CÙ; 14(R1) - SAVED R5VÚ; 16(R1) - SAVED PCCÛ; 20(R1) - SAVED PSSÜ; .;,Ý; $STACK-6 - SAVED R0 DURING CSM EMULATIONÞ; $STACK-4 - PC OF CSM TRAPSß00€Òx�Ôxtöt÷tø tþfDATA; $STACK-2 - PS OF CSM TRAPTà; 8á; WE WILL CLEAN UP THE STACK AND MAKE IT LOOK AS IF WEâ; ENTERED THROUGH $DIRSVãä .IF DF S$$LIBåæ100$: !ç MTPS #PR7 ;DISABLE INTERRUPTS *è MOV 14(R1),R5 ;;;RESTORE R5 FROM $DIRSV%é MOV #$STACK-6,SP ;;;TRUNCATE STACKR%ê MOV (SP),R0 ;;;GET SAVED R0 VALUEë MOV R5,(SP) ;;;SAVE R5"ì MOV 20(R1),R5 ;;;AND GET OLD PS8í BIC #^C,R5 ;;;CLEAR ALL BUT PREVOIUS MODE BITS-î BIS R5,PS ;;;SET PREVIOUS MODE TO CORRECTAï MOV R4,-(SP) ;;;SAVE R41ð MOV SP,@$HEADR ;;;SAVE STACK POINTER IN HEADER /ñ MOV 4(R1),R1 ;;;RESTORE ORIGINAL VALUE OF R1Eò MTPS #0 ;;;ALLOW INTERRUPTS$'ó MOV R3,-(SP) ;SAVE REST OF REGISTERSE ô MOV R2,-(SP) ;TO MAKE IT LOOK"õ MOV R1,-(SP) ;LIKE A NORMAL SSTö MOV R0,-(SP) ;ENTRY TO THEM÷ MOV #$DIRXT,-(SP) ;EXECUTIVE+ø MOV #S.CCSM,R0 ;SET BAD STACK ABORT CODE5ù BR 85$ ;ABORT CURRENT TASKúû .ENDC ;DF S$$LIB ü ý .DSABL LSBþÿ .END ;;;SET PREVIOUS MODE TO CORRECTAï MOV R4,-(SP) ;;;SAVE .TITLE DRCRVK .IDENT /03.03/M;RD; COPYRIGHT (c) 1982, 1983, 1985 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;O; MODIFIED FOR M-PLUS V2.0 BY:;V; J. M. LAWLER; T. M. MARTIN; D. R. DONCHINA+; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY: ;R; J. R. KAUFFMAN;W; MODIFIED BY:;R ; B. S. MCCARTHY 30-MAY-84 03.02;V5; BM309 -- REMOVE REFERENCES TO $HEADR TO STREAMLINE ;. ; L. B. MCCULLEY 12-FEB-85 03.03; +; LBM004 -- CHANGE SPM HOOKPOINT MECHANISML;IE; THIS MODULE CONTAINS THE DIRECTIVE ROUTINES AND PRIMARY SUBROUTINESY1; WHICH PROVIDE PARENT-OFFSPRING TASKING SUPPORT.E; ; MACRO LIBRARY CALLS ;I* .MCALL ABODF$,DCBDF$,HDRDF$,TCBDF$,UCBDF$ .  ABODF$ ;DEFINE ABORT CODESI. DCBDF$ ;DEFINE DEVICE CONTROL BLOCK SYMBOLS% HDRDF$ ;DEFINE TASK HEADER SYMBOLS , TCBDF$ ;DEFINE TASK CONTROL BLOCK SYMBOLS9 UCBDF$ ,,TTDEF,SYSDEF ;DEFINE UNIT CONTROL BLOCK SYMBOLSC;Y; LOCAL SYMBOL DEFINITIONS;  C"D$LGTH=D.PCB+2 ;LENGTH OF VT DCB(U$LGTH=U.PTCB+2-U.UAB ;LENGTH OF VT UCB ;+(; **-$DRCRV-CREATE VIRTUAL TERMINAL UNIT;OB; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CREATE A VIRTUAL TERMINAL-; UNIT AND RETURN THE UNIT NUMBER IN THE DSW.A;F ; DPB FORMAT:R;O#; WD. 00 -- DIC(149.),DPB SIZE(5.).L&; WD. 01 -- INPUT AST ROUTINE ADDRESS.'; WD. 02 -- OUTPUT AST ROUTINE ADDRESS.N'; WD. 03 -- ATTACH AST ROUTINE ADDRESS.F*; WD. 04 -- MAXIMUM ALLOWED BUFFER LENGTH.;O ; INPUTS:D;N@; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.:; R3=ADDRESS OF THE MAXIMUM BUFFER LENGTH WORD IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.T,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;D5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)R;O-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.17; NUMBER OF CREATED VIRTUAL TERMINAL UNIT IS RETURNED.U; C=1 IF DIRECTIVE IS REJECTED.H;; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF AN ALLOCATIONN; FAILURE OCCURS.9; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE VIRTUALE"; TERMINAL DRIVER IS NOT LOADED.;- L .IF DF V$$TRM P9$DRCRV::TST $VTDCB+D.DSP ;VIRTUAL TERMINAL DRIVER LOADED?A BEQ 100$ ;IF EQ NO4 MOV #D$LGTH+U$LGTH,R1 ;PICK UP SIZE OF VT DATA BASE$ CALL $ALOCB ;ALLOCATE VT DATA BASE# BCS 90$ ;IF CS ALLOCATION FAILURE MOV R0,R1 ;SAVE POINTER TO DCB, MOV #$VTDCB,R2 ;POINT TO DATA BASE FOR VT0:/20$: MOV (R2)+,(R0)+ ;COPY WORD OF VT DATA BASEU. CMP R2,#$VTDCB+D$LGTH+U$LGTH ;DONE WITH COPY? BLO 20$ ;IF LO NO'1 SUB #U$LGTH+U.UAB,R0 ;POINT BACK TO START OF UCBI) MOV R0,D.UCB(R1) ;SET UCB POINTER IN DCBM- MOV R1,(R0) ;SET DCB POINTER IN UCB (U.DCB)L5 MOV R0,U.RED(R0) ;SET UP REDIRECTION POINTER (U.RED)L3 BIT #T3.PRV,T.ST3(R5) ;IS ISSUING TASK PRIVILEGED?A BEQ 30$ ;IF EQ NO8 BIS #U2.PRV,U.CW2(R0) ;MAKE VIRTUAL TERMINAL PRIVILEGED630$: ADD #U.IAST,R0 ;POINT TO PARENT INPUT AST ADDRESS  : .IF DF S$$LIB O00�ÚxNxt´cÚµcÛ¶c�·c›’. MOV (R3)+,R2 ;GET SPECIFIED INPUT AST ADDRESS( CALL $CALTA ;CALCULATE CORRECT ADDRESS- MOV R2,(R0)+ ;SET INPUT AST ADDRESS (U.IAST)T/ MOV (R3)+,R2 ;GET SPECIFIED OUTPUT AST ADDRESSC( CALL $CALTA ;CALCULATE CORRECT ADDRESS. MOV R2,(R0)+ ;SET OUTPUT AST ADDRESS (U.OAST)/ MOV (R3)+,R2 ;GET SPECIFIED ATTACH AST ADDRESSI( CALL $CALTA ;CALCULATE CORRECT ADDRESS. MOV R2,(R0)+ ;SET ATTACH AST ADDRESS (U.AAST) V .IFF :0 MOV (R3)+,(R0)+ ;SET INPUT AST ADDRESS (U.IAST)1 MOV (R3)+,(R0)+ ;SET OUTPUT AST ADDRESS (U.OAST)E1 MOV (R3)+,(R0)+ ;SET ATTACH AST ADDRESS (U.AAST)C E .ENDC  V5 MOV H.DUIC(R4),(R0)+ ;INITIALIZE DEFAULT UIC (U.UIC)R. MOV R5,(R0) ;SET PARENT TCB ADDRESS (U.PTCB). MOV (R3),R2 ;PICK UP SPECIFIED BUFFER LENGTH" BEQ 40$ ;IF EQ STAY WITH DEFAULT- MOV R2,U.CW4-U.PTCB(R0) ;STORE BUFFER LENGTHC& CMP R2,#V$$TLM ;GREATER THAN MAXIMUM? BLOS 40$ ;IF LOS NOC= BIS #U3.DBF,U.CW3-U.PTCB(R0) ;DISABLE INTERMEDIATE BUFFERINGN*40$: MOV #$VTDCB,R0 ;POINT TO DCB FOR VT0:-60$: MOV R0,R2 ;COPY POINTER TO PREVIOUS DCB0 MOV (R0),R0 ;POINT TO NEXT DCB7 ADD #401,D.UNIT(R1) ;ADVANCE LOW AND HIGH UNIT NUMBERS 8 CMP D.NAM(R0),#"VT ;IS NEXT DCB FOR A VIRTUAL TERMINAL? BNE 70$ ;IF NE NO,< CMP D.UNIT(R1),D.UNIT(R0) ;IS IT THE NEXT CONSECUTIVE UNIT? BEQ 60$ ;IF EQ YES,70$: MOV R0,(R1) ;LINK NEW UNIT TO THIS ONE, MOV R1,(R2) ;LINK PREVIOUS UNIT TO NEW ONE6 MOVB D.UNIT(R1),2(SP) ;SET UNIT NUMBER IN STATUS WORD;+; ** W A R N I N G **#;D; SPM HOOKPOINT NUMBER 23.;0); DO NOT CHANGE THE INSTRUCTION FOLLOWING0; LABEL WITHOUT CHECKING SPM;-+$SPH23==. ;SPM CHANGES THE INSTRUCTION ATI ;THE LOCATION OF THIS LABELI' INC T.RDCT(R5) ;INC TASK RUNDOWN COUNT$ RETURN ;D%90$: DRSTS D.RS1 ;ALLOCATION FAILUREN6100$: DRSTS D.RS6 ;VIRTUAL TERMINAL DRIVER NOT LOADED N;++; **-$DRELV-ELIMINATE VIRTUAL TERMINAL UNITO;U@; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ELIMINATE THE SPECIFIED; VIRTUAL TERMINAL UNIT.;* ; DPB FORMAT:O;O#; WD. 00 -- DIC(151.),DPB SIZE(2.).H); WD. 01 -- VIRTUAL TERMINAL UNIT NUMBER.H;I ; INPUTS:;S@; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.<; R3=ADDRESS OF THE VIRTUAL TERMINAL UNIT NUMBER IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.R,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;O5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)L;I-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.O(; DIRECTIVE STATUS OF '+1' IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.7; DIRECTIVE STATUS OF 'D.RS92' RETURNED IF THE ISSUING -; TASK DID NOT CREATE THE SPECIFIED VIRTUAL2; TERMINAL UNIT.;- .ENABL LSBF;$DRELV::MOV #$VTDCB,R0 ;POINT TO FIRST VIRTUAL TERMINAL DCB 610$: CMPB D.UNIT(R0),(R3) ;IS THIS THE SPECIFIED UNIT? BEQ 30$ ;IF EQ YES1 MOV (R0),R0 ;POINT TO NEXT VIRTUAL TERMINAL DCB:2 CMP D.NAM(R0),#"VT ;IS IT A VIRTUAL TERMINAL DCB? BEQ 10$ ;IF EQ YES120$: DRSTS D.RS92 ;INVALID VIRTUAL TERMINAL UNIT 430$: MOV D.UCB(R0),R0 ;POINT TO VIRTUAL TERMINAL UCB/ CMP U.PTCB(R0),R5 ;IS ISSUING TASK THE PARENT?  BNE 20$ ;IF NE NO, ILLEGAL C;++; **-$ELMVT-ELIMINATE VIRTUAL TERMINAL UNITB;SE; THIS ROUTINE ELIMINATES THE SPECIFIED VIRTUAL TERMINAL UNIT CREATEDC; BY THE CURRENT TASK.;S ; INPUTS:I;U6; R0=UCB ADDRESS OF VIRTUAL TERMINAL UNIT TO ELIMINATE;R ; OUTPUTS:;C=; ANY LUNS WHICH THE CURRENT TASK HAS ASSIGNED TO THE VIRTUAL$?; TERMINAL UNIT ARE DEASSIGNED. IF THERE ARE ANY ACTIVE TASK'S?; WHOSE TI: IS THE VIRTUAL TERMINAL UNIT BEING ELIMINATED, THEY(>; ARE ABORTED. AT THIS POINT AN ATTEMPT IS MADE TO ALLOCATE A?; COMMAND LINE TO MCR TO PERFORM ANY NECESSARY CLEANUP REQUIREDH?; BY THE VIRTUAL TERMINAL. IF THE COMMAND LINE CANNOT BE ALLO-C?; CATED, THE CURRENT TASK IS FORCED INTO A WAIT FOR SIGNIFICANT A; EVENT. (THE PC IS BACKED UP IN CASE THIS IS A ELVT$ DIRECTIVE.W@; IF THE TASK IS EXITING, THE PC DOESN'T MATTER.) WHEN THE COM-B; MAND LINE IS SUCCESSFULLY QUEUED, THE UNIT IS MARKED FOR DEALLO-=; CATION AND THE CURRENT TASK'S RUNDOWN COUN00�âxÔxtöt÷tø tþfDATAT IS DECREMENTED..@; SINCE A COMMAND LINE IS ALWAYS QUEUED, $DEAVT CANNOT BE CALLED; IMMEDIATELY.;- C$ELMVT::SAVNR ;SAVE R4 AND R5E MOV R0,R5 ;SAVE UCB ADDRESSA3 CALL $CVTLN ;CLEAR OUT VIRTUAL TERMINAL LUN WORDSS- TSTB U.OCNT(R0) ;ANY OFFSPRING STILL ACTIVE? # BEQ 85$ ;IF EQ NO, ELIMINATE UNITA;VE; AT THIS POINT THE STD IS SEARCHED FOR ANY ACTIVE TASKS WHOSE TI: IS D; THE VIRTUAL TERMINAL BEING ELIMINATED. THE STD IS SCANNED INSTEADH; OF THE ATL TO FIND ANY TASKS WHICH ARE IN THE PROCESS OF BEING LOADED,7; THUS TS.EXE IS CLEAR BUT THEY ARE NOT YET IN THE ATL.A;D0 MOV $TSKHD,R1 ;POINT TO FIRST TASK IN TASK LIST>70$: MOV T.TCBL(R1),-(SP) ;PUSH POINTER TO NEXT INSTALLED TASK* BEQ 80$ ;IF EQ CURRENT TASK IS NULL TASK TST T.STAT(R1) ;TASK ACTIVE?E BMI 80$ ;IF MI NON* CMP T.UCB(R1),R5 ;OFFSPRING OF THIS UNIT? BNE 80$ ;IF NE NON4 BIT #T3.PRV!T3.SLV,T.ST3(R1) ;NO ABORT BECAUSE TASK ;PRIVILEGED OR SLAVE?S BNE 80$ ;IF NE YES' TSTB T.ST2(R1) ;TASK ALREADY EXITTING?  BMI 80$ ;IF MI YES$ MOV #S.CELV,R0 ;SET TKTN ABORT CODE CALL $ABTSK ;ABORT THE TASKV/80$: MOV (SP)+,R1 ;RESTORE POINTER TO NEXT TASK: BNE 70$ ;IF NE THERE IS ONEN/85$: CLR U.PTCB(R5) ;MARK UNIT FOR DEALLOCATIONE0 MOV $TKTCB,R3 ;PICK UP CURRENT TASK TCB ADDRESS, DEC T.RDCT(R3) ;REDUCE TASK'S RUNDOWN COUNT# CLR R1 ;SET STATUS TO REQUEST BYE  MOV R5,R2 ;SET UCB ADDRESS" CALL $QCNTP ;QUEUE A BYE COMMAND$ BEQ 90$ ;IF CC-Z SET THEN NO ERROR5 SUB #2,$UMPC ;BACKUP USER PC TO RE-EXECUTE DIRECTIVEI2 CALLR $TKWSE ;FORCE TASK INTO WAIT FOR SIG EVENT/90$: MOV U.RPKT(R5),R0 ;GET INPUT (READ) PACKET+- BIS U.WPKT(R5),R0 ;GET OUTPUT (WRITE) PACKETI! BNE 160$ ;IF NE I/O IN PROGRESS(3 BICB #US.BSY,U.STS(R5) ;MAKE SURE UNIT IS NOT BUSYK, CALLR $IOKIL ;INSURE PROPAGATION OF DRIVER D;+,; **-$DEAVT-DEALLOCATE VIRTUAL TERMINAL UNIT;UB; THIS ROUTINE UNLINKS THE SPECIFIED VIRTUAL TERMINAL UNIT CONTROL4; BLOCKS FROM THE DEVICE LISTS AND DEALLOCATES THEM.;P ; INPUTS:S;P7; R0=ADDRESS OF VIRTUAL TERMINAL UNIT UCB TO DEALLOCATET;A ; OUTPUTS:;T8; THE VIRTUAL TERMINAL UNIT IS UNLINKED AND DEALLOCATED.;- 5;$DEAVT::MOV (R0),R0 ;POINT TO VIRTUAL TERMINAL DCB (U.DCB)O S;+; ** W A R N I N G ** ;K; SPM HOOKPOINT NUMBER 24.;R); DO NOT CHANGE THE INSTRUCTION FOLLOWING; LABEL WITHOUT CHECKING SPM;-+$SPH24==. ;SPM CHANGES THE INSTRUCTION ATS ;THE LOCATION OF THIS LABELN4 MOV #$VTDCB,R1 ;POINT TO FIRST VIRTUAL TERMINAL DCB(100$: CMP (R1),R0 ;NEXT UNIT SPECIFIED? BEQ 110$ ;IF EQ YES 1 MOV (R1),R1 ;POINT TO NEXT VIRTUAL TERMINAL DCBE BR 100$ ;S110$: MOV (R0),(R1) ;UNLINK DCB5. MOV #D$LGTH+U$LGTH,R1 ;SET SIZE TO DEALLOCATE* CALLR $DEACB ;DEALLOCATE DATA STRUCTURES ;+,; **-$CVTLN-CLEAR VIRTUAL TERMINAL LUN WORDS;HD; THIS ROUTINE IS CALLED TO CLEAR (DEASSIGN) ANY LUN ENTRIES FOR THEA; CURRENT TASK WHICH POINT TO THE SPECIFIED VIRTUAL TERMINAL UCB.E; ; INPUTS:D;R!; R0=VIRTUAL TERMINAL UCB ADDRESSD; ; OUTPUTS:;R; R0 AND R3 ARE PRESERVED.;- $CVTLN:: .IF DF X$$HDR, MOV KISAR6,-(SP) ;SAVE CURRENT APR6 MAPPING/ MOV $SAHDB,KISAR6 ;MAP NONRESIDENT TASK HEADERH .ENDC ; DF X$$HDR" MOV $SAHPT,R1 ;GET HEADER ADDRESS7 ADD #H.NLUN,R1 ;POINT TO NUMBER OF LUNS WORD IN HEADERM% MOV (R1)+,R2 ;PICK UP NUMBER OF LUNSA120$: DEC R2 ;ANY MORE LUNS?N BLT 150$ ;IF LT NO0 CMP (R1),R0 ;LUN ASSIGNED TO ELIMINATING UNIT? BNE 130$ ;IF NE NO CLR (R1) ;DEASSIGN LUN(130$: CMP (R1)+,(R1)+ ;POINT TO NEXT LUN BR 120$ ;R150$: ;REFERENCE LABELN .IF DF X$$HDR' MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPINGM .ENDC160$: RETURN ; O .ENDC A H .END .ENDC ; DF X$$HDR" MOV $SAHPT,R1 ;GET HEADER ADDRESS7 ADD #H.NLUN,R1 ;POINT TO NUMBER OF LUNS WORD IN HEADERM% MOV (R1)+,R2 ;PICK UP NUMBER OF LUNSA120$: DEC R2 ;ANY MORE LUNS?N BLT 150$ ;IF LT NO0 CMP (R1),R0 ;LUN ASSIGNED TO ELIMINATING UNIT? BNE 130$ ;IF NE NO CLR (R1) ;DEASSIGN LUN(130$: CMP (R1)+,(R1)+ ;POINT TO NEXT LUN BR 120$ ;R150$: 00‚êxNxt´cÚµcÛ¶c�·c›’ .TITLE LOADRP .IDENT /12.05/G; 1; COPYRIGHT (C) 1987 BY DIGITAL EQUIPMENT CORP.#; ALL RIGHTS RESERVED.;> ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; MODIFIED FOR M-PLUS V2.0 BY: ;; D. R. DONCHIN ; M. S. FOXN; J. M. LAWLER; T. M. MARTIN; B. S. MCCARTHY;H&; MODIFIED FOR RSX-11M-PLUS V2.1 BY:;B; J. R. KAUFFMAN; J. M. LAWLER; B. S. MCCARTHY;L&; MODIFIED FOR RSX-11M-PLUS V3.0 BY:; ; J. M. LAWLER 25-MAY-84 11.06!; B. S. MCCARTHY 3-JUL-84 11.07S"; L. B. MCCULLEY 12-FEB-85 11.08 ; J. W. BERZLE 12-APR-85 11.09 ; G. N. LARSEN 20-MAY-85 11.10;E&; MODIFIED FOR RSX-11M-PLUS V4.0 BY:;O'; C. A. SILVER 13-MAR-86 11.13 CAS021R.; Clear fast map pointer in task header for#; tasks without fast map support;%; K. L. NOEL 11-DEC-86 11.14 KLN0280; Create external header for run-time binding ; of LUNS;(; L. B. MCCULLEY 5-FEB-87 11.14 LBM0615; Deferred binding of task header (LUT and address32; windows) to system at load instead of install;.); L. B. MCCULLEY 17-MAR-87 11.15 LBM076N; Fix problem with LBM061;D(; L. B. MCCULLEY 8-MAY-87 11.16 LBM084:; Fix problem in LBM061 if unit not on first device DCB;t'; D. P. RABAHY 19-FEB-87 12.00 DPR040a.; Pass load & checkpoint requests to CPRSYS;2&; K. L. NOEL 28-MAY-87 12.01 KLN050<; Change LUT extension to not include number of luns word; &; D. P. RABAHY 8-JUN-87 12.02 DPR042; Support external header;s(; B. S. MCCARTHY 12-JUN-87 12.03 BM401/; Fix order of SUB,SBC in block number calc.;x$; K. L. NOEL 1-JUL-87 12.04 KLN057;; Fix loading of tasks with no luns for run time binding ;n'; D. P. RABAHY 21-JUL-87 12.05 DPR045A; Get TCB before DREXTa; 9;d5:; TASK TO LOAD AND CHECKPOINT ALL NONRESIDENT TASKS ;;Y<; MACRO LIBRARY CALLSa=;U>B> .MCALL ABODF$, CPRDF$, HDRDF$, HWDDF$, PCBDF$, TCBDF$ ;DPR040!@ .MCALL DIR$,WSIG$S ;**-1eB ;**-1s$C ABODF$ ;DEFINE TASK ABORT CODES6C CPRDF$ ;DEFINE SYMBOLS & OFFSETS FOR CPR ;DPR040'D HDRDF$ ;DEFINE TASK HEADER OFFSETS7&E HWDDF$ ;DEFINE HARDWARE REGISTERS3F PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS-.G TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETSHHMAP6= 140000 ;DPR040I;OJ; LOCAL DATAK;AL; READ/WRITE I/O DPBM; N$OLDRDP: .BYTE 3,12. ;DIC, DPB SIZE PLDRFC: .BLKW 1 ;FUNCTION CODEQ .BYTE 1 ;LUN 1R .BLKB 1 ;UNUSED BYTES .BYTE 1 ;EFN 1T .BLKB 1 ;UNUSED BYTE-U .WORD IOSB ;I/O STATUS DOUBLEWORD ADDRESST#V .WORD 0 ;NO AST SERVICE ROUTINEN=WLDRBF: .WORD 140000 ;BUFFER ADDRESS (ALWAYS MAP THRU APR6) XLDRLN: .BLKW 1 ;BUFFER LENGTHY .BLKW 1 ;(UNUSED)T&ZLDRBK: .BLKW 2 ;LBN OF I/O TRANSFER'[IOSB: .BLKW 2 ;I/O STATUS DOUBLEWORD\] .IF DF U$$DAS^,_ISIZE: .WORD 0 ;SIZE OF USER I SPACE LOAD,`IREL: .WORD 0 ;RELOCATION BIAS OF I SPACE3aMUDPT: .WORD 0 ;POINTER TO D WINDOW INTO MU PART b ;FOR A MULTI-USER I/D TASKd .ENDC ;**-1f ;**-1Sg .IF DF X$$HDRh-iHDRDB: .WORD 0 ;APR BIAS OF CURRENT HEADER.jk .ENDC ; DF X$$HDRm ;**-1 n;+o; **-$LOADR-LOADER TASK p;HGq; THE LOADER TASK IS DRIVEN OFF A LIST OF PCB'S QUEUED TO ITS RECEIVE Ar; QUEUE IN PRIORITY ORDER. THE LOADER'S ACTION FOR EACH PCB IS:Bs; PRIMARILY DRIVEN BY THE TWO PCB STATUS BITS PS.CKP AND PS.OUT.It; SECONDARY INFORMATION WHICH DRIVES THE LOADER IS PASSED IN THE STATUS Eu; BITS PS.CKR, PS.COM, PS.FXD, AND PS.RON. BASICALLY THE LOADER IS8v; CALLED UPON TO PERFORM ONE OF THE FOLLOWING ACTIONS:w;AFx; 1. (PS.CKP=0,PS.OUT=0) INITIALIZE A TASK FOR EXECUTION WHICH IS9y; ALREADY IN MEMORY. (CURRENTLY FOR TRAX-11 USE ONLY.)TGz; 2. (PS.CKP=0,PS.OUT=1) PERFORM THE INITIAL LOAD OF A NONRESIDENTRB{; REGION. IF THE REGION IS A TASK REGION (PS.COM=0), INITIALIZE00‚òxÔxtöt÷tø tþfDATA<|; ITS HEADER AND ATTACHMENT LIST. IF THE REGION IS A TASKB}; REGION WHICH IS NOT SIMPLY BEING FIXED (PS.FXD=0), CALL $BILDSB~; TO INITIALIZE THE TASK'S STACK AND PLACE IT IN THE ACTIVE TASKB; LIST. IF THE REGION BEING LOADED ALREADY HAS A PENDING CHECK-C€; POINT REQUEST (PS.CKR=1), INITIATE THE CHECKPOINT OF THE REGION �; BY CALLING $ICHKP.H‚; 3. (PS.CKP=1,PS.OUT=0) WRITE A CHECKPOINT IMAGE OF THE REGION OUTDƒ; TO DISK, FREE ITS MEMORY, AND CONDITIONALLY PLACE THE PCB IN THED„; PARTITION WAIT QUEUE. IF THE REGION IS A TASK REGION (PS.COM=0)?…; COPY ITS HEADER FROM THE POOL INTO THE IMAGE FIRST. IF THELC†; REGION IS A READ-ONLY COMMON (PS.RON=1), SIMPLY FREE ITS MEMORYK@‡; WITH NO I/O OPERATION. ALL PRIORITY ZERO COMMONS ARE QUEUED=ˆ; TO THE LOADR AS PRIORITY 251. COMMONS SO THAT THEY CAN BEE<‰; CHECKPOINTED OUT IMMEDIATELY. THEIR CORRECT PRIORITY ISŠ; RE-CALCULATED BY THE LOADR. H‹; 4. (PS.CKP=1,PS.OUT=1) READ THE CHECKPOINT IMAGE OF A REGION BACKBŒ; INTO MEMORY. IF THE REGION BEING LOADED ALREADY HAS A PENDINGA�; CHECKPOINT REQUEST (PS.CKR=1), INITIATE THE CHECKPOINT OF THEI@Ž; REGION BY CALLING $ICHKP. FOR INSTALLED COMMONS WITH PS.NWB>�; SET, THE DISK PCB IS DEALLOCATED SO THAT THE COMMON IS NOT1�; CHECKPOINTED TO ITS ORIGINAL TASK IMAGE FILE.M‘;-’; 5“; GET NEXT REQUEST FROM LOADER QUEUE (SYSTEM STATE)C”;TI•; HERE THE LOADER EXTRACTS THE NEXT PCB FROM ITS RECEIVE QUEUE OR STOPS1H–; ITSELF IF THERE IS NO REQUEST. IF THE REQUEST IS THE INITIALIZATIONH—; OF AN ALREADY LOADED TASK OR THE CHECKPOINT OF A READ-ONLY COMMON ORG˜; THE LOADING OF A REGION CREATED BY THE CREATE REGION DIRECTIVE, THEAJ™; QIO PHASE IS BYPASSED HERE. IF THE REQUEST IS THE CHECKPOINT WRITE OF=š; A TASK, ITS HEADER IS COPIED FROM THE POOL TO THE REGION.M›;-›$LOADR:: ;DPR0406› CALL $SWSTK, 31$ ;SWITCH TO SYSTEM STATE ;DPR0406ž CLR $LDPCB ;INITIALLY CLEAR SAVED PCB WORD ;**-2,Ÿ MOV $TKTCB,R0 ;PICK UP LOADER TCB ADDRESS,  ADD #T.RCVL,R0 ;POINT TO RECEIVE LISTHEAD(¡ CALL $QRMVF ;REMOVE ENTRY FROM QUEUE¢ BCC 5$ ;IF CC GOT ONE ¢ ;DPR040R=¢ BIT #FE.MXT, $FMASK ;; NO WORK, SO STOP OR EXIT? ;DPR040P%¢ BNE 4$ ;; IF NE, EXIT ;DPR040K£ CALLR $STPCT ;STOP FOR NOW3£4$: MOV $TKTCB, R5 ;; GET LOADER'S TCB ;DPR045%£ CALLR $DREXT ;; EXIT ;DPR040S£ ;DPR040S&¤5$: CLR IOSB ;INDICATE NO I/O ERROR3¥ MOV R1,R3 ;CALCULATE ADDRESS OF PCB STATUS WORD0¦§;+¨; ** W A R N I N G **D©;C;ª; SPM HOOKPOINT - LOADR CALLS DUMMY ROUTINE FOR HOOKPOINTR«;M+¬; DO NOT CHANGE THE INSTRUCTION FOLLOWING ­; LABEL WITHOUT CHECKING SPM®;-¯+° CALL @$SPV02 ;CALL HOOKABLE ENTRY POINT;±²³ ADD #P.STAT,R3 ;8´ BIT #PS.OUT!PS.CKP,(R3) ;INIT OF ALREADY LOADED TASK?µ BEQ 7$ ;IF EQ YES$¶ BIT #PS.COM,(R3) ;IS IT A COMMON?· BEQ 13$ ;IF EQ NOS:¸ BIT #P2.RON,2(R3) ;IS IT AN INSTALLED READ ONLY COMMON?¹ BEQ 6$ ;IF EQ NO8º BIT #PS.OUT,(R3) ;CHECKPOINT OF THE READ ONLY COMMON?%» BNE 13$ ;IF NE NO, MUST BE LOADEDT.¼ BR 12$ ;BYPASS I/O ON CKP OUT OF RO COMMON-½6$: TST P.DPCB(R1) ;LOAD OF CREATED REGION?I¾ BNE 13$ ;IF NE NOL=¿7$: BIS #PS.OUT,(R3) ;SET ALREADY LOADED TASK OUT OF MEMORYR#À12$: MOV R1,R4 ;COPY PCB ADDRESST$Á MOV P.TCB(R4),R5 ;SET TCB ADDRESS& JMP 82$ ;JOIN AFTER I/O COMPLETION&Ã13$: MOV R1,$LDPCB ;SAVE PCB ADDRESS5Ä BIT #PS.OUT!PS.COM,(R3) ;CHECKPOINT WRITE OF TASK?Å BNE 30$ ;IF NE NOB/Æ MOV P.HDR(R1),R3 ;GET ADDRESS OF TASK HEADEROÇÈ .IF DF X$$HDRÉ.Ê BEQ 30$ ;IF EQ EXTERNAL HEADER, DON'T COPYËÌ .ENDC ; DF X$$HDRÍ7Î MOV P.REL(R1),KISAR6 ;SETUP TO ACCESS TASK PARTITIONL+Ó MOV P.TCB(R1),R2 ;POINT TO TCB ;**-4T5Ô ADD T.OFF(R2),KISAR6 ;ADD IN OFFSET TO TASK HEADERT× ;**-2R5Ø MOV #140000,R2 ;SET ADDRESS BIAS OF TASK PARTITIONI5Ù MOV H.WND(R3),R4 ;POINT TO NUMBER OF WINDOW BLOCKSO)Ú TST W.BLVR+2(R4) ;TASK MAPPED TO EXEC?Û BNE 15$ ;IF NE YES8Ü MOV H.DSW(R2),H.DSW(R3) ;COPY DSW TO REAL T00‚úxNxt´cÚµcÛ¶c�·c›’ASK HEADER7Ý15$: MOV H.HDLN(R3),R4 ;GET LENGTH OF HEADER IN BYTES'!Þ ASR R4 ;CONVERT TO WORD COUNT7ß20$: MOV (R3)+,(R2)+ ;MOVE HEADER INTO TASK PARTITIONL#à DEC R4 ;ANY MORE WORDS TO MOVE? á BGT 20$ ;IF GT YES%â30$: RETURN ;RETURN TO TASK STATETãä; ,å; PERFORM ACTUAL I/O TRANSFER (TASK STATE)æ;TIç; HERE THE LOADER SETS UP THE QIOW DPB AND PERFORMS THE ONE OR MORE I/OTHè; TRANSFERS REQUIRED. AFTER SETTING UP THE I/O FUNCTION CODE AND BYTEIé; COUNT THE LOADER MUST CALCULATE THE DISK ADDRESS AND UCB ADDRESS. IFEHê; THERE IS A DISK PCB, THE LOADER CODE ASSUMES IT IS A CHECKPOINT PCB,Jë; AND THE DATA STRUCTURES ARE SUCH THAT THIS WORKS FOR COMMON TASK IMAGEGì; FILE PCB'S AS WELL. OTHERWISE THE REQUEST MUST BE FOR A TASK TO ORTFí; FROM ITS TASK IMAGE FILE. FOR AN INITIAL TASK LOAD THIS MEANS THE@î; ADDRESS IN T.LBN. FOR A CHECKPOINT OPERATION THIS MEANS THEJï; ADDRESS AT T.LBN MINUS THE PARTITION SIZE (THE PREALLOCATED CHECKPOINT ð; SPACE). ñ;RIò; THE I/O TRANSFER IS SPECIFIED TO THE EXECUTIVE BY SPECIFYING A BUFFER Hó; ADDRESS OF 140000 AND LOADING UISAR6 WITH THE PHYSICAL MEMORY OFFSETJô; OF THE FIRST 32W BLOCK OF THE TRANSFER. THIS ALLOWS THE EXECUTIVE TOHõ; FIND THE CORRECT START ADDRESS VIA $RELOC. THE SIZE OF THE TRANSFERIö; CAN BE ANYTHING SINCE THE EXECUTIVE DOES NOT ADDRESS CHECK PRIVILEGEDFF÷; TASKS. THE PROCESSOR PRIORITY IS RAISED TO PR7 TO INHIBIT CONTEXTIø; SWITCHING BETWEEN THE LOADING OF UISAR6 AND THE EXECUTION OF THE QIOW/Fù; DIRECTIVE. THE PRIORITY ONLY REMAINS AT PR7 FOR SHORT INSTRUCTIONHú; SEQUENCES AT TASK STATE IN THE LOADER, NATURALLY DROPPING TO PR0 ANDGû; ALLOWING CONTEXT SWITCHING WHEN THE QIOW IS EXECUTED. ON RETURN TO Bü; LOADER FROM THE QIOW, HOWEVER, THE PRIORITY IS RETURNED TO PR7Dý; AUTOMATICALLY AND UISAR6 WILL BE RELOADED IF ANOTHER TRANSFER IS þ; REQUIRED.Kÿ;H;ÿ31$: MOV $LDPCB, R4 ;RETRIEVE SAVED PCB ADDRESS ;DPR040 6 BEQ $LOADR ;IF EQ THERE WAS NONE, TRY AGAIN ;**-28 MOV P.TCB(R4),R5 ;GET TCB ADDRESS (IF TASK PARTITION)3 MOV R4,R3 ;CALCULATE ADDRESS OF PCB STATUS WORDT ADD #P.STAT,R3 ;T ;DPR0400 .IF DF C$$LDR ;DPR040I ;DPR040X9 BIT #F5.LDR, $FMSK5 ; REMOTE LOADER SUPPORT? ;DPR040T" BEQ 49$ ; IF EQ NO ;DPR040 ;DPR040A4 MOV P.DPCB(R4), R1 ; POINT TO DISK PCB ;DPR040. BEQ 40$ ; IF EQ THERE ISN'T ONE ;DPR0402 MOV P.UCB(R1), R1 ; SAVE UCB ADDRESS ;DPR040 BR 41$ ;DPR040A40$: MOV T.LDV(R5), R1 ; SAVE LOAD DEVICE UCB ADDRESS ;DPR040V41$: ;DPR040SA CMP #.LB0, R1 ; BOOT DEVICE INDICATES REMOTE REQUIRED ;DPR040, BNE 49$ ; IF NE, LOCAL DEVICE ;DPR040 ;DPR040R:42$: CALL $SWSTK, 48$ ; SWITCH TO SYSTEM STATE ;DPR040 ;DPR040@ MOV #< P$BLK+ 77>/ 100, R1 ;; ROUNDED SIZE OF PACKET ;DPR0409 CLR R0 ;; INDICATES IMMEDIATE RETURN DESIRED ;DPR0403 CALL $CPALO ;; GET BUFFER FROM CPRBUF ;DPR040B- BCC 43$ ;; RESOURCES AVAILABLE ;DPR040 : BIS #1, $UMPS ;; PROPAGATE STATUS TO USER-MODE ;DPR040 RETURN ;DPR040 43$: ;DPR040O9 MOV R0, KISAR6 ;; MAP NEWLY ALLOCATED PACKET ;DPR040;4 MOV #MAP6, R0 ;; BASE ADDRESS OF PACKET ;DPR040; ;DPR040/; LOAD HEADER & PARAMETER AREAS ;DPR040L; ;DPR040* CLRB H$ICNT(R0) ;; NO ITEMS ;DPR040 ;DPR040RH BIT #PS.OUT, P.STAT(R4) ;; IS THE REGION IN OR OUT OF MEMORY? ;DPR040) BNE 44$ ;; IF NE, IT'S OUT ;DPR040D= MOVB #HT$CKW, H$TYPE(R0) ;; MUST BE WRITE REQUEST ;DPR0400 BPT ;; [TBS] ;DPR04044$: ;DPR040: MOV P.REL(R4), P$ADDR(R0) ;; DESTINATION BIAS ;DPR0404 CLR P$ADDR+2(R0) ;; DESTINATION OFFSET ;DPR040 ;DPR040#XXX= PS.CKP!PS.COM ;DPR040 @ BIT #XXX, P.STAT(R4) ;; IS THIS CHECKPOINT OR COMMON? ;DPR0407 BEQ 46$ ;; IF EQ, NO - MUST BE A TASK LOAD ;DPR040R ;DPR040NB MOV P.DPCB(R4), R1 ;; GET DISK PARTITION CONTROL BLOCK ;DPR000‚yÔxtöt÷tø tþfDATA40' BNE 45$ ;; SANITY CHECK ;DPR040E BPT ;DPR04045$: ;DPR040D? MOVB #HT$CKR, H$TYPE(R0) ;; CHECKPOINT READ REQUEST ;DPR040 > MOV P.IID(R1), P$IID(R0) ;; USE COMMON IMAGE INDEX ;DPR040H MOV P.SIZE(R4), P$LEN(R0) ;; # OF 32. WORD BLOCKS TO TRANSFER ;DPR040? MOV P.LBN+2(R1), P$BLK(R0) ;; RELATIVE BLOCK NUMBER ;DPR0400 BR 47$ ;DPR04046$: ;DPR040 ; MOVB #HT$ILD, H$TYPE(R0) ;; IMAGE LOAD REQUEST ;DPR040 = MOV T.IID(R5), P$IID(R0) ;; USE TASK IMAGE INDEX ;DPR040E ;DPR040T@ ADD T.OFF(R5), P$ADDR(R0) ;; ADJUST DESTINATION BIAS ;DPR040 ;DPR040EP47$: CPSEN$ #SN$TSK,KISAR6,#P$BLK+2 ;; SEND PACKET TO CPRSYS VIA KXDRV ;DPR040 ;DPR040,+ MOV R0, KISAR6 ;; MAP PACKET ;DPR040R6 MOV MAP6+H$STAT, IOSB ;; PROPAGATE STATUS ;DPR040 ;DPR0406 CALLR $CPDEA ;; RELEASE THE CPRBUF SPACE ;DPR04048$: ;DPR040I6 BCS 42$ ; RESOURCE WAS LACKING, TRY AGAIN ;DPR0405 JMP 81$ ; CONTINUE WITH POST-PROCESSING ;DPR040449$: ;DPR040D" .ENDC ; DF C$$LDR ;DPR040 ;DPR040D* MOV #IO.RLB,LDRFC ;ASSUME READ FUNCTION. BIT #PS.OUT,(R3) ;CHECKPOINT WRITE REQUEST? BNE 50$ ;IF NE NOM(  MOV #IO.WLB,LDRFC ;SET WRITE FUNCTION 50$: ;DPR040;'  BIT #PS.COM,(R3) ;COMMON ? ;**-1   BEQ 501$ ;IF EQ, NO G  BIT #P2.LDD,P.ST2(R4) ;WAS LOAD DEVICE DISABLED/DISMOUNTED ? ;DPR0404! BNE 51$ ;IF NE, YES ;**-1A$ BR 52$ ;ELSE CONTINUE PROCESSING501$:R5 BIT #T4.LDD,T.ST4(R5) ;TASK LOAD DEVICE DISABLED ?;  BEQ 52$ ;IF EQ NO, ALL IS OK) BIT #PS.CKP,(R3) ;CHECKPOINT REQUEST ?R BEQ 51$ ;IF EQ NO, FAILURE5 BIT #T3.CAL,T.ST3(R5) ;CHECK POINT SPACE IN TASK ? BEQ 52$ ;IF EQ NO, IT'S OK+51$: MOVB #IE.PRI,IOSB ;FORCE I/O FAILUREC52$: ;DPR040-+ CLR R0 ;HIGH PORTION OF SIZE ;DPR040P7 MOV P.SIZE(R4),R1 ;ASSUME SIZE OF TRANSFER ;DPR040@  BIT #PS.CKP!PS.COM,(R3) ;CHECKPOINT REQUEST OR COMMON? ;**-8! BNE 55$ ;IF NE YES";LF#; THIS IS AN INITIAL TASK LOAD. SET SIZE FROM T.TKSZ, TASK LOAD SIZE+$; AND CLEAR FLAG INDICATING D SPACE TASK. %;>% MOV T.TKSZ(R5),R1 ;USE TASK TRANSFER SIZE INSTEAD ;DPR040%55$: ;DPR040B0% ASHC #6,R0 ;CONVERT TO BYTE COUNT ;DPR040.% MOV R0,R2 ;HIGH PORTION OF SIZE ;DPR040E% MOV R1,-(SP) ;OUT OF REGISTERS - USE STACK FOR LOW PORTION ;DPR040S% ;DPR040 *% MOV #LDRBK,R0 ;POINT TO LBN ;DPR040% ;DPR040M1> MOV P.DPCB(R4),R1 ;POINT TO DISK PCB ;**-24I ? BEQ 56$ ;IF EQ THERE IS NONE5@ MOV P.REL(R1),2(R0) ;GET RELATIVE POSITION IN FILEN'A MOV P.MAIN(R1),R1 ;POINT TO MAIN PCB,6B MOV P.LBN(R1),(R0)+ ;SET HIGH BITS OF BLOCK ADDRESS:C ADD P.LBN+2(R1),(R0) ;ADD LOW BITS TO RELATIVE POSITIOND ADC -(R0) ;PROPAGATE CARRY(E MOV P.UCB(R1),-(SP) ;SAVE UCB ADDRESS F BR 60$ ;;G56$: MOVB T.LBN(R5),(R0)+ ;SET HIGH BITS OF BLOCK ADDRESSH CLRB (R0)+ ;6I MOV T.LBN+1(R5),(R0) ;SET LOW BITS OF BLOCK ADDRESS4J MOV T.LDV(R5),-(SP) ;SAVE LOAD DEVICE UCB ADDRESS4K BIT #PS.CKP,(R3) ;IS THIS A CHECKPOINT OPERATION?LM .IF NDF U$$DASNO BEQ 60$ ;IF EQ NO PQ .IFF ; NDF U$$DASRS BNE 58$ ;IF NE YESTU;DFV; THIS IS AN INITIAL LOAD. IF THE TASK HAS USER INSTRUCTION AND DATAHW; SPACE ENABLED, ADJUST SO THAT THE FIRST LOAD GETS THE DATA SPACE IN.8X; THEN WE WILL LOCATE I SPACE THROUGH THE TASK HEADER.Y;RZ?[ BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH SEPARATE I/D SPACES ?K\ BEQ 60$ ;IF EQ NOR0] DEC ISIZE ;AND INDICATE PARTIAL D SPACE LOAD^ BR 60$ ;REJOIN COMMON CODE_` .ENDC ; DF U$$DASa6b58$: MOV P.SIZE(R4),R1 ;PICK UP MAXIMUM SIZE OF TASK*c ADD #7,R1 ;ROUND UP TO NEXT 512. BLOCK'd ROR R1 ;CONVERT TO 512. WORD BLOCKSS e ASR R1 ; f ASR R1 ;gh .IF DF U$$DASi9k SUB T.ISIZ(R5),(R0) ;ADJUST BY SIZE OF I SPACE ;**-1 k SBC -2(R0) ; ; BM401 lm .ENDC ; DF U$$DASn3o SUB R1,(R0) ;CALCULATE STARTING LBN OF CKP00‚ yNxt´cÚµcÛ¶c�·c›’ AREAEp SBC -(R0) ; p60$: ;DPR042 p; ;DPR042Sp; SINCE WE'RE IN USER-MODE AT THIS POINT WE HAVE TO USE UISAR6 TO MAP OUR ;DPR042VVp; HEADER AND SO WE MUST DISABLE INTERRUPTS LEST WE HAVE OUR CONTEXT RELOADED ;DPR042p; ;DPR042;p MOV $SAHPT, R1 ; GET ADDRESS OF LOADER'S HEADER ;DPR042D3p MOVB #PR7, PS ;;; LOCK OUT INTERRUPTS ;DPR042O8p MOV $SAHDB, UISAR6 ;;; MAP LOADER'S HEADER ;DPR0421pPLF = / 100 * 400 ;DPR042S8p MOV #PLF + 6, UISDR6 ;;; ALLOW WRITE ACCESS ;DPR042@p MOV (SP)+, H.LUN(R1) ;;; ASSIGN LUN 1 TO LOAD DEVICE ;DPR042+p CLRB PS ;;; ALLOW INTERRUPTS ;DPR042Dp ;DPR040DDp MOV P.REL(R4), R1 ; PICK UP RELOCATION BIAS OF PARTITION ;DPR040Dp BIT #PS.CKP!PS.COM, (R3) ; CHECKPOINT REQUEST OR COMMON? ;DPR040#p BNE 65$ ; IF NE YES ;DPR040;@p ADD T.OFF(R5), R1 ; ELSE ADD IN OFFSET TO TASK IMAGE ;DPR040p65$: ;DPR040Ap MOV #177000, LDRLN ; SET TENTATIVE LENGTH OF TRANSFER ;DPR040,|; ;**-11T}; AT THIS POINT WE HAVE:~; :~; R2,(SP) = TOTAL SIZE OF TRANSFER TO PERFORM ;DPR040D€; R1 = RELOCATION BIAS OF LOAD AREA IN PHYSICAL MEMORY ;**-1)�; R4 = PCB ADDRESS OF TRANSFER PCBR-‚; R5 = TCB ADDRESS OF TASK (IF TASK REGION)H?ƒ; LDRBK = HIGH ORDER PART OF DISK BLOCK ADDRESS TO TRANSFER 2„; LDRBK+2 = LOW ORDER PART OF DISK BLOCK ADDRESS…;A?… SUB #177000, (SP) ; REDUCE ACTUAL COUNT TO TRANSFER ;DPR040 … SBC R2 ;DPR040,… BGE 70$ ; IF GE FULL TRANSFER ;DPR040;… ADD (SP), LDRLN ; ELSE REDUCE SIZE OF TRANSFER ;DPR040N2… BEQ 80$ ; IF EQ LAST TRANSFER DID IT ;DPR040…70$: ;DPR040S<… TSTB IOSB ; FORCED I/O ERROR (DUE TO DISMOUNT)? ;DPR0408… BMI 80$ ; IF MI YES, MAKE IT LOOK LIKE DONE ;DPR040… ;DPR040 3… MOVB #PR7, PS ;;; LOCK OUT INTERRUPTS ;DPR040 9… MOV R1, UISAR6 ;;; SET APR BIAS FOR TRANSFER ;DPR040)6…71$: DIR$ #LDRDP ;;; REQUEST I/O TRANSFER ;DPR040.… BCC 75$ ;;; IF CC LOAD SUCCEEDED ;DPR0404… WSIG$S ;;; WAIT FOR SIGNIFICANT EVENT ;DPR040$… BR 71$ ;;; RETRY I/O ;DPR040…75$: ;DPR040 +… CLRB PS ;;; ALLOW INTERRUPTS ;DPR040O… ;DPR040O-… ADD #1770, R1 ; UPDATE APR BIAS ;DPR040 5… ADD #177, LDRBK+2 ; UPDATE BLOCK NUMBER ;DPR040R… ADC LDRBK ;DPR040O… ;DPR040D0… TST R2 ; WAS IT THE LAST TRANSFER? ;DPR040#… BLT 80$ ; IF LT YES ;DPR040 … ;DPR040S2… TSTB IOSB ; WAS TRANSFER SUCCESSFUL? ;DPR0403… BPL 65$ ; IF PL YES - GO FOR NEXT ONE ;DPR040 …80$: ;DPR040 6… TST (SP)+ ; POP LOW-ORDER TRANSFER COUNT ;DPR040´; ;**-46UFµ; IF THIS IS AN I/D SPACE TASK, RESET PARAMETERS AND READ IN I SPACE@¶; SECTION WITH PARAMETERS FROM WINDOW ZERO IN THE TASK HEADER.·;¸¹ .IF DF U$$DASº2» TST ISIZE ;TASK USE I/D SPACE (AND NOT ALREADY¼ ;LOADED BOTH SPACES) ?1½ BPL 807$ ;IF PL EITHER NOT D SPACE OR ALREADY¾ ;ALL LOADEDS¿+À CALL $SWSTK,805$ ;SWITCH TO SYSTEM STATE Á& MOV #ISIZE,R0 ;POINT TO IMPURE AREA-à MOV P.REL(R4),KISAR6 ;POINT TO TASK REGIONR7Ç ADD T.OFF(R5),KISAR6 ;ADJUST TO HEADER AREA ;**-3IÊ ;**-2A+Ë CMPB #17,140000+H.IPS ;SUCCESSFUL READ ? Ì BNE 803$ ;IF NE NO+Í MOV H.NLUN+140000,R1 ;GET NUMBER OF LUNSÎ ASL R1 ;CONVERTÏ ASL R1 ;TO INDEX8Ð ADD #140000+H.NLUN+4,R1 ;POINT TO TASK I SPACE WINDOW4Ñ MOV W.BSIZ(R1),(R0)+ ;SAVE SIZE OF I SPACE WINDOW1Ò MOV W.BOFF(R1),(R0) ;AND OFFSET INTO PARTITIONC$Ó803$: RETURN ;BACK TO USER STATEÔ0Õ805$: TST ISIZE ;SHOULD WE TRY I SPACE READ ?Ö BLE 807$ ;IF LE, NOD*× MOV ISIZE,R1 ;GET SIZE OF USER I WINDOW'Ø ASH #6,R1 ;CONVERT TO SIZE IN BYTES4,Ù MOV R1,-(SP) ;SET UP FOR REGION LOAD CODE&Ú MOV IREL,R1 ;GET OFFSET TO I SPACE+Û ADD P.REL(R4),R1 ;SET UP RELOCATION BIASR-Ü MOV #LDRBK,R0 ;GET ADDRESS OF BLOCK NUMBER 6Ý MOVB T.LBN(R5),(R0)+ ;SET HIGH PART OF BLOCK NUMBERÞ CLRB (R0)+ ;CLEAR HIGH BITSF5ß MOV T.LBN+1(R5),(R0) ;S00‚yÔxtöt÷tø tþfDATAET LOW PART OF BLOCK NUMBER 4à SUB T.ISIZ(R5),(R0) ;ADJUST BACKWARDS TO START OFá SBC -(R0) ;I SPACE+â CLR ISIZE ;INDICATE FINAL PHASE OF LOADS,ã JMP 65$ ;GO LOAD USER DATA SPACE SECTIONä807$: ;REFERENCE LABEL(åæ .ENDC ; DF U$$DASçèé;V7ê; POST PROCESSING FOR CHECKPOINT WRITE (SYSTEM STATE)Të;EIì; HERE THE LOADER CHECKS THE I/O STATUS, DEALLOCATES THE TASK HEADER IFBIí; THE REGION WAS A TASK REGION, AND DETERMINES IF THE REGION PCB SHOULDFJî; BE ENTERED INTO THE PARTITION WAIT QUEUE. TASK REGIONS ALWAYS GO INTOIï; THE PARTITION WAIT QUEUE AND COMMONS GO IN IF P.PRI IS NONZERO (THEREIGð; IS A RESIDENT MAPPED TASK). FINALLY THE REGIONS MEMORY IS RELEASEDNGñ; ALLOWING $NXTSK TO ATTEMPT TO BRING IN THE HIGHEST PRIORITY WAITING ò; REGION.Só;Oô1õ81$: CALL $SWSTK,$LOADR ;SWITCH TO SYSTEM STATELö÷82$:øù;+ú; ** W A R N I N G **Sû;D;ü; SPM HOOKPOINT - LOADR CALLS DUMMY ROUTINE FOR HOOKPOINTHý;I+þ; DO NOT CHANGE THE INSTRUCTION FOLLOWINGTÿ; LABEL WITHOUT CHECKING SPM;-+ CALL @$SPV03 ;CALL HOOKABLE ENTRY POINTG& BIT #PS.OUT,(R3) ;REGION IN MEMORY? BNE 870$ ;IF NE NO& BIT #PS.COM,(R3) ;IS THIS A COMMON? BEQ 825$ ;IF EQ NO= BIT #P2.CPC,P.ST2(R4) ;IS THIS A CPCR CKP WRITE? ;DPR040O  BEQ 825$ ;IF EQ NO ;**-1  TSTB IOSB ;SUCCESSFUL WRITE?  BMI 90$ ;IF MI NOR1  BR 91$ ;OTHERWISE AVOID REAL CHECKPOINT WRITE  ;PARTITION DEALLOCATION6825$: BIT #PS.DEL,(R3) ;IS REGION MARKED FOR DELETE? BEQ 83$ ;IF EQ NOM0 TST P.ATT(R4) ;IS THERE ANYONE LEFT ATTACHED? BNE 83$ ;IF NE YES MOV R4,R1 ;COPY PCB POINTER# CALL $RLPR1 ;RELEASE ITS MEMORY( MOV R4,R0 ;COPY PCB POINTER56 CALLR $RLCPS ;RELEASE CHECKPOINT SPACE & DEA PCB'S$83$: TSTB IOSB ;SUCCESSFUL WRITE? BMI 90$ ;IF MI NOT .IF DF E$$XPR4 BIT #PS.AST,P.STAT(R4) ;REGION HAVE AST PENDING ?. BNE 84$ ;IF NE YES, P.SWSZ IS AST LISTHEAD ;NOT SWAP SIZE.,5  MOV P.SWSZ(R4),P.SIZE(R4) ;SET SIZE FROM SWAP SIZEN!84$: ;REFERENCE LABEL"# .ENDC$%-& BIS #PS.OUT,(R3) ;SET REGION OUT OF MEMORY (' CLR $LDPCB ;CLEAR LOADER PCB POINTER+( BIT #PS.COM,(R3) ;IS IT A COMMON REGION?/) BEQ 844$ ;IF EQ, NO - MUST BE A TASK REGIONB3* CLRB P.PRI(R4) ;RE-INITIALIZE PRIORITY OF COMMON -+ TSTB P.RMCT(R4) ;ANYONE MAPPED TO COMMON ?T/, BEQ 85$ ;IF EQ, NO - LEAVE PRIORITY AT ZERO- MOV R4,R1 ;COPY PCB POINTERS*. ADD #P.ATT,R1 ;POINT TO ATTACHMENT LIST/ ASSUME A.PCBL(0841$: MOV (R1),R1 ;GET FIRST/NEXT ADB 1 BEQ 843$ ;IF EQ, END OF LIST62 TSTB A.MPCT(R1) ;TASK MAPPED THRU THIS DESCRIPTOR ?03 BEQ 841$ ;IF EQ, NO - DON'T LOOK AT PRIORITY*4 MOV A.TCB(R1),R0 ;GET MAPPED TASK'S TCB<5 CMPB P.PRI(R4),T.PRI(R0) ;REGION PRIORITY ALREADY GREATER 6 ;THAN SOMEONE ELSES TASK ?+7 BHIS 841$ ;IF SO, DON'T UPDATE PRIORITY58 MOVB T.PRI(R0),P.PRI(R4) ;UPDATE REGION'S PRIORITYV(9 BR 841$ ;AND EXAMINE NEXT ATTACHMENT::843$: INCB P.PRI(R4) ;COMMON REGION'S PRIORITY IS ALWAYS2; BR 85$ ;ONE GREATER THAN HIGHEST PRIORITY TASK<844$: ;REFERENCE LABEL)=>? .IF DF A$$CNT@$A MOV P.TCB(R4),R0 ;GET TCB ADDRESS!B MOV KISAR6,-(SP) ;SAVE MAPPING)-C MOV T.ACN(R0),KISAR6 ;MAP ACCOUNTING BLOCK."D BEQ 845$ ;IF EQ, NO ACCOUNTING-E CMPB #BT.TAB,@#B.TYP+140000 ;IS THIS A TAB F BNE 845$ ;IF NE NO2G ADD #1,@#B.TCKP+2+140000 ;COUNT TASK CHECKPOINTH ADC @#B.TCKP+140000 ;)I845$: MOV (SP)+,KISAR6 ;RESTORE MAPPINGNJK .ENDC ;A$$CNTLM/N MOV P.HDR(R4),R0 ;GET ADDRESS OF TASK HEADERHOP .IF DF X$$HDRQ4R BEQ 85$ ;IF EQ EXTERNAL HEADER, DON'T DEALLOCATEST .ENDC ; DF X$$HDRU3V MOV H.HDLN(R0),R1 ;GET LENGTH OF HEADER IN BYTEST"W CALL $DEACB ;DEALLOCATE HEADER"X85$: MOV R4,R1 ;SET PCB ADDRESS+Y TSTB P.PRI(R1) ;DOES IT HAVE A PRIORITY? /Z BEQ 87$ ;IF EQ NO, DO NOT PUT IN WAIT QUEUE2;[ MOV P.MAIN(R1),R0 ;CALCULATE ADDR OF WAIT QUEUE LISTHEAD4\ ADD #P.WAIT,R0 ;;9] CALL $QINSP ;INSERT TASK BACK IN PARTI00‚yNxt´cÚµcÛ¶c�·c›’TION WAIT QUEUER'^87$: CALLR $RLPR1 ;RELEASE PARTITION_`870$: BR 110$ ;EXTEND BRANCH abc;E+d; CHECKPOINT WRITE FAILURE (SYSTEM STATE)He;Hf; ON CHECKPOINT WRITE FAILURES A DIAGNOSTIC MESSAGE BLOCK IS QUEUED TODg; TKTN AND THE STATUS OF THE REGION AND ANY MAPPED TASKS IS RESET,Hh; ALLOWING THE TASKS TO RUN AS IF THE CHECKPOINT WRITE REQUEST HAD NOTHi; OCCURED. ANY CHECKPOINT SPACE ALLOCATED FOR THE REGION IS RELEASED.j;Ak3l90$: MOV #T.NCWF,R0 ;SET CHECKPOINT WRITE FAILUREWm MOV R4,R5 ;COPY PCB ADDRESS;5m MOV $SAHPT,R4 ;PICK UP PTR TO OWN HEADER ;DPR042 -m MOV KISAR6,-(SP) ;SAVE MAPPING ;DPR042Y0m MOV $SAHDB,KISAR6 ;MAP OWN HEADER ;DPR042>o MOV H.LUN(R4),R4 ;PICK UP UCB ADDRESS OF WRITE ERROR ;**-1/o MOV (SP)+,KISAR6 ;RESTORE MAPPING ;DPR042p CALL $DVMSG ;OUTPUT MESSAGEI&q MOV R5,R4 ;RESET PCB ADDRESS IN R4rs;EJt; UNBLOCK MAPPED TASKS & FREE CHECKPOINT SPACE (SYSTEM STATE SUBROUTINE)u;MIv; THIS ROUTINE IS CALLED AFTER A REGION LOAD OPERATION OR AN UNSUCCESS-SHw; FULL CHECKPOINT WRITE OPERATION TO UNBLOCK ALL MAPPED TASKS AND FREEIx; ANY SPACE WHICH MAY BE ALLOCATED IN A CHECKPOINT FILE. IF THE REGION;>y; HAS HAD A LOAD FAILURE, THEN ALL MAPPED TASKS ARE ABORTED.z;1 {; INPUTS:+|;R}; R4=PCB ADDRESS. ~;4 ; OUTPUTS:€; �; R4 AND R5 PRESERVED.‚; ƒ=„91$: MOV P.ATT(R4),R2 ;POINT TO FIRST ATTACHMENT DESCRIPTOR … BEQ 94$ ;IF EQ THERE IS NONE@†92$: MOVB A.MPCT(R2),R1 ;PICK UP MAPPING COUNT THRU DESCRIPTOR"‡ BEQ 93$ ;IF EQ TASK NOT MAPPED4ˆ BIT #PS.LFR,P.STAT(R4) ;LOAD FAILURE THIS REGION?‰ BEQ 925$ ;IF EQ NO3Š MOV R2,-(SP) ;SAVE ATTACHMENT DESCRIPTOR ADDRESSR*‹ MOV A.TCB(R2),R0 ;POINT TO ATTACHED TCB(Œ DEC T.STAT(R0) ;REDUCE BLOCKING COUNT'� BPL 923$ ;IF PL TASK ALREADY ACTIVE/Ž BIC #TS.EXE,T.STAT(R0) ;ELSE SET TASK ACTIVE&� MOV T.PCB(R0),R1 ;POINT TO TASK PCB*� BIC #PS.FXD,P.STAT(R1) ;CLEAR FIXED BIT-‘ CALL $BILDS ;BUILD STACK AND PLACE IN ATLC6’ MOV (SP),R2 ;RESTORE ATTACHMENT DESCRIPTOR ADDRESS+“923$: CLRB A.MPCT(R2) ;ZERO MAPPING COUNTA(” MOV A.TCB(R2),R1 ;POINT TO MAPPED TCB8• BIT #T2.ABO,T.ST2(R1) ;TASK ALREADY MARKED FOR ABORT?– BNE 9241$ ;IF NE YES,— MOV #S.CLRF,R0 ;SET CODE FOR LOAD FAILURE+˜ BIT #PS.CKP,P.STAT(R4) ;CHECKPOINT READ?A™ BEQ 924$ ;IF EQ NO7š MOV #S.CCRF,R0 ;SET CODE FOR CHECKPOINT READ FAILURE ›924$: CALL $ABTSK ;ABORT TASK!œ9241$: MOV (SP)+,R2 ;RESTORE R2L � BR 93$ ;4ž925$: MOV A.TCB(R2),R0 ;POINT TO MAPPED TASK'S TCB(Ÿ DEC T.STAT(R0) ;REDUCE BLOCKING COUNT(  BNE 93$ ;IF NE TASK IS STILL BLOCKED¡ CALL $SETCR ;SCHEDULE TASK8¢93$: MOV (R2),R2 ;POINT TO NEXT ATTACHMENT DESCRIPTOR£ BNE 92$ ;IF NE THERE IS ONEV#¤94$: MOV R4,R2 ;COPY PCB POINTERE1¥ ADD #P.STAT,R2 ;POINT AT PARTITION STATUS WORDB'¦ BIT #PS.COM,(R2)+ ;IS THIS A COMMON?T§ BEQ 95$ ;IF EQ NOA.¨ BIT #P2.CPC,(R2) ;IS THIS A CPCR CKP WRITE?© BEQ 945$ ;IF EQ NO,ª BIC #P2.CPC,(R2) ;INDICATE CPCR COMPLETED« ASSUME P.ST2,*¬ BIC #PS.CKP,-(R2) ;CHECKPOINT COMPLETED­ MOV R4,R0 ;COPY PCB ADDRESSL3® CALLR $NXTSK ;REALLOCATE PARTITION IF NECESSARY(4¯945$: BIT #PS.LFR,-(R2) ;LOAD FAILURE THIS REGION?° BNE 96$ ;IF NE YES#±95$: MOV R4,R0 ;COPY PCB POINTERE*² CALLR $RLCPS ;RELEASE CHECKPOINT SPACE³96$: RETURN ;S´µ;+2¶; POST PROCESSING FOR REGION LOAD (SYSTEM STATE)"·; COPY HEADER & CHECK I/O STATUS¸;E¹; HERE THE LOADER SETS UP A COPY OF THE TASK HEADER IN THE POOL AND.º; DETERMINES IF A LOAD FAILURE HAS OCCURRED.»;P¼;½110$: BIC #PS.OUT!PS.LFR,(R3) ;CLEAR OUT AND LOAD FAILURE (¾ BIT #PS.COM,(R3) ;IS REGION A COMMON?¿ BEQ 112$ ;IF EQ NO)À JMP 143$ ;YES, SKIP HEADER PROCESSINGEÁ112$: ;REFERENCE LABEL . MOV P.REL(R4),KISAR6 ;MAP TO TASK PARTITIONÃÄ .IF DF X$$HDR Å-Æ TSTB T.HDLN(R5) ;TASK HAVE EXTERNAL HEADER 3Ç BEQ 113$ ;IF EQ, NO. CALCULATE OFFSET TO HEADER&È BIT #PS.CKP,(R3) ;CHECKPOINT READ ?1É BNE 114$ ;IF NE, YES - EXAMINE EXTRNAL HEADERI00‚"yÔxtöt÷tø tþfDATAÉ113$: ;DPR040"É .ENDC ; DF X$$HDR ;DPR040Ï ;**-5O5Ð ADD T.OFF(R5),KISAR6 ;ADD IN OFFSET TO TASK HEADERCÑ<Ô114$: MOV 140000+H.HDLN,R1 ;ASSUME SUCCESSFUL READ ;**-2+Õ CMPB #17,140000+H.IPS ;VALID TASK IMAGE?V1Ö BNE 115$ ;IF NE NO TREAT AS UNSUCCESSFUL READF× TSTB IOSB ;SUCCESSFUL READ?RØ BPL 120$ ;IF PL YESA,Ù115$: MOVB #-1,IOSB ;INDICATE LOAD FAILURE;Ú MOV #H.NLUN+2+W.BLGH+2,R1 ;SETE LENGTH OF MINIMUM HEADER1/Û CLR 140000+H.NLUN ;CLEAR NUMBER OF LUNS WORD$+Ü120$: MOV R1,2(SP) ;SAVE LENGTH OF HEADER ÝÞ .IF DF X$$HDRß/à TSTB T.HDLN(R5) ;TASK HAVE EXTERNAL HEADER ?K*á BEQ 125$ ;IF EQ NO, GO TRY TO ALLOCATE6â MOV #140000,R0 ;SET VIRTUAL ADDRESS OF XTRNL HEADER0ã BIT #PS.CKP,(R3) ;CHECKPOINT READ OPERATION ?8ä BNE 122$ ;IF NE YES, NO HEADER MANIPULATION REQUIREDå2æ CLR P.HDR(R4) ;INDICATE EXTERNAL HEADER FOR PCB;ç MOV P.REL(R4),HDRDB ;SET BLOCK NUMBER OF EXTERNAL HEADERMè BR 131$ ;RE-ENTER CODE FLOWLé-ê122$: JMP 1401$ ;STRETCH BRANCH FROM ABOVE)ëì .ENDC ; DF X$$HDRí6î125$: CALL $ALOCB ;ALLOCATE A BLOCK FOR TASK HEADER#ï BCC 130$ ;IF CC BLOCK ALLOCATEDO1ð BIS #PS.OUT,(R3) ;MARK REGION AS OUT OF MEMORYLð; ;DPR042Vð; NO NEED TO CHANGE FOLLOWING REFERENCE TO $HEADR TO SUPPORT EXTERNAL HEADER ;DPR042ð; ;DPR042*ñ MOV @$HEADR,R0 ;GET SAVED STACK POINTER'ò MOV #81$,4(R0) ;ALTER RETURN ADDRESS +ó CALLR $TKWSE ;WAITFOR SIGNIFICANT EVENT 4ô130$: MOV R0,P.HDR(R4) ;SAVE ADDRESS OF NEW HEADER-õ131$: MOV #140000,R2 ;SET APR6 ADDRESS BIAS6ö MOV R0,R1 ;CALC RELATIVE HEADER GUARD WORD POINTER÷ TST -(R1) ;Fø MOV R1,H.GARD(R2) ;:ù MOV R1,H.WND(R2) ;CALCULATE NUMBER OF WINDOW BLOCKS PTR3ú MOV H.NLUN(R2),R1 ;CALCULATE NUMBER OF LUN WORDS û ASL R1 ; ü ASL R1 ;'ý ADD #H.NLUN+4,R1 ;FINISH CALCULATIONþ ADD R1,H.WND(R2) ;V3ÿ MOV 2(SP),R1 ;RETRIEVE LENGTH OF HEADER IN BYTESR* MOV R1,H.HDLN(R2) ;SET LENGTH OF HEADER3 ADD R1,H.GARD(R2) ;FINISH GUARD WORD CALCULATION  .IF DF X$$HDR .IF DF F$$MAP ;CAS021M ;CAS021IE CLR H.FMAP(R2) ;ASSUME TASK DOES NOT HAVE FAST MAP ENABLED ;CAS021 ;CAS021C" .ENDC ; DF F$$MAP ;CAS021 ;CAS0211' .IF DF C$$DFB & C$$RTB ;KLN028R ;KLN028E CLR H.LUTE(R2) ;ASSUME TASK DOES NOT HAVE RUN TIME BINDING ;KLN0282 ;KLN028G* .ENDC ; DF C$$DFB & C$$RTB ;KLN028 ;KLN028R- TST P.HDR(R4) ;TASK HAVE EXTERNAL HEADER ?L BNE 139$ ;IF NE NO, GO COPY! MOV R4,-(SP) ;SAVE PCB ADDRESS/ MOVB T.HDLN(R5),R0 ;GET SIZE OF TOTAL HEADERK   .IF DF F$$MAP ;DPR0402  ;**-1S5  BIT #T4.FMP,T.ST4(R5) ;TASK HAVE FAST MAP ENABLED?C  BEQ 133$ ;IF EQ NO: SUB #H$$FMX,R0 ;SUBTRACT OUT SIZE OF FAST MAP EXTENSION133$: ;DPR040" .ENDC ; DF F$$MAP ;DPR040 ;**-3' .IF DF C$$DFB & C$$RTB ;KLN0288 ;KLN028R? BIT #T4.DFB,T.ST4(R5) ;TASK HAVE DEFERRED BINDING? ;KLN028F" BEQ 135$ ;IF EQ NO ;KLN028 ;KLN028M< BIT #F5.RTB,$FMSK5 ;TASK HAVE RUN TIME BINDING? ;KLN028" BEQ 135$ ;IF EQ NO ;KLN028 ;KLN028T> MOV H.NLUN(R2),R1 ;CALCULATE SIZE OF LUT EXTENSION ;KLN028 ASL R1 ; ;KLN028  ASL R1 ; ;KLN028I8 ADD #77,R1 ;ROUND TO NEAREST 32. WORD BLOCK ;KLN050 ASH #-6,R1 ; ;KLN028.+ MOV R1,H.LUTE(R2) ;SAVE SIZE ;KLN028 : SUB R1,R0 ;SUBTRACT OUT SIZE OF LUT EXTENSION ;KLN028135$: ;KLN028* .ENDC ; DF C$$DFB & C$$RTB ;KLN028 ;KLN028B ASH #6,R0 ;CONVERT TO BYTESN8 MOV P.REL(R4),R1 ;SET APR DISPLACEMENT OF DESTINATION* MOV R1,R3 ;COPY TO SOURCE DISPLACEMENT* ADD T.OFF(R5),R1 ;CALCULATE SOURCE BIAS* MOV #120000,R2 ;SET SOURCE DISPLACEMENT/ MOV #140000,R4 ;SET DESTINATION DISPLACEMENT  CALL $BLXIO ;COPY HEADER$ MOV (SP)+,R4 ;RESTORE PCB ADDRESS MOV R4,R3 ;RESTORE POINTER+ ADD #P.STAT,R3 ;TO PARTITION STATUS WORD800‚*yNxt´cÚµcÛ¶c�·c›’+ MOV HDRDB,KISAR6 ;MAP TO EXTERNAL HEADERD0 MOV #140000,R0 ;SET VIRTUAL ADDRESS OF HEADER .IF DF F$$MAP ;CAS021V ;CAS021R=# BIT #T4.FMP,T.ST4(R5) ;TASK HAVE FAST MAP ENABLED? ;**-3P## BEQ 1371$ ;IF EQ NO ;KLN028A<% MOVB T.HDLN(R5),R1 ;GET LENGTH OF HEADER IN BYTES ;**-1%& ASH #6,R1 ;CONVERT TO BYTE OFFSETC6' ADD #140000-<64.*H$$FMX>,R1 ;POINT TO FAST MAP AREA2( MOV R1,H.FMAP(R0) ;SET ADDRESS OF FAST MAP AREA5) MOV #<<+15.>/16.>,R2 ;GET NUMBER OFR* ;PASSES THROUGH LOOP+137$: .REPT 16.0,, CLR (R1)+ ;CLEAR A WORD OF FAST MAP AREA- .ENDR. / SOB R2,137$ ;LOOP UNTIL DONE/1371$: ;KLN028;"/ .ENDC ; DF F$$MAP ;KLN0282 ;**-2 '2 .IF DF C$$DFB & C$$RTB ;KLN028 2 ;KLN028 ?2 BIT #T4.DFB,T.ST4(R5) ;TASK HAVE DEFERRED BINDING? ;KLN028#"2 BEQ 138$ ;IF EQ NO ;KLN0282 ;KLN028,<2 BIT #F5.RTB,$FMSK5 ;TASK HAVE RUN TIME BINDING? ;KLN028"2 BEQ 138$ ;IF EQ NO ;KLN0282 ;KLN028GF2 MOVB T.HDLN(R5),R1 ;GET LENGTH OF HEADER IN 32. WORD BLOCKS ;KLN0282 ;KLN028B2 .IF DF F$$MAP ;KLN02812 ;KLN028?2 BIT #T4.FMP, T.ST4(R5) ; TASK HAVE FAST MAP ENABLED ;KLN028 $2 BEQ 1375$ ; IF EQ NO ;KLN028<2 SUB #H$$FMX, R1 ; TAKE FAST MAPPING INTO ACCOUNT ;KLN02821375$: ;KLN0281"2 .ENDC ; DF F$$MAP ;KLN0282 ;KLN028#-2 TST H.LUTE(R0) ;ARE THERE LUNS? ;KLN057L'2 BEQ 138$ ;IF EQ NO LUNS ;KLN057B2 SUB H.LUTE(R0), R1 ;SUBTRACT OUT SIZE OF LUT EXTENSION ;KLN057.2 ASH #6, R1 ;GET OFFSET IN BYTES ;KLN02882 ADD #MAP6, R1 ;GET ADDRESS OF LUT EXTENSION ;KLN02832 MOV R1,H.LUTE(R0) ;STORE IT IN HEADER ;KLN028 92 ADD #H.NLUN,R0 ;GET ADDRESS OF LUT IN HEADER ;KLN028F62 MOV (R0)+,R2 ;GET NUMBER OF WORDS TO COPY ;KLN0282 ASL R2 ; ;KLN028N"2 MOV R2,-(SP) ;SAVE ;KLN028I21377$: MOV (R0)+,(R1)+ ;COPY THE HEADER LUT INTO THE EXTENSION ;KLN028 +2 SOB R2,1377$ ;LOOP UNTIL DONE ;KLN02802 ;KLN028I=2 MOV #MAP6+H.NLUN+2,R1 ;POINT TO HEADER LUT AGAIN ;KLN028E+2 MOV (SP)+,R2 ;GET SIZE OF LUT ;KLN028F421378$: CLR (R1)+ ;CLEAR OUT HEADER LUT ;KLN028+2 SOB R2,1378$ ;LOOP UNTIL DONE ;KLN028G2 ;KLN028HA2138$: MOV #MAP6, R0 ;POINT BACK TO BEGINNING OF HEADER ;KLN028L2 ;KLN028 *2 .ENDC ; DF C$$DFB & C$$RTB ;KLN0282 ;KLN028+3 BR 14000$ ;RE-ENTER CODE45 .ENDC ; DF X$$HDR6(7139$: ASR R1 ;CONVERT LENGTH TO WORDS78140$: MOV (R2)+,(R0)+ ;MOVE TASK HEADER TO CORE BLOCKO#9 DEC R1 ;ANY MORE WORDS TO MOVE?(: BGT 140$ ;IF GT YES /; MOV P.HDR(R4),R0 ;GET ADDRESS OF TASK HEADER '<14000$: TSTB IOSB ;SUCCESSFUL READ ?I= BMI 1421$ ;IF MI NO &> BIT #PS.CKP,(R3) ;CHECKPOINT READ?)? BNE 1401$ ;IF NE YES, DON'T TOUCH LUT@A .IF DF S$$LIBB:C CLR H.SMAP(R0) ;INITIALIZE SUPERVISOR AND DATA MAP MASKDE .ENDC ; DF S$$LIBF@F CALL REBIND ;BIND LUT AND WINDOWS TO EXEC ADDRESSES ;LBM061&O1401$: ;REFERENCE SYMBOL ;**-8PQR .IF DF M$$PROS/T MOV H.WND(R0),R1 ;POINT TO NUMBER OF WINDOWSF)U MOV (R1)+,-(SP) ;GET NUMBER OF WINDOWSO.V141$: TST W.BPCB(R1) ;IS THIS WINDOW MAPPED?W BEQ 142$ ;NO IF EQ:X MOV W.BATT(R1),R2 ;GET ADDRESS OF ATTACHMENT DESCRIPTOR Y BEQ 142$ ;IF EQ NOT ATTACHED3Z BITB #AS.RBP,A.STAT(R2) ;SHOULD BYPASS BE RESET?L[ BEQ 1411$ ;NO IF EQA/\ BIC #100000,W.BLPD(R1) ;RESET BYPASS IN LPDRI&] BICB #AS.RBP,A.STAT(R2) ;RESET FLAG7^1411$: BITB #AS.SBP,A.STAT(R2) ;SHOULD BYPASS BE SET?_ BEQ 142$ ;NO IF EQ-` BIS #100000,W.BLPD(R1) ;SET BYPASS IN LPDRW&a BICB #AS.SBP,A.STAT(R2) ;RESET FLAG,b142$: ADD #W.BLGH,R1 ;POINT TO NEXT WINDOWc DEC (SP) ;ANY WINDOWS LEFT?d BGT 141$ ;YES IF GT e TST (SP)+ ;CLEAN THE STACKfg .ENDChij1421$: ;REFERENCE SYMBOL.klm .IF DF S$$WPCn6o MOVB $SWPR,H.SPRI(R0) ;INITIALIZE SWAPPING PRIORITYpq .ENDCrs5t MOV H.WND(R0),R1 ;POI00‚2yÔxtöt÷tø tþfDATANT TO NUMBER OF WINDOW BLOCKST.u CALL $MAPTK ;MAP FIRST TASK ADDRESS WINDOWv(w CMPB #17,H.IPS(R0) ;VALID TASK IMAGE?2x BNE 1431$ ;IF NE NO TREAT AS UNSUCCESSFUL READy143$: TSTB IOSB ;READ ERROR?1z BPL 1439$ ;IF PL NO{|; &}; REGION LOAD FAILURE (SYSTEM STATE)~; J; THE FIXED BIT IS CLEARED AND PS.LFR IS SET TO DENOTE THE LOAD FAILURE.F€; IF THE REGION IS A TASK REGION, THEN THOSE HEADER FIELDS WHICH AREE�; REQUIRED TO GET THE TASK THROUGH THE ABORT PROCESS ARE FABRICATEDI0‚; HERE. (ALL MAPPED TASKS ARE ABORTED LATER.)ƒ;R„/…1431$: BIS #PS.LFR,(R3) ;SIGNIFY LOAD FAILUREL+† BIT #PS.COM,(R3) ;IS IT A COMMON REGION? ‡ BNE 1439$ ;IF NE YES'ˆ MOV #77406,(R1) ;SET ACCESS LAST PDR$<‰ MOV #UISDR0&377+<1*256.>,-(R1) ;SET FIRST PDR AND # PDR'S;Š MOV H.WND(R0),-(SP) ;GET ADDR OF NUMBER OF WINDOW BLOCKSO+‹ MOV #1,@(SP)+ ;INDICATE ONE WINDOW BLOCKTŒ� .IF DF, U$$DASHŽ=� BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH SEPARATE I/D SPACE?O� BEQ 1435$ ;IF EQ, NO;‘ MOV (R1),-20(R1) ;COPY FIRST PDR AND # PDR'S TO WINDOW 0/’ MOV 2(R1),-16(R1) ;COPY LAST PDR TO WINDOW 0“1435$: ;REFERENCE LABEL” .ENDC ; DF U$$DAS•9– CLR H.FPSA(R0) ;CLEAR FLOATING POINT SAVE AREA POINTER3— MOV R0,H.GARD(R0) ;INITIALIZE GUARD WORD POINTERP˜ ADD #H.TKVL+2,H.GARD(R0) ;E™š; 2›; POST PROCESSING FOR REGION LOAD (SYSTEM STATE)$œ; INITIAL TASK LOAD INITIALIZATION�;Jž; FOR THE INITIAL LOAD OF A TASK REGION, REQUEST OR FIX, THE LOADER MUSTDŸ; ATTACH THE TASK TO ANY REGIONS WHICH IT HAS BEEN LINKED TO. THEI ; TASK'S ATTACHMENT QUEUE MAY NOT BE EMPTY DUE TO THE SEND BY REFERENCEFH¡; DIRECTIVE. IF THE TASK IS NOT BEING FIXED, $BILDS IS CALLED TO INIT9¢; ITS STACK AND PLACE THE TASK IN THE ACTIVE TASK LIST.G£;W¤"¥1439$: BIT #PS.COM,(R3) ;COMMON?¦ BNE 150$ ;IF NE, YES§¨ .IF DF, U$$DASA©'ª CALL CALDMK ;CALCULATE D SPACE MASKA«¬ .ENDC ; DF U$$DAS­%® BIT #PS.CKP,(R3) ;CHECKPOINT READ? ¯ BNE 150$ ;IF NE YES 5° MOV H.WND(R0),R3 ;POINT TO NUMBER OF WINDOW BLOCKS $± MOV #LDRBK,R1 ;POINT TO SAVE AREA0² MOV (R3)+,(R1)+ ;SAVE NUMBER OF WINDOW BLOCKS³ MOV R5,R0 ;COPY TCB POINTERB9´ ADD #T.ATT,R0 ;POINT TO ATTACHMENT DESCRIPTOR LISTHEADC&µ MOV R0,-(SP) ;SAVE LISTHEAD POINTER,¶ MOV (R0)+,(R1)+ ;SAVE FIRST LISTHEAD WORD·¸ .IF DF U$$DAS¹,º MOV (R0),(R1)+ ;SAVE SECOND LISTHEAD WORD»¼ .IFF ; DF U$$DAS½+¾ MOV (R0),(R1) ;SAVE SECOND LISTHEAD WORDE¿À .IFTF ; DF U$$DASÁ4 MOV (SP)+,(R0) ;REINITIALIZE SECOND LISTHEAD WORDÃÄ .IFT ; DF U$$DASBÅ/Æ CLR (R1) ;INIT TEMPORARY TO ZERO (INDICATESMÇ ;NOT D-SPACE TASK LATER,2È CLR MUDPT ;CLEAR POINTER TO D WINDOW IN HEADERÉ ;OF MULTI-USER I/D TASK)Ê BIT #T4.DSP,T.ST4(R5) ;IS IT D SPACE ?MË BEQ 145$ ;IF EQ NO/Ì MOV R3,(R1) ;SAVE POINTER TO I SPACE WINDOWV*Í ADD #W.BLGH,R3 ;POINT TO D SPACE WINDOW(Î DEC -6(R1) ;COUNT AS ONE LESS WINDOW3Ï BIT #T4.MUT,T.ST4(R5) ;IS IT A MULTI-USER TASK ?SÐ BEQ 145$ ;IF EQ NO<Ñ MOV #<2*W.BLGH>,MUDPT ;INIT OFFSET FROM D SPACE WINDOW TOÒ ;D SPACE RO WINDOW,Ó ADD R3,MUDPT ;FORM REAL ADDRESS OF WINDOWÔÕ .IFTF ; DF U$$DASÖ7×145$: CLR R1 ;CLR NEXT ATTACHMENT DESCRIPTOR ADDRESSI2Ø MOV (R3),R2 ;PICK UP NEXT PCB ADDRESS (W.BPCB)!Ù BEQ 148$ ;IF EQ THERE IS NONE,ÚÛ .IFT ; DF U$$DASSÜ8Ý CMP R3,MUDPT ;IS THIS RO D WINDOW IN AN I/D MU TASK ?Þ BNE 1455$ ;IF NE NOL4ß MOV W.BATT-W.BLGH(R3),R1 ;GET ADDRESS OF RO I ADB/à MOV R1,W.BATT(R3) ;SET ADDRESS OF ATTACHMENTBá ;DESCRIPTORF-â BR 1481$ ;AND GO SET MAPPING COUNT IN ADBIã"ã .ENDC ; DF U$$DAS ;DPR040å ;**-1.8æ1455$: MOV #AS.RED,R4 ;SET FOR ATTACH WITH READ ACCESS/ç BIT #4,W.BLPD(R3) ;MAPPED WITH WRITE ACCESS?Xè BEQ 146$ ;IF EQ NO.é BIS #AS.WRT,R4 ;ADD WRITE ACCESS FOR ATTACH&ê146$: CALL $CRATT ;ATTACH TO REGIONë BCC 148$ ;IF CC SUCCESSFULë; ;DPR042Vë; NO NEED TO CHANGE FOLLOWING REFERENCE TO $HEADR TO SUPPORT EXTERNAL HEADER ;DPR042ë; 00‚:yNxt´cÚµcÛ¶c�·c›’ ;DPR042/ì MOV @$HEADR,R0 ;RETRIEVE SAVED STACK POINTERP0í MOV R3,(R0)+ ;SAVE WINDOW BLOCK POINTER AS R4'î MOV R5,(R0)+ ;SAVE TCB ADDRESS AS R5V(ï MOV #147$,(R0) ;MODIFY RETURN ADDRESS,ð CALLR $TKWSE ;WAIT FOR SIGNIFICANT EVENT2ñ147$: CALL $SWSTK,$LOADR ;SWITCH TO SYSTEM STATE+ò MOV R4,R3 ;RESTORE WINDOW BLOCK POINTERT!ó BR 145$ ;REATTEMPT THE ATTACH;?ô148$: MOV R1,W.BATT(R3) ;SET ADDRESS OF ATTACHMENT DESCRIPTORL&õ BEQ 1485$ ;IF EQ WINDOW NOT MAPPED(ö MOV T.PCB(R5),R4 ;RESTORE PCB ADDRESS8÷ CMP A.PCB(R1),R4 ;IS ATTACHED REGION THE TASK REGION?/ø BEQ 1481$ ;IF EQ YES, DON'T ACCESS IT AGAINVù MOV R5,R0 ;COPY TCB ADDRESSVú MOV R3,-(SP) ;SAVE R3ûüý .IF DF M$$PROþÿ MOV R1,-(SP) ;SAVE R1$ MOV A.PCB(R1),R1 ;GET PCB ADDRESS3 CALL $SETBP ;SET UP CACHE BYPASS AS APPROPRIATEL MOV (SP)+,R1 ;RESTORE R1A .ENDC6 INCB A.MPCT(R1) ;INIT MAPPING COUNT THIS DESCRIPTOR- MOV A.PCB(R1),R1 ;POINT TO ATTACHED REGION%  CALL $ACCRG ;ACCESS COMMON REGIONS  MOV (SP)+,R3 ;RESTORE R3A  BR 1485$ ;< 1481$: INCB A.MPCT(R1) ;INIT MAPPING COUNT THIS DESCRIPTOR3 1485$: ADD #W.BLGH,R3 ;POINT TO NEXT WINDOW BLOCKS+ DEC LDRBK ;ANY MORE WINDOWS TO PROCESS?R BGT 145$ ;IF GT YESA3 MOV LDRBK+2,@T.ATT+2(R5) ;ADD ON OLD DESCRIPTORS  BEQ 149$ ;IF EQ IT WAS NULLM= MOV LDRBK+4,T.ATT+2(R5) ;POINT TO LAST ORIGINAL DESCRIPTORR149$: ;REFERENCE LABELEI; FOR AN I/D TASK, WE SKIPPED THE I SPACE WINDOW IN THE PRECEDING CODE.SI; WE WILL NOW FIX UP THE I SPACE WINDOW TO POINT TO THE SAME ATTACHMENTCN; DESCRIPTOR AS THE D SPACE WINDOW. SINCE THIS MAPPING IS STATIC, IT DOESN'TM; MATTER THAT THE MAPPING COUNT IN THE ADB WILL BE 1 INSTEAD OF 2, AND THIS5I; SIMPLIFIES THE MANAGEMENT OF T.STAT DURING THE TASK REQUEST SEQUENCE.Q .IF DF U$$DAS ;DPR040R ;**-1O5 MOV LDRBK+6,R0 ;GET POINTER TO TASK I SPACE WINDOW ' BEQ 1495$ ;IF EQ NOT A D SPACE TASKE> MOV W.BATT+W.BLGH(R0),W.BATT(R0) ;POINT TASK I SPACE WINDOW-  ;TO SAME ATTACHEMENT DESCRIPTOR AS TASKT! ;D SPACE WINDOWR"# .ENDC ; DF U$$DAS$5%1495$: BIT #PS.FXD,P.STAT(R4) ;REGION BEING FIXED ? & BNE 170$ ;IF NE YESW&' MOV R5,R0 ;SET ADDRESS OF TASK TCB5( CALL $BILDS ;BUILD A STACK FOR TASK JUST STARTINGS)*;E2+; POST PROCESSING FOR REGION LOAD (SYSTEM STATE),; FINAL PROCESSING-; 3.; HERE THE LOADER PERFORMS THE FOLLOWING ACTIONS:I/;N10; 1. UNBLOCK ALL TASKS MAPPED TO THE REGION.(H1; 2. FREE UP ANY DYNAMIC CHECKPOINT SPACE FROM WHICH THE REGION MAY2; HAVE BEEN READ.WB3; 3. IF INSTALLED COMMON IS ONLY TO BE CHECKPOINTED TO SYSTEM=4; CHECKPOINT FILE (PS.NWB=1), DEALLOCATE DISK PCB AND0*5; CONVERT COMMON TO A PLAS REGION.A6; 4. CHECK FOR A PENDING CHECKPOINT REQUEST AND INITIATE THEN57; CHECKPOINT OPERATION IF THERE IS A REQUEST.98; 5. DECLARE RECEIVE AST'S FOR TASKS'S WITH NONEMPTY9; RECEIVE QUEUES. :; ;; INPUTS: <;N=; R4=PCB ADDRESS OF REGION.I$>; R5=TCB ADDRESS (IF TASK REGION).?;Y @; OUTPUTS:A;D5B; R4 IS PRESERVED IF COMMON REGION OR LOAD FAILURE.IC; R5 IS PRESERVED.D;HE-F150$: CALL 170$ ;SERVICE REGION LOAD ASTS,G ;DEALLOCATE CKP SPACE H ;AND UNBLOCK TASKS5I MOV R4,R3 ;RECALCULATE ADDRESS OF PCB STATUS WORDJ ADD #P.STAT,R3 ;O.K BIT #PS.LFR,(R3) ;LOAD FAILURE THIS REGION?L BEQ 155$ ;IF EQ NO+M BIT #PS.COM,(R3) ;IS IT A COMMON REGION?S*N BEQ 155$ ;IF EQ NO, DO NOT FREE MEMORY1O BIC #PS.CKR,(R3) ;CLEAR CHECKPOINT REQUEST BITN.P BIS #PS.OUT,(R3) ;MARK REGION OUT OF MEMORY&Q MOV R4,R1 ;COPY REGION PCB ADDRESS)R CALLR $RLPR1 ;RELEASE REGION'S MEMORY1.S155$: BIC #PS.CKP,(R3) ;CLEAR CHECKPOINT BIT7T BIT #PS.NWB,(R3) ;COMMON CHECKPOINT TO SYSTEM FILE ?R1U BEQ 157$ ;IF EQ, NO. CHECKPOINTS TO TASK FILET,V BIC #PS.NWB,(R3) ;DON'T NEED THIS ANYMORE4W MOV P.DPCB-P.STAT(R3),R0 ;GET ADDRESS OF DISK PCB*X CLR P.DPCB-P.STAT(R3) ;AND ZERO POINTER'Y MOV #P.DLGH,R1 ;G00‚ByÔxtöt÷tø tþfDATAET SIZE OF DISK PCBR!Z MOV R3,-(SP) ;SAVE PCB POINTERN$[ CALL $DEACB ;DEALLOCATE DISK PCB#\ MOV (SP)+,R3 ;RESTORE COMMON PCBN0]157$: BIT #PS.CKR,(R3) ;CHECKPOINT REQUESTED ?^ BEQ 169$ ;IF EQ NO2_ BIC #PS.CKR,(R3) ;CLEAR CHECKPOINT REQUEST FLAG!` MOV R4,R1 ;SET ADDRESS OF PCBR%a CALLR $ICHKP ;INITIATE CHECKPOINTTbb169$: RETURN ;DPR040b ;DPR040EAg170$: BIT #PS.AST,P.STAT(R4) ;REGION LOAD AST PENDING ? ;**-4Ch BEQ 180$ ;IF EQ NOi6j MOV P.STAT(R4),-(SP) ;SAVE CURRENT STATUS OF REGION7k BIC #^C,(SP) ;CLEAR ALL BUT OUT & CKPK.l BIC (SP),P.STAT(R4) ;CLEAR THOSE FOR REGION"m MOV R5,-(SP) ;SAVE NON-VOLATILEn MOV R4,-(SP) ;REGISTERS2o MOV P.SWSZ(R4),R0 ;POINT TO FIRST (OR ONLY) AST%p MOV (R0),P.SWSZ(R4) ;CLOSE UP LISTR#q BNE 175$ ;IF NE STILL MORE LEFTN0r BIC #PS.AST,P.STAT(R4) ;INDICATE NO ASTS LEFT7s MOV P.SIZE(R4),P.SWSZ(R4) ;RESET SWAP SIZE FROM SIZES)t175$: CALL $DSPKA ;DISPATCH KERNEL ASTO3u DEC T.STAT(R0) ;UNBLOCK THE TASK FOR THIS REGION !v BNE 177$ ;IF NE STILL BLOCKEDS1w CALL $SETCR ;SET CONDITIONAL SCHEDULE REQUEST),x177$: MOV (SP),R1 ;GET REGION PCB ADDRESS0y CALL $DEARG ;DEACCESS REGION ON TASKS BEHALF"z MOV (SP)+,R4 ;RESTORE REGISTERS{ MOV (SP)+,R5 ;06| BIS (SP)+,P.STAT(R4) ;RESET OUT/CKP STATUS TO PRIOR}~ BR 170$ ;AND GO AGAINA!€180$: CALLR 91$ ;UNBLOCK TASKSS��; ;LBM061K�; REBIND:: - bind installed tasks to exec database at load time ;LBM061A�; ;LBM061I�; inserts correct UCB addresses into LUT from device list and ;LBM061TP�; PCB addresses into Task Address Window Blocks from task PCB vector. ;LBM061�; ;LBM061K�; replaces LOADR routine SCHDR for tasks using deferred binding ;LBM0610N�; (note that existing SCHDR function must be preserved and used for ;LBM0616�; tasks which override deferred binding) ;LBM061�; ;LBM0613�; created 5-Feb-1987 by L.B. McCulley ;LBM061 �; ;LBM061�; INPUTS: ;LBM061e�; ;LBM061%�; R0 = HEADER ADDRESS ;LBM061M"�; R5 = TCB ADDRESS ;LBM061�; ;LBM061�; OUTPUTS: ;LBM061�; ;LBM061K�; IOSB MAY BE SET TO -1 IF SCHDR IS CALLED AND HEADER IS INVALID ;LBM061�; ;LBM061L�; TASK LUT AND WINDOW BLOCKS (W.BPCB OFFSET) CORRECTLY INITIALIZED ;LBM061*�; FOR THIS EXEC'S DATABASE. ;LBM061�; ;LBM061"�; DESTROYS R1, R2 ;LBM061A�; PRESERVES R0, R3, R4, R5 (ALL MEANINGFUL TO CALLER) ;LBM061 �; ;LBM061� ;LBM061 �REBIND: ;LBM061-� SAVNR ; COROUTINE SAVES R4/R5 ;LBM061U@� MOV R3,-(SP) ; SAVE OTHER REGISTERS NEEDED BY CALLER ;LBM061� MOV R0,-(SP) ;LBM061A� ;LBM0616� .IF DF C$$DFB ;LBM061K� ;LBM061S?� BIT #F5.DFB,$FMSK5 ; SYSTEM USING DEFERRED BINDING? ;LBM061'+� BEQ 2$ ; NO, GO CHECK HEADER ;LBM0611� ;LBM061 D� BIT #T4.DFB,T.ST4(R5) ; THIS TASK USING DEFERRED BINDING? ;LBM061-� BNE 5$ ; YES, GO DO THE BINDING ;LBM061 �2$: ;LBM061"� .ENDC ; DF C$$DFB ;LBM061� ;LBM0616/� TST $FMSK4 ; LUT SCAN DISABLED ? ;LBM061D5� BMI 200$ ; YES, SO SKIP IT, JUST RETURN ;LBM061 <� CALL SCHDR ; GO CHECK HEADER ALREADY BOUND OKAY ;LBM0615� BR 200$ ; RETURN AFTER REGISTER RESTORES ;LBM061R� ;LBM061� .IF DF C$$DFB ;LBM061 � ;LBM061 "�5$: .IF DF C$$RTB ;LBM061� ;LBM061FG� BIT #F5.RTB, $FMSK5 ; SHOULD LUN BINDING BE FURTHER DEFERED?;LBM061=� BNE 100$ ; IF NE, YEP - JUST BIND WINDOWS FOR NOW;LBM061 � ;LBM061T"� .ENDC ; DF C$$RTB ;LBM061� ;LBM061 (� MOV R0,R3 ; R0 -> HEADER ;LBM061)� ADD #H.NLUN,R3 ; R3 -> LUT ;LBM061O6� MOV (R3)+,R2 ; R2 = NUMBER OF LUT ENTRIES ;LBM061-� BEQ 100$ ; NONE, GO DO WINDOWS ;LBM061D�; ;LBM061,�; GET NEXT LUN AND ASSIGN IT ;LBM061�; ;LBM061�10$: ;LBM00‚JyNxt´cÚµcÛ¶c�·c›’06153� CMP (R3),#"OV ; OVERLAY PSUEDO DEVICE? ;LBM061?� BNE 12$ ; NO ;LBM061,N� MOV T.LDV(R5),(R3)+ ; YES, GET TASK LOAD DEVICE UCB ADDRESS FROM TCB;LBM061� BR 80$ ; ;LBM061 � ;LBM061R3�12$: MOV $DEVHD,R4 ; FIND DEVICE TABLE ;LBM061;5�15$: CMP D.NAM(R4),(R3) ; FOUND IT YET? ;LBM061O*� BEQ 20$ ; YES, NOW SET UNIT ;LBM0611�17$: MOV D.LNK(R4),R4 ; NEXT DEVICE ;LBM084$� BNE 15$ ; MORE TO GO ;LBM0612� ; NO MORE DEVICES, CAN'T ASSIGN LUN ;LBM061D� CLR (R3)+ ; COULDN'T FIND MATCHING DEVICE, DON'T BIND IT ;LBM061� BR 80$ ;LBM061�20$: ;LBM061 �; ;LBM061!�; at this point ;LBM061;)�; R2=remaining LUT entries ;LBM061:#�; R3->unit # in LUT ;LBM061 �; R4->dcb ;LBM061)�; ;LBM0619� MOVB 2(R3),R1 ; RETRIEVE DESIRED UNIT NUMBER ;LBM061J� CMPB R1,D.UNIT(R4) ; CHECK FOR UNIT NUMBER IN RANGE OF THIS DCB ;LBM084/� BLT 17$ ; TOO LOW, TRY OTHER DCBS ;LBM084 %� CMPB R1,D.UNIT+1(R4) ;LBM084F0� BGT 17$ ; TOO HIGH, TRY OTHER DCBS ;LBM084C� MOVB D.UNIT(R4),R0 ; EXTRACT FIRST UNIT NUMBER FROM DCB ;LBM0612� SUB R0,R1 ; GET RELATIVE UNIT NUMBER ;LBM0612� BEQ 22$ ; OPTIMIZATION FOR FIRST UCB ;LBM0610� MOV D.UCBL(R4),R0 ; GET UCB LENGTH ;LBM061,� CALL $MUL ; GET OFFSET TO UCB ;LBM061>�22$: ADD D.UCB(R4),R1 ; GET ADDRESS OF DESIRED UCB ;LBM0612� MOV R1,(R3)+ ; STORE UCB IN TASK LUN ;LBM061� ;LBM061DC�80$: CLR (R3)+ ; CLEAR LUT FILES-11 WINDOW BLOCK POINTER ;LBM061 � ;LBM061C+� DEC R2 ; ALL UNITS ASSIGNED? ;LBM061 (� BNE 10$ ; NO, DO NEXT ONE ;LBM061�; ;LBM061%�; BIND WINDOW BLOCKS ;LBM061 �; ;LBM061�100$: ;LBM0618� MOV (SP),R0 ; RESTORE R0 POINTER TO HEADER ;LBM061;� MOV H.WND(R0), R1 ; R1 => WINDOW BLOCK STORAGE ;LBM061R2� MOV (R1)+, R2 ; R2 = # WINDOW BLOCKS ;LBM061� ;LBM061;G� MOV T.PCB(R5),W.BPCB(R1) ; SET TASK REGION PCB INTO WINDOW 0 ;LBM061O)� DEC R2 ; ONLY TASK REGION? ;LBM0616+� BEQ 200$ ; YEP, MUST BE DONE ;LBM0616� ;LBM061 8� ADD #W.BLGH,R1 ; POINT TO NEXT WINDOW BLOCK ;LBM061� ;LBM061M2� .IFDF U$$DAS ; USER D-SPACE SUPPORT ;LBM061� ;LBM061EA� BIT #T4.DSP,T.ST4(R5) ; TASK WITH SEPERATE I/D SPACE? ;LBM061W � BEQ 110$ ; NOPE ;LBM061F� MOV T.PCB(R5),W.BPCB(R1) ; SET TASK D-SPACE WINDOW PCB PTR ;LBM061%� DEC R2 ; LAST REGION? ;LBM061R$� BEQ 200$ ; YEP, DONE ;LBM0618� ADD #W.BLGH,R1 ; POINT TO NEXT WINDOW BLOCK ;LBM061�110$: ;LBM061� .IFTF ;U$$DAS ;LBM061.� ;LBM061X8� MOV T.PCBV(R5),R4 ; R4 => TASK'S PCB VECTOR ;LBM061,� BEQ 200$ ; NONE, CAN'T DO IT. ;LBM061.� MOVB (R4)+,R3 ; LENGTH OF VECTOR ;LBM061,� TSTB (R4)+ ; SKIP USAGE COUNT ;LBM061� ;LBM0610� .IFT ;U$$DAS ;LBM061� ;LBM061N6� BIT #T4.MUT,T.ST4(R5) ; MULTI-USER TASK? ;LBM061;� BEQ 120$ ; NO, SKIP RO SECTION WINDOW HANDLING ;LBM061 G� MOV (R4)+,W.BPCB(R1) ; SET PCB ADDRESS IN RO SECTION WINDOW ;LBM061F3� DEC R2 ; COUNT DOWN NUMBER OF WINDOWS ;LBM061V � BEQ 200$ ; DONE ;LBM0619� DEC R3 ; COUNT DOWN NUMBER OF PCBS IN VECTOR ;LBM0610 � BEQ 200$ ; DONE ;LBM0618� ADD #W.BLGH,R1 ; POINT TO NEXT WINDOW BLOCK ;LBM061� ;LBM061M8� BIT #T4.DSP,T.ST4(R5) ; USER D-SPACE TASK? ;LBM0618� BEQ 120$ ; NO, SKIP D-SPACE WINDOW HANDLING ;LBM061L� MOV -2(R4),W.BPCB(R1) ; SET RO SEGMENT D-SPACE WINDOW PCB ADDRESS ;LBM0613� DEC R2 ; COUNT DOWN NUMBER OF WINDOWS ;LBM0616 � BEQ 200$ ; DONE ;LBM0619� DEC R3 ; COUNT DOWN NUMBER OF PCBS IN VECTOR ;LBM061 � BEQ 200$ ; DONE ;LBM0618� ADD #W.BLGH,R1 ; POINT TO NEXT WINDOW BLOCK ;LBM061� ;LBM061O� .ENDC ;U$$DAS ;LBM0611� ;LBM061M?�120$: BIT #1, (R4)+ ; CLUSTER LIB PCB VECTOR ENTRY? ;LBM061Q(� BNE 130$ ; YEP, NO WINDOW ;LBM061� ;LBM00‚RyÔxtöt÷tø tþfDATA0614>� MOV -2(R4),W.BPCB(R1) ; SET PCB ADDRESS IN WINDOW ;LBM0618� ADD #W.BLGH,R1 ; POINT TO NEXT WINDOW BLOCK ;LBM076� ;LBM076 3� DEC R2 ; COUNT DOWN NUMBER OF WINDOWS ;LBM061E � BEQ 200$ ; DONE ;LBM061>�130$: DEC R3 ; COUNT DOWN NUMBER OF PCBS IN VECTOR ;LBM061(� BNE 120$ ; GO UNTIL DONE ;LBM061� ;LBM0611"� .ENDC ; DF C$$DFB ;LBM061� ;LBM061I"�200$: MOV (SP)+,R0 ;LBM0613� MOV (SP)+,R3 ; RESTORE SAVED REGISTERS ;LBM061M� RETURN ;LBM061R‚ƒ;PJ„; THIS ROUTINE SCANS THE HEADER AND VALIDATES THE LUT AND WINDOW BLOCKS.E…; TASKS WHICH ARE SIMULTANEOUSLY INSTALLED IN TWO DIFFERENT SYSTEMSIJ†; MAY HAVE INVALID UCBS IN THE LUT OR INVALID PCBS IN THE WINDOW BLOCKS.-‡; IF THIS IS THE CASE, THE TASK IS ABORTED.1ˆ;; ‰; INPUTS:EŠ;;‹; R0=HEADER ADDRESS.Œ; R5=TCB ADDRESS.$�; Ž; OUTPUTS:�; /�; IOSB IS SET TO -1 IF THE HEADER IS INVALID.1‘;M’; R0 - R3 ARE DESTROYED.“;T”"•SCHDR: TST H.NLUN(R0) ;ANY LUNS?– BEQ 100$ ;IF EQ NO8— BIT #T2.ABO,T.ST2(R5) ;TASK ALREADY MARKED FOR ABORT?˜ BNE 200$ ;IF NE YESR3š MOV #$DEVHD,R2 ;POINT TO DEVICE LISTHEAD ;**-1&›10$: MOV (R2),R2 ;POINT TO NEXT DCBœ BEQ 60$ ;IF EQ END OF LIST4� MOVB D.UNIT+1(R2),-(SP) ;CALCULATE NUMBER OF UCBSž SUB D.UNIT(R2),(SP) ;Ÿ INCB (SP) ;S-  MOV D.UCB(R2),R4 ;GET ADDRESS OF FIRST UCB&¡20$: MOV R0,R1 ;COPY HEADER ADDRESS*¢ ADD #H.NLUN,R1 ;POINT TO NUMBER OF LUNS#£ MOV (R1)+,R3 ;GET NUMBER OF LUNS ¤30$: DEC R3 ;ANY LUNS LEFT?¥ BLT 50$ ;IF LT NO2¦ CMP (R1)+,R4 ;UCB MATCH? § BNE 40$ ;IF NE NOF#¨ BIS #1,(R1) ;INDICATE UCB MATCH *©40$: TST (R1)+ ;POINT TO NEXT LUT ENTRYª BR 30$ ;SCAN NEXT LUT ENTRY +«50$: ADD D.UCBL(R2),R4 ;POINT TO NEXT UCB)¬ DECB (SP) ;ANY UCBS LEFT?S­ BNE 20$ ;IF NE YES® TST (SP)+ ;CLEAN THE STACK¯ BR 10$ ;SCAN NEXT DCBC)°60$: MOV R0,R1 ;COPY ADDRESS OF HEADER1± ADD #H.NLUN,R1 ;POINT TO NUMBER OF LUT ENTRIES(*² MOV (R1)+,R3 ;GET NUMBER OF LUT ENTRIES³70$: DEC R3 ;ANY LEFT?$´ BLT 100$ ;IF LT NO'µ TST (R1)+ ;POINT TO SECOND LUT WORDF¶ BEQ 80$ ;IF EQ NOT ASSIGNEDA1· TST (R1) ;UCB ADDRESS FOUND IN DEVICE TABLES?¸ BNE 80$ ;IF NE YES+¹ CLR H.NLUN(R0) ;CLEAR THE NUMBER OF LUNSXº BR 150$ ;ABORT THE TASKB(»80$: CLR (R1)+ ;CLEAR SECOND LUT WORD¼ BR 70$ ;SCAN NEXT LUT ENTRY 8½100$: MOV H.WND(R0),R1 ;POINT TO THE NUMBER OF WINDOWS&¾ MOV (R1)+,R3 ;GET NUMBER OF WINDOWS%¿110$: DEC R3 ;LOOK FOR NEXT WINDOWM#À BLE 200$ ;IF LE NO MORE WINDOWSN'Á ADD #W.BLGH,R1 ;POINT TO NEXT WINDOW(' MOV (R1),R0 ;IS THIS WINDOW MAPPED?8à BEQ 110$ ;IF EQ NO*Ä MOV P.MAIN(R0),R0 ;GET MAIN PCB ADDRESS5Å MOV #$PARHD,R2 ;GET ADDRESS OF PARTITION LIST HEADE-Æ120$: MOV (R2),R2 ;GET ADDRESS OF NEXT PCBTÇ BEQ 150$ ;IF EQ END OF LISTC+È CMP R0,R2 ;PCB FOUND IN PARTITION LIST? &É BNE 120$ ;IF NE NO CONTINUE SEARCH"Ê130$: DEC R3 ;ANY WINDOWS LEFT?Ë BLE 200$ ;IF LE NO-Ì ADD #W.BLGH,R1 ;POINT TO NEXT WINDOW BLOCK2Í BR 110$ ;CONTINUE SCANNING&Î150$: MOV #S.CINS,R0 ;GET ABORT CODEÏ MOV R5,R1 ;COPY TCB ADDRESSA Ð MOVB #-1,IOSB ;SET ERROR CODE Ñ CALLR $ABTSK ;ABORT THE TASKÒ200$: RETURN ;ÓÔÕ;+1Ö;**-CALDMK--CALCULATE TASKS DATA SPACE MAP MASK;×;DEØ; THIS ROUTINE IS CALLED TO CALCULATE THE I/D OVERMAP MASK FROM THEBÙ; TASKS ADDRESSING WINDOWS.BÚ;0 Û; INPUTS:CÜ;UÝ; R0 = HEADER ADDRESS Þ; R5 = TCB ADDRESSß;2 à; OUTPUTS:á;A â; R1 = DATA SPACE MAPPING MASKã;C$ä; REGISTERS R0 - R3 ARE DESTROYED.å; æ;-çè .IF DF U$$DASé&êCALDMK: MOV R3,-(SP) ;SAVE REGISTERSë MOV R2,-(SP) ;Oì MOV R1,-(SP) ;B5í MOVB H.DMAP(R0),-(SP) ;INITIALIZE D SPACE MAP MASKî MOV R0,-(SP) ;L>ï BIT #T4.DSP,T.ST4(R5) ;TASK BUILD WITH SEPARATE I/D SPACE ?3ð BEQ 20$ ;IF EQ NO, RETURN WITH ALL OVERMAP MASKKñ5ò MOV H.WND(R0),R0 ;POINT TO NUMBER OF WINDOW BLOCKSH8ó MOV (R0)+,R2 ;GET NUMBER OF WINDOWS, ADVANCE TO FIRSTô;õ10$: DEC R2 ;00‚Zyƒ\yt´cÚµcÛ¶c�·c›’COUNT ONE LESS WINDOW (REMEMBER THAT WINDOWR&ö ;0 CAN NEVER BE A D SPACE WINDOW÷ BLE 20$ ;IF LE DONE 'ø ADD #W.BLGH,R0 ;POINT TO NEXT WINDOW(ùú ASSUME W.BPCB,0û"ü TST (R0) ;THIS WINDOW MAPPED ?ý BEQ 10$ ;IF EQ NOM&þ MOVB W.BFPD(R0),R3 ;GET PDR ADDRESS#ÿ BIT #20,R3 ;MAPPED TO D SPACE ?? BEQ 10$ ;IF EQ NO,( SUB #UDSDR0,R3 ;ADJUST TO OFFSET ZERO! ASR R3 ;CONVERT TO BYTE INDEXI) MOVB W.BNPD(R0),R1 ;GET NUMBER OF PDRSF( ADD R3,R1 ;FORM ENDING PDR NUMBER +10 MOVB $BCMSK-1(R1),R1 ;GET MASK UP TO LAST APR1 BICB $BCMSK-1(R3),R1 ;GET MASK UP TO FIRST APR$) BISB R1,2(SP) ;MERGE WITH REST OF MASK  BR 10$ ;AND CONTINUE + 20$: MOV (SP)+,R0 ;RESTORE HEADER ADDRESS?.  MOVB (SP)+,H.DMAP(R0) ;REWRITE HEADER VALUE"  MOV (SP)+,R1 ;RESTORE REGISTERS  MOV (SP)+,R2 ; MOV (SP)+,R3 ;N RETURN ;AND RETURN  .ENDC ; DF U$$DAS .END $LOADR) MOVB W.BNPD(R0),R1 ;GET NUMBER OF PDRSF( ADD R3,R1 ;FORM ENDING PDR NUMBER +10 M .TITLE DRASG  .IDENT /10.05/O;M8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;  ;  ; PREVIOUSLY MODIFIED BY:C ;E ; J. R. KAUFFMAN ; ; MODIFIED BY: ;S ; K. L. NOEL 14-DEC-86 10.00 ;B8 ; KLN031 - ADD SUPPORT FOR REMOTE LUN ASSIGNMENTS AND ; RUN TIME LUN BINDING  ;O ; K. L. NOEL 06-APR-87 10.01 ;; ; KLN040 - CHANGE IMPLICIT ALUN TO BACK UP THE USER'S PCQ, ; INSTEAD OF RETURNING TO THE DIRECTIVE ;  ; K. L. NOEL 12-MAY-87 10.02 ;R; ; KLN044 - FIX DRSTS PROBLEM DURING REMOTE ALUN SERVICEW4 ; ON ERRORS, DRFIN WAS CALLED TWICE BY ACCIDENT ;M ; K. L. NOEL 27-MAY-87 10.03 ;N: ; KLN049 - SPECIAL CASE "OV" FOR IMPLICIT CALLS TO ALUN ; ; K. L. NOEL 24-JUN-87 10.04 ;O; ; KLN054 - KEEP PACKET AROUND FOR XXDRV IN CASE KILL I/O2 ; NEEDS TO BE DONE ON PREVIOUSLY ASSIGNED LUN ;I ; J. W. BERZLE 03-SEP-87 10.05 ;; ; JWB221 -- RETURN CORRECT STATUS WHEN LUN LOCKED IN USE  ; (FIXES KLN044);;N; MACRO LIBRARY CALLSU;  .MCALL TCBDF$. TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS ;KLN031 3 .IF DF C$$RTK ;REMOTE TASK SUPPORT ;KLN031E ;KLN031L .MCALL CPRDF$ ;KLN0312 CPRDF$ ;KLN031K ;KLN031R; ;KLN031; LOCAL DATA ;KLN031; ;KLN0315IMPFLG: .WORD 0 ;IF = 1 CALLED AT IMPASG ;KLN031:LUNNUM: .WORD 0 ;LUN NUMBER FOR IMPLICIT ALUN ;KLN0314OLDUCB: .WORD 0 ;FORMER UCB ASSIGNMENT ;KLN031 ;KLN031 .ENDC ; C$$RTK ;KLN031N; ;KLN031!; LOCAL SYMBOLS ;KLN031F; ;KLN0310MAP6 = 140000 ;ADDRESS TO MAP APR6 ;KLN031.AS$DIC = 7 ;DIC FOR ASSIGN LUN ;KLN031:AS$SIZ = 4 ;SIZE OF DPB FOR ASSIGN LUN ;KLN031 ;KLN031L;+; **-$DRASG-ASSIGN LUN;RD; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ASSIGN A DEVICE UNIT TO A; LOGICAL UNIT NUMBER (LUN).;U; DPB FORMAT:M;B# ; WD. 00 -- DIC(7.),DPB SIZE(4.).K!!; WD. 01 -- LUN TO BE ASSIGNED.N,"; WD. 02 -- NAME OF DEVICE TO BE ASSIGNED.3#; WD. 03 -- UNIT NUMBER OF DEVICE TO BE ASSIGNED.0$;D %; INPUTS:A&; ;'; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.S%(; R3=ADDRESS OF THE LUN IN THE DPB.N1); R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. .*; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.+;C7,; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)N-;M/.; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. (/; DIRECTIVE STATUS OF +1 IS RETURNED.!0; C=1 IF DIRECTIVE IS REJECTED.-71; DIRECTIVE STATUS OF 'D.RS90' IS RETURNED IF A FILEE42; IS OPEN OR UNIT ATTACHED ON THE SPECIFIED LUN.73; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF DEVICEA4; AND/OR UNIT IS INVALID. 5;-66; ;KLN031/6; PACKET00ƒbyÔxtöt÷tø tþfDATA FORMAT FOR REMOTE ALUN ;KLN031O6; ;KLN031.6; +---------------------------+ ;KLN031.6; | | ;KLN031.6; | HEADER | ;KLN031.6; | | ;KLN031.6; +---------------------------+ ;KLN0316; | | ;KLN031(6; | ALUN DPB | ;KLN0316; | | ;KLN031.6; +---------------------------+ ;KLN031.6; | PTR TO 2ND WORD IN LUN | ;KLN031.6; +---------------------------+ ;KLN031.6; ; FORMER UCB ADDRESS ; ;KLN031.6; +---------------------------+ ;KLN031.6; | SAVED KISAR6 | ;KLN031.6; +---------------------------+ ;KLN031.6; | SAVED IMPFLG | ;KLN031.6; +---------------------------+ ;KLN0316; ;KLN0316;+ ;KLN031;26; **-$IMAS1-IMPLICIT LUN ASSIGNMENT ;KLN0316; ;KLN031Q6; THIS ROUTINE DOES AN IMPLICIT ALUN FOR THE DIRECTIVE WHICH CALLED IT ;KLN031-6; ;KLN031R6; IF SYSTEM SUPPORTS REMOTE TASK SERVICES, A CALL TO CPRAME WILL BE MADE ;KLN031S6; TO FIND THE LUN ASSIGNMENT. NO ATTEMPT IS MADE TO SAVE THE CONTEXT OF ;KLN031-S6; THE ORIGINAL DIRECTIVE. THE PC OF THE USER TASK IS BACKED UP OVER THE ;KLN031-?6; THE TRAP SO THE DIRECTIVE WILL BE ISSUED AGAIN. ;KLN031 6; ;KLN0316; INPUTS: ;KLN031 6; ;KLN031:6; R1 - POINTER TO 2ND LUN WORD OF TASK HEADER ;KLN03186; R3 - POINTER TO THE LUN NUMBER IN THE DPB ;KLN0316; ;KLN031R6; OUTPUTS: ;KLN0316; ;KLN031Q6; THE LUT ENTRY IS FILLED IN WITH THE UCB OF THE DEVICE. IF THE DEVICE ;KLN031 M6; IS NOT FOUND THE DIRECTIVE STATUS OF 'D.RS92' IS RETURNED ;KLN031E6; ;KLN0316;- ;KLN031E6 ;KLN031.-7$DRASG::CALL $MPLUN ;MAP LUN TO DEVICE UCB #8 TST (R1) ;FILE ACCESSED ON LUN?1!8 BEQ 99$ ;IF EQ NO ;KLN031O48 DRSTS D.RS90 ;RETURN WITH ERROR STATUS ;KLN031899$: ; ;KLN0318 ;KLN031N/8 .IF DF C$$RTB ; RUN TIME BINDING ;KLN031;8 ;KLN031N48 CLR IMPFLG ;INDICATE NOT IMPLICIT ALUN ;KLN031'8 BR RTK ;JOIN COMMON CODE ;KLN031E8 ;KLN031'8$IMAS1:: ;KLN0318 ;KLN0310=8 MOV #1,IMPFLG ;INDICATE THIS WAS AN IMPLICIT CALL ;KLN031L,8 CLR R0 ;NO FORMER UCB ADDRESS ;KLN0318 ;KLN031N8RTK: ;KLN031 68 MOV R0,OLDUCB ;SAVE FORMER UCB ASSIGNMENT ;KLN031,8 MOV -2(R3),R2 ;GET LUN NUMBER ;KLN0318 ;KLN031D28 .IF DF C$$RTK ;REMOTE TASK SUPPORT ;KLN0318 ;KLN031P@8 BIT #F5.RTK,$FMSK5 ;ARE WE USING REMOTE TASK SUPPORT ;KLN031#8 BNE 101$ ;IF NE YES ;KLN031338 JMP 10$ ;DO NON REMOTE LUN ASSIGNMENT ;KLN0318; ;KLN03118; GET A REQUEST PACKET FROM CPRBUF ;KLN031 8; ;KLN031:8101$: MOV R1,R4 ;SAVE POINTER TO 2ND LUN WORD ;KLN031,8 MOV R2,LUNNUM ;SAVE LUN NUMBER ;KLN031-8 MOV R3,R5 ;SAVE POINTER TO DPB ;KLN031 48 MOV #1,R1 ;SET FOR 1 BLOCK FROM CPRBUF ;KLN031D8 MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START ;KLN03128 CALL $CPALO ;GET BUFFER FROM CPRBUF ;KLN0318 ;KLN031 8; ;KLN031D8; GET DEVICE AND UNIT NUMBER BEFORE WE UNMAP THE HEADER ;KLN031T8; - FOR IMPLICIT ALUN, THE DEVICE AND UNIT NUMBER IS IN THE LUT EXTENSION ;KLN031R8; OFFSET INTO LUT IS THE SAME AS IN THE HEADER LUT. THE ADDRESS OF ;KLN031Y8; THE PROTO LUN IS GOTTEN BY SUBTRACTING H.LUN+140000 FROM THE ADDRESS OF THE;KLN031PO8; 2ND LUN WORD THEN ADDING THE BASE ADDRESS OF THE LUT EXTENSION. ;KLN0310R8; - FOR REGULAR REMOTE ALUN, THE DEVICE AND UNIT NUMBER ARE GOTTEN FROM ;KLN0318; THE DPB ;KLN0318; ;KLN031)8 TST IMPFLG ;IMPLICIT ALUN ;KLN031I"8 BEQ 107$ ;IF EQ NO ;KLN0318 ;KLN031T48 MOV R4,R1 ;GET ADDRESS OF 2ND LUN WORD ;KLN031@8 SUB #H.LUN+2+MAP6,R1 ;GET OFFSET INTO LUT EXTENSION ;KL00ƒjy\yt´cÚµcÛ¶c�·c›’N03168 ADD MAP6+H.LUTE,R1 ;ADD EXTENSION OFFSET ;KLN031+8 MOV (R1)+,R2 ;GET DEVICE NAME ;KLN031N.8 BEQ 106$ ;IF EQ, UNASSIGNED LUN ;KLN031+8 MOV (R1),R3 ;GET UNIT NUMBER ;KLN031E8; ;KLN049L8; SPECIAL CASE OV - IF THIS IS AN IMPLICIT CALL, DON'T LET CPRAME ;KLN049/8; TRY TO TRANSLATE THE LOGICAL ;KLN04978; ;KLN049(8 CMP #"OV,R2 ;IS THIS OV? ;KLN049"8 BNE 109$ ;IF NE NO ;KLN0498 ;KLN0496-8 CALL $CPDEA ;DEALLOCATE PACKET ;KLN0498 ;KLN049A38 MOV $TKTCB,R5 ;GET CURRENT TASK'S TCB ;KLN049D38 MOV T.LDV(R5),R1 ;GET LOAD DEVICE UCB ;KLN049E(8 JMP 30$ ;JOIN COMMON CODE ;KLN0498 ;KLN049=8106$: DRSTS D.RS5 ;RETURN WITH ERROR CODE IE.ULN ;KLN031C8 ;KLN031R48107$: MOV (R5),R2 ;GET DEVICE FROM DPB ;KLN031,8 MOV 2(R5),R3 ; AND UNIT NUMBER ;KLN0318; ;KLN03148; FILL IN THE HEADER AND THE ALUN DPB ;KLN0318; ;KLN031?8109$: MOV KISAR6,-(SP) ;SAVE MAPPING TO TASK HEADER ;KLN031$(8 MOV R0,KISAR6 ;MAP PACKET ;KLN03178 MOV #MAP6,R1 ;GET ADDRESS OF PACKET HEADER ;KLN03178 MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUST ;KLN031N(8 CLRB H$ICNT(R1) ;NO ITEMS ;KLN031/8 ADD #P$DPB,R1 ;POINT TO DPB AREA ;KLN031(8 MOVB #AS$DIC,(R1)+ ;DIC ;KLN031(8 MOVB #AS$SIZ,(R1)+ ;SIZE ;KLN031/8 MOV LUNNUM,(R1)+ ;COPY LUN NUMBER ;KLN031 (8 MOV R2,(R1)+ ;DEVICE NAME ;KLN031(8 MOV R3,(R1)+ ;UNIT NUMBER ;KLN0318; ;KLN03168; FILL IN THE COMMON EXTRA STORAGE AREA ;KLN0318; ;KLN03168 MOV R4,(R1)+ ;SAVE POINTER TO TASK HEADER ;KLN03148 MOV OLDUCB,(R1)+ ;SAVE OLD UCB ADDRESS ;KLN03158 MOV (SP)+,(R1)+ ;SAVE MAPPING TO HEADER ;KLN031O8; ;KLN031S8; IF THIS IS AN IMPLICIT ALUN, SET SN$IMP SO DRFIN WILL NOT BE CALLED YET ;KLN031L8; ;KLN031/8 MOV #SN$DIR,R2 ;SET DIRETIVE FLAG ;KLN031 .8 MOV IMPFLG,(R1) ;IMPLICIT ALUN ;KLN031+8 BEQ 110$ ;IF EQ NOT IMPLICIT ;KLN031 /8 MOV #SN$IMP,R2 ;SET IMPLICIT FLAG ;KLN03118; ;KLN031+8; SEND PACKET TO THE DRIVER ;KLN031R8; ;KLN031C8110$: CPSEN$ R2,R0,# ;SEND REQUEST TO CPRSYS ;KLN031M8; ;KLN031H8; MAP PACKET AND RETRIEVE IMPFLG AND POINTER INTO THE HEADER ;KLN0318; ;KLN031(8 MOV R0,KISAR6 ;MAP PACKET ;KLN03118 MOV #MAP6,R1 ;GET ADDRESS OF HEADER ;KLN031*8 ADD #P$DPB,R1 ;POINT TO DPB ;KLN03138 MOV R0,$CPPKT ;SAVE ADDRESS OF PACKET ;KLN054V/8 MOV 2(R1),$CPLUN ;SAVE LUN NUMBER ;KLN054 :8 MOV 10(R1),R4 ;GET ADDRESS OF SECOND LUN WORD ;KLN03178 MOV 12(R1),OLDUCB ;RESTORE OLD UCB ADDRESS ;KLN031 48 MOV 16(R1),IMPFLG ;GET SAVED FLAG WORD ;KLN0318; ;KLN031(8; CHECK STATUS RETURNED ;KLN031J8; - IF SUCCESS, LOOK FOR DEVICE NAME AS A GENERIC DEVICE TYPE ;KLN031Y8; - IF FAILURE AND DEVICE NAME IS NON ZERO, LOOK FOR LOCAL DEVICES OF THAT NAME;KLN031LB8; - IF DEVICE NAME IS ZERO, RETURN WITH ERROR STATUS ;KLN0318; ;KLN03188128$: MOV 4(R1),R5 ;GET RETURNED DEVICE NAME ;KLN031%8 BEQ 200$ ;IF EQ ERROR ;KLN031U8 ;KLN031D;8 CMP #IS.SUC,MAP6+H$STAT ;WAS SUCCESS RETURNED? ;KLN031 8 BNE 5$ ;IF NE NO ;KLN0318 ;KLN031E>8 MOV 14(R1),KISAR6 ;RESTORE MAPPING TO TASK HEADER ;KLN0318 ;KLN031;8; ;KLN031/8; SEARCH FOR GENERIC DEVICE TYPE ;KLN031E8; ;KLN031D8 MOV #$DEVHD,R0 ;SEARCH DEVICE LIST FOR RETURN DEVICE TYPE ;KLN031.8130$: MOV (R0),R0 ;GET NEXT DCB ;KLN031&8 BEQ 200$ ;IF EQ NO DCB ;KLN031,8 CMP R5,D.NAM(R0) ;IS THIS IT? ;KLN031"8 BNE 130$ ;IF NE NO ;KLN031H8 CMP R0,$XXLOW ;IS THIS A GENERIC DEVICE? HIGHER THAT LOW DCB? ;KLN031"8 BLO 130$ ;IF LO NO ;KLN03118 CMP R0,$XXHGH ;LOWER THAN HIGH DCB? ;KLN031 "8 BHI 130$ ;IF HI NO ;KLN03158 CMPB #377,D.UNIT(R0) ;IS THIS UNIT 377? ;KLN03128 BNE 130$ ;IF NE NO, NOT GENERIC DCB ;KL00ƒryÔxtöt÷tø tþfDATAN0318; ;KLN031-8; PREPARE TO JOIN COMMON CODE ;KLN031D8; ;KLN03158 MOV D.UCB(R0),R1 ;PUT UCB ADDRESS IN R1 ;KLN031ID8 MOV OLDUCB,-(SP) ;PUT OLD ASSIGNMENT UCB ADDRESS ON STACK ;KLN031'8 JMP 25$ ;JOIN COMON CODE ;KLN031T8 ;KLN0318200$: ;KLN031/8 MOV $CPPKT,R0 ;GET PACKET ADDRESS ;KLN031 -8 CALL $CPDEA ;DEALLOCATE PACKET ;KLN03158 CLR $CPPKT ;INDICATE PACKET DEALLOCATED ;KLN0318 ;KLN031N*8 TST IMPFLG ;IMPLICIT ALUN? ;KLN031#8 BNE 210$ ;IF NE YES ;KLN031D98 RETURN ;RETURN WITH ERROR CODE SET BY KXDRV ;KLN031 =8210$: DRSTS D.RS5 ;RETURN WITH ERROR CODE IE.ULN ;KLN031D8 ;KLN031S85$: ;KLN0318; ;KLN03108; GET INFO SET UP FOR COMMON CODE ;KLN0318; ;KLN03198 MOV 10(R1),R4 ;PTR TO 2ND LUN WORD OF HEADER ;KLN031D,8 MOV 4(R1),R2 ;SAVE DEVICE NAME ;KLN031,8 MOV 6(R1),R0 ;SAVE UNIT NUMBER ;KLN03108 MOV 14(R1),KISAR6 ;MAP TASK HEADER ;KLN031.8 MOV R4,R1 ;PTR INTO TASK HEADER ;KLN03168 MOV $TKTCB,R5 ;CURRENT TASK'S TCB ADDRESS ;KLN0318; ;KLN031:8; GET OLD ASSIGNMENT UCB ADDRESS FROM HEADER ;KLN0318; ;KLN03108 MOV OLDUCB,-(SP) ;SAVE UCB ADDRESS ;KLN0318 ;KLN031 '8 BR 12$ ;JOIN COMMON CODE ;KLN031(8 ;KLN031N810$: ;KLN031D8 .ENDC ;C$$RTK ;KLN031M8 ;KLN0316*8 TST IMPFLG ;IMPLICIT ALUN? ;KLN031!8 BEQ 11$ ;IF EQ NO ;KLN031;8; ;KLN031P@8; GET DEVICE AND UNIT NUMBER FROM HEADER EXTENSION ;KLN0318; ;KLN03148 MOV R1,R4 ;GET ADDRESS OF 2ND LUN WORD ;KLN031@8 SUB #H.LUN+2+MAP6,R1 ;GET OFFSET INTO LUT EXTENSION ;KLN03168 ADD MAP6+H.LUTE,R1 ;ADD EXTENSION OFFSET ;KLN031+8 MOV (R1)+,R2 ;GET DEVICE NAME ;KLN031 +8 MOV (R1),R0 ;GET UNIT NUMBER ;KLN0318; ;KLN031)8; SET UP OLD UCB ADDRESS ;KLN031L8; ;KLN03118 CLR -(SP) ;NO PREVIOUS UCB ADDRESS ;KLN031 8; ;KLN049P8; SPECIAL CASE OV - IF OV IS IN LUN EXTENSION, DON'T DO LOGICAL NAME ;KLN049 8; TRANSLATION ;KLN0498; ;KLN049(8 CMP #"OV,R2 ;IS THIS OV? ;KLN049!8 BNE 12$ ;IF EQ NO ;KLN049+8 ;KLN049I,8 MOV $TKTCB,R5 ;GET TASK'S TCB ;KLN04938 MOV T.LDV(R5),R1 ;GET LOAD DEVICE TCB ;KLN049R8 ;KLN049 (8 JMP 26$ ;JOIN COMMON CODE ;KLN049811$: ;KLN031 8 .ENDC ;C$$RTB ;KLN0318 ;KLN031K-: MOV R0,-(SP) ;SAVE ADDRESS OF UCB ;**-1O.; MOV R1,R4 ;SAVE ADDRESS OF SECOND LUN WORD#< MOV (R3)+,R2 ;GET NAME OF DEVICE != MOVB (R3),R0 ;GET UNIT NUMBER>??12$: ;KLN031L1? .IF DF C$$RTK ;REMOTE TASK SUPPORT ;KLN031 ? ;KLN031K0? BIT #F5.RTK,$FMSK5 ;REMOTE TASKS? ;KLN031"? BNE 17$ ;IF NE YES ;KLN031? ;KLN0314? .ENDC ;C$$RTK ;KLN031 ? ;KLN031 @ .IF DF M$$MUPA%B BIT #T3.SLV,T.ST3(R5) ;SLAVE TASK? 3C BNE 17$ ;IF NE YES, BYPASS LOGICAL DEVICE TABLE-DE .ENDCFGHI .IF DF L$$GCLJ/K MOV T.UCB(R5),R1 ;GET THE CURRENT TASK'S TI: 8L CALL $GTUSR ;RESOLVE RAW UCB AND SET USER HASH TABLE;M MOV #$LNTDR,-(SP) ;RESOLVE ANY LOGICAL NAME TRANSLATIONS 7N CALL $MPDC3 ;USE ROUTINE IN FOURTH DIRECTIVE COMMON;0O BCC 17$ ;IF CC, SUCCESSFULLY MATCHED LOGICAL4P TST R3 ;SEE IF ERROR OCCURRED OR NO MATCH AT ALL*P BEQ 125$ ;IF EQ VALID MATCH ;KLN0543P JMP 50$ ;INVALID MATCH - RETURN ERROR ;KLN054EP125$: ;KLN054R ;**-1NS .IFTFT3U MOV #$LOGHD,R3 ;POINT TO LOGICAL ASSIGNMENT LISTC.V13$: MOV (R3),R3 ;GET ADDRESS OF NEXT ENTRYW BEQ 17$ ;IF EQ END OF LIST+X TSTB L.TYPE(R3) ;SYSTEM WIDE ASSIGNMENT?TY BEQ 15$ ;IF EQ YES1Z CMP L.UCB(R3),T.UCB(R5) ;TI UCB ADDRESS MATCH?B[ BNE 13$ ;IF NE NOF+\15$: CMP R2,L.NAM(R3) ;DEVICE NAME MATCH?R] BNE 13$ ;IF NE NOT)^ CMPB R0,L.UNIT(R3) ;UNIT NUMBER MATCH?L_ BNE 13$ ;IF NE NOL/` MOV L.ASG00ƒzy\yt´cÚµcÛ¶c�·c›’(R3),R1 ;GET ASSIGNMENT UCB ADDRESS !a BR 25$ ;FINISH IN COMMON CODE.bc .ENDC ;L$$GCLd6e17$: MOV #$DEVHD,R3 ;POINT TO PHYSICAL DEVICE TABLES,f20$: MOV (R3),R3 ;GET ADDRESS OF NEXT DCB g BEQ 50$ ;IF EQ END OF TABLES'h CMP R2,D.NAM(R3) ;DEVICE NAME MATCH?Ii BNE 20$ ;IF NE NORi ;KLN031A1i .IF DF C$$RTK ;REMOTE TASK SUPPORT ;KLN031Ri ;KLN031A0i BIT #F5.RTK,$FMSK5 ;REMOTE TASKS? ;KLN031!i BEQ 23$ ;IF EQ NO ;KLN031Ei; ;KLN031)i; TEST FOR GENERIC DEVICE ;KLN031 i; ;KLN031Hi CMP R0,$XXLOW ;IS THIS A GENERIC DEVICE? HIGHER THAN LOW DCB? ;KLN031!i BLO 23$ ;IF LO NO ;KLN031(1i CMP R0,$XXHGH ;LOWER THAN HIGH DCB? ;KLN031Q!i BHI 23$ ;IF HI NO ;KLN031 &i BR 20$ ;REJECT THIS ONE ;KLN031i ;KLN031N%i23$: ;REFERENCE LABEL ;KLN031Pi .ENDC ;C$$RTK ;KLN031Ni ;KLN031$Aj CMPB R0,D.UNIT(R3) ;UNIT GREATER THAN OR EQUAL TO LOW BOUNDRY?Ek BLO 20$ ;IF LO NOAl CMPB R0,D.UNIT+1(R3) ;UNIT LESS THAN OR EQUAL TO HIGH BOUNDRY?m BHI 20$ ;IF HI NO 4n SUB D.UNIT(R3),R0 ;CALCULATE RELATIVE UNIT NUMBER$o BIC #177400,R0 ;CLEAR EXCESS BITS0p MOV D.UCBL(R3),R1 ;GET LENGTH OF UCB IN BYTES(q CALL $MUL ;CALCULATE NUMBER OF BYTES-r ADD D.UCB(R3),R1 ;CALCULATE ADDRESS OF UCBNs25$: ;REF LABELtuv .IF DF V$$TRMw$x MOV (R1),R3 ;POINT TO DEVICE DCB8y CMP D.NAM(R3),#"VT ;IS THE DEVICE A VIRTUAL TERMINAL?z BNE 26$ ;IF NE NOO1{ CMP U.PTCB(R1),R5 ;IS ISSUING TASK THE PARENT?S| BEQ 26$ ;IF EQ NOB2} CMP R1,T.UCB(R5) ;IS ISSUING TASK AN OFFSPRING?~ BNE 50$ ;IF NE NOU€ .ENDC�‚1ƒ26$: MOV (SP)+,R3 ;WAS LUN PREVIOUSLY ASSIGNED?E„ BEQ 30$ ;IF EQ NOS3… CMP R5,U.ATT(R3) ;UNIT ATTACHED TO CURRENT TASK?U† BNE 27$ ;IF NE NOD0‡ MOV R1,-(SP) ;SAVE NEW ASSIGNMENT UCB ADDRESSˆ MOV R1,R0 ;COPY UCB ADDRESSP(‰ CALL $MPLND ;MAP TO REAL UCB ADDRESS4Š MOV (SP)+,R1 ;RETRIEVE NEW ASSIGNMENT UCB ADDRESS0‹ CMP R0,R3 ;NEW ASSIGNMENT TO SAME FINAL UCB?Œ BNE 35$ ;IF NE NO 2�27$: MOV R3,R5 ;COPY OLD ASSIGNMENT UCB ADDRESS<Ž MOV #$IOKIL,-(SP) ;SET TO KILL I/O ON PREVIOUS ASSIGNMENT7Ž30$: MOV R1,-2(R4) ;ASSIGN LUN TO NEW UNIT ;KLN031IŽ ;KLN031.,Ž .IF DF C$$RTK ;REMOTE TASKS ;KLN031Ž ;KLN031Ž; ;KLN031PŽ; DEALLOCATE CPRBUF PACKET ONLY IF AN I/O KILL HAS BEEN REQUESTED ON ;KLN031!Ž; A GENERIC UNIT ;KLN031 Ž; ;KLN0310Ž BIT #F5.RTK,$FMSK5 ;REMOTE TASKS? ;KLN031"Ž BEQ 315$ ;IF EQ NO ;KLN031Ž ;KLN031 ;Ž CMP #$IOKIL,(SP) ;HAS I/O KILL BEEN REQUESTED? ;KLN031O4Ž BNE 305$ ;IF NE NO - DEALLOCATE PACKET ;KLN031Ž ;KLN031N7Ž CMP (R5),$XXLOW ;IS THIS A GENERIC DEVICE? ;KLN031;"Ž BLO 305$ ;IF LO NO ;KLN0316Ž CMP (R5),$XXHGH ;IS THIS A GENERIC DEVICE ;KLN031?Ž BLOS 31$ ;IF LOS, YES - DON'T DEALLOCATE PACKET YET ;KLN031 Ž305$: ;KLN0312Ž MOV $CPPKT,R0 ;GET ADDRESS OF PACKET ;KLN031-Ž CALL $CPDEA ;DEALLOCATE IT NOW ;KLN031 9Ž CLR $CPPKT ;INDICATE WE ARE DONE WITH PACKET ;KLN031IŽ31$: ;KLN031 Ž; ;KLN031KŽ; IF THIS IS A REMOTE SYSTEM, THE KX DRIVER SET THE ERROR STATUS ;KLN031XŽ; ;KLN031 =Ž MOV #IS.SUC,-(SP) ;OVERRIDE CPRSYS' ERROR STATUS ;KLN031( Ž MTPD$ @#H.DSW ; ;KLN031Ž315$: ;KLN031 Ž .ENDC ; C$$RTK ;KLN031Ž ;KLN031.Ž .IF DF C$$RTB ;RUN TIME BINDING ;KLN031Ž; ;KLN031QŽ; WE SHOULDN'T NEED A RUN TIME CONDITIONAL HERE, BECAUSE IF RTB IS NOT ;KLN031R;Ž; SUPPORTED, IMPFLG WILL NEVER GET SET ANYWAY ;KLN031 Ž; ;KLN031)Ž TST IMPFLG ;IMPLICIT ALUN ;KLN031 !Ž BEQ 32$ ;IF EQ NO ;KLN031 Ž ;KLN031V3Ž SUB #2,$UMPC ;BACK UP THE USER'S PC ;KLN03130Ž MOV #$STACK-22,SP ;DON'T DO DRFIN ;KLN031Ž ;KLN031CŽ32$: ;KLN031Ž .ENDC ; C$$RTB ;KLN031$Ž ;KLN031N� RETURN ; ;**-1� ;KLN044L)00ƒ‚y„…ytöt÷tø tþfDATA‘35$: MOV R1,-(SP) ;SAVE NEW UCB POINTERU’“ .IF DF X$$HDR”)• MOV $SAHPT,R1 ;GET TASK HEADER ADDRESSA–— .IFFN˜)™ MOV $HEADR,R1 ;GET TASK HEADER ADDRESSLš› .ENDCœ.� ADD #H.NLUN,R1 ;POINT TO THE NUMBER OF LUNS ž MOV (R1),-(SP) ;PICK UP COUNT7Ÿ37$: CMP (R1)+,(R1)+ ;ADVANCE TO NEXT UCB POINTER + 2;,  CMP R1,R4 ;SAME LUN AS BEING REASSIGNED?¡ BEQ 39$ ;IF EQ YES)¢ MOV -2(R1),R0 ;GET THIS LUN ASSIGNMENT $£ BEQ 39$ ;IF EQ, LUN NOT ASSIGNED¤0¥ CALL $MPLND ;FOLLOW ANY REDIRECT; HANDLE TI:5¦ CMP R0,R3 ;LUN ASSIGNED TO SAME DEV AS REASS LUN?P§ BNE 39$ ;NO, BRANCHR¨ TST (SP)+ ;REMOVE COUNTV'© MOV (SP)+,R1 ;GET NEW LUN ASSIGNMENT,ª BR 27$ ;IF EQ YES, ATTACH CAN BE IGNORED#«39$: DEC (SP) ;POINT TO NEXT LUNC¬ BGT 37$ ;TRY AGAIN­ CMP (SP)+,(SP)+ ;CLEAN STACKO*®40$: DRSTS D.RS90 ;SET DIRECTIVE STATUS®50$: ;KLN044 1® .IF DF C$$RTK ;REMOTE TASK SUPPORT ;KLN044N® ;KLN044Q0® BIT #F5.RTK,$FMSK5 ;REMOTE TASKS? ;KLN044!® BEQ 55$ ;IF EQ NO ;KLN0443® ;KLN044M5® .IF DF C$$RTB ;RUN TIME BINDING SUPPORT ;KLN044(® ;KLN044&® TST (SP)+ ;CLEAN STACK ;KLN044,® JMP 200$ ;COMMON CODE AT 200$ ;KLN044® ;KLN044O® .ENDC ;C$$RTB ;KLN044Y® ;KLN044(® .ENDC ;C$$RTK ;KLN044D® ;KLN044 "®55$: DRSTS D.RS92 ;KLN044° ;**-1M± .ENDSUPPORT ;KLN044N® ;KLN044Q0® BIT #F5.RTK,$FMSK5 ;REMOTE TASKS? ;KL .TITLE DRREQN .IDENT /05.00/P E;O5; COPYRIGHT (C) 1983, 1984 BY DIGITAL EQUIPMENT CORP.Q; ALL RIGHTS RESERVEDS;; D. N. CUTLER 13-SEP-73; ;O; MODIFIED BY:;;; J. W. BERZLE 26-JUN-84 05.00; -; JWB085 -- PROPAGATE CONTEXT BLOCK POINTER P; (NAMED DIRECTORY SUPPORT)1;0;2;A; REQUEST TASK DIRECTIVE;E; MACRO LIBRARY CALLSN;C  .IF NDF P$$OFF  .MCALL TCBDF$, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;+; **-$DRREQ-REQUEST TASK;.>; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO REQUEST THE EXECUTION; OF A SPECIFIED TASK.;P ; DPB FORMAT:S;S"; WD. 00 -- DIC(11.),DPB SIZE(7.).$; WD. 01 -- FIRST HALF OF TASK NAME.%; WD. 02 -- SECOND HALF OF TASK NAME.-=; WD. 03 -- PARTITION NAME-NOT SUPPORTED BUT MUST BE PRESENT.O=; WD. 04 -- PARTITION NAME-NOT SUPPORTED BUT BUST BE PRESENT. ?; WD. 05 -- REQUEST PRIORITY-NOT SUPPORTED BUT MUST BE PRESENT.C; WD. 06 -- REQUEST UIC.; ; INPUTS:L;O4; R0=ADDRESS OF THE TCB OF THE TASK TO BE REQUESTED.A; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO BE REQUESTED.E9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.D.; R3=ADDRESS OF THE PARTITION NAME IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;E5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)S;E-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.P&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.O7; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF PARTITION 2; CONTROL BLOCK OR TASK CONTROL BLOCK CANNOT BE ; ALLOCATED. D9; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF SPECIFIED. D; TASK IS ALREADY ACTIVE. ; =; NOTE: IF THE SYSTEM SUPPORTS PARENT/OFFSPRING TASKING, THE .; REQUEST DIRECTIVE IS IN THE MODULE DRSPW. ;T/; ON SYSTEMS SUPPORTING PROTOTYPE TCBS AND NONF,; RESIDENT TASK HEADERS, KISAR6 MAY MAP THE; THE PROTOTYPE TCB AT ENTRY.; ;-$DRREQ:: ; T  .IF DF R$$DSP D 4 CLR -(SP) ;INIT DISPATCHING FLAG TO NO DISPATCHING% MOV 6(R3),-(SP) ;SAVE REQUEST UIC A7 CMP T.NAM(R0),#^R... ;DOES TASK HAVE MULTI-USER NAME? L BNE 5$ ;IF NE NO * MOV R0,-(SP) ;SAVE TEMPLATE TCB ADDRESS 6 MOV T.NAM+2(R0),R1 ;PICK UP SECOND WORD OF TASK NAME / MOV T.UCB(R5),R0 ;PICK UP TARGET UCB ADDRESS O2 CALL $SRMUT ;SEARCH FOR APPROPRIATE COPY OF TCB ! BCC 4$ ;IF CC COPY WAS FOUND A6 MOV #T.LGTH,R1 ;ELSE PICK UP SIZE OF TCB TO ALLOCATE ! CALL $ALOCB ;ALLOCATE A 00„Šy…�yt´cÚµcÛ¶c�·c›’TCB % BCS 15$ ;IF CS ALLOCATION FAILURE L2 MOV R0,4(SP) ;SAVE ALLOCATED TCB ADDRESS AS FLAG . MOV (SP),R1 ;RETRIEVE TEMPLATE TCB ADDRESS 2 CALL $TCBCP ;PERFORM COPY AND INSTALL OPERATION 4$: TST (SP)+ ;CLEAN STACK )5$: MOV (SP)+,R1 ;RETRIEVE REQUEST UIC O .IFF ) % MOV 6(R3),R1 ;PICK UP REQUEST UIC S  .IFTF C .IF DF M$$MUP .IF DF X$$HDR/ MOV $SAHDB,KISAR6 ;MAP NONRESIDENT TASK HEADERC .ENDC2 CALL $UISET ;ESTABLISH DEFAULT AND CURRENT UIC'S .ENDC2 MOV T.UCB(R5),R2 ;GET ADDRESS OF REQUESTER TI UCB P .IF DF N$$DIR. MOV T.CTX(R5),$CTXPT ;PROPAGATE CONTEXT BLOCK .ENDC ;DF N$$DIRO% CALL $TSKRP ;REQUEST TASK EXECUTION $ BCS 10$ ;IF CS TASK ALREADY ACTIVE .IFT ) ' MOV (SP)+,R0 ;WAS A TCB DISPATCHED?  BEQ 6$ ;IF EQ NO 0 BIS #T3.REM,T.ST3(R0) ;SET REMOVE ON EXIT BIT  .ENDC -6$: RETURN ;RETURN DIRECTIVE STATUS OF +1 T*10$: BEQ 20$ ;IF EQ TASK ALREADY ACTIVE  .IF DF R$$DSP . ' MOV (SP)+,R0 ;WAS A TCB DISPATCHED? E BEQ 15$ ;IF EQ NO $! CALL $REMOV ;REMOVE THE TASK  .ENDC *15$: DRSTS D.RS1 ;SET DIRECTIVE STATUS *20$: DRSTS D.RS7 ;SET DIRECTIVE STATUS  .ENDC  .ENDBIT  .ENDC -6$: RETURN ;RETURN DIR .TITLE DBDRVF .IDENT /16.10/2;I<; COPYRIGHT (c) 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;M<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; P. J. BEZEREDI 19-SEP-79;S; MODIFIED FOR M-PLUS V2.0 BY:;; R. T. PERRON; P. J. BEZEREDI ; T. LEKAS; ; MODIFIED BY:; ; P. J. CARR 9-JUN-82 16.01N;T'; PJC052 -- CORRECT SEEK OPTIMIZATION. ; ; P. J. CARR 27-AUG-82 16.02;R:; PJC063 -- COUNT EACH DIFFERENT OFFSET AS 1 RETRY DURING; OFFSET RECOVERY.;N; P. J. CARR 27-AUG-82 16.03;R9; PJC064 -- DON'T LOG MULTIPLE ERRORS DURING MULTI-BLOCKM,; TRANSFERS THAT USE THE DBRTRY PATHWAY.;H; P. J. CARR 27-AUG-82 16.04;.:; PJC065 -- CORRECT HARD ECC RECOVERY ON THE LAST PARTIAL&; BLOCK OF A MULTI-BLOCK TRANSFER.;L; P. J. CARR 27-AUG-82 16.05;.:; PJC066 -- LOG THE UNSUCCESSFUL RECALIBRATE AFTER A SEEK; FAILURE.;.; P. J. CARR 27-AUG-82 16.06;P9; PJC067 -- CORRECT THE BRANCH IN THE DATA LATE RECOVERY ; ROUTINE.;; J. GALLANT 2-MAR-83 16.07.;8; JG0049 -- FIX THE CASE WHERE DTE AND DCK ARE COMBINED;M; J. GALLANT 7-MAR-83 16.08E;R6; JG0041 -- FIX SO THAT A FMT AND OTHER I/O CAN OCCUR,; TOGETHER WITH OVERLAP SEEKS TURNED ON.2; MAKE RECALIBRATE A SEEK FUNCTION RATHER THAN!; A DATA TRANSFER FUNCTION. ;P; L. KOGAN 17-APR-84 16.09;E/; LK001 -- ENTER NON-EXISTENT DRIVE ERROR INTOJ; ERROR LOG FILE6;P; B. S. MCCARTHY 6-AUG-85 16.10 ;T/; BM368 -- ADD CONDITIONAL SKIP OF FIRST DRIVEG!; NOT READY ERROR FOR POWERFAIL4;--; RH11/RH70-RP04/05/06 OVERLAPPED SEEK DRIVERM;  .MCALL HWDDF$,PKTDF$E$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS; ,; DEVICE REGISTER AND STATUS BIT DEFINITIONS;A%RPCS1=0 ;CONTROL STATUS REGISTER 1TIE=100 ;INTERRUPT ENABLEKTRE=40000 ;TRANSFER ERRORL*MCPE=20000 ;MASSBUS CONTROL PARITY ERROR#DVA=4000 ;DRIVE AVAILABLE TO PORTCRPWC=2 ;WORD COUNT REGISTER"RPBA=4 ;BUFFER ADDRESS REGISTER(RPDA=6 ;DESIRED TRACK/SECTOR REGISTER%RPCS2=10 ;CONTROL STATUS REGISTER 2EDLT=100000 ;DATA LATE ERRORPWCE=40000 ;WRITE CHECK ERROR UPE=20000 ;UNIBUS PARITY ERROR#NED=10000 ;NONEXISTENT DISK ERRORS$NEM=4000 ;NONEXISTENT MEMORY ERRORPGE=2000 ;PROGRAMMING ERRORS!MXF=1000 ;MISSED TRANSFER ERRORL%MDPE=400 ;MASSBUS DATA PARITY ERROR2!RPDS=12 ;DRIVE STATUS REGISTERERR=40000 ;E00…’y…ytöt÷tø tþfDATARROR SUMMARY BIT$PIP=20000 ;POSITIONING IN PROGRESSMOL=10000 ;MEDIUM ONLINEWRL=4000 ;WRITE LOCKED DRIVE$PGM=1000 ;PROGRAMMABLE PORT SELECT!DPR=400 ;DRIVE PRESENT ON PORT DRY=200 ;DRIVE READY0VV=100 ;VOLUME VALID"RPER1=14 ;ERROR SUMMARY REGISTERDCK=100000 ;DATA CHECK ERRORUNS=40000 ;DRIVE UNSAFEO!OPI=20000 ;OPERATION INCOMPLETERDTE=10000 ;DRIVE TIMING ERROR WLE=4000 ;WRITE LOCK ERROR IAE=2000 ;INVALID DISK ADDRESSAOE=1000 ;ADDRESS OVERFLOWHCRC=400 ;HEADER CRC ERROR HCE=200 ;HEADER COMPARE ERRORECH=100 ;ECC HARD ERRORWCF=40 ;WRITE CLOCK FAILUREFER=20 ;FORMAT ERRORP#CPE=10 ;CONTROL BUS PARITY ERROR !RMR=4 ;REGISTER MODIFY REFUSEDILR=2 ;ILLEGAL REGISTERILF=1 ;ILLEGAL FUNCTION&RPAS=16 ;ATTENTION SUMMARY REGISTER RPDBR=22 ;DATA BUFFER REGISTERRPDT=26 ;DRIVE TYPE REGISTER=!RPOF=32 ;DRIVE OFFSET REGISTER0 FMT22=10000 ;FORMAT (1=16 BIT)ECI=4000 ;ECC INHIBIT0"HCI=2000 ;HEADER COMPARE INHIBIT%RPDC=34 ;DESIREDED CYLINDER NUMBERA#RPCC=36 ;CURRENT CYLINDER NUMBERRPER2=40 ;ERROR REGISTER 2!RPEC1=44 ;ECC POSITION REGISTER RPEC2=46 ;ECC PATTERN REGISTER;;; LOCAL EQUATED SYMBOLS;=,XCT=1 ;FUNCTION HAS BEEN EXECUTED (1=YES)'ERL=2 ;ERROR HAS BEEN LOGGED (1=YES)T)IHC=4 ;INHIBIT HEADER COMPARES (1=YES)2%ADR=10 ;ADDRESS BITS SETUP (1=YES) 'SEL=20 ;PORT SELECT WAIT (1=WAITING) !OFA=100 ;OFFSET ACTIVE (1=YES) (RETRY=8. ;CONTROLLER ERROR RETRY COUNT; ; LOCAL DATA;E.DELTA: .WORD 3 ;ROTATIONAL OPTIMIZATION DELTA;E=; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLER NUMBER)S; 7RTTBL: .BLKW R$$JP1 ;RETRY COUNT FOR CURRENT OPERATIONY5OFFAD: .BLKW R$$JP1 ;ADDRESS OF CURRENT OFFSET VALUEEBPRMSV: .BLKW R$$JP1*5 ;PARAMETER SAVE AREA FOR ERROR RECOVERY AND  ;WRITE CHECK&SAVWC: .BLKW R$$JP1 ;SAVED WORD COUNT=DLTWC: .BLKW R$$JP1 ;SAVED WORD COUNT FOR DATA LATE RECOVERYT.$DBOPT::.REPT R$$JP1 ;SEEK OPTIMIZATION TABLE/ .WORD 1 ;0=IMPLIED SEEK; 1=ALWAYS SEEK FIRSTD .ENDR;A ; OFFSET POSITIONING VALUE TABLE;L%OFFTB: .WORD 0 ;RETURN TO CENTERLINEE .WORD FMT22!20 ;+400: .WORD FMT22!220 ;-400 .WORD FMT22!40 ;+800O .WORD FMT22!240 ;-800 .WORD FMT22!60 ;+1200 .WORD FMT22!260 ;-1200R .WORD 0 ;RETURN TO CENTERLINEE;R; DIAGNOSTIC FUNCTION TABLEK;A$FUNTBL: .BYTE 107, IO.HMS!IQ.UMD&377 .BYTE 105, IO.BLS!IQ.UMD&377C .BYTE 115, IO.OFF!IQ.UMD&377D%FUNTB0: .BYTE 173, IO.RDH!IQ.UMD&377T .BYTE 163, IO.WDH!IQ.UMD&377; .BYTE 151, IO.WCK!IQ.UMD&377FUNTBE:F;P; DRIVER DISPATCH TABLEL;2 DDT$ DB,R$$JP1,,,,,,OPT ;GENERATE DISPATCH TABLE;+>; **-DBINI-RH11/RH70-RP04/05/06 DISK PACK CONTROLLER INITIATOR;0E; THIS IS THE DRIVER ENTRY POINT FROM THE QUEUE I/O DIRECTIVE WHEH ANTE; I/O REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TOBF; PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED UNIT IS NOTF; BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSEG; A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPT SUCCEEDS,VE; THEN THE NEXT I/O OPERATION IS INITIATED AND A RETURN TO THE CALLERT; IS EXECUTED.;I ; INPUTS:0;06; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIALIZED.;R ; OUTPUTS:;TA; IF THE SPECIFIED UNIT IS NOT BUSY AND AN I/O REQUEST IS WAITING A; TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-O; ATION IS INITIATED.E;-7DBINI: GTPKT$ DB,R$$JP1 ;GET NEXT I/O PACKET TO PROCESSE;E1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:I;X'; R1=ADDRESS OF THE I/O REQUEST PACKET.V-; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.D; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.A6; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIALIZED.;P;; RH11/RH70-RP04/05/06 DISK PACK I/O REQUEST PACKET FORMAT:E;I"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK.X@; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUES00…šy�yt´cÚµcÛ¶c�·c›’TOR TASK HEADER.5; WD. 04 -- FIRST LUN WORD IN REQUESTORS TASK HEADER.A; WD. 05 -- I/O FUNCTION CODE.0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.=; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000).-3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.A; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER.V+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.T-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED. <; WD. 15 -- DIAGNOSTIC SUPPLIMENTAL PARAMETER ELSE NOT USED.8; WD. 16 -- BITS <0:7> = HIGH LBN, BITS <8:15> NOT USED.#; WD. 17 -- LOW LBN OF I/O REQUEST.R.; WD. 20 -- RELOCATION BIAS OF REGISTER BLOCK.;; WD. 21 -- REGISTER BLOCK ADDRESS (DISPLACEMENT + 140000).E;(# CLRB U.CW2+1(R5) ;RESET UNIT FLAGSI$ CALL $VOLVD ;VALIDATE VOLUME VALID BCS 10$ ;IF CS WE FAILED TST R0 ;TRANSFER FUNCTION? BMI DBRQC ;IF MI YES) JMP DBVV ;PROCESS VOLUME VALID FUNCTION-10$: CALL $IODON ;FINISH I/OR BR DBINI ;GET NEXT REQUEST;L*; REQUEST CONTROLLER FOR PROPER OPERATION.;I0DBRQC: MOV S.KRB(R4),R1 ;GET CURRENT KRB ADDRESS5 BIT #KS.POE,K.STS(R1) ;PARALLEL OPERATIONS ENABLED?B BEQ DBRQC1 ;IF EQ NO. MOV S.PKT(R4),R3 ;RETRIEVE I/O PACKET ADDRESS) BITB #IQ.Q,I.FCN(R3) ; EXPRESS REQUEST ?T BNE DBRQC1 ; IF NE YES. BITB #IQ.UMD,I.FCN(R3) ; DIAGNOSTIC REQUEST ? BNE 20$ ; IF NE YESR- MOVB K.CON(R1),R3 ;RETREIVE CONTROLLER INDEX;# TST $DBOPT(R3) ;WHICH SEEK METHOD?C" BNE 10$ ;IF NE ALWAYS SEEK FIRST3 BIT #KS.DIP,K.STS(R1) ;DATA TRANSFER IN PROGRESS?E+ BEQ DBRQC1 ;IF EQ NO, START DATA TRANSFERT210$: BISB #S3.SIP,S.ST3(R4) ;SET SEEK IN PROGRESS6 CALL $RQCNC ;REQUEST CONTROLLER FOR CONTROL FUNCTION BR DBINIO ;T320$: MOV #FUNTBL,R0 ; GET ADDRESS OF FUNCTION TABLER)25$: TSTB (R0)+ ; BYPASS CONTROLLER CODEB- CMPB (R0)+,I.FCN(R3) ; FUNCTION CODE MATCH ?B BEQ 30$ ; IF EQ YESM CMP #FUNTB0,R0 ; END OF TABLE ? BNE 25$ ; IF NE NO+ BR DBRQC1 ; YES, NORMAL TRANSFER FUNCTIONA.30$: TSTB -(R0) ; POINT BACK TO FUNCTION CODE, MOVB -(R0),U.BUF(R5) ; LOAD CONTROLLER CODE BR 10$ ; TREAT AS A SEEK;DBRQC1: BICB #S3.SIP,S.ST3(R4) ;SET SEEK ALREADY COMPLETED 3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER ;0 ; **-DBUBMP-SETUP UNIBUS ADDRESS;N>; THIS SECTION OF CODE WILL DETERMINE IF THE UNIBUS ADDRESS IS@; ALREADY IN THE FORMAT FOR THE MASSBUS CONTROLLER OR THE UNIBUS<; MAP FOR 22-BIT PROCESSORS WITHOUT RH CONTROLLERS. IT WILLA; ALSO CONVERT THE I/O FUNCTION CODE TO IT'S HARDWARE EQUIVALENT.C;O>; NOTE: AT THIS POINT THE REQUESTING UNIT MUST BE THE OWNER OF%; THE CONTROLLER FOR A DATA TRANSFER.#;S.DBUBMP: MOV S.KRB(R4),R1 ;RETREIVE KRB ADDRESS2 BITB #ADR,U.CW2+1(R5);ADDRESS BITS ALREADY SETUP? BNE DBINIO ;IF NE YESS/ BIT #FE.EXT,$FMASK ;22-BIT ADDRESSING ENABLED?N BEQ 10$ ;IF EQ NOS: BIT #KS.MBC,K.STS(R1) ;YES, IS THIS A 22-BIT CONTROLLER? BNE 20$ ;IF NE YES' CALL $STMAP ;SETUP UNIBUS MAP ADDRESS 210$: ASL U.BUF(R5) ;SHIFT BITS <4:5> TO BITS <8:9> ASL U.BUF(R5) ;...T ASL U.BUF(R5) ;...I ASL U.BUF(R5) ;...G/ BIT #FE.EXT,$FMASK ;22-BIT ADDRESSING ENABLED?A BEQ 20$ ;IF EQ NO% CALL $MPUBM ;MAP UNIBUS TO TRANSFERB:20$: BISB #ADR,U.CW2+1(R5);INDICATE ADDRESS SETUP COMPLETE;B3; CONVERT I/O FUNCTION CODE TO HARDWARE EQUIVALENT.D;S. MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS4 CMPB #IO.HMS/256.,I.FCN+1(R1) ;DIGNOSTIC FUNCTION? BNE 40$ ;IF NE NOL. MOV #FUNTBL,R0 ;GET ADDRESS OF FUNCTION TABLE830$: MOVB (R0)+,U.BUF(R5) ;LOAD CONTROLLER FUNCTION CODE. CMPB (R0)+,I.FCN(R1) ;IS IT THE CORRECT CODE? BEQ 60$ ;IF EQ YES' CMP #FUNTBE,R0 ;END OF FUNCTION TABLE?I BNE 30$ ;IF NE NOM040$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION2 MOVB #171,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTION7 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?T$ BHIS 50$ ;IF HIS FUNCTION IS LEGAL( MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS, MOVB U.UNIT(R5),RPCS2(R2) ;SELECT THE UNIT JMP DBFIN1 ;FINISH I/O50$: BEQ 60$ ;IF EQ YES0 MOVB #161,U.BUF(R5) ;SET WRITE LOGICAL FUNCTION+00…¢y…ytöt÷tø tþfDATA60$: MOV S.KRB(R4),R3 ;RETRIEVE KRB ADDRESS6- MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEXN! MUL #5,R3 ;SETUP INDEX INTO ...:" ADD #PRMSV,R3 ;... PARAMETER AREA& MOV U.BUF(R5),(R3)+ ;SAVE PARAMETERS MOV U.BUF+2(R5),(R3)+ ;... MOV U.CNT(R5),(R3)+ ;... MOV I.PRM+10(R1),(R3)+ ;...  MOV I.PRM+12(R1),(R3)+ ;...V;R%; **-DBINIO-INITIATE AN I/O OPERATION.;TE; THIS ROUTINE WILL INITIATE EITHER A SEEK OR THE DATA TRANSFER OPER-$6; ATION DEPENDING ON HOW THE CONTROLLER WAS REQUESTED.;I ; INPUTS:V;K; R4=ADDRESS OF THE SCB.; R5=ADDRESS OF THE UCB.;E*DBINIO: MOV @S.KRB(R4),R2 ;GET CSR ADDRESS) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSE( MOVB U.UNIT(R5),RPCS2(R2) ;SELECT UNIT;S9; DETERMINE IF DRIVE'S PORT IS SEIZED BY THIS CONTROLLER.;V' MTPS #PR5 ;EXECUTE AT DEVICE PRIORITY(+ CLR RPDS(R2) ;;;ATTEMPT TO SEIZE THE DRIVEA* BIT #DPR,RPDS(R2) ;;;DID THE DRIVE SEIZE? BNE 5$ ;;;IF NE YES 2 BISB #SEL,U.CW2+1(R5);;;SET PORT SELECT WAIT FLAG/ MOVB S.ITM(R4),S.CTM(R4) ;;;SET TIMEOUT COUNT$ CLR S.FRK+2(R4) ;;;ALLOW INTERRUPTS& MOVB #IE,(R2) ;;;RE-ENABLE INTERRUPTS MTPS #0 ;;;ALLOW INTERRUPTSP* CALLR $RLCN ;RELEASE CONTROLLER AND EXIT;T1; CHECK IF THE HEADS ARE ON THE CORRECT CYLINDER.I;S*5$: MOVB #111,(R2) ;;;CLEAR SELECTED DRIVE0 BITB #S3.SIP,S.ST3(R4) ;;;ARE WE DOING A SEEK? BEQ 10$ ;;;IF EQ NO 1 BITB #IQ.UMD,I.FCN(R1) ;;; DIAGNOSTIC FUNCTION ?Z BNE 20$ ;;; IF NE YES2 CMP RPCC(R2),I.PRM+10(R1) ;;;DO WE NEED TO SEEK? BNE 20$ ;;;IF NE YES MTPS #0 ;ENABLE INTERRUPTS# JMP DBRQC1 ;GO REQUEST CONTROLLERM; .; LOAD CONTROLLER REGISTERS FOR DATA TRANSFER.;W210$: ADD #RPCS2,R2 ;;;POINT TO SECOND CSR REGISTER7 MOV I.PRM+12(R1),-(R2) ;;;INSERT TRACK/SECTOR ADDRESSR0 MOV U.BUF+2(R5),-(R2) ;;;INSERT BUFFER ADDRESS: MOV U.CNT(R5),-(R2) ;;;INSERT NUMBER OF BYTES TO TRANSFER# ROR (R2) ;;;CONVERT TO WORD COUNT1& NEG (R2) ;;;MAKE NEGATIVE WORD COUNT" TST -(R2) ;;;POINT BACK TO RPCS1'20$: MOV #FMT22,R3 ;;;FORCE 16-BIT MODE 8 CMP #IO.OFF!IQ.UMD,I.FCN(R1) ;;;DIAG. OFFSET FUNCTION? BNE 30$ ;;;IF NE NO. BIS I.PRM+6(R1),R3 ;;;YES, MERGE OFFSET VALUE430$: BITB #IHC,U.CW2+1(R5);;;INHIBIT HEADER COMPARE? BEQ 40$ ;;;IF EQ NO,+ BIS #HCI,R3 ;;;SET HEADER COMPARE INHIBITU+40$: MOV R3,RPOF(R2) ;;;SET OFFSET REGISTERM;U'; CHECK FOR DRIVE NOT READY CONDITIONS.T;R- MOV #IE.DNR&377,R0 ;;;ASSUME DRIVE NOT READYN; MOV I.PRM+10(R1),RPDC(R2) ;;;SET DESIRED CYLINDER ADDRESSC, MOV RPDS(R2),R3 ;;;GET CURRENT DRIVE STATUS COM R3 ;;;COMPLEMENT STATUSC, BIT #MOL!DRY,R3 ;;;DRIVE READY AND ON LINE? BNE 50$ ;;;IF NE NO6$ BIT #UNS,RPER1(R2) ;;;DRIVE UNSAFE? BEQ 70$ ;;;IF EQ NO)!50$: MTPS #0 ;;;ALLOW INTERRUPTS$/ BITB #US.SPU,U.STS(R5) ;IS DRIVE SPINNING UP?R BEQ 55$ ;IF EQ NOR5 BITB #US.VV,U.STS(R5);WAS VOLUME PREVIOUSLY MOUNTED?V BEQ 52$ ;;; IF EQ NO( BR DBPWF0 ;YES, WAIT FOR IT TO SPIN UP52$: JMP DBPWF1 ;;;355$: BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC OPERATION?M BEQ 60$ ;IF EQ NO + JMP DBDIAG ;PASS REGISTERS AND FINISH I/OS60$: ;REFERENCE LABEL .IF DF S2.NRD6 BIT #S2.NRD,S.ST2(R4) ;IS THIS FIRST DRIVE NOT READY?! BNE 61$ ;IF NE NO, GO LOG ERROR)6 BIS #S2.NRD,S.ST2(R4) ;INDICATE FIRST DRIVE NOT READY JMP DBPWF1 ;GO DO A RETRYR761$: BIC #S2.NRD,S.ST2(R4) ;CLEAR FIRST DRIVE NOT READY  .ENDC ; DF S2.NRD( CALL $DVERR ;LOG DRIVE NOT READY ERROR65$: JMP DBFIN1 ;FINISH I/O,70$: BIT #VV,R3 ;;;DID VOLUME VALID CHANGE?1 BEQ 75$ ;;;IF EQ NO (NOTE REVERSE STATUS OF VV)D0 BITB #US.SPU,U.STS(R5) ;;;DID WE JUST SPIN UP? BEQ 50$ ;;;IF EQ NO * MOVB #123,(R2) ;;;YES, RESET VOLUME VALID2 BISB #US.VV,U.STS(R5);;;SET SOFTWARE VOLUME VALID375$: BIT #S2.MAD,S.ST2(R4) ;;;MULTI-ACCESS DEVICE?T BEQ 90$ ;;;IF EQ NOO. CMP S.KRB(R4),S.KTB(R4) ;;;IS THIS PORT 'A'? BNE 80$ ;;;IF NE NO/ BICB #S3.SPA,S.ST3(R4) ;;;YES, SHOW IT SPUN UPN BR 85$ ;;;380$: BICB #S3.SPB,S.ST3(R4) ;;;IT MUST BE PORT 'B'I385$: BITB #S3.SPU,S.ST3(R4) ;;;BOTH PORTS SPUN UP?E BNE 95$ ;;;IF NE NOB; $; PREPARE TO START AN I/O OPER00…ªy�yt´cÚµcÛ¶c�·c›’ATION.;?790$: BICB #US.SPU,U.STS(R5) ;;;RESET DRIVE SPINNING UPO+95$: CLR S.FRK+2(R4) ;;;INIT FORK INTERLOCKW/ MOVB S.ITM(R4),S.CTM(R4) ;;;SET TIMEOUT COUNTM- BIS #S2.ACT,S.ST2(R4) ;;;SHOW I/O IS ACTIVEC5 BISB #XCT,U.CW2+1(R5);;;SHOW FUNCTION BEING EXECUTED 0 BITB #S3.SIP,S.ST3(R4) ;;;SHOULD WE DO A SEEK? BEQ 105$ ;;;IF EQ NO;; START EXPLICIT SEEK.; 1 BITB #IQ.UMD,I.FCN(R1) ;;; DIAGNOSTIC FUNCTION ?4 BEQ 99$ ;;; IF EQ NO/ MOVB U.BUF(R5),(R2) ;;; LOAD POSITION FUNCTIONT BR 101$ ;;;O,99$: MOVB U.PRM(R5),R3 ;;; GET SECTORS/TRACK CLR -(SP) ;;;CLEAR A WORDS6 MOVB I.PRM+12(R1),(SP) ;;;GET DESIRED SECTOR ADDRESS, SUB DELTA,(SP) ;;;SUBTRACT ROTATIONAL DELTA% BPL 100$ ;;;IF PL ADJUSTMENT WAS OKX/ ADD R3,(SP) ;;;CORRECT ADJUSTMENT IF NEGATIVEB;100$: MOVB I.PRM+13(R1),1(SP) ;;;SET DESIRED TRACK ADDRESS;9 MOV (SP)+,RPDA(R2) ;;;LOAD ADJUSTED TRACK/SECTOR ADDRESSC+ MOVB #131,(R2) ;;;LOAD THE SEARCH FUNCTION;#101$: MTPS #0 ;;; ALLOW INTERRUPTSL( BR DBPWF3 ;RELEASE CONTROLLER AND EXIT;M; START DATA TRANSFER.;C1105$: MOV S.KRB(R4),R3 ;;;GET CURRENT KRB ADDRESSR7 BIT #IQ.UMD,I.FCN(R1) ;;;IS IT A DIAGNOSTIC FUNCTION?( BEQ 106$ ;;;IF EQ NO2 CMPB U.BUF(R5),#140 ;;;IS IT A UMD SEEK FUNCTION? BLO 107$ ;;;IF LO YESJ=106$: BIS #KS.DIP,K.STS(R3) ;;;SET DATA TRANSFER IN PROGRESSI1 BIT #FE.EXT,$FMASK ;;;22-BIT ADDRESSING ENABLED?U BEQ 110$ ;;;IF EQ NO7 BIT #KS.MBC,K.STS(R3) ;;;IS THIS A 22-BIT CONTROLLER?T BEQ 110$ ;;;IF EQ NO MOV R3,R1 ;;;COPY KRB ADDRESSL' ADD K.OFF(R3),R1 ;;;POINT TO UCB TABLE+ MOV KE.RHB(R1),R1 ;;;RETREIVE RHBAE OFFSET ' ADD R2,R1 ;;;FORM AN I/O PAGE ADDRESST2 MOVB U.BUF+1(R5),(R1);;;SET MEMORY EXTENSION BITS+107$: MOVB U.BUF(R5),(R2) ;;;START FUNCTIONO BR 120$ ;;;;*110$: MOV U.BUF(R5),(R2) ;;;START FUNCTION 120$: MTPS #0 ;ALLOW INTERRUPTS;#<; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.; %DBCAN: RETURN ;;;NOP FOR RP04/05/062;+:; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND>; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT=; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVEP?; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANYA; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESS ; THE UNIT IS ALREADY READY.;-3DBPWF: TSTB S.STS(R4) ;IS THIS UNIT CURRENTLY BUSY?O BEQ DBPWF2 ;IF EQ NO9DBPWF0: MOVB #15.,S.STS(R4) ;WAIT A MAXIMUM OF ONE MINUTER6DBPWF1: MOVB S.ITM(R4),S.CTM(R4) ;4 SECONDS AT A TIME5DBPWF2: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UPH1DBPWF3: CALLR $RLCN ;RELEASE CONTROLLER AND EXITO;+5; **-$DBINT-RH11/RH70-RP04/05/06 DISK PACK CONTROLLERO; INTERRUPT HANDLERE;- .ENABL LSBN3$DBINT::BR DBFRK ;;;ENTRY POINT FOR DATA TRANSFERSD+ TST S.FRK+2(R4) ;;;ARE INTERRUPTS ALLOWED?." BNE DBCAN ;;;IF NE NO, IGNORE IT' CALL $FORK ;;;CREATE A SYSTEM PROCESSF8DBFRK: BITB #SEL,U.CW2+1(R5);WAITING FOR PORT TO SELECT? BEQ 5$ ;IF EQ NO- BICB #SEL,U.CW2+1(R5);RESET PORT SELECT FLAGB, MOV U.SCB(R5),R4 ;YES, RETREIVE SCB ADDRESS. MOV S.PKT(R4),R3 ;RETREIVE I/O PACKET ADDRESS JMP DBRQC ;GO TRY AGAINN65$: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS- MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEXS# MOV @S.KRB(R4),R2 ;GET CSR ADDRESS.( MOVB U.UNIT(R5),RPCS2(R2) ;SELECT UNIT# TSTB S.STS(R4) ;IS THIS UNIT BUSY? BNE 10$ ;IF NE YES' MTPS #PR5 ;EXECUTE AT DEVICE PRIORITY5( CLR S.FRK+2(R4) ;;;RESET FORK INTERLOCK/ MOV #TRE!11,(R2) ;;;CLEAR CONTROLLER AND DRIVEI: BISB #S3.DRL,S.ST3(R4) ;;;SHOW DUAL ACCESS UNIT RELEASED MOVB #113,(R2) ;;;RELEASE DRIVE MTPS #0 ;;;ALLOW INTERRUPTSL BR DBPWF3 ;RELEASE CONTROLLERR;R@; INTERRUPT WAS FROM A BUSY UNIT. IF WE JUST DID A SEEK WE WILLA; GO AND START THE DATA TRANSFER OPERATION. IF THE DATA TRANSFERC>; TERMINATED, DETERMINE WHY. IF WE ARE SPINNING UP, RETRY THE ; OPERATION.;110$: BITB #US.SPU,U.STS(R5) ;ARE WE SPINNING UP?K BEQ 15$ ;IF EQ NOI- BIT #S2.MAD,S.ST2(R4) ;MULTI-ACCESS DEVICE?  BEQ 100…²y…ytöt÷tø tþfDATA2$ ;IF EQ NO., CMP S.KRB(R4),S.KTB(R4) ;IS THIS PORT 'A'? BNE 14$ ;IF NE NO;2 BITB #S3.SPA,S.ST3(R4) ;IS PORT 'A' SPINNING UP? BEQ 15$ ;IF EQ NOR%12$: CALLR 100$ ;RETRY THE OPERATION 614$: BITB #S3.SPB,S.ST3(R4) ;IS PORT 'B' SPINNING UP? BNE 12$ ;IF NE YES715$: BIT #S2.EIP,S.ST2(R4) ;ERROR ALREADY IN PROGRESS?  BNE 20$ ;IF NE YES& CALL DBPRM ;SET INITIAL RETRY VALUES.20$: MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS/ MOV #IS.SUC&377,R0 ; ASSUME SUCESSFUL TRANSFERC1 BITB #S3.SIP,S.ST3(R4) ; DID WE JUST DO A SEEK ?S BEQ 30$ ;IF EQ NOR0 BICB #S3.SIP,S.ST3(R4) ;CLEAR SEEK IN PROGRESS8 BITB #IQ.UMD,I.FCN(R1) ; DIAGNOSTIC FUNCTION EXECUTED ? BNE DBDIAG ; IF NE YES/ BIT #ERR,RPDS(R2) ;ANY ERRORS DURING THE SEEK?B BEQ 100$ ;IF EQ NO! CALL $DVERR ;LOG THE SEEK ERRORS! DECB RTTBL(R3) ;COUNT THIS RETRY " CALL DBERL ;FINISH ERROR LOGGING125$: MOV #TRE!11,(R2) ;CLEAR CONTROLLER AND DRIVE ' MOV #107,R1 ;SET RECALIBRATE FUNCTIONR. CALLR DBFUNC ;ISSUE THE RECALIBRATE AND EXIT;(G; INTERRUPT WAS DUE TO A DATA TRANSFER OPERATION OR DIAGNOSTIC FUNCTION(; <30$: BITB #IQ.UMD,I.FCN(R1) ; DIAGNOSTIC FUNCTION EXECUTED ? BNE DBDIAG ;IF NE YESE$ BIT #60,(R2) ;POSITIONING FUNCTION? BEQ 80$ ;IF EQ YES BIT #TRE!MCPE,(R2) ;ANY ERRORS? BEQ 70$ ;IF EQ NOE. MOV RPWC(R2),R0 ;GET NEGATIVE WORDS REMAINING( MOV R0,SAVWC(R3) ;SAVE IT FOR LATER USE" CLR DLTWC(R3) ;ZERO DLT FLAG WORD TST RPCS2(R2) ;DATA LATE ERROR? BPL 35$ ;IF PL NOC: MOV R0,DLTWC(R3) ;YES, SAVE REAL NEGATIVE WORDS REMAINING* BNE 35$ ;IF NE WE HAD A PARTIAL TRANSFER8 MOV #-1,DLTWC(R3) ;DLT ON LAST WORD, FAKE A PARTIAL XFR'35$: ASL R0 ;CONVERT TO NEGATIVE BYTES;6 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED* SUB #512.,R0 ;SUBTRACT OUT BLOCK IN ERROR) BLE 40$ ;IF LE NO GOOD BYTES TRANSFERED01 BITB #ERL,U.CW2+1(R5);ERROR ALREADY IN PROGRESS?S BEQ 40$ ;IF EQ NO;R:; WE GOT AN ERROR BUT SOME GOOD DATA WAS TRANSFERED. THIS6; INDICATES THAT WE RECOVERED FROM THE PREVIOUS ERROR.;A" CALL DBERL ;FINISH ERROR LOGGING#40$: CALL $DVERR ;LOG DEVICE ERRORM, BISB #ERL,U.CW2+1(R5);SET ERROR LOGGED FLAG, MOV #IE.WLK&377,R0 ;ASSUME WRITE LOCK ERROR& BIT #WLE,RPER1(R2) ;WRITE LOCK ERROR? BNE 60$ ;IF NE YES/ MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERROR4' BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?T BNE 60$ ;IF NE YES% TST DLTWC(R3) ;REAL DATA LATE ERROR?  BNE 110$ ;IF NE YES 1 MOV RPER1(R2),R1 ;GET CONTENTS OF ERROR REGISTERN. BIT #UNS!IAE!AOE!RMR!ILR!ILF,R1 ;HARD ERROR? BNE 60$ ;IF NE YES$ BIT #NED!NEM,RPCS2(R2) ;HARD ERROR? BNE 60$ ;IF NE YES$ BIT #HCE,R1 ;HEADER COMPARE ERROR?& BNE 25$ ;IF NE YES, DO A RECALIBRATE8 BIT #WCE!UPE!PGE!MXF!MDPE,RPCS2(R2) ;CONTROLLER ERROR?( BNE DBRTRY ;IF NE YES, RETRY OPERATION! JMP DBECC ;CHECK FOR ECC ERRORS.7DBDIAG: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASKT" CALL DBCLR ;CLEAR SELECTED DRIVE60$: JMP DBFIN ;FINISH I/OR+70$: JMP DBWCHK ;GO TEST FOR A WRITE CHECK;T ; PROCESS POSITIONING OPERATION.;R380$: MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERRORH. BIT #ERR,RPDS(R2) ;ERRORS DURING POSITIONING? BEQ 85$ ;IF EQ NO? CALL $DVERR ;LOG IT " CLR R1 ;SHOW NO BYTES TRANSFERED JMP DBFIN1 ;FINISH I/O(85$: BIT #10,(R2) ;RECALIBRATE FUNCTION? BNE 95$ ;IF NE NOE190$: BIT #PIP,RPDS(R2) ;IS THE RECAL REALLY DONE?A BNE 90$ ;IF NE NO, LOOP FOR IT# BR DBRTRY ;NOW RETRY THE FUNCTION0295$: CMP #OFFTB+16,OFFAD(R3) ;FINAL OFFSET TRIED? BEQ 60$ ;IF EQ YES'100$: CALL DBCLR ;CLEAR SELECTED DRIVE' CALLR DBUBMP ;RETRY ORIGINAL FUNCTIONA;R>; THE TRANSFER WAS STOPPED DUE TO A DATA LATE ERROR CONDITION.>; WE WILL NOW BACKUP THE WORD COUNT, BUS ADDRESS AND CYLINDER/?; TRACK/SECTOR ADDRESS BY ONE BLOCK AND RETRY THE TRANSFER FROMF>; THIS POINT. THIS IS DONE TO PREVENT THE DATA LATE CONDITION(; FROM RECURRING DUE TO A LONG TRANSFER.; 0110$: DECB RTTBL(R3) ;RETRY DATA LATE CONDITION? BLE 60$ ;IF LE NO)4 MOV DLTWC(R3),R0 ;GET REAL NEGATIVE WORDS REMAINING# ASL R0 ;CONVERT TO NEGATIVE BYTESL6 ADD U.CNT(R00…ºy�yt´cÚµcÛ¶c�·c›’5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED- BIC #777,R0 ;GET BLOCKS ACTUALLY TRANSFEREDO0 CALL DBCALC ;BACKUP TO START OF BLOCK IN ERROR( TST U.CNT(R5) ;DLT ERROR ON LAST BLOCK? BNE 100$ ;IF NE NO0 ADD R0,U.CNT(R5) ;YES, BACKUP BYTES TO TRANSFER BR 100$ ;RESTART THE TRANSFER .DSABL LSBI;+@; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING REPEATEDC; UNLESS THE OPERATION WAS DIAGNOSTIC. TIMEOUTS ARE USUALLY CAUSEDEC; BY POWERFAILURE BUT MAY ALSO BE THE RESULT OF A HARDWARE FAILURE.);- .ENABL LSBS7DBOUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP?T BEQ 15$ ;;;IF EQ NOC/ BIT #S2.MAD,S.ST2(R4) ;;;MULTI-ACCESS DEVICE?R BEQ 10$ ;;;IF EQ NOL. CMP S.KRB(R4),S.KTB(R4) ;;;IS THIS PORT 'A'?) BNE 5$ ;;;IF NE NO, IT MUST BE PORT 'B'S4 BITB #S3.SPA,S.ST3(R4) ;;;IS PORT 'A' SPINNING UP? BNE 10$ ;;;IF NE YES( BR 15$ ;;;TIMEOUT FOR NORMAL OPERATION75$: BITB #S3.SPB,S.ST3(R4) ;;;IS PORT 'B' SPINNING UP?  BEQ 15$ ;;;IF EQ NO 110$: DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET?. BEQ 15$ ;;;IF EQ YES MTPS #0 ;;;ALLOW INTERRUPTSS. MOV S.PKT(R4),R3 ;RETREIVE I/O PACKET ADDRESS JMP DBRQC ;RETRY OPERATION,15$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY MTPS #0 ;;;ALLOW INTERRUPTS?) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSS3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER?) MOV S.KRB(R4),R2 ;GET CURRENT KRB ADDRSSU- MOVB K.CON(R2),R3 ;RETREIVE CONTROLLER INDEXR MOV (R2),R2 ;GET CSR ADDRESS: MOVB U.UNIT(R5),RPCS2(R2) ;SELECT UNIT FOR ERROR LOGGING! CALL $DVTMO ;LOG DEVICE TIMEOUTQ;S>; NOTE: THE FOLLOWING SIX INSTRUCTIONS (AND THE SUBROUTINE) DO4; NOT CHANGE THE C-BIT SETTING RETURNED FROM $DVTMO.;C2 BITB #SEL,U.CW2+1(R5);WAITING FOR PORT TO SELECT?) BNE DBFIN1 ;IF NE YES, WE DIDN'T GET ITO0 BITB #S3.SIP,S.ST3(R4) ;TIMEOUT DURING A SEEK? BEQ 20$ ;IF EQ NO$ CALL DBPRM ;RESET RETRY PARAMETERS;20$: BICB #S3.SIP,S.ST3(R4) ;ASSUME DATA TRANSFER FUNCTION2- BCS DBDIAG ;IF CS TIMEOUT DURING DIAGNOSTICR4 BITB #US.SPU,U.STS(R5) ;WAS THE DRIVE SPINNING UP? BEQ DBRTRY ;IF EQ NO- MOV #IE.DNR&377,R0 ;YES, SET DRIVE NOT READYU BR DBFIN ;FINISH I/O0DBRTRY: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS< BICB #ERL,U.CW2+1(R5) ;CAN'T CLOSE ERRORS RETRIED FROM BEG' BIT #WCE,RPCS2(R2) ;WRITE CHECK ERROR?. BEQ 25$ ;IF EQ NOU/ MOV #IE.WCK&377,R0 ;YES, SET WRITE CHECK ERRORR+25$: BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?, BNE DBFIN ;IF NE YES DECB RTTBL(R3) ;RETRY FUNCTION? BGT 40$ ;IF GT YES BR DBFIN ;FINISH I/O;.!; TEST FOR WRITE CHECK OPERATION.?;BCDBWCHK: BITB #IO.WLC&377,I.FCN(R1) ;WRITE FOLLOWED BY WRITE CHECK? BNE 30$ ;IF NE YES5 BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED BY MCR?C BEQ DBFIN ;IF EQ NON330$: CMPB #171,U.BUF(R5) ;WAS LAST FUNCTION A READ?  BEQ DBFIN ;IF EQ YES0 CMPB #161,U.BUF(R5) ;WAS LAST FUNCTION A WRITE? BNE DBFIN ;IF NE NO:0 MOV #RETRY,RTTBL(R3) ;REINITIALIZE RETRY COUNT" MUL #5,R3 ;CREATE INDEX INTO ...' ADD #PRMSV,R3 ;... PARAMETER SAVE AREAB* MOV (R3)+,U.BUF(R5) ;RESTORE PARAMETERS  MOV (R3)+,U.BUF+2(R5) ;... MOV (R3)+,U.CNT(R5) ;... MOV (R3)+,I.PRM+10(R1) ;...B MOV (R3)+,I.PRM+12(R1) ;...C. MOVB #151,U.BUF(R5) ;SET WRITE CHECK FUNCTION*40$: CALL DBCLR ;CLEAR THE SELECTED DRIVE/ CALLR DBUBMP ;START THE WRITE CHECK OPERATIONY .DSABL LSB1;F; **-DBFIN-FINISH I/O OPERATION;EB; THIS ROUTINE WILL SET THE ACTUAL BYTES TRANSFERED PARAMETER, THEA; ERROR LOGGING RETRY COUNTS AND CALL $IODON. THE SELECTED DRIVE <; IS RELEASED, IF REQUESTED, AND THE CONTROLLER IS RELEASED.;+ ; INPUTS:);.; R0=SUCCESS/ERROR CODE ; R2=ADDRESS OF CONTROLER CSR;; R4=ADDRESS OF THE SCB(; R5=ADDRESS OF THE UCBB;R/DBFIN: MOV S.PKT(R4),R3 ;GET I/O PACKET ADDRESSA1 MOV RPWC(R2),R1 ;GET WORDS REMAINING TO TRANSFERT+ ASL R1 ;CONVERT TO BYTES LEFT TO TRANSFERD8 ADD I.PRM+4(R3),R1 ;CALCULATE BYTES ACTUALLY TRANSFERED.DBFIN1: CALL DBCLR1 ;CLEAR THE SELECTED DRIVE( MOV #TRE,(R2) ;NOW CLEAR THE CONTROLLER- BICB #SEL,U.CW2+1(R5);CLEAR PORT SELECT FLAG,* MOV S.KRB(R4),R3 00…Ây…ytöt÷tø tþfDATA;GET CURRENT KRB ADDRESS;)); CHECK FOR ATTENTIONS AND RELEASE DRIVE.S; +10$: TSTB RPAS(R2) ;ANY ATTENTIONS PENDING?5 BEQ 20$ ;IF EQ NO4 BISB #IE,(R2) ;YES, FORCE CALL TO INTERRUPT HANDLER BR 10$ ;TRY AGAINE:20$: BITB #S3.NRL,S.ST3(R4) ;SHOULD WE RELEASE THE DRIVE? BEQ 30$ ;IF EQ YES- MOVB #IE,(R2) ;NO, JUST RE-ENABLE INTERRUPTSF BR 40$ ;<30$: BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED" MOVB #113,(R2) ;RELEASE THE DRIVE140$: MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEX / MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTO4 BITB #XCT,U.CW2+1(R5);HAS A FUNCTION BEEN EXECUTED? BNE 50$ ;IF NE YES' MOV #RETRY,R2 ;SET MAXIMUM RETRY COUNTF350$: BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNT5 BICB #S3.SIP,S.ST3(R4) ;RESET SEEK IN PROGRESS FLAGV+DBFIN2: CALL $RLCN ;RELEASE THE CONTROLLER # CALL $IODON ;FINISH I/O OPERATION;! JMP DBINI ;PROCESS NEXT REQUESTW;C!; **-DBECC-ATTEMPT ECC CORRECTION ;LD; THIS ROUTINE IS ENTERED IF A DATA ERROR IS DETECTED. IF THE ERRORG; IS CORRECTABLE, THE EXECUTIVE ECC ROUTINE IS CALLED AND THE OPERATIONSE; IS RESTARTED FROM WHERE THE CONTROLLER STOPPED. IF OFFSET RECOVERYA; IS REQUIRED, WE WILL DO IT.E;* ; INPUTS:R;S; R1=CONTENTS OF RPER1; R2=ADDRESS OF CONTROLLER CSR; .DBECC: BIT #DCK!DTE!HCRC,R1;CORRECTABLE ERROR? BEQ DBRTRY ;IF EQ NO/ CMPB #171,U.BUF(R5) ;IS THIS A READ OPERATION?N BNE DBRTRY ;IF NE NO4 MOV SAVWC(R3),R0 ;GET NEGATIVE # OF WORDS REMAINING ASL R0 ;CONVERT TO BYTES6 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED. BEQ DBOFF ;IF EQ NONE TRANSFERED, TRY OFFSET( BIS RPER2(R2),R1 ;.OR. ERROR REGISTER 2% CMP #DCK,R1 ;ONLY DATA CHECK ERROR?,! BNE DBOFF ;IF NE NO, TRY OFFSETS7 MOV SAVWC(R3),-(SP) ;PUT REMAINING WORD COUNT ON STACK) MOV RPEC1(R2),R1 ;GET ECC ERROR POSITIONL- MOV RPEC2(R2),R3 ;GET ECC CORRECTION PATTERNB' MOV (SP)+,R2 ;GET REMAINING WORD COUNTD CALL $ECCOR ;DO ECC CORRECTION" CALL DBCLR ;CLEAR SELECTED DRIVE/ CALL DBPRM0 ;RESET OFFSET RECOVERY PARAMETERSC( CALL DBCALC ;RE-CALCULATE DISK ADDRESS5 MOV #IS.SUC&377,R0 ;ASSUME NO MORE WORDS TO TRANSFER)+ TST U.CNT(R5) ;ANY MORE WORDS TO TRANSFER?L BEQ DBFIN ;IF EQ NOB+DBREST: CALLR DBINIO ;RESTART THE TRANSFERR;)"; **-DBOFF-ATTEMPT OFFSET RECOVERY;M=; THIS ROUTINE IS CALLED WHENEVER WE NEED TO OFFSET THE HEADST@; SOME DISTANCE FROM TRACK CENTERLINE TO PROPERLY READ THE DATA.;C ; INPUTS: ; 6; R0=NUMBER OF BYTES ACTUALLY TRANSFERED TO THIS POINT;B5DBOFF: BITB #OFA,U.CW2+1(R5) ;OFFSET ALREADY ACTIVE?R BNE 5$ ;IF NE YESE" DECB RTTBL(R3) ;ANY RETRIES LEFT? BGT 5$ ;IF GT YES), MOV #IE.VER&377,R0 ;SET UNRECOVERABLE ERROR JMP DBFIN ;FINISH I/O$5$: TST R0 ; ANYTHING TRANSFERRED ? BEQ 20$ ; NO0 BIT #ECH!DTE,RPER1(R2); HARD ECC OR DTE ERROR ? BEQ 15$ ; NO* DEC R0 ;BACK UP TO THE PREVIOUS BLOCK...) ; OR CURRENT IF NOT ON BLOCK BOUNDARY ) BIC #777,R0 ; FORCE TO A BLOCK BOUNDARYM! ; Z-BIT SET BY BIC IF R0 IS 0  BEQ 20$ ;IF EQ NOF;B@; THE TRANSFER ENDED IN AN ECC HARD ERROR BUT THERE WERE SECTORSE; TRANSFERED THAT CONTAINED GOOD DATA. SINCE THE ECC HARD ERROR COULDVA; HAVE BEEN CAUSED BY A CYLINDER CROSSING, THE GOOD DATA IS SAVEDS6; AND THE TRANSFER IS RETRIED FROM THE POINT OF ERROR.;T15$: (/ CALL DBPRM0 ;RESET OFFSET RECOVERY PARAMETERSC' CALL DBCALC ;CALCULATE NEW PARAMETERS $ TST U.CNT(R5) ;ERROR ON LAST BLOCK? BNE 20$ ;IF NE NOO0 ADD R0,U.CNT(R5) ;YES, BACKUP BYTES TO TRANSFER020$: BITB #OFA,U.CW2+1(R5) ;OFFSET MODE ACTIVE? BNE 30$ ;IF NE YES3 CALL DBPRM0 ;NO, RESET OFFSET RECOVERY PARAMETERST* BISB #OFA,U.CW2+1(R5) ;SET OFFSET ACTIVE#25$: MOV #117,R1 ;SET RTC FUNCTIONR( MOV #FMT22,R0 ;SET OFFSET VALUE TO ZERO BR 50$ ;; A; NO GOOD DATA WAS TRANSFERED - CHECK IF OFFSET SHOULD BE CHANGEDO;E=30$: BIT #DTE!ECH,RPER1(R2) ;DRIVE TIMING OR HARD ECC ERROR?  BNE 40$ ;IF NE YES6 BISB #IHC,U.CW2+1(R5);SET HEADER COMPARE INHIBIT FLAG%40$: DECB RTTBL+1(R3) ;CHANGE OFFSET?B BGT DBREST ;IF GT NO- DECB RTTBL(R3) ;COUNT EACH 00…Êy�yt´cÚµcÛ¶c�·c›’OFFSET AS A RETRY ( ADD #2,OFFAD(R3) ;UPDATE OFFSET POINTER) MOV @OFFAD(R3),R0 ;GET NEXT OFFSET VALUEC% BEQ 25$ ;IF EQ RETURN TO CENTERLINEO" MOV #115,R1 ;SET OFFSET FUNCTION. MOVB #2,RTTBL+1(R3) ;SET RECOVERY RETRY COUNT( BIT #2,RPDT(R2) ;IS THIS DRIVE AN RP04? BEQ 50$ ;IF EQ YES0 ASRB R0 ;NO, IT'S AN RP06 SO ADJUST OFFSET ...- BIC #100,R0 ;... VALUE AND SIGN ACCORDINGLYT150$: MOV #TRE!11,(R2) ;CLEAR CONTROLLER AND DRIVE ( MOV R0,RPOF(R2) ;LOAD NEXT OFFSET VALUE3 BICB #IHC,U.CW2+1(R5);CLEAR HEADER COMPARE INHIBIT#6DBFUNC: MOVB S.ITM(R4),S.CTM(R4) ;RESET TIMEOUT COUNT! MTPS #PR5 ;;;DISABLE INTERRUPTSI( CLR S.FRK+2(R4) ;;;RESET FORK INTERLOCK- BIS #S2.ACT,S.ST2(R4) ;;;SHOW I/O IS ACTIVE * MOVB R1,(R2) ;;;INITIATE OFFSET FUNCTION MTPS #0 ;ENABLE INTERRUPTS RETURN ;A;06; **-DBERL-FINISH ERROR LOGGING FOR MID-TRANSFER ERROR;.@; THIS ROUTINE IS CALLED TO FINISH OFF THE ERROR LOGGING PROCESS8; DURING MID-TRANSFER IF WE HAVE SUCCESSFULLY RECOVERED.;C ; INPUTS:2;R; R3=CONTROLLER INDEX ;I#DBERL: MOV R2,-(SP) ;SAVE REGISTERS  MOV R1,-(SP) ;U/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTK/ BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNT2, MOV #IS.SUC&377,R0 ;RECOVERY WAS SUCCESSFUL+ CALL $FNERL ;FINISH ERROR LOGGING PROCESS MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R2 ;R( ;FALL THRU AND RESET RECOVERY PARMS.;R#; SET RECOVERY AND RETRY PARAMETERSR;L3DBPRM: MOV #RETRY,RTTBL(R3);SET INITIAL RETRY COUNTS?DBPRM0: MOVB #16.,RTTBL+1(R3) ;SET FOR 16. TIMES AT CENTERLINE7DBPRM1: MOV #OFFTB,OFFAD(R3) ;SET OFFSET TABLE POINTER1 BICB #OFA,U.CW2+1(R5) ;RESET OFFSET ACTIVE FLAGB RETURN ;.;M*; **-DBCALC-CALCULATE UPDATED DISK ADDRESS; ?; THIS ROUTINE WILL CALCULATE THE NEW DISK AND BUFFER ADDRESSESC3; BASED ON THE NUMBER OF BYTES ACTUALLY TRANSFERED. ; ; INPUTS:H;A ; R0=BLOCKS ACTUALLY TRANSFERED.; ; OUTPUTS:;T; R0=UNCHANGED IF U.CNT(R5)=0V#; I.PRM+10(R1)=NEW CYLINDER ADDRESSO'; I.PRM+12(R1)=NEW TRACK SECTOR ADDRESS ; <DBCALC: SUB R0,U.CNT(R5) ;REDUCE BYTES REMAINING TO TRANSFER BEQ 30$ ;IF EQ NO BYTES LEFT3 ADD R0,U.BUF+2(R5) ;UPDATE STARTING BUFFER ADDRESS0 ADCB U.BUF+1(R5) ;AND THE MEMORY EXTENSION BITS2 BIT #FE.EXT,$FMASK ;IS 22-BIT ADDRESSING ENABLED? BEQ 5$ ;IF EQ NO' MOV S.KRB(R4),R1 ;RETREIVE KRB ADDRESSN: BIT #KS.MBC,K.STS(R1) ;IS THIS A 22-BIT MASSSBUS DEVICE? BNE 5$ ;IF NE YEST& ADD K.OFF(R1),R1 ;POINT TO UMR AREA+2) ADD R0,-(R1) ;CALCULATE NEW REAL ADDRESSR ADCB -(R1) ;... 15$: MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESST1 SWAB R0 ;CALCULATE NUMBER OF SECTORS TRANSFERED ASR R0 ;1 ADD I.PRM+12(R1),R0 ;UPDATE TRACK/SECTOR ADDRESSC# TST -(SP) ;GET A WORKING REGISTERO110$: CLR (SP) ;CLR THE WORKING REGISTER FOR LOOPN$ CMPB U.PRM(R5),R0 ;SECTOR OVERFLOW? BHI 20$ ;IF HI NO ( MOVB U.PRM(R5),(SP) ;COPY SECTORS/TRACK1 SUB (SP),R0 ;SUBTRACT A TRACKS WORTH OF SECTORSA ADD #1*256.,R0 ;ADD IN A TRACKA+ MOV U.PRM(R5),(SP) ;GET TRACKS AND SECTORSR) CLRB (SP) ;ISOLATE ONLY TRACKS/CYLINDER; CMP (SP),R0 ;TRACK OVERFLOW? BHI 10$ ;IF HI NOM& SUB (SP),R0 ;NORMALIZE TRACK ADDRESS* INC I.PRM+10(R1) ;UPDATE CYLINDER ADDRESS BR 10$ ;:20$: MOV R0,I.PRM+12(R1) ;SET UPDATED TRACK/SECTOR ADDRESS TST (SP)+ ;PRUNE STACK30$: RETURN ;0;T(; **-DBVV-PROCESS VOLUME VALID FUNCTIONS;RB; HERE WE WILL PROCESS VOLUME VALID FUNCTIONS. IF THE FUNCTION ISC; RESET VOLUME VALID WWE WILL FORCE AN UNLOAD OF THE DRIVE. IF THE B; FUNCTION IS SET VOLUME VALID, WE WILL SET THE HARDWARE "VV" BIT.A; IF THE FUNCTION IS A VOLUME VALID NOP, WE WILL SIZE THE DISK BY06; PASSING THE CONTROLLER REGISTERS BACK TO THE CALLER.;D ; INPUTS:; ; R4=ADDRESS OF THE SCB.; R5=ADDRESS OF THE UCB/;T8DBVV: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER- MOV #IS.SUC&377,R0 ;SET SUCCESSFUL OPERATION( MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS, MOVB U.UNIT(R5),RPCS2(R2) ;SELECT THE UNIT. MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS MOVB #111,(R2) ;CLEAR THE DRIVE* BIT #NED,RPCS2(R2) 00…Òy…ytöt÷tø tþfDATA;DOES THE DRIVE EXIST? BEQ 5$ ;IF EQ YES ! TST I.PRM+2(R1) ;SIZE THE DISK ?0 BMI 4$ ;IF MINUS THEN YESG CALL $DVERR ;LOG THE ERROR4$: ;REFFERENCE LABEL2 MOVB #TRE/256.,RPCS1+1(R2) ;CLEAR THE CONTROLLER( MOV #IE.SZE&377,R0 ;UNABLE TO SIZE UNIT) BICB #US.VV,U.STS(R5);RESET VOLUME VALIDE JMP DBFIN2 ;EXIT#5$: TST I.PRM+2(R1) ;SIZE THE DISK?S BPL 10$ ;IF PL NOC2 CALL $CRPAS ;PASS CONTROLLER REGISTERS TO CALLER BR 15$ ;010$: BIT #VV$SET,I.PRM+2(R1) ;SET VOLUME VALID? BEQ 30$ ;IF EQ NOH7 MOV RPDS(R2),R1 ;GET CONTENTS OF DRIVE STATUS REGISTERI COM R1 ;TOGGLE THEM ) BIT #MOL!DRY,R1 ;DRIVE READY AND ONLINE?E BNE 20$ ;IF NE NOR( MOVB #23,(R2) ;ISSUE PACK ACK TO SET VV15$: JMP DBFIN1 ;EXIT320$: MOV #IE.DNR&377,R0 ;DRIVE NOT READY ERROR CODEU) BICB #US.VV,U.STS(R5);RESET VOLUME VALID; BR 15$ ;EXIT030$: BIT #VV$UNL,I.PRM+2(R1) ;UNLOAD THE DRIVE? BEQ 15$ ;IF EQ NOO+ BIT #PIP,RPDS(R2) ;IS THE DRIVE IN MOTION?:- BNE 15$ ;IF NE YES, IT'S PROBABLY UNLOADINGB% MOVB #3,(R2) ;ISSUE UNLOAD FUNCTIONE BR 15$ ;;V$; **-DBCLR-CLEAR DRIVE OR SUB-SYSTEM?; **-DBCLR1-ALTERNATE ENTRY TO CLEAR DRIVE W/O INTERRUPT ENABLEE;RC; ISSUE A DRIVE CLEAR FUNCTION UNLESS THE SELECTED DRIVE/CONTROLLER0'; IS HUNG, THEN ISSUE SUB-SYSTEM CLEAR.R;C ; INPUTS: ;.; R2=CSR ADDRESS; R5=UCB ADDRESS;5 ; OUTPUTS:;B; SELECTED DRIVE IS CLEAREDA;H .ENABL LSB1+DBCLR: TSTB (R2) ;IS THE CONTROLLER READY?I BPL 10$ ;IF PL NO1 BIT #1,(R2) ;IS GO BIT SET?N BNE 10$ ;IF NE YES& MOVB #111,(R2) ;NO, ISSUE DRIVE CLEAR RETURN ;AND EXITR,DBCLR1: TSTB (R2) ;IS THE CONTROLLER READY? BPL 10$ ;IF PL NOO BIT #1,(R2) ;IS GO BIT SET?  BNE 10$ ;IF NE YES% MOVB #11,(R2) ;NO, ISSUE DRIVE CLEAR RETURN ;AND EXIT ;Y; NOTE:R;@; THE FOLLOWING INSTRUCTION WILL CAUSE ALL I/O ON OTHER UNITS TOD; ABORT. THIS IS OK BECAUSE THE TIMEOUT FACILITY SHOULD CATCH THEM.;R.10$: BIS #40,RPCS2(R2) ;ISSUE SUB-SYSTEM CLEAR0 MOVB U.UNIT(R5),RPCS2(R2) ;RE-SELECT THE DRIVE RETURN ;AND EXIT2 .DSABL LSBD;+'; **-DBCHK-VALIDATE AND CONVERT THE LBN(; 9; THIS ROUTINE IS CALLED FROM $DRQRQ TO DO LBN PROCESSINGR9; FOR DEVICES WHICH SUPPORT QUEUE OPTIMIZATION. IF BLKC2;9; DETECTS AN ERROR IT WILL RETURN TO THE CORRECT PLACE INR; $DRQRQ AFTER CALLING $IOALT.;I ; INPUTS:L;O; R1=I/O PACKET ADDRESSR; R5=UCB ADDRESS;E ; OUTPUTS:;C4; IF THE CHECKS SUCCEEDS, THEN THE LBN IN THE PACKET=; IS REPLACED BY THE CYLINDER/TRACK/SECTOR. R1 IS PRESERVED.T;E:; IF THE CHECKS FAILS, THEN $IOALT IS ENTERED WITH A FINAL8; STATUS OF IE.BLK AND A RETURN TO THE CORRECT PLACE IN ; $DRQRQ IS EXECUTED.N;O;S<; NOTE: ALL FUNCTIONS PUT INTO THE DRIVER QUEUE ARRIVE HERE.3; THESE INCLUDE IO.ATT, IO.DET, AND ACP FUNCTIONS.P;-;DBCHK: MOV I.FCN(R1),-(SP) ;PUT THE FUNCTION ONTO THE STACKI& CMPB #IO.ATT/256.,1(SP) ;IS IT ATTACH% BEQ 15$ ;IF EQ YES - LEAVE IT ALONEE' CMPB #IO.DET/256.,1(SP) ;IS IT DETACHA% BEQ 15$ ;IF EQ YES - LEAVE IT ALONES) BIC #7,(SP) ;CLEAR THE SUBFUNCTION BITSE- CMP #IO.STC,(SP) ;IS IT SET CHARACTERISTICS?E% BEQ 15$ ;IF EQ YES - LEAVE IT ALONEI TST (SP)+ ;CLEAN THE STACK) CALL $BLKC2 ;CHECK LOGICAL BLOCK NUMBERI+ CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBERT3 MOV R2,I.PRM+10(R3) ;SAVE DESIRED CYLINDER ADDRESSN" SWAB R1 ;SWAP TRACK TO HIGH BYTE$ BIS R1,R0 ;MERGE TRACK WITH SECTOR; MOV R0,I.PRM+12(R3) ;SAVE DESIRED TRACK AND SECTOR ADDRESSO' MOV R3,R1 ;RESTORE THE PACKET ADDRESS 10$: RETURN ;EXIT 15$: TST (SP)+ ;CLEAN THE STACK BR 10$ ;AND EXIT .END(SP) ;IS IT SET CHARACTERISTICS?E% BEQ 15$ ;IF EQ YES - LEAVE IT ALONEI TST (SP)+ ;CLEAN THE STACK) CALL $BLKC2 ;CHECK LOGICAL BLOCK NUMBERI+ CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBERT3 MOV R2,I.PRM+10(R3) ;SAVE DESIRED CYLINDER ADDRESSN" SWAB R1 ;SWAP TRACK TO HIGH BYTE$ BIS R1,R0 ;MERGE TRACK WITH SECTOR; MOV R0,I.PRM+12(R3) ;SAVE DESIRED TRACK AND SECTOR ADDRESSO' MOV R3,R1 ;RESTORE THE PACKET ADDRESS 10$: RETURN ;EXIT 15$: TST (SP)+ ;CLEAN THE S00†Úy�yt´cÚµcÛ¶c�·c›’ .TITLE EXDBTR .IDENT /08.01/E; 7; COPYRIGHT (C) 1987 BY DIGITAL EQUIPMENT CORPORATIONU; ALL RIGHTS RESERVED.;I>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; D. N. CUTLER 7-DEC-74I ;V+ ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ;; B. S. MCCARTHY;&; MODIFIED FOR RSX-11M-PLUS V2.1 BY:;U; B. S. MCCARTHY;-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:.; ; J. C. FRANZINI; B. S. MCCARTHY;-; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY: ;R$; B. S. MCCARTHY 25-DEC-86 08.00; 6; BM377 -- MOVE DRDSP TO DIR11M (DO YOU BELIEVE IT?&; THEY MADE ME WORK ON CHRISTMAS.); ; ; K. L. NOEL 10-FEB-87 08.01;R6; KLN018 -- Add support for XDT on KXJ-11 processor;H; THIS IS A VERSION OF ODT THAT MAY BE USED TO DEBUG RSX-11M EXECUTIVEI ; MODULES. IT IS AN OUTGROWTH OF THE STANDARD RSX-11 ODT WHICH WAS PRO-Y&!; DUCED BY M. SMITH , H. LEV ET. AL.";T#; MACRO LIBRARY CALLSR$;1%& .MCALL HWDDF$ & .MCALL CPRDF$ ; KLN018&' HWDDF$ ;DEFINE HARDWARE REGISTERS3' CPRDF$ ;DEFINE CPR SPECIFIC SYMBOLS ; KLN018E();C*; EQUATED SYMBOLS +; ,'-BPT=3 ;BREAKPOINT INSTRUCTION CODE1).BKP=16 ;NUMBER OF BREAKPOINTS -1 X 2r,/LPB=177516 ;LINE PRINTER BUFFER REGISTER,0LPS=177514 ;LINE PRINTER STATUS REGISTER21RLR=16 ;NUMBER OF RELOCATION REGISTERS -1 X 212TBT=20 ;T-BIT MASK FOR PROCESSOR STATUS WORD.63TKB=177562 ;CONSOLE TERMINAL INPUT BUFFER REGISTER64TKS=177560 ;CONSOLE TERMINAL INPUT STATUS REGISTER75TPB=177566 ;CONSOLE TERMINAL OUTPUT BUFFER REGISTERS76TPS=177564 ;CONSOLE TERMINAL OUTPUT STATUS REGISTER6TPR0=0 ; KLN0186TPR1=2 ; KLN0186TPR2=4 ; KLN0186TPR3=6 ; KLN01878;F9; LOCAL MACROS:;5;; DECODE NEXT COMMAND <;T=> .MACRO DECODE? IOT@ .ENDMAB;1 C; ERROR=D; EF .MACRO ERRORSG EMT 0H .ENDMIJ;2K; TEST MODE FOR EXEC OR USERL;IMN .MACRO TESTM ADDRO JSR R5,TESTMT P .WORD ADDRRQ .ENDMRS;OT; TYPE OUT CHARACTER(S)RU;S@V; TYPE OUT IS EFFECTED WITH A TRAP INSTRUCTION WITH THE BOTTOMW; BYTE ENCODED AS FOLLOWS:X; #Y; 300 = OUTPUT BOTH BYTES IN R0. !Z; 200 = OUTPUT LOW BYTE IN R0.&[; 340 = OUTPUT A SEQUENCE."\; 240 = OUTPUT A SEQUENCE.];E:^; ALL OTHER COMBINATIONS ARE TREATED AS THE ACTUAL BYTE_; TO OUTPUT.E`a .MACRO TYPE ARGb .IF IDN ,C c TRAP 200Id .IFF.e .IF IDN , f TRAP 300.g .IFFRh .IF IDN , i TRAP 340Aj .IFFk .IF IDN ,F l TRAP 240 m .IFFRn TRAP ARG&177Oo .ENDCp .ENDCq .ENDCr .ENDCs .ENDMt Tu .PAGE*v .SBTTL MULTIPROCESSOR LOADABLE XDT NODEwx; Ky; THIS IS A COPY OF THE PROTOTYPE NODE IN XDTINI. IT MUST BE KEPT IN SYNCz; WITH THAT COPY.A{; |} .IF DF L$$XDT&M$$PROE~+$XDTND:: ; PROTOTYPE CODE START ADDRESSF€.PROTO/�.AISA5: .WORD 0 ; ADDRESS OF APR5 (PSEUDO D)<&‚.XDTA5: .BLKW 1 ; XDT APR5 CONTENTS3ƒ.KISA5: .BLKW 1 ; SAVED APR5 CONTENTS DURING XDT<;„.KINA5: .BLKW 1 ; SAVED I-SPACE APR5 CONTENTS DURING XDTC<….VECTR: .WORD V$$CTR+4 ; HIGHEST VECTOR ADDRESS (DEFAULTED† ; TO ASSEMBLY VALUE)‡2ˆ.RTN: MOV .KINA5,@#KINAR5 ; RESTORE I SPACE APR5:‰ MOV .KISA5,@.AISA5 ; RESTORE D SPACE APR5 IF NECESSARY5Š.RTNI: RTI ; EXIT TO EXEC (MAY BE CHANGED TO RTI):‹3Œ.CRSH: MOV .KINA5,@#KINAR5 ; RESTORE I SPACE APR5W:� MOV .KISA5,@.AISA5 ; RESTORE D SPACE APR5 IF NECESSARYŽ JMP @#0 ; JUMP TO CRASHB+�.CRADD = .-2 ; ADDRESS OF CRASH ADDRESSK�)‘.ODDA: CMP SP,.VECTR ; STACK OVERFLOW ?R’ BLO .SOVFL ; IF LO YES1“ JSR R5,.COMMN ; ODD ADDRESS OR OTHER TRAP FOUR ” .WORD 0&•.SGMT: JSR R5,.COMMN ; SEGMENT FAULT – .WORD 20—.BPTI: JSR R5,.COMMN ; BREAKPOINTS,T-BIT TRAPS ˜ .WORD 4.™.IOTX: JSR R5,.COMMN ; IOT INSTRUCTION TRAPS00†ây…ytöt÷tø tþfDATA š .WORD 69›.ILLI: JSR R5,.COMMN ; ILLEGAL INSTRUCTION TRAPS (->10)R œ .WORD 10I"�.NEMT: JSR R5,.COMMN ; EMT TRAPS ž .WORD 12/Ÿ JMP @#0 ; ALWAYS ALLOW EXEC TO HANDLE TRAPSA+ .TRADD = .-2 ; ADDRESS OF CRASH ADDRESS, ¡ .WORD 08¢.FPPE: JSR R5,.COMMN ; 11/40 FLOATING POINT EXCEPTIONS £ .WORD 16E¤.¥.COMMN: MOV (R5),R5 ; GET SST VECTOR OFFSET*¦ MOV @#KINAR5,.KINA5 ; SAVE I SPACE APR56§ MOV @.AISA5,.KISA5 ; SAVE D SPACE APR5 IF NECESSARY0¨ MOV .XDTA5,@#KINAR5 ; MAP INTO XDT IN I SPACE<© MOV .XDTA5,@.AISA5 ; MAP INTO XDT IN D SPACE IF NECESSARY*ª ADD #SSTVC1,R5 ; POINT TO EXEC SST ADDR« MOV (R5),R5 ; AND GET IT¬ RTS R5 ; AND OFF TO XDT !H1­.SOVFL: MOV @#KINAR5,.KINA5 ; SAVE I SPACE APR5D6® MOV @.AISA5,.KISA5 ; SAVE D SPACE APR5 IF NECESSARY0¯ MOV .XDTA5,@#KINAR5 ; MAP INTO XDT IN I SPACE<° MOV .XDTA5,@.AISA5 ; MAP INTO XDT IN D SPACE IF NECESSARY4± JMP @#SOVFL ; JUMP TO STACK OVERFLOW ENTRY POINT²,³.PLENG = . - .PROTO ; LENGTH OF DSR BLOCK´µ .ENDC ; DF L$$XDT&M$$PROA¶ .PAGE·¸ .IF DF X$$DBT¹º .SBTTL LOCAL DATA»;1¼; LOCAL DATA½;S¾; CONTEXT VARIABLES H¿; THE ORDER OF THESE ITEMS IS INTENTIONAL, SEE REGISTER MAPPING SCHEMEÀ;AÁ3ÂINTBEG =. ;STARTING ADDRESS OF INTERNAL REGISTERSRÃÄUR0: 0 ;USER R0 $0Å 0 ; R1 $1Æ 0 ; R2 $2Ç 0 ; R3 $3È 0 ; R4 $4É 0 ; R5 $5ÊUSP: 0 ;USER SP $6ËUPC: $INITL ;USER PC $7.ÌUST: PR7 ;USER PS $S!ÍARG: 0 ;ARGUMENT REGISTER $ARÎLOW: 0 ;LOW LIMIT $LÏHI: 0 ;HIGH LIMIT $H%ÐCNST: $XDT ;CONSTANT REGISTER $CO"ÑQUAN: 0 ;QUANTITY REGISTER $Q ÒFORM: 0 ;FORMAT REGISTER $FÓÔ;PÕ; INTERNAL TABLESÖ;B×1ØINTINX =. ;STARTING ADDRESS OF INTERNAL TABLESRÙÚ;S<Û; BREAKPOINT CONTROL LISTS, AND EXTRA SLOT FOR SINGLE STEPÜ; Ý-ÞADR1: ;ADDRESS OF THE BREAKPOINT ($0B-$7B)55ß .WORD TRTC,TRTC,TRTC,TRTC,TRTC,TRTC,TRTC,TRTC,TRTC$àáCT: ;PROCEED COUNT ($0G-$7G):â .WORD 1,1,1,1,1,1,1,1,1ã1äUIN: ;USER INSTRUCTION SAVE LOCATION ($0I-$7I)H,å .WORD BPT,BPT,BPT,BPT,BPT,BPT,BPT,BPT,BPTæç;Qè; RELOCATION REGISTERSé; ê%ëRELT: ;RELOCATION TABLES ($0R-$7R)N ì .WORD -1,-1,-1,-1,-1,-1,-1,-1í4îINTEND=.-2 ;END OF INTERNAL REGISTERS AND TABLESïð;N"ñ; EXEC SST TRAP VECTOR ADDRESSESò;PFó; THIS TABLE IS READ/WRITE AND THERE IS ONE SUCH TABLE PER PROCESSORô;Cõ5öSSTVEC: + ODDA ;0-ODD ADDRESS, OR HALT, VECTOR @4O÷ + SGMT ;1-SEGMENT FAULTø + BPTI ;2-T-BIT OR BPTEù + IOTX ;3-IOT.ú + ILLI ;4-RESERVED OR ILLEGAL INSTRUCTIONû + NEMT ;5-EMT6ü + $TRTRP ;6-TRAP (EXECUTIVE ALWAYS HANDLES TRAPS)ýþ;TGÿ; WORDS AND ORDERED BYTES, ITEMS MUST BE KEPT FROM COMMAND TO COMMANDN;I3CAD: .WORD 0 ;ADDRESS OF CURRENTLY OPEN REGISTER 7DOT: .WORD 0 ;ADDRESS OF LAST EXPLICITLY OPENED CELLT-BW: .WORD 0 ;LAST OPEN MODE 1=BYTE, 2=WORD=OPN: .WORD 0 ;LOCATION OPEN FLAG 0=NOT OPEN, NON-ZERO=OPENG(D.ARGS: .WORD 0 ;SEMI COLON PUSH WORD;@ ; THE FOLLOWING ITEMS NEED NOT BE KEPT FROM COMMAND TO COMMAND1 ; THEIR ORDER IS INTENTIONAL SO KNOW THY MAKER!I ;W + OP: .BYTE 0 ;CURRENT ARITHMETIC OPERATORE$SMFD: .BYTE 0 ;SEMI-COLON COUNTER"EXP: .WORD 0 ;EXPRESSION BUCKET2OUTB: .WORD TPB ;CONSOLE PRINTER BUFFER ADDRESS3OUTS: .WORD TPS ;CONSOLE PRINTER STATUS REGISTERW)PPC: .BLKW 1 ;SAVED PC LAST BREAKPOINT .IF DF M$$PRO6STENB: .BLKW 1 ;USED TO REENABLE SANITY TIMER IF IT' ;WAS ENABLED WHEN XDT WAS ENTEREDL .ENDC3 .IF DF C$$XDJ ;XDT SUPPORTED ON KXJ ; KLN018T ; KLN018<KXJNOT: .WORD 0 ;EQ 1 IF HOST IN ATTACHED MODE ; KLN018. ;EQ 0 IF HOST IN NOT ATTACHED ; KLN018 ; KLN018  .ENDC ; C$$XDJ ; KLN018;U=; THE FOLLOWING ITEMS MUST BE KEPT FROM COMMAND TO COMMAND.E ;! "T: .BYTE 0 ;T BIT IN USE FLAG"#P: .BYTE -1 ;PROCEED ALLOW FLAG;$S: .BYTE 0 ;SINGLE INSTRUCTION MODE, 00†êy�yt´cÚµcÛ¶c�·c›’0=NORMAL, >0=ENABLEW<%FM: .BYTE 2 ;OUTPUT FORMAT MODE, BYTE, WORD, ANSII, RAD50/&OBW: .BYTE 2 ;OPEN CELL TYPE, 1=BYTE, 2=WORD+'SEQ: .BYTE 0 ;CHANGE SEQUENCE INDICATIORI()* .IF DF K$$DAS+=,DMODE: .BYTE 'D,40 ;MODE FLAG (I OR D) AND SPACE CHARACTER 8-REGFL: .BYTE 0 ;REGISTER BEING DISPLAYED FLAG (1=YES)+.REGSV: .BYTE 0 ;SAVED REGFL FOR CHAININGN/0 .ENDC123 .EVEN45;T76; THE BELOW LOCATION IS USED IN BREAKPOINT PROCESSING:7;E8"9TRTC: BPT ;TRACE TRAP PROTOTYPE:;;W:<; ALL XDT TYPE ERRORS JUST GO TO "ERR" OR SOMEWHERE ELSE=;> ?SSTXDT: + ERR ;0-ODD ADDRESS@ + ERR ;1-SEGMENT FAULTA'A + ERR ;2-BPT OR T-BIT ("MCR" CALL)DB + DCD ;3-IOT ("DECODE")-C + ERR ;4-RESERVED OR ILLEGAL INSTRUCTIOND + ERR ;5-EMT ("ERROR")EE + TYPE ;6-TRAP=FG;EH; SST VECTOR ADDRESS TABLEI;NJKSSTADR: .WORD 4 ;ODD ADDRESSL .WORD 250 ;SEGMENT FAULTM .WORD 14 ;BPTPN .WORD 20 ;IOT!O .WORD 10 ;ILLEGAL INSTRUCTIONOP .WORD 30 ;EMTQ .WORD 34 ;TRAPRS; -T; INTERNAL REGISTER NAME AND CONTROL TABLES U;RV; NON-INDEXED REGISTER NAMESW;NX<YNIXMAP: .ASCII /01234567/ ;USER REGISTER NAMES FOR MAPPINGZ$[NIXREG: .BYTE 'S ;UST USER STATUS\ .BYTE 'A ;ARG ARGUMENT ] .BYTE 'L ;LOW LOW SCAN LIMIT ^ .BYTE 'H ;HI HIGH SCAN LIMIT_ .BYTE 'C ;CNST CONSTANT` .BYTE 'Q ;QUAN QUANTITY!a .BYTE 'F ;FORM FORMAT CONTROL.b .BYTE 0 ;END OF THIS LISTOcd;Oe; INDEXED REGISTER NAMESf;.g(hINXREG: .BYTE 'B ;ADR1 BKPT ADDRESSES$i .BYTE 'G ;CT BKPT PROCEED COUNTS(j .BYTE 'I ;UIN BKPT USER INSTRUCTIONS'k .BYTE 'R ;RELT RELOCATION REGISTERS7l .BYTE 0 ;END OF THIS LISTImn; o; INDEXED REGISTER TABLE BASESp;.qr .EVEN)sINXTBL: .WORD ADR1 ;BKPT ADDRESS TABLE!t .WORD CT ;BKPT PROCEED COUNTS!u .WORD UIN ;BKPT'D INSTRUCTIONE!v .WORD RELT ;RELOCATION TABLES;8w .WORD INTEND+2 ;END OF TABLE AREA FOR ADDRESS MAPPINGxy; z; CHARACTER CONVERSION LISTS.{;R|5}ALTTAB: .BYTE 033,175,176 ;ALTERNATE ALT-MODE FORMSR!~ .BYTE 0 ;END OF THIS LIST TOOT€;T$�; COMMAND NAME AND DISPATCH TABLES‚;Iƒ*„COMTAB: ;ADDRESS OF THE CHARACTER TABLE…†;E8‡; OPEN REGISTER COMMANDS (ORDER AND POSITION CRITICAL)ˆ;D‰Š .BYTE '\,'/,'','",'%.‹Œ;;�; CLOSE REGISTER COMMANDSDŽ; �� .BYTE 015,012,'^,'_,'@,'>,'<;‘’;N“; SPECIAL FORMSI”;+•– .BYTE '$,'=,'C,'Q,'.E—˜;G'™; OPERATORS (ORDER OF -+* IS CRITCAL)Sš;›œ .BYTE ';,'-,'+,'*,',7�ž;T Ÿ; COMMANDS ;M¡¢ .ASCII /BGKLOPRSX/S£¤¥ .IF DF K$$DAS¦2§ .ASCII /ID/ ;INSTR MODE AND DATA MODE COMMANDS¨© .ENDCª«,¬ .BYTE 0 ;******* END OF THE LIST *******­ .EVEN®¯;N.°; THE DISPATCH TABLE, ORDERED ON ABOVE TABLE±;²; OPEN REGISTER COMMANDS³;´*µCOMDIS: .WORD OCBYTE ;\ OPEN OCTAL BYTE#¶ .WORD OCWORD ;/ OPEN OCTAL WORD#· .WORD ANBYTE ;' OPEN ANSII BYTE #¸ .WORD ANWORD ;" OPEN ANSII WORD&¹ .WORD MODULO ;% OPEN RADIX 50 WORDº»; ¼; CLOSE REGISTER COMMANDS ½;O¾/¿ .WORD CLCRET ; CLOSE, NO SUCESSIVE OPEN 'À .WORD CLLNFD ; CLOSE, OPEN NEXT(Á .WORD CLUPAR ;^ CLOSE, OPEN PREVIOUS0 .WORD CLBACK ;_ CLOSE, OPEN PC RELATIVE MODE(à .WORD CLATSG ;@ CLOSE, OPEN INDIRECT3Ä .WORD CLGRTH ;> CLOSE, OPEN PC OFFSET AS BRANCHR,Å .WORD CLLSTH ;< CLOSE, OPEN OLD SEQUENCEÆÇ;OÈ; SPECIAL FORMSDÉ;TÊ-Ë .WORD REGT ;$ INTERNAL REGISTER REFERENCES,Ì .WORD EQUALS ;= PRINT LEFT SIDE IN OCTAL.Í .WORD CHRCEE ;C CONSTANT REGISTER CONTENTS.Î .WORD CHRQUE ;Q QUANTITY REGISTER CONTENTS2Ï .WORD CHRDOT ;. LAST OPENED LOCATION'S ADDRESSÐÑ;U Ò; OPERATORSOÓ;RÔ-Õ .WORD SEMI ;; MULTIPLE ARGUMENT DELIMITER Ö .WORD MINS ;- SUBTRACTION, × .WORD PLUS ;+ .WORD ADDITION Ø .WORD STAR ;* MULTIPLY BY 50$Ù .WORD COMM ;, RELOCATION COMPUTEÚÛ; Ü; COMMANDSÝ;AÞ)ß .WORD SEBK ;B SET / CLEAR BREAKPOINTSR#à .WORD00†òy…ytöt÷tø tþfDATA GOTO ;G GO TO USER'S DATA;2á .WORD KILO ;K KOMPUTE AND TYPE RELOCATION DATA1â .WORD LIST ;L LIST MEMORY ON SPECIFIED DEVICEY*ã .WORD OFST ;O TYPE PC RELATIVE OFFSETS)ä .WORD PROC ;P PROCEED FROM BREAKPOINTP2å .WORD RELO ;R SET / RESET RELOCATION REGISTERS.æ .WORD SNGL ;S SET / RESET SINGLE STEP MODE'ç .WORD EXIT ;X EXIT TO CRASH ROUTINEDèéê .IF DF K$$DASë/ì .WORD INSTM ;I SWITCH TO INSTR DISPLAY MODEO.í .WORD DATAM ;D SWITCH TO DATA DISPLAY MODEîï .ENDCð Oñ .SBTTL INITIALIZATIONò;+(ó; **-$XDT - RSX-11M-PLUS EXECUTIVE ODTô;-õ ö .ENABL LSB;<÷$XDT:: MOV #PR7,PS ;LOCK OUT INTERRUPTS, CURR=PREV=KERNEL(ø MOV SP,USP ;SAVE ENTRY STACK POINTER.ù MOV #USP,SP ;SET NEW STACK POINTER ADDRESS*ú MOV R5,-(SP) ;SAVE REGISTERS R5 THRU R0û MOV R4,-(SP) ;Eü MOV R3,-(SP) ;Iý MOV R2,-(SP) ; þ MOV R1,-(SP) ;ÿ MOV R0,-(SP) ;# MOV PC,SP ;CHANGE STACK POINTERS5 MOV #SSTADR,R0 ;POINT TO TRAP VECTOR ADDRESS TABLEO1 MOV #SSTXDT,R1 ;POINT TO XDT TRAP VECTOR TABLE910$: MOV (R1)+,@(R0)+ ;INSERT XDT TRAP VECTOR ADDRESSES.# CMP R1,#SSTADR ;ANY MORE TO SET?C BLO 10$ ;IF LO YES .IF DF M$$PRO )  CMP #$INITL,UPC ;SYSTEM BOOTED BEFORE?T1  BEQ 20$ ;NO, ALWAYS PROMPT (CANNOT USE $XDTFLE+  ;OR $XDTPR BECAUSE D-SPACE NOT SET UPV%  ;IF THIS IS AN I/D SPACE SYSTEMV2 BIS $CPBIT,$XDTFL ;SHOW THIS CPU AS INITIALIZED) BIT $CPBIT,$XDTPR ;WANT AN XDT PROMPT?T BNE 20$ ;YES( JMP LEAVE ;NO, JUST RETURN TO CALLER 20$: ;A .IF DF K$$DAS1 CALL SETRW ;SET I-SPACE DESCRIPTOR REGS TO RWS .ENDC .ENDC MOV PC,SP ;LENGTHEN STACK 9 TYPE CRLF ;PLACE TERMINAL CARRIAGE IN PROPER POSITIONB&  TYPE 'X ;OUTPUT XDT IDENTIFICATION ! TYPE 'D ;O " TYPE 'T ;E # TYPE ': ;T $ TYPE 40 ; +% MOV $SYSID,R0 ;GET SYSTEM IDENTIFICATIONX,& TYPE R0+R0 ;OUTPUT SYSTEM IDENTIFICATION5' MOV $SYSID+2,R0 ;GET SECOND HALF OF IDENTIFICATIONJ( TYPE R0+R0 ;OUPUT IT, TOO !L9) TYPE CRLF ;PLACE TERMINAL CARRIAGE IN PROPER POSITIONR* DECODE ;GET FIRST COMMAND,+XDTSTK: ;REF LABEL - START OF XDT STACK, - .DSABL LSBE./0 .IF DF M$$PRO1.2$XDTIN:: ;INITIALIZE XDT FOR THIS PROCESSO93 BIT $CPBIT,$XDTFL ;THIS PROCESSOR ALREADY INITIALIZED? 4 BEQ 10$ ;NOT 5 RETURN ; 9610$: MOV (SP)+,UPC ;RETURN TO CALLER WHEN DONE WITH XDTR 7 BR $XDT ;E89 .ENDC: =; .SBTTL "$," PROCESSOR - INTERNAL REGISTER MAPPER0< =;SYNTAX--O$>;$L DELIVER INTERNAL ADDRESS OF L(?;$NL DELIVER INTERNAL ADDRESS OF L+2N2@;$N DELIVER INTERNAL ADDRESS OF USER REGISTER NA(B;SEE MAPPING TABLES, RANGE OF N IS 0-7C*DREGT: JSR PC,GETNUM ;GET AN OCTAL NUMBER E JSR PC,RTST ;CHECK FOR ERROR'F BCC 5$ ;R4 HAS BEEN MULTIPLIED BY 4G3$: ERROR ;$H5$: TST R2 ;SEE IF ANYTHING TYPED.I BNE 10$ ;IF SO IS INDEXED OR USER REGISTER$J JSR R5,LOOKUP ;SEE IF NON-INDEXED K + NIXREG-L BCS 12$ ;NON-INDEXED TURNS INTO A COMMANDN.M MOV R1,R4 ;PLACE IN LIST IS INTERNAL ORDER3N ADD #UST,R4 ;GET ADDRESS IN R4, GOTTA READ CHARR O BR 20$D$P10$: JSR R5,LOOKUP ;SEE IF INDEXED Q + INXREGR BCC 15$ ;WAS TRULY INDEXED7S12$: CMP #7+7,R4 ;INTERNAL USER REGISTER RANGE CHECKK T BLO 3$0U ADD #UR0,R4 ;SET ACCESS TO R0-R7 OF THE USER$V BR 25$ ;AVOID READING OF COMMAND:W15$: ADD INXTBL(R1),R4 ;COMPUTE ADDRESS TO INDEXED TABLE.X20$: JSR PC,GET ;GET THE ASSUMED TERMINATOR0Y25$: INC R2 ;SHOW THEM THAT R4 GOT VALID DATAZ[\ .IF DF K$$DAS]*^ INCB REGFL ;SET FLAG FOR REGISTER OPEN_` .ENDCab.c JMP CLGL ;RE-USE CHARACTER, R2 IS NON-ZEROd D6e .SBTTL "K" PROCESSOR - COMPUTE AND PRINT RELOCATIONf g;SYNTAX--R+h;AK TYPE RELOCATION DEAL FROM DOT TO A+i;L;AK TYPE RELOCATION DEAL FROM L TO ARj1k;IF A IS NULL THE THE OLD BEST FIT RULE APPLIESB5l;TYPES =N,DDDDDD WHERE N IS THE RELOCATION REGISTERP%m; AND D-D IS THE RELOCATION BIAS5n+oKILO: TST R2 ;SEE WHO PICKS THE REGISTE00†úy�yt´cÚµcÛ¶c�·c›’R p BNE 10$q TST R3 ; ADDRESS SPECIFIED? r BNE 5$ ; YES(s MOV CAD,R4 ; NO, GET CURRENT ADDRESS t BR 7$ ;T3u5$: MOV R5,R4 ; GET ADDRESS SPECIFIED ON COMMANDO4v7$: JSR PC,LOCA ; GET CLOSEST RELOCATION REGISTER1w MOV R0,R4 ;DID WE FIND A RELOCATION REGISTER?P&x BMI ERR ;CAN'T FIND ONE THATS GOOD$y10$: BIC #177770,R4 ;EDIT REGISTERz TYPE '= ;OUTPUT CUED { TYPE 40 ;H#| MOVB R4,R0 ;TYPE REGISTER & A ,D} ADD #"0,,R0~ TYPE R0+R0 ;$ ASL R4 ;GO GET IT AS TABLE INDEX%€ TST R3 ;SEE WHO TYPED THE ADDRESSE � BNE 15$‚ MOV CAD,R5 ;THAT CAD!Rƒ15$: SUB RELT(R4),R5„ MOV R5,R0 ;BIAS COMPUTE … JSR PC,CADW ;PRINT AS WORD † DECODE‡ -ˆ .SBTTL "A-Q-." PROCESSORS - SPECIAL VALUES‰GŠ;MERELY SUBSTITUTE THE VALUE IN R4 WITH THE CONTENTS OF THE SPECIFIEDN ‹;REGISTER.Œ-�CHRQUE: MOV QUAN,R4 ;LAST QUANTITY PRINTEDO Ž BR CHR001)�CHRCEE: MOV CNST,R4 ;CONSTANT REGISTER � BR CHR001'‘CHRDOT: MOV CAD,R4 ;CURRENT LOCATIONO&’CHR001: INC R2 ;ALLOW AS R4 IS REAL-“ JSR PC,GET ;GET NEXT CHARACTER AND ASSUMER” BR CLGL ;IT IS A TERMINATOR4• .– .SBTTL COMMAND DECODER AND MAIN LOOP OF ODT—˜; COMMAND DECODER - ODT™'š; ALL REGISTERS MAY BE USED (R0-R5),›+œ;ERROR ENTRY, TYPE FLAG AND GO DO COMMANDH�*žERR: CALL SETCN ;SET OUTPUT FOR CONSOLE$Ÿ TYPE '? ;OUTPUT ERROR INDICATION ¡;1¢; DECODE FROM THE TOP, CLOSE ALL AND DO CR/LF/_S£;¤/¥DCD: MOV #XDTSTK,SP ;SET THE STACK FOR SANITYO&¦ CALL SETCN ;SET OUTPUT FOR CONSOLE9§ TYPE CRLF ;PLACE TERMINAL CARRIAGE IN PROPER POSITIONL!¨ CLR OPN ;SET NO LOCATION OPENB©ª« .IF DF K$$DAS¬(­ CLRB REGFL ;CLEAR REGISTER OPEN FLAG®¯ .ENDC°±&² TYPE 'X ;OUTPUT INPUT SOLICITATION ³ TYPE 'D ; ´ TYPE 'T ;Nµ TYPE 76 ;'>'¶*·;MAINTAIN OPENED LOCATION, RE-INIT INPUT¸/¹NEWC: CLRB SMFD ;CLEAR SEMI-COLON FLAG/COUNT (º CLR R3 ;ZERO SECONDARY ARGUMENT FLAG» CLR R5 ;AND ARGUMENT¼½;NEW SUB-EXPRESSION ENTRYE¾&¿NEWE: CLRB OP ;CLEAR OPERATOR FOUND3À CLR EXP ;SET ZERO IN EXPRESSION SO FAR LOCATIONOÁ'Â;GET NUMBER AND THEN SCAN FOR COMMAND Ã9ÄNEWN: JSR PC,GETNUM ;GET AN OCTAL NUMBER AND TERMINATORNÅ*Æ;NON-OCTAL CHAR TYPED WHAT ARE WE TO DO?Ç+ÈCLGL: JSR R5,LOOKUP ;GO SEE IF IT IS REAL' É + COMTAB ;THIS DEFINES REAL$Ê BCS ERR ;EASY ENOUGH IF NOT REAL&Ë TST R2 ;IF NOTHING TYPE BOTHER NOT!Ì BEQ CL01 ;WITH THE EXPRESSION$Í JSR PC,EXPCOM ;COMPUTE EXPRESSION-ÎCL01: JMP @COMDIS(R1) ;GO TO PROPER ROUTINEAÏ/Ð;FOR THE BENEFIT ALL REGISTERS ARE AS FOLLOWS Ñ/Ò;R0 LAST CHARACTER TYPED, THE COMMAND ITSELF! 3Ó;R1 TABLE INDEX TO COMMAND ADDRESSES, IT IS USED.B1Ô;R2,R4 FIRST ARGUMENT, IF R2<>0 THEN R4 IS DATAT2Õ;R3,R5 SECOND ARGUMENT, IF R3<>0 THEN R5 IS DATAÖ×;A)Ø; SET OUTPUT DEVICE TO CONSOLE TERMINALSÙ; Ú1ÛSETCN: MOV #TPB,OUTB ;SET OUTPUT BUFFER ADDRESSO+Ü MOV #TPS,OUTS ;SET OUTPUT STATUS ADDRESS Ý RETURN ;MÞ PBß .SBTTL "\-/-'-"-%-:" PROCESSOR - OPEN AND TYPE CONTENT COMMANDSà á;SYNTAX--T0â;NC OPEN LOC N IN MODE C, SET MODE FOR NEXT&ã;C TYPE LAST OPENED LOC IN MODE CäåOCWORD: ;OCTAL WORD - R1=2æANWORD: ;ANSII WORD - R1=6!çMODULO: ;RADIX 50 WORD - R1=10è1é;OPEN WORD MODE ENTRY, R1 CONTAINS FORMAT INDEXê)ë MOV #2,R0 ;SET BYTE FLAG TO WORD FLAG ì BR OPE004 ;GO TO IT ACE HOLEíîOCBYTE: ;OCTAL BYTE - R1=0ïANBYTE: ;ANSII BYTE - R1=4ð0ñOPE001: MOV #1,R0 ;SET WORD FLAG TO BYTE FLAGò0óOPE004: TST R2 ;IF NO VALUE TYPED NO MODE SET ô BEQ 10$(õ MOV R0,BW ;SET MODE AND FORMAT FLAGS'ö MOVB R0,OBW ;SET THE LATER USE MODE+÷ MOVB R1,FM ;SET THE MODE FLAG FOR SOOTH -ø MOV R4,CAD ;SET ADDRESS FOR EXPLICIT OPEN !ù MOV R4,DOT ;RESET RETURN PTR.Rúûü .IF DF K$$DASý)þ MOVB REGFL,REGSV ;INIT REGFL SAVE BYTEAÿ .ENDC%10$: CMP #1,R0 ;CHECK ON BYTE MODEY BEQ 15$ ;NOT BYTE MODE% BIT #1,CAD ;SEE IF ADDRESS IS ODD  BEQ 15$ ;ALL IS GOOD# CLR R1 ;THEY00†z…ytöt÷tø tþfDATA GET BYTE MODE ONLYE  BR OPE001' 15$: MOV R1,-(SP) ;SAVE FORMAT MAINLY   JSR PC,GETCAD ;GET THE DATA  MOV (SP)+,R1 ;GET FORMAT2  JSR PC,@TYFORM(R1) ;PRINT DATA IN PROPER FORMAT'  BR NEWC ;GO GETTA NEW COMMAND TO DO RD .SBTTL "-->-<-^-_-@" PROCESSOR - CLOSE AND OPEN REGISTERS;CARRIAGE RETURN'CLCRET: JSR PC,PUTCAD ;CLOSE LOCATION0 DECODE ;RETURN TO DECODER!;LESS THAN, BACK TO MAIN STREAM 2CLLSTH: INCB SEQ ;SET FLAG TO LATER RESTORE CAD;LINE FEED, NEXT ONE DOWN +CLLNFD: JSR PC,PUTCAD ;CLOSE PRESENT CELL% TSTB SEQ ;SHOULD CAD BE RESTORED?( BEQ OP5 ;BRANCH IF NOT* MOV DOT,CAD ;RESTORE PREVIOUS SEQUENCE !" .IF DF K$$DAS#*$ MOVB REGSV,REGFL ;RESTORE REGISTER FLAG%& .ENDC'(*) CLRB SEQ ;RESET FLAG; NO LONGER NEEDED * BR OP2A ;T(+OP5: ADD BW,CAD ;GENERATE NEW ADDRESS.,OP2: ;MOV CAD,DOT ;INITIALIZE DOT (REMOVED)5-OP2A: TYPE CRLF ;PLACE CARRIAGE IN PROPER POSITIONT. MOV CAD,R0 ;NUMBER TO TYPE/ JSR PC,RORA ; CHECK FORMAT0 MOVB FM,R0 ;SET FORMAT1 ASR R0 ;SPLIT R0 IN HALF+2 MOVB COMTAB(R0),R0 ;SET SUFFIX CHARACTER3 TYPE R0 ;PRINT CHARACTER4 MOV CAD,R4 ;SET UP THE DATA$#5 CLR R2 ; SET TO USE CAD ADDRESSE6 CLRB OP ;THIS IS BECUZE 7 CLR EXP/8 JMP CLGL ;R0 HAS TERMIN, R4- DATA, R2= FLAGA9:;UP ARROW, NEXT ONE UP;<CLUPAR: JSR PC,PUTCAD $= SUB BW,CAD ;GENERATE NEW ADDRESS> BR OP2 ;GO DO THE REST?"@;BACK ARROW, PC RELATIVE COMPUTEA0BCLBACK: JSR PC,TCLS ;TEST WORD MODE AND CLOSEC ADD R4,R2 ;COMPUTE D CMPB (R2)+,(R2)+ ;NEW ADDRESSEPCS: MOV R2,CAD ;UPDATE CADF BR OP2A ;GO FINISH UPTG&H;AT SIGN, ABSOLUTE OR INDIRECT CHAINI0JCLATSG: JSR PC,TCLS ;TEST WORD MODE AND CLOSE#K MOV R4,R2 ;GET ABSOLUTE ADDRESSG L BR PCSTM)N;GREATER THAN, PC OFFSET BRANCH ADDRESSXO&PCLGRTH: JSR PC,TCLS ;TEST AND CLOSE0Q MOVB R4,R1 ;COMPUTE NEW ADDRESS, EXTEND SIGNR ASL R1 ;R2=2@R2)S ADD #2,R1 ;+2ET ADD R1,R2 ; +PC U BR PCS V"W;HANDY DANDY TO DO SOME LEG WORKX)YTCLS: JSR PC,PUTCAD ;CLOSE CURRENT CELL%Z CMP #2,BW ;ONLY WORD MODE ALLOWEDA[ BNE ERR1 ;BRANCH IF ERRORN%\ MOV CAD,R2 ;CURRENT ADDRESS IN R2T%] MOV R2,DOT ;MARK CURRENT POSITIONO^_` .IF DF K$$DASa'b MOVB REGFL,REGSV ;SAVE REGISTER FLAGA(c CLRB REGFL ;CLEAR OPEN REGISTER FLAGde .ENDCfg h RTS PCi 3j .SBTTL "O" PROCESSOR - COMPUTE AND PRINT OFFSETS;k l;SYNTAX--#!m;AO TYPE OFFSETS FROM . TO A#n;L;AO TYPE OFFSETS FROM L TO ASo3p;TYPES _PPPPPP >DDDDDD WHERE P-P IS PC RELATIVEL q; AND D-D IS BRANCH OFFSETr(sOFST: TST R3 ;HOW ABOUT A VALUE OTHERt BNE 10$ ;THAN CADRu MOV CAD,R5 ;RELUCTANTLYAv10$: SUB R5,R42w SUB #2,R4 ;NO TRICKS, ODD AND NON-EXIST THINGS!x TYPE '_ ;TYPE PC RELATIVE CUEF y TYPE 40 ;R z MOV R4,R0'{ MOV R4,-(SP) ;GOOD IDEA TO SAVE THIS#| JSR PC,CADW ;TYPE VALUE + BLANKR#} TYPE 76 ;TYPE OFFSET BRANCH CUE ~ MOV (SP)+,R0R ASR R0 ;DIVIDE8€OF09: JSR PC,CADW ;16 BITS SO YOU CAN SEE HOW FAR OFF� DECODE ; GET NEXT COMMAND‚ Bƒ .SBTTL "=" PROCESSOR - PRINT LEFT SIDE EXPRESSION ON RIGHT SIDE„4…EQUALS: MOV R4,R0 ;PROPER PRIOR PLANNING PREVENTS† BR OF09 ;POOR PERFORMANCE ‡ˆ;JUST ANOTHER ERROR CALL‰ ŠERR1: ERRORT‹ C+Œ .SBTTL SST INTERRUPT VECTOR ENTRY POINTS�Ž;,,�; SEGMENT FAULT - V1 - "MP" - NO PROCEED�;P‘+’SGMT: TESTM $SGFLT ;TEST IF IN EXEC MODE )“ BIC #160000,SR0 ;UNFREEZE SEGMENT UNIT” MOV #"MP,EXP ;ENTRY PREFIXO • BR NIXP ;W–—;,˜; STACK OVERFLOW - - "SO" - NO PROCEED*™; ODD ADDRESS - V0 - "OD" - NO PROCEED&š; BPT - V2 - "BE" - SPECIAL CASES"›; T-BIT - V2 - "TE" - PROCEED œ; IOT - V3 - "IO" - PROCEED1�; RESERVED OR ILLEGAL - V4 - "IL" - NO PROCEEDCž;.Ÿ+ ODDA: MOV #"SO,EXP ;ASSUME STACK OVERFLOW,$¡ CMP SP,#V$$CTR+4 ;STACK OVERFLOW?¢ BLO NIXP ;IF LO YEST&£ TESTM $TRP04 ;TEST IF IN EXEC MODE"¤ MOV #"OD,EX00† z�yt´cÚµcÛ¶c�·c›’P ;"OD:" FOR ODD ONE¥ BR NIXP ;NIX ON PROCEEDY+¦BPTI: TESTM $TRACE ;TEST IF IN EXEC MODE ,§ MOV #"BE,EXP ;"BE:" FOR MAYBE A BAD ENTRY¨ CLRB P ;ALLOW PROCEED DEAL(© BR INTR ;SPECIAL NUMBER FOR THIS ONE+ªIOTX: TESTM $IOTRP ;TEST IF IN EXEC MODE « MOV #"IO,EXP ;"IO:" FOR IOTEE¬ BR ALOP ;ALLOW PROCEED+­ILLI: TESTM $ILINS ;TEST IF IN EXEC MODE;*® MOV #"IL,EXP ;"IL:" FOR ILL INSTRUCTION¯NIXP: MOVB #-1,P ;NO PROCEEDF ° BR INTR ;S±²; ³; EMT - V5 - "EM" - PROCEED$´; TRAP - V6 - "TR" - NO PROCEEDµ;O¶+·NEMT: TESTM $EMTRP ;TEST IF IN EXEC MODEC ¸ MOV #"EM,EXP ;"EM:" FOR EMTEE$¹ALOP: MOVB #BKP+2,P ;ALLOW PROCEEDº»;E+¼; COMMON INTERRUPT SERVICE AND DISPATCHER½;X¾5¿INTR: BIT #TBT,2(SP) ;T-BIT SET IN STACKED PS WORD?OÀ BEQ 1$ ;IF EQ NO*Á CMP PPC,(SP) ;PC CHANGE FROM LAST TRAP? BNE 1$ ;IF NE YES.à JMP RTN ;MUST HAVE HAD AN INTERRUPT BEFORE&Ä ;THE INSTRUCTION HAD A CHANCE TO%Å ;EXECUTE. AN INTERRUPT SERVICEP!Æ ;ROUTINE EXITS WITH AN RTI.O*Ç1$: MOV (SP)+,UPC ;SET THE USER PC VALUE&È MOV (SP)+,UST ;AND HIS ENTRY STATUS#É MOV R0,UR0 ;SAVE EXEC REGISTERS -Ê MOV #UR0+2,R0 ;POINT TO REGISTER SAVE AREAS*Ë MOV R1,(R0)+ ;SAVE REGISTERS R1 THRU SPÌ MOV R2,(R0)+ ; Í MOV R3,(R0)+ ;OÎ MOV R4,(R0)+ ;FÏ MOV R5,(R0)+ ;(Ð MOV SP,(R0)+ ; (Ñ MOV #XDTSTK,SP ;SET XDT STACK POINTERÒÓÔ .IF DF M$$PROÕ1Ö CLR -(SP) ;ASSUME SANITY TIMER IS NOT ENABLED8× BIT $CPBIT,$STENB ;SANITY TIMER ENABLED FOR THIS CPU?Ø BEQ 3$ ;NO Ù BIS $CPBIT,(SP) ;SAVE CPU BIT.Ú BIC (SP),$STENB ;WANT SANITY TIMER DISABLEDÛ CALL $STTIC ;;8Ü3$: MOV (SP)+,STENB ;SAVE POLARITY OF SANITY TIMER BITÝÞ .ENDCßà5á MOV #SSTADR,R0 ;POINT TO TRAP VECTOR ADDRESS TABLE1â MOV #SSTXDT,R1 ;POINT TO XDT TRAP VECTOR TABLE)2ã MOV #SSTVEC,R2 ;POINT TO TABLE OF TRAP CONTENTS5ä5$: MOV @(R0),(R2)+ ;SAVE THE CURRENT TRAP CONTENTSS2å MOV (R1)+,@(R0)+ ;SET XDT TRAP VECTOR ADDRESSES#æ CMP R1,#SSTADR ;ANY MORE TO SET?Tç BLO 5$ ;IF LO YESOèéê .IF DF K$$DASë1ì CALL SETRW ;SET KERNEL INSTRUCTION DESCRIPTORDí ;REGISTERS TO READ/WRITEîï .ENDCðñò;TRY AND FIND OUT WHAT TO DOó(ô TSTB P ;SEE IF CONTROLLED BREAKPOINT+õ BNE 10$ ;NOT DUE TO A PLANNED INTERRUPTP/ö TSTB T ;IS A BPT OR T-BIT, SEE IF A PROCEED 1÷ BNE TBIT ;COMMAND IS BEING DONE, GO FINISH ITR-ø TSTB S ;NO REMOVAL OF BREAKS ON S.I. MODE1 ù BNE 12$ ;SKIP NEXT TWO WORDSúû;ü; REMOVE EXEC BREAKPOINTSSý;þ/ÿ10$: MOV #ADR1,R4 ;POINT TO BREAKPOINT VECTOR .IF DF K$$DAS411$: MOV UIN-ADR1(R4),-(SP) ;PUSH CORRECT CONTENTS* MTPI @(R4)+ ;REINSERT CORRECT CONTENTS .IFF9 11$: MOV UIN-ADR1(R4),@(R4)+ ;REINSERT CORRECT CONTENTST   .ENDC  ) CMP #ADR1+BKP,R4 ;ANY LEFT TO RESTORE?R BHIS 11$ ;IF HIS YES512$: MOV UPC,R5 ;GET A COPY OF THE PC AT INTERRUPTL% TSTB P ;BREAKPOINT OR T-BIT CHECKS( BNE 30$ ;DEFINITELY NOT A BREAKPOINT% MOVB S,R4 ;SEE IF SINGLE STEPPING# BNE 22$ ;AND PRETEND0;AT THIS POINT IT MAY BE DUE TO T-BIT OR A BPT+ MOVB #BKP+2,P ;SET ALLOW TO THE 8'TH ONE  .IF DF K$$DAS4 MFPI -(R5) ;GET TRAPPED INSTRUCTION FROM I-SPACE CMP (SP)+,TRTC ;IS IT A BPT?  .IFF!/" CMP -(R5),TRTC ;BACK-UP R5 AND SEE WHAT'S UPI#$ .ENDC%&#' BEQ 30$ ;IT WAS A NON-BREAK BPTC,( MOV #BKP,R4 ;SET ADDRESS OF LEGIT BREAKS/)15$: CMP R5,ADR1(R4) ;LOOK IT UP IN THE TABLET** BEQ 20$ ;FOUND THE NASTY LITTLE BUGGER+ SUB #2,R4 ;KEEP AT IT, BGE 15$ ;UNLESS NO MOREE/- MOV #"TE,R4 ;NOT THERE, MUST BE T-BIT ERRORO(. TST (R5)+ ;RESET PC TO MAKE IT RIGHT/ BR 26$ ;LABOR5-020$: MOV R5,UPC ;BACK-UP PC FOR BREAKPOINTP+122$: MOVB R4,P ;BREAKPOINT IS A REAL ONE+2 DEC CT(R4) ;CHECK OUT THE PROCEED COUNTU&3 BNE 31$ ;LABOR ON A MIS-CONCEPTION#4 INC CT(R4) ;RESET PROCEED COUNT4$5 ASR R4 ;OCTAL TO UN-BIASED ASCII6 ADD #"0B,R4 ;BIAS TO ASCII%726$: MOV R4,EXP ;SET TH00†z…ytöt÷tø tþfDATAE PREFIX UPY8.9;COMMON TYPE ROUTINE FOR SST VECTORS USED UP:4;30$: TYPE CRLF ;PLACE CARRIAGE IN PROPER POSITION< MOV EXP,R0 ;THE PREFIX= TYPE R0+R0 ; > TYPE ': ; (? MOV R5,R0 ;TYPE ADDRESS OF INTERRUPT*@ JSR PC,RORA ;AND THE REST OF THE ENTRY A DECODER"B31$: JMP C990 ;BRANCH STRETCHERC R=D .SBTTL "G, S, P" PROCESSORS - GO, SINGLE STEP, AND PROCEED(E;;!F; "G" PROCESSOR - GO TO PROGRAMC G;SYNTAX--S#H;LG START PROGRAM AT LOCATION LC"I;G START PROGRAM AT CURRENT PCJ(KGOTO: TST R2 ;SEE IF SPECIFIC ADDRESSL BEQ 10$ ;NOM MOV R4,UPC ;SET THE PC&N10$: CLRB S ;NO SINGLE INSTRUCTIONS"OTBIT: CLRB T ;CLEAR T-BIT FLAGSP BIS #TBT,UST ;BOTH0&Q TSTB S ;SEE IF WE NEED A T-BIT BITR BNE GRTT ;NO GO ON S BIC #TBT,UST ;SET THE TEE BITTU;NV; SET EXEC BREAKPOINTSW;GX/Y10$: MOV #ADR1,R4 ;POINT TO BREAKPOINT VECTORZ[\ .IF DF K$$DAS]-^20$: MFPI @(R4) ;SAVE CONTENTS OF LOCATIONT_ MOV (SP),UIN-ADR1(R4) ;-` MOV TRTC,(SP) ;PUSH BREAKPOINT INSTRUCTIONI+a MTPI @(R4)+ ;SET BREAKPOINT INSTRUCTIONRbc .IFFHd8e20$: MOV @(R4),UIN-ADR1(R4) ;SAVE CONTENTS OF LOCATION"f MOV TRTC,@(R4)+ ;SET BREAKPOINTgh .ENDCij .IF DF M$$PROkl BIT #1,SR0 ;MAPPING ENABLED+m BEQ 24$ ;IF EQ NO, CAN'T GET TO LOWCR'S no .IF DF K$$DASp(q BIT #4,SR3 ;KERNEL D-SPACE ENABLED ?+r BEQ 24$ ;IF EQ NO, CAN'T GET TO LOWCR'Sst .ENDC ; DF K$$DASu.v MOV KISAR6,-(SP) ;SAVE CURRENT EXEC MAPPING'w MOV R0,-(SP) ;AND A SCRATCH REGISTERI=x MOV UIN-ADR1(R4),-(SP) ;FETCH USER INSTRUCTION FOR UPDATES*y MOVB $NCPU,R0 ;GET NUMBER OF PROCESSORS%z ASL R0 ;AND CONVERT TO WORD INDEX 3{21$: MOV $K6TAB-2(R0),KISAR6 ;REMAP TO NEXT LOWCR2| MOV (SP),140000+UIN-ADR1(R4) ;STUFF INSTRUCTION%} SUB #2,R0 ;POINT BACK TO NEXT CPU ~ BGT 21$ ;IF GT THERE IS ONEL% TST (SP)+ ;GET RID OF INSTRUCTIONN)€ MOV (SP)+,R0 ;RESTORE SCRATCH REGISTER 1� MOV (SP)+,KISAR6 ;RESTORE CURRENT EXEC MAPPINGM‚24$:ƒ„ .ENDC ; DF M$$PRO…(† CMP #ADR1+BKP,R4 ;ANY MORE TO INSERT?‡ BHIS 20$ ;IF HIS YESˆ‰GRTT:VŠ‹Œ .IF DF K$$DAS�$Ž BIT #1,SR0 ;MAPPING ENABLED YET?� BEQ LEAVE ;IF EQ NOA.� BIT #4,SR3 ;KERNEL DATA SPACE ENABLED YET?‘ BEQ LEAVE ;IF EQ NOU4’ MOV #KINDR0,R0 ;POINT TO KERNEL INSTR DESCR REG 0+“25$: BIC #4,(R0)+ ;SET RO ACCESS FOR EXECP” CMP R0,#KINDR7 ;DONE YET?• BLOS 25$ ;IF LOS NOS–— .ENDC˜™+šLEAVE: CLR OPN ;CLEAR LOCATION OPEN FLAGM5› MOV #SSTADR,R0 ;POINT TO TRAP VECTOR ADDRESS TABLEP2œ MOV #SSTVEC,R1 ;POINT TO EXEC TRAP VECTOR TABLE.�30$: MOV (R1)+,@(R0)+ ;SET EXEC TRAP VECTORS3ž CMP R0,#SSTADR+ ;ANY MORE TO SET?QŸ BLO 30$ ;IF LO YES ¡¢ .IF DF M$$PRO£1¤ BIS STENB,$STENB ;POSSIBLY ENABLE SANITY TIMERT¥¦ .ENDC§3§ .IF DF C$$XDJ ;XDT SUPPORTED ON KXJ ; KLN018P§ ; KLN0186§ BIT #4,SR3 ;IS KERNEL D SPACE ENABLED? ; KLN018D§ BEQ 40$ ;IF EQ NO, THIS MUST BE VIRGIN BOOT NOT ON KXJ ; KLN0180§ BIT #F5.XDJ,$FMSK5 ;XDT ON KXJ? ; KLN018"§ BEQ 40$ ;IF EQ NO ; KLN018§ ; KLN0180§ MOV $KXPTR,R0 ;GET ADDRESS OF DCB ; KLN0183§ MOV D.UCB(R0),R0 ;GET ADDRESS OF UCB ; KLN0183§ MOV U.SCB(R0),R0 ;GET ADDRESS OF SCB ; KLN018S3§ MOV S.KRB(R0),R0 ;GET ADDRESS OF KRB ; KLN018D4§ MOV K.CSR(R0),R0 ;GET ADDRESS OF TPR0 ; KLN0184§ MOV #RI$XDD,TPR2(R0) ;XDT DETACH CODE ; KLN0188§ MOV $KXVC1,R1 ;GET ADDRESS OF FIRST VECTOR ; KLN0183§ ADD #4,R1 ;GET ADDRESS OF XDT VECTOR ; KLN018D5§ MOV R1,@#KXJQIR ;NOTIFY HOST OF DETACH ; KLN0180§ ; KLN0189§ CLR KXJNOT ;KEEP TRACK OF DETACH OURSELVES ; KLN018V>§35$: TST TPR2(R0) ;HOST RECEIVED DETACH MESSAGE? ; KLN018"§ BNE 35$ ;IF NE NO ; KLN018§ ; KLN018 § .ENDC ; C$$XDJ ; KLN018§ ; KLN018§40$: ; KLN018¨#© MOV #UR0+2,R0 ;POINT TO SAVED R1 5ª MOV (R0)+,R1 ;RESTORE REGISTERS R1 THRU SP THEN R0T« MOV (R0)+,R2 ;¬ MOV (R0)+00†z�yt´cÚµcÛ¶c�·c›’,R3 ;A­ MOV (R0)+,R4 ;R® MOV (R0)+,R5 ;V¯ MOV (R0)+,SP ;Y° MOV UR0,R0 ;"± MOV UST,-(SP) ;SET EXEC PS WORD"² MOV UPC,-(SP) ;SET EXEC PC WORD%³ MOV (SP),PPC ;SET PREVIOUS PC WORD0!´RTN: RTT ;RETURN TO EXECUTIVE µ¶;'·; "S" PROCESSOR - SINGLE STEP PROCEED ¸;SYNTAX--8-¹;NS EXECUTE N INSTRUCTIONS AND THEN STOP º;S EXECUTE ONE INSTRUCTION8»&¼SNGL: MOVB #BKP+2,R0 ;FAKE THE BREAK)½ MOVB R0,S ;SET THE FLAG FOR S.I. MODES(¾ BR PR01 ;FAKE A PROCEED IN S.I. MOOD¿À;+Á; "P" PROCESSOR - PROCEED FROM BREAKPOINTV Â;SYNTAX---Ã;NP PROCEED THRU THIS BREAKPOINT N TIMES Ä;P ASSUME N=1ÅÆPROC: CLRB S ;SET FAST MODE"Ç MOVB P,R0 ;GET NUMBER OF BREAK'È BMI PR02 ;THERE WASN'T ONE SO FAR ?S*ÉPR01: TST R2 ;SEE IF VALUE IN R4 VIA R2.Ê BNE 10$ ;SEE IF AND WHAT SETTING FOR COUNT)Ë MOV #1,R4 ;INIT IT TO ONE FOR A START&Ì10$: MOV R4,CT(R0) ;SET USER'S COUNT1ÍC990: CMPB P,#BKP ;SEE IF A REAL ONE OR A FAKERÎ BGT TBIT ;BRANCH IF FAKE*Ï TSTB S ;SEE IF SINGLE INSTRUCTION MODEÐ BNE TBIT ;IF SO EXIT NOWÑ INCB T ;SET T-BIT FLAGÒ BIS #TBT,UST ;SET T-BIT Ó BR GRTTÔPR02: ERROR ;ANNOUNCE ERROREÕ M=Ö .SBTTL "L" PROCESSOR - LIST MEMORY ON THE SPECIFIED DEVICES× Ø;SYNTAX-- 6Ù; D;S;FL WHERE D IS DEV, <> OR 0 = CONSOLE, 1 = LPT+Ú; S IS START ADDRESS, SETS $L IF THEREI*Û; F IS STOP ADDRESS, SETS $H IF THEREÜ+ÝLIST: TST R2 ;SET UPPER AND LOWER LIMITSF"Þ BEQ 10$ ;IF SPECIFIED TO DO SO ß MOV R4,HIà10$: TST R3 ;DO THE LOW ONE á BEQ 15$ â MOV R5,LOW .ã15$: CMPB #2,SMFD ;SEE IF AN EXTRA ARGUMENTä BNE 17$ ;USE THE CONSOLE$å TST D.ARGS ;LOOK AT THE ARGUMENTæ BEQ 17$ ;DO NOT ARGUEC<ç MOV #LPS,OUTS ;SET OUTPUT STATUS REGISTER TO LINE PRINTERè MOV #LPB,OUTB ;é TYPE 14 ;OUTPUT A FORM FEEDL-ê17$: MOV LOW,R5 ;GET STARTING DUMP ADDRESSI&ë MOVB OBW,R0 ;GET ADDRESS INCREMENT0ì SUB R0,R5 ;BIAS ADDRESS BY ADDRESS INCREMENT#í MOV R5,CAD ;SET CURRENT ADDRESS 'î TST -(SP) ;MAKE A HOLE IN THE STACKLï20$: CLR (SP) ;NEW LINE UPO(ð JSR PC,SNAGIT ;ACCESS DEVICE FOR DATA.ñ JSR PC,SPRINT ;PRINT ADDRESS AND FIRST ITEM#ò25$: JSR PC,SNAGIT ;GET MORE DATA1%ó JSR PC,DPRINT ;JUST PRINT THE DATAEô INC (SP) ;COUNT THE DATA õ CMP #7,(SP) ;CHECK THE COUNT+ö BNE 25$ ;JUST LIKE THEY TOLD YOU AT THEW%÷ BR 20$ ;FAMOUS PROGRAMMERS SCHOOLVø ,&ù .SBTTL "X" PROCESSOR - EXIT COMMANDú;Aû; EXIT COMMANDü;C ý; SYNTAX Xþ;AKÿ; THE EXIT COMMAND IN XDT EFFECTS A JUMP TO THE EXECUTIVE $CRASH ROUTINE.R; EXIT: ;REFERENCE LABEL;3 .IF DF C$$XDJ ;XDT SUPPORTED ON KXJ ; KLN018N ; KLN0186 BIT #4,SR3 ;IS KERNEL D SPACE ENABLED? ; KLN018D BEQ 10$ ;IF EQ NO, THIS MUST BE VIRGIN BOOT NOT ON KXJ ; KLN0180 BIT #F5.XDJ,$FMSK5 ;XDT ON KXJ? ; KLN018" BEQ 10$ ;IF EQ NO ; KLN018 ; KLN0180 MOV $KXPTR,R0 ;GET ADDRESS OF DCB ; KLN0183 MOV D.UCB(R0),R0 ;GET ADDRESS OF UCB ; KLN018I3 MOV U.SCB(R0),R0 ;GET ADDRESS OF SCB ; KLN018R3 MOV S.KRB(R0),R0 ;GET ADDRESS OF KRB ; KLN018D4 MOV K.CSR(R0),R0 ;GET ADDRESS OF TPR0 ; KLN0184 MOV #RI$XDD,TPR2(R0) ;XDT DETACH CODE ; KLN0188 MOV $KXVC1,R1 ;GET ADDRESS OF FIRST VECTOR ; KLN0183 ADD #4,R1 ;GET ADDRESS OF XDT VECTOR ; KLN018D5 MOV R1,@#KXJQIR ;NOTIFY HOST OF DETACH ; KLN01809 CLR KXJNOT ;KEEP TRACK OF DETACH OURSELVES ; KLN018D>35$: TST TPR2(R0) ;HOST RECEIVED DETACH MESSAGE? ; KLN018" BNE 35$ ;IF NE NO ; KLN018 ; KLN018  .ENDC ; C$$XDJ ; KLN018 ; KLN01810$: ; KLN018 .IF DF C$$CDA# MOV #UR0+2,R0 ;POINT TO SAVED R1T5 MOV (R0)+,R1 ;RESTORE REGISTERS R1 THRU SP THEN R0F MOV (R0)+,R2 ;0  MOV (R0)+,R3 ;G  MOV (R0)+,R4 ;E  MOV (R0)+,R5 ;  MOV (R0)+,SP ;O  MOV UR0,R0 ;5 MOV UST,$CRUST ; MOVE USER PS FOR THE CRASH MODULER5 MOV UPC,$CRUPC ; MOVE USER PC FOR THE CRASH MODULE 7 JMP $CRALT ; ALTERNATE ENTRY POINT TO THE CRAS00†"z…ytöt÷tø tþfDATAH MODL .IFF ; DF C$$CDA8+ HALT ;HALT SYSTEM (MOSTLY USED IN P/OS  .ENDC ; DF C$$CDA . .SBTTL UTILITIES - COMMAND SUPPORT ROUTINES+;TEST FOR VALID RELOCATION REGISTER IN R4H7RTST: CMP #RLR/2,R4 ;GET A GOOD NUMBER FOR A REGISTERV& BLO 10$ ;NOT TOO GOOD, QUESTION IT  ASL R4O 10$: RETURN ;!&";SNAG MEMORY LOCATION JSR PC,SNAGIT# $;NEEDS--5%;CAD POINTS TO MEMORY WORD (APPROXIMATELY THAT IS)J2&;R0,R5 CONTAINS REAL WORD UPON EXIT TO "SRCHEK"')(SNAGIT: MOVB OBW,R0 ;SET THE INCREMENT !) ADD R0,CAD ;INCREMENT AND NOW!* CMP CAD,HI ;SEE IF MORE TO DOB+ BLOS 10$ ;IF NOT DO NOTR/, DECODE ;GO RESET STACK AND NO NEXT COMMANDS#-10$: JSR PC,GETCAD ;ACCESS METHOD $. MOV R0,R5 ;MAKE A COPY FOR LATER / RETURN ;T0#1;SEARCH HIT PRINT JSR PC,SPRINTR2&3;CAD POINTS TO THE LOC TO BE PRINTED94;R5 CONTAINS THE CONTENTS OF THE LOCATION TO BE PRINTEDA576SPRINT: TYPE CRLF ;PLACE CARRIAGE IN PROPER POSITIONT7 MOV CAD,R0 ;THE LOCATION8 JSR PC,RORA ;THE MODEN'9 MOVB FM,R0 ;PICK UP OLD CURENT MODE: ASR R0 ;HALVES; MOVB COMTAB(R0),R0 ;AH HA#< TYPE R0 ;TYPE THE MODE REGISTERT=%>;DATA PRINT ROUTINE JSR PC,DPRINTC?$@;PRINTS DATA IN R5 IN CURRENT MODEA#BDPRINT: MOVB FM,R1 ;SET THE MODEA$C MOV R5,R0 ;THIS IS THE POOR DATAD MOV R5,-(SP) ;SAVE THE DATA2E JSR PC,@TYFORM(R1) ;DO THAT __ TO THE POOR DATA!F MOV (SP)+,R5 ;RESTORE THE DATALG RTS PC ;RESTORE THE PCHIJ;'K; GET CHARACTER FROM CONSOLE TERMINALAL;EMMGET: ; KLN0184M .IF DF C$$XDJ ;XDT SUPPORTED ON KXJ ; KLN018M ; KLN0186M BIT #4,SR3 ;IS KERNEL D SPACE ENABLED? ; KLN018CM BEQ 5$ ;IF EQ NO, THIS MUST BE VIRGIN BOOT NOT ON KXJ ; KLN018P/M BIT #F5.XDJ,$FMSK5 ;XDT ON KXJ? ; KLN018T#M BNE 10$ ;IF NE YES ; KLN018 M ; KLN018"M .IFTF ; C$$XDJ ; KLN018M ; KLN018M5$: ; KLN018*M TSTB TKS ;CHARACTER READY? ; KLN018!M BPL 5$ ;IF PL NO ; KLN018A)P MOVB TKB,R0 ;READ INPUT BYTE ;**-2FP ; KLN018P .IFT ; C$$XDJ ; KLN018 P ; KLN018(P BR 15$ ;JOIN COMMON CODE ; KLN0189P10$: MOV $KXPTR,R0 ;GET ADDRESS OF KXJ DCB ; KLN018N3P MOV D.UCB(R0),R0 ;GET ADDRESS OF UCB ; KLN018 3P MOV U.SCB(R0),R0 ;GET ADDRESS OF SCB ; KLN018 3P MOV S.KRB(R0),R0 ;GET ADDRESS OF KRB ; KLN0184P MOV K.CSR(R0),R0 ;GET ADDRESS OF TPR0 ; KLN0182P MOV #100000,TPR3(R0) ;SET HIGH BIT ; KLN018?P MOV #RI$XDR,TPR2(R0) ;SET XDT READ FUNCTION CODE ; KLN018.P MOV R0,-(SP) ;SAVE TPR0 ADDRESS ; KLN0188P MOV $KXVC1,R0 ;GET ADDRESS OF FIRST VECTOR ; KLN0183P ADD #4,R0 ;GET ADDRESS OF XDT VECTOR ; KLN018X5P MOV R0,@#KXJQIR ;NOTIFY HOST OF DETACH ; KLN018 (P MOV (SP)+,R0 ;RESTORE R0 ; KLN0187P12$: TST TPR2(R0) ;HAS CHARACTER ARRIVED? ; KLN018D"P BNE 12$ ;IF MI NO ; KLN018BP13$: TST TPR3(R0) ;SEE IF CPRSYS HAS GIVEN US THE CHAR ; KLN018(P BMI 13$ ;IF MI, NOT YET ; KLN0182P MOV TPR3(R0),-(SP) ;READ INPUT BYTE ; KLN018-P CLR TPR3(R0) ;CLEAR REGISTER ; KLN018+P MOV (SP)+,R0 ;GET CHARACTER ; KLN018 P15$: ; KLN018 P .IFTF ; C$$XDJ ; KLN018P ; KLN018QR .IF DF R$$PROS1T MOV #115,@#173202 ;CLEAR THE PENDING INTERRUPT0UV .ENDC ; DF R$$PROW$X BIC #177600,R0 ;CLEAR EXCESS BITSY CMPB R0,#12 ;BRANCH IF 3Z BEQ 40$ ;NO ECHO 'SS"[ JSR R5,LOOKUP ;CHECK IF ALTMODE \ + ALTTAB ] BCS 20$ ; "^ MOVB #'$,R0 ;CHANGE TO $ IF SO)_20$: MOV R0,-(SP) ;SAVE INPUT CHARACTER;` TYPE R0 ;ECHO CHARACTER(a MOV (SP)+,R0 ;RESTORE INPUT CHARACTER&b CMP #141,R0 ;LOWER CASE CHARACTER?c BHI 30$ ;IF HI NO&d CMP #172,R0 ;LOWER CASE CHARACTER?e BLO 30$ ;IF LO NO7/f SUB #40,R0 ;CONVERT TO UPPER CASE CHARACTER;g30$: CMPB #' ,R0 ;CVT BLANK h BNE 40$i MOVB #'+,R0 ;INTO + j40$: RETURN ;kl; #m; TYPE CHARACTER ON OUTPUT DEVICEHn;Fo0pTY00†*z�yt´cÚµcÛ¶c�·c›’PE: MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESS*q SUB #2,(SP) ;POINT TO TRAP INSTRUCTION1r MOVB @(SP)+,-(SP) ;GET LOW BYTE OF INSTRUCTIONs BMI 10$ ;IF MI CONTROL BYTEA#t MOV (SP)+,R0 ;SET BYTE TO OUTPUTH u BR 30$ ;+v10$: BIT #40,(SP) ;OUTPUT CONTENTS OF R0?Sw BEQ 20$ ;IF EQ YES'x MOV (PC)+,R0 ;SET TO OUTPUT Uy .BYTE 15,12 ;;%z20$: ASLB (SP)+ ;OUTPUT TWO BYTES?E{ BPL 30$ ;IF PL NOI | TYPE R0 ;TYPE OUT FIRST BYTE} SWAB R0 ;SET UP HIGH BYTET}30$: ; KLN018} .IFT ; C$$XDJ ; KLN018N} ; KLN0186} BIT #4,SR3 ;IS KERNEL D SPACE ENABLED? ; KLN018D} BEQ 31$ ;IF EQ NO, THIS MUST BE VIRGIN BOOT NOT ON KXJ ; KLN018/} BIT #F5.XDJ,$FMSK5 ;XDT ON KXJ? ; KLN018:#} BNE 45$ ;IF NE YES ; KLN018S} ; KLN018 } .IFTF ; C$$XDJ ; KLN018} ; KLN0184}31$: TSTB @OUTS ;OUTPUT DEVICE READY? ; KLN018"} BPL 31$ ;IF PL NO ; KLN018'€ MOVB R0,@OUTB ;OUTPUT BYTE ;**-2H(�35$: TSTB @OUTS ;OUTPUT DEVICE READY?‚ BPL 35$ ;IF PL YES3ƒ CMPB #15,R0 ;WAS OUTPUT BYTE A CARRIAGE RETURN?S„ BNE 50$ ;IF NE NO8-… CMP #LPS,OUTS ;OUTPUT DEVICE LINE PRINTER?O† BEQ 50$ ;IF EQ YES$‡ MOV #5,-(SP) ;SET FILL COUNT TO 5ˆ CLRB R0 ;SET OUTPUT NULLSY‰40$: TYPE R0 ;OUTPUT A NULL!Š DEC (SP) ;ANY MORE TO OUTPUT?L‹ BGT 40$ ;IF GT YESŒ TST (SP)+ ;CLEAN STACKŒ ;KLN018 Œ .IFT ; C$$XDJ ;KLN018Œ ;KLN0180'Œ BR 50$ ;JOIN COMMON CODE ;KLN018TŒ45$: ;KLN018E+Œ MOV R0,-(SP) ;SAVE CHARACTER ;KLN018 4Œ MOV $KXPTR,R0 ;GET ADDRESS OF KXJ DCB ;KLN0182Œ MOV D.UCB(R0),R0 ;GET ADDRESS OF UCB ;KLN0182Œ MOV U.SCB(R0),R0 ;GET ADDRESS OF SCB ;KLN0182Œ MOV S.KRB(R0),R0 ;GET ADDRESS OF KRB ;KLN0183Œ MOV K.CSR(R0),R0 ;GET ADDRESS OF TPR0 ;KLN018UAŒ TST KXJNOT ;HAVE WE ALREADY NOTIFIED HOST FOR ATTACH? ;KLN018 $Œ BNE 455$ ;IF NE, YES ;KLN0182Œ MOV #1,KXJNOT ;SET NOTIFICATION FLAG ;KLN0180Œ MOV #RI$XDA,TPR2(R0) ;ATTACH CODE ;KLN018-Œ MOV R0,-(SP) ;SAVE TPR0 ADDRESS ;KLN018V7Œ MOV $KXVC1,R0 ;GET ADDRESS OF FIRST VECTOR ;KLN018U2Œ ADD #4,R0 ;GET ADDRESS OF XDT VECTOR ;KLN0184Œ MOV R0,@#KXJQIR ;NOTIFY HOST OF DETACH ;KLN0180Œ MOV (SP)+,R0 ;RESTORE TPR0 ADDRESS ;KLN018=Œ453$: TST TPR2(R0) ;HOST RECEIVED ATTACH MESSAGE? ;KLN018E"Œ BNE 453$ ;IF NE NO ;KLN018Œ455$: ;KLN018-Œ MOV (SP),TPR3(R0) ;OUTPUT BYTE ;KLN018O:Œ MOV #RI$XDW,TPR2(R0) ;SET WRITE FUNCTION CODE ;KLN018-Œ MOV R0,-(SP) ;SAVE TPR0 ADDRESS ;KLN018D7Œ MOV $KXVC1,R0 ;GET ADDRESS OF FIRST VECTOR ;KLN018V2Œ ADD #4,R0 ;GET ADDRESS OF XDT VECTOR ;KLN0184Œ MOV R0,@#KXJQIR ;NOTIFY HOST OF DETACH ;KLN0180Œ MOV (SP)+,R0 ;RESTORE TPR0 ADDRESS ;KLN0183Œ46$: TST TPR2(R0) ;CHARACTER RECEIVED? ;KLN018 !Œ BNE 46$ ;IF MI NO ;KLN01842Œ MOV (SP)+,R0 ;RESTORE CONTENTS OF R0 ;KLN018Œ ;KLN018)Œ .ENDC ; C$$XDJ ;KLN018VŒ ;KLN018T�50$: RTI ;Ž %� .SBTTL UTILITIES - PRETTY PRINTERSD�6‘;PRINT ADDRESS- RELOC, SYMBOLIC, OR ABSL JSR PC.RORA’“;R0 ADDRESS TO BE PRINTEDT.”;FORM CORE ADDRESS FORMAT (0-RELOC 1-ABSOL)•–;REGISTER '$R ' OR '$DR 'L!—;CORE 'D,XXXXXX ' OR 'XXXXXX ' ˜3™RORA: MOV R0,-(SP) ;CALLING VALUE ONA TOPPA SATCKEš›œ .IF DF K$$DAS�1ž MOV DMODE,R0 ;PICK UP MODE CHARACTER AND SPACEE)Ÿ TSTB REGFL ;ATTEMPT TO OPEN REGISTER?  BEQ 50$ ;IF EQ NO 6¡ MOV #"D ,R0 ;DATA SPACE USED IF REGISTER NOT THERE¢£ .IFTF¤¥ CMP #INTBEG,(SP)$¦ BHI 50$ ;BELOW FIRST NON-INDEXED§ CMP #INTEND,(SP)#¨ BLO 50$ ;ABOVE LAST NON-INDEXEDR © TYPE '$ ;ANNOUNCE INTENSIONSª CMP #INTINX,(SP)E« BLOS 20$ ;GO TO DO INDEXED1¬ MOV (SP)+,R0 ;NON-INDEXED REGISTER ----- "$R "A/­ SUB #INTBEG,R0 ;CLEANED UP STACK, GET OFFSET$*® ASR R0 ;BYTE THAT WORD, WORD THAT BYTE1¯ MOVB NIXMAP(R0),R0 ;MAGIC CHARACTER FROM TABLEE°15$: BIS (PC)+,R0 (± .BYTE 000,' ;CHARACTER PLUSSA BLANK)² TYPE R0+R0 ;NAME PLUS BL00†2z…ytöt÷tø tþfDATAANK AND SPLIT ³ RETURN ;(.´20$: CLR R1 ;SEE WHICH SET OF TABLES WE GOT:µ22$: CMP INXTBL+2(R1),(SP) ;LOOK ON AHEAD TO FIND BEHIND%¶ BHI 24$ ;R1 POINTS TO BASE OF SETN4· TST (R1)+ ;THINK ABOUT THOSE DUMMY ENTRIES DUMMY ¸ BR 22$I1¹24$: MOV (SP)+,R0 ;INDEXED REGISTER ---- "$DR "E=º SUB INXTBL(R1),R0 ;GET ADDRESS AND COMPUTE OFFSET IN WORDSA%» ASR R0 ;AND FINALLY IN PLAIN TALKA ¼ ADD #'0,R0 ;CONVERT TO ASCII%½ TYPE R0 ;TYPE OUT REGISTER NUMBERS ¾ ASR R11¿ MOVB INXREG(R1),R0 ;PICK UP THE REAL CHARACTER À BR 15$ ;GO PRINT REST OF ITEÁ50$: ;REF LABELÂà .IFTBÄ Å TST OPN ;IS A LOCATION OPEN?Æ BEQ 60$ ;IF EQ NOO Ç TYPE R0+R0 ;OUTPUT MODE INFO È60$: ;TÉÊ .ENDCËÌ.Í TST FORM ;CORE ADDRESS SEE WHAT USER WANTSÎ BNE 80$ ;TYPE AS ABSOLUTE.*Ï MOV (SP),R4 ;RELOCATE ---- "R,XXXXXX "/Ð JSR PC,LOCA ;WE ALWAYS PICK, XDT KNOWS BEST!Ñ BMI 80$ ;BUT NOT ALL THE TIME%Ò MOV R1,(SP) ;SET THE DISPLACEMENT)Ó ADD #"0,,R0 ;PRINT REGISTER AND COMMAEÔ TYPE R0+R0 ;DISK AND COREO'Õ80$: MOV (SP)+,R0 ;PRINT R0 AS A WORDÖ'×;TYPE R0 AS BYTE OR WORD, TWO ENTRIESOØ; FOR A WORD JSR PC,CADWÙ; FOR A BITE JSR PC,CADBÚ3ÛCADW: MOV R0,QUAN ;SET THE FAMOUS QUANTITY VALUEDÜ MOV #6,R3 ;# OF DIGITS!Ý MOV #-2,R4 ;# OF BITS FIRST-3V Þ BR CA01 ;DO THE COMMON THING-ßCADB: CLR QUAN ;SET FOR ALL OF QUAN A BYTEB.à MOVB R0,QUAN ;SET THE QUANTITY THING AGAIN%á MOV #3,R3 ;THERE ARE THREE DIGITSD!â MOV #-1,R4 ;AND ONLY TWO BITSEã SWAB R0 ;SWITCH ENDSäCA01: MOV R0,-(SP) ;SAVE R0I3å10$: ADD #3,R4 ;COMPUTE THE NUMBER OF BITS TO DO æ CLR R0ç15$: ROL (SP) ;GET A BITè ROL R0 ;STORE IT AWAYDé DEC R4 ;DECREMENT COUNTERE%ê BGT 15$ ;LOOP IF MORE BITS NEEDED, ë ADD #'0,R0 ;CONVERT TO ASCIIì TYPE R0 ;TYPE IT$í DEC R3 ;SEE IF MORE DIGITS TO DOî BGT 10$ ;LOOP IF SOO*ï MOVB #' ,R0 ;SET UP FOR TRAILING SPACEð TST (SP)+ ;GET RID OF JUNK ñ TYPE R0 ;R ò RETURN ;Móô5õ;TYPE CONTENTS OF WORD IN FORMAT JSR PC,@TYFORM(R1)1ö$÷;R0 WORD OR BYTE TO BE TYPED, RHJ"ø;R1 CODE- ENTRY PT, FORMAT, CODEù!úTYFORM: + CADB ;BYTE OCTAL - 0Iû + CADW ;WORD OCTAL - 2ü + 30$ ;BYTE ANSII - 4Oý + 20$ ;WORD ANSII - 6Fþ + 10$ ;RADIX 50 - 10#ÿ410$: JSR PC,TYRADX ;R0 GETS THE RADIX 50 TREATMENT& BR 35$ ;APPEND A BLANK TO 3 CHAR'S 20$: TYPE R0 ;TYPE BYTE IN R0  SWAB R0 ;SWAP EM AND TYPE IT 30$: TYPE R0 ;TYPE BYTE IN R035$: TYPE 40 ;TYPE A SPACE  RETURN ;D1 ;TYPE CONTENTS OF R0 IN RADIX 50 JSR PC,TYRADX  ) TYRADX: MOV #3,R5 ;COUNT OF CHARACTERS ,  MOV #50$,R2 ;POINTER TO COEFFICENT TABLE$  MOV R0,R1 ;COPY OF RADIX 50 WORD 10$: MOV R1,R0 ; GET DIVIDEND MOV (R2)+,R1 ; GET DIVISOR 4 JSR PC,$DIV ; DIVIDE, R0=QUOTIENT, R1 =REMAINDER$ TST R0 ; IS QUOTIENT ZERO? (SP)? BEQ 12$ ;"SP" = 040T CMPB R0,#33 ;RAD50-$ =33 BEQ 16$ ;"$" = 044* BGT 14$ ;"." OR "0-9" = 056 OR 060-071& ADD #40,R0 ;RAD50-A = 1, "A" = 101-12$: ADD #16,R0 ;40+16+11+11 = 100 + (A-Z) (14$: ADD #11,R0 ;16+11+11 = 40 + (SP)(16$: ADD #11,R0 ;11+11 = 22 + (.,0-9)! TYPE R0 ;TYPE CHARACTER IN R0  DEC R5 ;COUNT THE CHARACTERS BNE 10$ ; LOOP  RTS PC(%;COEFFICENT TABLE, RADIX 50 CONVERTI 1!50$: .WORD +1600.,+40.,+1. ;40.^2, 40.^1, 40.^0E" R# .PAGE@$ .SBTTL "I" AND "D" PROCESSOR - SET INSTR OR DATA DISPLAY MODE% &;SYNTAX--B';I SET INSTR DISPLAY MODE0()* .IF DF K$$DAS+9,INSTM: MOVB #'I,DMODE ;SET FOR INSTRUCTION DISPLAY MODEA - DECODE ;DECODE NEXT COMMAND. /;SYNTAX--60;D SET DATA DISPLAY MODE122DATAM: MOVB #'D,DMODE ;SET FOR DATA DISPLAY MODE 3 DECODE ;DECODE NEXT COMMAND45 .ENDC678 C49 .SBTTL "B" PROCESSOR - SET AND REMOVE BREAKPOINTS: ;;SYNTAX--0<;B CLEAR ALL BREAKPOINTS=;NB CLEAR BKPT N,>;A;B SET BKPT AT A, USE FIRST FREE BKPT?;A;NB SET BKPT N AT A @@A;DEPENDS MIGHTILY UPON LOCATION "TRTC" CONTAINING 00†:z�yt´cÚµcÛ¶c�·c›’A TRAP INST.4B;AND THAT A FREE BKPT CONTAINS THE ADDRESS "TRTC".C2DSEBK: ASL R4 ;MPY R4 X2, JUST IN CASE ALL IS GO4E MOV #TRTC,R0 ;SET MAGIC VALUE IN R0, JUST IN CASE#F TST R3 ;CHECK FOR THE REAL CASED*G BEQ REMB ;REMOVAL CASES, CLEAR THEM UPH BIT #1,R5 ;LOOK AT ADDRESSI BNE ERR0 ;THAT'S ODD ?*J TST R2 ;SEE IF I GET TO PICK IT OR NOT#K BNE 15$ ;OR NOT, DISAPPOINTMENT ;L10$: CMP R0,ADR1(R4) ;LOOK FOR LOCATION WITH FREE ADDRESSM BEQ 15$ ;A HIT'N TST (R4)+ ;KEEP AT FOR A LONG WHILE.O BR 10$ ;LOOOOOOOOP/P15$: MOV R5,R0 ;R0 HAS ADDRESS OF BREAKPOINT4Q BR RE02 ;GO TUCK IT INRS;REMOVE SOME BREAKPOINTST"UREMB: TST R2 ;SEE IF ONE OR ALLV BEQ RALL ;ALLE0WRE02: JSR PC,SETBRK ;SET THE ONE SET UP TO SETX BCC RALL2 ;IT HAPPENED&YERR0: ERROR ;SOME THING WENT WRONGZ[;E\; REMOVE ALL BREAKPOINTS];B^_RALL: CLR R4 ;R4 IS ZERO#`10$: JSR PC,SETBRK ;SET THEM TILLTa BCC 10$ ;THEY GET OUTTAQbRALL2: DECODE ;HAND!!!!Kcd;R'e; SUBROUTINE TO SET/CLEAR BREAKPOINTSf;Mg0hSETBRK: CMP #BKP,R4 ;LEGAL BREAKPOINT NUMBER?i BLO 10$ ;IF LO NORjk .IF DF M$$PROl!m BIT #1,SR0 ;MAPPING ENABLED ?L*n BEQ 8$ ;IF EQ NO, CAN'T GET TO LOWCR'Sop .IF DF K$$DASq(r BIT #4,SR3 ;KERNEL D-SPACE ENABLED ?*s BEQ 8$ ;IF EQ NO, CAN'T GET TO LOWCR'Stu .ENDC ; DF K$$DASv.w MOV KISAR6,-(SP) ;SAVE CURRENT EXEC MAPPING'x MOV R0,-(SP) ;AND BREAKPOINT ADDRESSE*y MOVB $NCPU,R0 ;GET NUMBER OF PROCESSORS z ASL R0 ;CHANGE TO WORD INDEX2{5$: MOV $K6TAB-2(R0),KISAR6 ;REMAP TO NEXT LOWCR3| MOV (SP),140000+ADR1(R4) ;SET BREAKPOINT ADDRESS.2} MOV #1,140000+CT(R4) ;AND INITIAL PROCEED COUNT%~ SUB #2,R0 ;POINT BACK TO NEXT CPUW BGT 5$ ;IF GT THERE IS ONE*€ MOV (SP)+,R0 ;RESTORE BRAKPOINT ADDRESS1� MOV (SP)+,KISAR6 ;RESTORE CURRENT EXEC MAPPINGN‚ BR 9$ƒ„8$:… .ENDC ; DF M$$PRO†*‡ MOV R0,ADR1(R4) ;SET BRAEKPOINT ADDRESS+ˆ MOV #1,CT(R4) ;SET INITIAL PROCEED COUNTR‰+Š9$: TST (R4)+ ;ADVANCE BREAKPOINT NUMBER‹10$: RETURN ;RŒ S8� .SBTTL "R" PROCESSOR - RELOCATION REGISTER PROCESSINGŽ�;DETERMINE IF CLEAR OR SET�1‘RELO: TSTB SMFD ;SEMI-COLON ABSENT MEANS CLEARP/’ BEQ 10$ ;CLEAR DISPATCH, OR FALL TO SETTINGS“”;FORMS HERE-- •; A;NR SET RELOC(N) TO A–;ABSENT A OR N DEFAULTS TO 0—#˜ JSR PC,RTST ;PROTECTION EDITING'™ BCS ERR0 ;ILLEGAL REGISTER NUMBER ?)š› .IF DF M$$PROœ+� BIT #1,SR0 ;MEMORY MANAGEMENT ENABLED ?)ž BEQ 5$ ;IF EQ NO, CAN'T GET TO LOWCRSMŸ  .IF DF K$$DAS¡+¢ BIT #4,SR3 ;KERNEL DATA SPACE ENABLED ?G)£ BEQ 5$ ;IF EQ NO, CAN'T GET TO LOWCRS ¤¥ .ENDC ; DF K$$DAS¦.§ MOV KISAR6,-(SP) ;SAVE CURRENT EXEC MAPPING&¨ MOV R0,-(SP) ;SAVE WORKING REGISTER$© MOVB $NCPU,R0 ;GET NUMBER OF CPUSª ASL R0 ;MAKE WORD INDEXF;«3$: MOV $K6TAB-2(R0),KISAR6 ;MAP TO NEXT PROCESSORS LOWCRE7¬ MOV R5,140000+RELT(R4) ;AND SET RELOCATION REGISTER+­ SUB #2,R0 ;POINT BACK TO NEXT PROCESSOR® BGT 3$ ;IF GT MORE TO GO)¯ MOV (SP)+,R0 ;RESTORE WORKING REGISTER)° MOV (SP)+,KISAR6 ;RESTORE EXEC MAPPING ± DECODE ;GO GET NEXT COMMAND²5$: ;REF LABELC³´ .ENDC ; DF M$$PROµ0¶ MOV R5,RELT(R4) ;SET THE APPROPRIATE REGISTER · DECODE ;GO GET NEXT COMMAND¸¹;FORMS HERE--O%º;R RESET ALL TO -1 FOR RELOC(0-7)»;NR RESET ONLY RELOC(N)M¼#½10$: TST R2 ;SEE IF NR OR JUST R4¾ BEQ 15$ ;CLEAR ALL$¿ JSR PC,RUCL ;CLEAR THE ONE IN R4'À BCS ERR0 ;ERROR, INVALID REGISTER ?;Á DECODE ;NEXT COMMANDP Â15$: JSR PC,RUAL ;DO THEM ALLà DECODE ;OFF AND ONOÄÅ;A0Æ; SUBROUTINE TO RESET RELOCATION BASE REGISTERÇ; È É .ENABL LSBC+ÊRUCL: CALL RTST ;TEST FOR LEGAL REGISTER #Ë BCS 10$ ;IF CS ILLEGAL REGISTER .Ì MOV #-1,RELT(R4) ;RESET RELOCATION REGISTER+Í ASR R4 ;CONVERT BACK TO REGISTER NUMBER Î10$: RETURN ;ÏÐ;T0Ñ; SUBROUTINE TO CLEAR ALL RELOCATION REGISTERSÒ;JÓ&ÔRUAL: CLR R4 ;START WITH REGISTER 01Õ20$: CALL RUCL ;CLEAR NEXT RE00†Bz…ytöt÷tø tþfDATALOCATION REGISTEROÖ BCS 10$ ;IF CS ALL DONED$× INC R4 ;ADVANCE TO NEXT REGISTER Ø BR 20$ ; Ù .DSABL LSBEÚ E1Û .SBTTL EXPRESSION SETUP COMMANDS ( ; + - * , )ÜÝ;SEMI-COLON PROCESSORGÞ$ßSEMI: INCB SMFD ;COUNT SEMI-COLON*à CMPB #2,SMFD ;PUSH CONTENTS INTO MULTI!á BNE SEM1 ;SEMI COLON ARG LISTAâ MOV R5,D.ARGS'ãSEM1: MOV R2,R3 ;PUSH R2 AND R4 INTOU,ä MOV R4,R5 ;R3 AND R5 (FLAG AND CONTENTS)å JMP NEWE ;CONTINUE SCANNERæç;ADDITION SETUPCèéPLUS: CLRB OP ;OP IS 0 FOR +S ê BR CO00ëì;SUBTRACT SET UPíîMINS: MOVB #2,OP ï BR CO00ðñ;MULTIPLY BY 50 AND ADDò$óSTAR: MOVB #-2,OP ;OP IS -2 FOR *ôCO00: CLR R4 ;R4 IS RESET õ JMP NEWNGö÷;MEMORY RELOCATION CHECKø ùCOMM: ASL R4 ;ALL NEED IT X 20ú CMP R4,#RLR ;SEE IF REGISTER IS OUT OF RANGE û BGT ERR2,.ü MOV RELT(R4),EXP ;COMPUTE REAL CORE ADDRESS ý BR PLUSþERR2: ERROR ;OOPSDÿ E# .SBTTL MISCELLANEOUS SUBROUTINES;; TEST IF IN EXEC MODE;L;TESTM: MOV (R5)+,-(SP) ;PICK UP EXEC TRAP ROUTINE ADDRESS* TST $STKDP ;ALLOW EXEC TO HANDLE TRAP?- BGT 20$ ;IF GT YES, TRAP WAS IN USER MODEI& BLT 10$ ;IF LT NO, BAD STACK DEPTH9  CMP 4(SP),#$DRLM1 ;TRAP OCCUR IN DIRECTIVE DISPATCHER?   BLO 5$ ;IF LO NO9  CMP 4(SP),#$DRLM2 ;TRAP OCCUR IN DIRECTIVE DISPATCHER?T  ; BM3774  .IF NDF D$$PAR ; BM377  ; BM377R*  BLOS 20$ ;IF LO YES, PASS TRAP TO EXEC  ; BM377"  .IFF ; NDF D$$PAR ; BM377  ; BM377)  BHI 5$ ;IF HI NO ; BM3778  CMP KINAR5,$DRAPR ;IS THE DISPATCHER MAPPED ; BM3773  BEQ 20$ ;IF EQ YES, PASS TRAP TO EXEC ; BM377   ; BM377H#  .ENDC ; NDF D$$PAR ; BM377   ; BM377  5$:O .IF DF D$$PAR1 CMP KINAR5,$DRAP2 ;2ND DIRECTIVE COMMON MAPPEDT' BNE 10$ ;IF NE NO, XDT HANDLES TRAP  .ENDC ; DF D$$PAR3 CMP 4(SP),#$DQLM1 ;TRAP OCCUR IN QIO DIRECTIVE ? BLO 10$ ;IF LO NO.2 CMP 4(SP),#$DQLM2 ;TRAP OCCUR IN QIO DIRECTIVE?3 BLOS 20$ ;IF LOS YES, ALLOW EXEC TO HANDLE TRAPA'10$: MOV R5,(SP) ;SET TO XDT ADDRESS'20$: MOV (SP)+,R5 ;SET RETURN ADDRESS  RTS R5 ;PROCESS TRAP0;EXPRESSION COMPUTATION ROUTINE JSR PC,EXPCOM ;NEEDS--&!;OP THE OPERATION (-2=*, 0=+, *=2)";EXP THE LEFT SIDE#;R4 THE RIGHT SIDE$ %;SETS UP--&;OP BACK TO 0 FOR ADD ';EXP,R4 ALL SO FAR)(')EXPCOM: TSTB OP ;SEE WHAT'S UP CHUCKB * BMI 20$ + BEQ 10$, NEG R4 ;MINUS, OP=2C-10$: ADD EXP,R4 ;PLUS, OP=03.15$: MOV R4,EXP ;COMMON OUT, SET EXP TO WHATEVERV/ CLRB OP ;IS IN R4 TOOS&0 INC R2 ;SET R2 SO THAT R4 IS, OP=0 1 RTS PCS5220$: MOV EXP,-(SP) ;GET THE LEFT SIDE OF EXPRESSIONO3 ASL (SP) ; MULTIPLY BY 10E4 ASL (SP) ;5 ASL (SP) ;6 ADD (SP),R4 ; ADD IT7 ASL (SP) ; MULTIPLY BY 40I.8 ASL (SP) ; WHICH IS LIKE MULTIPLYING BY 50(9 ADD (SP)+,R4 ;AND ADD IT TO THE RIGHT: BR 15$ ;COMMON OUT;<'=;BUILD AN OCTAL NUMBER JSR PC,GETNUMO>?;NEEDS AND RETURNS--%@;R0 NON-OCTAL TERMINATING CHARACTERTA;R2 OCTAL CHARACTER COUNTR&B;R4 OCTAL NUMBER THAT I GOT, YOU GETC DGETNUM: CLR R2 ;NEW R2 AND R4 E CLR R4-#F10$: JSR PC,GET ;GET 1 CHARACTERO)G CMPB #'0,R0 ;NON-OCTAL, LESS THAN "0"P H BHI GETC99P)I CMPB #'7,R0 ;NON-OCTAL, LESS THAN "7" J BLO GETC994-K BIC #177770,R0 ;MAKE INTO ACCEPTABLE RANGE L ASL R4 ; SHIFT LEFTAM ASL R4 ; 3 BITS N ASL R4 ;O ADD R0,R4 ;PLANT LO PLACEAP INC R2 ;ACCOUNT FOR NEW ONENQ BR 10$ ;NEXT ONE OR OTHERCR*S;SCAN A LIST OF CHARACTERS JSR R5,LOOKUPT U;CALL-- V; R0 HAS THE CHARACTERUW; JSR R5,LOOKUP ;THAT IS ITW*X; + LIST TO USE, 00 BYTE IS END OF LISTYZ;RETURNS AT CALL + 2 WITH--N[;R0 STILL HAS CHARACTER,\;R1 HAS INDEX X2 OF FOUND CHARACTER IF C=0];C=1 CHARACTER WAS NOT FOUND^&_LOOKUP: MOV (R5),R1 ;GET LIST START%`10$: CMPB R0,(R1) ;IS THIS THE ONE3a BNE 20$ ;RIGHT IT WASN'T)b SUB (R5)+,R1 ;COMPUTE INDEX AND RETURN %c00†Jz�yt´cÚµcÛ¶c�·c›’ ASL R1 ;DO THIS FOR EVERBODY, C=0T d BR 30$)e20$: TSTB (R1)+ ;CHECK FOR END OF LIST%f BNE 10$ ;IF NOT LOOK AT NEXT ITEMU-g TST (R5)+ ;END, AVOID ILLEGAL INSTRUCTIONO%h SEC ;SECURITY EXCHANGE COMMISIONT"i30$: RTS R5 ;SECURITY ELSEWHEREjk5l;GET CONTENTS OF ADDRESS IN THE MODE JSR PC,GETCADm n;NEEDS--o;R0 THE MODE 1=BYTE, 2=WORDp;CAD THE ADDRESSSq;DEVI THE DEVICE CODEr s;RETURNS--!t;R0 HAS THE DATA YOU ASKED FORSuvw .IF DF K$$DASx(yGETCAD: MOV SP,OPN ;SET LOCATION OPEN3z CALL GETIT ;READ WORD OR BYTE FROM PROPER SPACE &{ MOV (SP)+,R0 ;RETRIEVE WORD OR BYTE|GETC99: RTS PC ;+}~ .IFF (€GETCAD: MOV CAD,R3 ; GET CORE ADDRESS"� MOV SP,OPN ; SET LOCATION OPEN'‚ ASR R0 ;PUSH BW FLAG INTO CARRY BITF#ƒ BCC 10$ ;2 WON'T FIT SO IS WORD„ MOVB (R3),R0 ;ACCESS BYTE … BR GETC99 †10$: MOV (R3),R0 ;ACCESS WORD‡GETC99: RTS PC ;STACK ACCESSˆ‰ .IFTFŠ1‹;PUT R4 INTO ADDRESS IN THE MODE JSR PC,PUTCADEŒ �;NEEDS--0Ž;R2 CONTENT FLAG, 0 FOR NONE, ELSE R4 IS GOLD�;R4 THE DATA 0�;BW THE MODE FLAG, IF 0 THEN NO LOCATION OPEN‘’ .IFTC“*”PUTCAD: MOV BW,R0 ;PICK UP MODE AN CC'S3• CALL GETIT ;READ WORD OR BYTE FROM PROPER SPACE!– TST R2 ;CHECK FOR TYPED VALUE — BEQ 12$ ;NO DATA+˜ TST OPN ;IS A LOCATION OPEN AT PRESENT?S™ BEQ 12$ ;NOT OPENš BIT #177776,R0 ;CHECK MODE› BNE 5$ ;WORD MODEK œ MOVB R4,(SP) ;WRITE THE DATA� BIT #1,CAD ;HIGH BYTE?ž BEQ 10$ ;IF EQ NO(Ÿ SWAB (SP) ;MOVE IT BACK TO HIGH BYTE   BR 10$ ;"¡5$: MOV R4,(SP) ;STORE THE DATA.¢10$: MOV (SP),-(SP) ;DUPLICATE DATA ON STACK£ TST R1 ;DATA SPACE? ¤ BNE 11$ ;IF NE YES)¥ MTPI (R3) ;WRITE WORD BACK TO I SPACEE ¦ BR 12$ ;-§11$: MTPD (R3) ;WRITE WORD BACK TO D SPACE &¨12$: MOV (SP)+,R4 ;RETURN DATA IN R4 © RTS PC ;ª«¬ .IFFE­'®PUTCAD: MOV CAD,R3 ;GET CORE ADDRESS !¯ TST R2 ;CHECK FOR TYPED VALUET° BEQ 12$ ;NO DATA NO DODO#± MOV BW,R0 ;PICK UP MODE AN CC'SS,² TST OPN ; IS A LOCATION OPEN AT PRESENT? ³ BEQ 12$ ;NOT OPEN NOT STORED´ BIT #177776,R0 ;CHECK MODEDµ BNE 10$ ;WORD MODE¶ MOVB R4,(R3) ;BYTE MODEB· BR 12$ ;BRANCH MODEP¸10$: MOV R4,(R3) ;WORD MODE&¹12$: BIC #1,R3 ;INSURE EVEN ADDRESS-º MOV (R3),R4 ;READ WORD FROM OPEN LOCATION » RTS PC ;¼½ .IFTF¾¿À;GET WORD FROM PROPER SPACEOÁ Â;NEEDS--Ã;R0 BW FLAGÄ Å;RETURNS--0Æ;R1 0 IF DATA FROM I SPACE, 1 IF FROM D SPACE2Ç;R3 CURRENT ADDRESS FROM CAD WITH LOW BIT CLEARÈÉ .IFTNÊ)ËGETIT: MOV CAD,R3 ;GET CURRENT ADDRESS"Ì BIC #1,R3 ;CLEAR LOW ORDER BIT+Í MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESSDÎ CLR R1 ;ASSUME I SPACE Ï TSTB REGFL ;REGISTER ACCESS?#Ð BNE 10$ ;IF NE YES, USE D SPACES#Ñ CMPB DMODE,#'D ;IN D SPACE MODE?NÒ BEQ 10$ ;IF EQ YES Ó MFPI (R3) ;READ FROM I SPACE Ô BR 20$ ;$Õ10$: MFPD (R3) ;READ FROM D SPACEÖ INC R1 ;SET D SPACE FLAG&×20$: BIT #1,CAD ;HIGH BYTE DESIRED?Ø BEQ 30$ ;IF EQ NOF%Ù SWAB (SP) ;REVERSE BYTES ON STACKN2Ú30$: MOV (SP)+,2(SP) ;PLACE WORD IN PROPER PLACE Û RETURN ;EÜÝ8Þ;SET KERNEL I-SPACE DESCRIPTOR REGISTERS TO READ/WRITEß à;NEEDS--á;R0E#â;CALLED ONLY FOR I/D SPACE SYSTEMã ä;RETURNS--å)æSETRW: BIT #1,SR0 ;MAPPING ENABLED YET ç BEQ 20$ ;NO$-è BIT #4,SR3 ;KERNEL DATA SPACE ENABLED YETé BEQ 20$ ;NO04ê MOV #KINDR0,R0 ;POINT TO KERNEL INSTR DESCR REG 0*ë10$: BIS #4,(R0)+ ;SET RW ACCESS FOR XDTì CMP R0,#KINDR7 ;DONE YETí BLOS 10$ ;NOî20$: RETURN ;Nïðñ .ENDCòó+ô;SELECT RELOCATION REGISTER JSR PC,LOCAõ#ö;CAD ADDRESS TO USE IN SELECTIONG÷ ø;RETURNS--0ù;R0 REGISTER NUMBER FOUND, -1 IF NONE FOUND$ú;R1 DISTANCE, RELOCATION FACTORû=ü;SUBROUTINE TO LOCATE RELOCATION REGISTER NEAREST BUT STILLT7ý;BELOW THE ADDRESS IN CAD. RETURNS WITH THE REGISTER0;þ;NUMBER IN R0, AND WITH THE DISTANCE BETWEEN THE REGISTER:ÿ;AND (CAD) IN R1-;IF NO GOOD RELOC. REG. FOUND, R0 WILL00†Rz‡Tztöt÷tø tþfDATA = -1LOCA: CLR R0. MOV #-1,-(SP) ;INITIALIZE RELOC. REG. INDEX4 MOV (SP),R1 ;INITIALIZE DISTANCE TO A HIGH VALUE+10$: CMP R0,#RLR ;ARE WE DONE COMPARING?- BHI 20$ ;BRANCH IF DONEU0 CMP RELT(R0),R4 ;IS CURR. RELOC. BIAS > (R4)?6 BHI 15$ ;IF SO, BRANCH -- DON'T SUBTRACT, GET NEXT,  MOV R4,R2 ;OTHERWISE TAKE THE DIFFERENCE0  SUB RELT(R0),R2 ;OF CURR. RELOC. REG. AND CAD1  CMP R1,R2 ;IS THE RESULT THE SMALLEST SO FAR?D1  BHI 25$ ;BRANCH IF YES (UNSIGNED CONDITIONAL)I: 15$: TST (R0)+ ;OTHERWISE, BUMP R0 FOR NEXT RELOC. REG.) BR 10$ ;LOOP BACK FOR NEXT COMPARISONZ$20$: MOV (SP)+,R0 ;PUT REG.# IN R0 RTS PC ;JOB OVER, RETURN625$: MOV R2,R1 ;REMEMBER SMALLEST DIFFERENCE IN XXY* ASR R0 ;AND ASSOCIATED REGISTER NUMBER MOV R0,(SP) ; IN (SP)A( ASL R0 ;RESTORE R0 TO ORIGINAL VALUE" BR 15$ ;GO FO NEXT COMPARISON. .ENDC ;DF X$$DBTD .IIF DF X$$DBT .END $XDT .IIF NDF X$$DBT .END 25$ ;BRANCH IF YES (UNSIGNED CONDITIONAL)I: .TITLE PLSUB  .IDENT /5.00/; ; COPYRIGHT (C) 1985 BYD!; DIGITAL EQUIPMENT CORPORATIONE; ALL RIGHTS RESERVED.;L>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;P ; PREVIOUSLY MODIFIED BY:N ;E ; J. R. KAUFFMAN ; B. S. MCCARTHY ;E ; MODIFIED BY: ;I ; J. W. BERZLE 22-OCT-85 5.00S ; 8 ; JWB167 -- ADD COMMENTS EXPLAINING THE USE OF $QRMVT ;F;P;O;; PROGRAM LOGICAL ADDRESS SPACE (PLAS) COMMON SUBROUTINES;Y; MACRO LIBRARY CALLSI;  .IF DF P$$LAS% .MCALL HDRDF$,HWDDF$,PCBDF$,TCBDF$W' HDRDF$ ;DEFINE TASK HEADER OFFSETSB& HWDDF$ ;DEFINE HARDWARE REGISTERS3 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSY.! TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS"#;+($; **-$SRNAM-SEARCH FOR NAMED PARTITION%;ZF&; THIS ROUTINE SEARCHES FOR A NAMED PARTITION AND RETURNS A SUCCESS/9'; FAILURE INDICATION AND A POINTER TO THE PCB IF FOUND.P(;P ); INPUTS:U*;I(+; R3=POINTER TO DOUBLE-WORD RAD50 NAME,; -; OUTPUTS:.;S/; C=1 IF NO MATCH ON NAME,0;$ 1; C=0 IF NAMED PARTITION FOUND2; R2=PCB ADDRESSH3;-45 .IFTF6 R47$SRNAM::MOV $CBDHD,R2 ;POINT TO FIRST ENTRY IN CBD 8 BEQ 20$ ;IF EQ THERE IS NONE910$: CALL 50$ ;NAME MATCH?+: BEQ 40$ ;IF EQ YES+; MOV P.CBDL(R2),R2 ;POINT TO NEXT IN LISTA< BNE 10$ ;IF NE THERE IS ONEE-=20$: MOV $PARHD,R2 ;POINT TO FIRST MAIN PCBP>30$: CALL 50$ ;NAME MATCH?? BEQ 40$ ;IF EQ YES'@ MOV (R2),R2 ;POINT TO NEXT MAIN PCBA BNE 30$ ;IF NE THERE IS ONE B SEC ;C-SET ON NO MATCHC40$: RETURN ;I7D50$: CMP P.NAM(R2),(R3) ;MATCH ON FIRST WORD OF NAME?RE BNE 60$ ;IF NE NOR7F CMP P.NAM+2(R2),2(R3) ;MATCH ON SECOND WORD OF NAME?IG60$: RETURN ; H ;I .IFTHJK;+"L; **-$CKACC-CHECK DESIRED ACCESSM;OCN; THIS ROUTINE CHECKS IF THE DESIRED ACCESS OF A TASK TO A REGIONADO; IS ALLOWED. THE BITS IN THE PROTECTION WORD ARE ARRANGED IN THEP; FOLLOWING ORDER:Q;(R; [WORLD,GROUP,OWNER,SYSTEM] S; 15 0 T;EEU; THE BITS WITHIN EACH CATEGORY IN THE PROTECTION WORD ARE ARRANGED:V; IN THE FOLLOWING ORDER: W; X; DELETE EXTEND WRITE READEY; 3 2 1 0Z;C<[; A BIT SET MEANS THE CORRESPONDING ACCESS IS NOT ALLOWED.\; ]; INPUTS:$^;-+_; R0=DESIRED ACCESS MASK IN LOW FOUR BITSC`; R1=CURRENT UIC OF TASKa; R2=PCB ADDRESS OF REGIONb;W c; OUTPUTS:d;Ee; R0,R1 ARE MODIFIEDf; 9g; DIRECTIVE STATUS OF D.RS16 RETURNED IF ACCESS DENIED.Sh;-i0j$CKACC::MOV #30$,-(SP) ;PUSH COROUTINE ADDRESS2k BIC #^C17,R0 ;CLEAR ALL BUT DESIRED ACCESS MASK4l10$: SWAB R1 ;REVERSE GROUP AND OWNER IN UIC WORD4m CALL @(SP)+ ;CHECK IF QUALIFIED IN NEXT CATEGORYn BNE 20$ ;IF NE NO 5o BIT R0,P.PRO(R2) ;ALLOWED ACCESS IN THIS CATEGORY?0p BNE 20$ ;IF NE NO $q TST (SP)+ ;POP COROUTINE ADDRESSr RETURN ;RETURN TO CALLERI+s20$: ASL R0 ;SHIFT MASK TO NEXT C00‡Zz�yt´cÚµcÛ¶c�·c›’ATEGORYO t ASL R0 ; u ASL R0 ; v ASL R0 ;)w BR 10$ ;CHECK ACCESS IN THIS CATEGORY x30$: CMPB R1,#10 ;SYSTEM UIC?y BHI 40$ ;IF HI NOC#z SEZ ;SET FLAG FOR ACCESS CHECKA0{40$: CALL @(SP)+ ;CHECK ACCESS AND SHIFT MASK| CMP R1,P.OWN(R2) ;OWNER UIC? ,} CALL @(SP)+ ;CHECK ACCESS AND SHIFT MASK#~ CMPB R1,P.OWN+1(R2) ;SAME GROUP?C, CALL @(SP)+ ;CHECK ACCESS AND SHIFT MASK'€ SEZ ;INSURE CHECK FOR WORLD ACCESS� CALL @(SP)+ ;CHECK ACCESS.‚ DRSTS D.RS16 ;ACCESS DENIED IF WE GET HEREƒ„;+*…; **-$CRATT-CREATE ATTACHMENT DESCRIPTOR†;EG‡; THIS ROUTINE CREATES AN ATTACHMENT DESCRIPTOR AND INSERTS IT IN THEIˆ; NECESSARY QUEUES.G‰;A Š; INPUTS:‹;:.Œ; R2=PCB ADDRESS OF REGION BEING ATTACHED TO�; R4=ACCESS CODE$Ž; R5=TCB ADDRESS OF ATTACHING TASK�; �; OUTPUTS:‘; ’; C=0 IF SUCCESSFULO(“; R1=ADDRESS OF ATTACHMENT DESCRIPTOR”; R0 IS MODIFIEDN:•; C=1 IF AN ATTACHMENT DESCRIPTOR COULD NOT BE ALLOCATED–; R0,R1 ARE MODIFIEDS—;-˜™ .IFTFš ›$CRATT::MOV R3,-(SP) ;SAVE R3C!œ MOV R2,-(SP) ;SAVE PCB ADDRESSU5� MOV #A.LGTH,R1 ;PICK UP ATTACHMENT DESCRIPTOR SIZE 3ž CALL $ALOCB ;ALLOCATE THE ATTACHMENT DESCRIPTOR:%Ÿ BCS 10$ ;IF CS ALLOCATION FAILURET6  ADD R0,R1 ;POINT PAST END OF ATTACHMENT DESCRIPTOR*¡ MOV (SP),-(R1) ;SET PCB ADDRESS (A.PCB)2¢ MOV R4,-(R1) ;INIT STATUS AND MAP COUNT (A.STS)4£ BIC #^C17,(R1) ;CLEAR ALL BUT ACCESS BITS (A.STS)1¤ TST -(R1) ;POINT TO TCBL THREAD WORD (A.TCBL)M/¥ MOV R5,R0 ;POINT TO TCB ATTACHMENT LISTHEAD ¦ ADD #T.ATT,R0 ;2§ CALL $QINSF ;INSERT DESCRIPTOR AT END OF QUEUE(¨ MOV R5,-(R1) ;SET TCB ADDRESS (A.TCB)&© CLRB -(R1) ;ZERO I/O COUNT (A.IOC)?ª MOVB T.PRI(R5),-(R1) ;INIT PRIORITY TO TASK PRIORITY (A.PRI) ,« TST -(R1) ;POINT TO PCBL THREAD (A.PCBL)1¬ MOV (SP),R0 ;POINT TO PCB ATTACHMENT LISTHEAD(­ ADD #P.ATT,R0 ;,® CALL $QINSP ;INSERT IN QUEUE BY PRIORITY¯ CLC ;INDICATE SUCCESS(°10$: MOV (SP)+,R2 ;RESTORE PCB ADDRESS± MOV (SP)+,R3 ;RESTORE R3T ² RETURN ;E³´ .IFTµ D¶;+.·; **-$SRATT-SEARCH FOR ATTACHMENT DESCRIPTOR¸;QL¹; THIS ROUTINE VERFIES IF A VALID REGION ID WAS PASSED IN A PLAS DIRECTIVEIº; BY SEARCHING FOR THE CORRESPONDING ATTACHMENT DESCRIPTOR IN THE TCB'S»; ATTACHMENT QUEUE. ¼;T ½; INPUTS:)¾;M¿; (R3)=REGION ID TO VERIFYÀ; 0 FOR TASK REGION-Á; 1-17 FOR OTHER STATICALLY LINKED REGIONSB"Â; R5=TCB ADDRESS OF CURRENT TASKÃ; Ä; OUTPUTS:Å;R'Æ; R5=ADDRESS OF ATTACHMENT DESCRIPTOROÇ;TDÈ; D.RS86 IS RETURNED IF THE ATTACHMENT DESCRIPTOR CANNOT BE FOUND.É;-Ê@Ë$SRATT::MOV T.ATT(R5),R5 ;POINT TO FIRST ATTACHMENT DESCRIPTOR!Ì MOV (R3),-(SP) ;SAVE REGION IDY*Í CMP (SP),#17 ;STATICALLY LINKED REGION?Î BHI 9$ ;NO IF HI3Ï5$: DEC (SP) ;SEARCH FOR PROPER ATTACHMENT DESCRÐ BLT 20$ ;IF LT, FOUND IT(Ñ MOV (R5),R5 ;POINT TO NEXT ATT DESCRÒ BEQ 15$ ;IF EQ, END OF LIST Ó BR 5$ ;GO AGAINR-Ô9$: ADD #A.TCBL,(SP) ;ADD BIAS TO LINK WORDE.Õ10$: CMP R5,(SP) ;MATCH ON THIS DESCRIPTOR?Ö BEQ 20$ ;IF EQ YES7× MOV (R5),R5 ;ELSE POINT TO NEXT DESCRIPTOR (A.TCBL) Ø BNE 10$ ;IF NE THERE IS ONEC'Ù15$: DRSTS D.RS86 ;INVALID REGION ID >Ú20$: SUB #A.TCBL,R5 ;POINT TO START OF ATTACHMENT DESCRIPTORÛ TST (SP)+ ;CLEAN STACK Ü RETURN ;RÝÞ;+1ß; **-$SRWND-SEARCH FOR SPECIFIED ADDRESS WINDOW(à;5Já; THIS ROUTINE VERIFIES THAT THE SPECIFIED ADDRESS WINDOW ID CORRESPONDS*â; TO A VALID ESTABLISHED ADDRESS WINDOW.ã;W ä; INPUTS:Cå;,æ; (R3)=ADDRESS WINDOW ID%ç; R4=ADDRESS OF CURRENT TASK HEADER5"è; R5=TCB ADDRESS OF CURRENT TASKé;C ê; OUTPUTS:ë;I(ì; R4=POINTER TO SPECIFIED WINDOW BLOCKí; R0 IS MODIFIED.î;SAï; D.RS87 IS RETURNED IF THE SPECIFIED ADDRESS WINDOW IS INVALID+ð;-ñ6ò$SRWND::MOV H.WND(R4),R4 ;POINT TO NUMBER OF WINDOWS3ó MOVB (R3),R0 ;PICK UP ADDRESS WINDOW ID (W.NID)Rô BEQ 10$ ;IF EQ ILLEGALõö .IF DF U$$DAS÷!ø CMP #1,R0 ;ADDRESS WINDOW 1 ?Sù BNE 5$ ;IF NE NO1ú BIT #T4.DSP,T.ST4(R00‡bzTztöt÷tø tþfDATA5) ;TASK USE USER D SPACE ?D/û BNE 10$ ;IF NE YES, CAN'T CHANGE WINDOW ONEOü5$: ;REFERENCE LABELUýþ .ENDC ; DF U$$DASÿ% CMP R0,(R4)+ ;WINDOW ID TOO LARGE?I BHIS 10$ ;IF HIS YES. ASL R0 ;CONVERT WINDOW ID TO 8 WORD OFFSET  ASL R0 ;  ASL R0 ;  ASL R0 ;& ADD R0,R4 ;POINT TO ADDRESS WINDOW7 TST W.BSIZ(R4) ;IS IT AN ESTABLISHED ADDRESS WINDOW?  BEQ 10$ ;IF EQ NO.  RETURN ;, 10$: DRSTS D.RS87 ;INVALID ADDRESS WINDOW  ;+" ; **-$UNMAP-UNMAP ADDRESS WINDOW;ED; THIS ROUTINE SEARCHES FOR AND CONDITIONALLY UNMAPS THE SPECIFIED; ADDRESS WINDOW.; ; INPUTS:$;'; R4=ADDRESS OF WINDOW TO BE UNMAPPEDI;B ; OUTPUTS:;S; R0 IS MODIFIED;D"; C=1 IF UNMAPPING WAS PERFORMED;-  .ENABL LSB3 1$: RETURN ;RETURN TO KEEP BRANCH FROM BREAKING !/"$UNMAP::TST (R4) ;IS WINDOW MAPPED? (W.BPCB)I$# BEQ 1$ ;IF EQ, WINDOW NOT MAPPED$ MOV R3,-(SP) ;SAVE REGISTERS% MOV R2,-(SP) ;N& MOV R1,-(SP) ;I'( .IF DF F$$MAP&X$$HDR&P$$LAS)"* TST $FMAPP ;TASK USE FAST MAP?+ BEQ 5$ ;IF EQ NO,, MOVB W.BFPD(R4),R0 ;GET FIRST PDR ADDRESS"- BPL 5$ ;IF PL NOT USER WINDOW,. ;CAN'T BE SET FAST MAP/ ASL R0 ;ADJUST TOF0 ASL R0 ;QUADWORD OFFSET-'1 BIC #177407,R0 ;REMOVE UNNEEDED BITSN 2 ADD $FMAPP,R0 ;POINT TO BLOCK3 CLR (R0) ;INDICATE UNUSED 45$:D"5 .ENDC ; DF F$$MAP&X$$HDR&P$$LAS6>7 MOV W.BATT(R4),R0 ;PICK UP ADDRESS OF ATTACHMENT DESCRIPTOR68 CLR W.BATT(R4) ;CLEAR ATTACHMENT DESCRIPTOR POINTER+9 DECB A.MPCT(R0) ;DECREMENT MAPPING COUNTA;: MOVB A.MPCT(R0),-(SP) ;SAVE MAPPING COUNT FOR TEST LATERR.; MOV A.TCB(R0),R1 ;POINT TO TASK TCB ADDRESS<=> .IF DF X$$HDR?4@ MOV $SAHPT,R0 ;GET ADDRESS OF CURRENT TASK HEADERAB .IFFRC4D MOV $HEADR,R0 ;GET ADDRESS OF CURRENT TASK HEADEREF .ENDCGH .IF DF S$$LIB!U$$DASI9J MOV H.SMAP(R0),-(SP) ;GET SUPER MAPPING MASK FOR LATERKKL .ENDC ; DF S$$LIB!U$$DASTM6N MOV H.WND(R0),R2 ;GET ADDRESS OF FIRST WINDOW BLOCK.O MOVB W.BFPD(R4),R0 ;POINT TO FIRST USER PDRP Q TR .IF DF S$$LIBS GT BPL 17$ ;IF PL SUPER WINDOWTUV .IFTF ; DF S$$LIBW10$: ;REFERENCE LABELX .IF DF U$$DASY(Z CMP #UDSDR0,R0 ;USER D SPACE WINDOW ?.[ BLOS 140$ ;IF LOS YES, HANDLE USER D SPACE\] .ENDC ; DF U$$DAS^,_ TST W.BLVR+2(R2) ;IS THE TASK PRIVILEGED?` BEQ 14$ ;IF EQ NO 7a MOV KISAR0-UINDR0(R0),UINAR0-UINDR0(R0) ;RESTORE PRVLb ;MAPPINGcd .IF DF M$$PROe2f MOV #177406,(R0)+ ;RESTORE R/W 4K BYPASS ACCESSgh .IFF ; DF M$$PROi*j MOV #77406,(R0)+ ;RESTORE R/W 4K ACCESSkl .ENDC ; DF M$$PROmn .IF DF U$$DASo:p BITB $BTMSK-UINDR0-2(R0),1(SP) ;THIS APR MAPPED THROUGH q ;DISCRETE USER D WINDOW0r BNE 15$ ;IF NE YES, LEAVE USER/SUPER D ALONE:s MOV KISAR0-UINDR0-2(R0),UDSAR0-UINDR0-2(R0) ;MAP USER Dt ;TO EXECQuv .IF DF M$$PROw@x MOV #177406,UDSDR0-UINDR0-2(R0) ;RESTORE R/W 4K BYPASS ACCESSyz .IFF ; DF M$$PROV{8| MOV #77406,UDSDR0-UINDR0-2(R0) ;RESTORE R/W 4K ACCESS}~ .ENDC ; DF M$$PRO€ .ENDC ; DF U$$DAS�‚ .IFT ; DF S$$LIB$ƒ>„ BITB $BTMSK-2-UINDR0-2(R0),(SP) ;SUPER I MAPPED TO USER D ?… BNE 15$ ;IF NE NO>† MOV KISAR0-UINDR0-2(R0),SDSAR0-UINDR0-2(R0) ;MAP SUPER D TO‡ ;EXECˆ‰ .IF DF M$$PROŠ@‹ MOV #177406,SDSDR0-UINDR0-2(R0) ;RESTORE R/W 4K BYPASS ACCESSŒ� .IFF ; DF M$$PRO#Ž8� MOV #77406,SDSDR0-UINDR0-2(R0) ;RESTORE R/W 4K ACCESS�‘ .ENDC ; DF M$$PRO’ V“ .IFTF” U • BR 15$ ;&–14$: CLR (R0)+ ;CLEAR NEXT USER PDR—˜ .IF DF U$$DAS™<š BITB $BTMSK-UINDR0-2(R0),1(SP) ;THIS USER D APR MAPPED BY!› ;EXPLICIT D SPACE WINDOWD$œ BNE 15$ ;IF NE YES, DON'T CHANGE.� CLR UDSDR0-UINDR0-2(R0) ;UNMAP USER D SPACEžŸ .ENDC ; DF U$$DAS ¡ .IFT ; DF S$$LIBM¢<£ BITB $BTMSK-2-UINDR0-2(R0),(SP) ;SUPER D MAPPED TO USER D¤ ;FOR THIS APR ?¥ BNE 15$ ;IF NE NOR/¦ CLR SDSDR0-UINDR0-2(R0)00‡jz�yt´cÚµcÛ¶c�·c›’ ;UNMAP SUPER D SPACE §¨ .IFTF ; DF S$$LIB©ª .IF DF U$$DAS«¬ BR 15$ ;SKIP USER D CODE­C®140$: BICB $BTMSK-UDSDR0(R0),1(SP) ;INDICATE REMAPPING TO I SPACEA@¯ MOV UINAR0-UDSDR0(R0),UDSAR0-UDSDR0(R0) ;MAP USER D TO USER I3° MOV UINDR0-UDSDR0(R0),(R0)+ ;AND SET SAME ACCESSA±² .IF DF S$$LIB³>´ BITB $BTMSK-2-UDSDR0-2(R0),(SP) ;THIS SUPER D APR MAPPED TOµ ;USER D SPACE ¶ BNE 15$ ;IF NE NO >· MOV UINAR0-UDSDR0-2(R0),SDSAR0-UDSDR0-2(R0) ;MAP SUPER D TO¸ ;USER D>¹ MOV UINDR0-UDSDR0-2(R0),SDSDR0-UDSDR0-2(R0) ;AND SET ACCESSº» .ENDC ; DF S$$LIB¼½ .ENDC ; DF U$$DAS¾!¿15$: DECB W.BNPD(R4) ;DONE YET?IÀ BGT 10$ ;IF GT NOUÁ .IFT ; DF S$$LIBDÃ*Ä BR 18$ ;SKIP SUPER I SPACE WINDOW CODEÅ3Æ17$: ADD #SDSDR0,R0 ;ADJUST TO SUPER D SPACE PDRSB6Ç DECB $SUPFL ;COUNT ONE LESS SUPERVISOR MODE WINDOW(È BNE 170$ ;IF NE THERE STILL ARE SOME(É BIC #10,SR3 ;DISABLE CSM INSTRUCTION:Ê BIS #PMODE!CMODE,$STACK-2 ;FORCE EXECUTION TO USER MODE:Ë170$: BITB $BTMSK-2-SDSDR0(R0),(SP) ;THIS APR OVERMAPPED#Ì BEQ 171$ ;IF EQ NO, DON'T TOUCH%Í CLR (R0)+ ;CLEAR NEXT SUPER D PDRNÎ BR 172$ ;GO DO NEXT ONE$!Ï171$: TST (R0)+ ;SKIP THIS APRI#Ð172$: DECB W.BNPD(R4) ;DONE YET ?EÑ BGT 170$ ;IF GT NOÒÓ .ENDC ; DF S$$LIBÔÕ18$: ;REFERENCE LABELSÖ× .IF DF U$$DAS!S$$LIBSØ,Ù MOV $SAHPT,R0 ;GET ADDRESS OF TASK HEADER@Ú MOVB 1(SP),H.DMAP(R0) ;RESTORE D SPACE MAPPING MASK TO HEADER&Û TST (SP)+ ;CLEAN OFF MAPPING MASKSÜÝ .ENDC ; DF U$$DAS!S$$LIBRÞ,ß MOV R1,R0 ;COPY TCB ADDRESS FOR DEACCESS)à MOV (R4),R1 ;POINT TO PCB TO DEACCESS á â Nã .IF DF M$$PRO Oä 2å CALL $RESBP ;RESET CACHE BYPASS AS APPROPRIATEæ Bç .IFTFè E6é TSTB (SP)+ ;WAS THIS LAST MAP THROUGH ATTACHMENT ?0ê BNE 20$ ;IF NE NO, DON'T DEACCESS REGION YETë MOV R0,-(SP) ;SAVE REGISTERS;ì MOV R1,-(SP) ; í CALL $DEARG ;DEACCESS REGION"î MOV (SP)+,R1 ;RESTORE REGISTERSï MOV (SP)+,R0 ;C'ð20$: CLR (R4) ;UNMAP WINDOW (W.BPCB) ñ Sò .IFTó ô Rõ ö .IF DF M$$EXT÷ E3ø CMP P.REL(R1),#177600 ;IS REGION IN THE IO PAGE?ù ú .IFFFû $1ü CMP P.REL(R1),#7600 ;IS REGION IN THE IO PAGE?Sý Oþ .ENDCÿ  F BLO 95$ ;NO IF LO;) CALL $SETAT ;RECALULATE TASK AFFINITYB $ .IFTF N&95$: MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R2 ; MOV (SP)+,R3 ;'  SEC ;RETURN CS FOR WINDOW UNMAPPEDP 100$: RETURN ;    .ENDC    .ENDC ; DF P$$LAS W  .DSABL LSBS ;+.; **-$GTMCT-DETERMINE NUMBER OF MAPPED TASKS;7K; THIS ROUTINE CALCULATES THE NUMBER OF WINDOWS MAPPED TO A GIVEN REGION.09; THE VALUE RETURNED IS FOR DETERMINING IF CACHE BYPASS!; IS NECESSARY FOR THIS REGION.T;C ; INPUTS:A;T; R1=PCB ADDRESS; ; OUTPUTS:!; -"; R2=NUMBER OF WINDOWS MAPPED TO THE REGION(#; R2=0 FOR READ ONLY COMMONSO!$; R2=1 IF ONE WINDOW IS MAPPED 0%; R0=ADDRESS OF TASK'S ATTACHMENT DESCRIPTOR8&; R2=2 IF 2 OR MORE WINDOWS ARE MAPPED TO THIS REGION';E(; R0 MODIFIEDA);-* + , .IF DF M$$PRO- A).$GTMCT::CLR R2 ;ASSUME NO MAPPED TASKS +/ BIT #P2.RON,P.ST2(R1) ;READ ONLY REGION?M0 BNE 30$ ;YES IF NE1 MOV R1,-(SP) ;R*2 CLR -(SP) ;RESERVE A WORD ON THE STACK)3 ADD #P.ATT,R1 ;POINT TO ATT DESCR LIST,410$: MOV (R1),R1 ;POINT TO NEXT ATT DESCR5 BEQ 20$ ;IF EQ END OF LIST*6 MOVB A.MPCT-A.PCBL(R1),R0 ;TASK MAPPED?7 BEQ 10$ ;IF EQ NOA.8 MOV R1,(SP) ;SAVE ATTACHMENT DESCR ADDRESS59 ADD R0,R2 ;CALCULATE TOTAL NUMBER OF TASKS MAPPED): CMP R2,#2 ;AT LEAST TWO TASKS MAPPED?; BLT 10$ ;IF LT NO 4<20$: SUB #A.PCBL,(SP) ;POINT TO START OF ATT DESCR&= MOV (SP)+,R0 ;GET ATT DESCR ADDRESS> MOV (SP)+,R1 ;RESTORE R1R?30$: RETURN ;E@ KA;+!B; **-$STCXT-SET MAPPING CONTEXTSC;9D; THIS ROUTINE RELOADS THE PDRS FOR A SPECIFIED REGION. E;D F; INPUTS:MG;.@H; IF CALLED TO FORCE SECOND MAPPED TASK TO BYPASS THE CACHE:00‡rzTztöt÷tø tþfDATAI;)<J; R4=ATTACHMENT DESCRIPTOR FOR FIRST TASK TO MAP TO REGION=K; R5=ATTACHMENT DESCRIPTOR FOR SECOND TASK TO MAP TO REGIONAL;KM; IF CALLED TO RELOAD THE PDRS FOR THE ONLY TASK MAPPED TO THIS REGION:RN;M;O; R4=ATTACHMENT DESCRIPTOR FOR ONLY TASK MAPPED TO REGIONRP; R5=0Q;R R; OUTPUTS:S;DT; THE PDRS ARE SET UP SO THAT ACCESSES TO THIS REGION BYPASS CACHEU; AS APPROPRIATE. V;NW;-X Y$STCXT:: ;REFERENCE LABELEZ[ .IF DF X$$HDR\)] MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGC^_ .ENDC`1a MOV $TKTCB,R0 ;GET TCB ADDRESS OF CURRENT TASKE#b BEQ 100$ ;IF EQ NO CURRENT TASKG+c BIT #TS.RUN,T.STAT(R0) ;IS TASK RUNNING?Sd BEQ 100$ ;NO IF EQ$e MOV T.PCB(R0),R0 ;GET PCB ADDRESSfg .IF DF X$$HDRLhi .IFTFj'k MOV P.HDR(R0),R1 ;GET HEADER ADDRESSlm .IFTSn#o BNE 10$ ;IF NE, RESIDENT HEADERO3p MOV P.REL(R0),KISAR6 ;MAP TO NON RESIDENT HEADER/q MOV #140000,R1 ;POINT TO NON RESIDENT HEADER$r10$:s .ENDCt/u MOV R4,R2 ;COPY ATT DESCR ADDRESS OF CALLER#v CALL $SRWAT ;SEARCH FOR WINDOW Cw BCS 100$ ;IF CS NOT FOUNDE*x TST W.BPCB(R0) ;IS WINDOW STILL MAPPED?y BEQ 100$ ;NO IF EQ4z BIT #WB.NBP,W.BLPD(R0) ;CACHE BYPASS NOT DESIRED?%{ BNE 100$ ;YES IF NE DO NOT BYPASSF*| CLR -(SP) ;RESERVE A WORD ON THE STACK3} MOVB W.BNPD(R0),(SP) ;GET NUMBER OF PDRS TO LOADH.~ MOV W.BLPD(R0),R2 ;GET CONTENTS OF LAST PDR* BIC #77777,R2 ;KEEP ONLY THE BYPASS BIT/€ MOVB W.BFPD(R0),R1 ;GET ADDRESS OF FIRST PDRR� ‚ ƒ .IF DF S$$LIB„ L… BMI 30$ ;IF MI USER WINDOW*† ADD #SISDR0,R1 ;POINT TO SUPERVISOR PDR‡ Tˆ .IFTF‰ /Š30$: BIC #100000,(R1) ;CLEAR BYPASS INDICATORB.‹ BIS R2,(R1)+ ;SET BYPASS BIT AS APPROPRIATEŒ B� .IFT;Ž F� CMP R1,#UISDR0 ;USER WINDOW? � BLO 40$ ;NO IF LOS-‘ MOV -2(R1),SDSDR0-UISDR0-2(R1) ;RELOAD PDRR’ L“ .ENDC” B• 0(–40$: DEC (SP) ;FINISHED LOADING PDRS?— BGT 30$ ;IF GT NOY˜ TST (SP)+ ;CLEAN THE STACK™100$: ;REFERENCE LABELš› .IF DF X$$HDRœ+� MOV (SP)+,KISAR6 ;RESTORE KERNEL MAPPINGDžŸ .ENDC ¡ TST R5 ;RESET BYPASS+¢ BEQ 110$ ;IF EQ YES, NO TASK TO UNBLOCKR$£ MOV A.TCB(R5),R0 ;GET TCB ADDRESS#¤ DEC T.STAT(R0) ;UNBLOCK THE TASK4¥ CALLR $SETCR ;SET A CONDITIONAL SCHEDULE REQUEST¦110$: RETURN ;§ -¨;+©; **-$SRWAT-SEARCH FOR WINDOWª;:«; THIS ROUTINE SEARCHES FOR A MAPPED WINDOW WITH A GIVEN¬; ATTACHMENT DESCRIPTOR.­;T ®; INPUTS:N¯;S°; R1=HEADER ADDRESSE$±; R2=ATTACHMENT DESCRIPTOR ADDRESS²;V ³; OUTPUTS:´;O,µ; C=1 IF NO MATCH ON ATTACHMENT DESCRIPTOR¶;E·; C=0 IF WINDOW FOUND;¸; R0=WINDOW ADDRESS¹;Rº;M»; R0 MODIFIEDG¼;-½6¾$SRWAT::MOV H.WND(R1),R0 ;POINT TO NUMBER OF WINDOWS)¿ MOV (R0)+,-(SP) ;GET NUMBER OF WINDOWS7À10$: CMP W.BATT(R0),R2 ;ATTACHMENT DESCRIPTORS MATCH?NÁ BNE 15$ ;IF NE NOU% TSTB A.MPCT(R2) ;IS WINDOW MAPPED?Aà BNE 20$ ;IF NE YES+Ä15$: ADD #W.BLGH,R0 ;POINT TO NEXT WINDOWHÅ DEC (SP) ;ANY WINDOWS LEFT? Æ BGT 10$ ;IF GT YESÇ SEC ;WINDOW NOT FOUND<È20$: MOV PC,(SP)+ ;CLEAN THE STACK WITHOUT MODIFYING CARRY É RETURN ;RÊË;+ Ì; **-$RESBP-RESET CACHE BYPASSÍ;5Î; THIS ROUTINE WILL RESET CACHE BYPASS FOR A REGIONW/Ï; IF ONLY ONE WINDOW IS MAPPED TO THE REGION.Ð;0 Ñ; INPUTS:(Ò;2Ó; R1=PCB ADDRESSÔ;M Õ; OUTPUTS:Ö; 9×; CACHE BYPASS IS DISABLED IF ONLY ONE WINDOW IS MAPPED2Ø; TO THE REGION.Ù;DÚ;-Û !Ü$RESBP::SAVNR ;SAVE REGISTERS Ý MOV R3,-(SP) ; Þ MOV R2,-(SP) ;Tß MOV R1,-(SP) ;Dà MOV R0,-(SP) ;:áâ .IF DF X$$HDRã)ä MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGRåæ .ENDCç8è CALL $GTMCT ;GET NUMBER OF TIMES REGION IS MAPPED TOé DEC R2 ;ONLY MAPPED ONCE?ê BNE 100$ ;IF NE NO$ë MOV A.TCB(R0),R2 ;GET TCB ADDRESS$ì MOV T.PCB(R2),R2 ;GET PCB ADDRESS>í BIT #PS.OUT!PS.CKP!PS.CKR,P.STAT(R2) ;IS TASK CHECKPOINTED?î BEQ 10$ ;IF EQ NOO,ï BICB #AS.SBP,A.STAT(R0) ;CLEAR BYPASS BIT<ð BISB #AS.RBP,A.STAT(R00‡zz�yt´cÚµcÛ¶c�·c›’0) ;INDICATE BYPASS IS NOT NECESSARY ñ BR 100$ ; ò .IF DF X$$HDR óô .IFTFõ+ö10$: MOV P.HDR(R2),R1 ;GET HEADER ADDRESS ÷ø .IFTù#ú BNE 20$ ;IF NE, RESIDENT HEADER 3û MOV P.REL(R2),KISAR6 ;MAP TO NON RESIDENT HEADER /ü MOV #140000,R1 ;POINT TO NON RESIDENT HEADERRý20$:þ .ENDCÿ1 MOV R0,R2 ;COPY ATTACHMENT DESCRIPTOR ADDRESSP" CALL $SRWAT ;SEARCH FOR WINDOW BCS 100$ ;IF CS NOT FOUNDN9 BIC #100000,W.BLPD(R0) ;RESET CACHE BYPASS IN LAST PDRA: BIT #WB.NBP!WB.BPS,W.BLPD(R0) ;SHOULD TASK RELOAD PDRS? BNE 100$ ;IF NE NO 2 MOV R2,R4 ;COPY ATT DESCR FOR ONLY TASK MAPPED  CLR R5 ;3 MOV A.TCB(R2),R2 ;GET TCB ADDRESS OF MAPPED TASK +  BIT #TS.RUN,T.STAT(R2) ;IS TASK RUNNING?T  BEQ 100$ ;IF EQ NO1  MOVB T.CPU(R2),R2 ;FIND CPU TASK IS RUNNING ONC!  ASL R2 ;CONVERT TO WORD INDEXT!  MOV $BTMSK(R2),R2 ;GET CPU BITT8 MOV #$STCXT,R3 ;GET ADDRESS OF ROUTINE TO RELOAD PDRS4 CALL $EXROP ;EXECUTE $STCXT ON CORRECT PROCESSOR B100$: ;REFERENCE LABEL; .IF DF X$$HDR* MOV (SP)+,KISAR6 ;RESTORE APR 6 MAPPING  .ENDC T" MOV (SP)+,R0 ;RESTORE REGISTERS MOV (SP)+,R1 ;A MOV (SP)+,R2 ;S MOV (SP)+,R3 ;T  RETURNI K;+$ ; **-$SETBP-SETUP FOR CACHE BYPASS!;(E"; THIS ROUTINE WILL DETERMINE IF ONLY ONE WINDOW IS MAPPED TO THIS TI#; REGION. IF SO, THE TASK MAPPED TO THIS REGION IS NOTIFIED TO BYPASS T$; CACHE AS NECESSARY.L%;R &; INPUTS:$'; (; R0=TCB ADDRESS); R1=PCB ADDRESS9*; R3=WINDOW ADDRESS OF TASK ABOUT TO MAP TO THIS REGIONS+;R ,; OUTPUTS:-;G8.; TASK MAPPED TO THIS REGION IS NOTIFIED AS NECESSARY.;/; TASK ABOUT TO MAP IS BLOCKED (IF NECESSARY) UNTIL TASK '0; ALREADY MAPPED RELOADS ITS CONTEXT.U1; 2;-3 S!4$SETBP::SAVNR ;SAVE REGISTERSM5 MOV R3,-(SP) ;D6 MOV R2,-(SP) ;S7 MOV R1,-(SP) ; 8 MOV R0,-(SP) ; 9: .IF DF X$$HDR;)< MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGR=> .ENDC?@ MOV R0,R4 ;COPY TCB ADDRESSB-A CALL $GTMCT ;GET NUMBER OF WINDOWS MAPPEDO&B DEC R2 ;ONLY ONE CURRENTLY MAPPED?C BNE 100$ ;IF NE NO7D10$: MOV A.TCB(R0),R1 ;GET TCB ADDRESS OF TASK MAPPEDT!E MOV T.PCB(R1),R1 ;POINT TO PCBI;F BIT #PS.OUT!PS.CKP!PS.CKR,P.STAT(R1) ;TASK CHECKPOINTED?-G BEQ 20$ ;IF EQ NO 8H BISB #AS.SBP,A.STAT(R0) ;INDICATE BYPASS IS NECESSARYI BICB #AS.RBP,A.STAT(R0) ; J BR 100$ ;5K20$: MOV R0,R2 ;COPY ATTACHMENT DESCRIPTOR ADDRESS LM .IF DF X$$HDRNOP MOV R1,R2 ;COPY PCB POINTERC'Q MOV P.HDR(R1),R1 ;GET HEADER ADDRESSO#R BNE 30$ ;IF NE, RESIDENT HEADERE3S MOV P.REL(R2),KISAR6 ;MAP TO NON RESIDENT HEADERG/T MOV #140000,R1 ;POINT TO NON RESIDENT HEADERRU30$: MOV R0,R2V TW .IFFPX'Y MOV P.HDR(R1),R1 ;GET HEADER ADDRESSZ[ .ENDC"\ CALL $SRWAT ;SEARCH FOR WINDOW] BCS 100$ ;IF CS NOT FOUND4^ BIS #100000,W.BLPD(R0) ;SET UP LAST PDR TO BYPASS$_ MOV A.TCB(R2),R1 ;GET TCB ADDRESS&` CMP R1,R4 ;SAME TASK MAPPED TWICE?a BEQ 100$ ;IF EQ YES =b BIT #TS.RUN,T.STAT(R1) ;IS TASK RUNNING ON SOME PROCESSOR? c BEQ 100$ ;IF EQ NOd MOV R1,-(SP) ;SAVE R1%e INC T.STAT(R4) ;BLOCK CALLING TASK4f MOV R4,R0 ;COPY TCB ADDRESSA'g CALL $SETCR ;SET A SCHEDULE REQUESTh MOV (SP)+,R1 ;RESTORE R1A4i MOV R2,R4 ;COPY ATTACHMENT DESCR FOR TASK MAPPED3j MOV W.BATT(R3),R5 ;GET ATT DESCRIPTOR OF CALLER 09k MOVB T.CPU(R1),R2 ;GET CPU ID ON WHICH TASK IS RUNNINGR!l ASL R2 ;CONVERT TO WORD INDEXS"m MOV $BTMSK(R2),R2 ;GET RUN MASK1n MOV #$STCXT,R3 ;GET ADDRESS OF ROUTINE TO CALLN8o CALL $EXROP ;EXECUTE $STCXT ON THE CORRECT PROCESSORp100$: ;REFERENCE LABELAq .IF DF X$$HDRr+s MOV (SP)+,KISAR6 ;RESTORE KERNEL MAPPINGLtu .ENDCv"w MOV (SP)+,R0 ;RESTORE REGISTERSxy MOV (SP)+,R1 ;4z MOV (SP)+,R2 ;D{ MOV (SP)+,R3 ;D | RETURN ;(} 5} .ENDC ; DF M$$PRO L€ � V‚;+ƒ; **-$DELRG-DELETE REGION „;IJ…; THIS ROUTINE ASSUMES ALL CHECKS HAVE BEEN MADE ON WHETHER A REGION MAYH†; BE DELETED OR NO00‡‚zTztöt÷tø tþfDATAT. IT UNCONDITIONALLY DELETES THE REGION REGARDLESS-‡; OF WHAT STATE THE REGION IS CURRENTLY IN.0ˆ; H‰; WHEN THE REGION IS BE DELETED, A NUMBER OF OPERATIONS MAY HAVE TO BEGŠ; PERFORMED TO EFFECT ALL NECESSARY CLEANUP, DEPENDING ON THE CURRENTJ‹; STATE OF THE REGION AS DETERMINED BY THE BITS PS.OUT AND PS.CKP. NOTEFŒ; THAT IF THE REGION IS OUT OF MEMORY, IT CANNOT BE IN THE PARTITIONE�; WAIT QUEUE, LOADER OR LOADER QUEUE. THIS IS DUE TO THE FACT THATTJŽ; SINCE THE CURRENT TASK IS RUNNING, IT HAS EITHER NOT BEEN MAPPED (COM-J�; MON CANNOT BE CONTENDING FOR MEMORY) OR MAPPED AND NOT BLOCKED (COMMONG�; IS IN MEMORY). ON DELETION, IF THE REGION HAS A NAME IT IS REMOVEDEG‘; FROM THE COMMON BLOCK DIRECTORY. ADDITIONAL CLEANUP ACTIONS FOR THET+’; FOUR POSSIBLE STATES OF THE REGION ARE:S“;A?”; (PS.OUT=0,PS.CKP=0 => COMMON IS IN MEMORY) - RELEASE MEMORYN(•; DELETE REGION PCB AND ANY DISK PCB.–;OD—; (PS.OUT=0,PS.CKP=1 => COMMON IS IN PROCESS OF BEING CHECKPOINTED<˜; OUT) - RELEASE MEMORY AND COUNT ON THE LOADER TO DETECT8™; THIS CONDITION AND RELEASE ANY CHECKPOINT SPACE AND$š; DELETE REGION PCB AND DISK PCB.›;IBœ; (PS.OUT=1,PS.CKP=0 => REGION NEVER LOADED) - DELETE REGION PCB�; AND ANY DISK PCB.ž;C?Ÿ; (PS.OUT=1,PS.CKP=1 => REGION IS CHECKPOINTED OUT) - RELEASEA9 ; CHECKPOINT SPACE AND DELETE REGION PCB AND DISK PCB.M¡;N ¢; INPUTS: £;N¤; R0=REGION PCB ADDRESS.¥; ¦; OUTPUTS:§;= ¨; NONE. ©;-ª O7«$DELRG::BIT #PS.COM,P.STAT(R0) ;IS IT A NAMED COMMON?T¬ BEQ 40$ ;IF EQ NOT.­ TST P.NAM(R0) ;DOES THE REGION HAVE A NAME?® BEQ 40$ ;IF EQ NO >¯ MOV #$CBDHD-P.CBDL,R1 ;POINT TO COMMON BLOCK DIRECTORY HEAD4°30$: CMP P.CBDL(R1),R0 ;POINTING TO ONE TO DELETE?± BEQ 35$ ;IF EQ YES#² MOV P.CBDL(R1),R1 ;POINT TO NEXTO ³ BR 30$ ;B´35$: MOV P.CBDL(R0),P.CBDL(R1) ;UNLINK FROM COMMON BLK DIRECTORY5µ40$: BIS #PS.DEL,P.STAT(R0) ;MARK REGION FOR DELETE/¶ BIT #PS.OUT,P.STAT(R0) ;IS REGION IN MEMORY?G· BNE 50$ ;IF NE NO)¸ MOV R0,R1 ;COPY PCB ADDRESS4+¹ TST P.DPCB(R0) ;DOES IT HAVE A DISK PCB?Gº BEQ 45$ ;IF EQ NOQ9» CALLR $ICHKP ;INITIATE CHECKPOINT & LET LOADER FINISH %¼45$: MOV R0,-(SP) ;SAVE PCB ADDRESS(½ CALL $RLPR1 ;FREE MEMORY$¾ MOV (SP)+,R0 ;RESTORE PCB ADDRESS.¿50$: CALLR $RLCPS ;RELEASE CHECKPOINT SPACEÀÁ;+<Â; **-$DETRG-DETACH REGION BY ATTACHMENT DESCRIPTOR ADDRESSÃ;SMÄ; THIS ROUTINE DETACHES A TASK FROM A REGION AND DEALLOCATES THE ATTACHMENTIKÅ; DESCRIPTOR. ON THE LAST DETACH OF A REGION IT IS CHECKED FOR DELETION.P&Æ; WHEN APPRORIATE, $NXTSK IS CALLED.Ç;4Ç;IMÇ; NOTE: THE DETACH REGION ROUTINE MAKES USE OF THE FOLLOWING RELATIONSHIPSV9Ç; IN THE DATA STRUCTURES AS SHOWN IN THE DIAGRAM BELOW:Ç;V%Ç; A.TCB IS AT OFFSET 4 FROM A.PCBLC%Ç; A.PCB IS AT OFFSET 4 FROM A.TCBLÇ;Ç; Ç; PCBA Ç; +-------+TÇ; | |EÇ; | |A$Ç; |-------| ADB4Ç; | P.ATT |--| +---------------+ +---------------+;Ç; |-------| |--->| A.PCBL |------>| 0 |<------+E9Ç; +----|-------| |---------------| |---------------| |*Ç; | | | | A.IOC | A.PRI | | | | |0Ç; | | | |---------------| |---------------| |%Ç; | +-------+ | A.TCB | | | |D5Ç; | |---------------| |---------------| |P7Ç; | TCB |--->| A.TCBL |------>| 0 | |?Ç; | +-------+ | |---------------| |-->|---------------| | +Ç; | | | | |A.MPCT | A.STAT| | | | | |-7Ç; | | | | |---------------| | |---------------| |A,Ç; | |-------| | | A.PCB | | | | |=Ç; | | T.ATT |--| +---------------+ | +---------------+ | 1Ç; | |-------| | |-1Ç; | |-------|---------------------------| |AÇ; | | | |Ç; | | | |Ç; | +-------+ |Ç; | |KÇ; +--------------------------------------------------------------------+-Ç; Ç;>Ç;-KÇ; THE ROUTINE BELOW CLEARS THE KEY TO SEARCH ON, AND CLEARS OFFSET 4 FROM-JÇ; THE LINK WORD BEFORE CALLING $QRMVT. $Q00‡ŠzˆŽzt´cÚµcÛ¶c�·c›’RMVT COMPARES OFFSET 4 IN EACHMÇ; ELEMENT ON THE LIST WITH THE KEY. THE ZERO KEY WILL MATCH THE ATTACHMENT 1Ç; DESCRIPTOR WHICH HAS BEEN MARKED WITH A ZERO. Ç;- È; INPUTS:-É;-'Ê; R5=ADDRESS OF ATTACHMENT DESCRIPTORË;| Ì; OUTPUTS:Í;|Î; R0,R1,R2,R3 ARE MODIFIED. Ï;- Ð 2Ñ$DETRG::MOV A.PCB(R5),R0 ;POINT TO PCB OF REGION4Ò ADD #P.ATT,R0 ;POINT TO ATTACHMENT DESCR LISTHEADÓ CLR R1 ;CLEAR SEARCH KEY(Ô MOV A.TCB(R5),-(SP) ;SAVE TCB ADDRESS8Õ CLR A.TCB(R5) ;MARK ATTACHMENT DESCRIPTOR FOR REMOVAL3Ö CALL $QRMVT ;REMOVE DESCRIPTOR FROM PCB'S QUEUEI.× TST (R0) ;IS ANYONE ELSE ATTACHED? (P.ATT)Ø BNE 55$ ;IF NE YES *Ù SUB #P.ATT,R0 ;POINT TO START OF PCB 4Ú BIT #PS.PER,P.STAT(R0) ;PARITY ERROR IN REGION? Û BEQ 22$ ;IF EQ NO 3Ü MOV $FXRPT,R0 ;GET TCB ADDRESS OF RECOVERY TASK N(Ý BEQ 55$ ;IF EQ IT IS NOT INSTALLED 1Þ CMP R0,(SP) ;PARITY ERROR IN RECOVERY TASK? Eß BEQ 55$ ;IF EQ YES ,à CALL $EXRQN ;REQUEST THE RECOVERY TASK #á BR 55$ ;DO NOT DELETE REGION /â22$: TST P.NAM(R0) ;IS THIS A NAMED REGION? Iã BNE 25$ ;IF NE YES 'ä MOV (SP),R1 ;PICK UP TCB ADDRESS Y,å MOV T.PCBV(R1),R1 ;POINT TO PCB VECTOR #æ BEQ 26$ ;IF EQ THERE IS NONE T/ç CMP R0,2(R1) ;READ ONLY REGION OF MU TASK? %è BNE 26$ ;IF NE NO, MUST DELETE C!é BR 55$ ;ELSE DO NOT DELETE <ê25$: BIT #PS.DEL,P.STAT(R0) ;IS REGION MARKED FOR DELETE? ë BEQ 55$ ;IF EQ NO Q)ì26$: CALL $DELRG ;DELETE THE REGION V+í55$: MOV (SP)+,R0 ;RESTORE TCB ADDRESS 9î ADD #T.ATT,R0 ;POINT TO ATTACHMENT DESCRIPTOR LISTHEADEï CLR R1 ;CLEAR SEARCH KEY8ð CLR A.PCB(R5) ;MARK ATTACHMENT DESCRIPTOR FOR REMOVAL2ñ CALL $QRMVT ;REMOVE DESCRIPTOR FROM TCB'S LIST&ò MOV R5,R0 ;COPY DESCRIPTOR ADDRESS)ó MOV #A.LGTH,R1 ;SET SIZE TO DEALLOCATES2ô CALLR $DEACB ;DEALLOCATE ATTACHMENT DESCRIPTOR õ ö .END(R0) ;IS REGION MARKED FOR DELETE? ë BEQ 55$ ;IF EQ NO Q)ì26$: CALL $DELRG ;DELETE THE REGION V+í55$: MOV .TITLE DRABOT .IDENT /04.01/E N; ;V; COPYRIGHT (c) 1981 BY(; DIGITAL EQUIPMENT CORPORATION, MAYNARD'; MASSACHUSETTS. ALL RIGHTS RESERVED. ;$ ; COPYRIGHT (C) 1974, 1976, 1979;.A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDA; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSEHA; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISKA; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OREA; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND 1; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERED.I;AA; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTEA; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;SA; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFM<; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.;R;T; D. N. CUTLER 11-SEP-73; ;A; PREVIOUSLY MODIFIED BY:M;N; T. M. MARTIN; MODIFIED BY:;E ; B. S. MCCARTHY 16-OCT-84 04.01;T&; BM319 -- ADDITION OF BOM$ DIRECTIVE;S; MACRO LIBRARY CALLSA;  .MCALL ABODF$" ABODF$ ;DEFINE TASK ABORT CODES;+; **-$DRABO-ABORT TASK;OE; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TERMINATE THE EXECUTION OF A; SPECIFIED TASK.E;O ; DPB FORMAT: ; "; WD. 00 -- DIC(83.),DPB SIZE(3.).$; WD. 01 -- FIRST HALF OF TASK NAME.%; WD. 02 -- SECOND HALF OF TASK NAME.1;E ; INPUTS:A; 1; R0=ADDRESS OF THE TCB OF THE TASK TO TERMINATE.I>; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO TERMINATE.9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.T/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.D,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;E5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; -; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.I&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.U;; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF THE SPECIFIED; TASK IS NOT ACTIVE.S;-*00ˆ’z‰—ztöt÷tø tþfDATA$DRABO::TST (R1)+ ;SPECIFIED TASK ACTIVE? BMI 10$ ;IF MI NOO+ TSTB (R1) ;TASK ALREADY BEING TERMINATED?  BMI 10$ ;IF MI YES) CLR R2 ;INIT SUB-CODE (AB.TYP!AB.NPV=0)N0 BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED?% BNE 5$ ;IF NE YES, SUB-CODE CORRECTA, INC R2 ;SET NONPRIV ABORT ATTEMPT (AB.NPV)05$: MOV R0,R1 ;SET TCB ADDRESS OF TASK TO ABORT% MOV #S.CABO,R0 ;SET REASON FOR ABORTE CALLR $ABTSK ;ABORT TASK'10$: DRSTS D.RS7 ;SET DIRECTIVE STATUSC;+5; **-$DRBOM-SIMULATE BREAKPOINT OR ABORT WITH MESSAGEP;F2; THIS DIRECTIVE HAS ONE OF TWO POSSIBLE OUTCOMES:;S>; 1) THE DIRECTIVE HAS REQUESTED A BREAKPOINT IF POSSIBLE.C; IF THE CURRENT TASK HAS A SST VECTOR SPECIFIED FOR S.CBPT,PE; A SST OCCURS AS IF A BPT HAD BEEN EXECUTED. THIS IS PROVIDEDIE; FOR COMPATIBILITY WITH TASKS WHICH PREVIOUSLY TRAPPED SYSTEMO7; GENERATED BPTS, SUCH AS LOAD OVERLAY FAILURES. ;BA; 2) THE TASK DIDN'T REQUEST A BREAKPOINT, OR THERE IS NO SSTOB; VECTOR FOR BPT. THE TASK IS ABORTED, AND TKTN IS PASSED AC; MESSAGE CODE FOR THE FAILURE (SEE ABODF$ FOR DEFINITIONS).EA; IF THE DIRECTIVE SPECIFIES AN UNKNOWN ERROR CODE, S.BUNKS,; (UNKNOWN BOM$ ERROR) IS SUBSTITUTED;O ; DPB FORMAT:P;A#; WD. 00 -- DIC(211.),DPB SIZE(3.). ; WD. 01 -- ABORT CODE3; WD. 02 -- FLAGS WORD (BIT 0 SET = TRY BREAKPOINT) ;N ; INPUTS:,;C9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.R+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.N,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;R ; OUTPUTS:;O9; EITHER A BREAKPOINT IS SIMULATED OR THE TASK IS ABORTEDK;-.$DRBOM::MOV (R3)+,R1 ;GET SPECIFIED ABORT CODE. MOV #S.BUNK,R0 ;ASSUME INVALID CODE SPECIFIED CMP #S.BHI,R1 ;IS CODE VALID' BLO 10$ ;IF LO NO, USE S.BUNK INSTEAD  INC R1 ;ADJUST CODE UP BY ONE  ADD R1,R0 ;AND BIAS BY S.BUNKS*10$: BIT #S.BBIF,(R3) ;BREAKPOINT DESIRED? BNE 20$ ;IF NE YES CALLR $ABCTK ;GO ABORT TASK4120$: MOV R0,$TEMP0 ;INDICATE ABORT CODE FOR SSTSRA& MOV #S.CBPT,2(SP) ;SET SST ABORT CODE+ MOV #2*2,(SP) ;AND LENGTH AS IF BREAKPOINTS0 MOV R4,R5 ;PUT HEADER ADDRESS IN CORRECT PLACE, CALLR $CNBPT ;ISSUE CONDITIONAL BREAKPOINT .ENDASSUME INVALID CODE SPECIFIED CMP #S.BHI,R1 ;IS CODE VALID' BLO 10$ ;IF LO NO, USE S.BUNK INSTEAD  INC R1 ;ADJUST CODE UP BY ONE  ADD R1,R0 ;AND BIAS BY S.BUNKS*10$: BIT #S.BBIF,(R3) ;BREAKPOINT DESIRED? BNE 20$ ;IF NE YES CALLR $ABCTK ;GO ABORT TASK4120$: MOV .TITLE DRFEA  .IDENT /01.03/R;F; COPYRIGHT (c) 1986 BY d*; DIGITAL EQUIPMENT CORPORATION, MAYNARD); MASSACHUSETTS. ALL RIGHTS RESERVED. ;KC ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED C ; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSEnC ; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISsC ; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORiC ; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO ANDL3; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERED.T;1C; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTTC; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITALU; EQUIPMENT CORPORATION.;C; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF>; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.;; T. M. MARTIN 16-JUL-82;S&; MODIFIED FOR RSX-11M-PLUS V3.0 BY:;W; B. S. MCCARTHY;Y/; MODIFIED FOR RSX-11M-PLUS V3.0 UPDATE B BY:F;S!; B. S. MCCARTHY 9-JUL-86 01.021; &; BM371 - FIX MAJOR MINDSET PROBLEM; "; B. S. MCCARTHY 28-JUL-86 01.03; /; BM372 - FIX MINOR MINDSET PROBLEM IN BM371;I;+) ; **-$DRFEA-TEST FEATURE MASK DIRECTIVER!;SE"; THIS DIRECTIVE WILL TEST FOR THE PRESENCE OF A SPECIFIED FEATURE.H#; $; DPB FORMAT:I%;."&; WD 00. -- DIC=177 , DPB SIZE=2'; WD 01. -- FEATURE TO TESTP(;3 ); INPUTS:*;.4+; R2=ADDRESS OF SECOND STATUS WORD O00‰šzŽzt´cÚµcÛ¶c�·c›’F CURRENT TASK#,; R3=POINTER TO WORD 1 IN THE DPBT0-; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK-.; R5=ADDRESS OF THE TCB OF THE CURRENT TASK-/;. 0; OUTPUTS:1;202; C=0 IF DIRECTIVE WAS SUCCESSFULLY COMPLETED.;3; DIRECTIVE STATUS OF IS.SET 'D.RS22' IS RETURNED IF THED,4; CORRESPONDING FEATURE MASK BIT IS SET.;5; DIRECTIVE STATUS OF IS.CLR 'D.RS00' IS RETURNED IF THEI06; CORRESPONDING FEATURE MASK BIT IS NOT SET.7;358; IF A FEATURE VALUE IS SPECIFIED FOR WHICH THEREO69; IS NO FEATURE MASK WORD IS.CLR IS RETURNED WHICH7:; PRESUMABLY WOULD INDICATE THAT THE SUPPORT IS NOT5;; PRESENT.<;-=> .IF DF R$$FEA? @$DRFEA::5A MOV #$FMASK,R0 ;ASSUME TEST ON SYSTEM FEATURE MASK..B ;WORDS AS OPPOSED TO THE HARWARE FEATUREC ;MASK WORDS.(D MOV (R3),R1 ;GET FEATURE TO TEST FOR4E MOV #$FMEND-$FMASK,R3 ;GET # OF SYSTEM MASK WORDS%F TST R1 ;WAS IT A HARWARE FEATURE?K3G BPL 10$ ;IF PL NOT A HARDWARE FEATURE MASK TESTP7H MOV #$HFMSK,R0 ;POINT TO HARDWARE FEATURE MASK WORDSS6I MOV #$HFEND-$HFMSK,R3 ;GET # OF HARDWARE MASK WORDS0J NEG R1 ;NEGATE SPECIFIED FEATURE TO TEST FOR0K10$: DEC R1 ;NORMALIZE BIT VALUE TO BASE OF 01L MOV R1,R2 ;SAVE FOR OFFSET COMPUTATIONS LATERR7M BIC #^C<17>,R1 ;MASK OFF ALL BUT BIT IDENTIFIER BITS'N ASL R1 ;CONVERT IT TO A WORD OFFSET)O MOV $BTMSK(R1),R1 ;GET BIT TO TEST FORA6P ASH #-4,R2 ;COMPUTE OFFSET TO FEATURE WORD TO TEST Q ASL R2 ;*R CMP R2,R3 ;BEYOND LIMIT OF MASK WORDS?2S BHI 40$ ;IF HI YES, ASSUME SUPPORT NOT PRESENT3T ADD R2,R0 ;FORM ADDRESS OF FEATURE WORD TO TEST#U BIT R1,(R0) ;IS FEATURE PRESENT V BEQ 40$ ;IF EQ, NOW DRSTS D.RS22 ;RETURN IS.SET0#X40$: DRSTS D.RS00 ;RETURN IS.CLRUYZ .ENDC ;R$$FEA[\;+)]; **-$DRTFE-TEST TASK FEATURE DIRECTIVE^;RJ_; THIS DIRECTIVE WILL TEST FOR THE PRESENCE OF A SPECIFIED TASK FEATURE.`;AHa; (AT THE MOMENT, THIS DIRECTIVE CAN ONLY CHECK BITS IN T.STS -> T.ST4Eb; OF THE TCB. THE DIRECTIVE COULD BE EXPANDED TO CHECK OTHER BINARYOJc; TASK FEATURES, SUCH AS PRESENCE OR ABSENCE OF A PARTICULARS AST, ETC.)d;Re; DPB FORMAT:Rf; "g; WD 00. -- DIC=209., DPB SIZE=2h; WD 01. -- FEATURE TO TESTDi;D j; INPUTS:Nk;L4l; R2=ADDRESS OF SECOND STATUS WORD OF CURRENT TASK#m; R3=POINTER TO WORD 1 IN THE DPBH0n; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK-o; R5=ADDRESS OF THE TCB OF THE CURRENT TASKHp;R q; OUTPUTS:r;C0s; C=0 IF DIRECTIVE WAS SUCCESSFULLY COMPLETED.;t; DIRECTIVE STATUS OF IS.SET 'D.RS22' IS RETURNED IF THEU,u; CORRESPONDING FEATURE MASK BIT IS SET.;v; DIRECTIVE STATUS OF IS.CLR 'D.RS00' IS RETURNED IF THEI0w; CORRESPONDING FEATURE MASK BIT IS NOT SET.x;D5y; IF A FEATURE VALUE IS SPECIFIED FOR WHICH THEREO6z; IS NO FEATURE MASK WORD IS.CLR IS RETURNED WHICH7{; PRESUMABLY WOULD INDICATE THAT THE SUPPORT IS NOT5|; PRESENT.};-~ .IF DF R$$FEA€9€$DRTFE::MOV (R3),R1 ;GET FEATURE TO TEST FOR ; BM371O7ƒ10$: DEC R1 ;NORMALIZE BIT VALUE TO BASE OF 0 ;**-2U1„ MOV R1,R0 ;SAVE FOR OFFSET COMPUTATIONS LATERI7… BIC #^C<17>,R1 ;MASK OFF ALL BUT BIT IDENTIFIER BITSN'† ASL R1 ;CONVERT IT TO A WORD OFFSETA)‡ MOV $BTMSK(R1),R1 ;GET BIT TO TEST FORE6ˆ ASH #-4,R0 ;COMPUTE OFFSET TO FEATURE WORD TO TEST ‰ ASL R0 ;@‰ CMP R0,#T.ST3-T.ST2 ;BEYOND FIRST THREE MASK WORDS? ; BM3710‹ BLOS 35$ ;IF LOS NO, OFFSET OK AS IS ;**-1<‹ CMP R0,#T.ST3+2-T.ST2 ;BEYOND FOURTH MASK WORD? ; BM3719� BHI 40$ ;IF HI YES, ASSUME SUPPORT NOT PRESENT ;**-10@� ADD #T.ST4-,R0 ;ADJUST TO SECOND MASK WORD ; BM372>�35$: ADD R0,R2 ;FORM ADDRESS OF FEATURE WORD TO TEST ;**-1#� BIT R1,(R2) ;IS FEATURE PRESENTV‘ BEQ 40$ ;IF EQ, NO’ DRSTS D.RS22 ;RETURN IS.SETP#“40$: DRSTS D.RS00 ;RETURN IS.CLR”• .ENDC ;R$$FEA–— .END;˜ND FIRST THREE MASK WORDS? ; BM3710‹ BLOS 35$ ;IF LOS NO, OFFSET OK AS IS ;**-1<‹ CMP R0,#T.ST3+2-T.ST2 ;BEYOND FOURTH MASK WORD? ; BM3719� BHI 40$ ;IF HI YES, ASSUME SUPPORT N00Š¢z—ztöt÷tø tþfDATA .TITLE MTDRV2 .IDENT /05.08/1;47; COPYRIGHT (C) 1986 BY DIGITAL EQUIPMENT CORPORATIONe; ALL RIGHTS RESERVED.;a>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;D ; VERSION 05.08( ;. ; SCOTT G. DAVIS 9-JUL-74 ;; PREVIOUSLY MODIFIED BY: ;; P. J. BEZEREDI; D. N. CUTLER; S. G. DAVISr; C. A. D'ELIA ; B. LYONS; T. J. MILLER; F. L. STRAIGHT;+; MODIFIED BY:;R;;N-; PB122 -- RETURN IS.SUC FOR EOT ON READS. ;A7; TL069 -- CHECK THAT A CANCEL IS ISSUED BY THE TASK) ; WHICH ISSUED THE CURRENT OPERATIONN!;D0"; TL070 -- RETURN THE CORRECT BLOCK COUNT FOR#; IO.SPB AT EOV$;.%%; TL071 -- FIX BRANCH OUT OF RANGEC&;.%'; TL074 -- DO NOT LOG DATA OVERRUNM(;E,); TL075 -- RETURN EOV FOR IO.SPF, NOT EOT*;:+; CS001 -- TAPE DENSITY SUPPORT IDENTIFICATION IN U.CW3,;R4-; CS002 -- DEVICE NOT READY IF TAPE UNIT OFF LINE.;+/; CS003 -- BOT STATUS IF TAPE UNIT READYA0;$1; CS004 -- REMOVE REDUNDANT CODE,'2; S2.ACT NOT BEING RESET IN S.ST2.S3;H/4; CS005 -- IO.STC/IO.SMO 1600BPI NOT ALLOWEDT)5; ALLOW BAD TAPE READ ERROR RECOVERYT6;07; CS006 -- CORRECT CS003; BOT STATUS VALID IF,8; TAPE UNIT READY .OR. ENDING OPERATION9; @9; CS007 -- HANDLE CALL FOR CONTROLLER POWER FAIL (C BIT SET).9;I:;P;;I(<; TM11 MAGNETIC TAPE CONTROLLER DRIVER=;I>; MACRO LIBRARY CALLS ?;I,@ .MCALL HWDDF$,PKTDF$,ABODF$,CLKDF$,UCBDF$ A HWDDF$ B PKTDF$0 C ABODF$E D CLKDF$CE UCBDF$ ;DEFINE UCB OFFSETSEFGH;I; EQUATED SYMBOLSOJ;IK'LUS.ABO=1 ;ABORT IN PROGRESS - U.STST4MUS.BSP=2 ;INTERNAL BACKSPACE IN PROGRESS - U.STS NUS.PWF=10 ;POWER FAIL STATUSORETRY=12 ;RETRY COUNTGPQ;NR; REGISTER BIT SYMBOLSS;LTUCS.GO=1 ;GO#VCS.EXM=60 ;EXTENDED MEMORY BITSWCS.IE=100 ;INTERRUPT ENABLE $XCS.RDY=200 ;CONTROLLER READY BITYCS.EVN=4000 ;EVEN PARITYZCS.CLR=10000 ;POWER CLEARF%[CS.DN5=20000 ;556 BPI DENSITY BIT%\CS.DN8=40000 ;800 BPI DENSITY BIT]^DS.TUR=1 ;TAPE UNIT READY_DS.RWS=2 ;REWINDINGN`DS.HWL=4 ;WRITE LOCKaDS.SDN=10 ;SETTLE DOWN bDS.7CH=20 ;UNIT IS 7 CHANNEL cDS.BOT=40 ;BEGINNING OF TAPEdDS.MOL=100 ;MEDIUM ON LINEeDS.BTE=400 ;BAD TAPE ERROR$fDS.RLE=1000 ;RECORD LENGTH ERROR%gDS.EOT=2000 ;END OF TAPE DETECTEDEhDS.BGL=4000 ;BUS GRANT LATERiDS.PAE=10000 ;PARITY ERROR+jDS.CRE=20000 ;CYCLICAL REDUNDANCY ERRORS#kDS.TM=40000 ;TAPE MARK DETECTED"lDS.ILG=100000 ;ILLEGAL COMMANDm*nRD.GAP=10000 ;GAP SHUTDOWN IN PROGRESS3oRD.LPC=40000 ;READ LPC CHARACTER AND RTTBL FLAG pq; Jr; MAG TAPE STATUS REGISTER BIT DEFINITIONS (SENSE AND SET CHARACTERISTICs;Lt2uM.PEOV=100000 ;TAPE PAST LOGICAL END OF VOLUME/vM.AEOV=40000 ;TAPE AT LOGICAL END OF VOLUME0wM.BOT=20000 ;TAPE AT BOT"xM.7CH=10000 ;UNIT IS 7 CHANNEL2yM.1600=4000 ;TAPE DENSITY CONTROL - '0'=800BPI#zM.HWL=2000 ;HARDWARE WRITE LOCK !{M.RWD=1000 ;UNIT IS REWINDING0'|M.SER=400 ;SELECT ERROR HAS OCCURED 6}M.IXG=200 ;INHIBIT WRITE WITH EXTENDED INTERRECORD"~M.SWL=100 ;SOFTWARE WRITE LOCK0M.EOF=40 ;LAST COMMAND ENCOUNTERED TAPE MARK*€M.EOT=20 ;LAST COMMAND ENCOUNTERED EOT�M.EVN=10 ;EVEN PARITYL-‚M.CDM=4 ;CORE DUMP MODE (7 CHANNEL ONLY)A&ƒM.200=2 ;200 BPI (7 CHANNEL ONLY)&„M.556=1 ;556 BPI (7 CHANNEL ONLY)…2†USRBTS=317 ;STATUS BITS CONTROLLED BY THE USERF‡NEWBTS=M.PEOV!M.BOT!M.EOF!M.EOT ;STATUS BITS TO BE SET BEFORE $IODONˆ‰;= Š; COMMANDS‹; Œ �RWU=101 ;REWIND AND OFFLINEŽRED=103 ;READ�WRT=105 ;WRITE0�WEF=107 ;WRITE END-OF-FILE=‘SPF=111 ;SPACE FORWARDD’SPR=113 ;SPACE REVERSET%“WTE=115 ;WRITE WITH EXTENDED GAP;”RWD=117 ;REWIND•/–U.SPC = U.VCB+2 ;SPACING COUNT, RDBLK TEMP.;—˜;7™; LOCAL MACROSš;=›;;=œ; THE FOLLOWIN00ŠªzŽzt´cÚµcÛ¶c�·c›’G MACRO DEFINES ENTRIES IN THE FUNCTION TABLEO�;B0ž.MACRO DFENT COM,TIMOUT,PWF,OPCODE,TYPE,INTADD Ÿ .WORD COM  .BYTE PWF,TIMOUT¡ .BYTE TYPE,OPCODE¢ .WORD INTADD0 £.ENDM DFENTD¤¥;¦; LOCAL DATA§;@¨; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER)©;C=ª; DIAGNOSTIC FUNCTIONS USE BITS 14-15 OF RTTBL AS FLAGS FORI$«; INTERRUPT AND FUNCTION HANDLING.¬)­RTTBL: .BLKW T$$M11 ;ERROR RETRY COUNT *®SPTBL: .BLKW T$$M11 ;FOR SPACE CHECKING:¯INTADD: .BLKW T$$M11 ;CURRENT INTERRUPT SERVICE ADDRESS°±²;!³; LEGAL FUNCTION DISPATCH TABLEE´;,µ:¶LGFCN: DFENT IO.RLB,8.,0,RED,0,RDBLK ;READ LOGICAL BLOCK5· DFENT IO.WLB,6.,0,WRT,0,WRBLK ;WRITE LOGICAL BLOCK 1¸ DFENT IO.EOF,2.,0,WEF,0,WREOF ;WRITE TAPE MARKX(¹ DFENT IO.RWD,2.,1,RWD,0,REWND ;REWIND6º DFENT IO.RWU,2.,1,RWU,0,REWND ;REWIND THEN OFF-LINE-» DFENT IO.SPB,8.,0,SPF,1,SPCBK ;SPACE BLOCK:,¼ DFENT IO.SPF,8.,0,SPF,2,SPCFL ;SPACE FILE1½ DFENT IO.STC,0,-1,0,-1,-1 ;SET CHARACTERISTICS$3¾ DFENT IO.SEC,0,-1,1,-1,-1 ;SENSE CHARACTERISTICS;¿ DFENT IO.SMO,0,1,-1,-1,-1 ;MOUNT AND SET CHARACTERISTICSTÀ#ÁENDFCN=. ;END OF FUNCTION TABLEOÂÃ;EÄ; DRIVER DISPATCH TABLE;Å; Æ*Ç DDT$ MT,T$$M11 ;GENERATE DISPATCH TABLEÈÉ;+4Ê; **-MTINI-TM11 MAGNETIC TAPE CONTROLLER INITIATORË;TJÌ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUEIÍ; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THEIJÎ; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN AJÏ; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IJÐ; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER@Ñ; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.Ò;+ Ó; INPUTS:IÔ; <Õ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.Ö;E ×; OUTPUTS:Ø;ODÙ; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WADÚ; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPÛ; ATION IS INITIATED.BÜ;-Ý Þ .ENABL LSBD9ßMTINI: GTPKT$ MT,T$$M11 ;GET NEXT I/O PACKET TO PROCESSLàá; 3â; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:Tã;X)ä; R1=ADDRESS OF THE I/O REQUEST PACKET.N/å; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.Sæ; R3=CONTROLLER INDEX.+ç; R4=ADDRESS OF THE STATUS CONTROL BLOCK.<è; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.é;SFê; TM11 MAGNETIC TAPE FUNCTION INDEPENDENT I/O REQUEST PACKET FORMAT:ë;E$ì; WD. 00 -- I/O QUEUE THREAD WORD.2í; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.7î; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK.HBï; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.Dð; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTOR TASK HEADEDñ; WD. 05 -- I/O FUNCTION CODE (IO.RLB/IO.RWD/IO.SPB/IO.SPF/IO.EOF)2ò; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.2ó; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.Dô; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140005õ; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.Vö;L÷;ø MOV #$MTCLK,S.MTCK+C.SUB(R4) ;SET ADDR OF CLOCK ROUTINEK%ù CLR S.FRK+2(R4) ;INIT FORK PC WORD /ú MOV #LGFCN,R2 ;POINT TO LEGAL FUNCTION TABLET*û CLRB RTTBL+1(R3) ;CLEAR DIAGNOSTIC FLAG&ü MOV I.FCN(R1),R0 ;GET FUNCTION CODE-ý BITB #IQ.UMD,R0 ;DIAGNOSTIC FUNCTION CALL?6þ BEQ 20$ ;IF EQ NOI9ÿ MOV #100000,RTTBL(R3) ;STOP RETRIES AND SET DIAG. FLAGU7 CMP #IO.LPC!IQ.UMD,R0 ;READ LPC CHARACTER FUNCTION?  BNE 15$ ;IF NE NO, BIS #RD.LPC,RTTBL(R3) ;SET LPC READ FLAG2 MOV #IO.RLB!IQ.UMD,R0 ;CONVERT TO READ LOGICAL' MOV R0,I.FCN(R1) ;SAVE FOR LATER USE2/15$: BIC #IQ.UMD,R0 ;CLEAR FOR FUNCTION CHECK 520$: BICB #IQ.X,R0 ;CLEAR IQ.X WILL BE TESTED LATERA  CMP R0,(R2)+ ;FUNCTION MATCH? BEQ 35$ ;IF EQ YES(  ADD #6,R2 ;POINT TO NEXT TABLE ENTRY#  CMP R2,#ENDFCN ;AT END OF TABLE?0  BNE 20$ ;IF NE NOI  BR 40$ ;ILLEGAL FUNCTION#  JMP 230$ ;FINISH IN COMMON CODEE;N; FUNCTION CODE MATCH 00вz—ztöt÷tø tþfDATAFOUNDB;D035$: BITB #US.PWF,U.STS(R5) ;POWER FAIL OCCUR? BEQ 45$ ;IF EQ NOD TSTB (R2) ;LEGAL FUNCTION? BMI 45$ ;IF MI YES' BNE 43$ ;IF NE THIS IS A BETTER ONEC40$: MOV #IE.IFC&377,R0 ;NO  JMP 230$ ;INFORM THE USERC443$: BICB #US.PWF,U.STS(R5) ;ALLOW ALL FUNCTIONS545$: MOV (R2)+,S.CTM(R4) ;SET UP FOR PROPER TIMEOUTD% CLRB S.CTM(R4) ;CLEAR OUT PWF INFO $ CLR SPTBL(R3) ;RESET SPACING FLAG" CLR U.SPC(R5) ;NOT SPACING FILE+ TSTB (R2)+ ;DETERMINE TYPE OF OPERATION&  BPL 50$ ;IF PL NOT STATUS FUNCTION! JMP 190$ ;STATUS FUNCTIONI+"50$: BEQ 90$ ;IF EQ NON-SPACING FUNCTIONB#$;I1%; SPACING FUNCTION DEPENDENT I/O PACKET FORMAT:&;:B'; WD. 12 -- SPACING COUNT (POSITIVE=FORWARD, NEGATIVE=BACKWARD).(; WD. 13 -- NOT USED.L); WD. 14 -- NOT USED.M*; WD. 15 -- NOT USED.P+; WD. 16 -- NOT USED.C<,; WD. 17 -- RELOCATON BIAS OF DIAGNOSTIC REG. BLK. ADDRESSA-; WD. 20 -- DIAG. REG. BUFFER ADDRESS (REAL OR DISPL. + 140000)E.; /70 BISB #S3.SIP,S.ST3(R4) ;SET POSITIONING IN PROGRESS?1 MOV U.BUF(R5),I.PRM+4(R1) ;MOVE SPACING COUNT TO COMMON PLACF/2 CLR U.BUF(R5) ;RESET TO TAKE ON OPCODE BELOWT?3 MOV I.PRM+4(R1),U.CNT(R5) ;MOVE SPACING COUNT TO COMMON PLAC=(4 BNE 60$ ;IF NE SOME SPACING REQUIRED15 CLR I.PRM+4(R1) ;CLEAR COUNT FOR STATUS RETURN-!6 JMP 220$ ;NO SPACING REQUIREDD#760$: BMI 65$ ;IF MI SPACE REVERSI!8 BIT #M.AEOV,U.CW2(R5) ;AT EOV? 9 BEQ 70$ ;IF EQ NO - PROCEEDR#: MOV #IE.EOV&377,R0 ;STILL AT EOV1; CLR I.PRM+4(R1) ;CLEAR COUNT FOR STATUS RETURNS< JMP 230$ ;TELL THE USERR=65$: ;REFERENCE LABEL+> NEG U.CNT(R5) ;CONVERT TO POSITIVE COUNTN!? NEG I.PRM+4(R1) ;THIS ONE, TOOU:@ BIS #2,U.BUF(R5) ;CHANGE SPACE FORWARD TO SPACE REVERSE1A70$: CMPB -1(R2),#1 ;SPACE FILE OR SPACE BLOCK?AB BEQ 80$ ;IF EQ SPACE BLOCK8C MOV U.CNT(R5),U.SPC(R5) ;SAVE COUNT OF FILES TO SPACE-D NEG U.SPC(R5) ;SET UP FOR FINAL ACCOUNTING*E MOV #-1,U.CNT(R5) ;SET UP FOR BIG SPACE2F80$: MOV U.CNT(R5),SPTBL(R3) ;SAVE SPACING COUNT1G NEG SPTBL(R3) ;MAKE IT MATCH REGISTER CONTENTSU'H BR 110$ ;SKIP SOME CHECKS AND BIC'SUIJ;;<K; READ/WRITE LOGICAL FUNCTION DEPENDENT I/O PACKET FORMAT:L;B-M; WD. 12 -- RELOCATION BIAS OF DATA BUFFER.R"N; WD. 13 -- DATA BUFFER ADDRESS./O; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.BP; WD. 15 -- NOT USED.SQ; WD. 16 -- NOT USED.ER; WD. 17 -- NOT USED.R<S; WD. 20 -- RELOCATON BIAS OF DIAGNOSTIC REG. BLK. ADDRESSAT; WD. 21 -- DIAG. REG. BUFFER ADDRESS (REAL OR DISPL. + 140000)U;GIV; NO FUNCTION DEPENDENT PARAMETERS ARE REQUIRED FOR REWIND OR WRITE EOF W;IXY90$: ;REF LABELZ[\ .IF DF M$$EXT].^ CALL $STMAP ;SET UP UNIBUS MAPPING ADDRESS_` .ENDCab9c CMPB -2(R2),#2 ;WRITE EOF, REWIND OR REWIND & OFFLINE?B.d BEQ 100$ ;IF EQ YES - SEE IF WRITELOCK SETe CMPB (R2),#WRT ;WRITE? f BNE 110$ ;IF NE NO0g MOV #IE.SPC&377,R0 ;ASSUME PARAMETER PROBLEMS#h CMP I.PRM+4(R1),#14. ;TOO SHORT?Ii BLO 163$ ;IF LO YESR!j BR 105$ ;SKIP EXMEM BIT CLEAR ,k100$: CLR U.BUF(R5) ;NOTHING THERE FOR WEF7l BISB #S3.SIP,S.ST3(R4) ;SET POSITIONING IN PROGRESSm CMPB (R2),#WEF ;WRITE EOF?1n BNE 110$ ;IF NE NO, SKIP CHECK FOR WRITE LOCK8o105$: MOV #IE.WLK&377,R0 ;ASSUME (SOFTWARE) WRITE LOCK p BIT #M.SWL,U.CW2(R5) ;LOCKED?q BNE 163$ ;IF NE YESKEr110$: BISB (R2)+,U.BUF(R5) ;PICK UP FUNCTION CODE FROM COMMAND TABLC5s MOV (R2),INTADD(R3) ;SET INITIAL INTERRUPT ADDRESS#&t TST RTTBL(R3) ;DIAGNOSTIC FUNCTION?%u BMI 120$ ;IF MI YES, STOP RETRIES,v MOV #RETRY,RTTBL(R3) ;SET UP RETRY COUNTS/w120$: CALL SELECT ;SELECT THE REQUIRED DRIVEO+x BCS SELERR ;IF CS SELECT ERROR OCCURREDE4y MOV U.CW2(R5),R1 ;PICK UP DRIVE'S CHARACTERISTICS'z BIT #M.EVN,R1 ;EVEN PARITY REQUIRED?T{ BEQ 140$ ;IF EQ NO4| BIS #CS.EVN,U.BUF(R5) ;SET BIT IN STATUS REGISTER>}140$: BIS #CS.DN5!CS.DN8,U.BUF(R5) ;ASSUME 9-CHANNEL, 800BPI"~ BIT #M.7CH,R1 ;7-CHANNEL DRIVE? BEQ 170$ ;IF EQ NO!€ BIT #M.CDM,R1 ;CORE DUMP 00ŠºzŽzt´cÚµcÛ¶c�·c›’MODE?� BNE 170$ ;IF NE YESO‚ BIT #M.556,R1 ;556 BPI?ƒ BNE 150$ ;IF NE YESN/„ BIC #CS.DN5,U.BUF(R5) ;RESET BIT FOR COMMANDV… BIT #M.200,R1 ;200 BPI?† BEQ 170$ ;IF EQ NO0‡150$: BIC #CS.DN8,U.BUF(R5) ;RESET COMMAND BIT ˆ BR 170$‰Š;VE‹; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING TERMINATED.;CŒ; IF THE OPERATION WAS DIAGNOSTIC, THE QIO REQUEST IS TERMINATED.UC�; TIMEOUTS ARE USUALLY CAUSED BY POWERFAILURE BUT MAY ALSO BE THE HŽ; RESULT OF HARDWARE CONSIDERATIONS. IN PARTICULAR, A LENGTHY SPACING<�; OPERATION MAY RESULT IN A TIMEOUT WHICH WILL BE IGNORED.�;5‘3’MTOUT: MOV S.CSR(R4),R2 ;;;PICK UP ADDRESS OF CSR &“ BITB #US.ABO,U.STS(R5) ;;;ABORTING?” BEQ 152$ ;;;IF EQ NO1• BIC #M.RWD,U.CW2(R5) ;;;REWIND NOT IN PROGRESSO– BR 162$ ;;;TERMINATE—152$: ;;;REFERENCE LABEL,˜ MOVB S.CON(R4),R3 ;;;FETCH CONTROLLER NO.%™ BIT #M.RWD,U.CW2(R5) ;;;REWINDING?Uš BNE 155$ ;;;IF NE YESR)› MOV SPTBL(R3),R0 ;;;SPACE IN PROGRESS?Aœ BEQ 154$ ;;; IF EQ THEN NO%� CMP R0,2(R2) ;;;IS THE TAPE BLANK? ž BNE 153$ ;;; IF NE THEN NO&Ÿ CALL $DTOER ;;; LOG DEVICE TIMEOUT+  BR 161$ ;;; EXIT WITH IE.DNR ERROR CODEU¡153$: ;;; REF. LABEL?8¢ MOV 2(R2),SPTBL(R3) ;;;SAVE VALUE FOR NEXT COMPARISON-£ MOVB S.ITM(R4),S.CTM(R4) ;;;RESUME TIMEOUT"¤ RETURN ;;;THAT IS ALL FOR NOW+¥154$: CALL $DTOER ;;; LOG DEVICE TIMEOUTB-¦ BCS 161$ ;IF CS ABORT DIAGNOSTIC FUNCTION 1§155$: BIC #CS.IE,(R2) ;;;CLEAR INTERRUPT ENABLEG¨ MTPS #0 ;;;ALLOW INTERRUPTSE2© BIT #M.SER,U.CW2(R5) ;WAS THERE A SELECT ERROR?ª BEQ 160$ ;IF EQ NO)« BIC #M.SER,U.CW2(R5) ;RESET STATUS BIT#¬ BIT #M.RWD,U.CW2(R5) ;REWINDING?C1­ BEQ 120$ ;IF EQ NO - REISSUE ORIGINAL COMMANDL0® BIT #DS.MOL,-2(R2) ;IS THE DRIVE ON-LINE NOW?¯ BEQ SELERR ;IF EQ NO/° MOVB #RWD-CS.IE,(R2) ;START THE REWIND AGAIN± BR 172$ ;START UP TIMEOUTC(²160$: BIT #M.RWD,U.CW2(R5) ;REWINDING?³ BNE 164$ ;IF NE YES 5´161$: MOV #IE.DNR&377,R0 ;INDICATE DEVICE NOT READY 6µ162$: CALL MTDINT ;PASS DIAGNOSTIC DEVICE REGISTERS&¶ BIS #CS.CLR,(R2) ;RESET CONTROLLER%·163$: JMP 230$ ;REPORT FATAL ERROR 1¸164$: BIT #DS.MOL,-2(R2) ;EVERYTHING COPASETIC?1¹ BEQ SELERR ;IF EQ NO&º BIT #DS.BOT!DS.RWS,-2(R2) ;TAPE OK?» BNE 165$ ;IF NE OK:¼SELERR: MOV #IE.DNR&377,R0 ;NOT READY - IF TAPE OFF LINE&½ TST RTTBL(R3) ;DIAGNOSTIC FUNCTION?0¾ BMI 230$ ;IF MI YES, STOP THE SELECT MESSAGE*¿ BITB #IQ.X,I.FCN(R1) ;SUPPRESS RETRIES?(À BNE 230$ ;IF NE YES SKIP SELECT MSG..Á TST U.ACP(R5) ; ACP WANTS RETURN IMMEDIATE?. BNE 230$ ; IF NE YES EXIT DEVICE NOT READY-à BIS #M.SER,U.CW2(R5) ;SET SELECT ERROR BIT "Ä DECB S.STS(R4) ;TIME FOR A MSG?Å BNE 172$ ;IF NE NO,Æ MOV #T.NDSE,R0 ;SET UP TO DELIVER MESSAGE&Ç MOVB #15.,S.STS(R4) ;SET UP TIMEOUT!È CALL $DVMSG ;SEND THE MESSAGEPÉ BR 172$ ;SET THE TIMOUT;,Ê165$: BIT #DS.TUR,-2(R2) ;REWIND COMPLETE?Ë BEQ 172$ ;IF EQ NO)Ì BIT #DS.BOT,-2(R2) ;DID WE GET TO BOT??)Í BNE 175$ ;IF NE YES - REWIND COMPLETE(Î170$: BIT #M.RWD,U.CW2(R5) ;REWINDING?Ï BEQ 177$ ;IF EQ NO+Ð172$: MOVB #1,S.CTM(R4) ;SET UP A TIMEOUT. Ñ RETURN ;THAT IS ALL FOR NOW(Ò175$: BIS #M.BOT,U.CW2(R5) ;SAY AT BOTÓ177$: ;REF LABEL#ÔÕÖ .IF DF M$$EXT×&Ø CMPB #SPF,U.BUF(R5) ;SPACE FORWARD?)Ù BEQ 178$ ;IF EQ YES, UMR'S NOT NEEDED&Ú CMPB #SPR,U.BUF(R5) ;SPACE FORWARD?)Û BEQ 178$ ;IF EQ YES, UMR'S NOT NEEDED1Ü MOV R2,-(SP) ;SAVE R2'Ý CALL $MPUBM ;MAP UNIBUS TO TRANSFER1Þ MOV (SP)+,R2 ;RESTORE R2Lßà .ENDCáâ9ã178$: CMP (R2)+,(R2)+ ;POINT TO MEMORY ADDRESS REGISTERO.ä MOV U.BUF+2(R5),(R2) ;SET UP BUFFER ADDRESS2å MOV U.CNT(R5),-(R2) ;SET UP BYTE COUNT REGISTER æ NEG (R2) ;NEED 2S COMPLEMENTBç180$: MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNT9è BIC #M.AEOV!M.SER!M.RWD,U.CW2(R5) ;RESET VARIOUS FLAGSR&é BICB #US.BSP,U.STS(R5) ;RESET FLAGS1ê BIT #RD.LPC,RTTBL(R3) ;READ LPC CHAR FUNCTION?Vë BEQ 185$ ;IF EQ NO/ì BIS #RD.LPC,6(R2) ;SET LPC READ IN MTRD REG.R)í185$: CA00ŠÂz—ztöt÷tø tþfDATALL $BMSET ;SET I/O ACTIVE FLAG,-î MOV U.BUF(R5),-(R2) ;INITIATE THE FUNCTIONVï RETURN ;DONESðñ;F9ò; CANCEL I/O OPERATION IS A NOP FOR TM11 MAGNETIC TAPESTó;ô0õMTCAN: CMP I.TCB(R0),R1 ;CANCEL FOR THIS TASK?ö BNE 111$ ;BRANCH IF NOTE4÷ BISB #US.ABO,U.STS(R5) ;FLAG THE ABORT CONDITIONø111$: RETURNù;Jú; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUJû; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDIT5ü; THAT COULD EXIST IN RESTARTING THE I/O OPERATION.,ý;Mþ9þMTPWF: BCS 112$ ;IF CS, CONTROLLER POWER FAIL. ;CS0079þ BISB #US.PWF,U.STS(R5) ; ELSE, UNIT POWER FAIL ;CS007I'þ ; DISALLOW NORMAL QIO'S. ;CS007)5 CALL DRVSTS ;INDICATE TAPE DENSITY SUPPORT ;**-1E112$: RETURN ;CS007 ;**-1;N; STATUS FUNCTION PROCESSING; 190$: ;REFERENCE LABEL # MOV R2,-(SP) ;SAVE TABLE POINTERM-  CALL SELECT ;SET BOT, HWL, AND 7CH STATUSO  MOV (SP)+,R2 ;RESTORE POINTER:  MOV U.CW2(R5),I.PRM+4(R1) ;ASSUME SENSE CHARACTERISTICS+  TSTB (R2)+ ;DETERMINE FUNCTION REQUIRED0'  BEQ 210$ ;IF EQ SET CHARACTERISTICST+ BPL 220$ ;IF PL "SENSE CHARACTERISTICS"L$201$: BIT #M.BOT,U.CW2(R5);AT BOT? BNE 210$ ;IF NE, YES. (203$: MOV #IE.FHE&377,R0 ;FATAL ERROR, BR 230$ ; END REQUEST.5210$: BIT #M.1600,U.BUF(R5) ;TRYING TO SET 1600BPI? ' BNE 203$ ;IF NE, YES - NOT ALLOWED.E2 BIC #USRBTS,U.CW2(R5) ;PREPARE TO SET NEW BITS.= BIC #^C,U.BUF(R5) ;LEAVE ONLY USER CONTROLLED BITS;+ BIS U.BUF(R5),U.CW2(R5) ;NEW STATUS WORD;; ; NO SPACING REQUIREDQ; <220$: MOV #IS.SUC&377,R0 ;SET SUCCESSFUL COMPLETION STATUS-230$: MOV S.CSR(R4),R2 ;PICK UP CSR ADDRESS= BIC #CS.IE!CS.EXM,(R2) ;CLEAR INT. ENABLE AND EX. MEM BITSR-  CLR 2(R2) ;ASSURE PROPER VALUE FOR RETURNM! JMP 540$ ;CLEAN UP AND EXIT0"#$;+6%; **-$MTINT-TM11 MAGNETIC TAPE CONTROLLER INTERRUPTS&;-'7( INTSE$ MT,PR5,T$$M11 ;;;GENERATE INTERRUPT SAVE CODE .) MOV U.SCB(R5),R4 ;;;RETRIEVE ADDRESS OF SCB-* TST S.FRK+2(R4) ;;;HAVE WE FORKED ALREADY?I0+ BNE 300$ ;;;IF NE YES, RETURN FROM INTERRUPT), CALL $FORK ;;;CREATE A SYSTEM PROCESS )-240$: MOV U.SCB(R5),R4 ;GET SCB ADDRESSB5. MOV S.CSR(R4),R2 ;PICK UP COMMAND REGISTER ADDRESST</ BIT #DS.TUR!DS.RWS!DS.ILG!DS.EOT!DS.BOT,-(R2) ;UNIT DONE?0 BNE 250$ ;IF NE YES=1 CMPB U.BUF(R5),#RWU ;WAS IT A REWIND AND OFFLINE FUNCTION?P.2 BEQ 220$ ;IF EQ YES, COMPLETE WITH SUCCESS,3 MOV R4,R0 ;GET ADDR OF CLOCK QUEUE BLOCK4 ADD #S.MTCK,R0 ;S5 CLR R1 ;SET UP HIGH TICKSW 6 MOV #1,R2 ;TIMEOUT UNTIL TUR&7 MOV #C.SYST,R4 ;TYPE OF CLOCK ENTRY8 CALLR $CLINS ;TIMEOUTE9#:$MTCLK:: ;REF LABEL FOR TIMEOUT ;(< MOV C.TCB(R4),R5 ;RESTORE UCB ADDRESS= BR 240$ ;SEE IF UNIT READY1>250$: MOVB S.CON(R4),R3 ;PICK UP CONTROLLER NO.?1? BIT #DS.MOL,(R2)+ ;IS THE DRIVE STILL ON-LINE?;@ BNE 260$ ;IF NE YESN*A JMP 161$ ;ISSUE "DEVICE-NOT-READY" MSGBB260$: BIC #CS.IE!CS.EXM,(R2) ;CLEAR INT. ENABLE AND EX.MEM BITS1C MOVB S.ITM(R4),S.CTM(R4) ;RESET TIMEOUT COUNT.D CLR S.FRK+2(R4) ;ALLOW INTERRUPT PROCESSING7E MOV -2(R2),R1 ;GET CONTENTS OF DRIVE STATUS REGISTER:F BITB #US.BSP,U.STS(R5) ;INTERNAL BACKSPACE IN PROGRESS?.G BNE 280$ ;IF NE YES - CALL SERVICE ROUTINE>H270$: MOV #IS.SUC&377,R0 ;ASSUME SUCCESS FOR VARIOUS REASONSI TST (R2) ;ANY ERRORS?EJ BMI 280$ ;IF MI YES2K TST U.SPC(R5) ;SPACING FILE?S0L BNE 280$ ;IF NE, YES. TREAT AS ERROR ANYWAY.8M CMPB (R2),#RWD+CS.RDY-CS.GO-CS.IE ;WAS THAT A REWIND?N BNE 275$ ;IF NE NO'O BIS #M.RWD,U.CW2(R5) ;SET STATUS BIT P275$: JMP 500$ ;SUCCESS!!+Q280$: TST RTTBL(R3) ;DIAGNOSTIC FUNCTION?ER BMI 290$ ;IF MI YES(-S BIT #DS.ILG!DS.CRE!DS.PAE!DS.BGL!DS.BTE,R10'T ; ANY ERRORS IN STATUS REG (MTS)?7U BEQ 290$ ; IF EQ THEN NO"V CALL $DVERR ; LOG DEVICE ERROR4W290$: CALL @INTADD(R3) ;CALL THE INTERRUPT ROUTINE.X BIS #S2.ACT,S.ST2(R4) ;SET I/O ACTIVE FLAG/Y MOV (SP)+,INTADD(R3) ;SAVE INTERRUPT 00ŠÊzŽzt´cÚµcÛ¶c�·c›’ADDRESSS3Z300$: RETURN ;WAIT FOR END OF NEXT COMMAND STEPF[\;]; WRITE LOGICAL FUNCTION^; _*`WRBLK: BIT #DS.TM,R1 ;DID WRITE SEE EOF?a BNE 320$ ;IF NE YESCbc;d; WRITE TAPE MARK FUNCTIONe;If)gWREOF: BIT #34404,R1 ;ANY OTHER ERRORS? *h BEQ 325$ ;IF EQ NO - REALLY SUCCESSFUL(i MOV #IE.WLK&377,R0 ;ASSUME WRITE-LOCKj BIT #DS.HWL,R1 ;WRITE LOCK?k BNE 325$ ;IF NE YESU$l BIT #34400,R1 ;RECOVERABLE ERROR?m BNE 320$ ;IF NE YESPno;(p; REWIND FUNCTIONSq;Sr(sREWND: MOV #IE.FHE&377,R0 ;FATAL ERRORt BR 325$ ; .. CONT u9v320$: MOV #IE.BBE&377,R0 ;ASSUME BAD TAPE OR EQUIVALENTR%w TSTB U.CW2(R5) ;SHOULD WE REWRITE?x BMI 325$ ;IF MI, NO.$y BIT #2,@R2 ;IS THIS A WRITE EOF?z BNE 420$ ;IF NE YESS>{ BIS #WTE-WRT,U.BUF(R5) ;DO WRITE WITH EXTENDED GAP FROM NOW| BR 420$ ;DO THE OPERATIONT};H*~325$: BR 490$ ;GO FINISH UP INT SERVICE;B€; SPACE FILE FUNCTION �;?‚.ƒSPCFL: BIT #DS.TM,R1 ;TAPE MARK ENCOUNTERED?„ BNE 350$ ;IF NE YES:1… MOV U.SPC(R5),2(R2) ;SOMETHING ELSE STOPPED USC†‡;ˆ; SPACE BLOCK FUNCTION‰;UŠ ‹SPCBK: BIT #DS.BOT,R1 ;AT BOT?5Œ BNE 490$ ;IF NE YES, NOT AN ERROR, BUT NEED STACK� BIT #DS.TM,R1 ;EOF?Ž BEQ 340$ ;IF EQ NO(� CALL CHKEOV ;SEE IF AT END OF VOLUME� BCC 410$ ;IF CC NOT FOUNDM!‘ BR 360$ ;POSITION TAPE AT EOVT5’340$: BIT #DS.BTE!DS.EOT,R1 ;BAD TAPE ERROR OR EOT?B*“ BNE RDBLK ;IF NE YES - NOT RECOVERABLE” BR REWND ;FATALE•;–350$: CALL CHKEOV ;DID TAPE REACH LOGICAL END OF VOLUME?R%— BCC 370$ ;IF CC NO, TRY NEXT FILE(˜360$: CALL BSPACE ;BACKSPACE THE TAPE$™ CALL @(SP)+ ;WAIT FOR COMPLETION=š MOV #IE.EOV&377,R0 ;INFORM USER THAT EOV HAS BEEN DETECTED1(› BIS #M.AEOV,U.CW2(R5) ;SET STATUS BIT!œ BR 380$ ;FIX COUNT AND RETURNB1�370$: INC U.SPC(R5) ;ANOTHER TAPE MARK DETECTEDAž BNE 390$ ;IF NE NOT DONE/Ÿ380$: MOV U.SPC(R5),2(R2) ;SET UP FINAL COUNTK/  MOV S.PKT(R4),R3 ;GET THE I/O PACKET ADDRESSA-¡ MOV I.FCN(R3),-(SP) ;GET THE FUNCTION CODEG+¢ BIC #IQ.UMD!IQ.X,(SP) ;CLEAR EXTRA BITS #£ CMP #IO.SPB,(SP)+ ;SPACE BLOCKS?;&¤ BNE 385$ ;NO -- LEAVE STATUS ALONE+¥ CLR I.PRM+4(R3) ;CLEAR FOR STATUS RETURNR¦ CLR 2(R2) ;... §385$: BR 490$ ;RETURN TO USER*¨390$: BIS #M.EOF,U.CW2(R5) ;I SAW AN EOF-© MOV #1,2(R2) ;SET RECORD COUNT FOR SPACINGT)ª MOV 2(R2),SPTBL(R3) ;SAVE RECORD COUNT :« ADD #-CS.RDY+CS.GO+CS.IE,(R2) ;REISSUE SPACING COMMAND$¬ CALL @(SP)+ ;WAIT FOR COMPLETION­ BR SPCFL ;SEE WHAT HAPPENEDE®¯;C°; READ LOGICAL FUNCTIONI±;S²,³RDBLK: MOV #IE.BBE&377,R0 ;ASSUME BAD TAPE ´ BIT #DS.BTE,R1 ;BAD TAPE/OPI?µ BEQ 405$ ;IF EQ, NO.!¶ CMP 2(R2),U.CNT(R5) ;BAD TAPE?R· BNE 420$ ;IF NE, YES.$¸ BR REWND ; ELSE - OPI.7¹405$: MOV #IE.DAO&377,R0 ;ASSUME RECORD LENGHT ERROR.2$º BIT #DS.RLE,R1 ;RECORD LTH ERROR?» BNE 490$ ;IF NE YESR#¼410$: MOV #IE.EOF&377,R0 ;TRY EOFS½ BIT #DS.TM,R1 ;EOF DETECTED?D¾ BNE 490$ ;IF NE YESO/¿ MOV #IS.SUC&377,R0 ;ASSUME SUCCESS FOR EOT'SÀ BIT #DS.EOT,R1 ;EOT?FÁ BNE 490$ ;IF NE NO( MOV #IE.VER&377,R0 ;ASSUME DATA ERRORÃ420$: MOV R1,-(SP) ;SAVE R1?0Ä MOV S.PKT(R4),R1 ;RETREIVE I/O PACKRT ADDRESS,Å BITB #IQ.X,I.FCN(R1) ;RETRIES SUPPRESSED?Æ BEQ 430$ ;IF EQ NO CONTINUEOÇ MOV (SP)+,R1 ;RESTORE R1RÈ BR 490$ ;EXIT É430$: MOV (SP)+,R1 ;RESTORE R1(Ê DECB RTTBL(R3) ;DECREMENT RETRY COUNTË BLE 490$ ; IF LE NO2Ì MOV INTADD(R3),U.SPC(R5) ;SAVE ORIGINAL ADDRESS#Í CALL BSPACE ;BACKSPACE THE TAPEU#Î CALL @(SP)+ ;WAIT FOR BACKSPACEE0Ï MOV U.SPC(R5),INTADD(R3) ;RESTORE INT ADDRESS4Ð CLR U.SPC(R5) ;RESET TO INDICATE NOT SPACING FILE!Ñ TST (SP)+ ;CLEAN UP THE STACKAÒ JMP 177$ ;RETRY ÓÔ;C/Õ; END OF INTERRUPT SERVICE ROUTINE PROCESSINGOÖ;I×&Ø490$: TST (SP)+ ;CLEAN UP THE STACK+Ù500$: MOV R5,R3 ;MAKE A COPY OF UCB BASE3Ú ADD #U.CW2,R3 ;COMPUTE OFFSET TO MAG TAPE STATUS &Û MOV (R3),-(SP) ;SAVE CURRENT STATUS7Ü BIC #NEWBTS,(R3) ;CLEAR STATUS BITS TO BE DETERMINEDTÝ BIT #DS00ŠÒz—ztöt÷tø tþfDATA.BOT,R1 ;AT BOT?Þ BEQ 510$ ;IF EQ NO"ß BIS #M.BOT,(R3) ;SET STATUS BIT!à510$: BIT #DS.TM,R1 ;TAPE MARK?D!á BEQ 520$ ;IF EQ NOT TAPE MARK+;â CMPB (R2),#SPR+CS.RDY-CS.IE-CS.GO ;WAS THAT A BACKSPACE?N4ã BEQ 520$ ;IF EQ YES - DON'T SET INTERNAL EOF BIT"ä BIS #M.EOF,(R3) ;SET STATUS BITå520$: MOV R1,-(SP) ;SAVE R1C1æ CALL MTDINT ;PASS DIAGNOSTIC DEVICE REGISTERSTç MOV (SP)+,R1 ;RESTORE R13+è BCS 530$ ;IF CS FUNCTION WAS DIAGNOSTIC(-é BIT #DS.ILG!DS.CRE!DS.PAE!DS.BGL!DS.BTE,R1T'ê ; ANY ERRORS IN STATUS REG (MTS)? ë BEQ 530$ ; IF EQ THEN NO"ì CALL $DVERR ; LOG DEVICE ERROR<í530$: CMPB (R2),#RED+CS.RDY-CS.IE-CS.GO ;WAS THAT A READ?#î BEQ 539$ ;IF EQ YES, IGNORE EOTSï BIT #DS.EOT,R1 ;EOT?Eð BEQ 539$ ;IF EQ NO(ñ TSTB R0 ;ALREADY RETURNING AN ERROR?ò BMI 538$ ;IF MI YES).ó535$: MOV #IE.EOT&377,R0 ;SET FOR EOT STATUS6ô538$: BIS #M.EOT,(R3) ;REMEMBER EOT FOR NEXT COMMAND/õ MOV 2(R2),-(SP) ;PRESERVE THE COUNT REGISTERG2ö BIS #CS.CLR,@R2 ;STOP THE DRIVE IF RUNNING AWAY.÷ MOV (SP)+,2(R2) ;RESTORE THE COUNT REGISTERø539$: TST (SP)+ ;CLEAN STACKE8ù540$: MOV S.PKT(R4),R1 ;RETRIEVE ADDRESS OF I/O PACKET8ú BICB #S3.SIP,S.ST3(R4) ;RESET POSITIONING INPROGRESS,û BIC #S2.ACT,S.ST2(R4) ; CLEAR I/O ACTIVE./ü MOV I.PRM+4(R1),R1 ;GET ORIGINAL COUNT VALUE $ý ADD 2(R2),R1 ;FIX COUNT REMAINING0þ MOVB S.CON(R4),R3 ; RETRIEVE CONTROLLER INDEX,ÿ MOVB RTTBL(R3),R2 ; GET FINAL RETRY COUNT2 BIS #RETRY*256.,R2 ; MERGE STARTING RETRY COUNT% CALL $IODON ;FINISH I/O OPERATIONV JMP MTINI ;GO AGAIN  .DSABL LSB;SB; THIS SUBROUTINE CHECKS FOR THE LOGICAL END-OF-VOLUME CONDITION; ; RETURNS WITH CC IF NOT EOV.  ; RETURNS WITH CS IF EOV.S ;B + CHKEOV: MOV 2(R2),-(SP) ;SAVE FRAME COUNTI1  ADD U.CNT(R5),(SP) ;GET NUMBER ACTUALLY SPACEDR4 CMP (SP)+,#1 ;EXACTLY ONE? (COUNT STARTED WITH 1) CLC ;ASSUME NOT EOV BNE 30$ ;IF NE NO, NOT EOV .IF DF A$$NSI. BITB #US.LAB,U.STS(R5) ;MOUNTED ANSII TAPE?% BNE 30$ ;IF NE YES - EXIT WITH CC  .ENDC BIT #2,(R2) ;FORWARD SPACE?N% BNE 30$ ;IF NE NO - CANNOT BE EOVC& BIT #M.EOF!M.BOT,U.CW2(R5) ;AT EOV?$ BEQ 30$ ;IF EQ NO - EXIT WITH CC SEC ;EOV DETECTED 30$: RETURN ; !";N<#; THIS SUBROUTINE ISSUES A COMMAND TO BACKSPACE ONE RECORD$;+%E&BSPACE: BISB #US.BSP,U.STS(R5) ;SET INTERNAL BACKSPACE IN PROGRESS3&' MOV #-1,2(R2) ;BACKSPACE ONE RECORD+( MOVB #SPR,(R2) ;ISSUE BACKSPACE FUNCTIONT ) RETURNP*+;E1,; THIS ROUTINE ATTEMPTS TO SELECT A TAPE DRIVE.7-; THE CURRENT STATUS OF THE DRIVE WITH REGARD TO 7CH,N%.; BOT, AND HWL IS SET AT THIS TIME.,/;(0; ON RETURN: CC==>GOOD SELECTN1; CS==>BAD SELECT2;;3,4SELECT: CALL DRVSTS ;GET TAPE UNIT STATUS-5 MOVB 1(R2),U.BUF+1(R5) ;SET UP FOR COMMAND +6 MOV -2(R2),-(SP) ;SAVE TAPE UNIT STATUS.S?7 BIC #,U.CW2(R5) ;CLEAR EXCESSK8 SEC ;ASSUME SELECT ERROR(&9 BIT #DS.MOL,(SP) ;DID DRIVE SELECT?$: BEQ 10$ ;IF EQ NO - SELECT ERROR8; BIT #DS.TUR!DS.RWS!DS.SDN,(SP) ;MAKE SURE DRIVE IS OK< BNE 7$ ;IF NE OK"= BIT #RD.GAP,10(R2) ;LAST CHANCE)> BEQ 10$ ;IF EQ VACUUM IS GONE - FATALL)?7$: BIT #DS.TUR!DS.SDN,(SP) ;TRUST BOT?E@ BNE 8$ ;IF NE, YES.E)A BIC #DS.BOT,(SP) ;MAY BE INTERMITTENT.T1B8$: SWAB (SP) ;UNIT SELECTABLE. CARRY CLEARED.I:C BIC #^C,(SP) ;CLEAR EXTRA BITSD BIS (SP),U.CW2(R5) ; 'E BICB #US.ABO,U.STS(R5) ;NOT ABORTINGP9F10$: INC (SP)+ ;CLEAN UP STACK WITHOUT AFFECTING CARRYG BCC 20$ ;IF CC GOOD SELECT-H BIS #M.SER,U.CW2(R5) ;SET SELECT ERROR BITI20$: RETURN ;2JKL;+HM; SUBROUTINE SELECTS A TAPE UNIT AND TRIES TO OBTAIN TAPE UNIT STATUS.N;UOO; IF TAPE UNIT READY, DETERMINE 7/9 TRACK STATUS AND UPDATE U.CW3 ACCORDINGLYP;-Q%RDRVSTS: MOV S.CSR(R4),R2 ;R2 - CSR.+S MOVB U.UNIT(R5),1(R2) ;SELECT TAPE UNIT.A-T MOV #50.,-(SP) ;INTERVAL TILL DEV REG RDY. !U5$: DEC (SP) ;INTERVAL OVER ?V BNE 5$ ;IF NE,00ŠÚz‹Þzt´cÚµcÛ¶c�·c›’ NO.'W BIT #DS.TUR,-2(R2) ;TAPE UNIT READY?2/X BEQ 10$ ;IF EQ, NO. BITS 0-5 NOT AVAILABLE.S*Y MOVB #UD.800,U.CW3(R5) ;INDICATE (ONLY)+Z MOVB #UD.UNS,U.CW3+1(R5) ;9TRACK/800BPI.T)[ BIT #DS.7CH,-2(R2) ;7TRACK TAPE UNIT ?U\ BEQ 10$ ;IF EQ, NO. ,] MOVB #UD.200,U.CW3(R5) ;INDICATE 7 TRACK,3^ MOVB #UD.800,U.CW3+1(R5) ;200 TO 800BPI SUPPORT.-)_10$: TST (SP)+ ;RETURN STACK AS FOUND.P ` RETURNabc;+;d; **-MTDINT-TM11 DIAGNOSTIC INTERRUPT AND TIMEOUT HANDLEREe;Af; IF ENTRY WAS FROM A DIAGNOSTIC CONTROL FUNCTION THEN MOVE I/O9g; PACKET WORDS 17-20 TO WORDS 20-21 FOR $CRPAS ROUTINE..Dh; FOR ANY DIAGNOSTIC FUNCTION PASS THE UNIBUS DEVICE REGISTERS VIAi; THE $CRPAS ROUTINE.(j;7 k; INPUTSl; R2= CSR ADDRESSIm; R4= SCB ADDRESSUn;, o; OUTPUTSDp; R1= IO PACKET ADDRESS.q;-r2sMTDINT: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS t CLC ;4u BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION CALL?v BEQ 4$ ;IF EQ NO 'w MOV R1,-(SP) ;SAVE IO PACKET ADDRESSW5x CMPB #IO.EOF/256.,I.FCN+1(R1) ;WRITE EOF FUNCTION?y BEQ 1$ ;IF EQ YES@z CMPB #IO.RWD/256.,I.FCN+1(R1) ;CNTRL FUNCT.OTHER THAN IO.EOF?{ BEQ 1$ ;IF EQ YES4| CALL $CRPAS ;PASS DEVICE REGISTERS TO DIAGNOSTIC*} MOV (SP)+,R1 ;RESTORE IO PACKET ADDRESS~ BR 3$ ;RETURNT61$: MOV I.PRM+14(R1),I.PRM+16(R1) ;MOVE WD20 TO WD213€ MOV I.PRM+12(R1),I.PRM+14(R1) ;MOVE WD17 TO WD20B7�2$: CALL $CRPAS ;PASS DEVICE REGISTERS TO DIAGNOSTIC4*‚ MOV (SP)+,R1 ;RESTORE IO PACKET ADDRESS8ƒ MOV I.PRM+14(R1),I.PRM+12(R1) ;MOVE WD20 BACK TO WD178„ MOV I.PRM+16(R1),I.PRM+14(R1) ;MOVE WD21 BACK TO WD209…3$: BIC #RD.LPC,10(R2) ;CLEAR LPC MODE BIT IN MTRD REG. -† SEC ;SET DIAGNOSTIC FUNCTION CALL RETURNT ‡4$: RETURNˆ‰ .ENDR1 ;RESTORE IO PACKET ADDRESS~ BR 3$ ;RETURNT61$: MOV I.PRM+14(R1),I.PRM+16(R1) ;MOVE WD20 TO WD213€ MOV I.PRM+12(R1),I.PRM+14(R1) ;MOVE WD17 TO WD20B7�2$: CALL $CRPAS ;PASS DEVICE REGISTERS TO DIAGNOSTIC4*‚ MOV (SP)+,R1 ;RESTORE IO PACKET ADDRESS8ƒ MOV I.PRM .TITLE EXESBT .IDENT /14.01/P;15; COPYRIGHT (c) 1985 BY DIGITAL EQUIPMENT CORPORATION1; ALL RIGHTS RESERVED.;2<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;N; D. N. CUTLER 4-AUG-73V;P; PREVIOUSLY MODIFIED BY:D;S; J. R. KAUFFMAN; J. M. LAWLER; B. S. MCCARTHY;M ; MODIFIED BY1;M; B. S. MCCARTHY 2-MAR-85 14.00E;1,; BM336 -- ALLOW A PR:0 TASK TO PERFORM I/O&; REQUESTS OF ANY LENGTH, AS LONG AS; FIRST ADDRESS CHECKS;1 ; B. S. MCCARTHY 12-JUN-85 14.01;A6; BM336 -- FIX PROBLEM IN ABOVE FOR BAD START ADDRESS;S; I/O RELATED ROUTINES;R5; ROUTINES CALLED PRIMARILY FROM WITHIN THE EXECUTIVEN;W; MACRO LIBRARY CALLSI;S8 .MCALL F11DF$,HDRDF$,HWDDF$,PCBDF$,PKTDF$,SHDDF$,TCBDF$0 F11DF$ ;DEFINE WINDOW AND LOCK BLOCK OFFSETS ' HDRDF$ ;DEFINE TASK HEADER OFFSETS S$ HWDDF$ ;DEFINE HARDWARE REGISTERS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS* SHDDF$ ;DEFINE SHADOW RECORDING OFFSETS, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS .PAGE;+); **-$ACHKP-ADDRESS CHECK PARAMETER BLOCK6; **-$ACHKW-ADDRESS CHECK PARAMETER BLOCK WORD ALIGNED ; G; THESE ROUTINES ARE CALLED TO ADDRESS CHECK A TASK SPECIFIED PARAMETERCM; BLOCK TO INSURE IT IS WITHIN THE TASK'S ADDRESS SPACE AND ALIGNED PROPERLY.HI; IF EITHER CHECK FAILS, THEN A DIRECTIVE STATUS OF 'D.RS98' IS RETURNED.A;T ; INPUTS: ;C1; R0=STARTING ADDRESS OF THE BLOCK TO BE CHECKED.S0; R1=LENGTH OF THE BLOCK TO BE CHECKED IN BYTES.;D ; OUTPUTS:;RA; THE SPECIFIED BLOCK IS CHECKED FOR PROPER ALIGNMENT AND WHETHERL?; IT IS WITHIN THE TASK'S ADDRESS SPACE. IF EITHER CHECK FAILS, @; THEN A DIRECTIVE STATUS OF 'D.RS98' IS RETURNED. ELSE A RETURN; TO THE CALLER IS EXECUTED.; 9; R2=ADDRESS OF WINDOW BLOCK MAPPING BUFFER ($ACHKW ONLY)H-; (FOR PRIVILEGED TASKS SEE NOTE IN $ACHKB.)T;O&; R0 AND R3 ARE PRESERVED ACROSS CALL.;- T .ENABL LSBF3$ACHKP00‹âz—ztöt÷tø tþfDATA::MOV R3,R0 ;SET ADDRESS OF BLOCK TO CHECK T+ CALL $ACHCK ;ADDRESS CHECK WORD ALIGNED  BCS 10$ ;IF CS CHECK FAILURE/ CALL $RELOC ;RELOCATE PARAMETER BLOCK ADDRESST& MOV R1,KISAR6 ;MAP TO PARAMETER BLOCK- MOV R2,R3 ;REDEFINE PARAMETER BLOCK ADDRESS RETURN ;E2$ACHKW::CALL $ACHCK ;ADDRESS CHECK WORD ALIGNED  BCC 50$ ;IF CC OKAYK(10$: DRSTS D.RS98 ;SET DIRECTIVE STATUS .PAGE;+&; **-$ACHKB-ADDRESS CHECK BYTE ALIGNED&; **-$ACHCK-ADDRESS CHECK WORD ALIGNED;TJ; THIS ROUTINE IS CALLED TO ADDRESS CHECK A BLOCK OF MEMORY TO SEE WHETHER7; IT LIES WITHIN THE ADDRESS SPACE OF THE CURRENT TASK.C;K ; INPUTS:C; 1; R0=STARTING ADDRESS OF THE BLOCK TO BE CHECKED.,0; R1=LENGTH OF THE BLOCK TO BE CHECKED IN BYTES.; ; OUTPUTS:; ; C=1 IF ADDRESS CHECK FAILED.!; C=0 IF ADDRESS CHECK SUCCEEDED.I;D+; R2=ADDRESS OF WINDOW BLOCK MAPPING BUFFER ; (FOR PRIV TASKS SEE NOTE.);&; R0 AND R3 ARE PRESERVED ACROSS CALL.;*9; NOTE: SINCE PRIVILEGED TASK I/O BUFFERS ARE NOT ADDRESSA4; CHECKED, R2 ALWAYS RETURNS A POINTER TO THE FIRST8; WINDOW BLOCK. CHECKPOINTING AND SHUFFLING OF COMMONS6; WILL STILL WORK PROPERLY PROVIDED THAT A PRIVILEGED5; TASK NEVER SPECIFIES AN I/O INTO A COMMON WHICH ITD3; ALLOWS TO REMAIN CHECKPOINTABLE AND SHUFFLEABLE.K;I0; THE ABOVE ALSO IMPLIES THAT ALLOWING A RANDOM.; REGION TO BE SHUFFLED OR CHECKPOINTED WHILE0; P.RMCT=0 MIGHT POSSIBLY CHECKPOINT THE REGION; WITH THE BUFFER CONTAINED. ;-$ACHCK::ASR R0 ;ODD ADDRESS?  BCS 14$ ;IF CS YES ASL R0 ;REALIGN ADDRESSN7$ACHKB::CALL $ACHRO ;CHECK BUFFER FOR READ ONLY ACCESSF BCS 14$ ;IF CS FAILURE .IF DF X$$HDR0 BIT #4,$IOTMP ;WRITE ACCESS ALLOWED TO WINDOW ? .IFFI4 BIT #4,W.BLPD(R2) ;WRITE ACCESS ALLOWED TO WINDOW ? .ENDC ;X$$HDR BNE 14$ ;IF NE YES SEC ;ELSE RETURN CS14$: RETURN ;  .PAGE;+9; **-$ACHUI-ADDRESS CHECK USER I SPACE (FOR LOAD OVERLAY)O; @; THIS ROUTINE CHECKS THE SPECIFIED USER BUFFER FOR EXISTENCE IN; USER I SPACE ONLY.; ; INPUTS:;L1; R0=STARTING ADDRESS OF THE BLOCK TO BE CHECKED. 0; R1=LENGTH OF THE BLOCK TO BE CHECKED IN BYTES.;E ; OUTPUTS:;H; C=1 IF ADDRESS CHECK FAILED.!; C=0 IF ADDRESS CHECK SUCCEEDED.;T,; R2=ADDRESS OF WINDOW BLOCK MAPPING BUFFER.(; (FOR PRIV TASKS SEE NOTE IN $ACHKB);S); R0 AND R3 ARE PRESERVED ACROSS THE CALL;- .IF DF U$$DAS$ACHUI:: .IF DF X$$HDR' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGE- MOV $SAHDB,KISAR6 ;AND MAP TO CURRENT HEADER .ENDC ; DF X$$HDR2 MOV $SAHPT,R2 ;GET ADDRESS OF CURRENT TASK HEADER- CLR -(SP) ;FORCE EXAMINATION OF USER I ONLYE BR 145$ ;ENTER COMMON ROUTINE: .ENDC ; DF U$$DAS .PAGE;+.; **-$ACHRO-ADDRESS CHECK FOR READ-ONLY ACCESS;DE; THIS ROUTINE CHECKS THE SPECIFIED USER BUFFER FOR READ-ONLY ACCESS.$;K ; INPUTS:0;D1; R0=STARTING ADDRESS OF THE BLOCK TO BE CHECKED.$0; R1=LENGTH OF THE BLOCK TO BE CHECKED IN BYTES.; ; OUTPUTS:;A; C=1 IF ADDRESS CHECK FAILED.!; C=0 IF ADDRESS CHECK SUCCEEDED.D;$,; R2=ADDRESS OF WINDOW BLOCK MAPPING BUFFER.'; (FOR PRIV TASKS SEE NOTE IN $ACHKB.)I;O&; R0 AND R3 ARE PRESERVED ACROSS CALL.;- :$ACHRO:: .IF DF X$$HDR' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGO2 MOV $SAHDB,KISAR6 ;AND MAP TO CURRENT TASK HEADER .ENDC ; DF X$$HDR, MOV $SAHPT,R2 ;POINT TO CURRENT TASK HEADER .IF DF U$$DAS!S$$LIBE4 MOV H.SMAP(R2),-(SP) ;SAVE USER/SUPER MAPPING MASKS ;FOR LATER +145$: CLR -(SP) ;ALLOCATE SPACE FOR BUFFER  ;DESCRIPTOR MASK .IFTF ; DF U$$DAS!S$$LIBI3 MOV H.WND(R2),R2 ;POINT TO NUMBER OF WINDOW BLOCKS . MOV (R2)+,-(SP) ;PUSH NUMBER OF WINDOW BLOCKS% TST W.BLVR(R2) ;TASK MAPPED TO EXEC?$, BNE 40$ ;IF NE YES, ADDRESS CHECK SUCCEEDS, DEC R1 ;CALCULATE HIGHEST ADDRESS OF BLOCK ADD R0,R1 ;N$ BCC 147$ ;IF CC ALL IS OK, NO WRAP5; * * * SPECIAL NOTE ABOUT PRIVILEGED TASKS * * *V;S<; IN ORDER TO MAKE THE IMPLEMENTATION OF ADDRESS CHECKING ON=; RSX-11M-PLUS COMPATIBLE WITH RSX-11M, WHICH SKIPS CHECKS IF =; T3.PRV IS SET, W00‹êzÞzt´cÚµcÛ¶c�·c›’E ADDRESS CHECK ONLY THE FIRST ADDRESS, NOTT@; THE LENGTH OF THE TRANSFER. THIS ALLOWS A PR:0 TASK TO PERFORM;; A LARGE I/O INTO A REGION WHICH IS MAPPED THROUGH A SMALLI>; WINDOW. WE MUST STILL ADDRESS CHECK, SINCE THIS ROUTINE WILL=; RETURN THE WINDOW BLOCK MAPPING THE BUFFER TO WHICH THE I/O ; IS TO BE CHARGED.C; =; SINCE THIS CHECK REQUIRES SEVERAL EXTRA INSTRUCTIONS, IT ISE<; IMPLEMENTED IN THE ERROR PATHS THROUGH THE CHECK ROUTINES.; 2 MOV $TKTCB,-(SP) ;GET TCB ADDRESS OF CURRENT TASK1 ADD #T.ST3,(SP) ;POINT TO THIRD TASK STATUS WORDH% BIT #T3.PRV,@(SP)+ ;TASK PRIVILEGED? , BEQ 30$ ;IF EQ NO, ADDRESS WRAP -> FAILURE147$: ;REFERENCE LABEL  .IFT ; DF U$$DAS!S$$LIB* TST 4(SP) ;TASK HAVE ONLY USER I SPACE ?+ BNE 100$ ;IF NE NO, GO DO IT THE HARD WAYT .IFTF ; DF U$$DAS!S$$LIBC/15$: TST (R2) ;IS NEXT WINDOW MAPPED? (W.BPCB)R BEQ 20$ ;IF EQ NOE  L .IF DF S$$LIB R* TSTB W.BFPD(R2) ;SUPERVISOR MODE MAPPING?. BPL 20$ ;IF PL YES, IGNORE FOR ADDRESS CHECK A .ENDC ; DF U$$DAS O I& CMP R0,W.BLVR(R2) ;COMPARE LOW LIMITS" BLO 20$ ;IF LO NOT IN DESCRIPTOR' CMP R1,W.BHVR(R2) ;COMPARE HIGH LIMITS;* BLOS 40$ ;IF LOS BUFFER IS IN DESCRIPTOR<; TEST FOR ISSUER PR:0. IF SO MAPPING SUCCESSFUL EVEN THOUGH; LAST ADDRESS FAILED MAPPING2 MOV $TKTCB,-(SP) ;GET TCB ADDRESS OF CURRENT TASK1 ADD #T.ST3,(SP) ;POINT TO THIRD TASK STATUS WORD % BIT #T3.PRV,@(SP)+ ;TASK PRIVILEGED?R' BEQ 20$ ;IF EQ NO, LAST ADDR. FAILUREI3 CMP R0,W.BHVR(R2) ;LAST ADDRESS FAILURE OK, BUT IS$! ;FIRST ADDRESS WITHIN WINDOW?O/ BLOS 40$ ;IF LOS YES, OK. THIS IS A PRIV TASKT& ;WITH A VALID BUFFER THAT OVERLAPS ;THE END OF THE WINDOW.E/20$: ADD #W.BLGH,R2 ;POINT TO NEXT WINDOW BLOCKS# DEC (SP) ;MORE DESCRIPTORS TO GO?A BGT 15$ ;IF GT YES30$: ;REFERENCE LABEL .IFT ; DF U$$DAS!S$$LIB0 SUB #-6,SP ;CLEAR 3 WORDS OFF STACK, SET CARRY .IFF ; DF U$$DAS!S$$LIB# COM (SP)+ ;CLEAN STACK, SET CARRYL .IFTF ; DF U$$DAS!S$$LIB. .IF DF X$$HDR0 MOV (SP)+,KISAR6 ;RESTORE PREVIOUS EXEC MAPPING .ENDC ; DF X$$HDR RETURN ;H40$: ;REFERENCE LABEL .IFT ; DF U$$DAS!S$$LIB1 ADD #6,SP ;CLEAR 3 WORDS OFF STACK, CLEAR CARRYR .IFF ;DF U$$DAS!S$$LIBC% TST (SP)+ ;CLEAN STACK, CLEAR CARRY .IFTF ; DF U$$DAS!S$$LIB  .IF DF X$$HDR6 MOV W.BLPD(R2),$IOTMP ;SAVE R/W INDICATOR FROM WINDOW0 MOV (SP)+,KISAR6 ;RESTORE PREVIOUS EXEC MAPPING .ENDC ; DF X$$HDR50$: RETURN ;.A; THIS SECTION HANDLES ADDRESS CHECKS FOR TASKS WITH MIXED I/D ORSD; USER/SUPER MAPPING. THIS CODE IS DESIGNED TO "FAVOR" (PERFORMANCE)@; TASKS WHOSE I/O IS FULLY MAPPED THROUGH USER D SPACE. THE CODE>; ABOVE FAVORS "SIMPLE" TASKS WITH ONLY USER I SPACE OR USER I ; SUPER I.; B; FIRST, FIND A WINDOW (IF THERE IS ONE) WHICH CONTAINS THE ENTIRE; BUFFER .IFT ; DF U$$DAS!S$$LIB%100$: TST (R2) ;NEXT WINDOW MAPPED ?+ BEQ 110$ ;IF EQ NO& CMP R0,W.BLVR(R2) ;COMPARE LOW LIMITS# BLO 110$ ;IF LO NOT IN DESCRIPTORN' CMP R1,W.BHVR(R2) ;COMPARE HIGH LIMITSI+ BLOS 120$ ;IF LOS BUFFER IS IN DESCRIPTORS<; TEST FOR ISSUER PR:0. IF SO MAPPING SUCCESSFUL EVEN THOUGH; LAST ADDRESS FAILED MAPPINGE2 MOV $TKTCB,-(SP) ;GET TCB ADDRESS OF CURRENT TASK1 ADD #T.ST3,(SP) ;POINT TO THIRD TASK STATUS WORD(% BIT #T3.PRV,@(SP)+ ;TASK PRIVILEGED?I( BEQ 110$ ;IF EQ NO, LAST ADDR. FAILURE3 CMP R0,W.BHVR(R2) ;LAST ADDRESS FAILURE OK, BUT IS;! ;FIRST ADDRESS WITHIN WINDOW?R0 BLOS 120$ ;IF LOS YES, OK. THIS IS A PRIV TASK& ;WITH A VALID BUFFER THAT OVERLAPS ;THE END OF THE WINDOW.R0110$: ADD #W.BLGH,R2 ;POINT TO NEXT WINDOW BLOCK$ DEC (SP) ;MORE DESCRIPTORS TO GO ? BGT 100$ ;IF GT YESN! BR 30$ ;ELSE ADDR. CHECK FAILEDD .ENDC ; DF U$$DAS!S$$LIB.>; FOUND A WINDOW WHICH COVERS TRANSFER. CHECK FOR USER D SPACE; FIRSTL120$: ;REFERENCE LABEL  .IF DF U$$DAS- BIT #20,W.BFPD(R2) ;USER DATA SPACE WINDOW ?T BEQ 130$ ;IF EQ NOA; WINDOW IS USER D SPACE. IF THE REQUEST WAS ISSUED IN USER MODE,-; THEN THE BUFFER IS G00‹òz—ztöt÷tø tþfDATAUARANTEED TO BE MAPPED.E .IF DF S$$LIB, TST $STACK-2 ;ISSUED FROM SUPERVISOR MODE ?) BMI 40$ ;IF MI NO, D SPACE MAP SUCCEEDSD; WINDOW IS D SPACE, BUT REQUEST WAS ISSUED FROM SUPER MODE. THIS IS?; OK ONLY IF THERE IS NO OVERLAP BETWEEN THE BUFFER AND A SUPER 1; D APR WHICH HAS BEEN MAPPED INTO SUPER I SPACE.A( CALL 210$ ;BUILD SUPER BUFFER APR MASK6 BITB 2(SP),4(SP) ;ANY PART OVERLAP SUPER I/D WINDOW ? BEQ 40$ ;IF EQ NO, SUCCESS BR 110$ ;KEEP TRYING .ENDC ; DF S$$LIB .ENDC ; DF U$$DAS6; WINDOW IS EITHER USER I OR SUPER I. CHECK FOR USER I130$: ;REFERENCE LABEL4 .IF DF S$$LIB, TSTB W.BFPD(R2) ;USER I OR SUPER I WINDOW ? BPL 150$ ;IF PL SUPER IR .ENDC ; DF S$$LIBB; WINDOW IS USER I SPACE. LOOK FOR CONFLICT WITH DISCRETE D SPACED; WINDOW. FOR PERFORMANCE, WE BUILD THE MASK IF WE NEED IT, BUT ONLY; ONCE IN ANY CASE.  .IF DF U$$DAS# CALL 210$ ;ESTABLISH MAPPING MASK$?140$: BITB 3(SP),5(SP) ;ANY OF BUFFER OVERLAP DISCRETE WINDOW ?! BNE 110$ ;IF NE YES, KEEP GOING  .ENDC ; DF U$$DAS BR 40$ ;SUCCESSFULI; WINDOW IS SUPER I. IF ISSUED IN USER MODE IGNORE WINDOW, ELSE MAKE SUREU; ENTIRE WINDOW IS OVERMAPPED. .IF DF S$$LIB*150$: TST $STACK-2 ;ISSUED IN SUPER MODE ?# BMI 110$ ;IF MI NO, IGNORE WINDOWEF; SINCE SUPER WINDOWS CAN'T MAP APR0 INTO SUPER I SPACE, IGNORE WINDOW; IF TRANSFER STARTS IN APR0' CMP #20000,R0 ;BUFFER START IN APR 0 ?S- BHI 110$ ;IF HI YES, CAN'T BE THROUGH SUPERRE; ESTABLISH SUPERVISOR MASK AND MAKE SURE WHOLE TRANSFER FITS THROUGH ; SUPER I WINDOW+ CALL 210$ ;ESTABLISH SUPER D OVERMAP MASKI- MOVB 2(SP),-(SP) ;COPY SUPER BUFFER APR MASKN0 BICB 6(SP),(SP)+ ;FULL BUFFER IN SUPER WINDOW ? BEQ 40$ ;IF EQ YES BR 110$ ;ELSE NO .ENDC ; DF S$$LIB9; LOCAL SUBROUTINE TO ESTABLISH SUPER BUFFER MAPPING MASKU .IF DF U$$DAS!S$$LIBW)210$: TSTB 5(SP) ;USER D MAP BUILT YET ?, BNE 220$ ;IF NE YES 3 MOV R2,-(SP) ;SAVE POINTER TO CURRENT WINDOW BLOCK' MOV R1,R2 ;COPY END ADDRESS OF BUFFERR! ASH #-13.,R2 ;REDUCE TO JUST APRU$ BIC #177770,R2 ;CLEAR UNWANTED BITS< MOVB $BCMSK(R2),7(SP) ;INIT MASK TO ALL UP TO UPPER ADDRESS) MOV R0,R2 ;COPY START ADDRESS OF BUFFER ! ASH #-13.,R2 ;REDUCE TO JUST APRS$ BIC #177770,R2 ;CLEAR UNWANTED BITS> BICB $BCMSK-1(R2),7(SP) ;INIT MASK TO ALL UP TO UPPER ADDRESS" MOVB 7(SP),6(SP) ;INIT SUPER MASK CLC ;GET SET FOR SHIFTU& RORB 6(SP) ;SUPER MASK IS ORIGIN ONE% MOV (SP)+,R2 ;RESTORE WINDOW POINTERO220$: RETURN ; .ENDC ;DF U$$DAS!S$$LIB .DSABL LSB. .PAGE;+9; **-$CKBFI-CHECK I/O BUFFER FOR I-SPACE (OVERLAY) ACCESSB8; **-$CKBFR-CHECK I/O BUFFER FOR READ-ONLY (BYTE) ACCESS9; **-$CKBFW-CHECK I/O BUFFER FOR READ-WRITE (WORD) ACCESSC9; **-$CKBFB-CHECK I/O BUFFER FOR READ-WRITE (BYTE) ACCESS ;M:; THESE ROUTINES ARE CALLED TO ADDRESS CHECK AN I/O BUFFER>; ASSOCIATED WITH THE CURRENT (UNDER CONSTRUCTION) I/O PACKET.C; IF THE ADDRESS CHECK PASSES, THEN AN ATTEMPT IS MADE TO POINT ONEEC; OF THE ATTACHMENT DESCRIPTOR POINTERS AT THE ASSOCIATED ADB. THISA*; WILL HAVE ONE OF THE FOLLOWING OUTCOMES:;EE; 1) - THERE IS CURRENTLY NO ATTACHMENT POINTER IN THE PACKET TO THISCD; ADB, AND THE POINTERS AREN'T FULL. A POINTER IS FILLED IN ANDD; THE A.IOC, P.IOC FIELDS FOR THIS I/O ARE INCREMENTED. THIS IS$; THE "NORMAL" SUCCESSFUL CASE.; ?; 2) - THERE IS ALREADY ONE POINTER TO THIS ADB. THE PACKET IS CB; UNTOUCHED, AS ARE THE A.IOC AND P.IOC FIELDS, AND THE CHECKD; IS CONSIDERED SUCCESSFUL. THE IMPLICATION OF NOT INCREMENTING?; A.IOC AND P.IOC IS THAT DRIVERS AND ACPS MAY NOT RELEASEE@; BUFFERS FOR AN I/O REQUEST ONE AT A TIME, I.E. THE DRIVERA; SHOULD NOT CALL $DECIO DIRECTLY, BUT SHOULD CALL $IODON OR 5; $DECAL AFTER ALL BUFFER ACCESS HAS SCOMPLETED.E;TF; 3) - THERE ARE ALREADY TWO POINTERS, NONE OF THEM TO THIS ATTACHMENT@; DESCRIPTOR. THIS IS CONSIDERED A CHECK FAILURE AND RETURN; IS MADE WITH CARRY SET.;T ; INPUTS: ; ,; R0=STARTING ADDRESS OF BLOCK TO BE00‹úzÞzt´cÚµcÛ¶c�·c›’ CHECKED#; R1=LENGTH OF BUFFER TO BE CHECKEDI0; $ATTPT=ADDRESS OF I.AADA IN CURRENT I/O PACKET5; HEADER OF THE SUBJECT TASK IS MAPPED THROUGH KISAR6R;R ; OUTPUTS:; '; C=0 CHECK AND PACKET UPDAT SUCCESSFUL '; I.AADA OR I.AADA+2 POINTS TO THE ADBR; A.IOC, P.IOC INCREMENTED9; C=1 CHECK UNSUCCESSFUL OR PACKET COULD NOT BE FILLED IN ;- .ENABL LSBD .IF DF U$$DAS+$CKBFI::CALL $ACHUI ;PERFORM ADDRESS CHECKI BR 10$ ;ENTER COMMON CODE  .ENDC ; DF U$$DAS+$CKBFR::CALL $ACHRO ;PERFORM ADDRESS CHECKT BR 10$ ;ENTER COMMON CODE +$CKBFW::CALL $ACHCK ;PERFORM ADDRESS CHECK BR 10$ ;ENTER COMMON CODEI+$CKBFB::CALL $ACHKB ;PERFORM ADDRESS CHECK /10$: BCS 50$ ;IF CS ADDRESS CHECK UNSUCCESSFULR% MOV R0,-(SP) ;SAVE ADDRESS OF BUFFER 8 MOV W.BATT(R2),R1 ;GET ADDRESS OF ATTACHMENT DESCRIPTOR- MOV $ATTPT,R0 ;POINT TO ADDRESS OF FIRST ADBF$ TST (R0) ;FIRST ADB POINTER FULL ?/ BNE 40$ ;IF NE YES, CHECK FOR MATCH OR SECOND "20$: MOV R1,(R0) ;FILL IN POINTER7 INCB A.IOC(R1) ;INCREMENT I/O THROUGH ATTACHMENT COUNTN* MOV A.PCB(R1),R0 ;POINT TO ASSOCIATED PCB1 INCB P.IOC(R0) ;INCREMENT I/O INTO PARTION COUNT:)30$: MOV (SP)+,R0 ;RESTORE BUFFER ADDRESS: CLC ;INDICATE SUCCESS RETURN ;S440$: CMP R1,(R0)+ ;ALREADY POINTING TO DESIRED ADB ?* BEQ 30$ ;IF EQ YES, DONE, RETURN SUCCESS! TST (R0) ;SECOND POINTER FULL ?E BEQ 20$ ;IF EQ NO, USE IT;/ CMP R1,(R0) ;SECOND POINTER SAME AS DESIRED ?H* BEQ 30$ ;IF EQ YES, DONE, RETURN SUCCESS SEC ;INDICATE FAILURE% MOV (SP)+,R0 ;RESTORE BUFFER ADDRESSN50$: RETURN ;P .DSABL LSBT .PAGE;+C; **-$CEFNG-CONVERT EVENT FLAG AND LOCK GROUP GLOBALS FOR DIRECTIVE(=; **-$CEFIG-CONVERT EVENT FLAG AND LOCK GROUP GLOBALS FOR I/OT; >; THIS ROUTINE IS CALLED TO CONVERT AN EVENT FLAG NUMBER TO AN@; EVENT FLAG MASK WORD AND EVENT FLAG MASK ADDRESS. IF THE EVENTC; FLAG IS GROUP GLOBAL, POINT THE GROUP GLOBAL USE COUNT POINTER IN A; SYSTEM COMMON TO THE FLAG WORD RETURNED IN R1. IF R1 IS ODD, R1C>; IS POINTING TO THE SECOND GROUP OF GROUP GLOBAL EVENT FLAGS.;R ; INPUTS:;. ; R0=EVENT FLAG TO BE CONVERTED.7; R3=ADDRESS CONTAINING EVENT FLAG NUMBER ($CEFNG ONLY)(0; R5=TCB ADDRESS OF THE TASK THE EFN APPLIES TO.;L ; OUTPUTS:;,; C=1 IF NO EVENT FLAG NUMBER WAS SPECIFIED. ; R0=ZERO. ; R1=ZERO.L,; C=0 IF AN EVENT FLAG NUMBER WAS SPECIFIED.; R0=EVENT FLAG MASK WORD.B; R1=EVENT FLAG MASK ADDRESS.-; R1 IS EVEN IF THE EVENT FLAG NUMBER < 81.O,; R1 IS ODD IF THE EVENT FLAG NUMBER > 81.;N<; R3 IS PRESERVED ACROSS CALL IF ENTRY AT $CEFIG, ELSE R3 IS; ADVANCED BY 2.F; ;- .ENABL LSB +$CEFIG::CALL $CEFI ;CONVERT THE EVENT FLAG  BR 5$ ;JOIN COMMON CODE +$CEFNG::CALL $CEFN ;CONVERT THE EVENT FLAG5$: ;REFERENCE LABELG .IF DF G$$GEF BCS 30$ ;IF CS RETURNE BNE 30$ ;IF NE RETURNL- MOV R1,-(SP) ;SAVE GROUP GLOBAL MASK ADDRESS - TSTB -(R1) ;POINT TO GROUP GLOBAL USE COUNTI) TSTB -(R1) ;R1 MAY BE ODD - CLEAR C-BIT * ASSUME G.CNT+2,G.EFLG ;MUST BE CONTIGUOUS$ BIT #1,R1 ;USING SECOND MASK WORD?1 BEQ 10$ ;IF EQ NO, WE ARE POINTING TO USE COUNT, SUB #3,R1 ;POINT TO GROUP GLOBAL USE COUNT910$: MOV R1,@#$GEFPT ;LOAD GROUP GLOBAL USE COUNT POINTERA. MOV (SP)+,R1 ;RESTORE EVENT FLAG MASK ADDRESS4 MOV R5,$GFTCB ;DISPATCHER WILL MAINTAIN THE CORRECT; ADD #T.GGF,$GFTCB ; GRP GBL USE COUNT PER TASK W/THIS PNTRB .ENDC ; DF G$$GEF 30$: RETURN .DSABL LSB ;+ T2; **-$CEFN-CONVERT EVENT FLAG NUMBER FOR DIRECTIVE,; **-$CEFI-CONVERT EVENT FLAG NUMBER FOR I/O;I>; THIS ROUTINE IS CALLED TO CONVERT AN EVENT FLAG NUMBER TO ANA; EVENT FLAG MASK WORD AND EVENT FLAG MASK ADDRESS. IF AN ILLEGAL,A; EVENT FLAG IS SPECIFIED, THEN A DIRECTIVE STATUS OF 'D.RS97' ISO@; RETURNED. ELSE THE EVENT FLAG NUMBER IS CONVERTED AND THE COM-*; PONENT PARTS ARE RETURNED TO THE CALLER.;E ; INPUTS:T; '; R0=EVENT FLAG NUMBER TO BE CONVERTED.:6; R3=ADDRESS CONTAINING EVENT FLAG NUMBER ($CEFN ONLY)0; R5=TCB ADDRESS OF THE TASK THE EFN APPLIES TO.;T ; OUTPUTS:;B,; C=00‹{—ztöt÷tø tþfDATA1 IF NO EVENT FLAG NUMBER WAS SPECIFIED. ; R0=ZERO.T ; R1=ZERO.T,; C=0 IF AN EVENT FLAG NUMBER WAS SPECIFIED.; R0=EVENT FLAG MASK WORD. ; R1=EVENT FLAG MASK ADDRESS.&; R1 IS EVEN IF THE EVENT FLAG < 81.%; R1 IS ODD IF THE EVENT FLAG > 81.V*; Z=1 IF GROUP GLOBAL EVENT FLAG CONVERTED-; Z=0 IF LOCAL OR COMMON EVENT FLAG CONVERTEDE;FJ; R3 IS PRESERVED ACROSS CALL IF ENTRY AT $CEFI, ELSE R3 IS ADVANCED BY 2.;-,$CEFN:: MOVB (R3)+,R0 ;GET EVENT FLAG NUMBER INC R3 ;ADVANCE TO NEXT WORD$CEFI:: ;REFERENCE LABEL  .IF DF G$$GEF( CLR -(SP) ;INIT GROUP GLOBAL INDICATOR .IFTF ; DF G$$GEF MOV R0,R1 ;COPY EFNO SEC ;ASSUME NONE SPECIFIEDR! BEQ 30$ ;IF EQ NO EFN SPECIFIEDL DEC R0 ;BACK OFF EFN BY ONEE MOV #32.,R2 ;SET EFN DIVIDER* MOV R5,R1 ;POINT TO FIRST TASK MASK WORD ADD #T.EFLG,R1 ;A CMP R0,R2 ;IN TASK EFN SET?R BLO 10$ ;IF LO YES$ SUB R2,R0 ;NORMALIZE TO COMMON SET CMP R0,R2 ;LEGAL EFN?+ .IFT ; DF G$$GEFU BLO 5$ ;IF LO YES * SUB R2,R0 ;NORMALIZE TO GROUP GLOBAL SET CMP R0,R2 ;LEGAL EFN?- BHIS 40$ ;IF HIS NOL6 CALL $GTGEF ;GET ADDRESS OF GROUP GLOBAL EVENT FLAGS2 BCS 40$ ;IF CS NO SUCH FLAG OR TASK CHECKPOINTED$ DEC (SP) ;FLAG THAT FLAG WAS FOUND BR 10$ ;USE GROUP GLOBAL SET .IFF ; DF G$$GEF, BHIS 40$ ;IF HIS NOM .IFTF ; DF G$$GEF35$: MOV #$COMEF,R1 ;POINT TO FIRST COMMON MASK WORDO10$: ASR R2 ;HALVE DIVIDERT CMP R0,R2 ;FIRST MASK WORD?L BLO 20$ ;IF LO YES SUB R2,R0 ;NORMALIZE EFN& TST (R1)+ ;POINT TO SECOND MASK WORD .IFT ; DF G$$GEFL$ TST (SP) ;GROUP GLOBAL FLAG FOUND? BEQ 20$ ;IF EQ NOS* INC R1 ;MARK AS SECOND GROUP GLOBAL WORD .IFTF ; DF G$$GEF'20$: ASL R0 ;CONVERT EFN TO WORD INDEXW( MOV $BTMSK(R0),R0 ;GET PROPER MASK WORD30$: ;REFERENCE LABEL .IFT ; DF G$$GEF1 INC (SP)+ ;CLEAN STACK, PRESRV C-BIT, SET Z BITF .ENDC ; DF G$$GEF RETURNR(40$: DRSTS D.RS97 ;SET DIRECTIVE STATUS .PAGE;+2; **-GTGEF-GET ADDRESS OF GROUP GLOBAL EVENT FLAGS;1D; THIS ROUTINE SEARCHES FOR GROUP GLOBAL EVENT FLAGS FOR A SPECIFIED@; TASK. IF THE EVENT FLAG EXISTS, THE ADDRESS OF THE EVENT FLAG ; WORD IS RETURNED IN R1..;F ; INPUTS:F;; R5=TCB ADDRESS OF TASK.O;R ; OUTPUTS:;$-; C=0 IF GROUP GLOBAL EVENT FLAGS WERE FOUND F); R1=ADDRESS OF GROUP GLOBAL EVENT FLAGS(;+;; C=1 IF THE EVENT FLAGS WERE NOT FOUND OR IF THE SPECIFIEDF; TASK IS CHECKPOINTED.9;;;- E .IF DF G$$GEF$$GTGEF::MOV R0,-(SP) ;SAVE REGISTERS MOV R4,-(SP) ;S. MOV T.PCB(R5),R4 ;GET TASK REGION PCB ADDRESS8 BIT #PS.OUT!PS.CKP,P.STAT(R4) ;TASK HEADER ACCESSIBLE ? SEC ;ASSUME IT WASE BNE 10$ ;IF NE YES .IF DF X$$HDR1 MOV KISAR6,-(SP) ;SAVE MAPPING IN CASE XTRNL HDR ( MOV P.HDR(R4),-(SP) ;GET HEADER ADDRESS BNE 5$ ;IF NE RESIDENT HEADER - MOV P.REL(R4),KISAR6 ;MAP TO EXTERNAL HEADERE- MOV #140000,(SP) ;SET HEADER VIRTUAL ADDRESS)5$: MOV (SP)+,R4 ;RETRIEVE HEADER ADDRESS' MOVB H.CUIC+1(R4),R4 ;GET GROUP NUMBERA+ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING) .IFF ; DF X$$HDRP* MOV P.HDR(R4),R4 ;GET TASK HEADER ADDRESS' MOVB H.CUIC+1(R4),R4 ;GET GROUP NUMBER  .ENDC ; DF X$$HDR2 CALL $SRGEF ;SEARCH FOR GROUP GLOBAL EVENT FLAGS BCS 10$ ;IF CS NOT FOUND+ ADD #6,R1 ;POINT TO FIRST EVENT FLAG WORD $10$: MOV (SP)+,R4 ;RESTORE REGISTERS MOV (SP)+,R0 ;  RETURNH E .PAGE;+/; **-$SRGEF-SEARCH FOR GROUP GLOBAL EVENT FLAGSS; ?; THIS ROUTINE IS CALLED TO SEARCH FOR GROUP GLOBAL EVENT FLAGSM;A ; INPUTS:+;S; R4=GROUP NUMBERU;A ; OUTPUTS:; 5; C=1 IF SPECIFIED GROUP GLOBAL EVENT FLAGS NOT FOUNDE5; C=0 IF SPECIFIED GROUP GLOBAL EVENT FLAGS ARE FOUND;'; R0=ADDRESS OF WORD POINTING TO BLOCKR; R1=ADDRESS OF THE BLOCK;$;- S:$SRGEF::MOV #$GGEF,R1 ;GET ADDRESS OF GROUP GLOBAL EF HEAD.10$: MOV R1,R0 ;SAVE POINTER TO CURRENT BLOCK( MOV (R1),R1 ;GET ADDRESS OF NEXT BLOCK BEQ 20$ ;IF EQ END OF LIST. CMPB G.GRP(R1),R4 ;IS THIS THE CORRECT BLOCK? BEQ 30$ ;IF EQ YES BLO 10$ ;IF LO KEEP SEARCHING4+20$: SEC ;SE00‹ {Þzt´cÚµcÛ¶c�·c›’T CARRY TO INDICATE NOT FOUNDS30$: RETURN ;O  .ENDC ; DF G$$GEF .PAGE;+?; **-$CVDVN-CONVERT DEVICE NAME AND LOGICAL UNIT TO UCB ADDRESS ;N3; THIS ROUTINE TAKES A 2 CHARACTER ASCII NAME AND AS4; UNIT NUMBER AND SEARCHES THE DEVICE TABLES TO FIND ; THE CORRESPONDING UCB ADDRESS.; ; INPUTS:B;K%; R0=TWO CHARACTER ASCII DEVICE NAME.O; R1=UNIT NUMBER.Q;D ; OUTPUTS:; ; C=0 IF DEVICE WAS FOUND.; R2=UCB ADDRESS.; R3=DCB ADDRESS.; C=1 IF DEVICE NOT FOUND.;0;- $CVDVN::SAVNR ;SAVE REGISTERSS0 MOV #$SCDVT,-(SP) ;SET UP TO SCAN DEVICE TABLES*10$: CALL @(SP)+ ;GET ADDRESS OF NEXT DCB BCS 100$ ;IF CS END OF LIST4 CLR S$$SPC(SP) ;SET UP TO SKIP THIS DCB IF NO MATCH& CMP D.NAM(R3),R0 ;DEVICE NAMES MATCH? BNE 10$ ;IF NE NOH5 CMPB D.UNIT+1(R3),R1 ;UNIT ASSOCIATED WITH THIS DCB?T BLO 10$ ;IF LO NOV CMPB D.UNIT(R3),R1 ;MAYBE BHI 10$ ;IF HI NO " ADD #S$$SPA,SP ;ABORT DEVICE SCAN& MOV R5,R2 ;COPY ADDRESS OF FIRST UCB MOV R1,R5 ;COPY UNIT NUMBER 4 SUB D.UNIT(R3),R5 ;CALCULATE NUMBER OF UCBS TO SKIP CLC ;INDICATE SUCCESS'20$: DECB R5 ;IS THIS THE CORRECT UCB?E BLT 100$ ;IF LT YESC% ADD D.UCBL(R3),R2 ;POINT TO NEXT UCB  BR 20$ ;CONTINUE SCANT100$: RETURN ; .PAGE;+ ; **-$TICLR-CLEAR TI: ASSIGNMENT;CC; THIS ROUTINE IS CALLED TO CLEAR THE TI: ASSIGNMENT OF THE CURRENTO<; TASK IN CASE THE CURRENT TASK'S TI: IS A VIRTUAL TERMINAL.;S ; INPUTS:T;V; NONE.;V ; OUTPUTS:;D; R0-R3 ARE MODIFIED.V;- C .IF DF V$$TRM S7$TICLR::MOV $TKTCB,R3 ;PICK UP CURRENT TASK TCB ADDRESS * MOV T.UCB(R3),R0 ;PICK UP TI: UCB ADDRESS' MOV (R0),R1 ;POINT TO TI: DCB ADDRESS. CMP D.NAM(R1),#"VT ;IS IT A VIRTUAL TERMINAL? BNE 150$ ;IF NE NO E N .IF DF D$$PAR  MOV KINAR5,-(SP) ;SAVE APR 52 MOV $DRAPR,KINAR5 ;MAP TO THE DIRECTIVE PARTITION T .ENDC R O1 CALL $CVTLN ;CLEAR OUT ANY LUNS ASSIGNED TO VT:L, DECB U.OCNT(R0) ;REDUCE VT: OFFSPRING COUNT2 BNE 140$ ;IF NE THERE ARE OTHER ACTIVE OFFSPRING5 TST U.PTCB(R0) ;IS VT: UNIT MARKED FOR DEALLOCATION?T BNE 140$ ;IF NE NO MOV R3,-(SP) ;SAVE TCB ADDRESSA& CALL $DEAVT ;DEALLOCATE THE VT: UNIT" MOV (SP)+,R3 ;RESTORE TCB ADDRESS140$: ;REFERENCE SYMBOL  F .IF DF D$$PAR F" MOV (SP)+,KINAR5 ;RESTORE MAPPING  .ENDC V R MOV $COPT,R0 ;POINT TO CO: UCBP! CALL $MPLND ;FOLLOW REDIRECTION $ MOV R0,T.UCB(R3) ;ASSIGN TI: TO CO:150$: RETURN ; .IFFE0$TICLR::RETURN ;NOP ROUTINE IF LACK OF SUPPORT .ENDC .PAGE;+,; **-$MPLNE-MAP LOGICAL UNIT NUMBER FOR EXIT#; **-$MPLUN-MAP LOGICAL UNIT NUMBERV;,K; THIS ROUTINE IS CALLED TO VALIDATE A LOGICAL UNIT NUMBER (LUN) AND TO MAPRD; THE LUN INTO A UCB POINTER. IF AN ILLEGAL LUN IS SPECIFIED, THEN AH; DIRECTIVE STATUS OF 'D.RS96' IS RETURNED. ELSE THE LUN IS MAPPED AND A8; POINTER TO THE LUN AND UCB ARE RETURNED TO THE CALLER.; ; INPUTS:C;3; R3=ADDRESS OF THE LUN./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.O,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; ; OUTPUTS:; 4; C=1 IF NO DEVICE IS ASSIGNED TO THE SPECIFIED LUN.; R0=0.3; C=0 IF A DEVICE IS ASSIGNED TO THE SPECIFIED LUN.L&; R0=ADDRESS OF REDIRECTED-TO UCB 5; R2=ADDRESS OF REDIRECTED-TO UCB OR SPOOLED DEVICE H ; @; IN EITHER CASE R1 IS RETURNED AS THE ADDRESS OF THE SECOND LUN2; WORD IN THE TASK HEADER AND R3 IS ADVANCED BY 2.;- .ENABL LSBS($MPLUN::CLR R1 ;GET LOGICAL UNIT NUMBER BISB (R3)+,R1 ; INC R3 ;POINT TO NEXT WORD DEC R1 ;BACK OFF LUN BY 1E CMP R1,H.NLUN(R4) ;LEGAL LUN? BHIS 40$ ;IF HIS NOI$$MPLNE::ASL R1 ;MULTIPLY LUN-1 BY 4 ASL R1 ;0 ADD R4,R1 ;CALCULATE ADDRESS OF FIRST LUN WORD! ADD #H.NLUN+2,R1 ;IN TASK HEADERR SEC ;ASSUME LUN NOT ASSIGNED ( MOV (R1)+,R0 ;GET POINTER TO DEVICE UCB# BEQ 30$ ;IF EQ NO DEVICE ASSIGNED 6$MPLND::MOV R0,R2 ;INITIALIZE SPOOLED DEVICE UCB PTR .5$: CMP R0,U.RED(R0) ;IS DEVICE REDIRECTED?  BEQ 10$ ;IF EQ NO . MOV U.RED(R0),R0 ;GET POINTER TO REDIRECT UCB4 BIT #DV.ISP!DV.OSP,U.CW1(R2) ;SPOOLED DEVICE YET? 00‹{Œ{töt÷tø tþfDATA, BEQ $MPLND ;IF EQ NO, ADVANCE R2 AS WELL ) BR 5$ ;ELSE INHIBIT ADVANCEMENT OF R2 ,010$: MOV (R0),-(SP) ;GET ADDRESS OF DEVICE DCB / ADD #D.NAM,(SP) ;POINT TO DEVICE NAME IN DCB T1 CMP #"TI,@(SP)+ ;TERMINAL INPUT PSEUDO DEVICE? B BNE 20$ ;IF NE NO I* MOV T.UCB(R5),R0 ;GET ADDRESS OF "TI" UCB BR $MPLND ; $20$: CLC ;INDICATE DEVICE ASSIGNED30$: RETURN ; (40$: DRSTS D.RS96 ;SET DIRECTIVE STATUS .DSABL LSBR .PAGE;+*; **-$TKWSE-TASK WAITFOR SIGNIFICANT EVENT;CM; THIS ROUTINE IS CALLED TO EXECUTE A WAITFOR SIGNIFICANT EVENT DIRECTIVE FORD-; THE CURRENT TASK FROM WITHIN THE EXECUTIVE.D;S ; INPUTS:D; ; NONE..;, ; OUTPUTS:;DC; A WAITFOR SIGNIFICANT EVENT DIRECTIVE IS EXECUTED FOR THE CURRENT .; TASK AND A RETURN TO THE CALLER IS EXECUTED.;-6$TKWSE::MOV $TKTCB,R5 ;GET ADDRESS OF CURRENT TASK TCB;+%; **-$DRWSE-WAITFOR SIGNIFICANT EVENTS;RE; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SUSPEND THE EXECUTION OF THEA0; ISSUING TASK UNTIL THE NEXT SIGNIFICANT EVENT.;A ; DPB FORMAT: ;A"; WD. 00 -- DIC(49.),DPB SIZE(1.).; ; INPUTS:N;A9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK..+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.A,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK);+$; C=0 WITH A DIRECTIVE STATUS OF +1.;-7$DRWSE::MOV T.ACTL(R5),R0 ;GET TCB ADDRESS OF NEXT TASKE6 MOV R5,$SIGFL ;SET TASK WAITING FOR SIGNIFICANT EVENT4 CALLR $SETRQ ;FORCE REDISPATCHING OF THE PROCESSOR .END(1.).; ; INPUTS:N;A9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK..+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.A,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK);+$; C=0 WITH A DIRECTIVE STATUS OF +1.;-7$DRWSE::MOV T.ACTL(R5),R0 ;GET TCB ADDRESS OF NEXT TASKE6 MOV R5,$SIGFL ;SET TASK WAITING FOR SIGNIFICANT EVE .TITLE DREXPD .IDENT /05.03/S;$8; COPYRIGHT (C) 1985 BY DIGITAL EQUIPMENT CORPORATION,'; MAYNARD, MASS. ALL RIGHTS RESERVED.E;O>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;  ; T. J. MILLER 8-JUL-76  ;+ ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:U ;N ; M. S. FOX,; J. M. LAWLER; B. S. MCCARTHY;C-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:S;B; J. R. KAUFFMAN; J. M. LAWLER; L. B. MCCULLEY;S-; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:M;O"; B. S. MCCARTHY 5-MAR-87 05.03; .; BM385 -- ADD $DRXP1 LABEL FOR MOVEMENT TO; VECTOR COMMONM; ; ; MACRO LIBRARY CALLSO!;E"%# .MCALL HWDDF$,HDRDF$,PCBDF$,TCBDF$ $$ HWDDF$ ;DEFINE HARDWARE OFFSETS'% HDRDF$ ;DEFINE TASK HEADER OFFSETSN3& PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSY.' TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS()*+;+,; **-$DREXP-EXTEND PARTITION-; F.; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EXTEND THE PARTITION OF THE5/; ISSUING TASK BY A POSITIVE OR NEGATIVE INCREMENT.50;D1; DPB FORMAT:R2;M$3; WD. 00 -- DIC(89.),DPB SIZE(3.).4; WD. 01 -- EXTEND INCREMENT.E5; WD. 02 -- RESERVED.R6;C 7; INPUTS:8;DB9; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.2:; R3=ADDRESS OF THE EXTEND INCREMENT IN THE DPB.1;; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.E.<; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.=;7>; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)H?;T/@; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.E*A; DIRECTIVE STATUS OF '+1' IS RETURNED.B;!C; C=1 IF DIRECTIVE IS REJECTED..;D; DIRECTIVE STATUS OF 'D.RS8' IF TASK NOT IN SYSTEM CON-3E; TROLLED PARTITION, TASK IS NOT CHECKPOINTABLED3F; AND SPECIFIED POSITIVE INCREMENT, OR TASK HASS4G; PREALLOCATED CHECKPOINT SPACE AND IS EXTENDING"H; GREATER THAN INSTALLED SIZE.;I; DIRECTIVE STATUS OF 'D.RS88' IF00Œ{Þzt´cÚµcÛ¶c�·c›’ SPECIFIED INCREMENT ISPJ; INVALID.K;-LMN .IF DF E$$XPROO ; BM385IO .IF DF D$$PAR ; BM385O ; BM385FO$DRXP1:: ; BM385O ; BM385 !O .IFF ; DF D$$PAR ; BM385FO ; BM385IO$DREXP:: ; BM385O ; BM385N"O .ENDC ; DF D$$PAR ; BM385O ; BM385TQ ;**-1 R .IF DF U$$DAS!S$$LIB S6T MOV H.SMAP(R4),-(SP) ;KEEP A COPY OF SUPER AND USERU ;MAPPING MASKSFVW .ENDC ; DF U$$DAS!S$$LIBIXY?Z; FIRST DETERMINE THAT THE TASK HAS NO I/O IN PROGRESS TO ITS83[; TASK REGION, AND DISALLOW DIRECTIVE IF IT DOES.M\6] MOV T.ATT(R5),R0 ;POINT TO ATT DESC FOR TASK REGION@^ TSTB A.IOC-A.TCBL(R0) ;DOES TASK HAVE I/O THROUGH THIS DESCR?_ BEQ 5$ ;IF EQ NO ` DRSTS D.RS83 ;IO IN PROGRESSaAb; NEXT CHECK FOR OTHER TASKS HAVING AN ATTACHMENT DESCRIPTOR TO$Bc; THE ISSUING TASKS TASK REGION. IF THEY DO, WE CAN'T UPDATE THE(d; WINDOW SO WE DISALLOW THE DIRECTIVE.e)f5$: MOV T.PCB(R5),R0 ;POINT TO TASK PCBN2g TST @P.ATT(R0) ;ARE THERE OTHER TASKS ATTACHED?h BEQ 7$ ;IF EQ NO*i DRSTS D.RS17 ;OTHER TASKS ARE ATTACHEDjCk; CALCULATE POTENTIAL NEW SIZE OF TASK REGION BASED ON P.SWSZ ANDSCl; THE INCREMENT IN THE DPB, DEFAULTING TO T.MXSZ IF THE INCREMENTRm; WAS NOT SPECIFIED.n;o7$: MOV T.MXSZ(R5),R1 ;ASSUME RETURNING TO INSTALLED SIZET,p MOV (R3),R3 ;PICK UP SPECIFIED INCREMENT,q BEQ 10$ ;IF EQ DEFAULT TO INSTALLED SIZE(r ADD P.SWSZ(R0),R3 ;CALCULATE NEW SIZEs MOV R3,R1 ;COPY NEW SIZEt?u; VERIFY THAT THE NEW SIZE IS LEGAL BY CHECKING FOR EXCEEDINGO@v; $MXEXT AND IF TASK HAS ALLOCATED CHECKPOINT SPACE IS THE NEWw; SIZE TOO BIG. x/y10$: CMP R1,P.SWSZ(R0) ;TASK INCREASING SIZE?Nz BLO 30$ ;IF LOS NO2{ CMP R1,$MXEXT ;INCREASING PAST CURRENT MAXIMUM?| BHI 45$ ;IF HI YES6} BIT #PS.CHK!PS.FXD,P.STAT(R0) ;TASK CHECKPOINTABLE?~ BEQ 20$ ;IF EQ YES, DRSTS D.RS10 ;TASK IS NOT CHECKPOINTABLE?€20$: BIT #T3.CAL,2(R2) ;TASK HAVE CHECKPOINT SPACE ALLOCATED?P� BEQ 30$ ;IF EQ NOI=‚ CMP R1,T.MXSZ(R5) ;EXTENDING TO LARGER THAN INSTALLED SIZEMƒ BLOS 30$ ;IF LOS NOC„ DRSTS D.RS18 ;YES, ILLEGAL…>†; CALCULATE NEW SIZE FROM VIRTUAL ZERO AND VALIDATE THAT THE#‡; HEADER STILL FITS IN THE REGIONPˆ ‰30$: ;AŠ‹ .IF DF P$$LASŒ*� MOV R1,-(SP) ;SAVE NEW TASK REGION SIZE2Ž SUB T.OFF(R5),R1 ;NORMALIZE TO TASK REGION ZERO�� .ENDC ; DF P$$LAS‘0’ MOV R1,-(SP) ;COPY NEW SIZE FROM VIRTUAL ZERO$“ SWAB (SP) ;CONVERT SIZE TO BYTES” RORB (SP) ;I• ROR (SP) ;– ROR (SP) ;—˜™ .IF DF P$$LASš*› CMP R1,#200 ;NEW SIZE GREATER THAN 4K?œ BHI 35$ ;IF HI YES�ž .ENDCŸ:  CMP (SP),H.HDLN(R4) ;NEW TASK SIZE SMALLER THAN HEADER?¡ BLO 45$ ;IF LO YES¢D£; CHECK THROUGH THE WINDOWS FOR ONE WHICH OVERLAPS THE NEW SIZE OF(¤; THE TASK WINDOW 0 (OR 1 IF I/D TASK)¥9¦35$: MOV H.WND(R4),R4 ;POINT TO NUMBER OF WINDOW BLOCKSM0§ MOV (R4)+,R2 ;PICK UP NUMBER OF WINDOW BLOCKS0¨ TST (R4)+ ;POINT TO TASK LOW VIRTUAL ADDRESS©ª .IF DF U$$DAS«8¬ BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH SEPARATE I/D ?­ BEQ 36$ ;IF EQ NO3® ADD #W.BLGH,R4 ;YES, POINT TO WINDOW 1 - D SPACE,¯ DEC R2 ;ADJUST WINDOW COUNT °36$: ;±² .ENDC ; DF U$$DAS³´µ .IF DF P$$LAS¶7· BIT #T3.ROV,T.ST3(R5) ;TASK HAVE RESIDENT OVERLAYS ?N/¸ BNE 42$ ;IF NE YES, KEEP WINDOW ZERO INTACT)¹º .ENDC ; DF P$$LAS»1¼ MOV (R4),R3 ;PICK UP TASK LOW VIRTUAL ADDRESS !½ ASL R3 ;CONVERT TO 32W BLOCKSK ¾ ROL R3 ; ¿ ROLB R3 ;. À SWAB R3 ;6Á ADD R1,R3 ;CALC HIGH VIRTUAL ADDRESS IN 32W BLOCKS CMP R3,#2000 ;LEGAL SIZE?à BHIS 45$ ;IF HIS NON7Ä37$: ADD (R4),(SP) ;CALCULATE NEW TOP VIRTUAL ADDRESS )Å40$: DEC R2 ;MORE WINDOW BLOCKS TO GO?Æ BLE 50$ ;IF LE NO7Ç ADD #W.BLGH,R4 ;POINT TO LOW VIRTUAL ADDRESS OF NEXT -È TST W.BSIZ-W.BLVR(R4) ;ESTABLISHED WINDOW?TÉ BEQ 40$ ;IF EQ NO ÊËÌ .IF DF U$$DASÍ>Î BIT #T4.DSP,T.ST4(R5) ;00Œ"{{töt÷tø tþfDATATASK BUILT WITH SEPARATE I/D SPACE ?Ï BEQ 41$ ;IF EQ NOR7Ð BITB #20,W.BFPD-W.BLVR(R4) ;IS THIS D SPACE WINDOW ?U"Ñ BEQ 40$ ;IF EQ NO, DON'T CHECKÒ41$: ;REFERENCE LABELÓ .ENDC ; DF U$$DASÔÕÖ .IF DF P$$LAS×CØ CMP W.BPCB-W.BLVR(R4),R0 ;WINDOW MAPPED TO TASK REGION? (W.BPCB)Ù BEQ 42$ ;IF EQ YESÚÛ .IF DF S$$LIBÜ-Ý TSTB W.BFPD-W.BLVR(R4) ;SUPERVISOR WINDOW?LÞ BPL 40$ ;IF PL YESßà .ENDC ; DF S$$LIBá%â BR 44$ ;CHECK FOR ADDRESS OVERLAP4:ã42$: MOV 2(R4),R3 ;PICK UP HIGH VIRTUAL ADDRESS (W.BHVR),ä SUB (R4),R3 ;CALCULATE LENGTH OF MAP - 1#å INC R3 ;CALCULATE LENGTH OF MAP4)æ ASH #-6,R3 ;CONVERT TO 32 WORD BLOCKSRç BIC #176000,R3 ;;<è ADD W.BOFF-W.BLVR(R4),R3 ;CALCULATE LAST 32W BLOCK MAPPED5é CMP 2(SP),R3 ;REDUCING SIZE CONFLICT WITH WINDOW ?Qê BLO 90$ ;IF LO YES9ë44$: BIT #T3.ROV,T.ST3(R5) ;IS TASK RESIDENT OVERLAID ?I4ì BNE 40$ ;IF NE YES, UNCHANGED VIRTUAL ADDRESSINGíî .ENDCïð*ñ CMP (SP),(R4) ;VIRTUAL ADDRESS OVERLAP?ò BLOS 40$ ;IF LOS NODó45$: BR 90$ ;ILLEGAL SIZEô50$: TST (SP)+ ;CLEAN STACKõ8ö; CHECK TO SEE IF TASK REGION CAN BE EXTENDED IN PLACE÷øù .IF DF P$$LASú-û MOV (SP)+,R1 ;RESTORE NEW TASK REGION SIZEAüý .ENDC ; DF P$$LASþ1ÿ MOV P.MAIN(R0),R2 ;POINT TO MAIN PARTITION PCB2 CMP R1,P.SIZE(R2) ;MAIN PARTITION LARGE ENOUGH? BHI 90$ ;IF HI NOL6 MOV R1,P.SWSZ(R0) ;SET SWAP SIZE FOR TASK PARTITION. CLR R4 ;INITIALIZE END OF HOLE CALCULATION8 MOV P.SUB(R0),R3 ;POINT TO NEXT SUBPAR AFTER TASK PAR BNE 60$ ;IF NE THERE IS ONE(+ MOV R2,R3 ;ELSE POINT TO MAIN PARTITIONA+ ADD P.SIZE(R3),R4 ;CALCULATE END OF HOLE60$: ADD P.REL(R3),R4 ;(3  MOV P.REL(R0),R3 ;CALCULATE END OF DESIRED SPACE;  ADD R1,R3 ;)  CMP R3,R4 ;WILL EXTEND WORK IN PLACE?   BLOS 70$ ;IF LOS YES F; TASK REGION COULD NOT BE EXTENDED IN PLACE - ATTEMPT TO CHECKPOINT0; SO THAT WE CAN BRING TASK IN AT ITS NEW SIZE# CALL $SETRT ;FORCE RESCHEDULINGP& MOV T.PCB(R5),R1 ;POINT TO TASK PCB .IF DF A$$CNT< BIS #BF.XTK,$ACNFE ;SET FLAG SO CHECKPOINT IS NOT COUNTED .ENDC ;A$$CNT( CALL $ICHKP ;INITIATE THE CHECKPOINT, MOV T.PCB(R5),R0 ;POINT TO TASK PCB AGAIN8 BIT #PS.CKP,P.STAT(R0) ;WAS THE CHECKPOINT INITIATED? BEQ 65$ ;IF EQ NO  3! TALLY$ B.CKEX,XA$$CP ;COUNT AN EXTEND CHECKPOINTN"# .IF DF U$$DAS!S$$LIBT$,% TST (SP)+ ;CLEAN MAPPING WORDS OFF STACK&' .ENDC ; DF U$$DAS!S$$LIBH( ) RETURN ;P**+; DIRECTIVE RETURN FOR INVALID INCREMENT,-1.90$: DRSTS D.RS84 ;INVALID INCREMENT SPECIFIEDS$/ ;(PLACED HERE TO KEEP BRANCHES 0 ;ALIVE)I12@3; ATTEMPTING TO CHECKPOINT TASK REGION FAILED. RESET SWAP SIZE4; AND RETURN DIRECTIVE STATUSS51665$: MOV P.SIZE(R0),P.SWSZ(R0) ;RESET SWAP SIZE67 DRSTS D.RS1 ;POOL OR CHECKPOINT FILE ALLOC FAILURE8A9; IF THE TASK REGION IS DECREASING IN SIZE, CALL $NXTSK ON EXITSC:; FROM THIS DIRECTIVE TO INSURE REALLOCATION OF NEWLY FREED SPACEI;/<70$: CMP R1,P.SIZE(R0) ;DECREASING TASK SIZE?D= BHIS 71$ ;IF HIS NOR>? .IF DF U$$DAS!S$$LIBC@%A MOV (SP),-(SP) ;COPY MAPPING MASKS0B MOV #$NXTSK,2(SP) ;INSURE THAT PARTITION WILLC ;BE REALLOCATEDDE .IFF ; DF U$$DAS!S$$LIBF:G MOV #$NXTSK,-(SP) ;INSURE PARTITION WILL BE REALLOCATEDHI .ENDC ; DF U$$DAS!S$$LIBAJKLAM; IF THE TASK HAS I/O IN PROGRESS TO OTHER THAN THE TASK REGIONE=N; SET THE MAPPING CHANGE BIT. THIS COMPENSATES FOR POSSIBLER#O; UNMAPPING OF I/O STATUS BLOCKS.RP:Q TSTB T.IOC(R5) ;DOES TASK HAVE I/O? (MUST BE IN COMMON)R BEQ 71$ ;IF EQ NO7S BIS #T3.MPC,T.ST3(R5) ;SET MAPPING BIT DUE TO SHRINKST71$:U;+V; ** W A R N I N G **BW;LX; SPM HOOKPOINT NUMBER 10.Y;$+Z; DO NOT CHANGE THE INSTRUCTION FOLLOWINGI[; LABEL WITHOUT CHECKING SPM\;-]-^$SPH10==. ;SPM CHANGES THE INSTRUCTION AT !_ ;THE LOCATION OF THIS LABELA`*a MOV R1,P.SIZE(R0) ;EXTEND TASK IN PLACEbcCd; IF THE00Œ*{Þzt´cÚµcÛ¶c�·c›’ TASK WAS BUILT WITH RESIDENT OVERLAYS, WE DO NOT ATTEMPT 5e; TO CHANGE THE MAPPING OF ANY OF THE TASKS WINDOWSBfg .IF DF P$$LASh6i BIT #T3.ROV,T.ST3(R5) ;TASK HAVE RESIDENT OVERLAYS?-j BNE 80$ ;IF NE YES, DO NOT CHANGE MAPPINGPkl .ENDCmn=o; SET UP TO UNMAP CURRENT TASK WINDOW (0, OR 1 IF I/D TASK) p$q MOV $SAHPT,R1 ;GET HEADER ADDRESS5r MOV H.WND(R1),R1 ;POINT TO NUMBER OF WINDOW BLOCKSOst .IF DF U$$DASu3v BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH I/D SPACEFw BEQ 73$ ;IF EQ NOH1x ADD #W.BLGH,R1 ;YES, POINT TO WINDOW 1 INSTEADGyz .ENDC ; DF U$$DAS{6|73$: MOVB W.BFPD+2(R1),R3 ;PICK UP FIRST PDR ADDRESS}9~; LOOP TO UNMAP CURRENT CONTEXT OF TASK WINDOW (0 OR 1) !€74$: CLR (R3)+ ;UNMAP NEXT PDR�‚ƒ .IF DF U$$DAS„(… CMP #UDSDR0+2,R3 ;DATA SPACE WINDOW ?† BLOS 7405$ ;IF LOS YES8‡ BITB $BTMSK-UINDR0-2(R3),1(SP) ;USER D SPACE MAPPED ?ˆ BNE 741$ ;IF NE NO.‰ CLR UDSDR0-UINDR0-2(R3) ;UNMAP USER D SPACEŠ‹ .ENDCŒ� .IF DF S$$LIBŽ:� BITB $BTMSK-2-UINDR0-2(R3),(SP) ;SUPER D SPACE MAPPED ?� BNE 741$ ;IF NE NO2‘ CLR SDSDR0-UINDR0-2(R3) ;UNMAP SUPER DATA SPACE’“ .ENDC”•– .IF DF U$$DAS—%˜ BR 741$ ;SKIP D SPACE WINDOW CODE(C™7405$: BICB $BTMSK-UDSDR0-2(R3),1(SP) ;INDICATE USER D NOT MAPPED2:š BITB $BTMSK-2-UDSDR0-2(R3),(SP) ;SUPER D SPACE MAPPED ?› BNE 741$ ;IF NE NO2œ CLR SDSDR0-UDSDR0-2(R3) ;UNMAP SUPER DATA SPACE�ž .ENDC ; DF U$$DASŸ 5¡741$: DECB W.BNPD+2(R1) ;ANY MORE APRS TO PROCESS ?¢ BNE 74$ ;IF NE YES£?¤; SETUP NEW WINDOW AND PREPARE TO REMAP APRS INTO NEW CONTEXTR>¥; IF THIS IS A USER I/D SYSTEM, WE MUST RE-ESTABLISH POINTER8¦; TO WINDOW 0 SINCE $MAPTK WILL RE-ADJUST THE POINTER.§¨ .IF DF U$$DAS©/ª MOV $SAHPT,R1 ;GET ADDRESS OF CURRENT HEADERB5« MOV H.WND(R1),R1 ;POINT TO NUMBER OF WINDOW BLOCKS¬­ .ENDC ; DF U$$DAS®(¯ CALL $MAPTK ;MAP TASK ADDRESS WINDOW/° MOV P.REL(R0),R3 ;CALCULATE FIRST APR OFFSETB±²³ .IF DF P$$LAS´µ ADD W.BOFF-W.BLPD(R1),R3 ;E¶· .ENDC¸¹'º MOV (R1),R2 ;PICK UP LAST PDR IMAGEE)» MOVB -(R1),R4 ;PICK UP NUMBER OF PDR'SM+¼ MOVB -(R1),R1 ;PICK UP FIRST PDR ADDRESS ½3¾; LOOP TO SET UP APRS FOR NEW TASK WINDOW CONTEXT ¿.À75$: MOV R3,UINAR0-UINDR0(R1) ;LOAD NEXT PAR%Á MOVB R2,(R1)+ ;SET ACCESS NEXT PDR % MOVB #177,(R1)+ ;SET SIZE NEXT PDR;ÃÄ .IF DF U$$DASÅ(Æ CMP #UDSDR0+2,R1 ;DATA SPACE WINDOW ?Ç BLOS 755$ ;IF LOS YESA8È BITB $BTMSK-UINDR0-2(R1),1(SP) ;USER D SPACE MAPPED ?É BNE 76$ ;IF NE NO..Ê MOV R3,UDSAR0-UINDR0-2(R1) ;LOAD USER D PAR2Ë MOV -2(R1),UDSDR0-UINDR0-2(R1) ;LOAD USER D PDRÌÍ .ENDC ; DF U$$DASÎÏ .IF DF S$$LIBÐ4Ñ BITB $BTMSK-2-UINDR0-2(R1),(SP) ;SUPER D MAPPED ?Ò BNE 76$ ;IF NE NOU/Ó MOV R3,SDSAR0-UINDR0-2(R1) ;LOAD SUPER D PARC3Ô MOV -2(R1),SDSDR0-UINDR0-2(R1) ;LOAD SUPER D PDR;ÕÖ× .IF DF U$$DASØ$Ù BR 76$ ;SKIP D SPACE WINDOW CODE?Ú755$: BISB $BTMSK-UDSDR0-2(R1),1(SP) ;INDICATE D SPACE MAPPEDU:Û BITB $BTMSK-2-UDSDR0-2(R1),(SP) ;SUPER D SPACE MAPPED ?Ü BNE 76$ ;IF NE NOS/Ý MOV R3,SDSAR0-UDSDR0-2(R1) ;LOAD SUPER D PAR 3Þ MOV -2(R1),SDSDR0-UDSDR0-2(R1) ;LOAD SUPER D PDR$ßà .ENDC ; DF U$$DASáâãä .IFTF ; DF S$$LIBå%æ76$: ADD #200,R3 ;ADVANCE APR BASE0ç DEC R4 ;MORE TO GO? è BNE 75$ ;IF NE YESé MOV R2,-(R1) ;SET LAST PDR êëì .IF DF U$$DASí#î BIT #20,R1 ;DATA SPACE WINDOW ? ï BNE 78$ ;IF NE YES0ð BITB $BTMSK-UINDR0(R1),1(SP) ;USER D MAPPED ?ñ BNE 80$ ;IF NE NO(0ò MOV R2,UDSDR0-UINDR0(R1) ;SET LAST USER D PDRóô .ENDC ; DF U$$DASõö .IFT ; DF S$$LIB ÷2ø BITB $BTMSK-2-UINDR0(R1),(SP) ;SUPER D MAPPED ?ù BNE 80$ ;IF NE NO$1ú MOV R2,SDSDR0-UINDR0(R1) ;SET LAST SUPER D PDRAûü .ENDCýþÿ .IF DF U$$DAS' BR 80$ ;SKIP DATA SPACE WINDOW CODEM=78$: BITB $BTMSK-2-UDSDR0(R1),(SP) ;SUPER DATA SPACE MAPPEDT BNE 80$ ;IF NE NON1 MOV R2,SDSDR0-UDSDR0(R1) ;SET LAST SUPER D PDRR .ENDC00Œ2{�3{töt÷tø tþfDATA ; DF U$$DAS) ; CLEANUP STACK AND EXIT FROM DIRECTIVE(   80$: ;REFERENCE LABEL  .IF DF U$$DAS& MOV $SAHPT,R1 ;POINT TO TASK HEADER6 MOV (SP)+,H.SMAP(R1) ;RESTORE D SPACE MAP IN HEADER .IFF ; DF U$$DAS1 .IF DF S$$LIB( TST (SP)+ ;CLEAN MAP BYTES OFF STACK .ENDC ; DF S$$LIB .ENDC ; DF U$$DAS  RETURN ;(  .ENDC!"# .END BNE 80$ ;IF NE NON1 MOV R2,SDSDR0-UDSDR0(R1) ;SET LAST SUPER D PDRR .ENDC .TITLE VTDRVF .IDENT /04.00/ F; ; COPYRIGHT (c) 1983, 1985 BY(; DIGITAL EQUIPMENT CORPORATION, MAYNARD'; MASSACHUSETTS. ALL RIGHTS RESERVED..;CA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDPA; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSEEA; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS A; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORVA; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO ANDS1; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERED. ; A; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTAA; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;SA; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFM<; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.;R;T; MODIFIED FOR VERSION 2 BY:;A; D. R. DONCHIN ;R; MODIFIED FOR VERSION 2.1 BY:;E; D. R. DONCHIN 11-MAR-83Y;H$; DD167 -- FIX PROBLEMS WITH IO.RPR; $; Modified for RSX-11M-PLUS V3.0 by:; ; J. C. Franzini 12-May-85 04.00&; JCF255 -- validate size of transfer;E;S; VIRTUAL TERMINAL DRIVER.;M;+E; THE VIRTUAL TERMINAL DRIVER IS PRIMARILY INTENDED FOR A PARENT TASKSC; TO SIMULATE TERMINAL I/O FOR AN OFFSPRING TASK ACTIVATED WITH THENF; SPAWN DIRECTIVE. THIS SIMULATION TAKES PLACE VIA A VIRTUAL TERMINALA; UNIT WHOSE UNIQUE DATA STRUCTURES (DCB AND UCB) ARE DYNAMICALLY.E; CREATED WITH THE CREATE VIRTUAL TERMINAL DIRECTIVE. ONE COMMON SCB ); IS USED FOR ALL VIRTUAL TERMINAL UNITS..; G; THE VIRTUAL TERMINAL DRIVER EMPLOYS THE UC.QUE BIT TO RECEIVE ALL I/OSC; PACKETS DIRECTLY FROM THE QUEUE I/O DIRECTIVE AS THE REQUESTS ARESE; QUEUED. OFFSPRING READ AND WRITE REQUESTS ARE QUEUED TO THE COMMONAD; SCB AND DEQUEUED ONE BY ONE, BASED ON ATTACHMENT OF THE DEVICE ANDA; THE PRESENCE OF OTHER REQUESTS. EACH TIME AN OFFSPRING READ ORRD; WRITE IS DEQUEUED, THE PARENT TASK RECEIVES AN AST AT ITS INPUT ORD; OUTPUT AST ENTRY POINT. THE PARENT TASK IS THEN EXPECTED TO ISSUEB; A COMPLEMENTARY WRITE OR READ REQUEST TO SIMULATE A TERMINAL I/O ; TRANSFER.V;LD; ONLY OFFSPRING TASKS MAY ATTACH THE VIRTUAL TERMINAL UNIT. PARENTD; REQUESTS ARE ALWAYS SERVICED IN SPITE OF ATTACHMENT OF THE VIRTUAL; TERMINAL UNIT.;EF; INTERMEDIATE BUFFERING OF OFFSPRING I/O REQUESTS AND STOPPING OF THEE; OFFSPRING TASK IS PERFORMED WHEN POSSIBLE (OFFSPRING TASK IS CHECK-EA; POINTABLE AND CAN CURRENTLY DEQUEUE AN AST). WHEN INTERMEDIATETC; BUFFERING IS NOT PERFORMED, DATA TRANSFERS OCCUR DIRECTLY BETWEENR; OFFSPRING AND PARENT BUFFERS.T; @; SUCCESSFUL COMPLETION OF PARENT I/O REQUESTS RESULTS IN IS.SUCE; RETURNED IN THE FIRST WORD OF THE I/O STATUS BLOCK AND THE COUNT OFPG; BYTES ACTUALLY TRANSFERRED IN THE SECOND WORD. THE FIRST WORD OF THEFC; OFFSPRING STATUS IS PASSED IN THE CORRESPONDING PARENT REQUEST INKD; THE THIRD PARAMETER WORD OF THE DPB. THE SECOND WORD IS THE COUNTB; OF BYTES ACTUALLY TRANSFERRED. IN BOTH CASES THE COUNT OF BYTESF; ACTUALLY TRANSFERRED IS EQUAL TO THE SMALLER OF THE COUNTS SPECIFIED%; IN THE PARENT OR OFFSPRING REQUEST.L;-;F; LOCAL MACRO DEFINITIONSS;  S6 .MCALL DCBDF$, PKTDF$, SCBDF$, TCBDF$, UCBDF$, TTSYM$. DCBDF$ ;DEFINE DEVICE CONTROL BLOCK SYMBOLS2 PKTDF$ ;DEFINE I/O PACKET AND AST BLOCK SYMBOLS. SCBDF$ ;DEFINE STATUS CONTROL BLOCK SYMBOLS, TCBDF$ ;DEFINE TASK CONTROL BLOCK SYMBOLS3 UCBDF$ ,,TTDEF ;DEFINE UNIT CONTROL BLOCK SYMBOLST, TTSYM$ ;DEFINE TERMINAL DEPENDENT SYMBOLS00�:{Þzt´cÚµcÛ¶c�·c›’;S,; DEFINE THE TERMINAL FUNCTION SUPPORT WORDS;O(TSP1 = F1.BUF ! F1.RPR ! F1.UTB ! F1.VBFTSP2 = F2.SCH ! F2.GCH ;A; DRIVER DISPATCH TABLE; C* .WORD VTDEA ;BUFFER DEALLOCATION ROUTINE DDT$ VT,,NONE,,,NEW ;I ; TERMINAL CHARACTERISTICS TABLE;DMCTAB:* .BYTE TC.TTP, 377, U.CW3+1 ;TERMINAL TYPE= .BYTE TC.SCP, U2.CRT/400, U.CW2+1 ;TERMINAL IS A SCOPE (CRT)B< .BYTE TC.SMR, U2.LWC, U.CW2 ;UPPER-CASE CONVERSION DISABLED. .BYTE TC.FDX, U3.FDX, U.CW3 ;FULL DUPLEX MODE .BYTE 0 ;TERMINATOR .EVEN;+8; **-VTINI-VIRTUAL TERMINAL DRIVER INITIATOR ENTRY POINT;VB; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE EACH TIME AD; PARENT OR OFFSPRING REQUEST IS ISSUED (UC.QUE IS SET). PARENT I/OC; REQUESTS ARE ALWAYS SERVICED IMMEDIATELY, NORMALLY RESULTING IN ATF; $BLXIO TRANSFER OF DATA AND THE COMPLETION OF THE PARENT REQUEST ANDH; THE CORRESPONDING OFFSPRING REQUEST. OFFSPRING REQUESTS ARE INITIALLYB; QUEUED AND THEN DEQUEUED ONE AT A TIME WHEN POSSIBLE. AN AST ISD; DECLARED IN THE PARENT TASK WHENEVER AN OFFSPRING READ OR WRITE IS ; DEQUEUED.I; ; INPUTS:R;I; R1 = ADDRESS OF I/O PACKET; R4 = ADDRESS OF SCBA; R5 = ADDRESS OF UCB ;U-; VIRTUAL TERMINAL I/O REQUEST PACKET FORMAT:E;S"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK.O@; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.(; WD. 04 -- VIRTUAL TERMINAL UCB ADDRESSB; WD. 05 -- I/O FUNCTION CODE (IO.ATT, IO.DET, IO.RLB, OR IO.WLB).0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.=; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000).I3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. *; WD. 12 -- RELOCATION BIAS OF I/O BUFFER.B; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER (DISPLACEMENT +140000).(; WD. 14 -- CHARACTER COUNT OF TRANSFER.;; WD. 15 -- VFC BYTE (OFFSPRING)/OFFSPRING STATUS (PARENT).U; WD. 16 -- UNUSED.-0; WD. 17 -- STORES ALLOCATED BUFFER (OFFSPRING).9; WD. 20 -- STORES AST CONTROL BLOCK ADDRESS (OFFSPRING). 7; WD. 21 -- STORES PCB OF OFFSPRING BUFFER (OFFSPRING).-;-;T3; VALIDATE PARENT I/O REQUEST AND PERFORM TRANSFER.1;  T .ENABL LSBF=VTINI: CLR I.PRM+16(R1) ;CLEAR PCB PTR (TASK IS STOPPED FLAG)E+ MOVB I.FCN+1(R1),R2 ;PICK UP FUNCTION CODER MOV R1,R3 ;COPY PACKET ADDRESS. CMP I.TCB(R1),U.PTCB(R5) ;PARENT I/O REQUEST? BNE 40$ ;IF NE NOF/ CLR I.PRM+12(R1) ;CLEAR ALLOCATED BUFFER FIELD ) MOV R1,-(SP) ;SAVE PARENT PACKET ADDRESSG2 CLR -(SP) ;INIT SECOND WORD OF I/O STATUS RETURN3 ADD #I.PRM+6,R1 ;POINT TO DESIRED OFFSPRING STATUSR- CMPB R2,#IO.RLB/256. ;READ OR WRITE LOGICAL?E BLOS 30$ ;IF LOS YES;10$: CALL VTCHR ;PROCESS SF.GMC/SF.SMC/IO.GTS IF SPECIFIEDB4 BNE 115$ ;IF NE, ILLEGAL FUNCTION ISSUED BY PARENT+ BIT #1,-6(R1) ;RETURN STATUS TO OFFSPRING?T BNE 20$ ;IF NE YES;P4; PROCESS A PARENT ENABLE/DISABLE BUFFERING REQUEST.;I1 BIS #U3.DBF,U.CW3(R5) ;ASSUME BUFFERING DISABLED(" BIT #2,-6(R1) ;DISABLE BUFFERING? BNE 100$ ;IF NE YESW9 CMP U.CW4(R5),#V$$TLM ;BUFFER SIZE GREATER THAN MAXIMUM?D2 BHI 110$ ;IF HI YES, ILLEGAL TO ENABLE BUFFERING( BIC #U3.DBF,U.CW3(R5) ;ENABLE BUFFERING" BR 100$ ;COMPLETE PARENT REQUEST;G?; PROCESS A PARENT RETURN STATUS WITHOUT DATA TRANSFER REQUEST.A;T020$: BIT #U3.FDX,U.CW3(R5) ;IN FULL DUPLEX MODE? BNE 23$ ;IF NE YES- TST U.RPKT(R5) ;IS AN OFFSPRING READ ACTIVE?E BNE 25$ ;IF NE YES- BR 27$ ;HOPE FOR AN OFFSPRING WRITE REQUESTT423$: BIT #2,-6(R1) ;RETURN STATUS TO OFFSPRING READ? BNE 27$ ;IF NE NOT=25$: MOV U.RPKT(R5),R3 ;CORRESPONDING OFFSPRING READ REQUEST?I BEQ 116$ ;IF EQ NO, ERRORB# MOV -(R1),R0 ;GET SPECIFIED STATUSG MOV -(R1),R1 ;L BR 90$ ;COMPLETE BOTH PACKETSS>27$: MOV U.WPKT(R5),R3 ;CORRESPONDING OFFSPRING WRITE REQUEST?& BEQ 116$ ;IF EQ NO, ILLEGAL FUNCTION/ MOV -(R1),R0 ;PICK UP DESIRED OFFSPRING STATUSI MOV -(R1),R1 ;A BR 90$ ;COMPLETE BOTH PACKETS-30$: BNE 45$ ;IF NE REQUEST I00�B{3{töt÷tø tþfDATAS WRITE LOGICAL;B ; PROCESS A PARENT READ REQUEST.;I: MOV U.WPKT(R5),R3 ;GET OFFSPRING WRITE I/O PACKET ADDRESS& BEQ 116$ ;IF EQ THERE IS NONE, ERROR" MOV R3,-(SP) ;SAVE PACKET ADDRESS) ADD #I.PRM+6,R3 ;POINT PAST LENGTH FIELD+ MOV (R1),-(SP) ;SAVE OFFSPRING STATUS WORDW' MOV R3,R2 ;REVERSE PACKETS FOR $BLXIO MOV R1,R3 ;1 MOV R2,R1 ; BR 50$ ;40$: BR 120$ ;BRANCH AIDP;R!; PROCESS A PARENT WRITE REQUEST. ;=45$: MOV U.RPKT(R5),R3 ;GET OFFSPRING READ I/O PACKET ADDRESS & BEQ 116$ ;IF EQ THERE IS NONE, ERROR" MOV R3,-(SP) ;SAVE PACKET ADDRESS) ADD #I.PRM+6,R3 ;POINT PAST LENGTH FIELDS+ MOV (R1),-(SP) ;SAVE OFFSPRING STATUS WORDV;(J; MAKE THE TRANSFER LENGTH THE LESSOR OF THE PARENT AND OFFSPRING LENGTHS.;,.50$: MOV -(R3),R0 ;PICK UP SIZE OF ONE REQUEST/ CMP R0,-(R1) ;IS IT LARGER THAN OTHER REQUEST?R BLOS 60$ ;IF LOS NO0, MOV (R1),R0 ;PICK UP SMALLEST REQUEST SIZE(60$: MOV R0,4(SP) ;SAVE SIZE OF TRANSFER;,9; COPY THE DATA FROM THE WRITE BUFFER TO THE READ BUFFER.E;H1 CLR -(SP) ;INITIALLY CLEAR BUFFER TO DEALLOCATES1 MOV 12-4(R3),R4 ;PICK UP ALLOCATED OUTPUT BUFFER( BEQ 65$ ;IF EQ THERE IS NONE! MOV R4,R3 ;SET OUTPUT APR6 BIASE- MOV #140004,R4 ;SET OUTPUT APR6 DISPLACEMENTG BR 70$ ;365$: MOV -(R3),R4 ;PICK UP OUTPUT APR6 DISPLACEMENTR' MOV -(R3),R3 ;PICK UP OUTPUT APR6 BIASR470$: MOV 12-4(R1),R2 ;PICK UP ALLOCATED INPUT BUFFER BEQ 75$ ;IF EQ THERE IS NONE' MOV R2,(SP) ;SET TO DEALLOCATE BUFFERT- CLR 12-4(R1) ;CLEAR BUFFER POINTER IN PACKETR MOV R2,R1 ;SET INPUT APR5 BIAS, MOV #120004,R2 ;SET INPUT APR5 DISPLACEMENT BR 80$ ;275$: MOV -(R1),R2 ;PICK UP INPUT APR6 DISPLACEMENT& MOV -(R1),R1 ;PICK UP INPUT APR6 BIAS, SUB #20000,R2 ;CONVERT TO APR5 DISPLACEMENT+80$: CALL $BLXIO ;TRANSFER BUFFER CONTENTS + MOV (SP)+,R0 ;PICK UP BUFFER TO DEALLOCATET BEQ 85$ ;IF EQ THERE IS NONE& CALL VTDEA ;DEALLOCATE OUTPUT BUFFER 7; ,; COMPLETE OFFSPRING AND PARENT I/O PACKETS.;O E+85$: MOV (SP)+,R0 ;PICK UP OFFSPRING STATUS 4 MOV (SP)+,R3 ;RETRIEVE OFFSPRING I/O PACKET ADDRESS( MOV (SP),R1 ;PICK UP BYTES TRANSFERRED(90$: CALL VTFIN ;COMPLETE OFFSPRING I/O/100$: MOV #IS.SUC&377,R0 ;SET PARENT I/O STATUSR BR 111$ ;#2110$: MOV #IE.BAD&377,R0 ;SET BAD PARAMETER STATUS-111$: MOV (SP)+,R1 ;PICK UP BYTES TRANSFERRED , MOV (SP)+,R3 ;PICK UP ADDRESS OF I/O PACKET$ CALL $IOFIN ;FINISH THE PARENT I/O* BR VTPKT ;BRANCH TO DEQUEUE NEXT REQUEST=115$: MOV #IE.DUN&377,R0 ;ASSUME DEVICE NOT ATTACHABLE STATUSP1 CMPB R2,#IO.DET/256. ;ATTACH OR DETACH FUNCTION?N BLOS 111$ ;IF LOS YESV? MOV #IE.IFC&377,R0 ;MUST BE IO.RPR WHICH IS ILLEGAL FOR PARENTO BR 111$ ;>116$: MOV #IE.IFC&377,R0 ;ASSUME ILLEG FUNC (NO OFFSPRING REQ)# BITB #US.BSY,U.STS(R5) ;UNIT BUSY?A BEQ 111$ ;IF EQ NO2 MOV #IE.ABO&377,R0 ;OFFSPRING REQUEST WAS ABORTED$ BICB #US.BSY,U.STS(R5) ;UNBUSY UNIT BR 111$ ;N ; 7; BEGIN OFFSPRING PACKET PROCESSING BY QUEUEING PACKET.1;  1120$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTIONP+ CALL VTCHR ;SET CHARACTERISTICS FUNCTION?C, BEQ 160$ ;IF EQ YES, ILLEGAL FOR OFFSPRING8 CMPB #IO.RPR/256.,I.FCN+1(R3) ;IS IT AN IO.RPR REQUEST?2 BNE 125$ ;IF NE NO, ONLY ONE BUFFER TO DEAL WITH; L; AN IO.RPR REQUEST REQUIRES TWO BUFFERS. THE EXECUTIVE ONLY ADDRESS CHECKSM; AND INCREMENTS THE PARTITION I/O COUNT FOR THE FIRST ONE (THE READ BUFFER).SK; NOW WE PERFORM THOSE FUNCTIONS FOR THE SECOND BUFFER (THE PROMPT BUFFER). I; SINCE THE PROMPT IS OUTPUT BEFORE THE READ IS INITIATED, THE I/O PACKET F; PARAMETERS ARE SWITCHED TO PLACE THE PROMPT BUFFER PARAMETERS FIRST.;O: MOV I.PRM+10(R3),R0 ;GET VIRTUAL ADDRESS OF PROMPT BUFFER. MOV I.PRM+12(R3),R1 ;GET PROMPT BUFFER LENGTH BEQ 155$ ;IF EQ ERRORP- CALL $CKBFR ;ADDRESS CHECK READ ONLY BUFFERO' CALL $RELOC ;RELOCATE VIRTUAL ADDRESSP0 MOV I.PRM+14(R3),I.PRM+6(R3) ;INSERT OUTPUT VFC7 MOV I.PRM+4(R3),I.PRM+14(R3) ;COPY INPUT BUFFER LENGTHU8 MOV I.PRM+12(R3),I.PRM+4(R3) ;COPY OUTPUT BUFFER LENGTH8 MOV I.PRM(R3),I.PRM+10(R3) ;COPY INPUT BUFF00�J{Þzt´cÚµcÛ¶c�·c›’ER APR6 BIAS= MOV I.PRM+2(R3),I.PRM+16(R3) ;COPY INPUT BUFFER DISPLACEMENT1 MOV R1,I.PRM(R3) ;INSERT OUTPUT BUFFER APR6 BIASP6 MOV R2,I.PRM+2(R3) ;INSERT OUTPUT BUFFER DISPLACEMENT$ MOV R3,R1 ;COPY I/O PACKET POINTER:125$: MOV U.SCB(R5),R0 ;POINT TO OFFSPRING PACKET LISTHEAD( CALL $QINSP ;INSERT PACKET BY PRIORITY (; C; PROPAGATE DRIVER BY ATTEMPTING TO DEQUEUE NEXT OFFSPRING REQUEST.L;T 4VTPKT: MOV #VTACC,R2 ;SET ACCEPTANCE ROUTINE ADDRESS6 CALL $GSPKT ;ATTEMPT TO DEQUEUE AN OFFSPRING REQUEST" BCC 131$ ;IF CC ONE WAS DEQUEUED RETURN ;U%131$: MOV R1,R3 ;COPY PACKET ADDRESSI4 MOV #IE.ABO&377,R0 ;ASSUME UNIT HAS BEEN ELIMINATED7 TST U.PTCB(R5) ;VIRTUAL TERMINAL UNIT BEEN ELIMINATED?A BEQ 160$ ;IF EQ YES 5 BIT #U3.RPR,U.CW3(R5) ;PROCESSING AN IO.RPR REQUEST?  BEQ VTCHK ;IF EQ NOB;OI; PROCESS AN OFFSPRING IO.RPR REQUEST. THE PROMPT BUFFER PARAMETERS HAVEQL; ALREADY BEEN SWITCHED WITH THE INPUT BUFFER PARAMETERS IN THE I/O PACKET. N; THE FUNCTION CODE IS NOW CHANGED TO IO.WLB SINCE THE PROMPT IS OUTPUT BEFOREN; THE READ BEGINS. WHEN THE PROMPT COMPLETES, THE PARAMETERS WILL BE SWITCHED0; BACK AND THE FUNCTION CODE CHANGED TO IO.RLB. ;U9 MOVB #IO.WLB/256.,I.FCN+1(R3) ;CHANGE FUNCTION TO IO.WLBB;3M; CHECK FOR VALID SIZE. SINCE WE ARE USING $BLXIO, THE TRANSFER CANNOT CROSS /; APR BOUNDARIES, SO THE MAXIMUM SIZE IS 4K-63.B; VTCHK:+ MOV #IE.BAD&377,R0 ;ASSUME SIZE IS TOO BIGP- CMP #20000-63.,I.PRM+4(R3) ;IS SIZE TOO BIG?  BLO 160$ ;IF LO, YES;TC; CHECK THAT THE PARENT DECLARED AN AST FOR THE REQUESTED FUNCTION.T;P9 MOV #IE.EOF&377,R0 ;END OF FILE RETURNED IF NO INPUT ASTT( MOV U.IAST(R5),R4 ;ASSUME INPUT REQUEST7 CMPB I.FCN+1(R3),#IO.RLB/256. ;IS IT AN INPUT REQUEST?L BEQ 140$ ;IF EQ YESA) BLO 135$ ;IF LO IT IS AN OUTPUT REQUESTR2 MOV U.AAST(R5),R4 ;ELSE IT IS AN ATTACH OR DETACH3 BEQ 210$ ;IF EQ PARENT DOES NOT WANT AST, SUCCESS ' BR 145$ ;ELSE BRANCH TO QUEUE THE AST,3135$: MOV U.OAST(R5),R4 ;PICK UP OUTPUT AST ADDRESSS) MOV #IS.SUC,R0 ;SUCCESS IF NO OUTPUT AST &140$: TST R4 ;DESIRED FUNCTION LEGAL? BEQ 160$ ;IF EQ NO O;IF; ALLOCATE AND FILL IN AST CONTROL BLOCK TO NOTIFY PARENT TASK THAT AN!; OFFSPRING REQUEST WAS DEQUEUED.I;N P0145$: MOV #A.PRM+6,R1 ;PICK UP SIZE OF AST BLOCK! CALL $ALOCB ;ALLOCATE AST BLOCKV' BCC 180$ ;IF CC SUCCESSFUL ALLOCATIONE1150$: MOV #IE.NOD&377,R0 ;INSUFFICIENT POOL SPACEU& BR 160$ ;COMPLETE REQUEST WITH ERROR0155$: MOV #IE.SPC&377,R0 ;ILLEGAL BUFFER ADDRESS.160$: CLR R1 ;CLEAR SECOND WORD OF I/O STATUS'170$: CALL VTFIN ;COMPLETE I/O REQUEST /175$: BR VTPKT ;BRANCH TO DEQUEUE NEXT REQUESTA5180$: MOV R0,@R3 ;SAVE POINTER TO AST BLOCK AT I.LNK TST (R0)+ ;SKIP OVER LINK WORD1 MOV R1,(R0)+ ;SET SIZE OF BLK TO RELEASE (A.CBL)F7 MOV #10.*2,(R0)+ ;SET # OF BYTES ON USER STACK (A.BYT) - MOV R4,(R0)+ ;SET PARENT AST ADDRESS (A.AST)O3 MOV #3,(R0)+ ;SET NUMBER OF AST PARAMETERS (A.NPR)T MOV (R5),R1 ;POINT TO VT: DCBI> MOVB D.UNIT(R1),(R0)+ ;SET UNIT NUMBER AS FIRST PARAM (A.PRM)= MOVB I.FCN(R3),(R0)+ ;ADD SUBFUNCTION IN HIGH BYTE (A.PRM+1)2 MOV I.PRM+4(R3),R4 ;PICK UP BYTE COUNT OF REQUEST4 MOV R4,(R0)+ ;SET BYTE COUNT AS 2ND PARAM (A.PRM+2); MOV I.PRM+6(R3),(R0) ;SET VERTICAL FORMAT AS 3RD (A.PRM+4)B7 CMPB I.FCN+1(R3),#IO.ATT/256. ;IS IT ATTACH OR DETACH? # BLO 220$ ;IF LO NO, READ OR WRITE  BNE 190$ ;IF NE IT IS DETACH0 MOV I.TCB(R3),R1 ;PICK UP OFFSPRING TCB ADDRESS8 MOV T.NAM+2(R1),(R0) ;INSERT 2ND WORD OF NAME (A.PRM+4)7 MOV T.NAM(R1),-(R0) ;INSERT 1ST WORD OF NAME (A.PRM+2)( BR 200$ ;BRANCH TO QUEUE AST,190$: CLR (R0) ;CLR AST PARAMETER (A.PRM+4)( CLR -(R0) ;CLR AST PARAMETER (A.PRM+2).200$: MOV R3,-(SP) ;SAVE ADDRESS OF I/O PACKET CALL 230$ ;QUEUE THE AST BLOCK, MOV (SP)+,R3 ;RESTORE ADDRESS OF I/O PACKET6210$: MOV #IS.SUC&377,R0 ;SET SUCCESSFUL RETURN STATUS BR 160$ ;COMPLETE REQUEST  I;E*; ATTEMPT TO BUFFER OFFSPRING I/O REQUEST.;A E4220$: CLR I.PRM+12(R3) ;CLEAR ALLOCATED BUFFER FIELDC BIT #U3.DBF!U3.RPR,U.CW3(R5) ;BUFFERI00�R{3{töt÷tø tþfDATANG DISABLED OR PROMPT OUTPUT?  BNE 230$ ;IF NE YESA5 CALL $TSTBF ;SEE IF INTERMEDIATE BUFFERING POSSIBLE-1 BCS 230$ ;IF CS I/O NOT BUFFERED (NOT CKPTABLE)S, MOV R4,R1 ;PICK UP BYTE COUNT FOR TRANSFER8 ADD #4+77,R1 ;INCLUDE LINK AND SIZE WORDS, AND ROUND UP; ASH #-6,R1 ;CONVERT TO NUMBER OF SEC POOL BLOCKS REQUIREDS2 CALL $ALSEC ;ALLOCATE BUFFER FROM SECONDARY POOL' BCC 225$ ;IF CC ALLOCATION SUCCESSFUL24 CLR I.PRM+16(R3) ;CLEAR INTERMEDIATE BUFFERING FLAG BR 230$ ;.:225$: MOV R0,I.PRM+12(R3) ;SET POINTER TO ALLOCATED BUFFER MOV R0,KISAR6 ;MAP BUFFER$ MOV #4,@#140002 ;COUNT HEADER WORDS ADD R4,@#140002 ;SET BYTE COUNT6 CMPB I.FCN+1(R3),#IO.WLB/256. ;IS IT A WRITE REQUEST? BNE 229$ ;IF NE NO" MOV R3,-(SP) ;SAVE PACKET ADDRESS- MOV I.PRM(R3),R1 ;GET PHYSICAL BUFFER OFFSET 1 MOV I.PRM+2(R3),R2 ;SET SOURCE APR6 DISPLACEMENTT, SUB #20000,R2 ;CONVERT TO APR5 DISPLACEMENT& MOV R0,R3 ;SET DESTINATION APR6 BIAS! MOV R4,R0 ;SET COUNT FOR $BLXIOL2 MOV #140004,R4 ;SET DESTINATION APR6 DISPLACEMENT/ CALL $BLXIO ;TRANSFER OFFSPRING OUTPUT BUFFERF% MOV (SP)+,R3 ;RESTORE PACKET ADDRESSS3229$: CALL $INIBF ;INITIATE INTERMEDIATE BUFFERING, .;/F; QUEUE THE PARENT AST CONTROL BLOCK. PARENT AST ROUTINES ARE ENTEREDC; WITH THE FOLLOWING THREE WORDS ON THE STACK FOR OFFSPRING READ ORI; WRITE:; ); 0(SP)=UNIT NUMBER, I/O SUBFUNCTION CODE,'; 2(SP)=BYTE COUNT OF OFFSPRING REQUEST,3; 4(SP)=VERTICAL FORMAT WORD FROM OFFSPRING QIO DPBT;RC; PARENT AST ROUTINES ARE ENTERED WITH THE FOLLOWING THREE WORDS ONB$; THE STACK FOR AN OFFSPRING ATTACH:;); 0(SP)=UNIT NUMBER, I/O SUBFUNCTION CODE$); 2(SP)=FIRST WORD OF OFFSPRING TASK NAMER*; 4(SP)=SECOND WORD OF OFFSPRING TASK NAME;OC; PARENT AST ROUTINES ARE ENTERED WITH THE FOLLOWING THREE WORDS ONS$; THE STACK FOR AN OFFSPRING DETACH:;R); 0(SP)=UNIT NUMBER, I/O SUBFUNCTION CODEI ; 2(SP)=0 ; 4(SP)=0C;T 3230$: MOV U.PTCB(R5),R0 ;PICK UP PARENT TCB ADDRESS MOV @R3,R1 ;POINT TO AST BLOCK( CALLR $QASTT ;QUEUE AST TO PARENT TASK R;WD; CANCEL I/O ENTRY POINT. ONLY OFFSPRING REQUESTS MAY BE CANCELLED,8; SINCE PARENT REQUESTS ARE ALWAYS SERVICED IMMEDIATELY.;K M:VTCAN: MOV U.RPKT(R5),R3 ;PICK UP CURRENT OFFSPRING PACKET+ BEQ 250$ ;IF EQ NO READ REQUEST IS QUEUEDT' CMP I.TCB(R3),R1 ;TCB ADDRESSES MATCH?I BNE 250$ ;IF NE NO MOV R1,-(SP) ;SAVE TCB ADDRESSD) MOV #IE.ABO&377,R0 ;SET FOR ABORT STATUSO$ CLR R1 ;ZERO SECOND WORD OF STATUS" CALL VTFIN ;COMPLETE I/O REQUEST" MOV (SP)+,R1 ;RESTORE TCB ADDRESS* TST U.PTCB(R5) ;HAS UNIT BEEN ELIMINATED?& BEQ 250$ ;IF EQ YES, LEAVE IT UNBUSY< BISB #US.BSY,U.STS(R5) ;KEEP UNIT BUSY UNTIL PARENT REQUEST8250$: MOV U.WPKT(R5),R3 ;GET ADDRESS OF OFFSPRING PACKET1260$: BEQ 175$ ;IF EQ NO WRITE REQUEST IS QUEUEDE' CMP I.TCB(R3),R1 ;TCB ADDRESSES MATCH?T BNE VTRET ;IF NE NO ) MOV #IE.ABO&377,R0 ;SET FOR ABORT STATUS#$ CLR R1 ;ZERO SECOND WORD OF STATUS" CALL VTFIN ;COMPLETE I/O REQUEST* TST U.PTCB(R5) ;HAS UNIT BEEN ELIMINATED?& BEQ 260$ ;IF EQ YES, LEAVE IT UNBUSY< BISB #US.BSY,U.STS(R5) ;KEEP UNIT BUSY UNTIL PARENT REQUEST ;UH; POWERFAIL, ONLINE/OFFLINE, AND TIMEOUT ENTRY POINTS ARE SIMPLY RETURNS;. TVTPWF: ;NO POWERFAIL ROUTINE /VTKRB: ;NO ONLINE/OFFLINE CONTROLLER ROUTINES)VTUCB: ;NO ONLINE/OFFLINE UNIT ROUTINEM VTOUT: CLC ;NO TIMEOUT ROUTINEVTRET: RETURN ;S F .DSABL LSBU ;R@; VTCHR-GET/SET CHARACTERISTICS AND GET TERMINAL SUPPORT ROUTINE;A; THIS ROUTINE IS CALLED TO PROCESS THE SF.GMC, SF.SMC AND IO.GTSLF; FUNCTIONS. IF NONE OF THOSE FUNCTIONS WERE SPECIFIED, AN INDICATIONA; IS RETURNED IN THE Z-BIT AS TO WHETHER THE FUNCTION WAS IO.STC. E; NO RETURN TO CALLER IS MADE FOR THE FUNCTIONS THIS ROUTINE HANDLES. ; ; INPUTS:I;C0; R1=I/O PACKET ADDRESS FROM OFFSPRING OR PARENT; R2=I/O FUNCTION CODE$; R5=ADDRESS OF VIRTUAL TERMINAL UCB;S ; OUTPUTS:;S7; IF FUNCTION IS IO.STC, CC-Z SET UPON RETURN TO CALLERN>; IF FUNCTION IS SF.GMC, SF.SMC OR IO.GTS, NO RETURN TO CALLER(; ELSE, CC-Z CLEAR UPON RETU00�Z{Þzt´cÚµcÛ¶c�·c›’RN TO CALLER;N2VTCHR: CMPB R2,#IO.STC/256. ;IO.STC FUNCTION CODE? BNE VTRET ;IF NE NOB' CMP I.FCN(R3),#IO.STC ;IO.STC EXACTLY?  BEQ VTRET ;IF EQ YES" TST (SP)+ ;REMOVE RETURN ADDRESS* CMP I.TCB(R3),U.PTCB(R5) ;PARENT REQUEST? BNE 10$ ;IF NE NOF CMP (SP)+,(SP)+ ;CLEAN STACKT)10$: MOV I.PRM(R3),R0 ;GET BUFFER ADDRESSU& MOV I.PRM+2(R3),R1 ;GET BUFFER LENGTH1 CALL $ACHCK ;ADDRESS CHECK BUFFER, WORD ALIGNEDT BCS 110$ ;IF CS ERRORI, CALL $RELOC ;CONVERT TO ADDRESS DOUBLEWORD MOV R1,KISAR6 ;MAP BUFFER# MOV R2,R1 ;COPY ADDRESS OF BUFFER $ MOV R2,-(SP) ;AND SAVE IT FOR LATER CMP I.FCN(R3),#IO.GTS ;IO.GTS?E BNE 20$ ;IF NE NO ;Q; PROCESS IO.GTS;M MOV #IS.SUC,R0 ;SET SUCCESS8 MOV #TSP1,(R1)+ ;STORE FIRST WORD OF SUPPORT PARAMETERS, CMP I.PRM+2(R3),#2 ;WANTS MORE THAN 1 WORD? BEQ 160$ ;IF EQ NO# MOV #TSP2,(R1)+ ;STORE SECOND WORDE BR 160$ ;DONEK#20$: CMP I.FCN(R3),#SF.SMC ;SF.SMC?T BNE 70$ ;IF NE NOR;; PROCESS SF.SMC;T930$: CALL 200$ ;GET NEXT CHARACTERISTIC FROM USER BUFFER1 MOV R2,-(SP) ;SAVE BITMASKM5 CMPB -1(R1),#TC.FDX ;TRYING TO SET FULL DUPLEX MODE?G BNE 40$ ;IF NE NO$; CMP I.TCB(R3),U.PTCB(R5) ;PARENT TASK MAKING THAT REQUEST?S2 BNE 120$ ;IF NE NO, OFFSPRING NOT ALLOWED, ERROR140$: MOVB @R1,R0 ;GET NEW VALUE FROM USER BUFFERH"50$: ASRB R2 ;SHIFT BITMASK RIGHT BCS 60$ ;CARRY - JUMPO ROLB R0 ;SHIFT NEW VALUE LEFTC BR 50$ ;LOOP60$: ROLB R2 ;PICK UP LOST BITN% COMB R2 ;INVERT RIGHT ADJUSTED MASKC# BITB R2,(R1)+ ;NEW VALUE IN RANGE?O BNE 130$ ;IF NE NO BICB (SP)+,@R4 ;CLEAR OLD VALUE BISB R0,@R4 ;SET NEW VALUE! BR 30$ ;GET NEXT CHARACTERISTIC$#70$: CMP I.FCN(R3),#SF.GMC ;SF.GMC?A BEQ 90$ ;IF EQ YES% MOV #IE.IFC&377,R0 ;ILLEGAL FUNCTION  BR 115$ ;RETURN THE ERROR,;G; PROCESS SF.GMC;R*80$: INC R1 ;POINT TO NEXT CHARACTERISTIC990$: CALL 200$ ;GET NEXT CHARACTERISTIC FROM USER BUFFER2 MOVB @R4,@R1 ;STORE CURRENT VALUE IN USER BUFFER MOVB R2,R0 ;COPY BITMASK COMB R0 ;INVERT IT$ BICB R0,@R1 ;CLEAR IRRELEVANT BITS#100$: ASRB R2 ;SHIFT BITMASK RIGHTV BCS 80$ ;CARRY - JUMPN0 RORB @R1 ;SHIFT VALUE IN USER BUFFER RIGHT TOO BR 100$ ;LOOPF;;; ERROR AND EXIT HANDLINGY;(110$: MOV #IE.SPC&377,R0 ;BUFFER PROBLEM-115$: CLR R1 ;RETURN ZERO SECOND STATUS WORDC BR 170$ ;FINISH I/OOD120$: MOV #!,R0 ;ILLEGAL CHARACTERISTIC CODE BR 140$ ;DECLARE ERROR6130$: MOV #!,R0 ;ILLEGAL VALUE-140$: DEC R1 ;BACK UP POINTER IN USER BUFFER@150$: TST (SP)+ ;CLEAN STACK$-160$: SUB (SP)+,R1 ;GET OFFSET IN USER BUFFERR$170$: CALL $IOFIN ;COMPLETE THE I/O+ JMP VTPKT ;TRY TO PROCESS ANOTHER REQUEST;;RG; ROUTINE TO RETRIEVE THE NEXT CHARACTERISTIC IN THE USER BUFFER, CHECK1B; IT FOR VALIDITY, AND RETURN THE CORRESPONDING BITMASK AND OFFSET;2%200$: MOV #IS.SUC,R0 ;ASSUME ALL DONEL$ SUB #2,I.PRM+2(R3) ;ANY MORE TO DO? BMI 150$ ;IF MI NO' MOVB (R1)+,R0 ;GET NEXT CHARACTERISTICV BEQ 120$ ;IF EQ BAD CODE5 MOV #MCTAB-2,R4 ;GET ADDRESS OF CHARACTERISTIC TABLE$>210$: CMPB (R4)+,(R4)+ ;UPDATE TO NEXT CHARACTERISTIC IN TABLE4 TSTB (R4) ;ANY MORE CHARACTERISTICS LEFT TO CHECK? BEQ 120$ ;IF EQ NO, ERRORN4 CMPB R0,(R4)+ ;FIND A MATCH BETWEEN USER AND TABLE? BNE 210$ ;IF NE NO, CLR R2 ;BE CAREFUL OF POSSIBLE SIGN EXTEND3 BISB (R4)+,R2 ;GET BITMASK FOR THIS CHARACTERISTICN2 MOVB (R4),R4 ;GET OFFSET FOR THIS CHARACTERISTIC( ADD R5,R4 ;MAKE POINTER TO BYTE IN UCB RETURN ;B;0; I/O PACKET ACCEPTANCE ROUTINE,;;4VTACC: CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ FUNCTION? BNE 10$ ;IF NE NOC* TST U.RPKT(R5) ;READ ALREADY IN PROGRESS?' BNE 50$ ;IF NE YES, CAN'T PROCESS NOW02 BIT #U3.RPR,U.CW3(R5) ;READ W/PROMPT IN PROGRESS?' BNE 50$ ;IF NE YES, CAN'T PROCESS NOW , BIT #U3.FDX,U.CW3(R5) ;IN FULL DUPLEX MODE?$ BNE 5$ ;IF NE YES, CAN PROCESS NOW: TST U.WPKT(R5) ;WRITE FUNCTION IN PROGRESS? (CLEARS CC-C)' BNE 50$ ;IF NE YES, CAN'T PROCESS NOWBB5$: MOV R1,U.RPKT(R5) ;SAVE I/O PACKET ADDRESS (LEAVES CC-C CLEAR)00�b{Žh{töt÷tø tþfDATA RETURN ;P310$: CMPB #IO.WLB/256.,I.FCN+1(R1) ;WRITE FUNCTION?  BNE 20$ ;IF NE NOK+ TST U.WPKT(R5) ;WRITE ALREADY IN PROGRESS?I' BNE 50$ ;IF NE YES, CAN'T PROCESS NOWR2 BIT #U3.RPR,U.CW3(R5) ;READ W/PROMPT IN PROGRESS?' BNE 50$ ;IF NE YES, CAN'T PROCESS NOWX, BIT #U3.FDX,U.CW3(R5) ;IN FULL DUPLEX MODE?% BNE 15$ ;IF NE YES, CAN PROCESS NOW59 TST U.RPKT(R5) ;READ FUNCTION IN PROGRESS? (CLEARS CC-C) ' BNE 50$ ;IF NE YES, CAN'T PROCESS NOWRC15$: MOV R1,U.WPKT(R5) ;SAVE I/O PACKET ADDRESS (LEAVES CC-C CLEAR)0 RETURN ;L;20$: CMPB #IO.RPR/256.,I.FCN+1(R1) ;READ W/PROMPT FUNCTION?T BNE 40$ ;IF NE NOA" TST U.RPKT(R5) ;READ IN PROGRESS? BNE 30$ ;IF NE YES, STOP SCAN#1 TST U.WPKT(R5) ;WRITE IN PROGRESS? (CLEARS CC-C)5 BNE 30$ ;IF NE YES, STOP SCANX+ MOV R1,U.WPKT(R5) ;SAVE I/O PACKET ADDRESS?6 BIS #U3.RPR,U.CW3(R5) ;SHOW READ W/PROMPT IN PROGRESS RETURN ;I830$: ADD #G$$SPA,SP ;ADD CONSTANT TO STACK TO ABORT SCAN40$: RETURN ;5)50$: SEC ;CAN'T PROCESS THE REQUEST NOWS RETURN ;C;E*; INTERMEDIATE BUFFER DEALLOCATION ROUTINE;N R VTDEA: MOV R0,KISAR6 ;MAP BUFFER MOV @#140002,R1 ;GET BYTE COUNT/ ADD #77,R1 ;ROUND UP TO NEXT 32 WORD BOUNDARYA8 ASH #-6,R1 ;CONVERT TO NUMBER OF SECONDARY POOL BLOCKS= CALLR $DESEC ;DEALLOCATE INTERMEDIATE SECONDARY POOL BUFFERC ;R+; VTFIN-FINISH VIRTUAL TERMINAL I/O REQUESTM;IH; THIS ROUTINE IS CALLED TO FINISH ALL OFFSPRING REQUESTS TO THE VIRTUALH; TERMINAL DRIVER (EXCEPT SF.GMC/SF.SMC/IO.GTS) AND PERFORM ANY CLEANUP.;R ; INPUTS:;N; R0=FIRST WORD OF I/O STATUSR; R1=SECOND WORD OF I/O STATUS); R3=ADDRESS OF I/O PACKET TO BE FINISHEDE$; R5=ADDRESS OF VIRTUAL TERMINAL UCB; ; OUTPUTS:;; NONE.R;; V*VTFIN: CMP R3,U.WPKT(R5) ;OFFSPRING WRITE? BNE 5$ ;IF NE NO& CLR U.WPKT(R5) ;SHOW NO WRITES ACTIVE) BIT #U3.RPR,U.CW3(R5) ;READ WITH PROMPT?  BEQ 7$ ;IF EQ NO7 MOV I.PRM+10(R3),I.PRM(R3) ;SET INPUT BUFFER APR6 BIASE< MOV I.PRM+16(R3),I.PRM+2(R3) ;SET INPUT BUFFER DISPLACEMENT6 MOV I.PRM+14(R3),I.PRM+4(R3) ;SET INPUT BUFFER LENGTH* CLR I.PRM+16(R3) ;CLEAR BUFFERED I/O FLAG9 MOVB #IO.RLB/256.,I.FCN+1(R3) ;CHANGE FUNCTION TO IO.RLBE0 MOV R3,U.RPKT(R5) ;CHANGE IO.RPR INTO AN IO.RLB; BIC #U3.RPR,U.CW3(R5) ;FORGET WE WERE PROCESSING AN IO.RPRB% TSTB R0 ;ANY ERROR DETECTED SO FAR? BMI 6$ ;IF MI YES, END IT HERE; JMP VTCHK ;JUMP BACK TO HANDLE THE READ PORTION OF IO.RPR(&5$: CMP R3,U.RPKT(R5) ;OFFSPRING READ? BNE 10$ ;IF NE NO,(6$: CLR U.RPKT(R5) ;SHOW NO READS ACTIVE'7$: TST I.PRM+16(R3) ;WAS TASK STOPPED?T BEQ 10$ ;IF EQ NOI1 INC I.PRM+16(R3) ;SET SECONDARY POOL BUFFER FLAG/- CALLR $QUEBF ;COMPLETE BUFFERED I/O REQUESTM(10$: CALLR $IOFIN ;COMPLETE I/O REQUEST B .END#U3.RPR,U.CW3(R5) ;FORGET WE WERE PROCESSING AN IO.RPRB% TSTB R0 ;ANY ERROR DETECTED SO FAR? BMI 6$ ;IF MI YES, END IT HERE; JMP VTCHK ;JUMP BACK TO HANDLE THE READ PORTION OF IO.RPR(&5$: CMP R3,U.RPKT(R5) ;OFFSPRING READ? BNE 10$ ;IF NE NO,(6$: CLR U.RPKT(R5) ;SHOW NO READS ACTIVE'7$: TST I.PRM+16(R .TITLE DSDRVO .IDENT /12.08/ ;Q5; COPYRIGHT (C) 1981 BY DIGITAL EQUIPMENT CORPORATION/; ALL RIGHTS RESERVED.;B<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; P. J. BEZEREDI 19-SEP-79;O; PREVIOUSLY MODIFIED BY:,;D; P. J. BEZEREDI; R. T. PERRON;A; MODIFIED BY:;O; B. S. MCCARTHY 6-AUG-85 12.085;O/; BM368 -- ADD CONDITIONAL SKIP OF FIRST DRIVEP!; NOT READY ERROR FOR POWERFAILS;.,; RH11/RH70-RS03/RS04 FIXED HEAD DISK DRIVER;; MACRO LIBRARY CALLS ;I .MCALL HWDDF$,PKTDF$/$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;B; EQUATED SYMBOLS ;Y%ADR=10 ;ADDRESS BITS SETUP (1=YES)E'SEL=20 ;PORT SELECT WAIT (1=WAITING)RETRY=8. ;ERROR RETRY COUNTTRE=40000 ;TRANSFER ERRORR'RSCS1=0 ;CONTROL AND STATUS REGISTERTRSWC=2 ;WORD COUNT REGISTERRSBA=4 ;BUS ADDRESSRSDA=6 ;TRACK/SECTOR ADDRESSR"RSCS2=10 ;SECOND STATUS RE00Žj{Þzt´cÚµcÛ¶c�·c›’GISTER!RSDS=12 ;DRIVE STATUS REGISTERRSER=14 ;ERROR REGISTER&RSAS=16 ;ATTENTION SUMMARY REGISTER; ; LOCAL DATA;S=; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLER NUMBER)L;7RTTBL: .BLKW R$$JS1 ;RETRY COUNT FOR CURRENT OPERATIONR=PRMSV: .BLKW R$$JS1*5 ;PARAMETER SAVE AREA FOR ERROR RECOVERY= ;AND WRITE CHECK FUNCTION=;;; DRIVER DISPATCH TABLEE;( DDT$ DS,R$$JS1 ;GENERATE DISPATCH TABLE;+C; **-DSINI-RH11/RH70-RS03/RS04 FIXED HEAD DISK CONTROLLER INITIATORI;RB; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/OH; REQUEST IS QUEUED AND AT THE END OF A PREVOIUS I/O OPERATION TO PROPA-G; GATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED UNIT IS NOT BUSY,$H; THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST, ELSE A RETURNH; TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THENI; THE NEXT I/O OPERATION IS INITIATED FOLLOWED BY A RETURN TO THE CALLER.;* ; INPUTS:/;04; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIATED.;H ; OUTPUTS:;NA; IF THE SPECIFIED UNIT IS NOT BUSY AND AN I/O REQUEST IS WAITING @; TO BE PROCESSED, THEN THE NEXT REQUEST IS DEQUEUED AND THE I/O; OPERATION IS INITIATED. ;- .ENABL LSBI7DSINI: GTPKT$ DS,R$$JS1 ;GET NEXT I/O PACKET TO PROCESSX; 1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:.;F'; R1=ADDRESS OF THE I/O REQUEST PACKET.-; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.B; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK. 4; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIATED.;F;; RH11-RS03/RS04 FIXED HEAD DISK I/O REQUEST PACKET FORMAT: ; "; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK.N@; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER.5; WD. 04 -- FIRST LUN WORD IN REQUESTORS TASK HEADER. ; WD. 05 -- I/O FUNCTION CODE.0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.=; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000)./3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.A; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER.V+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.T-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED. ; WD. 15 -- NOT USED.E8; WD. 16 -- BITS <0:7> = HIGH LBN, BITS <8:15> NOT USED.#; WD. 17 -- LOW LBN OF I/O REQUEST.U<; WD. 20 -- RELOCATION BIAS OF REGISTER BLOCK ELSE NOT USED.;; WD. 21 -- REGISTER BLOCK ADDRESS (DISPLACEMENT + 140000).-;/( BICB #ADR!SEL,U.CW2+1(R5) ;CLEAR FLAGS% MOV #RETRY,RTTBL(R3);SET RETRY COUNTT$ CALL $VOLVD ;VALIDATE VOLUME VALID BCS 10$ ;IF CS WE FAILED TST R0 ;TRANSFER FUNCTION? BMI DSUBMP ;IF MI YES TST I.PRM+2(R1) ;SIZE THE DISK? BPL 10$ ;IF PL NOD3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFERH( MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS, MOVB U.UNIT(R5),RSCS2(R2) ;SELECT THE UNIT. MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS MOVB #111,(R2) ;CLEAR THE DRIVE+ BIT #10000,RSCS2(R2);DOES THE DRIVE EXIST?U BEQ 5$ ;IF EQ YESA2 MOVB #TRE/256.,RSCS1+1(R2) ;CLEAR THE CONTROLLER* MOV #IE.SZE&377,R0 ;UNABLE TO SIZE DEVICE) BICB #US.VV,U.STS(R5);RESET VOLUME VALID$ CALL $RLCN ;RELEASE THE CONTROLLER BR 10$ ;EXIT35$: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASKN- MOV #IS.SUC&377,R0 ;SET SUCCESSFUL OPERATION; BR 50$ ;10$: CALL $IODON ;FINISH I/O2& BR DSINI ;GET NEXT PACKET TO PROCESS;RC; NOW REQUEST THE CONTROLLER AND DETERMINE IF THE UNIBUS ADDRESS IS0D; ALREADY IN THE FORMAT FOR THE MASSBUS CONTROLLER OR THE UNIBUS MAP/; FOR 22-BIT PROCESSORS WITHOUT RH CONTROLLERS.E;E9DSUBMP: BITB #ADR,U.CW2+1(R5);ADDRESS BITS ALREADY SETUP?V BNE DSINIO ;IF NE YES . BISB #ADR,U.CW2+1(R5);SHOW ADDRESS BITS SETUP3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER#' MOV S.KRB(R4),R1 ;RETREIVE KRB ADDRESS/ BIT #FE.EXT,$FMASK ;22-BIT ADDRESSING ENABLED?S BEQ 20$ ;IF EQ NO : BIT #KS.MBC,K.STS(R1) ;YES, IS THIS A 22-BIT CONTROLLER? BNE 30$ ;IF NE YES' CALL $STMAP ;S00Žr{h{töt÷tø tþfDATAETUP UNIBUS MAP ADDRESSU220$: ASL U.BUF(R5) ;SHIFT BITS <4:5> TO BITS <8:9> ASL U.BUF(R5) ;...L ASL U.BUF(R5) ;...  ASL U.BUF(R5) ;...;/ BIT #FE.EXT,$FMASK ;22-BIT ADDRESSING ENABLED?  BEQ 30$ ;IF EQ NO2% CALL $MPUBM ;MAP UNIBUS TO TRANSFERR;D<; CONVERT THE I/O FUNCTION CODE TO IT'S HARDWARE EQUIVALENT.;E230$: MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS7 CMP #IO.WCK!IQ.UMD,I.FCN(R1) ;DIAGNOSTIC WRITE CHECK?R BNE 40$ ;IF NE NO2, BISB #151,U.BUF(R5) ;YES, SET FUNCTION CODE BR 60$ ;040$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION2 BISB #171,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTION6 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?$ BHIS 55$ ;IF HIS FUNCTION IS LEGAL,50$: MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS) MOVB U.UNIT(R5),RSCS2(R2) ;SELECT DRIVEC CALLR DSFIN1 ;FINISH UPL%55$: BEQ 60$ ;IF EQ FUNCTION IS READV5 SUB #10,U.BUF(R5) ;CONVERT TO WRITE LOGICAL FUNCTIONI;O; VALIDATE AND CONVERT LBN. ; -60$: CALL $BLKCK ;CHECK LOGICAL BLOCK NUMBER CMP #2,U.PRM+2(R5) ;RS04 DRIVE? BEQ 70$ ;IF EQ YES ASL R0 ;MULTIPLY RS03 BLOCK)170$: ASL R0 ;CONVERT TO SECTOR AND TRACK ADDRESSI' MOV R0,I.PRM+12(R3) ;SAVE DISK ADDRESS ' MOV S.KRB(R4),R1 ;RETRIEVE KRB ADDRESS@- MOVB K.CON(R1),R1 ;RETRIEVE CONTROLLER INDEXT$ MUL #5,R1 ;SETUP AN INDEX INTO ...' ADD #PRMSV,R1 ;... PARAMETER SAVE AREAQ& MOV U.BUF(R5),(R1)+ ;SAVE PARAMETERS MOV U.BUF+2(R5),(R1)+ ;... MOV U.CNT(R5),(R1)+ ;... MOV I.PRM+10(R3),(R1)+ ;...K MOV I.PRM+12(R3),(R1)+ ;... .DSABL LSB+; $; **-DSINIO-INTIATE AN I/O OPERATION;RB; THIS ROUTINE WILL INITIATE THE DATA TRANSFER OPERATION. AT THIS=; POINT THE CONTROLLER MUST BE REQUESTED FOR A DATA TRANSFER.R;R ; INPUTS: ; ; R4=ADDRESS OF THE SCB.; R5=ADDRESS OF THE UCB.;T*DSINIO: MOV @S.KRB(R4),R2 ;GET CSR ADDRESS) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSB( MOVB U.UNIT(R5),RSCS2(R2) ;SELECT UNIT;R9; DETERMINE IF DRIVE'S PORT IS SEIZED BY THIS CONTROLLER.3;R) CLR RSDS(R2) ;ATTEMPT TO SEIZE THE DRIVE( BIT #400,RSDS(R2) ;DID THE DRIVE SEIZE? BNE 5$ ;IF NE YES % MOVB #100,(R2) ;RE-ENABLE INTERRUPTSN0 BISB #SEL,U.CW2+1(R5);SET PORT SELECT WAIT FLAG< MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNT* CALLR $RLCN ;RELEASE CONTROLLER AND EXIT;..; LOAD CONTROLLER REGISTERS FOR DATA TRANSFER.;75$: MOV #TRE!11,(R2) ;CLEAR CONTROLLER AND DRIVE ERRORSR# ADD #RSCS2,R2 ;POINT TO SECOND CSRE- MOV I.PRM+12(R1),-(R2) ;INSERT DISK ADDRESSL. MOV U.BUF+2(R5),-(R2) ;INSERT BUFFER ADDRESS8 MOV U.CNT(R5),-(R2) ;INSERT NUMBER OF BYTES TO TRANSFER! ROR (R2) ;CONVERT TO WORD COUNTB$ NEG (R2) ;MAKE NEGATIVE WORD COUNT" TST -(R2) ;POINT TO CSR REGISTER;(&; TEST FOR DRIVE NOT READY CONDITIONS.;C+ MOV #IE.DNR&377,R0 ;ASSUME DRIVE NOT READYX7 MOV RSDS(R2),R3 ;GET CONTENTS OF DRIVE STATUS REGISTER COM R3 ;COMPLEMENT STATUS ( BIT #10200,R3 ;DRIVE READY AND ON-LINE? BEQ 20$ ;IF EQ YES/ BITB #US.SPU,U.STS(R5) ;IS DRIVE SPINNING UP?L BEQ 10$ ;IF EQ NOR9 BITB #US.VV,U.STS(R5);WAS THE VOLUME PREVIOUSLY MOUNTED?M BEQ DSPWF1 ;IF EQ NO( BR DSPWF0 ;YES, WAIT FOR IT TO SPIN UP210$: BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC OPERATION BEQ 15$ ;IF EQ NO. CALLR DSDIAG ;LOG DIAGNOSTIC DRIVE NOT READY15$: ;REFERENCE LABEL .IF DF S2.NRD6 BIT #S2.NRD,S.ST2(R4) ;IS THIS FIRST DRIVE NOT READY?! BNE 16$ ;IF NE NO, GO LOG ERROR06 BIS #S2.NRD,S.ST2(R4) ;INDICATE FIRST DRIVE NOT READY JMP DSPWF1 ;GO DO A RETRYD716$: BIC #S2.NRD,S.ST2(R4) ;CLEAR FIRST DRIVE NOT READYS .ENDC ; DF S2.NRD( CALL $DVERR ;LOG DRIVE NOT READY ERROR CALLR DSFIN ;FINISH UP520$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UPT6 BICB #S3.SPU,S.ST3(R4) ;CLEAR PORT SPINNING UP FLAGS* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS MOV R3,R1 ;COPY KRB ADDRESSB;#$; START THE DATA TRANSFER OPERATION.; ! MTPS #PR5 ;;;DISABLE INTERRUPTS 1 BIT #FE.EXT,$FMASK ;;;22-BIT ADDRESSING ENABLED?E BEQ 30$ ;;;IF EQ NO 7 BIT #KS.MBC,K.STS(R3) ;;;IS THIS A 22-BIT CONTROLLER?  BEQ 30$ ;;;IF EQ NON' ADD K.OFF(R00Žz{Þzt´cÚµcÛ¶c�·c›’3),R1 ;;;POINT TO UCB TABLEE+ MOV KE.RHB(R1),R1 ;;;RETREIVE RHBAE OFFSET0' ADD R2,R1 ;;;FORM AN I/O PAGE ADDRESSP2 MOVB U.BUF+1(R5),(R1);;;SET MEMORY EXTENSION BITS& MOVB U.BUF(R5),(R2) ;;;START FUNCTION BR 40$ ;;;)30$: MOV U.BUF(R5),(R2) ;;;START FUNCTION +40$: CLR S.FRK+2(R4) ;;;INIT FORK INTERLOCK / MOVB S.ITM(R4),S.CTM(R4) ;;;SET TIMEOUT COUNT 8 BIS #KS.DIP,K.STS(R3) ;;;SET DATA TRANSFER IN PROGRESS- BIS #S2.ACT,S.ST2(R4) ;;;SHOW I/O IS ACTIVEO MTPS #0 ;ALLOW INTERRUPTSN;D<; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES.;I"DSCAN: RETURN ;NOP FOR RS03/RS04;+:; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND>; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT=; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVE;?; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANY A; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESSB; THE UNIT IS ALREADY READY.;-3DSPWF: TSTB S.STS(R4) ;IS THIS UNIT CURRENTLY BUSY?L BEQ DSPWF2 ;IF EQ NO8DSPWF0: MOVB #8.,S.STS(R4) ;WAIT A MAXIMUM OF 32 SECONDS6DSPWF1: MOVB S.ITM(R4),S.CTM(R4) ;4 SECONDS AT A TIME5DSPWF2: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UP 7DSPWF3: CALLR $RLCN ;RELEASE CONTROLLER (IF NECESSARY)A;+5; **-$DSINT-RH11-RS03/RS04 FIXED HEAD DISK CONTROLLER ; INTERRUPT SERVICE ROUTINET;-3$DSINT::BR DSFRK ;;;ENTRY POINT FOR DATA TRANSFERSD+ TST S.FRK+2(R4) ;;;ARE INTERRUPTS ALLOWED?. BNE DSCAN ;;;IF NE NO(' CALL $FORK ;;;CREATE A SYSTEM PROCESSD9DSFRK: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFERM2 BITB #SEL,U.CW2+1(R5);WAITING FOR PORT TO SELECT? BEQ 5$ ;IF EQ NO2 BICB #SEL,U.CW2+1(R5);CLEAR PORT SELECT WAIT FLAG% JMP DSINIO ;YES, GO DO THE TRANSFERO-5$: MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESSR- MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEXP% MOV U.SCB(R5),R4 ;GET ADDRESS OF SCBF/ MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFERK# MOV @S.KRB(R4),R2 ;GET CSR ADDRESSB( MOVB U.UNIT(R5),RSCS2(R2) ;SELECT UNIT# TSTB S.STS(R4) ;IS THIS UNIT BUSY?R BNE 15$ ;IF NE YES& CLR S.FRK+2(R4) ;RESET FORK INTERLOCK- MOV #TRE!11,(R2) ;CLEAR CONTROLLER AND DRIVEF- BIT #S2.MAD,S.ST2(R4) ;MULTI-ACCESS DEVICE?T BNE 10$ ;IF NE YES. MOVB #100,(R2) ;NO, JUST RE-ENABLE INTERRUPTS( BR DSPWF3 ;RELEASE CONTROLLER AND EXIT&10$: MOVB #113,(R2) ;RELEASE THE DRIVE8 BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED( BR DSPWF3 ;RELEASE CONTROLLER AND EXIT;2+; THE UNIT WAS BUSY. NOW CHECK FOR ERRORS.);S115$: BITB #US.SPU,U.STS(R5) ;ARE WE SPINNING UP?B BNE DSREST ;IF NE YESS) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS!7 BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION EXECUTED?R BNE DSDIAG ;IF NE YEST BIT #60000,(R2) ;ANY ERRORS?1 BEQ DSWCHK ;IF EQ NO. MOV RSWC(R2),R0 ;GET NEGATIVE WORDS REMAINING# ASL R0 ;CONVERT TO NEGATIVE BYTESE6 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED* SUB #512.,R0 ;SUBTRACT OUT BLOCK IN ERROR) BLE 20$ ;IF LE NO GOOD BYTES TRANSFEREDH2 BIT #S2.EIP,S.ST2(R4) ;ERROR ALREADY IN PROGRESS BEQ 20$ ;IF EQ NO;E:; WE GOT AN ERROR BUT SOME GOOD DATA WAS TRANSFERED. THIS6; INDICATES THAT WE RECOVERED FROM THE PREVIOUS ERROR.;D, CALL DSCALC ;CALCULATE NEW DISK PARAMETERS MOV R2,-(SP) ;SAVE CSR ADDRESSE/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTI/ BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNTC1 MOV #IS.SUC&377,R0 ;THIS RECOVERY WAS SUCCESSFULB+ CALL $FNERL ;FINISH ERROR LOGGING PROCESS2- MOV #RETRY,RTTBL(R3);SET INITIAL RETRY COUNTE" MOV (SP)+,R2 ;RESTORE CSR ADDRESS#20$: CALL $DVERR ;LOG DEVICE ERRORG- MOV #IE.WCK&377,R0 ;ASSUME WRITE CHECK ERROR ( BIT #4000,RSCS2(R2) ;WRITE CHECK ERROR? BNE DSRTRY ;IF NE YESC/ MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERRORR0 MOV RSER(R2),R1 ;GET CONTENTS OF ERROR REGISTER BIT #47007,R1 ;HARD ERROR?B BNE 30$ ;IF NE YES! BIT #14000,RSCS2(R2);NEM OR NED?S BNE 30$ ;IF NE YES TST RSCS2(R2) ;DATA LATE ERROR? BPL DSRTRY ;IF PL NO, CALL DSCALC ;YES, CALCULATE NEW PARAMETERS& BR DSRTRY ;RETRY FROM BLOCK IN ERR00Ž‚{h{töt÷tø tþfDATAOR$30$: BIT #4000,R1 ;WRITE LOCK ERROR? BEQ DSFIN ;IF EQ NOR) MOV #IE.WLK&377,R0 ;SET WRITE LOCK ERRORC BR DSFIN ;FINISH I/O;B@; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING REPEATEDA; UNLESS THE REQUEST WAS DIAGNOSTIC. TIMEOUTS ARE USUALLY CAUSED0C; BY POWERFAILURE BUT MAY ALSO BE THE RESULT OF A HARDWARE FAILURE.R;D7DSOUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP? BEQ 10$ ;;;IF EQ NO- DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET?B BEQ 10$ ;;;IF EQ YES MTPS #0 ;;;ALLOW INTERRUPTS . CALL $RQCND ;REQUEST CONTROLLER FOR TRANSFER# BR DSREST ;RETRY ENTIRE OPERATIONC,10$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY3 BICB #US.SPU,U.STS(R5) ;;;RESET DRIVE SPINNING UP  MTPS #0 ;;;ALLOW INTERRUPTSI. CALL $RQCND ;REQUEST CONTROLLER FOR TRANSFER* MOV S.KRB(R4),R2 ;GET CURRENT KRB ADDRESS- MOVB K.CON(R2),R3 ;RETREIVE CONTROLLER INDEX # MOV (R2),R2 ;RETREIVE CSR ADDRESS ( MOVB U.UNIT(R5),RSCS2(R2) ;SELECT UNIT! CALL $DVTMO ;LOG DEVICE TIMEOUT 2 BITB #SEL,U.CW2+1(R5);WAITING FOR PORT TO SELECT?) BNE DSFIN1 ;IF NE YES, WE DIDN'T GET ITE2 BCC DSRTRY ;IF CC TIMEOUT DURING NORMAL FUNCTION7DSDIAG: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASK * BR DSFIN ;DIAGNOSTIC PROCESSING COMPLETE;T; RETRY THE CURRENT OPERATION.;E0DSRTRY: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS' BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES?N BNE DSFIN ;IF NE YES DEC RTTBL(R3) ;RETRY FUNCTION?V BLE DSFIN ;IF LE NO 'DSREST: MOVB #111,(R2) ;CLEAR THE DRIVEI! CALLR DSUBMP ;RESTART OPERATIONI;F!; TEST FOR WRITE CHECK OPERATION.F; CDSWCHK: BITB #IO.WLC&377,I.FCN(R1) ;WRITE FOLLOWED BY WRITE CHECK?C BNE 10$ ;IF NE YES5 BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED BY MCR?I BEQ DSFIN ;IF EQ NOP)10$: MOVB U.BUF(R5),R1 ;GET LAST FUNCTIONE CMPB #171,R1 ;WAS IT A READ? BEQ DSFIN ;IF EQ YES* CMPB #161,R1 ;WAS LAST FUNCTION A WRITE? BNE DSFIN ;IF NE NOR. MOV #RETRY,RTTBL(R3);REINITIALIZE RETRY COUNT- MOV S.PKT(R4),R1 ;RESTORE I/O PACKET ADDRESSC# MUL #5,R3 ;FORM AN INDEX INTO ...' ADD #PRMSV,R3 ;... PARAMETER SAVE AREAS) MOV (R3)+,U.BUF(R5) ;RESTORE PARAMETERSL MOV (R3)+,U.BUF+2(R5) ;... MOV (R3)+,U.CNT(R5) ;... MOV (R3)+,I.PRM+10(R1) ;...E MOV (R3)+,I.PRM+12(R1) ;...N. MOVB #151,U.BUF(R5) ;SET WRITE CHECK FUNCTION( BR DSREST ;START WRTIE CHECK OPERATION;Q; **-DSFIN-FINISH I/O OPERATIONN;OB; THIS ROUTINE WILL SET THE ACTUAL BYTES TRANSFERED PARAMETER, THEC; ERROR LOGGING RETRY COUNTS AND CALL $IODON. A CHECK WILL BE MADE#A; FOR ANY PENDING ATTENTIONS AND THE CONTROLLER WILL BE RELEASED.A;S ; INPUTS:+;B; R0=SUCCESS/ERROR CODER; R2=ADDRESS OF CONTROLLER CSR; R4=ADDRESS OF THE SCB.; R5=ADDRESS OF THE UCB1;;7DSFIN: MOV RSWC(R2),R1 ;GET WORDS REMAINING TO TRANSFER;+ ASL R1 ;CONVERT TO BYTES LEFT TO TRANSFERW6 ADD U.CNT(R5),R1 ;CALCULATE BYTES ACTUALLY TRANSFERED&DSFIN1: MOVB #11,(R2) ;CLEAR THE DRIVE# MOV #TRE,(R2) ;NOW CLEAR THE DRIVEE* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS2 BICB #SEL,U.CW2+1(R5);CLEAR PORT SELECT WAIT FLAG+10$: TSTB RSAS(R2) ;ANY ATTENTIONS PENDING?S BEQ 20$ ;IF EQ NO01 BISB #100,(R2) ;RE-DISPATCH TO INTERRUPT HANDLERR BR 10$ ;TRY AGAIN 020$: BIT #S2.MAD,S.ST2(R4) ;DUAL ACCESS DEVICE? BEQ 30$ ;IF EQ NO 6 BITB #S3.NRL,S.ST3(R4) ;SHOULD WE RELEASE THE DRIVE? BEQ 35$ ;IF EQ YES)30$: MOVB #100,(R2) ;RE-ENABLE INTERRUPTSR BR 40$ ;<35$: BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED7 MOVB #113,(R2) ;RE-ENABLE INTERRUPTS AND RELEASE DRIVE 140$: MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEXT/ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNT / BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNTR CALL $RLCN ;RELEASE CONTROLLER" CLR S.FRK+2(R4) ;ALLOW INTERRUPTS# CALL $IODON ;FINISH I/O OPERATION! JMP DSINI ;PROCESS NEXT REQUEST ;S>; THE TRANSFER STOPPED DUE TO A RETRYABLE ERROR CONDITION. WE>; WILL NOW BACKUP THE WORD COUNT, BUS ADDRESS AND TRACK/SECTOR>; ADDRESS BY ONE BLOCK AND RETRY THE TRANSFER FROM THIS POINT.@; THIS IS DONE TO PREVENT THE ERROR CONDITIO00ŽŠ{��{�Ž{´cÚµcÛ¶c�·c›’N FROM RECURRING DUE; TO A LONG TRANSFER.2;E5DSCALC: MOV RSWC(R2),R0 ;GET NEGATIVE WORDS REMAININGA* BNE 10$ ;IF NE WE HAD A PARTIAL TRANSFER0 MOV #-1,R0 ;DLT ON LAST WORD, FAKE PARTIAL XFR'10$: ASL R0 ;CONVERT TO NEGATIVE BYTESI6 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED- BIC #777,R0 ;GET BLOCKS ACTUALLY TRANSFEREDL5 SUB R0,U.CNT(R5) ;REDUCE BYTES REMAINING TO TRANSFERR* BEQ 30$ ;IF EQ NO MORE BYTES TO TRANSFER3 ADD R0,U.BUF+2(R5) ;UPDATE STARTING BUFFER ADDRESSR0 ADCB U.BUF+1(R5) ;AND THE MEMORY EXTENSION BITS2 BIT #FE.EXT,$FMASK ;IS 22-BIT ADDRESSING ENABLED? BEQ 15$ ;IF EQ NOE+ MOV S.KRB(R4),R1 ;RETRIEVE THE KRB ADDRESS#9 BIT #KS.MBC,K.STS(R1) ;IS THIS A 22-BIT MASSBUS DEVICE?O BNE 15$ ;IF NE YES& ADD K.OFF(R1),R1 ;POINT TO UMR AREA+2) ADD R0,-(R1) ;CALCULATE NEW REAL ADDRESSK ADCB -(R1) ;...E215$: MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS" SWAB R0 ;GET BLOCKS*2 TRANSFERED CMP #2,U.PRM+2(R5) ;RS04 DRIVE? BEQ 20$ ;IF EQ YES ASL R0 ;GET BLOCKS*4-20$: ADD R0,I.PRM+12(R1) ;UPDATE DISK ADDRESSE RETURN ;I430$: ADD R0,U.CNT(R5) ;YES, BACKUP BYTES TO TRANSFER RETURN ;R .ENDVE THE KRB ADDRESS#9 BIT #KS.MBC,K.STS(R1) ;IS THIS A 22-BIT MASSBUS DEVICE?O BNE 15$ ;IF NE YES& ADD K.OFF(R1),R1 ;POINT TO UMR AREA+2) ADD R0,-(R1) ;CALCULATE NEW REAL ADDRESSK ADCB -(R1) ;...E215$: MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS" SWAB R0 ;GET BLOCKS*2 TRANSFERED CMP #2,U.PRM+2(R5) ;RS04 DRIVE? BEQ 20$ ;IF EQ YES ASL R0 ;GET BLOCKS*4C; PREFIX FILE USED DURING UPDATE TO DEFINE DL: CONTROLLER SYMBOLSR$$L11=1 .TITLE KXDRVe .IDENT /0.07/;d; COPYRIGHT (C) 1987 BY); DIGITAL EQUIPMENT CORPORATION, MAYNARDo(; MASSACHUSSETTS. ALL RIGHTS RESERVED.;'5; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY 5; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE5; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THEÅ5; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHERþ5; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE-5; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TOå5; AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED.;(5; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO5; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUEDF5; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ;D6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR 5; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT ISI; NOT SUPPLIED BY DIGITAL.;N; PAUL K. M. WEISS H;O;A;; .02 fix implicit start, use $mppro, fix directive return 1; .03 mods for xxdrv interface, share all memoryF; .04 fix xxdrv returnE!; .05 add vms initiated commandsI; .06 ADD SN$IMP "; .07 add error return for cprcon;T; MACRO LIBRARY CALLSD;T* .MCALL HWDDF$,PKTDF$,SCBDF$,UCBDF$,CPRDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS SCBDF$ ,,1 ;SCB DEFINITIONSF( UCBDF$ ,,1 ;UNIT CONTROL BLOCK OFFSETS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS# CPRDF$ ;CPR SPECIFIC DEFINITIONSWO;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++3;dK; THE FOLLOWING TABLE MUST BE THE FIRST THING IN THE DRIVER. THE EXEC USESdN; A VECTORED ENTRY SYSTEM TO THIS MODULE. ANY CHANGES MADE TO THIS TABLE MUST'; ALSO BE MADE IN THE EXEC MODULE DRSUBL;WO;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++,( .WORD CPRCON ;UNIT CONNECT ENTRY POINT6 .WORD CPRALO ;ALLOCATE BUFFER SPACE AND COMMAND RING' .WORD CPRDEA ;DEALLOCATE BUFFER SPACE" .WORD CPRSEN ;SEND PACKET TO VMS;+ ; LOCAL DATA;+;****TEMPORARY TPR1=2 TPR2=4L TPR3=6L U.VUCB=U.UI00�’{h{töt÷tø tþfDATAC+2S KXCSRD=177530 KXCSRF=177534 KXJQIR=177532;****TEMPORARY6SNDRNG: .WORD 140000 ;CURRENT RSX TO VMS RING ADDRESS2PRVSND: .WORD 0 ;PREVIOUS RSX TO VMS RING ADDRESS4FRSTSN: .WORD 140000 ;FIRST RSX TO VMS RING ADDRESS7WRAPSN: .WORD 0 ;ADDRESS JUST PAST RSX TO VMS RINGS - Y ;INDICATES WRAP 1RCVRNG: .WORD 0 ;CURRENT VMS TO RSX RING ADDRESSE2PRVRCV: .WORD 0 ;PREVIOUS VMS TO RSX RING ADDRESS/FRSTRC: .WORD 0 ;FIRST VMS TO RSX RING ADDRESSA7WRAPRC: .WORD 0 ;ADDRESS JUST PAST VMS TO RSX RINGS - R ;INDICATES WRAP50BUFFHD: .BLKW 1 ;LISTHEAD FOR BUFFER SPACE LIST9BUFFWT: .WORD 0 ;COUNT OF TASKS WAITING FOR BUFFER SPACER3RINGWT: .WORD 0 ;COUNT OF TASKS WAITING FOR A RING *XXWAIT: .WORD 0 ;XX DRIVER WAIT FLAG WORD&XXBIAS: .WORD 0 ;XX DRIVER SAVED BIAS/XXRET: .WORD 0 ;XX DRIVER SAVED RETURN ADDRESSU"XXR5: .WORD 0 ;XX DRIVER SAVED R57QBASE: .WORD 0 ;QBUS STARTING ADDRESS/100 FROM KXJCSRFRASHRCNT: .WORD 0 ;COUNT OF REQUESTS WHICH HAVE LOWERED THE SHAREDT ;MEMORY BASE2CMCSRF: .WORD 0 ;VALUE OF KXJCSRF TO SHARE CPRCOM<RNGBAS: .WORD 0 ;APR BIAS OF RINGS (ALSO OF BASE OF CPRBUF);CSR: .WORD 0 ;WE SAVE THE CSR AND VECTOR, BECAUSE WE DON'TW@VECTOR: .WORD 0 ;HAVE OUR DATA STRUCTURES IF CALLED BY THE EXEC1SYSUCB: .BLKW 2 ;ADDRESS OF CPRSYS'S VMS CP: UCB ; ; DRIVER DISPATCH TABLES;D DDT$ KX,1,,,,NEW=Y ;GENERATE DISPATCH TABLE - ALWAYS ONE CONTROLLER .PAGE1 .SBTTL KXKRB - CONTROLLER INITIALIZATION ROUTINEH; +; KXKRB - CONTROLLER INITIALZATION ROUTINE.M;FF; THIS ROUTINE ASSUMES THAT THE TOP FOUR WORDS OF PHYSICAL MEMORY HAVE(; BEEN SET UP WITH THE FOLLOWING VALUES:;O<; +-------------------------------------------------------+0; | SIZE IN 32 WORD BLOCKS OF CPRBUF |<; +-------------------------------------------------------+(; | # OF RSX/KXJ -> VAX/VMS RINGS |<; +-------------------------------------------------------+(; | # OF VAX/VMS -> RSX/KXJ RINGS |<; +-------------------------------------------------------+<; | SIZE IN 32 WORD BLOCKS OF RSX CONTROLLED BUFFER SPACE |<; +-------------------------------------------------------+;J; USING THESE VALUES, THIS ROUTINE SETS UP CPRBUF IN THE FOLLOWING MANNER:;I;IH;TOP OF MEMORY +-------------------------------------------------------+ ; | | ; | |#; | VMS CONTROLLED BUFFER AREA |+<; +-------------------------------------------------------+ ; | | ; | | ; | |#; | RSX CONTROLLED BUFFER AREA |-<; +-------------------------------------------------------+!; | VMS -> RSX COMMAND RINGS |-<; +-------------------------------------------------------+!; | RSX -> VMS COMMAND RINGS |UI;BASE OF CPRBUF +-------------------------------------------------------+-;-F; IN ADDITION, THIS ROUTINE SEND AN INTERRUPT TO VMS NOTIFYING IT THATD; THE ABOVE INFORMATION IS IN PLACE AT THE TOP OF MEMORY. WHEN VMS H; RECEIVES THIS NOTIFICATION, IT SETS UP ITS OWN REFERENCES TO CPRBUF IN; EXACTLY THE SAME MANNER.;-I; THE FIFTH WORD FROM THE TOP OF SHARED MEMORY IS SET UP AS THE APR BIAS DH; OF THE BASE OF CURRENTLY SHARED MEMORY, WHICH VMS USES TO CHECK ACCESS;|J; THIS ROUTINE ALSO SHRINKS THE SIZE OF SHARED MEMORY DOWN TO INCLUDE ONLY; CPRBUF;-; INPUTS;-; R4 = DCB ADDRESS; R3 = CTB ADDRESS; R2 = KRB ADDRESS1; 0(SP) = RETURN ADDRESS FOR IMMEDIATE COMPLETIONL3; 2(SP) = RETURN ADDRESS FOR CALLER OF EXEC ROUTINE (; C = 1 TRANSITION TO OFF-LINE REQUESTED'; C = 0 TRANSITION TO ON-LINE REQUESTED.=; SUCCESS ASSUMED, $SCERR FILLED IN WITH ERROR CODE IF NEEDEDAKXKRB::I@; FIRST TELL VMS THAT THE TOP FOUR WORD HAVE BEEN SET UP, AND IT; CAN INITIALIZE ITS POINTERSA9 BIS #10010,@#KXCSRD ; ENABLE INTERRUPTS TO AND FROM VMS = MOV @#KISAR5,$KXBAS ; SAVE DRIVER BASE ADDRESS FOR THE EXECS< MOV K.CSR(R2),CSR ; SAVE THE CSR AND VECTOR -WE DON'T HAVE MOV CSR,R4 ; NOW GET THE CSRE< MOV #RI$RIN,TPR2(R4) ; INDICATE THAT THIS IS A SYNC REQUEST MOV $KXVC1,R0 ; GET THE VECTOR+ ADD #4,R0 ; WE WANT THE00�š{�{�Ž{´cÚµcÛ¶c�·c›’ ALTERNATE VECTOR 9 MOV R0,@#KXJQIR ; INTERRUPT VMS AT THE ALTERNATE VECTOR /5$: TST TPR2(R4) ; HAS VMS RECEIVED INTERRUPT?  BNE 5$ ; IF NE NO;S; NOW SET UP THE BUFFER AREASS; - MOV $SYSIZ,@#KISAR6 ; GET THE END OF MEMORYS" DEC @#KISAR6 ; BACK UP ONE BLOCK- MOV $SYSIZ,RNGBAS ; GET THE SIZE OF MEMORY E MOV #140100,R4 ; TOP OF MEMORY9 SUB -(R4),RNGBAS ; SUBTRACT THE # OF BLOCKS TO GET BASEI. MOV -(R4),R2 ; # OF RSX -> VMS COMMAND RINGS. MOV -(R4),R1 ; # OF VMS -> RSX COMMAND RINGS4 MOV -(R4),R0 ; SIZE OF RSX CONTROLLED BUFFER SPACEM; REMOVE THE FOLLOWING LINE AND UNCOMMENT THE NEXT BLOCK TO ONLY SHARE CPRBUF5& CLR -(R4) ; ALL OF MEMORY IS SHARED;; MOV @#KXCSRF,QBASE ; GET THE QBUS BASE ADDRESS FROM CSRFR4; MOV RNGBAS,CMCSRF ; COPY THE RING AND CPRBUF BASE,; BIC #77,CMCSRF ; MAKE INTO AN 8KB ADDRESS9; ADD QBASE,CMCSRF ; ADD BASE TO CSRF TO GET CPRBUF BASEF<; MOV CMCSRF,@#KXCSRF ; REDUCE SHARED MEMORY TO JUST CPRBUF9; MOV RNGBAS,-(R4) ; STORE CURRENT BASE OF SHARED MEMORYV/ MOV RNGBAS,@#KISAR6 ; NOW MAP CPRBUF IN APR 66 MOV #140000,R4 ; VIRTUAL ADDRESS TO ACCESS THE RINGS; ; INITIALIZE THE RING POINTERS;A210$: CLR (R4) ; MAKE SURE THE SYNCH BIT IS CLEAR4 MOV R4,PRVSND ; WILL BE THE LAST RING AT LOOP EXIT$ ADD #R$SIZE,R4 ; MOVE TO NEXT RING& SOB R2,10$ ; LOOP FOR ALL THE RINGS7 MOV R4,WRAPSN ; THIS IS THE WRAP VALUE FOR THE RINGS,S5 MOV R4,FRSTRC ; THE BEGINNING OF THE RECEIVE RINGS,S. MOV R4,RCVRNG ; AND THE CURRENT RECEIVE RING320$: CLR (R4) ; MAKE SURE THAT SYNCH BIT IS CLEAR 0 MOV R4,PRVRCV ; WILL BE LAST RING AT LOOP EXIT$ ADD #R$SIZE,R4 ; MOVE TO NEXT RING* SOB R1,20$ ; LOOP FOR ALL RECEIVE RINGS. MOV R4,WRAPRC ; WRAP VALUE FOR RECEIVE RINGS) BIC #160000,R4 ; CLEAR OUT THE APR BIASD+ ADD #77,R4 ; ROUND TO NEXT 32-WORD BLOCK ( ASH #-6,R4 ; MAKE INTO A BLOCK NUMBER ADD R4,@#KISAR6 ; MAP IT. MOV @#KISAR6,BUFFHD ; SET UP BUFFER LISTHEAD# CLR 140000 ; CLEAR THE LINK WORDG2 MOV R0,140002 ; PUT # OF BLOCKS INTO SECOND WORD RETURN ; CONTROLLER IS READY .PAGE' .SBTTL KXUCB - UNIT ONLINE ENTRY POINT;D&; ** - KXUCB - UNIT ONLINE ENTRY POINT;0E; THE ONLY THING THAT THIS ROUTINE DOES IS TO SET UP K.OWN IN THE KRBI;R ; INPUTS:#;0$; R3=CONTROLLER INDEX (S.KRB .NE. 0); R4=ADDRESS OF SCBN; R5=ADDRESS OF UCBA;# ; OUTPUTS:;I; K.OWN SET UP IN KRBD;,+KXUCB:: MOV S.KRB(R4),R2 ;RETRIEVE KRB ADDRE: MOV R5,K.OWN(R2) ;MARK THIS UNIT AS OWNING THE CONTROLLER RETURN4 .PAGE* .SBTTL $KXINT - INTERRUPT SERVICE ROUTINE;N); ** - $KXINT - INTERRUPT SERVICE ROUTINE ;T7; WE CAN GET INTERRUPTED BY VMS FOR ONE OF TWO REASONS:Y;I;; 1) OUR SEND RING HAS TRANSITIONED FROM NOT EMPTY TO EMPTYK;N>; 2) OUR RECEIVE RING HAS TRANSITIONED FROM EMPTY TO NOT EMPTY; ); WE CHECK BOTH CASES FOR EVERY INTERRUPTC;;$KXINT::* INTSV$ KX,PR5,1 ;;; INTERRUPT SAVE MACRO ;;; R5 = UCB ADDRESSB6 MOV U.SCB(R5),R4 ;;;POINT TO CONTROLLER STATUS BLOCK' TST S.FRK+2(R4) ;;;FORK BLOCK IN USE?K' BEQ 10$ ;;;IF EQ, NO, FORK THIS TIME* RETURN ;;;RETURN V*10$: CALL $FORK ;;;CREATE SYSTEM PROCESS ;;;R5 MUST STILL BE THE UCB) ;;;R4 MUST BE THE SCB TO CALL $FORK N9 CLR S.FRK+2(R4) ;FREE FORK BLOCK FOR FURTHER INTERRUPTSN+CPRPOL: MOV RNGBAS,@#KISAR6 ;MAP THE RINGS 2 MOV RCVRNG,R2 ;GET THE CURRENT RECEIVE RING BASE2 TST (R2) ;DO WE HAVE A RECEIVE RING TO PROCESS? BMI 15$ ;YES, PROCESS ITR! MOV #RINGWT,R2 ;RING WAIT COUNTO MOV #T4.LRW,R1 ;RING WAIT FLAG3 JMP UNBLOK ;GO CHECK IF WE'RE WAITING FOR A RING;T"; WE HAVE AN INPUT RING TO PROCESS; *15$: MOV R$FLAG(R2),R1 ;GET THE FLAG WORD0 MOV R$ADDR(R2),@#KISAR6 ;MAP THE HEADER IN APR6$ MOV #140000,R3 ;GET A BASE ADDRESS, BIT #HF$RSP,H$FLAG(R3) ;IS THIS A RESPONSE? BNE 151$ ;YES, PROCESS IT0 JMP VMSINI ;COMMANDS HAVE SEPARATE PROCESSING;151$: BIT #RF$IDS,R1 ;WAS IT INSUFFICIENT DYNAMIC STORAGE?I BEQ 155$ ;NO, JUST CONTINUE' MOV #IE.UNS,H$STAT(R3) ;SET THE STATUSW155$:I ; UNCOMMENT TO SHARE ONLY CPRB00�¢{h{töt÷tø tþfDATAUF?; BIT #HF$SHR,H$FLAG(R3) ;DID THIS COMMAND LOWER SHARED MEMORY?P!; BEQ 16$ ;NO, DON'T RESTORE IT 5; DEC SHRCNT ;DECREMENT COUNT OF TASKS LOWERING MEME0; BNE 16$ ;IF THERE ARE STILL MORE, DO NOTHING(; MOV @#KISAR6,-(SP) ;SAVE APR6 MAPPING%; MOV $SYSIZ,@#KISAR6 ;END OF MEMORYP"; DEC @#KISAR6 ;BACK UP ONE BLOCK/; MOV RNGBAS,140066 ;SET BASE OF SHARED MEMORYE*; MOV (SP)+,@KISAR6 ;RESTORE APR6 MAPPING7; MOV CMCSRF,@#KXCSRF ;AND MOVE THE SHARED MEMORY BASEI916$: BITB #HF$AST,H$FLAG(R3) ;DO WE NEED TO QUEUE AN AST?) BNE 17$ ;YES, GO DO ITA; H; WE AREN'T QUEUEING AN AST. THAT EITHER MEANS THAT WE ARE COMPLETING AM; DETACHED RETURN, OR WE ARE RETURNING TO AN EXEC ROUTINE. A DETACHED RETURN P; WILL HAVE H$RET=0. IF IT IS A DETACHED RETURN, UNBLOCK THE TASK IF NECESSARY,P; STORE THE TASK INDEX IF IT WAS A TASK INITIATION, AND DEALLOCATE THE BUFFER. >; IF IT IS AN EXEC RETURN, RETURN TO THE CALLING ROUTINE WITH:; ; R0 BUFFER ADDRESS 2 MOV H$BIAS(R3),-(SP) ;SAVE THE APR5 BIAS FOR CALL# MOV H$RET(R3),-(SP) ;AND ADDRESS G0 BEQ 161$ ;IF NONE, THIS IS A DETACHED RETURN ) MOV @#KISAR6,R0 ;GET THE BUFFER ADDRESSA5 CALL $MPPRO ;CALL THE OTHER ROUTINE AS A COROUTINE * BR 163$ ;COMMON EXEC ROUTINE EXIT POINT;S; DETACHED RETURN PROCESSING;A'161$: CMP (SP)+,(SP)+ ;CLEAN THE STACKI. BIT #HF$BLK,H$FLAG(R3) ;WAS THE TASK BLOCKED? BEQ 162$ ;NO, JUST CONTINUE MOV H$TCB(R3),R5 ;GET THE TCBE BIC #TS.RSW,T.STAT(R5) ;UNBLOCK4 CMP #HT$RUN,H$TYPE(R3) ;WAS THIS A TASK INITIATION? BNE 162$ ;NO, JUST CONTINUE0 MOVB P$TKI(R3),T.LBN(R5) ;SET UP THE TASK INDEX5162$: MOV @#KISAR6,R0 ;GET THE ADDRESS OF THE PACKET % CALL CPRDEA ;DEALLOCATE THE HEADERO$ MOV R5,R0 ;MOVE THE TCB FOR SETCR CALL $SETCR ;SCHEDULE ITD"163$: CLR R5 ;DON'T QUEUE AN AST& MOV RNGBAS,@#KISAR6 ;REMAP THE RINGS BR NXTRNG;S&; ALLOCATE AN AST BLOCK AND FILL IT IN; (17$: MOV H$TCB(R3),R5 ;GET THE TASK TCB' MOV RNGBAS,@#KISAR6 ;REMAP THE RINGS T, MOV #12,R1 ;GET THE SIZE OF OUR AST BLOCK CALL $ALOCB ;GET IT BCC 20$ ;WE GOT IT,! INC $KXPOL ;WE NEED POOL LATER6 RETURN#&20$: MOV RCVRNG,R2 ;$ALOCB TRASHED R2) MOV R0,R3 ;GET A COPY OF THE AST BLOCKM TST (R0)+ ;SKIP THE LINK WORD9 MOV #AK.GBI,(R0)+ ;GENERAL BUFFERED I/O AST ENTRY POINTU MOV $KXBAS,(R0)+ ;OUR MAPPINGR4 MOV #CPRAST,(R0)+ ;THE AST SERVICE ROUTINE ADDRESS4 MOV R$ADDR(R2),(R0) ;GET THE ADDRESS OF THE BUFFER4NXTRNG: CLR @RCVRNG ;WE'RE DONE WITH THIS RING NOW;2;INTERRUPT IF NECESSARYR;T$ TST @PRVRCV ;SHOULD WE INTERRUPT? BPL 40$ ;NO, JUST CONTINUE ( MOV $KXVC1,@#KXJQIR ;INTERRUPT THE VAX;V;NOW MOVE TO THE NEXT RING;V>40$: MOV RCVRNG,PRVRCV ;CURRENT RING IS NOW THE PREVIOUS RING/ ADD #R$SIZE,RCVRNG ;MOVE POINTER TO NEXT RING/( CMP RCVRNG,WRAPRC ;DO WE NEED TO WRAP? BNE 50$ ;NOPE, EXIT+ MOV FRSTRC,RCVRNG ;START AT THE BEGINNINGV;A8;UNBLOCK THE TASK, QUEUE THE AST, AND REQUEST SCHEDULING;R N.50$: MOV R5,R0 ;COPY THE TCB FOR $SETCR CALL( BEQ 70$ ;DON'T QUEUE AN AST IF NO TCB) BIC #TS.RSW,T.STAT(R5) ;UNBLOCK THE TASKI CALL $REQUE ;QUEUE THE ASTT!70$: JMP CPRPOL ;GO GET ANOTHERE; I; WE HAVE A VMS INITIATED COMMAND. WHATEVER HAPPENS HERE, WE'RE GOING TOAL; NEED A RING FOR SENDING INFORMATION TO VMS. IF NO SEND RING IS AVAILABLE,N; JUST EXIT, AND VMS WILL CALL US BACK WHEN IT TAKES AN ENTRY OUT OF THE RING.;AL; CURRENTLY, THE ONLY VMS INITIATED COMMAND IS A QUEUE COMMAND LINE REQUEST,M; SO WE'LL JUST DO THAT. IF WE CANNOT ALLOCATE SECONDARY POOL, OR IF THE CLIO; WAS NOT SUCCESSFULLY STARTED, RETURN THE RING WITH THE 'INSUFFICIENT DYNAMIC J; STORAGE' BIT SET.NVMSINI: & MOV RNGBAS,@#KISAR6 ;REMAP THE RINGS' TST @SNDRNG ;DO WE HAVE A SEND RING?E BMI 50$ ;NO, RINGS FULL, EXIT, MOV R$ADDR(R2),KISAR6 ;NOW REMAP THE HEADER8 BIS #HF$RSP,140000+H$FLAG ;MARK THAT THIS IS A RESPONSE8 MOV P$BLEN(R3),R1 ;GET THE LENGTH OF THE STRING BUFFER< ADD #C.CTXT+77,R1 ;ADD FIXED AREA AND ROUND TO 32 WD BLOCK0 ASH #-6,R1 ;MAKE IN00�ª{�{�Ž{´cÚµcÛ¶c�·c›’TO A 32 WORD BLOCK ADDRESS" CALL $ALSEC ;GET SECONDARY POOL$ BCS 10$ ;NO POOL, SEND BACK ERROR;T,; FILL IN FIELDS IN THE COMMAND BUFFER BLOCK;V5 MOV R0,R3 ;MOVE THE ADDRESS WHERE $BLXIO NEEDS IT W MOV #140000,R4 ;APR 6 BIAS. MOV KISAR6,-(SP) ;SAVE THE CPR BLOCK MAPPING( MOV P$BLEN(R4),R0 ;LENGTH OF TRANSFER  MOV H$TIUC(R4),-(SP) ;TI UCBE6 MOVB 140000+P$BLEN+1(R0),R2 ;GET TERMINATOR CHARACTER MOV R3,KISAR6 ;MAP THE BLOCK+ TST (R4)+ ;MOVE THE POINTER UP TO C.CTCB#. MOV $MCRPT,(R4)+ ;QUEUE PACKET TO DISPATCHER MOV (SP)+,(R4)+ ;TI UCBO MOV R0,(R4) ;CHARACTER COUNTK4 DEC (R4)+ ;THAT INCLUDED THE TERMINATOR CHARACTER CLR (R4)+ ;CLEAR STATUS WORDD CLR (R4)+ ;STARTING OFFSETM% MOVB R2,(R4)+ ;TERMINATOR CHARACTER, MOVB R1,(R4)+ ;SIZE OF PACKETG;M1; NOW MOVE THE STRING TO THE SECONDARY POOL BLOCK(;,$ MOV #120000+P$BLEN+2,R2 ;APR 5 BIAS% MOV (SP)+,R1 ;BIAS OF HEADER PACKETR# CALL $BLXIO ;AND MOVE THE STRING 0 MOV R3,R1 ;GET THE BIAS WHERE $QCPKT NEEDS IT+ CALL $QCPKT ;QUEUE THE PACKET TO THE CLI4 BCC 10$ ;IF SUCCESS, CONTINUE3 BNE 10$ ;IF NE, COULD NOT START CLI, LEAVE C SETT( CLC ;CLI WAS ACTIVE, CALL IT SUCCESS;D; SEND THE RESPONSE PACKET;M&10$: MOV RNGBAS,KISAR6 ;MAP THE RINGS- MOV RCVRNG,R0 ;ADDRESS OF THIS RECEIVE RINGO. MOV SNDRNG,R1 ;ADDRESS OF THE NEXT SEND RING" MOV 2(R0),2(R1) ;MOVE THE LENGTH" MOV 4(R0),4(R1) ;AND THE ADDRESS2 BCC 20$ ;IF IT WAS SUCCESS, DON'T SET ERROR BIT$ BIS #RF$IDS,(R1) ;MARK AS FAILURE720$: BIS #RF$SYN,(R1) ;TELL VMS THAT THIS ONE IS READY$;;;INTERRUPT IF NECESSARYE;$$ TST @PRVSND ;SHOULD WE INTERRUPT? BMI 30$ ;NO, JUST CONTINUE,( MOV $KXVC1,@#KXJQIR ;INTERRUPT THE VAX;K;NOW MOVE TO THE NEXT RING; :30$: MOV R1,PRVSND ;CURRENT RING IS NOW THE PREVIOUS RING/ ADD #R$SIZE,SNDRNG ;MOVE POINTER TO NEXT RINGG( CMP SNDRNG,WRAPSN ;DO WE NEED TO WRAP? BNE 40$ ;NOPE, EXIT+ MOV FRSTSN,SNDRNG ;START AT THE BEGINNINGS'40$: CLR R5 ;NO TASK TO QUEUE AST FORS4 BR NXTRNG ;FINISH UP WITH THIS RING - GET ANOTHER.50$: RETURN ;EXIT IF NO SEND RING AVAILABLE;T .PAGE+ .SBTTL CPRAST - KERNAL AST SERVICE ROUTINET;N+; ** - CPRAST - KERNAL AST SERVICE ROUTINEV;I; THIS ROUTINE RETURNS CONTROL TO THE TASK OR DIRECTIVE ROUTINE WITH THE W; FOLLOWING REGISTER CONTENTS:;D-; R0 ADDRESS OF BUFFER - TO BE USED IN AN APRR;N ; INPUTS:E;O; R3 ADDRESS OF AST BLOCK;H; CONTROL IS TRANSFERED TO THE TASK COMPLETION ROUTINE USING THE ROUTINE+; $MPPRO. THIS ROUTINE EXPECTS THE INPUTS:I;I; (SP) RETURN ADDRESS; 2(SP) ROUTINE ADDRESS TO CALLA; 4(SP) APR5 BIAS OF ROUTINE;TD; BY PUTTING THE APR BIASES AND THE CALLING ADDRESS UNDER THE RETURNA; ADDRESS THAT IS CURRENTLY ON THE STACK, WE CAN JUMP TO THE TASKT); COMPLETION ROUTINE RATHER THAN CALL IT.RCPRAST::( MOV R3,R0 ;SAVE THE AST BLOCK ADDRESS+ MOV 10(R3),-(SP) ;SAVE THE BUFFER ADDRESSF MOV #12,R1 ;SIZE OF AST BLOCK CALL $DEACB ;DEALLOCATE ITU! MOV (SP)+,R0 ; BUFFER ADDRESS, T! MOV R0,@#KISAR6 ;MAP THE BUFFERI$ MOV #140000,R1 ;GET A BASE ADDRESS1 MOV H$RET(R1),-(SP) ;SET UP THE ROUTINE ADDRESS* MOV 2(SP),-(SP) ;MOVE THE RETURN ADDRESS* MOV H$BIAS(R1),4(SP) ;PUT IN THE APR BIAS3 BEQ 10$ ;NO BIAS, GET THE MAPPING FROM USER APRS2 MOV H$STAT(R1),-(SP) ;PUT THE STATUS ON THE STACK+ MTPD$ @#H.DSW ;SET DIRECTIVE STATUS WORD BR 20$3410$: MOV @#UINAR5,4(SP) ;GET MAPPING FROM USER TASK$ MOV @#UISAR6,@#KISAR6 ;MAP APR6 TOO MOV @#UINAR6,@#KINAR6 ;I&DE*20$: JMP $MPPRO ;AND GO BACK TO THE TASK .PAGE/ .SBTTL CPRCON - CONNECT TI: UCB TO VMS CP: UCB-;)); CPRCON - CONNECT TI: UCB TO VMS CP: UCB-;)J; THIS ROUTINE IS CALLED BY THE $$DRV UNIT ONLINE ENTRY POINT FOR EACH TI:H; UCB. THE UCB ADDRESS AND UNIT ARE PASSED TO VMS VIA THE TPRS. THE UCBJ; ADDRESS IS WRITTEN INTO TPR2, AND THE UNIT IS WRITTEN INTO TPR3. THE VMSI; CP: DRIVER PUTS THE UCB ADDRESS IN IT'S OWN UCB WITH THE SAME UNIT, ANDRG; THEN WRITES ITS UCB ADDRESS BACK INTO TPRS 2 AND 3. SINCE THIS IS A00�²{h{töt÷tø tþfDATA H; SYSTEM ADDRESS, THE HIGH BIT IN TPR3 WILL BE SET. THIS ROUTINE WAITS C; IN A HARD LOOP FOR THE RETURN UCB, THEN PUTS IT INTO THE TI: UCB.SJ; IF THE RETURN UCB IS 000000 IN TPR2 AND 100000 IN TPR3, AN ERROR OCCURED; AND U.VUCB IS NOT FILLED IN.;E ; INPUTS:A;E; R5 TI: UCB ADDRESS; ; OUTPUTS:; ; ALL REGISTERS PRESERVED.$; VMS CP: UCB IS LOADED INTO TI: UCB0; IE.IDU IS RETURN IN $SCERR IF AN ERROR OCCURED; CPRCON:N SAVNR ;SAVE R4 AND R5K" MOV CSR,R4 ;GET THE CSR ADDRESS5 MOV #RI$CON,TPR2(R4) ;WE ARE DOING A CONNECT REQUEST ) MOV R5,TPR1(R4) ;PUT IN THE UCB ADDRESST< MOVB U.UNIT(R5),-(SP) ;TPR3 IS FUSSY ABOUT SETTING BYTES...2 CLRB 1(SP) ;..ONE AT A TIME, SO WE FIX IT ON ..! MOV (SP)+,TPR3(R4) ;..THE STACKD" MOV $KXVC1,-(SP) ;GET THE VECTOR, ADD #4,(SP) ;WE WANT THE ALTERNATE VECTOR' MOV (SP)+,@#KXJQIR ;INTERRUPT THE VAXO10$: TST TPR3(R4) ;DONE YET?  BPL 10$ ;NOPE' TST TPR2(R4) ;MIGHT THIS BE AN ERROR?  BNE 15$ ;IF NE NO) CMP #100000,TPR3(R4) ;IS THERE AN ERROR?( BEQ 30$ ;IF EQ YESN-15$: MOV TPR2(R4),U.VUCB(R5) ;MOVE TO TI: UCB & MOV TPR3(R4),U.VUCB+2(R5) ;BOTH WORDS" TSTB U.UNIT(R5) ;IS THIS UNIT 0? BNE 20$ ;NOPE, JUST EXITO- MOV TPR2(R4),SYSUCB ;THIS IS CPRSYS'S UCB -T+ MOV TPR3(R4),SYSUCB+2 ;WE'LL NEED IT LATERD 20$: RETURNE 30$: MOV #IE.IDU,$SCERR ;ERROR RETURNJ .PAGE* .SBTTL CPRALO - BUFFER ALLOCATION ROUTINE;$; CPRALO - BUFFER ALLOCATION ROUTINE;HG; THIS ROUTINE IS USED TO ALLOCATE RESOURCES TO SEND DATA FROM THE RSX NE; SYSTEM TO THE VMS SYSTEM. IF THE RESOURCES ARE NOT AVAILABLE, THE F; ROUTINE CHECKS THE FLAGS IN R0 TO DETERMINE WHAT ACTION TO TAKE. IFF; AL$XXD IS SET, THE REQUEST IS FROM THE XX DRIVER. IN THIS CASE, THEF; ROUTINE SAVES THE CONTEXT OF THE DRIVER TO RETURN WHEN RESOURCES AREI; AVAILABLE. IF AL$XXD IS NOT SET, THE TASK IS BLOCKED PENDING RESOURCE OH; AVAILABILITY. IF AL$BCK IS SET, THEN THE TASK'S PC IS BACKED UP OVER E; THE EMT INSTRUCTION SO THAT WHEN IT IS RESCHEDULED IT WILL REENTER XJ; SYSTEM STATE. IF AL$BCK IS NOT SET, THE ROUTINE RETURNS WITH CARRY SET.;OI; IF RESOURCES ARE AVAILABLE, THE BUFFER SPACE IS ALLOCATED. IF THE FLAGDD; AL$IMP IS SET, AND THE TASK INDEX IN THE TCB IS NOT FILLED IN, AN E; IMPLICIT TASK START REQUEST IS ISSUED. CPRALO WILL RETURN AS IF A IH; RESOURCE WAS UNAVAILABLE, CAUSING THE TASK TO RESCHEDULE AND CALL THISJ; ROUTINE AGAIN. THIS ROUTINE IS CALLED FROM $CPALO IN THE EXEC. IF THE G; LENGTH SPECIFIED IS ZERO, THEN NO BUFFER ALLOCATION IS DONE, BUT THE M$; AVAILABILITY OF A RING IS CHECKED.;E ; INPUTS:T;A; R0 OPERATION FLAGS:U,; AL$BCK - BACK UP PC IF ALLOCATION FAILURE3; AL$IMP - DO IMPLICIT TASK START IF NO TASK INDEXE); AL$XXD - REQUEST IS FROM THE XX DRIVERC3; R1 LENGTH OF BUFFER NECESSARY (IN 32 WORD BLOCKS)A;F ; OUTPUTS:;E7; R0 ADDRESS OF BUFFER ALLOCATED - TO BE USED IN AN APR ; R1 ACTUAL LENGTH ALLOCATED U;E;; THE LENGTH IS ALSO STORED IN THE FIRST BYTE OF THE BUFFERIF; IF THE LENGTH IS ZERO, IT IS ASSUMED THE NO BUFFER IS NECESSARY, BUT<; THE TASK WAS ONLY CHECKING FOR THE AVAILABILITY OF A RING.;U; CPRALO: ;K; FIRST CHECK FOR A RING; SAVNR ;SAVE R4 AND R5K' MOV @#KISAR6,-(SP) ;SAVE APR6 MAPPINGU$ MOV RNGBAS,@#KISAR6 ;MAP THE RINGS* TST @SNDRNG ;IS THERE A RING AVAILABLE? BPL 10$ ;YES, CONTINUED* MOV (SP)+,@#KISAR6 ;RESTORE APR6 MAPPING3 MOV #T4.LRW,R1 ;THE TASK IS BLOCKED FOR RING WAITH BR ALFAIL ;ALLOCATION FAILURE;T2; A RING IS AVAILABLE. NOW CHECK FOR BUFFER SPACE;N/10$: TST R1 ;DO WE NEED TO DO THE ALLOCATION?H# BEQ 30$ ;NOPE, JUST A RING CHECK." MOV R0,-(SP) ;SAVE THE FLAG WORD* MOV #BUFFHD,R2 ;SET UP THE POOL LISTHEAD) BIT #AL$IMP,R0 ;DO IMPLICIT TASK START?) BEQ 20$ ;NO, JUST ALLOCATE THE BUFFER @ MOV $TKTCB,R5 ;GET THE TCB( TSTB T.LBN(R5) ;IS THERE A TASK INDEX?2 BEQ IMPST ;NO, WE HAVE TO DO THE IMPLICIT START,20$: CALL $ALSC1 ;ALLOCATE A BLOCK OF POOL BCS NOPOOL ;NO POOL0 TST (SP)+ ;WE SUCCEEDED, SO DUMP FAILURE FLAG 00�º{�{�Ž{´cÚµcÛ¶c�·c›’ MOV R0,@#KISAR6 ;MAP THE BLOCK# MOVB R1,140000 ;PUT IN THE LENGTH$* MOV (SP)+,@#KISAR6 ;RESTORE APR6 MAPPING 30$: RETURNA .PAGE6 .SBTTL ALFAIL - CPR BUFFER OR RING ALLOCATION FAILURE;;L; THIS ROUTINE IS CALLED WHEN CPRALO FAILS TO ALLOCATE A RESOURCE. SEE THE M; COMMENTS AT THE BEGINNING OF CPRALO FOR A DESCRIPTION OF THE ACTIONS TAKEN.O;E;V/NOPOOL: MOV (SP)+,R0 ;RESTORE FLAG FOR FAILUREL* MOV (SP)+,@#KISAR6 ;RESTORE APR6 MAPPING5 MOV #T4.LBW,R1 ;THE TASK IS BLOCKED FOR BUFFER WAITM ;FALL THROUGH TO ALFAILALFAIL:1;0F; FIRST CHECK TO SEE IF THIS IS FROM XXDRV, WHICH IS HANDLED SPECIALLY;T- BIT #AL$XXD,R0 ;IS THIS REQUEST FROM XXDRV?R# BEQ 5$ ;NO, GO BLOCK IT NORMALLYU# BIS R1,XXWAIT ;MARK WHY WE FAILEDL( MOV 4(SP),XXBIAS ;SAVE THE XXDRV BIAS,& MOV 6(SP),XXRET ;THE RETURN ADDRESS,# MOV R5,XXR5 ;AND THE UCB ADDRESSO$ ADD #10,SP ;SKIP THE XXDRV RETURN RETURN ;AND EXIT;SP; SET THE BLOCKING BITS, INCREMENT BLOCKING COUNTS, BACK UP THE PC IF NECESSARY,; AND REQUEST RESCHEDULING;L5$: MOV $TKTCB,R5 ;GET THE TCBS- BIS #TS.RSW,T.STAT(R5) ;SET THE BLOCKING BITI TST R1 ;ANY WAIT FLAG?; BEQ 20$ ;NO, JUST EXITR3 BIS R1,T.ST4(R5) ;BIT TO TELL WHY TASK IS BLOCKEDT' CMP R1,#T4.LBW ;WAITING FOR A BUFFER?  BEQ 10$ ;IF EQ, YES, INC RINGWT ;IF NO, WAS WAITING FOR A RING BR 20$ ;AND EXIT .10$: INC BUFFWT ;INCREMENT BUFFER WAIT COUNT/20$: BIT #AL$BCK,R0 ;SHOULD WE BACK UP THE PC?, BNE 30$ ;IF NE, YES% CALL $DRWSE ;SCHEDULE ANOTHER TASK  SEC RETURNU30$:! SUB #2,$UMPC ;BACK UP USER'S PCS. MOV #$STACK-22,SP ;ALLOCATE? WHAT ALLOCATE? JMP $DRWSEA .PAGE$ .SBTTL IMPST - IMPLICIT TASK START ;,O; THIS ROUTINE IS CALLED FROM CPRALO WHEN A TCB IS DETECTED WITH NO TASK INDEX.FK; IN THIS CASE, THE TASK START PACKET IS CREATED AND SENT, AND CPRALO THEN BK; BLOCKS THE TASK AND RETURNS AS IF THERE WERE AN ALLOCATION FAILURE. THE #K; PACKET IS SENT AS A PSEUDO REQUEST, AND THE DETACHED RETURN PROCESSING IN 6; KXINT FILLS IN THE TASK INDEX AND UNBLOCKS THE TASK.;P7; THE IMPLICIT START REQUEST PACKET HAS THE PARAMETERS:H; +------------+------------+; | TASK UIC |; +------------+------------+; |DEF DIR LEN | # OF LUNS |; +------------+------------+; | DEFAULT DIRECTORY STRING| ; | |;TIMPST:;,1; FIRST FIGURE OUT HOW BIG OF A BLOCK TO ALLOCATES; 5 MOV #H$SIZE+4+77,R1 ;SIZE IN BYTES OF FIXED AREA+77E& CLR R4 ;SET UP FOR NO CONTEXT BLOCK. MOV T.CTX(R5),@#KISAR6 ;MAP THE CONTEXT BLOCK, BEQ 10$ ;IF EQ, THERE IS NO CONTEXT BLOCK* MOV #140000,R4 ;GET A BASE ADDRESS IN R4% MOVB C.DDSL(R4),R4 ;GET THE LENGTH |( ADD R4,R1 ;ADD SIZE OF DEFAULT STRING410$: ASH #-6,R1 ;MAKE INTO A 32 WORD BLOCK ADDRESS CALL $ALSC1 ;GET A BUFFER BCS NOPOOL ;ALLOCATION FAILED; ; NOW FILL IN THE BLOCKS;I2 MOV R0,R3 ;WE'LL NEED THE BIAS IN R3 FOR $BLXIO- MOV R4,R0 ;AND WE'LL NEED THE LENGTH IN R0E MOV T.PCB(R5),R2 ;GET THE PCBT& MOV P.HDR(R2),R4 ;GET HEADER ADDRESS" BNE 20$ ;IF EQ, EXTERNAL HEADER' MOV P.REL(R2),@#KISAR6 ;MAP IT IN APR6 # MOV #140000,R4 ;GET ADDRESS IN R4D.20$: MOVB H.NLUN(R4),-(SP) ;GET NUMBER OF LUNS& MOV H.DUIC(R4),-(SP) ;AND DEFAULT UIC) MOV R3,@#KISAR6 ;MAP THE COMMAND HEADER ) MOV #140000,R4 ;GET PACKET BASE ADDRESSC$ MOVB R1,(R4) ;SET THE PACKET SIZE& MOVB #HT$RUN,H$TYPE(R4) ;SET THE TYPE' CLRB H$ICNT(R4) ;CLEAR THE ITEM COUNTE( ADD #P$UIC,R4 ;START OF PARAMETER AREA MOV (SP)+,(R4)+ ;UIC" MOVB (SP)+,(R4)+ ;NUMBER OF LUNS' MOVB R0,(R4)+ ;SIZE OF DEFAULT STRINGP& MOV T.CTX(R5),R1 ;CONTEXT BLOCK BIAS# BEQ 30$ ;IF EQ, NO CONTEXT BLOCK:2 MOV #120000+C.DDS,R2 ;DEFAULT STRING DISPLACEMENT( CALL $BLXIO ;MOVE THE DEFAULT STRING ,30$: ADD #H$SIZE+4,R1 ;GET THE TOTAL LENGTH* MOV R3,R2 ;CAN'T PASS A PARAMETER IN R3 CPSEN$ #SN$PSR,R2,R1" MOV (SP)+,R0 ;GET BACK FLAG WORD, CLR R1 ;NOT WAITING ON A RING OR A BUFFER* MOV (SP)+,@#KISAR6 ;RESTORE APR6 MAPPING BR ALFAIL ;EXIT .PAGE* .SBTTL CPRDEA - DEA00�Â{h{töt÷tø tþfDATALLOCATE BUFFER SPACE; '; ** - CPRDEA - DEALLOCATE BUFFER SPACEO;XE; THIS ROUTINE DEALLOCATES AND RETURNS TO THE CPR POOL A BUFFER BLOCKR;D ; INPUTS:N;I'; R0 ADDRESS OF BLOCK TO BE DEALLOCATEDU;S=; THE FIRST BYTE OF THE BLOCK IS THE LENGTH IN 32 WORD BLOCKS2;;>; THE CORE BLOCK IS MERGED INTO THE FREE CORE CHAIN BY ADDRESS2; AND MERGED WITH ANY BORDERING BLOCKS IF POSSIBLE; ; R3, R4, R5 PRESERVED;PCPRDEA:R' MOV @#KISAR6,-(SP) ;SAVE APR6 MAPPINGX MOV R0,@#KISAR6 ;MAP THE BLOCK MOVB 140000,R1 ;GET THE LENGTH% MOV (SP)+,@#KISAR6 ;RESTORE MAPPING& MOV #BUFFHD,R2 ;SET UP POOL LISTHEAD4 CALL $DESC1 ;DEALLOCATE THE POOL BLOCK AND RETURN3 MOV #BUFFWT,R2 ;COUNT OF TASKS REQUIRING A BUFFERS" MOV #T4.LBW,R1 ;FLAG TO LOOK FOR ;FALL THROUGH TO UNBLOK .PAGE8 .SBTTL UNBLOCK - UNBLOCK TASKS WHEN A RESOURCE IS FREED;WK; THIS ROUTINE IS CALLED WHEN A RESOURCE IS FREED. IT IS CALLED BY CPRDEA,RH; WHEN A BUFFER IS RELEASED, AND BY KXINT, WHEN AN INTERRUPT IS RECEIVEDH; INDICATING THAT A SEND RING HAS BEEN FREED UP. THE ROUTINE IS ENTERED; WITH THE INPUTS:;E(; R1 BUFFER WAIT FLAG (T4.LRW OR T4.LBW);; R2 ADDRESS OF RESOURCE WAIT COUNT WORD (BUFFWT OR RINGWT)S;R;IN; FIRST CHECK IF ANY TASKS ARE WAITING FOR THIS RESOURCE. IF THEY ARE, SEARCHN; THE ACTIVE TASK LIST, CLEARING THE BIT WHEN FOUND UNTIL THE COUNT GOES TO 0.L; ON THE FIRST TASK FOUND WAITING (WHICH WILL BE THE HIGHEST PRIORITY), CALL; $SETCR TO SCHEDULE THE TASKN;WUNBLOK:R1 TST (R2) ;ANY TASKS WAITING FOR THIS RESOURCE?  BEQ 40$ ;NO, CHECK XXDRVS4 CLR -(SP) ;FLAG TO TELL IF $SETCR HAS BEEN CALLED* MOV $ACTHD,R0 ;GET THE FIRST ACTIVE TASK*10$: BIT R1,T.ST4(R0) ;THIS TASK WAITING? BEQ 20$ ;NO, TRY THE NEXT ONE) BIC R1,T.ST4(R0) ;CLEAR THE WAITING BITE, BIC TS.RSW,T.STAT(R0) ;AND THE BLOCKING BIT' TST (SP) ;HAVE WE CALLED $SETCR YET? $ BNE 15$ ;YES, DON'T CALL IT AGAIN+ MOV R2,-(SP) ;SAVE THE WAIT COUNT ADDRESSR" MOV R1,-(SP) ;SAVE THE WAIT FLAG% CALL $SETCR ;CALL FOR A RESCHEDULET% MOV (SP)+,R1 ;RESTORE THE WAIT FLAGX% MOV (SP)+,R2 ;AND THE COUNT ADDRESST" INC (SP) ;MARK THAT WE DID THIS$15$: DEC (R2) ;DECREMENT THE COUNT BEQ 30$ ;IF IT'S ZERO, EXIT120$: MOV T.ACTL(R0),R0 ;GET THE NEXT ACTIVE TASK  BR 10$ ;AND GO CHECK AGAINT,30$: TST (SP)+ ;POP THE FLAG OFF THE STACK940$: BIT R1,XXWAIT ;WAS XXDRV WAITING FOR THIS RESOURCE?L BEQ 45$ ;IF EQ NO, JUST EXITT& BIC R1,XXWAIT ;CLEAR THE BUFFER WAIT- BNE 45$ ;IF XXWAIT ISN'T CLEAR, THE OTHER R+ ;RESOURCE IS BUSY ALSO, SO JUST RETURNF1 CMP #T4.LBW,R1 ;WAS THIS A BUFFER DEALLOCATION?( BNE 50$ ;NO, GO CALL XXDRV55 CMP XXBIAS,4(SP) ;WAS THIS A CPDEA CALL FROM XXDRV?  BNE 50$ ;NO, GO CALL XXDRV0245$: RETURN ;CALL WAS FROM XXDV, JUST RETURN TO! ;AVOID MULTIPLE CALL NESTINGO;H"; SET UP AND JUMP TO THE XXDRIVER ;T250$: MOV (SP),R5 ;GET THE CURRENT RETURN ADDRESS- MOV XXBIAS,(SP) ;SET UP THE BIAS FOR $MPPROT) MOV XXRET,-(SP) ;AND THE RETURN ADDRESS 7 MOV R5,-(SP) ;MOVE ORIGINAL RETURN ADDRESS FOR $MPPROR MOV XXR5,R5 ;RESTORE R5) SEC ;TELL XXDRV THE ALLOCATION FAILED; JMP $MPPRO ;CALL THE DRIVER .PAGE( .SBTTL CPRSEN - SEND RING ENTRY TO VMS;;&; ** - CPRSEN - SEND RING ENTRY TO VMS;SG; THIS ROUTINE FILLS IN COMMON FIELDS IN THE HEADER AND THEN SENDS THE G; FILLED-IN HEADER-ITEM BUFFER TO VMS. THE ALLOCATION ROUTINE MUST BE UI; CALLED BEFORE THIS ROUTINE, IN THE SAME FORK PROCESS, TO INSURE THAT A )E; RING IS AVAILABLE. IF A NEW SHARED MEMORY BASE IS SPECIFIED, THIS SE; ROUTINE CHANGES THE SHARED MEMORY BASE AND INCREMENTS THE COUNT OF A/; OUTSTANDING REQUESTS FOR LOWERED MEMORY BASE..;E?; THE BITS IN THE OPCODE FIELD DETERMINE THE FOLLOWING ACTIONS:E;R ; BIT ACTIONS;S8; SF$BLK THE TASK IS BLOCKED PENDING REQUEST COMPLETION@; SF$BIA THE BIAS OF THE CALLING ROUTINE IS SAVED IN THE HEADER;; SF$HDR COMMON FIELDS ARE FILLED IN IN THE REQUEST HEADEREB; SF$IRT DON'T STORE RETURN ADDRESS IN HEADER, RETURN IMMEDIATELY(; SF00�Ê{�{�Ž{´cÚµcÛ¶c�·c›’$RSP SET RESPONSE BIT IN FLAGS WORD@; SF$AST AN KERNAL AST MUST BE USED TO LOAD TASK CONTEXT BEFORE7; CONTROL IS TRANSFERRED TO THE COMPLETION ROUTINE!; SF$DRF CALL DRFIN WHEN EXITINGD;R$; THE FOLLOWING OPCODES ARE DEFINED:;A9; SN$TSK SF$BLK!SF$HDR!SF$AST CALLED BY PRIVILEGED TASKSOE; SN$DIR SF$BLK!SF$HDR!SF$BIA!SF$AST!SF$DRF CALLED BY EXEC DIRECTIVESDB; SN$IMP SF$BLK!SF$HDR!SF$BIA!SF$AST CALLED BY IMPLICIT DIRECTIVES(; SN$QIO SF$BIA!SF$HDR CALLED BY $$DRV>; SN$PSR SF$BLK!SF$HDR!SF$IRT PSEUDO REQUEST BY OTHER ROUTINE0; SN$RSP SF$RSP!SF$IRT RESPOND TO VMS COMMANDS;O ; INPUTS:E; G; THIS ROUTINE IS CALLED BY THE MACRO CPSEN$ WHICH SETS UP THE STACK INF; THE FOLLOWING MANNER:H;O-; (SP) RETURN ADDRESS TO CPCALL EXEC MODULEL,; 2(SP) CALLING ROUTINE'S D SPACE APR5 BIAS,; 4(SP) CALLING ROUTINE'S I SPACE APR5 BIAS); 6(SP) CALLING ROUTINE'S RETURN ADDRESSF; 10(SP) OPCODET; 12(SP) BUFFER ADDRESST; 14(SP) BUFFER LENGTH1; 16(SP) NEW BASE OF SHARED MEMORY (IGNORED IF 0)R; ;D ; OUTPUTS:;H; THE RING IS SENT TO VMS!); THE TASK IS BLOCKED PENDING COMPLETION.UD; THE CALLING ROUTINE'S RETURN ADDRESS IS REMOVED FROM THE STACK AND; STORED IN THE HEADER. .ENABL LSB CPRSEN:T; %; FILL IN COMMON FIELDS IN THE HEADER);L% MOV 12(SP),@#KISAR6 ;MAP THE BUFFERS& MOV #140000,R2 ;USE R2 TO MAP HEADER) BIT #SF$RSP,10(SP) ;IS THIS A RESPONSE?1 BEQ 117$ ;NO, WE NEED TO SET UP COMMAND PACKET)) BIS #HF$RSP,H$FLAG(R2) ;SET RESPONSE BIT , BR 20$ ;JOIN COMMON CODE TO SEND THE RING1117$: CLR H$FLAG(R2) ;CLEAR THE HEADER FLAG WORD * CLR R0 ; R0 WILL BE THE RING FLAGS WORD;E#; ADJUST SHARED MEMORY IF NECESSARYK;D8; MOV 16(SP),R1 ; ARE WE MOVING THE SHARED MEMORY BASE? ; BEQ 5$ ; NOPE, JUST CONTINUE2; INC SHRCNT ; KEEP COUNT OF TASKS CHANGING THIS=; BIS #HF$SHR,H$FLAG(R2) ; INDICATE THIS REQUEST CHANGED THIS;); BIC #77,R1 ; CLEAR OUT LOW ORDER BITSE2; ADD QBASE,R1 ; MAKE IT INTO AN ADDRESS FOR CSRF8; CMP R1,@#KXCSRF ; IS THE NEW BASE LOWER THAN THE OLD?; BHIS 5$ ; NO, JUST CONTINUEC0; MOV R1,@#KXCSRF ; AND PUT THE ADDRESS IN CSRF*; MOV $SYSIZ,@#KISAR6 ; GET TOP OF MEMORY#; DEC @#KISAR6 ; BACK UP ONE BLOCKR1; MOV 16(SP),140066 ; MARK BASE OF SHARED MEMORY$); MOV 12(SP),@#KISAR6 ; REMAP THE BUFFERK;5$:$ MOV $TKTCB,R5 ;GET THE CURRENT TCB3 BIT #SF$AST,10(SP) ;WILL WE NEED TO QUEUE AN AST? BEQ 3$ ;NOPE, JUST CONTINUE, BIS #HF$AST,H$FLAG(R2) ;SET THE HEADER FLAG83$: BIT #SF$BLK,10(SP) ;ARE WE GOING TO BLOCK THE TASK? BEQ 31$ ;NOPE( BIS #HF$BLK,H$FLAG(R2) ;MARK AS BLOCKED! BIS #TS.RSW,T.STAT(R5) ;BLOCK IT 31$::; BIT #SF$HDR,10(SP) ;SHOULD WE SET UP THE HEADER FIELDS?; BEQ 6$ ;NO, SKIP THIS PART( MOV R5,H$TCB(R2) ;PUT IT IN THE HEADER- MOVB T.LBN(R5),H$TKI(R2) ;GET THE TASK INDEX: MOV T.UCB(R5),R3 ;GET TI: UCBT) MOV R3,H$TIUC(R2) ;PUT IT IN THE HEADER 1 BITB #HT$SYS,H$TYPE(R2) ;IS THIS PKT FOR CPRSYS?S& BNE 4$ ;YES, USE THE UCB FOR CPRSYSA MOV U.VUCB(R3),H$VUCB(R2) ; NO, GET THE VMS UCB FROM THE TI: UCB$+ MOV U.VUCB+2(R3),H$VUCB+2(R2) ; BOTH WORDSO BR 6$ ;JOIN COMMON CODE-4$: MOV SYSUCB,H$VUCB(R2) ;GET THE CPRSYS UCB & MOV SYSUCB+2,H$VUCB+2(R2) ;BOTH WORDS*6$: CLR H$BIAS(R2) ;ASSUME NO BIAS STORED6 BIT #SF$BIA,10(SP) ;DO WE WANT TO SAVE THE APR BIAS? BEQ 7$ ;NO, IT'S A TASK) MOV 4(SP),H$BIAS(R2) ;SAVE THE APR5 BIAS ,7$: CLR H$RET(R2) ;ASSUME NO RETURN ADDRESS' BIT #SF$IRT,10(SP) ;IMMEDIATE RETURN? * BNE 20$ ;YES, DON'T SAVE RETURN ADDRESS. MOV 6(SP),H$RET(R2) ;SAVE THE RETURN ADDRESS V;+; FILL IN THE RING;T(20$: MOV RNGBAS,@#KISAR6 ;MAP THE RINGS, MOV SNDRNG,R3 ;GET THE ADDRESS OF THE RING MOV R0,(R3)+ ; FLAGS MOV 14(SP),(R3)+ ; LENGTHS MOV 12(SP),(R3)+ ; ADDRESS6 BIS #RF$SYN,@SNDRNG ;TELL VMS THAT THIS ONE IS READY;Q;INTERRUPT IF NECESSARYM;4$ TST @PRVSND ;SHOULD WE INTERRUPT? BMI 30$ ;NO, JUST CONTINUEE( MOV $KXVC1,@#KXJQIR ;INTERRUPT THE VAX; ;NOW MOVE TO THE NEXT RING;T>30$: MOV SNDRNG,PRVSND ;CURRENT RING IS NOW THE00�Ò{‘Ý{töt÷tø tþfDATA PREVIOUS RING/ ADD #R$SIZE,SNDRNG ;MOVE POINTER TO NEXT RINGR( CMP SNDRNG,WRAPSN ;DO WE NEED TO WRAP? BNE 40$ ;NOPE, EXIT+ MOV FRSTSN,SNDRNG ;START AT THE BEGINNINGP;RC; NOW WE HAVE TO FIX THE STACK, AND RETURN. THERE ARE THREE CASES:T; B; 1) A DIRECTIVE. PULL EVERYTHING OFF THE STACK BUT THE DSW, CALLC; $DRFIN TO FINISH THE DIRECTIVE, AND CALL $DRWSE TO RESCHEDULE.$C; 2) A $SWSTK CALL. PULL EVERYTHING OFF THE STACK AND CALL $DRWSE.TE; 3) A PSEUDO REQUEST. PULL THE PARAMETERS OFF THE STACK AND RETURN.#;I/40$: BIT #SF$IRT,10(SP) ;SHOULD WE RETURN NOW?N. BNE 50$ ;IF NE, YES, GO PULL THE PARAMETERS" BIT #SF$DRF,10(SP) ;CALL $FINDR?( BNE 45$ ;IF NE, YES, SET UP AND CALL 7 MOV #$STACK-22,SP ;GET RID OF EVERYTHING ON THE STACK)' JMP $DRWSE ;SCHEDULE SOMETHING ELSE A45$:6 MOV #$STACK-24,SP ;GET RID OF EVERYTHING BUT THE DSW' MOV (SP),-(SP) ;MOVE THE DSW DOWN ONET6 MOV #$DRWSE,2(SP) ;SCHEDULE SOMETHING ELSE WHEN DONE JMP $FINDR ;GO TO $DRFINL<50$: MOV (SP),10(SP) ;THE TOP FOUR ELEMENTS ON THE STACK..., MOV 2(SP),12(SP) ;...NEED TO BE MOVED DOWN MOV 4(SP),14(SP) ;...A MOV 6(SP),16(SP) ;...(3 ADD #10,SP ;AND THEN SKIP THE REST OF THE PARAMSD RETURN .DSABL LSB,KXINI:: KXCAN::TKXOUT::HKXPWF:: RETURNS .ENDHEDULE SOMETHING ELSE A45$:6 MOV #$STACK-24,SP ;GET RID OF EVERYTHING BUT THE DSW' MOV (SP),-(SP) ;MOVE THE DSW DOWN ONET6 MOV #$DRWSE,2(SP) ;SCHEDULE SOMETHING ELSE WHEN DONE JMP $FINDR ;GO TO $DRFINL<50$: MOV (SP),10 - Pointer to first location past the included timestamp W; CS:e3X; No block was allocated, R0,R1 are indeterminateoY; LZ; The first word of the primary pool block contains the forward pointer inN[; the listhead. The second word contains the length of the block to be usedL\; when the block is deallocated. Subsequent data in the block will become]; error location dependent. ; %^; R2 - R5 are saved across the call _;- `$ALOC::r/a TST $SHERR ;Is the file debugging turned onb SEC ;Assume not turned on#c BEQ 50$ ;If EQ, no, simply exit 6d CMP #<10.*2>,R1 ;See if there is a big enough spacee SEC ;Assume failure4f BHI 50$ ;If HI, not enough space to do timestamp(g MOV R2,-(SP) ;Save R2 across the call1h CALL $ALOCB ;Allocate a chunk of primary poolh5i BCS 45$ ;If CS, not able to allocate, skip actiono7j MOV R0,-(SP) ;Zero the block out before copying data-k MOV R1,-(SP) ;sl5$: CLRB (R0)+ ;Am SOB R1,5$ ;Hn MOV (SP)+,R1 ;eo MOV (SP)+,R0/p MOV R1,2(R0) ;Put in the length of the block 5q MOVB (SP),3(R0) ;Put in operation code on top bytei2r MOV R0,R1 ;Copy address of block for insertion:s MOV #$SHLIM,R0 ;Address of listhead to be inserted into;t CALL $QINSF ;Insert entry into processing task listheadh2u MOV R1,-(SP) ;Save address of block across call4v MOV $SHERR,R0 ;Get TCB address of processing task,w CALL $EXRQU ;Request the processing task5x MOV (SP)+,R0 ;Set up address of primary pool block+#y ADD #4,R0 ;Point past size word(1z MOV #$TTNS-14,R2 ;Point to current time vector3<{10$: MOV (R2)+,(R0)+ ;Insert time parameter in task buffer%| CMP R2,#$TTNS ;Any more to insert?#} BLOS 10$ ;If LOS, yese(~ MOV $TKPS,(R0)+ ;Set ticks per second CLC ;Indicate success€45$: MOV (SP)+,R2 ;Restore R2S9� MOV R0,$SHLOS ;Store the pointer position of the block ,‚ MOV 4(SP),R5 ;Restore registers for $COPYƒ MOV 6(SP),R4 ;n„ MOV 10(SP),R3 ;… MOV 12(SP),R2 ;† MOV 14(SP),R1 ;‡ MOV 16(SP),R0 ; ˆ50$: RETURNw‰Š;+O‹; $COPY - Routine to put a series of parameters into the previously allocatedmHŒ; primary pool block. This routine also places the starting address ofF�; the block of data into the primary pool packet. This size must beEŽ; be reflected in the total SIZE attribute of the MESAG$ macro, but;3�; not in the individual size values inside the <>)�;R ‘; Inputs:e8’; $SHLOS - Pointer to next word of free space in block9“; 2(SP) - Size in bytes of data to be moved into block.0(”00‘â{�{�Ž{´cÚµcÛ¶c�·c›’; 4(SP) - Address of data to be dumped•;tL–; Due to the nature of the CS from $PTMSG and nothing but MOV instructionsM—; between the routine calls, the BCS at the start of this routine cannot betN˜; moved without destroying random locations in memory if $PTMSG/$ALOC fails.™;- š$COPY::E1› BCS 30$ ;If CS, $PTMSG failed for some reasonl*œ MOV R0,-(SP) ;Save R0,R1,R2 across call� MOV R1,-(SP) ; ž MOV R2,-(SP) ;p1Ÿ MOV 10(SP),R1 ;Get address of data to be movedb+  MOV 12(SP),R2 ;Get byte size to transferd5¡ MOV $SHLOS,R0 ;Get address of block to transfer to ,¢ INC R2 ;Round up to even number of bytes3£ BIC #177401,R2 ; also get rid of data type codef¤ ASR R2 ;Turn into words #¥ BEQ 20$ ;If none, skip transferi9¦ MOV R1,(R0)+ ;Move in the starting address of the dataB>§ MOVB R2,(R0)+ ;Put number of words and type code in packet ¨ MOVB 13(SP),(R0)+ ;5©10$: MOV (R1)+,(R0)+ ;Move rest of data into packetPª SOB R2,10$ ;:«20$: MOV R0,$SHLOS ;Update the pointer to next free byte"¬ MOV (SP)+,R2 ;Restore registers­ MOV (SP)+,R1 ;f® MOV (SP)+,R0 ;;.¯ CLC ;Make sure next pass makes it through2°30$: MOV (SP)+,2(SP) ;Gimmick the return address:± MOV (SP),(SP)+ ;Pop off size value and retain carry bit ² RETURN ³´ .PAGEµ;nN¶; TTMSG - ROUTINE TO DUMP SINGLE CHARACTER DATA OUT TO THE CONSOLE TERMINAL·; ¸.TTMSG::"¹ MOV R0,-(SP) ;SAVE R0 FOR LATER"º MOV R1,-(SP) ;SAVE R1 FOR LATER/» MOV 6(SP),R1 ;PICK UP ADDRESS OF OUTPUT TEXTp#¼ MTPS #PR7 ;LOCK OUT INTERRRUPTS+:½ MOV KISAR5,-(SP) ;SAVE CONTEXT OF POSSIBLE DATA MAPPING1¾ MOV KINAR5,KISAR5 ;MAP THE TEXT FOR THE OUTPUT-¿10$: MOVB (R1)+,R0 ;GET NEXT BYTE TO OUTPUTeÀ BEQ 30$ ;IF EQ DONEp,Á MOVB R0,TPS+2 ;LOAD BYTE IN OUTPUT BUFFERÂ20$: TSTB TPS ;PRINTER BUSY? &à BCS 30$ ;IF CS NO CONSOLE TERMINALÄ BPL 20$ ;IF PL YESÅ BR 10$ ;GO AGAIN#Æ30$: MTPS #0 ;RESTORE INTERRUPTS-Ç MOV (SP)+,KISAR5 ;RESTORE ORIGINAL MAPPING)È MOV (SP)+,R1 ;RESTORE R1TÉ MOV (SP)+,R0 ;RESTORE R0U9Ê MOV (SP)+,(SP) ;COPY RETURN ADDRESS OVER INPUT ADDRESSL Ë RETURNIÌÍ .ENDC ; D$$CHE!CHEDBGÍ .IF DF CHESANÍ;+NÍ; .CRSAN - ROUTINE TO CREATE A DATA BLOCK CONTAINING THE DEVICE UCB ADDRESS,HÍ; STARTING LBN, AND SIZE OF THE REQUEST BEING SET UP. THIS BLOCK WILLFÍ; BE HUNG OFF THE CED WHEN IT IS DECLARED DEFERRED. WHEN THE CED ISFÍ; EVENTUALLY WRITTEN TO DISK, A CORRESPONDING ROUTINE WILL VALIDATE GÍ; AGAINST THESE PARAMETERS, DELETE THE BLOCK, AND CRASH IF THEY DON'TR Í; MATCH.Í; Í; INPUTS:P(Í; R1 - I/O PACKET FOR INCOMING REQUEST,Í; I.PRM+P4(P5) -> STARTING LBN OF REQUEST"Í; R4 - POINTER TO ASSOCIATED CEDÍ; R5 - UCB ADDRESS OF DEVICEÍ;IÍ; ALL REGISTERS ARE PRESERVEDTÍ;- Í.CRSAN::%Í TST E.MBXC(R4) ;ALREADY ALLOCATEDL#Í BNE 30$ ;IF NE, YES, SKIP THISN4Í MOV R5,-(SP) ;SAVE ALL REGISTERS ACROSS THE CALLÍ MOV R4,-(SP) ;Í MOV R3,-(SP) ;Í MOV R2,-(SP) ;Í MOV R0,-(SP) ;Í MOV R1,-(SP) ;6Í CALL $ALPKT ;ALLOCATE A PACKET THE SIZE OF AN I/OÍ BCC 10$ ;IF CC, SUCCESSFULO(Í CLR R0 ;INDICATE NO BLOCK TO ASSIGNÍ BR 20$ ;JOIN COMMON CODE-4Í10$: MOV 12(SP),(R0) ;MOVE UCB ADDRESS INTO BLOCK-Í MOV (SP),R1 ;GET BACK I/O PACKET ADDRESS3Í MOV I.PRM+P5(R1),2(R0) ;GET LSP OF LBN IN PACKETL&Í CLR 4(R0) ;INITIALIZE BYTE OF MSP*Í BISB I.PRM+P4(R1),4(R0) ;GET MSP OF LBN-Í20$: MOV 10(SP),R4 ;RESTORE ADDRESS OF CED;6Í MOV R0,E.MBXC(R4) ;INITIALIZE POINTER TO NEW BLOCK#Í MOV (SP)+,R1 ;RESTORE REGISTERSCÍ MOV (SP)+,R0 ;Í MOV (SP)+,R2 ;Í MOV (SP)+,R3 ;Í MOV (SP)+,R4 ;Í MOV (SP)+,R5 ; Í30$: RETURNIÍÍÍ;+JÍ; .CKSAN - ROUTINE TO VALIDATE THE PARAMETERS STORED IN THE SANITY BLOCKFÍ; CONNECTED TO THE CED OF A DEFERRED WRITE AT THE TIME IT WAS MARKED Í; DEFERRED.RÍ;) Í; INPUTS:E'Í; R0 - CED ADDRESS OF DEFERRED EXTENT;%Í; R1 - I/O PACKET OF INTERNAL WRITER,Í; R5 - UCB ADDRESS OF DEVICE GETTING WRITEÍ;IÍ; ALL REGISTERS ARE PRESERVEDVÍ;- Í.CKSAN::$Í MOV R00‘ê{’ñ{töt÷tø tþfDATA5,-(SP) ;SAVE ALL REGISTERSÍ MOV R4,-(SP) ;Í MOV R3,-(SP) ;Í MOV R2,-(SP) ;Í MOV R1,-(SP) ;Í MOV R0,-(SP) ;0Í MOV E.MBXC(R0),R4 ;GET POINTER TO DATA BLOCK#Í BEQ 20$ ;IF EQ, ASSUME CORRECTO/Í CLR E.MBXC(R0) ;CLEAR POINTER TO DATA BLOCKE#Í CMP R5,(R4) ;DO THE UCBS MATCHÍ BNE 10$ ;IF NE, NO, ERROR8Í CMP 2(R4),I.PRM+P5(R1) ;DOES THE LSP OF THE LBN MATCHÍ BNE 10$ ;IF NE, NO, ERROR0Í CMPB 4(R4),I.PRM+P4(R1) ;MSP OF THE LBN MATCHÍ BEQ 20$ ;IF NE, NO, ERRORÍ10$: BPT ;CRASH THE SYSTEM,Í20$: MOV R4,R0 ;ELIMINATE THE DATA BLOCKÍ CALL $DEPKT ;+Í MOV (SP)+,R0 ;RESTORE ALL THE REGISTERSXÍ MOV (SP)+,R1 ;Í MOV (SP)+,R2 ;Í MOV (SP)+,R3 ;Í MOV (SP)+,R4 ;Í MOV (SP)+,R5 ; Í RETURNOÍÍÍ;+KÍ; .CKUCB - ROUTINE TO MAKE SURE R5 GOING INTO $DRQRQ MATCHES THE VALUE IN2Í; THE I/O PACKETÍ;H Í; INPUTS:L+Í; R1 - I/O PACKET ADDRESS GOING TO DRIVERC9Í; R5 - UCB ADDRESS BEING GIVEN TO DRIVER CALL AT $DRQRQ;Í;- Í.CKUCB::2Í CMP I.UCB(R1),R5 ;DOES THE UCB ADDRESSES MATCHÍ BEQ 10$ ;IF EQ, YESÍ BPT ;STOP THINGS HERE( Í10$: RETURNRÍÍ;+MÍ; .CKIOP - ROUTINE TO VALIDATE THE ORIGINAL AND DUPLICATE I/O PACKETS BEING(,Í; USED TO WRITE CACHE DATA OUT TO THE DISKÍ; Í; INPUTS:U/Í; R1 - I/O PACKET ABOUT TO BE GIVEN TO DRIVERT1Í; R5 - UCB ADDRESS OF DEVICE PACKET IS GOING TONÍ;- Í.CKIOP::,Í MOV R0,-(SP) ;SAVE REGISTERS ACROSS CALLÍ MOV R1,-(SP) ;Í MOV R4,-(SP) ;4Í MOV KISAR5,-(SP) ;SAVE MAPPING REGISTERS AS WELLÍ MOV KISAR6,-(SP) ;3Í MOV I.AADA(R1),R4 ;POINT TO ORIGINAL I/O PACKETR5Í CALL .CKUCB ;SEE IF THE DUPLICATE MATCHES R5 UCBA<Í CMP I.UCB(R1),I.UCB(R4) ;SEE IF I/O PACKETS AGREE ON UCBSÍ BNE 50$ ;IF NE, CRASHHÍ CMPB I.PRM+P4(R1),I.PRM+P4(R4) ;DO THE STARTING LBNS AGREE IN PACKETSÍ BNE 50$ ;IF NE, NO CRASHE"Í CMP I.PRM+P5(R1),I.PRM+P5(R4) ;Í BNE 50$ ;AÍ MOV I.PRM+P6.1(R4),R4 ;GET CED ADDRESS ASSOCIATED WITH REQUEST,)Í CALL MAPPAR ;MAP THE CACHE PARTITIONGCÍ CMPB I.PRM+P4(R1),E.LBNL-1(R4) ;IS THE LBN WITHIN THE CED VALUESIÍ BLO 50$ ;IF LO,NO, CRASHC$Í BHI 10$ ;IF HI, YES, DEFINITELY8Í CMP I.PRM+P5(R1),E.LBNL(R4) ;DOES THE LOWER VALUE FITÍ BLO 50$ ;IF LO, NO59Í10$: MOV I.PRM+P2(R1),R0 ;GET SIZE OF REQUEST IN BYTESH#Í ADD #777,R0 ;CONVERT TO BLOCKSB Í ROR R0 ;,Í SWAB R0 ;Í BIC #177400,R0 ;2Í DEC R0 ;DECREMENT COUNT BY ONE FOR COMPARISON=Í MOV I.PRM+P5(R1),-(SP) ;CALCULATE HIGHEST LBN IN CED RANGE Í MOV I.PRM+P4(R1),-(SP) ; (Í ADD R0,2(SP) ;ADD IN SIZE OF REQUEST)Í ADC (SP) ;ADD THE CARRY IF NECESSARY 8Í CMPB (SP)+,E.LBNH+2(R4) ;IS THE LBN WITHIN HIGH RANGEÍ BHI 50$ ;IF HI, NOTÍ BLO 60$ ;IF LO, YESÍ CMP (SP)+,E.LBNH(R4) ;M"Í BLO 70$ ;IF LO, EVERYTHING OKÍ50$: BPT ;CRASH HERE,6Í60$: TST (SP)+ ;POP THE EXTRA WORD FROM COMPARISON3Í70$: MOV (SP)+,KISAR6 ;RESTORE MAPPING REGISTERSBÍ MOV (SP)+,KISAR5 ;-Í MOV (SP)+,R4 ;RESTORE THE SAVED REGISTERSIÍ MOV (SP)+,R1 ;Í MOV (SP)+,R0 ; Í RETURNRÍÍÍ .ENDC ;CHESANQÎ .ENDADC (SP) ;ADD THE CARRY IF NECESSARY 8Í CMPB (SP)+,E.LBNH+2(R4) ;IS THE LBN WITHIN HIGH RANGEÍ BHI 50$ ;IF HI, NOTÍ BLO 60$ ;IF LO, YESÍ CMP (SP)+,E.LBNH(R4) ;M"Í BLO 70$ ;IF LO, EVERYTHING OKÍ50$: BPT ;CRASH HERE,6Í60$: TST (SP)+ ;POP THE EXTRA WORD FROM COMPARISON3Í70$: MOV (SP)+,KISAR6 ;RESTORE MAPPING REGISTERSBÍ MOV (SP)+,KISAR5 ;-Í MOV (SP)+,R4 ;RESTORE THE SAVED REGISTERSIÍ MOV (SP)+,R1 ;Í/ .TITLE XXDRV - GENERAL DEVICE INTERFACE DRIVERe .IDENT /1.02/;d; COPYRIGHT (C) 1987 BY); DIGITAL EQUIPMENT CORPORATION, MAYNARD:(; MASSACHUSSETTS. ALL RIGHTS RESERVED.;t5; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAYæ5; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE5; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THEÐ5; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER½5; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE5; MADE AVAILABLE TO ANY OTHER PERSON. 00’ò{�{�Ž{´cÚµcÛ¶c�·c›’NO TITLE TOX5; AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED.;(5; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO5; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUEDF5; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ;D6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR 5; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT ISI; NOT SUPPLIED BY DIGITAL.;N%; KAREN L. NOEL AND PAUL K. M. WEISS E;O; MODIFICATIONS:;); V1.02 KLN - ADD XXCAN ENTRY POINT CODEO;T; MACRO LIBRARY CALLSI; * .MCALL HWDDF$,PKTDF$,SCBDF$,UCBDF$,CPRDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS SCBDF$ ,,1 ;SCB DEFINITIONSH% UCBDF$ ;UNIT CONTROL BLOCK OFFSETS $ PKTDF$ ;DEFINE I/O PACKET OFFSETS# CPRDF$ ;CPR SPECIFIC DEFINITIONSI;A; DEVICE DISPATCH TABLEL;  DDT$ XX,1,,,,NEW=Y;B; LOCAL SYMBOLSF;R MAP6 = 140000 .PAGE' .SBTTL XXUCB - UNIT ONLINE ENTRY POINT.&; ** - XXUCB - UNIT ONLINE ENTRY POINT;ID; FOR TT: UCBS WHICH ARE IN THE GENERIC DATA BASE, CALL THE ROUTINE E; $CPRCN TO ASSOCIATE THE TT: UCB WITH A CORRESPONDING VMS CP: UCB: !; FOR ALL OTHER UCBS, JUST RETURN ; *; SET UNIT MOUNTED (IF A MOUNTABLE DEVICE);C ; INPUTS:; F; R5 UCB ADDRESS; C=1 TRANSITION TO OFFLINE; C=0 TRANSITION TO ONLINE;I ; OUTPUTS:;L/; IE.DNR IS SET IN $SCERR IF OFFLINE TRANSITIONF;RXXUCB::  BCC 3$ ;IF CC ONLINE REQUEST * MOV #IE.DNR,$SCERR ;SET DEVICE NOT READY BR 10$ ;AND RETURNI3$: I; CHECK FOR UNIT ALREADY ONLINE SO WE DON'T DO THE CONNECT MORE THAN ONCE ;O- BITB #US.OFL,U.ST2(R5) ;UNIT ALREADY ONLINE?U BEQ 10$ ;IF EQ YES ; M; ONLY CALL THE CONNECT ROUTINE IF THE UNIT IS A REAL UNIT, NOT A GENERIC ONE ;*5$: MOV U.DCB(R5),R0 ;GET THIS UNIT'S DCB+ CMPB #377,D.UNIT(R0) ;IS IT A GENERIC DCB:% BEQ 10$ ;IF EQ YES - DON'T CONNECTI' JMP $CPCON ;CALL THE CONNECT ROUTINEI 10$: RETURNE .PAGE5 .SBTTL XXKRB - CONTROLLER ONLINE/OFFLINE ENTRY POINTA3; ** - XXKRB- CONTROLLER ONLINE/OFFLINE ENTRY POINTW;O ; INPUTS:C; T; R2 KRB ADDRESS; C=1 TRANSITION TO OFFLINE; C=0 TRANSITION TO ONLINE; ; OUTPUTS:;/; IE.DNR IS SET IN $SCERR IF OFFLINE TRANSITIONS;RXXKRB:: BCC 10$ ;IF CC ONLINE REQUEST* MOV #IE.DNR,$SCERR ;SET DEVICE NOT READY 10$: RETURNI$XXINT:: .PAGE( .SBTTL XXINI - INITIATE I/O ENTRY POINT'; ** - XXINI - INITIATE I/O ENTRY POINT:;T ; INPUTS:A; .; R4 = SCB ADDRESSL; R5 = UCB ADDRESS ;O ; OUTPUTS:;X;; IF RESOURCES ARE AVAILABLE, THE REQUEST IS DEQUEUED AND ); PROCESSED ACCORDING TO THE DEVICE TYPE.O;FXXINI::=;R; FINISH DIRECTIVE - ;U+ MOV #$STACK-24,SP ;POINT SP AT STATUS WORDI; F; (NOTE TO BENNY: THE FOLLOWING CODE WAS STOLEN FROM $DRFIN IN DRDSP);$A; INCREMENT GROUP GLOBAL USE COUNTS (OR SCRATCH WORD IF DIRECIVESB; DON'T USE GROUP GLOBALS);P .IF DF G$$GEF/ INC @$GEFPT ;INCREMENT GROUP GLOBAL USE COUNT 1 INCB @$GFTCB ;INC GRP GLOBAL USE COUNT FOR TASK  .ENDC ; DF G$$GEF;R'; WRITE DIRECTIVE STATUS BACK INTO TASKD;D* MTPD$ @#H.DSW ;SET DIRECTIVE STATUS WORD;H; GET USER STACK POINTER AND UPDATE TO REMOVE DPB OR ADDRESS OF DPB FROM ; THE STACK.;! MFPI SP ;GET USER STACK POINTERG. ADD $BTRMV,(SP) ;REMOVE BYTES FROM USER STACK% MTPI SP ;RESTORE USER STACK POINTERA; *; CHECK IF NEWEST PACKET IS FOR A TERMINAL;2 BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL DEVICE? BEQ NONTTY ;IF EQ NO; *; CALL TERMINAL PARAMETER CHECKING ROUTINEH; THIS MUST BE CALLED BEFORE THE PACKET IS QUEUED SINCE THE CONTEXT MUST; BE OF THE ISSUING TASK;E, CALL XXTTI ;CALL TERMINAL SPECIFIC ROUTINE BR TSTQUE ;GO DEQUEUE A PACKET;P%; PREPROCESS NON TERMINAL I/O PACKETSTI; THIS INCLUDES ACP FUNCTIONS AND NORMAL I/O FUNCTIONS FOR EVERYTHING BUT ; TERMINALSUNONTTY: & CALL XXPRE ;PREPROCESSES I/O PACKETS;O; SEE IF ANYTHING IN OUR QUEUE;1TSTQUE: TST (R4) ;QUEUE EMPTY? BNE 10$ ;IF NE NO  RETURN ;NOTHING TO DO;E"; ALLOCATE A CPRBUF REQUEST PACKET;E$; WE DO NOT DO IMPLICIT TASK START!00’ú{ñ{töt÷tø tþfDATA.; THE TASK HAS ALREADY BOUND THE LUN WITH ITS C; AME. THIS MEANS THAT THE IMPLICIT TASK START HAD TO HAVE ALREADY K; HAPPENED. SINCE WE MAY NOT BE RUNNING UNDER THE CONTEXT OF THE SAME TASKIK; THAT ISSUED THE QIO, THE VALUE IN $TKTCB IS NOT VALID. THE KXDRIVER USESLJ; $TKTCB TO SEE IF IT NEED TO DO AN IMPLICIT TASK START ONLY IF THE AL$IMP ; BIT IS SET.);Q:10$: MOV #AL$XXD,R0 ;INDICATE NO BLOCKING AND NO PC BACKUP MOV #1,R1 ;ALLOCATE 1 BLOCKS- CALL $CPALO ;CALL ALLOCATE ROUTINE IN KXDRV!; J; THE KXDRIVER WILL NOT RETURN TO US IF IT FAILS TO ALLOCATE EITHER A RINGJ; OR A BLOCK OF CPRBUF. SINCE WE DO NOT NECESSARILY HAVE THE TASK CONTEXTJ; AND WE DO NOT WANT TO REISSUE THE QIO, WHEN RESOURCES BECOME AVAILABLE, I; THE KXDRIVER WILL CALL US HERE WITH THE CARRY BIT SET. THEN WE REISSUEOM; THE REQUEST FOR RESOURCES. THE KXDRIVER STORES THE VALUE OF THIS LOCATION,DI; WHICH IT TOOK IT OFF THE STACK, WHEN THE ALLOCATION FAILED. THE DRIVER; RESTORES R5 FOR US ALSO.;R, BCC 30$ ;IF CC, ALLOCATION WAS SUCCESSFUL;UJ; THE ALLOCATION FAILED, FORK SO THE KX DRIVER CAN FINISH WAKING UP OTHER ; TASKSN;N% TST S.FRK+2(R4) ;FORK BLOCK IN USE? % BEQ 15$ ;IF EQ, NO, FORK THIS TIME  RETURN ;RETURN B(15$: CALL $FORK ;CREATE SYSTEM PROCESS ;R5 MUST STILL BE THE UCB' ;R4 MUST BE THE SCB TO CALL $FORK 9 CLR S.FRK+2(R4) ;FREE FORK BLOCK FOR FURTHER INTERRUPTSO# BR 10$ ;GO TRY TO ALLOCATE AGAINO;AG; THIS IS THE DRIVER ACCEPTANCE ROUTINE FOR $GSPKT - WE ACCEPT ANYTHINGL'20$: CLC ;CLEAR CARRY FOR GSPKT$ CALLN RETURN ; ;T"; GET AN I/O PACKET FROM THE QUEUEF; WE USE $GSPKT INSTEAD OF $GTPKT SINCE WE IGNORE THE BUSY BIT IN THE J; CONTROLLER. THE AME WILL DECIDE IF A PARTICULAT CONTROLLER IS TOO BUSY.;Y#30$: MOV R0,-(SP) ;SAVE BUFFER BIAST, MOV #20$,R2 ;ADDRESS OF ACCEPTANCE ROUTINE! CALL $GSPKT ;DEQUEUE I/O PACKETO" MOV (SP)+,R0 ;RESTORE BUFFER BIAS& BCC 40$ ;IF CC, WE GOT AN I/O PACKET; J; THIS SHOULD NEVER HAPPEN. $GSPKT IS SPECIAL CASED TO GIVE US ANY PACKETN; IN OUR QUEUE INCLUDING ATTACH AND DETACH. THIS IS HERE TO PROTECT OURSELVES; AND THE AME ;K7 CALLR $CPDEA ;DEALLOCATE THE CPRBUF PACKET AND RETURN;O; AFTER CALL TO $GSPKT;I; R1 = ADDRESS OF I/O PACKET; R2 = PHYSICAL UNIT #; R3 = CONTROLLER INDEXB; R4 = SCB ADDRESS;D40$: ;E; CHECK FOR OVERLAY QIO'ST;D! MOV I.UCB(R1),R5 ;GET UCB ADRESSR! TST U.CW1(R5) ;MOUNTABLE DEVICE?C. BPL 50$ ;IF PL NO, CAN'T BE OVERLAY FUNCTION$ MOV I.FCN(R1),R2 ;GET FUNCTION CODE0 CMP #IO.LOV,R2 ;IS IT THE I-SPACE LOAD OVERLAY? BEQ OVERLD ;IF EQ YESO0 CMP #IO.LDO,R2 ;IS IT THE D-SPACE LOAD OVERLAY? BEQ OVERLD ;IF EQ YESU; -; START FILLING IN THE CPRBUF REQUEST PACKET I; "50$: MOV R0,KISAR6 ;MAP THE PACKET" MOV #MAP6,R2 ;POINT TO THE HEADER% MOVB #HT$QIO,H$TYPE(R2) ;QIO REQUESTE CLRB H$ICNT(R2) ;NO ITEMS+ ADD #P$LUN,R2 ;POINT TO THE PARAMETER AREAT;CJ; FINISH FILLING IN THE I/O PACKET, WE ASSUME THERE CAN NOT BE MORE THAN 8; PARAMETER WORDS .60$: MOVB I.LN2(R1),(R2)+ ;FILL IN P$LUN FIELD+ MOVB I.LN2+1(R1),(R2)+ ;FILL IN FLAGS WORD TST (R2)+ ;RESERVED WORD/ MOV I.FCN(R1),(R2)+ ;FILL IN I/O FUNCTION CODE MOV R1,R3* ADD #I.PRM,R1 ;POINT TO THE PARAMTER LIST .REPT 8.A! MOV (R1)+,(R2)+ ;COPY PARAMETERSP .ENDR+ MOV R4,(R2) ;COPY SCB ADDRESS INTO PACKETU' MOV R3,2(R2) ;COPY I/O PACKET ADDRESS $;,; SEND QIO REQUEST TO AMEA;T)SENPKT: SUB #MAP6,R2 ;GET SIZE OF REQUESTE CPSEN$ #SN$QIO,R0,R2E;R; GET RETURN PACKET ;D( MOV KISAR6,R3 ;SAVE TASK HEADER MAPPING MOV R0,KISAR6 ;MAP PACKET( MOV #MAP6,R2 ;POINT TO HEADER OF PACKET( MOV P$PARM+20(R2),R4 ;SAVE SCB ADDRESS . MOV P$PARM+22(R2),R5 ;SAVE I/O PACKET ADDRESS, MOV H$STAT(R2),-(SP) ;GET FIRST STATUS WORD/ MOV H$STAT+2(R2),-(SP) ;AND SECOND STATUS WORDR MOV R3,KISAR6 ;MAP TASK HEADER ; ; DEALLOCATE PACKET ; / CALL $CPDEA ;CPDEA: PRESERVES R4,R5 AND STACK;/; CONVERT LUN NUMBER BACK INTO POINTER INTO LUTN;S% MOVB I.LN2(R5),R3 ;GET LUN NUMBER! DEC R3 ;L00’|�{�Ž{´cÚµcÛ¶c�·c›’UN NUMBERS START AT 1R/ ASL R3 ;MULTIPLY BY 4 (4 BYTES PER LUN ENTRY)R ASL R3 ;, ADD #,R3 ;GET OFFSET INTO LUT7 MOV R3,I.LN2(R5) ;RETURN TO LUN FIELD IN I/O PACKETE;M; COMPLETE I/O; # MOV R5,R3 ;GET I/O PACKET ADDRESS(# MOV I.UCB(R3),R5 ;GET UCB ADDRESS M2 BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL DEVICE?* BNE 30$ ;IF NE YES, NO FINISH PROCESSING; ; TEST FOR OVERLAY LOADS ; NO FINISH PROCESSING NECESSARY;N$ MOV I.FCN(R3),R2 ;GET FUNCTION CODE0 CMP #IO.LOV,R2 ;IS IT THE I-SPACE LOAD OVERLAY? BEQ 30$ ;IF EQ YES0 CMP #IO.LDO,R2 ;IS IT THE D-SPACE LOAD OVERLAY? BEQ 30$ ;IF EQ YES6 CALL XXFIN ;DO FINISH WORK FOR NON TERMINAL DEVICES& ; XXFIN: PRESERVES R4,R5 AND STACK030$: MOV (SP)+,R1 ;SETUP STATUS WORDS FOR $IODSA MOV (SP)+,R0 ;B> CLR I.PRM+16(R3) ;MAKE SURE IOFIN DOESN'T THINK WE HAVE BLOCK ;LOCKINGF; $IODSA WILL FORK USING THE I/O PACKET AS THE FORK BLOCK IF THERE IS #; ANOTHER I/O PACKETS IN OUR QUEUE.N?; THIS WILL ENSURE THAT THE KX DRIVER WILL GET TO COMPLETE ITS Q&; RING PROCESSING AS SOON AS POSSIBLE.;E* CALL $IODSA ;CALL I/O COMPLETION ROUTINE;&; SEE IF ANYTHING ELSE IS IN OUR QUEUE;M& MOV U.SCB(R5),R4 ;RESTORE SCB ADDRESS JMP TSTQUE;+;M1; OVERLD - HANDLE LOAD OVERLAY REQUESTS TO CPRSYSP;R(; INPUT: R0 - BIAS OF THE REQUEST PACKET; R1 - ADDRESS OF I/O PACKET;C;-OVERLD:A; $; FILL IN THE CPRBUF REQUEST PACKET ;L MOV R0,KISAR6 ;MAP THE PACKET" MOV #MAP6,R2 ;POINT TO THE HEADER. MOVB #HT$LOV,H$TYPE(R2) ;LOAD OVERLAY REQUEST CLRB H$ICNT(R2) ;NO ITEMS, MOV R4,P$PARM+20(R2) ;SAVE THE SCB ADDRESS3 MOV R1,P$PARM+22(R2) ;SAVE THE I/O PACKET ADDRESSO+ ADD #P$IID,R2 ;POINT TO THE PARAMETER AREAA;E; LOAD PARAMETERS+;M5 MOV I.TCB(R1),R5 ;GET TCB ADDRESS OF REQUESTING TASKR/ MOV T.IID(R5),(R2)+ ;FILL IN IMAGE INDEX FIELD1$ MOV I.PRM+4(R1),(R2)+ ;FILL IN SIZE" MOV I.PRM(R1),(R2)+ ;FILL IN BIAS, MOV I.PRM+2(R1),(R2)+ ;FILL IN DISPLACEMENT- MOV I.PRM+12(R1),(R2)+ ;FILL IN BLOCK NUMBER$;,; SEND QIO REQUEST TO CPRSYS;+ JMP SENPKT ;AND GO SEND THE PACKET TO VMS(XXOUT::EXXPWF::A RETURNM .PAGE% .SBTTL XXCAN- CANCEL I/O ENTRY POINTS$; ** - XXCAN- CANCEL I/O ENTRY POINT;AK; CANCEL I/O FOR ALL OUTSTANDING I/O ON THE UNIT SPECIFIED BY THE UCB IN R5S;GK; FIRST SCAN THE DRIVER'S QUEUE FOR I/O PACKETS WHICH HAVEN'T BEEN SHIPPED 2J; OVER YET. ONLY THOSE I/O PACKETS WHOSE TCB ADDRESSES MATCH THAT OF THE L; CURRENT TASK AND WHOSE UCB ADDRESSES MATCH WILL BE CONCIDERED. SINCE THE H; UCB ADDRESS DOES NOT IDENTIFY A UNIQUE UNIT, THE LUN NUMBER IS CHECKEDJ; AGAINST THE ONE PASSED TO US. IF ALL THESE MATCH, THE PACKET IS REMOVEDJ; FROM THE QUEUE AND THE I/O FINISHED. IF THE UCB ADDRESSES MATCH AND LUNJ; NUMBERS DON'T, WE MUST DO A FAKE GDVI DIRECTIVE TO FIND OUT IF THE UNITS; ARE THE SAME./;A ; INPUTS: ; '!; R1 TCB ADDRESS OF CURRENT TASK ; R4 SCB ADDRESS OF XX SCB; R5 UCB ADDRES TO KILL I/O TOH; $CPPKT BIAS OF A PACKET IN CPRBUF TO USE FOR I/O KILL OR GDVI REQUEST(; $CPLUN LUN NUMBER OF I/O KILL REQUESTF; P$LUN+2 OFF CPRBUF PACKET CONTAINS THE NUMBER OF WORDS ON THE STACK 6; WHICH MUST BE SAVED IF A GDVI PACKET MUST BE PASSED; $TEMP2;N ; OUTPUTS:;UD; APPROPRIATE I/O PACKETS ARE REMOVED FROM THE QUEUE AND AN I/O KILLD; PACKET IS SENT TO THE HOST, TO KILL ALL I/O OUTSTANDING ON THE LUN;XXCAN::A;E$; SCAN SCB QUEUE FOR PACKETS TO KILL; / MOV R4,R3 ;COPY ADDRESS OF I/O QUEUE LISTHEAD .10$: MOV R3,R2 ;SAVE ADDRESS OF CURRENT ENTRY( MOV (R2),R3 ;GET ADDRESS OF NEXT ENTRY BEQ 100$ ;IF EQ, NONE , CMP R1,I.TCB(R3) ;REQUEST FOR CURRENT TASK? BNE 10$ ;IF NE NOH$ TST $CPLUN ;IS KILL FOR ALL UNITS? BEQ 50$ ;IF EQ YES- CMP R5,I.UCB(R3) ;REQUEST FOR SPECIFIED UCB?O BNE 10$ ;IF NE NOD! MOV I.LN2(R3),R0 ;GET LUN NUMBER + SUB #H.LUN+2+MAP6,R0 ;CALCULATE LUN NUMBER ASR R0 ;DIVIDE BY 4N ASR R0 ;# CMP R0,$CPLUN ;IS IT THE SAME LUN?C BEQ 50$ ;IF EQ YES;LE; IF THIS IS A SPECIFIC REMOTE DEVICE, (IE. HTn: UNIT) WE CAN KI00’ |“ |töt÷tø tþfDATALL IT ;T MOV (R5),R1 ;GET DCB ADDRESS3 CMP #377,D.UNIT(R1) ;IS IT A REAL GENERIC DEVICE?R) BNE 50$ ;IF NE NO, GO AHEAD AND KILL ITP; C; FIND OUT IF THIS LUN IS ASSIGNED TO THE UNIT WE ARE INTERESTED INR;E;TBD!50$: MOV (R3),(R2) ;CLOSE UP LIST BNE 60$ ;IF NE NO NEW LAST& MOV R2,2(R4) ;SET ADDRESS OF NEW LAST260$: MOV #IE.ABO&377,R0 ;SET FINAL STATUS TO ABORT* TSTB $TEMP2 ;SUBFUNCTION SET FOR IO.KIL? BMI 70$ ;IF MI YES2 CLR I.AST(R3) ;MAKE SURE THERE IS NO AST DECLARED&70$: CLR R1 ;CLEAR SECOND STATUS WORD! CALL $IOFIN ;FINISH I/O REQUEST ' MOV U.SCB(R5),R4 ;GET SCB ADDRESS BACK 1 MOV $TKTCB,R1 ;GET CURRENT TASK TCB ADDRESS BACKS JMP XXCAN ;SCAN QUEUE AGAINR100$:T;I!; PUT PACKET TOGETHER TO KILL I/O);L" MOV $CPPKT,KISAR6 ;MAP THE PACKET BEQ 200$ ;IF EQ DON'T KILL I/O" MOV #MAP6,R2 ;POINT TO THE HEADER% MOVB #HT$QIO,H$TYPE(R2) ;QIO REQUESTM CLRB H$ICNT(R2) ;NO ITEMS# MOVB $CPLUN,P$LUN(R2) ;FILL IN LUNT CLRB P$FLG(R2) ;NO BUFFERSS;EK; SEND QIO REQUEST TO AME WITH IMMEDIATE RETURN - PACKET WILL BE DEALLOCATEE; ON DETATCHED RETURN BY KXDRVB;D CPSEN$ #SN$PSR,KISAR6,#H$SIZE+4/ CLR $CPPKT ;INDICATE THAT I/O HAS BEEN KILLEDU200$:I RETURN$ .END; PUT PACKET TOGETHER TO KILL I/O);L" MOV $CPPKT,KISAR6 ;MAP THE PACKET BEQ 200$ ;IF EQ DON'T KILL I/O" MOV #MAP6,R2 ;POINT TO THE HEADER% MOVB #HT$QIO,H$TYPE(R2) ;QIO REQUESTM CLRB H$ICNT(R2) ;NO ITEMS# MOVB $CPLUN,P$LUN(R2) ;FILL IN LUNT CLRB P$FLG(R2) ;NO BUFFERSS;EK; SEND QIO R .TITLE XXFINg .IDENT /01.00/e;r6; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;t<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; K. L. NOEL 24-MAR-87;e/; I/O FINISHING MODULE FOR NON TERMINAL DEVICESf; ;t .PAGE;2; LOCAL SYMBOL DEFINITIONt;t6 MXSIZ = 0 ; MAXIMUM SIZE OF ATTRIBUTE TO GO IN CPRBUF/ MAP5 = 120000 ; ADDRESS OF FIRST WORD IN APR5. MAP6 = 140000 ; ADDRESS OF FIRST WORD IN APR6 .PAGE;+; "; I/O FUNCTION CODE DISPATCH TABLE; ;- DSPTBL: .WORD FN0BF ; 0 IO.KIL .WORD FN0BF ; 1 IO.WLBH .WORD FN0BF ; 2 IO.RLBB .WORD FN0BF ; 3 IO.ATT  .WORD FN0BF ; 4 IO.DETF .WORD FN0BF ; 5 ? .WORD FN0BF ; 6 ? .WORD FN0BF ; 7 ? .WORD 0 ;10-ILLEGAL FUNCTION- .WORD FNACP ;11-FIND FILE NAME IN DIRECTORYt. .WORD FNACP ;12-UNLOCK BLOCK - NOP'D IN MASK1 .WORD FNACP ;13-REMOVE FILE NAME FROM DIRECTORYN. .WORD FNACP ;14-ENTER FILE NAME IN DIRECTORY& .WORD FNACC ;15-ACCESS FILE FOR READ0 .WORD FNACC ;16-ACCESS FILE FOR READ AND WRITE6 .WORD FNACC ;17-ACCESS FILE FOR READ, WRITE, AND EXT .WORD FNDEA ;20-DEACCESS FILE $ .WORD FN0BF ;21-READ VIRTUAL BLOCK% .WORD FN0BF ;22-WRITE VIRTUAL BLOCK  .WORD FNACP ;23-EXTEND FILEO .WORD FNACP ;24-CREATE FILEO4 .WORD FNACP ;25-MARK FILE FOR DELETE/TRUNCATE FILE& .WORD FNACP ;26-READ FILE ATTRIBUTES' .WORD FNACP ;27-WRITE FILE ATTRIBUTESE/ .WORD FNACP ;30-USER MAGTAPE CONTROL FUNCTIONC* .WORD FN0BF ;31-TRANSMIT PROCESS MESSAGE) .WORD FN0BF ;32-RECEIVE PROCESS MESSAGED$ .WORD NTACC ;33-CONNECT TO PROCESS) .WORD NTDEA ;34-DISCONNECT FROM PROCESS-+ .WORD NCTSPL ;35-NETWORK CONTROL FUNCTIONL .PAGE;0'; DISPATCH TO CORRECT FINISHING ROUTINEP;2XXFIN::F SAVNR* MOV I.TCB(R3),R4 ;GET TCB ADDRESS OF TASK" MOV T.PCB(R4),R4 ;GET PCB ADDRESS! MOV P.REL(R4),KISAR6 ;MAP HEADERB0 MOVB I.FCN+1(R3),R2 ;RETRIEVE I/O FUNCTION CODE ASL R2 ;CONVERT TO WORD INDEXR4 MOV I.LN2(R3),R4 ;GET POINTER TO SECOND LUN WORD+ JMP @DSPTBL(R2) ;EXECUTE FINISHING ROUTINED-NCTSPL: ; SPLIT NETWORK CONTROL FUNCTIONS.D& MOV I.FCN(R4),R1 ; GET FUNCTION CODE.9 BIC #177707,R1 ; EXTRACT THREE BITS INDICATING FUNCTION.  ASR R1T ASR R1  JMP @NCTTBL(R1) ; DISPATCH.NCTTBL: .WORD NTACC ; 00, OPEN .WORD NTDEA ; 10, CLOSEP .WORD FN0BF ; 20, SPECIFY ASTP$ .WORD FN0BF ; 30, GET NETWORK DATA$ .WORD FN0BF ; 40, GET NETWORK DATA$ .WORD FN0BF ; 50, GET NETWOR00“|”|Ž{´cÚµcÛ¶c�·c›’K DATA .WORD FN0BF ; 60. .WORD FN0BF ; 70, GET LOCAL NODE INFORMATION;X; NON ACP FUNCTION;DFN0BF: RETURN;T$; NETWORK ACCESS AND DEACCESS STUBS.;R@NTACC: MOV #$XXWIN,(R4) ; SET UP REFERENCE TO FAKE WINDOW BLOCK. RETURN 9NTDEA: CLR (R4) ; DELETE REFERENCE TO FAKE WINDOW BLOCK.. RETURNL;; FINISH ACCESS FILE FUNCTIOND;DFNACC:8 MOV #$XXWIN,(R4) ;SET UP REFERENCE TO FAKE WINDOW BLOCK BR FNACP ;JOIN COMMON CODE;0 ; FINISH DEACCESS FILE FUNCTIONS; FNDEA:1 CLR (R4) ;DELETE REFERENCE TO FAKE WINDOW BLOCKF; ; FINSH ACP FUNCTION;AFNACP:% MOV I.PRM(R3),R1 ;IS THERE A BUFFER?U BEQ ACPDON ;IF EQ NO A MOV R1,KISAR6 ;MAP CPR BUFFER; ; COPY FNB IF THERE IS ONE;T' MOV I.PRM+16(R3),R2 ;GET OFFSET OF FNBR BEQ COPFID ;IF EQ NONE! MOV #15.*2,R0 ;GET LENGHT OF FNB+ CALL COPPRM ;COPY FNB INTO USER'S BUFFER ;V; COPY FID IF THERE IS ONE; COPFID:I! TST I.PRM+2(R3) ;IS THERE A FID?  BEQ COPATR ;IF EQ NO MOV #3.*2,R0 ;LENGHT OF FID MOV #4,R2 ;OFFSET TO FID0 CALL COPPRM ;COPY FID BACK INTO USER'S BUFFER ;A; COPY UPDATED ATTRIBUTES ; 4COPATR: MOV I.PRM+6(R3),R1 ;GET OFFSET OF ATTRIBUTES BEQ COPDON ;IF EQ NONE, BIS #MAP6,R1 ;MAKE SURE IT'S A APR6 ADDRESS 10$: TSTB (R1)+ ;TEST ATTRIBUTE BEQ 40$ ;IF EQ, NONE 5/ BGT 20$ ;IF GT ZERO, IT WAS A WRITE ATTRIBUTEN CLR R0 ;TO BE SAFE MOVB (R1)+,R0 ;GET LENGTH CMPB R0,#MXSIZ ;IS IT TOO BIG' BHI 30$ ;IF HI YES, COPY ALREADY DONE  TST (R1)+ ;SKIP PAST BIASD& MOV (R1)+,R2 ;GET OFFSET TO ATTRIBUTE- MOV R1,-(SP) ;SAVE POINTER TO ATTRIBUTE LISTY CALL COPPRM ;COPY PARAMETERR MOV (SP)+,R1 ;RESTORE POINTER BR 10$ ;GET NEXT ATTRIBUTE20$: INC R1 ;SKIP PAST LENGTH+30$: CMP (R1)+,(R1)+ ;SKIP PAST BIAS/OFFSETT BR 10$ ;GET NEXT ATTRIBUTE40$: COPDON:I;T; DEALLOCATE BUFFER ;R, MOV I.PRM(R3),R0 ;GET BIAS OF CPRBUF PACKET& MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS CALL $CPDEA ;DEALLOCATE PACKET) MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSMACPDON: RETURN;FB; COPPRM - COPY PIECE OF CPR BUFFER BACK INTO USER'S ADDRESS SPACE;L(; INPUTS: R0 - LENGHT OF BUFFER IN BYTES6; R2 - OFFSET OF SOURCE BUFFER FROM TOP OF CPR BUFFER:; DESTINATION BIAS AND DISPLACEMENT MUST BE LOCATED AFTER; THE INDICATED BUFFER ;T; OUTPUT: BUFFER IS COPIED; R3 IS PRESERVED;BCOPPRM:R" MOV I.PRM(R3),R1 ;GET SOURCE BIAS& MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS1 MOV R2,R4 ;GET BIAS OFFSET PAIR FOR DESTINATIONM' BIS #MAP6,R4 ; ADD IN OFFSET TO BUFFER" ADD R0,R4 ; AND LENGHT OF BUFFER# MOV (R4)+,R3 ;GET DESTINATION BIASA MOV (R4),R4 ; AND OFFSET ADD #MAP5,R2 ;GET SOURCE OFFSET CALL $BLXIO ;PERFORM COPY ) MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS  RETURNA .ENDST BE LOCATED AFTER; THE INDICATED BUFFER ;T; OUTPUT: BUFFER IS COPIED; R3 IS PRESERVED;BCOPPRM:R" MOV I.PRM(R3),R1 ;GET SOURCE BIAS& MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS1 MOV R2,R4 ;GET BIAS OFFSET PAIR FOR DESTINATIONM' BIS #MAP6,R4 ; ADD IN OFFSET TO BUFFER" ADD .TITLE XXPRE0 .IDENT /01.00/a;o6; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;c<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;-; K. L. NOEL 17-MAR-87;r.; PREPROCESSOR MODULE FOR NON TERMINAL DEVICES;m;r .PAGE; ; LOCAL SYMBOL DEFINITIONc;i/ MAP5 = 120000 ; ADDRESS OF FIRST WORD IN APR5. MAP6 = 140000 ; ADDRESS OF FIRST WORD IN APR6;d; GLOBAL SYMBOL DEFINITION;.7 MXSIZ == 0 ; MAXIMUM SIZE OF ATTRIBUTE TO GO IN CPRBUF7 ; ALSO USED IN MODULE XXFIN. .PAGE;+; "; I/O FUNCTION CODE DISPATCH TABLE;U;- DSPTBL: .WORD FC0BF ; 0 IO.KIL .WORD FC1BF ; 1 IO.WLB  .WORD FC1BF ; 2 IO.RLB .WORD FC0BF ; 3 IO.ATT .WORD FC0BF ; 4 IO.DETO .WORD FC0BF ; 5 ? .WORD FC0BF ; 6 ? .WORD FC0BF ; 7 ?" .WORD FCIFC ;10-ILLEGAL FUNCTION- .WORD FCPKT ;11-FIND FILE NAME IN DIRECTORYO. .WORD FCIFC ;12-UNLOCK BLOCK - NOP'D IN MASK1 .00”| |töt÷tø tþfDATAWORD FCPKT ;13-REMOVE FILE NAME FROM DIRECTORYO. .WORD FCPKT ;14-ENTER FILE NAME IN DIRECTORY& .WORD FCACC ;15-ACCESS FILE FOR READ0 .WORD FCACC ;16-ACCESS FILE FOR READ AND WRITE6 .WORD FCACC ;17-ACCESS FILE FOR READ, WRITE, AND EXT .WORD FCDAC ;20-DEACCESS FILE.$ .WORD FC1BF ;21-READ VIRTUAL BLOCK% .WORD FC1BF ;22-WRITE VIRTUAL BLOCK .WORD FCEXT ;23-EXTEND FILEF .WORD FCCRE ;24-CREATE FILEO4 .WORD FCDEL ;25-MARK FILE FOR DELETE/TRUNCATE FILE& .WORD FCPKT ;26-READ FILE ATTRIBUTES' .WORD FCPKT ;27-WRITE FILE ATTRIBUTESE/ .WORD FCPKT ;30-USER MAGTAPE CONTROL FUNCTIONC* .WORD NTWVB ;31-TRANSMIT PROCESS MESSAGE) .WORD NTRVB ;32-RECEIVE PROCESS MESSAGED$ .WORD NTACC ;33-CONNECT TO PROCESS) .WORD NTDAC ;34-DISCONNECT FROM PROCESS-* .WORD NTNCT ;35-NETWORK CONTROL FUNCTION" .WORD FCIFC ;36-ILLEGAL FUNCTION" .WORD FCIFC ;37-ILLEGAL FUNCTION .PAGE;F; ILLEGAL FUNCTION;0FCIFC: .WORD IEIFC ;SET ILLEGAL FUNCTION STATUS;O"; NON ACP FUNCTION WITH NO BUFFERS;O4FC0BF: .WORD CK0XT ;EXIT WITH 0 BUFFER IN FLAG BYTE;S"; NON ACP FUNCTION WITH ONE BUFFER;W4FC1BF: .WORD CK1XT ;EXIT WITH 1 BUFFER IN FLAG BYTE;V8; ACCESS FILE FOR READ, READ/WRITE, OR READ/WRITE/EXTEND;OFCACC:4 .WORD CKALN ;CHECK IF FILE ALREADY ACCESSED ON LUN" .WORD BDPKT ;BUILD AN I/O PACKET .WORD CKLHD ;LOCK DOWN HEADER ! .WORD CKRLK ;SYNCHRONIZE ACCESS< .WORD CK1XC ;EXIT CONDITIONALLY WITH 1 BUFFER IN FLAG BYTE;T; DEACCESS FILE;O2FCDAC: .WORD CKNLN ;CHECK IF FILE ACCESSED ON LUN" .WORD BDPKT ;BUILD AN I/O PACKET .WORD CKLHD ;LOCK DOWN HEADERU! .WORD CKRLK ;SYNCHRONIZE ACCESS < .WORD CK1XC ;EXIT CONDITIONALLY WITH 1 BUFFER IN FLAG BYTE;E ; CREATE FILE/'; CREATE & ACCESS NOT LEGAL COMBINATIONK-; CREATE & EXTEND DOES NOT INCR PENDING COUNT ; SINCE NO WINDOW;.FCCRE:4 .WORD CKALN ;CHECK IF FILE ALREADY ACCESSED ON LUNFCDEL:FCEXT:; C; BUILD AN I/O PACKET FOR FIND, ENTER, REMOVE, EXTEND, DELETE, READ"; ATTRIBUTES, AND WRITE ATTRIBUTES;CFCPKT:" .WORD BDPKT ;BUILD AN I/O PACKET .WORD CKLHD ;LOCK DOWN HEADERE8 .WORD CK1XC ;EXIT CONDITIONALY WITH ONE BUFFER IN BYTE;DF; TABLE OF SPECIAL FUNCTION CODES TO BE CHECKED BY SOFTWARE WRITE LOCK; WLKTB: ;DEVICE DEPENDENT CODESN! .WORD IO.SMD ;SET MEDIA DENSITYS! .WORD IO.EOF ;WRITE END OF FILED .WORD IO.ERS ;ERASE TAPE# .WORD IO.DSE ;DATA SECURITY ERASE ;DIAGNOSTIC CODESE% .WORD IO.WDH ;WRITE DATA AND HEADERT& .WORD IO.WTD ;WRITE TRACK DESCRIPTOR0 .WORD IO.TDD ;WRITE TRACK DESCRIPTOR DISPLACED' .WORD IO.CEW ;WRITE BLOCK ON CE TRACK.* .WORD 0 ;TERMINATOR FOR WRITE LOCK TABLE,NTWVB: ; NETWORK SEND AND SEND INTERRUPT.+ .WORD CKNLN ; ENSURE FILE IS OPEN ON LUN.$ .WORD PRMPRP ; PREPARE PARAMETERS.2 .WORD CKBFR1 ; CHECK BUFFER ONE FOR READ ACCESS.. .WORD CK1XT ; INDICATE ONE BUFFER AND LEAVE.NTRVB: ; NETWORK RECEIVE.+ .WORD CKNLN ; ENSURE FILE IS OPEN ON LUN. $ .WORD PRMPRP ; PREPARE PARAMETERS.3 .WORD CKBFW1 ; CHECK BUFFER ONE FOR WRITE ACCESS.C. .WORD CK1XT ; INDICATE ONE BUFFER AND LEAVE.'NTACC: ; NETWORK ACCEPT AND CONNECT.O. .WORD CKALN ; ENSURE NO FILE IS OPEN ON LUN.$ .WORD PRMPRP ; PREPARE PARAMETERS.MERGE: ; MERGE FROM REJECT.2 .WORD CKBFR2 ; CHECK BUFFER TWO FOR READ ACCESS.2 .WORD CKBFR1 ; CHECK BUFFER ONE FOR READ ACCESS.9 .WORD ACSPL ; HANDLE SPECIAL ACCEPT/CONNECT PROCESSING..! .WORD CKLHD ; LOCK DOWN HEADER.E .WORD CKRLK ; INTERLOCK.* .WORD CKNXT ; EXIT WITH SEVERAL BUFFERS.2NTDAC: ; NETWORK ABORT, DISCONNECT, AND REJECT.+ .WORD CKNLN ; ENSURE FILE IS OPEN ON LUN.R$ .WORD PRMPRP ; PREPARE PARAMETERS.; .WORD ADRSPL ; DO SPECIAL ACCEPT/DISCONNECT/REJECT STUFF.R) ; REJECT GOES TO MERGE AT THIS POINT..2 .WORD CKBFR1 ; CHECK BUFFER ONE FOR READ ACCESS.! .WORD CKLHD ; LOCK DOWN HEADER.  .WORD CKRLK ; INTERLOCK.. .WORD CK1XT ; INDICATE ONE BUFFER AND LEAVE.6NTNCT: ; NETWORK CLOSE, GET LOCAL NODE INFORMATION,. ; GET NETWORK DATA, OPEN, AND SPECIF00”"||Ž{´cÚµcÛ¶c�·c›’Y AST.2 .WORD NCTSPL ; SEPARATE PROCESSING AS NECESSARY.) ; GET NETWORK DATA AND GET LOCAL NODEN ; INFORMATION TO GO NTRVB.0 ; OPEN AND CLOSE FALL THROUGH, ANYTHING ELSE ; GOES TO SKIP.! .WORD CKLHD ; LOCK DOWN HEADER.P .WORD CKRLK ; INTERLOCK.SKIP:E. .WORD CK0XT ; INDICATE NO BUFFERS AND LEAVE. .PAGEXXPRE::R SAVNR;L0; PREPARE REGISTERS FOR POLISH DISPATCH ROUTINES;) MOV R1,R4 ;PUT I/O PACKET ADDRESS IN R4 0 MOVB I.FCN+1(R1),R2 ;RETRIEVE I/O FUNCTION CODE ASL R2 ;CONVERT TO WORD INDEXR3 MOV R5,-(SP) ;SAVE UCB ADDRESS FOR POLISH ROUTINESA MOV R5,R0 ;D5 MOV I.LN2(R4),R1 ;SAVE ADDRESS OF SECOND LUN WORDE" MOV R1,-(SP) ;FOR POLISH ROUTINES0 MOV DSPTBL(R2),R5 ;GET ADDRESS OF POLISH VECTOR$ JMP @(R5)+ ;EXECUTE POLISH ROUTINE;O; REGISTERS AT POLISH DISPATCH; ; R0 - UCB; R1 - ADDRESS 2ND LUN WORD; R2 - FCTN CODE; R4 - POINTER TO I/O PACKET;; SP-> 2ND LUN WORD ADDRESS ; UCB ADDRESS;VK; TASK HEADER IS ASSUMED TO BE MAPPED FOR ALL OF THE THREADED CODE ROUTINESR;M;R(; CHECK FOR FILE ALREADY ACCESSED ON LUN;A(CKALN: TST (R1) ;FILE ACCESSED ON LUN? BEQ CKJR5 ;IF EQ NOW JMP IEALN ;ERROR;P ; CHECK FOR FILE ACCESSED ON LUN;E(CKNLN: TST (R1) ;FILE ACCESSED ON LUN? BNE CKJR5 ;IF NE YES JMP IENLN ;ERROR; ; SET ACCESS/DEACCESS INTERLOCKA;E9CKRLK: INC @(SP) ;SET ACCESS/DEACCESS PENDING INTERLOCKKCKJR5: JMP @(R5)+N;DF; FUNCTION IS AN ILLEGAL FUNCTION-DECLARE ILLEGAL FUNCTION CODE STATUS;F0IEIFC: MOV #IE.IFC&377,R4 ;SET ILLEGAL FUNCTION JMP IECMN;S&; WRITE ATTEMPTED TO WRITE LOCKED UNIT;C/IEWLK: MOV #IE.WLK&377,R4 ;SET WRITE LOCK ERRORN BR IECMN ;; @; ILLEGAL BUFFER ADDRESS SPECIFIED-DECLARE ILLEGAL BUFFER STATUS;D.I2SPC: CLR -(R4) ;ERASE LAST ATTRIBUTE NUMBER2IESPC: MOV #IE.SPC&377,R4 ;SET ILLEGAL BUFFER CODEIECOM: BR IECMN ;;SG; ILLEGAL LOAD OVERLAY UCB-DECLARE ILLEGAL LOAD OVERLAY FUNCTION STATUS ;I8IEOVR: MOV #IE.OVR&377,R4 ;SET ILLEGAL LOAD OVERLAY CODE BR IECMN ;;&9; ILLEGAL BYTE COUNT OR ALIGNMENT-DECLARE ODD BYTE STATUSP; .IEBYT: MOV #IE.BYT&377,R4 ;SET ODD BYTE STATUS BR IECMN ;;R:; NO BUFFER SPACE AVAILABLE-SET NO BUFFER AVAILABLE STATUS;A7IENOD: MOV #IE.NOD&377,R4 ;SET NO BUFFER AVAILABLE CODES BR IECMN ;;(; BAD PARAMETER-SET BAD PARAMETER STATUS; 1IEBAD: MOV #IE.BAD&377,R4 ;SET BAD PARAMETER CODEY BR IECMN ;;L4; PRIVILEGE VIOLATION-SET PRIVILEGE VIOLATION STATUS;37IEPRI: MOV #IE.PRI&377,R4 ;SET PRIVILEGE VIOLATION CODE BR IECMN ;;O?; FILE ALREADY ACCESSED ON LUN-SET FILE ALREADY ACCESSED STATSU7; 9IEALN: MOV #IE.ALN&377,R4 ;SET FILE ALREADY ACCESSED CODEV BR IECMN ;;E5; NO FILE ACCESSED ON LUN-SET NO FILE ACCESSED STATUST; 6IENLN: MOV #IE.NLN&377,R4 ;SET NO FILE ACCESSED STATUS .IF DF,R$$LKL BR IECOM ;IER0: ; USE ERROR IN R0.B;R2; EXPLICIT UNLOCK PERFORMED OR BLOCK LOCKING ERROR; STATUS IN R0;IIELCK: MOV R0,R4 ;STATUS IN R0E .ENDC;T; COMMON ERROR EXITC; )IECMN: MOV $TEMP0,SP ;RESET STACK POINTER 6 MOV (SP)+,R0 ;RETRIEVE ADDRESS OF SECONDARY CONTROL B BEQ 10$ ;IF EQ NONEF1 CALL $DEATR ;DEALLOCATE SECONDARY CONTROL BLOCKO%10$: MOV R4,R0 ;SET FINAL I/O STATUSS& CLR R1 ;CLEAR SECOND I/O STATUS WORD- MOV (SP)+,R3 ;RETRIEVE ADDRESS OF I/O PACKETL TST (SP)+ ;CLEAN STACK' MOV I.UCB(R3),R5 ;RETRIEVE UCB ADDRESST( CALLR $IOFIN ;FINISH OFF I/O OPERATION)PRMPRP: ; PREPARE NETWORK PARAMETERS.U8 MOV I.PRM+12(R4),I.PRM+16(R4) ; WILL BE ADJUSTED LATER. MOV I.PRM+10(R4),I.PRM+14(R4) MOV I.PRM+6,I.PRM+12(R4)I MOV I.PRM+4(R4),I.PRM+6(R4) MOV I.PRM+2(R4),I.PRM+4(R4) JMP @(R5)+ ; LEAVE. .ENABL LSBT.CKBFR2: ; CHECK BUFFER TWO FOR READ ACCESS.0 MOV #I.PRM+6,R3 ; SET OFFSET TO SECOND ADDRESS. BR 10$R.CKBFR1: ; CHECK BUFFER ONE FOR READ ACCESS.- MOV #I.PRM,R3 ; SET OFFSET TO FIRST ADDRESS.S10$: ADD R4,R3 ; POINT TO ADDRESS.A MOV R1,-(SP) ; SAVE REGISTERS.W MOV R0,-(SP)U% MOV (R3),R0 ; GE00”*| |töt÷tø tþfDATAT ADDRESS TO CHECK.  MOV 4(R3),R1 ; GET LENGTH.M BEQ 50$ ; YES, ACCEPT IT.P- CALL CKBFR ; CHECK BUFFER FOR WRITE ACCESS.)! BCS IER0 ; ERROR CODE IS IN R0.P" MOV R1,(R3)+ ; PUT APR IN PACKET.% MOV R2,(R3) ; PUT OFFSET IN PACKET.A50$:" MOV (SP)+,R0 ; RESTORE REGISTERS. MOV (SP)+,R1 JMP @(R5)+ ; LEAVE.C .DSABL LSBN .ENABL LSBS1CKBFW3: ; CHECK BUFFER THREE FOR WRITE ACCESS.0 ; THIS IS CUSTOMIZED FOR THE NETWORK DEVICE.0 MOV #I.PRM+14,R3 ; SET OFFSET TO THIRD ADDRESS. MOV R1,-(SP) ; SAVE REGISTER.) MOV I.PRM+16(R4),R1 ; GET LENGTH TO USE.,$ CMP R1,#20 ; IS LENGTH ACCEPTABLE? BHI IEBAD ; NO, SIGNAL ERROR.  CMP I.PRM+12(R4),#20P" ; IS SECOND LENGTH ACCEPTABLE? BHI IEBAD ; NO, SIGNAL ERROR.A@ ADD R1,I.PRM+4(R4) ; HACK FIRST LENGTH TO INCLUDE THIRD BUFFER. ADD I.PRM+12(R4),I.PRM+4(R4) + ; HACK FIRST LENGTH TO REPRESENT TOTAL.E8 MOVB R1,I.PRM+13(R4) ; COMBINE TWO LENGTHS IN ONE WORD. BR 10$K/CKBFW1: ; CHECK BUFFER ONE FOR WRITE ACCESS. - MOV #I.PRM,R3 ; SET OFFSET TO FIRST ADDRESS.I MOV R1,-(SP) ; SAVE REGISTER.( MOV I.PRM+4(R4),R1 ; GET LENGTH TO USE.10$: ADD R4,R3 ; POINT TO ADDRESS.P MOV R0,-(SP) ; SAVE REGISTER.% MOV (R3),R0 ; GET ADDRESS TO CHECK.O TST R1 ; IS LENGTH ZERO? BEQ 50$ ; YES, ACCEPT IT. - CALL CKBFB ; CHECK BUFFER FOR WRITE ACCESS.R! BCS IER0 ; ERROR CODE IS IN R0.O" MOV R1,(R3)+ ; PUT APR IN PACKET.% MOV R2,(R3) ; PUT OFFSET IN PACKET..50$:" MOV (SP)+,R0 ; RESTORE REGISTERS. MOV (SP)+,R1S JMP @(R5)+ ; LEAVE.T .DSABL LSBR%ACSPL: ; SPLIT ACCEPT AND CONNECT.EA BIT #10,I.FCN(R4) ; IS THIS AN ACCEPT (FUNCTION 15410 OR 15610)?O) BNE 10$ ; YES, SKIP CONNECT PROCESSING.S* MOV #1,R1 ; LIE ABOUT NUMBER OF BUFFERS.3 JMP CKBFW3 ; CHECK BUFFER THREE FOR WRITE ACCESS. 10$:$ MOV #11,R1 ; INDICATE TWO BUFFERS. JMP @(R5)+ ; LEAVE.E1ADRSPL: ; SPLIT ABORT, DISCONNECT, AND REJECT.E CMP #16020,I.FCN(R4)  ; IS THIS A REJECT? BNE 10$ ; NO, CONTINUE.I5 MOV #MERGE,R5 ; YES, SEND EXECUTION TO NEW LOCATION. 10$: JMP @(R5)+ ; LEAVE.E-NCTSPL: ; SPLIT NETWORK CONTROL FUNCTIONS. & MOV I.FCN(R4),R1 ; GET FUNCTION CODE.9 BIC #177707,R1 ; EXTRACT THREE BITS INDICATING FUNCTION.B ASR R1R ASR R1R7 TST NCTTBL(R1) ; IS THERE A SPECIAL LOCATION TO GO TO? BEQ 10$ ; NO, CONTINUE.T# MOV NCTTBL(R1),R5 ; YES, FETCH IT.E10$: JMP @(R5)+ ; LEAVE. NCTTBL:  .WORD 0 ; 00, OPEN .WORD 0 ; 10, CLOSES .WORD SKIP ; 20, SPECIFY AST$ .WORD NTRVB ; 30, GET NETWORK DATA$ .WORD NTRVB ; 40, GET NETWORK DATA$ .WORD NTRVB ; 50, GET NETWORK DATA .WORD FCIFC ; 60. .WORD NTRVB ; 70, GET LOCAL NODE INFORMATION;; BUILD AN I/O PACKETC;HBDPKT:;C; SPREAD OUT PARAMETERSR;A0 MOV I.PRM+12(R4),I.PRM+16(R4) ;COPY FNB ADDRESS' MOV I.PRM+10(R4),I.PRM+14(R4) ;COPY P5T' MOV I.PRM+6(R4),I.PRM+12(R4) ;COPY P40' MOV I.PRM+4(R4),I.PRM+10(R4) ;COPY P3.; MOV I.PRM+2(R4),I.PRM+6(R4) ;COPY ATTRIBUTE LIST POINTER,. MOV I.PRM(R4),I.PRM+2(R4) ;COPY FID POINTER( CLR I.PRM(R4) ;ASSUME NO BUFFER BIAS;O&; DETERMINE SIZE OF BUFFER TO ALLOCATE;I, CLR -(SP) ;SET COUNT OF ATTRIBUTES TO ZERO+ MOV KISAR6,-(SP) ;SAVE TASK HEADER MAPPINGH& MOV R4,-(SP) ;SAVE I/O PACKET POINTER2 CLR -(SP) ;SET SIZE OF CPRBUF ALLOCATION TO ZERO! TST I.PRM+2(R4) ;IS THERE A FID?; BEQ 10$ ;IF EQ NO69 ADD #3.*2+4,(SP) ;ACCOUNT FOR 3 WORD BUFFER PLUS ADDRESS '10$: TST I.PRM+16(R4) ;IS THERE AN FNB?  BEQ 20$ ;IF EQ NO : ADD #15.*2+4,(SP) ;ACCOUNT FOR 15 WORD BLOCK PLUS ADDRESS20$:;R-; CALCULATE SIZE OF ALL THE ATTRIBUTE BUFFERSI;O2 MOV I.PRM+6(R4),R3 ;GET ADDRESS OF ATTRIBUTE LIST BEQ 70$ ;IF EQ NONE S.30$: MOV R3,R0 ;GET ADDRESS OF NEXT ATTRIBUTE" MOV #4,R1 ;SET SIZE OF ATTRIBUTE1 CALL $ACHCK ;ADDRESS CHECK ATTRIBUTE DESCRIPTORI BCS IESPC ;IF CS ERROR CALL $RELOM ;RELOCATE AND MAP.$ ADD #4,R3 ;POINT TO NEXT ATTRIBUTE# TSTB (R0)+ ;IS THERE AN ATTRIBUTEI BEQ 40$ ;IF EQ NOQ ADD #6,(SP) ;INCLUDE ATTRIBUTE4 INC 6(SP) ;INCREMENT NUMBER OF ATTRIBUTES COUNTER00”2||Ž{´cÚµcÛ¶c�·c›’ CLR R2 ;GET SIZE OF ATTRIBUTE  MOVB (R0),R2 ;4 CMP R2,#MXSIZ ;IS IT TOO BIG TO GO INTO THE BUFFER? BHI 30$ ;IF HI OR SAME, YESM& ADD R2,(SP) ;INCLUDE IT IN THE TOTAL BR 30$ ;LOOK AT NEXT ATTRIBUEU/40$: ADD #2,(SP) ;ACCOUNT FOR END OF LIST WORDP%70$: MOV (SP)+,R1 ;GET SIZE OF BUFFERR BEQ NOBUF ;IF EQ EMPTY( ADD #4,R1 ;ACCOUNT FOR INITIAL 4 BYTES) MOV (SP)+,R4 ;RECOVER I/O PACKET POINTER . MOV (SP)+,KISAR6 ;RECOVER TASK HEADER MAPPING; ; ALLOCATE A BUFFER FROM CPRBUFB;S7 MOV R1,I.PRM+4(R4) ;SET LENGTH OF BUFFER IN I/O PACKET  BNE 80$ ;IF NE THERE IS ONEI' JMP NOBUF ;DON'T NEED TO GET A BUFFERI,80$: ADD #77,R1 ;ROUND SIZE TO NEAREST 32.  ASH #-6,R1 ; WORD BLOCKE CLR R0 ;NO FLAGS, CALL $CPALO ;ALLOCATE A BUFFER FROM CPRBUF$ BCS IENOD ;IF CS ALLOCATION FAILED. MOV R0,I.PRM(R4) ;PUT BIAS IN FIRST PARAMETER% MOV KISAR6,R1 ;SAVE TASK HEADER BIASR MOV R0,KISAR6 ;MAP BUFFER. MOVB (SP)+,MAP6+1 ;SAVE NUMBER OF ATTRIBUTES ! MOV R1,KISAR6 ;REMAP TASK HEADER0 MOV #MAP6+4,R3 ;POINT TO THIRD WORD FOR BUFFERS;E ; BUILD FID ; 1 MOV I.PRM+2(R4),R0 ;SET ADDRESS OF FILE ID BLOCKB BEQ 90$ ;IF EQ NONERD MOV #100000,I.PRM+2(R4);INDICATE THAT FID EXISTS (OFFSET 4 IMPLIED)* MOV #3*2,R1 ;SET LENGTH OF FILE ID BLOCK# CALL INPRMW ;INSERT FILE ID BLOCKT BCS IESPC ;ERROR OCCURED90$:;B; BUILD FILE NAME BLOCKM;K4 MOV I.PRM+16(R4),R0 ;SET ADDRESS OF FILE NAME BLOCK BEQ 100$ ;IF EQ NONE0 MOV R3,I.PRM+16(R4) ;PUT OFFSET INTO I/O PACKET2 BIC #MAP6,I.PRM+16(R4) ;GET RID OF APR6 BIAS BITS- MOV #15.*2,R1 ;SET LENGTH OF FILE NAME BLOCKM% CALL INPRMW ;INSERT FILE NAME BLOCKB100$:9; ; BUILD ATTRIBUTE POINTER BLOCK2;)EATRBK: MOV I.PRM+6(R4),R0 ;GET ADDRESS OF ATTRIBUTE DESCRIPTOR BLOCK F% BEQ NOATTR ;NOT SPECIFIED? IF EQ NOI/ MOV R3,I.PRM+6(R4) ;PUT OFFSET INTO I/O PACKET1 BIC #MAP6,I.PRM+6(R4) ;GET RID OF APR6 BIAS BITS; MOV KISAR6,-(SP) ;SAVE MAPPINGQ% MOV I.PRM(R4),KISAR6 ;MAP CPR BUFFER)+ MOVB MAP6+1,R1 ;GET NUMBER OF ATTRIBUTESM BEQ 25$ ;IF EQ NULL LIST910$: MOV R1,-(SP) ;SAVE NUMBER OF ATTRIBUTES ON THE STACK % MOV #4,R1 ;COPY 4 WORDS INTO PACKET9( MOV R0,-(SP) ;SAVE ADDRESS OF ATTRIBUTE* CALL INPRM ;INSERT ATTRIBUTE INTO PACKET, SUB #6,R3 ;BACK UP TO ADDRESS OF ATTRIBUTE& MOVB -1(R3),R0 ;GET SIZE OF ATTRIBUTE CMPB R0,#MXSIZ ;IS IT TOO BIG?E BLO 20$ ;IF LO YES' MOV (R3),R0 ;GET ADDRESS OF ATTRIBUTEK CALL $RELOC ;RELOCATE IT MOV R1,(R3) ;SAVE BIAS MOV R2,2(R3) ; AND DISPLACEMENT,20$: CMP (R3)+,(R3)+ ;MOVE R3 PAST ADDRESSES+ MOV (SP)+,R0 ;RESTORE ADDRESS OF ATTRIBUTET& ADD #4,R0 ;ADDRESS OF NEXT ATTRIBUTE, MOV (SP)+,R1 ;GET NUMBER OF ATTRIBUTES LEFT1 SOB R1,10$ ;LOOP UNTIL ALL ATTRIBUTES ARE DONEI225$: CLR (R3)+ ;INCLUDE ZERO WORD FOR END OF LIST;#; INSERT ATTRIBUTES INTO THE BUFFERE;C1 MOV I.PRM+6(R4),R2 ;GET OFFSET OF ATTRIBUTE LISTS$ ADD #MAP6,R2 ;POINT FIRST ATTRIBUTE K-30$: TSTB (R2)+ ;IS THERE AN ATTRIBUTE HERE?V BEQ 40$ ;IF EQ NO  MOVB (R2)+,R1 ;GET LENGTH* CMPB R1,#MXSIZ ;IS IT TOO BIG FOR BUFFER? BLO 35$ ;IF LO NOS0 CMP (R2)+,(R2)+ ;MOVE POINTER TO NEXT ATTRIBUTE BR 30$ ;LOOK AT NEXT ATTRIBUTE I+35$: MOV (R2),R1 ;GET ADDRESS OF ATTRIBUTER7 MOV KISAR6,(R2)+ ;PUT BIAS/OFFSET IF ATTRIBUTE IN LISTR MOV R3,(R2)+ ;( MOV R2,-(SP) ;SAVE POINTER TO ATTRIBUTE CALL INPRM ;COPY ATTRIBUTE MOV (SP)+,R2 ;RESTORE POINTER BR 30$ ;LOOK AT NEXT ATTRIBUTE(40$: MOV (SP)+,KISAR6 ;REMAP TASK HEADERNOATTR:INOBUF: JMP @(R5)+);10; INPRM: INSERT PARAMETERS WITH NO ADDRESS CHECK<; INPRMW,INPRMB: INSERT PARAMETER BLOCK WORD OR BYTE ALIGNED; 8; INPUTS : R0 - ADDRESS OF BLOCK IN USER'S ADDRESS SPACE; R1 - LENGTH OF BLOCK/; R3 - POINTER INTO CPR BUFFER (APR6 ADDRESS)T; 8; OUTPUT: R0 - OFFSET INTO CPR BUFFER OF START OF BLOCK0; R3 - UPDATED TO POINTER AFTER INSERTED BLOCK; R4 IS PRESERVEDS;E .ENABL LSBBINPRM: SAVNR ;SAVE R4,R5 E* MOV I.PRM(R4),-(SP) ;SAVE BIAS OF CPRBUF$ MOV R1,-(SP) ;SAVE LENGTH OF BUFFER BR 5$ ;JOIN COMMON COD00”:|•?|töt÷tø tþfDATAEW1INPRMW: MOV #$CKBFW,R2 ;CKECK BUFFER WORD ALIGNEDE BR 2$ ;CALL ROUTINEA1INPRMB: MOV #$CKBFB,R2 ;CHECK BUFFER BYTE ALIGNEDR2$: SAVNR ;SAVE R4,R5-&; DO ADDRESS CHECK AND RELOCATE BUFFER) MOV I.PRM(R4),-(SP) ;SAVE BIAS OF CPRBUF $ MOV R1,-(SP) ;SAVE LENGTH OF BUFFER1 MOV R2,-(SP) ;SET ADDRES OF BUFFER CHECK ROUTINEK+ CALL @(SP)+ ;CHECK AND LOCK USER'S BUFFERR BCS INERR ;IF CS ERROR!5$: CALL $RELOC ;RELOCATE BUFFERP .DSABL LSB,@; MAP CPRBUF AND COPY BIAS OFFSET INTO 2 WORDS AFTER DATA BUFFER MOV (SP)+,R0 ;RESTORE LENGTHL( MOV KISAR6,R5 ;SAVE TASK HEADER MAPPING MOV (SP),KISAR6 ;MAP CPRBUF/ MOV R3,R4 ;GET OFFSET OF 2 WORDS AFTER BUFFERE ADD R0,R4 ;L MOV R1,(R4)+ ;COPY BIAS MOV R2,(R4) ; AND OFFSET! MOV R5,KISAR6 ;REMAP TASK HEADER ; USE BLXIO TO DO COPY) SUB #MAP6-MAP5,R2 ;MAKE OFFSET FROM APR5+# MOV R3,R4 ;GET OFFSET INTO CPRBUFS! MOV (SP)+,R3 ;GET BIAS OF CPRBUFE CALL $BLXIO ;COPY BUFFER( MOV R4,R3 ;PUT UPDATED POINTER INTO R32 ADD #4,R3 ;PUDATE POINTER PAST RELOCATED ADDRESS RETURNL(INERR: CMP (SP)+,(SP)+ ;CLEAN OFF STACK& RETURN ;RETURN WITH CARRY STILL SET;4+; LOCK HEADER IN MEMORY DURING ACP FUNCTIONR;43CKLHD: MOV $TKTCB,R0 ;GET CURRENT TASK TCB ADDRESSS, MOV T.ATT(R0),R0 ;GET ATTACHMENT DESCRIPTOR6 INCB A.IOC-A.TCBL(R0) ;BUMP I/O COUNT FOR TASK REGION4 MOV A.PCB-A.TCBL(R0),R0 ;GET ADDRESS OF TASK REGION( INCB P.IOC(R0) ;BUMP REGION'S I/O COUNT; BISB #200,I.EFN(R4) ;FLAG REQUEST AS A VIRTUAL I/O REQUESTD JMP @(R5)+ ;;NF; EXIT WITH EITHER ONE OR NO BITS SET IN THE FLAG WORD, OR THE WORD AS; SPECIFIED IN R1.;T .ENABL LSBY$CKNXT: ; USE R1 FOR BUFFER FLAGS. MOV R1,R0 ; GET BUFFER FLAGS.K# BR 10$ ; CONTINUE IN COMMON CODE. )CK1XC: TST I.PRM(R4) ;IS THERE A BUFFER?M BNE CK1XT ;IF NE YESCK0XT: CLR R0 ;NO BUFFERS BR 10$ ;JOIN COMMON CODECK1XT: MOV #1,R0 ;ONE BUFFERF10$: .DSABL LSB ;O; CALCULATE LUN NUMBER C;T1 MOV I.LN2(R4),R3 ;GET POINTER TO 2ND LUN WORD/, SUB #,R3 ;GET OFFSET INTO LUT- ASR R3 ;DIVIDE BY 4 (4 BYTES PER LUN ENTRY)E ASR R3 ;! INC R3 ;LUN NUMBERS START AT 18 MOVB R3,I.LN2(R4) ;RETURN TO LUN FIELD IN I/O PACKET;R; FILL IN BUFFER FLAGN;U MOVB R0,I.LN2+1(R4) ;:;S; EXIT POLISH TO FUNCTION EXIT;B. TST (SP)+ ;REMOVE ADDRESS OF SECOND LUN WORD# MOV (SP)+,R5 ;RETRIEVE UCB ADDRESSV, MOV U.SCB(R5),R0 ;GET I/O QUEUE LISTHEAD MOV R4,R1 ;GET PACKET POINTERI CALLR $QINSP ;INSERT PACKET2 .END /, SUB #,R .TITLE XXTTIe .IDENT /01.00/ ;d6; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;t<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;;; 03-MAR-87 KAREN NOEL; ;;+; ; ****** X X T T I ******;A; THIS MODULE CONTAINS THE ROUTINES TO VALIDATE A NEW I/O REQUESTH; FOR A TERMINAL. THE I/O REQUESTS ARE VALIDATED PRIOR TO PLACING THEM J; IN THE DEVICE'S I/O PACKET QUEUE. THIS MUST OCCUR WHILE THE USER TASK L; WHICH ISSUED THE REQUEST IS STILL THE CURRENT TASK. NEXT, THE REQUEST IS 1; PLACED IN THE REQUEST QUEUE FOR THE TERMINAL. N;A;-;B .MCALL PKTDF$ PKTDF$I;C; LOCAL SYMBOL DEFINITIONS; MAP6 = 140000.PAGER, .SBTTL XXTTI - FUNCTION CODE DISPATCH TABLE;T?; DISPATCH TABLE FOR PROCESSING DIFFERENT FUNCTION CODES BEFORE %; ENTERING A PACKET IN THE I/O QUEUE.E;OQPDSP: .WORD QPKIL ;IO.KILO .WORD QPWLB ;IO.WLBE .WORD QPRLB ;IO.RLBE .WORD QPATT ;IO.ATTI .WORD QPDET ;IO.DETH! .WORD QPSPC ;SPECIAL FUNCTIONS: ; IO.GTS ; SF.SMC ; SF.GMC .WORD QPHNG ;IO.HNGU/ .WORD 0 ;RESERVED EXEC CLOSE-OUT-LUN FUNCTION$- .WORD 0 ;RESERVED FOR USER MODE DIAGNOSTICS .WORD QPRPR ;IO.RPRR .WORD QPRTT ;IO.RTT  .IF DF B$$MAP .WORD QPWSD ;IO.WSDE .WORD QPRSD ;IO.RSD  .ENDC ;B$$MAP .WORD 0 ;IO.EIOP.PAGETB .SBTTL XXTTI - TERMINAL DRIVER I/O REQUEST INITIATION ENTRY POINT;L;+-; **-XXTTI - VALIDATE I/O 00•B||Ž{´cÚµcÛ¶c�·c›’PACKET ENTRY POINT.;OK; THIS ROUTINE IS CALLED FROM "XXDRV" WHEN A TASK HAS ISSUED AN I/O REQUESTFK; FOR A TERMINAL. THE CALL IS MADE PRIOR TO QUEUEING THE I/O PACKET TO THETK; SCB QUEUE SINCE TERMINALS HAVE THE "UC.QUE" BIT SET IN THEIR UCB'S. THIS J; IS DONE WHILE THE TASK CONTEXT IS STILL VALID, SINCE MANY FUNCTIONS WILL?; NEED ADDITIONAL PARAMETER CHECKS NOT DONE BY THE EXECUTIVE. ;P ; INPUTS:*; R1 => I/O REQUEST PACKET TO BE PROCESSED&; R4 => SCB FOR THE REQUESTED TERMINAL&; R5 => UCB FOR THE REQUESTED TERMINAL;S; OUTPUTS: NONE.; "; REGISTERS MODIFIED: R0, R1, R3;-;SXXTTI::  SAVNR$ MOV R1,R3 ;COPY I/O PACKET POINTER/ MOVB I.FCN+1(R3),R0 ;GET THE I/O FUNCTION CODEL$ ASL R0 ;CONVERT IT TO A WORD INDEX3 CALLR @QPDSP(R0) ;DISPATCH TO PROCESS THIS REQUEST .PAGEN .SBTTL XXTTI SUBROUTINESE@ .SBTTL . KILAC - $GSPKT ACCEPTANCE ROUTINE FOR KILL I/O (QPKIL);I;+3; **-KILAC - KILL I/O ACCEPTANCE ROUTINE FOR $GSPKT=;CJ; "$GSPKT" CALLS THIS ROUTINE WITH AN I/O PACKET TO BE CHECKED AGAINST THE; KILL I/O ACCEPTANCE CRITERIA:SD; 1. THE I/O PACKET UCB ADDRESS MUST MATCH THE I/O KILL REQUEST UCB.D; 2. THE I/O PACKET TCB ADDRESS MUST MATCH THE I/O KILL REQUEST TCB.D; 3. IF THE I/O KILL SUBFUNCTION WAS TF.WLB, THE I/O PACKET FUNCTION,; CODE MUST BE "IO.EIO!TF.WLB" OR "IO.WLB".D; 4. IF THE I/O KILL SUBFUNCTION WAS TF.RLB, THE I/O PACKET FUNCTIONA; CODE MUST BE "IO.EIO!TF.RLB", "IO.RLB", "IO.RPR", OR "IO.RTT".S;= ; INPUTS:3; R1 => I/O REQUEST PACKET TO BE ACCEPTED/REJECTED.K(; G$$SPA(SP) => UCB OF PACKETS TO ACCEPT'; G$$SPA+2 => I/O KILL REQUEST PACKETU;M ; OUTPUTS:K'; CC-C = 0 IF PACKET IS TO BE ACCEPTED '; = 1 IF PACKET IS TO BE REJECTEDC;; REGISTERS MODIFIED: R2, R3;-;.KILAC:> CMP I.UCB(R1),G$$SPA(SP) ;IS THIS PACKET FOR THE CORRECT UCB?& BNE 30$ ;IF NE, NO...DON'T ACCEPT IT: MOV G$$SPA+2(SP),R3 ;GET POINTER TO KILLER REQUEST PACKET5 CMP I.TCB(R1),I.TCB(R3) ;PACKET FOR THE CORRECT TCB?& BNE 30$ ;IF NE, NO...DON'T ACCEPT IT6 MOVB I.FCN(R3),R3 ;GET KILLER PACKET SUBFUNCTION CODE1 MOVB I.FCN+1(R1),R2 ;GET PACKET SUBFUNCTION CODET= CMPB #IO.EIO/400,R2 ;IS THIS PACKET AN EXTENDED I/O REQUEST?P BNE 5$ ;IF NOT, BRC;WARNING: THIS ASSUMES THAT IO.RLB/400,TF.RLB AND IO.WLB/400,TF.RLB)> MOVB I.FCN(R1),R2 ;GET NON-EXTENDED I/O REQUEST FUNCTION CODE5$:.6 CMPB #IO.RPR/400,R2 ;IS THIS AN OLD-FASHIONED IO.RPR? BEQ 10$ ;IF EQ, YES...SKIP7 CMPB #IO.RTT/400,R2 ;IS THIS AN OLD-FASHIONED IO.RTT?I BNE 20$ ;IF NE, NO...SKIPM10$:5 MOVB #TF.RLB,R2 ;MAKE THESE LOOK LIKE STRAIGHT READS.20$:1 CLC ;ASSUME WE ARE GOING TO ACCEPT THIS PACKETI, BITB R3,R2 ;IS THIS A PACKET TO BE KILLED?! BNE 40$ ;IF NE, YES...ACCEPT ITI30$: SEC ;DON'T ACCEPT THIS PACKET40$: RETURN ;ALL DONEM.PAGE(1 .SBTTL I/O REQUEST PRE-QUEUE PROCESSING ROUTINES+ .SBTTL . QPKIL - INTERNAL I/O KILL REQUESTF;I;+/; **-QPKIL - INTERNAL I/O KILL REQUEST (IO.KIL).;/I; THIS ROUTINE PROCESSES AN I/O REQUEST WITH A FUNCTION CODE OF ZERO. AN0K; I/O PACKET WILL ONLY HAVE THIS FUNCTION CODE IF IT IS AN INTERNAL (SYSTEMUK; STATE) I/O REQUEST. IT PERFORMS FUNCTIONS SIMILAR TO THE DRIVER'S CANCELKJ; I/O ENTRY POINT "TTCAN". HOWEVER, IT CAN BE SPECIFIED THAT ONLY READ ORI; ONLY WRITE REQUESTS ARE TO BE CANCELLED. THIS IS DONE WITH THE REQUEST L; MODIFIERS "TF.WLB" AND "TF.RLB". A "$GSPKT" ACCEPTANCE ROUTINE IS USED TON; FIND ALL SPECIFIED REQUESTS IN THE SCB QUEUE. AN I/O KILL REQUEST IS ALWAYSN; PROCESSED AND COMPLETED IMMEDIATELY, SO IT IS NEVER PLACED IN THE SCB QUEUE.;N ; INPUTS:; R3 => I/O KILL REQUEST PACKETT; R4 => SCB FOR THE TERMINAL; R5 => UCB FOR THE TERMINAL; I.FCN = TF.WLB OR TF.RLBN7; I.TCB => TCB OF TASK WHOSE REQUESTS ARE TO BE ABORTEDR; ; OUTPUTS:Q7; SPECIFIED I/O REQUESTS ARE ABORTED WITH STATUS IE.ABO ; "; REGISTERS MODIFIED: R0, R1, R2;-;" .IF DF R$$IICQPKIL::O .IF DF M$$PRO/ BIT S.URM(R4),@$CPURM ;ALREADY ON CORRECT CPU?T BNE 5$ ;IF NE YES, CONTINUEP7; 00•J|?|töt÷tø tþfDATACONVERT PARAMETER LIST PART OF I/O PACKET INTO A FORK ; BLOCK FOR INTERPROCESSOR FORK.( ADD #I.PRM+12,R3 ;POINT TO KISAR5 FIELD) MOV KINAR5,(R3) ;INSERT DRIVER I MAPPINGT$ MOV R4,-(R3) ;SAVE R4 IN FORK BLOCK7 MOV S.URM(R4),-10(R3) ;SET URM OF DEVICE IN FORK BLOCK . MOV R3,R4 ;POINT R4 AT FORK BLOCK FOR $FORK1$ CALL $FORK1 ;SWITCH TO CORRECT CPU7 SUB #I.PRM+4,R3 ;POINT BACK TO BEGINNING OF FORK BLOCK  CALL MAPD ;RE-MAP DRIVER5$:; .ENDC ; DF M$$PRO* MOV R3,-(SP) ;SAVE REQUEST PACKET POINTER' MOV R5,-(SP) ;SAVE CURRENT UCB POINTERA. ;**NOTE: THESE ARE SAVED FOR INSPECTION...) ; ...IN THE $GSPKT ACCEPTANCE ROUTINEK7 MOV I.TCB(R3),R1 ;GET TCB OF TASK TO KILL REQUESTS FOR < MOV I.FCN(R3),R3 ;GET FUNCTION CODE OF THINGS TO KILL IN R3= CALL TTCN1 ;CANCEL SELECTIVE I/O (DEPENDS ON TF.WLB/TF.RLB)C10$:" MOV (SP),R5 ;RESTORE UCB ADDRESS1 MOV #KILAC,R2 ;SET POINTER TO ACCEPTANCE ROUTINE CALL $GSPKT ;GET A PACKET$, BCS 20$ ;IF CS, NO MORE PACKETS...ALL DONE1 MOV R1,R3 ;COPY KILLED PACKET ADDRESS FOR IOFINN2 MOV #IE.ABO&377,R0 ;SET REQUEST COMPLETION STATUS( CALL IOFIN ;FINISH OFF THE I/O REQUEST! BR 10$ ;LOOK FOR ANOTHER PACKETT20$: TST (SP)+ ;CLEAN STACK: MOV (SP)+,R3 ;GET BACK ADDRESS OF I/O KILL REQUEST PACKET( MOV #IS.SUC&377,R0 ;SUCCESSFUL I/O KILL JMP IOFIN ;FINISH I/O KILL .ENDC ;R$$IIC.PAGEU9 .SBTTL . BUFFER ADDRESS CHECKING AND RELOCATION ROUTINESN;;+2; **-CKBFR - ADDRESS CHECK BUFFER FOR READ ACCESSE; **-CKBFRW - ADDRESS CHECK BUFFER FOR READ ACCESS AND WORD ALIGNMENT8; **-CKBFB - ADDRESS CHECK BUFFER FOR READ/WRITE ACCESS;II; THESE ROUTINES PERFORM THE DESCRIBED ADDRESS CHECKING ON A USER BUFFER.T;( ; INPUTS:%; R0 => USER BUFFER (VIRTUAL ADDRESS) ; R1 = LENGTH OF USER BUFFERV;S ; OUTPUTS:S*; CC-C = 0 IF ADDRESS CHECK WAS SUCCESSFUL"; CC-C = 1 IF ADDRESS CHECK FAILED4; R0 = ERROR CODE FOR ADDRESS CHECK FAILURE REASON:.; "IE.SPC" IF SPECIFIED BUFFER LENGTH IS ZEROB; "IE.SPC" IF BUFFER NOT WORD ALIGNED OR EXEC ADDRESS CHECK FAILS6; "IE.BAD" IF BUFFER SIZE IS GREATER THAN 8128. BYTES-; R1 = BIAS OF RELOCATED USER BUFFER ADDRESSO5; R2 = DISPLACEMENT OF RELOCATED USER BUFFER ADDRESS(; ; REGISTERS MODIFIED: R0;-;U .ENABL LSB CKBFRW:G. BIT #1,R0 ;DOES BUFFER START ON ODD ADDRESS?4 BNE 910$ ;IF NE, YES...RETURN INVALID BUFFER ERRORCKBFR::A5 MOV #$CKBFR,-(SP) ;SET UP CALL FOR READ-ACCESS CHECK: BR 10$ ;SKIP TO COMMON CODEECKBFB:: 6 MOV #$CKBFB,-(SP) ;SET UP CALL FOR WRITE-ACCESS CHECK10$: TST R1 ;IS BUFFER SIZE VALID?E3 BEQ 900$ ;IF EQ, NO...RETURN INVALID BUFFER ERRORE6 CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?5 BHI 920$ ;IF HI, YES...RETURN BAD BUFFER SIZE ERROR .IF DF X$$HDR; MOV (SP),-(SP) ;DUPLICATE MAPPING ROUTINE ADDRESS ON STACK, MOV KISAR6,2(SP) ;SAVE CURRENT EXEC MAPPING+ MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADERP .IFTF ;X$$HDR3 CALL @(SP)+ ;CALL REQUESTED ADDRESS CHECK ROUTINE .IFT ;X$$HDRS+ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING .ENDC ;X$$HDR+ BCS 910$ ;IF CS, IT FAILED...RETURN ERRORI9 CALL $RELOC ;RELOCATE ADDRESS AND CONVERT TO DOUBLEWORDA RETURN ;ALL DONE9900$:H( TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS910$:HA MOV #IE.SPC&377,R0 ;SET COMPLETION ERROR CODE FOR INVALID BUFFER BR 990$ ;SKIP 920$:U( TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS; MOV #IE.BAD&377,R0 ;SET COMPLETION ERROR CODE FOR BAD SIZEE990$:  SEC ;RETURN WITH ERROR FLAG RETURN ;ALL DONE+ .DSABL LSBE.PAGE ? .SBTTL . TSTRQ - CHECK I/O REQUEST QUEUE FOR PACKET TO DEQUEUER;R;+$; SUBROUTINE TSTRQ - TEST I/O QUEUE.;O; INPUT:; R5 POINTER TO U.TSTA;D ; OUTPUT:$:; IF THERE IS (POTENTIALLY) A PACKET IN THE I/O QUEUE THAT; CAN BE PROCESSED:T>; RETURN TO CALLER WITH R3 = MASK OF BITS TO CLEAR IN U.TSTA+2 ; IF NO PACKET COULD BE DEQUEUED;I ; IF NOT:; RETURN TO CALLER'S CALLER.;T; REGISTERS ALTERED: R3Z;-;$TSTRQ:: .; MOV (R5),R3 ;GET FIRST TERMINAL STATUS WORD; COM R3 ;INVER00•R||Ž{´cÚµcÛ¶c�·c›’T ITB; BIC #^C,R3 ;CLEAR ALL TO SEE WHAT CAN BE DEQUEUED0; BIS #S2.SRQ,R3 ;OR WITH "SPECIAL REQUEST" FLAG;; BIT R3,2(R5) ;IS ANYTHING IN QUEUE THAT CAN BE PROCESSED?E7; BEQ 10$ ;IF EQ, NO...POP OUR WAY OUT OF THIS ROUTINEEB; BIT #S2.BRQ,2(R5) ;IS THERE A "BREAKTHROUGH WRITE" IN THE QUEUE?5; BNE 20$ ;IF NE, YES...IT CAN POSSIBLY BE PROCESSEDT;; ASSUME S3.FDX,200C;E*; TSTB 4(R5) ;USER ON A FULL DUPLEX LINE?5; BMI 20$ ;IF MI, YES...IT CAN POSSIBLY BE PROCESSED8; BIT #S1.IBY!S1.OBY,(R5) ;IS ANYTHING BUSY ON THE LINE?3; BEQ 20$ ;IF EQ, NO...RETURN TO PROCESS A REQUESTW;10$:E<; TST (SP)+ ;POP RETURN ADDRESS SO WE WON'T PROCESS REQUEST;20$:P RETURN ;ALL DONE .PAGE." .SBTTL . WRITE REQUEST PROCESSING% .SBTTL . QPWSB - WRITE SPECIAL DATAH;G;+(; **-QPWSD - WRITE SPECIAL DATA (IO.WSD);-;A .IF DF B$$MAPQPWSD::9 BIC #^C,I.FCN(R3) ;CLEAR DISALLOWED BITSL( BIS #TF.WAL,I.FCN(R3) ;SET REQUIRED BIT< CMP #T.RSDN,I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?% BHIS QPWLB1 ;IF HIS, YES...CONTINUEN6 BR EQPBAD ;ELSE, RETURN REQUEST WITH BAD PARAMENTERS .ENDC ;B$$MAP& .SBTTL . QPWLB - WRITE LOGICAL BLOCK; ;+*; **-QPWLB - NORMAL WRITE REQUEST (IO.WLB);-;SQPWLB::BQPWLB1:B6 MOV #1,R4 ;INDICATING ONE BUFFER IN FIRST PARAMETER> BITB #TF.WBT,I.FCN(R3) ;IS THIS A BREAKTHROUGH WRITE REQUEST?: BEQ CKBFLN ;IF EQ, NO...CHECK BUFFER LENGTH AND QUEUE IT( MOV I.TCB(R3),R0 ;GET ISSUEING TASK TCB; BIT #T3.PRV!T3.CLI,T.ST3(R0) ;IS TASK PRIVILEGED OR A CLI? 0 BNE 10$ ;IF NE, YES...DO BREAKTHROUGH ;SA4605 CMP T.UCB(R0),R5 ;IS THE IO.WBT TO OWN TI:? ;SA460B. BNE EQPPRI ;IF NOT, DON'T ALLOW IT ;SA46010$: ;SA460 ;**-16 MOVB #251.,I.PRI(R3) ;CHANGE REQUEST TO PRIORITY 251.= BIS #TF.CCO,I.FCN(R3) ;BREAKTHROUGH IMPLIES CANCEL CONTROL-OH6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST.PAGEU! .SBTTL . READ REQUEST PROCESSINGT$ .SBTTL . QPRSD - READ SPECIAL DATA;3;+/; **-QPRSD - READ SPECIAL DATA REQUEST (IO.RSD);-;$ .IF DF B$$MAPQPRSD::O8 BIC #^C,I.FCN(R3) ;CLEAR DISALLOWED BITS4 BIS #,I.FCN(R3) ;FORCE REQUIRED BITS4 TST I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?1 BEQ EQPBAD ;ZERO IS NOT ALLOWED, BAD PARAMETERSS< CMP #T.RSDN,I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?< BHIS CKBFLN ;IF HIS, YES...FINISH CHECKS AND QUEUE REQUEST BR EQPBAD ;BAD PARAMETERSO .ENDC ;B$$MAP$ .SBTTL . QPRPR - READ AFTER PROMPT;Q;+/; **-QPRPR - READ AFTER PROMPT REQUEST (IO.RPR).;-;$ .ENABL LSB:QPRPR::C: MOV I.PRM+10(R3),R0 ;GET VIRTUAL ADDRESS OF PROMPT BUFFER, MOV I.PRM+12(R3),R1 ;GET PROMPT BUFFER SIZE. MOV R1,I.PRM+14(R3) ;SET LENGTH IN I/O PACKET: CALL CKBFR ;CHECK READ ACCESS AND RELOCATE PROMPT BUFFER9 BCC 10$ ;IF CC, OK...GO STORE ADDRESS AND QUEUE REQUESTB: BR IOFIN ;CHECK FAILED...COMPLETE REQUEST WITH THE ERROR- .SBTTL . QPRTT - READ WITH TERMINATOR TABLE;B;+8; **-QPRTT - READ WITH TERMINATOR TABLE REQUEST (IO.RTT);-;MQPRTT::T5 MOV I.PRM+10(R3),R0 ;GET ADDRESS OF TERMINATOR TABLE14 MOV #32.,R1 ;LENGTH OF TABLE IS FIXED AT 32. BYTES. MOV R1,I.PRM+14(R3) ;SET LENGTH IN I/O PACKET; CALL CKBFRW ;CHECK READ ACCESS AND RELOCATE TABLE ADDRESSD8 BCS IOFIN ;IF CS, CHECK FAILED...RETURN WITH THE ERROR10$:< MOV R1,I.PRM+10(R3) ;SAVE FIRST WORD OF ADDRESS DOUBLE WORD= MOV R2,I.PRM+12(R3) ;SAVE SECOND WORD OF ADDRESS DOUBLE WORDR" MOV #21,R4 ;INDICATE TWO BUFFERS6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST .DSABL LSBI% .SBTTL . QPRLB - READ LOGICAL BLOCK ;L;+); **-QPRLB - NORMAL READ REQUEST (IO.RLB)3;-;SQPRLB::, MOV #1,R4 ;INDICATE ONE BUFFER6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST.PAGES .SBTTL . ERROR HANDLING; ,; EQPPRI - RETURN PRIVILEGE VIOLATION ERROR.;REQPPRI:;; MOV #IE.PRI&377,R0 ;SET ERROR CODE FOR PRIVILEGE VIOLATION;; BR IOFIN ;FINISH I/O REQUEST (NO NEED TO RESTORE MAPPING)A;T+; EQPBAD - RETURN ERROR FO00•Z|?|töt÷tø tþfDATAR BAD PARAMETERS.A;QEQPBAD::: MOV #IE.BAD&377,R0 ;SET ERROR FOR BAD PARAMETER SPECIFIED5 BR EQPFIN ;FINISH REQUEST (REMAP DRIVER ON THE WAY);@; EQPSPC - RETURN ERROR BECAUSE OF INVALID BUFFER SPECIFICATION.;FEQPSPC:H? MOV #IE.SPC&377,R0 ;SET ERROR FOR ILLEGAL BUFFER SPECIFICATION 8; BR EQPFIN ;RETURN THE ERROR (REMAP DRIVER ON THE WAY)EQPFIN:: .IF DF T$$EIO* MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPING .ENDC ;T$$EIOIOFIN::S# CLR R1 ;CLEAR SECOND WORD OF IOSB $ CALLR $IOFIN ;FINISH IO AND RETURN.PAGE#, .SBTTL . CKBFLN - FINAL BUFFER LENGTH CHECK;I=; CKBFLN - CHECK THAT BUFFER LENGTH IS WITHIN (1,8K-64) BYTES; CKBFLN:R3 MOV I.PRM+4(R3),R1 ;GET LENGTH OF TRANSFER REQUESTF4 BEQ EQPSPC ;IF EQ, RETURN ZERO BUFFER LENGTH ERROR6 CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?5 BHI EQPBAD ;IF HI, BUFFER IS TOO BIG...RETURN ERRORO< .SBTTL QUEUE - PLACE I/O REQUEST PACKET INTO TERMINAL QUEUE;?; R4 NOW CONTAINS FLAGS TO BE USED BY THE ACCEPTANCE ROUTINE FOI>; GETTING PACKETS FROM THE QUEUE VIA $GSPKT. SAVE THE FLAGS IN; I.LN2+1 OF THE I/O PACKET.;TQUEUE::R; ADD #U.TSTA,R5 ;POINT UCB POINTER TO THE FIRST STATUS WORDM;)D; CALCULATE LUN NUMBER FROM POINTER TO SECOND LUN WORD IN I/O PACKET;F. MOV I.LN2(R3),R0 ;GET POINTER TO 2ND LUN WORD, SUB #,R0 ;GET OFFSET INTO LUT- ASR R0 ;DIVIDE BY 4 (4 BYTES PER LUN ENTRY)U ASR R0 ;! INC R0 ;LUN NUMBERS START AT 1E5 MOVB R0,I.LN2(R3) ;RETURN TO LUN FIELD IN I/O PACKETT+ MOVB R4,I.LN2+1(R3) ;SAVE BUFFER FLAG BYTEQ0 MOV U.SCB-U.TSTA(R5),R0 ;GET I/O QUEUE LISTHEAD MOV R3,R1 ;GET PACKET POINTER# CALL $QINSP ;INSERT PACKET .IF DF M$$PRO# MOV #FR.GRQ,R3 ;COME BACK AT FPGRQO# CALL SWCPU ;SWITCH TO CORRECT CPUA;T9; IF WE FALL THRU HERE, WE ARE ALREADY ON THE CORRECT CPU#;P .ENDC ;M$$PRO RETURN .PAGER. .SBTTL . QPATT/QPDET - ATTACH/DETACH REQUESTS; ;+-; **-QPATT - ATTACH TERMINAL REQUEST (IO.ATT)L-; **-QPDET - DETACH TERMINAL REQUEST (IO.DET)V;4K; ENTRY POINT "QPATT" PERFORMS UNSOLICITED INPUT AST ADDRESS ADJUSTMENT FORUM; SUPERVISOR MODE LIBRARIES (IF SUPPORTED) AND THEN FALLS THROUGH TO "QPDET"..L; FROM QPDET, CONTROL IS TRANSFERRED TO THE PACKET QUEUEING ROUTINE WITH THEB; DEQUEUE BLOCKING FLAGS SET TO CHECK FOR ACTIVE INPUT AND OUTPUT.; ; INPUTS:,; R3 => I/O PACKET FOR ATTACH/DETACH REQUEST; R5 => UCB FOR THE TERMINAL;U ; OUTPUTS:; R3 => I/O PACKET TO BE QUEUEDE; R4 = BUFFER INDICATOR BYTEC;E"; REGISTERS MODIFIED: R0, R1, R2;-; QPATT::E .IF DF S$$LIBI: BITB #TF.AST,I.FCN(R3) ;ATTACH FOR UNSOLICITED INPUT AST? BEQ QPDET ;IF EQ NO 0 MOV I.PRM(R3),R2 ;GET ALL CHARACTER AST ADDRESS) CALL $CALTA ;ADJUST FOR SUPER/USER MODEN" MOV R2,I.PRM(R3) ;AND PUT IT BACK. MOV I.PRM+4(R3),R2 ;GET CONTROL C AST ADDRESS) CALL $CALTA ;ADJUST FOR SUPER/USER MODEE$ MOV R2,I.PRM+4(R3) ;AND PUT IT BACK .ENDC ;S$$LIBQPDET::= CLR R4 ;INDICATE NO BUFFERS4% JMP QUEUE ;QUEUE UP THE REQUEST NOWS.PAGEF$ .SBTTL . QPSPC - "SPECIAL" REQUESTS;F;+=; **-QPSPC - HANDLE "SPECIAL" REQUESTS (IO.GTS/SF.GMC/SF.SMC)U;SG; THIS ROUTINE CHECKS PARAMETERS FOR THE "GET TERMINAL SUPPORT" AND THEEJ; "GET/SET MULTIPLE CHARACTERISTICS" FUNCTIONS. THE USER BUFFER FOR THESEI; REQUESTS MUST BE WORD-ALIGNED. THE IO.GTS AND SF.GMC FUNCTIONS WILL BESL; PASSED TO "QUEUE" WITH NO DEQUEUE BLOCKING FLAGS SET. THIS ALLOWS THEM TOJ; BE PROCESSED SYNCHRONOUSLY (NEVER QUEUED). AN SF.SMC FUNCTION MUST WAITG; FOR ACTIVE INPUT AND OUTPUT REQUESTS TO FINISH BEFORE BEING DEQUEUED.S;- ; INPUTS:"; R3 => I/O PACKET FOR THE REQUEST; R5 => UCB FOR THE TERMINAL;A ; OUTPUTS:E; R3 => I/O PACKET TO BE QUEUED; R4 = BUFFER INDICATOR BYTET;""; REGISTERS MODIFIED: R0, R1, R2;-;EQPSPC:: MOV #1,R4 ;INDICATE ONE BUFFER) MOV I.PRM(R3),R0 ;GET ADDRESS OF BUFFER $ MOV I.PRM+2(R3),R1 ; AND ITS LENGTH0 MOV R1,I.PRM+4(R3) ;PUSH LENGTH DOWN ONE FIELD$ MOV #CKBFB,R2 ;ASSUME A WRITE CHECKE CMP I.FCN(R3),#IO.GTS00•b||Ž{´cÚµcÛ¶c�·c›’ ;IO.GTS? ;GET TERMINAL DRIVER SUPPORT REQUEST?U. BEQ 10$ ;IF EQ, YES...CHECK BUFFER ALIGNMENT= CMP I.FCN(R3),#SF.GMC ;GET MULTIPLE CHARACTERISTICS REQUEST?=. BEQ 10$ ;IF EQ, YES...CHECK BUFFER ALIGNMENT= CMP I.FCN(R3),#SF.SMC ;SET MULTIPLE CHARACTERISTICS REQUEST?P7 BNE EQPIFC ;IF NE, NO...RETURN ILLEGAL FUNCTION ERRORR) MOV I.TCB(R3),R2 ;GET ISSUING TASK'S TCBR, CMP T.UCB(R2),R5 ;IS THIS TERMINAL HIS TI:?' BEQ 5$ ;IF EQ, YES...REQUEST IS LEGALS/ BIT #T3.PRV,T.ST3(R2) ;IS THE TASK PRIVILEGED?G BNE 5$ ;IF NE YES, OKS5 JMP J2EQPR ;IF EQ, NO...CAN'T ALLOW USER TO DO THISA)5$: MOV #CKBFRW,R2 ;SET UP FOR READ CHECKT10$:1 CALL (R2) ;ADDRESS CHECK BUFFER AND RELOCATE ITH BCC 20$ ;IF CC, NO ERROR6 JMP IOFIN ;IF ERROR, FINISH UP WITH ERROR CODE IN R0-20$: MOV R1,I.PRM(R3) ;PUT BIAS IN I/O PACKETT' MOV R2,I.PRM+2(R3) ; AND DISPLACEMENTI" MOV R2,-(SP) ;GET BUFFER ADDRESS0 BIS I.PRM+4(R3),(SP) ;"OR" IN THE BUFFER LENGTH5 ROR (SP)+ ;IS EITHER THE ADDRESS OR THE LENGTH ODD?R/ BCC 30$ ;IF CC, BUFFER IS WORD-ALIGNED...SKIP 6 JMP EQPSPC ;RETURN ERROR FOR BUFFER NOT WORD-ALIGNED30$: JMP QUEUE ;QUEUE REQUEST;LM; EQPIFC - RETURN AN ERROR DUE TO ILLEGAL FUNCTION CODE OR INVALID MODIFIERS.P;FEQPIFC::D MOV #IE.IFC&377,R0 ;SET ERROR FOR ILLEGAL FUNCTION CODE OR MODIFIER; JMP EQPFIN ;FINISH OFF THE REQUEST (RESTORE MAPPING ALSO)V.PAGE .SBTTL . QPHNG - HANGUP REQUEST;);+$; **-QPHNG - HANGUP REQUEST (IO.HNG); O; THIS ROUTINE CHECKS AN IO.HNG REQUEST. A NON-PRIVILEGED TASK CAN HANG ;SA460NR; UP ONLY ITS "TI:" LINE. PRIVILEGED TASKS CAN HANG UP ANY LINE. A HANGUP ;SA460S; REQUEST, LIKE AN IO.WBT OR GET CHARACTERISTICS, BREAKS THROUGH THE QUEUE. ;SA460I; ;**-3 ; INPUTS:"; R3 => I/O PACKET FOR THE REQUEST; R5 => UCB FOR THE TERMINAL;I ; OUTPUTS:P; R3 => I/O PACKET TO BE QUEUEDT; R4 = BUFFER INDICATOR BYTE.;T; REGISTERS MODIFIED: R0;-;QPHNG::G- CALL PREQUE ;SET UP FOR QUEUEING ;TMS051C, CLR R4 ;IO.HNG WAITS FOR NOTHING ;TMS051) JMP QUEUE ;QUEUE THE REQUEST ;TMS051E ;TMS051  .IF DF T$$LTH ;TMS051  ;TMS051LD .SBTTL . QPORG - INITIATE A CONNECTION TO A TERMINAL SERVER ;TMS051; ;TMS051;+ ;TMS051 4; **-QPORG - ORIGINATE REQUEST (IO.ORG) ;TMS051; ;TMS0516; THIS ROUTINE CHECKS AN IO.ORG REQUEST. ;TMS051; ;TMS051; INPUTS: ;TMS051.; R3 => I/O PACKET FOR THE REQUEST ;TMS051); R5 => UCB FOR THE TERMINAL ;TMS051T; ;TMS051; OUTPUTS: ;TMS051 ,; R3 => I/O PACKET TO BE QUEUED ;TMS051; R4 = BUFFER INDICATOR BYTE5; ;TMS051(; REGISTERS MODIFIED: R0 ;TMS051;- ;TMS051 ; ;TMS051QPORG:: ;TMS051- CALL PREQUE ;SET UP FOR QUEUEING ;TMS051 ) JMP QUEUE ;QUEUE THE REQUEST ;TMS051  ;TMS0510 .ENDC ;T$$LTH ;TMS051T ;TMS051PREQUE: ;TMS0512 MOV I.TCB(R3),R0 ;GET ISSUING TASK'S TCB ;**-1, CMP T.UCB(R0),R5 ;IS THIS TERMINAL HIS TI:?* BEQ J2QUE ;IF EQ, YES...ALLOW THE HANGUP/ BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVILEGED?5: BEQ J2EQPR ;IF EQ, NO...RETURN PRIVILEGE VIOLATION ERRORJ2QUE: .IF DF M$$PRO" MOV U.SCB(R5),R4 ;GET SCB ADDRESS/ BIT S.URM(R4),@$CPURM ;ALREADY ON CORRECT CPU?T1 BEQ 5$ ;IF EQ NO, FORK TO CORRECT CPU ; BM380 ; BM380 .IFTF ; DF M$$PRO ; BM380 ; BM380R RETURN ; BM380M ; BM380T .IFT ; DF M$$PRO ; BM380P ; BM380HF; CONVERT PARAMETER LIST PART OF I/O PACKET INTO A FORK BLOCK ; BM380G; (AND THE RETURN ADDRESS) FOR INTERPROCESSOR FORK. SINCE THIS ; BM380UI; IS A SUBROUTINE, WE MUST REMEMBER CALLER ADDRESS IN FORK BLOCK ; BM380G5; OR THE INTERPROCESSOR FORK DOES NOTHING. ; BM380E; ; BM380D5$: ADD #I.PRM+14,R3 ;POINT PAST KISAR5 FIELD IN FORK BLOCK ; BM3802 MOV (SP)+,(R3) ;REMEMBER RETURN ADDRESS ; BM380B MOV KINAR5,-(R3) ;INSERT DRIVER I MAPPING IN KISAR5 FIELD ; BM380, CLR00•j|–k|töt÷tø tþfDATA -(R3) ;CLEAR R4 IN FORK BLOCK ;**-77 MOV S.URM(R4),-10(R3) ;SET URM OF DEVICE IN FORK BLOCKD. MOV R3,R4 ;POINT R4 AT FORK BLOCK FOR $FORK1$ CALL $FORK1 ;SWITCH TO CORRECT CPU7 SUB #I.PRM+4,R3 ;POINT BACK TO BEGINNING OF FORK BLOCK CALL MAPD ;RE-MAP DRIVER9 JMP @I.PRM+14(R3) ;DISPATCH TO ORIGINAL CALLER ; BM380P ;**-1A .ENDC ; DF M$$PROJ2EQPR: ;**-2. JMP EQPPRI ;RETURN PRIVILEGE VIOLATION ERROR .END,-(R3) ;INSERT DRIVER I MAPPING IN KISAR5 FIELD ; BM380, CLR .TITLE TTODNC .IDENT /06.01/#;+8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;+>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;P ;T ; 30-JAN-78 PETER WANNHEDENR ;J ; PREVIOUSLY MODIFIED BY:V;I; P. WANNHEDEN; D. R. DONCHIN* ; T. LEKAS ; S. ADAMS; ;F; MODIFIED BY:;; L. KOGAN 06-JUN-85 05.06,; LK608 -- FIX ^R PROCESSING AFTER IO.WBT;; L. KOGAN 02-NOV-85 06.017; LK705 -- MAKE 11M AND 11M+ TTDRV MODULES IDENTICALL;H)* .PSECT MAP5.6+;S,;+#-; ODONE - OUTPUT DONE PROCESSING.M.; /; INPUT:0; R5 POINTER TO U.TSTA1; 2; OUTPUT:S(3; THE DATABASE IS UPDATED AS REQUIRED..4; ANOTHER OUTPUT OPERATION MAY BE INITIATED.5;6; REGISTERS ALTERED: R2,R3,R4O7;-8; 9;K : .ENABL LSBS;; <.SBTTL ODONE - OUTPUT DONE=; G>ODONE:: BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT INTERRUPT UNEXPECTED?-? ;;;(COULD HAPPEN FOR EXAMPLE IF WE COME #@ ;;;HERE WHEN ABORTING OUTPUT)IA BNE 40$ ;;;Y - JUMP B ASSUME US.OIU,10C INCB U.STS-U.TSTA(R5) ;;;NOW IT IS UNEXPECTEDD10$: ;;;REFERENCE LABELEF .IF DF T$$SPLG7H MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;;;MAP UCBX AND TABUFO0I MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBXJK .IFF ;T$$SPL-L&M MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX3N BEQ 40$ ;;;NONE - JUMP (THIS CAN ONLY HAPPEN IFS*O ;;;WE COME HERE TO DO A SPECIAL ECHOP ;;;SUCH AS BELL)QR .IFTF ;T$$SPLS(T CLRB U.TOTI(R4) ;;;CLEAR OUTPUT TIMER&U TST U.TCO(R4) ;;;DOING TASK OUTPUT?V BNE 20$ ;;;Y - JUMPR,W BIT #S2.BEL,2(R5) ;;;BELL ECHO REQUESTED?X BNE BELL1 ;;;Y - JUMP$0Y ASSUME S1.OBY,100 ;S1.OBY MUST BE IN LOW BYTE&Z BICB #S1.OBY,@R5 ;;;SET OUTPUT FREE[ ASSUME S1.IBY,200"\ BPL CFGRQ ;;;INPUT FREE - JUMPE\ TSTB U.TISV(R4) ;;; CHECK IF IN THE MIDDLE OF ^R PROCESSING ;LK705N;\ BNE LK1 ;;; YES GOTO FINISH ECHOING INPUT BUFFER ;LK7059\ BIT #S1.DSI,@R5 ;;;INPUT PROCESSING DISABLED? ;LK705."\ BNE 40$ ;;;Y - JUMP ;LK705?\LK1: CALL ECHD1 ;;;INPUT BUSY - ENTER INPUT ROUTINES ;LK705B&` ;;;FALL THRU TO "NXTIC" ;**-3a.PAGEB@b.SBTTL NXTIC - GET NEXT INPUT CHARACTER FROM TYPE-AHEAD BUFFERc;d;+<e; NXTIC - GET NEXT INPUT CHARACTER FROM TYPE-AHEAD BUFFER.f; g; INPUT:h; R5 POINTER TO U.TSTAi;; j; OUTPUT:T>k; IF A CHARACTER CAN BE OBTAINED FROM THE TYPE-AHEAD BUFFER,:l; AND THE CHARACTER CAN BE PROCESSED, IT IS REMOVED FROM9m; THE TYPE-AHEAD BUFFER AND ICHAR2 IS CALLED TO PROCESS n; THE CHARACTER.o;DAp; IF THERE IS CURRENTLY AN IO.RSD OUTSTANDING GET THE CHARACTERU*q; FROM THE APPROPRIATE TYPEAHEAD BUFFER.r;Gs; ELSE A RETURN IS EXECUTED.t;-u;Fv; wNXTIC::xy .IF DF B$$MAPz4{ ASSUME B$$MAP,1 ;;;THERE CAN ONLY BE ONE TERMINAL'| ;;;THAT SUPPORTS IO.RSD CURRENTLYT}0~ CALL RSDPRC ;;;CAN WE PROCESS A SPECIAL DATA ;;;CHARACTER IF ANY? € BCC 12$ ;;;Y - GO PROCESS IT�‚ .ENDC ;B$$MAPƒ,„ CALL GCTAB ;;;GET A CHARACTER FROM TABUF6… BCS 15$ ;;;IF CS, NONE THERE...CHECK INPUT TIMEOUT$† CALL IPROC ;;;CAN WE PROCESS IT?‡ BCS 40$ ;;;N - RETURNA1ˆ CALL RCTAB ;;;Y - REMOVE CHARACTER FROM TABUF(‰11$: CALL ICHAR2 ;;;PROCESS CHARACTERŠ BR NXTIC ;;;LOOP‹Œ .IF DF B$$MAP�Ž; ?�; R4 CONTAINS THE I/O PACKET ADDRESS OF AN IO.RSD FROM RSDPRCL�;P‘/’12$: MOV I.PRM+10(R4),R2 ;;;GET THE DATA TYPET"“00–r||Ž{´cÚµcÛ¶c�·c›’ ASL R2 ;;;MAKE IT A WORD INDEX:” MOV T.RSDT(R2),R2 ;;;GET THE ADDRESS OF THE APPROPRIATE• ;;;TYPEAHEAD BUFFERS–—;I@˜; GET THE CHARACTER, IF ANY, FROM THE SPECIAL TYPEAHEAD BUFFER™;Sš'› INC R2 ;;;POINT TO RETRIEVE POINTERAœ TSTB 1(R2) ;;;BUFFER EMPTY?A;� BEQ 40$ ;;;Y - NO MORE CHARACTERS, TRY NORMAL TYPEAHEAD;(ž MOVB (R2),R3 ;;;GET RETRIEVE POINTER-Ÿ INCB (R2) ;;;UPDATE THE RETRIEVAL POINTERS"  CMPB (R2),2(R2) ;;;WRAP-AROUND?¡ BNE 13$ ;;;N - JUMPH5¢ CLRB (R2) ;;;Y - RESET POINTER TO START OF BUFFERV,£13$: DECB 1(R2) ;;;DECREMENT ACTIVE COUNT"¤ ADD #3,R2 ;;;POINT TO THE DATA4¥ ADD R2,R3 ;;;POINT TO NEXT CHARACTER TO RETRIEVE¦ CLR R2 ;;;PREPARE FOR BISB5§ BISB (R3),R2 ;;;PUT THE CHARACTER IN THE LOW BYTE &¨ BR 11$ ;;;GO PROCESS THE CHARACTER©ª .ENDC ;B$$MAP«¬;YM­; THERE IS NOTHING IN THE TYPEAHEAD BUFFER. SEE IF WE NEED TO TIME-OUT THE ®; INPUT REQUEST.¯;P°15$:?± BIT #S5.ITI,U.TST5-U.TSTA(R5) ;;;IMMEDIATE TIMEOUT ON INPUT?Y#² BEQ 40$ ;;;IF EQ, NO...ALL DONE³´ .IF DF T$$SPLµ%¶ MOV #120000,R4 ;;;SET UCBX POINTERI·¸ .IFF ;T$$SPLD¹.º MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX POINTER!» BEQ 40$ ;;;IF EQ, NONE...EXIT ¼½ .ENDC ;T$$SPL¾¿ ASSUME U.TCI,0 8À TST (R4) ;;;IS THERE A CURRENT INPUT REQUEST PACKET?"Á BEQ 40$ ;;;IF EQ, NO...GIVE UP+ TST @(R4) ;;;IS THERE ALREADY A STATUS?Tà BNE 40$ ;;;BR IF YES0Ä MOV #IS.TMO,@(R4)+ ;;;SET A COMPLETION STATUS8Å CALLR IDONE ;;;COMPLETE INPUT REQUEST WITH A TIMEOUTÆ.PAGELFÇ.SBTTL CFGRQ - CONDITIONALLY FORK TO GET A REQUEST PACKET FROM QUEUEÈ;É;+BÊ; CFGRQ - CONDITIONALLY FORK TO GET A REQUEST PACKET FROM QUEUE.Ë;$ Ì; INPUT:Í; R5 POINTER TO U.TSTAÎ;S Ï; OUTPUT:S@Ð; IF THERE IS A PACKET IN THE QUEUE THAT MAY BE PROCESSED NOW,5Ñ; A FORK REQUEST IS QUEUED TO GET A REQUEST PACKET. Ò;-Ó; Ô;D'ÕCFGRQ:: CALL TSTRQ ;;;TEST I/O QUEUE1Ö ;;;RETURN IF NOTHING WORTH FORKING IN QUEUEC,× MOV #FR.GRQ,R3 ;;;FORK/GET REQUEST PACKETØ BR 30$ ;;;Ù;SFÚ20$: MOV #FR.ORD,R3 ;;;FORK/OUTPUT REQUEST DONE (AT LEAST PARTIALLY)(Û30$: CALLR FORK ;;;QUEUE FORK REQUESTÜ; Ý;SÞ.SBTTL BELL - OUTPUT A BELL ß;:à;+á; BELL - OUTPUT A BELL.â;U ã; INPUT:ä; R5 POINTER TO U.TSTAå;U æ; OUTPUT: 8ç; IF ECHO IS SUPPRESSED, IMMEDIATE RETURN (NO ACTION).5è; ELSE A BELL IS OUTPUT IF POSSIBLE, OR FLAGGED FOR; é; OUTPUT AT FIRST OPPORTUNITY.ê;Të; REGISTERS ALTERED: R2,R3,R4Mì;-í;Rî;F*ïBELLL:: CALL LOCKI ;LOCK OUT INTERRUPTS,ðBELL:: BIT #S1.RNE,@R5 ;;;ECHO SUPPRESSED?ñ BNE 40$ ;;;Y - RETURNò;:ó;R8ô; IF TRANSMITTER IS FREE, THE SPECIAL ECHO IS STARTED.5õ; IF TRANSMITTER IS BUSY, THE FLAG IS SET IN U.TSTA3ö; TO FORCE THE SPECIAL ECHO AT FIRST OPPORTUNITY. ÷;Tø;ù BIS #S2.BEL,2(R5) ;;;SET CRAú BIT #S1.DSI!S1.OBY,@R5 ;;;OUTPUT BUSY OR FORK PROCESSING BUSY?L"û BEQ 10$ ;;;NEITHER - DO IT NOWü;TOý; A SPECIAL ECHO MAY BE DELAYED BECAUSE FORK PROCESSING IS BUSY (S1.DSI SET).Iþ;Cÿ40$: RETURN ;;;Y - WAITT;R  .DSABL LSBS;S;-BELL1: BIC #S2.BEL,2(R5) ;;;CLEAR BELL FLAGT( MOV #ASBELL,R3 ;;;POINT TO BELL CHAR.1 BR ECHCHR ;;;GO AND OUTPUT A SINGLE CHARACTER ;T; .PAGER6 .SBTTL ECHSTR, ECHCHR - ECHO A STRING OR A CHARACTER ;S ;+ ; ECHSTR - ECHO A STRING.1;S ; INPUT:; R2 STRING LENGTH; R3 POINTER TO THE STRING; R4 POINTER TO UCBX; R5 POINTER TO U.TSTA; ; ALTERNATE ENTRY - ECHCHR<; SAME AS ECHSTR, BUT PRESETS R2 TO 1 TO ECHO 1 CHARACTER.; ALTERNATE ENTRY - ECHRLA; SAME AS ECHCHR, BUT LOCKS OUT INTERRUPTS BEFORE THE OPERATIONR(; AND ALLOWS INTERRUPTS BEFORE RETURN.;N; REGISTERS ALTERED: R2,R3,R4T;-;P;*ECHRL:: CALL LOCKI ;LOCK OUT INTERRUPTS) ECHCHR::MOV #1,R2 ;;;STRING LENGTH = 1 !" .IF DF T$$ACD#.$ BR ECHSTR ;;;SET UP UCBX FOR BUFFERED ECHO?%MECHO:: BIC #S2.OBF,2(R5) ;;;INDICATE NON-BUFFERED MULTI-ECHO 0& CLR U.TFOB(R4) ;;;SET E00–z|—~|töt÷tø tþfDATAMPTY MULTI-ECHO BUFFER&' ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2+( BR ECHSET ;;;SET UP UCBX FOR MULTI-ECHOR=)ECHSTR::BIS #S2.OBF,2(R5) ;;;SET UP UCBX FOR NON-MULTI-ECHOS"* ADD #U.TOP,R4 ;;;POINT TO U.TOP+, .IFFL-).ECHSTR::ADD #U.TOP,R4 ;;;POINT TO U.TOPA/0 .IFTF1#2 CLR (R4)+ ;;;U.TOP <-- 0 (ECHO);43ECHSET: MOV R3,(R4)+ ;;;U.TOP+2 <-- BUFFER ADDRESS4 ASSUME U.TOC,U.TOP+4B&5 MOV R2,@R4 ;;;U.TOC <-- BYTE COUNT#6 BR STARTX ;;;START TRANSMISSION 7;C8;T9;+,:; STARTX - START TRANSMISSION OF A BUFFER.;;4 <; INPUT:=; R5 POINTER TO U.TSTA>; U.TOP+2 BUFFER ADDRESS?; U.TOC BYTE COUNT@;57A; CALLS CONTROLLER-DEPENDENT ROUTINE TO START OUTPUT.;-B; NOTE - MUST BE CALLED ON DEVICE PRIORITY! C;PED; ALTERNATE ENTRY: STAXL - START TRANSMISSION OF A LIST OF BUFFERS.(E;; F; INPUT:G; R4 POINTER TO UCBXH; R5 POINTER TO UCBA)I; U.TFOB POINTER TO FIRST OUTPUT BUFFERO:J; EACH BUFFER CONTAINS A LINK TO THE NEXT BUFFER IN THE3K; FIRST WORD, AND BYTE COUNT IN THE SECOND WORD.FL;M; REGISTERS ALTERED: R2,R3,R4TN;-O;P;O/QSTAXL:: MOV U.TFOB(R4),R2 ;;;GET FIRST BUFFER"R ADD #U.TOP,R4 ;;;POINT TO U.TOP'S CALL UPUB ;;;SET UP UCBX FOR OUTPUTLTU .IFT V0W BIS #S2.OBF,2(R5) ;;;INDICATE BUFFERED OUTPUTXY .ENDCZ,[STARTX::BIS #S1.OBY,@R5 ;;;SET OUTPUT BUSY\ ASSUME US.OIU,19] DECB U.STS-U.TSTA(R5) ;;;SET OUTPUT INTERRUPT EXPECTEDO^_ .IFT ;T$$SPLN`0a MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBXbc .IFF ;T$$SPLTd&e MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBXfg .ENDC ;T$$SPLh4i MOVB OPTIMR,U.TOTI(R4) ;;;INITIALIZE OUTPUT TIMERj ASSUME CT.STA,0*k CLR R2 ;;;SET INDEX FOR "START OUTPUT"3l CALLR CTRD ;;;CALL CONTROLLER DEPENDENT ROUTINE)m;Nn;Eo .END OUTPUTXY .ENDCZ,[STARTX::BIS #S1.OBY,@R5 ;;;SET OUTPUT BUSY\ ASSUME US.OIU,19] DECB U.STS-U.TSTA(R5) ;;;SET OUTPUT INTERRUPT EXPECTEDO^_ .IFT ;T$$SPLN`0a MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBXb .TITLE CODRV .IDENT /02/; ; COPYRIGHT (c) 1981 BY); DIGITAL EQUIPMENT CORPORATION, MAYNARD(; MASSACHUSETTS. ALL RIGHTS RESERVED.; 6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED AND COPIED ONLY IN ACCORDANCE WITH THE6; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE6; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER6; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE6; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.; 6; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO6; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED6; AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.; 6; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR6; RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS; NOT SUPPLIED BY DIGITAL.; T;E; STEVE RUZICH 03-SEP-80;R; CONSOLE DRIVER;O;E ; MACRO CALLS;A* .MCALL ABODF$,HWDDF$,PKTDF$,TCBDF$,UCBDF$# ABODF$ ; DEFINE TASK ABORT CODESH% HWDDF$ ; DEFINE HARDWARE REGISTERSA% PKTDF$ ; DEFINE I/O PACKET OFFSETSO- TCBDF$ ; DEFINE TASK CONTROL BLOCK OFFSETSC UCBDF$ ; DEFINE UCB OFFSETS;I; DRIVER DISPATCH TABLE;I DDT$ CO,1,NONER S;+#; **-COINI-CONSOLE DRIVER INITIATOR ; C; EXAMINE FUNCTION CODE. IO.WLB PACKETS ARE QUEUED TO COT'S PACKETT?; QUEUE. THE TERMINAL DRIVER IS REQUESTED TO PROCESS ALL ELSE.A; ; INPUTS: R5 = UCB ADDRESSH; R4 = SCB ADDRESSC; R1 = I/O PACKET ADDRESS; ;-CCOINI: CMPB I.FCN+1(R1),#IO.WLB/400 ; WRITE LOGICAL BLOCK FUNCTION?P BNE 10$ ; NO - QUEUE TO TTDRV6 TST U.CTCB(R5) ; YES- COT WILL PUT ITS TCB ADDR HERE* ; IF IT IS ACTIVE, ZERO ON EXIT.1 BEQ 10$ ; ZERO? - SOMEONE MUST HAVE REDIRECTEDE, ; CO: TO ITSELF - QUEUE PACKET TO TTDRV" MOV R5,R0 ; NON-ZERO - CONTINUE4 ADD #U.COTQ,R0 ; ADDRESS OF COT'S I/O PACKET QUEUE, CALL $QINSP ; INSERT IN QUEUE BY PRIORITY3 MOV U.CTCB(R5),R0 ; COT'S TCB ADDRESS FOR REQUESTT CAL00—‚|˜‡|Ž{´cÚµcÛ¶c�·c›’LR $EXRQN ; START COTC?10$: MOV #IE.OFL&377,R0 ; IF ERROR, RETURN DEVICE OFFLINE CODE1: MOV U.RED2(R5),R2 ; IS THERE A DEFAULT CONSOLE TERMINAL?2 BEQ 20$ ; NO - FINISH I/O, RETURNING ERROR CODE' MOV R2,R5 ; YES- SET UP TERMINAL UCBO9 MOV R2,I.UCB(R1) ; I/O PACKET NEEDS THE RIGHT UCB, TOO.E0 CALLR $DRQRQ ; QUEUE REQUEST TO THIS TERMINAL,20$: MOV R1,R3 ; PACKET ADDRESS FOR $IOFIN CLR R1 ; NO BYTES TRANSFERED. CALLR $IOFIN ; FINISH I/O ,;+!; **-COCAN-CANCEL I/O ENTRY POINTC;R0; OUTSTANDING I/O PACKETS MAY BE SEVERAL PLACES:F; 1) IN COT'S UCB I/O PACKET QUEUE: DEQUEUE AND FINISH THESE PACKETS.I; 2) CURRENTLY BEING PROCESSED BY COT: ASSUME A QUICK FINISH AND IGNORE. 6; 3) BEING PROCESSED BY TTDRV: CALL $IOKIL FOR TTDRV. ;CI; THE LAST STEP HAS THE SIDE EFFECT OF KILLING ALL TERMINAL I/O FROM THE U2; TASK, NOT JUST I/O WHICH CODRV FIELDED TO TTDRV.; ; INPUTS: R5 = UCB ADDRESSS; R4 = SCB ADDRESS$; R1 = TCB ADDRESS;;-COCAN:0 MOV #IE.ABO&377,R0 ; SET FINAL STATUS TO ABORT3 MOV R5,R2 ; GET ADDRESS OF PACKET QUEUE LISTHEADK ADD #U.COTQ,R2 ;;FB; THE FOLLOWING CODE WAS MODIFIED FROM $IOKIL PROCESSING IN IOSUB.G; IT APPEARS THAT THE TCB ADDRESS WILL BE RETURNED AS WORD 2 OF IOSTAT.F;T10$: MOV R2,R3 ; COPY IT020$: MOV R3,R4 ; SAVE ADDRESS OF CURRENT ENTRY* MOV (R4),R3 ; GET ADDRESS OF NEXT ENTRY BEQ 40$ ; IF EQ END OF LIST/ CMP R1,I.TCB(R3) ; REQUEST FOR CURRENT TASK?  BNE 20$ ; IF NE NO MOV (R3),(R4) ; CLOSE UP LIST; BNE 30$ ; IF NE NO NEW LAST( MOV R4,2(R2) ; SET ADDRESS OF NEW LAST'30$: CALL $IOFIN ; FINISH I/O REQUESTL BR 10$ ; GO AGAIN>40$: MOV U.RED2(R5),R5 ; IS THERE A DEFAULT CONSOLE TERMINAL? BEQ EXIT ; NO - CONTINUED3 JMP $IOKIL ; YES- KILL ANY I/O WHICH CODRV MIGHTM ; HAVE GIVEN TO TTDRV.;+ ; **-COOUT - TIMEOUT ENTRY POINT;T?; COT SETS S.CTM, THE CURRENT TIMEOUT COUNT, WHEN IT CONTAINS AUA; PARTIALLY FILLED LOGFILE BUFFER. WHEN THE COUNT EXPIRES, CODRVLC; INFORMS COT THAT IT IS TIME TO FLUSH THIS BUFFER TO THE LOGFILE. D;S; INPUTS: R5 = UCB ADDRESS ; R4 = SCB ADDRESSL;B;-.COOUT: MOV U.CTCB(R5),R0 ; COT TCB, IF ACTIVE( BEQ EXIT ; EQ = INACTIVE - DO NOTHING2 CALLR $EXRQN ; REQUEST COT WITH NO QUE ENTRY - ) ; THIS IS A CUE TO FLUSH THE BUFFER.TEXIT: ; COMMON EXITT,COPWF: RETURN ; ENTRY POINT FOR POWERFAIL .ENDNTIMEOUT COUNT, WHEN IT CONTAINS AUA; PARTIALLY FILLED LOGFILE BUFFER. WHEN THE COUNT EXPIRES, CODRVLC; INFORMS .TITLE CRDRV .IDENT /09.00/C;46; COPYRIGHT (C) 1983 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;R<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;R; D. N. CUTLER 3-MAR-74C;R; MODIFIED FOR M-PLUS V2.0 BY:;R ; A. GROUPEB ; P. J. CARR;B; MODIFIED BY:;R; P. J. CARR 10-FEB-82 08.01; $; PJC044 -- CORRECT DETACH FUNCTION;I; P. J. CARR 8-APR-82 08.02;B3; PJC050 -- CHECK FOR CARD DONE CONDITION IN CRINTD; ; P. J. CARR 2-JUN-82 08.03 ;34; PJC057 -- CORRECT PROCESSING OF PICK CHECK ERRORS;.; P. J. CARR 16-AUG-82 08.04;D6; PJC062 -- CORRECT FOR LAST CARD BEFORE HOPPER ERROR; BEING READ AS BLANKS; E; D. MAILLOUX 28-MAR-82 08.057;/; DMM053 -- CORRECT USE OF ALLOCATED AST BLOCKP;;.$; CR11 CARD READER CONTROLLER DRIVER; ; MACRO LIBRARY CALLS ; # .MCALL ABODF$,HWDDF$,PKTDF$,UCBDF$" ABODF$ ;DEFINE TASK ABORT CODES% HWDDF$ ;DEFINE HARDWARE REGISTERSN$ PKTDF$ ;DEFINE I/O PACKET OFFSETS UCBDF$ ;DEFINE UCB OFFSETST;E; EQUATED SYMBOLS ;O ASTSIZ= 16. ;SIZE OF AST BLOCK)STKSIZ= 14. ;SIZE OF STACK IN AST BLOCKF;O; CR11 DEVICE REGISTER OFFSETS;N.CRCS= 0 ;CARD READER CONTROL STATUS REGISTER"CRDB= 2 ;CARD READER DATA BUFFER;L%; CARD READER CONTROL STATUS REGISTERL; ERR= 100000 ;COMBINED ERROR CRDONE= 40000 ;CARD DONE#HOPERR= 20000 ;HOPPER CHECK ERRORAMTNERR= 10000 ;MOTION ERRORNTIMERR= 00˜Š|~|töt÷tø tþfDATA 4000 ;TIMING ERROR#TRONL= 2000 ;TRANSITION TO ONLINEFBUSY= 1000 ;BUSY(READY= 400 ;ONLINE, READY TO READ (=0),DONE= 200 ;COLUMN OF DATA IS READY IN CRDBIE= 100 ;INTERRUPT ENABLEREAD= 1 ;READ $TIMERR= 4000 ;TIMING ERROR (U.CW2)#; CARD READER CONTROL BLOCK OFFSETS2;C0STRBF=U.CNT+2 ;STARTING ADDRESS OF DATA BUFFER/CURBF=U.CNT+4 ;CURRENT ADDRESS IN DATA BUFFERR0EOFCL=U.CNT+6 ;NUMBER OF COLUMNS FOR VALID EOF2EOFCT=U.CNT+7 ;NUMBER OF EOF PUNCHES ENCOUNTERED(CCOLC=U.CNT+10 ;CURRENT COLUMN COUNTER-CCOL1=U.CNT+12 ;CONTENTS OF CARD COLUMN ONE;=; SPECIAL CARD PUNCH PATTERNS=;-CREOF=7417 ;END OF FILE (12-11-0-1-6-7-8-9) +CR026=4242 ;TRANSLATE 026 CODE (12-2-4-8)/CR029=5252 ;TRANSLATE 029 CODE (12-0-2-4-6-8)A;O ; LOCAL DATA ; ; 029 TRANSLATION TABLEN;DTB029: .BYTE 40 ;SPACE= .BYTE 61 ;1E .BYTE 62 ;2A .BYTE 63 ;3C .BYTE 64 ;4M .BYTE 65 ;5F .BYTE 66 ;6O .BYTE 67 ;7N .BYTE 70 ;8N .BYTE 40 ;EMPTYC .BYTE 72 ;:; .BYTE 43 ;#C .BYTE 100 ;@ .BYTE 47 ;'N .BYTE 75 ;=M .BYTE 42 ;" .BYTE 71 ;9N .BYTE 60 ;0 .BYTE 57 ;/  .BYTE 123 ;S .BYTE 124 ;T .BYTE 125 ;U .BYTE 126 ;V .BYTE 127 ;W .BYTE 130 ;X .BYTE 131 ;Y .BYTE 40 ;EMPTY .BYTE 134 ;\ .BYTE 54 ;, .BYTE 45 ;%O .BYTE 137 ; .BYTE 76 ;> .BYTE 77 ;?E .BYTE 132 ;Z .BYTE 55 ;-E .BYTE 112 ;J .BYTE 113 ;K .BYTE 114 ;L .BYTE 115 ;M .BYTE 116 ;N .BYTE 117 ;O .BYTE 120 ;P .BYTE 121 ;Q .BYTE 40 ;EMPTYE .BYTE 135 ;] .BYTE 44 ;$E .BYTE 52 ;*E .BYTE 51 ;)E .BYTE 73 ;;E .BYTE 136 ;^ .BYTE 122 ;R .BYTE 46 ;&E .BYTE 101 ;A .BYTE 102 ;B .BYTE 103 ;C .BYTE 104 ;D .BYTE 105 ;E .BYTE 106 ;F .BYTE 107 ;G .BYTE 110 ;H .BYTE 40 ;EMPTYE .BYTE 133 ;[ .BYTE 56 ;.E .BYTE 74 ;E .BYTE 46 ;&E .BYTE 122 ;R .BYTE 53 ;+E .BYTE 101 ;A .BYTE 102 ;B .BYTE 103 ;C .BYTE 104 ;D .BYTE 105 ;E .BYTE 106 ;F .BYTE 107 ;G .BYTE 110 ;H .BYTE 40 ;EMPTYE .BYTE 77 ;?E .BYTE 56 ;.E .BYTE 51 ;)E .BYTE 135 ;] .BYTE 74 ;; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.; ; INPUTS:C;I:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;N ; OUTPUTS:;QE; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT-RE; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER-T; ATION IS I00˜’|‡|Ž{´cÚµcÛ¶c�·c›’NITIATED. ;- .ENABL LSBN%CRINI: GTPKT$ CR,C$$R11,CRPWF,UCBSV,T .;S1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:Q;E'; R1=ADDRESS OF THE I/O REQUEST PACKET. -; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.A; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK. :; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;E(; CARD READER I/O REQUEST PACKET FORMAT:;R"; WD. 00 -- I/O QUEUE THREAD WORD.0; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.5; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTER TASK.G@; WD. 03 -- POINTER TO THE SECOND WORD IN REQUESTER TASK HEADER.J; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTER TASK HEADER (UCB).'; WD. 05 -- I/O FUNCTION CODE (IO.RLB).E0; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.0; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.D; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT +140000).3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.*; WD. 12 -- RELOCATION BIAS OF I/O BUFFER.+; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.E-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.N; WD. 15 -- NOT USED.K; WD. 16 -- NOT USED.O; WD. 17 -- NOT USED. ; WD. 20 -- NOT USED.H;E+ CLR STRBF(R5) ;ASSUME ALLOCATION FAILURE )1 CALL CRATT ;IS IT AN ATTACH OR DETACH FUNCTION?. BCS 160$ ;IF CS YESN/ MOV #80.,R0 ;ASSUME ASCII OR PACKED HOLLERITHS9 MOVB I.FCN(R1),U.CW2(R5) ;SAVE SUBFUNCTION MODIFIER BITS * BPL 10$ ;IF PL ASCII OR PACKED HOLLERITH) ASL R0 ;BINARY READ REQUIRES 160. BYTES .10$: MOV R0,R1 ;SET LENGTH OF BUFFER REQUIRED# CALL $ALOCB ;ALLOCATE DATA BUFFERR% BCS 90$ ;IF CS, NO BUFFER AVAILABLE-/ MOV R0,STRBF(R5) ;SAVE STARTING BUFFER ADDRESS 1 BICB #US.ABO,U.STS(R5) ;CLEAR ABORT REQUEST FLAG ;R; INITIATE CARD READ; 120$: MOV R5,R3 ;CALCULATE ADDRESS OF CARD READERN ADD #STRBF,R3 ;CONTROL BLOCKR4 MOV (R3)+,(R3)+ ;SET CURRENT ADDRESS IN DATA BUFFER0 MOVB #1,(R3) ;ASSUME ASCII OR PACKET HOLLERITH TSTB U.CW2(R5) ;BINARY READ?I BPL 30$ ;IF PL NO0- MOVB #8.,(R3) ;SET EOF COUNT FOR BINARY READ -30$: MOVB (R3)+,(R3)+ ;SET EOF COLUMN COUNTER% CLR (R3) ;CLEAR CARD COLUMN COUNTER. MOV S.CSR(R4),R2 ;GET CARD READER CSR ADDRESS BIT #READY,(R2)+ ;READY?C BNE CROUT ;IF NE NO 3 MOVB S.ITM(R4),S.CTM(R4) ;SET DEVICE TIMEOUT COUNTC1 MOV (R2),R0 ;READ DATA BUFFER CLEAR DONE IF SETO( MOV #,-(R2) ;START CARD MOTION;RK; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUSES.K; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDITIONO3; THAT COULD EXIST IN RESTARTING THE I/O OPERATION. ;N CRPWF: ; ;A"; CALL US BACK AFTER DEQUEUING AST;RCRCUB:: RETURN ;;E); CARD READ ERROR DURING A READ OPERATION ; 5CRERR: MOV #T.NCRE,R0 ;SET FOR HARDWARE ERROR MESSAGEN BR 50$ ;; A; DEVICE TIMEOUT RESULTS IN A NOT READY MESSAGE BEING PUT OUT AT CD; A SYSGEN SPECIFIED INTERVAL. TIMEOUTS ARE CAUSED BY POWERFAILURE (; AND CARD READER FAULT CONDITIONS. ; CROUT: ;;; 1 CLR @S.CSR(R4) ;;;DISABLE CARD READER INTERRUPT E MTPS #0 ;;;ALLOW INTERRUPTS  .IF DF,T$$KMG.40$: MOV #T.NDNR,R0 ;SET FOR NOT READY MESSAGE .IFTF-50$: BITB #US.ABO,U.STS(R5) ;ABORT REQUESTED?O BNE 120$ ;IF NE YES. .IFTS% BIT #TIMERR,U.CW2(R5) ;TIMING ERROR?; BEQ 60$ ;IF EQ NOO4 BIT #READY,@S.CSR(R4) ;OPERATOR PUT READER OFFLINE? BEQ 70$ ;IF EQ NOI. BIC #TIMERR,U.CW2(R5) ;CLEAR TIMING ERROR BIT .IFTF960$: BIT #READY,@S.CSR(R4) ;CARD READER ONLINE AND READY?  BEQ 20$ ;IF EQ YES270$: MOVB #1,S.CTM(R4) ;SET TIMEOUT FOR ONE SECOND .IFTT' DECB S.STS(R4) ;TIME TO PRINT MESSAGE?R BNE CRPWF ;IF NE NOM7 MOVB #C$$RTO,S.STS(R4) ;SET TO OUTPUT NEXT MESSAGE IN Q ;C$$RTO SECONDS N/ BNE 80$ ;IF NE, CR NOT READY MESSAGES ENABLEDG6 INCB S.STS(R4) ;CR NOT READY MESSAGES NOT WANTED, SO BR CRPWF ;REBUSY CONTROLLER "80$: CALLR $DVMSG ;OUTPUT MESSAGE .IFFA BR CRPWFR .ENDC B;#; NO BUFFER SPACE AVAILABLE ;I790$: MOV #IE.NOD&377,R0 ;SET00˜š|~|töt÷tø tþfDATA NO BUFFER AVAILABLE STATUS) BR 160$ ; ;N(; NO EOF YET AND NO MORE CARDS IN HOPPER; 7100$: MOV #!IS.SUC,R0 ;NO CARDS LEFT/NO EOFT TST U.CW3(R5) ;ATTACH FOR AST?  BEQ 160$ ;IF EQ NO) BIS #IE,@S.CSR(R4) ;SET INTERRUPT ENABLES BR 160$ ;G;CC; JUST HAD EOF AND NO MORE CARDS IN HOPPER (FOR USE WITH ATTACH FORY; UNSOLICITED AST FUNCTION)V; C110$: MOV #!,R0 ;NO CARDS LEFT/JUST HAD EOF ) BIS #IE,@S.CSR(R4) ;SET INTERRUPT ENABLE#% INCB EOFCT(R5) ;FAKE NOT END OF FILES BR 160$ ;6; ; ABORT REQUESTEDT;D5120$: MOV #IE.ABO&377,R0 ;SET TRANSFER ABORTED STATUSS BR 160$ ;A;E; UNRECOVERABLE ERRORR;;1130$: MOV #IE.VER&377,R0 ;SET UNRECOVERABLE ERROR. BR 160$ ;I;U; DEVICE NOT READY ERROR;C4140$: MOV #IE.DNR&377,R0 ;SET DEVICE NOT READY ERROR BR 160$ ;Y;N ; END OF FILEU;I0150$: MOV #IE.EOF&377,R0 ;SET END OF FILE STATUS+160$: CLR R1 ;CLEAR SECOND I/O STATUS WORD( JMP 320$ ;;+2; **-$CRINT-CR11 CARD READER CONTROLLER INTERRUPTS;-$CRINT:: ;;;REF LABELE< INTSV$ CR,PR6,C$$R11,,UCBSV ;;;GENERATE INTERRUPT SAVE CODE MOV R3,-(SP) ;;;SAVE R3' MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCBE' MOV S.CSR(R4),R3 ;;;GET ADDRESS OF CSR6* BIT #176000,(R3)+ ;;;EXCEPTION CONDITION? BNE 170$ ;;;IF NE YES0 JMP 350$ ;;;7170$: MOV -(R3),R4 ;;;SAVE CARD READER INTERRUPT STATUS5+ CLR (R3) ;;;DISABLE CARD READER INTERRUPTS MOV (SP)+,R3 ;;;RESTORE R3 ' CALL $FORK ;;;CREATE A SYSTEM PROCESS* MOV R4,R0 ;COPY STATUS WORDL% MOV U.SCB(R5),R4 ;GET ADDRESS OF SCB  TSTB EOFCT(R5) ;END OF FILE?U BNE 190$ ;IF NE NO TST U.CW3(R5) ;ATTACH FOR AST?S BEQ 180$ ;IF EQ NO BIT #HOPERR,R0 ;HOPERR ERROR?- BNE 110$ ;IF NE - EOF, AST AND HOPPER ERROR0=180$: BR 150$ ;EOF AND EITHER AST AND/OR HOPPER ERROR OR NOTP*190$: BIT #TRONL,R0 ;TRANSITION TO ONLINE? BNE 200$ ;IF NE YES5 BIT #CRDONE,R0 ;CARD DONE?R BNE 240$ ;IF NE YES( BIT #HOPERR,R0 ;HOPERR ERROR?. BNE 100$ ;IF NE, NO EOF YET AND HOPPER ERROR! BR 230$ ;CHECK FOR OTHER ERRORS /200$: BITB #US.BSY,U.STS(R5) ;READ IN PROGRESS?E BNE 60$ ;IF NE YES0210$: MOV U.CW3(R5),R1 ;GET ADDRESS OF AST BLOCK' BEQ 130$ ;IF EQ, THERE IS NONE, ERROR9 MOV A.PRM(R1),R0 ;GET TCB ADDRESS OF TASK TO RECEIVE AST0! CALLR $QASTT ;QUEUE AST TO TASKR220$: JMP CRERR ;230$: ;REF LABELS .IF DF,T$$KMG BIT #MTNERR,R0 ;MOTION ERROR? BNE 220$ ;IF NE YES2 BIT #TIMERR,R0 ;TIMING ERROR? BEQ 240$ ;IF EQ NO JMP 40$ ;, .IFFE BIT #MTNERR,R0 ;MOTION ERRORE BNE 220$ ;IF NE YES0 BIT #TIMERR,R0 ;TIMING ERRORD BEQ 240$ ;IF EQ NO) BIS #TIMERR,U.CW2(R5) ;SHOW TIMING ERROR BR 220$ ;  .ENDC'240$: MOV #80.*2,R0 ;ASSUME BINARY READA MOVB U.CW2(R5),R1 ;BINARY READ? BMI 250$ ;IF MI YESL$ MOVB CCOLC(R5),R0 ;USE COLUMN COUNT TSTB R1 ;PACKED HOLLERITH? BNE 250$ ;IF NE YESG4 CMP #CR026,CCOL1(R5) ;026 TRANSLATION CONTROL CARD? BEQ 400$ ;IF EQ YEST4 CMP #CR029,CCOL1(R5) ;029 TRANSLATION CONTROL CARD? BEQ 410$ ;IF EQ YES & MOV #TB029,R1 ;ASSUME 029 TRANSLATION) BITB #US.MDE,U.STS(R5) ;029 TRANSLATION?; BNE 250$ ;IF NE YESU' MOV #TB026,R1 ;SET FOR 026 TRANSLATION ;250$: MOV STRBF(R5),R2 ;GET STARTING ADDRESS OF DATA BUFFERV5 MOV U.CNT(R5),-(SP) ;GET NUMBER OF BYTES TO TRANSFERM3260$: MOVB (R2)+,R3 ;GET NEXT BYTE FROM DATA BUFFER 5 BIT #300,U.CW2(R5) ;BINARY OR PACKED HOLLERITH READ?5 BNE 300$ ;IF NE YESR! MOV #104,R4 ;ASSUME RPG SPECIALC CMPB R3,#240 ;RPG SPECIAL? BEQ 290$ ;IF EQ YESB" INC R4 ;INCREMENT CHARACTER CODE CMPB R3,#140 ;RPG SPECIAL? BEQ 290$ ;IF EQ YES9% MOVB R3,R4 ;SIGN EXTEND PACKED CODE) BPL 270$ ;IF PL, ZONE 12 IS NOT PUNCHED5' ADD #340,R4 ;ADJUST FOR ZONE 12 PUNCHS% MOV R4,R3 ;COPY FOR ZONE COUNT DOWN;2270$: SUB #40,R3 ;DECREMENT COUNT OF ZONE PUNCHES BMI 280$ ;IF MI DONE. SUB #17,R4 ;SUBTRACT 21 AND STRIP ZONE PUNCH BR 270$ ;E'280$: CMP R4,#105 ;INDEX WITHIN RANGE?4 BLOS 290$ ;IF LOS YESC CLR R4 ;FORCE A BLANK?5290$: ADD R1,R4 ;CALCULATE ADDRESS OF TRA00˜¢|‡|Ž{´cÚµcÛ¶c�·c›’NSLATE CODE ) MOVB (R4),R3 ;GET TRANSLATED ASCII CODE02300$: MOV R3,-(SP) ;SET BYTE TO PUT IN USER BUFFER& CALL $PTBYT ;PUT BYTE IN USER BUFFER* DEC (SP) ;ANY MORE SPACE IN USER BUFFER? BLE 310$ ;IF LE NO$ DEC R0 ;ANY MORE BYTES TO PROCESS? BGT 260$ ;IF GT YES /310$: MOV U.CNT(R5),R1 ;GET SIZE OF USER BUFFER 3 SUB (SP)+,R1 ;CALCULATE NUMBER OF BYTES TRANSFERED$5 MOV #IS.SUC&377,R0 ;SET SUCCESSFUL COMPLETION STATUSO(320$: CALL $IODON ;FINISH I/O OPERATION3 MOV STRBF(R5),R0 ;GET ADDRESS OF BUFFER TO RELEASE  BEQ 340$ ;IF EQ, NO BUFFER4 MOV #80.,R1 ;ASSUME ASCII OR PACKED HOLLERITH READ+ TSTB U.CW2(R5) ;ASCII OR PACKED HOLLERITH? BPL 330$ ;IF PL YESA$ ASL R1 ;SET FOR BINARY READ BUFFER*330$: CALL $DEACB ;DEALLOCATE DATA BUFFER340$: JMP CRINI ;GO AGAIN;.; STORE DATA IN CARD BUFFERB;E-350$: MOV (R3)+,R4 ;;;READ BINARY CARD COLUMNS+ MOV (R3),R3 ;;;READ PACKED HOLLERITH DATAO2 MOVB CCOLC(R5),-(SP) ;;;GET CURRENT COLUMN NUMBER# BNE 360$ ;;;IF NE, NOT COLUMN ONES. MOV R4,CCOL1(R5) ;;;SAVE CARD COLUMN ONE DATA/360$: CMPB (SP)+,EOFCL(R5) ;;;PAST EOF COLUMNS?R BHIS 370$ ;;;IF HIS YESA$ CMP R4,#CREOF ;;;END OF FILE PUNCH? BNE 370$ ;;;IF NE NO( DECB EOFCT(R5) ;;;DECREMENT EOF COUNTER<370$: CMPB CCOLC(R5),#80. ;;;80. COLUMNS READ (BUFFER FULL)?/ BEQ 390$ ;;;IF EQ YES -- DO NOT EXCEED BUFFERR* INCB CCOLC(R5) ;;;INCREMENT COLUMN NUMBER7 MOVB R3,@CURBF(R5) ;;;ASSUME ASCII OR PACKED HOLLERITHP- TSTB U.CW2(R5) ;;;ASCII OR PACKED HOLLERITH?F BPL 380$ ;;;IF PL YESV' MOV R4,@CURBF(R5) ;;;STORE BINARY DATAA/ INC CURBF(R5) ;;;UPDATE CURRENT BUFFER ADDRESSR4380$: INC CURBF(R5) ;;;UPDATE CURRENT BUFFER ADDRESS 390$: MOV (SP)+,R3 ;;;RESTORE R3 RETURN ;;;EXIT INTERRUPTE;F; SET 026 TRANSLATION MODE;#8400$: BICB #US.MDE,U.STS(R5) ;CLEAR 029 TRANSLATION FLAG BR 420$ ; ;D; SET 029 TRANSLATION MODE;C6410$: BISB #US.MDE,U.STS(R5) ;SET 029 TRANSLATION FLAG!420$: JMP 20$ ;READ ANOTHER CARD5;A0; **-CRATT-CARD READER CHECK FOR ATTACH FUNCTION; ; OUTPUT:R;R*; C=0 FUNCTION WAS NOT AN ATTACH OR DETACH&; C=1 FUNCTION WAS AN ATTACH OR DETACH;U9CRATT: CMPB #,I.FCN+1(R1) ;ATTACH FUNCTION?; BNE 480$ ;IF NE NO4 BITB #TF.AST,I.FCN(R1) ;ATTACH FOR UNSOLICITED AST? BEQ 495$ ;IF EQ NO8430$: TST I.PRM(R1) ;CHECK FOR NON-SPECIFIED AST ADDRESS BEQ 470$ ;IF EQ YES, ERROR& MOV R1,-(SP) ;SAVE I/O PACKET ADDRESS2 MOV #ASTSIZ.,R1 ;SET LENGTH OF AST BLOCK IN BYTES, CALL $ALOCB ;ALLOCATE CORE BLOCK FROM POOL BCC 440$ ;IF CC OK TST (SP)+ ;CLEAN STACK2 MOV #IE.NOD&377,R0 ;SET BUFFER ALLOCATION FAILURE BR 500$ ;O1440$: MOV R0,U.CW3(R5) ;COPY ADDRESS OF AST BLOCK(( MOVB #1,EOFCT(R5) ;FAKE NOT END OF FILE) MOV (SP)+,R1 ;RESTORE I/O PACKET ADDRESSO# MOV KISAR5,(R0)+ ;MAPPING (A.KSR5)31 MOV #CRCUB,(R0)+ ;WHERE TO CALL US BACK (A.DQSR)E, MOV R0,U.CW3(R5) ;COPY ADDRESS OF AST BLOCK( TST (R0)+ ;SKIP PAST LINK WORD (A.LNK), CLR (R0)+ ;LENGTH OF CONTROL BLOCK (A.CBL)7 MOV #STKSIZ.,(R0)+ ;ALLOCATE 14 BYTES ON STACK (A.BYT)K) MOV I.PRM(R1),(R0)+ ;AST ADDRESS (A.AST)7- CLR (R0)+ ;NUMBER OF AST PARAMETERS (A.NPR)O0 MOV I.TCB(R1),(R0) ;TCB ADDRESS OF TASK (A.PRM)0 BIT #READY,@S.CSR(R4) ;READER READY AND ONLINE? BNE 450$ ;IF NE NO CALL 210$ ;QUEUE AST NOW( BR 495$ ;SKIP SETTING INTERRUPT ENABLE.450$: BIS #IE,@S.CSR(R4) ;SET INTERRUPT ENABLE BR 495$ ; <470$: MOV #IE.SPC&377,R0 ;SET ILLEGAL AST ADDRESS ERROR CODE BR 500$ ; 8480$: CMPB #,I.FCN+1(R1) ;DETACH FUNCTION? BEQ 490$ ;IF EQ YES . CLC ;SHOW FUNCTION WAS NOT ATTACH OR DETACH RETURN ;01490$: MOV U.CW3(R5),R0 ;GET ADDRESS OF AST BLOCK?R BEQ 495$ ;IF EQ NONE< CMP -(R0),-(R0) ;POINT TO BEGINNING OF ALLOCATED CORE BLOCK) MOV #ASTSIZ.,R1 ;SET LENGTH OF AST BLOCKA$ CALL $DEACB ;DEALLOCATE CORE BLOCK+ BIC #IE,@S.CSR(R4) ;CLEAR INTERRUPT ENABLEE. CLR U.CW3(R5) ;SHOW NO ATTACH FOR AST ANYMORE8495$: MOV #IS.SUC&377,R0 ;SET SUCCESSFUL COMPLETION CODE2500$: SEC ;SHOW FUNCTION WAS AN ATTACH OR DETACH RETURN ; .DSABL LSB00˜ª|™«|š±|t÷tø tþfDATA; C; CANCEL I/O OPERATION-FORCE I/O TO COMPLETE IS DEVICE IS NOT READYW;54CRCAN: CMP R1,I.TCB(R0) ;;;REQUEST FOR CURRENT TASK? BNE 10$ ;;;IF NE NON< BISB #US.ABO,U.STS(R5) ;;;SET FOR ABORT IF DEVICE NOT READY10$: RETURN ;;;A .ENDDEACB ;DEALLOCATE CORE BLOCK+ BIC #IE,@S.CSR(R4) ;CLEAR INTERRUPT ENABLEE. CLR U.CW3(R5) ;SHOW NO ATTACH FOR AST ANYMORE8495$: MOV #IS.SUC&377,R0 ;SET SUCCESSFUL COMPLETION CODE2500$: SEC ;SHOW FUNCTION WAS AN ATTACH OR DETACH RETURN ; .DSABL LSB .TITLE TTYJ .IDENT /V4.00/B;06; COPYRIGHT (c) 1983 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;T<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;N;;; 27-JAN-78 PETER WANNHEDENS;C; PREVIOUSLY MODIFIED BY: ;N; P. WANNHEDEN ; C. F. SPITZM; D. R. DONCHIN);;; MODIFICATIONS:;L .PSECT MAP5;M;+*; CONTROLLER-DEPENDENT ROUTINES FOR DJ-11.;-;-;O T .IF DF D$$J11 ,; EQUATED SYMBOLSL;T; DJ-11 REGISTER DEFINITIONS;I!CSR = 0 ;CONTROL AND STATUS REG.ORBUF = 2 ;RECEIVER BUFFER REG..TCR = 4 ;TRANSMIT CONTROL REG.D"TBUF = 6 ;TRANSMITTER BUFFER REG.;C;E;+; YJPWUP - POWER UP.; ; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.STS SET UP FOR LOCAL LINE: ; US.CRW 0. ; US.DSB 0 ;-;O;I .IF DF R$$CONYJCONL::YJCPUP:: .IFF#YJPWUP::TST R2 ;IS THIS LINE ZERO?  BNE 20$ ;N - RETURN .IFTF, MOV #10,@R3 ;CLEAR SILO, UARTS, CONTROLLER!10$: BIT #20,@R3 ;CLR COMPLETED?O BNE 10$ ;N - WAITB" BIS #40501,@R3 ;ENABLE INTERRUPTS .IFTNYJUONL::YJUPUP::YJUOFF:: .ENDC ;R$$CON20$:YJMTIM::RETURN ;RETURN .IF DF R$$CONYJCOFF::, MOV #10,@R3 ;CLEAR SILO, UARTS, CONTROLLER!10$: BIT #20,@R3 ;CLR COMPLETED?: BNE 10$ ;N - LOOP. RETURN- .ENDC ;R$$CON;C;;+"; INPUT INTERRUPT SERVICE ROUTINE.;-;2;I .ENABL LSBE;  B .IF DF R$$MPL -$YJINP::TTSET$ YJ ;;;SAVE R2, R3 AND SET UP:  ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS $ .IFF ;R$$MPLB #+$DJINP::TTSET$ DJ ;;;SAVE R2,R3 AND SET UPO ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST T .ENDC ;R$$MPL N, CALL MUXINP ;;;DO COMMON MULTIPLEXER INPUT ;;;CHARACTER PROCESSINGR3 ;;;MUXINP DISMISSES INTERRUPT IF NO OUTPUT WORKL* BR 10$ ;;;XMIT READY - GO DO OUTPUT WORK;;N;+#; OUTPUT INTERRUPT SERVICE ROUTINE.I;-;B;S  .IF DF R$$MPL M-$YJOUT::TTSET$ YJ ;;;SAVE R2, R3 AND SET UP:E ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS E .IFF ;R$$MPLR P+$DJOUT::TTSET$ DJ ;;;SAVE R2,R3 AND SET UPS ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST I .ENDC ;R$$MPL M10$: MOV R3,-(SP) ;;;;, ADD #TBUF+1,@SP ;;;POINT TO BYTE CONTAINING0 ;;;INTERRUPTING LINE NUMBER (TBUF HIGH BYTE). CALL JZOUT ;;;DO OUTPUT INTERRUPT PROCESSING! ;;;COMMON FOR DJ-11 AND DJ-11I TST (SP)+ ;;;CLEAN STACK;;;+; YJABOX - ABORT OUTPUT.;T; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.TOC 0 ; U.TTOC 0;F; YJSTOX - STOP OUTPUT.T;$; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S1.CTS 1I;-;C;$YJABOX::YJSTOX::RETURN ;;;RETURN;B .DSABL LSBO  .ENDC ;D$$J11 ; ;I .ENDTING LINE NUMBER (TBUF HIGH BYTE). CALL JZOUT ;;;DO OUTPUT INTERRUPT PROCESSING! ;;;COMMON FOR DJ-11 AND DJ-11I TST (SP)+ ;;;CLEAN STACK;;;+; YJABOX - ABORT OUTPUT.;T; INPUT:<; REGISTERS R2-R .TITLE TTDATL .IDENT /06.11/T; 8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ;N ; 27-JAN-78 PETER WANNHEDENH ;H ; PREVIOUSLY MODIFIED BY:;; P. WANNHEDEN; C. F. SPITZ; D. R. DONCHIN; ; T. LEKAS; J. KAUFFMAN ; S. C. ADAMS ; C. B. PETROVIC ; R. S. PHILPOTT R ; T. LEK00š²|‡|Ž{´cÚµcÛ¶c�·c›’AS ; B. S. MCCARTHY ; L. B. MCCULLEY ; L. M. KOGAN ; ; MODIFICATIONS:;T; ; L. KOGAN 02-DEC-85 06.01<; LK706 -- CORRECT SPEED FOR 134.5 BAUD IN ABLOW FOR DH11; ; S. C. ADAMS 6-NOV-85 6.027; SA452 -- ADD SUPPORT FOR USER-WRITTEN PORT DRIVER E;A; L. KOGAN 18-JUN-86 6.034; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORT;"; S. R. CLOUTIER 20-JUN-86 6.045; ADD $LHGTD (LH GET TRANSMIT DATA) ENTRY TO TABLE;S; S. C. ADAMS 6-AUG-86 6.057; SA464 -- ADD SUPPORT FOR LAT APPLICATION TERMINALS ; !; S. R. CLOUTIER 7-AUG-86 6.06'; ADD $LHTMO TIME-OUT ENTRY TO TABLE-;R; R. D. HANEY 13-AUG-86 6.07 "; RDH073 - ADD SUPPORT FOR LA75; %; S. R. CLOUTIER 12-SEPT-1986 6.08R1; SRC CORRECT PPORG AND PPEIO IN PPDSP (PHEW!)6;3 ; R. D. HANEY 19-SEP-86 06.10(; RDH087 ADD SUPPORT FOR LA2XX SERIES;2#; S. R. CLOUTIER 27-OCT-86 06.11E; SRC FIX QPDSP FOR IO.ORGs;St; u;+Kv; THIS MODULE CONTAINS ALL DRIVER DATA, EXCEPT THE DRIVER DISPATCH TABLE. 7w; IT ALSO CONTAINS THE DRIVER INITIALIZATION ROUTINE.Mx;EAy; IN A SYSTEM THAT SUPPORTS SEPARATE KERNEL DATA SPACE MAPPING,R:z; THIS MODULE MUST BE BUILT INTO THE TASK IMAGE "TTCOM".{;-|;0}; ~ .MCALL FILIO$, SPCIO$, TTSYM$; &€ FILIO$ ;DEFINE I/O FUNCTION CODES � SPCIO$ ‚ TTSYM$Dƒ„ .IF DF T$$OVL…† .MCALL PCBDF$ ‡ PCBDF$-ˆ‰ .ENDC ;T$$OVLŠ‹Œ .IF NDF R$$MPL�Ž .MCALL HWDDF$�� HWDDF$ ;DEFINE KINAR5‘’ .ENDC ;NDF R$$MPL“”;E•;C–; MACRO TO GENERATE CHARACTER RECOGNITION TABLE AND CORRESPONDINGA—; DISPATCH TABLE. ˜;A™ .MACRO CREC PREFIX,CHARš .IRP X,› .PSECT CHRTœ .IIF NDF CHRT CHRT==.&� .IIF NDF 'PREFIX'CRT 'PREFIX'CRT==.ž .BYTE CH.'X'Ÿ .PSECT CHRD  .IIF NDF CHRD CHRD==.¡ .WORD 'PREFIX''X'¢ .ENDR£ .PSECT MAP5 ¤ .ENDM CRECC¥;)¦CH.DEF = 0 ;DEFINE "DEFAULT" CHARACTER § ;FOR CHARACTER DISPATCHING¨;!©; CHARACTER RECOGNITION TABLES.;ª; EACH TABLE SHOULD BE ORDERED IN DESCENDING FREQUENCY OFH'«; OCCURRENCE FOR MAXIMUM PERFORMANCE.N¬;4­; CHARACTERS THAT HAVE SPECIAL SIGNIFICANCE BEFORE2®; STORING IN TYPE-AHEAD BUFFER - USED BY ICHAR1./¯; NOTE - ICHAR1 RECOGNIZES CTRL-X SEPARATELY.8°; ALL ENTRIES IN THE TABLE MUST BE NUMERICALLY SMALLER±; OR EQUAL TO CTRL-X (30).²;.³ .PSECT MAP5´;Cµ .EVEN ¶I1CRT::=· .BYTE CH.CTS, CH.CTQ, CH.CTO¸¹ .IIF DF T$$CTX, .BYTE CH.CTXº» .BYTE CH.CTCN3¼ASXOFF==I1CRT ;THIS LABEL MUST POINT TO AN XOFFE½ ;CHARACTER (CTRL-S) 3¾ASXON==I1CRT+1 ;THIS LABEL MUST POINT TO AN XONC¿ ;CHARACTER (CTRL-Q)IÀ;CÁ;O3Â; CHARACTERS THAT HAVE SPECIAL SIGNIFICANCE AFTER.>Ã; RETRIEVAL FROM TYPE-AHEAD BUFFER (OR WHEN BUFFER BYPASSED)FÄ; USED BY ICHAR2. NOTE - ESCAPE AND RUBOUT ARE RECOGNIZED SEPARATELY;Å; BY ICHAR2. ALL ENTRIES IN THE TABLE MUST BE NUMERICALLYEÆ; SMALLER THAN ESCAPE (33).Ç; +È CREC I2,NÉ Ê .IIF DF T$$CTX, CREC I2,ËÌ CREC I2,Í;AÎ;R Ï .IIF DF T$$CTR, CREC ED,ÐÑ CREC ED,Ò; Ó;ACÔ; CHARACTERS THAT HAVE TO BE EXPANDED ON OUTPUT - USED BY EXPCHR.I7Õ; CARRIAGE-RETURN IS RECOGNIZED SEPARATELY BY EXPCHR.EGÖ; ALL ENTRIES IN THE TABLE MUST BE SMALLER THAN CARRIAGE-RETURN (15).G×; Ø CREC EX,Ù;IAÚ; CHARACTERS THAT HAVE NON-STANDARD ECHO FORMATS AS TERMINATORSÛ;Ü CREC EK,CÝÞ;ß;8à; RECOGNITION TABLE FOR VERTICAL FORMAT CONTROL BYTES.2á; NOTE - THIS TABLE USES -1 AS TABLE TERMINATOR.â;<1ã; THE WORD IN TABLE CHRD IS ENCODED AS FOLLOWS:Tä;E*å; LOW BYTE DESCRIBES LEADING LF'S OR FF:æ; 0 = NO LEADING CHARACTERSAç; CH.FF = LEADING FFè; -N = N LEADING LF'SMé;E$ê; HIGH BYTE DESCRIBES TRAILING CR:ë; 0 = NO TRAILING CRì; S2.CR = TRAILING CR í;C%î; DEFINE SYMBOLS FOR ENCODED VALUESSï;E7ð .IIF LE S2.CR-200 .ERROR ;S2.CR M00šº|«|š±|t÷tø tþfDATAUST BE IN HIGH BYTEñVFNUL = 0 ;NULL - NOTHING%òVFZER = 376!S2.CR ;0 - 2 LF'S, 1 CR%óVFONE = CH.FF!S2.CR ;1 - 1 FF, 1 CRR'ôVFPLU = S2.CR ;+ - NO LF OR FF, 1 CRDõVFDOL = 377 ;$ - 1 LF, NO CR(öVFDF = 377!S2.CR ;DEFAULT - 1 LF, 1 CR÷; ø;Lù; DEFINE THE TABLE TERMINATOREú; ûCH.DF = -1ü;I#ý CREC VF,Eþ;Iÿ;C; SPECIAL ECHO STRINGS; >ASHT:: .BYTE CH.SP,CH.SP,CH.SP,CH.SP,CH.SP,CH.SP,CH.SP,CH.SP+ ;8 SPACES - USED TO SIMULATE HOR. TABM .IF DF T$$CTRASCTR:: .ASCII /^R/ ;CTRL-R  .ENDC  ASCTU:: .ASCII /^U/ ;CTRL-U   .IF NDF R$$MPL&A$$CLI.ASCLP:: .BYTE 12,'> ;ABBREVIATED CLI PROMPT,ASCLI:: .ASCII <12>/MCR>/ ;FULL CLI PROMPT .ENDC ;NDF R$$MPL&A$$CLII .IF DF T$$SPC/ASCLC:: .BYTE 15,12 ;CLI CONTINUATION PROMPT, .ASCII /->/ ; .ENDC ;T$$SPC;#; DON'T SEPARATE THE LINES BELOW!P;PASCTZ::.ASCII /^Z/ ;CTRL-Z (ASCR:: .BYTE CH.CR,0,0,0,0,0,0,0,0,0,0,  ;CARRIAGE RETURN PLUS UP TO 10 FILLERS! ;(WORST CASE FOR LA30S)S"; ##; DON'T SEPARATE THE LINES ABOVE!R$;&%ASBELL::.BYTE 7 ;BELL &ASBSL:: .ASCII "\" ;BACKSLASH'( .IF DF T$$RUB)>*ASRBS:: .BYTE CH.BSP,CH.SP,CH.BSP ;BACKSPACE-SPACE-BACKSPACE+ ;(FOR SCOPE RUBOUT)B9,ASBSP:: .BYTE CH.BSP,CH.BSP,CH.BSP,CH.BSP ;8 BACKSPACES=- .BYTE CH.BSP,CH.BSP,CH.BSP,CH.BSP ;TO RUBOUT HTAB ON SCOPEW./ .ENDC01;I02 NLFF==4 ;NUMBER OF VERTICAL FILL CHARACTERS03 .REPT 4 ;OUTPUT 4 LF'S IN PLACE OF FF AND VT4 .BYTE CH.LF ;FOR SCOPESL15 .REPT NLFF ;INSERT VERTICAL FILL IF NECESSARY 6 .BYTE 07 .ENDR8 .ENDR09 .REPT 4 ;OUTPUT 4 LF'S IN PLACE OF FF AND VT: .BYTE CH.LF ;FOR SCOPESB; .ENDR <ASLF:: .BYTE CH.LF ;LINE FEED = .REPT NLFFP> .BYTE 0 ;FILLERS? .ENDR@;.A;HB .IF DF T$$ESCC*D; SYNTAX RULE TABLE FOR ESCAPE SEQUENCESE;B F .ENABL LSBPG9H .BYTE 'P,'P,40$-ESCST ;P - NEXT = 40$ (VT61 EXCEPTION)L9I .BYTE 'Y,'Y,30$-ESCST ;Y - NEXT = 30$ (VT61 EXCEPTION) GJESCST:: .BYTE '?,'?,40$-ESCST ;? - NEXT = 40$ (OLDER TERM. EXCEPTION) >K .BYTE 'O,'O,40$-ESCST ;O - NEXT = 40$ (ANSI SS3 INTRODUCER)3L .BYTE '[,'[,20$-ESCST ;[ - NEXT = 20$ (ANSI CSI)ODM10$: .BYTE 40,57,10$-ESCST ;INTERMEDIATE CHAR. - NEXT = SAME (10$))N .BYTE 60,176,0 ;FINAL CHARACTER - DONE.DO20$: .BYTE 40,77,20$-ESCST ;INTERMEDIATE CHAR. - NEXT = SAME (20$)*P .BYTE 100,176,0 ;FINAL CHARACTER - DONEBQ30$: .BYTE 40,176,40$-ESCST ;FIRST COORD. (BIAS 40) - NEXT = 40$R40$: .BYTE 60,71,20$-ESCST ;S .BYTE 40,176,0 ;ST U .DSABL LSB VW .ENDCXY; 3Z; TABLE OF HORIZONTAL FILL REQUIREMENT FOR LA30S.I5[; INDEX = CURRENT HORIZONTAL POSITION DIVIDED BY 8.N\;I"]; NUMBER OF FILL CHAR.S HOR.POS.^HORFT:: .BYTE 4. ;0-7.A_ .BYTE 8. ;8.-15.` .BYTE 6. ;16.-23.-a .BYTE 3. ;24.-31.,b .BYTE 0. ;32.-39.Ac .BYTE 2. ;40.-47.(d .BYTE 4. ;48.-55.0e .BYTE 6. ;56.-63.Ef .BYTE 8. ;64.-71.0g .BYTE 10. ;72. AND UP h; i;=jkl.IIF DF T$$ONI, .PSECT MAP6mn .IF DF D$$M11&R$$MPL&T$$ONIo%pYMC12:: .BLKW 1 ;POINTER TO $YMCTBRqr .ENDC ;D$$M11&R$$MPL&T$$ONIs,t .IF DF T$$GMC!T$$SMC!D$$M11!D$$Z11!D$$V11u0vSPHI == S.38.4 ;HIGHEST RECOGNIZED SPEED CODEwx .IF DF D$$H11y<z; TABLE OF RECEIVE AND TRANSMIT SPEED PARAMETERS FOR DH11.@{; THE TABLE IS INDEXED BY S.XXX-1, WHERE S.XXX IS THE SYMBOLIC3|; NAME FOR THE DESIRED SPEED (DEFINED BY TTSYM$).->}; EACH ENTRY IS A BYTE CONTAINING THE PARAMETER TO LOAD INTO0~; THE LINE PARAMETER REGISTER FOR SPEED S.XXX.@; IF S.XXX IS UNSUPPORTED, THE BYTE CONTAINS A NEGATIVE VALUE.€;1�SPDH:: .BYTE 0 ;S.0‚ .BYTE 1 ;S.50!ƒ .BYTE 2 ;S.751!„ .BYTE -1 ;S.100 - UNSUPPORTEDC… .BYTE 3 ;S.110† .BYTE 4 ;S.134‡ .BYTE 5 ;S.150ˆ .BYTE 6 ;S.200‰ .BYTE 7 ;S.300Š .BYTE 10 ;S.600 ‹ .BYTE 11 ;S.1200Œ .BYTE 12 ;S.1800"� .BYTE -1 ;S.2000 - UNSUPPORTEDŽ .BYTE 13 ;S.2400"� .BYTE -1 ;S.3600 - UNSUP00šÂ|‡|Ž{´cÚµcÛ¶c�·c›’PORTED� .BYTE 14 ;S.4800"‘ .BYTE -1 ;S.7200 - UNSUPPORTED’ .BYTE 15 ;S.9600“ .BYTE 16 ;S.EXTA” .BYTE 17 ;S.EXTB"• .BYTE -1 ;S.19.2 - UNSUPPORTED"– .BYTE -1 ;S.38.4 - UNSUPPORTED—˜ .ENDC ;D$$H11™š .IF DF D$$Z11›<œ; TABLE OF RECEIVE AND TRANSMIT SPEED PARAMETERS FOR DZ11.;�; THE TABLE FORMAT IS IDENTICAL TO THAT OF THE DH11 TABLE;ž; DESCRIBED ABOVE.Ÿ;0% SPDZ:: .BYTE -1 ;S.0 - UNSUPPORTED.¡ .BYTE 0 ;S.50¢ .BYTE 1 ;S.750!£ .BYTE -1 ;S.100 - UNSUPPORTEDD¤ .BYTE 2 ;S.110¥ .BYTE 3 ;S.134¦ .BYTE 4 ;S.150!§ .BYTE -1 ;S.200 - UNSUPPORTED;¨ .BYTE 5 ;S.300© .BYTE 6 ;S.600ª .BYTE 7 ;S.1200T« .BYTE 10 ;S.1800¬ .BYTE 11 ;S.2000­ .BYTE 12 ;S.2400® .BYTE 13 ;S.3600¯ .BYTE 14 ;S.4800° .BYTE 15 ;S.7200± .BYTE 16 ;S.9600"² .BYTE -1 ;S.EXTA - UNSUPPORTED"³ .BYTE -1 ;S.EXTB - UNSUPPORTED"´ .BYTE -1 ;S.19.2 - UNSUPPORTED"µ .BYTE -1 ;S.38.4 - UNSUPPORTED¶· .ENDC ;D$$Z11¸¹ .IF DF D$$V11º=»; TABLE OF RECEIVE AND TRANSMIT SPEED PARAMETERS FOR DHV11.S;¼; THE TABLE FORMAT IS IDENTICAL TO THAT OF THE DH11 TABLE½; DESCRIBED ABOVE.¾;E&¿SPDHV:: .BYTE -1 ;S.0 - UNSUPPORTED À .BYTE -1 ;S.50 - UNSUPPORTEDÁ .BYTE 1 ;S.75;! .BYTE -1 ;S.100 - UNSUPPORTEDYà .BYTE 2 ;S.110Ä .BYTE 3 ;S.134Å .BYTE 4 ;S.150!Æ .BYTE -1 ;S.200 - UNSUPPORTED-Ç .BYTE 5 ;S.300È .BYTE 6 ;S.600É .BYTE 7 ;S.1200 Ê .BYTE 10 ;S.1800Ë .BYTE 11 ;S.2000Ì .BYTE 12 ;S.2400"Í .BYTE -1 ;S.3600 - UNSUPPORTEDÎ .BYTE 13 ;S.4800"Ï .BYTE -1 ;S.7200 - UNSUPPORTEDÐ .BYTE 15 ;S.9600"Ñ .BYTE -1 ;S.EXTA - UNSUPPORTED"Ò .BYTE -1 ;S.EXTB - UNSUPPORTEDÓ .BYTE 16 ;S.19.2"Ô .BYTE -1 ;S.38.4 - UNSUPPORTEDÕÖ .ENDC ;D$$V11×%Ø .ENDC ;T$$GMC!T$$SMC!D$$M11!D$$Z11ÙÚ .PSECT MAP5ÛÜÝ .IF DF D$$M11!D$$ZMD!D$$VMDÞß;EOà; MATCH TABLES FOR AUTO-BAUD SPEED DETECT. EACH ENTRY CONSISTS OF TWO BYTES,.Má; THE FIRST BYTE IS WHAT A CARRIAGE RETURN LOOKS LIKE WHEN WE ARE RECEIVINGOMâ; AT A KNOWN RATE AND THE CHARACTER WAS SENT AT THE BAUD SPEED SPECIFIED BY.Lã; THE SECOND RATE. THERE ARE TWO TABLES, ONE FOR DETECTING SPEEDS BETWEENNä; 600 AND 9600 BAUD (WE SAMPLE AT 4800 BAUD), THE OTHER FOR DETECTING SPEEDS4å; BETWEEN 50 AND 300 BAUD (WE SAMPLE AT 300 BAUD).æ;A=çABHIGH::.BYTE 200,S.600 ;CH.CR AT 600 BAUD ON DH11 AND DZ11 8è .BYTE 170,S.1200 ;CH.CR AT 1200 BAUD ON DH11 AND DZ118é .BYTE 214,S.1800 ;CH.CR AT 1800 BAUD ON DH11 AND DZ118ê .BYTE 346,S.2400 ;CH.CR AT 2400 BAUD ON DH11 AND DZ11/ë .BYTE 362,S.9600 ;CH.CR AT 9600 BAUD ON DH11I/ì .BYTE 376,S.9600 ;CH.CR AT 9600 BAUD ON DZ11S"í .BYTE 0 ;ZERO TABLE TERMINATORî;0;ïABLOW:: .BYTE 340,S.50 ;CH.CR AT 50 BAUD ON DH11 AND DZ11T4ð .BYTE 170,S.75 ;CH.CR AT 75 BAUD ON DH11 AND DZ116ñ .BYTE 214,S.110 ;CH.CR AT 110 BAUD ON DH11 AND DZ119ñ .BYTE 316,S.134 ;CH.CR AT 134.5 BAUD ON DH11 ; LK70607ó .BYTE 306,S.134 ;CH.CR AT 134.5 BAUD ON DZ11 ;**-106ô .BYTE 346,S.150 ;CH.CR AT 150 BAUD ON DH11 AND DZ11"õ .BYTE 0 ;ZERO TABLE TERMINATORö÷ .ENDC ;D$$M11!D$$ZMD!D$$VMDøù .IF DF T$$GMC!T$$SMC!T$$CUPúû;Nü;S9ý; TABLES OF IMPLICIT CHARACTERISTICS PER TERMINAL TYPE. >þ; EACH TABLE IS INDEXED WITH TERMINAL TYPE (TC.XXX) MINUS 1.=ÿ; HIGHEST INDEX = TTPHI. EACH ENTRY IS A BYTE, WITH MEANINGT; DESCRIBED BELOW.;; TABLE BIT(-S) MEANINGT:; ------------------------------------------------------6; TTYP1 0-5 TO BE COPIED DIRECTLY INTO THE HIGH BYTE"; OF STATUS WORD 2 (U.TSTA+2).5; 6-7 CURSOR POSITIONING COMMAND TYPE (RANGE 0-3).M4; THIS VALUE IS USED AS INDEX INTO TABLE "CPOST"; (SEE BELOW). ; TTYP2 0-7 PAGE WIDTH.P ; TTYP3 0-6 PAGE LENGTH. ; 7 1 = SCOPE.I6 ; TTYP4 0-5 TO BE COPIED DIRECTLY INTO THE HIGH BYTE" ; OF STATUS WORD 4 (U.TSTA+6).;T; D; MACRO TO GENERATE AN ENTRY IN THE TABLES TTYP1, TTYP2 AMD TTYP3.;-;-R; NOTE: DEFAULT OF HSY IS A NO-OP. STATUS BITS MUST BE REARRANGED FOR IT TO WORK00šÊ|«|š±|t÷tø tþfDATA; E .MACRO TERM TYPE,WID,LEN,HHT=0,HFF=0,HFL=0,VFL=0,SCP=0,CUP=0,HSY=0E .PSECT TTYP1 .IIF NDF TTYP1 TTYP1==. .=TTYP1+TYPE-1S8 X=!!! .BYTE X!HFL! .IF DF T$$GMC!T$$SMC  .PSECT TTYP2D .IIF NDF TTYP2 TTYP2==. .=TTYP2+TYPE-1D  .BYTE WID  .PSECT TTYP3 ! .IIF NDF TTYP3 TTYP3==." .=TTYP3+TYPE-1 # .BYTE !LEN$ .ENDC% .PSECT MAP5 & .ENDM TERM.';U2(; MACRO TO GENERATE AN ENTRY IN THE TABLE TTYP4.); >* .MACRO ETERM TYPE,ANI=0,AVO=0,BLK=0,DEC=0,EDT=0,RGS=0,SFC=0+ .PSECT TTYP4, .IIF NDF TTYP4 TTYP4==.- .=TTYP4+TYPE-1E. X=!!!!< / X=X!!0 .BYTE X/4001 .PSECT MAP52 .ENDM ETERM3;T@3TTPHI == T.L2XX ;HIGHEST TERMINAL TYPE WITH IMPLICIT ;RDH0875 ;CHARACTERISTICS ;**-1Y6;C$7 TERM T.AS33 WID=72.,LEN=66.,HFL=1$8 TERM T.KS33 WID=72.,LEN=66.,HFL=1$9 TERM T.AS35 WID=72.,LEN=66.,HFL=1$: TERM T.L30S WID=80.,LEN=66.,HFL=7; TERM T.L30P WID=80.,LEN=66.< TERM T.LA36 WID=132.,LEN=66. 6= TERM T.VT05 WID=72.,LEN=20.,HHT=1,VFL=1,SCP=1,CUP=1*> TERM T.VT50 WID=80.,LEN=12.,HHT=1,SCP=10? TERM T.VT52 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=20@ TERM T.VT55 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=20A TERM T.VT61 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=2%B TERM T.L180 WID=132.,LEN=66.,HFF=16C TERM T.V100 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=1%D TERM T.L120 WID=132.,LEN=66.,HFF=15+E TERM T.LA12 WID=132.,LEN=66.,HHT=1,HFF=1.+F TERM T.L100 WID=132.,LEN=66.,HHT=1,HFF=1.%G TERM T.LA34 WID=132.,LEN=66.,HFF=1T%H TERM T.LA38 WID=132.,LEN=66.,HFF=1S6I TERM T.V101 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=16J TERM T.V102 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=16K TERM T.V105 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=16L TERM T.V125 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=16M TERM T.V131 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=16N TERM T.V132 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=1O*P TERM T.LA50 WID=80.,LEN=66.,HHT=1,HFF=1+Q TERM T.LQP1 WID=132.,LEN=66.,HHT=1,HFF=1=+R TERM T.LQP2 WID=132.,LEN=66.,HHT=1,HFF=16S TERM T.BMP1 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=16T TERM T.V2XX WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=1+U TERM T.LN03 WID=132.,LEN=66.,HHT=1,HFF=1 V TERM T.DTC1 WID=132.,LEN=66.1+W TERM T.L210 WID=132.,LEN=66.,HHT=1,HFF=1H+X TERM T.LQP3 WID=132.,LEN=66.,HHT=1,HFF=1.5X TERM T.LA75 WID=80.,LEN=66.,HHT=1,HFF=1 ;RDH073.5X TERM T.L2XX WID=80.,LEN=66.,HHT=1,HFF=1 ;RDH087D+Z ETERM T.V100 ANI=1,DEC=1,AVO=1 ;**-11[ ETERM T.V101 ANI=1,DEC=1T'\ ETERM T.V102 ANI=1,DEC=1,AVO=1,EDT=1] ETERM T.V105 ANI=1,DEC=1.'^ ETERM T.V125 ANI=1,DEC=1,AVO=1,RGS=1W-_ ETERM T.V131 ANI=1,DEC=1,AVO=1,EDT=1,BLK=1 -` ETERM T.V132 ANI=1,DEC=1,AVO=1,EDT=1,BLK=1.'a ETERM T.BMP1 ANI=1,DEC=1,AVO=1,EDT=1D-b ETERM T.V2XX ANI=1,DEC=1,AVO=1,EDT=1,SFC=11cd .ENDC ;T$$GMC!T$$SMC!T$$CUPef;8g .EVENh;1i;1@j; TABLE OF POINTERS TO DISPATCH TABLES IN CONTROLLER-DEPENDENT6k; MODULES. INDEX = CONTROLLER TYPE CODED AS FOLLOWS: l; 0 = DL-11, m; 2 = DZ-11M n; 4 = DH-11E o; 6 = DJ-11p; 10 = DM-11BB,#q; 12 = CT VIDEO CONTROL TASKVr; 14 = DHV-11s; 16 = LAT Port)s; 20 = USER PORT STUB ;SA452Vt;Du>u .IIF DF R$$CON CTBL:: .IRP X, ;SA452w ;**-1,?w .IIF NDF R$$CON CTBL:: .IRP X, ;SA452Vy ;**-1 z .IF IDN X,LH { .IF DF T$$LTH|6} .IIF NDF R$$CON .ERROR ;LAT Support requires R$$CONP~ .IIF NDF T$$GMC .IIF NDF T$$SMC .ERROR ;LAT Support requires T$$GMC or T$$SMC .WORD $LHTBL € .PSECT CTBL#�$LHTBL:.WORD LHSTAX ;START OUTPUT ‚ .WORD LHABOX ;ABORT OUTPUTAƒ .WORD LHRESX ;RESUME OUTPUT„ .WORD LHSTOX ;STOP OUTPUT… .WORD LHMTIM ;MODEM TIMER$† .WORD LHCPUP ;CONTROLLER POWER-UP‡ .WORD LHUPUP ;UNIT POWER-UP"ˆ .WORD LHCONL ;CONTROLLER ONLINE#‰ .WORD LHCOFF ;CONTROLLER OFFLINE.Š .WORD LHUONL ;UNIT ONLINE‹ .WORD LHU00šÒ|‡|Ž{´cÚµcÛ¶c�·c›’OFF ;UNIT OFFLINE (Œ .WORD LHLPAR ;GET/SET LINE PARAMETERS� .PSECT MAP5Ž .IFF ; L$$LTH � .WORD 0� .ENDC ; L$$LTHS � .ENDC ; IDN X,LH ;SA452� ;SA452� .IF IDN X,US ;SA452L� .IF DF T$$USP ;SA452� ;SA452F� .IIF NDF R$$CON .ERROR ;USER SUPPLIED PORTS REQUIRES R$$CON ;SA452� .WORD $USTBL ;SA452� .PSECT CTBL ;SA4520�$USTBL: .WORD USSTAX ;START OUTPUT ;SA452)� .WORD USABOX ;ABORT OUTPUT ;SA452 *� .WORD USRESX ;RESUME OUTPUT ;SA452(� .WORD USSTOX ;STOP OUTPUT ;SA452(� .WORD USMTIM ;MODEM TIMER ;SA452/� .WORD USCPUP ;CONTROLLER POWER-UP ;SA4524*� .WORD USUPUP ;UNIT POWER-UP ;SA452-� .WORD USCONL ;CONTROLLER ONLINE ;SA452 .� .WORD USCOFF ;CONTROLLER OFFLINE ;SA452(� .WORD USUONL ;UNIT ONLINE ;SA452)� .WORD USUOFF ;UNIT OFFLINE ;SA452L2� .WORD USLPAR ;GET/SET LINE PARAMETERS ;SA452� ;SA452� .PSECT MAP5 ;SA452� .IFF ; T$$USP ;SA452 � .WORD 0 ;SA452D� .ENDC ; T$$USP ;SA452 � .ENDC ; IDN X,US ;SA452� ;SA452� .IF DIF X,LH ;SA452� .IF DIF X,US ;SA452� ;SA452’ .IF DF D$$'X'11 ;**-1“ .WORD $Y'X'TBL” .PSECT CTBL'•$Y'X'TBL:.WORD Y'X'STAX ;START OUTPUTU– .WORD Y'X'ABOX ;ABORT OUTPUT — .WORD Y'X'RESX ;RESUME OUTPUT˜ .WORD Y'X'STOX ;STOP OUTPUT™š .IF NDF R$$CON4›œ .WORD Y'X'PWUP ;POWER-UP �ž .IFTF ;NDF R$$CONŸ  .WORD Y'X'MTIM ;MODEM TIMER¡¢ .IFF ;NDF R$$CONC£&¤ .WORD Y'X'CPUP ;CONTROLLER POWER-UP ¥ .WORD Y'X'UPUP ;UNIT POWER-UP$¦ .WORD Y'X'CONL ;CONTROLLER ONLINE%§ .WORD Y'X'COFF ;CONTROLLER OFFLINE2¨ .WORD Y'X'UONL ;UNIT ONLINE© .WORD Y'X'UOFF ;UNIT OFFLINETª« .ENDC ;NDF R$$CON¬%­ .IF DF T$$GMC!T$$SMC!D$$M11!D$$ZMDT®*¯ .WORD Y'X'LPAR ;GET/SET LINE PARAMETERS°%± .ENDC ;T$$GMC!T$$SMC!D$$M11!D$$ZMDR²³ .PSECT MAP5´ .IFF µ .WORD 0¶ .ENDC ¶ .ENDC ; DIF X,US ;SA452 ¶ .ENDC ; DIF X,LH ;SA452¶ ;SA452¸; ;**-1¹ .ENDRº;»;DB¼; TABLE OF POINTERS TO FORK LEVEL ROUTINES. THE ORDER OF ENTRIESC½; IN THIS TABLE MUST MATCH THE BIT POSITIONS OF THE CORRESPONDING4¾; BITS IN THE FORK REQUEST BYTE U.TFRQ IN THE UCB.¿;+ÀFRKTB:: .WORD FPIRD ;FR.IRD - INPUT DONE%Á .WORD FPORD ;FR.ORD - OUTPUT DONEE4 .WORD FPSUI ;FR.SUI - START OF UNSOLICITED INPUTÃÄ .IF DF T$$CCAÅ3Æ .WORD FPAST ;FR.AST - CHARACTER THAT CAUSES ASTÇÈ .ENDC ;T$$CCAÉÊ .IF DF M$$PROË"Ì .WORD FPTIM ;FR.TIM - TIME-OUTÍÎ .ENDC ;M$$PROÏÐ .IF DF T$$SPCÑ1Ò .WORD FPKIL ;FR.KIL - SEND KILL PACKET TO CLIUÓÔ .ENDC ;T$$SPCÕ .IF DF T$$OOB9Ö .WORD FPOOB ;FR.OOB - CHECK FOR OUT-OF-BAND CHARACTERC× .ENDC ;T$$OOBØÙ .IF DF T$$ICS/Ú .WORD FPICS ;FR.ICS - SEND TSA EVENT PACKETDÛ .ENDC ;T$$ICSÜÝ .IF DF T$$SCA,Þ .WORD FPSCA ;FR.SCA - SEND AST TO TSA...ß .ENDC ; T$$SCA.à7á .WORD FPGRQ ;FR.GRQ - GET REQUEST PACKET FROM QUEUEâ .IF DF T$$LTH-ã .WORD FPLAT ;FR.LAT - LAT Port processingNä .ENDC ; T$$LTH.å1æ .WORD FPPFP ;FR.PFP - POST-FORK PROCESSING OFA#ç ;CHARACTER IN U.TECB (U.TECO)è;Dé;O&ê; I/O FUNCTION CODE DISPATCH TABLES.Jë; VERIFY THAT THE TABLE MATCHES THE NUMERIC VALUES OF I/O FUNCTION CODESì;Fí ASSUME IO.WLB/400,1î ASSUME IO.RLB/400,2ï ASSUME IO.ATT/400,3ð ASSUME IO.DET/400,4ñ ASSUME IO.GTS/400,5ò ASSUME SF.SMC/400,5ó ASSUME SF.GMC/400,5ô ASSUME IO.HNG/400,6õö .IF DF T$$RPR÷ø ASSUME IO.RPR/400,11 ùú .ENDCûü ASSUME IO.RTT/400,12ýþ .IF DF B$$MAPÿ+ ASSUME IO.WSD/400,13 ;WRITE SPECIAL DATAI* ASSUME IO.RSD/400,14 ;READ SPECIAL DATA .ENDC ;B$$MAP ;SA464 .IF DF T$$LTH ;SA464 ;SA464$ ASSUME IO.ORG/400,33 ;SA464 ;SA464 .ENDC ;T$$LTH ;SA464 ;SA464 .IF DF T$$EIO, ASSUME IO.EIO/400,37 ;EXTENDED READ/W00šÚ|«|š±|t÷tø tþfDATARITE  .ENDC ;T$$EIO  ;A ; DISPATCH TABLE FOR PROCESSING DIFFERENT FUNCTION CODES BEFOREA' ; ENTERING A PACKET IN THE I/O QUEUE.P; QPDSP::O .IF DF R$$IIC .WORD QPKIL ;IO.KILR .ENDC ;R$$IIC .WORD QPWLB ;IO.WLB .WORD QPRLB ;IO.RLBF .WORD QPATT ;IO.ATT .WORD QPDET ;IO.DETS .IF DF T$$GTS!T$$GMC!T$$SMC# .WORD QPSPC ;SPECIAL FUNCTIONS:S ; IO.GTS ; SF.SMC  ; SF.GMC!" .IFF # $ .WORD 0%& .ENDC'( .WORD QPHNG ;IO.HNG1) .WORD 0 ;RESERVED EXEC CLOSE-OUT-LUN FUNCTION /* .WORD 0 ;RESERVED FOR USER MODE DIAGNOSTICST+, .IF DF T$$RPR-. .WORD QPRPR ;IO.RPR/0 .IFFQ1 2 .WORD 034 .ENDC56 .WORD QPRTT ;IO.RTTI78 .IF DF B$$MAP9: .WORD QPWSD ;IO.WSDI; .WORD QPRSD ;IO.RSDI<= .ENDC ;B$$MAP>> .IF DF T$$LTH ;SRC@ ;**-1NA .IF NDF B$$MAPOB C .BLKW 2DE .ENDC ;NDF B$$MAPFF ;SRC-F .BLKW --1 ;SRCF ;SRCF .WORD QPORG ;SRCF ;SRCF .ENDC ;T$$LTH ;SRCF ;SRCF .IF DF T$$EIO ;SRCF ;SRCF .IF NDF T$$LTH ;SRC.F ;SRCF .IF NDF B$$MAP ;SRC F ;SRCF .BLKW 2 ;SRCF ;SRCF .ENDC ;NDF B$$MAP ;SRC.F ;SRC+F .BLKW - ;SRCOF ;SRCF .ENDC ;NDF T$$LTH ;SRC F ;SRC-F .BLKW --1 ;SRC "H .WORD QPEIO ;IO.EIO ;**-1IJ .ENDC ;T$$EIOKLM;$N; @O; DISPATCH TABLE FOR PROCESSING DIFFERENT FUNCTION CODES AFTER1P; A PACKET HAS BEEN DEQUEUED FROM THE I/O QUEUE Q;SR .IF DF T$$OVLSFT; NOTE: THE ROUTINES THAT ARE IN TTEXT ARE REPRESENTED WITH THE HIGHU; BIT CLEAR.V)WPPDSP:: .WORD !100000 ;IO.WLB!100000 ;IO.RLB!Y .WORD &77777 ;IO.ATTL!Z .WORD &77777 ;IO.DET[\ .IF DF T$$SMC]!^ .WORD &77777 ;SF.SMC _` .IFF;a b .WORD 0b ;SRCb .ENDC ;SRCTb ;SRC+f .WORD &77777 ;IO.HNG ;**-3A$g .WORD 0 ;RESERVED EXEC FUNCTION#h .WORD 0 ;USER MODE DIAGNOSTICS ij .IF DF T$$RPRk!l .WORD !100000 ;IO.RPR mn .IFF o p .WORD 0qr .ENDCs!t .WORD !100000 ;IO.RTTLuv .IF DF B$$MAPw!x .WORD !100000 ;IO.WSD.!y .WORD !100000 ;IO.RSDz{ .ENDC ;B$$MAP{ ;SRC{ .IF DF T$$LTH ;SRC{ ;SRC{ .IF NDF B$$MAP ;SRC { ;SRC{ .BLKW 2 ;SRC{ ;SRC{ .ENDC ;NDF B$$MAP ;SRCV{ ;SRC-{ .BLKW --1 ;SRCF{ ;SRC,{ .WORD &77777 ;ORIGINATE ;SRC{ ;SRC{ .ENDC ;T$$LTH ;SRC{ ;SRC{ .IF DF T$$EIO ;SRC{ ;SRC{ .IF NDF T$$LTH ;SRCP{ ;SRC{ .IF NDF B$$MAP ;SRC { ;SRC{ .BLKW 2 ;SRC{ ;SRC{ .ENDC ;NDF B$$MAP ;SRC{ ;SRC+{ .BLKW - ;SRC.{ ;SRC{ .ENDC ;NDF T$$LTH ;SRC.{ ;SRC-{ .BLKW --1 ;SRC.{ ;SRC*{ .WORD !100000 ;IO.EIO ;SRC{ ;SRC{ .ENDC ;T$$EIO ;SRC{ ;SRC{ .IF DF T$$LTH ;SRC{ ;SRC,{ .WORD &77777 ;ORIGINATE ;SRC{ ;SRC{ .ENDC ;T$$LTH ;SRC|} .IF DF T$$EIO~ .IF NDF B$$MAPM€ � .BLKW 2‚ƒ .ENDC ;NDF B$$MAP„$… .BLKW --1!† .WORD !100000 ;IO.EIO ‡ˆ .ENDC ;T$$EIO‰Š .IFF ;T$$OVLE‹ŒPPDSP:: .WORD PPWLB ;IO.WLB� .WORD PPRLB ;IO.RLB<Ž .WORD PPATT ;IO.ATT � .WORD PPDET ;IO.DET�‘ .IF DF T$$SMC’“ .WORD PPSPC ;SF.SMC.”• .IFF – — .WORD 0˜™ .ENDCš› .WORD PPHNG ;IO.HNGI00šâ|‡|Ž{´cÚµcÛ¶c�·c›’#œ .WORD 0 ;RESERVED EXEC FUNCTION."� .WORD 0 ;USER MODE DIAGNOSTICSžŸ .IF DF T$$RPR ¡ .WORD PPRPR ;IO.RPR¢£ .IFF;¤ ¥ .WORD 0¦§ .ENDC¨© .WORD PPRLB ;IO.RTTOª« .IF DF B$$MAP¬­ .WORD PPWSD ;IO.WSD® .WORD PPRSD ;IO.RSD¯° .ENDC ;B$$MAP±± .IF DF T$$LTH ;SRC± ;SRC± .IF NDF B$$MAP ;SRCEµ ;**-3$ ¶ .BLKW 2·· .ENDC ;B$$MAP ;SRC· ;SRC-· .BLKW --1 ;SRC· ;SRC#· .WORD PPORG ;ORIGINATE ;SRCO· ;SRC· .ENDC ;T$$LTH ;SRC· ;SRC· .IF DF T$$EIO ;SRC· ;SRC· .IF NDF T$$LTH ;SRC· ;SRC· .IF NDF B$$MAP ;SRC· ;SRC· .BLKW 2 ;SRC· ;SRC· .ENDC ;NDF B$$MAP ;SRCS· ;SRC+· .BLKW - ;SRCW· ;SRC· .ENDC ;T$$LTH ;SRC· ;SRC-· .BLKW --1 ;SRC · ;SRC"» .WORD PPEIO ;IO.EIO ;**-3¼½ .ENDC ;T$$EIO¾¿À .ENDC ;T$$OVLÁ;SÂ; LH port dispatch table:SÃ;Ä .IF DF T$$LTH)ÅLHDSP:: .WORD $LHSTS ; Start sessionS2Æ .WORD $LHINP ; Receive data from LAT process-Ç .WORD $LHOUT ; Send data to LAT process.!È .WORD $LHSTP ; Stop session .È .WORD $LHGTD ; GET TRANSMIT DATA ;SA464.È .WORD $LHTMO ; SOLICIT TIMED OUT ;SA464É .ENDC ;T$$LTHÊ;SË;2Ì; DISPATCH TABLE FOR INPUT CHARACTER PROCESSING.7Í; THIS TABLE IS CONSULTED EACH TIME ECHO DONE OCCURS.NBÎ; THE TABLE CONTAINS POINTERS TO ROUTINES IN THE MODULE "ICHAR".HÏ; INDEX = INPUT LOGIC STATE VARIABLE (U.TISV IN UCBX) MULTIPLIED BY 2.Ð;O,ÑISDSP:: .WORD CFGRQ ;NOTHING MORE TO ECHOÒÓ .IF DF T$$CTRÔÕSV.CR1==<.-ISDSP>/2)Ö .WORD I2CTR1 ;USED FOR CTRL-R ECHOING$)× .WORD I2CTR2 ;USED FOR CTRL-R ECHOINGOØÙ .IF DF R$$MPL!A$$CLIOÚ)Û .WORD I2CTR3 ;USED FOR CTRL-R ECHOINGIÜÝ .ENDCÞ)ß .WORD I2CTR4 ;USED FOR CTRL-R ECHOINGI)à .WORD I2CTR5 ;USED FOR CTRL-R ECHOINGáâ .ENDCãäSV.CU1==<.-ISDSP>/2 )å .WORD I2CTU1 ;USED FOR CTRL-U ECHOINGO)æ .WORD I2CTU2 ;USED FOR CTRL-U ECHOINGIçè .IF DF R$$MPL!A$$CLIRé)ê .WORD I2CTU3 ;USED FOR CTRL-U ECHOING$ëì .ENDCí)î .WORD I2CTU4 ;USED FOR CTRL-U ECHOINGCï; ð;N3ñ; DISPATCH TABLE FOR OUTPUT CHARACTER PROCESSING.Fò; THIS TABLE IS CONSULTED EACH TIME AN OUTPUT CHARACTER IS EXPANDED.Có; THE TABLE CONTAINS POINTERS TO ROUTINES IN THE MODULE "EXPCHR".D=ô; INDEX = BITS 8 AND 9 IN U.TSTA+2 IN UCBX MULTIPLIED BY 2.= õ; (BIT COMBINATION 11 UNUSED).ö;R$÷OSDSP:: .WORD EXPC0 ;DEFAULT CASE%ø .WORD EXPC1 ;USED FOR WRAP-AROUND$%ù .WORD EXPC2 ;USED FOR WRAP-AROUNDDú;Cû; üýþ .IF NDF T$$ONIÿ.; NOTE THIS DATA IS DUPLICATED IN TTATT !!!!; .IF DF T$$GMC!T$$SMCU;EB; TABLE OF CHARACTERISTIC CODES FOR GET MULTIPLE CHARACTERISTICSI; FUNCTION (SF.GMC) AND SET MULTIPLE CHARACTERISTICS FUNCTION (SF.SMC).L;P9; EACH RECOGNIZED CODE HAS A 1-WORD ENTRY IN THE TABLE.L, ; THIS WORD CONTAINS ONE OF THE FOLLOWING: ;* ; 1. IF THE WORD NOT = 0 AND BIT 15 = 0:= ; LOW BYTE = A BITMASK THAT MAPS THE DESIRED CHARACTERISTICP9 ; VALUE IN THE PROPER BYTE IN THE UCB. BITS ARE SET FORO"; RELEVANT BITS IN THE UCB BYTE.8; HIGH BYTE = OFFSET FROM START OF THE UCB TO THE BYTE-; THAT CONTAINS THE DESIRED CHARACTERISTIC.T;I; 2. IF BIT 15 = 1:C8; THE WORD IS THE ADDRESS OF A SUBROUTINE THAT HANDLES#; THIS PARTICULAR CHARACTERISTIC.W?; (ALL VIRTUAL ADDRESSES IN THE DRIVER ARE 120000 OR HIGHER).W;; 3. IF THE WHOLE WORD = 0:0>; THIS CHARACTERISTIC IS NOT RECOGNIZED BY SF.GMC OR SF.SMC.;A;S*; DEFINE MACRO TO GENERATE TABLE ENTRIES;T .MACRO MCGEN NAME,OFS,BMB .IF LE NAME-MCHI .=MCTAB+<2*>O  .IF NB BM! .IF LE BM-377" .BYTE BM,OFS # .IFFE$ .BYTE BM/400,OFS+1I% .ENDC& .IFF= ' .WORD OFS(00šê|«|š±|t÷tø tþfDATA .ENDC) .IFF !* .ERROR ;ILLEGAL CHARACTERISTICH+ .ENDC, .ENDM MCGEN-;6.MCHI == TC.MAX-1 ;HIGHEST RECOGNIZED CHARACTERISTIC/;)0MCTAB:: .REPT MCHI-1 .WORD 0 ;INITIALIZE WHOLE TABLE TO ZEROSN2 .ENDR,3 MCGEN TC.WID,U.CW4,377 ;NUMBER OF COLUMNS44 MCGEN TC.LPP,U.TLPP,377 ;NUMBER OF LINES PER PAGE56 .IF DF D$$H11!D$$Z11!D$$V117%8 MCGEN TC.RSP,MCRSP ;RECEIVE SPEED&9 MCGEN TC.XSP,MCXSP ;TRANSMIT SPEED6: MCGEN TC.PAR,MCPAR ;PARITY GENERATION AND CHECKING$; MCGEN TC.EPA,MCEPA ;PARITY SENSE8; MCGEN TC.CLN,MCCLN ;7-BIT CHARACTER LENGTH ; LK710<= .IF DF T$$MOD>$? MCGEN TC.ASP,MCASP ;ANSWER SPEED7@ MCGEN TC.ABD,U.TSTA+6,S4.ABD ;AUTO-BAUD SPEED DETECTTAB .ENDC ;T$$MODCD .ENDC ;D$$H11!D$$Z11!D$$V11E2F MCGEN TC.ISL,U.UNIT,377 ;SUB-LINE ON CONTROLLER%G MCGEN TC.TTP,MCTTP ;TERMINAL TYPE1#H MCGEN TC.SCP,U.CW2,U2.CRT ;SCOPE <I MCGEN TC.HFL,U.TSTA+6,S4.HFL ;HORIZONTAL FILL REQUIREMENT:J MCGEN TC.VFL,U.TSTA+6,S4.VFL ;VERTICAL FILL REQUIREMENT3K MCGEN TC.HFF,U.TSTA+6,S4.HFF ;HARDWARE FORM-FEEDR-L MCGEN TC.HHT,U.TSTA+6,S4.HHT ;HARDWARE TAB>M MCGEN TC.ACR,U.TSTA+4,S3.ACR ;AUTOMATIC CR-LF ON LONG LINES-N MCGEN TC.PPT,U.TSTA+4,S3.PPT ;PRINTER-PORT;5O MCGEN TC.SMR,U.CW2,U2.LWC ;LOWERCASE INPUT ENABLEDNPQ .IF DF T$$ESCR9S MCGEN TC.ESQ,U.CW2,U2.ESC ;ESCAPE SEQUENCES RECOGNIZEDTU .ENDC ;T$$ESCVW .IF DF T$$MODX$Y MCGEN TC.DLU,MCRMT ;DIAL-UP LINEZ[ .ENDC\.] MCGEN TC.HLD,U.CW2,U2.HLD ;HOLD-SCREEN MODE(^ MCGEN TC.NEC,U.TSTA+4,S3.NEC ;NO-ECHO-_ MCGEN TC.SLV,U.CW2,U2.SLV ;SLAVED TERMINALH1` MCGEN TC.PRI,U.CW2,U2.PRV ;PRIVILEGED TERMINALA,a MCGEN TC.FDX,U.TSTA+4,S3.FDX ;FULL DUPLEX=b MCGEN TC.PTH,U.TSTA+4,S3.PTH ;PASS-THROUGH MODE IS ENABLEDO%c MCGEN TC.BIN,MCBIN ;READ-PASS-ALL$@d MCGEN TC.8BC,U.TSTA+4,S3.8BC ;8 BIT CHARACTERS PASSED ON READ6e MCGEN TC.TBF,MCTBF ;TYPE-AHEAD BUFFER ACTIVE COUNT(f MCGEN TC.CTS,MCCTS ;CONTROL-S STATUS5g MCGEN TC.HSY,MCHSY ;HOST/TERMINAL SYNCHRONIZATIONE)h MCGEN TC.ANI,U.TSTA+6,S4.ANI ;ANSI CRT/i MCGEN TC.AVO,U.TSTA+6,S4.AVO ;ADVANCED VIDEO+j MCGEN TC.BLK,U.TSTA+6,S4.BLK ;BLOCK MODEA(k MCGEN TC.DEC,U.TSTA+6,S4.DEC ;DEC CRT*l MCGEN TC.EDT,U.TSTA+6,S4.EDT ;EDIT MODE&m MCGEN TC.RGS,U.TSTA+6,S4.RGS ;REGIS0n MCGEN TC.SFC,U.TSTA+6,S4.SFC ;SOFT CHARACTERSo;.p .IF DF R$$MPL!A$$CLISqr .IF DF C$$CTC7s MCGEN TC.TLC,U.TSTA+4,S3.CTC ;CONTROL-C NOTIFICATION.tu .ENDC ;C$$CTCv)w MCGEN TC.NBR,U.MUP,UM.NBR ;NOBROADCASTYxy .ENDC ;R$$MPL!A$$CLINz{ .IF DF T$$ACD|6} MCGEN TC.ACD,MCACD ;ANCILLARY CONTROL DRIVER (ACD)~ .ENDC ;T$$ACD€� .IF DF T$$SPL‚'ƒ MCGEN TC.RAT,MCTYP ;READ-AHEAD TYPEM-„ MCGEN TC.TBS,MCTBS ;TYPEAHEAD BUFFER SIZEN…† .IFF ;T$$SPLG‡0ˆ MCGEN TC.RAT,U.TSTA+4,S3.TAB ;READ-AHEAD TYPE‰Š .ENDC ;T$$SPL‹Œ .IF DF T$$SER�AŽ MCGEN TC.TBM,U.MUP,UM.SER ;TYPEAHEAD BUFFER MODE (TASK OR CLI).�� .ENDC ;T$$SER‘;’ .IF DF T$$OOB<“ MCGEN TC.OOB,MCOOB ;OUT-OF-BAND/HELLO/INCLUDE CHARACTERS” .ENDC ;T$$OOB•– .IF DF T$$ICS2— MCGEN TC.ICS,MCICS ;NOTIFY OF CHANGE IN TABUF˜ ;(INPUT COUNT STATE)™ .ENDC ;TT$ICSš› .IF DF T$$SCA1œ MCGEN TC.SSC,MCSSC ;SPECIFY SWITCH CHARACTERS5� MCGEN TC.TMM,MCTMM ;EXIT TERMINAL MANAGEMENT MODEAž .ENDC ;T$$SCA+Ÿ MCGEN TC.TSY,MCTSY ;OUTPUT FLOW CONTROL ¡(¢ .IF DF T$$MHU ;MODEM HANG-UP NOTIFY:£ MCGEN TC.MHU,MCMHU ;REQUEST MODEM HANG-UP NOTIFICATION¤ .ENDC ;T$$MHU¥$¥ .IF DF T$$LTH&M$$NET ;SA464¥ ;SA464E¥ MCGEN TC.QDP,MCQDP ;GET QUEUE DEPTH AND LAT CONNECT/DISCONN;SA464 4¥ MCGEN TC.MAP,MCMAP ;SET UP LAT MAPPING ;SA464¥ ;SA464$¥ .ENDC ;T$$LTH&M$$NET ;SA464¥ ;SA464¦"§ .=MCTAB+<2*MCHI> ;END OF TABLE¨;E©;Dª« .ENDC ;T$$GMC!T$$SMCN¬­ .ENDC ;NDF T$$ONI®;T¯;°± .IF DF T$$MOD²³;E7´; DISPATCH TABLE FOR MODEM INTERRUPT SERVICE ROUTINE.A6µ; INDEX = BITS 1 AND 2 IN U.STS (US.DSB AND US.CRW).00šò|‡|Ž{´cÚµcÛ¶c�·c›’¶;$7·MDSP:: .WORD MODI4 ;ENABLED, NOT WAITING FOR CARRIERD2¸ .WORD MODI2 ;DISABLED, NOT WAITING FOR CARRIER-¹ .WORD MODI5 ;ENABLED, WAITING FOR CARRIERS.º .WORD MODI3 ;DISABLED, WAITING FOR CARRIER»¼ .ENDC ;T$$MOD½; ¾;4¿; MISCELLANEOUS WORDS À; Á .IF DF D$$V11!D$$H11.Ã4ÄYVXOFF::.WORD CH.CTS!100000 ;XOFF FOR DHU/DHV11/DH3ÅYVXON:: .WORD CH.CTQ!100000 ;XON FOR DHU/DHV11/DHFÆÇ .ENDC ;D$$V11!D$$H11UÈÉ .IF NDF T$$SPLSÊ3Ë$DALED::.BLKW 1 ;SAVED DRIVER MAPPING FOR KISAR6OÌÍ .ENDC ;NDF T$$SPLÎÏ .IF DF T$$OVLÐÑ .PSECT MAP6Ò>ÓEXTMAP:: .BLKW 1 ;APR5 MAPPING OF TTDRV EXTENSION (OVERLAY)/ÔROTMAP:: .BLKW 1 ;APR5 MAPPING OF TTDRV ROOTC:ÕTTEXT: .RAD50 /TTEXT / ;NAME OF COMMON TO MAP AS OVERLAYÖ× .PSECT MAP5ØÙ .ENDC ;T$$OVLÚ(ÛFREEB:: .WORD 0 ;FREE BUFFER LISTHEAD4ÜDCB0:: .BLKW 1 ;POINTER TO DCB FOR FIRST TERMINAL'Ý ;SET UP BY INITIALIZATION ROUTINEU0ÞOPTIMR::.WORD OPTIME ;OUTPUT TIMEOUT INTERVALß; à;Ráâ .IF DF D$$H11!D$$V11.ãä .IF DF M$$EXTåAæ; SAVED SETTINGS FOR UMR(S) TO MAP DRIVER WITH 18-BIT ADDRESSESP!ç; IDENTICAL TO 16 BIT ADDRESSESè;PéUMR5S:: .BLKW 2 ;UMR 5Fêë .IF NDF T$$SPL.ìí .BLKW 2 ;UMR 6îï .ENDC ;NDF T$$SPLðñ .IFF ;M$$EXTòó .IF DF D$$H11ôHõ; RELOCATION CONSTANT TO TRANSFORM A VIRTUAL ADDRESS WITHIN THE DRIVERCö; TO A PHYSICAL ADDRESS. THIS RELOCATION IS REQUIRED ONLY FOR DMARG÷; CONTROLLERS (SUCH AS THE DH-11), AND ONLY IF EXTENDED MEMORY IS NOT1Fø; PRESENT. THE FORMAT OF THE DOUBLE-WORD RELOCATION CONSTANT IS SUCHIù; THAT WHEN IT IS ADDED TO A VIRTUAL ADDRESS IN THE RANGE 120000-157777Cú; (CARRY IS ADDED TO BIT 4 OF THE HIGH ORDER WORD), THE RESULT ISRCû; THE 18-BIT PHYSICAL ADDRESS (2 HIGH BITS IN BITS 4-5 OF RELC+0,Hü; 16 LOW BITS IN RELC+2).Ný;TIþ; THE RELOCATION CONSTANT IS CALCULATED AND STORED HERE BY THE POWER-UPI ÿ; CODE.N;EJ; IF EXTENDED MEMORY IS PRESENT, THE POWER-UP CODE HAS MAPPED THE DRIVERC; IN UMR'S 5 AND 6, WHICH MEANS THAT DRIVER VIRTUAL ADDRESSES ARET(; IDENTICAL WITH THE 18-BIT ADDRESSES.; RELC:: .BLKW 2 .ENDC ;D$$H11  .ENDC ;M$$EXT   .ENDC ;D$$H11!D$$V11O   .IF DF D$$V11N; DHV11 RELOCATION CONSTANT TO TRANSFORM A VIRTUAL ADDRESS WITHIN THE DRIVERM; TO A PHYSICAL ADDRESS. THE FORMAT OF THE DOUBLE-WORD RELOCATION CONSTANTDQ; IS SUCH THAT WHEN IT IS ADDED TO A VIRTUAL ADDRESS IN THE RANGE 120000-157777W5; THE RESULT IS THE 18-BIT/22-BIT PHYSICAL ADDRESS. ; RELCV:: .BLKW 2I .IF DF K$$DAS8 .BLKW 2 ;ANOTHER CONSTANT TO MAP D-SPACE POOL REGION .ENDC ;K$$DAS .ENDC ;D$$V11 .IF DF T$$CUPH ; TABLE OF POINTERS TO ROUTINES TO EXPAND A CURSOR POSITIONING COMMAND>!; INTO A CHARACTER STRING APPROPRIATE FOR THE TERMINAL TYPE.I"; INDEX INTO THIS TABLE = 2*X-2, WHERE X = THE VALUE IN BITS 6-7 OF THEE4#; TABLE "TTYP1" (SEE ABOVE) FOR THE TERMINAL TYPE.$;7&%CPOST:: .WORD CPOS1 ;1 - VT05 STYLE& .WORD CPOS2 ;2 - VT52 STYLE: ' .WORD CPOS3 ;3 - VT100 STYLE(;);WJ*; NOTE - THE LOCATIONS EXPCP, CP0, CP1, CP2 AND CP3 BELOW ARE READ/WRITE+; LOCATIONS!B,; THIS IS SAFE SINCE THEY ARE ONLY USED BY THE SYSTEM STATE CODE5-; IN MODULE "TTRW" - NEVER BY INTERRUPT LEVEL CODE.S.; E/; POINTER TO ROUTINE TO EXPAND 1 CHARACTER ON OUTPUT, OR TO ROUTINEW,0; THAT EXPANDS CURSOR POSITIONING COMMAND.1;T2EXPCP:: .WORD EXPC3H3;M94; TERMINAL-DEPENDENT CURSOR POSITIONING COMMAND STRINGS5;D46; TYPE 2 - VT52. MUST BE LOCATED ON WORD BOUNDARY!7;!8CP2:: .BYTE CH.ESC,'H,CH.ESC,'JS9 .BYTE CH.ESC,'Y,0,0:; ;; TYPE 1 - VT05E<; 5=CP1:: .BYTE 35,0,0,0,0 ;4 FILLERS AFTER HOME CURSORY1> .BYTE 37,0,0,0,0 ;4 FILLERS AFTER ERASE-TO-EOSR5? .BYTE 16,0,0,0,0,0,0 ;4 FILLERS AFTER Y-COORDINATEE@;XA; TYPE 3 - VT100B;TCCP3:: .BYTE CH.ESC,'[,'2,'JN!D .BYTE CH.ESC,'[,0,0,0,';,0,0,0TECP3A:: .BYTE 'HXF .EVENGH .ENDC ;T$$CUPIJ .IF DF D$$M11&R00šú|«|š±|t÷tø tþfDATA$$MPL&T$$COMK%LYMCP1:: .BLKW 1 ;POINTER TO $YMCTBDMN .ENDC ;D$$M11&R$$MPL&T$$COMOP .IF NDF R$$MPLSQRS;."T;TABLE OF POINTERS TO UCB TABLESU; VTTUCB:: .IRP X,W .IF DF D$$'X'11X .WORD D'X'UCBY .IFFF Z .WORD 0[ .ENDC\ .ENDR]^;,_; DL-11 DATABASESA`;Yab .IF DF D$$L11c0dDLUCB:: ;DL UCB POINTER TABLE POINTER TABLEeN=0Yf .REPT D$$L110g .WORD DLUC0+NhN=N+4'i .ENDR)jDLUC0: .BLKW D$$L11*2 ;DL UCB/CSR TABLEMkl .ENDC ; DF D$$L11mn;Ko; DH-11 DATABASESTp;q .IF DF D$$H11r-sDMUCB:: ;POINT DM11-BB UCB'S TO DH UCB'S.0tDHUCB:: ;DH UCB POINTER TABLE POINTER TABLEuN=0Pv .REPT D$$H11>wx .IF DF D$$M11y-z .WORD DHUC0+N+2 ;POINTER TO DH11 UCB TABLE {N=N+38.|} .IFF1~, .WORD DHUC0+N ;POINTER TO DH11 UCB TABLE €N=N+36.L�‚ .IFTFƒ„ .ENDR…†DHUC0: ;DH UCB TABLES‡ .REPT D$$H11ˆ‰ .IFT.Š ‹ .BLKW 1 ;DM11-BB CSR ADDRESSŒ� .ENDCŽ� .BLKW 1 ;DH11 CSR ADDRESS � .REPT 16.4‘ .WORD 0 ;ADDR OF UCB FOR LINE (PLUGGED AT TTPWF)’ .ENDR“ .WORD -1 ;END OF UCB LIST;” .ENDR•– .ENDC ; DF D$$H11—˜;™; DZ-11 DATABASESš;D›œ .IF DF D$$Z11�0žDZUCB:: ;DZ UCB POINTER TABLE POINTER TABLEŸN=0F  .REPT D$$Z11D¡8¢ .WORD DZUC0+N ;POINTER TO DZ11 UCB TABLE (INDEXED BY£ ; CONTROLLER NUMBER) ¤N=N+20.A¥ .ENDR¦§DZUC0: ;REF LABEL¨© .REPT D$$Z11-ª .BLKW 1 ;DZ CSR ADDRESS « .REPT 8.1&¬ .WORD 0 ;UCB ADDRESS FOR EACH LINE­ .ENDR® .WORD -1 ;END OF UCB LIST ¯ .ENDR°± .ENDC ; DF D$$Z11²³;S´; DJ-11 DATABASES.µ;;¶· .IF DF D$$J11¸0¹DJUCB:: ;DJ UCB POINTER TABLE POINTER TABLEºN=0:»¼ .REPT D$$J11T,½ .WORD DJUC0+N ;POINTER TO DJ11 UCB TABLE ¾N=N+36.D¿ .ENDRÀÁDJUC0: ;REF LABELÂà .REPT D$$J11OÄ .BLKW 1 ;DJ CSR ADDRESS Å .REPT 16."Æ .WORD 0 ;ADDRESS OF LINE'S UCBÇ .ENDRÈ .WORD -1 ;END OF UCB LISTÉ .ENDRÊË .ENDC ; DF D$$J11ÌÍ; Î; DHV-11 DATABASESÏ; ÐÑ .IF DF D$$V11ÒÓDVUCB:: ;REF LABELZÔN=0Õ .REPT D$$V11A-Ö .WORD DVUC0+N ;POINTER TO DHV11 UCB TABLEC ×N=N+36.UØ .ENDRÙÚDVUC0: ;REF LABELÛÜ .REPT D$$V11TÝ .BLKW 1 ;DHV CSR ADDRESS Þ .REPT 16.&ß .WORD 0 ;UCB ADDRESS FOR EACH LINEà .ENDRá .WORD -1 ;END OF UCB LISTLâ .ENDRãä .ENDC ; DF D$$V11åæ .ENDC ;NDF R$$MPLç.PAGEBèé .IF DF B$$MAPêë;F$ì; CT VIDEO TASK INTERFACE DATABASEí;Jî(ïTFWPAR::.RAD50 /TFWCOM/ ;TFWCOM'S NAME,ðVT.NAM::.RAD50 /TFW.../ ;VIDEO TASK'S NAME/ñDTYPE:: .BLKW 1 ;TEMPORARY DATA TYPE STORAGEI:òCTEX:: .RAD50 /C$CTEX/ ;TASK NAME OF THE CTEX DISPATCHER)óIDOFLG::.WORD 0 ;FLAG FOR INTERRUPT-DOL(ôSTIMER::.WORD 1 ;SCREEN TIMER COUNTERõö;UL÷; THIS IS THE TABLE OF ADDRESSES FOR THE SPECIAL DATA "TYPEAHEAD" BUFFERS.ø;Mù; BECAUSE OF THE WAY THAT THIS IS BEING DONE THERE CAN ONLY BE ONE TERMINALIú; THAT SUPPORTS IO.RSD. FOR THE PRO ENVIRONMENT THIS IS NOT A PROBLEM.Fû; ü@ýT.RSDT::.WORD 0 ;THIS IS NOT A SUPPORTED DATA TYPE FOR IO.RSD&þ .WORD GIDIS ;BUFFER FOR GIDIS DATA>ÿT.RSDN==<<.-T.RSDT>/2>-1 ;HIGHEST LEGAL DATA TYPE FOR IO.RSD;W#; TYPEAHEAD BUFFER FOR GIDIS DATAM;W$GIDIS: .BYTE 0 ;INSERTION POINTER .BYTE 0 ;RETRIEVAL POINTER .BYTE 0 ;ACTIVE COUNTA  .BYTE T$$BFL-4 ;BUFFER LENGTH  .BLKB T$$BFL-4 ;DATAE J ; THIS PSECT IS USED TO FORCE ALIGNMENT OF TFWCOM ON A 32 WORD BOUNDARY.G ; IT WILL COLLATE BEFORE $$$$$$ AND ITS SIZE IS SET IN THE BUILD FILEI  .PSECT $$$$$A6; THIS PSECT IS USED TO DEFINE THE LENGTH OF TFWCOM. ; IT WILL COLLATE AFTER $$$$$$ .PSECT $$$$$.%TFWEND == . ;ADDRESS END OF TFWCOMD .ENDC ;B$$MAP .PSECT $$$$$$,OVR .IF DF B$$MAP-TFWCOM:: ;THIS IS THE START OF THE TFWCOM.$ ;A PARTITION WILL OVERMAP THIS' ;SECTION OF DATA. THAT PARTITIONS,  ;IS USED BY TFW.00š}‡|Ž{´cÚµcÛ¶c�·c›’.. TO GET AT THIS DATA!9"VT.ADR::.WORD TFWCOM ;THE VIRTUAL ADDRESS OF THE START (# ;OF TFWCOM FROM THE DRIVER'S POINT$ ;OF VIEW2%VT.APR::.BLKW 1 ;THE PHYSICAL ADDRESS OF TFWCOMN&VT.LEN::.WORD </64.> ;LENGTH OF THE COMMON IN 32. WORD BLOCKS,'VT.TCB::.BLKW 1 ;VIDEO TASK'S TCB ADDRESS,(T.FLAG::.WORD 0 ;FLAG WORD FOR VIDEO TASK)*;H+; FLAG WORD BIT DEFINITIONS,; -.TF.INT == 1 ;INIT VIDEO TASK $/TF.ABO == 2 ;ABORT CURRENT OUTPUT&0TF.SPN == 4 ;SUSPEND CURRENT OUTPUT1TF.BTM == 10 ;BLINK TIMEOUT2TF.CTM == 20 ;CURSOR TIMEOUT %3TF.STM == 40 ;SCREEN BLANK TIMEOUTI.4TF.PRT == 400 ;PRINT SCREEN FLAG FOR TFW...15TF.SON == 1000 ;TURN SCREEN ON FLAG FOR TFW...W6'7CT$TIC == 1 ;TICK COUNT FOR CT TIMERL@8I$MAX == T$$BFL-4 ;MAXIMUM NUMBER OF CHARS IN THE INPUT BUFFER9:;G=;; INTERNAL BUFFER FORMAT - ALSO USED FOR TFW OUTPUT BUFFERS<;='>OB.LNK == 0 ;LINK TO THE NEXT BUFFERO ?OB.LEN == 2 ;DATA LENGTH (=N)>@OB.TYP == 3 ;DATA TYPE (SEE THE DATA PATH SPECIFIER VALUES)AOB.DAT == 4 ;DATA (N BYTES)BC;F"D; INPUT BUFFER FORMAT (FROM TFW)E;PF>GIB.TYP == 0 ;DATA TYPE (SEE THE DATA PATH SPECIFIER VALUES) HIB.LEN == 1 ;DATA LENGTH (=N))IIB.SPI == 2 ;TYPE SPECIFIC INFORMATIONAJIB.DAT == 4 ;DATA (N BYTES)KL; M; MORE INTERFACE DATA FOR TFWNN;LOPT.BTMR::.WORD 0 ;BLINK TIMERT QT.CTMR::.WORD 0 ;CURSOR TIMER&RT.STMR::.WORD 0 ;SCREEN BLANK TIMER&ST.OPKP::.WORD 0 ;OUTPUT BUFFER LIST.TT.OREM::.WORD 0 ;COUNT OF OUTPUT CHARACTERSBUT.OPKC::.WORD 0 ;COUNT OF BYTES PROCESSED IN CURRENT OUTPUT PKTVW;)X; INPUT BUFFER (FROM TFW)AY;PZ"[T.INBF::.BYTE 0 ;DATA STREAM ID\ .BYTE 0 ;DATA COUNTT&] .WORD 0 ;TYPE SPECIFIC INFORMATION&^ .BLKW I$MAX/2 ;THEN COMES THE DATA_`;(a; INTERMEDIATE INPUT AND OUTPUT BUFFERb;c; BYTE CONTENTSI/d; ------------------------------------:Be; 0-1 LINK TO NEXT BUFFER (0 IF THIS IS LAST)0f; 2 LOGICAL BUFFER LENGTH$g; 3 DATA TYPEh; 4-47 DATAi;Ej; THE FOLLOWING BUFFER IS USED WHEN THE OUTPUT BUFFER IS NOT IN THE Ek; NORMAL BUFFER CHAIN FORMAT. THIS OCCURS WHEN ECHOING IS DONE AND@l; WHEN THE TERMINAL DRIVER PUTS SOMETHING SPECIAL OUT, SUCH ASm; PROMPT STRINGS.Rn;o4pT.TBUF::.WORD 0 ;ZERO LINK WORD - ONLY ONE BUFFERq .BLKB 1 ;BUFFER LENGTHr .BYTE 0 ;DATA TYPE 0 = TEXT s .BLKB T$$BFL-4 ;DATA)tu; Av; DEFINE OFFSETS FOR THE LOCATIONS IN TFWCOM FOR THE VIDEO TASK w; x;yVT$ADR == VT.ADR-TFWCOM ;THE VIRTUAL ADDRESS OF THE STARTU(z ;OF TFWCOM FROM THE DRIVER'S POINT{ ;OF VIEW9|VT$APR == VT.APR-TFWCOM ;THE PHYSICAL ADDRESS OF TFWCOM B}VT$LEN == VT.LEN-TFWCOM ;LENGTH OF THE COMMON IN 32. WORD BLOCKS3~T$FTCB == VT.TCB-TFWCOM ;VIDEO TASK'S TCB ADDRESS 3T$FLAG == T.FLAG-TFWCOM ;FLAG WORD FOR VIDEO TASKE&€T$BTMR == T.BTMR-TFWCOM ;BLINK TIMER'�T$CTMR == T.CTMR-TFWCOM ;CURSOR TIMER-‚T$STMR == T.STMR-TFWCOM ;SCREEN BLANK TIMERR-ƒT$OPKP == T.OPKP-TFWCOM ;OUTPUT BUFFER LISTT5„T$OREM == T.OREM-TFWCOM ;COUNT OF OUTPUT CHARACTERSCI…T$OPKC == T.OPKC-TFWCOM ;COUNT OF BYTES PROCESSED IN CURRENT OUTPUT PKTP0†T$INBF == T.INBF-TFWCOM ;CIRCULAR INPUT BUFFER‡ˆ .ENDC ;B$$MAP‰Š.PAGER‹;+"Œ; DRIVER INITIALIZATION ROUTINE.�;'5Ž; THIS CODE IS EXECUTED ONCE ONLY AT THE FIRST CALLR+�; TO THE DRIVER AFTER IT HAS BEEN LOADED.K%�; IT SERVES THE FOLLOWING PURPOSES:O4‘; 1. ESTABLISH THE MAPPING OF THE DRIVER DATA AREA<’; AND SAVE THE APR VALUES IN SAVE LOCATIONS SO THEY CAN7“; BE QUICKLY LOADED WHENEVER THE DRIVER IS CALLED. ;”; 2. SAVE KINAR5 IN THE TT-DRIVER FORK BLOCK (FORK BLOCKSP#•; IF MULTI-PROCESSOR SYSTEM). 8–; 3. CALCULATE AND SAVE UMR'S 5 AND 6 VALUES (IF DH-11&—; AND EXTENDED MEMORY SUPPORTED).?˜; 4. CALCULATE AND SAVE A CONSTANT USED TO TRANSFORM A DRIVERE<™; VIRTUAL ADDRESS INTO A PHYSICAL ADDRESS (IF DH-11 BUT&š00š }«|š±|t÷tø tþfDATA; NOT EXTENDED MEMORY SUPPORTED).6›; 5. INITIALIZE AND QUEUE THE TT-DRIVER CLOCK BLOCK.8œ; 6. SAVE A POINTER TO THE FIRST TT DCB IN THE SYSTEM.G�; 7. CONSTRUCT THE LIST OF FREE BUFFERS IN THE TT-DRIVER BUFFER POOL.Kž;KAŸ; IN A SYSTEM THAT SUPPORTS SEPARATE KERNEL DATA SPACE MAPPING,A4 ; THIS MODULE RESIDES IN THE COMMON BLOCK "TTCOM".;¡; WHEN "INIT" IS CALLED IN SUCH A SYSTEM, THE MAPPING IS:S#¢; INSTR. SPACE APR 5: DRIVER CODE >£; INSTR. SPACE APR 6: DRIVER DATA AND INITIALIZATION ROUTINE¤; (FIRST 4 KW OF TTCOM)!¥; DATA SPACE APR 5: DRIVER CODE ¦; DATA SPACE APR 6: UNDEFINEDVF§; ON RETURN FROM "INIT", THE MAPPING IS THE "NORMAL" DRIVER MAPPING, ¨; WHICH IS:R+©; INSTR. SPACE APR 5: DRIVER CODE (TTDRV)N+ª; DATA SPACE APR 5-6: DRIVER DATA (TTCOM)S«;MI¬; IN A SYSTEM THAT DOES NOT SUPPORT SEPARATE KERNEL DATA SPACE MAPPING,NI­; THIS MODULE RESIDES TOGETHER WITH ALL OTHER CODE AND DATA IN "TTDRV".RC®; THE COMMON BLOCK "TTCOM" DOES NOT EXIST. IN SUCH A SYSTEM, WHENU%¯; "INIT" IS CALLED, THE MAPPING IS: ,°; INSTR. AND DATA SPACE APR 5: DRIVER CODED±; ON RETURN, THE MAPPING IS THE "NORMAL" DRIVER MAPPING, WHICH IS:6²; INSTR. SPACE APR 5-6: DRIVER CODE AND DATA (TTDRV)³; J´; FROM THE DESCRIPTION ABOVE, IT FOLLOWS THAT THE INITIALIZATION ROUTINEHµ; MAY BE MAPPED EITHER IN APR 5 (NON-D-SPACE SYSTEM) OR APR 6 (D-SPACEM¶; SYSTEM) WHEN CALLED. IT MUST THEREFORE BE WRITTEN IN POSITION-INDEPENDENT ·; CODE (PIC)."¸;-¹; º;X»2¼TTPOOL::.BLKW 1 ;START OF DRIVER'S PRIVATE POOL½;NB¾; NOTE - THE ROUTINE BELOW MUST FIT INTO ONE FIXED LENGTH BUFFER9¿; (LENGTH = T$$BFL BYTES), OR IT WILL OVERWRITE ITSELF. FÀ; NOTE ALSO THAT THE ROUTINE MUST MAP ITSELF IN BOTH I- AND D-SPACE.Á;P Â; INPUT:Ã; R0 START OF DRIVER POOLA4Ä; R1 POINTER T$$BFL BYTES BELOW END OF DRIVER POOLÅ;E3ÆCPOOL: MOV R0,R2 ;COPY POINTER TO CURRENT BUFFERI'Ç ADD #T$$BFL,R0 ;POINT TO NEXT BUFFERNÈ MOV R0,@R2 ;LINK NEW TO OLD--É CMP R0,#160000-T$$BFL ;WITHIN 4K BOUNDARY?DÊ BHIS 10$ ;N - STOP HEREË CMP R0,R1 ;END OF POOL?SÌ BLO CPOOL ;N - LOOPT1Í10$: CLR @R2 ;Y - CLEAR POINTER IN LAST BUFFERVÎ RETURN ;ALL DONEO$Ï .IIF GT .-, .ERRORÐ; Ñ;IÒINIT::ÓÔ .IF DF R$$PROÕ.Ö MOV #60,R0 ;MOVE THE DL INTERRUPT VECTORS,× MOV #220,R1 ;TO THE PRINTER PORT VECTOR3Ø MOV (R0)+,(R1)+ ;LOCATIONS. THIS IS BEING DONED:Ù MOV (R0)+,(R1)+ ;BECAUSE THE PRINTER PORT IS NOW USED.1Ú MOV (R0)+,(R1)+ ;THE DL VECTOR IS USED ON THEA!Û MOV (R0),(R1) ;BRIDGE SYSTEM.ÜÝ .ENDC ;R$$PROÞ,ß MOV @#KINAR5,R0 ;GET START OF DRIVER CODEàá .IF DF M$$PROâ&ã MOV #M$$PRO,R2 ;GET NUMBER OF CPU'S2ä MOV #$TTFB+10,R1 ;GET POINTER TO KINAR6 WORD INå ;FORK BLOCK FOR CPU 0-æ20$: MOV R0,@R1 ;SAVE KINAR5 IN FORK BLOCK*ç ADD #TT$UQL,R1 ;POINT TO NEXT UCB QUEUEè SOB R2,20$ ;LOOPéê .IFF ;M$$PROIë/ì MOV R0,@#$TTFB+10 ;SAVE KINAR5 IN FORK BLOCKRíî .ENDC ;M$$PROïð .IF DF T$$COMñ-ò MOV @#$TTCOM,-(SP) ;SAVE TTCOM PCB ADDRESSY4ó CLR @#$TTCOM ;INDICATE DRIVER INITIALIZATION DONEôõ .IF DF D$$M11ö)÷ MOV @#YMCTBP,R1 ;GET POINTER TO $YMCTB øù .IFTF ;D$$M11ú,û MOV @#KINAR6,R0 ;GET START OF DRIVER DATAüý .IF DF T$$SPLþ6ÿ MOV R0,@#KDSAR6 ;MAP TTCOM THROUGH DATA SPACE APR 6  MOV R0,@#$DALED ;SAVE MAPPING .IFF ;T$$SPL  MOV R0,@#PAR5S ;SAVE A COPY# MOV R0,@#KDSAR5 ;MAP DRIVER DATAR .ENDC ;T$$SPL1  MOV @#KINAR5,@#PAR6I ;GET START OF DRIVER CODEP5  ADD #200,@#PAR6I ;COMPUTE AND SAVE HIGH 4K MAPPINGR   .IFT ;D$$M11O ) MOV R1,@#YMCP1 ;SAVE POINTER TO $YMCTB1 .ENDC ;D$$M11 .ENDC ;T$$COM- MOV R0,R1 ;COPY REAL START OF DRIVER DATAA .IF NDF T$$SPL0 ADD #200,R0 ;ADD THE EQUIVALENT OF 4 K WORDS& MOV R0,@#KISAR6 ;MAP REST OF DRIVER& MOV R0,@#$DALED ;SAVE DRIVER KISAR6 .IF DF D$$M11&R$$MPL&T$$ONI5 MOV YMCTBP,YMC12 ;MOVE A COPY TO APR6 FOR OVERLAYR  .ENDC ;D$$M11&R$$MP00š}‡|Ž{´cÚµcÛ¶c�·c›’L&T$$ONI!"# .ENDC ;NDF T$$SPL$%& .IF DF T$$OVL'6( MOV KINAR5,ROTMAP ;SET UP POINTER TO MAIN APR5 CODE)) MOV #TTEXT,R3 ;POINT TO RAD50 OF TTEXTN)* CALL $SRNAM ;GET ADDRESS OF PARTITIONA+ BCC 25$ ;CC - GOT IT!, CRASH ;NO GOOD IF NOT LOADED06-25$: MOV P.REL(R2),EXTMAP ;SET UP POINTER TO OVERLAY./ .IF NDF T$$SPLM0!1 MOV KISAR5,-(SP) ;SAVE MAPPING)2 MOV P.REL(R2),KISAR5 ;MAP TO EXTENSIONY13 MOV KISAR6,@#120000 ;SAVE MAPPING TO APR6 CODE$4 MOV (SP)+,KISAR5 ;RESTORE MAPPING56 .ENDC ;NDF T$$SPL78 .ENDC ;T$$OVL9: .IF DF D$$H11!D$$V11E;<;T;=; CALCULATE MAPPING INFORMATION NECESSARY FOR DMA DEVICESX>;?@ .IF DF D$$V11AB;APC; CALCULATE AND SAVE THE DOUBLE-WORD RELOCATION CONSTANT TO TRANSFORM A DRIVERJD; VIRTUAL ADDRESS INTO AN 18-BIT/22-BIT ADDRESS FOR THE DHV11. A SECONDNE; RELOCATION CONSTANT IS NECESSARY FOR I/D-SPACE SYSTEMS SINCE BUFFERS WHICHOF; ARE IN PRIMARY POOL DON'T HAVE A VIRTUAL ADDRESS WHICH MATCHES THE PHYSICALPG; ADDRESS IN THOSE SYSTEMS.H;IJ .IF DF M$$EXT!D$$H11 K3L MOV R1,-(SP) ;SAVE START APR BIAS OF DRIVER DATAOMN .IFTF ;M$$EXT!D$$H11OP .IF DF R$$EISQ&R CLR R0 ;PREPARE FOR COMBINED SHIFT'S ASHC #6,R0 ;GET PHYS. START ADDRESSRTU .IFF ;R$$EISAV0W SWAB R1 ;USE NON-EIS EMULATION OF ASHC #6,R0X MOVB R1,R0 ;Y BIC #377,R1 ;S Z ROR R0 ; [ ROR R1 ; \ ROR R0 ; ] ROR R1 ;^_ .ENDC ;R$$EIS`a .IF DF K$$DASb6c SUB #140000,R1 ;SUBTRACT TTCOM BASE VIRTUAL ADDRESSde .IFF ;K$$DAS.f7g SUB #120000,R1 ;SUBTRACT DRIVER BASE VIRTUAL ADDRESSShi .IFTF ;K$$DASjk SBC R0 ;TAKE CARE OF CARRY8l BIC #^C<77>,R0 ;MAKE SURE ONLY 6 BITS MAXIMUM ARE SET%m MOV R0,@#RELCV ;SAVE HIGH 2/6 BITS<n MOV R1,@#RELCV+2 ;SAVE LOW 16 BITS OF RELOCATION CONSTANTop .IFT ;K$$DAS qBr MOV @#KDSAR1,R1 ;GET START APR BIAS OF POOL IN I/D-SPACE SYSTEM&s CLR R0 ;PREPARE FOR COMBINED SHIFT>t ASHC #6,R0 ;GET PHYS. START ADDRESS (I/D SYS REQUIRES EIS)4u SUB #20000,R1 ;SUBTRACT POOL BASE VIRTUAL ADDRESSv SBC R0 ;TAKE CARE OF CARRY8w BIC #^C<77>,R0 ;MAKE SURE ONLY 6 BITS MAXIMUM ARE SET#x MOV R0,@#RELCV+4 ;SAVE HIGH BITSU"y MOV R1,@#RELCV+6 ;SAVE LOW BITSz{ .ENDC ;K$$DAS|} .IFT ;M$$EXT!D$$H11~6 MOV (SP)+,R1 ;RESTORE START APR BIAS OF DRIVER DATA€� .ENDC ;M$$EXT!D$$H11,‚ƒ .ENDC ;D$$V11„… .IF DF M$$EXT†‡;Jˆ; CALCULATE AND SAVE THE UMR VALUE(S) TO MAP ALL OF THE DRIVER DATA AREA‰;DŠ‹ .IF DF R$$EISŒ(� CLR R0 ;PREPARE FOR ASHC INSTRUCTION'Ž ASHC #6,R0 ;GET PHYS. START ADDRESSB�� .IFF ;R$$EISU‘0’ SWAB R1 ;USE NON-EIS EMULATION OF ASHC #6,R0“ MOVB R1,R0 ;” BIC #377,R1 ;S • ROR R0 ; – ROR R1 ; — ROR R0 ; ˜ ROR R1 ;™š .ENDC ;R$$EIS›&œ MOV #UMR5S,R2 ;POINT AT SAVED UMR 5#� MOV R1,(R2)+ ;SAVE UMR 5 SETTINGž MOV R0,(R2)+ ;Ÿ  .IF NDF T$$SPL¡#¢ ADD #20000,R1 ;ADVANCE 8 K BYTESS £ ADC R0 ;#¤ MOV R1,(R2)+ ;SAVE UMR 6 SETTING.¥ MOV R0,(R2)+ ;¦§ .ENDC ;NDF T$$SPL¨© .IFF ;M$$EXT ª« .IF DF D$$H11¬­;BN®; COMPUTE AND SAVE THE DOUBLE-WORD RELOCATION CONSTANT TO TRANSFORM A DRIVER+¯; VIRTUAL ADDRESS INTO AN 18-BIT ADDRESS. 0°; (SEE DETAILED DESCRIPTION AT LABEL "RELC:").±;N%² SWAB R1 ;SHIFT KISAR5 6 BITS LEFT 3³ MOVB R1,R0 ;GET ORIGINAL BITS 10-11 IN BITS 2-3&´ RORB R1 ;ORIGINAL BIT 8 INTO CARRY/µ ROR R1 ;BIT 8 INTO BIT 15, BIT 9 INTO CARRYA2¶ ROR R1 ;BIT 9 INTO BIT 15 - SHIFT IS COMPLETED · BIC #77,R1 ;CLEAR 6 LOW BITS+¸ ASL R0 ;SHIFT 2 HIGH BITS INTO BITS 4-5$ ¹ ASL R0 ;7º SUB #120000,R1 ;SUBTRACT DRIVER BASE VIRTUAL ADDRESST» BCC 30$ ;NO CARRY - JUMP,¼ SUB #20,R0 ;SUBTRACT CARRY FROM R0 BIT 4-½30$: BIC #^C<60>,R0 ;CLEAR ALL BUT BITS 4-5N*¾ MOV R0,@#RELC ;SAVE RELOCATION CONSTANT¿ MOV R1,@#RELC+2ÀÁ .ENDC ;D$$H11Âà .ENDC ;M$$EXTÄÅ .ENDC ;D$$H11!D$$V11ÆÇ.È; SETTUP THE CT VIDEO TASK TIMER CLOCK BLOCKÉÊ .IF DF B$00š}›}±|t÷tø tþfDATA$MAPË3Ì MOV #CTICK,@#$CTCB+C.SUB ;INITIALIZE CLOCK BLOCKÍ CALL CTQUEK ;QUEUE IT ÎÏ .ENDC ;B$$MAPÐ3Ñ MOV #TTICK,@#$TTCB+C.SUB ;INITIALIZE CLOCK BLOCKDÒ CALL @#CLINS ;QUEUE IT(Ó MOV #$DEVHD,R0 ;GET START OF DCB LIST Ô40$: MOV @R0,R0 ;GET NEXT DCB6Õ CMP D.NAM(R0),#"TT ;DOES IT HAVE GENERIC NAME "TT"?Ö BNE 40$ ;N - LOOPR"× MOV D.UCB(R0),R1 ;GET FIRST UCB+Ø BIT #DV.TTY,U.CW1(R1) ;IS IT A TERMINAL?1Ù BEQ 40$ ;N - LOOPT4Ú MOV R0,@#DCB0 ;SAVE POINTER TO FIRST TERMINAL DCBÛÜ .IF DF T$$COMÝÞ MOV (SP)+,R1 ;GET TTCOM PCBßà .IFF ;T$$COMQá"â MOV D.PCB(R0),R1 ;GET TTDRV PCBãä .ENDC ;T$$COMå;æ MOV P.SIZE(R1),R1 ;GET PARTITION SIZE IN 32. WORD BLOCKSDçè .IF DF R$$EISéê ASH #6,R1 ;CONVERT TO BYTESTëì .IFF ;R$$EIS)íî SWAB R1 ;CONVERT TO BYTEST ï RORB R1 ð ROR R1O ñ ROR R1Dòó .ENDC ;R$$EISôõ .IF DF T$$SPLöD÷ ADD #140000-T$$BFL,R1 ;GET POINTER T$$BFL BYTES BELOW END OF POOLøù .IFF ;T$$SPLEú?û ADD #120000-T$$BFL,R1 ;GET POINTER T$$BFL BYTES BELOW END OFü ;DRIVER POOLýþ .ENDC ;T$$SPLÿ;T$ MOV #TTPOOL,R0 ;GET START OF POOL- MOV R0,@#FREEB ;POINT TO FIRST FREE BUFFERO BR CPOOL ;INITIALIZE POOLS;;H .ENDCONVERT TO BYTESTëì .IFF ;R$$EIS)íî SWAB R1 ;CONVERT TO BYTEST ï RORB R1 ð ROR R1O ñ ROR R1Dòó .ENDC ;R$$EISôõ .IF DF T$$SPLöD÷ ADD #140000-T$$BFL,R1 ;GET POINTER T$$BFL BYTES BELOW END OF POOLøù .IFF ;T$$SPLEú?û .TITLE TTFP .IDENT /07.01/B;D8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;P>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;( ;0 ; 09-FEB-78 PETER WANNHEDENM ;3 ; PREVIOUSLY MODIFIED BY:N;M; D. R. DONCHIN ; T. LEKAS; J. KAUFFMAN$; S. C. ADAMS:; R. S. PHILPOTT; B. S. MCCARTHY;T; MODIFICATIONS ;1; ; S.C. ADAMS 27-FEB-86 07.002; SA454 -- FIX PROBLEMS WITH CONTINUATION LINES;I; S.C. ADAMS 29-APR-86 07.01/; SA457 -- ADD CONDITIONAL FOR BIC IN U.TST6F;H];D^ .MCALL EVNDF$,PKTDF$S _ PKTDF$C ` EVNDF$Iab .PSECT MAP5.6c; d;+Ae; MODULE TTFP - CONTAINS FORK LEVEL PROCESSING ROUTINES FOR THERf; FOLLOWING FORK REQUESTS:&g; FR.SUI START OF UNSOLICITED INPUT.h; FR.AST CHARACTER THAT CAUSES AST RECEIVED=i; FR.SCA TERMINAL MANAGEMENT SWITCH CHARACTERS WERE STRUCK 1j; FR.ICS INPUT COUNT STATE TRANSITION OCCURREDE,k; FR.OOB OUT-OF-BAND CHARACTER WAS STRUCKl;->m; ALL THESE ROUTINES ARE CALLED BY THE FORK DISPATCHER WITH:%n; R4 POINTER TO UCBX (IF IT EXISTS)o; R5 POINTER TO U.TSTA(p; S1.DSI 1 TO DISABLE INPUT PROCESSINGq;-r;Is;R,t.SBTTL FPSUI - START OF UNSOLICITED INPUT.u; v .ENABL LSBw;R=xFPSUI:: CALL GCTAB ;GET CHARACTER THAT STARTS UNSOL. INPUTU+y BCS 30$ ;NOT THERE ANY MORE - FORGET ITMz{ .IF DF T$$IDO|0} TST $MCRPT ;IS THE MCR DISPATCHER INSTALLED?.~ BEQ CTAST ;EQ NO - QUEUE THE AST TO C$CTEX€ .ENDC ;T$$IDO�5‚ CMPB R2,#CH.SP ;IS IT A "FUNNY" CHARACTER (CONTROLƒ ;CHARACTER OR SPACE)?X„ BHI 10$ ;N - OK, JUMP.9… CMPB R2,#CH.CR ;OF THE FUNNY CHARACTERS, WE ONLY ALLOW*† ;CARRIAGE RETURN AND CTRL-C TO START‡ ;UNSOLICITED INPUT,ˆ ;(CR WILL OF COURSE ALSO TERMINATE IT)‰ BEQ 10$ ;CR - OKŠ CMPB R2,#CH.CTC ;CTRL-C?A‹ BNE 50$ ;N - IGNOREŒ10$: ;REFERENCE LABEL�Ž .IF NDF T$$SPLS�� CALL ALUCBX ;ALLOCATE UCBX‘ BCS 50$ ;FAILED - JUMP’“ .ENDC ;NDF T$$SPL”'• CALL ALTB ;ALLOCATE AN INPUT BUFFERT– BCS 40$ ;FAILED - JUMP"— MOV R2,-(SP) ;OK - SAVE POINTER0˜ CLR -(SP) ;RESET CLI PROMPT STATUS FOR ^U/^R™ ASSUME U.TCI,08š MOV @R4,R3 ;GET CURRENT INPUT PACKET IF THERE IS ONE› BEQ 20$ ;INPUT FREE - JUMP2œ MOV #IS.CC,@R3 ;INPUT BUSY - SET STATUS = IS.CC+� ;(BY DEFINITION, IT MUST BE SOLICITEDR ž ;INPUT)R;Ÿ MOVB @R3,1(SP) ;SHO00›"}‡|Ž{´cÚµcÛ¶c�·c›’W THAT A READ WAS INTERRUPTED BY A ^CA  MOV R4,-(SP) ;SAVE R4¡ CALL FPIRD ;SAY INPUT DONE¢ MOV (SP)+,R4 ;RESTORE R4AC£20$: MOV (SP)+,U.TFPB(R4) ;SAVE ^U/^R STATUS IN NOW UNUSED OFFSET =¤ MOV (SP)+,U.TFIB(R4) ;SET UP POINTER TO FIRST INPUT BUFFER^>¥ MOVB U.TCHP-U.TSTA(R5),U.TIHP(R4) ;SET UP INITIAL HOR. POS.¦§ .IF NE T$$UTO¨,© MOVB #T$$UTO,U.TITI(R4) ;INITIALIZE TIMERª« .ENDC ;T$$UTO¬"­ ADD #U.TFIB,R4 ;POINT TO U.TFIB®;O¯;E°;+9±; SUBROUTINE FPSUI1 - SET UP UCB FOR UNSOLICITED INPUT.R<²; FALL THROUGH FROM ABOVE OR CALLED FROM TTICH @ INT STATE³; ´; INPUT:µ; R4 POINTER TO U.TFIB¶; R5 POINTER TO U.TSTA(·; U.TFIB POINTER TO FIRST INPUT BUFFER¸;V ¹; OUTPUT:(º; UCB SET UP.E(»; R2 POINTER TO SECOND WORD OF BUFFER. ¼; THIS WORD INITIALIZED TO 0.½; R4 POINTER TO U.TICN¾;U¿; REGISTERS ALTERED: R2,R4À;-Á;AÂ;T8ÃFPSUI1::MOV @R4,R2 ;GET POINTER TO FIRST INPUT BUFFERÄ ASSUME U.TTIC,U.TFIB-23Å MOV #M$$CRB-4,-(R4) ;INITIALIZE TOTAL BYTE COUNTP#Æ ; = 1 FULL CLI COMMAND BUFFERC-Ç CALL NXTIB ;SET UP UCB FOR INPUT TRANSFERAÈ MOV R2,U.TCI-U.TIC(R4) ;STORE POINTER TO SECOND WORD IN BUFFERT/É ;THIS WORD WILL RECEIVE COMPLETION STATUS Ê CLR @R2 ;INITIALIZE STATUS;Ë BIS #S1.IBY!S1.IBF!S1.USI,@R5 ;SET FLAGS FOR UNSOLICITED Ì ;BUFFERED INPUT5Í BIC #S1.RST!S1.PTH!S1.RES!S1.RNF!S1.RSP!S1.TNE,@R5P Î BIC #S5.ITI,U.TST5-U.TSTA(R5)Î ;SA457Î .IF DF T$$EIO ;SA457Î ;SA457 Ï BIC #S6.EIO,U.TST6-U.TSTA(R5)Ï ;SA457Ï .ENDC ;T$$EIO ;SA457Ï ;SA457+Ð MOV 4(R5),-(SP) ;GET CHARACTERISTIC WORDI6Ñ BIC #^C,(SP) ;GET RID OF EVERYTHING BUT TSYÒÓ ASSUME S3.TSY,S1.TSYCÔBÕ BIS (SP)+,(R5) ;RESTORE THE TSY BIT ACCORDING TO CHARACTERISTICÖ30$: RETURN ;×;BØ40$:Ù;CÚ; FAILED TO ALLOCATE INPUT BUFFER. WITH A LITTLE EFFORT, WE COULDI@Û; DEALLOCATE THE UCBX, AFTER CHECKING WHETHER IT IS NEEDED FORÜ; SOME OTHER PURPOSE.7Ý;B(Þ CALL BELL ;BUFFER ALLOCATION FAILUREß ;OUTPUT A BELL AND<à50$: CALLR RCTAB ;REMOVE CHARACTER FROM TYPE-AHEAD BUFFERá ;AND FORGET IT ALLâ.PAGE>3ã.SBTTL FPAST - CHARACTER THAT CAUSES AST RECEIVED3ä;Såæ .IF DF T$$CCAçAèFPAST:: CALL GCTAB ;GET A CHARACTER FROM THE TYPE-AHEAD BUFFER é BCS 30$ ;NONE THERE - IGNOREêë .IF NDF T$$SPLFìí TST R4 ;UCBX PRESENT?O2î BEQ 30$ ;N - TERMINAL MUST BE DETACHED, IGNOREïð .ENDC ;NDF T$$SPLñ#ò MOV U.TAST(R4),R1 ;GET AST BLOCKB5ó BEQ 30$ ;NONE - TERMINAL MUST BE DETACHED, IGNORE03ô MOVB R2,A.PRM(R1) ;INSERT CHARACTER IN AST BLOCKFCõ BISB #AF.LCK,A.PRM+5(R1) ;ASSUME TASK ONLY WANTS NOTIFICATION...A'ö ;...SO LOCK THE AST CONTROL BLOCKD&÷ CMPB R2,#CH.CTC ;IS CHARACTER A ^C?ø BNE 60$ ;N - JUMPY5ù MOV A.PRM+6(R1),R0 ;ASSUME SPECIFICATION OF ^C AST#ú BNE 70$ ;GOOD ASSUMPTION - JUMPCBû60$: MOV A.PRM+10(R1),R0 ;GET ADDRESS OF UNSOLICITED AST ROUTINE:ü BITB #TF.NOT,A.PRM+5(R1) ;TASK WANTS NOTIFICATION ONLY?ý BNE 80$ ;Y - JUMP ;þ70$: CALL RCTAB ;REMOVE CHARACTER FROM TYPE-AHEAD BUFFERN-ÿ BICB #AF.LCK,A.PRM+5(R1) ;UNLOCK AST BLOCK.?80$: MOV R0,A.AST(R1) ;INSERT TASK AST ADDRESS INTO AST BLOCKL5 JMP QUEAEN ;QUEUE ASYNCHRONOUS EVENT NOTIFICATIONA .ENDC ;T$$CCA.PAGE6 .SBTTL FPSCA - SWITCH CHARACTERS HAVE BEEN DETECTED .IF DF T$$SCAP  ;MI ; THIS FORK ROUTINE IS EXECUTED WHEN A USER HAS REQUESTED RECOGNITIONBK ; OF SWITCH CHARACTERS BY SETTING UP THE TC.SSC CHARACTERISTIC. ENTERING E ; SWITCH CHARACTERS IS A REQUEST TO ENTER TERMINAL MANAGEMENT MODE. ;C FPSCA::1 .IF NDF T$$SPL TST R4 ;IS THERE A UCBX?A, BEQ 30$ ;IF EQ, NO...MUST HAVE DETACHED .ENDC ;NDF T$$SPL: TST U.TSCA(R4) ;IS THERE POINTER TO TERM MGMT ACB/TEP?2 BEQ 30$ ;IF EQ, IT WENT AWAY...IGNORE REQUEST" MOV #IS.TMM,R0 ;SET TMM STATUS CALL KILLI1 ;KILL INPUT7 MOV U.TSCA(R4),R1 ;GET POINTER TO TERM MGMT ACB/TEPE( JMP QUEAEN 00›*}}±|t÷tø tþfDATA;QUEUE TEP TO IT'S OWNER .ENDC ;T$$SCA .PAGE 7! .SBTTL FPICS - INPUT COUNT STATE TRANSITION OCCURRED"# .IF DF T$$ICSF$%;J&; THIS FORK ROUTINE IS EXECUTED WHEN A USER HAS REQUESTED NOTIFICATIONH'; OF THE TYPE-AHEAD BUFFER GOING FROM EMPTY TO NON-EMPTY BY SETTING UPH(; THE TC.ICS CHARACTERISTIC. A TSA EVENT PACKET WILL BE QUEUED TO THE8); SYSTEM-STATE PROCESS THAT SET UP THE CHARACTERISTIC.*; +FPICS::(2, CALL GCTAB ;IS THERE STILL A CHAR IN THE TAB?,- BCS 30$ ;IF CS, NO...FORGET THE REQUEST./ .IF NDF T$$SPL01 TST R4 ;IS THERE A UCBX? ,2 BEQ 30$ ;IF EQ, NO...MUST HAVE DETACHED34 .ENDC ;NDF T$$SPL516 MOV U.TICA(R4),R1 ;GET POINTER TO ICS ACB/TEPI27 BEQ 30$ ;IF EQ, IT WENT AWAY...IGNORE REQUEST(8 JMP QUEAEN ;QUEUE ACB TO IT'S OWNER9: .ENDC ;T$$ICS;<.PAGEW0= .SBTTL FPOOB - OUT-OF-BAND CHARACTER DETECTED>? .IF DF T$$OOBS@A;JB; THIS FORK ROUTINE IS EXECUTED WHEN A USER HAS REQUESTED NOTIFICATIONOC; OF INPUT OF OUT-OF-BAND CHARACTERS BY SETTING UP THE TC.OOB CHARACTERISTIC.HOD; IF THE USER IS A TASK, AN AST WILL BE QUEUED. OTHERWISE A TSA EVENT PACKETSNE; WILL BE QUEUED TO THE SYSTEM-STATE PROCESS THAT SET UP THE CHARACTERISTIC.F;E GFPOOB::GHI .IF NDF T$$SPLEJK TST R4 ;IS THERE A UCBX?,L BEQ 30$ ;IF EQ, NO...MUST HAVE DETACHEDMN .ENDC ;NDF T$$SPLO1P MOV U.TOBA(R4),R1 ;GET POINTER TO ICS ACB/TEPF2Q BEQ 30$ ;IF EQ, IT WENT AWAY...IGNORE REQUESTR)S CALL QUEAEN ;QUEUE TEP TO IT'S OWNERETU ASSUME U.TCI,0.V;HFW; CHECK IF A STATUS HAS BEEN SET. (IS.OOB). THIS MEANS THAT THE OOBIX; CHARACTER WAS A CLEAR OOB AND THEREFORE, THE READ MUST BE TERMINATED.AY; Z TST (R4)+ ;IS THERE INPUT?P3[ BEQ 30$ ;RETURN IF NOT. (IF NOT R4 NOT NEEDED)H!\ TST @-(R4) ;IS THERE STATUS?N] BEQ 30$ ;RETURN IF NOT$^ CALLR KILLI ;TERMINATE THE READ_` .ENDC ;T$$OOBa b .DSABL LSBBcd.PAGEEBe.SBTTL CTAST - FOR INTERRUPT-DO SEND AN AST TO C$CTEX - FOR P/OSf; gh .IF DF T$$IDOij;>k; THIS IS A HACK TO SEND AN AST TO A TASK CALLED C$CTEX WHENAl; ^C IS TYPED AND NO ONE WANT'S IT. THE AST ROUTINE IS ASSUMED m; TO BE AT LOCATION 250n;Top;; q; SEE IF THE TASK IS INSTALLEDr;I+sCTAST: CMPB R2,#CH.CTC ;IS IT A CTRL-C? t BEQ 970$ ;EQ YES - OK GO ONu(v CRASH ;WE SHOULD ONLY GET HERE FORw ;A CTRL-C (OR INT-DO)x+y970$: CALL RCTAB ;GET RID OF THE CTRL-C-!z MOV #CTEX,R3 ;GET CTEX'S NAMEC{ CALL $SRSTD ;LOOK FOR ITF| BCS 990$ ;IF CS - NOT HERE '} BIT #TS.EXE,T.STAT(R0) ;TASK ACTIVE?C%~ BNE 990$ ;IF NE NO - DON'T DO ITN& MOV R0,-(SP) ;SAVE THE TCB ADDRESS€;B�; GET SOME POOL‚;ƒ„ MOV #6.*2,R1 ;SIZE… CALL $ALOCB ;GET IT*† BCS 980$ ;IF CS - NO POOL - FORGET IT‡;9ˆ; FILL IN THE AST BLOCK‰;C"Š MOV R0,R1 ;COPY BLOCK ADDRESS-‹ TST (R0)+ ;POINT PAST AST LIST LINK WORDA&Œ MOV #6.*2,(R0)+ ;SIZE OF AST BLOCK<� MOV #7.*2,(R0)+ ;NUMBER OF BYTES TO ALLOCATE ON USER'S S'Ž MOV #250,(R0)+ ;AST VIRTUAL ADDRESST6� CLR (R0)+ ;NUMBER OF EXTRA WORDS TO PUT ON USER'S%� MOV (SP)+,R0 ;GET THE TCB ADDRESSA6‘ CALLR $QASTT ;QUEUE THE AST AND THROW THE ^C AWAY’$“980$: TST (SP)+ ;CLEAN THE STACK”990$: RETURN•– .ENDC ;T$$IDO—.PAGE (˜.SBTTL FPKIL - SEND KILL PACKET TO CLI™;Mš› .IF DF T$$SPCœ�ž .PSECT MAP6Ÿ  FPKIL::T¡ .IF DF C$$CTC¢E£ BIT #UM.KIL,U.MUP-U.TSTA(R5) ;CREATE ^C NOTIFICATION PACKET IF CLRS/¤ BNE 10$ ;IF NE, KILL PACKET MUST BE CREATED ;¥ MOV #CC.CLI!CC.CTC,R1 ;SET ^C NOTIFICATION PACKET STATUST¦ BR 20$ ;JUMP TO COMMON CODE §10$:¨ .ENDC ;C$$CTC©/ª BIC #UM.KIL,U.MUP-U.TSTA(R5) ;CLEAR KILL BIT*« CLR U.TFPB(R4) ;RESET CLI PROMPT STATUS«; ;SA454;J«; THE FOLLOWING CODE IS AN ATTEMPT TO CAUSE TTDRV TO CYCLE BACK ;SA454M«; THROUGH FPKIL SUCH THAT WHEN CONTROL C IS TYPED TO A CONTINUATION ;SA454TH«; LINE, WE FIRST COME THROUGH AND KI00›2}‡|Ž{´cÚµcÛ¶c�·c›’LL THE LINE THEN AGAIN TO ;SA454N«; ABORT TASKS. THIS BEHAVIOR IS BEING CHANGED AS IT IS INCONSISTENT ;SA454M«; WITH THE ACTION OF TTDRV WHEN A COMMAND LINE IS TERMINATED BY ^C. ;SA454C« ;SA454«; .IF DF T$$SPL ;SA454I«; ;SA454 A«; MOVB #CH.CTC,U.TECO-U.TSTA(R5) ;PUT ^C IN ECHO BUFFER ;SA454O«; ;SA454A«; .IFF ;T$$SPL ;SA454«; ;SA454U;«; MOVB #CH.CTC,U.TECB(R4) ;PUT ^C IN ECHO BUFFER ;SA454«; ;SA454 «; .ENDC ;T$$SPL ;SA454A«; ;SA454B8«; FRKBIT BIS,#FR.PFP ; POST-FORK PROCESS A ^C ;SA454«; ;SA454I/¯ MOV #CC.KIL,R1 ;SET CLI KILL STATUS ;**-3M"°20$: MOV R5,R2 ;GET UCB ADDRESS± SUB #U.TSTA,R2 ;$,² CALL $QCNTP ;QUEUE CONTROL PACKET TO CLI ³ RETURNC´µ¶ .ENDC ;T$$SPC·¸.PAGEE8¹ .SBTTL QUEAEN - QUEUE ASYNCHRONOUS EVENT NOTIFICATIONº,» .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB¼½;P¾;+¿;H5À; **-QUEAEN - QUEUE ASYNCHRONOUS EVENT NOTIFICATION$Á; Â; INPUTS:<Ã; R1 => AST CONTROL BLOCK OR TSA EVENT PACKET TO BE QUEUED)Ä; R4 => UCBX (MUST EXIST AND BE MAPPED)V Å; R5 => U.TSTA OF CURRENT UCBXÆ;-Ç; OUTPUTS:È; R0 IS DESTROYEDS,É; R3 IS DESTROYED IF A TEP IS PASSED IN R1Ê;RË;-Ì;OÍ Î .ENABL LSB ÏQUEAEN::ÐÑ .IF DF R$$IICÒÓ ASSUME A.CBL,E.VSIZ/Ô TST A.CBL(R1) ;IS THIS AN AST CONTROL BLOCK?$&Õ BNE 10$ ;IF NE, NO...MUST BE A TEPÖ× .IFTF ;R$$IICØ8Ù BITB #AF.QUE,A.PRM+5(R1) ;IS THIS ACB ALREADY QUEUED?%Ú BNE 20$ ;IF NE, YES...JUST RETURNRÛÜ .IF DF T$$OOBÝ1Þ BITB #AF.OOB,A.PRM+5(R1) ;IS THIS ACB FOR OOB?ß BEQ 5$ ;IF EQ, NON=à TSTB A.PRM+24(R1) ;IS THERE A CHARACTER IN THE OOB BUFFER?E á BEQ 20$ ;IF EQ, NO... RETURN!â CALL RCBUF ;GET THE CHARACTER+ã MOVB R2,A.PRM(R1) ;AND PUT IT IN THE ACBSä5$:Bå .ENDC ;T$$OOBæ/ç BISB #AF.QUE,A.PRM+5(R1) ;MARK ACB AS QUEUED 4è MOV U.ATT-U.TSTA(R5),R0 ;GET TCB OF ATTACHED TASK+é CALLR $QASTT ;QUEUE THE AST TO THE TASKAêë .IFT ;R$$IIC$ìí10$:1î MOV R1,R3 ;COPY TEP POINTER FOR QUEUE ROUTINE #ï; BR QUETEP ;SKIP TO QUEUE A TEPOð7ñ .SBTTL QUETEP - QUEUE TERMINAL EVENT PACKET TO OWNERAò;Aó;+ô; Nõ; **-QUETEP - THIS ROUTINE IS CALLED TO PASS A TSA EVENT PACKET TO A ROUTINEGö; SET UP TO PROCESS THE EVENT. THE DOUBLEWORD ADDRESS OF THE ROUTINEBF÷; TO BE CALLED IS EXPECTED TO BE IN THE TEP. NOTE THAT AN INTERLOCKGø; MECHANISM IS PROVIDED TO DISABLE A FUTURE CALL WITH THE SAME PACKETTIù; IF NECESSARY. IT IS UP TO THE CALLED ROUTINE TO CLEAR THE INTERLOCK. ú;U û; INPUT:"ü; R3 => TEP TO PASS TO ITS OWNERý;þ;-ÿ; QUETEP::7 BIT #EF.QUE,E.VFLG(R3) ;IS THE PACKET ALREADY QUEUED 6 BNE 20$ ;IF NE, YES...CANNOT QUEUE A LOCKED PACKETB BIS #EF.QUE,E.VFLG(R3) ;LOCK PACKET UNTIL OWNER IS DONE WITH ITA MOV E.VAPR(R3),-(SP) ;SAVE DOUBLEWORD ADDRESS OF THE PACKET... ) MOV E.VADR(R3),-(SP) ;...OWNER ROUTINE ' CALL $MPPRO ;MAP AND CALL THE OWNER  .ENDC ;R$$IIC 20$:  RETURN ;ALL DONEC   .DSABL LSBE , .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB9 .SBTTL RCBUF - REMOVE CHARACTER FROM TYPE-AHEAD BUFFERE;L;+;HK; **-RCBUF - THIS ROUTINE IS CALLED TO REMOVE A CHARACTER FROM A STANDARDKB; FORMAT TYPE-AHEAD BUFFER. NOTE: THIS MUST BE CALLED ONLYD; WHEN IT IS KNOWN THAT THERE ARE CHARACTERS TO BE RETRIEVED!;M ; INPUT:0; R1 => ACB IN WHICH TYPE-AHEAD BUFFER RESIDES ; OUTPUT:W%; R2 CHARACTER THAT WAS RETRIEVEDR; ;-;C  .IF DF T$$OOB!"RCBUF:## CALL LOCKI ;LOCK OUT INTERRUPTSB6$ MOV R1,R3 ;;;MAKE COPY OF ACB ADDRESS TO PLAY WITH1% ADD #A.PRM+23,R3 ;;;POINT TO RETRIEVAL POINTER '& CLR R2 ;;;PREPARE FOR BYTE TRANSFERR4' BISB (R3),R2 ;;;GET OFFSET TO RETRIEVE CHARACTER(( INCB (R3) ;;;INCREMENT RETR. POINTER>) CMPB (R3)+,1(R3) ;;;IS THE POINTER NOW = TOTAL BUFFER SIZE?* BNE 10$ ;;;NE- OKC/+ CLRB -1(R3) ;;;START AT BEGINNING NEXT TIMEW,10$:%- DECB (R3)00›:}œ;}±|t÷tø tþfDATA+ ;;;DEC CHARACTER COUNT. ADD R2,R3 ;;;POINT TO.../ INC R3 ;;;THE CHARACTER;0 CLR R2 ;;;GET READY FOR IT'1 BISB (R3),R2 ;;;GET CHARACTER IN R2I 2 RETURN#34 .ENDC ;T$$OOB5;R6; 7 .END& CLR R2 ;;;PREPARE FOR BYTE TRANSFERR4' BISB (R3),R2 ;;;GET OFFSET TO RETRIEVE CHARACTER(( INCB (R3) ;;;INCREMENT RETR. POINTER>) CMPB (R3)+,1(R3) ;;;IS THE POINTER NOW = TOTAL BUFFER SIZE?* BNE 10$ ;;;NE- OKC/+ CLRB -1(R3) ;;;START AT BEGINNING NEXT TIMEW,10$:%- DECB (R3) .TITLE TTICH .IDENT /07.03/T;5=; COPYRIGHT (c) 1986,1987 BY DIGITAL EQUIPMENT CORPORATION.T; ALL RIGHTS RESERVED.;R>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;. ;U ; 23-JAN-78 PETER WANNHEDENX ;  ; PREVIOUSLY MODIFIED BY:Y;A; P. WANNHEDEN; C. F. SPITZA; D. R. DONCHINI ; T. LEKAS; J. KAUFFMAN ; S. C. ADAMSM; R. S. PHILPOTT;U; MODIFIED BY:;; L. KOGAN 06-FEB-86 07.00A; LK707 -- CORRECT CTR/R PROCESSING WHEN T$$RPR IS NOT DEFINEDR;I; S.C. ADAMS 21-MAY-86 07.01=; SA458-- DON'T PERFORM SPECIAL FUNCTION FOR OOB CHARACTER ;; S.C. ADAMS 20-JUN-86 07.02;; SA463-- FIX PROBLEM OF CERTAIN TERMINATORS UNDER CTERME(; BEING INCLUDED IN THE INPUT BUFFER;Y; S.C. ADAMS 16-FEB-87 07.03=; SA468-- CONVERT TO UPPERCASE WHEN APPROPRIATE FOR IO.RST ; ; ;+; ****** T T I C H ****** ;IK; THIS MODULE CONTAINS THE ROUTINES WHICH MAKE UP THE "PRE-INPUT PROCESS"SO; AND THE "INPUT PROCESS" OF THE TERMINAL DRIVER. THE "PRE-INPUT" PROCESS IS8Q; MODELLED AS RECEIVING CHARACTERS FROM A TERMINAL INTERFACE. THESE CHARACTERS6O; ARE INTERPRETED PRIOR TO BEING MOVED TO EITHER A TYPE-AHEAD BUFFER OR TO AN M; OUT-OF-BAND CHARACTER BUFFER. THE "INPUT PROCESS" IS MODELLED AS READING-Q; CHARACTERS FROM THE TYPE-AHEAD BUFFER, PROCESSING THEM, AND THEN WRITING THEMTN ; TO AN INPUT BUFFER. THE PROCESSING INVOLVES RECOGNIZING ESCAPE SEQUENCES,N!; EDIT CHARACTERS, AND TERMINATORS AND INITIATING THE ECHO PROCESSING OF THEK"; CHARACTER. AN INPUT BUFFER CAN BE A USER TASK BUFFER, "BUFFERED INPUT"I0#; BUFFERS, OR UNSOLICITED INPUT (CLI) BUFFERS.$;-%;I(& .SBTTL .MCALLS AND SYMBOL DEFINITIONS'( .IF DF R$$MPL)* .MCALL KRBDF$+, KRBDF$ ;DEFINE KRB SYMBOLSD-. .IFF ;R$$MPLF/0 .MCALL SCBDF$1&2 SCBDF$ ,,SYSDEF ;DEFINE SCB SYMBOLS34 .ENDC ;R$$MPL56 .MCALL PKTDF$7"8 PKTDF$ ;DEFINE PACKET SYMBOLS9: .IF DF T$$TSA;< .MCALL EVNDF$=,> EVNDF$ ;DEFINE TSA EVENT PACKET OFFSETS?@ .ENDC ;T$$TSAAB .PSECT MAP5.6C.PAGEI+D .SBTTL TERMINAL DRIVER PRE-INPUT PROCESSIBE .SBTTL . ICHAR1 - INITIALIZATION AND SPECIAL CHARACTER CHECKINGF;.G;+CH; **-ICHAR1 - PROCESS AN INPUT CHARACTER BEFORE TYPE-AHEAD BUFFERI;.OJ; THIS ROUTINE INITIATES PROCESSING OF A CHARACTER ON THE "OUTSIDE" (HARDWAREOK; SIDE) OF THE TYPE-AHEAD BUFFER. ANY OF THE FOLLOWING ACTIONS MAY BE TAKEN:L;?M; 1. IF THE UNIT IS OFFLINE OR WAITING FOR CARRIER, THE INPUT N; CHARACTER IS IGNORED..O; 2. PERFORM AUTOBAUD DETECTION IF REQUIRED.DP; 3. CHECK FOR USER REQUEST TO SWITCH TO TERMINAL MANAGEMENT MODE.CQ; 4. DISPATCH TO ONE OF THE "PRE-INPUT PROCESS" SPECIAL CHARACTER ;R; HANDLING ROUTINES (^S, ^Q, ^O, ^X, ^C, ^V). NOTE THAT<S; THESE CHARACTERS ARE NOT INTERPRETED IF "PASSTHRU" OR A2T; "READ WITH SPECIAL TERMINATORS" IS IN EFFECT./U; 5. PERFORM OUT-OF-BAND CHARACTER DETECTION.:V; 6. TRANSFER CONTROL TO "I1DEF" FOR FURTHER PROCESSING.W;N X; INPUTS:5Y; R2 = CHARACTER (LOW BYTE) AND STATUS (HIGH BYTE)F$Z; R5 => U.TSTA OF THE TERMINAL UCB[;O \; OUTPUTS:I2]; R2 = CHARACTER (IF CONTROL PASSED TO "I1DEF")^;I#_; REGISTERS ALTERED: R2, R3, R4 `;-a;O bICHAR1::cd .IF DF T$$MODeEf BITB #US.CRW,U.STS-U.TSTA(R5) ;;;IS THIS UNIT WAITING FOR CARRIER?*g BNE I1RET ;;;IF NE, YES...IGNORE INPUT00œB}‡|Ž{´cÚµcÛ¶c�·c›’hi .ENDC ;T$$MODjk .IF DF R$$CONl9m BITB #US.OFL,U.ST2-U.TSTA(R5) ;;;IS THIS UNIT OFFLINE?E*n BNE I1RET ;;;IF NE, YES...IGNORE INPUTop .ENDC ;R$$CONqr .IF DF T$$SPLs;t MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;;;MAP THE UCBX AND TABUF uv .ENDC ;T$$SPLwx; ,y; PERFORM AUTOBAUD DETECTION IF NECESSARY.z; {| .IF DF D$$M11!D$$ZMD!D$$VMD}~ ASSUME S5.ABP,100000R? TST U.TST5-U.TSTA(R5) ;;;IS AUTO-BAUD DETECTION IN PROGRESS?I€ BPL 10$ ;;;IF PL, NO...SKIPT3� CALL SETSPD ;;;DETERMINE THE CALLER'S BAUD RATEB3‚ BEQ I1RET ;;;IF EQ, DID NOT FIND SPEED...RETURNE2ƒ ;;;ELSE, THE INPUT CHARACTER IN R2 IS A „10$:…† .ENDC ;D$$M11!D$$ZMD!D$$VMD‡ˆ .IF DF T$$ACD‰CŠ MOV #UA.ACC!UA.PRO!UA.ECH,U.AFLG-U.TSTA(R5) ;;;SET DEFAULT FLAGS :‹ TST U.ACB-U.TSTA(R5) ;;;DOES THIS TERMINAL HAVE AN ACD?)Œ BEQ 20$ ;;;IF EQ, NO...SKIP ACD STUFFP0� MOV R0,-(SP) ;;;SAVE REGISTER NEEDED FOR CALL<Ž MOV #A.RECE,R0 ;;;SPECIFY CHARACTER RECEPTION ENTRY POINT� CALL $SWACD ;;;CALL ACDE#� MOV (SP)+,R0 ;;;RESTORE REGISTER;:‘ BIT #UA.ACC,U.AFLG-U.TSTA(R5) ;;;ACCEPT THIS CHARACTER?+’ BEQ I1RET ;;;IF EQ, NO...JUST IGNORE IT.D“ BIT #UA.TYP,U.AFLG-U.TSTA(R5) ;;;FORCE THIS CHARACTER INTO TABUF?'” BNE I1BUFR ;;;IF NE, YES...GO DO ITA=• BIT #UA.PRO,U.AFLG-U.TSTA(R5) ;;;INTERPRET THIS CHARACTER?A!– BEQ I1DEF ;;;IF EQ, NO...SKIPS—20$:˜™ .ENDC ;T$$ACDš›; Mœ; CHECK FOR HARD RECEIVE ERRORS ON THE INPUT CHARACTER. IT IS ASSUMED THATYL�; THE ERROR BITS PASSED FROM THE HARDWARE MATCH THE FLAG VALUES IN THE UCBž; STATUS WORD (U.TST5).RŸ;; ¡ .IF DF T$$RED¢@£ BIC #^C,R2 ;;;CLEAR EXTRANEOUS BITS?¤ BIT #S5.BCC!S5.DAO!S5.VER,R2 ;;;HARD RECEIVE ERROR DETECTED?;7¥ BNE I1DEF ;;;IF NE, YES...DON'T INTERPRET CHARACTER;¦§ .IFF ;T$$REDA¨?© BIT #S5.BCC!S5.DAO!S5.VER,R2 ;;;HARD RECEIVE ERROR DETECTED?A2ª BNE I1BEEP ;;;IF NE, YES...RESPOND WITH A BELL«¬ .ENDC ;T$$RED­®0¯ BIT #S3.8BC,4(R5) ;;;PASS 8 BITS TO THE USER? ° BNE 40$ ;;;IF NE, YES...SKIP0± BIC #200,R2 ;;;OTHERWISE, CLEAR THE HIGH BIT²40$:³´;=µ; CHECK FOR POTENTIAL SWITCH INTO TERMINAL MANAGEMENT MODE.¶;T·¸ .IF DF T$$SCA¹=º CALL TMMCHK ;;;SEE IF INPUT PUTS US IN TERMINAL MGMT MODE.;» BCS I1RET ;;;IF CS, ONE OF SWITCH CHARS SEEN...ALL DONE#¼½ .ENDC ;T$$SCA¾¿; JÀ; SCAN PRE-INPUT PROCESS CHARACTER RECOGNITION TABLE AND THE OUT-OF-BAND:Á; CHARACTER DEFINITIONS FOR THE CURRENT INPUT CHARACTER.Â;T3à MOV #I1CRT,R3 ;;;GET CHARACTER RECOGNITION TABLEBÄ CMPB R2,(R3)+ ;;;CONTROL-S?.Å BEQ 50$ ;;;IF EQ, YES...CHECK TTSYNC STATEÆ CMPB R2,(R3)+ ;;;CONTROL-Q?2Ç BNE 60$ ;;;IF NE, NO...SKIP TO CONTINUE CHECKSÈ50$:4É BIT #S1.TSY,(R5) ;;;TERMINAL HAVE TTSYNC ENABLED?Ê BEQ 60$ ;;;IF EQ, NO...SKIPC5Ë ASR R3 ;;;CONTROL-S (ASSUMES I1CRT WORD-ALIGNED)? 'Ì BCS I1CTS ;;;IF CS, YES...HANDLE ITC2Í BR I1CTQ ;;;ELSE, IT WAS CONTROL-Q...HANDLE ITÎ60$:5Ï BIT #S1.PTH,(R5) ;;;TERMINAL SET TO PASSTHRU MODE?,"Ð BNE I1DEF ;;;IF NE, YES...SKIPÑÒ .IF DF T$$OOBÓ*Ó MOV R0,-(SP) ;;;SAVE REGISTER ;SA4582Ô CALL OOBCHK ;;;SEE IF CHARACTER IS OUT-OF-BANDÕ/Õ BCC 70$ ;;;IF CARRY CLEAR, NOT OOB ;SA458CÕ CALL OOBCK2 ;;;DO FURTHER CHECKING AND PROCESSING OF OOB ;SA458I-Õ MOV (SP)+,R0 ;;;RESTORE REGISTER ;SA458M0Õ BCS I1DEF ;;;IF CS THEN OOB INCLUDE ;SA458,Õ BR I1RET ;;;ELSE, NOT INCLUDED ;SA4581Õ70$: MOV (SP)+,R0 ;;;RESTORE REGISTER ;SA458 :Ø ;;;ELSE, CHARACTER NOT OOB OR IS "OOB INCLUDE" ;**-2BÙ MOV #I1CRT+2,R3 ;;;RESTORE POINTER INTO CHAR. RECOGNITION TABLEÚÛ .ENDC ;T$$OOBÜÝ CMPB R2,(R3)+ ;;;CONTROL-O?*Þ BEQ I1CTO ;;;IF EQ, YES...CHECK IT OUT>ß BIT #S1.RSP,(R5) ;;;READ WITH SPECIAL CHARACTER PROCESSING? à BNE I1DEFáâ .IF DF T$$CTXãä CMPB R2,(R3)+ ;;;CONTROL-X?*å BEQ I1CTX ;;;IF EQ, YES...CHECK IT OUTæç .ENDC ;T$$CTXèé CMPB R2,(R3)+ ;;;CONTROL-C?/ê BEQ I1CTC ;;;IF EQ, YES...PROCES00œJ};}±|t÷tø tþfDATAS CONTROL-C $ë ;;;ELSE, FALL THROUGH TO I1DEFì.PAGE"/í .SBTTL . I1DEF - NORMAL CHARACTER PROCESSINGOî;.ï;+Pð; **-I1DEF - HANDLE INPUT CHARACTER THAT HAS NO PRE-INPUT PROCESS SIGNIFICANCEñ;;Jò; THIS ROUTINE ACCEPTS A CHARACTER FROM "ICHAR1" AND DOES THE FOLLOWING:ó;ODô; 1. IF THE TYPE-AHEAD BUFFER IS EMPTY, CALL "IPROC" TO SEE IF THEBõ; CURRENT CHARACTER CAN BE PROCESSED IMMEDIATELY (BY "ICHAR2").Eö; 2. IF THE TYPE-AHEAD BUFFER IS NOT EMPTY OR "IPROC" INDICATES THEE=÷; CURRENT CHARACTER CANNOT BE PROCESSED NOW, THE CHARACTER+ø; IS PLACED INTO THE TYPE-AHEAD BUFFER.PDù; 3. IF AN ERROR WAS PREVIOUSLY DETECTED, OR THE TYPE-AHEAD BUFFER>ú; IS FULL, THE CHARACTER IS DISCARDED AND A BELL IS ECHOED.û;C ü; INPUTS:+ý; R2 = CURRENT CHARACTER TO BE PROCESSED.$þ; R5 => U.TSTA OF THE TERMINAL UCBÿ;P ; OUTPUTS:T6; R2 = CHARACTER (IF CONTROL IS PASSED TO "ICHAR2")E; THE CHARACTER IS PLACED IN THE TABUF IF "ICHAR2" CANNOT BE CALLED ;A ; REGISTERS MODIFIED: R3, R4;-;OI1DEF:  .IF DF T$$SPL 0  MOV #120000+U.TTBF,R3 ;;;SET POINTER TO TABUF   .IFF ;T$$SPL 0 MOV U.TTAB-U.TSTA(R5),R3 ;;;GET TABUF POINTER$ BEQ I1DEF1 ;;;IF EQ, NONE...SKIP2 BIT #1,R3 ;;;IS THIS A SINGLE-CHARACTER TABUF?; BNE I1BEEP ;;;IF NE, YES...TABUF IS FULL SO RING A BELL .ENDC ;T$$SPL2 TSTB 2(R3) ;;;ANY CHARACTERS ALREADY BUFFERED?; BNE I1BUFR ;;;IF NE, YES...SKIP TO BUFFER THIS ONE ALSOC; G; I1DEF1 - NOTHING IS CURRENTLY BUFFERED. CHECK TO SEE IF WE NEED TOF7; REQUEST A FORK FOR AN INPUT COUNT STATE TRANSITION.O;F I1DEF1:F .IF DF T$$ICS  ASSUME S1.IBY,200'! TSTB (R5) ;;;IS INPUT ALREADY BUSY?,2" BMI 10$ ;;;IF MI, YES...WON'T NEED TO SEND ICS9# BIT #S3.ICE,4(R5) ;;;IS INPUT COUNT STATE AST ENABLED?S7$ BEQ 10$ ;;;IF EQ, NO...TRY TO PROCESS CHARACTER NOW;%& .IF DF T$$SCA'B( BIT #S5.TMM,U.TST5-U.TSTA(R5) ;;;TERMINAL IN TERM. MANGT. MODE?+) BNE 10$ ;;;NE -> YES= -> DON'T SENT ICSU*+ .ENDC ;T$$SCA,A- MOV #FR.ICS,R3 ;;;SET REQUEST FOR INPUT COUNT STATE TRANSITIONO!. CALL FORK ;;;REQUEST THE FORK$:/ BR I1BUFR ;;;CAN'T PROCESS CHARACTER NOW, SO BUFFER IT010$:12 .ENDC ;T$$ICS34;.A5; CHECK TO SEE IF CURRENT CHARACTER CAN BE PROCESSED RIGHT AWAYA6;T37 CALL IPROC ;;;CAN WE PROCESS THE CHARACTER NOW? '8 BCC ICHAR2 ;;;IF CC, YES...GO DO IT9;TQ:; I1BUFR - CHARACTER CANNOT BE PROCESSED NOW. PUT IT IN THE TYPE-AHEAD BUFFER.Y;;> <I1BUFR: => .IF DF T$$RED?F@ BIT #S5.BCC!S5.DAO!S5.VER,U.TST5-U.TSTA(R5) ;;;PREVIOUS HARD ERROR?4A BNE I1BEEP ;;;IF NE, YES...REJECT THIS CHARACTER2B MOV R2,-(SP) ;;;COPY CHARACTER PLUS ERROR FLAGS:C CLRB (SP) ;;;CLEAR LOW BYTE - LEAVE FLAGS IN HIGH BYTEED BIS (SP)+,U.TST5-U.TSTA(R5) ;;;SAVE ERROR FLAGS (IF ANY) FOR LATERPEF .ENDC ;T$$REDG=H CALL PCTAB ;;;PUT THIS CHARACTER IN THE TYPE-AHEAD BUFFERC;I BCS I1BEEP ;;;IF CS, TYPE-AHEAD BUFFER FULL...RING BELLUJI1RET:K RETURN ;;;ALL DONEFL;$>M; SOME EVENT REQUIRES ECHOING A BELL AT THE USER'S TERMINAL.N;H OI1BEEP:4P CALLR BELL ;;;SOME ERROR REQUIRES ECHOING A BELLQ.PAGE,1R .SBTTL . SPECIAL CHARACTER PROCESSING ROUTINESS'S .SBTTL . I1CTS - CONTROL-S HANDLINGGT;E9U; I1CTSL - LOCK OUT INTERRUPTS AND STOP TERMINAL OUTPUTYV; WI1CTSL:#X CALL LOCKI ;LOCK OUT INTERRUPTS;YI1CTS:*Z BIS #S2.CTS,2(R5) ;;;SET CONTROL-S FLAG0[ MOV #CT.STP,R2 ;;;SET INDEX FOR "STOP OUTPUT"3\ CALLR CTRD ;;;CALL CONTROLLER DEPENDENT ROUTINEO]'^ .SBTTL . I1CTQ - CONTROL-Q HANDLINGS_;I;`; I1CTQL - LOCK OUT INTERRUPTS AND RESUME TERMINAL OUTPUT a;N bI1CTQL::#c CALL LOCKI ;LOCK OUT INTERRUPTS dI1CTQ:,e BIC #S2.CTS,2(R5) ;;;CLEAR CONTROL-S FLAG2f MOV #CT.RES,R2 ;;;SET INDEX FOR "RESUME OUTPUT"Bg BITB #US.OIU,U.STS-U.TSTA(R5) ;;;EXPECTING AN OUTPUT INTERRUPT?&h BNE I1RET ;;;IF NE, NO...JUST EXIT iI1CTRD:T3j CALLR CTRD ;;;CALL CONTROLLER DEPENDENT ROUTINEOkl.PAGEL'm .SBTT00œR}‡|Ž{´cÚµcÛ¶c�·c›’L . I1CTO - CONTROL-O HANDLINGTn;Ko; I1CTO - PROCESS OUTPUT DISCARD REQUEST. IF TASK OUTPUT IS IN PROGRESS,ECp; IT IS ABORTED. IF THE TERMINAL IS ATTACHED, THE OUTPUT DISCARD;@q; STATE FLAG IS COMPLEMENTED TO ENABLE/DISABLE FURTHER OUTPUT.r; sI1CTO:4t TST U.ATT-U.TSTA(R5) ;;;IS THE TERMINAL ATTACHED?4u BEQ 10$ ;;;IF EQ, NO...JUST ABORT CURRENT OUTPUT:v BIT #S2.CTO,2(R5) ;;;IS OUTPUT ALREADY BEING DISCARDED?9w BNE 30$ ;;;IF NE, YES...SKIP TO ENABLE FURTHER OUTPUT:x BIS #S2.CTO,2(R5) ;;;SET FLAG TO DISABLE FURTHER OUTPUTy10$:z{ .IF DF T$$SPL|,} MOV #120000,R4 ;;;SET POINTER TO THE UCBX~ .IFF ;T$$SPLT€5� MOV U.TUX-U.TSTA(R5),R4 ;;;GET POINTER TO THE UCBX -‚ BEQ 40$ ;;;IF EQ, NONE...IGNORE CONTROL-Oƒ„ .ENDC ;T$$SPL…0† MOV U.TCO(R4),R3 ;;;GET CURRENT OUTPUT PACKET6‡ BEQ 40$ ;;;IF EQ, NOT DOING TASK OUTPUT...ALL DONEBˆ BITB #US.OIU,U.STS-U.TSTA(R5) ;;;EXPECTING AN OUTPUT INTERRUPT?#‰ BNE 40$ ;;;IF NE, NO...ALL DONETŠ‹ .IF DF T$$RPRŒ4� TST U.TFPB(R4) ;;;IS OUTPUT FROM A READ W/PROMPT?:Ž BNE 20$ ;;;IF NE, YES...CONTROL-O IS IGNORED DURING IT�� .ENDC ;T$$RPR‘<’ BITB #TF.WBT,I.FCN(R3) ;;;WRITE-BREAKTHROUGH IN PROGRESS?,“ BNE 40$ ;;;IF NE, YES...IGNORE CONTROL-O”20$:6• INC (R3) ;;;SET OUTPUT COMPLETION STATUS TO IS.SUC– CALL ABOX ;;;ABORT OUTPUT +— CALLR ODONE ;;;SIMULATE FINAL INTERRUPT ˜;I'™; EXIT FROM THE OUTPUT DISCARD STATE. š;R›30$:1œ BIC #S2.CTO,2(R5) ;;;CLEAR OUTPUT DISCARD FLAG$�40$: ž RETURNTŸ.PAGE;'  .SBTTL . I1CTC - CONTROL-C HANDLING2¡;;J¢; I1CTC - FLUSH TYPE-AHEAD BUFFER, THEN PASS CONTROL-C TO INPUT PROCESS.£;T¤I1CTC:¥¦ .IF DF T$$SCA§<¨ BIT #S3.TME,4(R5) ;;;IS TERMINAL MANAGEMENT MODE ENABLED?<© BNE I1DEF ;;;IF NE, YES...DON'T RECOGNIZE CONTROL-C HEREª« .ENDC ;T$$SCA¬­ CALL I1CTX1 ;;;FLUSH TABUF1® CALL I1CTQ ;;;RESUME OUTPUT IF IT WAS STOPPEDT'¯ MOVB #CH.CTC,R2 ;;;RESTORE CHARACTER2)° BR I1DEF1 ;;;GO PROCESS THE CONTROL-C±'² .SBTTL . I1CTX - CONTROL-X HANDLINGC³;NN´; I1CTXL - FLUSH TYPE-AHEAD BUFFER AND ENABLE UNSOLICITED ASTS IF NECESSARY.µ;N ¶I1CTXL::#· CALL LOCKI ;LOCK OUT INTERRUPTSA¸I1CTX:¹ ºI1CTX1:)»¼ .IF DF T$$RED½C¾ BIC #S5.BCC!S5.DAO!S5.VER,U.TST5-U.TSTA(R5) ;;;CLEAR ERROR FLAGS-¿À .ENDC ;T$$REDÁÂ;?Ã; UNLOCK UNSOLICITED INPUT AST CONTROL BLOCK IF THERE IS ONE. Ä; ÅÆ .IF DF T$$CCAÇÈ .IF DF T$$SPLÉAÊ MOV 120000+U.TAST,R3 ;;;GET UNSOLICITED INPUT AST BLOCK IF ONE ËÌ .IFF ;T$$SPLNÍ&Î MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX!Ï BEQ 10$ ;;;IF EQ, NONE...SKIPI>Ð MOV U.TAST(R4),R3 ;;;GET UNSOLICITED INPUT AST BLOCK IF ONEÑÒ .ENDC ;T$$SPLÓ!Ô BEQ 10$ ;;;IF EQ, NONE...SKIPBEÕ BICB #AF.LCK,A.PRM+5(R3) ;;;UNLOCK AST BLOCK IN CASE IT WAS LOCKEDÖ10$:ר .ENDC ;T$$CCAÙÚ;SLÛ; FLUSH THE TYPE-AHEAD BUFFER BY RESETTING THE FILL AND RETRIEVAL POINTERSJÜ; AND THE NUMBER OF ACTIVE BYTES. ALSO CALL SNDXON WHICH WILL OUTPUT AN-Ý; XON IF WE HAVE PREVIOUSLY OUTPUT AN XOFF.Þ;Ußà .IF DF T$$SPLá0â MOV #120000+U.TTBF,R3 ;;;SET POINTER TO TABUFãä .IFF ;T$$SPLNå0æ MOV U.TTAB-U.TSTA(R5),R3 ;;;GET TABUF POINTER-ç BEQ 20$ ;;;IF EQ, NONE...NOTHING TO RESETC2è BIT #1,R3 ;;;IS THIS A SINGLE-CHARACTER TABUF?4é BEQ 30$ ;;;IF EQ, NO...SKIP TO RESET LARGE TABUF8ê CLR U.TTAB-U.TSTA(R5) ;;;FLUSH SINGLE-CHARACTER TABUFë20$:ì RETURN ;;;ALL DONEUí30$:îï .ENDC ;T$$SPLð8ñ CLR (R3)+ ;;;INITIALIZE STORE AND RETRIEVAL POINTERS-ò CLRB (R3) ;;;CLEAR NUMBER OF ACTIVE BYTES,ó CALLR SNDXON ;;;SEND AN XON IF NECESSARYô.PAGE'õ .SBTTL TERMINAL DRIVER INPUT PROCESSA?ö .SBTTL . ICHAR2 - INITIALIZATION AND INPUT STATE RECOGNITIONG÷;Eøù;+7ú; **-ICHAR2 - INITIATE PROCESSING OF INPUT CHARACTER.$û;INü; THIS ROUTINE INITIATES PROCESSING OF A CHARACTER ON THE "INSIDE" (SOFTWARENý; SIDE) OF THE TYPE-AHEAD BUFFER. IT IS ENTERED FROM "I1DEF" ABOVE AND FROMLþ; "NXTIC" IN MODULE TT00œZ};}±|t÷tø tþfDATAODN WHEN A CHARACTER HAS BEEN REMOVED FROM THE TYPE-Lÿ; AHEAD BUFFER FOR PROCESSING. AN ALTERNATE ENTRY POINT "ICH2A" IS CALLEDG; DURING POST-FORK PROCESSING (ROUTINE "FPPFP" IN MODULE TTCIS). THEI'; FOLLOWING ACTIONS MAY BE PERFORMED:G;EH; 1. IF RECEIVER ERROR DETECTION IS SUPPORTED (T$$RED) AND THE CURRENT?; CHARACTER CAUSED AN ERROR, THE PENDING INPUT IS TERMINATEDS+; WITH AN APPROPRIATE COMPLETION STATUS.UE; 2. CONVERSION FROM LOWER TO UPPER CASE IS PERFORMED IF NECESSARY. B; 3. THE CHARACTER IS SAVED IN THE SINGLE-CHARACTER ECHO BUFFER.2; 4. THE INTER-CHARACTER ARRIVAL TIMER IS RESET.F ; 5. DISPATCH TO A PROCESSING ROUTINE DEPENDING ON THE CURRENT INPUT4 ; STATE OR THE TYPE OF CHARACTER BEING PROCESSED.E ; 6. PASS CONTROL TO "I2ECHO" TO INITIATE NECESSARY ECHOING FOR THET ; INPUT CHARACTER.T ;U ; INPUTS:; R2 = CHARACTERT$; R5 => U.TSTA OF THE TERMINAL UCB<; IF THE CHARACTER WILL NEED ECHOING, OUTPUT MUST BE IDLE.;E ; OUTPUTS:S3; R2 = CHARACTER (IF CONTROL PASSED TO "I2ECHO")H; R4 => UCBX FOR THE TERMINALI;C#; REGISTERS ALTERED: R2, R3, R4 ;-; ICHAR2:: .IF DF T$$SPL, MOV #120000,R4 ;;;SET POINTER TO THE UCBX  .IFF ;T$$SPLE!." MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX POINTER6# BEQ I1RET ;;;IF EQ, NONE...RETURN (COULD HAPPEN.../$ ;;; ...WHEN CTRL-C IS TYPED ON AN IDLE...A*% ;;; ...SLAVED TERMINAL, FOR EXAMPLE)&' .IFTF ;T$$SPL() .IF DF T$$RED*+;TL,; EXAMINE THE INPUT CHARACTER TO DETECT A HARD RECEIVE ERROR. IF THERE IS@-; ONE, TERMINATE THE CURRENT INPUT WITH AN APPROPRIATE STATUS..; ;/ BIT #S5.BCC!S5.DAO!S5.VER,R2 ;;;ANY HARD RECEIVE ERRORS?S.0 BEQ 20$ ;;;IF EQ, NO...SKIP ERROR CHECKING91 MOV #IE.DAO&377,R3 ;;;ASSUME ERROR DUE TO DATA OVERRUNR2 ASSUME S5.DAO,400003 ROL R2 ;;;DATA OVERRUN?;(4 BMI 10$ ;;;IF MI, YES...RETURN ERROR65 MOV #IE.BCC&377,R3 ;;;ASSUME FRAMING ERROR OCCURRED6 ASSUME S5.BCC,S5.DAO/2R7 ROL R2 ;;;FRAMING ERROR?(8 BMI 10$ ;;;IF MI, YES...RETURN ERROR99 MOV #IE.VER&377,R3 ;;;ELSE, ERROR MUST BE PARITY ERRORT:10$:; ASSUME U.TCI,0$< MOV R3,@(R4)+ ;;;STORE ERROR CODE)= JMP IDONE ;;;FINISH THE INPUT REQUESTI>20$:?@ .ENDC ;T$$REDAB .IFT ;T$$SPLRCBD MOVB R2,U.TECO-U.TSTA(R5) ;;;SAVE THE CHARACTER BEING PROCESSEDEF .IFF ;T$$SPLG;H MOVB R2,U.TECB(R4) ;;;SAVE THE CHARACTER BEING PROCESSED;IJ .ENDC ;T$$SPLKL;,M; RESET THE INTER-CHARACTER ARRIVAL TIMER.N;RO .IF NE T$$UTOP4Q MOVB #T$$UTO,U.TITI(R4) ;;;INITIALIZE INPUT TIMERRS .ENDC ;T$$UTOTU ASSUME S1.USI,100000./V TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?J W BMI 30$ ;;;IF MI, YES...SKIPX ASSUME U.TCI,03Y MOV (R4),R3 ;;;GET CURRENT INPUT REQUEST PACKETU?Z MOVB I.PRM+6(R3),U.TITI(R4) ;;;INIT USER-DEFINED TIMER VALUEF[30$:\;/]; DETERMINE ACTION DEPENDENT ON U.TSTA FLAGS.N^;C_` .IF DF T$$ACDaCb MOV #UA.PRO!UA.ECH!UA.PUT,U.AFLG-U.TSTA(R5) ;;;SET DEFAULT FLAGS.*c BIT #S1.RNE,(R5) ;;;DOING READ NO ECHO?d BEQ 35$ ;;;BR IF NOR4e BIC #UA.ECH,U.AFLG-U.TSTA(R5) ;;;INDICATE NO ECHOf35$::g TST U.ACB-U.TSTA(R5) ;;;DOES THIS TERMINAL HAVE AN ACD?.h BEQ 40$ ;;;IF EQ, NO...SKIP ACD PROCESSING4i MOV R0,-(SP) ;;;SAVE REGISTER NEEDED FOR ACD CALL9j MOV #A.PROC,R0 ;;;SET CHARACTER PROCESSING ENTRY POINT:k CALL $SWACD ;;;CALL ACDD#l MOV (SP)+,R0 ;;;RESTORE REGISTERAm BIT #UA.PRO,U.AFLG-U.TSTA(R5) ;;;PROCESS THIS CHARACTER AS IS?)4n BEQ I2ECHO ;;;IF EQ, NO...TREAT AS READ-PASS-ALLo40$:pq .ENDC ;T$$ACDr,s BIT #S3.RUB,4(R5) ;;;RUB-OUT IN PROGRESS?t BEQ 50$ ;;;SKIP IF NOT$u JMP I2RUB1 ;;;DO RUBOUT SEQUENCEv50$:w .IF DF T$$ESCx-y BIT #S1.ESC,(R5) ;;;IN AN ESCAPE SEQUENCE?Pz BEQ 60$ ;;;IF EQ, NO...SKIP 3{ JMP I2ESC2 ;;;CONTINUE WITH THE ESCAPE SEQUENCEN|60$:}~ .IFTF ;T$$ESC .IF DF T$$OOB ;SA458 ;SA458. MOV R4,-(SP) ;;;SAVE REGISTERS... ;SA4588 MOV R0,-(SP) ;;;THAT AR00œb}‡|Ž{´cÚµcÛ¶c�·c›’E DESTROYED BY OOBCHK ;SA4580 CALL OOBCHK ;;;WAS THIS CHAR. OOB? ;SA458. MOV (SP)+,R0 ;;;RESTORE REGISTERS ;SA458" MOV (SP)+,R4 ;;;... ;SA4587 BCS I2ECHO ;;;CS->OOB->NO SPECIAL FUNCTIONS ;SA458T ;SA458 .ENDC ;T$$OOB ;SA458 ;SA4582€ BIT #S1.RST,(R5) ;;;READ WITH TERMINATOR TABLE?<� BEQ 70$ ;;;IF EQ, NOT DOING READ-WITH-TERMINATORS...SKIP‚ƒ .IFT ;T$$ESC „B…; IF THIS IS NOT AN EXTENDED I/O, CHECK FOR SPECIAL TERMINATORS.@†; IF THIS IS EXTENDED I/O, AND THE CHARACTER IS AN ESCAPE WITHC‡; ESCAPE SEQUENCES RECOGNIZED, ALLOW THIS TO START AN ESCAPE SEQ4!ˆ; RATHER THAN TERMINATE A READ.4‰Š .IF DF T$$EIO‹(Œ BIT #S6.EIO,U.TST6-U.TSTA(R5) ;;;EIO?0� BEQ 65$ ;;;EQ, NOT EIO, CHECK FOR TERMINATORFŽ BIT #U2.ESC,U.CW2-U.TSTA(R5) ;;;DOES TERMINAL GENERATE ESCAPE SEQ.?#� BEQ 65$ ;;;IF EQ, CHECK FOR RST-7� BIT #S1.RES,(R5) ;;;DOES TASK WANT ESCAPE SEQUENCES? )‘ BEQ 65$ ;;;IF EQ,NO .. CHECK FOR RSTE(’ CMPB R2,#CH.ESC ;;;IS THIS AN ESCAPE?)“ BEQ 70$ ;;;IF ESC, SKIP CHECK FOR RSTA)” CMPB R2,#233 ;;;IS THIS A CSI ESCAPE?R)• BEQ 70$ ;;;IF CSI, SKIP CHECK FOR RST –65$:—˜ .ENDC ;T$$EIO™ .ENDC ;T$$ESCš0› CALL I2RST ;;;CHECK FOR A SPECIAL TERMINATOR3œ ;;;IF WE RETURN, CHARACTER WAS NOT TERMINATOR(+� ;;;IF TERMINATOR, STATUS HAS BEEN SETžŸ70$:6Ÿ BIT #S1.PTH,(R5) ;;;TERMINAL IN PASSTHRU ? ;SA468;¡ BNE I2ECHO ;;;IF NE, YES...PROCESS CHARACTER NOW ;**-1O>¡ BIT #S1.RSP,(R5) ;;;TERMINAL IN SPECIAL PROCESSING? ;SA468=¡ BNE CASCHK ;;;NE => YES CHECK FOR CASE CONVERSION ;SA468 ¢;£ .SBTTL . ICH2A - DISPATCH DEPENDING ON CURRENT CHARACTER¤;NL¥; ICH2A - DETERMINE ACTION DEPENDENT ON CHARACTER. SPECIAL CHARACTERS AREF¦; DIVIDED INTO TWO DISPATCH TABLES. IF THE CURRENT CHARACTER IS NOTC§; IN THE FIRST TABLE, THE DISPATCH WILL BE TO "EDDEF". HERE, THETD¨; EDIT CHARACTER (OTHER THAN ^R, ^U, AND DELETE) DISPATCH TABLE ISD©; CHECKED. IF NOT IN THAT TABLE, PROCESSING CONTINUES AT "I2DEF".ª;N « .ENABL LSBB¬­ .IF DF T$$EIO®:¯ BIT #S1.RNF,(R5) ;;;ARE WE DOING A READ WITH NO FILTER?<° BNE EDDEF ;;;IF NE, YES...SKIP THE CHECK FOR EDIT CHARS.±² .ENDC ;T$$EIO³ ´ICH2A:: =µ MOV #EDCRT,R3 ;;;POINT TO EDIT CHARACTER RECOGNITION TABLEI0¶ CMPB R2,#CH.SP ;;;IS CHARACTER IN THIS TABLE?*· BLO 10$ ;;;IF LO, YES...SCAN THE TABLE2¸ CMPB R2,#CH.RUB ;;;ELSE, IS CHARACTER A RUBOUT?9¹ BNE I2DEF ;;;IF NE, NO...MUST BE A "NORMAL" CHARACTERE$º BR 10$ ;;;COULD BE IN THIS TABLE»;I¼; EDDEF - CHARACTER IS NOT IN FIRST RECOGNITION TABLE. SEE IF IT IS AN :½; ENABLED EDIT CHARACTER (OTHER THAN ^R, ^U, OR RUBOUT).¾;E ¿EDDEF:: 6À MOV #I2CRT,R3 ;;;ASSUME WE WANT TO SCAN FIRST TABLEÁ10$:3 CALLR CHRDSP ;;;DISPATCH ACCORDING TO CHARACTER Ã Ä .DSABL LSBRÅ; RÆ; I2DEF - IF THE TERMINAL DOES NOT SUPPORT LOWERCASE, SEE IF THE INPUT CHARACTERFÇ; IS ONE OF THE ALTERNATE ESCAPE CHARACTERS (RIGHT BRACE AND TILDE).È;HIÉ; EKDEF - COME HERE TO ECHO TERMINATOR IN READ WITH SPECIAL TERMINATORS Ê;T ËEKDEF::EÌ ÍI2DEF::.+Î CMPB R2,#233 ;;;SPECIAL CASE CSI ESCAPER)Î BNE CASCHK ;;;BRANCH AROUND ;SA468D8Ð JMP I2ESC ;;;TO ALLOW IT TO START ESCAPE SEQ. ;**-1ÐCASCHK: ;SA468SÒ .IF DF T$$EIO ;**-1RÓ?Ô BIT #S6.RLU,U.TST6-U.TSTA(R5) ;;;DOING CONVERT TO UPPERCASE?TÕ BNE 5$ ;;;BR IF YESFÖ× .ENDC ;T$$EIOØCÙ BIT #U2.LWC,U.CW2-U.TSTA(R5) ;;;DOES TERMINAL SUPPORT LOWERCASE?7Ú BNE I2ECHO ;;;IF NE, YES...SKIP OTHER ESCAPE CHECKS Ú5$: ;SA468>Ú BIT #S1.RSP,(R5) ;;;TERMINAL IN SPECIAL PROCESSING? ;SA468CÚ BNE I2CASE ;;;NE => YES => NOT TERM BUT NEEDS CONVERSION ;SA468C:Ú CMPB R2,#CH.RBR ;;;IS CHARACTER A RIGHT BRACE? ;SA4685Ü BEQ 10$ ;;;IF EQ, YES...TREAT AS AN ESCAPE ;**-1T+Ý CMPB R2,#CH.TLD ;;;IS CHARACTER A TILDE?O8Þ BNE I2CASE ;;;IF NE, NO...SKIP TO DO CASE CONVERSION)ß ;;;OTHERWISE, TREAT IT AS AN ESCAPEDà10$:8á JMP I2ESC1 ;;;PROCESS ESCAPE CHARACTER A00œj};}±|t÷tø tþfDATAS TERMINATORâ;T5ã; I2CASE - CONVERT LOWER TO UPPER CASE IF REQUIRED.Rä;5 åI2CASE:A3æ CMPB R2,#340 ;;;EIGHT-BIT LOWER CASE CHARACTER?E<ç BHI 10$ ;;;IF HIS, YES...CONVERT TO EIGHT-BIT UPPER CASE)è CMPB R2,#CH.LCZ ;;;UPPER END GRAPHICS?4,é BHI I2ECHO ;;;IF HI, YES...DON'T CONVERT(ê CMPB R2,#CH.LCA ;;;LOWER CASE LETTER?+ë BLO I2ECHO ;;;IF LO, NO...DON'T CONVERT.ì10$:=í BICB #40,R2 ;;;CONVERT CHARACTER FROM LOWER TO UPPER CASEDîï .IF DF T$$SPLð;ñ MOVB R2,U.TECO-U.TSTA(R5) ;;;UPDATE SAVED CHARACTER ALSOCòó .IFF ;T$$SPL ô4õ MOVB R2,U.TECB(R4) ;;;UPDATE SAVED CHARACTER ALSOö÷ .ENDC ;T$$SPLøù;ELú; FALL THRU TO "I2ECHO" TO PROCESS CHARACTER WITHOUT SPECIAL SIGNIFICANCE.û;;ü.PAGEN8ý .SBTTL . I2ECHO - INITIATE ECHO OF AN INPUT CHARACTERþ;Cÿ;-O; **-I2ECHO - PUT CHARACTER IN INPUT BUFFER AND INITIATE ECHOING IF NECESSARY0;N; THIS ROUTINE PROCESSES A CHARACTER THAT HAD NO SPECIAL SIGNIFICANCE DURINGI; PROCESSING IN "ICHAR2" AND "ICH2A". THE FOLLOWING ACTIONS MAY OCCUR:; ;; 1. THE CHARACTER IS PLACED IN THE CURRENT INPUT BUFFER. C; 2. IF ECHO IS SUPPRESSED, A TRANSFER IS MADE TO THE "ECHO DONE"O7; PROCESSING ROUTINES TO CHECK FOR INPUT COMPLETION.G@; 3. ECHO OF THE CHARACTER OR AN EXPANSION OF THE CHARACTER IS ; INITIATED.E ; ; INPUTS: ; R2 = CHARACTERN ; R4 => UCBX FOR THE TERMINAL$; R5 => U.TSTA OF THE TERMINAL UCB0; IF ECHOING IS REQUIRED, OUTPUT MUST BE FREE.;I; OUTPUTS: NONEC; ; REGISTERS MODIFIED: R2, R3;-; I2ECHO:A .IF DF T$$ACDB BIT #UA.PUT,U.AFLG-U.TSTA(R5) ;;;PUT CHARACTER IN INPUT BUFFER? BEQ 10$ ;;;IF EQ, NO...SKIPS .IFTF ;T$$ACD8 BIT #S1.RST,(R5) ;;;DOING READ W/ SPECIAL TERMINATORS.  BEQ 5$ ;;;IF NOT, THIS SHOULD GO IN BUFFER!" ASSUME U.TCI,02#%$ TST @(R4) ;;;HAS STATUS BEEN SET?I/% BNE 10$ ;;;IF IT HAS, THIS WAS A TERMINATORF&5$:G0' CALL PUTNIC ;;;PUT CHARACTER IN INPUT BUFFER(10$:)* .IFT ;T$$ACDS+;, BIT #UA.SPE,U.AFLG-U.TSTA(R5) ;;;SPECIAL ECHO REQUESTED?A"- BEQ I2ECHA ;;;IF EQ, NO...SKIP.I2SPE:3/ MOV U.ACB-U.TSTA(R5),R2 ;;;GET ACD CONTROL BLOCKOA0 ADD #A.IMAP,R2 ;;;POINT TO INTERRUPT BUFFER PARAMETERS OFFSETSA;1 MOV (R2)+,U.TOP(R4) ;;;SET ECHO BUFFER APR BIAS (A.IMAP)O32 MOV (R2)+,R3 ;;;SET ECHO BUFFER ADDRESS (A.IBUF) 23 MOV (R2),R2 ;;;SET ECHO BUFFER LENGTH (A.ILEN);4 CALLR MECHO ;;;OUTPUT THE SPECIAL ECHO USING MULTI-ECHOT 5I2ECHA: 76 BIT #UA.ECH,U.AFLG-U.TSTA(R5) ;;;ECHO THE CHARACTER?U67 BEQ ECHD2 ;;;IF EQ, NO...PRETEND AN ECHO COMPLETED89 .ENDC ;T$$ACD:*; BIT #S1.RNE,(R5) ;;;IS ECHO SUPPRESSED?7< BNE ECHD2 ;;;IF NE, YES...PRETEND AN ECHO COMPLETEDP4= BIT #S1.PTH,(R5) ;;;IS TERMINAL IN PASSTHRU MODE?7> BNE I2ECHC ;;;IF NE, YES...ECHO CHARACTER AS ITSELFS?;HR@; I2EXPC - PERFORM CHARACTER EXPANSION AND INITIATE ECHO OF CHARACTER OR STRING.A;M BI2EXPC:T=C CALL EXPCHR ;;;EXPAND CHARACTER TO GET PROPER ECHO STRINGE9D BEQ I2ECHC ;;;IF EQ, SKIP TO ECHO CHARACTER AS ITSELF 9E BCC 10$ ;;;IF CC, NO DEFERRED ECHO IS REQUIRED...SKIPA7F BIS #S1.DEC,(R5) ;;;INDICATE DEFERRED ECHO IS NEEDEDEG10$:6H CALLR ECHSTR ;;;ECHO STRING DESCRIBED BY R2 AND R3I;5KJ; I2ECHC - ECHO THE CHARACTER STORED IN THE SINGLE-CHARACTER ECHO BUFFER.CK;S LI2ECHC:MN .IF DF T$$SPLO4P MOV R5,R3 ;;;SET UP R3 TO POINT TO THE SINGLE...@Q ADD #U.TECO-U.TSTA,R3 ;;; ...CHARACTER ECHO BUFFER IN THE UCBRS .IFF ;T$$SPLET4U MOV R4,R3 ;;;SET UP R3 TO POINT TO THE SINGLE...:V ADD #U.TECB,R3 ;;; ...CHARACTER ECHO BUFFER IN THE UCBXWX .ENDC ;T$$SPLY>Z CALLR ECHCHR ;;;ECHO THE SINGLE CHARACTER POINTED TO BY R3[.PAGEN=\ .SBTTL . ECHD1 - COMPLETE PROCESSING OF AN INPUT CHARACTER ];D^;+@_; **-ECHD1 - PROCESS COMPLETION OF A CHARACTER OR STRING ECHO.`;LIa; THIS ROUTINE IS ENTERED WHEN AN ECHO IS DONE. IT PERFORMS ONE OF THEU?b; FOLLOWING ACTIONS (LISTED FROM HIGHEST TO LOWEST PRIORITY):$c;00œr}‡|Ž{´cÚµcÛ¶c�·c›’@d; 1. IF DEFERRED PROCESSING IS REQUIRED, PICK UP THE CHARACTER:e; SAVED IN THE SINGLE-CHARACTER ECHO BUFFER AND PROCESSf; IT FROM THE BEGINNING.HBg; 2. IF DEFERRED ECHO IS REQUIRED, JUST ECHO THE CHARACTER SAVED)h; IN THE SINGLE-CHARACTER ECHO BUFFER.UGi; 3. IF THE CURRENT INPUT HAS COMPLETED, REQUEST A FORK TO HANDLE IT.RHj; 4. DISPATCH ON THE CURRENT INPUT STATE VARIABLE (U.TISV). THIS WILLAk; EITHER CONTINUE ECHOING OF SPECIAL CASES (E.G. ^R AND ^U) ORTDl; WILL MAKE A FORK REQUEST TO GET THE NEXT AVAILABLE I/O REQUEST.Pm; THE ALTERNATE ENTRY POINT "ECHD2" IS ENTERED WHEN PROCESSING FOR A CHARACTER,n; IS COMPLETED AND NO ECHOING IS REQUIRED.o;D p; INPUTS:q; R4 => UCBX FOR THE TERMINALD$r; R5 => U.TSTA OF THE TERMINAL UCBs; S1.OBY = 0 (OUTPUT IDLE)t; u; OUTPUTS:Rv; UCB UPDATED AS REQUIREDw;. x; REGISTERS MODIFIED: R2, R3y;-z; {ECHD1::T6| MOVB 1(R5),R3 ;;;GET DEFERRED PROCESSING/ECHO FLAGS}~ .IF DF T$$ACD@€ BIT #UA.CAL,U.AFLG-U.TSTA(R5) ;;;CALL ACD BACK FOR MORE ECHO?� BEQ 10$ ;;;IF EQ, NO...SKIPH ‚ MOV R0,-(SP) ;;;SAVE REGISTER3ƒ MOV #A.CALL,R0 ;;;SET ECHO CALL BACK ENTRY POINTI„ CALL $SWACD ;;;CALL THE ACD=#… MOV (SP)+,R0 ;;;RESTORE REGISTER.3† BR I2SPE ;;;BRANCH BACK TO CONTINUE ECHO OUTPUT)‡10$:ˆ‰ .ENDC ;T$$ACDŠ‹ .IF DF T$$SPLŒG� MOVB U.TECO-U.TSTA(R5),R2 ;;;RETRIEVE CHARACTER (IN CASE DEFERRED...5,Ž ;;; ...PROCESSING OR ECHO IS REQUIRED)�� .IFF ;T$$SPL‘@’ MOVB U.TECB(R4),R2 ;;;RETRIEVE CHARACTER (IN CASE DEFERRED...,“ ;;; ...PROCESSING OR ECHO IS REQUIRED)”• .ENDC ;T$$SPL–B— BIC #S1.DPR!S1.DEC,(R5) ;;;CLEAR DEFERRED PROCESSING/ECHO FLAGS˜ ASSUME S1.DPR,400+™ ROR R3 ;;;DEFERRED PROCESSING REQUIRED?;&š BCS ICH2A ;;;IF CS, YES...GO DO IT› ASSUME S1.DEC,S1.DPR*2%œ ROR R3 ;;;DEFERRED ECHO REQUIRED?O'� BCS I2EXPC ;;;IF CS, YES...GO DO ITCž;EEŸ; ECHD2 - CHECK TO SEE IF THE CURRENT INPUT BUFFER HAS BEEN FILLED.T ;¡ECHD2:¢£;BH¤; EKESC,EKAES - ESCAPE OR ALTERNATE ESC WAS SEEN AS SPECIAL TERMINATOR¥;E ¦EKESC::I §EKAES::¨© .IF DF T$$ACDª3« BIT #UA.COM,U.AFLG-U.TSTA(R5) ;;;COMPLETE INPUT?O¬ BEQ 10$ ;;;IF EQ, NO...SKIPR3­ MOV U.ACB-U.TSTA(R5),R3 ;;;GET ACD CONTROL BLOCKA4® MOV A.IOS(R3),@(R4)+ ;;;SET I/O COMPLETION STATUS&¯ BR IDONE ;;;FORK TO COMPLETE INPUT°10$:±² .ENDC ;T$$ACD³´ ASSUME U.TCI,0 4µ TSTB @(R4)+ ;;;HAS A COMPLETION STATUS BEEN SET?8¶ BNE IDONE ;;;IF NE, YES...FORK TO COMPLETE THE INPUT1· TST U.TIC-2(R4) ;;;IS THE CURRENT BUFFER FULL?T¸ BNE 20$ ;;;IF NE, NO...SKIP3¹ BIT #S1.IBF,(R5) ;;;ARE WE DOING BUFFERED INPUT?A7º BEQ IDONE ;;;IF EQ, NO...FORK TO COMPLETE THE INPUTR»;MG¼; WE ARE DOING BUFFERED INPUT, AND JUST FILLED UP THE CURRENT BUFFER. F½; SEE IF THERE IS ANOTHER BUFFER LINKED TO THE CURRENT (COULD BE THEF¾; CASE IF THE OPERATOR DID RUBOUT OR CTRL-U, OR IF WE ARE PROCESSINGG¿; CTRL-R ECHO). IF THERE IS, UPDATE UCB. IF THERE IS NOT, FORK TO GETOÀ; ANOTHER BUFFER.TÁ;T ASSUME U.TIP,U.TCI+2TÃ3Ä MOV @(R4)+,R2 ;;;GET NEXT BUFFER IF THERE IS ONE#<Å BEQ IDONE1 ;;;IF EQ, THERE IS NONE...FORK TO GET ANOTHERÆ ASSUME U.TTIC,U.TIP+6%Ç CMP (R4)+,(R4)+ ;;;POINT TO U.TTICB)È CALL NXTIB ;;;START USING NEXT BUFFERN8É BEQ IDONE1 ;;;IF EQ, NOT ONE...WE ARE DONE AFTER ALL)Ê CMP -(R4),-(R4) ;;;POINT BACK TO U.TIPPË;RPÌ; CONSULT INPUT STATE VARIABLE TO SEE WHAT TO DO NEXT. NOTE THAT IN AN ESCAPEPÍ; SEQUENCE, THE STATE VARIABLE IS USED WHEN THE NEXT CHARACTER OF THE SEQUENCENÎ; ARRIVES...NOT WHEN A PREVIOUS CHARACTER HAS BEEN ECHOED, WHERE WE ARE NOW.NÏ; SO IF WE ARE IN AN ESCAPE SEQUENCE, JUST FORK FOR THE NEXT REQUEST PACKET.Ð;(Ñ20$:*Ò TST -(R4) ;;;POINT BACK TO TOP OF UCBXÓÔ .IF DF T$$ESCÕÖ;IJ×; THE FOLLOWING ASSUMES THAT THE FIRST ENTRY IN THE INPUT STATE DISPATCHIØ; TABLE POINTS TO "CFGRQ", WHICH WILL FORK TO GET A NEW REQUEST PACKET.NÙ; -Ú CLR R2 ;;;SET UP FOR STATE TABLE DISPATCH BÛ BIT #00œz};}±|t÷tø tþfDATAS1.ESC,(R5) ;;;ARE WE IN THE MIDDLE OF AN ESCAPE SEQUENCE?9Ü BNE NXSTA1 ;;;IF NE, YES...SKIP NORMAL STATE DISPATCH ÝÞ .ENDC ;T$$ESCßà;NRá; NXSTAT - DISPATCH ON THE CURRENT VALUE OF THE INPUT STATE VARIABLE. THIS WILLNâ; SEQUENCE THROUGH THE INPUT STATES UNTIL IT FORKS FOR A NEW REQUEST PACKET.ã;U äNXSTAT:E+å MOVB U.TISV(R4),R2 ;;;GET STATE VARIABLE æ ASL R2 ;;;MAKE WORD INDEXW çNXSTA1: 6è CALLR @ISDSP(R2) ;;;DISPATCH ON CURRENT INPUT STATEéCê .SBTTL . IDONE - QUEUE FORK REQUEST FOR INPUT REQUEST COMPLETIONAë;AJì; IDONE - QUEUE A FORK REQUEST BECAUSE A TERMINATOR CHARACTER WAS SEEN.Hí; THE LINK WORD IN THE PACKET CONTAINS THE COMPLETION STATUS (IF IT IS<î; A SOLICITED READ). THE INPUT STATE FLAGS ARE ALSO RESETMï; IDONE1 - QUEUE A FORK REQUEST BECAUSE THE (CURRENT) INPUT BUFFER IS FULL.Mð;. ñIDONE:: 7ò CALL IRESET ;;;RESET THE TERMINAL INPUT STATE FLAGS óIDONE1:=ô MOV #FR.IRD,R3 ;;;FORK TO PROCESS INPUT REQUEST COMPLETIONBõ CALLR FORK ;;;DO ITRö.PAGERA÷ .SBTTL . SPECIAL INPUT STATE AND CHARACTER PROCESSING ROUTINES 2ø .SBTTL . I2RST - READ WITH SPECIAL TERMINATORSù;Rú;-;û; **-I2RST - READ WITH SPECIAL TERMINATORS IS IN PROGRESSIü; Ný; THIS ROUTINE CHECKS THE CURRENT CHARACTER AGAINST THE PRE-DEFINED "SPECIALJþ; TERMINATORS" OR AGAINST THE CURRENT USER-SPECIFIED TERMINATOR TABLE TOLÿ; SEE IF THE CURRENT INPUT REQUEST SHOULD BE COMPLETED. IF SO, AND IF THEQ; TERMINATOR IS NOT TO BE ECHOED, THE RETURN ADDRESS (FROM "ICHAR2") IS DELETED.N; AND THE INPUT IS TERMINATED. IF THE TERMINATOR NEEDS TO BE ECHOED, STATUSR; IS SET AND A RETURN TO ICHAR2 IS EXECUTED FOR ECHO AND TERMINATION. OTHERWISE,); THE CHARACTER IS RETURNED UNMODIFIED.U;C ; INPUTS:; R2 = CHARACTER ; R4 => UCBX FOR THE TERMINALM$; R5 => U.TSTA OF THE TERMINAL UCB ;I ; OUTPUTS: NONE ; ; REGISTERS MODIFIED: NONE ;-;EI2RST:4 MOV R3,-(SP) ;;;SAVE REGISTER USED BY THE ROUTINE8 TST U.TRTT(R4) ;;;USER-SPECIFIED TERMINATORS PRESENT? BEQ 10$ ;;;IF EQ, NO...SKIPE;I7; CHECK CHARACTER AGAINST USER-DEFINED TERMINATOR SET ;H2 MOV R2,R3 ;;;GET A COPY OF THE TYPED CHARACTER4 BIC #177417,R3 ;;;CLEAR ALL BUT HIGH ORDER 4 BITS .IF DF R$$EIS ASH #-3,R3 ;;;DIVIDE BY 8. .IFF ;R$$EIS. ASR R3 ;;;DIVIDE BY 8.  ASR R3 ;;;! ASR R3 ;;;"# .ENDC ;R$$EIS$8% ADD U.TRTT(R4),R3 ;;;ADD TABLE BASE ADDRESS TO OFFSET)& MOV R2,-(SP) ;;;SAVE CURRENT CHARACTER-7' BIC #177760,R2 ;;;THIS TIME LOOK AT LOW ORDER 4 BITS./( ASL R2 ;;;CONVERT FROM BYTE TO WORD OFFSETFA) BIT $BTMSK(R2),(R3) ;;;SEE IF MATCHES AGAINST TERMINATOR TABLED7* BEQ 30$ ;;;IF EQ, IT DOESN'T...PROCESS NORMAL CHAR. $+ MOV (SP)+,R2 ;;;RESTORE CHARACTER', BR 20$ ;;;CHARACTER IS A TERMINATORR-;.9.; CHECK CHARACTER AGAINST NORMAL "SPECIAL TERMINATORS". /;010$:/1 CMPB R2,#CH.SP ;;;IS IT A CONTROL CHARACTER?L.2 BLO 20$ ;;;IF LO, YES...IT IS A TERMINATOR13 CMPB R2,#CH.RBR ;;;IS IT A "NORMAL" CHARACTER?E24 BLO 40$ ;;;IF LO, YES...IT IS NOT A TERMINATOR%5 CMPB R2,#CH.RUB ;;;IS IT A RUBOUT?(.6 BEQ 20$ ;;;IF EQ, YES...IT IS A TERMINATOR;7 CMPB R2,# ;;;EIGHT-BIT NON-CONTROL CHARACTER? 48 BHIS 40$ ;;;IF HIS, YES...IT IS NOT A TERMINATOR09 CMPB R2,#200 ;;;EIGHT-BIT CONTROL CHARACTER?0: BHIS 20$ ;;;IF HIS, YES...IT IS A TERMINATOR>; BIT #U2.LWC,U.CW2-U.TSTA(R5) ;;;TERMINAL SUPPORT LOWERCASE?9< BNE 40$ ;;;IF NE, YES...175-176 ARE NORMAL CHARACTERSR=;SJ>; TERMINATOR FOUND - SET COMPLETION STATUS TO IS.SUC WITH THE TERMINATORL?; IN THE HIGH BYTE. ** NOTE ** THE CHARACTER IS NOT STORED IN THE BUFFER.@;MA20$:&B MOV R2,R3 ;;;GET COPY OF CHARACTER*C SWAB R3 ;;;GET TERMINATOR IN HIGH BYTED CLRB R3 ;;;CLEAR LOW BYTE$E INC R3 ;;;SET IS.SUC IN LOW BYTEFG ASSUME U.TCI,0 HI MOV R3,@(R4) ;;;STORE STATUSJ MOV (SP)+,R3 ;;;RESTORE R3 *K TST (SP)+ ;;;GET RID OF RETURN ADDRESS4L BIT #S1.TNE!S1.RNE,(R5) ;;;SHOULD THIS BE E00œ‚}‡|Ž{´cÚµcÛ¶c�·c›’CHOED?M BNE 25$ ;;;IF NO ECHO BR>N MOV #EKCRT,R3 ;;;CHARACTER RECOGNITION TABLE FOR TERM.ECHO. O CALLR CHRDSP ;;;AND DISPATCHP25$:1Q BR IDONE ;;;REQUEST FORK FOR INPUT COMPLETIONTR30$:$S MOV (SP)+,R2 ;;;RESTORE CHARACTERT40$:#U MOV (SP)+,R3 ;;;RESTORE REGISTERT!V50$: RETURN ;;;BACK TO CALLER WX.PAGEA=Y .SBTTL . I2ESC* - ESCAPE SEQUENCE AND TERMINATOR HANDLINGPZ; [;-J\; **-I2ESC - REAL ESCAPE CHARACTER SEEN; POSSIBLY START ESCAPE SEQUENCE7]; **-I2AES - ALTERNATE ESCAPE CHARACTER WAS DETECTED 2^; **-I2ESC1 - TERMINATE INPUT WITH IS.ESC STATUS<_; **-I2ESC2 - CONTINUE PROCESSING OF INPUT ESCAPE SEQUENCE`;NKa; THESE ROUTINES HANDLE ESCAPE AND ESCAPE SEQUENCE PROCESSING AS FOLLOWS:Cb;TAc; 1. UPON ENTRY AT I2ESC, IF THE TERMINAL IS SET UP TO GENERATE;<d; ESCAPE SEQUENCES AND THE ATTACHED TASK CAN ACCEPT THEM,9e; ESCAPE SEQUENCE MODE IS ESTABLISHED. OTHERWISE, THE 6f; ESCAPE TERMINATES THE CURRENT INPUT VIA "I2ESC1".Ag; 2. ENTRY AT I2AES OCCURS IF AN ALTERNATE ESCAPE CHARACTER WAS h; (OCTAL 37) WAS DETECTED.HDi; 3. ENTRY AT I2ESC1 WILL CAUSE THE CURRENT INPUT TO BE TERMINATEDj; WITH A STATUS OF IS.ESC.SHk; 4. I2ESC2 IS ENTERED TO PROCESS SUBSEQUENT CHARACTERS OF THE CURRENT@l; ESCAPE SEQUENCE. SYNTAX RULES ARE CHECKED DEPENDING ON THE>m; INPUT STATE VARIABLE, U.TISV. WHEN THE LAST CHARACTER OF>n; A VALID SEQUENCE IS RECEIVED, THE INPUT IS COMPLETED WITHo; THE STATUS IS.ESQ.PDp; 5. A "RUBOUT" CHARACTER WILL CAUSE ALL CHARACTERS RECEIVED SINCE=q; AN ESCAPE CHARACTER TO BE REMOVED FROM THE INPUT BUFFER. Fr; 6. A SYNTAX ERROR WILL TERMINATE THE INPUT WITH THE STATUS IE.IES.s;S t; INPUTS:!u; R2 = CURRENT INPUT CHARACTERQv; R4 => UCBX FOR THE TERMINAL$w; R5 => U.TSTA OF THE TERMINAL UCBx;Ey; OUTPUTS: NONEz;P${; REGISTERS MODIFIED: R2, R3, R4|;-};E ~I2ESC::A€ .IF DF T$$ESC�F‚ BIT #U2.ESC,U.CW2-U.TSTA(R5) ;;;DOES TERMINAL GENERATE ESCAPE SEQ.?-ƒ BEQ I2ESC1 ;;;IF EQ, NO...TERMINATE INPUTD7„ BIT #S1.RES,(R5) ;;;DOES TASK WANT ESCAPE SEQUENCES?N"… BEQ I2ESC1 ;;;IF EQ, NO...SKIP† ASSUME S1.USI,100000W/‡ TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?22ˆ BMI I2ESCU ;;;IF MI, YES...TERMINATE THE INPUT‰10$:1Š BIS #S1.ESC,(R5) ;;;ENTER ESCAPE SEQUENCE MODE ‹ TSTB R2 ;;;IS THIS CSI ESC?SŒ BPL I2ESC3 ;;;BR IF NO=� MOVB #17,U.TISV(R4) ;;;ESTABLISH OFFSET FOR CSI ESC. SEC.C-Ž BR I2ESC3 ;;;STORE THE CHARACTER AND EXITA�;Q4�; I2AES - ALTERNATE ESCAPE CHARACTER WAS DETECTED.‘;#’3“ .IFTF ;T$$ESC ;;;LABEL SHOULD ALWAYS BE DEFINEDI” •I2AES::,–— .IFT ;T$$ESC ˜F™ BIT #U2.ESC,U.CW2-U.TSTA(R5) ;;;TERMINAL GENERATE ESCAPE SEQUENCES?;š BEQ J2EDDF ;;;IF EQ, NO...PROCESS AS A NORMAL CHARACTERE›œ .IFTF ;T$$ESC�ž;E8Ÿ; I2ESC1 - TERMINATE CURRENT INPUT WITH STATUS IS.ESC. ;I ¡I2ESC1:V5¢ BIT #S1.RST,(R5) ;;;READ WITH SPECIAL TERMINATORS?C£ BNE I2ESC3 ;;;BR IF SO (NE)A¤ ASSUME U.TCI,0Q ¥I2ESCU: 8¦ MOV #IS.ESC,@(R4)+ ;;;SET COMPLETION STATUS TO IS.ESC4§ BR IDONE ;;;REQUEST A FORK TO COMPLETE THE INPUT¨© .IFT ;T$$ESCFª«; A¬; I2ESC2 - PROCESS SUBSEQUENT CHARACTERS OF AN ESCAPE SEQUENCE.E­;E ®I2ESC2:J.¯ CMPB R2,#37 ;;;IS CHARACTER IN RANGE 0-37?2° BLO 50$ ;;;IF LO, YES...THIS IS A SYNTAX ERROR4± CMPB R2,#CH.RUB ;;;IS CURRENT CHARACTER A RUBOUT?<² BEQ RUBESC ;;;IF EQ, YES...DELETE ENTIRE ESCAPE SEQUENCE0³ MOVB U.TISV(R4),R3 ;;;GET CURRENT SYNTAX RULE2´ BNE 10$ ;;;IF NE, NOT FIRST TIME THRU; SO SKIP4µ CMPB U.TTYP-U.TSTA(R5),#T.VT61 ;;;IS THIS A VT61?¶ BNE 10$ ;;;IF NE, NO...SKIPF4· MOV #-6,R3 ;;;SET UP TO ALLOW CERTAIN EXCEPTIONS¸10$:=¹ ADD #ESCST,R3 ;;;SET POINTER INTO ESCAPE SYNTAX RULE TABLE;º20$:4» CMPB R2,(R3)+ ;;;IS THE INPUT CHARACTER IN RANGE?+¼ BLO 30$ ;;;IF LO, NO...CHECK NEXT RANGEC½ CMPB R2,(R3)+ ;;;IN RANGE?B+¾ BHI 40$ ;;;IF HI, NO...CHECK NEXT RANGEPB¿ MOVB (R3),U.TISV(R4) ;;;CHARACTER IS OK - SAVE NEXT SYNTAX RULE<À BNE I2ESC3 ;;;IF NE,00œŠ};}±|t÷tø tþfDATA NOT DONE YET...STORE CHAR. AND EXITÁ;(4Â; ESCAPE SEQUENCE IS COMPLETE - SET STATUS IS.ESQ.Ã;S.Ä MOV #IS.ESQ,@U.TCI(R4) ;;;SET RETURN STATUS(Å BR 60$ ;;;FINISH OFF ESCAPE SEQUENCEÆ;NRÇ; CHARACTER DIDN'T MATCH CURRENT RANGE - GET NEXT RANGE FOR CURRENT SYNTAX RULE.È; É30$:Ê INC R3 ;;;UPDATE POINTERË40$:0Ì TSTB (R3)+ ;;;ANY MORE RANGES FOR THIS RULE?-Í BNE 20$ ;;;IF NE, YES...LOOP FOR NEXT ONE)Î;SKÏ; THE INPUT CHARACTER IS INVALID IN THE ESCAPE SEQUENCE PROCESSED SO FAR.TGÐ; COMPLETE THE CURRENT INPUT REQUEST WITH COMPLETION STATUS "IE.IES". Ñ;TÒ50$:1Ó MOV #IE.IES&377,@U.TCI(R4) ;;;SET ERROR STATUS Ô60$:2Õ CALL I2ESCX ;;;GET OUT OF ESCAPE SEQUENCE MODEÖ;CJ×; I2ESC3 - STORE THE CURRENT CHARACTER OF THE ESCAPE SEQUENCE AND SEE IF,Ø; THE CURRENT INPUT REQUEST HAS COMPLETED.Ù;ÚÛ .IFTF ;T$$ESCÜ ÝI2ESC3:H:Þ CALL PUTNIC ;;;STORE CHARACTER AND DON'T ECHO ANYTHING:ß JMP ECHD2 ;;;CHECK FOR COMPLETION OF THE INPUT REQUESTàá .IFT ;T$$ESCâã;ENä; RUBESC - DELETE THE ENTIRE ESCAPE SEQUENCE FROM INPUT BUFFER AND EXIT FROMå; ESCAPE SEQUENCE MODE. æ;T çRUBESC::)è CALL GETPIC ;;;GET PREVIOUS CHARACTERS)é CMPB R2,#CH.ESC ;;;IS THIS THE ESCAPE?E2ê BNE RUBESC ;;;IF NE, NO...LOOP TILL WE FIND IT ëI2ESCX:H-ì BIC #S1.ESC,(R5) ;;;GET OUT OF ESCAPE MODE*í CLRB U.TISV(R4) ;;;CLEAR STATE VARIABLEî RETURN ;;;RETURNT ïJ2EDDF:T=ð JMP I2DEF ;;;CONTINUE INPUT CHARACTER THROUGH INPUT LOGICPñò .ENDC ;T$$ESCóô.PAGE:õ .SBTTL . I2CR - TERMINATE INPUT DUE TO CARRIAGE RETURNö; P÷; I2CR - CARRIAGE RETURN HAS BEEN INPUT. TERMINATE INPUT WITH STATUS "IS.CR".ø;G ù .ENABL LSBRúI2CR::6û CLR -(SP) ;;;ZERO THE ECHO STRING ADJUSTMENT COUNT5ü MOV #IS.CR,-(SP) ;;;SET COMPLETION STATUS TO IS.CRC!ý BR 10$ ;;;SKIP TO COMMON CODEMþ5ÿ .SBTTL . I2CTZ - TERMINATE INPUT DUE TO CONTROL-Z ;RL; I2CTZ - CONTROL-Z HAS BEEN INPUT. TERMINATE INPUT WITH STATUS "IE.EOF".; I2CTZ::C6 MOV #2,-(SP) ;;;SET ^Z ECHO STRING ADJUSTMENT COUNT; MOV #IE.EOF&377,-(SP) ;;;SET COMPLETION STATUS TO IE.EOFH10$:4 BIT #S1.RST,(R5) ;;;WAS THIS READ W/ SPEC. TERMS?7 BEQ 12$ ;;;IF EQ, NO. THIS IS A TERMINATOR ;SA463R; ;SA463T; COME HERE IF DOING RST. WE HAVE 2 CASES; EITHER THIS IS NOT A TERMINATOR ;SA463N; AND IS AN INPUT CHARACTER (FIRST PASS THROUGH THIS CODE) OR ELSE, ;SA463Q; THIS IS THE SECOND TIME THROUGH...WE ARE DOING DEFERRED PROCESSING OF ;SA463:S; A TERMINATOR. WE END UP HERE FROM ECHD1 AND HAVE BYPASSED THE RST TEST. ;SA463;?; IF THIS IS THE CASE, A STATUS WILL HAVE BEEN SET. ;SA463;; ;SA463C+  TST (SP)+ ;;;GET RID OF STATUS ;**-1A'  TST @(R4) ;;;STATUS SET? ;SA463/  BNE 15$ ;;;NE => YES => TERMINATOR ;SA463I  ;SA4638  CALL PUTNIC ;;;AND PUT THIS NON-TERMINATOR IN BUFFER(  BIT #S1.RNE,(R5) ;;;ECHO SUPPRESSED?'  BEQ 15$ ;;;JOIN COMMON CODE TO ECHOE2  TST (SP)+ ;;;CLEAN STRING ADJUSTMENT OFF STACK$ JMP ECHD2 ;;;AND GET OUT OF HERE12$: ASSUME U.TCI,0;& MOV (SP)+,@(R4) ;;;ELSE, SET STATUS. BIT #S1.RNE!S1.TNE,(R5) ;;;ECHO SUPPRESSED?, BNE 30$ ;;;GO SET STATUS AND COMPLETE IO  BR 15$@; J; EKCR AND EKCTZ - OR ^Z WAS SPECIAL TERMINATOR. COME HERE TO ECHO; EKCR::2 CLR -(SP) ;;;ZERO ECHO STRING ADJUSTMENT COUNT BR 15$ ;;;JOIN COMMON CODE EKCTZ::P6 MOV #2,-(SP) ;;;SET ^Z ECHO STRING ADJUSTMENT COUNT15$:* CALL EXCR1 ;;;EXPAND A CARRIAGE RETURN3  BCC 20$ ;;;IF CC, NO LEADING LF REQUIRED...SKIP.<! BIS #S1.DPR,(R5) ;;;ELSE DEFER PROCESSING OF CR OR CTRL-Z&" CLR (SP) ;;;CLEAR ADJUSTMENT COUNT#20$:0$ ADD (SP),R2 ;;;ADJUST COUNT OF BYTES TO ECHO(% SUB (SP)+,R3 ;;;ADJUST BUFFER POINTER(& BR C2ECHS ;;;SKIP TO ECHO THE STRING'30$:( TST (SP)+ ;;;CLEAN STACK)+* JMP IDONE ;;;COMPLETE THE CURRENT INPUTO+, - .DSABL LSBM..PAGEP4/ .SBTTL . CONTROL-U AND CONTROL-R ECHO PROCESSING.0 .SBTTL . EDCTU - INITIALI00œ’}‡|Ž{´cÚµcÛ¶c�·c›’ZE AND ECHO "^U"1;;J2; EDCTU - CONTROL-U HAS BEEN INPUT. INITIALIZE ECHO PROCESSING TO BEGIN33; ECHO OF "^U " OR "^U ".T4;C 5 .ENABL LSB 6EDCTU::277 MOVB #SV.CU1,U.TISV(R4) ;;;INITIALIZE STATE VARIABLEJ%8 MOV #ASCTU,R3 ;;;GET CTRL-U STRINGI9: .IF DF T$$CTR;< BR 20$ ;;;ECHO ^UE=.> .SBTTL . EDCTR - INITIALIZE AND ECHO "^R"?;OJ@; EDCTR - CONTROL-R HAS BEEN INPUT. INITIALIZE ECHO PROCESSING TO BEGIN'A; ECHO OF "^R " ORA-B; "^R ". C;E DEDCTR::I*E BIT #S1.RNE,(R5) ;;;IS ECHO SUPPRESSED?9F BEQ 10$ ;;;IF EQ, NO...WE CAN PERFORM THE ^R FUNCTIONB=G CALLR CFGRQ ;;;ELSE, IGNORE AND PROCESS AN OUTPUT REQUESTAH10$:;I MOV U.TIP+2(R4),U.TTOC(R4) ;;;SAVE POS. OF LAST BYTE + 1$7J MOVB #SV.CR1,U.TISV(R4) ;;;INITIALIZE STATE VARIABLE %K MOV #ASCTR,R3 ;;;GET CTRL-R STRINGDLM .ENDC ;T$$CTRNO20$:!P BIT #S2.FLF,2(R5) ;;;FORCE LF?Q BEQ 30$ ;;;IF EQ, NO...SKIPR3R BIS #S1.DPR,(R5) ;;;DEFER PROCESSING OF ^U OR ^R <S CALL EXPCHR ;;;EXPAND CHARACTER IN R2 (JUST TO FORCE LF)7T BR C2ECHS ;;;MAKE CALL TO ECHO THE EXPANSION STRINGOU30$:.V MOV R3,-(SP) ;;;SAVE ADDRESS OF ECHO STRINGW ASSUME U.TCI,0+X MOV (R4)+,R3 ;;;GET CURRENT INPUT PACKET .Y MOV #UPUNB,-(SP) ;;;ASSUME UNBUFFERED INPUT3Z BIT #S1.IBF,(R5) ;;;ARE WE DOING BUFFERED INPUT?L-[ BEQ 40$ ;;;IF EQ, NO...CORRECT ASSUMPTION&\ ADD #U.TFIB-2,R4 ;;;POINT TO U.TFIB)] MOV (R4),R2 ;;;GET FIRST INPUT BUFFER(^/_ MOV #FPSUI1,(SP) ;;;ASSUME UNSOLICITED INPUT `a ASSUME S1.USI,100000Sb(c TST (R5) ;;;DOING UNSOLICITED INPUT?.d BMI 40$ ;;;IF MI, YES...CORRECT ASSUMPTIONBe MOV I.PRM+4(R3),-(R4) ;;;SOLICITED INPUT - GET TOTAL BYTE COUNTf MOV #NXTIB,(SP) ;;;g40$:=h CALL @(SP)+ ;;;CALL UPUNB, FPSUI1, OR NXTIB TO UPDATE UCBFij .IF DF T$$SPLk)l MOV #120000,R4 ;;;RESTORE UCBX POINTERRmn .IFF ;T$$SPLAo2p MOV U.TUX-U.TSTA(R5),R4 ;;;RESTORE UCBX POINTERqr .ENDC ;T$$SPLs+t MOV (SP)+,R3 ;;;POINT TO ^U OR ^R STRINGN'u BIT #S1.RNE,(R5) ;;;ECHO SUPPRESSED?'v BNE I2CTUE ;;;Y - JUMP (MUST BE ^U)*w MOV #2,R2 ;;;LENGTH OF ^U OR ^R STRINGx;MLy; DON'T WORRY ABOUT UPDATING CURRENT HORIZONTAL POSITION FOR 2 CHARACTERS.@z; WE ARE GOING TO DO A CARRIAGE RETURN IMMEDIATELY AFTER THEM.{;D:| BR C2ECHS ;;;GO ECHO THE STRING DESCRIBED BY R2 AND R3}.PAGE 3~ .SBTTL . I2CTU1/I2CTR1 - ECHO AND FILLERST;,A€; I2CTU1/I2CTR1 - "^R" OR "^U" HAS BEEN ECHOED. SET UP TO ECHOR%�; A CARRIAGE-RETURN (PLUS FILLERS).#‚;E ƒI2CTU1:: „I2CTR1::1… INCB U.TISV(R4) ;;;UPDATE INPUT STATE VARIABLEV† ASSUME S1.USI,100000R/‡ TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?Cˆ‰ .IF DF R$$MPL!A$$CLIRŠ‹ BPL 50$ ;;;IF PL, NO...SKIPOŒ;RK�; IN ALTERNATE CLI SYSTEMS, THE CLI PROMPT IS NOT ASSUMED TO START WITH ANLŽ; CARRIAGE RETURN, SO DO NOT OUTPUT ONE. RATHER, GO ON TO THE NEXT STATE.�;L �J2NXST:3‘ JMP NXSTAT ;;;DON'T GIVE GRATIS CARRIAGE RETURNT’50$:“” .IFF ;R$$MPL!A$$CLI•%– BMI 70$ ;;;IF MI, YES...ECHO 1—˜ .ENDC ;R$$MPL!A$$CLIA™š .IF DF T$$RPR›/œ TST U.TFPB(R4) ;;;READ W/PROMPT IN PROGRESS?D1� BNE 70$ ;;;IF NE, YES...DON'T SKIP NEXT STATELžŸ .ENDC ;T$$RPR ¡60$:0¢ INCB U.TISV(R4) ;;;BYPASS THE NEXT ECHO STATE£70$:*¤ CALL EXCR1 ;;;EXPAND A CARRIAGE-RETURN ¥C2ECHS:S*¦ CALLR ECHSTR ;;;ECHO STRING AND RETURN§,¨ .SBTTL . I2CTU2 - SET UP TO ECHO PROMPT©;ILª; I2CTU2 - "^U " HAS BEEN ECHOED. SEE IF PROMPT BUFFER NEEDS ECHOING.«;I ¬I2CTU2::­ ASSUME S1.USI,100000;/® TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?U/¯ BPL I2CTR2 ;;;IF PL, NO...START PROMPT ECHO76° CLRB U.TFPB(R4) ;;;SET UP TO USE THE DEFAULT PROMPTC± TSTB U.TFPB+1(R4) ;;;DID THE UNSOLICITED INPUT INTERRUPT A READ?E²³ .IF DF T$$SER´2µ BNE 80$ ;;;IF NE, YES...DO NOT ECHO CLI PROMPT@¶ BIT #UM.CMD,U.MUP-U.TSTA(R5) ;;;IS A CLI COMMAND IN PROGRESS?·¸ .ENDC ;T$$SER¹600œš};}±|t÷tø tþfDATAº BEQ I2CTR2 ;;;IF EQ, NO...START ECHOING THE PROMPT»80$:¼½ .IF DF R$$MPL!A$$CLI¾4¿ INCB U.TISV(R4) ;;;BYPASS CLI PROMPT OUTPUT STATEÀÁ .ENDC ;R$$MPL!A$$CLI Â.à BR 60$ ;;;SKIP TO OUTPUT A CARRIAGE RETURNÄ,Å .SBTTL . I2CTR2 - SET UP TO ECHO PROMPTÆ;1JÇ; I2CTR2 - "^R " HAS BEEN ECHOED. INITIALIZE TO START OUTPUT OF THEFÈ; CURRENT PROMPT BUFFER. THIS CODE IS ALSO ENTERED DURING CONTROL-UÉ; ECHO PROCESSING.Ê; ËI2CTR2::+Ì INCB U.TISV(R4) ;;;UPDATE STATE VARIABLECÍ;;LÎ; RESET THE CURRENT HORIZONTAL POSITION TO THE INITIAL HORIZONTAL POSITIONPÏ; FOR THE READ PORTION OF AN IO.RPR. WE DON'T CARE ABOUT INCORRECT HORIZONTALOÐ; POSITION DURING THE ECHO OF THE PROMPT STRING. FURTHERMORE, IT IS POSSIBLE2NÑ; THAT THE ORIGINAL PROMPT STARTED AT A POSITION OTHER THAN FIRST COLUMN. IFKÒ; SO, WE CAN ONLY HOPE THAT THE PROMPT BUFFER CONTAINS AN EXPLICIT CURSOREKÓ; POSITIONING COMMAND. IF NOT, THE HORIZONTAL POSITION WILL BE INCORRECTRÔ; WHILE DOING THE NEXT READ.Õ;MÖ; AT THIS INPUT STATE, WE KNOW THAT THE LAST CHARACTER THAT WAS EXPANDED BY O×; "EXPCHR" WAS A CARRIAGE RETURN, SO THE FORCE-LINE-FEED FLAG (S2.FLF) IS NOW KØ; SET. IF THE INITIAL HOR. POS. IS NOT COLUMN 1, WE MUST CLEAR THE FLAG.Ù;HAÚ MOVB U.TIHP(R4),U.TCHP-U.TSTA(R5) ;;;RESET HORIZONTAL POSITIONN;Û BEQ 90$ ;;;IF EQ, WE ARE AT COLUMN 1...LEAVE S2.FLF SETSAÜ BIC #S2.FLF,2(R5) ;;;OTHERWISE, CLEAR FLAG TO PREVENT EXTRA LFTÝ90$:Þß .IF DF T$$RPRàá ASSUME S1.USI,100000A/â TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?H1ã BMI 100$ ;;;IF MI, YES...ECHO THE CLI PROMPT"äå .IF DF R$$MPL!A$$CLIEæ4ç INCB U.TISV(R4) ;;;BYPASS CLI PROMPT OUTPUT STATEèé .ENDC ;R$$MPL!A$$CLINê;ë MOV U.TFPB(R4),U.TFOB(R4) ;;;GET THE FIRST PROMPT BUFFERS2ì CALLR STAXL ;;;START ECHO OF THE PROMPT STRINGí;Q"î; PREPARE FOR CLI PROMPT OUTPUT.ï;ð100$:2ñò .ENDC ;T$$RPRóô .IF DF T$$SPCõ7ö TST U.TFPB(R4) ;;;CLI CONTINUATION LINE IN PROGRESS?U ÷ BPL 110$ ;;;IF PL, NO...SKIPAø MOV #ASCLC,R3 ;;;OTHERWISE, OUTPUT SPECIAL CONTINUATION PROMPTC6ù MOV #4,R2 ;;;LENGTH IS 4 BYTES INCLUDING CR AND LF0ú BR C2ECHS ;;;GO ECHO THE CONTINUATION STRINGû110$:$üý .ENDC ;T$$SPCþÿ .IF DF R$$MPL!A$$CLIE5 MOV U.MUP-U.TSTA(R5),R3 ;;;GET POINTER TO CLI WORDF0 BIC #^C,R3 ;;;CLEAR ALL BUT CLI INDEX1 MOV $CPTBL(R3),R3 ;;;POINT TO CLI PARSER BLOCK2 MOVB C.PDPL(R3),R2 ;;;GET DEFAULT PROMPT LENGTH3 ADD #C.PRMT,R3 ;;;POINT TO DEFAULT PROMPT STRINGN/ TSTB U.TFPB(R4) ;;;WHICH PROMPT DO WE ISSUE?P4 BNE 120$ ;;;IF NE, SKIP TO ISSUE FULL CLI PROMPT# TST R2 ;;;CHECK FOR NULL LENGTH2-  BR 130$ ;;;EITHER PROMPT OR FORGET IT ALL$ 120$:@  MOVB C.PCPL-C.PRMT(R3),-(SP) ;;;GET LENGTH OF FULL CLI PROMPT0  ADD R2,R3 ;;;POINT TO FULL CLI PROMPT STRING"  MOVB (SP)+,R2 ;;;GET ITS LENGTH130$:V1 BEQ 140$ ;;;IF EQ, NULL LENGTH...DON'T PROMPTV6 MOV R3,U.TSHP(R4) ;;;SAVE CLI PROMPT STRING ADDRESS6 MOVB R2,U.TVFC(R4) ;;;SAVE CLI PROMPT STRING LENGTH ;;;FALL INTO NEXT STATES6 .SBTTL . I2CTU3/I2CTR3 - OUTPUT CLI PROMPT BUFFER;TQ; I2CTU3/I2CTR3 - OUTPUT CLI PROMPT BUFFER BY EXPANDING EACH CHARACTER IN TURN.2; I2CTU3:: I2CTR3::5 MOV U.TSHP(R4),R3 ;;;GET ADDRESS OF NEXT CHARACTER - MOVB U.TVFC(R4),R2 ;;;GET REMAINING LENGTH)( BNE 150$ ;;;IF NE, MORE TO DO...SKIP140$:F+ INCB U.TISV(R4) ;;;UPDATE STATE VARIABLE.! BR J2NXST ;;;GO TO NEXT STATEA 150$:+! MOVB (R3)+,R2 ;;;GET CHARACTER TO EXPAND *" CALL EXPCHR ;;;GET CHARACTER EXPANSION:# BNE 160$ ;;;IF NE, CHARACTER ECHOES AS A STRING - SKIP0$ MOV U.TSHP(R4),R3 ;;;SET POINTER TO CHARACTER% MOV #1,R2 ;;;SET LENGTHU'& BR 170$ ;;;UPDATE POINTER AND COUNTV'160$:46( BCS 180$ ;;;IF CS, NEED TO PRESENT CHARACTER AGAIN)170$:G,* INC U.TSHP(R4) ;;;POINT TO NEXT CHARACTER + DECB U.TVFC(R4) ;;;KEEP COUNT,180$:R4- BR C2ECHS ;;;ECHO EXPANSION OF CURRENT CHARACTER./ .IFF ;R$$MPL!A$$CLI00œ¢}‡|Ž{´cÚµcÛ¶c�·c›’021 MOV #ASCLP,R3 ;;;ASSUME ECHO ANGLE BRACKET ONLY/2 MOV #2,R2 ;;;TWO BYTES LENGTH (INCLUDES LF),.3 TSTB U.TFPB(R4) ;;;DID WE ASSUME CORRECTLY?64 BEQ C2ECHS ;;;IF EQ, YES...SKIP TO ECHO THE STRING56 .IF DF M$$CLI708 MOV U.CLI-U.TSTA(R5),R3 ;;;GET POINTER TO CLI#9 TST (R3)+ ;;;POINT PAST CLI TCBR): MOV R3,R2 ;;;COPY POINTER TO CLI NAMET;190$:C9< TSTB (R2)+ ;;;SEARCH FOR END OF ASCIZ NAME AND PROMPT '= BNE 190$ ;;;IF NE, NOT THERE...LOOPA)> SUB R3,R2 ;;;GET LENGTH OF CLI PROMPTV ? BR C2ECHS ;;;ECHO CLI PROMPT@A .IFF ;M$$CLI,B2C MOV #ASCLI,R3 ;;;GET ADDRESS OF FULL CLI PROMPT"D MOV #5,R2 ;;;GET PROMPT LENGTH E BR C2ECHS ;;;ECHO CLI PROMPTFG .ENDC ;M$$CLIHI .ENDC ;R$$MPL!A$$CLIUJ K .DSABL LSB;L.PAGEN2M .SBTTL . I2CTU4 - FINISH CONTROL-U PROCESSINGN;RJO; I2CTU4 - COMPLETE PROCESSING OF CONTROL-U INPUT. IF CONTROL-U WAS FOREP; AN UNSOLICITED INPUT, "IS.TMO+1" IS SET AS A COMPLETION STATUS SOCQ; THAT "FPIRD" WILL KNOW THE DIFFERENCE BETWEEN A USER HITTING ^U /R; AND A FAKED ^U BECAUSE OF AN INPUT TIMEOUT.3S;E TI2CTU4:: UI2CTUE:R4V CLRB U.TISV(R4) ;;;RESET THE INPUT STATE VARIABLEGW MOVB U.TCHP-U.TSTA(R5),U.TIHP(R4) ;;;SET INITIAL HOR. POS. = CURRENTX ASSUME S1.USI,100000G/Y TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?S7Z BPL C2CFRQ ;;;IF PL, NO...SKIP TO DO A FORK REQUEST [ ASSUME U.TCI,0UD\ MOV #IS.TMO+1,@(R4)+ ;;;OTHERWISE, SHOW A TIMEOUT ^U HAS FINISHED+] JMP IDONE ;;;COMPLETE THE INPUT REQUESTF^5_ .SBTTL . I2CTR4 - INITIATE ECHO OF CURRENT INPUTU`; Na; I2CTR4 - SET UP THE INPUT STATE TO RE-ECHO THE INPUT BUFFER. THIS IS DONEEb; BY "RECYCLING" ALL CHARACTERS THAT HAVE BEEN INPUT SO FAR THROUGHTc; THE INPUT LOGIC.d;eg ;**-1 hI2CTR4::+i INCB U.TISV(R4) ;;;UPDATE STATE VARIABLECj3k .SBTTL . I2CTR5 - RECYCLE NEXT INPUT CHARACTERMl;CQm; I2CTR5 - ECHO THE NEXT INPUT CHARACTER BY SENDING IT THROUGH THE INPUT LOGIC.In; oI2CTR5::<p MOV U.TIP+2(R4),R3 ;;;GET POINTER TO NEXT BYTE TO PROCESS!q CMP R3,U.TTOC(R4) ;;;ALL DONE?-#r BEQ I2CTR6 ;;;IF EQ, YES...SKIPE)s CALL GETRIC ;;;GET THE NEXT CHARACTERL6t CALLR ICHAR2 ;;;RECYCLE CHARACTER THRU INPUT LOGICu2v .SBTTL . I2CTR6 - FINISH CONTROL-R PROCESSINGw;4Ix; I2CTR6 - COMPLETE PROCESSING OF CONTROL-R. RESET THE INPUT STATE AND-;y; CONDITIONALLY FORK TO START ANY PENDING OUTPUT REQUEST.Ez;P {I2CTR6::4| CLRB U.TISV(R4) ;;;RESET THE INPUT STATE VARIABLE}} ; LK707R ;**-1 €C2CFRQ:O>� CALLR CFGRQ ;;;CONDITIONALLY FORK TO GET AN OUTPUT REQUEST‚.PAGES'ƒ .SBTTL . I2CTC - CONTROL-C HANDLING „;CP…; I2CTC - CONTROL-C IS BEING PROCESSED. START (OR RESTART) UNSOLICITED INPUT.†;- ‡I2CTC::Tˆ‰ .IF DF T$$SCAŠ7‹ BIT #S3.TME,4(R5) ;;;IS TERMINAL MANAGEMENT ENABLED?NŒ BEQ 5$ ;;;IF EQ NO7� JMP I2ECHO ;;;IF NE, YES...DON'T DO CONTROL-C STUFFPŽ5$:T�� .ENDC ;T$$SCA‘’ ASSUME U2.SLV,200,“ TSTB U.CW2-U.TSTA(R5) ;;;SLAVED TERMINAL?2” BMI I2RET ;;;IF MI, YES...IGNORE THE CONTROL-C•– .IF DF T$$IDO—2˜ TST $MCRPT ;;;IS THE MCR DISPATCHER INSTALLED? ™ BNE 10$ ;;;IF NE, YES...SKIPš;SI›; THE FORK ROUTINE WHICH STARTS UNSOLICITED INPUT WILL QUEUE THE AST TOœ; C$CTEX IF APPROPRIATE.�4ž MOV #FR.SUI,R3 ;;;FORK/START OF UNSOLICITED INPUT$Ÿ CALLR FORK ;;;QUEUE FORK REQUEST 10$:¡¢ .ENDC ;T$$IDO£¤ .IF DF T$$SPC¥6¦ BIT #UM.KIL,U.MUP-U.TSTA(R5) ;;;SEND A KILL PACKET?§ BEQ 20$ ;;;IF EQ, NO...SKIP.¨ MOV #FR.KIL,R3 ;;;GET KILL FORK REQUEST BIT1© CALLR FORK ;;;REQUEST FORK TO KILL THIS INPUTEª20$:7« TST U.TFPB(R4) ;;;CLI CONTINUATION LINE IN PROGRESS?S¬ BPL 30$ ;;;IF PL, NO...SKIPTD­ BIS #UM.KIL,U.MUP-U.TSTA(R5) ;;;ELSE, SEND KILL PACKET ON NEXT ^C®30$:¯° .ENDC ;T$$SPC±9² MOVB R2,U.TFPB(R4) ;;;ECHO A FULL CLI PROMPT FOR ^U/^RE$³ ADD #U.TFIB,R4 ;;;POINT TO U.TFIB ´ MOV R1,-(SP) ;;;SAVE REGISTER3µ CALL FPSUI1 ;;;SET UP UCB FOR UNSOLICITED INPUT$00œª};}±|t÷tø tþfDATA¶·;Q;¸; FILL THE INPUT BUFFER WITH THE FOLLOWING PROMPT STRING:0¹; " \ XXX>"º;0H»; WHERE " \" TAKES THE TERMINAL OUT OF HOLD-SCREEN MODE (INSERTEDH¼; ONLY IF TERMINAL IS IN HOLD-SCREEN MODE); AND "XXX" IS THE CLI NAME.½; ¾ ASSUME U.TIP+2,U.TIC-2.1¿ MOV -(R4),R1 ;;;GET START OF THE OUTPUT BUFFERU7À BIT #U2.HLD,U.CW2-U.TSTA(R5) ;;;IN HOLD-SCREEN MODE?.Á BEQ 40$ ;;;IF EQ, NO...SKIPI< MOV (PC)+,(R1)+ ;;;INSERT \ - EXIT HOLD SCREEN MODEà .BYTE CH.ESC,CH.BSL9Ä BIC #U2.HLD,U.CW2-U.TSTA(R5) ;;;CLEAR HOLD-SCREEN FLAG<Å40$:Æ; DÇ; NOW EXPAND CARRIAGE RETURN TWICE. THIS HAS THE FOLLOWING EFFECT:@È; 1. IF THE LAST EXPANDED CHARACTER WAS NOT A CARRIAGE RETURN,<É; THE FIRST CR EXPANDS AS CR, AND THE SECOND ONE AS LF.AÊ; 2. ELSE, THE FIRST CR EXPANDS AS LF AND THE SECOND ONE AS CR.BAË; IN THIS CASE, THE FLAG S2.FLF WILL BE SET AFTER THE SECOND;%Ì; EXPANSION AND MUST BE CLEARED.;Í;EKÎ; THE CARRIAGE RETURN AND LINE FEED ARE NOT OUTPUT HERE FOR ALTERNATE CLICKÏ; SYSTEMS SINCE THE CLI MAY NOT WANT THEM. IF IT DOES, THEN THEY MUST BEG-Ð; PART OF THE CLI PROMPT STRING IN THE CPB.Ñ;.ÒÓ .IF DF T$$SPCÔAÕ TST U.TFPB-(R4) ;;;CLI CONTINUATION LINE IN PROGRESS?,4Ö BPL 70$ ;;;IF PL, NO...DON'T INCLUDE GRATIS CRLFר .ENDC ;T$$SPCÙÚ .IIF NDF A$$CLI,NOACLI=0SÛ .IF DF T$$SPC!NOACLILÜ*Ý CALL EXCR1 ;;;EXPAND A CARRIAGE RETURNÞ50$:ß MOVB (R3)+,(R1)+ ;;;INSERTAà SOB R2,50$ ;;;LOOP!á CALL EXCR1 ;;;EXPAND CR AGAINLâ60$:ã MOVB (R3)+,(R1)+ ;;;INSERTAä SOB R2,60$ ;;;LOOPåæ .ENDC ;T$$SPC!NOACLI çè70$:.é BIC #S2.FLF,2(R5) ;;;DON'T FORCE ANOTHER LFêë .IF DF T$$SPCìAí TST U.TFPB-(R4) ;;;CLI CONTINUATION LINE IN PROGRESS? î BPL 90$ ;;;IF PL, NO...SKIPFBï MOVB ASCLC+2,(R1)+ ;;;INSERT FIRST CHAR. OF CONTINUATION PROMPT6ð MOVB ASCLC+3,(R1)+ ;;;INSERT SECOND CHAR. OF PROMPT8ñ MOVB #2,U.TCHP-U.TSTA(R5) ;;;SET UP CURRENT HOR. POS.8ò MOVB #2,U.TIHP-(R4) ;;;SET INITIAL HOR. POS. ó BR 170$ ;;;OUTPUT THE PROMPTôõ .ENDC ;T$$SPCö÷ .IF DF M$$CLIø5ù MOV U.CLI-U.TSTA(R5),R3 ;;;GET POINTER TO CLI NAMET.ú ADD #4,R3 ;;;ADD IN LENGTH OF THE CLI NAMEû80$:ü MOVB (R3)+,(R1)+ ;;;INSERTIý BNE 80$ ;;;LOOP9þÿ .ENDC ;M$$CLI .IF DF R$$MPL!A$$CLII90$:< MOV U.MUP-U.TSTA(R5),R3 ;;;GET POINTER TO CLI STATUS WORD5 BIC #^C,R3 ;;;CLEAR ALL BUT CLI INDEX BITS;1 MOV $CPTBL(R3),R3 ;;;POINT TO CLI PARSER BLOCK2: ADD #C.PDPL,R3 ;;;POINT TO DEFAULT PROMPT STRING LENGTH ASSUME C.PCPL,C.PDPL+18  CLR -(SP) ;;;WORD TO GET BYTE VALUE OF PROMPT LENGTH2  BISB (R3)+,(SP) ;;;GET LENGTH OF DEFAULT PROMPT  ASSUME C.PRMT,C.PCPL+1,  MOVB (R3)+,R2 ;;;GET LENGTH OF CLI PROMPT-  ADD (SP)+,R3 ;;;POINT TO CLI PROMPT STRINGM TST R2 ;;;ANYTHING THERE?U4 BEQ I2RET ;;;IF EQ, NO...RETURN TO FORGET IT ALL8 MOV R1,-(SP) ;;;GET CURRENT POSITION IN OUTPUT BUFFER9 SUB (R4),(SP) ;;;GET NUMBER OF CHARACTERS IN IT SO FAR.4 MOV R2,-(SP) ;;;SAVE UNEXPANDED CLI PROMPT LENGTH100$:C1 MOVB (R3)+,R2 ;;;GET A CHARACTER OF THE PROMPTU1 MOV R3,-(SP) ;;;SAVE ADDRESS OF NEXT CHARACTERH5 CALL EXPCHR ;;;GET EXPANSION OF CURRENT CHARACTER , BNE 120$ ;;;IF NE, IT IS A STRING...SKIP/ CMP 4(SP),#T$$BFL ;;;BUFFER LENGTH EXCEEDED? # BHIS 110$ ;;;IF HIS, YES...SKIP;? MOVB R2,(R1)+ ;;;CHARACTER EXPANDS AS ITSELF - PUT IN BUFFERE2 INC 4(SP) ;;;SHOW ONE MORE CHARACTER IN BUFFER BR 150$ ;;;CHECK IF DONE110$: ADD #6,SP ;;;CLEAN STACK4 BR 170$ ;;;ECHO WHATEVER COULD FIT IN THE BUFFER 120$:C;! BCC 130$ ;;;IF CC, DON'T PRESENT CHARACTER AGAIN...SKIPH$" DEC (SP) ;;;ELSE, BACKUP POINTER# INC 2(SP) ;;;AND FIX COUNT$130$:;)% ADD R2,4(SP) ;;;SHOW NEW BUFFER LENGTH)/& CMP 4(SP),#T$$BFL ;;;BUFFER LENGTH EXCEEDED?$4' BHI 110$ ;;;IF HI, YES...ECHO WHAT WE COULD COPY(140$: 0) MOVB (R3)+,(R1)+ ;;;PUT EXPANSION INTO BUFFER* SOB R2,140$ ;;;LOOPF00œ²}‡|Ž{´cÚµcÛ¶c�·c›’+150$: ), MOV (SP)+,R3 ;;;RESTORE PROMPT POINTER,- DEC (SP) ;;;MORE TO DO?$,. BNE 100$ ;;;IF NE, YES...LOOP UNTIL DONE/160$:!0 CMP (SP)+,(SP)+ ;;;CLEAN STACKC12 .ENDC ;R$$MPL!A$$CLIC34 .IF NDF R$$MPL&A$$CLI&M$$CLIC56 MOVB #'M,(R1)+ ;;;INSERT M7 MOVB #'C,(R1)+ ;;; C 8 MOVB #'R,(R1)+ ;;; R)9 MOVB #'>,(R1)+ ;;; >X:"; .ENDC ;NDF R$$MPL&A$$CLI&M$$CLI<= .IF NDF R$$MPL&A$$CLI>8? MOVB #4,U.TCHP-U.TSTA(R5) ;;;SET UP CURRENT HOR. POS.8@ MOVB #4,U.TIHP-(R4) ;;;SET INITIAL HOR. POS.AB .ENDC ;NDF R$$MPL&A$$CLIECD170$:B7E MOV (R4),R3 ;;;GET START OF PROMPT STRING (U.TIP+2)P*F CMP -(R4),-(R4) ;;;RESTORE UCBX POINTER3G MOV R1,R2 ;;;COPY CURRENT PROMPT STRING POINTER)H SUB R3,R2 ;;;GET LENGTH OF THE STRING #I MOV (SP)+,R1 ;;;RESTORE REGISTER 9J BIC #U2.HLD,U.CW2-U.TSTA(R5) ;;;CLEAR HOLD-SCREEN FLAGM KECHOS1:$*L CALLR ECHSTR ;;;ECHO THE PROMPT STRINGM.PAGET=N .SBTTL . I2CT* - MISCELLANEOUS CONTROL CHARACTER HANDLINGUO;2&P; CTRL-Q, CTRL-S, CTRL-O AND CTRL-X.CQ; IF ANY OF THESE CHARACTERS IS RECEIVED WHEN AN IO.RAL OR IO.RSTODR; IS ACTIVE, STORED IN THE TYPE-AHEAD BUFFER (FOR EXAMPLE, BECAUSEAS; ECHO IS REQUIRED AND OUTPUT IS BUSY), THE READ TERMINATES AND2BT; THE NEXT READ IS AN IO.RLB, THEN THESE SPECIAL CHARACTERS WILL>U; APPEAR HERE. WE DON'T WANT TO PASS THEM TO THE TASK, SO WEV; JUST IGNORE THEM.TW;;FX; THE SAME IS DONE FOR CTRL-C FROM A SLAVED TERMINAL, AND FOR CTRL-R-Y; IN A SYSTEM THAT DOES NOT SUPPORT CTRL-R.LZ;T [I2CTQ::R \I2CTS::F.] BIT #S1.TSY,(R5) ;IS TERMINAL SYNC ENABLED?(^ BEQ JI2EC ;IF NE, YES,KEEP CHARACTER _I2CTX::A` aI2CTO::Xbc .IF NDF T$$CTROd eEDCTR::Dfg .ENDC ;T$$CTRhiI2RET:j RETURN ;;;IGNOREAAkJI2EC: JMP I2ECHO ;;;ELSE, PROCESS AS A NORMAL INPUT CHARACTER.lm.PAGET.n .SBTTL . EDRUB - RUBOUT CHARACTER HANDLINGo;M%p; EDRUB - PROCESS RUBOUT CHARACTER.-q;M rEDRUB::E6s CALL GETPIC ;;;GET (AND REMOVE) PREVIOUS CHARACTER2t BCS I2RET ;;;IF CS, NONE THERE...IGNORE RUBOUT*u BIT #S1.RNE,(R5) ;;;IS ECHO SUPPRESSED?:v BNE I2RET ;;;IF NE, YES...DON'T ECHO DELETED CHARACTER,w TSTB U.TCHP-U.TSTA(R5) ;;;AT LEFT MARGIN?4x BEQ I2RET ;;;IF EQ, YES...CAN'T ECHO AROUND WRAPyz .IF DF T$$RUB{7| BIT #U2.CRT,U.CW2-U.TSTA(R5) ;;;IS TERMINAL A SCOPE?P0} BEQ 70$ ;;;IF EQ, NO...START RUBOUT SEQUENCE~;L; ECHO THE STANDARD CRT RUBOUT SEQUENCE. HORIZONTAL TAB ECHOS AS A NUMBERK€; (1-8) OF BACKSPACES. ANYTHING ELSE ECHOS AS BACKSPACE-SPACE-BACKSPACE.I�; +‚ CMPB R2,#CH.HT ;;;RUBOUT HORIZONTAL TAB?S ƒ BEQ 10$ ;;;IF EQ, YES...SKIP*„ BITB #140,R2 ;;;NON-SPACING CHARACTER?6… BEQ I2RET ;;;IF EQ, YES...DELETE IT BUT DON'T ECHO.† MOV #ASRBS,R3 ;;;POINT TO BSP-SP-BSP STRING%‡ MOV #3,R2 ;;;SET LENGTH OF STRING5?ˆ DECB U.TCHP-U.TSTA(R5) ;;;UPDATE CURRENT HORIZONTAL POSITIONU#‰ BR ECHOS1 ;;;GO ECHO THE STRINGRŠ; *‹; FIND THE PREVIOUS HORIZONTAL POSITION.Œ;R�10$:CŽ MOVB U.TCHP-U.TSTA(R5),-(SP) ;;;SAVE CURRENT HORIZONTAL POSITIONIE� MOVB U.TIHP(R4),U.TCHP-U.TSTA(R5) ;;;RESET CURRENT TO INITIAL POS. /� MOV R3,-(SP) ;;;SAVE R3 (POINTS TO THE HTAB)H‘ ASSUME U.TCI,0R:’ MOV (R4),R3 ;;;GET CURRENT PACKET (IF SOLICITED INPUT)1“ MOV I.PRM+2(R3),R3 ;;;GET START OF TASK BUFFERS”;NO•; NOTE - THE 2 INSTRUCTIONS ABOVE ASSUME THAT THE CURRENT INPUT IS UNBUFFEREDM–; SOLICITED INPUT. OF COURSE, "I.PRM+2(R3)" MAKES NO SENSE IF THE INPUT ISS3—; UNSOLICITED, BUT NO ADDRESSING ERROR CAN OCCUR. ˜;V/™ CLR -(SP) ;;;SET UP A VERY LARGE LOOP COUNT)3š BIT #S1.IBF,(R5) ;;;ARE WE DOING BUFFERED INPUT?0› BEQ 30$ ;;;IF EQ, NO...SKIP TO EXPAND BUFFER.œ MOV U.TFIB(R4),R3 ;;;GET FIRST INPUT BUFFER�20$:1ž CMP (R3)+,(R3)+ ;;;POINT TO START OF DATA AREAT0Ÿ MOV #T$$BFL-4,(SP) ;;;SET MAX BYTES IN BUFFER ;IK¡; THE FOLLOWING IS A LOOP THAT GOES THROUGH ALL CHARACTERS THAT HAVE BEEN G¢; INPUT SO FAR AND EXPANDS THEM. THE PURPOSE IS TO UPDATE THE CURRENT,D£; HORIZONTAL00œº};}±|t÷tø tþfDATA POSITION (U.TCHP) TO THE VALUE IT HAD BEFORE THE LAST"¤; CHARACTER (THE TAB) WAS INPUT.¥;5¦30$:8§ CMP R3,2(SP) ;;;POINTING TO THE RUBBED-OUT CHARACTER?'¨ BEQ 50$ ;;;IF EQ, YES...WE ARE DONE;©40$:5ª CALL GETRIC ;;;GET THE CHARACTER POINTED TO BY R3O« MOV R3,-(SP) ;;;SAVE R3'¬ CALL EXPCHR ;;;EXPAND THE CHARACTERR­ MOV (SP)+,R3 ;;;RESTORE R3L<® BCS 40$ ;;;IF CS, EXPAND CHARACTER AGAIN (DEFERRED ECHO)¯ INC R3 ;;;UPDATE POINTER$° DEC (SP) ;;;DECREMENT LOOP COUNT9± BNE 30$ ;;;IF NE, MORE IN THIS BUFFER...LOOP FOR MOREHE² MOV -T$$BFL(R3),R3 ;;;LOOP COUNT RAN OUT - THIS CAN ONLY HAPPEN...P2³ ;;; ...IF WE ARE DOING BUFFERED INPUT, SO...2´ ;;; ...GET LINK TO NEXT BUFFER (MUST BE ONE)µ BR 20$ ;;;BIG LOOP¶;IF·; WE ARE BACK AT WHERE WE STARTED - U.TCHP CONTAINS NEW (BACKSPACED)¸; HORIZONTAL POSITION.¹;;º50$:!» CMP (SP)+,(SP)+ ;;;CLEAN STACKC.¼ MOV (SP),R2 ;;;GET OLD HORIZONTAL POSITION=½ MOVB U.TCHP-U.TSTA(R5),(SP) ;;;GET NEW HORIZONTAL POSITION :¾ SUB (SP)+,R2 ;;;CALCULATE NUMBER OF BACKSPACES REQUIRED!¿ BGT 60$ ;;;IF GT, OUTPUT THEMH9À MOV #8.,R2 ;;;THE TAB WE WANT TO RUB OUT CAUSED AN...E3Á ;;; ...AUTO CR-LF - SPACE BACK TO LEFT MARGIN(Â60$:3à MOV #ASBSP,R3 ;;;POINT TO STRING WITH BACKSPACEST Ä BR ECHOS1 ;;;ECHO THE STRINGÅÆ .ENDC ;T$$RUBÇÈ;TLÉ; PROCESS A RUBOUT FOR A HARDCOPY TERMINAL. THE ECHO SEQUENCE STARTS WITHLÊ; A BACKSLASH FOLLOWED BY EACH CHARACTER THAT IS RUBBED OUT. WHEN NO MOREOË; CHARACTERS ARE TO BE RUBBED OUT, A TERMINATING BACKSLASH IS ECHOED FOLLOWED8Ì; BY THE CHARACTER THAT TERMINATED THE RUBOUT PROCESS.Í;WÎ70$:ÏÐ .IF DF T$$SPLÑ9Ò MOVB R2,U.TECO-U.TSTA(R5) ;;;SAVE RUBBED-OUT CHARACTERÓÔ .IFF ;T$$SPLNÕ2Ö MOVB R2,U.TECB(R4) ;;;SAVE RUBBED-OUT CHARACTERר .ENDC ;T$$SPLÙ3Ú BIT #S3.RUB,4(R5) ;;;ALREADY IN RUBOUT SEQUENCE?M5Û BNE 80$ ;;;IF NE, YES...ECHO RUBBED-OUT CHARACTERO:Ü BIS #S1.DEC,(R5) ;;;SET RUBOUT AND DEFERRED ECHO FLAGSÝ BIS #S3.RUB,4(R5)/Þ BR I2RUB2 ;;;SKIP TO ECHO A BACKSLASH FIRSTFß80$:?à CALLR I2EXPC ;;;EXPAND & ECHO CHAR. IN R2 & U.TECB (U.TECO)á;:+â; I2RUB1 - WE ARE ALREADY IN RUBOUT MODE.-ã;A äI2RUB1:E,å CMPB R2,#CH.RUB ;;;IS THIS ALSO A RUBOUT?6æ BEQ EDRUB ;;;IF EQ, YES...CONTINUE RUBOUT SEQUENCE4ç BIC #S3.RUB,4(R5) ;;;ELSE, GET OUT OF RUBOUT MODE3è BIS #S1.DPR,(R5) ;;;SET DEFERRED PROCESSING FLAG.5é ;;;FALL THROUGH TO ECHO A TERMINATING BACKSLASH ê;TOë; I2RUB2 - OUTPUT LEADING OR TRAILING BACKSLASH FOR HARDCOPY RUBOUT SEQUENCE.Aì;S íI2RUB2::î MOV #ASBSL,R3 ;;;POINT TO BACKSLASH CHARACTER TO OUTPUT7ï INCB U.TCHP-U.TSTA(R5) ;;;UPDATE HORIZONTAL POSITIONO5ð CALLR ECHCHR ;;;ECHO 1 CHARACTER POINTED TO BY R3Lñ.PAGEUò .SBTTL TTICH SUBROUTINESE8ó .SBTTL . SETSPD - FIND AND SET THE CALLER'S BAUD RATEô; õ;+Bö; SETSPD - DETERMINE THE INCOMING CALLER'S BAUD RATE AND SET IT.÷; ø; INPUTS:ù; R2 = CHARACTER RECEIVED$ú; R5 => U.TSTA OF THE TERMINAL UCBû;T ü; OUTPUTS:S4ý; R2 = IF THE LINE SPEED IS FOUND AND SET UP6þ; = 0 IF THE LINE SPEED COULD NOT BE DETERMINEDBÿ; THE CONTROLLER DEPENDENT ROUTINE FOR SETTING THE LINE SPEED IS4; CALLED AS EACH RANGE OF LINE SPEEDS IS CHECKED.;C; REGISTERS MODIFIED: R3, R4 (BY CONTROLLER DEPENDENT ROUTINES)L;-;A .IF DF D$$M11!D$$ZMD!D$$VMD SETSPD: =  CLR -(SP) ;;;SET UP RETURN VALUE FOR R2 = SPEED NOT FOUNDH6  MOV R1,-(SP) ;;;SAVE REGISTERS USED BY THIS ROUTINE  MOV R0,-(SP) ;;;B  MOV U.CW4-U.TSTA(R5),R0 ;;;GET THE CURRENT SPEED AND FLAGS WORD-  BIC #^C<37>,R0 ;;;CLEAR ALL BUT SPEED BITSHA BIC #^C<377>,R2 ;;;CLEAR ALL BUT EIGHT BITS OF INPUT CHARACTERC@ CMPB R2,#CH.CR ;;;IS IT A CARRIAGE RETURN (SPEED IS CORRECT)?/ BEQ 60$ ;;;IF EQ, YES...EXIT AUTOBAUD STATETD CMPB R2,# ;;;8-BIT CARRIAGE RETURN (SPEED IS CORRECT)?/ BEQ 60$ ;;;IF EQ, YES...EXIT AUTOBAUD STATEPE BIT #U4.CR,U.CW4-U.TSTA(R5) ;;;EXPECTING TO SEE A CARRIAGE RETURN?8 B00œÂ}‡|Ž{´cÚµcÛ¶c�·c›’NE 20$ ;;;IF NE, YES...WE DIDN'T GET ONE, SO LOG IT@ CMPB R0,#S.4800 ;;;DID WE JUST FINISH SEARCHING AT 4800 BAUD?< BNE 10$ ;;;IF NE, NO...GO SEARCH LOW BAUD RATE TABLE NOW, TST R2 ;;;WAS RECEIVED CHARACTER A NULL?: BNE 30$ ;;;IF NE, NO...SEARCH HIGH BAUD RATE TABLE NOW= MOV #S.300,R0 ;;;SEARCH THE LOW BAUD SPEED RANGE NEXT TIMEC: BR 50$ ;;;CHANGE THE SPEED AND WAIT FOR NEXT CHARACTER;XM; THE PREVIOUS INPUT CHARACTER DID NOT MATCH ANYTHING IN THE HIGH BAUD RATEGQ; RANGE. WE HAVE A NEW CHARACTER TO CHECK AGAINST THE LOW BAUD RATE TABLE NOW..;;10$:7  MOV #ABLOW,R1 ;;;SET ADDRESS OF LOW BAUD SPEED TABLEE>! CALL TBLCHK ;;;LOOK FOR A MATCH AGAINST RECEIVED CHARACTER8" BEQ 40$ ;;;IF CC, FOUND MATCH...SET SPEED FROM TABLE#;B2$; WE COME HERE IN EITHER OF THE FOLLOWING CASES:F%; 1. AN INPUT CHARACTER COULD NOT BE MATCHED WITH THE HIGH BAUD RATEH&; TABLE ENTRIES; THE LINE SPEED WAS CHANGED FOR LOW SPEED CHECKING;D'; AND THE NEXT CHARACTER DID NOT MATCH THE LOW BAUD RATE TABLE.G(; 2. A MATCH WAS FOUND IN EITHER THE LOW OR HIGH SPEED TABLE, AND THE,?); NEXT CHARACTER WAS EXPECTED TO BE A CARRIAGE RETURN (FORO:*; VALIDATION). HOWEVER, IT WASN'T A CARRIAGE RETURN.+;O,20$:3- INCB U.CW4+1-U.TSTA(R5) ;;;INCREMENT ERROR COUNTI3. CMPB U.CW4+1-U.TSTA(R5),#5 ;;;REACHED THRESHOLD?E-/ BLT 70$ ;;;IF LT, NO...KEEP PRESENT SPEED70 MOV #S.4800,R0 ;;;RESET SPEED, ERROR COUNT AND FLAGSS11 BR 50$ ;;;TRY AGAIN WITH ORIGINAL RANGE CHECKO2;CQ3; SEARCH THE HIGH BAUD RATE TABLE FOR A MATCH WITH THE CURRENT INPUT CHARACTER.D4;E530$:96 MOV #ABHIGH,R1 ;;;SET ADDRESS OF HIGH BAUD SPEED TABLEU>7 CALL TBLCHK ;;;LOOK FOR A MATCH AGAINST RECEIVED CHARACTER38 BNE 70$ ;;;IF NE, NO MATCH...KEEP PRESENT SPEEDR9; L:; FOUND A MATCHING CHARACTER IN SPEED TABLE. SET SPEED FROM THE TABLE AND@;; LOOK FOR A REAL CARRIAGE RETURN AS THE NEXT INPUT CHARACTER.<; =40$:1> MOVB (R1)+,R0 ;;;GET CALLER'S SPEED FROM TABLEA?? BIS #U4.CR,R0 ;;;VALIDATE THIS SPEED ON NEXT INPUT CHARACTERA@;I8A; SET THE LINE TO A NEW LINE SPEED AS SPECIFIED BY R0.B;RC50$:;D MOV R0,U.CW4-U.TSTA(R5) ;;;SET NEW SPEED VALUE AND FLAGSO7E BR 70$ ;;;SET UP CONTROLLER AND WAIT FOR NEXT INPUTEF;MKG; SINCE WE JUST RECOGNIZED A REAL CARRIAGE RETURN AS THE INPUT CHARACTER,LHH; WE ARE NOW AT THE CORRECT SPEED. EXIT AUTOBAUD-IN-PROGRESS MODE ANDGI; SET UP TO PROCESS THE CARRIAGE RETURN WHICH WILL GIVE A CLI PROMPT.SJ;FK60$:CL BIC #S5.ABP,U.TST5-U.TSTA(R5) ;;;CLEAR AUTO-BAUD IN PROGRESS BIT:M MOV #72.,U.CW4-U.TSTA(R5) ;;;RESET CORRECT BUFFER WIDTH8N MOV R2,4(SP) ;;;SAVE CARRIAGE RETURN WE JUST DETECTEDO;AQP; CALL THE CONTROLLER DEPENDENT ROUTINE TO SET THE LINE TO THE SPECIFIED SPEED. Q; R70$:-S BIC #^C<37>,R0 ;;;CLEAR ALL BUT SPEED BITSC9T BIS #4000,R0 ;;;SET AUTO-BAUD DETECT BIT FOR SET SPEEDB:U MOV #CT.PRM,R2 ;;;SET INDEX FOR CHANGING LINE PARAMETER2V CLR R1 ;;;SET FLAG FOR NOT FLOW-CONTROL CHANGE)W CALL CTRD ;;;GO CHANGE THE LINE SPEED *X MOV (SP)+,R0 ;;;RESTORE SAVED REGISTERSY MOV (SP)+,R1 ;;; <Z MOV (SP)+,R2 ;;;GET BACK RETURN STATUS (EITHER OR 0)[ RETURN ;;;ALL DONE\;LF]; TBLCHK - CHECK CURRENT SPEED TABLE FOR A MATCHING INPUT CHARACTER.^; _TBLCHK:9` CMPB R2,(R1)+ ;;;RECEIVED CHARACTER MATCH TABLE ENTRY?0-a BEQ 10$ ;;;IF EQ, YES...RETURN WITH ENTRYb INC R1 ;;;BUMP PAST SPEEDF"c TSTB (R1) ;;;END OF THE TABLE?*d BNE TBLCHK ;;;IF NE, NO...KEEP LOOKING#e CLZ ;;;SHOW NO MATCH WAS FOUNDPf10$:g RETURN ;;;DONE WITH SCANRhi .ENDC ;D$$M11!D$$ZMD!D$$VMDjk.PAGE;Al .SBTTL . TMMCHK - CHECK FOR SWITCH TO TERMINAL MANAGEMENT MODEm;LEn; **-TMMCHK - CHECK FOR POSSIBLE SWITCH TO TERMINAL MANAGEMENT MODE.o;Op; THIS ROUTINE CHECKS THE CURRENT INPUT STATE AND THE CURRENT INPUT CHARACTER1Lq; TO SEE IF A SWITCH TO TERMINAL MANAGEMENT MODE IS NECESSARY. ONE OF THE<r; FOLLOWING ACTIONS IS PERFORMED (IN DECREASING PRIORITY):s;O=t; 1. IF TERMINAL MANAG00œÊ};}±|t÷tø tþfDATAEMENT MODE IS NOT ENABLED, JUST EXIT. Iu; 2. IF WE HAVE NOT SEEN THE FIRST SWITCH CHARACTER, SEE IF THE CURRENTBBv; INPUT CHARACTER IS IT. IF SO, UPDATE THE TERMINAL MANAGEMENTw; STATE FLAGS AND EXIT.Ex; 3. IF WE HAVE ALREADY SEEN THE FIRST SWITCH CHARACTER, SEE IF THEK<y; CURRENT INPUT CHARACTER IS THE FINAL ONE. IF SO, CLEAR<z; THE TYPE-AHEAD BUFFER AND REQUEST A FORK TO SWITCH INTO{; TERMINAL MANAGEMENT MODE.E|; 4. OTHERWISE, SAVE THE CURRENT INPUT CHARACTER, RECYCLE THE FIRSTN@}; SWITCH CHARACTER THROUGH THE INPUT LOGIC, AND EXIT. IF THE?~; USER ENTERED THE FIRST SWITCH CHARACTER TWICE, ONLY ONE OFA,; THEM IS PASSED BACK TO THE INPUT LOGIC.€;T �; INPUTS:!‚; R2 = CURRENT INPUT CHARACTERL$ƒ; R5 => U.TSTA OF THE TERMINAL UCBB„; U.TSCA => AST CONTROL BLOCK/TSA EVENT PACKET IF TMM IS ENABLED6…; S5.SW1/S5.TMM = CURRENT TERMINAL MANAGEMENT STATE†;C ‡; OUTPUTS:RGˆ; CC-C = 0 IF INPUT CHARACTER WAS NOT A SWITCH CHARACTER AND MUST BER‰; PROCESSED UPON EXIT.EŠ; CC-C = 1 IF INPUT CHARACTER WAS ONE OF THE SWITCH CHARACTERS ANDN"‹; SHOULD BE IGNORED UPON EXIT.Œ;N �; REGISTERS MODIFIED: R3, R4Ž;-�;N�‘ .IF DF T$$SCA’ “TMMCHK:2”• .IF DF T$$SPL–7— MOV 120000+U.TSCA,R4 ;;;GET SWITCH CHARACTER TEP/ACBS˜™ .IFF ;T$$SPLVš1› MOV U.TUX-U.TSTA(R5),R4 ;;;GET TERMINAL'S UCBXE;œ BEQ 40$ ;;;IF EQ, NO UCBX...SKIP SWITCH CHARACTER CHECK=4� MOV U.TSCA(R4),R4 ;;;GET SWITCH CHARACTER ACB/TEPžŸ .ENDC ;T$$SPL 8¡ BEQ 40$ ;;;IF EQ, NO SWITCH CHARACTERS SET UP...SKIPB¢ BIT #S5.TMM,U.TST5-U.TSTA(R5) ;;;ALREADY IN TERMINAL MGMT MODE?:£ BNE 40$ ;;;IF NE, YES...SKIP SWITCH CHARACTER CHECKING¤;¥ MOV A.PRM+6(R4),R3 ;;;GET USER-DEFINED SWITCH CHARACTERS.F¦ BIT #S5.SW1,U.TST5-U.TSTA(R5) ;;;ALREADY SEEN 1ST SWITCH CHARACTER?+§ BEQ 10$ ;;;IF EQ, NO...CHECK FOR IT NOWE3¨ SWAB R3 ;;;SWAP CHARACTERS TO CHECK FOR 2ND ONEE©10$:3ª CMPB R2,R3 ;;;DOES THIS SWITCH CHARACTER MATCH?P6« BNE 30$ ;;;IF NE, NO...NO SWITCH TO TERM MGMT MODE¬ ASSUME S5.SW1,1­ ASSUME S5.TMM,S5.SW1+1T>® INC U.TST5-U.TSTA(R5) ;;;UPDATE SWITCH CHARACTER STATE BITS>¯ BIT #S5.TMM,U.TST5-U.TSTA(R5) ;;;SEEN 2ND SWITCH CHARACTER?2° BEQ 20$ ;;;IF EQ, NO...WAIT FOR NEXT CHARACTER±;51²; FORK TO PUT USER IN TERMINAL MANAGEMENT MODE.H³;E1´ CALL I1CTX1 ;;;GO FLUSH THE TYPE-AHEAD BUFFERµ%¶ CALL I1CTQ ;;;ALSO RESTART OUTPUTN·>¸ MOV #FR.SCA,R3 ;;;REQUEST FORK FOR SWITCH TO TERM MGMT MODE¹ CALL FORK ;;;DO ITº20$:.» SEC ;;;INDICATE SWITCH CHARACTER WAS SEEN¼ RETURN ;;;ALL DONE½;CP¾; INPUT IS NOT A SWITCH CHARACTER - SEE IF NEED TO RECYCLE PREVIOUS CHARACTER.¿;RÀ30$:DÁ BIT #S5.SW1,U.TST5-U.TSTA(R5) ;;;DID WE SEE 1ST SWITCH CHARACTER?9 BEQ 40$ ;;;IF EQ, NO...JUST PROCESS CURRENT CHARACTEROà ASSUME S5.SW1,1<Ä DEC U.TST5-U.TSTA(R5) ;;;CLEAR FLAG SAYING WE SAW 1ST ONE4Å SWAB R3 ;;;SWAP TO GET 1ST SWITCH CHARACTER BACK8Æ CMPB R2,R3 ;;;DID USER ENTER 1ST SWITCH CHAR. TWICE?9Ç BEQ 40$ ;;;IF EQ, YES...JUST PASS ONE OF THEM THROUGHN)È MOV R2,-(SP) ;;;SAVE CURRENT CHARACTER 8É MOV 2(SP),-(SP) ;;;DUPLICATE RETURN ADDRESS FOR LATER4Ê CLR R2 ;;;PREPARE FOR BYTE COPY (AND CLEAR CC-C)/Ë BISB R3,R2 ;;;GET 1ST SWITCH CHARACTER BACKQ3Ì CALL @(SP)+ ;;;FEED IT THROUGH INPUT PROCESSING.Í MOVB (SP)+,R2 ;;;GET BACK CURRENT CHARACTERÎ40$:Ï CLC ;;;CLEAR RETURN STATUS :Ð RETURN ;;;RETURN TO FEED IT THROUGH THE INPUT PROCESSÑÒ .ENDC ;T$$SCAÓÔ.PAGE @Õ .SBTTL . OOBCHK - CHECK OUT-OF-BAND MASKS FOR INPUT CHARACTERÖ;M×;+CØ; **-OOBCHK - DETERMINE IF CURRENT INPUT CHARACTER IS OUT-OF-BANDUØ; ;SA458Ø; ;SA458 Ø; INPUTS: ;SA458)!Ø; R2 = CHARACTER ;SA458C/Ø; R5 => U.TSTA OF THE TERMINAL UCB ;SA458HØ; ;SA458Ø; OUTPUTS: ;SA4580Ø; CC-C = 0 IF CHARACTER IS NOT OOB ;SA458-Ø; = 1 IF CHARACTER IS OOB ;SA458HØ; ;SA458.Ø; REGISTERS ALTERED: R0, R3, R4 ;SA45800œÒ}‡|Ž{´cÚµcÛ¶c�·c›’Ø;- ;SA458Ø; ;SA458AÙ;-Ú;MÛ .IF DF T$$OOBÜÜ .ENABL LSB ;SA458CÜ ;SA458 ÝOOBCHK: &Ý CLR R4 ;;;ASSUME NOT OOB ;SA4589ß CMPB R2,#CH.SP ;;;IS INPUT A CONTROL CHARACTER? ;**-151à BHIS 60$ ;;;IF HIS, NO...NOT SUPPORTED AS OOBHáâ .IF DF T$$SPLã:ä MOV 120000+U.TOBA,R3 ;;;GET OUT-OF-BAND ACB/TEP POINTERåæ .IFF ;T$$SPL ç.è MOV U.TUX-U.TSTA(R5),R3 ;;;GET UCBX POINTER4é BEQ 60$ ;;;IF EQ, NOT ONE...CAN'T BE OOB SO SKIP7ê MOV U.TOBA(R3),R3 ;;;GET OUT-OF-BAND ACB/TEP POINTERëì .ENDC ;T$$SPLí3î BEQ 60$ ;;;IF EQ, OUT-OF-BAND NOT SET UP...SKIP%ï MOV R3,R4 ;;;COPY ACB/TEP POINTER 4ð ADD #A.PRM+6,R4 ;;;POINT TO START OF OOB BITMASKS'ñ ;;;ASSUME THIS IS AN ACB, NOT TEPOò .IF DF R$$IICóô ASSUME A.CBL,E.VSIZõö TST A.CBL(R3) ;;;ACB OR TEP?O÷ BEQ 5$ ;;;IF EQ, ACBøù .IF DF T$$SCAúBû BIT #S5.TMM,U.TST5-U.TSTA(R5) ;;;IS USER IN TERMINAL MGMT MODE?8û BNE 12$ ;;;IF NE, YES... DON'T DO OOB CHECKS ;SA458ý ;**-1Cþ .ENDC ;T$$SCAÿB ASSUME E.VOBM,A.PRM+2 ;;;NOTE: THIS CODE ALSO ASSUMES THAT THE& ;;;OOB BITMASKS START AT A.PRM+6* SUB #4,R4 ;;;POINT TO ACB OOB BITMASKS 5$:I .ENDC ;R$$IIC , MOV R2,R0 ;;;COPY THE CHARACTER ;**-14 CMPB #16.,R0 ;;;IS CHARACTER IN FIRST MASK WORD?- BHI 10$ ;;;IF HIS, YES...SKIP TO CHECK ITF1 SUB #16.,R0 ;;;MAKE CHARACTER RELATIVE TO 16.;8 TST (R4)+ ;;;POINT TO SECOND HALF OF DOUBLEWORD MASK 10$:/ ASL R0 ;;;CONVERT CHARACTER FOR WORD OFFSETN7 BIT $BTMSK(R0),(R4)+ ;;;IS CHARACTER IN THE BITMASK?O$ BNE 60$ ;;;IF NE, OOB ;SA458, 12$: CLR R4 ;;;INDICATE NOT OOB ;SA458 BR 60$ ;;;DONE ;SA458 ;+ ;SA458J ; **-OOBCK2 - DETERMINE WHETHER AN OOB CHARACTER IS INCLUDE AND ;SA458F ; PROCESS OOB CHARACTER BY INSERTING IT IN OOB BUFFER. ;SA458C ; IF THERE'S NO ROOM IN THE BUFFER, GO DIRECTLY TO ;SA458;A ; WARN THE USER. OTHERWISE, CHECK FOR CLEAR AND ;SA458VF ; PERFORM ASSOCIATED FUNCTION. SET STATUS AND SET UP ;SA458$ ; FORK FOR OOB. ;SA458 ; ;SA4582J ; NOTE: THIS ROUTINE IS DESIGNED TO BE CALLED IMMEDIATELY AFTER ;SA458D ; OOBCHK AND SHOULD BE CALLED ONLY IF THE CHAR. IS OOB. ;SA458F ; VALUES FOR R0, R3 AND R4 (INPUT TO OOBCK2) ARE ESTABLISHED ;SA458D ; BY CALLING OOBCHK. ALSO NOTE THAT IT IS ASSUMED THAT R0 ;SA458B ; WAS SAVED ON THE STACK PRIOR TO CALLING THIS ROUTINE. ;SA458 ; ;SA4585 ; INPUTS: ;SA458T+ ; R0 ESTABLISHED BY OOBCHK ;SA458! ; R2 = CHARACTER ;SA4588+ ; R3 ESTABLISHED BY OOBCHK ;SA458E+ ; R4 ESTABLISHED BY OOBCHK ;SA458 / ; R5 => U.TSTA OF THE TERMINAL UCB ;SA458  ; ;SA458S ; OUTPUTS: ;SA458: ; CC-C = 0 IF CHARACTER IT NOT TO BE INCLUDED ;SA4586 ; = 1 IF CHARACTER IS TO BE INCLUDED ;SA458 ; ;SA458E. ; REGISTERS ALTERED: R0, R3, R4 ;SA458 ;- ;SA458 ; ;SA458; ;SA458 OOBCK2: ;SA458A7 ADD #E.VHDR,R3 ;;;POINT TO OOB BUFFER HEADER ;**-2L& ;;;ASSUME THIS IS A TEP, NOT ACB E ASSUME E.VHDR,A.PRM+16 ;;;NOTE:CODE ASSUMES OOB HEADER IMMEDIATELY ) ;;;FOLLOWS OOB BIT MASKS IN THE ASTS  ASSUME A.CBL,E.VSIZ ' TST E.VSIZ-E.VHDR(R3) ;;;ACB OR TEP?4 BNE 15$ ;;;IF NE, TEPT ( ADD #4,R3 ;;;POINT TO ACB OOB HEADER 15$:' MOV R4,-(SP) ;;;SAVE BITMASK POINTERS- CALL PCBUF ;;;PUT CHARACTER IN OOB BUFFER;+ MOV (SP)+,R4 ;;;GET BACK BITMASK POINTER5- BCC 17$ ;;;CC -> ROOM IN BUFFER ;SA458A6 TST (SP)+ ;;;ELSE, POP OFF RETURN ADDRESS ;SA458( MOV (SP)+,R0 ;;;RESTORE R0 ;SA458< CALLR I1BEEP ;;;WARN USER THAT NO ROOM IN BUFFER ;SA458 17$: ;SA4587" TST (R4)+ ;;;SKIP TO NEXT BITMASK DOUBLEWORD ;**-1T6# BIT $BTMSK(R0),(R4)+ ;;;IS CHARACTER A "CLEAR" OOB?.$ BNE 20$ ;;;IF NE, NO...CHECK FOR "INCLUDE"!% MOV R2,-(SP) ;;;SAVE CHARACTE00œÚ};}±|t÷tø tþfDATARC-& CALL I1CTX1 ;;;CLEAR OOB MUST CLEAR TABUFP%' CALL I1CTQ ;;;ALSO RESTART OUTPUTB*( MOV (SP)+,R2 ;;;RESTORE CHARACTER TO R2) * .IF DF T$$SPL+ &, MOV #120000,R3 ;;;GET UCBX POINTER- . .IFF ;T$$SPL / .0 MOV U.TUX-U.TSTA(R5),R3 ;;;GET UCBX POINTER1 2 .ENDC ;T$$SPL3 4 ASSUME U.TCI,0 ,5 TST (R3) ;;;DO WE HAVE A CURRENT PACKET?6 BEQ 30$ ;;;BR IF NO0 7 MOV R2,-(SP) ;;;GET CHARACTER8 SWAB (SP) ;;;INTO HIGH BYTEC>9 MOVB #IS.OOB,(SP) ;;;INDICATE THAT THIS WILL TERMINATE READ : MOV (SP)+,@(R3) ;;;SET STATUS7; BR 30$ ;;;SKIP SINCE "CLEAR" OOB CAN'T BE "INCLUDE"+< 20$:0= TST (R4)+ ;;;SKIP TO NEXT BITMASK DOUBLEWORD;> BIT $BTMSK(R0),(R4) ;;;IS CHARACTER OUT-OF-BAND INCLUDE?8? BNE 40$ ;;;IF NE, YES...SKIP TO FINISH OOB CHARACTER@ 30$:0A CLR R4 ;;;INDICATE CHARACTER IS NOT INCLUDEDB 40$::C MOV #FR.OOB,R3 ;;;SET REQUEST TYPE FOR OUT-OF-BAND FORKD MOV R4,-(SP) ;;;SAVE R4!E CALL FORK ;;;REQUEST THE FORKIF MOV (SP)+,R4 ;;;EI 60$: ;**-2T8I TST R4 ;;;CLEAR CARRY AND SEE IF OOB OR INCL ;SA4584I BEQ 70$ ;;;IF EQ, NOT OOB OR NOT INCLUDE ;SA458-I SEC ;;;SET CARRY IF OOB OR INCL ;SA458 I 70$: ;SA458!K RETURN ;;;ALL DONE ;**-1K ;SA458K .DSABLE LSB ;SA458K ;SA458O ;**-3CP .ENDC ;T$$OOBQ R .PAGE:BS .SBTTL . IPROC - SEE IF AN INPUT CHARACTER CAN BE PROCESSED NOWT ;(U ;+HV ; **-IPROC - DETERMINE WHETHER AN INPUT CHARACTER CAN BE PROCESSED NOWW ; X ; INPUTS:Y ; R2 = CHARACTERR$Z ; R5 => U.TSTA OF THE TERMINAL UCB[ ;$ \ ; OUTPUTS: 9] ; CC-C = 0 IF THE INPUT CHARACTER CAN BE PROCESSED NOW 3^ ; = 1 IF CHARACTER CAN NOT BE PROCESSED NOW;_ ;D3` ; CC-Z = 1 IF THE CHARACTER IS TO BE THROWN AWAY a ;S"b ; REGISTERS ALTERED: R2, R3, R4c ;-d ; e .ENABL LSBf g IPROC:: 4h BIT #S1.DSI,(R5) ;;;IS INPUT PROCESSING DISABLED?/i BNE RETCS ;;;IF NE, YES...CAN'T PROCESS NOWWj k .IF DF B$$MAPl &m CALL RSDPRC ;;;IO.RSD OUTSTANDING?*n CLZ ;;;DON'T THROW THE CHARACTER AWAY,o BCC RETCS ;;;Y - CAN'T PROCESS NOW, JUMPp q .ENDC ;B$$MAPr As CMP R2,#CH.CTC ;;;IS CHARACTER ^C (AND NO HARD RECEIVE ERROR)?Rt BNE 70$ ;;;IF NE, NO...SKIP u #v .SBTTL . CHARACTER IS CONTROL-C w ; x ; CHARACTER IS CTRL-C y ;4z .IF DF T$$SCA{ 3| BIT #S3.TME,4(R5) ;;;IS TERMINAL MANG'T ENABLED?U4} BNE 70$ ;;;IF NE, YES, CTL C IS NORMAL CHARACTER~  .ENDC ;T$$SCA€ � ASSUME S1.IBY,200‚ TSTB (R5) ;;;IS INPUT BUSY?N ƒ BMI 30$ ;;;IF MI, YES...SKIP„ ;EL… ; CHARACTER IS CONTROL-C AND INPUT IS NOT BUSY. SEE IF IT SHOULD CAUSE AN† ; UNSOLICITED INPUT AST.‡ ;Eˆ ‰ .IF DF T$$CCAŠ ‹ .IF DF T$$SPLŒ -� TST U.ATT-U.TSTA(R5) ;;;TERMINAL ATTACHED?RŽ BEQ 60$ ;;;BR IF NO 0� MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX� ‘ .IFF ;T$$SPL;’ 6“ MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX IF THERE IS ONE,” BEQ 60$ ;;;IF EQ, THERE ISN'T ONE...SKIP• – .ENDC ;T$$SPL— 5˜ MOV U.TAST(R4),R3 ;;;GET AST BLOCK IF THERE IS ONEI*™ BEQ 20$ ;;;IF EQ, NO AST SET UP...SKIP@š BITB #TF.XCC,A.PRM+5(R3) ;;;WANT CONTROL-C PASSED TO THE AST?› BNE 60$ ;;;IF NE, NO...SKIPDœ 10$:9� TST A.PRM+6(R3) ;;;NEED TO CHECK FOR LOCKED AST BLOCK?I3ž BEQ 100$ ;;;IF EQ, YES...CHECK THAT POSSIBILITY0AŸ BITB #AF.QUE,A.PRM+5(R3) ;;;IS ACB CURRENTLY IN THE AST QUEUE?M2  BNE RETCS ;;;IF NE, YES...CAN'T PROCESS ^C NOW-¡ BR 110$ ;;;OTHERWISE, SKIP TO TRIGGER AST ¢ 20$:£ ¤ .IFTF ;T$$CCA¥ C¦ BIT #S3.PTH!S3.RAL,4(R5) ;;;TERMINAL IN PASSTHRU OR BINARY MODE?O9§ BNE RETCS ;;;IF NE, YES...PUT ^C IN TYPE-AHEAD BUFFERT2¨ BR 60$ ;;;OTHERWISE, SEE IF TERMINAL IS SLAVED© ;D-ª ; CHARACTER IS CONTROL-C AND INPUT IS BUSY.OA« ; 1. IF DOING IO.RAL OR IO.RST, OR IF ALREADY DOING UNSOLICITEDBB¬ ; INPUT, TRY TO PROCESS IMMEDIATELY (DEPENDENT ON OUTPUT BUSY ­ ; AND ECHOING REQUIREMENT).:® ; 2. ELSE, IF TERMINAL IS SLAVED, DISCARD THE CHARACTER.@¯ ; 3. ELSE, IF AN AST IS NOT SPECIFIED, FORK TO ABORT SOL00œâ}‡|Ž{´cÚµcÛ¶c�·c›’ICITED+° ; INPUT AND START AN UNSOLICITED INPUT.O± ; 4. ELSE, QUEUE AN ASTE² ;.³ 30$:E´ BIT #S1.PTH!S1.RSP,(R5) ;;;DOING READ WITH SPEC. PROC.OR PASSTHRU?V µ BNE 80$ ;;;IF NE, YES...SKIP¶ · .IF DF T$$RPR¸ >¹ BIT #S5.RPO,U.TST5-U.TSTA(R5) ;;;PROMPT OUTPUT IN PROGRESS?/º BNE RETCS ;;;IF NE, YES...CAN'T PROCESS NOWD» ¼ .ENDC½ ¾ ASSUME S1.USI,100000I/¿ TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?CÀ BPL 40$ ;;;IF PL, NO...SKIPIÁ ;A= ; CHARACTER IS CONTROL-C, AND AN UNSOLICITED INPUT IS BUSY.TAà ; 1. IF OUTPUT IS NOT BUSY ACCEPT CTRL-C WHICH WILL RESTART THE:Ä ; UNSOLICITED INPUT.)HÅ ; 2. ELSE, CANNOT PROCESS NOW SINCE UNLIKE THE PROCESSING OF ALL OTHERBÆ ; CHARACTERS, CTRL-C PROCESSING FORCES THE OUTPUT OF A PROMPT@Ç ; WITHOUT REGARD FOR THE ECHO/NOECHO STATUS OF THE TERMINALÈ ; &É BIT #S1.OBY,(R5) ;;;IS OUTPUT BUSY?;Ê BEQ RETCC ;;;IF EQ, NO...^C STARTS AN UNSOLICITED INPUT Ë RETCS:5Ì SEC ;;;SET INDICATION WE CAN'T PROCESS CHARACTER Í RETURN ;;;ALL DONEIÎ ;Y9Ï ; CHARACTER IS CONTROL-C AND A SOLICITED INPUT IS BUSY.EÐ ; Ñ 40$:Ò Ó .IFT ;T$$CCATÔ Õ .IF DF T$$SPLÖ 0× MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBXØ Ù .IFF ;T$$SPLCÚ &Û MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBXÜ Ý .ENDC ;T$$SPLÞ 5ß MOV U.TAST(R4),R3 ;;;GET AST BLOCK IF THERE IS ONET/à BEQ 60$ ;;;IF EQ, ASTS NOT SPECIFIED...SKIP;.á BITB #TF.XCC,A.PRM+5(R3) ;;;PASS ^C TO AST?â BNE 60$ ;;;IF NE, NO...SKIPN8ã BITB #AF.QUE,A.PRM+5(R3) ;;;IS AN AST ALREADY QUEUED?/ä BEQ 10$ ;;;IF EQ, NO...ASTS MAY BE POSSIBLEPå æ .ENDC ;T$$CCAç è 50$:9é TST (SP)+ ;;;POP RETURN ADDRESS TO TOSS THE CHARACTER -ê RETURN ;;;RETURN BACK TO CALLER'S CALLER$ë 60$:ì ASSUME U2.SLV,2006í TSTB U.CW2-U.TSTA(R5) ;;;IS THIS A SLAVED TERMINAL?-î BMI 50$ ;;;IF MI, YES...THROW AWAY THE ^C ï ð .IF DF A$$CLI&C$$CTCSñ >ò BIT #S3.CTC,4(R5) ;;;DOES THIS TERMINAL EXPECT NOTIFICATION:ó BEQ 130$ ;;;IF EQ, NO..CONTINUE WITH NORMAL PROCESSING@ô MOV U.MUP-U.TSTA(R5),R3 ;;;GET THIS CLI OFFSET INTO CPB TABLE3õ BIC #^CUM.CLI,R3 ;;;ELIMINATE ALL BUT THE OFFSETT6ö MOV $CPTBL(R3),R3 ;;;POINT TO CPB FOR THIS TERMINALG÷ BIT #CP.CTC,C.PSTS(R3) ;;;DOES THIS CLI ACCEPT NOTIFICATION PACKET?0;ø BEQ 130$ ;;;IF EQ, NO...CONTINUE WITH NORMAL PROCESSINGB6ù MOV #FR.KIL,R3 ;;;FORK TO QUEUE NOTIFICATION PACKET:ú CALL FORK ;;;QUEUE FORK REQUEST - THIS CODE ASSUMES....û ;;; ...THAT FPKIL IS ENTERED WITH BIT...$ü ;;; ...UM.KIL CLEARED IN U.MUP3ý CALL GCTAB ;;;CHECK FOR ^C IN TYPE-AHEAD BUFFERO$þ BCS 50$ ;;;IF CS BUFFER IS CLEAR,ÿ CMPB R2,#CH.CTC ;;;MAKE SURE IT IS THE ^C5 BNE 50$ ;;;IF NE, IT ISN'T...IGNORE THE CHARACTERP9 CALL RCTAB ;;;REMOVE CHARACTER FROM TYPE-AHEAD BUFFERB0 BR 50$ ;;;RETURN FOR NEXT FORK QUEUE ROUTINE  .IFF ;A$$CLI&C$$CTC  BR 130$ ;;;N - JUMPA  .ENDC ;A$$CLI&C$$CTCF  .PAGE ' .SBTTL . CHARACTER IS NOT CONTROL-CP ;S ; CHARACTER IS NOT CONTROL-C ;. 70$: ASSUME S1.IBY,200 TSTB (R5) ;;;IS INPUT BUSY?E BPL 90$ ;;;IF PL, NO...SKIPB ; 1 ; CHARACTER IS NOT CONTROL-C AND INPUT IS BUSY: 5 ; 1. IF ECHO IS REQUIRED AND OUTPUT IS BUSY, RETURNE: ; WITH CC-C = 1 (CHARACTER CAN NOT BE PROCESSED NOW).? ; 2. IF OUTPUT IS BUSY WITH THE PROMPT OF A READ WITH PROMPT, ; ; THE READ HAS NOT STARTED YET SO RETURN WITH CC-C = 1$+ ; (CHARACTER CANNOT BE PROCESSED NOW).AB ; 3. ELSE, RETURN WITH CC-C =0 (CHARACTER CAN BE PROCESSED NOW). ;: 80$:# BIT #S1.OBY,(R5) ;;;OUTPUT BUSY?N. BEQ RETCC ;;;IF EQ, NO...PROCESS CHARACTER. BIT #S1.RNE,(R5) ;;;IS LINE IN NOECHO MODE?. BEQ RETCS ;;;IF EQ, NO...CAN'T PROCESS NOW! " .IF DF T$$RPR# >$ BIT #S5.RPO,U.TST5-U.TSTA(R5) ;;;PROMPT OUTPUT IN PROGRESS?/% BNE RETCS ;;;IF NE, YES...CAN'T PROCESS NOW & ' .ENDC ;T$$RPR( ) RETCC:* CLC ;;;CLEAR CARRY$+ RETURN ;;;RETURNN, ; 5- ; CHARACTER IS NOT CONTROL-C AND INPUT IS NOT BUSY:RH. ; 1. IF UNSOLICITED INPUT ASTS ARE SET UP, REQ00œê};}±|t÷tø tþfDATAUEST A FORK TO GIVE ONE.G/ ; NOTE A SPECIAL CASE - IF THE AST BLOCK IS "LOCKED", DO NOT FORK.5H0 ; THE AST BLOCK IS LOCKED WHEN IT IS STILL IN THE TASK'S AST QUEUE,G1 ; OR WHEN TF.NOT WAS SPECIFIED AT ATTACH AND THE TASK HAS NOT DONEO02 ; A READ SINCE THE PREVIOUS AST WAS QUEUED.13 ; 2. ELSE, IF THE TERMINAL IS ATTACHED, RETURN.C04 ; 3. ELSE, FORK TO START AN UNSOLICITED INPUT.5 ; H6 ; IN ALL OF THE ABOVE CASES, RETURN WITH CC-C = 1 TO INDICATE THAT THE/7 ; CHARACTER CAN NOT BE PROCESSED IMMEDIATELY.G8 ;N9 90$:4: TST U.ATT-U.TSTA(R5) ;;;IS THE TERMINAL ATTACHED?; < .IF DF T$$CCA= > BEQ 120$ ;;;IF EQ, NO...SKIP? @ .IF DF T$$SPLA 0B MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBXC D .IFF ;T$$SPLDE <F MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX (TERMINAL IS ATTACHED"G ;;;SO THERE MUST BE ONE)H I .ENDC ;T$$SPLJ -K MOV U.TAST(R4),R3 ;;;GET AST BLOCK ADDRESSO,L BEQ RETCS ;;;IF EQ, NONE...NO AST SET UP5M TST A.PRM+10(R3) ;;;ASTS WANTED FOR OTHER THAN ^C?D#N BEQ RETCS ;;;IF EQ, NO...RETURNUO 100$: >P BITB #AF.LCK!AF.QUE,A.PRM+5(R3) ;;;IS ACB LOCKED OR QUEUED?2Q BNE RETCS ;;;IF NE, YES...CAN'T REQUEST IT NOWR 110$:2S T .IF DF T$$REDU CV BIT #S5.BCC!S5.DAO!S5.VER,R2 ;;;WAS HARD RECEIVE ERROR DETECTED?;0W BNE 50$ ;;;IF NE, YES...THROW AWAY CHARACTERX Y .ENDC ;T$$REDZ =[ MOV #FR.AST,R3 ;;;SET UP TO FORK FOR UNSOLICITED INPUT ASTO\ BR 140$ ;;;SKIP ] ^ .IFF ;T$$CCA _ <` BNE RETCS ;;;IF NE, TERMINAL IS ATTACHED...CAN'T PROCESSa b .ENDC ;T$$CCAc d 120$:06e TSTB U.CW2-U.TSTA(R5) ;;;IS THIS A SLAVED TERMINAL?4f BMI 50$ ;;;IF MI, YES...THROW THE CHARACTER AWAYg Bh ; NOTE: CHANGING THE ABOVE INSTRUCTION FROM BMI 50$ TO BMI RETCSFi ; WILL CAUSE CHARACTERS TYPED TO AN UNATTACHED SLAVED TERMINAL TO BE#j ; SAVED IN THE TYPE-AHEAD BUFFER.;k l .IF DF T$$SERm ?n BIT #UM.CMD,U.MUP-U.TSTA(R5) ;;;COMMAND ALREADY IN PROGRESS?S/o BNE RETCS ;;;IF NE, YES...CAN'T PROCESS NOWIp q .ENDC ;T$$SERr s .IF DF T$$IDOt 2u TST $MCRPT ;;;IS THE MCR DISPATCHER INSTALLED?2v BEQ RETCS ;;;IF EQ, YES...CAN'T PROCESS IT NOWw x .ENDC ;T$$IDOy z 130$:Y{ | .IF DF T$$MOD} 2~ BITB #US.DSB,U.STS-U.TSTA(R5) ;;;LINE DISABLED?9 BNE 50$ ;;;IF NE, YES...DON'T START UNSOLICITED INPUTL€ � .ENDC ;T$$MOD‚ 7ƒ MOV #FR.SUI,R3 ;;;FORK TO START AN UNSOLICITED INPUTC„ 140$:U'… CALL FORK ;;;QUEUE THE FORK REQUESTS:† BR RETCS ;;;RETURN TO INDICATE WE CAN'T PROCESS IT NOW‡ ˆ .DSABL LSB ‰ .PAGE$6Š .SBTTL . PCTAB - PUT CHARACTER IN TYPE-AHEAD BUFFER‹ ;Œ ;+:� ; **-PCTAB - PUT A CHARACTER INTO THE TYPE-AHEAD BUFFER.Ž ;OH� ; THIS ROUTINE PLACES A CHARACTER INTO A TERMINAL'S TYPE-AHEAD BUFFER.� ;I ‘ ; INPUTS:’ ; R2 = CHARACTER $“ ; R5 => U.TSTA OF THE TERMINAL UCB” ; • ; OUTPUTS:8– ; CC-C = 0 IF CHARACTER SUCCESSFULLY STORED IN BUFFER<— ; = 1 IF CHARACTER WAS NOT STORED DUE TO FULL BUFFER˜ ; ™ ; REGISTERS MODIFIED: R3, R4š ;-› ;W œ .ENABL LSB � PCTAB:ž Ÿ .IF DF T$$SPL  -¡ MOV #120000+U.TTBF,R3 ;;;SET TABUF POINTER¢ £ .IFF ;T$$SPLC¤ 0¥ MOV U.TTAB-U.TSTA(R5),R3 ;;;GET TABUF POINTER(¦ BNE 10$ ;;;IF NE...THERE IS A BUFFERC§ MOVB R2,U.TTAB+1-U.TSTA(R5) ;;;STORE CHAR. IN SINGLE-CHAR. TABUF59¨ INCB U.TTAB-U.TSTA(R5) ;;;MARK THE TABUF AS BEING FULLC© CLC ;;;SHOW SUCCESS STATUS ª RETURN ;;;ALL DONE « 10$:3¬ BIT #1,R3 ;;;IS THIS A SINGLE CHARACTER BUFFER? 7­ SEC ;;;ASSUME IT IS (AND IN USE) SO SET ERROR FLAG /® BNE 20$ ;;;IF NE, IT IS...RETURN WITH ERROR0¯ ° .ENDC ;T$$SPL± )² CALL PCBUF ;;;PUT CHARACTER IN BUFFERU$³ BCS 20$ ;;;IF CS, BUFFER IS FULL1´ CALL SNDXOF ;;;SEE IF WE NEED TO SEND AN XOFFV*µ CLC ;;;RETURN WITH SUCCESS INDICATION¶ RETURN ;;;ALL DONEC· ¸ ¹ .PAGE5=º .SBTTL . PCBUF - PUT CHARACTER INTO STANDARD FORMAT BUFFERA» ;¼ ;+<½ ; **-PCBUF - PUT A CHARACTER INTO A STANDARD FORMAT BUFFER¾ ;CG¿ ; THIS ROUTINE PLACES A CHARACTER INTO A BUFFER FORMATTED AS FOLLO00œò}‡|Ž{´cÚµcÛ¶c�·c›’WS: À ;2%Á ; +---------------+---------------+0% ; | RETRIEVAL PTR | STORE PTR |U%à ; +---------------+---------------+2%Ä ; | BUFFER SIZE | CHARACTER CNT |N%Å ; +---------------+---------------+V%Æ ; | CHARACTER BUFFER |A%Ç ; \ \%È ; +-------------------------------+CÉ ;N Ê ; INPUTS:Ë ; R2 = CHARACTER 'Ì ; R3 => TOP OF STANDARD FORMAT BUFFER Í ;A Î ; OUTPUTS:R8Ï ; CC-C = 0 IF CHARACTER SUCCESSFULLY STORED IN BUFFER<Ð ; = 1 IF CHARACTER WAS NOT STORED DUE TO FULL BUFFERÑ ;0Ò ; REGISTERS MODIFIED: R4Ó ;-Ô ;Õ PCBUF:'Ö CLR R4 ;;;PREPARE FOR BYTE TRANSFERE;× BISB (R3)+,R4 ;;;GET OFFSET WHERE TO STORE THE CHARACTER-)Ø INC R3 ;;;SKIP OVER RETRIEVAL POINTERA9Ù CMPB (R3)+,(R3)+ ;;;IS THE BUFFER FULL (COUNT = SIZE)?-)Ú SEC ;;;ASSUME YES AND SET ERROR FLAG /Û BEQ 20$ ;;;IF EQ, YES...RETURN ERROR STATUSM9Ü ADD R3,R4 ;;;SET POINTER IN BUFFER TO STORE CHARACTERR#Ý MOVB R2,(R4) ;;;STORE CHARACTER $Þ INC -(R3) ;;;COUNT THE CHARACTER%ß INC -(R3) ;;;UPDATE STORE POINTERM?à CMPB 3(R3),(R3) ;;;TIME TO WRAP (STORE = SIZE)? (CLEAR CC-C)E#á BNE 20$ ;;;IF NE, NO...ALL DONEF5â CLRB (R3) ;;;ELSE, SET POINTER AT START OF BUFFEROã 20$:ä RETURN ;;;ALL DONERå æ .DSABL LSB ç è .PAGEC>é .SBTTL . GCTAB - GET A CHARACTER FROM THE TYPE-AHEAD BUFFERê ;$ë ;+7ì ; GCTAB - GET A CHARACTER FROM THE TYPE-AHEAD BUFFER.Ií ;I î ; INPUTS:$ï ; R5 => U.TSTA OF THE TERMINAL UCBð ;H ñ ; OUTPUTS:C7ò ; CC-C = 0 IF CHARACTER WAS OBTAINED FROM THE BUFFERT%ó ; = 1 IF THE BUFFER WAS EMPTYEFô ; R2 = CHARACTER RETRIEVED FROM THE BUFFER (NOTE THAT THE CHARACTER%õ ; IS NOT REMOVED FROM THE BUFFER!)RHö ; IF THERE IS ANY UNPROCESSED DEFAULT INPUT, RETURN THE NEXT CHARACTERF÷ ; OF IT IN R2 AND WITH CC-C = 0 BEFORE CHECKING THE TYPEAHEAD BUFFERø ;R#ù ; REGISTERS ALTERED: R2, R3, R4Cú ;-û ;Eü ý .PSECT MAP5þ ÿ GCTAB::P  .IF DF T$$EIO  ASSUME S6.RDI,100000  6 TST U.TST6-U.TSTA(R5) ;;;LOOKING FOR DEFAULT INPUT? BPL 3$ ;;;N - JUMP  .IF DF T$$SPL 0 MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX  .IFF ;T$$SPLR & MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX  .IFTF ;T$$SPL : CLR R2 ;;;PREVENT FUTURE SIGN EXTENSION AND CLEAR CC-C0 BIT #S1.IBF,@R5 ;;;IS DEFAULT INPUT BUFFERED? BNE 1$ ;;;Y - JUMP  .IFT ;T$$SPL, ; MOV U.TDIP(R4),KISAR6 ;;;MAP USER'S DEFAULT INPUT BUFFERD3 BISB @U.TDIP+2(R4),R2 ;;;GET A CHARACTER FROM ITT  .IFF ;T$$SPLK 7 MOV U.TDIP+2(R4),R3 ;;;GET POINTER TO NEXT CHARACTER > MOV U.TDIP(R4),KISAR6 ;;;MAP USER'S BUFFER (MAY UNMAP UCBX)" BISB @R3,R2 ;;;GET A CHARACTER ! .ENDC ;T$$SPL" $# MOV $DALED,KISAR6 ;;;REMAP DRIVER9$ RETURN ;;;RETURN WITH CHARACTER IN R2 AND CC-C CLEAR1H% 1$: BISB @U.TDIP+2(R4),R2 ;;;GET A CHARACTER FROM DEFAULT INPUT BUFFER9& RETURN ;;;RETURN WITH CHARACTER IN R2 AND CC-C CLEARU' ( .ENDC ;T$$EIO) * 3$: ;;;REFERENCE LABELR+ , .IF DF T$$SPL- =. MOV #120000+U.TTBF+1,R2 ;;;POINT TO TABUF RETRIEVE POINTERH'/ CLR R3 ;;;PREPARE FOR BYTE TRANSFER @0 BISB (R2)+,R3 ;;;GET RETRIEVE POINTER & POINT TO ACTIVE COUNT1 2 .IFF ;T$$SPLL3 04 MOV R5,R3 ;;;POINT TO CELL CONTAINING THE...G5 ADD #U.TTAB-U.TSTA,R3 ;;; ...ADDRESS OF THE TABUF (ALSO CLEARS CC-C))$6 MOV (R3),R2 ;;;GET TABUF POINTER77 BEQ 5$ ;;;IF EQ, NOT ONE...INDICATE BUFFER IS EMPTYD78 BITB #1,(R3)+ ;;;IS THIS THE SINGLE CHARACTER TABUF?E 9 BNE 10$ ;;;IF NE, YES...SKIP': INC R2 ;;;POINT TO RETRIEVE POINTERO@; MOVB (R2)+,R3 ;;;GET RETRIEVE POINTER & POINT TO ACTIVE COUNT< = .IFTF ;T$$SPL> %? TSTB (R2)+ ;;;IS THE TABUF EMPTY?T5@ BNE 7$ ;;;IF EQ, YES...RETURN WITH THAT INDICATEDEA 5$: JMP RETCS.B 7$:A'C ADD R2,R3 ;;;MAKE POINTER IN BUFFERE1D INC R3 ;;;POINT TO NEXT CHARACTER TO RETRIEVETE F .IF DF T$$REDG ,H CMPB -(R2),#1 ;;;LAST CHARACTER IN TABUF?I BNE 10$ ;;;IF NE, NO...SKIPI;J MOV U.TST5-U.TSTA(R5),R2 ;;;GET HARD RE00œú};}±|t÷tø tþfDATACEIVE ERROR FLAGSI<K BIC #^C,R2 ;;;CLEAR IRRELEVANT BITS:L BR 20$ ;;;RETURN WITH FLAGS AND CC-C CLEAR (FROM CMPB)M N .ENDC ;T$$REDO P 10$:Q CLR R2 ;;;CLEAR R2 AND CC-C,R 20$:-S BISB (R3),R2 ;;;PUT CHARACTER IN LOW BYTE $T RETURN ;;;RETURN WITH CHARACTERU V W .PAGERAX .SBTTL . RCTAB - REMOVE A CHARACTER FROM THE TYPE-AHEAD BUFFER Y ;CZ ;+:[ ; RCTAB - REMOVE A CHARACTER FROM THE TYPE-AHEAD BUFFER.<\ ; MUST BE CALLED ONLY IF THERE IS A CHARACTER TO REMOVE!!!I] ; IF THERE IS UNPROCESSED DEFAULT INPUT, DECREMENT CHARACTER COUNT LEFTB^ ; _ ; INPUTS:$` ; R5 => U.TSTA OF THE TERMINAL UCBa ;.b ; OUTPUTS: NONE0c ; d ; REGISTERS ALTERED: R3, R4 e ;-f ;Sg .PSECT MAP5.6h i RCTAB::Wj k .IF DF T$$EIOl m ASSUME S6.RDI,100000 n 6o TST U.TST6-U.TSTA(R5) ;;;LOOKING FOR DEFAULT INPUT?p BPL 3$ ;;;N - JUMP<q INC U.TDIP+2(R4) ;;;POINT TO NEXT DEFAULT INPUT CHARACTER;r DEC U.TDIC(R4) ;;;ONE LESS DEFAULT INPUT CHARACTER TO GOV s BEQ 1$ ;;;BRANCH IF ALL DONE<t BIT #S1.IBF,@R5 ;;;ARE DEFAULT INPUT CHARACTERS BUFFERED?u BEQ 2$ ;;;N - RETURN9v DEC U.TDIP(R4) ;;;REDUCE COUNT OF CHARACTERS IN BUFFERG,w BNE 2$ ;;;BUFFER IS NOT YET EMPTY - JUMPFx MOV #T$$BFL-4,U.TDIP(R4) ;;;BUFFER IS EMPTY - RESET CHARACTER COUNTFy MOV U.TDIP+2(R4),R3 ;;;GET POINTER ONE CHARACTER PAST END OF BUFFER0z SUB #T$$BFL,R3 ;;;BACK UP TO BUFFER LINK WORD0{ MOV @R3,U.TDIP+2(R4);;;SET NEW CURRENT BUFFER<| ADD #4,U.TDIP+2(R4) ;;;POINT TO FIRST CHARACTER WITHIN IT } RETURNEF~ 1$: BIC #S6.RDI,U.TST6-U.TSTA(R5);;;NO MORE DEFAULT INPUT TO PROCESS  2$: RETURN€ � .ENDC ;T$$EIO‚ ƒ 3$: ;;;REFERENCE LABELB„ … .IFT ;T$$SPL;† =‡ MOV #120000+U.TTBF+1,R3 ;;;POINT TO TABUF RETRIEVE POINTEREˆ ‰ .IFF ;T$$SPLAŠ 1‹ MOV U.TTAB-U.TSTA(R5),R3 ;;;GET START OF TABUF 4Œ BIT #1,R3 ;;;IS THIS THE SINGLE CHARACTER TABUF? � BNE 20$ ;;;IF NE, YES...SKIP'Ž INC R3 ;;;POINT TO RETRIEVE POINTER� � .ENDC ;T$$SPL‘ (’ INCB (R3) ;;;UPDATE RETRIEVE POINTER*“ CMPB (R3)+,1(R3) ;;;DID WE WRAP AROUND?” BNE 10$ ;;;IF NE, NO...SKIP9• CLRB -1(R3) ;;;ELSE, RESET POINTER TO START OF BUFFERC– 10$:'— CALL SNDXON ;;;POSSIBLY SEND AN XON02˜ DECB (R3) ;;;UPDATE COUNT OF BYTES LEFT TO GET™ š .IF DF T$$RED› 3œ BEQ 30$ ;;;IF EQ, LAST CHARACTER REMOVED...SKIPB� ž .IFTF ;T$$REDŸ   RETURN ;;;ALL DONE ¡ ¢ .IF NDF T$$SPL.£ ¤ 20$:@¥ CLR U.TTAB-U.TSTA(R5) ;;;MARK SINGLE-CHARACTER TABUF AS EMPTY¦ § .ENDC ;NDF T$$SPL¨ © .IFT ;T$$RED ª « 30$:C¬ BIC #S5.BCC!S5.DAO!S5.VER,U.TST5-U.TSTA(R5) ;;;CLEAR ERROR FLAGSR­ ® .ENDC ;T$$RED¯ ° RETURN ;;;ALL DONE0± .PAGELB² .SBTTL . SNDXOF - SEND XOFF IF TYPE-AHEAD BUFFER IS NEARLY FULL³ ;S´ ;+Aµ ; SNDXOF - SEND XOFF IF HOSTSYNC ENABLED AND TABUF NEARLY FULL.T¶ ;M · ; INPUTS:"¸ ; R3 => TOP OF TYPE-AHEAD BUFFER$¹ ; R5 => U.TSTA OF THE TERMINAL UCBº ;» ; OUTPUTS: NONE-¼ ;A½ ; REGISTERS ALTERED: R4 ¾ ;-¿ ;P À .ENABL LSBCÁ  SNDXOF: 5à BIT #S4.HSY,6(R5) ;;;HOST SYNCHRONIZATION ENABLED?5&Ä BEQ 20$ ;;;IF EQ, NO...JUST RETURNÅ Æ .IF DF T$$SPLÇ =È MOVB U.TBSZ-U.TSTA(R5),R4 ;;;GET SIZE OF TYPE-AHEAD BUFFERS>É SUB #XHIPNT,R4 ;;;COMPUTE CHAR. COUNT AT WHICH TO SEND XOFFÊ :Ë CMPB 2(R3),R4 ;;;DID WE REACH THE HIGH THRESHOLD POINT?Ì Í .IFF ;T$$SPL Î ?Ï CMPB 2(R3),#XHIPNT ;;;DID WE REACH THE HIGH THRESHOLD POINT?Ð Ñ .ENDC ;T$$SPLÒ *Ó BNE 20$ ;;;IF NE, NO...DON'T SEND XOFFFÔ BIS #S5.OXF!S5.XOF,U.TST5-U.TSTA(R5) ;;;REQUEST XOFF OUTPUT & STATEÕ BR 10$ ;;;JOIN COMMON CODEÖ B× .SBTTL . SNDXON - SEND XON IF TYPE-AHEAD BUFFER IS NEARLY EMPTYØ ;(Ù ;+EÚ ; SNDXON - SEND XON IF XOFF PREVIOUSLY SENT AND TABUF NEARLY EMPTY.CÛ ;A Ü ; INPUTS::Ý ; R3 => TABUF ACTIVE BYTE COUNT BEFORE BEING DECREMENTED$Þ ; R5 => U.TSTA OF THE TERMINAL UCBß ;Pà ; OUTPUTS: NONEDá ;Eâ ; REGISTERS ALTERED: R4ã ;-ä ;N å SNDXON:>æ BIT #S5.OXF,U.TST5-U.TSTA(R5) ;;;PREVIOUSLY OUTPU00œ~‡|Ž{´cÚµcÛ¶c�·c›’T AN XOFF?#ç BEQ 20$ ;;;IF EQ, NO...ALL DONEF?è CMPB (R3),#XLOPNT+1 ;;;DID WE REACH THE LOW THRESHOLD POINT? -é BHI 20$ ;;;IF HI, NO...DON'T SENT XON YETY5ê BIC #S5.OXF,U.TST5-U.TSTA(R5) ;;;RESET XOFF STATUSO6ë BIS #S5.XON,U.TST5-U.TSTA(R5) ;;;SET XON STATUS BITì 10$:;í MOV R2,-(SP) ;;;SAVE REGISTERS DESTROYED BY CTRD ROUTINE î MOV R3,-(SP) ;;;Lï ASSUME CT.STA,0*ð CLR R2 ;;;SET INDEX FOR "START OUTPUT"2ñ CALL CTRD ;;;CALL CONTROLLER DEPENDENT ROUTINE*ò MOV (SP)+,R3 ;;;RESTORE SAVED REGISTERSó MOV (SP)+,R2 ;;;Oô 20$:õ RETURN ;;;ALL DONETö ÷ .DSABL LSBTø ù .PAGEO6ú .SBTTL . ABOX/ABOXL - ABORT CURRENT TERMINAL OUTPUTû ; ü ;+Hý ; ABOXL - LOCK OUT INTERRUPTS AND CALL CONTROLLER-DEPENDENT ROUTINE TOþ ; ABORT THE CURRENT OUTPUT. ÿ ;- ;V .PSECT MAP5  ABOXL:: # CALL LOCKI ;LOCK OUT INTERRUPTS, ABOX:L1 MOV #CT.ABO,R2 ;;;SET INDEX FOR "ABORT OUTPUT"S ;;;FALL THRU TO "CTRD" 4 .SBTTL . CTRD - CALL CONTROLLER DEPENDENT ROUTINE ;S ;+- ; CTRD - CALL CONTROLLER DEPENDENT ROUTINE.R ;; ; INPUTS: ; R2 = ROUTINE INDEX: ; 0 - START OUTPUTA ; 2 - ABORT OUTPUTR ; 4 - RESUME OUTPUT ; 6 - STOP OUTPUT ; 10 - POWER-UP (RSX-11M) ; 12 - MODEM TIMER (RSX-11M) + ; 14 - GET/SET LINE PARAMETERS (RSX-11M)A$ ; 10 - MODEM TIMER (RSX-11M-PLUS), ; 12 - CONTROLLER POWER-UP (RSX-11M-PLUS)& ; 14 - UNIT POWER-UP (RSX-11M-PLUS)* ; 16 - CONTROLLER ONLINE (RSX-11M-PLUS)+ ; 20 - CONTROLLER OFFLINE (RSX-11M-PLUS)+$ ; 22 - UNIT ONLINE (RSX-11M-PLUS)% ; 24 - UNIT OFFLINE (RSX-11M-PLUS)=0 ; 26 - GET/SET LINE PARAMETERS (RSX-11M-PLUS)  ; R5 => U.TSTA OF TERMINAL UCB ; ; OUTPUTS:U4! ; THE CONTROLLER DEPENDENT ROUTINE IS CALLED WITH:C" ; R2 = PHYSICAL UNIT NUMBER * 2 (ONLY IF MULTIPLEXERS IN SYSTEM) /# ; R3 => CSR ADDRESS FOR TERMINAL'S CONTROLLERR$ ; R4 => UCBX FOR THE TERMINAL &% ; R5 => U.TSTA OF THE TERMINAL'S UCB& ;T#' ; REGISTERS ALTERED: R2, R3, R4 ( ;-) ;R* CTRD::+ , .IF DF R$$MPL- 2. MOV U.SCB-U.TSTA(R5),R3 ;;;GET SCB FOR THIS UCB/ MOV S.KRB(R3),R3 ;;;GET KRB+0 MOVB K.PRM(R3),R4 ;;;GET CONTROLLER TYPE.A1 ADD CTBL(R4),R2 ;;;POINT TO DISPATCH TABLE FOR CONTROLLER TYPEN2 MOV (R3),R3 ;;;GET CSR3 4 .IFF ;R$$MPLU5 36 MOVB U.CTYP-U.TSTA(R5),R4 ;;;GET CONTROLLER TYPE=A7 ADD CTBL(R4),R2 ;;;POINT TO DISPATCH TABLE FOR CONTROLLER TYPER%8 MOV U.SCB-U.TSTA(R5),R3 ;;;GET SCBL9 MOV S.CSR(R3),R3 ;;;GET CSR: ; .ENDC ;R$$MPL< = .IF DF T$$SPL> 0? MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX@ A .IFF ;T$$SPLB 8C MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX (IF THERE IS ONE)D E .ENDC ;T$$SPLF G .IF DF T$$MUXH )I MOV (R2),-(SP) ;;;PUSH ROUTINE ADDRESS(8J MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET PHYSICAL UNIT NUMBERK ASL R2 ;;;MULTIPLY BY 2O+L CALLR @(SP)+ ;;;CALL ROUTINE AND RETURNSM N .IFF ;T$$MUXOO +P CALLR @(R2)+ ;;;CALL ROUTINE AND RETURNLQ R .ENDC ;T$$MUXS T .PAGE =U .SBTTL . GETPIC - GET PREVIOUS CHARACTER FROM INPUT BUFFER V ;TW ;+5X ; GETPIC - GET PREVIOUS CHARACTER FROM INPUT BUFFERTY ;T Z ; INPUTS:[ ; R4 => UCBX FOR THE TERMINAL $\ ; R5 => U.TSTA OF THE TERMINAL UCB] ; ^ ; OUTPUTS: -_ ; CC-C = 0 IF THERE IS A PREVIOUS CHARACTER(%` ; = 1 IF THERE IS NO CHARACTERAa ; R2 = CHARACTER 'b ; R3 => CHARACTER IN THE INPUT BUFFERR1c ; U.TIP, U.TIP+2, U.TIC AND U.TTIC "DOWN-DATED";5d ; (CHARACTER LOGICALLY REMOVED FROM INPUT BUFFER) e ; f ; REGISTERS ALTERED: R2, R3Ug ;-h ; i j GETPIC:E$k MOV R4,-(SP) ;;;SAVE UCBX POINTERl ASSUME U.TCI,0I:m MOV (R4)+,R3 ;;;GET CURRENT PACKET (IF SOLICITED INPUT)n ASSUME U.TIP,U.TCI+2O9o MOV (R4)+,R2 ;;;GET CURRENT BUFFER (IF BUFFERED INPUT)H,p ADD #4,R2 ;;;POINT AT START OF DATA AREA,q BIT #S1.IBF,(R5) ;;;DOING BUFFERED INPUT? r BNE 10$ ;;;IF NE, YES...SKIP9s MOV I.PRM+2(R3),R2 ;;;GET START ADDRESS OF TASK BUFFERt 10$::u MOV (R4),R3 ;;;GET CURRENT CHARACTER POINTER (U.TIP+2)7v CMP R3,R2 ;;;POINTING AT START00œ ~;}±|t÷tø tþfDATA OF (CURRENT) BUFFER? -w BHI 50$ ;;;IF HI, NO...ALL IS OK, SO SKIP.,x BIT #S1.IBF,(R5) ;;;DOING BUFFERED INPUT?9y BEQ 30$ ;;;IF EQ, NO...RETURN WITH INPUT BUFFER EMPTY+8z MOV U.TFIB-(R4),R3 ;;;GET FIRST INPUT BUFFER.{ CMP R3,-(R4) ;;;ARE WE IN THE FIRST BUFFER?+| BEQ 30$ ;;;IF EQ, YES...EXIT WITH ERROR A} CLR U.TIC-U.TIP(R4) ;;;CLEAR U.TIC (SWITCHING BACK TO PREVIOUS (~ ;;;BUFFER, WHICH IS FULL JUST NOW). ADD -(R2),U.TTIC-U.TIP(R4) ;;;UPDATE U.TTIC€ ; K� ; SCAN LIST OF INPUT BUFFERS UNTIL THE BUFFER PREVIOUS TO THE ONE POINTED ‚ ; TO BY R2 IS FOUND.ƒ ;(„ 20$:+… CMP (R3),(R4) ;;;POINTING TO OUR BUFFER?O † BEQ 40$ ;;;IF EQ, YES...SKIP/‡ MOV (R3),R3 ;;;ELSE GET POINTER TO NEXT ONEUˆ BR 20$ ;;;LOOP‰ ; 8Š ; NO CHARACTERS ARE IN THE BUFFER - EXIT WITH CC-C = 1‹ ;TŒ 30$:'� MOV (SP)+,R4 ;;;RESTORE UCBX POINTERI Ž SEC ;;;RETURN WITH CC-C = 1� RETURN ;;;ALL DONEU� ;S+‘ ; PREVIOUS BUFFER FOUND - R3 POINTS TO ITT’ ;T“ 40$:/” MOV R3,(R4)+ ;;;MAKE THIS THE CURRENT BUFFER :• ADD #T$$BFL,R3 ;;;POINT JUST AFTER LAST CHAR. IN BUFFER– ;:F— ; WE NOW HAVE R3 POINTING JUST AFTER THE LAST CHARACTER IN THE INPUTG˜ ; BUFFER. THE UCBX IS UPDATED IF WE HAD TO GO TO THE PREVIOUS BUFFER.;™ ;š 50$:#› DEC R3 ;;;STEP BACK 1 CHARACTERX!œ MOV R3,(R4)+ ;;;UPDATE U.TIP+2M� INC (R4) ;;;UPDATE U.TIC'ž MOV (SP)+,R4 ;;;RESTORE UCBX POINTERŸ ;;;FALL THRU TO "GETRIC"  .PAGEO1¡ .SBTTL . GETRIC - GET A RANDOM INPUT CHARACTER ¢ ;R£ ;+)¤ ; GETRIC - GET A RANDOM INPUT CHARACTER#¥ ;L ¦ ; INPUTS:#§ ; R3 => CHARACTER TO BE RETRIEVED¨ ; R4 => UCBX FOR THE TERMINALA© ;T ª ; OUTPUTS:E« ; R2 = CHARACTERU ¬ ; CC-C = 0­ ;P® ; REGISTERS ALTERED: R2P¯ ;-° ;F ± GETRIC:"² CALL MAPIB ;;;MAP INPUT BUFFER9³ CLR R2 ;;;PREPARE TO RECEIVE CHARACTER AND CLEAR CC-C;>´ BISB (R3),R2 ;;;GET CHARACTER WITHOUT SIGN EXTEND PROBLEMSµ RETURN ;;;RETURN TO CALLERO¶ .PAGET7· .SBTTL . PUTNIC - PUT NEXT INPUT CHARACTER IN BUFFER ¸ ;R¹ ;+/º ; PUTNIC - PUT NEXT INPUT CHARACTER IN BUFFER» ;3 ¼ ; INPUTS: ½ ; R2 = CHARACTER TO BE STORED¾ ; R4 => UCBX FOR THE TERMINALU$¿ ; R5 => U.TSTA OF THE TERMINAL UCBÀ ; Á ; OUTPUTS:E% ; CHARACTER STORED IN INPUT BUFFER.à ; U.TIP+2 AND U.TIC UPDATED.Ä ;Å ; REGISTERS ALTERED: R3IÆ ;-Ç ;R È PUTNIC:C.É MOV U.TIP+2(R4),R3 ;;;GET CHARACTER POINTER&Ê CALL MAPIB ;;;MAP THE INPUT BUFFER'Ë MOVB R2,(R3) ;;;STORE THE CHARACTERN"Ì CALL @(SP)+ ;;;RESTORE MAPPING.Í INC U.TIP+2(R4) ;;;UPDATE CHARACTER POINTER*Î DEC U.TIC(R4) ;;;UPDATE CHARACTER COUNTÏ RETURN ;;;ALL DONERÐ .PAGE4(Ñ .SBTTL . MAPD - MAP DRIVER DATA SPACEÒ ; Ó ;+ Ô ; MAPD - MAP DRIVER DATA SPACEÕ ;-Ö ;E× Ø .IF DF T$$COMÙ Ú MAPD::Û Ü .IF NDF T$$SPLÝ /Þ MOV #0,KDSAR5 ;;;MAP TTCOM IN D-SPACE APR 5N5ß PAR5S==.-4 ;;;FILLED IN AT VIRGIN INITIALIZATION à á .ENDC ;NDF T$$SPLâ )ã MOV #0,KINAR6 ;;;MAP TOP 4K OF DRIVERC5ä PAR6I==.-4 ;;;FILLED IN AT VIRGIN INITIALIZATION2å BR RESM ;;;æ ç .ENDC ;T$$COMè $é .SBTTL . MAPIB - MAP INPUT BUFFERê ; ë ;+ì ; MAPIB - MAP INPUT BUFFERí ;D î ; INPUTS:ï ; R4 => UCBX FOR THE TERMINAL-#ð ; R5 = U.TSTA OF THE TERMINAL UCB ñ ;. ò ; OUTPUTS: !ó ; INPUT BUFFER MAPPED IN KISAR66ô ; CALLER CALLED BACK AS A COROUTINE - WITH CC-C = 0.;õ ; "RETURN" LEADS BACK TO THIS ROUTINE WHICH THEN RESTORES.>ö ; KISAR6 AND RETURNS TO CALLER'S CALLER WITH CC-C PRESERVED.÷ ;AOø ; NOTE - WHEN THE CALLER IS CALLED AS COROUTINE, THE UCBX MAY NOT BE MAPPED!Cù ;Cú ; REGISTERS ALTERED: NONE û ;-ü ;Rý MAPIB:"þ CLC ;;;ASSUME WANT CC-C CLEAR,ÿ BIT #S1.IBF,(R5) ;;;DOING BUFFERED INPUT?0 BNE 10$ ;;;IF NE, YES...DON'T CHANGE MAPPING* MOV U.TIP(R4),KISAR6 ;;;MAP TASK BUFFER 10$:# CALL @(SP)+ ;;;CALL CALLER BACK   .IF NDF T$$COMR  MAPD::  .ENDC ;NOT T$$COM  RESM:.& MOV $DALED,KISAR6 ;;;RESTORE KISAR6 RETURN ;;;RETURN TO CALLER   .ENDN CALLER IS CALLE00�~‡|Ž{´cÚµcÛ¶c�·c›’ .TITLE TTRW .IDENT /07.10/ ;D; 8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;  ;R ; 25-JAN-78 PETER WANNHEDENL ;L ; PREVIOUSLY MODIFIED BY:O; ; P. WANNHEDEN; D. R. DONCHIN ; T. LEKAS; S. C. ADAMSA; R. S. PHILPOTT;R; MODIFICATION HISTORY: ;; S.C. ADAMS 21-FEB-86 07.009; SA454 -- FIX PROBLEMS WITH TYPING CONTROL CHARACTERS ; TO CONTINUATION LINES;R; S.C. ADAMS 16-JUN-86 07.01-; SA462 -- ELIMINATE REDUNDANT INSTRUCTIONL;E; L. KOGAN 08-SEP-86 07.025; LK715 -- ADD SUPPORT FOR Q-BUS DMA TRANSFER FROM; A TASK BUFFER;E; S.C. ADAMS 30-DEC-86 07.036; SA466 -- POINT TO U.TFOB BEFORE JUMPING TO WRITE1;; L. KOGAN 20-FEB-87 7.04A<; LK720 -- SUPPORT DIRECT TRANSFER FOR "PURE" IO.WAL ONLY;.; S.C. ADAMS 18-MAR-87 07.05; SA469 -- FIX BUG IN LK720;R; S.C. ADAMS 30-APR-87 07.06?; SA471 -- DEALLOCATE TERMINATOR TABLE ON ABORTED EIO TF.RPR 9; CLEAR POINTER TO READ WITH PROMPT BUFFER TO AVOID -/; DOUBLE DEALLOCATION AFTER ABORTED IO.RPR ;F; L. KOGAN 08-MAY-87 7.07R<; LK724 -- FIX IO.RPR!TF.BIN PROCESSING FOR DMA TRANSFERS;O; L. KOGAN 26-JUN-87 7.089; LK726 -- SUPPORT Q-BUS DMA TRANSFER FOR REMOTE LINESE;A; L. KOGAN 30-JUN-87 7.096; LK727 -- FIX THE PROBLEM WITH ABORTING THE OUTPUT#; FOR Q-BUS DMA TERMINAL LINES-;7; L. KOGAN 02-JUL-87 7.10A<; LK728 -- CHANGE DMA IO.WAL PACKET FORMAT (NO FLAG WORD); (INCLUDES LK727)F;+; ****** T T R W ******O;NH; THIS MODULE CONTAINS THE ROUTINES TO STARTUP AND COMPLETE A READ ORP; WRITE REQUEST THAT HAS BEEN DEQUEUED FOR A TERMINAL. BOTH TYPES OF REQUESTSK; HAVE THREE PARTS. THE FIRST STEP DOES PRE-PROCESSING OF THE PARAMETERSGM; CONTAINED IN THE I/O PACKET NECESSARY TO PROCEED TO THE SECOND STEP. THE K; SECOND STEP SETS UP BUFFER POINTERS, ETC. FOR THE NEXT PART OF THE DATA7M; TRANSFER. THIS STEP IS REPEATED UNTIL THE TRANSFER FULLY COMPLETES. THEM; FINAL STEP CLEANS UP AND PASSES THE I/O REQUEST BACK TO THE SYSTEM WITH ASJ ; COMPLETION STATUS. NOTE THAT BOTH SOLICITED AND UNSOLICITED INPUT ARE"!; HANDLED BY THE INPUT ROUTINES.";-#;A($ .SBTTL .MCALLS AND SYMBOL DEFINITIONS%& .MCALL TTSYM$"' TTSYM$ ;DEFINE TF.XXX SYMBOLS() .IF DF T$$SPC!T$$CCA!T$$EIO*+ .MCALL PKTDF$5, PKTDF$ ;DEFINE CLI COMMAND BUFFER HEADER OFFSETSR'- ;AND ACB OFFSETS AND IOPX OFFSETSI. .ENDC ;T$$SPC!T$$CCA!T$$EIO/0 .PSECT MAP5.612.PAGEP43 .SBTTL PPEIO - EXTENDED READ/WRITE PRE-PROCESSING4;T5;+B6; **-PPEIO - PRE-PROCESSING FOR EXTENDED READ AND WRITE (IO.EIO)7;EI8; THIS ROUTINE DOES THE SETUP NECESSARY TO START UP AN EXTENDED READ ORB29; WRITE REQUEST. THE FOLLOWING STEPS ARE TAKEN:A:; 1. LOCATE THE I/O PACKET EXTENSION (IOPX) ASSOCIATED WITH THEC;;; IO.EIO REQUEST'S I/O PACKET. THE IOPX IS REMOVED FROMS<; THE IOPX LIST.OD=; 2. MOVE THE I/O FUNCTION MODIFIERS FROM THE IOPX TO THE FUNCTION=>; CODE FIELD IN THE CURRENT I/O PACKET. THE FUNCTION CODER=?; IS FLAGGED AS AN IO.EIO REQUEST BY SETTING THE HIGH BIT.EA@; 3. ALL PARAMETERS THAT WERE EARLIER SAVED IN THE IOPX ARE NOW :A; TRANSFERRED TO THE I/O PACKET FOR THE IO.EIO REQUEST.B; 4. THE IOPX IS DEALLOCATED.:@C; 5. DISPATCH TO THE ROUTINE FOR HANDLING THE SPECIFIC TYPE OFD; I/O REQUEST.UE; MF; *** NOTE *** AT PRESENT, THIS ROUTINE ASSUMES THAT THE ONLY REQUEST THAT/FG; WILL GET PASSED TO IT IS AN EXTENDED READ REQUEST (IO.EIO!TF.RLB).FH; ANY IO.EIO!TF.WLB OPERATION IS EXPECTED TO HAVE BEEN MAPPED INTO A?I; NORMAL IO.WLB REQUEST PRIOR TO BEING QUEUED (WITH NO IOPX).RJ;L K; INPUTS:%L; R3 => CURRENT I/O REQUEST PACKETH M; R4 => UCBX FOR THE TERMINAL%N; R5 => U.TSTA OF THE TERMINAL UCBJO; U.TRTT(R4) => TERMINAT00�~;}±|t÷tø tþfDATAOR TABLE FOR THE READ, IF ANY (SET UP BY FPGRQ).P; I.LNK(R3) = 0*Q;E R; OUTPUTS:TS; IOPX IS DEALLOCATEDAGT; CURRENT I/O PACKET IS SET UP FOR PROCESSING BY "PPRLB" OR "PPRPR1".EU; $V; REGISTERS MODIFIED: R0, R1, R2W;-X; YZ .IF DF T$$EIO[\ ASSUME I.XLNK,0] ASSUME I.XLNK+2,I.XIOPO^ ASSUME I.XIOP+2,I.XTCB)_ ASSUME I.XTCB+2,I.XMOD ` ASSUME I.XMOD+4,I.XRBFPa ASSUME I.XRBF+4,I.XRBL b ASSUME I.XRBL+2,I.XTMOTc ASSUME I.XTMO+2,I.XPBFd ASSUME I.XPBF+4,I.XPBLTe ASSUME I.XPBL+2,I.XPBVSf gPPEIO::.&h MOV R5,R0 ;GET COPY OF UCB POINTER@i ADD #U.TIXL-U.TSTA,R0 ;MAKE POINTER TO U.TIXL (IOPX LISTHEAD)j10$:2k MOV R0,R1 ;MAKE THIS THE PREVIOUS IOPX POINTER>l MOV (R1),R0 ;LOCATE THE NEXT IOPX (MUST BE HERE SOMEWHERE)mCn CMP I.XIOP(R0),R3 ;DOES THIS IOPX BELONG TO THE CURRENT REQUEST?-o BNE 10$ ;IF NE, NO...LOOP TILL WE FIND ITX5p MOV (R0),(R1) ;REMOVE THIS IOPX FROM THE WAIT LISTXq>r ADD #I.XMOD,R0 ;POINT PAST LINK, I/O PACKET AND TCB OFFSETS?s MOV (R0)+,I.FCN(R3) ;STORE REQUESTED MODIFIERS IN I/O PACKETUt-u TST (R0)+ ;SKIP OVER UNUSED MODIFIER WORDTvEw BIS #S6.EIO,U.TST6-U.TSTA(R5) ;INDICATE REQUEST IS (WAS) AN IO.EIOX&x MOV R3,R1 ;COPY I/O PACKET ADDRESS8y ADD #I.PRM,R1 ;MAKE A POINTER INTO THE PARAMETER LIST@z MOV (R0)+,(R1)+ ;COPY 1.ST ADDRESS DOUBLE WORD OF DATA BUFFER@{ MOV (R0)+,(R1)+ ;COPY 2.ND ADDRESS DOUBLE WORD OF DATA BUFFER+| MOV (R0)+,(R1)+ ;COPY DATA BUFFER LENGTHP-} MOV (R0)+,(R1)+ ;COPY TIMEOUT FOR THE READM~20$:B€ MOV (R0)+,(R1)+ ;COPY 1.ST ADDRESS DOUBLE WORD OF PROMPT BUFFERB� MOV (R0)+,(R1)+ ;COPY 2.ND ADDRESS DOUBLE WORD OF PROMPT BUFFER-‚ MOV (R0)+,(R1)+ ;COPY PROMPT BUFFER LENGTHV"ƒ MOV (R0),(R1) ;COPY PROMPT VFC„.… SUB #I.XPBV,R0 ;POINT BACK TO START OF IOPX† MOV R3,-(SP) ;SAVE R3#‡ MOV #I.XLEN,R1 ;GET SIZE OF IOPXU ˆ CALL $DEACB ;DEALLOCATE IOPX‰ MOV (SP)+,R3 ;RESTORE R3 Š‹ .IF DF T$$RPRŒ;� BIT #TF.RPR,I.FCN(R3) ;DID USER REQUEST A READ W/PROMPT?F4Ž BEQ PPRLB1 ;IF EQ, NO...PROCESS AS A NORMAL READ7� JMP PPRPR1 ;GO PROCESS THE PROMPT PART AS AN OUTPUT+�‘ .IFF ;T$$RPRO’“ .IF DF B$$MAP”/• BR PPRLB1 ;PROCESS AS A NORMAL READ REQUEST–— .ENDC ;B$$MAP˜™ .ENDC ;T$$RPRš› .ENDC ;T$$EIOœ�.PAGEO&ž .SBTTL INPUT REQUEST PRE-PROCESSING6Ÿ .SBTTL . PPRSD - READ-SPECIAL-DATA REQUEST (IO.RSD) ;O¡;+<¢; **-PPRSD - PRE-PROCESSING FOR READ-SPECIAL-DATA (IO.RSD)=£; **-PPRLB - PRE-PROCESSING FOR READ-LOGICAL-BLOCK (IO.RLB)R¤;;I¥; THIS ROUTINE DOES THE SETUP NECESSARY TO START UP AN IO.RSD OR IO.RLB 6¦; REQUEST. ANY OF THE FOLLOWING STEPS MAY BE TAKEN:B§; 1. FOR ENTRY AT "PPRSD", THE HIGH BYTE OF THE FUNCTION CODE IS;¨; CLEARED, SINCE IT MAY BE NECESSARY TO STORE OTHER READ"©; MODIFIERS FOR LATER CHECKING.Gª; 2. FOR ENTRY AT "PPRLB", THE UNSOLICITED INPUT AST CONTROL BLOCK IS<«; UNLOCKED IN CASE IT IS LOCKED DUE TO A NOTIFICATION AST>¬; HAVING BEEN SENT (TF.NOT MODIFIER ON THE ATTACH REQUEST).A­; 3. THE I/O REQUEST PACKET BECOMES THE CURRENT REQUEST PACKET.UD®; 4. THE MODIFIERS FROM THE READ REQUEST ARE COMBINED WITH CERTAIN>¯; TERMINAL CHARACTERISTICS TO DEFINE WHAT THE MODIFIERS FOR?°; THE CURRENT READ WILL BE. FOR EXAMPLE, IF THE TERMINAL ISH?±; SET TO "NOECHO" MODE, THE READ MODIFIER TF.RNE WILL BE SET <²; REGARDLESS OF WHETHER THE USER SPECIFIED IT IN THE QIO.9³; THE RESULTING MODIFIERS ARE SAVED IN THE I/O PACKET.H7´; 5. THE TIMEOUT REQUEST MODIFIER/VALUE IS PROCESSED.@µ; 6. THE APPROPRIATE STATUS BITS ARE ESTABLISHED TO MARK INPUT*¶; BUSY AND INITIALIZE INPUT PROCESSING.=·; 7. A REQUEST FOR "LEADING LINEFEED" IS MADE IF NECESSARY.FH¸; 8. CONTROL IS PASSED TO THE ROUTINES TO START BUFFERED OR UNBUFFERED#¹; INPUT, WHICHEVER IS NECESSARY.Hº;D »; INPUTS:$¼; R3 => CURRENT I/O REQUEST PACKET½; R4 => UCBX FOR THE TERMINALE$¾; R5 => U.TSTA OF THE TERMINAL UCB4¿; I.LNK(R3) = 0 IF THE REQUEST IS IO.RLB OR IO.RSDBÀ; = 1 IF THIS IS THE RE00�"~‡|Ž{´cÚµcÛ¶c�·c›’AD PART OF A READ AFTER PROMPT REQUEST,Á; (THE PROMPT OUTPUT HAS BEEN COMPLETED) Â; OUTPUTS:ACÃ; R2 => FIRST INPUT BUFFER (IF BUFFERED INPUT IS TO BE STARTED)D&Ä; (R4) => CURRENT I/O REQUEST PACKET2Å; UCB STATUS AND UCBX INITIALIZED TO START INPUTÆ;I$Ç; REGISTERS MODIFIED: R0, R1, R2È;-É;:ÊË .IF DF B$$MAPÌ ÍPPRSD::T=Î CLRB I.FCN+1(R3) ;CLEAR OUT HIGH BYTE OF THE FUNCTION CODEM$Ï BR RLB1 ;CONTINUE IN COMMON CODEÐÑ .ENDC ;B$$MAPÒ7Ó .SBTTL . PPRLB - READ-LOGICAL-BLOCK REQUEST (IO.RLB)TÔ ÕPPRLB:: Ö× .IF DF T$$EIOØGÙ BIC #S6.EIO,U.TST6-U.TSTA(R5) ;INDICATE THAT THIS IS NOT EXTENDED IO ÚÛ .ENDC ;T$$EIOÜ-Ý CLRB I.FCN+1(R3) ;CLEAR FLAGS IN HIGH BYTE Þ ßPPRLB1: àá .IF DF T$$CCAâEã MOV U.TAST(R4),R0 ;GET UNSOLICITED INPUT AST BLOCK IF THERE IS ONE ä#å BEQ RLB1 ;IF EQ, NOT ONE...SKIP3Cæ BICB #AF.LCK,A.PRM+5(R0) ;UNLOCK THE AST BLOCK IN CASE IT WAS...Nç ; ...LOCKED DUE TO TF.NOTPèé .ENDC ;T$$CCAêëìRLB1:Bí;î BIC #S5.ITI,U.TST5-U.TSTA(R5) ;INDICATE THAT THIS IS NOTï ;IMMEDIATE TIMEOUTAð ASSUME U.TCI,0 0ñ MOV R3,(R4)+ ;SAVE THE CURRENT PACKET ADDRESSò;COó; SET UP THE FULL READ MODIFIERS FOR THE CURRENT READ REQUEST. THIS INVOLVESKô; TAKING THE MODIFIERS SPECIFIED WITH THE READ AND "OR'ING" THEM WITH THEMõ; PERMANENT CHARACTERISTICS FLAGS. NOTE THAT THE MODIFIERS MAY EXTEND INTO Cö; THE HIGH BYTE OF I.FCN IF CONTROL WAS PASSED HERE FROM "PPEIO".M÷; NOTE: IF THERE IS EVER A READ MODIFIER WITH THE SAME BIT VALUE AS S1.TSYELø; AND S3.TSY, THIS HERE ROB PHILPOTT MEMORIAL BIT SETTING CODE WILL BREAK!ù; ú ASSUME TF.RAL,S3.RALAû ASSUME TF.RNE,S3.NECTü ASSUME TF.RPT,S3.PTHRý ASSUME TF.RES,S3.RES.Aþ MOV I.FCN(R3),R0 ;GET ALL READ MODIFIERS (COULD BE FROM PPEIO)Aÿ/ BIC #4,R0 ;CLEAR MODIFIERS THAT WON'T MAPT; MOV 4(R5),R1 ;GET THE CURRENT INPUT CHARACTERISTICS BITS @ BIC #^C,R1 ;CLEAN THEM UP; BIS R1,R0 ;"OR" IN PERM CHARACTERISTICS WITH TEMP FLAGSU> MOV R0,I.FCN(R3) ;SAVE THE COMPLETE FLAGS IN THE I/O PACKET;T; SET UP RST AND RSP;7 BIT #TF.RST, R0 ;DOING OLD-STYLE READ W/ SPEC. TERM?M  BEQ 5$ ;BR IF NO >  BIS #S1.RSP!S1.RNF!S1.TNE,R0 ;FORCE SPEC PROC AND NO FILTER 5$: 3  BIT #TF.RTT,R0 ;NEW-STYLE READ WITH TERM. TABLE?A BEQ 10$ ;BR IF NOR6 BIS #S1.RST,R0 ;SAY WE'RE USING SPECIAL TERMINATORS10$: .IF DF T$$EIO  MOV R0,R1 ;GET FUNCTION CODE ASSUME TF.RDI,S6.RDIE ASSUME TF.RLU,S6.RLU6 BIC #^C,R1 ;ISOLATE RDI AND RLU BITS; BIS R1,U.TST6-U.TSTA(R5) ;AND PLOP THEM INTO STATUS WORDO .ENDC ;T$$EIO;) ; SET UP TTSYNC AND PASTHRU AS FOLLOWS:.G!; 1. OLD STYLE "TF.RAL" AND "SET /RPA (S3.RAL)" MAP INTO PASTHRU MODEN"; WITH TTSYNC DISABLED.G#; 2. NEW STYLE "TF.RPT" AND "PASTHRU MODE" ARE INDEPENDENT OF TTSYNC.TC$; 3. IF TTSYNC IS DISABLED, TF.RPT IS EQUIVALENT TO OLD "TF.RAL".T%;O& ASSUME S3.RAL,S1.PTHS' ASSUME S3.TSY,S1.TSYS3( BIT #TF.RAL,R0 ;WAS EITHER TF.RAL OR S3.RAL SET? 7) BEQ 20$ ;IF EQ, NO...SKIP TO CHECK FOR PASTHRU MODEI<* BIC #S1.TSY,(R5) ;CLEAR TTSYNC FOR OLD READ-PASS-ALL MODE:+ BIC #S1.TSY,R0 ;CLEAR TTSYNC FOR OLD READ-PASS-ALL MODE7, BR 30$ ;SKIP TO FORCE PASTHRU MODE ON THE READ ALSOT-20$:3. BIT #TF.RPT,R0 ;WAS EITHER TF.RPT OR S3.PTH SET?D;/ BEQ 40$ ;IF EQ, NO...SKIP TO FINISH MODIFIER PROCESSING 030$:1;2 BIS #S1.PTH,R0 ;BOTH TF.RPT AND TF.RAL USE PASSTHRU MODE3;ML4; ESTABLISH THE TIMEOUT VALUE TO BE USED FOR THIS READ REQUEST. NOTE THATN5; NORMAL READS MULTIPLY THE TIMEOUT VALUE BY TEN. "IO.EIO" TAKE THE TIMEOUTL6; VALUE AS SPECIFIED. A ZERO TIMEOUT ON A NORMAL READ WILL TIME OUT WHICHM7; IS A CHANGE FROM THE OLD BEHAVIOR. A ZERO TIMEOUT TIMES OUT IMMEDIATELY,:G8; RETURNING DATA THAT IS CURRENTLY IN THE TYPE-AHEAD BUFFER (IF ANY).Q9;.:40$:0; CLR R1 ;ASSUME ZERO-LENGTH TIMEOUT SPECIFIED< ASSUME TF.TMO,2006= TSTB R000�*~;}±|t÷tø tþfDATA ;IS USER REQUESTING A TIMEOUT ON THE READ?,> BPL 70$ ;IF PL, NO...SKIP TIMEOUT CHECKS8? MOVB I.PRM+6(R3),R1 ;GET USER SPECIFIED TIMEOUT VALUE$@ BNE 45$ ;IF NE, NOT ZERO TIMEOUTFA BIS #S5.ITI,U.TST5-U.TSTA(R5) ;INDICATE IMMEDIATE TIMEOUT IS NEEDED'B BR 70$ ;AND VALUE IS READY TO STASH.C45$:D .IF DF T$$EIOE=F BIT #S6.EIO,U.TST6-U.TSTA(R5) ;WAS/IS THIS AN EXTENDED IO?E,G BNE 70$ ;IF SO, INTERPRET VALUE DIRECTLYHI .ENDC ;T$$EIOJK;EAL; MULTIPLY THE SPECIFIED TIMEOUT VALUE BY TEN FOR NORMAL READS.EM;N4N CMPB R1,#<377/10.> ;EXCEED MAXIMUM TIMEOUT VALUE?O BLOS 50$ ;IF LOS, NOP6Q MOV #377,R1 ;SET MAXIMUM TIMEOUT LENGTH IN SECONDS"R BR 70$ ;USE THIS TIMEOUT VALUES50$:T .IF DF R$$EISU'V MUL #10.,R1 ;ADJUST TO UNITS OF TEN WX .IFF ;R$$EISYZ ASL R1 ;MULTIPLY BY TWOT$[ MOV R1,-(SP) ;SAVE PARTIAL RESULT\ ASL R1 ;MAKE IT X 4E] ASL R1 ;MAKE IT X 8A'^ ADD (SP)+,R1 ;(X 8) + (X 2) = (X 10)_` .ENDC ;R$$EISab70$:/c MOVB R1,U.TITI-U.TIP(R4) ;SAVE TIMEOUT VALUEPBd MOVB R1,I.PRM+6(R3) ;SAVE TIMEOUT VALUE IN I/O PACKET FOR LATERe;?f; TURN NECESSARY MODIFIERS INTO INPUT STATUS FLAGS IN U.TSTA. g;;h ASSUME TF.RST,S1.RSTi ASSUME S3.NEC,S1.RNEj ASSUME S3.RES,S1.RES k ASSUME TF.RNF,S1.RNF.l ASSUME TF.TNE,S1.TNERmFn BIC #^C,R06o ;CLEAR UNDESIRED STATUS BITS FROM READ MODIFIERS5p BIS R0,(R5) ;ESTABLISH NEW INPUT PROCESSING FLAGS*q BIC #S2.CTO,2(R5) ;READ CLEARS ^O STATE:r MOVB #TF.RLB,I.FCN+1(R3) ;REMEMBER THAT THIS WAS A READs;R:t; DETERMINE WHETHER OR NOT TO OUTPUT A LEADING LINEFEED.u;S0v BIT #S1.RNE,(R5)+ ;IS INPUT ECHOING REQUIRED?w BNE 80$ ;IF NE, NO...SKIP x ASSUME S3.FDX,2004y TSTB 2(R5) ;IS THE LINE SET TO FULL DUPLEX MODE?.z BMI 80$ ;IF MI, NO...SKIP LEADING LINEFEED.{ BIT #S2.FLF,(R5) ;NEED TO FORCE A LINEFEED?0| BEQ 80$ ;IF EQ, NO...DON'T OUTPUT ONE - SKIP?} MOV #PRLF,-(SP) ;OUTPUT LEADING LF WHEN WE EXIT THIS ROUTINER~80$:€ .IF DF T$$EIO�$‚ BIS #S1.IBY,-(R5) ;SET INPUT BUSYƒ ASSUME S6.RDI,100000E2„ TST U.TST6-U.TSTA(R5) ;DEFAULT INPUT SPECIFIED?:… BMI 90$ ;IF NE YES, BUFFER STATUS HAS ALREADY BEEN SET)† BIS #S1.IBF,@R5 ;ASSUME BUFFERED INPUTT‡ˆ .IFF ;T$$EIO ‰EŠ BIS #S1.IBY!S1.IBF,-(R5) ;SET INPUT BUSY AND ASSUME BUFFERED INPUT‹Œ .ENDC ;T$$EIO�Ž90$:D� MOVB U.TCHP-U.TSTA(R5),U.TIHP-2(R4) ;SAVE INITIAL CURSOR POSITION�‘ .IF DF T$$RPR’8“ TST (R3) ;HAVE WE JUST FINISHED OUTPUTTING A PROMPT? ” BEQ RDBCHK ;IF EQ, NO...SKIP/• CLR (R3) ;RESET THE COMPLETION STATUS FIELDT>– TST I.PRM+16(R3) ;DID THE PROMPT SUCCESSFULLY INITIALIZE..."— ; ...INTERMEDIATE BUFFERING?3˜ BEQ UNBI ;IF EQ, NO...GO AND DO UNBUFFERED READF?™ MOV U.TFIB-U.TIP(R4),R2 ;ELSE, GET THE FIRST INPUT BUFFER...S/š ; ...WHICH WAS ALLOCATED BEFORE PROMPTING› BR BUFRD ;DO BUFFERED READœ� .ENDC ;T$$RPRžŸ.PAGEO'  .SBTTL INPUT REQUEST BUFFER HANDLING(A¡ .SBTTL . RDBCHK - DETERMINE NEED FOR BUFFERED/UNBUFFERED INPUTF¢;NK£; RDBCHK - DETERMINE THE TYPE OF INPUT BUFFERING TO BE USED ON THIS READ.3¤;D ¥RDBCHK: ¦.§ CALL $TSTBF ;SHOULD WE DO A BUFFERED READ?.¨ BCS UNBI ;IF CS, NO...DO AN UNBUFFERED ONE©ª .IF DF T$$EIO«¬ ASSUME S6.RDI,100000 ­5® TST U.TST6-U.TSTA(R5) ;READING WITH DEFAULT INPUT?T0¯ BPL 10$ ;IF EQ NO, NEED TO ALLOCATE A BUFFERD° MOV U.TDIF-U.TIP(R4),R2 ;USE DEFAULT INPUT BUFFERS FOR INPUT DATA+± BNE 20$ ;IF NE HAVE A BUFFER WE CAN USEE.² BR UNBI ;ELSE NOT ENOUGH BUFFERS AVAILABLE³´ .ENDC ;T$$EIOµ¶10$:1· CALL ALTB ;GET A BUFFER FOR THE BUFFERED READ 5¸ BCS UNBI ;IF CS, FAILED...MUST DO UNBUFFERED READ¹20$:º(» MOV R2,-(SP) ;SAVE THE BUFFER ADDRESS2¼ CALL $INIBF ;INITIALIZE INTERMEDIATE BUFFERING,½ MOV (SP)+,R2 ;RETRIEVE THE BUFFER ADDRESS¾¿ .DSABL LSBÀ/Á .SBTTL . BUFRD - SET UP TO DO BUFFERED INPUTIÂ;,&Ã; BUFRD - SET UP FOR BUFFERED INPUT.Ä;00�2~‡|Ž{´cÚµcÛ¶c�·c›’ÅBUFRD:(Æ ADD #U.TTIC-U.TIP,R4 ;POINT TO U.TTICÇ MOV R4,R1 ;COPY POINTERS3È MOV I.PRM+4(R3),(R1)+ ;SET UP MAXIMUM BYTE COUNT É ASSUME U.TFIB,U.TTIC+2 Ê;R0Ë; BUFRD1 - LINK CURRENT BUFFER TO PREVIOUS ONEÌ;R ÍBUFRD1:,Î MOV R2,(R1) ;LINK FIRST BUFFER TO U.TFIBÏÐ)Ñ .SBTTL . NXTIB - GET NEXT INPUT BUFFEREÒ;Ó;+$Ô; **-NXTIB - GET NEXT INPUT BUFFERÕ;IÖ; *** NOTE *** THIS ROUTINE IS ALSO CALLED AT DEVICE PRIORITY FROM THE)×; INPUT DONE INTERRUPT SERVICE ROUTINE.Ø;U Ù; INPUTS:Ú; R2 => NEW INPUT BUFFER%Û; R4 => U.TTIC OF THE TERMINAL UCBXM(Ü; U.TTIC = TOTAL REMAINING BYTE COUNTÝ; Þ; OUTPUTS:F$ß; R4 => U.TIC OF THE TERMINAL UCBX#à; NEW BUFFER LINKED TO OLD BUFFER?á; SECOND WORD OF NEW BUFFER SET UP WITH LOGICAL BUFFER LENGTH1â; U.TIP, U.TIP+2, U.TIC, AND U.TTIC ARE UPDATED:ã; CC-Z = 0 IF THE INPUT BYTE COUNT IS NOT YET EXHAUSTEDä; = 1 OTHERWISEOå;E$æ; REGISTERS MODIFIED: R2, R3, R4ç;-è;T éNXTIB::I5ê TST (R2)+ ;POINT TO SECOND WORD OF THE NEW BUFFERU7ë MOV #T$$BFL-4,(R2) ;SET LOGICAL LENGTH OF THE BUFFER=-ì SUB (R2),(R4) ;ADJUST U.TTIC APPROPRIATELYS3í BPL 10$ ;IF PL, THERE IS MORE ROOM STILL...SKIPF=î ADD (R4),(R2) ;WENT BELOW ZERO - ADJUST LOG. BUFFER LENGTHWï CLR (R4) ;U.TTIC <-- 0ð ASSUME U.TIP,U.TTIC-6ñ10$:$ò CMP -(R4),-(R4) ;POINT TO U.TIP+2Có CMP -(R4),-(R2) ;POINT R4 TO U.TIP AND R2 TO START OF THE BUFFEREô.PAGEG.õ .SBTTL GENERAL INPUT/OUTPUT BUFFER HANDLING:ö .SBTTL . UPUB - UPDATE UCBX PARAMETERS FOR BUFFERED I/O÷;Mø;+Eù; **-UPUB - UPDATE PARAMETERS IN UCBX FOR BUFFERED INPUT OR OUTPUT.Tú;I/û; THIS ROUTINE IS CALLED IN THREE SITUATIONS:R#ü; 1. AT PRIORITY 0 TO START INPUT))ý; 2. AT DEVICE PRIORITY TO START OUTPUTTDþ; 3. AT DEVICE PRIORITY FROM THE OUTPUT OR INPUT INTERRUPT SERVICECÿ; ROUTINE TO SWITCH FROM THE CURRENT PARTIAL BUFFER TO THE NEXT.I; ; INPUTS:"; R2 => INPUT OR OUTPUT BUFFERB; R4 => U.TIP (INPUT) OR U.TOP (OUTPUT) OF THE TERMINAL'S UCBX!; 2(R2) = LOGICAL BUFFER LENGTH; ; OUTPUTS:A; R2 => SECOND WORD OF BUFFERD*; R4 => U.TIC/U.TOC OF THE TERMINAL UCBXI ; U.TIP, U.TIP+2, U.TIC (OR U.TOP, U.TOP+2, U.TOC) ARE UPDATED FOR NEXT. ; PARTIAL TRANSFER.) ; CC-Z = 0 IF THERE IS MORE WORK TO DOM ; = 1 OTHERWISER ;S ; REGISTERS MODIFIED: R2, R4;-;NUPUB::3 MOV R2,(R4)+ ;U.TIP+0/U.TOP+0 <-- BUFFER ADDRESS 3 CMP (R2)+,(R2)+ ;SKIP OVER LINK AND LENGTH WORDSU< MOV R2,(R4)+ ;U.TIP+2/U.TOP+2 <-- START OF DATA IN BUFFER6 MOV -(R2),(R4) ;U.TIC/U.TOC <-- BYTE COUNT FOR THIS" ;(POSSIBLY PARTIAL) TRANSFER  RETURNA/ .SBTTL . UNBI - ESTABLISH NON-BUFFERED INPUT ;)!; UNBI - DO NON-BUFFERED INPUT.L;SUNBI: & CLR I.PRM+16(R3) ;USE $IOFIN AT END* BIC #S1.IBF,(R5) ;SHOW UNBUFFERED INPUT  ASSUME U.TIP,!5" .SBTTL . UPUNB - UPDATE UCB FOR NON-BUFFERED INPUT #;S$;+1%; **-UPUNB - UPDATE UCB FOR NON-BUFFERED INPUT.&;V '; INPUTS:$(; R3 => CURRENT I/O REQUEST PACKET$); R4 => U.TIP OF THE TERMINAL UCBX*; +; OUTPUTS:%,; R4 => U.TTIC OF THE TERMINAL UCBXR@-; U.TIP, U.TIP+2, U.TIC, U.TTIC UPDATED FOR NON-BUFFERED INPUT.; /; REGISTERS MODIFIED: R3, R40;-1; 2UPUNB::P/3 ADD #I.PRM,R3 ;POINT TO PARAMETERS IN PACKET A4 MOV (R3)+,(R4)+ ;U.TIP+0 <-- BUFFER ADDRESS (ADRS DOUBLE WORD) @5 MOV (R3)+,(R4)+ ;U.TIP+2 <-- 2.ND HALF OF ADDRESS DOUBLE WORD6 ASSUME U.TIC,F(7 MOV (R3)+,(R4)+ ;U.TIC <-- BYTE COUNT8 ASSUME U.TTIC,9 CLR (R4) ;U.TTIC <-- 0: RETURN ;ALL DONEO;<=.PAGE="> .SBTTL INPUT REQUEST COMPLETION3? .SBTTL . FPIRD - INPUT REQUEST DONE FORK PROCESSD@;TA;+/B; **-FPIRD - INPUT REQUEST DONE FORK PROCESS.C;::D; THIS ROUTINE IS ENTERED FROM THE FORK DISPATCHER WHEN:<E; 1. AN END OF LINE WAS DETECTED (OR A HARD RECEIVE ERROR)%F; 2. AN INTERMEDIATE BUFFER IS FULLLBG; 3. THE USER TASK BUFFER IS FULL (NON-BUFFERED SOLICITED INPUT)H;;HI; 00�:~;}±|t÷tø tþfDATAAFTER INITIALIZING, THIS ROUTINE DISPATCHES TO PROCESS COMPLETION OF*J; EITHER SOLICITED OR UNSOLICITED INPUT.K;. L; INPUTS:M; R4 => UCBX OF THE TERMINAL$N; R5 => U.TSTA OF THE TERMINAL UCBO;TP; OUTPUTS: NONE.Q;T(R; REGISTERS MODIFIED: R0, R1, R2, R3S;-T;I UFPIRD::RV ASSUME U.TCI,0H+W MOV (R4)+,R3 ;GET CURRENT REQUEST PACKET(X ASSUME U.TIP,U.TCI+27Y MOV (R4)+,R1 ;GET CURRENT BUFFER (IF BUFFERED INPUT)AZ ASSUME U.TIC,U.TIP+4F[ TST (R4)+ ;POINT TO U.TIC\ ASSUME U.TTIC,U.TIC+26] ADD (R4)+,(R4) ;ADD U.TIC TO U.TTIC TO GET TOTAL..."^ ; ...REMAINING BYTES TO READ=_ BEQ IRQDON ;IF EQ, THE BUFFER IS FULL...COMPLETE THE READS/` TST (R3) ;HAS A COMPLETION STATUS BEEN SET?..a BNE IRQDON ;IF NE, YES...COMPLETE THE READb;-Mc; HERE WE ARE DOING BUFFERED INPUT AND THE CURRENT BUFFER IS FULL. WE WILLCNd; TRY TO ALLOCATE ANOTHER BUFFER AND CONTINUE THE READ. NOTE THAT THE INPUTKe; ISR HAS ALREADY CHECKED WHETHER THERE IS ANOTHER BUFFER ALLOCATED (THIS If; COULD BE THE CASE IF THE OPERATOR DID RUBOUT OR CTRL-U). IF THERE IS 9g; ANOTHER BUFFER ALLOCATED ALREADY, WE DON'T COME HERE.Bh; 'i CALL ALTB ;GET ANOTHER INPUT BUFFER ;j BCC BUFRD1 ;IF CC, LINK TO PREVIOUS BUFFER AND CONTINUEY(k MOV #IE.NOD,(R3) ;SET AN ERROR STATUSl ASSUME S1.USI,100000A-m TST (R5) ;ARE WE DOING UNSOLICITED INPUT?R n BPL IRQDON ;IF PL, NO...SKIPo;UAp; UNSOLICITED INPUT REQUIRES ANOTHER BUFFER, WHICH WE FAILED TOEEq; ALLOCATE. THE STATUS "IE.NOD" WILL FORCE A ^U TO FLUSH THE INPUT.Er;A*s JMP USIDON ;COMPLETE UNSOLICITED INPUTt;TIu; SOLICITED INPUT REQUIRES ANOTHER BUFFER, WHICH WE FAILED TO ALLOCATE.T:v; WE WILL RETURN PARTIAL INPUT WITH THE STATUS "IE.NOD".w;Uxy.PAGEI3z .SBTTL . IRQDON - AN INPUT REQUEST HAS COMPLETEDS{;1$|; IRQDON - INPUT REQUEST COMPLETED};S ~IRQDON:P€ .IF DF T$$ACD�#‚ MOV U.ACB-U.TSTA(R5),R2 ;GET ACBN-ƒ BEQ 30$ ;TERMINAL DOESN'T HAVE ONE - JUMPE0„ CLR U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING2… MOV (R3),A.IOS(R2) ;SET INPUT COMPLETION STATUS3† MOV #A.INPU,R0 ;SET INPUT COMPLETION ENTRY POINTR‡ CALL $SWACD ;CALL ACD ?ˆ MOV A.IOS(R2),(R3) ;SET POSSIBLY DIFFERENT INPUT STATUS CODET:‰ BIT #UA.TRA,U.AFLG-U.TSTA(R5) ;TRANSFER CHARACTERS NOW?Š BEQ 30$ ;IF EQ, NO...SKIP‹10$:#Œ MOV U.ACB-U.TSTA(R5),R0 ;GET ACBS/� ADD #A.SMAP,R0 ;POINT TO TRANSFER PARAMETERSA1Ž BIT #S1.IBF,(R5) ;ARE WE DOING BUFFERED INPUT?O� BEQ 20$ ;IF EQ, NO...SKIPU(� MOV R1,R2 ;COPY INPUT BUFFER ADDRESS3‘ CMP (R2)+,(R2)+ ;POINT PAST LINK AND COUNT WORDS(’ MOV R5,(R2)+ ;SAVE R5 IN INPUT BUFFER)“ MOV R3,(R2)+ ;ALSO SAVE PACKET ADDRESSV5” MOV (R0)+,(R2)+ ;SAVE ACD BUFFER APR BIAS (A.SMAP)D9• MOV (R0)+,(R2)+ ;SAVE ACD BUFFER DISPLACEMENT (A.SBUF)O0– MOV I.PRM+16(R3),(R2)+ ;SAVE TASK PCB ADDRESS8— MOV I.PRM(R3),(R2)+ ;SAVE TASK BUFFER APR BIAS OFFSET1˜ MOV (R0),(R2) ;SAVE ACD BUFFER LENGTH (A.SLEN) 4™ BR 30$ ;TRANSFER WILL OCCUR WHEN $FINBF CALLS USš20$:› MOV R4,-(SP) ;SAVE R41œ MOV (R0)+,R1 ;GET ACD BUFFER APR BIAS (A.SMAP)O5� MOV (R0)+,R2 ;GET ACD BUFFER DISPLACEMENT (A.SBUF),ž SUB #20000,R2 ;CONVERT TO AN APR5 ADDRESS/Ÿ MOV (R0),R0 ;GET ACD BUFFER LENGTH (A.SLEN)D4  MOV U.TIP-U.TTIC(R4),R3 ;GET TASK BUFFER APR BIAS>¡ MOV U.TIP+2-U.TTIC(R4),-(SP) ;SAVE TASK BUFFER DISPLACEMENT?¢ ADD R0,U.TIP+2-U.TTIC(R4) ;UPDATE DISPLACEMENT FOR NEXT TIMER-£ MOV (SP)+,R4 ;GET TASK BUFFER DISPLACEMENT 8¤ CALL $BLXIO ;TRANSFER FROM ACD BUFFER TO TASK BUFFER¥ MOV (SP)+,R4 ;RESTORE R40&¦ MOV U.TCI-U.TTIC(R4),R3 ;RESTORE R30§ CLR U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING6¨ MOV #A.CALL,R0 ;SET TRANSFER COMPLETION ENTRY POINT.© CALL $SWACD ;CALL ACD TO DEALLOCATE BUFFERBª BIT #UA.CAL,U.AFLG-U.TSTA(R5) ;ACD HAVE ANOTHER BUFFER TO COPY?'« BNE 10$ ;IF NE, YES...LOOP TO DO ITA=¬ BIS #UA.TRA,U.AFLG-U.TSTA(R5) ;SET FLAG FOR CHECKING LATERE­30$:®¯ .ENDC ;T$$ACD°,± CLRB U.TITI-U.TTIC(R4) ;CLEAR INPUT TIMER1² BIT #S1.IBF,(R5) ;ARE WE DOING BUFF00�B~‡|Ž{´cÚµcÛ¶c�·c›’ERED INPUT? <³ BEQ SOLIDN ;IF EQ, NO...MUST BE SOLICITED INPUT, SO SKIP2´ MOV (R1),R2 ;GET NEXT BUFFER (IF THERE IS ONE)0µ CALL DELTB ;DEALLOCATE ALL REMAINING BUFFERS)¶ CLR (R1) ;THIS IS NOW THE LAST BUFFER· ASSUME S1.USI,100000S-¸ TST (R5) ;ARE WE DOING UNSOLICITED INPUT?E/¹; BMI USIDON ;IF MI, YES...SKIP TO FINISH ITA3º BPL SOLIDN ;IF PL, NO...PROCESS SOLICITED INPUT0.» JMP USIDON ;IF MI, YES...SKIP TO FINISH IT¼.PAGEC/½ .SBTTL . SOLIDN - SOLICITED INPUT COMPLETIONN¾;F&¿; SOLIDN - SOLICITED INPUT COMPLETEDÀ;T Á; INPUTS:$Â; R3 => CURRENT I/O REQUEST PACKET%Ã; R4 => U.TTIC OF THE TERMINAL UCBXE$Ä; R5 => U.TSTA OF THE TERMINAL UCBÅ;C ÆSOLIDN:H(Ç CALL IRESEL ;RESET INPUT STATE FLAGS/È BIC #S1.IBY,(R5) ;INDICATE INPUT IS NOW IDLED>É BIC #S5.ITI,U.TST5-U.TSTA(R5) ;CLEAR IMMEDIATE TIMEOUT FLAG5Ê CLR U.TCI-U.TTIC(R4) ;CLEAR PACKET POINTER (U.TCI)P=Ë MOV U.TRTT-U.TTIC(R4),R2 ;GET THE TERMINATOR TABLE ADDRESS Ì BEQ 10$ ;IF EQ, NONE...SKIPO.Í CALL DETB ;DEALLOCATE THE TERMINATOR TABLE8Î CLR U.TRTT-U.TTIC(R4) ;CLEAR TERMINATOR TABLE ADDRESSÏ10$:ÐÑ .IF DF T$$RPRÒ3Ó MOV U.TFPB-U.TTIC(R4),R2 ;GET PROMPT BUFFER LISTÔ BEQ 20$ ;IF EQ, NONE...SKIPI-Õ CALL DELTB ;DEALLOCATE ALL PROMPT BUFFERS 'Ö CLR U.TFPB-U.TTIC(R4) ;CLEAR POINTER-×20$:ØÙ .ENDC ;T$$RPRÚ-Û MOV I.PRM+4(R3),R1 ;GET MAXIMUM BYTE COUNTO4Ü SUB (R4)+,R1 ;SUBTRACT REMAINING BYTES TO READ...'Ý ; ...YIELDING BYTES ACTUALLY READ 0Þ TST (R3) ;COMPLETION STATUS ALREADY PRESENT?4ß BNE 30$ ;IF NE, YES...SKIP TO COMPLETE THE INPUT/à INC (R3) ;BUFFER FULL - SET STATUS = IS.SUCáâ .IF DF T$$ESCã9ä BIT #S1.ESC,(R5) ;IN THE MIDDLE OF AN ESCAPE SEQUENCE?S,å BEQ 30$ ;IF EQ, NO...ALL IS OKAY SO SKIP@æ MOV #IE.PES&377,(R3) ;SET ERROR FOR "PARTIAL ESCAPE SEQUENCE"4ç BIC #S1.ESC,(R5) ;GET OUT OF ESCAPE SEQUENCE MODE5è CLRB U.TISV-U.TFIB(R4) ;CLEAR INPUT STATE VARIABLEOéê .ENDC ;T$$ESCëì30$:í .IF DF T$$EIOîï;3Bð; IF THIS WAS AN IO.EIO AND THERE ARE MORE CHARACTERS IN THE TAB:ñ; AND THE SYSTEM SUPPORTS ICS, REQUEST ICS NOTIFICATION.ò;==ó BIT #S6.EIO,U.TST6-U.TSTA(R5) ;WAS/IS THIS AN EXTENDED IO? ô BEQ 50$ ;IF NOT NO ICSõö .IF DF T$$ICS÷1ø MOV R3,-(SP) ;SAVE REGISTER DESTROYED BY GCTABTù5ú CALL GCTAB ;ANY CHARACTERS SITTING IN TYPE-AHEAD?Gû!ü MOV (SP)+,R3 ;RESTORE REGISTER ý BCS 40$ ;IF CS, NO - SKIPSþ/ÿ FRKBIT BIS,#FR.ICS ;REQUEST ICS NOTIFICATION. .ENDC ;T$$ICS?40$: BIC #S6.EIO!S6.RLU!S6.RDI,U.TST6-U.TSTA(R5);;CLEAR FLAGS50$: .ENDC ;T$$EIO9 BIT #S1.IBF,(R5) ;ARE WE DOING BUFFERED INPUT? ;**-1.  BEQ 70$ ;IF EQ, NO...SKIPE  ASSUME U.TFIB,U.TTIC+2 0  MOV (R4),R4 ;GET FIRST INPUT BUFFER (U.TFIB):  MOV R4,I.PRM+12(R3) ;STORE POINTER IN PACKET FOR $FINBF  .IF DF T$$SPL9 MOV KISAR6,I.PRM+14(R3) ;STORE MAPPING INFO FOR $FINBF$> SUB #200,I.PRM+14(R3) ;$FINBF EXPECTS MAPPING THROUGH APR 5 .IFF ;T$$SPLN9 MOV KISAR5,I.PRM+14(R3) ;STORE MAPPING INFO FOR $FINBFR .IFTF ;T$$SPL60$:= MOV (R4)+,R2 ;GET LINK TO NEXT BUFFER, POINT TO BYTE COUNT / MOV #T$$BFL,(R4) ;SET TOTAL LENGTH OF BUFFERM MOV R2,R4 ;GET NEXT BUFFER$ BNE 60$ ;IF NE, FOUND ONE...LOOP70$:8 BIT #TF.XOF,I.FCN(R3) ;SEND XOFF AT INPUT COMPLETION?  BEQ 80$ ;IF EQ, NO...SKIPR! ASSUME S3.FDX,200+" TSTB 4(R5) ;IS THIS A FULL DUPLEX LINE?4:# BMI 80$ ;IF MI, YES...TRANSMIT MAY BE BUSY SO SKIP XOF$ MOV R3,-(SP) ;SAVE R3*% MOV #ASXOFF,R3 ;POINT TO XOFF CHARACTER&' .IFT ;T$$SPL(.) MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX*+ .IFF ;T$$SPL ,$- MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX./ .ENDC ;T$$SPL061 CALL ECHRL ;"ECHO" XOFF WITH INTERRUPTS LOCKED OUT2 MOV (SP)+,R3 ;RESTORE R3)380$:45 .IF DF T$$ACD6#7 MOV U.ACB-U.TSTA(R5),R2 ;GET ACBS48 BEQ 90$ ;IF EQ, TERMINAL DOESN'T HAVE ONE...SKIP59 BIT #UA.TRA,U.AFLG-U.TSTA(R5) ;DOING TRANSFER NOW?S: BEQ 90$ ;IF EQ, NO...SKIPV3;00�J~;}±|t÷tø tþfDATA MOV A.IOS+2(R2),R1 ;GET TRANSFER LENGTH FROM ACB+< BIT #S1.IBF,(R5) ;DOING A BUFFERED READ?V= BEQ 90$ ;IF EQ, NO...SKIP.B> INC I.PRM+12(R3) ;SET BUFFER ADDRESS ODD FOR NON-STD $FINBF USE?90$:@A .ENDC ;T$$ACDB2C CALLR DONE ;COMPLETE THE CURRENT INPUT REQUESTDE .PSECT MAP5FGH.PAGE$*I .SBTTL . NXTOB - GET NEXT OUTPUT BUFFERJK;QL;+&M; **-NXTOB - GET NEXT OUTPUT BUFFER.N;BKO; *** NOTE *** THIS ROUTINE IS CALLED AT DEVICE PRIORITY FROM THE OUTPUTSP; INTERRUPT SERVICE ROUTINETQ;. R; INPUTS:&S; R4 => U.TOP+2 OF THE TERMINAL UCBX$T; R5 => U.TSTA OF THE TERMINAL UCBU;. V; OUTPUTS:1-W; IF THERE IS ANOTHER OUTPUT BUFFER LINKED:F X; CC-Z = 0$Y; R4 => U.TOC OF THE TERMINAL UCBX1Z; U.TOP, U.TOP+2, U.TOC UPDATED FOR NEXT BUFFERC[;5\; IF NOTHING MORE TO OUTPUT: ]; CC-Z = 1$^; R4 => U.TOP OF THE TERMINAL UCBX_;T `; REGISTERS MODIFIED: R2, R4a;-b;O cNXTOB::Sde .IF DF T$$ACDf5g BIT #S2.OBF,2(R5) ;;;ARE WE DOING BUFFERED OUTPUT?T/h BEQ 10$ ;;;IF EQ, NO...RETURN WITH CC-Z = 1Eij .ENDC ;T$$ACDk6l MOV -(R4),R2 ;;;GET START OF CURRENT BUFFER (U.TOP);m BEQ 10$ ;;;IF EQ, THIS WAS AN ECHO...EXIT WITH CC-Z = 14+n MOV (R2),R2 ;;;GET START OF NEXT BUFFERT1o BEQ 10$ ;;;IF EQ, NONE...RETURN WITH CC-Z = 1N:p MOVB OPTIMR,U.TOTI-U.TOP(R4) ;;;SET UP THE OUTPUT TIMER%q JMP UPUB ;;;GO AND UPDATE THE UCBDr10$:#s RETURN ;;;RETURN WITH CC-Z = 1tu4v .SBTTL . USIDON - UNSOLICITED INPUT HAS COMPLETEDw;U)x; USIDON - UNSOLICITED INPUT COMPLETED.Iy;-Gz; THIS ROUTINE WILL ALLOCATE A CLI COMMAND BUFFER IN THE SYSTEM POOL. J{; THE INPUT BUFFERS ARE THEN COPIED INTO THE CLI BUFFER AND IT IS QUEUEDI|; TO THE CLI TASK. IF CONTINUATION LINES ARE TO FOLLOW (LAST CHARACTER.6}; OF THIS BUFFER IS A HYPHEN), SIMULATE A CONTRTL-C.~;T ; INPUTS:(€; SECOND WORD OF FIRST RECEIVE BUFFER:�; <0 - ERRORR‚; 0 - BUFFER FULLƒ; IS.SUC - SUCCESS.„; IS.TMO - TIME-OUT…; >IS.TMO - CTRL-U COMPLETED†;D ‡USIDON:C7ˆ MOV #M$$CRB-4+1,-(SP) ;GET MAX LENGTH OF CLI COMMANDA‰ ;PLUS 1 FOR TERMINATOR2Š SUB (R4)+,(SP) ;GET NUMBER OF BYTES READ PLUS 1‹ CMP (R3),#IS.TMO ;TIME-OUT?Œ BEQ 50$ ;Y - JUMPS"� CMPB (R3)+,#IS.SUC ;TEST STATUSŽ BLO 50$ ;BUFFER FULL - JUMP � BLT 40$ ;ERROR - JUMPT$� BGT 30$ ;CTRL-U COMPLETED - JUMP‘ ;ELSE SUCCESS!,’ TST $MCRPT ;IS MCR DISPATCHER INSTALLED?-“ BEQ 50$ ;IF NOT THEN ECHO ^U TO TELL USER ”• .IF DF T$$SPC–C— BIC #UM.KIL,U.MUP-U.TSTA(R5) ;RESET CLI CONTINUATION LINE STATUSA˜™ .ENDC ;T$$SPCš› .IF DF T$$SERœ=� MOV #CC.TTD,-(SP) ;ASSUME NEED TO SET CC.TTD IN CLI PACKET:ž TSTB U.TFPB-U.TFIB(R4) ;HERE BECAUSE USER TYPED CTRL-C?Ÿ BEQ 10$ ;N - JUMPT=  BIT #UM.CMD,U.MUP-U.TSTA(R5) ;COMMAND ALREADY IN PROGRESS?M%¡ BEQ 10$ ;N - NOTHING UNUSUAL THENP8¢ CLR (SP) ;DON'T SET CC.TTD SO THAT COMPLETION OF THE0£ ;COMMAND WE ARE ABOUT TO SEND WON'T AFFECT+¤ ;THE SERIAL PROCESSING ALREADY IN USEM¥10$:6¦ MOV (SP)+,U.TFPB-U.TFIB(R4) ;GET ZERO OR CC.TTD BIT>§ BIC #UM.CMD,U.MUP-U.TSTA(R5) ;RESET COMMAND IN PROGRESS BIT7¨ BIT #UM.SER,U.MUP-U.TSTA(R5) ;CLI TYPEAHEAD ENABLED?B© BEQ 20$ ;N - JUMPS?ª BIS #UM.CMD,U.MUP-U.TSTA(R5) ;Y - SHOW A COMMAND IS UNDERWAYP«20$:¬­ .ENDC ;T$$SER®2¯ CMP (SP),#1 ;ONE BYTE READ? (MUST BE A RETURN)° BNE 100$ ;N - JUMP±² .IF DF T$$SPC³0´ MOV #CC.PRM,R1 ;SET PROMPT REQUEST STATUS BIT6µ BIS U.TFPB-U.TFIB(R4),R1 ;OR IN POSSIBLE CC.TTD BIT¶ MOV R5,R2 ;GET UCB ADDRESS· SUB #U.TSTA,R2 ;D0¸ CALL $QCNTP ;QUEUE PROMPT REQUEST TO THE CLI¹º .IFF ;T$$SPC»5¼ MOV #4,R1 ;Y - ONLY ALLOCATE 4 BYTES FROM THE DSRB½ CALL $ALOCB ;¾ BCS 50$ ;FAILED - JUMP¿ MOV R0,R1 ;SAVE ADDRESSD"À TST (R0)+ ;SKIP PAST LINK WORD#Á MOV R5,(R0) ;INSERT UCB ADDRESS : SUB #U.TSTA-1,(R0) ;+1 TO INDICATE A SPECIAL MCR PACKET/à BR 140$ ;QUEUE THIS SHORT PACKET TO THE CLITÄÅ .IFTF ;T$$SPCÆÇ30$: BR 200$ ;B00�R~‡|Ž{´cÚµcÛ¶c�·c›’RANCH AIDSÈ40$: BR 210$ ;,È50$: JMP 220$ ;SA454.Ë100$: ;**-2Ì .IFT ;T$$SPC Í$Î MOV (SP),R1 ;GET CHARACTER COUNT7Ï ADD #C.CTXT+77,R1 ;ROUND UP TO NEXT 32 WORD BOUNDARYB>Ð ASH #-6,R1 ;COMPUTE NUMBER OF SECONDARY POOL BLOCKS NEEDED$Ñ CALL $ALSEC ;ALLOCATE CLI BUFFERÒ BCS 220$ ;FAILURE - JUMP#Ó MOVB (R3),-(SP) ;SAVE TERMINATOR1ÔÕ .IF NDF T$$SPL Ö4× MOV U.TFPB-U.TFIB(R4),-(SP) ;SAVE CLI STATUS WORDØÙ .IFTF ;NDF T$$SPLÚ Û MOV R0,KISAR6 ;MAP CLI BUFFERÜ MOV #140002,R2 ;POINT TO IT3Ý MOV $MCRPT,(R2)+ ;SET CLI DISPATCHER TCB ADDRESSF Þ MOV R5,(R2) ;SET UCB ADDRESSß SUB #U.TSTA,(R2)+ ;àá .IFT ;NDF T$$SPLPâ&ã MOV 4(SP),(R2) ;SET CHARACTER COUNTäå .IFF ;NDF T$$SPLRæ&ç MOV 2(SP),(R2) ;SET CHARACTER COUNTèé .IFTF ;NDF T$$SPLêë DEC (R2)+ ;LESS TERMINATORìí .IFT ;NDF T$$SPLî"ï MOV (SP)+,(R2)+ ;SET STATUS BITðñ .IFF ;NDF T$$SPLSò.ó MOV U.TFPB-U.TFIB(R4),(R2)+ ;SET STATUS BITôõ .ENDC ;NDF T$$SPLö)÷ CLR (R2)+ ;CLEAR TEXT STARTING OFFSET)&ø MOVB (SP)+,(R2)+ ;INSERT TERMINATOR:ù MOVB R1,(R2)+ ;SET NUMBER OF SECONDARY POOL BLOCKS USED"ú MOV $DALED,KISAR6 ;REMAP DRIVER*û MOV (R4),R1 ;GET FIRST BUFFER (U.TFIB)"ü MOV R4,-(SP) ;SAVE UCBX POINTERý MOV R2,R4 ;CHANGE HANDSF$þ MOV 2(SP),R2 ;GET CHARACTER COUNT!ÿ MOV R5,-(SP) ;SAVE UCB POINTER .IFF ;T$$SPC2) MOV #M$$CRB,R1 ;GET SIZE OF CLI BUFFER$ CALL $ALOCB ;ALLOCATE CLI BUFFER BCS 220$ ;FAILURE - JUMP< MOVB (R3),@U.TIP+2-U.TFIB(R4) ;STORE TERMINATOR IN BUFFER4 MOV (SP),R2 ;GET TOTAL NUMBER OF CHARACTERS READ ;PLUS TERMINATOR0  MOV R0,-(SP) ;SAVE CLI COMMAND BUFFER ADDRESS  TST (R0)+ ;SKIP LINK WORDF#  MOV R5,(R0) ;INSERT UCB ADDRESSC  SUB #U.TSTA,(R0)+ ;*  MOV (R4),R1 ;GET FIRST BUFFER (U.TFIB) .IFTF ;T$$SPC110$:C, MOV (R1)+,-(SP) ;SAVE LINK TO NEXT BUFFER TST (R1)+ ;SKIP SECOND WORD6 MOV #T$$BFL-4,R3 ;GET MAX NUMBER OF BYTES IN BUFFER CMP R3,R2 ;TOO MANY? BLE 120$ ;N - JUMP MOV R2,R3 ;Y - ADJUST120$:,. SUB R3,R2 ;GET NUMBER OF BYTES STILL TO GO130$:M .IFT ;T$$SPCP7 MOVB (R1)+,R5 ;GET NEXT CHARACTER FROM DRIVER BUFFERW  MOV R0,KISAR6 ;MAP CLI BUFFER-  MOVB R5,(R4)+ ;PUT CHARACTER IN CLI BUFFER1)! MOV $DALED,KISAR6 ;REMAP DRIVER BUFFER;"# .IFF ;T$$SPC$)% MOVB (R1)+,(R0)+ ;COPY INTO CLI BUFFER&' .IFTF ;T$$SPC( ) DEC R3 ;DECREMENT BYTE COUNT** BGT 130$ ;IF GT, LOOP FOR MORE TO COPY + MOV (SP)+,R1 ;GET NEXT BUFFER!, BNE 110$ ;THERE IS ONE - LOOP,-. .IFT ;T$$SPCN/ 0 MOV R0,KISAR6 ;MAP CLI BUFFER;1 MOVB #CH.CR,-(R4) ;DELIMIT BUFFER WITH A CARRIAGE RETURNR.2 MOVB -(R4),4(SP) ;SAVE LAST INPUT CHARACTER%3 MOV $DALED,KISAR6 ;REMAP DATASPACE $4 MOV (SP)+,R5 ;RESTORE UCB POINTER%5 MOV (SP)+,R4 ;RESTORE UCBX POINTERP86 MOV R0,R1 ;GET SECONDARY POOL COMMAND BUFFER ADDRESS)7 CALL $QCPKT ;QUEUE CLI COMMAND BUFFERY89 .IFF ;T$$SPC :'; MOV (SP)+,R1 ;GET CLI COMMAND BUFFERR2< MOVB -2(R0),(SP) ;N - SAVE LAST INPUT CHARACTER=140$:)> CALL $QMCRL ;QUEUE CLI COMMAND BUFFERL?@ .ENDC ;T$$SPCAB .IF DF R$$MPLC.D CMPB (SP),#'- ;WAS LAST CHARACTER A HYPHEN?EF .IF DF A$$CLIG!G BNE 205$ ;N - JUMP ;SA454 3I MOV U.MUP-U.TSTA(R5),R2 ;GET CLI OFFSET ;**-1R-J BIC #^C,R2 ;SEPARATE OUT CLI INDEXC/K MOV $CPTBL(R2),R2 ;POINT TO CLI PARSER BLOCKT7L BIT #CP.SGL,C.PSTS(R2) ;CONTINUATION LINES ACCEPTED?MN .ENDC ;A$$CLIO4P BEQ 300$ ;Y - CONTINUATION LINES TO FOLLOW, JUMPP BR 205$ ;SA454P ;SA454P .IFTF ;R$$MPL ;SA454P ;SA454P200$: ;SA454SP .IFT ;R$$MPL ;SA454PP ;SA454CP TST U.TFPB-U.TFIB(R4) ;ARE WE DOING A CONTINUATION LINE? ;SA4545'P BPL 205$ ;PL - NO -BRANCH ;SA454CIP FRKBIT BIS,#FR.KIL ;AN ERROR OCCURED, SO KILL THE CONTIN. LINE. ;SA454RP205$: ;SA454LQR .ENDC ;R$$MPLS$U TST (SP)+ ;CLEAN STA00�Z~;}±|t÷tø tþfDATACK ;**-1(V CALL IRESEL ;RESET INPUT STATE FLAGS>W BIC #S1.USI!S1.IBY,(R5) ;CLEAR ADDITIONAL INPUT STATE FLAGS=X CLR U.TFPB-U.TFIB(R4) ;CLEAN UP TEMPORARY VARIABLE WE USED Y8Z FRKBIT BIS,#FR.GRQ ;TRY TO GET ANOTHER REQUEST PACKET[5\ CLR U.TCI-U.TFIB(R4) ;CLEAR PACKET POINTER (U.TCI)I'] MOV (R4),R2 ;GET FIRST INPUT BUFFERC8^ CALLR DELTB ;DEALLOCATE ALL INPUT BUFFERS AND RETURN_;T5`; ERROR DURING UNSOLICITED INPUT. THESE ERRORS ARE:-a; 1. FAILURE TO ALLOCATE CLI COMMAND BUFFERKb; 2. TIME-OUTL%c; 3. BUFFER FULL WITH NO TERMINATORB&d; IN EITHER CASE, SIMULATE A CTRL-U.e;Tf210$:A2g CMPB -(R3),#IE.EOF ;END-OF-FILE (CTRL-Z TYPED)?3h BEQ 200$ ;Y - DON'T ECHO ^U (^Z ALREADY ECHOED) i220$:E!j BIT #S1.OBY,(R5) ;OUTPUT BUSY?I8k BNE 200$ ;Y - WE CANNOT BEGIN OUTPUT OF A ^U BECAUSE+l ;OUTPUT IS ALREADY BUSY. WE CAN'T DOCm ;ANYTHING BUT GIVE UPUn230$:*o MOVB #CH.CTU,(SP) ;GET CTRL-U CHARACTER$p ;(OVERWRITE OLD WORD ON STACK)3q BR 310$ ;REQUEST POST-FORK PROCESSING OF CTRL-U r;Ws; CLI CONTINUATION EXPECTEDEt;Eu300$:ECv MOVB #CH.CTC,(SP) ;GET CTRL-C CHARACTER (OVER OLD WORD ON STACK)Zwx .IF DF T$$SPCy=z MOV #100000,U.TFPB-U.TFIB(R4) ;SET CLI CONTINUATION PROMPT({| .ENDC ;T$$SPC}~310$: ;REFERENCE LABELU€ .IF DF T$$SER�A‚ BIC #UM.CMD,U.MUP-U.TSTA(R5) ;SHOW NO CLI COMMANDS IN PROGRESSUƒ„ .ENDC ;T$$SER…† .IF DF T$$MOD‡'ˆ BITB #US.DSB!US.CRW,U.STS-U.TSTA(R5)T,‰ ;LINE DISABLED OR WAITING FOR CARRIER?Š BNE 200$ ;Y - JUMP‹Œ .ENDC ;T$$MOD�Ž� .IF DF T$$SPL�=‘ MOVB (SP)+,U.TECO-U.TSTA(R5) ;LOAD CHARACTER FOR POST-FORK’“ .IFF ;T$$SPL”=• MOVB (SP)+,U.TECB-U.TFIB(R4) ;LOAD CHARACTER FOR POST-FORK–— .ENDC ;T$$SPL˜ ™ ;PROCESSING IN ECHO BUFFERšB› FRKBIT BIS,# ;TRY TO GET ANOTHER PACKET (FR.GRQ)(œ ;REQUEST POST-FORK PROCESSING�)ž ;TRY TO GET ANOTHER PACKET (FR.GRQ)S,Ÿ ;REQUEST POST-FORK PROCESSING (FR.PFP)  RETURN ;RETURNE¡.PAGE '¢ .SBTTL OUTPUT REQUEST PRE-PROCESSING..£ .SBTTL . PPWLB - WRITE-SPECIAL-DATA REQUEST¤;A¥;+!¦; **-PPWSD - WRITE SPECIAL DATAT6§; **-PPRPR - WRITE THE PROMPT OF A READ-AFTER-PROMPT"¨; **-PPWLB - WRITE-LOGICAL-BLOCK©; ª; INPUTS:«; R3 I/O PACKET ADDRESS¬; I.LNK = 0­; R4 UCBX ADDRESSO®; R5 POINTER TO U.TSTA¯;°; ± .ENABL LSBT² .IF DF B$$MAP ³PPWSD::T7´ BIC #TF.RCU!TF.WBT,I.FCN(R3) ;CLEAR DISALLOWED BITSO@µ MOVB I.PRM+10(R3),U.TDYP(R4) ;STORE THE DATA TYPE (4TH PARM)C¶ CLR I.PRM+10(R3) ;NO VFC OR CURSOR POSITIONING ALLOWED (FOR CUP)A8· CLR I.PRM+6(R3) ;NO VFC OR CURSOR POSITIONING ALLOWED¸ BR WLB1 ;DO THE OUTPUT¹º .ENDC ;B$$MAP»7¼ .SBTTL . PPRPR - WRITE PROMPT OF A READ-AFTER-PROMPT½¾ .IF DF T$$RPR¿ ÀPPRPR::KAÁ CLRB I.FCN+1(R3) ;WIPE OUT HIGH BYTE FOR LATER CHECKS IN PPRLB" MOV R3,R2 ;COPY PACKET POINTER&à ADD #I.PRM+16,R2 ;POINT TO I.PRM+168Ä MOV (R2),-(SP) ;SAVE 2.ND WORD OF ADDRESS DOUBLE WORD7Å MOV -(R2),2(R2) ;MOVE VFC/CURSOR-CONTROL TO I.PRM+16 /Æ MOV -(R2),2(R2) ;MOVE BYTE COUNT TO I.PRM+14C4Ç MOV (SP)+,(R2) ;MOVE 2.ND WORD OF ADW TO I.PRM+12 ÈPPRPR1: 4É INC (R3) ;SET STATUS NON-ZERO TO INDICATE IO.RPRÊ ;(FOR EASIER CHECKING)7Ë CLR U.TFOB(R4) ;CLEAR POINTER TO FIRST OUTPUT BUFFERCÌÍ .IF DF B$$MAPÎ.Ï CLRB U.TDYP(R4) ;INDICATE DATA TYPE 0, TEXTÐÑ .ENDC ;B$$MAPÒ Ó BR WLB2 ;BYPASS TF.CCO CHECKÔÕ .ENDC ;T$$RPRÖ/× .SBTTL . PPWLB - WRITE-LOGICAL-BLOCK REQUEST)Ø;)Ù; PPWLB - WRITE LOGICAL BLOCKMÚ; ÛPPWLB::)ÜÝ .IF DF T$$CUPÞ8ß MOV I.PRM+10(R3),I.PRM+6(R3) ;MOVE VFC TO RIGHT PLACEàá .ENDC ;T$$CUPâãä .IF DF B$$MAPå.æ CLRB U.TDYP(R4) ;INDICATE DATA TYPE 0, TEXTçèWLB1:Téê .ENDC ;B$$MAPë(ì BIT #TF.CCO,I.FCN(R3) ;CANCEL CTRL-O?í BEQ WLB3 ;N - JUMPîïWLB2:Tð BIC #S2.CTO,2(R5) ;Y - DO ITMñòWLB3: /ó BIT #S2.CTO,2(R5) ;OUTPUT STOPPED BY CTRL-O?-ô ;(CAN ON00�b~‡|Ž{´cÚµcÛ¶c�·c›’LY HAPPEN IF TERM. IS ATTACHED)U õ BNE 10$ ;Y - FINISH DIRECTLY.ö CALL ALTB ;ALLOCATE AN INTERMEDIATE BUFFER"÷ BCC 30$ ;IF CC, GOT ONE...SKIPøù .IF DF T$$EIOú<û MOV U.TDIF(R4),R2 ;GET FIRST DEFAULT INPUT BUFFER, IF ANY0ü CALL DELTB ;DEALLOCATE DEFAULT INPUT BUFFERS ý CLR U.TDIF(R4) ;CLEAR POINTERþÿ .ENDC ;T$$EIO2 MOV #IE.NOD&377,R0 ;ERROR - NO BUFFER AVAILABLE BR 20$ ;SKIP10$: MOV #IS.SUC,R0 ;SUCCESS20$:( JMP IOFIN ;FINISH THE OUTPUT REQUEST30$:- MOV R3,U.TCO(R4) ;U.TCO <-- PACKET ADDRESSY-  MOVB I.FCN(R3),R0 ;GET IO SUBFUNCTION CODEI   .IF DF T$$RPR   TST (R3) ;PROMPT FOR IO.RPR? BEQ 40$ ;N - JUMP ASSUME TF.WAL,TF.BIN*4S( ASL R0 ;SHIFT SUBF. CODE LEFT 2 BITS  ASL R0O .IF DF T$$CUP ASSUME TF.RCU,S2.RCUR6 BIC #TF.RCU,R0 ;CAN'T DO CURSOR RESTORE WITH IO.RPR .ENDC ;T$$CUP# BIS #S1.IBY,(R5) ;SET INPUT BUSYS6 ADD #10,R3 ;ADVANCE PACKET POINTER SO OFFSET I.PRM* ;FROM R3 POINTS AT PROMPT PARAMETERS9 MOV R2,U.TFPB(R4) ;SAVE POINTER TO FIRST PROMPT BUFFERC  .ENDC ;T$$RPR!"40$:# ASSUME S2.WAL,TF.WALF$ ASSUME S2.RCU,TF.RCUN% BIC #^C,R0-& ;CLEAR ALL BUT WAL AND RCU SUBFUNCTIONSS%' TST (R5)+ ;POINT TO STATUS WORD 22( BIC #S2.WAL!S2.PCU!S2.RCU,(R5) ;CLEAR OLD FLAGS&) BIS R0,(R5) ;OR INTO STATUS WORD 2 * MOV R4,R1 + ADD #U.TOC,R1 ;POINT TO U.TOC, CLR (R1)+ ;CLEAR U.TOC- ASSUME U.TTOC,U.TOC+25. MOV I.PRM+4(R3),(R1)+ ;U.TTOC <-- TOTAL BYTE COUNT/ ASSUME U.TFOB,U.TTOC+2P(0 MOV R2,(R1) ;LINK BUFFER TO LISTHEAD1;$.2; INTERPRET AND SAVE VERTICAL FORMAT CONTROL3; )4 BIC #S2.CR,(R5) ;ASSUME NO TRAILING CR056 .IF DF T$$CUP7/8 TSTB I.PRM+7(R3) ;CURSOR POSITION SPECIFIED?T9 BEQ 50$ ;N - JUMP2;: MOV I.PRM+6(R3),U.TOC(R4) ;Y - SAVE CURSOR POS. IN U.TOC ; BIS #S2.PCU,(R5) ;SET FLAG1 < BR 80$ ;=50$:>? .ENDC ;T$$CUP@4A MOV #VFCRT,R0 ;POINT TO RECOGNITION TABLE FOR VFCB60$:C TSTB (R0)+ ;END OF TABLE?ND BMI 70$ ;Y - JUMPT"E CMPB -1(R0),I.PRM+6(R3) ;MATCH?F BNE 60$ ;N - LOOP G70$:*H SUB #CHRT+1,R0 ;GET INDEX IN CHRD TABLEI ASL R0 ;MAKE WORD INDEXR5J MOVB CHRD(R0),U.TVFC(R4) ;STORE ENCODED VFC IN UCB3&K ;(SEE MODULE "TTDAT" FOR CODING)L ASSUME ,0P2M BISB CHRD+1(R0),1(R5) ;SAVE CR FLAG IN U.TSTA+2N80$:%O TST -(R5) ;POINT TO STATUS WORD 1PQ .IF DF T$$RPRR,S MOV U.TCO(R4),R0 ;GET REAL PACKET POINTER:T MOV SP,I.PRM+16(R0) ;ASSUME WE CAN BUFFER ALL OUTPUT IN(U ;ONE LIST - MAKE I.PRM+16 NON-ZEROVW .IFF ;T$$RPR$X:Y MOV SP,I.PRM+16(R3) ;ASSUME WE CAN BUFFER ALL OUTPUT IN(Z ;ONE LIST - MAKE I.PRM+16 NON-ZERO[\ .ENDC ;T$$RPR] ^ .DSABL LSBC_.PAGE (` .SBTTL OUTPUT REQUEST BUFFER HANDLING(a .SBTTL . WRITE1 - FILL OUTPUT BUFFERSb;Ec;+5d; **-WRITE1 - FILL OUTPUT BUFFERS WITH OUTPUT DATA.We; f; INPUTS:)g; U.TFOB POINTER TO FIRST OUTPUT BUFFER h; R3 POINTER TO PACKET!i; (ADVANCED 4 WORDS IF IO.RPR)Aj; R4 POINTER TO UCBXk; R5 POINTER TO U.TSTA&l; U.TCHP CURRENT HORIZONTAL POSITION$m; U.TCVP CURRENT VERTICAL POSITION*n; U.TVFC ENCODED VERTICAL FORMAT CONTROLo;-p; qWRITE1:Crs .IF DF T$$RPRtu ASSUME U.TCHP&1,0v ASSUME U.TCVP,U.TCHP+1D@w MOV U.TCHP-U.TSTA(R5),-(SP) ;SAVE CURRENT HOR. AND VERT. POS.xy .ENDCz{| .IF DF T$$CUP}9~; SAVE CURRENT HORIZONTAL AND VERTICAL POSITION IN CASET ; CURSOR RESTORE IS REQUESTED.€; � ASSUME U.TSHP&1,0‚ ASSUME U.TSVP,U.TSHP+1 ƒ„ .IF DF T$$RPR…† MOV (SP),U.TSHP(R4)‡ˆ .IFF ;T$$RPR‰#Š MOV U.TCHP-U.TSTA(R5),U.TSHP(R4) ‹Œ .ENDC ;T$$RPR�)Ž MOV #EXPC3,EXPCP ;SET POINTER TO EXPC3�� .IFTF ;T$$CUP‘‘ ; LK720S‘; ; LK720X‘; CHECK IF 'PURE' IO.WAL. IF IT IS 'PURE', MEANING NO VFC, CURSOR POSITIONING, ; LK720U‘; ETC. TRANSFER IS DONE DIRECTLY FROM A TASK BUFFER, OTHERWISE TRANSFER IS ; LK720S7‘; DONE THROUGH INTERMEDIATE TTDRV 00�j~;}±|t÷tø tþfDATABUFFERS ; LK720A‘; ; LK720‘ ; LK720R‘ .IF DF T$$DMA ; LK720‘ ; LK720‘ ; LK720R/‘ BIT #S2.WAL,2(R5) ;DOING IO.WAL? ; LK720#‘ BEQ 5$ ;NO ; LK720X@‘ BIT #S5.DMA,U.TST5-U.TSTA(R5) ;CHECK FOR DMA DEVICE ; LK7200‘ BEQ 5$ ;NO. SETUP INTERNAL BUFFERS ; LK720@‘ BIT #S1.IBY,(R5) ;CHECK IF IO.RPR!TF.BIN IN PROGERSS ; LK724/‘ BNE 5$ ;YES. SETUP REGULAR OUTPUT ; LK724 ‘ ; LK720‘ .IF DF T$$CUP ; LK720R‘ ; LK720AB‘ BIT #S2.PCU!S2.RCU!S2.CR,2(R5) ;CURSOR POS. REQUESTED? ; LK720‘ ; LK720 ‘ .IFF ;DF T$$CUP ; LK720‘ ; LK720;:‘ BIT #S2.CR,2(R5) ;CARRIAGE RETURN AT THE END? ; LK720‘ ; LK720.!‘ .IFTF ;DF T$$CUP ; LK720L‘ ; LK720 1‘ BNE 5$ ;YES. SETUP INTERNAL BUFFERS ; LK7205‘ ; LK720.!‘ .ENDC ;DF T$$CUP ; LK720 ‘ ; LK720O-‘ TSTB U.TVFC(R4) ;CHECK FOR VFC ; LK720D1‘ BNE 5$ ;YES. SETUP INTERNAL BUFFERS ; LK720B‘ ; LK720C"‘ MOV U.TCO(R4),R3 ; ; LK7207‘ MOV R1,-(SP) ;SAVE R1. $TSTBF WILL KILL IT ; LK72072‘ CALL $TSTBF ;CHECK IF TASK IS FIXED ; LK7207‘ BCC 3$ ;NOT FIXED - USE INTERMEDIATE BUFFER ;SA469‘ ; LK720 >‘ .IF LT T$$BFL-12 ;CHECK IF BUFFER HAS ENOUGH SPACE ; LK720‘ .ERROR ; LK720 ‘ .ENDC ; LK720‘; ; LK7201‘;SETUP TRANSFER FROM A TASK BUFFER ; LK720 ‘; ; LK720‘ ; LK720P0‘ MOV U.TFOB(R4),R2 ;GET BUFFER ADDR ; LK720/‘ MOV I.PRM(R3),R1 ;GET TASK BUFFER ; LK720(‘ CLR R0 ; ; LK720I*‘ ASHC #6,R0 ;GET PHYS. ADDR ; LK7200‘ CLR (R2)+ ;CLEAR LINK WORD FOR WAL ; LK728-‘ TST (R2)+ ;STEP TO NEXT OFFSET ; LK720 2‘ MOV U.TTOC(R4),(R2)+ ;SETUP COUNTER ; LK720+‘ MOV R0,(R2)+ ;GET HIGH 6 BITS ; LK720 7‘ MOV I.PRM+2(R3),(R2) ;GET VIRTUAL ADDRESS ; LK720P1‘ BIC #160000,(R2) ;CONVERT TO OFFSET ; LK720 )‘ ADD R1,(R2) ;GET LOW ADDR ; LK720U*‘ ADC -(R2) ;ADJUST HIGH BITS ; LK720<‘ CLR U.TTOC(R4) ;CLEAR TOTAL BYTE COUNTER IN UCBX ; LK720:‘ MOV (SP)+,R1 ;RESTORE R1 (SAVED BEFORE $TSTBF) ; LK720E‘ BIC #S2.FLF,2(R5) ;;CLEAR FORCE-LF FLAG (LF IS FORCED ONLY ; LK720N-‘ ;ON ECHO, NOT ON TASK OUTPUT) ; LK720 E‘ BIS #S5.DWA,U.TST5-U.TSTA(R5); SET DMA IO.WAL IN PROGRESS ; LK726 ‘ JMP 80$ ;GO ON ; LK720R‘ ; LK7202)‘3$: MOV (SP)+,R1 ;RESTORE R1 ;SA469 ‘5$: ;SA469R‘ ;SA469‘ .ENDC ;T$$DMA ;SA469‘ ;SA469‘ ;SA469,’ MOV U.TFOB(R4),R0 ;GET FIRST BUFFER IN R0-“ MOV #SETOBF,-(SP) ;FIRST SET UP NEW BUFFERF”• .IFT ;T$$CUP2–,— BIT #S2.PCU,2(R5) ;CURSOR POS. REQUESTED?˜ BEQ 10$ ;N - JUMPC/™ MOV U.TOC(R4),R2 ;Y - GET CURSOR COORDINATESA!š SUB #401,R2 ;ADJUST TO BASE 0I6› MOV #CPOS,EXPCP ;SET POINTER TO CURSOR POS. ROUTINEœ CALL @(SP)+ ;CALL COROUTINES-� MOV #EXPC3,EXPCP ;RESTORE POINTER TO EXPC3; ž BIC #S2.PCU,2(R5) ;CLEAR FLAG Ÿ BR 40$ ; ¡ .ENDC ;T$$CUP¢£;0¤; CHECK IF ANY LEADING LF'S SHOULD BE INSERTED¥;F¦10$:§%¨ TSTB U.TVFC(R4) ;GET VFC CHARACTERF'© BEQ 40$ ;NO LEADING LF OR FF - JUMP2ª« .IF DF T$$RPR&T$$EIOS¬;­ BIT #S6.EIO,U.TST6-U.TSTA(R5) ;WAS THIS AN EXTENDED I/O? ® BEQ 15$ ;BR IF NOT,¯ MOV U.TCO(R4),R2 ;GET SAVED OUTPUT PACKET° TST (R2) ;IS THIS IO.RPR± BEQ 15$ ;IF EQ, NO8² TSTB U.TCHP-U.TSTA(R5) ;AT LEFT (OTHER RIGHT) MARGIN?$³ BNE 40$ ;IF NE NO, JUMP AND PRAY´15$:µ .ENDC ; DF T$$RPR&T$$EIO¶(· MOVB U.TVFC(R4),R2 ;GET VFC CHARACTER¸ BPL 30$ ;FF - JUMP¹20$:#º MOVB #CH.LF,R2 ;ONE OR MORE LF'SF»30$:¼ CALL @(SP)+ ;INSERTF"½ INCB U.TVFC(R4) ;ANY MORE LF'S?¾ BEQ 35$ ;N - JUMPU¿ BMI 20$ ;Y - LOOPH)À CLRB U.TVFC(R4) ;JUST DID A FF - CLEARTÁ;M&Â; INSERT CHARACTERS FROM TASK BUFFERÃ;TÄ35$:Å .IF DF T$$RPR&T$$EIO1Æ;Ç BIT #S6.EIO,U.TST6-U.TSTA(R5) ;WAS THIS AN EXTENDED I/O?MÈ BEQ 40$ ;BR IF NOT,É MOV U.TCO00�r~‡|Ž{´cÚµcÛ¶c�·c›’(R4),R2 ;GET SAVED OUTPUT PACKETÊ TST (R2) ;IS THIS IO.RPRË BEQ 40$ ;IF EQ, NO0Ì BIS #S2.ELF,2(R5) ;SET THE EAT-A-LINEFEED BITÍÎ .ENDC ; DF T$$RPR&T$$EIOÏÐ40$: ;REFERENCE LABELÑÒ .IF DF T$$ACDÓ8Ô TST U.ACB-U.TSTA(R5) ;DOES THIS TERMINAL HAVE AN ACD?Õ BEQ 48$ ;N - JUMPAAÖ BIT #UA.TRN,U.AFLG-U.TSTA(R5) ;IN THE MIDDLE OF A TRANSLATION?4× BNE 44$ ;Y - CONTINUE FROM POINT OF INTERRUPTION?Ø TST U.TTOC(R4) ;HAVE WE ALREADY BEEN THROUGH THIS CODE PATH?T*Ù BEQ 60$ ;Y - JUST OUTPUT A TRAILING CR4Ú42$: CLR U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSINGÛ MOV R0,-(SP) ;SAVE R0?Ü MOV #A.TRAN,R0 ;SET OUTPUT CHARACTER TRANSLATION ENTRY POINTÝ CALL $SWACD ;CALL ACDÞ MOV (SP)+,R0 ;RESTORE R0TGß BIT #UA.TRN,U.AFLG-U.TSTA(R5) ;DOES ACD WANT TO PERFORM TRANSLATION?Mà BEQ 48$ ;N - JUMPLAá CLR U.TTOC(R4) ;ACD WILL DETERMINE NUMBER OF CHARACTERS OUTPUTN'â44$: MOV U.ACB-U.TSTA(R5),R2 ;GET ACBUAã ADD #A.SMAP,R2 ;POINT TO SYSTEM STATE BUFFER PARAMETERS OFFSET$1ä46$: MOV (R2)+,KISAR6 ;MAP BUFFER PASSED BY ACD-,å MOVB @(R2)+,R2 ;GET CHARACTER FROM BUFFER,æ MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPING3ç CALL @(SP)+ ;INSERT CHARACTER INTO TTDRV BUFFERC#è MOV U.ACB-U.TSTA(R5),R2 ;GET ACBT9é ADD #A.SMAP+2,R2 ;POINT TO SYSTEM STATE BUFFER ADDRESSMê INC (R2)+ ;UPDATE POINTER-ë DEC @R2 ;DECREMENT COUNT6ì BEQ 42$ ;ZERO - CALL ACD TO GET NEXT BUFFER IF ANY7í CMP -(R2),-(R2) ;BACKUP TO BUFFER ADDRESS DOUBLEWORDT1î BR 46$ ;LOOP TO GET AND INSERT NEXT CHARACTERVïð .ENDC ;T$$ACDñ<ò48$: TST U.TTOC(R4) ;ANY MORE CHARACTERS FROM TASK BUFFER?+ó ;(THERE WON'T BE IF WE COME HERE FROM'ô ;"FPORD" TO OUTPUT A TRAILING CR)Dõ BEQ 60$ ;N - JUMPB,ö50$: MOV I.PRM(R3),KISAR6 ;MAP TASK BUFFER+÷ MOVB @I.PRM+2(R3),R2 ;GET NEXT CHARACTERCø,ù MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPING!ú CALL @(SP)+ ;INSERT CHARACTERT1û INC I.PRM+2(R3) ;UPDATE POINTER IN TASK BUFFERP-ü DEC U.TTOC(R4) ;DECREMENT TOTAL BYTE COUNTPý BNE 50$ ;MORE TO DO - LOOPþ;.ÿ; CHECK IF TRAILING CARRIAGE RETURN REQUIRED;R*60$: BIT #S2.CR,2(R5) ;INSERT CR AT END? BEQ 70$ ;N - JUMPE MOVB #CH.CR,R2 ;Y - DO IT CALL @(SP)+ ;D* BIC #S2.CR,2(R5) ;CLEAR CR AND ELF FLAG70$: .IF DF T$$CUP /  BIT #S2.RCU,2(R5) ;CURSOR RESTORE REQUESTED?V  BEQ 80$ ;N - JUMP /  MOV U.TSHP(R4),R2 ;Y - GET SAVED CURSOR POS.T6  MOV #CPOS,EXPCP ;SET POINTER TO CURSOR POS. ROUTINE CALL @(SP)+ ;CALL COROUTINEB- MOV #EXPC3,EXPCP ;RESTORE POINTER TO EXPC3  BIC #S2.RCU,2(R5) ;CLEAR FLAG .ENDC ;T$$CUP80$:+ MOV -(R1),R2 ;GET POINTER TO NEXT BUFFERN% BEQ 90$ ;NO UNUSED BUFFERS - JUMP4 CLR (R1) ;END THE LIST WITH THE LAST USED BUFFER7 CLZ ;CLEAR CC-Z TO TELL DELTB TO DEALLOCATE A LISTU- CALL DELTB ;DEALLOCATE THE UNUSED BUFFERS 90$: .IF DF T$$RPR0 MOV U.TCO(R4),R3 ;RESTORE REAL PACKET POINTER  ;**-1 ! .IFTF ;T$$RPR"9# TST I.PRM+16(R3) ;DID WE MANAGE TO BUFFER ALL THE DATAT$ ;IN ONE BUFFER LIST?% BEQ WRITE2 ;N - JUMP5& CALL $TSTBF ;Y - TEST IF TASK CAN BE CHECKPOINTEDR' BCS CLR16 ;N - JUMP9() .IFT ;T$$RPRS* + TST (R3) ;IS THIS AN IO.RPR?, BEQ 100$ ;N - JUMP-. .IF DF T$$EIO/0 ASSUME S6.RDI,100000A152 TST U.TST6-U.TSTA(R5) ;READING WITH DEFAULT INPUT?0-3 BPL 95$ ;IF EQ NO, MUST ALLOCATE A BUFFERRF4 MOV U.TDIF(R4),U.TFIB(R4) ;USE DEFAULT INPUT BUFFERS FOR INPUT DATA15 BNE 100$ ;IF NE THERE ARE SOME BUFFERS TO USET/6 BR CLR16 ;ELSE NOT ENOUGH AVAILABLE BUFFERSE78 .ENDC ;T$$EIO9.:95$: CALL ALTB ;ALLOCATE FIRST INPUT BUFFER;< BCS CLR16 ;FAILED - JUMP.= MOV R2,U.TFIB(R4) ;OK - SAVE BUFFER POINTER>? .IFTF ;T$$RPR@A100$:D2B CALL $INIBF ;INITIALIZE INTERMEDIATE BUFFERINGC BR WRITE2 ;START OUTPUTHDCLR16:&E CLR I.PRM+16(R3) ;USE $IOFIN AT ENDF4G .SBTTL . WRITE2 - START OUTPUT OF THE BUFFER LISTH; ,I; WRITE2 - START OUTPUT OF THE BUFFER LISTJ;R KWRITE2:ELM .IFT ;T00�z~;}±|t÷tø tþfDATA$$RPR1NO TST (R3) ;IO.RPR?LP BEQ 10$ ;N - JUMPC?Q BIS #S5.RPO,U.TST5-U.TSTA(R5) ;SET PROMPT OUTPUT IN PROGRESSR CLR (R3) ;INITIALIZE STATUSM#S10$: CMP (SP)+,(SP)+ ;CLEAN STACKITU .IFF ;T$$RPR$VW TST (SP)+ ;CLEAN STACKXY .ENDC ;T$$RPRZ0[ MOV #STAXL,-(SP) ;START OUTPUT OF BUFFER LIST\] JMP LOCKI ;3^_`.PAGEEBa .SBTTL . PRLF - OUTPUT LEADING LF FOR SOLICITED INPUT IF NEEDEDb;R?c; PRLF - OUTPUT LEADING LF FOR SOLICITED INPUT AT LEFT MARGIN.d;TePRLF:fg .IF DF T$$SPLh.i MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBXjk .IFF ;T$$SPLOl$m MOV U.TUX-U.TSTA(R5),R4 ;GET UCBXno .ENDC ;T$$SPLp7q CALL EXCR1 ;EXPAND A CARRIAGE RETURN (YIELDING LF!)(rs MOV #ECHSTR,-(SP) ;OUTPUT LFR t JMP LOCKIu.PAGE(?v .SBTTL . INSERT - INSERT (EXPANSION OF) CHARACTER IN BUFFER.w;Ex;+Ry; INSERT - INSERT (THE EXPANSION OF) ONE CHARACTER IN THE CURRENT OUTPUT BUFFER.z;E {; INPUTS:'|; R0 CURRENT POINTER IN OUTPUT BUFFERR6}; R1 POINTER TO SECOND WORD IN CURRENT OUTPUT BUFFER~; R2 CHARACTER TO INSERT; R4 POINTER TO UCBX€; R5 POINTER TO U.TSTA�;C ‚; OUTPUT:NFƒ; 1. IF (THE EXPANSION OF) THE CHARACTER FITS IN THE CURRENT BUFFER,B„; OR IF IT DOES NOT BUT ANOTHER BUFFER IS SUCCESSFULLY ALLOCATED;…; AND LINKED TO THE OLD BUFFER, THE CHARACTER IS INSERTED6†; AND THE CALLER IS CALLED BACK AS A COROUTINE WITH:‡; R0 UPDATED/ˆ; R1 POINTER TO SECOND WORD IN CURRENT BUFFER0‰; (MAY BE A NEW BUFFER)Š; R2 DESTROYED‹; R3-R5 UNCHANGEDN7Œ; THE CALLER MAY NOW LOAD ANOTHER CHARACTER IN R2 AND44�; HAVE IT INSERTED BY A "CALL @(SP)+" INSTRUCTION.Ž;T@�; 2. ELSE, IF THIS IS THE PROMPT FOR AN IO.RPR, THE HORIZONTAL5�; AND VERTICAL POSITION AND THE WRAP-AROUND CONTEXTU4‘; IS RESTORED, AND THE ERROR IE.NOD IS RETURNED TO$’; THE TASK. (NO RETURN TO CALLER).“;A@”; 3. ELSE, OUTPUT IS STARTED WITH THE CURRENT LIST OF BUFFERS.•; (NO RETURN TO CALLER).–;-—;0 ˜ .ENABL LSBA ™INSERT:)š MOV R3,-(SP) ;SAVE R3›10$:œ CLR -(SP) ;CLEAR FLAGN� MOV R2,-(SP) ;SAVE CHARACTERNž ASSUME U.TCHP&1,0Ÿ ASSUME U.TCVP,U.TCHP+1U5  MOV U.TCHP-U.TSTA(R5),-(SP) ;SAVE CURRENT POSITION ,¡ MOV 2(R5),-(SP) ;SAVE WRAP-AROUND CONTEXT(¢ ;(IF EXPANDED STRING DOES NOT FIT)<£ BIC #S2.FLF,2(R5) ;CLEAR FORCE-LF FLAG (LF IS FORCED ONLY#¤ ;ON ECHO, NOT ON TASK OUTPUT)S¥¦ .IF DF T$$CUP§4¨ CALL @EXPCP ;EXPAND CHAR. OR CURSOR POS. COMMAND©ª .IFF ;T$$CUPN« ¬ CALL EXPC3 ;EXPAND CHARACTER­® .ENDC ;T$$CUP¯7° BVC 15$ ;IF V IS SET, THIS CHAR. IS TO BE DISCARDEDA ± ASL 6(SP) ;CLEAR SAVED CARRY² BR 40$ ;GO TO RESTORE STACKR³15$:.´ BEQ 30$ ;SINGLE CHARACTER EXPANSION - JUMPµ ROL 6(SP) ;SAVE CC-C)¶ ADD R2,(R1) ;UPDATE BUFFER BYTE COUNTB'· CMP (R1),#T$$BFL-4 ;DOES STRING FIT? ¸ BHI 50$ ;N - JUMPO¹20$:,º MOVB (R3)+,(R0)+ ;COPY STRING INTO BUFFER» SOB R2,20$ ;LOOP ¼ BR 40$R½30$:9¾ CMP (R1),#T$$BFL-4 ;ROOM FOR ONE MORE CHAR. IN BUFFER?A¿ BHIS 60$ ;N - JUMP&À MOVB R2,(R0)+ ;Y - INSERT CHARACTERÁ INC (R1) ;UPDATE BYTE COUNTÂ40$:>à CMP (SP)+,(SP)+ ;POP SAVED POSITION AND WRAP-AROUND CONTEXT"Ä MOV (SP)+,R2 ;RESTORE CHARACTER=Å ROR (SP)+ ;NEED TO CALL EXPCHR AGAIN WITH THIS CHARACTER?TÆ BCS 10$ ;Y - LOOPÇ MOV (SP)+,R3 ;N - RESTORE R3F!È CALL @(SP)+ ;CALL CALLER BACK:É BR INSERT ;DO IT AGAINÊ;G/Ë; CHARACTER EXPANSION DOES NOT FIT IN BUFFER.HÌ; RESTORE CURRENT HORIZONTAL AND VERTICAL POSITION AND STATE VARIABLE.Í;;Î50$:*Ï SUB R2,(R1) ;RESTORE BUFFER BYTE COUNTÐ;(KÑ; RESTORE PREVIOUS WRAP AND POSITION CONTEXT. *** NOTE *** MOST BITS OFWKÒ; U.TSTA+2 ARE MODIFIED ONLY AT SYSTEM STATE OR DURING CHARACTER ECHOING.OJÓ; ECHOING CAN NOT INTERRUPT US HERE BECAUSE INPUT PROCESSING IS DISABLEDJÔ; BY S1.DSI. HOWEVER, A FEW BITS ARE MODIFIED DURING INPUT PRIOR TO THEJÕ; S1.DSI CHECK (^O, ^S, TABUF FULL). THE STATE OF THES BITS MUST NOT BE*Ö; DISTURBED WHEN RESTORING WRAP CONTEXT.×00�‚~‡|Ž{´cÚµcÛ¶c�·c›’;SØ60$:EÙ BIC #S2.BEL!S2.CTO!S2.CTS,(SP) ;CLEAR BITS WE DON'T WANT TO AFFECTFÚ BIC #^C,2(R5) ;WIPE OUT BITS WE WANT TO RESET)Û BIS (SP)+,2(R5) ;RESTORE STATUS WORD 2TÜÝ ASSUME U.TCHP&1,0Þ ASSUME U.TCVP,U.TCHP+1Aß8à MOV (SP)+,U.TCHP-U.TSTA(R5) ;RESTORE CURRENT POSITIONá;Y"â; ALLOCATE ANOTHER OUTPUT BUFFERã;D+ä MOV -(R1),R2 ;GET POINTER TO NEXT BUFFER(6å BNE 70$ ;THERE IS A FREE BUFFER IN THE LIST - JUMP&æ CALL ALTB ;ALLOCATE ANOTHER BUFFERç70$:1è MOV R2,R0 ;GET BUFFER ADDRESS (IF WE GOT ONE)R"é MOV (SP)+,R2 ;RESTORE CHARACTER1ê MOV R2,(SP)+ ;POP FLAG WORD (DON'T TOUCH CC-C)Eë MOV (SP)+,R3 ;RESTORE R32ìí .IF DF T$$RPRîï BCS 80$ ;FAILED - JUMPðñ .IFF ;T$$RPRTò*ó BCS CLR16 ;FAILED - CLEAR I.PRM+16 ANDô ;START OUTPUTõö .ENDC ;T$$RPR÷'ø MOV R0,(R1) ;LINK NEW BUFFER TO OLDTù4ú .SBTTL . SETOBF - INITIALIZE OUTPUT BUFFER HEADER ûSETOBF:L#ü TST (R0)+ ;POINT TO SECOND WORDN!ý MOV R0,R1 ;SAVE POINTER IN R1 .þ CLR (R0)+ ;INITIALIZE BYTE COUNT AND POINTÿ ;TO START OF DATA AREA% BR INSERT ;START USING NEW BUFFER ;E; FAILED TO ALLOCATE BUFFER; .IF DF T$$RPR80$:, MOV U.TCO(R4),R3 ;GET REAL PACKET POINTER TST (R3) ;IO.RPR?L'  BEQ CLR16 ;N - START PARTIAL OUTPUT  ;AFTER CLEARING I.PRM+16!  TST (SP)+ ;POP RETURN ADDRESS  ASSUME U.TCHP&1,0  ASSUME U.TCVP,U.TCHP+1E8 MOV (SP)+,U.TCHP-U.TSTA(R5) ;RESTORE CURRENT POSITION/ BIC #S2.WRA,2(R5) ;CLEAR WRAP-AROUND CONTEXTI= MOV #IE.NOD&377,(R3) ;GET STATUS FOR "NO BUFFER AVAILABLE" CLR I.PRM+16(R3) ;USE $IOFINE- ;FALL THRU TO "FPORD" TO FINISH REQUEST .ENDC ;T$$RPR  .DSABL LSBO.PAGEG# .SBTTL OUTPUT REQUEST COMPLETION;' .SBTTL . FPORD - OUTPUT REQUEST DONEL;U;+ ; FPORD - OUTPUT REQUEST DONE.;P7; COME HERE WHEN ALL OUTPUT BUFFERS HAVE BEEN OUTPUT. 4; TRANSFER MAY OR MAY NOT BE COMPLETED - IF IT IS,7 ; STATUS IS STORED IN THE LINK WORD OF THE IO PACKET.O!;O:"; THIS ROUTINE IS ENTERED FROM THE FORK DISPATCHER WITH:#; R4 UCBX ADDRESSP$; R5 POINTER TO U.TSTA%;-&;H 'FPORD::D#( MOV U.TCO(R4),R3 ;GET I/O PACKET$) TST (R3) ;STATUS PRESENT?G* BNE ORQDON ;Y - JUMP+ TST U.TTOC(R4) ;ALL DONE?!, BNE 10$ ;N - MORE TO DO, JUMP3- ;NOTE - THIS CANNOT HAPPEN WHEN DOING IO.RPR!H*. BIT #S2.CR,2(R5) ;TRAILING CR REQUIRED?/ BEQ 20$ ;IF EQ, NO...SKIP 010$:'0 MOV R4,R1 ;POINT TO UCBX ;SA466 80 ADD #U.TFOB,R1 ;POINT TO FIRST OUTPUT BUFFER ;SA4660 ;SA4661 JMP WRITE1 ;BRANCH AID220$:!3 INC (R3) ;SET STATUS = IS.SUC405 .SBTTL . ORQDON - OUTPUT REQUEST HAS FINISHED6;7; OUTPUT DONE.8;E 9ORQDON:B1: CLR U.TCO(R4) ;CLEAR POINTER TO PACKET TO SHOW%; ;NOT DOING TASK OUTPUT ANY MORE $< BIC #S1.OBY,(R5) ;SET OUTPUT FREE=>; .IF DF T$$EIO?;5B@; BIC #S5.FMT,U.TST5-U.TSTA(R5);INITIALIZE OUTPUT FORMATTING BITA;RB; .ENDC ;T$$EIOXCD .IF DF T$$RPREAF BIT #S5.RPO,U.TST5-U.TSTA(R5) ;WAS THIS PROMPT OF RPR REQUEST?G BEQ 20$ ;N - JUMPDAH BIC #S5.RPO,U.TST5-U.TSTA(R5) ;CLEAR PROMPT OUTPUT IN PROGRESSN%I TSTB (R3) ;HAVE AN ERROR ALREADY?J BMI 10$ ;Y - JUMPK4L FRKBIT BIS,#FR.GRQ ;TRY ANOTHER PACKET WHEN INPUT1M ;HAS BEEN STARTED (LINE MAY BE FULL DUPLEX)#N JMP PPRLB1 ;NOW DO THE READ,O ;(LEAVE LINK WORD NON-ZERO TO INDICATEP ;DOING IO.RPR)Q10$:#R BIC #S1.IBY,(R5) ;SET INPUT FREE$1R CLR U.TFPB(R4) ;CLEAR BUFFER POINTER ;SA471TY ;**-6HZ .IF DF T$$EIO[<\ MOV U.TDIF(R4),R2 ;GET FIRST DEFAULT INPUT BUFFER, IF ANY0] CALL DELTB ;DEALLOCATE DEFAULT INPUT BUFFERS ^ CLR U.TDIF(R4) ;CLEAR POINTER5^ MOV U.TRTT(R4),R2 ;ANY TERMINATOR TABLE? ;SA471P%^ BEQ 16$ ;BRANCH IF NOT ;SA471E'^ CALL DETB ;DEALLOCATE IT ;SA471B5^ CLR U.TRTT(R4) ;AND CLEAR OUT THE POINTER ;SA471T^16$: ;SA471_` .ENDC ;T$$EIOab .ENDC ;T$$RPRcd20$:ef .IF DF T$$ACD00�Š~ž�~±|t÷tø tþfDATAg8h TST U.ACB-U.TSTA(R5) ;DOES THIS TERMINAL HAVE AN ACD?i BEQ 30$ ;N - JUMP(4j MOV #A.OUTP,R0 ;SET OUTPUT COMPLETION ENTRY POINTk CALL $SWACD ;CALL ACDTlm .ENDC ;T$$ACDno30$:-p MOV U.TFOB(R4),R2 ;GET FIRST OUTPUT BUFFERN&q CALL DELTB ;DEALLOCATE ALL BUFFERS4r MOV I.PRM+4(R3),R1 ;GET NUMBER OF BYTES REQUESTED%s SUB U.TTOC(R4),R1 ;SUBTRACT U.TTOCRt;TBu; IF A REQUEST IS ABORTED (BY TIME-OUT OR IO.KIL), WE RETURN THE@v; NUMBER OF BYTES TRANSFERRED, INCLUDING THE CURRENT (PARTIAL)?w; BUFFER. THERE IS NO WAY WE CAN FIND OUT HOW MANY BYTES FROMN@x; THE TASK'S BUFFER CORRESPOND TO THE NUMBER OF EXPANDED BYTES)y; THAT WE SENT FROM THE CURRENT BUFFER.Az;{ ASSUME TF.WIR,2004| TSTB I.FCN(R3) ;DOES USER WANT INPUT REDISPLAYED?}~ .IF DF T$$BTW€ BMI 40$ ;IF MI, YES...DO ITB,� CMPB I.PRI(R3),#251. ;WAS THIS AN IO.WBT?‚ BNE 70$ ;N - JUMPAƒ ASSUME S3.FDX,200!„ TSTB 4(R5) ;FULL DUPLEX LINE?E… BMI 70$ ;Y - JUMPR†40$:‡ˆ .IFF ;T$$BTWE‰6Š BPL 70$ ;IF PL, NO...JUST FINISH THE INPUT REQUEST‹Œ .ENDC ;T$$BTW�Ž ASSUME S1.IBY,200� TSTB (R5) ;INPUT BUSY?� BPL 70$ ;N - JUMPE‘;O?’; WE JUST FINISHED AN IO.WBT THAT BROKE THROUGH AN INPUT ON A(@“; NON-FULL-DUPLEX LINE. FAKE A CTRL-R TO REDISPLAY THE CURRENT”; INPUT LINE.I•;.E–; THERE CANNOT BE A FORK REQUEST PENDING FOR INPUT DONE (OR PARTIAL-E—; INPUT DONE) SINCE INPUT FORK REQUESTS ARE PROCESSED BEFORE OUTPUTI˜; FORK REQUESTS.™;š› .IF DF T$$SPLœB� MOVB #CH.CTR,U.TECO-U.TSTA(R5) ;PUT CTRL-R CHAR. IN ECHO BUFFERžŸ .IFF ;T$$SPLM ;¡ MOVB #CH.CTR,U.TECB(R4) ;PUT CTRL-R CHAR. IN ECHO BUFFER¢£ .ENDC ;T$$SPL¤¥3¦ FRKBIT BIS,#FR.PFP ;REQUEST POST-FORK PROCESSINGL§¨© .IF DF T$$ESCª«;SE¬; IF WE ARE IN THE MIDDLE OF AN ESCAPE SEQUENCE, WE MUST RUB IT OUTQ?­; SINCE THE ESCAPE SEQUENCE AND CTRL-R ROUTINES SHARE U.TISV.N7®; FURTHERMORE, CTRL-R DOES NOT WORK IF S1.ESC IS SET.R¯;T(° BIT #S1.ESC,(R5) ;IN ESCAPE SEQUENCE?± BEQ 70$ ;N - JUMP(² MOV R3,-(SP) ;SAVE R3³/´ CALL RUBESC ;Y - RUBOUT THE ESCAPE SEQUENCE,µ¶ MOV (SP)+,R3 ;RESTORE R3C·¸ .ENDC ;T$$ESC¹º70$:A» CLR I.PRM+12(R3) ;TELL $FINBF NO BUFFERS TO COPY OR DEALLOCATE¼;.½; FALL THRU TO "DONE"¾;W¿.PAGET,À .SBTTL DONE - GENERAL I/O DONE PROCESSINGÁ;QÂ;+(Ã; DONE - DO I/O COMPLETION PROCESSING.Ä;H Å; INPUT:Æ; R1 IOSB WORD 2Ç; R3 POINTER TO PACKETÈ; I.LNK = IOSB WORD 1É; R5 POINTER TO U.TSTA%Ê; I.PRM+16 0 IF $IOFIN TO BE USED,V Ë; NON-0 IF $QUEBF TO BE USEDÌ; Í; OUTPUT:HÎ; I/O REQUEST FINISHED.MÏ;P%Ð; REGISTERS ALTERED: R0,R1,R2,R3,R4CÑ;-Ò;:ÓDONE::Ô9Õ FRKBIT BIS,#FR.GRQ ;TIME TO TRY TO GET ANOTHER PACKET. Ö MOV (R3),R0 ;GET IOSB WORD 1 × TST I.PRM+16(R3) ;USE $QUEBF?Ø BEQ 10$ ;N - JUMPÙ CALLR $QUEBF ;FINISH IOOÚ10$:Û CALLR $IOFIN ;FINISH IO:ÜÝ .END WORD 2Ç; R3 POINTER TO PACKETÈ; I.LNK = IOSB WORD 1É; R5 POINTER TO U. .TITLE TTSUB .IDENT /06.01/;N8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;Y ;  ; 02-FEB-78 PETER WANNHEDEN ;: ; PREVIOUSLY MODIFIED BY:O;O; P. WANNHEDEN; D. R. DONCHIN ; T. LEKAS; R. PHILPOTT ; S. ADAMS;;; MODIFICATIONS:;R; L. Kogan 02-NOV-85 06.01@; LK700 -- FIX SF.SMC/SF.GMC FOR NON-SETTABLE CHARACTERISTICS8; FOR NON-OVERLAID TERMINAL DRIVER (EX. SET /PARITY; FOR DL-11).;;>?@ .MCALL PKTDF$,EVNDF$U A PKTDF$N B EVNDF$BCD .PSECT MAP6E;YF;+;G; TTSUBR - MISCELLANEOUS SUBROUTINES FOR TERMINAL DRIVER.FH;-I; J;E0K.SBTTL ALUCBX - ALLOCATE A UCB EXTENSION BLOCKL;WM;+-N; ALUCBX - ALLOCATE A UCB EXTENSION (UCBX).IO; P; INPUT:Q; R5 POINTER TO U.TSTAR; S; OUTPUT:g*T; IF SUCCESS, OR IF UCBX ALREA00ž’~‡|Ž{´cÚµcÛ¶c�·c›’DY EXISTS: U; CC-C 0V; R4 POINTER TO UCBXW; U.TUX POINTS TO UCBX1X; UCBX INITIALIZED (ONLY IF UCBX WAS ALLOCATED)-Y;Z; IF FAILURE:. [; CC-C 1\;F]; REGISTERS ALTERED: R0,R2,R4^;-_;6`a .IF NDF T$$SPLRbc;L d .ENABL LSBNe;Rf ASSUME U.TUX,U.TSTA-20gALUCBX::MOV -(R5),R4 ;IS THERE ALREADY A UCBX?h CLC ;ASSUME YES#i BNE 10$ ;Y - EXIT WITH CC-C = 0O$j CALL ALTB ;N - ALLOCATE A BUFFER(k BCS 10$ ;FAILED - EXIT WITH CC-C = 1l MOV R2,@R5 ;SAVE POINTERm;Tn; INITIALIZE A FEW CELLSo; p ASSUME U.TCI,0N$q ;U.TCI ALREADY CLEARED BY ALTB+r CLR U.TCO(R2) ;NO CURRENT OUTPUT REQUESTE-s CLRB U.TISV(R2) ;INITIALIZE STATE VARIABLE,t ASSUME U.TITI&1,0u ASSUME U.TOTI,U.TITI+10v CLR U.TITI(R2) ;CLEAR INPUT AND OUTPUT TIMERS@w CLR U.TFPB(R2) ;CLEAR PROMPT BUF ADDRS/UNSOLICITED INPUT FLAG,x CLR U.TRTT(R2) ;ASSUME NOT A RTT FUNCTIONyz .IF DF T$$EIO{;| CLR U.TDIF(R2) ;CLEAR FIRST DEFAULT INPUT BUFFER POINTERR}~ .ENDC ;T$$EIO€,� .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB‚9ƒ ADD #U.TAST,R2 ;POINT TO UNSOLICITED INPUT ACB ADDRESSO/„X = U.TAST ;SYMBOL NEEDED FOR ASSUME MACROST…† .IF DF T$$CCA‡6ˆ CLR (R2)+ ;CLEAR ACB POINTER FOR UNSOLICITED INPUT ‰X = X + 2EŠ‹ .ENDC ;T$$CCAŒ� .IF DF T$$SCAŽ� ASSUME U.TSCA,X �X = X + 2 1‘ CLR (R2)+ ;CLEAR SWITCH CHARACTER ACB POINTERC’“ .ENDC ;T$$SCA”• .IF DF T$$MHU–— ASSUME U.TMHA,X ˜X = X + 2E™-š CLR (R2)+ ;CLEAR MODEM HANGUP ACB POINTER ›œ .ENDC ;T$$MHU�ž .IF DF T$$ICSŸ  ASSUME U.TICA,X ¡X = X + 2N(¢ CLR (R2)+ ;CLEAR ICS ACB/TEP POINTER£¤ .ENDC ;T$$ICS¥¦ .IF DF T$$OOB§¨ ASSUME U.TOBA,X ©X = X + 2T'ª CLR (R2) ;CLEAR OOB ACB/TEP POINTER«¬ .ENDC ;T$$OOB­,® .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB¯° ;EXIT WITH CC-C = 0I2±10$: MOV (R5)+,R4 ;RESTORE R5 AND GET UCBX IN R4#² ;(OR 0 IF COMING FROM DEUCBX)M³20$: RETURN ;RETURN´;(µ; 2¶.SBTTL DEUCBX - DEALLOCATE A UCB EXTENSION BLOCK·;¸;+)¹; DEUCBX - DEALLOCATE UCBX IF POSSIBLE. º;N »; INPUT:¼; R5 POINTER TO U.TSTA½; ¾; OUTPUT:;9¿; IF LINE IS IDLE (BOTH INPUT AND OUTPUT), NOT ATTACHED +À; AND THERE ARE NO FORK REQUESTS PENDING,E.Á; THE UCBX (IF THERE IS ONE) IS DEALLOCATED.Â;!Ã; REGISTERS ALTERED: R0,R2,R4EÄ;-Å;-Æ;I*ÇDEUCBX::MOV @R5,-(SP) ;GET STATUS WORD 16È BIC #^C,@SP ;CLEAR ALL BUT INPUT ANDÉ ;OUTPUT BUSY FLAGS9Ê BIS U.TFRQ-U.TSTA(R5),@SP ;OR WITH FORK REQUEST FLAGS5Ë BIS U.ATT-U.TSTA(R5),(SP)+ ;OR WITH ATTACH POINTERN#Ì BNE 20$ ;IF NE DON'T DEALLOCATEAÍÎ .IF DF T$$IDOÏ0Ð TST $MCRPT ;IS THE MCR DISPATCHER INSTALLED?1Ñ BEQ 20$ ;IF EQ NO - DON'T DEALLOCATE THE UCBXÒÓ .ENDC ;T$$IDOÔÕ MOV -(R5),R2 ;GET UCBXÖ BEQ 10$ ;NONE - EXIT!× CLR (R5)+ ;OK - CLEAR POINTER:Ø ;FALL THRU TO "DETB"Ù; Ú .DSABL LSBBÛÜ .IFTF ;NDF T$$SPLÝÞ;A%ß.SBTTL DEALLOCATE A TERMINAL BUFFERTà;.á;+&â; DETB - DEALLOCATE TERMINAL BUFFER.ã;U ä; INPUT:å; R2 BUFFER ADDRESSCæ;N ç; OUTPUT:28è; BUFFER DEALLOCATED TO TT-DRIVER POOL OR SYSTEM POOL.é;$ê; REGISTERS ALTERED: R0,R2ë;-ì;í;Q+îDETB:: CMP R2,#120000 ;IN TT-DRIVER POOL?ï BLO 10$ ;N - JUMP6ð MOV FREEB,@R2 ;Y - ADD TO FRONT OF FREE BUFFER LISTñ MOV R2,FREEB ò RETURNNó10$: MOV R1,-(SP) ;SAVE R1,R3ô MOV R3,-(SP)S!õ MOV R2,R0 ;GET BUFFER ADDRESSö MOV #T$$BFL,R1 ;GET LENGTHN*÷ CALL $DEACB ;DEALLOCATE TO SYSTEM POOLø MOV (SP)+,R3 ;RESTORE REG'Sù MOV (SP)+,R1E ú RETURNûü .PSECT MAP5ý,þ .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOBÿ.PAGE; .SBTTL . DQACB - AST CONTROL BLOCK WAS DEQUEUED BY SYSXTC;,;+3; **-DQACB - AST CONTROL BLOCK DEQUEUE PROCESSINGV;BF; THIS SUBROUTINE IS CALLED WHEN SYSXT DEQUEUES AN AST CONTROL BLOCKM; THAT HAS A.CBL=0 AND THE DOUBLEWORD ADDRESS OF THIS ROUTINE IN A.KSR5 AND L; A.DQSR. IF THIS ACB GOT MARKED FOR DELETE00žš~�~±|t÷tø tþfDATA WHILE IT WAS IN THE AST QUEUEJ; (AF.MDE SET), DEALLOCATE THE BLOCK NOW. OTHERWISE CLEAR THE FLAG THAT5 ; INDICATES THE BLOCK IS IN THE AST QUEUE (AF.QUE).! ;BO ; IF THE ACB IS FOR UNSOLICITED INPUT AST'S AND THE ACB IS NOT LOCKED (AF.LCKL ; SET DUE TO TF.NOT CONSIDERATIONS), ATTEMPT TO GET ANOTHER CHARACTER FROM; ; THE TYPEAHEAD BUFFER, WHICH WILL REQUEUE THE AST BLOCK. ;H ; INPUTS: ; R0 => LINK WORD IN AST BLOCK; ; OUTPUTS: NONE.; "; REGISTERS MODIFIED: R1,R3,R5;-; DQACB::Q# CALL MAPD ;MAP DRIVER DATA AREAE) MOVB A.PRM+5(R0),R1 ;GET THE ACB FLAGS ASSUME AF.MDE,200( BPL 3$ ;IF PL, NOT MARKED FOR DELETE MOV R0,-(SP) ;SAVE R0  JMP DEACB1 ;GO TO DEALLOCATE 3$:C!<" BICB #AF.QUE,A.PRM+5(R0) ;CLEAR FLAG SAYING WE ARE QUEUED#$ .IF DF T$$OOB%&& BIT #AF.OOB,R1 ;IS THIS AN OOB AST?' BEQ 5$ ;BR IF NO;( TSTB A.PRM+24(R0) ;ANYTHING IN THE OOB TYPE AHEAD BUFFERS) BEQ 10$ ;IF NOT, WE'RE DONED0* MOV #FR.OOB,R3 ;STILL MORE CHARACTERS WAITING+;, MTPS #TTPRI ;DISABLE INTERUPTS WHILE CHANGING FORK LIST '- CALL FORK ;;;SO SET UP FORK REQUESTB . MTPS #0 ;RE-ENABLE INTERPUTS/ BR 7$05$:P12 .ENDC ;T$$OOB3-4 BIT #TF.AST,R1 ;IS THIS ACB FOR AN IO.ATA?,+5 BEQ 10$ ;IF EQ, NO...NOTHING ELSE TO DO%6 BIT #AF.LCK,R1 ;IS THE ACB LOCKED?B77 BNE 10$ ;IF NE, YES...DON'T CHECK MORE UNSOL. INPUT.,8 MOV A.PRM+2(R0),R5 ;GET POINTER TO U.TSTA97$::; .IF DF M$$PRO<3= CLR R3 ;IF A SWITCH TO ANOTHER CPU TAKES PLACE,G,> ;NO SPECIAL FORK PROCESSING ROUTINE IS,? ;REQUIRED - JUST GET ANOTHER CHARACTER!@ ;FROM THE TYPE-AHEAD BUFFERN%A CALL SWCPU ;SWITCH TO CORRECT CPUB;C;C; IF WE FALL THRU HERE, WE ARE ALREADY ON THE CORRECT CPUD;QEF .ENDC ;M$$PROG)H CALL SETDSI ;DISABLE INPUT PROCESSING I10$:3J RETURN ;SIMULATE RETURN FROM A FORK PROCESSINGN0K ;ROUTINE IN ORDER TO GET ANOTHER CHARACTER!L ;FROM THE TYPE-AHEAD BUFFERM,N .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOBOP; Q;PR;+BS; DELTB0 - DRIVER ENTRY POINT TO DEALLOCATE INTERMEDIATE BUFFERS*T; FOR INPUT REQUEST. CALLED FROM $FINBF.U; V; INPUT:$W; R0 POINTER TO FIRST INPUT BUFFERX;-Y;EZ;A#[DELTB0::CALL MAPD ;MAP DATA AREA\] .IF DF T$$ACD^&_ BIT #1,R0 ;DO BUFFER TRANSFER NOW?` BEQ 10$ ;N - JUMP (a MOV R0,-(SP) ;Y - SAVE BUFFER ADDRESS4b CALL UBTRA ;CALL ROUTINE TO PERFORM THE TRANSFER'c MOV (SP)+,R0 ;RESTORE BUFFER POINTERNd DEC R0 ;MAKE EVENUef .ENDC ;T$$ACDg#h10$: MOV R0,R2 ;GET FIRST BUFFER 'i CALLR DELTB1 ;"FALL THRU" TO DELTB1j;Ok;U=l.SBTTL DELTB - DEALLOCATE A LINKED LIST OF TERMINAL BUFFERSRm;In;+2o; DELTB - DEALLOCATE A LIST OF TERMINAL BUFFERS.p;A q; INPUT:,r; R2 ADDRESS OF FIRST BUFFER IN LIST, OR 0#s; CC-Z 0 IF R2 POINTS TO A BUFFERMt; u; OUTPUT: Bv; BUFFER POINTED TO BY R2 AND ALL FOLLOWING BUFFERS DEALLOCATED.w;Nx; REGISTERS ALTERED: R0,R2y;-z;N{;|} .PSECT MAP6~ DELTB1::#€ MOV @R2,-(SP) ;SAVE LINK TO NEXTF%� CALL DETB ;DEALLOCATE THIS BUFFERH ‚ MOV (SP)+,R2 ;GET NEXT BUFFER*ƒDELTB:: BNE DELTB1 ;THERE IS ONE - LOOP „ RETURNR…†.PAGE7‡ .SBTTL . IRESET - RESET INPUT STATE PROCESSING FLAGS7ˆ; AND IRESEL (SAME AS IRESET BUT FIRST CALLS LOCKI)‰;CŠ;+'‹; **-IRESET - RESET INPUT STATE FLAGSTŒ;K�; THIS ROUTINE RESETS THE FLAGS IN U.TSTA THAT AFFECT THE INPUT PRE-INPUTELŽ; AND INPUT PROCESSES OF THE TERMINAL DRIVER. ALL FLAGS ARE FIRST CLEAREDK�; AND NEW SETTINGS ARE DERIVED FOR CERTAIN ONES FROM THE CURRENT STATE OFK�; THE TERMINAL CHARACTERISTICS (U.TSTA+4). NOTE THAT THIS ROUTINE MAY BEM‘; CALLED FROM EITHER INTERRUPT STATE WHEN A TERMINATOR IS SEEN OR FROM FORKG+’; LEVEL WHEN COMPLETING AN INPUT REQUEST.T“;S ”; INPUTS:%•; R5 => U.TSTA OF THE TERMINAL UCBT–;G —; OUTPUTS:H=˜; U.TSTA FLAGS SET ACCORDING TO CHARACTERISTICS IN U.TSTA+4-™;Eš; REGISTERS MODIFIED: NONE.T›;-00ž¢~‡|Ž{´cÚµcÛ¶c�·c›’œ;V �IRESEL::"ž CALL LOCKI ;LOCK OUT INTERUPTS ŸIRESET::D  BIC #S1.TNE!S1.RST!S1.PTH!S1.RNE!S1.TSY!S1.RES!S1.RNF!S1.RSP,(R5)¡ ;;CLEAR UNWANTED FLAGS0¢ MOV 4(R5),-(SP) ;;GET CURRENT CHARACTERISTICS>£ BIC #^C,(SP) ;;CLEAR EXTRANEOUS FLAGS¤ ASSUME S3.RAL,S1.PTHI¥ ASSUME S3.NEC,S1.RNE ¦ ASSUME S3.TSY,S1.TSYT8§ BIT #S3.RAL,(SP) ;;IS TERMINAL IN READ-PASS-ALL MODE?¨ BEQ 10$ ;;IF EQ, NO...SKIPD© BIC #S1.TSY,(SP) ;;READ-PASS-ALL FORCES NO TTSYNC (S1.PTH IS SET)ª10$:4« BIT #S3.PTH,4(R5) ;;IS TERMINAL IN PASSTHRU MODE?¬ BEQ 20$ ;;IF EQ, NO...SKIP4­ BIS #S1.PTH,(SP) ;;SET PASSTHRU MODE IN THE FLAGS®20$:0¯ BIS (SP)+,(R5) ;;UPDATE THE INPUT STATE FLAGS° RETURN ;;ALL DONE±² .PAGE³8´ .SBTTL . LOCKI/LOCKR - LOCK OUT INTERRUPTS AND RETURNµ; ¶;+ ·; LOCKI - LOCK OUT INTERRUPTS..¸; THIS IS A COROUTINE THAT WORKS AS FOLLOWS:,¹; 1. RAISE PRIORITY TO LOCK OUT INTERRUPTS1º; 2. CALL CALLER (OR CALL ROUTINE WHOSE ADDRESS(»; IS ON TOP OF STACK)¼; 3. DROP PRIORITY ½; 4. RETURNS¾;-¿;+ÀLOCKI:: MTPS #TTPRI ;LOCK OUT INTERRUPTSH!Á CALL @(SP)+ ;;;CALL COROUTINEA&ÂLOCKR:: MTPS #0 ;;;ALLOW INTERRUPTSà RETURN ;RETURNÄÅ;Æ; ERRORS IN GET/SET SPEED, PARITY OPTIONS OR FLOW CONTROLOÇ;TÈ,ÉYJLPAR:: ;DJ11, DL11 DON'T HAVE SETTABLEÊYLLPAR:: ;LINE PARAMETERS 2ËYCLPAR:: ;NEITHER DOES THE PRO VIDEO INTERFACEÌ3Í TST R1 ;WAS THIS A NOTIFICATION OF FLOW CONTROL Î ;CHANGE?+Ï BEQ 10$ ;IF EQ NO - GO REPORT THE ERRORO5Ð RETURN ;Else just return. The port doesn't need#Ñ ;to be notified.Ò10$:Ó .IF DF D$$H11!D$$Z11!D$$V11ÔÕ .IF DF T$$OVLÖ*× TST (SP)+ ;POP RETURN ADDRESS IN MPROTØ$Ù MOV (SP)+,KINAR5 ;RESTORE MAPPING@Ý CMP (SP)+,(SP)+ ;POP RETURN ADDRESSES OF THIS AND THAT ;**-3Ý ; LK700:Ý .IFF ;T$$OVL ; LK700Ý ; LK700P,Ý TST (SP)+ ;POP RETURN ADDRESS ; LK700Ý ; LK700 Ý .ENDC ;T$$OVL ; LK7001Ý ; LK700PÞ MOV (SP)+,R3 ;RESTORE R3E!ß TST (SP)+ ;POP RETURN ADDRESSn'à MOV (SP)+,R1 ;RESTORE BUFFER POINTER.á DEC R1 ;AND BACK IT UP1â CMP (SP)+,(SP)+ ;RETURNS FROM SPDPRM AND MCXSP ãä .ENDC ;D$$H11!D$$Z11!D$$V11å2æ CALLR ERCNSC ;CONTROLLER SPEED IS NOT SETTABLEçèé.PAGEA,ê .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOBë:ì .SBTTL . DEACB/DEACB1 - DEALLOCATE AN AST CONTROL BLOCKí;Rî;+.ï; **-DEACB - DEALLOCATE AN AST CONTROL BLOCKð;L@ñ; THIS ROUTINE IS CALLED WHEN AN AST CONTROL BLOCK NEEDS TO BEFò; DEALLOCATED OR A TSA EVENT PACKET NEEDS TO BE PASSED TO IT'S OWNERGó; FOR DEALLOCATION PROCESSING. AN ACB IS DISTINGUISHED FROM A TEP BYDMô; OFFSETS A.CBL/E.VSIZ. AN ACB HAS A ZERO IN THIS WORD; A TEP IS NON-ZERO.OLõ; IF THE PACKET IS A TEP, IT IS MARKED FOR DELETE AND QUEUED TO THE OWNER.Jö; IF IT IS AN ACB, IT IS MARKED FOR DELETE AND A CHECK IS MADE TO SEE IFL÷; IT IS IN A TASK'S AST QUEUE (AF.QUE SET). IF SO, IT WILL BE DEALLOCATEDLø; WHEN IT IS DEQUEUED LATER ON (WITH A CALL TO DQACB). OTHERWISE THE SIZE1ù; OF THE ACB IS OBTAINED AND IT IS DEALLOCATED.ú; û; INPUTS:ü; FOR ENTRY AT DEACB:Bý; (R4) => UCBX LOCATION HOLDING ADDRESS OF ACB/TEP TO DEALLOCATE1þ; R5 => UCB FOR THE TERMINAL IF PACKET IS A TEPEÿ;A; FOR ENTRY AT DEACB1: H; R0 => THREAD WORD OF THE ACB (STRUCTURE HAS NEGATIVE OFFSETS) OR TEP;E; OUTPUTS: NONE.;TB; REGISTERS MODIFIED: R2 MAY BE DESTROYED BY THE OWNER ROUTINE;-;N  .ENABL LSB DEACB::I  MOV R0,-(SP) ;SAVE R0  MOV (R4),R0 ;GET THE ACB/TEP!  BEQ 30$ ;IF EQ, NONE...RETURN*  CLR (R4) ;INDICATE IT HAS BEEN DELETED .IF DF T$$TSA ASSUME A.CBL,E.VSIZ/ TST A.CBL(R0) ;IS THIS AN AST CONTROL BLOCK?L' BEQ 10$ ;IF EQ, YES...DEALLOCATE ITT MOV R3,-(SP) ;SAVE REGISTER MOV R1,-(SP) ;SAVE REGISTER, MOV R0,R3 ;COPY TEP ADDRESS FOR QUEUEING/ BISB #EF.MDE,E.VFLG(R3) ;MARK TEP FOR DELETE 5 CALL QUETEP ;PASS TEP TO NETWORK FOR00žª~�~±|t÷tø tþfDATA DEALLOCATIONS BR 20$ ;SKIP TO FINISH UP 10$: .ENDC ;T$$TSA4 BISB #AF.MDE,A.PRM+5(R0) ;MARK THE ACB FOR DELETE; BITB #AF.QUE,A.PRM+5(R0) ;IS ACB CURRENTLY IN AST QUEUE?4 BNE 30$ ;IF NE, YES...WAIT FOR IT TO BE DEQUEUED ;T'!; HERE TO ACTUALLY DEALLOCATE AN ACB..";L #DEACB1::($ MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS% MOV R1,-(SP) ;SAVE REGISTER-& MOVB A.PRM+4(R0),R1 ;GET LENGTH OF THE ACB./' CMP -(R0),-(R0) ;BACK UP TO START OF THE ACBT%( CALL $DEACB ;DEALLOCATE THE BLOCKO)20$:!* MOV (SP)+,R1 ;RESTORE REGISTER'+ MOV (SP)+,R3 ;RESTORE PACKET ADDRESSR,30$:- MOV (SP)+,R0 ;RESTORE R0B. RETURN ;ALL DONE / 0 .DSABL LSBN1,2 .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB345;+B6; **-MPROT- MAP AND CALL SPECIFIED ROUTINE WITHIN THE ROOT (MAINC7; APR5 MAPPING) OF THE TERMINAL DRIVER, RESTORE PREVIOUS MAPPINGI8; AND RETURN TO CALLER9;E :; INPUTS:H;;.0<; 2(SP) = ADDRESS OF APR5 ROUTINE TO BE CALLED3=; (SP) = ADDRESS OF TO WHICH TO RETURN WHEN DONEM>;P ?; OUTPUTS:@;S A; NONE.VB;+ C; ALL REGISTERS ARE PRESERVED.D;-;E .IF DF T$$OVL ;IF SYSTEM CONTAINS MEMORY-OVERLAID TTDRVSF GMPROT::-H MOV 2(SP),-(SP) ;DUPLICATE ADDRESS TO CALL9I MOV 2(SP),4(SP) ;PUT RETURN ADDRESS WHERE IT SHOULD BEI)J MOV KINAR5,2(SP) ;SAVE CURRENT MAPPING ,K MOV ROTMAP,KINAR5 ;MAP MAIN ROOT OF TTDRV!L CALL @(SP)+ ;AND CALL ROUTINEN$M MOV (SP)+,KINAR5 ;RESTORE MAPPINGN RETURN ;RETURN TO CALLERSOP;+HQ; **-MPEXT- MAP AND CALL SPECIFIED ROUTINE WITHIN THE OVERLAY (TTEXT),1R; RESTORE PREVIOUS MAPPING AND RETURN TO CALLER.S; T; INPUTS:YU;C-V; R1 = ADDRESS OF APR5 ROUTINE TO BE CALLEDW;V X; OUTPUTS:Y;C Z; NONE. [;L \; ALL REGISTERS ARE PRESERVED.];-^ _MPEXT::U)` MOV KINAR5,-(SP) ;SAVE CURRENT MAPPINGA,a MOV EXTMAP,KINAR5 ;MAP MAIN ROOT OF TTDRVb CALL (R1) ;AND CALL ROUTINE $c MOV (SP)+,KINAR5 ;RESTORE MAPPINGd RETURN ;RETURN TO CALLEROef;+%g; **-TRANSFERS TO AND FROM THE ROOTEh;D i; TRANSFER FROM TTINI TO QPEIOj kQPETRA::'l MOV EXTMAP,KINAR5 ;MAP THE EXTENSIONm CALLR QPEIO1 ;JMP TO QPEIO1An;S!o; TRANSFER FROM QPEIO1 TO QPWLBVp qQPWTRA::"r MOV ROTMAP,KINAR5 ;MAP THE ROOTs CALLR QPWLB ;JMP TO QPWLBt;X u; TRANSFER FROM TTATT TO QUEUEv wQUETRA::"x MOV ROTMAP,KINAR5 ;MAP THE ROOTy CALLR QUEUE ;JMP TO QUEUELz{ .ENDC ;T$$OVL|}; ~;O*.SBTTL ALTB - ALLOCATE A TERMINAL BUFFER€;�;+$‚; ALTB - ALLOCATE TERMINAL BUFFER.ƒ; „; INPUT:…; NONE†;Q ‡; OUTPUT:Pˆ; IF SUCCESS:T ‰; CC-C 02Š; R2 POINTER TO BUFFER WITH LENGTH T$$BFL BYTES.‹; FIRST WORD CLEARED.Œ;1�; IF FAILURE: Ž; CC-C 1�;R�; REGISTERS ALTERED: R0,R2‘;-’;B“;P,”ALTB:: MOV FREEB,R2 ;GET FIRST FREE BUFFER• BEQ 20$ ;NONE - JUMP+– MOV @R2,FREEB ;POINT TO NEXT FREE BUFFERE —10$: CLR @R2 ;CLEAR LINK WORD ˜ RETURN™20$: MOV R1,-(SP) ;SAVE R1%š MOV #T$$BFL,R1 ;SET DESIRED LENGTH (› CALL $ALOCB ;ALLOCATE IN SYSTEM POOLœ MOV (SP)+,R1 ;RESTORE R1 � MOV R0,R2 ;GET BUFFER IN R2Cž BCC 10$ ;OK - JUMP'Ÿ RETURN ;ELSE RETURN WITH CARRY SETR .PAGEL¡¢ .IFT ;NDF T$$SPLU£G¤.SBTTL CKTAB - CHECK FOR TYPE-AHEAD BUFFER ALLOCATION OR DEALLOCATIONB¥;V¦;+?§; CKTAB - CHECK WHETHER TYPE-AHEAD BUFFER SHOULD BE ALLOCATEDF¨; OR DEALLOCATED.R©;F ª; INPUT:«; R5 POINTER TO U.TSTA=¬; S3.TAB 0 DEALLOCATE TYPE-AHEAD BUFFER IF ONE IS ALLOCATEDS+­; (LOSING ALL CHARACTERS STORED IN IT) 6®; 1 ALLOCATE TYPE-AHEAD BUFFER IF NONE IS ALLOCATED0¯; (LOSING SINGLE CHARACTER IF THERE IS ONE)°;R±; REGISTERS ALTERED: R0,R2²;-³;L´;*µCKTAB:: CALL LOCKI ;LOCK OUT INTERRUPTS4¶ MOV U.TTAB-U.TSTA(R5),R2 ;;;GET TYPE-AHEAD BUFFER· BEQ 10$ ;;;NONE - JUMP)¸ BIT #1,R2 ;;;SINGLE-CHARACTER BUFFER?O¹ BNE 10$ ;;;Y - JUMPDº;»; TYPE-AHEAD BUFFER EXISTS¼;.*½ BIT #S3.TAB,4(R5) ;;;DEALLOCATE BUFFER?¾ BNE 20$ ;;;N - JUMP¿ CALL DETB ;;;Y - D00ž²~‡|Ž{´cÚµcÛ¶c�·c›’O IT3À CLR U.TTAB-U.TSTA(R5) ;;;SHOW NO BUFFER ANY MOREFÁ BR 20$ ;;;Â;$Ã; TYPE-AHEAD BUFFER DOES NOT EXISTÄ;N,Å10$: BIT #S3.TAB,4(R5) ;;;ALLOCATE BUFFER?Æ BEQ 20$ ;;;N - JUMPLÇ CALL ALTB ;;;Y - DO ITÈ BCS 20$ ;;;FAILED - JUMP5É MOV R2,U.TTAB-U.TSTA(R5) ;;;SAVE POINTER TO BUFFER"Ê CLR (R2)+ ;;;INITIALIZE HEADERË MOV #*400,@R2 ;;;Ì; Í; ALL DONEÎ;E2Ï20$: RETURN ;;;RETURN VIA COROUTINE THAT DROPSÐ ;;;PRIORITY ÑÒ .ENDC ;NDF T$$SPLÓÔ.PAGET,Õ.SBTTL EXPCHR - EXPAND AN OUTPUT CHARACTERÖ;R×;+CØ; EXPCHR - THIS MODULE CONTAINS THE ROUTINES TO EXPAND CHARACTERS:'Ù; INTO STRINGS ON OUTPUT AS REQUIRED.Ú;2@Û; THESE ROUTINES ARE CALLED BOTH AT SYSTEM STATE (WHEN SETTING<Ü; UP A WRITE REQUEST) AND FROM THE INPUT INTERRUPT SERVICE=Ý; ROUTINE (TO GENERATE AN ECHO). THEREFORE, THE MODULE MUST@Þ; BE REENTRANT.Lß;-à;Eá;0â; EXPAND A CHARACTERã;Oä;+ å; EXPCHR - EXPAND A CHARACTER.æ;. ç; INPUT:è; R2 CHARACTERé; R5 POINTER TO U.TSTA&ê; U.TCHP CURRENT HORIZONTAL POSITION$ë; U.TCVP CURRENT VERTICAL POSITION9ì; S2.FLF 1 IF LINE FEED MUST BE OUTPUT BEFORE NEXT ECHOU/í; S2.ELF 1 IF A LINE-FEED SHOULD BE DISCARDEDAî;T ï; OUTPUT:N+ð; IF THE EXPANSION IS A SINGLE CHARACTER:E ñ; CC-Z 1Uò; R2 UNCHANGEDT!ó; IF THE EXPANSION IS A STRING:E ô; CC-Z 0M!õ; R2 LENGTH OF EXPANDED STRINGE"ö; R3 POINTER TO EXPANDED STRING6÷; IF CHARACTER SHOULD BE KEPT AND PRESENTED AGAIN ON4ø; NEXT CALL TO EXPCHR (ONLY RELEVANT IF CC-Z = 0): ù; CC-C 1H/ú; IF CHARACTER SHOULD NOT BE PRESENTED AGAIN:O û; CC-C 02;ü; IF THE CHARACTER IS A LINE-FEED AND SHOULD BE DISCARDEDE ý; CC-V 1Eþ; R2 UNCHANGEDC ÿ; ALWAYS:<; U.TCHP UPDATED TO POSITION AFTER STRING HAS BEEN OUTPUT<; U.TCVP UPDATED TO POSITION AFTER STRING HAS BEEN OUTPUT/; S2.FLF 1 IF A CARRIAGE RETURN WAS RETURNEDR ; 0 ELSE 7; S2.ELF 0 IF THE V-BIT GETS SET OR IF THE CHARACTERP*; WAS ANY ONE EXCEPT CR ,ESC,BSP OR FF; ; REGISTERS ALTERED: R2,R3;C@ ; THE PROPER WAY TO USE EXPCHR IS TO FIRST SAVE THE CHARACTER,@ ; THEN CALL EXPCHR, THEN OUTPUT THE STRING DESCRIBED BY R2,R3.> ; IF CC-C WAS SET ON RETURN FROM EXPCHR, ON THE NEXT CALL TO@ ; EXPCHR THE SAME CHARACTER MUST BE PRESENTED IN R2, OTHERWISE ; THE NEXT CHARACTER.G;-;U;  .ENABL LSBF;R2EXCR1:: MOVB #CH.CR,R2 ;EXPAND A CARRIAGE RETURN BR EXPCHR ;G;E,EXPC3:: BIT #S2.WAL,2(R5) ;WRITE PASS ALL? BEQ EXPCHR ;N - JUMP  SEZ ;Y - EXIT WITH CC-Z = 1  RETURN ;P;Y8EXPCHR::CLR -(SP) ;INITIALIZE FLAG TO 0 TO EXIT WITH:" ; CC-C = 0 (DON'T KEEP CHAR) ; CC-Z = 1 (OUTPUT CHAR)8 MOVB U.TCHP-U.TSTA(R5),@SP ;GET CURRENT HOR. POSITION  TST (R5)+ ;POINT TO U.TSTA+2,  MOVB @R5,R3 ;GET CONTEXT FOR WRAP-AROUND,! BIC #^C,R3 ;CLEAR IRRELEVANT BITS" ASSUME S2.WRA,6# JMP @OSDSP(R3) ;DISPATCHN$;B%;C0&; DEFAULT CASE - NO SPECIAL THINGS IN PROGRESS';L-(EXPC0:: BIT #S2.FLF,@R5 ;FORCE A LINE FEED?T) BNE 40$ ;Y - JUMPR* CMPB R2,#CH.ESC ;ESCAPE?(+ BEQ EXESC ;Y - JUMP0#, CMPB R2,#CH.CR ;CARRIAGE RETURN?'2- BHI EXDEF ;N - HIGHER, CAN'T BE IN RECOGNITION&. ;TABLE - JUMP TO DEFAULT ROUTINE%/ BEQ EXCRJ ;CARRIAGE RETURN - JUMPS;0 MOV #EXCRT,R3 ;POINT TO START OF CHAR. RECOGNITION TABLEC1 ;FALL THRU TO "CHRDSP"2;3;S#4; DISPATCH ACCORDING TO CHARACTERA5;6;+-7; CHRDSP - DISPATCH ACCORDING TO CHARACTER.R8;S 9; INPUT::; R2 CHARACTER+;; R3 START OF CHARACTER RECOGNITION TABLEM<; =; OUTPUT:E<>; JUMPS TO CHARACTER PROCESSING ROUTINE WITH R2 UNCHANGED.?;-@;NA;$BCHRDSP::TSTB (R3)+ ;END OF TABLE?C BEQ 30$ ;Y - JUMPED CMPB R2,-1(R3) ;MATCH?E BNE CHRDSP ;N - LOOP+F30$: SUB #CHRT+1,R3 ;GET OFFSET FROM CHRTTG ASL R3 ;MAKE WORD INDEX!H JMP @CHRD(R3) ;JUMP TO ROUTINEI.PAGE J;TK;CL; EXPAND ESCAPEAM;N ASSUME U.TCVP, JOEXESC: CLR U.TCHP-(R5) ;CLEAR HORIZONTAL00žº~�~±|t÷tø tþfDATA AND VERTICAL POSITION%P JMP 180$ ;OUTPUT THE ESCAPE AS ISQ;PR; FORCE LINE FEEDAS;R4T40$: CMPB R2,#CH.LF ;IS THE CHARACTER A LINE FEED?U BEQ EXLF ;Y - JUMP$V BR 50$ ;N - NEED CHARACTER AGAINW;$X; DO THE LINE FEED FOR WRAP-AROUNDY; :ZEXPC1:: ADD #S2.WRB,@R5 ;NEXT TIME GO TO EXPC2 TO DO THE[ ;CHARACTER ITSELF \ BR 50$ ;];P^;O2_; EXPAND FORM FEED AND VERTICAL TAB IF NECESSARY`;aEXVT::0bEXFF:: BIT #S4.HFF,4(R5) ;SIMULATE FORM FEEDS?c BNE 110$ ;N - JUMPd;I7e50$: COMB 1(SP) ;WE NEED CHARACTER AGAIN, EXIT WITH:Pf ; CC-C = 1 (KEEP CHAR) g ; CC-Z = 0 (OUTPUT STRING)h; i;Ej; EXPAND LINE FEEDk;U-lEXLF:: BIC #S2.FLF,@R5 ;CLEAR FORCE-LF FLAG)m BIT #S2.ELF,@R5 ;SHOULD WE EAT THE LF?n BEQ 55$ ;BR IF NOR0o BIC #S2.ELF,@R5 ;NEXT SHOULD NOT BE DISCARDEDBp CMP -(R5),(SP)+ ;POINT TO U.TSTA AND POP THE FLAG OFF THE STACKq SEV ;SET STATUS BIT r RETURNs55$:t MOV #ASLF,R3 ;POINT TO LFu BIS #400,@SP ;EXIT WITH: v ; CC-C = ? (NO CHANGE) w ; CC-Z = 0 (OUTPUT STRING);x INCB U.TCVP-(R5) ;UPDATE CURRENT VERTICAL POS.S5y CALL 190$ ;RESET POSITION IF CROSSED A PAGE LIMIT:,z BHIS 60$ ;BRANCH IF CROSSED A PAGE LIMIT{ CMPB R2,#CH.FF ;FORMFEED?| BEQ 90$ ;Y - JUMP } BR 70$ ;N - JUMP-~60$: CMPB R2,#CH.FF ;IS THE CHARACTER A FF?) BEQ 80$ ;Y - JUMP $€70$: CMPB R2,#CH.VT ;IS THIS A VT?� BNE 120$ ;N - JUMP=‚ BITB #7,U.TCVP-(R5) ;ARE WE AT A VERT. TAB STOP?Eƒ BNE 90$ ;N - JUMPC;„80$: BIC #140000,@SP ;Y - DON'T WANT CHAR AGAIN EXIT WITH.… ; CC-C = 0 (DON'T KEEP)R † ; CC-Z = 0 (OUTPUT STRING),‡ ; CC-N = 0 (INSURE CC-V = 0 AFTER ROL)-ˆ90$: BIT #U2.CRT,U.CW2-(R5) ;CRT?P‰ BEQ 120$ ;N - JUMP3Š MOV #4,R2 ;Y - ECHO 4 LF'S IN PLACE OF FF OR VTC-‹ SUB R2,R3 ;POINT TO FIRST OF 4 LINE FEEDS8-Œ BIT #S4.VFL,4(R5) ;VERTICAL FILL REQUIRED?A� BEQ 100$ ;N - JUMP2Ž MOV #<1+NLFF>*4,R2 ;Y - ECHO 4 LF'S PLUS FILLER.� SUB R2,R3 ;POINT TO START OF OUTPUT STRINGB�100$: MOVB U.TCVP-(R5),-(SP) ;UPDATE VERTICAL POSITION6‘ ADD #3,@SP ;(ADD 3 SINCE 1 LF WAS ALREADY COUNTED)B’ MOVB (SP)+,U.TCVP-(R5) ;MUCH PAIN FOR ADD TO ODD ADRS7“ CALL 190$ ;CORRECT POSITION IF CROSSED A PAGE LIMIT,#” BIC #140000,@SP ;DON'T KEEP CHARR7•110$: BR 180$ ;FILL CHARACTERS ALREADY ACCOUNTED FORB.–120$: MOV #1,R2 ;ASSUME NO FILLERS REQUIRED-— BIT #S4.VFL,4(R5) ;VERTICAL FILL REQUIRED?E˜ BEQ 180$ ;N - JUMP2™ ADD #NLFF,R2 ;Y - ADD NUMBER OF FILL CHARACTERS1š BR 180$ ;DON'T CHANGE HOR. POS. OR BYTE COUNTA›;Iœ;�; EXPAND BACKSPACEž;E$ŸEXBSP:: TSTB @SP ;AT LEFT MARGIN?/  BEQ 180$ ;Y - EXIT (DON'T CHANGE HOR. POS.)D¡ DECB @SP ;N - BACKSPACET¢ BR 170$ ;EXITD£;G¤EXCRJ: BR EXCR ;BRANCH AIDO¥;E¦;AF§; CR AND LF FOR WRAP-AROUND HAVE BEEN DONE. DO THE CHARACTER ITSELF.=¨; NOTE - THE CHARACTER MUST BE EITHER A HORIZONTAL TAB OR AT;©; "NORMAL" CHARACTER, SINCE ONLY THOSE CAUSE WRAP-AROUND. ª;A4«EXPC2:: BIC #S2.WRA,@R5 ;CLEAR WRAP-AROUND CONTEXT"¬ CMPB R2,#CH.HT ;HORIZONTAL TAB?­ BNE EXDEF ;N - JUMP®;¯;S°; EXPAND HORIZONTAL TABI±;*²EXHT:: MOV @SP,R3 ;GET CURRENT HOR.POS.(³ BIC #S2.ELF,@R5 ;CLEAR DISCARD LF BIT/´ BIS #7,@SP ;POINT JUST BEFORE NEXT TAB STOP0µ BIT #S4.HHT,4(R5) ;HARDWARE HOR. TAB PRESENT?¶ BNE 130$ ;Y - JUMP$· MOV R3,R2 ;GET CURRENT HOR. POS..¸ SUB @SP,R2 ;GET NUMBER OF SPACES NECESSARY¹ ;NEGATED AND OFF BY 1Cº NEG R2 ;MAKE POSITIVE» INC R2 ;ADJUST¼ MOV #ASHT,R3 ;POINT TO HTAB/½ BIS #400,@SP ;OUTPUT IS A STRING, EXIT WITH: !¾ ; CC-C 0 (DON'T KEEP CHAR.)H¿ ; CC-Z 0 (OUTPUT STRING)"À BR 130$ ;CHECK FOR WRAP-AROUNDÁ;#Â;FÃ; EXPAND NORMAL CHARACTERÄ;# ÅEXDEF::N(Æ BIC #S2.ELF,@R5 ;CLEAR DISCARD LF BIT'Ç BIT #140,R2 ;NON-SPACING CHARACTER?BÈ BEQ 180$ ;Y - EXIT@É BIT #U3.UPC,U.CW3-(R5) ;TERMINAL SUPPORT LOWERCASE?Ê BEQ 130$ ;Y - JUMP6Ë ;NOTE THAT LOWER TO UPPER CASE CONVE00žÂ~‡|Ž{´cÚµcÛ¶c�·c›’RSION IS NOT6Ì ;PERFORMED HERE FOR THE GR CHARACTER SET SINCE A6Í ;TERMINAL CAPABLE OF DISPLAYING 8-BIT CHARACTERS*Î ;WILL NEVER GET PAST THE CHECK ABOVE,Ï CMPB R2,#141 ;CHARACTER NEED CONVERTING?Ð BLO 130$ ;N - JUMPÑ CMPB R2,#172 ;SECOND CHECKÒ BHI 130$ ;N - JUMP/Ó BICB #40,R2 ;CONVERT LOWERCASE TO UPPERCASEC7Ô130$: CMPB @SP,U.CW4-(R5) ;AT RIGHT MARGIN?<Õ BLO 160$ ;N - JUMP(Ö BIT #S3.ACR,2(R5) ;AUTO CR-LF WANTED?× BEQ 160$ ;N - JUMP0Ø COMB 1(SP) ;NEED CHARACTER AGAIN, EXIT WITH:Ù ; CC-C = 1 (KEEP CHAR) Ú ; CC-Z = 0 (OUTPUT STRING)<Û ADD #S2.WRB,@R5 ;SET STATE VARIABLE TO COME BACK AT EXPC1Ü ;TO DO THE LINE FEED!Ý ;FIRST DO A CARRIAGE RETURNBÞ;0ß; à; EXPAND A CARRIAGE RETURNá;E!âEXCR:: BIS #400,@SP ;EXIT WITH: ã ; CC-C = ? (NO CHANGE) ä ; CC-Z = 0 (OUTPUT STRING)å ASSUME S4.HFL,7+æ MOVB 4(R5),R2 ;GET HOR. FILL REQUIREMENTT(ç BIC #^C,R2 ;CLEAR OTHER BITSè CMP R2,#7 ;FILL FOR LA30S?é BNE 150$ ;N - JUMP)ê MOVB @SP,R2 ;Y - GET CURRENT HOR.POS.ëì .IF DF R$$EISíî ASH #-3,R2 ;DIVIDE BY 8 ïð .IFFEñò ASR R2 ;DIVIDE BY 8 ó ASR R2L ô ASR R2õö .ENDC÷#ø CMP R2,#9. ;WITHIN TABLE RANGE?Dù BLOS 140$ ;Y - JUMP(ú MOV #9.,R2 ;N - SET TO HIGHEST VALUE4û140$: MOVB HORFT(R2),R2 ;GET FILL COUNT FROM TABLE!ü150$: MOV #ASCR,R3 ;POINT TO CR5.ý MOVB #-1,@SP ;INITIALIZE CURRENT HOR. POS.$þ ;BOTH BYTE COUNT AND HOR. POS."ÿ ;WILL BE INCREMENTED ON EXIT1 BIS #S2.FLF,@R5 ;FORCE A LINEFEED ON NEXT ECHO INC R2 ;INCR. BYTE COUNT;#; #160$: INCB @SP ;UPDATE HOR. POS.A?170$: MOVB @SP,U.TCHP-(R5) ;STORE UPDATED HOR. POS.#180$: TST -(R5) ;POINT TO U.TSTA CLRB @SP ;CLEAR LOW BYTE+ ROL (SP)+ ;GET FLAGS TO GENERATE PROPERO  ;CONDITION CODES  RETURN ;B ;8 190$: CMPB U.TCVP-(R5),U.TLPP-(R5)  ;CROSSED A PAGE LIMIT? BLO 200$ ;N - RETURN- CLRB U.TCVP-(R5) ;Y - RESET TO 0S) BIT #U2.CRT,U.CW2-(R5) ;CRT? BEQ 200$ ;N - RETURN3 MOVB U.TLPP-(R5),U.TCVP-(R5)A! ;Y - CRT'S SCROLL, NOT ROLL>: DECB U.TCVP-(R5) ;CURSOR STAYS ON BOTTOM LINE200$: RETURN;  .DSABL LSBE;R;P .IF DF T$$CUP.PAGE?.SBTTL CPOS - SUBROUTINE TO EXPAND CURSOR POSITIONING COMMAND-;T ;+B!; CPOS - EXPAND CURSOR COORDINATES TO CURSOR POSITIONING COMMAND#"; SUITABLE FOR THE TERMINAL TYPE.2#; $; INPUT:.%; R2 LOW BYTE: COLUMN NUMBER (STARTING AT 1)+&; HIGH BYTE: LINE NUMBER (STARTING AT 1).'; R5 POINTER TO U.TSTA(;5 ); OUTPUT:-+*; R2 LENGTH OF CURSOR POSITIONING COMMANDS,+; R3 POINTER TO CURSOR POSITIONING COMMAND ,; CC-C 0 -; CC-Z 0.;E/; REGISTERS ALTERED: R2,R30;-1;2;3CPOS::4; 25; USE U.TTYP TO DETERMINE HOW TO EXPAND COMMAND.6;/7 MOVB U.TTYP-U.TSTA(R5),R3 ;GET TERMINAL TYPES$8 BEQ CPOS0 ;NOT RECOGNIZED - JUMP9 CMP R3,#TTPHI ;RECOGNIZED?: BHI CPOS0 ;N - JUMP:<; MOVB TTYP1-1(R3),R3 ;Y - GET CURSOR POS. TYPE IN BITS 6-7<= .IF DF R$$EIS>"? ASH #-5,R3 ;GET IT IN BITS 1-2@A .IFF B C ASL R3 ;SHIFT INTO BITS 9-10 D ASL R3 ; E ASL R3 ;F SWAB R3 ;GET IT IN BITS 1-20GH .ENDCI%J BIC #^C6,R3 ;CLEAR ALL OTHER BITS7K BEQ CPOS0 ;NO CURSOR POSITIONING IMPLEMENTED - JUMPO*L MOV R2,-(SP) ;SAVE ORIGINAL COORDINATES)M BIC #100000,R2 ;CLEAR SCREEN CLEAR BITG4N MOV R2,U.TCHP-U.TSTA(R5) ;SET NEW CURSOR POSITION(O JMP @CPOST-2(R3) ;JUMP VIA JUMP TABLEP Q .ENABL LSB RS;I/T; TYPE 0 - CURSOR POSITIONING NOT IMPLEMENTED;U;T+VCPOS0: CLR R2 ;EXPAND INTO A SINGLE NULLH+W RETURN ;RETURN WITH CC-C = 0, CC-Z = 1;X;SY; TYPE 1 - VT05BZ;-5[CPOS1:: ADD #401*40,R2 ;BIAS BOTH COORDINATES BY 40B!\ MOVB R2,CP1+20 ;STORE X COORD.T(] SWAB R2 ;GET Y COORD. AND CLEAR CC-C!^ MOVB R2,CP1+13 ;STORE Y COORD.C _ MOV #7,R2 ;STRING LENGTH = 7$` MOV #CP1+12,R3 ;POINTER TO STRING00žÊ~�~±|t÷tø tþfDATA&a TST (SP)+ ;CLEAR SCREEN REQUESTED?b CLZ ;(LEAVE CC-Z CLEAR)c BPL 10$ ;N - RETURN 5d SUB #12,R3 ;POINT TO CLEAR SCREEN ESCAPE SEQUENCEP2e ADD #12,R2 ;ADD THAT TO CURSOR POSITION OUTPUTf10$: RETURN ;RETURNCg; h; TYPE 2 - VT52 AND VT50Hi;=jCPOS2:: SWAB R2 ;GET COLUMN IN HIGH BYTE, LINE IN LOW BYTE .k ADD #401*40,R2 ;BIAS BOTH COORDINATES BY 40-l MOV #CP2+6,R3 ;POINT TO COMMAND STRING + 2Y!m MOV R2,@R3 ;STORE COORDINATESG6n TST -(R3) ;POINT TO START OF STRING AND CLEAR CC-Co MOV #4,R2 ;LENGTH = 4?&p TST (SP)+ ;CLEAR SCREEN REQUESTED?q CLZ ;(LEAVE CC-Z CLEAR)r BPL 10$ ;N - RETURN 8s SUB #4,R3 ;Y - POINT TO CLEAR SCREEN ESCAPE SEQUENCEt BR 20$ ;FINISH IT OFF u;Rv; TYPE 3 - VT100w;5#xCPOS3:: MOV R0,-(SP) ;SAVE R0, R1 y MOV R1,-(SP) ;H)z MOV #CP3A,R3 ;POINT AT FINAL CHARACTER &{ CALL 30$ ;EXPAND X-COORD. TO ASCII#| MOVB #';,-(R3) ;INSERT DELIMITER} SWAB R2 ;GET Y-COORD.I~ CALL 30$ ;EXPAND ITI MOV (SP)+,R1 ;RESTORE R0, R1C€ MOV (SP)+,R0 ;L5� MOVB #'[,-(R3) ;INSERT CONTROL SEQUENCE INTRODUCERC&‚ MOVB #CH.ESC,-(R3) ; .. (BACKWARDS)ƒ MOV #CP3A+1,R2 ;,8„ SUB R3,R2 ;GET STRING LENGTH AND CLEAR CC-C AND CC-Z*… TST (SP)+ ;WAS CLEAR SCREEN REQUESTED?† CLZ ;(LEAVE CC-Z CLEAR)‡ BPL 10$ ;N - RETURN(ˆ MOVB #'J,-(R3) ;INSERT...5‰ MOVB #'2,-(R3) ;...CLEAR SCREEN ESCAPE SEQUENCE...A+Š MOVB #'[,-(R3) ;...INTO OUTPUT STRING...#‹ MOVB #CH.ESC,-(R3) ;...BACKWARDS 5Œ20$: ADD #4,R2 ;ADD THAT TO CURSOR POSITION OUTPUT(� RETURN ;RETURN'Ž30$: CLR R1 ;!� BISB R2,R1 ;GET NUMERIC VALUE � INC R1 ;ADJUST TO BASE 1‘’ .IF DF R$$EIS“)”40$: CLR R0 ;CLEAR HIGH ORDER DIVIDEND-• DIV #10.,R0 ;DIVIDE BY 10C–— .IFF ;R$$EIS?˜™40$: MOV R1,R0 ;GET DIVIDENDLš MOV #10.,R1 ;GET DIVISOR› CALL $DIV ;DIVIDE BY 10'œ� .ENDC ;R$$EISž+Ÿ BIS #'0,R1 ;BIAS REMAINDER BY ASCII /0/O!  MOVB R1,-(R3) ;STORE IN STRING,¡ MOV R0,R1 ;GET QUOTIENTA#¢ BNE 40$ ;NON-ZERO - DO IT AGAINN£ RETURN ;RETURN ¤¥ .ENDC ;T$$CUP¦ § .DSABL LSB ¨.PAGEE.©.SBTTL UBTRA - BUFFERED ACD TRANSFER ROUTINEª;D«;+B¬; UBTRA - TRANSFER BUFFERS FROM THE ACD TO A TASK AT $FINBF TIME­;D ®; INPUT:7¯; R0 ADDRESS OF BUFFER CONTAINING TRANSFER PARAMETERS°;V ±; OUTPUT:TE²; THE CHARACTERS DESCRIBED BY THE BUFFER PARAMETERS ARE TRANSFERREDS=³; FROM THE ACD TO THE TASK. THE ACD IS THEN CALLED BACK TO C´; DEALLOCATE ITS BUFFER AND POSSIBLY TO REQUEST ANOTHER TRANSFER.Iµ;I¶; REGISTERS ALTERED: ALL·;-¸;;¹;Pº» .IF DF T$$ACD¼*½UBTRA:: ADD #3,R0 ;POINT PAST LINK WORD ¾ MOV (R0)+,R5 ;GET UCB ADDRESS'¿ MOV (R0)+,R3 ;GET I/O PACKET ADDRESST3À MOV I.PRM+2(R3),R4 ;GET TASK BUFFER DISPLACEMENTFÁ10$: MOV R3,-(SP) ;SAVE R31 MOV (R0)+,R1 ;GET ACD BUFFER APR BIAS (A.SMAP)B5à MOV (R0)+,R2 ;GET ACD BUFFER DISPLACEMENT (A.SBUF)T,Ä SUB #20000,R2 ;CONVERT TO AN APR5 MAPPING%Å MOV (R0)+,R3 ;GET TASK PCB ADDRESSO&Æ MOV P.REL(R3),R3 ;GET TASK APR BIAS-Ç ADD (R0)+,R3 ;COMPUTE TASK BUFFER APR BIASP1È20$: MOV (R0),R0 ;GET TRANSFER LENGTH (A.SLEN)O%É CALL $BLXIO ;PERFORM THE TRANSFERT5Ê MOV R3,R1 ;SAVE R3 IN CASE ACD CONTINUES TRANSFER+Ë MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSC0Ì CLR U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING4Í MOV #A.CALL,R0 ;SET TRANSFER CALLBACK ENTRY POINTÎ CALL $SWACD ;CALL ACDE-Ï BIT #UA.CAL,U.AFLG-U.TSTA(R5) ;MORE TO GO?PÐ BEQ 30$ ;N - JUMP+,Ñ MOV R3,-(SP) ;Y - SAVE I/O PACKET ADDRESS+Ò MOV R1,R3 ;RESTORE TASK BUFFER APR BIASE#Ó MOV U.ACB-U.TSTA(R5),R0 ;GET ACB01Ô ADD #A.SMAP,R0 ;POINT TO ACD BUFFER PARAMETERSO(Õ MOV (R0)+,R1 ;GET ACD BUFFER APR BIAS,Ö MOV (R0)+,R2 ;GET ACD BUFFER DISPLACEMENT,× SUB #20000,R2 ;CONVERT TO AN APR5 MAPPINGØ BR 20$ ;DO THE TRANSFERL Ù30$: RETURNÚÛ .ENDC ;T$$ACDÜÝÞ .ENDENTRY POINTÎ CALL $SWACD ;CALL ACDE-Ï BIT #UA.CAL,U.AFLG-U.TSTA(R5) ;MORE TO GO?PÐ BEQ 30$ ;N - JUMP+,Ñ MOV R3,-(SP) ;Y - SAVE I/O PACKET ADDRESS+Ò MOV R1,00ŸÒ~ Ó~Ž{´cÚµcÛ¶c�·c›’6; XEPRE.MAC PREFIX FILE FOR ASSEMBLING THE XE DRIVER&U$$NTS=3 ;NUMBER OF XMT RINGS ENTRIES*U$$NRS=8. ;NUMBER OF TRANMIT RING ENTRIES$U$$NCT=1 ;NUMBER OF UNA CONTROLLERS*U$$NPC=8. ;NUMBER OF PORTS PER CONTROLLER'L'c.=0$;:!; Multicast address chain entries$;: M$LNK:'L' .BLKW 1 ; Link pointer%M$ADD:'L' .BLKW 3 ; Multicast addressi M$LEN:'L' .PSECT .IF NB LST  .NLISTl .IFFr .MACRO EPMDF$,X,Y,Z .ENDM EPMDF$p .ENDC .ENDM EPMDF$ ; Default user defined)LF$PAD='B' 4 ;  .TITLE TTYHV2 .IDENT /06.08/N;E7; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION; ALL RIGHTS RESERVED.; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;E ;  ; 28-AUG-82 DALE R. DONCHINM ; ; MODIFICATIONS:;Z!; D. R. DONCHIN 05-JUN-83 05.01I4; DD173 -- FIX MINOR PROBLEMS WITH DHU/DHV11 CODE;;!; D. R. DONCHIN 14-SEP-83 05.02 "; DD179 -- ADD HOSTSYNC SUPPORT;!; D. R. DONCHIN 16-OCT-83 05.03NB; DD183 -- FIX SETTING OF SPEED WHEN NOABAUD AND PARITY ARE SET; ; S.C. ADAMS 23-APR-84 05.04D; SA170 -- CHANGE S4.XOF,XON,HPC,HPO TO S5.(ETC) AND S1.OBF TO S2=; AND CHANGE S3.ABP AND S3.ABD. AND CHANGE .OBF AND .CTS;8!; D. R. DONCHIN 15-JUN-84 05.05 ; DD186 -- ADD DHU11 SUPPORTO; !; D. R. DONCHIN 15-JUN-84 05.06 B ; DD187 -- IMPROVE MODEM HANDLING TO MEET EUROPEAN REQUIREMENTS!;0!"; D. R. DONCHIN 15-JUN-84 05.07O-#; DD193 -- FIX SOME MODEM CONTROL PROBLEMS$;1!%; D. R. DONCHIN 15-JUN-84 05.08B0&; DD195 -- FIX BUFFER LOSS AND ABORT PROBLEMS';0!(; D. R. DONCHIN 18-SEP-84 05.09O.); DD203 -- FIX DHV11 SUPPORT ON I/D SYSTEMS*;N"+; T. Lekas 2-Nov-84 05.10, 05.11<,; TL334 -- Port is notified of flow control status change-;-!.; D. R. DONCHIN 17-OCT-84 05.12R/;C=0; DD205 -- FIX TIMING PROBLEM WHEN ABORTING DHU/DHV OUTPUTE1;R2; L. KOGAN 4-FEB-85 05.13 ;3; LK605 -- FIX SETTING TC.PAR AND TC.EPA CHARACTERISTICSC4;L5; L. KOGAN 29-APR-85 05.14+6; LK607 -- FIX CONDITIONAL CODE (D$$VMD)F7;S8; L. KOGAN 5-JUN-85 05.15$9; LK608 -- FIX THE SELLIN PROBLEM:;3;; L. KOGAN 27-AUG-85 05.16B<; LK609 -- SETUP THE RIGHT LINE BEFORE CHANGING LINE PARAMETERS<;o<;d'<; MODIFIED FOR RSX-11M-PLUS V4.0 BY: <; <; L. KOGAN 18-JUN-86 6.01C4<; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORT<;T<; L. KOGAN 08-SEP-86 6.02B5<; LK715 -- ADD SUPPORT FOR Q-BUS DMA TRANSFER FROM <; A TASK BUFFER<; <; L. KOGAN 01-DEC-86 6.03 ?<; LK717 -- FIX DISABLED TERMINAL PROBLEM AFTER HIGH PRIORITYN2<; OUTPUT IS ABORTED INSTEAD OF REGULAR OUTPUT<;<; L. KOGAN 29-DEC-86 6.049<; LK718 -- FIX SINGLE CHARACTER TRANSFER TO DHU11 LINEE<;<;<; L. KOGAN 20-FEB-87 6.05M<<; LK720 -- SUPPORT DIRECT TRANSFER FOR "PURE" IO.WAL ONLY<; <; D. DONCHIN 24-FEB-87 6.06SA<; DD721 -- BETTER HANDLE MIXED XOFF/XON AND QIO OUTPUT STREAMSR<; <; L. KOGAN 26-JUN-87 6.07 9<; LK726 -- SUPPORT Q-BUS DMA TRANSFER FOR REMOTE LINESL<;-<; L. KOGAN 02-JUL-87 6.08E<<; LK728 -- CHANGE DMA IO.WAL PACKET FORMAT (NO FLAG WORD)<; =;+0>; CONTROLLER-DEPENDENT ROUTINES FOR DHU/DHV11.?;-@;EA;ABC .IF DF D$$V11DE .MCALL UCBDF$FG UCBDF$ ;DEFINE UCB SYMBOLS0HI .IF DF R$$MPLJK .MCALL KRBDF$LM KRBDF$ ;DEFINE KRB SYMBOLS7NO .IFF ;R$$MPL PQ .MCALL SCBDF$RS SCBDF$ ;DEFINE SCB SYMBOLSTU .ENDC ;R$$MPLVW .PSECT MAP5X;PY;-Z; EQUATED SYMBOLSR[; "\; DHU/DHV11 REGISTER DEFINITIONS];E#^CSR = 0 ;CONTROL STATUS REGISTERK%_RBUF = 2 ;RECEIVER BUFFER REGISTER*`TXCHAR = 2 ;TRANSMIT CHARACTER REGISTER#aLPR = 4 ;LINE PARAMETER REGISTER$!bSTAT = 6 ;LINE STATUS REGISTERU0bFIFODT = 6 ;DHU FIFO DATA REGISTER ; LK7180bFIFOSZ = 6 ;DHU FIFO SIZE REGISTER ; LK718%cLNCTRL = 10 ;LINE CONTROL REGISTER2dBFADR1 = 12 ;TRANSMIT BUFFER ADDRESS 1 REGISTER2eBFADR2 =00 Ú~�~±|t÷tø tþfDATA 14 ;TRANSMIT BUFFER ADDRESS 2 REGISTER3fBFCNT = 16 ;TRANSMIT DMA BUFFER COUNTER REGISTERRg;Ng ; LK718 Dg; DEFINITION FOR THE CONTROLLER ID BIT IN STAT REGISTER ; LK718g; ; LK7182gDHUID = 400 ; DHUID=0 INDICATES DHV11 ; LK718)g ; DHUID=1 INDICATES DHU11 ; LK718h;Oi;+j; YVSTAX - START OUTPUT.7k; NOTE - NON-BUFFERED OUTPUT CURRENTLY NOT SUPPORTED.8l;N m; INPUT:>n; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.o; U.TOP+2 BUFFER POINTERRp; U.TOC BYTE COUNT q;T r; OUTPUT: s; OUTPUT STARTED.Ft; U.TOP+2 UNCHANGEDu; U.TOC UNCHANGEDv;w; REGISTERS ALTERED: R4Lx;-y;Iz;Tz; ; LK720Wz; BUFFERED OUTPUT FOR ALL QIO, EXCEPT IO.WAL IS ALWAYS DONE FROM THE TERMINAL ; LK720 Nz; DRIVER BUFFERS. IN CASE OF IO.WAL FOR Q-BUS SYSTEMS OUTPUT MAY BE ; LK720Mz; DONE FROM THE TASK BUFFER WITHOUT INTERMEDIATE TRANSFER INTO THE ; LK7202.z; CHAIN OF USUAL TTDRV BUFFERS ; LK720Rz; ONLY ONE INTERNAL TTDRV BUFFER IS USED FOR THIS TRANSFER. THIS BUFFER ; LK720Rz; DOES NOT CONTAIN DATA. IT CONTAINS INFORMATION FOR DIRECT OUTPUT FROM ; LK720%z; THE TASK BUFFERS. ; LK720;z; ; LK720z; OFFSETS ; LK720Wz; ; LK720*z; 0 - LINK WORD (CONTAINS 0) ; LK720z; 2 - LENGTH ; LK7202z; 4 - NUMBER OF BYTES FOR DMA TRANSFER ; LK7202z; 6 - HIGH BYTE OF TASK BUFFER ADDRESS ; LK7203z; 10 - LOW BYTES OF TASK BUFFER ADDRESS ; LK720z; ; LK7208z; THE REST OF THE OUTPUT BUFFER IS NOT USED ; LK720z; ; LK720Xz; IN A REGULAR QIO WE HAVE AS MANY PHYSICAL DATA TRANSFERS AS WE HAVE INTERNAL ; LK720Vz; OUTPUT BUFFERS CHAINED FOR TASK OUTPUT. FOR 'PURE' IO.WAL WE HAVE ONLY ONE ; LK720)z; PHYSICAL DATA TRANSFER ; LK7200z; ; LK720 { .ENABL LSB |;BJ}YVSTAX::BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;HIGH PRIORITY OUTPUT REQUESTED?>} BEQ 7$ ;;;N -POSSIBLY BEGIN NORMAL PRIORITY OUTPUT ; LK718H} BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT ALREADY IN PROGRESS? ; LK718@} BEQ 8$ ;;;Y - DO HIGH PRIOR.OUTPUT AT NEXT INTERRUPT ; LK718M} BIS #S5.HPO,U.TST5-U.TSTA(R5);;;SHOW BUSY DOING HIGH PRIOR. OUTPUT ; LK718A} ; LK718 3}STAXH: CALL SELLIN ;;;SELECT THE LINE ; LK718C,} MOV R3,R4 ;;;COPY CSR ADDRESS ; LK7182} BIT #DHUID,STAT(R3) ;;;CHECK FOR DHU ; LK718(} BEQ 2$ ;;;NO. THIS IS DHV ; LK718=} TSTB FIFOSZ(R3) ;;;IF DHU CHECK IF FIFO HAS SPACE ; LK718U'} BEQ 8$ ;;;NO SPACE. EXIT ; LK718A/} ADD #FIFODT,R4 ;;;POINT TO FIFODT ; LK718B} ; LK718 <}2$: BIT #S5.XOF,U.TST5-U.TSTA(R5);;;OUTPUT XOF? ; LK718} BEQ 3$ ;;;NO ; LK718G=} BIC #S5.XOF,U.TST5-U.TSTA(R5);;;RESET INDICATION ; LK718E+} MOV YVXOFF,-(SP) ;;;SET XOFF ; LK718R} BR 4$ ;;;GO ON ; LK718} ; LK718T:}3$: BIC #S5.XON,U.TST5-U.TSTA(R5);;;RESET XON ; LK718)} MOV YVXON,-(SP) ;;;SET XON ; LK718D} ; LK718S-}4$: CMP R3,R4 ;;;IF EQUAL - DHV ; LK718 (} BNE 5$ ;;;NO. THIS IS DHU ; LK718;} MOV (SP)+,TXCHAR(R3);;;OUTPUT XON/XOFF FOR DHV ; LK718S!} BR 6$ ;;;ALL DONE ; LK7187} ; LK718 :}5$: MOVB (SP)+,(R4) ;;;OUTPUT XON/XOFF FOR DHU ; LK718'} TSTB (SP)+ ;;;ADJUST SP ; LK718S} ; LK718.}6$: JMP 60$ ;;;INITIALIZE OUTPUT ; LK718} ; LK718OC}7$: BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;HIGH PRIOR. OUTPUT ; LK718 "} ;;;IN PROGRESS? ; LK718=} BEQ STAXN ;;;Y - DO NORMAL PRIOR. OUTPUT ON NEXT ; LK718;} ;;;INTERRUPT ; LK718#}8$: JMP 70$ ;;;EXIT ; LK718F} ; LK718)}STAXN: ;;;REFERENCE LABEL ; LK718 � ;**-17� .IF DF T$$ACD‘.’ BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT?“ BNE 10$ ;;;Y - JUMP"” ADD #U.TOC,R4 ;;;POINT TO U.TOC(•STAXM: CALL SELLIN ;;;SELECT THE LINE-– CALL MOUT ;;;GET NEXT CHARACTER TO OUTPUT5;— MOVB R2,U.ADMA-U.TSTA(R5) ;;;PUT CHARACTER IN DMA BUFFER ?˜ BIS #100000,U.ADMA-U.TSTA(R5) ;;;SET TRANSMIT DATA VA00 â~Ó~Ž{´cÚµcÛ¶c�·c›’LID BIT -˜ JMP 50$ ;;;INITIATE THE OUTPUT ; LK718M˜ ; LK718 › .ENDC ;T$$ACD ;**-2œ*�10$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2(žSTAX1: CALL SELLIN ;;;SELECT THE LINEGŸ BICB #200,BFADR2+1(R3) ;;;DISABLE THE XMITTER IN CASE WE'RE X-OFF'EDDŸ ; LK728OŸ .IF DF T$$DMA ; LK728Ÿ ; LK728CGŸ BIT #S5.DWA,U.TST5-U.TSTA(R5);;;CHECK FOR IO.WAL IN PROGRESS ; LK728;Ÿ BNE 48$ ;;;NO ; LK728Ÿ ; LK728-Ÿ .ENDC ;T$$DMA ; LK728AŸ ; LK728 >  MOV (R4),BFADR1(R3) ;;;SET VIRTUAL BUFFER ADDRESS (U.TOP+2)¡ CLRB BFADR2(R3) ;;;=¢ CMP (R4)+,#120000 ;;;SET CC-C IF BUFFER IS IN PRIMARY POOL £;NR¤; FOR 22-BIT SYSTEMS, CHECK FOR THE PRESENCE OF UMRS. THE CHECKING IS DIFFERENT!¥; FOR RSX-11M AND RSX-11M-PLUS.¦;D§¨ .IF DF M$$EXT©ª .IF DF R$$MPL«4¬ BIT #HF.UBM,$HFMSK ;;;UMRS EXIST? SET CC-Z IF NO­® .IFF ;R$$MPLB¯4° BIT #177777,$UMRPT ;;;UMRS EXIST? SET CC-Z IF NO±² .ENDC ;R$$MPL³´ .ENDC ;M$$EXTµ¶;VR·; IN I/D SYSTEMS, BUFFERS CAN BE IN EITHER TTCOM OR PRIMARY POOL, EACH REQUIRINGP¸; DIFFERENT RELOCATION CONSTANTS IF THERE ARE NO UMRS. FOR NON-I/D SYSTEMS WEO¹; ONLY NEED TO COMPUTE A PHYSICAL ADDRESS FOR BUFFERS IN THE DRIVER'S PRIVATE-"º; POOL FOR SYSTEMS WITHOUT UMRS.»;D¼½ .IF DF K$$DAS¾"¿ BNE 30$ ;;;UMRS PRESENT - JUMP,À BLO 20$ ;;;BUFFER IN PRIMARY POOL - JUMPGÁ ADD RELCV+2,BFADR1(R3) ;;;ADD RELOCATION CONSTANT TO VIRTUAL ADDRESSCH MOVB RELCV,BFADR2(R3) ;;;(NOTE: RELCV MUST NOT HAVE BITS 6 AND 7 SET)à ADCB BFADR2(R3) ;;;Ä BR 40$ ;;;JOIN COMMON CODE=Å20$: ADD RELCV+6,BFADR1(R3) ;;;ADD POOL RELOCATION CONSTANT/DÆ MOVB RELCV+4,BFADR2(R3) ;;;(RELCV MUST NOT HAVE BITS 6 AND 7 SET)Ç ADCB BFADR2(R3) ;;;È BR 40$ ;;;JOIN COMMON CODE0É30$: BLO 40$ ;;;BUFFER IN PRIMARY POOL - JUMPÊË .IF DF T$$SPLÌEÍ SUB #20000,BFADR1(R3) ;;;FORCE BUFFER ADDRESS TO MAP THROUGH UMR 5;ÎÏ .ENDC ;T$$SPLÐÑ .IFF ;K$$DASCÒÓ .IF DF M$$EXTÔ"Õ BNE 40$ ;;;UMRS PRESENT - JUMPÖ× .ENDC ;M$$EXTØ,Ù BLO 40$ ;;;BUFFER IN PRIMARY POOL - JUMPGÚ ADD RELCV+2,BFADR1(R3) ;;;ADD RELOCATION CONSTANT TO VIRTUAL ADDRESSCHÛ MOVB RELCV,BFADR2(R3) ;;;(NOTE: RELCV MUST NOT HAVE BITS 6 AND 7 SET)Ü ADCB BFADR2(R3) ;;;ÝÞ .ENDC ;K$$DASß*à40$: MOV @R4,BFCNT(R3) ;;;SET BYTE COUNT4à BR 49$ ;;;DMA TRANSFER FROM INT. BUFFER ; LK720à ; LK720Aà .IF DF T$$DMA ; LK720à ; LK720K*à48$: MOV R0,-(SP) ;;;SAVE R0 ; LK7200à MOV R4,R0 ;;;NOW R0 POINTS U.TOP+2 ; LK7207à ADD #U.TFOB-U.TOP-2,R0;;;SET R0 TO U.TFOB ; LK720L à MOV (R0),R0 ;;; ; LK720Aà CMP (R0)+,(R0)+ ;;;SET R0 AT THE BEGINNING OF BUFFER ; LK720L:à MOV (R0)+,BFCNT(R3) ;;;SET BYTE COUNT FOR DMA ; LK720;à MOV (R0)+,BFADR2(R3);;;SET 6 HIGH BITS OF ADDR ; LK720E:à MOV (R0),BFADR1(R3);;;SET LOW 16 BITS OF ADDR ; LK720)à MOV (SP)+,R0 ;;;RESTORE R0 ; LK720 à ; LK720 à .ENDC ;T$$DMA ; LK720;à ; LK720à49$: ; LK720O9à BISB #200,BFADR2(R3) ;;;ENABLE DMA TRANSFER ; LK720T%à ASSUME S2.CTS,100000 ; LK720;6ã50$: TST 2(R5) ;;;OUTPUT STOPPED BY CTRL-S? ;**-2'ä BMI 70$ ;;;YES- DON'T RESUME OUTPUTBå;Ræ;;ç;+è; YVRESX - RESUME OUTPUT.é;( ê; INPUT:>ë; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ì; S2.CTS 0Ií;-î; ï;7)ðYVRESX::CALL SELLIN ;;;SELECT THE LINE2ñò .IF DF T$$ACDó-ô BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT õ BNE 60$ ;;;Y - JUMP 2õ BIT #DHUID,STAT(R3) ;;;CHECK FOR DHU ; LK718,õ BEQ 55$ ;;;LINE IS DHV -> 55$ ; LK718=õ TSTB FIFOSZ(R3) ;;;IF DHU CHECK IF FIFO HAS SPACE ; LK71820õ BEQ 70$ ;;;NO SPACE. TRY NEXT TIME ; LK718Iõ MOVB U.ADMA-U.TSTA(R5),FIFODT(R3) ;;;INITIATE SINGLE CHAR XFER ; LK7182>õ BR 60$ ;;;INITIATE OUTPUT REGARDLESS OF XOFF STATE ; LK718Kõ55$: MOV U.ADMA-U.TSTA(R5),TXCHAR(R3);;;INITIATE SINGLE CHAR XFER ; LK718$õ ; LK718Oõ 00 ê~�~±|t÷tø tþfDATA ; LK718F÷ ;**-1Eø .ENDC ;T$$ACDù7ú60$: MOVB #200,BFADR2+1(R3) ;;;ENABLE THE TRANSMITTER5ûü .IF NDF D$$VMD5ý þYVMTIM::ÿ .ENDC ;D$$VMD 70$: RETURNH;A  .DSABL LSB;7;;;+; YVABOX - ABORT OUTPUT. ;M ; INPUT:> ; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ;  ;-;E;U YVABOX:: .IF DF T$$ACD. BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BEQ 10$ ;;;N - RETURN .ENDC ;T$$ACD ; LK717L BIT #S5.HPO,U.TST5-U.TSTA(R5);;;HIGH PRIORITY OUTPUT IN PROGRESS? ; LK7172 BNE 10$ ;;;YES - DO NOT ABORT OUTPUT ; LK717 ; LK717C7 BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT IN PROGRESS? BNE 10$ ;;;N - JUMPA" CALL SELLIN ;;;SELECT THE LINE6 BIS #1,LNCTRL(R3) ;;;ABORT THE CURRENT DMA TRANSFER? CMP (SP)+,#LOCKR ;;;REMOVE RETURN ADDRESS - WAS IT TO LOCKR? BNE 10$ ;;;N - JUMPO MTPS #0 ;;;ALLOW INTERRUPTS 4 TST (SP)+ ;REMOVE RETURN ADDRESS TO FORK ROUTINE6 10$: RETURN ;RETURN WITHOUT SIGNALLING OUTPUT DONE!; ";O#;+$; YVSTOX - STOP OUTPUT.S%; &; INPUT:>'; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. (; S2.CTS 1T);-*;S+;),YVSTOX::CALL SELLIN ;;;SELECT THE LINES=- BICB #200,BFADR2+1(R3) ;;;CLEAR THE TRANSMITTER ENABLE BITR. RETURN ;;;P/;O0;;12 .IF DF T$$GMC!T$$SMC!D$$VMD34;+%5; YVLPAR - GET/SET LINE PARAMETERS.A6;I 7; INPUT:8; R0 BIT 15: 0 = SET SPEED9; 1 = GET SPEEDE69; BIT 13: 1 = SET 7-BIT CHARACTER LENGTH ; LK710?9; BIT 12: 1 = CHECK IF 7-BIT CHARACTER IS SUPPORTED ; LK710=:; BIT 11: 1 = SET SPEED SELECTED BY AUTO-BAUD DETECT LOGIC+;; BIT 10: 1 = SET DEVICE DEPENDENT SPEEDA#<; (USED FOR SETTING PARITY)C$=; BIT 9: 1 = GET/SET ANSWER SPEED%>; BIT 8: 0 = GET/SET RECEIVE SPEED ?; 1 = GET/SET TRANSMIT SPEED@; IF SET SPEED:1A; BITS 0-7: NEW SPEED PARAMETER (S.XXX SYMBOL) B;:(C; R1 Flow control status change flags.D;P*E; BIT 0: 1 = Enable input flow control.+F; BIT 1: 1 = Disable input flow control.-+G; BIT 2: 1 = Enable output flow control.T,H; BIT 3: 1 = Disable output flow control.I;IJ; BITS 4-15: ReservedK; >L; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.M; N; OUTPUT:WO; IF GET SPEED REQUESTED:/'P; R4 POINTER TO DHU/DHV11 SPEED TABLEN Q; CC-C 0R;IS; IF SET SPEED REQUESTED:NT; CC-C 0 IF OK!U; 1 IF ILLEGAL SPEED SPECIFIED V;oLW; NOTE THAT THIS ROUTINE CAN BE EXECUTED AT BOTH SYSTEM STATE (IN RESPONSEPX; TO A SF.GMC OR SF.SMC QIO) AND FROM THE INPUT INTERRUPT SERVICE ROUTINE (FORY; AUTO-BAUD DETECT).Z; [;-\; ];o^; _YVLPAR::+` TST R1 ;Called for flow control change?Ta BEQ 5$ ;If EQ no - go on. "b RETURN ;Not processed for DZ.c5$:E&c .IF DF T$$GMC ! T$$SMC ; LK710c ; LK710 ;c BIT #20000,R0 ;CHECK IF WE VALIDATE 7-BIT CHAR. ; LK710c BEQ 7$ ;NO ; LK710Fc RETURN ; LK710Hc7$: ; LK710,c BIT #10000,R0 ;CHECK SET 7-BIT ; LK710+c BEQ 8$ ;NO. SET SPEED-PARITY ; LK710E;c BR SETLN1 ;SET 7-BIT AND OTHER LINE PARAMETERS ; LK710-c8$: ; LK710c ; LK710a&c .ENDC ;T$$GMC ! T$$SMC ; LK710de .IF DF D$$VMDf0g BIT #4000,R0 ;SET SPEED FOR AUTO-BAUD DETECT?h BEQ 20$ ;N - JUMP;(i BIT #2000,R0 ;DEVICE DEPENDENT SPEED?j BNE 10$ ;Y - JUMPA#k BIC #177400,R0 ;CLEAR UPPER BYTE;7l MOVB SPDHV-1(R0),R0 ;GET DEVICE DEPENDENT SPEED BITS /m10$: BIC #^C<17>,R0 ;CLEAR ALL BUT SPEED BITS;n MOV R0,R2 ;GET A COPY op .IF DF R$$EISq:r ASH #4,R2 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITIONst .IFF ;R$$EIS7u<v CALL SHIFT4 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITIONwx .ENDC ;R$$EISy(z BIS R0,R2 ;ADD IN RECEIVE SPEED BITS6{ MOVB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED IN DATABASE/| BR SETLN1 ; AND SET NEW SPEED IN CONTROLLER#}20$: ;REFERENCE LABEL~ .ENDC ;D$$VMD€� .IF DF T$$GMC&T$$00 ò~Ó~Ž{´cÚµcÛ¶c�·c›’SMCD‚#ƒ MOV R0,R4 ;SAVE INPUT PARAMETERB(„ SWAB R4 ;PUT FLAGS IN LOW ORDER BYTE… BPL 30$ ;SET SPEED - JUMPA†‡ .ENDCˆ‰ .IF DF T$$GMCŠ0‹ MOV #SPDHV,R4 ;POINT TO DHU/DHV11 SPEED TABLE!Œ RETURN ;RETURN WITH CC-C = 0I�Ž .ENDC ;T$$GMC�� .IF DF T$$SMC!D$$VMDR‘’ .IF NDF T$$GMCP“#” MOV R0,R4 ;SAVE INPUT PARAMETERT*• SWAB R4 ;PUT FLAGS IN LOWER ORDER BYTE–— .ENDC ;NDF T$$GMC˜)™30$: BIC #177400,R0 ;CLEAR R0 HIGH BYTE$&š MOVB SPDHV-1(R0),R2 ;GET SPEED BITS› SEC ;ASSUME ERROR)œ BMI 40$ ;NOT A SUPPORTED SPEED - JUMP � ASRB R4 ;SET ANSWER SPEED?ž BEQ 50$ ;N - JUMPCŸ  .IF DF D$$VMD¡/¢ BICB #17,U.CW3+1-U.TSTA(R5) ;CLEAR OLD VALUEE3£ BISB R2,U.CW3+1-U.TSTA(R5) ;SET NEW ANSWER SPEED$¤ CLC ;SHOW SUCCESS¥¦ .IFF ;D$$VMDF§7¨ SEC ;ATTEMPT TO SET ANSWER SPEED W/O MODEM SUPPORTA©ª .ENDC ;D$$VMD« ¬40$: RETURN­;N&®50$: BCS 60$ ;TRANSMIT SPEED - JUMP5¯ BICB #17,U.CW3-U.TSTA(R5) ;CLEAR OLD RECEIVE SPEEDE!° BR 70$ ;JUMP TO SET NEW SPEEDB;±60$: BICB #360,U.CW3-U.TSTA(R5) ;CLEAR OLD TRANSMIT SPEEDE²³ .IF DF R$$EIS´2µ ASH #4,R2 ;SHIFT SPEED BITS TO PROPER POSITION¶· .IFF ;R$$EISL¸4¹ CALL SHIFT4 ;SHIFT SPEED BITS TO PROPER POSITIONº» .ENDC ;R$$EIS¼.½70$: BISB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED#¾ CALL LOCKI ;LOCK OUT INTERRUPTSA5¿ MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW LINE PARAMETERS:%À BR SETLIN ;;;GO AND LOAD INTO LPRCÁ .ENDC ;DF T$$SMC!D$$VMDÃÄ .ENDC ;T$$GMC!T$$SMC!D$$VMDÅÆ; Ç;+È; YVPWUP - POWER-UP.É;T Ê; INPUT:>Ë; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. Ì; U.STS SET UP FOR LOCAL LINE: Í; US.CRW 0R Î; US.DSB 0CÏ;-Ð; Ñ;T Ò .ENABL LSBPÓÔ .IF DF R$$CONÕ:ÖYVCONL::BIT #HF.UBM,$HFMSK ;UMRS PRESENT ON THIS SYSTEM?× BEQ YVCPUP ;N - JUMP,Ø MOV #UMR5S,R0 ;GET ADDRESS OF SAVED UMR 5&Ù MOV #UBMPR+<5*4>,R1 ;POINT AT UMR 5 Ú MOV (R0)+,(R1)+ ;SET UP UMR 5Û MOV (R0)+,(R1)+ ;ÜÝ .IF NDF T$$SPLTÞ ß MOV (R0)+,(R1)+ ;SET UP UMR 6à MOV (R0)+,(R1)+ ;áâ .ENDC ;NDF T$$SPLã äYVCPUP::åæ .IFF ;R$$CONNç%èYVPWUP::TST R2 ;IS THIS LINE ZERO?:é BNE 30$ ;N - JUMPUêë .IFTF ;R$$CONì!í MOV #40,@R3 ;SET MASTER RESETC0î10$: BIT #40,@R3 ;IS RESET FUNCTION COMPLETE? ï BNE 10$ ;N - LOOP UNTIL DONEðñ .IFT ;R$$CON5ò4ó BIT #20000,@R3 ;DID INTERNAL DIAGNOSTICS SUCCEED?ô BEQ 20$ ;Y - JUMP(?õ MOVB #IE.FHE,$SCERR ;INDICATE FATAL HARDWARE ERROR ON DEVICE$ ö RETURN÷ø .IFTF ;R$$CONù(ú20$: MOV #40100,@R3 ;ENABLE INTERRUPTSûü .IFT ;R$$CONPý þ RETURNF ÿYVUONL:: YVUPUP:: .ENDC ;R$$CON'30$: CALL LOCKI ;LOCK OUT INTERRUPTSF" CALL SELLIN ;;;SELECT THE LINE5 BIS #4,LNCTRL(R3) ;;;ENABLE RECEIVER FOR THIS LINEM ; LK710LK BISB #US.OIU,U.STS-U.TSTA(R5) ;;;SET OUTPUT INTERRUPT UNEXPECTED ; LK710G ; LK720B .IF DF T$$DMA ; LK720H ; LK720T2 BIT #HF.QB,$HFMSK ;;;CHECK FOR Q-BUS ; LK720 BEQ 33$ ;;;NO ; LK720J BIS #S5.DMA,U.TST5-U.TSTA(R5) ;;;SET BIT TELLING DHV/DHU IS DMA ; LK720'33$: ;;;REFERENCE LABEL ; LK7200 ; LK720O .ENDC ;T$$DMA ; LK720; ; LK720B .IF DF D$$VMD 8  BIC #S5.ABP,U.TST5-U.TSTA(R5) ;;;RESET AUTO-BAUD MODE/  BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;REMOTE LINE?R  BEQ 40$ ;;;N - JUMP@  BISB #US.CRW,U.STS-U.TSTA(R5) ;;;SET WAITING FOR CARRIER FLAG2 MOV R3,-(SP) ;;;SAVE POSSIBLY MODIFIED REGISTER# CALL YVMTMA ;;;SET MODEM STATUSL! MOV (SP)+,R3 ;RESTORE REGISTERR) CALL LOCKI ;LOCK OUT INTERRUPTS AGAIN0 .ENDCSETLN1: ; REFERENCE LABEL?40$: MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW SPEED AND PARITY BITSK)SETLIN: CALL SELLIN ;;;SELECT THE LINEU* SWAB R2 ;;;PUT SPEED BITS IN HIGH BYTE7 RORB R2 ;;;PUT PARITY ENABLE BIT IN PROPER POSITION$1 BICB #^C<40>,R2 ;;;CLEAR ALL BUT PARITY ENABLE;& TST U.CW3-U.TSTA(R5) ;;;ODD PARITY? BMI 60$ ;;;Y00 ú~�~±|t÷tø tþfDATA - JUMPD) BIS #100,R2 ;;;N - SET TO EVEN PARITYM<60$: BIT #140000,R2 ;;;TRANSMIT SPEED 134.5 BAUD OR LOWER? BNE 70$ ;;;N - JUMP0(  BIS #200,R2 ;;;Y - SET TWO STOP BITS.!70$: BIS #30,R2 ;;;SET EIGHT BIT CHARACTERSB! BIT #S5.CLN,U.TST5-U.TSTA(R5) ;;;CHECK 7-BIT CHARACTER ; LK710+! BEQ 75$ ;;;NO LEAVE IT 8-BIT ; LK710E'! BIC #10,R2 ;;;SET 7-BIT ; LK710 ;!75$: MOV R2,LPR(R3) ;;;LOAD NEW LINE PARAMETERS ; LK710E! ; LK710U!; ; LK710#; ;**-19$; WHEN RETURNING VIA COROUTINE "LOCKI", CC-C IS CLEARED:%;#& RETURN ;RETURN ' ( .DSABL LSB )* .IF DF R$$CON+ ,YVCOFF::#- CALL LOCKI ;LOCK OUT INTERRUPTS#. MOV #40,@R3 ;;;SET MASTER RESETH / RETURN 0YVUOFF::#1 CALL LOCKI ;LOCK OUT INTERRUPTSR"2 CALL SELLIN ;;;SELECT THE LINEB3 BIC #11004,LNCTRL(R3) ;;;DROP DTR, RTS AND DISABLE THE RECEIVER4 RETURN ;;;DROP PRIORITY56 .ENDC ;R$$CON78;9; :;+$;; INPUT INTERRUPT SERVICE ROUTINE.<;-=;1>; 3? DS.CHG = 70000 ;DATASET STATUS CHANGE CONDITION:@ A .ENABL LSB B;RCD .IF DF R$$MPLE/F$YVINP::TTSET$ YV ;;;SAVE R2, R3 AND SET UP: G ;;; R3 = CSR ADDRESSH ;;; R4 = KRB ADDRESSIJ .IFF ;R$$MPLVK-L$DVINP::TTSET$ DV ;;;SAVE R2,R3 AND SET UPLM ;;; R3 = CSR"N ;;; R4 = ADDRESS OF UCB LISTOP .IFTF ;R$$MPLQ6R10$: MOV RBUF(R3),R5 ;;;GET NEXT CHARACTER FROM SILO#S BPL 70$ ;;;SILO IS EMPTY - JUMP !T MOV R5,-(SP) ;;;SAVE CHARACTER*U SWAB R5 ;;;GET LINE NUMBER IN LOW BYTE V CALL MUXUCB ;;;GET UCB IN R5)W MOV (SP)+,R2 ;;;RETRIEVE CHAR + STATUS*X BCS 10$ ;;;BAD LINE - IGNORE CHARACTER2Y MOV R2,-(SP) ;;;CHECK FOR DATASET STATUS CHANGE2Z BIC #^C,@SP ;;;CLEAR ALL BUT ERROR BITS.[ CMP #DS.CHG,(SP)+ ;;;DATASET STATUS CHANGE?\ BEQ 20$ ;;;Y - JUMPS]^ .IFF ;R$$MPL._#` MOV R3,-(SP) ;;;SAVE CSR ADDRESS;ab .IFTF ;R$$MPLc'd MOV R4,-(SP) ;;;SAVE KRB/UCB ADDRESS 7e CALL ICHAR1 ;;;DO COMMON INPUT INTERRUPT PROCESSINGL*f MOV (SP)+,R4 ;;;RESTORE KRB/UCB ADDRESSgh .IFF ;R$$MPL(ij MOV (SP)+,R3 ;;;RESTORE CSRkl .IFT ;R$$MPLNm%n MOV @R4,R3 ;;;RESTORE CSR ADDRESSEop .ENDC ;R$$MPLq8r BR 10$ ;;;TRY TO GET ANOTHER CHARACTER FROM THE SILOs;#St; WE ARE HERE BECAUSE FRAMING ERROR, DATA OVERRUN AND PARITY ERROR BITS WERE SET,.Pu; WHICH MEANS THAT EITHER A DATASET STATUS CHANGE HAS OCCURRED OR A DIAGNOSTICv; MESSAGE HAS BEEN RECEIVEDw; (x20$: BIT #1,R2 ;;;DIAGNOSTIC MESSAGE?y BNE 10$ ;;;Y - IGNORERz{ .IF DF D$$VMD|};.~; PROCESS MODEM STATUS CHANGE ;S€ MOV R4,-(SP) ;;;SAVE R4<� MOV #100000,R4 ;;;SHOW THAT INTERFACE SUPPORTS DSR SIGNAL'‚ BIT #10,R2 ;;;IS CLEAR TO SEND SET?Hƒ BEQ 30$ ;;;N - JUMPO*„ BIS #100,R4 ;;;Y - SET APPROPRIATE BIT,…30$: BIT #20,R2 ;;;IS CARRIER DETECT SET?† BEQ 40$ ;;;N - JUMPE)‡ BIS #40,R4 ;;;Y - SET APPROPRIATE BITO"ˆ40$: BIT #40,R2 ;;;IS RING SET?‰ BEQ 50$ ;;;N - JUMPB*Š BIS #200,R4 ;;;Y - SET APPROPRIATE BIT‹50$: TSTB R2 ;;;IS DSR SET Œ BPL 53$ ;;;N - JUMPC+� BIS #40000,R4 ;;;Y - SET APPROPRIATE BITP-Ž53$: CALL SELLIN ;;;SETUP THE CORRECT LINET7� CALL MODISR ;;;DO COMMON MODEM INTERRUPT PROCESSING .� BVC 57$ ;;;NO SPECIAL ACTION NEEDED - JUMP‘ BCS 55$ ;;;DROP DTR - JUMP-’ BIS #11000,LNCTRL(R3) ;;;RAISE DTR AND RTS-“ BR 65$ ;;;AND TRY TO SERVICE ANOTHER LINE 0”55$: BIC #11000,LNCTRL(R3) ;;;DROP DTR AND RTS*•57$: BCS 65$ ;;;NO CALL ANSWERED - JUMP1– MOVB U.CW3+1-U.TSTA(R5),R2 ;;;GET ANSWER SPEED;/— BICB #^C<17>,R2 ;;;CLEAR ALL BUT SPEED FIELD0@˜ MOVB R2,U.CW3-U.TSTA(R5) ;;;SET NEW RECEIVE SPEED IN DATABASE™š .IF DF R$$EIS›2œ ASH #4,R2 ;;;SET TRANSMIT SPEED = ANSWER SPEED�ž .IFF ;R$$EISAŸ4  CALL SHIFT4 ;;;SET TRANSMIT SPEED = ANSWER SPEED¡¢ .ENDC ;R$$EIS£A¤ BISB R2,U.CW3-U.TSTA(R5) ;;;SET NEW TRANSMIT SPEED IN DATABASE;¥ MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW SPEED AND PARITY BITS6¦ ASSUME S4.ABD,100000 0§ TST 6(R5) 00 Ó~Ž{´cÚµcÛ¶c�·c›’;;;AUTO-BAUD SPEED DETECT ENABLED?¨ BPL 60$ ;;;N - JUMP2,© MOV #273,R2 ;;;Y - SET LINE TO 4800 BAUD*ª60$: CALL SETLIN ;;;SET LINE PARAMETERS!«65$: MOV (SP)+,R4 ;;;RESTORE R4¬­ .ENDC ;D$$VMD®8¯ BR 10$ ;;;TRY TO GET A CHARACTER FROM THE INPUT SILO°;4>±; SILO IS NOW EMPTY. SEE IF CONTROLLER IS READY TO TRANSMIT²;B%³70$: MOV @R3,R5 ;;;XMIT READY SET?S$´ BMI 75$ ;;;Y - GO DO OUTPUT WORKµ RETURN ;;;RETURN ¶; ·;A¸;+%¹; OUTPUT INTERRUPT SERVICE ROUTINE.6º;-»;T¼;D½¾ .IF DF R$$MPL¿/À$YVOUT::TTSET$ YV ;;;SAVE R2, R3 AND SET UP:TÁ ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESSÃÄ .IFF ;R$$MPLPÅ-Æ$DVOUT::TTSET$ DV ;;;SAVE R2,R3 AND SET UPBÇ ;;; R3 = CSR"È ;;; R4 = ADDRESS OF UCB LISTÉÊ .ENDC ;R$$MPLË9Ì MOV @R3,R5 ;;;GET INTERRUPTING LINE NUMBER AND STATUS@,Í BPL 10$ ;;;CHECK THAT THERE IS AN ACTION+Î75$: MOV R4,-(SP) ;;;SAVE KRB/UCB ADDRESS?Ï80$: MOV R5,-(SP) ;;;SAVE INTERRUPTING LINE NUMBER AND STATUST*Ð SWAB R5 ;;;GET LINE NUMBER IN LOW BYTE Ñ CALL MUXUCB ;;;GET UCB IN R5+Ò MOV (SP)+,R2 ;;;RETRIEVE TRANSMIT STATUS4!Ó BCS 130$ ;;;BAD LINE - IGNOREPÔÕ .IF DF R$$CONÖ,× BITB #US.OFL,U.ST2-U.TSTA(R5) ;;;OFFLINE?Ø BNE 130$ ;;;Y - JUMPÙÚ .ENDC ;R$$CONÛÜ .IF DF T$$SPLÝ-Þ MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;;;MAP UCBX@0ß MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBXàá .IFF ;T$$SPLSâ&ã MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBXäå .ENDC ;T$$SPLææ ; DD721Sæ; ; DD721Næ; WE'RE HERE BECAUSE AN OUTPUT REQUEST HAS COMPLETED OR WAS ABORTED ; DD721æ; ; DD721<æ CALL SELLIN ;;;SELECT THE LINE THAT INTERRUPTED ; DD721æ; ; DD721Ræ; TO MAKE LATER ERROR CHECKING EASIER, MERGE THE DMA ABORT BIT (BIT 0 OF ; DD721Dæ; THE LNCTRL CSR) WITH THE DMA ERROR BIT (ALREADY IN R2) ; DD721æ; ; DD7216æ ASL R2 ;;;SHIFT A ZERO INTO THE LOW-ORDER ; DD721>æ BISB LNCTRL(R3),R2 ;;;COMBINE ERROR BITS TOGETHER ; DD721Bæ BIC #1,LNCTRL(R3) ;;;RESET ABORT BIT FOR NEXT TRANSFER ; DD721æ; ; DD721Xæ; CHECK IF XOFF/XON SHOULD BE OUTPUT NOW (POSSIBLY BETWEEN QIO OUTPUT BUFFERS) ; DD721æ; ; DD721?æ BIC #100000,R2 ;;;ASSUME DON'T NEED XOFF/XON OUTPUT ; DD721ENæ BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;ANY HIGH PRIORITY REQUEST PENDING? ; DD721#æ BEQ 85$ ;;;N - JUMP ; DD721;6æ CALL STAXH ;;;START HIGH PRIORITY OUTPUT ; DD7218æ BIS #100000,R2 ;;;REMEMBER THAT WE DID THIS ; DD721æ; ; DD7219æ; PROCESS ANY ERRORS FROM PREVIOUS TRANSFER ; DD721æ; ; DD7212æ85$: MOV R3,-(SP) ;;;SAVE CSR ADDRESS ; DD7216æ ASR R2 ;;;DID WE ABORT PREVIOUS TRANSFER? ; LK720$æ BCS 110$ ;;;Y - JUMP ; DD721Gæ BIT #10000,R2 ;;;DID THE CONTROLLER ABORT PREVIOUS TRANSFER? ; DD721I#æ BEQ 90$ ;;;N - JUMP ; DD721Aæ MOVB #1,U.TOTI(R4) ;;;SET TIMER TO EXPIRE IN 1 SECOND ; DD721P:æ BR 120$ ;;;WAIT UNTIL THEN TO COMPLETE OUTPUT ; DD721æ; ; DD721+æ; DETERMINE WHAT TO DO NEXT ; DD721Sæ; ; DD721=æ90$: TST R2 ;;;DID WE JUST START XOFF/XON OUTPUT? ; DD721V8æ BMI 120$ ;;;Y - DON'T START ANY MORE OUTPUT ; DD721Læ BITB #US.OIU,U.STS-U.TSTA(R5) ;;;ANY QIO (OR ACD) OUTPUT PENDING? ; DD721$æ BNE 120$ ;;;N - JUMP ; DD721æ; ; DD721Uæ; WE HAVE NO OUTPUT IN PROGRESS BUT HAVE QIO OUTPUT TO DO. DETERMINE IF WE ; DD721EYæ; SHOULD START IT FROM THE BEGINNING (S5.HPO SET) OR CONTINUE IT (S5.HPO CLEAR) ; DD721Dæ; ; DD721Fæ BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;JUST STARTING QIO OUTPUT? ; DD721#æ BEQ 95$ ;;;N - JUMP ; DD721D?æ CALL STAXN ;;;BEGIN QIO OUTPUT DELAYED BY XOFF/XON ; DD721;æ BR 120$ ;;;CLEAR S5.HPO AND GO ON TO NEXT LINE ; DD721Dæ; ; DD721Pæ; POSSIBLY CONTINUE (IF MORE BUFFERS OR CHARACTERS) QIO OR ACD OUTPUT ; DD721æ; ; DD721'æ95$: ;;;REFERENCE LABEL ; DD721Hÿ ;**-24 .IF DF T$$ACD. BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? B00  ¡±|t÷tø tþfDATANE 100$ ;;;Y - JUMP" ADD #U.TOC,R4 ;;;POINT TO U.TOC' DEC @R4 ;;;ANYTHING LEFT TO OUTPUT?; BEQ 110$ ;;;N - JUMP+ CALL STAXM ;;;INITIATE ANOTHER TRANSFERO6 BR 120$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETED   .ENDC ;T$$ACD + 100$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2   ; LK728C  .IF DF T$$DMA ; LK728  ; LK7281C  BIT #S5.DWA,U.TST5-U.TSTA(R5);;;CHECK IO.WAL COMPLETION ; LK728F!  BNE 110$ ;;;YES ; LK728)  ; LK728T  .ENDC ;T$$DMA ; LK728  ; LK728NE 104$: CALL NXTOB ;;;GET NEXT OUTPUT BUFFER IF THERE IS ONE ; LK728   ; LK728 $  BEQ 110$ ;;;N - JUMP ; LK728; ;**-27; WE GOT ANOTHER OUTPUT BUFFER - START OUTPUTTING IT.; ! TST -(R4) ;;;POINT TO U.TOP+2 " MOV (SP)+,R3 ;;;GET CSR ADDRESS CALL STAX1 ;;;START OUTPUT; BR 122$ ;;;CLEAR S5.HPO AND GO ON TO NEXT LINE ; LK720P110$: ; LK720K BIC #S5.DWA,U.TST5-U.TSTA(R5);;;CLEAR DMA IO.WAL IN PROGRESS BIT ; LK720K5 CALL ODONE ;;;DO OUTPUT DONE PROCESSING ; LK720N6120$: MOV (SP)+,R3 ;;;RESTORE CSR POINTER ; LK720O122$: BIC #S5.HPO,U.TST5-U.TSTA(R5) ;;;NO XOFF/XON OUTPUT IN PROGRESS ; LK720O; ; LK720; ;**-5,; SEE IF ANY OTHER LINE COMPLETED TRANSMIT;(/130$: MOV (SP),R4 ;;;RESTORE KRB/UCB ADDRESSR! MOV @R3,R5 ;;;XMIT READY SET?P' BMI 80$ ;;;Y - DO IT ALL OVER AGAIN$  TST (SP)+ ;;;CLEAN STACK/! JMP 10$ ;;;SEE IF ANY MORE INPUT WORK TO DOR";I # .DSABL LSBC$;D%;;&;O'( .IF NDF R$$EIS )*;J+; SUBROUTINE TO SHIFT R2 4 BIT POSITIONS TO THE LEFT FOR NON-EIS SYSTEMS,;5-SHIFT4: ASL R2 ;SHIFT ONCEU. ASL R2 ;TWICE2/ ASL R2 ;THRICE0 ASL R2 ;LAST TIME5 1 RETURNF23 .ENDC ;NDF R$$EIS45;*6; SUBROUTINE TO SELECT LINE ON DHU/DHV117;R8;;9SELLIN: MOV #40100,-(SP) ;;;INCLUDE INTERRUPT ENABLE BITSA7: BISB U.UNIT-U.TSTA(R5),(SP) ;;;GET THE LINE NUMBER #; MOV (SP)+,@R3 ;;;SELECT THE LINE< RETURN ;;;S=> .IF DF D$$VMD?@;FA;RB;+C; YVMTIM - MODEM TIME-OUT D;-E;BF;SG H .ENABL LSBFI*JYVMTIM::CALL LOCKI ;LOCK OUT INTERRUPTS"K CALL SELLIN ;;;SELECT THE LINE2L BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;IS LINE REMOTE?M BNE 10$ ;;;Y - JUMP0N BIC #400,LNCTRL(R3) ;;;SET LINK TYPE TO LOCAL#O BR 20$ ;;;PROCESS MODEM TIMEOUTSBPYVMTMA: CALL LOCKI ;LOCK OUT INTERRUPTS (LINE ALREADY SELECTED)5Q10$: BIS #400,LNCTRL(R3) ;;;SET LINK TYPE TO REMOTET:R20$: CALL HLMTIM ;;;DO COMMON MODEM TIME-OUT PROCESSING1S BEQ 30$ ;;;IF EQ Z-BIT SET - DROP DTR AND RTSB.T BIS #11000,LNCTRL(R3) ;;;ASSERT DTR AND RTSU RETURN ;;;N0V30$: BIC #11000,LNCTRL(R3) ;;;DROP DTR AND RTSW RETURN ;;;UX Y .DSABL LSBEZ[ .ENDC ;D$$VMD\] .ENDC ;D$$V11^_` .END;SET LINK TYPE TO LOCAL#O BR 20$ ;;;PROCESS MODEM TIMEOUTSBPYVMTMA: CALL LOCKI ;LOCK OUT INTERRUPTS (LINE ALREADY SELECTED)5Q10$: BIS #400,LNCTRL(R3) ;;;SET LINK TYPE TO REMOTET:.NLIST .IDENT /06.01/D); TTMAC - ASSEMBLY PREFIX FILE FOR TTDRV.E7; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.T;T; 13-FEB-78 PETER WANNHEDENB;#; PREVIOUSLY MODIFIED BY:E;O; P. WANNHEDEN ; C. F. SPITZP; D. R. DONCHIN ; S. ADAMS ; B. MCCARTHYV ; R. PHILPOTT ;G%; MODIFIED FOR RSX-11M-PLUS V4.0 BY:C;A;E; L. KOGAN 20-FEB-87:; LK720 -- SUPPORT DIRECT TRANSFER FOR "PURE" IO.WAL ONLY;U;H;M;S; S. C. ADAMS 2-APR-87;; SA470 - - THIS SPACE IS INTENTIONALLY LEFT BLANK TO MAKEN+; LINES MATCH UP TO LINES IN M-PLUS TTMACR"; FOR EASE OF FUTURE MAINTENANCE;T;E;P .MCALL UCBDF$, TTSYM$;3$ UCBDF$ ,,TTDEF ;DEFINE UCB OFFSETS TTSYM$ ;DEFINE TC.XXX SYMBOLS;N; ; ASSEMBLY PARAMETERSO;I3T$$BFL= 76 ;TYPEAHEAD BUFFER LENGTH - ALSO LENGTH  ;OF THE UCB EXTENSIONV5M$$ANS= 30. ;SECONDS TO WAIT FOR CARRIER AFTER RINGP7M$$CAR= 2 ;SECONDS TO WAIT FOR LOST CARRIER TO RETURNS4M$$DIS= 2 ;SECONDS TO WAIT FOR DISCONNECT TO OCCUR .IF DF R$$P00¡Ó~Ž{´cÚµcÛ¶c�·c›’RO+; USE PRIORITY 7 ON THE PRO SERIES HARDWAREM,; ALL DEVICES INTERRUPT AT THE SAME PRIORITYTTPRI= 340 ;PRIORITY 7 .IFF ;R$$PROUTTPRI= 240 ;PRIORITY 5 .ENDC ;R$$PRO1M$$CRI= M$$CRB-4 ;NUMBER OF BYTES OF INFORMATIONO ;IN CLI COMMAND BUFFER!T$$CTX= 0 ;^X FLUSHES TYPEAHEAD .OPTIME= 15. ;DEFAULT OUTPUT TIMEOUT INTERVAL;A/.IIF DF T$$BTW,T$$CTR=0 ;T$$BTW FORCES T$$CTRTO.IIF DF P$$GEN!T$$OVL,D$$Z11=0 ;DZ11 SUPPORT FOR PREGENNED OR RSX11MPL SYSTEMSO4.IIF DF P$$GEN,D$$LMD=0 ;INCLUDE DL11 MODEM SUPPORT4.IIF DF P$$GEN,D$$ZMD=0 ;INCLUDE DZ11 MODEM SUPPORT:.IIF DF P$$GEN!T$$OVL,D$$V11=0 ;INCLUDE DHU/DHV11 SUPPORT9.IIF DF P$$GEN,D$$VMD=0 ;INCLUDE DHU/DHV11 MODEM SUPPORTB;.IIF DF D$$M11!D$$ZMD!D$$LMD!D$$VMD,T$$MOD=0 ;MODEM SUPPORTFA.IIF DF D$$H11!D$$J11!D$$Z11!D$$V11,T$$MUX=0 ;MULTIPLEXER SUPPORTU3.IIF DF R$$MPL,R$$EIS=0 ;RSX-11M-PLUS EIS SUPPORT$..IIF DF M$$EIS,R$$EIS=0 ;RSX-11M EIS SUPPORTF.IIF DF P$$OOL&T$$COM,T$$SPL=0 ;USE SECONDARY POOL FOR UCBX AND TABUFG.IIF DF R$$MPL&P$$OOL,T$$SPC=0 ;USE SECONDARY POOL CLI COMMAND BUFFERS1N.IIF NDF R$$PRO,.IIF DF R$$MPL,T$$SER=0 ;SERIAL COMMAND PROCESSING (CLI TABUF)I.IIF DF A$$CLI, .IIF DF M$$CLI, .ERROR ;ILLEGAL COMBINATION OF PARAMETERSM5XLOPNT= 10. ;SEND XON WHEN 10 CHARS. LEFT IN TABUF1J.IIF NDF T$$SPL,XHIPNT=T$$BFL-4-10. ;SEND XOFF 10 CHARS. BEFORE TABUF FULL6.IIF DF T$$SPL,XHIPNT=10. ;SAME FOR I/D-SPACE SYSTEMS5.IIF DF T$$SPL,T$$DMA=0 ;IO.WAL FROM A TASK BUFFER  ;FOR I/D-SPACE SYSTEMSA+.IIF DF T$$LTH,T$$MOD=0 ;IF LAT THEN MODEME .IF DF T$$OVLH.IIF NDF T$$SPL,T$$ONI=0 ;DEFINE THIS SYMBOL FOR OVERLAID/NON-I/D DRIVER .ENDC ;T$$OVL0 .IF DF T$$TSA ;IF SYSGEN HAS DEFINED T$$TSA...*T$$OOB=0 ;OUT-OF-BAND CHARACTER HANDLING)T$$ICS=0 ;INPUT COUNT STATE RECOGNITIONI)T$$SCA=0 ;SWITCH CHARACTER RECOGNITION F! ;AND TERMINAL MANAGEMENT MODED*T$$MHU=0 ;MODEM HANG-UP NOTIFICATION AST?; GENERATE ERRORS IF ALL SUPPORT NEEDED FOR TSA IS NOT INCLUDED;2.IIF NDF R$$IIC, .ERROR ;INTERNAL I/O COMPLETION$.IIF NDF A$$TRP, .ERROR ;AST SUPPORT5.IIF NDF T$$SMC, .ERROR ;SET MULTIPLE CHARACTERISTICSO5.IIF NDF T$$GMC, .ERROR ;GET MULTIPLE CHARACTERISTICSY%.IIF NDF T$$EIO, .ERROR ;EXTENDED I/O  .ENDC ;T$$TSAE; GENERATE ERRORS IF FUNCTIONALITY REQUIRING AST SUPPORT IS REQUESTEDW&; BUT AST SUPPORT IS NOT IN THE SYSTEM .IF NDF A$$TRPM. .IIF DF T$$CCA, .ERROR ;UNSOLICITED INPUT AST1 .IIF DF T$$SCA, .ERROR ;SWITCH CHARACTER SUPPORTS- .IIF DF T$$MHU, .ERROR ;MODEM HANG-UP NOTIFYT .ENDC ;A$$TRPL; GENERATE ERRORS IF FUNCTIONALITY REQUIRING INTERNAL I/O COMPLETION SUPPORT); IS REQUESTED BUT R$$IIC IS NOT DEFINED.G .IF NDF R$$IICE1 .IIF DF T$$ICS, .ERROR ;INPUT COUNT STATE CHANGE., .IIF DF T$$OOB, .ERROR ;OUT-OF-BAND SUPPORT .ENDC ;R$$IIC O .MACRO FRKBIT INS,VAL .IF DF M$$PRO* CACHE$ SAVE ;NOW WANT NON-CACHED VALUES .IFTF ; DF M$$PRO+ 'INS' 'VAL',U.TFRQ-U.TSTA(R5) ;DO WHATEVERC .IFT ; DF M$$PRO) CACHE$ UNSAVE ;SET CACHE BACK AS IT WAST .ENDC ; DF M$$PRO .ENDM FRKBIT ;N;O .MACRO TTSET$ TYPER JSR R2,TTSETI S O .IF DF R$$MPL B R .WORD 'TYPE'CTBPD  .IFFN R .WORD 'TYPE'UCB $ .ENDC .ENDM TTSET$A;C G .IF NDF R$$MPLO .;O#; DEFINE CONTROLLER TYPES (RSX-11M)I;TTTDL=0ATTTDZ=2TTTTDH=4TTTDJ=6 TTTDM=10 ;DM11-BBATTTDV=14 T;N C .ENDC ;NDF R$$MPL D;$;O-; DEFINE CHARACTERS WITH SPECIAL SIGNIFICANCEC; CH.BSL= 134$'CH.AES=37 ;ALTERNATE ESCAPE CHARACTERS#CH.RBR=175 ;RIGHT BRACE (ALTMODE)NCH.TLD=176 ;TILDE (ALTMODE)TCH.LCA=141 ;LOWERCASE ACH.LCZ=172 ;LOWERCASE Z CH.BSP= 10 CH.CR= 15 CH.CTC= 3 CH.CTO= 17 CH.CTQ= 21 CH.CTR= 22 CH.CTS= 23 CH.CTU= 25 CH.CTX= 30 CH.CTZ= 32 CH.DOL= '$ CH.ESC= 33 CH.FF= 141 CH.HT= 11T CH.LF= 12D CH.NUL= 0= CH.ONE= '1 CH.PLU= '+ CH.RUB= 177D CH.SP= 40N CH.VT= 13C CH.ZER= '0;D;$A; DEFINE LEGAL READ/WRITE MODIFIER COMBINATIONS BASED ON SELECTED3; TERMINAL DRIVER SUPPORT:;P0; TF.LGW :== LEG00¡±|t÷tø tþfDATAAL WRITE-LOGICAL-BLOCK MODIFIERS/; TF.LGR :== LEGAL READ-LOGICAL-BLOCK MODIFIERSO8; TF.LER :== LEGAL EXTENDED-READ-LOGICAL-BLOCK MODIFIERS;TF.LGW = TF.WAL!TF.CCO!TF.WIRQ' .IIF DF T$$BTW, TF.LGW = TF.LGW!TF.WBTH' .IIF DF T$$CUP, TF.LGW = TF.LGW!TF.RCU +TF.LGR = TF.RST!TF.RAL!TF.RNE!TF.XOF!TF.TMO 9TF.LER = TF.LGR!TF.RLU!TF.RTT!TF.RPT!TF.RNF!TF.TNE!TF.RDI=. .IIF DF T$$RPR, TF.LER = TF.LER!TF.RPR!TF.BIN' .IIF DF T$$ESC, TF.LER = TF.LER!TF.RES3; ;M(; DEFINE OFFSETS IN UCB EXTENSION (UCBX);W .ASECTC.= 00U.TCI: .BLKW 1 ;IF SOLICITED INPUT IN PROGRESS:. ; POINTER TO CURRENT INPUT REQUEST PACKET& ;IF UNSOLICITED INPUT IN PROGRESS:- ; POINTER TO SECOND WORD IN FIRST BUFFER  ;IF INPUT IDLE:  ; 0/U.TIP: .BLKW 2 ;IF BUFFERED INPUT IN PROGRESS:L- ; FIRST WORD = POINTER TO CURRENT BUFFERT) ; SECOND WORD = POINTER TO NEXT BYTE  ; IN CURRENT BUFFER' ;IF NON-BUFFERED INPUT IN PROGRESS: / ; FIRST WORD = KISAR6 BIAS FOR TASK BUFFERX/ ; SECOND WORD = VIRTUAL ADDRESS IN KISAR61# ; OF NEXT BYTE IN TASK BUFFER 8U.TIC: .BLKW 1 ;REMAINING BYTES IN CURRENT INPUT BUFFER0U.TTIC: .BLKW 1 ;TOTAL REMAINING BYTES TO INPUT ;(EXCLUDING CURRENT BUFFER) :U.TFIB: .BLKW 1 ;POINTER TO FIRST INPUT BUFFER (ONLY WITH ;BUFFERED INPUT),U.TCO: .BLKW 1 ;IF TASK OUTPUT IN PROGRESS:/ ; POINTER TO CURRENT OUTPUT REQUEST PACKETU) ;IF ECHO IN PROGRESS, OR OUTPUT IDLE:  ; 0>U.TOP: .BLKW 2 ;FIRST WORD = POINTER TO CURRENT OUTPUT BUFFER* ;SECOND WORD = POINTER TO NEXT BYTE IN ;CURRENT OUTPUT BUFFER9U.TOC: .BLKW 1 ;REMAINING BYTES IN CURRENT OUTPUT BUFFERR1U.TTOC: .BLKW 1 ;TOTAL REMAINING BYTES TO OUTPUT ;(EXCLUDING CURRENT BUFFER)0U.TFOB: .BLKW 1 ;POINTER TO FIRST OUTPUT BUFFER0U.TFPB: .BLKW 1 ;FIRST PROMPT BUFFER FOR IO.RPR&U.TISV: .BLKB 1 ;INPUT STATE VARIABLE7U.TIHP: .BLKB 1 ;INITIAL HORIZONTAL POSITION FOR INPUTG .IF NDF T$$SPLEU.TECB: ;ECHO BUFFER2 .ENDC .BLKB 1)U.TVFC: .BLKB 1 ;VERTICAL FORMAT CONTROLDU.TITI: .BLKB 1 ;INPUT TIMER U.TOTI: .BLKB 1 ;OUTPUT TIMER+U.TSHP: .BLKB 1 ;SAVED HORIZONTAL POSITIONF)U.TSVP: .BLKB 1 ;SAVED VERTICAL POSITIONE;O+U.TRTT: .BLKW 1 ;SPECIAL TERMINATORS TABLE. .IF DF T$$EIO:U.TDIP: .BLKW 2 ;POINTERS TO CURRENT DEFAULT INPUT BUFFER=U.TDIC: .BLKW 2 ;COUNT OF REMAINING DEFAULT INPUT CHARACTERSP7U.TDIF: .BLKW 1 ;POINTER TO FIRST DEFAULT INPUT BUFFERF .ENDC ;T$$EIO/U.TTID: .BLKB 1 ;TERMINAL ID DEFINED ON IO.ATTC .IF DF B$$MAP>U.TDYP: .BLKB 1 ;OFFSET IN UCB EXTENSION FOR DATA TYPE (BYTE) .ENDC ;B$$MAP .EVEN&U.TAST: .BLKW 1 ;POINTER TO AST BLOCK ;0 IF NO AST SET UPT .IF DF T$$SCA?U.TSCA: .BLKW 1 ;POINTER TO SWITCH CHARACTER AST CONTROL BLOCK. .ENDC ;T$$SCAE .IF DF T$$MHUL2U.TMHA: .BLKW 1 ;POINTER TO MODEM HANG-UP NOTIFY  ;AST CONTROL BLOCK .ENDC ;T$$MHUO .IF DF T$$ICSU6U.TICA: .BLKW 1 ;POINTER TO TEP FOR INPUT COUNT STATE .ENDC ; T$$ICSI .IF DF T$$OOB0U.TOBA: .BLKW 1 ;POINTER TO TEP FOR OUT-OF-BAND .ENDC ; T$$OOB .IF DF T$$SPL9U.TTBF: ;TYPEAHEAD BUFFER FOLLOWS UCBX FOR 2NDARY POOLS .ENDC ;T$$SPL(T$$UXL= . ;DEFINE UCB EXTENSION LENGTH .PSECTS;O;O,; DEFINE BITS IN FORK REQUEST BYTE (U.TFRQ).5; FORK REQUESTS ARE PROCESSED IN ASCENDING BIT ORDER.FA; NOTE - INPUT DONE (FR.IRD) MUST BE PROCESSED BEFORE OUTPUT DONEU@; (FR.ORD) FOR THE SIMULATED CTRL-R FOLLOWING AN IO.WBT TO WORK.; SEE NOTE IN MODULE TTRW.;OFR.IRD= 1 ;INPUT DONEOFR.ORD= 2 ;OUTPUT DONE'FR.SUI= 4 ;START OF UNSOLICITED INPUTSX= 4 T .IF DF T$$CCA&A$$TRPR LX= X*2/FR.AST= X ;CHARACTER THAT CAUSES AST RECEIVED   .ENDC ;T$$CCA&A$$TRPE H .IF DF M$$PRO X= X*20FR.TIM= X ;TIME-OUT (ON MULTI-CPU SYSTEM ONLY) E .ENDC ;M$$PRO N .IF DF T$$SPCX= X*2$FR.KIL= X ;SEND KILL PACKET TO CLI .ENDC ;T$$SPC .IF DF T$$OOB)X= X*22FR.OOB= X ;SEND TSA EVENT PACKET FOR OUT-OF-BAND ;CHARACTER R .ENDC ;00¡"¢&Ž{´cÚµcÛ¶c�·c›’T$$OOB  .IF DF T$$ICSX= X*27FR.ICS= X ;SEND TSA EVENT PACKET FOR TABUF GOING FROM40 ;ZERO TO NON-ZERO (INPUT COUNT STATE CHANGE) .ENDC ;T$$ICSA .IF DF T$$SCAE,X= X*2 ;SEND AST TO TASK ASKING FOR SWITCH$FR.SCA= X ; CHARACTER NOTIFICATION .ENDC ;T$$SCATX= X*2FR.GRQ= X ;GET REQUEST PACKET$ .IF DF T$$LTHX= X*2%FR.LAT= X ;MAP AND CALL LAT PROCESS$ .ENDC ;T$$LTHX= X*24FR.PFP= X ;PROCESS CHAR. IN U.TECB (U.TECO) AT END, ;OF FORK PROCESSING. NOTE - THIS MUST BE% ;THE HIGHEST USED BIT IN U.TFRQ!! ;N;S=; DEFINE CONTROLLER DEPENDENT ROUTINE DISPATCH TABLE OFFSETS.PF; REGISTER R2 IS SET TO THE REQUIRED OFFSET BEFORE THE CTRD ROUTINE ISD; CALLED TO TRANSFER CONTROL TO THE APPROPRIATE CONTROLLER DEPENDENT=; MODULE. THESE VALUES ARE AFFECTED BY GET/SET PARAMETER ANDEI; RECONFIGURATION CONDITIONAL CODE, WHICH MAKES IT EASIER TO CONTEND WITHCI; AND DEFINE THE SYMBOLS HERE THAN TO PROVIDE THE PROPER CONDITIONAL CODE &; WHEREVER THE CTRD ROUTINE IS CALLED.;CT.STA= 0 ;START OUTPUTNCT.ABO= 2 ;ABORT OUTPUTECT.RES= 4 ;RESUME OUTPUTCT.STP= 6 ;STOP OUTPUTX= 6 .IF NDF R$$CON X= X+2CT.PWR= X ;POWER-UPR .IFTF ;NDF R$$CONX= X+2CT.TIM= X ;MODEM TIME-OUT  .IFF ;NDF R$$CONX= X+2 CT.CPW= X ;CONTROLLER POWER-UPX= X+2CT.UPW= X ;UNIT POWER-UPX= X+2CT.CON= X ;CONTROLLER ONLINEX= X+2CT.COF= X ;CONTROLLER OFFLINERX= X+2CT.UON= X ;UNIT ONLINEX= X+2CT.UOF= X ;UNIT OFFLINEN .ENDC ;NDF R$$CON* .IF DF T$$GMC!T$$SMC!D$$M11!D$$ZMD!D$$VMDX= X+2$CT.PRM= X ;GET/SET LINE PARAMETERS* .ENDC ;T$$GMC!T$$SMC!D$$M11!D$$ZMD!D$$VMD.LISTWER-UPR .IFTF ;NDF R$$CONX= X+2CT.TIM= X ;MODEM TIME-OUT  .IFF ;NDF R$$CONX= X+2 CT.CPW= X ;CONTROLLER POWER-UPX= X+2CT.UPW= X ;UNIT POWER-UPX= X+2CT.CON= X ;CONTROLLER ONLINEX= X+2CT.COF= X ;CONTROLLER OFFLINERX= X+2CT.UON= X ;UNIT ONLINEX= X+2CT.UOF= X ;UNIT OFFLINEN .TITLE TTOISF .IDENT /05.04/;; 6; COPYRIGHT (c) 1983 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;T<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ;M; 23-JAN-78 PETER WANNHEDENR;O; PREVIOUSLY MODIFIED BY:C;R; P. WANNHEDEN; D. R. DONCHIN ; T. LEKAS;-; MODIFICATIONS:; ; D. R. DONCHIN 05-JUN-83 05.01,; DD173 -- FIX MINOR PROBLEMS IN DHV11 CODE;N; D. R. DONCHIN 14-SEP-83 05.02U ; DD179 -- ADD HOSTSYNC SUPPORT; ; S. C. ADAMS 23-APR-84 05.03A4; SA170 -- CHANGE S4.XOF,XON,HPC TO S5. XOF,XON,HPC.; CHANGE S1.CTS TO S2.CTS. AND CHANGE S1.OBF;Y; S. C. ADAMS 21-MAY-84 05.04C(; SA195 -- ELIMINATE REDUNDANT BIT TEST .PSECT MAP5; 2; PROFESSIONAL 300 SERIES PRINTER PORT DEFINITIONS; .PDBUF = 173400 ;RECEIVER DATA BUFFER REGISTERPSTS = 173402 ;STATUS REGISTERCPMODE = 173404 ;MODE REGISTER!PCMND = 173406 ;COMMAND REGISTER;:; PROFESSIONAL 300 SERIES INTERRUPT CONTROLLER DEFINITIONS;O4ICCSR = 173202 ;INTERRUPT CONTROLLER 0 CSR REGISTER5PRINTR = 5 ;PRINTER RECEIVER INTERRUPT REQUEST LEVELT8PXINTR = 6 ;PRINTER TRANSMITTER INTERRUPT REQUEST LEVEL*CLSIMR = 50 ;CLEAR SINGLE IMR BIT COMMAND)STSIRR = 130 ;SET SINGLE IRR BIT COMMAND3(STSIMR = 70 ;SET SINGLE IMR BIT COMMAND; ;7;+*; COMMON OUTPUT INTERRUPT SERVICE ROUTINE.1; USED BY FOLLOWING CONTROLLER TYPES: DJ, DL, DZ.T;; INPUT: ; R2 BITMASK FOR TRANSMIT ENABLE; R3 CSR ADDRESS; R5 POINTER TO U.TSTA;F ; OUTPUT:O,; NEXT CHARACTER IS OUTPUT, IF THERE IS ONE.:; IF NECESSARY, A SWITCH IS MADE TO THE NEXT OUTPUT BUFFER"; (ONLY IF DOING BUFFERED OUTPUT).5; IF NO MORE CHARACTERS TO OUTPUT, ODONE IS CALLED TOI!; PERFORM OUTPUT-DONE PROCESSING.S;L; REGISTERS ALTERED: R2,R3,R4 ;-;I;E .MCALL HWDDF$,UCBDF$7;+* HWDDF$ ;DEFINE HARDWARE RELATED SYMBOLS UCBDF$ ;DEFINE UCB SYMBOLSR .ENABL LSB  .IF DF D$$J11!D$$L11!D$$Z11;T;SOUTISR:: .IF DF R$$CON* BIT00¢*±|t÷tø tþfDATAB #US.OFL,U.ST2-U.TSTA(R5) ;;;OFFLINE? BNE 110$ ;;;Y - IGNORE .ENDC;/; DETERMINE IF AN XOFF OR XON SHOULD BE OUTPUT.U;UK BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;ANY HIGH PRIORITY OUTPUT REQUEST PENDING?O BEQ 7$ ;;;N - JUMP1 BIT #S5.XOF,U.TST5-U.TSTA(R5) ;;;OUTPUT AN XOFF?L BEQ 5$ ;;;N - JUMP;; OUTPUT AN XOFF.U;F6 BIC #S5.XOF,U.TST5-U.TSTA(R5) ;;;Y - RESET INDICATION$ MOVB ASXOFF,6(R3) ;;;OUTPUT AN XOFF5 RETURN ;;;CONTINUE NORMAL OUTPUT AT NEXT INTERRUPT:;O; THE HIGH PRIORITY OUTPUT IS NOT FOR XOFF, MUST BE THEN FOR XON, SO OUTPUT IT.G;E95$: BIC #S5.XON,U.TST5-U.TSTA(R5) ;;;RESET XON INDICATIONU" MOVB ASXON,6(R3) ;;;OUTPUT AN XON RETURN;A7$: BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT INTERRUPT UNEXPECTED?B BNE 110$ ;;;Y - IGNORE;;; HANDLE XOFF FROM TERMINAL.;  ASSUME S2.CTS,100000 ( TST 2(R5) ;;;OUTPUT STOPPED BY CTRL-S? BMI 110$ ;;;Y - IGNOREM; ; GET NEXT CHARACTER TO OUTPUT.R;R MOV R2,-(SP) ;;;SAVE R2 .IF DF T$$SPL+ MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;;;MAP UCBX . MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPL.- MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCB EXTENSIONS .ENDC ;T$$SPL N ADD #U.TOC,R4 ;;;POINT TO U.TOC-10$: DEC @R4 ;;;DECREMENT BYTE COUNT (U.TOC)B BPL 20$ ;;;MORE TO DO - JUMP0 CLR @R4 ;;;THIS BUFFER EXHAUSTED - CLEAR U.TOC TST -(R4) ;;;POINT TO U.TOP+2P6 CALL NXTOB ;;;GET NEXT OUTPUT BUFFER IF THERE IS ONE1 BNE 10$ ;;;DO IT ALL OVER AGAIN WITH NEW BUFFER  BR 100$ ;;;ALL DONE - JUMP20$: TST (SP)+ ;;;CLEAN STACK B .IF DF T$$ACD & BIT #S2.OBF,2(R5) ;;;BUFFERED OUTPUT? BNE 90$ ;;;Y - JUMPU .IF DF D$$H11!D$$V11X< CALL MOUT ;;;GENERATE THE PROPER OUTPUT FOR THE NEXT CHAR./ MOVB R2,6(R3) ;;;OUTPUT THE RETURNED CHARACTER RETURN ;;;R .ENDC ;D$$H11!D$$V11  .ENDC ;T$$ACD .ENDC ;D$$J11!D$$L11!D$$Z11 .IF DF T$$ACD;A; WE ARE HERE TO PERFORM AN ECHO BY FIRST EXPANDING THE CHARACTER;=; AND THEN OUTPUTTING ITS GENERATED ECHO (CALLED MULTI-ECHO). ;P'MOUT:: MOV R3,-(SP) ;;;SAVE CSR ADDRESSF9 MOV U.TFOB-U.TOC(R4),R2 ;;;GET MULTI-ECHO BUFFER ADDRESSE0 BNE 60$ ;;;IT POINTS TO SOME CHARACTERS - JUMP8 MOV -(R4),R2 ;;;GET ADDRESS OF NEXT CHARACTER TO EXPAND INC @R4 ;;;UPDATE POINTERE& MOV -2(R4),@#KISAR6 ;;;MAP THE BUFFER* MOVB (R2),R2 ;;;GET THE CHARACTER ITSELF( MOV $DALED,@#KISAR6 ;;;REMAP THE DRIVER; CALL EXPCHR ;;;EXPAND CHARACTER TO GENERATE PROPER OUTPUTN) BNE 30$ ;;;EXPANSION IS A STRING - JUMP MOV (SP)+,R3 ;;;GET CSR ADDRESS .IF NDF D$$H11&D$$V11, MOVB R2,6(R3) ;;;OUTPUT CHARACTER AS ITSELF .IFTF ;NDF D$$H11&D$$V11R$ RETURN ;;;WAIT FOR NEXT INTERRUPT<30$: BCS 40$ ;;;GENERATE A MULTI-ECHO SEQUENCE - SAVE CHAR?: CMP (R4)+,(R4)+ ;;;N - POINT TO MULTI-ECHO BUFFER POINTER7 BR 50$ ;;;SET UP MULTI-ECHO BUFFER POINTER AND LENGTH ?40$: DEC (R4)+ ;;;NEED CHAR. AGAIN - BACK UP POINTER (U.TOP+2);) INC (R4)+ ;;;AND UPDATE COUNTER (U.TOC)N ASSUME ,U.TTOC?50$: MOV R2,(R4)+ ;;;INSERT MULTI-ECHO SEQUENCE LENGTH (U.TTOC)D; MOV R3,@R4 ;;;INSERT MULTI-ECHO SEQUENCE ADDRESS (U.TFOB)' MOV R3,R2 ;;;PUT ADDRESS WHERE NEEDED 9 BR 70$ ;;;OUTPUT FIRST CHARACTER FROM MULTI-ECHO BUFFERT ASSUME ,U.TFOB960$: INC (R4)+ ;;;DON'T CHANGE COUNT IF DOING MULTI-ECHOT: TST (R4)+ ;;;POINT TO MULTI-ECHO BUFFER ADDRESS (U.TFOB)(70$: MOV (SP)+,R3 ;;;RESTORE CSR ADDRESS .IFF ;NDF D$$H11&D$$V116 MOVB (R2),R2 ;;;GET CHARACTER FROM MULTI-ECHO BUFFER .IFT ;NDF D$$H11&D$$V11; MOVB (R2),6(R3) ;;;OUTPUT CHARACTER FROM MULTI-ECHO BUFFER; .ENDC ;NDF D$$H11&D$$V11D INC @R4 ;;;POINT TO NEXT ONE; DEC -(R4) ;;;SHOW ONE LESS CHARACTER IN MULTI-ECHO BUFFERO BNE 80$ ;;;MORE TO DO - JUMP9 CLR 2(R4) ;;;ALL DONE - CLEAR MULTI-ECHO BUFFER POINTERI80$: RETURN ;;;T 4 .ENDC ;T$$ACD .IF DF D$$J11!D$$L11!D$$Z11 90$: ;;;REFERENCE LABEL .IF DF R$$PRO ASSUME H2.BRG,100000- TST $HFMSK+2 ;;;IS THIS A PRO BRIDGE SYSTEM?  BMI 95$ ;;;IF NE YES& MOVB @-(R4),PDBUF ;;;OUTPUT CHARACTER BR 97$ ;;;AND CONTINUE00¢2£5Ž{´cÚµcÛ¶c�·c›’ .IFTF ;R$$PRO*95$: MOVB @-(R4),6(R3) ;;;OUTPUT CHARACTER .IFT ;R$$PROR97$: ;;;REFERENCE LABEL .ENDC ;R$$PRO INC @R4 ;;;UPDATE POINTER  RETURN ;;;RETURNA;D100$: MOV @SP,R2 ;;;RESTORE R2N3 MOV #ODONE,@SP ;;;DO OUTPUT DONE PROCESSING BEFORED ;;;INTERRUPT IS DISMISSED:7110$: BIC R2,4(R3) ;;;DISABLE TRANSMISSION ON THIS LINEG .IF DF R$$PRO; D; FOR THE PROFESSIONAL 300 SERIES MACHINES BOTH METHODS OF EFFECTINGE; THE INTERRUPT ENABLE BITS ARE LEFT IN PLACE SO THAT THE SYSTEM WILLC; WORK ON BOTH THE REAL HARDWARE AND THE BRIDGE SYSTEM. THE BRIDGE:D; SYSTEM CONSISTS OF AN 11/23-PLUS SYSTEM WITH AN INTERFACE ON IT TO; THE CTI BUS.;T?; ON THE REAL HARDWARE THE BIC R2... IS IGNORED. ON THE BRIDGE ?; SYSTEM THE FOLLOWING INSTRUCTION IS IGNORED BECAUSE IT WRITES1; INTO THE BOOT ROMI;L> MOV #STSIMR!PXINTR,ICCSR ;;;DISABLE TRANSMISSION ON THIS LINE ;;;FOR THE PRINTER PORT .ENDC ;R$$PRO RETURN ;;;R  .ENDC ;D$$J11!D$$L11!D$$Z11 T .DSABL LSBM;L; .ENDON BOTH THE REAL HARDWARE AND THE BRIDGE SYSTEM. THE BRIDGE:D; SYSTEM CONSISTS OF AN 11/23-PLUS SYSTEM WITH AN INTERFACE ON IT TO; THE CTI BUS.;T?; ON THE REAL HARDWARE THE BIC R2... IS IGNORED. ON THE BRIDGE ?; SYSTEM THE FOLLOWING INSTRUCTION IS IGNORED BECAUSE IT WRITES1; INTO THE BOOT ROMI;L> MOV #STSIMR!PXINTR,ICCSR ;;;DISABLE TRANSMISSION ON THIS LINE ;;;FOR THE PRINTER PORT .ENDC ;R$$PRO RETURN ;;;R  .ENDC ;D$$J11!D$$L11!D$$Z11 T .TITLE TTJZ .IDENT /05.02/O;T6; COPYRIGHT (c) 1983 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;-<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;Y;M; 27-JAN-78 PETER WANNHEDEN ;O; PREVIOUSLY MODIFIED BY:N;T; P. WANNHEDEN ; C. F. SPITZR; D. R. DONCHIND;B; MODIFICATIONS:;I; D. R. DONCHIN 14-SEP-83 05.01E ; DD179 -- ADD HOSTSYNC SUPPORT; ; S. C. ADAMS 23-APR-84 05.02!8; SA170 -- CHANGE S4.HPC TO S5.HPC AND S1.CTS TO S2.CTS; ; ;+2; COMMON ROUTINES FOR DJ-11 AND DZ-11 CONTROLLERS.;-;; H .IF DF D$$J11!D$$Z11D D .MCALL UCBDF$, SCBDF$;D UCBDF$ ;DEFINE UCB SYMBOLSE SCBDF$ ;DEFINE SCB SYMBOLS. .PSECT MAP5;7;E;+; YJSTAX/YZSTAX - START OUTPUT.F; ; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.TOP+2 BUFFER ADDRESSI; U.TOC BYTE COUNT ; S1.CTO 0 ;-;C;P .ENABL LSB.; YJSTAX::PYZSTAX::BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;ANY HIGH PRIORITY CHARACTERS TO OUTPUT?3 BNE YZRESX ;;;Y - DO IT REGARDLESS OF XOFF STATUS ASSUME S2.CTS,100000( TST 2(R5) ;;;OUTPUT STOPPED BY CTRL-S? BMI 10$ ;;;Y - IGNORE ;B;E;+ ; YJRESX/YZRESX - RESUME OUTPUT.;C; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 0 ;-;D;RYJRESX:::YZRESX::BIS $BTMSK(R2),4(R3) ;;;ENABLE TRANSMIT INTERRUPTS% ;;;THE FIRST INTERRUPT WILL START. ;;;(OR RESUME) OUTPUT.10$: RETURN ;;;.;5;T;+A; JZOUT - COMMON OUTPUT INTERRUPT PROCESSING FOR DJ-11 AND DZ-11. ;I; INPUT:-; 2(SP) POINTER TO CONTROLLER REGISTER (BYTE)T5; THAT CONTAINS INTERRUPTING LINE NUMBER IN BITS 0-3-; R3 CSR ADDRESS; R4 KRB ADDRESS (RSX-11M+)O"; R4 ADDRESS OF UCB LIST (RSX-11M); ; OUTPUT:R9; FIRST, ALL LINES THAT REQUIRE OUTPUT WORK ARE SERVICED.J=; NEXT, IF ANY LINE REQUIRES INPUT WORK, THE SILO IS EMPTIED.P>; IF AT THAT TIME OUTPUT WORK IS AGAIN REQUIRED (THERE WILL BE6; IF THERE WAS ANY INPUT THAT REQUIRES ECHO), THE LOOP'; LOOKING FOR OUTPUT WORK IS REENTERED.D@; ON RETURN, ALL OUTPUT AND INPUT WORK THAT CAN BE DONE IS DONE.;T; REGISTERS ALTERED: R2,R5;-;E;M6JZOUT:: MOVB @2(SP),R5 ;;;GET INTERRUPTING LINE NUMBER6 CALL MUXUCB ;;;CHECK LINE NUMBER AND GET UCB ADDRESS1 MOV $BTMSK(R2),R2 ;;;GET BITMASK FOR XMIT ENABLER BCS 30$ ;;;BAD LINE - JUMP  .IF DF R$$MPL ,! MOV R4,-(SP) ;;;SAVE KRB POINTERT6 CALL OUTISR ;;;DO COMMON OUTPUT INTERRUPT PROCESSING$ MOV (SP)+,R4 ;;;R00£:¤<±|t÷tø tþfDATAESTORE KRB POINTER# MOV @R4,R3 ;;;RESTORE CSR POINTERR S .IFF ;R$$MPL  R MOV R3,-(SP) ;;;SAVE CSR ) MOV R4,-(SP) ;;;SAVE ADDRESS OF UCB LISTT6 CALL OUTISR ;;;DO COMMON OUTPUT INTERRUPT PROCESSING, MOV (SP)+,R4 ;;;RESTORE ADDRESS OF UCB LIST$ MOV (SP)+,R3 ;;;RESTORE CSR ADDRESS  .ENDC ;R$$MPL ;20$: TST @R3 ;;;XMIT READY? BMI JZOUT ;;;Y - LOOP ;PA; NO MORE LINES REQUIRE OUTPUT WORK. SEE IF ANY INPUT WORK TO DO. ;I* MOV 2(R3),R5 ;;;GET A CHARACTER FROM SILO BPL 10$ ;;;NONE - EXIT- CALL MUXIN1 ;;;OK - PROCESS INPUT CHARACTERE& ;;;MUXIN1 RETURNS TO OUR CALLER IF ;;;NO OUTPUT WORK TO DO & BR JZOUT ;;;OUTPUT WORK TO DO - LOOP; >; OUTPUT INTERRUPT OCCURRED ON A LINE THAT WE DON'T RECOGNIZE.:; I DON'T KNOW HOW IT GOT HERE BUT LET'S TRY TO PREVENT IT; FROM HAPPENING AGAIN.;:.30$: BIC R2,4(R3) ;;;DISABLE XMIT ON THAT LINE BR 20$ ;;;; .DSABL LSB  P .ENDC ;D$$J11!D$$Z11U O;T;O .END MOV 2(R3),R5 ;;;GET A CHARACTER FROM SILO BPL 10$ ;;;NONE  .TITLE TTATTB .IDENT /06.14/i;p; COPYRIGHT (c) 1987 BY+; DIGITAL EQUIPMENT CORPORATION, MAYNARD,.*; MASSACHUSETTS. ALL RIGHTS RESERVED.; C; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDVC ; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE C ; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISRC ; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORRC ; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND.3 ; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERED.T;1C; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTEC; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITALU; EQUIPMENT CORPORATION.;C; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF>; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.;;O; 09-FEB-78 PETER WANNHEDENH;,; PREVIOUSLY MODIFIED BY: ;W; P. WANNHEDEN; C. F. SPITZR; D. R. DONCHINN; B. S. MCCARTHY ; T. LEKAS ; S. C. ADAMSR!; R. S. PHILPOTT";M"; "; MODIFICATION HISTORY:T";C"; L. KOGAN 4-APR-86 6.048"; LK709 -- FIX CONDITIONALS WHEN SF.SMC IS DEFINED AND"; SF.GMC IS NOT DEFINED";"; L. KOGAN 18-JUN-86 6.05B3"; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORTE";Q"; S.C. ADAMS 14-JUNE-86 6.06!"; SA459 -- FIX COMMENT IN MCOOB "; !"; S. R. CLOUTIER 23-JUN-86 6.07D="; ADD CALL TO LAT PORT DRIVER, ON DETACH, IF TERMINAL IS A "; LAT APPLICATION TERMINAL.";L"; S.C. ADAMS 5-AUG-86 6.08 "; SA464 -- ADD LAT 5.1 SUPPORT";I"; S.C. ADAMS 5-AUG-86 6.09@"; SA465 -- REMOVE RESTRICTION THAT TERMINAL CANNOT BE ATTACHEDD"; FOR AST NOTIFICATION TO SET OTHER NOTIFICATION CHARACTERISTICS"; "; S. R. CLOUTIER 7-AUG-86 6.10C"; SRC SUPPLY STATUS IE.DNR IN ROUTINE PPHNG BEFORE CALLING KILLO1-";C="; CHECK TO SEE IF I/O PACKET HAS BEEN TAKEN BY LAT PROCESS #"; IN PPHNG BEFORE COMPLETING I/OC"; "; S. R. CLOUTIER 9-SEP-86 6.11D"; SRC MAKE CORRECTIONS TO MCMAP AND MCQDP LAT APPLICATION TERMINAL "; ROUTINES";""; T. M. SCHOELLER 10-DEC-86 6.12D"; TMS050 -- REMAP APR5 BEFORE CALLING CKTAB VIA CHANGING THE STACK";I"; L. KOGAN 26-FEB-87 6.13A8"; LK722 -- DO NOT KILL I/O ON LOCAL LINES AFTER IO.HNG";"; S.C. ADAMS 12-JUN-87 6.14OB"; SA473 -- CHECK THAT LAT PROCESS IS INSTALLED BEFORE GET OR SET"; CHARACTERSITICS ";R"; #;+$; ****** T T A T T ******C%; F&; THIS MODULE CONTAINS THE ROUTINES TO PROCESS I/O REQUESTS WITH THE'; FOLLOWING FUNCTION CODES:L2(; IO.ATT, IO.DET, IO.HNG, IO.GTS, SF.GMC, SF.SMCL); MOST OF THIS PROCESSING IS DONE WHEN THE I/O REQUEST IS REMOVED FROM THEN*; TERMINAL'S REQUEST QUEUE. HOWEVER, IO.GTS AND IO.GMC ARE NEVER PUT IN THEM+; QUEUE SO THEIR PROCESSING ROUTINE IS CALLED IMMEDIATELY FROM TTINI. ALSO P,; CONTAINED IN THIS MODULE IS THE ROUTINE FOR DEALLOCATING AST CONTROL BLOCKS.O-; IT IS CALLED FROM THE EXECUTIVE WHEN AN AST HAS 00¤B5Ž{´cÚµcÛ¶c�·c›’BEEN DEQUEUED AND EFFECTED.O.;-/;Q(0 .SBTTL .MCALLS AND SYMBOL DEFINITIONS132 .IF DF T$$TSA!T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB34 .MCALL EVNDF$,PKTDF$S5,6 EVNDF$ ;DEFINE TSA EVENT PACKET OFFSETS-7 PKTDF$ ;DEFINE AST CONTROL BLOCK SYMBOLSD839 .ENDC ;T$$TSA!T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOBN:; .IF NDF R$$MPLE<= .MCALL HWDDF$,SCBDF$>? HWDDF$ ;DEFINE KINAR5@ SCBDF$ ;DEFINE S.DMCSAB .ENDCCDE .IF DF T$$GTSFG .MCALL TTSYM$H-I TTSYM$ ;DEFINE F1.XXX AND F2.XXX SYMBOLSJ;B?K; DEFINE TERMINAL SUPPORT WORDS RETURNED BY AN IO.GTS REQUEST$L;TM; ALWAYS SUPPORTED OPTIONS:LN;D2OTSP1 = F1.ACR!F1.BUF!F1.CCO!F1.HLD!F1.LWC!F1.RNE0PTSP1 = TSP1!F1.RST!F1.SYN!F1.TRW!F1.UTB!F1.VBFQ;DRTSP2 = F2.FDX!F2.SFFS;!&T; CONDITIONALLY SUPPORTED OPTIONS:U;R#V.IIF DF T$$BTW TSP1 = TSP1!F1.BTW#W.IIF DF T$$CCA TSP1 = TSP1!F1.UIAB#X.IIF DF T$$ESC TSP1 = TSP1!F1.ESQ#Y.IIF DF T$$RPR TSP1 = TSP1!F1.RPR #Z.IIF DF T$$RUB TSP1 = TSP1!F1.RUBX[;F#\.IIF DF T$$GMC TSP2 = TSP2!F2.GCHI#].IIF DF T$$SMC TSP2 = TSP2!F2.SCHT#^.IIF DF T$$CUP TSP2 = TSP2!F2.CUPT#_.IIF DF T$$EIO TSP2 = TSP2!F2.EIO1#`.IIF DF T$$TSA TSP2 = TSP2!F2.NCTSab .ENDC ;T$$GTScd.PAGET;e .SBTTL PPATT - POST-QUEUE PROCESSING FOR ATTACH REQUESTSAf;Ug;+8h; **-PPATT - POST-QUEUE PROCESSING FOR ATTACH REQUESTSi;DHj; THIS ROUTINE IS DISPATCHED TO FROM TTINI AFTER AN IO.ATT REQUEST HASHk; BEEN DEQUEUED FOR A TERMINAL. ALWAYS SAVE THE USER-DEFINED TERMINAL'l; ID AND PROCESS IO.ATT SUBFUNCTIONS.m;D n; INPUTS: o; R5 => U.TSTA OF TERMINAL UCB?p; R4 => UCBX FOR TERMINAL (GUARANTEED TO EXIST AND BE MAPPED)Dq; R3 => CURRENT I/O PACKETr;s; OUTPUTS: NONE.t;T,u; REGISTERS MODIFIED: R0, R1, R2, R3, R4v;-w;Exy;MOVE THIS TO APR6z{ .IF NDF T$$OVLS|} .PSECT MAP6~ .ENDC ;NDF T$$OVL€1� .IF DF T$$ONI ;IF AN OVERLAID NON I/D SYSTEMH‚:ƒ$DALED: .WORD 0 ;THIS WILL BE INITIALIZED BY TTDAT CODE1„ ;THIS MUST BE THE FIRST WORD IN THE OVERLAYS…† .IF DF T$$GMC!T$$SMC5‡ˆ;AB‰; TABLE OF CHARACTERISTIC CODES FOR GET MULTIPLE CHARACTERISTICSIŠ; FUNCTION (SF.GMC) AND SET MULTIPLE CHARACTERISTICS FUNCTION (SF.SMC).‹;9Œ; EACH RECOGNIZED CODE HAS A 1-WORD ENTRY IN THE TABLE.,�; THIS WORD CONTAINS ONE OF THE FOLLOWING:Ž;*�; 1. IF THE WORD NOT = 0 AND BIT 15 = 0:=�; LOW BYTE = A BITMASK THAT MAPS THE DESIRED CHARACTERISTICD9‘; VALUE IN THE PROPER BYTE IN THE UCB. BITS ARE SET FORT"’; RELEVANT BITS IN THE UCB BYTE.8“; HIGH BYTE = OFFSET FROM START OF THE UCB TO THE BYTE-”; THAT CONTAINS THE DESIRED CHARACTERISTIC.T•;I–; 2. IF BIT 15 = 1:C8—; THE WORD IS THE ADDRESS OF A SUBROUTINE THAT HANDLES#˜; THIS PARTICULAR CHARACTERISTIC.W?™; (ALL VIRTUAL ADDRESSES IN THE DRIVER ARE 120000 OR HIGHER).Wš;›; 3. IF THE WHOLE WORD = 0:0>œ; THIS CHARACTERISTIC IS NOT RECOGNIZED BY SF.GMC OR SF.SMC.�;Až;S*Ÿ; DEFINE MACRO TO GENERATE TABLE ENTRIES ;T¡ .MACRO MCGEN NAME,OFS,BMB¢ .IF LE NAME-MCHI£ .=MCTAB+<2*>O ¤ .IF NB BM¥ .IF LE BM-377¦ .BYTE BM,OFS § .IFFE¨ .BYTE BM/400,OFS+1I© .ENDCª .IFF= « .WORD OFS¬ .ENDC­ .IFF !® .ERROR ;ILLEGAL CHARACTERISTICH¯ .ENDC° .ENDM MCGEN±;6²MCHI == TC.MAX-1 ;HIGHEST RECOGNIZED CHARACTERISTIC³;)´MCTAB:: .REPT MCHI-µ .WORD 0 ;INITIALIZE WHOLE TABLE TO ZEROSN¶ .ENDR,· MCGEN TC.WID,U.CW4,377 ;NUMBER OF COLUMNS4¸ MCGEN TC.LPP,U.TLPP,377 ;NUMBER OF LINES PER PAGE¹º .IF DF D$$H11!D$$Z11!D$$V11»%¼ MCGEN TC.RSP,MCRSP ;RECEIVE SPEED&½ MCGEN TC.XSP,MCXSP ;TRANSMIT SPEED6¾ MCGEN TC.PAR,MCPAR ;PARITY GENERATION AND CHECKING$¿ MCGEN TC.EPA,MCEPA ;PARITY SENSE8¿ MCGEN TC.CLN,MCCLN ;7-BIT CHARRACTER LENGTH ; LK710ÀÁ .IF DF T$$MODÂ$à MCGEN TC.ASP,MCASP ;ANSWER SPEED7Ä MCGEN TC.ABD,U.TSTA+6,S4.ABD ;AUTO-BAUD SPEED DETECTTÅÆ .ENDC ;T$$MODÇÈ .ENDC ;D$$H11!D$$Z11!D$$V11É2Ê MCGEN TC.ISL,U.UNIT,377 ;00¤J<±|t÷tø tþfDATASUB-LINE ON CONTROLLER%Ë MCGEN TC.TTP,MCTTP ;TERMINAL TYPE1#Ì MCGEN TC.SCP,U.CW2,U2.CRT ;SCOPE <Í MCGEN TC.HFL,U.TSTA+6,S4.HFL ;HORIZONTAL FILL REQUIREMENT:Î MCGEN TC.VFL,U.TSTA+6,S4.VFL ;VERTICAL FILL REQUIREMENT3Ï MCGEN TC.HFF,U.TSTA+6,S4.HFF ;HARDWARE FORM-FEEDR-Ð MCGEN TC.HHT,U.TSTA+6,S4.HHT ;HARDWARE TAB>Ñ MCGEN TC.ACR,U.TSTA+4,S3.ACR ;AUTOMATIC CR-LF ON LONG LINES-Ò MCGEN TC.PPT,U.TSTA+4,S3.PPT ;PRINTER-PORT;5Ó MCGEN TC.SMR,U.CW2,U2.LWC ;LOWERCASE INPUT ENABLEDNÔÕ .IF DF T$$ESCÖ9× MCGEN TC.ESQ,U.CW2,U2.ESC ;ESCAPE SEQUENCES RECOGNIZEDØÙ .ENDC ;T$$ESCÚÛ .IF DF T$$MODÜ$Ý MCGEN TC.DLU,MCRMT ;DIAL-UP LINEÞß .ENDCà.á MCGEN TC.HLD,U.CW2,U2.HLD ;HOLD-SCREEN MODE(â MCGEN TC.NEC,U.TSTA+4,S3.NEC ;NO-ECHO-ã MCGEN TC.SLV,U.CW2,U2.SLV ;SLAVED TERMINALH1ä MCGEN TC.PRI,U.CW2,U2.PRV ;PRIVILEGED TERMINALA,å MCGEN TC.FDX,U.TSTA+4,S3.FDX ;FULL DUPLEX=æ MCGEN TC.PTH,U.TSTA+4,S3.PTH ;PASS-THROUGH MODE IS ENABLEDO%ç MCGEN TC.BIN,MCBIN ;READ-PASS-ALL$@è MCGEN TC.8BC,U.TSTA+4,S3.8BC ;8 BIT CHARACTERS PASSED ON READ6é MCGEN TC.TBF,MCTBF ;TYPE-AHEAD BUFFER ACTIVE COUNT(ê MCGEN TC.CTS,MCCTS ;CONTROL-S STATUS5ë MCGEN TC.HSY,MCHSY ;HOST/TERMINAL SYNCHRONIZATIONE)ì MCGEN TC.ANI,U.TSTA+6,S4.ANI ;ANSI CRT/í MCGEN TC.AVO,U.TSTA+6,S4.AVO ;ADVANCED VIDEO+î MCGEN TC.BLK,U.TSTA+6,S4.BLK ;BLOCK MODEA(ï MCGEN TC.DEC,U.TSTA+6,S4.DEC ;DEC CRT*ð MCGEN TC.EDT,U.TSTA+6,S4.EDT ;EDIT MODE&ñ MCGEN TC.RGS,U.TSTA+6,S4.RGS ;REGIS0ò MCGEN TC.SFC,U.TSTA+6,S4.SFC ;SOFT CHARACTERSó;.ô .IF DF R$$MPL!A$$CLISõö .IF DF C$$CTC7÷ MCGEN TC.TLC,U.TSTA+4,S3.CTC ;CONTROL-C NOTIFICATION.øù .ENDC ;C$$CTCú)û MCGEN TC.NBR,U.MUP,UM.NBR ;NOBROADCASTYüý .ENDC ;R$$MPL!A$$CLINþÿ .IF DF T$$ACD6 MCGEN TC.ACD,MCACD ;ANCILLARY CONTROL DRIVER (ACD) .ENDC ;T$$ACD0 MCGEN TC.RAT,U.TSTA+4,S3.TAB ;READ-AHEAD TYPE .IF DF T$$SERA  MCGEN TC.TBM,U.MUP,UM.SER ;TYPEAHEAD BUFFER MODE (TASK OR CLI)   .ENDC ;T$$SER ;.  .IF DF T$$OOB< MCGEN TC.OOB,MCOOB ;OUT-OF-BAND/HELLO/INCLUDE CHARACTERS .ENDC ;T$$OOB .IF DF T$$ICS2 MCGEN TC.ICS,MCICS ;NOTIFY OF CHANGE IN TABUF ;(INPUT COUNT STATE)Y .ENDC ;TT$ICS .IF DF T$$SCA1 MCGEN TC.SSC,MCSSC ;SPECIFY SWITCH CHARACTERS 5 MCGEN TC.TMM,MCTMM ;EXIT TERMINAL MANAGEMENT MODEN .ENDC ;T$$SCA+ MCGEN TC.TSY,MCTSY ;OUTPUT FLOW CONTROL( .IF DF T$$MHU ;MODEM HANG-UP NOTIFY: MCGEN TC.MHU,MCMHU ;REQUEST MODEM HANG-UP NOTIFICATION .ENDC ;T$$MHU ;SA464$ .IF DF T$$LTH&M$$NET ;SA464 ;SA464E MCGEN TC.QDP,MCQDP ;GET QUEUE DEPTH AND LAT CONNECT STATUS ;SA464 4 MCGEN TC.MAP,MCMAP ;SET UP LAT MAPPING ;SA464 ;SA464$ .ENDC ;T$$LTH&M$$NET ;SA464 !"" .=MCTAB+<2*MCHI> ;END OF TABLE#;E$;D%& .ENDC ;T$$GMC!T$$SMCN'( .ENDC ; T$$ONIF) *PPATT::=+ MOVB I.PRM+2(R3),U.TTID(R4) ;SAVE USER-DEFINED TERMINAL ID,,- .IF DF T$$ESC.5/ BIT #TF.ESQ,I.FCN(R3) ;TASK WANT ESCAPE SEQUENCES?01 .IF DF T$$CCA23 BEQ 10$ ;IF EQ, NO...SKIP45 .IFF ;T$$CCA 6*7 BEQ ADHSUC ;COMPLETE SUCCESSFUL ATTACH89 .ENDC ;T$$CCA:,; BIS #S3.RES,4(R5) ;REMEMBER TO PARSE THEM<10$:= .ENDC ;T$$ESC>? .IF DF T$$CCA@<A BIT #TF.AST,I.FCN(R3) ;ATTACH FOR UNSOLICITED INPUT AST?3B BEQ 19$ ;IF EQ, NO...COMPLETE SUCCESSFUL ATTACH3C MOV I.PRM+4(R3),-(SP) ;GET CONTROL-C AST ADDRESSM2D BEQ 15$ ;IF EQ, NONE...CHECK OTHER AST ADDRESS7E BIT #TF.XCC,I.FCN(R3) ;CONFLICTING SUBFUNCTION CODE?C)F BNE 20$ ;IF NE, YES...RETURN AN ERRORG15$:H .IF NDF S$$LIBQI<J BIS I.PRM(R3),(SP) ;"OR" IN UNSOLICITED INPUT AST ADDRESS&K ASR (SP)+ ;WAS EITHER ADDRESS ODD?-L BCS 30$ ;IF CS, YES...INVALID AST ADDRESSCMN .IFF ;S$$LIBTO=P BIS I.PRM(R3),(SP)+ ;"OR" IN UNSOLICITED INPUT AST ADDRESS QR .ENDC ;S$$LIBS5T BEQ 30$ ;IF EQ, NEITHER ADDRESS SPECIFIED...ERRORR,U MOV #24.,R1 ;SET SIZE OF ACB TO AL00¤R5Ž{´cÚµcÛ¶c�·c›’LOCATE:V ADD #U.TAST,R4 ;POINT TO ATTACH ACB POINTER IN THE UCBX.W CALL ALACB ;ALLOCATE AN ACB FOR THE ATTACH-X BCS 40$ ;IF CS, ALLOCATION FAILED...ERRORPEY MOVB I.FCN(R3),(R0)+ ;PUT FUNCTION CODE MODIFIERS IN ACB FLAG BYTEE;Z MOV I.PRM+4(R3),(R0)+ ;SAVE CONTROL-C AST ADDRESS IN ACBRA[ MOV I.PRM(R3),(R0) ;LIKEWISE FOR UNSOLICITED INPUT AST ADDRESSO\] .IFTF ;T$$CCA^-_19$: BR ADHSUC ;COMPLETE SUCCESSFUL ATTACH `a .IFT ;T$$CCAFbc20$: TST (SP)+ ;CLEAN STACK9d30$: MOV #IE.SPC,R0 ;SET ILLEGAL AST ADDRESS ERROR CODEA"e BR 50$ ;JOIN COMMON ERROR CODE0f40$: MOV #IE.NOD,R0 ;ERROR - NO DYNAMIC MEMORY;g50$: CLR U.ATT-U.TSTA(R5) ;CLEAR POINTER SET UP BY $GSPKTThi .IF DF T$$ESCj=k BIC #S3.RES,4(R5) ;DON'T REMEMBER ESCAPE SEQUENCES ANYMOREAlm .ENDC ;T$$ESCn&o BR ADHFIN ;COMPLETE ATTACH REQUESTpq .ENDC ;T$$CCArs.PAGEC;t .SBTTL PPDET - POST-QUEUE PROCESSING FOR DETACH REQUESTSu; v;+8w; **-PPDET - POST-QUEUE PROCESSING FOR DETACH REQUESTSx;SHy; THIS ROUTINE IS DISPATCHED TO FROM TTINI AFTER AN IO.DET REQUEST HASKz; BEEN DEQUEUED FOR A TERMINAL. FLUSH THE TYPEAHEAD BUFFER IF NECESSARY,CI{; CLEAN UP TERMINAL STATUS, AND DEALLOCATE UNNECESSARY DATA STRUCTURES.R|;O }; INPUTS: ~; R5 => U.TSTA OF TERMINAL UCB7; R4 => UCBX FOR TERMINAL (ONLY IF T$$SPL IS DEFINED)€; R3 => CURRENT I/O PACKET�;‚; OUTPUTS: NONE.ƒ;E,„; REGISTERS MODIFIED: R0, R1, R2, R3, R4…;-†;T ‡PPDET::Uˆ‰ .IF DF T$$SERŠ=‹ BIT #UM.SER,U.MUP-U.TSTA(R5) ;DETACH WHILE IN SERIAL MODE?R(Œ BNE 10$ ;Y - DON'T FLUSH TABUF, JUMP�Ž .ENDC ;T$$SER�� .IF DF T$$IDO‘,’ TST $MCRPT ;IS THE DISPATCHER INSTALLED?)“ BEQ 10$ ;IF EQ NO - DON'T FLUSH TABUF”• .ENDC ;T$$IDO–,— MOV R3,-(SP) ;SAVE CURRENT PACKET ADDRESS˜™ .IF DF T$$OVLš!› MOV #I1CTXL,-(SP) ;GET ADDRESSA0œ CALL MPROT ;CALL ROUTINE TO FLUSH TYPE AHEAD�ž .IFF ;T$$OVL1Ÿ8  CALL I1CTXL ;FLUSH TYPE-AHEAD BUFFER WITH INTERRUPTS¡ ;LOCKED OUTM¢ .ENDC ;T$$OVL£+¤ MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESST*¥10$: BIC #S2.CTO,2(R5) ;CLEAR CTRL-O BIT"¦ BIS #S2.IRQ!S2.ORQ!S2.SRQ,2(R5)0§ ;LOOK FOR ALL SORTS OF PACKET IN THE QUEUE¨ ;NEXT TIME©ª .IF DF T$$ESC«=¬ BIC #S3.RES,4(R5) ;DON'T LOOK FOR ESCAPE SEQUENCES ANYMORE.­® .ENDC ;T$$ESC¯%° .IF DF T$$SCA!T$$MHU!T$$ICS!T$$OOBO±1² BIC #S3.TME!S3.MHE!S3.ICE,4(R5) ;DISABLE THESEV9³ BIC #S5.TMM,U.TST5-U.TSTA(R5) ;AND TERMINAL MANAGEMENTR´%µ .ENDC ;T$$SCA!T$$MHU!T$$ICS!T$$OOB¶,· .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB¸¹ .IF NDF T$$SPL)º$» MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX5¼ BEQ ADHSUC ;IF EQ, UCBX IS GONE...COMPLETE DETACHE½¾ .ENDC ;T$$SPL¿9À ADD #U.TAST,R4 ;POINT TO UNSOLICITED INPUT ACB ADDRESSF/ÁX = U.TAST ;SYMBOL NEEDED FOR ASSUME MACROSCÂà .IF DF T$$CCAÄ5Å CALL DEACB ;DEALLOCATE ATTACH ACB IF THERE IS ONER'Æ TST (R4)+ ;SKIP TO NEXT ACB POINTER- ÇX = X + 2NÈÉ .ENDC ;T$$CCAÊË .IF DF T$$SCAÌÍ ASSUME U.TSCA,X ÎX = X + 2 6Ï CALL DEACB ;DEALLOCATE SWITCH CHARACTER ACB IF ONE'Ð TST (R4)+ ;SKIP TO NEXT ACB POINTERCÑÒ .ENDC ;T$$SCAÓÔ .IF DF T$$MHUÕÖ ASSUME U.TMHA,X ×X = X + 22Ø CALL DEACB ;DEALLOCATE MODEM HANGUP ACB IF ONE'Ù TST (R4)+ ;SKIP TO NEXT ACB POINTER ÚÛ .ENDC ;T$$MHUÜÝ .IF DF T$$ICSÞß ASSUME U.TICA,X àX = X + 2C-á CALL DEACB ;DEALLOCATE ICS ACB/TEP IF ONE 'â TST (R4)+ ;SKIP TO NEXT ACB POINTER;ãä .ENDC ;T$$ICSåæ .IF DF T$$OOBçè ASSUME U.TOBA,X-é CALL DEACB ;DEALLOCATE OOB ACB/TEP IF ONE êë .ENDC ;T$$OOBì,í .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOBí ;SA4647í .IF DF T$$LTH ; IF LAT TERMINALS IN SYSTEM ;SA464Eí ;SA464Cí BIT #S6.LAT,U.TST6-U.TSTA(R5) ;LAT APPLICATION TERMINAL? ;SA464;0í BEQ 20$ ; IF EQ - NO, JUST COMPLETE ;SA464í ;SA464í .IF DF T$$OVL ;SA464í ;SA464+í MOV #LHDET,-(SP) ;GET ADDRESS ;SA464N00¤Z<±|t÷tø tþfDATA.í CALL MPROT ;CALL ROUTINE IN TTLH ;SA464í ;SA464í .IFF ;T$$OVL ;SA464 í ;SA464,í CALL LHDET ;CALL TTLH DIRECTLY ;SA464í ; ;SA464 í .ENDC ;T$$OVL ;SA464í ;SA4642í BCS PPHNG ; IF CS, HANG UP THE LINE.. ;SA464í ;SA464í .ENDC ;T$$LTH ;SA464í ;SA464í20$: ;SA464í ;SA464î)ï BR ADHSUC ;COMPLETE SUCCESSFUL DETACH ðñò.PAGEVAó .SBTTL PPHNG - POST-QUEUE PROCESSING FOR MODEM HANGUP REQUESTSEô;Tõ;+>ö; **-PPHNG - POST-QUEUE PROCESSING FOR MODEM HANGUP REQUESTS÷; Hø; THIS ROUTINE IS DISPATCHED TO FROM TTINI AFTER AN IO.HNG REQUEST HASGù; BEEN DEQUEUED FOR A TERMINAL. INITIATE A TIMEOUT ON THE LINE WHICHF=ú; WILL CAUSE DTR TO DROP AND THE TERMINAL TO BE LOGGED OUT.;û;H ü; INPUTS: ý; R5 => U.TSTA OF TERMINAL UCB7þ; R4 => UCBX FOR TERMINAL (ONLY IF T$$SPL IS DEFINED)Tÿ; R3 => CURRENT I/O PACKET;G; OUTPUTS: NONE.;Q$; REGISTERS MODIFIED: R0, R1, R2;-; PPHNG::* .IF DF T$$SPL)  MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP UCBX  MOV #120000,R4 ;POINT TO UCBX   .IFF ;T$$SPLH ) MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBXL .ENDC ;T$$SPL .IF DF T$$MOD- BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE?G> BEQ ADHSUC ;IF EQ, LINE IS LOCAL. DO NOT KILL I/O ; LK722 ; LK722R0 MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS ;**-29 BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIERS6 MOV #CT.TIM,R2 ;SET INDEX FOR MODEM TIMEOUT ROUTINE .IF DF T$$OVL* MOV #CTRD,-(SP) ;GET ADDRESS OF ROUTINE% CALL MPROT ;AND MAP AND CALL CTRDT  .IFF ;T$$OVLT!:" CALL CTRD ;INITIATE TIMEOUT WHICH WILL CAUSE DTR TO BE2# ;DROPPED AND THE USER OF THE LINE LOGGED OUT$ .ENDC ;T$$OVL%+& MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS && BNE 20$ ;IF NE, FINISH I/O ;SRC8& RETURN ;ELSE RETURN (PACKET WAS TAKEN BY LAT) ;SRC(10$: ;**-1A)* .ENDC ;T$$MOD+', MOV R3,-(SP) ;SAVE IO PACKET POINTERR-. .IF DF T$$OVL/,0 MOV #I1CTXL,-(SP) ;GET ADDRESS OF ROUTINE*1 CALL MPROT ;AND MAP AND CALL FLUSH TAB234 .IF NDF T$$SPL56 TST R4 ;IS THERE A UCBX?/7 BEQ 15$ ;IF NOT, DON'T KILL INPUT OR OUTPUTU89 .ENDC ;NDF T$$SPL:5; MOV #IE.ABO&377,R0 ;SET COMPLETION STATUS FOR READ ,< MOV #KILLI1,-(SP) ;GET ADDRESS OF ROUTINE+= CALL MPROT ;AND MAP AND CALL KILL INPUTN<= MOV #IE.DNR&377,R0 ;SET COMPLETION STATUS FOR WRITE ;SRC,> MOV #KILLO1,-(SP) ;GET ADDRESS OF ROUTINE,? CALL MPROT ;AND MAP AND CALL KILL OUTPUT@A .IFF ;T$$OVLIBC CALL I1CTXL ;FLUSH TABDE .IF NDF T$$SPLFG TST R4 ;IS THERE A UCBX?/H BEQ 15$ ;IF NOT, DON'T KILL INPUT OR OUTPUTLIJ .ENDC ;NDF T$$SPLK5L MOV #IE.ABO&377,R0 ;SET COMPLETION STATUS FOR READOM CALL KILLI1 ;KILL INPUTIN<N MOV #IE.DNR&377,R0 ;SET COMPLETION STATUS FOR WRITE ;SRCO CALL KILLO1 ;KILL OUTPUTPQ .ENDC ;T$$OVLR.S15$: MOV (SP)+,R3 ;RESTORE IO PACKET POINTERT20$:U .IF DF T$$MHUV1W BIT #S3.MHE,4(R5) ;IS CHARACTERISTIC ENABLED?$X BEQ ADHSUC ;BR IF NOYZ .IF DF T$$SPL[6\ MOV #120000,R4 ;POINT TO UCBX. IT IS POSSIBLE THAT+] ;A CALL FROM FPORD TO THE EXEC CAUSES.*^ ;US TO LOSE THE VALUE THAT WAS IN R4_` .IFF ;T$$SPLSa)b MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBXcd .ENDC ;T$$SPLe%f MOV U.TMHA(R4),R1 ;GET ACB ADDRESSLgh .IF DF T$$OVLij MOV #QUEAEN,-(SP)k CALL MPROT ;QUE AST TO TASK lm .IFF ;T$$OVL:n+o CALL QUEAEN ;QUEUE AST TO ATTACHED TASK pq .ENDC ;T$$OVLr .ENDC ;T$$MHUstu;Su; HERE TO COMPLETE AN IO.ATT, IO.DET, IO.ORG OR IO.HNG I/O WITH A SUCCESS ;SA464 >w; (ADHSUC) OR A PRESET (ADHFIN) COMPLETION STATUS. ;**-1x;H yADHSUC:4%z MOV #IS.SUC,R0 ;SET SUCCESS STATUSX {ADHFIN:,| .IF DF T$$OVL}%~ CLR R1 ;CLEAR SECOND WORD OF IOSB4& CALLR $IOFIN ;FINISH IO AND RETURN€� .IFF ;T$$OVLA‚(ƒ JMP IOFIN ;F00¤b5Ž{´cÚµcÛ¶c�·c›’INISH OFF THE I/O PACKET„… .ENDC ;T$$OVL… ;SA464… ;SA464….PAGE ;SA464O… ;SA464… .IF DF T$$LTH ;SA464… ;SA464F… .SBTTL PPORG - POST-QUEUE PROCESSING FOR ORIGINATE REQUESTS ;SA464…; ;SA464O…;+ ;SA464K…; **-PPORG - POST-QUEUE PROCESSING TO ORIGINATE A CONNECTION TO A ;SA464 .…; TERMINAL SERVER (ORIGINATE) ;SA464…; ;SA464;P…; THIS ROUTINE IS DISPATCHED TO FROM TTINI AFTER AN IO.ORG REQUEST HAS ;SA464O…; BEEN DEQUEUED FOR A TERMINAL. CHECK THAT THIS HAS BEEN ESTABLISHED ;SA464 J…; AS A LAT APPLICATION TERMINAL AND IF SO, CALL THE LAT PROCESS. ;SA464…; ;SA464P…; INPUTS: ;SA464O,…; R5 => U.TSTA OF TERMINAL UCB ;SA464@…; R4 => UCBX FOR TERMINAL (ONLY IF T$$SPL IS DEFINED) ;SA464(…; R3 => CURRENT I/O PACKET ;SA464…; ;SA464("…; OUTPUTS: NONE. ;SA464…; ;SA464U)…; REGISTERS MODIFIED: R0 ;SA464O…;- ;SA464…; ;SA464 …PPORG:: ;SA464 … .IF DF T$$SPL ;SA464… ;SA4643… MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP UCBX ;SA464S+… MOV #120000,R4 ;POINT TO UCBX ;SA464 … ;SA464… .IFF ;T$$SPL ;SA464S… ;SA4643… MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBX ;SA464… ;SA464… .ENDC ;T$$SPL ;SA464… ;SA464C… BIT #S6.LAT,U.TST6-U.TSTA(R5) ;LAT APPLICATION TERMINAL? ;SA464E:… BNE 10$ ;IF NE, YES...CAN ORIGINATE CONNECTION ;SA464B… MOV #!,R0 ;CONNECTION REJECTED ;SA464… ;SA4649… BR ADHFIN ;COMPLETE REQUEST WITH ERROR STATUS ;SA464#…10$: ;SA4641… MOV R3,-(SP) ;SAVE I/O PACKET POINTER ;SA464 <… MOV R3,R0 ;GET IRP ADDRESS TO R0 FOR LAT PROCESS ;SA464=… MOV #PO$ORG,R3 ;GET ORIGINATE CODE FOR LAT PROCESS ;SA464 … ;SA464… .IF DF T$$OVL ;SA464… ;SA4645… MOV #LTPRC,-(SP) ;GET ADDRESS OF ROUTINE ;SA464.0… CALL MPROT ;AND MAP AND CALL LTPRC ;SA464… ;SA464… .IFF ;T$$OVL ;SA4644… ;SA464*… CALL LTPRC ;CALL LAT PROCESS ;SA464… ;SA464… .ENDC ;T$$OVL ;SA464… ;SA4644… MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS ;SA464-… TST R0 ;ERROR BACK FROM PROCESS? ;SA464 ;… BNE ADHFIN ;IF NE, NO - ERROR, COMPLETE REQUEST ;SA4644;… RETURN ;ELSE RETURN, LAT WILL COMPLETE REQUEST ;SA464V)… ;WHEN CONNECTION COMPLETES ;SA464A… ;SA464… ;SA464… .ENDC ;T$$LTH ;SA464… ;SA464… ;SA464†‡.PAGE4Cˆ .SBTTL PPSPC/PPSPC1 - POST-QUEUE PROCESSING FOR SPECIAL REQUESTS.‰;;Š;+8‹; **-PPSPC - POST-QUEUE PROCESSING FOR SF.SMC REQUESTSDŒ; **-PPSPC1 - POST-QUEUE PROCESSING FOR IO.GTS AND SF.GMC REQUESTS�;6NŽ; THESE ROUTINES ARE DISPATCHED TO FROM TTINI TO PROCESS IO.GTS, SF.GMC, ANDO�; SF.SMC REQUESTS. PPSPC IS USED WHEN AN SF.SMC REQUEST IS DEQUEUED. PPSPC1 K�; IS USED WHEN AN IO.GTS OR SF.GMC REQUESTS ARE INITIATED, SINCE THEY CAN4‘; COMPLETE ASYNCHRONOUSLY.’; “; INPUTS:$”; R5 => U.TSTA OF THE TERMINAL UCB•; R3 => CURRENT I/O PACKET–;T—; OUTPUTS: NONE.˜;C,™; REGISTERS MODIFIED: R0, R1, R2, R3, R4Lš; R1 IS PRIMARILY USED AS A POINTER INTO THE USER'S CHARACTERISTIC BUFFER.›;-œ;T�;KEEP THIS IN APR 5FžŸ .IF NDF T$$OVL. ¡ .PSECT MAP5¢£ .ENDC ;T$$OVL¤¥ .IF DF T$$SMC¦ §PPSPC:: ¨© .IF NDF T$$SPL ª/ª .IF DF T$$OVL ;IF OVERLAID TTDRV ;TMS050Eª ;TMS050<ª MOV (SP),-(SP) ;FORCE A REMAP FIRST BEFORE CKTAB ;TMS050<ª MOV 4(SP),2(SP) ;BRING UP THE APR BIAS ON STACK ;TMS050@ª MOV #CKTAB,4(SP) ;THIS REQUEST MAY WANT TO CREATE OR ;TMS050-ª ;REMOVE A TYPE-AHEAD BUFFER - ;TMS050O&ª ;CHECK ON THE WAY OUT ;TMS050ª ;TMS050I4ª .IFF ;DF T$$OVL ;IF NOT OVERLAID TTDRV ;TMS050ª ;TMS0507« MOV #CKTAB,-(SP) ;THIS REQUEST MAY WANT TO CREATE ORP#¬ 00¤j<±|t÷tø tþfDATA;REMOVE A TYPE-AHEAD BUFFER -D­ ;CHECK ON THE WAY OUT ®!® .ENDC ;DF T$$OVL ;TMS050R® ;TMS050A¯ .ENDC ;NDF T$$SPL°2± MOV #IRESEL,-(SP) ;RESET S1 BITS ON THE WAY OUT²³ .ENDC ;T$$SMC´µ .IF DF T$$GTS!T$$GMC!T$$SMC¶8·PPSPC1::MOV I.PRM(R3),KISAR6 ;MAP USER BUFFER IN APR 6¸>¹ MOV I.PRM+2(R3),R1 ;GET START OF BUFFER (WE KNOW IT IS ON Aº ;WORD BOUNDARY)R»¼ .ENDC ;T$$GTS!T$$GMC!T$$SMC½¾ .IF DF T$$GTS¿'À CMP I.FCN(R3),#IO.GTS ;IS IT IO.GTS?M9Á BNE CHKCHR ;IF NE, NO...CHECK GET/SET CHARACTERISTICSÂ;.3Ã; PROCESS REQUESTS TO GET TERMINAL DRIVER SUPPORTÄ;N:Å MOV #TSP1,(R1)+ ;STORE FIRST WORD OF SUPPORT PARAMETERS.Æ CMP I.PRM+4(R3),#2 ;WANTS MORE THAN 1 WORD?5Ç BEQ JCHRSC ;IF EQ, NO...GIVE ONLY WHAT USER WANTS6%È MOV #TSP2,(R1)+ ;STORE SECOND WORDIÉÊË .ENDC ;T$$GTSÌÍ .IF DF T$$GTS!T$$GMC!T$$SMCÎ ÏJCHRSC:RÐ"Ñ JMP CHRSUC ;FINISH OFF REQUEST ÒCHKCHR: -Ó; BR NXTCHR ;CHECK CHARACTERISTICS SUPPORTGÔÕ .ENDC ;T$$GTS!T$$GMC!T$$SMCÖ×.PAGEH?Ø .SBTTL . NXTCHR - PROCESSING LOOP FOR SF.GMC/SF.SMC REQUESTS ÙÚ .IF DF T$$GMC!T$$SMC(ÛÜ;RFÝ; LOOP HERE TO START PROCESSING NEXT CHARACTERISTIC FROM USER BUFFERÞ;W ßNXTCHR:Q&à SUB #2,I.PRM+4(R3) ;ANY MORE TO DO?9á BMI JCHRSC ;IF MI, NO...FINISH SUCCESSFUL I/O REQUEST:â MOVB (R1)+,R0 ;GET NEXT CHARACTERISTIC FROM USER BUFFER.ã BEQ ERCNIH ;IF EQ, BAD CODE...RETURN ERRORä CMP R0,#MCHI ;TOO HIGH?2å BHI ERCNIH ;IF HI, YES...RETURN BAD CODE ERRORæ ASL R0 ;MULTIPLY CODE BY 2)ç ADD #MCTAB-2,R0 ;MAKE POINTER IN MCTABMèé .IF DF T$$SPLê9ë MOV $DALED,KISAR6 ;MAP CHARACTERISTIC TABLE (IN TTCOM)Oìí .IFTF ;T$$SPLîï CLR R2 ;INIT BITMASK+ð BISB (R0)+,R2 ;GET BITMASK FOR THIS CODEO#ñ MOVB (R0)+,R4 ;GET OFFSET IN UCBI4ò MOV -(R0),R0 ;GET FULL WORD IF SUBROUTINE ADDRESSóô .IFT ;T$$SPLUõ-ö MOV I.PRM(R3),KISAR6 ;RESTORE TASK MAPPINGN)÷ TST R0 ;IS CHARACTERISTIC RECOGNIZED?Eøù .ENDC ;T$$SPLú:û BEQ ERCNIH ;IF EQ, UNRECOGNIZED CHARACTERISTIC...ERROR6ü BPL 10$ ;IF PL, NOT A SUBROUTINE...PROCESS BITMASK@ý CMP R0,#160000 ;NEGATIVE OFFSET (NOT A SUBROUTINE AFTER ALL)?5þ BHIS 10$ ;IF HIS, NOT A SUBROUTINE ADDRESS...SKIPSÿ .IF DF T$$GMC&T$$SMCH< CMP I.FCN(R3),#SF.GMC ;DO TEST FOR SF.GMC BEFORE DISPATCH .ENDC ;T$$GMC&T$$SMCD7 CALL (R0) ;DISPATCH TO ROUTINE TO HANDLE SPECIAL...O$ ;...CASES OF SF.GMC AND SF.SMC. BR NXTCHR ;LOOP TO GET NEXT CHARACTERISTIC 10$:+  ADD R5,R4 ;POINT TO UCB OFFSET + U.TSTA.4  SUB #U.TSTA,R4 ;BACK UP POINTER TO THE UCB OFFSET   .ENDC ;T$$GMC!T$$SMCN .IF DF T$$GMC&T$$SMCI' CMP I.FCN(R3),#SF.SMC ;IS IT SF.SMC?U6 BEQ 100$ ;IF EQ, YES...PROCESS SET CHARACTERISTICS .ENDC ;T$$GMC&T$$SMC; .IF DF T$$GMC;T>; PROCESS REQUEST TO RETURN TERMINAL CHARACTERISTICS TO USER;I5 MOVB (R4),(R1) ;STORE CURRENT VALUE IN USER BUFFER  MOVB R2,R0 ;COPY BITMASK COMB R0 ;INVERT IT' BICB R0,(R1) ;CLEAR IRRELEVANT BITSS20$:  ASRB R2 ;SHIFT BITMASK RIGHT! BCS 30$ ;CARRY - JUMP3" RORB (R1) ;SHIFT VALUE IN USER BUFFER RIGHT TOOM# BR 20$ ;LOOP$30$:-% INC R1 ;SKIP OVER VALUE FIELD JUST STOREDS.& BR NXTCHR ;LOOP TO GET NEXT CHARACTERISTIC'( .ENDC ;T$$GMC)* .IF DF T$$SMC+,;C3-; PROCESS REQUEST TO SET TERMINAL CHARACTERISTICSR.;I/100$: <0 MOVB -1(R1),R0 ;GET CHARACTERISTIC CODE WE ARE PROCESSING/1 CMPB #TC.WID,R0 ;WANT TO CHANGE BUFFER SIZE?0,2 BNE 110$ ;IF NE, NO...SKIP TO NEXT CHECK33 CMPB #15.,(R1) ;TRYING TO MAKE BUFFER TOO SMALL?+4 BLO 200$ ;IF LO, NO...SKIP TO SET WIDTHI)5 BR ERCVL1 ;RETURN INVALID VALUE ERRORR6110$:O*7 CMPB #TC.ISL,R0 ;WANT TO CHANGE U.UNIT??8 BEQ ERCFIX ;IF EQ, YES...NOT ALLOWED - FIXED CHARACTERISTICF89 CMPB #TC.PRI,R0 ;TRYING TO CHANGE TERMINAL PRIVILEGE?>: BEQ ERCPRI ;IF EQ, YES...NOT ALLOWED - PRIVILEGE VIOLATION;< .IF DF T$$MOD=;> CMPB #TC.ABD,R0 ;WANT TO CHANGE00¤r5Ž{´cÚµcÛ¶c�·c›’ AUTOBAUD CHARACTERISTIC?E-? BEQ 120$ ;IF EQ, YES...MUST BE PRIVILEGED 8@ CMPB #TC.ASP,R0 ;WANT TO CHANGE DEFAULT ANSWER SPEED?4A BNE 200$ ;IF NE, NO...PROCESS THE CHARACTERISTICB120$: 1C MOV I.TCB(R3),R0 ;GET ISSUING TASK TCB ADDRESS 1D BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVILEGED?L6E BEQ ERCPRI ;IE EQ, NO...RETURN PRIVILEGE VIOLATIONFG .ENDC ;T$$MODHI200$:B+J MOV R2,-(SP) ;SAVE BITMASK TO BE CHANGEDE0K MOVB (R1),R0 ;GET NEW VALUE FROM USER BUFFERL210$:; M ASRB R2 ;SHIFT BITMASK RIGHT.N BCS 220$ ;IF CS, SHIFTED FAR ENOUGH...SKIP!O ROLB R0 ;SHIFT NEW VALUE LEFT #P BR 210$ ;LOOP FOR MORE SHIFTING2Q220$:N(R ROLB R2 ;PICK UP LOST BIT FROM CARRY'S COMB R2 ;INVERT RIGHT-ADJUSTED MASK %T BITB R2,(R1)+ ;NEW VALUE IN RANGE?;6U BNE ERCVAL ;IF NE, NO...RETURN INVALID VALUE ERROR"V BICB (SP)+,@R4 ;CLEAR OLD VALUEW BISB R0,@R4 ;SET NEW VALUEXY .IF DF T$$SERZ.[ CMPB -2(R1),#TC.TBM ;SERIAL CHARACTERISTIC?\ BNE 300$ ;IF NE, NO...SKIP$] TSTB R0 ;NOSERIAL NOW IN EFFECT?^ BNE 300$ ;IF NE, NO...SKIPB_ BIC #UM.CMD,U.MUP-U.TSTA(R5) ;ELSE, YES...CLEAR CMD IN PROGRESS`300$:2ab .ENDC ;T$$SERc!d CMPB #TC.PTH,-2(R1) ;PASSTHRU? e BNE 301$ ;BR IF NOTD$f BIC #S1.PTH,(R5) ;CLEAR OLD VALUEgh ASSUME S1.PTH*400,S3.PTHNi$j SWAB R0 ;GET BYTE IN RIGHT PLACE%k BISB R0,(R5) ;SET OR CLEAR S1.PTH4l301$:Wm/n;PROCESS FORMFEED AND NO-ECHO CHARACTERISITCSTo;E9p CMPB #TC.NEC,-2(R1) ;IS THIS A NO-ECHO CHARACTERISTIC?T)q BNE 303$ ;BR IF NOT TO CHECK FORMFEED 4r BIC #U2.NEC,U.CW2-U.TSTA(R5) ;Y - CLEAR OLD VALUEst ASSUME S4.HFF*400,U2.HFFu ASSUME S3.NEC*400,U2.NEC*2vw ASRB R0 ;GET NEW VALUE x BR 305$ ;BR TO SET NEW VALUEy303$:1:z CMPB #TC.HFF,-2(R1) ;IS THIS A FORMFEED CHARACTERISTIC?8{ BNE NXTCHR ;IF NE, NO...LOOP FOR NEXT CHARACTERISTIC=| BIC #U2.HFF,U.CW2-U.TSTA(R5) ;Y - CLEAR OLD FORMFEED VALUE }305$:H5~ BISB R0,U.CW2+1-U.TSTA(R5) ;SET NEW FORMFEED VALUE + BR NXTCHR ;LOOP FOR NEXT CHARACTERISTIC € .ENDC ;T$$SMC�‚.PAGE#6ƒ .SBTTL . ERROR HANDLING FOR GET/SET CHARACTERISTICS„;4'…; ERRORS IN SF.GMC OR SF.SMC REQUESTS.†;‡ .IF DF T$$GMC!T$$SMCWˆH‰ERCNIH: MOV #!,R0 ;ILLEGAL CHARACTERISTIC TYPEŠ‹ .ENDC ;T$$GMC!T$$SMCIŒ �CHRFN1:H1Ž DEC R1 ;BACK UP CHARACTERISTIC BUFFER POINTERC� BR CHRFIN ;FINISH IT OFF�‘ .IF DF T$$SMC’:“ERCPRI: MOV #IE.PRI&377,R0 ;ATTEMPT TO EXCEED PRIVILEGES” BR CHRFN1 ;FINISH IT OFF•9–ERCVAL: TST (SP)+ ;CLEAN UP STACK FOR THIS ENTRY POINTT1— DEC R1 ;BACK UP CHARACTERISTIC BUFFER POINTER4 ˜ERCVL1:SB™ MOV #!,R0 ;ILLEGAL CHARACTERISTIC VALUEš BR CHRFIN ;FINISH IT OFF›JœERCFIX: MOV #!,R0 ;ATTEMPT TO CHANGE FIXED CHAR.� BR CHRFN1 ;FINISH IT OFFžŸ .IF DF D$$H11!D$$Z11!D$$V11 I¡ERCSPD: MOV #!,R0 ;INVALID SPEED FOR CONTROLLER0¢ BR CHRFN1 ;FINISH IT OFF£¤ .ENDC ;D$$H11!D$$Z11!D$$V11¥¦ .IFTF ;T$$SMC§K¨ERCNSC:: MOV #!,R0 ;NOT A SETTABLE CHARACTERISTICO© BR CHRFN1 ;FINISH IT OFFª« .IFT ;T$$SMC0¬,­ .IF DF T$$SPL!T$$SCA!T$$MHU!T$$ICS!T$$OOB®G¯ERCUPN: MOV #!,R0 ;STORAGE ALLOCATION FAILUREH° BR CHRFN1 ;FINISH IT OFF±,² .ENDC ;T$$SPL!T$$SCA!T$$MHU!T$$ICS!T$$OOB³%´ .IF DF T$$SCA!T$$MHU!T$$ICS!T$$OOB*µ@¶ERCIAA: MOV #!,R0 ;ILLEGAL AST ADDRESS· BR CHRFN1 ;FINISH IT OFF¸%¹ .ENDC ;T$$SCA!T$$MHU!T$$ICS!T$$OOBMº» .ENDC ;T$$SMC¼½ .IF DF T$$GTS!T$$GMC!T$$SMC¾ ¿CHRSUC:H1À MOV #IS.SUC,R0 ;SET SUCCESSFUL COMPLETION CODE.Á .ENDC ;T$$GTS!T$$GMC!T$$SMCà ÄCHRFIN:U0Å SUB I.PRM+2(R3),R1 ;GET OFFSET IN USER BUFFERÆ1Ç MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING.È&É JMP $IOFIN ;FINISH THE I/O REQUESTÊ.PAGED4Ë .SBTTL . GET/SET TERMINAL CHARACTERISTICS SUPPORT4Ì .SBTTL . MC*SP - TERMINAL SPEED (RCV/XMT/ANSWER)ÍÎ .IF DF T$00¤z<±|t÷tø tþfDATA$GMC!T$$SMCÏÐ;$)Ñ; GET/SET RECEIVE/TRANSMIT/ANSWER SPEED$Ò;ÓGÔ .IF DF D$$H11!D$$Z11!D$$V11 ;ONLY DH11, DZ11 AND DHV11 CAN SET SPEEDCÕ ÖMCRSP::I ×MCXSP::ØÙ .IF DF T$$MODÚ ÛMCASP::ÜÝ .ENDC ;T$$MODÞßà .IF DF T$$GMC&T$$SMCUáâ BEQ 310$ ;GET SPEED - JUMPãä .ENDC ;T$$GMC&T$$SMCåæ .IF DF T$$SMCçè;R é; SET SPEEDDê;.,ë MOVB (R1)+,R0 ;SET SPEED - GET USER VALUE3ì BEQ ERCVAL ;IF EQ, INVALID CHARACTERISTIC VALUEEí CMP R0,#SPHI ;IN RANGE?8î BHI ERCVAL ;IF HI, NO...INVALID CHARACTERISTIC VALUE2ï CALL SPDPRM ;CALL CONTROLLER DEPENDENT ROUTINE,ð BCC 10$ ;IF CC, SUCCESSFUL SPEED SETTING?ñ MOV #ERCSPD,(SP) ;CHANGE RETURN ADDRESS TO PROCESS THE ERRORCò10$:-ó RETURN ;RETURN FOR MORE/ERROR COMPLETION3ôõ .ENDC ;T$$SMCö÷ .IF DF T$$GMCøù; ú; GET SPEED$û;*ü310$: MOV #100000,R0 ;INDICATE GET SPEED'ý INC R1 ;BUMP POINTER IN USER BUFFERE2þ CALL SPDPRM ;CALL CONTROLLER DEPENDENT ROUTINEÿ .IF DF T$$MOD" BIT #1000,R0 ;GET ANSWER SPEED? BEQ 320$ ;N - JUMP0 MOVB U.CW3+1-U.TSTA(R5),R0 ;GET ANSWER SPEED? BR 330$ ;JOIN COMMON CODED .ENDC ;T$$MOD 320$:G+  MOVB U.CW3-U.TSTA(R5),R0 ;GET SPEED BITS:'  CMPB -2(R1),#TC.XSP ;TRANSMIT SPEED?L-  BNE 330$ ;N - MUST BE RECEIVE SPEED, JUMPG  .IF DF R$$EIS< ASH #-4,R0 ;PUT TRANSMIT SPEED BITS INTO PROPER POSITION .IFF ;R$$EISS8 ASR R0 ;PUT TRANSMIT SPEED BITS INTO PROPER POSITION  ASR R0 ;  ASR R0 ;  ASR R0 ; .ENDC ;R$$EIS0330$: BIC #^C<17>,R0 ;CLEAR ALL BUT SPEED BITS .IF DF T$$SPL!T$$ONI$- MOV $DALED,KISAR6 ;MAP DRIVER SPEED TABLES2 ! .ENDC ;T$$SPL!T$$ONI)"*# MOV R4,-(SP) ;SAVE START OF SPEED TABLE/$ MOV #SPHI,R2 ;GET NUMBER OF ENTRIES IN TABLE %340$: CMPB R0,(R4)+ ;MATCH?E& BEQ 350$ ;Y - JUMP' SOB R2,340$ ;N - LOOPO2( MOV @SP,R4 ;UNRECOGNIZED SPEED - RETURN A ZERO))350$: SUB (SP)+,R4 ;GET OFFSET IN TABLEI*+ .IF DF T$$ONI!T$$SPL ,-- MOV I.PRM(R3),KISAR6 ;RESTORE TASK MAPPING ./ .ENDC ;T$$ONI!T$$SPL 0'1 MOVB R4,-1(R1) ;STORE IN USER BUFFER+2 RETURN ;RETURN FOR NEXT CHARACTERISTIC234 .ENDC ;T$$GMC56.PAGE)7 .SBTTL . MCPAR/MCEPA - PARITY OPTIONS8;V49; GET/SET PARITY GENERATION AND CHECKING AND SENSE:;, ; .ENABL LSB< =MCPAR:: >? .IF DF T$$GMC&T$$SMCL@8A BEQ 1000$ ;GET PARITY GENERATION AND CHECKING - JUMPBC .ENDC ;T$$GMC&T$$SMCIDE .IF DF T$$SMCFG;T&H; SET PARITY GENERATION AND CHECKINGI;T8J BIC #U3.PAR,U.CW3-U.TSTA(R5) ;ASSUME DISABLING PARITY K TSTB (R1)+ ;CHECK ASSUMPTIONL BEQ 1010$ ;CORRECT - JUMPAFM BIS #U3.PAR,U.CW3-U.TSTA(R5) ;ENABLE PARITY GENERATION AND CHECKING8N BR 1010$ ;JOIN COMMON CODE TO CHANGE LINE PARAMETERSOP .ENDC ;T$$SMCQR .IF DF T$$GMCST;A&U; GET PARITY GENERATION AND CHECKINGV;QW1000$:+X CLRB (R1) ;ASSUME PARITY IS NOT ENABLED+Y BIT #U3.PAR,U.CW3-U.TSTA(R5) ;CHECK THATCZ BEQ 1030$ ;CORRECT - JUMPR*[ INCB (R1) ;SHOW THAT PARITY IS ENABLED7\ BR 1030$ ;JOIN COMMON CODE TO CHECK LINE PARAMETERSH]^ .ENDC ;T$$GMC_`;Ca; GET/SET PARITY SENSEb;U cMCEPA::(de .IF DF T$$GMC&T$$SMC f&g BEQ 1020$ ;GET PARITY SENSE - JUMPhi .ENDC ;T$$GMC&T$$SMCjk .IF DF T$$SMClm;Dn; SET PARITY SENSEo; p;q BIC #U3.OPA,U.CW3-U.TSTA(R5) ;ASSUME SETTING EVEN PARITYS r TSTB (R1)+ ;CHECK ASSUMPTIONs BNE 1010$ ;CORRECT - JUMPK/t BIS #U3.OPA,U.CW3-U.TSTA(R5) ;SET ODD PARITYRu1010$:7v MOV #6000,R0 ;INDICATE DEVICE DEPENDENT SPEED FORMAT .w BISB U.CW3-U.TSTA(R5),R0 ;GET CURRENT SPEED8x BR 1040$ ;RESET TO CURRENT SPEED AND PARITY SETTINGSyz .ENDC ;T$$SMC{| .IF DF T$$GMC}~; ; GET PARITY SENSE€;;�1020$: ‚ CLRB (R1) ;ASSUME ODD PARITYƒ ASSUME U3.OPA,100000#„ TST U.CW3-U.TSTA(R5) ;CHECK THAT(… BMI 1030$ ;CORRECT - JUMPS† INCB (R1) ;SHOW EVEN PARITYN‡1030$:ˆ INC R1 ;BUMP POINTER%‰00¤‚5Ž{´cÚµcÛ¶c�·c›’ MOV #100000,R0 ;INDICATE GET SPEEDPŠ‹ .ENDC ;T$$GMCŒ� .IF DF T$$GMC ! T$$SMC ;NŽ1040$:8� CALL CTRPRM ;MAKE SURE INTERFACE HAS SETTABLE PARITY5� RETURN ;RETURN TO CALLER FOR NEXT CHARACTERISTICS‘’ .ENDC ;DF T$$GMC ! T$$SMC““ ; LK710 B“ .SBTTL . MCCLN - SETTING (7/8-BIT) CHARACTER LENGTH ; LK710“ ; LK7100“; ; LK710,“; GET/SET CHARACTER LENGTH ; LK710“; ; LK710“ ; LK7100“MCCLN:: ; LK710“ ; LK710 $“ .IF DF T$$GMC&T$$SMC ; LK710“ ; LK710$0“ BEQ 1050$ ;GET CHAR LENGTH - JUMP ; LK710“ ; LK710T&“ .ENDC ; T$$GMC&T$$SMC ; LK710“ ; LK710R“ .IF DF T$$SMC ; LK710“ ; LK710 “; ; LK710,“; SET 7-BIT CHARACTER LENGTH ; LK710“; ; LK7108“ BIC #S5.CLN,U.TST5-U.TSTA(R5) ;ASSUME 8-BIT ; LK710+“ TSTB (R1)+ ;CHECK ASSUMPTION ; LK710)“ BEQ 1060$ ;CORRECT - JUMP ; LK710L5“ BIS #S5.CLN,U.TST5-U.TSTA(R5) ;SET 7-BIT ; LK710 A“ BR 1060$ ; JOIN COMMON CODE TO CHANGE LINE PARAMETERS ; LK710M“ ; LK710 “ .ENDC ;T$$SMC ; LK710$“ ; LK710“ .IF DF T$$GMC ; LK710“ ; LK710“; ; LK710'“; GET CHARACTER LENGTH ; LK710E“; ; LK710“ ; LK7100“1050$: ; LK710S'“ CLRB (R1) ;ASSUME 8-BIT ; LK710R6“ BIT #S5.CLN,U.TST5-U.TSTA(R5) ;CHECK THAT ; LK710)“ BEQ 1070$ ;CORRECT - JUMP ; LK710T*“ INCB (R1) ;SET 7-BIT LENGTH ; LK710?“ BR 1070$ ;JOIN COMMON CODE TO CHECK LINE PARAMETERS ; LK710 “ ; LK710N“ .ENDC ;T$$GMC ; LK710 “ ; LK710F“ ; LK7107“ .IF DF T$$SMC ; LK710“ ; LK710E;“1060$: MOV #10000,R0 ;INDICATE SET 7-BIT LENGTH ; LK710 “ BR 1080$ ; LK710“ ; LK710C$“ .ENDC ; DF T$$SMC ; LK710“ ; LK710-“ .IF DF T$$GMC ; LK710“ ; LK710E*“1070$: INC R1 ;BUMP POINTER ; LK7100“ MOV #20000,R0 ;INDICATE GET LENGTH ; LK710“ ; LK710R%“ .ENDC ;DF T$$GMC ; LK710“ ; LK710 &“ .IF DF T$$GMC ! T$$SMC ; LK710“ ; LK710F“1080$: ; LK710@“ CALL CTRPRM ;MAKE SURE INTERFACE HAS SETTABLE LENGTH ; LK710>“ RETURN ;RETURN TO CALLER FOR NEXT CHARACTERISTICS ; LK710“ ; LK710S.“ .ENDC ;DF T$$GMC ! T$$SMC ; LK710“ ; LK7100“ ; LK710E ” .DSABL LSBR•–;P9—; LOCAL SUBROUTINE TO CALL CONTROLLER-DEPENDENT ROUTINE ˜;7 ™SPDPRM: &š CMPB -2(R1),#TC.RSP ;RECEIVE SPEED?› BEQ 10$ ;IF EQ, YES...SKIP(œ BIS #400,R0 ;N - FLAG TRANSMIT SPEED�10$:žŸ .IF DF T$$MOD %¡ CMPB -2(R1),#TC.ASP ;ANSWER SPEED? ¢ BNE CTRPRM ;IF NE, NO...SKIP&£ BIS #1000,R0 ;Y - FLAG ANSWER SPEED¤¥ .ENDC ;T$$MOD¦ §CTRPRM: ¨ MOV R1,-(SP) ;Save R1-© CLR R1 ;Indicate not flow control change. ª« .ENDC ;D$$H11!D$$Z11!D$$V11¬­ .ENABLE LSB®¯CTRPR2: MOV #10$,-(SP);° CALL MPCCOR ;MAP DRIVER DATA AND RETURN AS A CO-ROUTINE 7± MOV #CT.PRM,R2 ;SET INDEX FOR LINE PARAMETER ROUTINE.²³ .IF DF T$$OVL´*µ MOV #CTRD,-(SP) ;GET ADDRESS OF ROUTINE ¶ CALL MPROT ;AND GOTO ROUTINE:· RETURN ;CAN'T USE CALLR CAUSE OF STACK INPUT TO MPROT¸¹ .IFF ;T$$OVLWº9» CALLR CTRD ;CALL CONTROLLER ROUTINE AND PRESERVE CC-C ¼½ .ENDC ;T$$OVL¾10$:-¿ MOV (SP)+,R1 ;Restore R1 and preserve CC-C1À RETURN ;DoneÁ;N .DSABLE LSBÃÄ.PAGE1Å=Æ .SBTTL . MCTSY, MCHSY, MCBIN - FLOW CONTROL STATUS CHANGEN Ç .ENABL LSBP"ÈMCTSY:: ; OUTPUT FLOW CONTROLÉÊ .IF DF T$$GMC&T$$SMCLË2Ì BEQ 9100$ ;GET OUTPUT FLOW CONTROL INFO - JUMPÍÎ .ENDC ;T$$GMC&T$$SMCÏÐ .IF DF T$$SMCÑÒ;EÓ; SET OUTPUT FLOW CONTROLÔ;F6Õ MOV #^B<1000>,-(SP) ; ASSUME NO OUTPUT FLOW CONTROL8Ö BIC #S3.TSY,-U.TSTA(R5) ; ASSUME NO TTSYNCH!× TSTB (R1)+ ; CHECK ASSUMPTION-)Ø BEQ 9900$ ; CORREC00¤Š<±|t÷tø tþfDATAT - NOTIFY THE PORTB2Ù BIS #S3.TSY,-U.TSTA(R5) ; SET TTSYNCH8Ú MOV #^B<0100>,(SP) ; SET FLAG FOR ENABLE FLOW CONTROLÛ BR 9900$ ; NOTIFY THE PORTÜÝ .ENDC ;T$$SMCÞß .IF DF T$$GMCà3á9100$: CLRB (R1) ; ASSUME NO OUTPUT FLOW CONTROLT-â BIT #S3.TSY,-U.TSTA(R5) ; CHECK ã BEQ 9950$ ; CORRECT - RETURN(ä INCB (R1) ; SHOW OUTPUT FLOW CONTROLå BR 9950$ ; AND RETURNSæç .ENDC ;T$$GMCè!éMCHSY:: ; Input flow controlAêë .IF DF T$$GMC&T$$SMCOì1í BEQ 9200$ ;Get input flow control info - JumpSîï .ENDC ;T$$GMC&T$$SMC#ðñ .IF DF T$$SMCòó;Aô; Set input flow controlõ;N5ö MOV #^B<0010>,-(SP) ; ASSUME NO INPUT FLOW CONTROLG7÷ BIC #S4.HSY,-U.TSTA(R5) ; Assume no HSYNCHO!ø TSTB (R1)+ ; Check assumptionA)ù BEQ 9900$ ; Correct - Notify the portE1ú BIS #S4.HSY,-U.TSTA(R5) ; Set HSYNCHB8û MOV #^B<0001>,(SP) ; SET FLAG FOR ENABLE FLOW CONTROLü BR 9900$ ; Notify the portýþ .ENDC ;T$$SMCÿ .IF DF T$$GMC29200$: CLRB (R1) ; Assume no input flow control- BIT #S4.HSY,-U.TSTA(R5) ; Check  BEQ 9950$ ; Correct - Return( INCB (R1) ; Show output flow control BR 9950$ ; And return. .ENDC ;T$$GMC  MCBIN:: ; Read Pass All   .IF DF T$$GMC&T$$SMC0 , BEQ 9300$ ;Get read pass all info - Jump .ENDC ;T$$GMC&T$$SMCY .IF DF T$$SMC;E; Set read pass allC;L6 MOV #^B<1000>,-(SP) ; ASSUME NO OUTPUT FLOW CONTROL; BIS #S3.RAL,-U.TSTA(R5) ; Assume read pass allu! TSTB (R1)+ ; Check assumptionS) BNE 9900$ ; Correct - Notify the port ; BIC #S3.RAL,-U.TSTA(R5) ; Set no read pass all 4 BIT #S3.TSY,-U.TSTA(R5) ; TTSYNCH now?9 BEQ 9900$ ; If EQ no - Notify port of no flow control9 MOV #^B<0100>,(SP) ; Set the output flow control flags$  BR 9900$ ; Notify the port!" .ENDC ;T$$SMC#$ .IF DF T$$GMC%.&9300$: CLRB (R1) ; Assume not read pass all-' BIT #S3.RAL,-U.TSTA(R5) ; Checkm ( BEQ 9950$ ; Correct - Return") INCB (R1) ; Show read pass all* BR 9950$ ; And return+, .ENDC ;T$$GMC-. .IF DF T$$SMC/0;dA1; Notify the port of the flow control status change. The flags2; are passed in R1.-3;f449900$: MOV (SP),-(SP) ; Duplicate the top of stack5 MOV R1,2(SP) ; Save R1l!6 MOV (SP)+,R1 ; Settup the flagt)7 CALLR CTRPR2 ; Call the port and exitC89 .ENDC ;T$$SMC:; .IF DF T$$GMC<=9950$:)> INC R1 ; POINT TO NEXT CHARACTERISTIC$? RETURN ; All done with this one@A .ENDC ;T$$GMCB C .DSABL LSB0D.PAGErEF*G .SBTTL . MCTTP - TERMINAL TYPE OPTIONSH;I; GET/SET TERMINAL TYPEtJ;o KMCTTP::tLM .IF DF T$$GMC&T$$SMC N&O BEQ 460$ ;GET TERMINAL TYPE - JUMPPQ .ENDC ;T$$GMC&T$$SMCsRS .IF DF T$$SMCTU;lV; SET TERMINAL TYPE.LW; IF THE TYPE IS RECOGNIZED (CONTAINED IN THE TABLES TTYP1, TTYP2, TTYP3),LX; SET THE CORRESPONDING IMPLICIT CHARACTERISTICS. IMPLICIT CHARACTERISTICSY; ARE: Z; TC.HHT [; TC.HFF \; TC.HFL ]; TC.LPP ^; TC.SCP _; TC.VFL `; TC.WIDa;7b; IN ADDITION, THE CURSOR POSITIONING TYPE IS STORED.Ec; 0d; IN ANY CASE, STORE NEW TYPE VALUE IN U.TTYP.e;Tf CLR R2 ;GET NEW TYPE VALUE-g BISB @R1,R2 ;WITHOUT SIGN EXTEND PROBLEMSs"h BEQ 440$ ;ZERO - UNKNOWN, JUMP*i CMPB R2,#TTPHI ;IN TERMINAL TYPE TABLE?j BHI 440$ ;N - UNKNOWN, JUMPTk1l MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGT/m TSTB TTYP2-1(R2) ;UNSUPPORTED TERMINAL TYPE?Rn BEQ 435$ ;Y - JUMPAo BIC #U2.CRT,U.CW2-U.TSTA(R5) ;ASSUME 0 FOR ALL CHARACTERISTICS=p BIC #S4.HFF!S4.HHT!S4.HFL!S4.VFL,6(R5) ;MORE BITS TO CLEAR Cq BIC #U3.UPC,U.CW3-U.TSTA(R5) ;ASSUME TERMINAL SUPPORTS LOWERCASE;r CMPB R2,#T.AS35 ;CHECK THAT+s BHI 400$ ;ASSUMPTION WAS CORRECT - JUMP0>t BIS #U3.UPC,U.CW3-U.TSTA(R5) ;FORCE CONVERSION TO UPPERCASE9u400$: MOVB TTYP1-1(R2),R0 ;GET IMPLICIT CHARACTERISTICSI,v BICB #300,R0 ;CLEAR OUT CURS00¤’5Ž{´cÚµcÛ¶c�·c›’OR POS. TYPEw;(<x; HFF,HFL,HHT,VFL MUST BE IN THE LOW BYTE OF STATUS WORD 4y;2z .IIF GE S4.HFF-400 .ERROR{ .IIF GE S4.HFL-400 .ERROR| .IIF GE S4.HHT-400 .ERROR} .IIF GE S4.VFL-400 .ERROR7~ BISB R0,6(R5) ;STORE IMPLICIT CHARACTERISTICS IN LOWT ;BYTE OF STATUS WORD 4C€ BIC #U2.HFF,U.CW2-U.TSTA(R5) ;ASSUME NEW TYPE DOESN'T SUPPORT FF#4� BITB #S4.HFF,R0 ;WAS FORMFEED CHARACTERISTIC SET?‚ BEQ 420$ ;N - JUMP>ƒ BIS #U2.HFF,U.CW2-U.TSTA(R5) ;INDICATE TERMINAL SUPPORTS FF„420$:P?… MOVB TTYP2-1(R2),U.CW4-U.TSTA(R5) ;STORE IMPLICIT PAGE WIDTHAA† MOVB TTYP3-1(R2),U.TLPP-U.TSTA(R5) ;STORE IMPLICIT PAGE LENGTH0 ‡ BPL 430$ ;NOT A SCOPE - JUMP:ˆ BICB #200,U.TLPP-U.TSTA(R5) ;CLEAR SCOPE FLAG IN U.TLPP=‰ BIS #U2.CRT,U.CW2-U.TSTA(R5) ;INDICATE TERMINAL IS A SCOPEŠ430$:2‹<Œ .IIF LT S4.ABD-400 .ERROR ; ABD MUST BE IN THE HIGH BYTE�DŽ BICB #^C,7(R5) ;SET EXTENDED TERMINAL CHARACTERISTICS� BISB TTYP4-1(R2),7(R5) ; ...D�435$: ;REFERENCE LABEL-‘ MOV I.PRM(R3),KISAR6 ;RESTORE TASK MAPPINGT’440$:C1“ MOVB (R1),U.TTYP-U.TSTA(R5) ;SET TERMINAL TYPE5@” BIC #U2.L3S!U2.VT5,U.CW2-U.TSTA(R5) ;CLEAR TERMINAL TYPE BITS• CMPB (R1)+,#T.L30S ;LA30S?;– BNE 450$ ;N - JUMP?— BIS #U2.L3S,U.CW2-U.TSTA(R5) ;OTHERWISE, SET LA30S TYPE FLAG˜ BR 455$ ;SKIP TO FINISH.#™450$: CMPB -1(R1),#T.VT05 ;VT05B?Hš BNE 455$ ;IF NE, NO...SKIP?› BIS #U2.VT5,U.CW2-U.TSTA(R5) ;OTHERWISE, SET VT05B TYPE FLAG-œ455$:5+� RETURN ;RETURN FOR NEXT CHARACTERISTICVžŸ .ENDC ;T$$SMC ¡ .IF DF T$$GMC¢£;¤; GET TERMINAL TYPEA¥;;¦460$:N<§ MOVB U.TTYP-U.TSTA(R5),(R1)+ ;GIVE USER THE TERMINAL TYPE+¨ RETURN ;RETURN FOR NEXT CHARACTERISTIC©ª .ENDC ;T$$GMC«¬.PAGEL3­ .SBTTL . MCTBF - TYPEAHEAD BUFFER COUNT OPTIONS®; B¯; FLUSH TYPEAHEAD OR GET TYPEAHEAD BUFFER ACTIVE CHARACTER COUNT°; ±MCTBF::.²³ .IF DF T$$GMC&T$$SMCU´µ BEQ 510$ ;GET COUNT - JUMP¶· .ENDC ;T$$GMC&T$$SMC ¸¹ .IF DF T$$SMCº»;V¼; FLUSH THE TYPE-AHEAD BUFFERF½;$%¾ INC R1 ;SKIP PAST DUMMY SET VALUE9¿ CALL MPCCOR ;MAP DATABASE AND COME BACK AS CO-ROUTINETÀÁ .IF DF T$$OVLÃ!Ä MOV #I1CTXL,-(SP) ;GET ADDRESS0Å CALL MPROT ;CALL ROUTINE TO FLUSH TYPE AHEAD Æ RETURN ;BACK FROM COROUTINEÇÈ .IFF ;T$$OVLYÉ9Ê CALLR I1CTXL ;FLUSH TYPE-AHEAD BUFFER WITH INTERRUPTSË ;LOCKED OUTFÌ .ENDC ;T$$OVLÍÎ .ENDC ;T$$SMCÏÐ .IF DF T$$GMCÑÒ;$9Ó; GET THE NUMBER OF CHARACTERS IN THE TYPE-AHEAD BUFFER Ô;AÕ510$:EÖ× .IF DF T$$SPLØ7Ù MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP THE UCBX AND TABUF #Ú MOV #120000+U.TTBF,R2 ;GET TABUF.ÛÜ .IFF ;T$$SPLMÝ1Þ MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGUß&à MOV U.TTAB-U.TSTA(R5),R2 ;GET TABUFáâ .IFTF ;T$$SPLã,ä MOVB 2(R2),R2 ;GET ACTIVE CHARACTER COUNTåæ .IFF ;T$$SPLRç(è MOV I.PRM(R3),KISAR6 ;MAP USER BUFFERéê .ENDC ;T$$SPLë'ì MOVB R2,(R1)+ ;STORE COUNT IN BUFFERUí+î RETURN ;RETURN FOR NEXT CHARACTERISTICAïð .ENDC ;T$$GMCñ.PAGEL8ò .SBTTL . MCTYP/MCTBS - TYPEAHEAD BUFFER SIZE OPTIONSó;.ô; GET/SET TYPEAHEAD BUFFER PRESENCE AND SIZEõ;$ö÷ .IF DF T$$SPLø ù .ENABL LSBRú ûMCTYP::Nüý .IF DF T$$GMC&T$$SMCRþ!ÿ BEQ 520$ ;GET PRESENCE - JUMP .ENDC ;T$$GMC&T$$SMCI .IF DF T$$SMC; 1; ENABLE TYPEAHEAD WITH AN OPTIMAL DEFAULT SIZEF;; MOV #<<2*64.>->,R2 ;COMPUTE OPTIMAL TABUF SIZEE)  TSTB (R1)+ ;ASSUME ENABLING TYPEAHEADT  BNE 530$ ;CORRECT - JUMP!  CLR R2 ;INDICATE NO TYPEAHEADS  BR 530$ ;ENFORCE THATT  .ENDC ;T$$SMC .IF DF T$$GMC; K; RETURN WHETHER TYPEAHEAD IS ENABLED OR DISABLED (ENABLED IMPLIES A SIZE.; OF 2 OR GREATER);2520$: MOVB #1,(R1)+ ;ASSUME TYPEAHEAD IS ENABLED BR 580$ ;CHECK THAT  .ENDC ;T$$GMC;P!; GET/SET TYPEAHEAD BUFFER SIZEF; MCTBS::<  .IF DF T$$GMC&T$$SMCE!" BEQ 570$ ;GET COUNT - JUMP#$00¤š<±|t÷tø tþfDATA .ENDC ;T$$GMC&T$$SMC%& .IF DF T$$SMC'(;5); SET THE SIZE OF THE TYPEAHEAD BUFFER (0 -> 255.).T4*; A SIZE OF ZERO OR ONE IMPLIES TYPEAHEAD DISABLED+;%, CLR R2 ;PREPARE TO PICK UP A BYTE -- BISB (R1)+,R2 ;GET THE USER SPECIFIED SIZEO).530$: MOV R1,-(SP) ;SAVE BUFFER POINTERS>/ MOV #120000+U.TAST,R1 ;SET POINTER TO UNSOLICITED INPUT ACB 0X = U.TAST12 .IF DF T$$CCA364 MOV (R1)+,-(SP) ;SAVE UNSOLICITED INPUT ACB ADDRESS 5X = X + 267 .ENDC ;T$$CCA89 .IF DF T$$SCA:; ASSUME U.TSCA,X <X = X + 25= MOV (R1)+,-(SP) ;SAVE SWITCH CHARACTER ACB ADDRESS>>? .ENDC ;T$$SCA@A .IF DF T$$MHUBC ASSUME U.TMHA,X DX = X + 2;1E MOV (R1)+,-(SP) ;SAVE MODEM HANGUP ACB ADDRESSHFG .ENDC ;T$$MHUHI .IF DF T$$ICSJK ASSUME U.TICA,X LX = X + 20,M MOV (R1)+,-(SP) ;SAVE ICS ACB/TEP ADDRESSNO .ENDC ;T$$ICSPQ .IF DF T$$OOBRS ASSUME U.TOBA,X TX = X + 2I,U MOV (R1)+,-(SP) ;SAVE OOB ACB/TEP ADDRESSVW .ENDC ;T$$OOBXY MOV R2,R1 ;PUT SIZE IN R1 "Z BNE 540$ ;SETTING NOTYPEAHEAD? [ MOV #1,R1 ;Y - SET SIZE TO 1\540$: MOV R1,-(SP) ;SAVE SIZE$<] ADD #T$$UXL+4+77,R1 ;COMPUTE TOTAL NUMBER OF BYTES NEEDED:^ ASH #-6,R1 ;CONVERT TO NUMBER OF SECONDARY POOL BLOCKS)_ CALL $ALSEC ;ATTEMPT TO ALLOCATE THEM` BCS 560$ ;FAILURE - JUMP<a MOV R0,-(SP) ;SAVE ADDRESS OF SEC POOL RETURNED BY $ALSEC7b MTPS #TTPRI ;PREVENT INTERRUPTS WHILE CHANGING SIZE1cd .IF DF T$$OVLe,f MOV $DALED,KISAR6 ;;MAP TO DATA FOR MPROT<g MOV #DEUCBX,-(SP) ;;DEALLOCATE THE CURRENT UCBX AND TABUFh CALL MPROT ;; ... ij .IFF ;T$$OVL-k3l CALL DEUCBX ;;DEALLOCATE CURRENT UCBX AND TABUFUmn .IFTF ;T$$OVLo*p MOV (SP)+,R0 ;;RETRIEVE THE NEW ADDRESS1q MOVB (SP),U.TBSZ-U.TSTA(R5) ;;SET THE NEW SIZEE/r BIS #S3.TAB,4(R5) ;;ASSUME SETTING TYPEAHEAD s DEC (SP)+ ;;CHECK THATt BNE 550$ ;;CORRECT - JUMPI&u BIC #S3.TAB,4(R5) ;;SET NOTYPEAHEADv550$:w .IFT ;T$$OVLx4y MOV #STUCBX,-(SP) ;;CREATE THE NEW UCBX AND TABUFz CALL MPROT ;; ... %{ MOV I.PRM(R3),KISAR6 ;; REMAP TASKO|} .IFF ;T$$OVLF~/ CALL STUCBX ;;CREATE THE NEW UCBX AND TABUFU€� .ENDC ;T$$OVL‚:ƒ MOV #120000+X,R1 ;;POINT TO FIRST UCBX CELL TO BE MOVED„@… .IIF DF T$$OOB, MOV (SP)+,-(R1) ;;RESTORE OOB ACB/TEP POINTER@† .IIF DF T$$ICS, MOV (SP)+,-(R1) ;;RESTORE ICS ACB/TEP POINTERE‡ .IIF DF T$$MHU, MOV (SP)+,-(R1) ;;RESTORE MODEM HANGUP ACB POINTER$Eˆ .IIF DF T$$SCA, MOV (SP)+,-(R1) ;;RESTORE SWITCH CHAR. ACB POINTERDE‰ .IIF DF T$$CCA, MOV (SP)+,-(R1) ;;RESTORE UNSOL. INPUT ACB POINTERŠ!‹ MTPS #PR0 ;;ENABLE INTERRUPTSX,Œ MOV (SP)+,R1 ;RESTORE TASK BUFFER POINTER$� RETURN ;GET NEXT CHARACTERISTICŽ; >�; ALLOCATION FAILURE TRYING TO CREATE A NEW TYPEAHEAD BUFFER�;)‘560$:E’“STKPOP = X - U.TAST + 2F”.• ADD #STKPOP,SP ;CLEAR PARAMETERS FROM STACK,– MOV (SP)+,R1 ;RESTORE TASK BUFFER POINTER.— TST (SP)+ ;CLEAN RETURN ADDRESS FROM STACK)˜ JMP ERCUPN ;REPORT ALLOCATION FAILURE ™š .ENDC ;T$$SMC›œ .IF DF T$$GMC�ž;E(Ÿ; GET THE SIZE OF THE TYPEAHEAD BUFFER ;;¡570$:TD¢ MOVB U.TBSZ-U.TSTA(R5),(R1)+ ;GET SIZE ASSUMING TYPEAHEAD ENABLED£580$:H+¤ BIT #S3.TAB,4(R5) ;IS TYPEAHEAD ENABLED?Y¥ BNE 590$ ;CORRECT - JUMP ¦ CLRB -1(R1) ;RETURN SIZE = 0§590$:U$¨ RETURN ;GET NEXT CHARACTERISTIC©ª .ENDC ;T$$GMC« ¬ .DSABL LSB ­® .ENDC ;T$$SPL¯°.PAGET$± .SBTTL . MCCTS - CONTROL-S STATE²;³; GET/SET CONTROL-S STATUS´;L µMCCTS::¶· .IF DF T$$GMC&T$$SMC ¸"¹ BEQ 630$ ;GET ^S STATUS - JUMPº» .ENDC ;T$$GMC&T$$SMC7¼½ .IF DF T$$SMC¾¿;,À; SET OR CLEAR ^S CONDITIONEÁ;A0 MOVB (R1)+,R2 ;GET NEW VALUE FROM USER BUFFER>à CALL MPCCOR ;MAP DRIVER DATA AND COME BACK AS A CO-ROUTINEÄ TSTB R2 ;ARE WE SETTING ^S? Å BNE 610$ ;Y - JUMPÆ;HÇ; NOTE: DUE TO MAPPING COMPLICATIONS, THE FOLLOWING CODE IS DUPLICATEDÈ; FROM I1CTSL AND I1CTQL,É ;N - FAKE A ^Q. TASK MAPPED O00¤¢5Ž{´cÚµcÛ¶c�·c›’N RETURN#Ê CALL LOCKI ;LOCK OUT INTERRUPTSC,Ë BIC #S2.CTS,2(R5) ;;;CLEAR CONTROL-S FLAG2Ì MOV #CT.RES,R2 ;;;SET INDEX FOR "RESUME OUTPUT"BÍ BITB #US.OIU,U.STS-U.TSTA(R5) ;;;EXPECTING AN OUTPUT INTERRUPT?%Î BNE 660$ ;;;IF NE, NO...JUST EXITL Ï BR 620$-Ð610$: ;FAKE A ^S, RETURN WILL REMAP TASK#Ñ CALL LOCKI ;LOCK OUT INTERRUPTSE*Ò BIS #S2.CTS,2(R5) ;;;SET CONTROL-S FLAG0Ó MOV #CT.STP,R2 ;;;SET INDEX FOR "STOP OUTPUT"Ô620$:RÕ .IF DF T$$OVLÖ*× MOV #CTRD,-(SP) ;GET ADDRESS OF ROUTINE Ø CALL MPROT ;AND GOTO ROUTINE Ù RETURNCÚÛ .IFF ;T$$OVLAÜ3Ý CALLR CTRD ;;;CALL CONTROLLER DEPENDENT ROUTINEUÞß .ENDC ;T$$OVLàá .ENDC ;T$$SMCâã .IF DF T$$GMCäå;P!æ; GET TERMINAL ^S AND ^O STATUSTç;L1è630$: CLRB @R1 ;ASSUME NEITHER ^S OR ^O IS SETMéê ASSUME S2.CTS,100000Kë,ì TST 2(R5) ;VERIFY ASSUMPTION FOR ^S BIT&í BPL 640$ ;ASSUMED CORRECTLY - JUMP0î INCB @R1 ;ASSUMPTION WAS WRONG - SET THE BIT9ï640$: BIT #S2.CTO,2(R5) ;VERIFY ASSUMPTION FOR ^O BITOð"ñ BEQ 650$ ;^O IS NOT SET - JUMP6ò BISB #2,@R1 ;^O IS SET, SET CORRESPONDING USER BITó650$:O!ô INC R1 ;SKIP PAST VALUE FIELDô ; LK709ô .ENDC ;T$$GMC ; LK709 ô ; LK709A%ô .IF DF T$$GMC!T$$SMC ; LK709Eô ; LK709M3ô660$: RETURN ;GET NEXT CHARACTERISTIC ; LK709Eô ; LK709S%ô .ENDC ;T$$GMC!T$$SMC ; LK709 ô ; LK709Sø ;**-3-ù.PAGEB-ú .SBTTL . MCACD - ANCILLARY CONTROL DRIVERIûü .IF DF T$$ACDýþ; *ÿ; GET/SET ANCILLARY CONTROL DRIVER (ACD);T MCACD::S .IF DF T$$GMC&T$$SMC+ BEQ 810$ ;GET ACD IDENTIFICATION NUMBERK .ENDC ;T$$GMC&T$$SMC   .IF DF T$$SMC  ;3 ; SET/RESET THE ACD ASSOCIATED WITH THIS TERMINAL  ;M4 MOV R1,-(SP) ;SAVE CHARACTERISTICS BUFFER POINTER( MOV R3,-(SP) ;SAVE I/O PACKET POINTER1 CLR -(SP) ;ASSUME NO TARGET ACD WAS SPECIFIED # TSTB @R1 ;CHECK THAT ASSUMPTIONA BEQ 730$ ;VALID - JUMP;H; SEARCH THE ACB LIST (LISTHEAD IS $ACDHD) FOR THE PROTOTYPE ACB WHICHM; HAS THE SAME IDENTIFICATION NUMBER AS THE NUMBER SPECIFIED BY THE REQUESTI;I> MOV $ACDHD,R0 ;TARGET ACD SPECIFIED, FIND ITS PROTOTYPE ACB< BEQ 710$ ;THERE ARE NO ACDS IN THE SYSTEM - RETURN ERRORK700$: CMPB A.NUM(R0),@R1 ;HAVE WE FOUND THE MATCHING PROTOTYPE ACD BLOCK?  BEQ 720$ ;Y - JUMP- MOV A.LIN(R0),R0 ;N - GET NEXT ACB IN LISTF BNE 700$ ;KEEP LOOKING710$: TST (SP)+ ;CLEAN STACK + MOV (SP)+,R3 ;RESTORE I/O PACKET POINTER 7  MOV (SP)+,R1 ;RESTORE CHARACTERISTICS BUFFER POINTERI.! TST (SP)+ ;CLEAN RETURN ADDRESS FROM STACK&" JMP ERCVL1 ;RETURN BAD VALUE ERROR#$;S4%; FOUND THE ACB. CHECK IF CONNECTS ARE DISALLOWED&;O'I(720$: BITB #AS.DLT!AS.DIS,A.STA(R0) ;ACD MARKED FOR DELETE OR DISABLED?H)* BNE 710$ ;Y - ERRORK+;",; ATTEMPT TO ALLOCATE A FULL ACB-; 8. MOV R0,-(SP) ;SAVE R0 DESTROYED BY ALLOCATION ROUTINE+/ CLR R1 ;EXTRA STEP TO AVOID SIGN EXTENDP-0 BISB A.FLEN(R0),R1 ;SET LENGTH OF FULL ACB+1 2 CALL $ALOCB ;ALLOCATE AN ACB3;4 MOV R0,R2 ;COPY ACB ADDRESS WITHOUT AFFECTING CARRY BITC75 MOV (SP)+,R0 ;RESTORE R0 WITHOUT AFFECTING CARRY BIT.'6 BCS 710$ ;ALLOCATION FAILED - ERROR7;I8; SAVE THE ADDRESS OF THE FULL ACB, AND COPY THE COMMON FIELDS FROM THE9; PROTOTYPE ACB INTO IT:;2; MOV R2,@SP ;REPLACE ZERO WITH FULL ACB ADDRESS&< INC A.ACC(R0) ;UPDATE ACD USE COUNT0= MOV (R0)+,(R2)+ ;COPY RELOCATION BIAS (A.REL)7> MOV (R0)+,(R2)+ ;COPY DISPATCH TABLE POINTER (A.DIS)9? MOV (R0)+,(R2)+ ;COPY FIRST FUNCTION MASK WORD (A.MAS) <@ MOV (R0)+,(R2)+ ;COPY SECOND FUNCTION MASK WORD (A.MAS+2)<A MOV (R0),(R2) ;COPY ID NUMBER (A.NUM) AND LENGTH (A.FLEN)BC;OJD; IF THE TERMINAL IS CURRENTLY LINKED TO AN ACD, FIND THE PROTOTYPE ACB.JE; IF IT CANNOT BE FOUND THEN A SERIOUS ERROR HAS OCCURRED AND THE SYSTEMF; IS CRASHED.SG;I0H730$: MOV U.ACB-U.TSTA(R5),R2 ;GET CURRENT ACBI BEQ 770$ ;NONE -00¤ª<±|t÷tø tþfDATA JUMP(7J MOV $ACDHD,R0 ;SEARCH THE ACB LIST FOR ITS PROTOTYPEA;K BEQ 750$ ;LIST IS EMPTY YET TERMINAL HAS AN ACD - CRASHM>L740$: CMPB A.NUM(R0),A.NUM(R2) ;IS THIS THE RIGHT PROTOTYPE?M BEQ 760$ ;Y - JUMP3N MOV A.LIN(R0),R0 ;GET NEXT PROTOTYPE ACB IN LISTO BNE 740$ ;KEEP LOOKING<P750$: CRASH ;CAN'T FIND PROTOTYPE OF CURRENT ACD - CRASHQ;OMR; FOUND THE PROTOTYPE. DECREMENT THE USE COUNT AND DISCONNECT THE ACD FROM>S; THE TERMINAL. THEN ALERT THE ACD TO WHAT HAS TAKEN PLACE.T;J/U760$: DECB A.ACC(R0) ;DECREMENT THE USE COUNTT?V CLR U.ACB-U.TSTA(R5) ;DISASSOCIATE THE ACD FROM THE TERMINAL <W MOV #A.DISC,R1 ;SET TO CALL ACD AT DISCONNECT ENTRY POINT0X MOV R2,R0 ;MAKE ACB ADDRESS AVAILABLE TO ACDY CALL 790$ ;SWITCH TO ACDZ;SC[; COMPLETE DISCONNECT PROCESSING BY DEALLOCATING THE OLD FULL ACB \;R-] MOV R2,R0 ;COPY ADDRESS OF NOW UNUSED ACB.+^ CLR R1 ;EXTRA STEP TO AVOID SIGN EXTENDA-_ BISB A.FLEN(R0),R1 ;SET LENGTH OF FULL ACB `#a CALL $DEACB ;DEALLOCATE THE ACBEbc;R,d; CONNECT THE NEW ACD IF ONE WAS SPECIFIEDe;55f770$: MOV @SP,R0 ;GET THE NEW ACD FULL ACB ADDRESSI#g BEQ 780$ ;NONE SPECIFIED - EXITEh;PEi; INFORM THE ACD OF THE CONNECT AND THEN PERFORM THE CONNECT ITSELFSj; :k CLRB A.IOS(R0) ;ASSUME CONNECT REQUEST WILL BE ACCEPTED=l MOV #A.CONN,R1 ;SET TO CALL ACD AT ITS CONNECT ENTRY POINTW m CALL 790$ ;SWITCH TO THE ACDn$o MOV (SP),R0 ;GET THE ACB ADDRESS0p TSTB A.IOS(R0) ;WAS CONNECT REQUEST ACCEPTED?qr BEQ 775$ ;Y - JUMP+s CLR R1 ;EXTRA STEP TO AVOID SIGN EXTENDIBt BISB A.FLEN(R0),R1 ;SET LENGTH OF FULL ACB THE ACD HAS REJECTED#u CALL $DEACB ;DEALLOCATE THE ACBv BR 710$ ;RETURN AN ERRORLw775$: MOV R0,U.ACB-U.TSTA(R5) ;LINK THE ACB TO CONNECT ACD TO THE TERMINALx;Ny; SET/RESET EXIT PROCESSINGz;#{780$: TST (SP)+ ;CLEAN STACK +| MOV (SP)+,R3 ;RESTORE I/O PACKET POINTERO7} MOV (SP)+,R1 ;RESTORE CHARACTERISTICS BUFFER POINTERT+~ TSTB (R1)+ ;POINT TO THE NEXT PARAMETER+ RETURN ;RETURN FOR NEXT CHARACTERISTICT€; P�; SUBROUTINE TO SET UP STACK PARAMETERS AND THEN CALL THE EXECUTIVE SUBROUTINE<‚; WHICH SWITCHES FROM THE DRIVER TO THE ACD AND BACK AGAINƒ;E„790$:7(… MOV KINAR5,-(SP) ;SET CURRENT MAPPING†‡ .IF DF T$$COMˆ0‰ MOV KDSAR5,-(SP) ;SET CURRENT D-SPACE MAPPINGŠ‹ .ENDCŒ'� MOV R1,-(SP) ;SET ENTRY POINT OFFSETI<Ž JMP $SWAC1 ;JUMP TO ROUTINE TO AVOID EXTRA STACK STORAGE��‘ .ENDC ;T$$SMC’“ .IF DF T$$GMC”•;E=–; RETURN THE IDENTICATION NUMBER OF THE CURRENT ACD, IF ANYR—;E=˜810$: CLRB (R1)+ ;ASSUME THERE IS NO ACD FOR THIS TERMINALI-™ MOV U.ACB-U.TSTA(R5),R0 ;GET THE ACD BLOCKCš BEQ 820$ ;NONE - JUMP9:› MOVB A.NUM(R0),-1(R1) ;RETURN ITS IDENTIFICATION NUMBERœ820$:+� RETURN ;RETURN FOR NEXT CHARACTERISTICMžŸ .ENDC ;T$$GMC ¡ .ENDC ;T$$ACD¢£.PAGET6¤ .SBTTL . MCRMT - LOCAL/REMOTE/DIALOUT LINE STATUS¥;K¦; GET/SET REMOTE STATUS;§;C¨© .IF DF T$$MODª «MCRMT:: ¬­ .IF DF T$$GMC&T$$SMCR®*¯ BNE 100$ ;IF NE, SET NEW REMOTE STATUS°± .ENDC ;T$$GMC&T$$SMCC²³ .IF DF T$$GMC´µ;A¶; GET REMOTE STATUSH·; $¸ CLRB (R1)+ ;ASSUME LINE IS LOCAL7¹ BIT #U2.RMT,U.CW2-U.TSTA(R5) ;IS THIS A REMOTE LINE?/º BEQ 10$ ;IF EQ, NO...ASSUMPTION WAS CORRECTS&» INCB -1(R1) ;ASSUME LINE IS REMOTE.¼ BIT #S4.DLO,6(R5) ;IS THIS A DIAL-OUT LINE?/½ BEQ 10$ ;IF EQ, NO...ASSUMPTION WAS CORRECT +¾ INCB -1(R1) ;TELL USER LINE IS DIAL-OUT¿10$:+À RETURN ;RETURN FOR NEXT CHARACTERISTICEÁ .ENDC ;T$$GMCÃÄ .IF DF T$$SMCÅÆ;$&Ç; SET LINE REMOTE/NOREMOTE/DIAL-OUT.È;(É; THE STATE OF THE LINE IS AS FOLLOWS:Ê;S5Ë; LOCAL -> U2.RMT CLEAR, S4.DLO CLEAR, US.DSB CLEAR GÌ; INCOMING CALLS -> U2.RMT SET, S4.DLO CLEAR, US.DSB SET IF NO CALLERLÍ; OUTGOING CALLS -> U2.RMT SET, S4.DLO SET, US.DSB SET IF NO CALLER/CALLEEÎ;?Ï100$:1+Ð MOV I.TCB(R3),R0 ;GET ISSUING TASK'S TCBI1Ñ BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVILEGED?00¤²5Ž{´cÚµcÛ¶c�·c›’4Ò BEQ 190$ ;IF EQ, NO...RETURN PRIVILEGE VIOLATION@Ó BIT #U2.RMT,U.CW2-U.TSTA(R5) ;DETERMINE REMOTE STATUS OF LINE*Ô BNE 110$ ;IF NE, LINE IS REMOTE...SKIP.Õ TSTB @R1 ;IS USER SETTING THE LINE REMOTE?(Ö BNE 200$ ;IF NE, YES...SKIP TO DO IT-× INC R1 ;LINE IS ALREADY IN REQUESTED MODEB+Ø RETURN ;RETURN FOR NEXT CHARACTERISTICRÙ;TÚ; LINE IS REMOTE OR DIAL-OUTÛ;/Ü110$:.Ý TSTB (R1) ;IS USER SETTING THE LINE LOCAL?(Þ BEQ 200$ ;IF EQ, YES...SKIP TO DO ITß;SHà; RESET OR SWITCH BETWEEN REMOTE AND DIAL-OUT. DON'T HANGUP THE LINE.á;24â CMPB #1,(R1)+ ;IS USER SETTING THE LINE DIAL-OUT?3ã BNE 120$ ;IF NE, YES...SKIP TO MAKE IT DIAL-OUT +ä BIC #S4.DLO,6(R5) ;SET LINE DIAL-IN ONLYE+å RETURN ;RETURN FOR NEXT CHARACTERISTIC æ120$: 'ç BIS #S4.DLO,6(R5) ;SET LINE DIAL-OUTR+è RETURN ;RETURN FOR NEXT CHARACTERISTICEé;E+ê; ERROR PROCESSING FOR SET REMOTE OPTIONS)ë; ì190$:I.í TST (SP)+ ;CLEAN RETURN ADDRESS FROM STACK*î JMP ERCPRI ;RETURN PRIVILEGE VIOLATIONï;E<ð; HERE TO DISPATCH ON CONTROLLER TYPE TO CHANGE LINE STATEñ;;ò200$:Eóô .IF DF R$$MPLõ#ö MOV U.SCB-U.TSTA(R5),R0 ;GET SCBK÷ MOV S.KRB(R0),R0 ;GET KRB)ø MOVB K.PRM(R0),R0 ;GET CONTROLLER TYPE ùú .IFF ;R$$MPLAû1ü MOVB U.CTYP-U.TSTA(R5),R0 ;GET CONTROLLER TYPEAýþ .ENDC ;R$$MPLÿ* ADD R0,PC ;DISPATCH BY CONTROLLER TYPE BR RMTDL ;DL11 BR RMTDZ ;DZ11 BR RMTDH ;DH11 BR RMTDJ ;DJ11% CRASH ;DM11 - SHOULDN'T GET HEREU! BR RMTDC ;PRO VIDEO INTERFACEE BR RMTDV ;DHV11T  RETURN ;TTLH (LAT)A   .IF DF D$$M11   .IF DF R$$MPLRMTDH:# MOV U.SCB-U.TSTA(R5),R0 ;GET SCBB MOV S.KRB(R0),R0 ;GET KRB* MOVB K.CON(R0),R0 ;GET CONTROLLER INDEX( ASRB R0 ;CONVERT TO A COUNT (0 TO N) MOVB R0,-(SP) ;SAVE IT .IF DF T$$SPL!T$$ONIR+ MOV $DALED,KISAR6 ;MAP DRIVER DATA SPACE; .ENDC ;T$$SPL!T$$ONIB .IF DF T$$ONI0 MOV YMC12,R0 ;GET POINTER TO DM11-BB KRB LIST  .IFF ;T$$ONIE!0" MOV YMCP1,R0 ;GET POINTER TO DM11-BB KRB LIST#$ .ENDC ;T$$ONI%& .IF DF T$$SPL!T$$ONIM'*( MOV I.PRM(R3),KISAR6 ;REMAP TASK BUFFER)* .ENDC ;T$$SPL!T$$ONIG+7, CMPB L.NUM-L.KRB(R0),(SP)+ ;IS THIS KRB IN THE LIST?0,- BLOS RMTER ;IF LOS, NO...RETURN AN ERROR./ .IFF ;R$$MPL.01RMTDH:#2 MOV U.SCB-U.TSTA(R5),R0 ;GET SCB "3 TST S.DMCS(R0) ;GET DM11-BB CSR,4 BEQ RMTER ;IF EQ, NONE...REPORT AN ERROR56 .ENDC ;R$$MPL78 .ENDC ;D$$M119: .IF DF D$$VMD;<RMTDV:=> .ENDC ;D$$VMD?@ .IF DF D$$LMDABRMTDL:CD .ENDC ;D$$LMDEF .IF DF D$$ZMDGHRMTDZ:IJ .ENDC ;D$$ZMDK:L BIC #U2.RMT,U.CW2-U.TSTA(R5) ;ASSUME SETTING LINE LOCAL,M BIC #S4.DLO,6(R5) ;CANNOT DIAL OUT EITHER!N CMPB @R1,#1 ;ASSUMPTION TRUE?)O BLO 20$ ;IF LO, YES...GO SET IT LOCALU#P BEQ 15$ ;IF EQ, SET LINE REMOTE('Q BIS #S4.DLO,6(R5) ;SET LINE DIAL-OUTQR15$:5S BIS #U2.RMT,U.CW2-U.TSTA(R5) ;ALLOW INCOMING CALLS$T20$:*U INCB U.TMTI-U.TSTA(R5) ;SET MODEM TIMER9V BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIERC W TSTB (R1)+ ;LINE NOW REMOTE?*X BNE 30$ ;IF NE, YES...ALL DONE WITH IT5Y BICB #US.DSB,U.STS-U.TSTA(R5) ;LOCAL - ENABLE LINEZ30$:+[ RETURN ;RETURN FOR NEXT CHARACTERISTICR\; !]; LINE STATUS CANNOT BE CHANGED ^;E_` .IF NDF D$$M11abRMTDH:cd .ENDC ;NDF D$$M11ef .IF NDF D$$VMDIghRMTDV:ij .ENDC ;NDF D$$VMDkl .IF NDF D$$LMDCmnRMTDL:op .ENDC ;NDF D$$LMDqr .IF NDF D$$ZMDRstRMTDZ:uv .ENDC ;NDF D$$ZMDwxRMTDJ:yRMTDC:zRMTER:"{ TST (SP)+ ;CLEAN OFF THE STACK8| JMP ERCNSC ;RETURN NON-SETTABLE CHARACTERISTIC ERROR}~ .ENDC ;T$$SMC€ .ENDC ;T$$MOD�‚.PAGEO4ƒ .SBTTL . MCSSC - TERMINAL MGMT SWITCH CHARACTERS„… .IF DF T$$SCA†‡;F%ˆ; GET/SET FOR SET SWITCH CHARACTERSD‰;MHŠ; WHEN ISSUED VIA INTERNAL I/O, THE CHARACTERISTIC BUFFER FORMAT IS:‹;N+Œ; +-------------------------00¤º<±|t÷tø tþfDATA------------+$+�; 1 | RESERVED | TC.SSC | 0+Ž; |-------------------------------------|:&�; 3 | TEP ADDRESS OR 0 | 2+�; +-------------------------------------+H‘;EA’; THE ASSOCIATED TEP MUST BE PROPERLY FORMATTED WITH THE SWITCHG'“; CHARACTERS STORED IN OFFSET E.VSWC.I”;HC•; WHEN ISSUED FROM A TASK, THE CHARACTERISTIC BUFFER FORMAT IS:C–;T+—; +-------------------------------------+O+˜; 1 | RESERVED | TC.SSC | 0+™; |-------------------------------------|&š; 3 | AST ADDRESS OR 0 | 2+›; |-------------------------------------|-0œ; 5 | SWITCH CHARACTERS | 4+�; +-------------------------------------+Ež; ŸMCSSC::T:  MOV #U.TSCA,R4 ;SET OFFSET INTO UCBX OF ACB/TEP POINTER¡¢ .IF DF T$$SMC£A¤ MOV #S3.TME,R2 ;IDENTIFY FLAG TO ENABLE/DISABLE CHARACTERISTICF6¥ MOV #22.,R0 ;SET SIZE OF ACB TO ALLOCATE IF NEEDED¦§ .IFTF ;T$$SMC¨;© CALL GSAENC ;GET/SET STANDARD ASYNCH EVENT NOTIFICATION--ª ;IT MAY RETURN WITH INTERRUPTS DISABLED «¬ .IFT ;T$$SMC-­® .IF DF T$$GMC¯.° BVS 100$ ;IF VS, REQUEST WAS SF.GMC...SKIP±² .ENDC ;T$$GMC³5´ ;;;CO-ROUTINE DISABLED INTERRUPTS TIL WE FINISH..µ BNE 10$ ;;;IF NE, WE HAVE AN ACB TO MODIFY2¶ TST (R1)+ ;;;ELSE, USER CLEARED CHARACTERISTIC7· BR 1000$ ;;;RETURN TO GSAENC TO COMPLETE PROCESSING0¸10$:>¹ MOV (R1)+,A.PRM+6(R2) ;;;STORE SWITCH CHARACTERS IN THE ACBº» .IF DF T$$GMC¼,½ BR 1000$ ;;;SKIP TO RETURN TO CO-ROUTINE¾¿ .ENDC ;T$$GMCÀÁ .ENDC ;T$$SMCÂà .IF DF T$$GMCÄÅ;C-Æ; GET TERMINAL MANAGEMENT SWITCH CHARACTERS.Ç;È100$:N.É BNE 110$ ;IF NE, WE HAVE AN ACB/TEP...SKIP6Ê CLR (R1)+ ;INDICATE SWITCH CHARACTERS ARE DISABLED Ë BR 1000$ ;FINISH OFF REQUESTÌ110$: ÍÎ .IF DF R$$IICÏ9Ð BCC 120$ ;IF CC, CURRENT SETTING IS FOR AN ACB...SKIP0?Ñ MOV E.VSWC(R2),(R1)+ ;STORE SWITCH CHARACTERS IN USER BUFFERB+Ò BR 1000$ ;FINISH OFF THE CHARACTERISTICKÓ120$:UÔÕ .ENDC ;R$$IICÖ@× MOV A.PRM+6(R2),(R1)+ ;STORE SWITCH CHARACTERS IN USER BUFFERØÙ .ENDC ;T$$GMCÚÛ1000$:BÜ SUB #2,I.PRM+4(R3) ;CO-ROUTINE PROCESSED 2 MORE BYTES OF BUFFER6Ý RETURN ;RETURN TO CO-ROUTINE OR TO GET NEXT CHAR.Þ.PAGE2ß .SBTTL . MCTMM - EXIT TERMINAL MANAGEMENT MODEà; (á; GET/SET FOR TERMINAL MANAGEMENT MODEâ;Gã;O!ä; CHARACTERISTIC PACKET FORMAT:,å; æ; +------------------------+ç; | 0 | TC.TMM |è; +------------------------+é; êMCTMM::;ëì .IF DF T$$GMC&T$$SMC)í-î BEQ 2120$ ;GET TERMINAL MANAGEMENT STATUSïð .ENDC ;T$$GMC!T$$SMC:ñò .IF DF T$$SMCó;-Eô; CHECK FOR ERRORS, EITHER TRYING TO ENABLE TM WITH A QIO OR TRYINGT%õ; TO EXIT TM WHEN TM IS NOT ACTIVE..ö; ÷ TSTB (R1)+ ;EXITING TM?G4ø BNE 2110$ ;BR IF NOT. CANNOT ENABLE TM WITH QIO/ù BIT #S5.TMM,U.TST5-U.TSTA(R5) ;ARE WE IN TM?T2ú BEQ 2110$ ;TRYING TO EXIT WHEN WE'RE NOT IN IT+û MOV R1,-(SP) ;SAVE REGISTERS OVER KILLI1-ü MOV R3,-(SP)Mý;)þ; MAP UCBX, AND TERMINATE PENDING READS2ÿ;G  .IF DF T$$SPL  MOV #120000,R4 ;POINT TO UCBX7 MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP THE UCBX AND TABUFR  .IFF ;T$$SPLW 1 MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGI/ MOV U.TUX-U.TSTA(R5),R4 ;GET POINTER TO UCBX2  .IFTF ;T$$SPL - MOV #IS.TMM,R0 ;REASON FOR CANCELLED READSA  .IF DF T$$OVL  .IF DF T$$SPL  MOV $DALED,KISAR6  .ENDC ;T$$SPL , MOV #KILLI1,-(SP) ;GET ADDRESS OF ROUTINE  CALL MPROT ;AND GOTO ROUTINE  .IFF ;T$$OVL ( CALL KILLI1 ;TERMINATE PENDING READS  .ENDC ;T$$OVL ' MOV (SP)+,R3 ;RESTORE PACKET ADDRESS'! MOV (SP)+,R1 ;RESTORE BUFFER POINTERI;" BIC #S5.TMM,U.TST5-U.TSTA(R5) ;CLEAR TERMINAL MANG'T BIT4# $ .IF DF R$$IIC% "& BIS #S2.IRQ!S2.ORQ!S2.SRQ,2(R5)'' ;SET BITS TO POSSIBLY RESTART I/O ( ) .ENDC ;R$$IIC* + .IFF ;T$$SPL , 0- MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER. / .ENDC ;00¤Â5Ž{´cÚµcÛ¶c�·c›’T$$SPL0 +1 RETURN ;RETURN FOR NEXT CHARACTERISTIC2 3 .IF DF T$$OVL&T$$SPLC4 05 MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER6 7 .ENDC ;T$$OVL&T$$SPLS8 9 ;E: ; USER ERROR; ;P< 2110$:= JMP ERCVAL ;ILLEGAL VALUE5> ? .ENDC ;T$$SMC@ A .IF DF T$$GMCB C ; &D ; GET TERMINAL MANAGEMENT MODE STATEE ;!F 2120$:$G CLRB (R1)+ ;ASSUME TM NOT ACTIVE/H BIT #S5.TMM,U.TST5-U.TSTA(R5) ;IS TM ACTIVE? I BEQ 2130$ ;BR IF NOSJ INCB -1(R1) ;SAY ENABLEDK 2130$:+L RETURN ;RETURN FOR NEXT CHARACTERISTICCM N .ENDC ;T$$GMCO P .ENDC ;T$$SCAQ R .PAGEI4S .SBTTL . MCMHU - MODEM HANGUP EVENT NOTIFICATIONT U .IF DF T$$MHUV W ; *X ; GET/SET FOR MODEM HANG-UP NOTIFICATIONY ;AZ ; GET/SET PACKET:C,[ ; +-------------------------------------+.\ ; 1 | RESERVED | TC.MHU | 0,] ; |-------------------------------------|1^ ; 3 | ADDRESS OF AST (TASK) OR TEP (TSA) | 2Q,_ ; +-------------------------------------+` ; a MCMHU::R:b MOV #U.TMHA,R4 ;SET OFFSET INTO UCBX OF ACB/TEP POINTERc d .IF DF T$$SMCe Af MOV #S3.MHE,R2 ;IDENTIFY FLAG TO ENABLE/DISABLE CHARACTERISTIC6g MOV #20.,R0 ;SET SIZE OF ACB TO ALLOCATE IF NEEDEDh i .ENDC ;T$$SMCj ;k CALL GSAENC ;GET/SET STANDARD ASYNCH EVENT NOTIFICATION-l .m RETURN ;RETURN TO GET NEXT CHARACTERISTICn o .ENDC ;T$$MHUp q .PAGE-9r .SBTTL . MCICS - INPUT COUNT STATE EVENT NOTIFICATION s t .IF DF T$$ICSu v ;-1w ; GET/SET CHARACTERISTIC BUFFER FORMAT FOR ICS:Rx ;T,y ; +-------------------------------------+,z ; 1 | RESERVED | TC.ICS | 0,{ ; |-------------------------------------|1| ; 3 | ADDRESS OF AST (TASK) OR TEP (TSA) | 2 ,} ; +-------------------------------------+~ ;A ; € MCICS::T:� MOV #U.TICA,R4 ;SET OFFSET INTO UCBX OF ACB/TEP POINTER‚ ƒ .IF DF T$$SMC„ A… MOV #S3.ICE,R2 ;IDENTIFY FLAG TO ENABLE/DISABLE CHARACTERISTICF6† MOV #20.,R0 ;SET SIZE OF ACB TO ALLOCATE IF NEEDED‡ ˆ .ENDC ;T$$SMC‰ ;Š CALL GSAENC ;GET/SET STANDARD ASYNCH EVENT NOTIFICATION+‹ +Œ RETURN ;RETURN FOR NEXT CHARACTERISTIC � Ž .ENDC ;T$$ICS� � .PAGE-=‘ .SBTTL . MCOOB - OUT-OF-BAND CHARACTER EVENT NOTIFICATION ’ “ .IF DF T$$OOB” • ;-"– ; GET/SET OUT-OF-BAND CHARACTERS— ;#K˜ ; WHEN THIS CHARACTERISTIC IS ISSUED VIA INTERNAL I/O, THIS IS THE FORMAT)™ ; OF THE GET/SET CHARACTERISTIC BUFFER:Dš ;E,› ; +-------------------------------------+*œ ; 1 | RESERVED | TC.OOB | 0,� ; |-------------------------------------|1ž ; 3 | OOB TEP ADDRESS OR ZERO | 2O,Ÿ ; +-------------------------------------+  ; ;¡ ; NOTE THAT THE TEP MUST BE FORMATTED WITH THE BIT MASKS.F¢ ;OF£ ; WHEN ISSUED FROM A USER TASK, THE CHARACTERISTIC BUFFER FORMAT IS:¤ ;,¥ ; +-------------------------------------+)¦ ; 1 | RESERVED | TC.OOB | 0G,§ ; |-------------------------------------|+¨ ; 3 | OOB AST VIRTUAL ADDRESS | 2|,© ; |-------------------------------------|&ª ; 5 | OOB BIT MASK 1 | 4,« ; |-------------------------------------|&¬ ; 7 | OOB BIT MASK 2 | 6,­ ; |-------------------------------------|-® ; 11 | HELLO/CLEAR BIT MASK 1 | 10S,¯ ; |-------------------------------------|3° ; 13 | HELLO/CLEAR BIT MASK 2 | 12-,± ; |-------------------------------------|3² ; 15 | INCLUDE BIT MASK 1 | 14|,³ ; |-------------------------------------|3´ ; 17 | INCLUDE BIT MASK 2 | 16 ,µ ; +-------------------------------------+¶ ;-· ;-I· ; IN HELLO/CLEAR BIT MASKS, 0 => CLEAR OOB; 1 => HELLO OOB. ;SA459-H¹ ; CHARACTERS THAT ARE CLEAR OOB CANNOT ALSO BE INCLUDE OOB. ;**-1º ; » MCOOB::-:¼ MOV #U.TOBA,R4 ;SET OFFSET INTO UCBX OF ACB/TEP POINTER½ ¾ .IF DF T$$SMC¿ =À CLR R2 ;INDICATE NO FLAG TO ENABLE/DISABLE CHARACTERISTIC 6Á MOV #52.,R0 ;SET SIZE OF ACB TO ALLOCATE IF NEEDED à .IFTF ;T$$SMCÄ ;Å CALL GSAENC ;GET/SET STAND00¤Ê<±|t÷tø tþfDATAARD ASYNCH EVENT NOTIFICATION+-Æ ;IT MAY RETURN WITH INTERRUPTS DISABLED Ç È .IFT ;T$$SMCLÉ Ê .IF DF T$$GMCË .Ì BVS 100$ ;IF VS, REQUEST WAS SF.GMC...SKIPÍ Î .ENDC ;T$$GMCÏ 5Ð ;;;CO-ROUTINE DISABLED INTERRUPTS TIL WE FINISHV.Ñ BNE 10$ ;;;IF NE, WE HAVE AN ACB TO MODIFY4Ò ADD #12.,R1 ;;;ELSE, USER CLEARED CHARACTERISTIC-Ó BR 1000$ ;;;SKIP FOR RETURN TO CO-ROUTINEVÔ 10$:Õ ;TOÖ ; PERFORM CONSISTENCY CHECKS ON THE OOB BITMASKS SUPPLIED BY THE TASK. THETN× ; RULES SPECIFY THAT NO CLEAR-OOB CHARACTERS CAN BE INCLUDE-OOB AND THAT ALLNØ ; CLEAR-OOB AND INCLUDE-OOB CHARACTERS MUST BE DECLARED AS OOB CHARACTERS INMÙ ; THE FIRST BITMASK DOUBLEWORD. AN ERROR IN THE FIRST CHECK (CLEAR/INCLUDEDKÚ ; CONFLICT) WILL LEAVE THE BUFFER POINTER AT THE OFFENDING CLEAR-OOB MASK NÛ ; WORD. FAILING THE SECOND CHECK LEAVES THE BUFFER POINTER AT THE OFFENDING!Ü ; OOB DECLARATION BITMASK WORD. Ý ;E$Þ ADD #A.PRM+5,R2 ;;;POINT TO FLAGS%ß CLRB (R2) ;;;INITIALIZE FLAG BYTE @à BISB #AF.OOB,(R2)+ ;;;SET OOB FLAG AND POINT TO OOB MASK WORDá &â MOV (R1)+,(R2)+ ;;;STORE OOB MASK 1&ã MOV (R1)+,(R2)+ ;;;STORE OOB MASK 2.ä MOV (R1)+,(R2)+ ;;;STORE HELLO/CLEAR MASK 1.å MOV (R1)+,(R2)+ ;;;STORE HELLO/CLEAR MASK 2*æ MOV (R1)+,(R2)+ ;;;STORE INCLUDE MASK 1*ç MOV (R1)+,(R2)+ ;;;STORE INCLUDE MASK 2&è CLR (R2)+ ;;;INIT OOB TABUF HEADER-é CLRB (R2)+ ;;;INIT OOB TABUF ACTIVE COUNT (ê MOVB #10.,(R2) ;;;INIT OOB TABUF SIZE,ë BR 1000$ ;;;SKIP TO RETURN TO CO-ROUTINEì 30$:5í MOV #ERCVL1,2(SP) ;;;FORCE RETURN TO ERROR ROUTINE :î RETURN ;;;EXIT CO-ROUTINE FOR RETURN TO ERROR ROUTINEï ð .ENDC ;T$$SMCñ ò .IF DF T$$GMCó ô ;T.õ ; GET OUT-OF-BAND CHARACTER AST AND BITMASKSö ;E÷ 100$: .ø BNE 110$ ;IF NE, WE HAVE AN ACB/TEP...SKIP$ù CLRB -3(R1) ;CLEAR RESERVED BYTE&ú CLR (R1)+ ;CLEAR FIRST OOB BITMASK'û CLR (R1)+ ;CLEAR SECOND OOB BITMASKF%ü ADD #8.,R1 ;SKIP REST OF BITMASKSI ý BR 1000$ ;FINISH OFF REQUESTþ 110$:Eÿ  .IF DF R$$IIC 9 BCC 120$ ;IF CC, CURRENT SETTING IS FOR AN ACB...SKIP  ;RQ ; WE GET HERE WHEN GET WAS DONE FROM EXTERNAL I/O BUT THE GOTTEN CHARACTERISTICF  ; WAS OF THE INTERNAL I/O TYPE ;N= ADD #E.VOBM,R2 ;POINT TO WHERE OOB BITMASKS START IN A TEPN* BR 130$ ;FINISH OFF THE CHARACTERISTIC 120$:R  .ENDC ;R$$IIC ? ADD #A.PRM+6,R2 ;POINT TO WHERE OOB BITMASKS START IN AN ACBS 130$:D# MOV (R2)+,(R1)+ ;COPY OOB MASK 1B# MOV (R2)+,(R1)+ ;COPY OOB MASK 2E+ MOV (R2)+,(R1)+ ;COPY HELLO/CLEAR MASK 1C+ MOV (R2)+,(R1)+ ;COPY HELLO/CLEAR MASK 2R+ MOV (R2)+,(R1)+ ;COPY OOB INCLUDE MASK 1R+ MOV (R2)+,(R1)+ ;COPY OOB INCLUDE MASK 2A  .ENDC ;T$$GMC  1000$:E SUB #12.,I.PRM+4(R3) ;CO-ROUTINE PROCESSED 12 MORE BYTES OF BUFFER$6 RETURN ;RETURN TO CO-ROUTINE OR TO GET NEXT CHAR.  .ENDC ;T$$OOB  .PAGE ;SRC&SA4BD .IF DF T$$LTH&M$$NET ;THIS IS CONDITIONAL ADDITIONALLY ON ;SA4735 ;A NET AS $LTEEP IS NOT DEFINED W/O NET. ;SA473(4 ;IF THE SYSTEM DOESN'T HAVE A NETWORK, ;SA473. ;THE LAT CODE WON'T EVER EXECUTE ;SA473 ;SRC&SAH .SBTTL . MCMAP - GET/SET MAPPING FOR LAT APPLICATION TERMINAL ;SRC&SA ;SRC&SA.U ; BUFFER FOR ESTABLISHING MAPPING AND ESTABLISHING TERM AS LAT APPLICATION: ;SRC&SAT ; ;SRC&SA7 ; +-------------------------------------+ ;SRC&SA4 ; |BUFFER SIZE OR 0| TC.MAP | ;SRC&SA7 ; |-------------------------------------| ;SRC&SA / ; | UP TO 16. BYTES | ;SRC&SA 1 ; | FOR SERVER NAME | ;SRC&SAE ; | . | ;SRC&SAS7 ; |-------------------------------------| ;SRC&SAO/ ; | SERVICE NAME | ;SRC&SAF ; | . | ;SRC&SA  ; | . | ;SRC&SAA7 ; |-------------------------------------| ;SRC&SA-2 ; | PORT NAME | ;SRC&SA ; | . | ;SRC&SA; ; | . | ;SRC&SA-7 ; +-------------------------------------+ ;S00¤Ò5Ž{´cÚµcÛ¶c�·c›’RC&SAY ; ;SRC&SAQ ; WHEN THE BUFFER SIZE IS ZERO, WE ARE VOIDING THE MAPPING AND THE LAT ;SRC&SAST ; APPLICATION TERMINAL STATUS. IN THIS CASE, NO BUFFER FOLLOWS THE WORD ;SRC&SAR ; CONTAINING TC.MAP AND THE 0 BYTE. ELSE, THE BUFFER SIZE MUST BE LESS ;SRC&SAT ; THAN OR EQUAL TO 52. AND MUST BE EVEN. EACH NAME IS ALLOWED TO BE 16. ;SRC&SA3 ; BYTES IN LENGTH WITH A TRAILING 0. ;SRC&SAS ; ;SRC&SA7 ; SET LAT BY DEFAULT SETS NOBRO AND SLAVE ;SRC&SA-; ; SET NOLAT BY DEFAULT CLEARS NOBRO AND SLAVE ;SRC&SAI ; ;SRC&SA ; ;SRC&SA MCMAP:: ;SRC&SA% .IF DF T$$GMC!T$$SMC ;SRC&SAN ;SRC&SAW. CMPB #52., (R1) ;CORRECT SYNTAX? ;SRC&SA, BLO ERSYN ;IF 52. OR LESS, OK ;SRC&SA( BITB #1,(R1) ;IS IT ODD? ;SRC&SA& BNE ERSYN ;NOT ALLOWED ;SRC&SA 10$: ;SRC&SAT1 MOV $CTLST,R2 ;GET FIRST CONTROLLER ;SRC&SARB 15$: CMP U.DCB-U.TSTA(R5),L.DCB(R2) ;IS THIS OUR UNIT? ;SRC&SA+ BEQ 20$ ;IF EQ, YES - BRANCH ;SRC&SA + MOV (R2),R2 ;GET NEXT ENTRY ;SRC&SA ' BNE 15$ ;IF NE, CHECK IT ;SRC&SA.0 17$: TST (SP)+ ;POP RETURN ADDRESS ;SRC&SA) JMP ERCNSC ;PROCESS ERROR ;SRC&SA  ; ;SRC&SA< 20$: CMP L.NAM(R2),#"LH ;SHOULD BE LH CONTROLER ;SRC&SA5 BNE 17$ ;IF NOT, BRANCH - MAP NOT LEGAL ;SRC&SA> CMP $LTEEP,#$SPVEX ;IS THERE A RETURN INSTRUCTION ;SA473' ;AT THE LAT ENTRY POINT? ;SA473,1 BEQ 17$ ;IF SO, LAT IS NOT INSTALLED ;SA473  ; ;SRC$SA4  CLR -(SP) ;SRC$SA42 MOVB (R1),(SP) ;SAVE SIZE OF BUFFER ;SRC$SA46 MOV R3,-(SP) ;SAVE POINTER TO I/O PACKET ;SRC$SA4  MOV #PO$MAP,R3 ;SRC$SA49 MOV (SP),R0 ;GET IRP ADDRESS TO R0 FOR LAT ;SRC$SA4R+ ;USER BUFFER IN R1 FOR LAT ;SRC$SA4 C MOV KISAR6,R2 ;GET MAPPING OF USER BUFFER TO R2 FOR LAT ;SRC$SA4$ ;SRC$SA42 MOV KISAR6,-(SP) ;SAVE APR6 MAPPING ;SRC$SA46 MOV $DALED,KISAR6 ;MAP DRIVER DATA AREA ;SRC$SA4 ;SRC$SA4  .IF DF T$$OVL ;SRC$SA47 MOV #LTPRC,-(SP) ;GET ADDRESS OF ROUTINE ;SRC$SA4S- CALL MPROT ;AND GO TO ROUTINE ;SRC$SA4  ;SRC$SA4 .IFF ;T$$OVL ;SRC$SA4P ;SRC$SA42 CALL LTPRC ;CALL MAP TO LAT PROCESS ;SRC$SA4 ;SRC$SA4  .ENDC ;T$$OVL ;SRC$SA4 ;SRC$SA45 MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPING ;SRC$SA4 6 MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS ;SRC$SA43 MOV (SP)+,R2 ;GET BUFFER LENGTH BACK ;SRC$SA48 TST R0 ;DID WE GET AN ERROR BACK FROM LAT? ;SRC$SA4( BNE ERLAT ;IF NE, ERROR ;SRC$SA46 CMPB #SF.GMC,I.FCN(R3) ;WAS THIS A GET? ;SRC$SA4, BEQ 50$ ;IF EQ, YES - RETURN ;SRC$SA4 ;SRC$SA4 ; ;SRC$SA4AE ; SET LAT APPLICATION TERMINAL CHARACTERISTICS, BUT NOT ;SRC$SA4C0 ; S6.LAT (LAT PROCESS DOES THIS) ;SRC$SA4 ; ;SRC$SA4;) TSTB (R1) ;LAT OR NOLAT? ;SRC$SA4E- BEQ 30$ ;EQ -> NOLAT - BRANCH ;SRC$SA4E ;SRC$SA4& .IF DF R$$MPL!A$$CLI ;SRC$SA4 ;SRC$SA47 BIS #UM.NBR,U.MUP-U.TSTA(R5) ;SET NOBRO ;SRC$SA4M ;SRC$SA4& .ENDC ;R$$MPL!A$$CLI ;SRC$SA4 ;SRC$SA4@ BIS #U2.SLV,U.CW2-U.TSTA(R5) ;SET TERMINAL SLAVED ;SRC$SA4 BR 50$ ;SRC$SA4S ; ;SRC$SA4A: ; SET NOLAT (S6.LAT CLEARED BY LAT PROCESS) ;SRC$SA4 ; ;SRC$SA4T 30$: ;SRC$SA4& .IF DF R$$MPL!A$$CLI ;SRC$SA4 ;SRC$SA4: BIC #UM.NBR,U.MUP-U.TSTA(R5) ;SET BROADCAST ;SRC$SA4 ;SRC$SA4& .ENDC ;R$$MPL!A$$CLI ;SRC$SA4 ;SRC$SA4A BIC #U2.SLV,U.CW2-U.TSTA(R5) ;SET TERMINAL UNSLAVED ;SRC$SA4  ;SRC$SA4 ; ;SRC$SA4;1 50$: INC R1 ;UPDATE BUFFER POINTER ;SRC$SA4R+ ADD R2,R1 ;SKIP OVER BUFFER ;SRC$SA4 G SUB R2,I.PRM+4(R3) ;ROUTINE PROCESSED BUFFER LEN CHARACTERS ;SRC$SA40 RETURN ;DONE ;SRC$SA4$ ;SRC$SA4& .ENDC ;T$$GMC&T$$SM00¤Ú<±|t÷tø tþfDATAC ;SRC$SA4 ;SRC$SA4 .PAGE ;SRC$SA4 R .SBTTL MCQDP - GET CONNECT STATUS/QUEUE DEPTH OF LAT APPLICATION TERM. ;SRC$SA4 ;SRC$SA4 ; ;SRC$SA4UG ; SET MULTIPLE CHARACTERISTICS FOR MCQDP IS NOT ALLOWED. ;SRC$SA4I ; ;SRC$SA4O  ; RETURN IS: ;SRC$SA4! ; 0 = CONNECTED ;SRC$SA4S* ; -1 = DISCONNECTED ;SRC$SA4* ; 1 -> 255 = QUEUE DEPTH ;SRC$SA4 ; ;SRC$SA4  MCQDP:: ;SRC$SA4C ;SRC$SA4& .IF DF T$$GMC&T$$SMC ;SRC$SA4 ;SRC$SA4* BNE 20$ ;SET (NOT ALLOWED) ;SRC$SA4 ;SRC$SA4& .ENDC ;T$$GMC&T$$SMC ;SRC$SA4 ;SRC$SA4  .IF DF T$$GMC ;SRC$SA4 ;SRC$SA42 MOV $CTLST,R2 ;GET FIRST CONTROLLER ;SRC$SA4B 5$: CMP U.DCB-U.TSTA(R5),L.DCB(R2) ;IS THIS OUR UNIT? ;SRC$SA4+ BEQ 8$ ;IF EQ, YES - BRANCH ;SRC$SA4Q, MOV (R2),R2 ;GET NEXT ENTRY ;SRC$SA4' BNE 5$ ;IF NE, CHECK IT ;SRC$SA4  ; ;SRC$SA4 1 7$: BR 20$ ;ERROR, NOT A LAT DEVICE ;SRC$SA4 ; ;SRC$SA4L< 8$: CMP L.NAM(R2),#"LH ;SHOULD BE LH CONTROLER ;SRC$SA45 BNE 7$ ;IF NOT, BRANCH - MAP NOT LEGAL ;SRC$SA4G> CMP $LTEEP,#$SPVEX ;IS THERE A RETURN INSTRUCTION ;SA473' ;AT THE LAT ENTRY POINT? ;SA473.1 BEQ 20$ ;IF SO, LAT IS NOT INSTALLED ;SA473S ;SRC$SA4 ;SRC$SA4Y ; CALL TO LAT PROCESS WILL INSERT THE QUEUE DEPTH INDICATOR IN THE USER BUFFER ;SRC$SA4  ;SRC$SA4 10$: ;SRC$SA4 ;SRC$SA46 MOV R3,-(SP) ;SAVE POINTER TO I/O PACKET ;SRC$SA47 MOV R3,R0 ;GET IRP ADDRESS TO R0 FOR LAT ;SRC$SA4  MOV #PO$GQD,R3 ;SRC$SA42 MOV KISAR6,-(SP) ;Save APR6 mapping ;SRC$SA48 MOV $DALED,KISAR6 ;Map data area in TTCOM ;SRC$SA4; MOV (SP),R2 ;SET UP USER BUFFER MAPPING IN R2 ;SRC$SA4  ;SRC$SA4  .IF DF T$$OVL ;SRC$SA4 ;SRC$SA47 MOV #LTPRC,-(SP) ;GET ADDRESS OF ROUTINE ;SRC$SA4 , CALL MPROT ;AND GOTO ROUTINE ;SRC$SA4 ;SRC$SA4 .IFF ;T$$OVL ;SRC$SA4  ;SRC$SA42 CALL LTRPC ;CALL MAP TO LAT PROCESS ;SRC$SA4 ;SRC$SA4  .ENDC ;T$$OVL ;SRC$SA4 ;SRC$SA45 MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPING ;SRC$SA4C6 MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS ;SRC$SA4  TST R0 ;ERROR? ;SRC$SA4& BNE ERLAT ;IF NE, YES ;SRC$SA4 RETURN ;SRC$SA4 ;SRC$SA4  .ENDC ;T$$GMC ;SRC$SA4 ;SRC$SA4  .IF DF T$$SMC ;SRC$SA4 ;SRC$SA4& ; SET IS NOT ALLOWED ;SRC$SA4 ;SRC$SA41 20$: TST (SP)+ ;POP RETURN ADDRESS ;SRC$SA4.* JMP ERCNSC ;PROCESS ERROR ;SRC$SA4 ;SRC$SA4  .ENDC ;T$$SMC ;SRC$SA4 ;SRC$SA4& .IF DF T$$SMC!T$$GMC ;SRC$SA4 ERSYN: ;SRC$SA44 JMP ERCVAL ;AND JUMP TO PROCESS ERROR ;SRC$SA4 ERLAT: ;SRC$SA4- TST (SP)+ ;POP RETURN ADDRESS ;SRC$SA44' JMP CHRFN1 ;FINISH I/O ;SRC$SA4  ;SRC$SA4& .ENDC ;T$$SMC!T$$GMC ;SRC$SA4 ;SRC$SA4& .ENDC ;T$$LTH&M$$MAP ;SRC$SA4 ;SRC$SA4  .PAGEE .SBTTL TTATT SUBROUTINESC>! .SBTTL . GSAENC - GET/SET GENERAL ASYNCH EVENT NOTIFICATION" %# .IF DF T$$SCA!T$$MHU!T$$ICS!T$$OOB $ % ;C& ;+H' ; **-GSAENC - GET/SET ASYNCHCHRONOUS EVENT NOTIFICATION CHARACTERISTIC( ;4=) ; THIS ROUTINE PROCESSES THE COMMON PART OF AN ASYNCHRONOUS Q* ; EVENT NOTIFICATION CHARACTERISTIC. TO SET ONE OF THESE, THE TERMINAL MUST BENN+ ; ATTACHED AND MAY NOT HAVE UNSOLICITED INPUT AST'S SPECIFIED. THIS ROUTINEO, ; ESTABLISHES AN ACB (UNLESS ONE ALREADY EXISTS) FOR THE REQUESTED CHARACTER-M- ; ISTIC, SAVES THE USER-SPECIFIED AST ADDRESS IN THE ACB, CALLS THE CALLING$N. ; ROUTINE AS A CO-ROUTINE WITH INTERRUPTS LOCKED OUT TO ALLOW SETTING UP THEO/ ; CHARACTERISTIC DEPENDENT PART OF THE ACB. UPON RETURN FROM THE CO-ROUTINE, N0 ; 00¤â5Ž{´cÚµcÛ¶c�·c›’INTERRUPTS ARE ENABLED AND THE MAIN CHARACTERISTIC HANDLER IS RETURNED TO.1 ;,C2 ; NOTE THAT IF THE CHARACTERISTIC IS BEING SET OR DISABLED VIA ANUN3 ; INTERNAL I/O REQUEST, THE CO-ROUTINE SEQUENCE IS NOT EXECUTED AND A RETURN@4 ; TO THE MCXXX DISPATCH ROUTINE (NXTCHR) IS EXECUTED. THIS ISJ5 ; BECAUSE THE CHARACTERISTIC BUFFER IS FORMATTED DIFFERENTLY SINCE A TEPH6 ; IS EXPECTED TO ALREADY CONTAIN THE NEEDED CHARACTERISTIC PARAMETERS.G7 ; BY DESIGN, THE CALLING ROUTINE ASSUMES IT WILL NOT GET RETURNED TO.P8 ;EF9 ; NOTE THAT AN SF.GMC REQUEST FROM A TASK CAN BE HANDLED EVEN IF THEI: ; CHARACTERISTIC CURRENTLY HAS A TEP ASSOCIATED WITH IT. IN THIS CASE,NM; ; THE CO-ROUTINE MUST COPY THE CHARACTERISTIC DEPENDENT PARAMETERS FROM THEE< ; TEP TO THE USER BUFFER.H= ; > ; INPUTS:<? ; R0 = SIZE OF AN AST CONTROL BLOCK FOR THE CHARACTERISTICB@ ; R1 => HIGH BYTE OF CURRENT CHARACTERISTIC ENTRY IN USER BUFFERHA ; R2 = BIT IN STATUS WORD 3 MARKING CHARACTERISTIC AS ENABLED/DISABLEDB ; R3 => CURRENT I/O PACKET.C ; R4 = OFFSET TO ACB/TEP POINTER IN THE UCBX(D ; R5 => U.TSTA OF CURRENT TERMINAL UCBE ;R F ; OUTPUTS:P0G ; WHEN CALLING THE CALLER AS A CO-ROUTINE:<H ; CC-V = SET IF REQUEST IS SF.GMC; CC-V = CLEAR FOR SF.SMC;I ; CC-Z = SET IF NO TEP/ACB EXISTS; CC-Z = CLEAR OTHERWISE0@J ; CC-C = SET IF REQUEST IS SF.GMC AND A TEP IS ASSOCIATED WITH?K ; THE CHARACTERISTIC (ONLY CHECK IF CC-V SET AND CC-Z CLEAR)=<L ; R1 => NEXT WORD OF USER CHARACTERISTIC BUFFER TO PROCESS(M ; R2 => ACB/TEP FOR THE CHARACTERISTIC4N ; R4 => UCBX POINTER TO ACB/TEP FOR CHARACTERISTICO ; 1P ; WHEN RETURNING TO CHARACTERISTIC HANDLER: <Q ; R1 => NEXT WORD OF USER CHARACTERISTIC BUFFER TO PROCESSR ; S ; REGISTERS MODIFIED: NONE.CT ;-U ;= V GSAENC:T/W INC R1 ;SKIP PAST CHARACTERISTIC HIGH BYTE=6X SUB #2,I.PRM+4(R3) ;ASSUME WE WILL PROCESS 2 BYTESY Z .IF DF T$$GMC&T$$SMC [ A\ CMPB #SF.GMC,I.FCN(R3) ;IS THIS REQUEST TO GET CHARACTERISTICSE%] BEQ 1000$ ;IF EQ, YES...GET THEM/^ _ .ENDC ;T$$GMC&T$$SMC ` a .IF DF T$$SMCb .c TST U.ATT-U.TSTA(R5) ;IS TERMINAL ATTACHED?3d BEQ 900$ ;IF EQ, NO...CAN'T SET CHARACTERISTICR5e BIT #1,(R1) ;SPECIFYING ODD ADDRESS FOR AST/TEP?Rf BNE 800$ ;ERROR IF ODD :g MOV (R1)+,-(SP) ;GET REQUESTED AST ADDRESS/TEP POINTER0h MOV R4,-(SP) ;SAVE OFFSET IN UCBX OF POINTERi j .IF DF T$$SPLk 'l MOV #120000,R4 ;SET POINTER TO UCBX,)m MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP UCBXIn o .IFF ;T$$SPL p 1q MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING,r MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX POINTERs t .IFTF ;T$$SPLu 8x ADD (SP)+,R4 ;POINT TO ACB/TEP POINTER IN UCBX ;**-2)y TST (SP) ;ENABLE THE CHARACTERISTIC?Az BNE 100$ ;IF NE, YESR{ ; ,| ; REQUEST IS TO DISABLE THE CHARACTERISTIC} ;S,~ BIC R2,4(R5) ;DISABLE THE CHARACTERISTIC' CALL DEACB ;DEALLOCATE THE ACB/TEP € � .IFF ;T$$SPL;‚ 0ƒ MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER„ … .IFTF ;T$$SPL† 5‡ BIT #1,I.IOSB+4(R3) ;IS THIS AN INTERNAL REQUEST?A-ˆ BEQ 10$ ;IF EQ, NO...THIS IS A USER TASKI1‰ TST (SP)+ ;CLEAN UP STACK TO SKIP CO-ROUTINEOŠ 10$:1‹ CLR (SP)+ ;CLEAN STACK, CLEAR CC-V, SET CC-Z 0Œ RETURN ;RETURN TO CO-ROUTINE OR DISPATCHER� ;8Ž ; REQUEST IS TO ENABLE ASYNCHRONOUS EVENT NOTIFICATION� ;(� 100$:A4‘ MTPS #TTPRI ;LOCK OUT INTERRUPTS WHILE CHANGING,’ BIS R2,4(R5) ;;;MARK FUNCTION AS ENABLED“ ” .IF DF R$$IIC• 0– BIT #1,I.IOSB+4(R3) ;;;INTERNAL I/O REQUEST?0— BEQ 120$ ;;;IF EQ, NO...MUST BE FROM A TASK8˜ CMP (SP),(R4) ;;;INTERNAL REQUEST USING CURRENT TEP?1™ BEQ 110$ ;;;IF EQ, YES...DON'T DEALLOCATE ITC4š CALL DEACB ;;;DEALLOCATE CURRENT TEP/ACB IF ONE› 110$:E+œ MOV (SP)+,(R4) ;;;STORE NEW TEP POINTERE� TST (SP)+ ;;;CLEAN STACK ž Ÿ .IF NDF T$$SPL(  0¡ MOV I.PRM(R3),KISAR6 ;;;REMAP THE USER BUFFER¢ £ .ENDC ;NDF T$$SPL¤ ,¥ BR 150$ ;;;ENABLE INTERRUPTS AND RETURN¦ 120$: § .IFTF ;R$$IIC¨ -© MOV R2,-(SP) ;;;SAVE FUNCTION ENABLE FLA00¤ê<±|t÷tø tþfDATAGQ'ª MOV (R4),R2 ;;;GET CURRENT TEP/ACBR« ¬ .IFT ;R$$IICS­ .® BEQ 130$ ;;;IF EQ, NONE...ALLOCATE AN ACB¯ ASSUME A.CBL,E.VSIZ$° TST A.CBL(R2) ;;;IS THIS AN ACB?5± BEQ 140$ ;;;IF EQ, YES...JUST CHANGE AST ADDRESS 7² CALL DEACB ;;;DEALLOCATE TEP BEFORE ACB ALLOCATIONN³ 130$:(´ µ .IFF ;R$$IIC)¶ (· BNE 140$ ;;;IF NE, USE EXISTING ONE¸ ¹ .ENDC ;R$$IICº ,» MOV R1,-(SP) ;;;SAVE USER BUFFER POINTER0¼ MOV R0,R1 ;;;COPY LENGTH OF ACB TO ALLOCATE"½ CALL ALACB ;;;ALLOCATE AN ACB*¾ MOV (SP)+,R1 ;;;RESTORE BUFFER POINTER*¿ BCS 920$ ;;;IF CS, ALLOCATION FAILURE&À CLRB (R0)+ ;;;CLEAR ACB FLAG BYTEÁ 140$:L2 BIS (SP)+,4(R5) ;;;SET FLAG TO ENABLE FUNCTION@à MOV (SP)+,A.AST(R2) ;;;SAVE AST ADDRESS, CLEAR CC-V AND CC-ZÄ Å .IFF ;T$$SPLÆ 2Ç MOV I.PRM(R3),KISAR6 ;;;MAP BACK TO USER BUFFERÈ É .ENDC ;T$$SPLÊ -Ë CALL @(SP)+ ;;;CALL CALLER AS CO-ROUTINEUÌ 150$:RÍ MTPS #0 ;ENABLE INTERRUPTSLÎ RETURN ;BACK TO CALLERÏ ;L$Ð ; ERROR PROCESSING FOR THE ROUTINEÑ ;;Ò 800$: 9Ó MOV #!,R0 ;ILLEGAL AST ADDRESS Ô BR 905$Õ 900$:E=Ö MOV #!,R0 ;ERROR WHEN NOT ATTACHEDE,× 905$: CMP (SP)+,(SP)+ ;CLEAN UP THE STACKØ JMP CHRFIN ;FINISH ERRORCÝ 920$: ;**-4$Þ MTPS #0 ;;;RE-ENABLE INTERRUPTS0ß MOV #ERCUPN,R2 ;SET ERROR COMPLETION ROUTINE.á TST -(R1) ;BACK UP BUFFER POINTER ;**-1/â ADD #8.,SP ;CLEAN OFF ALL STACK PARAMETERS .ã JMP (R2) ;PROCESS THE ERROR AND FINISH UPä å .ENDC ;T$$SMCæ ç .IF DF T$$GMCè é ;<;ê ; REQUEST IS TO RETURN CHARACTERISTIC SETTING TO THE USER ë ;#ì 1000$:í î .IF DF T$$SPLï 4ð ADD #120000,R4 ;POINT TO ACB/TEP POINTER IN UCBX)ñ MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP UCBXò ó .IFF ;T$$SPL4ô 1õ MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGR$ö MOV U.TUX-U.TSTA(R5),R2 ;GET UCBX5÷ BEQ 1010$ ;IF EQ, NONE...CHARACTERISTIC DISABLEDS0ø ADD R2,R4 ;POINT TO ACB/TEP POINTER IN UCBXù ú .IFTF ;T$$SPLû ,ü MOV (R4),R2 ;GET ACB/TEP POINTER IF ONEý þ .IFF ;T$$SPL ÿ  1010$:0 MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER  .ENDC ;T$$SPL  .IF DF R$$IIC : BIT #1,I.IOSB+4(R3) ;WAS THIS AN INTERNAL I/O REQUEST?6 BEQ 1020$ ;IF EQ, NO...RETURN FULL CHARACTERISTIC6 MOV R2,(R1)+ ;STORE TEP/ACB ADDRESS IN USER BUFFER TST (SP)+ ;CLEAN STACK RETURN ;ALL DONE 1020$:  .IFTF ;R$$IIC $ TST R2 ;IS THERE AN ACB OR TEP?) BNE 1030$ ;IF NE, YES...CHECK IT OUT42 CLR (R1)+ ;AST DISABLED, CLEAR CC-V, SET CC-Z% BR 1050$ ;SKIP TO FINISH REQUESTS 1030$:  .IFT ;R$$IIC   ASSUME A.CBL,E.VSIZ/ TST A.CBL(R2) ;IS THIS AN ACB? (CLEAR CC-C)I BEQ 1040$ ;IF EQ, YES2 MOV R2,(R1)+ ;STORE TEP POINTER IN USER BUFFER) SEC ;SET FLAG TO SHOW THIS IS A TEP  BR 1050$ ;FINISH REQUEST; 1040$:  .ENDC ;R$$IIC! 9" MOV A.AST(R2),(R1)+ ;STORE AST ADDRESS IN USER BUFFER # 1050$:/$ SEV ;SET CC-V TO INDICATE THIS WAS SF.GMC0% RETURN ;RETURN TO GET CHAR-DEPENDENT STUFF& ' .ENDC ;T$$GMC( %) .ENDC ;T$$SCA!T$$MHU!T$$ICS!T$$OOBR* + .PAGE @, .SBTTL . MPCCOR - MAP DRIVER DATA AND CALL BACK AS CO-ROUTINE- ;. ;+D/ ; **-MPCCOR - MAP DRIVER DATA AREA AND CALL CALLER AS A CO-ROUTINE0 ; J1 ; THIS ROUTINE WILL MAP THE DRIVER DATA AREA AND CALL BACK THE CALLER ASK2 ; A CO-ROUTINE. WHEN THE CALLER EXECUTES A RETURN, THIS ROUTINE WILL MAPI'3 ; BACK TO THE TASK BUFFER AND RETURN.C4 ;O 5 ; INPUTS:>6 ; 2(SP) = RETURN ADDRESS AFTER RESTORING TASK BUFFER MAPPING7 ; R3 => CURRENT I/O PACKET8 ;; 9 ; OUTPUTS:$: ; CC-C PRESERVED.; ; NO REGISTERS ARE MODIFIED BY THIS ROUTINE.< ;-= ;A > MPCCOR:E4? MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESS ON STACK(@ MOV R3,2(SP) ;SAVE I/O PACKET ADDRESSA 1B MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGT1C CALL @(SP)+ ;CALL CALLER BACK AS A CO-ROUTINEE+D MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSA0E MOV I.PRM(R3),KISAR6 ;MAP BACK TO USE00¤ò5Ž{´cÚµcÛ¶c�·c›’R BUFFER'F RETURN ;RETURN FROM THE CO-ROUTINESG H .ENDC ;T$$SMC!T$$GMC I J .PAGENAK .SBTTL . ALACB - ALLOCATE AND INITIALIZE AN AST CONTROL BLOCKSL ,M .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOBN O ;P ;+)Q ; **-ALACB - ALLOCATE AST CONTROL BLOCKAR ; FS ; THIS SUBROUTINE ALLOCATES AN AST CONTROL BLOCK AND INITIALIZES THEFT ; FIXED DATA. DATA THAT IS CHARACTERISTIC-DEPENDENT (SUCH AS A.AST)*U ; MUST BE SET BY THE CALLER UPON RETURN.V ; W ; INPUTS:<X ; R1 = SIZE IN BYTES OF ACB TO ALLOCATE (SAVED IN A.PRM+4)Y ; R3 => CURRENT I/O PACKET;Z ; R4 => OFFSET IN UCBX WHERE ADDRESS OF ACB WILL BE SAVEDN[ ; R5 => U.TSTA OF CURRENT UCBS\ ; ] ; OUTPUTS:A;^ ; CC-C CLEAR IF SUCCESSFUL ALLOCATION; CC-C SET OTHERWISEA&_ ; R0 => A.PRM+5 OF THE ALLOCATED ACBB` ; R2 => LINK WORD OF ALLOCATED ACB (ACB'S HAVE NEGATIVE OFFSETS)&a ; (R4) => LINK WORD OF ALLOCATED ACBb ;P.c ; THE ALLOCATED ACB IS FORMATTED AS FOLLOWS:d ; +e ; +-------------------------------------+Z9f ; | TTDRV KINAR5 BIAS | A.KSR5 (-4) +g ; |-------------------------------------|W9h ; | DEQUEUE SUBROUTINE ADDRESS (DQACB) | A.DQSR (-2)R+i ; |-------------------------------------|R&j ; | THREAD WORD (0) | (0)+k ; |-------------------------------------|B3l ; | LENGTH OF CONTROL BLOCK (0) | A.CBLG+m ; |-------------------------------------|C3n ; | # BYTES TO ALLOC ON STACK (16.) | A.BYT +o ; |-------------------------------------|-0p ; | AST ADDRESS (0) | A.AST+q ; |-------------------------------------|-2r ; | # AST PARAMETERS (1) | A.NPR+s ; |-----------------+-------------------|-3t ; | U.TTID | (0) | A.PRMD+u ; |-----------------+-------------------|-)v ; | POINTER TO U.TSTA | A.PRM+2T+w ; |-----------------+-------------------|-5x ; | | ACB SIZE | A.PRM+4O+y ; |-----------------+-------------------+-z ;-{ ; REGISTERS MODIFIED: R1| ;-} ;D~ ALACB: CALL $ALOCB ;ALLOCATE SPACE-€ BCS 10$ ;BR IF ERROR� ‚ .IF DF T$$OVLƒ „ .IF DF T$$SPL… +† MOV KISAR6,-(SP) ;SAVE APR6 DATA MAPPING-,‡ MOV $DALED,KISAR6 ;AND MAP TO DRIVER DATAˆ ‰ .IFTF ;T$$SPLŠ 5‹ MOV ROTMAP,(R0)+ ;INSERT DRIVER MAIN APR 5 MAPPINGUŒ � .IFT ;T$$SPL+Ž :� MOV (SP)+,KISAR6 ;RESTORE EITHER TASK OR DRIVER MAPPING� ‘ .ENDC ;T$$SPL’ “ .IFF ;T$$OVL ” 9• MOV KINAR5,(R0)+ ;INSERT DRIVER APR 5 MAPPING (A.KSR5)S– — .ENDC ;T$$OVL˜ ;™ MOV #DQACB,(R0)+ ;INSERT POINTER TO ROUTINE TO CALL WHEN %š ;AST BLOCK IS DEQUEUED (A.DQSR).)› MOV R0,R2 ;SAVE ALLOCATED ACB ADDRESS )œ MOV R0,(R4) ;STORE POINTER TO THE ACBN"� TST (R0)+ ;SKIP OVER LINK WORD3ž CLR (R0)+ ;SET BLOCK LENGTH ZERO TO FORCE SYSXTP0Ÿ ;TO CALL US WHEN BLOCK IS DEQUEUED (A.CBL)=  MOV #16.,(R0)+ ;ALLOCATE 16. BYTES ON TASK'S STACK (A.BYT);,¡ TST (R0)+ ;SKIP PAST AST ADDRESS (A.AST)#¢ ;THIS WILL BE FILLED IN LATER(8£ MOV #1,(R0)+ ;INSERT NUMBER OF AST PARAMETERS (A.NPR)¤ ¥ .IF DF T$$SPL¦ 8§ CLRB (R0)+ ;SKIP LOW BYTE OF FIRST PARAMETER (A.PRM)G¨ MOVB 120000+U.TTID,(R0)+ ;SAVE USER DEFINED TERMINAL ID IN HIGH BYTE © ª .IFF ;T$$SPL+« <¬ CLR (R0)+ ;SKIP OVER FIRST PARAMETER UNTIL LATER (A.PRM)­ ® .IFTF ;T$$SPL¯ 3° MOV R5,(R0)+ ;INSERT POINTER TO U.TSTA (A.PRM+2) 1± MOVB R1,(R0)+ ;SAVE SIZE OF THIS ACB (A.PRM+4)T² ³ .IFF ;T$$SPLT´ 6µ MOV U.TUX-U.TSTA(R5),R1 ;GET POINTER TO TOP OF UCBXD¶ MOVB U.TTID(R1),-4(R0) ;INSERT USER-DEFINED TERMINAL ID (A.PRM+1)· ¸ .ENDC ;T$$SPL¹ º 10$:» RETURN ;ALL DONER¼ ,½ .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB¾ ¿ À .PAGED(Á .SBTTL . QPEIO - EXTENDED I/O REQUEST ;Rà ;+,Ä ; **-QPEIO - EXTENDED I/O REQUEST (IO.EIO)Å ; OÆ ; THIS ROUTINE VALIDATES THE PARAMETERS OF AN EXTENDED WRITE OR READ REQUEST.MIÇ ; AN EXTENDED I/O REQUEST IS ONE WITH A FUNCTION CODE OF "IO.EIO" AND A MÈ ; SUBFUNCTION OF "TF.WLB" OR "TF.RLB". ALL MODIFIERS AND PARAMETERS OF THE MÉ 00¤ú<±|t÷tø tþfDATA; REQUEST ARE SET UP IN AN ITEMLIST IN THE USER TASK SPACE INSTEAD OF BEING MÊ ; PASSED FROM THE DPB VIA THE I/O PACKET. THIS MAKES IT POSSIBLE TO CREATEGË ; MORE COMPLEX TYPES OF READS AND WRITES THAN CAN BE DONE BY "OR'ING"ENÌ ; SUBFUNCTION BITS TOGETHER. FOR EXAMPLE, AN "IO.RPR" REQUEST CANNOT HAVE ANÍ ; TERMINATOR TABLE SPECIFIED WITH IT (IO.RTT) SINCE THERE IS NOT ENOUGH ROOMOÎ ; IN THE QIO PARAMETER LIST OR IN A NORMAL I/O PACKET FOR THE PROMPT VFC, THE OÏ ; TIMEOUT VALUE, AND THE ADDRESS/LENGTH OF THE DATA BUFFERS. AN EXTENDED I/OEJÐ ; REQUEST ELIMINATES THIS RESTRICTION BY SPECIFYING THE PARAMETERS IN ANJÑ ; ITEMLIST POINTED TO BY THE QIO PARAMETER LIST AND BY SAVING ADDITIONALPÒ ; INFORMATION IN AN I/O PACKET EXTENSION. THE USER'S ITEMLIST IS SPECIFIED BYKÓ ; "P1" AND "P2" OF THE QIO PARAMETER LIST. THIS BUFFER HAS BEEN ADDRESS-ONÔ ; CHECKED AND RELOCATED BY THE EXEC AND THE DOUBLEWORD ADDRESS AND LENGTH ISLÕ ; STORED IN I.PRM THROUGH I.PRM+4. THE ITEMLIST HAS THE FOLLOWING FORMAT:Ö ;F× ; READ ITEM LIST:NØ ;N&Ù ; +-------------------------------+Ú ; | MODIFIER WORD 1 |E&Û ; |-------------------------------|Ü ; | MODIFIER WORD 2 |Y&Ý ; |-------------------------------|%Þ ; | ADDRESS OF READ DATA BUFFER |M&ß ; |-------------------------------|%à ; | LENGTH OF READ DATA BUFFER | &á ; |-------------------------------|â ; | TIME OUT VALUE |&ã ; |-------------------------------|#ä ; | ADDRESS OF PROMPT BUFFER |T&å ; |-------------------------------|#æ ; | LENGTH OF PROMPT BUFFER |-&ç ; |-------------------------------|è ; | PROMPT VFC |&é ; |-------------------------------|$ê ; | TERMINATOR TABLE ADDRESS |&ë ; |-------------------------------|%ì ; | LENGTH OF TERMINATOR TABLE |-&í ; |-------------------------------|&î ; | DEFAULT INPUT BUFFER ADDRESS |&ï ; |-------------------------------|&ð ; |LENGTH OF DEFAULT INPUT BUFFER |&ñ ; +-------------------------------+ò ; ó ; ô ; WRITE ITEM LIST:õ ;-&ö ; +-------------------------------+÷ ; | MODIFIER WORD 1 |-&ø ; |-------------------------------|ù ; | MODIFIER WORD 2 |-&ú ; |-------------------------------|#û ; | ADDRESS OF OUTPUT BUFFER |-&ü ; |-------------------------------|$ý ; | LENGTH OF OUTPUT BUFFER |&þ ; |-------------------------------|!ÿ ; | VFC/CURSOR POSITION |-& ; +-------------------------------+ ;N ; *** NOTE ***+E ; AT PRESENT, THERE ARE TOO FEW PARAMETERS THAT CAN BE SPECIFIED ON-D ; EXTENDED WRITE REQUESTS TO JUSTIFY THE ALLOCATION OF AN IOPX FORG ; THEM. THUS, AN "IO.EIO!TF.WLB" REQUEST PACKET IS CONVERTED TO LOOKG ; LIKE A NORMAL "IO.WLB". NOTE THAT THIS REQUIRES ALL WRITE MODIFIER G ; BITS TO RESIDE IN THE LOW BYTE OF THE ITEMLIST MODIFIER WORD EXCEPTFH ; TF.FMT WHICH IS SPECIAL CASED. IT COMES TO US VIA THE USER MODIFIER% ; WORD OR I.PRM+13 FOR INTERNAL I/O- ;-; ; THE FOLLOWING ACTIONS MAY BE PERFORMED BY THIS ROUTINE:E6 ; 1. VALIDATE THE SIZE OF THE USER-DEFINED ITEMLIST.K ; 2. MAKE SURE NO SUBFUNCTIONS OTHER THAN TF.WLB OR TF.RLB ARE REQUESTED..I ; 3. CONVERT AN "IO.EIO!TF.WLB" REQUEST INTO A NORMAL "IO.WLB" REQUEST."D ; 4. ALLOCATE AN I/O PACKET EXTENSION (IOPX) FROM PRIMARY POOL FOR? ; SAVING PARAMETERS FROM THE USER'S ITEMLIST. IF THE IO.EIOI< ; IS AN INTERNAL I/O REQUEST, I.PRM MUST POINT TO AN IOPX& ; ALLOCATED AND SET UP BY THE USER.G ; 5. VALIDATE AND ADDRESS CHECK PARAMETERS IN THE USER'S ITEMLIST ANDV, ; SAVE NECESSARY INFORMATION IN THE IOPX.7 ; 6. LINK THE IOPX INTO A LIST OF IOPX'S FOR THE UCB.F@ ; 7. REQUEST THAT THE I/O PACKET BE LINKED INTO THE TERMINAL'S ; SCB I/O REQUEST QUEUE." ;  ; INPUTS: ; R3 => IO.EIO REQUEST PACKET  ; R4 => SCB FOR THE TERMINAL ; R5 => UCB FOR THE TERMINAL9 ; I.PRM => PRE-ALLOCATED IOPX IF IO.EIO IS INTERNAL I/OM ;O  ; OUTPUTS:/ ; R3 => IO.WLB REQUEST PACKET PASSED TO QPWLBL:! ; R4 = U.TSTA+2 BITS FOR DE-QUEUE BLOCKING (IN "TSTRQ")'" ; IOPX LINKED INTO I00¤€5Ž{´cÚµcÛ¶c�·c›’OPX LIST (U.TIXL)E# ;.$$ ; REGISTERS MODIFIED: R0, R1, R2% ;-& ;T' ( .IF DF T$$EIO) .IF DF T$$OVL* + QPEIO1::, - .IFF ;T$$OVL . QPEIO::R/ 0 .ENDC ;T$$OVL1 2 .IF DF R$$IIC3 94 MOV I.PRM(R3),R0 ;ASSUME THERE IS A PRE-ALLOCATED IOPX585 BIT #1,I.IOSB+4(R3) ;IS THIS AN INTERNAL I/O REQUEST?6 BEQ 5$ ;IF EQ, NO/7 $8 ; THIS IS AN INTERNAL I/O REQUEST.9 ): BIT #TF.RLB,I.FCN(R3) ;IS THIS A READ?S-; BNE 15$ ;IF YES, IOPX IS ALREADY IN PLACE (< MOV #IO.WLB,I.FCN(R3);MARK AS A WRITE8= MOVB I.PRM+12(R3),I.FCN(R3) ;AND SET THE SUBFUNCTIONS> ? .IF DF T$$OVL@ "A JMP QPWTRA ;TRANSFER FOR QPWLBB C .IFF ;T$$OVLRD #E JMP QPWLB ;PROCESS IT AS IO.WLBIF G .ENDC ;T$$OVLH I 5$:M8J MOV R0,KISAR6 ;OTHERWISE, MAP TO USER ITEMLIST BUFFERK L .IFF ;R$$IIC/M 1N MOV I.PRM(R3),KISAR6 ;MAP USER ITEMLIST BUFFERIO P .ENDC ;R$$IICQ ,R BIT #1,I.PRM+2(R3) ;IS IT WORD ALLIGNED?S BNE 11$ ;IF ODD, BRANCHR=T CMP I.PRM+4(R3),#8. ;IS THE SIZE SMALLER THAN THE MINIMUM?VU BMI 11$ ;IF PL, YES;:V MOV #10.,R0 ;ASSUME CHECKING LENGTH OF TF.WLB ITEMLIST?W MOV #^C,R1 ;INVERSE OF LEGAL WRITE FLAGS ARE INVALIDB<X BIT #TF.WLB,I.FCN(R3) ;IS THIS AN EXTENDED WRITE REQUEST?7Y BNE 10$ ;IF NE, YES...ASSUMPTION WAS CORRECT - SKIP ;Z MOV #24.,R0 ;SET LENGTH OF TF.RLB ITEMLIST TO CHECK FORMA[ MOV #^C,R1 ;INVERSE OF EXTENDED READ FLAGS ARE INVALIDI\ 10$:0] CMP R0,I.PRM+4(R3) ;IS THE ITEMLIST TOO LARGE ^ BPL 12$ ;IF PL, NO, CONTINUE_ 11$:` .IF DF T$$OVLa %b MOV #IE.BAD&377,R0 ;GET ERROR CODE c JMP 930$Td e .IFF ;T$$OVLf g JMP EQPBAD ;ELSE, ERROR h i .ENDC ;T$$OVLj 12$::k BIT R1,@I.PRM+2(R3) ;ARE ANY INVALID MODIFIER BITS SET?7l BNE 25$ ;IF NE, YES...REPORT INVALID FUNCTION ERRORIm <n BIT #TF.WLB,I.FCN(R3) ;IS THIS AN EXTENDED WRITE REQUEST?6o BEQ 20$ ;IF EQ, NO...SKIP TO PROCESS EXTENDED READp ;ALq ; PROCESS AN EXTENDED WRITE REQUEST BY CONVERTING IT TO AN IO.WLB REQUEST.r ; <s MOV I.PRM+2(R3),R2 ;SET POINTER TO START OF USER ITEMLIST@t MOV #IO.WLB,I.FCN(R3) ;CHANGE FUNCTION CODE OF OUR I/O PACKET7u MOVB (R2),I.FCN(R3) ;GET THE WRITE REQUEST MODIFIERS ;v CMP (R2)+,(R2)+ ;SKIP HIGH BYTE AND UNUSED MODIFIER WORDB5w MOV (R2)+,R0 ;GET VIRTUAL ADDRESS OF OUTPUT BUFFER ,x MOV (R2)+,R1 ;GET LENGTH OF OUTPUT BUFFER&y MOV R3,R4 ;COPY I/O PACKET POINTER5z ADD #I.PRM+4,R4 ;POINT TO WHERE BUFFER LENGTH GOESE7{ MOV R1,(R4) ;COPY LENGTH OF SPECIFIED OUTPUT BUFFERS>| MOV (R2),2(R4) ;COPY VFC/CURSOR POSITION INFO TO I/O PACKET} 9~ CALL CKBFR ;CHECK FOR READ ACCESS AND RELOCATE BUFFER/ /€ BCS 26$ ;IF CS, CHECK FAILED...RETURN ERRORS� 7‚ MOV R2,-(R4) ;SAVE SECOND WORD OF DOUBLEWORD ADDRESSO%ƒ MOV R1,-(R4) ;SAVE FIRST WORD ALSOU„ 1… MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGT† ‡ .IF DF T$$OVLˆ #‰ CALLR QPWTRA ;TRANSFER TO QPWLBAŠ ‹ .IFF ;T$$OVL Œ :� JMP QPWLB ;NOW PROCESS PACKET AS NORMAL IO.WLB REQUESTŽ � .ENDC ;DF T$$OVL� 15$:‘ JMP 50$ ;BRANCH AIDP’ “ ;NM” ; PROCESS AN EXTENDED READ REQUEST BY BUILDING AN IOPX TO HOLD INFO FOR US./• ;– — ASSUME I.XLNK,0˜ ASSUME I.XLNK+2,I.XIOP ™ ASSUME I.XIOP+2,I.XTCBOš ASSUME I.XTCB+2,I.XMODS› ASSUME I.XMOD+4,I.XRBFIœ ASSUME I.XRBF+4,I.XRBL$� ASSUME I.XRBL+2,I.XTMORž ASSUME I.XTMO+2,I.XPBFDŸ ASSUME I.XPBF+4,I.XPBLR  ASSUME I.XPBL+2,I.XPBV¡ ASSUME I.XPBV+2,I.XTTBP¢ ASSUME I.XTTB+4,I.XTTL £ ASSUME I.XTTL+2,I.XDBF ¤ ASSUME I.XDBF+4,I.XDBL5¥ H¦ 20$: BIT #TF.RLB,I.FCN(R3) ;THIS ISN'T A WRITE, SO IT BETTER BE A READ*§ BNE 27$ ;IF EQ, INVALID FUNCTION ERROR¨ 25$:© .IF DF T$$OVLª %« MOV #IE.IFC&377,R0 ;GET ERROR CODEI¬ ­ .IFF ;DF T$$OVL® &¯ JMP EQPIFC ;ELSE, INVALID FUNCTION° ± .ENDC ;DF T$$OVLB² ;³ 26$: JMP 930$ ;ALWAYS NEEDED AS BRANCH STRETCHER ANYWAY.S´ µ 27$:4¶ MOV I.PRM+4(R3),R1 ;GET SPECIFIED EIO BUFFER SIZE3· MOV @I.PRM+2(R3),R4 ;GET SPECIFIED FUNCTION MASKT)¸ BIT #TF.RDI,R4 ;READ W/ DEFAULT I00¤ €<±|t÷tø tþfDATANPUT? ¹ BEQ 272$ ;BR IF NO RDI6º CMP R1,#24. ;IF RDI, MAKE SURE ALL 24. BYTES THERE» BNE 11$ ;IF LESS, ERRORE¼ BR 29$ ;ELSE, OK CONTINUE½ 272$:V,¾ BIT #TF.RTT,R4 ;READ W/ TERMINATOR TABLE?¿ BEQ 274$ ;BR IF NO RTT8À CMP R1,#20. ;IF RTT, CHECK MIN. REQUIRED BYTES THEREÁ BMI 11$ ;IF LESS, ERRORE  BR 29$ à 274$: Ä .IF DF T$$RPRÅ "Æ BIT #TF.RPR,R4 ;READ W/ PROMPT?Ç BEQ 276$ ;BR IF NO RPR7È CMP R1,#14. ;CHECK MINIMUM REQUIRED BYTES SPECIFIEDIÉ BMI 11$ ;IF LESS, ERROR Ê BR 29$ Ë 276$:OÌ .ENDC ; DF T$$RPRÍ #Î BIT #TF.TMO,R4 ;READ W/ TIMEOUT? Ï BEQ 29$ ;BR IF NOT*Ð CMP R1,#10. ;CHECK ALL BYTES SPECIFIEDÑ BMI 11$ ;IF LESS, ERRORTÒ 29$:=Ó MOV #I.XLEN,R1 ;SET SIZE OF AN I/O PACKET EXTENSION (IOPX)C<Ô CALL $ALOCB ;ALLOCATE IOPX FROM PRIMARY POOL (IOPX IN.../Õ ; ...DRIVER POOL IS A MAPPING NIGHTMARE!)T+Ö BCS 910$ ;IF CS, NO FREE POOL...GIVE UPR × MOV R0,R4 ;COPY IOPX ADDRESS9Ø MOV R3,-(SP) ;SAVE CURRENT I/O PACKET (IO.EIO) ADDRESSR&Ù MOV R0,-(SP) ;AND SAVE IOPX ADDRESSÚ ;R4Û ; INITIALIZE AN IOPX FOR AN EXTENDED READ REQUEST.Ü ;B"Ý TST (R4)+ ;SKIP PAST LINK WORD6Þ MOV R3,(R4)+ ;FILL IN ASSOCIATED I/O PACKET ADDRESS0ß MOV I.TCB(R3),(R4)+ ;FILL IN TASK TCB ADDRESS<à MOV I.PRM+2(R3),R3 ;USE R3 AS A POINTER INTO THE ITEMLIST3á MOV (R3)+,(R4)+ ;SAVE FUNCTION MODIFIERS IN IOPXH-â MOV (R3)+,(R4)+ ;MOVE UNUSED MODIFIER WORDI8ã MOV (R3)+,R0 ;GET VIRTUAL ADDRESS OF READ DATA BUFFER ä MOV (R3),R1 ;GET BUFFER SIZEå 9æ CALL CKBFB ;CHECK FOR READ ACCESS AND RELOCATE BUFFERTç 0è BCS 920$ ;IF CS, CHECK FAILED...RETURN ERROR6é MOV R1,(R4)+ ;SAVE FIRST WORD OF ADDRESS DOUBLEWORD7ê MOV R2,(R4)+ ;SAVE SECOND WORD OF ADDRESS DOUBLEWORD;.ë MOV (R3)+,(R4)+ ;SAVE LENGTH OF READ BUFFER.ì MOV (R3)+,(R4)+ ;SAVE TIMEOUT VALUE IN IOPXí î .IF DF T$$RPRï 5ð MOV (R3),R0 ;GET VIRTUAL ADDRESS OF PROMPT BUFFERI'ñ MOV 2(R3),R1 ;GET PROMPT BUFFER SIZEA8ò BIT #TF.RPR,-14(R4) ;EXTENDED READ W/PROMPT FUNCTION?ó BEQ 30$ ;IF EQ, NO...SKIPOô 9õ CALL CKBFR ;CHECK FOR READ ACCESS AND RELOCATE BUFFEREö 0÷ BCS 920$ ;IF CS, CHECK FAILED...RETURN ERROR6ø MOV R1,(R4)+ ;SAVE FIRST WORD OF ADDRESS DOUBLEWORD7ù MOV R2,(R4)+ ;SAVE SECOND WORD OF ADDRESS DOUBLEWORDNú "û TST (R3)+ ;POINT TO THE LENGTH0ü MOV (R3)+,(R4)+ ;SAVE LENGTH OF PROMPT BUFFER+ý MOV (R3)+,(R4)+ ;SAVE PROMPT VFC IN IOPXRþ ÿ BR 33$  30$:  .ENDC ;T$$RPR 1 ADD #6.,R3 ;SKIP PAST UNUSED ITEMLIST OFFSETST- ADD #8.,R4 ;SKIP PAST UNUSED IOPX OFFSETS  33$:: BIT #TF.RTT,-24(R4) ;READ W/TERMINATOR TABLE SPECIFIED? BEQ 35$ ;IF EQ, NO...SKIPU ? ; BIT #TF.PTT,-24(R4) ;WANT TO USE PREVIOUS TERMINATOR TABLE?M= ; BNE 35$ ;IF NE, YES...DON'T BOTHER TO CHECK TABLE PARAM.T 0 MOV (R3)+,R0 ;GET ADDRESS OF TERMINATOR TABLE/ MOV (R3),R1 ;GET LENGTH OF TERMINATOR TABLEE 9 CALL CKBFR ;CHECK FOR READ ACCESS AND RELOCATE BUFFERR 4 BCS 920$ ;IF CS, CHECK FAILED...RETURN THE ERROR6 MOV R1,(R4)+ ;COPY FIRST WORD OF ADDRESS DOUBLEWORD5 MOV R2,(R4)+ ;COPY LAST WORD OF ADDRESS DOUBLEWORDP3 MOV (R3)+,(R4)+ ;COPY LENGTH OF TERMINATOR TABLE 5 BR 37$ ;BRANCH SINCE POINTERS ARE ALREADY CORRECTM 35$:5 CMP (R3)+,(R3)+ ;SKIP PAST UNUSED ITEMLIST OFFSETST, ADD #6,R4 ;SKIP PAST UNUSED IOPX OFFSETS 37$:D BIT #TF.RDI,I.XMOD-I.XDBF(R4) ;READ WITH DEFAULT INPUT SPECIFIED? BEQ 40$ ;IF EQ NO < MOV (R3)+,R0 ;GET VIRTUAL ADDRESS OF DEFAULT INPUT BUFFER0 MOV (R3),R1 ;GET DEFAULT INPUT BUFFER LENGTH 9! CALL CKBFR ;CHECK FOR READ ACCESS AND RELOCATE BUFFERE" 0# BCS 920$ ;IF CS, CHECK FAILED...RETURN ERROR6$ MOV R1,(R4)+ ;SAVE FIRST WORD OF ADDRESS DOUBLEWORD7% MOV R2,(R4)+ ;SAVE SECOND WORD OF ADDRESS DOUBELWORDS7& MOV (R3)+,(R4)+ ;SAVE LENGTH OF DEFAULT INPUT BUFFERX' ;E:( ; EXTENDED READ ITEMLIST PARAMETERS HAVE BEEN VALIDATED.) ;N* 40$:1+ MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGT, &- MOV (SP)+,R0 ;RETRIEVE IOPX POINTER.. MOV (SP)+,R3 ;RESTORE I00¤€5Ž{´cÚµcÛ¶c�·c›’O.EIO PACKET POINTER/ ; @0 ; LINK THE CURRENT IOPX INTO THE U.TIXL LIST FOR THE TERMINAL.1 ;02 50$:E3 MOV U.TIXL(R5),(R0) ;POINT THIS IOPX TO FIRST IOPX IN LIST, IF ANYRA4 MOV R0,U.TIXL(R5) ;THIS IOPX NOW BECOMES THE FIRST IN THE LISTW65 MOV #S2.IRQ,R4 ;READS MUST BLOCK IF INPUT IS ACTIVE6 7 .IF DF T$$RPR8 69 BIT #TF.RPR,I.XMOD(R0);WAS READ W/PROMPT SPECIFIED?/: BEQ 60$ ;IF EQ, NO...ALL CHECKING COMPLETEDAE; MOV #S2.IRQ!S2.ORQ,R4 ;PROMPT MUST BLOCK IF ACTIVE INPUT OR OUTPUTS< 60$:= > .ENDC ;T$$RPR? @ .IF DF T$$OVLA !B JMP QUETRA ;TRANSFER TO QUEUERC D .IFF ;DF T$$OVLE F JMP QUEUE ;QUEUE THE REQUESTG H .ENDC ;DF T$$OVLI ;/J ; ERROR PROCESSING FOR EXTENDED I/O REQUESTS.IK ;NL M 910$: 7N MOV #IE.NOD&377,R0 ;SET ERROR FOR NO NODES AVAILABLE3O BR 930$ ;RETURN ERROR (REMAP DRIVER ON THE WAY)EP 920$:P+Q MOV R0,R4 ;SAVE ERROR COMPLETION STATUSE&R MOV (SP)+,R0 ;RETREIVE IOPX ADDRESS#S MOV #I.XLEN,R1 ;GET SIZE OF IOPX $T CALL $DEACB ;DEALLOCATE THE IOPX,U MOV (SP)+,R3 ;RETRIEVE I/O PACKET ADDRESS(V MOV R4,R0 ;RESTORE COMPLETION STATUSW 930$:J,X .IF DF T$$OVL ;IF THE DRIVER IS OVERLAIDY 1Z MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGE[ CLR R1 ;INPUT TO $IOFIN \ CALLR $IOFIN ;FINISH REQUEST] ^ .IFF ;DF T$$OVL_ 5` JMP EQPFIN ;FINISH THE I/O REQUEST WITH THE ERROR$a b .IFT ;T$$OVLVc d e .PAGEN;f .SBTTL . BUFFER ADDRESS CHECKING AND RELOCATION ROUTINESLg ; h ;+4i ; **-CKBFR - ADDRESS CHECK BUFFER FOR READ ACCESS:j ; **-CKBFB - ADDRESS CHECK BUFFER FOR READ/WRITE ACCESSk ;EKl ; THESE ROUTINES PERFORM THE DESCRIBED ADDRESS CHECKING ON A USER BUFFER. m ;MIn ; NOTE: THIS CODE IS DUPLICATED FROM TTINI IN THE OVERLAID/EXTENDED I/ONIo ; DRIVER DUE TO MAPPING CONSIDERATIONS. THE CODE MUST RUN IN APR5 BUTIFp ; CAN'T BE EASILY TRANSFERRED TO FROM THE OVERLAY SINCE DATA APR6 IS<q ; NOT MAPPED TO THE DRIVER'S DATA, BUT TO THE USER BUFFER.r ;I s ; INPUTS:'t ; R0 => USER BUFFER (VIRTUAL ADDRESS)Fu ; R1 = LENGTH OF USER BUFFERDv ; w ; OUTPUTS:R,x ; CC-C = 0 IF ADDRESS CHECK WAS SUCCESSFUL$y ; CC-C = 1 IF ADDRESS CHECK FAILED6z ; R0 = ERROR CODE FOR ADDRESS CHECK FAILURE REASON:0{ ; "IE.SPC" IF SPECIFIED BUFFER LENGTH IS ZEROD| ; "IE.SPC" IF BUFFER NOT WORD ALIGNED OR EXEC ADDRESS CHECK FAILS8} ; "IE.BAD" IF BUFFER SIZE IS GREATER THAN 8128. BYTES/~ ; R1 = BIAS OF RELOCATED USER BUFFER ADDRESST7 ; R2 = DISPLACEMENT OF RELOCATED USER BUFFER ADDRESS € ;B� ; REGISTERS MODIFIED: R0‚ ;-ƒ ;H„ … .IF DF A$$CHK† ‡ .ENABL LSB ˆ ‰ CKBFR:Š ‹ .IF DF R$$MPLŒ 7� MOV #$CKBFR,-(SP) ;SET UP CALL FOR READ-ACCESS CHECK Ž BR 10$ ;SKIP TO COMMON CODEA� � .IFTF ;R$$MPL‘ ’ CKBFB:“ ” .IFT ;R$$MPL • 8– MOV #$CKBFB,-(SP) ;SET UP CALL FOR WRITE-ACCESS CHECK— 10$:˜ ™ .IFTF ;R$$MPLš !› TST R1 ;IS BUFFER SIZE VALID?15œ BEQ 900$ ;IF EQ, NO...RETURN INVALID BUFFER ERRORI8� CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?7ž BHI 920$ ;IF HI, YES...RETURN BAD BUFFER SIZE ERRORŸ   .IFT ;R$$MPL ¡ ¢ .IF DF X$$HDR£ =¤ MOV (SP),-(SP) ;DUPLICATE MAPPING ROUTINE ADDRESS ON STACKH.¥ MOV KISAR6,2(SP) ;SAVE CURRENT EXEC MAPPING-¦ MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADER § ¨ .IFTF ;X$$HDR© 5ª CALL @(SP)+ ;CALL REQUESTED ADDRESS CHECK ROUTINEF« ¬ .IFT ;X$$HDRT­ -® MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGN¯ ° .ENDC ;X$$HDR± ² .IFF ;R$$MPL,³ +´ CALL $ACHKB ;DO NORMAL ADDRESS CHECKING µ ¶ .ENDC ;R$$MPL· -¸ BCS 910$ ;IF CS, IT FAILED...RETURN ERRORP¹ º .IFF ;A$$CHKH» ¼ CKBFR:½ CKBFB:¾ ¿ .IFTF ;A$$CHKÀ ;Á CALL $RELOC ;RELOCATE ADDRESS AND CONVERT TO DOUBLEWORDM RETURN ;ALL DONEIà Ä .IFT ;A$$CHKKÅ Æ 900$:Ç 8È .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESSÉ Ê 910$:FCË MOV #IE.SPC&377,R0 ;SET COMPLETION ERROR CODE FOR INVALID BUFFERPÌ BR 990$ ;SKIP;Í 920$: Î 8Ï .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESSÐ =00¤€¥€±|t÷tø tþfDATAÑ MOV #IE.BAD&377,R0 ;SET COMPLETION ERROR CODE FOR BAD SIZERÒ 990$:O Ó SEC ;RETURN WITH ERROR FLAGÔ RETURN ;ALL DONE.Õ Ö .DSABL LSB × Ø .ENDC ;A$$CHKÙ Ú Û .ENDC ;T$$OVLÜ .ENDC ;T$$EIOÝ Þ ß .ENDà Ä .IFT ;A$$CHKKÅ Æ 900$:Ç 8È .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESSÉ Ê 910$:FCË MOV #IE.SPC&377,R0 ;SET COMPLETION ERROR CODE FOR INVALID BUFFERPÌ BR 990$ ;SKIP;Í 920$: Î 8Ï .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESSÐ = .TITLE TTMOD  .IDENT /06.07/;U=; COPYRIGHT (c) 1986,1987 BY DIGITAL EQUIPMENT CORPORATION.U; ALL RIGHTS RESERVED.;R>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;T ;A ; 26-FEB-78 PETER WANNHEDEN. ;; ; PREVIOUSLY MODIFIED BY:P;; P. WANNHEDEN; C. F. SPITZ#; D. R. DONCHINA ; S. ADAMS;; MODIFICATIONS:;;R; L. KOGAN 02-NOV-85 06.019; LK701 -- FIX THE PROBLEM WITH DISABLING REMOTE LINES2; WHEN "CARRIER DETECT" IS SET BEFORE "RING" !; SIGNALR;; L. KOGAN 02-NOV-85 06.02:; LK702 -- FIX THE PROBLEM WITH DISABLING REMOTE LINES 1; WHEN CTS IS DROPPED FOR ABOUT 1/2 SEC AND ; THEN REASSERTED;N; S. ADAMS 16-JUNE-86 06.03D,; SA461 -- ON MODEM ANSWER CLEAR PASSTHRU;#!; S. R. CLOUTIER 8-AUG-86 06.04<; SRC -- ADD LHMHUP ENTRY POINT TO MHUP - CALLED BY TTLH2; DURING A STOP SESSION OR TIMEOUT. STATUS IS ; SUPPLIED IN R0 BEFORE CALL;C2; CHANGE MHUP TO SUPPLY STATUS TO KILLO1 IN R0;A; L. KOGAN 09-JAN-1987 06.05>; LK719 -- QUEUE AST ROUTINE AFTER HARDWARE DISCONNECT WHEN=; "MODEM HANG-UP AST" CHARACTERICTIC IS ENABLED (S3.MHE)T;E; T. Schoeller 6-FEB-87 06.06U>; TMS054 -- CORRECT SRC TO GET RID OF STATUS BEFORE RETURN.; ; T. Schoeller 7-MAR-87 06.07>; TMS055 -- Force R5 back to U.TSTA in USECDL!USECDH!USECDZ;I;S5;E6; 78 .PSECT MAP5.69; :;+#;; TTMOD - MODEM SUPPORT ROUTINES.H$<; CONTAINS THE FOLLOWING ROUTINES:=;*>; MODISR MODEM INTERRUPT SERVICE ROUTINE)?; HLMTIM SUBROUTINE TO SERVICE TIME-OUTS.@; MANS SUBROUTINE TO ANSWER A CALL ON A LINE%A; MHUP SUBROUTINE TO HANG UP A LINE B;-C;rD;BEF .IF DF T$$MODG H .ENABL LSB IJ;+JK; MODISR - INTERRUPT SERVICE ROUTINE FOR DATASET STATUS CHANGE INTERRUPT;L; ON DM11-BB, DL11-E OR DHV11, OR FROM DZ11 POLL SEQUENCESM;E N; INPUT:=O; R4 BIT 15: 1 IF INTERFACE SUPPORTS "DATASET READY" SIGNALS/P; BIT 14: 1 IF DATASET SHOWS "DATASET READY",Q; BIT 7: 1 IF RING HAS OCCURRED (DM11-BB)#R; 1 IF LINE IS RINGING (DL11-E)S2S; 1 RING INTEGRATED OVER THREE SAMPLES (DHV11).T; BIT 6: 1 IF DATASET SHOWS "CLEAR TO SEND"+U; BIT 5: 1 IF DATASET SHOWS "CARRIER ON"SV; R5 POINTER TO U.TSTAW;R X; OUTPUT:R'Y; 1. IF LINE IS NOT REMOTE, DROP DTR.T7Z; 2. IF LINE IS DISABLED AND NOT WAITING FOR CARRIER:E<[; 2.1 IF BIT 1 OF $TTPRM IS 0, AND NO RING SEEN, DROP DTR.F\; 2.2 IF BIT 1 OF $TTPRM IS 0, AND RING SEEN, SET A TIMER FOR M$$ANSA]; SECONDS AND RAISE DTR. (ANSWER A CALL AND WAIT FOR CARRIER.)S;^; 2.3 IF BIT 1 OF $TTPRM IS 1, AND DSR IS OFF, NO ACTION.SD_; 2.4 IF BIT 1 OF $TTPRM IS 1, AND DSR AND CARRIER AND CTS ARE ON,.`; ENTER SUBROUTINE MANS TO ANSWER THE CALL.Ea; 2.5 IF BIT 1 OF $TTPRM IS 1, DSR IS NOT AVAILABLE AND CARRIER ANDT"b; CTS ARE BOTH ON, SAME AS 2.4.Ec; 2.6 IF BIT 1 OF $TTPRM IS 1, DSR IS NOT AVAILABLE AND CARRIER ANDE$d; CTS ARE NOT BOTH ON, NO ACTION.Fe; 2.7 IF BIT 1 OF $TTPRM IS 1, AND DSR IS ON BUT CARRIER AND CTS ARE@f; NOT BOTH ON, SET A TIMER FOR M$$ANS SECONDS. (ANSWER A CALLg; AND WAIT FOR CARRIER.) 3h; 3. IF LINE IS DISABLED AND WAITING FOR CARRIER:Di; (RING FLAG IS IGNORED) 5j; 3.1 IF DSR IS OFF, DROP DTR AND HANG UP THE LINE.B?k; 3.2 IF CARRIER AND CTS ARE ON, CLEAR WAITING FLAG AND ENTERC?l; SUBROUTINE "MANS". (CARRIER APPEARED WITHIN WAITING00¥"€5Ž{´cÚµcÛ¶c�·c›’ PERIODR$m; M$$ANS AFTER ANSWERING A CALL.),n; 3.3 IF CARRIER OR CTS IS OFF, NO ACTION.6o; 4. IF LINE IS ENABLED AND NOT WAITING FOR CARRIER:5p; 4.1 IF DSR IS OFF, DROP DTR AND HANG UP THE LINE. 2q; 4.2 IF CARRIER AND CTS ARE BOTH ON, NO ACTION.Gr; 4.3 IF BIT 0 OF $TTPRM IS 0, AND CARRIER OR CTS IS OFF, SET A TIMERDEs; FOR M$$CAR SECONDS AND SET WAITING FLAG. (CARRIER LOST, WAIT FORCt; IT TO RETURN.),Hu; 4.4 IF BIT 0 OF $TTPRM IS 1, AND CARRIER OR CTS IS OFF, DROP DTR ANDv; HANG UP THE LINE.2w; 5. IF LINE IS ENABLED AND WAITING FOR CARRIER:6x; (NOTE - THIS IS THE STATE THE LINE SHOULD STAY IN5y; UNTIL A BYE COMMAND HAS BEEN SUCCESSFULLY QUEUEDD6z; AFTER HAVING FAILED EARLIER AS RESULT OF HANG-UP.5{; IN THIS STATE, DTR SHOULD BE OFF SO THAT CARRIERI8|; WILL NEVER BE SEEN - CASE 5.4 SHOULD NEVER HAPPEN.)4}; 5.1 IF RING SEEN, DROP DTR AND HANG UP THE LINE.5~; 5.2 IF DSR IS OFF, DROP DTR AND HANG UP THE LINE.I@; 5.3 IF CARRIER OR CTS IS OFF, NO ACTION. (LINE STILL WITHOUT*€; CARRIER, WAIT FOR CARRIER TO RETURN.);�; 5.4 IF CARRIER AND CTS ARE BOTH ON, CLEAR WAITING FLAG.A7‚; (LINE RETURNED TO NORMAL CONDITION AFTER TEMPORARYEƒ; LOSS OF CARRIER.)„;E…; IN EITHER CASE:A †; CC-V 0$‡; CC-C 0 IF A CALL WAS ANSWEREDˆ; 1 NO ACTIONW‰; 1.Š; CC-C 0 CALLER SHOULD ENABLE DTR AND RTS)‹; 1 CALLER SHOULD DISABLE DTR AND RTSLŒ;�; REGISTERS ALTERED: R2,R4Ž;-�;U�; 6‘MODISR::BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;REMOTE LINE?’ BEQ 47$ ;;;N - IGNOREI“ COMB R4 ;;;INVERT FLAGSN-” ROLB R4 ;;;GET INVERTED RING FLAG IN CC-CA4• MOVB U.STS-U.TSTA(R5),R2 ;;;GET DSB AND CRW FLAGS/– BIC #^C,R2 ;;;CLEAR JUNK BITSE— ASSUME US.DSB,2˜ ASSUME US.CRW,4;™ JMP @MDSP(R2) ;;;DISPATCH ACCORDING TO DSB AND CRW FLAGSš; 1›; CASE 2 - DISABLED AND NOT WAITING FOR CARRIERAœ;S2�MODI2:: BIT #2,$TTPRM ;;;ENABLE DTR BEFORE RING?ž BNE 3$ ;;;Y - JUMP2ž BCS 30$ ;;;RING NOT SEEN - NO ACTION ; LK701G  MOVB #M$$ANS+1,U.TMTI-U.TSTA(R5) ;;;SET TIMER = M$$ANS SECONDS ;**-1L9¡ BISB #US.CRW,U.STS-U.TSTA(R5) ;;;SET CARRIER-WAIT FLAGS1¢ SEV ;;;SET CC-V (CC-C IS CLEAR) TO RAISE DTRS £ RETURN2 ¤3$: ROL R4 ;;;CHECK DSR FLAGS7¥ BVS 25$ ;;;DSR OFF - NO ACTION (BUT LEAVE DTR HIGH)A?¦ BIT #600,R4 ;;;DSR ON (OR N/A) - HOW ABOUT CARRIER AND CTS?O9§ BEQ MANS ;;;CARRIER AND CTS BOTH ON - ANSWER THE CALLA/¨ BCC 30$ ;;;DSR IS NOT AVAILABLE - NO ACTIONB*© TST R4 ;;;DSR IS AVAILABLE - IS IT ON?ª BEQ 30$ ;;;N - JUMPMD«5$: MOVB #M$$ANS+1,U.TMTI-U.TSTA(R5) ;;;SET TIMER = M$$ANS SECONDS%¬ BR 20$ ;;;GO AND WAIT FOR CARRIERS­;S-®; CASE 3 - DISABLED AND WAITING FOR CARRIER¯;T$°MODI3:: ROL R4 ;;;CHECK DSR FLAGS/± BVS 45$ ;;;DSR WENT AWAY - HANG UP THE LINET=² BIT #600,R4 ;;;DSR ON (OR N/A) - CARRIER AND CTS BOTH ON?R³ BNE 30$ ;;;N - JUMP;´ BR MANS ;;;ANSWER CALLµ;R0¶; CASE 4 - ENABLED AND NOT WAITING FOR CARRIER·;T$¸MODI4:: ROL R4 ;;;CHECK DSR FLAGS/¹ BVS 45$ ;;;DSR WENT AWAY - HANG UP THE LINE#1º BIT #600,R4 ;;;CARRIER AND CTS STILL BOTH ON?C» BEQ 30$ ;;;Y - JUMPD?¼ BIT #1,$TTPRM ;;;DROP LINE IMMEDIATELY UPON LOSS OF CARRIER?A½ BNE 45$ ;;;Y - JUMPOC¾ MOVB #M$$CAR+1,U.TMTI-U.TSTA(R5) ;;;SET TIMER FOR M$$CAR SECONDSL"¿ BR 20$ ;;;GO AND SET WAIT FLAGÀ;-,Á; CASE 5 - ENABLED AND WAITING FOR CARRIERÂ;;!ÃMODI5:: BCC 45$ ;;;RING - JUMPÄ ROL R4 ;;;CHECK DSR FLAGSI/Å BVS 45$ ;;;DSR WENT AWAY - HANG UP THE LINEKÆ SEC ;;;SET CC-C+Ç BIT #600,R4 ;;;CARRIER AND CTS BOTH ON?TÈ BNE 40$ ;;;N - JUMPC4È BIT #1,$TTPRM ;;;DROP LINE IMMEDIATELY? ; LK7022È BNE 40$ ;;;NO - RETURN TO THE CALLER ; LK702*É BR 50$ ;;;BOTH ON - CLEAR WAITING FLAGÊ ;;;AND EXIT WITH CC-C = 1M8Ë10$: MOVB #1,U.TMTI-U.TSTA(R5) ;;;SET TIMER = 1 SECOND=Ì20$: BISB #US.CRW,U.STS-U.TSTA(R5) ;;;SET CARRIER-WAIT FLAGOÍ25$: CLV ;;;SHOW NO ACTION%Î30$: SEC ;;;SHOW NO CALL ANSWERED4 Ï40$: RETURN Ð;-)Ñ; COME HERE TO HANG UP LINE IMMEDIATELYÒ;#6Ó4500¥*€€±|t÷tø tþfDATA$: CALL 10$ ;;;START TIMER, SET CARRIER-WAIT FLAGBÔ47$: .WORD SEC!SEV ;;;SET CC-V AND CC-C TO DROP DTR UPON RETURN Õ RETURN Ö×;TØ; Ù;+$Ú; SUBROUTINE MANS - ANSWER A CALL.Û;A Ü; INPUT:Ý; R5 POINTER TO U.TSTAÞ;M ß; OUTPUT: ?à; UCB IS INITIALIZED. DISABLE AND CARRIER-WAIT FLAGS CLEARED.,%á; CC-C 0 TO INDICATE CALL ANSWERED.Aâ;ã; REGISTERS ALTERED: NONEä;-å; æ;HçMANS::é ;**-1Rê .IF DF USECDL!USECDH!USECDZëì .IFTF ;USECDL!USECDH!USECDZí:í BIS #S2.FLF,2(R5) ;;;INITIALIZE STATUS WORD 2 ;TMS055#ï CLC ;;;AND CLEAR CC-C ;**-1Pðñ .IFFUò3ò TST (R5)+ ;;;POINT TO 2ND STATUS WORD ;TMS055 <ó BIC #S2.WRA!S2.WRB!S2.CR,(R5)+ ;;;INITIALIZE STATUS WORDS2ó BIC #S3.FDX!S3.8BC!S3.RAL!S3.PTH,(R5) ;SA4615ó ;;;CLEAR FULL DUPLEX, 8 BIT CHARACTERS, ;SA461E/ó ;;;READ-ALL, NO-ECHO AND PASSTHRU ;SA461N)õ BIS #S3.ACR,(R5)+ ;;;SET ACR ;**-1 )ö BIC #^C,(R5) ;;;"÷ SUB #6,R5 ;;;POINT TO U.TSTA)ø CLR U.TST5-U.TSTA(R5) ;;;CLEAR U.TST5OCù BIC #U2.CRT!U2.HLD!U2.L3S!U2.VT5!U2.ESC,U.CW2-U.TSTA(R5) ; DD168*ú ;;;INITIALIZE CHARACTERISTICS WORD 2-û BIC #U3.UPC,U.CW3-U.TSTA(R5) ;;;AND WORD 3;*ü MOV #72.,U.CW4-U.TSTA(R5) ;;;AND WORD 49ý CLRB U.TTYP-U.TSTA(R5) ;;;SET TERMINAL TYPE TO UNKNOWNXþÿ .ENDC .IF DF R$$MPL!A$$CLI-1 BIC #UM.CLI,U.MUP-U.TSTA(R5) ;;;SET MCR AS CLI+ .ENDC .IF DF M$$CLI1  MOV #$MCRPT,U.CLI-U.TSTA(R5) ;;;SET MCR AS CLIT   .ENDC   .IF DF T$$SERC BIC #UM.SER!UM.CMD,U.MUP-U.TSTA(R5) ;;;RESET SERIAL COMMAND MODET .ENDC .IF DF D$$M11!D$$ZMD!D$$VMD ASSUME S4.ABD,10000034 TST 6(R5) ;;;AUTO-BAUD DETECT SET FOR THIS LINE?/ BPL 50$ ;;;IF NOT,DON'T START ABD DETECTIONRD BIS #S5.ABP,U.TST5-U.TSTA(R5) ;;;Y - INITIATE AUTO-BAUD DETECTION= MOV #S.4800,U.CW4-U.TSTA(R5) ;;;SET INITIAL AUTOBAUD SPEEDN .ENDC ;D$$M11!D$$ZMD!D$$VMD@50$: CLRB U.TMTI-U.TSTA(R5) ;;;STOP MODEM TIMER AND CLEAR CC-C+60$: BICB #US.DSB!US.CRW,U.STS-U.TSTA(R5).+  ;;;ENABLE LINE AND CLEAR WAITING FLAG%! RETURN ;;;RETURN WITH CC-V CLEARV" # .DSABL LSB4$%&;+7'; HLMTIM - TIME-OUT ON DM11-BB, DL11-E, DHV11 OR DZ11(;L ); INPUT:*; R5 POINTER TO U.TSTA+; ,; OUTPUT:P-; IF CARRIER-WAIT FLAG = 0:AF.; IF LINE IS LOCAL, RETURN TO CALLER WITH Z-BIT SET, WHICH INDICATES(/; THAT DTR AND RTS SHOULD BE DROPPED.I0; IF LINE IS REMOTE, RETURN TO CALLER WITH Z-BIT CLEAR, WHICH INDICATESC)1; THAT DTR AND RTS SHOULD BE ASSERTED.(2; 3; ELSE:A:4; CALLER CALLED AS COROUTINE WITH INTERRUPTS LOCKED OUT.55; ON RETURN FROM CALLER, THE FOLLOWING IS EXPECTED:T6;T7; R5 UNCHANGED8; DTR AND RTS DROPPED.9;-:;N;;@<HLMTIM::BITB #US.CRW,U.STS-U.TSTA(R5) ;;;ARE WE STILL WAITING?= BNE 20$ ;;;Y - JUMPS0> BIT #2,$TTPRM ;;;DON'T ASSERT DTR UNTIL RING?6? BEQ 10$ ;;;Y - JUMP (LEAVING CC-Z SET TO DROP DTR)2@ BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;IS LINE REMOTE?9A10$: RETURN ;;;RETURN TO CALLER WITH Z-BIT INDICATION(<B20$: SEZ ;;;SET Z-BIT TO TELL CALLER TO DROP DTR AND RTS-C CALL @(SP)+ ;;;CALL CALLER AS A COROUTINEE7D CALL @(SP)+ ;;;ALLOW INTERRUPTS (RETURN TO LOCKI IS $E ;;;ASSUMED TO BE ON THE STACK)?F MOVB #M$$DIS+1,U.TMTI-U.TSTA(R5) ;SET TIMER = M$$DIS SECONDS/G BITB #US.DSB,U.STS-U.TSTA(R5) ;LINE ENABLED? "H BEQ MHUP ;Y - HANG UP THE LINE4I BICB #US.CRW,U.STS-U.TSTA(R5) ;CLEAR WAITING FLAG J RETURNUKL; M; N;+O; SUBROUTINE MHUP - HANG UP.'P; MAY ONLY BE CALLED AT SYSTEM STATE!:Q; R; INPUT:S; R5 POINTER TO U.TSTA:T; US.DSB 0 TO PREVENT THAT A RING IS ANSWERED BEFORE THEU; TERMINAL IS LOGGED OFFR2V; LINE PHYSICALLY HUNG UP (DTR AND RTS DROPPED).W; X; OUTPUT:V(Y; IF ANY I/O WAS ACTIVE, IT IS KILLED.7Z; IF TERMINAL WAS LOGGED ON, A BYE COMMAND IS QUEUED.E'[; IF BYE COMMAND SUCCESSFULLY QUEUED:I\; US.DSB 1 (LINE DISABLED)A]; US.CRW 0 (NOT WAITING)R ^; ELSE:_; US.DSB 0 (L00¥2€¦9€Ž{´cÚµcÛ¶c�·c›’INE ENABLED)`; US.CRW 1 (WAITING)Aa;Y%b; REGISTERS ALTERED: R0,R1,R2,R3,R4 c;-d; e;I>eMHUP:: MOV #IE.DNR&377,R0 ;SET DEFAULT STATUS, IE.DNR ;SRC,eLHMHUP::MOV R0,-(SP) ;SAVE STATUS ;SRCIe BISB #US.CRW,U.STS-U.TSTA(R5) ;ASSUME FAILURE TO SEND BYE COMMAND ;SRCA4g ;THIS ALSO PREVENTS PROCESSING OF INPUT ;**-1h ;INTERRUPTSMij .IF DF T$$SPLkGl MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;MAP UCBX JUST IN CASE (IT MAY NOT BE.6m ;MAPPED IF WE COME HERE FOR POWER UP PROCESSING)no .ENDC ;T$$SPLp(q CALL I1CTXL ;FLUSH TYPE-AHEAD BUFFER6r BIC #S5.ABP,U.TST5-U.TSTA(R5) ;RESET AUTO-BAUD MODEst .IF DF T$$SPLu.v MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBXwx .IFF ;T$$SPL.y$z MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX{ BEQ 10$ ;NONE - JUMP|} .ENDC ;T$$SPL~) ASSUME U.TITI&1,0 ;U.TITI MUST BE EVEN€ ASSUME U.TOTI,U.TITI+10� CLR U.TITI(R4) ;CLEAR INPUT AND OUTPUT TIMERS5� MOV (SP),R0 ;GET STATUS TO RETURN TO TASK ;SRC 6� CALL KILLI1 ;KILL INPUT (IF ANY IN PROGRESS) ;SRC8� MOV (SP),R0 ;GET STATUS TO RETURN TO TASK ;TMS0548„ CALL KILLO1 ;KILL OUTPUT (IF ANY IN PROGRESS) ;**-2… ;WITH STATUS IE.DNRU;…10$: TST (SP)+ ;GET RID OF STATUS OFF THE STACK ;TMS054T‡ ;**-1Xˆ .IF DF M$$MUP‰4Š BIT #U2.LOG,U.CW2-U.TSTA(R5) ;TERMINAL LOGGED ON?‹ BNE 20$ ;N - JUMPŒ� .IF DF T$$SPCŽ%� CLR R1 ;SET STATUS TO REQUEST BYEU� MOV R5,R2 ;SET UCB ADDRESS‘ SUB #U.TSTA,R2 ;S$’ CALL $QCNTP ;QUEUE A BYE COMMAND“” .IFF ;T$$SPC)•0– MOV #M$$CRB,R1 ;GET CLI COMMAND BUFFER LENGTH*— CALL $ALOCB ;ALLOCATE A CLI CMD BUFFER˜ BCS 40$ ;FAILED - EXIT"™ MOV R0,R1 ;COPY BUFFER POINTER"š TST (R0)+ ;SKIP OVER LINK WORD› MOV R5,R2 ;"œ SUB #U.TSTA,R2 ;GET UCB ADDRESS#� MOV R2,(R0)+ ;INSERT UCB ADDRESST'ž MOV #"BY,(R0)+ ;INSERT "BYE" COMMANDŸ MOV #'E!,(R0)+C$  CALL $QMCR ;QUEUE COMMAND TO MCR¡¢ .ENDC ;T$$SPC£¤ .ENDC ;M$$MUP¥A¦; THE LINE MAY HAVE BECOME NON-REMOTE. IF SO, LEAVE IT ENABLED.§;V1¨20$: BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE? © BEQ 30$ ;N - JUMP © ; LK719$© .IF DF T$$MHU ; LK719C© ; LK719;© BIT #S3.MHE,4(R5) ;IS CHARACTERISTIC ENABLED? ; LK719.!© BEQ 25$ ;BR IF NO ; LK719,© ; LK719R© .IF DF T$$SPL ; LK719B© ; LK719#.© MOV #120000,R4 ;POINT TO UCBX. ; LK719© ; LK719.© .IFF ;T$$SPL ; LK719© ; LK719M4© MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBX ; LK719© ; LK719R© .ENDC ;T$$SPL ; LK719 © ; LK719M0© MOV U.TMHA(R4),R1 ;GET ACB ADDRESS ; LK719© ; LK719 © .IF DF T$$OVL ; LK719I© ; LK719L"© MOV #QUEAEN,-(SP) ; LK719*© CALL MPROT ;QUE AST TO TASK ; LK719© ; LK719K© .IFF ;T$$OVL ; LK719© ; LK719T5© CALL QUEAEN ;QUEUE AST TO ATTACHED TASK ; LK719$© ; LK719© .ENDC ;T$$OVL ; LK719U© .ENDC ;T$$MHU ; LK719L© ; LK719K©25$: ; LK719 -ª BISB #US.DSB,U.STS-U.TSTA(R5) ;Y - DISABLEH=«30$: BICB #US.CRW,U.STS-U.TSTA(R5) ;CLEAR CARRIER-WAIT FLAG.¬40$: RETURN ; ­® .ENDC ;T$$MOD¯°;±;V² .END-(SP) ; LK719*© CALL MPROT ;QUE AST TO TASK ; LK719© ; LK719K© .IFF ;T$$OVL ; LK719© ; LK719T5© CALL QUEAEN ;QUEUE AST TO ATTACHED TASK ; LK719$© ; LK719© .ENDC ;T$$OVL ;  .TITLE TTYH .IDENT /06.03/K;B; COPYRIGHT (c) 1983,1986,1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;0>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;  ;7 ; 27-JAN-78 PETER WANNHEDENT ;  ; PREVIOUSLY MODIFIED BY:K;.; P. WANNHEDEN; C. F. SPITZ ; D. R. DONCHINL; R. PHILPOTTA ; S. ADAMS ; L. KOGAN;; MODIFICATIONS:;N;$; L. KOGAN00¦:€€±|t÷tø tþfDATA 02-NOV-85 06.01<; LK703 -- DO NOT DISABLE REMOTE LINE WHEN DTR IS DROPPED;I; L. KOGAN 18-JUN-86 6.024; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORT;D"; TODD SCHOELLER 27-Nov-86 06.03?; TMS047 -- SET TIMER TO EXPIRE IN THE UCB EXTENSION INDEXED; OFF OF THE CORRECT R4.;E0;1;2;+,3; CONTROLLER-DEPENDENT ROUTINES FOR DH-11.4;-5;P6;78 .IF DF D$$H119:; .MCALL UCBDF$<= UCBDF$ ;DEFINE UCB SYMBOLSI>? .IF DF R$$MPL@A .MCALL KRBDF$BC KRBDF$ ;DEFINE KRB SYMBOLSTDE .IFF ;R$$MPLOFG .MCALL SCBDF$HI SCBDF$ ;DEFINE SCB SYMBOLSLJK .ENDC ;R$$MPLLM .PSECT MAP5N;OO;HP; EQUATED SYMBOLS3Q; R; DH-11 REGISTER DEFINITIONSS; TSCR = 0 ;SYSTEM CONTROL REG.F$UNRC = 2 ;NEXT RECEIVED CHAR. REG.VLPR = 4 ;LINE PARAMETER REG.R WCAR = 6 ;CURRENT ADDRESS REG.XBCR = 10 ;BYTE COUNT REG.YBAR = 12 ;BUFFER ACTIVE REG.FZ;D[; \;+]; YHSTAX - START OUTPUT.7^; NOTE - NON-BUFFERED OUTPUT CURRENTLY NOT SUPPORTED.L_; `; INPUT:>a; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.b; U.TOP+2 BUFFER POINTERc; U.TOC BYTE COUNTd; e; OUTPUT:Bf; OUTPUT STARTED. g; U.TOP+2 UNCHANGEDh; U.TOC UNCHANGEDi;Rj; REGISTERS ALTERED: R4Rk;-l;Rm;. n .ENABL LSBIo;R pYHSTAX::Cq BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;HIGH PRIORITY OUTPUT REQUESTED?A7r BEQ 5$ ;;;N - POSSIBLY BEGIN NORMAL PRIORITY OUTPUTX?s BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT ALREADY IN PROGRESS?P<t BEQ 60$ ;;;Y - DO HIGH PRIORITY OUTPUT AT NEXT INTERRUPTGu BIS #S5.HPO,U.TST5-U.TSTA(R5);;;SHOW BUSY DOING HIGH PRIORITY OUTPUTT6v ;;;IN CASE A NORMAL PRIORITY REQUEST COMES ALONG(wSTAXH: CALL SELLIN ;;;SELECT THE LINE3x BIT #S5.XOF,U.TST5-U.TSTA(R5) ;;;OUTPUT AN XOFF?y BEQ 3$ ;;;N - JUMP8z BIC #S5.XOF,U.TST5-U.TSTA(R5) ;;;Y - RESET INDICATION{| .IF DF T$$SPL}3~ MOV #YVXOFF-20000,CAR(R3) ;;;POINT TO DMA BUFFER€ .IFF ;T$$SPL.�-‚ MOV #YVXOFF,CAR(R3) ;;;POINT TO DMA BUFFER$ƒ„ .IFTF ;T$$SPL…† BR 4$ ;;;JOIN COMMON CODESN‡3$: BIC #S5.XON,U.TST5-U.TSTA(R5) ;;;NOT XOFF, MUST BE XON, RESET INDICATIONˆ‰ .IFT ;T$$SPLYŠ,‹ MOV #YVXON-20000,CAR(R3) ;;;OUTPUT AN XONŒ� .IFF ;T$$SPL#Ž'� MOV #YVXON,CAR(R3) ;;;OUTPUT AN XON�‘ .ENDC ;T$$SPL’0“4$: MOV #-1,BCR(R3) ;;;SET TO OUTPUT ONE CHAR.=” BR YHRESX ;;;INITIATE THE OUTPUT REGARDLESS OF XOFF STATE;P•5$: BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;HIGH PRIORITY OUTPUT REQUEST IN PROGRESS?<– BNE 60$ ;;;Y - DO NORMAL PRIORITY OUTPUT AT NEXT INTRPT.—STAXN: ;;;REFERENCE LABEL˜™ .IF DF T$$ACDš.› BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT?œ BNE 10$ ;;;Y - JUMP0"� ADD #U.TOC,R4 ;;;POINT TO U.TOC:žSTAXM: MOV R2,-(SP) ;;;SAVE R2 DESTROYED BY MOUT ROUTINE-Ÿ CALL MOUT ;;;GET NEXT CHARACTER TO OUTPUT3;  MOVB R2,U.ADMA-U.TSTA(R5) ;;;PUT CHARACTER IN DMA BUFFERU¡ MOV (SP)+,R2 ;;;RESTORE R2¢ CALL SELLIN ;;;SELECT LINE(£ MOV R5,CAR(R3) ;;;POINT TO DMA BUFFER!¤ ADD #U.ADMA-U.TSTA,CAR(R3) ;;;L*¥ MOV #-1,BCR(R3) ;;;OUTPUT ONE CHARACTER!¦ BR 50$ ;;;INITIATE THE OUTPUT §¨ .ENDC ;T$$ACD©*ª10$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2« CALL SELLIN ;;;SELECT LINE¬STAX1:­® .IF DF T$$SPL¯3° MOV (R4),CAR(R3) ;;;SET BUFFER ADDRESS (U.TOP+2)O'± CMP (R4)+,#120000 ;;;IN SYSTEM POOL?M/² BLO 20$ ;;;Y - UMR MAPPING IS CORRECT, JUMPBB³ SUB #20000,CAR(R3) ;;;FORCE BUFFER ADDRESS TO MAP THROUGH UMR 5´20$: ;;;REFERENCE LABELµ¶ .IFF ;T$$SPLD·¸ .IF DF M$$EXT¹4º MOV (R4)+,CAR(R3) ;;;SET BUFFER ADDRESS (U.TOP+2)»¼ .IFF ;M$$EXTO½0¾ MOV (R4)+,-(SP) ;;;GET VIRTUAL BUFFER ADDRESS%¿ CMP @SP,#120000 ;;;IN SYSTEM POOL? 8À BLO 40$ ;;;Y - VIRTUAL ADDRESS = PHYS. ADDRESS, JUMP?Á ADD RELC+2,@SP ;;;ADD RELOCATION CONSTANT TO VIRTUAL ADDRESS0 MOV RELC,-(SP) ;;;à BCC 30$ ;;;NO CARRY - JUMP+Ä ADD #20,@SP ;;;ADD CARRY TO HIGH 2 BITSR+Å BIC #^C<60>,@SP ;;;NORMALIZE HIGH 2 BITS:00¦B€9€Ž{´cÚµcÛ¶c�·c›’;Æ30$: BISB (SP)+,@R3 ;;;LOAD 2 HIGH BITS OF 18-BIT ADDRESS$$Ç40$: MOV (SP)+,CAR(R3) ;;;LOAD CARÈÉ .ENDC ;M$$EXTÊË .ENDC ;T$$SPLÌÍ ASSUME U.TOC,E3Î MOV @R4,BCR(R3) ;;;SET BYTE COUNT (U.TOC) IN BCRSÏ NEG BCR(R3) ;;;NEGATE ITÐ ASSUME S2.CTS,100000A.Ñ50$: TST 2(R5) ;;;OUTPUT STOPPED BY CTRL-S?)Ò BMI 60$ ;;;IF SO, DON'T RESUME OUTPUT,Ó; Ô;Õ;+Ö; YHRESX - RESUME OUTPUT.A×;0 Ø; INPUT:>Ù; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. Ú; S2.CTS 0SÛ;-Ü; Ý;AHÞYHRESX::BIS $BTMSK(R2),BAR(R3) ;;;SET BIT IN BAR TO START TRANSMISSIONßà .IF NDF D$$M11á âYHMTIM::ãä .ENDC ;D$$M11åæ60$: RETURN ;;;Rç;; è .DSABL LSBTé;Oê; ë;+ì; YHABOX - ABORT OUTPUT.í;A î; INPUT:>ï; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.ð; ñ; REGISTERS ALTERED: R3Uò;-ó;ô;+õYHABOX::CALL YHSTOX ;;;STOP TRANSMISSIONNö CALL SELLIN ;;;SELECT LINE#÷ CLR BCR(R3) ;;;CLEAR BYTE COUNT9ø CLR BCR(R3) ;;;DO IT AGAIN - CONTROLLER MAY HAVE BEENB+ù ;;;DOING A READ-MODIFY-WRITE CYCLE ONN0ú ;;;THE BYTE COUNT REGISTER WHEN WE CLEAREDû ;;;IT FIRST TIMEü RETURN ;;;ý;þ;Bÿ;+; YHSTOX - STOP OUTPUT.B;A ; INPUT:>; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 1N;-;;IIYHSTOX::BIC $BTMSK(R2),BAR(R3) ;;;CLEAR BIT IN BAR TO STOP TRANSMISSIONI  RETURN ;;;E ;  ;L   .ENABL LSBR .IF DF T$$GMC!T$$SMC!D$$M11;+%; YHLPAR - GET/SET LINE PARAMETERS.B; ; INPUT:; R0 BIT 15: 0 = SET SPEED; 1 = GET SPEEDN6; BIT 13: 1 = SET 7-BIT CHARACTER LENGTH ; LK710?; BIT 12: 1 = CHECK IF 7-BIT CHARACTER IS SUPPORTED ; LK710=; BIT 11: 1 = SET SPEED SELECTED BY AUTO-BAUD DETECT LOGICN+; BIT 10: 1 = SET DEVICE DEPENDENT SPEED#; (USED FOR SETTING PARITY)L$; BIT 9: 1 = GET/SET ANSWER SPEED%; BIT 8: 0 = GET/SET RECEIVE SPEEDN ; 1 = GET/SET TRANSMIT SPEED; IF SET SPEED:1; BITS 0-7: NEW SPEED PARAMETER (S.XXX SYMBOL) ;:( ; R1 Flow control status change flags.!;P*"; BIT 0: 1 = Enable input flow control.+#; BIT 1: 1 = Disable input flow control.-+$; BIT 2: 1 = Enable output flow control.T,%; BIT 3: 1 = Disable output flow control.&;I'; BITS 4-15: Reserved(; >); REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.*; +; OUTPUT:W,; IF GET SPEED REQUESTED:/"-; R4 POINTER TO DH11 SPEED TABLE .; CC-C 0/;0; IF SET SPEED REQUESTED: 1; CC-C 0 IF OK!2; 1 IF ILLEGAL SPEED SPECIFIED13; L4; NOTE THAT THIS ROUTINE CAN BE EXECUTED AT BOTH SYSTEM STATE (IN RESPONSEP5; TO A SF.GMC OR SF.SMC QIO) AND FROM THE INPUT INTERRUPT SERVICE ROUTINE (FOR6; AUTO-BAUD DETECT).7;i8;-9;t:; ;;o <YHLPAR::=+> TST R1 ;Called for flow control change? ? BEQ 5$ ;If EQ no - go on.N"@ RETURN ;Not processed for DH.A5$:S&A .IF DF T$$GMC ! T$$SMC ; LK710A ; LK710C;A BIT #20000,R0 ;CHECK IF WE VALIDATE 7-BIT CHAR. ; LK710 A BEQ 7$ ;NO ; LK7101A RETURN ; LK710RA7$: ; LK710,A BIT #10000,R0 ;CHECK SET 7-BIT ; LK710+A BEQ 8$ ;NO. SET SPEED-PARITY ; LK710P;A BR SETLN1 ;SET 7-BIT AND OTHER LINE PARAMETERS ; LK710A8$: ; LK710A ; LK710a&A .ENDC ;T$$GMC ! T$$SMC ; LK710A ; LK710N0B BIT #4000,R0 ;SET SPEED FOR AUTO-BAUD DETECT?C BEQ 20$ ;N - JUMP (D BIT #2000,R0 ;DEVICE DEPENDENT SPEED?E BNE 10$ ;Y - JUMPA#F BIC #177400,R0 ;CLEAR UPPER BYTE76G MOVB SPDH-1(R0),R0 ;GET DEVICE DEPENDENT SPEED BITS/H10$: BIC #^C<17>,R0 ;CLEAR ALL BUT SPEED BITSII MOV R0,R2 ;GET A COPYOJK .IF DF R$$EISL:M ASH #4,R2 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITIONNO .IFF ;R$$EIS P<Q CALL SHIFT4 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITIONRS .ENDC ;R$$EIST(U BIS R0,R2 ;ADD IN RECEIVE SPEED BITS6V MOVB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED IN DATABASE5W BR SETLN1 00¦J€€±|t÷tø tþfDATA;SET PARITY AND NEW SPEED IN CONTROLLER4X20$: ;REFERENCE LABELY .IF DF T$$GMC&T$$SMCDZ#[ MOV R0,R4 ;SAVE INPUT PARAMETERC(\ SWAB R4 ;PUT FLAGS IN LOW ORDER BYTE] BPL 30$ ;SET SPEED - JUMPF^_ .ENDC`a .IF DF T$$GMCb*c MOV #SPDH,R4 ;POINT TO DH11 SPEED TABLE!d RETURN ;RETURN WITH CC-C = 0Sef .ENDC ;T$$GMCgh .IF DF T$$SMC!D$$M11.ij .IF NDF T$$GMCSk#l MOV R0,R4 ;SAVE INPUT PARAMETERV*m SWAB R4 ;PUT FLAGS IN LOWER ORDER BYTEno .ENDC ;NDF T$$GMCp)q30$: BIC #177400,R0 ;CLEAR R0 HIGH BYTER%r MOVB SPDH-1(R0),R2 ;GET SPEED BITSDs SEC ;ASSUME ERROR)t BMI 40$ ;NOT A SUPPORTED SPEED - JUMPIu ASRB R4 ;SET ANSWER SPEED?v BEQ 50$ ;N - JUMPwx .IF DF D$$M11y/z BICB #17,U.CW3+1-U.TSTA(R5) ;CLEAR OLD VALUEE3{ BISB R2,U.CW3+1-U.TSTA(R5) ;SET NEW ANSWER SPEED$| CLC ;SHOW SUCCESS}~ .IFF ;D$$M11F7€ SEC ;ATTEMPT TO SET ANSWER SPEED W/O MODEM SUPPORTA�‚ .ENDC ;D$$M11ƒ „40$: RETURN…;N&†50$: BCS 60$ ;TRANSMIT SPEED - JUMP5‡ BICB #17,U.CW3-U.TSTA(R5) ;CLEAR OLD RECEIVE SPEEDD!ˆ BR 70$ ;JUMP TO SET NEW SPEEDB;‰60$: BICB #360,U.CW3-U.TSTA(R5) ;CLEAR OLD TRANSMIT SPEEDEŠ‹ .IF DF R$$EISŒ2� ASH #4,R2 ;SHIFT SPEED BITS TO PROPER POSITIONŽ� .IFF ;R$$EISL�4‘ CALL SHIFT4 ;SHIFT SPEED BITS TO PROPER POSITION’“ .ENDC ;R$$EIS”.•70$: BISB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED!– BR 100$ ;GO AND LOAD INTO LPRR—˜ .ENDC ;T$$SMC!D$$M11™š .IF DF D$$M11&R$$CONB›œYMLPAR::RETURN�ž .ENDCŸ  .ENDC ;T$$GMC!T$$SMC!D$$M11¡¢;P£;+¤; YHPWUP - POWER-UP.¥;P ¦; INPUT:>§; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ¨; U.STS SET UP FOR LOCAL LINE: ©; US.CRW 0 ª; US.DSB 0I«;-¬;.­;R®¯ .IF DF R$$CON° ±YHCONL::²³ .IF DF M$$EXT´,µ MOV #UMR5S,R0 ;GET ADDRESS OF SAVED UMR 5&¶ MOV #UBMPR+<5*4>,R1 ;POINT AT UMR 5 · MOV (R0)+,(R1)+ ;SET UP UMR 5¸ MOV (R0)+,(R1)+ ;¹º .IF NDF T$$SPL$» ¼ MOV (R0)+,(R1)+ ;SET UP UMR 6½ MOV (R0)+,(R1)+ ;¾¿ .ENDC ;NDF T$$SPLÀÁ .ENDC ;M$$EXT ÃYHCPUP::ÄÅ .IFFÆ%ÇYHPWUP::TST R2 ;IS THIS LINE ZERO?EÈ BNE 80$ ;N - JUMP.ÉÊ .IFTFË/Ì MOV #4000,@R3 ;CLEAR SILO, UARTS, CONTROLLER$Í MOV #20100,@R3 ;ENABLE INTERRUPTSÎÏ .IFTÐ Ñ RETURNT ÒYHUONL:: ÓYHUPUP::ÔÕ .ENDC ;R$$CONÖ×80$: ;REFERENCE LABELØÙ .IF DF D$$M11Ú-Û BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE?Ü BEQ 100$ ;N - JUMP6Ý BIC #S5.ABP,U.TST5-U.TSTA(R5) ;RESET AUTO-BAUD MODEÞß .IF NDF R$$MPLLà#á MOV U.SCB-U.TSTA(R5),R0 ;GET SCB4â TST S.DMCS(R0) ;IS THERE REMOTE SUPPORT FOR LINE?ã BNE 90$ ;Y - JUMP.3ä BIC #U2.RMT,U.CW2-U.TSTA(R5) ;N - SET LINE LOCALT+å BR 100$ ;FORGET THAT IT WAS EVER REMOTEEæ90$: ;REFERENCE LABELçè .IFTF ;NDF R$$MPLé>ê BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIER FLAGëì .IFT ;NDF R$$MPLTíî MOV R3,-(SP) ;SAVE DH11 CSR-ï CALL YHMTIM ;ENABLE INTERRUPTS ON DM11-BBT!ð MOV (SP)+,R3 ;RESTORE DH11 CSREñò .ENDC ;NDF R$$MPLóô .IF DF R$$CONõ#ö MOV U.SCB-U.TSTA(R5),R0 ;GET SCB !÷ MOV S.KRB(R0),R0 ;GET DH11 KRBB*ø MOVB K.CON(R0),R0 ;GET CONTROLLER INDEX0ù ADD YMCP1,R0 ;POINT TO POINTER TO DM11-BB KRBú MOV @R0,R0 ;GET DM11-BB KRB :û MOVB U.UNIT-U.TSTA(R5),R1 ;GET UNIT NUMBER OF THIS LINE3ü ASL R1 ;CONVERT FROM BYTE OFFSET TO WORD OFFSET;ý BIS $BTMSK(R1),K.PRM-2(R0) ;SET ENABLE BIT FOR THIS LINE3þ BIT #KS.OFL,K.STS(R0) ;IS DM CONTROLLER OFFLINE?Vÿ BNE 100$ ;Y - JUMP MOV R3,-(SP) ;SAVE YH CSR MOV @R0,R3 ;GET YM CSR0 CALL YHMTMA ;LET DM KNOW ABOUT THIS LINE NOW MOV (SP)+,R3 ;RESTORE YH CSR. .ENDC ;R$$CON .ENDC( 100$: CALL LOCKI ;LOCK OUT INTERRUPTS@ SETLN1: MOV U.CW3-U.TSTA(R5),R2 ;GET NEW SPEED AND PARITY BITS) SETLIN: CALL SELLIN ;;;SELECT THE LINEO%  SWAB R2 ;;;PUT IN HIGH ORDER BYTE&  ROR R2 ;;;SHIFT TO PROPER POSITION ROR R2 ;;;. BIC #140017,R2 ;;;CLE00¦R€9€Ž{´cÚµcÛ¶c�·c›’AR EXTRANEOUS NONSENSE5 BIT #30000,R2 ;;;TRANSMIT SPEED 110 BAUD OR LOWER?V BNE 110$ ;;;N - JUMP& BIS #4,R2 ;;;Y - SET TWO STOP BITS2110$: BIS #3,R2 ;;;SET FOR EIGHT BIT CHARACTERSC BIT #S5.CLN,U.TST5-U.TSTA(R5) ;;;CHECK 7-BIT CHARACTERS ; LK710 , BEQ 115$ ;;;NO LEAVE IT 8-BIT ; LK710& BIC #1,R2 ;;;SET 7-BIT ; LK710<115$: MOV R2,LPR(R3) ;;;LOAD NEW LINE PARAMETERS ; LK710 ; LK710R; ;**-19; WHEN RETURNING VIA COROUTINE "LOCKI", CC-C IS CLEAREDE;E RETURN ;RETURN#  .DSABL LSBT .IF DF R$$CON YHCOFF::# CALL LOCKI ;LOCK OUT INTERRUPTSS1  MOV #4000,@R3 ;;;CLEAR SILO, UARTS, CONTROLLERH ! RETURNC "YHUOFF::## CALL LOCKI ;LOCK OUT INTERRUPTS-"$ CALL SELLIN ;;;SELECT THE LINE0% CLR LPR(R3) ;;;SET TO 0 BAUD TO DISABLE LINE& RETURN ;;;DROP PRIORITY'( .ENDC ;R$$CON)*;L+;A,;+$-; INPUT INTERRUPT SERVICE ROUTINE..;-/;;0; 1 .ENABL LSBI2;A34 .IF DF R$$MPL5/6$YHINP::TTSET$ YH ;;;SAVE R2, R3 AND SET UP:S7 ;;; R3 = CSR ADDRESS8 ;;; R4 = KRB ADDRESS9: .IFF ;R$$MPLR;-<$DHINP::TTSET$ DH ;;;SAVE R2,R3 AND SET UPR= ;;; R3 = CSR"> ;;; R4 = ADDRESS OF UCB LIST?@ .ENDC ;R$$MPLA.B CALL MUXINP ;;;DO COMMON MULTIPLEXER INPUTC ;;;CHARACTER PROCESSINGT5D ;;;MUXINP DISMISSES INTERRUPT IF NO OUTPUT WORK,E BR 10$ ;;;XMIT READY - GO DO OUTPUT WORKF;G;H;+%I; OUTPUT INTERRUPT SERVICE ROUTINE. J;-K;L;IMN .IF DF R$$MPLO/P$YHOUT::TTSET$ YH ;;;SAVE R2, R3 AND SET UP: Q ;;; R3 = CSR ADDRESSR ;;; R4 = KRB ADDRESSST .IFF ;R$$MPLEU-V$DHOUT::TTSET$ DH ;;;SAVE R2,R3 AND SET UP4W ;;; R3 = CSR"X ;;; R4 = ADDRESS OF UCB LISTYZ .ENDC ;R$$MPL[>\10$: BIC #100077,@R3 ;;;CLEAR TRANSMIT DONE, UNIT NUMBER AND&] ;;;2 HIGH BITS OF UNIBUS ADDRESS#^ MOV R4,-(SP) ;;;SAVE KRB ADDRESSU_` .IF DF R$$MPLa-b ADD K.OFF(R4),R4 ;;;GET START OF UCB TABLEcd .ENDC ;R$$MPLe+f20$: MOV (R4)+,R5 ;;;GET NEXT UCB ADDRESS )g BEQ 80$ ;;;JUMP IF LINE IS NOT IN USEh CMP R5,#-1 ;;;END OF LIST?i BEQ 90$ ;;;Y - JUMPOjk .IF DF R$$CONl%m BITB #US.OFL,U.ST2(R5) ;;;OFFLINE? n BNE 80$ ;;;Y - JUMP op .ENDC ;R$$CONp ;TMS047#&p MOV R4,-(SP) ;;;SAVE R4 ;TMS047'p MOV R3,-(SP) ;;;SAVE CSR ;TMS047Sp ;TMS047(p .IF DF T$$SPL ;TMS047.p ;TMS047A2p MOV U.TAPR(R5),@#KDSAR5 ;;;MAP UCBX ;TMS047:p MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX ;TMS047/p ADD #U.TSTA,R5 ;;;POINT TO U.TSTA ;TMS047p ;TMS047Fp .IFF ;T$$SPL ;TMS047p ;TMS047N'p ASSUME U.TSTA, ;TMS047E4p ADD #U.TUX,R5 ;;;POINT TO UCBX POINTER ;TMS047(p MOV (R5)+,R4 ;;;GET UCBX ;TMS047p ;TMS047Mp .ENDC ;T$$SPL ;TMS0474p ;TMS0474*r BIT #2000,@R3 ;;;NXM BIT SET? ;**-1s BEQ 30$ ;;;N - JUMPTt BIS #400,@R3 ;;;Y - CLEAR IT;8u MOVB #1,U.TOTI(R4) ;;;SET TIMER TO EXPIRE IN 1 SECOND+u BR 60$ ;;;GO ON TO NEXT LINE ;TMS047ABw30$: TST BCR(R3) ;;;HAS THIS LINE COMPLETED TRANSMISSION? ;**-1#w BNE 60$ ;;;N - JUMP ;TMS047AMŠ BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;ANY HIGH PRIORITY OUTPUT REQUEST PE;**-18‹ BEQ 35$ ;;;N - JUMPC/Œ MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET UNIT NUMBER$� ASL R2 ;;; .. TIMES 2 ,Ž CALL STAXH ;;;START HIGH PRIORITY OUTPUT5� BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETED D�35$: BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT INTERRUPT UNEXPECTED?‘ BNE 45$ ;;;Y - JUMP I’ BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;JUST STARTING NORMAL PRIORITY OUTPUT?A5“ BEQ 37$ ;;;N - COMPLETE INTERRUPTED OUTPUT STREAML” BIC #S5.HPO,U.TST5-U.TSTA(R5) ;;;START NORMAL (NOT HIGH) PRIORITY REQUEST/• MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET UNIT NUMBER(– ASL R2 ;;; .. TIMES 2?— CALL STAXN ;;;BEGIN OUTPUT DELAYED BY HIGH PRIORITY REQUEST 5˜ BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETEDP™37$:š›œ .IF00¦Z€€±|t÷tø tþfDATA DF T$$ACD�.ž BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT?Ÿ BNE 40$ ;;;Y - JUMP#"  ADD #U.TOC,R4 ;;;POINT TO U.TOC'¡ DEC @R4 ;;;ANYTHING LEFT TO OUTPUT?$¢ BEQ 50$ ;;;N - JUMPP/£ CALL STAXM ;;;Y - INITIATE ANOTHER TRANSFERR5¤ BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETED ¥¦ .ENDC ;T$$ACD§*¨40$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+28© CALL NXTOB ;;;GET NEXT OUTPUT BUFFER IF THERE IS ONEª BEQ 50$ ;;;N - JUMPC«;A7¬; WE GOT ANOTHER OUTPUT BUFFER - START OUTPUTTING IT. ­;D!® TST -(R4) ;;;POINT TO U.TOP+2 ¯ MOV (SP)+,R3 ;;;GET CSR/° MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET UNIT NUMBERC± ASL R2 ;;; .. TIMES 2E² CALL STAX1 ;;;START OUTPUT³ BR 70$ ;;;K´45$: BIC #S5.HPO,U.TST5-U.TSTA(R5) ;;;NO HIGH PRIORITY OUTPUT IN PROGRESSA5µ BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETEDA¶;./·50$: CALL ODONE ;;;DO OUTPUT DONE PROCESSINGE*¸60$: MOV (SP)+,R3 ;;;RESTORE CSR POINTER!¹70$: MOV (SP)+,R4 ;;;RESTORE R4T;º80$: BICB #60,@R3 ;;;CLEAR 2 HIGH BITS OF UNIBUS ADDRESS-*» ;;;TO AVOID OVERFLOW INTO BIT 6 WHEN!¼ ;;;INCREMENTING LINE NUMBER5%½ INCB @R3 ;;;INCREMENT LINE NUMBER;¾ BR 20$ ;;;GO TRY NEXT LINE¿; 9À; ALL LINES SCANNED. SEE IF ANY LINE COMPLETED TRANSMIT)!Á; "BEHIND" US IN THE SCAN LOOP.RÂ;*Ã90$: MOV (SP)+,R4 ;;;RESTORE KRB ADDRESS+Ä ;;; OR ADDRESS OF UCB LIST (RSX-11M)TÅ TST @R3 ;;;XMIT RDY SET?'Æ BMI 10$ ;;;Y - DO IT ALL OVER AGAIN:Ç;(7È; ALL OUTPUT WORK DONE. SEE IF ANY INPUT WORK NEEDED.IÉ;T.Ê MOV NRC(R3),R5 ;;;GET A CHARACTER FROM SILOË BPL 100$ ;;;NONE - EXITC-Ì CALL MUXIN1 ;;;PROCESS AS INPUT INTERRUPTN&Í BR 10$ ;;;OUTPUT WORK TO DO - JUMP5Î ;;;MUXIN1 DISMISSES INTERRUPT IF NO OUTPUT WORKMÏ;DÐ;SÑ;Ò;BÓÔ .IF NDF R$$EISOÕÖ;J×; SUBROUTINE TO SHIFT R2 4 BIT POSITIONS TO THE LEFT FOR NON-EIS SYSTEMSØ;RÙSHIFT4: ASL R2 ;SHIFT ONCEDÚ ASL R2 ;TWICE Û ASL R2 ;THRICEÜ ASL R2 ;LAST TIME Ý RETURN Þß .ENDC ;NDF R$$EISàá;I&â; SUBROUTINE TO SELECT LINE ON DH11.ã;Fä;I<åSELLIN: BICB #77,@R3 ;;;CLEAR LINE NUMBER AND 2 HIGH BITSæ ;;;OF 18-BIT ADDRESS,ç BISB U.UNIT-U.TSTA(R5),@R3 ;;;SELECT LINEè100$: RETURN ;;;é; ê .DSABL LSBëì .IF DF D$$M11íî .IF DF R$$CONï ðYMCONL:: ñYMCPUP::"ò CALL LOCKI ;RAISE OUR PRIORITY%ó BIC #1040,@R3 ;;;STOP DM11-BB SCAN $ô10$: BIT #20,@R3 ;;;SCAN STOPPED?õ BNE 10$ ;;;N - WAIT%ö CLR R0 ;;;INITIALLY SET TO LINE 0!÷20$: MOV R0,@R3 ;;;SELECT LINEU$ø ASL R0 ;;;CONVERT TO WORD OFFSET<ù BIT $BTMSK(R0),K.PRM-2(R2) ;;;SHOULD WE ENABLE THIS LINE?ú BEQ 30$ ;;;N - JUMPT6û BIS #7,2(R3) ;;;Y - ASSERT DTR, RTS AND LINE ENABLEü30$: ASR R0 ;;;RESTORE COUNTS$ý INC R0 ;;;INCREMENT TO NEXT LINE'þ CMP R0,#15 ;;;GONE THRU EVERY LINE?:ÿ BLE 20$ ;;;N - LOOPU- BIS #140,@R3 ;;;ENABLE SCAN AND INTERRUPTSA) RETURN ;;;RETURN WILL LOWER PRIORITY YMCOFF::# CALL LOCKI ;LOCK OUT INTERRUPTSE/ BIC #1140,@R3 ;;;DISABLE SCAN AND INTERRUPTS YMSTAX:: YMABOX:: YMRESX:: YMSTOX:: YMMTIM:: YMUPUP:: YMUONL:: YMUOFF::  RETURN ;;;; .ENDC ;R$$CON;++; DM11-BB DATASET STATUS CHANGE INTERRUPTR;-;T;O .IF DF R$$MPL/$DM11B::TTSET$ YM ;;;SAVE R2, R3 AND SET UP:R ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS .IFF ;R$$MPLU-$DM11B::TTSET$ DM ;;;SAVE R2,R3 AND SET UP  ;;; R3 = DH11 CSR;%! ;;; R4 = ADDRESS OF DH UCB LIST;#" MOV -4(R4),R3 ;;;GET DM11-BB CSRT#$ .ENDC ;R$$MPL%3& BIC #240,@R3 ;;;CLEAR DONE FLAG AND DISABLE SCAN.' MOV (R3)+,R5 ;;;GET LINE NUMBER IN BITS 0-3(( CALL MUXUCB ;;;GET POINTER TO U.TSTA") BCS 10$ ;;;UNKNOWN LINE - JUMP"* MOV @R3,R4 ;;;GET MODEM STATUS7+ CALL MODISR ;;;DO COMMON MODEM INTERRUPT PROCESSINGA., BVC 10$ ;;;NO SPECIAL ACTION NEEDED - JUMP- BCS 5$ ;;;DROP DTR - JUMPD1. BIS #7,@R3 ;;;ASSERT DTR, RTS AND LINE ENABLES!/ BIS #40,-(R3) ;;;REENABLE SCANB 0 RETURNM405$: BIC #6,@R3 00¦b€§g€Ž{´cÚµcÛ¶c�·c›’;;;DEASSERT DTR AND RTS ; LK703.210$: BIS #40,-(R3) ;;;REENABLE SCAN ;**-1&3 BCS 30$ ;;;NO CALL ANSWERED - JUMP%4 MOV U.SCB-U.TSTA(R5),R3 ;;;GET SCBG56 .IF DF R$$MPL7*8 MOV @S.KRB(R3),R3 ;;;GET DH CSR ADDRESS9: .IFF ;R$$MPLS;)< MOV S.CSR(R3),R3 ;;;GET DH CSR ADDRESSP=> .ENDC ;R$$MPL?1@ MOVB U.CW3+1-U.TSTA(R5),R2 ;;;GET ANSWER SPEEDP/A BICB #^C<17>,R2 ;;;CLEAR ALL BUT SPEED FIELDNAB MOVB R2,U.CW3-U.TSTA(R5) ;;;SAVE NEW RECEIVE SPEED IN DATABASE$CD .IF DF R$$EISE2F ASH #4,R2 ;;;SET TRANSMIT SPEED = ANSWER SPEEDGH .IFF ;R$$EISI4J CALL SHIFT4 ;;;SET TRANSMIT SPEED = ANSWER SPEEDKL .ENDC ;R$$EISMBN BISB R2,U.CW3-U.TSTA(R5) ;;;SAVE NEW TRANSMIT SPEED IN DATABASE;O MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW SPEED AND PARITY BITSSP ASSUME S4.ABD,1000000Q TST 6(R5) ;;;AUTO-BAUD SPEED DETECT ENABLED?%R BPL 20$ ;;;IF NOT, DON'T SET BAUDU,S MOV #314,R2 ;;;Y - SET LINE TO 4800 BAUD)T20$: JMP SETLIN ;;;SET LINE PARAMETERSU;D$V30$: RETURN ;;;DISMISS INTERRUPTW; X; Y;+Z; YHMTIM - MODEM TIME-OUT[;-\;L];F^_ .IF DF R$$MPL`*aYHMTIM::MOV U.SCB-U.TSTA(R5),R3 ;GET SCB!b MOV S.KRB(R3),R3 ;GET DH11 KRBE*c MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX0d ADD YMCP1,R3 ;POINT TO POINTER TO DM11-BB KRB!e MOV @(R3)+,R3 ;GET DM11-BB CSR)fg .IFF ;R$$MPLDh*iYHMTIM::MOV U.SCB-U.TSTA(R5),R3 ;GET SCB%j MOV S.DMCS(R3),R3 ;GET DM11-BB CSR kl .ENDC ;R$$MPLm nYHMTMA:E"o CALL LOCKI ;DISABLE INTERRUPTSp BIC #1040,@R3 ;;;STOP SCAN $q10$: BIT #20,@R3 ;;;SCAN STOPPED?r BNE 10$ ;;;N - WAIT$s BIC #17,@R3 ;;;CLEAR LINE NUMBERt;-2u; NOTE - CANNOT USE BYTE INSTRUCTIONS ON DM11-BBv;E/w MOVB U.UNIT-U.TSTA(R5),R4 ;;;GET LINE NUMBERAx BIS R4,(R3)+ ;;;SELECT LINE6y CALL HLMTIM ;;;DO COMMON MODEM TIME-OUT PROCESSING1z BEQ 20$ ;;;IF EQ Z-BIT SET - DROP DTR AND RTSR1{ BIS #7,@R3 ;;;ASSERT DTR, RTS AND LINE ENABLE| BR 30$ ;;;ENABLE SCAN/}20$: BIC #17,@R3 ;;;DROP DTR, RTS, SEC. XMITB~ INC @R3 ;;;SET LINE ENABLE330$: BIS #140,-(R3) ;;;ENABLE SCAN AND INTERRUPTSW$€ RETURN ;;;RETURN FROM COROUTINE�‚ .ENDC ;D$$M11ƒ„ .ENDC ;D$$H11…†‡ .ENDBv;E/w MOVB U.UNIT-U.TSTA(R5),R4 ;;;GET LINE NUMBERAx BIS R4,(R3)+ ;;;SELECT LINE6y CALL HLMTIM ;;;DO COMMON MODEM TIME-OUT PROCESSING1z BEQ 20$ ;;;IF EQ Z-BIT SET - DROP DTR AND RTSR1{ BIS #7,@R3 ;;;ASSERT DTR, RTS AND LINE ENABLE| BR 30$ ;;;ENABLE SCAN/}20$: BIC #17,@R3 ;;;DROP DT .TITLE TTYZ .IDENT /06.01/ ;L7; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION$; ALL RIGHTS RESERVED.;R>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;E ; ; 27-JAN-78 PETER WANNHEDEN  ;C ; PREVIOUSLY MODIFIED BY:;R; P. WANNHEDEN; C. F. SPITZE; D. R. DONCHIN$; S. C. ADAMS# ; T. LEKAS;E; MODIFICATION HISTORY:W;O; L. KOGAN 18-JUN-86 6.014; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORT;I ;c!" .PSECT MAP5#;N$;+,%; CONTROLLER-DEPENDENT ROUTINES FOR DZ-11.&;-';R(;F)* .IF DF D$$Z11+,; EQUATED SYMBOLSR-;E.; DZ-11 REGISTER DEFINITIONS/;F#0CSR = 0 ;CONTROL AND STATUS REG.N-1RBUF = 2 ;RECEIVER BUFFER REG. (READ-ONLY)F,2LPR = 2 ;LINE PARAMETER REG. (WRITE-ONLY)!3TCR = 4 ;TRANSMIT CONTROL REG. )4MSR = 6 ;MODEM STATUS REG. (READ-ONLY)N15TBUF = 6 ;TRANSMITTER BUFFER REG. (WRITE-ONLY) 6;07;N8 9 .ENABL LSBE:; .IF DF T$$GMC!T$$SMC!D$$ZMD<=;+%>; YZLPAR - GET/SET LINE PARAMETERS.T?;I @; INPUT:A; R0 BIT 15: 0 = SET SPEEDB; 1 = GET SPEED 6B; BIT 13: 1 = SET 7-BIT CHARACTER LENGTH ; LK710?B; BIT 12: 1 = CHECK IF 7-BIT CHARACTER IS SUPPORTED ; LK710 =C; BIT 11: 1 = SET SPEED SELECTED BY AUTO-BAUD DETECT LOGICE+D; BIT 10: 1 = SET DEVICE DEPENDENT SPEED#E; (USED FOR SETTING PARITY)Y$F; BIT 9: 1 = GET/SET ANSWER SPEEDG; IF SET SP00§j€€±|t÷tø tþfDATAEED:1H; BITS 0-7: NEW SPEED PARAMETER (S.XXX SYMBOL)TI;!(J; R1 Flow control status change flags.K;A*L; BIT 0: 1 = Enable input flow control.+M; BIT 1: 1 = Disable input flow control.1+N; BIT 2: 1 = Enable output flow control.,O; BIT 3: 1 = Disable output flow control.P;TQ; BITS 4-15: ReservedR;S>S; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.T;V U; OUTPUT: V; IF GET SPEED REQUESTED:E"W; R4 POINTER TO DZ11 SPEED TABLE X; CC-C 0Y;Z; IF SET SPEED REQUESTED: [; CC-C 0 IF OK!\; 1 IF ILLEGAL SPEED SPECIFIED1]; L^; NOTE THAT THIS ROUTINE CAN BE EXECUTED AT BOTH SYSTEM STATE (IN RESPONSEP_; TO A SF.GMC OR SF.SMC QIO) AND FROM THE INPUT INTERRUPT SERVICE ROUTINE (FOR`; AUTO-BAUD SPEED DETECT).a; b;-c; d;o eYZLPAR::fg .IF DF D$$ZMD!T$$GMC!T$$SMCh+i TST R1 ;Called for flow control change?Oj BEQ 5$ ;If EQ no - go on. "k RETURN ;Not processed for DZ.l5$: l ; LK710 ;l BIT #20000,R0 ;CHECK IF WE VALIDATE 7-BIT CHAR. ; LK710l BEQ 7$ ;NO ; LK710Fl RETURN ; LK710Hl7$: ; LK710,l BIT #10000,R0 ;CHECK SET 7-BIT ; LK710+l BEQ 8$ ;NO. SET SPEED-PARITY ; LK710E;l BR SETLN1 ;SET 7-BIT AND OTHER LINE PARAMETERS ; LK710 l8$: ; LK710l ; LK710 l ; LK7100m BIT #4000,R0 ;SET SPEED FOR AUTO-BAUD DETECT?n BEQ 10$ ;N - JUMPg,o BIT #2000,R0 ;SET DEVICE DEPENDENT SPEED?p BEQ 20$ ;N - JUMP1/q BIC #^C<17>,R0 ;CLEAR ALL BUT NEW SPEED BITSCr BR 40$ ;SET NEW SPEED;s10$: ;REFERENCE LABELtu .ENDC ;D$$ZMD!T$$GMC!T$$SMCvwx .IF DF T$$GMC&T$$SMC yz TST R0 ;GET OR SET SPEED?E{ BPL 20$ ;SET - JUMPE|} .ENDC ;T$$GMC&T$$SMCD~ .IF DF T$$GMC€*� MOV #SPDZ,R4 ;POINT TO DZ11 SPEED TABLE!‚ RETURN ;RETURN WITH CC-C = 0Bƒ„ .ENDC ;T$$GMC…† .IF DF T$$SMC!D$$ZMDQ‡(ˆ20$: MOV R0,R4 ;COPY SPEED PARAMETERS#‰ BIC #177400,R0 ;CLEAR UPPER BYTEM%Š MOVB SPDZ-1(R0),R0 ;GET SPEED BITSW‹ SEC ;ASSUME ERROR!Œ BMI 30$ ;ILLEGAL SPEED - JUMPN"� BIT #1000,R4 ;SET ANSWER SPEED?Ž BEQ 40$ ;N - JUMPF�� .IF DF D$$ZMD‘6’ BICB #17,U.CW3+1-U.TSTA(R5) ;CLEAR OLD ANSWER SPEED3“ BISB R0,U.CW3+1-U.TSTA(R5) ;SET NEW ANSWER SPEED” CLC ;SHOW SUCCESS•– .ENDC ;D$$ZMD— ˜30$: RETURN 6™40$: MOVB R0,U.CW3-U.TSTA(R5) ;SET NEW RECEIVE SPEEDš› .IF DF R$$EISœ4� ASH #4,R0 ;SHIFT BITS TO TRANSMIT SPEED POSITIONžŸ .IFF ;R$$EISV 1¡ ASL R0 ;SHIFT BITS TO TRANSMIT SPEED POSITIONR ¢ ASL R0 ; £ ASL R0 ; ¤ ASL R0 ;¥¦ .ENDC ;R$$EIS§3¨ BISB R0,U.CW3-U.TSTA(R5) ;SET NEW TRANSMIT SPEED©ª .ENDC ;T$$SMC!D$$ZMDR«¬ .ENDC ;T$$GMC!T$$SMC!D$$ZMD­@®SETLN1: MOV U.CW3-U.TSTA(R5),R2 ;GET NEW SPEED AND PARITY BITS7¯SETLIN: BIC #^C<140017>,R2 ;CLEAR EXTRANEOUS NONSENSEU+° CMPB R2,#2 ;IS SPEED 110 BAUD OR LOWER?± BGT 50$ ;N - JUMPA'² BIS #20000,R2 ;Y - SET TWO STOP BITSO,³50$: SWAB R2 ;PUT BITS IN PROPER POSITION;´ BIS #10030,R2 ;SET 8 BIT CHARACTERS AND TURN RECEIVER ONR-µ BISB U.UNIT-U.TSTA(R5),R2 ;SET LINE NUMBERCµ BIT #S5.CLN,U.TST5-U.TSTA(R5) ;;;CHECK 7-BIT CHARACTERS ; LK710S+µ BEQ 75$ ;;;NO LEAVE IT 8-BIT ; LK710D'µ BIC #10,R2 ;;;SET 7-BIT ; LK710G;µ75$: MOV R2,LPR(R3) ;;;LOAD NEW LINE PARAMETERS ; LK710Lµ ; LK710S · CLC ;SHOW SUCCESS ;**-1 ¸ RETURNR¹;º;5»;+¼; YZPWUP - POWER UP.½; ¾; INPUT:>¿; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. À; U.STS SET UP FOR LOCAL LINE: Á; US.CRW 0O Â; US.DSB 0NÃ;-Ä;5Å;;ÆÇ .IF DF R$$CONÈ ÉYZCONL:: ÊYZCPUP::ËÌ .IFFIÍ%ÎYZPWUP::TST R2 ;IS THIS LINE ZERO?EÏ BNE 70$ ;N - JUMPDÐÑ .IFTFÒ2Ó MOV #20,@R3 ;Y - CLEAR SILO, UARTS, CONTROLLERÔ60$: BIT #20,@R3 ;DONE?Õ BNE 60$ ;N - LOOPK(Ö BIS #40140,@R3 ;Y - ENABLE INTERRUPTSר .IFTÙ Ú RETURN ÛYZUONL:: ÜYZUPUP::ÝÞ .ENDC ;R$$CONßà70$: ;REFERENCE LABELáâ .IF DF D$00§r€g€Ž{´cÚµcÛ¶c�·c›’$ZMDã6ä BIC #S5.ABP,U.TST5-U.TSTA(R5) ;RESET AUTO-BAUD MODEå MOV R2,-(SP) ;SAVE R2æç .IFTF ;D$$ZMDè,é CALL SETLN1 ;SET INITIAL CHARACTERISTICS!ê ;IN LINE PARAMETER REGISTEREëì .IFT ;D$$ZMDMíî MOV (SP)+,R2 ;RESTORE R2@-ï BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE?Bð BEQ 150$ ;N - RETURN>ñ BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIER FLAGò;Fó;ô;+õ; YZMTIM - MODEM TIMER.Pö; ÷; INPUT:>ø; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.ù;-ú;5û;Uü;-ýþ .IFTF ;D$$ZMDÿ YZMTIM:: .IFT ;D$$ZMD8 MOV $BTMSK(R2),R2 ;GET BIT CORRESPONDING TO THIS LINE# CALL LOCKI ;LOCK OUT INTERRUPTSG4 CALL HLMTIM ;;;CALL COMMON MODEM TIMEOUT ROUTINE) BEQ 80$ ;;;IF EQ Z-BIT SET - DROP DTRR BISB R2,TCR+1(R3) ;;;SET DTRE  RETURN ;;;.( 80$: BICB R2,TCR+1(R3) ;;;DEASSERT DTR  RETURN ; ;;+; YZPOLL - POLL MODEM STATUS.;U ; INPUT:; R5 POINTER TO U.TSTA;-;E;N*YZPOLL::MOV U.SCB-U.TSTA(R5),R3 ;GET SCB .IF DF R$$MPL MOV @S.KRB(R3),R3 ;GET CSR .IFF ;R$$MPLE MOV S.CSR(R3),R3 ;GET CSR  .ENDC ;R$$MPL!6" MOVB U.UNIT-U.TSTA(R5),R2 ;GET PHYSICAL UNIT NUMBER# ASL R2 ;MULTIPLY BY 2 8$ MOV $BTMSK(R2),R2 ;GET BIT CORRESPONDING TO THIS LINE% CLR R4 ;START OFF FRESHC& BITB R2,MSR(R3) ;RING ON?' BEQ 90$ ;N - JUMP(( BIS #200,R4 ;Y - SET APPROPRIATE BIT%)90$: BITB R2,MSR+1(R3) ;CARRIER ON?S* BEQ 100$ ;N - JUMP(+ BIS #140,R4 ;Y - SET APPROPRIATE BIT9,100$: MOV R2,-(SP) ;SAVE R2 DESTROYED BY MODISR ROUTINE5- CALL MODISR ;DO COMMON MODEM INTERRUPT PROCESSING-. BVC 120$ ;NO SPECIAL ACTION NEEDED - JUMP5/ BCS 110$ ;DROP DTR - JUMP#0 BISB (SP)+,TCR+1(R3) ;ASSERT DTRT 1 RETURN;*2110$: BICB (SP)+,TCR+1(R3) ;DEASSERT DTR 3 RETURNF64120$: MOV (SP)+,R2 ;POP STACK WITHOUT AFFECTING CC-C'5 BCS 150$ ;NO CALL ANSWERED - RETURNA6 ASSUME S4.ABD,100000R07 TST 6(R5) ;;;AUTO-BAUD SPEED DETECT ENABLED?&8 BPL 130$ ;;;IF NOT, DON'T SET BAUD*9 MOVB #14,R2 ;Y - SET LINE TO 4800 BAUD: BR SETLIN ;C;;130$: MOVB U.CW3+1-U.TSTA(R5),R0 ;GET REMOTE ANSWER SPEED04< BICB #^C<17>,R0 ;CLEAR ALL BUT ANSWER SPEED FIELD= BR 40$ ;SET THAT SPEED>? .ENDC ;D$$ZMD@A150$: RETURNB C .DSABL LSB1DEF .IF DF R$$CONG HYZCOFF::.I MOV #20,@R3 ;CLEAR SILO, UARTS, CONTROLLERJ10$: BIT #20,@R3 ;DONE?K BNE 10$ ;N - LOOP4 L RETURNR MYZUOFF::#N CLR -(SP) ;GET A TEMPORARY WORD?@O BISB U.UNIT-U.TSTA(R5),(SP) ;SET LINE NUMBER BUT RECEIVER OFF.P MOV (SP)+,LPR(R3) ;LOAD NEW LINE PARAMETERSQR .IF DF D$$ZMDS8T MOV $BTMSK(R2),R2 ;GET BIT CORRESPONDING TO THIS LINEU BICB R2,TCR+1(R3) ;DROP DTRVW .ENDC ;D$$ZMDX Y RETURNDZ[ .ENDC ;R$$CON\];S^;S_;+$`; INPUT INTERRUPT SERVICE ROUTINE.a;-b;0c; d .ENABL LSBRe;Ofg .IF DF R$$MPLh/i$YZINP::TTSET$ YZ ;;;SAVE R2, R3 AND SET UP:j ;;; R3 = CSR ADDRESSk ;;; R4 = KRB ADDRESSlm .IFF ;R$$MPL)n-o$DZINP::TTSET$ DZ ;;;SAVE R2,R3 AND SET UPRp ;;; R3 = CSR"q ;;; R4 = ADDRESS OF UCB LISTrs .ENDC ;R$$MPLt.u CALL MUXINP ;;;DO COMMON MULTIPLEXER INPUTv ;;;CHARACTER PROCESSING;5w ;;;MUXINP DISMISSES INTERRUPT IF NO OUTPUT WORK,x BR 10$ ;;;XMIT READY - GO DO OUTPUT WORKy;z;{;+%|; OUTPUT INTERRUPT SERVICE ROUTINE. };-~;;I€� .IF DF R$$MPL‚/ƒ$YZOUT::TTSET$ YZ ;;;SAVE R2, R3 AND SET UP: „ ;;; R3 = CSR ADDRESS… ;;; R4 = KRB ADDRESS†‡ .IFF ;R$$MPLEˆ-‰$DZOUT::TTSET$ DZ ;;;SAVE R2,R3 AND SET UP4Š ;;; R3 = CSR"‹ ;;; R4 = ADDRESS OF UCB LISTŒ� .ENDC ;R$$MPLŽ�10$: MOV R3,-(SP) ;;;C'� INC @SP ;;;POINT TO BYTE CONTAININGM1‘ ;;;INTERRUPTING LINE NUMBER (CSR HIGH BYTE)M0’ CALL JZOUT ;;;DO OUTPUT INTERRUPT PROCESSING%“ ;;;(COMMON FOR DJ-11 AND DZ-11)” TST (SP)+ ;;;CLEAN STACK•;L–;—;+˜; YZABOX - ABORT OUTPUT.™; š; INPUT:00§z€¨{€±|t÷tø tþfDATA>›; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. œ; U.TOC 0 �; U.TTOC 0Ež; Ÿ; YZSTOX - STOP OUTPUT. ; ¡; INPUT:>¢; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. £; S1.CTS 1(¤;-¥;¦;@ §YZABOX::¨YZSTOX::RETURN ;;;RETURN©;R ª .DSABL LSBM«¬ .ENDC ;D$$Z11­®;Z¯;;° .ENDUT INTERRUPT PROCESSING%“ ;;;(COMMON FOR DJ-11 AND DZ-11)” TST (SP)+ ;;;CLEAN STACK•;L–;—;+˜; YZABOX - ABORT OUTPUT.™; š; INPUT: .TITLE TTCISC .IDENT /05.03/N;O6; COPYRIGHT (c) 1983 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.; <; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;;;O; 23-JAN-78 PETER WANNHEDENT;(; PREVIOUSLY MODIFIED BY:;+; P. WANNHEDEN ; C. F. SPITZ; D. R. DONCHINT; ; MODIFICATIONS:;N!; DD158 12-OCT-82 DALE R. DONCHIN <; DISALLOW INPUT PROCESSING CONCURRENT WITH FORK PROCESSING;E; S. C. ADAMS 24-OCT-83 5.01&; SA135 -- REFERENCE U.TFRQ AS A WORD;B; S. C. ADAMS 18-JUN-84 5.02; SA251 -- FIX SIMULATED ^R; ; S. C. ADAMS 1-MAR-85 5.03D*; SA367 -- ADD TTSET1 ENTRY POINT FOR LAT;I;C;+D; CONTROLLER INDEPENDENT ROUTINES TO SET UP FOR INTERRUPT PROCESSING; AND TO QUEUE A FORK REQUEST.;-;+;  .MCALL UCBDF$,SCBDF$P UCBDF$ ,,TTDEFC SCBDF$ O .IF DF R$$MPL  .MCALL KRBDF$ E KRBDF$I  .ENDC ;R$$MPL R .PSECT MAP5;N;I;+*; TTSET - COMMON INTERRUPT SET UP ROUTINE.;1; INPUT:; R2 SAVED BY CALL (JSR R2)./; POINTS TO POINTER TO CTB POINTER. (RSX-11M+)I'; POINTS TO CONTROLLER TYPE. (RSX-11M)5; R4 SAVED BY $INTSV. "; CONTAINS CONTROLLER NUMBER * 2.; R5 SAVED BY $INTSV.N;T ; OUTPUT:O; R2 FREE TO USE; R3 CSR ADDRESS; R4 KRB ADDRESS; R5 FREE TO USE; ;; CALLS CALLER BACK AS COROUTINE WITH ALL OF DRIVER MAPPED.F:; CALLER EXECUTES "RETURN" BACK TO THIS ROUTINE TO RESTORE:; REGISTERS, QUEUE A FORK REQUEST IF NECESSARY AND DISMISS; THE INTERRUPT.;-; ;U .ENABL LSBD; TTSET:: MOV R3,-(SP) ;;;SAVE R3T& MOV KISAR6,-(SP) ;;;SAVE KERNEL APR 6 .IF DF T$$COM2 MOV KINAR6,-(SP) ;;;SAVE KERNEL INSTRUCTION APR 6 .ENDC ;T$$COM  .IF DF R$$MPL V, ADD @(R2)+,R4 ;;;GET POINTER TO KRB POINTER MOV @R4,R4 ;;;GET KRB ADDRESSF MOV @R4,R3 ;;;GET CSR ADDRESSC CALL MAPD ;;;MAP DATA AREA  .IFFF  CALL MAPD ;;;MAP DATA AREA7 ADD (R2)+,R4 ;;;CALCULATE POINTER TO UCB TABLE POINTERU- MOV (R4),R4 ;;;GET ADDRESS OF UCB/CSR TABLE/ MOV (R4)+,R3 ;;;GET CSR AND POINT TO UCB TABLE) ; .ENDC ;R$$MPL R CALL @R2 ;;;CALL CALLER6 .IF DF T$$COM5 MOV (SP)+,KINAR6 ;;;RESTORE KERNEL INSTRUCTION APR 6 .ENDC ;T$$COM) MOV (SP)+,KISAR6 ;;;RESTORE KERNEL APR 6O MOV (SP)+,R3 ;;;RESTORE R2, R3  MOV (SP)+,R2 ;;;F MTTSET1:: .IF DF M$$PRO / MOV $TTUQP,R4 ;;;GET POINTER TO UCB QUEUE HEADL% TST (R4)+ ;;;ANYTHING IN UCB QUEUE? , BNE 10$ ;;;Y - QUEUE FORK BLOCK AND RETURN RETURN ;;;N - RETURNS$10$: CALLR 100$ ;;;QUEUE FORK BLOCK C .IFFP T% TST $TTUQ ;;;ANYTHING IN UCB QUEUE? BEQ 20$ ;;;N - RETURN6- MOV #$TTFB+2,R4 ;;;POINT TO PC IN FORK BLOCKO+ TST (R4)+ ;;;FORK BLOCK ALREADY IN QUEUE?M BNE 20$ ;;;Y - RETURNR! CALL $FORK0 ;;;QUEUE FORK BLOCK  R .IFTF R;'; COME HERE AT SYSTEM STATE, PRIORITY 0D;$!FP000:: CALL MAPD ;MAP DATA AREAN! CALL LOCKI ;LOCK OUT INTERRUPTS + CALL 30$ ;;;PROCESS ALL UCBS IN UCB QUEUEQ;EH; COME BACK HERE WITH INTERRUPTS LOCKED OUT, UCB QUEUE EMPTY AND LOCKED.M; CLEAR FORK PC TO SHOW FORK BLOCK NOT IN QUEUE, UNLOCK UCB QUEUE AND RETURN. ;N R .IFT V CLR 6(R4) ;;;CLEAR FORK PC% JMP 130$ ;;;GO AND UNLOCK UCB QUEUE  E .IFFQ E CLR 4(R4) ;;;CLEAR FORK PC L .IFTF ;20$: RETURN ;;;RETURN.30$: ;;;REFERENCE LABEL S .IFTT P/ MOV $TTUQP,R4 ;;;GET POINTER TO UCB QUEUE HEADN) LOCK$ -LK.SPN(R4),SPIN ;;;LOCK UCB QUEUE   .IFFC ) MOV #$TTUQ,R4 ;;;POINT TO UCB QUEUE HEADE T .IFTF S' MOV (R4)+,R5 00¨‚€g€Ž{´cÚµcÛ¶c�·c›’;;;GET FIRST UCB IN QUEUE BEQ 20$ ;;;NONE - RETURN MOV @R5,-(R4) ;;;DEQUEUE UCB  BNE 40$ ;;;NOT LAST - JUMP7 MOV R4,2(R4) ;;;LAST UCB DEQUEUED - UPDATE PTR TO LASTA/40$: INC @R5 ;;;SHOW UCB NOT IN QUEUE ANY MORE  C .IFTR C, ULOCK$ -LK.SPN(R4),SPIN ;;;UNLOCK UCB QUEUEA BIS #S1.DSI,U.TSTA-U.TFLK(R5) ;;;DISABLE INPUT PROC. DURING FORKN  .ENDC E+ CALL 60$ ;;;PROCESS ALL FORK REQUEST BITSU ;;;FOR THIS UCB& BR 30$ ;;;TRY TO DEQUEUE ANOTHER UCB;;;+$; SETDSI - DISABLE INPUT PROCESSING.; A; SOME SYSTEM STATE ROUTINES WHICH ARE NOT CALLED FROM THE DRIVERC; FORK DISPATCHER MAY DISABLE INPUT CHARACTER PROCESSING BY CALLINGD9; THIS ROUTINE. THE CALLER IS CALLED BACK AS A COROUTINE.Y>; ON RETURN HERE, ALL FORK REQUESTS FOR THE UCB ARE PROCESSED.C; AFTER THAT, INPUT PROCESSING IS ENABLED AND AN ATTEMPT IS MADE TOR1; RETRIEVE CHARACTERS FROM THE TYPE-AHEAD BUFFER.R;-;B;U1SETDSI::BIS #S1.DSI,@R5 ;DISABLE INPUT PROCESSINGA CALL @(SP)+ ;CALL CALLER! CALL LOCKI ;LOCK OUT INTERRUPTS ; ;E<; FIND ALL BITS THAT ARE SET IN THE FORK LEVEL REQUEST BYTE.9; FOR EACH BIT FOUND, CLEAR IT AND CALL THE CORRESPONDING ; FORK LEVEL ROUTINE.E;H-50$: ADD #U.TFLK-U.TSTA,R5 ;;;POINT TO U.TFLKR ASSUME U.TFRQ, 060$: TST -(R5) ;;;ANY BITS SET IN REQUEST WORD? BEQ 80$ ;;;N - JUMP ! MTPS #0 ;;;Y - ALLOW INTERRUPTSC2 MOV #FRKTB-2,R2 ;GET START OF TABLE WITH POINTERS ;TO FORK LEVEL ROUTINESB CLR R3 ;INITIALIZE BITMASK# SEC ;MAKE SURE WE SHIFT IN A ONEK70$: ROL R3 ;SHIFT MASK LEFTD! TST (R2)+ ;UPDATE TABLE POINTERL BIT R3,@R5 ;THIS BIT SET?# BEQ 70$ ;N - LOOP (WITH CC-C = 0)S BIC R3,@R5 ;Y - CLEAR IT .IF DF T$$SPL' ADD #U.TSTA-U.TFRQ,R5 ;POINT TO U.TSTAA) MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;MAP UCBX;, MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPL0 ASSUME U.TSTA, M% ADD #U.TUX-U.TFRQ,R5 ;POINT TO U.TUX  MOV (R5)+,R4 ;GET UCBX IN R4U .IFTF ;T$$SPL T! CALL @(R2)+ ;CALL ROUTINE WITH:E ; R4 = POINTER TO UCBX  ; R5 = POINTER TO U.TSTA " MTPS #TTPRI ;LOCK OUT INTERRUPTS% BR 50$ ;;;GET NEXT FORK REQUEST BIT ;TA; NO MORE PROCESSING AT ZERO PRIORITY. ENABLE PROCESSING OF INPUT#E; CHARACTERS AND SEE WHAT IS WAITING FOR US IN THE TYPE-AHEAD BUFFER.P;B-80$: ADD #U.TSTA-U.TFRQ,R5 ;;;POINT TO U.TSTAX9 BIC #S1.DSI,@R5 ;;;ENABLE PROCESSING OF INPUT CHARACTERSU .IF DF T$$SER4SERPRO:: ;;;SERIALLY PROCESS CHARACTERS FROM TABUF .ENDC ;T$$SER .IFT ;T$$SPLN; MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;;;MAKE SURE UCBX IS MAPPEDU .ENDC ;T$$SPL9 CALL NXTIC ;;;PROCESS CHARACTERS FROM TYPE-AHEAD BUFFERI; TST U.TFRQ-U.TSTA(R5) ;;;ANY FORK REQUESTS NOW PENDING?I BEQ 20$ ;;;N - RETURNS, BIS #S1.DSI,@R5 ;;;DISABLE INPUT PROCESSING- BR 50$ ;;;PROCESS ANY PENDING FORK REQUESTS;;N;OE; POST-FORK PROCESSING. PICK UP CHARACTER FROM U.TECB AND PROCESS IT.;F-FPPFP:: MOV #NXTIC,@SP ;MODIFY RETURN ADDRESSA" MTPS #TTPRI ;LOCK OUT INTERRUPTS .IF DF T$$SPL6 MOVB U.TECO-U.TSTA(R5),R2 ;;;GET CHARACTER TO PROCESS .IFF ;T$$SPL;/ MOVB U.TECB(R4),R2 ;;;GET CHARACTER TO PROCESSY .ENDC ;T$$SPL+ BIC #S1.DSI,@R5 ;;;ENABLE INPUT PROCESSINGN P .IF DF T$$MOD % BITB #US.DSB!US.CRW,U.STS-U.TSTA(R5)A, ;;;LINE DISABLED OR WAITING FOR CARRIER? BNE 20$ ;;;Y - JUMP  .ENDC ;T$$MOD C" CALLR ICH2A ;;;PROCESS CHARACTER;N;R S .IF DF M$$PRO ;+ ; SWCPU - SWITCH TO CORRECT CPU.;M; INPUT:(; R3 BITMASK TO SET IN FORK REQUEST BYTE; R5 POINTER TO U.TSTA;2 ; OUTPUT:R<; IF ALREADY EXECUTING ON THE CORRECT CPU (THE ONE THAT OWNS9; THE UNIBUS WHERE THE CONTROLLER SITS), IMMEDIATE RETURN@ ; TO CALLER.;T8; ELSE, FORK REQUEST BIT SET IN UCB. UCB ADDED TO END OF6; TARGET CPU'S UCB QUEUE, UNLESS IT IS ALREADY QUEUED.9; TARGET CPU'S FORK BLOCK QUEUED TO FORK QUEUE, UNLESS ITC/; IS ALREADY QUEUED. RETURN TO CALLER'S CALLER.F; ; REGISTERS ALTERED: R4 ;-;T;O(SWCPU:: MOV U.SCB-U.TSTA(R5),R4 ;GET SCB MOV S.KRB(R4),R4 ;GET KRB1 BIT K.URM(R00¨Š€©Ž€±|t÷tø tþfDATA4),@$CPURM ;ALREADY ON THE RIGHT CPU?E BNE 140$ ;Y - RETURN> MOV K.URM(R4),@SP ;N - SAVE URM AND POP RETURN ADDRESS - WANT! ;TO RETURN TO CALLER'S CALLERT' MOV #$URMTB,R4 ;GET START OF URM TABLEB,90$: BIT @SP,(R4)+ ;IS THIS THE CORRECT CPU? BEQ 90$ ;N - LOOPE TST (SP)+ ;CLEAN STACK; MOV $TTUQT-$URMTB-2(R4),R4 ;GET POINTER TO POINTER TO LASTR" ;UCB IN TARGET CPU'S UCB QUEUE; CALL 110$ ;PLACE FORK REQUEST (NO NEED TO RAISE PRIORITY,)' ;WE ARE ON THE WRONG CPU ANYWAY...).100$: LOCK$ -LK.SPN-2(R4),SPIN ;LOCK UCB QUEUE' TST 6(R4) ;FORK BLOCK ALREADY QUEUED?) BNE 130$ ;Y - JUMP! ADD #6,R4 ;N - POINT TO FORK PC  MOV #FP000,@R4 ;SET FORK PC CLR -(R4) ;CLEAR LINK WORD CALL $QFORK ;QUEUE FORK BLOCKT CMP -(R4),-(R4) ;BACK UP R4' BR 130$ ;UNLOCK FORK BLOCK AND RETURNM $ .IFTF B;R;R;+9; FORK - SET FORK LEVEL REQUEST AND ADD UCB TO UCB QUEUE.B;E; INPUT:(; R3 BITMASK TO SET IN FORK REQUEST BYTE; R5 POINTER TO U.TSTA;N ; OUTPUT:C8; REQUEST BIT SET IN UCB. UCB ADDED TO END OF UCB QUEUE,; UNLESS IT WAS ALREADY QUEUED.E; ; REGISTERS ALTERED: R4 ;-;A;#FORK:: P .IFT  K) MOV $TTUQP,R4 ;;;POINT TO UCB QUEUE HEADR0 TST (R4)+ ;;;POINT TO POINTER TO LAST IN QUEUE0110$: LOCK$ -LK.SPN-2(R4),SPIN ;;;LOCK UCB QUEUE  .IFFO A5 MOV #$TTUQ+2,R4 ;;;POINT TO POINTER TO LAST IN QUEUER E .IFTF ( BIS #S1.DSI,@R5 ;;;FORCE INPUT TO TABUF# ;;;PREVENT RETRIEVAL FROM TABUFY) ADD #U.TFRQ-U.TSTA,R5 ;;;POINT TO U.TFRQ, BIS R3,(R5)+ ;;;SET REQUEST BIT (U.TFRQ) ASSUME U.TFLK, # BIT #1,@R5 ;;;UCB ALREADY QUEUED?E BEQ 120$ ;;;Y - JUMP MOV R5,@(R4)+ ;;;N - QUEUE IT MOV R5,-(R4) ;;;SET NEW LASTR CLR @R5 ;;;CLEAR LINK WORD)120$: ADD #U.TSTA-U.TFLK,R5 ;;;RESTORE R5( , .IFT; K3130$: ULOCK$ -LK.SPN-2(R4),SPIN ;;;UNLOCK UCB QUEUE  P .ENDC A140$: RETURN ;;; F .DSABL LSB1 I 5 .ENDCE INPUT TO TABUF# ;;;PREVENT RETRIEVAL FROM TABUFY) ADD #U.TFRQ-U.TSTA,R5 ;;;POINT TO U.TFRQ, BIS R3,(R5)+ ;;;SE .TITLE TTCANM .IDENT /06.01/M;->; COPYRIGHT (c) 1983, 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;N ;$ ; 06-FEB-78 PETER WANNHEDEN ; ; PREVIOUSLY MODIFIED BY:; ; P. WANNHEDEN; C. F. SPITZV; D. R. DONCHINL; M. S. HARVEY; S. C. ADAMSL; B. S. MCCARTHY;N; MODIFIED BY:;P!; S. R. CLOUTIER 1-AUG-86 06.01'; REQUIRE STATUS AS INPUT ON KILLO1 ,; SUPPLY STATUS IN TTICK FOR KILLO1 CALLJ;LK;+@L; THIS MODULE CONTAINS ENTRY POINTS FOR THE FOLLOWING ROUTINESM; CALLED BY THE EXECUTIVE:N;YO; TTCAN - CANCEL IO P; TTPWUP - POWER-UPQ;-R;S;6T .MCALL DCBDF$,HWDDF$U;V DCBDF$ ;DEFINE DCB SYMBOLS $W HWDDF$ ;DEFINE HARDWARE SYMBOLSXY .IF DF T$$EIOZ[ .MCALL PKTDF$ \ PKTDF$]^ .ENDC ;T$$EIO_ ` .IF DF R$$MPLa b .MCALL KRBDF$c 8d KRBDF$ ;DEFINE KRB SYMBOLS e f .IFF ;R$$MPL g Yh .MCALL SCBDF$i Lj SCBDF$ ;DEFINE SCB SYMBOLSDk Ol .ENDC ;R$$MPLmn .PSECT MAP5o;Np;q;Lr.SBTTL TTCAN - CANCEL I/Os;At;+'u; TTCAN - CANCEL CURRENT IO REQUESTS.>v; THIS ROUTINE IS CALLED FROM THE EXECUTIVE TO CANCEL (KILL)-w; CURRENT IO REQUESTS FOR A TASK ON A LINE.S>x; THE UC.KIL BIT IN U.CTL IN THE UCB IS SET FOR ALL TERMINAL5y; UNITS TO FORCE THE EXECUTIVE TO CALL THIS ROUTINE ,z; EVEN THOUGH THE UNIT IS NOT MARKED BUSY.{;-|;.};RA~; TTCN1 IS CALLED FROM TTINI TO KILL READS OR WRITES (OR BOTH)L?; AS REQUESTED FROM AN INTERNAL I/O KILL PACKTET. SELECTION D€; IS BASED ON THE SUBFUNCTION BIT IN THE INTERNAL I/O KILL PACKET.�;- ‚; INPUT: H"ƒ; R1=>TCB FOR WHICH TO KILL I/O"„; R5=>UCB FOR WHICH TO KILL I/O0…; R3=>FUNCTION(S) TO KILL (IF ENTRY AT TTCN1)†; ‡; ˆ .ENABL LSBE‰; ŠTTCAN::L‹ .IF DF R$$IICŒ:� MOV #,R3 ;IF00©’€g€Ž{´cÚµcÛ¶c�·c›’ CALLED AT TTCAN, BOTH READS!Ž ; AND WRITES WILL BE KILLED �TTCN1::C� .ENDC ;R$$IIC‘’ MTPS #0 ;;;ALLOW INTERRUPTSH“ CALL MAPD ;MAP DATA AREA”• .IF DF T$$EIO–&— MOV R5,R0 ;GET COPY OF UCB POINTER9˜ ADD #U.TIXL,R0 ;MAKE POINTER TO U.TIXL (IOPX LISTHEAD)::™3$: MOV R0,R4 ;CURRENT IOPX POINTER BECOMES BACKPOINTERš› ASSUME I.XLNK,0œ�%ž5$: MOV @R4,R0 ;POINT TO NEXT IOPXŸ BEQ 7$ ;NONE - JUMP )  CMP I.XTCB(R0),R1 ;DO TASK TCBS MATCH?#¡ BNE 3$ ;N - JUMP¢£ .IF DF R$$IIC¤¥9¦ BIT #TF.RLB,R3 ;ARE WE KILLING READS? IF SO, THIS MUST$0§ ;HAVE AN IOPX SINCE ONLY READS HAVE IOPX'S¨ BEQ 3$ ;BR IF NO©ª .ENDC ;R$$IIC«¬ ASSUME I.XLNK,0­&® MOV @R0,@R4 ;REMOVE IOPX FROM LIST¯ MOV R1,-(SP) ;SAVE REGISTERSD° MOV R3,-(SP)R#± MOV #I.XLEN,R1 ;GET SIZE OF IOPXP ² CALL $DEACB ;DEALLOCATE IOPX"³ MOV (SP)+,R3 ;RESTORE REGISTERS´ MOV (SP)+,R17µ BR 5$ ;LOOP¶7$: ;REFERENCE LABELS·¸ .ENDC ;T$$EIO¹º .IF DF T$$SPL».¼ MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX$½ MOV U.TAPR(R5),@#KDSAR5 ;MAP UCBX"¾ ADD #U.TSTA,R5 ;POINT TO U.TSTA¿À .IFF ;T$$SPLRÁ  ADD #U.TUX,R5 ;POINT TO U.TUXà ASSUME U.TSTA,U.TUX+2-Ä MOV (R5)+,R4 ;GET UCBX AND POINT TO U.TSTAP#Å BEQ 40$ ;NONE - LINE IDLE- JUMPÆÇ .ENDC ;T$$SPLÈÉ ASSUME U.TCI,0 (Ê MOV @R4,R0 ;GET CURRENT INPUT PACKETË BEQ 10$ ;NONE - JUMP&Ì BIT #S1.USI,@R5 ;UNSOLICITED INPUT?Í BNE 10$ ;Y - IGNORE.)Î CMP I.TCB(R0),R1 ;FROM THE RIGHT TASK?MÏ BNE 10$ ;N - JUMPUÐÑ .IF DF R$$IICÒ,Ó BIT #TF.RLB,R3 ;DO WE WANT TO KILL READS?Ô BEQ 10$ ;BR IF NOÕ .Ö .IFTF ;R$$IIC×)Ø MOV #IE.ABO&377,(R0) ;SET ABORT STATUSSÙ CALL KILLI ;KILL INPUT2Ú10$: MOV U.TCO(R4),R0 ;GET CURRENT OUTPUT PACKETÛ BEQ 40$ ;NONE - JUMP)Ü CMP I.TCB(R0),R1 ;FROM THE RIGHT TASK?VÝ BNE 40$ ;N - JUMPNÞß .IFT ;R$$IIC$à-á BIT #TF.WLB,R3 ;DO WE WANT TO KILL WRITES?Uâ BEQ 40$ ;BR IF NONã ä .ENDC ;R$$IICå)æ MOV #IE.ABO&377,(R0) ;SET ABORT STATUSUç BR KILLO ;KILL OUTPUTè;Té;R8é.SBTTL KILLO1 - KILL OUTPUT WITH STATUS SUPPLIED IN R0ë;++ì; KILLO1 - KILL OUTPUT WITH STATUS IE.DNR 'í; USED FOR TIME-OUT OR MODEM HUNG UP.Iî; ï; INPUT:$ï; R0 - STATUS (IO.DNR IN LO BYTE)ð; R4 POINTER TO UCBXñ; R5 POINTER TO U.TSTAò;H"ó; REGISTERS ALTERED: R0,R1,R2,R3ô;-õ;.ö;R5÷KILLO1::MOV U.TCO(R4),R3 ;GET CURRENT OUTPUT PACKETS ø BNE 20$ ;THERE IS ONE - JUMP%ù BIT #S1.OBY,@R5 ;ECHO IN PROGRESS?7ú BEQ 40$ ;NO - JUMP/û CALL SETDSI ;YES - DISABLE INPUT PROCESSINGL=ü BISB #US.OIU,U.STS-U.TSTA(R5) ;INTERRUPTS NOT EXPECTED NOWL#ý BIC #S1.OBY,@R5 ;SET OUTPUT FREE þ RETURNR$þ20$: MOV R0,@R3 ;OK - LOAD STATUS ;FALL THRU TO "KILLO"O;I;B/.SBTTL KILLO - KILL OUTPUT WITH STATUS IE.ABO.;;++; KILLO - KILL OUTPUT WITH STATUS IE.ABO..;R ; INPUT: ; R4 POINTER TO UCBX ; R5 POINTER TO U.TSTA: ; I.LNK IN CURRENT OUTPUT REQUEST PACKET CONTAINS STATUS ; TO RETURN TO TASK ;U'; NOTE - MUST EXECUTE ON CORRECT CPU!P;S"; REGISTERS ALTERED: R0,R1,R2,R3;-;P;TKILLO:: SAVNR ;SAVE R4,R5@) CALL SETDSI ;DISABLE INPUT PROCESSINGV/ BIC #S2.WRA,2(R5) ;CLEAR WRAP-AROUND CONTEXTK7 CALL ABOXL ;ABORT OUTPUT WITH INTERRUPTS LOCKED OUTT? BISB #US.OIU,U.STS-U.TSTA(R5) ;DISABLE RECOGNITION OF OUTPUTO ;INTERRUPTS4 FRKBIT BIC,#FR.ORD ;PREVENT MULTIPLE COMPLETIONS  CALLR FPORD ;SAY OUTPUT DONE;C;N..SBTTL KILLI1 - KILL INPUT WITH STATUS IN R0;+C ; KILLI1 - KILL SOLICITED OR UNSOLICITED INPUT WITH STATUS IN R0.<!; USED TO KILL INPUT BECAUSE OF TIME-OUT OR MODEM HUNG UP.";D #; INPUT: $; R0 STATUS (IS.TMO OR IE.DNR)%; R4 POINTER TO UCBX&; R5 POINTER TO U.TSTA';P"(; REGISTERS ALTERED: R0,R1,R2,R3);-*;,+;-, ASSUME U.TCI,0 )-KILLI1::MOV @R4,R3 ;GET CURRENT PACKET. BEQ 40$ ;NONE - RETURN!/ MOV R0,@R3 ;OK - STORE STATUSR0 ;FALL THRU TO "KILLI"C100©š€Ž€±|t÷tø tþfDATA;N2;S.3.SBTTL KILLI - KILL INPUT WITH STATUS IE.ABO4; 5;+*6; KILLI - KILL INPUT WITH STATUS IE.ABO.7;S 8; INPUT:9; R4 POINTER TO UCBX:; R5 POINTER TO U.TSTA9;; I.LNK IN CURRENT INPUT REQUEST PACKET CONTAINS STATUS)<; TO RETURN TO TASK=; '>; NOTE - MUST EXECUTE ON CORRECT CPU! ?;E"@; REGISTERS ALTERED: R0,R1,R2,R3A;-B;CC;DKILLI:: SAVNR ;SAVE R4,R5E)E CALL SETDSI ;DISABLE INPUT PROCESSINGM$F TST U.TCO(R4) ;DOING TASK OUTPUT?G BNE 30$ ;Y - JUMPH;DI; IF WE ARE KILLING A READ WITH ECHO, IT IS POSSIBLE THAT THE ECHOBJ; HAS NOT YET COMPLETED. IF SO, WE MUST LOGICALLY KILL THE ECHO.K;TAL BISB #US.OIU,U.STS-U.TSTA(R5) ;SET OUTPUT INTERRUPT UNEXPECTEDT#M BIC #S1.OBY,@R5 ;SET OUTPUT FREEU8N30$: FRKBIT BIC,#FR.IRD ;PREVENT MULTIPLE COMPLETIONS O BIC #S1.ESC!S1.DEC!S1.DPR,@R5&P ;GET OUT OF ESCAPE SEQUENCE MODEQ ;CLEAR DEFERRED ECHO FLAGI%R ;CLEAR DEFERRED PROCESSING FLAGT.S CLRB U.TISV(R4) ;CLEAR INPUT STATE VARIABLET CALLR FPIRD ;SAY INPUT DONE U40$: RETURN ;RETURNSV;TW;HX OY .IF DF M$$PROZ E,[.SBTTL FPTIM - FORK LEVEL TIME-OUT ROUTINE\;C]; THIS ROUTINE IS ENTERED FROM THE FORK DISPATCHER AFTER A SWITCH,^; TO THE CORRECT CPU TO HANDLE A TIME-OUT._;I`a .IF DF T$$SPLb1cFPTIM:: CALL 70$ ;HANDLE TIME-OUT ON THIS UNITde .IFF ;T$$SPLEfg ASSUME U.TUX,U.TSTA-2$hFPTIM:: TST -(R5) ;POINT TO U.TUX*i CALL 70$ ;HANDLE TIME-OUT ON THIS UNITjk .ENDC ;T$$SPLl3m TST (SP)+ ;ROUTINE RETURNS AS A COROUTINE - POPTn ;RETURN ADDRESS&o RETURN ;RETURN TO FORK DISPATCHERp q .ENDC ;M$$PROr s;t;H(u.SBTTL TIME - TIME-OUT (DRIVER TIMER).v;Aw;A#xTTICK:: CALL MAPD ;MAP DATA AREAA-y MOV #DCB0,R3 ;POINT TO POINTER TO TT0: DCB>z MOV #$SCDV1,-(SP) ;GET ADDRESS OF DEVICE TABLE SCAN ROUTINE{ $| .IF NDF T$$MOD } ,~80$: P€ .ENDC ;NOT T$$MOD� U&‚60$: CALL @(SP)+ ;GET NEXT TERMINALƒ BCS CLINS ;ALL DONE - JUMP+„ CMP D.NAM(R3),#"TT ;IS DEVICE NAME "TT"?T… BNE 100$ ;N - ABORT SCAN+† BIT #DV.TTY,U.CW1(R5) ;IS IT A TERMINAL?‡ BEQ 100$ ;N - ABORT SCANˆ‰ .IF DF R$$CONŠ+‹ BITB #US.OFL,U.ST2(R5) ;IS UNIT OFFLINE?C#Œ BNE 60$ ;Y - GO ON TO NEXT UNITV�Ž .ENDC ;R$$CON��;T#‘; FOUND A TERMINAL. CHECK TIMERS.D’; “” .IF DF T$$SPL•"– ADD #U.TSTA,R5 ;POINT TO U.TSTA2—70$: MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX+˜ MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;MAP UCBXA™š .IFF ;T$$SPLP› œ ADD #U.TUX,R5 ;POINT TO U.TUX� ASSUME U.TSTA,U.TUX+21ž70$: MOV (R5)+,R4 ;GET UCBX AND POINT TO U.TSTAŸ  .ENDC ;T$$SPL¡¢ BEQ 80$ ;NONE - JUMP£ MOV R4,R1 ;F'¤ ADD #U.TITI,R1 ;POINT TO INPUT TIMER$0¥ MOV #IS.TMO,R0 ;GET STATUS FOR INPUT TIME-OUT.¦ MOV #KILLI1,R2 ;POINT TO KILL INPUT ROUTINE § CALL 110$ ;CHECK INPUT TIMER¨ ASSUME S2.CTS,100000 *© TST 2(R5) ;OUTPUT STOPPED BY CTRL-S?$ª BMI 80$ ;Y - IGNORE OUTPUT TIMER«¬ .IF DF T$$SPL­8® MOV #120000,R4 ;RESTORE CLOBBERED R4 TO POINT TO UCBX¯ MOV R4,R1 ;U°± .IFF ;T$$SPL5²³ MOV -2(R5),R1 ;GET UCBX´µ .ENDC ;T$$SPL¶(· ADD #U.TOTI,R1 ;POINT TO OUTPUT TIMER3· MOV #IE.DNR&377,R0 ;MOVE STATUS TO R0 FOR KILLO1M/¸ MOV #KILLO1,R2 ;POINT TO KILL OUTPUT ROUTINEM!¹ CALL 110$ ;CHECK OUTPUT TIMERRº E» .IF DF T$$MOD¼ I½80$:¾¿ .IF NDF R$$CON0À2Á BITB #US.OFL,U.ST2-U.TSTA(R5) ;IS UNIT OFFLINE? BEQ 90$ ;N - JUMPT=à CLRB U.TMTI-U.TSTA(R5) ;Y - RESET TIMER TO PREVENT TIMEOUTOÄ BR 60$ ;GO ON TO NEXT UNITÅÆ .ENDC ;NDF R$$CONÇÈ90$: MOV R5,R1 ;5.É ADD #U.TMTI-U.TSTA,R1 ;POINT TO MODEM TIMER0Ê MOV #MTIM,R2 ;POINT TO MODEM TIME-OUT ROUTINE Ë CALL 110$ ;CHECK MODEM TIMERÌ Í .IF DF D$$ZMDÎ/Ï MOV #U2.DZ1!U2.RMT,-(SP) ;PUSH BITS TO CHECKOEÐ BIC U.CW2-U.TSTA(R5),(SP)+ ;IS LINE SERVICED BY A DZ11 AND REMOTE?OÑ BNE 60$ ;N - JUMP,ÒÓ .IF DF M$$PROÔ9Õ MOV #FR.TIM,R3 ;GET FORK REQUEST BIT FOR MODEM TIMEOUT AÖ MOV #60$,-(SP00©¢€g€Ž{´cÚµcÛ¶c�·c›’) ;GO ON TO NEXT LINE IF THIS ONE NOT ON THIS CPUT6× CALL SWCPU ;SWITCH TO THE CORRECT CPU IF NECESSARY9Ø CALLR YZPOLL ;POLL THE DZ11 FOR MODEM STATUS SINCE ITR4Ù ;DOESN'T INTERRUPT ON MODEM STATUS TRANSITIONSÚÛ .IFF ;M$$PROÜ8Ý CALL YZPOLL ;POLL THE DZ11 FOR MODEM STATUS SINCE IT4Þ ;DOESN'T INTERRUPT ON MODEM STATUS TRANSITIONSßà .ENDC ;M$$PROáâ .ENDC ;D$$ZMDãä .ENDC ;T$$MODå Oæ BR 60$ ;LOOPç; 5è; FOUND A DEVICE OTHER THAN A TERMINAL - ABORT SCAN(é;G#ê100$: ADD #S$$SPA,SP ;FLUSH STACKTë;P"ì; ALL DONE - REQUEUE CLOCK BLOCKí; (îCLINS:: MOV #$TTCB,R0 ;GET CLOCK BLOCK'ï CLR R1 ;CLEAR HIGH ORDER DELTA TIME %ð MOV $TKPS,R2 ;LOW ORDER = 1 SECONDS+ñ MOV #C.SYST,R4 ;TYPE = SYSTEM SUBROUTINEO2ò CALLR $CLINS ;INSERT IN CLOCK QUEUE AND RETURNó;Nô;T õ110$: TSTB @R1 ;TIMER ACTIVE?ö BEQ 120$ ;N - RETURN÷ DECB @R1 ;Y - UPDATE TIMER"ø BEQ 130$ ;TIMER EXPIRED - JUMPù120$: RETURN ;RETURNú130$: û Nü .IF DF M$$PROý Gþ; WE JUST DECREMENTED THE TIMER TO 0, BUT WE MAY BE ON THE WRONG CPU.B7ÿ; SET TIMER BACK TO +1 AND SWITCH TO THE CORRECT CPU.C;  INCB @R1 ;SET TIMER TO +1' MOV #FR.TIM,R3 ;GET FORK REQUEST BIT% CALL SWCPU ;SWITCH TO CORRECT CPUN;<; IF WE FALL THRU HERE, WE ARE ALREADY ON THE CORRECT CPU.;$( CLRB @R1 ;FINALLY SET THE TIMER TO 0  .IF DF T$$SPL '  MOV #120000,R4 ;RESTORE UCBX POINTERI   .IFF ;T$$SPLE0 MOV U.TUX-U.TSTA(R5),R4 ;RESTORE UCBX POINTER .ENDC ;T$$SPL I .ENDC ;M$$PRO  .IF DF T$$CON # MOV U.SCB-U.TSTA(R5),R3 ;GET SCBE E .IF DF R$$MPL  MOV S.KRB(R3),R3 ;GET KRB TSTB K.PRM(R3) ;DL11? BNE 140$ ;N - JUMP ASSUME K.CSR,0   MOV @R3,R3 ;GET CSR ADDRESSE! E" .IFF ;R$$MPLH# R $ TSTB U.CTYP-U.TSTA(R5) ;DL11?% BNE 140$ ;N - JUMP$& MOV S.CSR(R3),R3 ;GET CSR ADDRESS' ( .ENDC ;R$$MPL) +* BIT #20,4(R3) ;TERMINAL IN CONSOLE MODE?(!+ BNE 120$ ;Y - IGNORE TIME-OUT, C- .ENDC ;T$$CON. .!/140$: JMP @R2 ;HANDLE TIME-OUTN0; 1 .DSABL LSBU2;(3 3 4 .ENABL LSBE5 .6 .IF DF T$$MOD7 M8;K9; HANDLE MODEM TIME-OUT :;(;;MTIM: MOV #CT.TIM,R2 ;SET INDEX FOR MODEM TIMEOUT ROUTINEV-< CALLR CTRD ;DO CONTROLLER-DEPENDENT STUFFP= > .ENDC ;T$$MOD?;T@; A.SBTTL TTPWUP - POWER-UP.PB;MC;+D; TTPWUP - POWER-UP.E;-F;G;CHI .IF DF R$$CONJ KTTINIT::LM .IFFLN OTTPWUP::PQ .ENDCR TS .IF DF T$$COMT C'U MOV $TTCOM,R0 ;GET TTCOM PCB ADDRESSTVW .IF NDF R$$CONBX'Y BEQ 20$ ;NOT A VIRGIN SYSTEM - JUMP.Z[ .ENDC ;NDF R$$CON\6] BIS #PS.NSF,P.STAT(R0) ;MARK TTCOM AS NONSHUFFLABLE9^ MOV P.REL(R0),KINAR6 ;MAP INITIALIZATION CODE IN APR 6R_` .IF DF T$$SPLa'b CALL INIT ;DO VIRGIN INITIALIZATIONLcd .IFF ;T$$SPLe,f CALL INIT+20000 ;DO VIRGIN INITIALIZATION,g ;THE INIT ROUTINE IS BUILT FOR MAPPING*h ;IN APR5, BUT IS NOW MAPPED IN APR 6ij .ENDC ;T$$SPLk'l20$: CALL MAPD ;MAP DRIVER DATA AREAm n .IFF ;T$$COMo p CALL MAPD ;MAP DATA AREAqr .IF NDF R$$CON;s't BNE 30$ ;NOT A VIRGIN SYSTEM - JUMPRuv .ENDC ;NDF R$$CONwx Ry .IF NDF R$$MPLIz L{ MOV R3,-(SP) ;SAVE R3| MOV R4,-(SP) ;SAVE R4} ~ .IFTF N2€ MOV @#KISAR5,R0 ;COPY REAL START OF DRIVER DATA0� ADD #200,R0 ;ADD THE EQUIVALENT OF 4 K WORDS&‚ MOV R0,@#KISAR6 ;MAP REST OF DRIVERƒ„ .IF NDF T$$SPLP…&† MOV R0,@#$DALED ;SAVE DRIVER KISAR6‡ˆ .ENDC ;NDF T$$SPL‰'Š CALL INIT ;DO VIRGIN INITIALIZATIONC‹ Œ .IFTD� RŽ MOV (SP)+,R4 ;RESTORE R4� MOV (SP)+,R3 ;RESTORE R3Y� -‘ .ENDC ;NDF R$$MPL’ $“ .ENDC ;T$$COM” N•30$: ;REFERENCE LABEL– — .IF NDF R$$MPL,˜ ™ .IF DF T$$ACDš1› TST U.ACB(R5) ;DOES THIS TERMINAL HAVE AN ACD?Iœ BEQ 40$ ;N - JUMP0"� ADD #U.TSTA,R5 ;POINT TO U.TSTA,ž MOV #A.POWE,R0 ;SET POWERFAIL ENTRY POINTŸ CALL $SWACD ;CAL00©ª€ª®€±|t÷tø tþfDATAL ACDV,  SUB #U.TSTA,R5 ;RESTORE R5 TO UCB ADDRESS¡¢ .ENDC ;T$$ACD£'¤; SET UP DATABASES OF UCB'S AND CSR'S¥;D¦ R.§40$: MOVB U.CTYP(R5),R2 ;GET CONTROLLER TYPE%¨ MOV TTUCB(R2),R1 ;POINT TO D'X'UCBL9© ADD R3,R1 ;POINT TO TABLE POINTER FOR THIS CONTROLLER'ª MOV (R1),R1 ;POINT TO UCB/CSR TABLE «¬ .IF DF D$$M11­® CMP #TTTDH,R2 ;IS IT A DH11?D¯ BNE 50$ ;N - JUMPM-° MOV S.DMCS(R4),-2(R1) ;FILL IN DM11-BB CSR#±² .ENDC ;D$$M11³2´50$: MOV S.CSR(R4),(R1)+ ;FILL IN CONTROLLER CSR&µ MOVB U.UNIT(R5),R2 ;GET UNIT NUMBER"¶ ASL R2 ;CONVERT TO WORD OFFSET,· ADD R2,R1 ;ADD POINTER AND UNIT NUMBER*2¸ MOV R5,(R1) ;PLUG IN UCB¹ Yº .ENDC ;NDF R$$MPL» I¼ .IF DF M$$EXT½¾ .IF DF D$$H11!D$$V11O¿ À .IF DF R$$MPLÁ( BIT #HF.UBM,$HFMSK ;UNIBUS MAP EXIST?$à BEQ 60$ ;N - SKIP INITIALIZATIONÄÅ .IFF ;R$$MPLÆ"Ç TST $UMRPT ;UNIBUS MAP EXISTS?*È BEQ 60$ ;IF EQ NO, SKIP INITIALIZATIONÉÊ .ENDCËAÌ; LOAD THE UMR(S) TO MAP DRIVER WITH 18-BIT ADDRESSES IDENTICALRÍ; TO 16-BIT ADDRESSESLÎ;;ÏÐ .IF DF T$$UMRÑ&Ò MOV #UMR5S,R1 ;POINT TO SAVED UMR 5&Ó MOV #UBMPR+<5*4>,R2 ;POINT TO UMR 5$Ô MOV (R1)+,(R2)+ ;INITIALIZE UMR 5Õ MOV (R1)+,(R2)+Ö× .IF NDF T$$SPLØ$Ù MOV (R1)+,(R2)+ ;INITIALIZE UMR 6Ú MOV (R1)+,(R2)+Û BÜ .ENDC ;NDF T$$SPLÝÞ .ENDC ; DF T$$UMRßàá60$: ;REFERENCE LABELâã .ENDC ;D$$H11!D$$V11Qäå .ENDC ;M$$EXTæ ç .IF DF R$$CONè é RETURNSêë .IFFEì"í ADD #U.TSTA,R5 ;POINT TO U.TSTA6î CALL CKTAB ;CHECK WHETHER TYPE-AHEAD BUFFER SHOULD"ï ;BE ALLOCATED OR DEALLOCATEDð Mñ .IF DF T$$MODò N'ó BICB #US.CRW!US.DSB,U.STS-U.TSTA(R5)Eô ;ASSUME LOCAL LINEõ ö .ENDC÷ P1ø MOV #CT.PWR,R2 ;SET ROUTINE INDEX FOR POWER-UPV1ù CALLR CTRD ;CALL CONTROLLER DEPENDENT ROUTINENú ;AND RETURNûü .ENDC ;R$$CONý B þ .DSABL LSBCÿ;H;$ .ENDå .ENDC ;M$$EXTæ ç .IF DF R$$CONè é RETURNSê .TITLE TTINIB .IDENT /06.06/T; =; COPYRIGHT (c) 1986,1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;I>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;) ;S ; 02-FEB-78 PETER WANNHEDEND ;M ; PREVIOUSLY MODIFIED BY:;Q; P. WANNHEDEN; C. F. SPITZ ; D. R. DONCHIN, ; T. LEKAS; S. C. ADAMSE; R. S. PHILPOTT;N;S; MODIFIED BY:;3; L. KOGAN 02-NOV-85 06.016; LK705 -- MAKE 11M AND 11M+ TTDRV MODULES IDENTICAL;G ; S. C. ADAMS 16-JUNE-86 06.02@; SA460 -- ALLOW BROADCAST WRITE TO TI: OF NON-PRIVILEGED TASK ; AND CLEAN UP SOME COMMENTS; "; S. C. ADAMS 20-AUGUST-86 06.03; SA464 -- ADD ROUTINE QPORG;B'; TODD SCHOELLER 12-DECEMBER-86 06.04Y9; TMS051 -- CORRECT QPORG TO USE CORRECT BLOCKING BITS.;R'; B. S. MCCARTHY 31-DECEMBER-86 06.05E<; BM380 -- CORRECT QPORG SO THAT FORK CALL GOES TO CORRECT ; ROUTINE.-;.$; T. M. SCHOELLER 14-AUG-87 06.06>; TMS060 -- If a privilege violation occurs during an IO.HNG7; or an IO.ORG, pop the return address off the stack (; before jumping to error processing.;;+;M; ****** T T I N I ****** ;DC; THIS MODULE CONTAINS THE ROUTINES TO INITIATE A NEW I/O REQUESTML; FOR A TERMINAL. THERE ARE THREE PARTS TO THIS. FIRST, THE I/O REQUESTSI; ARE VALIDATED PRIOR TO PLACING THEM IN THE DEVICE'S I/O PACKET QUEUE.OI; THIS MUST OCCUR WHILE THE USER TASK WHICH ISSUED THE REQUEST IS STILLMK; THE CURRENT TASK. NEXT, THE REQUEST IS PLACED IN THE REQUEST QUEUE FORpK; THE TERMINAL. FINALLY, ANY REQUEST IN THE QUEUE WHICH CAN BE INITIATED.F ; IS DEQUEUED AND PASSED TO A FUNCTION-DEPENDENT INITIATION ROUTINE.!;-";T# .MCALL PKTDF$ $ PKTDF$ %& .PSECT MAP5'.PAGEND( .SBTTL TTINI - TERMINAL DRIVER I/O REQUEST INITIATION ENTRY POINT);A*;+.+; **-TTINI - REQUEST INITIATION ENTRY POINT.,;OM-; THIS ROU00ª²€g€Ž{´cÚµcÛ¶c�·c›’TINE IS CALLED FROM "DRQIO" WHEN A TASK HAS ISSUED AN I/O REQUESTM.; FOR A TERMINAL. THE CALL IS MADE PRIOR TO QUEUEING THE I/O PACKET TO THE M/; SCB QUEUE SINCE TERMINALS HAVE THE "UC.QUE" BIT SET IN THEIR UCB'S. THISSL0; IS DONE WHILE THE TASK CONTEXT IS STILL VALID, SINCE MANY FUNCTIONS WILLM1; NEED ADDITIONAL PARAMETER CHECKS NOT DONE BY THE EXECUTIVE. THIS ROUTINEEJ2; WILL MAP THE DRIVER DATA AREA (SINCE WE WERE CALLED FROM THE EXEC) AND>3; DISPATCH ON THE FUNCTION CODE TO VALIDATE THE I/O REQUEST.4;O 5; INPUTS:,6; R1 => I/O REQUEST PACKET TO BE PROCESSED(7; R4 => SCB FOR THE REQUESTED TERMINAL(8; R5 => UCB FOR THE REQUESTED TERMINAL9; :; OUTPUTS: NONE.;; $<; REGISTERS MODIFIED: R0, R1, R3=;->; ?TTINI::N#@ CALL MAPD ;MAP DRIVER DATA AREAI&A MOV R1,R3 ;COPY I/O PACKET POINTER1B MOVB I.FCN+1(R3),R0 ;GET THE I/O FUNCTION CODE&C ASL R0 ;CONVERT IT TO A WORD INDEXDE .IF DF R$$IICF5G CALLR @QPDSP(R0) ;DISPATCH TO PROCESS THIS REQUESTHHI .IFF ;R$$IICJ7K CALLR @QPDSP-2(R0) ;DISPATCH TO PROCESS THIS REQUESTLM .ENDC ;R$$IICNOP .IF DF T$$EIO&T$$OVLOQFR;HERE IS THE STUB FOR TRANSFERING TO THE OVERLAY. QPEIO IS IN TTATT.S TQPEIO::1,U CALLR QPETRA ;BRANCH TO TRANSFER IN APR6VW .ENDC ;T$$EIO&T$$OVLRXY.PAGE/=Z .SBTTL FPGRQ - GET A REQUEST PACKET FROM THE REQUEST QUEUEC[;\;+4]; FPGRQ - GET A REQUEST PACKET FROM THE I/O QUEUE.A^; THIS SUBROUTINE IS ENTERED EITHER FROM THE REQUEST INITIATOR, _; OR FROM THE FORK DISPATCHER.`;0 a; INPUT:b; R5 POINTER TO U.TSTA+c; S1.DSI 1 TO PREVENT PROCESSING OF INPUTOd;V e; OUTPUT:R:f; IF THERE IS AN IO.WBT PACKET IN THE QUEUE, A CTRL-Q ISg; SIMULATED.h;8i; AS MANY PACKETS AS CAN BE DEQUEUED FROM THE IO QUEUEj; ARE STARTED.k;%l; REGISTERS ALTERED: R0,R1,R2,R3,R4 m;-n; o;E p .ENABL LSB qFPGRQ::Ar BIT #FR.PFP,U.TFRQ-U.TSTA(R5) ;POST-FORK PROCESSING REQUESTED?T/s BNE FPRET ;IF NE, YES...MUST DO THAT FIRST.t uGRQPKT:Hvw .IF NDF T$$SPL0x?y MOV #DEUCBX,-(SP) ;IF TSTRQ OR $GSPKT FAILS, DEALLOCATE UCBXSz{ .IFTF ;NDF T$$SPL|+} CALL TSTRQ ;TEST IF ANYTHING TO DEQUEUE 3~ ;IF NOT, DEALLOCATE UCBX AND RETURN TO CALLER 0 MOV R3,-(SP) ;SAVE FLAGS IN CASE $GSPKT FAILS-€ MOV #GRQAC,R2 ;POINT TO ACCEPTANCE ROUTINE1(� SUB #U.TSTA,R5 ;POINT TO START OF UCB$‚ MOV R5,-(SP) ;SAVE POINTER TO UCBƒ CALL $GSPKT ;GET A PACKETG'„ MOV (SP)+,R5 ;RESTORE POINTER TO UCB.5… BCC 10$ ;IF CC, SUCCESSFULLY GOT A REQUEST...SKIP$†;O‡; NOPKDQ - NO PACKET CAN CURRENTLY BE DEQUEUED. EITHER THERE WERE NO PACKETSFKˆ; OR THE ACCEPTANCE ROUTINE ABBORTED THE SCAN AND BRANCHED HERE DIRECTLY.,‰;L ŠNOPKDQ:A+‹ ADD #U.TSTA,R5 ;POINT TO UCB STATUS WORDL9Œ BIC (SP)+,2(R5) ;CLEAR FLAGS THAT WE SHOULD NOW IGNOREA�FPRET:Ž RETURN ;ALL DONEP��;TI‘; FOUND A REQUEST PACKET THAT CAN BE PROCESSED. IT'S ADDRESS IS IN R1.C’;“10$:”• .IFT ;NDF T$$SPLT–?— CMP (SP)+,(SP)+ ;CLEAN STACK OF FLAGS AND DEALLOCATE ROUTINE˜™ .IFF ;NDF T$$SPLNš#› TST (SP)+ ;CLEAN STACK OF FLAGSEœ� .ENDC ;NDF T$$SPLžŸ .IF DF T$$BTW '¡ MOV U.SCB(R5),R3 ;GET POINTER TO SCB¢20$:8£ MOV (R3),R3 ;GET POINTER TO NEXT I/O PACKET IN QUEUE¤ BEQ 30$ ;IF EQ, NONE...SKIPW1¥ CMP I.UCB(R3),R5 ;IS THAT PACKET FOR THIS UCB?N)¦ BNE 20$ ;IF NE, NO...SKIP THIS PACKETA=§ CMPB I.PRI(R3),#251. ;IS REQUEST FOR A BREAKTHROUGH WRITE?,¨ BEQ 40$ ;IF EQ, YES...ACCEPT THE REQUEST©30$:Eª BIC #S2.BRQ,U.TSTA+2(R5) ;OTHERWISE, SHOW NO MORE IO.WBTS IN QUEUET«40$:¬­ .ENDC ;T$$BTW®-¯ ADD #U.TSTA,R5 ;POINT TO FIRST STATUS WORD"° MOV R1,R3 ;COPY PACKET POINTER<± CLR (R3) ;CLEAR LINK WORD USED TO HOLD COMPLETION STATUSA² MOVB I.FCN+1(R3),R1 ;GET I/O REQUEST FUNCTION CODE (HIGH BYTE) ³´ .IF DF T$$SPLµ/¶ MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;MAP THE UCBX.· MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX¸¹ .IFTF ;T$$SPLº» .IIF NDF T$$SPL, N$$SPL00ªº€®€±|t÷tø tþfDATA=0¼ .IF DF T$$MOD!N$$SPLB½¾;+E¿; NOTE - HERE WE ASSUME NUMERIC VALUES FOR FUNCTION CODES ACCORDING;)À; TO WHAT IS DESCRIBED IN MODULE TTDAT!SÁ;T7 CMP R1,#IO.RPR/400 ;IS REQUEST ONE OF THE FOLLOWING: /à ; IO.RPR, IO.RTT, IO.EIO, IO.RSD, IO.WSD?;Ä BHIS 50$ ;IF HIS, YES...REQUIRE UCBX AND DO MODEM CHECKY2Å CMP R1,#IO.ATT/400 ;IS IT ONE OF THE FOLLOWING:'Æ ; IO.DET, IO.GTS, SF.GMC, SF.SMC?08Ç BHI 91$ ;IF HI, YES...DON'T NEED UCBX OR MODEM CHECK6È ;OTHERWISE, REQUEST IS IO.ATT, IO.WLB, OR IO.RLBÉÊ .ENDC ;T$$MOD!N$$SPL ËÌ .IF DF T$$MODÍ:Î BEQ 60$ ;IF EQ, IO.ATT...NEED UCBX BUT NOT MODEM CHECKÏÐ .IFTF ;T$$MODÑÒ50$:ÓÔ .IFT ;T$$MODNÕCÖ BITB #US.DSB!US.CRW,U.STS-U.TSTA(R5) ;IS THE LINE DISABLED OR...2× ; ...WAITING FOR CARRIER (CHECKED ONLY ON...2Ø ; ...IO.RLB, IO.WLB, IO.RPR, IO.RTT, IO.EIO,'Ù ; ...IO.RSD, AND IO.WSD REQUESTS)F-Ú BEQ 60$ ;IF EQ, NO...REQUEST CAN CONTINUEB.Û BIT #S4.DLO,6(R5) ;IS THIS A DIAL-OUT LINE?2Ü BNE 60$ ;IF NE, YES...LET THE REQUEST BE TRIED<Ý MOV #IE.DNR&377,R0 ;ELSE, RETURN "DEVICE NOT READY" ERRORÞ*ß JMP 910$ ;SKIP TO COMPLETE THE REQUESTà60$:áâ .ENDC ;T$$MODãä .IFF ;T$$SPL.å0æ CALL ALUCBX ;ALLOCATE UCBX IF IT ISN'T THERE0ç BCS 105$ ;IF CS, NO FREE POOL...RETURN ERRORèé .ENDC ;T$$SPLêë .IF DF T$$EIOì8í CMP R1,#IO.EIO/400 ;IS THIS AN EXTENDED I/O FUNCTION?,î BNE 90$ ;IF NE, NO...CHECK NEXT FUNCTIONï>ð MOV U.TIXL-U.TSTA(R5),R2 ;GET POINTER TO FIRST IOPX IN LISTñ70$:>ò CMP I.XIOP(R2),R3 ;IS THIS IOPX FOR THE CURRENT I/O PACKET?'ó BEQ 73$ ;IF EQ, YES...EXIT THE LOOPTôõ ASSUME I.XLNK,0ö)÷ MOV (R2),R2 ;GET POINTER TO NEXT IOPXP6ø BR 70$ ;CHECK THIS ONE (IT MUST BE HERE SOMEWHERE)ùú73$:=û BIT #TF.RDI,I.XMOD(R2) ;READ WITH DEFAULT INPUT SPECIFIED?ü BEQ 80$ ;IF EQ NO>ý MOV I.XDBL(R2),U.TDIC(R4) ;SAVE DEFAULT INPUT BUFFER LENGTH6þ MOV R1,-(SP) ;SAVE R1 IN CASE THIS IS USER TASK EIO?ÿ CALL $TSTBF ;SHOULD WE ATTEMPT TO BUFFER THE DEFAULT INPUT?P BCS 77$ ;IF CS NO ;FH; ATTEMPT ALLOCATING AND FILLING TTDRV BUFFERS WITH DEFAULT INPUT DATA;S) BIS #S1.IBF,@R5 ;ASSUME BUFFERED INPUTT3 MOV R2,-(SP) ;SAVE IOPX POINTER ACROSS ALTB CALL 7 CALL ALTB ;ALLOCATE A BUFFER TO STORE DEFAULT INPUT , MOV R2,R0 ;PASS THE BUFFER ADDRESS TO R0+ MOV (SP)+,R2 ;RESTORE IOPX ADDRESS TO R2;1  BCS 77$ ;IF CS, NO BUFFER IS AVAILABLE - JUMPS=  MOV R0,U.TDIF(R4) ;SAVE FIRST DEFAULT INPUT BUFFER ADDRESSE?  MOV #T$$BFL-4,U.TDIP(R4) ;SET SIZE OF DATA PORTION OF BUFFER=  MOV R0,U.TDIP+2(R4) ;SET DATA POINTER TO FIRST DATA BUFFERL?  ADD #4,U.TDIP+2(R4) ;POINT PAST BUFFER HEADER TO DATA ITSELF)74$: CLR (R0)+ ;CLEAR BUFFER LINK WORDB5 MOV R0,R1 ;SAVE POINTER TO BUFFER CHARACTER COUNTLG MOV #T$$BFL-4,(R0)+ ;SET MAXIMUM DATA THAT CAN BE STORED IN 1 BUFFERR;75$: MOV I.XDBF(R2),KISAR6 ;MAP USER DEFAULT INPUT BUFFERA= MOVB @I.XDBF+2(R2),-(SP) ;GET CHARACTER FROM USER'S BUFFERT" MOV $DALED,KISAR6 ;REMAP DRIVER5 MOVB (SP)+,(R0)+ ;INSERT CHARACTER INTO OUR BUFFERR6 INC I.XDBF+2(R2) ;UPDATE POINTER INTO USER'S BUFFER+ DEC I.XDBL(R2) ;ONE LESS CHARACTER TO GOD BEQ 79$ ;IF EQ ALL DONER= DEC (R1) ;MORE CHARACTERS YET TO GO - IS OUR BUFFER FULL?O: BNE 75$ ;IF NE NO - INSERT MORE CHARACTERS INTO BUFFER9 MOV R2,-(SP) ;YES - SAVE IOPX POINTER ACROSS ALTB CALL2= CALL ALTB ;ALLOCATE ANOTHER BUFFER TO STORE DEFAULT INPUT,, MOV R2,R0 ;PASS THE BUFFER ADDRESS TO R0+ MOV (SP)+,R2 ;RESTORE IOPX ADDRESS TO R2,5 BCS 76$ ;IF CS, NO ADDITIONAL BUFFER IS AVAILABLE++ MOV R0,-(R1) ;LINK OLD BUFFER TO NEW ONED,  BR 74$ ;STUFF CHARACTERS INTO NEW BUFFER!;$N"; COME HERE IF NOT ENOUGH TTDRV BUFFERS COULD BE ALLOCATED TO CONTAIN ALL OF.#; THE CHARACTERS OF THE USER'S DEFAULT INPUT$;T8%76$: MOV R2,-(SP) ;SAVE IOPX POINTER ACROSS DELTB CALL9& MOV U.TDIF(R4),R2 ;GET ADDRESS OF FIRST OF OUR BUFFERS ' CALL DELTB ;DEALLOCATE THEMS%( MOV (SP)+,R2 ;RESTORE IOP00ª€g€Ž{´cÚµcÛ¶c�·c›’X POINTER+);R8*; SAVE POINTERS TO USER'S DEFAULT INPUT BUFFER IN UCBX+;U@,77$: MOV I.XDBF(R2),U.TDIP(R4) ;SAVE APR BIAS OF USER'S BUFFER@- MOV I.XDBF+2(R2),U.TDIP+2(R4) ;SAVE VIRTUAL ADDRESS OF BUFFER/. CLR U.TDIF(R4) ;NO DEFAULT BUFFERS ALLOCATED */ BIC #S1.IBF,(R5) ;DO NON-BUFFERED INPUT0;D.1; PROCESS AN IO.RTT (TF.RTT) REQUEST, IF ANY2;I379$:4 MOV (SP)+,R1 ;RESTORE R1(580$:=6 BIT #TF.RTT,I.XMOD(R2) ;READ W/TERMINATOR TABLE SPECIFIED?E37 BEQ PKTDSP ;IF EQ, NO...SKIP TO DISPATCH PACKET8J9 MOV I.XTTB(R2),I.PRM+10(R3) ;COPY 1.ST ADDRESS DOUBLE WORD OF NEW TABLEL: MOV I.XTTB+2(R2),I.PRM+16(R3) ;COPY 2.ND ADDRESS DOUBLE WORD OF NEW TABLE;*< MOV I.XTTL(R2),R0 ;COPY LENGTH OF TABLE$= CMP R0,#32. ;IS IT OVER 32 BYTES>? BHI 92$ ;YES, SET TO 32.@ BR 100$ ;JOIN COMMON CODENAB .ENDC ;T$$EIOCD90$:9E CMP R1,#IO.RTT/400 ;IS THIS A READ W/TERMINATOR TABLE?#F BEQ 92$ ;IF EQ YESG91$:(H BR PKTDSP ;DISPATCH ON FUNCTION CODEI92$:&J MOV #32.,R0 ;COPY A 32. BYTE TABLEKL100$:RM MOV R0,-(SP)SN CALL ALTB ;ALLOCATE A TABLEEO MOV (SP)+,R0(:P105$: BCS 900$ ;IF CS, ALLOCATION FAILED...RETURN ERROR3Q MOV R2,U.TRTT(R4) ;SAVE TERMINATOR TABLE ADDRESSCR110$:.,S MOV I.PRM+10(R3),KISAR6 ;MAP USER'S TABLE6T MOVB @I.PRM+16(R3),-(SP) ;RETRIEVE AN ENTRY FROM IT,U MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPING2V MOVB (SP)+,(R2)+ ;COPY ENTRY TO ALLOCATED TABLE(W INC I.PRM+16(R3) ;POINT TO NEXT ENTRYX SOB R0,110$ ;LOOP TIL DONE*Y MOV U.TRTT(R4),R0 ;FORM REMAINING COUNTZ ADD #32.,R0 ;...[ SUB R2,R0 ;... \ BEQ PKTDSP ;ALL DONE IF ZERO]115$:0"^ CLRB (R2)+ ;ZERO REST OF TABLE_ SOB R0,115$ ;...(`; BR PKTDSP ;FALL THROUGH TO "PKTDSP"a.PAGE@b .SBTTL PKTDSP - DISPATCH ON FUNCTION CODE TO INITIATE REQUESTc;Pd;+=e; **-PKTDSP - DISPATCH ON FUNCTION CODE TO INITIATE REQUESTPf;-g;V hPKTDSP:)/i ASL R1 ;CONVERT FUNCTION CODE TO WORD INDEX(jk .IF DF T$$ACDl>m MOV #UA.ALL,U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING FLAGS9n MOV U.ACB-U.TSTA(R5),R0 ;GET ACD CONTROL BLOCK ADDRESSQ&o BEQ 120$ ;IF EQ, NONE THERE...SKIP!p MOV R1,R2 ;COPY FUNCTION CODE3q CMPB R2,#30. ;FUNCTION CODE IN FIRST MASK WORD?Pr BLOS 117$ ;Y - JUMPT9s TST (R0)+ ;BUMP ACB POINTER TO CHECK SECOND MASK WORD%t SUB #32.,R2 ;REDUCE FUNCTION CODEUIu117$: BIT $BTMSK(R2),A.MAS(R0) ;IS THE ACD INTERESTED IN THIS FUNCTION?Rv BEQ 120$ ;IF EQ, NO...SKIP5w MOV #A.DEQU,R0 ;SET I/O PACKET DEQUEUE ENTRY POINTRx CALL $SWACD ;CALL THE ACDS9y BIT #UA.ALL,U.AFLG-U.TSTA(R5) ;ALLOW THIS I/O REQUEST?Q&z BNE 120$ ;IF NE, YES...CONTINUE ON?{ MOV U.ACB-U.TSTA(R5),R0 ;GET ACD CONTROL BLOCK ADDRESS AGAINC9| MOV A.IOS(R0),R0 ;GET I/O ERROR CODE TO RETURN TO TASK(} BR 910$ ;FINISH I/OO~120$:C€ .ENDC ;T$$ACD�‚ .IF DF T$$OVLƒ8„ MOV PPDSP-2(R1),R1 ;GET ADDRESS TO WHICH TO DISPATCH%… ASL R1 ;CONVERT TO A REAL ADDRESS;.† BCS 130$ ;AND SEE IF ROUTINE IS IN OVERLAY$‡ CALL MPEXT ;MAP AND CALL ROUTINE ˆ BR 140$ ;C‰130$:T&Š CALL (R1) ;IT'S NOT IN THE OVERLAY‹140$:TŒ� .IFF ;T$$OVLNŽ*� CALL @PPDSP-2(R1) ;DO OR START FUNCTION�‘ .ENDC ;T$$OVL’4“ JMP GRQPKT ;LOOP TO DEQUEUE ANYTHING ELSE WE CAN”;T2•; ERROR HANDLING FOR REQUEST INITIATION ROUTINE.–;.—900$:AC˜ MOV #IE.NOD&377,R0 ;RETURN ERROR FOR INSUFFICIENT DYNAMIC MEMORYW™910$:Iš› .IF DF T$$EIOœ)� CMP R1,#IO.EIO/400 ;IS THIS AN IO.EIO? ;ž BNE 990$ ;IF NE, NO...JUST FINISH OFF PACKET WITH ERRORE#Ÿ MOV R0,-(SP) ;SAVE RETURN STATUSR&  MOV R5,R0 ;GET COPY OF UCB POINTER@¡ ADD #U.TIXL-U.TSTA,R0 ;MAKE POINTER TO U.TIXL (IOPX LISTHEAD)¢980$:7£ MOV R0,R1 ;CURRENT IOPX POINTER BECOMES BACKPOINTERI¤¥ ASSUME I.XLNK,0¦#§ MOV (R1),R0 ;POINT TO NEXT IOPXOB¨ CMP I.XIOP(R0),R3 ;DOES THIS IOPX BELONG TO CURRENT I/O PACKET?-© BNE 980$ ;IF NE,NO...LOOP TILL WE FIND ITDª« ASSUME I.XLNK,0¬'­ MOV (R0),(R1) ;REMOVE IOPX FROM LIST %® MOV R3,-(SP) ;SAVE POINTE00ªÊ€®€±|t÷tø tþfDATAR TO IOPXT#¯ MOV #I.XLEN,R1 ;GET SIZE OF IOPXN ° CALL $DEACB ;DEALLOCATE IOPX*± MOV (SP)+,R3 ;RESTORE POINTER FOR IOFIN;² MOV U.TDIF(R4),R2 ;GET DEFAULT INPUT BUFFER LIST POINTER '³ CALL DELTB ;DEALLOCATE THEM, IF ANYI´#µ MOV (SP)+,R0 ;RESTORE ERROR CODE,¶990$:T·¸ .ENDC ;T$$EIO¹&º CALL IOFIN ;FINISH THE I/O REQUEST'» JMP GRQPKT ;TRY FOR ANOTHER REQUEST.¼ ½ .DSABL LSBI¾.PAGE¿ .SBTTL TTINI SUBROUTINES(BÀ .SBTTL . GRQAC - $GSPKT ACCEPTANCE ROUTINE FOR GET RQST (FPGRQ)Á;Â;+QÃ; **-GRQAC - $GSPKT ACCEPTANCE ROUTINE FOR GETTING A NEW REQUEST PACKET (FPGRQ)RÄ;-Å;TÆGRQAC:@Ç CMP I.UCB(R1),G$$SPA(SP) ;IS THIS PACKET FOR THE CURRENT UCB?È SEC ;ASSUME ERROR+É BNE 10$ ;IF NE, NO...ASSUMPTION CORRECTEÊ ASSUME S2.IRQ,S1.IBYË ASSUME S2.ORQ,S1.OBY;Ì BITB I.PRM+7(R1),U.TSTA(R5) ;CAN WE PROCESS THIS PACKET? 5Í BNE 20$ ;IF NE, NO...SKIP TO CHECK FOR SCAN ABORTTÎMÏ; IF TERMINAL IS IN TERMINAL MANAGEMENT MODE AND THE REQUEST IS AN INTERNALPIÐ; I/O REQUEST, REJECT THIS PACKET. THIS IS A BIT OF A HACK. WHEN TIMEWLÑ; PERMITS, WE COULD USE EVENT PACKETS TO TELL THE NET TO STOP SENDING I/O.Ò;SÓ .IF DF T$$SCA & R$$IIC?Ô@Õ BIT #S5.TMM,U.TST5(R5) ;IS TERMINAL IN TERM. MANAGEMENT MODE?#Ö BEQ 5$ ;IF NOT, SO FAR, SO GOOD 8× BIT #1,I.IOSB+4(R1) ;IF TMM, IS IT ALSO INTERNAL I/O?*Ø BNE 10$ ;REJECT.. SEC STILL FROM ABOVEÙ5$:OÚ .ENDC ;T$$SCA & R$$IICÛÜÝ .IF DF T$$BTWÞß ASSUME S3.FDX,200>à TSTB U.TSTA+4(R5) ;IS THIS A FULL DUPLEX LINE? (CLEAR CC-C),á BMI 10$ ;IF MI, YES...ACCEPT THIS PACKET3â BIT #S1.IBY!S1.OBY,U.TSTA(R5) ;IS ANYTHING BUSY?S,ã BEQ 10$ ;IF EQ, NO...ACCEPT THIS REQUESTä;Lå; THE LINE IS NOT IN FULL DUPLEX MODE, AND EITHER INPUT OR OUTPUT IS BUSY.Oæ; IN THIS CASE, THE ONLY PACKET WE CAN ACCEPT IS IO.WBT. IO.WBT PACKETS HAVE Mç; PRIORITY 251., AND ALL OTHERS HAVE LOWER PRIORITY. IF THIS PACKET IS NOT$Pè; AN IO.WBT, WE KNOW THAT THERE ARE NO IO.WBT'S FURTHER DOWN THE QUEUE EITHER,é; SO WE ABORT THE SCAN.Cê;C?ë CMPB I.PRI(R1),#251. ;IS THIS AN IO.WBT? (CLEAR CC-C IF YES)Y'ì BNE 30$ ;IF NE, NO...ABORT THE SCANí;1î;IMï; DON'T BEGIN AN IO.WBT FUNCTION IF A READ IS ACTIVE THAT SPECIFIED TF.XOF.ALð; THIS IS NECESSARY TO PREVENT A COLLISION BETWEEN THE IO.WBT DATA AND THEñ; XOF CHARACTER OUTPUT.Cò;H9ó BIT #S1.USI,U.TSTA(R5) ;UNSOLICITED INPUT IN PROGRESS?.ô BNE 10$ ;Y - ACCEPT IO.WBTõö .IF DF T$$SPL÷"ø MOV U.TAPR(R5),KDSAR5 ;MAP UCBX ù MOV #120000,R2 ;POINT TO UCBXúû .IFF ;T$$SPL üDý MOV U.TUX(R5),R2 ;GET UCBX (THERE MUST BE ONE SINCE LINE IS BUSY)þÿ .ENDC ;T$$SPLC TSTB U.TISV(R2) ; CHECK IF ^R AFTER IO.WBT IS IN PROGRESS ;LK705A4 BNE 30$ ; YES DO NOT TAKE ANOTHER IO.WBT ;LK7050 MOV @R2,R2 ;GET CURRENT INPUT PACKET ;**-2! BEQ 10$ ;NONE - ACCEPT IO.WBTT< BIT #TF.XOF,I.FCN(R2) ;READ IS ACTIVE - TF.XOF SPECIFIED?: BNE 30$ ;Y - REJECT IO.WBT AND STOP SCAN AT THIS POINT;5&; ACCEPT THE CURRENT REQUEST PACKET. ;T   .IFF ;T$$BTWT 1  CLC ;RETURN WITH CC-C CLEAR TO ACCEPT PACKETE .ENDC ;T$$BTW10$: RETURN ;ALL DONET;IH; IF PACKET REQUIRES BOTH INPUT AND OUTPUT TO BE FREE, ABORT THE SCAN.@; OTHERWISE JUST REJECT THE PACKET BY RETURNING WITH CC-C SET.;  ASSUME S2.ORQ,100 ASSUME S2.IRQ,20020$:@ CMPB I.PRM+7(R1),#S1.IBY!S1.OBY ;ARE BOTH INPUT AND OUTPUT...0 ; ...REQUIRED TO BE FREE FOR THIS REQUEST?8 BLO 10$ ;IF LO, NO...RETURN TO REJECT THIS PACKET.... ; ...CC-C WAS SET BY COMPARE INSTRUCTION;CP; WE FOUND A PACKET THAT REQUIRES BOTH INPUT AND OUTPUT TO BE FREE. ABORT THEL ; SCAN SO THE PACKET WILL GET A CHANCE TO BE DEQUEUED ONCE ALL REQUESTS IN!; FRONT OF IT ARE DONE. ";A#30$:$ ADD #G$$SPA,SP ;FLUSH STACK'% MOV (SP)+,R5 ;RESTORE POINTER TO UCB0,& CLR (SP) ;DON'T CHANGE FLAGS IN U.TSTA+25' JMP NOPKDQ ;FINISH AS THOUGH NO PACKET TO DEQUEUE (.PAGETB) .SBTTL . KILAC - $GSPKT ACCEPTANCE ROUTINE FO00ªÒ€g€Ž{´cÚµcÛ¶c�·c›’R KILL I/O (QPKIL)*;+;+5,; **-KILAC - KILL I/O ACCEPTANCE ROUTINE FOR $GSPKTU-;PL.; "$GSPKT" CALLS THIS ROUTINE WITH AN I/O PACKET TO BE CHECKED AGAINST THE!/; KILL I/O ACCEPTANCE CRITERIA:DF0; 1. THE I/O PACKET UCB ADDRESS MUST MATCH THE I/O KILL REQUEST UCB.F1; 2. THE I/O PACKET TCB ADDRESS MUST MATCH THE I/O KILL REQUEST TCB.F2; 3. IF THE I/O KILL SUBFUNCTION WAS TF.WLB, THE I/O PACKET FUNCTION.3; CODE MUST BE "IO.EIO!TF.WLB" OR "IO.WLB".F4; 4. IF THE I/O KILL SUBFUNCTION WAS TF.RLB, THE I/O PACKET FUNCTIONC5; CODE MUST BE "IO.EIO!TF.RLB", "IO.RLB", "IO.RPR", OR "IO.RTT".$6;" 7; INPUTS:58; R1 => I/O REQUEST PACKET TO BE ACCEPTED/REJECTED. *9; G$$SPA(SP) => UCB OF PACKETS TO ACCEPT):; G$$SPA+2 => I/O KILL REQUEST PACKETL;;U <; OUTPUTS:.)=; CC-C = 0 IF PACKET IS TO BE ACCEPTEDI)>; = 1 IF PACKET IS TO BE REJECTEDL?;U @; REGISTERS MODIFIED: R2, R3A;-B;CD .IF DF R$$IICEFKILAC:@G CMP I.UCB(R1),G$$SPA(SP) ;IS THIS PACKET FOR THE CORRECT UCB?(H BNE 30$ ;IF NE, NO...DON'T ACCEPT IT<I MOV G$$SPA+2(SP),R3 ;GET POINTER TO KILLER REQUEST PACKET7J CMP I.TCB(R1),I.TCB(R3) ;PACKET FOR THE CORRECT TCB?(K BNE 30$ ;IF NE, NO...DON'T ACCEPT IT8L MOVB I.FCN(R3),R3 ;GET KILLER PACKET SUBFUNCTION CODE3M MOVB I.FCN+1(R1),R2 ;GET PACKET SUBFUNCTION CODENO .IF DF T$$EIOP?Q CMPB #IO.EIO/400,R2 ;IS THIS PACKET AN EXTENDED I/O REQUEST?R BNE 5$ ;IF NOT, BRSET;WARNING: THIS ASSUMES THAT IO.RLB/400,TF.RLB AND IO.WLB/400,TF.RLB U@V MOVB I.FCN(R1),R2 ;GET NON-EXTENDED I/O REQUEST FUNCTION CODEW5$:OXY .ENDC ;T$$EIOZ8[ CMPB #IO.RPR/400,R2 ;IS THIS AN OLD-FASHIONED IO.RPR?\ BEQ 10$ ;IF EQ, YES...SKIP9] CMPB #IO.RTT/400,R2 ;IS THIS AN OLD-FASHIONED IO.RTT?F^ BNE 20$ ;IF NE, NO...SKIP1_10$:7` MOVB #TF.RLB,R2 ;MAKE THESE LOOK LIKE STRAIGHT READSCa20$:3b CLC ;ASSUME WE ARE GOING TO ACCEPT THIS PACKET.c BITB R3,R2 ;IS THIS A PACKET TO BE KILLED?#d BNE 40$ ;IF NE, YES...ACCEPT ITBe30$:"f SEC ;DON'T ACCEPT THIS PACKETg40$:h RETURN ;ALL DONEOij .ENDC ;R$$IICkl.PAGEO3m .SBTTL I/O REQUEST PRE-QUEUE PROCESSING ROUTINESD-n .SBTTL . QPKIL - INTERNAL I/O KILL REQUESTPo;.p;+1q; **-QPKIL - INTERNAL I/O KILL REQUEST (IO.KIL)$r; Ks; THIS ROUTINE PROCESSES AN I/O REQUEST WITH A FUNCTION CODE OF ZERO. ANDMt; I/O PACKET WILL ONLY HAVE THIS FUNCTION CODE IF IT IS AN INTERNAL (SYSTEM Mu; STATE) I/O REQUEST. IT PERFORMS FUNCTIONS SIMILAR TO THE DRIVER'S CANCELLv; I/O ENTRY POINT "TTCAN". HOWEVER, IF CAN BE SPECIFIED THAT ONLY READ ORKw; ONLY WRITE REQUESTS ARE TO BE CANCELLED. THIS IS DONE WITH THE REQUESTDNx; MODIFIERS "TF.WLB" AND "TF.RLB". A "$GSPKT" ACCEPTANCE ROUTINE IS USED TOPy; FIND ALL SPECIFIED REQUESTS IN THE SCB QUEUE. AN I/O KILL REQUEST IS ALWAYSPz; PROCESSED AND COMPLETED IMMEDIATELY, SO IT IS NEVER PLACED IN THE SCB QUEUE.{; |; INPUTS:!}; R3 => I/O KILL REQUEST PACKETT~; R4 => SCB FOR THE TERMINAL; R5 => UCB FOR THE TERMINAL€; I.FCN = TF.WLB OR TF.RLB,9�; I.TCB => TCB OF TASK WHOSE REQUESTS ARE TO BE ABORTEDE‚;R ƒ; OUTPUTS:E9„; SPECIFIED I/O REQUESTS ARE ABORTED WITH STATUS IE.ABOA…;F$†; REGISTERS MODIFIED: R0, R1, R2‡;-ˆ;‰Š .IF DF R$$IIC‹ ŒQPKIL::E�Ž .IF DF M$$PRO�1� BIT S.URM(R4),@$CPURM ;ALREADY ON CORRECT CPU?I‘ BNE 5$ ;IF NE YES, CONTINUEH’9“; CONVERT PARAMETER LIST PART OF I/O PACKET INTO A FORKC"”; BLOCK FOR INTERPROCESSOR FORK.•*– ADD #I.PRM+12,R3 ;POINT TO KISAR5 FIELD+— MOV KINAR5,(R3) ;INSERT DRIVER I MAPPINGO&˜ MOV R4,-(R3) ;SAVE R4 IN FORK BLOCK9™ MOV S.URM(R4),-10(R3) ;SET URM OF DEVICE IN FORK BLOCKT0š MOV R3,R4 ;POINT R4 AT FORK BLOCK FOR $FORK1&› CALL $FORK1 ;SWITCH TO CORRECT CPU9œ SUB #I.PRM+4,R3 ;POINT BACK TO BEGINNING OF FORK BLOCK)� CALL MAPD ;RE-MAP DRIVERž5$:Ÿ  .ENDC ; DF M$$PRO¡,¢ MOV R3,-(SP) ;SAVE REQUEST PACKET POINTER)£ MOV R5,-(SP) ;SAVE CURRENT UCB POINTERE0¤ ;**NOTE: THESE A00ªÚ€®€±|t÷tø tþfDATARE SAVED FOR INSPECTION...+¥ ; ...IN THE $GSPKT ACCEPTANCE ROUTINE 9¦ MOV I.TCB(R3),R1 ;GET TCB OF TASK TO KILL REQUESTS FORU>§ MOV I.FCN(R3),R3 ;GET FUNCTION CODE OF THINGS TO KILL IN R3?¨ CALL TTCN1 ;CANCEL SELECTIVE I/O (DEPENDS ON TF.WLB/TF.RLB)R©10$:$ª MOV (SP),R5 ;RESTORE UCB ADDRESS3« MOV #KILAC,R2 ;SET POINTER TO ACCEPTANCE ROUTINE¬ CALL $GSPKT ;GET A PACKETO.­ BCS 20$ ;IF CS, NO MORE PACKETS...ALL DONE3® MOV R1,R3 ;COPY KILLED PACKET ADDRESS FOR IOFIN 4¯ MOV #IE.ABO&377,R0 ;SET REQUEST COMPLETION STATUS*° CALL IOFIN ;FINISH OFF THE I/O REQUEST#± BR 10$ ;LOOK FOR ANOTHER PACKETR²20$:³ TST (SP)+ ;CLEAN STACK<´ MOV (SP)+,R3 ;GET BACK ADDRESS OF I/O KILL REQUEST PACKET*µ MOV #IS.SUC&377,R0 ;SUCCESSFUL I/O KILL¶ JMP IOFIN ;FINISH I/O KILL·¸ .ENDC ;R$$IIC¹º.PAGEE;» .SBTTL . BUFFER ADDRESS CHECKING AND RELOCATION ROUTINESE¼;½;+4¾; **-CKBFR - ADDRESS CHECK BUFFER FOR READ ACCESSG¿; **-CKBFRW - ADDRESS CHECK BUFFER FOR READ ACCESS AND WORD ALIGNMENTT:À; **-CKBFB - ADDRESS CHECK BUFFER FOR READ/WRITE ACCESSÁ;KÂ; THESE ROUTINES PERFORM THE DESCRIBED ADDRESS CHECKING ON A USER BUFFER.VÃ;+ Ä; INPUTS:'Å; R0 => USER BUFFER (VIRTUAL ADDRESS)VÆ; R1 = LENGTH OF USER BUFFERIÇ; È; OUTPUTS:N,É; CC-C = 0 IF ADDRESS CHECK WAS SUCCESSFUL$Ê; CC-C = 1 IF ADDRESS CHECK FAILED6Ë; R0 = ERROR CODE FOR ADDRESS CHECK FAILURE REASON:0Ì; "IE.SPC" IF SPECIFIED BUFFER LENGTH IS ZERODÍ; "IE.SPC" IF BUFFER NOT WORD ALIGNED OR EXEC ADDRESS CHECK FAILS8Î; "IE.BAD" IF BUFFER SIZE IS GREATER THAN 8128. BYTES/Ï; R1 = BIAS OF RELOCATED USER BUFFER ADDRESSC7Ð; R2 = DISPLACEMENT OF RELOCATED USER BUFFER ADDRESS Ñ;BÒ; REGISTERS MODIFIED: R0Ó;-Ô;HÕÖ .IF DF A$$CHK× Ø .ENABL LSB ÙCKBFRW:I0Ú BIT #1,R0 ;DOES BUFFER START ON ODD ADDRESS?6Û BNE 910$ ;IF NE, YES...RETURN INVALID BUFFER ERROR ÜCKBFR::RÝÞ .IF DF R$$MPLß7à MOV #$CKBFR,-(SP) ;SET UP CALL FOR READ-ACCESS CHECKOá BR 10$ ;SKIP TO COMMON CODEEâã .IFTF ;R$$MPLä åCKBFB::Eæç .IFT ;R$$MPL.è8é MOV #$CKBFB,-(SP) ;SET UP CALL FOR WRITE-ACCESS CHECKê10$:ëì .IFTF ;R$$MPLí!î TST R1 ;IS BUFFER SIZE VALID?S5ï BEQ 900$ ;IF EQ, NO...RETURN INVALID BUFFER ERROR8ð CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?7ñ BHI 920$ ;IF HI, YES...RETURN BAD BUFFER SIZE ERRORNòó .IFT ;R$$MPLôõ .IF DF X$$HDRö=÷ MOV (SP),-(SP) ;DUPLICATE MAPPING ROUTINE ADDRESS ON STACKC.ø MOV KISAR6,2(SP) ;SAVE CURRENT EXEC MAPPING-ù MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADER.úû .IFTF ;X$$HDRü5ý CALL @(SP)+ ;CALL REQUESTED ADDRESS CHECK ROUTINEFþÿ .IFT ;X$$HDRT- MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGN .ENDC ;X$$HDR .IFF ;R$$MPL,+ CALL $ACHKB ;DO NORMAL ADDRESS CHECKING  .ENDC ;R$$MPL -  BCS 910$ ;IF CS, IT FAILED...RETURN ERRORP   .IFF ;A$$CHKHCKBRW: CKBFR:: CKBFB::M .IFTF ;A$$CHK; CALL $RELOC ;RELOCATE ADDRESS AND CONVERT TO DOUBLEWORDV RETURN ;ALL DONER .IFT ;A$$CHK900$:H8 .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS910$: C MOV #IE.SPC&377,R0 ;SET COMPLETION ERROR CODE FOR INVALID BUFFER.  BR 990$ ;SKIP!920$:$"8# .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS$=% MOV #IE.BAD&377,R0 ;SET COMPLETION ERROR CODE FOR BAD SIZE&990$:F ' SEC ;RETURN WITH ERROR FLAG( RETURN ;ALL DONE.) * .DSABL LSB+, .ENDC ;A$$CHK-..PAGE A/ .SBTTL . TSTRQ - CHECK I/O REQUEST QUEUE FOR PACKET TO DEQUEUE0;1;+&2; SUBROUTINE TSTRQ - TEST I/O QUEUE.3; 4; INPUT:5; R5 POINTER TO U.TSTA6;E 7; OUTPUT:S<8; IF THERE IS (POTENTIALLY) A PACKET IN THE I/O QUEUE THAT9; CAN BE PROCESSED:I@:; RETURN TO CALLER WITH R3 = MASK OF BITS TO CLEAR IN U.TSTA+2";; IF NO PACKET COULD BE DEQUEUED<;R =; IF NOT:>; RETURN TO CALLER'S CALLER.?;L@; REGISTERS ALTERED: R3A;-B;B CTSTRQ::/D MOV (00ªâ€g€Ž{´cÚµcÛ¶c�·c›’R5),R3 ;GET FIRST TERMINAL STATUS WORD E COM R3 ;INVERT ITUCF BIC #^C,R3 ;CLEAR ALL TO SEE WHAT CAN BE DEQUEUED 1G BIS #S2.SRQ,R3 ;OR WITH "SPECIAL REQUEST" FLAG<H BIT R3,2(R5) ;IS ANYTHING IN QUEUE THAT CAN BE PROCESSED?8I BEQ 10$ ;IF EQ, NO...POP OUR WAY OUT OF THIS ROUTINECJ BIT #S2.BRQ,2(R5) ;IS THERE A "BREAKTHROUGH WRITE" IN THE QUEUE?C6K BNE 20$ ;IF NE, YES...IT CAN POSSIBLY BE PROCESSEDLM ASSUME S3.FDX,200N+O TSTB 4(R5) ;USER ON A FULL DUPLEX LINE?M6P BMI 20$ ;IF MI, YES...IT CAN POSSIBLY BE PROCESSED9Q BIT #S1.IBY!S1.OBY,(R5) ;IS ANYTHING BUSY ON THE LINE?E4R BEQ 20$ ;IF EQ, NO...RETURN TO PROCESS A REQUESTS10$:=T TST (SP)+ ;POP RETURN ADDRESS SO WE WON'T PROCESS REQUEST U20$:V RETURN ;ALL DONE WXY.PAGEOZ .PSECT MAP5.6[$\ .SBTTL . WRITE REQUEST PROCESSING'] .SBTTL . QPWSB - WRITE SPECIAL DATA ^;E_;+*`; **-QPWSD - WRITE SPECIAL DATA (IO.WSD)a;-b;0cd .IF DF B$$MAPe fQPWSD::D;g BIC #^C,I.FCN(R3) ;CLEAR DISALLOWED BITSO*h BIS #TF.WAL,I.FCN(R3) ;SET REQUIRED BIT>i CMP #T.RSDN,I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?'j BHIS QPWLB1 ;IF HIS, YES...CONTINUER8k BR EQPBAD ;ELSE, RETURN REQUEST WITH BAD PARAMENTERSlm .ENDC ;B$$MAPn(o .SBTTL . QPWLB - WRITE LOGICAL BLOCKp;Tq;+,r; **-QPWLB - NORMAL WRITE REQUEST (IO.WLB)s;-t; uQPWLB::vw .IF DF T$$CUPxBy MOV I.PRM+6(R3),I.PRM+10(R3) ;SAVE VFC/CURSOR-CONTROL FOR LATERz{ .ENDC ;T$$CUP| }QPWLB1:;9~ MOV #S2.ORQ,R4 ;A WRITE MUST BLOCK IF OUTPUT IS ACTIVER€ .IF DF T$$BTW�@‚ BITB #TF.WBT,I.FCN(R3) ;IS THIS A BREAKTHROUGH WRITE REQUEST?<ƒ BEQ CKBFLN ;IF EQ, NO...CHECK BUFFER LENGTH AND QUEUE IT„… .IF DF M$$MUP†*‡ MOV I.TCB(R3),R0 ;GET ISSUEING TASK TCB=ˆ BIT #T3.PRV!T3.CLI,T.ST3(R0) ;IS TASK PRIVILEGED OR A CLI? 2ˆ BNE 10$ ;IF NE, YES...DO BREAKTHROUGH ;SA4607ˆ CMP T.UCB(R0),R5 ;IS THE IO.WBT TO OWN TI:? ;SA460C0ˆ BNE EQPPRI ;IF NOT, DON'T ALLOW IT ;SA460ˆ10$: ;SA460Š ;**-1 ‹ .ENDC ;M$$MUPŒ8� MOVB #251.,I.PRI(R3) ;CHANGE REQUEST TO PRIORITY 251.?Ž BIS #TF.CCO,I.FCN(R3) ;BREAKTHROUGH IMPLIES CANCEL CONTROL-OC�F� MOV #S2.ORQ!S2.BRQ,R4 ;FLAG BREAKTHROUGH REQUEST AND WAIT FOR WRITE‘’ .ENDC ;T$$BTW“8” BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST•.PAGEE#– .SBTTL . READ REQUEST PROCESSING &— .SBTTL . QPRSD - READ SPECIAL DATA˜; ™;+1š; **-QPRSD - READ SPECIAL DATA REQUEST (IO.RSD)T›;-œ;� .IF DF B$$MAPž ŸQPRSD:: :  BIC #^C,I.FCN(R3) ;CLEAR DISALLOWED BITS6¡ BIS #,I.FCN(R3) ;FORCE REQUIRED BITS6¢ TST I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?3£ BEQ EQPBAD ;ZERO IS NOT ALLOWED, BAD PARAMETERSW>¤ CMP #T.RSDN,I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?>¥ BHIS CKBFLN ;IF HIS, YES...FINISH CHECKS AND QUEUE REQUEST¦ BR EQPBAD ;BAD PARAMETERSR§¨ .ENDC ;B$$MAP©&ª .SBTTL . QPRPR - READ AFTER PROMPT«;(¬;+1­; **-QPRPR - READ AFTER PROMPT REQUEST (IO.RPR)®;-¯;. ° .ENABL LSBC±² .IF DF T$$RPR³ ´QPRPR::#<µ MOV I.PRM+10(R3),R0 ;GET VIRTUAL ADDRESS OF PROMPT BUFFER.¶ MOV I.PRM+12(R3),R1 ;GET PROMPT BUFFER SIZEE· MOV #S2.IRQ!S2.ORQ,R4 ;PROMPT MUST BLOCK IF INPUT OR OUTPUT ACTIVE(<¸ CALL CKBFR ;CHECK READ ACCESS AND RELOCATE PROMPT BUFFER;¹ BCC 10$ ;IF CC, OK...GO STORE ADDRESS AND QUEUE REQUESTP<º BR IOFIN ;CHECK FAILED...COMPLETE REQUEST WITH THE ERROR»¼ .ENDC ;T$$RPR½/¾ .SBTTL . QPRTT - READ WITH TERMINATOR TABLER¿;À;+:Á; **-QPRTT - READ WITH TERMINATOR TABLE REQUEST (IO.RTT)Â;-Ã;1 ÄQPRTT::E@Å MOV #S2.IRQ,R4 ;READ W/TERMINATORS MUST BLOCK IF INPUT ACTIVEÆHÇ; BIT #TF.PTT,I.FCN(R3) ;WANT TO USE PREVIOUSLY SPECIFIED TERM. TABLE?=È; BNE CKBFLN ;IF NE, YES...DON'T BOTHER CHECKING PARAMETERP7É MOV I.PRM+10(R3),R0 ;GET ADDRESS OF TERMINATOR TABLEU6Ê MOV #32.,R1 ;LENGTH OF TABLE IS FIXED AT 32. BYTESË=Ì CALL CKBFRW ;CHECK READ AC00ªê€®€±|t÷tø tþfDATACESS AND RELOCATE TABLE ADDRESSR:Í BCS IOFIN ;IF CS, CHECK FAILED...RETURN WITH THE ERRORÎ10$:>Ï MOV R1,I.PRM+10(R3) ;SAVE FIRST WORD OF ADDRESS DOUBLE WORD?Ð MOV R2,I.PRM+16(R3) ;SAVE SECOND WORD OF ADDRESS DOUBLE WORD 8Ñ BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUESTÒ Ó .DSABL LSB Ô'Õ .SBTTL . QPRLB - READ LOGICAL BLOCKAÖ;E×;++Ø; **-QPRLB - NORMAL READ REQUEST (IO.RLB)OÙ;-Ú; ÛQPRLB::18Ü MOV #S2.IRQ,R4 ;NORMAL READ MUST WAIT FOR ACTIVE READ8Ý BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUESTÞ.PAGEIß .SBTTL . ERROR HANDLINGà;T.á; EQPPRI - RETURN PRIVILEGE VIOLATION ERROR.â;W ãEQPPRI:E=ä MOV #IE.PRI&377,R0 ;SET ERROR CODE FOR PRIVILEGE VIOLATIONR=å BR IOFIN ;FINISH I/O REQUEST (NO NEED TO RESTORE MAPPING)Tæ;Q-ç; EQPBAD - RETURN ERROR FOR BAD PARAMETERS.Bè;A éEQPBAD::<ê MOV #IE.BAD&377,R0 ;SET ERROR FOR BAD PARAMETER SPECIFIEDëì .IF DF A$$CHKí7î BR EQPFIN ;FINISH REQUEST (REMAP DRIVER ON THE WAY)ï; Bð; EQPSPC - RETURN ERROR BECAUSE OF INVALID BUFFER SPECIFICATION.ñ; òEQPSPC:IAó MOV #IE.SPC&377,R0 ;SET ERROR FOR ILLEGAL BUFFER SPECIFICATIONQ:ô; BR EQPFIN ;RETURN THE ERROR (REMAP DRIVER ON THE WAY)õö .ENDC ;A$$CHK÷ øEQPFIN::ùú .IF DF T$$EIOû,ü MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPINGýþ .ENDC ;T$$EIOÿ IOFIN::% CLR R1 ;CLEAR SECOND WORD OF IOSBD& CALLR $IOFIN ;FINISH IO AND RETURN.PAGE. .SBTTL . CKBFLN - FINAL BUFFER LENGTH CHECK;?; CKBFLN - CHECK THAT BUFFER LENGTH IS WITHIN (1,8K-64) BYTESF;O CKBFLN:   .IF DF A$$CHK 5  MOV I.PRM+4(R3),R1 ;GET LENGTH OF TRANSFER REQUEST 6  BEQ EQPSPC ;IF EQ, RETURN ZERO BUFFER LENGTH ERROR8 CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?7 BHI EQPBAD ;IF HI, BUFFER IS TOO BIG...RETURN ERROR .ENDC ;A$$CHK> .SBTTL QUEUE - PLACE I/O REQUEST PACKET INTO TERMINAL QUEUE;HA; R4 NOW CONTAINS FLAGS TO BE USED BY THE ACCEPTANCE ROUTINE FOC@; GETTING PACKETS FROM THE QUEUE VIA $GSPKT. SAVE THE FLAGS IN; I.PRM+7 OF THE I/O PACKET.;. QUEUE::K= ADD #U.TSTA,R5 ;POINT UCB POINTER TO THE FIRST STATUS WORD .IF DF T$$ACD8 MOV #UA.ALL,U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING# MOV U.ACB-U.TSTA(R5),R0 ;GET ACBP!  BEQ 10$ ;THERE IS NONE - JUMPT)! MOVB I.FCN+1(R3),R1 ;GET FUNCTION CODEB#" ASL R1 ;CONVERT TO A WORD INDEXI3# CMPB R1,#30. ;FUNCTION CODE IN FIRST MASK WORD?O$ BLOS 5$ ;Y - JUMPN9% TST (R0)+ ;BUMP ACB POINTER TO CHECK SECOND MASK WORDK%& SUB #32.,R1 ;REDUCE FUNCTION CODEEG'5$: BIT $BTMSK(R1),A.MAS(R0) ;IS THE ACD INTERESTED IN THIS FUNCTION?H( BEQ 10$ ;N - JUMP@) MOV #A.ACCE,R0 ;Y - SET TO I/O REQUEST ACCEPTANCE ENTRY POINT* CALL $SWACD ;CALL ACDB9+ BIT #UA.ALL,U.AFLG-U.TSTA(R5) ;ALLOW THIS I/O REQUEST?T, BNE 10$ ;Y - JUMP1,- SUB #U.TSTA,R5 ;POINT TO BEGINNING OF UCB. MOV U.ACB(R5),R0 ;GET ACB9/ MOV A.IOS(R0),R0 ;GET I/O ERROR CODE TO RETURN TO TASKN0 BR IOFIN ;FINISH I/O110$:23 .ENDC ;T$$ACD405 ASSUME ,006 MOVB R4,I.PRM+7(R3) ;SAVE FLAGS IN I/O PACKET'7 BNE 20$ ;PACKET CANNOT BE PROCESSED8 ;IMMEDIATELY - JUMP 9: .IF DF T$$GTS!T$$GMCP;>< CMPB #IO.HNG/256.,I.FCN+1(R3) ;IS THIS HANGUP OR GET CHAR.?(= BEQ 15$ ;IF EQ, IT'S A HANG - BRANCH>? .IF DF T$$OVL@2A MOV #PPSPC1,R1 ;GET ADDRESS OF ROUTINE IN TTEXT#B CALLR MPEXT ;MAP IT AND CALL ITRCD .IFF ;T$$OVLTE%F CALLR PPSPC1 ;PROCESS IMMEDIATELYGH .ENDC ;T$$OVLI15$:J .ENDC ;T$$GTS!T$$GMC2KL .IF DF T$$OVLM1N MOV #PPHNG,R1 ;GET ADDRESS OF ROUTINE IN TTEXT #O CALLR MPEXT ;MAP IT AND CALL ITIPQ .IFF ;T$$OVLR$S CALLR PPHNG ;PROCESS IMMEDIATELYTU .ENDC ;T$$OVLVW20$:EX BICB #S2.SRQ!S2.BRQ,I.PRM+7(R3) ;CLEAR SRQ AND BRQ FLAGS IN PACKETF2Y MOV U.SCB-U.TSTA(R5),R0 ;GET I/O QUEUE LISTHEAD!Z MOV R3,R1 ;GET PACKET POINTERP[ CALL $QINSP ;INSERT PACKET=\ BIT #S2.SRQ,R4 ;SPECIAL FUNCTION (IO.ATT, IO.00ªò€g€Ž{´cÚµcÛ¶c�·c›’DET, IO.SMC)?C] BEQ 30$ ;N - JUMPN+^ MOV #S2.SRQ,R4 ;Y - CLEAR ALL OTHER BITS_30$:/` BISB R4,2(R5) ;SET FLAGS TO INDICATE WHAT WELa ;PUT IN THE QUEUEL)b ;NOTE - MUST BE DONE A F T E R WEH c ;PUT PACKET IN THE QUEUE!!de .IF DF M$$PROf%g MOV #FR.GRQ,R3 ;COME BACK AT FPGRQA%h CALL SWCPU ;SWITCH TO CORRECT CPUUi;U;j; IF WE FALL THRU HERE, WE ARE ALREADY ON THE CORRECT CPUEk;Nlm .ENDC ;M$$PROn)o CALL SETDSI ;DISABLE INPUT PROCESSINGTp.q FRKBIT BIS,#FR.GRQ ;POST "GET REQUEST" FORK0r RETURN ;LET SETDSI DISPATCH IT. THAT'S WHATs ;IT GETS PAID FOR.tu.PAGEI0v .SBTTL . QPATT/QPDET - ATTACH/DETACH REQUESTSw; x;+/y; **-QPATT - ATTACH TERMINAL REQUEST (IO.ATT)E/z; **-QPDET - DETACH TERMINAL REQUEST (IO.DET)Q{;CM|; ENTRY POINT "QPATT" PERFORMS UNSOLICITED INPUT AST ADDRESS ADJUSTMENT FORLO}; SUPERVISOR MODE LIBRARIES (IF SUPPORTED) AND THEN FALLS THROUGH TO "QPDET".N~; FROM QPDET, CONTROL IS TRANSFERRED TO THE PACKET QUEUEING ROUTINE WITH THED; DEQUEUE BLOCKING FLAGS SET TO CHECK FOR ACTIVE INPUT AND OUTPUT.€;E �; INPUTS:.‚; R3 => I/O PACKET FOR ATTACH/DETACH REQUESTƒ; R5 => UCB FOR THE TERMINAL„;A …; OUTPUTS:M!†; R3 => I/O PACKET TO BE QUEUEDT(‡; R4 = REQUEST DEQUEUE BLOCKING FLAGSˆ; $‰; REGISTERS MODIFIED: R0, R1, R2Š;-‹;T ŒQPATT::J�Ž .IF DF S$$LIB�<� BITB #TF.AST,I.FCN(R3) ;ATTACH FOR UNSOLICITED INPUT AST?‘ BEQ QPDET ;IF EQ NOO2’ MOV I.PRM(R3),R2 ;GET ALL CHARACTER AST ADDRESS+“ CALL $CALTA ;ADJUST FOR SUPER/USER MODEH$” MOV R2,I.PRM(R3) ;AND PUT IT BACK0• MOV I.PRM+4(R3),R2 ;GET CONTROL C AST ADDRESS+– CALL $CALTA ;ADJUST FOR SUPER/USER MODE&— MOV R2,I.PRM+4(R3) ;AND PUT IT BACK˜™ .ENDC ;S$$LIBš ›QPDET::EDœ MOV #S2.IRQ!S2.ORQ!S2.SRQ,R4 ;BLOCK REQUEST IF EITHER INPUT OR...5� ; ...OUTPUT ACTIVE AND MARK AS SPECIAL FUNCTIONT'ž JMP QUEUE ;QUEUE UP THE REQUEST NOWNŸ.PAGE&  .SBTTL . QPSPC - "SPECIAL" REQUESTS¡; ¢;+?£; **-QPSPC - HANDLE "SPECIAL" REQUESTS (IO.GTS/SF.GMC/SF.SMC)M¤;I¥; THIS ROUTINE CHECKS PARAMETERS FOR THE "GET TERMINAL SUPPORT" AND THEAL¦; "GET/SET MULTIPLE CHARACTERISTICS" FUNCTIONS. THE USER BUFFER FOR THESEK§; REQUESTS MUST BE WORD-ALIGNED. THE IO.GTS AND SF.GMC FUNCTIONS WILL BERN¨; PASSED TO "QUEUE" WITH NO DEQUEUE BLOCKING FLAGS SET. THIS ALLOWS THEM TOL©; BE PROCESSED SYNCHRONOUSLY (NEVER QUEUED). AN SF.SMC FUNCTION MUST WAITIª; FOR ACTIVE INPUT AND OUTPUT REQUESTS TO FINISH BEFORE BEING DEQUEUED.S«;L ¬; INPUTS:$­; R3 => I/O PACKET FOR THE REQUEST®; R5 => UCB FOR THE TERMINAL¯; °; OUTPUTS:T!±; R3 => I/O PACKET TO BE QUEUEDH(²; R4 = REQUEST DEQUEUE BLOCKING FLAGS³;T$´; REGISTERS MODIFIED: R0, R1, R2µ;-¶;G·¸ .IF DF T$$GTS!T$$GMC!T$$SMC¹ ºQPSPC::E»¼ .IF DF T$$GTS!T$$GMCF½9¾ CLR R4 ;ASSUME REQUEST IS IO.GTS OR SF.GMC - IF SO...(5¿ ; ...IT IS PROCESSED SYNCHRONOUSLY (NOT QUEUED)CÀÁ .ENDC ;T$$GTS!T$$GMCSÂà .IF DF T$$GTSÄGÅ CMP I.FCN(R3),#IO.GTS ;IO.GTS? ;GET TERMINAL DRIVER SUPPORT REQUEST?5ÆÇ .IF DF T$$GMC!T$$SMC È0É BEQ 20$ ;IF EQ, YES...CHECK BUFFER ALIGNMENTÊË .IFF ;T$$GMC!T$$SMCÌ9Í BNE EQPIFC ;IF NE, NO...RETURN ILLEGAL FUNCTION ERRORÎÏ .ENDC ;T$$GMC!T$$SMC$ÐÑ .ENDC ;T$$GTSÒÓ .IF DF T$$GMCÔ?Õ CMP I.FCN(R3),#SF.GMC ;GET MULTIPLE CHARACTERISTICS REQUEST? Ö× .IF DF T$$SMCØ0Ù BEQ 20$ ;IF EQ, YES...CHECK BUFFER ALIGNMENTÚÛ .IFF ;T$$SMCÜ9Ý BNE EQPIFC ;IF NE, NO...RETURN ILLEGAL FUNCTION ERRORRÞß .ENDC ;T$$SMCàá .ENDC ;T$$GMCâã .IF DF T$$SMCä?å CMP I.FCN(R3),#SF.SMC ;SET MULTIPLE CHARACTERISTICS REQUEST?!9æ BNE EQPIFC ;IF NE, NO...RETURN ILLEGAL FUNCTION ERRORT+ç MOV I.TCB(R3),R0 ;GET ISSUING TASK'S TCB.è CMP T.UCB(R0),R5 ;IS THIS TERMINAL HIS TI:?*é BEQ 10$ ;IF EQ, YES...REQUEST IS LEGAL1ê BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVILEGED?2ë BNE 10$ ;IF NE YES, OK7ì JMP J2EQPR ;IF EQ, NO...CAN'T ALLOW US00ªú€®€±|t÷tø tþfDATAER TO DO THISFí10$:Eî MOV #S2.IRQ!S2.ORQ!S2.SRQ,R4 ;SF.SMC MUST BLOCK IF INPUT OR OUTPUT$6ï ; ...IS ACTIVE. ALSO FLAG AS "SPECIAL" FUNCTIONðñ .ENDC ;T$$SMCòó20$:ôõ .IF DF A$$CHKö,÷ MOV I.PRM+2(R3),-(SP) ;GET BUFFER ADDRESS2ø BIS I.PRM+4(R3),(SP) ;"OR" IN THE BUFFER LENGTH7ù ROR (SP)+ ;IS EITHER THE ADDRESS OR THE LENGTH ODD? 1ú BCC 30$ ;IF CC, BUFFER IS WORD-ALIGNED...SKIPS8û JMP EQPSPC ;RETURN ERROR FOR BUFFER NOT WORD-ALIGNEDü30$:ýþ .ENDC ;A$$CHKÿ? JMP CKBFLN ;CHECK FOR VALID BUFFER LENGTH AND QUEUE REQUEST  .ENDC ;T$$GTS!T$$GMC!T$$SMC; O; EQPIFC - RETURN AN ERROR DUE TO ILLEGAL FUNCTION CODE OR INVALID MODIFIERS.;D% .IF DF T$$GTS!T$$GMC!T$$SMC!T$$EIO   EQPIFC::F  MOV #IE.IFC&377,R0 ;SET ERROR FOR ILLEGAL FUNCTION CODE OR MODIFIER=  JMP EQPFIN ;FINISH OFF THE REQUEST (RESTORE MAPPING ALSO)R % .ENDC ;T$$GTS!T$$GMC!T$$SMC!T$$EIOE.PAGER .PSECT MAP5" .SBTTL . QPHNG - HANGUP REQUEST;;+&; **-QPHNG - HANGUP REQUEST (IO.HNG);UQ; THIS ROUTINE CHECKS AN IO.HNG REQUEST. A NON-PRIVILEGED TASK CAN HANG ;SA460RT; UP ONLY ITS "TI:" LINE. PRIVILEGED TASKS CAN HANG UP ANY LINE. A HANGUP ;SA460U; REQUEST, LIKE AN IO.WBT OR GET CHARACTERISTICS, BREAKS THROUGH THE QUEUE. ;SA460O; ;**-3 ; INPUTS:$; R3 => I/O PACKET FOR THE REQUEST; R5 => UCB FOR THE TERMINAL;M ; OUTPUTS:E!!; R3 => I/O PACKET TO BE QUEUED("; R4 = REQUEST DEQUEUE BLOCKING FLAGS#;$; REGISTERS MODIFIED: R0%;-&; 'QPHNG::S/' CALL PREQUE ;SET UP FOR QUEUEING ;TMS051G.' CLR R4 ;IO.HNG WAITS FOR NOTHING ;TMS051+' JMP QUEUE ;QUEUE THE REQUEST ;TMS051 ' ;TMS051 ' .IF DF T$$LTH ;TMS051A' ;TMS051TF' .SBTTL . QPORG - INITIATE A CONNECTION TO A TERMINAL SERVER ;TMS051'; ;TMS051';+ ;TMS051 6'; **-QPORG - ORIGINATE REQUEST (IO.ORG) ;TMS051'; ;TMS0518'; THIS ROUTINE CHECKS AN IO.ORG REQUEST. ;TMS051'; ;TMS051'; INPUTS: ;TMS0510'; R3 => I/O PACKET FOR THE REQUEST ;TMS051+'; R5 => UCB FOR THE TERMINAL ;TMS051E'; ;TMS051'; OUTPUTS: ;TMS051 .'; R3 => I/O PACKET TO BE QUEUED ;TMS0514'; R4 = REQUEST DEQUEUE BLOCKING FLAGS ;TMS051'; ;TMS051*'; REGISTERS MODIFIED: R0 ;TMS051';- ;TMS051O'; ;TMS051'QPORG:: ;TMS051/' CALL PREQUE ;SET UP FOR QUEUEING ;TMS051UH' MOV #S2.IRQ!S2.ORQ,R4 ;ORIGINATE MUST WAIT FOR READ AND WRITE ;TMS051+' JMP QUEUE ;QUEUE THE REQUEST ;TMS0511' ;TMS051H' .ENDC ;T$$LTH ;TMS051 ' ;TMS051T'PREQUE: ;TMS0514) MOV I.TCB(R3),R0 ;GET ISSUING TASK'S TCB ;**-1.* CMP T.UCB(R0),R5 ;IS THIS TERMINAL HIS TI:?,+ BEQ J2QUE ;IF EQ, YES...ALLOW THE HANGUP1, BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVILEGED? <- BEQ J2EQPR ;IF EQ, NO...RETURN PRIVILEGE VIOLATION ERROR.J2QUE:/ .IF DF M$$PRO0$1 MOV U.SCB(R5),R4 ;GET SCB ADDRESS12 BIT S.URM(R4),@$CPURM ;ALREADY ON CORRECT CPU?T32 BEQ 5$ ;IF EQ NO, FORK TO CORRECT CPU ; BM380C2 ; BM3805"2 .IFTF ; DF M$$PRO ; BM3802 ; BM380M2 RETURN ; BM380G2 ; BM380!2 .IFT ; DF M$$PRO ; BM380A2 ; BM380QH2; CONVERT PARAMETER LIST PART OF I/O PACKET INTO A FORK BLOCK ; BM380I2; (AND THE RETURN ADDRESS) FOR INTERPROCESSOR FORK. SINCE THIS ; BM380K2; IS A SUBROUTINE, WE MUST REMEMBER CALLER ADDRESS IN FORK BLOCK ; BM380S72; OR THE INTERPROCESSOR FORK DOES NOTHING. ; BM380F2; ; BM380F25$: ADD #I.PRM+14,R3 ;POINT PAST KISAR5 FIELD IN FORK BLOCK ; BM38042 MOV (SP)+,(R3) ;REMEMBER RETURN ADDRESS ; BM380D2 MOV KINAR5,-(R3) ;INSERT DRIVER I MAPPING IN KISAR5 FIELD ; BM380.: CLR -(R3) ;CLEAR R4 IN FORK BLOCK ;**-79; MOV S.URM(R4),-10(R3) ;SET URM OF DEVICE IN FORK BLOCKR0< MOV R3,R4 ;POINT R4 AT FORK BLOCK FOR $FORK1&= CALL $F00ª�«�Ž{´cÚµcÛ¶c�·c›’ORK1 ;SWITCH TO CORRECT CPU9> SUB #I.PRM+4,R3 ;POINT BACK TO BEGINNING OF FORK BLOCKC? CALL MAPD ;RE-MAP DRIVER;? JMP @I.PRM+14(R3) ;DISPATCH TO ORIGINAL CALLER ; BM380AA ;**-1FB .ENDC ; DF M$$PROCFJ2EQPR: ;**-25F TST (SP)+ ;POP RETURN ADDRESS OFF STACK ;TMS060R0G JMP EQPPRI ;RETURN PRIVILEGE VIOLATION ERRORHI .ENDFORK BLOCK ;**-79; MOV S.URM(R4),-10(R3) ;SET URM OF DEVICE IN FORK BLOCKR0< MOV R3,R4 ;POINT R4 AT FORK BLOCK FOR $FORK1&= CALL $F .TITLE TTTBL7 .IDENT /06.01/ ; 8; COPYRIGHT (c) 1987 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.; >; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ;  ; 08-MAY-78 PETER WANNHEDEN  ;O ; PREVIOUSLY MODIFIED BY:F;M; C. F. SPITZ ; D. R. DONCHINO ; T. LEKAS; S. C. ADAMS ;$; MODIFICATIONS:; ; S. C. ADAMS 3-JAN-86 6.00 7; SA452 -- ADD SUPPORT FOR USER-WRITTEN PORT DRIVER ;1"; K. L. FELDMANN 26-MAR-86 06.01A; KLF009 -- TEST FOR CONTROLLER ERROR BEFORE DEALLOCATING UCBX ;S#$ .PSECT MAP5%;R&;+3'; THIS MODULE CONTAINS THE DRIVER DISPATCH TABLE.EA(; IN A SYSTEM THAT SUPPORTS KERNEL DATA SPACE, THIS MODULE MUSTA)); BE BUILT INTO THE TASK IMAGE "TTDRV".FD*; THIS IS IN CONTRAST TO ALL OTHER DRIVER DATA, WHICH IS CONTAINEDC+; IN THE MODULE "TTDAT" AND IS BUILT INTO THE TASK IMAGE "TTCOM". ,;--;2.;D/; DRIVER DISPATCH TABLEP0;R1 .IF DF B$$MAP2=3 .IIF NDF,T$$SPC,.ERROR ;ASSUME THAT THERE IS NO SECONDARYE*4 ;POOL BUFFERS FOR BITMAP SYSTEMS.)5 ;FOR NOW THERE IS NO SUPPORT FORO"6 ;I/D SPACE BITMAP SYSTEMS728 .WORD R$OUTD ;OUTPUT COMPLETION ROUTINE FOR CT$9 .WORD G$IN ;INPUT ROUTINE FOR CT:; .ENDC ;B$$MAP<= .IF DF T$$SPC>9? .WORD NXTCMD ;ROUTINE TO PROCESS THE NEXT CLI COMMANDT@A .ENDC ;T$$SPCB/C .WORD DELTB0 ;ROUTINE TO DEALLOCATE BUFFERSV)D$TTTBL::.WORD TTINI ;REQUEST INITIATORE .WORD TTCAN ;CANCEL I/O >F .WORD $NLTMO ;TIME-OUT - USE SPECIAL NULL TIME-OUT ROUTINEGH .IF DF R$$CONI'J .WORD TTPWFL ;POWERFAIL ENTRY POINT .K .WORD TTKRB ;KRB STATUS CHANGE ENTRY POINT.L .WORD TTUCB ;UCB STATUS CHANGE ENTRY POINTMN .IFFOOP .WORD TTPWUP ;POWER-UPQR .IF DF B$$MAPS5T .WORD FORVMR,FORVMR ;VMR REQUIRES THAT THESE WORDSO%U ;BE HERE AND THAT THEY POINT TOO#V ;TO AN ADDRESS IN THE DRIVER.F#W ;THIS IS BECAUSE VMR DOES NOT X ;BELIEVE IN M-PLUS SYSTEMS&Y ;WITHOUT RECONFIGURATION SUPPORTZ[ .ENDC ;B$$MAP\]^ .ENDC_`a .IF DF R$$MPLbcMc .IIF DF B$$MAP .IRP X, ;SA452OWe ;**-1Ne .IIF NDF B$$MAP .IRP X, ;SA452Wg ;**-1 hi .IF IDN X,LHOjk .IF DF T$$LTHlm .ASCII /LH/n .WORD $LHDEVI o .WORD 0pLHCTBP::.WORD 0;qr .ENDC ; T$$LTHCsXs ;SA452Os .ENDC ; IDN X,LH ;SA452 Xs ;SA452Qs .IF IDN X,US ;SA452 Ps .IF DF T$$USP ;SA452Xs ;SA452Ps .ASCII /US/ ;SA452Os .WORD $USINP ;SA4525Os .WORD $USOUT ;SA452 Os .WORD 0 ;SA452 VsUSCTBP::.WORD 0 00« �®€±|t÷tø tþfDATA ;SA452Xs ;SA452Os .ENDC ; T$$USP ;SA452 Os .ENDC ; IDN X,US ;SA452;Xs ;SA452Is .IF DIF X,LH ;SA452AIs .IF DIF X,US ;SA452 Xs ;SA452Wu ;**-1 v .IF DF D$$'X'11wx .ASCII /Y'X'/yz .IF IDN X,M{| .WORD $DM11B;}~ .IFF € .WORD $Y'X'INP � .WORD $Y'X'OUT ‚ƒ .ENDC„ … .WORD 0†‡ .IF IDN X,Mˆ‰ .IF NDF T$$COM Š ‹YMCP1:: Œ� .ENDC ;NDF T$$COMŽ� .ENDC ;IDN X,M �‘Y'X'CTBP::.WORD 0 ’“ .ENDC”O” .ENDC ; DIF X,US ;SA452 O” .ENDC ; DIF X,LH ;SA452 X” ;SA452W– ;**-1— .ENDR˜ ™$TTTBE::.WORD 0 ;END OF TABLEš;$›;œ� .IF DF T$$COMž+Ÿ; POINTER TO PCB FOR COMMON BLOCK "TTCOM" ;T*¡$TTCOM::.BLKW 1 ;TO BE FILLED IN BY VMR/¢ ;CLEARED BY DRIVER INITIALIZATION ROUTINE £¤ .ENDC ;T$$COM¥¦§ .IFF ;R$$MPL ¨7©$NLTMO::CLR S$$SPC+2(SP) ;FORCE $SCDVT ON TO NEXT DCB 8ª INCB S.CTM(R4) ;RESET TIMEOUT COUNT FOR THE NEXT TIME « RETURN ; ¬­ .ENDC ;R$$MPL®¯ .IF DF R$$CON°9±TTPWFL::MOV KINAR6,-(SP) ;SAVE KERNEL INSTRUCTION APR 6%² BCC 20$ ;BRANCH ON UNIT POWERFAIL7³ MOV #CT.CPW,R4 ;GET CONTROLLER POWERFAIL OFFSET CODER0´ BR TTDSP ;GO TO COMMON CONTROLLER DISPATCHER6µ20$: ADD #U.TSTA,R5 ;POINT TO UCB STATUS TRIPLE-WORD¶· .IF DF T$$ACD¸8¹ TST U.ACB-U.TSTA(R5) ;DOES THIS TERMINAL HAVE AN ACD?º BEQ 30$ ;N - JUMPD,» MOV #A.POWE,R0 ;SET POWERFAIL ENTRY POINT¼ CALL $SWACD ;CALL ACDI½¾ .ENDC ;T$$ACD¿5À30$: MOV #CT.UPW,R2 ;GET UNIT POWERFAIL OFFSET CODE *Á BR TTCRD ;GO TO UNIT DEPENDENT ROUTINEÂ9ÃTTKRB:: MOV KINAR6,-(SP) ;SAVE KERNEL INSTRUCTION APR 6T)Ä BCS 20$ ;BRANCH IF CONTROLLER OFFLINETÅÆ .IF DF T$$COMÇ%È TST $TTCOM ;GET TTCOM PCB ADDRESSP'É BEQ 10$ ;ALREADY INITIALIZED - JUMPFÊË .IFF ;T$$COMTÌ"Í TST $DALED ;GET KISAR6 MAPPING'Î BNE 10$ ;ALREADY INITIALIZED - JUMPVÏÐ .ENDC ;T$$COMÑÒ MOV R2,-(SP) ;SAVE R2%Ó CALL TTINIT ;INITIALIZE THE WORLDÔ MOV (SP)+,R2 ;RESTORE R2U8Õ10$: MOV #CT.CON,R4 ;GET CONTROLLER ONLINE OFFSET CODE0Ö BR TTDSP ;GO TO COMMON CONTROLLER DISPATCHER9×20$: MOV #CT.COF,R4 ;GET CONTROLLER OFFLINE OFFSET CODEE0Ø BR TTDSP ;GO TO COMMON CONTROLLER DISPATCHERÙ9ÚTTUCB:: MOV KINAR6,-(SP) ;SAVE KERNEL INSTRUCTION APR 6J/Û BCS 10$ ;BRANCH IF WANT TO SET UNIT OFFLINEE1Ü ADD #U.TSTA,R5 ;POINT TO UCB STATUS TRIPLEWORD-Ý CALL MAPD ;MAP DATA AREAÞß .IF DF T$$SPLà-á CALL ALUCBX ;ALLOCATE A UCBX FOR THIS UCBM/â BCS TTRET1 ;RETURN WITH CC-C SET IF FAILUREGãä .IFF ;T$$SPLOå7æ CALL CKTAB ;ALLOCATE TYPE-AHEAD BUFFER IF NECESSARYçè .IFTF ;T$$SPLéê .IF DF T$$MODë'ì BICB #US.CRW!US.DSB,U.STS-U.TSTA(R5)Ní ;ASSUME LOCAL LINEîï .ENDCð4ñ MOV #CT.UON,R2 ;SET ROUTINE INDEX FOR UNIT ONLINE5ò BR TTCRD ;GO TO UNIT DEPENDENT ROUTINE DISPATCHERP<ó10$: CLRB U.TMTI(R5) ;PREVENT MODEM TIMEOUT FROM OCCURRING&ô ADD #U.TSTA,R5 ;ADVANCE UCB POINTERõJõ MOV #CT.UOF,R2 ;SET ROUTINE INDEX FOR UNIT OFFLINE ; KLF009Lõ MOV KISAR6,-(SP) ;SAVE CURRNT APR 6 MAPPING ; KLF009Fõ CALL MAPD ;MAP DRIVER DATA AREA ; KLF009Fõ CALL CT00«��Ž{´cÚµcÛ¶c�·c›’RD ;CALL UNIT DEPENDENT ROUTINE ; KLF009Zõ ; KLF009ö .IFT ;T$$SPL÷H÷ TSTB $SCERR ;CHECK FOR ERROR IN UNIT DEPENDENT ROUTINE ; KLF009F÷ BMI TTRET ;IF MI, ERROR - DON'T DEALLOCATE UCBX ; KLF009.ø CALL DEUCBX ;DEALLOCATE THE UCBX AND TABUFùú .IFTF ;T$$SPLûFû BR TTRET ;GO TO COMMON RETURN CODE ; KLF009Wþ ;**-2 5ÿTTDSP: MOV KISAR6,-(SP) ;SAVE CURRENT APR 6 MAPPING # CALL MAPD ;MAP DRIVER DATA AREA  MOV @R2,R3 ;GET CSRT) MOVB K.PRM(R2),R1 ;GET CONTROLLER TYPER. ADD CTBL(R1),R4 ;GET DISPATCH TABLE POINTER2 CALL @(R4)+ ;CALL CONTROLLER DEPENDENT ROUTINE& BR TTRET ;GO TO COMMON RETURN CODE5TTCRD: MOV KISAR6,-(SP) ;SAVE CURRENT APR 6 MAPPINGT# CALL MAPD ;MAP DRIVER DATA AREA *  CALL CTRD ;CALL UNIT DEPENDENT ROUTINE6 TTRET: MOV (SP)+,KISAR6 ;RESTORE ENTRY APR 6 MAPPING< TTRET1: MOV (SP)+,KINAR6 ;RESTORE KERNEL INSTRUCTION APR 6  RETURNL  .IFT ;T$$SPLA  .ENABL LSB2;;;+;I; ALUCBX - ALLOCATE A UCB EXTENSION (UCBX) AND TYPEAHEAD BUFFER (TABUF)T8; STUCBX - SET UP A UCB EXTENSION AND TYPEAHEAD BUFFER;E ; INPUT:@; R0 APR BIAS OF 1ST SECONDARY POOL BLOCK (IF ENTRY AT STUCBX); R5 POINTER TO U.TSTA; ; OUTPUT:I; IF SUCCESS: ; CC-C 0K; UCBX AND CONTIGUOUS TABUF ALLOCATED FROM SECONDARY POOL AND INITIALIZEDM;G ; IF FAILURE:S !; CC-C 1J"; IE.ALC RETURNED IN $SCERR TO INDICATE FAILURE TO BRING TERMINAL ONLINE#; $;-%;@&ALUCBX: CALL 20$ ;GET NUMBER OF SECONDARY POOL NODES REQUIRED7' CALL $ALSEC ;ALLOCATE THEM FOR USE BY THIS TERMINAL )( BCS 10$ ;BRANCH ON ALLOCATION FAILURE I)STUCBX::MOV R0,U.TAPR-U.TSTA(R5) ;THESE NODES BECOME THE UCBX AND TABUFR** MOV R0,@#KDSAR5 ;MAP THE UCBX AND TABUF,+ MOV #120000,R4 ;SET THEIR VIRTUAL ADDRESS, ASSUME U.TCI,0C%- CLR @R4 ;NO CURRENT INPUT REQUEST +. CLR U.TCO(R4) ;NO CURRENT OUTPUT REQUEST -/ CLRB U.TISV(R4) ;INITIALIZE STATE VARIABLE 0 ASSUME U.TITI&1,01 ASSUME U.TOTI,U.TITI+1T02 CLR U.TITI(R4) ;CLEAR INPUT AND OUTPUT TIMERS@3 CLR U.TFPB(R4) ;CLEAR PROMPT BUF ADDRS/UNSOLICITED INPUT FLAG&4 CLR U.TRTT(R4) ;NO TERMINATOR TABLE56 .IF DF T$$EIO7;8 CLR U.TDIF(R4) ;CLEAR FIRST DEFAULT INPUT BUFFER POINTER 9: .ENDC ;T$$EIO;<;0=,> .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB?9@ ADD #U.TAST,R4 ;POINT TO UNSOLICITED INPUT ACB ADDRESSO/AX = U.TAST ;SYMBOL NEEDED FOR ASSUME MACROSTBC .IF DF T$$CCAD6E CLR (R4)+ ;CLEAR ACB POINTER FOR UNSOLICITED INPUT FX = X + 2EGH .ENDC ;T$$CCAIJ .IF DF T$$SCAKL ASSUME U.TSCA,X MX = X + 2 1N CLR (R4)+ ;CLEAR SWITCH CHARACTER ACB POINTEROP .ENDC ;T$$SCAQR .IF DF T$$MHUST ASSUME U.TMHA,X UX = X + 2NV-W CLR (R4)+ ;CLEAR MODEM HANGUP ACB POINTER XY .ENDC ;T$$MHUZ[ .IF DF T$$ICS\] ASSUME U.TICA,X ^X = X + 2N(_ CLR (R4)+ ;CLEAR ICS ACB/TEP POINTER`a .ENDC ;T$$ICSbc .IF DF T$$OOBde ASSUME U.TOBA,X fX = X + 2T(g CLR (R4)+ ;CLEAR OOB ACB/TEP POINTERhi .ENDC ;T$$OOBj,k .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOBlm ASSUME U.TTBF,Xn o CLR (R4)+ ;INITIALIZE HEADER2p CLRB (R4)+ ;RESET ACTIVE COUNT AND CLEAR CARRY1q MOVB U.TBSZ-U.TSTA(R5),(R4) ;SET SIZE OF TABUFR r RETURNU5s10$: MOVB #IE.ALC,$SCERR ;INDICATE CAUSE OF FAILUREI"t RETURN ;RETURN WITH CARRY SETu;v;+w;+*x; DEUCBX - DEALLOCATE THE UCBX AND TABUFy;S z; INPUT:{; R5 POINTER TO U.TSTA|;A }; OUTPUT: 2~; UCB EXTENSION AND TYPEAHEAD BUFFER DEALLOCATED;-€;OA�DEUCBX::MOV U.TAPR-U.TSTA(R5),R0 ;GET ADDRESS OF UCBX AND TABUF '‚ CLR U.TAPR-U.TSTA(R5) ;CLEAR POINTERE4ƒ CALL 20$ ;GET THE NUMBER OF BLOCKS TO DEALLOCATE:„ CALLR $DESEC ;DEALLOCATE THE UCBX AND TABUF AND RETURN…;UI†; CALCULATE THE NUMBER OF SECONDARY POOL BLOCK00«�¬�±|t÷tø tþfDATAS REQUIRED TO CONTAIN THERL‡; UCB EXTENSION AND A TYPEAHEAD BUFFER WHOSE SIZE IS KEPT IN OFFSET U.TBSZˆ;S,‰20$: CLR R1 ;PREVENT UNWANTED SIGN EXTENDGŠ BISB U.TBSZ-U.TSTA(R5),R1 ;GET THE SIZE OF THE TABUF LESS ITS HEADER@‹ ADD #T$$UXL+4+77,R1 ;INCLUDE TABUF HEADER, UCBX, AND ROUND UP=Œ ASH #-6,R1 ;CONVERT TO NUMBER OF SEC POOL BLOCKS REQUIREDE%� RETURN ;RETURN WITH RESULT IN R1Ž � .DSABL LSBL�‘ .ENDC ;T$$SPL’“ .ENDC ;R$$CON”• .IF DF T$$SER–—;O˜;+™;B)š; NXTCMD - PROCESS THE NEXT CLI COMMANDE›; œ; INPUT:�; R0 UCB ADDRESSž;K Ÿ; OUTPUT: E ; THE COMMAND IN PROGRESS BIT (UM.CMD) IS CLEARED AND AN ATTEMPT ISBE¡; MADE TO PROCESS CHARACTERS FROM THE TYPEAHEAD BUFFER. FOR MULTI-$D¢; PROCESSOR SYSTEMS, IF WE ARE NOT ON THE CORRECT CPU, FORK TO GETG£; THERE WITH A NULL FORK REQUEST, SINCE AFTER FORK PROCESSING WE WILLH>¤; TRY TO PROCESS CHARACTERS FROM THE TYPEAHEAD BUFFER ANYWAY¥;-¦;C$§NXTCMD: CALL MAPD ;MAP THE DRIVER¨ SAVNR ;SAVE R4 AND R5"© MOV R0,R5 ;GET THE UCB ADDRESS"ª ADD #U.TSTA,R5 ;POINT TO U.TSTA>« BIC #UM.CMD,U.MUP-U.TSTA(R5) ;ENABLE CLI COMMAND PROCESSING¬­ .IF DF M$$PRO®!¯ CLR R3 ;SET NULL FORK REQUESTY5° CALL SWCPU ;SWITCH TO THE CORRECT CPU (NO RETURN) /± ;OR FALL THRU IF ALREADY ON THE RIGHT CPUH²³ .ENDC ;M$$PRO´#µ CALL LOCKI ;LOCK OUT INTERRUPTSL:¶ CALLR SERPRO ;;;SERIALLY PROCESS CHARACTERS FROM TABUF·¸ .ENDC ;T$$SER¹º» .IF DF B$$MAP!R$$PROR¼+½NXTCMD:: ;THIS SHOULD NOT BE CALLED FORT¾ ;P/OS SYSTEMSD0¿FORVMR: CRASH ;THIS NEEDS TO BE HERE FOR VMR#À ;THIS IS BECAUSE VMR DOES NOTS Á ;BELIEVE IN M-PLUS SYSTEMS& ;WITHOUT RECONFIGURATION SUPPORTÃÄ .ENDC ;B$$MAP!R$$PROCÅÆ; Ç;NÈ .END ;OR FALL THRU IF ALREADY ON THE RIGHT CPUH²³ .ENDC ;M$$PRO´#µ CALL LOCKI ;LOCK OUT INTERRUPTSL:¶ CALLR SERPRO ;;;SERIALLY PROCESS CHARACTERS FROM TABUF·¸ .ENDC ;T$$SER¹º» .IF DF B$$MAP!R$$PROR¼+½NXTC .TITLE TTCT .IDENT /02.01/E;; COPYRIGHT (c) 1984 BY(; DIGITAL EQUIPMENT CORPORATION, MAYNARD'; MASSACHUSETTS. ALL RIGHTS RESERVED.E;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED.A; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSELA; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISRA; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORA; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND1; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERED.1;A; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTAA; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;SA; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFM<; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.;R;T;O; 3-JUL-82 TONY LEKASE;R; MODIFICATIONS:;H(; WMG029 2-MAR-83 WILLIAM M. GERACI/; ADD ERROR PASSING CAPABILITY FOR TFW TO PASST; ERROR STATUS TO TTDRV (P/OS)R;S; S. C. ADAMS 2-MAY-84 02.01*; SA170 -- SUPPORT CHANGES TO STATUS BITS;C;G;+4; CONTROLLER-DEPENDENT ROUTINES FOR CT VIDEO DISPLAY;-;  .IF DF B$$MAP .PSECT MAP5;.;+; YCSTAX - START OUTPUT.;S; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; ; R2 PHYSICAL UNIT NUMBER * 2T#; (ONLY IF MULTIPLEXERS IN SYSTEM)O; R3 CSR ADDRESS; R4 UCBX ADDRESS-; R5 POINTER TO U.TSTA;D; U.TOP BUFFER LIST POINTER; U.TOC BYTE COUNTR;A; NOTE:;; THE VIDEO TASK SHOULD DECREMENT T.OREM AS DATA IS REMOVEDP8; FROM THE BUFFERS. THE COUNT IN THE SECOND STATUS WORD:; THAT IS RETURNED TO THE USER IS THE ORIGINAL COUNT MINUS ; T.OREM. ;5*; Intermediate input and output buffer. - ;:!; byte contentsN-; ------------------------------------N@; 0-1 link to next buffer (0 if this is last).; 2 logical buffer length!; 3 reserved; 4-47 dataT;00¬"��Ž{´cÚµcÛ¶c�·c›’;H; NOTE:A;S,; THE OUTPUT TIMER IS BEING CLEARED BECAUSE-; SOME OUTPUT TO THE VIDEO TASK, FOR EXAMPLEU; GIDIS, MAY TAKE A LONG TIME. ;-; 3YCSTAX::CALL MAPD ;SETTUP TERMINAL DRIVER MAPPINGe% CLRB U.TOTI(R4) ;CLEAR OUTPUT TIMER !; COMPUTE THE TOTAL TRANSFER SIZE-: MOV U.TTOC(R4),T.OREM ;GET THE NUMBER OF BYTES IN THE XFR% ;THAT ARE NOT CURRENTLY BUFFERED)6 ADD U.TOC(R4),T.OREM ;ADD IN THE AMOUNT FOR THE FIRST# ;BUFFER OR FOR THE ECHO BUFFER # TST U.TCO(R4) ;BUFFER CHAIN USED?E$ BEQ 10$ ;IF EQ NO - COPY THE DATA: MOV U.TOP(R4),T.OPKP ;MOV THE BUFFER LIST ADDRESS FOR TFW7; NOW WE ADD IN THE COUNTS FOR THE EXTRA BUFFERS IF ANYL0; THIS CODE DEPENDS ON THE MAXIMUM BUFFER LENGTH; BEING LESS THAN 128.4 MOV T.OPKP,R1 ;GET THE ADDRESS OF THE FIRST BUFFER.5$: MOVB U.TDYP(R4),3(R1) ;STORE THE DATA TYPE2 MOV (R1),R1 ;GET THE POINTER TO THE NEXT BUFFER/ BEQ REQEST ;IF EQ NO MORE - REQUEST THE TASK & MOVB 2(R1),R0 ;GET THE BUFFER LENGTH$ ADD R0,T.OREM ;ADD IT TO THE COUNT BR 5$ ;TRY FOR SOME MOREA0; COPY THE SINGLE BUFFER INTO A BUFFER IN TFWCOM=10$: MOV #T.TBUF,T.OPKP ;MOV THE BUFFER LIST ADDRESS FOR TFW + MOV U.TOC(R4),R1 ;GET THE CHARACTER COUNTF2 MOVB R1,T.TBUF+2 ;PUT THE LENGTH INTO THE BUFFER9 MOV #T.TBUF+4,R0 ;POINT TO DATA AREA OF THE TEMP BUFFER,3 MOV U.TOP+2(R4),R3 ;GET THE SOURCE BUFFER ADDRESSO#20$: MOVB (R3)+,(R0)+ ;MOVE A BYTE  SOB R1,20$ ;DO THEM ALL BR REQEST ;REQUEST THE TASK;F;+; YCABOX - ABORT OUTPUT.;I; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;T; NOTE:,; THE VIDEO TASK MUST NOT USE ANY CHARACTERS+; FROM THE BUFFER AFTER TF.ABO HAS BEEN SET)0; BECAUSE THE BUFFER WILL HAVE BEEN DEALLOCATED.;U4; GET THE CHARACTER(S) AND THEN TEST THE BIT. IF IT$; IS SET DO NOT USE THE CHARACTER(S);-;P3YCABOX::CALL MAPD ;SETTUP TERMINAL DRIVER MAPPINGR' BIS #TF.ABO,T.FLAG ;SET THE ABORT BITD' CLR T.OPKP ;CLEAR THE BUFFER POINTERK" BR REQEST ;AND REQUEST THE TASK;;+!; YCSTOX - STOP (SUSPEND) OUTPUT.R;N; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-;R3YCSTOX::CALL MAPD ;SETTUP TERMINAL DRIVER MAPPING ) BIS #TF.SPN,T.FLAG ;SET THE SUSPEND BITE" BR REQEST ;AND REQUEST THE TASK;T;+; YCRESX - RESUME OUTPUT.O;S; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-;N3YCRESX::CALL MAPD ;SETTUP TERMINAL DRIVER MAPPINGK+ BIC #TF.SPN,T.FLAG ;CLEAR THE SUSPEND BIT;" BR REQEST ;AND REQUEST THE TASK;S;+; YCPWUP - POWER-UP.; ; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-; .IF DF R$$CONYCCONL::,YCCPUP::RETURN ;ONLY INIT FOR UNIT ONLINEYCUONL::YCUPUP:: .IFFEYCPWUP:: .ENDC ;R$$CON, CALL MAPD ;SETTUP TERMINAL DRIVER MAPPING$ TST # ;32 WORD ALIGNED? BEQ 5$ ;IF EQ YES - OK- CRASH ;OOOPS65$: MOV #VT.NAM,R3 ;GET THE ADDRESS OF THE TASKS NAME) CALL $SRSTD ;GET THE TASKS TCB ADDRESS  BCC 10$ ;BRANCH IF NO ERRORS+ CRASH ;TASK NOT INSTALLEDN)10$: MOV R0,VT.TCB ;SAVE THE TCB ADDRESSL= MOV #</64.>,VT.APR ;TFWCOM'S OFFSET IN TTDRVP7 ADD @#KISAR5,VT.APR ;COMPUTE TFWCOMS PHYSICAL ADDRESSP2 MOV #TFWPAR,R3 ;GET THE ADDRESS OF TFWCOM'S NAME. CALL $SRNAM ;GET THE PARTITIONS PCB ADDRESS BCC 20$ ;IF CC OK CRASH ;PARTITION NOT AROUNDO?20$: MOV VT.APR,P.REL(R2) ;FILL IN BASE ADDR IN 32. WORD BLOCKSH7 MOV #</64.>,P.BLKS(R2) ;AND THE LENGTH, BIS #TF.INT,T.FLAG ;SET THE INITIALIZE BIT5REQEST: MOV VT.TCB,R0 ;SETTUP THE TASK'S TCB ADDRESSS! CALLR $EXRQN ;REQUEST THE TASKT; ;+; G$IN - DRIVER INPUT ROUTINEK;R:; THIS ROUTINE IS CALLED IN SYSTEM STATE BY THE VIDEO TASK9; TO INFORM THE DRIVER THAT THERE IS INPUT WAITING IN THEH; INPUT BUFFER.A;E; REGISTERS MODIFIED:K; ALL;-;R;N@; DEFINE THE KEY MATRIX CODES FOR INTERRUPT AND DO HERE FOR NOW.@; THESE DEFINITIONS SHOULD BE PROVIDED BY THE TERMINAL TASK CODE!; SINCE 00¬*��±|t÷tø tþfDATATHEY ARE "DEFINED" BY IT.H;N(K.INT = 144 ;MATRIX CODE FOR INTERRUPT K.DO = 175 ;MATRIX CODE FOR DO2G$IN:: MTPS #TTPRI ;LOCK OUT TERMINAL INTERRUPTS/ CLR R4 ;;;INDICATE THAT THIS IS CONTROLLER 0 3 TTSET$ YC ;;;CALL TTSET SETTUP FOR POSSIBLE FORKR/ MOV #.TTCT+U.TSTA,R5 ;;;SETTUP FOR ICHAR1 CALLF* MOV #T.INBF,R0 ;;;GET THE BUFFER ADDRESS% ;;;ASSUME THE TYPE BYTE IS FIRST $ MOVB (R0)+,R2 ;;;GET THE DATA TYPE$ CMP #T.RSDN,R2 ;;;LEGAL DATA TYPE?, BHIS 5$ ;;;IF HIS YES - PROCESS THE INPUT CRASH ;;;BAD DATA TYPE 5$: ASL R2 ;;;MAKE IT AN INDEX* MOV R2,DTYPE ;;;SAVE THE DATA TYPE INDEX& ;;;ASSUME THAT THE LENGTH IS NEXT.10$: MOVB (R0)+,R1 ;;;GET THE CHARACTER COUNT( BEQ 50$ ;;;IF EQ NO CHARACTERS - EXIT .IF DF T$$IDO TST R2 ;;;DATA TYPE ZERO?. BNE 15$ ;;;NE NO - CAN'T BE INTERRUPT OR DO$ CMPB #K.INT,(R0) ;;;INTERRUPT KEY?% BEQ 100$ ;;;EQ YES - GO PROCESS ITT CMPB #K.DO,(R0) ;;;DO KEY?% BEQ 100$ ;;;EQ YES - GO PROCESS ITF) BR 15$ ;;;AND GO PROCESS THE CHARACTERB;DA; WE HAVE AN INTERRUPT OR DO KEY. IF THIS TERMINAL IS NOT IN RPAT=; MODE THEN CONVERT THE INTERRUPT-DO SEQUENCE TO A CONTROL-C.0;M100$:)% BIT #S1.PTH,(R5) ;;;READ-PASS-THRU?51 BNE 15$ ;;;NE YES - PROCESS CHARACTER IS USUALO CMPB #K.DO,(R0) ;;;DO KEY?' BEQ 110$ ;;;EQ YES - GO DEAL WITH ITT, INC IDOFLG ;;;SET THE INTERRUPT SEEN FLAG( BR 50$ ;;;AND EXIT DISCARDING THE KEY,110$: TST IDOFLG ;;;WAS INTERRUPT PRESSED?1 BEQ 15$ ;;;EQ NO - GO PROCESS DO AS NORMAL KEY ) CLR IDOFLG ;;;CLEAR THE INTERRUPT FLAGO2 MOV #CH.CTC,R2 ;;;CONVERT INTERRUPT-DO TO CTRL-C CALLR ICHAR1 ;;;PROCESSES IT  .ENDC ;T$$IDO-15$: CLR IDOFLG ;;;CLEAR THE INTERRUPT FLAG5. ;;;ASSUME THAT TYPE SPECIFIC DATA IS NEXT& ;;;ASSUME THAT IT IS WORD ALIGNED0 TST (R0)+ ;;;PASS OVER THE TYPE SPECIFIC INFO;SA; IF WE HAVE A MULTI CHARACTER INPUT SEQUENCE FOR DATA TYPE ZERO,YE; (I.E. A CONTROL OR ESCAPE SEQUENCE), MAKE SURE THAT THERE IS ENOUGH C; ROOM IN THE TYPEAHEAD BUFFER FOR IT. IF THERE IS NOT ENOUGH ROOMA.; THEN DISCARD THE CHARACTERS AND ECHO A BELL.;L# CMP #1,R1 ;;;ONLY ONE CHARACTER?% BEQ 20$ ;;;EQ YES - GO PRECESS IT.; TST DTYPE ;;;DATA TYPE 0?$ BNE 20$ ;;;NE NO - GO PROCESS IT. .IF DF T$$SPL$ MOV #120000+U.TTBF,R3 ;;;GET TABUF .IFF ;T$$SPL & MOV U.TTAB-U.TSTA(R5),R3 ;;;GET TABUF- BEQ 20$ ;;;NONE - GO PROCESS THE CHARACTER $ BIT #1,R3 ;;;SINGLE-CHAR. BUFFER?% BNE 20$ ;;;Y - GO PROCESS THE CHAR  .ENDC ;T$$SPL+ MOVB 2(R3),R3 ;;;GET CURRENT ACTIVE COUNTR0 ADD R1,R3 ;;;ACTIVE COUNT INCLUDING NEW CHARS+ CMPB R3,#T$$BFL-4 ;;;TOO MANY CHARACTERS?. BLOS 20$ ;;;LOS NO - PROECSS THE CHARACTERS1 CALLR BELL ;;;ECHO A BELL AND DISCARD THE CHARE ;;;NOW COMES THE DATA120$: CLR R2 ;;;PREPARE R0 (STATUS MUST BE ZERO) " BISB (R0)+,R2 ;;;GET A CHARACTER MOV R0,-(SP) ;;;SAVE R0- MOV R1,-(SP) ;;;AND R1 TST DTYPE ;;;DATA TYPE 0?, BEQ 30$ ;;;IF EQ YES - HANDLE NORMAL TEXT* CALL IRSD1 ;;;HANDLE SPECIAL DATA INPUT BR 40$ ;;;GO GET THE NEXT ONE+30$: CALL ICHAR1 ;;;DO COMMON INPUT PROC.P 40$: MOV (SP)+,R1 ;;;RESTORE R1 MOV (SP)+,R0 ;;;AND R0 SOB R1,20$ ;;;LOOP TILL DONEL50$: RETURN ;AND EXIT;S;+5; IRSD1 - INPUT CHARACTER PROCESSING FOR SPECIAL DATA ;P.; THIS ROUTINE IS CALLED FOR EACH SPECIAL DATA/; INPUT CHARACTER. THIS ROUTINE DOES BASICALLY&; THE SAME THING AS ICHAR1 EXCEPT THAT-; IT WILL PUT THE DATA IN A SPECIAL TYPEAHEADE/; BUFFER UNLESS THERE IS AN IO.RSD OUTSTANDING.A/; IT IS SIMPLER AND PROBABLY SHORTER TO DO THISL; SEPARATLY HERE.M; ; INPUTS:P ; R2 BYTE(; R5 POINTER TO U.TSTA3; DTYPE DATA PATH SPECIFIER 1 < DTYPE < 2*T.RSDN+1D;L ; OUTPUTS:2; ANY OF THE FOLLOWING ACTIONS IS TAKEN, DEPENDENT; ON LINE STATUS.I;D0; 1. BYTE IS STORED IN THE APPROPRIATE DATA TYPE; SPECIFIC TYPEAHEAD BUFFER.S;U,; 2. BYTE IS STORED IN THE INPUT BUFFER OF A; PENDING IO.RSD.;L5; 3. BYTE IS IGNORED IF THE TYPEAHEAD BUFFER IS FULL. ,; A00¬2��Ž{´cÚµcÛ¶c�·c›’T A LATER TIME SUPPORT COULD BE ADDED TO&; RETURN AN ERROR FOR THIS SITUATION.;A; REGISTERS ALTERED: R2,R3,R4 ;-;(-IRSD1: MOV DTYPE,R3 ;;;GET THE TABUF ADDRESSF MOV T.RSDT(R3),R3 ;;;+# TSTB 2(R3) ;;;ANYTHING BUFFERED?O! BNE 100$ ;;;Y - BUFFER THIS TO + CALL RSDPRC ;;;CAN WE PROCESS THIS BYTE?T BCS 100$ ;;;NO - GO STORE ITI CALLR ICHAR2 ;;;GO PROCESS IT5; PUT THE CHARACTER INTO THE CORRECT TYPEAHEAD BUFFER.1100$: MOVB (R3)+,R4 ;;;GET OFFSET WHERE TO STORE  INC R3 ;;;SKIP OVER 1 BYTEO" CMPB (R3)+,(R3)+ ;;;BUFFER FULL?' BEQ 200$ ;;;Y - IGNORE THE CHARACTER ( ADD R3,R4 ;;;MAKE POINTER INTO BUFFER" MOVB R2,(R4) ;;;STORE CHARACTER( INC -(R3) ;;;INCREMENT ACTIVE COUNTER$ INC -(R3) ;;;UPDATE STORE POINTER! CMPB (R3),3(R3) ;;;WRAP-AROUND?; BNE 200$ ;;;N - JUMPE2 CLRB (R3) ;;;Y - SET POINTER AT START OF BUFFER200$: RETURN ;;;RETURN ;H;+A; RSDPRC - DETERMINE WHETHER A SPECIAL DATA BYTE CAN BE PROCESSEDE;F; INPUT:; R5 POINTER TO U.TSTA;I ; OUTPUT:T$; IF CHARACTER CAN BE PROCESSED NOW:; R4 I/O PAKET ADDRESS; CC-C 0;C(; IF CHARACTER CAN NOT BE PROCESSED NOW:; CC-C 1;2; REGISTERS ALTERED: R4R;-;-=RSDPRC::BIT #S1.DSI!S1.USI,(R5) ;;;INPUT PROCESSING DISABLED?P& ;;;OR UNSOLICITED INP INPROGRESS?# BNE 10$ ;;;Y - CAN'T PROCESS NOWR ASSUME S1.IBY,200 TSTB (R5) ;;;INPUT BUSY? # BPL 10$ ;;;N - CAN'T PROCESS NOWP$ MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX, BEQ 10$ ;;;NONE - CAN'T PROCESS IT (COULD& ;;;HAPPEN FOR EXAMPLE WHEN CTRL-C( ;;;IS TYPED ON AN IDLE SLAVED TERM) ASSUME U.TCI,00$ MOV (R4),R4 ;;;GET PACKET ADDRESS1 CMPB #IO.RSD/400,I.FCN+1(R4) ;;;IS IT AN IO.RSD?-# BNE 10$ ;;;N - CAN'T PROCESS NOW5. TST (PC)+ ;;;RETURN CARRY CLEAR, PROCESS IT10$: SEC ;;;RETURN CARRY SET  RETURN ;;;RETURN;;+; R$OUTD - OUTPUT DONE ROUTINE;U:; THIS ROUTINE IS CALLED IN SYSTEM STATE BY THE VIDEO TASK=; TO INFORM THE DRIVER THAT THE TASK IS DONE WITH THE CURRENTI; OUTPUT BUFFERS;P; REGISTERS MODIFIED:L; ALL;-;T> .IIF DF,T$$SPL,.ERROR ;THIS CODE ASSUMES UCBX IN PRIMARY POOL ;OR PRIVATE BUFFER POOL3R$OUTD::MTPS #TTPRI ;LOCK OUT TERMINAL INTERRUPTS;/ CLR R4 ;;;INDICATE THAT THIS IS CONTROLLER 0C3 TTSET$ YC ;;;CALL TTSET SETTUP FOR POSSIBLE FORKE) CLR T.OPKP ;;;CLEAR THE BUFFER POINTERD@ BIC #,T.FLAG ;;;CLEAR THE ABORT AND SUSPEND BITS. MOV #.TTCT+U.TSTA,R5 ;;;SETTUP FOR ODONE CALL, MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX ADDRESS8 MOV T.OREM,U.TTOC(R4) ;;;RESTORE BYTES TRANSFERED COUNT/ CLR U.TOC(R4) ;;;SHOW CURRENT BUFFER ALL DONER6 MOV T.STAT,@U.TCO(R4) ;;;GET PACKET COMPLETION STATUS2 CALLR ODONE ;;;FINISH OFF THE OUTPUT AND RETURN;D;+); CTICK - TIMER ROUTINE FOR CT VIDEO TASK;;A3; THIS ROUTINE IS CALLED ONCE EVERY CT$TIC TICKS TOC.; PROVIDE TIMER SERVICES FOR THE CT VIDEO TASK;L ; INPUTS: ; NONE;N ; OUTPUTS:4; THE THREE CT TIMERS ARE CHECKED AND THE VIDEO TASK; IS NOTIFIED IF THEY RUN OUTC;-;E3CTICK:: CALL MAPD ;SETTUP TERMINAL DRIVER MAPPINGC% CLR -(SP) ;GET A WORD ON THE STACKU" TST T.BTMR ;BLINK TIMER ACTIVE?) BEQ 10$ ;IF EQ NO - TRY THE NEXT TIMERO" DEC T.BTMR ;DECREMENT THE TIMER$ BNE 10$ ;IF NE, NOT TIMED OUT YET, BIS #TF.BTM,(SP) ;SET THE BLINK TIMER FLAG'10$: TST T.CTMR ;CURSOR TIMER ACTIVE? ) BEQ 20$ ;IF EQ NO - TRY THE NEXT TIMER " DEC T.CTMR ;DECREMENT THE TIMER$ BNE 20$ ;IF NE, NOT TIMED OUT YET- BIS #TF.CTM,(SP) ;SET THE CURSOR TIMER FLAG-+; T.STMR IS MAINTAINED IN SECONDS, NOT TICSI-20$: TST T.STMR ;SCREEN BLANK TIMER ACTIVE?C BEQ 30$ ;IF EQ NO - FINISH UP, DEC STIMER ;SCREEN TICS COUNTER FINISHED? BPL 30$ ;IF PL NO - FINISH UP- MOV $TKPS,STIMER ;RESET SCREEN TICS COUNTERB) DEC T.STMR ;DECREMENT THE SCREEN TIMER$ BNE 30$ ;IF NE, NOT TIMED OUT YET3 BIS #TF.STM,(SP) ;SET THE SCREEN BLANK TIMER FLG C430$: BIS (SP),T.FLAG ;SET ANY BITS IN THE FLAG WORD TST (SP)+ ;ANY TIMERS GO OFF?1 BEQ CTQUEK ;IF EQ NO - REQUEUE THE 00¬:�­<�±|t÷tø tþfDATACLOCK BLOCKD CALL REQEST ;REQUEST THE TASK. ASSUME .,CTQUEK ;AND REQUEUE THE CLOCK BLOCK;E;+ ; CTQUEK - QUEUE THE CLOCK BLOCK;-;C+CTQUEK::MOV #$CTCB,R0 ;GET THE CLOCK BLOCK * CLR R1 ;CLEAR THE HIGH ORDER DELTA TIME) MOV #CT$TIC,R2 ;SET THE LOW ORDER DELTA * MOV #C.SYST,R4 ;TYPE = SYSTEM SUBROUTINE1 CALLR $CLINS ;INSERT IN CLOCK QUEUE AND RETURNG;;+-; UNUSED ENTRY POINTS, SHOULD NEVER BE CALLEDD;-;(-$YCOUT:: ;OUTPUT INTERRUPT SERVICE ROUTINEQ,$YCINP:: ;INPUT INTERRUPT SERVICE ROUTINEYCMTIM::CRASH ;MODEM TIMERT .ENDC ;B$$MAP .ENDBLOCK;E;+ ; CTQUEK - QUEUE THE CLOCK BLOCK;-;C+CTQUEK::MOV #$CTCB,R0 ;GET THE CLOCK BLOCK * CLR R1 ;CLEAR THE HIGH ORDER DELTA TIME) MOV #CT$TIC,R2 ;SET THE LOW ORDER DELTA * MOV #C.SYST,R4 ;TYPE = SYSTEM SUBROUTINE1 CALLR $CLINS ;INSERT IN CLOCK QUEUE AND RETURNG;;+-; UNUSED ENTRY POINTS, SHOULD NEVER BE CALLEDD;-;(-$YCOUT:: ;OUTPUT INTERRUPT SERVICE ROUTINEQ,$YCINP:: ;INP2 .TITLE LPDRV - RSX-11M-PLUS LINE PRINTER DRIVER) .SBTTL LPDRV - DESCRIPTION AND HISTORYE .IDENT /13.03/ ;A8; COPYRIGHT (c) 1981 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED@ ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;E ;N ; B. S. MCCARTHY 13-AUG-81 ;8; BASED ON THE ORIGINAL NOVEL BY D. N. CUTLER, AND THE6; ORIGINAL KMC LP DRIVER FOR RSX11M, BY YOURS TRULY.;;.-; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:;B; J. W. BERZLE; -; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:Y; #; B. S. MCCARTHY 26-FEB-86 13.02T;,; BM380 -- CONVERT TO USE EXEC VECTORING;S#; B. S. MCCARTHY 26-FEB-86 13.03 ;+; BM388 -- FIX REGISTER USAGE IN VECTORM; TRANSLATE ROUTINE;;B3; LP11/LS11/LA180 LINE PRINTER CONTROLLER DRIVERI; WITH KMC-11 DMA SUPPORTD; .PAGE-! .SBTTL . - MACRO LIBRARY CALLS/DEFINITIONS"#;$; MACRO LIBRARY CALLS%;E&(' .MCALL ABODF$, HWDDF$, PKTDF$, UCBDF$' .MCALL SCBDF$ ; BM380(%) ABODF$ ; DEFINE TASK ABORT CODES-'* HWDDF$ ; DEFINE HARDWARE REGISTERSE'+ PKTDF$ ; DEFINE I/O PACKET OFFSETS , UCBDF$ ; DEFINE UCB OFFSETS9, SCBDF$ ,,SYSDEF ; DEFINE VARIABLE SCB OFFSETS ; BM380T-.;/; EQUATED SYMBOLS0;11?2; SOME OF THESE DEFINITIONS ARE INCLUDED FOR INFORMATION ONLY(3; AND ARE NOT REFERENCED IN THE DRIVER45;E46; LINE PRINTER STATUS WORD BIT DEFINITIONS (U.CW2)7;8*9LS11 = 100000 ; LS11 PRINTER (1=YES)9:CRJT = 40000 ; CARRIAGE RETURN JUST OUTPUT (1=YES) 0;FORM = 20000 ; FORM FEED REQUIRED (1=YES)6<CRTY = 10000 ; CARRIAGE RETURN REQUIRED (1=YES)3=ABRT = 4000 ; ABORT REQUEST IF HUNG (1=YES)B7>LFCT = 3000 ; UNPROCESSED LINE FEED COUNT FIELD7?LFBT = 1000 ; UNPROCESSED LINE FEED ADD/SUB BITI@@BHLD = 400 ; BYTE HELD BACK FOR CARRIAGE RETURN (1=YES)-AOFFL = 200 ; PRINTER OFFLINE (1=YES)S(BLOWER = 100 ; LOWER CASE (1=YES)5CPWRFLG = 40 ; POWER FAIL RECOVERY IN PROGRESST;DRQINPR = 20 ; REQUEST IN PROGRESS WHEN POWER FAILEDU5EKNOWN = 10 ; PRINTER KNOWN TO KMC-11 (1=YES)U3FBLCT = 7 ; UNPROCESSED BLANK COUNT FIELDH3GBLBT = 1 ; UNPROCESSED BLANK ADD/SUB BITFHI; >J; LINE PRINTER HORIZONAL POSITION AND HELD BACK BYTE (U.CW3)K;HL#MHORPS = 0 ; HORIZONAL POSITIONINHELDB = 1 ; BYTE HELD BACK OPQ;E4R; DEFINE TIMEOUT WITH NO ERROR BIT IN S.STS FOR LPS;)T'UTMONO=200 ; 1=TIMEOUT WITH NO ERRORNVW;TX; K.PRM STATUS BITS Y;SZ-[KMCLOA = 1 ; KMC-11 MICROCODE LOADED '\KPKMC = 2 ; THIS IS A KMC KRBL]^ .PAGE-_ .SBTTL . - KMC11 SPECIFIC DATA DEFINITIONS &`; KMC-11/COMM-IOP-LP BIT DEFINITIONSab; KMC CSR WORD 0 (SEL0)Rc-dRUN = 100000 ; RUN BIT (1=KMC RUNNING):eMC = 40000 ; MASTER CLEAR (SET TO 1 TO CLEAR KMC)>fRQI 00­B��Ž{´cÚµcÛ¶c�·c›’ = 200 ; REQUEST INPUT (SET TO REQUEST KMC INPUT_=gIEO = 20 ; OUTPUT INTERRUPT ENABLE (SET TO ENABLE)R<hIEI = 1 ; INPUT INTERRUPT ENABLE (SET TO ENABLE)ij; KMC CSR WORD 1 (SEL2)Ek)lPRTNUM = 3400 ; PRINTER NUMBER MASK,mRDYO = 200 ; READY OUTPUT (1=READY)+nRDYI = 20 ; READY INPUT (1=READY)N&oFNCBSI = 3 ; BASE IN FUNCTION)pFNCCTI = 1 ; CONTROL IN FUNCTIONN0qFNCBAI = 0 ; BUFFER ADDRESS IN FUNCTIONrs; KMC CSR WORD 2 (SEL4) t8uPOLCNT = 177400 ; POLLING COUNT FOR BASE IN FUNCTIONvw; KMC CSR WORD 3 (SEL6)Lx;yKOPKOE = 200 ; KILL ON ERROR OPTION (FOR CONTROL IN)(.zKOPNXT = 40 ; DON'T EXPAND TABS OPTION-{KOPVTL = 20 ; CONVERT VT TO LF OPTION2|KOPDRN = 10 ; DISCARD RUBOUTS/NULLS OPTION<}KOPDNP = 4 ; DISCARD NON-PRINTING CHARACTERS OPTION8~KOPLUC = 2 ; CONVERT LOWER TO UPPER CASE OPTION7KOPFPR = 1 ; FAST PRINTER OPTIMIZATIONS OPTION€:�KMCABF = 10 ; KILL (ABORT) FINISHED ON CONTROL OUT>‚KMCNXM = 6 ; NON-EXISTENT MEMORY (WE CAN'T GET THIS?)3ƒKMCONL = 4 ; PRINTER ERROR CONDITION CLEAR <„KMCOFL = 2 ; PRINTER ERROR OCCURED (PAPER JAM,ETC.)…;†BEXT = 140000 ; BUS EXTENSION BITS FOR BUFF. ADDR. INC%‡KILASN = 20000 ; KILL ASSIGN BIT ˆKILL = 10000 ; KILL BIT‰Š; BUFFER DESCRIPTOR BITS‹-ŒLASTBF = 100000 ; LAST DESCRIPTOR IN LIST=�Ž�;AB�; DEFINE THE SYMBOL "L$$PRN" EITHER IN THE RSXMC.MAC CONDITIONALB‘; ASSEMBLY FILE FOR YOUR SYSTEM OR REMOVE THE SEMICOLON (;) FROMA’; THE LINE CONTAINING THE SYMBOL IN THE KMC LINE PRINTER DRIVERT “; (LKDRV).”;L,•;L$$PRN=0 ; SYMBOL TO PASS RUBOUTS/NULLS–;)-–VC$LP = 0 ; VECTORED LP DRIVER. ; BM380F—;F˜; LOCAL DATA™;N,š .IF DF K$$MLP ; KMC LINE PRINTER SUPPORT›-œKMCCTB: .WORD 0 ; ADDRESS OF $KMCTB IN CTB-�UNITPF: .WORD 0 ; THIS IS A UNIT POWERFAIL=žŸ .ENDC ; DF K$$MLP ¡;O@¢; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER)£;O¤6¥CNTBL: .BLKW L$$P11 ; ADDRESS OF UNIT CONTROL BLOCK¥ ; BM380&¥; EXECUTIVE VECTOR AREA ; BM380¥ ; BM380I¥EXEVEC: .WORD 0 ; VECTOR FLAG (<>0 -> VECTOR ALREADY TRANSLATED); BM380V¥ ; BM380$¥KISA6:: .WORD KISAR6 ; BM380$¥DVMSG:: .WORD $DVMSG ; BM380"¥FORK:: .WORD $FORK ; BM380$¥GTPKT:: .WORD $GTPKT ; BM380¥ ; BM380¥ .IF NDF LD$LP ; BM380¥ ; BM380$¥INTSV:: .WORD $INTSV ; BM380¥ ; BM380!¥ .ENDC ; NDF LD$LP ; BM380O¥ ; BM380$¥IODON:: .WORD $IODON ; BM380$¥MPUBM:: .WORD $MPUBM ; BM380$¥SCERR:: .WORD $SCERR ; BM380$¥STMAP:: .WORD $STMAP ; BM380$¥ULDRQ:: .WORD $ULDRQ ; BM380¥ ; BM380(¥EXEVCL=<<<.-EXEVEC>/2>-1> ; BM380¥ ; BM380¦§;;8¨; DRIVER DISPATCH TABLE - DDT$ CAN'T GENERATE THIS ONE©;0ª-«$LPTBL:: ; START OF DRIVER DISPATCH TABLE0¬1­ .WORD LPINI ; D.VINI - INITIATION ENTRY POINT3-® .WORD LPCAN ; D.VCAN - CANCEL ENTRY POINT .¯ .WORD LPOUT ; D.VTIM - TIMEOUT ENTRY POINT3° .WORD LPPWF ; D.VPWF - POWERFAIL RECOVERY ENTRYR±² .IF DF K$$MLP³2´ .WORD LPKRB ; D.VKRB - KRB STATUS CHANGE ENTRY2µ .WORD LPUCB ; D.VUCB - UCB STATUS CHANGE ENTRY¶· .IFF>¸5¹ .WORD LPPWF ; D.VPWF - NO KRB STATUS CHANGE ENTRYD5º .WORD LPPWF ; D.VPWF - NO UCB STATUS CHANGE ENTRY»¼ .ENDC ; DF K$$MLP*½ ; D.VINT - START OF INTERRUPT VECTOR¾ ; CONTROL INFORMATION¿/À .ASCII /LP/ ; FOR "LP" CONTROLLERSO3Á .WORD $LPINT ; SINGLE INTERRUPT ENTRY POINTP( .WORD 0 ; VECTOR TABLE TERMINATOR4ÃLPCTB: .WORD $LPCTB ; POINTER TO CTB KRB TABLEÄÅ .IF DF K$$MLPÆ)Ç .ASCII /KM/ ; FOR "KM" CONTROLLERSE,È .WORD $LKINP ; TWO INTERRUPT VECTORS,)É .WORD $LKOUT ; ONE UNUSED ($LKINP)L(Ê .WORD 0 ; VECTOR TABLE TERMINATOR4ËKMCTB: .WORD $KMCTB ; POINTER TO CTB KRB TABLEÌ00­J�<�±|t÷tø tþfDATAÍ .ENDC ; DF K$$MLPÎ-Ï$LPTBE::.WORD 0 ; END OF DISPATCH TABLE Ð .PAGE3Ñ .SBTTL LPINI - LINE PRINTER CONTROLLER INITIATOREÒ;+8Ó; **-LPINI-LP11/LS11 LINE PRINTER CONTROLLER INITIATORÔ;:LÕ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUESTPÖ; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THE EXECU-P×; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN ATTEMPTKØ; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IS KÙ; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER-T@Ú; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.Û;S Ü; INPUTS:EÝ;T<Þ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.ß;I à; OUTPUTS:á;NGâ; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT- Gã; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER- ä; ATION IS INITIATED.Må;- æ .ENABL LSBQç"èLPINI: GTPKT$ LP,L$$P11,,CNTBL,Téê;A3ë; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:Cì;L)í; R1=ADDRESS OF THE I/O REQUEST PACKET.I/î; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.ï; R3=CONTROLLER INDEX.+ð; R4=ADDRESS OF THE STATUS CONTROL BLOCK.O<ñ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.ò;R+ó; LINE PRINTER I/O REQUEST PACKET FORMAT: ô; $õ; WD. 00 -- I/O QUEUE THREAD WORD.2ö; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER.7÷; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTER TASK.,Bø; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTER TASK HEADER.Lù; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTER TASK HEADER (UCB).)ú; WD. 05 -- I/O FUNCTION CODE (IO.WLB).E2û; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK.2ü; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK.Gý; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140000).5þ; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE.S5ÿ; WD. 12 -- RELOCATION BIAS OF I/O BUFFER. (I.PRM)F-; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER. /; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.E$; WD. 15 -- CARRIAGE CONTROL BYTE.; WD. 16 -- NOT USED.A; WD. 17 -- NOT USED. ; WD. 20 -- NOT USED.I;) .IF DF K$$MLP 2  BIT #KP.OFL,S.KTB+2(R4) ; VERIFY PORT IS ONLINE  BNE 5$ ; IF NE, IT'S OFFLINE,  MOV S.KTB+2(R4),R0 ; GET ADDRESS OF KMC11+  BEQ 5$ ; IF EQ, THIS PRINTER NOT ON KMC @ BIT #KMCLOA,K.PRM(R0) ; IS THE MICROCODE LOADED FOR THE KMC ?* BNE LKINI ; IF NE, MICROCODE IS LOADED .ENDC ; DF K$$MLP;5$: MOV R5,R3 ; CALCULATE ADDRESS OF PRINTER STATUS WORD  ADD #U.CW2,R3 ;> BIC #FORM!CRTY!ABRT!LFCT!BHLD!BLCT,(R3) ; CLEAR STATUS BITS3 MOVB I.PRM+6(R1),R0 ; GET CARRIAGE CONTROL BYTEB* BEQ LPIN1 ; IF EQ, NO CARRIAGE CONTROL1 CMPB #'$,R0 ; CARRIAGE RETURN AT END OF LINE?2 BEQ 10$ ; IF EQ, NOK: BIS #CRTY,(R3) ; SET FOR CARRIAGE RETURN AT AND OF LINE510$: CMPB #'+,R0 ; LINE FEED AT BEGINNING OF LINE?? BEQ LPIN1 ; IF EQ, NOC1 CMPB #'1,R0 ; FORM FEED AT BEGINNING OF LINE?$ BNE 20$ ; IF NE, NOA> ADD #FORM-LFBT,(R3) ; SET FOR FORM FEED AT BEGINING OF LINE, 20$: ADD #LFBT,(R3) ; ADD IN ONE LINE FEED! CMPB #'0,R0 ; DOUBLE SPACE?E" BNE LPIN1 ; IF NE, NO(# ADD #LFBT,(R3) ; ADD IN ONE LINE FEED/$LPIN1: CALL LPRNT ; FILL LINE PRINTER BUFFER2)% BCS 35$ ; IF CS, REQUEST NOT FINISHED3/& MOV S.PKT(R4),R1 ; GET ADDRESS OF I/O PACKET:5' MOV I.PRM+4(R1),R1 ; GET NUMBER OF BYTES PROCESSEDQ-( MOV #IS.SUC&377,R0 ; SET SUCCESSFUL STATUSE0( CALL @IODON ; FINISH I/O OPERATION ; BM380* BR LPINI ; ;**-18+35$: BITB #TMONO,S.STS(R4) ; TIMEOUT NO ERROR BIT SET?, BEQ 40$ ; IF EQ, NOD<- MOVB #2,S.CTM(R4) ; SET TIME OUT COUNT TO 2 (MIN. 1 SEC.). BR 41$ ; SKIP </40$: MOVB S.ITM(R4),S.CTM(R4) ; RESET DEVICE TIMEOUT COUNT*041$: MOV @S.KRB(R4),R4 ; GET CSR ADDRESS,1 BISB #100,(R4) ; ENABLE PRINTER INTERRUPT 2 RETURNE 3 .DSABL LSBM4 .PAGE:5 .SBTTL LKINI - KMC11 PRINTER INITIALIZATION ENTRY POINT6;+D7; **-LKINI-LP11/LS1100­R��Ž{´cÚµcÛ¶c�·c›’ WITH KMC-11 LINE PRINTER CONTROLLER INITIATOR8;-9: .IF DF K$$MLP;7<LKINI: MOV R5,CNTBL(R3) ; SAVE ADDRESS OF REQUEST UCB$.= BIC #ABRT,U.CW2(R5) ; CLEAR REQUEST ABORTED>;O*?; CONVERSION OF ADDRESS FOR A NPR DEVICE@;:A; ON AN 18-BIT MACHINE, THENBB; U.BUF = HIGH ORDER 2 BITS OF PHYSICAL ADDRESS IN BITS 4 AND 55C; U.BUF+2 = LOW ORDER 16 BITS OF PHYSICAL ADDRESS.ED; ON AN 11/70, THENA@E; U.BUF = HIGH ORDER 6 BITS OF PHYSICAL ADDRESS IN HIGH BYTE.5F; U.BUF+2 = LOW ORDER 16 BITS OF PHYSICAL ADDRESS.TGH MOV R1,-(SP) ; SAVE R1.I MOV R2,-(SP) ; AND R2%J MOV U.BUF(R5),R1 ; RELOCATION BIASU,K MOV U.BUF+2(R5),R2 ; DISPLACEMENT ADDRESS/L ASL R2 ; REMOVE APR6 BIAS FROM DISPLACEMENT M ASL R2 ;(N CLC ; GET 2 BITS OF RELOCATION BIAS O ROR R1 ;1P RORB R2 ; TO FILL 8 LOW ORDER BITS OF ADDRESS Q ASR R1 ; R RORB R2 ;O)S SWAB R2 ; SWAP TO COLLECT 8 MORE BITSA/T BISB R1,R2 ; INSERT UPPER 8 BITS OF ADDRESSE'U SWAB R2 ; SWAP BACK TO REAL ADDRESSR*V CLRB R1 ; CLEAR LOW BYTE OF UPPER BITSWX .IF NDF M$$EXTMY1Z ASH #-4,R1 ; PUT BITS <17:18> OF ADDRESS INTOB[ ; BITS <4:5>\] .ENDC^%_ MOV R1,U.BUF(R5) ; HIGH ORDER BITSB:` MOV R2,U.BUF+2(R5) ; LOW ORDER 16 BITS OF PHYS. ADDRESSa MOV (SP)+,R2 ; RESTORE R2b MOV (SP)+,R1 ; AND R1cde .IF DF M$$MGE&M$$EXTAf,f CALL @STMAP ; SETUP UNIBUS MAP ; BM380h ;**-1i .ENDC ; M$$MGE&M$$EXTj0k; TEST TO SEE IF KMC KNOW'S ABOUT THIS PRINTER"l; AND ISSUE BASE IN IF NECESSARYm/nLKIN1: BIT #KNOWN,U.CW2(R5) ; PRINTER KNOWN ?Ho BNE 10$ ; IF NE, YES#p CALL WTKMC ; WAIT FOR KMC READY>,q MOV @S.KRB(R4),6(R0); FILL IN CSR ADDRESS0r MOV #L$$KPC*256.,4(R0) ; SET UP POLLING COUNT&s CLR R4 ; SCRATCH FOR UNIT/FUNCTION't BISB U.UNIT(R5),R4 ; SET UNIT NUMBER!u SWAB R4 ; PUT IT IN HIGH BYTE(v BIS #FNCBSI,R4 ; SET BASE IN FUNCTION$w MOV R4,2(R0) ; AND ISSUE FUNCTION)x MOV U.SCB(R5),R4 ; RESTORE SCB ADDRESS'+y BIS #KNOWN,U.CW2(R5) ; SET PRINTER KNOWNFzA{; TEST TO SEE IF PRINTER HAS BEEN INITIALIZED FOR CORRECT WIDTHE |; (CURRENT SET WIDTH IN U.CW3)}:~10$: CMPB U.CW4(R5),U.CW3(R5) ; BUF SIZE CURRENT WIDTH ?/ BEQ 20$ ; IF EQ, YES, CONTROL IN WAS ISSUEDC#€ CALL WTKMC ; WAIT FOR KMC READYU�‚ƒ .IF NDF L$$PRNR„9… MOV #KOPDRN,R4 ; SET FUNCTION TO DISCARD RUBOUTS/NULLSS†‡ .IFF ˆ/‰ CLR R4 ; SET FUNCTION TO PASS RUBOUTS/NULLSCŠ‹ .ENDCŒ�,Ž BIT #LOWER,U.CW2(R5) ; LOWER CASE PRINTER'� BNE 11$ ; IF NE, LOWER CASE PRINTERT3� BIS #KOPLUC,R4 ; SET LOWER TO UPPER CASE SUPPORTT‘11$: ; REF LABELD’ .IF DF L$$11R'“ BIT #LS11,U.CW2(R5) ; FAST PRINTER ?E” BNE 12$ ; IF NE, NO22• BIS #KOPFPR,R4 ; SET FAST PRINTER OPTIMIZATIONS– .ENDC ; DF L$$11R—&˜12$: MOV R4,6(R0) ; SET OPTIONS WORD*™ MOV U.CW4(R5),4(R0) ; SET PRINTER WIDTH-š CLR R4 ; SCRATCH FOR UNIT NUMBER/FUNCTIONT*› BISB U.UNIT(R5),R4 ; SET IN UNIT NUMBER!œ SWAB R4 ; PUT IT IN HIGH BYTEE+� BIS #FNCCTI,R4 ; SET CONTROL IN FUNCTIONS ž MOV R4,2(R0) ; ISSUE FUNCTION)Ÿ MOV U.SCB(R5),R4 ; RESTORE SCB ADDRESS 2  MOVB U.CW4(R5),U.CW3(R5) ; SET PRINTER SIZE SET¡¢£¤¥8¦; BUILD ADDRESS BUFFER IN I/O PACKET AND ISSUE REQUEST§¨20$: ; REFERENCE LABELD©ª .IF DF M$$MGE & M$$EXT0«)¬ MOV R1,-(SP) ; SAVE I/O PACKET ADDRESSS0¬ CALL @MPUBM ; MAP UNIBUS TO MEMORY ; BM3803® MOV (SP)+,R1 ; RESTORE I/O PACKET ADDRESS ;**-1U¯° .ENDC ; M$$MGE & M$$EXT±#² CALL WTKMC ; WAIT FOR KMC READYN>³ MOV U.BUF+2(R5),I.PRM+10(R1) ; SET LOW PART OF BUFFER ADDR.4´ MOV U.CNT(R5),I.PRM+12(R1) ; AND LENGTH OF BUFFER0µ MOV U.BUF(R5),R0 ; GET HIGH TWO BITS OF ADDR.¶ SWAB R0 ; PUT IN HIGH BYTE"· ASR R0 ; SHIFT INTO BITS 10/11 ¸ ASR R0 ;)¹ BIS #LASTBF,R0 ; SET FOR LAST FUNCTIONM(º BISB I.PRM+6(R1),R0 ; SET VFC BITS IN3» MOV R0,I.PRM+14(R1) ; STORE INTO BUFF ADDR DESC.V¼8½; BUFFER DESCRIPTOR BUILT IN WORDS 4,5,6 OF PARAM LIST¾)¿ MOV @S.KTB+2(R4),R0 ; POINT TO KMC CSRO00­Z�<�±|t÷tø tþfDATA#À CLR 6(R0) ; CLEAR OUT KILL BITSM#Á MOV R1,R4 ; COPY PACKET ADDRESS.0 ADD #I.PRM+10,R4 ; POINT TO BUFFER DESCRIPTOR(à MOV R4,4(R0) ; FILL IN BUFFER ADDRESS$Ä CLR R4 ; SCRATCH FOR UNIT NUMBER*Å BISB U.UNIT(R5),R4 ; SET IN UNIT NUMBER!Æ SWAB R4 ; PUT IT IN HIGH BYTEE$Ç MOV R4,2(R0) ; AND START TRANSFER"È25$: RETURN ; EXIT FROM DRIVERÉÊ .ENDC ; DF K$$MLPËÌ .PAGE4Í .SBTTL LPPWF - LINE PRINTER POWERFAIL ENRTY POINTÎÏ;TMÐ; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUSESLMÑ; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDITIONF4Ò; THAT COUND EXIST IN RESTARTING THE I/O OPERATIONÓ;ÔLPPWF:Õ .IF DF K$$MLPÖ'× BCC 5$ ; BR IF CONTROLLER POWERFAILU(Ø INC UNITPF ; INDICATE UNIT POWERFAIL5Ù5$: BIT #KP.OFL,S.KTB+2(R4) ; VERIFY PORT IS ONLINE !Ú BNE 10$ ; IF NE, IT'S OFFLINE ,Û MOV S.KTB+2(R4),R0 ; GET ADDRESS OF KMC11,Ü BEQ 10$ ; IF EQ, THIS PRINTER NOT ON KMC?Ý BIT #KMCLOA,K.PRM(R0) ; IS THE MICROCODE LOADED FOR THE KMC?C)Þ BEQ 10$ ; IF EQ, MICROCODE NOT LOADEDC#ß JMP LKPWF ; DO POWERFAIL FOR LKT/à10$: MOV #0,UNITPF ; ZERO UNIT POWERFAIL FLAGOá á .IFF ; DF K$$MLP ; BM380á ; BM380:á CALL LPKRB ; TRANSLATE EXEC ENTRY POINT VECTOR ; BM380á ; BM380â .ENDC ; DF K$$MLPã ä RETURN ;Oå .PAGE5æ .SBTTL LKPWF - KMC11 PRINTER POWERFAIL ENTRY POINT ç; Fè; UNIT POWERFAIL PROCESSING MARKS A DEVICE AS UNKNOWN AND OF UNKNOWNFé; WIDTH. FOR CONTROLLER POWERFAIL CALLS, THE MICROCODE IS MARKED ASGê; NOT LOADED. THE MICROCODE LOADER (MCL...) IS REQUESTED. IF MCL...:Ië; IS NOT INSTALLED AN ERROR MESSAGE IS ISSUED. IF THERE IS NO POOL, AB7ì; RETURN IS EXECUTED AND LPDRV WILL NOT USE THE KMC. í; î .IF DF K$$MLPï ð .ENABL LSB30ñLKPWF: TST UNITPF ; IS THIS A UNIT POWERFAIL?,ò BEQ LKPWF0 ; IF EQ, CONTROLLER POWERFAIL!ó DEC UNITPF ; SET BACK TO ZEROR4ô BIS #PWRFLG,U.CW2(R5) ; SET POWERFAIL IN PROGRESS&õ TST CNTBL(R3) ; REQUEST IN PROGRESSö BEQ 10$ ; IF EQ, NOM7÷ BIS #RQINPR,U.CW2(R5) ; SET REQUEST IN PROGRESS FLAGI1ø10$: BIC #KNOWN,U.CW2(R5) ; SET PRINTER UNKNOWNE-ù CLRB U.CW3(R5) ; AND SET THE WIDTH TO ZEROBú RETURN ; EXIT FROM DRIVERûüLKPWF0: ; CTB IS IN R3ý MOV R2,R4 ; PUT KRB INTO R4S(þ MOV #0,R5 ; MICROCODE FILENAME INDEX8ÿ BIC #KMCLOA,K.PRM(R4) ; INDICATE MICROCODE NOT LOADED.13$: CALL @ULDRQ ; REQUEST LOADER ; BM380 BCC 15$ ; BR IF OK ;**-1E. BEQ 20$ ; IF EQ, TASK MCL... NOT INSTALLED BNE 40$ ; IF NE, NO POOL*15$: MOV #MC,@(R4) ; MASTER CLEAR KMC-11 BR 40$ ; RETURN( > 20$: MOV #T.NKLF,R0 ; MESSAGE NUM "MICROCODE LOADER NOT ..."2  CALLR @DVMSG ; PRINT MESSAGE AND EXIT ; BM380  ;**-1 40$: RETURN4 .ENDC ; DF K$$MLP  .DSABL LSBD .PAGE8 .SBTTL $LPINT - LINE PRINTER INTERRUPT HANDLING ENTRY;+9; **-$LPINT-LP11/LS11 LINE PRINTER CONTROLLER INTERUPTS$;-$LPINT:: ;;; REF LABEL? INTSV$ LP,PR4,L$$P11,,CNTBL ;;; GENERATE INTERRUPT SAVE CODE; MOV U.SCB(R5),R4 ;;; GET ADDRESS OF STATUS CONTROL BLOCK;( MOV @S.KRB(R4),R4 ;;; GET CSR ADDRESS, CLRB (R4) ;;; DISABLE PRINTER INTERRUPTS3 CALL @FORK ;;; CREATE A SYSTEM PROCESS ; BM380;& MOV U.SCB(R5),R4 ; GET SCB ;**-1&  MOV @S.KRB(R4),R3 ; GET CSR ADDRESS! TST (R3) ; PRINTER READY?N" BMI LPOUT1 ; IF MI, NO8# MOV R5,R3 ; CALCULATE ADDRESS OF PRINTER STATUS WORD$ ADD #U.CW2,R3 ;)% CALL LPRNT ; FILL LINE PRINTER BUFFERL*& BCC LPINT1 ; IF CC, OPERATION FINISHED8' MOVB S.ITM(R4),S.CTM(R4) ; RESET DEVICE TIMEOUT COUNT&( MOV @S.KRB(R4),R4 ; GET CSR ADDRESS,) BISB #100,(R4) ; ENABLE PRINTER INTERRUPT * RETURN6+LPINT1: MOV S.PKT(R4),R1 ; GET ADDRESS OF I/O PACKET5, MOV I.PRM+4(R1),R1 ; GET NUMBER OF BYTES PROCESSED3-- MOV #IS.SUC&377,R0 ; SET SUCCESSFUL STATUSY4-60$: CALL @IODON ; FINISH I/O OPERATION ; BM380/ JMP LPINI ; ;**-1U01 .PAGE62 .SBTTL $LKINT - KMC11 PRINTER INTERRUPT ENTRY POI00­b��Ž{´cÚµcÛ¶c�·c›’NT34;+95; **-$LPINT-LP11/LS11 LINE PRINTER CONTROLLER INTERUPTS(06; (INTERRRUPTS ARE FROM COMM IOP, NOT PRINTER)7;;88; INPUT INTERRUPTS SHOULD NOT OCCUR, AND ARE THEREFORE9; DISMISSED IMMEDIATELY.:;.+;; OUTPUT INTERRUPTS ARE CAUSED FOUR WAYS:V<;M==; 1) - BUFFER ADDRESS OUT - INDICATES SUCCESSFUL COMPLETIONR>; OF AN OUTPUT OPERATION:;?; 2) - CONTROL OUT - KMCABF SET IN KCS3 - ABORT COMPLETED B@; 3) - CONTROL OUT - KMCONL SET IN KCS3 - PREVIOUS ERROR CLEARED9A; 4) - CONTROL OUT - OTHER - ERROR CONDITION ON PRINTERTB;-C .IF DF K$$MLP&D$LKINP:: ; IGNORE INPUT INTERRUPTS-E ; ($LPINP IS NEEDED TO MAKE DRIVER LOADOF ; CORRECTLY)G"H .IF NDF L$$DRV ! M$$MGE ! LD$LPIJ RTIKL .IFFRM N RETURNAOP .ENDCQ .PAGE R .ENABL LSB S$LKOUT:: ;;; REF LABELT"U .IF NDF L$$DRV ! M$$MGE ! LD$LPV:V JSR R5,@INTSV ;;; SINCE THERE'S ONE KMC VECTOR, ; BM380<X .WORD ^C&PR7 ;;; NORMAL UCB CALC. DOESN'T WORK ;**-1YZ .ENDC[#\ ADD KMCCTB,R4 ;;; POINT INTO KRB 0] ADD #10,R4 ;;; ADD DISPLACEMENT TO CTB TABLE#^ MOV (R4),R4 ;;; GET KRB ADDRESSN$_ MOV R4,-(SP) ;;; SAVE KRB ADDRESS#` MOV (R4),R4 ;;; GET CSR ADDRESS /a MOV 2(R4),R5 ;;; GET PRINTER NUMBER FROM KMC(b BIC #^C,R5 ;;; STRIP OFF JUNK$c SWAB R5 ;;; INTO LOW HALF OF REG$d ASL R5 ;;; AND CREATE WORD INDEX#e MOV (SP)+,R4 ;;; GET KRB ADDRESSS/f ADD K.OFF(R4),R5 ;;; ADD OFFSET TO KRB TABLE;!g ADD R4,R5 ;;; ADD KRB ADDRESS1#h MOV (R5),R5 ;;; GET UCB ADDRESS;1i BEQ 90$ ;;; IF EQ, DISMISS SPURIOUS INTERRUPTMj MOV (R4),R4 ;;; GET KMC CSR $k MOV R5,-(SP) ;;; SAVE UCB ADDRESS*l MOV 6(R4),R5 ;;; GET PRINTER ERROR CODE"m SWAB R5 ;;; PUT INTO HIGH BYTE"n CLRB R5 ;;; CLEAR OUT LOW BYTE1o BISB 2(R4),R5 ;;; AND MERGE IN INTERRUPT CAUSE +p BIC #IEO,(R4) ;;; DISABLE KMC INTERRUPTST"q BIC #RDYO,2(R4) ;;; RELEASE KMC,r MOV R5,R4 ;;; INTERRUPT CAUSE/ERROR BYTE's MOV (SP)+,R5 ;;; RESTORE UCB POINTER 7s CALL @FORK ;;; CREATE A SYSTEM PROCESS ; BM380Q&u MOV U.SCB(R5),R0 ; GET SCB ;**-1$v MOV @S.KTB+2(R0),R0 ; GET KMC CSR+w BIS #IEO,(R0) ; RE-ENABLE KMC INTERRUPTSV$x MOV R4,R0 ; COPY INTERRUPT CAUSE(y MOV R4,R1 ; COPY POSSIBLE ERROR BYTE%z SWAB R1 ; AND MOVE IT TO LOW BYTE({ MOV U.SCB(R5),R4 ; GET SCBP&| BIT #1,R0 ; WAS IT A CONTROL OUT ?}~ BNE 70$ ; IF NE, YES& MOV #IS.SUC,R0 ; SET SUCCESS STATUS0€60$: MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS0� MOV I.PRM+4(R1),R1 ; GET REQUESTED BYTE COUNT0� CALL @IODON ; FINISH I/O OPERATION ; BM380&ƒ MOV U.SCB(R5),R4 ; GET SCB ;**-1#„ MOV S.KTB+2(R4),R4 ; GET KMC KRB-+… MOVB K.CON(R4),R4 ; GET CONTROLLER INDEXI)† CLR CNTBL(R4) ; CLEAR CONTROLLER TABLEL&‡ JMP LPINI ; AND START DRIVER AGAINˆ)‰70$: CMPB #KMCABF,R1 ; ABORT FINISHED ?#Š BNE 80$ ; IF NE, YES ABORT DONE+‹LKOUT1: MOV #IE.ABO,R0 ; SET ABORT STATUSRŒ BR 60$ ; AND OUT NORMALLYM�+Ž80$: CMPB #KMCONL,R1 ; PRINTER BACK NOW ?I(� BNE LKOUT ; IF NE, NO, MUST BE ERROR$� RETURN ; ELSE YES, THAT'S NICE.‘’90$: MOV (R4),R4 ; GET CSRE “ BIC #RDYO,2(R4) ; RELEASE KMC"” RETURN ; AND EXIT FROM DRIVER • .DSABL LSBR–— .ENDC ; DF K$$MLP˜™ .PAGE2š .SBTTL LPOUT - LINE PRINTER TIMEOUT ENTRY POINT›œ;A�; DEVICE TIMEOUT RESULTS IN A NOT READY MESSAGE BEING OUTPUT ATSEž; A SYSGEN SPECIFIED INTERVAL. TIMEOUTS ARE CAUSED BY POWERFAILURE;!Ÿ; AND PRINTER FAULT CONDITIONS.  ;N ¡ .ENABL LSBB¢LPOUT:£ .IF DF K$$MLP¤4¥ BIT #KP.OFL,S.KTB+2(R4) ;;; VERIFY PORT IS ONLINE#¦ BNE 10$ ;;; IF NE, IT'S OFFLINES.§ MOV S.KTB+2(R4),R0 ;;; GET ADDRESS OF KMC11.¨ BEQ 10$ ;;; IF EQ, THIS PRINTER NOT ON KMCA© BIT #KMCLOA,K.PRM(R0) ;;; IS THE MICROCODE LOADED FOR THE KMC?Mª BEQ 10$ ;;; IF EQ, NO#« JMP LKOUT ;;; DO TIMEOUT FOR LKE¬­ .ENDC ; DF K$$MLP®$¯10$: MOV @S.KRB(R4),R3 ;;; GET CSR+° CLRB (R3) ;;; DISABLE PRINTER INTERRUPTN ± MTPS #0 ;;; ALLOW INTERRUPTS(²LPOUT1: MOV R5,R3 ; CALCULATE ADDRESS7³ MOV #IE.A00­j�<�±|t÷tø tþfDATABO&377,R0 ; ASSUME REQUEST IS TO BE ABORTED0´ ADD #U.CW2,R3 ; ADJUST TO PRINTER STATUS WORD"µ BIT #ABRT,(R3) ; ABORT REQUEST?¶ BEQ 70$ ; IF EQ, NO 0¶ CALL @IODON ; FINISH I/O OPERATION ; BM380¸ JMP LPINI ; ;**-1T*¹70$: MOV @S.KRB(R4),R2 ; GET CSR ADDRESSº TST (R2) ; PRINTER READY?/» BMI DEVNR ; DEVICE NOT READY(ERROR BIT SET)49¼ BITB #TMONO,S.STS(R4) ; WAS TIMEOUT WITH NO ERROR BIT?P½ BNE 71$ ; IF NE, YES?¾ BISB #TMONO,S.STS(R4) ; NO, SET THE BIT(TO CLEAR WHEN IODON)A(¿ JMP LPIN1 ; GO BACK AND PRINT BUFFERÀ@Á71$: BICB #TMONO,S.STS(R4) ; 2 TIMEOUTS WITH NO ERROR => ERROR BR DEVNR ; DEVICE NOT READY à .DSABL LSBCÄ .PAGE8Å .SBTTL LKOUT - KMC11 LINE PRINTER TIMEOUT ENTRY POINTÆÇ;0:È; TIMEOUT PROCESSING IS ENTERED FOR ANY OF THE FOLLOWINGÉ;A;Ê; 1. FOLLOWING AN IO.KIL, IF THE REQUEST IS NOT COMPLETEDT>Ë; NORMALLY BEFORE THE NEXT TIMEOUT CHECK, THEN A HARDWAREÌ; ABORT IS ISSUED HERE.Í;S>Î; 2. AFTER A DEVICE ERROR, THE TIMEOUT SECTION TAKES CARE OF"Ï; ISSUING NOT READY MESSAGES.Ð;TÑÒ .IF DF K$$MLPÓ&ÔLKOUT: MTPS #0 ;;; ALLOW INTERRUPTS;Õ BIT #PWRFLG,U.CW2(R5) ; POWERFAIL RECOVERY IN PROGRESS ? Ö BEQ 99$ ; IF EQ, NOO/× BIC #PWRFLG,U.CW2(R5) ; CLEAR POWERFAIL FLAGI*Ø BIT #ABRT,U.CW2(R5) ; ABORT REQUESTED ?3Ù BNE LKOUT1 ; IF NE, YES, BUT REQUEST IS ALREADYE,Ú ; ABORTED (AND HOW) DUE TO KMC FAILUREBÛ BIT #RQINPR,U.CW2(R5) ; REQUEST IN PROGRESS WHEN WE WENT DOWN ?Ü BEQ 96$ ; IF EQ, NOT4Ý BIC #RQINPR,U.CW2(R5) ; CLEAR REQUEST IN PROGRESS0Þ MOV S.PKT(R4),R1 ; RESTORE I/O PACKET ADDRESS#ß JMP LKIN1 ; AND RESTART REQUESTB2à96$: CLRB S.STS(R4) ; CLEAR FAKE CONTROLLER BUSY1á BICB #US.BSY,U.STS(R5) ; AND DECLARE UNIT IDLE2*â JMP LPINI ; TRY TO ACTIVATE CONTROLLER.ã99$: BIT #ABRT,U.CW2(R5) ; ABORT REQUESTED ?ä BEQ DEVNR ; IF EQ, NOLå%æ CALL WTKMC ; WAIT TILL IT'S READYC&ç MOV #KILL,6(R0) ; SET KILL FUNCTIONè CLR 4(R0) ; NO BUFF ADDR'é CLR R1 ; SCRATCH FOR PRINTER NUMBER#*ê BISB U.UNIT(R5),R1 ; SET IN UNIT NUMBER!ë SWAB R1 ; PUT IT IN HIGH BYTE 7ì MOV R1,2(R0) ; FILL IN PRINTER NUMBER AND START KILL6$í RETURN ; WAIT TIL IT'S ALL OVERîï .ENDC ; DF K$$MLPðñ .PAGE0ò .SBTTL . - DEVICE NOT READY MESSAGE PROCESSORó%ô; PROCESS DEVICE NOT READY MESSAGES;õöDEVNR: ; REF LABELV÷ .IF DF T$$KMGø4ù MOV #T.NDNR,R0 ; SET FOR DEVICE NOT READY MESSAGEúû .IFTF ; DF T$$KMGü/ý MOVB #1,S.CTM(R4) ; SET TIMEOUT FOR 1 SECONDPþÿ .IFT ; DF T$$KMGN, DECB S.STS(R4) ; TIME TO OUTPUT MESSAGE ? BNE 120$ ; IF NE, NO .IF NDF L$$PTOE6 MOVB #15.,S.STS(R4) ; SET TO OUTPUT NEXT MESSAGE IN ; 15. SECONDS   .IFF ; NDF L$$PTO 9  MOVB #L$$PTO,S.STS(R4) ; SET TO OUTPUT NEXT MESSAGE INI  ; L$$PTO SECONDS3  BNE 110$ ; IF NE, LP NOT READY MESSAGES ENABLEDM7 INCB S.STS(R4) ; LP NOT READY MESSAGE NOT WANTED, SO.  BR 120$ ; RE-BUSY CONTROLLER .ENDC ; NDF L$$PTO10110$: CALLR @DVMSG ; OUTPUT MESSAGE ; BM380 ;**-1 .ENDC ; DF T$$KMG120$: RETURN ; OUT !  .DSABL LSBM .PAGE1 .SBTTL LPCAN - LINE PRINTER CANCEL ENTRY POINT5; E; CANCEL I/O OPERATION-FORCE I/O TO COMPLETE IF DEVICE IS NOT READYT;E 7!LPCAN: CMP R1,I.TCB(R0) ;;; REQUEST FOR CURRENT TASK?E" BNE 10$ ;;; IF NE, NOB<# BIS #ABRT,U.CW2(R5) ;;; SET FOR ABORT IF DEVICE NOT READY$% .IF DF K$$MLP&4' BIT #KP.OFL,S.KTB+2(R4) ;;; VERIFY PORT IS ONLINE#( BNE 10$ ;;; IF NE, IT'S OFFLINE0.) MOV S.KTB+2(R4),R0 ;;; GET ADDRESS OF KMC11.* BEQ 10$ ;;; IF EQ, THIS PRINTER NOT ON KMCA+ BIT #KMCLOA,K.PRM(R0) ;;; IS THE MICROCODE LOADED FOR THE KMC? , BEQ 10$ ;;; IF EQ, NOF<- MOVB #1,S.CTM(R4) ;;; FORCE TIMEOUT IN 1 SECOND (OR LESS)./ .ENDC ; DF K$$MLP0110$: RETURN ;;;23 .PAGE/4 .SBTTL LPKRB - KRB STATUS CHANGE ENTRY POINTA5 6; ON ENTRY:R7;*8; R3 = CTB ADDRESS FOR THE CONTROLLER*9; R2 = KRB ADDRESS FOR THE CONT00­r��Ž{´cÚµcÛ¶c�·c›’ROLLER):; 0(SP) = RETURN ADDRESS FOR COMPLETION29;; 2(SP) = RETURN ADDRESS FOR CALLER OF THE EXEC ROUTINEI<;N2=; C = 0 IF THE CALL IS FOR CONTROLLER ONLINE3>; C = 1 IF THE CALL IS FOR CONTROLLER OFFLINE,?;@; $SCERR IS PRESET TO 1RA;MB:BLPKRB: ; CONTROLLER STATUS CHANGE ENTRY POINT ; BM3801B ; AND EXEC VECTOR TRANSLATE ROUTINE ; BM380 B ; BM380B .IF DF K$$MLP ; BM380B ; BM380/B BCS 25$ ; BR IF CONTROLLER OFFLINE ; BM380 B ; BM380!B .IFTF ; DF K$$MLP ; BM380LB ; BM380>B; FILL IN EXEC VECTOR IF WE HAVEN'T DONE SO ALREADY ; BM380B ; BM3802B TST EXEVEC ; EXEC VECTOR TRANSLATED ? ; BM3801B BNE 15$ ; IF NE, YES - DON'T REPEAT. ; BM380T+B MOV R3,-(SP) ; SAVE A REGISTER ; BM380U$B MOV R2,-(SP) ; OR TWO ; BM3801B MOV @#112,R0 ; R0 > TABLE OF ENTRIES ; BM380 <B MOV (R0),R0 ; AND APR BIAS (1ST WORD OF TABLE). ; BM3805B MOV KINAR6,-(SP) ; SAVE I-SPACE MAPPING. ; BM380 =B MOV (R0),KINAR6 ; MAP COMMON THROUGH I-SPACE APR6. ; BM380;2B MOV #EXEVEC,R3 ; R3 > EXEC VECTOR AND ; BM3809B MOV #EXEVCL,R2 ; R2 = LENGTH OF VECTOR AREA. ; BM380E2B CALL @#140004 ; TRANSLATE THE VECTORS. ; BM3807B MOV (SP)+,KINAR6 ; RESTORE I-SPACE MAPPING. ; BM380R$B MOV (SP)+,R2 ; RESTORE ; BM380'B MOV (SP)+,R3 ; REGISTERS ; BM380>%B15$: ; REFERENCE LABEL ; BM3800B ; BM380 B .IFT ; DF K$$MLP ; BM380B ; BM380B ; BM3803F BIT #KPKMC,K.PRM(R2); IS THIS A KMC KRB? ;**-3 $G BEQ 40$ ; IF EQ, NO, JUST RETURN'H MOV R3,KMCCTB ; SAVE LOCATION OF CTBMI MOV R2,R4 ; PUT KRB INTO R4E(J MOV #0,R5 ; MICROCODE FILENAME INDEX7J CALL @ULDRQ ; REQUEST THE MICROCODE LOADER ; BM380T&L BCC 40$ ; BR IF SUCCESSFUL ;**-16M BNE 30$ ; IF NE, NO POOL, REJECT ONLINE TRANSITIONNCN20$: MOVB #IE.NST,@SCERR ; MICROCODE LOADER NOT INSTALLED ; BM3800 P BR 40$ ; AND RETURN ;**-1Q/R25$: BIT #KPKMC,K.PRM(R2) ; IS THIS A KMC KRBM$S BEQ 40$ ; IF EQ, NO, JUST RETURN5T BIC #KMCLOA,K.PRM(R2) ; CLEAR MICROCODE LOADED BITC&U MOV #MC,@(R2) ; MASTER CLEAR KMC-11 V BR 40$ ;W7W30$: MOVB #IE.NOD,@SCERR ; INDICATE NO POOL ; BM380DW ; BM380!W .IFTF ; DF K$$MLP ; BM380$Y ;**-1 Z40$: RETURNBZ ; BM380 Z .IFT ; DF K$$MLP ; BM380Z ; BM380[\ .PAGE/] .SBTTL LPUCB - UCB STATUS CHANGE ENTRY POINT;^ _; ON ENTRY:1`;1a; R5 = ADDRESS OF UCB OR UNIT CHANGIN STATUS"b; R4 = ADDRESS OF SCB OF UNIT3c; R3 = CONTROLLER INDEX (UNDEFINED IF S.KRB=0)C)d; 0(SP) = RETURN ADDRESS FOR COMPLETION9e; 2(SP) = RETURN ADDRESS FOR CALLER OF THE EXEC ROUTINEOf; 2g; C = 0 IF THE CALL IS FOR CONTROLLER ONLINE3h; C = 1 IF THE CALL IS FOR CONTROLLER OFFLINE i;Bj; $SCERR IS PRESET TO 1 "kLPUCB: BCS 10$ ; BR IF OFFLINE,l BIT #1,S.KTB(R4) ; IS THE LP PORT ONLINE!m BEQ 10$ ; IF EQ, YES, ITS OK4m MOVB #IE.CNR,@SCERR ; REJECT TRANSITION ; BM380o ;**-11p10$: BIC #KNOWN,U.CW2(R5) ; SET PRINTER UNKNOWNN q RETURNSrs .ENDC ; DF K$$MLPtu .PAGEv .SBTTL . SUBROUTINESEwx;E*y; SUBROUTINE TO FILL LINE PRINTER BUFFERz;C{,|LPRNT: MOV @S.KRB(R4),R1 ; GET CSR ADDRESS2} MOV U.BUF+2(R5),R0 ; GET ADDRESS OF USER BUFFER~ .IF DF M$$MGE€6€ MOV U.BUF(R5),@KISA6 ; MAP TO USER BUFFER ; BM380‚ ;**-1ƒ .IFTF„!…5$: MOV #5,R2 ; SET LOOP COUNT†10$: TST (R1) ; TEST ERRORT ‡ BPL 20$ ; BRANCH IF NO ERROR4ˆ MOV R5,R3 ; CALCULATE ADDRESS OF RELOCATION BIAS‰ ADD #U.BUF,R3 ;/Š MOV S.PKT(R4),R1 ; GET ADDRESS OF I/O PACKETU+‹ ADD #I.PRM,R1 ; POINT TO RELOCATION BIASL*Œ MOV (R1)+,(R3)+ ; RESET RELOCATION BIAS)� MOV (R1)+,(R3)+ ; RESET BUFFER ADDRESSF#Ž MOV (R1),(R3) ; RESET BYTE COUNTR � SEC ; � RETURN ;"‘20$: TSTB (R1) ; TEST BIT READY ’ BMI 40$ ;3 “ DEC R2 ;” BNE 10$ ; LOOP AGAIN• SEC ; SET BIT CARRYD–30$: MOV R0,U.BUF+2(R5) ; SAVE ADDRESS OF NEXT BYT00­z�<�±|t÷tø tþfDATAE IN USER BUFFER—˜ .IFT3™;™ MOV @KISA6,U.BUF(R5) ; SAVE MAPPING INFORMATION ; BM380M› ;**-1œ .ENDC� ž RETURN ;1Ÿ35$: TST -(R3) ; ADJUST TO PRINTER STATUS WORD(K 40$: BIT #FORM!LFCT!BHLD!BLCT,(R3) ; FORM, LINE FEED, BYTE HELD, OR BLANKF¡ BEQ 50$ ; IF EQ, NOT,¢ BIT #BLCT,(R3) ; ANY BLANKS TO BE OUTPUT?£ BNE 80$ ; IF NE, YES7¤ BIT #BHLD,(R3) ; BYTE HELD BACK FOR CARRIAGE RETURN?A¥ BNE 65$ ; IF NE, YES+¦ BIT #FORM,(R3) ; FORM FEED TO BE OUTPUT?O§ BNE 60$ ; IF NE, YES+¨ SUB #LFBT,(R3)+ ; REDUCE LINE FEED COUNT +© MOVB #12,R2 ; SET TO OUTPUT A LINE FEED ª BR 100$ ;C0«50$: TST U.CNT(R5) ; ANY MORE BYTES TO OUTPUT?¬ BNE 70$ ; IF NE, YES2­ BIT #CRTY,(R3) ; CARIAGE RETURN AT END OF LINE?® BEQ 30$ ; IF EQ, NO.¯ BIC #CRTY,(R3)+ ; CLEAR CARRIAGE RETURN BIT1° MOVB #15,R2 ; SET TO OUTPUT A CARRIAGE RETURNB ± BR 100$ ; ,²60$: BIC #FORM,(R3)+ ; CLEAR FORM FEED BIT+³ MOVB #14,R2 ; SET TO OUTPUT A FORM FEEDE ´ BR 100$ ;O;µ65$: BIC #BHLD,(R3) ; CLEAR BYTE HELD FOR CARRIAGE RETURNF%¶ MOVB 3(R3),R2 ; RETRIEVE HELD BYTET · BR 150$ ; 5¸70$: MOVB (R0)+,R2 ; GET NEXT BYTE FROM USER BUFFER ¹º .IF DF M$$MGE»'¼ BIT #20000,R0 ; OVERFLOW 4K BOUNDRY?E½ BEQ 75$ ; IF EQ, NOB%¾ BIC #20000,R0 ; CLEAR OVERFLOW BIT+4¾ ADD #200,@KISA6 ; UPDATE RELOCATION BIAS ; BM380À ;**-1Á .ENDCÂ+Ã75$: DEC U.CNT(R5) ; DECREMENT BYTE COUNTRÄ CMPB #177,R2 ; RUBOUT?Å BEQ 50$ ; IF EQ, YES,Æ TST (R3)+ ; ADJUST TO HORIZONAL POSITION Ç CMPB #11,R2 ; HORIZONAL TAB?È BNE 90$ ; IF NE, NOI3É MOVB (R3),-(SP) ; GET CURRENT HORIZONAL POSITION;<Ê BIS #177770,(SP) ; CALCULATE BLANK COUNT TO NEXT TAB STOPË NEG (SP) ;$Ì BIS (SP)+,-(R3) ; SET BLANK COUNT&Í80$: DEC (R3)+ ; REDUCE BLANK COUNT'Î MOVB #' ,R2 ; SET TO OUTPUT A BLANKE%Ï90$: BHI 110$ ; IF HI, OUTPUT BYTE1$Ð CMPB #15,R2 ; LF, CR, VT, OR FF?Ñ BLO 110$ ; IF LO, NOÒ CMPB #13,R2 ; VERTICLE TAB?5Ó BEQ 110$ ; IF EQ, YES3-Ô100$: CLRB (R3) ; CLEAR HORIZONAL POSITION, Õ BR 120$ ; 0Ö110$: CMPB (R3),U.CW4(R5) ; CARRIAGE OVERFLOW?× BHIS 35$ ; IF HIS, YES,Ø INCB (R3) ; INCREMENT HORIZONAL POSITION"Ù120$: TST -(R3) ; LS11 PRINTER?ÚÛÜ .IF DF L$$11RÝÞ BMI 150$ ; IF MI, YES+"ß CMPB R2,#15 ; CARRIAGE RETURN?à BHI 130$ ; IF HI, NOá BEQ 160$ ; IF EQ, YESIâ CMPB R2,#14 ; FORM FEED?ã BEQ 140$ ; IF EQ, YESBä CMPB R2,#12 ; LINE FEED?å BEQ 140$ ; IF EQ, YES5æ130$: BIT #CRJT,(R3) ; CARRIAGE RETURN JUST OUTPUT?Rç BEQ 150$ ; IF EQ, NO:è BIS #BHLD,(R3) ; SET BYTE HELD BACK FOR CARRIAGE RETURN&é MOVB R2,3(R3) ; SAVE BYTE HELD BACK/ê MOVB #15,R2 ; SET TO OUTPUT CARRIAGE RETURN :ë140$: BIC #CRJT,(R3) ; CLEAR CARRIAGE RETURN JUST OUTPUTìí .IFTFîï; +ð; TEST THE PRINTER CASE INDICATION IN CW2 &ñ; IF IT DOES NOT INDICATE LOWER CASE-ò; FORCE LOWER CASE CHARACTERS TO UPPER CASE ó;ô150$:2-õ BIT #LOWER,U.CW2(R5) ; LOWER CASE PRINTER?'ö BNE 155$ ; IF NE, YES, SKIP CONVERTJ÷ CMPB #141,R2 ; 'a' OR ABOVEQø BHI 155$ ; IF HI, NO$ù CMPB #172,R2 ; YES, 'z' OR BELOWú BLO 155$ ; IF LO, NO û BIC #40,R2 ; YES, CONVERT IT#ü155$: MOVB R2,2(R1) ; OUTPUT BYTE$ý JMP 5$ ; GO AGAINRþÿ .IFTU8160$: BIS #CRJT,(R3) ; SET CARRIAGE RETURN JUST OUTPUT  JMP 5$ ; .ENDC;S.; SUBROUTINE TO WAIT FOR THE KMC TO BE READY;T ; INPUTS:C ;$ ; R5 = UCB ADDRESS OF THE PRINTER$ ; R4 = SCB ADDRESS OF THE PRINTER ; ; OUTPUTS:;R; R0 = KMC CSR ADDRESSO .IF DF K$$MLP2WTKMC: MOV @S.KTB+2(R4),R0 ; GET KMC CSR ADDRESS$ BIS #RQI,(R0) ; REQUEST KMC INPUT*10$: TST (R0) ; IS THE KMC-11 RUNNING ?0 BPL 20$ ; IF PL, KMC NOT RUNNING - POWERFAIL$ BIT #RDYI,2(R0) ; READY BIT SET ?' BEQ 10$ ; IF EQ, NO, WAIT SOME MORE& BIC #RQI,(R0) ; CLEAR REQUEST INPUT RETURN ; YES, BO BACK;G; WE WERE WAITING FOR THE KMC BUT THE KMC IS NOT RUNNING. THEREFORE,DL; WE WILL GO TO THE POWERFAIL CODE WHICH00­‚�®ƒ�Ž{´cÚµcÛ¶c�·c›’ WILL REQUEST THE MICROCODE LOADERJ; TO RELOAD THE MICROCODE TO THE KMC. IF UNSUCCESSFUL, WE WILL CONTINUE ; PRINTING WITHOUT THE KMC.I!;"?#20$: BIS #PWRFLG!RQINPR,U.CW2(R5) ; SET POWERFAIL IN PROGRESSN/$ TST (SP)+ ; WE WON'T BE RETURNING TO CALLERY(% MOV S.KTB+2(R4),R2 ; GET KRB ADDRESS"& MOV KMCCTB,R3 ; GET CTB ADDRESS&' JMP LKPWF0 ; FINISH IN COMMON CODE( .ENDC ; DF K$$MLP)* .ENDHE KMC BUT THE KMC IS NOT RUNNING. THEREFORE,DL; WE WILL GO TO THE POWERFAIL CODE WHICH .TITLE TTLH .IDENT /X02.32/; ; Authors: BEN LEVIN 14-JUN-84; Tony LekasR;;; X02.04 4-Feb-85 GDS '; Raise priority before calling TTSETR ; ; X02.05 5-Feb-85 GDS+ ; Raise priority before calling FORK alsoT ;E ; X02.06 7-Feb-85 GDSE=; Create new routine for fork calls - use S.KRB+22 for flag.;; to call new entry in TTSET called TTSET1 which will putU5; the terminal driver fork block on the fork queue.S;A; X02.07 7-Feb-85 GDS; Make fork routine work!!!T; No longer need S.KRB+22;u; X02.08 8-Feb-85 GDS4#; Raise priority for call to ODON4;b; X02.09 20-Feb-85 GDS7; Raise priority before calling ICHAR1,MANS, and MHUPa;r; X02.10 27-Feb-85 GDS-; Must save R4 and R5 before calling TTSET1wA; Don't stop taking input into type ahead buffer after receive n; stopped state  ;1!; X02.11 16-Apr-85 GDSE"; Don't bother to check S2.CTS before filling slots. Servers shouldE#; be using credits to control data flow, and we don't always see an$$; XON. This will cause us to hang!,%; (S2.CTS will be cleared at LHSTOX entry)&;eF'; Allow optional parameter of terminal number requested to be passedC(; on start session. A value of zero means next available terminali); may be assigned.*;t+; X02.12 19-Apr-85I,; Change LHLPAR routine to not create a Data_b slot if nothing is being--; changed ( R1 =0)1.; Reduce size of LHLPAR routine and remove BPT.s/;l0; X02.13 22-Apr-85G1; Include fix to $LHOUT routine to check for Data_B slots in transmitc 2; list. 3;3; X02.14 19-FEB-86 EMcK3; Easiest fix for LAT/CTERM bug. Instead of toggling TT's online/offlineuJ3; when we're using them toggle the US.DSB bit (enable read/write). ThisF3; way we'll get our IO.HNG when a user DIS SESS ALL from the server.3;L3; X02.15 21-MAR-86 EMc03; Do not return error on CON ONLINE for units.3;)3; X02.16 21-MAR-86 EMc*3; Set US.DSB bit at CON ONL entry point.3;p#3; X02.17 18-MAR-86 S. R. Cloutiern(3; Add error codes for LAT V5.1 SupportE3; Fix unit select algorithim in $LHSTS to look for unit # correctlyRA3; Add code to return proper error code if error occurs on starti3;e"3; X02.18 1-APR-86 S. R. Cloutier=3; Do not allow start session if NCT has terminal attached. S3; "3; X02.19 8-MAY-86 S. R. Cloutier:3; Reset terminal on disconnect, if application termional3;#3; X02.20 19-JUN-86 S. R. Cloutier <3; Streamline calling sequence to LAT process in initiating-3; connection from LAT application terminal.53;p;3; Add $LHGTD entry point for starting output to Implicit i/3; connections for Lat Application Terminals..o3;e#3; X02.21 23-JUN-86 S. R. Cloutier <3; Add LHDET routine called from TTATT upon DET function to:3; check if terminal session (application only) should be3; disconnected upon detach.n3; !3; X02.22 25-JUN-86 Dale Donchinl<3; fix PRNTO to calculate available buffer space correctly!3; Fix CLEAN to clear UL.NOD 3;t#3; X02.23 26-JUN-86 S. R. Cloutierc=3; Use high 4 bits of U.CREN as Link Status extension, since $3; credits can only be 4 bits long.3;a3; "3; X02.24 7-JUL-86 S. R. Cloutier3;-A3; Make changes to support LE.HIP (Hangup in progress) Sub-staten:3; to prevent loss of data during IO.HNG operations, with,3; data still to be sent to terminal server3;#3; X02.25 23-JUL-86 S. R. Cloutierl3; -3; Change PRNTO to do nothing if U.TOC is 0.o3;l#3; X02.26 31-JUL-86 S. 00®Š�<�±|t÷tø tþfDATAR. Cloutier3;@3; Add more Process Request codes for lat application terminals3;n#3; X02.27 31-JUL-86 S. R. Cloutiert3; 83; Add $LHTMO - Implicit connection timed out or error.3;u"3; X02.28 1-AUG-86 S. R. Cloutier3;E-3; Fix $LHSTP to not corrupt location 0 !!!!e3;l"3; X02.29 4-AUG-86 S. R. Cloutier3;hF3; Change HLMTIM to call LAT process to mark a session for disconnect3; during H.I.P. State!3; Make LTPRC entry point global.3;s3; X0230 20-NOV-86 K. L. NoelS3;CC3; KLN026 -- Make sure LAT lines which are still logged in are notn3; given away3; "3; X0231 1-APR-87 S. R. Cloutier3;E3; SRC -- Add code to start LAT output on a LAT Application Terminal8:3; if output is Non-task in nature (such as a FLF or ^Z)3;a$3; X0232 18-MAY-87 S. R. Cloutier3;RC3; SRC -- do not start session in $LHSTS if terminal is a reserveds3; LAT Application TerminalH3; @3; Don't hang up terminal on 2nd IO.HNG, let lat process finish3; output or time out.4 05; 96; Controller-Dependent routine for LH Device (LAT HOST) 7; G8; LH devices are considered to be remote terminals, connected through G9; the LAT-multiplexer and are always setup in the data base as remote-:; terminals.;;a <; LH port data base structure:H=; LH port belongs to a 'TT' device and has its own DCB (Generic device>; name is 'TT').1?; LH port data base has one contigious SCB/KRB.oB@; LH controller has a CTB, linked to CTB list ($CTLST) and has a4A; generic controller name (L.NAM) 'LH' (LAT host).B;i C; Calls:D; From port to process: 2E; The SCB/KRB block will contain two words with:F; LAT process bias/virtual address. $MPPRO routine willG; map and call it.rH; From process to port:a;I; The first address in the driver dispatch table for the'<J; LH controller will be used by LCP to set up the calling%K; information for the LAT process.tL;sMN .IF DF T$$LTHOP;a!Q; UCB Extentions for LH devices)!R; -----------------------------n"S ; Status/control informationT; U.LINS ; Link status:T; U.CREN ; Transmit credits counter (low 4 bits) ;SRC:T ; Link Status Extension (High 4 bits of U.CREN) ;SRC-V ; Server/circuit identification ;**-1 WX; U.SRVN ; Server numberY; U.SESN ; Session numberh!Z ; Parametrs on receive data [ \; U.RSBB ; Receive slot bias*]; U.RBHA ; Receive slot header virtual#^; U.RSDV ; Receive data virtuale%_ ; XMT intermediate buffer chain-`#a; U.TRLH ; XMT listhead addressl+b; U.TRSC ; XMT remained bytes in buffer 'c; U.SLSZ ; Maximum slot size on XMT4d ; Virtual circuit CCBae%f; U.CCBA ; CCB address (low core)gh;e(i; Link Status Word U.LINS word in UCBj; ----------------k;#########################l;modify UCBDF for these %m; UL.TRS=1 ; 1-XMT stopped, 0-Notc%n ; >255 Char. for slot. Hold it.so(p; UL.TDA=2 ; 1-XMT data avail, 0-Not'q ; Data in XMT queue (set by port)er.s UL.XON=4 ; 1-Notify the process of an XON+t ; 0-Notify the process of output datau)v; UL.RDA=10 ; 1-RCV data avail, 0-Not 'w ; Data in RCV queue (set by proc);x1y UL.NTO=20 ; 1-Non task output pending, o-Notdz6{ UL.NOD=40 ; 1-ODONE call defered because too much"| ; data was buffered, 0 - Not}'~; UL.RSS=100 ; 1-RCV stopped, 0-Not' ; RCV stopped by TTDRV on receive!€ ; if no resources available,�'‚; UL.LEN=200 ; 1-Link enable, 0-Nott'ƒ ; toggled by start/stop link calle„; >„; Link Statue Extension bits (High 4 bits of U.CREN) ;SRC„; ;SRCa+„;LE.HIP=20 ; hangup in progress ;SRCs1„ ; set if LHMTIM is called by terminal ;SRCt.„ ; driver before all available data ;SRC'„ ; has been sent to server. ;SRCa3„ ; subsequent I/O will not complete until ;SRCs3„ ; data has been sent, and bit is cleared ;SRCv„ ; ;SRCe/„;LE.TDC=40 ; Transmit data completed ;SRC /„ ; Bit set during00®’�ƒ�Ž{´cÚµcÛ¶c�·c›’ .HIP when the data ;SRCk(„ ; has all been transmitted. ;SRC„ ; ;SRCU/„;LE.CIP=100 ; Connection in progress ;SRC 4„ ; Bit set when a connection to a terminal ;SRC2„ ; server is pending. Set after output ;SRC:„ ; has been attempted to a Lat Application Term, ;SRC6„ ; but no connection has been established to ;SRC4„ ; the terminal server associated with the ;SRC„ ; terminal. ;SRC„ ; ;SRCs<„LE.ORG=200 ; Bit set by $LHSTS if connection result ;SRC-„ ; of IO.ORG (Explicit connection) ;SRCd„ ; ;SRC „; ;SRC=„; ;SRCi„; Error Codes ;SRC„; ----------- ;SRCM„; NOTE: Do not change there codes without checking LAT process module ;SRCeF„; LATPRT. Some of there codes are common to both, and are not ;SRCC„; globaly defined. Adding a code will not cause a problem. ;SRCw„ ;SRC‡ER$SUC=0 ; Sucess ;**-2 %ˆER$MLE=-1 ; Maximum links exeededL$‰ER$IDN=-2 ; Incorrect identifyer%ŠER$SYN=-3 ; Synchronization errord(‹ER$UDC=-4 ; Undefined operation code*ŒER$NDR=-5 ; No data ready for transmit'�ER$LND=-6 ; LH data base not loadedO%ŽER$NRR=-7 ; No receive data readyh%�ER$OVR=-10 ; Data overrun occuredA'�ER$SIU=-11 ; Service In Use ;SRCb*�ER$PNU=-12 ; Port Name Unknown ;SRC,�ER$SNO=-13 ; Service Not offered ;SRC‘; ;**-1(’; Process-to-Port Call Operation Codes(“; ------------------------------------”PR$STS=0 ; Start session•PR$RCV=2 ; Receive–PR$XMT=4 ; Transmit-—PR$DSC=6 ; Stop sessione9—PR$GTD=10 ; Get transmit data for app. terminal ;SRC B—PR$TMO=12 ; Connect request timed out in implicit connect ;SRC™; ;**-1#š; Port-to-Process Operation CodesS#›; ------------------------------- +œPO$DSC=0 ; Stop session ("BYE" by task);*�;PO$FLO=2 ; Flow control status change!ž;PO$HST=2 ; Host sync toggleda%Ÿ;PO$TST=4 ; Terminal sync toggeld- PO$XON=6 ; XON-¡;PO$XOF=10 ; XOFF (possible data overrun)¢PO$ABO=12 ; Abort output£PO$OUT=14 ; Start output5£PO$MSD==16 ; Mark a session for disconnect ;SRCB£PO$CNT=20 ; initiate implicit connection from terminal ser;SRC5£PO$ORG==22 ; ininate connection from IO.ORG ;SRCS(£PO$GQD==24 ; Get QUEUE depth ;SRC2£PO$MAP==26 ; Set/Get Mapping parameters ;SRC¥; ;**-1¦; LAT Message Header Offsets§; --------------------------¨SL$SID=1 ; Slot ident©SL$SBC=2 ; Slot byte countªSL$TYP=3 ; Slot type«SL$SDS=4 ; Slot data start¬­;®; Buffer type codesp¯; -----------------r6°BF$NOR=0 ; Normal data. Includes non task output.$±BF$RPR=1 ; IO.RPR Prompt string.(²BF$FLO=2 ; Flow control information.³´;I$µ; Maximum number of queued buffers$¶; --------------------------------·;M ¸MAXBUF=4¹º;S»;+++¼; %½ .MCALL DCBDF$,UCBDF$,CTBDF$,SCBDF$s¾ .MCALL UCBDF$,CCBDF$-¿À DCBDF$ ; Define DCBÁ UCBDF$ ,,TTDEF ; Define UCBu CTBDF$ ; Define CTBà SCBDF$ ; Define SCBÄ CCBDF$ ; Define CCBÅ tÆ .PSECT MAP6Ç;-DÇ; $LHGTD - Get transmit data from task, and start output. ;SRCIÇ; this is called by LAT process upon terminal server establishing ;SRCoPÇ; connection to Lat Application Terminal during an IMPLICIT connection. ;SRCJÇ; Completion of I/O is delayed until connection is established and ;SRC#Ç; must be re-started.. ;SRC-Ç; ;SRC -Ç; Inputs: R5 - pointer to U.TSTA ;SRCÇ; ;SRCC.Ç$LHGTD::MOV R1,R5 ; Point to U.TSTA ;SRC&Ç CALL MUCBX ; Map the UCBX ;SRC(Ç TST U.TCO(R4) ; Task output? ;SRC<Ç BNE LHSTAX ; if so, fall through to start output. ;SRC,Ç TSTB U.TOC(R4) ; Non-Task output? ;SRC.Ç BNE LHSTAX ; if NE, yes - go do it. ;SRC5Ç RETURN ; Else return - could be bad call.. ;SRCaÇ; ;SRCnÇ; ;SRC %È; LHSTAX - Start Output Entry PointRÉ; Ê; Input:AË; Registers R2-R5 are standard f00®š�<�±|t÷tø tþfDATAor controller-dependent routine;Ì;!Í; R2 - Phisical unit number * 2S&Î; (only if multiplexers in system)Ï; +Ð; R3 - CSR address (unused for LH device)CÑ; R4 - UCBX addressoÒ; R5 - Pointer to U.TSTAÓ; Ô;Õ;T ÖLHSTAX::9Ö CLRB U.TOTI(R4) ; LAT process deals with timers ;SRCo"Ö MOV R1,-(SP) ; Save R1 ;SRC"Ö MOV R2,-(SP) ; Save R2 ;SRCÖ; ;SRCAÖ BIT #S6.LAT,U.TST6-U.TSTA(R5) ; Lat Application Terminal? ;SRC/Ö BEQ 7$ ; if EQ - no, normal output.. ;SRCn8Ö BITB #UL.LEN,U.LINS-U.TSTA(R5) ; link Enabled? ;SRC+Ö BNE 7$ ; If NE - Yes, continue.. ;SRCsÖ; ;SRC-PÖ; here, we have output, but no link is enabled on an application terminal ;SRCLÖ; We must call the LAT process, and try to establish the connection. ;SRCÖ; ;SRCDÖ BISB #LE.CIP,U.CREN-U.TSTA(R5) ; Show connection in progress ;SRCDÖ BISB #US.DSB,U.STS-U.TSTA(R5) ; Toggle read/write so no more ;SRC)Ö ; I/O is possible to this TT ;SRCn)Ö ; until connection completes ;SRC./Ö MOV #PO$CNT,R3 ; show connect reason ;SRC +Ö CALL LTPRC ; call LAT process.. ;SRC +Ö MOV (SP)+,R2 ; Restore Registers ;SRCnÖ MOV (SP)+,R1 ; And ;SRCrÖ RETURN ; Return ;SRCeÖ ;SRCÖ7$: ;SRCcÖ; ;SRC%Ö ; Buffer chain in U.TFOB ;SRCN*Û ; Check high priority output ;**-48Ü BIT #S5.HPC,U.TST5-U.TSTA(R5) ; High priority output? Ý BEQ OUTPUT ; Branch if notÞ&ß ; XON or XOF bits set. Let lat(à ; know and exit (no odone call!)2á BIT #S5.XOF,U.TST5-U.TSTA(R5) ; Output an XOFF?â BEQ 10$ ; Branch if notM5ã BIC #S5.XOF,U.TST5-U.TSTA(R5) ; Yes-clear XOFF bitR7ä BISB #UL.RSS,U.LINS-U.TSTA(R5) ; RCV-STOPPED on link !å BR IODON ; All done for nowæ; ç; Not XOFF, must be XONrè;n4é10$: BIC #S5.XON,U.TST5-U.TSTA(R5) ; Clear XON bit7ê BICB #UL.RSS,U.LINS-U.TSTA(R5) ; RCV-STOPPED clearedo7ë BISB #UL.XON,U.LINS-U.TSTA(R5) ; Set reason for forkO&ì BR DOFORK ; Jump to call processí0îOUTPUT: ; Continue normal priority output:ï BICB #UL.XON,U.LINS-U.TSTA(R5) ; Settup reason for fork!ð TST U.TCO(R4) ; Task output?Y(ñ BNE 5$ ; If NE yes - go process itò*ó CALL PRNTO ; Process non task outputô BR DOFORK ; And exitõõ5$: ;SRCO@÷ MOV U.TRLH-U.TSTA(R5),R1 ; R1-XMT buffers chain starts ;**-1/ø BEQ 30$ ; Branch if there is no XMT chaina+ù10$: TST (R1) ; There is an XMT chain- ú BEQ 20$ ; Find end ofKû MOV (R1),R1 ; XMTsü BR 10$ ; Chain:ý20$: MOV U.TFOB(R4),(R1) ; Link new chain to XMT chain(þ BR 50$ ; And go to stamp new chainFÿ30$: MOV U.TFOB(R4),U.TRLH-U.TSTA(R5) ; No XMT chain-create it (link# ; new buffers to xmt chain) $ ; Stamp all new chain with 0! ; In the left byte of the.& ; Second word-don't deallocate ; this buffer in LHOUT950$: MOV U.TFOB(R4),R1 ; R1-first buffer in new chainn2 MOV #BF$RPR,R3 ; Assume that this is a prompt@  BIT #S5.RPO,U.TST5-U.TSTA(R5) ; Is prompt output in progress?!  BNE 60$ ; If NE yes - go on   ASSUME BF$NOR,0$  CLR R3 ; This is normal output+  CLR U.TFOB(R4) ; Take the buffers fromi ; the class driver,60$: MOVB R3,3(R1) ; Set the buffer type TST (R1) ; Last buffer?e- BEQ 100$ ; If 0-YES, chain done, branche* MOV (R1),R1 ; If not-get next buffer BR 60$ ; And repeate(100$: CLR U.TOP(R4) ; First buffer=0& CLR U.TOC(R4) ; Remaining bytes=06 BISB #UL.TDA,U.LINS-U.TSTA(R5) ; Set XMT-DATA-AVAIL DOFORK:$$ CALL PRIFRK ; Do priority fork#IODON: MOV (SP)+,R2 ; Registers  MOV (SP)+,R1 ; And ' MTPS #TTPRI ; Raise to priority 5 ) SAVNR ; Save and restore R4 and R5S+ CALL TTSET1 ; Go put TT fork block onf  ; fork queue if needed! MTPS #0 ; Back to zero " RETURN # t$;nA%; Called by terminal driver on IO.KILL. All data in XMT buffers <&; will be lost. LAT processor will be 00®¢�ƒ�Ž{´cÚµcÛ¶c�·c›’called to cancel all,'; pending transmit and receive operations.(; )LHABOX::'* CALL CLEAN ; Clean up the buffersO(+ MOV #PO$ABO,R3 ; Param-abort output#, CALL LTPRC ; Call LAT process - RETURNi-; ;SRC . S/;n60; Terminal driver calls to do a time-out processing.A1; This entry point will be called on IO.HNG or "BYE" command to /2; disconnect link and logoff remote terminal.n2; ;SRCLI2; If and transmit data is still outstanding, the session is marked ;SRCtK2; for hangup (HIP) in the status extension. The LAT process is then ;SRCK2; called to mark the session block disconnect in progress (DIP), the ;SRCuK2; IO.HNG or IO.DET I/O packet is saved and a return is executed back ;SRC82; to PPHNG in TTATT, which calls this routine. ;SRCI2; The terminal is disabled from receiving any new data I/O packets ;SRC2; (US.DSB set). ;SRCr2; ;SRCL2; Once all the transmit data has been sent to the server, the session ;SRCK2; block is cleaned up, the session is disonnected, and the IO.HNG or ;SRCs02; IO.DET is finished ($IOFIN called). ;SRC2; ;SRCoJ2; If this routine is called a 2nd time, for any reason, the session ;SRC-2; is unconditionaly disconnected. ;SRC,2; ;SRCo2; ;SRC $2; INPUTS: IF DF T$$OVL ;SRC&2; R5 - U.TSTA of terminal ;SRC2; ;SRC;42; 6(SP) = IRP Address of IO.HNG or IO.DET ;SRC(2; 4(SP) = Return PC in PPHNG ;SRC&2; 2(SP) = KINAR5 or TTATT ;SRC(2; (SP) = Return PC in MPROT ;SRC2; ;SRCi2; .IF NDF T$$OVL ;SRC&2; R5 - U.TSTA of terminal ;SRC2; ;SRCi42; 2(SP) = IRP Address of IO.HNG or IO.DET ;SRC(2; (SP) = Return PC in TTATT ;SRC2; ;SRC 2LHMTIM:: ;SRCDF2 BITB #UL.TDA,U.LINS-U.TSTA(R5) ; is there transmit data avail? ;SRC.2 BEQ 5$ ; if EQ - no, hang up line.. ;SRC=2 BITB #LE.HIP,U.CREN-U.TSTA(R5) ; Hangup In progress? ;SRC(,2 BNE 5$ ; if NE - yes, hang it up! ;SRC@2 BISB #LE.HIP,U.CREN-U.TSTA(R5) ; show hangup in progress ;SRC:2 BISB #US.DSB,U.STS-U.TSTA(R5) ; Toggle read/write ;SRC2 ;SRC2 .IF DF T$$OVL ;SRC2 ;SRC-2 MOV 6(SP),R0 ; Recover IRP address ;SRC)2 CLR 6(SP) ; Clear IRP address ;SRC2 ;SRC2 .IFF ;T$$OVL ;SRCa2 ;SRC-2 MOV 2(SP),R0 ; Recover IRP address ;SRC )2 CLR 2(SP) ; Clear IRP address ;SRCa2 ;SRC2 .ENDC ;T$$OVL ;SRC2 ;SRC82 MOV #PO$MSD,R3 ; Function - Mark SES disconnect;SRC/2 CALL LTPRC ; Call LAT process direct ;SRCT,2 TST R0 ; Did LAT take I/O packet? ;SRC02 BEQ 20$ ; if EQ, yes - Let LAT try to ;SRC)2 ; send remaining data before ;SRC2 ; hanging up line ;SRC 2 .IF DF T$$OVL ;SRC2 ;SRC-2 MOV R0,6(SP) ; Recover IRP address ;SRCe2 ;SRC2 .IFF ;T$$OVL ;SRCa2 ;SRC-2 MOV R0,2(SP) ; Recover IRP address ;SRCS2 ;SRC2 .ENDC ;T$$OVL ;SRCA2 BICB #LE.HIP,U.CREN-U.TSTA(R5) ; Clear Hangup in Progress ;SRC 2; ;SRCT;25$: MOV #PO$DSC,R3 ; Function code-disconnect line ;SRC,%27$: MOV R1,-(SP) ; Save R1 ;SRCe:2 BICB #17,U.CREN-U.TSTA(R5) ; Clear credits field ;SRC0< CALL LTPRC ; Call LAT process direct ;**-9+= MOV R5,R1 ; R1-UCB address for $LHSTP;,> CALL $LHSTP ; Stop line-will call MHUP? ; And clear the lineE? BIT #S6.LAT,U.TST6-U.TSTA(R5) ; Is this a Lat Application Term;SRC;)? BEQ 10$ ; if not, just return ;SRCU+? MOV #-1,R3 ; Set up R3 for call ;SRC*? CALL LHST1 ; Reset terminal... ;SRC.?10$: MOV (SP)+,R1 ; Restore register ;SRC?20$: RETURN ;SRCB ;**-2UC;(GD; Line parameters have changed. Only flow control change informationeFE; is processed for now. A buffer will be allocated and the info put F; in it.G;l HLHLPAR::I MOV R1,-(SP)a,J BEQ 40$ ; If EQ, Nothing b00®ª�<�±|t÷tø tþfDATAeing changedK MOV R0,-(SP)pL MOV R2,-(SP);(M CALL ALTB ; Allocate T$$BFL buffer/N BCS 30$ ; If CS, No buffer - report error#O ; Link word cleared in ALTB &P MOVB #BF$FLO,3(R2) ; Set the type.Q MOVB R1,4(R2) ; Fill in the control flags-R MOV U.SCB-U.TSTA(R5),R0 ; Get SCB addressa9S MOVB S.KRB+6(R0),2(R2) ; Fill in the Data_b slot sizesT1U MOV R5,R0 ; Compute address of buffer chaintV ADD #U.TRLH-U.TSTA,R0 ; ...W10$:-X TST (R0) ; Any link? (Also clear carry)a)Y BEQ 20$ ; If EQ, End of chain found,Z MOV (R0),R0 ; Get next buffer in chain+[ BR 10$ ; Loop till end of chain found\20$:$] MOV R2,(R0) ; New end of chain^30$:%_ MOV (SP)+,R2 ; Restore registers ` MOV (SP)+,R0 ; ...aa40$:b MOV (SP)+,R1 ; ... c RETURN ; Returnde;(@e; If CON ONL set the write disabled bit and let it rip. ;EMCFe; If CON OFF return an error so nobody can muck with our TT's. ;EMCe; ;EMC;eLHUONL:: ;EMCrAe BISB #US.DSB,U.STS-U.TSTA(R5) ; disable read/writes on TT ;EMC e RETURN ;EMCjLHUOFF:: ;**-46k MOVB #IE.DNR,$SCERR ; Return error code in $SCERR l RETURNn mLHSTOX::>n BIC #S2.CTS,-U.TSTA(R5) ; We can't be XOFFed fromo ; a server pLHCOFF:: qLHCONL:: rLHCPUP:: sLHUPUP:: tLHPWUP:: uLHRESX::v RETURN ; And exitw p xPRIFRK:y MOV R4,-(SP) ; Save R4s+z MOV #FR.LAT,R3 ; LAT fork mask bit set '{ MTPS #TTPRI ; Raise to priority 5/| CALL FORK ; Queue fork block (R4 altered)t} MTPS #0 ; Back to zero~ MOV (SP)+,R4 ; Restore R4  RETURN € N�;EN‚; Data message received from server. Each UCB contains bias/virtual addressKƒ; of a slot header for that link. The slot header contains the slot data„; size byte.…;N†; Look through UCB chain and send to TTDRV all slots where the "receive data‡; available" bit is set.ˆ;MI‰; If a slot is done, then the data counter in the slot header will be 0rQŠ; and the C.STS word in the CCB (number of slots in buffer) will be decrementede ‹; by 1.(Œ;RH�; If "RCV-STOPPED" state is set (TTDRV back-offed with XOFF because ofHŽ; resources allocation failure) data will not be copied from the slot.-�; Check RSV-STOPPED on entry and after eacht@�; return from ttdrv when outputting a character (ICHAR1 call).I‘; In this case data slot counter will contain number of characters leftG’; in slot, and U.RSDV will contain address (virtual) of the next byte-“; to output. C.STS will not be decremented.o”; •; Note:lJ–; UL.RDA bit is set by lat process only for lines, that have information$—; available for current operation.˜;r ™; Input:š; None ›; Output:o"œ; R3-status: 0-success, <0-error�; R1,R2-Destroyedyž; Other registers - preserved Ÿ; Usage:' ; R5 - U.TSTA address of current UCB ¡; R2 - LH'S DCB addresst¢;l £$LHINP::¤ CLR R3 ; Assume successn!¥ CLR R2 ; First entry in DCBe(¦10$: CALL FNDUCB ; Find next LH UCB§ TST R5 ; Next UCB found?¨ BNE 20$ ; Branch if yesR© ; No more UCBSª RETURN ; And exit«*¬20$: ; R5-next (first) UCB'S U.TSTA0­ BITB #UL.LEN,U.LINS-U.TSTA(R5) ; Link enable?® BEQ 10$ ; No-get next UCBr;¯ BITB #UL.RDA,U.LINS-U.TSTA(R5) ; Receive data available? ° BEQ 10$ ; No-get next UCBo±;rE²; The following code can be used when the LAT architecture providesAH³; a way to send the XOFF charcter to stop the server from sending moreH´; data. Meanwhile, the LAT Process tests this bit, and will not extendGµ; any more credits to the server until it is cleared. Note - there is A¶; still room in the typeahead buffer for a few more characters! ·;k>¸; BITB #UL.RSS,U.LINS-U.TSTA(R5) ; RCV-STOPPED on that link?¹; BEQ 25$ ; No-copy slota º; BR 10$ ; And get next UCB»)¼25$: ; UCB found-prepare copy slots$½ MOV R2,-(SP) ; Save DCB address8¾ MOV U.RBHA-U.TSTA(R5),R1 ; R1-slot header V.A. start4¿ ADD #SL$SBC,R00®²�ƒ�Ž{´cÚµcÛ¶c�·c›’1 ; R1-slot size byte virtual addr(À MOV R1,R4 ; Save it (needed later)-Á MOV #-1,R2 ; R2<0 (get char. operation)r/ CALL GCHR ; Returns R2-slot size on righthà CLR R0 ; Prepeare R0Ä BISB R2,R0 ; R0-slot sizeS7Å MOV U.RSDV-U.TSTA(R5),R1 ; R1-slot data virt. start5Æ*Ç30$: ; Loop-move slot char. in loop-È MOV #-1,R2 ; R2<0 (get char. operation)y-É CALL GCHR ; Get character (R2 on right)"Ê MOV R0,-(SP) ; Save registersË MOV R1,-(SP) ;Ì MOV R4,-(SP) ;1'Í MTPS #TTPRI ; Raise to priority 54/Î CALL ICHAR1 ; Move char. from R2 to TTDRVRÏ MTPS #0 ; Back to zero%Ð MOV (SP)+,R4 ; Restore registers Ñ MOV (SP)+,R1 ;;Ò MOV (SP)+,R0 ; &Ó INC R1 ; Point to next character=Ô BITB #UL.RSS,U.LINS-U.TSTA(R5) ; RCV-STOPPED on that link?oÕ BNE 40$ ; Yes-process it&Ö SOB R0,30$ ; Copy all characters1×35$: MOV U.CCBA-U.TSTA(R5),R2 ; R2-CCB address*Ø CLR U.CCBA-U.TSTA(R5) ; Show slot done,Ù DEC C.STS(R2) ; Decrement slots counter@Ú BICB #UL.RDA,U.LINS-U.TSTA(R5) ; Clear receive data availableÛ;tKÜ; When the entire slot has been processed do not update the slot counter. GÝ; This is not necessary and it allows the LAT process to use one slott*Þ; for multiple start session slots.ß;C#à BR 50$ ; Slot done-process it á"â40$: ; Slot done or stopped)ã DEC R0 ; Was not decremented by SOBA+ä BEQ 35$ ; Branch if it is really doneS9å MOV R1,U.RSDV-U.TSTA(R5) ; Store current data virtualo0æ MOV R4,R1 ; Restore slot data counter addr%ç MOV R0,R2 ; R2>=0-put operationh,è CALL GCHR ; Put counter in slot header+é50$: MOV (SP)+,R2 ; Restore DCB addresse$ê CLR R3 ; Return status-successë BR 10$ ; Get next UCBpì aí;#########################î;update commentsï;p>ð; The port scans the UCB chain to find the corresponding UCB?ñ; (session/server IDS) and fills the output buffer. The scane'ò; starts from the specified UCB (R1).;ó;eDô; After filling each slot the credits counter is decremented by 1.Cõ; If the credits counter is 0, no information will be transferredn2ö; to the output buffer for this particular link.÷;dEø; Operation fills the output buffer according to next set of rules:C>ù; - Go through all UCBs and fill all slots for UCBs with theú; UL.TDA bit set;e7û; - Stop when there is no more room in output buffer;rBü; - If there is room in the buffer after the path through all ofAý; the UCBs has been made and there is XMT-STOPPED links startt/þ; again if there are any credits available;sGÿ; - the message is filled until the message maximum length is reachedf.; or until all of the data has been moved.;l ; Input:F; R1 - UCB address to start scanning or 0 (start from the beginning); R2 - Server number$; R4 - Address of CCB, containing:; Buffer bias C.BUFo7; Buffer virtual addr C.BUF+2 -After message header .; Buffer length C.CNT -Without MSG header0 ; Maximum slot length to fill out is in U.SLSZ ;t ; Output: * ; R1 - UCB address were scan was stopped ; R2 - Server numberM; R3 - Status: 0-success, >0-number of links in XMT-STOPPED state, <0-errorb$; R4 - Address of CCB, containing:; Buffer bias C.BUFn6; Virtual end of data C.BUF+2 (next available byte); Remaining in buffer C.CNT;n; ; Note: C; U.TRSC, U.TRSA and UL.TDA are cleared when all of the XMT chain K; has been copied into the output buffer and all XMT buffers deallocated.f;u ; Note:L%; Register 1 is used as a bit mask:dA; - Bit 1 is set if R1, provided on call from LAT process::; contained address of the UCB in the middle of the UCB:; chain or terminal driver call LHSTAX from ODONE call.;; In that case we need to repeate loop once more.)C; - Bit 2 is set if any of the links has a transmit credit.  ;A!;U "$LHOUT::# MOV R1,-(SP) ; Save R1i$ MOV R2,-(SP) ; Save R2t%*& CLR R3 ; Prepare XMT stopped counter00®º�<�±|t÷tø tþfDATA'' CLR R2 ; Start from the beginnings1( CALL FNDUCB ; Ret. DCB (R2) & 1-st UCB (R5) 0) CMP R1,R5 ; LAT calls with 1-st UCB in R1?* BNE 1$ ; Branch if not$+ CLR R1 ; Yes-clear R1 bit mask*, BR 15$ ; And go to process first UCB'-1$: ; Not 1-st UCB in R1 on callp&. TST R1 ; LAT calls with 0 in R1?./ BEQ 15$ ; Yes-start proc. First UCB (R5)(0 ; R1 not EQL 1-st UCB, and not 0$1 ; -LAT calls with UCB in the!2 ; Middle of the UCB chainp,3 MOV R1,R5 ; In R5-UCB address to start)4 MOV #1,R1 ; Set repetition bit mask #5 BR 15$ ; And process that UCB 6'72$: ; Look through all UCB chaina8 CLR R2 ; Start from firste9 CLR R1 ; Clear bit maskA":5$: ; Continue through UCBs$; CALL FNDUCB ; Next (first) UCB< TST R5 ; All UCBs done?R+= BNE 15$ ; No-continue processing UCBS >? ; All UCBs processed/@ BIT #1,R1 ; Do we have request to repeat?e+A BNE 2$ ; Yes-start from the beginningRB ; And clear all maskC"D ; At least once we alreadyE ; Processed all UCBs+F TST R3 ; Any links have been stopped?o$G BEQ 10$ ; No-all done, get outH!I ; There are stopped linkst(J BIT #2,R1 ; Any link has a credit?,K BNE 2$ ; Yes-repeat from the beginningL ; No-get outM,N10$: ; All done-went through all UCBS%O ; No XMT stopped links, or noT$P ; More credits, or buffer isQ ; Full-returnsR MOV (SP)+,R2 ; Restore/S MOV R5,R1 ; UCB address were scan stoppedtT TST (SP)+ ; RegistersrU RETURN ; And exitV5W15$: BITB #UL.LEN,U.LINS-U.TSTA(R5) ; Link enabled?lX BEQ 5$ ; No-get next linkr3Y CMP (SP),U.SRVN-U.TSTA(R5) ; Requested circuit?a Z BNE 5$ ; Not-get next linkZ ;SRCAZ14$: BITB #LE.HIP,U.CREN-U.TSTA(R5) ; hangup in progress? ;SRCl,Z BEQ 114$ ; IF eq - normal output ;SRCCZ BITB #UL.TDA!UL.NTO,U.LINS-U.TSTA(R5) ; XMT data available? ;SRCV0Z BNE 114$ ; if NE, something available ;SRCDZ BISB #LE.TDC,U.CREN-U.TSTA(R5) ; Set Transmit data completed ;SRC%Z BR 16$ ; Format STOP slot ;SRCSZ; ;SRCeBZ114$: BITB #UL.TDA,U.LINS-U.TSTA(R5) ; XMT data available? ;SRC1Z BNE 16$ ; If set -check next condition ;SRCtZ ; UL.TDA not set ;SRCZ ;SRCZ ;SRC>^ BITB #UL.NTO,U.LINS-U.TSTA(R5) ; Did we have stalled ;**-3_ ; non task output?-` BEQ 5$ ; No UL.TDA & no UL.NTO-next UCB;a ; Yes, we did, we did!2b CALL PRNTO ; Try to put it into output queue?c BITB #UL.TDA,U.LINS-U.TSTA(R5) ; Now is there any to output?T"d BEQ 5$ ; If EQ no - next UCBee ;SRCe ;SRCf ASSUME S2.CTS,100000Cg16$:h; Pi; The following lines of code have been commented out because the architectureKj; doesn't allow flow control between server and host with characters, butlOk; instead uses credits to control the flow of data. Therefore, if we have the 'l; the credits, we will send the data.Cm;R0n; TST -U.TSTA(R5) ; XOFFED by user?!o; BMI 5$ ; Yes-get next linktp;a6q; Of course there is a buffer! (Used for debug only)5r; TST C.BUF+2(R4) ; Check if output buffer addr 00!s; BEQ 5$ ; Yes-get next linkn$t ; Test for available credits(u ; Should always be the last test2u MOVB U.CREN-U.TSTA(R5),R0 ; Get credits ;SRCu BIC #177760,R0 ; * ;SRCi+u TSTB R0 ; any credits available? ;SRC &w BLE 5$ ; No-get next link ;**-10x BIS #2,R1 ; Set bit mask-credits availabley ; UCB found (R5)zz; ;SRCt6~ BIT #1,C.BUF+2(R4) ; Slot on even boundary? ;**-3 BEQ 18$ ; Branch if yes4#€ INC C.BUF+2(R4) ; Make it even1� DEC C.CNT(R4) ; Decrement I/O buffer counterf‚18$:‚ ;SRC>‚ BITB #UL.TDA,U.LINS-U.TSTA(R5) ; Transmit data avail? ;SRC-‚ BNE 119$ ; if NE, yes - go get it! ;SRC &‚ ; Else must be completion ;SRC‚ ; of .HIP ;SRC>‚ CMP C.CNT(R4),#SL$SDS 00®Â�ƒ�Ž{´cÚµcÛ¶c�·c›’; I/O buff avail > slot header? ;SRC$‚ BHI 19$ ; Branch if yes ;SRC?‚ BISB #UL.TRS,U.LINS-U.TSTA(R5) ; Set transmitt stopped ;SRCv‚ BR 10$ ; and exit ;SRC‚; ;SRCE‚19$: BICB #LE.HIP,U.CREN-U.TSTA(R5) ; Clear hangup in progress ;SRCO5‚ BICB #17,U.CREN-U.TSTA(R5) ; Clear credits ;SRC."‚ MOV R3,-(SP) ; Save R3 ;SRC"‚ MOV R2,-(SP) ; Save R2 ;SRC9‚ SUB #SL$SDS,C.CNT(R4) ; Subtract out slot header ;SRCo6‚ MOV C.BUF+2(R4),R2 ; Get slot header address ;SRC<‚ ADD #SL$SDS,C.BUF+2(R4) ; Point at next avail. byte ;SRC4‚ MOV #321,R3 ; Slot type, reason code DIAG ;SRC/‚ CALL FILSH ; Fill in the slot header ;SRCe%‚ MOV (SP)+,R2 ; Restore R2 ;SRCB%‚ MOV (SP)+,R3 ; Restore R3 ;SRCa"‚ BR 5$ ; Go do next UCB ;SRC‚ ;SRC0‚119$: ; Copy XMT chain in I/O buffer ;SRC*‚ MOV R2,-(SP) ; Save DCB address ;SRC6‚ MOV R3,-(SP) ; Save R3 (XMT-STOPPED counter) ;SRC*ƒ CLR -(SP) ; Initialize the slot type%„ ; to zero which is for Data_aF2… MOV C.BUF+2(R4),-(SP) ; Save start of the slot;† MOV U.TRLH-U.TSTA(R5),R2 ; R2-first buffer in XMT chain;#‡ ; U.TRSC=0 if new XMT chainV.ˆ TST U.TRSC-U.TSTA(R5) ; All new XMT chain?‰ BNE 20$ ; No-branchŠ ; Yes, new chainA‹ MOVB 2(R2),U.TRSC-U.TSTA(R5) ; U.TRSC-bytes in first XMT buffe=Œ20$: CMP C.CNT(R4),#SL$SDS ; I/O buff avail > slot header?(� BHI 25$ ; Branch if yesu$Ž ; I/O buff avail= BITB #UL.TDA,U.LINS-U.TSTA(R5) ; All buffers moved to slot?% BNE 110$ ; If not-no ODONE callsC BITB #UL.NOD,U.LINS-U.TSTA(R5) ; ODONE deferred because too much ; data buffered?! BEQ 105$ ; If EQ no - Go onM< BICB #UL.NOD,U.LINS-U.TSTA(R5) ; Clear defered ODONE flag) CALL PRIFRK ; Do priority fork call,  BR 110$ ; And go ons E 105$: BIT #S5.RPO,U.TST5-U.TSTA(R5) ; Is prompt output in progress?i0  BEQ 110$ ; If EQ no - ODONE already called  ; ODONE processing MOV R1,-(SP) ; Save R1  MOV R4,-(SP) ; Save R4E* CALL MUCBX ; Returns UCBX addr in R4& ; By now S1.DSI is set by fork  BIC #S1.DSI,(R5) ; Clear it" MTPS #TTPRI ; Raise priority/ CALL ODONE ; And call ODONE for that linkl MTPS #0 ; Back to zero8 BIS #S1.DSI,(R5) ; Reset S1.DSI for other processes& ; Remeber-ODONE corr. R2,R3,R4 MOV (SP)+,R4 ; Restore R4 MOV (SP)+,R1 ; Restore R1& ; ODONE could call LHSTAX with ; Output to do1 BITB #UL.TDA,U.LINS-U.TSTA(R5) ; Is that true?E BEQ 110$ ; Branch if not BIS #2,R1 ; Otherwise-" ; Set mask to repeate loop4 110$: MOV (SP)+,R3 ; Restore XMT-STOPPED counter'! MOV (SP)+,R2 ; Restore DCB address " JMP 5$ ; Get next UCBa#&$200$: CMP (SP)+,(SP)+ ; Incr stack/% MOV (SP)+,R3 ; Restore XMT-STOPPED counter '& MOV (SP)+,R2 ; Restore DCB addressr' JMP 10$ ; And exit( r);<*; The LAT process calls this entry point to start session.M+; The initial setup for link follows all of the rules for remote terminals.fJ,; Look through all UCBs to find disabled units and set up all parametrs.-;O .; Input:L.; R1 - Port number requested or zero for next available port -LO BYTE ;SRCB.; R1 - HI Byte - 100000 set if specific port is requested ;SRC..; 40000 Set if solicited connection ;SRC7.; 20000 Set by $LHSTS if specified port found ;SRC 4.; 10000 Set if connection result of IO.ORG ;SRC.; ;SRCt!.; R2 - Server number ;SRC .; 00®Ò�ƒ�Ž{´cÚµcÛ¶c�·c›’ ;SRCl. ;SRC1; Output: ;**-2k2; R1 - Session number 3; R2 - Unchanged"4; R3 - 0 if success, <0 if error5; R5 - UCB address6;q 7$LHSTS::+8 MOV R2,-(SP) ; Save R2 (server number) 49 MOV #ER$LND,R3 ; Assume error (no LH data base)&: CLR R2 ; Prepeare call to FNDUCB4;5$: CALL FNDUCB ; R2=DCB addr (0 on first call)$< ; Returns R2=DCB address (0)= ; R5-First UCB number &> BCS SEXIT ; Exit if no DCB found?@ ; DCB found $@ TST R5 ; Next UCB found? ;SRC%@ BNE 10$ ; Branch if found ;SRCn@; ;SRCU1@ TST R1 ; Were we requesting a specific ;SRC5#@ BEQ 7$ ; If not, branch ;SRCM0@ BIT #20000,R1 ; Did we find our unit? ;SRC#@ BEQ 6$ ; If not, branch ;SRCa0@ MOV #ER$SIU,R3 ; Service in use error ;SRC@ BR SEXIT ; Exit ;SRCr0@6$: MOV #ER$PNU,R3 ; No such port here ;SRC@ BR SEXIT ; Exit ;SRCn;@7$: MOV #ER$MLE,R3 ; Assume error (MAX. lines exeed;SRC @ BR SEXIT ; Exit ;SRC @ ;SRC-@10$: ; UCB found (R5-UCB address) ;SRC 1@ TST R1 ; Does Process want a specific u;SRCc2@ BEQ 15$ ; If EQ, No - give next one avai;SRC?@ CMPB R1,U.UNIT-U.TSTA(R5) ; Is this the unit requested ;SRC *@ BNE 5$ ; If NE, N0 - look again ;SRC0@ BIS #20000,R1 ; Set bit- we found unit ;SRCE@15$: BIT #S6.LAT,U.TST6-U.TSTA(R5) ; Is this Lat App Terminal? ;SRC (@ BEQ 20$ ; If no, just branch ;SRC6@ BIT #40000,R1 ; Is this solicited connection ;SRC1@ BEQ 5$ ; If EQ - no, don't give this TT;SRCo<@20$: BITB #UL.LEN,U.LINS-U.TSTA(R5) ; Link enabled? ;SRC(@ BNE 5$ ; Get next if enabled ;SRCA@ BIT #1,U.CCBA-U.TSTA(R5) ; Reserved Application Terminal?;SRC ,@ BNE 5$ ; if NE, yes - Check next. ;SRC8@ BIT #F4.NCT,$FMASK+6 ; Does system have NCT...? ;SRC2@ BEQ 30$ ; If no, don't check for NCT att;SRC(@ TST $NCTPT+4 ; Is NCT active? ;SRC1@ BEQ 30$ ; If not, no need to check ATT ;SRC1D@ CMP U.ATT-U.TSTA(R5),$NCTPT+4 ; Does NCT have this unit att? ;SRC1@ BEQ 5$ ; If EQ yes, try for another TT:;SRCT@ ; ;SRClJ@30$: BIT #U2.LOG,U.CW2-U.TSTA(R5) ; Is terminal still logged in? ;KLN026#@ BEQ 5$ ; If eq, yes ;KLN026lN .IF DF T$$SPL ;**-13O+P TST U.TAPR-U.TSTA(R5) ; UCBX allocated?D(Q BEQ 5$ ; If EQ this one is no goodRS .ENDC ;DF T$$SPLrT&U ; Found disabled/requested UCB:U MOV (SP),U.SRVN-U.TSTA(R5) ; Store server number ;SRC#U CLR R3 ; Return success ;SRC;RULHST1: BICB #US.OFL!US.PDF,U.ST2-U.TSTA(R5) ; Set unit online and clear priv;SRCAU BICB #US.DSB!US.CRW,U.STS-U.TSTA(R5) ; Toggle read/write ;SRCr4U CLRB U.LINS-U.TSTA(R5) ; clear link status ;SRC8U CLR U.TRSC-U.TSTA(R5) ; Clear XMT queue counter ;SRC6U CLRB U.CREN-U.TSTA(R5) ; Clear credits field ;SRC*U TST R3 ; New session (R3 Clear) ;SRC0U BNE 5$ ; if NE, no - don't set IO.ORG ;SRC#U BIT #10000,R1 ; IO.ORG? ;SRCoU BEQ 5$ ; if EQ, no ;SRC DU BISB #LE.ORG,U.CREN-U.TSTA(R5) ; Set bit in status extension ;SRC>U5$: MOVB U.SESN-U.TSTA(R5),R1 ; Return session number ;SRC(U ; And link status extension ;SRCB] BIC #S2.CTS,-U.TSTA(R5) ; Make sure not XOFFed ;**-72^ BISB #U2.RMT,U.CW2-U.TSTA(R5) ; Set line remote._ BIC #100000,6(R5) ; No autobaud detectionA_ BIT #S6.LAT,U.TST6-U.TSTA(R5) ; Lat Application Terminal? ;SRCE+_ BEQ 10$ ; if EQ - no, call MANS ;SRC1/_ CLR U.TST5-U.TSTA(R5) ; Reset U.TST5 ;SRC;4_ CLRB U.TMTI-U.TSTA(R5) ; Clear modem timer ;SRC-_ BR 20$ ; Continue in common code.. ;SRCR_; ;SRCs1_10$: MTPS #TTPRI ; Raise to priority 5 ;SRCo0a CALL MANS ; Answer the call-sets all ;**-1'b ; Characteristics & line enable,c MTPS #0 ; Back to zeroc; ;SRC0,c20$: TST R3 ; Called from LHMTIM? ;SRC.c BNE RET1 ; if NE - yes, just return ;SRC;c BISB #UL.LEN,U.LINS-U.TSTA(R5) ; Show link enabled ;SRCU+cSEXIT: MOV (SP)+,R2 ; Restore R2 ;SRCCcRET1: RETURN 00®Ú�<�±|t÷tø tþfDATA ;SRCrc ;SRCc Bc; ;SRC 1c; **-$LHTMO - A solicit has timed out ;SRCMc; ;SRCsMc; This routine is called by LAT Process when a solicit has timed out. ;SRC Nc; Any outstanding I/O is killed, and the current I/O is completed with ;SRCGc; Error status in R3 returned in the IOSB of the issuing task. ;SRCEc; ;SRC ,c; INPUT: R1 - U.TSTA of terminal ;SRCc; R2 - Error code ;SRCVc; ;SRCr%c; OUTPUT: R1 - Unchanged ;SRCR,c; R3 - 0 If success, <0 if error ;SRCq; ;**-13or; Other registers preserveds; As$LHTMO::BIT #S6.LAT,U.TST6-U.TSTA(R1) ; Is this a L.A.T.? ;SRCc%s BEQ ERR1 ; If not, error! ;SRCa"s MOV R0,-(SP) ; Save R0 ;SRC's MOV R2,R0 ; Move error code ;SRCt)s SWAB R0 ; Get code to hi byte ;SRCi/s BISB #IE.DNR,R0 ; Get DNR to lo byte ;SRCR-s BR STP ; Finish I/O, clean up, etc ;SRCos; ;SRCs; ;SRCDs; The LAT process calls this entry point to stop a session. ;SRC<s; In R1 is the UCB address of the session to stop. ;SRCs; ;SRCTs; Input: ;SRCTs; R1 - UCB address ;SRCcs; Output: ;SRCs; R1 - Unchanged ;SRC,s; R3 - 0 if success, <0 if error ;SRCs; R5 - modified ;SRC s; ;SRC (s; Other registers preserved ;SRCs; ;SRCBs$LHSTP:: ;SRCe8s BITB #UL.LEN,U.LINS-U.TSTA(R1) ; Line enabled? ;SRC%s BNE STP1 ; Branch if Yes ;SRCi/sERR1: MOV #ER$SYN,R3 ; Synchr. error ;SRCB!s RETURN ; And return ;SRC s; ;SRC;s; ;SRC 'sSTP1: MOV R0,-(SP) ; Save R0 ;SRCR7s MOV #IE.DNR&377,R0 ; Return DNR error to task ;SRCS,s ; Save reg. destroyed by LHMHUP ;SRC*sSTP: MOV R1,R5 ; R5-UCB address ;SRC#} MOV R1,-(SP) ; Save R1 ;**-9r~ MOV R2,-(SP) ; Save R2; MOV R4,-(SP) ; Save R4e& MOV R0,-(SP) ; Save status ;SRC- CALL MUCBX ; Map UCBX buffer (R4) ;SRCY( CALL CLEAN ; Cleanup buffers ;SRC: BISB #US.DSB,U.STS-U.TSTA(R5) ; Toggle read/write ;SRC8 CLRB U.LINS-U.TSTA(R5) ; Clear all link states ;SRC( MOV (SP)+,R0 ; Restore status ;SRC- MTPS #TTPRI ; Raise to priority 5 ;SRCa6 CALL LHMHUP ; Kill all I/Os and hang the lin;SRC%‰ ; Clobbers R0,R1,R2,R3 ;**-9 Š MTPS #0 ; Back to zero‹ CLR R3 ; Return success(Œ MOV (SP)+,R4 ; Restore(� MOV (SP)+,R2 ; RegistersCŽ MOV (SP)+,R1 ;B� MOV (SP)+,R0 ; � RETURNA‘ ;O‘; --* LHDET - Check to see if Lat Application Terminal session should be ;SRCC‘; disconnected. ;SRC‘; ;SRCs‘; ;SRC+E‘; A session is disconnected if the original connection to the ;SRC;E‘; application terminal at the terminal server was an implicit ;SRC D‘; connection. Lat Process is mapped and called to check the ;SRC*‘; status in the circuit block. ;SRC‘; ;SRC+‘; Called by TTATT ;SRCR‘; ;SRC+-‘; Inputs: R5 - U.TSTA of terminal ;SRCc‘; ;SRCl4‘; Outputs: CS if terminal is to be hung up ;SRC‘; CC if not. ;SRC ‘; ;SRC I‘LHDET:: BITB #LE.ORG,U.CREN-U.TSTA(R5) ; Session result of IO.ORG? ;SRC;0‘ BNE 10$ ; if NE yes, don't hang up TT ;SRC=‘ BITB #LE.HIP,U.CREN-U.TSTA(R5) ; Hangup in progress? ;SRCp0‘ BNE 10$ ; if NE, yes - don't hang up. ;SRC-‘ SEC ; show terminal to be hung up ;SRC‘10$: RETURN ;SRC‘ ’; “; Common Subroutines”;-•; FNDUCB-find next LH UCBc9–; Returns LH port first UCB and next/first UCB address.h —; Input:%˜; R2-DCB address (0 if first entry) #™; R5-Current UCB's U.TSTA addressU š; Output:R›; R2=0 on input:.œ; R2-DCB address (0 if no LH CTB/DCB found)�; R5-First UCB's U.TSTA'ž; Carry set if no LH'S CTB/DCB foundgŸ; R2=DCB on input: ; R2-Unchanged-.¡; R5-Next UCB's address (0 if no more UCBs)¢;e £FNDUCB:R¤ TST R2 ; First entry?C¥ BNE 30$ ; Branch if no00®â�ƒ�Ž{´cÚµcÛ¶c�·c›’tt'¦ MOV $CTLST,R2 ; First CTB in chain(§10$: CMP L.NAM(R2),#"LH ; TT device?¨ BEQ 20$ ; BR if yes:© MOV (R2),R2 ; Next CTB%ª BNE 10$ ; If NE, Check next one « SEC ; CTB not found+¬ RETURN ; Return with no LH data baseL­*®20$: MOV L.DCB(R2),R2 ; R2-DCB address,¯ MOV D.UCB(R2),R5 ; R5-First UCB address° ADD #U.TSTA,R5 ; R5-U.TSTA-± CLC ; CTB found$² RETURN ; R2-DCB, R5-First UCB³?´30$: CMPB U.SESN-U.TSTA(R5),D.UNIT+1(R2) ; Current unit-last?µ BLT 40$ ; BR if notB*¶ CLR R5 ; No more units (return R5=0)· BR 50$ ; And exit )¸40$: ADD D.UCBL(R2),R5 ; R5-Next unit¹50$: RETURN ; And exitº»;1¼; MOVSB - Move source buffer into output buffert ½; Input: ¾; R0 - Number of bytes to copy¿; R5 - UCB address, were:D%À; U.TRLH-U.TSTA - Source address-Á; U.TRSC-U.TSTA - Number of bytes leftB-Â; Send word in U.TRLH buffer-buffer size8Ã; R4 - CCB address, containing output buffer bias/virt5Ä; Output buffer should be biased through APR6. Å; Output:eKÆ; C.BUF+2(R4) Modified - points to the first free byte in the output buffi=Ç; C.CNT(R4) Modified - remaining bytes in the output bufferuÈ;u É; Note:uDÊ; Algorithm works for I/D space and non-I/D space systems. KISARi,;Ë; found for source buffer mapping always maps data space.Ì; Í; All registers preservedtÎ;fÏMOVSB:Ð MOV R0,-(SP) ; Save R0uÑ MOV R1,-(SP) ; Save R1eÒ MOV R2,-(SP) ; Save R2bÓ MOV R3,-(SP) ; Save R3fÔ MOV R4,-(SP) ; Save R4P2Õ SUB R0,C.CNT(R4) ; C.CNT-Avail. in I/O buffer7Ö MOV U.TRLH-U.TSTA(R5),R2 ; R2-Source buffer address4× CLR R1 ; Settup for BISB1Ø BISB 2(R2),R1 ; R1-Number of bytes in buffer *Ù ADD #4,R2 ; R2-Bytes start in buffer"Ú ADD R1,R2 ; R2-End of buffer8Û SUB U.TRSC-U.TSTA(R5),R2 ; R2-Current byte in buffer#Ü MOV R2,R1 ; R1-Source addressVÝ'Þ ; Make R2 APR5 biased for BLXIOa.ß BIC #160000,R2 ; Clear APR number in R2,à BIS #120000,R2 ; Make R2 APR-5 biasedá"â ; Set in R1 bias for BLXIO(ã ASH #-12.,R1 ; R1-Real APR number*2$ä ; ASH may be used here (EIS)#å ; -we are using M-PLUS only2)æ BIC #177761,R1 ; Clear all junk bitsA)ç MOV KISAR0(R1),R1 ; R1-Buffer biasAè+é MOV C.BUF(R4),R3 ; R3-Destination biasS0ê MOV C.BUF+2(R4),R4 ; R4-Destination addressë CALL $BLXIO ; Move dataìí ; R0-Changedî ; R2-Last source byte+1 ï ; R4-Last output byte+1Bð ; R1,R3-PreservedPñ MOV R4,R1 ; Store R4%ò MOV (SP)+,R4 ; Restore CCB in R4 8ó MOV R1,C.BUF+2(R4) ; New current V.A. in outp. buffô MOV (SP)+,R3 ; Restore R3õ MOV (SP)+,R2 ; Restore R2ö MOV (SP)+,R1 ; Restore R1÷ MOV (SP)+,R0 ; Restore R0 ø RETURNMùú;R4û; MUCBX - Map UCBX buffer on call from LAT processü;4 ý; Note:nCþ; Need that only if UCBX is being used on calls from LAT process.ÿ; ; Input:; R5 - U.TSTA ;SRCL; ;**-1 ; Output:R; None;MUCBX: .IF DF T$$SPL ; I/D space systems ,  MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ; Map UCBX-  MOV #120000,R4 ; R4-Virtual UCBX address    .IFF ;T$$SPL   ; Non I/D space systems & MOV U.TUX-U.TSTA(R5),R4 ; Get UCBX .ENDC ;T$$SPL  RETURN  C;f$; PRNTO - Process non task output.;e9; Allocate buffers and move the output into the buffersL.; updating U.TOC and U.TOP+2 in the process.; >; Link these buffers to the end of the U.TRLH chain with the@; buffer type set to zero. (Not prompt or flow control info.);A=; If enough buffers cannot be allocated exit with U.TOC and ?; U.TOP+2 settup for the remainder. Else U.TOC will be zero.;V3 ; If any buffers were added to U.TRLH set UL.TDA.L!; "; Input:#; R5-UCB address$;r%PRNTO:& MOV R0,-(SP) ;' MOV R1,-(SP) ; Save( MOV R2,-(SP) ; Registers) MOV R3,-(SP) ;d* MOV R4,-(SP) ;s+*, CALL MUCBX 00®ê�<�±|t÷tø tþfDATA ; Returns UCBX addr in R4+, TSTB U.TOC(R4) ; anything to do? ;SRC *, BEQ 70$ ; if EQ, just return.. ;SRC6-5$: MOV U.TRLH-U.TSTA(R5),R1 ; R1-XMT buffers chain+. BEQ 30$ ; Branch if there is no chainm&/10$: TST (R1) ; There is a chain-0 BEQ 20$ ; Find end ofe$1 MOV (R1),R1 ; Terminal buffers2 BR 10$ ; Chain$3 ; R1-addr of the last buffer<420$: CMPB #BF$FLO,3(R1) ; Is this a Flow control buffer?-5 BEQ 30$ ; If EQ yes - Don't put in data-6 CMPB #T$$BFL-4,2(R1) ; Is this one full?T'7 BEQ 30$ ; If EQ yes - get new one3725$: MOV R1,R2 ; Settup register for call ;SRC ,9 CALL 200$ ; Move the characters ;**-1: BR 50$ ; Check if done;,<30$: CALL ALTB ; Allocate T$$BFL buffer(= BCS 60$ ; Branch if alloc. failure&> ; Buffer allocated, R2=address&? ; Build dest. buff from source/@ CLR (R2) ; Clear last buffer link pointer A ASSUME BF$NOR,0&B CLR 2(R2) ; Clear count and type%C CALL 200$ ; Move the characters 'D TST R1 ; Is there a U.TRLH chain? E BNE 45$ ; Yes-branch6F MOV R2,U.TRLH-U.TSTA(R5) ; No-new buffer-first oneG BR 50$ ; And out&H45$: ; R1 points to last buffer/I MOV R2,(R1) ; Link buffer to U.TRLH chainr/J50$: TSTB U.TOC(R4) ; Did we do it all yet? K BNE 5$ ; If NE no - Go onL BR 70$ ; All donefM;N60$: BISB #UL.NTO,U.LINS-U.TSTA(R5) ; Note waiting outputO70$: MOV (SP)+,R4 ; Restore P MOV (SP)+,R3 ;eQ MOV (SP)+,R2 ; RegistersaR MOV (SP)+,R1 ; S MOV (SP)+,R0 ;cT RETURN ; And exitU;n0V; Move the data and update counts and pointersW;oX; R2 - Buffer addresstY;5 Z200$: MOV R2,-(SP) ; Save R2"[ CLR -(SP) ; Prepare for BISB,\ BISB 2(R2),(SP) ; Get current in buffer,] MOV (SP),-(SP) ; Duplicate top of stack/] MOV #T$$BFL-4,R0 ; Get buffer size ;DD405 8] SUB (SP),R0 ; get remaining space in buffer ;DD405*a CLR R3 ; Prepare for the BISB ;**-3(b BISB U.TOC(R4),R3 ; R3-string countc CMPB R3,R0 ; Will it fit? )d BHI 230$ ; If HI no - Do one buffere e MOV R3,R0 ; Move all of it,f230$: SUB R0,R3 ; Compute the remaining%g MOVB R3,U.TOC(R4) ; And store itR+h ADD R0,(SP) ; Add in these charactersS3i MOVB (SP)+,2(R2) ; Move byte counter in bufferu8j MOV U.TOP+2(R4),R3 ; R3-source buffer start address+k ADD R0,U.TOP+2(R4) ; Update the sourcen.l ADD #4,R2 ; Data start address in buffer3m ADD (SP)+,R2 ; Address in buffer for this datai7n242$: MOVB (R3)+,(R2)+ ; Move byte from echo buffer "o SOB R0,242$ ; Move all bytes"p ; Destination buffer built9q BISB #UL.TDA,U.LINS-U.TSTA(R5) ; Data is now available r MOV (SP)+,R2 ; Restore R2 s RETURNnt eu;a2v; CLEAN - Cleanup after an abort or stop sessionw;e;x; Deallocate all buffers other than prompt buffers. Clear9y; transmit data available flag. An IO.RPR buffer chain <z; will be the last thing in the list except for a possible:{; DATA_B buffer which will be deallocated along with the|; IO.RPR chain later.};R!~CLEAN: MOV R1,-(SP) ; Save R1  MOV R2,-(SP) ; Save R2/€ MOV U.TRLH-U.TSTA(R5),R2 ; Get the listheadi*€ BEQ 30$ ; Branch if no buffers ;SRC4‚10$: CMPB #BF$RPR,3(R2) ; Is this IO.RPR? ;**-1,ƒ BEQ 30$ ; If EQ yes - Don't deallocate)„ MOV (R2),-(SP) ; Get the next buffer $… CALL DETB ; Delete this buffer'† MOV (SP)+,R2 ; Get the next bufferi)‡ BNE 10$ ; And go on if there is oneAC‡30$: BICB #UL.TDA!UL.NOD,U.LINS-U.TSTA(R5) ; Clear the flag ;SRCn2‰ CLR U.TRLH-U.TSTA(R5) ; Clear XMT queue ;**-1/Š CLR U.TRSC-U.TSTA(R5) ; Clear queue counterA‹ MOV (SP)+,R2eŒ MOV (SP)+,R1Q� RETURN ; And all doneŽ C� .PSECT MAP5�;,D‘; FILSH - Fill in slot header session number and slot length bytes’;a “; Input:”; R2 - Slot header address•; R3 - Slot type3–; C.BUF+2(R4) - Next available byte in I/O buffere—; U.SESN - Slot number˜; ™; Output:eš; Bytes filled00®ò�ƒ�Ž{´cÚµcÛ¶c�·c›’ in slot headerN›;LœFILSH:� MOV R1,-(SP) ; Save R10ž MOV C.BUF+2(R4),R1 ; R1-Next available byte0Ÿ SUB R2,R1 ; R1-Filled bytes in slot (+HDR)1  SUB #SL$SDS,R1 ; Filled bytes without header %¡ MOV @#KISAR6,-(SP) ; Save APR60¢ MOV C.BUF(R4),@#KISAR6 ; Map output buffer5£ MOVB R1,SL$SBC(R2) ; Fill slot counter in header ;¤ MOVB U.SESN-U.TSTA(R5),SL$SID(R2) ; Fill slot identifyera/¥ MOVB R3,SL$TYP(R2) ; Fill in the slot typeb+¦ MOV (SP)+,@#KISAR6 ; Restore mappingl§ MOV (SP)+,R1 ; Restore R1 ¨ RETURN ©ª;R6«; GCHR - Get/Put character from/into unmapped buffer¬;R ­; Input:®; U.RSBB - Buffer bias¯; R1 - Byte virtual addressd°; R2-t*±; <0 - Get character from buffer to R2,²; >=0 - Put character from R2 into buffer³; $´; Output for R2<0 - low byte in R2µ; ¶GCHR:n&· MOV @#KISAR6,-(SP) ; Save APR 66¸ MOV U.RSBB-U.TSTA(R5),@#KISAR6 ; Map input buffer¹ TST R2 ; Test R2º BGE 10$ ; Branch if >=0e» CLR R2 ; Prepare R2+)¼ BISB (R1),R2 ; Move character in R2½ BR 20$ ; Donea/¾10$: MOVB R2,(R1) ; Move character from R2¿20$:0À MOV (SP)+,@#KISAR6 ; Restore APR6 mapping Á RETURNÂÃ;G(Ä; Call to LAT process: (APR 5 always).Å;c;Æ; Call to LAT process is being made using $MPPRO routine. <Ç; Bias of the LAT process is stored in S.KRB+2 of the scb.?È; Virtual address of LAT is stored in the S.KRB+4 of the SCB.TÉ; -ÊFPLAT:: ; This entry included in FRKTBË ; Table in TTDAT module ÌÍ; +Î; Call from fork process comes here with:aÏ; R4-UCBX addressÐ; R5-UCB addressrÑ;Ò MOV R3,-(SP) ; Save R3S3Ó BITB #UL.XON,U.LINS-U.TSTA(R5) ; Called for XON? Ô BEQ 10$ ; If EQ no - go on+Õ MOV #PO$XON,R3 ; Set the function codem!Ö BR CALLT ; Call LAT processs×10$: MOV R0,-(SP) ; Save R0S<Ø BITB #UL.NTO,U.LINS-U.TSTA(R5) ; Non task output pending?,Ù BNE 40$ ; If NE yes - Don't call ODONE@Ú BIT #S5.RPO,U.TST5-U.TSTA(R5) ; Is prompt output in progress?)Û BNE 40$ ; If NE yes - No ODONE callhÜ;iPÝ; Find out how many data buffers we have. If it is too many don't call ODONE.Þ;ß CLR R0 ; Init the count 0à MOV U.TRLH-U.TSTA(R5),R3 ; Get start of list&á BEQ 30$ ; Branch if no more list#â20$: INC R0 ; Update the countr'ã MOV (R3),R3 ; Get the next buffer&ä BNE 20$ ; Branch if there is one#å30$: CMP R0,#MAXBUF ; Too many? "æ BLOS 35$ ; If LOS no - Go on6ç BISB #UL.NOD,U.LINS-U.TSTA(R5) ; Note no ODONE call#è BR 40$ ; And call LAT processOé$ê35$: BIC #S1.DSI,(R5) ; Clear it'ë MTPS #TTPRI ; Raise to priority 5t&ì CALL ODONE ; Process the requestí MTPS #0 ; Back to zero8î BIS #S1.DSI,(R5) ; Reset S1.DSI for other processesï40$: MOV (SP)+,R0I+ð MOV #PO$OUT,R3 ; Set the function code !ñ BR CALLT ; Call LAT process$òó;n?ô; Direct call if priority message has to go out. In this case õ; LAT should not call $LHOUT.Sö; Input parametrs:÷; R3-Operation code;lø; R5-UCB addresscù;AùLTPRC:: ;SRCC"ù MOV R3,-(SP) ; Save R3 ;SRC(ùCALLT: MOV R4,-(SP) ; Save R4 ;SRC3 MOV U.SCB-U.TSTA(R5),R4 ; R4-SCB address ;**-7t  MOV S.KRB+2(R4),-(SP) ; Bias# MOV S.KRB+4(R4),-(SP) ; Virtual:. CALL $MPPRO ; Maps and calls LAT process ; Restores SPL&  MOV (SP)+,R4 ; Restore R4 ;**-3  MOV (SP)+,R3 ; Restore R3  RETURN ; And exit  ;A8; The LAT process calls LAT port at common entry point!; with the function code in R3.s;$$LHDEV:: ; LH port entry point& CLR R4 ; Always controller zero!  MTPS #TTPRI ; Raise to PR5. TTSET$ LH ; Map APR6 for termianl driver MTPS #0 ; Back to zero* CALL LHDEV6 ; Go into the Map6 psect MTPS #TTPRI ; Raise agains" RETURN ; Exit through TTSET .PSECT MAP6$LHDEV6: CLR R2 ; No DCB address, CALL FNDUCB ; Go get first UCB address- MOV U.SCB-U.TSTA(R5),R5 ; Get SCB addr00®ú�¯û�±|t÷tø tþfDATAesse/ MOV S.KRB+10(R5),R1 ; Get input parameters  MOV S.KRB+12(R5),R2 ; ...! MOV S.KRB+14(R5),R3 ; ..." MOV S.KRB+16(R5),R4 ; ...'# MOV R5,-(SP) ; Save address of SCB $$ CALL @LHDSP(R3) ; Call function'% MOV (SP)+,R0 ; Restore SCB addressi5& MOV R1,S.KRB+10(R0) ; Return function parameters' MOV R2,S.KRB+12(R0) ; ....( MOV R3,S.KRB+14(R0) ; ...) MOV R4,S.KRB+16(R0) ; ...* MOV R5,S.KRB+20(R0) ; ... + RETURN,- .ENDC ;T$$LTH./ .ENDCB addr .TITLE LADRV  .IDENT /05.01/A;A(; DIGITAL EQUIPMENT CORP., MAYNARD MASS.; B; COPYRIGHT (c) 1977, 1982, 1984 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;C<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;D;OA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON AIA; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU-$A; SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANYLA; OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADEDA; AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEMOA; AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE TO ANDD=; OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.E;TA; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUTU; EQUIPMENT CORPORATION.; A; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITSI5; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.S;W;,;R; CHARLES A. SAMUELSON; MICHAEL SCHWARTZ; CLARK A. D'ELIAW; ; NOV. 22, 1977L;O; MODIFIED BY:;X?; PKW029 -- MOVE A LABLE SO THAT A SECTION OF CODE IS EXECUTEDH; C; PKW032 -- MAKE SURE ALL OF RANDOM CHANNEL LIST IS MAPPED BY UMRSA'; IMPROVE COMMENTS ON IBUF AND RDAM;O;; LPA11 LABORATORY PERIPHERAL ACCELERATOR CONTROLLER DRIVERN;O;R;O;; MACRO LIBRARY CALLSS;S* .MCALL HWDDF$,PKTDF$,TCBDF$,UCBDF$,SCBDF$% HWDDF$ ;DEFINE HARDWARE REGISTERSP% PKTDF$ ;DEFINE I/O PACKET OFFSETS./ SCBDF$ ;DEFINE STATUS CONTROL BLOCK OFFSETSW- TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS- UCBDF$ ;DEFINE UNIT CONTROL BLOCK OFFSETSC; ; QIO DIRECTIVE DESCRIPTIONS;K; IO.LOD, ... ,'; BUF - BUFFER OF MICRO - CODE TO LOADC#; BUFFER SIZE MUST BE 2048. BYTES #; ISSUEING TASK MUST BE PRIVILEGEDT%; VERIFIES NO ACTIVE USERS FOR LPA11 ; HARDWARE RESETS LPA11"; LOADS AND VERIFIES MICRO - CODE&; STARTS LPA11 AND ENABLES INTERRUPTS,; RETURNS WHEN READY IN INTERRUPT IS POSTED4; THIS IS A TRANSFER FUNCTION-(THE QIO DOES ADDRESS(; CHECKS AND RELOCATES THE USER BUFFER);F; IO.INI, ... ,L/; BUF - BUFFER CONTAINING LPA11 INITIALIZE RDAK*; BUFFER SIZE MUST BE AT LEAS 278. BYTES#; ISSUEING TASK MUST BE PRIVILEGEDR'; SENDS AN INITIALIZE COMMAND TO LPA11A;M"; IO.CLK, ... ,%; MODE - LPA11 CLOCK START MODE WORDEE; CKCSR - IMAGE TO WRITE INTO LPA11 REAL TIME CLOCK CONTROL REGISTEREL; PRESET - IMAGE TO WRITE INTO LPA11 REAL TIME CLOCK PRESET BUFFER REGISTER&; ISSUES AN LPA11 CLOCK START COMMAND;K; IO.STA, ... ,*; BUF - POINTER TO LPA11 SAMPLE START RDA*; BUFFER SIZE MUST BE AT LEAST 40. BYTES.; ISSUES AN LPA11 DATA TRANSFER START COMMAND4; THIS IS A TRANSFER FUNCTION-(THE QIO DOES ADDRESS(; CHECKS AND RELOCATES THE USER BUFFER);O+; SUBFUNCTION CODE DIFFINTIONS FOR IO.STA ;E9; BIT 0 = 0 GIVE AST FOR EVERY BUFFER IF AST SPECIFIEDK5; BIT 0 = 1 GIVE AST ONLY FOR EXCEPTION CONDITIONS1;E;T; IO.STP, ... ,E;T; CALL MUST SUPPLY LUNO+; USERID - USER INDEX NUMBER <0-7> TO STOP>2; STOPPING TASK MUST BE THE SAME AS STARTING TASK;R;Z$; DEFAULT UIC OF LOADER TASK = [1,1];N'TUIC=401 ;DEFAULT UIC OF LOADER TASKI;S;T;S; ASSEMBLY CONDITIONALS ;D; M$$MGE ;MEMORY MANAGEMENT; A$$CHCK ;ADDRESS CHECKN; A$$TRP ;AST SUPPORT"; M$$EXT ;22 BIT 11/70 EXT MEM.$; M$$PRO ;MULTI-PROCESSOR SUPPORT!; R$$MPL ;RSX-11M PLUS SUPPORTC;I;C;I; 00¯‚ƒ�Ž{´cÚµcÛ¶c�·c›’DRIVER DISPATCH TABLE ;  .IF NDF R$$MPL " DDT$ LA,L$$A11,,, .IFFN( DDT$ LA,L$$A11,,,, .ENDC;S .IF GT L$$A11-1;Z,TEMP: .BLKW 1 ;TEMP STORAGE FOR CONT. NUM.;4 .ENDC;U;U .PAGE# .SBTTL ONLINE/OFFLINE ENTRY POINTSN;I$; CONTROLLER STATUS CHANGE ROUTINE;T; INPUTS: R2 = KRB ADDRESS;!; C = 0 ,BRING CONTROLLER ONLINE !; C = 1 ,TAKE CONTROLLER OFFLINE ;M(; OUTPUTS: $SCERR= UNCHANGED FOR SUCCESS!; = ERROR CODE FOR FAILUREV;D;A8; THE LPA11-K IS BOTH A UNIT AND ITS OWN CONTROLLER. ALLD; THE REAL WORK WILL BE DONE AT THE UNIT ONLINE/OFFLINE ENTRY POINT.;N .IF DF R$$MPL#LAKRB: RETURN ;ALWAYS SUCCESSFULR;;;;;;;;;U; UNIT STATUS CHANGE ROUTINE.;T; INPUTS: R3 = CONTROLLER INDEXI; R4 = SCB POINTERU; R5 = UCB POINTER;N; C = 0 ,BRING UNIT ONLINE ; C = 1 ,TAKE UNIT OFFLINEN;(; OUTPUTS: $SCERR= UNCHANGED FOR SUCCESS!; = ERROR CODE FOR FAILUREE;; LAUCB: BCS 100$ ! CALLR LAPWF ;BRING UNIT ONLINE $100$: TST S.PKT(R4) ;ANYONE ACTIVE? BNE 200$ ;YES, BRANCH, MOV #U.LAUT,R0 ;POINT TO ACTIVE USER TABLE ADD R5,R0 ; IN THE UCB:" MOV #8.,R2 ;MAXIMUM OF 8. USERS$110$: TST (R0)+ ;THIS USER ACTIVE? BNE 200$ ;YES, BRANCH DEC R2 ;DECREMENT COUNTER BGT 110$ ;TRY THE NEXT USER( MTPS S.PRI(R4) ;;; LOCK OUT INTERRUPTS2 MOV #40000,@S.CSR(R4) ;;; HARDWARE RESET LPA11-K MTPS #0 ;;; ALLOW INTERRUPTSR% RETURN ;LPA11-K READY FOR OFFLINE15200$: MOVB #IE.RSU&377,$SCERR ;RESOURCE IN USE ERRORK RETURN ;NO OFFLINE YET .ENDC .PAGE: .SBTTL LPA11 DRIVER I/O INITIATOR ENTRY POINT - LAINI -**;;J; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUESTD; IS RECEIVED FOR THE LPA11 LABORATORY PERIPHERAL ACCELERATOR. FIVEE; FUNCTIONS ARE RECOGNIZED BY THE LPA11 DRIVER. SPECIAL USER BUFFERSSF; ARE ADDRESS CHECKED WHERE NECESSARY. ERROR FREE REQUESTS ARE PLACED4; IN THE I/O QUEUE THAT IS MAINTAINED BY THE DRIVER.;G; ADDRESS CHECKING FOR THE USER'S DBP BUFFER IS DONE IN THE QIO ROUTINEF; BEFORE THIS DRIVER IS CALLED.T; ; INPUTS:I;I"; R1=ADDRESS OF I/O REQUEST PACKET$; R4=ADDRESS OF STATUS CONTROL BLOCK9; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATEDH;P ; OUTPUTS:;P;; A QUEUED I/O PACKET WITH USER BUFFERS ADDRESS CHECKED ANDH=; RELOCATED. PACKET MAY BE DEQUEUED WHEN $GTPKT IS CALLED IFH&; IT IS THE ONLY PACKET IN THE QUEUE.;C1; FUNCTION INDEPENDENT I/O REQUEST PACKET FORMAT:I;."; WD. 00 -- I/O QUEUE THREAD WORD./; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBERO0; WD. 02 -- ADDRESS OF THE TCB OF REQUESTER TASK?; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTER TASK HEADERBC; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTER TASK HEADER; WD. 05 -- I/O FUNCTION CODEP/; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCKE/; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCKAB; WD. 10 -- I/O STATUS BLOCK ADDRESS (READ OR DISPLACEMENT+140000)3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. ; ;U;H>; THE I/O PACKET PARAMETER LIST IS USED BY THE DRIVER TO STORE$; INFORMATION REGARDING THE REQUEST.=; THIS INFORMATION IS CALCULATED AS THE REQUEST IS PROCESSED.A7; CONVENTIONS FOR I/O PACKET PARAMETER LIST USEAGE ARE: ;U;EB; WD. 12 - I.PRM -FIRST PARAMETER SUPPLIED BY ISSUEING TASKS QIOC; WD. 13 - I.PRM+2 -SECOND PARAMETER SUPPLIED BY ISSUEING TASKS QIOUB; WD. 14 - I.PRM+4 -THIRD PARAMETER SUPPLIED BY ISSUEING TASKS QIOH; WD. 15 - I.PRM+6 -LOW ORDER 16 BITS OF PHYSICAL ADDRESS OF REQUEST RDAH; WD. 16 - I.PRM+10-HIGH ORDER 2 BITS OF PHYSICAL ADDRESS OF REQEUST RDAH; WD. 17 - I.PRM+12-EVENT FLAG MASK FOR CONTINUING DATA TRANSFER REQUEST&; WD. 20 - I.PRM+14-EVENT FLAG ADDRESS(; WD. 21 - I.PRM+16-RESERVED FOR RSX-11M;;D;2-LAINI: MOV R1,-(SP) ;SAVE I/O PACKET ADDRESSG" TST I.IOSB+4(R1) ;IOSB SUPPLIED?% BEQ ELABAD ;NO, BAD PARAMETERS ERR % MOV I.FCN(R1),R3 ;I/O FUNCTION CODEE BIC #377,R3 ;CLEAR LOW BYTE% CMP #IO.INI,R3 ;INITIALIZE REQUEST?  BNE 5$ ;NO, CON00¯ ‚û�±|t÷tø tþfDATATINUEQ JMP LAINIT ;YES)5$: CMP #IO.CLK,R3 ;CLOCK START REQUEST?R BNE 15$ ;NO, CONTINUE JMP LACLOK ;YES#15$: CMP #IO.STP,R3 ;STOP REQUEST?R BNE 2$ ;NO  JMP LASTOP ;YES;GI; IT IS EITHER A LOAD MICRO-CODE REQUEST OR A START DATA TRANSFER REQEUSTR2; COPY USER BUFFER POINTERS SO $GTWRD WILL OPERATE;;,2$: MOV I.PRM(R1),U.BUF(R5) ;RELOCATION BIAS$ MOV I.PRM+2(R1),U.BUF+2(R5) ;OFFSET CMP #IO.STA,R3 ;START? BNE 3$ ;NOE JMP LASTRT ;YES%3$: CMP #IO.LOD,R3 ;LOAD MICRO-CODE?N# BNE ELAIFC ;NO, ILLEGAL FUNCTIONI JMP LALOAD ;YES, JMP TO LOAD;E;$-; *******************************************#;S<; ** - ERROR HANDLING PATHS FOR LADRV - INITIATOR ENTRY ONLYH; INTERRUPT ROUTINES AND OTHER ENTRY POINTS REPORT THEIR OWN ERRORS;;O3ELAIFC: MOV #IE.IFC&377,R0 ;ILLEGAL FUNCTION ERROR$" BR EROR ;FINISH ERROR HANDLING;I,ELAPRI: MOV #IE.PRI&377,R0 ;PRIVILEGE ERROR BR EROR ;T9ELASPC: MOV #IE.SPC&377,R0 ;USER BUFFER ADDR CHECK ERROR3 BR EROR;-6ELABCC: MOV #IE.BCC&377,R0 ;LOAD ERROR FOR MICRO-CODE BR EROR ;EXIT;@ELARSU: MOV #IE.RSU&377,R0 ;RESOURCE IN USE - CANNOT INITIALIZE BR EROR;L<ELANOD: MOV #IE.NOD&377,R0 ;SYSTEM DYNAMIC MEMORY EXHAUSTED BR EROR;T+ELABAD: MOV #IE.BAD&377,R0 ;BAD PARAMETERS;EROR: ! MOV (SP)+,R3 ;ERROR ENCOUNTEREDO CLR R1 ;SET UP IOSB WORD 2R CALLR $IOFIN ;I/O COMPLETION.;&;,,ELAPR2: MOV #IE.PRI&377,R0 ;PRIVILEGE ERROR BR ERORGT;,7ELASP2: MOV #IE.SPC&377,R0 ;USER BUFF ADDR CHECK ERROR ; ERORGT: MOV (SP)+,R3 CLR R1 CALL $IOFIN BR GETPKT;-; *******************************************E;C .PAGE7 .SBTTL RETREIVE I/O PACKET AND ISSUE REQUEST TO LPA-11E;Y; INSERT PACKET IN I/O QUEUE5; THE DRIVER WAS ENTERED BEFORE THE PACKET WAS QUEUED-; NOW WE PUT IT IN THE QUEUE AND GO TO $GTPKTC;R/QUEPKT: ;QUEUE AN I/O PACKET FOR THE DRIVERM% MOV (SP)+,R1 ;GET ADDRESS OF PACKET7= MOV R4,R0 ;SCB ADDRESS OF CONTROLLER TO INSERT PACKET INTO,( CLR I.PRM+16(R1) ;INITIALIZE FLAG WORD CALL $QINSP ;INSERT IN QUEUE ;AND FALL THROUGH TO $GTPKT;*6; TRY TO RETREIVE AN I/O PACKET AND TRANSMITT TO LPA11;IGETPKT:C; D; BEFORE WE DEALLOCATE A NEW REQUEST FROM THE CONTROLLERS I/O QUEUE,:; TRY AND FETCH A STOP REQUEST FROM THE STOP REQUEST QUEUE;I MOV U.SCB(R5),R4 ;POINT TO SCB! TSTB S.STS(R4) ;CONTOLLER BUSY?T BEQ 198$I JMP 14$ ;YES, GO AWAY,198$: MOV U.LASL(R5),R1 ;LOOK AT STOP QUEUE BEQ 200$ ;EMPTY, TRY $GTPKT& MOV (R1),U.LASL(R5) ;NEW FIRST ENTRY# INCB S.STS(R4) ;SET CONTOLER BUSYU& BISB #US.BSY,U.STS(R5) ;SET UNIT BUSY2 MOV R1,S.PKT(R4) ;SET CURRENT I/O PACKET ADDRESS0 MOVB S.CON(R4),R3 ;MOVE CONTROLLER INDEX TO R3 .IF DF M$$PRO0 CALL $CFORK ;WE MUST RUN ON CORRECT PROCESSOR .ENDC! BR 210$ ;GIVE REQUEST TO LPA11B;)?; TRY AND RETREIVE AN I/O PACKET FROM THE CONTROLLERS I/O QUEUEI;J;1200$: CALL $GTPKT BCS 14$6210$: MOV R5,UCBSV(R3) ;SAVE UCB PTR. FOR INT ROUTINE9 BICB #US.MDM,U.STS(R5) ;CLEAR ABORT CURRENT REQUEST FLAG.2 CMP #IO.LOD,I.FCN(R1) ;A LOAD MICROCODE FUNCTION? BNE 220$ 3 MOVB S.ITM(R4),S.CTM(R4) ;SET DEVICE TIMEOUT COUNTE BR 12$ 220$:4 .IF DF M$$EXT' CMP #IO.INI,I.FCN(R1) ;INITIALIZE RDA?L BNE 222$ ;NO, BRANCHN2 MOV #139.*2,U.CNT(R5) ;LENGTH OF RDA TO BE MAPPED8 MOV I.PRM+6(R1),U.BUF+2(R5) ;LOW 16 BITS OF RDA ADDRESS: MOVB I.PRM+10(R1),U.BUF+1(R5) ;HIGH 6 BITS OF RDA ADDRESS CALL MAP ;GO MAP UMR'S)? MOV M.UMVL(R3),I.PRM+6(R1) ;LOW 16 BITS OF UMR VIRTUAL ADDRESSA< MOVB M.UMVH(R3),I.PRM+10(R1) ;HIGH 2 BITS (IN BITS 4 AND 5)+ ASR I.PRM+10(R1) ;MOVE THOSE ADDRESS BITS,$ ASR I.PRM+10(R1) ; TO BITS 2 AND 3 BR 250$0222$: CMP #IO.STA,I.FCN(R1) ;START I/O FUNCTION? BNE 250$ ;NO, BRANCH % TST I.PRM+16(R1) ;ANY UMR'S MAPPED?;0 BNE 250$ ;YES, START CONVERTED TO STOP PACKET3 MOV I.PRM+2(R1),U.CNT(R5) ;LENGTH OF MAPPED REGION)% MOV I.PRM+6(R1),R2 ;GET RDA ADDRESSS' MOV 4(R2),U.BUF+2(R5) ;USW LOW 16 BITS(( MOVB 6(R2),U.BUF+1(R5) ;USW HIGH 2 BITS CALL MAP ;GO 00¯‚ƒ�Ž{´cÚµcÛ¶c�·c›’MAP UMR'S) MOV R5,-(SP) ;SAVE UCB POINTER! ADD #4,R2 ;POINT TO USW IN RDAE. MOV M.UMVL(R3),(R2)+ ;POINT LPA TO MAPPED USW) MOVB M.UMVH(R3),R5 ;GET USW HIGH 2 BITS." BIC #^C<377>,R5 ;CLEAR HIGH BYTE ASRB R5 ;MOVE TO BITS 0 AND 1 ASRB R5 ASRB R5 ASRB R5 MOVB R5,(R2)+ ;STORE INTO RDAS& MOVB (R2)+,R0 ;GET VALID BUFFER MASK" BIC #^C<7>,R0 ;ISOLATE MASK BITS9225$: ADD M.UMVL(R3),(R2)+ ;ADD UMR BASE ADDRESS LOW BITSO" ADC (R2) ;DONT FORGET THE CARRY. ADD R5,(R2)+ ;ADD UMR BASE ADDRESS HI 2 BITS DEC R0P BGE 225$ ;BRANCH IF NOT DONE ) MOV I.PRM+6(R1),R2 ;GET THE RDA ADDRESS # ADD #50,R2 ;INDEX TO RCL ADDRESSH4 ADD M.UMVL(R3),(R2)+ ;ADD UMR BASE ADDRESS LOW BITS" ADC (R2) ;DONT FORGET THE CARRY! ADD R5,(R2) ;ADD THE HIGH BITSR# MOV (SP)+,R5 ;RESTORE UCB POINTER250$:R .ENDC3 MOVB S.ITM(R4),S.CTM(R4) ;SET DEVICE TIMEOUT COUNTI* MOV S.CSR(R4),R0 ;GET DEVICE CSR ADDRESS7 MOV I.PRM+6(R1),4(R0) ;SET LOW 16 BITS OF RDA ADDRESSA4 BIC #14,(R0) ;CLEAR PREVIOUS EXTENDED ADDRESS BITS MOV I.PRM+10(R1),R2 INC R2 ;SET GO BITP BIS R2,(R0) ;GIVE TO LPAR 12$: RETURN0; &; THERE IS NOTHING TO DO FOR THIS UNIT>; CHECK TO SEE IF ANY DYNAMIC STOREAGE NEEDS TO BE DEALLOCATED;E+14$: TST (R4) ;BECAUSE I/O LIST IS EMPTY? BNE 12$ ;NO, JUST EXIT +16$: MOV U.LADS(R5),R0 ;ANY DSR ALLOCATED?. BEQ 12$ ;NO, EXIT@ MOV (R0),U.LADS(R5) ;YES, REMOVE THIS PACKET AND POINT TO NEXT% MOV #30.*2,R1 ;DEALLOCATE 30. WORDS ! CALL $DEACB ;DEALLOCATE BUFFERV" BR 16$ ;CONTINUE TILL NONE LEFT .PAGE;2=; THIS SUBROUTINE SETS UP THE UNIBUS MAPPING REGISTERS NEEDEDT6; TO MAP THIS USER'S REQUEST WITH THE FOLLOWING STEPS:;O9; - GET A WORK BLOCK FROM POOL TO USE AS A MAPPING BLOCK4:; - SET UP THE MAPPING BLOCK BY REQUESTING UMRS FROM EXEC4; - MAKE SURE WE ARE UNDER THE SYSGEN DEFINED LIMIT; - LOAD THE UMRS;T;M .IF DF M$$EXT4MAP: MOV (SP),-(SP) ;RESERVE A WORD AT TOP OF STACK# MOV R1,-(SP) ;SAVE PACKET POINTER  MOV R2,-(SP) ;SAVE R2E MOV R5,-(SP) ;SAVE UCB POINTER MOV #20.,R1 ;GET 10. WORDST CALL $ALOCB ; FROM POOLG BCC 10$ ;BRANCH IF SUCCESSFUL& MOV #IE.NOD&377,-(SP) ;SET ERROR CODE BR 15$-&10$: MOV 4(SP),R3 ;GET PACKET POINTER0 MOV R0,I.PRM+4(R3) ;STORE POINTER TO NEW BLOCK MOV (SP),R5 ;GET UCB POINTERK# MOV U.SCB(R5),R4 ;GET SCB POINTERD) CLR (R0) ;INITIALIZE CONTEXT SAVE WORD CALL $STMP1 ;SET UP THE UMR'S6 MOV (SP)+,10(SP) ;MOVE DQUMR POINTER TO TOP OF STACK( TST -10(R0) ;WERE WE BLOCKED BY EXEC? BNE 12$ ;YES, REPORT IT* MOV M.UMRN(R0),R3 ;GET NUMBER OF UMR'S*4 ASR R3 ;GET NUMBER OF UMR'S ASR R3 4 SUB R3,U.LAUB+2(R5) ;SUBTRACT FROM TOTAL AVAILABLE BGE 20$ ;BRANCH IF ALL THEREA* ADD R3,U.LAUB+2(R5) ;RESTORE TOTAL VALUE& MOV #IE.DUN&377,-(SP) ;SET ERROR CODE BR 13$E812$: MOV #IE.BLK&377,-(SP) ;EXEC BLOCKED DRIVER FOR UMRS,13$: MOV R0,R2 ;COPY MAPPING BLOCK POINTER$ CALL $DEUMR ;DEALLOCATE THE UMR'S+ SUB #10,R0 ;POINT TO START OF WORK BLOCK) MOV #20.,R1 ;10. WORDS LONG$ CALL $DEACB ;RETURN BLOCK TO POOL"15$: MOV (SP)+,R0 ;POP ERROR CODE# MOV (SP)+,R5 ;RESTORE UCB POINTER' MOV U.SCB(R5),R4 ;RESTORE SCB POINTERL MOV (SP)+,R2 ;RESTORE R26 MOV (SP)+,2(SP) ;MOV PACKET POINTER OVER RETURN ADDR TST (SP)+ ;CLEAN STACK)- CLR S.PKT(R4) ;CLEAR CURRENT PACKET POINTER7* CLRB S.STS(R4) ;MARK CONTROLLER NOT BUSY+ BICB #US.BSY,U.STS(R5) ;MARK UNIT NOT BUSY JMP ERORE/20$: MOV R0,R3 ;COPY POINTER TO MAPPING BLOCKF MOV (SP)+,R5 ;GET UCB POINTER # MOV U.SCB(R5),R4 ;GET SCB POINTERO CALL $MPUB1 ;LOAD THE UMR'S MOV (SP)+,R2 ;RESTORE R2* MOV (SP)+,R1 ;RESTORE THE PACKET POINTER" MOV #1,I.PRM+16(R1) ;MARK MAPPED RETURNR .ENDC .PAGE! .SBTTL DEVICE INITIALIZE REQUESTR;D;=; ***** PROCESS AN INITIALIZE REQUEST FOR LPA11 *************E;O/; FUNCTION DEPENDENT I/O REQUEST PACKET FORMAT:Y;B<; WD. 12 -- VIRTUAL ADDRESS OF RDA BUFFER FOR INITIALIZATION2; WD. 13 -- LENGTH IN BYTES OF THE INIT RDA BUFFER; WD. 14 -- NOT USED2; WD. 00¯‚û�±|t÷tø tþfDATA15 -- LOW ORDER 16 BITS OF PHYSICAL RDA ADDRC; WD. 16 -- HIGH ORDER 2 BITS OF PHYSICAL RDA ADDR-BIT POS. 3 AND 2E; WD. 17 -- NOT USED; WD. 20 -- NOT USED; '; RDA FORMAT FOR INITIALIZATION COMMAND;B8; WD. 00 -- MODE WORD-CONTAINS MICROCODE VERSION NO. AND; INITIALIZE CODE (000)*3; WD. 01 THRU 12 -- DEVICE ADDRESSES ON THE I/O BUSC; :; REMAINDER OF BUFFER IS THE DEDICATED MODE DISPATCH TABLE;; WHICH IS A TABLE OF CONSTANTS REQUIRED FOR DEDICATED MODEU); PROCESS AN INITIALIZE REQUEST FOR LPA11 ;ELAINIT: : CMP I.PRM+2(R1),#139.*2 ;MUST SPECIFY AT LEAST 139. WORDS BHIS 10$R# JMP ELASPC ;ERROR, RDA TOO SHORTS;); INITIALIZING TASK MUST BE PRIVILEGED!!!I;I110$: MOV I.TCB(R1),R0 ;GET TCB OF REQUESTOR TASKI( BIT #T3.PRV,T.ST3(R0) ;TASK PRIVILEGED? BNE 15$ JMP ELAPRI ;NO, ERROR&15$: MOV I.PRM(R1),R0 ;ADDRESS OF RDA  .IF DF A$$CHK!M$$MGET D- MOV #139.*2,R1 ;LENGTH OF INIT RDA IN BYTESE' CALL $ACHCK ;CALL ADDR CHECK ROUTINEU BCC 20$ JMP ELASPC ;ERROR RETURNED120$: ;REF LABLEI .IF DF R$$MPL;TH; THIS IS HERE BECAUSE IO.INI IS MARKED AS A CONTROL FUNCTION IN THE DCBE; EVEN THOUGH IT IS REALLY A TRANSFER FUNCTION. THAT WAS DONE TO GETB&; THE RDA ADDRESS IN THE CORRECT FORM.H; M DOESNT NEED THIS BECAUSE A TASK IS NOT CHECKPOINTABLE OR SHUFFLEABLE'; IF T.IOC <> 0, AND COMMONS DONT MOVE.;4 MOV W.BATT(R2),R2 ;POINT TO ATTACHMENT DESC OF BUF% INCB A.IOC(R2) ;INCREMENT I/O COUNTA& MOV (SP),R3 ;POINT R3 TO I/O PACKET2 MOV R2,I.AADA(R3) ;STORE ATT DESC ADDR SO $IOFIN" ;WILL DECREMENT THE I/O COUNT .ENDC ;R$$MPL .ENDC ;A$$CHK!M$$MGEO N5 CALL CVTP ;CONVERT RDA ADDRESS TO PHYSICAL ADDRESSN& MOV (SP),R3 ;POINT R3 TO I/O PACKETE MOV R1,I.PRM+6(R3) ;SAVE LOW ORDER 16 BITS OF PHYSICAL RDA ADDRESSE .IF DF M$$EXT) ASR R2 ;RIGHT JUSTIFY THE ADDRESS BITSO ASR R2 .ENDC, MOV R2,I.PRM+10(R3) ;AND HIGH ORDER 2 BITS) JMP QUEPKT ;INSERT PACKET IN I/O QUEUEP .PAGE .SBTTL PROCESS CLOCK START RDA.;A;);S;; ***** PROCESS LPA11-K REAL TIME CLOCK START RDA *********U;/; FUNCTION DEPENDENT I/O REQUEST PACKET FORMAT:;L!; WD. 12 -- CLOCK START MODE WORDY9; CONTAINS CLO CK ID (A OR B) AND CLO CK START CODEV; WD. 13 -- CLOCK STATUS WORDR; WD. 14 -- CLOCK PRESET WORDS,; WD. 15 -- LOW ORDER 16 BITS OF RDA ADDRESSC; WD. 16 -- HIGH ORDER 2 BITS-ALWAYS ZERO FOR THIS FUNCTION BECAUSED:; THE RDA IS IN THE I/O PACKET ITSELF WHICH RESIDES IN ; KERNEL ADDRESS SPACE ; WD. 17 -- NOT USED; WD. 20 -- NOT USED;P;-C; RDA FOR CLOCK START COMMAND IS 1ST 3 PARAMETER WORDS IN IO PACKETR;ELACLOK: 1 MOV I.PRM(R1),R0 ; INSURE THIS IS A CLOCK START ' BIC #^C<7>,R0 ;ISOLATE LOW THREE BITSC1 DEC R0 ;IF A CLOCK START,SHOULD GO FROM 1 TO 0D! BEQ 5$ ;YES, LEGAL CLOCK START5' JMP ELABAD ;NO, BAD PARAMETERS ERRORD:5$: MOV R1,I.PRM+6(R1) ;MAKE I/O PACKET A CLOCK START RDA0 ADD #I.PRM,I.PRM+6(R1) ;POINT RDA ADDRESS TO IT3 CLR I.PRM+10(R1) ;KERNAL MODE IS PHYSICAL ADDRESS- JMP QUEPKT ; ;-;O .PAGE .SBTTL LOAD MICRO CODE ; 5; ******* FUNCTION TO LOAD MICRO CODE ***************L7; ALSO DOES A HARDWARE INITIALIZE AND START UP OF LPA11;C/; FUNCTION DEPENDENT I/O REQUEST PACKET FORMAT:I; "; WD. 12 -- 16 BIT RELOCATION BIAS; WD. 13 -- OFFSET); WD. 14 -- LENGTH IN BYTES OF MICRO-CODEM; WD. 15 -- NOT USED; WD. 16 -- NOT USED; WD. 17 -- NOT USED; WD. 20 -- NOT USED;+4; ***** THERE IS NO RDA FOR THE LOAD COMMAND *******;LLALOAD:PD CMP I.PRM+4(R1),#1024.*2 ;MUST LOAD EXACTLY 1024 MICRO INSTRUCTIONS" BEQ 5$ ;PROPER NUMBER, CONITNUE: JMP ELASPC ;ERROR - INCORRECT NUMBER OF BYTES IN BUFFER;Z#; LOADING TASK MUST BE PRIVILEGED!!I;D85$: MOV I.TCB(R1),R2 ;ISSUEING TASK MUST BE PRIVILEGED!( BIT #T3.PRV,T.ST3(R2) ;TASK PRIVILEGED? BNE 10$ ;YES, CONTINUEF JMP ELAPRI ;NO, ERROR; /; CHECK TO MAKE SURE THERE ARE NOT ACTIVE USERS8; WE DON'T WANT TO DO A HARDWARE RESET FOR THE POOR GUY!;D#10$: TST S.PKT(R4) ;ANYONE ACTIVE?I BEQ 15$ ;NO00¯"‚ƒ�Ž{´cÚµcÛ¶c�·c›’, OKAY SO FARD12$: JMP ELARSU ;YES, ERRORS015$: MOV #U.LAUT,R0 ;POINT TO ACTIVE USER TABLE ADD R5,R0 ;IN UCB MOV #8.,R2S20$: TST (R0)+ ;A USER HERE?& BNE 12$ ;YES, RESOURCE IN USE ERROR DEC R2 ;END OF LIST?S BGT 20$ ;NO CONTINUE3;V; HARDWARE RESET LPA11-K; .IF DF M$$PRO! CALL $CFORK ;CORRECT PROCESSOR .ENDC, MTPS S.PRI(R4) ;;;GO TO PRIORITY OF DEVICE MOV #40000,@S.CSR(R4) ;;;RESETT MTPS #0 ;;;RESET PRIORITY;S?; GET 1024 WORDS FROM USER BUFFER AND LOAD INTO MICRO PROCESSORP"; CHECK EACH WORD LOADED TO VERIFY;T% CLR R0 ;R0 IS ADDRESS TO LOAD INTOR* MOV S.CSR(R4),R1 ;POINT R1 TO DEVICE CSR-22$: CALL $GTWRD ;GET WORD FROM USER BUFFERU CLR (R1) ;CLEAR CSR MOV R0,4(R1) ;SET CRAM ADDRESS MOV (SP),6(R1) ;CRAM CONTENTS MOV #2000,(R1) ;SELECT ADDRESS BIS #20000,(R1) ;WRITE CRAMC CLR (R1) ;RESET;;(; NOW VERIFY THAT IT IS THERE FOR GRINNS;R MOV R0,4(R1) ;CRAM ADDRESS( MOV #2000,(R1) ;SELECT CRAM AT ADDRESS CMP (SP)+,6(R1) ;DATA EQUALR BEQ 26$ ; YES,OKH, JMP ELABCC ;NO, LOAD ERROR FOR MICRO-CODE26$: INC R0 ;NEXT WORD CMP R0,#1024. ;END OF WCS? BLT 22$ ;NOT YETG2 MOV #104000,(R1) ;SET RUN AND ENABLE ARBITRATION .REPT 5% NOP ;WAIT FOR THINGS TO GET GOINGP .ENDR3 BIS #100,(R1)+ ;SET INTERRUPT ENABLE FOR READY INB3 BIS #100,(R1) ;SET INTERRUPT ENABLE FOR READY OUT JMP QUEPKTT; ;I .PAGE! .SBTTL STOP LPA11 ACTIVE REQUESTM;D7; ****** ISSUE A STOP RDA COMMAND TO LPA11-K **********+;R.; FUNCTION DEPENDENT I/O REQUEST PACKET FORMAT; ; WD. 12 -- USER INDEX TO STOP; WORDS 13 THRU 20 NOT USEDC;R?; THE STOP QIO MUST CONTAIN A LUN (POINT TO CORRECT CONTROLLER);=; ROUTINE USES TCB ADDRESS TO ESTABLISH UNIQUENESS OF REQUESTN ; TO STOP. N;F; ******** NOTE !!! THIS STOP PACKET IS IMMEDIATELY DEALLOCATED. THEE; ORIGINAL START PACKET WAS CONVERTED INTO A STOP PACKET IN THE READYEE; OUT INT. ROUTINE, AFTER THE START REQUEST WAS ACCEPTED. IT IS THATM/; PACKET THAT GETS QUEUED FOR THE STOP REQUEST.E;I;RLASTOP:C/ MOV I.PRM(R1),R0 ;PARAM IS USER INDEX TO STOP & BIC #^C<7>,R0 ;INSURE INDEX FROM 0-7! ASL R0 ;MAKE INTO A WORD INDEX ADD R5,R0 ;POINT TO UCB+INDEX, MOV U.LAUT(R0),R1 ;GET PACKET PTR OF START BEQ 40$ ;USER NOT ACTIVE*& MOV (SP),R3 ;GET PACKET PTR OF STOP;E7 CMP I.TCB(R3),I.TCB(R1) ;STOP TASK SAME AS START TASK?E BNE 40$ ;NO, NOT THIS USERD= CLR U.LAUT(R0) ;CLEAR TABLE ENTRY SO WE WON'T BE HERE AGAINI ;THIS USER MATCHES!!!!S;E:; INSERT THE STOP PACKET INTO THE STOP QUEUE FOR THE LPA11E; A SEPARATE I/O QUEUE IS MAINTAINED BY THE DRIVER FOR STOP FUNCTIONS0;E MOV U.LASL(R5),(R1) ;INSERT NEXT ENTRY POINTER INTO CURRENT POINTERM3 MOV R1,U.LASL(R5) ;POINT STOP QUEUE TO THIS ENTRY ;S$ CLR R0 ;STATUS IS REQEUST PENDING,36$: MOV (SP)+,R3 ;ADDRESS OF "STOP" PACKET CLR R1 ;IOSB(2) IS ZERO. CALL $IOFIN ;DEALLOCATE STOP COMMAND PACKET' JMP GETPKT ;LOOK FOR SOMETHING TO DOH; !40$: MOV #1,R0 ;USER NOT ACTIVES BR 36$N;T;S .PAGE+ .SBTTL PROCESS START DATA TRANSFER REQUESTA;E6; ***** PROCESS START DATA TRANSFER RDA **************;C; ADDRESS CHECKING AND RELOCATION OF USER DATA BUFFERS IS DONE HEREN$; (BEFORE THE I/O PACKET IS QUEUED);U/; FUNCTION DEPENDENT I/O REQUEST PACKET FORMAT:T;N7; WD. 12 -- RELOCATION BIAS OF ADDR OF INPUT RDA BUFFERR$; WD. 13 -- INPUT RDA ADDRESS OFFSET(; WD. 14 -- LENGTH OF INPUT RDA IN BYTES5; WD. 15 -- LOW ORDER 16 BITS OF PHYSICAL RDA ADDRESSS=; WD. 16 -- HIGH ORDER 2 BITS - ALWAYS ZERO FOR THIS FUNCTIONR1; BECAUSE THE "REAL" RDA BUFFER IS DYNAMICALLY 5; ALLOCATED IN SYSTEM DYNAMIC MEMORY IE. IN KERNELG; ADDRESS SPACE.E; WD. 17 -- EVENT FLAG MASK; WD. 20 -- EVENT FLAG ADDRESS ; WD. 21 -- RESERVED FOR RSX-11M;Q; ***** NOTE !!!<; ONCE THE 1ST TWO I.PRM WORDS HAVE BEEN MOVED FROM THE I/O <; PACKET TO THE UCB (FOR USE BY $GTWRD), THESE LOCATIONS ARE=; NO LONGER NEEDED FOR THE INPUT RDA ADDRESS AND ARE FREE FOR C; OTHER USEFUL DATA. THIS ROUTINE00¯*‚û�±|t÷tø tþfDATA STORES THE FOLLOWING INFORMATIONN; IN THESE TWO WORDS:E;E%; WD. 12 -- I.PRM+0-BUFFER WORD COUNTLC; WD. 13 -- I.PRM+2-#WORDS TO BE MAPPED BY UMR'S (22-BIT MODE ONLY);D?; THE READY OUT ROUTINE STORES THE FOLLOWING INFORMATION IN THE1; SECOND OF THESE TWO WORDS:;*); WD. 13 -- I.PRM+2 - THE STOP RDA ITSELFS;VB; WHEN THE UMR'S HAVE TO BE MAPPED IN GETPKT, A BLOCK IS ALLOCATED?; FROM POOL. THE ADDRESS OF THAT BLOCK IS STORED HERE FOR LATERS/; DEALLOCATION FOLLOWING A READY-OUT INTERRUPT:U;E%; WD. 14 -- I.PRM+4-UMR MAPPING BLOCKN;ED; NOTE THAT THE ORIGINAL DATA FROM THESE LOCATIONS HAS BEEN SAVED IN;; THE UCB ENTRY POINT TO THE DRIVER (NEAR LABEL 2$) AT THED;; THE UCB AT THE ENTRY POINT TO THE DRIVER (NEAR LABEL 2$). ;1(; NOTE FOR MACRO PROGRAMMERS USING QIOS:;-L; THE FOLLOWING RDA IS NOT THE SAME STRUCTURE AS THE IBUF ARRAY. THE RDA ISO; A DESCRIPTOR ARRAY PASSED TO THE LPA BY A QIO TO INITIATE A DATA SWEEP. IBUF O; IS SET UP BY THE SUPPORT ROUTINES TO HOLD PARAMETERS AND STRUCTURES NECESSARYRN; TO CONTROL A SWEEP. THESE INCLUDE BUFFER ADDRESSES, USER AND DEVICE QUEUES,P; FLAG WORDS, USER ID, ETC. IT ALSO INCLUDES THE USW AND THE IOSB. THE SUPPORTQ; ROUTINES CREATE AN RDA USING THE INFORMATION IN IBUF AND PASS THE RDA TO LADRV.O; Q; THIS DRIVER WAS WRITTEN IN CONJUNCTION WITH THE SUPPORT ROUTINES AND IT EXPECTSAA; A CERTAIN STRUCTURE IN IBUF. THERE ARE ONLY THREE CONSTRAINTS:I;I*; 1 - THE IBUF ARRAY MUST BE 80 BYTES LONG1; 2 - THE USW MUST BE THE THIRD WORD OF THE ARRAY P; 3 - THE IOSB PASSED TO THE DRIVER MUST NOT BE THE FIRST TWO WORDS OF THE ARRAY;EO; CONSTRAINT 3 EXISTS BECAUSE THE DRIVER EXPECTS TWO CONSECUTIVE 2-WORD IOSB'S PM; STARTING AT THE ADDRESS THAT IS PASSED IN THE I/O PACKET. IF THE FIRST TWOOH; WORDS WERE SPECIFIED AS THE IOSB, THE DRIVER WOULD OVERWRITE THE USW. M; THE SUPPORT ROUTINES USE THE FIRST TWO WORDS OF THE ARRAY AS A USER IOSB. NR; THEY HAVE THE DOUBLE IOSB USED BY THE DRIVER LOCATED HIGHER IN THE IBUF ARRAY. J; THEY COMMUNICATE WITH THE DRIVER USING THE DOUBLE IOSB, AND BEFORE THEY G; RETURN FROM A CALL THEY MOVE THE APPROPRIATE DATA TO THE USER IOSB. R&; THUS THE REQUIRED FORMAT OF IBUF IS:;P"; WORD 00 - UNDEFINED (NOT IOSB)"; WORD 01 - UNDEFINED (NOT IOSB); WORD 02 - USW; WORDS 03-47 - UNDEFINED ; Q; WITHIN THESE CONSTRAINTS MACRO PROGRAMMERS MAY SET UP IBUF IN ANY WAY THEY WISH ; @; THE RDA BUFFER AS SET UP BY THE CALLING ROUTINE IS AS FOLLOWS:;V; WORD 00 - LPA-11 MODE WORD2; WORD 01 - NUMBER OF WORDS TO TRANSFER PER BUFFER(; WORD 02 - ADDRESSS OF USER STATUS WORD-; WORD 03 - LOW BYTE ONLY - VALID BUFFER MASKT; WORD 04 - BUFFER 0 ADDRESS; WORD 05 - BUFFER 1 ADDRESS; WORD 06 - BUFFER 2 ADDRESS; WORD 07 - BUFFER 3 ADDRESS; WORD 10 - BUFFER 4 ADDRESS; WORD 11 - BUFFER 5 ADDRESS; WORD 12 - BUFFER 6 ADDRESS; WORD 13 - BUFFER 7 ADDRESS*; WORD 14 - ADDRESS OF RANDOM CHANNEL LIST; WORD 15 - DELAY WORD?; WORD 16 - CHANNEL INCR (HIGH BYTE) / START CHANNEL (LOW BYTE) 5; WORD 17 - NUMBER OF CHANNELS TO SAMPLE IN SEQUENCE D@; WORD 20 - NUMBER OF CLOCK OVERFLOWS BETWEEN STARTS OF SEQUENCE0; WORD 21 - EVENT MARK WORD / DIGITAL START WORD; WORD 22 - START WORD MASK ; WORD 23 - EVENT MARK MASK 5; WORD 24 - NUMBER OF ELEMENTS IN RANDOM CHANNEL LISTS; ?; THIS ROUTINE CONVERTS THIS INPUT FORMAT RDA INTO THE REAL RDA1=; WHICH IS USED BY THE LPA-11. THIS ROUTINE DOES THE ADDRESST<; CHECKING AND RELOCATION OF USER BUFFERS CONVERTING THEM TO<; 2 WORD PHYSICAL ADDRESSES. IT DOES THE SAME FOR THE RANDOMA; CHANNEL LIST AND USER STATUS WORD. THE FINAL RDA IS CREATED INE>; TASK DYNAMIC MEMORY AND POINTED TO BY WORDS 15 AND 16 IN THE ; I/O PACKET.2; LASTRT:D* MOV #30.*2,R1 ;ALLOCATE DYNAMIC STOREAGE CALL $ALOCB BCC 42$ ;GOT ONEC JMP ELANOD;4; LINK THIS PACKET INTO THE LIST OF DSR FOR THE UNIT;A;42$: MOV U.LADS(R5),(R0) ;POINT THIS PACKET TO NEXT PACKET . MOV R0,U.LADS(R5) ;POINT LIST TO THIS PACKET/ TST (R0)+ ;POINT R0 TO SECOND WORD OF PACKETE;I& MOV (SP),R2 ;00¯2‚ƒ�Ž{´cÚµcÛ¶c�·c›’GET I/O PACKET ADDRESS- MOV R0,I.PRM+6(R2) ;SAVE ADDRESS OF NEW RDAC, CLR I.PRM+10(R2) ;EXTENDED ADDRESS IS ZERO% MOV R0,R3 ;COPY ADDRESS OF NEW RDAK CALL $GTWRD ;MODE MOV (SP)+,(R3)L/ BIC #7,(R3) ;MAKE SURE THIS IS A "START" RDA; BIS #2,(R3)+E CALL $GTWRD ;TRANSFER COUNT0 MOV (SP),(R3)+ ;LEAVE COUNT ON STACK FOR LATER/ BLE 62$ ;ERROR, TRANSFER COUNT MUST BE 1-32K* MOV (SP),I.PRM(R2) ;SAVE BUFF WORD COUNT+ ASL (SP) ;MAKE TRANSFER COUNT BYTE VALUEP( CALL $GTWRD ;USER STATUS WORD ADDRESS D .IF DF A$$CHK!M$$MGE2 ;/ MOV #120,R1 ;ADDRESS CHECK ENTIRE IBUF ARRAYE MOV (SP),R0 ;GET USW ADDRESS - SUB #4,R0 ;PT TO START OF IBUF(=IOSB ADDR)E CALL $ACHCK( BCS 60$ ;ADDRESS CHECK ERROR IF C SET A .ENDC B# MOV (SP),R0 ;RESTORE USW ADDRESSR CALL CVTP ;RLOCATE USWE$ MOV R1,(R3)+ ;SAVE USW ADDRESS LOW ASR R2, ASR R2 & MOVB R2,(R3)+ ;SAVE USW ADDRESS HIGH .IF DF M$$EXT/ MOV #76.,R4 ;OFFSET FROM USW TO FIRST BUFFERP .ENDC* MOV #8.,-(SP) ;COUNTER FOR EIGHT BUFFERS! CALL $GTWRD ;NUMBER OF BUFFERS; MOVB (SP),(R3)+ ;SAVE IN RDA4 BIC #^C<7>,(SP) ;AND OUT ALL BUT NUMBER OF BUFFERS# CLR -(SP) ;HIGH 2 BITS OF OFFSETA"44$: CALL $GTWRD ;BUFFER ADDRESS MOV (SP),R0 . .IF DF A$$CHK!M$$MGE  E MOV 12(SP),R1 ;ADDRESS CHECK CALL $ACHCK BCS 154$ ;ADDRESS CHECK ERROR W .ENDC  .IF NDF M$$EXT2% MOV (SP)+,R0 ;GET ADDRESS OF BUFFER CALL CVTP# MOV R1,(R3)+ ;SAVE ADDRESS IN RDAT ASR R2 ASR R2 MOV R2,(R3)+) .IFFR TST (SP)+ ;CLEAN STACKW2 MOV R4,(R3)+ ;SET BUFFER ADDR AS OFFSET FROM USW! MOV (SP),(R3)+ ;SET HIGH 2 BITSL& ADD 10(SP),R4 ;SPAN PAST THIS BUFFER" ADC (SP) ;DONT FORGET THE CARRY .ENDC& DEC 4(SP) ;COUNT DOWN TOTAL BUFFERS' DEC 2(SP) ;COUNT DOWN BUFFERS TO USEC BGE 44$ ;LOOP TIL DONE4) MOV (SP)+,R2 ;GET HIGH 2 BITS OF OFFSET.) TST (SP)+ ;CLEAN BUFFER TO USE COUNTERS'46$: DEC (SP) ;ANY BUFFERS NOT IN USE; BLT 50$ ;NO, ALL DONE$ CALL $GTWRD ;FETCH WORD FROM USER TST (SP)+ ;IGNORE CLR (R3)+ ;CLEAR NEW RDAE CLR (R3)+ BR 46$ ;AND LOOP/50$: MOV R2,(SP) ;CLEAR STACK OF BUFFER COUNT4/ CALL $GTWRD ;GET RANDOM CHANNEL LIST ADDRESST MOV (SP)+,R0. C .IF DF A$$CHK!M$$MGE  N* BEQ 52$ ;RCL NOT IN USE IF ADDRESS ZERO& MOV #2,R1 ;ADDRESS CHECK FIRST WORD CALL $ACHCK BCS 57$ ;ERROR, BAD BUFFER52$: + .ENDC U .IF NDF M$$EXTE CALL CVTP ;RELOCATE MOV R1,(R3)+ ;SAVE IN RDA  ASR R2  ASR R2L% MOV R2,(R3)+ ;SAVE HIGHT ORDER BITS(* TST (SP)+ ;CLEAN HIGH 2 BITS FROM STACK .IFF3 MOV R4,(R3)+ ;OFFSET FROM USWR& MOV (SP)+,(R3)+ ;SET UMR HIGH 2 BITS .ENDC) MOV #6,-(SP) ;SEVEN MORE ENTRIES IN RDA(54$: CALL $GTWRD MOV (SP)+,(R3)+ DEC (SP) ;END?C BGE 54$ ;NO, LOOP TST (SP)+ .IF DF M$$EXT CALL $GTWRD ;GET RCL LENGTH+ ADD (SP),R4 ;ADD WORD COUNT TWICE TO GETC, ADD (SP)+,R4 ;FINAL LENGTH FOR UMR MAPPING" MOV 4(SP),R3 ;GET PACKET POINTER* MOV R4,I.PRM+2(R3) ;SAVE FOR UMR MAPPING6 MOV (SP),R0 ;CHECK THAT REGION STARTING WITH THE USW1 MOV R4,R1 ;AND (R4) BYTES LONG IS WITHIN USER'SV7 CALL $ACHCK ;ADDRESS SPACE. THE USER SHOULD KNOW THAT(6 BCS 60$ ;HIS IBUF,RCL AND BUFFERS MUST BE CONTIGUOUS' MOV U.SCB(R5),R4 ;RESTORE SCB POINTER$ .ENDC, ADD #4,SP ;CLEAR USW AND COUNT FROM STACK" MOV (SP),R3 ;GET PACKET POINTER8 MOVB I.EFN(R3),R0 ;CALCULATE EVENT FLAG MASK FOR LATER MOV R5,-(SP) ;SAVE R5S$ MOV I.TCB(R3),R5 ;TASK TCB ADDRESS. CALL $CEFI ;CONVERT EFN TO MASK AND ADDRESS MOV (SP)+,R5 ;RESTORE R5+ MOV R0,I.PRM+12(R3) ;SAVE EVENT FLAG MASKG- MOV R1,I.PRM+14(R3) ;AND EVENT FLAG ADDRESSE$ JMP QUEPKT ;FINISH IN COMMON CODE;H; ERROR - BAD BUFFER ADDRESS;O154$: TST (SP)+S"55$: TST (SP)+ ;CLEAR FROM STACK"56$: TST (SP)+ ;CLEAR FROM STACK"57$: TST (SP)+ ;CLEAR FROM STACK(60$: TST (SP)+ ; CLEAN STACK SOME MORE%62$: TST (SP)+ ;WHAT A CLEAN STACK!V64$: JMP ELASP2 ; BAD BUFFER;) .PAGE% .SBTTL READY IN INTERRUPT PROCESSINGE00¯:‚û�±|t÷tø tþfDATA;T.; INTERRUPT SUBROUTINE FOR READY IN INTERRUPTS;V; ********************H; LABEL $LAOUT:: IS ADDED TO CONFORM TO RSX-11M SYSGEN NAMING CONVENTIONC; WHICH SPECIFIES THAT FOR DUAL VECTORED DEVICES, THE LOW VECTOR IS5G; NAMED $XXINP AND THE HIGH VECTOR IS NAMED $XXOUT. FOR THE LPA-11 KMCAH; MODULE, THE HIGHEST PRIORTY VECTOR (THE OUTPUT) MUST COME FIRST. THUSH; THE OUTPUT VECTOR IS NAMED $LAINP AND THE INPUT VECTOR IS NAMED $LAOUT; ********************;$LAOUT::; ;ILARDI::P INTSV$ LA,PR5,L$$A11,,! CALL $FORK ;;;GO TO FORK LEVEL;*); FORK PROCESSING FOR READY IN INTERRUPTSE;O1 MOV U.SCB(R5),R4 ;POINT TO STATUS CONTROL BLOCKC. CLRB S.CTM(R4) ;CLEAR DEVICE TIMEOUT COUNTER4 CLRB S.STS(R4) ;CLEAR CONTROLER STATUS TO NOT BUSY/ BICB #US.BSY,U.STS(R5) ;CLEAR UNIT BUSY STATUS % MOV S.PKT(R4),R3 ;REQUEST FINISHED?T BEQ 70$ ;YESS$ MOV #1,R0 ;FINISH IT SUCCESSFULLY CLR S.PKT(R4) ;MARK FREE. BIT #2,I.PRM+16(R3) ;DID WE RUN OUT OF POOL? BEQ 66$ ;NO, BRANCH* BIC #2,I.PRM+16(R3) ;YES, CLEAR THAT BIT0 MOV #IE.NOD&377,R0 ;SET APPROPRIATE ERROR CODE'66$: CLR R1 ;SECOND IOSB WORD IS ZEROO .IF DF M$$EXT CMP #IO.INI,I.FCN(R3) BEQ 68$7 CMP #IO.STA,I.FCN(R3) ;START PACKET CONVERTED TO STOP?  BNE 69$ ;NO, BRANCH$ TST I.PRM+16(R3) ;ANY UMRS MAPPED? BEQ 69$ ;NO, BRANCH"68$: CALL UNMAP ;YES, UNMAP THEM' MOV U.SCB(R5),R4 ;RESTORE SCB POINTERY0 CALL $DQUMR ;WAKE UP PROCESS WAITING FOR UMRS69$: .ENDC) CALL $IOFIN ;END OF REQUEST PROCESSING,-70$: JMP GETPKT ;TRY AND GET ANOTHER PACKETD;7 .PAGE. .SBTTL LPA11-K READY OUT INTERRUPT PROCESSING;B5; INTERRUPT SUBROUTINE FOR LPA11 READY OUT INTERRUPTSR;; ******************H; LABEL $LAINP:: IS ADDED TO CONFORM TO RSX-11M SYSGEN NAMING CONVENTION9; SEE COMMENT AT INPUT INTERRUPT FOR FURTHER EXPLANATION.8; ******************;A$LAINP::;ULARDO::R INTSV$ LA,PR5,L$$A11,,3 MOV #U.LAFB+6,R4 ;;;POINT TO READY OUT FORK BLOCKN ADD R5,R4 ;;;" CALL $FORK1 ;;;GO TO FORK LEVEL;P0; FORK PROCESSING FOR LPA11 READY OUT INTERRUPTS;. MOV U.SCB(R5),R4 ;POINT TO SCB& MOV S.CSR(R4),R2 ;DEVICE CSR ADDRESS% MOV 2(R2),R0 ;LPA11 OUT STATUS WORD*+ MOV 6(R2),R1 ;GET MAINTENANCE STATUS BYTEO1 BIC #200,2(R2) ;ACKNOWLEDGE READY OUT INTERRUPT  MOV R0,R3 ;GET USER INDEX ASL R3 ;MAKE WORD OFFSET* BIC #^C<16>,R3A# ADD R5,R3 ;POINT TO USRTB IN UCBP& BIC #377,R0 ;AND OUT READY OUT BYTE- BEQ 100$ ;EQUAL IS START REQUEST PROCESSED;% BPL 71$ ;POSITIVE IS NORMAL STATUS JMP 102$ ;MINUS IS ERROR1;E.; COMMON CODE FOR REPORTING NORMAL USER STATUS;O71$:1 MOV U.LAUT(R3),R2 ;GET I/O PACKET ADDRESS IN R2R0 MOV I.PRM(R2),R1 ;SET WORD COUNT IN IOSB WD. 2"; IOSB WD. 1 =400 FROM LPA11-K72$: MOV R5,-(SP) ;SAVE UCB" MOV R3,-(SP) ;SAVE USRTB POINTER+ MOV U.LAUT(R3),R3 ;POINT R3 TO I/O PACKETR% BEQ 75$ ;IF NO USER NOW, JUST EXITP0 MOV I.TCB(R3),R2 ;POINT TO REQUESTING TASK TCB+ BIT #T2.ABO,T.ST2(R2) ;TASK BEING ABORTED?7! BNE 75$ ;YES, SKIP EVENT FLAG J$ MOV I.IOSB+2(R3),R4 ;GET IOSB BIAS& MOV I.IOSB+4(R3),R2 ;GET IOSB OFFSET ADD #4,R2 ;POINT TO 2ND IOSBG& CMP #140100,R2 ;MAPPING STILL VALID? BHI 172$ ;YES, BRANCH* SUB #64.,R2 ;NO, MAP NEXT 32-WORD BLOCK INC R4:172$:R ( .IF DF M$$MGE V MOV KISAR6,-(SP) ;SAVE KISAR6M MOV R4,KISAR6 ;MAP USER'S IOSB C .IFTF 7! MOV R0,(R2)+ ;STORE STATUS BYTEM MOV R1,(R2) ;IOSB HIGH WORD N .IFTT # MOV (SP)+,KISAR6 ;RESTORE MAPPINGO D .ENDC;$5; ***************************************************I; 73$: I .IF DF A$$TRP T;SA; IF BIT 0 OF THE QIO FUNCTION CODE IS SET, DO NOT QUEUE AST HEREN;T3 BIT #1,I.FCN(R3) ;IS SUBFUNCTION CODE BIT 0 SET?;" BNE 74$ ;YES, DO NOT QUEUE AST;7 TST I.AST(R3) ;AST REQUESTED?V BEQ 74$ ;NO* MOV #6.*2,R1 ;YES, ALLOCATE AN AST BLOCK CALL $ALOCB$ BCS 77$ ;ERROR, NO DYNAMIC MEMORY MOV R0,R1 ;COPY BLOCK ADDRESS+ TST (R0)+ ;POINT PAST AST LIST LINK WORD $ MOV #6.*2,(R0)+ ;SIZE OF AST00¯B‚ƒ�Ž{´cÚµcÛ¶c�·c›’ BLOCK> MOV #8.*2,(R0)+ ;NUMBER OF BYTES TO ALLOCATE ON USER'S STACK* MOV I.AST(R3),(R0)+ ;AST VIRTUAL ADDRESS< MOV #1,(R0)+ ;NUMBER OF EXTRA WORDS TO PUT ON USER'S STACK# MOV I.IOSB(R3),(R0) ;IOSB ADDRESS;' ADD #4,(R0) ;POINT TO 2ND IOSB BLOCK' MOV I.TCB(R3),R0 ;POINT TO TASK'S TCB$. ADD #T.ASTL,R0 ;POINT TO TASK'S AST LISTHEAD3 CALL $QINSF ;INSERT AST BLOCK IN TASK'S AST LISTY74$: , .ENDC B% MOV I.TCB(R3),R5 ;POINT TO TASK TCBA( MOV I.PRM+12(R3),R0 ;SET ARGS FOR SETM MOV I.PRM+14(R3),R1 CALL $SETMN;E;F75$: CMP (SP)+,(SP)+ ;CLEAN STACK I;T76$: RETURN ;RETURN;D;S M;#D; WE RAN OUT OF POOL FOR AST BLOCK. QUEUE STOP PACKET FOR THIS USER9; AND SET BIT 2 OF I.PRM+16 TO SET UP PROPER ERROR CODE.L; .IF DF A$$TRP *77$: MOV (SP)+,R3 ;POP USER TABLE POINTER MOV (SP)+,R5 ;POP UCB POINTER 5 MOV U.LAUT(R3),R2 ;GET THIS USER'S CONVERTED PACKET,' CLR U.LAUT(R3) ;DEACTIVATE THIS ENTRYO7 MOV U.LASL(R5),(R2) ;MOVE STOP QUEUE BEHIND THIS USERV) MOV R2,U.LASL(R5) ;SET NEW QUEUE HEADER:/ BIS #2,I.PRM+16(R2) ;MARK FOR 'NO POOL' ERRORT, JMP GETPKT ;TRY TO DEALLOCATE STOP PACKET P .ENDC ;C;Q;E; STATUS RETURN OF ZEROR'; TRANSFER REQUEST SUCCESSFULLY STARTEDP;E100$: 2 MOV S.PKT(R4),R2 ;GET CURRENT I/O PACKET ADDRESS& MOV R2,U.LAUT(R3) ;STORE IT IN USRTB" MOV R3,R1 ;RETURN INDEX TO USER SUB R5,R1 ;GET INDEX BACK ASR R1C* CLR S.PKT(R4) ;RELINQUISH CURRENT PACKET;L@; THE FOLLOWING CODE TURNS THE ORIGONAL START REQUEST I/O PACKET@; INTO A STOP PACKET FOR ITSELF. THIS ALLOWS ANYONE TO STOP THE,; REQUEST BY SIMPLY RE-QUEUEING THIS PACKET.; MOVB R1,I.PRM+3(R2) ;USER I.D. MOVB #3,I.PRM+2(R2) ;STOP!6 MOV R2,I.PRM+6(R2) ;ADDRESS OF STOP RDA WE JUST MADE8 ADD #I.PRM+2,I.PRM+6(R2) ;ADD IN OFFSET TO PROPER PLACE' CLR I.PRM+10(R2) ;CLEAR EXTENDED BITS @; ABOVE 5 INSTR. CREATE 1 WORD STOP RDA WHICH RESIDES IN IPRM+2.; . BITB #US.MDM,U.STS(R5) ;CANCEL I/O REQUESTED? BNE 101$ ;YES, GO CANCELO& CLR R0 ;IOSB WORD 1 ON ACCEPT START; E; TIMEOUT RAISED TO 255 SEC. IN CASE USER SPECIFIED AN EXTREMELY SLOW F; CLOCK RATE AND IS USING DEDICATED MODE. AFTER THE LPA GETS THE FIRSTD; 256 WORDS OF DATA, IT WILL ISSUE A READY-IN. THE DRIVER WILL CLEARG; THE TIMEOUT THERE. IF THE LPA WILL BE WAITING LONGER THAN 255 SECONDSPB; BEFORE IT CAN ISSUE A READY-IN (DATA SWEEP DELAYED FOR HOURS FOR>; INSTANCE) THIS TIMEOUT CAN BE DISABLED HERE (AND ONLY HERE).; C; ANY READY-IN WILL CLEAR THE TIMEOUT. THUS, IF THE DRIVER RECEIVESOB; ANOTHER REQUEST SUCH AS A CLOCK QIO, THE TIMEOUT LENGTHENED HEREB; WILL BE NULLIFIED WHEN THE LPA ISSUES THE READY-IN FOLLOWING THE; CLOCK REQUEST.;F1 MOVB #255.,S.CTM(R4) ;STRETCH TIMEOUT COUNT NOW. JMP 72$ ;NO, CONTINUE; I; US.MDM FLAGS THAT A CANCEL I/O OCCURED FOR TASK WHILE START REQUEST WASEG; IN PROGRESS. IMMEDIATELY QUEUE A STOP FOR THIS USER INTO THE DRIVERSH; STOP REQUEST QUEUE.L;H6101$: MOV U.LAUT(R3),R1 ;POINT TO ORIGINAL I/O PACKET8 CLR U.LAUT(R3) ;FLAG THAT THE REQUEST IS BEING STOPPED; MOV U.LASL(R5),(R1) ;INSERT IN DRIVERS STOP REQUEST QUEUEU MOV R1,U.LASL(R5) ;POINT TO IT RETURN ;BACK TO CALLER;E); ERROR REPORTED (STATUS RETURN NEGATIVE) ; DISPATCH ON ERROR BITS; 102$:O MOV R0,R2 ;COPY STATUST. BIC #^C<160000>,R2 ;EXTRACT ERROR TYPE FIELD' CMP R2,#160000 ;FATAL HARDWARE ERROR?U BNE 104$ ;NOI. BISB #IE.FHE&377,R0 ;YES, SET RSX ERROR CODE" CLRB S.CTM(R4) ;NO TIME OUTS NOW# BR LAOUT2 ;REPORT ERROR TO USERS(104$:L CMP R2,#140000 ;START ERROR? BEQ 106$ ;YES4 MOV U.LAUT(R3),R2 ;USER ERROR, GET I/O PACKET PNTR BEQ 76$ ;USER NOT ACTIVE NOWT% CLR U.LAUT(R3) ;DEACTIVATE THE USERO% MOV R2,R3 ;COPY I/O PACKET ADDRESST, CMP #124000,R0 ;RESULT OF USW BIT 14 STOP? BNE 103$ ;NO#5 MOVB #IS.SUC&377,R0 ;YES, SET RSX STATUS AS SUCCESS0 ;SIGN EXTEND 0 TO HIGH BYTE1 MOV I.PRM(R2),R1 ;SET WORD COUNT IS IOSB WORD 2O BR 111$ ;FINISH103$:O0 CMP #121400,R0 ;BUFFER OVERRUN/UNDERRUN ERROR? BNE 110$ 00¯J‚û�±|t÷tø tþfDATA ;NOR3 BISB #IE.DAO&377,R0 ;SET RSX OVERRUN ERROR STATUSU BR 111$ ;FINISH106$:I7 MOV S.PKT(R4),R3 ;START ERROR, GET I/O PACKET POINTERL BEQ 76$ ;NO USER HERE NOW% CLR S.PKT(R4) ;CLEAR PACKET POINTERT110$:#. BISB #IE.ABO&377,R0 ;SET RSX STATUS AS ABORT111$:# .IF DF M$$EXT$ TST I.PRM+16(R3) ;ANY UMRS MAPPED? BEQ 113$ ;NO, BRANCHH- CALL UNMAP ;YES, UNMAP AND DEALLOCATE THEM # MOV U.SCB(R5),R4 ;GET SCB POINTER$' CALL $DQUMR ;WAKE UP WAITING PROCESSR .ENDC&113$: CALLR $IOFIN ;FLUSH THE PACKET;T .PAGE+ .SBTTL DEVICE TIME-OUT AND POWERFAIL LOGICI;M'; DEVICE TIME-OUT AND DEVICE POWER FAILC ; RESET LPA11B8; SET I/O COMPLETION FOR ALL USERS WITH STATUS OF IE.PWR;N;T; POWER FAIL ----. ; REQUEST LOADER TASK IF PRESENT;LAPWF: F .IF DF R$$MPL+ BCC 115$ ; IF CC, UNIT POWERFAIL RECOVERYN. RETURN ; IF CS, CONTROLLER RECOVERY, RETURN115$:E .ENDC R .IF DF M$$MGE & L$$DRV & LD$LAD RB MOV S.FRK+8.(R4),U.LAFB+8.(R5) ;INITIALIZES FORK BLOCK IN UCB FOR% ;FORK1 CALL. NEEDED FOR MAPPEDE% ;SYSTEMS WITH LOADABLE DRIVERSE .ENDC U N MOV R5,R3 ;LOADER TASK NAME( ADD #U.CW2,R3 ;IN UCB U.CW2 AND U.CW3* CALL $SRSTD ;IS IT INSTALLED IN SYSTEM?& BCS 112$ ;NO, DON'T LOAD ON STARTUP* MOV #TUIC,R1 ;DEFAULT UIC OF LOADER TASK MOV R4,-(SP) ;SAVE R4 AND R5 MOV R5,-(SP) * CALL $TSKRT ;REQUEST LOADER TASK TO RUN! MOV (SP)+,R5 ;RESTORE R5 AND R4L MOV (SP)+,R4.112$: MOV #IE.VER&377,R0 ;UNRECOVERABLE ERROR( CLRB S.CTM(R4) ;CLEAR TIME OUT COUNTER CLR R1 ;ZERO IOSB+2' BR LAOUT2 ;LET ANY ACTIVE USERS KNOWN;; DEVICE TIME OUT ;OLAOUT: .IF DF M$$PRO! CALL $CFORK ;CORRECT PROCESSORL .ENDC+ MOV 2(R2),R1 ;;;GET LAST READY OUT STATUSD ;;;DATA MAY BE IRRELEVANT CLRB R1 ;;;CLEAR LOW BYTE. BIS R1,R0 ;;;COMBINE LPA STATUS WITH IE.DNR- MOV 6(R2),R1 ;;;GET MAINTENANCE STATUS WORD8LAOUT2: MOVB S.PRI(R4),@#PS ;;;GO TO PRIORITY OF DEVICE8 MOV #40000,@S.CSR(R4) ;;;DO A DEVICE RESET TO MAKE SURE CLRB @#PS ;;;RESET PRIORITY5 CLRB S.STS(R4) ;CLEAR CONTROLLER STATUS TO NOT BUSYO/ BICB #US.BSY,U.STS(R5) ;CLEAR UNIT BUSY STATUS$' BICB #US.MNT,U.STS(R5) ;UNMAPPING FLAGL) MOV S.PKT(R4),R3 ;A REQUEST IN PROCESS?A BEQ 116$ ;NO  .IF DF M$$EXT% TST I.PRM+16(R3) ;ANY UMR'S MAPPED? BEQ 114$ ;NO, BRANCHP# CALL UNMAP ;DEALLOCATE THE UMR'S;. BISB #US.MNT,U.STS(R5) ;MARK UMRS DEALLOCATED114$:@ .ENDC! CALL $IOFIN ;DEALLOCATE PACKET, MOV U.SCB(R5),R4 ;POINT TO SCB- CLR S.PKT(R4) ;CLEAR CURRENT PACKET POINTERR116$: MOV #-7,-(SP)O MOV #U.LAUT,R2O# ADD R5,R2 ;POINT TO USRTB IN UCBC120$: MOV (R2),R3 ;NEXT ENTRY. BEQ 122$ ;NO REQUEST ACTIVE MOV R2,-(SP)R .IF DF M$$EXT% TST I.PRM+16(R3) ;ANY UMR'S MAPPED?E BEQ 121$ ;NO, BRANCH;# CALL UNMAP ;DEALLOCATE THE UMR'SB. BISB #US.MNT,U.STS(R5) ;MARK UMRS DEALLOCATED121$:. .ENDC1 CALL $IOFIN ;REQEUST ACTIVE, TELL HIM ITS OVER MOV (SP)+,R2O122$: CLR (R2)+ ;CLEAR ENTRY& INC (SP) ;ANY MORE ENTRIES IN LIST? BLE 120$ ;YES, CONTINUE TST (SP)+ ;ALL DONE, EXIT .IF DF M$$EXT; MOV U.LAUB(R5),U.LAUB+2(R5) ;INITIALIZE #OF AVAILABLE UMRSQ/ BITB #US.MNT,U.STS(R5) ;ANY UMR'S DEALLOCATED?F BEQ LACANG ;NO, BRANCH($ CALL $DQUMR ;DEQU WAITING PROCESS3 BICB #US.MNT,U.STS(R5) ;CLEAR UMR DEALLOCATED FLAGB .ENDC BR LACANG;  .PAGE;C#; ********************************* ;E@; THIS SUBROUTINE WILL UNMAP THIS USER'S UMRS AND RETURN THEM TO@; THE LPA POOL. IT WILL DEALLOCATE THE WORK BLOCK TAKEN FROM DSR; IN SUBROUTINE 'MAP'.;+ .IF DF M$$EXT5UNMAP: MOV I.PRM+4(R3),R2 ;GET ADDRESS OF WORK BLOCKT ADD #10,R2 ;POINT TO MAP AREA# MOV R3,-(SP) ;SAVE PACKET POINTERT, MOV M.UMRN(R2),R3 ;GET #OF UMRS TO RECOVER ASR R3W ASR R3O' ADD R3,U.LAUB+2(R5) ;RECOVER THE UMRSD$ CALL $DEUMR ;DEALLOCATE THE UMR'S& MOV (SP),R3 ;RESTORE PACKET POINTER MOV R0,-(SP) ;SAVE IOSBS MOV R1,-(SP) ;SAVE IOSB+2S MOV R5,-(SP) ;SAVE UCB POINTER/ MOV I.PRM+4(R3)00¯R‚°W‚Ž{´cÚµcÛ¶c�·c›’,R0 ;GET ADDRESS OF WORK BLOCKE' MOV #20.,R1 ;WORK BLOCK IS 10. WORDS.) CALL $DEACB ;RETURN WORK BLOCK TO POOL;# MOV (SP)+,R5 ;RESTORE UCB POINTERR MOV (SP)+,R1 ;RESTORE IOSB+2 MOV (SP)+,R0 ;RESTORE IOSB& MOV (SP)+,R3 ;RESTORE PACKET POINTER! CLR I.PRM+16(R3) ;MARK UNMAPPED. RETURN) .ENDC .PAGE .SBTTL CANCEL I/O ENTRY;E"; CANCEL I/O FOR A PARTICULAR TASK2; ALL REQUESTS ARE SCANNED FOR THE TCB OF THE TASK6; EACH ACTIVE REQUEST FOR THE TASK IS MARKED FOR ABORT:; ACTUAL REQUEST STOP IS ISSUED AT READY IN INTERRUPT TIME; LACAN:2 MOV #U.LAUT,R0 ;;;POINT TO ACTIVE REQUEST TABLES ADD R5,R0 ;;;IN UCB6 MOV #8.,R2 ;;;NINE POSSIBLE ENTRIES + CURRENT ENTRY* MOV S.PKT(R4),R3 ;;;REQUEST IN PROGRESS?$ BEQ 126$ ;;;NO REQUEST IN PROCESS" CMP I.TCB(R3),R1 ;;;TCB'S MATCH?" BNE 126$ ;;;NO, DON'T CANCEL ITD BISB #US.MDM,U.STS(R5) ;;;YES, MARK REQ. FOR ABORT WHEN IT FINISHES(126$: MOV (R0)+,R3 ;;;NEXT USER ACTIVE? BEQ 130$ ;;;NOA' CMP I.TCB(R3),R1 ;;;TASK TCB'S MATCH?S BNE 130$ ;;;NOA;IF; STOP THE REQUEST BY PLACING THE ORIGONAL I/O PACKET INTO THE DRIVERS; STOP I/O QUEUE; 5 MOV U.LASL(R5),(R3) ;;;INSERT NEXT INTO NEW CURRENTR. MOV R3,U.LASL(R5) ;;;INSERT CURRENT AS FIRST;S& CLR -2(R0) ;;;DEALLOCATE USER TABLE130$: DEC R2 ;;;NEXT USER " BGT 126$ ;;;STILL SOME TO CHECK MTPS #0 ;;;RESET PRIORITY2LACANG: JMP GETPKT ;GO TO GET A PACKET IF WE CAN .PAGE .SBTTL MISC SERVICE ROUTINESB;1-; CONVERT VIRTUAL ADDRESS TO PHYSICAL ADDRESSM; ENTRYB; R0 - CONTAINS VIRTUAL ADDRESSR;E; EXIT; R0 - DESTROYED!; R1 - PHYSICAL ADDRESS BITS 0-15P"; R2 - PHYSICAL ADDRESS BITS 16-17; R3, R4, R5 PRESERVED;UCVTP: V .IF DF M$$MGE I" MOV R0,R2 ;COPY VIRTUAL ADDRESS SWAB R2 ;EXTRACT APR NUMBER .REPT 4 ASR R2E .ENDR BIC #^C<16>,R2S1 MOV UISAR0(R2),R2 ;PAGE ADDRESS FIELD FROM KT11A" MOV R0,R1 ;COPY VIRTUAL ADDRESS ASL R1 ;EXTRACT BLOCK NUMBERC ASL R1R SWAB R1 BIC #^C<177>,R1 ;BLOCK NUMBERP- ADD R2,R1 ;BLOCK NUMBER+PAGE ADDRESS BLOCKT MOV R1,R2 SWAB R2 ;EXTRACT BITS 16-17 .IF NDF M$$EXTR- BIC #^C<14>,R2 ;PHYSICAL ADDRESS BITS 16-177 .IFF4. BIC #^C<374>,R2 ;PHYSICAL ADDRESS BITS 16-21 .ENDC .REPT 6 ;GET BLOCK * 64.A ASL R1X .ENDR BIC #^C<77>,R04( ADD R0,R1 ;PHYSICAL ADDRESS BITS 0-15 S .IFF, - MOV R0,R1 ;LOW 16 BITS IS PHYSICAL ADDRESSO CLR R2L D .ENDC R RETURNA .ENDK NUMBERC ASL R1R SWAB R1 BIC #^C<177>,R1 ;BLOCK NUMBERP- ADD R2,R1 ;BL .TITLE XMDRV  .IDENT /04.1/;V); COPYRIGHT (C) 1976, 1977,1979,1980,1981.5; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. 01754T;6<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE<; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS:; SOFTWARE OR ANY OTHER COPIES THEREOF MAY NOT BE PROVIDED>; OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO6; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.;L?; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT17; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ; DIGITAL EQUIPMENT CORPORATION.;F>; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY@; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.; ; VERSION 04;H; DMC-11 DRIVER ;T;E/; MPP005 -- ALLOW MODE CHANGE ONLY WHEN DEVICE ; IS OFFLINED; $; RC006 -- GENERAL FIX UP FOR M V3.2;#; IZ004 -- CORRECT UMR DEALLOCATIONR; E; RWS002 -- CORRECT SYSTEM CRASH BECAUSE NO I/O PACKET ON QUEUE AFTERG*; IOKILL OR LINE GOING DOWN SPR11-60550# .SBTTL LIBRARY MACROS ;JFR002I* .MCALL CUCDF$,INTSV$,PKTDF$,SCBDF$,UCBDF$( CUCDF$ ;COMMUNICATIONS UCB DEFINITIONS PKTDF$ ;I/O PACKET DEFINITIONS SCBDF$ ;SCB DEFINITIONSA UCBDF$ ;UCB DEFINITIONS  -' .SBTTL CONDITIONAL ASSEMBLY PARAMETERSE; 22 BIT ADDRESSINGE .IIF DF M$$MGE & M$$EXT, X$$22=0; 18 BIT ADDRESSING .IF DF M$$MGE0.IIF NDF M$$EXT, X$$18=0.ENDC #; QIO DRIV00°Z‚û�±|t÷tø tþfDATAER PLUS 22 BIT ADDRESSINGE.IIF DF X$$22 Q$$22=0  X$$M11=X$$M11 ; DON'T LAUGHN ; LOADABLE DRIVER MAPPING NEEDED .IIF DF M$$MGE & LD$XM, X$$LDM=0; DYNAMIC UMR ALLOCATION COUNT .IF DF R$$MPL!V$$RSN&Q$$22B.IIF NDF XM$UMR, XM$UMR=5 .IIF NE XM$UMR-3, XM$UMR=5.ENDCE I .SBTTL EQUATED SYMBOLSI; BIT ASSIGNMENTS BIT0=1BIT1=2BIT2=4BIT3=10BIT4=20TBIT5=40NBIT6=100BIT7=200BIT8=400 BIT9=1000 BIT10=2000 BIT11=4000 BIT12=10000I BIT13=20000, BIT14=40000D BIT15=100000; CSR INDEX VALUESSEL0=0SEL2=2; SEL0 ASSIGNMENTSRUN=BIT15 ;RUN'MC=BIT14 ;MASTER CLEARI*RDYI=BIT7 ;MICROPROCESSOR READY FOR INPUT!IEI=BIT6 ;INPUT INTERRUPT ENABLENRQI=BIT5 ;REQUEST INV!TYPE=BIT2!BIT1!BIT0 ;REQUEST TYPEMRELEAS=RQI!IEI ;PORT RELEASE5; SEL0 INPUT TRANSACTION TYPES-BACCI=RQI ;BUFFER ADDRESS/CHARACTER COUNT IN2CNTLI=RQI!BIT0 ;CONTROL IN4BASEI=RQI!BIT1!BIT0 ;BASE INXMT=BACCI ;TRANSMIT BUFFERIRCV=BACCI!BIT2 ;RECEIVE BUFFER09PERR=BASEI ;CAUSE PROCEDURE ERROR BY DOING BASE IN TWICE0; SEL2 ASSIGNMENTS+RDYO=BIT7 ;MICROPROCESSOR READY FOR OUTPUT "IEO=BIT6 ;OUTPUT INTERRUPT ENABLE; SEL6 ASSIGNMENTS (CNTLI)HDX=BIT10 ;HALF DUPLEX=,SCNDRY=BIT11 ;HALF DUPLEX SECONDARY STATIONMOP=BIT8 ;MAINTENANCE MODER; SEL6 ASSIGNMENTS (BASEI)FRESUME=BIT12 ;RESUME AFTER POWERFAIL (PERIPHERALS HANDBOOK IS WRONG!); SEL6 ASSIGNMENTS (CNTLO)/DATACK=BIT0 ;RETRANSMISSION THRESHOLD EXCEEDEDI/TIMOUT=BIT1 ;NO REMOTE RESPONSE FOR 21 SECONDSC4ORUN=BIT2 ;MESSAGE RECEIVED BUT NO BUFFER AVAILABLE'MAINT=BIT3 ;DDCMP MAINTENANCE RECEIVEDR*LOST=BIT4 ;MESSAGE RECEIVED > BUFFER SIZE;DISCON=BIT6 ;MODEM DATA SET READY LEAD WENT FROM ON TO OFFE!START=BIT7 ;DDCMP START RECEIVEDN1MEMORY=BIT8 ;UNIBUS TIME-OUT ON MEMORY REFERENCE6BUG=BIT9 ;PROGRAM BUG!U<UNXINT=BIT14 ;UNEXPECTED INTERRUPT, NO I/O PACKET AVAILABLE(FATAL=TIMOUT!MAINT!LOST!START!MEMORY!BUG; U.CW3 ASSIGNMENTST0U3.ERR=BIT15 ;HAS FATAL ERROR OCCURRED? (1=YES).U3.KIL=BIT14 ;HAS I/O KILL BEEN DONE? (1=YES)(U3.PWF=BIT13 ;HAS POWER FAILED? (1=YES)-U3.MOD=HDX!SCNDRY!MOP ;CURRENT OPERATING MODEE.U3.FRK=BIT0 ;IS FORK PROCESS RUNNING? (1=YES); UCB DISPLACEMENTS USED .ASECTT .=U.VCB+2(U.XQ: .BLKW 1 ;TRANSMIT LISTHEAD ADDRESS'U.RQ: .BLKW 1 ;RECEIVE LISTHEAD ADDRESS U.ERR: .BLKW 1 ;ERROR STATUSU.LEN=.E .PSECTP0; MAXIMUM NUMBER OF BUFFERS WHICH DMC CAN HANDLE .IF DF Q$$22 .IF DF V$$RSN!R$$MPLT.IIF EQ XM$UMR-3, MAXBUF=1.ENDCO.IIF NDF MAXBUF, MAXBUF=2T.ENDCS.IIF NDF MAXBUF, MAXBUF=7); LISTHEAD DISPLACEMENTS .ASECT= .=0 .BLKW 2 ;SENT QUEUE .BLKW 2 ;WAIT QUEUE"IOTYPE: .BLKB 1 ;SEL0 REQUEST TYPECOUNT: .BLKB 1 ;SENT COUNT .IF DF Q$$22UMR: .BLKW 1 ;NEXT UMR TO USEK*UMRSUM: .BLKW 1 ;SUM OF BOTH UMR ADDRESSES .ENDC .PSECTA; FIRST UMR ADDRESSWFIRSTUMR=1702000; WHERE BUFFER ADDRESS AND COUNT ARE TO BE FOUND X.PRM=I.PRMA"; DEVICE INITIALIZATION WAIT TIMES<S.WAIT=200. ;LOOP COUNTDOWN VALUE WAITING FOR RDYI TO BE SET1C.WAIT=100. ;DITTO WAITING FOR RDYI TO BE CLEAREDT D .SBTTL LOCAL DATA; MICROPROCESSOR BASE TABLE(S):; *** WARNING *** THIS MUST BE THE FIRST ASSEMBLY LOCATIONBASE: .REPT X$$M11 .BLKW 128.  .ENDR; DRIVER DISPATCH TABLES .IF DF R$$MPL( DDT$ XM,X$$M11,,INIT,CNTBL,NEW .IFF$ DDT$ XM,X$$M11,,INIT,CNTBL .ENDC; TEMPORARY UNIT SAVEC .IF GT X$$M11-1 TEMP: .BLKW 1A .ENDC ; LISTHEADSTLIST: .REPT X$$M11 .WORD 0,.-2 ;COMPLETED BUFFERST# .WORD 0,.-2 ;TRANSMITS SENT (U.XQ)D .WORD 0,.-2 ;TRANSMITS WAITINGE .BYTE XMT,0 .IF DF Q$$22 .BLKW 2 .IFTF" .WORD 0,.-2 ;RECEIVES SENT (U.RQ) .WORD 0,.-2 ;RECEIVES WAITING .BYTE RCV,0 .IFTM .BLKW 2 .ENDC .ENDR$; MULTIPLE UNIT BASE TABLE ADDRESSES .IF NDF X$$LDM1 .IF GT X$$M11-1BTAB:W BADDR=BASE .REPT X$$M11I .WORD BADDRBADDR=BADDR+256. .ENDR .ENDC .ENDC"; MULTIPLE UNIT LISTHEAD ADDRESSES .IF GT X$$M11-1XLTAB: XLADDR=LIST+4O .REPT X$$M11E .WORD XLADDR. .IF DF Q$$22NXLADDR=XLADDR+32. .IFF0XL00°b‚W‚Ž{´cÚµcÛ¶c�·c›’ADDR=XLADDR+24.T .ENDC .ENDR .ENDC; ADDRESS EXTENSION BITS .IF DF M$$MGE"AXTAB: .WORD 0,40000,100000,140000 .ENDC I .SBTTL INITIATE I/O;+; **-XMINIT-INITIATE DMC I/O;T ; INPUTS:A; R5=UCB ADDRESS;. ; OUTPUTS:; ALL I/O PACKETS PROCESSED;D; NOTE:.>; IF TIMER IS ACTIVE, DISCONNECT ERROR RECOVERY IS IN PROGRESS;- XMRET: RETURNU%XMINIT: MOV U.SCB(R5),R4 ;SCB ADDRESS1! TSTB S.CTM(R4) ;IS TIMER ACTIVE?1# BNE XMRET ;IF NE, YES - MUST WAITL* MOVB S.STS(R4),-(SP) ;SAVE ACTIVITY COUNT, CLRB S.STS(R4) ;DECLARE CONTROLLER NOT BUSY+ BICB #US.BSY,U.STS(R5) ; AND IDLE THE UNIT0- CALL $GTPKT ;GET AN I/O PACKET IF AVAILABLE- MOVB (SP)+,S.STS(R4) ;RESTORE ACTIVITY COUNTA# BCS XMRET ;IF CS, NO MORE PACKETSL; ; $GTPKT RETURNS THE FOLLOWING:; R1=I/O PACKET ADDRESSC"; R2=PHYSICAL UNIT NUMBER (U.UNIT); R3=CONTROLLER INDEX (S.CON)O; R4=SCB ADDRESS; R5=UCB ADDRESS;. MOV R5,R2 ;UCB ADDRESS ADD #U.CW2,R2 ;U.CW2 ADDRESST9 CMPB #IO.INL/256.,I.FCN+1(R1);IS IT A TRANSFER FUNCTION?  BLOS 2$ ;IF LOS, NOL) JMP TRAN ;ELSE IT IS A TRANSFER REQUEST ;E; CONTROL FUNCTION;T(2$: BNE 20$ ;IF NE, MODE CHANGE REQUEST* TSTB I.FCN(R1) ;IS IT TERMINATE FUNCTION? BNE 10$ ;IF NE, YESR;A; INITIALIZE (IO.INL)R;R- BIT #U2.ONL,(R2) ;IS DEVICE ALREADY ON-LINE?  BNE PKTOK ;IF NE, YESU# MOV R5,CNTBL(R3) ;SAVE UCB ADDRESSO .IF GT X$$M11-1, MOV XLTAB(R3),R0 ;TRANSMIT LISTHEAD ADDRESS .IFF#* MOV #LIST+4,R0 ;TRANSMIT LISTHEAD ADDRESS .ENDC0 MOV R0,U.XQ(R5) ;SAVE TRANSMIT LISTHEAD ADDRESS# ADD #COUNT,R0 ;POINT TO SENT COUNTS CLRB (R0)+ ;ZERO IT OUT .IF DF Q$$22  .IF DF V$$RSN!R$$MPLN .IF NDF R$$MPLT/ TST S.MPR+2(R4) ;DOES UMR BLOCK ALREADY EXIST?  .IFF + MOV S.KRB(R4),R2 ; MOV KRB ADDRESS INTO R22( ADD K.OFF(R2),R2 ;POINT TO UMR AREA + 2+ SUB #M.LGTH,R2 ;POINT TO START OF UMR AREAV! TST (R2) ; IS IT ALREADY SET UP? .ENDC BNE 6$ ;IF NE, YES (!!!) MOV R0,-(SP) ;SAVE R0% MOV R1,-(SP) ;AND THE PACKET ADDRESS. MOV R2,-(SP) ;AND SAVE R22 MOV #M.LGTH,R1 ;SET SIZE OF BLOCK TO BE REQUESTED- CALL $ALOCB ;TRY TO ALLOCATE THE DATA BLOCK. BCS 4$ ;IF C-SET WE FAILED0 MOV #,M.UMRN(R0) ;SETUP UMR COUNT * 4" CALL $ASUMR ;TRY TO GET THE UMRS BCC 5$ ;IF C-CLEAR WE GOT THEM, CALL $DEACB ;ELSE GIVE BACK THE DATA BLOCK4$: MOV (SP)+,R2 ;RESTORE R2! MOV (SP)+,R1 ;AND PACKET ADDRESS  TST (SP)+ ;POP THE STACK6 BR XMRSU ;AND REPORT THE RESOURCE ALLOCATION FAILURE5$: MOV (SP)+,R2 ;RESTORE R2 .IF NDF R$$MPL,) MOV M.UMRA(R0),S.MPR(R4) ;SAVE FIRST UMRZ. MOV R0,S.MPR+2(R4) ;AND THE UMR BLOCK ADDRESS .IFFA$ MOV M.UMRA(R0),(R2) ;SAVE FIRST UMR) MOV R0,2(R2) ; AND THE UMR BLOCK ADDRESST .ENDC= MOV R5,M.UMVL(R0) ;MARK THE UMR BLOCK (FOR SYSTEM DEBUGGING)E) MOV (SP)+,R1 ;RESTORE THE PACKET ADDRESSC' MOV (SP)+,R0 ;AND THE LISTHEAD POINTERR .ENDC .IF NDF R$$MPLC16$: MOV S.MPR(R4),R2 ;FIRST UMR IS FOR BASE TABLE  .IFFE.6$: MOV S.KRB(R4),R2 ; MOV KRB ADDRESS INTO R2( ADD K.OFF(R2),R2 ;POINT TO UMR AREA + 2+ SUB #M.LGTH,R2 ;POINT TO START OF UMR AREAR* MOV (R2),R2 ;R2=FIRST UMR FOR BASE TABLE .ENDC9 CMP (R2)+,(R2)+ ;SECOND AND THIRD UMRS ARE FOR TRANSMITS ! MOV R2,(R0)+ ;SECOND UMR ADDRESS, MOV R2,(R0) .IF EQ MAXBUF-2 & CMP (R2)+,(R2)+ ;GET TO THE THIRD UMR .ENDCC4 ADD R2,(R0)+ ;SUM OF SECOND AND THIRD UMR ADDRESSES .IFTF/ MOV R0,U.RQ(R5) ;SAVE RECEIVE LISTHEAD ADDRESSS .IFT # ADD #COUNT,R0 ;POINT TO SENT COUNTM CLRB (R0)+ ;ZERO IT OUTD8 CMP (R2)+,(R2)+ ;FOURTH AND FIFTH UMRS ARE FOR RECEIVES! MOV R2,(R0)+ ;FOURTH UMR ADDRESS, MOV R2,(R0) .IF EQ MAXBUF-2.& CMP (R2)+,(R2)+ ;GET TO THE FIFTH UMR .ENDC 4 ADD R2,(R0) ;SUM OF FOURTH AND FIFTH UMR ADDRESSES .IFF, CLRB COUNT(R0) ;ZERO OUT RECEIVE SENT COUNT .ENDC& CALL SETDMC ;INITIALIZE DMC HARDWARE$ BCS XMINF ;IF CS, HARDWARE TROUBLE' BIS #U2.ONL,U.CW2(R5) ;SET ON-LINE BITR8 BIC #^C,U.CW3(R5) ;CLEAR EVERYTHING EXCEPT MODE$ BR PKTOK ;RETURN SUCCESSFUL STATUS;+; TERMINAT00°j‚û�±|t÷tø tþfDATAE (IO.TRM);R&10$: MOV R1,-(SP) ;SAVE PACKET ADDRESS CLR R0 ;NO SPECIAL ERROR CODEM CALL KILL ;KILL THE DEVICE-16$: MOV (SP)+,R1 ;RESTORE THE PACKET ADDRESSO$ BR PKTOK ;RETURN SUCCESSFUL STATUS;; MODE CHANGE FUNCTION;U)20$: BIT #U2.ONL,(R2) ;IS DEVICE ON-LINE?  BNE XMDNR ;IF NE, YES4 BITB #IO.HDX,I.FCN(R1);IS SUB-FUNCTION HALF-DUPLEX? BNE 30$ ;IF NE, YES 4 BITB #IO.FDX,I.FCN(R1);IS SUB-FUNCTION FULL DUPLEX? BEQ XMIFC ;IF EQ, NO;N; FULL DUPLEX (IO.FDX);E6 BIT #U2.LIN,(R2) ;WAS DEVICE SYSGENED AS HALF-DUPLEX? BNE XMIFC ;IF NE, YESE, BIC #U2.HDX,(R2)+ ;SET FULL DUPLEX IN U.CW2$ CLR (R2) ;HALF-DUPLEX MODE BIT OFF BR 50$R;O; HALF-DUPLEX (IO.HDX);S030$: BIS #U2.HDX,(R2)+ ;SET HALF-DUPLEX IN U.CW2$ MOV #HDX,(R2) ;HALF-DUPLEX MODE BIT( TST I.PRM(R1) ;LOOK AT QIO PARAMETER P1! BEQ 40$ ;IF EQ, PRIMARY STATIONP+ BIS #SCNDRY,(R2) ;IF NE, SECONDARY STATION..40$: TST I.PRM+2(R1) ;LOOK AT QIO PARAMETER P2 BEQ 50$ ;IF EQ, NORMAL MODE ' BIS #MOP,(R2) ;IF NE, MAINTENANCE MODEC50$: ;FALL THRU TO PKTOKB I .SBTTL FINISH I/O PACKETH;+0; **-PKTOK-FINISH PACKET WITH STATUS OF "IS.SUC"; **-FINPKT-ALTERNATE ENTRYO; ; INPUTS: ; R1=I/O PACKET ADDRESS2; R5=UCB ADDRESS;D; CALLING SEQUENCE:# ; JMP PKTOKF;P ; OUTPUTS:; PACKET FINISHEDO(; XMINIT CALLED TO START ANY NEW PACKETS;-.PKTOK: MOV #IS.SUC&377,-(SP);SUCCESSFUL STATUS)FINPKT: MOV R1,-(SP) ;SAVE PACKET ADDRESSI! CALL XMINIT ;TRY ANOTHER PACKETO% MOV (SP)+,R3 ;RESTORE PACKET ADDRESST MOV (SP)+,R0 ;STATUS WORD 1 CLR R1 ;STATUS WORD 2 = 0I! CALLR $IOFIN ;FINISH I/O PACKETF;S; DEVICE NOT READY; !XMINF: .IF DF R$$MPL!V$$RSN&Q$$22R CALL DEUMR ;DE-ALLOCATE UMR'SE .ENDCXMDNR: MOV #IE.DNR&377,-(SP) BR FINPKT;#; ILLEGAL BUFFER; XMSPC: MOV #IE.SPC&377,-(SP) BR FINPKT; ; ILLEGAL FUNCTION CODE;XMIFC: MOV #IE.IFC&377,-(SP) BR FINPKT;S; RESOURCE ALLOCATION FAILUREC;  .IF DF R$$MPL!V$$RSN&Q$$22AXMRSU: MOV #IE.RSU&377,-(SP) BR FINPKT .ENDC T% .SBTTL PROCESS QIO TRANSFER FUNCTION ;T; TRANSFER FUNCTIONR;O*TRAN: BIT #U2.ONL,(R2) ;IS DEVICE ON-LINE? BEQ XMDNR ;IF EQ, NO .IF DF X$$225 BIT #160000,I.PRM+4(R1) ;IS BUFFER SIZE >= 4K WORDS?E# ;BUFFER MUST BE MAPPED BY 1 UMRE .IFF5 BIT #140000,I.PRM+4(R1) ;IS BUFFER SIZE >= 8K WORDS?  .ENDCU+ BNE XMSPC ;IF NE, YES - BUFFER IS TOO BIG$ INCB S.STS(R4) ;INCR ACTIVITY COUNT .IF DF X$$18) MOV I.PRM(R1),R0 ;GET NPR EXTENSION BITSU+ SWAB R0 ;AND SHIFT FROM BIT POSITIONS 5-4R ASL R0 ;TO BIT POSITIONS 15-14 ASL R0F- BIS R0,I.PRM+4(R1) ;THEN AND WITH BYTE COUNTS .ENDCN7 CMPB #IO.WLB/256.,I.FCN+1(R1) ;IS IT A WRITE FUNCTION?0 BEQ 10$ ;IF EQ, YESE;I!; RECEIVE DATA (IO.RLB OR IO.RNS)B;A* MOV U.RQ(R5),R0 ;RECEIVE LISTHEAD ADDRESS BR 20$B;E"; TRANSMIT DATA (IO.WLB OR IO.WNS);X/10$: MOV U.XQ(R5),R0 ;TRANSMIT LISTHEAD ADDRESST/20$: MOV #XMINIT,-(SP) ;SET TO RETURN TO XMINITV ;FALL THRU TO TRYE N+ .SBTTL TRY TO GIVE TRANSFER REQUEST TO DMCI;+,; **-TRY-TRY TO GIVE TRANSFER REQUEST TO DMC; ; INPUTS:R+; R0=SENT Q LISTHEAD ADDRESS (U.XQ OR U.RQ); R1=I/O PACKET ADDRESSN; R4=SCB ADDRESS; R5=UCB ADDRESS;1$; OUTPUTS IF PORT WAS NOT AVAILABLE:; R0=WAIT Q LISTHEAD ADDRESS; R2,R3=DESTROYED ; R4=CSR ADDRESS; PACKET QUEUED ON WAIT QT;I.; OUTPUTS IF PORT WAS AVAILABLE BUT NOT READY:; R0=WAIT Q LISTHEAD ADDRESS; R2,R3=DESTROYEDE; R4=CSR ADDRESS; REQUEST TYPE!IEI LEFT IN SEL0; PACKET QUEUED ON WAIT QR;Q*; OUTPUTS IF PORT WAS AVAILABLE AND READY:; R2,R3=DESTROYEDC; R4=CSR ADDRESS$; DMC GIVEN BUFFER ADDRESS AND COUNT; DMC PORT RELEASEDE; SENT COUNT INCREMENTED; PACKET QUEUED ON SENT Q ;-'TRY: MTPS S.PRI(R4) ;DISABLE INTERRUPTS MOV S.CSR(R4),R4 ;;;CSR ADDRESS TST 4(R0) ;;;IS WAIT Q EMPTY?Q+ BNE 30$ ;;;IF NE, NO - NO ACTION POSSIBLEV! CALL PORT ;;;IS PORT AVAILABLE?  BCS 30$ ;;;IF CS, NO- BIT #RDYO,2(R4) ;;;IS OUTPUT TRANSFER READY?I( BNE 20$ ;;;IF NE, YES - USE INTERRUPTS M00°r‚W‚Ž{´cÚµcÛ¶c�·c›’OV #4,R2 ;;;LOOP COUNTA.10$: BIT #RDYI,(R4) ;;;IS DMC READY FOR INPUT? BNE 40$ ;;;IF NE, YES  SOB R2,10$ ;;;,20$: BIS #IEI,(R4) ;;;ENABLE INPUT INTERRUPT BIS #IEI,(R4) ;;;TWICE /30$: CMP (R0)+,(R0)+ ;;;WAIT Q LISTHEAD ADDRESSR( CALL $QINSF ;;;INSERT PACKET ON WAIT Q ;;;NOTE-$QINSF DESTROYS R2 BR 50$ ;;;*40$: CALL GIVE ;;;GIVE PACKET INFO TO DMC%50$: MTPS #0 ;;;RE-ENABLE INTERRUPTSI RETURN T4 .SBTTL LOAD DATA PORT WITH BUFFER ADDRESS AND COUNT;+.; **-GIVE-GIVE BUFFER ADDRESS AND COUNT TO DMC;A ; INPUTS:#; R0=SENT Q LISTHEAD ADDRESS; R1=I/O PACKET ADDRESSE; R4=CSR ADDRESS; DMC READY FOR INPUTR;; ; OUTPUTS:; R2,R3=DESTROYED#$; DMC GIVEN BUFFER ADDRESS AND COUNT; DMC PORT RELEASED ; SENT COUNT INCREMENTED; PACKET INSERTED ON SENT Q ;-,GIVE: INCB COUNT(R0) ;;;INCREMENT SENT COUNT .IF DF Q$$22A$ MOV R0,R2 ;;;COPY LISTHEAD ADDRESS" MOV UMR(R2),R0 ;;;NEXT UMR TO USE1 MOV UMRSUM(R2),UMR(R2) ;;;RESET NEXT UMR ADDRESS SUB R0,UMR(R2) ;;;B& MOV R2,-(SP) ;;;SAVE LISTHEAD ADDRESS0 MOV X.PRM(R1),R2 ;;;PUT 18 BIT ADDRESS IN R2,R3 SWAB R2 ;;;  MOV X.PRM+2(R1),R3 ;;;D4 CALL MAP22 ;;;DO 22 BIT MAPPING AND LOAD DATA PORT, BIS X.PRM+4(R1),6(R4) ;;;INCLUDE BYTE COUNT) MOV (SP)+,R0 ;;;RESTORE LISTHEAD ADDRESST .IFFE1 MOV X.PRM+2(R1),4(R4) ;;;GIVE DMC BUFFER ADDRESS # MOV X.PRM+4(R1),6(R4) ;;;AND COUNT, .ENDC% BIC #RELEAS,(R4) ;;;RELEASE THE PORTN) CALLR $QINSF ;;;INSERT PACKET ON SENT QR ;;;NOTE-$QINSF DESTROYS R2 ( .SBTTL INITIALIZE DMC HARDWAREI;+#; **-SETDMC-INITIALIZE DMC HARDWARE ; ; INPUTS:R; R3=CONTROLLER INDEX (S.CON)M; R4=SCB ADDRESS; R5=UCB ADDRESS; U3.MOD=DMC MODEO;D ; OUTPUTS:; R0,R2,R3=DESTROYED; R4=CSR ADDRESS; CARRY CLEAR=OK); CARRY SET=HARDWARE NOT WORKING PROPERLYX;- .ENABL LSB;3SETDMC: CLR U.ERR(R5) ;CLEAR ERROR STATUS AND C-BIT .IF DF X$$22 .IF NDF R$$MPL ) MOV S.MPR(R4),R0 ;GET THE BASE TABLE UMRE .IFFE+ MOV S.KRB(R4),R0 ; MOV KRB ADDRESS INTO R0( ADD K.OFF(R0),R0 ;POINT TO UMR AREA + 2+ SUB #M.LGTH,R0 ;POINT TO START OF UMR AREA ! MOV (R0),R0 ;GET BASE TABLE UMRC .ENDC .ENDC MOV S.CSR(R4),R4 ;CSR ADDRESS# BIS #MC,(R4) ;MASTER CLEAR THE DMC3C; THE FOLLOWING INSTRUCTION NEEDED WITH COMIOP BOARD AND OK WITHOUTN( MOV #RUN,(R4) ;START THE MICROPROCESSOR- BIS #IEO,2(R4) ;ENABLE COMPLETION INTERRUPTS ' MOVB #BASEI,(R4) ;BASE IN REQUEST TYPE CALL WRDYIS ;WAIT FOR RDYI SET BCS 40$ ;IF CS, TROUBLEK;R2; THE BASE TABLE ADDRESS IS CALCULATED AS FOLLOWS:0; IF UNMAPPED, USE EITHER "#BASE" OR "BTAB(R3)".=; IF MAPPED AND DMC DRIVER IS NOT LOADABLE, SAME AS UNMAPPED.;; IF MAPPED AND DMC DRIVER IS LOADABLE, USE KISAR5 CONTENTSE; SHIFTED LEFT 6 PLACES.L;N9; THUS, THE UMR IS ALWAYS SET TO THE ADDRESS OF THE FIRSTV<; BASE TABLE AND THE 18 BIT ADDRESS IS ADJUSTED ACCORDINGLY.;P .IF DF X$$LDM CLR R2 ;NO EXTENSION BITS YETE .IF DF X$$22 ASR R3 ;CALCULATE UNIT # * 400 SWAB R3 MOV R3,-(SP) ;SAVE IT ON STACKE5 MOV KISAR5,R3 ;UMR ALWAYS POINTS TO FIRST BASE TABLE  .IFF% ASL R3 ;BASE TABLE DISPLACEMENT/100I' ADD KISAR5,R3 ;PLUS DRIVER ADDRESS/100M .IFTFM" MOV #6,-(SP) ;NOW MULTIPLY BY 100#5$: ASL R3 ;BY SHIFTING R2,R3 LEFT ROL R2 ;6 PLACES DEC (SP) ;DONE?D BNE 5$ ;IF NE, NO  TST (SP)+ ;PURGE LOOP COUNTS .IFT2 CALL MAP22 ;DO 22 BIT MAPPING AND LOAD DATA PORT5 ADD (SP)+,4(R4) ;ADJUST BY MULTIPLE BASE TABLE INDEXL .IFF% MOV R3,4(R4) ;LOW 16 BITS OF ADDRESSO ASL R2 ;MAKE A WORD INDEX , MOV AXTAB(R2),6(R4) ;ADDRESS EXTENSION BITS .ENDC; .IFFE .IF GT X$$M11-1A+ MOV BTAB(R3),4(R4) ;LOW 16 BITS OF ADDRESSI .IFF( MOV #BASE,4(R4) ;LOW 16 BITS OF ADDRESS .ENDC  CLR 6(R4) ;NO EXTENSION BITS .ENDC3 CALL WRDYIC ;RELEASE PORT AND WAIT FOR RDYI CLEARR BCS 40$ ;IF CS, TROUBLE* MOVB #CNTLI,(R4) ;CONTROL IN REQUEST TYPE CALL WRDYIS ;WAIT FOR RDYI SET BCS 40$ ;IF CS, TROUBLEL0 MOV U.CW3(R5),-(SP) ;STRIP MODE BITS FROM U.CW3 BIC #^C,(SP)R MOV (SP)+,600°z‚û�±|t÷tø tþfDATA(R4) ;SET DMC MODE ;FALL THRU TO WRDYIC;E&; RELEASE PORT AND WAIT FOR RDYI CLEAR;B*WRDYIC: BIC #RELEAS,(R4) ;RELEASE THE PORT MOV #C.WAIT,R2 ;LOOP COUNTB'10$: BIT #RDYI,(R4) ;IS RDYI STILL SET?N BEQ 40$ ;IF EQ, NO SOB R2,10$ # BR 30$ ;RDYI NOT CLEARED PROPERLYY;L; WAIT FOR RDYI SETS;R"WRDYIS: MOV #S.WAIT,R2 ;LOOP COUNT!20$: BIT #RDYI,(R4) ;IS RDYI SET?  BNE 40$ ;IF NE, YES SOB R2,20$L!30$: SEC ;RDYI NOT SET PROPERLYE 40$: RETURNC .DSABL LSB. > .SBTTL DO 22 BIT MAPPINGE;+/; **-MAP22-DO 22 BIT MAPPING AND LOAD DATA PORTT;D ; INPUTS:D; R0=UMR ADDRESS; R2,R3=22 BIT PHYSICAL ADDRESS ; R4=CSR ADDRESS; ; OUTPUTS:; R0,R2,R3=DESTROYED"; UMR LOADED WITH PHYSICAL ADDRESS*; DATA PORT LOADED WITH 18 BIT UMR ADDRESS;- .IF DF X$$22 &MAP22: MOV R3,(R0) ;COPY R2,R3 TO UMR- BIC #1,(R0)+ ;FIRST WORD OF UMR MUST BE EVENS MOV R2,(R0)+ * SUB #FIRSTU+4,R0 ;UMR# IS NOW IN BITS 6-2 SWAB R0 ASL R0( CLR R2 ;FORM AN 18 BIT NUMBER IN R2,R0- ASL R0 ;WITH BITS 17-13 CONTAINING THE UMR#M ROL R2D ASL R0A ROL R2D ROR R3 ;ODD/EVEN BIT TO CARRY & ADC R0 ;AND THEN TO BIT 0 OF ADDRESS2 MOV R0,4(R4) ;LOW 16 BITS OF ADDRESS TO DATA PORT ASL R2 ;MAKE A WORD INDEXS9 MOV AXTAB(R2),6(R4) ;ADDRESS EXTENSION BITS TO DATA PORT  RETURN .ENDC , .SBTTL PROCESS RDYI INTERRUPT;); PROCESS RDYI INTERRUPT;EC$XMINP::INTSV$ XM,PR5,X$$M11,,CNTBL ;;;GENERATE INTERRUPT SAVE CODEA0 JSR R0,XMSET ;;;DO INTERRUPT SETUP AND TRANSFER .WORD SEL0 ;;;CSR INDEX $ .WORD XMTRDY ;;;TRANSFER ADDRESSES .WORD BAD .WORD BAD .WORD FPERR .WORD RCVRDY .WORD BAD .WORD BAD .WORD BAD;; DMC READY FOR TRANSMIT BUFFERR; 4XMTRDY: MOV U.XQ(R5),R0 ;;;TRANSMIT LISTHEAD ADDRESS$ JSR R1,RDYINT ;;;GIVE BUFFER TO DMC;A; DMC READY FOR RECEIVE BUFFER;B3RCVRDY: MOV U.RQ(R5),R0 ;;;RECEIVE LISTHEAD ADDRESSR$ JSR R1,RDYINT ;;;GIVE BUFFER TO DMC;N; FORCE PROCEDURE ERROR ;E5FPERR: BIC #RELEAS,(R4) ;;;CLEAR RQI WHICH WILL CAUSER BR XMINTX ;;;CNTLO INTERRUPT D3 .SBTTL PROCESS COMPLETION OR CONTROL OUT INTERRUPTD;O; PROCESS COMPLETION INTERRUPT;DC$XMOUT::INTSV$ XM,PR5,X$$M11,,CNTBL ;;;GENERATE INTERRUPT SAVE CODEM0 JSR R0,XMSET ;;;DO INTERRUPT SETUP AND TRANSFER .WORD SEL2 ;;;CSR INDEXF$ .WORD XMTCOM ;;;TRANSFER ADDRESSES .WORD CNTLO .WORD BAD .WORD BAD .WORD RCVCOMH .WORD CNTLO .WORD BAD .WORD BAD;E; TRANSMIT BUFFER COMPLETE; 4XMTCOM: MOV U.XQ(R5),R0 ;;;TRANSMIT LISTHEAD ADDRESS) JSR R1,BUFCOM ;;;PROCESS BUFFER COMPLETET;D; RECEIVE BUFFER COMPLETEN; 3RCVCOM: MOV U.RQ(R5),R0 ;;;RECEIVE LISTHEAD ADDRESST) JSR R1,BUFCOM ;;;PROCESS BUFFER COMPLETEN; ; CONTROL OUTE;P)CNTLO: MOV 4(R4),R0 ;;;COPY SEL6 CONTENTS # BIC #RDYO,(R4) ;;;RELEASE THE PORTS( BIS R0,U.ERR(R5) ;;;UPDATE ERROR STATUS& BIT #FATAL,R0 ;;;IS IT A FATAL ERROR? BEQ 20$ ;;;IF EQ, NO/ BIT #BUG,R0 ;;;IS IT DISCONNECT ERROR PART 2?B BEQ 10$ ;;;IF EQ, NO MOV U.SCB(R5),R4 ;;;SCB ADDRESS; MOVB #2,S.CTM(R4) ;;;SET TIMER FOR BETWEEN 1 AND 2 SECONDS ) ;;;NOTE-ONLY 1 SECOND DELAY IS NEEDED.+ BR XMFRK ;;;CAN'T MASTER CLEAR UNTIL THENR*10$: BIS #MC,-(R4) ;;;MASTER CLEAR THE DMC BR XMFRK ;;;START FORK PROCESS.20$: BIT #DISCON,R0 ;;;IS IT DISCONNECT ERROR? BEQ XMINTX ;;;IF EQ, NOU. MOVB #PERR!IEI,-2(R4);;;CAUSE PROCEDURE ERROR ;;;FALL THRU TO XMINTX; ; EXIT FROM INTERRUPT ;DBAD:"XMINTX: MOV (SP)+,R0 ;;;RESTORE R0# JMP $INTXT ;;;EXIT FROM INTERRUPTA E1 .SBTTL SETUP FOR INTERRUPT ROUTINES AND TRANSFERN;+4; **-XMSET-SETUP FOR INTERRUPT ROUTINES AND TRANSFER;M ; INPUTS:'; R0=CALLING REGISTERE; INTSV$ HAS BEEN DONE;;; CALLING SEQUENCE:C; JSR R0,XMSET&; .WORD ;;;CSR INDEX (EITHER 0 OR 2)); .BLKW 8. ;;;TRANSFER ADDRESSES BY TYPEI; ; OUTPUTS: (IF VALID INTERRUPT)2; R4=CSR ADDRESS; R5=UCB ADDRESS; (SP)=SAVED R0N;*; ALTERNATE RETURN: (IF INVALID INTERRUPT); RETURN TO $INTXT;-0XMSET: TST R5 ;;;HAS UCB BEEN ENTERED IN TABLE? BEQ XMINTX ;;;IF EQ, NOO( BIT #00°‚‚W‚Ž{´cÚµcÛ¶c�·c›’U2.ONL,U.CW2(R5);;;IS DMC ON-LINE? BEQ XMINTX ;;;IF EQ, NON MOV U.SCB(R5),R4 ;;;SCB ADDRESS MOV S.CSR(R4),R4 ;;;CSR ADDRESS ADD (R0)+,R4 ;;;PLUS CSR INDEX1 MOV (R4),-(SP) ;;;STRIP EVERYTHING BUT TYPE BITS  BIC #^C,(SP)A ASL (SP) ;;;MAKE A WORD INDEXU. ADD (SP)+,R0 ;;;ADD TO TRANSFER TABLE ADDRESS JMP @(R0)+ ;;;AND GO!S D .SBTTL RDYI INTERRUPT ROUTINES ;+; **-RDYINT-GIVE BUFFER TO DMC;- ; INPUTS:T+; R0=SENT Q LISTHEAD ADDRESS (U.XQ OR U.RQ)X; R1=CALLING REGISTERB; R4=CSR ADDRESS; R5=UCB ADDRESS; 2(SP)=INTERRUPT SAVED R0;; CALLING SEQUENCE:S; JSR R1,RDYINTS;R ; OUTPUTS:$; DMC GIVEN BUFFER ADDRESS AND COUNT; DMC PORT RELEASEDP5; ATTEMPT MADE TO SETUP ANOTHER BUFFER OF EITHER TYPEP; INTERRUPT EXITED;-"RDYINT: MOV R2,-(SP) ;;;SAVE R2,R3 MOV R3,-(SP) ;;;D- CMP (R0)+,(R0)+ ;;;ADVANCE TO WAIT Q ADDRESSI0 CALL $QRMVF ;;;REMOVE FIRST PACKET FROM WAIT Q! ;;;NOTE-$QRMVF DESTROYS R2,R3 , BCS 20$ ;;;NO PACKET ON QUEUE IF CARRY SET+ CMP -(R0),-(R0) ;;;RESET TO SENT Q ADDRESSE! CALL GIVE ;;;GIVE BUFFER TO DMC* CALL ITRY ;;;TRY TO SETUP ANOTHER BUFFER%10$: MOV (SP)+,R3 ;;;RESTORE R1,R2,R3A MOV (SP)+,R2 ;;;T MOV (SP)+,R1 ;;;P" BR XMINTX ;;;EXIT FROM INTERRUPT220$: BIS #UNXINT,U.ERR(R5) ;;;FLAG ERROR CONDITION! BR 10$ ;EXIT AFTER POPING STACK; C% .SBTTL COMPLETION INTERRUPT ROUTINESR;+#; **-BUFCOM-PROCESS BUFFER COMPLETEF; ; INPUTS: +; R0=SENT Q LISTHEAD ADDRESS (U.XQ OR U.RQ)N; R1=CALLING REGISTERR; R4=CSR ADDRESS+2; R5=UCB ADDRESS; 2(SP)=INTERRUPT SAVED R0;G; CALLING SEQUENCE:C; JSR R1,BUFCOMT;E ; OUTPUTS:1; CHARACTER COUNT STORED IN X.PRM+4 OF I/O PACKETV*; PACKET MOVED FROM SENT Q TO COMPLETION Q; DMC PORT RELEASEDR5; ATTEMPT MADE TO SETUP ANOTHER BUFFER OF EITHER TYPEN*; FORK PROCESS STARTED IF IT'S NOT RUNNING; INTERRUPT EXITED;-"BUFCOM: MOV R2,-(SP) ;;;SAVE R2,R3 MOV R3,-(SP) ;;;T' DECB COUNT(R0) ;;;DECREMENT SENT COUNTA* CALL $QRMVF ;;;REMOVE PACKET FROM SENT Q! ;;;NOTE-$QRMVF DESTROYS R2,R3D0 MOV 4(R4),X.PRM+4(R1);;;PUT COUNT IN I/O PACKET .IF DF M$$MGE8 BIC #140000,X.PRM+4(R1) ;;;CLEAR ADDRESS EXTENSION BITS .ENDC# BIC #RDYO,(R4) ;;;RELEASE THE PORTT4 MOV U.XQ(R5),R0 ;;;TRANSMIT SENT Q LISTHEAD ADDRESS1 CMP -(R0),-(R0) ;;;COMPLETION Q LISTHEAD ADDRESSE. CALL $QINSF ;;;INSERT PACKET ON COMPLETION Q ;;;NOTE-$QINSF DESTROYS R2 TST -(R4) ;;;SEL0 ADDRESST* CALL ITRY ;;;TRY TO SETUP ANOTHER BUFFER! MOV (SP)+,R3 ;;;RESTORE R1,R2,R3  MOV (SP)+,R2 ;;;- MOV (SP)+,R1 ;;;R ;;;FALL THRU TO XMFRK; T .SBTTL FORK PROCESSING.; (; START FORK PROCESS IF IT'S NOT RUNNING;R7XMFRK: BIT #U3.FRK,U.CW3(R5);;;IS FORK PROCESS RUNNING?T BNE XMINTX ;;;IF NE, YES MOV (SP)+,R0 ;;;RESTORE R0D6 BIS #U3.FRK,U.CW3(R5);;;INDICATE FORK PROCESS RUNNING% CALL $FORK ;;;CREATE SYSTEM PROCESSP;I; FORK LEVEL PROCESSINGD;R2 MOV U.XQ(R5),R0 ;TRANSMIT SENT Q LISTHEAD ADDRESS/ CMP -(R0),-(R0) ;COMPLETION Q LISTHEAD ADDRESSS"10$: MOV U.SCB(R5),R4 ;SCB ADDRESS# MTPS S.PRI(R4) ;DISABLE INTERRUPTST6 CALL $QRMVF ;;;REMOVE FIRST PACKET FROM COMPLETION Q BCS 20$ ;;;IF CS, Q WAS EMPTYR! MTPS #0 ;;;RE-ENABLE INTERRUPTS " MOV #IS.SUC&377,R2 ;STATUS WORD 1/ MOV X.PRM+4(R1),R4 ;STATUS WORD 2 = BYTE COUNTS! CALL RAP ;RETURN THE I/O PACKETP BR 10$ ;AND TRY AGAINR420$: BIC #U3.FRK,U.CW3(R5);;;NO MORE FORK PROCESSING! MTPS #0 ;;;RE-ENABLE INTERRUPTST0 BIT #FATAL,U.ERR(R5) ;HAS FATAL ERROR OCCURRED? BEQ EXIT ;IF EQ, NOS' BIT #LOST,U.ERR(R5) ;WAS IT LOST DATA?  BEQ 30$ ;IF EQ, NO1 MOV U.RQ(R5),R0 ;RECEIVE SENT Q LISTHEAD ADDRESS 2 MOV #IE.DAO&377,R2 ;RETURN FIRST PACKET ON SENT Q( CALL DQRAP0 ;WITH A STATUS OF "IE.DAO"$30$: MOV #U3.ERR,R0 ;FATAL ERROR BIT0 MOV #IE.CNR&377,R2 ;ASSUME DDCMP START RECEIVED3 BIT #START,U.ERR(R5) ;WAS IT DDCMP START RECEIVED?: BNE RQP ;IF NE, YES;' BIT #TIMOUT,U.ERR(R5);WAS IT TIME-OUT?- BEQ RQPABO ;IF EQ, NO#' MOV #IE.TMO&377,R2 ;TIMEOUT ERROR CODE? BR RQP ;RETURN ALL PACKETS # .SBTTL TIMEOUTA;+; **-XMT00°Š‚û�±|t÷tø tþfDATAMO-TIMEOUT ENTRY POINT;M ; INPUTS:,; R3=CONTROLLER INDEX (S.CON)R; R4=SCB ADDRESS; R5=UCB ADDRESS; ; OUTPUTS:.; DISCONNECT ERROR RECOVERY IS COMPLETED (QIO);-XMOUT:, BIS #MC,@S.CSR(R4) ;MASTER CLEAR THE DEVICE% CALLR XMINIT ;TIMER BLOCKED PACKETS, R .SBTTL CANCEL I/O AND POWERFAIL;+"; **-XMCANC-CANCEL I/O ENTRY POINT*; **-XMPWRF-POWERFAIL RECOVERY ENTRY POINT;, ; INPUTS:#; R0=A(I/O PACKET) CANCEL ONLY; R1=TCB ADDRESS (CANCEL ONLY); R3=CONTROLLER INDEX (S.CON) ; R4=SCB ADDRESS; R5=UCB ADDRESS;U ; OUTPUTS:; DEVICE IS KILLED;-XMPWF:0 MTPS #PR7 ;;; DISABLE INTERUPTS FROM THE WORLD. MOV #U3.PWF,R0 ;;;INDICATE POWERFAIL OCCURRED BR KILL ;;;CXMCAN:+ MOV #U3.KIL,R0 ;INDICATE I/O KILL WAS DONEI/ ; NOTE THAT INTERRUPTS ARE NOT DISABLED FORP ; THE NEXT FOUR INSTRUCTIONS ;FALL THRU TO KILL - .SBTTL KILL THE DMC;+; **-KILL-KILL THE DEVICEI!; **-RQP,RQPABO-ALTERNATE ENTRIESD;S ; INPUTS:L; R0=KILL REASON; R4=SCB ADDRESS; R5=UCB ADDRESS;5 ; OUTPUTS:; R0,R1,R2,R3,R4=DESTROYED; DMC MASTER CLEARED IF ON-LINE7; U2.ONL BIT CLEARED;; ALL PACKETS DEQUEUED AND RETURNED WITH STATUS OF "IE.ABO"R;-5KILL: BIT #U2.ONL,U.CW2(R5) ;;;IS THE DEVICE ON-LINE?  BNE 1$ ;;; IF NE THEN YESA" MTPS #0 ; ALLOW INTERRUPTS AGAIN BR EXIT ;IF EQ, NO11$: BIS #MC,@S.CSR(R4) ;;;MASTER CLEAR THE DEVICEI MTPS #0 ; ALL INTERRUPTS AGAIN3RQPABO: MOV #IE.ABO&377,R2 ;STATUS WORD 2 FOR LATER 'RQP: BIS R0,U.CW3(R5) ;SAVE KILL REASONE, BIC #U2.ONL,U.CW2(R5) ;IT'S NOT ON-LINE NOW .IF DF R$$MPL!V$$RSN&Q$$22C CALL DEUMR ;DE-ASSIGN UMR'ST .ENDC2 MOV U.XQ(R5),R0 ;TRANSMIT SENT Q LISTHEAD ADDRESS' CALL 10$ ;RETURN ALL TRANSMIT PACKETS;1 MOV U.RQ(R5),R0 ;RECEIVE SENT Q LISTHEAD ADDRESSE710$: CALL (PC) ;DO THE FOLLOWING FOR SENT Q AND WAIT Q 020$: CALL DQRAP0 ;DEQUEUE AND RETURN ONE PACKET! BCC 20$ ;IF CC, Q WAS NOT EMPTYA* CMP (R0)+,(R0)+ ;ADVANCE TO NEXT LISTHEAD EXIT: RETURN;:; QUEUE AN AST TO THE CCPL;A E) .SBTTL DEQUEUE AND RETURN ONE I/O PACKETN;+3; **-DQRAP/DQRAP0-DEQUEUE AND RETURN ONE I/O PACKETG/; **-RAP-RETURN AN ALREADY DE-QUEUED I/O PACKETS; ; INPUTS:A; R0=LISTHEAD ADDRESSU; R2=I/O STATUS WORD 1; R4=I/O STATUS WORD 2; ; OUTPUTS:; R1,R3,R4=DESTROYED-; CARRY CLEAR=PACKET DEQUEUED AND RETURNED OK ; CARRY SET=QUEUE WAS EMPTYA;- .ENABL LSBT,DQRAP0: CLR R4 ;ENTRY FOR STATUS WORD 2 = 0'DQRAP: MOV R2,-(SP) ;SAVE STATUS WORD 1E$ CALL $QRMVF ;DEQUEUE AN I/O PACKET ;NOTE-$QRMVF DESTROYS R2,R3N BCC 5$ ;IF CC, Q WAS NOT EMPTY BR 10$ ;RETURN WITH CARRY SETO%RAP: MOV R2,-(SP) ;SAVE STATUS WORD 1-5$:D$ MOV R0,-(SP) ;SAVE LISTHEAD ADDRESS MOV R1,R3 ;PACKET ADDRESS  MOV 2(SP),R0 ;STATUS WORD 1 MOV R4,R1 ;STATUS WORD 2" MOV U.SCB(R5),R4 ;GET SCB ADDRESS$ DECB S.STS(R4) ;DECR ACTIVITY COUNT$ CALL $IOFIN ;FINISH THE I/O PACKET ;NOTE-$IOFIN SAVES ONLY R5 CLC ;INDICATE SUCCESS' MOV (SP)+,R0 ;RESTORE LISTHEAD ADDRESS (10$: MOV (SP)+,R2 ;RESTORE STATUS WORD 1 RETURN2 .DSABL LSB; C .SBTTL DE-ASSIGN UMR'S0;+/; **-DEUMR-DEASSIGN UMR'S (FOR QIO DRIVER ONLY)T;W ; INPUTS:D; R5=UCB ADDRESS;V ; OUTPUTS:; R0,R3=DESTROYED ; R4=SCB ADDRESS; S.MPR+2(R4)=CLEAREDO;- .IF DF R$$MPL!V$$RSN&Q$$22MDEUMR: MOV R2,-(SP) ;SAVE R2 MOV R1,-(SP) ;AND R1 " MOV U.SCB(R5),R4 ;GET SCB ADDRESS .IF NDF R$$MPL* MOV S.MPR+2(R4),R2 ;GET UMR BLOCK ADDRESS .IFFS+ MOV S.KRB(R4),R2 ; MOV KRB ADDRESS INTO R2S( ADD K.OFF(R2),R2 ;POINT TO UMR AREA + 2+ SUB #M.LGTH,R2 ;POINT TO START OF UMR AREAA TST (R2) ;IS UMR ASSIGNED ?D .ENDC$ BEQ 10$ ;IF EQ, NO UMR BLOCK (!!!) .IF NDF R$$MPLA" CLR S.MPR+2(R4) ;ZERO THE POINTER .IFF CLR (R2) ;ZERO THE POINTER# MOV 2(R2),R2 ;R2=UMR BLOCK ADDRESSS .ENDC# MOV R2,R0 ;COPY UMR BLOCK ADDRESSV CALL $DEUMR ;DE-ASSIGN UMR'S' MOV #M.LGTH,R1 ;SETUP UMR BLOCK LENGTH$ CALL $DEACB ;DE-ALLOCATE UMR BLOCK10$: MOV (SP)+,R1 ;RESTORE R1  MOV (SP)+,R2 ;AND R2R RETURNK .ENDC P8 .SBTTL TRY 00°’‚H™‚Ž{´cÚµcÛ¶c�·c›’TO SETUP ANOTHER BUFFER FROM INTERRUPT LEVEL;+:; **-ITRY-TRY TO SETUP ANOTHER BUFFER FROM INTERRUPT LEVEL;O ; INPUTS:(; R4=CSR ADDRESS; R5=UCB ADDRESS;) ; OUTPUTS:; R0=DESTROYED>; REQUEST TYPE!IEI LEFT IN SEL0 IF EITHER WAIT Q WAS NOT EMPTY&; RECEIVE REQUESTS ARE ATTEMPTED FIRST;-+ITRY: MOV U.RQ(R5),R0 ;;;TRY RECEIVES FIRST.& CALL IPORT ;;;IS THE PORT AVAILABLE?( BCC 10$ ;;;IF CC, YES (PORT IS LOADED)& MOV U.XQ(R5),R0 ;;;THEN TRY TRANSMITS& CALL IPORT ;;;IS THE PORT AVAILABLE? BCS 20$ ;;;IF CS, NO'10$: BIS #IEI,(R4) ;;;SET INTERRUPT BITR BIS #IEI,(R4) ;;;TWICE 20$: RETURN ;;;L;+; **-PORT-REQUEST THE DATA PORT55; **-IPORT-REQUEST THE DATA PORT FROM INTERRUPT LEVEL ;E ; INPUTS:N+; R0=SENT Q LISTHEAD ADDRESS (U.XQ OR U.RQ)V; R4=CSR ADDRESS;T ; OUTPUTS IF PORT WAS AVAILABLE: ; CARRY CLEARE; REQUEST TYPE LEFT IN SEL0T;P$; OUTPUTS IF PORT WAS NOT AVAILABLE: ; CARRY SETA;- .ENABL LSB,%IPORT: TST 4(R0) ;;;IS WAIT Q EMPTY?;' BEQ 10$ ;;;IF EQ, YES - NOTHING TO DOS4PORT: CMPB #MAXBUF,COUNT(R0) ;;;CAN DMC ACCEPT MORE?+ BEQ 10$ ;;;IF EQ, NO - NO ACTION POSSIBLE ;;;NOTE-CARRY IS NOW CLEAR. BIT #RDYI!RQI,(R4) ;;;IS PORT ALREADY IN USE?, BNE 10$ ;;;IF NE, YES - NO ACTION POSSIBLE1 MOVB IOTYPE(R0),(R4) ;;;SET REQUEST TYPE AND RQIU BR 20$ ;;;%10$: SEC ;;;INDICATE UNAVAILABILITYS20$: RETURN ;;;T .DSABL LSB  .IF DF R$$MPL;A;:; ; CONTORLER ONLINE ENTRY POINT:;R;T;4=; THE OLRSR ROUTINE WILL ENTER THIS DRIVER AT THE XMKRB LABLEO:; TO BRING THE DEVICE ONLINE OR OFFLINE. IF THE DEVICE IS<; COMMING ONLINE, THE UNIT IS MASTER CLEARED AND THE RUN BIT?; IS CLEARED. THE RUN BIT IS THEN TESTED. IF IT IS STILL SET,BA; THE BS1 SWITCH IS TURNED ON WHICH MAKES IT IMPOSSIBLE TO DIABLE;?; THE UNIT. THIS CONDITION IS NOT ALLOWED IN M+ AND THE ONLINEU@; COMMAND WILL FAIL. IF THE DEVICE IS COMMING OFFLINE, A MASTER9; CLEAR IS ISSUED AND THE RUN BIT IS CLEARED. NO TEST IS4 ; NECESSARY.;T; ;L ; INPUTS: ;V; R2 = KRB ADDRESSO; R3 = CTB ADDRESSC0; CARRY BIT CLEARED IF DEVICE IS TO COME ONLINE-; CARRY BIT SET IF DEVICE IS TO COME OFFLINEB;;S;EXMKRB:+ MOV #MC,@K.CSR(R2) ; MASTER CLEAR THE UNITT( BIC #RUN,@K.CSR(R2) ; CLEAR THE RUN BIT2 BCS 1$ ; IF DEVICE IS COMMING OFFLINE THE RETURN> BIT #RUN,@K.CSR(R2) ; ELSE TEST IF RUN BIT IS REALLY CLEARED.! BEQ 1$ ; IF YES THE ALL IS WELL A MOVB #IE.DNR&377,$SCERR ; ELSE THE RUN BIT BEING LOCKED ON MEANS4+ ; THAT THE BS1 SWITCH IS ON WHICH MEANS ) ; THE THAT A DOWNLINE LOAD CAN NOT BE + ; AVOIDED. WE DO NOT WANT THIS IN THISE ; THIS IN THE SYSTEM.E1$: RETURN ; GO BACK;S;E;M#; UNIT ONLINE - OFFLINE ENTRY POINTE;T;U;T=; WHEN THE UNIT IS BROUGHT ONLINE THE OLRSR ROUTINE CALLS THEE?; DRIVER AT THIS POINT WITH THE CARRY BIT CLEAR AND FOR OFFLINEI:; WITH THE CARRY BIT SET. WHEN COMMING ONLINE THE UNIT IS=; SET UP USING THE DRIVER ROUTINE "SETDMC". WHEN THE UNIT ISOA; OFFLINE A MASTER CLEAR IS ISSUED AND THE RUN BIT IS TURNED OFF.H;A;W ; INPUTS:C;N;B; R3 = CONTROLLER INDEX ; R4 = SCB ADDRESS; R5 = UCB ADDRESS;Y;M ; OUTPUTS:; ;G; NONE;;XMUCB:" BCC 3$ ; IF CC, THIS ONL REQUEST1$:" MOV S.KRB(R4),R2 ; R2=KRB ADDRESS+ MOV #MC,@K.CSR(R2) ; MASTER CLEAR THE UNITH( BIC #RUN,@K.CSR(R2) ; CLEAR THE RUN BIT3$: RETURN ; GO BACK .ENDC .ENDEN COMMING ONLINE THE UNIT IS=; SET UP USING THE DRIVER ROUTINE "SETDMC". WHEN THE UNIT ISOA; OFFLINE A MASTER CLEAR IS ISSUED AND THE RUN BIT IS TUzä@Ư”Ds©À�@°úp@<&Kq@´:2“@„¯½`@¹«´‰@�±}s@ô'¤’@ª²e;@<&%t@<&9€@h±ì&@zÕ±à@h±²'@Œ©?T@°?S@ù¯üX@,°l@à¯4@¬¯²'@‹¯=@‹¯@=@ô' q@öt @™²`;@<&D@h±p!@:$9ƒ:@2²X@ räÀ!h†þ¬¯yäp©Ô († SYpAjpjff€€ˆ(ˆL &L¬¬LÎÎAÒÒ" "Ø00Hš‚û�±|t÷tø tþfDATAØ»»¯�<&9€<&Kq<&D   'ÿB‚ DLD>B‚( (ÑÌ@@Pââ© ‚<&%tüüööøø¸”¸”÷÷² ‚ô' q44 ‚öt BB ‚<&%t\\VVZZ” ”WW ‚ô'¤’š šë ®®SYÞ€ÞiÀ+cOF‚:LI‚NC‚DG‚NL‚LW ‚HE‚€DLD -- Not enough contiguo&(‚*:0‚8‚@‚H‚P‚Z‚b€€Zus file spaceDLD -- Odd address or non-existent memory errorDLD -- Directive error = %DDLD -- I/O error = %DDLD -- Read €Öerror = %DDLD -- Wait error = %DDLD -- Region creation errorDLD -- Window creation errorDLD -- Command line errorDLD --€R Syntax errorDLD -- Parse errorDLD -- QIOW errorDLD -- File not foundDLD -- File close errorDLD -- Get partition parame€Îters errorDLD -- Mapping errorDLD -- Partition too smallDLD -- Partition not foundDLD -- Data structure error in BIC-BINaJ input fileDLD -- Write error = %DDLD -- Parity error%NLow address = %O%NHigh address = %Oe¨ w¨ SYTICLPartition name: %2RPartition base: %O Size: %O (32. word blocks)File name: %XTransfer address: %Om € DLD -- Diagnostic loader DLD takes a BIC/BIN binary file, converts it to asystem image file and then loads it into a u€˜ ser-specifiedpartition. The binary file must have been converted fromDOS format using the /IM switch of FLX.Switches: € /HE -- types this help file /NL -- inhibits the partition load. the conversion is still performed. €� /LI -- lists file and partition information /NC -- do not clear the rest of the partition following the€ program load. default is to clear /OFF:N - offset from the start of partition by nX32 words /LW -- Accounts for the€ˆ DOS link word that may exist in bytes 0-1 of every input blockExamples:DLD>/HELP => types the help messageDLD>=COPY1€ .BIN/NL/LI => convert copy1.bin to copy1.sys and list program information. do not load into partitionDLD>TST=RL€€ DP => convert RLDP.BIC to RLDP.SYS and load it into the partition TSTDLD>TST=RLDP.SYS/NC/OFF:1 => load RLDP.SYS€ü into partition TST at an offset of 32. words. conversion is not done and the rest of the partition is nxot cleared%Na†€†÷ æpæ¥ÿˆ‡ææªæiÿˆ†w÷òñÀ¬0 b÷ †÷¥öÿHöwÐw^fÀ²ð:öp÷ †w"À²È•ð0÷ †w 2ù¯üX pª0¬8°?SR²`‹¯=j²r0x‹¯@=€÷5zñ Å ÃA ÷ àE`… Ç~ÀÔ÷ ž÷ðöNñ÷ìöJñ÷ Dñ÷>ñÐð÷:ñÌðæÿˆ†÷%w’wnæÿˆ‡æÿˆ†wRÀ²È•ðþ* $ÔJR$9ƒ:Ts©À�bjv²~þ€~÷ †w‚÷µ#÷ ÷5êðwŽ÷EÞð…À4÷ ÷¾ðÜö÷ºðØö÷%»zböwÖÀÔð•#÷ ,†÷¥æÿ"ö÷%ë >ö÷ö 6ö÷ë .öÀÔð• ‹¯@=.4NÔRô' qXh±p!|Ô€ú#÷ †w¤÷¥èÿðõw�7 †ð÷�âõ€ð÷‹|ð€÷Uÿtðwº÷»zNö÷‚öÀ4Áv÷ À4ð•#÷ †÷¥èÿöwB7 8ð÷�ôõ2ð÷‹.ð€÷Uÿ,ô' q h±²'F4JvN,°lR4Vô'¤’\h±²'€v&ðwl÷‚¼õ÷¸õÀ¬÷ ¦÷ · Ðï· úï÷ù ò÷ùò÷üøò÷öøò÷òøò÷îøò÷ Ö·  ï· ÊïÁ¬w¼ïÀÔ¬ï÷ L·¶ï7 ªï7  ï÷5�ï¬\¬dÔ€ò÷ ð†wFÀ óÀ ð÷ ܇À‹w÷ ®ï‡Ä%†wð÷5TïÄåÄ%$Ä%A7Jï÷ €ä‡7Fï÷ –x‡÷ 6ï €÷5"ï÷‹&ïw¬½€n÷ Ô÷ ïë÷5ï´æ÷ B‡À 7ï÷% ï÷€ï÷ FP‡÷5Øî÷ Üî÷ ðîF· êî•wV÷ "&‡7Øî÷ !‡÷5ªî÷ ‡÷ ¦îÀ€ê4Á€Â÷ ÷@ô÷<ôÀœîp€7”îwÔþw÷ tÀ4÷ ÷5Xî Á$ ÷ Äw`÷UBîwbý÷ Ô÷Jîðó÷FîìóÀÔ÷ †w*Àv(4à¯484<¬¯²'J$ pÔt„¯½`~v€fÁ”‚~÷ ÊÀ4÷ †wwÀÔð•#÷ †wÀÔð•#÷ †wü÷5Ìí÷ È÷5ÀíwÎ÷ °íw²íÀÔÁ¬÷ J842²X(Ô,ô' q2h±ì&<Ô@ô' qFh±p!vÔz¬:â÷Öí¸í Á  ÷ ÂŽíÀÔÁ¬÷ &÷bíÔó÷líÔó÷híÐó  Ô"¬p©Ô7Þ Þ00H¢‚Q§‚Ž{´cÚµcÛ¶c�·c›’6æÿˆ†wH7 tí÷²óÆó÷Ví¾ó7 Àó7 ºó÷5@í÷8í¬ó p©Ôp©Ôuî îJ€Jæÿˆ†wö7 žóæîæyÿˆ†wÂÁ‚óÀÔ‚ó÷ ²‡÷ í÷mínóæ÷5òì÷ ¨÷ öæíæÿˆ Á@÷ L÷îì÷Þì„ò÷Úì€òwÒÿ  p©Ôî*Ôb@€ÆÁ˜Â÷ (÷Êì÷ºì`ò÷¶ì\òw®ÿ Á´Âž÷ ÷¦ì÷–ì<ò÷’ì8òwŠÿ Ás÷ ä÷†ì÷vìò÷rìòwjÿ Áî÷ Ä÷fì÷Vìüñ˜ s©À�*´.žNsnî€B÷RìøñwJÿ Á÷ ¤÷Fì÷6ìÜñ÷2ìØñw*ÿ Áø÷ „÷&ì÷ì¼ñ÷ì¸ñw ÿ Á›÷ d÷ì÷öëœñ÷òë˜ñwêþ Á…÷ D÷æë÷2øR›r…€¾Öë|ñ÷ÒëxñwÊþ Á³÷ $÷Æë÷¶ë\ñ÷²ëXñwªþ Á ÷ ÷¦ë÷–ë<ñ÷’ë8ñwŠþ ÁL÷ ä÷†ë÷vëñ÷rëñwjþ Á2÷ Ä÷³6 VLv2€:fë÷Vëüð÷RëøðwJþÖ Ö  Áh÷  ÷Bë÷2ëØð÷.ëÔðw&þ�Áe Án B÷ x†cö–æsÿˆ÷ xð ÀÔ÷ † Á›÷ P÷ ¾ð À4÷ hDn P–bÔf„¯½`n›|4€¶† Á›÷ 6‡ÁeB¸ ÷ † Á`÷ ÷ºê÷ªêPð÷¦êLðwžý‡À÷ & & & æ fæ& & & Εæææ ÿˆ‡0,6 .2²X ›¸"�±}s*`JNŒ©?T^p´:2“€2 0,47 Hê· Vê÷<ê—t· 4ê€ Áî÷ –ÿ÷8ê÷(êÎï÷$êÊïwýpðêð„÷ †÷ >ð„÷ †÷ vð 0,40îX„^Õ±àh„n™²`;€®6ì · ÜéÂÂéÂ%±‡¡‡ ÁÊÂ÷ ÿ÷¼é÷¬éRï÷¨éNïw ü ÁV Â÷ öþ÷˜é÷ˆé.ï÷„é*ïw|ü ÁáÂ÷ Òþ÷ ,Ê0s©À�PV Ts©À�táxs©À�€*té÷dé ï÷`éïwXü÷ À@éÁ®ïWtàÀmšïŠB~7 šï÷m&é’ïæîæyÿˆ ‡Á„ïÀxïWtŠB~ì‡÷5øè Á  ÷ `þ Á® Â|¹«´‰@îj n z® ~|€¦÷ Pþ Á Âj÷ Bþ Áö Â÷ 4þ‡÷  ‡7Ìè÷ ‡7�ÃèÀ¾è¡‡±‡÷ ®è"€÷ ªè±‡Á¬ÀÔ„è÷ $þ·Žè÷¬~è÷5jèç÷5 bèã  jö X¬\Ôl¬€"÷ehè÷ nè÷ jèÛÀŸZè7`Rè· Rè÷ L衇&÷ Hè÷ ¢÷ DÀ:è7 6è÷ vw,è7þç÷ €÷%è ÷ z÷ 7 è· âç÷ dÁè€1�¬· úç‡÷ t¬~¹«´‰€žÀ4ð¬ðæf°4Îe°6ð„÷ †÷ &þÀ4ð„÷ †÷ 6þÀ¬÷ J‡À4ð¬ðæf°4Îe°6ð„÷ @4 ¬f(„.ª²e;84<„B™²`;L¬V4Z¬ffx„~Õ±à€†÷ ²ýÀ4ð„÷ †÷ æý‡Á B~‡÷"çÀ4æf°4Îe°6† ÁV Â÷ Žü÷0ç÷ çÆì÷çÂìwúÀ¬÷ ¬ÿ÷îæ é÷êæé& 4„™²`;246fLV Ps©À�n¬€–÷ææ"é÷çòé÷úæé÷ìé÷êé7 é÷U@éÀææÀeAtúÿÀEü7èè÷ Äþ‡ ÁEþŠÀtÿÿ€ € € Àm²æ‡÷-pæœæ÷fæ’æ÷п޿÷-‚æ†æd÷zæ~æ‡÷ Ôÿ÷ vþ÷næ>æ÷ Àþ÷fæ^æ ÷5Væ÷ þ÷ þ÷ üý÷ ¦ÿ¡ÀBæt †Ö w¸÷Àm4æÀå7<æ÷ *þ‡ð¬ðæf°4Îe°6ð„÷ @4 ¬f(„.ª²e;84<„B™²`;L¬V4Z¬ffx„ .TITLE KCLOKB CLOCK 'B' CONTROL .IDENT /M01.01/;;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.L;/>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 5-SEP-77 ;E; B. SCHREIBER 15-MAY-78; 9; BLS048 -- CORRECT NUMBER OF ARGUMENTS ACCEPTED FOR CALLS;T&; THIS ROUTINE CONTROLS KW11-K CLOCK B;L; SYSTEM MACRO CALLS;  .MCALL CINT$S, KSWDF$, KDVDF$ KSWDF$U KDVDF$U C;+; CLOCKB -- CLOCK B CONTROLD;O; CALLING SEQUENCE:A; /; CALL CLOCKB (IRATE, IPRSET, MODE, IND, [LUN]); ; INPUTS:E;O; IRATE IS THE RATE (0-7) .; IPRSET IS THE PRESET (TWOS COMPLEMENT 0-255); MODE IS THE MODE FLAGD; 0 - INTERRUPT MODE; 1 - NON-INTERRUPT MODEE; LUN IS IGNORED;A ; OUTPUTS:;0/; IND 0 UNABLE TO START CLOCK B (BAD ARGS, ETC00Qª‚S±‚±|t÷tø tþfDATA)L!; 1 CLOCK B STARTED SUCCESSFULLY1;C;-CLOCKB:: ;REF LABELC .IF DF K$W11K0 CALL .K.PAA ;VALIDATE ARGS AND PUSH ONTO STACK .WORD 5 ;5 ARGUMENTS .WORD 0 ;NONE REQUIRED BCC 10$ ;IF CC OKO .IFTF ;K$W11K' MOV #4,R4 ;STORE CODE IN 4TH ARGUMENT  CLR R3 ;STORE 0 FOR ERRORP& CALLR .IESTO ;STORE ERROR AND RETURN .IFT ;K$W11K 10$: MOV (SP)+,R0 ;GET THE RATE BNE 40$ ;IF PRESENT FORGE ON- CLR .CLK16 ;ELSE ZERO 16-BIT SOFTWARE CLOCKE320$: CMP (SP)+,(SP)+ ;PIP IPRSET AND MODE ADDRESSEST BR 110$ ;RETURN SUCCESS)40$: MOV (R0),R0 ;GET THE SPECIFIED RATE BNE 60$ ;IF NE GO AHEADS CLR @.KBCSR ;ELSE STOP CLOCK B BR 20$ ;GO RETURN *60$: BIC #^C<7>,R0 ;CLEAR ALL BUT LOW BITS ASL R0 ;POSITION FOR CSR& MOV R0,.KBRAT ;SET FOR ENABLE ROUTINE! MOV (SP)+,R0 ;GET PRESET ADDRESST BNE 70$ ;IF NE GO HANDLE* MOV #.NEG1,R0 ;ELSE USE DEFAULT OF 1 TICK*70$: MOV (R0),.KBPRE ;SET THE CLOCK PRESET MOV (SP)+,R0 ;GET THE MODE WORD BNE 80$ ;IF NE OK(" MOV #.ZEROW,R0 ;DEFAULT IS MODE 0;80$: MOV (R0),.KBMOD ;SET FLAG FOR INTERRUPT ENABLE ROUTINEI. BIT #K$ACIN,.KBFLG ;ARE WE ALREADY CONNECTED? BEQ 100$ ;IF EQ NO--GO CONNECT CALL .KBSTRT ;YES--START CLOCK BR 110$ ;RETURN SUCCESSLG100$: CINT$S .KBVEC,#$KBASE,#.KBINT,#.KBEDI,#PR6 ;CONNECT TO INTERRUPTS+ BCS 120$ ;IF CS SKIP1 BIS #K$ACIN,.KBFLG ;FLAG CONNECTED TO INTERRUPTSU110$: MOV #1,R0 ;SET SUCCESS( BR 140$ ;RETURN 120$: CLR R0 ;SET FAILURE#140$: MOV (SP)+,R1 ;GET IND ADDRESSO# BEQ 160$ ;IF EQ SKIP STATUS STORE0 MOV R0,(R1) ;STORE IND RESULTF*160$: TST (SP)+ ;CLEAN LUN ARG FROM STACK RETURNE - .SBTTL .KBEDI CLOCK B ENABLE/DISABLE ROUTINEN;+.; .KBEDI -- ENABLE/DISABLE ROUTINE FOR CLOCK B; C; THIS ROUTINE IS CALLED BY THE EXECUTIVE TO ENABLE/DISABLE CLOCK BO;T ; INPUTS:B;11; C-SET DISCONNECTING CLOCK FROM INTERRUPT VECTORE; STOP CLOCK AND RETURN;1; C-CLEAR ENABLING CLOCK; START CLOCK; ;- .PSECT .KSCT1(.KBEDI: BCS .KBDSC ;IF CS GO DISCONNECT1 BIS #K$ACIN,.KBFLG ;FLAG CONNECTED TO INTERRUPTSE&.KBSTRT:MOV .KBCSR,R2 ;GET CSR ADDRESS CLR (R2) ;STOP THE CLOCK+ MOV #KB$OIE!KB$B2A!KB$ENB,R0 ;ENABLE CLOCKT$ BIT #1,.KBMOD ;SHOULD WE INTERRUPT? BEQ 20$ ;IF EQ YES--GO AHEAD6 MOV #KB$B2A!KB$ENB,R0 ;NO--DO NOT LET CLOCK INTERRUPT!20$: BIS .KBRAT,R0 ;SET RATE BITS ! MOV .KBPRE,2(R2) ;SET THE PRESETV MOV R0,(R2) ;AND THE CSR RETURN%.KBDSC: CLR @.KBCSR ;DISABLE CLOCK BK- BIC #K$ACIN,.KBFLG ;NOTE NO LONGER CONNECTEDC RETURNG;+%; .KBINT -- CLOCK B INTERRUPT ROUTINEC; ; INPUTS:T;; NONE; ; OUTPUTS:;C; .CLK16 IS INCREMENTED BY ONE;O;--.KBINT::INC .CLK16 ;;;COUNT CLOCK B OVERFLOWT- RETURN ;;;END OF CLOCK B INTERRUPT ROUTINE  Y( .SBTTL ICLOKB READ CLOCK B 16 BIT CLOCK;+; ICLOKB -- READ CLOCK B;S ; INPUTS:;; ; NONE; ; OUTPUTS:;2?; THE VALUE OF THE 16 BIT CLOCK IS RETURNED IN R0 FOR A FORTRAN ; FUNCTION CALL.; ;-$ICLOKB::MOV .CLK16,R0 ;GET THE VALUE RETURNE .IFF ;K$W11K+ICLOKB:: CLR R0  RETURN  .ENDC ;K$W11K .END; NONE; ; OUTPUTS:;C; .CLK16 IS INCREMENTED BY ONE;O;--.KBINT::INC .CLK16 ;;;COUNT CLOCK B OVERFLOWT- RETURN ;;;END OF CLOCK B INTERRUPT ROUTINE  Y( .SBTTL ICLOKB READ CLOCK B 16 BIT CLOCK;+; ICLOKB -- READ CLOCK B;S ; INPUTS:;; ; NONE; ; OUTPUTS:;2?; THE VALUE OF THE 16 BIT CLOCK IS RETURNED IN R0 FOR A FORTRAN ; FUNCTION CALL.; ;-$ICLOKB::MOV .CLK16,R0 ;GET THE VALUE RETURNE .IFF ;K$W11K+ICLOKB::CC COPYRIGHT (C) 1977/C DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.C>C THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>C SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>C INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>C ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>C MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>C SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>C TO AND OWNERSHIP OF THE SOFTWARE SHALL AT AL00S²‚T¸‚Ž{´cÚµcÛ¶c�·c›’L TIMES REMAIN C IN DEC.CI?C THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?C NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL C EQUIPMENT CORPORATION.CO=C DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9C ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.IC C VERSION 01C B. SCHREIBER 15-JUL-77CECE:C MSH001 M.HARVEY CORRECTED FUNCTION RETURN VARIABLECTCH=C THIS ROUTINE COMPUTES RATES AND PRESETS FOR THE CLOCK GIVENS(C THE DESIRED DWELL (INTER-SAMPLE TIME). C+"C XRATE -- COMPUTE RATE AND PRESETC C CALLING SEQUENCE: *C CALL XRATE (DWELL, IRATE, IPRSET, IFLAG)1C OR: HERTZ = XRATE (DWELL, IRATE, IPRSET, IFLAG) C C INPUTS:RCO5C DWELL (REAL*4) THE DESIRED DWELL IN DECIMAL SECONDSE2C IFLAG (INTEGER*2) 0 IF CLOCK A, NON-0 IF CLOCK BCS C OUTPUTS:CH6C IRATE (INTEGER*2) THE SELECTED CLOCK RATE (1-7) OR 0!C IF NO RATE COULD BE SELECTEDH8C IPRSET (INTEGER*2) THE TWOS-COMPLEMENT CLOCK PRESET TO)C BE USED IN A CALL TO A SWEEP ROUTINEIC.5C HERTZ (REAL*4) (IF CALLED AS A FUNCTION) THE ACTUALLC DWELL USED.CLC-4 REAL*4 FUNCTION XRATE (DWELL, IRATE, IPRSET, IFLAG), REAL*4 DWELL, PRESET, DWLMAX, BDWLMX, TICKS INTEGER*2 IRATE, IPRSET, ID) DIMENSION DWLMAX(5), TICKS(5), BDWLMX(5) CC$C DWLMAX CONTAINS THE MAXIMUM DWELL0C (INTER-SAMPLE TIME) WHICH MAY BE OBTAINED FOR%C PARTICULAR CLOCK RATE FOR CLOCK A.SCC1 DATA DWLMAX / 0.065535, 0.65535, 6.5535, 65.535,K 1 655.35 /BCS$C BDWLMX CONTAINS THE MAXIMUM DWELL0C (INTER-SAMPLE TIME) WHICH MAY BE OBTAINED FOR'C A PARTICULAR CLOCK RATE FOR CLOCK B. CC0 DATA BDWLMX / 0.000255, 0.00255, 0.0255, 0.255, 1 2.55 /,CL2C TICKS IS THE NUMBER OF CLOCK TICKS OBTAINED FORC A PARTICULAR CLOCK RATE.(C 3 DATA TICKS / 1000000.0, 100000.0, 10000.0, 1000.0,L 1 100.0 /! IF (DWELL .LT. .000001) GOTO 200 CR0C FIND THE FASTEST CLOCK RATE WHICH WILL PERMIT2C THE REQUESTED DWELL. CHOOSING THE FASTEST RATE#C WILL GIVE THE FINEST RESOLUTION.MCD DO 100 I = 1, 5 IF (IFLAG .NE. 0) GOTO 5A# IF (DWELL .GT. DWLMAX(I)) GOTO 100F GOTO 7B% 5 IF (DWELL .GT. BDWLMX(I)) GOTO 1005C.C I CONTAINS THE SELECTED RATECT 7 IRATE = ICR(C COMPUTE THE CLOCK PRESET FOR THE USERC  PRESET = DWELL * TICKS (I) ! IF (PRESET - 32768.0) 10, 20, 300CLC PRESET LT 32768.0CD 10 IPRSET = -IFIX (PRESET) GOTO 40CHC PRESET EQ 32768.0CH 20 IPRSET = "100000 GOTO 40CLC PRESET GT 32768.0CA$ 30 IPRSET = IFIX (65535.0 - PRESET)C2C RETURN THE RATE SELECTED TO USER IF CALLED AS A6C FUNCTION. HE CAN SEE IF HE WAS KILLED BY ROUNDOFF.C.. 40 XRATE = AINT(PRESET + 0.05) / TICKS(I) GOTO 900T 100 CONTINUEE 200 IRATE = 0 900 RETURNK ENDT FOR THE USERC  PRESET = DWELL * TICKS (I) ! IF (PRESET - 32768.0) 10, 20, 300CLC PRESET LT 32768.0CD 10 IPRSET = -IFIX (PRESET) GOTO 40CHC PRESET EQ 32768.0CH 20 IPRSET = "100000 GOTO 40CLC PRESET GT 32768.0CA$ 30 IPRSET =$ .TITLE KAADMP BURST MODE D/A OUTPUT .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 18-OCT-77;E,; THIS MODULE PERFORMS BURST MODE D/A OUTPUT;T; SYSTEM MACRO CALLS;  .MC00Tº‚±‚±|t÷tø tþfDATAALL KSWDF$ KSWDF$O D$ .SBTTL .AADMP BURST MODE D/A OUTPUT;+-; .AADMP -- DUMP BUFFERS TO D/A IN BURST MODEN;IG; THIS ROUTINE PERFORMS OUTPUT TO THE AA11 IN BURST MODE (NOT INTERRUPTT; OR CLOCK DRIVEN).B;I ; INPUTS:Q;M3; R4 POINTS TO SWB (.AASWB). SWB MUST BE ALL SET UP ; ; OUTPUTS:;A<; IF IEFN WAS SPECIFIED CORRECTLY, PERFORM BURST MODE OUTPUT<; AT USER TASK LEVEL UNTIL END OF SWEEP IS DETECTED. IF IEFN,; WAS INCORRECTLY SPECIFIED, RETURN IE.BAD .;Y;-..AADMP::MOV S.WUSW(R4),R3 ;POINT TO IBUF ARRAY# TST S.WNBF(R4) ;CONTINUOUS OUTPUT?2 BMI 20$ ;IF MI YES--MUST HAVE COMPLETION ROUTINE= CMP S.WNBF(R4),IB.NBF(R3) ;LESS BUFFERS TO DO THAN SUPPLIED?(0 BHI 20$ ;IF HI NO--GO CHECK COMPLETION ROUTINEA BIS #S$WEFN,S.WFL2(R4) ;YES--SET EFN FLAG SO WE DON'T CALL CMPLR  BR 40$ ;SKIP AHEAD720$: BIT #S$WEFN,S.WFL2(R4) ;EFN OR COMPLETION ROUTINE?T5 BNE 300$ ;IF NE EFN--ERROR--NEED COMPLETION ROUTINEN; #; SET UP TO START BURST MODE OUTPUTB;.040$: MOVB S.WBNO(R4),R5 ;GET FIRST BUFFER NUMBER ASL R5 ;MAKE WORD INDEXC" ADD R3,R5 ;POINT INTO IBUF ARRAY9 MOV IB.BUF(R5),R5 ;AND PULL OUT THE FIRST BUFFER ADDRESSR;;"; ENTER LOOP FOR BURST MODE OUTPUT;I- BIS #S$WACT,S.WFL2(R4) ;DECLARE SWEEP ACTIVEB-200$: CALL .AAGWD ;GET D/A DATUM FROM BUFFERD ROL R2 ;SAVE C-BIT# MOV S.WCSR(R4),R1 ;GET CSR ADDRESSW .IF NDF Q$$BUSP)220$: TSTB (R1) ;MAKE SURE UNIT IS READYR" BPL 220$ ;WAIT FOR THE READY BIT .ENDC ;Q$$BUS% CLR R0 ;PREPARE TO GET CHANNEL BYTER) BISB S.WCHB(R4),R0 ;GET THE CHANNEL BYTEW$ ADD R0,R1 ;POINT TO THE PROPER DAC MOV R3,(R1) ;OUTPUT TO DAC% CALL .AANXC ;UPDATE TO NEXT CHANNEL& ROR R2 ;CHECK THE C-BIT FROM GETWORD BCC 200$ ;IF CC KEEP GOING+240$: CALL .AAAST ;CALL COMPLETION ROUTINE ( BIT #S$WSTP,S.WFL2(R4) ;SHOULD WE STOP? BEQ 200$ ;IF EQ NO) RETURN ;YES--RETURN TO CALLER OF DASWP2; &; NO COMPLETION ROUTINE AND ONE NEEDED;21300$: MOV #-,@S.WUSW(R4) ;SET STATUSC RETURN ;BACK TO CALLERN B2 .SBTTL .AAAST "AST" ROUTINE FOR BURST MODE OUTPUT;+8; .AAAST -- CALL COMPLETION ROUTINE IN BURST MODE OUTPUT;C ; INPUTS: ;D; R4 POINTS TO SWB;R ; OUTPUTS:;H+; IF SUPPLIED, COMPLETION ROUTINE IS CALLEDG;G; NO REGISTERS ARE ALTERED;L;-2.AAAST: BIT #S$WEFN,S.WFL2(R4) ;USING EVENT FLAGS?! BNE 40$ ;IF NE YES--SKIP IT ALLS* MOV R5,-(SP) ;SAVE REGISTERS FROM FORTRAN MOV R4,-(SP)N MOV R3,-(SP)2 MOV R2,-(SP)I MOV R1,-(SP)W MOV R0,-(SP)A/ CALL @S.WEFN(R4) ;CALL USER COMPLETION ROUTINEA$20$: MOV (SP)+,R0 ;RESTORE REGISTERS MOV (SP)+,R1T MOV (SP)+,R2T MOV (SP)+,R3B MOV (SP)+,R4T MOV (SP)+,R5 40$: RETURNI 1 .SBTTL .AAGWD GET WORD FOR BURST MODE D/A OUTPUTO;+4; .AAGWD -- GET WORD FROM USER BUFFER FOR D/A OUTPUT; ; INPUTS: ;W; R5 BUFFER POINTER ; R4 POINTS TO SWB; ; OUTPUTS:;P; R3 DATA WORD; C-CLEAR NOT END OF BUFFERF'; C-SET END OF BUFFER OR STOP REQUESTEDM;R;-(.AAGWD::MOV (R5)+,R3 ;GET NEXT DATA WORD, CLC ;PRESET C-BIT FOR "NOT END OF BUFFER" DEC S.WCNT(R4) ;END OF BUFFER?S BGT 200$ ;IF GT NO) MOV S.WUSW(R4),R2 ;YES--GET IBUF ADDRESS MOV R2,R1 ;COPY IT+ ADD #IB.USQ,R1 ;POINT TO USER BUFFER QUEUE .REPT 8.U TSTB (R1)+ ;FIND THE FREE SLOT BMI 20$ ;IF MI FOUND IT .ENDM BR 140$ ;NO FREE SLOTS? >20$: MOVB S.WBNO(R4),-(R1);SET JUST FINISHED BUFFER INTO QUEUE/ BIT #S$WSEB!S$WSTP,S.WFL2(R4) ;STOP NECESSARY?S BNE 100$ ;IF NE YES" TST S.WNBF(R4) ;CONTINUOUS OUTPUT BMI 40$ ;IF MI YES) DEC S.WNBF(R4) ;NO--CHECK ENOUGH BUFFERS( BEQ 120$ ;IF EQ ALL DONE*40$: ADD #IB.DVQ,R2 ;POINT TO DEVICE QUEUE* MOVB (R2),R1 ;GET NEXT BUFFER NO. TO USE BMI 140$ ;IF MI ERRORB .REPT 3$ MOVB 1(R2),(R2)+ ;PUSH QUEUE AROUND MOVB 1(R2),(R2)+ ;..." BMI 60$ ;WATCH FOR THE QUICK OUT .ENDM% MOVB 1(R2),(R2)+ ;MOVE THE LAST BYTEJ! MOVB #-1,(R2) ;MARK END OF QUEUET/60$: MOVB R1,S.WBNO(R4) ;SET NEW CURRENT BUFFERE ASL R1 ;MAKE A WORD INDEXB# ADD S.WUSW(R4),R1 ;INDEX INTO IBUFI) MOV IB.BUF(R1),R5 ;GET POIN00T‚ZÄ‚]É‚´cÚµcÛ¶c�·c›’TER TO BUFFER . MOV S.WSIZ(R4),S.WCNT(R4) ;RESET BUFFER COUNT. BR 180$ ;RETURN WITH C-SET FOR END OF BUFFER;E#; STOP BECAUSE S$WSTP!S$WSEB IS SET;;M7100$: MOV #-,@S.WUSW(R4) ;SET ABORT STATUSU BR 160$ ;FINISH UP;.; DONE OUTPUTTINGF;T1120$: MOV #IS.SUC,@S.WUSW(R4) ;SET SUCCESS STATUSH BR 160$ ;FINISH ;,; DATA OVERRUN (NO BUFFER);M>140$: MOV #-,@S.WUSW(R4) ;SET DATA OVERRUN STATUS;N; SET STOP AND C-BIT;;*160$: BIS #S$WSTP,S.WFL2(R4) ;FLAG TO STOP/ BIC #S$WACT,S.WFL2(R4) ;DECLARE SWEEP INACTIVEE180$: SEC ;SET C-BIT 200$: RETURN .ENDR END OF BUFFER;E#; STOP BECAUSE S$WSTP!S$WSEB IS SET;;M7100$: MOV #-,@S.WUSW(R4) ;SET ABORT STATUSU BR 160$ ;FINISH UP;.; DONE OUTPUTTINGF;T1120$: MOV #IS.SUC,@S.WUSW(R4) ;SET SUCCESS STATUSH BR 160$ ;FINISH ;,; DATA OVERRUN (NO BUFFER);M>140$: MOV #-,@S.WUSW(R4) ;SET DATA OVERRUN STATUS;N; SET STOP AND C-BIT;;*160$: BIS #S$WSTP,S.WFL2(R4) ;FLAG TO STOP/, .TITLE KAASO3 D/A OUTPUT WITH SCOPE CONTROL .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 25-OCT-77;E>; THIS MODULE CONTAINS THE SYNCH. CLOCK ROUTINE FOR D/A OUTPUT; WITH SCOPE CONTROL WORDS.T;E; SYSTEM MACRO CALLS;H .MCALL KSWDF$, KDVDF$ KSWDF$E KDVDF$N .PSECT .KSCT1 O7 .SBTTL .AASO3 SYNCHRONOUS CLOCK ROUTINE FOR D/A OUTPUT ;+E; .AASO3 -- SYNCH. CLOCK ROUTINE FOR D/A OUTPUT W/SCOPE CONTROL WORDSO;R ; INPUTS:; R4 POINTS TO SWB; R3 AVAILABLE; ; OUTPUTS: ; C-CLEAR OK); C-SET FORK REQUESTED FOR EOB OR EOSWEEPL; >; NOTE: THE BUFFER MUST BE A MULTIPLE OF WORDS. THIS; IS NOT CHECKED BY SOFTWARE.C;O;- .IF NDF Q$$BUS 0.AASO3::CLR -(SP) ;;;SET C-BIT SAVER ONTO STACK( CALL .KRDWD ;;;READ SCOPE CONTROL WORD/ BIC #^C,R3 ;;;TRIM TO LEGAL SCOPE BITSH$ MOV R3,@S.WCSR(R4) ;;;OUTPUT TO CSR%10$: CALL .KRDWD ;;;READ A DATA WORDF ROL (SP) ;;;SAVE C-BIT MOV R3,-(SP) ;;;SAVE DATA WORDP% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSP, MOVB S.WCHB(R4),-(SP);;;GET 2*(CHANNEL + 1). CLRB 1(SP) ;;;MAKE SURE WE ONLY ADD LOW BYTE$ ADD (SP)+,R3 ;;;POINT TO PROPER DAC$ MOV (SP)+,(R3) ;;;WRITE DATA TO DAC ROR (SP) ;;;CHECK C-BITS BCC 20$ ;;;IF CC CONTINUEA& ROL (SP) ;;;SET PERMANENT C-BIT FLAG) BIT #S$WSTP,S.WFL2(R4) ;;;SHOULD WE STOPI BNE 40$ ;;;IF NE YES+20$: CALL .AANXC ;;;NO--GO TO NEXT CHANNELL3 CMP S.WCHX(R4),S.WNCH(R4) ;;;DONE ENOUGH CHANNELS?B BNE 10$ ;;;NO--DO MORE 40$: ROR (SP)+ ;;;RESTORE C-BIT RETURND .ENDC ;Q$$BUS .ENDSP);;;GET 2*(CHANNEL + 1). CLRB 1(SP) ;;;MAKE SURE WE ONLY ADD LOW BYTE$ ADD (SP)+,R3 ;;;POINT TO PROPER DAC$ MOV (SP)+,(R3) ;;;WRITE DATA TO DAC ROR (SP) ;;;CHECK C-BI$ .TITLE KADAGR A/D AUTO-GAIN RANGING .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENS00]Ê‚^Ï‚±|t÷tø tþfDATAE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-SEP-77;E?; THIS ROUTINE PERFORMS AUTO GAIN RANGING FOR THE AD11-K/AM11-KS .MCALL KSWDF$, KDVDF$ KSWDF$O KDVDF$R .PSECT .KSCT1 S, .SBTTL .ADAGR A/D AUTO-GAIN RANGING ROUTINE;+%; .ADAGR -- PERFORM AUTO-GAIN RANGINGO;A ; INPUTS: ; *; A/D CONVERTER MUST HAVE THE DONE BIT SET; R3 POINTS TO CSR;Q ; OUTPUTS:;T; R3 CONVERTED VALUE;O;-.ADAGR::MOV R2,-(SP) ;;;SAVE R2I% MOV 2(R3),R2 ;;;READ CONVERTED VALUEC .IF DF A$$M11/ CLR -(SP) ;;;SET THE GAIN BITS ONTO THE STACK7- CMP R2,#4000 ;;;IS NUMBER IN NEGATIVE RANGE?  BGE 20$ ;;;IF GE YES NEG R2 ;;;NEGATE RESULT! BEQ 100$ ;;;IF ZERO GET OUT NOW1- BIC #^C<7777>,R2 ;;;ONLY LOOK AT TWELVE BITSI120$: CMP R2,#4200 ;;;NEED TO SAMPLE ABOVE GAIN 4?A BLT 30$ ;;;IF LT YES" CMP R2,#5000 ;;;SAMPLE AT GAIN 1? BGE 100$ ;;;IF GE YES4 MOV #<1*20>*400,(SP) ;;;NO--SET TO SAMPLE AT GAIN 4 BR 40$ ;;;GO SAMPLER530$: MOV #<2*20>*400,(SP) ;;;SET TO SAMPLE AT GAIN 16$# CMP R2,#4040 ;;;SAMPLE AT GAIN 16?I BGE 40$ ;;;IF GE YES5 MOV #<3*20>*400,(SP) ;;;NO--SET TO SAMPLE AT GAIN 64;-40$: BIS (SP),(R3) ;;;SET CORRECT MUX CHANNEL0 INC (R3) ;;;START CONVERSION$ MOV #TMO$AD,R2 ;;;GET TIMEOUT COUNT.60$: BIT #AD$ERR!AD$DON,(R3) ;;;ERROR OR DONE? BMI 80$ ;;;IF MI ERROR BNE 100$ ;;;IF NE DONE" DEC R2 ;;;NOT YET--CHECK TIMEOUT BGT 60$ ;;;IF GT NOT TIMEOUT) MOV #ADTMOV,R3 ;;;YES--SET TIMEOUT VALUEO BR 90$ ;;;RETURN280$: MOV 2(R3),R3 ;;;READ VALUE TO CLEAR CONVERTER" MOV #ADERRV,R3 ;;;SET ERROR VALUE(90$: TST (SP)+ ;;;CLEAR GAIN FROM STACK BR 120$ ;;;RETURNA*100$: MOV 2(R3),R3 ;;;READ CONVERTED VALUE- BIS (SP)+,R3 ;;;INSERT GAIN BITS INTO RESULT .IFF ;A$$M11; MOV R2,R3 ;;;POSITION RESULT .ENDC ;A$$M11 120$: MOV (SP)+,R2 ;;;RESTORE R2 RETURNE .END;IF NE DONE" DEC R2 ;;;NOT YET--CHECK TIMEOUT BGT 60$ ;;;IF GT NOT TIMEOUT) MOV #ADTMOV,R3 ;;;YES--SET TIMEOUT VALUEO BR 90$ ;;;RETURN280$: MOV 2(R3),R3 ;;;READ VALUE TO CLEAR CONVERTER" MOV #ADERRV,R3 ;;;SET ERROR VALUE(90$: TST (SP)+ ;;;CLEAR GAIN FROM STACK BR 120$ ;;;RETURNA*100$: MOV 2(R3),R3 ;;;READ CONVE( .TITLE KADDRV ROUTINES TO DRIVE THE ADC .IDENT /M01.00/; ; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.M;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 4-SEP-77 ;E;; THIS MODULE CONTAINS ROUTINES TO ACCESS THE A/D CONVERTERG;T; SYSTEM MACRO CALLS;T .MCALL CINT$S,KDVDF$,KSWDF$ KDVDF$S KSWDF$L .IF DF N$AD11 N;+1; THE A/D SWEEP OPERATES IN THE FOLLOWING MANNER:C;O5; 1) CONNECT FIRST ACTIVE A/D CONVERTER TO INTERRUPTSA*; 2) ARM CLOCK (THIS IS HANDLED ELSEWHERE),; 3) ENABLE FIRST A/D CONVERTER TO INTERRUPT; ; UPON RECEIVING INTERRUPT: ; .; 1) READ INTERRUPTING A/D CONVERTER AND STORE8; 2) FOR ALL OTHER 'NCHN'-1 SAMPLES, SET THE 'GO' BIT IN8; THE PROPER ADCSR AND TWIDDLE WITH A TIMEOUT WAITING; FOR THE00^Ò‚Ä‚]É‚´cÚµcÛ¶c�·c›’ CONVERSION.;; 3) AFTER ALL 'NCHN' SAMPLES HAVE BEEN TAKEN, RE-ARM FIRST.; A/D TO INTERRUPT AGAIN.;- . .SBTTL .ADCNI CONNECT A/D TO INTERRUPT VECTOR;+/; .ADCNI -- CONNECT A/D CONVERTER TO INTERRUPTSM;O ; INPUTS: ;D6; SWEEP CONTROL BLOCK ALL SETUP WITH R4 POINTING TO IT;T ; OUTPUTS:;C ; C-CLEAR SUCCESSFULLY CONNECTED; C-SET COULD NOT CONNECTA;S;-5.ADCNI::CALL .ADSLI ;SELECT PROPER INTERRUPT ROUTINEN' BCS 60$ ;IF CS INT ROUTINE NOT LOADEDA) MOV S.WAUA(R4),R3 ;GET PTR TO ACTIVE UCB ADD R4,R3 ;REALLY POINT TO ITE: BIT #UF$CIN,U.FLG(R3) ;IS IT ALREADY CONNECTED TO VECTOR? BNE 40$ ;YES--DON'T RETRYA< CINT$S U.VEC(R3),#$KBASE,#.ADINT,#.ADEDI,S.WPRI(R4),#.ADAST" BCS 60$ ;IF CS COULD NOT CONNECT/ BIS #UF$CIN,U.FLG(R3);FLAG CONNECTED TO VECTORG40$: CLC ;FLAG GOOD 60$: RETURN  C2 .SBTTL .ADEDI A/D ENABLE/DISABLE ROUTINE FOR CINT;+7; .ADEDI -- ENABLE/DISABLE CONNECT TO INTERRUPT ROUTINEB;6A; THIS ROUTINE IS CALLED BY THE EXECUTIVE ON CONNECTS/DISCONNECTSA%; FROM INTERRUPT VECTORS FOR THE A/D.O;E ; INPUTS:C;U'; R1 POINTS TO INTERRUPT TRANSFER BLOCKO+; C-SET DISCONNECTING FROM INTERRUPT VECTORE(; C-CLEAR CONNECTING TO INTERRUPT VECTOR;A ; OUTPUTS:;I; A/D CONVERTER IS DISABLED#.; .KTKCB IS FILLED IN WITH TCB ADDRESS OF TASK;C;- .PSECT .KSCT1:.ADEDI: MOV .ADSWB+S.WCSR,R0 ;GET CSR ADDRESS OF CONVERTER: MOV 2(R0),R2 ;READ CONVERTER IN CASE LINGERING CONVERSION CLR (R0) ;STOP CONVERTER7 MOV @#$TKTCB,.KTKCB ;GET MY TCB ADDRESS FOR FUTURE REFI RETURNV O+ .SBTTL .ADSLI SELECT A/D INTERRUPT ROUTINEI;+$; .ADSLI -- SELECT INTERRUPT ROUTINE;N ; INPUTS:M;T ; SWB SETO; ; OUTPUTS:;C ; C-CLEAR OK-; .ADINT MODIFIED TO VECTOR TO PROPER ROUTINE ; AND S.WSTR SET IN .ADSWBL;I$; C-SET INTERRUPT ROUTINE NOT LOADED;S;- .PSECTA=.ADSLI::MOV #.ADSTR,S.WSTR(R4) ;SET UP THE ST ROUTINE ADDRESSR* MOV #.ADIN0,R3 ;THIS IS ROUTINE OF CHOICE2 MOV S.WNCH(R4),-(SP);GET # OF CHANNELS ONTO STACK .IF DF A$$M11 ! U$$ADIR0 BIT #S$WACA,S.WFL2(R4) ;ABS CHANNEL ADDRESSING?2 BNE 40$ ;IF NE YES--CHECK OUT NUMBER OF CHANNELS2 MOV S.WFLG(R4),-(SP);NO--GET MODE WORD ONTO STACK) BIC #^C<7>,(SP) ;CLEAR ALL BUT GAIN BITSE .ENDC ;A$$M11 ! U$$ADIN4 .IF DF U$$ADI ;USER-SUPPLIED A/D INTERRUPT ROUTINE& CMP (SP),#7 ;USER INTERRUPT ROUTINE? BEQ 50$ ;IF EQ YES .IFTF ;U$$ADI .IF DF A$$M11' CMP (SP)+,#5 ;IS IT PROGRAMMABLE GAIN?E BEQ 20$ ;IF EQ YES1 MOV #.ADIN2,R3 ;NO--ASSUME SINGLE CHANNEL W/GAINU DEC (SP)+ ;SEE IF ONE CHANNEL  BEQ 60$ ;IF EQ YES0 MOV #.ADIN3,R3 ;NO--SET FOR MULT CHANNEL W/GAIN BR 60$ ;GO FINISH UP<20$: MOV #.ADIN4,R3 ;ASSUME SINGLE CHANNEL PROGRAMMABLE GAIN DEC (SP)+ ;CHECK # OF CHANNELS BEQ 60$ ;IF EQ ALL SET6 MOV #.ADIN5,R3 ;ELSE SET FOR MULT CHANNELS PROG. GAIN BR 60$ ;FINISH UPT .ENDC ;A$$M11740$: DEC (SP)+ ;ABS CHANNEL ADDRESSING--CHECK CHANNELS+ BEQ 60$ ;IF EQ ALL SET/ MOV #.ADIN1,R3 ;ELSE SET FOR MULTIPLE CHANNELSA .IFT ;U$$ADIN# BR 60$ ;SKIP TO STORE ISR ADDRESSN50$: TST (SP)+ ;CLEAR STACK& MOV #.ADINU,R3 ;USE USER-SUPPLIED ISR .ENDC ;U$$ADI%60$: TST R3 ;SEE IF WE GOT A ROUTINE $ BEQ 100$ ;IF EQ ROUTINE NOT LOADED .IF DF M$$MGE ADD $KRLC5,R3 ;RELOCATE TO APR5 .ENDC ;M$$MGE6 MOV R3,.ADINT+2 ;SET THE INTERRUPT VECTOR XFR ADDRESS CLC ;SET GOOD RETURN0 RETURNP(100$: SEC ;FLAG INT ROUTINE NOT LOADED RETURN6 # .SBTTL .ADSTR ENABLE A/D CONVERTER ;+'; .ADSTR/.ADENX -- ENABLE A/D CONVERTER; ; INPUTS:T;T ; .ADSTR --S;"; R4 POINTS TO SWEEP CONTROL BLOCK; R3 AVAILABLE;- ; .ADENX --;."; R4 POINTS TO SWEEP CONTROL BLOCK; R3 POINTS TO CSR;Q ; OUTPUTS:;O1; ADCSR IS ARMED TO INTERRUPT ON CLOCK OR TRIGGER3;E/; NOTE: THIS ROUTINE MAY BE CALLED AT ANY LEVELT;;;- .PSECT .KSCT1*.ADSTR::MOV S.WCSR(R4),R3 ;GET CSR ADDRESS8.ADENX::BIT #S$WNOV,S.WFLG(R4) ;TRIGGER DRIVEN SAMPLING? BNE 20$ ;IF NE YES .IF NDF Q$$BUS2 MOV #AD$OVE!AD$ENB,-(SP) ;NO--SET OVERFLOW ENABLE00^Ú‚_Ý‚±|t÷tø tþfDATA BR 40$120$: MOV #AD$ESE!AD$ENB,-(SP) ;SET TRIGGER ENABLEB .IFF ;Q$$BUSB9 MOV #AD$IEN!AD$OVE!AD$ENB,-(SP) ;NO--SET OVERFLOW ENABLE BR 40$T820$: MOV #AD$IEN!AD$ESE!AD$ENB,-(SP) ;SET TRIGGER ENABLE .ENDC ;Q$$BUS<40$: MOVB S.WCHB(R4),1(SP);SET CHANNEL NUMBER INTO CSR-TO-BE% MOV (SP)+,(R3) ;JAM A/D CSR REGISTERC RETURN  T$ .SBTTL .DSBAD DISABLE A/D CONVERTER;+!; .DSBAD -- DISABLE A/D CONVERTER$;I ; INPUTS:;F"; R4 POINTS TO SWEEP CONTROL BLOCK;P ; OUTPUTS:;F; A/D CONVERTER IS DISABLEDV; ALL REGISTERS INTACT;T;- .IF GT N$AD11-1*.DSBAD::MOV R3,-(SP) ;SAVE R3 ON THE STACK MOV R4,R3 ;GET SWB ADDRESS# ADD #S.WUCB,R3 ;POINT TO FIRST UCB-3 MOV S.WUNT(R4),-(SP);SET COUNT OF UNITS ONTO STACKV.20$: BIT #UF$CIN,U.FLG(R3) ;IS UNIT CONNECTED? BEQ 40$ ;IF EQ NO ( CLR @U.CSR(R3) ;YES--DISABLE INTERRUPTS&40$: ADD #U.LGTH,R3 ;POINT TO NEXT UCB# DEC (SP) ;CHECK IF DONE ALL UNITSI BGT 20$ ;IF GT NO4 TST (SP)+ ;YES--CLEAR STACK MOV (SP)+,R3 ;YES--RESTORE R3 RETURNS .IFF ;N$AD11-1T*.DSBAD::CLR @S.WCSR(R4) ;DISABLE CONVERTER RETURN3 .ENDC ;N$AD11-1 .ENDC ;N$AD11 .ENDSWB ADDRESS# ADD #S.WUCB,R3 ;POINT TO FIRST UCB-3 MOV S.WUNT(R4),-(SP);SET COUNT OF UNITS ONTO STACKV.20$: BIT #UF$CIN,U.FLG(R3) ;IS UNIT CONNECTED? BEQ 40$ ;IF EQ NO ( CLR @U.CSR(R3) ;YES--DISABLE INTERRUPTS&40$: ADD #U.LGTH,R3 ;POINT TO NEXT UCB# DEC (SP) ;CHECK IF DONE ALL UNITSI BGT 20$ ;IF GT NO4 TST (SP)+ ;YES--CLEAR STACK MOV (SP)+,R3 ;YES--RESTORE 3 .TITLE KADIN0 SINGLE CHANNEL A/D INTERRUPT HANDLER .IDENT /M01.01/; ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01.01 ; B. SCHREIBER 15-SEP-77;E; MODIFIED BY:;U; M. HARVEY 6-MAR-79 ; MSH030 ALWAYS CLEAR ERROR BIT; D; THIS MODULE SAMPLES ONE A/D CHANNEL IN ABSOLUTE CHANNEL ADDRESSING; MODE. .MCALL KDVDF$, KSWDF$ KDVDF$T KSWDF$E .PSECT .KSCT1 G6 .SBTTL .ADIN0 SUPER-FAST SINGLE CHANNEL A/D INTERRUPT;+<; .ADIN0 -- SINGLE CHANNEL NO GAIN RANGING INTERRUPT ROUTINE;SB; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER SELECTED ABSOLUTE; CHANNEL ADDRESSING.E;Y ; INPUTS:;E8; R4 SET BY A JSR R4,.ADIN0; THIS INSTRUCTION IS LOCATED/; PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB. R,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB);N ; OUTPUTS:; 0; THE DATA WORD IS WRITTEN INTO THE USER BUFFER.;$;; OPTIONALLY, A FORK WILL BE REQUESTED IN ORDER TO STOP THES<; SWEEP (CAN BE INDUCED BY A NUMBER OF REASONS) OR TO SET AN;; EVENT FLAG OR QUEUE AN AST TO SIGNAL THE END OF A BUFFER.R;T;-5.ADIN0::MOV R3,(SP) ;;;SAVE R3, OVERWRITING SAVED R4 & ;;;WHICH WE DON'T NEED TO PRESERVE .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE. MOV S.WCSR(R4),R3 ;;;GET CSR REGISTER ADDRESS TST (R3) ;;;CHECK FOR ERRORS* BPL 20$ ;;;IF PL NO ERRORS--GO READ DATA& BIC #AD$ERR,(R3) ;;;ERROR--CLEAR FLAG- MOV 2(R3),R3 ;;;READ DATA TO CLEAR CONVERTER " MOV #ADERRV,R3 ;;;SET ERROR VALUE BR 40$ ;;;GO WRITE INTO BUFFER'20$: MOV 2(R3),R3 ;;;READ DATA FROM ADC 040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER .IFT ;M$$MGEV# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6R .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3;1 BCC 80$ ;;;IF CC NOT END OF BUFFER OR SWEE00_â‚|ã‚É‚´cÚµcÛ¶c�·c›’P END;9 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE GOING TO STOP THE SWEEP BEQ 60$ ;;;IF EQ NOR3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTING 660$: CALLR .KEFQI ;;;DO THE FORK LEVEL THING AND EXIT80$: RETURN ;EXITE .ENDC ;M$$MGE .ENDWRITE INTO BUFFER'20$: MOV 2(R3),R3 ;;;READ DATA FROM ADC 040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER .IFT ;M$$MGEV# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6R .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3;1 BCC 80$ ;;;IF CC NOT END OF BUFFER OR SWEE@ .TITLE KADIN1 MULTIPLE CHANNEL ABS CHANNEL ADDRESSING INTERRUPT .IDENT /M01.01/;R ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.E;R>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01.01 ; B. SCHREIBER 15-SEP-77;E; MODIFIED BY:;U; M. HARVEY 6-MAR-79 ; MSH030 ALWAYS CLEAR ERROR BIT; F; THIS INTERRUPT ROUTINE SAMPLES MULTIPLE CHANNELS IN ABSOLUTE CHANNEL; ADDRESSING MODE. .MCALL KSWDF$, KDVDF$ KSWDF$T KDVDF$C .PSECT .KSCT1 9 .SBTTL .ADIN1 MULTIPLE CHANNEL NO GAIN RANGING INTERRUPTI;+>; .ADIN1 -- MULTIPLE CHANNEL NO GAIN RANGING INTERRUPT ROUTINE;H?; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER CHOSE ABSOLUTET,; CHANNEL ADDRESSING WITH MULTIPLE CHANNELS.;H ; INPUTS:E;70; R4 SET BY A JSR R4,.ADIN1; THIS INSTRUCTION IS6; LOCATED PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB.,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB);L ; OUTPUTS:;MB; THE 'NCHN' CHANNELS ARE SAMPLED AND WRITTEN INTO THE USER BUFFER;;-8.ADIN1::MOV R3,(SP) ;;;SAVE R3, OVERWRITING R4 ON STACK .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE MOV R2,-(SP) ;;;SAVE R2' CLR -(SP) ;;;CLEAR "FORK NEEDED" FLAG % MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSLE.AD1DC::CLRB (R3) ;;;DISABLE CLOCK/ST FROM STARTING MORE CONVERSIONSS/ TST (R3) ;;;CHECK RESULTS OF FIRST CONVERSION $ ;;;(STARTED BY CLOCK OR TRIGGER) BPL 80$ ;;;IF PL GO READ DATAM BR 60$ ;;;ELSE GO HANDLE ERROR;N'; COME HERE FOR ALL SUBSEQUENT CHANNELS;I<20$: MOVB S.WCHB(R4),1(R3);;;SET THE CHANNEL NUMBER INTO CSR INC (R3) ;;;START CONVERSION( MOV #TMO$AD,R2 ;;;GET THE TIMEOUT COUNT.40$: BIT #AD$ERR!AD$DON,(R3) ;;;ERROR OR DONE? BMI 60$ ;;;IF MI ERROR BNE 80$ ;;;IF NE DONE" DEC R2 ;;;NOT YET--CHECK TIMEOUT BGT 40$ ;;;NO TIMEOUT YETI% MOV #ADTMOV,R3 ;;;TIMEOUT--SET VALUER BR 100$ ;;;GO STORE VALUEE;Y; ERROR ;G60$: ;;;REF LABEL. BIC #AD$ERR,(R3) ;;;CLEAR CONVERTER ERROR BIT' MOV 2(R3),R3 ;;;READ CONVERSION ANYHOWA) MOV #ADERRV,R3 ;;;SET TO STORE A/D ERRORT BR 100$ ;;;GO STOREO;R; READ DATA FROM A/D CONVERTER;M)80$: MOV 2(R3),R3 ;;;READ CONVERTED VALUE:*100$: CALL .KWRWD ;;;WRITE WORD TO BUFFER BCC 120$ ;;;IF CC CONTINUE" ROL (SP) ;;;SET THE FLAG TO FORK3 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE SUPPOSED TO STOP?M BNE 140$ ;;;IF NE YES--GO STOP,120$: CALL .ADNXC ;;;SWITCH TO NEXT CHANNEL) MOV S.WCSR(R4),R3 ;;;PICK UP CSR ADDRESS38 CMP S.WCHX(R4),S.WNCH(R4) ;;;HAVE WE DONE ALL CHANNELS? BNE 20$ ;;;IF NE NOD' CALL .ADENX ;;;YES--ARM A/D CONVERTOR0; -; WE ARE ALL DONE SAMPLING FOR THIS INTERRUPTR;M7140$: ROR (SP)+ ;;;PICK UP THE FORK FLAG AND POP STACK. MOV (SP)+,R2 ;;;RESTORE R2R .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6G .ENDC MOV (SP)+,R3 ;;;RESTORE R3W- BCC 180$ ;;;IF00|ê‚}ë‚~ñ‚t÷tø tþfDATA CC NO FORK NEEDED--JUST EXITG1 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE STOPPING SWEEP?L BEQ 160$ ;;;IF EQ NO3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTINGA4160$: CALLR .KEFQI ;;;FORK AND SET EFN OR QUEUE AST ;;;AND EXIT-180$: RETURN ;EXIT .ENDE ALL DONE SAMPLING FOR THIS INTERRUPTR;M7140$: ROR (SP)+ ;;;PICK UP THE FORK FLAG AND POP STACK. MOV (SP)+,R2 ;;;RESTORE R2R .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6G .ENDC MOV (SP)+,R3 ;;;RESTORE R3W- BCC 180$ ;;;IF< .TITLE KADIN2 SINGLE CHANNEL GAIN RANGING INTERRUPT HANDLER .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-SEP-77;E@; THIS MODULE SAMPLES ONE A/D CHANNEL WITH GAINS 1, 4, 16, OR 64 .MCALL KDVDF$, KSWDF$ KDVDF$O KSWDF$R .PSECT .KSCT1 S= .SBTTL .ADIN2 SINGLE CHANNEL A/D INTERRUPT HANDLER WITH GAINN;+8; .ADIN2 -- SINGLE CHANNEL SINGLE GAIN INTERRUPT ROUTINE;OE; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER SELECTED ONE CHANNELO.; TO BE SAMPLED AT ONE GAIN (1, 4, 16, OR 64).;L ; INPUTS:S; 8; R4 SET BY A JSR R4,.ADIN2; THIS INSTRUCTION IS LOCATED/; PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB. ,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB); ; OUTPUTS:;0; THE DATA WORD IS WRITTEN INTO THE USER BUFFER.;C;; OPTIONALLY, A FORK WILL BE REQUESTED IN ORDER TO STOP THED<; SWEEP (CAN BE INDUCED BY A NUMBER OF REASONS) OR TO SET AN;; EVENT FLAG OR QUEUE AN AST TO SIGNAL THE END OF A BUFFER. ; ;-5.ADIN2::MOV R3,(SP) ;;;SAVE R3, OVERWRITING SAVED R4,& ;;;WHICH WE DON'T NEED TO PRESERVE .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE. MOV S.WCSR(R4),R3 ;;;GET CSR REGISTER ADDRESS TST (R3) ;;;CHECK FOR ERRORS* BPL 20$ ;;;IF PL NO ERRORS--GO READ DATA' MOV 2(R3),R3 ;;;READ CONVERSION ANYHOWO" MOV #ADERRV,R3 ;;;SET ERROR VALUE BR 40$ ;;;GO WRITE INTO BUFFER,20$: MOV 2(R3),-(SP) ;;;READ CONVERTED VALUE MOV (R3),R3 ;;;COPY CSR . BIC #147777,R3 ;;;CLEAR ALL BUT THE GAIN BITS1 BIS (SP)+,R3 ;;;SET THE TOTAL A/D VALUE TO STOREI040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER .IFT ;M$$MGEP# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6V .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3(1 BCC 80$ ;;;IF CC NOT END OF BUFFER OR SWEEP ENDO9 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE GOING TO STOP THE SWEEP BEQ 60$ ;;;IF EQ NOE3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTINGV960$: CALLR .KEFQI ;;;FORK, SET EFN OR QUEUE AST AND EXIT 80$: RETURN ;EXIT  .ENDC ;M$$MGE .ENDITS1 BIS (SP)+,R3 ;;;SET THE TOTAL A/D VALUE TO STOREI040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER .IFT ;M$$MGEP# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6V .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3(1 BCC 80$ ;;;IF CC NOT= .TITLE KADIN3 MULTIPLE CHANNEL SINGLE GAIN INTERRUPT ROUTINE .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE 00~ò‚Œù‚É‚´cÚµcÛ¶c�·c›’WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-SEP-77;EE; THIS INTERRUPT ROUTINE SAMPLES MULTIPLE CHANNELS WITH A SINGLE GAINH; (I.E. GAIN 1, 4, 16, OR 64)O .MCALL KSWDF$, KDVDF$ KSWDF$A KDVDF$M .PSECT .KSCT1 = .SBTTL .ADIN3 MULTIPLE CHANNEL SINGLE GAIN INTERRUPT HANDLERI;+:; .ADIN3 -- MULTIPLE CHANNEL SINGLE GAIN INTERRUPT ROUTINE;A?; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER CHOSE MULTIPLE 6; CHANNEL SAMPLING WITH A FIXED GAIN (1, 4, 16, OR 64); ; INPUTS:T;P0; R4 SET BY A JSR R4,.ADIN3; THIS INSTRUCTION IS6; LOCATED PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB.,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB);1 ; OUTPUTS:;.B; THE 'NCHN' CHANNELS ARE SAMPLED AND WRITTEN INTO THE USER BUFFER;T;-8.ADIN3::MOV R3,(SP) ;;;SAVE R3, OVERWRITING R4 ON STACK .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE MOV R2,-(SP) ;;;SAVE R2' CLR -(SP) ;;;CLEAR "FORK NEEDED" FLAGA% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESS6E.AD3DC::CLRB (R3) ;;;DISABLE CLOCK/ST FROM STARTING MORE CONVERSIONSS/ TST (R3) ;;;CHECK RESULTS OF FIRST CONVERSION $ ;;;(STARTED BY CLOCK OR TRIGGER) BPL 80$ ;;;IF PL GO READ DATA.' BR 60$ ;;;ELSE HANDLE ERROR CONDITIONR;E'; COME HERE FOR ALL SUBSEQUENT CHANNELS:; <20$: MOVB S.WCHB(R4),1(R3);;;SET THE CHANNEL NUMBER INTO CSR INC (R3) ;;;START CONVERSION( MOV #TMO$AD,R2 ;;;GET THE TIMEOUT COUNT.40$: BIT #AD$ERR!AD$DON,(R3) ;;;ERROR OR DONE? BMI 60$ ;;;IF MI ERROR BNE 80$ ;;;IF NE DONE:" DEC R2 ;;;NOT YET--CHECK TIMEOUT BGT 40$ ;;;NO TIMEOUT YETT% MOV #ADTMOV,R3 ;;;TIMEOUT--SET VALUEE BR 100$ ;;;GO STORE VALUEO;O; ERROR);B+60$: MOV 2(R3),R3 ;;;READ CONVERSION ANYHOWL) MOV #ADERRV,R3 ;;;SET TO STORE A/D ERROR  BR 100$ ;;;GO STOREN;:; READ DATA FROM A/D CONVERTER;S780$: MOV 2(R3),-(SP) ;;;READ CONVERTED VALUE ONTO STACKR" MOV (R3),R3 ;;;READ CSR CONTENTS* BIC #147777,R3 ;;;CLEAR ALL BUT GAIN BITS5 BIS (SP)+,R3 ;;;CREATE A/D INPUT WORD WITH GAIN BITSI*100$: CALL .KWRWD ;;;WRITE WORD TO BUFFER BCC 120$ ;;;IF CC CONTINUE" ROL (SP) ;;;SET FORK NEEDED FLAG3 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE SUPPOSED TO STOP?B BNE 140$ ;;;IF NE YES--GO STOP,120$: CALL .ADNXC ;;;SWITCH TO NEXT CHANNEL) MOV S.WCSR(R4),R3 ;;;PICK UP CSR ADDRESSE8 CMP S.WCHX(R4),S.WNCH(R4) ;;;HAVE WE DONE ALL CHANNELS? BNE 20$ ;;;IF NE NO ' CALL .ADENX ;;;YES--ARM A/D CONVERTORS;B-; WE ARE ALL DONE SAMPLING FOR THIS INTERRUPT(;+.140$: ROR (SP)+ ;;;CHECK THE FORK NEEDED FLAG MOV (SP)+,R2 ;;;RESTORE R2D .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6E .ENDC MOV (SP)+,R3 ;;;RESTORE R34- BCC 180$ ;;;IF CC NO FORK NEEDED--JUST EXITF1 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE STOPPING SWEEP?E BEQ 160$ ;;;IF EQ NO3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTINGH8160$: CALLR .KEFQI ;FORK, SET EFN OR QUEUE AST AND EXIT180$: RETURN ;EXIT .END CONVERTORS;B-; WE ARE ALL DONE SAMPLING FOR THIS INTERRUPT(;+.140$: ROR (SP)+ ;;;CHECK THE FORK NEEDED FLAG MOV (SP)+,R2 ;;;RESTORE R2D .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6E .ENDC MOV (SP)+,R3 ;;;RESTORE R34- BCCA .TITLE KADIN4 SINGLE CHANNEL AUTO GAIN RANGING INTERRUPT HANDLER .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO 00Œú‚¤ÿ‚ñ‚t÷tø tþfDATAONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-SEP-77;E=; THIS MODULE SAMPLES ONE A/D CHANNEL WITH AUTO GAIN RANGING.E .MCALL KDVDF$, KSWDF$ KDVDF$  KSWDF$N .PSECT .KSCT1 E5 .SBTTL .ADIN4 SAMPLE 1 A/D CHANNEL WITH GAIN RANGINGO;+>; .ADIN4 -- SINGLE CHANNEL AUTO GAIN RANGING INTERRUPT ROUTINE;L@; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER SELECTED SINGLE*; CHANNEL SAMPLING WITH AUTO GAIN RANGING.; ; INPUTS:R;A8; R4 SET BY A JSR R4,.ADIN4; THIS INSTRUCTION IS LOCATED/; PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB. -,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB); ; OUTPUTS:;R0; THE DATA WORD IS WRITTEN INTO THE USER BUFFER.;F;; OPTIONALLY, A FORK WILL BE REQUESTED IN ORDER TO STOP THE <; SWEEP (CAN BE INDUCED BY A NUMBER OF REASONS) OR TO SET AN;; EVENT FLAG OR QUEUE AN AST TO SIGNAL THE END OF A BUFFER.E;T;-5.ADIN4::MOV R3,(SP) ;;;SAVE R3, OVERWRITING SAVED R4G& ;;;WHICH WE DON'T NEED TO PRESERVE .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .IFTF ;M$$MGE. MOV S.WCSR(R4),R3 ;;;GET CSR REGISTER ADDRESS8.AD4DC::CLRB (R3) ;;;DISABLE ANY MORE CONVERSION STARTS TST (R3) ;;;CHECK FOR ERRORS* BPL 20$ ;;;IF PL NO ERRORS--GO READ DATA' MOV 2(R3),R3 ;;;READ CONVERSION ANYHOWB" MOV #ADERRV,R3 ;;;SET ERROR VALUE BR 40$ ;;;GO WRITE INTO BUFFER920$: CALL .ADAGR ;;;PERFORM AUTO GAIN RANGING AND RETURNO ;;;THE CONVERTED VALUE IN R3040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER1 CALL .ADSTR ;;;RE-ENABLE CONVERTER TO INTERRUPTP .IFT ;M$$MGEM# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6I .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3O1 BCC 80$ ;;;IF CC NOT END OF BUFFER OR SWEEP ENDS9 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE GOING TO STOP THE SWEEP  BEQ 60$ ;;;IF EQ NOO3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTINGO860$: CALLR .KEFQI ;;;FORK SET EFN OR QUEUE AST AND EXIT80$: RETURN ;EXIT .ENDC ;M$$MGE .ENDIN R3040$: CALL .KWRWD ;;;WRITE WORD INTO USER BUFFER1 CALL .ADSTR ;;;RE-ENABLE CONVERTER TO INTERRUPTP .IFT ;M$$MGEM# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6I .IFTF ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3O1; .TITLE KADIN5 MULTIPLE CHANNEL AUTO GAIN RANGING INTERRUPT .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-SEP-77;EA; THIS INTERRUPT ROUTINE SAMPLES MULTIPLE CHANNELS WITH AUTO GAINT ; RANGING. .MCALL KSWDF$, KDVDF$ KSWDF$P KDVDF$O .PSECT .KSCT1 T; .SBTTL .ADIN5 MULTIPLE CHANNEL AUTO GAIN RANGING INTERRUPTE;+@; .ADIN5 -- MULTIPLE CHANNEL AUTO GAIN RANGING INTERRUPT ROUTINE; ?; THIS INTERRUPT ROUTINE IS SELECTED IF THE USER CHOSE MULTIPLEE*; CHANNEL SAMPLING WITH AUTO GAIN RANGING.;O ; INPUTS:O;A0; R4 SET BY A JSR R4,.ADIN5; THIS INSTRUCTION IS6; LOCATED PHYSICALLY IMMEDIATELY PRECEDING THE ADSWB.,; R5 POINTS TO THE FORK BLOCK (SETUP BY ICB)00¤ƒLƒÉ‚´cÚµcÛ¶c�·c›’;O ; OUTPUTS:;NB; THE 'NCHN' CHANNELS ARE SAMPLED AND WRITTEN INTO THE USER BUFFER;T;-8.ADIN5::MOV R3,(SP) ;;;SAVE R3, OVERWRITING R4 ON STACK .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE MOV R2,-(SP) ;;;SAVE R2+ CLR -(SP) ;;;CLEAR THE "FORK NEEDED" FLAGH% MOV S.WCSR(R4),R3 ;;;GET CSR ADDRESSD.AD5DC::CLRB (R3) ;;;STOP CLOCK/ST FROM STARTING ANOTHER CONVERSION/ TST (R3) ;;;CHECK RESULTS OF FIRST CONVERSIOND$ ;;;(STARTED BY CLOCK OR TRIGGER) BPL 80$ ;;;IF PL GO READ INPUT BR 60$ ;;;ELSE GO HANDLE ERROR; '; COME HERE FOR ALL SUBSEQUENT CHANNELSA;5<20$: MOVB S.WCHB(R4),1(R3);;;SET THE CHANNEL NUMBER INTO CSR INC (R3) ;;;START CONVERSION( MOV #TMO$AD,R2 ;;;GET THE TIMEOUT COUNT.40$: BIT #AD$ERR!AD$DON,(R3) ;;;ERROR OR DONE? BMI 60$ ;;;IF MI ERROR BNE 80$ ;;;IF NE DONE" DEC R2 ;;;NOT YET--CHECK TIMEOUT BGT 40$ ;;;NO TIMEOUT YETR% MOV #ADTMOV,R3 ;;;TIMEOUT--SET VALUER BR 100$ ;;;GO STORE VALUEE;Y; ERROR ;G+60$: MOV 2(R3),R3 ;;;READ CONVERSION ANYHOW0) MOV #ADERRV,R3 ;;;SET TO STORE A/D ERROR  BR 100$ ;;;GO STOREN;A; READ DATA FROM A/D CONVERTER;S.80$: CALL .ADAGR ;;;PERFORM AUTO GAIN RANGING*100$: CALL .KWRWD ;;;WRITE WORD TO BUFFER BCC 120$ ;;;IF CC CONTINUE" ROL (SP) ;;;SET FORK NEEDED FLAG3 BIT #S$WSTP,S.WFL2(R4) ;;;ARE WE SUPPOSED TO STOP?R BNE 140$ ;;;IF NE YES--GO STOP,120$: CALL .ADNXC ;;;SWITCH TO NEXT CHANNEL) MOV S.WCSR(R4),R3 ;;;PICK UP CSR ADDRESSA8 CMP S.WCHX(R4),S.WNCH(R4) ;;;HAVE WE DONE ALL CHANNELS? BNE 20$ ;;;IF NE NOV' CALL .ADENX ;;;YES--ARM A/D CONVERTOR ;G-; WE ARE ALL DONE SAMPLING FOR THIS INTERRUPTS;0/140$: ROR (SP)+ ;;;CHECK THE FORK REQUEST FLAG$ MOV (SP)+,R2 ;;;RESTORE R2T .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6  .ENDC MOV (SP)+,R3 ;;;RESTORE R3 - BCC 180$ ;;;IF CC NO FORK NEEDED--JUST EXITN6 BIT #S$WSTP,S.WFL2(R4) ;;;YES--ARE WE STOPPING SWEEP? BEQ 160$ ;;;IF EQ NO3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTING;:160$: CALLR .KEFQI ;;;FORK, SET EFN OR QUEUE AST AND EXIT180$: RETURN ;EXIT .ENDOR ;G-; WE ARE ALL DONE SAMPLING FOR THIS INTERRUPTS;0/140$: ROR (SP)+ ;;;CHECK THE FORK REQUEST FLAG$ MOV (SP)+,R2 ;;;RESTORE R2T .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6  .ENDC MOV (SP)+,R3 ;;;RESTORE R3 - BCC 180$ ;;;IF CC NO FORK NEEDED--JUST EXITN6 BIT #S$WSTP,S.WFL2(R4) ;;;YES--ARE WE STOPPING SWEEP? BEQ 160$ ;;;IF EQ NO3 CALL .DSBAD ;;;YES--DISABLE A/D FROM INTERRUPTING;:160$: & .TITLE KAST AST ROUTINES FOR K-SERIES .IDENT /M01.00/;D; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.#;C>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 7-SEP-77 ;E=; THIS MODULE CONTAINS ALL THE AST ROUTINES FOR THE DIFFERENTE ; SWEEPS. ;S; SYSTEM MACRO CALLS;D& .MCALL KSWDF$, ASTX$S, CINT$S, SETF$S KSWDF$A ' .SBTTL .ADAST HANDLE AST FOR A/D SWEEP ;++; .ADAST -- HANDLE AST QUEUED FOR A/D SWEEPD;O ; INPUTS:C;T&; STACK VECTOR ADDRESS ON TOP OF STACK;N ; OUTPUTS:;/; DISCONNECTS A/D CONVERTERS IF STOPPING SWEEP.R4; SETS EVENT FLAG IF NECESSARY, AND CALLS COMPLETION ; ROUTINE.;Y;- .ENABL LSB  .IF DF N$AD117.ADAST::MOV R0,(SP) ;SAVE R0, OVERWRITE VECTOR ADDRESS  MOV R1,-(SP) ;SAVE  MOV R2,-(00L ƒÿ‚ñ‚t÷tø tþfDATASP) ; REST MOV R3,-(SP) ; OF$% MOV R4,-(SP) ; REGISTERS MOV R5,-(SP) ;...0 MOV #.ADSWB,R4 ;POINT TO AD SWEEP CONTROL BLOCK( BIT #S$WSTP,S.WFL2(R4) ;STOPPING SWEEP?0 BNE 60$ ;IF NE YES--GO FIX IOSB AND DISCONNECT .IFTF ;N$AD11D; COME TO 20$ TO CALL COMPLETION ROUTINE, RESTORE REGISTERS AND EXIT+; COME TO 40$ TO RESTORE REGISTERS AND EXIT;?; REGISTERS MUST BE ON STACK, WITH R5 AT TOP, AND R0 AT BOTTOM.O;W220$: CALL @S.WEFN(R4) ;NO--CALL COMPLETION ROUTINE40$: MOV (SP)+,R5 ;RESTORE MOV (SP)+,R4 ; THE$ MOV (SP)+,R3 ; REGISTERS MOV (SP)+,R2M MOV (SP)+,R1P MOV (SP)+,R0P ASTX$SB .IFT ;N$AD11P;L; STOPPING THE SWEEP;B,60$: CALL .DSCAD ;DISCONNECT A/D CONVERTERS& CALL .KLQRM ;REMOVE FROM CLOCK QUEUE .IF DF K$$W11 .IF DF FT$MOP! TST .KUCNT ;ANYONE USING CLOCK?S( BNE 80$ ;IF NE DO NOT DISCONNECT CLOCK .ENDC ;FT$MOP( CALL 400$ ;LAST USER--DISCONNECT CLOCK .ENDC ;K$$W11 -< .SBTTL SWEEP END--FILL IN I/O STATUS BLOCK AND CLEAN UP SWB;R?; COME TO 80$ TO TERMINATE A SWEEP. THE EVENT FLAG IS SET OR ARB; COMPLETION ROUTINE WILL BE CALLED. THE SWB IS THEN CLEARED OUT. ; (FLAGS).;E .IFTF ;N$AD11080$: CALL 100$ ;CLEAR SWB AND SET EFN IF NEEDED3 BCC 20$ ;IF CC WE NEED TO CALL COMPLETION ROUTINED) BR 40$ ;ELSE WE SET AN EVENT FLAG--DONEK;BC; ROUTINE TO CLEAR OUT SWB. IN ADDITION, SETS EVENT FLAG IF NEEDED.$;L ; OUTPUTS:;N*; C-CLEAR NEED TO CALL COMPLETION ROUTINE; C-SET EFN WAS SET--ALL DONE;N0100$: CLR S.WEFM(R4) ;CLEAR EVENT FLAG MASK WORD' CLR S.WEFA(R4) ;AND EVENT FLAG ADDRESSP CLR S.WFLG(R4) ;ZERO FLAG WORDH( MOV S.WFL2(R4),R0 ;GET SECOND FLAG WORD; BIC #^C,S.WFL2(R4) ;CLEAR ALL BITS EXCEPT A/D FLAGI. CLC ;PRE-SET C-BIT TO INDICATE CMPL ROUTINE3 BIT #S$WEFN,R0 ;ARE WE USING EVENT FLAGS OR AST'S?D' BEQ 120$ ;IF EQ NOT USING EVENT FLAGSN+ SETF$S S.WEFN(R4) ;ELSE SET THE EVENT FLAG % SEC ;SET C-BIT TO INDICATE EFN SETO 120$: RETURN .ENDC ;N$AD11 S$ .SBTTL .DRAST HANDLE DR11 SWEEP AST;+.; .DRAST -- AST ROUTINE FOR DIGITAL I/O SWEEPS;F ; INPUTS:P;C+; STACK VECTOR ADDRESS OF DEVICE AST IS FOR4;0 ; OUTPUTS:;A%; NORMAL COMPLETION ROUTINE IS CALLEDE8; STOPPING SWEEP - DR11 IS DISCONNECTED FROM INTERRUPTS,1; AND EVENT FLAG OR COMPLETION ROUTINE IS CALLEDV; AS APPROPRIATE.;B;- .IF DF N$DR11&.DRAST::MOV R1,-(SP) ;SAVE R1 ON STACK, MOV 2(SP),R1 ;GET VECTOR ADDRESS FROM STACK' MOV R0,2(SP) ;SAVE R0 WHERE VECTOR WAS$ MOV R2,-(SP) ;SAVEA MOV R3,-(SP) ; THE MOV R4,-(SP) ; REST- MOV R5,-(SP) ; OF THE REGISTERST1 MOV #.DRUTB,R0 ;GET POINTER TO SWEEP BLOCK TABLEP(200$: MOV (R0)+,R4 ;GET NEXT SWB ADDRESS BEQ 40$ ;IF EQ ALL DONED. CMP S.WUBX+U.IVEC(R4),R1 ;INPUT VECTOR RIGHT? BEQ 220$ ;IF EQ YESO/ CMP S.WUBX+U.OVEC(R4),R1 ;OUTPUT VECTOR RIGHT?. BNE 200$ ;IF NE NO9220$: BIT #S$WSTP,S.WFL2(R4) ;YES--ARE WE STOPPING SWEEP? 8 BEQ 20$ ;IF EQ NO--GO CALL COMPLETION ROUTINE AND EXIT;; STOPPING SWEEP;7280$: MOV S.WUBX+U.IVEC(R4),R3 ;ASSUME INPUT DISCONNECTM BIT #S$WIOF,S.WFL2(R4) ;CHECK" BNE 300$ ;IF NE INPUT DISCONNECT0 MOV S.WUBX+U.OVEC(R4),R3 ;NO--GET OUTPUT VECTOR 300$: CINT$S R3,,#0 ;DISCONNECT0 BIC #UF$CIN,S.WUBX+U.FLG(R4) ;FLAG DISCONNECTED BR 80$ ;FINISH UP0 .ENDC ;N$DR11 S$ .SBTTL .KWAST HANDLE AST'S FOR KW11;+?; .KWAST -- AST ROUTINE FOR CLOCK DRIVEN SWEEPS (EXCEPT GTHIST)T;I ; INPUTS:;Q; STACK VECTOR ADDRESS OF CLOCKO;O ; OUTPUTS:;%; NORMAL COMPLETION ROUTINE IS CALLEDU7; STOPPING SWEEP - KW11 IS DISCONNECTED FROM INTERRUPTSS2; (UNLESS MULT. OPERATIONS) AND EVENT FLAG IS SET/; OR COMPLETION ROUTINE CALLED AS APPROPRIATE.R;0;- .IF DF K$$W117.KWAST::MOV R0,(SP) ;SAVE R0, OVERWRITE VECTOR ADDRESS MOV R1,-(SP) ;HO HUM MOV R2,-(SP) ;SAVE THEM AWAYA MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP)  .IF NDF FT$MOPR& MOV .KASWB,R4 ;GET ACTIVE SWB ADDRESS/ BIT #S$WSTP,S.WFL2(R4) ;ARE WE STOPPING SWEEP?U1 BEQ 20$ 00LƒVƒÉ‚´cÚµcÛ¶c�·c›’;IF EQ NO--CALL COMPLETION ROUTINE,EXIT" CALL 400$ ;YES--DISCONNECT CLOCK BR 80$ ;AND FINISH UP( .IFF ;FT$MOPA- MOV #<.KLQUU-S.WCLQ>,R4 ;POINT TO QUEUE HEADU.320$: MOV S.WCLQ(R4),R4 ;LINK TO NEXT IN QUEUE BEQ 380$ ;IF EQ END OF QUEUE, TST S.WFLG(R4) ;AST REQUEST FOR THIS SWEEP? BPL 320$ ;IF PL NO--IGNORE/ BIC #S$WAST,S.WFLG(R4) ;CLEAR AST REQUEST FLAGM/ BIT #S$WSTP,S.WFL2(R4) ;ARE WE STOPPING SWEEP?4 BEQ 360$ ;IF EQ NO--CONTINUE% CALL .KLQRM ;YES--REMOVE FROM QUEUEP1340$: CALL 100$ ;CLEAR SWB AND SET EFN IF NEEDEDI& BCS 320$ ;IF CS WE SET EFN--ALL DONE<360$: MOV R4,-(SP) ;SAVE SWB POINTER FROM COMPLETION ROUTINE/ CALL @S.WEFN(R4) ;CALL USER COMPLETION ROUTINER" MOV (SP)+,R4 ;RESTORE SWB POINTER BR 320$ ;CONTINUE SCANNING3380$: TST .KUCNT ;ARE THERE ANY MORE ACTIVE SWEEPS; BNE 40$ ;IF NE YES--ALL DONE! CALL 400$ ;NO--DISCONNECT CLOCK BR 40$ ;AND QUIT .ENDC ;FT$MOP;E; DISCONNECT CLOCK; -400$: MOV .KAVEC,R0 ;GET CLOCK VECTOR ADDRESSU' CALL 500$ ;DISCONNECT FROM INTERRUPTS  .IF DF Q$$BUS$ ADD #4,R0 ;DISCONNECT OTHER VECTOR CALL 500$ ;... .ENDC ;Q$$BUS; BIC #K$ACIN!K$ACTV!K$AGTD,.KAFLG ;FLAG NO LONGER CONNECTED $ ;AND NO GTHIST IN PROGRESS RETURN ;DONE 500$: CINT$S R0,,#0 ;DISCONNECT RETURNE .ENDC ;K$$W11 .DSABL LSB4 .ENDE YES--ALL DONE! CALL 400$ ;NO--DISCONNECT CLOCK BR 40$ ;AND QUIT .ENDC ;FT$MOP;E; DISCONNECT CLOCK; -400$: MOV .KAVEC,R0 ;GET CLOCK VECTOR ADDRESSU' CALL 500$ ;DIS) .TITLE KBFRMG BUFFER MANAGEMENT ROUTINES .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 15-AUG-77;E5; THIS MODULE CONTAINS ROUTINES FOR BUFFER MANAGEMENT ;G; SYSTEM MACRO CALLS;R .MCALL KSWDF$ KSWDF$H O, .SBTTL RLSBUF RELEASE BUFFER TO BUFFER POOL;+/; RLSBUF -- RELEASE A BUFFER TO THE BUFFER POOLJ; >; THIS ROUTINE IS CALLED BY THE USER TO DECLARE A BUFFER READY; FOR THE ISR TO USE. ;I; CALLING SEQUENCE:O; &; CALL RLSBUF (IBUF, IND, N1,N2,...N8);R ; INPUTS:Y;S+; IBUF THE IBUF ARRAY USED TO START A SWEEPP9; N1-N8 ARE THE BUFFERS TO RELEASE (MAY HAVE 1-8 BUFFERS); ; OUTPUTS:;O; IND RETURNS STATUS; 0 BAD BUFFER NUMBER; 1 BUFFERS RELEASED OK3; BUFFERS ARE INSERTED INTO THE DEVICE BUFFER QUEUEE;F;-&RLSBUF::MOV 2(R5),R1 ;GET IBUF ADDRESS MOV R1,R4 ;MAKE A COPY* MOVB (R5),R3 ;SET NUMBER OF ARGS INTO R3& CMP (R5)+,(R5)+ ;POINT TO IND ADDRESS( SUB #2,R3 ;IS THERE AN ARGUMENT THERE? BLE 80$ ;IF LE NO--QUIT NOW,% MOV (R5)+,R0 ;GET/CHECK IND ARGUMENTI# INC R0 ;MAKE -1 (DEFAULT) GO TO 01 BEQ 10$ ;IF EQ LEAVE AT 0E$ DEC R0 ;NOT DEFAULTED--GET IT BACK# MOV #1,(R0) ;SET SUCCESS INTO INDD&10$: MTPS #PR6 ;;;LOCK OUT INTERRUPTS020$: MOV @(R5)+,R2 ;;;GET THE NEXT BUFFER NUMBER BMI 25$ ;;;IF MI ERROR+ CMP R2,IB.NBF(R1) ;;;IS IT A LEGAL NUMBER?K BLO 30$ ;;;IF LO YES25$: TST R0 ;;;WAS IND GIVEN? BEQ 60$ ;;;IF EQ NOO DEC (R0) ;;;YES--MAKE 1 INTO 0 BR 60$ ;;;FINISH UPB,30$: ADD #IB.DVQ,R1 ;;;POINT TO DEVICE QUEUE .REPT 8.A) TSTB (R1)+ ;;;FIND THE END OF THE QUEUE1# BMI 40$ ;;;IF MI WE HAVE FOUND ITR .ENDM BR 60$ ;;;SHOULD NOT HAPPEN)-40$: MOVB R2,-(R1) ;;;ENTER BUFFER INTO QUEUEC$00Vƒÿ‚ñ‚t÷tø tþfDATA MOV R4,R1 ;;;RESET POINTER TO IBUF$ DEC R3 ;;;DECREMENT ARGUMENT COUNT* BGT 20$ ;;;IF GT MORE BUFFERS TO RELEASE!60$: MTPS #0 ;;;ALLOW INTERRUPTS 80$: RETURNT R% .SBTTL INXTBF SET NEXT BUFFER TO USEQ;+"; INXTBF -- SET NEXT BUFFER TO USE;0; CALLING SEQUENCE::;D; IND = INXTBF (IBUF, N [,IND])E; ; INPUTS:A;%; IBUF IS THE IBUF FROM A SWEEP STARTU+; N IS THE NUMBER OF THE NEXT BUFFER TO SET.;M ; OUTPUTS:;;; R0/IND 0 IF ERROR0 ; 1 IF OK;);-INXTBF::CLR R4 ;ASSUME FAILURE1 MOV 2(R5),R0 ;GET IBUF ADDRESSR) CALL .FDSWI ;FIND SWB THAT GOES WITH IT; BCS 80$ ;IF CS FORGET IT MOV @4(R5),R2 ;GET BUFFER # BMI 80$ ;MI IS ILLEGAL CMP R2,IB.NBF(R0) ;IS IT LEGAL? BHIS 80$ ;IF HIS NO-" MTPS #PR6 ;;;LOCK OUT INTERRUPTS& CMPB R2,S.WBNO(R1) ;;;CURRENT BUFFER?& BEQ 60$ ;;;IF EQ YES--CANNOT NEXT IT( ADD #IB.DVQ,R0 ;;;POINT TO DEVICE QUEUE% CMPB R2,(R0)+ ;;;IS IT ALREADY NEXT?M BEQ 50$ ;;;IF EQ YES--GET OUTR% MOV #1,R3 ;;;COUNT OF BYTES TO MOVE  .REPT 7 CMPB R2,(R0)+ ;;;IS THIS IT?  BEQ 20$ ;;;IF EQ YES* INC R3 ;;;NO--COUNT ANOTHER BYTE TO MOVE .ENDM( BR 60$ ;;;NOT IN QUEUE--CANNOT NEXT IT+20$: DEC R0 ;;;BACK UP TO BYTE IN QUESTIONA040$: MOVB -(R0),1(R0) ;;;PUSH QUEUE DOWN OVER IT DEC R3 ;;;CHECK FOR ENOUGH BGT 40$ ;;;DO ALL NEEDED( MOVB R2,(R0) ;;;MAKE NEW 'NEXT' BUFFER50$: INC R4 ;;;FLAG SUCCESS!60$: MTPS #0 ;;;ALLOW INTERRUPTSD'80$: MOV R4,R0 ;POSITION STATUS RETURNR" CMPB (R5),#3 ;WERE THERE 3 ARGS?) BNE 100$ ;IF NE NO--DO NOT STORE STATUSI, MOV 6(R5),R1 ;YES--GET POSSIBLE IND ADDRESS CMP #-1,R1 ;WAS IT DEFAULTED?. BEQ 100$ ;IF EQ YES  MOV R0,(R1) ;NO--STORE STATUSC 100$: RETURN O. .SBTTL RMVBUF REMOVE BUFFER FROM DEVICE QUEUE;++; RMVBUF -- REMOVE BUFFER FROM DEVICE QUEUE;T; CALLING SEQUENCE:D;M!; CALL RMVBUF (IBUF, IBUFNO, IND)F&; OR: IND = IRMVBF (IBUF, IBUFNO, IND); ; INPUTS:W;T%; IBUF IS THE IBUF FROM A SWEEP STARTT'; IBUFNO IS THE BUFFER NUMBER TO REMOVEA;? ; OUTPUTS:;F; IND 1 SUCCESSO; 0 NOT IN QUEUER;R;-IRMVBF:: ;REF LABELE&RMVBUF::MOV 2(R5),R0 ;GET IBUF ADDRESS MOV @4(R5),R1 ;GET BUF #R& ADD #IB.DVQ,R0 ;POINT TO DEVICE QUEUE" MOV #7,R2 ;SET MAX COUNT TO MOVE" MTPS #PR6 ;;;LOCK OUT INTERRUPTS .REPT 8.  CMPB R1,(R0)+ ;;;IS THIS IT?  BEQ 20$ ;;;IF EQ YES* DEC R2 ;;;NO--DEC COUNT OF BYTES TO MOVE .ENDM BR 80$ ;;;NOT IN QUEUE.20$: DEC R0 ;;;BACKUP PTR TO BYTE IN QUESTION TST R2 ;;;ANY TO MOVE?. BEQ 60$ ;;;IF EQ NO--JUST REMOVED LAST ENTRY#40$: MOVB 1(R0),(R0)+ ;;;MOVE QUEUEV DEC R2 ;;; BGT 40$ ;;;O%60$: MOVB #-1,(R0) ;;;END WITH A ZERO5 MOV #1,R0 ;;;SET STATUSD BR 100$ ;;;FINISH UP'80$: CLR R0 ;;;SET NOT IN QUEUE STATUS"100$: MTPS #0 ;;;ALLOW INTERRUPTS& CMPB (R5),#3 ;ARE THERE 3 ARGUMENTS?( BLO 120$ ;IF LO NO--DON'T STORE STATUS, MOV 6(R5),R1 ;YES--GET POSSIBLE IND ADDRESS CMP R1,#-1 ;WAS IT DEFAULTED?C BEQ 120$ ;IF EQ YESY MOV R0,(R1) ;NO--STORE STATUSO 120$: RETURN * .SBTTL .FDSWI FIND SWB GIVEN 'IBUF' ARRAY;+;; .FDSWI -- FIND SWEEP CONTROL BLOCK GIVEN THE 'IBUF' ARRAYM; ; INPUTS:;; /; R0 'IBUF' ARRAY ADDRESS (SAME AS USW ADDRESS)$;; ; OUTPUTS:;:; C-CLEAR FOUND SWEEPQ; R1 POINTS TO SWB;S; C-SET COULD NOT FIND SWB; R1 0; ; REGISTERS ALTERED:;; R1; ;-*.FDSWI::MOV #SWB0,R1 ;START WITH FIRST SWB(20$: CMP R0,S.WUSW(R1) ;IS THIS THE SWB? BEQ 40$ ;IF EQ YES( MOV S.WLNK(R1),R1 ;NO--LINK TO NEXT SWB BNE 20$ ;IF MORE GO CHECK  CLR R1 ;ELSE RETURN 0  SEC RETURNR; ; FOUND SWBI; 40$: CLC RETURNB .ENDN THE 'IBUF' ARRAYM; ; INPUTS:;; /; R0 'IBUF' ARRAY ADDRESS (SAME AS USW ADDRESS)$;; ; OUTPUTS:;:; C-CLEAR FOUND SWEEPQ; R1 POINTS TO SWB;S; C-SET COULD NOT FIND SWB; R1 0; ; REGISTERS ALTERED:;; R1; ;-*.FDSWI::MOV #SWB0,R1 ;START WITH FIRST SWB(20$: CMP R0,S.WUSW(R1) ;IS THIS THE SWB? BEQ 40$ ;IF EQ YES( MOV S.WLNK(R1),R1 ;NO--LINK TO NEXT SWB BNE 20$ ;IF MORE GO CHECK  CLR R1 ;ELSE R00W"ƒX'ƒÉ‚´cÚµcÛ¶c�·c›’ .TITLE KCLOKA CLOCK A CONTROL .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 5-SEP-77 ;E>; THIS ROUTINE ACCEPTS RATES AND PRESETS TO BE USED LATER WITH ; CLOCK A.;S; SYSTEM MACRO CALLS;D .MCALL KSWDF$ KSWDF$E A;++; CLOCKA -- SET RATE AND PRESET FOR CLOCK AN;M; CALLING SEQUENCE:T; (; CALL CLOCKA (IRATE, IPRSET,IND, [LUN]);L ; INPUTS:N;U'; IRATE IS THE DESIRED CLOCK RATE (0-7)N3; IPRSET IS THE 16-BIT 2S COMPLEMENT PRESET TO LOADO; LUN IS IGNORED;I ; OUTPUTS:;O; IND RETURNS STATUS; 0 BAD ARGUMENTS.; 1 CLOCK RATE AND PRESET SET FOR SWEEP START<; FLAGS ARE SET SO SWEEP ROUTINES KNOW THIS ROUTINE HAS BEEN ; CALLED.;L;-CLOCKA:: .IF DF K$$W11& CALL .K.PAA ;VALIDATE AND STACK ARGS .WORD 4 ;4 ARGSA! .WORD 14 ;1ST TWO ARGS REQUIREDN BCC 10$ ;IF CC CONTINUEO .IFTF ;K$$W11% MOV #3,R4 ;STORE IN THIRD ARG (IND)  CLR R3 ;STORE 0 FOR ERROR72 CALLR .IESTO ;TRY TO STORE ERROR CODE AND RETURN .IFT ;K$$W11N 10$: MOV @(SP)+,R0 ;GET THE RATE( BIC #^C<7>,R0 ;CLEAR UNINTERESTING BITS ASL R0 ;MAKE INTO CLOCK RATE A .IF DF Q$$BUS ASL R0 ;A COUPLE MORE SHIFTS& ASL R0 ;FOR THE Q-BUS VERSION PLEASE .ENDC ;Q$$BUS MOV R0,.KARAT ;SAVE FOR LATER$ MOV @(SP)+,.KAPRE ;STORE THE PRESET MOV (SP)+,R0 ;GET IND ADDRESS" BEQ 20$ ;IF EQ SKIP STATUS STORE MOV #1,(R0) ;SET SUCCESS20$: TST (SP)+ ;SKIP THE LUN ( BIS #K$ACAC,.KAFLG ;FLAG WE WERE CALLED .ENDC ;K$$W11 100$: RETURN .END$W11N 10$: MOV @(SP)+,R0 ;GET THE RATE( BIC #^C<7>,R0 ;CLEAR UNINTERESTING BITS ASL R0 ;MAKE INTO CLOCK RATE A .IF DF Q$$BUS ASL R0 ;A COUPLE MORE SHIFTS& ASL R0 ;FOR THE Q-BUS VERSION PLEASE .- .TITLE KSWDF SWEEP CONTROL BLOCK DEFINITIONSO .IDENT /M01.01/;I ; COPYRIGHT (C) 1977, 1978, 1979/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.C;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01.01 ; B. SCHREIBER 6-JUL-77E;E; MODIFIED BY:;U; M. S. HARVEY 13-MAY-795; MSH035 -- DEFINE INTERRUPT CONTROL FLAG FOR DR11-KA;O;R;; THIS MODULE DEFINES THE SWEEP CONTROL BLOCK (SWB) OFFSETS+; AND FLAG VALUES CONTAINED WITHIN THE SWB.J  .MACRO KSWDF$;+#; SWB - SWEEP CONTROL BLOCK OFFSETS ;OC; THERE IS ONE SWEEP CONTROL BLOCK FOR EACH POSSIBLE TYPE OF SWEEP:R>; A/D, D/A, DIGITAL INPUT, DIGITAL OUTPUT, GATHERING HISTOGRAM; DATA. ;C;- .ASECTE.=0C2S.WLNK: .BLKW 1 ;LINK TO NEXT SWEEP CONTROL BLOCK%S.WFLG: .BLKW 1 ;SWEEP CONTROL FLAGS-S.WFL2: .BLKW 1 ;MO00X*ƒÿ‚ñ‚t÷tø tþfDATARE FLAGSBS.WUSW: .BLKW 3 ;USER STATUS WORD: USER, EXEC APR6 RELOC AND BIAS'S.WBNO: .BLKB 1 ;CURRENT BUFFER NUMBER  .BLKB 1 ;SPARE BYTEI!S.WEBF: .BLKB 1 ;BUFFER IN ERROR7S.WLBF: .BLKB 1 ;LAST BUFFER COMPLETED (SEE KRWBF.MAC)S/S.WIBP: .BLKW 2*N$$MBF ;INITIAL BUFFER POINTERSF;S.WBPX: .BLKW 1 ;POINTER TO S.WBPT <.+2>(+RELOC IF MAPPED)G)S.WBPT: .BLKW 2 ;CURRENT BUFFER POINTERS(S.WSIZ: .BLKW 1 ;SIZE OF BUFFER (WORDS)/S.WCNT: .BLKW 1 ;COUNT OF WORDS LEFT IN BUFFER @S.WNBF: .BLKW 1 ;NUMBER OF BUFFERS TO FILL OR NEGATIVE IF CONT- ; INUOUS SAMPLING ?S.WEFN: .BLKW 1 ;0, EFN, OR ADDRESS OF USER COMPLETION ROUTINE13S.WSCR: .BLKW 1 ;SYNCHRONOUS CLOCK ROUTINE ADDRESS.S.WSTS: .BLKW 1 ;FINAL STATUS1S.WSTR: .BLKW 1 ;SCHMITT TRIGGER ROUTINE ADDRESST! ;**NOTE**USER VIRTUAL ADDRESS .S.WEFM: .BLKW 1 ;EVENT FLAG MASK (FROM $CEFI)1S.WEFA: .BLKW 1 ;EVENT FLAG ADDRESS (FROM $CEFI) 5S.WKNT: ;VIRTUAL ADDRESS, EXEC APR6 RELOC AND BIASN1 ;OF KOUNT PARAMETER FOR GTHIST. NOTE: THESER4 ;THREE WORDS OVERLAP S.WMSK, S.WCSR, AND S.WPRI.8S.WMSK: .BLKW 1 ;MASK OF BITS TO SIMULATE ST1 ON (DR11))S.WCSR: .BLKW 1 ;ACTIVE UNIT CSR ADDRESSR0S.WPRI: .BLKW 1 ;DEVICE HARDWARE PRIORITY LEVEL .IF DF FT$MOP .IF NDF M$$MGEM3S.WCLX: ;ACTIVE CLOCK QUEUE--UNMAPPED EXEC LEVELA .IFF ;M$$MGEE2S.WCLX: .BLKW 1 ;ACTIVE CLOCK QUEUE--APR5 MAPPING .ENDC ;M$$MGE2S.WCLQ: .BLKW 1 ;ACTIVE CLOCK QUEUE--TASK MAPPING .ENDC ;FT$MOP*S.WUBX: ;DR11 UNIT CONTROL BLOCK OFFSET ;+ ; FOLLOWING CELLS ARE FOR AD/DA SWEEP ONLYS ;>S.WCHB: .BLKB 1 ;CHANNEL BYTE TO LOAD IN HIGH BYTE OF A/D CSR-S.WCBX: .BLKB 1 ;SAVED ORIGINAL CHANNEL BYTE )S.WICH: .BLKW 1 ;STARTING CHANNEL NUMBERW(S.WCCH: .BLKW 1 ;CURRENT CHANNEL NUMBER5S.WHCH: .BLKW 1 ;HIGHEST CHANNEL ACCESSED THIS SWEEPE7S.WCHX: .BLKW 1 ;NUMBER OF CHANNELS (RESET FOR S.WNCH)Q2S.WNCH: .BLKW 1 ;NUMBER OF CHANNELS (DECREMENTED),S.WMXC: .BLKW 1 ;MAXIMUM NUMBER OF CHANNELS#S.WCHI: .BLKW 1 ;CHANNEL INCREMENTL0S.WGNW: .BLKW 1 ;DATA WORD FOR GAIN INFORMATION0S.WUNT: .BLKW 1 ;NUMBER OF UNITS ON THIS DEVICE0S.WAUA: .BLKW 1 ;OFFSET TO ACTIVE UCB. (ADD R4) S.WUCB: ;THE UCB'S START HERE;+"; UCB - UNIT CONTROL BLOCK OFFSETS; (; UCB'S ARE USED BY THE ADSWP, AND DASWP,; THE DR11 UCB HAS U.FLG, U.IVEC, AND U.OVEC;.;-.=0 U.FLG: .BLKW 1 ;UNIT FLAGSO%U.IVEC: ;DR11 INPUT VECTOR ADDRESS U.VEC: .BLKW 1 ;VECTOR ADDRESSB&U.OVEC: ;DR11 OUTPUT VECTOR ADDRESS!U.CSR: .BLKW 1 ;CSR OF THIS UNIT.-U.MAXC: .BLKW 1 ;MAX # CHANNELS ON THIS UNITU.LGTH=.;+; OFFSETS INTO IBUF ARRAYI;-.=0 "IB.IOS: .BLKW 2 ;I/O STATUS BLOCK#IB.USQ: .BLKW 5 ;USER BUFFER QUEUE%IB.DVQ: .BLKW 5 ;DEVICE BUFFER QUEUES#IB.NBF: .BLKW 1 ;NUMBER OF BUFFERSA$IB.BUF: ;BEGINNING OF BUFFER LIST C;+4; FLAGS IN THE SWEEP CONTROL BLOCK (SWB) WORD S.WFLG;-7S$WAST = 100000 ;AST REQUEST FOR THIS SWEEP (SIGN BIT)C;(FREE) = 40000 ; ;(FREE) = 20000 ;R;(FREE) = 10000 ;W;(FREE) = 4000 ;.'S$WTSS = 2000 ;TIME-STAMPED SAMPLINGS4S$WNOV = 1000 ;NON-CLOCK OVERFLOW DRIVEN SAMPLING&S$WEXT = 400 ;EXTERNAL START (ST1);(FREE) = 200 ;K;(FREE) = 100 ;U1S$CTRL = 40 ;INTERRUPTS BY CONTROL LINE (DR11-K) +S$WAGR = 5 ;AUTO GAIN RANGING (AD11)I9S$WSIB = 2 ;SET INTENSIFY BIT AFTER X/Y PAIR (AA11)B4S$WEZB = 1 ;EXTERNAL EVENT TIME FROM ZERO BASE ; MODE (HISTOGRAM)3S$WSCW = 1 ;SCOPE CONTROL WORD PRESENT (AA11)(7S$WSTZ = 1 ;ST2 FIRING ZEROES COUNTER (HISTOGRAM) @S$WUSR = S$WTSS!S$WNOV!S$WEXT!S$CTRL!7 ;FLAGS WHICH USER MAY SET% ;(N O T E: SOME FLAGS IN LOW BYTES ; ARE NOT USED AT PRESENT);+; FLAGS IN WORD S.WFL2;-,S$WACT = 100000 ;SWEEP IS ACTIVE (SIGN BIT)/S$WDLY = 40000 ;SWEEP REQUESTS DELAY (LDELAY) +S$WDIF = 20000 ;DIFFERENTIAL INPUT (AD11)1/S$WEFN = 10000 ;EFN SETTING AS OPPOSED TO ASTR#S$WSTP = 4000 ;REQUESTED TO STOPS'S$WSEB = 2000 ;STOP AT END OF BUFFER(-S$WACA = 1000 ;ABSOLUTE CHANNEL ADDRESSINGN6S$WSST = 400 ;SIMULATE00X2ƒY4ƒZ9ƒ´cÚµcÛ¶c�·c›’ SCHMITT TRIGGER (DIGO SETS)9S$WA$D = 200 ;THIS IS A/D SWEEP BLOCK (MUST BE 200!!)L(S$WADC = 100 ;SETADC HAS BEEN CALLED"S$WFRK = 40 ;FORK IN PROGRESS0S$WIOF = 20 ;INPUT (1) OR OUTPUT (0) (DR11)BS$W2CL = ^C ;CLEAR ALL BITS BUT THESE;+; FLAGS IN U.FLG;-9UF$ACT = 100000 ;UNIT WILL BE/IS ACTIVE IN CURRENT SWEEP;5UF$CIN = 40000 ;UNIT IS CONNECT TO INTERRUPT VECTORF%UF$AMK = 20000 ;AD11 HAS AM11 ON ITL D;+; FLAGS IN .KAFLG AND .KBFLG;-!K$ACTV = 100000 ;CLOCK IS ACTIVE #K$ADLY = 40000 ;DELAY IN PROGRESS "K$AGTD = 20000 ;GTHIST IS ACTIVE2K$ACIN = 10000 ;CLOCK IS CONNECTED TO INTERRUPTS(K$ACAC = 4000 ;CLOCKA HAS BEEN CALLED1K$AOVF = 2000 ;CLOCK A HAS OVERFLOWED (GTHIST)>6K$AFRK = 1000 ;FORK IN PROGRESS FOR CLOCK (MULTIPLE ;CLOCK DRIVEN SWEEPS ONLY) .PSECTI .MACRO KSWDF$ .ENDM .ENDM .ENDIS CONNECT TO INTERRUPT VECTORF%UF$AMK = 20000 ;AD11 HAS AM11 ON ITL D;+; FLAGS IN .KAFLG AND .KBFLG) .TITLE KCOMM COMMON RO DATA FOR K-SERIES .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; ; VERSION 01; B. SCHREIBER 19-AUG-77;EE; THIS MODULE CONTAINS THE READ-ONLY DATA BASE AND GLOBAL DEFINITIONS  E .SBTTL GLOBAL DEFINITIONS;+; GLOBAL DEFINITIONS;LB; THE FOLLOWING DEFINITIONS MAY BE ALTERED BY THE USER BY EDITTING ; THIS FILE:; :; ADTMOV THE VALUE RETURNED IN THE BUFFER WHEN THERE IS AN5; A/D TIMEOUT (THE A/D DID NOT CONVERT FAST ENOUGH).;E<; ADERRV THE VALUE RETURNED IN THE BUFFER WHEN THE A/D ERROR4; FLAG IS RAISED ON A CONVERSION (USUALLY INDICATES/; THAT CONVERSIONS ARE OCCURRING TOO RAPIDLY).7;E8; TMO$AD THE TIMEOUT COUNT USED WHEN WAITING FOR THE A/D5; TO CONVERT. IF YOU SEE A LOT OF "ADTMOV"'S IN THE 0; BUFFER, YOU MAY WISH TO INCREASE THIS NUMBER.;A;- .PSECT .KSCT02$KBASE:: ;LABEL TO DEFINE BEGINNING OF DATA BASE$ADTMOV == 177776 ;A/D TIMEOUT VALUE"ADERRV == 177777 ;A/D ERROR VALUE!TMO$AD == 25. ;A/D TIMEOUT COUNTE7I$BFVW == 171717 ;'IBUF' VALIDATION WORD (TO DETERMINE  ; IF SETIBF WAS CALLED) Y .SBTTL READ-ONLY DATA BASEN; ; A ZERO WORDA;L.ZEROW::.WORD 0D.NEG1:: .WORD 177777.ONE:: .WORD 1 .IF DF M$$MGE;R@; APR5 RELOCATION FACTOR TO ADD TO ADDRESSES AT TASK LEVEL SO WE4; MAY REFERENCE THEM AT EXEC LEVEL ON MAPPED SYSTEM.;AB$KRLC5::.WORD 120000-<$KBASE & 177700> ;VALUE TO BE ADDED FOR APR5 .ENDC .ENDADERRV == 177777 ;A/D ERROR VALUE!TMO$AD == 25. ;A/D TIMEOUT COUNTE7I$BFVW == 171717 ;'IBUF' VALIDATION WORD (TO DETERMINE  ; IF SETIBF WAS CALLED) Y .SBTTL READ-ONLY DATA BASEN; ; A ZERO WORDA;L.ZEROW::.WORD 0D.NEG1:: .WORD 177777.ONE:: .WORD 1 .IF DF M$$MGE;R2 .TITLE KCVADF CONVERT A/D INPUT TO FLOATING POINT .IDENT /M01.01/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.B;E>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES T00Z:ƒp?ƒñ‚t÷tø tþfDATAO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 22-SEP-77;E; B. SCHREIBER 13-JUN-78; 8; BLS054 -- CONVERT THE ARGUMENT RATHER THAN ITS ADDRESS; ; FROM THE LPS ROUTINE CVSWG; <; THIS ROUTINE CONVERTS A/D INPUT TO A FLOATING POINT NUMBER;M; TABLE OF GAIN VALUES;UGAIN: .BYTE 6,4,2,0  1 .SBTTL CVADF CONVERT A/D INPUT TO FLOATING POINTB;+/; ROUTINE TO CONVERT SWITCH GAIN TO FLOATING PT ;R; CVADF (IVAL, [VAL])S;R; IVAL = SWITCH GAIN VALUE;E; BITS 15-12 GAIN ; 0=GAIN1E ; 1=GAIN4 ; 2=GAIN16 ; 3=GAIN64;2; BITS 11-0 VALUE ALWAYS PLUS-;-;+; INPUT R5 = ^ TO ARG LIST (FORTRAN FORMAT)H;I; OUTPUT VALUE IN R0-R1E;S; USE VAR=(64*VALUE)/GAINR;-CVADF:: MOV @2(R5),R2 ;GET IVALN% BMI 40$ ; IF MINUS HANDLE SPECIALLYU MOV R2,R1 ;ISOLATE GAIN, BIC #147777,R2 ;D BIC R2,R1 ;N CLR R0 ;CLEAR HIGH ORDER SWAB R2 ; PICK UP GAIN*1 ASR R2  ASR R2P ASR R2  ASR R2A( MOVB GAIN(R2),R2 ; GET NUMBER OF SHIFTS BEQ 60$ ; IF =0 THEN DONE 20$: ASL R1  ROL R0 DEC R2N BNE 20$ BR 60$2$40$: MOV #-1,R0 ; SET A MINUS PARAM MOV R2,R1;+(; ROUTINE TO FLOAT A DOUBLE WORD INTEGER; INPUT R0 -- HIGH ORDER; R1 -- LOW ORDER;I; OUTPUT R0-R1 FLOATING VALUE; R2,R3 DISTROYED;-60$: MOV R1,R3 ;FIND 0 FIRSTR CLR R2 ; CLEAR EXPONENT WORD BIS R0,R3/ BEQ 140$ ; IF ZERO SET R0=0 AND R1=0 AND R2=02 TST R0 ;TEST MINUS BPL 80$ ;R3 BIS #400,R2 ;IF MINUS SET SIGN BIT IN EXPON. WORDR$ NEG R0 ;2'S COMPLEMENT DOUBLE WORD NEG R1A SBC R0 ;(80$: BISB #240,R2 ;SET HIGHEST EXPONENT100$: ASL R1 ;NORMALIZE NUMBERM* ; BY SEARCHING FOR C BIT (HIDDEN NORM) ROL R0R BCS 120$0 DEC R2 ;DECREASE EXPONENTO BR 100$ ;U+120$: CLRB R1 ; SET UP R0,R1 FROM R2,R0,R1D BISB R0,R1V SWAB R1 CLRB R0 BISB R2,R0; SWAB R0 SWAB R2 ASR R2, ROR R01 ROR R1 #140$: CMPB (R5),#2 ;TWO ARGUMENTS?T' BNE 160$ ;IF NE NO--NO VALUE TO STORE, MOV 4(R5),R2 ;YES--GET ADDRESSO$ MOV R0,(R2)+ ;STORE HIGH ORDER PART# MOV R1,(R2) ;STORE LOW ORDER PARTB160$: RETURN ; .ENDXPONENT100$: ASL R1 ;NORMALIZE NUMBERM* ; BY SEARCHING FOR C BIT (HIDDEN/ .TITLE KDIGO SET DIGITAL INPUT START FOR SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 5-SEP-77 ;E;; THIS ROUTINE ENABLES A DR11 INPUT BIT(S) TO START A SWEEPG;T; SYSTEM MACRO CALLS;T .MCALL KSWDF$, KDVDF$, CINT$S KSWDF$A KDVDF$  M* .SBTTL DIGO SET DIGITAL INPUT START EVENT;++; DIGO -- SET DR11 INPUT BIT TO START SWEEP ;I; CALLING SEQUENCE:C;T"; CALL DIGO (IUNIT, MASK, [KOUNT]);I ; INPUTS:R;O'; IUNIT DR11 UNIT NUMBER (DEFAULT IS 0)O ; MASK MASK TO SELECT START BITS/; IF DEFAULTED IMMEDIATELY SIMULATE ST1 FIRINGD(; IF ZERO, CANCEL PENDING DIGITAL START7; KOUNT RECEIVES THE VALUE OF THE 16-BIT SOFTWARE CLOCK ; IF MASK IS DEFAUL00pBƒ±Iƒ9ƒ´cÚµcÛ¶c�·c›’TED.;M ; OUTPUTS:;T ; DR11 IS ENABLED TO START SWEEP;K;-4DIGO:: CALL .K.PAA ;VALIDATE ARGS AND PUSH ON STACK .WORD 3 ;3 ARGS- .WORD 0 BCS 100$ ;IF CS ERROR ! MOV (SP)+,R0 ;GET UNIT # ADDRESSA BNE 20$ ;IF GIVEN GO MOV #.ZEROW,R0 ;ELSE USE 0 20$: MOV (R0),R0 ;GET UNIT #  ASL R0 ;CONVERT TO WORD INDEXR MOV (SP)+,R1 ;GET MASK ADDRESSL" BEQ 200$ ;IF EQ SIMULATE ST1 NOW .IF DF N$DR11# MOV .DRUTB(R0),R4 ;GET SWB ADDRESSO" CMP R4,#DRSW0 ;IS IT A LEGAL SWB? BLO 120$ ;IF LO NO CMP R4,#.DRUTB ;MAYBE...  BHIS 120$ ;IF HIS NO$ MOV (R1),S.WMSK(R4) ;READ MASK BITS# BEQ 300$ ;IF EQ STOP DIGO REQUEST3;GB; WE MUST NOW CONNECT TO INTERRUPTS AND ENABLE FOR INPUT INTERRUPT;S TST S.WFL2(R4) ;ACTIVE SWEEP? BPL 40$ ;IF PL NO 5 BIT #S$WNOV,S.WFLG(R4) ;YES--IS IT INTERRUPT DRIVEN?O BEQ 40$ ;IF EQ NOP* BIT #S$WIOF,S.WFL2(R4) ;YES--IS IT INPUT?" BNE 60$ ;IF NE YES--SKIP CONNECT40$: MOV R4,R3 ;POINT TO SWBD) SUB #4,R3 ;BACK UP TO INTERRUPT ROUTINE8 BIS #S$WSST,S.WFL2(R4) ;FLAG SIMULATING SCHMITT TRIGGER= CINT$S S.WUBX+U.IVEC(R4),#$KBASE,R3,#.DREDI,S.WPRI(R4) ;CINT # BCS 320$ ;IF CS COULD NOT CONNECTM60$: ;REF LABEL .IF DF M$$MGE5 MOV #.DRIN3+120000-<$KBASE&177700>,-2(R4) ;PT TO ISR? .IFF ;M$$MGEL! MOV #.DRIN3,-2(R4) ;POINT TO ISRS .ENDC ;M$$MGE8 BIS #DI$ENB,@S.WCSR(R4) ;SET INPUT INTERRUPT ENABLE BIT .ENDC ;N$DR11$80$: TST (SP)+ ;SKIP KOUNT ARGUMENT 100$: RETURN;W; ILLEGAL UNIT;C&120$: CMP (SP)+,(SP)+ ;CLEAN THE STACK RETURN4;F; SIMULATE SCHMITT TRIGGER NOW;N200$: ;REF LABEL, .IF NDF FT$MOPS/ MOV .KASWB,R4 ;GET SWB ADDRESS OF ACTIVE SWEEPC BEQ 80$ ;NOTHING TO DO IF ZERO- BIT #S$WEXT,S.WFLG(R4) ;WANT EXTERNAL START?2 BEQ 80$ ;IF EQ NO.% MTPS #PR6 ;YES--LOCK OUT INTERRUPTSI. CALL @S.WSTR(R4) ;;;CALL SCHMITT TRIG ROUTINE/ BIC #S$WEXT,S.WFLG(R4) ;;;CLEAR EXT START FLAGC .IFF ;FT$MOPT1 MOV #.KLQUU-S.WCLQ,R4 ;POINT TO CLOCK QUEUE HEADL MTPS #PR6 ;LOCK OUT INTERRUPTS'210$: MOV S.WCLQ(R4),R4 ;;;LINK TO NEXTU BEQ 220$ ;;;IF EQ ALL DONE/ BIT #S$WEXT,S.WFLG(R4) ;;;WANT EXTERNAL START?. BEQ 210$ ;;;IF EQ NO--IGNORE3 CALL @S.WSTR(R4) ;;;YES--CALL SCHMITT TRIG ROUTINE$/ BIC #S$WEXT,S.WFLG(R4) ;;;CLEAR EXT START FLAG  BR 210$ ;;;CONTINUE  .ENDC ;FT$MOP'220$: MOV (SP)+,R3 ;;;GET KOUNT ADDRESS  BEQ 280$ ;;;IF EQ NOT GIVENL .IF DF K$W11K: MOV .CLK16,(R3) ;;;YES--STORE 16 BIT CLOCK AT TIME OF ST1 .IFF ;K$W11KH# CLR (R3) ;;;NO CLOCK--CLEAR KOUNT .ENDC ;K$W11K280$: ;;;REF LABELB .IF DF K$$W11) MOV .KACSR,R3 ;;;GET CLOCK A CSR ADDRESSE= BIC #KA$STF!KA$STI!KA$STE,(R3) ;;;DISABLE CLOCK SCHMITT TRIG 1 BIT #KA$ENB,(R3) ;;;SEE IF CLOCK ALREADY ENABLEDW* BNE 290$ ;;;IF NE YES??--DON'T RE-ARM IT" INC (R3) ;;;SET CLOCK A'COUNTING .ENDC ;K$$W11"290$: MTPS #0 ;;;ALLOW INTERRUPTS RETURN ;DONE;F; KILL PENDING REQUEST;R9300$: BIT #S$WSST,S.WFL2(R4) ;SIMULATING SCHMITT TRIGGER?1 BEQ 80$ ;IF EQ NO--JUST RETURN-320$: BIC #S$WSST,S.WFL2(R4) ;YES--WE WERE...A6 BIC #DI$ENB,@S.WCSR(R4) ;CLEAR INPUT INTERRUPT ENABLE BR 80$ ;RETURN .ENDKA$STI!KA$STE,(R3) ;;;DISABLE CLOCK SCHMITT TRIG 1 BIT #KA$ENB,(R3) ;;;SEE IF CLOCK ALREADY ENABLEDW* BNE 290$ ;;;IF NE YES??--DON'T RE-ARM IT" INC (R3) ;;;SET CLOCK A'COUNTING .ENDC ;K$$W11"290$: MTPS #0 ;;;ALLOW INTERRUPTS RETURN ;DONE;F; KILL PENDING REQUEST;R9300$: BIT #S$WSST,S.WFL2(R4) ;SIMULATING SCHMITT TRIGGER?1 BEQ 80$ ;IF EQ NO--JUST RETURN-320$: BIC #S$WSST,S.WF" .TITLE KDISWP DIGITAL INPUT SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE 00±Jƒ·Pƒñ‚t÷tø tþfDATA TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 11-SEP-77;E@; THIS MODULE INITIATES A DIGITAL INPUT SWEEP THROUGH THE DR11-K;H; SYSTEM MACRO CALLS;E .MCALL KSWDF$ KSWDF$  T' .SBTTL DISWP DIGITAL INPUT SWEEP STARTC;+.; DISWP -- START DIGITAL INPUT SWEEP ON DR11-K;C; CALLING SEQUENCE:I;A;; CALL DISWP (IBUF,LBUF,NBUF,MODE,IPRSET,IEFN,LDELAY,IUNIT)I;N ; INPUTS:O;; SEE DOCUMENTATIONR;O ; OUTPUTS:;H(; SWEEP IS STARTED UNLESS ERROR DETECTED;Q;-"DISWP:: MOV R5,-(SP) ;SAVE ARG PTR& CALL .K.PAA ;VALIDATE ARGS AND STACK .WORD 8. ;EIGHT ARGS# .WORD 300 ;MASK FOR REQUIRED ARGSH BCC 10$ ;IF CC CONTINUEC, MOV #-,R3 ;ELSE SET ERROR CODE CLR R4 ;IN CASE MULT SWEEPSE& BR 600$ ;STORE ERROR CODE AND RETURN410$: MOV 16(SP),R0 ;REACH DOWN AND GET IUNIT ADDRESS BNE 20$ ;IF NOT DEFAULTED GO MOV #.ZEROW,R0 ;ELSE USE UNIT 0"20$: MOV (R0),R0 ;GET UNIT NUMBER ASL R0 ;CONVERT TO INDEX3 MOV .DRUTB(R0),R4 ;GET SWEEP CONTROL BLOCK ADDRESS ! CMP R4,#DRSW0 ;ENSURE A REAL SWBK BLO 200$ ;IF LO ERRORS CMP R4,#.DRUTB ;CHECK HIGH ENDO BHIS 200$ ;IF HIS ERRORA. CALL .K.SET ;SET UP SWEEP BLOCK AND VALIDATE BCS 200$ ;IF CS ERROR DETECTED$ CALL .K.DLY ;CHECK DELAY PARAMETER BCS 300$ ;IF CS ERRORE" TST (SP)+ ;POP OFF IUNIT ADDRESS0 BIS #S$WIOF,S.WFL2(R4) ;FLAG THAT THIS IS INPUT( CALL .K.STB ;SET UP BUFFER INFORMATION+ BCS 400$ ;IF CS ILLEGAL NUMBER OF BUFFERSO8 BIT #S$WNOV,S.WFLG(R4) ;IS THIS INTERRUPT DRIVEN SWEEP?- BEQ 60$ ;IF EQ NO--SYNCHRONOUS CLOCK DRIVEN) CALL .DRCNI ;CONNECT DR11 TO INTERRUPTSC BCS 300$ ;IF CS ERROR$% CALL .DRSTR ;ENABLE DR11 INTERRUPTS  BR 80$ ;FINISH UPA;; SYNCRHONOUS CLOCK SWEEP START;L60$: ;REF LABEL .IF DF K$$W11/ CALL .DRSSC ;SELECT SYNCHRONOUS CLOCK ROUTINED& CALL .KLQIN ;INSERT INTO CLOCK QUEUE* CALL .KWCNI ;CONNECT CLOCK AND ENABLE IT BCS 300$ ;IF CS ERROR; .IFF ;K$$W11B5 MOV #-,R3 ;SET CLOCK OPTION NOT PRESENTT BR 500$ .ENDC ;K$$W11/80$: BIS #S$WACT,S.WFL2(R4) ;FLAG SWB IS ACTIVEC MOV (SP)+,R5 ;RESTORE ARG PTR RETURNF; ; ERROR RETURNSS; ; BAD PARAMETERS;T&200$: MOV #-,R3 ;SET CODE BR 500$;E; RESOURCE IN USE ;R&300$: MOV #-,R3 ;SET CODE BR 500$;Y; BAD BUFFER SPECIFICATION; 400$: MOV #-,R3 E2500$: MOV R5,SP ;RESTORE PRE-.K.PAA STACK POINTER600$:F, CALL .KLQRM ;REMOVE FROM QUEUE IF INSERTED# MOV #1,R4 ;STORE IN 1ST PARAMETERN MOV (SP)+,R5 ;RESTORE ARG PTR% CALLR .IESTO ;STORE CODE AND RETURN  .ENDC MOV (SP)+,R5 ;RESTORE ARG PTR RETURNF; ; ERROR RETURNSS; ; BAD PARAMETERS;T&200$: # .TITLE KDOSWP DIGITAL OUTPUT SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 11-SEP-77;EA; THIS MODULE INITIATES A DIGITAL OUTPUT SWEEP THROUGH THE DR11-KT;S; SYST00·Rƒ¸Wƒ9ƒ´cÚµcÛ¶c�·c›’EM MACRO CALLS; .MCALL KSWDF$ KSWDF$O A( .SBTTL DOSWP DIGITAL OUTPUT SWEEP START;+/; DOSWP -- START DIGITAL OUTPUT SWEEP ON DR11-KC;G; CALLING SEQUENCE:A;S;; CALL DOSWP (IBUF,LBUF,NBUF,MODE,IPRSET,IEFN,LDELAY,IUNIT)N;O ; INPUTS:;; SEE DOCUMENTATIONO;B ; OUTPUTS:;S(; SWEEP IS STARTED UNLESS ERROR DETECTED;M;-"DOSWP:: MOV R5,-(SP) ;SAVE ARG PTR& CALL .K.PAA ;VALIDATE ARGS AND STACK .WORD 8. ;EIGHT ARGS# .WORD 300 ;MASK FOR REQUIRED ARGSD BCC 10$ ;IF CC OKM0 MOV #-,R3 ;ELSE SET BAD PARAMETERS CLR R4 ;IN CASE MULT SWEEPSE$ BR 600$ ;STORE ERROR CODE AND EXIT410$: MOV 16(SP),R0 ;REACH DOWN AND GET IUNIT ADDRESS BNE 20$ ;IF NOT DEFAULTED GO MOV #.ZEROW,R0 ;ELSE USE UNIT 0"20$: MOV (R0),R0 ;GET UNIT NUMBER ASL R0 ;CONVERT TO INDEX3 MOV .DRUTB(R0),R4 ;GET SWEEP CONTROL BLOCK ADDRESSW! CMP R4,#DRSW0 ;ENSURE A REAL SWBL BLO 200$ ;IF LO ERRORA CMP R4,#.DRUTB ;CHECK HIGH END BHIS 200$ ;IF HIS ERRORR. CALL .K.SET ;SET UP SWEEP BLOCK AND VALIDATE BCS 200$ ;IF CS ERROR DETECTED$ CALL .K.DLY ;CHECK DELAY PARAMETER BCS 300$ ;IF CS ERROR " TST (SP)+ ;POP OFF IUNIT ADDRESS1 BIC #S$WIOF,S.WFL2(R4) ;FLAG THAT THIS IS OUTPUT ( CALL .K.STB ;SET UP BUFFER INFORMATION+ BCS 400$ ;IF CS ILLEGAL NUMBER OF BUFFERSV8 BIT #S$WNOV,S.WFLG(R4) ;IS THIS INTERRUPT DRIVEN SWEEP?- BEQ 60$ ;IF EQ NO--SYNCHRONOUS CLOCK DRIVENB) CALL .DRCNI ;CONNECT DR11 TO INTERRUPTSE BCS 300$ ;IF CS ERROR % CALL .DRSTR ;ENABLE DR11 INTERRUPTSW BR 80$ ;GO FINISH UP;S; SYNCRHONOUS CLOCK SWEEP STARTL;K60$: .IF DF K$$W11/ CALL .DRSSC ;SELECT SYNCHRONOUS CLOCK ROUTINEF& CALL .KLQIN ;INSERT INTO CLOCK QUEUE* CALL .KWCNI ;CONNECT CLOCK AND ENABLE IT BCS 300$ ;IF CS ERROR .IFF ;K$$W11 5 MOV #-,R3 ;SET CLOCK OPTION NOT PRESENTH BR 500$ ;RETURN STATUS .ENDC ;K$$W11080$: BIS #S$WACT,S.WFL2(R4) ;FLAG UNIT IS ACTIVE MOV (SP)+,R5 ;RESTORE ARG PTR RETURN ;O; ERROR RETURNS ;A; BAD PARAMETERS;200$: MOV #-,R3 BR 500$;L; RESOURCE IN USEK;0300$: MOV #-,R3 BR 500$;C; BAD BUFFER SPECIFICATION;C400$: MOV #-,R3K2500$: MOV R5,SP ;RESTORE PRE-.K.PAA STACK POINTER1600$: CALL .KLQRM ;REMOVE FROM QUEUE IF INSERTED# MOV #1,R4 ;STORE IN 1ST ARGT MOV (SP)+,R5 ;RESTORE ARG PTR CALLR .IESTO ;STORE AND RETURN .END$WACT,S.WFL2(R4) ;FLAG UNIT IS ACTIVE MOV (SP)+,R5 ;RESTORE ARG PTR RETURN ;O; ERROR RETURNS ;A; BAD PARAMETERS;( .TITLE KDSCAD DISCONNECT A/D CONVERTERS .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 26-SEP-77;E=; THIS ROUTINE DISCONNECTS THE A/D CONVERTERS FROM INTERRUPTSE; ; SYSTEM MACRO CALLS;T .MCALL KSWDF$,CINT$SO KSWDF$T E( .SBTTL .DSCAD DISCONNECT A/D CONVERTERS;+5; .DSCAD -- DISCONNECT A/D CONVERTERS FROM INTERRUPTSI;U8; THIS ROUTINE IS CALLED AT AST LEVEL WHEN IT IS TIME TO:; DISCONNECT THE A/D CONVERTERS FROM THE INTERRUPT SYSTEM.;O ; INPUTS:O;H; R4 POINTS TO SWB ; R3,R2 FREE;A ; OUTPUTS:; 5; ALL A/D CONVERTERS THAT ARE CONNECTED TO INTERRUPTSS; ARE DISCONNECTED.E; ;-&.DSCAD::MOV R4,R3 ;GET POINTER TO SWB# ADD #S.WUCB,R3 ;POINT TO 00¸Zƒ¹[ƒº_ƒt÷tø tþfDATAFIRST UCBC' MOV S.WUNT(R4),R2 ;GET NUMBER OF UNITST920$: BIT #UF$CIN,U.FLG(R3) ;UNIT CONNECTED TO INTERRUPTS?C BEQ 40$ ;NO--LOOK AT NEXTR1 CINT$S U.VEC(R3),,#0 ;DISCONNECT FROM INTERRUPTS ) BIC #UF$CIN,U.FLG(R3) ;FLAG DISCONNECTEDT!40$: ADD #U.LGTH,R3 ;LOOK AT NEXTT DEC R2 ;SEE IF MORE TO DO BGT 20$ ;IF GT YES RETURN ;ALL DONEP .END; ALL A/D CONVERTERS THAT ARE CONNECTED TO INTERRUPTSS; ARE DISCONNECTED.E; ;-&.DSCAD::MOV R4,R3 ;GET POINTER TO SWB# ADD #S.WUCB,R3 ;POINT TO  .TITLE KDSDGO DISABLE DIGO .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 1-OCT-77 ;E>; THIS ROUTINE IS CALLED TO DISABLE DR11 INPUT INTERRUPTS FROMA; UNITS WHICH ARE SIMULATING START EVENTS WHEN A REAL ST1 OCCURS.A;A; SYSTEM MACRO CALLS; .MCALL KSWDF$,KDVDF$N KSWDF$  KDVDF$O .PSECT .KSCT1 C& .SBTTL .DSDGO DISABLE DIGO INTERRUPTS;+#; .DSDGO -- DISABLE DIGO INTERRUPTS ;I=; THIS ROUTINE IS CALLED BY THE KW11-K INTERRUPT ROUTINE WHEN <; A ST1 HAS OCCURRED. WE THEN LOOK AT ALL THE DR11'S TO SEE;; IF WE ARE SIMULATING A SCHMITT TRIGGER ON ANY, AND IF SO,7; DISABLE INPUT INTERRUPTS.L;T ; INPUTS:R;I; NONE;U ; OUTPUTS:;T8; DR11'S WHICH WERE SET TO SIMULATE SCHMITT TRIGGERS ARE ; DISABLED.Y;M;-.DSDGO::MOV R2,-(SP) ;;;SAVE R2N7 MOV .DRXPT,R3 ;;;GET POINTER TO DR11 SWB POINTER TABLEO.20$: MOV (R3)+,R2 ;;;GET NEXT DR11 SWB ADDRESS BEQ 40$ ;;;IF EQ ALL DONEH6 BIT #S$WSST,S.WFL2(R2) ;;;SIMULATING SCHMITT TRIGGER? BEQ 20$ ;;;IF EQ NOD* BIC #S$WSST,S.WFL2(R2) ;;;YES--CLEAR FLAG4 BIC #DI$ENB,@S.WCSR(R2) ;;;DISABLE INPUT INTERRUPTS BR 20$ ;;;LOOK AT MORE40$: MOV (SP)+,R2 ;;;RESTORE R2O RETURN  .END;T8; DR11'S WHICH W' .TITLE KDVDF K-SERIES HARDWARE DEFINES .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 27-JUN-77;E"; THIS MODULE DEFINES THE CSR BITS Y .MACRO KDVDF$ .IF NDF L$$SI1 ;+/; KA$XXX - KW11-K CLOCK 'A' CSR BIT DEFINITIONSA;-(KA$STF = 100000 ;ST1 EVENT HAS OCCURRED,KA$STI = 40000 ;ST1 EVENT INTERRUPT ENABLE2KA$STE = 20000 ;ST1 EVENT ENABLES KA$ENA (ENABLE ; COUNTER)(KA$RIM = 0400 ;REPEATED INTERVAL MODE*KA$EEM = 1000 ;EXTERNAL EVENT TIME MODE/KA$EZB = 1400 ;EXTERNAL EVENT TIME FROM ZEROM ; BASE MODE3KA$MDF = 200 ;OVERFLOW OR COUNTER TO BUFFER XFR- ; HAS OCCURREDD,KA$MFE = 100 ;MODE FLAG INTERRUPT ENABLE3KA$OVF = 40 ;00ºbƒWƒ9ƒ´cÚµcÛ¶c�·c›’COUNTER 'A' OVERFLOW HAS OCCURRED *;KA$RAT = 16 ;MASK FOR CLOCK 'A' RATE"KA$ENB = 1 ;ENABLE CLOCK 'A';+.; KB$XXX - KW11-K CLOCK 'B' CSR BIT DEFINTIONS;-3KB$OVF = 200 ;COUNTER 'B' OVERFLOW HAS OCCURRED +KB$OIE = 100 ;OVERFLOW INTERRUPT ENABLE0$KB$B2A = 40 ;FEED B TO A ENABLE&;KB$ATO = 20 ;AUTO INCREMENT MODE*;KB$RAT = 16 ;MASK FOR CLOCK 'B' RATE"KB$ENB = 1 ;CLOCK 'B' ENABLE;+3; AD$XXX - AD11-K A/D CONVERTOR CSR BIT DEFINITIONSE;-AD$ERR = 100000 ;ERROR FLAGAD$DON = 200 ;DONE FLAG "AD$ENB = 100 ;INTERRUPT ENABLE7AD$OVE = 40 ;KW11-K OVERFLOW STARTS A/D CONVERSION 9AD$ESE = 20 ;EXTERNAL EVENT INITIATES A/D CONVERSIONE%AD$GO = 1 ;START A/D CONVERSION ;+4; DO$XXX - DR11-K DIGITAL OUTPUT CSR BIT DEFINITIONS4; DI$XXX - DR11-K DIGITAL INPUT CSR BIT DEFINITIONS;-7DO$FLG = 100000 ;EXTERNAL DATA ACCEPTED ON EXT. DEVICEL)DO$ENB = 40000 ;ENABLE OUTPUT INTERRUPT 2DO$BUF = 4 ;OFFSET FROM CSR TO OUTPUT BUFFER6DI$FLG = 200 ;EXTERNAL DATA READY FROM EXT. DEVICE(DI$ENB = 100 ;ENABLE INPUT INTERRUPT1DI$BUF = 2 ;OFFSET FROM CSR TO INPUT BUFFER   .IF NDF L$$PS1I;+3; DA$XXX - AA11-K D/A CONVERTOR CSR BIT DEFINITIONSS;-4DA$ERA = 10000 ;ERASE DATA IN STORAGE OSCILLOSCOPE!DA$WTU = 4000 ;WRITE THRU MODEUDA$STO = 2000 ;STORE-2DA$BT9 = 1000 ;BIT 9 (DIGITAL SIGNAL AVAILABLE)DA$RDY = 200 ;READY #;DA$ENB = 100 ;INTERRUPT ENABLE DA$EXD = 20 ;EXTERNAL DELAYDA$MDE = 14 ;MASK FOR MODEN'DA$FIE = 2 ;FAST INTENSIFY ENABLE 4DA$INT = 1 ;GENERATE INTENSIFY PULSE IN MODE 09DA$SCO=DA$ERA!DA$WTU!DA$STO$DA$BT9!DA$MDE!DA$FIE!DA$INT ; ( ;BITS LEGAL FOR USER TO SET IN SCOPE ;CONTROL WORDE .IFF ;L$$PS1S4DA$ERA = 10000 ;ERASE DATA IN STORAGE OSCILLOSCOPE(DA$WTU = 4000 ;SET WRITE THROUGH MODEDA$STO = 2000 ;STORET DA$CHN = 1000 ;CHANNEL SELECT DA$COL = 400 ;COLOR SELECTDA$RDY = 200 ;READY=#;DA$ENB = 100 ;INTERRUPT ENABLE DA$EXD = 20 ;EXTERNAL DELAYDA$MDE = 14 ;MODE(DA$FIE = 2 ;FAST INTENSIFY ENABLEDA$INT = 1 ;INTENSIFYR@DA$SCO = DA$ERA!DA$WTU!DA$STO!DA$CHN!DA$COL!DA$MDE!DA$FIE!DA$INT* ;BITS LEGAL FOR USER TO SET WITH SCOPE .ENDC ;L$$PS1 .IFF ;L$$SI1  .IF DF Q$$BUS;+!; KWV11 CLOCK CSR BIT DEFINITIONS ;-'KA$STF = 100000 ;ST2 EVENT HAS OCCUREDA,KA$STI = 40000 ;ST2 EVENT INTERRUPT ENABLE)KA$STE = 20000 ;ST2 EVENT ENABLES CLOCK=:KA$MDF = 200 ;OVERFLOW OR CTR TO BUFFR XFR HAS OCCURED'KA$OVF = 200 ;OVERFLOW HAS OCCURREDF.KA$IOO = 100 ;INTERRUPT ON OVERFLOW ENABLE"KA$MFE = 100 ;MODE FLAG ENABLE&;KA$RAT = 30 ;MASK FOR CLOCK RATE(KA$RIM = 2 ;REPEATED INTERVAL MODE*KA$EEM = 4 ;EXTERNAL EVENT TIME MODE9KA$EZB = 6 ;EXTERNAL EVENT TIME FROM ZERO BASE MODENKA$ENB = 1 ;ENABLE CLOCK;+1; AD$XXX - ADV11 A/D CONVERTOR CSR BIT DEFINTIONS ;-AD$ERR = 100000 ;ERROR FLAG(AD$IEN = 40000 ;ERROR INTERRUPT ENABLEAD$DON = 200 ;DONE FLAGR"AD$ENB = 100 ;INTERRUPT ENABLE6AD$OVE = 40 ;CLOCK OVERFLOW STARTS A/D CONVERSION6AD$ESE = 20 ;EXTERNAL EVENT STARTS A/D CONVERSION%AD$GO = 1 ;START A/D CONVERSION;;+3; DO$XXX - DRV11 DIGITAL OUTPUT CSR BIT DEFINITIONSM3; DI$XXX - DRV11 DIGITAL INPUT CSR BIT DEFINITIONSR;-(DO$FLG = 100000 ;EXTERNAL DATA ACCEPTED)DO$ENB = 40 ;OUTPUT INTERRUPT ENABLED2DO$BUF = 2 ;OFFSET TO OUTPUT BUFFER FROM CSR%DI$FLG = 200 ;EXTERNAL DATA READYD(DI$ENB = 100 ;INPUT INTERRUPT ENABLE1DI$BUF = 4 ;OFFSET TO INPUT BUFFER FROM CSRW .ENDC ;Q$$BUS .ENDC ;L$$SI1 .MACRO KDVDF$ .ENDM .ENDM .ENDAD$GO = 1 ;START A/D CONVERSION;;+3; DO$XXX - DRV11 DIGITAL OUTPUT CSR BIT DEFINITIONSM3; DI$XXX - DRV11 DIGITAL INPUT CSR BIT DEFINITIONSR;-(DO$FLG = 100000 ;EXTERNAL DATA ACCEPTED)DO$ENB = 40 ;OUTPUT INTERRUPT ENABLED2DO$BUF = 2 ;OFFSET TO OUTPUT BUFFER FROM CSR%DI$FLG = 200 ;EXTERNAL DATA 00»jƒ[ƒº_ƒt÷tø tþfDATA# .TITLE KEFQA SET EFN AND QUEUE AST .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 4-SEP-77 ;E;; THIS MODULE SETS EVENT FLAGS OR QUEUES AST'S FOR A SWEEP.G;T; SYSTEM MACRO CALLS;T .MCALL KSWDF$ KSWDF$  .PSECT .KSCT1 : .SBTTL .KEFQI INTERRUPT LEVEL SET EFN AND QUEUE AST ENTRY;+8; .KEFQI -- SET EFN AND QUEUE AST (FROM INTERRUPT LEVEL);E ; INPUTS:A; 0; STACK MUST BE AT LEVEL 0 (FOR RETURN TO INTSV); ; OUTPUTS:;O4; SYSTEM PROCESS IS CREATED, AND EFN IS SET OR EVENT-; FLAG IS QUEUED. A RETURN IS THEN EXECUTED.D;I; NOTE:E;O7; THIS ROUTINE IS ENTERED AT INTERRUPT LEVEL, AND EXITSE7; AT FORK LEVEL (UNLESS A FORK IS ALREADY IN PROGRESS).C;C5; THIS ROUTINE SHOULD BE ENTERED VIA A "CALLR .KEFQI";;- .ENABL LSBR;.KEFQI::BIT #S$WFRK,S.WFL2(R4) ;;;FORK ALREADY IN PROGRESS?F) BNE 40$ ;;;IF NE YES--DO NOT FORK AGAIN7 BIS #S$WFRK,S.WFL2(R4) ;;;NO--DECLARE FORK IN PROGRESS ' CALL @#$FORK2 ;;;CREATE SYSTEM PROCESSE# CLR (R3) ;DECLARE FORK BLOCK FREET3 BIC #S$WFRK,S.WFL2(R4) ;FORK NO LONGER IN PROGRESS5;***; BR .KEFQA ;SET EFN OR QUEUE AST AS APPROPRIATEV . .SBTTL .KEFQA SET EVENT FLAGS AND QUEUE AST'S;+'; .KEFQA -- SET EVENT FLAG OR QUEUE AST ;E ; INPUTS:A;A; R4 POINTS TO SWB; ; OUTPUTS:;/; AST QUEUED IF S$WEFN=0 OR IF STOPPING A SWEEP .; EFN SET IF S$WEFN=1 AND NOT STOPPING A SWEEP;I1; NOTE: THIS ROUTINE IS CALLED ONLY AT FORK LEVELP;R;-/.KEFQA::BIT #S$WSTP,S.WFL2(R4) ;STOPPING SWEEP?3% BNE 5$ ;IF NE YES--ALWAYS QUEUE ASTF, BIT #S$WEFN,S.WFL2(R4) ;SETTING EVENT FLAG? BNE 10$ ;IF NE YES--GO DO IT 5$: CALLR @#$QASTC ;QUEUE AN AST#10$: MOV R5,-(SP) ;SAVE ITB ADDRESSS" MOV .KTKCB,R5 ;GET MY TCB ADDRESS* MOV S.WEFA(R4),R1 ;GET EVENT FLAG ADDRESS& BNE 20$ ;IF NE $CEFI HAS BEEN CALLED' MOV S.WEFN(R4),R0 ;FIRST CALL--GET EFN + CALL @#$CEFI ;CONVERT TO ADDRESS AND MASK MOV R0,S.WEFM(R4) ;SET MASK MOV R1,S.WEFA(R4) ;AND ADDRESS 20$: MOV S.WEFM(R4),R0 ;GET MASK CALL @#$SETM ;SET EVENT FLAG" MOV (SP)+,R5 ;RESTORE ITB ADDRESS 40$: RETURN .DSABL LSBF ?@ .SBTTL .KWEFQ SET EFN OR QUEUE AST FOR MULT CLOCK DRIVEN SWEEPS;+>; .KWEFQ -- SET EFN OR QUEUE AST FOR MULT. CLOCK DRIVEN SWEEPS;S ; INPUTS:F;42; INTERRUPT LEVEL, STACK CLEAR FOR RETURN TO INTXT;S ; OUTPUTS:;M<; AT MOST ONE AST QUEUED, EFNS SET FOR ALL REQUESTING SWEEPS;O;- .IF DF K$$W11 & FT$MOPE/.KWEFQ::BIT #K$AFRK,.KAFLG ;;;FORK IN PROGRESS?& BNE 120$ ;;;IF NE YES--DO NOT REFORK0 BIS #K$AFRK,.KAFLG ;;;NO--FLAG FORK IN PROGRESS' CALL @#$FORK2 ;;;CREATE SYSTEM PROCESS# CLR (R3) ;DECLARE FORK BLOCK FREES0 BIC #K$AFRK,.KAFLG ;CLEAR FORK IN PROGRESS FLAG- CLR -(SP) ;SET "AST QUEUED" FLAG ONTO STACKE .IF DF M$$MGE? MOV #<.KLQUX-S.WCLX>+120000-<$KBASE & 177700>,R4 ;PT TO Q HEADP .IFF ;M$$MGES* MOV #<.KLQUX-S.WCLX>,R4 ;PT TO QUEUE HEAD .ENDC ;M$$MGE(20$: MOV S.WCLX(R4),R4 ;MOVE TO NEXT SWB BEQ 100$ ;IF EQ END OF QUEUE= TST S.WFLG(R4) ;REQUEST FOR THIS SWEEP (S$WAST IS SIGN BIT)?;! BPL 20$ ;IF PL NO--MOVE TO NEXT#- BIT #S$WSTP,S.WFL2(R4) ;YES--STOPPING SWEEP?E& BNE 40$ ;IF NE YES--ALWAYS QUEUE AST/ BIT #S$WEFN,S.WFL2(R4) ;NO--USING EVENT FLAGS?T BNE 60$ ;IF NE Y00»rƒ¼tƒ9ƒ´cÚµcÛ¶c�·c›’ES--GO SET IT.40$: TST (SP) ;HAVE WE ALREADY QUEUED AN AST?) BNE 20$ ;IF NE YES--DON'T QUEUE ANOTHER $ INC (SP) ;NO--FLAG WE HAVE NOW THO CALL @#$QASTC ;QUEUE AST; BR 20$ ;CHECK REST OF QUEUE4.60$: BIC #S$WAST,S.WFLG(R4) ;CLEAR AST REQUEST MOV R5,-(SP) ;SAVE R5" MOV .KTKCB,R5 ;GET MY TCB ADDRESS* MOV S.WEFA(R4),R1 ;GET EVENT FLAG ADDRESS& BNE 80$ ;IF NE $CEFI HAS BEEN CALLED' MOV S.WEFN(R4),R0 ;FIRST CALL--GET EFNE/ CALL @#$CEFI ;CONVERT EFN TO MASK AND ADDRESSA! MOV R0,S.WEFM(R4) ;REMEMBER MASKI MOV R1,S.WEFA(R4) ;AND ADDRESSD 80$: MOV S.WEFM(R4),R0 ;GET MASK( CALL @#$SETM ;SET REQUESTED EVENT FLAG MOV (SP)+,R5 ;RESTORE R5L BR 20$ ;SCAN REST OF QUEUE100$: TST (SP)+ ;CLEAR STACKB120$: RETURN ;DONE .ENDC ;K$$W11 & FT$MOP, .ENDVE R5" MOV .KTKCB,R5 ;GET MY TCB ADDRESS* MOV S.WEFA(R4),R1 ;GET EVENT FLAG ADDRESS& BNE 80$ ;IF NE $CEFI HAS BEEN CALLED' MOV S.WEFN(R4),R0 ;FIRST CALL--GET EFNE/ CALL @#$CEFI ;CONVERT EFN TO MASK AND ADDRESSA! MOV R0,S.WEFM(R4) ;RE+ .TITLE KFLT16 FLOAT 2'S COMPLEMENT INTEGER .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 22-SEP-77;E4; THIS ROUTINE CONVERTS TWO'S COMPLEMENT INTEGERS TO; FLOATING POINT NUMBERS; 5; FROM THE RT11 ROUTINE FLT16 AND THE FORTRAN LIBRARYL; ROUTINE $IR.E N. .SBTTL FLT16 FLOAT AN UNSIGNED 16-BIT INTEGER;+); FLT16 -- FLOAT A 2'S COMPLEMENT INTEGERS;L; CALLING SEQUENCES:;O; VAL = FLT16 (IVAL); CALL FLT16 (IVAL, VAL)O; ; INPUTS: ;R ; IVAL 16 BIT INTEGER TO CONVERT;I ; OUTPUTS:;O"; VAL 32 BIT CONVERTED REAL NUMBER;E;-.FLT16:: MOV @2(R5),R0 ;PICKUP VALUE TO CONVERT6 CALL .FLT16 ;CALL INTERNAL ROUTINE TO CONVERT NUMBER) CMPB (R5),#2 ;WERE THERE TWO ARGUMENTS?E+ BNE 10$ ;IF NE NO--NO 'VAL' TO STORE INTO% MOV 4(R5),R2 ;YES--GET 'VAL' ADDRESSA CMP #-1,R2 ;WAS IT DEFAULTED?+$ BEQ 10$ ;IF EQ YES--SKIP THE STORE1 MOV R0,(R2)+ ;STORE MS PART OF RESULT INTO 'VAL'  MOV R1,(R2) ;STORE LS PART 10$: RETURNN;+; .FLT16 -- INTERNAL FLT16;O ; INPUTS:I; ; R0 16 BIT NUMBER TO CONVERTE;D ; OUTPUTS:;E; R0,R1 32-BIT CONVERTED NUMBERC; ;-8.FLT16::MOV R0,-(SP) ;PUSH ONTO STACK AND CHECK SIGN BIT. BPL 40$ ;IF PL CAN USE $IR (OR WHAT IS LEFT)" MOV R0,-(SP) ;PUSH ON STACK AGAIN! BIC #100000,(SP) ;CLEAR SIGN BITS CLRB (SP) ;CLEAR LS HALF SWAB (SP) ;MOVE MS HALF! ADD #44000,(SP) ;ADD IN EXPONENTE MOV (SP)+,R0 ;GET MS HALF SWAB (SP) ;WORK ON LS HALF CLRB (SP) ;CLEAR OUT REST:20$: MOV (SP)+,R1 ;GET LS HALF RETURN ;DONEN;S; HERE IF NOT LARGEU;R%40$: CLR -(SP) ;MAKE ROOM FOR RESULTR! MOV R0,R1 ;GET INTEGER ARGUMENT BEQ 120$ ;IF EQ ALL DONE, MOV #220,R2 ;GET MAX POSSIBLE EXPONENT + 1) CLRB 2(SP) ;CLEAR LOWEST ORDER FRACTIONP!80$: ROL R1 ;LOOK FOR NORMAL BIT0 BCS 100$ ;IF CS FOUND IT DEC R2 ;DECREASE EXPONENT  BR 80$ ;TRY AGAIN,100$: MOVB R1,3(SP) ;SAVE LOW ORDER FRACTION CLRB R1 ;A4 BISB R2,R1 ;COMBINE EXPONENT AND HI ORDER FRACTION( SWAB R1 ;(NOTE THAT SWAB CLEARS C-BIT)1 ROR R1 ;INSERT SIGN IN RESULT (ALWAYS POSITIVE): RORB 3(SP)M MOV R1,(SP) ;STORE RESULT,120$: MOV (SP)+,R0 ;GET RESULT MOV (SP)+,R1 ;... 140$: RETURN .ENDMAX POSSIBLE EXPONENT + 1) CLRB 2(SP) 00½zƒ¾~ƒ_ƒt÷tø tþfDATA2 .TITLE KIESTO STORE ERROR CODE FROM ABORTED SWEEP .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 6-JUL-77 ;E?; THIS ROUTINE STORES THE ERROR CODE FROM AN ABORTED SWEEP INTOS; THE USER'S I/O STATUS BLOCK. ;+2; .IESTO -- STORE ERROR CODE INTO I/O STATUS BLOCK;NB; THIS ROUTINE IS USED TO STORE THE ERROR CODE INTO THE I/O STATUSE; BLOCK FOR A SWEEP WHICH NEVER GOT STARTED (BAD PARAMETERS, RESOURCE ; IN USE, ETC.)M; ; INPUTS:.;O(; R5 POINTS TO THE FORTRAN ARGUMENT LIST0; R4 THE ARGUMENT NUMBER OF THE I/O STATUS BLOCK!; R3 STATUS CODE TO STORE IN IOSB ; ; OUTPUTS:;.:; THE VALUE IS STORED IN THE I/O STATUS BLOCK (IF PRESENT);F; REGISTERS ALTERED:;S; R4;S;-5.IESTO::CMPB R4,(R5) ;CAN IOSB BE IN PARAMETER LIST?I# BHI 20$ ;IF HI NO--USER LOSES BIGI ASL R4 ;CONVERT TO WORD INDEXE- ADD R5,R4 ;R4 NOW POINTS TO WORD CONTAINING  ; ADDRESS OF IOSB& CMP #-1,(R4) ;WAS ARGUMENT DEFAULTED? BEQ 20$ ;IF EQ YES--LOSE BIG MOV R3,@(R4) ;STORE STATUS 20$: RETURNM .ENDR OF THE I/O STATUS BLOCK!; R3 STATUS CODE TO STORE IN IOSB ; ; OUTPUTS:;.:; THE VALUE IS STORED IN THE I/O STATUS BLOCK (IF PRESENT);F; REGISTERS ALTERED:;S/ .TITLE KKWDRV KW11 HARDWARE INTERFACE ROUTINESE .IDENT /M01.00/; ; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 4-SEP-77 ;E:; THIS MODULE CONTAINS ROUTINES THAT ACCESS THE KW11 CLOCK;S; SYSTEM MACRO CALLS;  .MCALL CINT$S,KSWDF$,KDVDF$ KSWDF$E KDVDF$  , .SBTTL .KWCNI CONNECT CLOCK A TO INTERRUPTS;+/; .KWCNI -- CONNECT CLOCK A TO INTERRUPT VECTORO;E ; INPUTS: ; ; DATA BASE SET ;M ; OUTPUTS:;A; C-CLEAR CONNECT OK; C-SET COULD NOT CONNECTO;S;- .ENABL LSB .KWCNI::.IF DF FT$MOP $ TST .KAFLG ;ARE WE ALREADY ACTIVE?+ BMI 100$ ;YES--**SHOULD CHECK EXT START**E .ENDC ;FT$MOP% BIT #K$ACIN,.KAFLG ;IS IT CONNECTED?C" BNE 20$ ;YES--DON'T TRY IT AGAIN$ MOV .KAVEC,R1 ;CONNECT FIRST VECTOR CALL 200$ ;... BCS 120$ ;IF CS THEN ERROR .IF DF Q$$BUS ADD #4,R1 ;CONNECT ST2 VECTORN CALL 200$ ;... BCS 120$O .ENDC ;Q$$BUS1 BIS #K$ACIN,.KAFLG ;FLAG CONNECTED TO INTERRUPTS .KWCN0:: ;REF LABELL#20$: MOV .KACSR,R1 ;GET CSR ADDRESS 2 MOV .KAPRE,2(R1) ;SET PRESET INTO PRESET REGISTER .IF DF M$$MGEC MOV #.KWIN1+120000-<$KBASE&177700>,R3 ;ASSUME SWEEPING IMMEDIATELY$ .IFF ;M$$MGET, MOV #.KWIN1,R3 ;ASSUME SWEEPING IMM00¾‚ƒtƒ9ƒ´cÚµcÛ¶c�·c›’EDIATELY .IFTF ;M$$MGE7 MOV #KA$RIM!KA$ENB,R2 ;ASSUME A/D, NO EXT ST, NO DELAYH( BIT #S$WA$D,S.WFL2(R4);IS THIS THE A/D? BNE 40$ ;IF NE YES=30$: MOV #KA$RIM!KA$MFE!KA$ENB,R2 ;SET REPT INTRVL, MODE FLAG. ;ENABLE, AND CLOCK ENABLEU,40$: BIT #S$WEXT,S.WFLG(R4) ;EXTERNAL START? BEQ 60$ ;IF EQ NO9 BIS #KA$STI!KA$STE,R2 ;YES--SET ST INT ENABLE, ST ENABLED ;COUNTER8 BIC #KA$ENB,R2 ;CLEAR CLOCK ENABLE--ST WILL START CLOCK .IFT ;M$$MGEM6 MOV #.KWIN0+120000-<$KBASE&177700>,R3 ;SET FOR ST ISR .IFF ;M$$MGE MOV #.KWIN0,R3 ;SET FOR ST ISR  .IFTF ;M$$MGE.60$: BIT #S$WDLY,S.WFL2(R4) ;IS THERE A DELAY? BEQ 80$ ;IF EQ NO:% BIS #K$ADLY,.KAFLG ;YES--FLAG DELAY $ BIC #KA$RIM,R2 ;CLEAR REPT INTERVAL% BIS #KA$MFE,R2 ;SET MODE FLAG ENABLE4 .IFT ;M$$MGE?= MOV #.KWIN0+120000-<$KBASE&177700>,R3 ;SET FOR EXT START INEN .IFF ;M$$MGE& MOV #.KWIN0,R3 ;SET FOR EXT START ISR .IFTF ;M$$MGE'70$: MOV .KADLY,2(R1) ;SET DELAY PRESETI*80$: BIS .KARAT,R2 ;SET RATE INTO CSR WORD4 MOV R3,.KWINT+2 ;SET ISR INTO INTERRUPT INSTRUCTION MOV R2,(R1) ;SET CLOCK CSR& BIS #K$ACTV,.KAFLG ;FLAG CLOCK ACTIVE100$: CLC ;FLAG OK120$: RETURN ;=200$: CINT$S R1,#$KBASE,#.KWINT,#.KWEDI,#PR6,#.KWAST ;CONNECT# RETURN  .ENDC ;M$$MGE .DSABL LSBM;?"; ENABLE DISABLE INTERRUPT ROUTINE;, .PSECT .KSCT1*.KWEDI: CLR @.KACSR ;DISABLE CLOCK ALWAYS- MOV @#$TKTCB,.KTKCB ;REMEMBER MY TCB ADDRESS: RETURNL (+ .SBTTL .KWIN? CLOCK "A" INTERRUPT ROUTINESE;+7; .KWIN0 -- CLOCK "A" INTERRUPT ROUTINE FOR ST OR DELAYI;R ; INPUTS:V;,; NONE;C ; OUTPUTS:;#;- .ENABL LSB 6.KWIN0::MOV R3,(SP) ;;;SAVE R3, OVERWRITE R4 ON STACK .IF NDF FT$MOPS MOV (R4),R4 ;;;GET SWB ADDRESS .IFF ;FT$MOP4 MOV .KLQUX,R4 ;;;GET SWB ADDRESS (ONLY 1ST CAN HAVE ;;;DELAY OR EXT START!)C .ENDC ;FT$MOP .IF DF M$$MGE .IFTF ;M$$MGE) MOV .KACSR,R3 ;;;GET CLOCK A CSR ADDRESSS# TST (R3) ;;;CHECK SCHMITT TRIGGERK) BMI 100$ ;;;IF MI SCHMITT TRIGGER FIRED % BIT #K$ADLY,.KAFLG ;;;DOING A DELAY?E BEQ 90$ ;;;NO--ALL DONE & BIC #K$ADLY,.KAFLG ;;;YES--CLEAR FLAG CLR (R3) ;;;DISABLE CLOCK; MOV .KAPRE,2(R3) ;;;SET PRESET& MOV R3,-(SP) ;;;SAVE R3 (CSR ADDRESS) .IFT ;M$$MGE6 MOV S.WSTR(R4),R3 ;;;GET USER MODE ST ROUTINE ADDRESS' ADD $KRLC5,R3 ;;;RELOCATE TO EXEC MODEC" CALL (R3) ;;;CALL THE ST ROUTINEC MOV #.KWIN1+120000-<$KBASE & 177700>,.KWINT+2 ;;;RESET INT ROUTINET .IFF ;M$$MGEC$ CALL @S.WSTR(R4) ;;;CALL ST ROUTINE* MOV #.KWIN1,.KWINT+2 ;;;RESET INT ROUTINE .IFTF ;M$$MGE/ BIC #S$WEXT,S.WFLG(R4) ;;;CLEAR EXT START FLAGS, BIT #S$WNOV,S.WFLG(R4) ;;;NON-CLOCK DRIVEN? BNE 85$ ;;;IF NE YESI10$: MOV #KA$RIM!KA$MFE!KA$ENB,R3 ;;;SET REPT INTRVL AND MODE FLAG ENABLEW1 BIT #S$WA$D,S.WFL2(R4) ;;;IS THIS THE A/D SWEEP?D BEQ 20$ ;;;IF EQ NOT9 MOV #KA$RIM!KA$ENB,R3 ;;;YES--NO CLOCK INTERRUPTS PLEASEI(20$: BIS .KARAT,R3 ;;;INCLUDE CLOCK RATE#40$: MOV R3,@(SP)+ ;;;SET CLOCK CSR60$: MOV (SP)+,R3 ;;;RESTORE R3I 80$: RETURNI)85$: TST (SP)+ ;;;CLEAR CSR OFF OF STACK; BR 60$ ;;;GO EXIT INTERRUPT4;;9; HERE IF NOT SCHMITT TRIGGER OR DELAY...MUST HAVE GOTTENK>; A DIGITAL INPUT START. FIX UP AND GO HANDLE REGULAR SAMPLING ; INTERRUPT.;N90$: ;;;REF LABEL .IFT ;M$$MGEA7 MOV #.KWIN1+120000-<$KBASE&177700>,.KWINT+2 ;;;SET ISRQ .IFF ;M$$MGEM MOV #.KWIN1,.KWINT+2 ;;;SET ISR .IFTF ;M$$MGE( BR KWIN1A ;;;HANDLE SAMPLING INTERRUPT;,; HERE IF ST1 FIREDS;?100$: BIC #KA$STF!KA$STI!KA$STE,(R3) ;;;DISABLE SCHMITT TRIGGER; ;;;AND CLEAR ST FLAG .IF DF N$DR11( CALL .DSDGO ;;;DISABLE DIGO IF ENABLED .ENDC ;N$DR112 BIT #S$WDLY,S.WFL2(R4) ;;;IS THERE A DELAY TO DO?3 BNE 300$ ;;;IF NE YES--WILL GET ANOTHER INTERRUPTF .IFT ;M$$MGE$. MOV S.WSTR(R4),R3 ;;;GET ST USER MODE ADDRESS' ADD $KRLC5,R3 ;;;RELOCATE TO EXEC MODE# CALL (R3) ;;;CALL ST ROUTINEC MOV #.KWIN1+120000-<$KBASE & 177700>,.KWINT+2 ;;;RESET INT ROUTINEI .IFF ;M$$MGE% CALL @S.WSTR(R4) ;;;CALL STR ROUT00¾Šƒ¿�ƒ_ƒt÷tø tþfDATAINEI* MOV #.KWIN1,.KWINT+2 ;;;RESET INT ROUTINE .ENDC ;M$$MGE/ BIC #S$WEXT,S.WFLG(R4) ;;;CLEAR EXT START FLAGD BR 300$ ;;;GO FINISH UP# D;+5; .KWIN1 -- CLOCK "A" INTERRUPT FOR SYNCHRONOUS SWEEPN;E ; INPUTS: ;T; R4 POINTS TO .KASWX ;$ ; OUTPUTS:;W<; ALL ACTIONS NECESSARY FOR CLOCK DRIVEN SWEEP ARE PERFORMED;E;-6.KWIN1::MOV R3,(SP) ;;;SAVE R3--OVERWRITE R4 ON STACK .IF NDF FT$MOP7' MOV (R4),R4 ;;;GET ACTIVE SWB ADDRESS  .IFTF ;FT$MOP4KWIN1A: BIC #KA$MDF,@.KACSR ;;;CLEAR CLOCK MODE FLAG .IF DF M$$MGE MOV @#KISAR6,-(SP) ;;;SAVE APR6 .ENDC ;M$$MGE .IFF ;FT$MOPD% CLR -(SP) ;;;CLEAR FORK NEEDED FLAGK .IF DF M$$MGE1 MOV #<.KLQUX-S.WCLX>+120000-<$KBASE & 177700>,R4 .IFF ;M$$MGEA* MOV #<.KLQUX-S.WCLX>,R4 ;;;POINT TO QUEUE .ENDC ;M$$MGE+210$: MOV S.WCLX(R4),R4 ;;;LINK TO NEXT SWB3 BEQ 215$ ;;;IF EQ ALL DONE2 MOV S.WFL2(R4),R3 ;;;GET FLAGS AND SEE IF ACTIVE? BPL 210$ ;;;IF PL NOT ACTIVE' TSTB R3 ;;;ACTIVE--IS THIS A/D SWEEP?;& BMI 210$ ;;;IF MI YES--DO NOT BOTHER1 CALL @S.WSCR(R4) ;;;YES--CALL SYNC CLOCK ROUTINEM BCC 210$ ;;;IF CC CONTINUE' BIS #S$WAST,S.WFLG(R4) ;;;SET AST FLAGD" INC (SP) ;;;SET FORK NEEDED FLAG BR 210$ ;;;CONTINUER!215$: TST (SP)+ ;;;NEED TO FORK?U BEQ 240$ ;;;IF EQ NO .IFT ;FT$MOP;3 CALL @S.WSCR(R4) ;;;CALL SYNCHRONOUS CLOCK ROUTINE BCC 240$ ;;;IF CC OK* BIT #S$WSTP,S.WFL2(R4) ;;;STOP THE SWEEP? BEQ 220$ ;;;IF EQ NO$ CLR @.KACSR ;;;YES--STOP THE CLOCK .ENDC ;FT$MOP220$: ;;;REF LABELM .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6  .ENDC ;M$$MGE MOV (SP)+,R3 ;;;RESTORE R3S .IF NDF FT$MOP 4 CALLR .KEFQI ;;;FORK SET EFN OR QUEUE AST AND EXIT .IFF ;FT$MOPU .IF DF M$$MGE1 MOV #<.KLQUX-S.WCLX>+120000-<$KBASE & 177700>,R4 .IFF ;M$$MGE * MOV #<.KLQUX-S.WCLX>,R4 ;;;POINT TO QUEUE .ENDC ;M$$MGE4 MOV .KUCNT,-(SP) ;;;SET CLOCK USER COUNT ONTO STACK;09; RUN THROUGH CLOCK QUEUE TO SEE IF WE NEED TO STOP CLOCKN;;+225$: MOV S.WCLX(R4),R4 ;;;LINK TO NEXT SWB$ BEQ 227$ ;;;IF EQ ALL DONE# TST S.WFL2(R4) ;;;IS SWEEP ACTIVE?M BMI 225$ ;;;IF MI YESS DEC (SP) ;;;NO--DEC USE COUNTE BR 225$ ;;;CONTINUE SCANNING#227$: TST (SP)+ ;;;ANY USERS LEFT?D BGT 230$ ;;;IF GT YES-# CLR @.KACSR ;;;NO--STOP THE CLOCK:230$: CALLR .KWEFQ ;;;FORK, SET EFN OR QUEUE AST AND EXIT .ENDC ;FT$MOP240$:V .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6U .ENDC ;M$$MGE 300$: MOV (SP)+,R3 ;;;RESTORE R3 320$: RETURN .DSABL LSB  .ENDO NEXT SWB$ BEQ 227$ ;;;IF EQ ALL DONE# TST S.WFL2(R4) ;;;IS SWEEP ACTIVE?M BMI 225$ ;;;IF MI YESS DEC (SP) ;;;NO--DEC USE COUNTE BR 225$ ;;;CONTINUE SCANNING#227$: TST (SP)+ ;;;ANY USERS LEFT?D BGT 230$ ;;;IF GT YES-# CLR @.KACSR ;;;NO--STOP THE CLOCK:230$: CALLR .KWEFQ ;;;FORK, SET EFN OR QUEUE AST AND EXIT .ENDC ;FT$MOP240$:V .IF DF M$$MGE# MOV (SP)+,@#KISAR6 ;;;RESTORE APR6U .ENDC ;M$$MGE 300$: MOV (SP)+,R3 ;;;RESTORE R3 320$: RE& .TITLE KLQSUB CLOCK QUEUE SUBROUTINES .IDENT /M01.01/;A; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.S;N>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION M01.01; B. SCHREIBER 15-NOV-77;E; MODIFIED BY:;U ; MSH017 M. HARVEY OCT. 12, 1978*; CORRECT CONDITION00¿’ƒÀ—ƒ9ƒ´cÚµcÛ¶c�·c›’ALIZATION FOR NO CLOCK;A9; THIS MODULE CONTAINS ROUTINES TO MODIFY THE CLOCK QUEUE ;D; SYSTEM MACRO CALLS;O .MCALL KSWDF$ KSWDF$C O- .SBTTL .KLQIN INSERT SWEEPS INTO CLOCK QUEUEN;+); .KLQIN -- INSERT SWEEP INTO CLOCK QUEUEO;R8; THIS ROUTINE SETS UP A SWEEP TO BE IN THE CLOCK QUEUE.;L ; INPUTS:S; ; R4 POINTS TO SWB ; R3 FREE ;N ; OUTPUTS:;D5; [NOT MULTIPLE SWEEPS] .KASWB AND .KASWX ARE SET UP.E8; [MULTIPLE SWEEPS] SWB IS ENTERED INTO CLOCK QUEUE.,; [BOTH] ACTIVE FLAG IS SET FOR CLOCK;H;-.KLQIN:: ;REF LABELO .IF NDF FT$MOPU MOV #.KASWX,R3 ;POINT TO KASWX* MOV R4,(R3)+ ;SET SWB ADDRESS INTO .KASWX* MOV R4,(R3) ;SET SWB ADDRESS INTO .KASWB .IF DF M$$MGE* ADD $KRLC5,-(R3) ;RELOCATE .KASWX TO APR5 .ENDC ;M$$MGE .IFF ;FT$MOPU MTPS #PR6 ;LOCK OUT INTERRUPTS: MOV .KLQUU,S.WCLQ(R4) ;;;LINK NEW ACTIVE SWEEP INTO QUEUE MOV R4,.KLQUU ;;; .IF DF M$$MGE MOV R4,R3 ;;;COPY PTRS" ADD $KRLC5,R3 ;;;RELOCATE TO APR54 MOV .KLQUX,S.WCLX(R4) ;;;LINK INTO EXEC LEVEL QUEUE MOV R3,.KLQUX ;;;...F .ENDC ;M$$MGE( INC .KUCNT ;;;COUNT ANOTHER CLOCK USER MTPS #0 ;;;ALLOW INTERRUPTS .ENDC ;FT$MOP RETURN ;SWEEP IS IN THE QUEUE M, .SBTTL .KLQRM REMOVE SWEEP FROM CLOCK QUEUE;+); .KLQRM -- REMOVE SWEEP FROM CLOCK QUEUEP; ; INPUTS:N;R.; CALLED AT USER LEVEL WITH R4 POINTING TO SWB;E ; OUTPUTS:;M; SWB IS REMOVED FROM QUEUE$;E;-.KLQRM:: ;REF LABEL .IF NDF FT$MOPE CLR .KASWB ;CLEAR SWB ADDRESSR CLR .KASWX ;...C .IFF ;FT$MOPV MOV R3,-(SP) ;SAVE R3 MOV R2,-(SP) ;AND R2N" MTPS #PR6 ;;;LOCK OUT INTERRUPTS( MOV #.KLQUU-S.WCLQ,R3 ;;;POINT TO QUEUE/20$: MOV R3,R2 ;;;REMEMBER FROM WHENCE WE CAMET+ MOV S.WCLQ(R3),R3 ;;;LINK TO NEXT IN QUEUE. BEQ 40$ ;;;IF EQ MUST NOT HAVE BEEN IN QUEUE% CMP R4,R3 ;;;IS THIS THE RIGHT ONE?W BNE 20$ ;;;IF NE NO4 MOV S.WCLQ(R3),S.WCLQ(R2) ;;;YES--UNLINK FROM QUEUE .IF DF M$$MGE1 MOV S.WCLX(R3),S.WCLX(R2) ;;;AND FROM EXEC QUEUE  .ENDC ;M$$MGE" DEC .KUCNT ;;;DECREASE USE COUNT% BGT 40$ ;;;IF GT CLOCK STILL ACTIVED .IFTF ;FT$MOP .IF DF K$$W11- BIC #K$ACTV,.KAFLG ;;;CLOCK NO LONGER ACTIVE0 .ENDC ;K$$W11M .IFF ;FT$MOP !40$: MTPS #0 ;;;ALLOW INTERRUPTST MOV (SP)+,R2 ;RESTORE REGISTERS MOV (SP)+,R3 ;... .ENDC ;FT$MOP RETURN  .ENDRIGHT ONE?W BNE 20$ ;;;IF NE NO4 MOV S.WCLQ(R3),S.WCLQ(R2) ;;;YES--UNLINK FROM QUEUE .IF DF M$$MGE1 MOV S.WCLX(R3),S.WCLX(R2) ;;;AND FROM EXEC QUEU$ .TITLE KPAA PUSH ARGUMENT ADDRESSES .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 23-JUN-77;E5; SUBROUTINE TO PUSH FORTRAN ARGUMENT LIST ONTO STACK  ;+@; .K.PAA -- SUBROUTINE TO PUSH ARGUMENT ADDRESSES ONTO THE STACK;E; CALLING SEQUENCE: ; CALL .K.PAAC; .WORD MAXARG; .WORD BITMAP0; (BIT0 FOR LAST ARG, BIT1 FOR NEXT TO LAST...);D ; INPUTS: ;C&; R5 ADDRESS OF ARGUMENT ADDRESS TABLE$; MAXARG MAXIMUM NUMBER OF ARGUMENTS1; BITMAP BIT MAP WITH ONES FOR REQUIRED ARGUMENTSS; ; OUTPUTS:; #; C-CLEAR ARGUMENTS SET UP ON STACKC9; STACK SETUP WITH ADDRESSES OR 0 FOR DEFAULTED ARGUMENTSU2; R5 HOLDS OLD SP FOR ERROR RECOVERY (CLEAN STACK);8; C-SET REQUIR00Àšƒ²œƒ_ƒt÷tø tþfDATAED ARG NOT PRESENT, ILLEGAL NUMBER OF ARGS; STACK IS CLEARN$; R5 STILL POINTING TO ARGUMENT LIST;A; REGISTERS ALTERED:;I; R4,R3,R2,R1,R0; ;-+.K.PAA::MOV (SP)+,R3 ;GET ADDRESS OF RETURNE) MOV SP,R4 ;PRESERVE SP IN CASE OF ERRORM$ MOV (R3)+,R2 ;R2=MAX # OF ARGUMENTS0 MOV (R3)+,R1 ;R1=BIT MAP OF MANDATORY ARGUMENTS ;R3=RETURN ADDRESS. MOVB (R5),R0 ;GET ACTUAL NUMBER OF ARGUMENTS4 SUB R0,R2 ;PUSH A ZERO FOR EACH ARGUMENT NOT GIVEN) BMI 160$ ;IF MI THEN TOO MANY ARGUMENTS ' BEQ 40$ ;IF EQ ALL ARGUMENTS SUPPLIEDO20$: ROR R1 ;SEE IF MANDATORY BCS 160$ ;IF CS YES--ERROR( CLR -(SP) ;NO--SET A ZERO ON THE STACK& DEC R2 ;DO ALL UNSPECIFIED ARGUMENTS BNE 20$ ;WAIT FOR R2=0;V5; NOW SEE IF ANY MORE ARGS TO PROCESS (GIVEN IN CALL)R;A140$: MOV R0,R2 ;PICK UP COUNT OF ARGS LEFT TO DOA BEQ 120$ ;IF EQ ALL DONE. INC R2 ;ELSE SET R2 TO ADR OF WORD FOLLOWING ; ADDRESS LIST ASL R2 ;SET R2=2*(R0+1)+R5- ADD R5,R2 ;NOW R2 POINTS JUST PAST LAST ARG ;U>; PUSH GIV .TITLE TTYL .IDENT /05.01/U;T6; COPYRIGHT (c) 1983 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;P<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;;N; 27-JAN-78 PETER WANNHEDEN;;I; PREVIOUSLY MODIFIED BY:N;; P. WANNHEDEN ; C. F. SPITZT; D. R. DONCHINS ; T. LEKAS;D; MODIFICATIONS:;;; D. R. DONCHIN 15-JUN-84 05.01@; DD187 -- IMPROVE MODEM HANDLING TO MEET EUROPEAN REQUIREMENTS;;.;+*; CONTROLLER-DEPENDENT ROUTINES FOR DL-11.;-;B;I A> .IIF DF R$$PRO .IIF NDF D$$C11 .ERROR ;R$$PRO REQUIRES D$$C11 .IF DF D$$L11 R L .IF DF R$$MPL S .MCALL KRBDF$ Y KRBDF$ ;DEFINE KRB SYMBOLSF C .ENDC ;R$$MPL  .MCALL HWDDF$,UCBDF$E" HWDDF$ ;DEFINE HARDWARE SYMBOLS UCBDF$ ;DEFINE UCB SYMBOLSP .PSECT MAP5;I;; EQUATED SYMBOLSO;I; DL-11 REGISTER DEFINITIONS;JRCSR = 0 ;RECEIVER STATUS REG. $RBUF = 2 ;RECEIVER DATA BUFFER REG."XCSR = 4 ;TRANSMITTER STATUS REG.'XBUF = 6 ;TRANSMITTER DATA BUFFER REG.A;2; PROFESSIONAL 300 SERIES PRINTER PORT DEFINITIONS; .PDBUF = 173400 ;RECEIVER DATA BUFFER REGISTERPSTS = 173402 ;STATUS REGISTER PMODE = 173404 ;MODE REGISTER!PCMND = 173406 ;COMMAND REGISTERF;:; PROFESSIONAL 300 SERIES INTERRUPT CONTROLLER DEFINITIONS;L4ICCSR = 173202 ;INTERRUPT CONTROLLER 0 CSR REGISTER5PRINTR = 5 ;PRINTER RECEIVER INTERRUPT REQUEST LEVELT8PXINTR = 6 ;PRINTER TRANSMITTER INTERRUPT REQUEST LEVEL*CLSIMR = 50 ;CLEAR SINGLE IMR BIT COMMAND)STSIRR = 130 ;SET SINGLE IRR BIT COMMAND3;S;E;+; YLRESX - RESUME OUTPUT.;U; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S1.CTS 0 ;-; ;D6YLRESX::BIS #100,XCSR(R3) ;;;SET XMIT INTERRUPT ENABLE .IF DF R$$PRO;ND; FOR THE PROFESSIONAL 300 SERIES MACHINES BOTH METHODS OF EFFECTINGE; THE INTERRUPT ENABLE BITS ARE LEFT IN PLACE SO THAT THE SYSTEM WILLEC; WORK ON BOTH THE REAL HARDWARE AND THE BRIDGE SYSTEM. THE BRIDGE=D; SYSTEM CONSISTS OF AN 11/23-PLUS SYSTEM WITH AN INTERFACE ON IT TO; THE CTI BUS.;+A; ON THE REAL HARDWARE THE BIS #100... IS IGNORED. ON THE BRIDGEAF; SYSTEM THE FOLLOWING TWO INSTRUCTIONS ARE IGNORED BECAUSE THEY WRITE; INTO THE BOOT ROMS;X6 MOV #CLSIMR!PXINTR,ICCSR ;;;SET XMIT INTERRUPT ENABLE ;;;FOR PRINTER PORTB MOV #STSIRR!PXINTR,ICCSR ;;;CAUSE ANY PENDING INTERRUPTS TO OCCUR .ENDC ;R$$PRO;M;L;+; YLABOX - ABORT OUTPUT.;A; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.TOC 0 ; U.TTOC 0C;N!; YLSTOX - STOP (SUSPEND) OUTPUT.E;A; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S1.CTS 1S;-;N;RYLABOX::YLSTOX:: W .IF NDF D$$LMDB YLMTIM:: M .ENDC ;D$$LMD C RETURN ;;; ;E;P;+; YLPWUP - POWER-UP.;N; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.STS SET UP FOR LOCAL LINE: ; US.CRW 0X ; US.DSB 0U;-;;N .ENABL LSBT .00²¢ƒ—ƒ9ƒ´cÚµcÛ¶c�·c›’IF DF R$$CONYLCONL::6YLCPUP::SEC ;SET CARRY BIT FOR CONTROLLER OPERATIONSYLUONL::YLUPUP:: .IFFTYLPWUP:: .ENDC ;R$$CON MOVB RBUF(R3),R0 ;EMPTY RBUFE N .IF DF D$$LMD S4 BIS #140,@R3 ;ENABLE DATASET AND RECEIVE INTERRUPTS B .IFF ;D$$LMD ( BIS #100,@R3 ;ENABLE RECEIVE INTERRUPTS .IF DF R$$PRO6 MOV #CLSIMR!PRINTR,ICCSR ;;;ENABLE RECEIVE INTERRUPTS ;;;FOR PRINTER PORT .ENDC ;R$$PRO RETURN ;RETURN  .IFT ;D$$LMD- 6 BCS 10$ ;RETURN IF PERFORMING A CONTROLLER OPERATION+ BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE?O BEQ 10$ ;N - RETURN< BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIER FLAG;Y;U;+; YLMTIM - MODEM TIMER.B;#; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-;0;R(YLMTIM::CALL LOCKI ;LOCK OUT INTERRUPTS0 CALL HLMTIM ;;;CALL COMMON MODEM TIMER ROUTINE& BEQ 5$ ;;;IF EQ Z-BIT SET - DROP DTR# BISB #6,@R3 ;;;ASSERT DTR AND RTST RETURN ;;; 65$: BICB #17,@R3 ;;;CLEAR DTR, RTS, READER ENABLE AND ;;;SECONDARY XMITR/10$: RETURN ;;;RETURN TO COROUTINE THAT HANGS- ;;;UP LINE IF NECESSARY- S .IFTF ;D$$LMD  .IF DF R$$CONYLCOFF::YLUOFF:: CLR @R3 ;DISABLE THE WORLD8 .IIF DF R$$PRO .ERROR ;R$$CON SHOULD NOT BE DEFINED FOR ;PRO 300 SERIES MACHINES RETURN  .ENDC ;R$$CON;L;M;+"; INPUT INTERRUPT SERVICE ROUTINE.;-;;;F  .IF DF R$$MPL R$YLINP::& TTSET$ YL ;;;SAVE R2, R3 AND SET UP: ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS$ MOV K.OWN(R4),R5 ;;;GET UCB ADDRESS R .IFF ;R$$MPLO R$DLINP:: .IF EQ D$$L11-1& CLR R4 ;;;SET UP DL CONTROLLER INDEX .ENDC$ TTSET$ DL ;;;SAVE R2,R3 AND SET UP ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST S MOV (R4),R5 ;;;GET UCB ADDRESS 0 .ENDC ;R$$MPL R" ADD #U.TSTA,R5 ;;;POINT TO U.TSTA .IFT ;D$$LMDP E% MOV @R3,R2 ;;;SAVE INTERRUPT STATUS ( BPL 20$ ;;;NO DATASET INTERRUPT - JUMP MOV R2,R4 ;;;GET A COPY;" ASL R4 ;;;GET RING BIT IN BIT 15 SWAB R4 ;;;GET IT IN BIT 74 MOV R2,-(SP) ;;;SAVE R2 DESTROYED BY MODISR ROUTINE& CALL MODISR ;;;CALL COMMON MODEM ISR, BVC 16$ ;;;NO SPECIAL ACTION NEEDED - JUMP BCS 15$ ;;;DROP DTR - JUMP# BISB #6,@R3 ;;;ENABLE DTR AND RTSC4 BR 16$ ;;;AND LOOK IF FURTHER PROCESSING IS NEEDED&15$: BICB #6,@R3 ;;;CLEAR DTR AND RTS16$: MOV (SP)+,R2 ;;;RESTORE R2E$20$: TSTB R2 ;;;RECEIVER INTERRUPT? BPL 10$ ;;;N - EXITA  .ENDC ;D$$LMD M .IF DF R$$PRO ASSUME H2.BRG,100000 - TST $HFMSK+2 ;;;IS THIS A PRO BRIDGE SYSTEM?7 BMI 30$ ;;;IF NE YES' MOV PDBUF,R2 ;;;GET RECEIVED CHARACTERI BR 40$ ;;;AND CONTINUE .IFTF ;R$$PRO.30$: MOV RBUF(R3),R2 ;;;GET RECEIVED CHARACTER .IFT ;R$$PRO 40$: ;;;REFERENCE LABEL .ENDC ;R$$PRO+ CALLR ICHAR1 ;;;DO COMMON INPUT CHARACTER  ;;;PROCESSING AND RETURN;: .DSABL LSB ;R;O;+"; OUTPUT INTERRUPT SERVICE ROUTINE;-;B;1  .IF DF R$$MPL .$YLOUT::& TTSET$ YL ;;;SAVE R2, R3 AND SET UP: ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS$ MOV K.OWN(R4),R5 ;;;GET UCB ADDRESS .IFF ;R$$MPL  R$DLOUT:: .IF EQ D$$L11-1& CLR R4 ;;;SET UP DL CONTROLLER INDEX .ENDC$ TTSET$ DL ;;;SAVE R2,R3 AND SET UP ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST I MOV (R4),R5 ;;;GET UCB ADDRESS  .ENDC ;R$$MPL N" ADD #U.TSTA,R5 ;;;POINT TO U.TSTA;;U;+; YLSTAX - START OUTPUT.;-; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.TOP+2 BUFFER POINTERC; U.TOC BYTE COUNT4;-;A;E6YLSTAX::MOV #100,R2 ;;;GET BITMASK FOR XMIT INTERRUPT) BIS R2,XCSR(R3) ;;;ENABLE XMIT INTERRUPTC .IF DF R$$PROC MOV #CLSIMR!PXINTR,ICCSR ;;;ENABLE XMIT INTERRUPT FOR PRINTER PORT  .ENDC ;R$$PRO7 CALLR OUTISR ;;;DO COMMON OUTPUT INTERRUPT PROCESSINGB D .ENDC ;D$$L11 $;L;N .END#U.TSTA,R5 ;;;POINT TO U.TSTA;;U;+; YLSTAX - START OUTPUT.;-; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.TOP+2 BUFFER POINTERC00³ªƒœƒ_ƒt÷tø tþfDATA  .TITLE XEDRV - QIO UNA driver .IDENT /02.01/M  .ENABL LC;T; COPYRIGHT (C) 1985S1; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.S;T@ ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A@ ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE@ ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR@ ; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE@ ; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH@; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE@; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.N;PA; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTRA; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITALB; EQUIPMENT CORPORATION.;N@; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF;; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.;E; MODULE DESCRIPTION;N:; UNA QIO Driver. This driver attempts to simulate theC; the DECnet Direct Line Access (DLX) functionality for the UNA.E;L;L+; DISTIBUTED SYSTEMS SOFTWARE ENGINEERING  ;M1 ; MODIFIED FOR RSX-11M-PLUS V3.0 UPDATE B BY:R ;  ;E ; A. Kojnok 06-Aug-85 DF ; Added line of code to INIXM routine to load R5 with Port # ; Status Table address.  ;E ; A. Kojnok 12-Aug-85TE ; Corrected the CHKERR subroutine. The poll flag was set RF ; and cleared incorrectly. Removed clearing the CS.POL A ; flag bit from PDMDON interrupt service entry routine and A ; put it in FNINI routine. ;S ; A. Kojnok 20-Aug-85MF ; Added test to INIXM routine to see if a transmission is H ; already in progress. If yes, wait for transmit interrupt ( ; to initiate next transmit. ;d ; A. Kojnok 22-Oct-85jN ; New code was added to the XMTINT routine to replace the call to O ; GTPST subroutine. The code was added to test for the case where M ; the port was close before the xmit has been completed. In suchtL ; a case the Port Status Table addr saved in the task header is 6 ; zero and will cuase the driver to crash. ;l ; A. Kojnok 22-Oct-85 M ; The time out value for the reset function in CTINI routine has M ; been changed to the time out value used for self test. This iseK ; due because the DELUA for the reset tests if a self test has A ; already been run. If not, a self test is executed.r ;  ; L. Kogan 15-Nov-85 2.01t9 ; LK705 -- Added Adam Kojnok's changes to RSX packst ;sA;dBC >D .SBTTL ****************************************************>E .SBTTL * UNA Driver Data Structures And Offset Definitions*>F .SBTTL ****************************************************GH.IF NDF L$LISTI .IIF NDF L$$IST,.NLISTiJ .IIF NDF L$$IST,.DSABL CRFhK.ENDCoLM .SBTTL Register ConventionsN;2O; **********************************************2P; * Register Conventions used by this driver *2Q; **********************************************R;kS;6T; R5 = Almost always points to the Port State Table<U; R4 = Almost always points to the Controller State TableV; R3 = I/O packetW; R2 = Work register*;X; R1 = Ring routines use it to return ring entry address$Y; R0 = Work register.Z;i[\ ] .SBTTL Local Macros^;D_; INTERNAL MACRO DEFINITIONS`;sa.MACRO .DSECT START,CREFb.IIF B , .DSABL CRF*c.IIF DF L$$IST, .DSABL CRFd.ASECTe. = 0 f.IIF DF L$$IST, .ENABL CRFg.IIF B , .ENABL CRFkh.IF NB i. = START j.ENDC k.ENDM .DSECTlm.MACRO .BSECT START,CREFn.IIF B , .DSABL CRFTo.IIF DF L$$IST, .DSABL CRFp.ASECTq. = 1er.IF IDN , s. = 400 t.ENDCnu.IIF DF L$$IST, .ENABL CRFv.IIF B , .ENABL CRFw.ENDM .BSECTxy.MACRO .ASSUME ARG1,COND,ARG2Nz.IF COND -{.IFF |.ERROR ARG1 ;"COND ARG2" fails}.ENDCF~.ENDM .ASSUMEL€.MACRO APR5PC SUBNAM�PC$$$$=.-IMPUR‚.IF GT 20000-PC$$$$Fƒ.IFF9„.ERROR ; Subroutine "SUBNAM" out of APR5 address spaceD….ENDC†.ENDM APR5PC‡ˆ .MACRO $QPKT,QUEUE,‰ JSR R0,QPAKTIŠ .WORD QUEUEA‹ .ENDM $QPKTŒ� .MACRO $DQPKT,QUEUEŽ JSR R0,DQPAK0� .WORD QUEUEI� .ENDM $DQPKTA‘’ “ .SBTTL UNA conditionals”;D•; UNA conditionals–;U6—KISAR5 = 172352 ; Kernel instruction PAR 5 address6˜KISAR6 = 172354 ; Kernel instruction PAR 6 address™/šKDSAR5 = 172372 ; Kernel data PAR 5 addressI/›KDSAR6 = 172374 ; Kernel data PAR 6 addresseœ=� .IIF NDF U$$NCT .ERROR ; Number of controllers not definedFž .IIF NDF U$$NPC .ERROR ; Number of ports per controller not defined9Ÿ .IIF NDF U$$NRS .ERROR ; Receive ring size not defined :  .IIF NDF U$$NTS .ERROR ; Transmit ring size not defined¡;¢ .ASSUME U$$NCT GE 1 ; Number of controllers must be GE 1l@£ .ASSUME U$$NPC GE 1 ; Number of ports/controller must be GE 17¤ .ASSUME U$$NRS GE 1 ; Receive ring size must be GE 1A8¥ .ASSUME U$$NTS GE 1 ; Transmit ring size must be GE 1¦§ ¨ .SBTTL System macros ©,ª .MCALL PKTDF$,UCBDF$,DLXDF$,CHRDF$,EPMDF$%« .MCALL TCBDF$,SCBDF$,PCBDF$,HDRDF$t¬ ­ .IF DF R$$MPL ; If RSX-11M+®¯ .MCALL KRBDF$,CTBDF$o°'± CTBDF$ ; Controller Table Offsetsm!² KRBDF$ ; Define KRB offsetsS³´ .ENDCµ(¶ PKTDF$ ; Define I/O packet offsets!· UCBDF$ ; Define UCB offsetss!¸ DLXDF$ ; Define DLX offsetsE'¹ CHRDF$ ; Define other DLX offsetsG,º EPMDF$ ; Ethernet protocol module defs!» TCBDF$ ; Define TCB offsetsT(¼ SCBDF$ ,,SYSDEF ; Define SCB offsets!½ PCBDF$ ; Define PCB offsets )¾ HDRDF$ ; Define Task Header offsets ¿À ; Á .SBTTL Controller State TableÂÃ;-JÄ; Controller state table offsets. The controller state table resides atFÅ; the beginning of the driver for APR5 mapping reasons. Some of theMÆ; controller state table buffers reside in the permanently mapped with UMRs;IÇ; region at the end of the driver. Each of these buffers have pointersÈ; to them in the table.sÉ;+ Ê .DSECT,#ËC.FLAG: .BLKW 1 ; UNA flags byteF1Ì ; UNA software flag bits (used in C.FLAG)a-Í CS.PWF = 2 ; Power fail processing flagl1Î CS.SER = 10 ; Status error encounterede)Ï CS.INT = 40 ; Interrupt pendinge6Ð CS.ENP = 100 ; Receive end packet encountered1Ñ CS.POL = 200 ; UNA poll function neededf'Ò CS.GST = 400 ; Get status nexth=Ó CS.INI = 1000 ; Controller initialization in progressf&Ô CS.STP = 2000 ; Device stopped+Õ CS.OFL = 100000 ; Controller offline;Ö2×C.OPRT: .BLKW 1 ; Count of number of ports open(ØC.PORT: .BLKW 1 ; Port list ROOT word,ÙC.PROL: .BLKW 2 ; Protocol list root word3ÚC.PCBP: .BLKW 1 ; UNA Port Control Block pointere2ÛC.UDBP: .BLKW 1 ; UNA Unibus Data Block pointer9ÜC.INIW: .BLKW 1 ; Controller init completed wait queuei-ÝC.RTRY: .BLKW 1 ; Initialize retry countern%ÞC.INDX: .BLKW 1 ; Controller indexrßà;zJá; These pointers are used by the diagnostic non-DLX function processors.â;;-ãC.KIR6: .BLKW 1 ; Non-DLX KISAR6 save area;.äC.DGBP: .BLKW 1 ; Diagnostic buffer pointer2åC.DGBE: .BLKW 1 ; Diagnostic buffer end pointer7æC.DGBS: .BLKW 1 ; Start address of diagnostic buffer çè;n?é; These pointers are used by the function processing routinesWê;K8ëC.CFNC: .BLKW 1 ; Address of I/O packet for which the/ì ; ... current function is being performedKAíC.FUNS: .BLKW 1 ; Current primary/secondary function save areat3îC.PFNC: .BLKW 1 ; Pending control function queue.+ïC.CTMR: .BLKW 1 ; Control function timerðñ;B-ò; RECEIVE PROCESSING POINTERS AND WORK AREABó; *ôC.RCVB: .BLKW 1 ; RCV ring base address/õC.RCVF: .BLKW 1 ; RCV ring next free address3öC.RCVC: .BLKW 1 ; RCV ring current entry addressr(÷C.RSEQ: .BLKW 1 ; RCV sequence number00³ºƒœƒ_ƒt÷tø tþfDATAø#ùC.RCVW: .BLKW 1 ; RCV wait queue+úC.RCVD: .BLKW 1 ; RCV pending completione,ûC.RBFL: .BLKW 1 ; RCV receive buffer list5üC.RML: .BLKW 1 ; RCV received message lengthc0ýC.POVH: .BLKW 1 ; RCV protocol overhead9þC.STRT: .BLKW 1 ; RCV Start buffer addr of current rcvRÿ;K/; TRANSMIT PROCESSING POINTERS AND WORK AREASa;s*C.XMTB: .BLKW 1 ; XMT ring base address5C.XMTF: .BLKW 1 ; XMT ring next free entry addressr3C.XMTC: .BLKW 1 ; XMT ring current entry address4C.XSEQ: .BLKW 1 ; XMT ring entry sequence numbersC.XMTT: .BLKW 1 ; XMT timer3 C.XMWQ: .BLKW 1 ; XMT FIFO I/O packet wait queue11 C.XMTP: .BLKW 1 ; XMT pending completion queueB > C.XHDR: .BLKW 1 ; XMT dest-source-protocol-byte.count+  ; buffers list (Transmit Headers)R;T!; CONTROLLER INTERNAL SAVE AREAa;s* ; Controller internal info save area3C.LOAD: .BLKW 1 ; Work area during load + C.PADDs1C.PADD: .BLKW 3 ; Node address (SEE C.LOAD!!!)r-C.MODE: .BLKW 1 ; UNA default MODE (14001)n. ; UNA will pad short transmit messages% ; Enable H4000 collision testt! ; Enable Half Duplex modeX'C.MCDV: .BLKW 1 ; Micro code versionR4C.MLT: .BLKW 1 ; # of multicast addresses enabled.C.PSTA: ; Last read port status save area.C.RREV: .BLKW 1 ; Microcode revision number/C.MMAX: .BLKW 1 ; Max number of mulicast IDs 5C.MXCT: .BLKW 1 ; Max length of counter data blockB& C.WRKP: .BLKW 1 ; Work area pointer! " .IF DF R$$MPL ; If RSX-11M+#2$C.CTB: .BLKW 1 ; CTB - Controller Table for KRB2%C.KRB: .BLKW 1 ; KRB - Controller Request Block&' .ENDC(,)C.UCB: .BLKW 1 ; UCB - Unit Control Block.*C.SCB: .BLKW 1 ; SCB - Status Control Block6+C.DCB: .BLKW 1 ; DCB - Device Control Block Address+,C.CSR: .BLKW 1 ; CSR for this controllerb&-C.LOG: .BLKW 10. ; Error log packet+.C.LEN =. ; Controller DState Table size /0 r"1 .SBTTL Port State Table Offsets2;r3; Port State Table Offsets4;L 5 .DSECT-(6P.NXTP: .BLKW 1 ; Next port link word#7P.FLAG: .BLKW 1 ; Port flag word %8 PS.OPN = 1 ; Port open flag bit>9 PS.DER = 2 ; Delayed error - Dropped a received message8: PS.XIN = 4 ; Line requires init function (IO.XIN)"; PS.ADR = 10 ; Address found#< PS.PRO = 20 ; Protocol foundc+= PS.MLC = 40 ; Multicast list changeda'>P.PTCB: .BLKW 1 ; Owning TCB addressb?P.LUN: .BLKW 1 ; Owning LUN'@P.MCST: .BLKW 2 ; Multicast listheadaA;bKB; Used by Auxilliary buffer processor to save addr info for driver duringLC; transmit processing.D;<EP.XDAD: .BLKW 3 ; Holds Ethernet address for transmission=FP.XPRO: .BLKW 1 ; Holds Ethernet protocol for transmissioniG;qKH; Used by Auxilliary buffer processor to save addr info for driver during=I; receive processing.J;.@KP.RDAD: .BLKW 3 ; Holds Ethernet destination addr for receive@LP.RSAD: .BLKW 3 ; Holds Ethernet destination addr for receive8MP.RPRO: .BLKW 1 ; Holds Ethernet protocol for receiveN'OP.RCVT: .BLKW 1 ; Receive timer saven3PP.CTBL: .BLKW 1 ; Controller state table pointer &QP.WORK: .BLKW 4 ; General work area'RP.LENG: ; Port data structure sizerST U .SBTTL Protocol entry offsetsV;i W; Define protocol list entriesX;f Y .DSECTrZPL.LNK: .BLKW 1 ; Link word#[PL.FLG: .BLKB 1 ; Protocol flagsE/\ LF.EXC = LF$EXC ; Exclusive access protocolB*] LF.DEF = LF$DEF ; Default user defined/^ LF.PAD = LF$PAD ; Protocol requires paddingt_PL.USE: .BLKB 1 ; Use count`PL.PRO: .BLKW 1 ; Protocol&aPL.DEF: ; Pointer to default port.bPL.EXC: .BLKW 1 ; Pointer to exclusive port+cPL.ADD: .BLKW 2 ; Address chain listheadr,dPL.LEN: ; Length of protocol list entryef%g .SBTTL Address chain entry offsets.h;ri; Address chain entries j; k .DSECTBlAD.LNK: .BLKW 1 ; Link word%mAD.ADD: .BLKW 3 ; Ethernet addresso+nAD.PRT: .BLKW 1 ; Address of owning portd)oAD.LEN: ; Addre00³ƒ—ƒ9ƒ´cÚµcÛ¶c�·c›’ss chain entry lengthapq'r .SBTTL Multicast address chain entry st;;#u; Multicast address chain entries v;l w .DSECTL!xML.LNK: .BLKW 1 ; Link pointerv&yML.ADD: .BLKW 3 ; Multicast address3zML.LEN: ; Multicast address chain entry lengthe{|,} .SBTTL UNA hardware interface definitions~;2; UNA CSR/Data Structure Offsets and Definitions€;B�; CSR offsetsd‚;D ƒ .DSECT „PCSR0: .BLKW ; Primary CSR*…PCSR1: .BLKW ; State and self-test CSR%†PCSR2: .BLKW ; Buffer address CSR0‡PCSR3: .BLKW ; Buffer address (extended) CSRˆ;;‰; PCSR0 bit definitionsiŠ;r,‹R0.SEI = 100000 ; Status Error Interrupt-ŒR0.CEI = 40000 ; Command Error Interruptd,�R0.RXI = 20000 ; Receive Ring Interrupt-ŽR0.TXI = 10000 ; Transmit Ring Interruptt/�R0.CSI = 4000 ; Command Success Interruptu:�R0.RUI = 2000 ; Receive Buffer Unavailable Interrupt‘R0.RSV = 1000 ; RESERVED+’R0.FEI = 400 ; Fatal Error Interrupte+“R0.INT = 200 ; Interrupt Summary Bit*”R0.IE = 100 ; Interrupt Enable Bit#•R0.RST = 40 ; UNA Reset Bitn,–R0.RMT = 20 ; UNA Remote Console Bit&—R0.PCM = 17 ; UNA Command Bits˜; #™; UNA primary command definitionseš;i›CM.NOP = 0 ; NOP,œCM.GPB = 1 ; Get Control Block Address,�CM.GCM = 2 ; Get Control Block Command$žCM.SLF = 3 ; Self Test Command)ŸCM.STR = 4 ; Start Transmit/ReceiveE CM.BOO = 5 ; Boot Command !¡CM.PDM = 10 ; Polling Demand "¢CM.TMO = 11 ; Sanity Timer On#£CM.TMF = 12 ; Sanity Timer Off%¤CM.TMR = 13 ; Sanity Timer Reset0%¥CM.STP = 17 ; Stop UNA Operationt¦§#¨ .SBTTL CSR1 register definitions ©; ª; PCSR1 bit definitionsi«;.¬R1.PWR = 100000 ; Transceiver Power Status­ ; 0 = failure, 1 = OK$®R1.CAB = 40000 ; Cabling Status¯ ; 0 = failure, 1 = OK 1°R1.SLF = 37400 ; Self-test Return Code Fielde'±R1.CER = 200 ; Command Error Bit%²R1.STA = 7 ; UNA State FieldT³´; +µ; UNA hardware state bits (Used in C.STA) ¶; ·ST.RST = 0 ; Reset State%¸ST.PRI = 1 ; Primary Load StateN¹ST.RDY = 2 ; Ready State ºST.RUN = 3 ; Running State&»ST.UHL = 5 ; UNIBUS Halted State"¼ST.NHL = 6 ; NI Halted State-½ST.HLT = 7 ; UNIBUS and NI Halted State ¾¿(À .SBTTL UNA Port Control Block offsetsÁ;Â; Port Control Block offsetsÃ;n Ä .DSECTe"ÅCB.CMD: .BLKB 1 ; Function Byte&ÆCB.MBZ: .BLKB 1 ; Must Be Zero Byte)ÇCB.ADD: ; Physical Address(1st word)t.ÈCB.UDB: .BLKW 1 ; UNIBUS Data Block Address4ÉCB.MAX: ; Max multicast addr allowed for device3ÊCB.UD2: ; UNIBUS Data Block Address (Extended)g/ËCB.AD2: .BLKB 1 ; Physical Address(2nd word))ÌCB.LEN: .BLKB 1 ; Length of Data Block -ÍCB.LN2: ; Alternate Length of Data Block/ÎCB.AD3: .BLKW 1 ; Physical Address(3rd word) &ÏCB.SIZ: ; Port Control Block SizeÐÑÒ .SBTTL Ring Descriptor BlockÓÔ; <Õ; Ring Descriptor Block (Used for codes FN.RRG and FN.WRG)Ö;o × .DSECTU/ØRD.XMB: .BLKW 1 ; Transmit Ring Base AddressX2ÙRD.XME: .BLKB 1 ; Transmit Ring Base (Extended)/ÚRD.XML: .BLKB 1 ; Transmit Ring Entry Length4ÛRD.XMN: .BLKW 1 ; Transmit Ring Number of Entries.ÜRD.RCB: .BLKW 1 ; Receive Ring Base Address9ÝRD.RCE: .BLKB 1 ; Receive Ring Base Address (Extended)P.ÞRD.RCL: .BLKB 1 ; Receive Ring Entry Length3ßRD.RCN: .BLKW 1 ; Receive Ring Number of Entries )àRD.SIZ: ; Ring Discriptor Block Size áâã .SBTTL Line status bitsäå;.7æ; Line status bits (Used for codes FN.RLS and FN.CLS)ç;X/èLS.ERR = 100000 ; Logical OR of Status BitsD)éLS.MER = 40000 ; Multiple Errors Bit-êLS.CDF = 20000 ; Collision Detect FailedE"ëLS.RSV = 10000 ; Reserved Bit#ìLS.TME = 4000 ; Timeout Error )íLS.RRE = 1000 ; Receiver Ring Error)îLS.XRE = 400 ; Transmit Ring Errorh%ïLS.RAM = 100 ; RAM operationalb#ðLS.REV = 77 ; ROM REV Leveliñòó .SBTT00³ʃœƒ_ƒt÷tø tþfDATAL Ring entry offsetsôõ;aö; Ring entry offsets÷;s ø .DSECT(#ùRG.LEN: .BLKW 1 ; Segment Length$úRG.ADD: .BLKW 1 ; Segment Address/ûRG.AD2: .BLKB 1 ; Segment Address (Extended)rüRG.FLG: .BLKB 1 ; Flags Byteo,ýRG.RLN: .BLKB 1 ; Received Message Length1þRG.ERR: .BLKB 1 ; Error Word (and TDR or MLEN)0ÿRG.ACT: .BLKB 1 ; Ring Entry Active Flag Byte/RG.SEQ: .BLKB 1 ; Ring Entry Sequence Number ;RG.UMR: .BLKW 1 ; UMR assignment block save during xmitse6RG.VAD: .BLKW 1 ; Virtual Address of receive buffer)RG.LNK: .BLKW 1 ; Ring Entry Link WordLRG.SIZ: ; Ring Entry Size; "; Ring flag byte bit definitions;K% RF.OWN = 200 ; UNA Ownership BitG)  ; 0=Owned by driver, 1=Owned by UNAK& RF.ERR = 100 ; Combined Error Bit) RF.FRM = 40 ; Receive Framing Error* RF.OFL = 20 ; Receive Overflow Error4RF.MOR = 20 ; Transmit Multiple Retries Needed%RF.CRC = 10 ; Receive CRC Errorl-RF.ONE = 10 ; Transmit One Retry Neededr=RF.MLT = 4 ; Receive No Multicast Error(Set by driver) ,RF.DEF = 4 ; Transmit Packet Deferred#RF.STP = 2 ; Start of Packett!RF.ENP = 1 ; End of Packet ;RF.OPN = 200 ; Open circuit(Set by driver in low byte)<RF.SHT = 100 ; Short circuit(Set by driver in low byte);r#; Ring error word bit definitionse;v)RE.BFL = 100000 ; Buffer Length ErrorM*RE.UTO = 40000 ; UNIBUS Timeout Error3RE.NCH = 20000 ; No Data Chaining Enabled(RCV)R/RE.LCL = 10000 ; Late Collision Error(XMT)i0RE.LCR = 4000 ; Loss of Carrier Error(XMT)2RE.RTY = 2000 ; Retries Execeeded Error(XMT)9 RE.CIR = 14000 ; Short or Open Circuit (w/TDR value)0"!RE.TDR = 1777 ; TDR Bit Mask6"RE.MLN = 7777 ; Received Message Length Bit Mask#$"% .SBTTL UNA MODE bit definitions&';i(; UNA MODE bit definitions0);u9*MD.PRM = 100000 ; UNA will accept all incoming framesr:+MD.ENL = 40000 ; UNA will accept all multicast frames3,MD.DRC = 20000 ; Disable receive data chainingL:-MD.TPD = 10000 ; UNA will pad short transmit messages1.MD.ECT = 4000 ; Enable H4000 collision test0:/MD.DMT = 1000 ; Disable maintainence messages (loop,,0 ; boot, request ID, memory load)*1MD.DTC = 10 ; Disable transmit CRC02MD.LOO = 4 ; Enable controller loopback-3MD.HDX = 1 ; Enable Half Duplex mode 4526 .SBTTL DIAGNOSTIC (non DLX functions) FUNCTIONS78;l,9; DIAGNOSTIC (non DLX functions) FUNCTIONS:; F;; The following diagnostic functions will have the following format:<;s=; C.TYP = Function code0>; C.DATI = Not Used/?; C.DATO = Size of buffer starting at C.CHRLn&@; C.STAT = Status Code (See CHRDF$))A; C.CHRL = Start of Input/Ouput Buffer B; C; OCTAL WORDSOD; BUFFER SIZE$E; FUNCTION REQUIREDF;lG;lH; CONTROL BLOCK FUNCTIONSII;T'JFN.NOP = 0 ; NOP Function 33l4KFN.LSM = 1 ; Load and Start Microaddress 16LFN.RDA = 2 ; Read Default Physical Address 3/MFN.RPA = 4 ; Read Physical Address 30/NFN.WPA = 5 ; Write Physical Address 3u6OFN.RML = 6 ; Read Multicast List From UNA 368PFN.WML = 7 ; Write Multicast List To UNA (illegal)7QFN.RRG = 10 ; Read Ring Format (illegal)I7RFN.WRG = 11 ; Write Ring Format (illegal) (SFN.RCN = 12 ; Read Counters 400TFN.CCN = 13 ; Read and Clear Counters 40(UFN.RMD = 14 ; Read UNA Mode 1(VFN.WMD = 15 ; Write UNA Mode 1*WFN.RLS = 16 ; Read Line Status 106XFN.CLS = 17 ; Read and Clear Line Status 10$YFN.DMP = 20 ; Dump Internal RAM$ZFN.LOA = 21 ; Load Internal RAM/[FN.RSY = 22 ; Read System ID Max 144N0\FN.WSY = 23 ; Write System ID Max 1441]FN.RSA = 24 ; Read Load Server Address 3i6^FN.WSA = 25 ; Write Load Server Address 3_`; Software functionsa'bFN.DIG = 26 ; G00³Òƒ—ƒ9ƒ´cÚµcÛ¶c�·c›’et Diagnostic Data. .c ; This function code is used to dispatch1d ; ... to the diagnostic functions processor2eFN.UML = 27 ; UNA microcode support task wait.)f ; This function is used to time out-g ; ... a response from the support task. hi+j .SBTTL Receive Buffer Offset Definitions k;i%l; Receive Buffer Offset Definitions m;; n .DSECTSoM.LNK: .BLKW 1 ; Link word &pM.ERR: .BLKW 1 ; Error status bytes-q ; Low byte = RDRB+5, High byte = RDRB+7 3r ; (RDRB means Receive Descriptor Ring Buffer) ,sM.MLEN: .BLKW 1 ; Lenth of data in buffer(tM.DADD: .BLKW 3 ; Destination address#uM.SADD: .BLKW 3 ; Source addressivM.PRO: .BLKW 1 ; Protocol/wM.DATA: .BLKW 1 ; Start of data (No padding) )xM.PDTA: .BLKW 1 ; Start of padded datauy .BLKW 255. ; Data bufferz .BLKW 2 ; Room for CRC4{M.DBSZ = .-M.DATA ; Receive data buffer area size"|M.SIZE: ; Receive buffer size}~' .SBTTL Other offsets and definitionse€�; ‚; Timer valuesƒ;e2„RSTIM = 10 ; Timeout value for reset command.…SLFTIM = 16 ; Timeout value for self-test5†CNTTIM = 2 ; Timeout value for control functionsi.‡XMTTIM = 30 ; Timeout value for transmits7ˆUMLTIM = 180. ; UNA microcode support task responsea‰ ; ... timeout value.2ŠRETRYC = 3 ; Controller initialize retry count‹$Œ .IF NDF R$$MPL ; If NOT RSX-11M+�6ŽU.UCBX = U.CNT ; Define U.UCBX for none M+ systems�� .ENDC ; R$$MPLi-‘SENDBK = 8. ; Send and request block sizeS’)“FCOPN = 33 ; Open function code value”•; –; Maximum trasmit buffer sizee—;7˜; 1518.-M™; <šXMTBSZ = 1518.-<6+6+2+2+4> ; Maximum transmit buffer size2›UMRWBS = 20. ; UMR wait block size 10. wordsœ;u�; DEFINE BITS ž;nŸBIT0 = 1r BIT1 = 2.¡BIT2 = 4 ¢BIT3 = 10£BIT4 = 20D¤BIT5 = 40n¥BIT6 = 100¦BIT7 = 200§BIT8 = 400e¨BIT9 = 1000k©BIT10 = 2000ªBIT11 = 4000«BIT12 = 10000¬BIT13 = 20000­BIT14 = 40000®BIT15 = 100000¯°+± .SBTTL Error Log Definitions and OffsetsM²; ³; Error log types ´;u&µER.SER = 1 ; Status Error Interrupt'¶ER.STC = 2 ; Status Change Interrupt·ER.RCV = 3 ; Receive Error ¸ER.XMT = 4 ; Transmit Error4¹ER.RBU = 5 ; Receive Buffer Unavailable Interrupt+ºER.FCI = 6 ; Fatal controller initialize»;7¼; Error log offsets=½;0 ¾ .DSECT (¿E.LENG: .BLKW 1 ; Error packet lengthÀE.TYPE: .BLKB 1 ; Error typeI&ÁE.TMO: .BLKB 1 ; Time out flag byteÂE.CSR0: .BLKW 1 ; PCSR0ÃE.CSR1: .BLKW 1 ; PCSR1&ÄE.PCB: .BLKW 4 ; Port control block3ÅE.FLG: .BLKB 1 ; Flag byte of xmt/rcb ring entryS4ÆE.ERR: .BLKB 1 ; Error byte of xmt/rcv ring entryÇE.MODE: .BLKW 1 ; Mode bits#ÈE.SIZE: ; Size of error packet ÉÊË l*Ì .SBTTL UMR mapped communications regionÍ;iJÎ; This area consists of various buffers that must reside in a UMR mappedKÏ; region. Therefore, these buffers will be a part of the permanently UMR HÐ; mapped region after the driver code. The controller state table has1Ñ; pointers that point to each of these buffers.:Ò;B,ÓC.WKSZ = 140. ; Controler work area size Ô .DSECT =ÕC.PCB: .BLKB CB.SIZ ; UNA Port Control Block Buffer (PCBB)i=ÖC.UDB: .BLKB RD.SIZ ; UNA Unibus Data Block Buffer (UDBB)T-×C.RRNG: .BLKB U$$NRS*RG.SIZ ; RCV ring areahNØC.XRNG: .BLKB *2; XMT ring area (2 entries for each transmit).ÙC.XHED: ; Start of transmit header bufferÚ .REPT U$$NTS ;=Û .BLKB 2+6+6+2+2 ; XMT Link-Dest-Source-Protocol-Byte.counttÜ ; ... bufferssÝ .ENDRÞ .BLKW C.WKSZ ; Work buffer+ßC.BASZ: ; UMR mapped buffers area sizeiàáâ $ã .SBTTL I/O Packet Usage By Driverä; å; I/O Packet extension offsetsæ;.0çIP.EXT = I.PRM ; I/O packet extension pointerè é .DSECTN1êIX.ADR: .BLKW 1 ; I/O buffer addr (high order)*<ëIX.AUX: .BLKW 1 00³Úƒœƒ_ƒt÷tø tþfDATA ; APR6 bias of Aux.characteristics buffer<ìIX.DIG: .BLKW 1 ; APR6 bias of optional diagnostic buffer/íIX.FCN: .BLKW 1 ; Non-DLX function save areal(îIXSIZE: ; I/O packet extension sizeïð;Lñ;Wò; I/P Packet Parameter Area Mó; +-----------------------------------------------------------------------+rMô; |Extn Ptr| P1 | Size | P2 | Size | P3 | Size |Not used|kMõ; +-----------------------------------------------------------------------+hö; I.PRM |;÷; | +- Low 16 bits of buffers physical address ø; |A"ù; | I/O Packet Extension2ú; | +-----------------------------------+2û; +--> |P1 Bias |P2 Bias |P3 Bias |Scratch |-ü; +-------------------------------------+- ý; | V.þ; | +- High bits of P1 physical addressÿ; |; V ; IX.PRM; ; I/O Packet Use For RECEIVESz; ===========================-;-; While in receive wait queue-; --------------------------- ;|! ; I.FCN - Receive wait timerfF ; I.PRM - This word will be pointing to the I/O packet extension.9 ; I.PRM+2 - I/O status save when receive is completed. " ; I.PRM+4 - Receive byte count.* ; IX.FCN - Hold address of owning port;- ; While in function wait queue ; ----------------------------;F; I.PRM - This word will be pointing to the I/O packet extension.; IX.FCN - Function code.-;- ; I/O Packet Use For TRANSMITS ; ============================;|; While in transmit queues; ------------------------;l; I.FCN - Retry countF; I.PRM - This word will be pointing to the I/O packet extension.;; I.PRM+2 - I/O status save when transmit has completed.d&; I.PRM+4 - Transmitted byte count.E; IX.FCN - Holds protocol flag bits while in transmit wait queue. C ; IX.FCN - Holds the following while in transmit pending queue:F4!; Low byte = flag byte of transmit ring entry6"; High byte = error byte of transmit ring entry#;n$; While in Function Queue-%; -----------------------.&; '; I.FCN - Retry counterK(; I.PRM - This word will be pointing to the I/O packet extension. ThesE); I/O packet extension will be used to store the relocationt3*; bias for each buffer in the I/O packet.l+; IX.FCN - Function code. ,;N.-; I/O Packet Use For SET/GET CHARACTERISTICS..; ==========================================/; K0; I.PRM - This word will be pointing to the I/O packet extension. The C1; I/O packet extension will be used to store the relocationC12; bias for each buffer in the I/O packet. <3; IX.FCN - Function code. (when setting multi cast addr)4;k95; I/O Packet Use For CONTROL FUNCTION (Micro code load) 96; =====================================================-7;t#8; I.PRM - I/O packet extensionF(9; I.PRM+2 - Virtual address of buffer:; I.PRM+4 - Buffer size';; I.PRM+6 - End of buffer +1 pointer <;i=; IX.FCN - Functionx>;o?@A.IF NDF L$LISTB .IIF NDF L$$IST,.LISTC .IIF NDF L$$IST,.ENABL CRF D.ENDCsE>F .SBTTL ****************************************************>G .SBTTL * UNA QIO Processing Routines *>H .SBTTL ****************************************************IJ .PSECT ; UNA driver PSECT!KL$LIST = 0 ; List prefix file'LUNAST: ; UNA driver start addressM ; *** NOTE ***i&N ; This module must be the first%O ; ... module in the task buildPQ R .SBTTL Driver Impure AreaST;+U; Driver Impure AreaV;-WIMPUR:8X .REPT U$$NCT ; Make room for controller state tables:Y .BLKB C.LEN+ ; ... and port state tablesZ .ENDR [IMPRE: ; End of impure area\B]RELCT: .WORD -1,-1 ; Relocation constant used to compute Unibus3^ ; ... address within the UMR mapped region of 1_ ; ... the driver. Initially -1 to indicate*+` ; ... driver needs to be initialized.a(b .IF NDF R$$MPL ; If NOT 00³âƒ—ƒ9ƒ´cÚµcÛ¶c�·c›’RSX-11M-PLUSc=dCNTBL: .BLKW U$$NCT ; UCB save table for interrupt serviceef .ENDC ; R$$MPL$g@hCTABL: .BLKW U$$NCT ; Controller Table Pointers. Indexed viai ; ... controller index.l,jENDCTB: .WORD 0 ; End of controller table$kDAPR6: .BLKW 1 ; Driver APR6 save-lUABKS: .WORD 0 ; UMR assignment block save -mMLTCB: .WORD 0 ; Microcode loader TCB save @nCVIRA: .WORD CBASE ; Virtual address of CBASE. used by UNAIN.o;pCACUM: .WORD 0 ; Time accumulator, used by CLOCK routine-)qCLKBK: .WORD 0 ; Clock Block save area ?rCTPTR: .WORD 0 ; Current controller pointer. Used by CLOCK.B&sCLKFG: .BYTE 0 ; Clock running flagt .EVENuv .IF DF R$$MPL<wCSCRET: .BLKW 1 ; Controller Status Change return addressx .ENDCyz{ (| .SBTTL $XETBL - Driver dispatch table}(~$XETBL::.WORD XEINI ; Initialization .WORD XECAN ; Cancel I/OR€ .WORD XETMO ; Timeout� .WORD XEPWF ; Powerfail‚ƒ .IF DF R$$MPL„+… .WORD XECSC ; Controller status changeL2† .WORD XETMO ; Unit status change (do nothing)&‡ .ASCII /XE/ ; Generic device name)ˆ .WORD $XEINT ; Interrupt entry pointn%‰ .WORD 0 ; End of interrupt entryL0ŠXECTB: .WORD 0 ; Pointer to KRB table in CTB"‹$XETBE::.WORD 0 ; End of tableŒ� .ENDCŽ�;+I�; QIO$ validation table. Each entry consistes of two words as follows:X‘; ’; .BYTE SUB FUNCTION MASKOF“; .BYTE BIT 200 SET --> FUNCTION INVALID IF LUN NOT ALREADY IN USE ”; (NO OPEN HAS BEEN ISSUED)'•; .WORD ADDRESS OF FUNCTION PROCESSORc–;-—5˜QIOTBL: .WORD 100370,XECLN ; Close LUN (FC = 7)O3™ .WORD 100370,XEXMT ; Write (FC = 31, IO.XTM)E2š .WORD 100370,XERCV ; Read (FC = 32, IO.XRC)2› .WORD 000370,XEOPN ; Open (FC = 33, IO.XOP)3œ .WORD 100160,XETRM ; Close (FC = 34, IO.XTR)l7� .WORD 100370,XEINL ; Initialise (FC = 35, IO.XIN)4ž .WORD 000200,XECTL ; Control (FC = 36, IO.XTL):Ÿ .WORD 100360,XECHR ; Characteristics (FC = 37, IO.XCH) ¡ E)¢ .SBTTL XEINI - I/O request initiationR£;+#¤; **-XEINI-I/O request initiationX¥; I¦; This routine is entered from the EXEC when an I/O packet is availableMG§; for processing. The request parameters must be validated within theE ¨; context of the calling task.©;Oª; NOTED«; UC.QUE bit is set in U.CTL of the UCB. Therefore, the EXEC doesE¬; not queue requests for the driver. The driver itself keeps trackIC­; of the it's I/O packets. Thus the driver does not call $GTPKT.®;- ¯; Inputs:E"°; R1 = Address of the I/O packet(±; R4 = Address of status control block&²; R5 = Address of unit control block³; )´; Outputs: (to QIO processing routines)r,µ; R2 = LUN on which the request was issued¶; R3 = Address of I/O packet,·; R4 = Address of requesting task's header/¸; (Task header will be mapped on RSX11M-Plus)E1¹; R5 = Address of Port State Table (if present)hº;v#»XEINI: NOP ; Word for patching'¼½ .IF DF DEBUGt¾ BPT¿ .ENDCÀ)Á .IF NDF R$$MPL ; If NOT RSX-11M-PLUSdÂà MOV U.SCB(R5),R3 ; R3 = SCBe,Ä MOV S.CON(R3),R3 ; R3 = Controller index=Å MOV R5,CNTBL(R3) ; Save UCB pointer for interrupt routinetÆÇ .ENDC ; R$$MPLÈ'É CMP RELCT,#-1 ; Driver initialized?oÊ BEQ IEABO ; No=Ë+Ì MOV R1,R3 ; Copy address of I/O packeteÍ3Î MOV #IXSIZE,R1 ; Get I/O packet extension block Ï CALL $ALOCB ; ...+Ð BCS 70$ ; Resource allocation failure.hAÑ MOV I.PRM(R3),IX.ADR(R0) ; Save high address word in extension 1Ò MOV R0,IP.EXT(R3) ; Save I/O packet extension;(Ó CLR IX.FCN(R0) ; Clear function wordÔ%Õ CALL MPTHDR ; Map to task header *Ö ; On return, R0=Task Header address+× MOV I.LN2(R3),R2 ; Compute LUN on whichv$Ø SUB #H.LUN-2,R2 ; this requestÙ SUB R0,R2 ; was issueds(Ú ASR R2 ; Each entry is 4 bytes longÛ ASR R2 ; ...eÜ/Ý MOVB I.FCN+1(R3),R1 ; Get I/O function codeR0Þ BIC #^C<177>,R1 ; Isolate real function code/ß SUB #7,R1 ; Is this a 'close LUN' reque00³êƒœƒ_ƒt÷tø tþfDATAst?à BEQ 20$ ; If EQ, yesIá-â SUB #21,R1 ; Normalise to dispatch tablen"ã20$: ASL R1 ; Form table indexä ASL R1 ; ...6å ADD #QIOTBL,R1 ; Compute address in dispatch tableæ<ç MOV #IE.ONP&377,R0 ; Assume invalid subfunction bits set<è BITB I.FCN(R3),(R1)+ ; Any invalid subfunction bits set?é BNE 30$ ; If NE, yesRê3ë TSTB (R1)+ ; Should the LUN already be in use?nì BMI 40$ ; If MI, yes í2î MOV #IE.ALN&377,R0 ; Assume LUN already in use'ï TST @I.LN2(R3) ; Is the LUN in use? ð BEQ 60$ ; If EQ, noñ0ò30$: CALLR RQALT ; Complete request in erroró2ô40$: MOV #IE.IFC&377,R0 ; Assume LUN not in use7õ MOV @I.LN2(R3),R5 ; Get address of Port State Table3%ö BIC #1,R5 ; Remove LUN interlocks$÷ BEQ 30$ ; If EQ, LUN not in useø6ù CMP I.TCB(R3),P.PTCB(R5) ; Port owned by same task?8ú BNE NOTIF ; If NE, user abort notification required3û CMPB R2,P.LUN(R5) ; Still accessed on same LUN?;ü BNE NOTIF ; If NE, noý7þ50$: MOV P.CTBL(R5),R4 ; R4 = Controller State TableQÿ1 MOV #IE.DNR&377,R0 ; Assume device is stoppedr+ BIT #CS.STP,C.FLAG(R4) ; Device stopped?U+ BNE 30$ ; Yes, return device not readyr60$:* CALL MAPDRV ; Map to 2nd 4K of driver2 CALLR @(R1)+ ; Dispatch to processing routineF70$: MOV #+,R0 ; Resource allocation failure CLR R1 ; ...n#  CALLR $IOFIN ; Post completionN 9  APR5PC XEINI ; Make sure XEINI is in APR5 addr spaceo   M2 .SBTTL NOTIF - Deliver user abort notification;+,; **-NOTIF-Deliver user abort notification;BB; The physical link in use by this user has been taken over by aA; previleged task. Complete this I/O request in error and stopv,; further operation on this physical link.;- ; Inputs::; R3 = Address of I/O packet;R;NOTIF: CLR @I.LN2(R3) ; No further activity on this linkI;+3; **-IEABO-Complete I/O request with abort status ; 2; Complete the I/O request with an abort status. ;- !; Inputs:o"; R3 = Address of I/O packet#;r2$IEABO: MOV #IE.ABO&377,R0 ; Set up abort status % BR RQALTh&';+.(; **-ISSUC-Complete I/O request successfully); **-RQALT-Alternate entry*;d+; Complete the I/O request.n,;- -; Inputs:..; R3 = Address of I/O packet/;s40ISSUC: MOV #IS.SUC&377,R0 ; Set up success status(1RQALT: CLR R1 ; No additional status23;+#4; **-RQDON-Perform I/O completionu5;#6; Perform general I/O completion. 7;- 8; Inputs:!9; R0 = First word of I/O statuso":; R1 = Second word of I/O status;; R3 = Address of I/O packet<; =RQDON: MOV R4,-(SP) ; Save R43> MOV IP.EXT(R3),-(SP) ; Save I/O packet extensionr@? BIS #,R0 ; Tell user, this is a broadcast channel"@ CALL $IOFIN ; Post completion7A MOV (SP)+,R0 ; R0 = Address of I/O packet extensions3B MOV #IXSIZE,R1 ; R1 = I/O packet extension size-C CALL $DEACB ; Deallocate extension block D MOV (SP)+,R4 ; Restore R4 E RETURN ; Return to callerrFGH O6I .SBTTL XEOPN - Establish access to a physical linkJ;+0K; **-XEOPN-Establish access to a physical linkL;GM; This function is called to gain access to a specific physical link.>N;- O; Inputs:i,P; R2 = LUN on which the request was issuedQ; R3 = Address of I/O packetR; R4 = Controller State Tablee,S; I.PRM+1 - High byte of physical address.T; I.PRM+2 - Low 16 bits of physical address)U; I.PRM+4 - Length of stringRV; I.PRM+6 - Initial timeoutW; I.PRM+7 - Mode: (Ignored)X;- Y .ENABL LSBsZXEOPN:[ .IF DF DEBUG\ BPT] .ENDC^6_ CALL MAPBF ; Convert data buffer physical address(` ; ... to bias and virtual address*a CALL GTPRT ; Find and allocate a portb BCS RQALT ; If CS, errorc;3>d; R5 = Port Control Block, R4 = controller state table basee;M(f MOV #IE.NSF,R0 ; Assume line stopped/g BIT #CS.STP,C.FLAG(R4) ; Controller stopped?Ph BNE RQALT ; Yesi%j C00³òƒ—ƒ9ƒ´cÚµcÛ¶c�·c›’ALL MPTHDR ; Map to task headert/k MOV R5,@I.LN2(R3) ; Mark this LUN as active )l CALL MAPDRV ; Restore driver mappingm9n MOV I.TCB(R3),P.PTCB(R5) ; Save TCB in port save areae1o MOVB R2,P.LUN(R5) ; Set up owning TCB and LUNL:p MOVB I.PRM+6(R3),P.RCVT(R5) ; Save receive timer valueqCr MOV #PS.XIN!PS.OPN,P.FLAG(R5); Pretend link needs initialization s,t INC C.OPRT(R4) ; INC count of open ports;u MOVB I.PRM+6(R3),P.RCVT(R5) ; Save receive timeout countR1v BIS #PS.OPN,P.FLAG(R5) ; Indicate port is opena/w BIT #CS.OFL,C.FLAG(R4) ; Controller offline?t(x BNE 50$ ; Yes, try to initialize ity BR 20$ ; return successz9{ APR5PC XEOPN ; Make sure XEOPN is in APR5 addr space |} o~;+; **-XEINL-Initialise channel,€;TC�; This function is called to restart operation of a physical link)‚; following an error.iƒ;- „; Inputs:I…; R3 = Address of I/O packet†; I.PRM - Initial timeout‡; I.PRM+1 - Mode:ˆ; R4 = Controller State TableN:‰; R5 = Address of Port Status physical link access blockŠ; ŠXEINL:: ; LK705Œ .IF DF DEBUG ;**-1� BPTŽ .ENDC�:� BIT #PS.XIN,P.FLAG(R5) ; Port needs to be initialized?‘ BEQ 30$ ; No’?“ MOVB I.PRM+6(R3),P.RCVT(R5) ; Save timeout time for receives ”6• BIT #CS.OFL,C.FLAG(R4) ; Is the link state offline?– BNE 40$ ; If NE, yes —5˜ BIC #PS.XIN,P.FLAG(R5) ; Indicate line initializedi0™20$: CALLR ISSUC ; Otherwise, return successš1›30$: CALLR IEABO ; Abort the function requestcœ@�40$: MOVB @IP.EXT(R3),P.RCVT(R5) ; Save receive timeout valuež=Ÿ50$: $QPKT C.INIW ; Queue packet to initialize wait queueP 9¡60$: CALLR CTINI ; Initialize controller. Initialize +¢ ; .. will test if init already underr-£ ; .. way. If so, no action is taken.t)¤ ; .. Init complete will return I/OE¥ ; .. done on this item.¦9§ APR5PC XEINL ; Make sure XEINL is in APR5 addr spacer¨ © .DSABL LSBsª«¬ C$­ .SBTTL XETRM - Terminate channel® .SBTTL XECLN - Close LUN¯;+°; **-XETRM-Terminate channel±; **-XECLN-Close LUN²;I4³; This routine is called to close an open channel.´;- µ; Inputs:I"¶; R3 = Address of the I/O packet·; R4 = Controller State Tablee$¸; R5 = Address of Port State Table¹;tº»XECLN:¼½ .IF DF DEBUGm¾ BPT¿ .ENDCÀÁXETRM: .IF DF DEBUGià BPTÄ .ENDCÅ+Æ CLR P.FLAG(R5) ; Indicate port not openr.Ç DEC C.OPRT(R4) ; Decrement open port count6È CALL RLPRT ; Release port related data structuresÉ%Ê CALL MPTHDR ; Map to task header*<Ë BIC #1,@I.LN2(R3) ; Make sure LUN interlock bit is clearÌ; %Í; Return I/O requests for this portAÎ;s,Ï MOV R3,-(SP) ; Save I/O packet for close)Ð MOV R4,R2 ; Point to xmit wait queueeÑ ADD #C.XMWQ,R2 ; ...0Ò CALL 20$ ; Remove I/O packets for this port,Ó MOV R4,R2 ; Point to receive wait queueÔ ADD #C.RCVW,R2 ; ...0Õ CALL 20$ ; Remove I/O packets for this port-Ö MOV R4,R2 ; Point to function wait queuet× ADD #C.PFNC,R2 ; ...0Ø CALL 20$ ; Remove I/O packets for this port)Ù MOV R4,R2 ; Point to init wait queuecÚ ADD #C.INIW,R2 ; ...0Û CALL 20$ ; Remove I/O packets for this port/Ü MOV (SP)+,R3 ; Restore I/O packet for closetÝ'Þ CALL MPTHDR ; Map to task's header.4ß CLR @I.LN2(R3) ; Ensure no more I/O on this linkà/á BIT #CS.OFL,C.FLAG(R4) ; Controller offline?.â BNE 10$ ; yes6ã MOV #IS.SUC,I.PRM+2(R3) ; Save I/O status in packetä CLR I.PRM+4(R3) ; ...i6å CALLR STMLT ; Write Multicast addresses to deviceæ10$:!ç CALLR ISSUC ; Return success è*é20$: MOV (R2),R3 ; Get next I/O packetê BEQ 40$ ; No more'ë CALL MPTHDR ; Map to task's header(1ì CMP @I.LN2(R3),R5 ; I/O packet owned by port?Lí BNE 30$ ; No "î MOV (R3),(R2) ; Dequeue packetï MOV R2,-(SP) ; Save R2#ð CALL IEABO ; Abort the request 'ñ MOV (SP)+,R2 ; Restore list pointerò BR 20$ ; Look at next item ó+ô30$:00³úƒœƒ_ƒt÷tø tþfDATA MOV R3,R2 ; R2 points to next item#õ BR 20$ ; Continue to next itemdö$÷40$: RETURN ; Return after callø9ù APR5PC XECLN ; Make sure XECLN is in APR5 addr spacekúûü $ ý .SBTTL XEXMT - Transmit dataþ;+ÿ; **-XEXMT-Transmit data;,D; This function is called to transmit data from the physical link.;- ; Inputs:"; R3 = Address of the I/O packet;; I.PRM+1 - High byte of physical address of data buffer =; I.PRM+2 - Low 16 bits of physical address of data buffer2$; I.PRM+4 - Length of data bufferA; I.PRM+6 - Virtual address of optional characteristics buffera8 ; I.PRM+10- Length of optional characteristics buffer< ; I.PRM+12- Virtual address of optional diagnostic buffer3 ; I.PRM+14- Length of optional diagnostic buffer  ; R4 = Controller State Tableh! ; R5 = Address Port State Table; ;; I.PRM+1 - High byte of physical address of data bufferh=; I.PRM+2 - Low 16 bits of physical address of data bufferh;lXEXMT: .IF DF DEBUG BPT .ENDC3 CALL BFCHK ; Validate optional characteristicsn ; .. buffer BCS 70$ ; If CS, invalidf/ TST I.PRM+6(R3) ; Do we have an AUX buffer?u" BEQ 50$ ; If EQ, none present2 CALL XMTCH ; Process transmit characteristics' BCS 20$ ; Error in characteristics  ,! MOV P.FLAG(R5),-(SP) ; Get port flag word4" BIC #^C,(SP) ; Clear unwanted bits@# CMPB (SP)+,#PS.ADR!PS.PRO ; Do we have protocol/address pair?-$ BNE 50$ ; If NE, Ethernet address and/or!% ; .. protocol not supplieda2& MOV R4,R0 ; Generate pointer to protocol list' ADD #C.PROL,R0 ; ...(10$:$) MOV (R0),R0 ; Get next protocol** BEQ 50$ ; Not found, invalid protocol<+ CMP P.XPRO(R5),PL.PRO(R0) ; Is this the callers protocol?, BNE 10$ ; Noe1- MOV IP.EXT(R3),R1 ; R1 = I/O packet extensionaD. MOV PL.FLG(R0),IX.FCN(R1) ; Temp save protocol flags in extension/30 MOV #IE.SPC&377,R0 ; Assume buffer is too large11 CMP I.PRM+4(R3),#XMTBSZ ; Is buffer too large? )2 BHI 60$ ; If HI, buffer is too large03.4 BIT #CS.OFL,C.FLAG(R4) ; Controller online?35 BEQ 40$ ; If EQ, yes ... initiate transmissiont607 MOV #IE.DNR&377,R0 ; Assume device not ready?8 BIT #PS.XIN,P.FLAG(R5) ; Line requires initialize function?109 BNE 20$ ; Yes, must issue IO.XIN or Close &: ; .. Open*; MOV #IE.ABO&377,R0 ; Abort the request>< BIS #PS.XIN,P.FLAG(R5) ; Indicate, port must be initialized=20$: CLR R1 ;C"> CALLR RQDON ; Post completion?30$: RETURN ;@6A40$: $QPKT C.XMWQ ; Queue packet to transmit queue%B BR INIXM ; Initiate transmission C:D50$: MOV #IE.BAD&377,R0 ; Return bad parameter(s) errorE60$:F CALLR RQALT ;G$H70$: CLR R1 ; Zero status word 2.I BR XMTDN ; Do xmit done, maybe user wantsJ ; ... diagnostic infoKLM p(N .SBTTL INIXM - Initiate transmissionO;+"P; **-INIXM-Initiate transmissionQ;tBR; Initiate transmission of the next available I/O packets on theS; physical link.T;- U; Inputs::$V; R5 = Address of port state table*W; R4 = Address of controller state tableX; Y; Registers modified:3Z; R0, R1, R2, R3, R4, R5[;e6[INIXM:: CLR -(SP) ; Set transmit counter ; LK705[ ; LK705[; ; LK705Y[; NOTE, we must not set up transmits until the current transmits have completed.; LK705iY[; Setting up the transmit ring and polling the UNA during a transmit will cause ; LK705 /[; the UNA to get out of sunc!!! ; LK705s[; ; LK705+[ CALL MAPDRV ; Map to driver ; LK705e?[ MOV C.XMTC(R4),R1 ; Get current transmit ring entry ; LK705 6[ TSTB RG.ACT(R1) ; Transmission under way? ; LK705=[ BNE 30$ ; Yes, wait for interrupt to start ; LK7050%[ ; ... next transmit! ; LK705m[ ; LK705iC]10$: MOV C.XMWQ(R4),R3 ; Any transmit I/O packets waiting? ;**-1p^ BEQ 30$ ; If EQ, no_?_ CALL GTPST ; Load R5 with Port Status Table address; LK00³„—ƒ9ƒ´cÚµcÛ¶c�·c›’705t_ ; LK705 2` CALL XMTCH ; Process transmit characteristicsa(b CALL GTXMH ; Get xmit header buffer0c BCS 30$ ; None available, wait for xmits tod ; ... completem1e MOV C.XMWQ(R4),R3 ; Get next transmit requestsfg9h MOV P.XDAD(R5),(R0)+ ; Put destination address into 7i MOV P.XDAD+2(R5),(R0)+ ; ... transmit buffer header3j MOV P.XDAD+4(R5),(R0)+ ;4k MOV C.PADD(R4),(R0)+ ; Put source address into7l MOV C.PADD+2(R4),(R0)+ ; ... Transmit buffer headerm MOV C.PADD+4(R4),(R0)+ ;An MOV P.XPRO(R5),(R0)+ ; Put protocol into xmit buffer headere>o MOV I.PRM+4(R3),(R0) ; Assume padding. Set byte count inp ; ... transmit header4q SUB #14.,R0 ; R0 -> begin of transmit headerr,s CALL GFXRE ; Get a transmit ring packettAu MOV #14.,RG.LEN(R1) ; Put transmit buffer length in packetevw;VHx; NOTE - We cannot move the relocation value into the ring as this mayNy; set the ownership bit and we are not ready for the UNA to take this entry.z;)8{ MOV RELCT+2,-(SP) ; Put relocation constant on stack| MOV RELCT,-(SP) ; ...M,} ADD R0,(SP) ; Convert packet address to$~ ADC 2(SP) ; ... Unibus address.8€ MOV (SP)+,RG.ADD(R1) ; Put unibus address of segment&� MOVB (SP)+,RG.AD2(R1) ; ... segment4‚ BIC #374,RG.AD2(R1) ; Make sure MBZ bits are off6ƒ MOV R0,RG.VAD(R1) ; Save virtual address of header„1… MOV IP.EXT(R3),R2 ; R2 = I/O packet extensionh;† BIT #LF.PAD,IX.FCN(R2) ; Protocol uses padded messages? ‡ BEQ 20$/ˆ ADD #2,RG.LEN(R1) ; Account for byte count ‰20$:1Š MOV R1,-(SP) ; Save header ring entry addressn+‹ CALL UMRMP ; Map user buffer with UMRsU0Œ MOV (SP)+,R0 ; Get header ring entry into r0�BŽ MOVB #RF.STP!RF.OWN,RG.FLG(R0) ; Set start of chain and UNA own�7� $DQPKT C.XMWQ ; Dequeue I/O packet from wait queueG‘1’ MOV IP.EXT(R3),R0 ; R0 = I/O packet extensionI3“ CLR IX.FCN(R0) ; Clear tranmit status save wordF)” MOVB #3,I.FCN(R3) ; Set retry counters/• $QPKT C.XMTP ; Queue to xmit pending queuen–&— INC (SP) ; Indicate poll required"˜ BR 10$ ; Go, do next transmit™30$:*š TST (SP)+ ; Did we transmit anything?› BNE 40$ ; Yesœ RETURN ; No, just return�ž40$:-Ÿ CALL POLRG ; Do Poll Ring command to UNAo.  MOV #XMTTIM,C.XMTT(R4) ; Set transmit timer¡ CALLR CLOCK ; Start clock¢£;0,¤; We get here from transmit done interrupt¥;;<¦XMTDN: TST I.PRM+12(R3) ; Do we have a diagnostic buffer?§ BEQ 10$ ; No$-¨ MOV R0,I.PRM+2(R3) ; Save I/O status code4© MOV R1,I.PRM+4(R3) ; Save byte count of transmitª6« MOV IP.EXT(R3),R0 ; R0 = I/O packet extension addr<¬ MOVB #FN.DIG,IX.FCN(R0) ; Set diagnostic func. in I/O pkt/­ $QPKT C.PFNC ; Queue function to pending Qc$® CALLR FNINI ; Initiate function¯10$: ; R0 = Status° CALLR RQDON ; Do I/O done±;B²; We get here from the non-DLX module after it has processed the8³; function requests in the optional diagnostic buffer.´;;5µXDIDN: MOV I.PRM+2(R3),R0 ; R0 = Saved status code2¶ MOV I.PRM+4(R3),R1 ; R1 = Characters processed· CALLR RQDON ; Do I/O done¸ ¹ .DSABL LSBoº»¼ V½ .SBTTL XERCV - Receive datas¾;+¿; **-XERCV-Receive dataPÀ; CÁ; This function is called to receive data from the physical link.Â;- Ã; Inputs:t"Ä; R3 = Address of the I/O packet;Å; I.PRM+1 - High byte of physical address of data bufferp=Æ; I.PRM+2 - Low 16 bits of physical address of data bufferb$Ç; I.PRM+4 - Length of data bufferAÈ; I.PRM+6 - Virtual address of optional characteristics bufferc8É; I.PRM+10- Length of optional characteristics buffer<Ê; I.PRM+12- Virtual address of optional diagnostic buffer3Ë; I.PRM+14- Length of optional diagnostic buffer Ì; R4 = Controller State Tablee%Í; R5 = Address of port status tableÎ;= Ï .ENABL LSB ÐÑXERCV:Ò .IF DF DEBUG Ó BPTÔ .ENDCÕ6Ö CALL MAPBF ; Convert data buffer physical address(× ; ... to bias00³ „œƒ_ƒt÷tø tþfDATA and virtual address3Ø CALL BFCHK ; Validate optional characteristicssÙ ; .. bufferÚ BCS 50$ ; If CS, invalid-Û3Ü MOV #IE.SPC&377,R0 ; Assume buffer is too large-#Ý CMP I.PRM+4(R3),#XMTBSZ ; Is it?i,Þ BHI BUFERR ; If HI, buffer is too largeß:ß BIT #CS.OFL,C.FLAG(R4) ; Is the link online? ; LK705"á BNE 10$ ; If NE, yes ;**-1â:ã MOV #IE.VER&377,R0 ; Assume we have a delayed error toä ; .. report+å BIT #PS.DER,P.FLAG(R5) ; Delayed error? æ BEQ 40$ ; Nov4ç BIC #PS.DER,P.FLAG(R5) ; Clear delayed error bit.è BR 20$ ; Return packet with delayed erroré;ê10$: MOV #IE.ABO&377,R0 ; Assume fatal error in progress 4ë BIS #PS.XIN,P.FLAG(R5) ; Port must be initializedì20$: CLR R1 ; ...f/í CALLR RQDON ; Complete the receive request; î30$: RETURNlï:ð40$: MOVB P.RCVT(R5),I.FCN(R3) ; Set timer in I/O packet1ñ MOV IP.EXT(R3),R0 ; R0 = I/O packet extension)ò MOV R5,IX.FCN(R0) ; Save port address50ó $QPKT C.RCVW ; Queue the receive I/O packet!ô CALL CLOCK ; Start the clockeõ BR 30$ ; Returnö.÷50$: MOV R0,I.PRM+2(R3) ; Save status codesø CLR I.PRM+4(R3) ; ...aùú;n-û; We get here after the receive is completesü;i<ýRCVDN: TST I.PRM+12(R3) ; Do we have a diagnostic buffer?þ BEQ RDIDN ; No, that's it!T8ÿ MOV IP.EXT(R3),R0 ; Get I/O packet extention pointer< MOV #FN.DIG,IX.FCN(R0) ; Set diagnostic function code and ; ... show I/O complete6 $QPKT C.PFNC ; Queue packet to pending function Q+ CALLR FNINI ; Try to initiate function2BUFERR: CALLR RQALT ; Return with buffer error;cF; We get here after the non-DLX functions in the optional diagnostic ; buffer have been processed.: ;I. RDIDN: MOV I.PRM+2(R3),R0 ; R0 = I/O status#  MOV I.PRM+4(R3),R1 ; Byte countM"  CALLR RQDON ; Return I/O done  .DSABL LSB I* .SBTTL XECHR - Set/Get characteristics;+$; **-XECHR-Set/Get characteristics; J; This routine is called to set/get multiple characteristics to/from the.; DLC associated with this physical channel.;- ; Inputs:"; R3 = Address of the I/O packet?; I.PRM+1 - High byte of physical address of characteristicsp; bufferA; I.PRM+2 - Low 16 bits of physical address of characteristics); buffer/ ; I.PRM+4 - Length of characteristics bufferS!; R4 = Controller State Table ."; R4 = Address of physical link access block#;S$XECHR:% .IF DF DEBUG & BPT' .ENDC(/) BIT #CS.OFL,C.FLAG(R4) ; Controller offline?m* BEQ 10$ ; Noi)+ CALLR IEABO ; Return with abort code ,10$:6- CALL MAPBF ; Convert data buffer physical address(. ; ... to bias and virtual address8/ MOV #IE.ONP&377,R0 ; Assume illegal subfunction code00 MOVB I.FCN(R3),R1 ; Get the subfunction code1 ASR R1 ; Form word indexr2 ASR R1 ; ... 3 BIT #1,R1 ; Is it odd4 BNE XRQALT ; Yes, no good!n25 CMP #CHMAX,R1 ; Is the subfunction code valid?6 BLOS XRQALT ; If LOS, noO'7 CALLR @CHFNC(R1) ; Perform functionB879XRQALT: CALLR RQALT ; Complete the request in error:;<;+*=; Set/Get characteristics function table>;-,?CHFNC: .WORD STCHR ; Set characteristics&@ .WORD GTCHR ; Get characteristicsACHMAX= .-CHFNCBCD 1(E .SBTTL XECTL - Control QIO processorF;+"G; **-XECTL-Control QIO processorH;#<I; Controll functions are only valid during Microcode load.BJ; The control function is used to pass a buffer of ECO MicrocodeAK; segments to this driver. Therefore, the driver must validateLL; the following:M;-&N; 1. The calling task is privileged.O; 2. It's name is UML...4P; 3. The controller must be in initialization modeQ; R; Inputs:RS; R3 = Address of I/O packet(T; I.PRM+2 = Micro code segment bufferU; I.PRM+4 = Buffer sizeV; R4 = Controller State TableeWXECTL:X .IF DF DEBUGnY BPTZ .ENDC[0\ CALL MAPBF ; map physical address of buffer].^ MOV #IE.SPC&377,R0 ; Assume 00³„—ƒ9ƒ´cÚµcÛ¶c�·c›’buffer too big/_ CMP I.PRM+4(R3),#8192.-64. ; Is it too largel#` BHIS 20$ ; Buffer is too large a3b MOV #IE.PRI&377,R0 ; Assume privilege violationM.c MOV I.TCB(R3),R1 ; R1 = Task Control Block.d BIT #T3.PRV,T.ST3(R1) ; Is task privileged?e BEQ 20$ ; No f.g MOV #IE.BAD&377,R0 ; Assume bad parameters,h MOV I.PRM+6(R3),R2 ; Get controller info6i CMP R2,#ENDCTB-CTABL ; Controller index reasonable?!j BHIS 20$ ; No, bad parameterok BIT #1,R2 ; Is it even? l BNE 20$ ; No, bad parameter6m MOV CTABL(R2),R4 ; Get Controller State Table ptr.n0o MOV #IE.IFC&377,R0 ; Assume invalid function(p CMP MLTCB,R1 ; Is tasks name MLT...?0q BNE 20$ ; Invalid function for anyone else.r@s BIT #CS.INI,C.FLAG(R4) ; Are we initializing this controller?0t BEQ 20$ ; No, then this function is invalidu-v MOVB I.FCN(R3),R2 ; R2 = Load subfunctionT&w BMI 20$ ; Minus, invalid functionx y ASL R2 ; Make it word index,z CMP R2,#LOADND-LOADTB ; Valid subfunction{ BHIS 20$ ; No|A} CMP C.FUNS(R4),#FN.UML ; Is this 1st response by support task?3~ BNE 10$ ; Noa+ CLR C.CTMR(R4) ; Clear controller timere*€ CLR C.CFNC(R4) ; No function is active-� CLR C.FUNS(R4) ; Clear function save word ‚10$:&ƒ CALLR @LOADTB(R2) ; Go to function„#…20$: CALLR RQALT ; Return error†,‡LOADTB: .WORD LODUM ; load UNA microcodeˆ .WORD ENDLOD ; End of loadc‰ .WORD ABRTLD ; Abort loadŠLOADND=. ; End of table‹3ŒENDLOD: MOV #IS.SUC,R0 ; R0 = I/O success statusP� CALLR RQALT ; ReturniŽ*�ABRTLD: CALL FTL ; Do fatal processing� BR ENDLOD ; End of load‘ n7’ .SBTTL XECSC - Controller Status Change entry pointe“”;+1•; **-XECSC-Controller status change entry pointC–;@C—; This routine is entered from the executive when the status of aH˜; controller must be changed (online => offline or offline => online).™;- š; Inputs:D3›; R2 = KRB address for controller changing status&œ; R3 = CTB address for the above KRB*�; (SP) = Return address for completion7ž; 2(SP) = Return address for intermediate completionN,Ÿ; 'C' Clear = Offline => online transition, ; 'C' Set = Online => offline transition¡; ¢; Outputs:£; On return through (SP):o¤; $SCERR = 1 if successful¥; $SCERR = Error code if not¦; §; Registers modified:l¨; R0, R1, R2, R3, R4, R5©;l!ª .IF DF R$$MPL ; RSX-11M-PLUS«$¬XECSC:: NOP ; Word for patching­*® MOV (SP)+,CSCRET ; Save return address¯° ROL R1 ; Save "C" bit±/² CMP RELCT,#-1 ; Was controller initialized?s³ BNE 5$ ; Yesc´µ MOV L.DCB(R3),R5 ; R5=DCB ¶ MOV D.UCB(R5),R5 ; R5=UCBe· MOV U.SCB(R5),R4 ; R4=SCBi+¸ MOVB K.IOC(R2),R3 ; R3=Controller index ¹!º CALL XELOA ; Init controller!» BCS 60$ ; Init failed, exit!¼5$:i*½ CALL MAPDRV ; Map to 2nd 4K of driver¾)¿ MOV #CTABL,R0 ; R0 = Controller tableÀ10$:'Á MOV (R0)+,R4 ; R4 = Next controller(! BEQ 40$ ; No more, just exit7à CMP C.KRB(R4),R2 ; Do we have the right controller?a&Ä BNE 10$ ; No, get next controller2Å MOV R3,C.CTB(R4) ; Save CTB address for driverÆ3Ç ROR R1 ; Is this offline => online transition?È BCC 50$ ; YesÉ6Ê BIS #KS.OFL,K.STS(R2) ; Indicate controller offlineË#Ì CALL FTL ; Do fatal processing7Í BIS #CS.STP,C.FLAG(R4) ; Indicate controller stoppedMÎ;TCÏ; Now, check if all controllers have stopped. If so, then returntÐ; static UMR to system.;Ñ;o)Ò MOV #CTABL,R0 ; R0 = controller tablee*Ó MOV #U$$NCT,R1 ; R1 = # of controllersÔ20$:2Õ MOV (R0)+,R4 ; Get next controller state tableÖ BEQ 30$ ; No more/× BIT #CS.STP,C.FLAG(R4) ; Controller stopped?Ø BNE 20$ ; Yes)Ù BR 40$ ; At least one still running!oÚ;l>Û; All controllers have stopped. Return static UMR to systemÜ;CÝ30$:2Þ .IF DF M$$EXT ; If extended memory supported?ß5à MOV UABKS,R2 ; Now, point to UMR assignment block"á BEQ 40$ ; No assignment block00³„œƒ_ƒt÷tø tþfDATA.â CALL $DEUMR ; Return static UMR to system)ã .REPT 6 ; Clear UMR assignment block ä CLR (R2)+å .ENDR#æ CLR UABKS ; Show no static UMR$çè .ENDC ; M$$EXTé,ê40$: CALLR @CSCRET ; Return to initiatorë:ì50$: BIC #KS.OFL,K.STS(R2) ; Turn off offline bit in KRB0í BIC #CS.STP,C.FLAG(R4) ; Turn off stop switch@î MOV K.CSR(R2),C.CSR(R4) ; Save CSR in Controller Status Tableï2ð .IF DF M$$EXT ; If extended memory supported?ñ-ò TST UABKS ; Static UMR already assigned?C ó BNE 40$ ; Already allocated ô CALL GSUMR ; Get static UMRõö .ENDC ; M$$EXT÷ø BR 40$ ; All is well ù>ú60$: MOV #IE.ABO,$SCERR ; Abort, driver did not have enoughû BR 40$ ; ... buffer spaceü9ý APR5PC XECSC ; Make sure XECSC is in APR5 addr spaceþÿ .ENDC ; RSX-11M-PLUS s, .SBTTL FNINI - Function Initiate Routine;+<; This routine initiates a function in the function queue.;uB; All non-DLX functions request in the user buffer are processedI; before control is given to the next I/O packet in the function queue. ;-  FNINI:  .IF DF DEBUGw  BPT  .ENDC% MOV #1,R3 ; Assume poll requiredh0 TST C.CFNC(R4) ; Function processing active?- BNE 40$ ; Yes, interrupt will start nextd ; ... function 9 BIT #CS.POL,C.FLAG(R4) ; Need to issue a poll command?e BEQ 10$ ; NoA BIC #CS.POL,C.FLAG(R4) ; Indicate poll command issued ; LK705+ MOV #CM.PDM,R0 ; Set up primary command  CALL LODCM ; Do Poll Ringsc BR 40$ ; Set timerx310$: BIT #CS.GST,C.FLAG(R4) ; Need to get status? BEQ 20$ ; Yes$ MOV #FN.RLS,R1 ; Read UNA status CALLR LODFN ; ... BR 40$ ; Set timero20$:( $DQPKT C.PFNC ; Get next I/O packet  BCS 40$ ; Nothing to do!.!" CLR R1 ; Clear high byte41# MOV IP.EXT(R3),R0 ; R0 = I/O packet extensionN*$ MOVB IX.FCN(R0),R1 ; get function code% BEQ 50$ ; Zero is a NOP+& BMI ABORT ; No negative function codes'3( CMP R1,#FN.WML ; Write multicast list function?) BNE 30$ ; NoG5* MOV R3,C.CFNC(R4) ; Save packet as current actives+ ; ... function flag*, CALLR STMLT ; Do write multicast list-*.30$: CMP R1,#FN.DIG ; Non-DLX functions-/ BNE ABORT ; Something must be very wrongo50 MOV R3,C.CFNC(R4) ; Save packet as current active31 ; ... function flag'2 CALLR NDLXD ; Do non-DLX functionst3440$: RETURN ;r50650$: MOV I.PRM+2(R3),R0 ; Recover status code#7 MOV I.PRM+4(R3),R1 ; Byte countl#8 CALL RQDON ; Return I/O packet;(9 BR FNINI ; Try to get next function:;ABORT: < .IF DF DEBUG ; If debugging=> BPT ; Breakr? BR ABORT ; Loop on breakC@A .IFF B&C CRASH ; Some thing is very wrongDE .ENDC ; DEBUGFGH F#I .SBTTL XEPWF - Device powerfailvJ;+K; **-XEPWF-Device powerfailLL;LGM; This routine is entered from the EXEC at powerfail recovery, systemI%N; boot and device driver load time.O;- P; Inputs: Q;tR; For RSX-11M+S; T; R3 = Controller Table (CTB) 'U; R2 = Kontroller Request Block (KRB)V;FW; For RSX-11MgX;Y; R3 = Controller indexB.Z; R4 = Address of Status Control Block (SCB)&[; R5 = Address of Unit Control Block\;.]; Registers modified:^; R0, R1, R2, R3, R4, R5_;o`XEPWF:a .IF DF DEBUGFb BPTc .ENDCd%e .IF NDF R$$MPL ; If not RSX-11M+ef3g CMP RELCT,#-1 ; Controller already initialized? h BNE 10$ ; Yes!i BR XELOA ; No, initialize itoj10$:kl .IFF m+n CMP RELCT,#-1 ; Controller initialized? o BEQ XETMO ; No, just returnpq .ENDC ; R$$MPLr)s MOV #CTABL,R0 ; R0 = Controller tablett*u CALL MAPDRV ; Map to 2nd 4K of driverv3w20$: MOV (R0)+,R4 ; R4 = Controller status table1x BEQ 30$ ; That is it!)y CALL FTL ; Do fatal error processingz BR 20$ ; Do all of them{|30$:/} .IF DF M$$EXT ; Extended memory supported?l~4 CALL $MPUBM ;00³"„—ƒ9ƒ´cÚµcÛ¶c�·c›’ Reload UMR map register to 2nd 4K€� .ENDC ; M$$EXT‚ƒ;+ „; **-XECAN-Cancel I/O requests…; **-XETMO-Device timeoutj†;e(‡; These routines perform no operation.ˆ;-%‰XECAN: ;;; Should this be a NOPC%ŠXETMO: RETURN ;;; Return to exec‹9Œ APR5PC XEPWF ; Make sure XEPWF is in APR5 addr spaceQ�Ž T1� .SBTTL $XELOA - Initialize driver at load timen�;+,‘; **-$XELOA-Initialize driver at load time’;$?“; This code is called at the time when the driver is loaded.a>”; This code initializes the driver data structures and saves"•; pointers to system data bases.–;- —; Inputs: ˜; R3 = Controller indexo.™; R4 = Address of Status Control Block (SCB)&š; R5 = Address of Unit Control Block›; œ; Outputs:)�; Driver data structurs are initializedEž;sŸ# XELOA: NOP ; Room for patching ¡¢ CALL SALL ; Save registersm£¤ .IF DF DEBUGO¥ BPT¦ .ENDC§¨ .IF DF M$$MGE©;TDª; Compute APR6 value. We must do this here as the initialize code «; may live in the APR6 region.¬;r7­ MOV @#KISAR5,DAPR6 ; DAPR6 = Driver start addr bias$® BIT #40000,#DREND ; Driver GT 4K¯ BEQ 10$ ; Noo7° ADD #200,DAPR6 ; Yes, account for 4K mapped by APR5n ± BR 20$ ; ²10$:6³ MOV #CBASE,-(SP) ; Get base of communications area%´ BIC #160000,(SP) ; Clear APR bitsn,µ ADD #77,(SP) ; Point past current sliver2¶ ASR (SP) ; Compute offset in slivers to CBASE· ASR (SP) ; ...t¸ ASR (SP) ; ...t¹ ASR (SP) ; ...iº ASR (SP) ; ...a» ASR (SP) ; ...g&¼ ADD (SP)+,DAPR6 ; Add to APR5 bias½;D(¾; Compute new vertual address of CBASE¿; 2À MOV #CBASE,R0 ; R0 = Old virtual addr of CBASE5Á BIC #177700,R0 ; R0 = Offset into 1st APR6 sliver/ BIS #140000,R0 ; R0 = Virtual addr of CBASEi1à MOV R0,CVIRA ; Save new virtual addr of CBASEnÄ.Å20$: CALL MAPDRV ; Map to 2nd 4K of driverÆÇ .ENDC ; M$$MGEÈ0É CALL UNAIN ; Initialize UNA data structures#Ê BCS 30$ ; Failed to initializeAË+Ì .IF NDF R$$MPL ; If "NOT" RSX-11M-PLUSPÍ3Î MOV CTABL(R3),R4 ; R4 = Controller Status Tablea-Ï CALL GSUMR ; Assign static UMR to driver0ÐÑ .IFFlÒ,Ó CLR RELCT ; Indicate driver initialized9Ô CLR RELCT+2 ; ... "XECSC" will init relocation valuerÕÖ .ENDC ; R$$MPL×!Ø30$: RETURN ; Return to execÙ;Ú APR5PC $XELOA ; Make sure $XELOA is in APR5 addr space ÛÜ AÝ .SBTTL QPAKT - Queue I/O packet to specified controller queue;Þ;+0ß; **-QPAKT-Queue I/O packet to specified queueà;XAá; Queue an I/O packet to the end of specified controller queue.aâ;-ã; Calling sequence:aä; JSR R0,QPKT å; .WORD æ;d ç; Inputs:i"è; R3 = Address of the I/O packet/é; R4 = Address of the controller state table ê;$ë; Registers modified: ì; Noneí;e@íQPAKT:: MOV R3,-(SP) ; Save address of the I/O packet ; LK705#ï MOV R2,-(SP) ; Save R2 ;**-1e7ð MOV R4,R2 ; Copy address of Controller State TableQ2ñ ADD (R0)+,R2 ; Compute address of the listheadò,ó10$: MOV R2,R3 ; Save address of current&ô MOV (R2),R2 ; Get address of next5õ BNE 10$ ; Loop till we find the end of the queue%ö MOV 2(SP),(R3) ; Link new to last 6÷ CLR @2(SP) ; Clear link pointer in new I/O packet%ø MOV (SP)+,R2 ; Restore I/O packet ù MOV (SP)+,R3 ; Restoe R2ú RTS R0 ; Returnûü h:ý .SBTTL DQPAK - Dequeue I/O packet from specified queueþ;+Aÿ; **-DQPAK-Dequeue I/O packet from one of the controller queues ;m;; Dequeue an I/O packet from one of the I/O queues on thed; controller state table.,;-; Calling sequence:; JSR R0,DQPKTi ; .WORD ;V ; Inputs:;. ; R4 = Address of the controller state table ;t ; Outputs:" ; R3 = Address of the I/O packet$ ; 'C' Clear - I/O packet available-; 'C' Set - No more I/O packets availableQ;-; Registers modified:s; R3;e DQPAK: MOV R2,-(SP) ; Save R20 MOV R4,R2 ;00³*„œƒ_ƒt÷tø tþfDATA Compute address of the listhead ADD (R0)+,R2 ; ...+ SEC ; Assume no I/O packets availableo. MOV (R2),R3 ; Get next entry on the queue BEQ 10$ ; If EQ, none0 MOV (R3),(R2) ; Unlink I/O packet from queue1 CLR (R3) ; Clear link pointer (clears C-bit)!10$: MOV (SP)+,R2 ; Restore R2h RTS R0 ; Return /0 .SBTTL MPTHDR - Map to Task Header Subroutine ;++!; **-MPTHDR-Map to Task Header Subroutine";#; Maps APR6 to Task Header$; %; Inputs:,&; R3 = I/O packet address ';e (; Outputs:); R0 = Task Header address*; +; Registers R0 changed,;- -MPTHDR:G-. MOV I.TCB(R3),R0 ; Get task's TCB addressQ=/ MOV T.PCB(R0),R0 ; then PCB address for task's window 0R(0 ; (PCB=Partition Control Block)61 MOV P.HDR(R0),-(SP) ; Task header in primary pool?23#4 .IF DF R$$MPL ; If RSX11M-PLUSk15 .IF DF M$$MGE ; Memory management supported? 6/7 BNE 10$ ; If NE, header is in primary poolr28 MOV P.REL(R0),@#KISAR6 ; Map to the task header91: .IF DF K$$DAS ; Kernel data spcae supported?6; MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space< .ENDC ; K$$DAS6= MOV #140000,(SP) ; Task header is at offset 140000>10$:? .ENDC ; M$$MGE@ .ENDC ; R$$MPLA+B MOV (SP)+,R0 ; R0 = Task Header address C RETURN ;D;E APR5PC MPTHDR ; Make sure MPTHDR is in APR5 addr space FGH a/I .SBTTL MAPDRV - Map APR6 to 2nd 4K of driverdJ;+*K; **-MAPDRV-Map APR6 to 2nd 4K of driverL; !M; Maps 2nd 4K of driver to APR6$N; O; Inputs:a P; DAPR6oQ; R; Ouputs:SS; NoneT;DU; Registers undisturbedV;- WMAPDRV:D1X .IF DF M$$MGE ; Memory menagement supported? Y0Z MOV DAPR6,@#KISAR6 ; Map to 2nd 4K of driver[1\ .IF DF K$$DAS ; Kernel data space supported?]6^ MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space_` .ENDC ; K$$DASab .ENDC ; M$$MGEc RETURN ; Return to callerd;e APR5PC MAPDRV ; Make sure MAPDRV is in APR5 addr space2fgh e>i .SBTTL ****************************************************>j .SBTTL * Interrupt Handling Routines *>k .SBTTL ****************************************************l+m .SBTTL INTTB - Interrupt Dispatch TableFno;S%p; INTERRUPT TRANSFER DISPATCH TABLEq;VrINTTB:)s .WORD RCVINT ; Receive Ring Interrupt*t .WORD XMTINT ; Transmit Ring Interrupt,u .WORD CMSINT ; Command Success Interrupt7v .WORD RBUINT ; Receive Buffer Unavailable Interrupt)w .WORD CMINT ; Command Error Interrupt*)x .WORD SERINT ; Status Error Interrupt )y .WORD STCINT ; State Change Interrupt z {INTMSK:B'| .WORD BIT13 ; Receive interrupt bit*(} .WORD BIT12 ; Transmit interrupt bit'~ .WORD BIT11 ; Command interrupt bitE: .WORD BIT10 ; Receive buffer unavailable interrupt bit-€ .WORD BIT14 ; Command error interrupt bit ,� .WORD BIT15 ; Status error interrupt bit+‚ .WORD BIT8 ; State change interrupt bit;ƒ;i,„; PRIMARY COMMAND INTERRUPT DISPATCH TABLE…; CODE!† .WORD RSTDN ; Reset Done -4S#‡ .WORD SLFDN ; Self-test Done -2N!ˆCMDDTB: .WORD INTEXT ; NOP 0%‰ .WORD GPBDN ; Get Control Block 1e&Š .WORD GCMDON ; Secondary Command 2‹ .WORD INTEXT ; Not used 3Œ .WORD STRDN ; Start 4O� .WORD INTEXT ; Boot 5aŽ .WORD INTEXT ; Not used 6� .WORD INTEXT ; Not used 7"� .WORD PDMDON ; Poll Demand 10%‘ .WORD INTEXT ; Sanity Timer On 11e&’ .WORD INTEXT ; Sanity Timer Off 12(“ .WORD INTEXT ; Sanity Timer Reset 13” .WORD INTEXT ; Not used 14 • .WORD INTEXT ; Not used 15f– .WORD INTEXT ; Not used 16N— .WORD INTEXT ; Stop 17˜ ™;o(š; SECONDARY COMMAND INTERRUPT DISPATCH›; CODE. œCM2DTB: � .WORD INTEXT ; Nop 0N/ž .WORD LSMDN ; Load and Start Microaddress 1.1Ÿ .WORD RDADN ; Read Default Physical Address 2u  .WORD INTEXT ; Nop 3l+¡ .WORD INTEXT ; Read Physical Address 4 +¢ .WORD ILLINT ; Write Physical Address 00³2„—ƒ9ƒ´cÚµcÛ¶c�·c›’52)£ .WORD ILLINT ; Read Multicast List 6)¤ .WORD WMLDN ; Write Multicast List 7I+¥ .WORD ILLINT ; Read Ring Descriptor 10t+¦ .WORD WRGDN ; Write Ring Descriptor 11 %§ .WORD ILLINT ; Read Counters 12 -¨ .WORD ILLINT ; Read and Clear Counters 13D!© .WORD ILLINT ; Read Mode 14N!ª .WORD WMEDN ; Write Mode 15'« .WORD RLSDON ; Read Line Status 16d0¬ .WORD ILLINT ; Read and Clear Line Status 17+­ .WORD ILLINT ; Dump Internal Memory 20I*® .WORD LOADN ; Load Internal Memory 21%¯ .WORD ILLINT ; Read System ID 22.&° .WORD ILLINT ; Write System ID 23'± .WORD ILLINT ; Read Load Server 241(² .WORD ILLINT ; Write Load Server 25*³ .WORD ILLINT ; Diagnostic function 262´ .WORD MLTMO ; No response from microcode ldr27µ¶· N¸;R=¹; Secondary command interrupt dispatch table for diagnosticS@º; functions interrupt service dispatch. The driver determinesB»; to use this table by looking at the subfunction byte in C.FUNSA¼; If the sign bit is set, the function is a diagnostic functionI+½; and this table is used for dispatching.3¾; CODE ¿CM2NDT:dÀ .WORD INTEXT ; Nop 0 0Á .WORD ILLINT ; Load and Start Microaddress 11 .WORD DRADN ; Read Default Physical Address 2rà .WORD INTEXT ; Nop 3*Ä .WORD DRPDN ; Read Physical Address 4*Å .WORD DWADN ; Write Physical Address 5(Æ .WORD DMLDN ; Read Multicast List 6*Ç .WORD ILLINT ; Write Multicast List 7+È .WORD ILLINT ; Read Ring Descriptor 10s,É .WORD ILLINT ; Write Ring Descriptor 11$Ê .WORD DRCDN ; Read Counters 12,Ë .WORD DRCCD ; Read and Clear Counters 13 Ì .WORD DRMDN ; Read Mode 14!Í .WORD DWMDN ; Write Mode 15r&Î .WORD DRSTD ; Read Line Status 16/Ï .WORD DRCSD ; Read and Clear Line Status 17 +Ð .WORD ILLINT ; Dump Internal Memory 204+Ñ .WORD ILLINT ; Load Internal Memory 21$Ò .WORD DRSID ; Read System ID 22%Ó .WORD DWSID ; Write System ID 23L&Ô .WORD DRSDN ; Read Load Server 24'Õ .WORD DWSAD ; Write Load Server 25nÖ× t(Ø .SBTTL UNAI - UNA Interrupt RoutineÙÚ;+Û;C%Ü; **- UNAI - UNA INTERRUPT HANDLINGOÝ;MJÞ; The conditions that can cause an interrupt are checked, and a dispatchMß; made to handle each interrupt present. The order of interrupt handling isDà; shown below:á; Receive Ring InterruptIâ; Transmit Ring Interruptã; Command Success Interrupt)ä; Receive Buffer Unavailable InterruptIå; Command Error Interruptæ; Software Error InterruptDç; State Change interruptè;tLé; The interrupt service entry will set CS.INT in the controller flag word.Oê; This bit indicates that an interrupt has taken place and enables the drivereFë; to service all interrupts before it processes the receive buffers.ì; í; INPUT:î; PCSR0 Interrupt Bits Setï;R!ð; OUTPUT TO INTERRUPT ROUTINES:iñ; R4 = Controller State Tablecò; All registers availableBó; ô;-õUNAI:eö;I"÷; Do some interrupt housekeepingø;w/ù INTSE$ XE,PR5,U$$NCT ;;; Dev.name, priorityú+û .IF NDF R$$MPL ;;; If NOT RSX-11M-PLUSCü!ý MOV U.SCB(R5),R4 ;;; R4 = SCB .þ MOV S.CON(R4),R4 ;;; R4 = Controller indexÿ .ENDC ;;; R$$MPL  MOV R4,-(SP) ;;; Save R4 9 MOV CTABL(R4),R4 ;;; R4 = Controller State Table AddrC8 BIS #CS.INT,C.FLAG(R4) ;;; Indicate interrupt occured 9 MOV U.SCB(R5),R4 ;;; Point to Controller Status Blocki& CLRB S.CTM(R4) ;;; Disable timeout2 ADD #S.FRK+6,R4 ;;; Point to end of Fork Block. TST -4(R4) ;;; Fork Block already in use? BEQ 10$ ;;; If EQ no. MOV (SP)+,R4 ;;; Restore R4 $ RETURN ;;; Exit from interrupt5 10$: MOV (SP)+,(R4) ;;; Put saved R4 in Fork Block , CALL $FORK1 ;;; Create a system process  MOV U.SCB(R5),R0 ; R0 = SCBT< CLR S.FRK+2(R0) ; Free fork block for further interrupts  .IF DF DEBUGS BPT .ENDC : MOV CTABL(R4),R4 ; R4 = Controller State Table Address9 BIC #CS.INT,C.FLAG(R4) ; Clear interrupt seen flag bit *00³:„œƒ_ƒt÷tø tþfDATA CALL MAPDRV ; Map to 2nd 4K of driver 5 MOV R0,-(SP) ; Save registers not saved by INTSX$  MOV R1,-(SP) ; ... MOV R2,-(SP) ; ... MOV R3,-(SP) ; ...(! MOV C.CSR(R4),R0 ; Get PCSR0 address0" MOV (R0),-(SP) ; Get PCSR0 contents on stack=# MOVB 1(SP),1(R0) ; Clear all interrupt bits that were sete$ % ;p)& ; Cycle through the possible interrupts' ; -( CLRB (SP) ; Just keep the interrupt bitse') CLR R0 ; Initialize index registera* 20$:>+ BIT INTMSK(R0),(SP) ; Is this the reason for the interrupt, BEQ 30$ ; If EQ, No...v- MOV R0,-(SP) ; Save R0,. CALL @INTTB(R0) ; Call interrupt routine/ MOV (SP)+,R0 ; Restore R00 01 30$: TST (R0)+ ; Bump pointer to next reason/2 BIC INTMSK-2(R0),(SP) ; Clear out old reasonP)3 BNE 20$ ; If NE, Still more bits setr4 5 ; .6 ; All interrupts handled - dismiss interrupt7 ; N8 ; At this point the driver tests if there are some received messages waiting9 ; to be processed.: ;T$; ; o If not, the driver just exitsM< ; o Otherwise, the driver tests if another interrupt has taken place while '= ; servicing the current interrupt.e> ;MH? ; o If yes, just exit current interrupt. Next interrupt will process#@ ; the received messages.eEA ; o If their had not been an interrupt while servicing the current JB ; interrupt, the driver will finish processing the received messages.C ;vD <E BIT #CS.ENP,C.FLAG(R4) ; Did we see a receive end packet?F BEQ 40$ ; No .G BIT #CS.INT,C.FLAG(R4) ; Interrupt pending?2H BNE 40$ ; Yes, let next interrupt process theI ; ... received messages.e+J CALL RCCMP ; process received messagessK 8L CALL GTRBF ; Make sure all entries have rcv buffersM .N 40$: TST (SP)+ ; Restore the stack pointer$O MOV (SP)+,R3 ; Restore registersP MOV (SP)+,R2 ; ...Q MOV (SP)+,R1 ; ...R MOV (SP)+,R0 ; ...(S RETURN ; Exit interrupt processingT ;U APR5PC $XEINT ; Make sure $XEINT is in APR5 addr space V W X I1Y .SBTTL RCVINT - Receive Ring Interrupt HandlerYZ [ ;+\ ;t/] ; **- RCVINT - RECEIVE RING INTERRUPT HANDLERs^ ; A_ ; This routine is called when a receive ring interrupt has beenaJ` ; detected. The ring is checked for the next current ring entry. If nonea ; exist the routine exits.b ;sGc ; If a buffer has been received, the ring info is saved in the bufferPEd ; header and the buffer is queued for receive done processing. AndX3e ; the ring is scanned for another receive packet.f ; Eg ; The ring is emptied. All interrupts serviced before the receivedh ; messages are completed. i ;R j ; INPUTS:'k ; R4 = Controller State Table addressel ; m ;- n RCVINT:so ;a&p ; Loop to retreive the receive chainq ;e2r 10$: CALL GCRRE ; Get receive done ring packet(s BEQ 50$ ; No more completed entriest BCC 20$ ; No errorsu 0v CALL CHKERR ; Check if we have a real errorw BCC 20$ ; All is wellx +y MOV R4,R2 ; Generate error packet addrez ADD #C.LOG,R2 ; ... 4{ MOV #ER.RCV,E.TYPE(R2) ; Put error code in packet=| MOVB RG.FLG(R1),E.FLG(R2) ; Put Ring's flag byte in packet7} MOVB RG.ERR(R1),E.ERR(R2) ; Put error byte in packetC&~ CLR R3 ; No associated I/O packet' CALL ERLOG ; Log the receive error € 20$:9� MOV RG.VAD(R1),R3 ; R3 = Virtual address of rec.buff.i7‚ MOVB RG.FLG(R1),M.ERR(R3) ; Save error word of entryk8ƒ MOVB RG.ERR(R1),M.ERR+1(R3) ; Save ring error by also>„ MOV RG.RLN(R1),M.MLEN(R3) ; Save length of received message… 7† $QPKT C.RCVD ; Queue buffer for receive completion‡ 6ˆ BITB #RF.ENP,RG.FLG(R1) ; Did we get an end packet?‰ BEQ 30$ ; NoR@Š BIS #CS.ENP,C.FLAG(R4) ; Indicate, we have seen an end packet‹ 30$:$Œ CALL RLPKT ; Release ring entry� BR 10$ ; Get the restŽ >Ž 50$: CALLR GTRBF ; Refresh the receive buffer ring ; LK705’ ;**-3 “ *” .SBTTL CHKERR - Check out receive error• ;+&– ; **-CHKERR- Check out receive error— ;LH˜ ; This routine makes sure that, in00³B„—ƒ9ƒ´cÚµcÛ¶c�·c›’ fact, there is an error. There are;™ ; two conditions under which a CRC error is not an error:;š ;w› ; 1. Loop back mode@œ ; 2. The transmitting controller is the receiving controller.� ; Gž ; In the above cases, the controller is merely saying that no CRC waseŸ ; generated.  ;: ¡ ; Inputs: ¢ ; R1 = Receive ring entry £ ;; ¤ ; Outputs:#¥ ; C-bit set on real error present-¦ ; C-bit clear for no error§ ; ¨ ; Registers not disturbede© ;-@ª CHKERR: BITB #RF.ENP,RG.FLG(R1) ; Is this an end ring entry?2« BEQ 10$ ; Only end entry has correct statusF¬ BITB #RF.FRM!RF.OFL,RG.FLG(R1) ; Frame Error or Message overflow?(­ BNE 30$ ; Yes, that is real errorO­ BITB #/400,RG.ERR(R1) ; Buffer length error or Unibu; LK705a:¯ BNE 30$ ; ... time out error. That is error! ;**-1° 6± BIT #MD.LOO,C.MODE(R4) ; Are we in loopback mode?-² BNE 10$ ; Yes, we always get CRC error ³ ; ... in loopback mode.;´ MOV C.STRT(R4),R0 ; Get 1st buffer of current receive?)µ BEQ 30$ ; None found, assume errorc¶ ;tG· ; It is possible that C.STRT(R4) does not contain the starting buffer?M¸ ; for the currently received message. If there was no start entry received(I¹ ; for this message, then the message will be dicarded by RCCMP routine. º ;.E» CMP C.PADD(R4),M.SADD(R0) ; Was message transmitted by this UNA?p¼ BNE 30$ ; No$(½ CMP C.PADD+2(R4),M.SADD+2(R0) ; Well?¾ BNE 30$ ; Nok(¿ CMP C.PADD+2(R4),M.SADD+2(R0) ; Well?À BNE 30$ ; Noe9Á 10$: BICB #RF.ERR!RF.CRC,RG.FLG(R1) ; Clear error bits " CLC ; Indicate good returnà 20$: RETURN ;Ä 'Å 30$: SEC ; Indicate error returnsÆ BR 20$ ; ReturnÇ È y2É .SBTTL XMTINT - Transmit Ring Interrupt HandlerÊ Ë ;+Ì ; 0Í ; **- XMTINT - TRANSMIT RING INTERRUPT HANDLERÎ ; BÏ ; This routine is called when a transmit ring interrupt has beenHÐ ; generated. The ring is checked for the next completed entry. If noneÑ ; exists the routine exits.BÒ ;$EÓ ; If an entry is found the entry is checked for any errors. ErrorsHÔ ; are logged by the driver. If the transmit was error free the statusIÕ ; code is saved in the I/O packet at I.PRM and processing of the packetMÖ ; continues.× ;I Ø ; INPUTS:lÙ ; R4 = Controller State TableTÚ ;AÛ ;- Ü XMTINT:UÝ ;N4Þ ; Loop to retreive the next transmit chain on ringß ; 8à 10$: CALL GCXRE ; Get next completed xmit ring entry(á BEQ 70$ ; No more completed entries'â MOV C.XMTP(R4),R3 ; R3 = I/O packet "ã BCC 20$ ; Successful transmitä 5å MOV R4,R2 ; Generate pointer to error log packet æ ADD #C.LOG,R2 ; ...e4ç MOV #ER.XMT,E.TYPE(R2) ; Put error code in packet=è MOVB RG.FLG(R1),E.FLG(R2) ; Put Ring's flag byte in packetN7é MOVB RG.ERR(R1),E.ERR(R2) ; Put error byte in packetM$ê CALL ERLOG ; Log transmit errorë 5ì 20$: MOV IP.EXT(R3),R2 ; R2 = I/O packet extensione8í BISB RG.ERR(R1),IX.FCN+1(R2) ; Save error status bits#î BISB RG.FLG(R1),IX.FCN(R2) ; ...3ï $ð CALL RLPKT ; Release ring entryñ 1ò BITB #RF.STP,RG.FLG(R1) ; Was this start entryoó BEQ 30$ ; No@ô MOV C.XHDR(R4),@RG.VAD(R1) ; Put transmit header in free list"õ MOV RG.VAD(R1),C.XHDR(R4) ; ..."ö BR 10$ ; See if there is more÷ /ø 30$: BITB #RF.ENP,RG.FLG(R1) ; End-of-packet?nù BEQ 10$ ; NoRú û Bü MOV #XMTTIM,C.XMTT(R4) ; Assume xmit not active, restart timer.?ý MOV (R3),C.XMTP(R4) ; Remove I/O packet from xmit pending Qiþ BNE 40$ ; More in ring?)ÿ CLR C.XMTT(R4) ; Clear transmit timeri 40$:2 .IF DF M$$EXT ; If extended memory supported? + MOV RG.UMR(R1),R2 ; R2 = UMR wait blockA+ ADD #10,R2 ; R2 = UMR assignment blockM MOV R3,-(SP) ; Save R3 CALL $DEUMR ; Deassign UMR  MOV (SP)+,R3 ; Restore R3G  MOV C.UCB(R4),R0 ; R0 = UCB$7 MOV U.UCBX+6(R0),@RG.UMR(R1); Free up UMR wait block $ MOV RG.UMR(R1),U.UCBX+6(R0) ; ...  .ENDC ; M$$EXT  ;r  ; Got the whole transmit chain ; > MOV R4,-(SP00³J„œƒ_ƒt÷tø tþfDATA) ; Save controller state table pointer ; LK7055 ; ... we have to do this in case GTPST ; LK705 " ; ... distroys it ; LK705; CALL GTPST ; Restore Port Status Table pointer ; LK705R@ MOV (SP)+,R4 ; Restore controller state table pointer; LK705 ; LK705 % TST R5 ; Port closed? ; LK705M BNE 45$ ; No ; LK705e1 CALL IEABO ; Yes, abort the request ; LK705)* BR 10$ ; Complete next item ; LK705 45$: ; LK705t+ MOV #IS.SUC,R0 ; Assume success ;**-2l# MOV I.PRM+4(R3),R1 ; Byte count  1 MOV IP.EXT(R3),R2 ; R2 = I/O packet extension " BIT #RF.ERR,IX.FCN(R2) ; Error? BEQ 60$ ; No 3 BIT #RE.RTY,IX.FCN(R2) ; Retry due to collisions; BEQ 50$ ; No + DECB I.FCN(R3) ; Should we try it again0 BEQ 50$ ; Noo< MOV C.XMWQ(R4),(R3) ; Yes, insert at front of wait queue MOV R3,C.XMWQ(R4) ; ...q BR 10$ ; Go, do next ! ," 50$: MOV #IE.ABO&377,R0 ; R0 = Abort code# CLR R1 ; R1 = 0 byte countm1$ 60$: CALL XMTDN ; Do transmit done processingo% BR 10$ ; Do next if any& 0' 70$: CALLR INIXM ; Try to start up transmits( ) * 4+ .SBTTL CMSINT - Command Success Interrupt Handler2, .SBTTL CMEINT - Command Error Interrupt Handler- ;+. ;o2/ ; **- CMSINT - Command Success Interrupt Handler00 ; **- CMEINT - Command Error Interrupt Handler1 ;MD2 ; These routines are called when a command done interrupt has beenM3 ; detected. If the command completes with success the C-Bit is cleared upon K4 ; entry to the command done routines. If the command completes with error0=5 ; the C-Bit is set when entering the command done routines..6 ; H7 ; The command function (C.FUNS=Primary/secondary func code) is used toH8 ; dispatch to the command done routine. If the sign bit is set in theJ9 ; function code indicates the command was issued by the non-DLX functionI: ; processor and CM2NDT table is used to dispatch to the done processor. ; ;e < ; INPUTS:l= ; R4 = Controller State Tablee7> ; C.CFNC = Address of I/O packet for current functione-? ; C.FUNS = Primary/Secondary function codess@ ;- A .ENABL LSBeB C CMSINT:oD ;sE ; Command success interruptiF ;.,G CLR R0 ; Set up "ROL R0" for zero C-bitH BR 10$ ; Join common codeI J ; *K ; Command error interrupt (also timeout)L ; M CMINT:7N MOV #100000,R0 ; Set up "ROL R0" for non-zero C-bitsO 10$:-P CLRB C.CTMR(R4) ; Clear any pending timero.Q MOV C.CFNC(R4),R3 ; Get I/O packet address/R CLR C.CFNC(R4) ; Clear I/O packet save wordt2S MOVB C.FUNS(R4),R1 ; Get primary function code.T BIC #100000,R1 ; Make sure sign bit is off U ASL R1 ; Make it word indexV ROL R0 ; Set/Clear C-bit +W CALLR @CMDDTB(R1) ; Dispatch to routine X ,Y INTEXT: RETURN ; Used for commands with"Z ; ... no completion routine[ \ ;V] ; Secondary command dispatch^ ;n_ GCMDON: ROR R0 ; Save C-bitT3` CALL GTPST ; Restore Port Status Table pointer,,a MOVB C.FUNS+1(R4),R1 ; Get function byte*b BMI 20$ ; Must be diagnostic functionc d ASL R1 ; Make it word indexe ROL R0 ; Set/Clear C-bitu)f JMP @CM2DTB(R1) ; Dispatch to routineog (h 20$: BIC #177600,R1 ; Clear sign bits i ASL R1 ; Make it word indexj 1k .IF DF M$$MGE ; Memory management supported?hl 5m MOV C.KIR6(R4),@#KISAR6 ; Map to diagnostic bufferrn 1o .IF DF K$$DAS ; Kernel data space supported?i6p MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceq .ENDC ; K$$DASr s .ENDC ; M$$MGEt u ROL R0 ; Set/Clear C-bitu.v MOV C.DGBP(R4),R0 ; Restore buffer pointer*w JMP @CM2NDT(R1) ; Go to done processorx ;y APR5PC GCMDON ; Make sure GCMDON is in APR5 addr spacesz { .DSABL LSB | } ~ ;+ ; **-PDMDON- Poll Demand Done;€ ;rF� ; This routine clears the C.CFNC flag and the CS.POL flag bit in theD‚ ; controller flag word (C.FLAG) and passes control to the functionƒ ; processor (FNINI).„ ;t … ; INPUTS:a† ; R4 = Controller State Table‡ ; ˆ PDMD00³R„—ƒ9ƒ´cÚµcÛ¶c�·c›’ON: ‰ BCS 10$ ; Fatal9‹ CALLR FNINI ; Try to initiate another function ;**-1rŒ � 10$: CALLR FTL ; Fatal errorŽ � � r7‘ .SBTTL RBUINT - Receive Buffer Unavailable Interruptd’ “ ;+” ; 5• ; **- RBUINT - Receive Buffer Unavailable InterruptD– ;G— ; This routine is called when a buffer unavailable interrupt has beent9˜ ; generated. The event is logged via the error logger. ™ ;u š ; INPUTS:r› ; R4 = Controller State TableSœ ; � ; REGISTERS MODIFIED:a ž ; R0,R1,R2Ÿ ;N  ;-9¡ RBUINT: MOV R4,R2 ; Generate error log packet pointerh¢ ADD #C.LOG,R2 ; ... 4£ MOV #ER.RBU,E.TYPE(R2) ; Put error code in packet¤ CLR R3 ; No I/O packetv*¤ CALL ERLOG ; Log the error ; LK705¤ ; LK705e6¤ CALL GTRBF ; Refresh receive buffer ring ; LK705.¤ BNE 10$ ; We added some buffers ; LK705<¤ RETURN ; No receive buffs, return from int serv; LK705¤ ; LK705 >¤ 10$: CALLR POLRG ; Tell UNA to get receive buffers ; LK705¨ ;**-3© 1ª .SBTTL SERINT - Status Error Interrupt Handlero1« .SBTTL STCINT - State Change Interrupt HandlerT,¬ .SBTTL ILLINT - Illegal Interrupt Handler­ ;+® ;p/¯ ; **- SERINT - Status Error Interrupt Handler5/° ; **- STCINT - State Change Interrupt Handler *± ; **- ILLINT - Illegal Interrupt Handler² ;dI³ ; These routines are called as a result of the corresponding interruptstL´ ; being generated. The error is logged. These error are considered fatal.µ ;b ¶ ; INPUTS:5· ; R4 = Controller State TableB¸ ;E¹ ; REGISTERS MODIFIED:r º ; R0,R1,R3» ;B¼ ;-½ ¾ SERINT:a¿ ;n2À ; Queue up a control request to read line statusÁ ;n9 BIS #CS.GST,C.FLAG(R4) ; Indicate get status in C.FLAGa+à CALLR FNINI ; Try to do the Get StatuspÄ ;d/Å ; We get here after the Read Status interruptÆ ;4Ç RLSDON: BIT #1,R3 ; Is this driver's get status?)È BEQ 10$ ; Go to normal service entryT1É BIC #CS.GST,C.FLAG(R4) ; Clear Get Status flaga1Ê MOV R4,R2 ; Generate eror log packet pointeraË ADD #C.LOG,R2 ; ... =Ì MOV #ER.SER,E.TYPE(R2) ; Put status error code into packet 7Í MOV C.PCBP(R4),R0 ; R0 = Port Control Block pointerB3Î MOV (R0)+,E.PCB(R2) ; Put Status word in packetaÏ MOV (R0)+,E.PCB+2(R2) ; ...Ð MOV (R0)+,E.PCB+4(R2) ; ...Ñ MOV (R0)+,E.PCB+6(R2) ; ...Ò MOV C.CSR(R4),R0 ; Get CSR3Ó MOV (R0),E.CSR0(R2) ; Put PCSR0 in error packet 3Ô MOV 2(R0),E.CSR1(R2) ; Put PCSR1 in error packet Õ CLR R3 ; No I/O packetVÖ CALL ERLOG ; Log the errore(× CALLR FTL ; Do UNA fatal processingØ :Ù 10$: CALLR RLSDN ; Go to Read Status interrupt serviceÚ Û STCINT:0 Ü ILLINT:r1Ý BIT #CS.OFL,C.FLAG(R4) ; Is controller online? Þ BEQ 10$ ; Yesß RETURN ;à "á 10$: MOV C.CSR(R4),R0 ; Get CSR.â MOV R4,R2 ; Generate error packet pointerã ADD #C.LOG,R2 ; ...t4ä MOV #ER.STC,E.TYPE(R2) ; Put error type in packet1å MOV (R0),E.CSR0(R2) ; PCSR0 into error packetp1æ MOV 2(R0),E.CSR1(R2) ; PCSR1 into error packet $ç CLR R3 ; There is no I/O packet(è CALL ERLOG ; Log State Change Error(é CALLR FTL ; Do UNA fatal processingê ë ì .SBTTL CLOCK - Clock Routineí ;+î ; **-CLOCK-Clock Routineï ;Að ; This routine performs all the timing services for the driver.Gñ ;-ò ;M ó ; Inputs:Gô ; R4 = Controller State TableA<õ ; C.CTMR = Controller Timer. Times out command functions.#ö ; C.XMTT = Transmit timeout timer -÷ ; C.RCVW = I/O packet in receive wait queue(ø ; I.FCN holds timeout value ù ;R ú ; Outputs:Cû ; None zero timers are decremented. Each timer that goes to zeroLAü ; will cause a specific timeout service routine to be executed.uý ;Cþ ; If the wait time of receive I/O packets has expired, the packet Bÿ ; is removed from the receive wait list and I/O done with IE.TMO# ; status is returned to the user.T ;C ;l4 CLOCK:: TSTB CLKFG ; Is clock running? ; LK705& BNE 30$ ; Yes, just exit. ;**-1 * TST CLKBK ; Do we have a clock block? BNE 20$ ; Yes 3 00³Z„œƒ_ƒt÷tø tþfDATA10$: MOV #C.LGTH,R1 ; R1 = Length of clock block ) CALL $ALOCB ; Allocate a clock blocku BCS 10$ ; Not available. MOV R0,CLKBK ; Save address of clock block 20$:+ INCB CLKFG ; Indicate clock is running# MOV CLKBK,R0 ; R0 = Clock Blockl4 MOV #CLKTMO,C.SUB(R0) ; Set addr of timer service( CLR R1 ; R1 = High order delta time( MOV $TKPS,R2 ; R2 = Ticks per second MOV R4,-(SP) ; Save R4 MOV R5,-(SP) ; Save R56 MOV R4,R5 ; R5 = Identifier (Contr.State Tbl.Ptr)+ MOV #C.SYST,R4 ; Declare system routinec5 CALL $CLINS ; Request insertion into clock queue1 MOV (SP)+,R5 ; Restore R5, MOV (SP)+,R4 ; Restore R4b# 30$: RETURN ; Return to callera  ;i) ; We get here after clock queue timeoutl ;  CLKTMO:T* CALL MAPDRV ; Map to 2nd 4K of driver! 4" MOV #CTABL,CTPTR ; Save controller table pointer3# MOV @CTPTR,R4 ; Get next contr. state table ptr 2$ CLR CACUM ; Clear controller time accumulator% 10$:%& TSTB CLKFG ; Clock been stopped? ' BEQ 80$ ; Yes, just exit.( .) MOV C.UCB(R4),R0 ; R0 = Unit Control Block0* MOV U.DCB(R0),R0 ; R0 = Device Control Block%+ TST D.DSP(R0) ; Driver in memory? , BEQ 80$ ; No, just exit.t- '. TST C.CTMR(R4) ; Command timer set?T/ BEQ 30$ ; NoV&0 DEC C.CTMR(R4) ; Dec command timer1 BNE 20$ ; No timeout yetr.2 CALL CMINT ; Execute timeout for commands<3 20$: BIS C.CTMR(R4),CACUM ; Accum.time for clock insertion4 ,5 30$: TST C.XMTT(R4) ; Transmit timer set?6 BEQ 50$ ; No$#7 DEC C.XMTT(R4) ; Dec xmit timerB8 BNE 40$ ; No timeout yeto)9 CALL FTL ; Do fatal error processingr': CLR CACUM ; Clear time accumulatore ; BR 80$ ; Do next controller<< 40$: BIS C.XMTT(R4),CACUM ; Accum.time for clock insertion= 7> 50$: MOV R4,R3 ; Generate pointer to receive wait Q ? ADD #C.RCVW,R3 ; ...@ 60$:1A MOV R3,R2 ; Save privious I/O packet pointer(.B MOV (R3),R3 ; Get next I/O packet in listC BEQ 80$ ; No moreD ,E TSTB I.FCN(R3) ; I/O packet's timer set?"F BEQ 60$ ; No, don't bother itG #H DECB I.FCN(R3) ; Dec timer byte I BEQ 70$ ; not yet timed out9J BISB I.FCN(R3),CACUM ; Accum.time for clock insertiono%K BR 60$ ; Process next I/O packet L 0M 70$: MOV (R3),(R2) ; Dequeue packet from listN /O MOV R2,-(SP) ; Save privious packet pointerW#P MOV #IE.TMO,R0 ; Timeout statusSQ CLR R1 ; ...c)R CALL RQDON ; Return timeout I/O done/*S MOV (SP)+,R2 ; Restore privious packetT &U MOV R2,R3 ; Make privious current(V BR 60$ ; Do next I/O packet in listW 80$:,X ADD #2,CTPTR ; Point to next controller6Y MOV @CTPTR,R4 ; R4 = Next controller's state table.Z BNE 10$ ; Process next controllers timers5[ CLRB CLKFG ; Assume timers done for this contrl.k$\ TST CACUM ; Any more timers set%] BEQ 90$ ; Yes, restart the clockE^ CALL CLOCK ; Restart clockR_ 90$:` RETURN ; Return to execta ;b APR5PC CLKTMO ; Make sure CLKTMO is in APR5 addr spacec d e f 0g .IF DF E$$DVC ; Device error log supported?h i j .SBTTL ERLOG - Error Logger k ;+l ; **-ERLOG-Error logger@m ;,n ; Interface to $LOGERro ;a p ; Inputs:B9q ; R3 = Address of I/O packet (or zero if no I/O packet) r ; R4 = Controller State Tablets ; t ; Outputs:u ; Nonev ;ew ; All registers preservedex ; )y ERLOG: CALL SALL ; Save all registersR.z MOV C.UCB(R4),R5 ; R5 = Unit Control Block0{ MOV U.SCB(R5),R4 ; R4 = Status Control Block9| CLRB S.ROFF(R4) ; 0 offset to 1st reg of err.log.pkt.oB} MOV #/2,S.RCNT(R4) ; Save # of reg. to copy for err.log/~ MOV #E.SIZE,R1 ; R1 = Error log packet size$3 MOV R3,S.PKT(R4) ; Save I/O packet for err.log.a'€ BNE 10$ ; We do have an I/O packet=$� CLR R4 ; No I/O packet, no SCB.‚ ƒ ; („ ; R1 = Error log packet size in bytes1… ; R3 = I/O packet address (0 if no I/O packet)!† ; R4 = SCB (0 if no I/O packetn ‡ ; R5 = UCBMˆ ;S0‰ 10$: CALL $LOGER ; Attempt to log er00³b„—ƒ9ƒ´cÚµcÛ¶c�·c›’r packet)Š BCS 40$ ; Unable to log error packetp‹ MOV U.SCB(R5),R4 ; R5 = SCB4 Œ CLR R2 ; Get ready for BISB0� BISB S.RCNT(R4),R2 ; R2 = Word count to copy0Ž MOV 2(SP),R0 ; Generate error packet pointer� ADD #C.LOG,R0 ; ...W@� MOV C.MODE-C.LOG(R0),E.MODE(R0) ; Save current mode in packet7‘ 20$: MOV (R0)+,(R1)+ ; Copy data to error log packet ’ DEC R2 ; ...s“ BNE 20$ ; ...,” TST S.PKT(R4) ; Do we have an I/O packet• BNE 30$ ; Yes$– CLR R4 ; No I/O packet, no SCB.,— 30$: CALL $FNERL ; Finish this error log7˜ 40$: MOV 2(SP),R2 ; Generate pointer to error packet ™ ADD #C.LOG,R2 ; ....3š MOV #/2,R3 ; Error packet size in wordsR › 50$: CLR (R2)+ ; Zero packetœ DEC R3 ; ... � BNE 50$ ; ...6ž CALL MAPDRV ; Make sure we are mapped to driver's.Ÿ RETURN ; ... APR6 space before returning  9¡ APR5PC ERLOG ; Make sure ERLOG is in APR5 addr space)¢ £ .IFFe¤ 0¥ ERLOG: RETURN ; NOP if no error log support¦ § .ENDC ; E$$DVC¨ © ª #« .SBTTL RCCMP - Receive complete2¬ ;+­ ; **-RCCMP-Receive completep® ; M¯ ; This routine is called after all the interrupts have been serviced. ThisRL° ; routine scans the receive complete pending queue for a complete message.J± ; Upon finding a complete message, the destination is found and the data"² ; transfered to the user buffer.³ ;- ´ ; Inputs:sµ ; R4 = Controller State Table¶ ; · ; Registers modified:R¸ ; R0, R1, R2, R3¹ ;g0º RCCMP: CALL MAPDRV ; Map to 2nd 4K of driver» ¼ CLR R1 ; Init error status;½ MOV #-<6+6+2>,C.RML(R4) ; Assume normal receive overheadi¾ 10$:;¿ MOV C.RCVD(R4),R5 ; Get first item of received messagest"À BEQ 60$ ; No more, Just exit.-Á BITB #RF.STP,M.ERR(R5) ; Start of message?i BNE 30$ ; YesEà MOV (R5),C.RCVD(R4) ; No, deque receive buffer from received listf>Ä MOV C.RBFL(R4),(R5) ; Insert buffer in free receive buffer Å MOV R5,C.RBFL(R4) ; ... list#Æ BR 10$ ; Find start of messageDÇ 20$:)È MOV (R5),R5 ; Get next message blockn/É BEQ 60$ ; No more, wait for rest to arrivesÊ 30$:;Ë BITB #RF.ENP,M.ERR(R5) ; Is this the end of the message?sÌ BEQ 20$ ; NomÍ 1Î BIC #170000,M.MLEN(R5) ; Clear high order bitsR1Ï MOV M.MLEN(R5),C.RML(R4) ; Save message length;@Ð SUB #4+6+6+2,C.RML(R4) ; Account for CRC/Dest/Source/protocolÑ -Ò BITB #RF.ERR,M.ERR(R5) ; Error in message? +Ó BNE 50$ ; Discard messages with errors Ô 8Õ MOV C.RCVD(R4),R5 ; Get buffer with protocol/address+Ö MOV R4,R1 ; Point to protocol listheadQ× ADD #C.PROL,R1 ; ...;Ø 40$: MOV (R1),R1 ; Get addr of next protocol list entry !Ù BNE 70$ ; If NE, we have one$&Ú 50$: CALLR 210$ ; ... else no more!Û 60$: CALLR 200$ ; Just returnMÜ Ý 70$: CMP PL.PRO(R1),M.PRO(R5)t"Þ BNE 40$ ; If NE, keep lookingß ,à MOVB PL.FLG(R1),R0 ; Save protocol flagsá Gâ MOV PL.EXC(R1),R3 ; Assume this is an exclusive or default protocolrã BIT #LF.EXC,R0 ; Is it? ä BNE 100$ ; If NE, it iså 4æ ADD #PL.ADD,R1 ; Point to address chain listhead>ç 80$: MOV (R1),R1 ; Get address of next address chain entry,è BNE 90$ ; If NE, another entry to check+é BIT #LF.DEF,R0 ; Default owner enabled?e,ê BEQ 50$ ; If EQ, no ... toss the packet/ë BR 100$ ; Process packet for default ownerEì Hí 90$: CMP M.SADD(R5),AD.ADD(R1) ; Compare address of received message,î BNE 80$ ; ... to protocol's addresses"ï CMP M.SADD+2(R5),AD.ADD+2(R1) ;ð BNE 80$ ;"ñ CMP M.SADD+4(R5),AD.ADD+4(R1) ;ò BNE 80$ ;ó 2ô MOV AD.PRT(R1),R3 ; Get address of owning portõ 7ö 100$: BIT #1,M.DADD(R5) ; Was this message sent to an÷ ; ... multicast address?Dø BEQ 120$ ; If EQ, nol)ù MOV R3,R1 ; Get pointer to multicast /ú ADD #P.MCST,R1 ; ... address chain listhead û 7ü 110$: MOV (R1),R1 ; Get pointer to next multicasteý ; ... address blockþ BEQ 50$ ; If EQ, no moreeBÿ CMP M.DADD(R5),ML.ADD(R1) ; Compare message multicast address0 BNE00³j„œƒ_ƒt÷tø tþfDATA 110$ ; ... to the multicast addresses/ CMP M.DADD+2(R5),ML.ADD+2(R1) ; ... enabled.t BNE 110$ ;1" CMP M.DADD+4(R5),ML.ADD+4(R1) ;  BNE 110$  120$:l4 BIT #LF.PAD,R0 ; Does this protocol use padding? BEQ 130$ ; If EQ, not; MOV M.DATA(R5),C.RML(R4) ; yes, first word is byte count: MOV #2,C.POVH(R4) ; Account for byte count in 1st word ; ... of messagek ;BJ ; At this point we have found the destination port. Now we have to find- ; the I/O packet associated with that port.t ;l 130$:d' MOV R3,R5 ; Put port address in R5;, MOV R4,R3 ; Generate receive wait Q ptr ADD #C.RCVW,R3 ; ... 140$:01 MOV R3,R2 ; Save privious I/O packet pointero& MOV (R3),R3 ; Get next I/O packet. BEQ 50$ ; None there, discard the message1 MOV IP.EXT(R3),R1 ; R1 = I/O packet extensiono6 CMP IX.FCN(R1),R5 ; I/O packet owned by this port? BNE 140$ ; Loop till found & MOV (R3),(R2) ; Dequeue I/O packet  ;hH ; We found the owner of the message. Now we must transfer the message ; to the user buffer. ;V4 MOV #IE.DAO&377,-(SP) ; Assume data overrun error! 2" MOV I.PRM+4(R3),R1 ; Get size of user's buffer:# CMP C.RML(R4),R1 ; Is data block > than user's buffer?$ BHI 150$ ; If HI, yes % MOV C.RML(R4),R1 ; get count0& MOV #IS.SUC&377,(SP) ; ... and return success:' 150$: MOV R1,C.RML(R4) ; Save byte count for completion/( MOV R1,-(SP) ; Save byte count for I/O donea) 1* 160$: MOV R3,-(SP) ; Save registers R3, R4, R5 + MOV R4,-(SP) ; ..e, MOV R5,-(SP) ; ..e- &. MOV C.RCVD(R4),R0 ; Get 1st buffer4/ ADD #M.DADD,R0 ; Point to destination addr field70 MOV (R0)+,P.RDAD(R5) ; Save destination addr in porta1 MOV (R0)+,P.RDAD+2(R5) ; ... 2 MOV (R0)+,P.RDAD+4(R5) ; ...C23 MOV (R0)+,P.RSAD(R5) ; Save source addr in port4 MOV (R0)+,P.RSAD+2(R5) ; ...O5 MOV (R0)+,P.RSAD+4(R5) ; ... 46 MOV (R0)+,P.RPRO(R5) ; Save protocol addr in port7 ,8 MOV R4,R5 ; R5 = Controller State Table9 170$:R*: CALL MAPDRV ; Map to 2nd 4K of driver; 7< MOV #M.DBSZ,R0 ; R0 = Byte count (assume full buff)D= SUB C.POVH(R5),R0 ; ...n> 5? CMP R0,C.RML(R5) ; Less than full receive buffer?n@ BLO 180$ ; No3A MOV C.RML(R5),R0 ; Yes, use byte count in C.RML55B 180$: SUB R0,C.RML(R5) ; Account for current block C #D MOV DAPR6,R1 ; Source APR5 bias E +F MOV C.RCVD(R5),R2 ; Source displacementR8G MOVB M.ERR(R2),-(SP) ; Save START/STOP bits on stack1H ADD #M.DATA,R2 ; Point to data area of bufferV6I BITB #RF.STP,(SP)+ ; Is this 1st buffer of messageJ BNE 185$ ; Yese?K SUB #M.DATA-M.DADD,R2 ; No, so data starts where destination5?L ADD #M.DATA-M.DADD,R0 ; Account for added data in this blockCCM SUB #M.DATA-M.DADD,C.RML(R5); Subtract added data from remainder)2N BGE 185$ ; We have not exceeded the remainder6O ADD C.RML(R5),R0 ; Adjust byte count of this block-P CLR C.RML(R5) ; Indicate this block is it 0Q 185$: ; ... address is in the first buffer"R MOV R0,-(SP) ; Save byte countS 5T ADD C.POVH(R5),R2 ; Add padding overhead, if any. #U SUB #20000,R2 ; Biased for APR5N8V CLR C.POVH(R5) ; Padding overhead only for 1st blockW 1X MOV I.PRM+2(R3),R4 ; Destination displacement.(Y MOV @I.PRM(R3),R3 ; Destination APR6Z [ CALL $BLXIO ; Copy the data\ !] MOV (SP)+,R0 ; Get byte countC)^ MOV 4(SP),R3 ; Get I/O packet addresso1_ ADD R0,I.PRM+2(R3) ; Increment buffer pointer` :a MOV C.RCVD(R5),R0 ; Dequeue buffer From receive done Q)b BEQ 230$ ; Something is wrong, stop!,;c MOV (R0),C.RCVD(R5) ; Dequeue buffer from received listsd 4e MOV C.RBFL(R5),(R0) ; Insert buffer in free listf MOV R0,C.RBFL(R5) ; ...Mg 0h BIT #RF.ENP,M.ERR(R0) ; Was it an END buffer?i BEQ 187$ ; No'j TST C.RML(R5) ; Is char count zero?a k BNE 230$Vl %m 187$: TST C.RML(R5) ; Are we done?R"n BNE 170$ ; No, get next blocko /p MOV (SP)+,R5 ; Restore registers R5, R4, R3Mq MOV (SP)+,R4 ; ...r MOV00³r„—ƒ9ƒ´cÚµcÛ¶c�·c›’ (SP)+,R3 ; ...s 5t TST I.PRM+6(R3) ; Auxilliary char. buffer exists?(#u BEQ 190$ ; If EQ, none present 7v CALL RCVCH ; Process received msg. characteristicsew x 190$:t=y MOV (SP)+,I.PRM+4(R3) ; Save byte count and I/O completionW3z MOV (SP)+,I.PRM+2(R3) ; ... status in I/O packetL3{ CALL RCVDN ; Post completion on the I/O packet$| BR 220$ ; Continue } ;~ 200$: BIC #CS.ENP,C.FLAG(R4) ; Clear end packet seen flag;3 CALLR GTRBF ; Add some buffers to receive ring.€ @� 210$: MOV C.RCVD(R4),R5 ; Get first item of received messages‚ BEQ 200$ ; We must be donef2ƒ MOV (R5),C.RCVD(R4) ; Deque from received list7„ MOV C.RBFL(R4),(R5) ; Insert into receive free listM… MOV R5,C.RBFL(R4) ; ...I'† BITB #RF.ENP,M.ERR(R5) ; Last block?;‡ BEQ 210$ ; No9ˆ 220$: CALLR RCCMP ; look for another received message$‰ 4Š 230$: MOV (SP)+,R5 ; Restore registers R5, R4, R3‹ MOV (SP)+,R4 ; ...Œ MOV (SP)+,R3 ; ...*� MOV (SP)+,I.PRM+4(R3) ; Save byte countŽ TST (SP)+ ; Tidy stack;4� MOV #IE.DAO&377,I.PRM+2(R3) ; Indicate data error"� CLR I.PRM+4(R3) ; Zero receive!‘ CALL RCVDN ; Post completion #’ BR 220$ ; Process next receivee“ ” • s>– .SBTTL ****************************************************>— .SBTTL * QIO UNA characteristics processing routines *>˜ .SBTTL ****************************************************™ =š .SBTTL RCVCH - Process receive auxilliary characteristics.› ;+7œ ; **-RCVCH-Process receive auxilliary characteristicsT� ;tIž ; Process the characteristics present in the auxilliary characteristicsR"Ÿ ; buffer on the receive request.  ;- ¡ ; Inputs:"¢ ; R3 = Address of the I/O packet<£ ; I.PRM+6 - Virtual address of the characteristics buffer3¤ ; I.PRM+10- Length of the characteristics bufferc¥ ; R4 = Controller State TableB¦ ; R5 = Port State table*§ ;*¨ ; Registers modified: © ; R0, R1, R2ª ;P7« RCVCH: MOV IP.EXT(R3),R0 ; R0 = I/O packet extensionR¬ 1­ .IF DF M$$MGE ; Memory management supported?® .¯ MOV IX.AUX(R0),@#KISAR6 ; Map to AUX buffer° 1± .IF DF K$$DAS ; Kernel data space supported?s6² MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spcae³ .ENDC ; K$$DAS´ µ .ENDC ; M$$MGE¶ A· MOV I.PRM+6(R3),R0 ; Point to start of characteristics buffer1¸ MOV R0,P.WORK(R5) ; Create end of user buffert9¹ ADD I.PRM+10(R3),P.WORK(R5) ; P.WORK = End user buffer º >» 10$: MOV #CS.IGN,R1 ; Assume characteristic will be ignored5¼ MOV (R0),R2 ; Get next characteristics type code 0½ SUB #CC.ADR,R2 ; Normalise for DLX functions4¾ BLT 20$ ; If LT, not one of our characteristics¿ ASL R2 ; Form word offsetÀ CMP R2,#RCMAX ; In range? Á BHIS 20$ ; If HIS, no- CLR C.DATO(R0) ; Assume no data available 5à CALL @RCVTBL(R2) ; Dispatch to processing routine Ä @Å 20$: MOV R1,C.STAT(R0) ; Return status of this characteristic4Æ ADD C.DATI(R0),R0 ; Point to next characteristicÇ ADD #C.CHRL,R0 ; ...(È CMP R0,P.WORK(R5) ; Are we done yet?É BLO 10$ ; If LO, noÊ *Ë CALL MAPDRV ; Map to 2nd 4K of driver Ì RETURN;Í Î ;+*Ï ; Receive characteristics dispatch tableÐ ;- Ñ RCVTBL::Ò .WORD RCVDAD ; Get source field from received message9Ó .WORD RCVPRO ; Get protocol field from received msg.V6Ô .WORD RCVADR ; Get dest. field from received msg.Õ RCMAX =.-RCVTBL Ö 9× APR5PC RCVCH ; Make sure RCVCH is in APR5 addr spaceoØ Ù Ú h;Û .SBTTL RCVADR - Get destination field from received msg. Ü ;+6Ý ; **-RCVADR-Get destination field from received msg.Þ ;;0ß ; Get destination field from received message.à ;- á ; Inputs:i)â ; R0 = Address of characteristics block.9ã ; R1 = Default status (CS.IGN = Characteristic ignored)."ä ; R3 = Address of the I/O packet0å ; R5 = Port State table (contains source addr)æ ; ç ; Outputs:,è ; R1 = Status to return for characteristicé ;aDê RCVADR: CMP C.DATI(R0),#6 ; Are there at least 6 bytes available?ë BLO 10$ ; If LO, noì í MOV P.RDAD(R500³z„œƒ_ƒt÷tø tþfDATA),C.CHRL(R0) î MOV P.RDAD+2(R5),C.CHRL+2(R0) ï MOV P.RDAD+4(R5),C.CHRL+4(R0)>ð MOV #6,C.DATO(R0) ; Fill in Ethernet address and it's size1ñ MOV #CS.SUC,R1 ; Return successful completionsò ó 10$: RETURNrô ;õ APR5PC RCVADR ; Make sure RCVADR is in APR5 addr space=ö ÷ t8ø .SBTTL RCVPRO - Get protocol field from received msg.ù ;+6ú ; **-RCVPRO-Get protocol field from received messageû ;R-ü ; Get protocol field from received message.ý ;- þ ; Inputs:O)ÿ ; R0 = Address of characteristics blockM9 ; R1 = Default status (CS.IGN = Characteristic ignored)R" ; R3 = Address of the I/O packet$ ; R5 = Address of Port State Table ;S  ; Outputs:, ; R1 = Status to return for characteristic ; D RCVPRO: CMP C.DATI(R0),#2 ; Are there at least 2 bytes available? BLO 10$ ; If LO, no  MOV P.RPRO(R5),C.CHRL(R0)? MOV #2,C.DATO(R0) ; Fill in Ethernet protocol and it's size1 MOV #CS.SUC,R1 ; Return successful completion-  10$: RETURN  ; APR5PC RCVPRO ; Make sure RCVPRO is in APR5 addr spaceC  h9 .SBTTL RCVDAD - Get source field from received message ;+4 ; **-RCVDAD-Get source field from received message ;=* ; Get source field from received message ;-  ; Inputs:I) ; R0 = Address of characteristics blocka9 ; R1 = Default status (CS.IGN = Characteristic ignored)L" ; R3 = Address of the I/O packet ; R5 = Port State Tables ;  ; Outputs:, ; R1 = Status to return for characteristic! ;RD" RCVDAD: CMP C.DATI(R0),#6 ; Are there at least 6 bytes available?# BLO 10$ ; If LO, no$ 6% MOV P.RSAD(R5),C.CHRL(R0) ; Put Sender's Ethernet>& MOV P.RSAD+2(R5),C.CHRL+2(R0) ; ... address into AUX buffer&' MOV P.RSAD+4(R5),C.CHRL+4(R0) ; ...>( MOV #6,C.DATO(R0) ; Fill in Ethernet address and it's size1) MOV #CS.SUC,R1 ; Return successful completionL* + 10$: RETURNo, ;- APR5PC RCVDAD ; Make sure RCVDAD is in APR5 addr space. / S>0 .SBTTL XMCHR - Process transmit auxilliary characteristics1 ;+82 ; **-XMCHR-Process transmit auxilliary characteristics3 ; I4 ; Process the characteristics present in the auxilliary characteristicsA#5 ; buffer on the transmit request.t6 ;- 7 ; Inputs:V"8 ; R3 = Address of the I/O packet<9 ; I.PRM+6 - Virtual address of the characteristics buffer3: ; I.PRM+10- Length of the characteristics buffer ; ; R4 = Port Status Table.< ; R5 = Address of the Controller State Table= ;> ; Registers modified:H? ; R0, R1, R2@ ; 7A XMTCH: MOV IP.EXT(R3),R0 ; R0 = I/O packet extensionaB 1C .IF DF M$$MGE ; Memory management supported? D .E MOV IX.AUX(R0),@#KISAR6 ; Map to AUX bufferF 1G .IF DF K$$DAS ; Kernel data space supported? 6H MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceI .ENDC ; K$$DASJ K .ENDC ; M$$MGEL FM BIC #PS.ADR!PS.PRO,P.FLAG(R5) ; Clear addr/protocol found flag bitsN AO MOV I.PRM+6(R3),R0 ; Point to start of characteristics bufferiP 2Q MOV R0,P.WORK(R5) ; Compute end of user buffer<R ADD I.PRM+10(R3),P.WORK(R5) ; P.WORK = End of user bufferS >T 10$: MOV #CS.IGN,R1 ; Assume characteristic will be ignored5U MOV (R0),R2 ; Get next characteristics type codea0V SUB #CC.ADR,R2 ; Normalise for DLX functions4W BLT 20$ ; If LT, not one of our characteristicsX ASL R2 ; Form word offsetY CMP R2,#XMMAX ; In range?rZ BHIS 20$ ; If HIS, no5[ CALL @XMTTBL(R2) ; Dispatch to processing routinea\ @] 20$: MOV R1,C.STAT(R0) ; Return status of this characteristic4^ ADD C.DATI(R0),R0 ; Point to next characteristic_ ADD #C.CHRL,R0 ; ...(` CMP R0,P.WORK(R5) ; Are we done yet?a BLO 10$ ; If LO, nob *c CALL MAPDRV ; Map to 2nd 4K of driver d RETURNRe f ;++g ; Transmit characteristics dispatch table h ;-?i XMTTBL: .WORD XMTADR ; Define Ethernet address for transmitR9j .WORD XMTPRO ; Define Ethernet protocol for transmit k XMMAX =.-XMTTBLal 9m APR5PC XMTCH ; Make sure XMTCH is in APR5 addr spaceun o 7p .SBTTL XMTADR - Define Ethernet00³‚„—ƒ9ƒ´cÚµcÛ¶c�·c›’ address for transmitnq ;+2r ; **-XMTADR-Define Ethernet address for transmits ;RIt ; Define the Ethernet address to be used for this message transmission.pu ;- v ; Inputs:r)w ; R0 = Address of characteristics blockt9x ; R1 = Default status (CS.IGN = Characteristic ignored)D"y ; R3 = Address of the I/O packet.z ; R5 = Address of the Controller State Table{ ;a | ; Outputs:,} ; R1 = Status to return for characteristic~ ;CE XMTADR: CMP C.DATI(R0),#6 ; Are there at least 6 bytes of address?a€ BLO 10$ ; If LO, no� :‚ MOV C.CHRL(R0),P.XDAD(R5) ; Fill in Ethernet address&ƒ MOV C.CHRL+2(R0),P.XDAD+2(R5) ; ...&„ MOV C.CHRL+4(R0),P.XDAD+4(R5) ; ...=… BIS #PS.ADR,P.FLAG(R5) ; Indicate Ethernet address seen=3† MOV #CS.SUC,R1 ; Return successful completion ‡ ˆ 10$: RETURNh‰ ;Š APR5PC XMTADR ; Make sure XMTADR is in APR5 addr spacea‹ Œ p8� .SBTTL XMTPRO - Define Ethernet protocol for transmitŽ ;+3� ; **-XMTPRO-Define Ethernet protocol for transmitf� ;eJ‘ ; Define the Ethernet protocol to be used for this message transmission.’ ;- “ ; Inputs:)” ; R0 = Address of characteristics blockM9• ; R1 = Default status (CS.IGN = Characteristic ignored)5"– ; R3 = Address of the I/O packet2— ; R5 = Address of the physical link access block˜ ; ™ ; Outputs:,š ; R1 = Status to return for characteristic› ;iFœ XMTPRO: CMP C.DATI(R0),#2 ; Are there at least 2 bytes of protocol?� BLO 10$ ; If LO, nož 9Ÿ MOV C.CHRL(R0),P.XPRO(R5) ; Fill in Ethernet protocoli?  BIS #PS.PRO,P.FLAG(R5) ; Indicate Ethernet protocol seen.7¡ MOV #CS.SUC,R1 ; Return successful completion ¢ £ 10$: RETURNf¤ ;¥ APR5PC XMTPRO ; Make sure XMTPRO is in APR5 addr spaceo¦ § -¨ .SBTTL GTCHR - Get device characteristicsc© ;+'ª ; **-GTCHR-Get device characteristics « ;tE¬ ; The get characteristics function is used to read device dependenta,­ ; characteristics for Ethernet interfaces.® ;- ¯ ; Inputs:V° ; R3 = Address of I/O packet± ; R4 = Contoller State Table² ; r5 = Port State Tablea³ ;h´ ; Registers modified:Mµ ; R0, R1, R2¶ ;; · .ENABL LSBf¸ ¹ GTCHR: MOV R3,-(SP) ; Save R3º 1» .IF DF M$$MGE ; Memory management supported? ¼ ;½ MOV @IP.EXT(R3),@#KISAR6 ; Map to characteristics buffer¾ 1¿ .IF DF K$$DAS ; Kernel data space supported? 6À MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceÁ .ENDC ; K$$DAS à .ENDC ; M$$MGEÄ 9Å MOV I.PRM+2(R3),R0 ; R0 = Virtual addr of user bufferBÆ MOV R0,P.WORK+4(R5) ; Save start addr for later. We will need1Ç ; ... it to compute how much of the bufferN%È ; ... we were able to process.S4É MOV R0,-(SP) ; Compute address past end of blockÊ ADD I.PRM+4(R3),(SP) ; ...)Ë AÌ MOV C.PROL(R4),P.WORK(R5) ; Save protocol and multicast listr:Í MOV P.MCST(R5),P.WORK+2(R5) ; ... pointer in work area.Î 4Ï 10$: MOV (R0),R2 ; Get next characteristics typeÐ BEQ 40$ ; No moreÑ 2Ò SUB #CC.DST,R2 ; Normalise for driver dispatch4Ó BLT 20$ ; If LT, not one of our characteristicsÔ ASL R2 ; Form word offsetÕ CMP R2,#GETMAX ; In range?Ö BHIS 20$ ; If HIS, no-× MOV #CS.IGN,R1 ; Assume request too smallpØ 5Ù CALL @GETTBL(R2) ; Dispatch to processing routineV Ú BR 20$ ;OÛ +Ü 15$: MOV #CE.UDF,R1 ; Undefined functionMÝ CLR R2 ; Nothing processedpÞ 9ß 20$: MOV R1,C.STAT(R0) ; Return status of this requestc=à MOV R2,C.DATO(R0) ; Return length of returned information;?á 30$: ADD C.DATI(R0),R0 ; Point to next characteristics blockoâ ADD #C.CHRL,R0 ; ...#ã CMP R0,(SP) ; Are we done yet?Gä BLO 10$ ; If LO, noå 40$:#æ TST (SP)+ ; Clean up the stacks-ç MOV (SP)+,R3 ; Restore I/O packet address è *é CALL MAPDRV ; Map to 2nd 4K of driverê >ë MOV P.CTBL(R5),R4 ; Restore Controller State Table pointer8ì MOV R0,R1 ; Indicate we processed all of the bufferAí SUB P.WORK+4(R5),R1 ; Compute number of characteristics proc.r%î MOV #CS.SUC,R0 ; Indicate success("ï CALLR RQDON00³Š„œƒ_ƒt÷tø tþfDATA ; Post completionð ñ .DSABL LSB#ò ;+&ó ; Get characteristics dispatch tableô ;-<õ GETTBL: .WORD GETDST ; Get remote address/protocol pairs+ö .WORD GETMCT ; Get a multicast addressp÷ GETMAX =.-GETTBLø 9ù APR5PC GTCHR ; Make sure GTCHR is in APR5 addr space5ú û e4ü .SBTTL GETDST - Get remote address/protocol pairsý ;+/þ ; **-GETDST-Get remote address/protocol pairs+ÿ ;,I; Get the next protocol and associated addresses enabled for this port.t;- ; Inputs:R); R0 = Address of characteristics blockS4; R1 = Default status (CE.RTS = Request too small); R3 = Address of I/O packet; R4 = Controller State Table ; R5 = Port State Tablet; ; Outputs:, ; R1 = Status to return for characteristic+ ; R2 = # of bytes of returned information  ;T ; Registers modified:r; R1, R2, R4; 4GETDST: CLR R2 ; Assume no output data available: CMP C.DATI(R0),#4 ; Enough space for a protocol entry? BLO 100$ ; If LO, no& CLR -(SP) ; Reserve cell on stack510$: MOV #CS.SUC,R1 ; Assume successful completion 1 MOV R0,R2 ; Compute address of output buffer= ADD #C.CHRL,R2 ; ...4 MOV P.WORK(R5),R4 ; Get next protocol list entry BEQ 50$ ; If EQ, no moree8 MOV (R4),P.WORK(R5) ; Move on down the protocol list5 MOV C.DATI(R0),(SP) ; Set up remaining byte countD2 SUB #4,(SP) ; ... for building characteristic  CLR -(SP) ; Initialise flag: MOV PL.PRO(R4),(R2)+ ; Assume we will use this protocolC  MOV PL.FLG(R4),(R2)+ ; Set up flags and usage count for protocolf4! ADD #PL.ADD,R4 ; Point to address chain listhead"3#20$: MOV (R4),R4 ; Get next address chain entry,$ BEQ 40$ ; If EQ, no moret,% CMP AD.PRT(R4),R5 ; Is it for this port?)& BNE 20$ ; If NE, no ... keep lookingi-' INC (SP) ; Indicate valid protocol foundb2( SUB #6,2(SP) ; Reduce count of remaining bytes-) BLT 30$ ; If LT, insufficient space left9* MOV AD.ADD(R4),(R2)+ ; Copy address into output bufferl+ MOV AD.ADD+2(R4),(R2)+ ; ...p, MOV AD.ADD+4(R4),(R2)+ ; ...o- BR 20$ ; Keep looking.%/30$: MOV #CS.DAO,R1 ; Data overrunV2040$: TST (SP)+ ; Was this protocol acceptable?1 BEQ 10$ ; If EQ, no2'350$: TST (SP)+ ; Clean up the stack.4 SUB R0,R2 ; Compute length of output data5 SUB #C.CHRL,R2 ; ...6100$: RETURN7;8 APR5PC GETDST ; Make sure GETDST is in APR5 addr space;9: n*; .SBTTL GETMCT - Get a multicast address<;+%=; **-GETMCT-Get a multicast addressV>;D9?; Get the next multicast address enabled for this port.B@;- A; Inputs:i)B; R0 = Address of characteristics blocku4C; R1 = Default status (CE.RTS = Request too small)D; R3 = Address of I/O packetE; R4 = Controller State Table F; R5 = Port State TablemG;l H; Outputs:,I; R1 = Status to return for characteristic+J; R2 = # of bytes of returned information K; L; Registers modified:nM; R4N;E8OGETMCT: MOV R0,R2 ; Compute address of output bufferP ADD #C.CHRL,R2 ; ...=Q CMP C.DATI(R0),#6 ; Enough space for a multicast address?-R BLO 20$ ; If LO, noS:T MOV P.WORK+2(R5),R4 ; Get next multicast address entryU BEQ 10$ ; If EQ, no more=V MOV (R4),P.WORK+2(R5)AW MOV ML.ADD(R4),(R2)+ ; Copy multicast address to output bufferX MOV ML.ADD+2(R4),(R2)+ ; ...tY MOV ML.ADD+4(R4),(R2)+ ; ...#Z.[10$: MOV #CS.SUC,R1 ; Return success status2\20$: SUB R0,R2 ; Compute length of output data] SUB #C.CHRL,R2 ; ... ^ RETURN_9` APR5PC GTMCT ; Make sure GTMCT is in APR5 addr spacerab a-c .SBTTL STCHR - Set device characteristicsMd;+'e; **-STCHR-Set device characteristicssf;yGg; The set characteristics function is used to set up device dependent(Hh; functions for the Ethernet interfaces (e.g. Protocol/address pairs).i;- j; Inputs:Vk; R3 = Address of I/O packetl; R4 = Controller State Tableum; R5 = Port State Table,n;;o; Registers modified: p; R0, R1, R2, R3, R4q;. r .ENABL LSBs00³’„—ƒ9ƒ´cÚµcÛ¶c�·c›’(tSTCHR: MOV R3,-(SP) ; Save I/O packetu1v .IF DF M$$MGE ; Memory management supported? w;x MOV @IP.EXT(R3),@#KISAR6 ; Map to characteristics buffery1z .IF DF K$$DAS ; Kernel data space supported?e6{ MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space| .ENDC ; K$$DAS}~ .ENDC ; M$$MGE<€ MOV I.PRM+2(R3),R0 ; R0 = Characteristics buffer pointer�;‚ MOV R0,P.WORK(R5) ; Save start addr of buffer. We willi+ƒ ; ... need it to compute how much ofB.„ ; ... the buffer we were able to procss<… MOV R0,P.WORK+2(R5) ; Initialize how far we got pointer.†4‡ MOV R0,-(SP) ; Compute address past end of blockˆ ADD I.PRM+4(R3),(SP) ; ...;‰4Š10$: MOV (R0),R2 ; Get next characteristics type‹ BEQ 30$ ; No moreŒ.� MOV #CE.UDF,R1 ; Assume undefined function%Ž SUB #CC.DST,R2 ; Make it an indexr4� BLT 20$ ; If LT, not one of our characteristics� ASL R2 ; Form word offset‘ CMP R2,#SETMAX ; In range?’ BHIS 20$ ; If HIS, no-“ MOV #CE.RTS,R1 ; Assume request too smallV”• MOV R0,-(SP) ; Save R05– CALL @SETTBL(R2) ; Dispatch to processing routinea— MOV (SP)+,R0 ; Restore R0D%˜ BCS 40$ ; If CS, stop processingV™ ; ... characteristics9š20$: MOV R1,C.STAT(R0) ; Return status of this request ;› ADD C.DATI(R0),R0 ; Point to next characteristics block œ ADD #C.CHRL,R0 ; ...>� MOV R0,P.WORK+2(R5) ; Indicate how far we got successfully#ž CMP R0,(SP) ; Are we done yet?Ÿ BLO 10$ ; If LO, no 1¡30$: MOV #CS.SUC,R1 ; Indicate, processed allM¢ ; ... characteristics'£40$: TST (SP)+ ; Clean up the stacko-¤ MOV (SP)+,R3 ; Restore I/O packet address46¥ MOV P.CTBL(R5),R4 ; Restore Controller State Table*¦ CALL MAPDRV ; Map to 2nd 4K of driver§E¨ SUB P.WORK(R5),P.WORK+2(R5) ; Compute how much we have processed 8© MOV P.WORK+2(R5),I.PRM+4(R3) ; Save it in I/O packet9ª MOV R1,I.PRM+2(R3) ; Save status code in I/O packetA5« BIT #PS.MLC,P.FLAG(R5) ; Multicast list changed?M¬ BEQ 50$ ; Noi3­ MOV IP.EXT(R3),R0 ; R0 = I/O packet extensionB® MOV #FN.WML,IX.FCN(R0) ; Write Multicast List to UNA function8¯ $QPKT C.PFNC ; Queue packet to function pending Q/° CALLR FNINI ; Try to initiate a functionK±(²50$: MOV I.PRM+2(R3),R0 ; R0 = Status-³ MOV I.PRM+4(R2),R1 ; R1 = Bytes processedV(´ CALLR RQDON ; Return status to userµ¶ · .DSABL LSBR¸¹;+&º; Set characteristics dispatch table»;-?¼SETTBL: .WORD SETDST ; Define remote address/protocol pairsi+½ .WORD SETMCT ; Set a multicast addressx¾SETMAX =.-SETTBL¿9À APR5PC STCHR ; Make sure STCHR is in APR5 addr spacePÁ 7à .SBTTL SETDST - Define remote address/protocol pairs Ä;+2Å; **-SETDST-Define remote address/protocol pairsÆ; EÇ; Define a number of address/protocol pairs for the specified port.RÈ;- É; Inputs:t-Ê; R0 = Address of the characteristics block4Ë; R1 = Default status (CE.RTS = Request too small)Ì; R3 = Address of I/O packetÍ; R4 = Controller State tableDÎ; R5 = Port State Table Ï;s Ð; Outputs:,Ñ; R1 = Status to return for characteristic=Ò; 'C' Clear - Address/protocol entries successfully created 9Ó; 'C' Set - failed to create address/protocol entriesrÔ; Õ; Registers modified:Ö; R0, R2, R4×;e=ØSETDST: MOV R0,R4 ; Copy address of characteristics block 8Ù CLR P.WORK+4(R5) ; Show no allocations performed yetÚ CLR P.WORK+6(R5) ; ...Û;Ü MOV C.DATI(R4),R2 ; Get length of characteristics block=+Ý SUB #4,R2 ; Remove protocol descriptor /Þ BEQ 15$ ; Br if no addresses - only headert(ß BLT 200$ ; If LT, request too small4à10$: SUB #6,R2 ; Remove another Ethernet address á BGT 10$ ; If GT, more to go(â BMI 200$ ; If MI, request too smallã7ä15$: MOV #CE.PCN,R1 ; Assume protocol usage conflictdAå20$: MOV P.CTBL(R5),R2 ; Get address of protocol list listheadcæ ADD #C.PROL,R2 ; ...ç9è30$: MOV (R2),R2 ; Get address of next protocol blocko00³š„œƒ_ƒt÷tø tþfDATAé BEQ 50$ ; If EQ, no moreB8ê CMP PL.PRO(R2),C.CHRL(R4) ; Protocol already in list?'ë BNE 30$ ; If NE, not this protocol0ì3í MOVB PL.FLG(R2),R0 ; Get current protocol flagsv;î BISB C.CHRL+2(R4),R0 ; ... or'd with new protocol flags9ï BIT #LF.EXC,R0 ; Did either request exclusive access?E0ð BNE 200$ ; If NE, yes ... protocol conflictñ-ò BITB #LF.DEF,C.CHRL+2(R4) ; Default owner?l9ó BEQ 40$ ; If EQ, we are not enabling a default owner .ô BITB #LF.DEF,PL.FLG(R2) ; Can we enable it?4õ BNE 200$ ; If NE, default owner already enabledöC÷40$: MOVB PL.FLG(R2),-(SP) ; Check for consistent padding requestø BIC #^C,(SP) ; ...rù MOVB C.CHRL+2(R4),R0 ; ...ú BIC #^C,R0 ; ...2û CMP R0,(SP)+ ; Did they both request the same?ü BNE 200$ ; If NE, noE(ý BR 60$ ; Use current protocol blockþ:ÿ50$: MOV #PL.LEN,R1 ; Get length of protocol list entry% CALL $ALOCB ; Allocate the block 7 MOV #CE.RES,R1 ; Assume resource allocation failurei) BCS 200$ ; If CS, allocation failurer3 MOV R0,R2 ; Copy address of the protocol blockr$ CLR (R0)+ ; Clear the link word0 MOVB C.CHRL+2(R4),(R0)+ ; Copy protocol flags" CLRB (R0)+ ; Zero usage count3  MOV C.CHRL(R4),(R0)+ ; Fill in the protocol type4  CLR (R0)+ ; Assume no default or exclusive user,  CLR (R0) ; Build address chain listhead  MOV R0,2(R0) ; ...  MOV R4,-(SP) ; Temp save R4h3 MOV P.CTBL(R5),R4 ; R4 = Controller state tablel/ MOV R2,@C.PROL+2(R4) ; Add protocol entry too0 MOV R2,C.PROL+2(R4) ; ... end of master list MOV (SP)+,R4 ; Restore R4+?60$: BITB #LF.EXC!LF.DEF,C.CHRL+2(R4) ; Exclusive or default?f4 BEQ 70$ ; If EQ, not exculsive or default owner9 MOV R5,PL.DEF(R2) ; Set up default or exclusive ownerA@70$: MOV R2,P.WORK+4(R5) ; Save address of the protocol block= MOV C.DATI(R4),R2 ; Get size of the characteristics block  SUB #4,R2 ; Remove overhead0 BEQ 75$ ; If EQ, no addresses to be enabled% CALL BLDADR ; Build address list, BCS 200$ ; If CS, failure@75$: MOV P.WORK+4(R5),R2 ; Get address of protocol list entry9 80$: MOV P.WORK+6(R5),R0 ; Get next address list entryQ! BEQ 90$ ; If EQ, no morer," MOV (R0),P.WORK+6(R5) ; Save next address'# CLR (R0) ; Clear out the link word)2$ MOV R0,@PL.ADD+2(R2) ; Add address entry to theC% MOV R0,PL.ADD+2(R2) ; ... end of the list on the protocol block (& INCB PL.USE(R2) ; Update usage count' BR 80$ ; ... and loop(')90$: BITB #LF.EXC!LF.DEF,C.CHRL+2(R4)S;* BEQ 100$ ; If EQ, not an exclusive or default protocole%+ INCB PL.USE(R2) ; Inc usage count:,,100$: MOV #CS.SUC,R1 ; Set success status- CLC ; Indicate success . RETURN/0;+O1; We are unable to build the protocol block and/or the address blocks becauseVP2; of an address or protocol conflict or a resource allocation failure. Release>3; the data structures we have allocated and return an error.4;-5+6200$: MOV R1,-(SP) ; Save the error code @7210$: MOV P.WORK+6(R5),R0 ; Get next address block to release8 BEQ 220$ ; If EQ, noneI79 MOV (R0),P.WORK+6(R5) ; Save addr of next addr block13: MOV #AD.LEN,R1 ; Set length of an address block'; CALL $DEACB ; Deallocate the blocko< BR 210$ ; ... and loop/=8>220$: CALL SCNPR ; Scan for inactive protocol blocks)? MOV (SP)+,R1 ; Recover the error codeR@ SEC ; Indicate failure A RETURNlB;C APR5PC SETDST ; Make sure SETDST is in APR5 addr spaceaDE r8F .SBTTL SCNPR - Scan protocol list for unused entriesG;+2H; **-SCNPR-Scan protocol list for unused entriesI;OHJ; Scan the protocol list for entries which have a zero usage count andK; return them to the pool.L;- M; Inputs:t$N; R5 = Address of Port State tableO;P; Registers modified:;Q; R0, R1, R2, R4R;o>SSCNPR: MOV P.CTBL(R5),R2 ; Get address of protocol listheadT ADD #C.PROL,R2 ; ...3U10$: MOV (R2),R0 ; Get next protocol list entry 00³¢„—ƒ9ƒ´cÚµcÛ¶c�·c›’V BEQ 40$ ; If EQ, no more.W1X TSTB PL.USE(R0) ; Is this block still in use?Y BEQ 20$ ; If EQ, no&Z MOV R0,R2 ; Move on down the list[ BR 10$ ; ...i\7]20$: MOV (R0),(R2) ; Unlink protocol entry from listt'^ BNE 30$ ; If NE, not last in chain A_ MOV P.CTBL(R5),R4 ; Make sure we have Controller State Tabble-` MOV R2,C.PROL+2(R4) ; Fix up tail pointer,:a30$: MOV #PL.LEN,R1 ; Get length of protocol list entry$b MOV R2,-(SP) ; Save list pointer'c CALL $DEACB ; Deallocate the blockQ'd MOV (SP)+,R2 ; Restore list pointerte BR 10$ ; ... and loopf g40$: RETURN hij ,-k .SBTTL BLDADR - Build address list entriesil;+(m; **-BLDADR-Build address list entriesn;r-o; Build the specified address list entries.ip;- q; Inputs:5:r; R2 = # of bytes remaining in the characteristics block-s; R4 = Pointer to the characteristics blockM$t; R5 = Address of port state tableu;t v; Outputs:#w; R1 = Error code (if applicable)L;x; 'C' Clear - Address list entries successfully allocatede7y; 'C' Set - Failed to allocate address list entriesTz;{; Registers modified:L |; R0, R2};e-~BLDADR: MOV R4,-(SP) ; Get a free registerr6 ADD #C.CHRL+4,R4 ; Point to first Ethernet address€@�10$: MOV #CE.IUM,R1 ; Assume illegal use of multicast address/‚ BIT #1,(R4) ; Is this a multicast address? ƒ BNE 100$ ; If NE, yes„7… MOV P.WORK+4(R5),R0 ; Get pointer to protocol entry=† ADD #PL.ADD,R0 ; ...-‡ CALL CHKADD ; Check for address conflicts3ˆ MOV #CE.PCN,R1 ; Assume protocol usage conflicta-‰ BCS 100$ ; If CS, address already in useiŠ4‹ MOV R5,R0 ; Get pointer to list of address list1Œ ADD #P.WORK+6,R0 ; ... entries just allocated -� CALL CHKADD ; Check for address conflictA,Ž MOV #CE.MCE,R1 ; Assume address conflict-� BCS 100$ ; If CS, address already in useB�"‘ MOV R2,-(SP) ; Save byte count8’ MOV #AD.LEN,R1 ; Get length of an address list entry%“ CALL $ALOCB ; Allocate the blockf%” MOV (SP)+,R2 ; Restore byte count 7• MOV #CE.RES,R1 ; Assume resource allocation failure,)– BCS 100$ ; If CS, allocation failure —˜ MOV P.WORK+6(R5),(R0)7™ MOV R0,P.WORK+6(R5) ; Link block onto pending chaine$š TST (R0)+ ; Skip over link word› œ .REPT 3.� MOV (R4)+,(R0)+ ; Fill in Ethernet addressž .ENDRŸ0  MOV R5,(R0)+ ; Set up address of owning port;¡ SUB #6,R2 ; Remove another ethernet address from countr¢ BNE 10$ ; If NE, loop£%¤ MOV #CS.SUC,R1 ; Indicate success ¥ TST (PC)+ ; ...¦!§100$: SEC ; Indicate failurea#¨ MOV (SP)+,R4 ; Recover registerf © RETURNtª a*« .SBTTL CHKADD - Check for address match¬;+%­; **-CHKADD-Check for address matchh®;E¯; Scan an address list for a match on a specified Ethernet address.+°;- ±; Inputs:t*²; R0 = Address of listhead to be scanned+³; R4 = Address of 3 word Ethernet address;´;v µ; Outputs:#¶; R1 = Error code (if applicable) 1·; 'C' Clear - No match on any entry in the listu3¸; 'C' Set - Match on an entry in the list foundd¹; º; Registers modified: »; R0¼;gB½CHKADD: MOV #CE.ACN,R1 ; Assume possible address usage conflict¾&¿10$: CLC ; Assume no more entries4À MOV (R0),R0 ; Get address of next entry in listÁ BEQ 20$ ; If EQ, no more-4 CMP AD.ADD(R0),(R4) ; Check for matching addressà BNE 10$ ; If NE, no matchÄ CMP AD.ADD+2(R0),2(R4) ; ...pÅ BNE 10$ ; ...Æ CMP AD.ADD+4(R0),4(R4) ; ...lÇ BNE 10$ ; ...È+É SEC ; Indicate a match has been found Ê20$: RETURN ; ReturnË 6Ì .SBTTL SETMCT - Enable a multicast address for portÍ;+(Î; **-SETMCT-Enable a multicast addressÏ;:Ð; Enable a new multicast address for the specified port.Ñ;- Ò; Inputs:e-Ó; R0 = Address of the characteristics block4Ô; R1 = Default status (CE.RTS = Request too small)*Õ; R4 = Address of controller state table$Ö; R5 = Address of port state table×;C Ø; Outputs:,Ù; R1 = Status to return fo00³ª„œƒ_ƒt÷tø tþfDATAr characteristic<Ú; 'C' Clear - Multicast address entry successfully created8Û; 'C' Set - Failed to create multicast address entryÜ;oÝ; Registers modified:n Þ; R0, R2ß;aDàSETMCT: CMP C.DATI(R0),#6 ; Do we have a valid multicast address?'á BLO 100$ ; If LO, no ... too smallo#â BEQ 10$ ; If EQ, exactly right=&ã MOV #CE.RTL,R1 ; Request too largeä BR 100$ ; ... and exittå7æ10$: MOV #CE.NMA,R1 ; Assume not a multicast addressC2ç BIT #1,C.CHRL(R0) ; Is it a multicast address?è BEQ 100$ ; If EQ, noué/ê MOV R5,R2 ; Get multicast address listheadeë ADD #P.MCST,R2 ; ...ìBí20$: MOV (R2),R2 ; Get address of next multicast address entryî BEQ 30$ ; If EQ, no moreDï CMP ML.ADD(R2),C.CHRL(R0)"ð BNE 20$ ; If NE, keep looking ñ CMP ML.ADD+2(R2),C.CHRL+2(R0) ò BNE 20$ ó CMP ML.ADD+4(R2),C.CHRL+4(R0) ô BNE 20$6õ MOV #CE.MCE,R1 ; Multicast address already enabled ö BR 100$÷<ø30$: MOV R0,-(SP) ; Save address of characteristics blockAù MOV #ML.LEN,R1 ; Get length of a multicast address list entryi'ú CALL $ALOCB ; Allocate a new block 5û MOV (SP)+,R2 ; R2 = Addr of characteristics blockm#ü BCS 100$ ; If CS, no resources;ýþ MOV C.CHRL(R2),ML.ADD(R0) ÿ MOV C.CHRL+2(R2),ML.ADD+2(R0)  MOV C.CHRL+4(R2),ML.ADD+4(R0)5 CLR (R0) ; Link to end of multicast address list4 MOV R0,@P.MCST+2(R5) ; ...E MOV R0,P.MCST+2(R5) ; ...y; BIS #PS.MLC,P.FLAG(R5) ; Indicate multicast list changed 3 MOV #CS.SUC,R1 ; Indicate successful completion ! TST (PC)+ ; Indicate success!100$: SEC ; Indicate failurel  RETURNV ;  APR5PC SETMCT ; Make sure SETMCT is in APR5 addr space    - .SBTTL STMLT - Enable multicast addresses;+'; **-STMLT-Enable multicast addresses(;L>; The following function will inform the UNA which multicast ; addresses have been enabled.;- ; Input:; R5 = Port status table; R4 = Controller state tablet; R3 = Address of I/O packet#; I.PRM+2 = Caller's I/O statuso&; I.PRM+4 = Caller's R1 I/O status;$ ; Output:d); Multicast list is written to the UNA.E; 'C' bit set on error'; 'C' bit cleared for good I/O statusT( ; I/O DONE IS RETURNED FOR THE REQUEST!; " .ENABL LSBl#%$STMLT: CALL SALL ; Save registersw&% CALL BLDML ; Build multicast list&3' TSTB C.MLT(R4) ; Do we have multicast addressesu1( BEQ 20$ ; No, just return I/O status to user )2* MOV C.PCBP(R4),R2 ; R2 = Port Control Block'+ CLR (R2)+ ; Clear function word ,3- CMPB C.MLT(R4),C.MMAX(R4) ; Max number exceeded?s5. BHI 10$ ; Yes, put UNA in all multicast moder/40 MOV RELCT,(R2) ; Put unibus relocation in PCB1 MOV RELCT+2,2(R2) ; ...>2 ADD C.WRKP(R4),(R2)+ ; Add offset into UMR mapped region3 ADC (R2)+ ; ...t:4 MOVB C.MLT(R4),-(R2) ; Put # of milticast addr in PCBB15 MOV #FN.WML,R1 ; R1 = Write multicast list *6 CALLR LODFN ; Execute the function78;n"9; Enable all multicast addresses:;cA;10$: BIS #MD.ENL,C.MODE(R4) ; Enable all multicast addressess<< MOV C.MODE(R4),(R2) ; Put it in Port Control Block (PCB)+= MOV #FN.WMD,R1 ; Write mode function *> CALLR LODFN ; Execute the function?@;()A; Write Multicast Address list completeeB;CWMLDN: BCS 40$ ; Error?M-D20$: MOV I.PRM+2(R3),R0 ; R0 = Status codei<E30$: MOV I.PRM+4(R3),R1 ; R1 = Length of buffer processed"F CALLR RQDON ; Report I/O doneGFH40$: CMPB #IO.XCH/400,I.FCN+1(R3) ; Are we processing char.function?'I BNE 20$ ; No, keep caller's statusr,J MOV #IE.ABO&377,R0 ; Set up abort status!K BR 20$ ; Return abort statusWL M .DSABL LSBoN n2O .SBTTL BLDML - Build multicast addresses tableP;+,Q; **-BLDML-Build multicast addresses tableR;;S; Build the multicast address table for the set multicastR T; function.iU;- V; Inputs:4#W; R5 = Points to Port State TableeX; Y; Outputs:7Z; 'C' Clear - Control function pro00³²„—ƒ9ƒ´cÚµcÛ¶c�·c›’cessing may proceed(3[; 'C' Set - Control function processing delayed;\;k]; Registers modified:M ^; R0, R1_; :`BLDML: CLR C.MLT(R4) ; Zero multicast addresses counter.a MOV R4,R1 ; Compute address of port table!b ADD #C.PORT,R1 ; ... listhead5c10$: MOV (R1),R1 ; Get address of next port table d BEQ 80$ ; If EQ, no morele-f MOV R1,R0 ; Compute address of multicast )g ADD #P.MCST,R0 ; ... address listheadl7h20$: MOV (R0),R0 ; Get next multicast address entrypi BEQ 10$ ; If EQ, no more jk MOV R1,-(SP) ; Save R1, R2l MOV R2,-(SP) ; ...m2n MOV C.WRKP(R4),R1 ; Get pointer to work buffero CLR R2 ; Clear high bytec3p MOVB C.MLT(R4),R2 ; Get # of addresses to checke#q BEQ 50$ ; If EQ, none to checkrBs30$: CMP ML.ADD(R0),(R1) ; Check for matching multicast addresst BNE 40$ ; If NE, no matchu CMP ML.ADD+2(R0),2(R1)t v BNE 40$w CMP ML.ADD+4(R0),4(R1)s9x BEQ 60$ ; If EQ, multicast address already in buffersy)z40$: ADD #6,R1 ; Skip over this entry#{ SOB R2,30$ ; Check all entriesR|<}50$: MOV ML.ADD(R0),(R1)+ ; Fill in this multicast address~ MOV ML.ADD+2(R0),(R1)+i MOV ML.ADD+4(R0),(R1)+,8€ INCB C.MLT(R4) ; Update count of multicast addresses�(‚60$: MOV (SP)+,R2 ; Restore registersƒ MOV (SP)+,R1 ; ...„C… CMPB C.MLT(R4),C.MMAX(R4) ; Have we reached max multicast addr.1=† BLOS 20$ ; Loop for next address to enable for this portQ‡70$:ˆ SEC ; ...d ‰ BR 90$ ;Š$‹80$: CLC ; Indicate good returnŒ90$: RETURN ;�Ž l>� .SBTTL ****************************************************>� .SBTTL * Non-DLX Function Processors *>‘ .SBTTL ****************************************************’7“ .SBTTL NDLXF - Dispatch table for non-DLX functions ”•;+)–; Dispatch table for non-DLX functions.e—; ˜; Format: /™; .WORD ADDR ; Address of function processore)š; .BYTE FLAGS ; Flag bits, if set TRUE.?›; .BYTE SIZE ; Max size of input/output data buffer required0œ;T�; Flag bit definitions:Tž;-)ŸF.PRIV = 1 ; Read privelege flag bit*1 F.LESS = 2 ; Buffer may be less than maximumo$¡F.READ = 4 ; Function is a read¢£NDLXF:#¤ .WORD INVFUN ; 00 NOP function.¥ .BYTE 0 ; Filler byte ¦ .BYTE 0 ; Filler byte 7§ .WORD INVFUN ; 01 Load and Start Microcode Address &¨ .BYTE 0 ; Must be priveleged%© .BYTE 0 ; One word of inputs+ª .WORD REDDAD ; 02 Read Default Address 5« .BYTE F.READ ; Anyone can use this functiond3¬ .BYTE 3*2 ; Requires 3 word output bufferf#­ .WORD INVFUN ; 03 NOP functiony® .BYTE 0 ; Filler byte ¯ .BYTE 0 ; Filler byte,° .WORD REDADD ; 04 Read Physical Address5± .BYTE F.READ ; Anyone can use this functioni3² .BYTE 3*2 ; Requires 3 word output bufferr-³ .WORD WRTADD ; 05 Write Physical Addressv+´ .BYTE F.PRIV ; Must be privilageds-µ .BYTE 3*2 ; Requires 3 word input address2¶ .WORD REDMLT ; 06 Read Multicast Address List1· .BYTE F.LESS!F.READ ; Must be privilagedf/¸ .BYTE 6*10. ; Requires max of 10. addressesY3¹ .WORD INVFUN ; 07 Write Multicast Address Listrº .BYTE 0 ; Filler bytea» .BYTE 0 ; Filler byteA'¼ .WORD INVFUN ; 10 Read Ring Format½ .BYTE 0 ; Filler bytew¾ .BYTE 0 ; Filler byteD(¿ .WORD INVFUN ; 11 Write Ring FormatÀ .BYTE 0 ; Filler byteeÁ .BYTE 0 ; Filler byter$ .WORD READCT ; 12 Read Counters;à .BYTE F.LESS!F.READ ; Anyone can use this function -Ä .BYTE 32.*2 ; Output buffer > 0 and < 32.s.Å .WORD READCC ; 13 Read And Clear CountersCÆ .BYTE F.PRIV!F.LESS!F.READ; Must be priveleged, BUF can be < maxY-Ç .BYTE 32.*2 ; Output buffer > 0 and < 32.1 È .WORD REDMOD ; 14 Read Mode/É .BYTE F.READ ; Anyone can use this functionb*Ê .BYTE 1*2 ; Requires a one word buffer!Ë .WORD WRTMOD ; 15 Write Modee*Ì .BYTE F.PRIV ; Must be priveleged 00³º„œƒ_ƒt÷tø tþfDATAuser+Í .BYTE 1*2 ; Requires a one word buffer!'Î .WORD REDSTA ; 16 Read Port Statuso/Ï .BYTE F.READ ; Anyone can use this functions0Ð .BYTE 4*2 ; Four word output buffer required1Ñ .WORD REDCST ; 17 Read And Clear Port StatusB0Ò .BYTE F.PRIV!F.READ ; Must be priveleged user0Ó .BYTE 4*2 ; Four word output buffer required+Ô .WORD INVFUN ; 20 Dump Internal Memoryo%Õ .BYTE 0 ; Must be priveleged user -Ö .BYTE 0 ; Buff size is tested by function.+× .WORD INVFUN ; 21 Load Internal MemoryY%Ø .BYTE 0 ; Must be priveleged user-Ù .BYTE 0 ; Buff size is tested by functionY%Ú .WORD REDSID ; 22 Read System IDo<Û .BYTE F.LESS!F.READ ; Not priveleged, buffer can be < 1402Ü .BYTE 200. ; Up to 200. bytes of buffer needed&Ý .WORD WRTSID ; 23 Write System ID;Þ .BYTE F.PRIV!F.LESS ; Priveleged user, buff can be < 140I2ß .BYTE 200. ; Up to 200. bytes of buffer needed/à .WORD REDLOA ; 24 Read Load Server Addresss%á .BYTE F.READ ; Anyone can read it;&â .BYTE 3*2 ; 3 word buffer required/ã .WORD WRTLOA ; 25 Write Load Server Addressz*ä .BYTE F.PRIV ; Must be priveleged user&å .BYTE 3*2 ; 3 word buffer requiredæCHRMAX = .-NDLXFçè .é .SBTTL NDLXD - Non-DLX function dispatcherê;+(ë; **-NDLXD-Non-DLX function dispatcherì; Gí; This routine is called to process the non-DLX function(s) specifiedELî; in the user buffer pointed to by the optional diagnostic buffer pointer.ï; Jð; If the optional diagnostic buffer is specified, this routine is calledNñ; before and after the receive or transmit is completed. On the first pass,Oò; the function requests with sign bit set are processed. On the second pass,N0ó; the positive function request are processed.ô;pLõ; Each function is handled individually. The request function code is usedJö; as dispatch table index and a dispatch made to the individual handler.H÷; Each handler performs the required action and then returns to FUNSUC>ø; or FUNUNS and the next requset is processed in the buffer.ù;Jú; If an individual request fails the request is left uncompleted and theIû; next request in the buffer is processed. An invalid function request Jü; will terminate processing of the diagnostic buffer as it does not know-ý; how to step to the next request function.tþ;oPÿ; This procedure is followed until the end-of-buffer is reached, at which time%; the control request is completed.u;a6; A Characteristics buffer has the following format:;r; Function Code ; Byte Count In; Byte Count Out ; Status; Data ;t ; Next Function Code or 0 ; ...r ;t ; INPUTS:r; R5 -> Port State Table ; R4 -> Controller State Table; R3 = Address of I/O packetu9; I.PRM+12(R3) = Virtual address of diagnostic buffers9; I.PRM+14(R3) = Length of optional diagnostic buffere); I.PRM(R3) = I/O packet extension; ; OUTPUTS:?; Function requests in the diagnostic buffer processed beforeo2; control is returned to the function processor.;;-  .ENABL LSBNDLXD: .IF DF M$$MGE1 MOV IP.EXT(R3),R0 ; R0 = I/O packet extensionS5 MOV IX.DIG(R0),@#KISAR6 ; Map to diagnostic buffera 1! .IF DF K$$DAS ; Kernel data space supported?+6" MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space# .ENDC ; K$$DAS$>% MOV @#KISAR6,C.KIR6(R4) ; Save mapping to diagnostic buffer&' .ENDC ;M$$MGE(?) MOV I.PRM+12(R3),R0 ; R0 = Vitual addr of diagnoctic buffer*++ MOV R0,C.DGBP(R4) ; Save buffer pointer.-, MOV R0,C.DGBE(R4) ; Compute end of bufferD$- ADD I.PRM+14(R3),C.DGBE(R4) ; ....10$:*/ MOV (R0),R1 ; Get next function value"0 BLE INVFUN ; Invalid function122 BIC #177600,R1 ; Generate dispatch table index3 ASL R1 ; ...64 ASL R1 ; ...a5$6 CMP R1,#CHRMAX ; Valid function?7 BHIS INVFUN ; No;18 ADD #NDLXF,R1 ; Point to dispatch table entry$.9 CMP (R1),#INVFUN ; Is it a valid function?-: BEQ INVFUN ; Mark it as invalid functionP;;< BIT #F.00³„—ƒ9ƒ´cÚµcÛ¶c�·c›’PRIV,2(R1) ; Function for priveleged tasks only? = BEQ 40$ ; NoI>2? MOV I.TCB(R3),R2 ; R2 = TCB of requesting task5@ BIT #T3.PRV,T.ST3(R2) ; Is this a priveleged task?c$A BEQ INVFUN ; No, ignore requestB40$:4C CMPB #-1,3(R1) ; Function tests the buffer size?&D BEQ 60$ ; Skip buffer size check.E(F MOV C.DATI(R0),R2 ; R2 = Buffer sizeG)H CMPB R2,3(R1) ; Is buffer big enough?II BEQ 60$ ; yes$J BGT 70$ ; It can't be > maximum/K BIT #F.LESS,2(R1) ; Is it ok if it is less? L BEQ 80$ ; No, buffer errornM60$:)N ADD #C.CHRL,R0 ; Point to data buffer;7O MOV R0,C.DGBP(R4) ; Save curent pointer into bufferIPQ .IF DF M$$MGER S CALL MAPDRV ; Map to driverTU .ENDC ; M$$MGE-V'W CALLR @(R1) ; Dispatch to functionXY; Z; Request too largec[;0\70$: MOV #CE.RTL,C.STAT(R0) ; Buffer too large#] BR 100$ ; Process next requesth^_;Q`; Request too small$a;I1b80$: MOV #CE.RTS,C.STAT(R0) ; Request too small #c BR 100$ ; Process next request,de;r)f; Privelege violation, invalid function g;b hINVFUN:M,i MOV #CE.INV,C.STAT(R0) ; Invalid functionj BR 130$ ; Return$k100$:'l ADD #C.CHRL,R0 ; Point to data area.m8nBUMP: ADD C.DATI-C.CHRL(R0),R0 ; Point to next request/o CMP R0,C.DGBE(R4) ; Are we at end of bufferV'p BLO 10$ ; Go, process next requestq/r130$: CALL MAPDRV ; Map to 2nd 4K of driveru9s CMPB I.FCN+1(R3),#IO.XRC ; Is this a receive function?st BNE 140$ ; No3u CALL RDIDN ; Return to receive diagnostic doneg%v BR 150$ ; Initiate next function5w140$: CALL XDIDN ; Return to xmit diagnostic done.x150$: CALLR FNINI ; Initiate next functiony9z APR5PC NDLXD ; Make sure NDLXD is in APR5 addr space0{M|FUNSUC: MOV #CS.SUC,C.STAT-C.CHRL(R0); Indicate function request successful1} BR BUMP ; Do next request~9FUNUNS: MOV #CE.DNF,C.STAT-C.CHRL(R0); Indicate failure € BR BUMP ; Do next request� ‚ .DSABL LSBƒ„ 0'… .SBTTL REDDAD - Read Default Addresse(† .SBTTL REDADD - Read Physical Address+‡ .SBTTL REDLOA - Read Load Server Addresstˆ;+‰; %Š; **- REDDAD - Read Default Address &‹; **- REDADD - Read Physical Address)Œ; **- REDLOA - Read Load Server Addressp�;DŽ; These three routines are called to retreive the address desired.J�; The UNA command is set up and the data returned is moved to the user'sI�; buffer. If the user's buffer is too small a data overrun condition isS ‘; given.’;0 “; INPUTS:E”; R5 = Port State Tablee•; R4 = Controller State Tablel$–; R3 = Address of I/O status block*—; R0 = Pointer to user diagnostic buffer˜;a™;- š .ENABL LSB5›REDDAD: MOV #FN.RDA+200,R1 ; Move in function codeR œ BR 10$r�5žREDADD: MOV #FN.RPA+200,R1 ; Move in function coder Ÿ BR 10$  5¡REDLOA: MOV #FN.RSA+200,R1 ; Move in function codea¢10$:%£ CALLR LODFN ; Load port functionf¤ ¥ .DSABL LSBi¦+§DRADN: ; Entry for interrupt dispatche+¨DRPDN: ; Entry for interrupt dispatcha+©DRSDN: ; Entry for interrupt dispatch3"ª BCS 10$ ; If carry set, error«¬ .IF DF M$$MGE­*® CALL MAPDRV ; Map to 2nd 4K of driver&¯ MOV C.PCBP(R4),R1 ; Point past PCB° ADD #10,R1 ; ...r+± MOV -(R1),-(SP) ; Save address on stack ² MOV -(R1),-(SP) ; ...³ MOV -(R1),-(SP) ; ...0´5µ MOV C.KIR6(R4),@#KISAR6 ; Map to diagnostic bufferL¶,· .IF DF K$$DAS ; If data space supported6¸ MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space¹ .ENDC ; K$$DASº1» MOV (SP)+,(R0) ; Store address in user buffer¼ MOV (SP)+,2(R0) ; ...e½ MOV (SP)+,4(R0) ; ...;¾ MOV #6,C.DATO-C.CHRL(R0) ; Save number of bytes returned(¿À .IFFnÁ0 MOV C.PCBP(R4),R1 ; Point to 2nd word of PCBà TST (R1)+ ; ...1Ä MOV (R1)+,(R0) ; Store address in user buffer)Å MOV (R1)+,2(R0) ; ...(Æ MOV (R1)+,4(R0) ; ...o;Ç MOV #6,C.DATO-C.CHRL(R0) ; Save number of bytes returneddÈÉ .ENDC ;M$$MGEÊ$Ë CALLR FUNSUC ; Comp00³Ê„œƒ_ƒt÷tø tþfDATAlete requestÌ10$:"Í CALLR FUNUNS ; Request failedÎ;Ï APR5PC REDDAD ; Make sure REDDAD is in APR5 addr spacePÐÑ )Ò .SBTTL WRTADD - Write physical addressn,Ó .SBTTL WRTLOA - Write load server addressÔ;+Õ;('Ö; **- WRTADD - Write Physical AddressT*×; **- WRTLOA - Write Load Server AddressØ;sIÙ; This routine sets the load server or physical address of the UNA. TheHÚ; address in the diagnostic buffer is given to the UNA using the Write9Û; Physical Adress or Write Load Server Address command.Ü;R Ý; INPUTS:eÞ; R5 = Port State Table ß; R4 = Controller State Table à; R3 = Address of I/O packet á; R0 = Request function headerâ;ã;Bä;- å .ENABL LSBa æWRTADD:d-ç MOV #FN.WPA+200,R1 ; Set up function codea è BR 10$ éWRTLOA:L-ê MOV #FN.WSA+200,R1 ; Set up function coderëì10$:í .IF DF M$$MGEî5ï MOV C.KIR6(R4),@#KISAR6 ; Map to diagnostic buffernð,ñ .IF DF K$$DAS ; If data space supported6ò MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceó .ENDC ; K$$DASô(õ ADD #6,R0 ; Point to end of address+ö MOV -(R0),-(SP) ; Save address on stackk÷ MOV -(R0),-(SP) ; ...oø MOV -(R0),-(SP) ; ...*ù CALL MAPDRV ; Map to 2nd 4K of driver'ú MOV C.PCBP(R4),R2 ; Get PCB addressû CLR (R2)+ ; ... ü MOV (SP)+,(R2)+ ; Set up PCBý MOV (SP)+,(R2)+ ; ... þ MOV (SP)+,(R2)+ ; ...4ÿ .IFFM. MOV C.PCBP(R4),R2 ; Get port control block" CLR (R2)+ ; Skip command word MOV (R0),(R2)+ ; Set up PCBs MOV 2(R0),(R2)+ ; ...D MOV 4(R0),(R2)+ ; ...i .ENDC ;M$$$MGE 9  CMP R1,#FN.WPA+200 ; Are we writing physical address?   BNE 20$ ; No)=  MOV -(R2),C.PADD+4(R4) ; Save physical addr as source addrM  MOV -(R2),C.PADD+2(R4) ; ...s MOV -(R2),C.PADD(R4) ; ...V)20$: CALLR LODFN ; Load port function   .DSABL LSB++DWADN: ; Entry for interrupt dispatch4+DWSAD: ; Entry for interrupt dispatch # BCS 10$ ; If carry set, error.)+ CALLR FUNSUC ; Return function success10$:' CALLR FUNUNS ; Return unsuccessful; APR5PC WRTADD ; Make sure WRTADD is in APR5 addr space $& .SBTTL REDMLT - Read Multicast List ;+!;r$"; **- REDMLT - Read Multicast List#; $; DESCRIPTION:%;P &; INPUTS:V'; R5 = Port State Table;(; R4 = Controller State TableB); R3 = Address of I/O packet*; R0 = Address of user buffer:+;;,;- - .ENABL LSBd .REDMLT:'/ MOV C.PCBP(R4),R1 ; Get PCB addressL0 TST (R1)+ ;51 MOV RELCT,(R1) ; Put unibus relocator addr in PCBn2 MOV RELCT+2,2(R1) ; ... 03 ADD C.WRKP(R4),(R1)+ ; Compute unibus address4 ADC (R1) ; ... 5/6 MOVB #10.,1(R1) ; Ask for all ten addresses 57 MOV #FN.RML+200,R1 ; Read Multicast list function8 CALLR LODFN9:DMLDN: ; BCS 30$3< MOV C.DATI-C.CHRL(R0),R2 ; Get users buffer sizes= CMP #60.,R2 ; Is it > max> BHIS 10$ ; No? MOV #60.,R2 ; Make it max@10$:;A MOV R2,C.DATO-C.CHRL(R0) ; Save number of bytes returnedM,B MOV C.WRKP(R4),R1 ; Point to work buffer&C MOV R0,-(SP) ; Save buffer addressD ASR R2 ; Make count wordsEF .IF DF M$$MGEG20$:*H CALL MAPDRV ; Map to 2nd 4K of driver#I MOV (R1)+,-(SP) ; Get next word (J MOV C.KIR6(R4),@#KISAR6 ; Map to userK,L .IF DF K$$DAS ; If data space supported6M MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceN .ENDC ; K$$DASO)P MOV (SP)+,(R0)+ ; Move the parameters0Q DEC R2 ; Dec.counter(R BNE 20$ ; Loop till donerS MOV (SP)+,R0 ; Restore R0oTU .IFFuV<W20$: MOV (R1)+,(R0)+ ; Copy multicast list to user bufferX DEC R2 ; Dec.counter$Y BNE 20$ ; Loop till done;Z MOV (SP)+,R0 ; Restore R0V[\ .ENDC ;M$$MGE]"^ CALLR FUNSUC ; Return success_30$:$` CALLR FUNUNS ; Complete requesta b .DSABL LSBMc;d APR5PC REDMLT ; Make sure REDMLT is in APR5 addr space ef  g .SBTTL READCT - Read Counters*h .SBTTL READCC - Read And Clear Counters00³Ò„—ƒ9ƒ´cÚµcÛ¶c�·c›’ij;+k; l; **- READCT - Read Counters(m; **- READCC - Read And Clear Countersn;(Jo; This routine is called to retreive the counters maintained by the UNA.p;$ q; INPUTS:lr; R5 = Port State TableRs; R4 = Controller State Tablet; R3 = Address of I/O packet'u; R0 = User diagnostic buffer pointerev;qw;- x .ENABL LSBS yREADCT:A zREADCC:T+{ MOV C.PCBP(R4),R1 ; Get the PCB address | TST (R1)+ ; Point at PCBB+25} MOV RELCT,(R1) ; Put unibus relocator addr in PCB~ MOV RELCT+2,2(R1) ; ...-0 ADD C.WRKP(R4),(R1)+ ; Compute unibus address€ ADC (R1)+ ; ...� MOV #64.,(R1) ; Set byte‚-ƒ MOV #FN.RCN+200,R1 ; Assume Read CountersU„… .IF DF M$$MGE†5‡ MOV C.KIR6(R4),@#KISAR6 ; Map to diagnostic buffereˆ,‰ .IF DF K$$DAS ; If data space supported6Š MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space‹ .ENDC ; K$$DASŒ� .ENDC ; M$$MGEŽ<� CMP C.TYP-C.CHRL(R0),#FN.RCN; Is it Read Counter function� BEQ 10$ ; Yes:‘ MOV #FN.CCN+200,R1 ; No, it is Read and Clear Counters’10$:“ .IF DF M$$MGE ” CALL MAPDRV ; Map to driver• .ENDC ; M$$MGE–'— CALLR LODFN ; Execute the functionr˜+™DRCDN: ; Entry for interrupt dispatch#+šDRCCD: ; Entry for interrupt dispatchF› BCS 40$ ; Success5œ MOV C.DATI-C.CHRL(R0),-(SP) ; Get user buffer sizev"� ASR (SP) ; Make it word countž1Ÿ .IF DF M$$MGE ; If memory management wupport, *¡ CALL MAPDRV ; Map to 2nd 4K of driver¢£ .IFTF ;M$$MGE¤0¥ MOV @C.WRKP(R4),R2 ; Get counters word count5¦ CMP R2,(SP) ; Can user buffer hold all counters?§ BLOS 20$ ; Yes0¨ MOV (SP),R2 ; Use word count of user buffer©20$:(ª MOV C.KIR6(R4),@#KISAR6 ; Map to user«,¬ .IF DF K$$DAS ; If data space supported6­ MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space® .ENDC ; K$$DAS¯;° MOV R2,C.DATO-C.CHRL(R0) ; Save number of bytes returnedn± ASL C.DATO-C.CHRL(R0) ; ...².³ MOV C.WRKP(R4),R1 ; Point to data returned.´ TST (R1)+ ; Skip count of words in buffer*µ MOV R0,(SP) ; Save R0 on stack¶· .IFT ;M$$MGE¸¹30$:*º CALL MAPDRV ; Map to 2nd 4K of driver#» MOV (R1)+,-(SP) ; Get next word((¼ MOV C.KIR6(R4),@#KISAR6 ; Map to user½,¾ .IF DF K$$DAS ; If data space supported6¿ MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceÀ .ENDC ; K$$DASÁ) MOV (SP)+,(R0)+ ; Move the parameterseà DEC R2 ; Dec.counter)Ä BNE 30$ ; Loop till done1ÅÆ .IFF ;M$$MGEuÇ2È30$: MOV (R1)+,(R0)+ ; Copy data to user bufferÉ DEC R2 ; Dec.countereÊ BNE 30$ ; Loop till doneGËÌ .ENDC ;M$$MGEÍÎ MOV (SP)+,R0 ; Restore R0r"Ï CALLR FUNSUC ; Return successÐ40$:"Ñ CALLR FUNUNS ; Request failedÒ Ó .DSABL LSBDÔ;Õ APR5PC READCT ; Make sure READCT is in APR5 addr spacepÖ× aØ .SBTTL REDMOD - Read ModeÙÚ;+Û;(Ü; **- REDMOD - Read ModeÝ;e6Þ; This function reads the current mode from the UNA.ß; à; INPUTS:Má; R5 = Port State Table+â; R4 = Controller State Tablerã; R3 = Address of I/O packetä; R0 = Address of user bufferå;Næ;- ç .ENABL LSBV èREDMOD:;*é MOV #FN.RMD+200,R1 ; Read mode command'ê CALLR LODFN ; Execute the function ëìDRMDN:(í BCS 10$ ; If CS, error with commandîï .IF DF M$$MGEð*ñ CALL MAPDRV ; Map to 2nd 4K of driveròó .ENDC ;M$$MGEô'õ MOV C.PCBP(R4),R1 ; Get PCB addressf+ö MOV 2(R1),C.MODE(R4) ; Save current mode÷ø .IF DF M$$MGEù/ú MOV C.KIR6(R4),@#KISAR6 ; Map to user bufferaû,ü .IF DF K$$DAS ; If data space supported6ý MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceþ .ENDC ; K$$DASÿ .ENDC ;M$$MGE2 MOV C.MODE(R4),(R0) ; Save Mode in user buffer; MOV #2,C.DATO-C.CHRL(R0) ; Save number of bytes returned $ CALLR FUNSUC ; Complete request10$:" CALLR FUNUNS ; Request failed; APR5PC REDMOD ; Make sure REDMOD is in APR5 addr space    r  .SBTTL WRTMOD - Write M00³Ú„œƒ_ƒt÷tø tþfDATAodeE ;+ ;V; **- WRTMOD - Write mode ;bD; This routine is used to set the mode word in the UNA. To useG; this function, the user should first do a Get Mode to get a copy of.I; the current UNA mode and set all bits currently set to avoid changingVG; a request from other users. A copy of this requested mode is saved I; in case an enable all multicast must be done. The interrupt entry isPG; shared with the set multicast if enable all multicast must be done. ;D ; INPUTS:E; R5 = Port State TableD; R4 = Controller State Tableu; R3 = Address of I/O packet$; R0 = Pointer to user data buffer;,;-  .ENABL LSBt WRTMOD:o  .IF DF M$$MGE!8" MOV C.KIR6(R4),@#KISAR6 ; Restore user buffer mapping#,$ .IF DF K$$DAS ; If data space supported6% MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space& .ENDC ; K$$DAS'( .IFTF ;M$$MGE)&* MOV (R0),-(SP) ; Get new mode bits+, .IFTa-*. CALL MAPDRV ; Map to 2nd 4K of driver/0 .ENDC ;M$$MGE1+2 MOV C.PCBP(R4),R2 ; Get the PCB address '3 CLR (R2)+ ; Clear out old functiont%4 MOV (SP)+,(R2) ; Fill in new mode.=5 BIS #MD.TPD,(R2)+ ; Make sure transmit padding is enabled,6,7 MOV #FN.WMD+200,R1 ; Write mode function%8 CALLR LODFN ; Load port function9:DWMDN:; BCS 10$ ; If CS, errora<= .IF DF M$$MGE>*? CALL MAPDRV ; Map to 2nd 4K of driver@A .ENDC ;M$$MGEB'C MOV C.PCBP(R4),R1 ; Get PCB addressM.D MOV 2(R1),C.MODE(R4) ; Save as current modeEF .IF DF M$$MGEG(H MOV C.KIR6(R4),@#KISAR6 ; Map to userI,J .IF DF K$$DAS ; If data space supported6K MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceL .ENDC ; K$$DASMN .ENDC ;M$$MGEO"P CALLR FUNSUC ; Return successQ10$:"R CALLR FUNUNS ; Request failedS;T APR5PC WRTMOD ; Make sure WRTMOD is in APR5 addr spaceVUV t#W .SBTTL REDSTA - Read Port StatusM-X .SBTTL REDCST - Read And Clear Port StatusMYZ;+[;C!\; **- REDSTA - Read Port Status+]; **- REDCST - Read And Clear Port StatusI^;;K_; This function is called to implement the Read Port Status command. TheRP`; channel status is put in the first three words of the user's buffer followedPa; by the value of the last self-test performed (and power/cable bits). (PCSR1)Db; If the user's buffer is not long enough, the request is returnedc; "unsupported"Td;S e; INPUTS:tf; R5 = Port State Table-g; R4 = Controller State Tableh; R3 = Address of I/O packeti; R0 = Address of user bufferRj;nk;- l .ENABL LSB mREDSTA:h nREDCST: o .IF DF M$$MGEp:q MOV C.KIR6(R4),@#KISAR6 ; Map to user diagnostic bufferr,s .IF DF K$$DAS ; If data space supported6t MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceu .ENDC ; K$$DASvw .IFTF ;M$$MGEx3y MOV #FN.RLS+200,R1 ; Assume Read Status Commandn=z CMP C.TYP-C.CHRL(R0),#FN.RLS; Is this Read Status function { BEQ 10$ ; Yes-| MOV #FN.CLS+200,R1 ; It is Read And Cleara}10$:~ .IFT ;M$$MGE *€ CALL MAPDRV ; Map to 2nd 4K of driver�‚ .ENDC ; M$$MGEƒ'„ CALLR LODFN ; Execute the functionp…†DRSTD:‡DRCSD:ˆ BCS 20$ ; IF CS, errorI‰Š .IF DF M$$MGE‹*Œ CALL MAPDRV ; Map to 2nd 4K of driver.� MOV C.PCBP(R5),R1 ; Get address of the PCBŽ TST (R1)+ ; Point to data/� MOV (R1)+,-(SP) ; Save status data on stackR� MOV (R1)+,-(SP) ; ... ‘ MOV (R1)+,-(SP) ; ...$’:“ MOV C.KIR6(R4),@#KISAR6 ; Map to user diagnostic buffer”,• .IF DF K$$DAS ; If data space supported6– MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space— .ENDC ; K$$DAS˜6™ MOV (SP)+,(R0)+ ; Store status info in user bufferš MOV (SP)+,(R0)+ ; ...› MOV (SP)+,(R0)+ ; ...tœ� .IFF ;M$$MGEž.Ÿ MOV C.PCBP(R4),R1 ; Get address of the PCB  TST (R1)+ ; Point to PCB+2(5¡ MOV (R1)+,(R0)+ ; Copy Status info to user buffer-¢ MOV (R1)+,(R0)+ ; ...-£ MOV (R1)+,(R0)+ ; ...K¤¥ .ENDC ;M$$MGE¦&00³â„—ƒ9ƒ´cÚµcÛ¶c�·c›’§ MOV C.CSR(R4),R1 ; Get CSR address¨.© MOV 2(R1),(R0)+ ; Put PCSR1 in user bufferª SUB #10,R0 ; Restore R0$« CALLR FUNSUC ; Complete request¬20$:"­ CALLR FUNUNS ; Request failed® ¯ .DSABL LSB+°;± APR5PC REDSTA ; Make sure REDSTA is in APR5 addr space²³ V!´ .SBTTL REDSID - Read System IDeµ¶;+·;1¸; **- REDSID - Read System ID1¹;0Bº; This routine is called to retreive the system ID from the UNA.»;V ¼; INPUTS: ½; R5 = Port State TableE¾; R4 = Controller State TableC¿; R3 = Address of I/O packet'À; R0 = User diagnostic buffer pointer0Á; Â;- à .ENABL LSBR ÄREDSID: +Å MOV C.PCBP(R4),R1 ; Get the PCB address Æ TST (R1)+ ; Point at PCBB+25Ç MOV RELCT,(R1) ; Put unibus relocator addr in PCBaÈ MOV RELCT+2,2(R1) ; ...T0É ADD C.WRKP(R4),(R1)+ ; Compute unibus addressÊ ADC (R1)+ ; ...,Ë MOV #100.,(R1) ; Store word count in PCB0Ì MOV #FN.RSY+200,R1 ; Read system ID function'Í CALLR LODFN ; Execute the functionCÎ+ÏDRSID: ; Entry for interrupt dispatchaÐ BCS 20$ ; SuccessÑ?Ò MOV C.DATI-C.CHRL(R0),R2 ; R2 = # of bytes requested by userV;Ó MOV R2,C.DATO-C.CHRL(R0) ; Save number of bytes returnedt Ô ASR R2 ; Make it word countÕ.Ö MOV C.WRKP(R4),R1 ; Point to data returned#× MOV R0,-(SP) ; Save R0 on stack ØÙ .IF DF M$$MGEÚÛ10$:*Ü CALL MAPDRV ; Map to 2nd 4K of driver#Ý MOV (R1)+,-(SP) ; Get next byte;(Þ MOV C.KIR6(R4),@#KISAR6 ; Map to userß,à .IF DF K$$DAS ; If data space supported6á MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceâ .ENDC ; K$$DASã)ä MOV (SP)+,(R0)+ ; Move the parametersVå DEC R2 ; Dec.countereæ BNE 10$ ; Loop till doneAç MOV (SP)+,R0 ; Restore R0èé .IFFKê6ë10$: MOV (R1)+,(R0)+ ; Move parameters to user areaì DEC R2 ; Dec.counter í BNE 10$ ; Loop till doneDî MOV (SP)+,R0 ; Restore R0ïð .ENDC ; M$$MGEñ"ò CALLR FUNSUC ; Return successó20$:"ô CALLR FUNUNS ; Request failedõ ö .DSABL LSB÷;ø APR5PC REDSID ; Make sure REDSID is in APR5 addr space ùú S"û .SBTTL WRTSID - Write system IDüý;+þ; ÿ; **- WRTSID - Write system ID;;F; This routine is called to set the system ID parameters in the UNA.M; To use this command the user should first execute a Get System ID commandI; so that default parameter values may be obtained. The user will thenCL; change the fields desired and issue this command to write the parameters; back to the UNA.;. ; INPUTS:; R5 = Port State Table  ; R4 = Controller State Table  ; R3 = Address of I/O packet% ; R0 = Request function data buffer  ;D ;-  .ENABL LSB WRTSID:s .IF DF M$$MGE( MOV C.KIR6(R4),@#KISAR6 ; Map to user, .IF DF K$$DAS ; If data space supported6 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ;M$$MGE: MOV C.DATI-C.CHRL(R0),R1 ; R1 = byte count of system ID  ASR R1 ; Make it word count+ MOV R1,-(SP) ; Save word count on stackt( MOV C.WRKP(R4),R2 ; R2 = Work buffer MOV R0,-(SP) ; Save R010$:  .IF DF M$$MGE!(" MOV C.KIR6(R4),@#KISAR6 ; Map to user#,$ .IF DF K$$DAS ; If data space supported6% MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space& .ENDC ; K$$DAS'#( MOV (R0)+,-(SP) ; Get next byter*) CALL MAPDRV ; Map to 2nd 4K of driver)* MOV (SP)+,(R2)+ ; Move the parametersR+, DEC R1 ; Dec.counterD- BNE 10$ ; Loop till doneu./ .IFF,0,1 MOV (R0)+,(R2)+ ; Move ID to work buffer2 DEC R1 ; Dec.counter3 BNE 10$ ; Loop till done045 .ENDC ; M$$MGE6&7 MOV (SP)+,R0 ; Restore R0 at entry8)9 MOV C.PCBP(R4),R1 ; Get PCB+2 address: TST (R1)+ ; ...3; MOV RELCT,(R1) ; Generate unibus address in PCBS< MOV RELCT+2,2(R1) ; ...e= ADD C.WRKP(R4),(R1)+ ; ...;> ADC (R1)+ ; ...,? MOV (SP)+,(R1) ; Store word count in PCB-@ MOV #FN.WSY+200,R1 ; Set up function code;%A C00³ê„œƒ_ƒt÷tø tþfDATAALLR LODFN ; Load port functionMB+CDWSID: ; Entry for interrupt dispatchRD BCS 20$ ; Function failed"E CALLR FUNSUC ; Return successF20$:"G CALLR FUNUNS ; Request failedH I .DSABL LSBVJ;K APR5PC WRTSID ; Make sure WRTSID is in APR5 addr spaceVLM 1>N .SBTTL ****************************************************>O .SBTTL * UNA QIO Driver Subroutines *>P .SBTTL ****************************************************QR,S .SBTTL SALL - Save Registers Co-routineT;+&U; **-SALL- Save Registers Co-routineV;sW; Saves registers R0 - R5.X;l Y; Input:Z; None[;u\;-&]SALL: MOV R0,-(SP) ; Save registers^ MOV R1,-(SP) ; ..._ MOV R2,-(SP) ; ...` MOV R3,-(SP) ; ...a MOV R4,-(SP) ; ...)b MOV 12(SP),-(SP) ; Get return address*/c MOV R5,14(SP) ; Replace return addr with R5 #d CALL @(SP)+ ; Return to caller $e MOV (SP)+,R4 ; Restore registersf MOV (SP)+,R3 ; ...g MOV (SP)+,R2 ; ...h MOV (SP)+,R1 ; ...i MOV (SP)+,R0 ; ...j MOV (SP)+,R5 ; ...k RETURN ;l7m APR5PC SALL ; Make sure SALL is in APR5 addr spaceno ;p .SBTTL BFCHK - Validate optional characteristics buffer.q;+5r; **-BFCHK-Validate optional characteristics buffer(s;;Ft; Check the optional characteristics buffer supplied on transmit andu; receive functions.v;- w; Inputs: x; R3 = Address of I/O packet!y; R5 = Port State Table address(Az; I.PRM+6 - Virtual address of optional characteristics bufferM8{; I.PRM+10- Length of optional characteristics buffer<|; I.PRM+12- Virtual address of optional diagnostic buffer3}; I.PRM+14- Length of optional diagnostic buffera~;s ; Outputs:7€; I/O packet extension is set up with relocation biase�; for P2 and P3 (‚; R0 = Error code if buffer is invalid/ƒ; 'C' Clear - Buffer is valid or not supplied !„; 'C' Set - Buffer is invalida…;†; Registers modified: ‡; R0, R1, R2ˆ;6 ‰BFCHK: MOV R4,-(SP) ; Save R4$Š CLR -(SP) ; Get a work register‹1Œ MOV IP.EXT(R3),R4 ; R4 = I/O packet extension-�7Ž MOV I.PRM+6(R3),R0 ; Get address of optional buffer-1� BEQ 50$ ; No optional characteristics bufferu+� MOV I.PRM+10(R3),R1 ; Get buffer lengtht‘ BEQ 40$ ; If EQ, illegal %’ CMP R1,#XMTBSZ ; Is it too large?e“ BHI 40$ ; If HI, yes ”'• CALL MPTHDR ; Map to task's headere7– MOV I.PRM+6(R3),R0 ; Get address of optional buffer"— ; ... "MPTHDR" distroyed it˜ ™ .IF DF R$$MPL ; If RSX-11M+š+› CALL $CKBFB ; Address check the buffer4œ� .IFF ž+Ÿ CALL $ACHKB ; Address check the buffere ¡ .ENDC ; R$$MPL¢$£ BCS 40$ ; If CS, illegal buffer*¤ CALL $RELOC ; Relocate buffer address'¥ MOV R1,2(R4) ; Store bias of buffer5¦ MOV R2,I.PRM+6(R3) ; ... and it's virtual addressI§3¨ .IF DF M$$MGE ; If memory management supported©3ª MOV R1,@#KISAR6 ; Map to characteristics buffer«,¬ .IF DF K$$DAS ; If data space supported6­ MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space® .ENDC ; K$$DAS¯° .ENDC ; M$$MGE±1² MOV #I.PRM+6,R0 ; R0 = Offset into I/O packetM1³ CALL CKCHR ; Validate characteristics bufferL.´ BCS 40$ ; Error in characteristics bufferµ<¶10$: MOV I.PRM+12(R3),R1 ; Get optional diagnostic buffer#· BEQ 70$ ; No diagnostic buffer$+¸ MOV I.PRM+14(R3),R1 ; Get buffer length¹ BEQ 60$ ; If EQ, illegala%º CMP R1,#XMTBSZ ; Is it too large?D» BHI 60$ ; If HI, yest¼'½ CALL MPTHDR ; Map to task's headerr8¾ MOV I.PRM+12(R3),R0 ; Get address of optional buffer"¿ ; ... "MPTHDR" distroyed itÀ Á .IF DF R$$MPL ; If RSX-11M+Â+à CALL $CKBFB ; Address check the buffer ÄÅ .IFFhÆ+Ç CALL $ACHKB ; Address check the buffer,ÈÉ .ENDC ; R$$MPLÊ$Ë BCS 60$ ; If CS, illegal buffer*Ì CALL $RELOC ; Relocate buffer address'Í MOV R1,4(R4) ; Store bias of buffer6Î MOV R2,I.PRM+12(R3) ; ... and it's virtual addressÏ3Ð .IF D00³ò„—ƒ9ƒ´cÚµcÛ¶c�·c›’F M$$MGE ; If memory management supportedÑ3Ò MOV R1,@#KISAR6 ; Map to characteristics bufferÓ,Ô .IF DF K$$DAS ; If data space supported6Õ MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceÖ .ENDC ; K$$DASר .ENDC ; M$$MGEÙ2Ú MOV #I.PRM+12,R0 ; R0 = Offset into I/O packet1Û CALL CKCHR ; Validate characteristics bufferLÜ BCC 30$ ; Buffer is OKa(Ý BR 60$ ; Clr diag buffer parametersÞ)ß30$: CLC ; Assume there was no errorvà MOV (SP)+,R0 ; Get status$á BEQ 35$ ; All was well !â SEC ; Indicate error return ã!ä35$: MOV (SP)+,R4 ; Restore R4*å CALL MAPDRV ; Map to 2nd 4K of driveræ RETURN ; Return to callerpç>è40$: MOV #IE.SPC&377,(SP) ; Set up illegal buffer error codeé0ê50$: CLR I.PRM+6(R3) ; Indicate no AUX buffer9ë CLR I.PRM+10(R3) ; No optional characteristics bufferBì BR 10$ ; Returní>î60$: MOV #IE.SPC&377,(SP) ; Set up illegal buffer error codeï8ð70$: CLR I.PRM+12(R3) ; Indicate no diagnostic bufferñ CLR I.PRM+14(R3) ; ...ò BR 30$ ; Doneóô9õ APR5PC BFCHK ; Make sure BFCHK is in APR5 addr spaceVö÷ t2ø .SBTTL CKCHR - Validate characteristics bufferù;+,ú; **-CKCHR-Validate characteristics bufferû; Fü; Validate that the characteristics buffer is in the correct format.ý;- þ; Inputs: 7ÿ; R0 = Offset in I/O packet to characteristics buffer"; R3 = Address of the I/O packet; APR6 is mapped to buffer; ; Outputs:6; 'C' Clear - Characteristics buffer format is valid8; 'C' Set - Characteristics buffer format is invalid;a+CKCHR: MOV R1,-(SP) ; Get some registerst MOV R2,-(SP) ; ... 5  ADD R3,R0 ; Compute address of buffer descriptorh 4  MOV (R0)+,R1 ; Get virtual address of the buffer/  MOV (R0),R0 ; Get # of bytes in the buffer410$: TST R0 ; Any more bytes left in the buffer?, BEQ 40$ ; If EQ, no ... buffer is valid  BLT 30$ ; Buffer is invalid9 CMP R0,#C.CHRL ; Enough space for a char. descriptor?  BLO 30$ ; If LO, no8 BIT #1,C.DATI(R1) ; Next charac. block word aligned? BNE 30$ ; If NE, no: BIT #1,C.DATO(R1) ; Just in case it is an output buff. BNE 30$ ; If NE, no1 CLR C.STAT(R1) ; Clear characteristics statush< SUB C.DATI(R1),R0 ; Remove space for this characteristic SUB #C.CHRL,R0 ; ...? ADD C.DATI(R1),R1 ; Point to next characteristic descriptorv ADD #C.CHRL,R1 ; ...  BR 10$ ; and loop!"30$: SEC ; Indicate error(#40$: MOV (SP)+,R2 ; Restore registers$ MOV (SP)+,R1 ; ...% RETURN ;&9' APR5PC CKCHR ; Make sure CKCHR is in APR5 addr spaceR() t-* .SBTTL GTPRT - Assign a port to requestorI+;+',; **-GTPRT-Assign a port to requestort-;iF.; Parse the string, search the controller ports for a free /; port..0;- 1; Inputs:2; R3 = Address of I/O packet%3; I.PRM - Bias of stringD24; I.PRM+2 - Virtual address of string)5; I.PRM+4 - Length of string+6;; 7; Outputs:#8; R0 = Error code (if applicable)R)9; IE.NSF - No such in systemK%:; R5 = Address of Port Status Block/;; 'C' Clear - successfully assigned+ <; 'C' Set - Assignment error=;o>; Registers modified:L?; R0, R1, R2, R4, R5@;nAGTPRT:*B MOV R3,-(SP) ; Save I/O packet address:C MOV I.PRM+2(R3),R0 ; Get virtual address of the string@D MOV I.PRM+4(R3),R4 ; Compute address of the end of string +1E3F .IF DF M$$MGE ; If memory management supporteduG1H MOV @IP.EXT(R3),@#KISAR6 ; Map to input stringSI,J .IF DF K$$DAS ; If data space supported6K MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceL .ENDC ; K$$DASMN .ENDC ; M$$MGEO)P CMPB #'L,(R0) ; Check for DELUA first Q BNE 5$ ; No, must be DEUNA!-R TSTB (R0)+ ; Skip over the "l" characterPS CMPB #'U,(R0)+ ; Is it LUA?sT BNE 20$ ; No, errorU BR 7$ ; DELUA so far!V,W5$: CMPB #'U,(R0)+ ; Check for UNA device00³ú„œƒ_ƒt÷tø tþfDATAX BNE 20$ ; ...Y CMPB #'N,(R0)+ ; ...Z BNE 20$ ; ...[7$: CMPB #'A,(R0)+ ; ...\ BNE 20$ ; ..."] CMPB #'-,(R0)+ ; Check for "-"^ BNE 20$ ; Syntax errorv_)` MOVB (R0),R1 ; Get controller numberN!a CMPB R1,#'0 ; Below ASCII 0?)b BLT 20$ ; Yes, error"c CMPB (R0),R1 ; Above ASCII 7?d BGT 20$ ; Yes, errorh(e BIC #177770,R1 ; Clear unwanted bitsf2g CMP R1,#U$$NCT-1 ; Is controller number valid?(h BHI 20$ ; Invalid controller numberi+j ASL R1 ; Covert it to controller indexR0k MOV CTABL(R1),R4 ; R5=Controller State Tablel)m MOV R4,R5 ; Gen pointer to port list)1n ADD #C.PORT,R5 ; Point to port list root word,o10$: MOV (R5)+,R5 ; Get next port addressp BEQ 20$ ; End of list,q BIT #PS.OPN,P.FLAG(R5) ; This port open?r BNE 10$ ; No#s CLC ; Indicate good returnCt BR 30$ ; Returnn-u20$: MOV #IE.NSF,R0 ; Say, no such linel)v SEC ; Indicate no available portnw30$:*x CALL MAPDRV ; Map to 2nd 4K of drivery MOV (SP)+,R3 ; Restore R3Rz RETURN ;{9| APR5PC GTPRT ; Make sure GTPRT is in APR5 addr space}~ .  .SBTTL MAPBF - Map to buffer€;+�; **-MAPBF-Map to buffer‚; Aƒ; This routine takes the physical address in I.PRM+2 and IX.ADR ;„; and computes APR5 bias and displacement for I/O buffer.c…;- †; Inputs:‡; R3 = I/O packet address:)ˆ; I.PRM+2 = Low order physical address*‰; I.PRM+1 = High order physical addressŠ; ‹; Output:VŒ; KISAR6 mapped with bias�; R2 = DisplacementoŽ;R�; Registers R1 changed�; ‘MAPBF: MOV R0,-(SP) ; Save R06’ MOV I.PRM+2(R3),R1 ; R1 = Low order buffer address:“ MOV @IP.EXT(R3),R0 ; R0 = High order bits in high byte”•;eI–; For 18 bit systems the high bits are in bits 4 and 5. Otherwise, thes4—; high byte contains the high bits of the address.˜;O/™ .IF DF M$$EXT ; Extended memory supported?aš*› SWAB R0 ; High order bits in low byteœ� .IFF ; If 18 bit systemAž/Ÿ ASR R0 ; Move bits 4 and 5 to bits 0 and 1  ASR R0 ; ...g¡ ASR R0 ; ...M¢ ASR R0 ; ... 2£ BIC #177774,R0 ; Make sure high bits are clear¤¥ .ENDC ; M$$EXT¦1§ .IF DF M$$EIS ; If extended instrucation set ¨&© ASHC #-6.,R0 ; Calculate APR biasª« .IFFh¬ ­ .REPT 6!® ROR R0 ; Divide by octal 100o¯ ROR R1 ; ...O° .ENDR±² .ENDC ; M$$EIS³!´ MOV R1,@I.PRM(R3) ; Save bias ;µ BIC #177700,I.PRM+2(R3) ; R2 = Offset into 1st 100 bytes;¶ BIS #140000,I.PRM+2(R3) ; R2 = Virtual address of buffer "· MOV (SP)+,R0 ; R0 = Restore R0¸ RETURN ; Return to caller;¹9º APR5PC MAPBF ; Make sure MAPBF is in APR5 addr space»¼ $/½ .SBTTL GTXMH - Get a transmit header packetH¾;+)¿; **-GTXMH-Get a transmit header packetÀ;.8Á; This routine will allocate a transmit header packet.Â;- Ã; Inputs:+Ä; Transmit header list (C.XBUF root word))Å;a Æ; Output:B Ç; R0 points to transmit header,È; 'C' Clear - Transmit header packet found0É; 'C' Set - Transmit packet header NOT foundÊ; Ë; Registers R1 changedÌ; 'ÍGTXMH: MOV R2,-(SP) ; Save R2 and R3 Î MOV R3,-(SP) ;*Ï $DQPKT C.XHDR ; Get a transmit packet1Ð MOV R3,R0 ; Put transmit packet header in R1*$Ñ MOV (SP)+,R3 ; Restore R3 and R2Ò MOV (SP)+,R2 ;Ó RETURN ;ÔÕÖ e2× .SBTTL GTPST - Get address of Port State TableØÙ;+,Ú; **-GTPST-Get address of Port State TableÛ; CÜ; This routine gets the address of the port control block via the Ý; I/O packet.mÞ;c ß; Inputs:Tà; R3 = Address of I/O packetá;d â; Outputs:$ã; R5 = Address of Port State Table*ä; R4 = Address of Controller State Tableå;sæ; Registers Changed0 ç; R4, R5è;-é6êGTPST: BIT #CS.INI,C.FLAG(R4) ; Are we initializing?-ë BNE 20$ ; Yes, init does not use a port.eì.í BIT #1,R3 ; Do we have a real I/O packet?î BNE 20$ ; No, just return.eï-ð MOV I.TCB(R3),R5 ; Get task's TCB address :ñ M00³…—ƒ9ƒ´cÚµcÛ¶c�·c›’OV T.PCB(R5),R5 ; .. then PCB addr of task's window 0)ò ; .. (PCB=Partition Control Block)o/ó TST P.HDR(R5) ; Task Header in primary poolsôõ .IF DF R$$MPLö .IF DF M$$MGE÷/ø BNE 10$ ; If NE, header is in primary pool0.ù MOV P.REL(R5),@#KISAR6 ; Map to task headerú,û .IF DF K$$DAS ; If data space supported6ü MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spaceý .ENDC ; K$$DASþ10$:ÿ .ENDC ;M$$MGE .ENDC ;R$$MPL, MOV @I.LN2(R3),R5 ; Get port state table( BIC #1,R5 ; Clear LUN interlock bit2 MOV P.CTBL(R5),R4 ; Get Controller State Table* CALL MAPDRV ; Map to 2nd 4K of driver#20$: RETURN ; Return to caller.9 APR5PC GTPST ; Make sure GTPST is in APR5 addr spaceo   V+  .SBTTL LODFN - Load Secondary Functoion(  .SBTTL LODCM - Load Primary Function ;+;S'; **- LODFN - Load Secondary Functione%; **- LODCM - Load Primary FunctionC;MF; These simple routines load the requested commands into the UNA and; intitiate the request.;o ; Inputs:V; R4 = Controller State TableS; R3 = Address of I/O packet(; R1 = Secondary Function (LODFN only)*; R0 = Primary Function (only for LODCM);s; Registers Modified: ; R0,R1;;-  .ENABL LSBa!LODFN:#" MOV #CM.GCM,R0 ; Set up command .# MOVB R0,C.FUNS(R4) ; Save Primary Function7$ MOVB R1,C.FUNS+1(R4) ; Save secondary function codeF/% BIC #177740,R1 ; Make sure its a legal codee1& MOV R1,@C.PCBP(R4) ; Set up secondary command ' BR 10$.()LODCM:)* CLRB C.FUNS+1(R4) ; No function value+3,10$: MOV R3,C.CFNC(R4) ; Save addr of I/O packet 3- MOVB @C.CSR(R4),-(SP) ; Get current CSR contentsC5. BICB #R0.PCM,(SP) ; Clear out any command present4/ BIC #^C,R0 ; Make sure we save only code"0 BISB R0,(SP) ; Set command in01 MOVB (SP)+,@C.CSR(R4) ; Issue primary command263 MOVB R0,C.FUNS(R4) ; Save current primary function4&5 MOVB #CNTTIM,C.CTMR(R4) ; Set timer67 CALL CLOCK ; Start timerB89 RETURN ;: ; .DSABL LSBR<= f'> .SBTTL POLRG - Poll Ring SubroutineR?@;+A; "B; **-POLRG-Poll Rings SubroutineC;;HD; This routine is called when a transmit request or requests have beenNE; added to the transmit chain or when a receive buffer has been added to theKF; receive chain. If the poll request flag already set, the routine exits.MLG; Otherwise CS.POL is set in the controller flag and controll is passed toH; the function initiator. I; J;t K; INPUTS:L; R4 = Controller State TableSM;N; REGISTERS MODIFIED:-O; NoneP;oQ;- R .ENABL LSB 8SPOLRG: BIT #CS.POL,C.FLAG(R4) ; Poll flag already set?T BNE 10$ ; Yes, just returne7U BIS #CS.POL,C.FLAG(R4) ; Request a poll of the rings /V CALLR FNINI ; Try to initiate the function#W10$: RETURN ; Return to callerfXY d"Z .SBTTL LODUM - Load UNA memory[;+\;L]; **-LODUM-Load UNA memory^;c _; Inputs:s`; R3 - Address of I/O packeta; R4 - Controller State Tableb;= c; Outputs:d; IS.SUC - Sucessful LoadRAe; IS.ABO - Time out or fatal controller error, load is aborted.Sf;Cg;-h .ENABLE LSBiLODUM:.j MOV I.PRM+2(R3),R0 ; R0 = Microcode bufferk7l MOV R0,C.LOAD+2(R4) ; Compute end of buffer pointerI$m ADD I.PRM+4(R3),C.LOAD+2(R4); ...7n MOV R0,C.LOAD+4(R4) ; Save it again as work pointerO5o MOV C.RBFL(R4),C.LOAD+6(R4) ; Get a receive bufferN7p MOV @C.LOAD+6(R4),C.RBFL(R4); Dequeue receive bufferkq10$:/r MOV R3,C.CFNC(R4) ; Save I/O packet addresss3t .IF DF M$$MGE ; If memory management supportedtu5v MOV @IP.EXT(R3),@#KISAR6 ; Map to microcode bufferBw,x .IF DF K$$DAS ; If data space supported6y MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spacez .ENDC ; K$$DAS{+| MOV @#KISAR6,C.LOAD(R4) ; Save APR6 bias.}~ .ENDC ; M$$MGE4€ MOV (R0)+,-(SP) ; Save byte count of this record4� MOV (R0)+,-(SP) ; Save UNA internal load address‚*ƒ CALL MAPDRV ;00³ …œƒ_ƒt÷tø tþfDATA Map to 2nd 4K of driver„:… MOV C.WRKP(R4),R1 ; Get pointer to scratch area (UDBB)/† MOV 2(SP),(R1) ; Set byte count of transfer@8‡ BEQ 40$ ; If EQ, End of load sections in this block4ˆ BMI 70$ ; Branch to load start address function/‰ MOV (SP)+,6(R1) ; Copy the WCS load addressS4Š CLR 10(R1) ; Clear high order byte of load addr‹7Œ CMP (SP),#512.-4. ; Is byte count GT a disk buffer?o� BHI 35$ ; Yes, abort loadŽ8� ADD #4,C.LOAD+4(R4) ; Point to next record in buffer� ADD (SP),C.LOAD+4(R4) ; ...‘1’ MOV RELCT,2(R1) ; Set relocation bias in UDBBB“ MOV RELCT+2,4(R1) ; ...b-” MOV C.LOAD+6(R4),R3 ; Use receive buffer.n3• ADD R3,2(R1) ; Compute Unibus address of bufferc– ADC 4(R1) ; ...—20$:1˜ .IF DF M$$MGE ; If memory management supportS™/š MOV C.LOAD(R4),@#KISAR6 ; Map to user bufferr›,œ .IF DF K$$DAS ; If data space supported6� MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spacež .ENDC ; K$$DASŸ  .ENDC ; M$$MGE¡1¢ MOVB (R0)+,-(SP) ; Copy data from user bufferR*£ CALL MAPDRV ; Map to 2nd 4K of driver*¤ MOVB (SP)+,(R3)+ ; Copy to load buffer$¥ DEC (SP) ; Decrement byte count¦ BNE 20$ ; Loop till donef§ TST (SP)+ ; Tidy stack.¨9© MOV C.PCBP(R4),R3 ; Get pointer to Port Control Block1ª MOV RELCT,2(R3) ; Set relocation bias in UDBB« MOV RELCT+2,4(R3) ; ...a)¬ ADD R1,2(R3) ; Compute Unibus address6­ ADC 4(R3) ; ...®/¯ MOV C.CFNC(R4),R3 ; Restore R3 for "LODFN".M,° MOV #FN.LOA,R1 ; Microcode load function'± CALLR LODFN ; Execute the functionn²³;r#´; We get here after the interruptlµ;u%¶LOADN: BCS 30$ ; Errors are fatalu,· MOV C.LOAD+4(R4),R0 ; Get buffer pointer8¸ CMP R0,C.LOAD+2(R4) ; Have we reached end of buffer?%¹ BLO 10$ ; No, continue with load2!º BEQ 50$ ; Yes, end of buffer»30$:#¼ CALL IEABO ; Abort the request34½ CALL MAPDRV ; Make sure we are mapped to driver#¾ CALL FTL ; Do fatal processingf$¿ BR 60$ ; Free up receive bufferÀ1Á35$: TST (SP)+ ; Remove byte count from stackn BR 30$ ; Abort loadÃÄ;fÅ; End of bufferÆ;Ç40$: È CMP (SP)+,(SP)+ ; Tidy stackÉ50$:9Ê MOV #IS.SUC&377,R0 ; Successful load of load sections 6Ë MOV C.LOAD+4(R4),R1 ; Compute number of characters&Ì SUB I.PRM+2(R3),R1 ; ... processed!Í CALL RQDON ; Return I/O done Î;Ï60$: MOV C.RBFL(R4),@C.LOAD+6(R4); Free up receive bufferd$Ð MOV C.LOAD+6(R4),C.RBFL(R4) ; ...Ñ RETURN ;ÒÓ; Ô; End of loaduÕ;Ö70$:+× MOV C.PCBP(R4),R1 ; Get the PCB addressn/Ø MOV (SP)+,2(R1) ; Move in the start addressb7Ù CLR 4(R1) ; Clear high order addr (DELUA specific)Ú TST (SP)+ ; Get rid of -15Û MOV #FN.LSM,R1 ; Load and start microcode address17Ü CALL LODFN ; Issue the command, the interrupt will;)Ý ; return control to LSMDN in CTINIO#Þ BR 50$ ; Return I/O completionLß à .DSABL LSBrá9â APR5PC LODUM ; Make sure LODUM is in APR5 addr space ãä 3å .SBTTL FTL - Fatal controller error processor4æ;+!ç; **-FTL-FATAL controller error+è;)9é; This subroutine performs fatal controller processing. ê;-ë;( ì; Inputs:cí; R4 = Controller State Table1î;M ï; Outputs:ð;añ; 1. The controller is reset1ò; 2. If controller initializing, retry 3 times.w0ó; 3. Port related data structures are released;ô; 4. All I/O packets are returned to the requesting tasksõ; with IE.ABO status code.U:ö; 5. All ports belonging to the controller are marked as6÷; requiring initialization (IO.XIN QIO function).9ø; This is required to simulate DECnet functionality.nù;e ú .ENABL LSBû'üFTL: CALL SALL ; Save all registers %ý TST C.CSR(R4) ; Do we have a CSR?þ BEQ 10$ ; Noe8ÿ MOVB #R0.RST,@C.CSR(R4) ; Reset the UNA so that it is* ; ... put in a known state. Do not ; ... enable interrupts.s/10$: CLR C.CTMR(R4) ; Clear controller timert) CLR C.XMTT(R4) ; Clear transmit timerl, BIS #CS.OFL,C00³…—ƒ9ƒ´cÚµcÛ¶c�·c›’.FLAG(R4) ; Indicate offline CLR CLKFG ; Stop the clock 0 BIT #CS.INI,C.FLAG(R4) ; Are we initializing? BEQ 20$ ; non+  DECB C.RTRY(R4) ; Decrement retry count (  BLE 20$ ; We have tried three times ;w? ; we will try to initialize the controller up to three times.R ;t8 MOV #-2,C.FUNS(R4) ; Set up current command dispatch= MOVB #RSTIM,C.CTMR(R4) ; Set up timer for possible failure < MOVB #R0.IE,@C.CSR(R4) ; Re-enable interrupts, cleared by ; ... reset9 MOV C.INIW(R4),C.CFNC(R4) ; Get 1st waiting I/O packeth BR 95$ ; Return;I(; Release port related data structures; 620$: BIC #CS.INI,C.FLAG(R4) ; No longer initializing& MOV R4,R0 ; Generate port address ADD #C.PORT,R0 ; ...,30$: MOV (R0),R5 ; Get next port in list BEQ 40$ ; No more!4. CALL RLPRT ; Release port data structures6 BIS #PS.XIN,P.FLAG(R5) ; Set requirs initialization# MOV R5,R0 ; Point to next portn BR 30$ ; Go, get next port. ;t.!; Return I/O packets with IE.ABO status code";p-#40$: MOV R4,R5 ; Point to xmit wait queue $ ADD #C.XMWQ,R5 ; ... % CALL 100$ ; Abort Q entries&,' MOV R4,R5 ; Point to receive wait queue( ADD #C.RCVW,R5 ; ...$) CALL 100$ ; Abort queue entries*,+ MOV R4,R5 ; Point to xmit pending queue, ADD #C.XMTP,R5 ; ...-50$:3. MOV (R5),R3 ; R3 = Transmit pending I/O packete/ BEQ 60$ ; No more40 MOV C.XMTC(R4),R2 ; Get next item from xmit ringA1 MOV RG.LNK(R2),C.XMTC(R4) ; Move current pointer to next entrye2?3 MOV C.XHDR(R4),@RG.VAD(R2) ; Insert xmit header in free listQ"4 MOV RG.VAD(R2),C.XHDR(R4) ; ...526 .IF DF M$$EXT ; If extended memory supported?758 MOV C.XMTC(R4),R2 ; Get xmit data entry from ringe+9 MOV RG.UMR(R2),R2 ; R2 = UMR wait blockn:/; ADD #10,R2 ; Point to UMR assignment block(< CALL $DEUMR ; Deassign UMRI=> MOV C.UCB(R4),R1 ; R1 = UCB?@ .IFTF ; M$$EXTA/B MOV C.XMTC(R4),R2 ; R2 = Current ring entry)CD .IFT ; M$$EXToEGF MOV U.UCBX+6(R1),@RG.UMR(R2); Insert wait block into wait block listl$G MOV RG.UMR(R2),U.UCBX+6(R1) ; ...HI .ENDC ; M$$EXTJAK MOV RG.LNK(R2),C.XMTC(R4) ; Move current pointer to next entrydL"M MOV (R5),R3 ; R3 = I/O packet#N MOV (R3),(R5) ; Deque from listD*O CALL IEABO ; Return with abort status P BR 50$ ; Loop till all doneQ60$:0R MOV R4,R5 ; Point to pending function queueS ADD #C.PFNC,R5 ; ...$T CALL 100$ ; Abort queue entriesU)V MOV R4,R5 ; Point to init wait queueRW ADD #C.INIW,R5 ; ...$X CALL 100$ ; Abort queue entriesY+Z MOV R4,R5 ; Point received buffer listT[ ADD #C.RCVD,R5 ; ...\70$:*] MOV (R5),R0 ; Get next receive buffer^ BEQ 90$ ; We are done3_ MOV (R0),(R5) ; Deque buffer from received list 4` MOV C.RBFL(R4),(R0) ; Insert buffer in free lista MOV R0,C.RBFL(R4) ; ...V b BR 70$ ;tc5d90$: CLR C.CFNC(R4) ; There is no current functionLe CLR C.FUNS(R4) ; ...1f95$: BR FRERCV ; Free up receive ring buffersRg-h100$: MOV (R5),R3 ; Get next item in listqi BEQ 120$ ; Done j MOV (R3),(R5) ; Dequeue itemk;+Gl; We must check if the request is an open request. If it is, we haveuHm; to free up the port assigned to it and clear the 2nd word of the lunn; entry in the task header.,o;-6p MOVB I.FCN+1(R3),-(SP) ; Get function code for this+q BIC #^C<177>,(SP) ; Clear unwanted bits 0r CMP (SP)+,#FCOPN ; Is this an open function?"s BNE 110$ ; No, just abort it.'t CALL MPTHDR ; Map to task's header -u MOV @I.LN2(R3),R0 ; R0 = Port State Table -v BIC #1,R0 ; Clear possible interlock bit+'w CLR P.FLAG(R0) ; Show port not openo;x CLR @I.LN2(R3) ; Show not open in 2nd word of LUN entryi*y CALL MAPDRV ; Map to 2nd 4K of driverz({110$: CALL IEABO ; Abort the request| BR 100$ ; Do next itemc}$~120$: RETURN ; Return to caller8€ APR5PC FTL ; Make sure FTL is in APR5 address space� ‚ .DS00³…œƒ_ƒt÷tø tþfDATAABL LSB1ƒ„ o*… .SBTTL FRERCV - Free up receive buffers†;+"‡; **-FRERCV-Free receive buffersˆ;r@‰; This routine deallocates the buffers assigned to the receiveŠ; ring entries.S‹;o Œ; Inputs:�; Receive ring entriesŽ;p �; Outputs:1�; Receive buffers are returned to the free list ‘;r’; Registers modified: “; R0”;-5•FRERCV: MOV C.RCVB(R4),R0 ; R0 = Receive ring baseN/–10$: TSTB RG.ACT(R0) ; Is this entry active?e— BEQ 20$ ; No5>˜ CLRB RG.ACT(R0) ; Deactivate it. So we don't do this again1™ MOV RG.VAD(R0),R1 ; Get Unibus addr of bufferr-š MOV C.RBFL(R4),(R1) ; Insert in free listt› MOV R1,C.RBFL(R4) ; ...e*œ20$: MOV RG.LNK(R0),R0 ; Get next entry)� BEQ 30$ ; Not yet initialized, skip.u4ž CMP R0,C.RCVB(R4) ; Have we scanned all entries?Ÿ BNE 10$ ; Noi# 30$: RETURN ; Return to callerR¡¢ .(£ .SBTTL CTINI - Initialize Controller¤;+¥;G"¦; **-CTINI-Initialize Controller§;QE¨; This routine is called to start up the UNA hardware. This processaQ©; involves several commands to the UNA hardware and for this reason the routine Kª; is actually a series of smaller routines executed after a Commmand Done «; Interrupt.G¬; If this is the first time the device has been used since the drivereM­; has been loaded, then a self-test will be run on the UNA. After a timeouteJ®; has expired, the UNA will be checked for a "READY" state. If "READY",H¯; then the Port Control Block is given to the UNA and Read Port StatusO°; command is executed to obtain the microcode revision number. The microcode ?±; load support task is run passing to it the revision number.lH²; After the hardware operation has been verified the rings are set up.L³; The UNA control command block is given to the UNA and this block is usedH´; to issue the Read Ring Descriptor and Read Mode commands to the UNA.Dµ; If at any time a control request fails or times out the start upJ¶; procedure is aborted and all outstanding request will be returned with·; IE.ABO I/O status code.h¸;r ¹; BEGIN:º; ENABLE INTERRUPTSd »; RESET UNAp¼; SELFTEST UNA½; IF READY STATE&¾; IFF REPORT ERROR - ABORT"¿; IFT GIVE PCB TO CONTROLLERGÀ; READ PORT STATUS TO OBTAIN MICROCODE REVISION NUMBER NEEDEDh Á; BY MICROCODE SUPPORT TASKDÂ; RUN MICRO CODE SUPPORT TASK AND PASS TO IT THE MICROCODE9Ã; REVISION #, CSR OF CONTROLLER AND CONTROLLER INDEXÄ; LOAD MICROCODEÅ; SET UP RINGSeÆ; WRITE DEFAULT MODEÇ; INITIALIZE RINGShÈ; START UNA É; ENDIFIÊ;U Ë; INPUTS:EÌ; R4 = Controller State TableRÍ;-Î Ï Ð .ENABL LSBEÑÑCTINI:: ; LK7057Ó BIT #CS.INI,C.FLAG(R4) ; Are we initializing ;**-1BÔ BEQ 10$ ; yesÕ RETURN ; No, return.Ö×;DØ; Perform a reset on device Ù; 5Ú10$: CALL FRERCV ; Free up receive buffers from aR Û ; ... privious initialize6Ü BIS #CS.INI,C.FLAG(R4) ; Say initialize in progress.Ý MOVB #RETRYC,C.RTRY(R4) ; Set retry counter'Þ MOV R3,C.CFNC(R4) ; Save I/O packetN8ß MOV #-2,C.FUNS(R4) ; Set up current command dispatchFß MOVB #SLFTIM,C.CTMR(R4) ; Set up timer for possible failure ; LK705?á MOVB #R0.RST,@C.CSR(R4) ; Reset the UNA so that it is ;**-1;!â ; ... put in a known state<ã MOVB #R0.IE,@C.CSR(R4) ; Re-enable interrupts, cleared byä ; ... resetå BR 20$ ; Start clock;æçRSTDN:(è BCS 30$ ; Timeout error with deviceé;t%ê; Perform a self-test on the deviceTë;)'ì MOV R3,C.CFNC(R4) ; Save I/O packet)/í MOV #-1,C.FUNS(R4) ; Set up current commandt>î MOVB #SLFTIM,C.CTMR(R4) ; Set up timer for possible failure;ï MOVB #CM.SLF!R0.IE,@C.CSR(R4); Issue a self-test commandRð20$:ñ CALLR CLOCK ; Start clockò; ó; Self-test done entryô;+õSLFDN: ; Entry for interrupt dispatchp)ö BCS 30$ ; UNA hard error, go log it.0&÷ MOV C.CSR(R4),R2 ; Get CSR address)ø MOV PCSR1(R2),R2 ; Get PCSR1 contents'ù BIC #177760,R2 ; Extract sta00³"…—ƒ9ƒ´cÚµcÛ¶c�·c›’te bits)9ú CMP #ST.RDY,R2 ; Ready? (This also checks transceiverNû ; and cable bits)'ü BNE 30$ ; Nope - something's wronguýþÿ o;e8; Set up and execute Get Control Block address command;o& MOV C.CSR(R4),R2 ; Get CSR address5 MOV RELCT,PCSR2(R2) ; Put relocation bias in UDBB ( MOV RELCT+2,PCSR3(R2) ; ... High bits0 ADD C.PCBP(R4),PCSR2(R2) ; Set up PCB address ADC PCSR3(R2) ;d+ MOV #CM.GPB,R0 ; Set up primary commandt  CALLR LODCM ; Load commands ;b1 ; Get Control Block Address function completion  ;c+ GPBDN: ; Entry for interrupt dispatch  BCS 30$ ; Function failed;;; Read Controller Status to get microcode revision numberc;d. MOV #FN.RLS,R1 ; R1 = Read Status function% CALLR LODFN ; Load port functionn8UMLNAM: .RAD50 /UML.../ ; Micro code loader task nameRLSDN:! BCS 30$ ; Read status failedA7 MOV C.PCBP(R4),R1 ; R1 = Port Control Block addressm# TST (R1)+ ; Skip function words8 MOV (R1)+,C.RREV(R4) ; Save microcode revision number? MOV (R1)+,C.MMAX(R4) ; Save max # of multicast addr possible 1 MOV (R1)+,C.MXCT(R4) ; Save counter block sizes* MOV R3,-(SP) ; Save I/O packet address. MOV #UMLNAM,R3 ; Point to loader task name-  CALL $SRSTD ; See if loader is installedN,! MOV R0,MLTCB ; Save microcode loader TCB!" BCC 25$ ; Fatal if not thereR# $ .IF DF R$$MPL ; If RSX-11M+%;& MOV #T.NKLF,R0 ; "Microcode loader not present" messagec ' CALL $DVMSG ; Print message-( MOV (SP)+,R3 ; Restore I/O packet address+-) BR LSMDN1 ; Continue with initializationi* + .IFF ;,-- MOV (SP)+,R3 ; Restore I/O packet address(/. BR 30$ ; This is fatal if loader not there /0 .ENDC ; R$$MPL11225$: MOV (SP)+,R3 ; Restore I/O packet addressM/3 MOV #SENDBK,R1 ; Set length of block needed2&4 CALL $ALOCB ; Allocate core block$5 BCS 25$ ; Loop until you get it6#7 MOV R0,R1 ; Copy block addresst%8 CLR (R0)+ ; Skip over first words79 MOV C.INDX(R4),(R0)+ ; Put controller index in blockB: MOV C.DCB(R4),R2 ; R2 = DCBl6; MOV D.NAM(R2),(R0)+ ; Put controller name in block6< MOV C.PCBP(R4),R2 ; Get Port Control Block address/= BIC #177700,2(R2) ; Isolate revision number2> MOV 2(R2),(R0) ; Save revision number in block?-@ CLRB 1(R0) ; Clear DELUA/DEUNA flag byteC$A MOV C.CSR(R4),R2 ; R2 = CSR addr4B BIT #20,PCSR1(R2) ; Is controller DEUNA or DELUAC BEQ 27$ ; DEUNAD INCB 1(R0) ; DELUAvE27$:;F MOV R3,C.CFNC(R4) ; Save I/O packet of current functioncKG MOV #+CM.GCM,C.FUNS(R4) ; Set wait for microcode loader taskrH*I MOV MLTCB,R0 ; R0 = Task Control Block&J ; R1 = Address of message block2K CALL $EXRQF ; Request microcode loader to runL+M MOV #UMLTIM,C.CTMR(R4) ; Set timer value0N CALLR CLOCK ; Start clockOP;VDQ; We get here if the Microcode Loader Task does not respond within!R; the time out value specified.AS;ITMLTMO:UV;vHW; We get here on a time out or controller error. This code will forceX; fatal initialization..Y;R6Z30$: MOV R4,R2 ; Generate error log packet pointer[ ADD #C.LOG,R2 ; ...l1\ MOV #ER.FCI,E.TYPE(R2) ; Fatal controller initC] MOV C.CSR(R4),R0 ; Get CSR1^ MOV (R0)+,E.CSR0(R2) ; PCSR0 into error packet 1_ MOV (R0)+,E.CSR1(R2) ; PCSR1 into error packet'` MOV C.PCBP(R4),R0 ; Get PCB pointere5a ADD #E.PCB,R2 ; Point to PCB save in error packets.b MOV (R0)+,(R2)+ ; Save PCB in error packetc MOV (R0)+,(R2)+ ; ...rd MOV (R0)+,(R2)+ ; ...le MOV (R0)+,(R2)+ ; ...a-f MOV R3,-(SP) ; Save address of I/O packeto&g CLR R3 ; No associated I/O packeth CALL ERLOG ; Log the error %i MOV (SP)+,R3 ; Restore I/O packetRj$k CALLR FTL ; Do fatal processinglm;nGn; We will come here after the micro code has been successfully loadedMo;PpLSMDN:0q BCS 30$ ; If CS, error - abort the functionr;s-s; Set up Get Ring Descriptor Command in PCBet00³*…œƒ_ƒt÷tø tþfDATA;i8uLSMDN1: MOV C.PCBP(R4),R2 ; Get Command Block Address+v TST (R2)+ ; Skip to second word in PCBM0w MOV RELCT,(R2) ; Put relocation bias in UDBB%x MOV RELCT+2,2(R2) ; ... High bitsL7y ADD C.WRKP(R4),(R2)+ ; Move in scratch block addressOz ADC (R2)+ ; ...{; |; Set up the ring descriptor}; 3~ MOV C.WRKP(R4),R2 ; Retrieve descriptor addresss0 MOV RELCT,(R2) ; Put relocation bias in UDBB%€ MOV RELCT+2,2(R2) ; ... High bits3� ADD C.XMTB(R4),(R2)+ ; Compute unibus address of!‚ ADC (R2) ; ... transmit ringm(ƒ TSTB (R2)+ ; Skip high address byte9„ MOVB #,(R2)+ ; Fill in entry size (in words) 3… MOV #U$$NTS*2,(R2)+ ; Fill in number of entries†0‡ MOV RELCT,(R2) ; Put relocation bias in UDBB%ˆ MOV RELCT+2,2(R2) ; ... High bits 3‰ ADD C.RCVB(R4),(R2)+ ; Compute unibus address of Š ADC (R2) ; ... receive ring(‹ TSTB (R2)+ ; Skip high address byte9Œ MOVB #,(R2)+ ; Fill in entry size (in words)41� MOV #U$$NRS,(R2)+ ; Fill in number of entries Ž; �; Load the write ring request �;h&‘ MOV #FN.WRG,R1 ; Secondary command"’ CALLR LODFN ; Execute command“”;#$•; Write Ring Descriptor completion–;—WRGDN:˜ BCS 30$ ; Function Failed™;i2š; Set up the operating mode (padding, CRC, etc.)›;R'œ MOV C.PCBP(R4),R2 ; Get PCB address *� MOV C.MODE(R4),2(R2) ; Set default mode&ž MOV #FN.WMD,R1 ; Secondary command"Ÿ CALLR LODFN ; Execute command ;(¡; Write Mode completion(¢; +£WMEDN: ; Entry for interrupt dispatcht¤ BCS 30$ ; Function failed¥;#¦; Initialize the rings§;*¨ MOV R3,-(SP) ; Save current I/O packet"© CALL INIRG ; Initialize ringsª3« CALL GTRBF ; Allocate buffers for receive ring%¬ MOV (SP)+,R3 ; Restore I/O packet ­.® MOV #FN.RDA,R1 ; R1 = Read default address¯ CALLR LODFN ; do it!(°; +±; Read default address interrupt completea²;m³RDADN:´ BCS 30$ ; Function failed/µ MOV C.PCBP(R4),R0 ; R0 = Port Control Block ¶ TST (R0)+ ; Skip 1st word.· MOV (R0)+,C.PADD(R4) ; Save default address¸ MOV (R0)+,C.PADD+2(R4) ; ...R¹ MOV (R0)+,C.PADD+4(R4) ; ...tº;C»; Issue the Start requests¼;+½ MOV #CM.STR,R0 ; Set up primary commande$¾ CALLR LODCM ; Issue the command¿;eÀ; Start request completionÁ;e,ÂSTRDN: ; Entry from interrupt dispatch#à BCS 30$ ; Something went wrongrÄ8Å40$: $DQPKT C.INIW ; Deque item from init wait queueÆ BCS 50$ ; No more)Ç CALL ISSUC ; Return success I/O done;È BR 40$ ; Loop till no moreDÉ50$:/Ê CLR C.FLAG(R4) ; Indicate controller online *Ë CALLR POLRG ; Request controller pollÌ Í .DSABL LSBrÎÏ s4Ð .SBTTL UMRMP - Map transmit I/O buffer with UMRsÑ;+&Ò; **-UMRMP- Map I/O buffer with UMRsÓ;rHÔ; This routine gets a trasmit ring packet, UMR maps the I/O buffer andHÕ; sets up the transmit ring entry. This routine does not set the end#Ö; packet flag in the ring entry. ×; Ø; Inputs: Ù; R3 = Address of I/O packetÚ; R4 = Controller State TablerÛ; Ü; Output:C'Ý; R1 = Pointer to transmit ring entryÞ;Lß;-%àUMRMP: CALL SALL ; Save registers.á; Eâ; NOTE - For each transmit header buffer there is a UMR wait block.Nã; This routine is called by the INIXM routine. A header buffer is allocatedLä; before this routine is called. Therefore, there must be a free transmitå; ring entry. æ;n,ç CALL GFXRE ; Get a transmit ring packet&è BEQ 20$ ; Crash if none availableé ê .IF DF R$$MPL ; If RSX-11M+ëì MOV C.KRB(R4),R2 ; R2 = KRBíî .ENDC ; R$$MPLïð MOV C.UCB(R4),R5 ; R5 = UCBLñ MOV C.SCB(R4),R4 ; R4 = SCB1ò MOV IP.EXT(R3),R0 ; R0 = I/O packet extension ó.ô MOV I.PRM+4(R3),RG.LEN(R1) ; Segment lengthõ ; Assume 22 bit systeme@ö MOV I.PRM+2(R3),RG.ADD(R1) ; Low order 16 bits of buffer addr÷1ø .IF DF M$$EXT ; If extended memory supportedCù2ú MOVB 1(R0),RG.AD2(R1) ; High order address bitsûü .IFF ; I00³2…—ƒ9ƒ´cÚµcÛ¶c�·c›’f 18 bit systemFý=þ MOV (R0),R0 ; Bits 4 & 5 of R0 contain high address bits/ÿ ASR R0 ; Move bits 4 and 5 to bits 0 and 1; ASR R0 ; ...C ASR R0 ; ...  ASR R0 ; ...(2 BIC #177774,R0 ; Make sure high bits are clear0 MOVB R0,RG.AD2(R1) ; High order address bits .IFTF ; M$$EXTF  MOVB #RF.ENP!RF.OWN,RG.FLG(R1) ; Set END of chain and UNA owner bit   .IFT ; M$$EXTu   .IF DF R$$MPL ; If RSX-11M+1 BIT #FE.EXT,$FMASK ; Is this a 22-bit system?s BEQ 10$ ; If EQ no07 BIT #KS.EXT,K.STS(R2) ; Extended memory supported?R BNE 10$ ; If NE yes* TST @#$UMRHD+2 ; Unibus map available? BEQ 10$ ; No  .IFF ; If not RSX-11M+5 BIT #DV.EXT,U.CW1(R5) ; Extended memory supported?e BNE 10$ ; Yes( TST @#$UMRPT ; Unibus map available? BEQ 10$ ; No1 .ENDC ; R$$MPL,  MOV U.UCBX+6(R5),R0 ; Get UMR wait block(! BEQ 20$ ; Crash, something is wrong7" MOV (R0),U.UCBX+6(R5) ; Dequeue the assignment blockI=# MOV R0,RG.UMR(R1) ; Save UMR wait block PTR in ring entryd$1% MOV IP.EXT(R3),R2 ; R2 = I/O packet extensionU;& MOV I.PRM+2(R3),U.BUF+2(R5) ; Set low 16 bits of address 6' MOVB 1(R2),U.BUF+1(R5) ; Set high 6 bits of address5( MOV I.PRM+4(R3),U.CNT(R5) ; Byte count of transfer;)* MOV R1,R3 ; Save R1 in R3(+ CALL $STMP1 ; Set up the Unibus map+, MOV RG.UMR(R3),R0 ; R0 = UMR wait blockB+- ADD #10,R0 ; R0 = UMR assignment block(). CALL $MPUB1 ; Map Unibus to transferl/+0 MOV RG.UMR(R3),R0 ; R0 = UMR wait block +1 ADD #10,R0 ; R0 = UMR assignment block >2 MOV M.UMVL(R0),RG.ADD(R3) ; Set low 16 bits of virtual addr$3 CLR -(SP) ; Get a work register04 MOVB M.UMVH(R0),(SP) ; Get high virtual addr15 ASR (SP) ; Get ext.bits 4 & 5 into bit 0 & 16 ASR (SP) ; ...S7 ASR (SP) ; ... 8 ASR (SP) ; ... $9 BIC #^C<3>,(SP) ; Clear high bit;: MOVB (SP)+,RG.AD2(R3) ; Put extension bits in ring entryc ; MOV R3,R1 ; R1 = Ring entry<= .ENDC ; M$$EXT>9?10$: BITB #374,RG.AD2(R1) ; Must not have high bits onR@ BNE 20$ ; This is very bad(A RETURN ;BC20$: D .IF DF DEBUG ; If debuggingEF BPT ; Breakr!G BR 20$ ; Loop on break pointgHI .IFFrJ K CRASH ; Something is wrongLM .ENDC ; DEBUGPNO S,P .SBTTL GSUMR - Get Static UMR for driverQ;+BR; **-GSUMR-Get static UMR and compute Unibus relocation constantS;bDT; This routine maps the device communications area and the receive@U; buffers with a UMR. In addition, it computes the relocationEV; constant for virtual memory address to Unibus address conversion.W;D X; Inputs:fY; R4 = Controller State TablerZ;B [; OUTPUTS:.\; 1. Upper 4K of driver is mapped with a UMR8]; (starting at 1st 64 byte boundry following CBASE)3^; 2. Relocation constant computed (RELCT,RELCT+2)_;G`;-a%bGSUMR: CALL SALL ; Save registers c d .IF DF R$$MPL ; If RSX-11M+ef MOV C.KRB(R4),R2 ; R2 = KRBegh .ENDC ; R$$MPLij MOV C.UCB(R4),R5 ; R5 = UCB kl CLR R0 ; Clear R0 & R1u m CLR R1 ;s*n CLR RELCT ; Make relocation bias zeroo CLR RELCT+2 ; ...)p CMP #120000,#UNAST ; Loadable driver? q BNE 60$ ; If not EQ noe9r MOV @#KISAR5,R1 ; Yes, copy real start of driver areaws1t .IF DF M$$EIS ; If extended instrucation setRu-v ASHC #6.,R0 ; Calculate physical addressvwx .IFFy$z MOV R1,R0 ; Get start of driver4{ SWAB R0 ; Do non-EIS emulation of "ASHC #6.,R0"6| BIC #177400,R0 ; ... To calculate physical address} SWAB R1 ; ...~ BIC #377,R1 ; ... ROR R0 ; ...o€ ROR R1 ; ...� ROR R0 ; ....‚ ROR R1 ; ...Nƒ„ .ENDC ; M$$EIS…/† .IF DF M$$EXT ; Extended memory supported?e‡:ˆ MOV #CBASE,-(SP) ; Get communication area base address+‰ SUB #120000,(SP) ; Subtract driver base05Š BIC #77,(SP) ; We are dealing with 64 byte blocksM.‹ ADD (SP)+,R1 ; Compute physical addr00³:…œƒ_ƒt÷tø tþfDATAess of%Œ ADC R0 ; ... communications area�;CFŽ; Set up selected UMR to map all of the driver's receive buffers andG�; device communications areas and save relocation constant for Unibus �; address computation.‘;’ “ .IF DF R$$MPL ; If RSX-11M+”1• BIT #FE.EXT,$FMASK ; Is this a 22-bit system?,– BEQ 50$ ; If EQ non7— BIT #KS.EXT,K.STS(R2) ; Extended memory supported?r˜ BNE 50$ ; If NE yes*™ TST @#$UMRHD+2 ; Unibus map available?š BEQ 50$ ; Noe›)œ MOV R2,R4 ; Copy KRB address into R4c4� ADD K.OFF(R2),R4 ; Point to UMR assignment blockž SUB #M.LGTH,R4 ; ...Ÿ  .IFF¡5¢ BIT #DV.EXT,U.CW1(R5) ; Extended memory supported?f£ BNE 50$ ; Yes(¤ TST @#$UMRPT ; Unibus map available?¥ BEQ 50$ ; No¦=§ MOV C.SCB(R4),R4 ; Pointer to UMR assignment block in SCB ¨ ADD #S.MPR,R4 ; ...E©ª .ENDC ; R$$MPL«/¬ TST M.UMRN(R4) ; Static UMR already set up?@­ BNE 70$ ; If NE yes4® MOV R1,M.BFVL(R4) ; Set up LO 16-Bits of address4¯ MOVB R0,M.BFVH(R4) ; Set up HI 6-bits of address.° MOV #4,M.UMRN(R4) ; Set up count for 1 UMR7±20$: MOV R4,R0 ; Copy UMR work area pointer into R0e"² CALL $ASUMR ; Go assign UMR's³ BCS 20$ ; If CS, try againv,´ MOV R4,UABKS ; Save UMR assignment blockµ;RI¶; Load selected UMR to map receive buffers 18-bit addresses transformed"·; from 16-bit virtual addresses.¸;43¹ MOV R4,R3 ; Copy UMR work area pointer into R3E+º MOV U.SCB(R5),R4 ; Retrieve SCB addresst!» CALL $MPUB1 ; Map the Unibus 3¼ MOV R3,R0 ; Copy UMR work area pointer into R0 ½ BR 40$ ; and continue¾7¿30$: MOV R4,R0 ; Copy UMR work area pointer into r0L+À MOV U.SCB(R5),R4 ; Retrieve SCB addressI=Á40$: MOV M.UMVL(R0),R1 ; Get LO 16-bits of virtual address9 MOVB M.UMVH(R0),R0 ; Get HI 2-bits of virtual addressdÃ/Ä .IF DF M$$EIS ; If extended insruction seteÅ3Æ ASH #-4,R0 ; Shift bits <4:5> right into <0:1>oÇÈ .IFFUÉ/Ê ASR R0 ; Shift bits <4:5> right into <0:1> Ë ASR R0 ; ...Ì ASR R0 ; ...pÍ ASR R0 ; ...nÎÏ .ENDC ; M$$EISÐ; GÑ; Compute and save the double word relocation constant to transform aNÒ; a virtual address within the UMR mapped communications area into an 18-bit Ó; address.Ô;d=Õ50$: MOV CVIRA,-(SP) ; (SP) = Communications area vir.addrs$Ö BIC #77,(SP) ; Clear offset bits5× SUB (SP)+,R1 ; Subtract UMR mapped communications:&Ø SBC R0 ; ... base virtual addressÙ60$:8Ú MOV R0,RELCT+2 ; Save relocation constant (HI order)!Û MOV R1,RELCT ; ... (LO order) Ü-Ý .IFF ; If extended memory not supported Þ?ß SUB #120000,R1 ; Compute relocation bias for 18 bit machineià SBC R0 ; ...n-á MOV R0,RELCT+2 ; Save relocation bias forb)â MOV R1,RELCT ; ... for PCB, UDB, etc.Sã60$:8ä .IFTF ; In either case for extended memory supportåæ RETURN ; Return to callerbç,è .IFT ; If extended memory is supportedé<ê70$: MOV R4,-(SP) ; Save mapping assignment block pointerë MOV U.SCB(R5),R4 ; R4 = SCB,1ì CALL $MPUBM ; Reload Unibus mapping registerd3í MOV (SP)+,R4 ; Restore assignment block pointerm*î BR 30$ ; Go, compute relocation valueïð .ENDC ; M$$EXTñò 7ó .SBTTL RLPRT - Release port related data structuresPô;+1õ; **-RLPRT-Release port related data structureseö;eJ÷; Return all port related data structures to DSR. The multicast addressFø; list is released and the protocol list is scanned for address listAù; entries which are owned by this port which are then released.Mú;- û; Inputs:b$ü; R5 = Address of Port State Tableý;sþ; Registers Preservednÿ;%RLPRT: CALL SALL ; Save registersl3 MOV R5,R2 ; Generate pointer to multicast listR ADD #P.MCST,R2 ; ... roots710$: MOV (R2),R0 ; R0 = Next mulicast address blockc BEQ 15$ ; That is it!' MOV #ML.LEN,R1 ; Size of this blocke MOV (R0),(R2) ; Dequeue it MOV R2,-(SP) ; Save R26  CALL $DEACB ; Deallocate the mu00³B…—ƒ9ƒ´cÚµcÛ¶c�·c›’lticast addr block  MOV (SP)+,R2 ; restore R2   BR 10$ ; Do nextn 15$:5  CLR P.MCST(R5) ; Reset multicast address listheadr MOV R5,P.MCST+2(R5) ; ...L! ADD #P.MCST,P.MCST+2(R5) ; ...R120$: MOV P.CTBL(R5),R4 ; Compute protocol list.) ADD #C.PROL,R4 ; ... listhead address0;30$: MOV (R4),R4 ; Get addr of next protocol list entrys BEQ 80$ ; If EQ, no more @ BITB #LF.EXC!LF.DEF,PL.FLG(R4); Exclusive or default protocol+ BEQ 40$ ; If EQ, not an exclusive portu7 CMP R5,PL.EXC(R4) ; Is protocol owned by this port?  BNE 40$ ; If NE, no1 DECB PL.USE(R4) ; Reduce protocol usage counta$40$: MOV R4,R2 ; Compute address' ADD #PL.ADD,R2 ; ... chain listheadM;50$: MOV (R2),R0 ; Get pointer to next addr chain entry. BEQ 30$ ; If EQ, no moreV=  CMP R5,AD.PRT(R0) ; Is this protocol in use by this port? ! BEQ 60$ ; If EQ, yes '" MOV R0,R2 ; Move on down the chaine # BR 50$c$7%60$: MOV (R0),(R2) ; Unlink address block from chainL'& BNE 70$ ; If NE, not last in chaint/' MOV R2,PL.ADD+2(R4) ; Close up tail pointer ,(70$: DECB PL.USE(R4) ; Reduce usage count4) MOV #AD.LEN,R1 ; Get size of address chain entry* MOV R2,-(SP) ; Save R25+ CALL $DEACB ; Deallocate the address chain entry, MOV (SP)+,R2 ; Restore R2- BR 50$ ; Try next entry.;/80$: CALL SCNPR ; Remove inactive protocol list entriesV0 RETURN ; Return 12 e>3 .SBTTL ****************************************************>4 .SBTTL * UNA Ring Handling Subroutines *>5 .SBTTL ****************************************************6+7 .SBTTL INIRG - Initialize Ring pointersz89;+:;a&;; **-INIRG- Initialize Ring Pointers<; C=; This routine is called to initialize the rings used by the UNA.sA>; The ring pointers used by the other ring routines are set up.e?;i @; INPUTS:cA; R4 = Controller State TableRB; C; REGISTERS PRESERVED*D;- EINIRG::*&F MOV R0,-(SP) ; Save work registersG MOV R1,-(SP) ; ...H;gI; Initialize receive ring.J; 8K MOV C.RCVB(R4),C.RCVF(R4) ; Restart next free pointer=L MOV C.RCVB(R4),C.RCVC(R4) ; Restart current active pointer+M MOV #U$$NRS,R0 ; R0 = Receive ring size.N MOV C.RCVB(R4),R1 ; R1 = Receive ring baseO10$:#P CALL CLRING ; Clear ring entryd0Q MOV R1,RG.LNK(R1) ; Copy descriptor address.7R ADD #RG.SIZ,RG.LNK(R1) ; Plus length of a descriptorE1S MOV RG.LNK(R1),R1 ; Update descriptor pointerPT DEC R0 ; One less to doU BNE 10$ ; Loop till donenVOW MOV C.RCVB(R4),RG.LNK-RG.SIZ(R1); Set link word to point to first descriptorrX;MY; Initialize transmit ringZ;c8[ MOV C.XMTB(R4),C.XMTF(R4) ; Restart next free pointer=\ MOV C.XMTB(R4),C.XMTC(R4) ; Restart current active pointer0/] MOV #,R0 ; R0 = Receive ring sizeR.^ MOV C.XMTB(R4),R1 ; R1 = Receive ring base_20$:#` CALL CLRING ; Clear ring entryp0a MOV R1,RG.LNK(R1) ; Copy descriptor address.7b ADD #RG.SIZ,RG.LNK(R1) ; Plus length of a descriptor 1c MOV RG.LNK(R1),R1 ; Update descriptor pointer;d DEC R0 ; One less to doe BNE 20$ ; Loop till doneafDg MOV C.XMTB(R4),RG.LNK-RG.SIZ(R1); Set link word to point to firsth ; ... descriptor49i CLR C.RSEQ(R4) ; Clear receive sequence # accumulator$:j CLR C.XSEQ(R4) ; Clear transmit sequence # accumulatork$l MOV (SP)+,R1 ; Restore registersm MOV (SP)+,R0 ; ...n RETURN ; Exit to calleroo!pCLRING: MOV R2,-(SP) ; Save R2R4q MOV #RG.SIZ/2,R2 ; R2 = Word count of ring entry%r10$: CLR (R1)+ ; Clear ring entrys DEC R2 ; Count downt BNE 10$ ; Loop till donen(u SUB #RG.SIZ,R1 ; Restore R1 at entryv MOV (SP)+,R2 ; Restore R2rw RETURN ; Returnpxyz C3{ .SBTTL GFRRE - Get next free receive ring entry|};+~; -; **-GFRRE-Get next free receive ring entry€;(C�; This routine is called to get the next free receive ring entry.EJ‚; If no free entry is available a BEQ condition 00³J…œƒ_ƒt÷tø tþfDATAis returned. The routineIƒ; uses the ring pointers set up by INIRNG and updates these pointers as „; required.n…;n †; INPUTS: ‡; R4 = Controller State TableZˆ;; ‰; OUTPUTS:(Š; R1 -> Free Ring Entry (or 0 if none)‹;RŒ;;�; REGISTERS MODIFIED:Ž; R1�;-1�GFRRE: MOV C.RCVF(R4),R1 ; Get next ring entry /‘ TSTB RG.ACT(R1) ; Is this an active packet?’ BEQ 20$ ; Noi2“ CLR R1 ; Indicate no receive packet available$”10$: TST R1 ; Set condition code• RETURN ; Return to callerr–20$:2— MOV RG.LNK(R1),C.RCVF(R4) ; Update free pointer%˜ CLRB RG.FLG(R1) ; Clear flag byte&™ CLRB RG.ERR(R1) ; Clear error word.š INCB C.RSEQ(R4) ; Generate sequence number<› MOVB C.RSEQ(R4),RG.SEQ(R1) ; Put sequence # in ring entry,œ INCB RG.ACT(R1) ; Indicate packet active� BR 10$ ; Return to calleržŸ  4¡ .SBTTL GFXRE - Get next free transmit ring entry¢£;+¤;e.¥; **-GFXRE-Get next free transmit ring entry¦;oD§; This routine is called to get the next free transmit ring entry.J¨; If no free entry is available a BEQ condition is returned. The routineI©; uses the ring pointers set up by INIRNG and updates these pointers asq ª; required.«; ¬; INPUTS:.­; R4 = Controller State Tablee®; ¯; OUTPUTS:(°; R1 -> Free Ring Entry (or 0 if none)±;e²; REGISTERS MODIFIED:³; R1´;-µGFXRE:+¶ MOV C.XMTF(R4),R1 ; Get next ring entry'· TSTB RG.ACT(R1) ; Is packet active?i¸ BEQ 20$ ; No 7¹ CLR R1 ; Indicate no transmit ring entry available $º10$: TST R1 ; Set condition code» RETURN ; Return to callerT¼20$:2½ MOV RG.LNK(R1),C.XMTF(R4) ; Update free pointer%¾ CLRB RG.FLG(R1) ; Clear flag byted&¿ CLRB RG.ERR(R1) ; Clear error word.À INCB C.XSEQ(R4) ; Generate sequence number7Á MOVB C.XSEQ(R4),RG.SEQ(R1) ; Return sequence # in R2I. INCB RG.ACT(R1) ; Indicate entry is activeà BR 10$ ; Return to callerÄÅÆ )1Ç .SBTTL GCRRE - Get current receive ring entryRÈÉ;+Ê;n+Ë; **-GCRRE-Get current receive ring entryRÌ; IÍ; This routine is called to get a completed ring entry from the receive(<Î; ring. If none is available a BEQ condition is returned.Ï;lFÐ; If a ring entry is found the error bit is tested and the C-bit setÑ; if an error is found.Ò; Ó; INPUTS:.*Ô; R4 = Address of Controller State TableÕ;T Ö; OUTPUTS:×; R1 -> Ring Entry or 00Ø; Z-Bit set if no entry9Ù; C-Bit set if valid ring entry and error in ring entryRÚ;Û; R1 modified*Ü;-ÝGCRRE:Þ;c)ß; Check to see if an entry is available à;d+á MOV C.RCVC(R4),R1 ; Get next ring entryv'â TSTB RG.ACT(R1) ; Is packet active? )ã BEQ 10$ ; No - show no current entry 2ä BITB #RF.OWN,RG.FLG(R1) ; Do we own this entry?å BEQ 20$ ; Yes,æ10$: CLR R1 ; No - show no current entryç BR 50$ ; ...Sèé;e=ê; Got an entry - check sequence numbers and update pointers ë; =ì20$: INCB C.RSEQ+1(R4) ; Update Sequence Number, check forrí ; overflowd!î BNE 30$ ; Skip overflow codeh1ï TSTB RG.SEQ(R1) ; Ring entry overflowed also?C#ð BNE 100$ ; No - sequence error ñ BR 40$ ;R=ò30$: CMPB C.RSEQ+1(R4),RG.SEQ(R1) ; Sequence numbers match?nó BNE 100$ ; No - crashô40$:5õ MOV RG.LNK(R1),C.RCVC(R4) ; Update current pointer ö÷;s&ø; Set up conditions codes for callerù;4ú50$: ; Converge here for condition code set up&û TST R1 ; Do we have a ring entry?ü BEQ 70$ ; No - just exitrý2þ BITB #RF.STP,RG.FLG(R1) ; Is this a start entryÿ BEQ 55$ ; NoT@ MOV RG.VAD(R1),C.STRT(R4) ; Save start buffer addr for CHKERR55$:> BITB #RF.ERR,RG.FLG(R1) ; Yes - then do we have any errors? SEC ; Default to error$ BNE 60$ ; Yes - default correct CLC ; Set no errorsd$60$: CLZ ; Set buffer available670$: RETURN ; Return with Z and C cond. codes set ;e1 ; Ring has gone out of sequence - serious errore ;n 100$:  .IF DF DEBUG ; If debugging BPT* BR 1000³R…—ƒ9ƒ´cÚµcÛ¶c�·c›’0$ ; Don't loose the break point .IFFN CRASH ; Serious error; .ENDC ; DEBUGo 9 .SBTTL GCXRE - Get current active transmit ring entrya;+;S3; **-GCXRE-Get current active transmit ring entryt;eJ; This routine is called to get a completed ring entry from the transmit< ; ring. If none is available a BEQ condition is returned.!;gF"; If a ring entry is found the error bit is tested and the C-bit set#; if an error is found.$; %; INPUTS:;*&; R4 = Address of Controller State Table'; (; OUTPUTS:); R1 -> Ring Entry or 0 *; Z-Bit set if no entryB9+; C-Bit set if valid ring entry and error in ring entry,;-; R1 modifiedG.;-/GCXRE:0;n)1; Check to see if an entry is available 2;d+3 MOV C.XMTC(R4),R1 ; Get next ring entrym&4 TSTB RG.ACT(R1) ; Is packet active)5 BEQ 10$ ; No - show no current entryn26 BITB #RF.OWN,RG.FLG(R1) ; Do we own this entry?7 BEQ 20$ ; Yes,810$: CLR R1 ; No - show no current entry9 BR 50$ ; ...r:;;b=<; Got an entry - check sequence numbers and update pointerse=;n9>20$: BITB #RF.STP,RG.FLG(R1) ; Is this the start entry?n? BEQ 25$ ; No 8@ MOV RG.LNK(R1),R1 ; Get data entry for this transmit;A BITB #RF.OWN,RG.FLG(R1) ; Do we own the data entry also?r1B BNE 10$ ; No, wait until we own both entries5C MOV C.XMTC(R4),R1 ; Yes, return with header entry.D25$:9E INCB C.XSEQ+1(R4) ; Update Sequence Number, check forCF ; overflow !G BNE 30$ ; Skip overflow coder1H TSTB RG.SEQ(R1) ; Ring entry overflowed also?r#I BNE 100$ ; No - sequence errorB J BR 40$ ;F=K30$: CMPB C.XSEQ+1(R4),RG.SEQ(R1) ; Sequence numbers match?RL BNE 100$ ; No - crashM40$:5N MOV RG.LNK(R1),C.XMTC(R4) ; Update current pointereOP;r&Q; Set up conditions codes for callerR;n4S50$: ; Converge here for condition code set up&T TST R1 ; Do we have a ring entry?U BEQ 70$ ; No - just exitr>V BITB #RF.ERR,RG.FLG(R1) ; Yes - then do we have any errors?W SEC ; Default to error$X BNE 60$ ; Yes - default correctY CLC ; Set no errors$Z60$: CLZ ; Set buffer available6[70$: RETURN ; Return with Z and C cond. codes set\];a1^; Ring has gone out of sequence - serious erroru_; `100$: a .IF DF DEBUG ; If debuggingbc BPT ; Serious error )d BR 100$ ; Don't lose the break pointef .IFF g%h CRASH ; Something is very wrong ij .ENDC ; DEBUG.klm&n .SBTTL RLRPK - Release ring packeto;+ p; **-RLRPK-Release ring packetq;Y<r; This routine releases a ring packet by clearing clearings; it's active flag byte.t;R u; INPUT:v; R1 -> Ring packet.w;s1xRLPKT: CLRB RG.ACT(R1) ; Make packet available y RETURN ;z{| 5} .SBTTL STRBF - Set up receive buffers on the ringi~;+€;B.�; **-STRBF-SET UP RECEIVE BUFFER ON THE RING‚;Kƒ; These routine, if it can, will allocate receive buffers for all receive3„; ring entries and puts them on the receive ring. …;R †; INPUTS:n'‡; R4 - Address Controller state table ˆ;g ‰; OUTPUTS:Š; None‹;Œ; REGISTERS CHANGEDt�; Ž; R3, R1�;-�‘GTRBF:.’ CLR -(SP) ; Indicate, no new ring entries8“10$: MOV C.RBFL(R4),R3 ; Get next free receive buffer” BEQ 20$ ; No more•2– CALL GFRRE ; Get next free receive ring entry3— BEQ 20$ ; No free entries - just return buffer,˜7™ MOV (R3),C.RBFL(R4) ; Dequeue buffer from free list-š ; Clear ring entry save area in bufferg;› MOV R3,RG.VAD(R1) ; Save virtual addr of receive bufferlœ� CLR (R3)+ ; M.LNKž CLR (R3)+ ; M.ERRŸ CLR (R3)+ ; M.MLEN  ¡;H¢; NOTE - We cannot move the relocation value into the ring as this mayN£; set the ownership bit and we are not ready for the UNA to take this entry.¤;R8¥ MOV RELCT+2,-(SP) ; Put relocation constant on stack¦ MOV RELCT,-(SP) ; ...b,§ ADD R3,(SP) ; Convert packet address to$¨ ADC 2(SP) ; ... U00³Z…œƒ_ƒt÷tø tþfDATAnibus address.©8ª MOV (SP)+,RG.ADD(R1) ; Put unibus address of segment.« MOVB (SP)+,RG.AD2(R1) ; ... into ring entry¬7­ BIT #374,RG.AD2(R1) ; High order bits must be clear .® BNE 40$ ; Something is very wrong, CRASH!B¯ MOV #M.SIZE-M.DADD.,RG.LEN(R1); Set buffer length in ring entry°-± MOVB #RF.OWN,RG.FLG(R1) ; Set owner to UNA0² INC (SP) ; Say, we added buffer to the ring³ BR 10$ ; Try another one ´µ;*¶; Receive ring loaded or no more buffers·;C'¸20$: TST (SP)+ ; Did we do anythingV ¸ RETURN ; Return ; LK705¾ ;**-5¿40$: À .IF DF DEBUG ; If debuggingÁ BPT ; just breakÃÄ .IFFdÅÆ CRASH ; Otherwise, CRASHÇÈ .ENDC ; DEBUGgÉÊ 2Ë .SBTTL UMRMPA - UMR mapped communications areaÌ;+,Í; **-UMRMPA-UMR mapped communications areaÎ;rGÏ; This (UP TO 4K) area is mapped with a UMR. This area contains data <Ð; structures used to communicate with the UMR controllers.>Ñ; i.e. - PCB, UDBB, etc. The remainder of the space is usedÒ; for receive buffers.Ó;-ÔCBASE:5Õ .REPT U$$NCT ; Generate UMR mapped communicationBÖ ; ... buffers!×.=.+C.BASZ ; GEN mapped areawØ .ENDR3ÙRCVBFA: .BLKW 1 ; Start of receive buffers areaA;ÚNBPERC: .BLKW 1 ; TEMP SAVE # OF BUFFERS PER CONTROLLERa4ÛRCVBFL: .BLKW 1 ; Temp receive buffers list rootÜÝÞ w1ß .SBTTL UNAIN - UNA driver initialization codesàá;+3â; **-UNAIN-RSX QIO UNA driver initialization code ã; Fä; This routine sets up and initializes the driver's data structures.Kå; Once the driver is initialized, this code becomes a part of the receive.Oæ; buffers. This routine is called by the load routine at load time ($XELOA).tç;f è; Inputs:e7é; IMPUR, CBASE work areas, CVIRA (CBASE VIRTUAL ADDR)Rê;R ë; Outputs:/ì; The driver data structures are initialized.í;î; All registers are usedï;--ðUNAIN:ASL R3 ; Make word controller indexR"ñ MOV R3,-(SP) ; Save R3, R4, R5ò MOV R4,-(SP) ; ...ó MOV R5,-(SP) ; ...ô;e&õ; Create UMR wait buffer list in UCBö;e5÷ MOV #U$$NTS,R0 ; R0 = # of UMR wait blocks neededv7ø ADD #U.UCBX+10,R5 ; R5 = Addr of 1st UMR wait blocki'ù MOV R5,-2(R5) ; Init list root worduú10$:,û MOV R5,(R5) ; Create link to next blockü ADD #UMRWBS,(R5) ; ...*ý MOV (R5),R5 ; R3 points to next block$þ DEC R0 ; Dec wait block counterÿ BNE 10$ ; Loop till donek3 CLR -UMRWBS(R5) ; Clear link word of last entry ;54; Compute number of receive buffers per controller; - MOV CVIRA,R1 ; R1 = CBASE virtual addressV/ BIC #160000,R1 ; R1 = Area size below CBASE7 MOV #8192.-256.,R0 ; R0 = MAX receive area possible. SUB R1,R0 ; R0 = Communications area size8 SUB #RCVBFA-CBASE,R0 ; Adjust for communications area/  MOV R0,R2 ; Save receive buffers area size  A  CMP R0,# ; Do we have at least 1 buff/control.?i  BGE 20$ ; Yes$  CALLR 130$ ; No receive buffers20$: CLR R1 ; Clear counter '30$: INC R1 ; Generate buffer countM9 SUB #,R0 ; Compute # of buff/controllerR# BGT 30$ ; Loop to get quotientM;1; ALLOCATE THE BUFFERS; - MOV CVIRA,R0 ; R0 = CBASE VIRTUAL ADDRESSt: ADD #RCVBFA-CBASE,R0 ; R0 = VIRTUAL ADDRESS OF "RCVBFA"3 MOV R1,2(R0) ; Save # of buffers per controllers3 MOV R0,4(R0) ; Init receive buff list root wordl3 MOV R0,R1 ; R1 = Start of receive buffers area 5 ADD R2,R0 ; R0 points beyond last receive buffer -40$: MOV R1,(R1) ; Generate chain pointer# ADD #M.SIZE,(R1) ; ...'  MOV (R1),R1 ; POINT TO NEXT BUFFERo! CMP R1,R0 ; ARE WE DONE" BLO 40$ ; LOOP TILL DONEM4# CLR -M.SIZE(R1) ; CLEAR LINK WORD OF LAST BUFFER$;C!%; Clear controller state tablesR&;"A' MOV #/2,R0 ; R0 = Word count of controller tablesR3( MOV #IMPUR,R1 ; R1 = Start of controller tablesM)50$:-* CLR (R1)+ ; Clear controller tables areaD+ DEC R0 ; Decrement counterr,00³b…—ƒ9ƒ´cÚµcÛ¶c�·c›’ BNE 50$ ; Loop till doneR-;)$.; Clear mapped communications area/;EB0 MOV #/2,R0 ; R0 = Word count of controller tables21 MOV CVIRA,R1 ; R1 = Start of controller tables260$:-3 CLR (R1)+ ; Clear controller tables areaC4 DEC R0 ; Decrement countere5 BNE 60$ ; Loop till done/687 MOV #IMPUR,R1 ; R1 = Address of 1st controller table)8 MOV #CTABL,R4 ; R4 = Controller table:/9 MOV #U$$NCT,R5 ; R5 = Number of controllers:;C/;; Start controller state table initializationi<;n1= MOV CVIRA,R3 ; R3 = Virtual addrress of CBASEE7>70$: MOV #U$$NPC,R0 ; R0 = # of ports per controllerl?5@ MOV R1,R2 ; R2 = Address of 1st controller tablel8A ADD #C.LEN,R2 ; R2 = Address of word after 1st tableB1C MOV R4,C.INDX(R1) ; Generate controller index D SUB #CTABL,C.INDX(R1) ; ...E6F MOV R2,C.PORT(R1) ; Initialize port list root word0G MOV R1,(R4)+ ; Save controller table pointerH ; ... in CTABL:I MOV #CS.OFL,C.FLAG(R1) ; Indicate controller is offlineJ K .IF DF R$$MPL ; If RSX-11M+L:M BIS #CS.STP,C.FLAG(R1) ; Indicate controller is stoppedNO .ENDC ; R$$MPLP Q .IF DF DEBUG ; If debugging;R MOV #MD.TPD!MD.LOO,C.MODE(R1); Default mode is loop backbS .ENDC ; DEBUGNT%U .IF NDF DEBUG ; If not debuggingB8V MOV #MD.TPD!MD.ECT,C.MODE(R1) ; See UNA mode bit def.W .ENDC ; DEBUG X7Y MOV R1,C.PROL+2(R1) ; Set end protocol list pointer !Z ADD #C.PROL,C.PROL+2(R1) ; ...F[;13\; Create list of port state tables for controllerM];;@^80$: MOV R1,P.CTBL(R2) ; Save Control.State Table ptr in port?_ MOV R2,P.MCST+2(R2) ; Initialize multicast list end pointerd!` ADD #P.MCST,P.MCST+2(R2) ; ...O&a MOV R2,(R2) ; Generate port chain)b ADD #P.LENG,(R2) ; Point to next portI)c MOV (R2),R2 ; R2 = Next port pointerOd DEC R0 ; One less to doe BNE 80$ ; Loop till doneM2f CLR -P.LENG(R2) ; Clear link word of next portg;A6h; Allocate UMR mapped data structures for controlleri; 9j MOV R3,C.PCBP(R1) ; Set PCBB addr in controller table)-k ADD #CB.SIZ,R3 ; Point to word after PCBBVl<m MOV R3,C.UDBP(R1) ; Set UDBB address in controller table,n ADD #RD.SIZ,R3 ; R3 => Receive ring areao;n#p; Initialize receive ring pointer q;i.r MOV R3,C.RCVB(R1) ; Save receive ring base6s MOV R3,C.RCVF(R1) ; Receve ring free entry pointer:t MOV R3,C.RCVC(R1) ; Receive ring current entry pointeru8v ADD #U$$NRS*RG.SIZ,R3 ; Account for receive ring sizew;o$x; Initialize transmit ring pointery;B/z MOV R3,C.XMTB(R1) ; Save transmit ring baseP8{ MOV R3,C.XMTF(R1) ; Transmit ring free entry pointer;| MOV R3,C.XMTC(R1) ; Transmit ring current entry pointerR}=~ ADD #*2,R3 ; Account for transmit ring size+ ; (2 XMIT RING ENTRIES PER TRANSMIT)e€;M#�; Initialize transmit header liste‚;p4ƒ MOV #U$$NTS,R0 ; R0 = # of transmit ring entries7„ MOV R3,C.XHDR(R1) ; init xmit header list root wordr…90$:.† MOV R3,(R3) ; Create transmit header list‡ ADD #2+6+6+2+2,(R3) ; ...)ˆ MOV (R3),R3 ; ...‰ DEC R0 ; Dec counter Š BNE 90$ ; Loop till donet0‹ CLR -22(R3) ; Clear link word of last entryŒ3� MOV R3,C.WRKP(R1) ; Save pointer to work buffert5Ž ADD #C.WKSZ,R3 ; Add in controller work area size �;R+�; Allocate receive buffers for controllerr‘;e4’ MOV NBPERC,R0 ; R0 = # of buffers per controller5“ MOV #RCVBFL,R2 ; R2 = Receive buffer list pointero2” MOV (R2),C.RBFL(R1) ; Point to list of buffers•100$:i1– MOV (R2),R2 ; Allocate buffers to controller — DEC R0 ; ... ˜ BNE 100$ ; ...E4™ MOV (R2),RCVBFL ; Dequeue buffers just allocated4š CLR -M.SIZE(R2) ; Clear link word in last buffer›?œ ADD #C.LEN+,R1; Point to next controller area �(ž DEC R5 ; Decrement controller count!Ÿ BNE 70$ ; Do next controllerR$  CLC ; Indicate successful init¡)¢110$: MOV (SP)+,R5 ; Restore registerss£ MOV (SP)+,R4 ; ...¤ MOV (00³j…´l…_ƒt÷tø tþfDATASP)+,R3 ; ...'¥ BCS 120$ ; We failed to initialize ¦;l'§; Save pointers to KRB, SCB, DCB, UCB ¨; 1© MOV CTABL(R3),R0 ; Get controller state tableu9ª MOV R4,C.SCB(R0) ; Save SCB in controller state tablew« ¬ .IF DF R$$MPL ; If RSX-11M+­?® MOV S.KRB(R4),C.KRB(R0) ; Save KRB in controller state table ¯° .IFFt±2² MOV S.CSR(R4),C.CSR(R0) ; Save controller's CSR³´ .ENDC ; R$$MPLµ9¶ MOV R5,C.UCB(R0) ; Save UCB in controller state tableP?· MOV U.DCB(R5),C.DCB(R0) ; Save DCB in controller state tableo$¸120$: RETURN ; Return to caller¹%º130$: SEC ; Indicate init failedR» BR 110$ ; Return !¼DREND: ; End of driver code;)½DRVSIZ=DREND-IMPUR ; Driver area size>¾RBFASZ=<16384.-64.>-DRVSIZ-196. ; Receive buffers area size(¿ .BLKB RBFASZ ; Receive buffers area ÀRCBEND:Á .ENDSÂ(R4),C.CSR(R0) ; Save controller's CSR³´ .ENDC ; R$$MPLµ9¶ MOV R5,C.UCB(R0) ; Save UCB in controller state tableP?· MOV U.DCB(R5),C.D .TITLE TTMIS  .IDENT /04.01/t;a;; COPYRIGHT (c) 1983,1985 BY DIGITAL EQUIPMENT CORPORATION.d; ALL RIGHTS RESERVED.;$<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;i;b; 23-JAN-78 PETER WANNHEDENS; ; PREVIOUSLY MODIFIED BY:E;r ; C. F. SPITZl; D. R. DONCHINM;S; MODIFICATIONS:;S; S. C. ADAMS 18-MAY-85 04.01 ; SA381 -- MOVE TO MAP5.6; ;S;+0; COMMON MULTIPLEXER INTERRUPT SERVICE ROUTINES.,; USED BY FOLLOWING CONTROLLERS: DH, DJ, DZ.;-; ;  3 .IF DF T$$MUX U .MCALL UCBDF$,SCBDF$   .IF DF R$$MPL $ .MCALL KRBDF$ S KRBDF$ ;DEFINE KRB SYMBOLSM B .ENDC ;R$$MPL  UCBDF$ ;DEFINE UCB SYMBOLSM SCBDF$ ;DEFINE SCB SYMBOLS3 .PSECT MAP5.6 .IF DF D$$H11!D$$J11!D$$Z11;E;r;+4; MUXINP - INPUT INTERRUPT SERVICE FOR MULTIPLEXERS.;; INPUT:; R3 CSR ADDRESS; R4 KRB ADDRESS (RSX-11M+)6"; R4 ADDRESS OF UCB LIST (RSX-11M);R; ALTERNATE ENTRY - MUXIN1.D; ; INPUT:; R3 CSR ADDRESS; R4 KRB ADDRESS (RSX-11M+)D"; R4 ADDRESS OF UCB LIST (RSX-11M)!; R5 CHARACTER + STATUS FROM SILOR'; CC-N 1 IF R5 CONTAINS VALID CHARACTER;; OUTPUT FROM BOTH:U0; SILO EMPTIED. IF TRANSMIT READY IS SET IN CSR,6; A RETURN TO CALLER IS MADE WITH R3 AND R4 UNCHANGED.+; ELSE A RETURN TO CALLER'S CALLER IS MADE.T;R; REGISTERS ALTERED: R2,R5;-;:; !MUXIN1::MOV R5,-(SP) ;;;SAVE CHARS( SWAB R5 ;;;GET LINE NUMBER IN LOW BYTE CALL MUXUCB ;;;GET UCB IN R5' MOV (SP)+,R2 ;;;RETRIEVE CHAR + STATUS4+ BCS MUXINP ;;;BAD LINE - IGNORE CHARACTER  T .IF DF R$$MPL A& MOV R4,-(SP) ;;;OK - SAVE KRB ADDRESS0 CALL ICHAR1 ;;;DO COMMON INPUT INTERRUPT PROC.$ MOV (SP)+,R4 ;;;RESTORE KRB ADDRESS# MOV @R4,R3 ;;;RESTORE CSR ADDRESSR  .IFFT MOV R3,-(SP) ;;;SAVE CSR& MOV R4,-(SP) ;;;SAVE ADDR OF UCB LIST0 CALL ICHAR1 ;;;DO COMMON INPUT INTERRUPT PROC.) MOV (SP)+,R4 ;;;RESTORE ADDR OF UCB LISTG MOV (SP)+,R3 ;;;RESTORE CSR  .ENDC ;R$$MPL I4MUXINP::MOV 2(R3),R5 ;;;GET NEXT CHARACTER FROM SILO BMI MUXIN1 ;;;OK - JUMP ;R;; SILO IS NOW EMPTY. SEE IF CONTROLLER IS READY TO TRANSMITB;D TST @R3 ;;;XMIT RDY SET? BMI 10$ ;;;Y - RETURN.* TST (SP)+ ;;;N - POP 1.ST RETURN ADDRESS10$: RETURN ;;;RETURND .ENDC ;D$$H11!D$$J11!D$$Z11;;;A;+$; MUXUCB - GET UCB FROM LINE NUMBER.;T; INPUT:; R4 KRB ADDRESS (RSX-11M+)R"; R4 ADDRESS OF UCB LIST (RSX-11M); R5 LINE NUMBER IN BITS 0-3; ; OUTPUT:C; R2 LINE NUMBER * 2&; R5 POINTER TO U.TSTA (IF VALID LINE); CC-C 0 IF VALID LINE; 1 IF INVALID LINE;R; REGISTERS ALTERED: R2,R5;-;O;R-MUXUCB::BIC #^C17,R5 ;;;CLEAR IRRELEVANT BITSD E .IF DF R$$MPL - MOV R5,R2 ;;;COPY LINE NUMBER1$ ASL R2 ;;;MAKE INDEX FOR UCB TABLE" CMPB K.HPU(R4),R5 ;;;LINE IN USE?# BLO 10$ ;;;N - EXIT WITH CC-C SETF MOV R4,R5 ;;;GET KRB ADDRESS+ ADD K.OFF(R4),R5 ;;;ADD OFFSET TO UCB LIST - ADD R2,R5 ;;;ADD LINE NUMBER * 2 - YIELDING3 ;;;POINTER TO UCB POINTERB MOV @R5,R00´r…µs…9ƒ´cÚµcÛ¶c�·c›’5 ;;;GET UCB POINTERF1 ADD #U.TSTA,R5 ;;;POINT TO U.TSTA AND CLEAR CC-CI10$: RETURN ;;;RETURNL E .IFF ;R$$MPLO R ASL R5 ;;;GET UNIT NUMBER * 2R MOV R5,R2 ;;;SAVE IT ADD R4,R5 ;;;GET UCB POINTER MOV (R5),R5 ;;;POINT TO UCBA BEQ 10$ ;;;LINE NOT IN USE1 ADD #U.TSTA,R5 ;;;POINT TO U.TSTA AND CLEAR CC-C  RETURN ;;;RETURNR 510$: SEC ;;;SET CC-C RETURN ;;;RETURND F .ENDC ;R$$MPL A .ENDC ;T$$MUX N;U;R .ENDYIELDING3 ;;;POINTER TO UCB POINTERB MOV @R5,R .TITLE TTUS .IDENT /01.00/;6; COPYRIGHT (c) 1986 BY DIGITAL EQUIPMENT CORPORATION.; ALL RIGHTS RESERVED.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;;; 7-NOV-85 STEPHANIE ADAMS;; MODIFICATIONS:;;+/; STUB PORT DRIVER FOR USER-WRITTEN PORT DRIVER;E; THIS MODULE PROVIDES THE INTERFACE BETWEEN TTDRV AND A USER-WRITTEN; PORT DRIVER:;B; 1. IN THE CONTROLLER ON-LINE CODE, INITIALIZE CELLS IN THE USER 7; PORT TO CONTAIN ADDRESSES OF TTDRV'S ENTRY POINTS.;M; 2. IN THE INPUT AND OUTPUT SERVICE ROUTINES, PERFORM GENERAL TTDRV SERVICES; ?; 3. CALL THE APPROPRIATE ROUTINE IN THE PORT DRIVER VIA $MPPRO; ;- .IF DF T$$USP  .MCALL KRBDF$  .MCALL HWDDF$,UCBDF$,PRTDF$# HWDDF$ ;DEFINE HARDWARE SYMBOLS UCBDF$ ;DEFINE UCB SYMBOLS$ PRTDF$ ;DEFINE USER PORT OFFSETS KRBDF$ ;DEFINE KRB SYMBOLS3.IIF NDF R$$MPL, .ERROR ;SUPPORTED ONLY ON M-PLUSB.IIF NDF R$$CON, .ERROR ;SOME OF THE OFFSETS THAT FOLLOW REQUIRE/ ;THIS TO BE A SYSTEM WITH RECONFIGURATION.; ; LOCAL DATA; .PSECT MAP5 .PAGE .SBTTL RESUME OUTPUT;+; USRESX - RESUME OUTPUT.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USRESX::* MOV #P.RRES+120000,R0 ;SET UP USER OFFSET. CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .SBTTL ABORT OUTPUT;+; USABOX - ABORT OUTPUT.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.TOC 0 ; U.TTOC 0;-USABOX::+ MOV #P.RABO+120000,R0 ;SET UP USER ADDRESS. CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .SBTTL STOP OUTPUT;+!; USSTOX - STOP (SUSPEND) OUTPUT.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S1.CTS 1;-USSTOX::+ MOV #P.RSTO+120000,R0 ;SET UP USER ADDRESS. CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .SBTTL POWER UP;+; USPWUP - POWER-UP.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USCPUP::+ MOV #P.RCPU+120000,R0 ;SET UP USER ADDRESS. CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .PAGE .SBTTL CONTROLLER ON-LINE;+; USCONL - CONTROLER ON-LINE;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; R0 AND R1 ARE DESTROYED;-USCONL::1 MOV KISAR6,-(SP) ;SAVE THE CURRENT APR6 MAPPING# MOV K.OWN(R2),R5 ;GET UCB ADDRESS# MOV U.DCB(R5),R1 ;GET DCB ADDRESS# MOV D.PCB(R1),R1 ;GET PCB ADDRESS; MOV P.REL(R1),KISAR6 ;MAP TO USER TO PLUG IN OUR ADDRESSES% MOV #140000,R0 ;SET UP USER ADDRESS3 ADD @#140000+P.ROFF,R0 ;ADD OFFSET TO TTDRV TABLE2 TST P.TTII(R0) ;HAS IT ALREADY BEEN INITIALIZED? BNE 10$ ;BR IF INIT. ALREADY;!; FILL IN TT: DRIVER ENTRY POINTS;( MOV #ICHAR1,P.TTII(R0) ;INPUT INTERRUPT( MOV #ODONE,P.TTOI(R0) ;OUTPUT INTERRUPT2 MOV #FP000,P.TTFP(R0) ;FORK PROCESSING SUBROUTINE/10$: MOV (SP)+,KISAR6 ;AND RESTORE OUR MAPPING3 MOV #P.RCON+120000,R0 ;GET USER OFFSET FOR ON-LINE CALLR MAPUSR ;AND CALL USER .PAGE .SBTTL UNIT ON-LINE;+; USUONL - UNIT ON-LINE;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USUONL::+ MOV #P.RUON+120000,R0 ;SET UP USER ADDRESS- CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .SBTTL UNIT POWER-UP;+; USUPUP - UNIT POWER-UP.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; R0 AND R1 ARE DESTROYED;-USUPUP::+ MOV #P.RUPU+120000,R0 ;SET UP U00µz…¶�…_ƒt÷tø tþfDATASER ADDRESS- CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .SBTTL MODEM TIMER;+; USMTIM - MODEM TIMER.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USMTIM::+ MOV #P.RMTI+120000,R0 ;SET UP USER ADDRESS- CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .PAGE .SBTTL CONTROLLER OFF-LINE;+; USCOFF - CONTROLLER OFF-LINE;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; R0 AND R1 ARE DESTROYED;-USCOFF::1 MOV KISAR6,-(SP) ;SAVE THE CURRENT APR6 MAPPING# MOV K.OWN(R2),R5 ;GET UCB ADDRESS# MOV U.DCB(R5),R1 ;GET DCB ADDRESS# MOV D.PCB(R1),R1 ;GET PCB ADDRESS; MOV P.REL(R1),KISAR6 ;MAP TO USER TO PLUG IN OUR ADDRESSES% MOV #140000,R0 ;SET UP USER ADDRESS3 ADD @#140000+P.ROFF,R0 ;ADD OFFSET TO TTDRV TABLE( CLR (R0) ;INDICATE CONTROLLER HAS NOT ;BEEN INITIALIZED' MOV (SP)+,KISAR6 ;RESTORE OUT MAPPING+ MOV #P.RCOF+120000,R0 ;SET UP USER ADDRESS. CALLR MAPUSR ;AND CALL ROUTINE TO CALL USER .PAGE .SBTTL UNIT OFF-LINE;+; USUOFF - UNIT OFF-LINE;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USUOFF::+ MOV #P.RUOF+120000,R0 ;SET UP USER ADDRESS- CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .PAGE( .SBTTL INPUT INTERRUPT SERVICE ROUTINE;+"; INPUT INTERRUPT SERVICE ROUTINE.;-$USINP::'; TTSET$ US ;;;SAVE R2, R3 AND SET UP: ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS%; MOV K.OWN(R4),R5 ;;;GET UCB ADDRESS CALL MAPD + CALLR ICHAR1 ;;;DO COMMON INPUT CHARACTER ;;;PROCESSING AND RETURN .PAGE) .SBTTL OUTPUT INTERRUPT SERVICE ROUTINE;+"; OUTPUT INTERRUPT SERVICE ROUTINE;- $USOUT::'; TTSET$ US ;;;SAVE R2, R3 AND SET UP: ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS$ MOV K.OWN(R4),R5 ;;;GET UCB ADDRESS .PAGE .SBTTL START OUTPUT;+; USSTAX - START OUTPUT.;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USSTAX::* MOV #P.RSTA+120000,R0 ;;;GET USER ADDRESS, CALLR MAPUS1 ;;;AND GO TO THE USER ROUTINE8; CALLR OUTISR ;;;DO COMMON OUTPUT INTERRUPT PROCESSING .SBTTL CHANGE LINE PARAMETERS;+!; USLPAR - CHANGE LINE PARAMETERS;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USLPAR::* MOV #P.RLPA+120000,R0 ;;;GET USER ADDRESS-; CALLR MAPUS1 ;;;AND GO TO THE USER ROUTINE .PAGE .SBTTL LOCAL SUBROUTINES;; LOCAL SUBROUTINES; .PAGE;+/; MAPUSR - MAP TO AND CALL THE USER SUBROUTINE.;F; INPUT: R0 - OFFSET IN THE USER'S CODE OF THE ROUTINE TO BE CALLED; R5 - UCB ADDRESS;; R1 IS DESTROYED?; DATA APR5 IS DESTROYED FOR THE USER ROUTINE BY $MPPRO BUT%; RESTORED LATER FOR TTDRV'S USE.;-MAPUS1:, SUB #U.TSTA,R5 ;ADJUST BACK TO START OF UCBMAPUSR:" MOV U.DCB(R5),R1 ;GET DCB ADDRESS" MOV D.PCB(R1),R1 ;GET PCB ADDRESS9 MOV P.REL(R1),-(SP) ;GET APR BIAS FOR USER'S APPLICATION. MOV R0,-(SP) ;SET UP VIRTUAL ADDRESS FOR USER6 CALL $MPPRO ;USE EXEC ROUTINE TO MAP IT AND CALL IT RETURN ;BACK TO CALLER .ENDC ;T$$USP  .END UCB ADDRESS;; R1 IS DESTROYED?; DATA APR5 IS DESTROYED FOR THE USER ROUTINE BY $MPPRO BUT%; RESTORED LATER FOR TTDRV'S USE.;-MAPUS1:, SUB #U.TSTA,R5 ;ADJUST BACK TO START OF UCBMAPUSR:" MOV U.DCB(R5),R1 ;GET DCB ADDRESS" MOV D.PCB(R1),R1 ;GET PCB ADDRESS9 MOV P.REL(R1),-(SP) ;GET APR BIAS FOR USER'S APPLICATION. MOV R0,-(SP) ;SET UP VIRTUAL ADDRESS FOR USER6 CALL $MPPRO ; .TITLE SYSIDe .IDENT /01.00/  e; ; COPYRIGHT (c) 1984, 1985 BY(; DIGITAL EQUIPMENT CORPORATION, MAYNARD'; MASSACHUSETTS. ALL RIGHTS RESERVED.F;SA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED.A; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE A; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS1A; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR A; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO ANDA1; OWNERS00¶‚…À……Á‡…´cÚµcÛ¶c�·c›’HIP OF THE SOFTWARE IS HEREBY TRANSFERED. ; A; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTAA; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;SA; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFM<; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.;R,; CREATED BY SYSBLD ON 03-SEP-87 AT 18:44:44;O; MODIFIED BY:;NA; THIS MODULE CONTAINS THE SYSTEM BASE LEVEL AND VERSION NUMBERS..F; IT MUST RESIDE IN THE FIRST 4K OF I AND D SPACE ON KERNEL D SYSTEMS. .ENABL LC .NLIST BEX  S$SYTYP:: .IF DF P$$3XX .ASCII \ProMicro/RSX\ .IFFO. .IF DF R$$MIC ;SYSTEM NAME USED BY UTILITIES .ASCII \Micro/RSX \ .IFFS .IF DF R$$CPR .ASCII \VAX-CPR/RSX \ .IFFS .ASCII /RSX-11M-PLUS/ .ENDC ; DF R$$CPR N .ENDC ; DF R$$MIC .ENDC ; DF P$$3XX ?$SYSID::.ASCII /40 / ;SYSTEM IDENTIFICATION - MUST BE 4 CHARSN -$VERSN::.ASCII /4.0 / ;SYSTEM VERSION NUMBERVF$SYSNM::.WORD S$$NM1,S$$NM2,S$$NM3 ;SYSTEM NAME (NODE NAME FOR DECNET) .END SYSTEMS. .ENABL LC .NLIST BEX  S$SYTYP:: .IF DF P$$3XX .ASCII \ProMicro/RSX\ .IFFO. .IF DF R$$MIC ;SYSTEM NAME USED BY UTILITIES .ASCII \Micro/RSX \ .IFFS .IF DF R$$CPR .ASCII \VAX-CPR/RSX \ .IFFS .ASCII /RSX-11M-PLUS/ .ENDC ; DF R$$CPR N .ENDC ; DF R$$MIC .ENDC ; DF P$$3XX ?$SYSID::.ASCII /40 / ;SYSTEM IDENTIFICATION - MUST BE 4 CHARSN -$VERSN::.ASCII /4.0 / ;SYSTEM VERSION NUMBERVF$SYSNM::.WORD S$$NM1,S$$NM2,S$$NM3 ;SYSTEMEN ARGUMENTS ONTO STACK IN REVERSE ORDER, CONVERTING!; DEFAULTED ARGUMENTS INTO ZEROES ;-60$: MOV -(R2),-(SP) ;PUSH ONE& CMP #-1,(SP) ;WAS ARGUMENT DEFAULTED? BEQ 80$ ;IF EQ YES ROR R1 ;NO--ROTATE BIT MAP BR 100$ ;M-80$: ROR R1 ;DEFAULTED ARG--WAS IT REQUIRED?M BCS 160$ ;IF CS YES--ERROR CLR (SP) ;NO--CHANGE TO ZERO100$: DEC R0 ;LOOP; BNE 60$ ;O#120$: CLC ;BETTER SAFE THAN SORRY  BR 180$ ;GO EXIT;2; HERE IF AN ERROR WAS DETECTEDO;S160$: MOV R4,SP ;RESTORE SP" SEC ;FLAG AN ERROR HAS OCCURRED# BR 200$ ;GO RETURN WITH R5 INTACTR6180$: MOV R4,R5 ;COPY OLD SP FOR LATER ERROR RECOVERY200$: JMP (R3) ;ROUTINE EXITE .END BEQ 80$ ;IF EQ YES ROR R1 ;NO--ROTATE BIT MAP BR 100$ ;M-80$: ROR R1 ;DEFAULTED ARG--WAS IT REQUIRED?M BCS 160$ ;IF CS YES--ERROR CLR (SP) ;NO--CHANGE TO ZERO100$: DEC R0 ;LOOP; BNE 60$ ;O#120$: CLC ;BETTER SAFE THAN SORRY  BR 180$ ;GO EXIT;2; HERE IF AN ERROR WAS DETECTEDO;S160$: MOV R4,SP ;RESTORE SP" SEC/ .TITLE KMUL INTEGER MULTIPLY MAGNITUDE NUMBERS .IDENT /03/;; COPYRIGHT (C) 1977, 1978.; DIGITAL EQUIPMENT CORP., MAYNARD, MASS.;A; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USE@; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSION@; OF DEC'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT1; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC.;@; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT@; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL; EQUIPMENT CORPORATION.;D@; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY?; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.C;E ; VERSION 03; ; D. N. CUTLER 10-FEB-72;+-; **-.KMUL-INTEGER MULTIPLY MAGNITUDE NUMBERSS;P ; INPUTS:C;O; R0=MULTIPLIER.; R1=MULTIPLICAND.;M ; OUTPUTS:; ); DOUBLE WORD RESULT IS RETURNED WITH THEF); HIGH PART IN R0 AND THE LOW PART IN R1.N;W9; REGISTERS R2, R3, R4, AND R5 ARE PRESERVED ACROSS CALL.N;- .ENABL LSBI&.KMUL:: MOV R0,-(SP) ;SAVE R0 FOR ADDS MOV #21,-(SP) ;SET REPEAT COUNT CLR R0 ;CLEAR HIGH PARTO 10$: ROR R0 ;DOUBLE RIGHT SHIFT ROR R1 ; BCC 20$ ;IF CC DO NOT ADD ADD 2(SP),R0 ;- CLC ;CLEAR CARRY INDICATORI&20$: DEC (SP) ;DECREMENT REPEAT COUNT BGT 10$ ;IF GT MORE TO GOE CMP (SP)+,(SP)+ ;CLEAN STACKU RETURN ;  .ENDRD RESULT IS RETURNED WITH THEF); HIGH PART IN R0 AND THE LOW PART IN R1.N;W9; REGISTERS R2, R3, R4, AND R5 ARE PRESERVED00Š…�…_ƒt÷tø tþfDATA .TITLE KRWBF READ/WRITE BUFFER .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; ; VERSION 01; B. SCHREIBER 14-JUL-77;E4; THIS MODULE READS AND WRITES THE USERS DATA BUFFER;E; SYSTEM MACRO CALLS;S .MCALL KSWDF$ KSWDF$H .PSECT .KSCT1 A< .SBTTL .KRDWD READ WORD FROM USER BUFFER AT INTERRUPT LEVEL;+;; .KRDWD -- READ WORD FROM USER BUFFER (AT INTERRUPT LEVEL)O;E ; INPUTS:A; ; R4 SWEEP CONTROL BLOCK POINTER;O ; OUTPUTS:;; C-CLEAR READ WORD OK; R3 HOLDS DATUM;R,; C-SET READ WORD OK--END OF BUFFER OR SWEEP;C; REGISTERS ALTERED:;I; NONE; ;-B.KRDWD::MOV S.WBPX(R4),R3 ;;;GET POINTER TO CURRENT BUFFER POINTER .IF DF M$$MGE) MOV (R3)+,@#KISAR6 ;;;MAP TO USER BUFFERS .IFTF ;M$$MGE4 MOV @(R3),-(SP) ;;;READ WORD FROM BUFFER ONTO STACK) ADD #2,(R3) ;;;INCREMENT BUFFER POINTER .IFT ;M$$MGEE) BIT #20000,(R3) ;;;OVERFLOW 4K BOUNDARY?A BEQ 40$ ;;;IF EQ NOL' BIC #20000,(R3) ;;;YES--CLEAR OVERFLOWL. ADD #200,-(R3) ;;;ADVANCE TO NEXT 4K BOUNDARY .IFTF ;M$$MGE 40$: CLC ;;;PRESET FOR SUCCESS0 DEC S.WCNT(R4) ;;;DECREMENT SAMPLE COUNT (C-OK)$ BGT 60$ ;;;IF GT NOT END OF BUFFER$ CALL .BFSWT ;;;YES--SWITCH BUFFERS$ SEC ;;;SET C-BIT FOR FORK REQUEST!60$: MOV (SP)+,R3 ;;;RESTORE WORD) RETURNW" ;;;M$$MGE CONDITIONAL CONTINUES = .SBTTL .KWRWD WRITE WORD INTO USER BUFFER AT INTERRUPT LEVELR" ;;;M$$MGE CONDITIONAL CONTINUED;+'; .KWRWD -- WRITE WORD INTO USER BUFFERO;F6; THIS ROUTINE WRITES A DATA WORD INTO THE USER BUFFER;F ; INPUTS:;0; R3 DATA WORD ; R4 SWEEP CONTROL BLOCK POINTER;C ; OUTPUTS:;O ; C-CLEAR OK;6;; C-SET OK BUT FORK REQUEST FOR END OF BUFFER, DONE, OR DAOB;E; REGISTERS ALTERED:;O; NONE;E;-&.KWRWD::MOV R3,-(SP) ;;;SAVE DATA WORD; MOV S.WBPX(R4),R3 ;;;GET POINTER TO CURRENT BUFFER POINTERW .IFT ;M$$MGEE) MOV (R3)+,@#KISAR6 ;;;MAP TO USER BUFFERC .IFTF ;M$$MGE/ MOV (SP)+,@(R3) ;;;WRITE WORD INTO USER BUFFER-20$: ADD #2,(R3) ;;;INCREMENT BUFFER POINTERU .IFT ;M$$MGE ) BIT #20000,(R3) ;;;OVERFLOW 4K BOUNDARY?R BEQ 40$ ;;;IF EQ NO ' BIC #20000,(R3) ;;;YES--CLEAR OVERFLOWK. ADD #200,-(R3) ;;;ADVANCE TO NEXT 4K BOUNDARY .IFTF ;M$$MGE"40$: CLC ;;;PRESET C FOR SUCCESS) DEC S.WCNT(R4) ;;;DECREMENT SAMPLE COUNTW) ;;; (**DEC DOES NOT AFFECT C-BIT**) " BGT 60$ ;;;IF GT BUFFER NOT DONE& CALL .BFSWT ;;;END OF BUFFER--SWITCH$ SEC ;;;SET C-BIT FOR FORK REQUEST60$: RETURN ;;;R" ;;;M$$MGE CONDITIONAL CONTINUES B0 .SBTTL .BFSWT SWITCH BUFFERS AT INTERRUPT LEVEL" ;;;M$$MGE CONDITIONAL CONTINUED;+!; .BFSWT -- SWITCH TO NEXT BUFFERC;R ; INPUTS:;D"; R4 POINTS TO SWEEP CONTROL BLOCK ; R3 SCRATCH;; ; OUTPUTS:;C; BUFFERS SWITCHED;C;-K.BFSWT::MOVB S.WBNO(R4),S.WLBF(R4) ;;;REMEMBER LAST BUFFER IN CASE OF ERRORC .IFT ;M$$MGE$< MOV S.WUSW+2(R4),@#KISAR6 ;;;MAP TO USER STATUS WORD (IBUF) .IFTF ;M$$MGE' MOV S.WUSW+4(R4),R3 ;;;GET USW ADDRESS- ADD #IB.USQ,R3 ;;;POINT TO USER BUFFER QUEUET .REPT 8.C, TSTB (R3)+ ;;;LOOK FOR EMPTY SLOT IN QUEUE BMI 10$ ;;;IF MI WE FOUND IT .ENDM- BR 100$ ;;;IF QUEUE IS FULL CALL IT OVERRUNT+ ;;;EVEN THO IT IS REALLY UNDERRUN(!!??) A10$: MOVB 00Â’…Ö…‡…´cÚµcÛ¶c�·c›’S.WBNO(R4),-(R3) ;;;ENTER BUFFER NUMBER INTO USER QUEUE,8 BIT #S$WSEB!S$WSTP,S.WFL2(R4) ;;;STOP AT END OF BUFFER?* ;;;OR JUST PLAIN STOP SWEEP? BNE 60$ ;;;IF NE YES' TST S.WNBF(R4) ;;;CONTINUOUS SAMPLING?+ BMI 20$ ;;;IF MI YES' DEC S.WNBF(R4) ;;;NO--DEC BUFFER COUNTF$ BEQ 80$ ;;;IF EQ SWEEP IS COMPLETE/20$: MOV S.WUSW+4(R4),R3 ;;;POINT TO IBUF AGAINI3 ADD #IB.DVQ,R3 ;;;POINT AT THE DEVICE BUFFER QUEUES: MOVB (R3),S.WBNO(R4) ;;;GET THE NEXT BUFFER NUMBER TO USE# BMI 100$ ;;;IF MI WE HAVE OVERRUN; .REPT 3/ MOVB 1(R3),(R3)+ ;;;MOVE THE QUEUE DOWN A BYTEF MOVB 1(R3),(R3)+ ;;;...% BMI 50$ ;;;TRY THE EASY OUT 3 TIMESS .ENDM140$: MOVB 1(R3),(R3)+ ;;;MOVE THE LAST ENTRY DOWNU) MOVB #-1,(R3) ;;;CLOSE QUEUE WITH A (-1)S850$: MOVB S.WBNO(R4),R3 ;;;GET NEW CURRENT BUFFER NUMBER ASL R3 ;;;MULTIPLY V ASL R3 ;;; BY 4 ADD R4,R3 ;;;INDEX INTO SWBD5 ADD #S.WIBP,R3 ;;; AND INTO INITIAL BUFFER POINTERSS% MOV (R3)+,S.WBPT(R4);;;MOVE POINTERS & MOV (R3)+,S.WBPT+2(R4) ;;;INTO S.WBPT0 MOV S.WSIZ(R4),S.WCNT(R4) ;;;RESET BUFFER COUNT RETURN ;;;DONE;V2; HERE WHEN S$WSEB IS TRUE (STOP AT END OF BUFFER);IE60$: MOV #-,S.WSTS(R4) ;;;SET STATUS OF ABORT FOR S$WSEBM$ BR 120$ ;;;FLAG TO STOP AND RETURN;; ALL BUFFERS SAMPLED ;G)80$: MOV #IS.SUC,S.WSTS(R4) ;;;SET STATUSU BR 120$ ;;;FINISH UP;4; DATA OVERRUN OR DONE SAMPLING;D?100$: MOV #-,S.WSTS(R4) ;;;SET DATA OVERRUN STATUSW,120$: BIS #S$WSTP,S.WFL2(R4) ;;;FLAG TO STOP= MOVB S.WLBF(R4),S.WEBF(R4) ;;;SET BUFFER IN ERROR NUMBER FORC) ;;;IGTBUF/IWTBUF (MAY NOT BE IN$' ;;;ERROR, BUT ACTUALLY END OF* ;;;SWEEP, BUT ITS ALL THE SAME!)4 BIC #S$WACT,S.WFL2(R4) ;;;SWEEP IS NO LONGER ACTIVE140$: RETURN ;;; .ENDC ;M$$MGE .END: MOV #IS.SUC,S.WSTS(R4) ;;;SET STATUSU BR 120$ ;;;FINISH UP;4; DATA OVERRUN OR DONE SAMPLING;D?100$: MOV #-,S.WSTS(R4) ;;;SET DATA OVERRUN STATUSW,120$: BIS #S$WSTP,S.WFL2(R4) ;;;FLAG TO STOP= M( .TITLE RCLOKB READ CLOCK B FROM FORTRAN .IDENT /M01.00/;; COPYRIGHT (C) 1977, 1978/; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.;>; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A>; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE>; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR>; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE>; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH>; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC.;I?; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ?; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION.;O=; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OFS9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; VERSION 01; B. SCHREIBER 24-OCT-77;EC; THIS MODULE READS CLOCK B AND RETURNS THE VALUE IN FLOATING POINT  S .SBTTL RCLOKB;+<; RCLOKB -- READ CLOCK B AND RETURN RESULT IN FLOATING POINT;N; CALL:C; ; TIME = RCLOKB (RLAST [,PTIME]);T ; INPUTS: ;C6; RLAST IS THE VALUE TO BE SUBTRACTED FROM THE CURRENT2; 16-BIT SOFTWARE CLOCK TIME BEFORE RETURNING THE ; RESULT.;E ; OUTPUTS:;L; TIME,PTIME RETURN THE RESULT;;-'RCLOKB::CALL ICLOKB ;READ 16-BIT CLOCKE1 CALL .FLT16 ;CONVERT TO FLOATING POINT IN R0,R1- TST (R5)+ ;SKIP THE COUNT WORD# MOV (R5)+,R4 ;GET ADDRESS OF RLASTO CMP #-1,R4 ;WAS IT DEFAULTED? ! BEQ 40$ ;IF EQ YES--WE ARE DONEE$ MOV (R4),-(SP) ;NO--PUSH ONTO STACK% BIS 2(R4),(SP)+ ;AND SEE IF IT WAS 0T BEQ 40$ ;IF EQ YES# MOV (R4)+,R2 ;NO--GET THE ARGUMENTM MOV (R4)+,R3 ;.... CALL .KSUB ;SUBTRACT RLAST FROM CURRENT TIME ; (RETURN IN R0:R1)-40$: CMP -4(R5),#2 ;WERE THERE TWO ARGUMENTS?C BLT 100$ ;IF LT NO* CMP (R5),#-1 ;YES--WAS 2ND ARG DEFAULTED? BEQ 100$ ;IF EQ YES-) MOV (R5),R4 ;NO--GET ADDRESS OF 2ND ARG5" MOV R0,(R4)+ ;STORE TIME ARGUMENT M00Ú…�…_ƒt÷tø tþfDATAOV R1,(R4)+ ;... 100$: RETURN .ENDQ YES--WE ARE DONEE$ MOV (R4),-(SP) ;NO--PUSH ONTO STACK% BIS 2(R4),(SP)+ ;AND SEE IF IT WAS 0T BEQ 40$ ;IF EQ YES# MOV (R4)+,R2 ;NO--GET THE ARGUMENTM MOV (R4)+,R3 ;.... CALL .KSUB ;SUBTRACT RLAST FROM CURRENT TIME ; (RETURN IN R0:R1)-40$: CMP -4(R5),#2 ;WERE THERE TWO ARGUMENTS?C BLT 100$ ;IF LT NO* CMP (R5),#-1 ;YES--WAS 2ND ARG DEFAULTED? BEQ 100$ ;IF EQ YES-) MOV (R5),R4 ;NO--GET ADDRESS OF 2ND ARG5" MOV R0,(R4)+ ;STORE TIME ARGUMENT M–,?-?-µµ S„'SYSYSYSYTICLSY~Ϛγ<<ð„'°~ÀZ.-|d�d�d�d�":6:d�|†?-µ€4)%γϚ¾sγP¶(J*€Ê)€Áe?ÁE? ‡& fŽ Ž Ž Ž Ž Ž æYÿˆ‡æw: æ w2 æ æ * æ + æ2æ3ÁEÿæ ÎE‚w ,(…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ *(W ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡Â Âw Ä' ”Å¥ üÅ¥ ùÅå0B¡†€÷ ¸'Aa”ôœÿÿ‡w ’'Ä'Å  ÅUD$†BA÷ Ú'&�Â(÷ ÅU� ÀBQ÷ ÿÂЕ* ü‡÷ &÷ &÷ �’•’•€‡@Á(÷ F'f€  Àe ÀeÉÿÀe Àe ‡&f¦÷ Èwìÿ‚�€‡÷ àÿ÷ àÿÁ ‡Â w &&f¦÷ Z&1†�Áe?� � � � � � w¬ÿw ¦ÿ‚Á ÿ& fæYÿˆ†w ’ÿƒÁŒÿô±€Á Á Á Á Á Á Ânÿw`jÿ÷ ‚ÿ‚�€½– –5‡°0-Ar?rÂÎÿÂeÂE ÷ |ýæfÿˆ&Àvúænÿˆ· Òÿ‡ ÁmÈÿ ‡ž¦ ʺÿà�bŠå‚‡ABDEFIMNOPQRSTUXYZ<>ÉØâô=öMXd^Œ•öêžèò)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw n%&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ `ýÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚b‚ ‡AÂ Ê Ö ÊЕ%„Ì¥Vå ‡P”à ý‡Ð• B”f�‚÷ Œü�à õ‡& æÎenüB& ¦æÎeZü;& æÎeý6H”ÈÅ€¢ ¢È• € à ò‡÷ nŠ€‡Ð• à ü‡Ð‹à üÀ ‡Ð• Е à ú‡& æÎe ü & ¦æÎeöûЕ A‚¦Þ à ÷–%‡& æÎeÊûóA÷ Øüà û‡Ð• à ü‡Ð• Aæ÷ ºüAÎ ûÖ Â ÷ $Е.÷ ¢üÂ÷ AЕ; ÷ ~ûà à‡Â ýð¥ ÿÿùÀ øAá ÷ &E‡Aá Â÷ HE‡Á ¦¶6D‡w „#D…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w T#DÅ… ƒ÷ &Е.À À À ce÷ Z#À …Е:÷ Å ù Â÷ ªúB‡w × ±&À, ‡7$ð؆ð$€‡æØ#Îeüÿžú#1ñ• Â÷ â†õ �55@÷ ( èÍ¥#@>ÈEüÌ5uuô¥  ‚ô‹À<÷ BøÌ5@[‚ŒW‡& AÉ¥Nfœvœ�Î & fæAëÂ5Àe&Ð5ð 4Q4 áea æ €Â5 ô‹Î÷ �#ˆÂ5 Ì5õ5ðUÂ00¤…–…‡…´cÚµcÛ¶c�·c›’÷ J†õ �õ°þu÷ lú÷ n5 wüÀ°þ†õ �5u‡Å@ôÿ`Bf´ÿÍ@þÎ¥Yôµ!Tõ5ÆÿÂ5W Î¥Â5È ÷ @A÷ „>‡÷ ;‡`Áe Î¥÷ 1‡÷ Â%‡÷ Î¥÷ ‡Î¥##Àeâ÷ D‡÷ ؇AôÿPPH 8÷ Î ‡÷ Ú÷ € †÷ ÈÍ ýÎ5@ôÿf÷ ª�>ôµ:ÍùÂ55ñ‹œ&H¬Jƒ1’B(ҔȊýñ ôµ1ñEñ c0 1 p ð ÷ ž` †Í%þÍlûñEwzôµ0Fñ5Ê%Š$Úœ&±�Blž,±Š¦÷ @‡Íèù݃ŽàÖ%úÿ  œ:æÍÔ ýƒÍEÍÒÍÜ͵L÷ `Ó´’œÿÿò’þÿò˜ýÿÓ•,÷ J÷ :؆±Šœ*l,ʘ÷ †`¬‡BpÂ58ñ5�Š°Î¥÷ T÷ b` †Í% ýëñ5Š1 Š1± ñ5BœBlâ¥>Ê¥]Ê¥:÷‚ ¦N챕÷ N†Ò•.±Š÷ L†œ&±�Blœ.0Ò”÷ l†ÈŠúÑ ÷ š`†ÍèùñE±w¬ýÃe÷ Ï Íw ìÄ@÷ Ä(÷ C ƒ áý† aà ÷  †ÃeÃ%/‡Ãe.Ò�±Šq¬‡æÓ¥0 ñŠæó”þÿ üƒ£¸Î ò€ ƒe‡�¦æ&fô,Ñ BÀ˜þ… *ƒÅ Í‹'Â% Í¥!‡Í¥EÀàúÂ%,‡À€ý… ƒÅ K‹Œ†‹ŒÀ5 ‚‡õ¥  õ¥PBÄ2Ì þÂ%pÀÐÿË‹ñó5Jó³ J€÷ Šúó J÷ …„ƒ‚�€‡@ºÿµ ºÿõÅüÿ´ÿEÍ¥ó‚A�î†A� êƒÁ IÁn÷ ªfüÿÁlf wŠs$æÎe$Á,fÀÅåL‡‡û "û . û Î ‡{"{^{`w wˆÅ‚€ÎdÂåøÿ‚Îb‡D ÷ z DÌÿ/ÍðøÄ5%“ÂÁ Í þÁ%‡Á%Ò Ò  S0¦ÓÔÓÔŠã8cPÁ ÝÍ@û�"‚s‹�ŠÍ°ü JÐD¸ÿÎ%bƒôµ Îp †ôµàÍÀÿ³Œw  ÷ †wÜ 5¸ÿÌ t�çÿBÄÿÎhõ¥´ÿ?Îlõ¥´ÿYÎjÂU@�ÉÿÍ0ûÀ5Â5 ÎÀ¥ ‡ ƒÍ þó ÍÀÿ³Œw Í@ûËúÍpúKÊÿËË5ðòË¥t�äÿ)ô•) Ðô‹Â5ÂUÍpýÂ5ÀÙͰùÂ5�Ô´�AÌÿÉ¥AùÁeuòÿ@ÎÿAÐÿÍÿÁ5ºÍÿÀ5µÌU4 HÁ÷ ¤ ª‡÷  &æfwD Å€5ôÿÁ1 Á ýÁeøÿ Œ!`ÈåBÚÿˆÂeò‹�`Àå@& �‚ ‡É ȨýA�´ÿÁe � G`õ5Æÿ >  ÷=8Á.E*4ó50 È�û[Èäùò èÿú�â5Ãe÷ BCÁȤýœGõ¥´ÿ õ5ÆÿÁèÿÈìùœëÿ8 ÷ ŠÖ ÷ ” wPõ5Æÿ3 3 3Š÷ VB�áÿAÞÿÈþÈ%&÷ ¸÷ FÖ È%÷ ¦÷ "@ DÜAD`†ÈÈûw¨U5÷ .ð‹wFBÃeð[ã ð‹÷ ¦V†ÓSY Pææ æ @ÂÊ¥_*& æŽa& Î’¦fŽà¦& ææÏ ÿˆ †ß¥�ÿ&ߥëÿ&wÒƒ�‚cÖ ÷ ôÎ ñ¥:ÿÿÑw,‚ –5ƒ�àÁåÁeõ†“”“” Á �Ë Ë Ë ¦”Îå0εøç‹ÕóË%âƒ÷ Ȱœ@Æåð  ‚Ò÷ ¤Ò•:ƒ÷ ‚Bó Â.‚ò5Æÿ ‚œ´ÿÂåÂe†wNó  w"ðµ1ú BÓ CÂ`÷ xË¥.Ó¥- ꇂf¦&Nàf& ææÏÿˆ‡‚HCB`×§&�ÿ×§&ëÿS¦æ?ÿˆÒ•[ƒÃe÷ òÒ•,ã ÷ èÒ•]ƒÓ ÷ ÄBœÿÿÂ¥]Â¥>Â傯 BÓ=CÂ`Á ޒΕ.÷ ÖË¥- N¨ Q¯Á N¨úòN¨È0þKQ¯‹£Î÷ ¤Ë¥.ƒ‹¬ÿÿ ÎD ‡wÑ•0Î øΤ ‘“à •Íåà÷ ÚÍ‹ È5°Œ‡D ä†Ñ•.÷ ¾B@Ââ³�B1È5 ÷ ôÁ÷ €ð‹ø•;÷ € Á(á F �õ¥´ÿBñU1 1 1 È5\ w>ÍùÈ58ùBÁe¢8bbbÂeðÿJbbõ¥#´ÿ3õ òÿAþÿAÍ€ý� ܃Á BÂåPÂ5ÿÔÍÐÿÑÉU uòÿÁeLEÀeÄwjûÍhûÿ üÿ¾‚†¼Í@þB`¸0¬ÿþÿ´ð üÿ Î%ôµ!ôÅðwhó Tw~w®ææ¦æÿˆ†Èðû×§&¦ÿÈü×§&¤ÿÈ@þwÖþÆå ‚¦¦æÿˆ“‹•Â.‚²“æÿ‚¸ÿ²•–5²ð’þÿðüÿ‡B�àÿüAÜÿÈ8ýÙ÷ –Ö‡B ñÈàø÷ þu¼ÿÍÏ Ï BÂEÿCÂ`æ÷ ´Îà �ã‡È ý»D û‚�cƒcÑ”Ž ý D ó†É”É¥a‚É¥z‡ÉÅ � Ö ÷ BÞ‡‡&Àe €#ýÖ ‡Ë”æ’ÎEøÿÎe0 Œ‹Œ‹Œ÷ êÿ’•‡fÂEÿæÈûB`F‡÷ ~Î÷ .Îà÷ ò†Ó¥:÷ æ †Ó¥:@!÷ $Áèà Π @! ŠU`eãÈUU5ÄU€÷ þm†É¥[É¥<"Î@ ÷  †ÑÄË¥.÷ „† £ ÷ z‡Î0þQ £ÎUD’ÄeĤá„÷ ¨Ä_÷ ÖÄUÄ‹È5ÈE Î÷ lÎàÈU0 ÈE÷ pU5Î Ä.÷ ˜ †È5ÈE0 ÄU÷ LÄ. ÷ x‡Ä; ÷ n †ÄŠÄ-÷ bÄU÷ "ˆÖ …‡& N  †Ó¥"úÎ ùà  ‡U5CàƒÕM%‘Å ÄÑÄE¸ÿÄ Ä Ä AÍ5QÁ`C÷ „Á‡Ä_C& æ÷ p2†ö &Ä‹¥&Π˥A‚Ë¥Z†Ë¥a‚Ë¥z†Î Ë¥*Ë¥%Π˥$Ë¥_ Π˥0 ‚Ë¥9 ‡Ë¥7†Î ÁŽUƒ ÉÖ „– ‡ƒ  †ð‹�Ë‹øË¥ õË¥ ò±‡ñÅ#  ñ‹ Ã.ÃÀ0 ¦µ1!È0úñµ ñÅ Â5ñµ Â5Â5 ÷ Ž÷ ˆe‡Î5&÷ €YÎ5ñµ T÷ ÆS‡PñŠ Kñµ ñ• ÷ ªE‡ñŠ >÷ ˆ÷ V Î5&@¡ñµ@ ÷ ®‡÷ ”€)ñµ %£ Âe ƒÁ Cò ñµ óµ ÂÃòñrÂã÷ 00¬…�…_ƒt÷tø tþfDATAÈ– &V ‡p öÿ0 öÿp øÿ0 øÿ‡£ òµ  ö5òµ€¡‡wr£   ð ð‹ ðµ@ ðÀ pppœ ðÅïÿ 0 0 0 ñÅ 1 1 1 ±‡¦v�e�óN³*•PU5DÕ Åe0Á  Ì üS÷ °ó  æÂå,‚¦ærwÜ Ž`‚ ‚ Âå4†@ØÿÍ€ý€ ƒÀ È%P÷ $÷ N‡05¸ÿÈEÿß6É5ÍÐÿQÍÀü„ MƒÄ Ì¥ IÌ5òÀ 5¸ÿAç‡@Ípü€ 8ƒÀ È¥ 4È5Ý ÷ ¶ÿÂ% ‚ÎDŽ`ÍPù�‡`_ ,/O&PXVUTSÁEöÿͰúÁEýÿuÊÿÎÿBÎÿ‚ ƒÈ5 =Í�ü/5 Ìÿõ Êÿ*Í@ùõ Èÿ%ÁEýÿ ÁEþÿ ÁE÷ÿõ ÎÿØ M�ÄÿÍŠ õ Ðÿ ô¥ ƒÍ`ü ÍŠ ÍÐúuºÿdÁEûÿÁEïÿÈ5 ÃÍpýÁ ñÈU Ì5@\ôµ .Î%Íàþôµ -ó /÷ ‚,‡3Äe"5Àÿ5¾ÿ5Âÿ0Î% @ÅåL÷ ü@÷ R÷ , Î%Pƒ�œ� � � ÁEùÿ�ewjñÍÀýuºÿæpõ¥1´ÿæ‚÷ ö÷ b5 ¸ÿ÷ êÌE÷ vñ# ÷ Ø÷ jñ£ Æ*‡�÷ ÆÀÐ P�œŠÐ P æÿˆ†Á—&æ1ÿˆÁ¥ÿÿõÍ€ùu÷ ŒA“ æ æ)ÿˆæ æÿˆófÅåLÀææ À.€åH@ñµ D, þ� ÷ 4÷ –ð�Ö ‡À.Ð æÈ  ý†€å‡&æf…Þ ƒ„…‡Ã.ÃÅD¸ÿÌ¥ ‡ w Èÿ÷ Øÿ„f÷ 2� ƒ& ÷ ¤‚‡2r€‡÷ †¦�‚÷ €‚À4 Á À8Á À<Á0w dÿ&Î�¦÷ lÿ „‚ ÷ &�•ƒap ‡…•aB#EÕ û� ÷ *‡�  Á ýÍ þu¼ÿ‡ÀDÌ5ÀeÀàÀ`w ðþÁeÁE<ó .¦f÷ pï�‚2  ,ú‡Â °,ôƒñÄ€pà l‡€ û‚ŒJ aƒ †¤´bõ„!ò‡±‡‡÷ Z�P PH Âæ úæ÷ 8�P PH ÂæùæfñÕ ÷ `ý�ñÅ È%€ù–5wÜ÷ Nƒ÷ þ—# úòµ5 È¥öÿð ÈÈ‹5œÈ‹1ñÐ ÃñÀ È1ñµ€ "òµ€Ã.×# úñÕ€ &&÷ rýpp  f÷ ºü�°ˆ¢åÿÈ`ú0 ¢öÿ ȰýÃñÀ òµ 0 ’ðˆòµ€ÌÖ ‚&f�÷ Ìü�€0 öÿ&V ‡ƒ&öÿ÷ ²ü÷ äüK&Àæ1ÿˆÀ û€‡f÷ &üŇ >Í%€ù8Í ýÁ¥æÿ5Í`ýÁ¥Çÿ0ÍùÁ¥ôÿ+ÍþÁ¥ýÿ&ÍðúÁ¥ðÿ!ÍüÁ¥ÞÿÍðüÁ¥èÿÍùÁ¥ßÿÍ úÁ¥àÿ ÍüÁ¥´ÿ͘ýÁ¥µÿ�u¼ÿ±– ‡Â Á0ý ÁÐý  ÁPúÂÁÀûð 0 &÷ üÂ%ˆ ° ôµ õ5ÆÿðU÷ ÿ€ð‡ÃeË GËÓ ôµ16Ãå Ëãz,œ*Á M�`÷ R†Ó4 Ê¥, ¦÷ ¨�‡,÷ œ†Í0þ<ðU:÷ .ÿ†Í% ýÍþ0Ãe  8`ÂeÊââòøÿ‡Ãe Í0ù8‚ œ6&Á $Ê¥- Ë Á% ò¥1Ê¥*Á ;Á%8‡Ë Ë Ë Ê¥72‡& Ž”Îå0‹cV +‡Á ñð Íý4œ2Á%‡÷ x†Í`ù0œ.ôµ ,ð5Ë%À¨îð5 Á Ê¥*±‡ð5‚ Á Ãå È ÷ ÆÃåúÿÈ÷ ºÁ êð0 ‡Â � # # # Á% 8‡w RúÅ‚ Á 1ÄÊ¥*„ Ê¥%„’Ä%Z$‡Äå@‚Äe.!‡Ä%'‡… †Ä Ä Ä &Ä Ä „eö a… ØÓ ÔA‚ �àÒ¥*ãÀ¨B ¤‡’4â•0Í J˜Ê¥*™Ê¥7–‡€ óÍ ’€Á¯Ë• Á Ê¥"‚ Á Ê¥a‚Ê¥z‡Ê‹”ƒ È ë‡ ð &^œ6±à BÜBdÃ; æÎEøÿÎe0 ƒ ƒ ÷ äÿƒ•Í`I¬†Ò�±Š ‡`Áe   8‡¦Ã.ÃñÅ 1 ÷ `Ì¥ ñµ@ $òµ€ ñÅ! 1 ñµ€ ñÅ€ f&&÷ ¼øÂ pp ÷ ø°ˆ�‚‡±‡÷ Ìø„ô‹€& & �æ÷ ‚Æå ‰&÷ rø°Â÷ ®ƒ‚††w–´ ô÷ Jø‚ƒ���æ–PÁUÁU€ð�°p�Ã. ‚]öÅ‚ò‹<ðÕæææ°ææææ¦ ¦¦ ÎÎÕòµΊ¶òµÎÅòµÎÕÎÅòµðUðE¦Â÷ ÊA Ã.Âò‹ ‚ƒ †¶ ö6Š † J‡6 6 öev 6œ6´m t  ‚Ý´`ôµð­0 †4"4 $ôe$t "4 &ôµ€‚æ&Îeæ÷ Øö°¦Â÷ †È0 Dw¦ö&D&ô•÷ öŒ†„æ�ýÁ%ðÿÎðúÁ%ßÿÎùÁ%èÿÎðü‚ˆp±‡„¡‡& æTIææÿˆÀ°Â>)ÃÄÎ*Åæ*5 õ¹( õfÿˆ÷‹ F�ôJ) ô@&ÿˆ÷‹ô;�ð�ð,ðJ)(õ 7 Nf&æ…÷ FÛÆe…ð &Â>)f&æ…÷ 0ÛÆe…ð  ÊœÒ ÒÁø(÷ Áö(÷ VÀ°· ðÝæ3ÿˆð%lûÒÜ  ÊœÒ ÊÁ)" ÊœÒ ÊÁþ( ÁÖ(÷ wêþÂ>)ÀJ)÷ šÝõJ) ufÿˆ‡SY: Enter a wildcard filespec: $SEARCH error -- STS=%P, STV=%P%N %VA%NNo files matching %VA%N%NTotal of %D files matching %VA%N00´…¶…‡…´cÚµcÛ¶c�·c›’ Ê* Ê* w  ÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w \  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡&æf…Þ ƒ„…‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡¦F X% Ä„ <,Ð,²´8Öþ*++ +°,88-++-++++++´,–,¿.¿.»» Sü'SYSYSYSYTICLSY~Ϛγ<<ðü'°~ÀZ².|t#t#t#t#œ.°.t#–¿.»€:%γϚ@Î@€Î³P¸)Î+€Î*€PpN+€Áe?ÁE? ‡& fŽ Ž Ž Ž Ž Ž æYÿˆ‡æwB æ w: æ w2 æ æ * æ + æ2æ3ÁEÿæ ÎE‚w 8)…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ 6)W ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡Â Âw Ð( ”Å¥ üÅ¥ ùÅå0B¡†€÷ Ä(Aa”ôœÿÿ‡w ž(Ä'Å  ÅUD$†BA÷ æ(&�Â(÷ ÅU� ÀBQ÷ ÿÂЕ* ü‡÷ &÷ &÷ �’•’•€‡@Á(÷ R(f€  Àe ÀeÉÿÀe Àe ‡&f¦÷ Èwìÿ‚�€‡÷ àÿ÷ àÿÁ ‡Â w,'&f¦÷ f'1†�Áe?� � � � � � w¬ÿw ¦ÿ‚Á ÿ& fæYÿˆ†w ’ÿƒÁŒÿô±€Á Á Á Á Á Á Ânÿw`jÿ÷ ‚ÿ‚�€½– –5‡°´.Aê?êÂÎÿÂeÂE ÷ týæÞÿˆ&Àþùææÿˆ· Òÿ‡ ÁmÈÿ ‡ž¦ ʺÿà�bŠå‚‡ABDEFIMNOPQRSTUXYZ<>ÉØâô=öMXd^Œ•öêžèò)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw z&&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ `ýÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚b‚ ‡AÂ Ê Ö ÊЕ%„Ì¥Vå ‡P”à ý‡Ð• B”f�‚÷ Œü�à õ‡& æÎenüB& ¦æÎeZü;& æÎeý6H”ÈÅ€¢ ¢È• € à ò‡÷ nŠ€‡Ð• à ü‡Ð‹à üÀ ‡Ð• Е à ú‡& æÎe ü & ¦æÎeöûЕ A‚¦Þ à ÷–%00¼…�…_ƒt÷tø tþfDATA‡& æÎeÊûóA÷ Øüà û‡Ð• à ü‡Ð• Aæ÷ ºüAÎ ûÖ Â ÷ $Е.÷ ¢üÂ÷ AЕ; ÷ ~ûà à‡Â ýð¥ ÿÿùÀ øAá ÷ &E‡Aá Â÷ HE‡Á ¦¶6D‡w �$D…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w `$DÅ… ƒ÷ &Е.À À À ce÷ f$À …Е:÷ Å ù Â÷ ªúB‡w × ±&À, ‡7(%ðP †ð%€‡æä$Îeüÿž%1ñ• Â÷ â†õ �55@÷ ( èÍ¥#@>ÈEüÌ5uuô¥  ‚ô‹À<÷ BøÌ5@[‚ŒW‡& AÉ¥Nfœvœ�Î & fæAëÂ5Àe&Ð5ð 4Q4 áea æ €Â5 ô‹Î÷ �#ˆÂ5 Ì5õ5ðUÂ÷ J†õ �õ°þu÷ lú÷ n5 wüÀ°þ†õ �5u‡Å@ôÿ`Bf´ÿÍ@þÎ¥Yôµ!Tõ5ÆÿÂ5W Î¥Â5È ÷ @A÷ „>‡÷ ;‡`Áe Î¥÷ 1‡÷ Â%‡÷ Î¥÷ ‡Î¥##Àeâ÷ D‡÷ ؇AôÿPPH 8÷ Î ‡÷ Ú÷ € †÷ ÈÍ ýÎ5@ôÿf÷ ª�>ôµ:ÍùÂ55ñ‹œ&H¬Jƒ1’B(ҔȊýñ ôµ1ñEñ c0 1 p ð ÷ ž` †Í%þÍlûñEwzôµ0Fñ5Ê%Š$Úœ&±�Blž,±Š¦÷ @‡Íèù݃ŽàÖ%úÿ  œ:æÍÔ ýƒÍEÍÒÍÜ͵L÷ `Ó´’œÿÿò’þÿò˜ýÿÓ•,÷ J÷ :؆±Šœ*l,ʘ÷ †`¬‡BpÂ58ñ5�Š°Î¥÷ T÷ b` †Í% ýëñ5Š1 Š1± ñ5BœBlâ¥>Ê¥]Ê¥:÷‚ ¦N챕÷ N†Ò•.±Š÷ L†œ&±�Blœ.0Ò”÷ l†ÈŠúÑ ÷ š`†ÍèùñE±w¬ýÃe÷ Ï Íw ìÄ@÷ Ä(÷ C ƒ áý† aà ÷  †ÃeÃ%/‡Ãe.Ò�±Šq¬‡æÓ¥0 ñŠæó”þÿ üƒ£¸Î ò€ ƒe‡�¦æ&fÃ8.Ñ BÀ˜þ… *ƒÅ Í‹'Â% Í¥!‡Í¥EÀàúÂ%,‡À€ý… ƒÅ K‹Œ†‹ŒÀ5 ‚‡õ¥  õ¥PBÄ2Ì þÂ%pÀÐÿË‹ñó5Jó³ J€÷ Šúó J÷ …„ƒ‚�€‡@ºÿµ ºÿõÅüÿ´ÿEÍ¥ó‚A�î†A� êƒÁ IÁn÷ ªfüÿÁlf wŠs$æÎe$Á,fÀÅåL‡‡û "û . û Î ‡{"{^{`w wˆÅ‚€ÎdÂåøÿ‚Îb‡D ÷ z DÌÿ/ÍðøÄ5%“ÂÁ Í þÁ%‡Á%Ò Ò  S0¦ÓÔÓÔŠã8cPÁ ÝÍ@û�"‚s‹�ŠÍ°ü JÐD¸ÿÎ%bƒôµ Îp †ôµàÍÀÿ³Œw  ÷ †wÜ 5¸ÿÌ t�çÿBÄÿÎhõ¥´ÿ?Îlõ¥´ÿYÎjÂU@�ÉÿÍ0ûÀ5Â5 ÎÀ¥ ‡ ƒÍ þó ÍÀÿ³Œw Í@ûËúÍpúKÊÿËË5ðòË¥t�äÿ)ô•) Ðô‹Â5ÂUÍpýÂ5ÀÙͰùÂ5�Ô´�AÌÿÉ¥AùÁeuòÿ@ÎÿAÐÿÍÿÁ5ºÍÿÀ5µÌU4 HÁ÷ ¤ ª‡÷  &æfwD Å€5ôÿÁ1 Á ýÁeøÿ Œ!`ÈåBÚÿˆÂeò‹�`Àå@& �‚ ‡É ȨýA�´ÿÁe � G`õ5Æÿ >  ÷=8Á.E*4ó50 È�û[Èäùò èÿú�â5Ãe÷ BCÁȤýœGõ¥´ÿ õ5ÆÿÁèÿÈìùœëÿ8 ÷ ŠÖ ÷ ” wPõ5Æÿ3 3 3Š÷ VB�áÿAÞÿÈþÈ%&÷ ¸÷ FÖ È%÷ ¦÷ "@ DÜAD`†ÈÈûw¨U5÷ .ð‹wFBÃeð[ã ð‹÷ ¦V†ÓSY Pææ æ @ÂÊ¥_*& æŽa& Î’¦fŽà¦& ææÏ ÿˆ †ß¥�ÿ&ߥëÿ&wÒƒ�‚cÖ ÷ ôÎ ñ¥:ÿÿÑw,‚ –5ƒ�àÁåÁeõ†“”“” Á �Ë Ë Ë ¦”Îå0εøç‹ÕóË%âƒ÷ Ȱœ@Æåð  ‚Ò÷ ¤Ò•:ƒ÷ ‚Bó Â.‚ò5Æÿ ‚œ´ÿÂåÂe†wNó  w"ðµ1ú BÓ CÂ`÷ xË¥.Ó¥- ꇂf¦&Nàf& ææÏÿˆ‡‚HCB`×§&�ÿ×§&ëÿS¦æ?ÿˆÒ•[ƒÃe÷ òÒ•,ã ÷ èÒ•]ƒÓ ÷ ÄBœÿÿÂ¥]Â¥>Â傯 BÓ=CÂ`Á ޒΕ.÷ ÖË¥- N¨ Q¯Á N¨úòN¨È0þKQ¯‹£Î÷ ¤Ë¥.ƒ‹¬ÿÿ ÎD ‡wÑ•0Î øΤ ‘“à •Íåà÷ ÚÍ‹ È5°Œ‡D ä†Ñ•.÷ ¾B@Ââ³�B1È5 ÷ ôÁ÷ €ð‹ø•;÷ € Á(á F �õ¥´ÿBñU1 1 1 È5\ w>ÍùÈ58ùBÁe¢8bbbÂeðÿJbbõ¥#´ÿ3õ òÿAþÿAÍ€ý� ܃Á BÂåPÂ5ÿÔÍÐÿÑÉU uòÿÁeLEÀeÄwjûÍhûÿ üÿ¾‚†¼Í@þB`¸0¬ÿþÿ´ð üÿ Î%ôµ!ôÅðwhó Tw~w®ææ¦æÿˆ†Èðû×§&¦ÿÈü×§&¤ÿÈ@þwÖþÆå ‚¦¦æÿˆ“‹•Â.‚²“æÿ‚¸ÿ²•–5²ð’þÿðüÿ‡B�àÿüAÜÿÈ8ýÙ÷ –Ö‡B ñÈàø÷ þu¼ÿÍÏ Ï BÂEÿCÂ`æ÷ ´Îà �ã‡È ý»D û‚�cƒcÑ”Ž ý D ó†É”É¥a‚É¥z‡ÉÅ � Ö ÷ BÞ‡‡&Àe €#ýÖ ‡Ë”æ’ÎEøÿÎe0 Œ‹Œ‹Œ÷ êÿ’•‡fÂEÿæÈûB`F‡÷ ~Î÷ .Îà÷ ò†Ó¥:÷ æ †Ó¥:@!÷ $Áèà Π @! ŠU`eãÈUU5ÄU€÷ þm†É¥[É¥<"Î@ ÷  †ÑÄË¥.÷ „† £ ÷ z‡Î0þQ £ÎUD’ÄeĤá„÷ ¨Ä_÷ ÖÄUÄ‹È5ÈE Î÷ lÎàÈU00Ä…¶…‡…´cÚµcÛ¶c�·c›’0 ÈE÷ pU5Î Ä.÷ ˜ †È5ÈE0 ÄU÷ LÄ. ÷ x‡Ä; ÷ n †ÄŠÄ-÷ bÄU÷ "ˆÖ …‡& N  †Ó¥"úÎ ùà  ‡U5CàƒÕM%‘Å ÄÑÄE¸ÿÄ Ä Ä AÍ5QÁ`C÷ „Á‡Ä_C& æ÷ p2†ö &Ä‹¥&Π˥A‚Ë¥Z†Ë¥a‚Ë¥z†Î Ë¥*Ë¥%Π˥$Ë¥_ Π˥0 ‚Ë¥9 ‡Ë¥7†Î ÁŽUƒ ÉÖ „– ‡ƒ  †ð‹�Ë‹øË¥ õË¥ ò±‡ñÅ#  ñ‹ Ã.ÃÀ0 ¦µ1!È0úñµ ñÅ Â5ñµ Â5Â5 ÷ Ž÷ ˆe‡Î5&÷ €YÎ5ñµ T÷ ÆS‡PñŠ Kñµ ñ• ÷ ªE‡ñŠ >÷ ˆ÷ V Î5&@¡ñµ@ ÷ ®‡÷ ”€)ñµ %£ Âe ƒÁ Cò ñµ óµ ÂÃòñrÂã÷ È– &V ‡p öÿ0 öÿp øÿ0 øÿ‡£ òµ  ö5òµ€¡‡wr£   ð ð‹ ðµ@ ðÀ pppœ ðÅïÿ 0 0 0 ñÅ 1 1 1 ±‡¦v�e�óN³*•PU5DÕ Åe0Á  Ì üS÷ °ó  æÂå,‚¦ærwÜ Ž`‚ ‚ Âå4†@ØÿÍ€ý€ ƒÀ È%P÷ $÷ N‡05¸ÿÈEÿß6É5ÍÐÿQÍÀü„ MƒÄ Ì¥ IÌ5òÀ 5¸ÿAç‡@Ípü€ 8ƒÀ È¥ 4È5Ý ÷ ¶ÿÂ% ‚ÎDŽ`ÍPù�‡`_ ,/O&PXVUTSÁEöÿͰúÁEýÿuÊÿÎÿBÎÿ‚ ƒÈ5 =Í�ü/5 Ìÿõ Êÿ*Í@ùõ Èÿ%ÁEýÿ ÁEþÿ ÁE÷ÿõ ÎÿØ M�ÄÿÍŠ õ Ðÿ ô¥ ƒÍ`ü ÍŠ ÍÐúuºÿdÁEûÿÁEïÿÈ5 ÃÍpýÁ ñÈU Ì5@\ôµ .Î%Íàþôµ -ó /÷ ‚,‡3Äe"5Àÿ5¾ÿ5Âÿ0Î% @ÅåL÷ ü@÷ R÷ , Î%Pƒ�œ� � � ÁEùÿ�ewjñÍÀýuºÿæpõ¥1´ÿæ‚÷ ö÷ b5 ¸ÿ÷ êÌE÷ vñ# ÷ Ø÷ jñ£ Æ*‡�÷ ÆÀÐ P�œŠÐ P æÿˆ†Á—&æ1ÿˆÁ¥ÿÿõÍ€ùu÷ ŒA“ æ æ)ÿˆæ æÿˆófÅåLÀææ À.€åH@ñµ D, þ� ÷ 4÷ –ð�Ö ‡À.Ð æÈ  ý†€å‡&æf…Þ ƒ„…‡Ã.ÃÅD¸ÿÌ¥ ‡ w Èÿ÷ Øÿ„f÷ 2� ƒ& ÷ ¤‚‡2r€‡÷ †¦�‚÷ €‚À4 Á À8Á À<Á0w dÿ&Î�¦÷ lÿ „‚ ÷ &�•ƒap ‡…•aB#EÕ û� ÷ *‡�  Á ýÍ þu¼ÿ‡ÀDÌ5ÀeÀàÀ`w ðþÁeÁE<ó .¦f÷ pï�‚2  ,ú‡Â °,ôƒñÄ€pà l‡€ û‚ŒJ aƒ †¤´bõ„!ò‡±‡‡÷ Z�P PH Âæ úæ÷ 8�P PH ÂæùæfñÕ ÷ `ý�ñÅ È%€ù–5wÜ÷ Nƒ÷ þ—# úòµ5 È¥öÿð ÈÈ‹5œÈ‹1ñÐ ÃñÀ È1ñµ€ "òµ€Ã.×# úñÕ€ &&÷ rýpp  f÷ ºü�°ˆ¢åÿÈ`ú0 ¢öÿ ȰýÃñÀ òµ 0 ’ðˆòµ€ÌÖ ‚&f�÷ Ìü�€0 öÿ&V ‡ƒ&öÿ÷ ²ü÷ äüK&Àæ1ÿˆÀ û€‡f÷ &üŇ >Í%€ù8Í ýÁ¥æÿ5Í`ýÁ¥Çÿ0ÍùÁ¥ôÿ+ÍþÁ¥ýÿ&ÍðúÁ¥ðÿ!ÍüÁ¥ÞÿÍðüÁ¥èÿÍùÁ¥ßÿÍ úÁ¥àÿ ÍüÁ¥´ÿ͘ýÁ¥µÿ�u¼ÿ±– ‡Â Á0ý ÁÐý  ÁPúÂÁÀûð 0 &÷ üÂ%ˆ ° ôµ õ5ÆÿðU÷ ÿ€ð‡ÃeË GËÓ ôµ16Ãå Ëãz,œ*Á M�`÷ R†Ó4 Ê¥, ¦÷ ¨�‡,÷ œ†Í0þ<ðU:÷ .ÿ†Í% ýÍþ0Ãe  8`ÂeÊââòøÿ‡Ãe Í0ù8‚ œ6&Á $Ê¥- Ë Á% ò¥1Ê¥*Á ;Á%8‡Ë Ë Ë Ê¥72‡& Ž”Îå0‹cV +‡Á ñð Íý4œ2Á%‡÷ x†Í`ù0œ.ôµ ,ð5Ë%À¨îð5 Á Ê¥*±‡ð5‚ Á Ãå È ÷ ÆÃåúÿÈ÷ ºÁ êð0 ‡Â � # # # Á% 8‡w RúÅ‚ Á 1ÄÊ¥*„ Ê¥%„’Ä%Z$‡Äå@‚Äe.!‡Ä%'‡… †Ä Ä Ä &Ä Ä „eö a… ØÓ ÔA‚ �àÒ¥*ãÀ¨B ¤‡’4â•0Í J˜Ê¥*™Ê¥7–‡€ óÍ ’€Á¯Ë• Á Ê¥"‚ Á Ê¥a‚Ê¥z‡Ê‹”ƒ È ë‡ ð &^œ6±à BÜBdÃ; æÎEøÿÎe0 ƒ ƒ ÷ äÿƒ•Í`I¬†Ò�±Š ‡`Áe   8‡¦Ã.ÃñÅ 1 ÷ `Ì¥ ñµ@ $òµ€ ñÅ! 1 ñµ€ ñÅ€ f&&÷ ¼øÂ pp ÷ ø°ˆ�‚‡±‡÷ Ìø„ô‹€& & �æ÷ ‚Æå ‰&÷ rø°Â÷ ®ƒ‚††w–´ ô÷ Jø‚ƒ���æ–PÁUÁU€ð�°p�Ã. ‚]öÅ‚ò‹<ðÕæææ°ææææ¦ ¦¦ ÎÎÕòµΊ¶òµÎÅòµÎÕÎÅòµðUðE¦Â÷ ÊA Ã.Âò‹ ‚ƒ †¶ ö6Š † J‡6 6 öev 6œ6´m t  ‚Ý´`ôµð­0 †4"4 $ôe$t "4 &ôµ€‚æ&Îeæ÷ Øö°¦Â÷ †È0 Dw¦ö&D&ô•÷ öŒ†„æ�ýÁ%ðÿÎðúÁ%ßÿÎùÁ%èÿÎðü‚ˆp±‡„¡‡& æ00Ì…Ð…_ƒt÷tø tþfDATATIææÿˆÀ°ÂN*ÄR,Åj,5 õ») õ fÿˆ÷‹B�ôZ* ô@&ÿˆ÷‹7�ð�-ðZ**f&æ…÷ LÛÆe…ð nÀ õÄ) õ fÿˆ÷‹Ä�ôš* ô@&ÿˆ÷‹® �ð�ª,ðš*(õ 7 ”æ3ÿˆÀ°Á ÂÃpðUf&æ…÷ ÞÚÆe…ð ;„1* „Ü1‘-ffæÿÿ¦&æ…÷ ¢ÚÆe …ð ÀN* ˆœÐ � ȜРÈÁí)÷ R· ¹ÂN* ÁÍ)÷ 8w–þð%lûðÀN*÷ Ö Á2* ˆœÐ �÷ wlþиÁ*ñÂN*ÀZ*÷ Ý÷Z*ÊwÈæj,ÿˆ‡SY: From: To: $RENAME error -- STS=%P, STV=%P File %VA renamed to %VA%NTotal of %D files matching %VA renamed%N%NNo files matching %VA%N N, N, w  ÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w \  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡&æf…Þ ƒ„…‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡¾ Ð%Š <ü À-T.* , °N‚,†,Š,Ž,4.°°œ.’,’,œ.’,’,’,’,’,’,8.–,?-?-µµ S„'SYSYSYSYTICLSY~Ϛγ<<ð„'°~ÀZ8-|4™4™4™4™.,B,4™(–?-µ€4¥ γϚ€Ô@€Î³P¶(T*€Ô)€Áe?ÁE? ‡& fŽ Ž Ž Ž Ž Ž æYÿˆ‡æw: æw2 æ æ * æ + æ2æ3ÁEÿæ ÎE‚w 6(…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ 4(W ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡Â Âw Î' ”Å¥ üÅ¥ ùÅå00Ô…¶…‡…´cÚµcÛ¶c�·c›’0B¡†€÷ Â'Aa”ôœÿÿ‡w œ'Ä'Å  ÅUD$†BA÷ ä'&�Â(÷ ÅU� ÀBQ÷ ÿÂЕ* ü‡÷ &÷ &÷ �’•’•€‡@Á(÷ P'f€  Àe ÀeÉÿÀe Àe ‡&f¦÷ Èwìÿ‚�€‡÷ àÿ÷ àÿÁ ‡Â w*&&f¦÷ d&1†�Áe?� � � � � � w¬ÿw ¦ÿ‚Á ÿ& fæYÿˆ†w ’ÿƒÁŒÿô±€Á Á Á Á Á Á Ânÿw`jÿ÷ ‚ÿ‚�€½– –5‡°8-Ar?rÂÎÿÂeÂE ÷ |ýæfÿˆ&Àvúænÿˆ· Òÿ‡ ÁmÈÿ ‡ž¦ ʺÿà�bŠå‚‡ABDEFIMNOPQRSTUXYZ<>ÉØâô=öMXd^Œ•öêžèò)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw x%&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ `ýÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚b‚ ‡AÂ Ê Ö ÊЕ%„Ì¥Vå ‡P”à ý‡Ð• B”f�‚÷ Œü�à õ‡& æÎenüB& ¦æÎeZü;& æÎeý6H”ÈÅ€¢ ¢È• € à ò‡÷ nŠ€‡Ð• à ü‡Ð‹à üÀ ‡Ð• Е à ú‡& æÎe ü & ¦æÎeöûЕ A‚¦Þ à ÷–%‡& æÎeÊûóA÷ Øüà û‡Ð• à ü‡Ð• Aæ÷ ºüAÎ ûÖ Â ÷ $Е.÷ ¢üÂ÷ AЕ; ÷ ~ûà à‡Â ýð¥ ÿÿùÀ øAá ÷ &E‡Aá Â÷ HE‡Á ¦¶6D‡w Ž#D…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w ^#DÅ… ƒ÷ &Е.À À À ce÷ d#À …Е:÷ Å ù Â÷ ªúB‡w × ±&À, ‡7&$ð؆ð$€‡æâ#Îeüÿž$1ñ• Â÷ â†õ �55@÷ ( èÍ¥#@>ÈEüÌ5uuô¥  ‚ô‹À<÷ BøÌ5@[‚ŒW‡& AÉ¥Nfœvœ�Î & fæAëÂ5Àe&Ð5ð 4Q4 áea æ €Â5 ô‹Î÷ �#ˆÂ5 Ì5õ5ðUÂ÷ J†õ �õ°þu÷ lú÷ n5 wüÀ°þ†õ �5u‡Å@ôÿ`Bf´ÿÍ@þÎ¥Yôµ!Tõ5ÆÿÂ5W Î¥Â5È ÷ @A÷ „>‡÷ ;‡`Áe Î¥÷ 1‡÷ Â%‡÷ Î¥÷ ‡Î¥##Àeâ÷ D‡÷ ؇AôÿPPH 8÷ Î ‡÷ Ú÷ € †÷ ÈÍ ýÎ5@ôÿf÷ ª�>ôµ:ÍùÂ55ñ‹œ&H¬Jƒ1’B(ҔȊýñ ôµ1ñEñ c0 1 p ð ÷ ž` †Í%þÍlûñEwzôµ0Fñ5Ê%Š$Úœ&±�Blž,±Š¦÷ @‡Íèù݃ŽàÖ%úÿ  œ:æÍÔ ýƒÍEÍÒÍÜ͵L÷ `Ó´’œÿÿò’þÿò˜ýÿÓ•,÷ J÷ :؆±Šœ*l,ʘ÷ †`¬‡BpÂ58ñ5�Š°Î¥÷ T÷ b` †Í% ýëñ5Š1 Š1± ñ5BœBlâ¥>Ê¥]Ê¥:÷‚ ¦N챕÷ N†Ò•.±Š÷ L†œ&±�Blœ.0Ò”÷ l†ÈŠúÑ ÷ š`†ÍèùñE±w¬ýÃe÷ Ï Íw ìÄ@÷ Ä(÷ C ƒ áý† aà ÷  †ÃeÃ%/‡Ãe.Ò�±Šq¬‡æÓ¥0 ñŠæó”þÿ üƒ£¸Î ò€ ƒe‡�¦æ&fþ,Ñ BÀ˜þ… *ƒÅ Í‹'Â% Í¥!‡Í¥EÀàúÂ%,‡À€ý… ƒÅ K‹Œ†‹ŒÀ5 ‚‡õ¥  õ¥PBÄ2Ì þÂ%pÀÐÿË‹ñó5Jó³ J€÷ Šúó J÷ …„ƒ‚�€‡@ºÿµ ºÿõÅüÿ´ÿEÍ¥ó‚A�î†A� êƒÁ IÁn÷ ªfüÿÁlf wŠs$æÎe$Á,fÀÅåL‡‡û "û . û Î ‡{"{^{`w wˆÅ‚€ÎdÂåøÿ‚Îb‡D ÷ z DÌÿ/ÍðøÄ5%“ÂÁ Í þÁ%‡Á%Ò Ò  S0¦ÓÔÓÔŠã8cPÁ ÝÍ@û�"‚s‹�ŠÍ°ü JÐD¸ÿÎ%bƒôµ Îp †ôµàÍÀÿ³Œw  ÷ †wÜ 5¸ÿÌ t�çÿBÄÿÎhõ¥´ÿ?Îlõ¥´ÿYÎjÂU@�ÉÿÍ0ûÀ5Â5 ÎÀ¥ ‡ ƒÍ þó ÍÀÿ³Œw Í@ûËúÍpúKÊÿËË5ðòË¥t�äÿ)ô•) Ðô‹Â5ÂUÍpýÂ5ÀÙͰùÂ5�Ô´�AÌÿÉ¥AùÁeuòÿ@ÎÿAÐÿÍÿÁ5ºÍÿÀ5µÌU4 HÁ÷ ¤ ª‡÷  &æfwD Å€5ôÿÁ1 Á ýÁeøÿ Œ!`ÈåBÚÿˆÂeò‹�`Àå@& �‚ ‡É ȨýA�´ÿÁe � G`õ5Æÿ >  ÷=8Á.E*4ó50 È�û[Èäùò èÿú�â5Ãe÷ BCÁȤýœGõ¥´ÿ õ5ÆÿÁèÿÈìùœëÿ8 ÷ ŠÖ ÷ ” wPõ5Æÿ3 3 3Š÷ VB�áÿAÞÿÈþÈ%&÷ ¸÷ FÖ È%÷ ¦÷ "@ DÜAD`†ÈÈûw¨U5÷ .ð‹wFBÃeð[ã ð‹÷ ¦V†ÓSY Pææ æ @ÂÊ¥_*& æŽa& Î’¦fŽà¦& ææÏ ÿˆ †ß¥�ÿ&ߥëÿ&wÒƒ�‚cÖ ÷ ôÎ ñ¥:ÿÿÑw,‚ –5ƒ�àÁåÁeõ†“”“” Á �Ë Ë Ë ¦”Îå0εøç‹ÕóË%âƒ÷ Ȱœ@Æåð  ‚Ò÷ ¤Ò•:ƒ÷ ‚Bó Â.‚ò5Æÿ ‚œ´ÿÂåÂe†wNó  w"ðµ1ú BÓ CÂ`÷ xË¥.Ó¥- ꇂf¦&Nàf& ææÏÿˆ‡‚HCB`×§&�ÿ×§&ëÿS¦æ?ÿˆÒ•[ƒÃe÷ òÒ•,ã ÷ èÒ•]ƒÓ ÷ ÄBœÿÿÂ¥]Â¥>Â傯 BÓ=CÂ`Á ޒΕ.÷ ÖË¥- N¨ Q¯Á N¨úòN¨È0þK00Ü…Ð…_ƒt÷tø tþfDATAQ¯‹£Î÷ ¤Ë¥.ƒ‹¬ÿÿ ÎD ‡wÑ•0Î øΤ ‘“à •Íåà÷ ÚÍ‹ È5°Œ‡D ä†Ñ•.÷ ¾B@Ââ³�B1È5 ÷ ôÁ÷ €ð‹ø•;÷ € Á(á F �õ¥´ÿBñU1 1 1 È5\ w>ÍùÈ58ùBÁe¢8bbbÂeðÿJbbõ¥#´ÿ3õ òÿAþÿAÍ€ý� ܃Á BÂåPÂ5ÿÔÍÐÿÑÉU uòÿÁeLEÀeÄwjûÍhûÿ üÿ¾‚†¼Í@þB`¸0¬ÿþÿ´ð üÿ Î%ôµ!ôÅðwhó Tw~w®ææ¦æÿˆ†Èðû×§&¦ÿÈü×§&¤ÿÈ@þwÖþÆå ‚¦¦æÿˆ“‹•Â.‚²“æÿ‚¸ÿ²•–5²ð’þÿðüÿ‡B�àÿüAÜÿÈ8ýÙ÷ –Ö‡B ñÈàø÷ þu¼ÿÍÏ Ï BÂEÿCÂ`æ÷ ´Îà �ã‡È ý»D û‚�cƒcÑ”Ž ý D ó†É”É¥a‚É¥z‡ÉÅ � Ö ÷ BÞ‡‡&Àe €#ýÖ ‡Ë”æ’ÎEøÿÎe0 Œ‹Œ‹Œ÷ êÿ’•‡fÂEÿæÈûB`F‡÷ ~Î÷ .Îà÷ ò†Ó¥:÷ æ †Ó¥:@!÷ $Áèà Π @! ŠU`eãÈUU5ÄU€÷ þm†É¥[É¥<"Î@ ÷  †ÑÄË¥.÷ „† £ ÷ z‡Î0þQ £ÎUD’ÄeĤá„÷ ¨Ä_÷ ÖÄUÄ‹È5ÈE Î÷ lÎàÈU0 ÈE÷ pU5Î Ä.÷ ˜ †È5ÈE0 ÄU÷ LÄ. ÷ x‡Ä; ÷ n †ÄŠÄ-÷ bÄU÷ "ˆÖ …‡& N  †Ó¥"úÎ ùà  ‡U5CàƒÕM%‘Å ÄÑÄE¸ÿÄ Ä Ä AÍ5QÁ`C÷ „Á‡Ä_C& æ÷ p2†ö &Ä‹¥&Π˥A‚Ë¥Z†Ë¥a‚Ë¥z†Î Ë¥*Ë¥%Π˥$Ë¥_ Π˥0 ‚Ë¥9 ‡Ë¥7†Î ÁŽUƒ ÉÖ „– ‡ƒ  †ð‹�Ë‹øË¥ õË¥ ò±‡ñÅ#  ñ‹ Ã.ÃÀ0 ¦µ1!È0úñµ ñÅ Â5ñµ Â5Â5 ÷ Ž÷ ˆe‡Î5&÷ €YÎ5ñµ T÷ ÆS‡PñŠ Kñµ ñ• ÷ ªE‡ñŠ >÷ ˆ÷ V Î5&@¡ñµ@ ÷ ®‡÷ ”€)ñµ %£ Âe ƒÁ Cò ñµ óµ ÂÃòñrÂã÷ È– &V ‡p öÿ0 öÿp øÿ0 øÿ‡£ òµ  ö5òµ€¡‡wr£   ð ð‹ ðµ@ ðÀ pppœ ðÅïÿ 0 0 0 ñÅ 1 1 1 ±‡¦v�e�óN³*•PU5DÕ Åe0Á  Ì üS÷ °ó  æÂå,‚¦ærwÜ Ž`‚ ‚ Âå4†@ØÿÍ€ý€ ƒÀ È%P÷ $÷ N‡05¸ÿÈEÿß6É5ÍÐÿQÍÀü„ MƒÄ Ì¥ IÌ5òÀ 5¸ÿAç‡@Ípü€ 8ƒÀ È¥ 4È5Ý ÷ ¶ÿÂ% ‚ÎDŽ`ÍPù�‡`_ ,/O&PXVUTSÁEöÿͰúÁEýÿuÊÿÎÿBÎÿ‚ ƒÈ5 =Í�ü/5 Ìÿõ Êÿ*Í@ùõ Èÿ%ÁEýÿ ÁEþÿ ÁE÷ÿõ ÎÿØ M�ÄÿÍŠ õ Ðÿ ô¥ ƒÍ`ü ÍŠ ÍÐúuºÿdÁEûÿÁEïÿÈ5 ÃÍpýÁ ñÈU Ì5@\ôµ .Î%Íàþôµ -ó /÷ ‚,‡3Äe"5Àÿ5¾ÿ5Âÿ0Î% @ÅåL÷ ü@÷ R÷ , Î%Pƒ�œ� � � ÁEùÿ�ewjñÍÀýuºÿæpõ¥1´ÿæ‚÷ ö÷ b5 ¸ÿ÷ êÌE÷ vñ# ÷ Ø÷ jñ£ Æ*‡�÷ ÆÀÐ P�œŠÐ P æÿˆ†Á—&æ1ÿˆÁ¥ÿÿõÍ€ùu÷ ŒA“ æ æ)ÿˆæ æÿˆófÅåLÀææ À.€åH@ñµ D, þ� ÷ 4÷ –ð�Ö ‡À.Ð æÈ  ý†€å‡&æf…Þ ƒ„…‡Ã.ÃÅD¸ÿÌ¥ ‡ w Èÿ÷ Øÿ„f÷ 2� ƒ& ÷ ¤‚‡2r€‡÷ †¦�‚÷ €‚À4 Á À8Á À<Á0w dÿ&Î�¦÷ lÿ „‚ ÷ &�•ƒap ‡…•aB#EÕ û� ÷ *‡�  Á ýÍ þu¼ÿ‡ÀDÌ5ÀeÀàÀ`w ðþÁeÁE<ó .¦f÷ pï�‚2  ,ú‡Â °,ôƒñÄ€pà l‡€ û‚ŒJ aƒ †¤´bõ„!ò‡±‡‡÷ Z�P PH Âæ úæ÷ 8�P PH ÂæùæfñÕ ÷ `ý�ñÅ È%€ù–5wÜ÷ Nƒ÷ þ—# úòµ5 È¥öÿð ÈÈ‹5œÈ‹1ñÐ ÃñÀ È1ñµ€ "òµ€Ã.×# úñÕ€ &&÷ rýpp  f÷ ºü�°ˆ¢åÿÈ`ú0 ¢öÿ ȰýÃñÀ òµ 0 ’ðˆòµ€ÌÖ ‚&f�÷ Ìü�€0 öÿ&V ‡ƒ&öÿ÷ ²ü÷ äüK&Àæ1ÿˆÀ û€‡f÷ &üŇ >Í%€ù8Í ýÁ¥æÿ5Í`ýÁ¥Çÿ0ÍùÁ¥ôÿ+ÍþÁ¥ýÿ&ÍðúÁ¥ðÿ!ÍüÁ¥ÞÿÍðüÁ¥èÿÍùÁ¥ßÿÍ úÁ¥àÿ ÍüÁ¥´ÿ͘ýÁ¥µÿ�u¼ÿ±– ‡Â Á0ý ÁÐý  ÁPúÂÁÀûð 0 &÷ üÂ%ˆ ° ôµ õ5ÆÿðU÷ ÿ€ð‡ÃeË GËÓ ôµ16Ãå Ëãz,œ*Á M�`÷ R†Ó4 Ê¥, ¦÷ ¨�‡,÷ œ†Í0þ<ðU:÷ .ÿ†Í% ýÍþ0Ãe  8`ÂeÊââòøÿ‡Ãe Í0ù8‚ œ6&Á $Ê¥- Ë Á% ò¥1Ê¥*Á ;Á%8‡Ë Ë Ë Ê¥72‡& Ž”Îå0‹cV +‡Á ñð Íý4œ2Á%‡÷ x†Í`ù0œ.ôµ ,ð5Ë%À¨îð5 Á Ê¥*±‡ð5‚ Á Ãå È ÷ ÆÃåúÿÈ÷ ºÁ êð0 ‡Â � # # # Á% 8‡w RúÅ‚ Á 1ÄÊ¥*„ Ê¥%„’Ä%Z$‡Äå@‚Äe.!‡Ä%'‡… †Ä Ä Ä &Ä Ä „e00ä…é…‡…´cÚµcÛ¶c�·c›’ö a… ØÓ ÔA‚ �àÒ¥*ãÀ¨B ¤‡’4â•0Í J˜Ê¥*™Ê¥7–‡€ óÍ ’€Á¯Ë• Á Ê¥"‚ Á Ê¥a‚Ê¥z‡Ê‹”ƒ È ë‡ ð &^œ6±à BÜBdÃ; æÎEøÿÎe0 ƒ ƒ ÷ äÿƒ•Í`I¬†Ò�±Š ‡`Áe   8‡¦Ã.ÃñÅ 1 ÷ `Ì¥ ñµ@ $òµ€ ñÅ! 1 ñµ€ ñÅ€ f&&÷ ¼øÂ pp ÷ ø°ˆ�‚‡±‡÷ Ìø„ô‹€& & �æ÷ ‚Æå ‰&÷ rø°Â÷ ®ƒ‚††w–´ ô÷ Jø‚ƒ���æ–PÁUÁU€ð�°p�Ã. ‚]öÅ‚ò‹<ðÕæææ°ææææ¦ ¦¦ ÎÎÕòµΊ¶òµÎÅòµÎÕÎÅòµðUðE¦Â÷ ÊA Ã.Âò‹ ‚ƒ †¶ ö6Š † J‡6 6 öev 6œ6´m t  ‚Ý´`ôµð­0 †4"4 $ôe$t "4 &ôµ€‚æ&Îeæ÷ Øö°¦Â÷ †È0 Dw¦ö&D&ô•÷ öŒ†„æ�ýÁ%ðÿÎðúÁ%ßÿÎùÁ%èÿÎðü‚ˆp±‡„¡‡& æTIææÿˆÀ°ÂH)ÃÄØ*Åð*5 õ¹( õfÿˆ÷‹F�ôT) ô@&ÿˆ÷‹þ;�ð�ú,ðT)(õ 7 Xf&æ…÷ NÛÆe…ð &ÂH)f&æ…÷ (ÛÆe…ð  ÊœÒ ÒÁî(÷ Áì(÷ VÀ°· úÝæ3ÿˆð%lûÒæ  ÊœÒ ÊÁ)" ÊœÒ ÊÁ) ÁÍ(÷ wêþÂH)ÀT)÷ šÝõT) ufÿˆ‡SY: File(s) to erase: $ERASE error -- STS=%P, STV=%P%N File %VA deleted%NNo files matching %VA%N%NTotal of %D files matching %VA deleted%N Ô* Ô* w  ÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w \  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡&æf…Þ ƒ„…‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡¦F X% Ä„ F,Ú,²´8Ö+ +++º,88"-++"-++++++¾,–,¿&¿&›› S‚ SYSYSYSYTICLSY~Ϛγ<<ð‚ °~ÀZ‚&|,˜,˜,˜,˜V,j,,˜ •¿&›€£ γϚ€Ô@€00ì…Ð…_ƒt÷tø tþfDATAγPž#€Áe?ÁE? ‡& fŽ Ž Ž Ž Ž Ž æYÿˆ‡æwôæ æ * æ + æ2æ3ÁEÿæ ÎE‚w ˆ!…�ŠÂ‚ †Á € Е-   ŠƒÐŠÂÕ0@A÷ †!W ƒÁe�`fÊ À  €Ã €ÂE÷ Ôÿ”•‡Â Âw ! ”Å¥ üÅ¥ ùÅå0B¡†€÷ !Aa”ôœÿÿ‡w î Ä'Å  ÅUD$†BA÷ 6!&�Â(÷ ÅU� ÀBQ÷ ÿÂЕ* ü‡÷ &÷ &÷ �’•’•€‡@Á(÷ ¢ f€  Àe ÀeÉÿÀe Àe ‡&f¦÷ Èwìÿ‚�€‡÷ àÿ÷ àÿÁ ‡Â w|&f¦÷ ¶1†�Áe?� � � � � � w¬ÿw ¦ÿ‚Á ÿ& fæYÿˆ†w ’ÿƒÁŒÿô±€Á Á Á Á Á Á Ânÿw`jÿ÷ ‚ÿ‚�€½– –5‡°„&Aj?jÂÎÿÂeÂE ÷ „ýæ^ÿˆ&À~úæfÿˆ· Òÿ‡ ÁmÈÿ ‡ž¦ ʺÿà�bŠå‚‡ABDEFIMNOPQRSTUXYZ<>ÉØâô=öMXd^Œ•öêžèò)JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw Ê&& D…•Â¥% “�ù„÷ ŠÀ�åB‡&Ð¥VA÷ `ýÀ ÀCƒ ÁÁedÿÂ!£ ü„  ÂaÂeNÿ‚b‚ ‡AÂ Ê Ö ÊЕ%„Ì¥Vå ‡P”à ý‡Ð• B”f�‚÷ Œü�à õ‡& æÎenüB& ¦æÎeZü;& æÎeý6H”ÈÅ€¢ ¢È• € à ò‡÷ nŠ€‡Ð• à ü‡Ð‹à üÀ ‡Ð• Е à ú‡& æÎe ü & ¦æÎeöûЕ A‚¦Þ à ÷–%‡& æÎeÊûóA÷ Øüà û‡Ð• à ü‡Ð• Aæ÷ ºüAÎ ûÖ Â ÷ $Е.÷ ¢üÂ÷ AЕ; ÷ ~ûà à‡Â ýð¥ ÿÿùÀ øAá ÷ &E‡Aá Â÷ HE‡Á ¦¶6D‡w àD…&&÷ bЕ-�Î �eÁaÁeÑýP”P”P”Е-�$w °DÅ… ƒ÷ &Е.À À À ce÷ ¶À …Е:÷ Å ù Â÷ ªúB‡wÌ× ±&À, ‡7xðІðl€‡æ4ÎeüÿžV1ñ• Â÷ ¤ †õ �55@÷ ê èÍ¥#@>ÈEüÌ5uuô¥  ‚ô‹À<÷ øÌ5@[‚ŒW‡& AÉ¥Nfœvœ�Î & fæAëÂ5Àe&Ð5ð 4Q4 áea æ €Â5 ô‹Î÷ Ö�#ˆÂ5 Ì5õ5ðUÂ÷ †õ �õ°þu÷ .ú÷ 05 w¾À°þ†õ �5u‡�¦æ&fÃ&Ñ BÀ˜þ… *ƒÅ Í‹'Â% Í¥!‡Í¥EÀàúÂ%,‡À€ý… ƒÅ K‹Œ†‹ŒÀ5 ‚‡õ¥  õ¥PBÄ2Ì þÂ%pÀÐÿË‹ñó5Jó³ J€÷ Èýó J÷ …„ƒ‚�€‡@ºÿµ ºÿõÅüÿ´ÿEÍ¥ó‚A�î†A� êƒÁ IÁn÷ ªfüÿÁlf wŠs$æÎe$Á,fÀÅåL‡‡û "û . û Î ‡{"{^{`w wˆÅ‚€ÎdÂåøÿ‚Îb‡D ÷ z DÌÿ/ÍðøÄ5%“ÂÁ Í þÁ%‡Á%Ò Ò  S0¦ÓÔÓÔŠã8cPÁ ÝÍ@û�"‚s‹�ŠÍ°ü JÐD¸ÿÎ%bƒôµ Îp †ôµàÍÀÿ³Œw  ÷ †wÜ 5¸ÿÌ t�çÿBÄÿÎhõ¥´ÿ?Îlõ¥´ÿYÎjÂU@�ÉÿÍ0ûÀ5Â5 ÎÀ¥ ‡ ƒÍ þó ÍÀÿ³Œw Í@ûËúÍpúKÊÿËË5ðòË¥t�äÿ)ô•) Ðô‹Â5ÂUÍpýÂ5ÀÙͰùÂ5�Ô´�AÌÿÉ¥AùÁeuòÿ@ÎÿAÐÿÍÿÁ5ºÍÿÀ5µÌU4 HÁ÷ ¤ ª‡÷  &æfwD Å€5ôÿÁ1 Á ýÁeøÿ Œ!`ÈåBÚÿˆÂeò‹�`Àå@& �‚ ‡É ȨýA�´ÿÁe � G`õ5Æÿ >  ÷=8Á.E*4ó50 È�û[Èäùò èÿú�â5Ãe÷ BCÁȤýœGõ¥´ÿ õ5ÆÿÁèÿÈìùœëÿ8 ÷ ŠÖ ÷ ” wPõ5Æÿ3 3 3Š÷ VB�áÿAÞÿÈþÈ%&÷ ¸÷ FÖ È%÷ ¦÷ "@ DÜAD`†ÈÈûw¨U5÷ .ð‹wFBÃeð[ã ð‹÷ ¦V†ÓSY Pææ æ @ÂÊ¥_*& æŽa& Î’¦fŽà¦& ææÏ ÿˆ †ß¥�ÿ&ߥëÿ&wÒƒ�‚cÖ ÷ ôÎ ñ¥:ÿÿÑw,‚ –5ƒ�àÁåÁeõ†“”“” Á �Ë Ë Ë ¦”Îå0εøç‹ÕóË%âƒ÷ Ȱœ@Æåð  ‚Ò÷ ¤Ò•:ƒ÷ ‚Bó Â.‚ò5Æÿ ‚œ´ÿÂåÂe†wNó  w"ðµ1ú BÓ CÂ`÷ xË¥.Ó¥- ꇂf¦&Nàf& ææÏÿˆ‡‚HCB`×§&�ÿ×§&ëÿS¦æ?ÿˆÒ•[ƒÃe÷ òÒ•,ã ÷ èÒ•]ƒÓ ÷ ÄBœÿÿÂ¥]Â¥>Â傯 BÓ=CÂ`Á ޒΕ.÷ ÖË¥- N¨ Q¯Á N¨úòN¨È0þKQ¯‹£Î÷ ¤Ë¥.ƒ‹¬ÿÿ ÎD ‡wÑ•0Î øΤ ‘“à •Íåà÷ ÚÍ‹ È5°Œ‡D ä†Ñ•.÷ ¾B@Ââ³�B1È5 ÷ ôÁ÷ €ð‹ø•;÷ € Á(á F �õ¥´ÿBñU1 1 1 È5\ w>ÍùÈ58ùBÁe¢8bbbÂeðÿJbbõ¥#´ÿ3õ òÿAþÿAÍ€ý� ܃Á BÂåPÂ5ÿÔÍÐÿÑÉU uòÿÁeLEÀeÄwjûÍhû00ô…é…‡…´cÚµcÛ¶c�·c›’ÿ üÿ¾‚†¼Í@þB`¸0¬ÿþÿ´ð üÿ Î%ôµ!ôÅðwhó Tw~w®ææ¦æÿˆ†Èðû×§&¦ÿÈü×§&¤ÿÈ@þwÖþÆå ‚¦¦æÿˆ“‹•Â.‚²“æÿ‚¸ÿ²•–5²ð’þÿðüÿ‡B�àÿüAÜÿÈ8ýÙ÷ –Ö‡B ñÈàø÷ þu¼ÿÍÏ Ï BÂEÿCÂ`æ÷ ´Îà �ã‡È ý»D û‚�cƒcÑ”Ž ý D ó†É”É¥a‚É¥z‡ÉÅ � Ö ÷ BÞ‡‡&Àe €#ýÖ ‡Ë”æ’ÎEøÿÎe0 Œ‹Œ‹Œ÷ êÿ’•‡fÂEÿæÈûB`F‡÷ ~Î÷ .Îà÷ ò†Ó¥:÷ æ †Ó¥:@!÷ $Áèà Π @! ŠU`eãÈUU5ÄU€÷ þm†É¥[É¥<"Î@ ÷  †ÑÄË¥.÷ „† £ ÷ z‡Î0þQ £ÎUD’ÄeĤá„÷ ¨Ä_÷ ÖÄUÄ‹È5ÈE Î÷ lÎàÈU0 ÈE÷ pU5Î Ä.÷ ˜ †È5ÈE0 ÄU÷ LÄ. ÷ x‡Ä; ÷ n †ÄŠÄ-÷ bÄU÷ "ˆÖ …‡& N  †Ó¥"úÎ ùà  ‡U5CàƒÕM%‘Å ÄÑÄE¸ÿÄ Ä Ä AÍ5QÁ`C÷ „Á‡Ä_C& æ÷ p2†ö &Ä‹¥&Π˥A‚Ë¥Z†Ë¥a‚Ë¥z†Î Ë¥*Ë¥%Π˥$Ë¥_ Π˥0 ‚Ë¥9 ‡Ë¥7†Î ÁŽUƒ ÉÖ „– ‡ƒ  †ð‹�Ë‹øË¥ õË¥ ò±‡ñÅ#  ñ‹ Ã.ÃÀ0 ¦µ1!È0úñµ ñÅ Â5ñµ Â5Â5 ÷ Ž÷ ˆe‡Î5&÷ €YÎ5ñµ T÷ ÆS‡PñŠ Kñµ ñ• ÷ ªE‡ñŠ >÷ ˆ÷ šÎ5&@¡ñµ@ ÷ ®‡÷ ”€)ñµ %£ Âe ƒÁ Cò ñµ óµ ÂÃòñrÂã÷ È– &V ‡p öÿ0 öÿp øÿ0 øÿ‡£ òµ  ö5òµ€¡‡wr£   ð ð‹ ðµ@ ðÀ pppœ ðÅïÿ 0 0 0 ñÅ 1 1 1 ±‡¦v�e�óN³*•PU5DÕ Åe0Á  Ì üS÷ °ó  æÂå,‚¦ærwÜ Ž`‚ ‚ Âå4†@ØÿÍ€ý€ ƒÀ È%P÷ $÷ N‡05¸ÿÈEÿß6É5ÍÐÿQÍÀü„ MƒÄ Ì¥ IÌ5òÀ 5¸ÿAç‡@Ípü€ 8ƒÀ È¥ 4È5Ý ÷ ¶ÿÂ% ‚ÎDŽ`ÍPù�‡`_ ,/O&PXVUTSÁEöÿͰúÁEýÿuÊÿÎÿBÎÿ‚ ƒÈ5 =Í�ü/5 Ìÿõ Êÿ*Í@ùõ Èÿ%ÁEýÿ ÁEþÿ ÁE÷ÿõ ÎÿØ M�ÄÿÍŠ õ Ðÿ ô¥ ƒÍ`ü ÍŠ ÍÐúuºÿdÁEûÿÁEïÿÈ5 ÃÍpýÁ ñÈU Ì5@\ôµ .Î%Íàþôµ -ó /÷ ‚,‡3Äe"5Àÿ5¾ÿ5Âÿ0Î% @ÅåL÷ @@÷ R÷ , Î%Pƒ�œ� � � ÁEùÿ�ewjñÍÀýuºÿæpõ¥1´ÿæ‚÷ ö÷ b5 ¸ÿ÷ êÌE÷ vñ# ÷ Ø÷ jñ£ Æ*‡�÷ ÆÀÐ P�œŠÐ P æÿˆ†Á—&æ1ÿˆÁ¥ÿÿõÍ€ùu÷ ŒA“ æ æ)ÿˆæ æÿˆófÅåLÀææ À.€åH@ñµ D, þ� ÷ 4÷ –ð�Ö ‡À.Ð æÈ  ý†€å‡&æf…Þ ƒ„…‡Ã.ÃÅD¸ÿÌ¥ ‡ w Èÿ÷ Øÿ„f÷ 2� ƒ& ÷ ¤‚‡2r€‡÷ †¦�‚÷ €‚À4 Á À8Á À<Á0w dÿ&Î�¦÷ lÿ „‚ ÷ &�•ƒap ‡…•aB#EÕ û� ÷ *‡�  Á ýÍ þu¼ÿ‡ÀDÌ5ÀeÀàÀ`w ðþÁeÁE<ó .¦f÷ pï�‚2  ,ú‡Â °,ôƒñÄ€pà l‡€ û‚ŒJ aƒ †¤´bõ„!ò‡±‡‡÷ Z�P PH Âæ úæ÷ 8�P PH ÂæùæfñÕ ÷ `ý�ñÅ È%€ù–5wÜ÷ ’ƒ÷ þ—# úòµ5 È¥öÿð ÈÈ‹5œÈ‹1ñÐ ÃñÀ È1ñµ€ "òµ€Ã.×# úñÕ€ &&÷ rýpp  f÷ ºü�°ˆ¢åÿÈ`ú0 ¢öÿ ȰýÃñÀ òµ 0 ’ðˆòµ€ÌÖ ‚&f�÷ Ìü�€0 öÿ&V ‡ƒ&öÿ÷ ²ü÷ äüK&Àæ1ÿˆÀ û€‡¦Ã.ÃñÅ 1 ÷ `Ì¥ ñµ@ $òµ€ ñÅ! 1 ñµ€ ñÅ€ f&&÷ xü pp ÷ Âû°ˆ�‚‡±‡÷ ˆü„ô‹€& & �æ÷ ‚Æå ‰&÷ .ü°Â÷ ®ƒ‚††w–´ ô÷ ü‚ƒ���æ–PÁUÁU€ð�°p�Ã. ‚]öÅ‚ò‹<ðÕæææ°ææææ¦ ¦¦ ÎÎÕòµΊ¶òµÎÅòµÎÕÎÅòµðUðE¦Â÷ ÊA Ã.Âò‹ ‚ƒ †¶ ö6Š † J‡6 6 öev 6œ6´m t  ‚Ý´`ôµð­0 †4"4 $ôe$t "4 &ôµ€‚æ&Îeæ÷ ”ú°¦Â÷ †È0 Dwbú&D&ô•÷ ÀùŒ†„æ�ýÁ%ðÿÎðúÁ%ßÿÎùÁ%èÿÎðü‚ˆp±‡„¡‡& æTIææÿˆÀ°Â #ÃÄ"$Å:$5 õ" õ!fÿˆ÷‹`L�ô*# ô@&ÿˆ÷‹JA�ð�F-ð*#*õ'" õ!fÿˆ÷‹(0�ôj# ô@&ÿˆ÷‹%�ð�,ðj#(õ f&æ…÷ âÆe…ð  ÊœÒ ÒÊÁg"÷ ˜÷ •æ3ÿˆ ÁH"÷ |‰Â #ÀÀ5ÒÏ"À5Òç"À5Ò·"À5@Ò¿"À5 Òï"À5Ò÷"À5Òÿ"À5ÒÇ"À5Ò×"À5Òß"Ê#Á©"÷ ‡Â #À*#÷ Bäõ*# u00ü…ÿ…_ƒt÷tø tþfDATAfÿˆ‡ Enter the default name string: Enter the primary name string: $PARSE error -- STS=%P, STV=%P$PARSE expanded string is %VA%N File name bits (FNB) are %P (DEV%I, NOD%I, DIR%I, NAM%I, QUO%I, TYP%I, VER%I, WDI%I, WNA%I, WTY%I, WVE%I) $ $ w  ÁeÁEƒ ‡ÀúÊ„D`Ä ÊÁbˆl„ ˆlr‡w \  B€ ÁeÁE"s  ‚ �Å s-ƒÅÀî �Å CsàÃlÈÀ¡±‡&æf…Þ ƒ„…‡&æ  †€mÎ ù æf À A N ‡�〠ö ÷–%‡&  Î  †Á`@ €`à B öÖ ‡æÃ &  A @  ‡€ã‚ à ÷Ö ƒ‡` V ~ > �%$&ª¬ò ÎR$V$Z$^$&ò ò l&b$b$l&b$b$b$b$b$b$&; ; EXEC MACROS;;;T/; ASSUME MACRO FOR CHECKING SYMBOL DEPENDENCIESL;D  .MACRO ASSUME A,B=0..IIF NE - .ERROR ;EXPRESSIONS NOT EQUAL .ENDM ;O; CALL SUBROUTINEB;9 .MACRO CALL SUBR ARGC .IF IDN <$INTSV>, JSR R5,$INTSV .WORD ^C&PR7 .IFF .IF IDN <$SAVNR>, JSR R5,$SAVNR .IFFe .IF IDN <$SWSTK>, EMT 376 .WORD ARG .IFFS JSR PC,SUBR .ENDC .ENDC .ENDC .ENDM;!; CALL AND RETURN FROM SUBROUTINE:; .MACRO CALLR SUBR JMP SUBRC .ENDM;; CRASH SYSTEM;F .MACRO CRASHL IOT .ENDM; ; SUPERVISOR MODE SUPPORT MACROS;- .MACRO MFPD$ XE .IF DF S$$LIB!U$$DASM MFPD X .IFFS MFPI XB .ENDC .ENDM .MACRO MTPD$ XF .IF DF S$$LIB!U$$DASJ MTPD XT .IFFO MTPI X> .ENDC .ENDM;N*; DIRECTIVE REGISTER SAVE AND SET PRIORITY;I .MACRO DIRSV$ JSR R5,$DIRSV .ENDM;S; SET DIRECTIVE STATUS;N .MACRO DRSTS VALUE TRAP VALUER .ENDM;B;; INTERRUPT SAVE GENERATION MACRO FOR ERROR LOGGING DEVICES;R ) .MACRO INTSE$ DEV,PRI,NCTRLR,PSWSV,UCBSV $'DEV'INT::V .IF NDF LD$'DEV JSR R5,$INTSE .WORD ^C&PR7 .ENDC GTUCB$ UCBSV,NCTRLR,DEV+ MOV U.SCB(R5),R4 ;;;GET OWNERS SCB ADDRESSF .IF DF VC$'DEV'4 BIC #S2.ACT,S.VST2(R4) ;;;INDICATE I/O IS FINISHED RST21=.-2V* MOV S.VKRB(R4),R4 ;;;RETRIEVE KRB ADDRESS RKRB1=.-2J .IFFD3 BIC #S2.ACT,S.ST2(R4) ;;;INDICATE I/O IS FINISHEDA) MOV S.KRB(R4),R4 ;;;RETRIEVE KRB ADDRESSB .ENDC/ MOVB K.CON(R4),R4 ;;;RETRIEVE CONTROLLER INDEXI .ENDM ;A9; INTERRUPT SAVE GENERATION FOR NON-ERROR LOGGING DEVICESN;L) .MACRO INTSV$ DEV,PRI,NCTRLR,PSWSV,UCBSV. .IF NDF LD$'DEV JSR R5,$INTSV .WORD ^C&PR7 .ENDC GTUCB$ UCBSV,NCTRLR,DEV .ENDM;25; GENERATE CODE TO LOAD UCB ADDRESS INTO R5 -- CALLED-0; ONLY BY INTSE$, INTSV$, AND TTSET$ (IN TTDRV).;B .MACRO GTUCB$ UCBSV,NCTRLR,DEVR .IF NB / .IF GT NCTRLR-1 MOV UCBSV(R4),R5R .IFF MOV UCBSV,R5. .ENDC .IFFO .IF DF LD$'DEVE3 MOV 'DEV'CTB,R5 ;;;GET ADDRESS OF KRB TABLE IN CTBA# ADD R4,R5 ;;;ADD CONTROLLER INDEXE) MOV (R5),R5 ;;;GET KRB ADDRESS FROM CTB, .IFFC1 MOV $'DEV'CTB(R4),R5 ;;;GET KRB ADDRESS FROM CTBR .ENDC0 MOV K.OWN(R5),R5 ;;;RETRIEVE OWNERS UCB ADDRESS .ENDC .ENDM L  ;R5; GET I/O PACKET MACRO -- AUTOMATE UNIT DETERMINATIONT;$ N( .MACRO GTPKT$ DEV,NCTRLR,ADDR,UCBSV,SUC .IF DF VC$'DEV' CALL @GTPKT .IFFR CALL $GTPKT .ENDC .IF B U BCC 65535$N RETURNO65535$:  .00†é…‡…´cÚµcÛ¶c�·c›’IFFE BCS ADDR' .ENDC .IF B  $$$=0 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN ,
$$$=1 .IF B .IF EQ $$$/ MOV R5,S.OWN(R4)U .ENDC .ENDC .IFFO .IF GT NCTRLR-1 MOV R5,UCBSV(R3), .IFFB MOV R5,UCBSV  .ENDC .ENDC .ENDM F  L;G+; GENERATE THE DEVICE DISPATCH TABLE -- DDTR;R 1 .MACRO DDT$ DEV,NCTRLR,INY,INX,UCBSV,NEW,BUF,OPT> .IF NB  .WORD 'DEV'CHK$ .ENDC .IF NB > .WORD 'DEV'DEA  .IFFD .IF NB , .WORD 1 ;ENTRY SHOULD NOT BE USED - CRASH .ENDC .ENDC .ENABL LSB1 .IF B $'DEV'TBL::.WORD DEV'INI .IFFD$'DEV'TBL::.WORD DEV'INX .ENDC .WORD DEV'CAN .WORD DEV'OUT .IF B .WORD 65533$R .WORD 0 .WORD 65531$. .IFFM .WORD DEV'PWF .WORD DEV'KRB .WORD DEV'UCB .ENDC .IF DIF ,P .ASCII /DEV/D .IF B  .WORD $'DEV'INT .IFF, .IRP X,U .WORD $'DEV''XO .ENDM .ENDC .WORD 0 .IF DF LD$'DEVF'DEV'CTB: .WORD 0  .IFFD $$$=0 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IIF IDN , $$$=1 .IF EQ $$$N'DEV'CTB: .WORD $'DEV'CTBE .IFFO'DEV'CTB: .WORD $RHCTB .ENDC .ENDC .ENDC .IF DF LD$'DEVO$'DEV'TBE::.WORD 0 .ENDC .IF NB <UCBSV: .BLKW NCTRLR  .ENDC .IF B 65531$: BITB #UC.PWF,U.CTL(R5) BEQ 65532$O65533$: BCS 65532$ JMP DEV'PWF65532$: RETURN .ENDC .DSABL LSBR .ENDM;$; PROCESSOR STATUS READ/WRITE1;. .MACRO MFPS DST MOVB @#PS,DST .ENDM .MACRO MTPS SRC .IF IDN <#0>,. CLRB @#PS .IFF$ MOVB SRC,@#PS .ENDC .ENDM . E;$'; MULTIPROCESSOR LOCK AND UNLOCK MACROSD;C  R# .MACRO LOCK$ ADDR,TYPE,?LAB1,?LAB2F$$$=0' .IF IDN ,$$$=1C .IF DF M$$PRO MOV #'ADDR,-(SP)T CALL $MLOCK .ENDC .ENDC $ .IF IDN ,$$$=16 .IF DF M$$PROLAB1: ASRB ADDRD BCC LAB13 CACHE$ BYPASS .IF DF L$$DBG .NTYPE TMP,ADDR .IF EQ TMP-67 TSTB ADDR+1 .IFF .IF EQ TMP&70-10M TSTB 1'ADDR .IFF .IF EQ TMP&70-60. TSTB 1+ADDR .IFFC1 .ERROR ;INCORRECT ADDRESSING MODE FOR LOCK BLOCK. .ENDC .ENDC .ENDC BMI LAB2  CRASHLAB2: .IF EQ TMP-67 MOVB $PROCN,ADDR+1L .IFFB .IF EQ TMP&70-10N MOVB $PROCN,1'ADDRC .IFFD .IF EQ TMP&70-60D MOVB $PROCN,1+ADDRK .IFFC+ .ERROR ;INCORRECT ADDRESSING MODE IN LOCK$ .ENDC .ENDC .ENDC .ENDC .ENDC .ENDC4 .IIF EQ $$$ .ERROR ;NOT SPIN OR WAIT IN LOCK$ MACRO .ENDM T  .MACRO ULOCK$ ADDR,TYPE,?LAB1 .IF DF M$$PRO .IF IDN , MOV #'ADDR,-(SP) CALL $MULCK .ENDC .IF IDN , .IF DF L$$DBG .NTYPE TMP,ADDR .IF EQ TMP-67 CMPB $PROCN,ADDR+1E .IFF7 .IF EQ TMP&70-10+ CMPB $PROCN,1'ADDRM .IFFN .IF EQ TMP&70-60D CMPB $PROCN,1+ADDRM .IFFD, .ERROR ;INCORRECT ADDRESSING MODE IN ULOCK$ .ENDC .ENDC .ENDC BEQ LAB CRASHLAB: .IF EQ TMP-67 COMB ADDR+1 .IFF  .IF EQ TMP&70-10S COMB 1'ADDR .IFFM .IF EQ TMP&70-60 COMB 1+ADDR .IFF,, .ERROR ;INCORRECT ADDRESSING MODE IN ULOCK$ .ENDC .ENDC .ENDC .ENDC CACHE$ RESTOR MOVB #1,ADDR, .ENDC .ENDC .ENDM T  .MACRO LCKDF$ TYPE- .IF IDN , .BYTE 1 .BYTE -1& .ENDC .IF IDN , .BYTE 1 .BYTE -16 .BYTE 1 .BYTE -1D .WORD 0 .ENDC .ENDM T D%LK.SPN=2 ;LENGTH OF SPIN LOCK BLOCK&LK.WAT=10 ;LENGTH OF WAIT LOCK BLOCK - ; !; DEFINITIONS FOR CACHE OPERATION;M ' .IF DF P$$D70 & M$$PRO& 6$FLUSH=1*400 ;CACHE FLUSH OPERATION&BYPASS=2*400 ;CACHE BYPASS OPERATION . .ENDC C . C;C; MACRO FOR CACHE OPERATION;N  .MACRO CACHE$ ARG,ARG2. .IF DF P$$D70 & M$$PROI < .IF IDN ,. BIC #BYPASS,@$MPCSR+6 .ENDC W .IF IDN ,6 BIS #BYPASS,@$MPCSR+6 .ENDC . .IF IDN , BIS #FLUS00 †††t÷tø tþfDATAH,@$MPCSR+6N .ENDC  .IF IDN ,F MOV @$MPCSR+6,-(SP) BIC #^C,(SP)  .IF DIF , BIC (SP),@$MPCSR+6M .IFF BIS #BYPASS,@$MPCSR+6 .ENDC .ENDC Y .IF IDN ,S BIC #BYPASS,@$MPCSR+6 BIS (SP)+,@$MPCSR+6 .ENDC  .ENDC .ENDM  A;A; SAVE NONVOLATILE REGISTERS;M .MACRO SAVNRI JSR R5,$SAVNR .ENDM;A; STATE SWITCHING MACRO;F .MACRO SWSTK$ ARG CALL $SWSTK,ARG .ENDM;'; TALLY A FIELD IN SYSTEM ACCOUNT BLOCK$;S .MACRO TALLY$ OFF,CND,PROCR .IF DF X$$ACC&A$$CNT&CNDS MOV R0,-(SP)S MOV #140002+OFF,R0R .IF IDN ,, CALL $ACINP .IFF ; IDN , CALL $ACINC .ENDC ; IDN ,N .ENDC ; DF X$$ACC&A$$CNT&CNDB .ENDM;R5; CPR SEND MACRO -- SEND A PACKET TO CPRAME OR CPRSYSN;A$ .MACRO CPSEN$ OPCODE,BUF,LEN,SHRBAS .MCALL MOV$ MOV$ SHRBAS MOV$ LENT MOV$ BUF MOV$ OPCODE .IF DF VC$CPR S CALL @CPSEN .IFF CALL $CPSEN .ENDC ;VC$CPR .ENDM .IIF NDF S$$YDF , .LISTCR .IF DF X$$ACC&A$$CNT&CNDS MOV R0,-(SP)S MOV #140002+OFF,R0R .IF IDN ,, CALL $ACINP .IFF ; IDN , CALL $ACINC .ENDC ; IDN ,N .ENDC ; DF X$$ACC&A$$CNT&CNDB .ENDM;R5; CPR SEND MACRO -- SEND A PACKET TO CPRAME OR CPRSYSN;A$ .MACRO CPSEN$ OPCODE,BUF,LEN,SHRBAS .MCALL MOV$ MOV$ SHRBAS MOV$ LENT MOV$ BUF MOV$ OPCODE .IF DF VC$CPR S CALL @CPSEN .IFF CALL $CPSEN .ENDC ;VC$CPR.; .; SYSGEN.CMD;.;/.; RSX-11M-PLUS SYSGEN -- Chain to SYSGEN.CLBF.;.;.;#.; COPYRIGHT (c) 1979, 1985 BYl).; DIGITAL EQUIPMENT CORPORATION, MAYNARD;(.; MASSACHUSETTS. ALL RIGHTS RESERVED..;B.; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDB.; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSEB.; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISB.; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORB.; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND3.; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED. .;B.; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTB.; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL.; EQUIPMENT CORPORATION.N.;B.; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF=.; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.I.;.; Version: 03.01S.;.; Written by:.;.; J. C. Franzini .;.; Modified for M-PLUS V3.0 by: .;!.; J. C. Franzini 31-Aug-84 03.01L.; JCF177 -- Add $SGNFI.; .ENABLE GLOBALT .ENABLE SUBSTITUTIONE<.; Get device and directory containing SYSGEN command files.! .PARSE "]" $SGNFI JUNKSS .SETS $SGNFI $SGNFI+"]"".; Chain to SGNMAIN in SYSGEN.CLB. .CHAIN '$SGNFI'SYSGEN.CLB/LBFOR THE USE OR RELIABILITY OF=.; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.I.;.; Version: 03.01S.;.; Written by:.;.; J. C. Franzini .;.; Modified for M-PLUS V3.0 by: .;!.;.; SGNPREFIX.CMD.;..; RSX-11M-PLUS SYSGEN -- Prefix Command File2.; Allow unsupported systems to be generated..;.;.;>.; COPYRIGHT (c) 1982, 1985 BY DIGITAL EQUIPMENT CORPORATION..; ALL RIGHTS RESERVED.S.;=.; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDY?.; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.P.;.; Version: 03.01E.;.; Written by:.;.; J. C. Franzini.;.; Modified for M-PLUS V3.0 by: .;!.; J. C. Franzini 27-Aug-84 03.01.; JCF174 -- cleanupC.;F.; This command file can be used to generate nonstandard systems or toI.; predefine the SYSGEN questions which are not saved in the saved answerI .; files.MC.; EDIT THIS COMMAND FILE AT YOUR OWN RISK. IF YOU EDIT THIS FILE,ND.; SYSGEN AND THE RESULTING SYSTEM WILL NOT BE SUPPORTED BY DIGITAL.J.; To use this command file, edit it as you wish and leave it in [200,200]=.; with the name SGNPREFIX.CMD. Then invoke SYSGEN normally.L.; SYSGEN will find the latest version00†é…‡…´cÚµcÛ¶c�·c›’ of this command file in [200,200] andF.; will use the symbols defined in it to perform a nonstandard SYSGEN.G.; SYSGEN will try to warn you that you are using SGNPREFIX to generatesB.; a nonstandard system by printing out one of the messages below.G.; As long as your edited copy of SGNPREFIX remains in [200,200], everyA-.; SYSGEN you perform will be affected by it.o .ENABLE GLOBALn .ENABLE SUBSTITUTION  .DISABLE LOWERCASET .SETT Y .SETF NB.; ***************************************************************B.; * *B.; * !!! WARNING !!! *.; * *B.; * IF YOU CHANGE THE DEFINITIONS OF THE FOLLOWING VARIABLES, *B.; * THE RESULTING SYSTEM WILL NOT BE SUPPORTED. *B.; * *B.; ***************************************************************/ .SETF $18BIT ! 22-bit system will be generated*?.; .SETT $18BIT ! 18-bit system will be generated (UNSUPPORTED) 9 .SETF $M$PRO ! Single processor system will be generated G.; .SETT $M$PRO ! Multiprocessor system will be generated (UNSUPPORTED)U .SETL SUPRTD #$18BIT&#$M$PROL .IFT SUPRTD .GOTO 10* ;B ; ***************************************************************B ; ***************************************************************B ; ** **B ; ** WARNING -- THIS SYSTEM WILL NOT BE SUPPORTED BY DIGITAL **B ; ** **B ; ***************************************************************B ; *************************************************************** ;.10: .; Continue9 .SETN SPACE ! Mark current size of symbol table*J.; The following symbols control nonstandard, unsupported SYSGEN behavior.4.; .SETT $B$LIN ! Output the baseline RSXMC symbol5.; .SETT $P$GEN ! Output the pregenned RSXMC symbolN(.; .SETT $USACF ! Use the ACF results?.;9.; .SETS $NL "SY:" ! Create output files during PREPGEN*.;P.; Normally SYSGEN creates its output files in [200,200] and [11,10]. If $DIRCTM.; is defined, SYSGEN will create the output files in that directory instead.S.;;.; .SETS $DIRCT ! Create output files in defaulto7.; .IF $DIRCT EQ "[]" .SETS $DIRCT ! ...directoryv.;..; .SETT $SYSBL ! Generate system for SYSBLD .IF EQ SPACE .GOTO 20 ;B ; ***************************************************************B ; * *B ; * WARNING -- This is a nonstandard, unsupported SYSGEN *B ; * because SGNPREFIX has defined special symbols. *B ; * *B ; *************************************************************** ;.20: .; Continue9 .SETN SPACE ! Mark current size of symbol tableCG.; The following symbols are the answers to the SYSGEN setup questions.*H.; If any of these symbols are defined here, the corresponding questions(.; will not be asked when SYSGEN is run.7.; .SETL $EC N ! Always want the explanation printed?R6.; .SETL $SVUI1 Y ! Use saved answers for Executive?J.; .SETS $SVNI1 $DIRCT+"SYSGENSA1.CMD" ! Executive input saved answer fileK.; .SETS $SVNO1 $DIRCT+"SYSGENSA1.CMD" ! Executive output saved answer fileS8.; .SETL $SVUI2 Y ! Use saved answers for peripherals?L.; .SETS $SVNI2 $DIRCT+"SYSGENSA2.CMD" ! Peripherals input saved answer fileM.; .SETS $SVNO2 $DIRCT+"SYSGENSA2.CMD" ! Peripherals output saved answer filee;.; .SETL $SVUI3 Y ! Use saved answers for nonpriv builds?tN.; .SETS $SVNI3 $DIRCT+"SYSGENSA3.CMD" ! Nonpriv build input saved answer fileN.; .SETS $SVNO3 $DIRCT+"SYSGENSA3.CMD" ! Nonpriv build output saved answer fil*.; .SETL $PREP Y ! Want to do a PREPGEN?7.; .SETS $RP "SY:" ! Disk containing distribution kit 4.; .SETL $RNACF N ! Autoconfigure the host system?9.; .SETL $ACFDF Y 00†††t÷tø tþfDATA! Override the Autoconfigure results?.3.; .SETL $COMPL Y ! Want to do a complete SYSGEN?u8.; .SETL $CONT N ! Want to continue a previous SYSGEN?,.; .SETS $CONT1 "A" ! Section to restart at .IF EQ SPACE .GOTO 30 ;B ; ***************************************************************B ; * *B ; * WARNING -- Some of the SYSGEN questions will not be asked *B ; * because SGNPREFIX has defined the answers. *B ; * *B ; *************************************************************** ;.30: .; Continue .EXIT ction to restart at .IF EQ SPACE .GOTO 30 ;B ; ***************************************************************B ; * *B ; * WARNING -- Some of the SYSGEN questions will not be asked *B ; * because SGNPREFIX has defined the answers. *B ;<Á0ÀW 7@-=ÌæwàÈæw[æwH ˆæw°sæwaæw`OæwˆEæw""-æw#Ïæw{Q8æwT[=æwxdæwÚdHæw €tæwø‰æwˆ‹ºæw(–0æwP–9 ±Œ:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@tW ÌT99\.;.; SGNMAIN.CMD.;3.; RSX-11M-PLUS SYSGEN -- Mainline command file=.;.;.;.; COPYRIGHT (c) 1987 BYU+ .; DIGITAL EQUIPMENT CORPORATION, MAYNARDo* .; MASSACHUSETTS. ALL RIGHTS RESERVED. .;D .; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDD .; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSED.; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISD.; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORD.; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND5.; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.c.;D.; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTD.; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL.; EQUIPMENT CORPORATION.D.;D.; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF?.; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL..;.; Version: 10.16 .;.; Written by:.;.; J. C. FranziniR.;! .; Modified for M-PLUS V2.1 by: !.;".; J. C. FranziniR#.;!$.; Modified for M-PLUS V3.0 by:D%.;#&.; J. C. Franzini 26-Jan-84 10.00U8'.; JCF154 -- improve test for kit installed correctly(.;#).; J. C. Franzini 13-Aug-84 10.01T,*.; JCF157 -- support SYSGEN under the AME+.;#,.; J. C. Franzini 13-Aug-84 10.02E -.; JCF169 -- changes for BL20..;#/.; J. C. Franzini 27-Aug-84 10.03G0.; JCF174 -- cleanupn1.;#2.; J. C. Franzini 31-Aug-84 10.04;300$†é…‡…´cÚµcÛ¶c�·c›’.; JCF177 -- add $SGNFI4.;#5.; J. C. Franzini 16-Nov-84 10.05J/6.; JCF201 -- force terminal to /NONAMED mode.7.;#8.; J. C. Franzini 18-Feb-85 10.06 -9.; JCF223 -- fix JCF201 to work under V2.1s:.;#;.; J. C. Franzini 8-Mar-85 10.07 *<.; JCF240 -- check exit status from ACF=.;#>.; J. C. Franzini 5-Apr-85 10.08n(?.; JCF247 -- make sure NL: is on line@.;!A.; G. N. Larsen 15-Apr-85 10.09A7B.; GL0010 -- make sure target system disk is mountedFC.;!D.; G. N. Larsen 7-Jun-85 10.10 9E.; GNL021 -- set default protection to rwed,rwed,rwe,r;F.;!G.; G. N. Larsen 2-Jul-85 10.11dBH.; GNL024 -- additional changes to support SYSGEN under the AMEI.;#J.; J. C. Franzini 15-Aug-85 10.12.3K.; JCF268 -- add more assignments for VAX-11 RSXtL.;M.;M.;!M.; L.B. McCulley 3-Nov-86 10.15 @M.; LBM035 -- Fix BL display for Version 4.0 Internal FT and<M.; edit description of section for rebuilding tasks.M.;!M.; J. W. Berzle 30-Jan-86 10.16r@M.; JWB189 -- Fix Baselevel and Copyright display for V4.0 FTN.; Documentation by:O.;P.; M. J. TardiffQ.; RGS.; This command file must run on the current and previous versions of;$T.; RSX-11M-PLUS and on VAX-11 RSX.U0V.; SYSGEN is supported on the following disks:W.;X.; RP04, RP05, RP06l!Y.; RM02, RM03, RM05, RM80, RP07- Z.; RK07s[.; RA60, RA80, RA81t\D].; Variable names and use conventions in the SYSGEN command files:^.;F_.; $a$aaa contains the value associated with the RSXMC symbol a$$aaaO`.; a$aaaa contains the value associated with the data structure offset a.aaaaMa.; aa'xxx' type symbols should be thought of as arrays or tables, where thes b.; variable xxx is the index.c.;/d.; TEMPN, TEMPNn temporary numeric variables .e.; TEMPS, TEMPSn temporary string variables/f.; TEMPL, TEMPLn temporary logical variablesRg.;Jh.; These temporary variables should only be used for short-term, obviousMi.; purposes: counters, indices, intermediate values, temporary work areas,aIj.; etc. They should NEVER have any long-term significance. The entireaIk.; life or scope of any one usage should be visible at a glance. Never El.; expect a temporary variable to be intact over a subroutine call. m.;Nn.; DFLTN temporary numeric variable holding default response for a questionMo.; DFLTS temporary string variable holding default response for a questionsNp.; DFLTL temporary logical variable holding default response for a questionq.;Mr.; The following string variables define all the drivers in a given system.gKs.; Each variable contains a class of drivers. The drivers are classifiedbGt.; by whether they are DIGITAL-supplied or user-supplied, resident ortLu.; loadable, with resident or loadable data bases. The strings are of the6v.; form: dd,dd,dd,... where dd is a device mnemonicw.;Fx.; $DSRR DIGITAL-supplied resident drivers with resident data basesFy.; $DSLR DIGITAL-supplied loadable drivers with resident data basesFz.; $DSLL DIGITAL-supplied loadable drivers with loadable data basesC{.; $USRR User-supplied resident drivers with resident data baseseC|.; $USLR User-supplied loadable drivers with resident data basesiC}.; $USLL User-supplied loadable drivers with loadable data bases.~.;7€.; Global Symbols: * - defined in this command filev�.;(‚.; $DCLI* restore CLI to DCL when doneƒ.; $EC* expanded commentsn„.; $PREP* PREPGENS….; $RP* release disk3†.; $SVNI1* Executive saved answer input file nameI5‡.; $SVNI2* peripherals saved answer input file namesCˆ.; $SVNI3* nonprivileged task builds saved answer input file namee4‰.; $SVNO1* Executive saved answer output file name6Š.; $SVNO2* peripherals saved answer output file nameD‹.; $SVNO3* nonprivileged task builds saved answer output file name4Œ.; $SVUI1* use saved answers for Executive options;�.; $SVUI2* use saved answers for peripheral configurationR<Ž.; $SVUI3* use saved answers for nonprivileged task buildsD�.; $SYGEN*00,†††t÷tø tþfDATA lower-level command files have been invoked from SYSGEN�.;‘L’.; NOTE: The answers to the questions in this module are not saved in theO“.; saved answer files. However, the answers can be pre-defined in SGNPREFIX.d”•.; File usage:–.;—.; @SGNPREFIX ˜.; @ACFANSl™.; .CHAIN /LB:SGNNXTlš› œ .ENABLE GLOBALd� .ENABLE SUBSTITUTIONtž .ENABLE ESCAPEuŸ .DISABLE LOWERCASEr ¡ ;¡ ; RSX-11M-PLUS SYSGEN BL40v£ ;£ ; COPYRIGHT (c) 19870¥ ; DIGITAL EQUIPMENT CORP., MAYNARD MA., 01754¦ ;§¨ .SETT $SYGENN© ª .SETT Y « .SETF N¬­ .SETS COLON ":"® ¯ .SETF $CE ° .SETF $CD ± .SETF $AE ² .SETF $BE ³ .SETF $BP ´ .SETF $BN µ .SETF $VM ¶ .SETF $AD·9¸.; Define these symbols in case SGNPREFIX is not aroundl¹.º .SETF $18BIT ! SGNPREFIX redefines this !.» .SETF $M$PRO ! SGNPREFIX redefines this !.¼ .SETF $B$LIN ! SGNPREFIX redefines this !.½ .SETF $P$GEN ! SGNPREFIX redefines this !1¾ .SETS $DIRCT "" ! SGNPREFIX redefines this !0.¿ .SETF $SYSBL ! SGNPREFIX redefines this !À7Á .TESTFILE SGNPREFIX.CMD ! Is prefix file available?E .IF NE 1 .GOTO 10$ÃÄ @SGNPREFIX.CMDEÅNÆ.10: .IFT .OR .IF EQ 5 .GOTO 12 ! always F on AMEÇÈ ;JÉ ; SGN -- Warning: This terminal is nonprivileged. If all the requiredJÊ ; tasks are not installed, or if you do not have write-access toJË ; the necessary UFDs on the target system disk, this SYSGEN will&Ì ; not complete successfully.ÍAÎ.12: .SETF $DCLI ! remember if CLI was DCL so we can restore itpÏ .IF NE "DCL" .GOTO 20Ð .SETT $DCLIÑ ;Ò SET TERM MCRIÓÔ.20: .; ContinueÕ0Ö.; Set terminal to /NONAMED mode if necessary.×9Ø .IF EQ 5 .GOTO 22 ! If EQ, AME, nonamed moden=Ù .IFNDF .GOTO 22 ! If NDF, pre-V2.1, nonamed modenÚ3Û .SETN F4$NAM 1000 ! Define bit mask for F4.NAM ÜKÝ .PARSE "," JUNKS JUNKS JUNKS FMASK4 JUNKS ! Get 4th feature mask 4Þ .SETN TEMPN 'FMASK4'&F4$NAM ! Isolate bit F4.NAM=ß .IF TEMPN EQ 0 .GOTO 22 ! If EQ, named dir not supported à$á .IF NE "[]" SET /NONAMED'â.; ! If NE, named mode, reset itSãä.22: .; Continueå.æ .IF NE "[200,200]" SET /UIC=[200,200]çCè .IFDF .AND .IF EQ 6 SET /DPRO=[RWED,RWED,RWE,R]eVé .IFDF .AND .IF EQ 5 SET PROT=(SY:RWED,OW:RWED,GR:RWE,WO:R)/DEFAULTêëì .IFNDF $EC .GOTO 24íî .IFF $EC .GOTO 39ïð.24: .; Continueñò ;@ó ; To exit from the SYSGEN procedure at any time, type CTRL/Z.ô ;Bõ ; If you are unsure of the answer to a question for which a de-1ö ; fault answer exists, use the default answer.2÷øùú ;û ;ü ;7ý ;===================================================>:þ ; Choosing SYSGEN Options '' at '